pythonアプリケーションの多言語化 Printrunの場合

お知り合いのエンジニアさんからpythonアプリの日本語化方法について尋ねられたので調べて見ました。
日本語化するのはこちら。
Printrun
ちなみにwinで動かしたいので、vmwareで準備しました。

既に多言語化に対応したアプリなので、設定がうまく出来ればすぐできそう。

環境構築

まずはreadmeの言う通りに環境を構築する。

  1. http://python.org/ftp/python/2.7.2/python-2.7.2.msi
  2. http://pypi.python.org/packages/any/p/pyserial/pyserial-2.5.win32.exe
  3. http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-unicode-2.8.12.0-py27.exe
  4. http://launchpad.net/pyreadline/1.7/1.7/+download/pyreadline-1.7.win32.exe

忠実にインストール。

pathの設定

環境変数pythonにpathを通す。localeのツールも使うので、\Tools\i18nにもpathを通す。

C:\Python27;C:\Python27\Tools\i18n

これで msgfmtが使えるようになります。

日本語化ファイルの準備

Printrunをzipでダウンロードして、とりあえずC:\直下に展開。
README.i18nではpygettextしてjaディレクトリ作ったりとかする様に書いてるけど、めんどいので locale/de をコピーして locale/ja を作成。de.poもjp.poに名前を変える。

注意

ここで必要な文字をpoファイルに書くんだけど、テキストのエンコードutf-8にしないとエラーになるので注意。秀丸とかエンコードが選べるエディタで編集しました。

次はpoファイルのコンパイル

cd locale/ja/LC_MESSAGES/
msgfmt.py -o pronterface.mo ja.po

ロケールファイルをコンパイルする。
README.i18n には{newlang}.mo {newlang}.po って書いてるけど、moファイルは pronterface.mo って名前じゃないと動かないみたい。

起動

後は実行するだけ。言語指定はsetで。

set LANG=ja
pronterface.py

出来上がり


ちゃんと日本語なった。やったね。

macで動かす

pythonの環境が整っていれば、その上で動くPrintrunは同じものが使える。
win

set LANG=ja
pronterface.py

mac

LANG=ja python pronterface.py

それぞれのショートカットを作っておくと便利。

win と macスクリプト

win

start.bat

set LANG=ja
pronterface.py
mac

start.app
applescriptエディターで新規ファイルを作ってアプリケーションで保存。

--- 現在のディレクトリを取得
tell application "Finder" to set current_dir to parent of (path to me)
--- POSIX形式でディレクトリを取得 /User/みたいな
set current_dir to POSIX path of (current_dir as Unicode text)
--- do shell script でディレクトリを移動して実行
do shell script "cd '" & current_dir & "'; LANG=ja ./pronterface.py"

Androidのbrowser "Dolphin"の中の人達と会ってきた


3rd partyのbrowserとして上位のDL数を誇り、最近spy wareとして叩かれてたDolphinのCEO達とのmeetupが非公開で開催されたので会って来ました。
Dolphin Browser | Smart Phone, Clever Browsing

dolphin browserのあらまし


まずは動画の紹介

Androidが出た当初、プリインストールのブラウザの使いにくさ、3rd partyのbrowserの少なさから、使いやすいsmartphone browserに可能性を感じて起業。
日本はアメリカに次いで2番目にユーザー数が多い。

  • 18ヶ国語(ボランティアベース)
  • 1300万DL(内iPhone300万)
  • 9億PV

特徴

ユーザーが自分で使いやすいようにカスタマイズできる

日本語対応

最近日本語に対応した。
日本は携帯普及率が高い。リテラシーもとても高い。
日本はまだビジネスパートナーが少ないので今探してる。
日本向addonの計画中。

Q&A

スパイウェアどうよ

謝罪。(すいませんでした。)個人情報の漏洩はありません。安心して使えるように取り組んでいる。
騒動以降、リリースの度にテスト会社(ちょっとうろ覚え)にチェックを行い、万全を期している。

競合

他のbrowserアプリより、普通のアプリそのものが競合。いかにブラウザーを使ってもらうか。

マネタイズ

今はユーザー数を増やすことに専念。
将来的にはプリインストール状態のブックマークを載せる権利の販売などを計画。

翻訳はどうやっている?

ボランティアによる翻訳
開発は中国、デザインやマーケティングはサンフランシスコで行なっている。

addon

APIを公開する予定がある。

感想

以前dolphin使ってて、spyware騒動で速攻アンインストールした僕ですが、再インストールしました。
記事読んだり話を聞く限り、spywareに悪意は無かったみたいですね。騒動が起きた時の対応もしっかりしてたし、これからどんどん伸びていきそうです。
中国の起業だし、福岡に呼べたらいいなぁ。

写真はMoBoTapの3人とAndroidのド肝のtagaさんと鹿。

xmlのボタン切り替えselectorでstate_pressedが効かないと思ったらitemの順番に意味があった

タッチしたときに画像が切り替わるボタンを作るのでxmlをselectorで作りました。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/nav_gallery"></item>
    <item android:state_pressed="true" android:drawable="@drawable/nav_gallery_hover"></item>
</selector>

なぜかタッチしても切り替わらない・・・。(´・ω・`)

android:drawableを一番下に指定しないとだめみたい。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/nav_gallery_hover"></item>
    <item android:drawable="@drawable/nav_gallery"></item>
</selector>

切り替わりました(`・ω・´)シャキーン

C2DMについて調べてみた

申請はアプリのパッケージ単位です。登録はGoogle Accountが必要です。

必須条件

  • Android 2.2に対応したAndroid Marketアプリが入っている端末
  • 有効なGoogleアカウント

全体構成図

  1. AndroidにはBroadcastReciverとしてC2DMの情報を受ける口を実装します。
  2. 自由に実装した3rd party App ServerでC2DMの情報を送信します。
  3. Google管理下のC2DMServerと介して情報はAndroidに送られます。

C2DMの有効化

  1. AndroidからC2DM登録Intentを送信します。
  2. 成功するとアプリに対して登録IDが付与されるのでAppServerにpostして登録させます。

メッセージの送信

  1. AppServerから送信を支持します。
  2. C2DMServerではキューイングなどをしてくれています。
  3. AndroidにMessageが届くので、BroadcastReciverで受信します。
  4. データを受け取って処理します。

サンプル

Google Pluginでテンプレートが作れます。
Google Plugin for Eclipse の使用 - Google App Engine - Google Code

startup weekend fukuoka に参加して思ったことと、次に参加する皆さんへ


しかだよ。

福岡開催は初となるstartup weekend fukuoka に参加してきました。とても実りある3日間でした。
Event | Startup Weekend
いいこともわるいことも、色々と思ったことまとめます。

学んだこと

たくさん失敗できた

たくさん失敗した。
時間が足りなくなった。プレゼン準備が不十分だった。チーム内のビジョンが揺らいだりもした。マネジメントもプレゼンもスケジュール管理も失敗だらけ。
スケジュール管理をミスったのでプレゼン準備の時間が足りなくなり、プレゼンも大変ぐだぐだになってしまった。チームで作った素晴らしいアイデア・デモもうまく表現できなかった。イベント中最大の失敗でした(´・ω・`)
でも、失敗したからこそ僕達のチームはとても多くの事を学んだ。僕たちは失敗できた。そして僕たちは成長できた。

チーム
  • 一人では不可能

それぞれの専門性を活かしたチームで一つのサービスを作るのはすごく楽しい。すごく早い。まるでジェットコースターみたい。とてもわくわくしてスリリングで感動する。

僕達のチームはデザイナー二人、プログラマー二人、マーケッター一人という素晴らしいバランス構成だった。みんな若くて平均年齢28歳。始めて会ったのに友達の様に親しみ、話はサクサク進んでいった。(自分をプログラマーに換算している所に落とし穴があった。)

  • リーダー役は実作業はできないと思ったほうがいい。

はい。これ大事です。リーダーは実作業できないと思ってください。プレゼン準備とかで意外と時間がありません。意外と時間がありません。はい、二回言いました。吹出してくる問題に対応するので手一杯です。

プレゼンの重要性

  • 3日間頑張った成果は最終日のプレゼンで評価される。

逆に言えば、最終日のプレゼンのために3日間デザインしたり、コーディングしたり、マーケティングすると考えたほうが良い。全ては最終プレゼンで表現する。そのための準備は2日目からとりかかっても早過ぎることはない。
リーダーは最終日のプレゼンに向けて作業するべき。最終日の5分間プレゼンがこのイベントの最終アウトプットだから。最高の製品を作っていても、それを紹介するプレゼンがぐだぐだなら、それはぐだぐだな製品にしか見えない。実装と同時にプレゼン準備を進めよう。

話したいことの問題提議、解決策、具体策を即座にまとめるコツ

最初に1分間ピッチって言う自分の考えているアイデアを話す機会があります。まじ短いですよね。でも1分間でまとまらない複雑な物はそれがすでになにか間違っているのです。短い時間でうまく話すには以下みたいな感じにすればうまく出来ると思います。

  1. みなさんにもこんな事で困ったことありませんか?(問題提議)
  2. 我々はその悩みを解決すべく◯◯を開発しました。(解決策)
  3. これをこうやって使えば皆さんの悩みは無くなります。(具体策)

認識違い

参加者と主催者側で明らかなゴールの認識違いがあった。

  • 参加者側は製品をローンチすることを目的としていた。
  • 主催者側はビジネスプランまでまとめてプレゼンして欲しかった。

これは正直、主催者側はwebに情報を書いておくべきだとと思う。startup weekend については、よく
「あれってなにするイベントなの?」
と何度も色んな人に聞かれたし、僕もうまく返事できなかったし、参加してみたらちょっと違った。

認識違いがあったゆえに、2日目で多くのチームが方向転換を余儀なくされた。それは良い意味の方向転換だったけど、始めから分かってる方がよかった事だと思う。

なんか違うと思ったこと

ローンチするのが目的かと思いきや、プレゼンするのが目的だった。デモが出来てないチームはプレゼンする機会すら得られないかと思いきや、デモなんて無くてもよかったようだ。実装ほぼ0,イメージ図だけでプレゼンしているチームもあった。
でも、それはどうだろう。それはstartup weekendなのか?デモがないプレゼンも幾つかあったけど、それただのアイデアプレゼン大会じゃないだろうか。
no talk. all action.って謳ってるけど、良く議論してアイデアを纏めているチームのほうが評価はよかったりもする。いつの間にかall takl. no action.になってしまっていないだろうか。

正直、思ってたのとちょっと違った。もっとシビアかと思った。デモ重視かと思った。
そうじゃなかった。
それが良いことなのか、悪いことなのかはわからない。どうするのがベストなのかはわからない。

僕の意見は、夢のようなアイデアより動くデモを高く評価したほうがいいということだ。所詮アイデアはただのアイデアで、100個集まっても1つの動く製品には敵わないのだ。

まとめ

ぐちってますが、ここ最近の勉強会・イベント・セミナーの中でもっとも素晴らしいイベントでした。イベントが終わって数日間はstartup weekendの事で脳みそが支配されます。仕事を寝坊する人続出です。それぐらい"刺激的"な3日間でした。

きっと失敗します。思ったように進みません。例え優勝できなくても、ここで得るものはとてもたくさんあります。皆さんも是非参加してみてください。

ノシ

C2DMに対応しているAndroidアプリ一覧


C2DM使ってるアプリの挙動が知りたかったので、C2DMが動いているアプリTwitterで聞いて探してみた。

他にもたくさんありますよ。見つけきれてないけど。

インストールされているアプリの一覧を取得するなど


しかだよ。
AppCircleという、Androidのアプリを楽しむ探すアプリを作ってます。
そのなかの仕組みで、端末にダウンロードしてインストールしたアプリの一覧を取得したくなりました。
@t_eggさんの助言をもらい、以下な実装になりました。

......
        //パッケージマネージャを利用して、アプリケーションの一覧を取得する。
        //IntentにCATEGORY_LAUNCHERを指定しているので、厳密にはランチャーに表示されるアプリの一覧です。
       	       	PackageManager pm = getPackageManager();
		Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		List<ApplicationInfo> apps = pm.getInstalledApplications(0);
		Log.i(TAG, "ApplicationInfo count:"+apps.size());
		
		/*
		 * アプリケーションの一覧の中身に応じて色々処理する。
		 */
		for(ApplicationInfo info : apps){
			//アプリケーションにSYSTEMフラグが立っていたら(0000 0001)それはプリインストールされたアプリである。
			if((info.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM)
				continue;
......

ApplicationInfo.flagsに状態がビットでいっぱい詰まってるので、これを取り出すのがミソですね。