ISUCON3 に参加しました

id:yappo & id:kamipo とチーム「潰すつもりで来てください」を結成してISUCON3に参加してきました。結果は(失格にならなければ)11位で予選は通過できそうです。 YappoLogs: ISUCON3 で暫定で本戦進出らしいです #isucon 好きな子のことかslow query logの…

Perlでコールスタック上のサブルーチンの引数を得る

@DB::args でできます。 use strict; use warnings; use Data::Dumper; sub foo { bar(1, 2, 3) } sub bar { package DB { our @args; my $i = 0; while (() = caller $i) { print "$i: ", ::Dumper \@args; $i++; } } } foo('a', 'b', 'c'); outout: 0: $VA…

C以外のコードもemscriptenしてみる

emscriptenのwikiをみるかぎり、すでにかなり様々なアプリケーションがemscriptenで動いているようです。ちょっと試したところ、以下のようなC++11なコードも動きましたし、純粋にロジックだけのコードはかなり動くようですね。 #include <memory> #include <iostream> class g</iostream></memory>…

YAPC::Asia 2013に参加しました

YAPC::Asia 2013に参加してきました。今年も大盛況で、処理系の話、大規模サービスの話、ホビープログラミングの話など盛りだくさんで楽しいイベントでした。また今年でlestrrat & 941体制は終了ということです。長い間お疲れ様でした&ありがとうございまし…

PerlでWebAppの開発に必要なN個のこと

あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずPerlについて知っていることを書いた。 パッケージマネージャ …

Released rack-devfavicon

開発環境と本番環境で favicon を変える というのに感動したのでRack middlewareでやってみました。というか、昨日のPlack::Middleware::DevFaviconをRackに移植しただけですけど。Plack版とおなじく単に favicon.ico ないし favicon.png という名前にマッチ…

Released Plack::Middleware::DevFavicon

開発環境と本番環境で favicon を変える というのに感動したのでPlack middlewareでやってみました。単に favicon.ico ないし favicon.png という名前にマッチしたらグレースケールにして返すというだけの代物ですが、enable_ifで簡単に導入できるのが楽かな…

[Ruby] オーバーライドとか無視してKernel#classを直接呼びたい

直接 `self.class` を呼ぶと、#class がオーバーライドされている可能性があるので任意のオブジェクトに対して呼ぶことはできません。よってKernel#classを直接呼ぶ必要があります。そこで、以下のように#classのUnboudMethodを得て、それにレシーバを与えて…

Rubyは標準ライブラリにRuby lexer/parserがあるのがいい

これは特筆すべき特徴だと思う。ヒアドキュメントもちゃんと処理できる。 require "ripper" require "pp" src = <<'END' def foo p [<<-"A", <<-"B"] Hello, %{"Ruby"} world! A one, two three B end END pp Ripper.lex(src) 結果: [[[1, 0], :on_kw, "def"…

vim 7.4 でSEGVを回避する設定

vim 7.4 で導入された正規表現エンジンがまだ安定していないようなので、以下の設定で古い正規表現エンジンを使うといいです。 set regexpengine=1 SEGVを修正するパッチ自体はすでに取り込まれているので、いずれこの設定は必要なくなると思われますが、と…

emscriptenでgotoって使えるの?

A. 使えます。というか clang -> LLVM bitcode -> JavaScriptという変換なのでwhileなどのループもすべてgotoで表現されたあとJSに変換するので、gotoを表現できないとループすらできません。中身を見てみると、たとえば以下のCのコード #include <stdio.h> int main(</stdio.h>…

『パーフェクトRuby』の感想

Ruby言語自体はまあ書ける、というレベルでも、さてRubyでコマンドのひとつでも作ってgemにして公開しようかとなるといろいろ知らなきゃいけないことがたくさん出てきてああ大変だと思うわけですが、『パーフェクトRuby』はbundle gemを使った雛形の作り方か…

emscriptenをMacで使うときにしておくといいたったひとつのこと

sudo ln -s /usr/bin/python /usr/bin/python2

JSXの複数行文字列リテラル

JSX v0.9.62 より複数行文字列*1がサポートされました。構文はPythonライクな """..."""です。また、'''...''' も同じです。 class _Main { static function main(args : string[]) : void { log """ Hello, world! """; // => "\n Hello, world!\n " } } 複…

emcc-jsx の proof-of-concept #upcamp

emscriptenでJSにコンパイルできるものの、JSからのインターフェイスは使いやすいとは言いがたいし、ましてやJSXから呼び出すとなると本来型のあるCの関数を呼び出すのにccall()経由では静的型チェックの恩恵をうけられない。そこでJSXのラッパを自動生成す…

JSXからemscriptenで生成したJSを呼ぶ #upcamp

#upcamp でハッカソンしてます。JSXからemscriptenで生成したJSを呼び出してみました。emscriptenはhomebrewでbrew install llvm --with-clangでllvmを入れ、emccのshebangを修正するだけで動きました。コンパイル は EXPORTED_FUNCTIONS を指定すること以外…

bless($args, $class) is a bad practice

さいきん散見される以下のようなコードは悪いコードです。 # usage: Foo->new({ age => 42 }) sub new { my($class, $args) = @_; return bless $args, $class; } それは、ハッシュリファレンスと想定される$argsのそのままつかっているため、引数としてハッ…

test-travis(1)というコマンドを書いた

https://github.com/gfx/App-test-travisTravis-CI は CPAN Testers のない言語だとライフチェンジングなサービスだし、 CPAN Testers のある Perl においてもpushごとにCIを走らせたりちょっと変わった設定でテストを走らせたりできる大変便利なサービスで…

Perlでコマンドのpodをモジュールファイルに書く方法

コマンドのヘルプはPod::Usage::pod2usage()で処理したいのでついコマンド本体のファイルにpodを書きがちですが、そうすると空のモジュールファイルのドキュメントが完全に空になってどこをみたらいいのかわからなくなりがちです。 そういうときは、Pod::Fin…

JSXの最近の新機能

テンプレート関数がユーザー定義できるように (0.9.58) array/mapリテラルのケツカンマを許可(0.9.58) string + number が許可。ただしその他のオブジェクトは依然として明示的な変換が必要 (0.9.58) optimizerが大幅に強化(0.9.54~58) String.fromCharCode(…

『Perl徹底攻略』という本が出版されました

WEB+DB PRESSで連載しているPerl Hackers Hubの書籍版で、私も2節書きました。Perl徹底攻略 (WEB+DB PRESS plus)作者: 大沢和宏,cho45(さとう),小林篤,和田裕介,嶋田裕二(xaicron),牧大輔(lestrrat),奥一穂,広木大地,伊藤直也,長野雅広,藤原俊一郎,伊藤智章,…

ES6 の generator を traceur で使う

traceur とは、Googleの開発するES6 to ES5コンパイラである。npm経由で簡単にインストールでき、typemapにも対応している。ES6の対応状況はわからないが、generatorは使えるようだ。以下公式ドキュメントからの抜粋*1: // A binary tree class. function T…

「JavaScriptのイディオム集@nmi.jp」をJSXでやるとどうなるの、っと

JavaScript イディオム集 を JSX でやってみました。jsx --testで実行できます。総じて見ると、値の変換は「x as string|number|int」でできる分単純になっているほか、全体的に単純になっていて覚えるべきイディオムは少なくなっています。また、~array.ind…

JSX supports default parameters

JSXにデフォルトパラメータが実装されました。 今まで以下のように書いていたものが function foo(a : number, b : number) : void { // ... } function foo(a : number) : void { this.foo(a, 42); } 以下のように書けるようになりました*1。 function foo(…

git-initial-commit(1)

こんな感じのコマンドを ~/bin/git-initial-commit においておくと捗る気がした。 #!/bin/sh set -xe git init git add . git commit -m "initial commit"

Safari on iOS7のv8bench

v8bench version 7iOS6のSafariは681、UIWebViewは113でした:v8bench scores for smartphones - Islands in the byte stream同じ端末でiOS7にアップグレードして測定したところ、Safariのスコアが1.5倍ほどに上がっていることを観察しました。 Safari: 1014…

Xslateで多重にWRAPPERを使っているケースで起きる問題

表題の問題を修正した 2.0005 をリリースしました。以前からWRAPPERを使っている場合に稀に起きることはわかっていたものの、再現できずに困っていたのでした。TTerseのWRAPPERのみならず、Kolonのtemplate cascadingでも同様の問題が起きる可能性があります…

overloadプラグマの使い方

404 Blog Not Found:紹介 - Software Design 2013年06月号呼ばれてないけど勝手に添削。 use overload '""' => 'toString', '_' => 'add', ; はないわー。そこは use overload '""' => \&toString, '_' => \&add, ; でしょうが。 いいえ、overloadプラグマの…

JSX minifierの圧縮性能

JSX compilerのソースコードで検証してみました*1。 Mode Size(KiB) Ratio original 1507 1.00 JSX minifier 277 0.18 Closure Compiler/D 602 0.40 Closure Compiler/A 301 0.20 対象にしたソースコードがJSXから変換したJSというやや特殊な状況ですが、Clo…

perl v5.18.0 released!

perl v5.18.0 がリリースされました。 https://metacpan.org/release/RJBS/perl-5.18.0 このリリースでの新規機能はほとんどないものの、二つの非常に大きな変更があります。 ハッシュキーのランダム化 each(), keys(), values() で返されるハッシュキーの順…