それにシェル(将来的にはさらにたくさんのスクリプト言語)をAndroid上で実行できるのはご存じだろうか。ASEのインストールからスクリプトの作成、実行まで、すべてAndroid単体でできる。PC上でコーディングしたい場合は、USBで繋げてPC上のスクリプトをAndroid端末上で実行することもできるし、PC上のコードをAndroid端末にコピーすることもコマンド一発だ。各種センサー、位置情報、SMS、テキストの読み上げなどもスクリプト上で操作できるというのだからこれを使わない手はない。そこで、試しにPythonスクリプトを書いてみた。Android端末のGPS機能で緯度経度を取得して、逆ジオコーディングで現在の住所を表示するスクリプトだ。APIのURLなどを含めた雛形だけPCからAndroid端末(HT-03A)にコピーして、通勤時の電車の中で書いたのが以下のコードだ。droid.makeToast(address)シェル環境が使えるので、print文を使ったデバッグも簡単だった。苦労すると思われたソフトキーボードもQWERTY配列と予測変換が使えるので思ったよりも楽だったし、トラックボールでのカーソル移動、コピー、カット、ペーストもある。できればキーボード付き端末が欲しいところだが、これからAndroid端末はたくさん出てくると予想されるので、そちらに期待している。proが日本で出て欲しいところだ。因みに、作成したスクリプトはASE上でも実行できるし、ホーム画面にショートカットアイコンを作って直接実行もできる。SDKとJavaになるのだろうが、個人的に使う小さなスクリプトならASEの方が端末上でサクッと書けるし、比較的大きなコードでもPC上で作成し、PCに端末を接続してデバッグ、完成したら端末にコピーすればいい。それに、様々なスクリプト言語が使えるので、自分が使いたいスクリプトを選べるのも魅力だ。対話環境も利用できるのでスクリプト言語の勉強のために使うのもありだと思う。以下に、ASEの導入方法と使い方を書いておく。Marketで配布されるらしい)、Androidの設定で[アプリケーション]-[提供元不明のアプリ]のチェックをオンにしておく必要がある(インストール後にはオフに戻しておくこと)。downloadsにある最新版をダウンロードして、そのままインストールする。ASEを起動し、メニューを開くと[Interpreters]の項目があるので、それを選択する。初期状態ではShellだけが選択できるようになっているが、他のスクリプト言語を入れたい場合は、メニューを開いて[Add]を選択する。ダイアログが開き、複数のスクリプト言語が表示されるので、使いたい言語を選択する。選択すると自動的にダウンロードされインストールされる。SDKをインストールする必要がある。以前に導入方法を書いたので、そちらを参考にして欲しい。これでASEを使用する準備が整った。使い方まず、端末上でのコーディング方法を説明する。ASEを起動してメニューを開き、[Add]を選択するとダイアログが開くので、作成したいスクリプト言語を選ぶ。ソースコードの雛形が出るので、それにコードを書いていく。書き上がったら適当なファイル名で保存する。実行するにはASEを起動した最初の画面で表示されるスクリプトファイルを選択してもいいし、スクリプトのショートカットを作っておいてホーム画面から起動してもいい。Shortcut]を選べばいい。次に、PCとAndroid端末をUSBで接続してAndroid上で実行する方法を示す。Environment)入門を参考にさせてもらった。最初にPCとAndroid端末をUSBで接続する。このとき端末側の設定で[アプリケーション]-[開発]-[USBデバッグ]をオンにしておく。ASEのインタプリタ起動時に表示されるAP_PORTが55063で、PC上のポートを4321(任意の未使用ポートを選べる)とする場合は、Windowsでは以下のようにコマンドプロンプト(シェル)上で設定する。因みに%はプロンプトを示している。AP_PORT=4321最後にデーモンを停止してポートを閉じる場合は、以下のコマンドを使う。kill-serverまた、PCにもAndroidで使用するスクリプト環境が入っている必要がある。2.6をインストールしておき、さらにandroid.pyを、PythonをインストールしたディレクトリのLib/site-packages/にコピーしておく。これでPC上で実行したスクリプトがAndroid端末で動作する。最後に、PC上で作成したスクリプトをAndroid端末にコピーする方法だが以下のようにすればコピーできる。将来にわたってコピー先のディレクトリが不変である保証はない。shellとすればリモートシェルが立ち上がるので、以下のように調べることができる。IMEやOpenWnnになっているとASEのインタプリタ上で文字を入力できなかった。入力するには入力方法をAndroidキーボードにする必要がある。スクリプトの作成・編集についてはどの入力方法でも問題はなかった。追記(2010/4/5):記事を書いた時点でのASEはase_r16.apkだったが、現在の最新版はase_r20.apkになっている。頻繁に更新されるのでダウンロードする際は最新版の確認をして欲しい。r22からreadLocation()のデータ構造が変更されたようなので、それに合わせて上述のコードを修正した。以前に読んでいてしかるべき本であったが、読みそびれていた。技術的な話だと思っていたのだが、(プログラマであれば)気軽に読めるとても面白いエッセイ集だった。個人的に興味深かったのは、第4章の「天邪鬼の価値」で、ジョブズとウォズニアックが錠開け装置をいじっている写真だ。リチャード・ファインマンがマンハッタン計画で重要書類の入っている金庫を破ることを楽しみにしていたり、グレアムが学生の頃のMITではピッキングが流行ったりしていたそうだが、それを読んで、自分が子供の頃のことを思い出した。古いダイアル式南京錠が家にあったのだが、それは錠が閉まっていて親に聞いても番号が分からないという。そこでどうやったら開けることが出来るかを考えるうちに面白くなり、次第に夢中になっていった。ダイアルは3桁の数字なので、10*10*10=1000通りを試したら必ず開けられる。そんな面倒なことはしたく無い。悪用されても困るので詳しくは書かないけど、しばらくいじっているうちにキーの動きに法則があることに気がついた。なれば簡単で、最大で10+10+10=30通りを試すだけでよくなる。これで開かない錠前を開けることができた。今で言えばセキュリティに欠陥があるということなのだろうが、困難だと思われることに挑戦し、それを克服することは、とても強い達成感となる。子供ながらにそう感じた。ファインマンもMITの学生もそう感じたのだろう。これがハックする理由の原点だろうか。第13章の「オタク野郎の復讐」を読めば分かるけど、ポール・グレアムは熱心なLispハッカーで、Lispを非常に高く評価している。確かに他の言語の意義についても説いてはいるけど、「他のプログラミング言語はとうとう(Lispの生まれた)1958年に追いつこうとしている」と書いていることからもLispが最も良い言語だと考えているのが分かる。確かにLispは良い言語だと思うけど、個人的には万人にLispを勧めることはできないなぁ。自分の場合は、普段はC++とPythonを利用していて(多くの場合はこれで事足りる)、最近は並列化のためにTBBやCUDA、それとErlangを使ったりしている。Androidで開発するときはJavaだし、グラフィカルなことをしたいときはProcessingやActionScriptを使うし、他にも様々な言語をいじったりするけども、結局、言語の選択はその環境と目的に強く依存されると思う。それに、複数の言語から選択できる方が一つの言語に固執するより健全じゃないかなぁ(一つの言語を極めてみるというのには異存はないけど)。複数の言語を覚えるのは大変そうに思えるかもしれないけど、最初に2~3の言語を習得すれば、それ以降はあまり苦労せずに覚えることができると思う。Lispライクなマクロ言語を搭載したxyzzyが手軽だ。LinuxならCLISPやSBCLがよく使われている。Essaysから読むことができる。日本語訳はnaoya_t:ポール・グレアムのエッセイと和訳一覧でまとめられているので、興味のある方は読んでみてはどうだろうか。Prescodの「PythonとLispの関係について」(川合史朗訳)を読んでみることをお勧めしたい。書籍2010年2月5日金曜日Erlang基礎文法最速マスターTweet先日、Lua基礎文法最速マスターを書いてみたが、予想以上に自分自身への学習効果が高かった。そこで、普段使っているPythonと同じぐらいに使いこなしたいと思っていたErlang(アーラン)の基礎文法最速マスターを書いてみることにした。Erlangが関数型プログラミング言語であることもあり、書き下すのは思ったよりも大変だったが、学習効果はかなりあったと思う。言語を習得したいときはこのようなまとめを書いてみるのが良さそうだ。手続き型プログラミング言語に比べて異なる部分があまりにも大きいので、すべてを説明することは難しく、これを読んだだけですぐに使えたりはしないかもしれない。間違っていたり、足りない部分などがあったら、教えて頂けるとありがたい。対話環境コマンドラインからerlを実行すると対話環境(シェル)になります。コマンドの最後にはピリオド(.)が必要です。help()で簡単な説明を読むことができます。ok画面出力io:formatで書式指定の出力を行うことができます。"erlang"]).コメント%から行末までがコメントになります。ブロックコメントはありません。慣例として%%がよく使われます。コメント.変数の代入Erlangの変数の先頭は必ずアルファベットの大文字かアンダーバー(_)になります。一度代入すると後から変更できません。代入した変数のことを束縛変数と呼びます。代入されていない変数のことを未束縛変数と呼びます。変数は動的型付けなので宣言は必要ありません。Aは束縛変数だが、パターン照合が一致するのでエラーにならない.実のところ、=は代入演算子ではなく、パターン照合演算子になります。5のAは未束縛変数であり、どんな値にもパターンが一致するので5の照合が成功して、Aに5が束縛できるのです。5では、既にAは5に束縛されているので、数値の5か、5の値を持つ変数とだけ照合が成功します。Erlangで重要な要素の一つにアトムがあります。アトムとは数値以外の不変値を表すのに使用します。C言語の列挙子などが近い存在です。アトムは通常アルファベットの小文字から始まります。変数に代入することができます。hello.また、先頭文字を大文字にしたり、空白や特殊記号を使用したい場合はシングルクォーテーション(')で囲むことでアトムとなります。atom.'.ある項目を一つにまとめたい場合はタプルを使います。タプルは中括弧({})で括ることにより作れます。10}.タプルから値を取り出す場合、パターン照合を使います。パターンが一致しないのでエラーになり、Eは未束縛変数のまま.いくつかのパターン照合の例を以下に挙げておきます。5]が入る.スクリプトの実行コンパイルして実行するには以下のようにコマンドを実行します。ソースコードをコンパイルするためには、先頭でモジュール名をアトムで指定する必要があり、モジュール名は基本的に拡張子を除いたファイル名が使われます。ソースコードのファイル名がtest.erlであれば、-module(test).と指定します。-exportについては後述の関数の説明を参照してください。stopで終了させています。次に示すように、escriptで実行すればコンパイルは不要ですが、実行時に呼ばれる関数はmain/1となります。-moduleと-exportは必要ありません。worldコマンドライン引数を取る場合は、以下のようにします。数値の表現Erlangは最後がピリオド(.)になるので、1.は整数の1であり、実数の1.0ではありません。実数の1.0にするには、1.0.と書く必要があります。(剰余)インクリメントとデクリメントErlangは関数型言語で代入は一度しかできないので当然インクリメントはできません。リストErlangでは角括弧によりリストを作ることができます。単一代入なので一度作成したリストを変更することはできません。変更したい場合は別のリストを作成します。3].リストの要素への参照Erlangではリストの先頭のインデックスは1となります。ダブルクォーテーション(")で括ると文字列になりますが、Erlangではそれを整数のリストとして扱っています。整数と浮動小数点数の比較以外では==と/=の代わりに、=:=と=/=を使うようにしましょう。関数Erlangでは関数名は必ずアルファベットの小文字から始まり、以下のような構文になります。式N.式はカンマ(,)で区切り、関数の終端はピリオド(.)になります。モジュールの外部から関数を呼び出すためには-exportアノテーションで関数を指定しなければなりません。main([A])を呼び出したい場合、-export([main/1]).のように指定します。これは引数が1つあるmain関数をエクスポートするという意味です。Erlangでは引数の個数のことをアリティと呼びます。因みに、-exportで関数を指定しなくても、-compile(export_all).とすれば、モジュール内の関数すべてを外部から呼び出せます。以下のsum関数は再帰を使ってリスト内のすべての要素を足し合わせます。ここでは引数のパターンが[]と[H|T]の2種類出てきていますが、上から順にパターンが照合され一致する関数が評価されます。それぞれの関数の区切りにはセミコロン(;)が使用されます。sum(T).関数名の右側にあるwhenとはガードと呼ばれるパターンを補助する仕掛けで、このガードの条件を満たさなければパターンが一致していても式は評価されません。以下のsum_odd関数はカードを使って奇数のみを足し合わせています。sum_odd(T).サンプルプログラムとして、ガードを使ってFizzBuzz問題を解いてみます。1から100までを表示する場合はfizzbuzz(100).と実行します。[N]).パターン照合を使って以下のように書くこともできます。5)]).Erlangでは、funを使うことによって無名関数を使うことができます。endパターンを1から順に条件と照合して一致するパターンの式を返します。case文でもガードを使うことができます。50の条件に一致しないので式は評価されません。50の条件とも一致するので式が評価され、アトムthreeがXに入ることになります。最後のパターンtrueはすべての条件と一致します。上述のFizzBuzz問題をcase文とリスト内包表記(後述)を使って1行で書くこともできます。end.for/while文Erlangにはfor文もwhile文もありません。その代わりに関数を使って表現できます。C言語のfor文を使った以下のようなコードについて考えます。}Erlangではこれを以下のように書くことができます。ファイル入出力ファイル操作にはfileモジュールを利用します。W).バイナリデータinput.datを読み込んで、それをoutput.datに2回書き込みます。並行プログラミングmy_server.erlに以下のコードを作成します。モジュール名:関数名/アリティ)のように呼び出します。モジュール名:関数名/アリティは、関数の参照を行うための記法になります。helloメッセージを送ることによりプログラムから返事が返ってきます。上記のプログラムではbyeと送ることで終了します。[引数])のように使うこともできます。[]).並行プログラミングはErlangの存在を際立たせているのですが、ここで扱うには規模が大きすぎるので割愛します。詳しくは参考サイトなどを参照してください。型はありませんが、アトムのtrueとfalseが真偽値のリテラルとして使われます。5]).定義された関数を使う場合は以下のようになります。上述のmap関数はリスト内包表記を使って以下のように書くことができます。25]上述のfilter関数は以下のように書くことができます。マスターというプログラミング言語の解説が流行ってるようなので、便乗してみた。個人的にはC++やPythonの方が慣れ親しんでいるのだが、自分でも勉強できるように普段使っていない言語を書いてみることにした。以前にここのブログで言及した言語、Processing、Erlang、Lua、PowerShellなどの中でもErlangとLuaに興味があったので、比較的書きやすいLuaを選んでみた。Wikipediaによると、Luaはブラジル・リオデジャネイロのカトリカ大学で生まれた手続き型言語だ。高速な動作、高い移植性、組み込みの容易さが特徴だ。ホストプログラムへの組み込みが容易であることもあって、コンピュータゲームなどで利用されている。Warcraftなどがある。小飼弾氏もなんてめんこい言語と述べているように評価が高い。Lua基礎文法最速マスターを書いてみる。上述のように自分にとっては勉強を兼ねて書いているので、間違いや記述漏れなどがあるかもしれない。コメントなどで指摘していただけるとありがたい。C言語の連携など、足りない部分については随時追加していく予定だ。「C言語とLuaの連携」を追加した。対話環境Luaは対話環境として実行できます。利用することもできます。2)コメントハイフン2つ(--)から行末までがコメントになります。最後の]]を--]]としておけば、先頭の--[[を---[[と変更することでコメントを外すことができます。大域変数には宣言はありません。局所変数にはlocalを使います。"world"Luaでは多重代入することができます。3多重代入を利用してスワップが可能です。aとbの値を入れ替える.スクリプトの実行コマンドラインから以下のように実行することができます。test.luaまたコマンドライン引数はテーブルargに保持されます。実数と整数の区別はありません。dは同じ数値になります。(累乗)インクリメントとデクリメントLuaには++演算子や+=演算子がないので以下のように記述します。シングルクォート(')かダブルクォート(")で囲みます。2重の角括弧([[~]])でも文字列となり、エスケープシーケンスなどもそのまま表示できます。abc\defが1行で出力されるstring.format関数を利用してC言語のprintf関数のような書式設定ができます。12.34567)"%q"は、安全に読み出せる文字列に書式化します。分割については標準ライブラリにないので自前でsplit関数を用意します。}配列の要素の参照と代入Luaでは配列の添え字(インデックス)は通常1から始まります。テーブルLuaのテーブルは連想配列になっていて、nilを除く数値や文字列を添え字とすることができます。上述の配列についても基本的にはテーブルとなります。テーブルを入れ子にしたり、関数を保持させることもできます。end汎用forループとipairs/pairs関数を使って配列/テーブルを出力できます。偽の時にfalse、真の時にtrueを返します。関数内に関数を作ることができます。io.output関数があります。割り当てられています。出力を標準出力にする.C言語のようなファイル入出力にはio.open関数を使います。C言語とLuaの連携LuaではC言語と連携を取るためのAPIが充実しているので、C言語からLuaを利用することも、LuaからC言語を利用することも簡単です。基本的な流れとして、スタックに積んだデータをやりとりすることになります。以下にサンプルコードを示しておきます。LuaからC言語を利用する場合も、C言語からLuaを利用する場合も、C言語のソースコードをコンパイルしたファイルから実行されます。-lmでコンパイルできます。string上記の方法だと、LuaからC言語の関数を呼び出す場合でもC言語からLuaのコードを呼ばなくてはならず、コンパイルが必要になります。そこで、以下にC言語による関数をWindowsのDLLファイルおよびUnixの共有ライブラリファイルのモジュールとして呼び出す方法を書いておきます。関数の内容は上記のコードと同じで、func1とfunc2を定義しています。Studioでのコンパイル方法は以下の通りです。/LDgccでのコンパイル方法は以下のようになります。cmodule.so実行は、通常のLuaスクリプトと同じです。真偽値falseとnil以外はすべて真になります。よって、0や""や空のテーブルなどもすべて真です。nil初期化されていない変数はすべてnilが入っていることを利用して、orを使ってデフォルト値を設定することができます。aに何も代入されていなければ10が代入される.外部Luaファイルの読み込み外部Luaファイルの実行やテーブルなどのデータを読み込む目的で利用できます。dofile("file.lua")文字列をプログラムとして実行Perlなどのeval機能として、loadstring関数があります。Engineメッセージボード*当ブログに関する意見や要望などにお使いください。Googleアカウントでログインすることで書き込みができます。Twitterへの送信を同時に行うこともできます。ストリートビューで散歩*Googleマップのストリートビューを利用して散歩をするWebアプリです。ストリートビューとマップを分割してマーカーを視界タイプに変更することで使いやすくしてあります。APIを利用したグラフ・チャート作成ウェブアプリです。クリック一つで簡単にグラフを作成できます。ブログ記事への貼り付けなどにどうぞ。OpenIDテスト*OpenIDによるログインのテストを行います。mixiであればクリック一つで、他のOpenIDアカウントであればそのURLを入力することでテストできます。一言コメント表示機能付きです。HTML文字変換*テキストで使われているHTML特殊文字をウェブで表示できるようにするための文字変換ウェブアプリです。プログラムのソースコードなどをブログ記事に貼り付けるときなどに便利です。短縮URLチェッカー*フィッシングサイト判別機能付き短縮URLチェッカーです。テキストボックスに変換したいURLを入力すればbit.lyの短縮URLが表示され、bit.lyの短縮URLを入力すればもとのURLが表示されます。展開されたURLがリンク付きで表示されますが、もしフィッシングサイトの疑いがある場合は警告が表示されます。Trendsの急上昇ワードをランキング順に表示します。Googleでのキーワード・画像検索やWikipediaによる用語の説明もあります。※GoogleがAPIの提供を終了したため、現在停止中です。自己紹介noxゲームを楽しむだけの余裕と感性は失いたくないnoxです。