500グラムの6種類の錘があります。それぞれの錘はいくつでも使うことができます。ある重さを量るときに使う錘の組み合わせは何通りになりますか。それを求めるプログラムを書いてください。ここで量る重さはグラム単位の整数とし、最大で100キログラムとします。}この手のアルゴリズムの問題に慣れた人なら簡単だと思う。自分はこれと同類の問題を初めて聞いたときに即座に書けなかったので自戒を込めてここで書いてみた。ところで、このコードで使っているメモ化だが、これをしないと実用的には使うことはできない。2,000グラムの組み合わせを求めた場合、メモ化していれば自分の環境では0.002秒で答えが出るが、メモ化していないと85秒も掛かる。因みにこの場合の組み合わせは4,443,355通り。プログラミング2010年11月8日月曜日Android端末による自動通訳を一行のPythonコードで実装するTweet最近このブログではAndroidのSL4Aネタが多いのだけど、それだけ遊べるのだから仕方がない。SL4AのPythonを使えば実質一行で自動通訳プログラムを作ることもできる。日本語で喋った文章が翻訳されて英語の音声で返ってくる。変更すれば別の外国語に通訳することもできる。変更すればフランス語に通訳される。通訳した外国語はGoogleによる翻訳の精度に依存するので、実用的に用いるにはもう少し精度が良くなって欲しいところだ。それでもこれだけ簡単に自動通訳プログラムを作れるのだからAndroidとSL4Aは大したものだと思う。以下にもう少し分かりやすいコードを示しておく。ついでに翻訳結果をダイアログに表示するように変更してある。1年前に購入したHT-03Aからの機種変更になる。Androidのバージョンは1.6から2.2となり、性能は格段に良くなった。この1年での技術の進歩には驚かされる。SでSL4Aが利用できるかは気になるところだが、実は購入する前に既に動作することを確認していたので、その点については心配なかった。SL4Aが使えなかったら、多分購入しなかったと思う。この新しいAndroid機を使って、SL4AのPythonで日本語を喋らせてみることにした。英語であればttsSpeakのAPIを使えば一発なのだが漢字かな混じりの日本語では簡単には行かない。デベロッパーネットワークの日本語形態素解析を使うことにした。これなら助詞の「は」も「わ」という発音であることがわかるし、後々、応用が効くだろう。作成したソースコードは最後に示してあるが、短いコードで簡単に実装できた。使い方も簡単で、入力ダイアログから喋らせたい文章を入力するだけだ。Soupで解析している。取得した平仮名をその発音に近い英語に直すだけだ。ローマ字に置き換えるだけでは日本語として正しく発音されないので、適当にいじってある。Projectなどを利用して、ちゃんとした日本語を喋らせるようにしたほうが良いのだろうけど、形態素解析を使ってみたかったし、英語を無理やり日本語にするところも面白かったので、今回はこれで良しとした。自分が楽しめないとね。例によって、このプログラムを使って子供相手に遊んでみた。元の文章を知っていれば問題なく聞き取れるのだが、知らないと思ったよりも聞き取れないことを逆手に取って、何を喋っているかを当てるゲームをしてみた。こんな単純なことなのだが、子供たちは思いのほか楽しんでいたようだ。インチキ外国人ぽい雰囲気が面白いらしい。作成したソースコードは以下の通り。droid.makeToast(text)インチキ外国人なら喋る内容もインチキっぽくしようと思い付いたので、入力した文章をGoogleの翻訳APIで英訳し、それをまた和訳するという処理を挟んでみた。」と入力したら「最高のお問い合わせください。これはジョークプログラムにしかならないけど、形態素解析を利用した人工無脳に仕立て上げたりするのも楽しいかもしれない。上記のspeak_ja.pyに以下の赤で示したコードを追加すればいい。プログラミング2010年10月9日土曜日Android端末上に電子掲示板システムを構築する方法Tweet最近になって日本においてもAndroid端末が続々と発表されて巷で賑わいを見せている。HDと立て続けに発売される。このほかにも年末までにタブレット端末を含めた複数のAndroid端末が発売されるようで結構なことだ。Androidも盛り上がってきたし、Android端末を使って手軽で役に立つことができないか考えてみた。そこで今回、Android端末をウェブサーバにして、そこに電子掲示板システム(BBS)を構築してみた。これさえあれば不意にプライベートなBBSを使いたくなったときにいつでも利用することができる。ライトニングトークやセミナーなどのようなイベントの参加者からその場でちょっとしたアンケートや感想を貰いたいときに便利ではないかと思う。した話題作りにもなるかも。電子掲示板システムの作成に必要なものはAndroid端末とSL4A/Pythonだけ。SL4Aを使ってサーバを立ち上げてから、android_bbs.pyを起動すれば完了だ。SL4Aによるサーバの起動方法とアドレス取得についてはPythonを使ってAndroid端末を5分でリモートカメラにする方法で書いたのでそちらを参考にして欲しい。今回の電子掲示板システムはPythonを使って即席で作ったこともあってエラー処理などを入れずに30行ちょいのシンプルな作りになっている。sqlite3モジュールによるSQLiteデータベースで記事を管理し、wsgiref.simple_serverモジュールを使ってウェブサーバ構築した。Android独自の機能は使っていないのでAndroid端末専用というわけではないけど。Android独自の機能を入れるとしたら、たとえばTwitterなどの投稿者の位置情報表示に対抗して、投稿者ではなくサーバの位置、さらに向きや速度も一緒に表示されるようにするとか。以下にソースコードを示す。Minutesを知った。SL4AのJRubyを使ってAndroid端末を15分で遠隔操作のスパイカメラにしてしまえるらしい。そこで、Rubyが15分ならPythonを使って5分でリモートカメラにしてしまおうと思い立った。Pythonでは標準モジュールのSimpleHTTPServerやwsgiref.simple_serverを使って簡単にWebサーバを構築することができる。SL4Aを使えばAndroid端末をそのままサーバとして起動させることができる。これを組み合わせればできたも同然だ。それで書いたのが以下のコードだ。10行そこそこでAndroid端末をWebサーバに仕立て上げ、Webブラウザ経由で写真を撮ることができる。こんなちっこい端末がWebサーバになるなんて世の中進歩したものだ。httpd.serve_forever()使い方は次の通り。SL4Aを起動し、メニューボタンから"View"を選ぶとダイアログが出てくるので"Interpreters"を選択する。Server"、"Public"を選択する。これでAndroid端末がサーバとして機能する。Service"をタップする。Monitorが立ち上がるので、Serverのアドレスを確認する。それから先ほど作成したPythonスクリプト(remote_camera.py)を起動する。サーバのアドレスの最後にソースコードで指定したポート(上記のコードでは9998)を加えたURLをWebブラウザに入力する。Webブラウザに入力するURLとなる。これで遠隔操作による撮影が可能になった。ページをリロードすればその度に写真が撮影され表示される。試しに最近購入した書籍などを撮影。これを使って次のような遊びをしてみた。Android端末を見つかりにくいところに隠し、あとでWebブラウザから写真を撮る。その画像とかすかに聞こえるシャッター音を頼りに隠したAndroid端末を探すというゲームだ。子供たち相手にやってみたが皆大喜びだった。広い場所でやれば本当に楽しそうだ。必要なものはAndroid端末とWebブラウザの使えるデバイスだけだ。デバイスもPCではなくAndroid端末のようなスマートフォンで良いのだから手軽だ。これは使い方の一例だが、Android端末とSL4Aを使えば可能性が本当に広がってくる。Environment)について記事にした。Android)に変更され、機能がさらに進化している。APIの充実やインターフェイスの改良、スクリプト環境は独立になり、HTMLインタプリタ導入やAndroidパッケージ(APK)の作成などもできるようになった。そこで改めてSL4Aのインストール方法、使い方、Pythonによるアプリケーションの作成、QRコードによるソースコードの公開方法などを紹介する。導入まず、SL4Aの公式サイトで最新版のSL4Aをダウンロードする。現時点ではsl4a-r2.apkだが、頻繁に更新されるので注意すること。必要なスクリプト環境をダウンロードする。(JavaScript)などがあるが、ここではPythonを選んだ。現時点での最新版はpython_for_android_r1.apkになる。SL4Aとスクリプト環境は独立しているのでそれぞれをインストールする。これらのAndroidパッケージは公式のものではないので、ダウンロード後インストールするためには、Android端末の設定で「アプリケーション」の「提供元不明のアプリ」にチェックを入れておく必要がある。これでSL4AでPythonを使用するための準備は整った。スクリプトの作成SL4Aをインストールすると左のようなアイコンが出てくるのでそれをタップして起動する。Pythonスクリプトファイルの作成するには、メニューボタンから"Add"を選択し(スクリーンショット左側)、表示されるダイアログから"Python"を選ぶ(スクリーショット左から2番目)。すると、Pythonスクリプトの雛形を伴った編集画面になるので(スクリーンショット中央)、それを更新して作成する(スクリーンショット右から2番目)。Run"ですぐに起動できる(スクリーンショット右側)。Browser"を選択するとAPI一覧が表示される。これはコードを書く上で非常に役に立つ。ここで実際にアプリを作ってみる。前にPythonワンライナーで数独ソルバを作成したのでそれをAndroidアプリとして作り替えてみた。ワンライナーではプログラム中に問題を埋め込んでいたが、Androidではそれダイアログから入力するように変えた。入力時に電話のテンキーにすれば素早く片手で入力できるようになるが、HT-03Aではなぜか全角文字になってしまったのでそれをASCII文字に変換するテーブルも追加した。ワンライナーのようなコンソールへの出力ではバックグラウンドでの動作ができないので、ダイアログで表示させるように変更した。作成したのが以下のスクリプトだ。S(map(int,P))sudoku_solver.pyを起動するにはファイル一覧からsudoku_solver.pyをタップする。すると以下のような5つのアイコン(左から順に、コンソール上での起動、バックグラウンドでの起動、編集、ファイル名の変更、削除)が現れるのでそのうち左の2つのアイコンのどちらかを選ぶことで起動できる。今回はバックグラウンドで起動した。起動後、以下のようなダイアログが出てくるので問題となる数独を入力する。以下が入力が完了した状態。ここでOKボタンを押すと解析が開始される。解析が完了すると以下のような解答が表示される。スクリプトの共有これでスクリプトによるAndroidアプリを作成することができた。作成したアプリを別の人にも使ってもらうために公開したい場合はどうすればよいのだろうか。ソースコードをそのまま公開することもできるが、それだと一々Android端末にコピーしなくてはならず、場合によっては打ち込み直すはめになり、面倒だ。そこで、QRコードを使ったスクリプトの共有がある。4,296文字という制限があるが、今回のような短いコードでは十分だ。Generatorを利用する。)としたスクリプトのソースコードを入れる。size"は"L"とする。これで"Generate"ボタンを押せばQRコードが生成される。次にQRコードからソースファイルに戻す方法だが、Android端末でSL4Aを起動し、メニューボタンから"Add"を選ぶ。Barcode"でQRコードを読み込むだけだ。MarketからZXingのQRコードスキャナー(無料)をインストールしておくこと。これで簡単にコードを共有することができた。因みにこの記事の先頭に表示しているQRコードは今回作成した数独ソルバのソースコードになっている。***まだドラフト段階だがAndroidパッケージ(APK)の作成も可能だし、前回ではPCからadbによるコマンドラインでの操作を取り上げたが、いずれもPCとAndroid端末を繋いでの操作になり青空プログラミングという今回の趣旨から外れてしまうし、一回で説明するには記事が長くなってしまうので今回は割愛することにした。それらについては別の機会に書くかもしれない。Eratosthenes)の美しい実装を見て、初めてアルゴリズムの素晴らしさに気付かせてくれたのがエラトステネスの篩だったことを思い出した。そこで、当時を懐かしみながら簡単な実装を書き留めておくことにした。Pythonの実装を以下に示す。コードは比較的短いが、実行効率を優先させているわけではない。HaskellこれはHaskellのサンプルコードでよく出てくる無限リストと遅延評価による実装だが、とても分かりやすいし、美しいコードだと思う。0]以下のように関数takeを使って必要な分だけ素数を取り出すことができる。実行効率はあまり良くない。[2,3,5,7,11,13,17,19,23,29]C++次にC++を使って実装してみた。ここではC++0xを使っている。そのほうが簡潔で分かりやすく書けるし、これからはC++0xがより使われ、普及して欲しいという意味もある。C++では2010(16.0)以降でコンパイルできる。std::endl;上記のコードでは3から100までの素数を表示する。2010)を使って1000万までの素数を生成してファイルに書き出すのにかかった時間は約2秒だった。いえば以前にC++のテンプレートで素数を求めたことがあったな。エラトステネスの篩ではなかったけど。Python最後にPythonによる実装を示す。効率はあまり良くないかも。primesこれをそのままワンライナーに。P]"上記のコードではそれぞれ、赤字の数値が求める素数の上限値となっている。プログラミング2010年8月23日月曜日Pythonワンライナーで数独を解いてみたTweetGIGAZINEに数学のエキスパートが3ヶ月かけて作成した「世界一難しい数独」なるものがあったので、即席でPythonワンライナー(一行プログラム)を作ったら1秒かからず解けた。問題を作るのは大変でも解析プログラムで一瞬とは儚い。in'..53.....8......2..7..1.5..4....53...1..7...6..32...8..6.5....9..4....3......97..'])"コードの最後のリスト内の文字列が9行9列の数独の問題となっていて、上の行の数字から順に入っている。未知の部分はドット(.)で表している。上記のコードではGIGAZINEの問題となっている。Puzzleが参考になるかも。以下、ワンライナーによる出力結果。日本全国ハンバーガーショップ分布地図Tweet以前、Processingを使って日本全国のコンビニ店舗の分布地図を作成したが、今回はハンバーガーショップの分布地図を作成してみた。個人的にハンバーガーショップには小さい頃から思い入れがあって、小学生の頃、初めてマクドナルドのハンバーガーを食べたときに「なんて美味しいんだろう」と感動した覚えがある。今でこそ安価な食べ物という認識だが、当時は他の食べ物に比べて割高であまり頻繁に食べられなかった。その後はだんだんとハンバーガーから離れていったが、モスバーガーと出会ったときに二度目の感動を覚えた。冷たくてジューシーな野菜と熱々のハンバーグが絶妙にマッチしてそれまで食べたことのないハンバーガーだった。少々食べにくくはあったが、逆にそれが溢れる美味しさを表現していたようにも思う。Marketのアボガドバーガーだ。少々値は張るが、普通のチェーン店に比べて味は飛び抜けていると思う。チェーン店ではないハンバーガー専門店なら他にも美味しいハンバーガーがいろいろとありそう。以下に作成したプログラムを示す。分布の表示・非表示を切り替える。起動時はマクドナルドのみ表示。地図を拡大・縮小する。プログラムの作成方法は前回のコンビニ店舗分布地図を作成した方法とほとんど変わらない。住所をネットから取得する。APIで緯度経度変換し、さらにPythonスクリプトでUTM図法に合わせてXY座標変換する。そのデータをtar/gzipでアーカイブし、Processingを使って読み込み、日本地図に表示する。ブログへの貼り付けはProcessingでJavaアプレットにエクスポートできるのでそれを使う。今回の分布地図を見て、マクドナルドよりもかなり後に出てきたモスバーガーの店舗が思ったより多く、全国的に展開していて驚いた。子供の頃に食べた森永LOVEは既に存在せずロッテリアに買収されたことも今回作成する過程で知った。他には東京に最近出現してきたバーガーキングや沖縄のみに存在するA&Wがやや気になった。沖縄のA&Wへは簡単には行けないが、バーガーキングは今度行ってみよう。住所データさえあればコンビニ店舗やハンバーガーショップに限らずどんな分布地図でも作れることだし、何か面白い題材ないかな。(AS3)で作ってみた。プログラムでは初期ルールをライフゲームとしている。初めにC++で書こうと思ったのだけど、Web上でグラフィカルに操作できないとつまらないと思い、AS3でFlashとして作成しwonderflに登録することにした。ついでに時間的なエントロピー変化を視覚的に認識できたら面白そうだと思ったので、それについても実装した。2の問題として出されたからだ。2次元セルオートマトンのサイズと初期配置、それにルールが与えられ、指定した世代で生存セルが最大になるように初期配置を変更しろという問題だ。問題を解くために色々と調べているうちにセルオートマトンが面白く感じられたのでブログ記事にしてみた。言っても今回のコードはコンテストのような特別なチューンなどはしていない。ビット配列や剰余テーブルなどは使っているがどちらかというと読みやすさを優先させている。作成したプログラムを以下に示す。最初に実行されるルールはライフゲームだ。セルの回りに2つの生存セルがあった場合、そのセルは現状「維持」となり、3つの生存セルがあればそこに生存セルが「誕生」する。生存セルが1つ以下か4つ以上の場合は死亡セルとなる。上端と下端、右端と左端は繋がっていて周期境界条件となっている。現在のルール設定はFlash画面の左下に[..=+.....]と表示される。「変化」(死亡セルであれば生存セルとなり、生存セルであれば死亡セルとなる)となっている。ルールの右隣にある数値は初期状態の生存セルの割合で、その右隣の数値は現在の生存セルの割合を示している。初期状態の生存セルの割合はXキーで増加、Zキーで減少させることができる。上に書かれているFPSは1秒間に表示されるフレーム数を示し、Nは現在の生存セル数、Hはエントロピーを示す。ここでエントロピーについての説明をしておく。時間的なエントロピーHについては下記の情報エントロピーの式を用いた。1世代におけるセルの変化は0→0、0→1、1→0、1→1の4通りあり、それらの確率Pkからエントロピーを求めている。2次元セルオートマトンの相転移と結晶化)。表示されるセルの色は生存セル数が多いほど赤く、少ないほど青く表示される。背景色はエントロピーに比例しており、エントロピーが高いほど明るい緑となり、低いほど暗くなる。以下にいくつかのルールによる変化を例示する。0.3これはライフゲームのルールであり、初期生存セル数の割合は0.3としている。最初は生存セル数が多くエントロピーが高いので背景は比較的明るい緑となっているが、徐々に生存セル数およびエントロピーが減ってきて暗くなってきている。5万ほどいた生存セルも1万を切るぐらいに減ってしまい、活動しているセルも縮小していることが分かる。0.9これはライフゲームのルールに周りが4つのセルで「誕生」するルールを加えたものだ。初期生存セル数の割合を0.9と高くして最初にほとんどのセルを死滅させている(周りの生存セル数が高いと次の世代で「死亡」するため)。これにより非常に少ない生存セルから始めることができる。このルールではほんの僅かに残った生存セルからでも驚異的な再生力を示し、最終的にはすべてに生存セルが生息し、エントロピーは0.98以上と非常に高い値を示す。0.1これは現状維持の性質を非常に強く持ったルールで、初期生存セル数の割合を0.1から始めるとスピードは遅いが侵食するように生存セルが繁殖していき、最終的には全体の75%ほどを生存セルで占める。動きはほとんど見られないのでエントロピーは0.4ほどであるが、生存セル数が多いので画面は赤くなる。0.9なども面白いので試してみて欲しい。セルの繁殖する様は、実際の細胞増殖を顕微鏡で眺めているかのようであり、とても興味深い。小学3年生の授業参観でアルゴリズムに出会ったTweet小学3年生の娘の日曜授業参観に行ってきた。授業の後半、以下のような問題が出された。ゴマダラチョウとトノサマバッタがあるゲームをしている。0から9までの数字の書かれたカードがそれぞれ一枚ずつ全部で10枚あって、それを使って3桁の数を2つ作り、その差をできるだけ小さくした方が勝ちとなるゲームだ。百の位は0にできない。できるだけ小さくするにはどのようにカードを選べばよいだろうか。これを約30人の生徒に考えさせていた。解き方を先に教えるということはしない。生徒が問題を考えている間、先生は生徒たちを見回り、質問などに答える。するといろいろと答えが挙がってきた。自分の娘は以下のように考えたようだ。百の位は差が1であればどの数字でも良いので、まず十の位を最小にする数字を考えてみると、最小の数字0から最大の数字9を引いた場合が最も小さくなる。同様に一の位では0と9以外の最小・最大の数字を選ぶ。1から8を引いた場合が最小になる。百の位は残りの数字カードから差が1となるものを選ぶ。解答例は「501-498」や「701-698」となり、差は3になる。これはまさにアルゴリズムだ。Pythonであれば以下のコードと同じだろう。3小学3年生の算数だと思ってそれほど期待せずに観に行ったのだが、生徒たちはみな楽しそうに問題に取り組んでいたし、なかなか面白い授業をしているようで何だか安心した。因みに、今回のようなクラス全員で考える問題は普段からよく行っているとのことだった。雑記2010年6月3日木曜日スーパーコンピュータとプログラミング言語Tweet世の中には星の数ほどのプログラミング言語があるかもしれないが、スーパーコンピュータで利用するとなるとかなり限られてくる。ライフサイエンス分野のデータの処理にはPython、Ruby、Perlなどのいわゆるスクリプト言語はよく使われるし、データベース関連だとJavaなどもあるだろう。科学技術計算に限れば、FortranやC/C++が多数を占めると思う。実行効率と既存資産の存在は大きい。数値計算プログラムでは、とにかく速さが求められる。この質問はナンセンスだと思う。現在の最高速度を誇るスーパーコンピュータの1億倍の速度があったとしても十分ではない。使える資源でできる範囲の計算をするだけなのだから。自分の携わる分野では一回の計算に半年かかることもざらなので、計算速度は死活問題だ。1分で終わる処理なら倍に高速化したとしても差は30秒でしかない。半年となるとその差は3ヶ月にもなる。Fortranを使うにしても、よりモダンなFortran90/95だけではなく、古めかしいが実行速度の速いFORTRAN77もよく使われる。最近は速度差も縮まってきているのでそこまでFORTRAN77にこだわらなくなってきているけど。本当にクリティカルな部分にはアセンブリ言語なども使われている。汎用コンピュータのコンパイラに比べてスーパーコンピュータに最適化されたコンパイラではバグの入っていることが多く、C++でもBoostなどの外部ライブラリは避けた方が無難だ。使うにしてもGoogleのC++コーディング規約のように一部に限定して使う方が良い。実際にBoost絡みのコンパイラバグによる混乱を見るに、STLなどの標準ライブラリのみをシンプルに利用していた方がまだ安全だ(それでもバグるけど)。言ってもBoostは便利なのでできるだけ早くC++0xの標準化がされてほしい。標準化されていればコンパイラベンダも言い訳できないしね。いえばFortressなんて言語もあるね。面白い試みではあるけれど現状で利用するのは難しいような気がするなぁ。冒頭でも述べた、Fortranと同程度の実行効率が出せるかという点と既存資産の代替が存在するのかという点で。World!"は以下のように書くみたい。Environment)を使って「AndroidからPythonでTwitterに投稿する」という記事を書いたが、来月末にTwitterのBASIC認証が廃止されるので使えなくなる。そこで、OAuthを利用するコードに書き直してみた。最近はAndroidのtwiccaがとても使いやすいのでPythonスクリプトによるTwitterへの投稿もあまりないかもしれないが、Android端末単体でOAuthを利用したTwitterの認証ができることを示す意味でも公開することにした。「コマンドラインで動作するOAuth対応TwitterクライアントをPythonで作ってみた」という記事で用意したoauth.pyとoauthtwitter.pyをAndroid機の/sdcard/ase/scripts/ディレクトリにコピーする。pushでコピーしてもいいし、SDカードに直接コピーしてもいい。oauthtwitter.pyは一部修正してあるので上述記事の該当箇所を参照して書き直して欲しい。次に、それらのライブラリを利用して以下のようなコードを書いた。赤字で示した認証コードの部分はTwitterのサイトのOAuthクライアント登録で取得する必要がある。main()使い方は以下の通り。最初の起動時だけOAuthによる認証をする必要がある。ASEを起動して以下の画面で先に示したtw_oauth_ase.pyを実行する。実行させると以下のようにブラウザが起動してTwitterのOAuth認証画面が表示される。「許可する」を選ぶと以下の画面が表示される。表示された暗証番号をメニューボタンから「テキストを選択してコピー」を選び、番号をコピーする。ここまでの作業を一分以内に完了させる必要がある。tw_oauth_ase.pyのtime.sleep(60)の数値(秒)を設定することで完了させるまでの時間を変更することができる。一分後に以下のダイアログボックスが表示されるので、クリップボードにコピーした暗証番号を入力する。クリップボードから入力するにはテキストエリアを長押しすれば良い。認証作業が完了すると以下のメッセージ入力ダイアログボックスが表示される。入力したメッセージがAndroid画面に表示され、Twitterに投稿される。次以降の起動時には最初から上記のダイアログボックスが表示され、認証作業の必要はない。追記(2010/5/16):twitter.pyは日本語だと140文字の半分ほどでツイートできなくなってしまうので、文字コードをutf-8、len(status)をlen(status.decode("utf-8"))に変更してバイトコンパイル、Android端末の/sdcard/ase/extras/にコピーして使っている。combinator)のサンプルコードをC++0xを使って書き直してみた。C++0xだと標準ライブラリだけでこれだけ簡潔に書ける。一行でテキストに含まれるURLをすべて短縮URLに変換するPythonスクリプトTweetテキストに含まれるURLをすべてbit.lyの短縮URLに変換するPythonワンライナーを書いた。使用しているモジュールはre、urllib、urllib2、simplejson。コードに一行追加するだけだし、Twitterなどのメッセージを処理するのに便利だと思う。msg))(link)bit.lyのAPIキーは別途取得しておく必要がある。