先日メインで使ってるDoCoMoのフィーチャーフォンをGalaxy Nexusに機種変したのですが、それまでiPhoneで受け取っていたim.kayac.comの通知をAndroidでも受け取りたくなったのでどういう方法があるのか調べてみました。

im.kayac.comはGoogle Talk(Jabber)でも通知ができるので、やるとしたらその方向しかないんだろうなぁと思いつつググってみると案の定Google Talkのアプリで通知を受け取るっていう記事がいくつかみつかりました。

でも、なんか「素のGoogle Talkで通知を確認するのはなんかクールじゃない!」

と思っちゃったので、それ以外の方法ないのかといろいろ探してみたらみつかりました。
(みつかったというかアプリを利用して足りない部分は自分で作ったんですが...)

簡単に方法を説明しちゃうと、自前でXMPPのクライアントを立てて、im.kayac.comからの通知を「Notify My Android」っていうNotify専用のアプリに流すという方法です。

簡単に書くとこんな感じ。
[im.kayac.com] -> [XMPP client] -> [Notify My Android]


ちなみにNotify My Androidは有料です。
有料だけど、今回この実装をやってみたら買う価値はあるかなと。
缶ビール2本我慢すれば買える値段ですし(※お酒はあまりのみませんが!)。

ってことで手順を説明します。

  • AndroidマーケットでNotify My Androidを購入し、Notify My Androidのサイトでアカウント登録とAPI Keyの発行を済ませておく。
  • 以下のスクリプトを使って、im.kayac.comのGoogle Talkのアクティベーションします。
    実行にはAnyEvent::XMPPのインストールと、pitを使ってgtalkって名前で設定(usernameとpassword)を追加しておく必要があります。

    実行は引数にim.kayac.comで発行されたアクティベーションコードを渡すだけ。
    % ./register.pl アクティベーションコード
    session ready at ./register.pl line 27.
    connected at ./register.pl line 31.message from api@im.kayac.com/123456: Your jabber account has been activated! at ./register.pl line 36.
  • あとは以下のスクリプトを起動するだけです。
    実行にはWebService::NotifyMyAndroidのインストールと、pitを使ってnma(Notify My Androidの略)って名前で設定(apikey)を追加しておく必要があります。

    実行は普通に以下な感じ。
    % ./server.pl &
    ちなみに、
    request to https://nma.usk.bz/publicapi/verify?apikey=YOUR_API_KEY failed at ./server.pl line 19
    とかでる人はLWP::Protocol::httpsが入ってないからだと思います。
これでサーバさえちゃんと動いてたら、Notify My Androidに通知が来るはずです。 興味ある方がいたらやってみてください。
Yokohama.pm #8で「Plack on SL4A」というタイトルでLTしてきました。

実はこの話は元ネタがあって、去年のperl.krのAdventカレンダーで紹介されていたものを実践してみたものになっています。

本当は、これを元にAmon2などのフレームワークを動かしたかったのですが、XS依存の問題があってそのXSモジュールをインストールしようと頑張ったのですが、どうしてもインストールできなかったため今回のPlackのインストールまでの話になってしまいました。

もうちょっとだけSL4AでXSを動かせるか試してみたいと思っていて、進捗があったらここでお知らせしたいと思います。

ちなみにSL4AのXSのmakeできない問題は、すでにSL4AのIssueに上っていて、このIssueの最後の方のポストでgithubのPerlのブランチを切って書き換えたやつでビルドできたという話が出ているのですが、ARMのクロスコンパイル環境を用意してやってみたもののうまくいなかいんですよねぇ...。
最近Androidの開発をしていまして、例にもれずEclipseが体に合わないため(というかEmacsが好きなため?)、Emacsで開発をしています。

しかし、いままでJavaで本格的に開発したことなかったのでEmacsにおけるJavaの開発環境がまったく整備されていないので、EmacsでもうちょっとJavaの開発がしやすくする便利なモードないのかなと調べてみました。

いろいろ調べてみたら、JDEE − Java Development Environment for Emacsってのがあったのですがなんかごてごてしていて、そんなモリモリの機能いらないんだよなぁと思っていたら「ajc-java-complete」っていうのをみつけました。

ajc-java-completeは名前の通りauto-completeやyasnippetと連携して補完することをメインにしたものになっていて、今も開発が継続しているようでなかなかよさげ。ということでさっそくインストールしてみました。

  • auto-complete のインストール

    http://cx4a.org/software/auto-complete/ からダウンロードしてきて、この辺を参考にインストール。

    .emacsに以下のような設定をしておくとよいでしょう。
    (require 'auto-complete)
    (global-auto-complete-mode t)
    (define-key ac-complete-mode-map "\C-n" 'ac-next)
    (define-key ac-complete-mode-map "\C-p" 'ac-previous)

  • yasnippet のインストール

    http://code.google.com/p/yasnippet/ からダウンロードしてきて、この辺を参考にインストール。

    .emacsに以下のような設定をしておくとよいでしょう($PATH_TO_SNIPPETはsnippetをインストールしたディレクトリね)。
    (require 'yasnippet-bundle)
    (yas/initialize)
    (yas/load-directory "$PATH_TO_SNIPPET/snippets")

  • ajc-java-complete のインストール

    https://github.com/jixiuf/ajc-java-completeからcloneしてきて、この辺を参考にajc-java-complete自体をインストール。

    なお、ajc-java-completeは、auto-completeに付属するpopup.elにパッチをあてないといけないらしく、ajc-java-completeのパッケージに付随するpopup.elを、すでにインストールしたauto-completeのpopup.elと入れ替える必要があります。

    あと、Javaのクラスを補完させるためにタグファイルを生成する必要があります。そのためのJavaのプログラムが添付されているので、それを以下のようにjavacでコンパイルしてから実行する必要があります。
    % javac Tags.java
    % env CLASSPATH=$PATH_TO_ANDROID_HOME/platforms/android-11/android.jar:/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar:. java Tags

    この例ではAndroid開発もしたいのでAndroidのSDKのパッケージも含めています。
    (なお、classes.jarのパスはMac OS X用なので適宜自分の環境に合わせて変えてください)

    んで、最後に.emacsに以下のように書きます。
    (require 'ajc-java-complete-config)
    (add-hook 'java-mode-hook 'ajc-java-complete-mode)

以上でインストールが完了しました。

あとはEmacsを起動してFoo.javaとかやってみると補完がきくようになります。

補完以外の機能で言うと、「C-c i」でインポートしていないものを自動でインポートして(ファイルの上部に「import com.example.foo;」って挿入して)くれたり、クラス名のところにカーソルをもってきて「C-c m」とやるとそのクラスをインポートしてくれたりするものがあります。(ただし、なぜかextendsの後に書いたクラスはインポートしてくれず...)

ちなみに、さきほど補完用にタグファイルを生成したのですが、あれがけっこうな容量になっていて、それを起動時に読み込むため、初回のみですがちょっと時間がかかるようです。これ直したいとajc-java-completeをいまいじってるところです。なにかいい案があったらまたお知らせします。(っていうかpull requestしたい)

それともう1つ、自分はMac OS XのEmacsでインポート機能を使うとダイアログがウィンドウで出てうざい(のとEmacs自体が固まったりする)ので以下のパッチをあててます。
--- old/ajc-java-complete.el	2011-07-08 00:00:28.000000000 +0900
+++ new/ajc-java-complete.el	2011-07-08 00:00:12.000000000 +0900
@@ -938,7 +938,8 @@
 before that it will use y-or-n-p ask user to confirm "
   (let ((import-class-buffer "*ajc-import-java-class*")
         (import-class-window) (user-confirmed-class-items-list)
-        (java-buffer (current-buffer))(java-window))
+        (java-buffer (current-buffer))(java-window)
+        (last-nonmenu-event t))
     (setq case-fold-search nil)
     (if (and import-class-items-list (> (length import-class-items-list) 0))
         (progn
GNU Parallelがすごすぎて生きるのがつらいを見て使ってみました。

そもそも複数のサーバのaccess_logをtail -fで一括で見たかったからです。

GNU Parallelからダウンロードして
% ./configure
% make
% make install
でインストールは終了。簡単!

Perlで書かれてるんでコンパイルとか必要ないっす。

インストールしたら目的のサーバ群に対して tail -f /path/to/access_log を発行するだけ。
% parallel -u ssh {} 'tail -f /path/to/access_log' :::: /path/to/server_list.txt
こうするとserver_list.txtに列挙されてるサーバに対してtail -f /path/to/access_logが実行されます。

-u っていうオプションを付けないと出力がバッファリングされちゃうので、tail -f するときは -u を付けないとだめです。

ちょっと引数にクセがあるけど慣れですね。
マニュアルは man parallel で見られます。

他にもこういうのあるけど、Perlで書かれてて使い易かったのでしばらく使ってみようと思います。
MacBook Airの11インチを遅ればせながら購入したclouderです、こんにちは。

購入したその日にさっそく開発環境を整えようとXcode4を入れて、iPhoneアプリ開発を...と思いきや、Perlの開発を始めたんですが、いくつかのCPANモジュールがインストール(コンパイル)できないのに気付きました。

コンパイル時のエラーは以下のようなもの。
lipo: can't open input file: /var/tmp/hoge.out (No such file or directory)
どうやらXSなどのコンパイルが必要なモジュールでこの現象がおこっているようです。いろいろ調べてみたら、コンパイルオプションに「-arch ppc」があるのにppcのアーキテクチャのファイルが適切な場所にないからエラってしまうようです。

なんでだよーと思いつつ、Xcode4のREADMEを見たら以下のような記述を発見。

Xcode 4 does not support developing for PowerPC; you must continue to use Xcode 3.2.6 to develop applications for the PowerPC architecture. The Custom Install section below has instructions to install both Xcode 4 and Xcode 3.2.6 on the same Mac.

「Xcode4じゃPowerPCのサポートしないぜよw」って書いてありますね。

どうしようかなぁと思いつつ、その後もいろいろ調べてみたらこれに対する解決方法を2つ発見しました。

1つはppcのアーキテクチャを無視してx86_64とi386だけでコンパイルしちゃう方法で、もう1つは(実は入っている)ppcのアーキテクチャのファイルを適切な場所に置いてしまうという方法があります。

1つ目は、以下の環境変数を設定してコンパイルする方法。
ARCHFLAGS='-arch i386 -arch x86_64'
これをドットファイルに設定するとか
$ env ARCHFLAGS='-arch i386 -arch x86_64' perl Makefile.PL
とかすると問題なくコンパイルできます。
この方法は「perldoc perlmacosx」っていうpodに書いてあります。
こんなpodがあったんですね!知らなかったよ。

そして、もう1つの方法は「Xcode4でPowerPC」に書いてありました。
適切な場所に(実はインストールされている)ppcのアーキテクチャのファイルのシンボリックリンクをはるという方法です。
$ sudo ln -s /Developer/Platforms/iPhoneOS.platform/Developer/usr/libexec/gcc/darwin/ppc /Developer/usr/libexec/gcc/darwin/
$ sudo ln -s /Developer/Platforms/iPhoneOS.platform/Developer/usr/libexec/gcc/darwin/ppc /usr/libexec/gcc/darwin/
どっちでも好きな方でいいと思うんだけど、個人的には後者の方法で対応しました。

なお、この現象はXcode4が出る以前にXcodeをインストールしていた環境ではおこらないので、特定の人しかこの問題に遭遇しないかもしれません。

困っている人がいたら、どっちかを試してみてください。

Perl CPANモジュールガイド - 冨田尚樹 CPAN本、献本頂きました!

ちょっと前に存在は知っていたのですが、4/8ついに出版ということで、tomi-ruさん、誠におめでとうございます!

内容としては、PerlのCPANモジュールを1コ1コ丁寧に紹介する内容となっていて、各カテゴリ毎にそのカテゴリで有名だったりよく使われるモジュールをわかりやすく説明するといったものになっています。

僕がいつもPerlのモジュールを探すときは、CPANの検索で有象無象のモジュールの海を泳いで、これはどうだろうってドキュメントやソースを見てみたり、もしくは「Perl やりたいこと」とかでぐぐって探したりということをやっていたりしましたが、これからはまずこの本でよさげなモジュールがないかを見てからになりそうです!

自分は本を1冊書いたことはないのですが、個人的に書く大変さはちょっとだけ知っていたりするので、これだけの分量のものを書くのはかなり大変だったんだろうなぁと想像しています。

tomi-ruさん、ほんとうにお疲れ様でした。
熟読させて頂きます。

Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション
売り上げランキング: 3184
いつも忘れちゃうのでメモ。

UNIVERSAL::isaは、UNIVERSAL::isa()を呼んでも自分のクラス(階層)内にisa()が定義されてればそっちを呼ぶようにするためのモジュール。

以下のようにmainでUNIVERSAL::isaをuseしないと、最後の2つのUNIVERSAL::isa()は1を返します。つまり本当のUNIVERSAL::isa()が呼ばれる。
package A;

sub new { bless {}, shift }
sub isa { "hoge" }

package B;

use base qw( A );

sub new { bless {}, shift }

package main;

my $b = B->new;

warn $b->isa( "B" );            # hoge
warn $b->isa( "A" );            # hoge
warn UNIVERSAL::isa( $b, "B" ); # 1
warn UNIVERSAL::isa( $b, "A" ); # 1

これに対して、以下のようにmainでUNIVERSAL::isaをuseしてやると、最後のUNIVERSAL::isa()もhogeを返す、つまりクラスAで定義されてるisa()が呼ばれている。
package A;

sub new { bless {}, shift }
sub isa { "hoge" }

package B;

use base qw( A );

sub new { bless {}, shift }

package main;

use UNIVERSAL::isa;

my $b = B->new;

warn $b->isa( "B" );            # hoge
warn $b->isa( "A" );            # hoge
warn UNIVERSAL::isa( $b, "B" ); # hoge
warn UNIVERSAL::isa( $b, "A" ); # hoge
そしてUNIVERSAL::canも同じようなことをしてくれます。

ちなみにUNIVERSAL::requireはぜんぜんこれらとは関係なく
Module->require;
って呼べたり
Module->require or die "Cannot required";
とかdieできたり、モジュールでrequireメソッドを使えるようにするものです。
useもできたりします。
emacsでTAGSを使ってるんですが、環境によっては参照先のファイルがfoo.el.gzってなってたりするとfind-tagしたときに見られないようです。

そんなときは、.emacsに下記のようにしてあらかじめjka-comprという圧縮ファイルを操作するライブラリをロードしておくと見られるようになります。
(load "jka-compr")
ちなみにemacsは、このようにloadをしなくてもgzip圧縮されたファイルを開くときは勝手にjka-comprを使ってるようです。

仕事でアプリのボトルネックを探しているという話をしたら、hideokiさんが

「YAPC::Asia 2010 で cho45 が紹介してた Devel::KYTProf がいいよー」

って言ってたので、使ってみたらだいぶよかったのでご紹介。

Devel::KYTProfの作者はid:onishiさんで、リポジトリはhttp://github.com/onishi/perl5-devel-kytprofにあります。

このモジュール、何ができるモジュールかっていうと(まぁcho45さんの発表動画見ればわかるのですが)、モジュール名とメソッド名を指定してやると、そのメソッドの処理にかかった時間をさくっと調べられるというものです。

たとえば Foo::Controller::Bar の baz() って関数の処理時間が知りたかったら、そのアプリケーションのメインモジュールに
use Devel::KYTProf;
Devel::KYTProf->add_prof( 'Foo::Controller::Bar', 'baz' );
って書くことで、STDERRに
123.456 ms [Foo::Controller::Bar] baz() | Devel::KYTProf:100
みたいな感じで処理時間とちょっとした情報が出力されます。よっぽどトリッキーなことしてるモジュールじゃない限り、これを使うことで処理時間を調べることができるはず。

あとadd_prof() は、第3引数を渡すことができて
Devel::KYTProf->add_prof(
    'Foo::Controller::Bar',
    'baz',
    sub {
        my ( $orig, $self ) = @_;
        return $self->foo_bar;
    }
);
とやると処理時間と共に$self->foo_bar の値がSTDERRに出力されます。

それ以外にも Devel::KYTProf->threshold( 100 ) とかやると、指定したものよりも処理時間がかかったもののみを出力するようにしたりと、いくつかのオプションが用意されています。

ちなみに Devel::KYTProf は、デフォルトでIO関係でよく問題になるようなDBI、LWP::UserAgent、Cache::Memcached::Fast、MogileFS::Clientなどのモジュールの設定が最初からされていたりします。それ以外にも調べたいという場合に上記の設定を自分でしたらよいという感じになっています。

なお今回、僕の場合はTTの[% foo %]の部分の速度が調べたかったので
Devel::KYTProf->add_prof(
    'Template::Stash::XS',
    'get',
    sub {        my ($orig, $self, $ident, $args) = @_;
        return ref $ident eq 'ARRAY' ? join(",", @$ident) : $ident;
    }
);
こんな感じにしてみました。
まぁ、結局問題はそこじゃなかったんですけどね...。

ということで、このDevel::KYTProfはかなりお手軽に細かい処理時間が調べられるので興味ある方は一度使ってみてはいかがでしょうか。
Yaml-mode 0.0.7 is now released.
This release include following bugfix:
* Fixed bug for 5th level's indentation becomes TAB character.
  See YAML spec 1.2 section 5.5. White Space Characters (ochko)
For additional information, please visit issues on github:
http://github.com/yoshiki/yaml-mode/issues/closed#issue/1

検索

広告

最近のコメント

アイテム

  • Perl CPANモジュールガイド - 冨田尚樹
  • yapcasia2009_tshirts.jpg
  • yapcasia2009_oreilly.jpg
  • android_sdk03.png
  • android_sdk02.png
  • android_sdk01.png
  • Yokohama.pm #4
  • F-03Aで撮った写真
  • F-03A
  • iMT

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12