Category Archives: perl

LWP::UserAgentのSSL_Versionについてのメモ

1
Filed under perl
Tagged as , , ,

とある案件でBusiness::Paypal::NVPが使われてるものがあって、
Paypalさんが、「POODLE SSL 3.0の脆弱性」の対応のために、TLSだけに制限しますよっていうのを
言ってて、ちょっと確認したけどわかりにくかったので、メモしておきます。

POODLE SSL 3.0の脆弱性

Business::Paypal::NVPの中身をみるとLWP::UserAgentを使ってるんだけど
特に流れのなかで、SSL_version(SSL2.0, SSL3.0, TLSv1, TLSv1.1, TLSv1.2)等を指定してそうになかったので、
デフォルトの挙動を調べてみた。

LWP::UserAgentでhttps通信する場合、IO::Socket::SSLのSSL_versionに依存してくるようだけど、
podのSSL_version」の項目をみてみると、以下のように書いてある。

「’SSLv23′ uses a handshake compatible with SSL2.0, SSL3.0 and TLS1.x」
・SSLv23という指定だと、SSL2.0とSSL3.0とTLS1.xが使えるぞ

「The default SSL_version is ‘SSLv23:!SSLv3:!SSLv2′」
・デフォルトの指定は、SSLv23が入っている。

ということで、SSLv23という指定だけども、TLS1.xはdefault状態で使えるということっぽい。
まぎらわしい感じするけど、そういうことらしい。

メモ:cpanm git:// 使うならgitのバージョンに注意

2
Filed under perl
Tagged as , ,

こんにちは。
今日も無駄に時間をつかったお話です。

先日のYAPCでYappoさんが発表されてました Ksgkを入れるべく
cpanmをしたら、なぜかcloneできずにエラーという問題にぶちあたりました。

環境としては、Mac上のVMwareで動いているCentOSです。


$cpanm -nL local git://github.com/yappo/p5-Ksgk.git
Cloning git://github.com/yappo/p5-Ksgk.git ... FAIL
! Failed cloning git repository git://github.com/yappo/p5-Ksgk.git
! Couldn't find module or a distribution git://github.com/yappo/p5-Ksgk.git

【結論】
結論ファーストでいうと、gitのバージョンが、古かったため、
最新版にあげたら回避できたという話です。

【経緯・内容】
gitがおかしいのかなと思って確認した以下のgitコマンドは問題なく処理できました。


$ git clone git://github.com/yappo/p5-Ksgk.git

じゃあ、cpanmコマンドがおかしいのかなと思って、以下を試すも問題なし。

$ cpanm Log::Minimal

gitもcpanmも問題なさそうだ。
次に考えられるのは、cpanm + git:// だと問題がでるんじゃないか。
以下の感じで別のgithub上のコードを取り込もうとしたところ、
こちらも同じエラーがでました。


$ cpanm -nL git://github.com/****

これで、cpanm + git://だと問題がでるというのが確定した。
この時点で、ホスト側のMacでは、cpanm + git://でも問題なくできて、
perlもcpanmも Mac, CentOS両方とも同じバージョンで詰んだ感じしてました。
そもそもVMwareがNatだから何か引っかかってるのかなとか 
どんどん道を外れていったときに、
@dayflower師が 「gitのバージョンじゃね」と一言で解決してくれました。
ありがたや。

ちなみにMac上のgitが、git –versionでみると、「git version 1.7.12.4 (Apple Git-37)」
VM上のCent上のgitが、「git version 1.5.2.1」
とりあえずgitのバージョンあげて、問題回避できました。

というお話でした。

YAPC::Asia Tokyo 2013に行ってきた

13
Filed under perl, 未分類
Tagged as , ,

前夜祭 : 2013-09-19


今年は前夜祭から行ってきました。

個人的などうでもいい話

まず、チェックイン時、後にLTで発表のあったアプリのバグでQRコードがでなくて
四苦八苦するという苦行を経験して、早くも致命傷状態
twitterアカウント名を伝えてどうにかチェックイン。

LT-thon

仕切り直して、今年の前夜祭は、LT-thonという事でした。
で、とりあえず前夜祭で一番hitしたのは、同僚であるdameninngenn先生のLTにあった
HTML::Validate::Structure::Simpleですね。

某サービス関連でhtmlの閉じタグ忘れる事があるから、合間にタグ忘れチェックつけてと
ディレクターさんに言われてた訳ですが、優先度低いから心の奥底にしまってたわけです。

そんな時に、この話聞いて、タスクを思い出したし、これ通せば、サクサクや!と言う事で、
LT-Thon聞きながら試してみて、昨日手元の開発環境で導入してみた。
欲しいものズバリすぎて、楽できすぎた。 dameninngenn++すぎる。

他にも色々有用な話が沢山ありました。
しかも、アルコールがタダで飲めちゃうなんて、なんてすばらしいんでしょう。

Day1 : 2013-09-20


個人的などうでもいい話

いつも11時近くに出社するような人間にとって、10時開始という事で、
かなり気張っていたのですが、なんだかんだで遅くなってしまったと家を出ました。

で、現地についたのが、9時15分くらいだったかな。
ここで自分の頭の中では、9時開始だと脳内変換が勝手に行われて
@941さんのオープニングみれなかったな。。と悲しい思いになりながら、
メインホールに移動しようとしたら、@lestrratさんに止められて、
まだ開場前ですよ!と言われて、やっと時間が脳内変換されてる事に気づいた
超恥ずかしかった。。。
という、どうでもいい話もありつつ、オープニングを無事に見れました。

PSGI/Plack・Monocerosで学ぶハイパフォーマンスWebアプリケーションサーバの作り方

まずは、同僚のkazeburo先生の
「PSGI/Plack・Monocerosで学ぶハイパフォーマンスWebアプリケーションサーバの作り方」

パッと思い出せる範囲で、
・Monocerosを作ろうと考えた背景や実際にどういった差別化をしたのか、どうやって使うのかがわかりやすかった。
・Starlet, Starman, Twiggy等と比較してMonocerosがどうなのかあたりもまとまってて、何を選んだらいいか悩んでる人には参考になると思った。

あとは、
・システムコールを減らそう
・ボトルネック調査には、Devel::NYProfとか、straceを使ったらいいですよ

などなど、色々と為になる事が沢山出てきた。
色々忘れてるから、あとでslide shareで振り返ろう。
(もっといいこと沢山言ってるのにそれだけしか書けないのかと椅子が飛んでくるかもしれない。。)

Perl and Riak – 分散データストア Riak を Perl から “爆速” で使うために -

FreakOutのmyfinderさんによるRiakをperlで使う方法のお話。
・[Tokyo|Kyoto][Tyrant|Tycoon]をPerlかつCache::Memcached::Fastから利用しているがスケーラビリティが課題。
・色々と試したけどdicornだとmemcached protocolでRiakとやり取りできるのでCache::Memcached::Fastがそのまま使える
ちょっと端折りすぎたけど、そんな感じなのかな

スポンサー企業ランチセッション A,B

で、お待ちかねのランチタイムです。
今回は、スポンサー企業によるランチセッションが行われ、それに参加すると、
1,200円相当のお弁当がもらえるというではありませんか。ばっちり参加ですね。
お肉メインで、以下の感じ。
YAPC::Asia 2013 Day1 ランチセッション

ランチセッションは、MTで有名なSixApartさんとMicrosoftさんでした。
SixApartさんのセッションでは同僚(一応名前は伏せておこう)が、
仕様変更により、exportデータに変更がありますかって聞いてて
仕事に直結する内容聞いてたので、さすがだなと思った。

Windows Azureは、twitterでも書いたけど、AWSでも同じだけど
公式でPerlだけ対象外にされてるあたりが、かなり悲しい感じだし、
Perlの祭典でLLでperlだけ?ってくらいの除外状態でのセッションは
かなり強いハートが求められる仕事だなって思った。

その後も何個か見たけど、Day1だけで終わりそうだから、この辺にしとく。

Day2 : 2013-09-21


はてなのイマドキの開発フロー

今のはてなブログの開発フローについてのセッション。
・GitHub Enterpriseを利用して、Pull RequestとIssueで進めていく
・属人化を防ぐために、おみくじで担当きめてる。
・ランチ後はレビュータイムを設けている。
・テスト(casperJS)、CI(jenkins)
・リリースタイミングを計画リリース(外部案件等の固定日)、定期リリース(毎週水曜日)とする事でリズムができる。
mysqldiffで本番、開発環境等のスキーマ差分をチェックする
mysqldiffみたいのはやろうと思った事あったけど、やってなかったから、必要そうならこれ使うのはありそう。

スポンサー企業ランチセッションC,D

二日目は、魚を中心としたお弁当でした。こちらも美味しかったです。
YAPC::Asia Day2お弁当

で、今回は、LINEさんと2回目の登場のSix Apartさんでした。
LINEさんは、福利厚生のマッサージが戻ってくるらしいとtweetしたら、数人釣れた。
LINE株式会社では、一緒に働いてくれる方を募集しております! よろしければ、こちらまで。
知り合いの方は、私まで連絡頂いてもいいですよ! コネ入社できる権力は持ち合わせておりませんが!

YAPC::Asia Tokyo 2013 特別座談会 「Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜

RubyとPerlの戦いかと思ったら、全然大人な感じで、進んでいて、とりあえずtDiaryのパワーを感じた

関連する組織とは関係ない個人的見解としては、
結局、どちらの言語がっていう話をしたところで、ある一定レベルを超えたエンジニアであれば、
言語問わず使える人多そうだし、単純に用途に適したものであったり、使い慣れてるものを使うベースで、
他の言語からいいところを取り入れる事をかねて、たまに使ってない言語も使うっていう感じなのかなと思った

本当にあったレガシーな話

・livedoorBlogをmod_perlからpsgiに変更した際のお話
・psgi,cpanfile,cartonとどんどん近代化
・mount()は多用すると遅くなります。多用してはいけません!というお話
・svc -h でLAが大幅にあがったので、0.5秒おきに1プロセス毎あげさげされるようにして回避
他にも色々 livedoorBlogが近代化していくにあたって苦労、工夫、変更した内容が盛りだくさん
物理的(席)にも、担当サービス的にも近い場所で見てきた事だけど、あそこまで急速な近代化できるとか@lestrratさん凄い

フルテストも50msで終わらせたい 〜 FreakOutの取り組み 〜

かなり端折ってメモしとくと、
・テストの実行順番は、シャッフルするようにしましょう。順番に依存したテストがあると本当のテストにならない。
・テストを分散実行させる。
1日目の話も含めると今回のmyfinderさんの内容は、「スケール」にスポットがあたってる感じがした

Keynote

ikebeさんが話されていた内容で
1個思い当たる事があったので、記憶が少し違うかもしれないけど、メモ。

「perlが使えないとしても、他の何かの言語を使ってる人だったら、perlも使えるようになると思うので、
 その事で、採用面接をしないということはありません。」

というようなお話をされていたと思うのですが、まさに自分がそうだなと思って聞いてました
そもそも入社時は、perlは、ほんの少しだけ数行のコード書くだけだったくらいでしたが、
結果、採用してもらえました。かといって、今perl書けます!とは言いがたい実力で恐縮ですが。。

ということで、LINE株式会社では、一緒に働いてくれる方を募集しております!
知り合いの方は、私まで連絡頂いてもいいですよ! コネ入社できる権力は持ち合わせておりませんが!

クロージング

なんといっても、YAPC::Asiaを企画・運営されていた @lestrratさん @941さんの卒業ですね。
本当におつかれさまでした。

若い人に託すというメッセージ、世代交代の波から察するに、
@lestrratさんも@941さんもお子さんが生まれたというところで、
たぶんお二人のお子さんが来年から企画・運営するという流れかもしれませんね!
乞うご期待ってやつですね たぶん

あとがき

とりあえずいえるのは、かなり端折って書いたつもりだし、見たけど書いてないセッションもあるわけだけど
久しぶりのブログ投稿なのに、凄く長い文章になってしまった。

そして、かなり同僚にスポットを当てすぎた構成になってしまった気がする。

といっても、たぶん 最初から最後まで読む人は、いても1人とか2人とかだろう。むしろ誰もいないかもしれない。
もっというと、閲覧数0かもしれないから、気にしないでおこう。
単純な自己満足なメモということにしておこう。

Parallel::Preforkで「cannot start another process while you are in child process」

1
Filed under perl
Tagged as , ,

今日は、perlのParallel::Prefork(Parallel/Prefork.pm)で出たエラーについてメモ。
結論からいうと、今回のパターンは、Parallel::Preforkのバージョンと組み方の問題でした。
(※あくまでエラーメッセージの条件説明じゃなく、こんなパターンで出る場合があるよという感じで見てください)

では、簡単なテストスクリプトを書いてみます。

#!/usr/local/bin/env perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/Parallel-Prefork-0.08/lib/";
use Parallel::Prefork;

my $pm = Parallel::Prefork->new({
        max_workers => 2,
        trap_signals => {
            TERM => 'TERM',
        },
    });

while ($pm->signal_received ne 'TERM') {
    $pm->start(sub {
        sleep(3);
        warn "end:" . time();
    });
}
$pm->wait_all_children();

これを実行すると、

cannot start another process while you are in child process at ...../Parallel/Prefork.pm line 42.

みたいなエラーが表示されます。

これは、手元にあった0.10未満のバージョンのParallel::Preforkを利用して、
0.10から実装された「- support new style: $pm->start(sub { … })」の形で
コードを実装してしまっている為です。

【0.10未満のParallel::Prefork】
$pm->start(sub{})に対応していないので、上記のコードだと、
何も処理されずにstartだけしてwhile分がまわります。
ここで問題なのは、Parallel::Prefoxkを正常終了するには、$pm->finishしないといけないという事。
この場合、$pm->start(sub{});で渡した内容が宙に浮きます。そして、finishが走る要素がなくなります。

sub start { 
    my $self = shift;
    :
    :
    die 'cannot start another process while you are in child process'
        if $self->{in_child};
    :
}

0.10以上のParallel::Preforkを利用している場合には、上記の$pm->start(sub{})の中が
Parallel::Prefork側の$cbに入り、$cb->();実行後に、$self->finish();されているので、問題ない。

sub start {
    my ($self, $cb) = @_;
    :
    :
       if ($cb) {
           $cb->();
           $self->finish();
       }
    :
}

ということで、コードをそのままに、libの読み込み先を

use lib "$FindBin::Bin/Parallel-Prefork-0.08/lib/";
                        ↓
use lib "$FindBin::Bin/Parallel-Prefork-0.13/lib/";

に変更したら、正常に動作しました。
まあ、通常はcpanmとかでParallel::Preforkを更新すればいいだけですね。
現時点の最新が、0.13なので、それにしてますが、多分Changesから見ると0.10以降なら何でも動くはず。

【もしも0.08のままいきたいなら】
コードを以下のように$pm->startの引数で渡すのを止めて、
かつ、$pm->finish;を明示的にするように修正すればいいだけですね

#!/usr/local/bin/env perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/Parallel-Prefork-0.08/lib/";
use Parallel::Prefork;

my $pm = Parallel::Prefork->new({
        max_workers => 2,
        trap_signals => {
            TERM => 'TERM',
        },
    });

while ($pm->signal_received ne 'TERM') {
    $pm->start;

    sleep(3);
    warn "end:" . time();

    $pm->finish;
}

まあ、そもそもが、Parallel::Preforkの0.10以上を利用していたシステムを
0.10未満のサーバに移植した(古いサーバに移設とかあまり無いですよね)とかしないと発生しないので、
この現象を調べる事になる人は、ほとんどいないと思いますけど。

危険なプログラミング25

0
Filed under perl, php, python, シェルスクリプト
Tagged as ,

ウェブの世界を徘徊してたら、見かけました。

海外の有名な人たちが、危険なプログラミング25を発表したようですね。

 

ぱっと見だと、

 

 ・入力された値のVaidation

 ・出力するもののエンコードとエスケープ処理

 ・SQLインジェクション

 ・クロスサイトスクリプティング

 ・OSコマンド系のインジェクション

   :

 

なんてあたりのが25項目書いてるみたいっすね。

 

ちょっと時間ができたら、見返してみようとおもってます。

 

もし、お時間がある方はみといたら、どうでしょう。(英語です)

http://www.sans.org/top25errors/?utm_source=web&utm_medium=text-ad&utm_content=Announcement_Bar_20090111&utm_campaign=Top25&ref=37029#s4

perlとかシェルスクリプトとかでメールを送る

1
Filed under perl, シェルスクリプト
Tagged as , ,

ちょっとしたことでメールをしたいときに、
シェルスクリプト(shellscript) とかパール(perl)とかで
メール配信・送信をする訳ですが、以下のような感じでできるのでメモ。

【シェルスクリプト】

#!/bin/sh

wToAddress=”test@test.com”

f_SendMail(){
wToAddress=$1
wSubject=$2
wMsg=$3

echo $wMsg | mail -s “${wSubject}” “${wToAddress}”
}

f_SendMail “${wToAddress}” “Test Subject.” “Test Mail Message.”

exit

【perl】

#!/usr/bin/perl

my $sendmail = ‘/usr/sbin/sendmail’;
my $nkf = ‘/usr/bin/nkf’;

open(SENDMAIL,”| $nkf -j | $sendmail -t -i”);

print SENDMAIL <<'END';
From: test@test.com
To: test_to@test.com
Subject: テストサブジェクト

テストメッセージ

END

close(SENDMAIL);

みたいな感じですね。
シェルスクリプトのほうも、たぶんnkfかませば、日本語いけると思う。
前にやってたような気がするけど、記憶がないので。。

言語ごとの真偽値について

1
Filed under perl, php, シェルスクリプト
Tagged as

ちょっと以前から困惑しているのが、
スクリプト実行後の「返り値」といいますか「ステータスコード」といいますか
「戻り値」といいますか、、 「真偽値」といえばいいですかね。

これが、言語によって違うわけですよ。
単純に脳みその中でおかしなことになります。

今まで自分がやってきたものでいえば、以下の3つしかないわけですけど、
3つでも脳みそがおかしくなります。

 シェルスクリプト : 0:真 1:偽
 perlスクリプト  : 0:偽 1:真
 phpスクリプト   : 0:偽 1:真

となっているわけですよ。

まあ、シェルスクリプトだけ違うと思えばいいのですが、
シェルとかコマンドライン操作を多くしていた為に、
ちょくちょく間違えます。 こまりものですね。
全部揃えてくれたらいいのに・・・

pythonとかrubyとかはどうなってるんだろ。
気が向いたら調べて追記しようと思う。