$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を使って軽くテストを書いてみました。 僕はある程度のコーディングのブレは許容して、チーム全員で合意がとれるものだけを自動でチェックする…