Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.

JPA 派遣枠 LT 大会 @ Kyoto.pm Tech Talks #01

Yappo: yappo あっと shibuya.pl
hikarie Perl Mongers

申し訳ございません

折角京都にきたので昼飯に懐石料理食べに行ったら思ってた時間の倍かかって遅刻しました。誠に申し訳ありません。

近又さんは完全予約制なのにアポ無しで入れてくれて、とても美味しかったです。すいません。。

はじめに

Kyoto.PM 設立おめでとうございます!

そして、JPA 派遣制度でのご指名有り難うございます!

この発表タイトル?

最初は捗るシリーズの続編にしようと思ってたんですが、よくよく Atnd を見てみたら Perl 初心者の方や学生の方がちらほら居たので、さっき思い立って複数のテーマをやる事にしました。

なんか

折角スポンサードして頂いて光栄すぎるのですが、今回東京から自腹で来た登壇者の方が居ててなんかほんとうすいませんすいません。

timetable

My Initial A Modules

はじめに

Perl とはユーモア溢れるコミュニティで、 CPAN というライブラリ共有サイトにはジョークに溢れるモジュールがいくつか点在していて、その多くが Acme という名前空間で登録されています。

Acme

このセッションでは、世界的にも数多くの Acme モジュールを生み出している私が、それぞれのモジュールの技術的な特徴を解説します。

Acme::Acotie

Class::Inspector という、特定のパッケージに含まれている関数を操作出来るモジュールを使って、 use した側のコードをランダムに入れ替えるサークルクラッシャー的モジュール。

sub yappo {'yappo'}
sub nekokak {'nekokak'}
sub nagayama { 'nagayama' }
use Acme::Acotie;
say yappo(); # ランダムに出力

[実際のコードを見たり動かす]

Acme::Acotie 解説

Acme::FizzBuzz

FizzBuzz 問題を解決するためのコード量を 0 bit で解決する事が可能な夢のようなモジュール。

perl -MAcme::FizzBuzz -e ''

[実際のコードを見たり動かす]

Acme::FizzBuzz 解説

Acme::FizzBuzz 真の解説

というか、解説かこうと思って久しぶりにコード読んだらどうやって動いてるのか本気で理解出来なくて死んだw

過去の自分の書いたコードは他人のコード。という格言が有る通り、遊びのコードでも奇抜な実装をすると後で困るので可読性高くしましょう!というお手本になるモジュールでしたね。

Acme::Monta

Perl 初心者の時に作ったから特記事項無し。

Acme::NabeAtzz

Perl のオペコードの数字が3の倍数の時だけ、アホになってオペコードの数字を出力するモジュール。

use 5.015;
use Acme::NabeAtzz;
my $i = 0;
do {
    print $i++;
    print "\n";
};

[実際のコードを見たり動かす]

Acme::NabeAtzz 解説

Acme::NabeAtzz 解説おまけ

dan

文字リテラルを読まなくするプラグマ。レキシカルプラグマとして使える。

use 5.015;
print "Dan The ";
do {
    use dan;
    print "Read "; # ここ空文字を出力
};
print "Man\n";

[実際のコードを見たり動かす]

dan 解説

まとめ

Acme っていうネタモジュールだから適当に作ってると思われがちですが、ただバカな事をするのではなく誰もマネをしないような実装手段を用いてアホな事するのが肝心でした。

Metrics with Twitter

はじめ

今時のまともなWeb系起業はみんな GrowthForecast を使っていると思います。

GrowthForecast を使わないとしても、グラフ化ツールを使ってサーバだけでは無いサービスの状態を見える化しているでしょう。

もちろんはてなユーザは

はてなカウンターですね!

僕の会社

僕のチームでも、ユーザ数やメタデータ数やコメント数裸威紅数、そのほか色々なデータ並びに手裏剣の販売数などもグラフに取っています。

社内の情報をグラフに取るだけだと、関わってるプロジェクト界隈の全体的な兆候まで見れなくて井の中の蛇蛙になってしまいますよね。

最近は競合のデータと自社データを、同じ条件で観測してグラフ化して全体的な傾向を取るような事もやっています。

どうやってる?

AnySan を使ってる

メッセージングプロトコルを統一したインターフェィスで使えるようにした bot 向けのフレームワーク。

use AnySan; use AnySan::Provider::IRC;
my $irc = irc 'chat.example.net', nickname => 'AnySan1',
    channels => { '#anysan1' => {}, };
AnySan−>register_listener( echo => { cb => sub {
    my $receive = shift;
    $receive−>send_replay($receive−>message);
} } ); AnySan−>run;

AnySan 対応プロトコル

Twitter Streaming API を用いて、特定のつぶやきで且つ特定のアプリケーションから呟かれた数を集計する。

こんな感じになります

CENSORD

だいたいソースコード

重要な事

自社サービスの使われ方の傾向と他社サービスとの違いがあるのかどうかというのを客観的に知る事ができます。

特に「Twitter で tweet されている」という、自社/他社サービス問わず客観的に同じ条件でデータを取れると言うのが重要です。

客観的な指標を取る事によりサービスの梶の切り方の参考になるかなーと思ってる。

GrowthForecast の姉妹品のご紹介

最近かぜぶろ先生が新作を作っています。

https://github.com/kazeburo/HRForecast

HR と GrowthForecast の違い

詳細は本人のリリース待ち。

ちなみに業務に投入されています。

まとめ

客観的なサービスメトリクスを取得する手段として Twitter を活用すると捗るという提案でした。

Big Regexp

最近の正規表現のトレンドと言えば...

住所正規化 API

まさか仕事になると思わなかった

この案件の基本的なエッセンスは6年前に発表しているのでさらっと説明。

多分込み入った話は YAPC でやろうかなとも思ってるし。。。

今回やるのは

過去のアウトプットからの差分ですね。

メインは Proj::M::Normalize の実装の話。

ハイフンの恐怖

住所の丁目番地を繋げる記号として - があるのですが、 Unicode 的にはグリフが似通っている MINUS SIGN とか EN DASH とかいっぱいあります。

自由入力だと-ー・‐ー-−―─とかが、全て違う文字なのにハイフンっぽい文字になります。これらの文字も実際に使われてるのを目撃しました。

土地区画関連の表記も自由なのは置いといて

北海道さんはだいぶルールがシンプルになった

基本的にが付く地名は[南北]X条[東西]Y丁目の用になるので、南6-西3-6南六条西3丁目6の用に表記出来る。

[南北]X条の変わりになんとか通を使う時もある。ただしなんとか通りの場合は、これらのルールとは違う街の作りになってる模様。

石川県恐いよ

恐いので今回は飛ばします。

丁目

下田市一丁目のような丁目が付く字は北は東北、西は上京区元一丁目と結構ありました。

本題の京都市ですが

やはり通り名表記と言うのがネックになってくるわけで、ジオドスさんの用に本気出せれば良いのですが検討した結果、住居表示に準拠させる事にしています。利便性を考えてサービスで使う場合は、そのまま表示してジオコーディングや同一住所チェックする時だけ通り名を削除するのがベターかなと考えてます。

通り名を抜くコード例(実際使ってるかはノーコメント)

# 通り部分を消す
$address =~ s/.+?通り?//;
# 入ったりあがったりくだったり消す
$address =~ s/.+?[上下入][るル]//;
# 東西南北に入るよ
$address =~ s/.*?[東西南北](?:入[るル]?|へ)//g;

通り名を抜くコード例(実際使ってるかはノーコメント)

# 入ったりあがったりくだったり消す
$address =~ s/.+?[東西南北][上下入]//;
$address =~ s/.+?[上下][東西南北]側//;
$address =~ s/^[東西南北]側//;
# 角っこ消してみる
$address =~ s/[東西南北]{1,2}角$//;
# 側消す
$address =~ s/[東西南北]側$//;
# 先頭の丁目を消す
$address =~ s/^\d+丁目//;

まとめ

仕事にならないだろうと思っててやってた事でも、いつの日か仕事になっちゃう冗談みたいな出来事が本当にあるので、ネタプログラミングでも本気で取り組みましょう。

あと、京都市の住所の事勉強させてください><

MySQL UDF

ここまで来たら多分時間ないだろうから飛ばしてもOKだけど、時間が余れば住所正規化 UDF 作ったついでに距離計測 UDF やらジオコーディング周り UDF を作って、そこそこ UDF に慣れたので実際のコードを見ながら説明したいなと。

まとめ

MySQL UDF 作るのは簡単

超 LT

このプレゼンツールに関して

最近 impress.js っていうプレゼンツールが流行っているそうなんですが、一昨日会社の技術勉強会的なので clouder さんが markdown 記法から、このツールに変換するのを書いたという発表をしたので早速使いました。

リポジトリはこちら

https://github.com/yoshiki/markdown2impress

ちょっと気にくわないとこあったので僕もパッチ送るのでみんなも使ってぱっちおくりまっしょい!

ご清聴ありがとうございました

まえの LDeNA #1 で、二社+1名の合同勉強会だと言うのに、プレゼンの最後にリクルーティングのスライド入れてたせいだかんだかわかりませんが、今回は自重しとく空気っぽいですが一緒に働ける機会があったら働きましょう!続きは Web で。

Use a spacebar or arrow keys to navigate