$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

perl

手元開発環境でサーバを起動時のみcronのようにスクリプトを実行する(Perlの場合)

これまでPerlを利用した手元開発環境でどのようにcronを動かすか迷ってきたのだけど、その解決策が見つかったのでメモ。 課題 開発サーバや本番サーバではcronで定期的にスクリプトが実行されている 定期的に実行されているスクリプトが動かないと、正しく動…

Test::Time::AtというCPANモジュールをリリースしました

社内でテスト時の時間操作を便利にするTest::Time::At というモジュールがあったので、それをCPAN化してリリースしました。テスト中の時間を止めて、sleepなどの操作をうまくハンドリングしてくれるモジュールにはTest::Time というモジュールがあります。こ…

TheSchwartzが次に実行するjobをどう見つけるか

TheSchwartzを利用していて、priority周りがどのように機能しているのかよく分からなかったので、軽くコードを読んでみた。TheSchwartzでジョブを一つ実行する一番単純な手段はTheSchwartz->work_onceを一度実行する部分である。またジョブを実行するための…

「Cartonの内部」について社内勉強会で発表した

Perlのバージョン管理ツールであるCartonの内部について、社内勉強会で発表したので、その時の資料をそのまま公開する。けっこう雑に作ってしまったので、正確性については保証できないけど、Cartonのソースコードリーディングの際の参考になればと思う。 ア…

perlの変数のデータ量を測定する

perlの変数のデータ量を調べたいということがあって、何を使ったらいいか調べたんだけど、Devel::Sizeというのが便利そうだった。こんなかんじで使える。 use Devel::Size qw(size total_size); my $size = size([1, 2, 3, 4, 5]); warn $size; my $total_si…

cpanmとインストールするモジュールの走査

今回はcpanmがモジュールの依存の何をインストールしようとするのか分からなくて、それを調べたのでメモ。現状の仕様のみ書いてるのと、全然読めてないので勘違いがあるかもしれない。 どのへんを見ると分かるか 基本的にwant_phasesとか、install_typeとか…

社内Cartonコードリーディング会第二回のメモ

社内Cartonコードリーディング会第一回のメモ - $shibayu36->blog; に引き続き、第二回を開催したので、その時の内容をメモしておきます。そのままメモを公開しただけなのでかなり雑です。間違ってることも多いと思います。 今回の趣旨 今回は、cpanfile.sna…

nginxのproxy設定ファイルも自動テストしよう

最近nginxでリバースプロキシの設定を書いているんだけど、設定のたびに本番に緊張しながら反映していた。さらにその副作用として、nginxのファイルはリファクタリングされないという問題があった。 そこで反映する前にバグ等が見つかるようにnginx設定のテ…

Carp::Replyを使って、モジュールの挙動を追いかける

最近Cartonコードリーディング会をやっているのですが、そのときにCarp::Replyを使ってみたのでメモ。 例えばCartonとかの中身を追いかけるときに、この時点でこの変数はどうなっているのかとか調べたくなることがあります。そういうときにRubyのPryみたいな…

社内Cartonコードリーディング会第一回のメモ

最近社内でCartonを使う機会が増えてきているのですが、そもそもCarton自体が何やってるかちゃんと把握できてなくてハマったりするので、社内有志でコードリーディング会を開催しています。今回は第一回のときに出てきに作ったメモを公開します。そのままメ…

perlであるモジュールがコアモジュールかどうか調べる

調べたい。Module::CoreListが使える。 あるモジュールがいつからコアか $ corelist JSON::PP Data for 2013-08-12 JSON::PP was first released with perl v5.13.9 あるperlでのコアモジュールのversionを知りたい $ corelist -v 5.14.2 JSON::PP JSON::PP …

perlでのgem which相当コマンド

gemにはあるモジュールのファイルがどこに置かれているか知るためのコマンドがある。 $ gem which nokogiri /Users/shibayu36/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.1/lib/nokogiri.rb これってcpanモジュールだとどうすればいいん…

cron周りのベストプラクティス読んだ

WEB+DBのPerl Hackers Hubで書かれていた「cron周りのベストプラクティス」を読んだ。かなり参考になった。経緯としては読みたいって呟いたら感想よろしくと言われたので慌てて読んだ。@shiba_yu36 「読んだ」なら言ってもいい— songmu (@songmu) 2014, 2月 …

#yokohamapm 10に行って来ました

なんとなく気分が乗ったので、Yokohama.pmに参加してきました。今回はプロント貸切状態で発表形式の勉強会をやってて、とにかく貸し切りで料理が出てきたり飲み物出てきたりして、環境はかなり良いなあと思いました。また東京に来る機会そこまで無いので、東…

Test::TCPを使ってテスト用にmemcached, app, nginxサーバを立てる

テストをするときに、テスト用のみのMySQLとかmemcachedとか、アプリケーションサーバとかを立てたい時がある。MySQLの場合はTest::mysqldを利用すればすぐできるが、それ以外の場合もdaemonの場合はTest::TCPを使ってすぐにテスト用のサーバを立てることが…

Perl + Travis CI + Coveralls (PrePANの対応)

CIサービスが結構出てきてる中、自分自身がまだ触ったこと無くて遅れてるなーと思ってたら@shiba_yu36 PrePANとcookbookをそれ系のやつにのせといていいよ。— kentaro (@kentaro) 2014, 2月 11と言われたのでPrePANでTravis CIとCoverallsを使ってみた。こう…

LWP::Protocol::PSGIを使ってAPIを叩くメソッドのテストを書く

テストをするときに外部のAPIを叩く部分のテストを書きたい場合、出来る限り外部にアクセスせずにテストを書きたい。そういう時 Test::Mock::Guardを使って該当部分のメソッドが特定のデータを返すように書き換えてしまう LWP::Protocol::PSGIを使うなど、AP…

PrePANのローカル開発環境を整えやすくしました

id:antipopさんが作ったCPANモジュールのレビューサイトのPrePANですが、https://github.com/CPAN-API/prepan/ で全てOSSとして公開されているので、pull requestを送ってもらえれば機能を追加することが出来ます。とはいえ結構ローカルの開発環境を作るのが…

Cinnamonでtaskの中から別taskを呼べるようにしました

PrePANはCinnamonを使ってdeployしているのですが、毎回デプロイ手順どんなんだっけ... -> config/deploy.plを眺める -> cinnamon production deploy:update web:restart worker:restartだ、という風になっていて辛かったので、特定taskで他のtaskを呼べるよ…

Test::LWP::Mockのindexが変になってしまっていたのが直っていました

正しくインストールされているモジュールがcarton checkに怒られる時 - $shibayu36->blog; 以前このような記事を書いていたのですが、pull reqなどを送ったところ直っていました。 https://github.com/lukec/cpan-test-mock-lwp/pull/1 https://github.com/l…

正しくインストールされているモジュールがcarton checkに怒られる時

今日のcarton進捗情報です。 今日はcarton checkをしてみたら、正しくインストールされているはずなのに、versionがおかしいと怒られてしまったのでその調査をしました。 carton checkで怒られる原因 まずcarton checkをしてみると、 $ carton check Followi…

テストと対応関係

最近のテストで気をつけていることの一つについて書こうと思う。テストを書くときに気をつけていることとして、そのテストが何をテストしているのかという対応関係を明確にしながらテストを書くということを気をつけている。 例えば以下の様なクラスがあると…

本日のcarton化についての会話

twitter上でいろいろ会話したけど忘れるとあれなので、残しておく。carton bundle で mirror を作る運用にすると carton install で snapshot を update した時に必ず実行するようにしないと辛そう。— soh335 (@soh335) 2013, 10月 11@soh335 多分setup用ス…

carton化を進めています

OrePAN的なやり方でモジュール管理していたプロジェクトのcarton化を進めているので、進捗をメモしてみる。 整合性が取れるまでcarton installを進める 現状のモジュールのバージョンを完全に固定したままで、carton installしたらあまりうまく行かなかった…

YAPC::Asia 2013に行きました

最近いろいろあってずっとYAPC::Asia 2013の感想を書けていなかったのだけれど、ようやく落ち着いてきたので書いてみようと思う。 僕は今回は「とにかく他の人と話そう」という気持ちでYAPCに参加した。そもそも京都にいると東京の勉強会とかにもあまり参加…

手元とserverでのperlのversion違いで、carton installでハマった

PrePANでcarton 1.0しようとしていたんだけど、手元ではcarton install出来るのに、サーバ側でcarton install --deploymentしようとしたらうまくいかないという状態になってしまった。いろいろ調べていたら原因が分かったのでメモ。 結果としてcarton側が悪…

carton bundleで出来たvendor/cacheは何で管理するのが良いのだろうか

carton 1.0が出たので、cartonを再度使ってみていた。その中でcarton bundleというコマンドがあって、それによってlocalのvendor/cacheというディレクトリにcpan mirrorが作れるんだけど、これをどうやって管理したら良いのかがいまいち分かっていない。 考…

cpanmとModule::AutoInstallとoptional_feature

今日もcpanmのことについて書きます。 今日は以下の様な状況が起こりました。 verbose付きで手元のcpan mirrorからインストールすると失敗する AUTOINSTALLのoptionや/dev/nullを使って、verboseだけどinteractiveではない特殊なことをしていた PERL_AUTOINS…

cpanmのバージョンは上げましょうという話

とある事情があって古いcpanmに固定して使っている場所があったのだけれど、それによってハマったことがあったのでメモ。詳しいわけではないので、間違ったことを書くかもしれないです。何か間違っていたら指摘していただけると。 cpanmのバージョン1.5くら…

Test::Perl::Criticでコーディング規約をテストする

コーディング規約はあるけれど、レビューの時にチェックするのは大変ということで、とりあえずTest::Perl::Criticを使って軽くテストを書いてみました。 僕はある程度のコーディングのブレは許容して、チーム全員で合意がとれるものだけを自動でチェックする…

perlのメトリクスをjenkinsで可視化する

最近リファクタリングをしたいと思っているんだけど、なかなか大変で後回しにしてしまう。これはいけないと思って、自分達を納得させるために、perlのメトリクスを出し、それをjenkinsで可視化するというのをやってみた。 perlのメトリクス集計 まずperlのメ…

いろいろなツールをplenvに移行した

最近はplenvを使うべきって感じだったんだけど、promptとかemacsとかを対応させるのがちょっと面倒でサボっていた。そろそろやばいと思ったので全部plenvに移行した。 インストール macだったらbrewで提供されているので入れる。https://github.com/tokuhiro…

Xslateのpre_process_handlerを使ってCSSのインライン化をする

この前 XslateのテンプレートをCSSインライン化する - $shibayu36->blog;という記事をかいたのだけど、その時にgfxさんにコメントで gfx BKっぽい気もしますが他にいい方法は思いつかないし、最近 pre_process_handler という機能も足したので、まあ許容範囲…

XslateのテンプレートをCSSインライン化する

HTMLメールを送信する時、クライアントによってはlinkでのcss指定やstyleタグを解釈しない場合があります。その場合、CSSをHTML要素にインライン化しないといけないのですが、今回はこのことについて書いてみます。 CSS::Inlinerを使う perlにはCSS::Inliner…

Test::Moreのsubtestで困っていること

最近はperlでテスト書く時はTest::Classを使うようにしている。その理由の一つとして、subtestだけのテストだと少しだけ困ることがあるからだ。具体的には以下の事がある。 subtestは書かれている順に実行されるため、前のテストの状態に依存したコードが書…

Kyoto.pm 05 Tech Talksを開催し、イベント開催の面倒を減らすというLTをしました

Kyoto.pm 05 Tech Talksを開催しました! #kyotopm - kyotopm's blogKyoto.pm 05 Tech Talksを開催しました。今回は色々な方が参加してくれて、30人以上参加者が集まりました。発表者も結構集まって良かったです。 発表 僕自身は「イベント開催が面倒」とい…

Harrietを使ってprove単位でmysqldを作ってみた話

Harriet ー テストのときつかうにデーモンの取扱を簡単にするためのフレームワーク - tokuhirom's blog. を見て、これ便利だなーと思ったので、試しにこれを使ってprove単位でTest::mysqldを起動するやつを作ってみた。 harriet用設定を作る まずt/harriet/m…

処理のtimeoutを簡単に書くためのSub::Timeoutというモジュールを作りました

ある処理をするときに一定以上の時間かかったらtimeoutして処理を終わりたいみたいなことをしたい時がたまにあるので、それを行うSub::Timeoutというモジュールを作りました。https://github.com/shibayu36/p5-Sub-Timeout 使い方 use Sub::Timeout; use HTT…

Dist::Maker::FromProjectというのを作りました

最近インターンや研修用にフレームワークを作っています。出来るだけコードを読んで学習してもらうというのを重視して、今回のフレームワークはコードジェネレータでプロジェクトの雛形を作り、その中にフレームワークのコードも含まれるようにしています。…

perlで改行など特殊文字が含まれるものをDumpする時は

最近テストをしていて、全く同じ文字列に見えるのに、テストが通らないという事例がありました。今回は\tとか\rとか特殊文字が入っていて文字列が一致しないという事例でした。特殊文字とかを見える形でするのはどうすればいいのだろうと思っていたら、Data:…

shipped Cinnamon 0.22

Cinnamonの出力のハンドリングに問題があったようなので、それを修正した0.22をshipitしました。具体的にはhttp://blog.1q77.com/2013/05/cinnamon-remote-cr/ で指摘されている内容で、それの変更としてpullreqをもらえたので、mergeしてリリースしました。…

HTML::Parserを使って特定タグの属性を置き換える

最近、imgタグのsrcだけ書き換えたいという事例が発生したので、HTML::Parserを使ってやってみた。 サンプル 例えばサンプルとして以下のコード。 package HTML::Converter; use utf8; use strict; use warnings; use parent qw(HTML::Parser); # HTMLのimg …

CinnamonをMinilla管理にした

Minillaが流行っていたので、僕もCinnamonをMinillaに対応させてみました。とりあえず $ cpanm Minilla 次にCinnamonのdirectoryにいって、migrate。 $ cd cinnamon $ minil migrate Cannot retrieve 'abstract' from /Users/shibayu36/development/myprojec…

ペパボとカヤックに遊びに行ってきました & Cinnamonの検証について発表しました

金曜日にペパボとカヤックに遊びに行って来ました。 ペパボ 昼ごろにペパボに遊びに行ってantipopさんに案内してもらいました。食堂みたいなのがあってそこで昼食を食べた後、オフィスに少しだけお邪魔しました。ちょうど開発の方々がお話をしていたので、少…

Cinnamonにmax_concurrency設定をつけました

並列化に伴い、タスクごとの最大並列数を設定できるようにしました。以下のように設定すると、updateは全hosts並列で動き、restartは1並列、server:setupは最大2並列で動くようになります。 use Cinnamon::DSL; set max_concurrency => { restart => 1, 'ser…

QA Hackathon at Tokyoに参加してPrePANとCinnamonの開発をしました

QA Hackathonが東京であったので、PrePANとCinnamonの開発をしてきました。 PrePAN id:antipopさんと相談して、とにかくレビューをちゃんとしてもらわないと話にならないから、コメントがついたりしたらアプリケーションの通知と一緒に、メールでも通知しよ…

CPANモジュールに含まれるファイルについて調べた

おそらくはそれさえも平凡な日々: CPANモジュールのパッケージングの歴史 の話を見ていて、興味が湧いたというのと、CPANモジュールを作ってもそういうところは無視してしまっていたので、これは良くないと思い少しだけ調べた。 lib, bin, t, xt README, Cha…

perlでforkしたプロセスとの通信を簡単に行う方法が知りたい

今作っているもので、「forkした後、子プロセスの実行の結果を最後に親プロセスに通知し、親プロセスは子プロセス群の状態をまとめて取得する」、ということがやりたいのですが、モダンかつ簡単な方法って何があるんでしょうか?具体的には use Parallel::Fo…

Kyoto.pm 04 Hackathonを開催します

最近開催していなかったKyoto.pmですが、なにか物を作りたい気分になってきたので、株式会社はてなのセミナールームでハッカソンを開催します。 今回のテーマは「Webアプリ」にしようと思います。ただし名目なので、Perlに関して好き勝手に何か作る軽い感じ…

DBIのプレースホルダーで起こった謎な挙動

先日DBIを使っていて、謎な挙動に遭遇したので書いてみる。LIMIT, OFFSET句でプレースホルダーを用いた時に起こった。DBI + DBD::mysqlを使っていた。 DBI: 1.616 DBD::mysql: 4.022 LIMITとOFFSETを両方にプレースホルダーを使う LIMITとOFFSETを両方を?に…