17のChromeでNativeClientが動かなかったので設定することにしました。SELinuxって何じゃらホイSELinuxって名前は聞いたことあって、セキュリティ系の機能らしいというのは知っているのですが、それ以上のことはよく知りませんでした...。いうわけで、調べてみました。セキュアOS機能「SELinux」の基本的な仕組み。古い記事ですが、まあ問題ないでしょう。私の理解したところによると。今までの普通のLinuxには、chmodで設定するような、ユーザーやグループを用いたアクセス制御がありますが、この場合は万が一root権限で動くプロセスを奪取されるとすべてにアクセスし放題になってしまってよろしくありません。いうわけで、SELinuxではそれとは別にプログラム単位で色々な制限を、ファイルへのアクセス制限だけでなく、もっと色々な行動への制限が掛けられるようになっている...ということみたいです。...間違ってたらゴメンネ。httpdにはネットワーク接続の権限が必要だけど、passwdへのアクセスは要らないから、これを制限しよう、という発想だと理解しました。これをTE(Type-Enforcement)と言うそうです。Clientが動かないさて。SDKに入っているexampleを試しに動かしてみましたが...こんな感じで動いてくれません。うまく行くとこうなるはずなんですけどー!で、まずはGoogleで検索してみたのですが、どうやら今回のSELinuxが問題で動かないようになっているようだ、という事が分かりました。■まずは全体を無効にしてみるまずは、SELinux全体を無効にしてみました。Permissiveこうすると全体のSELinuxが無効になります。この状態でさっきのExampleが綺麗に表示されたので、SELinuxが問題だと分かります。あとで有効に戻すには次のコマンドを使って下さい。policycoreutils-guiどうやらChromeにはsandboxとsandbox_naclという2つのドメインが割り当てられているようです(この割り当て自体はFedoraの中の人がやってるようです)。考えても後者が怪しいので、Permissiveボタンを押してnaclの方をPermissiveモード(SELinux無効)にしてみると...やっぱり動作しました。これが問題みたいです。■AuditのログからSELinux用のモジュールを作るSELinuxを一時的に解除して動くようにしましたが、SELinuxはアクセス制御は行なっていませんが、ログを、Auditdというデーモンのログに記録しています。Fedoraの場合は/var/log/audit/audit.logに入っております。このAuditというデーモン、syslogdみたいな感じらしいです。Syslogdよりリッチなシステムらしいです。〜OSレベルの監査ログ徹底活用〜が参考になります。nacl...といったキーワードを調べていくと、chrome_sandbox_nacl_tというのがnacl関連だと思われるので、それでgrepします。/var/log/audit/audit.logさらにこれでログを抽出した上で、audit2allowというプログラムを用いて、SELinuxでの設定ファイル、モジュールを作る事ができます。module名とすると、モジュールのコンパイルもしてくれます。-iを使ってインストールします。chrome_sandbox_nacl.pp以上です。さっきのGUIでnaclだけPermissiveにしていたのを元に戻してEnforcingにしても、ちゃんとnaclが動作するようになるはずです!■モジュールを作らなくても大丈夫な場合もある今回はモジュールを作りましたが、正直言って結構大工事でしたね。それ以外にも、getsebool/setseboolで設定できるフラグや、ファイルのタイプを変更する方法でもSELinuxの制限を何とか出来たりもするようです。■SELinuxは分かりづらい。SELinuxは他のLinuxのデーモンなどと違い、設定ファイルがバイナリにコンパイルされた状態で保存されています。(/etc/selinuc/targetd/以下)。速度が重要な所ですから、多分そのためだとは思うのですが、いまいち分かりづらいです。上記で使ったaudit2allowの代わりに、audit2whyというのを使うと制限された理由を教えてくれたりもするようです。access.Missingって...。Fedoraの中の人のミスじゃないかなあ、これ...。Fujisaki■リリースノートコメントの表示時間に関するバグの修正と、前回言っていた差分による自動アップデータを搭載したバージョンを公開します。自動アップデートを搭載したので、今後のアップデート作業は大分楽になると思います。いえ、最初のバイナリのサイズがまた増えてしまったのですが...。■変更履歴コメントの表示時間がue/shitaと通常コメントで逆になっていた問題を修正しました。自動アップデータを搭載しました(bazaarを利用しています)FFmpegのバイナリを最新のものに更新しましたlibxml2とx264を更新しました。■ダウンロードいつも通りSourceforgeからどうぞなお、zipと7zは内容は同じです。7zのほうがファイルサイズが小さいので7zが解凍できる人はどうぞ。■自動アップデータの使い方Wikiに書いておきましたBazaarの軽量チェックアウトを使っています。従来のSubversionより容量を使わなかったので急遽乗り換えました。前の記事で書いたJavaScriptのファミコンエミュレータ「CycloaJS」を実装する際に使った最適化の手法について紹介します。■関数呼び出し、避けましょうまずはこんな関数から〜。(i&0xfff);}}));}cycloa.probe.measureっていうのは、実行時間を測ってミリ秒単位で返してくれるだけのユーティリティ関数です。最初のベンチマークでは変数に足し算する処理をクラスメソッドに移譲していますが、次のベンチマークでは移譲せずに直接書いてます。こんな例だと馬鹿馬鹿しいですが、規模が大きくなると前者みたいな方式の方が見通しがよくなったりするんですよね...。これを、Chrome21とFirefox14.0.1を用いてログを取ってみました。293関数呼び出しを加えただけでかなり遅くなります。C/C++やJavaのような感覚でgetter/setterなどを作ると一気に遅くなってしまいます。今回エミュレータでは、CPUのエミュレーション部分がメモリの読み書きを行う際のメソッドを、すべてコードジェネレータを用いてインライン展開しています。同様に、その他の通常ならば別のメソッドに分けるような処理も、すべて一つの関数内で行うようにしました。erbを用いて埋め込むなどしてできる限り可読性を下げないようにはしているものの、正直見難くなっているのが実情です...。出しバージョンが極端に遅くなります。思ってプロファイラを有効にすると、なぜか差がでなくなってしまいます...。572として、二度目以降やっぱり関数呼び出しバージョンが遅くなってしまいます。■ローカル変数、使いましょうお次はこのコードです。obj;obj.variable580280this.obj.variable655292ChromeとFirefoxで随分特性が違いますが、できる限りローカル変数を使うのが一番なのは間違いありません。//こちらもローカル変数を参照}};};このように一旦ローカルに保持しています。...これだけでかなり見づらくなるのでおすすめしません...。variable;}のようにして、一旦ローカル変数にコピーして最後に再度戻すといった事もしています。書き戻す前にthis.variableにアクセスすると分かりづらいバグになるので非常に注意です。0;}というようにしてしまっています。すると1番目の関数呼び出しのコストも避けられます...が、まずモジュールごとの名前空間が無くなるため、そこに気を付けなければなりません。今回の例ではVideoとCPUのparameterという変数名が衝突しているため、__cpu__と__video__というように接頭辞を付けて区別してますがあまりにも不毛です。去年書いて駒場祭で作り方に関する本も出した「Cycloa」というファミコンエミュレータを、今回JavaScriptに移植してみました。Egoというアクションパズルゲームを一緒に配布させていただいています(これはオープンライセンスではありません)。エミュレータや、jsnesなどが既にありますが、前者は軽量なもののスプライトの再現で一部端折っているところがあり、また後者は通常のPC用エミュレータと同レベルの正確なエミュレーションを行なっているものの、非常に重くミドルレンジクラスのPCでは60FPSのリアルタイムが出ないという問題がありました。今回のエミュレータでは、通常のPC向けのエミュレーション精度を保ちつつ、どこまで高速化できるのか検証するのを主目的としました。■どれくらい高速化できたのかを確かめてみようというわけで、既存のエミュレータとのベンチマーク取って見ました。ChromeでFPSリミットを外してどれぐらいの速度が出るのかを調べます。AlterEgoの起動画面でのFPSを比較してみました。194fpsjsnesはそもそもこのPCだとリアルタイムで描画できません。Emulatorより遅いですが、このエミュレータよりスプライトの再現性が高いので、まあ良いのかなと...。C++ネイティブの元のエミュレータには全然勝てません。それでも3〜4倍にまで縮まってるのは、流石Chromeと言ったところでしょうか...■ソースコードソースコードはgithubで公開中です。C++版も同様に公開中。■具体的な手法に関してはまた後日ということで...とりあえず、もうJavaScriptはあんまり書きたくないですね...。―より良いコードを書くためのシンプルで実践的なテクニック」。具体例としょーもないイラスト(褒め言葉)を交えながら読みやすくてシンプルなコードを書くための軽い読み物です。■アタリマエのことしか書いてない本当に当たり前のことしか書いてない本です。説明する名前の変数を付ける、tmpとかの抽象的な名前は基本的に避けるべきだけど、スコープが短くて本当にtmpならそれはそれでアリ、一度に一つのことしかしないコードにしないと頭がこんがらがる、短絡評価とかを使った「頭いいコード」は逆に読みづらい、...突拍子のある事は一切書いてなくて、どれも本当に「まあそうだよねぇ」って言いながら読み進められます。...でもその「当たり前」の事が出来ないんですよねぇorz同様の「当たり前の事しか書いてない」っていう理由で「達人プログラマ」は読む必要無いんじゃない?って前書きました。達人プログラマは当時としては先進的(?)な内容を書いていたので今となってはその説明は要らないかな...という感じなのですが、こちらは各々の持ってる「読みやすいソースコードの基準、目安」みたいなものを改めて文章とソースコードを使って説明しなおしているような本で、一種のたたき台として、「あー、前そういうのあったなー」とか「あの前のコード、ここに出てる駄目コードそのものじゃん!」とか、あーでもないこーでもないと昔の所業を懺悔しながら読める本としてお勧めです。■複数人で読んでコードレビューとか楽しそうそんなわけで、会社とかで複数人で一つのソースコードを書いているようなシチュエーションで、コード書いてる人が各々この本を読んで、今までのソースコードをレビューする、みたいな使い方をすると楽しそうです。いう本が無いと何がどう悪いのかを0から説明しなければなりませんけど、レビューする人全員がこの本を読んでれば「ここはさ、あの本の**章に書いてある駄目なコードそのものじゃん?」みたいに簡単に説明できてやりやすそうです。FujisakiupcampというイベントでのLT。Fujisaki■リリースノート公開から2ヶ月以上たったので、バグ修正バージョンのさきゅばす2.0b2を公開しました。バグフィックスのみのバージョンです。その他、NGワードスクリプトのサンプルを増やしたりしたので参考にしてみてください。■変更履歴Pythonを最新版に載せ替え、配布サイズを削減しました。スペルミスなどを修正しました。NGスクリプトのサンプルを追加しました。公式動画をDLできないバグを修正しました。Windowsにおいて、NGスクリプトの改行コードがCRLFだった場合、エラーを発生させないように変更しましたライセンス表示を、配布バイナリ内からWebサイト上に移動しました。■ダウンロードダウンロードはSourceforge内のダウンロードページから行えます。■スクリーンショットようせいさんかわいい...GUIの変更は殆どありません(ぇ■その他registっていう単語は無い(!)そうですが、ねこまたでバッチリ使ってしまっておりました...か、悲しい。ライセンス表示のためにファイルが一個増えてしまって、普通に読まれないReadmeがさらに読まれなくなるのではと思って減らしてみました。一緒に配布してるテキストは見づらいのでできるだけ減らしたいです。