”諦めた時が終わる時。
諦めなければ終わらない。
いつまでも結果が出ない努力は、努力する向きが違っている。”

久しぶりに自分のTumblrを見てたらこんな名言をクリップしてた。
ベタベタでけっこう使い古された言葉だけど、この短い文に大事な事が集約されてる気がする。
1行目2行目は大学生の頃に友人にも言われた言葉でもある。芸人になるのを諦めない的な話だったと思う。
スケールはだいぶ小さいけど、コードを書いてる時システムを設計してる時にぴったり当てはまる。時間的な問題は解決できないかもしれないけど難易度的なものは諦めなければ何でも解決できる。加えると、以前誰かがやったことのあるやつは必ずできる。
それを簡単に諦める人間にエンジニアとして成長する見込みなし。

3行目は常に意識しておかないと流されてしまう。
最適な努力する方向性というのは自分のやりたい事、信念に従って決めるものであって、他人(会社)が決めるものではない。
その他人が決めたゴールに向かって努力するのは、成長を妨げたり鈍化させたりする。ここでいうところの「向きが違う」場合が多い。
フォームばっかりだったり、CMSばっかりだったりと会社の業務内容と自分の実力の枠を越えることはあまりない。
他人からから提示される努力目標は、怒られない為の努力であったり、ルールに沿う為の努力であったりというのも多い。しかも、業務に関連するものに限られてるくるので視野も狭くなりがち。最悪視野が狭くなってる事にも気づかない事もある。
ルールが常に正しいわけでもないし、怒られたからといって自分が悪いとは限らない、空気を読まないことが悪いわけでもない。
これでも成長はするが、そんな後輩が会社にいたとしても脅威を感じない。

  • 自分が正しいと思ったものを作る事。
  • 会社に目標を定めてもらわず、自分で目標を定める事。
  • 誰にも負けない事。
  • 会社に雇われていたらその期待値を上回る事。

普段書かない内容を書くと纏まらなくなったけど要はこういう事。
別にエンジニアじゃなくても当てはまると思う。

本日もperlネタ。
ブログやニュースサイトから本文だけ抽出したい時に非常に便利なcpanモジュールにHTML::Featureというものがあります。
設計も非常に秀逸で本文を抽出するロジック(エンジン)もモジュールで選ぶことができます。

use HTML::Feature;my $url = "http://hogehoge.com/blog/entry01.html";my $f = HTML::Feature->new(
 
engines => [
'HTML::Feature::Engine::LDRFullFeed',
'HTML::Feature::Engine::GoogleADSection',
'HTML::Feature::Engine::TagStructure',
],
user_agent => 'hogehoge bot',
);
 
my $res = $f->parse($url)->text;
print $res;

本来は、これだけで本文が取得できる… はずが、PODの通りユーザーエージェントを指定すると実は下記のようなエラーが返ってきます。
Can't locate object method "user_agent" via package "LWP::UserAgent" at /usr/lib/perl5/site_perl/5.8.8/HTML/Feature/Fetcher.pm line 23.

内部で使ってるLWP::UserAgentに渡す際にエラーがでてるようです。
LWP::UserAgentではユーザーエージェントを指定するのにuser_agentではなくagentと指定するのでその通りに、Fetcher.pmを少し書き換えます。

# $fetcher->user_agent( $config->{user_agent} );

$fetcher->agent( $config->{user_agent} );

これで再度実行すると問題なくhogehoge botというユーザーエージェントが相手のサーバーログに残ります。

user_agentの指定は必須ではないけど、デフォルトではlibwww-perl/#.###というユーザーエージェント名になってしまいます。
サーバーによってはユーザーエージェントがlibwww-perl/#.###だとリクエストを受け付けないこともあるので独自のユーザーエージェント名を指定しておきます。

最近5年ぶりに本格的にperlを書いてるんだけど、ほんと楽しい。
webアプリ作るのはPHPが一番簡単&早いと思うけど、perlは、”There’s more than one way to do it”と言われる通り色んなやり方があって完成するまでのプロセスが楽しめる言語だと思う。

ただ、他の言語でもよくある問題だけど、perlのUTF8は扱いにくい。
よくわからず書いていると必ず出くわす以下のエラー。
Wide character in print at scraper.pl line 12.

久々にperlを書いてるとUTF8フラグとるのは、Encode::encode? Encode::decode?って時があるのでまとめとく。
他にも色々やり方はあるけど、一つだけです。

perlのデフォルトでは以下は6となります。
print length("モダン");
lengthはバイト数を返すのであながち間違いではないけど、見た目も気持ち悪いし内部的にUTF8で動いてないみたいです。

3を返す為には、下記の通りにします。
use utf8;
print length("モダン");

このuse utf8で内部もutf8で動きます。
use utf8を使うとperlの内部で動いてるutf8にutf8フラグというものがつきます。

ただ残念なのがuse utf8を使うと以下のコードでエラーがでます。
use utf8;
print "モダン";
→Wide character in print at scraper.pl line 12.

これはソース直書きのprint対象の文字列(モダン)にutf8フラグがついているのが原因です。

私の場合はスクリプトにはすべてuse utf8をつけて、出力の際にEncodeモジュールを使ってutf8フラグを除去して出力させています。
encodeという言い方がややこしいけど、utf8除去することがencode、逆にutf8フラグを付与する場合はdecodeとなります。
use utf8;
print Encode::encode("utf8", "モダン");

DBに保存させる時は、utf8フラグを除去して保存してくれます。
DBから値を取得した時もutf8フラグは除去されたままなので、encodeモジュールなしで出力します。

3月 1st, 2010perlでMeCabを使う

久しぶりにMeCabをいれることになったけど超絶簡単になっててびっくりした。
yumでインストールできます。

yum mecab mecab-devel ipadic
ipadicは辞書です。辞書がないとmecabは機能しません。
一昔前までeucだのsjisだとutf8だの言ってたけど、yumで入れるとutf8の辞書ができ上がっています。

perlで弄る為にcpanモジュールもインストール。
cpanのシェルでインストールするとコケるので、無理やりインストール。
force install Text::MeCab

途中で辞書のエンコーディングは何か聞かれるのでデフォルトのutf-8を選択

これでperlからmecabを使う準備が整いました。

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
use Text::MeCab;
 
my $m = Text::MeCab->new();
my $text = "このブログは俺のメモです。";
  
for (my $node = $m->parse($text); $node; $node = $node->next) {
print $node->surface, "\t", $node->feature, "\t", $node->cost, "\n";
}

実行するとこんな感じです。

この 連体詞,*,*,*,*,*,この,コノ,コノ -664
ブログ 名詞,一般,*,*,*,*,* 7643
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 7663
俺 名詞,代名詞,一般,*,*,*,俺,オレ,オレ 11792
の 助詞,連体化,*,*,*,*,の,ノ,ノ 12160
メモ 名詞,サ変接続,*,*,*,*,メモ,メモ,メモ 14654
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 17196
。 記号,句点,*,*,*,*,。,。,。 13806
BOS/EOS,*,*,*,*,*,*,*,* 12270

残念ながらこのままでは「俺のメモ」が分解されてしまいます。
一つの単語として認識させるにはユーザー辞書に登録する必要があります。
登録の仕方はこの記事を参考にしてください。

PCサイトから長らく離れている間にjQueryが1.4になりました。
何が変更されて何が追加されたっていうのは「jQuery 1.4 API Cheat Sheet — Future Colors」というサイトでうまくまとめられています。
bind()で複数イベントが追加できたり、処理を遅らせるdelay()等があったりします。

基本的に互換性は保ってるとのことだけど、そのままのコードだと動かないところもあります。

例えば1.3だとこれでtitleというnameのinputの値がとれたけど1.4ではエラーになります。
$('input[@name=title]').val();

1.4では下記のようにtypeを明示する必要があります。
$('input:text[@name=title]').val();

jqueryのfunction名は直感的でわかりやすいなぁ。

もうだいぶ前の話しになるけど、なんとなくTwitterAPI+OAuthというのが触ってみたくて、こちらのブログを参考にプロトタイプを作りました。
参考にというか、ほぼコピペで。

検索とかポストとかは一通り問題なく行えたのですが、OAuthで認証後の自身のユーザー名の取得で躓きました。ad.lyとかやってるOAuthで認証後にユーザー名を表示してるやつ。

きっとトリッキーな事をしてると思いきやあっさり取れました。
躓いてたのはアクセストークンと同時に取れると思ったから。
もらったアクセストークンで、すぐにverify_credentialsというAPIを叩きユーザー名を含むユーザー情報を取得できます。
http://twitter.com/account/verify_credentials.xml
これでOAuthを行ったユーザーの情報がとれます。


cactiをyumでインストールしすると、そのままだと一部画像が表示されません。
これは画像を生成するRRDtoolのバージョンが違うだけでGUIの設定画面で直すことができます。

左のメニューのsettingsを選択。RRDtool utility versionを1.0から1.2.xにするだけでOK。

cactiは設定がGUIでできるのはいいけど、どうしようもないくらい使いにくいなあ。

mySQLに限らず、バックアップの手段は熟知してても、いざ不測の事態が起こってデータをリストアをしようとしたらやり方がよくわからないってことがあります。
RDSでもインスタンスを作成時、何も指定してなくてもバックアップの設定を行ってくれますが、リストアは当然コマンドを記述しなくてはいけません。

RDSのバックアップには手動によるスナップショット方式と自動でバックアップを行ってくれるものの2種類ありますが、今回の説明は後者です。
バックアップする期間はインスタンス起動時のオプション(backup-retention-period)で指定できるけど、指定しなくても1日間のデータをバックアップとってくれます。
例えば今が2010-02-02 23:30だとしたら 2010-02-01 23:30から2010-02-02 23:25のどのタイミングのデータでもリストアすることができます。
リストアは下記コマンドを使います。

rds-restore-db-instance-to-point-in-time new-db -s kowareta-db -r 2010-01-29T16:00:00Z

リストアは別インスタンスを立ち上げるので第一引数で新しいインスタンス名、
-sはバックアップしたいデータベース名、
-eはどの時間の状態に戻すか(指定はUTCで)
となります。

リストアはデータの量によるけど10分前後かかります。その間statusはcreatingとなります。

ついに始まりました。
モバゲーはmixi同様オープンソーシャルに参画してるので開発手法はmixiと非常に似たものになっています。
オープン初日にリリースされたゲームのほとんどがmixiで人気のあったアプリのモバゲー移植版でした。
3月には正式リリースということで今後が楽しみです。

mixiアプリモバイルはピコピコmixiと差し変わる形で登場したけど、モバゲーの場合既存ゲームにオープンプラットフォームのゲームが加わった形です。
ユーザーのことよく考えてるんが、サイトをみるとこの既存ゲームとオープンプラットフォームのゲームの境がユーザーからしたらほとんどわからいようになってます。
作り手のしては分けといてほしいと思うけど、確かにオープンプラットフォームのゲームをよりすぐって選びたいってのは非常にレアな話なんでこれは非常に素晴らしいこと。
確かに、M1F1層に「こちらのゲームはモバゲーオープンプラットフォームで動作するゲームですよ」とか言われても意味がわからないし、教える必要もないと思う。

どうでもいい事で、一つ気になったのが「モバゲーアプリ」とはいわないんですね。それどころか「アプリ」と呼ばない。「モバゲーオープンプラットフォームで動作するゲーム」という記述ばかりで「アプリ」とはどこにもなくモバゲーでは意識して使ってない感じ。
そういえばPC版では便利ツールや単純にページに貼り付けるだけのアプリはあるけどモバイル版はゲームしかない。
なるほどなーと思ったけどやっぱり短くて呼びやす呼称はほしいな。

巷でtwitterのbot作りが流行ってるみたいなので便乗してみた。
次の給料日までの残日数をカウントダウンして朝の9時にお知らせする給料日bot。

給料日が10日ver.
http://twitter.com/kyuryobi_10

給料日が25日ver.
http://twitter.com/kyuryobi_25

探せば同じのがありそうな気がするけど見つける作る気が失せるので探してません。
これは何かを作る上で重要かも。

3年前にも実はtwitterAPIを使って色々仕事してたけど、その時は認証はOAuthなんてなくベーシック認証でした。
twitterではOAuthを押してるらしく、今回はOAuthを使いました。
mixiやモバゲーの2-legged OAuthに慣れてしまってたので一瞬戸惑ったけど、今ではphpのライブラリが整備されてて導入はあっさりいけまいした。
OAuthを使ってうれしいことが投稿クライアント名が入れれること。

about 20 hours前 from 【10日】給料日bot

といった具合に任意の投稿クライアント名(アプリケーション名)とリンクが埋め込めます。
これがベーシック認証だとすべて「from API」になってしまいます。

今度はまともなbotを作ってみよう。