2011年2月13日日曜日

日本最速を目指すAndroid開発環境構築(SnowLeopard編)

余計な画像とか入れないから、よろしくな(ロード時間すら節約的な意味で)。
  1. ここからSDKを落とす。
  2. 落としたSDKを解凍する。
  3. 解凍した後作られるディレクトリを、後で邪魔にならない場所に置く。
    /Developperに置くと分かりやすいかも。自分はそうした
  4. ここからEclipseを落とす。
  5. 落としたtarballを解凍する。
  6. 解凍した後作られるディレクトリをアプリケーションフォルダに突っ込んでおく。後で落としたエロ画像と一緒に消さないようにな。
  7. Eclipseを起動する。
  8. (オプション)日本語化したい場合は、Help->Install New Software...からInstallダイアログを開き、上部プルダウンにhttp://download.eclipse.org/technology/babel/update-site/R0.8.1/heliosと入力し、エンターキーを押す。しばらく待ったあと表示されるリストから、『Babel Language Packs in Japanese』にチェックを入れ、後はNextを押し続けインストールを行う。
    ただし日本語化すると起動が遅くなったり、付随するバグで悩まされたりと余りいい事はない気がする。
  9. Help->Install New Software...からInstallダイアログを開き、上部プルダウンにhttps://dl-ssl.google.com/android/eclipse/と入力し、エンターキーを押す。しばらく待ったあと表示されるリストから、『Developper Tools』にチェックを入れ、後はNextを押し続けインストールを行う。
  10. (自分だけかも)ワークベンチの再起動後、Googleに利用状況を匿名で送信する、みたいな内容のダイアログが表示され、何故か消えてくれない。もう一度Eclipseを再起動させたら消えてくれた。
  11. Eclipse->環境設定から設定ダイアログを開く。左メニューのAndroidの項目をクリックし、SDK Locationの設定を3.で決めた設置場所に設定し、OKを押す。
  12. Window->Android SDK and AVD Managerから設定ダイアログを開く。左メニューのInstalled Packagesをクリックし、下部に表示されるUpdate Allボタンを押す。その後表示されるインストール項目の選択については全部Acceptで良い。
以上で開発環境の立ち上げは完了。続けてHello Worldで動作確認をする。
ここを参考にやってみると良いと思う。

2011年2月9日水曜日

【CakePHP】ファイルアップロード関連のプラグインに頼ってはいけない

とあるシステムで、画像をアップロードし管理するという、非常によくある機能の実装に関わった。半日程度で手早く終わらせてしまいたかった事もあり、まずは既存のプラグインで済ませられないかを調査した。
環境はCakePHP1.3。システム自体は半分出来上がっていることもあり、DBなどに加える手は最小限にしたいというのが、私だけでなく顧客からの要望である。

まず真っ先に辿り着いたのが、Media Plugin。日本語でのブログ記事などが多少あることもあり、取っ付き易い分後で人に任せられるかなと淡い期待を寄せてみた。しかし、

  • CakePHP1.3に対応したバージョンは別のライブラリを使っているため非常に分かりにくく、公式のドキュメントも雑。というか説明書もない状態。
  • 最新の安定版と謳っているバージョンを試してみたところ、バージョニング処理で問題がある模様。
  • そもそもアップロードされたファイルにリネームもかけずそのままサーバ側に保存している時点で、日本での使用はそのままでは無理。
  • ↑のリネームの問題については、趣味の延長線にあるtipsを参考にし、対処が可能だった。ただしCakePHP1.2に対応している旧バージョンでのお話なので、試すにもプラグインのバージョンを落とさなければならなかった。
  • 旧バージョンのプラグインも、少し手を加えればCakePHP1.3でも動いた。
  • リネームをCakePHP1.3対応のバージョンでやろうとすると非常にめんどくさい。というか途中で投げた。

導入にやや手間取ったため、『他のプラグインならもっと楽出来るんじゃないか?』という考えが頭をよぎる。そこで他のも幾つか試すことに。しかし、結果的にマトモに実用に耐えうるプラグインはMedia Pluginが最初で最後となる。

次に導入を試みたのがUploadpack
  • 付属のread meは多少だがボリュームがあり、トラブルシューティングが出来なくもない。ただし日本語の関連ドキュメントは皆無なので、誰かに投げるという選択肢が無くなってしまうことが一番問題に思えた。
  • 機能など鑑みると前述のMedia Pluginがまさに上位互換となっており、じゃあとりあえず動いたMedia Pluginでいいじゃん?と気づく。
更にその次に、MeioUploadも試してみた。
  • 絶望的にドキュメントが不親切。それこそ『俺のソース読んでくれないか?』と言わんばかりに。
  • そんなこんなで導入もめんどくさかった。前述Uploadpackと同じく、機能もそこそこなので無理して導入する必要もない。
そしてこの辺りでやっと気がつく。導入に手間取るめんどくさいプラグインや、片手落ちのプラグインを導入して結果自前のコードで補完するくらいなら、最初から自分で書いたほうがずっとマシ、ということに。

実はCakePHPのファイルアップロード関連の仕組みは、単純ながら必要な機能は網羅されているため、ファイルのmineタイプの検証やファイル名のリネームなど、やりたい事は全部自前のコードでやってしまったほうが早い。
例えばファイルをアップロードしたい場合、

<?= $form->create("Hoge", array("type"=>"file", "url"=>array("controller"=>"foo", "action"=>"bar", ), )) ?>

<?= $form->input("file", array("type"=>"file", "label"=>false, )) ?>

<input type="submit" value="送信" />

<?= $form->end() ?>



といった具合のフォームでコントローラにリクエストを投げれば、後は勝手に送信したファイルの情報をまとめてくれ、コントローラ側では

print_r($this->data["Hoge"]["file"]);

Array

(

    [name] => test.gif

    [type] => image/gif

    [tmp_name] => /private/var/tmp/phpiU5KRx

    [error] => 0

    [size] => 2164

)


こんな具合に最低限必要になる情報が連想配列にまとまっている。

必要最低限とは言うものの、必要十分な情報だ。他に必要な情報があれば標準の関数で拾ってこれる。
今後同様の機能を実装する際は、プラグインに頼ってはいけないということを忘れないようにしたい。

2011年1月30日日曜日

さくらインターネットのVPSでLAMP環境構築(Ubuntu)

訳あって使えるねっとを利用していたのだが、何をやるにも応答が遅く、本当にイラつかせてくれるサーバだった。元々良い評価をしている訳ではなかったのだが、面倒だという理由で乗り換えをしていなかったが、ついに重い腰を上げてサーバ会社の乗り換えを決断。月々のコストを鑑みてさくらインターネットのVPSを選択。980円でサクサク動き、OSも自分で入れられるとなれば、他に選択肢はない。特にサクサク動くというとこがポイント高め。もっと割安のサービスや、Amazon EC2 Micro Instanceも検討対象には上がったのだが、スピードと安定性のバランスを鑑みてさくらインターネットを選択した。ちなみに各社のサービスについては月額1,980円以下の仮想専用サーバ、国内外10サービスまとめが非常に良くまとまっている。

利用法あれこれ

  • 今回の私のように、かつて運用していたホスティングをVPSに乗り換えて、コストを削減したいと考えている人は多いはず。数値的根拠はないが、某使えるねっとで5000円程度毎月支払っていたサービスよりも品質の高いサービスが1000円程度で受けられるのがVPSの魅力だと思う。
  • 費用も安ければ導入も早いのもVPSの魅力。基本的に即時納品なので、顧客から開発依頼を受けてからすぐ契約を済ませてもらい、開発期間はVPSで運用、本番環境は別途構築する、などといった利用法が考えられる。契約から開発が始められるようになるまで概ね4時間あれば十分だろう。
  • 月額980円なら自宅でサーバを持った際に発生する電気代よりも安い(無論サーバの電源によっては自宅サーバの方が安いかもしれないが)。従ってこのご時世、勉強用に自宅でサーバを持つという行為自体古いのかもしれない。


導入

  • なにはともあれ、まずは契約関係を済ませる。VPS関係の情報はここにまとまっている。契約もクレジットカードがあればすぐ終わる。
  • 仮登録完了時に送られてくるメールの内容があればサーバのセットアップは始められる。

OSのインストール(Ubuntu)
  • OSのカスタムインストールに際しては、どういう訳か知らないがMac版のGoogle Chromeからではうまくいかなかった。Safariは起動させるのが面倒だったので試していない。自分はWindowsのGoogle Chromeでカスタムインストールの手続きを行った。Macユーザは注意して欲しい。
  • デフォルトのCent OSだと何かと不便。なので仮登録完了後送られてくるメールに記載されているVPSコントロールパネルからOSの再インストールを行う。
  • ログイン後のメニューからOS再インストールというメニューへ進むと、『カスタムOSインストールへ』というリンクがあるのでクリック。
  • OS選択から『Ubuntu 10.04 i386』を選択。AMD版とか誰得。
  • 以降はマニュアルに従ってインストールを行えば何のトラブルも起きなかった。
  • インストール後VPSの起動が必要になるので、VPSコントロールパネルのVPSホームから、インストールしたインスタンスの起動を行う。普通に起動ボタンを押せばいいだけ。
  • 起動確認後SSHで接続する。

ツール関係のインストール
  • 最大限面倒を避けるため各種アプリケーションはaptからインストールする。
  • その前にデフォルトエディターを変更する。デフォルトだとnanoなのだが…自分はviにしている。
    $ update-alternatives --config editor
  • まずapt自体のアップデートを行う。これを忘れると後でエラーが出たりして面倒。
    $ sudo apt-get update
  • auto-aptをインストールする。あると便利。
    $ sudo apt-get install auto-apt
    途中posfixのインストールダイアログが出るが、デフォルトのままで問題ない。エンターを2回押して次に進む。
  • auto-aptのアップデートをする。
    $ sudo auto-apt update
  • 次にシェルやエディタをインストールするが、省略。

サーバ類のインストール
  • Apacheのインストール
    $ sudo apt-get install apache2
  • MySQLのインストール
    $ sudo apt-get install mysql-server
    インストール中にメッセージが表示され、rootのパスワードを設定しろと言われるので設定する。
    $ sudo apt-get install libapache2-mod-auth-mysql
  • PHPモジュールのインストール
    $ sudo apt-get install libapache2-mod-php5 php5-mysql
  • mod_rewriteの有効化
    $ sudo a2enmod rewrite
  • phpMyAdminのインストール
    $ sudo apt-get install phpmyadmin
    サーバにはApacheを選択。
    phpMyAdmin用MySQLユーザのパスワードを聞かれるので設定する。
    インストールが終わってからApacheの設定を書き換える。
    $ sudo vi /etc/apache2/apache2.conf
    末尾に以下を追加して保存する。
    Include /etc/phpmyadmin/apache.conf
    デフォルト設定だとセキュリティ上問題ありそうだが(せめてBASIC認証くらいはしときたい)、一旦ここではデフォルトでよしとする。
  • ここで一度Apacheを再起動してブラウザで確認。
    $ sudo /etc/init.d/apache2 restart
    http://[IPアドレス]/
    http://[IPアドレス]/phpmyadmin
    両方見れればOK。
  • 基本設定はここまでで完了。後は開発物に合わせて適宜インストールしていく。

FWの設定
  • デフォルトだと何もフィルタしないノーガード状態。当然良いわけが無いので設定を行う。
    ここが参考になる。

MySQL感覚でSQLiteを管理する

iPhone/iPad開発である程度のデータを扱う必要が出来た場合、真っ先にSQLiteの導入を考えたほうが良い。ややプログラミングの上での操作性に難はあるが、高速にデータを扱えるメリットを考えれば恩恵は非常に大きい。
以下はMySQLに慣れた人向けに、導入についてと、SQLiteデータベースを操作する上でのTipsなどを紹介。

導入

  • c/fe
    ここを見ればオールOK。iPhone/iPadへの組み込みから、プログラムからの操作まで教えてくれる。
  • taichino.com
    さらに詳しい内容。例も分かりやすかったのでひと通りここで紹介している順序で実装をやってみるといいかもしれない。
  • Command Line Shell For SQLite
    コマンドラインリファレンスが読みたい場合はこちら。


MySQL経験者向けTips

  • コンソールからSQLiteデータベースへの接続(Mac)
    (MySQL) $ mysql -u foo -p datase
    (SQLite) $ sqlite3 database_file.db
    DBのファイル名を引数にsqlite3コマンドを叩くとMySQLの接続コマンドと同様の振る舞いになる。
  • データベースに存在するテーブルを列挙
    (MySQL) $ show tables
    (SQLite) $ .tables
    (SQLite) $ .ta
    .tableでも.taでもどちらでもよい。よく使うコマンドなので覚えておこう。
  • テーブルの構造を表示
    (MySQL) $ show create table table_name
    (MySQL) $ desc table_name
    (SQLite) $ .schema table_name
    これもよくお世話になるコマンド。
    ※ (SQLite) $ .schema で、データベースにある全てのテーブルの構造を表示してくれる
    • その他あれば追記予定。

実務でObjective-C開発をした際遭遇した問題点など

およそ2ヶ月、Objective-CでiPhone/iPadアプリを開発した経験を忘れないようバックグラウンド含めてアウトプット。また、後続開発者の人が読んだ際一助になるよう役立つリンクも記載していく。

開発に着手する時点での自分自身のステータス
  • 商用開発での携帯端末用アプリ開発の経験はわずか(Javaで携帯アプリ開発を少々かじった程度)
  • 従ってiOSでの商用開発経験はナシ。お遊びで一本アプリを作った程度でAppStoreへ公開した経験もナシ。
  • C言語の知識はそこそこあった。
  • JavaやC#の経験をフル活用すればなんとかいけるんじゃないかと言う甘い期待があった。(これがそもそもの間違い)

初期段階でのお勉強
  • 半日ほどかけてObjective-C入門を端から端まで何度も読んだ。
  • Objective-C最速基礎文法マスターも非常に良くまとまっていた。
  • 言語としてのお約束に関しては上記2つのサイトで大体理解出来ることもあって、この段階でもまだ、なんとなくいけるんじゃないかと言う甘い期待があった。

最初の壁
  • 組み込みクラスのAPIドキュメントの邦訳が思ったより少ない。何をやるにも断片的な情報を組み合わせて試行錯誤していくしかない。
  • ガーベッジコレクションが当たり前という環境に慣れすぎていた。とにかくメモリ関連の問題につまずき続ける。

第二の壁
  • メモリ関連の理解が進まないために生産性が上がらない。書いては書きなおすの連続。
  • 正直もう少し勉強してから着手すべきだったと後悔。
  • QuartzDemoのコードを読んで勉強する。どんなブログなどの情報ソースよりも役に立ったと思う。

現段階で言えること
  • iphone/ipad開発においてはメモリ管理が全てのボトルネックになりうる。リソースが限られているのだから当然だ。
  • とにかく最初から計画立てた実装を行うことが重要。従って勉強しながら開発をするといった甘い考えは捨てたほうがいい。身を持って示した。
  • 浅いレベルの情報はブログなどを見ればある程度収集出来るが、少しでも難しいことをやるとなると情報源が限られる。出来る出来ないの問題になるので、リスクヘッジのために企画やデザインが決まる段階で他の人がやっていないことには手を出さない方が安全という事は伝えておいたほうが良い。

2011年1月28日金曜日

MacPortsでnkfをインストール(Snow Leopard)

色々な環境をまたいだバッチを書くとき、日本語の文字コードが問題になる時がある。UTF-8で統一しろというのも実際のところ難しい。そこで文字コードを高速で変換してくれるnkfの出番になるのだが、開発に使っているMac OSにはnkfが入っていない。MacPortsからnkfのインストールを行ったので、忘れないようメモ。

まずは検索。
$ port search nkf
nkf @2.1.1 (textproc, japanese)
Network Kanji code conversion Filter

p5-nkf @2.11 (perl, textproc, japanese)
A perl extension module to use nkf.

Found 2 ports.

次にオプションを確認。
$ port variants nkf
nkf has the variants:
   universal: Build for multiple architectures

ユニバーサルバイナリにする必要はないので、オプション無しでインストールする
$ sudo port install nkf
--->  Fetching nkf
--->  Attempting to fetch nkf-2.1.1.tar.gz from http://iij.dl.sourceforge.jp/nkf/48945/
--->  Verifying checksum(s) for nkf
--->  Extracting nkf
--->  Configuring nkf
--->  Building nkf
--->  Staging nkf into destroot
--->  Installing nkf @2.1.1_0
--->  Activating nkf @2.1.1_0
--->  Cleaning nkf

インストールは完了。続いてテスト。
とあるsjisのファイルをutf-8に変換してもらう。
-wオプションで変換後の出力ファイルをutf-8に、
--overwriteで出力ファイルで入力元のファイルを上書き保存する。
$ nkf -w --overwrite /path/to/file

問題なく成功。

2011年1月27日木曜日

MacPortsでwgetをインストール(Snow Leopard)

よく知られているようだが、MacOS Xにはwgetが入っていない。curlを使えよって話も大いにあるが、wgetはwgetで何かと便利。なのでwgetをインストールするが、いつものようにMacPorts経由でインストールをしてみる。

まずはパッケージを探す
$ port search wget
gwget @1.0.4 (gnome, net)
    Gwget is a Download Manager for Gnome 2. It uses wget as a backend.

wget @1.12 (net, www)
    internet file retriever

wgetpro @0.1.3 (net, www)
    advanced internet file retriever

wput @0.6.2 (net)
    wput is like wget but is for uploading files to ftp-servers

Found 4 ports.

次にオプションの確認。
$ port variants wget
wget has the variants:

   no_ssl: Build without SSL support
     * conflicts with ssl
[+]ssl: Build with SSL support
     * conflicts with no_ssl
   test
   universal: Build for multiple architectures

何も考えずそのままオプション無しでインストールしてOKぽい。
なのですぐにインストール。
$ sudo port install wget
--->  Computing dependencies for wget
--->  Fetching wget
--->  Attempting to fetch wget-1.12.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/wget
--->  Verifying checksum(s) for wget
--->  Extracting wget
--->  Applying patches to wget
--->  Configuring wget
--->  Building wget
--->  Staging wget into destroot
--->  Installing wget @1.12_3+ssl
--->  Activating wget @1.12_3+ssl
To customize wget, you can copy wgetrc.sample to wgetrc
in /opt/local/etc and then make changes.
--->  Cleaning wget

wgetrcの設定内容を変えればカスタマイズ出来るよ的なメッセージが出てきたが、デフォルトで困ることも無さそうなので無視。
以上でインストールは完了。

念のためテスト
$ wget http://google.com

カレントディレクトリにHTMLファイルが作られたことを確認してテスト完了。