2013-01-01から1年間の記事一覧

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() で返されるハッシュキーの順…

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…