AndroidでMyScriptを使う

MyScriptは最近出始めた手書き入力エンジンな訳ですが、オープンソースじゃない事、新しいモノ、ってことでドキュメントが少ない。なので、忘れないうちに最初にやった事を書いておく。

まず、MyScriptからもらったURLにアクセスして、もらったID、パスワードを用いてログイン。そうすると、モジュールをダウンロードする感じの画面になるのだけれども、これがまたややこしい。というのも、モノが多すぎて、どれをどうダウンロードしていいのか分からない。かろうじて分かるのは、androidとiosが区別されている事くらい。とりあえず、iosとついているものと、明らかにc用であるもの以外は全部落とす。(最初androidってのだけ落として、java用みたいなものを落とさなかったら、モジュールが足りなかった。)

で、頑張って落としたら、新しく適当な場所に新しくmyscriptってフォルダを作る。そして、その中をこんな構成に。

myscript_dir

ちなみに、この構成はドキュメントに書いてあります。これは、なんというか、今の所僕は証明書ファイルを作る為にしかこの構成の意味がないと思ってるのですが、とりあえず、myscriptの提供するビルドツールとかをこれから使うにあたって、この構成にしておかないとまずそうなので、この構成にする。ちなみに、それぞれのディレクトリは、先ほど落として来た各モジュールの中にこういうフォルダがあるので、それを一ヶ所に統合したもの、っていう感じです。

AndroidでMyScriptを利用するにはまず、証明書の情報が書かれたファイル(例ではMyCirtificate.java)が必要です。これは、MyScriptのedkのツールを使う事によって自動で生成されます。まずはその作り方から。

ツール自体の場所に移動します。しなくてもいいけど。(ルートフォルダmyscriptに居る事が前提)

bin以下は各自の開発環境に合わせてください。ここではmacでの使い方を書きます。公式ドキュメントによると、ここにあるcertificate2srcがツールですと書いてあるのですが、とりあえず僕の環境では実行属性がついていなかったので、とりあえずつける。

これで準備完了。myscript関連のフォルダ構成がしっかりしていたら、これでビルドツールが正常に動くはずです。対象ファイルをMyCertificate.javaだとすると、こんな感じでコマンドを打つ。

そうすると、同じディレクトリにMyCertificate.javaが出来上がります。ここまでで半分。

よし、とりあえず準備が整ったので、とりあえずサンプルを動かしてみようと思って色々やってたけど、それはそれではまった。

とりあえずサンプルは色々落としてきた中の「MyScript_Builder-equation-android-sample」を使う。とりあえずEclipseを開くと真っ赤になるので、ライブラリを追加する訳ですが、ここでライブラリを追加するのはビルドパスにadd external jarするのじゃなくて、サンプルにもともとあるlibsフォルダにjarを直接突っ込む。jar類は全部「MyScript_Builder-edk_java」の奥深い所に入っている。さらに、libsフォルダの中の、armeabiフォルダの中にネイティブのライブラリを追加する。この場合は、「MyScript_Builder-engine-android」と「MyScript_Builder-engine-android」の奥深くにある、soファイル(x86かarmeabi-v7aかはプラットフォームによる)を追加。結果、こんな感じ(色々試してたので図にはたくさんありますが)。あ、MyCertificateはさっき作ったのに置き換えるのを忘れずに。

eclipse_struct

そうすると、ライブラリ関係は解決。

あともう一息。このプロジェクトの中に実はもう二つ必要なファイルがあるのですが、それがsdcardの下の方に入っているこの二つのファイル。

sd

これなんですけど、実はこのファイルはandroid内に設置する必要があって(myscriptが提供しているこのファイルの読み込み関数の仕様的に)、そのコードは自分で書かないといけない。なので、常套手段である、assetに置いてそれをコピーっていうコードを書いちゃう。

参考:Android SDK assetsの内容を全てローカルにコピーする

こんなコード。

これを実行すると、アプリケーションのデータを格納するスペース、/data/data/パッケージ名….的な部分にファイルを保存してくれます。

利用する方は、Activityを継承しているクラスから、getFilesDir().toString()でそのパスが取れるので、サンプルをこういう風に書き換えてあげれば動くようになります。contextがない場合は呼び出し元のacrivityを引数に取るようにしてください。

こうすることで、やっとサンプルが動かせました。あんまりandroidのファイル構成等に明るくなかったのでちょっと苦労した。

node.jsを効率よくデバッグする

今回はデバッグのやり方について。ホントに大事。

コマンドラインでデバッグ

前回のnode.jsの環境をmacに導入して色々やってみたけど、コマンドラインでデバッグする事が出来る事が分かった。
こうすると、デバッグの画面が出てくる。

debug> って書いてあるように、対話型のデバッガです。この時点で、参照したい変数とかを入力すると、その値が出てくるような感じ。

使えるコマンドは、こんな感じ。

c コンティニュー(そのまま最後まで行く)
r プログラムの先頭から再実行
n 次のステップへ(ステップ実行)
s 関数内を実行(ステップイン)
o 関数内から抜け出す(ステップアウト)

そしたら、とりあえずさっきの状態にnを押してEnterを押してみる。

はい、console.logでhelloが表示されて、3行目まで処理が進みましたね。これが原始的なやり方なんだと思います。一応sb(fileName, line)とか、cb(fileName, line)とかでブレークポイントも設定できるっぽいですが、ちょっと使いづらいですね。

node-inspectorを使おう

それに対して、node-inspectorを使うとエグいくらい簡単にデバッグ出来ます。具体的には、node-inspectorとChromeを用いてデバッグを行います。従って、必要なものは、node-inspectorのインストールとChromeのインストールです。

ここでは、node-inspectorのインストールを書きます。Chromeは適当にやっとく。

まず、githubに公開されているnode-inspectorをダウンロードしてくる。

https://github.com/node-inspector/node-inspector

そして、生み出されたディレクトリに行って、以下のコマンドを実行。

これで、インストールはできるはずです。とりあえずこれができれば準備は整ったも同然。ここからやることは、node.jsのアプリケーションをデバッグ状態で起動して、その実行情報をローカルのwebに公開する。そこで公開された実行情報chromeから覗き見る、といった流れです。

まず、デバッグ状態で起動及びそれをローカルのwebに公開って部分をやります。コマンドはこんな感じ。まずはデバッグ状態で起動。

デフォルトのデバッグポートは5858なのですが、変えたければこうやって書ける。

さっきからやってるhello.jsはコールバックとかないので、1行目でブレークしておきたい。そういうときは、こうやって書く。

次に、node-inspectorを起動し、localのwebに実行状態を公開する。

これで、node-inspectorの起動完了。そしたら、chromeで、こちらのページにアクセス。

http://ホスト名:8081/debug?port=5859

そうすると、あら不思議、デバッグの画面が出てくる。スクリーンショット貼るのはだるいので、昔の攻略本にあった「あとは君の目で確かめてくれ!」って感じでよろしくお願いします。

macにnode.jsの環境を入れる

サーバサイドで動くjavascriptって言われて、「気持ち悪っ」って思ってしまってなかなか手をつけていなかったnode.jsですが、遂にとある事情で手を染めなければならない事に。。

というわけで、macにnode.jsの環境を入れる方法。と思ったんですが、ホントに書くまでもなかったけれども、一応メモ。

というか、パッケージをインストーラでインストールするだけ。ホンマにお粗末。

まずは、こちらからパッケージをダウンロード。超簡単。

http://nodejs.jp/nodejs.org_ja/

あとはダブルクリックして、インストールするだけ。インストールしたらnodeコマンドをターミナルで叩いて確認。

これで、動く環境は整った。試しにhello.jsを書いてみる。

hello.js

書いたら、こんな感じで実行。Hello, World!が表示されれば成功。

以上。次回はnode.jsでデバッグを行う方法。

特定のIPを持った端末がどこにつながっているかを特定する

とりあえずある問題が起こって、特定のIPをもつデバイスが物理的にどこに存在しているのかを確かめる必要があった。事の経緯はこんな感じ。

あるネットワーク内で新しくホストを立てた。ssh接続をしようとすると、なんだかconnection refusedされてしまう。でもpingが通る。色々調べたところ、どうやら同じipを使用する固定ホストが居る事が判明。(bind的には空いていたのだが。。)恐らく誰もその実態を把握しておらず、そのマシンがどこにあるのかすらも分からない。そこで、悪いやつを見つけて対処をしようとなったのが今回の流れ。ちなみに対象ネットワークは、firewall、ゲートウェイスイッチ、その下に10個未満のインテリジェントスイッチがあって、その先が末端orバカハブという感じ。

まぁでもどうやってその場所を見つけようかねってことになって、思いつかれた方法が二つ。

1. L1的な努力で頑張る
上流スイッチから順番にネットワークをL1的に切り分けて行って、疎通しないところに先にそのデバイスがあるはずだ。まぁ要するにpingを飛ばしといて、上流のポートを一つずつ抜いて行って、疎通が切れた先に居るよねという話。まぁ最悪これ。もちろん大事な通信してる時に切れちゃう可能性もあるので、最悪の手段ですが、こうやって見つけられなくはない。

2. スイッチの機能から頑張って追う
僕はインフラ屋さんじゃ無いので、どこまでの情報をインテリジェントスイッチが教えてくれるのか、あまり知らなかったのですが、スイッチだけにどのポートにどのmacアドレスがつながってるかは教えてくれるみたいですね。従って、その端末のmacアドレスさえ分かれば、下流にたどって行く事で先が見えると。

今回はまぁ急ぎじゃなかったので、2でやる方法を調べるかーってことで、みんなで調べながら見事犯人を突き止める事が出来たので、やり方を書いておきます。あ、実際やる方法はめちゃくちゃ簡単ではあります。また、Ciscoスイッチという前提でやってます。

まず、今回使ったのがCiscoのレイヤ2 Traceroute ユーティリティー。これは同じネットワークセグメント内のホスト同士であれば、macアドレスも同時に教えてくれる。コマンドは以下。(ちなみにenable必要)

んで、例えば調べたい対象のipアドレスが555.666.777.888ならば、同じセグメントに属する111.222.333.444のマシンをソースとして、次のように打つ。

そうすると、こんな風に返ってくる。

ここで、何と見つけたいホスト555.666.777.888のmacアドレスが00:00:ff:ff:22:22である事がわかった。とりあえずココマデ分かればベンダーコードから、ある程度どんなマシンかが推測できますね。

次。今度はこのmacアドレスをもとにどのスイッチのどのポートにぶら下がっているかを特定して行く。これもインテリジェントスイッチのmacアドレステーブルを見て行けばいいようだ。macアドレステーブルの見方はこう。

こうすると、こんな結果が返ってきますね。

そうすると、先ほど調べたmacアドレスを見る感じ、どうやらこれはGi0/2の先にありそうだと分かる。そこで、Gi0/2の先にある物を調べる。そして、スイッチだったらまた同じようにmacアドレステーブルを見て、そう出なければそのあたりが犯人という事になりますね。

こんな感じで、特定のipを持つある端末を特定する事が出来ました。

なかなかスイッチの仕組みを知っていても(ipとmacがわかればわかりそうってことを知ってても)インテリジェントスイッチがどこまで情報を提供してくれているのかが分からない状態だったので、暗中模索でしたが、とりあえずインテリジェントスイッチはインテリジェントだったってことで、助かりました。

めでたしめでたし。

さくらのレンタルサーバでowncloudを動かす

ついに最近Dropboxの要領がパンパンになってしまった。。。

一応身内や大学でオンラインストレージサービスは提供されているんだけれども、大学から出たりした時にアカウントがなくなってしまったりとか、そういうのが怖い。永続的な物にしたいと思ったらやっぱり自分で管理なきゃかなと思って、自分のレンタルサーバでowncloudを動かす事にした。

正直レンタルサーバだと通信回線が遅かったりとか、圧迫してるとかいう理由で切られそうで怖かったのですが、とりあえずは今のところ動いています。ただ、やっぱり遅い。

やり方は非常に簡単で、3ステップ。

1. webインストーラを公式ページから持ってきてowncloudのディレクトリを配置したい場所に置く
2. それにブラウザからアクセスして設定(その際サーバの.htaccessをちょこちょこいじりながら進める)
3. owncloud用のphp.iniを作成する

まず1は超簡単。公式ページ(http://owncloud.org/)に行って、サーバサイドのインストール的なところに行って、webインストールを選ぶ。そうすると、phpファイルがダウンロードされるので、これを、owncloudのディレクトリを配置したい場所に配置(インストールが完了するとこのファイルをおいた場所にowncloudとか任意のフォルダ名が出来上がる)。簡単ですね。

次に2。と、その前にさくらのサーバコンソールでowncloud用のmysqlデータベースを作成しておきましょう。

そのファイルにブラウザからアクセスしましょう。まず要件チェックが走ったりなんだりします。phpのバージョンが古いとか言われたら、これまたさくらのサーバコンソールでボタン一つでphpのバージョン変えられるので新しめのものにしましょう。

で、インストールが始まるのですが、進めて行くと、500 internal server errorが出ます。そしたら、サーバに直接ログインして.htaccessの一番下の方のOptions -Indexesをコメントアウトしましょう。

そうすると先に進めます。ちなみこれ、何回か出ます。でも500のエラーは全部これが原因なので、出たらココを直しましょう。もちろん、インストール時だけです。インストール終わればこんな事はありません。

で、最初のadminユーザを決める部分が出てくるのですが、この部分で同時にデータベースの設定が出来るので、しましょう。デフォルトはSQLiteかなんかになってるのですが、mysqlで今回はやりました。で、進めると、何となくインストールが出来るけど、表示が崩れる。表示がおかしい。なんだこれ、ってなる。

そこで3。ソース見てないから何とも言えないけど、とりあえずファイルの最大転送サイズとかを設定しないと正しく表示されないみたいですね。というわけで、インストールしたディレクトリ(.htaccessがあるディレクトリ)に改めてphp.iniを作って配置してあげます。内容はこんな感じ。一応理由としては、さくらのレンタルサーバでのphpデフォルト転送MAXサイズが2MBなんですと。どうやらそれが悪さしてるみたいですね。

これで全てがうまく行く、はず。

参考URL: http://ameblo.jp/pcroom123/entry-11665283614.html

Macでパスワード付きzipファイルを作成する

windowsとかだと、Lhaplusとか使うと簡単にできるけど、macのそういうの知らなかったので書いておきます。

というか、ターミナルでやる、楽な方法があった。

1行目のコマンドを打つと、パスワードを二回聞かれるので、入力すると出来上がります。

Macでシェルスクリプトをapp化する

Macのアプリケーションは.appという拡張子のついたフォルダに、決められた構成で必要なファイルを配置する事で、OSからアプリケーションとして実行されます。例えば、最小構成であれば、このようなディレクトリ構造になってます。

・hoge.shをhoge.appにバンドルする場合

こういう構成にして、各設定ファイルが適切に設定されていた場合、hoge.app/Contents/MacOS/hoge.shは、hoge.appがダブルクリックされた際に実行されるようになります。

そして、この時に重要なのが、「Info.plist」です。ハマったので最初に書いておきますが、このファイルの先頭は大文字です。うまく行かないなぁと思ってたら、Info.plistがinfo.plistになっていました。笑えない。さて、肝心な中身ですが、hoge.appに、hoge.shをバンドルし、アイコンをicon.icnsにしたい場合次のように記述します。

CFBundleNameとCFBundleDisplayNameは正直適当で大丈夫です。実行するシェルスクリプトとアイコンを正しく指定してあげてください。また、うまく行かない場合は、.shが単体でダブルクリックしてうまく動くか、シェルスクリプトに実行権限がついているか、Info.plistの頭が小文字になっていないか、フォルダ構成が間違っていないかを再度チェックしてください。また、変更が反映されない場合、一度見えないところに.appを退避させて、改めて表示させると情報がリフレッシュされる事もあるので、変なマークが着いてたりする場合は色々移動させて戻してとかやってみましょう。

はい、ここまでで一応おしまいなのですが、ここから余談。何故こんな事をしたいと思ったかというと、Java 1.7から、Macに標準で付属しているjarバンドラーを用いてapp化が出来なくなってしまったからである。ひょんなことから、Java 1.7を使って書いたコードをapp化しなくてはならなかったのですが、今までの方法ではどうしても出来なかったので、シェルスクリプトで実行可能jarファイルを叩く事によって、javaの起動をするようにして、app化しました。なので、実際は環境によってはappが正常に動作しないと思うので、配布等をするときは自己責任で御願いします。

そこで、javaをコマンドラインから実行する時に、スプラッシュ画面を設定したり、command + tab押したときのアイコンを変えたりしたい。ということで、実際に使ったJavaを起動するシェルスクリプトをここに書いておきます。

シェルスクリプトと同じディレクトリに、hogeというフォルダがあり、その中にhoge.jarが入っていて、スプラッシュ画像が../../Resources/splash.jpgの時のコード。

これでアプリケーションっぽい.appを作る事が出来ますね。

サーバ管理で知っておくべきコマンド〜その1

僕は実はすごく微妙な世代の人間で、すごくカリカリUNIXやらLinuxを触っていた人間ではない。なので、実際にサーバを管理したりする時にもちろんターミナルから色々操作する訳だが、その使い方にはそんなに精通していない。なので、ここで忘れない為に、色々調べた物を書いておきます。知っている物も含めて。

・vmstat
vmstatは、”性能解析や障害解析を行う際に最も基本的なコマンド”らしい。知らなかった。用法はこんな感じ。

見方はman見れば書いてあります。主なものだけ書きます。

memory
- avm アクティブな仮想ページ
- fre フリーなメモリ
cpu
- us ユーザもしくは低優先度のプロセスに使用されている時間
- sy システムに使用されている時間
- id CPU待機時間

・dmesg
dmesgは、”kernelがロードした物理的なデバイスの状況を表示する”コマンド。ハードウェア的な疑いを持つ場合はこれを見ると良い。ディスクの読み込みに失敗してないかとか。lessかけると見やすい。モノによってはログが残っているけど、残っていない場合は直接これで見る。

・top
topは、”現在のシステム状況をリアルタイムに表示する”コマンド。プロセスのCPU使用率等をリアルタイムに見る時に便利。

・ps
psは、”プロセスの状態を見る”コマンド。ハイフン無しオプションで情報の粒度を決定できる。

・tcpdump
tcpdumpは”ネットワーク上に流れるパケットをモニタリングする”コマンド。さくっと見る場合、こんな感じに見れる。

インターフェースはifconfigから確認してください。

MavericksでUSBシリアルを使う

Switchをシリアル経由で操作したい時に必要なUSBシリアルですが、本当にMacとの相性が悪い。もっと相性良くしてくれよとおもったら、Mavericksになったときに、FTDIの謎なドライバが入ってた。おおっ、と思ったけど、結局動かずで困ったので、その時に解決した方法を書いて行きます。基本的には、以下のページを参考にした感じです。

PL2303 Serial USB on OSX Lion

まず、このリンクから、osx-pl2303.kext.tgzをダウンロードして、これを解凍するとosx-pl2303.kext.tgzというフォルダが出来上がります。仮にこのフォルダがデスクトップにあったとして、以下のようにコマンドを打って行きます。やることはカーネルエクステンションのインストールです。

これで使えるようになる、はず。

MavericsアップデートしたらMacPortsが使えなくなってた

実はMavericsにアップデートした後にMacPorts使ってなかったみたい。そんで、久々にportの様子を見ようとしたら、Command not found。正直どこに同パスを通したかなんて覚えてないので、MacPortsの場所を探してパスに追加。もちろんそれだけ。MacPortsはここにありました。

以上。