Top Page: メイン
Previous Archive: book
Next Archive: DVD
,
,

iPhoneアプリにTwitterのxAuthを実装

XAuthTwitterEngine のダウンロード
aral's XAuthTwitterEngine at master - GitHub

Demoのコンパイル、実行
XAuthTwitterEngineDemoディレクトリをXcodeで開いて試してみる
XAuthTwitterEngineDemoViewController.h の13,14行目に申請して取得したConsumer key, Consumer secretを追記。

ここから本番
XAuthTwitterEngineDemoのXcodeからTwitter+OAuthディレクトリを本番プロジェクトにドラッグ&ドロップ

implement xAuth of twitter on iPhone App

libxmlを追加
プロジェクトツリー右クリック-> 追加 -> 既存のフレームワーク でlibxml2.dylibを追加

yajl(Yet Another JSON Library)のライブラリ追加
gabriel's yajl-objc at master - GitHub
からコンパイルしてもよいが、コンパイルされた静的ライブラリが
https://rel.me.s3.amazonaws.com/yajl/libYAJLIPhone-0.2.2.zip
に落ちてるので拾ってきて解凍、libYAJLIPhone.aをドラッグアンドドロップでフレームワークに追加

implement xAuth of twitter on iPhone App

検索パスの追加
Xcodeの プロジェクト -> プロジェクト情報の編集 の「ヘッダ検索パス」に以下を追加 (構成は「すべての構成」)

implement xAuth of twitter on iPhone App

プロジェクトをコンパイルしてみる

error: too few arguments to function 'yajl_alloc'
error: too few arguments to function 'yajl_free_error'
とエラーが出る

ソース書換え
YAJLライブラリのメソッド仕様が変わっているようなので MGTwitterYAJLParser.m の以下を修正

_handle = yajl_alloc(&callbacks, &cfg, self);
_handle = yajl_alloc(&callbacks, &cfg, nil, self);
yajl_free_error(errorMessage);
yajl_free_error(nil, errorMessage);

コンパイル
done.


,
,

[AS3]IExternalizable error

何度も忘れて悩んだのでメモ。

Actionscriptで通信系のアプリを書いているとき、writeObject / readObject でオブジェクトを送受信するときに

The class XXX does not implement flash.utils.IExternalizable but is aliased to an externalizable class

と言われる。

class XXX implements IExternalizableして
registerClassAliasして、
writeExternalとreadExternal実装しているか確認。

これがOKの場合、そのクラスがコンパイル対象になっていない可能性が。
Actionscript(に限らないけれど)はimportしてもコードの中で明示的に使われていないクラスをコンパイルしてくれないのでクラスが見つからずに上記のエラーが出る

対処法としてはコードの最初の方で

private static var compiledClasses:Array = [ XXX ];

のように書くことでXXXクラスをコンパイル対象に含める。

それでもNGの場合は無駄にそのクラスのインスタンスを作ってみるなど、コードの中で明示的にクラスを利用する。

サーバクライアントのシステムを書いていてクライアント同士がサーバを経由してオブジェクトをやりとりしたい場合、オブジェクトのクラスファイルがサーバ側のプロジェクトにもないとreadObject でexceptionするのが面倒。

とりあえずシンボリックリンクでごまかしているがどうするのがスマートだろうか。
独自プロトコル書くのは面倒だし。


,
,
,

ATNDのイベントのicalを取得するbookmarklet

ATNDでのお誘いが多くなってきて、ATNDに登録された各イベントのページにiCalデータへのリンクがないのが不便なのでbookmarkletを作りました。

ATND2ical

このリンクをブックマークして下さい。

リンクの上で右クリック → このリンクをブックマークする でOK。
ブックマークバーを使っている方はそこにおいておくと便利。
ATNDのイベントの詳細ページでブックマークを呼び出すとそのイベントのicalデータが保存できます

自分が参加登録したイベントすべてのiCalデータをダウンロードするには

my ATND events

こちらをブックマークに登録して下さい。
ATNDのマイページでブックマークを呼び出すと自分が参加登録したイベントのicalデータが取得できます。

ATNDのAPIを使ってevent_idで検索すればicalデータで取り出せるのだけれど、Content-Typeがtext-calendarでないのとicalの拡張子をつけた形で保存するのが自動でできないので、そこだけ自前サーバを使ってます。

google calendarにも使えます。

google calendarの場合は、以下のようにするとatndで登録したイベントが自動的にカレンダーに反映されます

google calendarにログインして・・・

atnd_gcal_1.png

左側の他のカレンダー」の右下の「追加」クリック

atnd_gcal_2.png

「URLで追加」をクリック

atnd_gcal_3.png

URL: のところに http://api.atnd.org/events/?format=ics&user_id=自分のuser_id
を入力。

自分のuser_idは ATNDでログイン後右上の自分の名前のリンクをたどったマイページのURLの末尾の整数です。

iCalにもURLを読み込む機能があると良いんだけど。
google calendarと同期すればできるが信頼性がイマイチ。


Read More ≫
,
,
,
,

filemaker server on Leopard

Leopard (Mac OSX 10.5)ではfilemaker server8 以前は動かない。
インストールできるが起動しない。

server8.5と server9はアップデータで対応可能。
server10はデフォルトで起動。
FileMaker ソフトウェアと Leopard OS について

64bitの場合、またはjava6の場合はこちらも当てる。
アップデータ - FileMaker

ここまで分かるのに4時間かかった。
filemaker server advanced、また買いましたさ。

FileMaker Pro 10 Advanced 日本語版FileMaker Pro 10 Advanced 日本語版


Amazonで詳しく見る
by G-Tools
FileMaker Server10 Advanced 日本語版FileMaker Server10 Advanced 日本語版


Amazonで詳しく見る
by G-Tools

Arduinoをはじめよう

ArduinoをはじめようArduinoをはじめよう
船田 巧


Amazonで詳しく見る
by G-Tools

Arduinoの超入門本。
Arduinoも日本で普通に買えるようになったし今までにもましてArduinoプロジェクトがいろいろ出てくるのだろうか。
本書の範囲では発光ダイオードやCdSなど何処でもすぐに手に入るパーツで本当に簡単にArduinoを動かしてみる、という感じ。
パーツには型番も書いてあるのでそのままメモってお店に行けばいい、という超親切記述。

こういう超入門本でオームの法則をすら書かなくて良くなった、と言うのはArduinoのすばらしい功績。

Making Things Talk -Arduinoで作る「会話」するモノたちMaking Things Talk -Arduinoで作る「会話」するモノたち
小林 茂 (監訳) 水原 文


Amazonで詳しく見る
by G-Tools

この本を持っていれば、上の本はいらないかもしれない。
先に上の本とArduinoを買ったら、次は下の本を。


Make: Technology on Your Time Volume 06

Crazy紹介書籍、Makeが今号から季刊になったらしい。
安定供給万歳。

Make: Technology on Your Time Volume 06Make: Technology on Your Time Volume 06
オライリー・ジャパン


Amazonで詳しく見る
by G-Tools

今回はDIY Music特集だが、ちょっと抑えめか。

THE GUITAR ZEROS

を見ていると、Casiopeaのライブで踊りながらギター型のドラムシンセを弾いていた神保さんが思い出される。

The MoofTronic Mini Synthも「なるほど」ネタでおもしろい。

そしてCraftwife
一度パフォーマンスを見てみたい。
テクノロジで踊っている感じだろうか、踊らされている感じだろうか。
どちらにしても面白そうだ。

Call_Blimp

のシンプルな作り込みも好き。
最も、現在はどんどん複雑な方に進化して行っているようだが。

雑誌全体でかなりArduino/Funnelにフォーカスしている気がする。
やはり日本人にはこういうのが受けるのか。


,

Flickr APIを使う際のユーザ認証の取得方法

ここ数日頭がいっぱいいっぱいでblogネタがない。
ので、「そんなの自分のメモに書いておけよ」てきなネタをたまには。
ネタ的に今更感たっぷりだけれど、

APIを通して写真をアップロードしたり、あるユーザのプライベート設定された写真を扱ったりするためには、ユーザの認証を得てTokenを得なければならない。
TokenはFlickrアプリ(api_key)とユーザ(user_id)の組み合わせにつき1つ発行される内緒の文字列。
このTokenをつかってAPIを叩くといろいろ出来るようになる。

メカニズムの解説は
Flickr API の認証 - まちゅダイアリー(2005-11-01)
を参考にしてもらうとして、手っ取り早く実装する方法を。
使ったスクリプトはPHP5。
今回はユーザ側も自分で操作したのでだいぶ手抜き。
Webアプリに組み立てるのはおまかせします。

Tokenの取得手順


flickr_token_process.png

上から順に。

FlickrAPIの取得

これは通常のアプリ開発の通り。
Flickrのアカウントを取得した後Flickr Servicesに必要項目を入力して取得。
KeyとSecretを控えておく。

コールバック先URL設定

ユーザがAPIによるアクセスへの認証を認めた後に飛び、frobを取得するぺージのURLをFLickrに設定する。
Flickr Servicesの「Edit key details」をクリックし、下方のAuthentication Typeで"Web application"を選び、Callback URLにコールバック先のURLを設定。
このコールバック先はgetで値が取得できる必要がある。
これはapi_key1つにつき同時に1つしか設定できない。

ちなみに、最もシンプルにやるにはコールバック先のURLに以下のスクリプトを置けばよい。

<?php
print_r($_REQUEST);
?>

認証要求URL生成

ユーザにサクセスして認証をしてもらうページのURLをつくる。

Flickrはapi_keyとsecretのペアでアクセス判別をしているが、secretはヒミツにするため、パラメータのmd5となるシグネチャを作成する。

シグネチャの元となる文字列は以下のように作成
[Secret]api_key[ApiKey]perms[permission]
[Secret],[Api_Key]には先ほどのapi keyとsecret、permissionには "read"か"write"を指定。
プライベートな写真を読むなど読み取りの権利のみ取得したい場合はread、
それらにくわえ写真のアップロードやメタデータの書き換えなども必要な場合はwrite。
たとえばapi keyがaaaaaaa、secretがbbbbbでwriteパーミッションを取得する必要がある場合は
bbbbbapi_keyaaaaaaapermswrite
となる

上で生成した文字列をmd5でひねる
md5を作るコマンドラインスクリプトは以下の通り

#!/usr/bin/php
<?php
echo md5($argv[1])."\n";
?>

上の文字列の場合
$ ./md5.php bbbbbapi_keyaaaaaaapermswrite

2da2c4a7a5572aab7c97f268242acd03
を取得。

ユーザにアクセスさせるURLは以下のようになる

http://flickr.com/services/auth/?api_key=[api key]&perms=[permission]&api_sig=[signature]
上の場合は
http://flickr.com/services/auth/?api_key=aaaaaaa&perms=write&api_sig=2da2c4a7a5572aab7c97f268242acd03

ユーザによる認証

ユーザに認証をしてもらうために、Flickrのユーザに上で生成したURLにアクセスしてもらう。
(Flickrにログインしてない状態の場合はログイン画面を経由して)飛んだページで、以下のボタンを押してもらう

flickr_alloit_button.png

するとユーザは先ほど設定したコールバック先アドレスに飛ぶ。

frobの取得

飛んだ先のページにfrobと言う名前のgetパラメータでfrobの値が渡される
先ほどのスクリプトの場合

Array
(
[frob] => xxxxxx-yyyyyyyy-zzzzzzz
)

のようになるはず。
このfrobと言うのが何のために作られたのか分からないが、Tokenを得るために必要な中間地点。
frobをひかえておく

Token取得URLを生成

先ほどの認証要求URLの生成と似たかんじで、flickr.auth.getTokenToken APIをたたいてTokenを得るためのURLを生成

シグネチャを作成
シグネチャの元となる文字列は以下のように作成

[Secret]api_key[Api Key]frob[Frob ]methodflickr.auth.getToken
上の例だと以下のようになる
bbbbbapi_keyaaaaaaafrobxxxxxx-yyyyyyyy-zzzzzzzmethodflickr.auth.getToken

これをmd5でひねる
$ ./md5.php bbbbbapi_keyaaaaaaafrobxxxxxx-yyyyyyyy-zzzzzzzmethodflickr.auth.getToken

4accb826087454b8210f5b45527a243f
を取得。

これをもちいてToken取得URLは以下のようになる
http://flickr.com/services/rest/?method=flickr.auth.getToken&api_key=[Api Key]&frob=[Frob ]&api_sig=[signature]
上の例だと以下のようになる
http://flickr.com/services/rest/?method=flickr.auth.getToken&api_key=aaaaaaa&frob=xxxxxx-yyyyyyyy-zzzzzzz&api_sig=4accb826087454b8210f5b45527a243f

Token取得

すぐ上で生成したのURLにアクセスすると、XMLでユーザのTokenやユーザのIDなどがえられる

<rsp stat="ok"><br />
<auth><br />
<token>[ここにTokenがかかれる]</token><br />
<perms>read</perms><br />
<user nsid="[ユーザのID]" username="[ユーザ名]" fullname="[スクリーン名]"><br />
</user><br />
</auth></rsp>

このTokenを他に漏れないように保存して、一件落着。


アメリカにいる場合じゃない

孫社長iPhone予約受け付け中止要請 - 経済ニュース : nikkansports.com

 ソフトバンクモバイルの孫正義社長は13日、日本での販売権を取得した米アップルの携帯電話「iPhone(アイフォーン)」について、「当初端末がどのくらい入ってくるか分からない」と述べ、混乱を避けるため販売店に対して、現時点での予約の受け付けを止めるよう要請したことを明らかにした。

あああ。WWDCに出ている間に!
WWDCに出た人には優先販売してくれないだろうか、なんて勝手な期待。

というわけで、(手遅れだけれど)明日帰国します。
iPhone、待っててね!


,
,
,

やはりAppleはすごい、と洗脳されかけている

昨日からiPhoneの開発セッションにいくつか参加しているのだけれど開発環境がすごい。
デモで「こんな簡単に開発ができますよ」とアピールされて(一時、VSが1行もコードを書かずに時計アプリが作れます、とかやっていたような。)実際やってみると茨の道、というのはイヤと言うほど経験しているのだけれど、それを差し引いてもiPhoneの開発は楽そうだし楽しそう。GUIの設計からロジック、データのマネジメントまで本当にPCと同じような感覚で作って行けてしまう。シミュレータもプロファイラソフトもまさにかゆいところにバッチリ手をさしのべてくれるような作りのよう。
組み込み系の開発はこんなに変わったんだ。アセンブラから始まってローレベルの処理をひたすらCでかいてデバッグが出来なくて途方に暮れたり、、というあの日々は何だったんだろう、と思えるくらい。もちろんガベージコレクタが使えない、等制約も厳しい部分はもあるけれど。。
言語が独特のObjective-Cのみに縛られる、と言うのが難点だなぁ。

おまけに開発環境は無料。

スゴイ時代になったなぁ。

おまけ
こちらのプレゼンテーションを見ていると
「iPhone独壇場の時代は終わった」と千本氏 イー・モバイルがタッチパネル端末 - ITmedia News
こういう圧倒的にセンスのない人たちが哀れに見えてきてしまう。
なんでこのタイミングでにこういう事をするんだろう。10日にiPhone 3Gが発表されるのは分かっていたのに、その直後に2段階くらい残念な端末を発表するなんて。
その道のトップでいながらiPhoneを「タッチパネル付きの携帯電話」としか認識できないのもとてもかわいそう。experienceって辞書でひいてみてもらったら良いんじゃないかと。

WWDC'08基調講演速報:携帯電話からコンテンツプレーヤーへ脱皮した「iPhone」 - ITmedia +D PC USER

元々コンテンツプレイヤーだったiPodがiPhoneへと発展して、それが「コンテンツプレイヤーへ脱皮した」と評されるのはちょっと面白い。


Zincでswfをスタンドアロンアプリにしてみる

ここ数日、ActionScriptモード。
学校の実験に使うために、昔AS2で書いたものをAS3で書き直してみたり。

FlashCS3はエディタがスクリプトエディタが好きではないのでFlexBuilder2で書いていて、ふと気がついた。
作りたいのはWindowsのアプリで、以前はFlashでつくってスタンドアロンアプリケーションをパブリッシュしていたけれどFlexBuilder2(というかmxmlcか)でのスタンドアロンアプリの吐き出し方が分からず。
軽くググってみたところでは載ってなかったので、もしかしたら本当に吐けないのかもしれない。
困った。

FlashCS3で作り直すのも面倒なのでswf -> スタンドアプリ の変換ツールZincを使ってみた。
{mdm} MULTIDMEDIA © ZINC™ v2.5 - The Ultimate SWF2EXE Application

OSX版がもう売ってないようなので、windows版のv2.5を購入。
windows版でも、windows / OSXの両方のアプリケーションを作成可能。

zinc_screen.png

swfを選択してアプリケーション名を入力して「Build」ボタンを押すとswfと同じディレクトリにアプリケーションが出来る。
お手軽操作。
window sizeなどの細かいパラメータ設定も可能。

いくつかActionscriptを書いて実験してみた。
KeyEventなど基本的なものは一通り動くが、動かないAPIも多い。

今日、ちょこっと触ってみたところで動かなかったのは

・フルスクリーン
constructor内の

stage.displayState = StageDisplayState.FULL_SCREEN;

でSWFではFullScreen化されるが、ZINCの吐き出したアプリはデフォルトサイズからうんともすんとも変わらず。

・ローカルファイルのアクセス
FLVを再生しようと

video = new Video();
video.attachNetStream(stream); //stream: instance of NetStream
stream.play(filename);
addChild(video);

で同じディレクトリ内のflvの再生がswfで出来てZINCのアプリで出来ない。

ためしに、数日前に遊びで作ったlifegameアプリを変換してみたものの、これも動かず。

zinc_lifegame.png

こんな、簡単なもの。Timerで100msecごとに1世代進む。
こちらはどこが引っかかってるのかまだ追っていない。

フルスクリーンで外部デバイスと連携してflvを切り替えるようなアプリを作りたかったので、これは使えない。
おとなしくFlashCS3でつくりなおすか・・・。AIRに移植するか・・・。
ザンネン。
これで$300はチト高いな。
とはいえ、折角買ったのでまた触って何か書きます。

memo:
standaloneなflash playerのダウンロードは以下から。
Adobe Flash Player - Downloads
(Adobe Flash Player 9 — Debugger Versions (aka debug players or content debuggers) for Flex and Flash Developers)


LeopardにしたらXcodeもバージョンアップ!

日頃、MacBookProで開発をしているんだけど、ここのところ、しばしばmysqlが固まってしまうことが頻発。
CPUを30%くらい使いながらずっと何かがんばって、新しいQueryを受け付けない。

追っていったら、どうやらsennnaをつかってfulltext searchのindexを張っているtableにinsertしようとすると固まることが分かった。
思い当たる節がなかったので苦労したが、どうやらLeopardにしたのが原因かもしれない、と気付いた。
なので、sennna+mysqlを再コンパイル・・・しようと思ったらmecabのconfigureで
configure: error: C compiler cannot create executables
といわれてエラー。

Leopardにしたらgccを4.0にしないといけないようで、Xcodeもバージョンアップ必要。
LeopardのDVDからXcodeをインストールしてmecab,ipadic,senna,mysql Tritonnを無事インストール完了。

それでもまだ固まるのでDBをmysqldumpしてDB作り直して入れ直したらうまく動くようになった。

けっこうハマった。
OSのアップグレードは慎重に。


,
,
,
,

FlieMaker9をLAMP(MANP)の開発に使えるか

先月、英語版のFilamaker9が出ていて、来月日本語版も出るらしい。

随分昔にスラドで
スラッシュドット ジャパン | FileMaker9はついにSQL Server対応?
と書いてあったのを思い出した。

official pageだと
Connect to External SQL Data Sources with FileMaker
に記述が。

Webアプリの開発をする際、DBはMysqlを使うことが多く、開発中のGUIには YourSQLDbVisualizer - The Universal Database Toolを使っているのだけれど、これをFileMakerで置き換えられるかも!

ということで米FM社のWebに英語版の体験版が落ちてるので試してみた。

題材となるDBのために、MovableType4をインストール。
MT4、今までのプラグインの互換性がきになるが、それはまた今度。
mysqlは5.0.27,文字コードはUTF-8。

ただし、これをやるにはFM体験版の他にActual technologies社のODBC Driverが必要。
Mac ODBC: MySQL, PostgreSQL and SQLite connectivity for Mac OS X by Actual Technologies
約$30。こっちは体験版がないので、素直に購入してインストール。

以下、FM9とODBCドライバインストール後からの手順。
図はクリックで大きくなります

1 まず、 /Applications/Utilities/のODBC Administrator.appでSystemDSNを登録。
User DSNだとFM9が認識してくれなかった。

登録するとこうなる

2 FileMaker9を起動して、適当なファイルを作成。

3 File > Manage > External Data Source でさっき作ったODBCを設定

4 File > Manage > Database をえらび、ダイアログの「Relation」タブを選択し、ODBC先のDBからテーブルを取り込む。

ここでER図を書いてくれる。便利。
このER図を印刷したり出来たらめちゃくちゃ便利なんだけどなぁ・・・・

ここまでで完成。
テーブル1つにつきLayoutが1つ出来るのでいじってみる。

mt_blog tableのブラウズモード。


mt_entryはこんなかんじ。

試しにささっと作っただけので見た目がダサダサなのは気にしない方向で。
ちゃんと外部キーからリレーション先のデータも取ってきてくれる。

検索も上手く動いた。


updateも。

数千件のデータselect をしてみたが、開発に使う分には十分なパフォーマンス。
commitしなくてもがんがん突っ込んでくれるので気持ちいい。
さすがFilemaker。(いつか、「あー、やっちゃった−」をしそうだけれど)

これはイケてる。
Filemakerの柔軟さでUIを自由に作れるので、かなり開発やりやすくなるかも。
でも、これで余計に管理画面作るのがおっくうになるなぁ。
お客さんにFilemaker買ってもらえる案件の場合は管理画面Filemakerで作って納品・・・とかできないかな。

因みに、上の手順は
External SQL Data Source Video Tutorial
で動画で確認できる。英語だけど。

個人的には、
FileMaker Script Grouping and Editing Tools
この新機能も気になる。
これが出来れば、スクリプトモジュールをライブラリ化して共有できるんじゃないかと。

Webには書いてない様だけれど、Filemakerの中の人に聞いたところPHPドライバが同封されていて、自動的にPHPでWebのCrud画面をつくる機能もあるらしい。この辺はハヤリですね。
インスタントWebと同等に使えるようだったら最高。
これも、また今度さわってみます。


今日のはまりどころ (_moz-userdefined)

webアプリを書いていて、どうもDivが上手く並ばない、包含関係が壊れる。
FirebugでおかしくなっているあたりをみてみるとのDivタグに _moz-userdefined という属性が勝手についていた。
これがつくとそのDivが行かれてしまって、そこからどんどんコケていっている。

悩むこと1時間弱。
原因はid属性の重複でした。
foreachで回していたから気付かなかった。
IDが被らないように細工したら上手くレイアウトできた。


じぶんのボケ具合に悔しくなるやら悲しくなるやらの水曜午後。


ソフトウエア開発に役立つマインドマップ チームからアイデアを引き出す図解・発想法

ソフトウエア開発に役立つマインドマップ チームからアイデアを引き出す図解・発想法ソフトウエア開発に役立つマインドマップ チームからアイデアを引き出す図解・発想法
平鍋 健児


Amazonで詳しく見る
by G-Tools

3/5

「ソフトウエア開発に役立つ」という枕はウソではないがそれほどそこにフォーカスしているわけでもないのであまり意味がない。ただの「マインドマップ」というタイトルに出来なかったからちょっと差別化のための枕を付けてみました、ていどだろう。

が、マインドマップの簡単な使い方をプレゼンテーションしている本という意味ではわかりやすくておもしろかった。
マインドマップのベースとなるマインドはおいておいて、取りあえず使ってみたい、という要求に応える内容。
さっと読めるし。

ベースとなるマインドは

ザ・マインドマップザ・マインドマップ
トニー・ブザン 神田 昌典 バリー・ブザン


Amazonで詳しく見る
by G-Tools

やっぱりこっちですね。

自己紹介をマインドマップでやるのはナルホドと思った。
大人数でやる場合は、BOI(1次の枝)の構造についてはレギュレートしておいた方がいいかも。
追加は可にして。

個人的に使っていても、なかなかミーティングでみんなの前で使う勇気は出ず。
bmが使っているソフトは
マインドマップ ソフト MindManagerでmindmap
です。
無料のツールが流行っている中でこいつは有料だけれど、その分UIがこなれてる。


lighttpd + fastcgi

自前で管理しているサーバに人様のアプリをホスティングしてあげることになったのでスクリプトキャッシュを入れることにする。 mod_perlはmovabletypeが動かなくなる(といいうかMTに改造が必要になる)ので却下。バージョンアップするた日にソース読みつつ改造するのは面倒。 Apache2.0とfastCGIは相性が悪く、上手くインストールできなかったのでlighttpd+FastCGIに変更。 以下、lighttpd+FastCGIのインストール。 perlで使う版。 fastcgiのインストール ここから fcgi-2.4.0.tar.gz をダウンロード
$ tar xvzf fcgi-2.4.0.tar.gz
$ cd fcgi-2.4.0
$ ./configure
$ make
$ make check
$ sudo make install
libpcreのインストール ここから pcre-7.1.tar.gzダウンロード
$ tar xvzf pcre-7.1.tar.gz
$ cd pcre-7.1
$ ./configure
$ make
$ make install
下の常駐スクリプトのためにEmbed::Persistentインストール
$ sudo perl -MCPAN -e 'install Embed::Persistent'
常駐スクリプトdispatcher.fcgiをおく。 ここを参照
#!/usr/bin/perl
use strict;
use CGI::Fast;
use Embed::Persistent;
{
    my $p = Embed::Persistent->new();
    while (new CGI::Fast) {
        my $filename = $ENV{SCRIPT_FILENAME};
        my $package = $p->valid_package_name($filename);
        my $mtime;
        if ($p->cached($filename, $package, \$mtime))
        {
            eval {$package->handler;};
        }
        else
        {
            $p->eval_file($ENV{SCRIPT_FILENAME});
        }
    }
}
/etc/lighttpd/lighttpd.confの書き換え
$ sudo vi /etc/lighttpd/lighttpd.conf
以下の点をちょこちょこ書き換え
server.modules              = (
                                "mod_flv_streaming",
                               "mod_rewrite",
                               "mod_fastcgi",
                               "mod_cgi",
                                "mod_accesslog" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
server.error-handler-404   = "/dispatch.fcgi"
fastcgi.server = ( ".fcgi" =>
                     ( "localhost" =>
                         (
                           "min-procs" => 2,
                           "max-procs" => 3,
                           "socket" => "/tmp/lighttpd.socket",
                           "bin-path" => "/home/web/public_html/dispatch.fcgi",
                           "bin-environment" => ( "RAILS_ENV" => "development" )
                         )
                     )
                 )
cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
                               ".cgi" => "/usr/bin/perl" )
lighttpdのリスタート
$ sudo /etc/init.d/lighttpd restart
perlのためのモジュールインストール
$ perl -MCPAN -e 'install FCGI'
$ perl -MCPAN -e 'install CGI::Fast'
これで完成。

PerlからTrackbackを送る

bmblog: PHPからTrackbackを送る を公開したらPerlでもやるように、といわれたので続き。 PerlではNet::Trackbackを使う
shin$ sudo perl -MCPAN -e shell

cpan[1]> install Net::Trackback
でインストール。 pingを送るのは
my $tb_client = Net::Trackback::Client->new();
my $p={
	ping_url => $to_url,
	url => $from_url,
	title => $title,
	excerpt => $excerpt
};
my $ping = Net::Trackback::Ping->new($p);
my $msg = $tb_client->send_ping($ping);
my $return = $msg->to_xml;
if($return =~ /0<\/error>/){
	print 'success';
}else{
	print 'failure';
}
$to_urlはpingを送る先のURL $from_urlはpingの送りもとのURL (ふつうはblogのperm link) でオッケイ。
,
,

PHPからTrackbackを送る

かなり今更感あるけれど、必要に駆られて作ったのでメモ。 PHP Trackbackのダウンロード PHP Trackback ダウンロードして解凍し、trackback_cls.phpを取り出す。 後は簡単なコードを書くだけ。
require('trackback_cls.php');
require 'PEAR.php';		//エラー処理不要ならなくても良い

$tb = new Trackback($blog_name, $author_name, $char_set);
if ($tb->ping($to_url,$from_url,$title,$excerpt))	echo 'success';
else 	echo 'failure';  //PEARのエラーハンドリングを使う場合は return PEAR::raiseError('error: can\'t send ping');
$char_set は用いる文字コード(普通は 'UTF-8') $to_urlはpingを送る先のURL $from_urlはpingの送りもとのURL (ふつうはblogのperm link) カンタンカンタン。 ちなみに、このライブラリのauto_discoveryはテキスト内のリンクを探してきて全て叩きにいってtrackback_autodiscoveryでtrackback先URLをみつけてくるというモノ。blogを書く人向けの機能なんですね。 日頃クロールばかりしているbmは、最初trackback autodiscoveryをつかって、当該blogへ打たれたPingを探して来る機能だと勘違いしてソース読んでやっとわかった。 当該エントリに来たPingを探すのはこんなかんじで。
function ping_discovery($text){
	$tb_array = array();
	$text = preg_replace('/\n/','',$text);
	// get RDFs
	preg_match_all('/()/sm', $text, $link_rdf, PREG_SET_ORDER);
	if(empty($link_rdf))	return null;
	
	//get TB URLs
	for ($i = 0; $i < count($link_rdf); $i++) {
		$rdf = trim($link_rdf[$i][1]);
		if (preg_match('/trackback:ping="([^"]+)"/', $rdf, $array))	$tb_array[] = trim($array[1]);
	} 
	$tb_array = array_unique($tb_array);
	if(empty($tb_array))	return null;

	//get Received Pings
	$ping_array = array();
	if(empty($tb_array)) return null;
	foreach($tb_array as $tb_url){
		$tb_url .= '?__mode=rss';
		$tb_rss = preg_replace('/\n/','', implode('',@file($tb_url)));
		preg_match_all('/(.+?)<\/item>/',$tb_rss,$item_array);
		if(!empty($item_array[0]))
			foreach($item_array[0] as $item)
				if(preg_match('/(.+?)<\/link>/',$item,$array)) $ping_array[] = trim($array[1]);
	}
    return $ping_array;
}

spotbrowser

昨日ミーティングしてそのままクラブに行って帰ってきてからいままでWebを2つ作っていたらクタビレてしまった。
空はこんなにもよく晴れて気持ちいい日なのに。

これは先月末に作って寝かしておいたものだけれど、簡単なマッシュアップサイトを作りました

SpotBrowser

地名をつっこむといろいろ情報を探してきてくれてグルメを買ったりホテルの予約が出来るサイト。

たとえば・・
新宿
軽井沢
藤沢
など。

見た目がボロボロなのは気にしない方向で。

本当はぐるなびAPIもつっこみたかったんだけれどイマイチぐるなびAPIは今回のに使いにくかったので割愛。

あといくつか盛り込もうと思っているアイデアもあるので、時間が出来たら追加していきます。
要望も募集中。

気がついたら、新宿のLOFTがなくなっていた!
しょっちゅう行くわけではないけれど東新宿に住む身としては駅の手前にあったから便利だったのに。


,
,
,
,
,

ぐるなびWebサービスはいまいちイケてない & Serivces_Gnavi公開

本日、ぐるなびがWebサービスのAPIを公開した。

ぐるなびWebサービス

ぐるなびWebサービスとは、ぐるなびが所有する飲食に役立つ豊富な情報を活用して新たなコンテンツを制作する開発者の方のためのサービスです。

えっと、まず先に。
ぐるなびWebサービスにアクセスするためのPHPのライブラリを作りました。

lab.lake: ぐるなびWebサービスPHPライブラリ Services_Gnavi

適宜ご利用下さい。
ご利用に際してはぐるなびWebサービスのユーザ登録をして、アクセスキーを取得する必要があります。

サイトもビジネスモデルもWeb1.0なかんじのぐるなびがAPIを公開したのはちょっとおもしろい。
データもかなりクリーンだろうし数も膨大だし。

で、Webサービスを使ってみた感想を以下に。

利用するのにかなりの個人情報を取られる

上記の通り、Webサービスを使うためにはアクセスキーが必要で、その取得のためには
名前
メールアドレス
掲載予定のURL
電話番号
住所
を取られる。
取得してみたらとくに審査もなくメールでconfirmとアクセスキーを送ってくるだけだったので、正確に入れないといけないのはメールアドレスだけだったけれど。
掲載予定のURLって言うのがよくわからなかったけど。ローカルで使っちゃいけないんだろか。
なんでWebサービスつかうのにそんなに個人情報取られなくちゃいけないんだろう、とちょっとネガティブ印象。

レスポンスが早い

これからユーザが増えるとどうなるかわからないけれど、現状ではかなり早く答えてくれる。

位置情報の扱いが優しい

緯度経度での指定が出来るほか、帰ってくる緯度経度情報の測地系まで指定できる。
これはマッシュアップする際にちょっと便利かも。
でも問い合わせの時の測地系は日本測地系のみ。

とにかく文字列投げて検索、ができない

地名とか料理名とか最寄りの駅など、どっかのカラムに引っかかったら返してくれるような検索が欲しい。
ゆるめマッシュアップに結構重要。

特定の大カテゴリ内のサブカテゴリを取得できない

レストランが形態別に大カテゴリ(大業態マスタ)とサブカテゴリ(小業態マスタ)の2段で分類されているのに、
ある大カテゴリ内のサブカテゴリのリストが取得できず、サブカテゴリの問い合わせは全てのサブカテゴリが帰ってくる。
全部で145レコードだから全部返してもそんなに負荷にならないという考えかもしれないんだけど・・・。

簡易(リスト表示)情報が取得できない

APIを使うときは、検索結果のリストでお店の大まかな内容がわかって、必要なお店に対して、再度詳細情報をもらいに行くという使い方がよくやられると思うのだけれど、簡易情報だけ返してくれるように問い合わせできない。
検索結果はつねに詳細情報。
XML作る方もparseするほうもCPU大変だし、ネットワーク負荷もかんがえると、詳細情報だけ返してくれるモードが欲しい。

メニューは取得できない

これが出来たらおもしろいと思うのに。

・・・などなど・・・
言い続けると長くなるので取りあえずこんな感じで。
全体として、APIを作り/使いなれてない人が見よう見まねで作ってみました、という感じかな。

やっぱりこういうAPIはCGM系の機能が全くないのは痛いかもしれない。
ぐるなびのサイトでは「ファンの声」を投稿できるが、Webサービスでは取得できない。
ファンの声の本文とレーティング平均(これは本サイトにもないけど)、せめてファンの数だけでも取れてソート順に指定できればいいな。

あとは自前サービスとクーポンを絡めるような仕組みが出来たらおもしろい。
いまはクーポンの有無だけ、取得可能。

ぐるなびの中の人が文字通り足で稼いだデータ、クリーンで膨大なだけに、成長していったら使いでのあるAPIになるのではないかと期待を込めつつ。


OSXにRuby on Rails環境を構築

方々から(くだらないことばっかり書いてないで)少し技術的なこともblogに書くように言われたので、汎用的内容については少しずつ書くようにします。今まで意図的に避けてきたのですが。
いつまでつづくやら。

JavaからRubyへ ―マネージャのための実践移行ガイドJavaからRubyへ ―マネージャのための実践移行ガイド
Bruce A. Tate 角谷 信太郎


Amazonで詳しく見る
by G-Tools
も読んだし、
WEB+DB PRESS Vol.38WEB+DB PRESS Vol.38
WEB+DB PRESS編集部


Amazonで詳しく見る
by G-Tools
でも「はじめてのRuby on Rails」とかやっているので、RoRをちゃんとさわってみることにした。 Rubyもちゃんと習得してないのに大丈夫かしらと思いつつ。 当面、仕事では使い慣れたSymfonyを使いますが。

OSXにRoR環境を構築する手順。

Tiger標準のRubyが古い(1.8.2)ので新しくする

Readlineをインストール

そのままだとconfigure中にエラーで止まってしまう。 readlineが必要なようだ The GNU Readline Library から一番新しいのをダウンロードして
 shin$ tar xvzf ~/Desktop/readline-5.2.tar.gz 
 shin$ cd readline-5.2/
 shin$ ./configure
 shin$ make
 shin$ sudo make install
する。

Rubyをインストール

Ruby ダウンロードから一番新しいのをダウンロードして
 shin$ tar xvzf ~/Desktop/ruby-1.8.6.tar.gz
 shin$ cd ruby-1.8.6/
 shin$ ./configure --with-readline
 shin$ make
 shin$ sudo make install
で完了。 古いRubyが/usr/binに入っていて新しくコンパイルしたのが/usr/local/binなので、そのままだと古いRubyを見つけてしまう
 shin$ ruby -v
 ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
 shin$ /usr/local/bin/ruby -v
 ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
ので
 shin$ sudo mv /usr/bin/ruby /usr/bin/ruby_1.8.2
 shin$ sudo ln -s  /usr/local/bin/ruby /usr/bin/ruby
とすると便利。

Gemのインストール

rubyのパッケージ管理モジュール(perlで言うCPAN、PHPでいうpear)をインストールする。 RubyForge: RubyGems: ファイルリストから一番新しいrubygemsをダウンロードする
 shin$ tar xvzf ~/Desktop/rubygems-0.9.2.tgz 
 shin$ cd rubygems-0.9.2/
 shin$ ./configure
 shin$ sudo ruby setup.rb
でおしまい。
2 shin$ gem -v
0.9.2

Rakeのインストール

Rake(Ruby版make)をインストール 今インストールしたばかりのgemをつかって
 shin$ sudo gem install rake -y
で完了
 shin$ rake -V
 rake, version 0.7.3

Railsのインストール

Rakeにひきつづき
 shin$ sudo gem install rails -y
で完了
 shin$ rails -v
 Rails 1.2.3

rubyのDBドライバをインストール

mysqlのドライバは標準で入っているらしいので、postgrsesのドライバをinstallしてみる
 shin$ sudo gem install ruby-postgres
Select which gem to install for your platform (i686-darwin8.9.1)
 1. ruby-postgres 0.7.1.2006.04.06 (ruby)
 2. ruby-postgres 0.7.1.2006.04.06 (mswin32)
 3. ruby-postgres 0.7.1.2006.04.05 (mswin32)
 4. ruby-postgres 0.7.1.2006.04.05 (ruby)
 5. Skip this gem
 6. Cancel installation
> 1
 
で完了。

開発環境をインストール

Web+DBではEclipseベースのRadRailsが紹介されているけれど、軽いエディタがいいので、TextMateで。ただしここは趣味による。

これで開発環境は完成。


Recent Entries
Categories
External Links
Monthly Archives
Search this site