タグ

perlに関するsoh335のブックマーク (468)

  • Internals::SvREADONLY() はオススメできない - stfuawsc

    Immutable な hashref, arrayref たまに欲しくなりますが Internals::SvREADONLY() はクセが強すぎてあまりオススメできないです。 たとえ次のコードの挙動を言い当てられたとしても、赤の他人(≒ 半年後の自分)が見た時に分かるかどうかは怪しいかと。 use strict; use warnings; use Data::Lock 'dlock'; my $foo = { bar => "baz" }; dlock($foo); eval { my $b = $foo->{b} }; if ($@) { warn "oops: $@"; } else { warn "yay"; } 謎めいたランタイムエラー起こすよりも定数は全部サブルーチンとして記述してあった方がコンパイルに失敗してくれて嬉しい感じがします。 ちなみにConst::Commonとい

    soh335
    soh335 2014/04/21
  • Carton考2014 | おそらくはそれさえも平凡な日々

    こうするのがいいかなーと思ってる。経緯は端折って大枠だけ。Webアプリケーションプロジェクトの場合です。 cpanfileちゃんと書いてコミット 今やどこでもやってますね。scan-prereqs-cpanfileも便利です。 開発者は各自carton installでモジュールをインストール。プロジェクトごとにPerlをビルドしたりしてる場合は、cpanm --installdeps .でも別に良い。 CI環境でcpanfile.snapshotを作る CI環境は必ず以下のとおりとする。 番環境と同じアーキテクチャ 番環境と同じバージョンのPerl まっさらな状態(Globalに何のモジュールも入っていない) CIにcarton installもさせて、必要なモジュールをlocal/に入れてテストさせる。毎回サラからcarton installしてたら時間かかるので、git pull

    Carton考2014 | おそらくはそれさえも平凡な日々
  • [q][perl] fork したプロセスで Data::Section::Simple::get_data_section すると読み込みに失敗することがある? | いわぶろ(ろてん)

    soh335
    soh335 2014/02/06
  • Class::C3::Componentised Source Code Reading - 日向夏特殊応援部隊

    DBIC関連の基底クラスとも言えるモジュールがClass::C3::Componentisedです。 C3ベースのコンポーネント化されたクラスモジュールを作る際のベースですね。 1.0003をテキストとします。 load_components() sub load_components { my $class = shift; my $base = $class->component_base_class; my @comp = map { /^\+(.*)$/ ? $1 : "${base}::$_" } grep { $_ !~ /^#/ } @_; $class->_load_components(@comp); } component_base_classってのはSynopsisにもありますが、基的には決めうちの何か。例えばDBIx::Classとかって言う文字列を返す。 loa

    Class::C3::Componentised Source Code Reading - 日向夏特殊応援部隊
    soh335
    soh335 2014/01/28
  • Writing a prefork server / daemon using Parallel::Prefork - Articles Advent Calendar 2010 English

    Parallel::Prefork is a module I wrote back in the year 2008, which is basically an imitation of the excellent Parallel::ForkManager but with support for signal handling, an indispensable feature if you want to write a network server or a daemon program with features like graceful shutdown or runtime reconfiguration. The code below illustrates the basic usage of Parallel::Prefork. Upon the intantia

    soh335
    soh335 2013/12/25
  • How to manage Gearman worker processes. - tokuhirom's blog

    http://www.pqpq.de/mt/2010/01/gearmandriver.html ^^ I don't like this approach. Gearman のワーカーの管理はこういう風にするのが個人的にはおすすめ。 make workers as prefork model by Parallel::PreforkMaxRequetsPerChild(such as same name configuration in Apache) is requireduse daemontools for your lazinessGearman::Driver is too heavy framwork for me. (and, workers should save the memory, but Gearman::Driver itself uses too much m

  • 普通のデーモンを 1) Server::Starterでホットデプロイ+ 2) slow-restart対応にする - Qiita

    序章 最近筆者があるシステム上の非同期ワーカーに対して作業していたところ、新しいコードをデプロイしてこのプロセス達を再起動すると全てのワーカーが同じタイミングで停止→再起動してしまうのでアラートがちらほら流れてきました。クリティカルなものではないのですが、アラートはうざいです。さらに開発機では何回か失敗もしたのですが、その失敗のせいでワーカーが起動に失敗することもありました。その間は当然ワーカー機能は止まったままです。 アラートはできればみたくないのです。さらに万が一新しいコードが起動に失敗した場合でも前の世代が動いていればこのあたりの心配をする必要がなくなります自分がそのあたりに手を入れるタイミングでServer::Starterをかまして対処してしまうことにしました。 元のワーカー まず前提として、このワーカー達は以下のような形で「実行するワーカーのコマンド名(実際はクラス名)」と「い

    普通のデーモンを 1) Server::Starterでホットデプロイ+ 2) slow-restart対応にする - Qiita
    soh335
    soh335 2013/12/25
  • fork時のrand()の挙動 - walf443's blog

    perlでforkしたときに、srand呼ばないと親プロセスとseedの値が同じになってしまうので、子プロセスの間でrand値が変わらなくてハマる、という経験があったのだけど、rubyの場合だとそのようなことはないようだ。 # perl use strict; use warnings; warn rand(); for ( 1..10 ) { fork() or next; warn "$$: " . rand(); exit; } wait() for (1..10); # ruby rand() 10.times do Process.fork do p [$$, rand()] end end Process.waitall 実行結果はこのような感じ $ perl hoge.pl 0.272763864210905 at hoge.pl line 4. 61802: 0.10760

    fork時のrand()の挙動 - walf443's blog
    soh335
    soh335 2013/12/24
  • #22 カジュアルに乱数を使う方法とその注意点 - KAYAC engineers' blog

    この記事はtech.kayac.com Advent Calendar 2012の22日目です。 @songmuです。ゲーム作ったりしてると、乱数が必要になってきますがそれについて書きます。 多くの人にとっては当たり前の話も多く出てくるかと思いますがご容赦ください。間違ってる記述があった場合は突っ込みください。 擬似乱数とは何か 計算機は単体では厳密な意味での乱数を生成することができません。実際には一様に分布する乱数の集合を算術的に求めている場合がほとんどです。 その乱数の集合は以下を満たす必要がありますが、そういう小難しいことは偉い人に任せて、巨人の肩に乗って解決してしまえば良いでしょう。 偏りがなく一様に分布している 途中の出力から未来が予測しづらい 高速に算出できるか つまり? 色々な疑似乱数生成法がありますが、多くの場合、 馬鹿でかい乱数の循環リストがある と考えるとわかりやすいで

    #22 カジュアルに乱数を使う方法とその注意点 - KAYAC engineers' blog
    soh335
    soh335 2013/12/24
  • Shipped ARGV::JSON 0.01 - 詩と創作・思索のひろば

    English entry is here. ARGV::JSON というモジュールをリリースいたしました。Perl では <> という特殊な演算子で、プログラム引数として与えられたファイルやら標準入力やらをよしなに読み込むことができます(デフォルトだと行ごと)が、この ARGV::JSON を use しておくと、<> から 1 行読み込む代わりに、パースされた JSON データが返ってくるようになります。 実例を見ると明らかでしょう: % curl -s https://api.github.com/users/motemen | perl -MARGV::JSON -E 'say <>->{blog}' http://motemen.github.io/ jq のようなことが Perl でもできますね! perl のワンライナーで便利な -n や -p といったオプションも <> を

    Shipped ARGV::JSON 0.01 - 詩と創作・思索のひろば
    soh335
    soh335 2013/12/18
  • Twiggy::Prefork をリリースしました - blog.nomadscafe.jp

    だいぶ以前 Plack::Server::AnyEvent::Prefork というのを書いて某所で使っていたのですが、ここ数日で事例がもうひとつ増えたついでに Twiggy ベースに書き直してCPANリリースしました。 https://metacpan.org/module/Twiggy::Prefork 使うには、 $ plackup -s Twiggy::Prefork -a app.psgi な感じで、Server::Starterにも対応しているので、 $ start_server --port 5000 -- plackup -s Twiggy::Prefork -a app.psgi とすれば、hot-deployも可能です。 起動オプションは、Twiggyがサポートしているオプションに加えて、 —max-workers preforkするworker数 —max-reqs-

    soh335
    soh335 2013/12/16
  • HTTPクライアントとStream::Bufferedの合わせ技 - Qiita

    鼻が詰まって困ってます LWPやFurlを使ってインターネットから様々なファイルをダウンロードする。よくやりますよね。その際に大きなファイルをGETしてしまい、perlのプロセスがメモリを大量に使い、OOM Killerに殺されて2年経つ、なんて経験をした人もきっと多いはず。 そこで使うのがレスポンスをファイルに書き出す技。Furlであれば my $furl = Furl->new(); open my $fh, '>', $filename; $furl->request( url => 'http://example.com/4k.jpg', write_file => $fh ); my $size = -s $fh; seek($fh, 0, 0); と書けて、$filenameのファイルに大きな画像データが保存されます。 しかし、取得対象とするデータが、大きなファイルから小さいフ

    HTTPクライアントとStream::Bufferedの合わせ技 - Qiita
    soh335
    soh335 2013/12/04
  • Why HTTP::Tiny?

    I’ve recently been collaborating with Christian Hansen on HTTP::Tiny, a minimalist, HTTP/1.1 client library for Perl. For basic web client tasks like grabbing a single page or mirroring a file, it does the job in a fraction of the code that would be needed to install LWP::UserAgent. Because it has no non-core dependencies, it is ideal for what I need to get CPAN.pm to bootstrap itself with pure Pe

    Why HTTP::Tiny?
    soh335
    soh335 2013/11/25
  • http://dl.dropboxusercontent.com/u/224433/plackcon/index.html

    http://dl.dropboxusercontent.com/u/224433/plackcon/index.html
  • より高速なテスト環境を実現するために - Route54

    テストを書くことは良い事です。どんどん書いて品質を上げたいところではありますが、テストの数が数万〜数十万に及ぶようなプロジェクトでは、フルテストに要する時間が無視できない程膨れ上がってしまいます。 今回は、そんな増えすぎたテストコードの影響でフルテストに時間がかかっているプロジェクトのために、テスト高速化を実現するためのモジュールとその使い方について紹介したいと思います。 モジュールは、App::Ikarosというもので、現在version 0.02がリリースされています。 使い方等はここにまとめてあるので(随時更新する予定)、この記事ではどのようなことができるモジュールなのかをざっと説明しようと思います。 まず、ざっくりとですがApp::Ikarosが提供する機能には以下の様なものがあります。 多数のノードによる分散テスト実行 forkproveによるテスト実行の高速化 Devel::C

    より高速なテスト環境を実現するために - Route54
    soh335
    soh335 2013/11/20
    すごい..........
  • いい感じに出力をインデントしてくれるモジュール #perl - 詩と創作・思索のひろば

    [2013-11-20: Print::IndentedがCPANになくてしょんぼりしている。 とのことで shipit いたしました。 あざーす!] 過去のよく分からないコードの挙動を把握したいときには print (warn) するのが少なくともとりあえずの方法としては常套手段ですが、これがただ平坦に画面に現れるだけだと見づらい。例えば条件分岐やループの中にいる時は出力をインデントするようにすると動きが掴みやすくなるけれど、ただでさえ人間に単純労働を課す print デバッグにそこまで労力を使うのは辛い。そういう面倒さを減らそうという動機で、このモジュールは書かれました。 https://github.com/motemen/perl5-Print-Indented 一体何をするのかというと今書いた通りですが、print 時に、その print 関数の呼び出しコードのインデントに応じて

    いい感じに出力をインデントしてくれるモジュール #perl - 詩と創作・思索のひろば
    soh335
    soh335 2013/11/19
  • packageごとのメモリ使用量(と増分)を確認できる Plack::Middleware::MemoryUsage - (ひ)メモ

    packageごとのメモリ使用量とリクエストを処理する前後の増分を確認できるPlack::Middlewareを作りました。 時間が経つとぶくぶく太るプロセスがいるときに、犯人特定の助けになると思います。 https://github.com/hirose31/Plack-Middleware-MemoryUsage 要、B::TerseSizeB::Size2::Terse, Devel::Symdumpです。 新しめ(5.10以降?)のPerlでB::TerseSize (B::Size)がエラーになってインストールできないときは、 https://github.com/gfx/p5-B-Size-patched のを入れてください。 https://metacpan.org/module/B::Size2 を入れてください。 使い方は、 use Plack::Builder; bui

    packageごとのメモリ使用量(と増分)を確認できる Plack::Middleware::MemoryUsage - (ひ)メモ
    soh335
    soh335 2013/11/19
  • Perl5 において chomp() とはなにをするものか - tokuhirom's blog

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

    soh335
    soh335 2013/11/18
  • chomp() は $/ に依存していると知れ! - Islands in the byte stream

    perldocにあるように、chomp()の挙動は $/ に依存します。ということは、うっかり local $/ したスコープで chomp() を行うと、何もおきません。 この結果起きる現象がきわめて不可解なので、readlineの直後以外の場面ではchomp()を使わず s/\r?\n\z//xms するのが無難でしょう*1。 use strict; use warnings; local $/; my $s = "Hello\n"; chomp $s; print "[$s]\n"; # => #[Hello #] Xslateがまさにこれにはまっていたので修正しました。 https://github.com/xslate/p5-Text-Xslate/commit/92c7387b0f0ebdad5761c420a54564b9e8d2f635 [追記] *1:はてブのコメントをう

    chomp() は $/ に依存していると知れ! - Islands in the byte stream
    soh335
    soh335 2013/11/16
  • perlのデバッグビルド - (ひ)メモ

    perlの配布物の中にあるINSTALLの"Building a debugging perl"セクションにある通り、-DDEBUGGING=ナニガシを指定すればよい。 http://perl5.git.perl.org/perl.git/blob_plain/HEAD:/INSTALL 指定する値によって、 "perl internal debugging code"とデバッグシンボルの両方が有効になったもの (-DDEBUGGINGもしくは-DDEBUGGING=both) デバッグシンボルが有効になったもの (-DDEBUGGING=-g) とできあがるperlが異なる。 "perl internal debugging code"を有効にすると、"much, much more slowly"になるとINSTALLには書かれている。 Note that a perl built w

    perlのデバッグビルド - (ひ)メモ
    soh335
    soh335 2013/10/22