ラベル perl の投稿を表示しています。 すべての投稿を表示
ラベル perl の投稿を表示しています。 すべての投稿を表示

2013/09/22

YAPC::Asia 2013と今後のHokkaido.pmの活動について

YAPC::Asia 2013

今年もYAPC::Asiaに行ってきました。スタッフの皆さまのおかげで、非常に楽しい二日間を過ごせました。スタッフの皆さま、ありがとうございます!

普段お世話になっている方への挨拶や次回以降のHokkaido.pmでゲストとして招待したい人とコンタクトを取ることができたので、非常に満足しています。今回は前回よりも中々いい感じにいろんな人に会えた気がします。

今年は私事が色々と重なり、年内の予定が不明瞭だったためスピーカーには応募できませんでした。またスピーカーに応募したい思っていますが、次回のYAPC::Asiaの開催は不明ということで、とりあえずアウトプットを増やしつつ機会を待とうかなと思います。

今後のHokkaido.pm

次回のHokkaido.pmは1月後半から2月頃になるんではないでしょうか。もしかすると12月あたりにもあるかもしれません。

何人かに言われたので、そろそろUstをどうにかしたいところです。Ustがあれば遠方の方からも反応をもらえるのというメリットがありますし、土日に参加できない人が一定数いるようなので、そういった方にもフレンドリーかなと。また、先週札幌で行われたオープンソースカンファレンスでもHokkaido.pm Casualの空気感がわからず参加しにくいという話も聞きました。ブログ等での開催報告をもう少し頑張るというのももちろんですが、Ustも空気感を伝える手段の一つにもなるのかなと考えています。何か手頃なUSB接続のカメラを探したいと思います。

2013/09/03

Hokkaido.pm#10 を開催しました #hokkaidopm

8/31(土)に札幌市産業振興センターでHokkaido.pm#10を開催しました。
今回はJPA様の支援でゲストに@tokuhiromさんをおよびしてお話しして頂きましたありがとうございます。
さらにTengの中の人である@nekokakさんやPerl Beginners主催の@ytnobodyさん、mod_perl大好きな@xtetsujiにもお越しいただき大変豪華は顔ぶれとなりました。
皆様、まことにありがとうございます。

春から夏にかけて時間が取れなかったので前回の開催から半年程度間が開いてしまいました。
物足りない方は毎月第3水曜日開催のHokkaido.pm Casualに参加していただけると良いのではないでしょうか。
次回の開催日はまだ決まっていませんが半年に一度は開催したいと思っております。
ゲストの目星はある程度つけてありますので、9月のYAPC::Asiaで何人かにアプローチしたいと思います。

イベントのレポートはHokkaido.pm#10 開催報告を御覧ください。

LT - Asset Pipeline for Perl

今回はLTで『Asset Pipeline for Perl』という発表をしました。Railsについてるあの機能の一部をPlack::Middlewareとして実装したものです。
CoffeeScriptは私が使わないので対応していませんし、javascript_include_tagも未実装です。
もう少ししたら『GitHub止まりモジュール』から格上げされてCPANにアップロードするかもしれません。

2013/07/18

daemontoolsのenvdirだけ欲しかったからEnvDir書いた

やっぱりenvdirしたかったので、作りかけだったのをちゃんと実装した。

俺得モジュールです。

使い方

    use strict;
    use warnings;

    # environment from /path/to/envdir/*
    use EnvDir -autoload => '/path/to/envdir', -clean;

-cleanを付けると本家のenvdir同様に%ENVをクリア(PATHのみは/bin:/usr/binになる)して、指定したdirのファイルから%ENVに色々セットします。
envdirをimportするか、OOスタイルで使うとガードオブジェクトが返ってきてスコープを抜けると元の%ENVに戻る

    use strict;
    use warnings;

    # import envdir function
    use EnvDir 'envdir', -clean;

    # Function style
    {
        my $guard = envdir('/path/to/envdir');
        ...
    }

    # OO style
    my $envdir = EnvDir->new( clean => 1 );
    {
        my $guard = $envdir->envdir('/path/to/envdir');
        ...
    }

envdir.plコマンドを添付しているので本家envdirと同じようにも使える

    > envdir.pl ./env sh -c 'echo $PATH'

2013/06/29

plenv installから--asが消えたのでperl-buildを直接使う

追記 2013/06/29 09:09

@tokuhiromさんにコメントでご指摘頂きましたところ、8日前にperl-build側で実装されたそうです。
githubにあるperl-buildのHEADを利用すると使えるようになります。


plenvの中身がperlからbashに変更された際に消えたようです。
バージョンはplenv 2.0.1-7-ge389af0

違うバージョンのperlを一つずつinstallする分には困りませんが、同じバージョンでコンパイルオプションを変更したものをinstallしようとすると「もうそのバージョンあるから!」とinstallを拒否されます。

ざっくりと見たところplenvは~/.plenv/versions以下にbuildしたperlを保存してます。

    > ls -1 ~/.plenv/versions/
    5.16.2
    5.16.3
    5.18.0

場所が分かれば後は、perl-buildで直接installしてやると大体うまく行きそうです。

    > perl-build 5.18.0 ~/.plenv/versions/5.18-ithreads -Duseithreads

無事installが終わるとこんな感じになるので、後はplenv global 5.18-ithreads等の通常の方法で切り替えることが出来ます。

    > plenv versions
      system
      5.16.2
      5.16.3
      5.18-ithreads
    * 5.18.0 (set by PLENV_VERSION environment variable)

公式に説明があるわけではないので自己責任で行ってください。

2013/03/21

Hokkaido.pm Casual#11に行って来ました

今回でHokkaido.pm Casualは第1シーズンが終了となります。
次回から第2シーズンになりますが、特に内容は決まっていません。WAF, ORMあたりは一度は触れるんじゃないかと思います。
後は@techno_nekoさんが適宜考えながらやって行くはずです。

今日の発表内容

第11回目のテーマはリクエスト特集ということでしたが、特にリクエストもなかったので今まで紹介できなかったけど知っていると嬉しいモジュールとして以下を紹介しました

Synopsisを見たほうが早いですが、スライドはこちらです。
一応例に使用したgithubにpushしてありますので、確認したかたはこちらからどうぞ

2013/03/14

Hokkaido.pm#9を開催しました

報告が遅れましたが、3/9(土)に無事開催しました。
参加者のみなさん、講師のxaicronさん、悪天候の中ありがとうざいました。
詳しい内容は公式ブログのHokkaido.pm#9 開催報告を御覧ください。

個人的には@shinotraさんのATNDのAPIでWebサービスを作った話がすこぶる良かったです。
最初はLTでの申し込みだったのですが、無理を言って20分やっていただいて正解でした。
今後もshinotraさんのようにCasualで釣って、本体に参加してくれる人が増えるとよいですね。

自分の発表について

今回はPerl版Gemfileのcpanfileについてざっくりと説明しました。
開催直前にcpanfileに対応したcartonがリリースされたので、ちょうどよいタイミングでした。

Perl自体とCPANモジュールについては互換性の維持に相当力をいれていますので、Makefile.PLでの指定でもそれほど問題はありませんでしたが、これでカッチリとした指定がやろうと思えば簡単にできるようになったのは大きいです。

個人的に一番大きなメリットはgitリポジトリを直接指定できることかと思います。この機能自体はどちらかと言うとcpanmによるものですが。
社内やgithubにおいておけば簡単に自社アプリケーションで利用できるので、わざわざDarkPANを立てなくてもよくなります。勤務先にも自社ライブラリをOrePANを立てて利用していますが、gitに移行してOrePANを止めないと考えています。

今回のスライドを貼っておきます。

今後の開催について

今回から開催者は持ち回りでやってみないかと言う事で、とりあえず私がメインで色々担当しました。
次回は誰が開催するのか決まってませんが、多分他にいなそうなので私がやるんじゃないかなと思います。

@techno_nekoさんが毎月Hokkaido.pm Casualを開催していますので、Hokkaido.pm本体の方は年3回(3,7,11月とか)くらいの頻度でやるんじゃないでしょうか。

JPA様の講師派遣制度には毎度お世話になっております。ありがとうございます。次回も恐らく利用するかと思います。
毎回開催前に誰にしようかという話になりますので、5月頃に「自分、Perl Mongerなんだけど、夏の北海道いいよねー」とアッピールしてもらえるとこちらも呼びやすいところであります。

2012/10/13

ExtUtils::MakeMakerとPerlのversion

追記 2012-10-17
BUILD_REQUIRESを実装した方(chornyさん)から6.55_03以降が望ましいとコメントをいただきましたので,修正しました.ありがとうございます!
後方互換を気にするなら,App::EUMM::Upgradeを使うといいかもしれません


ExtUtils::MakeMakerで*REQUIERSがいつからサポートされているのか調べたのでメモ
perl-5.10.1以降であれば安心してCONFIGURE_REQUIRES,BUILD_REQUIRESが使えるようで一安心

perl       EUMM
v5.8.0     6.03
           6.06_03  META.yml
v5.8.9     6.48

v5.9.0     6.17
v5.9.5     6.36

v5.10.0    6.42
           6.45_01  META_MERGE
           6.51_03  CONFIGURE_REQUIRES
v5.10.1    6.55_02

v5.11.0    6.55_02
           6.55_03  BUILD_REQUIRES (Recommended version. See comments below.)
v5.11.3    6.56
v5.11.5    6.56

v5.12.0    6.56
v5.12.4    6.56

v5.13.0    6.5601
v5.13.5    6.57_05   MYMETA.yml
v5.13.11   6.57_05

v5.14.0    6.57_05
v5.14.2    6.57_05

v5.15.0    6.57_05
v5.15.1    6.58      META.json, MYMETA.json
v5.15.9    6.63_02

v5.16.0    6.63_02
v5.16.1    6.63_02

v5.17.0    6.63_02
v5.17.4    6.63_02

2012/10/04

Apache2::Data::Section::Simple - Data::Section::Simple for ModPerl::Registry

THIS MODULE IS BETA. YOU SHOULD NOT USE

動機

ModPerl::Registryでは__DATA__を読み込むことができないのは周知の事実かと思います.
なんかよくわかりませんが,twitterのtimelineで__DATA__を読むことができないかと盛り上がってる感じがしたので,チャレンジしてみました.

HOW TO USE

Data::Section::Simpleと同じです

URL

p5-apache2-data-section-simple

動作環境

動作確認をしたのは以下の環境です

  • FreeBSD 8.1-RELEASE
  • Apache/2.2.17 (FreeBSD)
  • mod_perl2.0.5
  • perl v5.10.1

2012/09/30

YAPC::Asia Tokyo 2012 参加記録 #yapcasia

前夜祭も含め三日間参加してきました.ブログをかくまでがYAPC::Asiaということで,感想を綴っておこうと思います.

はじめに

今年も私が所属する株式会社アイダックに企業スポンサーになって頂きました.ありがとうございます.

また運営スタッフの皆さま,ありがとうございます.スタッフの方々のおかけで楽しい時間を過ごせました.

Perl Mongers

各地のPerl Mongersに会うことができる数少ない機会でしたので,普段お世話になっている方に挨拶してきました.

その中でも特に印象深いのは,近藤さんに直接お礼を伝えることができたことです.日本語版『初めてのPerl』を熟読してPerlを覚えたクチですが,読んでいた当時の自分は,翻訳者ご本人に直接お礼を言える機会があるとは思ってもいませんでした.

Perl Mongerのくくりにいれていいのか分かりませんが,またLarry Wallさんと写真を取れました!以前撮影した写真を見せ,また撮影をお願いしたところ,「OK. モウイチド」と快く応じていただけました.ありがとうございます.

モチベーション

毎回感じることですが,参加後は意識が高まって(),非常に開発したい気分になります.大勢の方が良質なアウトプットしているので,その影響を受けているのでしょう.この状態を維持し,あずまさんが仰ってたようにCPANに恩返し,恩送りしたいところです.

昨年と違い今年は登壇しなかったため,少し物足りなさが残りました.来年は(当選するかは別として)トークを応募しようと思います.

リンク

1日目,2日目のまとめをアップしてあります.例年通りなら後日トークの動画がアップされるかと思いますので,それまでの繋ぎとしてご利用ください.注意点ですが,自分用に聞いた話をメモしたものですので,解釈が間違っている可能性もあります.

2012/09/28

YAPC::Asia Tokyo 2012 1日目

YAPC::Asia Tokyo 2012の初日です. 久しぶりに会う方とご挨拶できて,非常に良かったです.二年ぶりにLarryさんとも写真をとらせていただきました. またXslateのbridgeの件でgfxさんとお話して,今後の対応を確認できたのも収穫です. 以下は聞いてきたトークのメモです.あくまで私のメモなので正確な内容は今後公開されるスライドや恐らくアップロードされる動画を確認してください.おかしい点があれば,ご連絡ください.

What Does Your Code Smell Like?

  • Larray Wallさん
  • perl5のコードをperl6に書き換えるライブコーディング 
    • subの定義に引数を指定できる
    • referecneが簡潔に
    • if, while等の一部で括弧を省略できる
    • (^100).roll(10) 0-100までの乱数を10個生成する
    • say "Before @a"が展開されない.say "Before @a[]"にする必要がある
    • 0 ..^ @x 0から@xまで.省略すると ^@x
    • functional programmingもできる
    • gather/takeでありがちな一時変数を減らしたりとか
    • infix:<M>でオペレータMを定義できる? @out M= merge(@x,@y)みたいなコードがかける
    • その他色々

Web::Security beyond HTML5

  • Yosuke Hasegawaさん

Ajaxを利用したXSS

Ajaxデータを利用したXSS

  • ちょっと遅れて最初5分くらいは聴き逃した
  • IEだと勝手にapplication/javascriptがtext/htmlと解釈されることがある
  • IEにおけるファイルタイプ決定のメカニズムが複雑すぎる
    • URLの拡張子によって挙動が変わったりとか
    • 挙動がいつのまにか変化していることが多い
      • microsoft.com + IEの組み合わせのみでXSSになるページもあった
  • 発生しやすい状況
    • JSON
    • JSONP
    • CSV

Ajaxデータの盗み見

  • JSONとかは狙いやすい
  • Array Hijacking for Android
    • object.prototype. __definegetter__とか使う
  • JSON Hijacking for IE
    • JSONの一部にUTF-7とかで攻撃コードを紛れ込ませる
    • IE6,7だとresponse headerよりも

対策

  • X-Content-Tyep-Options: nosniff
    • IE6,7には効果なし
  • XMLHttpRequest以外からのアクセスを遮断する
    • X-Request-Withを見て判断する(jQueryとかが入れてる)
    • 自分で任意のheaderを使うのもあり

XHR Lv.2の注意点

  • クロスドメインリクエストが可能
  • ただしクライアントとサーバ側で注意しないと危険
    • クライアント側
      • URLのチェックを怠らない
      • URLの確認はじつはめんどくさい
    • サーバ側
      • Originヘッダを見るだけではダメ
      • Cookieを使う
      • setRequestHeaderで独自の確認用ヘッダを付ける
      • preflightリクエストを使うとX-hogehogeというヘッダを使えるようになる
      • Plack::Middleware::CrossOriginを使うと楽

XSSフィルター/XSS Auditor

  • IE8, Chrome,Safariとか
  • 誤検知もあるので,X-XSS-Protectionヘッダでコントロール可能

X-Content-Type-Options: nosniff

  • 動的コンテンツには全部付けておくべき

クリックジャッキング対策

  • X-Frame-Options: DENY
    • できれば使ったほうがよい

Content-Security-Policy(CSP)

  • XSS根絶の切り札
  • まだまだ規格・実装が不安定
  • 許可するリソースを記述

    Content-Security-Policy: default-src 'self'; image-src *
    

HTTPSの強制

  • HTTP Strict Transport Security(HSTS)
  • HTTP Responseヘッダで指定する
    • HTTPでは汚染されているかもしれないので,HTTPSで吐き出す必要がある

まとめ

  • ブラウザベンダーに文句言うだけじゃなく,サーバ側で積極的に対応する必要がある
  • 是非実装に落として,どんどん広めていって欲しい

大きくなったシステムの疎結合化への取り組み

分離する

  • Service Procedureに差し替える
    • 基本的にプレーンなデータを返す
    • オブジェクト等は返さないようにする
  • 今回は内部向けのCoreInternal API
  • 1つのリポジトリにいれてる
    • メリット
      • 既存資産の活用
    • デメリット
      • リポジトリの肥大化
  • JSONRPC over HTTP / Plackを使用
  • まだ社内でもベータ的な状態

コードの計測

  • Inscpect Packageで計測
    • 昨年のmixiの人が発表したやつ
    • 結合度,複合度を計算して,技術的な負債をスコア化
  • コードレビューもやってる
  • ガイドラインをテストにして自動化する
    • @EXPORTを禁止
    • 非推奨モジュールの使用のチェック
    • ループ用途のmap, grep
  • 何気なく書いているコードで複雑化していくので,意識して書く

Perlと出会いPerlを作る

  • 五嶋さん
  • 大学時代はKonohaScriptの開発

gperl

  • コンセプトは世界一高速なPerl処理系を目指している
  • C++でスクラッチで開発
  • フィボナッチやたらいまわしで数十倍高速
    • 数値はperlの弱いところで,文字列処理をやっていないのはちょっとアンフェア by dan kogai
    • Regexとか文字列関連はまだ実装されていないので,できてからベンチ取りたい

高速化

  • 引数用の配列を事前に構築
  • NaN-boxingによる型検査
  • アノテーションによるStatic Typing/JIT Compile

    • # @static_typing, # @jit_safe

      # @static_typing
      sub fib {
          ...
      }
      

仕様の都合で諦めた箇所

  • 関数引数にあるリストの展開
    • 関数用に確保した配列を拡張する必要があるので遅い
  • デフォルトでのスカラー変数の参照渡し

Profiling memory usage of Perl applications

  • ps, top, /proc等を使う
  • RSSを計測の目安に使わないこと
  • Devel::Peekで変数(IV, HV, GV等)の構造を表示できる
  • Devel::Sizeでメモリ使用量を見れる
  • Devel::Sizeを拡張したい.一部した
  • Devel::SizeMeGraph なんか色々可視化してる!

2012/09/22

Released Text::Xslate::Bridge::FillInForm::Lite

追記 2012-10-03

Don't use this module. You should use Text::Xslate(ver 1.5018 or higher) and html_builder_module option. See Text::Xslate::Bridge::FillInForm::Lite for detail.

Tex::Xslate側でhtml_builderをかませるhtml_builder_moduleオプションが追加されたので,このモジュールはdeprecatedになりました. 詳しくはText::Xslate::Bridge::FillInForm::Liteをご確認ください.

これから以下のようにfillinformをかけます


    use Text::Xslate;
    my $txt = Text::Xslate->new(
        html_builder_module => ['HTML::FillInForm::Lite' => ['fillinform']]
    );

Dancerのconfigでは以下のように指定してください

    template: "xslate"
    engines: 
      xslate: 
        html_builder_module:
          - "HTML::FillInForm::Lite"
          - ["fillinform"]

ご対応いただいたgfxさん,patchを書いていただいたtokuhiromさん,ありがとうございました!

追記ここまで

LINK

INSTALL

$ cpanm Text::Xslate::Bridge::FillInForm::Lite

HOW TO USE


    use Text::Xslate;
    my $txt = Text::Xslate->new(
        module => ['Text::Xslate::Bridge::FillInForm::Lite']
    );

    my $output = $tx->render_string(<<'T', { q => { foo => 'bar' } } );
    : block form | fillinform($q) -> {
    
: } T

MOTIVATION

  1. 毎回,Text::Xslate::Manual::Cookbookからcodeをcopyしてた
  2. Dancer::Template::XslateのようにText::Xslate#newにfunctionを渡せない時がある

Dancerのconfigはyaml形式のためcodeを直接書けない.moduleオプションは文字列で渡せるので問題ない

    template: "xslate"
    engines: 
      xslate: 
        module:
          - "Text::Xslate::Bridge::FillInForm::Lite"

一応,以下のように書けば対応はできるがめんどくさい


    package MyApp; 
    use Dancer ':syntax';
    use Text::Xslate qw(html_builder);
    use HTML::FillInForm::Lite qw(fillinform);

    our $VERSION = '0.1';

    set 'engines'  => {
        'xslate' => {
            function => {
                'fillinform' => html_builder(\&fillinform)
            }
        }
    };

    get '/' => sub {
        template 'index', { q => { foo => 'bar' } };
    };

    true;

追記 2012-09-24

Text::Xslateとしてはラッパー的なpluginが溢れるのはよくないよねという方針だったらしいので、tokuhiromさんが汎用的に使えそうな案をいくつか出してくれた。
Re: Text::Xslate::Bridge::FillInForm::Lite

3番目のText::Xslate#newにhtml_builderオプションを追加する方針が良さそうに思う。
上記patchが取り込まれるかはまだわからないが、取り込まれた場合はこのmoduleはdeprecatedにする予定

2012/09/04

JSON::Types::boolとJSON::PP::value_to_json

JSON::Types ってのを書いた

JSONとして数値を返したい時によく+0とかしてたけど,こっちの方が意図が明確になって良さそう.

JSON::Typesの実装方法を確認しているときに,JSON::Types::boolが気になった

    sub bool($) {
            $_[0] ? \1 : \0;
    }

なぜ1,0のreferenceを返してるのか.その答えはJSON::PP::value_to_jsonの中にあった.

    sub value_to_json {
        my ($self, $value) = @_;

        # 省略

        my $type = ref($value);

        if(!$type){
            return string_to_json($self, $value);
        }
        elsif( blessed($value) and  $value->isa('JSON::PP::Boolean') ){
            return $$value == 1 ? 'true' : 'false';
        }
        elsif ($type) {
            if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
                return $self->value_to_json("$value");
            }

            if ($type eq 'SCALAR' and defined $$value) {
                return   $$value eq '1' ? 'true'
                       : $$value eq '0' ? 'false'
                       : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
                       : encode_error("cannot encode reference to scalar");
            }

            # 省略
        }
        else {
            # 省略
        }

    }

JSON::PP::Boolean\1, \0を渡すとtrue, falseにしてくれる模様.

ちなみにJSON::PP::Booleanの生成方法

    $JSON::PP::true  = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
    $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };

2012/05/13

[hokkaidopm]Hokkaido.pm#7 参加しました

Hokkaido.pm#7

Hokkaido.pmに行って来ました
私の今回の発表は「DancerでWebアプリ再入門」です。

また今回もJPA様の講師派遣支援制度でりーおさん(@riywo)にお越し頂き、Perlの運用ツールのお話しを聞くことができました。
Touryoのオープンソース化を待ち望んでいますので、是非お願いします!

以下はりーおさんのセッション時のメモです。

Ops Tools with Perl @riywoさん

スライドはこちら

CloudForecast

  • サーバリソースのモニタリング
  • Installが簡単
    • SNMP, RRDs系が別途必要
  • 軽量 5,000行程度(テンプレート含む)
  • WAF: Shirahata.pm

GrowthForecast

  • API and Graph
  • Installが簡単
    • RRDsは別に必要
  • 使用例
    • fluentでGrowthForecastになげて、Webから見る

chase-tail

  • tail -f error_log | chase-tail -l 10 -t various_erro
  • エラー箇所に色付け
    • 目grepを楽にする
  • エラーの流れ早すぎる場合は適度に省略してくれる

App::Ikachan

  • IRCのHTTP API

Percona Toolkit

  • MaartkitとAspersaが混ざってる
  • MySQL用のツール
    • pt-query-digestがパフォーマンスチューニングに役立つ
      • tcpdumpをどばっと食わせると実行時間とかみれる

Touryo

  • Configuration Management Tool
  • Chefは良かったけど、カスタマイズが大変
  • Amon2で設定をWeb画面で可視化
  • CLI
    • touryo test web01 環境があっているかテスト
    • touryou run web01 間違っている箇所を訂正
  • 設定
    • roleを定義する
    • roleは継承可能
  • blueprint
    • crontab等のテンプレート
    • Text::Xslate使ってる
  • roleだけじゃなくてnodeで特定のサーバ毎に設定を追加できる

2012/04/19

[perl][hokkaidopm] Hokkaido.pm Casual#0

Hokkaido.pm Casual#0

Hokkaido.pm Casual#0に行って来ました。
参加者も10名を超える盛況ぶりで、今回の参加者はこちらのatndで確認できます。
何故かyappoさんがいたりとCasualなのか微妙な感じがしてましたが、行ってみると結構Casualでした! 次回以降はもっとCasualに行きたいですね。

LTについて

全員LTということで、今回はimpress.js Remoteというのを作ってみました。
Keynote Remoteのようにimpress.jsをiPhoneから操作するというソフトウェアです。

実装の概要としてはnodeでWebSocket Serverを立てて、iPhoneのtouchイベントをPC側に送るシンプル実装です。
まだまだ機能が足りないので、後日整理してからgithubにあげようと思います。

TODOとして以下が残っています

  • Remote側のHTML出力の自動化
  • 一覧ページの追加
  • カンペ表示の対応
  • jQueryを依存から外す
  • Web ServerとWebSocket Serverの共通化

今後について

これから毎月1回開催していくということで、もっとCasualになるといいですね。
LTの途中とかで随時質問していける雰囲気があるといいんじゃないでしょうか。後、最初からビールがあるといいと思います。

2011/12/15

Hokkaido.pm #6に行ってきました

Hokkaido.pm #6に行ってきました

ブログを書くのが遅れましたが、参加してきました。 詳しいレポートはhirataraさんの記事をご覧ください。

今回は関東から5名も参加していただけました。皆様、ありがとうございます!

  • sugyanさん
  • nekokakさん
  • charsbarさん
  • xtetsujiさん
  • hirataraさん

Carton使ってみた

YAPC::Asia Tokyo 2011でCartonの発表をみていたので、その後に使ってみた感想を発表してきました。
簡単にまとめるとお手軽で超便利って感じです。使い方が凄くシンプルなので、発表内容があまりなくて焦りました。
今後もcartonを使っていくんじゃないかと思います。

感想等

akiymさん

Skype::AnyとAnySan::Providerの話し。
いい感じ!と思ったのですが、Skypeクライアントが起動していないとSkype APIは使えないそうなのでちょっと悩みどころです。

nekokakさん

以前、nekokakさんに「ソフトウェア開発のプロセス」を聞きたいとリクエストしていましたが、スルーされた経緯がありました。
しかし、今回は最近実装した分散JobQueue『Clutch』の開発の話しと合わせて聴かせていただけました。
JobQueueも今回リクエストしていたので、完全に「俺得」な内容でした。ありがとうございます。

懇親会ではTengの話しを聞かせてもらって、やはり今後はDBIx::SkinnyじゃなくてTengだと感じました。 余談ですが、JobQueueはSchwartzとGearman、ContainerはScope::Containerを使ってます。

xtetsujiさん

xtetsujiさんは「mod_perl hacks PHP」というタイトルで、PHPがmod_perlの処理フェーズの中でPerlResponseHandlerの部分しか使ってないので他のフェーズはいじり放題という内容でした。この発想はなかったなーと感心してしまいました。尚、発表の内容はフィクションですので、実在の団体とは関係ないそうです。

hirataraさん

PerlのGCがreference counterなので、うっかり循環参照するとメモリリークしたりするわけです。そんな循環参照を見つけたりする方法の話しで、私が主に使うDevel::Cycleも紹介されてました。

sugyanさん

全裸ではありませんでしたが、雪が積もってる中で、なんと雪駄でした!
除雪されてない場所に果敢に突っ込んでいたのが印象的でした。

YAPC::Asia Hokkaidoについて

前からonagataniさんがやりたいと言っていたのですが、ついに動き出すようです。
不安もありますが、可能な範囲でお手伝いしていこうかと思います。

2011/11/20

[Perl][CPAN]動的にsubroutine呼び出しをするSub::Applyを書いてみた

動的にclass methodを呼びたい場合は割と簡単で、以下のように書ける

    package Foo;
    use strict;
    use feature 'say';
    sub new { bless {}, shift }

    sub sum {
        my $self = shift;
        my ( $x, $y ) = @_;
        say $x + $y;
    }

    package main;
    use strict;
    use feature 'say';

    my $obj  = Foo->new;
    my $func = 'sum';
    if ( $obj->can($func) ) {
        $obj->$func( 1, 2 );
    }
    else {
        say "No such method => $func";
    }

しかし、動的にsubroutineを呼びたい場合はちょっと泥臭くなる

    use strict;
    use feature 'say';

    sub sum {
        my ( $x, $y ) = @_;
        say $x + $y;
    }

    my $func = 'sum';

    {
        local $@;
        eval "$func(1,2)";
        if ($@) {
            say "Oops! $@";
        }
    }

    {
        my $code = do {
            no strict 'refs';
            *{$func}{CODE};
        };
        if ($code) {
            $code->( 1, 2 );
        }
        else {
            say "Oops! Undefined subroutine $func";
        }
    }

evalでstringを評価するか、no strict 'refs'してからsymbol tableを確認する方法があります。

速度面を考えるとevalしたくないし、かと言ってno strict 'refs'をして直接symbol tableを触りたくない。
こう言った泥臭いことはmoduleに隠蔽しちゃうのがいいんじゃないかと思ったので、Sub::Applyを書きました。

Sub::Applyの使用例

    use strict;
    use feature 'say';
    use Sub::Apply qw(apply apply_if);

    sub sum {
        my ( $x, $y ) = @_;
        say $x + $y;
    }

    my $func = 'sum';

    {
        # $funcがない場合、croak
        apply($func, 1, 2);
    }
    {
        # $funcがない場合、carp
        local $Sub::Apply::WARNING = 1;
        apply_if($func, 1, 2);
    }
    {
        # $funcがなくても何もしない
        apply_if($func, 1, 2);
    }

CPANgithubにupしてあります
現在のversion(0.04)では、printf等のcore functionは呼び出せませんので注意してください。

2011/11/13

[Perl][CPAN] App::pfswatch 0.07をリリースしました

変更点

--pipeオプションの追加

--pipeオプションを付けると実行コマンドのSTDINに変更されたファイル名が渡されます。
後はxargsなりで引数に変換するとかしてもらえるといいんじゃないでしょうか。

    $ pfswatch t/ --pipe --exec xargs prove -lr 

しかし、本当に同時に更新されないと複数のファイル名が渡ってこないので微妙。
実行までのintervalをオプションで付けた方がいいかも

Regexp::Assembleを削除

qr//でもいい程度しか使ってなかったので、削除しました。

[Perl][CPAN] Tweet::ToDeliciousをリリースしました

以前から作成しているTweet::ToDeliciousをCPANにuploadしました。
metacpan.orgでは確認したので、そのうち見えるようになるかと思います。

詳しい説明は以前の Tweet::ToDeliciousでリンク付きTweetをDeliciousに保存する を見てください。

VERSION 0.06ではfavoriteしたtweetを'favorite','via:tweet2delicious'のタグを付けて保存する機能を追加しました。
http://packrati.us/が好きになれなかったので自分で作ったわけですが、これで欲しい機能は一通り実装した形になります。

2011/11/06

[perl] Tweet::ToDeliciousでリンク付きTweetをDeliciousに保存する

Tweet::ToDeliciousでリンク付きTweetをDeliciousに保存する

Tweet::ToDelicious

github: https://github.com/ysasaki/p5-tweet-todelicious
git: git://github.com/ysasaki/p5-tweet-todelicious.git

Abstract

リンクの付いているtweetをdeliciousに保存してくれるツールです。
hashtagと[foo]というパターンをtagとして登録します。
また、後で振り分けように自動でvia:tweet2deliciousタグも付与します。

Motivation

今まではdeliciousに気になったリンクを保存していたけど、
最近はCrowsnestbitly経由でTweetすることが増えたため、残しておきたいリンクが分散する形になった。
既存のサービスでリンク付きTweetをdeliciousに保存してくれるものがあるが、hashtagしかtagに変換してくれないので自分で書いた。

Install

gitでgithubから最新版をもってきます。

    $ git clone git://github.com/ysasaki/p5-tweet-todelicious.git
    $ cd p5-tweet-todelicious
    $ cp config.yaml.sample config.yaml

TwitterのStreaming APIを利用しているので、自分で開発者登録をしてconsumer_keyやtokenを取得してください。
登録が完了したら以下の情報をconfig.yamlに書き込みます

  • Twitter ID
  • Twitter App's consumer_key, consumer_secret, token, toke_secret
  • delicious's username, password

後はREADMEにある手順通りにcartonで必要なmoduleをinstallして、起動スクリプトを叩くだけです。

    $ carton install --deployment
    $ carton exec -- perl ./bin/t2delicious.pl

VPSとか適当なサーバ上でdaemontools等を利用して動かすのがベターかと思います。
perl-5.14.xじゃないと動かないので注意。use v5.14;の部分を書き換えれば、perl-5.10.xでも動くと思います。

TODO

  • bit.lyとcrowsnestの短縮URLを展開したい ← 追記 2011/11/09 3:00 展開に対応しました

2011/11/03

use VERSION and use feature

use VERSION and use feature

そろそろ新しいperlを使えそうなので、確認しておく。

use $VERSION

    use v5.14;

これは以下のことが起きる

  • compile time version check
  • use feature ':VERSION' if VERSION >= 5.9.5
  • use strict if VERSION >= 5.11.0

VERSIONの互換性を気にするときは以下のように書けばいいんでないでしょうか。

    use v5.14.2;
    use 5.014_002; # for backwards compatibility. see `perldoc version`

use feature

perl-5.14.2の時点で以下の4つがある

  • say
  • state
  • switch
  • unicode_strings

それぞれの機能は以下のようにしてimportできる

    use feature qw(say);

面倒なので、まとめてimportできる以下のbundleが存在する。

bundle|features
------------------------------------------
:5.10 |switch, say, state
:5.11 |switch, say, state, unicode_strings
:5.12 |switch, say, state, unicode_strings
:5.13 |switch, say, state, unicode_strings
:5.14 |switch, say, state, unicode_strings

bundleは以下のように指定する。

use feature ':5.10';

bundle指定で':5.10.x'と書いた場合、xはなかったものとして扱われる。
また、もう使うことはないだろうが、特別なbundleとして':5.9.5'が存在し、':5.10'として扱われる。

the ’unicode_strings’ feature

5.13.8から完全にサポートされて、Unicode関わるバグ(文字列のappend時の挙動とか)を治してくれる模様。
詳しくはperldoc featureperldoc perlunicodeのThe "Unicode Bug"を参照。

perldoc featureにも以下のようにあるので、新規に書く場合は使ったほうがいいのではないでしょうか。

if you are potentially using Unicode in your program,
the "use feature 'unicode_strings'" subpragma is strongly recommended.