タグ

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

  • Perlのbug report echo-systemはどのように素晴らしいのか - Islands in the byte stream

    Perlのbug report eco-systemまわりはOSSとしてはわりと理想的だと思っています。つまり有用なレポートを生成する仕組みがあり、perlコア開発者だけでなくライブラリ開発者もその仕組を活用できるため、可搬性のあるソフトウェアとしてメンテナンスし続けやすいのです。もっとこのあたりはもっと真似されるべき。 まずバグレポートには現象と再現手順と環境の情報が必須ですが、環境の情報は perl -V で非常に簡単に取得できます。これは以下の情報を含みます。 ソフトウェアの名前とバージョン (e.g. perl 5.18.1) ターゲットプラットフォーム (e.g. osname=darwin, osvers=12.4.0, archname=darwin-2level) ビルドオプション (e.g. config_args='-Dprefix=/Users/goro-fuji/.

    Perlのbug report echo-systemはどのように素晴らしいのか - Islands in the byte stream
    umiyosh
    umiyosh 2013/12/05
  • test-travis(1)というコマンドを書いた - Islands in the byte stream (legacy)

    https://github.com/gfx/App-test-travis Travis-CI は CPAN Testers のない言語だとライフチェンジングなサービスだし、 CPAN Testers のある Perl においてもpushごとにCIを走らせたりちょっと変わった設定でテストを走らせたりできる大変便利なサービスですが、設定ファイルを正しく書くのがわりと面倒で、うまく動かすために.travis.ymlを少し変更してcommit & pushというのを何度もするはめになったりします。なので、ローカルで.travis.ymlを読んで実行するコマンドがあれば便利だろうというのがこれを作った動機です。 まだ作りはかなり適当で、before_install, install, before_script, scriptセクションを順番に実行するだけのもので、envやversionsをよし

    test-travis(1)というコマンドを書いた - Islands in the byte stream (legacy)
  • RubyのMethod#source_locationをPerlで - Islands in the byte stream (legacy)

    [追記]Cside先生がUNIVERSAL::source_location_forとしてリリースしておりますのでcpanmでご利用ください![/追記] asakusa.rbでsource_locationというメソッドを教えてもらいました。 それによれば、Rubyのメソッドオブジェクト(UnbountMethod, Method, Procなど)にはsource_locationというメソッドがあり、そのメソッドが定義されたファイル名と行番号を取得することができます。これはクラス階層が複雑なときにデバッグに役立ちそうです。 Perlでも標準ライブラリに含まれるBモジュールを使って同様のことができるのでやってみました。 Ruby版: #!/usr/bin/env ruby2 require 'fileutils'; p FileUtils.method(:pwd).source_locat

    RubyのMethod#source_locationをPerlで - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2012/03/07
  • 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)
    umiyosh
    umiyosh 2012/02/27
  • 2012年はプログラミング言語を作りたい - Islands in the byte stream (legacy)

    当は2011年の1-3月の間にやろうと思っていたのだが、卒業の危機などがあり思うように進まなかった。しかし今年Perl/XS以外にもC++, Objective C++, Java, ActionScript, JavaScript, Rubyなどでコーディングする機会があり、自分が欲しい言語が具体的になってきた。 私が欲しいのは、Perlの次を担えるような言語だ。それは必ずしも私の言語でなくてもいいのだが、とにかく「next Perl」が欲しい。 Perl言語のいいところは何か。それは言語に密結合した正規表現構文とテキスト処理機能、シンボルテーブルなど内部データ構造*1や後付けのOOP*2のような原始的な機能の露出、標準ドキュメントフォーマット*3とビューア*4、RAIIとダイナミックスコープだ。私は、これらすべてを備えている言語をPerl以外に知らない。 一方で、不要な機能もある。特

    2012年はプログラミング言語を作りたい - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2012/01/01
  • Perl 5.15.2 released! - Islands in the byte stream (legacy)

    Perlの開発版である5.15.2がリリースされました。 https://metacpan.org/release/RJBS/perl-5.15.2 このバージョンで組み込み関数のサブルーチンリファレンスが取れるようになっています。 use 5.15.2; # automatically turns on strict my $time = \&CORE::time; say $time->(); # 1313908276 また、__FILE__と__LINE__がtime()同様引数をとらない組み込み関数として解釈されるようになったので、以下のようなことも可能です。 use 5.15.2; # automatically turns on strict my $file= \&CORE::__FILE__; say $file->(); # foo.pl ただし組み込み関数のリファレンス

    Perl 5.15.2 released! - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2011/08/22
  • each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)

    特別な条件がないかぎり、each()は使うべきではありません。代わりにkeys()/values()を使うべきです。その理由は2つあります。 each()は遅い each()でハッシュ全体をループするのは遅いです。これは、keys()/values()がその内部の値をそのまま参照する*1のに対し、each()は代入しないとその値を使えないからです。 ベンチマーク: #!perl use strict; use warnings; use Benchmark qw(cmpthese); my %hash = map { $_ => $_ } ( 1 .. 10000 ); cmpthese -1, { each_k => sub { while(my $key = each %hash) { } }, each_kv => sub { while(my($key, $value) = eac

    each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2011/06/04
    Sent from my iPhone
  • Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)

    ソースコードを読んでいると、関数の引数や戻り値の具体的な例がほしいと思うことがよくある。。そこで、実行可能なコメントを仕込むモジュールであるSmart::Commentsを使って、モジュール内にテストを兼ねたサンプルコードを仕込めばいいのではないかと考えた。これにより、開発者にとっては簡単なテストコードとして動き、読者にとっては具体例となるコードを簡単にソースコード内に埋め込むことができる。 package MyUtil; use strict; use warnings; use parent qw(Exporter); our @EXPORT = qw(add); use if __FILE__ eq $0, 'Smart::Comments'; ### assert: add(10, 20) == 30 sub add { my($a, $b) = @_; ### add(a, b)

    Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2011/05/29
  • lib::xi - installs missing libraries on demand - Islands in the byte stream (legacy)

    gistなどで公開されているPerlスクリプトを実行する際、モジュールが足りないことがよくあります。そういう場合はCan't locate Foo.pm ...というエラーメッセージを見ながらモジュールをインストールするわけですが、決まりきった作業にうんざりしたので自動的にそれをするモジュールを書きました*1。 https://github.com/gfx/p5-lib-xi `perl -Mlib::xi script.pl`とするだけで、足りないモジュールをcpanmで適当にインストールしてくれます。 -Mlib::xi=extlibとすれば既存の環境を壊すことなくlocal::lib的にextlib/にインストールして実行できますし、-Mlib::xi=-L,extlib,-qなどとしてcpanmにオプションを渡すこともできます。 これで退屈なインストール作業をしなくてすむはずです。

    lib::xi - installs missing libraries on demand - Islands in the byte stream (legacy)
  • Don't use base.pm, use parent.pm instead! - Islands in the byte stream (legacy)

    「使っちゃいけない標準モジュール」*1の反響を見ていると、baseが非奨励ということに驚かれた方が少なくありませんでした。そこで、baseについて補足します。 まずbase.pmのドキュメントの最初の文は以下のようになっています。 Unless you are using the fields pragma, consider this module discouraged in favor of the lighter-weight parent. (拙訳: fieldsプラグマを使用しているのでないかぎり、このモジュールは勧められない。かわりに軽量なparent.pmを使う方がよい。) fieldsプラグマは、ハッシュリファレンスのキーを固定したオブジェクトを作成するための機能ですが、あまり一般的ではないためここでは解説しません。特に理由がない限り、ここは素直に忠告に従った方がいいでし

    Don't use base.pm, use parent.pm instead! - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2010/12/26
  • Mouse will become as strict as Moose - Islands in the byte stream (legacy)

    Mouse 0.51からエラーチェックをMooseと同じくらい厳しくする予定です。具体的には,以下の場面で警告や致命的エラーを出します。 has()に未知のオプションが渡されたとき警告 おそらく綴りミスであるため has()によってアクセサが生成されず,かつ is => 'bare' も指定されていないとき警告 isの指定し忘れと見なす has()にisaとdoesを両方指定して,$isa->does($does)が偽のとき致命的エラー 内部実装の都合上,型制約は一つしか持てないため,一貫性を保たなければならない これらはいずれもMooseと互換性があるため,Any::Mooseを使っている場合には特に問題はないかと思います。 またstrict constructorも導入しますが,これはMooseにも提案する予定です。 これらの変更の結果,MouseはMooseと同じくらい厳しくエラーチ

    Mouse will become as strict as Moose - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2010/02/23
  • Perl 5.11.5 features - Islands in the byte stream (legacy)

    Perlの開発版である5.11系列の最新版がリリースされた。 http://search.cpan.org/dist/perl-5.11.5/ 今回もバグフィクス中心なので,特に列挙すべき新機能はない。組み込みファイルハンドルのクラスが修正されたのが唯一の大きな変更か。 5.11.5までは,組み込みファイルハンドルのクラスは不定だったのだが,5.11.5からは常にIO::HandleとIO::Seekableをスーパークラスとして持つIO::Fileとなる。 不定というの心もとないが,実際に不定だったのだから仕方がない。これは,以下のスクリプトを実行してみるとよくわかる。 #!perl -w use strict; use IO::Handle; open my $io, '<', $0; # open the script while(my $line = $io->getline){

    Perl 5.11.5 features - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2010/02/22
    Sent from my iPhone
  • XS基礎文法最速マスター - Islands in the byte stream (legacy)

    元ネタ:Perl基礎文法最速マスター(id:perlcodesample) XSを始めるための手順といくつかの要素の解説です。C言語をある程度知っている人でも,これを読んだだけでXSの基礎をマスターしてXSを書くことができるようにはなっていません。リファレンスでもありません。 XSとは,狭義ではPerlでエクステンションを書くためのマクロ言語の名前ですが,広義ではエクステンションを書くための技術の総称です。ここでは,広義のXSを俯瞰します。 XSはいろいろと特殊なのでテンプレは無視で行きます。 目次: h2xsで空のディストリビューションを作る XSファイルの構成 スレッドコンテキスト SVファミリ GCとスコープ さらなる学習のために h2xsで空のディストリビューションを作る 以下のコマンドで空のXSディストリビューションを作ることができます。 h2xs -A -b 5.8.1 -n

    XS基礎文法最速マスター - Islands in the byte stream (legacy)
  • File::Spec::Memoized - Makes File::Spec faster - Islands in the byte stream (legacy)

    File::Specはファイルパスを扱うために欠かせないモジュールだが,メソッドによっては非常に遅くプログラムのボトルネックになりかねない。 このようなケースでは,メモイズ(Memoize)というテクニックが役に立つ。メモイズは,引数が単純で副作用を持たない関数の結果をキャッシュして高速化する手法である*1。 メモ化(Memoization) - Wikipedia たとえば,重い処理を行うf()があったとして,そのf()の結果が特定の引数に対して一意に決まり,かつf()に副作用がないとき,以下のように結果をキャッシュしたmemozied_f()を用意したとしても,f()とmemozied_f()の意味は変わらないが,memoized_f()の二度目以降の呼び出しがf()の呼び出しよりも高速になる。 my %cache; sub memoized_f{ # 引数からIDを作成する my $

    File::Spec::Memoized - Makes File::Spec faster - Islands in the byte stream (legacy)
  • Perl/XSが得意なこと - Islands in the byte stream (legacy)

    最近ひたすらXSを書いていて思ったのが,XSはやっぱり速いということ。 ただ,いつでも無条件に速いというわけでもなく,何も考えずに書くとPurePerlのコードより遅くなることも珍しくない。実際,最近書いたShikaやMOPのXS版もいきなり高速だったわけではなく,一番最初のコードはPurePerlのほうが10%-30%ほど高速だった。 いろいろベンチマークをとった結果の感触として,XSの得手・不得手が分かってきたのでメモしておく。ちなみに下記で「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味で使っている。SVの生成自体はmalloc()を伴わないことが多い*1が,文字列の生成/連結や配列の生成/push/unshiftでは内部でmalloc()が呼ばれる可能性が高く,速度を落とす原因となる。 得手分野 ループ - XSのループが早いというより,Perlのループ

    Perl/XSが得意なこと - Islands in the byte stream (legacy)
    umiyosh
    umiyosh 2008/12/05
  • PerlでAssert - Islands in the byte stream (legacy)

    Perl5.9の時点では,assersionsと-Aコマンドラインスイッチという仕組みでCのassert(3)のようなことができるようになるはずだったらしい。しかし,そのメカニズムはPerl5.10には結局採用されなかった。 開発中はassert()が欲しい,しかし,リリース後の実行時パフォーマンスは落としたくない,というのがAssertを考えるときのジレンマというわけだ。そんななかで,CPANのCapr::Assertは関数呼び出しを完全に消し去ることができるので悪くない方法だと思う。 use Carp::Assert; assert($x > 1) if DEBUG; DEBUGはCarp::Assertの提供する定数関数で,その値が偽ならばこの一文はコンパイル時に完全に削除される。 $ PERL_NDEBUG=0 perl -MO=Deparse -MCarp::Assert \ >

    PerlでAssert - Islands in the byte stream (legacy)
  • 1