タグ

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

  • Harriet ー テストのときつかうにデーモンの取扱を簡単にするためのフレームワーク - tokuhirom's blog

    https://github.com/tokuhirom/Harriet/https://metacpan.org/module/TOKUHIROM/Harriet-0.01/lib/Harriet.pmテストのときにつかう mysqld, memcached, stf, groonga あたりのデーモンを、.t 単位で起動していては遅くてかなわない。かといって、あらかじめ起動させておくというのも。。 というわけで prove のプラグインとしてよしなにする、みたいなのをがんばってかく、というような試みがおこなわれてきたわけですが、どうもめんどくさい。 なんか適当にやったらうまくうごく、っていうかんじのカジュアルなツールがほしいな、なんておもったりするわけですよ そこで、Harriet ってのをつくってみました。 なんかこう、t/harriet/mysqld.pl っていうファイル名でこん

    issm
    issm 2016/09/13
  • Xslate の mark_raw は template に書かない - tokuhirom's blog

    Xslate の mark_rawtemplate 側では使わずに、Controller ないし Model で使って欲しい。 ある文字列が、HTML として処理すべきものかどうかは、サーバー側で判断すべき事案であって、マークアップエンジニアが判断すべき事項ではないから、というのが大きい。 「タグがうまく入力できないんですけど」というディレクターからの起票によって、それをマークアップエンジニアがなんとなく TT の | html はずして XSS 大発生! というような事態は、昭和の時代には多発していたという。 そのような惨事を我々は繰り返すべきではない。 歴史に学ばなくてはならない。

  • 乱数と Perl5 にかんする蘊蓄の話 - tokuhirom's blog

    Perlの乱数についてIRCで盛り上がったのでまとめておく。 結論からいうと、srand()はPerl5組み込みのものでよい。乱数の生成はMath::Random::MTがよいとおもう。 Perlのrand()の実装はConfigure時に選べるようだが*1、ふつうはdrand48()がつかわれる。これは下位ビットがまったくランダムでないことで知られるrand(3)よりはましだが、しょせん線形合同法なのでセッションIDなどを作るのには安全ではない。安全な乱数を作るためにtime()やSHA1を混ぜ込んだりするほうほうもよくつかわれるが、そのくらいならはじめからM::R::MTを使ったほうがいいとおもう。 なお、srand()はあれば/dev/urandomを読むので、自前でsrand(time)などとするのはよくない。また、最初にrand()を呼ぶときに自動的に呼ばれるので、ふつうは明示的

    issm
    issm 2014/10/23
    "どこかでrand()してからfork(2)をすると、サブプロセスで乱数系列がすべておなじになってしまうので注意がひつようである"
  • Content-Security-Policy と nonce の話 - tokuhirom's blog

    Content-Security-Policy の nonce を利用すると、XSS の脅威をかなり軽減できます。 そこで、Web Application Framework ではデフォルトで対応したほうがよいのではないか、という旨を @hasegawayosuke さんから教えて頂いたので、実装について考えてみました。 とりあえず CSP の nonce はどういうものなのかを考慮するために、コード例を探していたのですが、実際に動くサンプルというものが nonce 関連のもので見当たりませんでした。 そこで、実際に動くサンプルを用意しました。 https://github.com/tokuhirom/csp-nonce-sample 以下は Sinatra で書かれたサンプルコードです。 require 'sinatra' require 'securerandom' get '/' d

  • Perl 初心者がウェブアプリケーションを書く時に気をつけるべきこと - tokuhirom's blog

    $c->req->param('id') みたいなメソッドは使ってはいけない。これは歴史的経緯から残っているものなので、基的に使わない方がいい。 $c->req->parameters->{id} をかわりに使ってください。 Perl の世界には List コンテキストというものがあって、これがウェブアプリケーションを開発するときには鬼門となります。 +{ id => $c->req->param('id') } のようなコードは、param メソッドはリストコンテキストではすべての id を返すので、 ?id=3&id=hasegawa&id=yosuke というようなクエリが来ている場合、 +{ id => 3, hasegawa => 'yosuke' } のようなデータ構造が作成される。これは明らかに意図していない挙動である。 以下の様にかくのがおすすめです。 my $id =

  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • なぜ Teng は良いものなのか - tokuhirom's blog

    なぜ Teng は良いものなのか、を YAPC で再考させられたのでここにメモしておく。 Teng は自社開発のウェブアプリケーションを作ってる人たちが作っていて、それがうちのニーズにあってるのでいいっていう話であって、どこでもすごい最高!! と主張したいわけではないです。まあ、個人の感想ですね。 ソースが読みやすい ソースがよくモジュール化されていて、読みやすい。自身で書いている部分が多いという贔屓目を抜きにしても読みやすいんじゃないかなーと。 僕らのような自社開発のウェブ屋では、なにか無茶な要望を受けた時にささっと対応するということが求められるシーンが多いので、ソースの読みやすさというのはかなり重要なファクターとなっています。 複雑な SQL を発行できないように機能が制限されている SQL ビルダーを使って JOIN やサブクエリを駆使したウェブアプリケーションを開発してしまうと、運

  • AngularJS を本気でつかうための tips - tokuhirom's blog

    最近、管理画面で AngularJS をつかってみている。 そんな中で、いくつか工夫した点があるのでそれをシェアさせていただきます。 XHR のエラーを表示する XHR のエラーがおきた際のハンドリングをいちいち手でかくのは非効率。管理画面とか中の人しかつかわないので、エラーがおこった旨を随時報告するだけでよい。 そんなケースでは以下のようにする。 angular.module('myapp.exceptionHandler', []) .config(['$httpProvider', function ($httpProvider) { $httpProvider.interceptors.push(function($q, $log, $rootScope) { return { 'responseError': function(response) { $log.error(res

  • Docker で Growthforecast をインストールする方法 - tokuhirom's blog

    ちょいちょい GrowthForecast のインストールが perl だから難しいとかいってる人をみかけるけれど、Dockerfile が用意してあれば、セットアップは簡単になるんじゃないだろうか。 audreyt が Dockerfile で配布する方法で irc logger を配布していたし、それを真似してみるのもアリかもしれない。そんな風におもって僕もやってみることにした。 Docker をつかうと、アプリをふくんだイメージを簡単に配布することが可能となる。インストール手順をごちゃごちゃとブログに書いたりするのもいいけれど、Dockerfile を共有したほうがいいのではないだろうか。再現可能だし。chef でもなんでもいいけど、docker はインストールが簡単なのがいいし、覚えることがすくなくていい。 いらなくなったら、イメージごとポイすればいいだけで、簡単だしね。 さて

  • Check Text-Xslate-2.0010 if you are using Data::Section::Simple with Xslate - tokuhirom's blog

    Text::Xslate 2.0010 contains serious issue fix around 5.18 incompatibility. Perl 5.18+ does not allows "Wide characters" as PerlIO::scalar's input string. It says Strings with code points over 0xFF may not be mapped into in-memory file handles. Older Text::Xslate using PerlIO::scalar for processing vpath. vpath is mostly using with Data::Section::Simple. And so, if you are using Data::Section::Sim

  • Perl5 において chomp() とはなにをするものか - tokuhirom's blog

    えてして、プログラミングにおけるバグの発生源は、使い方をまちがえていることに起因するものも多い。 を電子レンジでかわかす人がいるように。 そもそも chomp() という組み込み関数はなぜ必要なのか。 Perl5 では、データを行単位で処理するということが重視されたインターフェイスになっている。これは一般的なテキスト処理の頻出パターンだからだ。 while (<>) { chomp; say if /foo/; } これは、入力データを行ごとにとりだし、改行をとりのぞき、/foo/ という正規表現にマッチする行だけを表示するというプログラムだ。 Perl5 を知っている人なら、だれもが簡単に理解できる。 ここで $/ という変数が問題となる。$/ は、行の区切りがはいっている特殊なグローバル変数で、awk でいうところの RS にあたるものだ。 この $/ を変更することにより「行」の区

    issm
    issm 2013/12/05
  • Time::Piece::strftime and time zone issue - tokuhirom's blog

    https://rt.cpan.org/Ticket/Display.html?id=75046 This entry is just thinking note. use strict; use warnings; use utf8; use Time::Piece; $ENV{TZ} = 'JST-9'; print gmtime(1363791599)->strftime('%Y-%m-%dT%H:%M:%S%z'), "\n"; print localtime(1363791599)->strftime('%Y-%m-%dT%H:%M:%S%z'), "\n";↓ 2013-03-20T14:59:59+0900 2013-03-20T23:59:59+0900OMG!!!! Why? sub strftime { my $time = shift; my $tzname = $t

  • Xslate と Mouse と Perl 5.20の話 - tokuhirom's blog

    Perl 5.20 で Mouse とか Xslate がおかしいな! ってことになったら、Mouse のバージョンが古くないかを確認しよう。 Mouse の 1.13 より前のバージョンは Perl 5.20 で実行時エラーになる問題がある。 通常はおきないが、 おきるケースがありえる。 具体的には cpanfile に required 'Mouse', '==1.12'; って書いていたり、cpanfile の中身をとか書いてたりするとか、古いバージョン対象でつくった cpanfile.snapshot を carton install --deployment でいれたりすると、Mouse の古いバージョンがはいってしまう。 この状況におちいったときにわかりづらいエラーになるので、今のうちに Mouse のバージョンをあらかじめアップデートしておいてもよいかもしれない。 たぶんこれ

  • OrePAN2 は OrePAN となにがちがうのか - tokuhirom's blog

    OrePAN2 では、モジュールを多めにつかって、コードベースをちいさくしたいとおもって OrePAN を書きかえようとおもったのですが、OrePAN は今すでにつかわれている環境がある上に、いろいろと BK がつまっていて、かきなおすと全部かきなおすかんじになっていて、互換性がうしなわれる可能性が結構あるかんじなので、メジャーバージョンアップとしました。 機能的には以下のような点がかわっていると songmu さんがいっていました。 git repo直接指定でtarball作ってくれてmirrorにしてくれるところまで自動化されているtar ball url から直接 inject できたりもする機能的にはあまりかわっていませんが、使い勝手と documentation が向上しているので、新規につかう場合には OrePAN2 がオススメよ! 【追記】 いまおもいだしたのですが、OreP

  • HTTP::Session2 has been released. - blog.64p.org

    English document is available on metacpan! Following document is written for non-english speakers. HTTP::Session2 を作成した。主に Amon2 で使用することを想定しているが、広く一般につかえるものと思う。 特徴 必要なときに必要なだけ Set-Cookie ヘッダを発行する 必要なときだけストレージにアクセスする クライアントサイドストレージとサーバーサイドストレージの両方をサポート XSRF トークンの管理をセッションライブラリ側に内蔵 AngularJS フレンドリー 上記が、重要なことである。 弊社のようなハイトラフィックなサービスを運営している場合には、できるだけリソースをケチりたいので、そういう思想なものが必要となった。通常の用途では Plack::Session

  • 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 によっ

  • Text::Markdown::Hoedown is really fast! - tokuhirom's blog

    @syohex++ wrote benchmarking script for some markdown parser libraries. Result is here: Rate markdown discount hoedown markdown 126/s -- -99% -99% discount 9491/s 7446% -- -62% hoedown 24682/s 19523% 160% -- Wooooooooo! Text::Markdown::Hoedown is really fast! https://github.com/perl-users-jp/issues/issues/23

  • Amon2 にStandalone フレーバーが追加された - tokuhirom's blog

    Amon2 4.04 から、EXPERIMENTAL ではありますが Standalone フレーバーが追加されました。 これにより、CPAN にすぐあげられる状態のウェブアプリケーションが生成されるようになった、つもりです。 ちょっとまだ荒削りだけど、うごいているので、おためしください。 このモードでつくったアプリケーションはグローバル変数など一切つかってないので、複数を単一プロセスでうごかしても綺麗に動作します。

    issm
    issm 2013/10/03
  • Carton 1.0 リリースによせて - tokuhirom's blog

    http://weblog.bulknews.net/post/57356232719/carton-1-0-is-released Carton 1.0 がリリースされました。おめでとうございます! miyagawa++ というわけで早速手元でうごかしてみたところ、いくつか問題があったので miyagawa さんに修正していただきました。 1.0 リリースまでにためしたいところだったのですが、面倒くさくて無理でした。 今回のアップデートで個人的にいいなーとおもったのは以下のような点です。 carton update が実装された 待望の carton update が実装されております。これにより、あたらしめのバージョンに移行することができますね! carton check が実装された cpanfile に記述されてるけどインストールされてないモジュールを確認できる!! carton.

    issm
    issm 2013/09/20
    carton.lock -> cpanfile.snapshot
  • __DATA__ の何行目をよんでいるかを知りたい - tokuhirom's blog

    DATA からデータをよんでいるときに、今ソースコード全体のうち、何行目をよんでいるかを知りたいというケースがある。 そんな場合は以下のようにすればよいだろう。 #!/usr/bin/env perl use strict; use warnings; use utf8; use 5.010000; use autodie; use Fcntl qw(:seek); my $line_number; my $pos = tell(*DATA); seek DATA, 0, SEEK_SET; read DATA, (my $buf), $pos; $buf =~ s/\n/$line_number++/ge; while (<DATA>) { warn $line_number + $. . " : " . $_; } __DATA__ hoge fuga hige そもそも *DATA

    issm
    issm 2013/09/18