タグ

ブックマーク / blog.64p.org (44)

  • Perl5 での Plack に当たる Crust をみんなで作った話 - tokuhirom's blog

    この記事は Perl 6 Advent Calendar 2015 の1日目です。 Perl 6 は、2015年のクリスマスにリリースされることになっており、我々としてはそれを待ち受ける必要があると考えました。 Perl6 がリリースされた暁には、いろいろ遊ぼうかなという気持ちをみなさんお持ちだと思います。 Perl6 には夢が詰まっており、様々な機能が含まれている夢の言語です。 そういった、夢の機能については今後、クリスマスまでの間に、語られていきますが、稿では、現実的な話をします。 今年のクリスマスに Perl6 がリリースされるぞ、という宣言がでたわけですが、そうなってくると、Perl6 をクリスマスから早速遊びたいなと思うわけですよね。 そして、私は web engineer なので、 Perl6 が出たら早速 web application を書きたいと思うわけです。 しかし、

  • MY_CXT_KEY is no longer used by current Perl5 implementation - tokuhirom's blog

    We met a strange bug around XS. https://github.com/gfx/p5-Mouse/issues/18 This issue does not appear on recent Perl5 implementations. ... I find the difference between olders and recent implementation. Then I found a comment in the perl.h. * 1. #define MY_CXT_KEY to a unique string, e.g. * "DynaLoader::_guts" XS_VERSION * XXX in the current implementation, this string is ignored. Hmm...!!! The cha

    syohex
    syohex 2014/02/27
  • Perl で簡単にパーザを書く - tokuhirom's blog

    パーザを書こうという場合、Parse::RecDecsent のようなモジュールを使うのが一般的だが、Perl5 の正規表現は強力すぎるため、そんなものに頼らなくても超絶簡単にパーザを実装することが可能だ。 以下に、四則演算のパーザを示す。 use 5.018000; package Calc { use Carp (); sub parse { local $_ = $_[1]; _parse_expr(); } sub err { my ($msg) = @_; my $ret = join('', $_, "\n", (" " x pos()) . "^\n", $msg, "\n", ); Carp::croak $ret; } sub _parse_expr { my @nodes; until (/\G\s*\z/gc) { my $m = _parse_add() or do

  • Devel::NYTProf で Starlet/Starman (Plack) でうごくウェブアプリケーションのプロファイリングをおこなう方法まとめ - tokuhirom's blog

    Devel::NYTProf は Perl5 の世界でもっとも人気があるプロファイラである。表示が美麗であるし、ステップごとの処理速度が簡単にわかるのでとても便利だ。 そんな Devel::NYTProf であるが、Starlet/Starman のようなプリフォーク式のサーバーでうごくウェブアプリケーションとくみあわせる場合の方法論として、わかりやすい資料がみあたらなかったのでここに記すものである。 環境変数 NYTPROF を設定する Devel::NYTProf は環境変数で挙動を変えられる。 plack とくみあわせる場合には、以下のようにするとよい。 NYTPROF=sigexit=int:savesrc=0:start=no sigexit=int 通常、Devel::NYTProf は END { } ブロックでデータのファイナライズ処理をおこなうのだが、SIGNAL によっ

  • Perl5 における B optree の操作方法入門 - tokuhirom's blog

    いよいよ今週から YAPC だ。YAPC にあわせて、Perl5 の内部構造を復習できるエントリーを書いたのでご一読いただきたい。 Perl5 hack においては、XS をつかった B optree の操作が楽しい。B optree というのはいわゆる AST(抽象構文木) である。Perl5 は byte code interpreter などではなく昔ながらの AST をそのままなめるインタプリタである。であるから、この B optree を操作すれば、簡単にインタプリタの挙動を変えられるというワケ。 一方で、B optree の操作については、あまり知られていないし情報がすくない。日語でも情報がすくないし、英語でもまた情報がすくなく、それっぽいモジュールのコードをよみながら会得するしかないのが現状だ。 すこしでも B 初心者が、ステップアップできるように、私のもっている情報をここ

    syohex
    syohex 2013/09/17
  • ふと思いたって、emacs の設定を1からやりなおしたの記 - tokuhirom's blog

    久々に Emacs の設定をした。普段は vim をつかっているのだが、日語の長 文を vim で書くのはつらいので Emacs 環境を整備したかったのだ。 (Emacs ですべてを書くと左手の小指が死ぬので、日語のときだけにつかう ことにしている) Emacs の設定は最近は MELPA だか package.el だか el-get だかでやるのが ナウいらしいのだが、どうちがうのかよくわからない。いろいろと日語の情 報があるのだが、「そもそもどれがなんなのか」というところをあんま説明し てくれてなくて辛い。 いろいろと調べた結果、僕は以下のような結論にたっした。 package.elインストーラ。tar ball とか file を指定すると、それをインストールして くれる。便利。 MELPAレポジトリから定期的にフェッチしてきて、いいかんじに package.el 対応の サ

    syohex
    syohex 2013/05/01
    Emacs setting
  • ウェブサービスのクライアントライブラリやHTTPをつかったミドルウェアのクライアントを作成する際に気をつけるべきこと - tokuhirom's blog

    ウェブサービスのクライアントや、Net::Groonga::HTTP のようなミドルウェアのクライアント、いろいろありますが、HTTP サーバーへの簡単なアクセスを提供するライブラリをつくるときに僕が気をつけていることをここに記す。みんな気をつけたほうがいいです。 HTTP Client Library の引数を変更できるようにするか、HTTP Client Library のインスタンスをさしかえられるようにする変更できないライブラリとか利用価値がないです。。 タイムアウトの設定もかえられないライブラリとか、たまにありますが、ちょっとひどいですね。 生のレスポンス情報がとれるようにするHTTP::Response なり Furl::Response なりをそのままとれるようにすべき。 たとえば、$client->last_response のようなメソッドを用意し、最後のレスポンスオブジ

    syohex
    syohex 2013/04/26
  • xt/01_spell.t の方針かえた - tokuhirom's blog

    Pod::Wordlist::hanekomu をつかうCPAN Author の名前とかがもろもろはいってて、だいぶ結果がマシになるなんかみんなつかってるっぽい。aspell 決めうちにして、~/.aspell.en.pws で管理する同じワードを何度も登録しなくてよくなるそもそもスペルチェッカの種類いろいろ fallback すると、環境によって結果がずれてうざいなどなど。

    syohex
    syohex 2013/03/22
    spell check
  • 汎用データフォーマットにたいする雑感 - tokuhirom's blog

    フォーマットの変更は、ユーザーに対して基的に不利益をあたえる バージョン情報が含まれているフォーマットならば問題はすくないユーザーはなにも考えたくないから汎用フォーマットをつかう できるだけなにも考えたくないゆるふわプログラマーがほとんどなのですYAML をみよ バージョンの差異と、プラットフォームごとの実装の非互換によってわけわかめである初期の時点でまともに実装できている処理系がすくなかったバージョン2を現在まともに処理できているのは libyaml ぐらいではないか? これはフォーマットの複雑さによるところが大きい1のライブラリと2のライブラリ、ユーザーには見分けがつかない状況 YAML::XS が2 で YAML.pm が 1 とどうしてわかる?非互換や、ユーザーのプログラムがこわれる変更は、まあなしね。Data::MessagePack2 とかがでたときに、たとえば AnyEve

  • carton + 開発版の cpanm で、特定のバージョンのモジュールをつかいこなす! - tokuhirom's blog

    開発版の cpanm で、META file の version range がサポートされるようになりました。 CPAN の META spec v2.0 では、version range がサポートされていて、以下のような柔軟な指定が可能となっています。 Some fields (prereq, optional_features) indicate the particular version(s) of some other module that may be required as a prerequisite. This section details the Version Range type used to provide this information. The simplest format for a Version Range is just the vers

    syohex
    syohex 2013/02/03
  • Let's try "develnytprofhtml --minimal"! - tokuhirom's blog

    develnytprofhtml is bit slow, you know. why it's slow? so it generates very big 'dot' file for graphviz. Normally, the people want to profiling doesn't need it. --minimal, -m Don't generate graphviz .dot files or block/sub-level reportsIf you don't want to generate graphviz dot file, try to run nytprofhtml --minimalIt's pretty faster. Here is a benchmark. --minimal is very fast. $ time nytprofhtml

    syohex
    syohex 2012/10/01
    I have not known this option!!
  • なんてこった…CPANモジュールをnode.jsで動かしてしまうライブラリ「node-perl」 - tokuhirom's blog

    https://github.com/tokuhirom/node-perl/ ここ最近、プログラミング言語同士の壁が徐々に破壊されている気がします。あるプログラミング言語上で別なプログラミング言語を動くようにしたり、置き換えてしまったりするような類です。今回はその一つ、CPAN moduleをnode.js上で動かすという、かなり無茶な気がしなくもない、そんなソフトウェアnode-perlを紹介します。 var Perl = require('../index.js').Perl; var perl = new Perl(); perl.use('LWP::UserAgent'); var ua = perl.getClass('LWP::UserAgent').new(); var res = ua.get('http://mixi.jp/'); console.log(res.as_

  • Amon2 をつかったウェブアプリケーションを GUI アプリにはやがわりさせる!! - tokuhirom's blog

    GUI アプリをつくりたいけど、どうもめんどくさくて、ウェブアプリケーションですませてしまうウェブエンジニアは多いとききます。 とはいえブラウザでいちいちひらくのも面倒だし、daemontools つかうのもちと面倒。。というわけで、GUI アプリケーションにしてしまいましょう。 以下のような、キモいが回転する PSGI アプリがあったとします。これを GUI アプリケーションにはやがわりさせるにはどうしたらいいでしょうか。 use strict; use warnings; use utf8; use Amon2::Lite; get '/' => sub { my $c = shift; return $c->render('index.tt'); }; # code was taken from: http://jsdo.it/moriyoshi/syTt __PACKAGE__-

  • llvm で Hello wolrd!! 〜llvm入門 その2〜 - tokuhirom's blog

    http://www.ibm.com/developerworks/jp/opensource/library/os-createcompilerllvm1/ 最初なのでとりあえず↑の記事を基なぞってますが、わかりやすく解説をいれています。 llvm であそぶには、まあいろいろな方法がありますが、わかりやすく大きくわけると以下の4ステップです。 llvm IR の動的生成llvm IRの最適化llvm IRの JIT コンパイルllvm IRのネイティブコードへの変換それぞれのフェーズごとに分離して動作させることができるので、創りたいところだけつくればいいのです。 とりあえず基となる llvm IR の動的生成をおこなってみます。 とりあえずなにもしない main 関数をつくりましょう。 #include "llvm/LLVMContext.h" #include "llvm/Modu

    syohex
    syohex 2012/07/18
  • sakura vps でのアプリケーションサーバーの実行を upstart にしてみた。 - tokuhirom's blog

    2個前にセットアップしたときは daemontools つかってて、1個前は supervisord をつかってたんだけど、せっかく ubuntu つかってるんだから、ということで supervisord をやめて upstart でうごかすようにした。 なんかこんなかんじ。 description "64p.org upstart script" start on (local-filesystem and net-device-up) stop on shutdown respawn respawn limit 5 60 console log script logger -is -t "$UPSTART_JOB" "starting" chdir /usr/local/webapp/64p.org/ exec 2>&1 exec setuidgid www-data /usr/loc

  • C++ でlexer/parserをかくなら re2c+lemon がオススメな件 - tokuhirom's blog

    yacc や lex をつかっていても「なんかよくわからんけどうごく」という状態になりがちだったり、グローバル変数にまみれたりしがちだが、re2c + lemon だとそのへんがすっきりする。 レキサを以下のようにかく。yyfill を自前でかかなければいけないのがちょっと面倒だが、このようなクラスを手軽にかけるのはやはり便利である。flex ではこうはいかないのだ。 #ifndef CALC_SCANNER_H_ #define CALC_SCANNER_H_ #include <stdio.h> #include <string.h> #include <string> #include <sstream> #include <vector> #include <iostream> #include <fstream> #include "scanner.def.h" #include

  • 「なぜそのモジュールをつくったのか、他のものでは駄目なのか」ということをドキュメントに書くといいよ、という話 - tokuhirom's blog

    なにしろ、「これこれこういう実装なんですよ!!」「こういうインターフェースなんですよ!!」っていうところだけあっても肝心の「なぜこのモジュールが必要なのか」っていうところが記述されていないモジュールが多い。 なにより肝要なのは「なぜ現状だとこのモジュールが必要なのか」「このモジュールをつかうとどういう場合に便利になるのか」「既存のモジュールにたいする優位性はなにか」といったところを記述するとよい。 とくに「既存のモジュールにたいする優位性」というのは重要で、これを記述していないと海外Perl Mongers から「それ Nantoka::Kantoka でできるよ」みたいなのがいっぱいコメントがついたりする。国内からもつく。 なんてことを思った。

    syohex
    syohex 2011/11/21
    必ず意識すべきポイントとして心得る。
  • Amon2::Setup::Flavor::Large + Teng をもちいた簡単な掲示板の作成 〜 軽量フレームワークAmon2入門 (7) 〜 - tokuhirom's blog

    前回から大分時間が経ってしまいましたが、唐突に Amon2+Teng で大きめのアプリをつくるチュートリアルでもはじめましょう。Teng というのは、O/R Mapper とよばれる種類のライブラリで、DB へのアクセスを簡単にしてくれるものです。 さて、とにかくも準備からはじめましょう。 % cpanm Amon2 Amon2::Setup::Flavor::Teng Tengで Amon2 をインストールします。 % amon2-setup.pl --flavor=Large,Teng MyBBSとするとスケルトンができあがりますので % cd MyBBSとして、プロジェクト用のディレクトリにはいります。 %cpanm --installdeps .とすると、依存モジュールがインストールされます。 % plackup app.psgi -R libとうつと、サーバープロセスが起動します

  • Module::Install の功罪 - tokuhirom's blog

    M::I が最近微妙だよねという話を懇親会をしていたら、なんか中途半端につたわった感じがあったのでちゃんとまとめておきますね。箇条書きだけど。 利点DSL でかけるのでみためがかっこいい。プラグインとかあって便利 最近は author_tests と、XSUtils ぐらいしかつかてないけど 欠点auto_install がやばいし、つかってると charsbar さんに DIS られますinclude_deps は依存モジュールがアップデートしたときにしぬ!use_test_base がぶっこわれてる → include_deps をつかいこなすのが無理ゲーな実例 use_test_base は test_requires 'Test::Base'; で代替しましょうプラグインがインストールされてない時のエラーメッセージが凶悪dotcloud でつかうには git add -f inc/

    syohex
    syohex 2011/10/18
    EU::MMの書き方を知らないので, Module::Install使ってるけど、ちゃんと書き方を覚えよう。
  • Perl5 用の Rake っぽいのできたよー - tokuhirom's blog

    http://frepan.org/~tokuhirom/Daiku-0.01/ Rake みたいなの、Perl にも欲しいね、って5年ぐらい前からおもってたけどいいのができたって噂をきかないので自分でかいた。 #! perl use Daiku; use autodie ':all'; task 'all' => 'foo'; file 'foo' => 'foo.o' => sub { system "gcc -c foo foo.o"; }; rule '.o' => '.c' => sub { system "gcc -c foo.o foo.c"; }; build shift @ARGV || 'all'; こういうかんじでつかえる。簡単でしょ。 以下設計のメモ。 基的には Rake とインターフェイスをあわせめでつくってる。巨人の肩に云々。 DSL を DSL としてゴリゴ

    syohex
    syohex 2011/04/24
    Perl製ビルドツール