2007/07/31

はてな
前のエントリで気づいたのですが、実はJSONとvimって愛称がよいのでは?と気づきました。
確かに複雑なJSON(例えばif文等を含んだりしているもの)は扱えませんが、JSONPが実行出来るならばメソッド引数にデータ本体が渡る為、簡単なものなら解釈出来る事が分かりました。

例えば、以下のメソッドを定義します。
scriptencoding utf-8
function! JsonHandler(data)
  return a:data
endfunction
function! GetJsonP(url)
  let ret = system("curl -s \"" . a:url . "?callback=JsonHandler\"")
  let org = &enc
  let &enc = "utf-8"
  let ret = substitute(ret, '\\u\([0-9a-zA-Z]\{4\}\)', '\=nr2char("0x".submatch(1))', 'g')
  exe "let val = " . iconv(ret, "utf-8", org)
  let &enc = org
  return val
endfunction
function! GetJson(url)
  let ret = system("curl -s \"" . a:url . "\"")
  let org = &enc
  let &enc = "utf-8"
  let ret = substitute(ret, '\\u\([0-9a-zA-Z]\{4\}\)', '\=nr2char("0x".submatch(1))', 'g')
  exe "let val = " . iconv(ret, "utf-8", org)
  let &enc = org
  return val
endfunction

GetJsonメソッドはURLを指定してJSONオブジェクトを取得する関数です。
はてブのコメント一覧であれば、以下のような処理で取得出来ます。
if exists("json")
  unlet json
endif
if exists("jvar")
  unlet jvar
endif
let json = GetJson("http://b.hatena.ne.jp/entry/json/?url=http://mattn.kaoriya.net/web/hatena/20070726110753.htm")
for jvar in json["bookmarks"]
  echo jvar["user"] . " - " . jvar["comment"]
endfor
実行結果は以下の通り(参考:はてブでアーーーーッ!!!)
yheld - アーーーーッ!!!フヒヒ、サーセンwwww
parkbench -
ku0522 - アーーッ!!
tyoro1210 - アーーーーッ!!!
mattn - 自分でアーーーーッ!!!
また、del.icio.usの場合は通常のJSONにデフォルトのコールバックが含まれてしまいますので、vimでは解釈出来ません。しかしJSONPならばメソッドを指定する事で左記javascriptが消えてくれます。専用にGetJsonPという関数を用意しました。
はてブと同様に
if exists("json")
  unlet json
endif
if exists("jvar")
  unlet jvar
endif
let json = GetJsonP("http://del.icio.us/feeds/json/mattn.jp")
for jvar in json
  echo jvar["d"] . " - " . jvar["u"]
endfor
とする事で(参考:mattn.jp in del.icio.us)
FlashVillage.com - FREE Flash Templates - http://www.flashvillage.com/
その対応に意味はあるのか (Yak blog) - http://www.greenspace.info/mt/2007/07/31/post_38.html
Top Rated - Free Stock Photos - http://public-domain-photos.com/
Niconorati (ニコノラティ) - ブログで今話題のニコニコ動画 - http://pulpsite.net/niconorati/
SourceForge、「優秀なオープンメ[スプロジェクト」の投票結果を発・- ZDNet Japan - http://japan.zdnet.com/oss/story/0,3800075264,20353786,00.htm
IT戦記 - style.cssText の使い処に関する考察 - http://d.hatena.ne.jp/amachang/20070730/1185788557
void GraphicWizardsLair( void ); // Ustream.tvの凄いところは、Flashで実用的なIRCクライアントを作っちゃったところ - http://www.otsune.com/diary/2007/07/30/1.html#200707301
カイ氏伝: Wikipediaの「RSSリーダー」がとんでもない件 - http://blogging.from.tv/archives/000564.html
美輪明宏のチンコの有無を返すAPI作った | dzfl::blog - http://dzfl.jp/blog/2007/07/29/miwa-mojo-api/
美輪明宏のチンコの有無を配信するRSS作った - PRESS RELEASE on VOX - http://asada.vox.com/library/post/%E7%BE%8E%E8%BC%AA%E6%98%8E%E5%AE%8F%E3%81%AE%E3%83%81%E3%83%B3%E3%82%B3%E3%81%AE%E6%9C%89%E7%84%A1%E3%82%92%E9%85%8D%E4%BF%A1%E3%81%99%E3%82%8Brss%E4%BD%9C%E3%81%A3%E3%81%9F.html
Cookie Manager | Javascript Code | All Things Webby - http://insin.woaf.net/code/javascript/cookiemanager.html
[N] 無料で使える18のアプリケーション&ウェブサービス - http://netafull.net/lifehack/021313.html
flivpee - Google Code - http://code.google.com/p/flivpee/
MOONGIFT: ≫ オープンメ[スのFlashムービープレーヤ「Flivpee」:オープンメ[スを毎日紹介 - http://www.moongift.jp/2007/07/flivpee/
TechCrunch Japanese アーカイブ ≫ Pownceが、ついにAPIを公開 - http://jp.techcrunch.com/archives/pownce-moving-to-open-api-eventually/
といった結果が得られます。
本来ならcallbackもvimscriptを呼ばせるべきかもしれませんね。
vimを使ってマッシュアップアプリを作ってみたい人には、便利なtipsかも知れません。
私はライブラリ化するつもりはありませんが、してみたい人がいるならばぜひvimscriptsに登録してみて下さい。
まぁ、「意外と知られていない」という割には自分も知らなかった訳ですが...

the half of mattn is composed of fondness.

はてな
先日ようやくPownceのAPIが公開されました。
APIはGoogle Groupで公開されています。
また、Python, Perl, ColdFusionを使ったライブラリも公開されています。ただし07/31時点では...
  • ColdFusionのディレクトリは空っぽ
  • PerlはMessageとFileしか対応していない
  • Pythonは全て対応しているけども中身が×××
って事で、MixiAPI.pyのようなものを作ってみました。
フィードの取得はPownceAPI.Session(userid, passwd)でセッションオブジェクトを作成し、get_notes()でfeedparserオブジェクトが返ります。また、ポストは
  • PownceAPI.Message(message)
  • PownceAPI.Link(message, url)
  • PownceAPI.File(message, file)
  • PownceAPI.Event(message, location, name, datetime)
で作成したオブジェクトをsession.send_item(to, item)で送信します。
簡単な例を以下に示します。
import PownceAPI

# セッションを作成
session = PownceAPI.Session("example", "password")

# フィードを取得
print session.get_notes().entries[0].summary

# メッセージを送信
item = PownceAPI.Message("do you have a time?")
session.send_item("public", item)

# ファイルを送信
item = PownceAPI.File("my location", "map.png")
session.send_item("all", item)

# リンクを送信
item = PownceAPI.Link("gugure!", "http://www.google.com/")
session.send_item("public", item)

# イベントを送信
item = PownceAPI.Event("this is a party!", "My Home", "Yakiniku")
session.send_item("all", item)

今のところ、send_itemで指定出来るtoに制限があるのか、File等をallではなくpublicで送信すると500 Internal Server Errorが発生します。
また、APIを使ってもマルチバイト文字は表示されません。
とりあえず、動いている...といったところです。
もしPownceが使いたいが招待状がないという方は、コメントなりで連絡下さい。招待状を送らせて頂きます。

続きを読む...


はてな
最近のインターネットは便利になったもので、なんと美輪明宏のチンコがあるのかないのかを返してくれるWebAPIまである。インターネットリソースの大きさは今後もきっと拡大して行き、いずれはきっとGoogle Alertや、はてなアンテナ、はたまたEngadget Japanese等でのリーク流出等で実際の「あり/なし」が判明、本当に正しい結果が返って来る事になると思われる。

だがしかし、上記JSONサーバにはRSS/Feedが存在せず、実は「美輪明宏にはチンコがない」とユーザが初めて気付く為には、結果をメール等で通知する様なデーモンプロセスを稼働させてこのサービスを監視(ポーリング)しJSONをパースした結果としてユーザに通知するか、ユーザにとって使用頻度の高い乗用アプリケーションへチェック機能を付けユーザの操作(トリガ)でチェックを行う方法が選択肢となってしまう。たしかにポーリングは簡単に、かつ昼夜を問わず最新の情報を人手無しに監視し続ける事が出来る。
しかしながら、このサーバに負荷を掛けることは今後のインターネット発達が望まれる中、希少な有志の力を自ら塞ぎ込む形と成り得ない。
ここはトリガ形式を考えるのが適切である。

では、トリガ形式としてどんな常用アプリケーションが適切か。私が考えた結果がテキストエディタである。テキストエディタはユーザであればほぼ万人が使っている。今回私は、このテキストエディタの中でもギーク性が高いと言われるvimを選んだ。

まずは、何をもって「美輪明宏のチンコの有無」を確認するか。
テキストエディタであれば、入力補完がユーザのニーズに答えられる物になるだろう。
たとえば
美輪明宏にチンコは
まで入力し、<tab>を押下して「ある」もしくは「ない」が補完されたとすれば、それはかなり使い勝手のある物になると思われる。

運が良いことに、vimでは入力補完にフックメソッドを組み込む事が出来るため、今回私は、以下の様なソースを書いた。
func! s:CheckTimpo()
  " ここにデータ取得処理を入れる
endfunc
iabbr <silent> 美輪明宏にチンコは 美輪明宏にチンコは<C-R>=<SID>CheckTimpo()<CR>
入力I/Fに対するメソッド呼出部が完成した。
あとはJSONをどう解釈するか。ここで私にあるひらめきが。
たしかvim7のDictionaryは、JSON展開形式に似てたはず
そして以下のようなコードを書いた。
func! s:CheckTimpo()
  let ret = system("curl -s http://dzfl.jp/mojo/")
  let true = 'ある'
  let false = 'ない'
  exec "let json = " . ret
  return json['miwa']
endfunc
iabbr <silent> 美輪明宏にチンコは 美輪明宏にチンコは<C-R>=<SID>CheckTimpo()<CR>
以下にこのソースの解説を行う。
JSONサーバからは以下の形式でデータが戻される。
{ "miwa": true }
vim7ではDictionaryが導入されており、そのシンタックスは
{ key: value }
となる。つまりtrue/falseといった予約語を定義してやればJSON形式が扱える事になるのだ。
上記ソースではtrue/falseの定義を行った上でDictionaryへ値展開し、代入している。これによりvim7ではjsonという変数に対して
json["miwa"]
とアクセス出来るのである。true/falseはそれぞれ「ある」/「ない」と定義している為、もし美輪明宏にチンコがあれば
json["miwa"] == "ある"
また、美輪明宏にチンコがなければ
json["miwa"] == "ない"
となるのだ。
この値をスクリプト内メソッドCheckTimpoの戻り値として返し、入力補完を行えるようになる。
以上の処理手順により、vim7を使っているならば何時でも
美輪明宏にチンコは
とまで入力し、補完トリガと成り得るようなキー(例えばスペース)を入力すれば
美輪明宏にチンコはある
と入力補完されるのである。

今回は、vimとJSONでマッシュアップを行ったが、これはあくまで一例に過ぎない。これを応用すれば「某国会議員がカツラなのか」、「モー娘のあの娘はタバコを吸っているかどうか」が、テキストエディタから補完出来るのである。

皆さんも、色んなマッシュアップを試して見てほしいと切に感じている。

以下、今回作成したソース「miwa.vim」を公開しておく。

ダウンロード:miwa.vim
注意:vimの入力補完は、全構文を途切れなく入力する必要がある。

2007/07/26

はてな
はてなブックマークのコメントをニコニコ動画コメント風に流すスクリプト書いてみた...
この記事にはてなブックマークコメントを付けると、下部に流れ出します。
もしかしたらJSONに反映されるまで流れないかもしれません。
Firefoxではjavascriptからのmarqueeが生成出来ないので、こちらのサイトのスクリプトを使わせて頂きました。

使い方は簡単。上記JavaScript Marquee Demoからmarquee.jsを、また下のリンクからhatebu_ahhhhh.jsをダウンロードし、scriptタグで読み込みます。あとはHTML本体に"HatebuAhhhhh"というIDをもったDIVを一つ用意します。
注意:はてなスターのように複数設置する事は出来ません。パーマリンクに一つとお考え下さい。
注意:はてブはパーマリンクにお願いします。

続きを読む...


2007/07/24

はてな
もごもごにURLをポストするツールを作りました。
なかみはTumblrから少し、いや幾分、いやかなりパクってます。

以下がブックマークレットです。
HTML側のソースは以下の様になっています。
ここのサーバにも一応HTMLを置いてはおきますが、いずれ削除するかもしれないので、出来る事ならば適当なサーバに以下のHTMLだけ置いて、ブックマークレットのURLをそこに書き換えて使って下さい。
もちろん、もごもごはSBMではありませんから、たんなるURLお知らせツールにしかなりませんけども...
再配布、改造、などは勝手ながら自由にさせて頂きます。

続きを読む...


2007/07/23

はてな
意外と便利なvimscript、なんとなく今日は底に眠ってそうで実は便利なスクリプトをご紹介。
vimで翻訳出来たら便利かな?なんて思ったりしませんか?
出来ます。

香り屋testdirというフォルダに、excitetranslate.vimというファイルがあります。
これを取ってきて、pluginsディレクトリに放り込むだけ。
ただし作られてから結構古く、exciteのURLも変更されていますので、以下のパッチを当てる必要があります。

*** excitetranslate.vim.orig    Mon Jul 23 16:30:34 2007
--- excitetranslate.vim Mon Jul 23 16:28:52 2007
***************
*** 4,16 ****
  "
  " Maintainer: MURAOKA Taro <koron@tka.att.ne.jp>
  " Author: Yasuhiro Matsumoto <mattn_jp@hotmail.com>
! " Last Change:23-Jul-2007.
  
  if !exists('g:excitetranslate_options')
    let g:excitetranslate_options = 'register,buffer'
  endif
  
! let s:excite_web = 'http://www.excite.co.jp/world/text/'
  
  function! s:CheckEorJ(word)
    let all = strlen(a:word)
--- 4,16 ----
  "
  " Maintainer: MURAOKA Taro <koron@tka.att.ne.jp>
  " Author: Yasuhiro Matsumoto <mattn_jp@hotmail.com>
! " Last Change:23-Jul-2007.
  
  if !exists('g:excitetranslate_options')
    let g:excitetranslate_options = 'register,buffer'
  endif
  
! let s:excite_web = 'http://www.excite.co.jp/world/english/'
  
  function! s:CheckEorJ(word)
    let all = strlen(a:word)
***************
*** 38,43 ****
--- 38,44 ----
    silent! %v/^<textarea /d _
    silent! %v/name="after"/d _
    silent! %s/<[^>]*>//g
+   silent! %s/\r//g
    let line = getline(1)
    silent bw!
    " Remove temporary files
注意)本プラグインを動作させる為には、「Chalice」に含まれる「aliceライブラリ」が必要です。「aliceライブラリ」の最新版は、svnリポジトリから取得出来ます。

あとは、vimのバッファで「This is a pen!」と70年代生まれ小学校1年生レベルの英語を打ち込み
:ExciteTranslate
とすれば
これはペンです!
と70年代生まれ小学校2年生レベルの答えが返ってきます。
またexcitetranslate.vimは、内部が英語ぽいか日本語ぽいかで逆の動作もしますので「魔女の宅急便」を訳すと
Kiki's Delivery Service
と戸田奈津子並みの答えが返ってきます。

はてな
コトバコAPIが公開されています。
RESTを使って記事投稿出来ます。iframeを隠して使えばWeb上にも投稿画面を貼り付けられそうです。
とりあえず、動くものとしてHTAアプリにしてみました。
アクセスキーは、ログイン後に「ツール」を開くと確認出来ます。

cotobacohta

ダウンロード:cotobaco.hta

2007/07/19

はてな
あまり事情も詳しくなく、業種もWebエンジニアではないのでソースは貼らないでおこうと思います。

私はWebエンジニアではありません。確かに仕事でWebもやりますしデザイナさんが書いた画面で製造した事もあります。

色々なブクマを拝見させて頂いて、少しだけ話がそれ始めているんじゃ?と思う事があり、この記事を書いています。

エンジニアとデザイナの対立


一件デザイナさんの世界はチャラけててオシャレな物に見えますし、実際にそうだったりするかもしれない。イベント/パーティ開いて今後のWebをマーケティングと絡め、Webをリードしていくのはデザイナだ!と言ってる風に見えるかも知れない。

それに比べてエンジニアはデザイナの書いた画面を、いかにデータベースと結び付け、ハッキングし、速度劣化を防ぎ、セキュリティホールを塞ぎ、効率良く開発およびテストするかを考え、リードというよりはフィードバックで貢献しているように見える。
私は今回の件を傍観者としてこんな感想を抱いた。

デザイナさんとはエンジニアの事なんて気にせずWebのマーケティングについて模索し続け、業界人と呼ばれてリッチな生活を送るのもある意味良いと思う。イベント/パーティで儲けてもいいと思う。もちろんエンジニアを卑下する事は許されないけど。
ああいったイベント/パーティは、内面的にもWebをビジュアル的に感じられ、いわば「俺達がWebをリードしてやるんだ」くらいの気持ちになれ、興奮出来る要素が必要なのかもしれない。
デザイナさんの中には「エンジニアは俺たちが描いた構図をただ実装してりゃいいんだよ」なんて言う人も居るかもしれない。

私は、あながち間違ってないと感じる。

専門は専門家に任せるべきであって、デザイナは表面を作りエンジニアは内面を作るのが良いと思う。デザイナとエンジニアの間で摩擦が起こる事は、良い物を作る上で不可欠だと思う。それがWebの発展へ繋がると信じてます。

イベント料金について


イベント料が高いという意見は企業としてではなく個人の意見なら全く問題ないと思う。
人によっては安いと感じるかもしれないし、参加してよかったという意見もあるでしょう。
そんな意味で今回、開催者側が収支を公開されたのは私にとってある意味ショックな事でした。できれば「有料イベントですから...」くらいで返すべきではなかったかと思います。

また今回、幾らかの方が不信の念を抱いた件と、amachang氏が不信の念を抱いた件は明確に別件で、混同する事は両者にとってマイナスになり得ると思いました。どちらの件も別途議論すべきです。
もちろんエンジニアがWeb界をリードしていないという訳でなく、amachang氏を始めとする多くの技術力の高いエンジニアがWebを、また開発手法をリードしていって下さっています。

今回のイベント/パーティが明確に招待客のターゲットを決めておられたならば...
Webの新しい世界を精神的の感じたい人、デザインでマーケティングが生まれる事を認識したい方をターゲットにしていたならば...
このイベント/パーティは元々ギークな人間には向かなかったんじゃないかと感じました。


少なくとも私は、ボタンの位置を数ピクセル移動しようか一日迷う仕事よりは、一日中javascriptを書いている方が興奮を得られる方の人間です。

2007/07/17

はてな
PLAYLOGMashUp Awardが開催されています。
適当にYahoo Pipes!でパイプってJSONで取得するものを作ってみました。
URL:PLAYLOG Playlist(JSON)
ただ、Yahoo Pipes!側が悪いのか、日本語を含むアーティストが文字化けを起こしています。だれか解決方法知ってたら教えて下さい。
使用は適当にどうぞ...
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script type="text/javascript"><!--
if (window.addEventListener) window.addEventListener("load", loadScript, false);
if (window.attachEvent) window.attachEvent("onload", loadScript);
function loadScript(){
  var script = document.createElement("script");
  script.charset = "utf-8";
  script.src = "http://pipes.yahoo.com/pipes/pipe.run?...";
  document.body.appendChild(script);
  document.getElementById('result').innerHTML = "<em>reading...</em>";
}
function callback(data){
  var html = "";
  for(n = 0; n < data.count; n++) {
    link = data.value.items[n]['playlog:artistlink'];
    artist = data.value.items[n]['playlog:artist'];
    title = data.value.items[n]['title'];
    html += "<a href=\"" + (link ? link : "javascript:void(0)") + "\">";
    html += (artist ? artist : "unknown") + " - " + (title ? title : "unknown");
    html += "</a><br />";
  }
  document.getElementById('result').innerHTML = html;
}
// --></script>
<title>Sample</title>
</head>
<body>
<h1>PLAYLOG</h1>
<div id="result"></div>
</body>
</html>

はてな
狐の王国 はてなスターで甦る高橋名人の想い出。
実は私、最盛期には16.5連射を放つ事が出来ました。シュウォッチと呼ばれる連射測定機で16.5連射を記録した事があります。その頃高橋名人が16連射を誇る頃、小学生だった私はヒーローだったのです。

もちろん、顔は画面等見れずプルプルした状態の連射なので、実用出来る程では無かったのですが...

皆から「スゲー」の歓声を浴びて数日、毛利名人が紙面に登場しました。毛利名人は人差し指、中指、薬指を八手のようにコントローラに当て、左右に反復運動する事でほぼ2倍の連射をあみ出しました。そして私の「ヒーロー」という肩書きは消え去りました。
しかしながら「連射が出来る」事は、その頃の子供にはステータスであり、それは名人との距離を測るものでもありました。
特に燃えたのが、ハイパーオリンピック。物差しを使い、机と専用コントローラに対して斜めに置き、下から物差しを弾く事で驚異的な連射を実現できる技は、その頃の子供達にとってセンセーショナルでした。

ここで、これだけで飽き足りなかったのが、私。
その頃流行っていたミニ四区「ファイヤードラゴン」のモーターを取り出し、先に付いているギヤを1枚おきに削り落とし、ファミコンコントローラのボタンに斜めに当てたのです。
単2電池をセロハンテープで止めたモーターは、けたたましい音と共に回転し、画面の「スターフォース」ではほぼ無敵の連射能力