JSXのgeneratorで同期的なsleep()を実装してみる

[追記]v0.9.84現在、--enable-generator-emulationが必要です。これを付けないと、ES6のgeneratorを使うようにコンパイルされます。[/追記]最近、JSの非同期まわりが新しい盛り上がりがありました。 Google Chromeに入ったジェネレータとPromiseで非同期処理…

Rubyのレキシカル変数むずかしい

同じシンボルの参照でも、代入(宣言)前後で参照しているものがまったく違うものになるのがPerlと違って難しい。 class Base def initialize self.foo = "init" end def foo=(value) @foo = "<#{value}>" end def foo @foo end end class Derived < Base de…

META specのrequires, recommends, suggests

CPAN Meta Spec 2.0 における requires, recommends, suggests - tokuhirom's blog これみてもよくわからんなーと思っていたのです。特にrecommendsとsuggetsの違いが。ですが、それぞれ must, should, may に相当するといわれて合点がいきました。 window.t…

PerlIO::scalar でopenできるのはバイト列だけ!

Perl 5.18 からは、PerlIO::scalarでopenできるのはバイト列だけになるようです。wide characterを含んだスからリファレンスをopen()しようとしても警告と共にopen()が失敗します。perldialog: Strings with code points over 0xFF may not be mapped into i…

Ruby+Redisでランキングを実装してみる

Redisでランキング機能を実装してみる - (゚∀゚)o彡 sasata299's blog を自分がやったらこんな感じかなと思って書いてみました。実行環境はRuby 2.0.0-p0です。 #!/usr/bin/env ruby require 'redis' require 'pp' class Leaderboard class Entry attr_reader …

PUREPERL_ONLY=1 for pure Perl build

2013年のランカスター合意によれば、XS/PP両実装を持つモジュールは PUREPERL_ONLY=1 / --pureperl-only というコマンドラインオプションでXSをオプトアウトしたビルドをできるようにすべきだ、とのことです。そこで、Module::Install::XSUtil 0.44 では PUR…

Perlの m// は中身が固定文字列だと爆速になる

[追記] 実際に検証してみると、パターンが短いと index() のほう速いこともあるようです。パターンが長いと正規表現のほうが高速になるのでそもそもアルゴリズムが違うようですね。 よってこのエントリの内容は必ずしも正確ではありません! cf. https://gis…

Xamarin.Android で YouTubeAndroidPlayerAPI.jar を使ってみる

Xamarin.Android には Android用JARから.NETアセンブリを自動生成する機能があって、Mono.Android.dll を作る機能を一般化したものらしい。これで Google の提供する YouTube Android Player API を呼び出してみたところ、意外なほど簡単にできた。 https://…

Perlでクラス名として避けるべきもの

base.pm, parent.pm, B.pm がコアモジュールとして存在するので、テストコードやサンプルコードといえどもこれらの名前は避けるべきです。OSXのデフォルトやWindowsのファイルシステムはcase insensitiveなので、Base, Parent なども同様です。Child.pmとい…

JSX の名前空間の仕組み

JSXには名前空間の仕組みがあります。ここで名前空間とは厳密に定義はせず、「同名の異なるクラスを同じスコープで使用する仕組み」とします。つまりJavaではパッケージ、C++では名前空間、 ES6/TypeScriptではモジュールと呼ばれるものですね。JSXの名前空…

一つの npm package を複数人で管理するとき

npm owner で管理できるようです。例: npm owner add kazuho jsx

Mouseで「あるメソッドを持ったオブジェクト」という制約をつくる

互いに継承関係がなくてもRoleを適用していなくても duck_type() を使えばOK!しかも自前で can() するより高速なスグレモノ*1。 use strict; use warnings; package Foo { use Mouse; sub x { 1 } __PACKAGE__->meta->make_immutable(); } package Bar { us…

Perl製ツールを非Perlerに配布するとき

lib::core::only とか使うわけですけど、これの中身は4行で書けるのでそれでもいいと思います。 # does the same as lib::core::only to prevent to use locally-installed modules BEGIN { require Config; @INC = @Config::Config{qw(privlibexp archlibex…

git commitの編集時にvimがread onlyになって困るとき

コミット時のdiffのバイナリっぽいものが入ってると vim が readonly になることならあるらしいです。

CPAN Testersの紹介

最近Perlのネガティブな話が話題ですが、ちょっとCPANまわりのサービスの自慢をさせてください。それは CPAN Testers です。CPAN Testers *1 とは、CPANに公開したモジュールがどの環境で動きどの環境でどういうエラーがでるのかを集積するサービスです。よ…

v8bench scores for smartphones

v8 benchmark v7 の total score のみ。 Nexus 4 (Android 4.2.2) Chrome 25 : 1823 Firefox 19 : 1227 Opera Mobile (12.10) : 534 Nexus 7 (Android 4.2.2) Chrome 25 : 1621 Firefox 19 : 1158 iPod touch 5th generation (iOS 6.1.2) Safari : 681 UIWeb…

CPANモジュールが環境変数で挙動を変えるときはPERLプレフィクスをつけるべし

PERL_CPANM_OPT とか PERL_ONLY みたいに挙動を変える系の環境変数は"PERL"というプレフィクスをつけておくと perl -V でその環境変数が表示されるのでバグレポートからのデバッグが捗りますね。

トラブルシュートの流れを公開するということ

または Data::Dumper が壊れているという惨事 - Islands in the byte stream の反省会。これは結果的には解決できたけど、最初の時点で Perl 5.10.1 を Mac でもいいから用意して Data::Dumper の make test を走らせていれば一瞬でわかったことだ。いや、 D…

Data::Dumper が壊れているという惨事

あるいは PERL_CPANM_OPT=-n は危険だという話。それはこのtweetから始まった。 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s)…

Xslate will be Any::Moose-free!

Xslate 2.0 will use only Mouse, migrated from Any::Moose. Please test Text::Xslate 1.9999_01 whether not to break your applications. http://metacpan.org/release/GFUJI/Text-Xslate-1.9999_01/

Fixed a memory leak in Mouse, introduced in 1.04

Mouse 1.05 has been released, fixing a memory leak introduced in 1.04, so upgrading from 1.04 is recommended. Slow leak introduced by v1.04 by creaktive · Pull Request #4 · gfx/p5-Mouse · GitHub

「Stackを使ってQueueを作る」をJSXで

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._</t></t></t>…

B::Size2 をデバッグしたときのメモ

B::Size2 で問題が起きるという報告を受けて修正するまでのメモ。 まず再現ですが、これは標準モジュールを使っても簡単に再現できたのでテストに追加してこれを使います。 diff --git a/t/002.terse.t b/t/002.terse.t index ccf6a99..02de21a 100644 --- a…

なぜJSXをセルフホスティングすべきなのか

JSX をセルフホスティングしてnpm packageとしてリリースしました。 https://npmjs.org/package/jsx さてJSXコンパイラをJSXで書きなおしたわけですが、これは主にJSXコンパイラの質を高めるためです。JSXはJavaScriptと比較すると大規模な開発に向いている…

JSX v0.9.0 released as a self-hosted compiler

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 implemente…

SiriProxyを試してみた

Siriの挙動をカスタマイズできる SiriProxy というアプリケーションがある。設定は面倒だが下記サイトのようにいろいろ夢が広がりそうなシステムなのでセットアップして起動してみた。といってもセットアップは下記のサイトにしたがってやれば問題はない。bl…

環境変数にいろいろ突っ込み過ぎると危険があぶない

$ export FOO=`perl -E 'say "." x 1_000_000'` $ perl -v bash: /usr/bin/activeperl: Argument list too long 簡易的にIPCをする方法として環境変数にJSONを突っ込んでサブプロセスから参照する、みたいなことはたまにすると思いますが、ちょっと大きなデ…

Released B::Size2, forked from B::Size 0.09

B::Size が2006年のリリースを最後にメンテナンスされておらず、最近のPerlではビルドできないという問題がありました。そこで何年か前にパッチを書き、patched verをgithubにあげてはいたのですが、CPAN経由でインストール出来ないとどうにも不便です。そこ…

コマンドラインからCPAN moduleのChangesを読む

Pod::Cpandoc の v0.13 から -c オプションでモジュールのChangesを読めるようになったようです。すばらしい! $ cpandoc -c Text::Xslate Revision history for Perl extension Text::Xslate 1.6002 2012-12-19 22:54:55 [BUG FIXES] - Fix a bug where TTe…

Perlの引数の評価戦略が正格ではないとき

cf. 評価戦略 - Wikipediaサブルーチンの引数として渡す式がハッシュの要素の場合、その評価は正格ではなく、要素の取得は必要になるまで行われません #!perl use 5.14.0; use warnings; use strict; package MyTieHash { use Carp qw(longmess); use Tie::H…