markdown2impressってのを書きました。

https://github.com/yoshiki/markdown2impress

これはmarkdownで書いた文章をimpress.jsに対応したHTMLに変換するものです。impress.jsっていうのは、CSS3をつかって文字とかをぎゅんぎゅん動かすことのできるプレゼンフレームワークです(prezi.comにインスパイアされて作ったらしい)。

impress.jsを使ってプレゼンをゼロから作ってもいいんですが、HTMLをいちいち書くのめんどかったのでmarkdown形式で書いたものをそれ用に変換してくれたらいいなと思って書いてみました。基本的にはmarkdownで書いた文章の1つのセクションが1つのスライドになるようになっていて、githubのリポジトリのREADME.mdをこのプログラムで変換するとプレゼンに変換されます。

使い方は簡単で、
% markdown2impress.pl README.md
とやるだけでOK。

こうするとカレントディレクトリにindex.html、js/impress.js、css/impress.cssの3つのファイルが生成されます。

もしCSSを変えたければcss/impress.cssを直接編集してやればいいです。ちなみに生成されるcss/impress.cssは元のimpress.jsに含まれるcssをちょっとだけ加工してあります。

markdown2impressは、なにも指定せずにmarkdownを変換してやるとスライドの位置(縦横幅や位置)を勝手に計算してくれるのですが、以下のようにセクション内にHTMLのコメント形式でimpress.jsが理解できる data-x や data-y などのアトリビュートを書くことでスライドの位置を変更することもできます。
<!-- data-x="1000" -->
もちろん data-xやdata-y以外のdata-z、data-rotate、data-scaleなども使えます。

ちなみにコマンドラインのオプションとして以下が指定できるようになっています。
  • --width
    スライドの横幅(default: 1200)
  • --height
    スライドの縦幅(default: 800)
  • --column
    スライドの横の数(default: 5)
  • --outputdir
    出力ディレクトリ(default: current dir)

興味があったら使ってみてください。

※生成されるimpress.jsが最新ではない場合があるので、その場合は本家のjsとcssの最新版をコピってくれれば動くはずです。

なんかネットワークの問題を調べていたらtcpのリトライが発生している模様。
でもイメージトークしててもしょうがないので本当にリトライが発生しているのかtcpdumpで調べてみたんだけど、なにせ情報量が多過ぎる。

そんでtcpdumpの情報の解析方法を調べているうちにmiruoってのを見つけて、使ってみたら便利だったのでご紹介。

miruoはDSAS開発者の部屋の「高負荷サイトのボトルネックを見つけるには」で使い方とかも含めて紹介されています。

ダウンロードは↓からどうぞ。
TCPセッションモニタ「miruo」

これは便利だ。
githubにいろんな.gitignoreがまとまってるので、この中からコピったらいいよ。
https://github.com/github/gitignore
先日メインで使ってる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もできたりします。

検索

広告

最近のコメント

アイテム

  • 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