Yearly Archives: 2014

2014-06-22

白と黒のとびら: オートマトンと形式言語をめぐる冒険

Amazonで見かけて最初の数ページ読んでみて、続きが気になったので購入しました。

白と黒のとびら: オートマトンと形式言語をめぐる冒険

なかなか読ませるじゃないですか。ちゃんと魔法使いの弟子の成長物語になっています。最後まで一気に読んでしまいました。

物語中では「オートマトン」とかその手の専門用語は極力出てこないようになっていて、物語中の設定に従った用語に置き換えられています。
なので知識の無い人でも小難しい単語に翻弄されることはありません。
一応巻末で物語中に出てきた概念と計算理論での概念との対応付けや、それについて詳しく学びたい場合の参考文献が紹介されています。
私はこのあたりの理論は大学や独学で少しかじったり、プログラミング言語などを製作する上で必要な部分を多少知っていたりするだけですが、物語を読みながら「ああ、これはε遷移のことを言ってるんだな」とか記憶を呼び起こされながら読みました。
でもそういう知識が無くても普通に物語として読めるのでは無いかと思います。

後半になるにつれて少し難しくなっていきますが、そういう所は適当に流して読んでも問題ないと思います。
時間があれば、主人公が直面する問題について一緒に解きながら読んでみても面白いかもしれません。

この手の抽象的な理論は、身近な応用と結びつけるとより分かりやすくなると思うのですが、そういった例は自動販売機の例くらいでしょうか。
そういう例がもっとあると、読んだ後にもっとスッキリするのかなぁと思いました。

少し疑問に思ったのは、偽クフ語と万能機械について。偽クフ語の詩集は万能機械に入れる命令を表しているということだと思うのですが、それは偽クフ語をそのまま万能機械に入力すると言うことなのでしょうか。万能機械は、入力された偽クフ語を構文解析して実行する? 
偽クフ語は、作中において手作業で解析をしていましたが、字句の区切りを見つけるのが難しく、また、かなり曖昧な部分が出る言語です。
なので、実際に万能機械を作るとしたら、どのようになるのだろうというのが気になりました。
おそらく命令として有効な文にはさらなる制約があるのでしょうね。

2014-06-11 ,

HTML5 Audio要素の使い方(JavaScript)

JavaScriptでHTML5のAudio要素を使う方法について、軽くおさらいします。

仕様書:

WHATWGの最新
4.7.6 The audio element — WHATWG HTML Living Standard — Last Updated 9 June 2014
W3Cの最新
4.7.7 The audio element — HTML 5.1 Nightly A vocabulary and associated APIs for HTML and XHTML Editor's Draft 10 June 2014
W3CのCR
4.8.7 The audio element — HTML5 A vocabulary and associated APIs for HTML and XHTML W3C Candidate Recommendation 17 December 2012

WHATWGとW3Cの関係とかバージョン違いとかありますが、リンク先が変わってしまうと嫌なので以下ではW3CのCRへリンクします。

[NamedConstructor=Audio(),
 NamedConstructor=Audio(DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {};

DOM的には new Audio(url) (urlは省略可能)という形で HTMLAudioElement というインタフェースを持つオブジェクトを生成できます(他にもdocument.createElement("audio")という形で生成できたりもします)。

HTMLAudioElementインタフェースはHTMLMediaElementを継承しただけのものなので、具体的な中身(メソッドやプロパティ)についてはそちらを参照します。

Audioの場合、基本的な使い方は次のようになるでしょうか。

  1. audio = new Audio() または new Audio(url) または document.createElement("audio")
  2. audio.preload = "none" または "metadata" または "auto" (デフォルトはauto) 4.8.10.5 Loading the media resource
  3. audio.src = url または source1 = document.createElement("source"); source1.src = url; source1.type = 'audio/ogg; codecs="vorbis"'; audio.appendChild(source1) (どのリソースが使われるかはresource selection algorithmを参照)
  4. audio.load() //ロード(不要なことも多い) (media element load algorithm)
  5. audio.addEventListener("loadedmetadata", function(e){ alert("長さは" + audio.duration + "秒です。");}, false); 4.8.10.6 Offsets into the media resource
  6. audio.play(); //currentTimeの位置から再生(audio.autoplay次第では不要)(audio.endedのときだけは最初から再生になるので注意)
  7. audio.pause(); //currentTimeの位置で停止
  8. audio.currentTime = audio.duration / 2; //半分の所へシーク
  9. audio.volume = 0.5; //音量
  10. audio.playbackRate = 2.0; //倍速再生
  11. audio.loop = true; //ループ再生(終端に到達したら最初から)
  12. audio.muted = true; //ミュート
  13. alert(audio.paused ? "停止中" : "再生中");
  14. if(audio.error != null){alert("エラーコード:" + audio.error.code);} 4.8.10.1 Error codes
  15. audio.src = "";

部分的なループは難しそうです。厳密でなくても良いのならtimeupdateイベントを使ってできると思います。

イベントの一覧については 4.8.10.16 Event summary に書いてあります。

仕様書を読んでみるともっと詳しく面白いこと書いてあります。

2014-06-10

シドニアの騎士OP

シドニアの騎士面白いよねー。というわけでOPのCD購入。

少し変わった構成の曲ですよね。最初は軍歌っぽい部分がイモっぽいなぁと思っていたのですが、カッコいい部分もあって何度も聞いているうちにやみつきになりました。

私も「もぅそぅシドニッアッ」と聞こえた口ですが、歌詞カードを見てはじめてなんと言っているのか知りました。うーん、まぁ、納得。

何となくヒロイックエイジのOPを思い出したり。歌い手と宇宙ものというくらいしか共通点はありませんが。

2014-05-29

VirtualBoxにWindows8.1 Updateを入れた

PCを増やして配線を色々いじるのが面倒だったので、VirtualBoxにWindows8.1 Updateを入れることにした。

幸いVirtualBoxの方ではすでに8.1に対応済みで、ゲストOSの種類として8ではなく8.1を指定すれば問題なくインストールできた(間違えて8を選んだらエラーが出て進まなかった。あとBIOS設定でIntel VTを有効にしておくこと)。

初期ユーザはローカルアカウントで作った。Microsoftアカウントで初期ユーザーを作ってしまうと、ユーザ名やユーザフォルダ名が汚らしいものになってしまうので。しかし8.1では8にはあった「Microsoftアカウントを使わずにサインインする」が最初の選択肢に表示されなくなっている。しかし諦めるべからず。「新しいアカウントを作る」を選択して「Microsoftアカウントの作成」の画面に行くと、下の方に「Microsoftアカウントを使わずにサインインする」という項目があるのでそれを選ぶべし。他にもネット接続を切ってインストールしたり、サインインにわざと失敗すると、この選択肢が出てくるらしい。なぜ最初からこの選択肢を出さないのか。

インストールが終わって再起動し、サインインすると、いきなりデスクトップが現れた。スタートスクリーンではない。よく分かっているじゃないか。

Windows8といえばスタートメニューの問題が有名だ。私はスタートメニューをキーボードで操作できるランチャーとして使用していたので、無くなるとやはり不便だ。下手なショートカットキーに割り当てるとEmacs等に支障を来すのでやりたくない(デスクトップに置いたアイコンのプロパティからCtrl+Alt+?が割り当てられるが、この組み合わせはEmacsでよく使う)。スタートメニューが無くなったのなら何か代わりになるランチャーでも探そうかなと思ったのだが、スタートメニューを復活させるアプリもいくつかあると聞いていたので、それを探してみた。

Windows8 でスタートメニューを取り戻す方法 - NAVER まとめ

なんか沢山あるみたい。結局どれが良いんだろう。海外の誰が作ったか分からないようなアプリをホイホイ入れるのも少し心配な昨今(今更だけど)。

秀丸スタートメニューにした。うん、私の用途ではこれで十分だ。

2014-05-09

OpenFlを使ってみる

NMEからOpenFlになってずいぶん経ちますが、久しぶりに使ってみようと思いました。

OpenFlの使い方

インストール

OpenFlのサイト 右上にあるDownloadを選択して指示に従ってインストールすればOK。
Haxe、Lime、OpenFLの順にインストールする。

直接ダウンロードするのはhaxeのインストーラだけ。後はhaxelib経由でダウンロード&インストールできる。

プロジェクトの作成

lime.bat create openfl:project ExampleProject

ExampleProjectは適切なプロジェクト名を入れる。
生成されたExampleProject.hxprojやproject.xmlを適切に修正する。com.exampleやCompany Nameと書いてある部分を適切な物に変える。

ソースコードの修正

試しに画面を余白10px空けて赤く塗りつぶしてみる。Source/Main.hxを次のようにする。

package;

import flash.display.Sprite;

class Main extends Sprite {
    public function new () {
        super ();

        graphics.beginFill(0xff0000, 1.0);
        graphics.drawRect(10, 10, stage.stageWidth-20, stage.stageHeight-20);
        graphics.endFill();
    }
}

ビルド

lime.bat build html5 とか lime.bat build flash とか。

(Cygwinのmakeから実行したいので.batを付けている)

実行

html5なら cygstart Export/html5/bin/index.html とか。

flashなら cygstart Export/flash/bin/ExampleProject.swf とか。

(cygstartは引数で指定されたファイルをWindowsで関連づけられたアプリケーションで開くCygwinのコマンド)

リサイズ対応

Webブラウザでhtml5を表示したにせよデスクトップのFlashプレイヤーでswfを実行したにせよ、ウィンドウサイズを変更したときに右端や下端の余白が10pxで無くなってしまいます。
なので、リサイズされたらグラフィックスを変更するようにします。

package;

import flash.display.Sprite;
import flash.events.Event;

class Main extends Sprite {
    public function new () {
        super ();

        resize();

        stage.addEventListener(Event.RESIZE, function(e:Event){resize();});
    }

    function resize():Void
    {
        // stage.stageWidth, stage.stageHeight変更直後の処理を書く。
        updateBackground();
    }

    function updateBackground():Void
    {
        graphics.clear();
        graphics.beginFill(0xff0000, 1.0);
        graphics.drawRect(10, 10, stage.stageWidth-20, stage.stageHeight-20);
        graphics.endFill();
    }
}

(アニメーション)フレーム毎の処理

試しに赤いボールを画面端でバウンドさせながら移動させてみる(超適当)。

package;

import flash.display.Sprite;
import flash.display.Shape;
import flash.events.Event;

class Main extends Sprite {
    public function new () {
        super ();

        // ボールを作る。
        var ballShape = new Shape();
        ballShape.graphics.beginFill(0xff0000, 1.0);
        ballShape.graphics.drawCircle(0,0,16);
        ballShape.graphics.endFill();
        addChild(ballShape);

        var ball = {
            x:100, y:100, vx:4, vy:4, shape:ballShape
        };

        // フレーム毎に移動させる。
        addEventListener(Event.ENTER_FRAME, function(e:Event){
            ball.x += ball.vx;
            ball.y += ball.vy;
            if(ball.x > stage.stageWidth){
                ball.x = stage.stageWidth;
                ball.vx = -ball.vx;
            }
            if(ball.y > stage.stageHeight){
                ball.y = stage.stageHeight;
                ball.vy = -ball.vy;
            }
            if(ball.x < 0){
                ball.x = 0;
                ball.vx = -ball.vx;
            }
            if(ball.y < 0){
                ball.y = 0;
                ball.vy = -ball.vy;
            }
            ball.shape.x = ball.x;
            ball.shape.y = ball.y;
        });
    }
}

(赤いボールはグラデーションで影を付けたかったのだけど、html5版のGraphics.beginGradientFillはまだ実装されていなかった)

2014-04-20

2014-04春の新番組

ようやく一通り見終わりました。キツイ。多すぎ。忙しすぎ。

  • × カリーノ・コニ
  • △ Blade&Soul -ブレイドアンドソウル-
  • ○ 僕らはみんな河合荘
  • ○ 蟲師 続章 (前期)
  • △ selector infected WIXOSS
  • △ 悪魔のリドル
  • × レディ ジュエルペット (第6期)
  • △ 魔法科高校の劣等生
  • △ 神々の悪戯
  • △ 金色のコルダ Blue♪Sky
  • ○+ それでも世界は美しい
  • △ ハイキュー!!
  • ○+ ベイビーステップ
  • △ 極黒のブリュンヒルデ
  • × 召ませロードス島戦記それっておいしいの?
  • × ブレイクブレイド
  • △ キャプテン・アース
  • ○ 一週間フレンズ。
  • × 星刻の竜騎士
  • ○ マンガ家さんとアシスタントさんと
  • × DIABOLIK LOVERS
  • △ ブラック・ブレット
  • △- 史上最強の弟子ケンイチ OVAシリーズ
  • △ ソウルイーターノット!
  • × 魔法少女大戦
  • △ ノーゲーム・ノーライフ
  • △ 棺姫のチャイカ
  • △ 風雲維新ダイショーグン
  • × エスカ&ロジーのアトリエ~黄昏の空の錬金術士~
  • ○ ご注文はうさぎですか?
  • ◎ ピンポン THE ANIMATION
  • × 龍ヶ嬢七々々の埋蔵金
  • ○ シドニアの騎士

一押しはピンポンですね。普通に面白い。

蟲師はそこそこですね。1話完結で話毎に善し悪しはありそうですが、今後面白い話はありそう。

ベイビーステップはテニスものですが、話の流れがスムーズですし、主人公の性格も面白いですね。

2014-03-01

gitをautocrlf=trueで使っているとel-getでWanderlustがインストールできない

el-getをインストールし、el-get-installでapelのインストールから先に進まない問題を解決したのですが、今度は次のようなエラーが出ました。

Generating autoloads for wanderlust/site-lisp/wl/wl-highlight.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-mailto.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-message.el...done
Generating autoloads for wanderlust/site-lisp/wl/wl-mime.el...done
wanderlust failed to install: (error Local variables entry is missing the suffix)
el-get-installation-failed: Local variables entry is missing the suffix

なんのこっちゃい。

原因

wl-mime.elの後くらいでエラーになっていたので、その後のファイルを見て原因が分かりました。

例えばwl-news.elの先頭は次のようになっています。

;;; wl-news.el --- Create notification from NEWS(.ja) for Wanderlust. -*-coding: iso-2022-jp-unix;-*-

;; Copyright (C) 2002 Yoichi NAKAYAMA

coding-systemがunix。つまり、改行コードがLFと指定されているのです。
でも私は普段Windows環境ではgitをcore.autocrlf=trueにして使用しています。
リポジトリにはLFで保存されるが、ワーキングコピーはCRLFになるようにしているのです。
つまり、このwl-news.elはCRLFになっているのです。
どうもヘッダーではunix(LF)と書いてあるのに、実際のファイルはdos(CRLF)なのでエラーが出るようなのです。

対策

普段 core.autocrlf=true にしているのには訳があります。なので、 git config --global core.autocrlf false にするのは却下です。

ワーキングコピーのローカルでgit configしようにも、el-getがこれからcloneしようとしているファイルに対しては意味がありません。

git cloneするときに、最初から git config core.autocrlf false の状態になるような方法を探したのですが、良い方法は見つかりませんでした。

ただ、 git -c core.autocrlf=false のようにオプションで指定してやれば、cloneして取り出したファイルはunix(LF)になりました。
残念ながらローカルなconfigにこのオプションは反映されません。
なので、毎回オプションをつけてgitを呼び出す必要があります。

つまり、el-getがgitを呼び出すときに、強制的にargsに("-c" "core.autocrlf=false")を付加してやれば良いわけです。

el-getでは、呼び出すコマンド列は全てリスト化されてまとめて el-get-start-process-list に渡されます(たぶん非同期対応のためだと思います)。

なので、 el-get-start-process-list に渡されるそのリスト(commands)の中に、:programがgitのものを見つけ出し、その:argsの先頭に("-c" "core.autocrlf=false")を付加します。

;;; el-getがgitを呼び出すとき、 -c core.autocrlf=false 引数を付加する。
;;; wanderlustがLF改行でなければバイトコンパイルに失敗するので。
;;;
;;; 普段autocrlf=trueでgitを使っているので、gitのglobal configを変えたくない。
;;;
;;; 注意: cloneしたワーキングコピーのconfigにこの設定は反映されない。
;;;       el-get以外から直接 ~/.emacs.d/el-get/ にあるワーキングコピーを
;;;       gitで操作しようとすると、問題が起きる場合があるので注意すること。
;;;       そのようなことをする前に git config で明示的に設定すると良いと思う。
(defadvice el-get-start-process-list (around my-el-get-start-process-list--modify-git-args activate)
  (let* ((commands (ad-get-arg 1))
         (git-executable (el-get-executable-find "git"))
         (new-commands
          (loop for c in commands collect
                (if (string= (plist-get c :program) git-executable)
                    ;; gitならargsプロパティに -c core.autocrlf=falseをつける。
                    ;; @todo 破壊的だけどOK?
                    (plist-put c :args (append '("-c" "core.autocrlf=false") (plist-get c :args)))
                  ;; gitでないならそのまま
                  c))))
    (ad-set-arg 1 new-commands)
    ad-do-it))

これで無事にWanderlustがバイトコンパイルできるようになりました。
……これだからel-getは使いたくなかったんだ。

その他の解決策

git -c core.autocrlf=false %* という内容のgit-lf.batを作って、それをel-getに使わせる(el-get-git-executableを書き換える)という方法もあります。

その他のトラブル

gitは空白が無いパスに入れた方が無難かも?(詳しく確認してないがverboseで追っているときに、checksumのところでProgram Filesがらみの変なエラーメッセージを見たことがある)