タグ

ブックマーク / gfx.hatenadiary.org (21)

  • なぜ bytes::length($str) はよくないのか - Islands in the byte stream (legacy)

    bytes.pm will be deprecated in Perl 5.12の話の続きです。 なぜ bytes::length()*1を使うべきでないか。それは、一般論としてコードの意味がおかしく、また実際にバグの温床になるからです。 まず、入力されたバイト列をデコードして内部表現にし、出力の際にエンコードをするというモデルでは、文字列もその他のデータ型もまったく変わりません。たとえば、{ "foo" : 42 }というJSONのデータをデコードして{ foo => 42 }というPerlの内部表現にするプログラムを考てみます。この際、内部表現のサイズを直接得る関数を提供するのは妥当といえるでしょうか。 #!perl use strict; use warnings; use JSON qw(encode_json decode_json); my $input = <<'JSON';

    なぜ bytes::length($str) はよくないのか - Islands in the byte stream (legacy)
  • potatotips #7 at DeNA で Power Assert について発表しました - Islands in the byte stream (legacy)

    potatotips #7 at DeNA を開催しました! 今回も面白い話が多く大変勉強になりました。 さて!私はここ二週間ほど開発していたAndroid Power Assertについて発表しました。 https://speakerdeck.com/gfx/jun-hapower-assertwozhi-tuteiruka-number-potatotips https://github.com/gfx/android-power-assert-plugin まだ出力がイマイチな部分はありますが、とりあえず仕事上の自分のプロジェクトで使い始めました。実際、assertが信頼できるというのはかなり安心感があります。これはもっと使えるように、これからも改善していきたいですね。

    potatotips #7 at DeNA で Power Assert について発表しました - Islands in the byte stream (legacy)
  • strict無効化の誤謬 - Islands in the byte stream (legacy)

    シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ

    strict無効化の誤謬 - Islands in the byte stream (legacy)
  • JSXの複数行文字列リテラル - Islands in the byte stream (legacy)

    JSX v0.9.62 より複数行文字列*1がサポートされました。構文はPythonライクな """..."""です。また、'''...''' も同じです。 class _Main { static function main(args : string[]) : void { log """ Hello, world! """; // => "\n Hello, world!\n " } } 複数行文字列は開発当初から議論はされていたものの、多用するとメンテナンス性を著しく落とすものとして保留になっていたのですが、ようやく議論が落ち着いたというところです。Perlなどのheredoc構文ではなくPythonライクなtriple quotedになったのは、heredoc構文はエディタによるsyntax highlightが難しいことと末尾の\nが強制されることからtriple quoted

    JSXの複数行文字列リテラル - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/08/31
    すんばら。
  • JSXからemscriptenで生成したJSを呼ぶ #upcamp - Islands in the byte stream (legacy)

    #upcamp でハッカソンしてます。JSXからemscriptenで生成したJSを呼び出してみました。emscriptenはhomebrewでbrew install llvm --with-clangでllvmを入れ、emccのshebangを修正するだけで動きました。 コンパイル は EXPORTED_FUNCTIONS を指定すること以外は特になにもしていません。 Cのコードは以下のとおりです。 double add(double a, double b) { return a + b; } JSXのコードは以下のようになります。 native class C { static function ccall.<T>(name : string, returnType : string, argsType : string[], args : variant[]) : T; } =

    JSXからemscriptenで生成したJSを呼ぶ #upcamp - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/08/18
    [[Emscripten][JSX]
  • JSXの最近の新機能 - Islands in the byte stream (legacy)

    テンプレート関数がユーザー定義できるように (0.9.58) array/mapリテラルのケツカンマを許可(0.9.58) string + number が許可。ただしその他のオブジェクトは依然として明示的な変換が必要 (0.9.58) optimizerが大幅に強化(0.9.54~58) String.fromCharCode(1, 2, 3) や "a".charCodeAt(0) などもコンパイル時に定数になる inline化で複雑な式でも展開できるケースが増えた `jsx --test a.jsx` で_Testがなくてもエラーにしない(0.9.53) 単なるsyntax checkとしても使えるようになった 型推論できる箇所がいろいろ増えた(0.9.49, 0.9.58) `jsx --enable-source-map --run a.jsx` で例外時にJSXソースのファイ

    JSXの最近の新機能 - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/07/27
    [JSXのアップデート。
  • 「JavaScriptのイディオム集@nmi.jp」をJSXでやるとどうなるの、っと - Islands in the byte stream (legacy)

    JavaScript イディオム集 を JSX でやってみました。jsx --testで実行できます。 総じて見ると、値の変換は「x as string|number|int」でできる分単純になっているほか、全体的に単純になっていて覚えるべきイディオムは少なくなっています。また、~array.indexOf(item)のような高速化のためのイディオムは不要です*1。 このあたり、他の AltJS でどうなのかも知りたいですね。 import "test-case.jsx"; import "js.jsx"; class _Test extends TestCase { // 数値化 function testNumify() : void { var v = "123"; this.expect(v as number + 100).toBe(223); // Math.parseFloa

    「JavaScriptのイディオム集@nmi.jp」をJSXでやるとどうなるの、っと - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/07/07
    ふむふむ
  • JSXのgeneratorで同期的なsleep()を実装してみる - Islands in the byte stream (legacy)

    [追記]v0.9.84現在、--enable-generator-emulationが必要です。これを付けないと、ES6のgeneratorを使うようにコンパイルされます。[/追記] 最近、JSの非同期まわりが新しい盛り上がりがありました。 Google Chromeに入ったジェネレータとPromiseで非同期処理に革命が起きた - 素人がプログラミングを勉強していたブログ 2013-05-02 とくにES6のgeneratorを使えば、非同期コードを同期的に書けるようになるということで期待が持てます。 ところで、JSXにも最近実験的にgeneratorが実装されました*1。生成されるJavaScriptはES5準拠ですから、スマートフォンでも実行可能です。 すなわち、これが格的に使えるようになれば、ブラウザの対応を待たずにgeneratorが使い放題になるというわけですね!genera

    JSXのgeneratorで同期的なsleep()を実装してみる - Islands in the byte stream (legacy)
  • JSX の名前空間の仕組み - Islands in the byte stream (legacy)

    JSXには名前空間の仕組みがあります。ここで名前空間とは厳密に定義はせず、「同名の異なるクラスを同じスコープで使用する仕組み」とします。つまりJavaではパッケージ、C++では名前空間、 ES6/TypeScriptではモジュールと呼ばれるものですね。JSXの名前空間は宣言する構文こそありませんが、ファイルがその単位となっていて、必要であればそれを特定の名前空間に割り当てて使うことができます。 この「宣言構文がない」「必要なときのみ名前空間を割り当てる」という仕様のため普段意識することは少ないのですが、たとえばJavaのようにファイルシステム上の名前とpackage宣言の名前を一致させなければならないという冗長性がなくとてもシンプルで、私は気に入っています。 さて、使い方も軽く紹介しましょう。たとえば以下のように同名のクラスMyClassを定義している foo.jsx, bar.jsx が

    JSX の名前空間の仕組み - Islands in the byte stream (legacy)
  • Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)

    あるいは PERL_CPANM_OPT=-n は危険だという話。 それはこのtweetから始まった。 結局これは Data::Dumper 2.143 が壊れていたからなのだが、そこに至るまでがちょっと大変だったので記録しておく。 まず、再現スクリプトは以下のものだった。 # executed in perl 5.10.1 use strict; use warnings; use Data::Dumper; use Text::Xslate; my $tx = Text::Xslate->new({ syntax => 'TTerse' }); my $template = <<TMPL; [% value | dump %] TMPL my $value = +{ 'ab' => 'c', }; print Dumper($value); my $ret = $tx->render_s

    Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/03/06
    Data::Dumper
  • 「Stackを使ってQueueを作る」をJSXで - Islands in the byte stream (legacy)

    Stackを使ってQueueを作る - くまメモ 発想がおもしろかったので JSX で実装してみました。 import "test-case.jsx"; class Queue.<T> { var _in = new Array.<T>; var _out = new Array.<T>; function constructor() { } function enqueue(value : T) : void { this._in.push(value); } function dequeue() : Nullable.<T> { if (this._out.length == 0) { if (this._in.length == 0) { throw new Error("Queue is empty!"); } while (this._in.length > 0) { this.

    「Stackを使ってQueueを作る」をJSXで - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/02/03
    <T>ってJavaのジェネリクス...?jsxってジェネリックス使えるの...
  • なぜJSXをセルフホスティングすべきなのか - Islands in the byte stream (legacy)

    JSX をセルフホスティングしてnpm packageとしてリリースしました。 https://npmjs.org/package/jsx さてJSXコンパイラをJSXで書きなおしたわけですが、これは主にJSXコンパイラの質を高めるためです。JSXはJavaScriptと比較すると大規模な開発に向いている、というのがJSX開発チームの主張です。であれば、JSXコンパイラをJSXで書くことにより質を高められるはずです。事実、今回のセルフホスティングでtypoやリファクタ時のエンバグ、関数の引数間違いなどによるバグがいくつも見つかり改修されました。セルフホスティングはコンパイラの品質を高める一助になったといえます。 またもうひとつ、今回のJSXコンパイラの開発はJSXによる開発であり、この過程で得た知見が数多くあります。これにより、たとえばasの失敗がnullを返すのではなく例外を返すようにす

    なぜJSXをセルフホスティングすべきなのか - Islands in the byte stream (legacy)
  • JSX v0.9.0 released as a self-hosted compiler - Islands in the byte stream (legacy)

    https://npmjs.org/package/jsx https://github.com/jsx/JSX We are proud to announce the release of the JSX compiler toolkit v0.9.0 as an npm package, which is the first version of self-hosted compiler; i.e. the JSX compiler is now implemented in JSX, whereas the first implementation was written in JavaScript. The self hosting was an important milestone for past months, but now it has been completed,

    JSX v0.9.0 released as a self-hosted compiler - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2013/01/26
    self-host!
  • JSX web editorに補完機能をつけた - Islands in the byte stream (legacy)

    TypeScript の web editor の出来に感動したので JSX web editor に補完機能をつけました。Ctrl+Space/Ctrl+P/. で補完候補を表示します。 これはCodeMirror*1についてくるプラグインであるsimple-hint.jsとJSXコンパイラの補完機能をつかったものです。JSXコンパイラの補完機能はjsxdocやメソッドのシグネチャについての情報も得られるのですが、simple-hint.jsは単に補完候補のリストを表示させるだけのようなのでとりあえずはそれだけ対応しました。 *1:JSX web editorはCodeMirrorを使っています。

    JSX web editorに補完機能をつけた - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2012/10/14
    進化
  • JSXの学び方 - Islands in the byte stream (legacy)

    JSXをどうやって学べばよいか、メモしておきます。 言語仕様 言語仕様は jsx.github.com にドキュメントがあるほか、実例としては言語仕様のテストである JSX/t/run/*.jsx が参考になります。特に JSX/t/run/*.jsx は実際に開発するとなると頻繁にgrep することになると思います。 http://jsx.github.com/doc.html https://github.com/jsx/JSX/tree/master/t/run また、組み込み関数の挙動はJavaScriptと同じなのでリファレンスとしてはMDNがいいでしょうし、実際のシグネチャは lib/built-in.jsx を見るといいでしょう。 DOM操作 / ブラウザAPI DOM用APIは、"js/web.jsx" をimportする必要があること、windowやdocumentがグロ

    JSXの学び方 - Islands in the byte stream (legacy)
  • jsdo.it で JSX がサポートされました - Islands in the byte stream (legacy)

    jsdo.itでJSXとCoffeeScriptがサポートされました! スクリプト冒頭を "//#!jsx" で始めるとJSXモードになります。例えば[twitter:@sasaplus1]さんがJSから移植したJSXコードも、いまや以下のように直接実行できるようになりました。jsdoitなどで簡単にアプリを公開できるように、どんどんライブラリを整備していきたいですね。 http://jsdo.it/__gfx__/sakura JSXタグ付きコードの一覧は以下から見られます。 http://jsdo.it/tag/jsx なお、最近はドキュメントも整備されつつあります。今後ともJSXをよろしくお願いします。

    jsdo.it で JSX がサポートされました - Islands in the byte stream (legacy)
  • Unit tests for JSX - Islands in the byte stream (legacy)

    いずれJSX web siteにも載せますが、JSXには非同期テストにも対応したユニットテスト・フレームワーク、test-case.jsxが標準で添付されています。t/lib/*.jsxはこのtest-case.jsxでテストされています。 使い方は以下のようにTestCaseを継承して、"test"で始まるメソッドを並べるというJUnit風のものになっています。 非同期テストを行う場合は、TestCase#async()のコールバックの中でテストを行い、AsyncContext#done()でテストの終了を通知するというインターフェイスになっています。 import "test-case.jsx"; import "timer.jsx"; class _Test extends TestCase { // synchrounous tests function testClearTime

    Unit tests for JSX - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2012/06/03
    JSXのテストフレームワーク。
  • source-mapを可視化する - Islands in the byte stream (legacy)

    source-mapは非常に期待のできる技術だが、軽く仕様を読んでもどのように動くのかよくわからない。そこで、souce-mapを可視化するツールを作ってみた。source-mapの処理にはmozillaのJavaScriptによる実装を使った。 左がオリジナルのソースコード、右がclosure compilerで最適化したコードである。具体的なコマンドラインオプションは以下のrepositoryのMakefile参照のこと。要素から要素への線はcanvasを利用した。ChromeとFirefoxでのみ確認したので、他のブラウザではうまく表示できないかもしれない。 demo repository 改良の余地はあるものの、とりあえずこれでデバッグできるようになった。

    source-mapを可視化する - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2012/04/24
    あれこれ視覚化できてよい!線が気になるけど、置き換えられた変数は読みやすい。
  • JSにコンパイルされたDartがPerlより速い件 - Islands in the byte stream (legacy)

    Dartのインストールが簡単になっていたので試してみたところ、Perlよりも高速だった。 なにこれ悔しい。 Dart: void main() { final t = new Stopwatch(); t.start(); final a = new List<int>(); for(var i = 0; i < 1000000; ++i) { a.add(i); } for(var i = 0; i < a.length; ++i) { ++a[i]; } var sum = 0; for(var i = 0; i < a.length; ++i) { sum += a[i]; } print(sum); print(t.elapsedMilliseconds / 1000); } Perl: use 5.12.0; use Time::HiRes qw(gettimeofday tv_

    JSにコンパイルされたDartがPerlより速い件 - Islands in the byte stream (legacy)
  • DeNAに入社しました - Islands in the byte stream (legacy)

    既に2週間ほど経過していますが、4/1付けでDeNAに入社しました。なかなか刺激的な毎日を送っています。 さて、これからは忙しさが増す一方でしょうから、今のうちに初心を振り返っておきます。 私はこの数年間、コードを書きながら、自分の人生の中でやりたいことはなんだろうかを考えてきました。私は主にソフトウェアのパフォーマンスに興味があります。プログラミング言語やツールに興味があります。また、テストや開発手法にも興味があります。エンジニアのコミュニティのあり方や、ハッカー文化にも興味があります。これらの興味を導きだすもの、それは以下のような考えだと思い至りました。 ソフトウェアエンジニアがもっと幸せになれるような技術を提供する この考えは、以下のid:TAKESAKOさんのインタビューを読んでから鮮明になりました。 Webエンジニア武勇伝 第29回 竹迫良範氏 (2008) 竹迫 日ITエン

    DeNAに入社しました - Islands in the byte stream (legacy)
    rokujyouhitoma
    rokujyouhitoma 2011/04/16
    ][入社]