2008年09月29日
GNU GLOBAL + Emacs最強伝説
備忘録。
仕事で、emacs上でC++のコードを追いかけないといけない場面に遭遇。
「この関数ってどこで定義されてるんだろう」と言うときにいちいちgrepしていたのではめんどうだ。
と言うことで世の中にはGNU GLOBALという便利なモノがあるので試してみた。
情報元は
Emacs + GLOBALでソース読みを快適に
GNU GLOBAL [コードリーディング]
インスコ
公式サイトから落として./configureしてmake && make install。Root権限が無いのでHOMEにインスコ。
ソースのあるディレクトリへ移動し、以下のコマンドでインデックス作成。
$ gtags -v
$ htags -sa
でリンク付けされたソースコードをHTMLディレクトリ内に生成。
・Emacsでも利用する。
解凍したGLOBAL内のgtags.elをロードパスの通ったところにコピー。
そして.emacsに以下の設定を追加。
(autoload 'gtags-mode "gtags" "" t)
(setq gtags-mode-hook
'(lambda ()
(local-set-key "\M-t" 'gtags-find-tag)
(local-set-key "\M-r" 'gtags-find-rtag)
(local-set-key "\M-s" 'gtags-find-symbol)
))
(global-set-key "\M-e" 'gtags-pop-stack)(add-hook 'c-mode-common-hook
'(lambda()
(gtags-mode 1)
(gtags-make-complete-list)
))
gtags-pop-stackをglobal-set-keyにしているのは、local-set-keyでは候補一覧画面で有効にならないからだ。解決方法がよくわからなかったのでglobalに設定した。CtrlキーとAltキーだけじゃ修飾キーが足りない。もう一個ぐらい欲しいな。
M-t 関数定義にジャンプ
M-r 関数呼び出し場所にジャンプ
M-s シンボル参照先にジャンプ
M-e ジャンプ元に戻る
2008年09月17日
ルータの設定ミスった
家のネットワークの構成をいじっているときにそれは起こった。
ルータのWeb設定画面からスタティックルーティングの設定を変更中の出来事。
目的の設定を入力し、フンフン♪とご機嫌で設定の確認もせずOKボタンを押下。
次の瞬間表示されるはずの設定完了画面が出ない。そして無情にも表示される「ネットワークがタイムアウトしました」のエラー画面。
やっちまったZE☆
そう、ネットワークの設定をミスったおかげでルータへの経路が無くなってしまった。
どういう設定をしてしまったのかはわからないが、とにかく接続できなくなった。
我が家の別のマシン経由でのアクセスもダメ。携帯で外部からWebサーバのアクセスを試してみても当然レスポンス無し。
さて、どうやって復旧させるか・・・。
Web設定画面にアクセスできないとなると、Telnetによるネットワーク越しの設定か、ルータに直接シリアル接続するかだ。WebアクセスできないのだからTelnetもダメだ。しかし我が家には稼働中でシリアルポートがあるマシンがない。使っていない古いマシンにはついているがいちいち引っ張り出すのも面倒だ。
となると、ルータの初期化ボタンを押しながら電源を入れて工場出荷時に戻すと言うことになる。
しかし業務用ルータはセキュリティのため、たいてい初期IPアドレスが設定されていない。
例によってシリアル接続するか、RARPによるMACアドレスからのIPアドレス付与をしてからTelnet接続となる。
よし、LinuxマシンにRARPサーバをたててIPアドレス設定しよう。
$ sudo apt-get install rarpd
(Ubuntuリポジトリに接続できませんとかそんなエラー)
しまった!ネットにつながらないからRARPサーバインスコできないじゃん\(^o^)/
と言うわけでこのルータでの復旧はあきらめ、現在通常ルータとして活躍している旧ブロードバンドルータのWANに線を差し替え、設定も切り替えとりあえずネットワーク回復。
外部からのアクセスも確認したところで「繋がるならこれでいいんじゃね?」と言うことでいったん放置。
そしてUSBシリアルケーブルを買ってきて復旧作業。
設定の履歴が自動保存されているので、動作がおかしくなる前の設定で起動し、無事復旧。
さすが業務用ルータ。いたれりつくせり。
ちなみに使ってるのはRTX1100。この安定性は家庭用ルータでは出せない安心感。以前のルータはMN8300で、家庭用にしては2万円ほどと高めなんだけど、ハングアップするし、ファームウエアのバージョンアップも無しの絶賛放置プレイ。ネットワークの要であるルータにはお金をかける価値はある。
えーと、いつものように内容が無い記事を書いたのだけれど、何が言いたいかというと設定はちゃんと確認してからOKボタン押しましょうってことと、そもそもWebインターフェイスを使うと設定の実行と保存が同時に起こるので危険ですよと言うことだ。
Telnetから設定すると、設定の保存はsaveコマンドを実行するまでは永続メモリに保存されないので接続できなくなれば再起動するだけでOK。
2008年09月14日
Androidで2ちゃんブラウザをちょっと作ってみた
2ちゃんブラウザが無い携帯プラットフォームは日本では流行らないらしいのでつくってみた。
と言っても半日ぐらいでさくっと実装しただけなのでしょぼしょぼだけど。

2ちゃんブラウザって2ちゃんAPIをいろいろ叩いたりしないといけないのかと思っていたけど、全然そんなことは無く、生データをパースするだけだったので楽だったな。
難しいのはいかに便利なツールを作るかと言うところだと実感。
特に携帯端末だと画面が小さく、表示できる物が限られているので、何を表示する表示しないかの選択が難しそうだ。
普通に2ちゃんブラウザを作っても面白くないので、今回は2ちゃんにアクセスする部分をServiceで作成してみた。
ServiceとはNTサービスやDaemonみたいな物のAndroid版で、GUIプログラムが終了してもServiceは裏で動き続けることができるヤツ。
よって別のプログラムを動作中だとしても、お気に入りスレを監視し、投稿があればNortification Managerを使い通知するみたいなことが出来る。
また、Serviceは他のプログラムからもRPC的に呼び出すことが出来るので、この2ちゃんブラウザの通信部分の機能を使って新たに別のアプリを作成するなんてことも出来るようだ。
RPC的に呼び出すときに、データはシリアライズのようなことをするんだけど、AndroidではSerializeではなくParcelableと言うのを使う。
こいつの情報が全然無くてちょっとはまったのでメモ。
Parcelableを実装したクラスと同じパッケージにParcelableの定義ファイルであるaidlファイルを作成するのだけど、同じディレクトリに置くとエラーになってしまった。
srcとは別にaidlディレクトリをビルドパスに追加し、同じパッケージなんだけど別のディレクトリにすると解決。
情報は以下から。
Android Hack - Parcellable in eclipse
後はSDK 0.9βから、権限チェックが厳しくなったので、「ネット使うよ」宣言をしないと使わせてくれない。
しかしその権限エラーがUnknown Errorとか言われるので一瞬まよった。
Manifest.xmlのmanifestタグの中に以下の行を追加。
<uses-permission android:name="android.permission.INTERNET" />
ちなみにアプリの名前のBettikはハイペリオンって言う小説に出てくるアンドロイドの名前。
まだこの小説全然読んでないけど・・・。
A.Bettikと書くのがより正しいけど、なんだかウイルスの名前みたいだったのでAは外した。
W32.Bettikとかだったらますますウイルスにありそうな名前だ。
Serviceを使い、2ちゃんブラウザの作り方もわかったので、あとはアプリを作り込みをするだけとなった。
知的好奇心は満たされたのでひとまずこの状態で置いておく。
日本でAndroidが発売されるなら、出る前ぐらいには作り込んでリリースするかー。
久々にフットサルをやったら壮絶に疲れた。
今日はもう寝よう。
2008年09月11日
アスペクト指向プログラミングで自動ログイン処理
一時期オブジェクト指向プログラミングの次はアスペクト指向プログラミングだ!とか言われていたけど、Web開発してなければあまり使う機会がない。(置き換わるものではないのでこの説明は正しくない)
しかし、今回例のサイトに自動ログイン機能を付けることになり、アスペクト指向プログラミング(以後AOP)が必須となったので使ってみた。
通常のログイン機能は、あるフォームにID、パスワードを入力しSubmitするのでログイン機能が一カ所に集中しているので問題ない。
しかし自動ログイン機能は、ログアウト状態の時にどこかのページを見たら、そのページの処理の前に自動ログイン処理を行わなくてはならない。そして何事もなかったかのようにリクエストされたページを処理し表示する。
AOPが無ければすべてのActionのメソッドの開始時に"自動ログイン処理"を自分で追加しなくてはならない。
しかしAOPがあれば「この処理をすべてのActionのメソッド開始前に実行してね」と書くと、後は自動でやってくれる。
AOPを使うことで便利になるような横断的関心事はそれほど多くない。
例としては今回のような自動ログインとかトランザクション管理とか、AOPの説明で良く出てくるロギングぐらいか?
SeasarだとAOPもサクッとできたのでメモを残しておく。
まずorg.aopalliance.intercept.MethodInterceptorをimplementsしたクラスを作成する。
これが織り込まれる処理となるので、処理をinvoke()に書く。
今回はこんな感じだ。
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
HttpServletRequest request = getRequest();
HttpServletResponse response = getResponse();
execAutoLogin(request , response);
Object result = methodInvocation.proceed();
return result;
}
methodInvocation.proceed();で実際の要求された処理を実行している。
SAStrutsの場合、戻り値は表示するJSPなので、そのままreturnする。
HttpServletRequestなどはS2Containerから取得する。
S2Containerはpublicなフィールドにしておくと勝手にDIされる。
よって
HttpServletRequest request = (HttpServletRequest)container.getComponent(HttpServletRequest.class);
などして取得。
そしてapp.diconに
<component name="autoLoginInterceptor" class="foo.bar.AutoLoginInterceptor"/>
とかしてコンポーネント登録。
次に、実際にActionに処理を織り込む設定をする。
Actionをカスタマイズするためのcustomizer.diconを修正する。
コンポーネント名がactionCustomizerのところに
<initMethod name="addAspectCustomizer">
<arg>"autoLoginInterceptor"</arg>
</initMethod>
と追加する。
これで完了、楽ちんぽん!
自動ログイン処理は以下のように実装した。
通常ログイン時に、乱数を生成し、その乱数をさらにSHA-256でハッシュしキーを作成する。
そのキーを"チケット"としてCookieに保存。同じチケットをユーザ情報としてDBに保存。
ログアウト状態でページを表示しようとすると、CookieとDBのチケットを比較。同じであれば自動ログイン成功。
成功すると新しいチケットを発行しなおして次回の自動ログインに備える。
発行し直すことで同じチケットは1回限りしか使用できないようにする。
また、自動ログインした場合はセッションに自動ログインフラグが立ち、そのフラグが立っている場合にアカウント情報修正など重要な処理を実行する場合は再度認証を行うようにする。
ログアウトボタンを押下した場合はチケットを破棄し、自動ログインを無効にする。
とりあえずこんなもんでいいっしょ。
自動ログインは本来セキュリティ上好ましくないけど、特にクリティカルな情報を扱うわけでもないしこのサイトでは良いよね!
2008年09月10日
Android Developers BlogのAndroid Marketの記事をちょっと翻訳してみた。
興味があったので勉強がてらの翻訳。
元記事
Android Market: a user-driven content distribution system
学生時代は英語が5段階評価の2だったので信頼性はありません。
Android Market : ユーザ主導のコンテンツ配布システム
Posted by Eric Chu, Android Mobile Platform on 28 August 2008 at 10:15 AM
開発者と話すとき、話題になるのはどのようにユーザにアプリケーションを手にしてもらうかです。
なので今日Android Marketの詳細をお伝えすることができて、幸せに思います。
Android Marketはオープンなコンテンツ配布システムで、エンドユーザが様々な種類のコンテンツを見つけ、お金を払い、Android端末に対しダウンロードしてインストールすることができます。
このコンセプトはシンプルで、Googleのインフラ、検索、関連性の技術を活用し、あなたのような開発者によって作られたコンテンツとユーザをつなぐことです。
YouTubeのようなユーザのフィードバックと評価システムを備えたシステム上で、作成したコンテンツを配布することができます。
私たちは"Store"よりも"Market"を選択しました。なぜなら開発者にはオープンで配布を邪魔されることがない環境が必要だと感じているからです。
(訳注:Apple Storeの混乱に対する皮肉ですねw Apple様のお店においてもらうのではなく、自由な"マーケット"だと)
YouTubeと同じように、コンテンツを公開するには簡単な3ステップで行うことができます。
配布登録をし、コンテンツをアップロードして、解説文を書いて"公開"するだけです。
また、あなたのビジネスとコンテンツを良くするのをお手伝いするために、ナイスなダッシュボードや分析ツールを提供します。
早めの詳細を書いたのは、最初のAndroid端末がリリースされたときにあなたの準備ができるよう手助けになると思ったからです。
最初の端末がリリースされたとき、Android Marketのベータバージョンが利用できると期待してください。
しかしまだ開発中で最終決定ではないので、フリーソフトのみの配布ができると思っておいてください。
少したったら、Android Marketをアップデートして課金ソフトの配布に対応します。
バージョン管理やマルチプルデバイスプロフィールサポート、分析ツールなどもその時対応します。
下に、Android Marketでアプリケーションをダウンロードする流れのスクリーンショットを張っておきます。
(訳注:貼り付けるめんどいから元記事見てね)
市場の追加によりAndroid関連がより賑わってきています。
私が見たところ、サポートとすばらしいコンテンツによってAndroidはヘブン状態!!と言えます。
数ヶ月後にそれらが稼働して、あなたたちと一緒にAndroid Marketを作り上げることを楽しみにしています。
また、そのときにはより多くの情報を共有したいと思います。
後半疲れたのでてきとー
Android携帯発売へ
これが世界初のAndroidケータイだ! 製品画像を一挙に公開
意外と早かったな。
画面を見る限りAndroid SDK 0.9のバージョンとほぼ同じのようだ。
SDKと同じレベルだとするとデフォルトで入っているガジェット等は少なめで、いろいろ自分でアプリを入れないとできることは限られている模様。と言っても電話機能にメール、Web、GoogleMapなど一通りは入っているが。
Android prototype Q&A video and transcript plus hardware details
によると、スペックは
528MHz Qualcomm processor
Synaptics capacitive touchscreen
3.6Mbps HSDPA connection
128MB of RAM and 256MB of flash
だそうだ。
それにしても・・・。
> この仕上がりだと、iPhoneよりも一般ケータイユーザー受けするかもしれませんね…
ねーよwwwwっww
むしろiPhoneの場合は何も知らずAppleのだからと、勘違いして買ってしまうから問題になるのでは。
一般ユーザ → Appleのケータイ?かっこいいしおもしろそ。 → なにこれケータイかと思ったら全然使えね。
と言う流れかと。
かといってGeekにはiPhoneは受けられているとは言い難い。
iPhoneのAppleに管理されてる感が合わないのかな。
BIG APPLE IS WATCHING YOU!!
AndroidはGoogle発だし話題にはなるだろうけど、まだまだアプリも出そろってないししばらくはGeekにしか売れないだろうな。
俺は購入決定だけど。
Androidはオープンソースと言うことでLinux文化の予感が今からするぜ。
「○○の機能がないんですが?Androidつかえねー」
「オープンソースだしおまえ作れよ」
わくわくっ!!
2008年09月08日
右クリックメニューに「xyzzyで開く」を追加
サクラエディタは内部コードがSHIFT-JISだし不便だなぁ(ユニコード版もあることはあるが)。meadowさんは起動が遅いし印刷が弱いしなぁ。
と思っていたら僕たちにはxyzzyがあるじゃないかと思い出してさっそくインスコ。
emacs似のエディタなのに起動がメモ帳並みの爆速ですばらしい。
しかしサクラエディタでは設定が簡単にできた右クリックによる「サクラエディタで開く」のメニューが無いのが不便だ。
と言うことで設定してみた。
参考にしたのは以下のページ。
ファイルを右クリックしたときのメニューに「○○で開く」を追加
詳細はリンク先ページを見ればわかるけど簡単にメモだけ。
regeditでHKEY_CLASSES_ROOT\*\shell以下に適当なキーを作成。キーの値がメニューで表示されるラベルになる。さらにそのキーの下にcommandと言うキーを追加。このキーの値が実行される。
よって"C:\Program Files\xyzzy\xyzzycli.exe" "%1"のように入力。
xyzzycli.exeを指定することで、xyzzyがすでに起動していた場合多重起動せず一つのエディタ内で開いてくれる。
しばらくxyzzyを使ってみよう。