タグ

perlに関するpython_spameggsのブックマーク (39)

  • Server::Starterの0.17以下のバージョンでは特定の条件下でHUPを送ってもプロセスが入れ替わらないことがあった - 平常運転

    要約 Server::Starterの0.17以下のバージョン(とStarlet)によって動かしているときに無限ループ等でいつまでも処理の終わらないリクエストが発生すると、アプリケーションプロセスの再起動のためのHUPシグナルをServer::Starterが正しく処理してくれないことがある。 この挙動によってアプリケーションプロセスが古いリビジョンで動かしてしまうなどの問題があって困っていたんだけど、気付いたら0.19でこの挙動が改善していた。 前提 perlでdaemontoolsを用いてアプリケーションプロセスを動かし、かつホットデプロイを実現しようと思ったときの有力な選択肢がServer::Starterによるstart_serverとStarletの組み合わせだと思う。start_serverとStarletは以下のような挙動を示す。 start_serverはHUPを受け取った

    Server::Starterの0.17以下のバージョンでは特定の条件下でHUPを送ってもプロセスが入れ替わらないことがあった - 平常運転
  • Job-Queue Workerの実装を管理するdaemon - 時計を壊せ

    Message Queueとか だいたいみんな、Message QueueとしてGearmanとかQ4MとかResqueとかRabbitMQとかZeroMQとかまあたくさんあるけど、なにかを使っていると思う。 Perlの人だとQudoとかTheSchwartzとかをつかっている人も多いと思う。 でも、preforkなworkerを実装するとなるとSignal処理とかをちゃんとやるのが意外と難しい。 下の2つのスライドを読むと難しいんだなぁという事がなんとなくわかるとおもう。 YAPC 2012 - 続・Mobage を支える技術 Unix Programming with Perl 2 graceful shutdownとかgraceful restartとかは欲しいし、max_reqs_per_child的なこともしたいし、時間が掛かり過ぎているjobはリトライして新しいworkerで処

    Job-Queue Workerの実装を管理するdaemon - 時計を壊せ
  • Starlet 0.24で子プロセスごとに乱数系列が初期化されるようになった - 酒日記 はてな支店

    Perl 5で fork する場合に乱数系列が親と同じになってしまう現象については過去にもいろいろエントリがあります。 乱数と Perl5 にかんする蘊蓄の話 - blog.64p.org #22 カジュアルに乱数を使う方法とその注意点 | tech.kayac.com - KAYAC engineers' blog 0.23以前の Starlet では、親で一度でもどこかで rand (またはsrand) が呼ばれていると、初期化された乱数系列が fork された子プロセスにも引き継がれるため、その後に実際のユーザアプリケーションが走る子プロセス内で rand() しても同じ系列が返ってきてしまう、という現象があったのですが、0.24 では子プロセス生成後に srand() が呼ばれるようになりました。 # 正確にいうと、0.14 で --min-reqs-per-child がサポート

    Starlet 0.24で子プロセスごとに乱数系列が初期化されるようになった - 酒日記 はてな支店
  • KyotoTycoonの更新ログをmemcachedにレプリケーションする ktlog2memcached を書いた - 酒日記 はてな支店

    とある移行案件で必要になったのでえいやと書いた。 github.com/fujiwara/ktlog2memcached 以下の記事にあるように、KyotoTycoonは更新ログを外部から取得することができるので、これを用いてKTへの書き込み内容を別のストレージに反映するようなことができます。 http://fallabs.com/blog-ja/promenade.cgi?id=115 使い方 $ ktremotemgr slave -ts `date +%s000000000` -uw | ktlog2memcached --host 127.0.0.1 --port 11211 [--use-flag]ktremotemgr slave で出力される更新ログを標準入力から流してやると、それをparseして引数で指定された memcached に set, delete, flush_

    KyotoTycoonの更新ログをmemcachedにレプリケーションする ktlog2memcached を書いた - 酒日記 はてな支店
  • Perl 5.19.9 で実装された signatures の構文をためしてみる - tokuhirom's blog

    use 5.019009; use autodie; use feature 'signatures'; no warnings "experimental::signatures"; package Foo { sub new($class, $n) { bless {n=>$n}, $class; } sub bar($class, $a) { $a+3; } sub baz($self, $a) { $self->{n} * $a; } } sub add($left, $right) { return $left + $right; } say add(1,2); say Foo->bar(4); say Foo->new(5)->baz(4); みたいな感じでつかえる。 【追記】 use 5.019009; use feature 'signatures'; no warning

  • perl 5.19.9 の signatures 構文 (普通に引数を書ける構文) を試す | tech - 氾濫原

    Perl 5.19.9 で実装された signatures の構文をためしてみる - tokuhirom blog を見てそんなのできたのか〜と思ったので、いろいろ試してみた。なんとこれは、今までになく直感的に引数が書けてしまう革命的構文です。 use v5.19; use strict; use warnings; use feature 'signatures'; no warnings "experimental::signatures"; use feature 'lexical_subs'; no warnings "experimental::lexical_subs"; # 引数の数チェックをしてくれる。便利 eval { say "check length of arguments"; state sub hello ($foo) { say "hello $foo"; }

  • znc で ignore する perl モジュール書いた

    znc で ignore する perl モジュール書いた "znc ignore" などでググれば cpp のモジュールはヒットするのだけど、自分のしたいことができないやつだったのと、 perl ならなんとかってことで書いた。 package IgnoreSpam; use strict; use warnings; use base 'ZNC::Module'; sub description { "ignore spam" } sub OnChanMsg { my $self = shift; my ($nick, $channel, $message) = @_; if ($self->_is_spam($nick, $channel, $message)) { return $ZNC::HALT; } return $ZNC::CONTINUE; } sub OnChanNoti

    znc で ignore する perl モジュール書いた
  • 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 | おそらくはそれさえも平凡な日々
    python_spameggs
    python_spameggs 2014/02/19
    ためになる。
  • Carton 1.0 にアップグレードするときに PERL_CARTON_PATH を設定している人は気をつけようという話 - tokuhirom's blog

    Carton 1.0 では carton exec が cpanfile.snapshot を読むようになっています。 なので、PERL_CARTON_PATH を設定して carton exec していて、current directory に cpanfile がないような場合には Can't locate cpanfile: (cpanfile) というエラーになって乙る場合があります。 このようなケースをさけるために、PERL_CARTON_PATH を設定している人が 1.0 にあげるときには PERL_CARTON_CPANFILE を設定しておいた方が無難です。 なお、PERL_CARTON_PATH は local/ の位置をあらわし、PERL_CARTON_CPANFILE は、cpanfile の位置をあらわす環境変数となっております。

  • Time::Pieceでadd_monthsするときは月末の扱いに気をつける - すぎゃーんメモ

    現在のTime::Pieceの最新版は、1.27。 翌月は何月か、というのを得るのに #!/usr/bin/env perl use strict; use warnings; use Time::Piece; my $t = localtime; print $t->add_months(1)->mon, "\n"; というコードを書いていて、1月31日に実行したら3が返ってきていてハマった。という話。 Time::Piece::add_monthsで月を操作した結果の日付がその月の月末を超えていると、正規化されて翌月の日付になってしまうようだ。 $ perl -MTime::Piece -E 'say Time::Piece->localtime->ymd' 2014-01-31 $ perl -MTime::Piece -E 'say Time::Piece->localtime->

    Time::Pieceでadd_monthsするときは月末の扱いに気をつける - すぎゃーんメモ
  • C85にて「雅なPerl入門第2版」を頒布します - Subvoice

    直前になりましたが、冬コミ告知です。31日の西ほ07aで「雅なPerl入門第2版」を頒布します。内容は前回のアップデートとなります。オブジェクト指向の章をパッケージとモジュールに分けて、テスト、ファイル入出力、文字エンコーディング、CPANモジュールガイドの章を新設しました。だいたい50ページくらい増えています。 第1章プロローグ 第2章Perlを知ろう 第3章Perlの開発環境を整えよう 第4章スカラー 第5章配列とリスト 第6章ハッシュ 第7章サブルーチン 第8章コンテキスト 第9章正規表現 第10章リファレンス 第11章CPAN 第12章パッケージ 第13章モジュール 第14章オブジェクト指向 第15章テスト 第16章ファイル入出力 第17章文字エンコーディング 第18章CPANモジュールガイド そしてなんと!今回はまかまかさんとの合同スペースになっています!!みなさんぜひ来て下さい

    C85にて「雅なPerl入門第2版」を頒布します - Subvoice
  • CentOSとmod_perlの未来 - Qiita

    こんにちは、mod_perlをこよなく愛用している @xtetsuji です。 みなさん、mod_perl使っていますか?Plack全盛の時代でも、まだレガシープロジェクトであったり、色々な理由でmod_perlを使い続けている方、結構いるんじゃないかと思っています。 「新しいものが良くて古いものが悪い」という考えは置いといて、mod_perlはとてもよく枯れていて実装も一つで安定したPerlの永続的実行環境の一つです。Plackやそれらのエコシステムを使えない現場では今も有力な選択肢の一つではないでしょうか。使用の際に極度にmod_perlにロックオンされないように設計すれば、中長期的な視野も入れた良いアプリケーションがかけると思います。 RHEL7ベータ発表 この記事を書いているのは2013年12月ですが、去る2013年12月11日にRHEL7のベータ版が登場しました。 RHEL 7、

    CentOSとmod_perlの未来 - Qiita
  • Amon2で非同期レスポンスを使う方法と、非同期WebAppのハマりどころ - 時計を壊せ

    この記事はPerl Advent Calendar 2013の15日目の記事です。 Amon2とは @tokuhirom さんが開発しているPerl製のWAF*1です。 Plackを軽くwrapしたような軽量でシンプルなWAFです。 現在、Version 6.00がリリースされていますが、Version 3.50からwebsocketのサポートが入り、 その関係でPSGIの遅延レスポンス/ストリーミングレスポンスのインターフェースに対応しています。 Amon2で非同期レスポンスを使う Amon2::Plugin::Web::Streamingを使う事により非同期でレスポンスを返す事が出来ます。 例えば、index.txを5秒後にrenderして返す場合は以下のようになります。 use strict; use warnings; use utf8; use Amon2::Lite; use

    Amon2で非同期レスポンスを使う方法と、非同期WebAppのハマりどころ - 時計を壊せ
  • 普通のデーモンを 1) Server::Starterでホットデプロイ+ 2) slow-restart対応にする - Qiita

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

    普通のデーモンを 1) Server::Starterでホットデプロイ+ 2) slow-restart対応にする - Qiita
  • Perl, Go, Q4M and Groonga (part 0) : D-7 <altijd in beweging>

    まだ道半ばなんだけど、GroongaをGo+Perlフロントエンドから使うシステムを動かしはじめている。 今回はとりあえず現時点での状態をざっくり書き出してみる。まだ番化はしてないが、とりあえず番環境からデータの挿入・削除ができるところまでつなぎ込みはした。最終的に全面的に番化したらまたまとめ直します。 まずデータを突っ込む部分は慣れもあるのでより素早くデータの整形をしたりテーブルスキーマとかを変更したりするためにPerlでワーカーをさくさくっと書いた。ワーカーはQ4Mでデータを受け取り、データを整形してMroonga経由でデータを挿入。仕組みができたところでGroongaが我々が求めているデータ量をハンドリングできるかどうか検証するために全力で平均1行4KB~10KBくらいのデータをmroonga経由で○億件挿入してみた。この挿入処理中様々な地雷を踏んだので、kazeburoさん

    Perl, Go, Q4M and Groonga (part 0) : D-7 <altijd in beweging>
  • 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
  • Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)

    THE INTERVIEWS がサービス終了ということで、一つだけ消えるには惜しいというか懐かしい記事があったので少し加筆修正して転載します。JHackers でも似たようなことを話してますね。 Perl XS を書くようになったきっかけ、また、どのようにして今のような XS マジシャンになったのか。そのあたりの事をお聞かせください 2000年頃の話です。ぼくはCGIスクリプトでちょっとしたゲームデータの集計サイトをやりたくてプログラミングを覚えたのでした。これがそこそこ重い処理で、次第にもっと高速にしたいと考えるようになりました。一方、当時ぼくはお金もなくVPSも一般的でなかったので、CGIスクリプトしか選択肢はありません。そこで初心者ながらいろいろ調べることにしました。 とりかかったのは行指向のテキストで保存していたデータをSQLiteにすることでした。しかし当時はWindows上で開

    Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)
  • HTTP::Message::PSGIでPSGIアプリのテストを書く - Qiita

    こんばんわ、こう見えてもPerl大好きなhirataraです。 PSGIのテストと言えばPlack::Testがデファクトスタンダードで、他にTest::WWW::Mechanize::PSGIやLWP::Protocol::PSGIを使う人もいると思います。 が、最近自分はテストを書くときにPlack付属のHTTP::Message::PSGIを直接使ってます。こいつはPSGIの入出力とHTTP::(Request|Response)を変換する極薄のラッパーです。 大体以下のような決まり文句で使ってます。 use strict; use warnings; use HTTP::Message::PSGI (); use HTTP::Request::Common qw(GET); use HTTP::Response; use Test::More; my $app = sub { [2

    HTTP::Message::PSGIでPSGIアプリのテストを書く - Qiita
  • Log::StringFormatter でログ文字列のフォーマット - Qiita

    ログが主のかぜぶろです。ログがないと生きて行けません。 ログと言えばLog::Miminalですが、Minimalと言いつつも様々な拡張がなされており、好みの使い方にたどり着くまでに少し時間がかかるようになってしまったなと作者自身うすうす感じております。そこでLog::Minimalがもつ機能を分解し、アプリケーションの開発者にとって使いやすいログモジュール/メソッドを開発者自身で作りやすくしようという狙いのもと作ったのが、Log::StringFormatterです Log::StringFormatterLog::Minimalの文字列の整形部分を切り出して単独のモジュールにしたものです。 使い方 use Log::StringFormatter; use Scalar::Util qw/dualvar/; stringf('foo') -> 'foo' stringf('%s b

    Log::StringFormatter でログ文字列のフォーマット - Qiita
  • Webアプリケーションのテストを書くときに考えていること - 車輪を再発明 / koba04の日記

    テストを書く目的 自分の書いたコードが意図した通りに動いてるか確認するために書くのですが、自分が楽をするためと他の人のために書いてます。 自分が楽するため Webアプリの場合、実装した機能がちゃんと動作するかを確認するために何度もブラウザポチポチしてというのは時間がかかります。なのでその回数をなるべく減らすためにテストとして書けるところはなるべくテストで確認して、ブラウザポチポチする回数を必要最低限にしたいと思っています。 ブラウザポチポチするのも立派なテストだと思っています。再現性のない。 他の人のため テストがないと他の人がその機能に関連する機能を変更しようとした時に変更の影響がないのか確認することが出来ず、その機能に対するテストを手動で行わせてしまうことになってしまいます。 テスト書く時間がない問題 テストの話をすると書く時間がないと言われたりしますが、既存の開発の流れにテスト書くこ

    Webアプリケーションのテストを書くときに考えていること - 車輪を再発明 / koba04の日記