Author Archive

長崎国体・大会アプリがリリースされました!

長崎がんばらんば国体・長崎がんばらんば大会実行委員会様提供、弊社設計・開発による長崎国体アプリがリリースされました!
競技の日程や組合せ、会場付近の施設など、観戦をトータルにサポートするアプリになっております。
5月24・25日はリハーサル大会も開催されますので、是非ダウンロードしてください!

Facebooktwitterlinkedintumblrmail

AutoLayoutをiOS5にbackportするRRAutoLayout

iOS6で導入されたAutoLayout。正しく使えば3.5inchでも4inchでも怖くない!しかし当然iOS5以前では使えません。。。2013年7月現在でも、iOS5を使用されてるユーザは全体の1割程はいるようで、切るにも切れないこともあるかと思います。

そこでRRAutoLayout、素晴らしすぎます。

RolandasRazma/RRAutoLayout 

セットアップにはハマりませんでしたが、思ったような表示にならなかったので色々触っていると、次のようなことに注意すれば良いことが分かりました。

Storyboard上で、例えばViewの最上部に置きたい画像がある場合、通常ImageViewをドラッグして、Viewの最上部に置くと思いますが、この際自動でConstraintsが設定されるかと思います(SuperviewとのVertical Spaceが0など)。この自動でできるConstraintsだとRRAutoLayout は認識してくれないので、あくまでも手動でのConstraintsに変換してやります。(ImageViewのHeightなども含め)

まだ多くのViewを定義してみたわけではありませんが、これで効率よく開発できそうです。

Facebooktwitterlinkedintumblrmail

PhpStorm(IntelliJ)のクリップボードマネージャ

PhpStormにはクリップボードマネージャ機能があり、クリップボードの履歴からペーストしたりすることができます。しかし私は別のクリップボードマネージャアプリを使用しており、そのアプリから貼り付けたいのですが、機能がバッティングしてしまいうまく動作しません。

調べたところシステムのクリップボード領域とPhpStormのクリップボード領域を同期する設定をすることで正しく動作するようになりました。

idea.use.alt.clipboard.sync=trueを/Applications/PhpStorm.app/bin/idea.vmoptionsに追記するだけでOKです。

参考

Switching clipboard content with system clipboard manager does not work in rubymine (Ubuntu)

Facebooktwitterlinkedintumblrmail

EclipseからPhpStormに乗り換えました

しばらくPhpStormを仮運用していたのですが、ライセンスを購入してもらい、Eclipseから乗り換えました。

乗り換えた理由

Eclipseに比べてだいぶ軽い

これが一番の理由です。非常にお世話になったIDEで、Eclipseと戯れた時間は多かったです。ただし重い。何年経っても重い。チューニングしようが重いものは重い。この点、PhpStormは大変軽快です。ステップ実行しようが、ファイルの検索、置換、ジャンプ等の全ての操作が軽快です。こういうところを放置しておくと、生産性にじわじわ効いてくるので、今ここで乗り換えないと、だいぶ損する気がしました。

Eclipse(PDT)でできていたことは全部出来る

WEBアプリケーションの実行は当然、Coverage、XDebug、PHPUnitのなど、Eclipse(PDT)で出来ていたことは全て出来ます。

私の心境の変化

そもそもEclipseを使い続けていた理由は、言語によって開発環境を変えなくてもプラグインがあるから、Eclipseならほぼ対応できるという点でした。しかし最近はそれぞれに特化しているモノのほうが良いという考えに変わってきています。WEBアプリケーションよりもスマホネイティブアプリのほうが良い、マルチプラットフォームで動作するアプリよりも、ネイティブで書かれたMacアプリのほうが良い、と。だったらIDEもある言語に特化したものが良い。となったわけです。ちなみに矛盾しますがPhpStormはマルチプラットフォームで動きます。

インストール後

ここからはやった設定などの覚えがきです。

設定

  • Appearance > UI Options > Look and feelをDarculaに
  • Editor > Colors & Fonts > Schema nameをSolarized Darkに
    • https://github.com/braver/PhpStorm-Solarized
    • https://github.com/cweagans/PhpStorm-solarized
  • FontはやっぱりMonacoで
  • PHPのパス設定
  • XDebugするためのサーバ設定
  • KeymapをMac OS Xに(Command + Cとかでコピーできるよう)

よく使うであろうショートカット等

キー 内容
Ctrl + →← エディタータブの切り替え
Ctrl + ↑↓ 前 or 次のメソッドにジャンプ
Commnad + Shift + N ファイルを名前であいまい検索して開く
Command + D 現在行の複製
Command + Y 現在行の削除
Command + Shift + ↑↓ 選択行のコードを移動
Command + B キャレット位置にあるメソッドなどの定義にジャンプ
Command + Option + →← ジャンプした履歴を辿る
Command + Option + T 選択範囲をif,forなどで囲む
Command + Option + Shift + T 選択範囲をリファクタリング(名前変更、メソッド抽出など)
Command + J テンプレート(スニペット)呼び出し

あとがき

これで開発スピードが上がるので、もっと他のことに時間を割けそうです。

ちなみにPhpStormのライセンスは、PhpStorm良いなーとTwitterで呟いていたら、その翌朝には代表がライセンス買ってくれました。そんな会社ランカードコムをよろしくお願い致します。(とか宣伝ぽく)

 

Facebooktwitterlinkedintumblrmail

Objectve-Cでクラスのインスタンスメソッドを書き換える

つい最近までiOS用のコードを書いていたのですが、その中でとあるオープンソースのライブラリを使用しています。でその中のとあるインスタンスメソッドの処理を書き換える必要がありました。
カテゴリ使って書き換えようと思ったのですが、その処理自身がカテゴリで定義されていたため無理でした。

まあライセンスに問題なければソースを直接修正すれば良いのですが、ライブラリのアップデートとかに備えておきたいとこです。
そこでclass_replaceMethodを使って書き換える方法に落ち着きました。

//ExampleClassのexampleMethodを書き換える例

#import 

...

id class = [ExampleClass class];//クラス定義取得
SEL sel = @selector(exampleMethod);//セレクタ取得

void (^block)() = ^{
  //処理を書き換える
};

IMP imp = imp_implementationWithBlock(block);//BlocksからIMPを生成

Method method = class_getInstanceMethod(class, sel);//元のインスタンスメソッドを取得
char* types = method_getDescription(method)->types;//インスタンスメソッドの引数の型を取得
class_replaceMethod(class, sel, imp, types); //書き換え!

これをAppDelegateなんかで実行しておけばOKです。

Facebooktwitterlinkedintumblrmail

NSDictionaryのdictionaryWithObjectsAndKeysが辛い

iOS開発をやっていて、NSDictionaryでよく使うdictionaryWithObjectsAndKeys、NSArrayのarrayWithObjectsですが、下記のように入れ子になってくると何のこっちゃ分からなくなります。

NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"Taichiro", @"firstname",
                             @"Yoshida", @"lastname",
                             [NSArray arrayWithObjects:
                              [NSDictionary dictionaryWithObjectsAndKeys:
                               @"twitter", @"type",
                               @"dataich", @"id",
                               nil
                               ],
                              [NSDictionary dictionaryWithObjectsAndKeys:
                               @"facebook", @"type",
                               @"dataich", @"id",
                               nil
                               ],
                              nil],
                             @"accounts",
                             nil
                             ];

NSLogで出力した結果を見ると、下記のようなシンプルな内容なのですが。

{
    accounts =     (
                {
            id = dataich;
            type = twitter;
        },
                {
            id = dataich;
            type = facebook;
        }
    );
    firstname = Taichiro;
    lastname = Yoshida;
}

これをもう少し簡単にかける方法があります。
dictionaryWithObjectsAndKeysには @{}
arrayWithObjectsには @[]
というリテラル?が用意されてます。
これを使って書き直すと下記のようになります。

NSDictionary *dictionary2 = @{
                              @"firstname" : @"Taichiro",
                              @"lastname"  : @"Yoshida",
                              @"accounts"  : @[
                                                @{
                                                    @"type" : @"twitter",
                                                    @"id"   : @"dataich"
                                                },
                                                @{
                                                    @"type" : @"facebook",
                                                    @"id"   : @"dataich"
                                                }
                                             ]
                              };

ちょっとは見やすくなりますね!

Facebooktwitterlinkedintumblrmail

Monster Debugger – Flex開発のお供に

この2週間ほどFlex4でクライアントサイド書いているわけですが、いくつか階層を重ねたコンテナの上部に、paddingTop=”0″にしているのに妙なpaddingが空いたりとかで、Firebug的なものが欲しいなーと思って探したらちょうど良いのがありました。

Monster Debugger 3 is here!

インストールしたらAirアプリケーションとして立ち上がります。

プロジェクトタイプなどを選んでExportすると必要なswcが出力されますので、それに対してFlexプロジェクトのライブラリパスを通してあげます。
後は、キャプチャにもあるように

ライブラリをインポートして

import com.demonsters.debugger.MonsterDebugger;

初期化するだけです。

MonsterDebugger.initialize(this);

MonsterDebuggerを開いた状態でプロジェクトを実行すると、デバッガに接続されてこんな感じになります。

Highlight & Inspectをクリックして、画面から要素を選択してオブジェクトのプロパティを確認したり、そのプロパティをLiveに変更したりなど。
またconsole.log的にオブジェクトのダンプも含めたログを吐いたりなどもさくっとできます。

MonsterDebugger.trace(this, "Hello World!");

いろいろと助かりそうです。感謝。

Facebooktwitterlinkedintumblrmail

mysqld_multiを使って同一マシンに複数のMySQLサーバを立てる

業務で複数MySQLの開発環境が必要になりました。VM作っても良かったのですが、いちいち立ち上げたくなかったのと、Mac1台で完結させたかったのでTwitterでその旨つぶやいたら、とある方からmysqld_multiというものを教えて頂きました。

私はHomebrewでMySQL5.1を入れていたのですが、

$ ll /usr/local/Cellar/mysql51/5.1.58/bin/ | grep mysqld_multi
-r-xr-xr-x  1 dataich  staff    24334 11  1 14:17 mysqld_multi

おお、既に入ってました。

でmy.cnfに設定を書いてあげます。[mysqld1][mysqld2][mysqld3]という感じでオプショングループを書いてあげてそれぞれの設定を記述します。

この状態で

$ mysqld_multi start

とすれば全部立ち上がります。
またマニュアルにもありますが、特定のサーバだけ立ち上げることも可能です。

なんで今まで知らなかったのかと後悔してます。
まあアプリ側がちゃんとポート指定に対応していないと残念なことにはなりますが、非常に便利に使えそうです。
ちなみにWindows開発環境では、多分別の社員さんが書いてくれると思います。

Facebooktwitterlinkedintumblrmail

PHPでbundlerぽいことを行うOnion、Composer

pear.phpunit.de/PHPUnitを依存関係として設定する前提で、OnionComposerを使ってみました。

Onion

PEARモジュールのビルド、コンパイル、そして今回の目的であるbundler的なことを簡単に行えます。

インストール

homebrewの場合

gistにFormulaを置きましたので使ってください。

# brew install --HEAD https://raw.github.com/gist/1594321/6769fa97864462c4813f06bbb08760630ba7c87f/onion.rb
brew install --HEAD https://raw.github.com/gist/1594321/onion.rb
# 2012/02/07 修正 実行ファイルがonion.pharからonionに変更になりましたので、Formulaを修正しました。
直接

onion.pharをパスの通ったディレクトリに置いて、実行権限を与えるだけ。

# curl https://github.com/c9s/Onion/raw/master/onion > ~/bin/onion 
curl -s http://install.onionphp.org/ | sh
# 2012/02/07 修正 インストール方法が変更されてました。

使用方法

onion_sample
|– vendor
|– package.ini

プロジェクト直下にpackage.iniを作成し、ここに依存関係などを記述します。
packageセクションにあるname、desc、version、authorは必須となっています。(そもそもOnionはPEARパッケージを作る際にも使うためだと思われます。) requireセクションに使用したいPEARパッケージを記述します。 上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。

$ onion -d bundle

いやー、インストールから実行まで非常に手軽。この手軽さが素晴らしいです。

Composer

こちらもbundler的な事を行えるのですが、Onionよりもその依存関係部分に注力したパッケージマネージャといった感じです。 PEARだけに限らず、gitのリポジトリを依存関係として指定したりもできます。ただその辺りはあまり調べていないので、今回はPEARパッケージのみ使う前提で試して見ました。

インストール

brew install --HEAD https://raw.github.com/gist/1574469/composer.rb

使用方法

composer_sample
|– vendor
|– composer.json

プロジェクト直下にcomposer.jsonを作成し、ここに依存関係などを記述します。

上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。

$ composer.phar install

ComposerはPEARモジュール以外も扱うためか、PEARモジュールそのものを扱うのに設定ファイルが少々複雑になります。
今回はpear.phpunit.de/PHPUnitを依存関係として設定していますが、まずそのためにrepositoriesにチャンネルを設定する必要があります。そこまではいいのですが、PHPUnitがpear.symfony-project.com/YAMLに依存しているので、そのチャンネルも記述しておく必要があります。つまり依存関係にある全てのチャンネルを設定しておく必要があるみたいです。これどうにかならないのでしょうか。

雑感としてはPEARモジュールさえ扱えればいいのであれば、Onionの方が簡単だと思いました。対してComposerはPEARモジュール以外にも使えるので、今後に期待できるのはComposerだと思いますが、現状は用途に合わせてといったところでしょう。また気になる動きとして、OnionのGithubリポジトリにcomposer-supportというブランチがあるのが楽しみです。

Facebooktwitterlinkedintumblrmail

phpenv+php-build+pyrusでの複数バージョンPHP管理など

必要なもの

  • phpenv
    PHPのバージョン切り替え(切り替えるのみ、PHPのインストールはできない。rbenvを流用)
  • php-build
    複数バージョンPHPのインストールマネージャ
  • Pyrus
    PEAR後継パッケージマネージャ

phpenvのインストール

$ curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | sh
Installing phpenv in /Users/dataich/.phpenv
remote: Counting objects: 1008, done.
remote: Compressing objects: 100% (422/422), done.
remote: Total 1008 (delta 633), reused 928 (delta 558)
Receiving objects: 100% (1008/1008), 135.47 KiB | 124 KiB/s, done.
Resolving deltas: 100% (633/633), done.
Success.

Now add /Users/dataich/.phpenv/bin to your $PATH, add "eval $(phpenv init -)" at the end of your ~/.bashrc and restart your shell to use phpenv.

最後の行で言われたとおり、.bashrcに追記します。

$ vi ~/.bashrc
export PATH="/Users/dataich/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

phpenvは~/.phpenv以下にインストールされており、~/.phpenv/versionsにバージョンごとのPHPをインストールしてやることで切り替えが可能になります。

php-buildのインストール

$ git clone https://github.com/CHH/php-build.git
$ cd php-build
$ ./install.sh
Installing php-build in /usr/local
- Creating Directories... Done.
- Copying files... Done.

これで必要なもののインストールは完了です。また、現状はインストールできるPHPバージョンが増えたりした場合は、git pullして./install.shを再度実行しないといけないと思います。

php-buildを使用してPHPをインストール

まずはインストール可能なバージョンを調べます。

$ php-build --definitions
5.2.17
5.3.2
5.3.6
5.3.8
5.3.9RC3
5.3snapshot
5.4.0RC1
5.4.0RC2
5.4.0RC3
5.4.0RC4
5.4.0alpha3
5.4.0beta1
5.4.0beta2
5.4snapshot

では上記から好きなバージョンを選んでインストールしています。今回は業務で必須なので5.3.8を。

とその前にApacheモジュールどうする?

php-buildはApacheモジュールのビルドに対応していません(GitHubにIssueにはFeatureとして登録されてます。)。
ソースを読んでみるconfigure_optionを呼び出してあげればよさそうです。なのでdefinitionsに定義してあるスクリプトに変更を入れてあげます。このdefinitions配下にあるスクリプトはいろいろビルド方法を調整する時に使えそうです(pyrusじゃなくてpear使いたかったらwith_pear書いて、install_pyrusコメントアウトするとか。)

$ vi /usr/local/share/php-build/definitions/5.3.8
configure_option "--with-apxs2" "/usr/local/Cellar/httpd/2.2.21/sbin/apxs" #この行を追加する。apxsへのパスは環境に応じて置き換えてください。
install_package "http://www.php.net/distributions/php-5.3.8.tar.bz2"
install_pyrus

install_xdebug "2.1.2"

まあPHPをビルドする度にlibphp5.soを上書きしてしまうだろうということと、phpenvで切り替えた時どうするのっていうのはありますが・・・。

気をとりなおしてphp-buildを使用してPHPをインストール

ではphp-buildを使用して5.3.8をインストールします。プレフィックスには~/.phpenv/versions/5.3.8を指定します。実はここでちょっとはまったのですが、最後の引数はプレフィックスなのでフルパスである必要があります。

$ php-build 5.3.8 ~/.phpenv/versions/5.3.8
Loaded pyrus Plugin.
Loaded xdebug Plugin.
php.ini-production gets used as php.ini

Building 5.3.8 into /Users/dataich/.phpenv/versions/5.3.8

[Downloading]: http://www.php.net/distributions/php-5.3.8.tar.bz2
[Configure]: /usr/local/bin/../tmp/php-build/source/5.3.8
[Make]: /usr/local/bin/../tmp/php-build/source/5.3.8
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /Users/dataich/.phpenv/versions/5.3.8/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.1.2.tgz
[XDebug]: Compiling in /usr/local/bin/../tmp/php-build/source/xdebug-2.1.2
[XDebug]: Installing XDebug configuration in /Users/dataich/.phpenv/versions/5.3.8/etc/conf.d/xdebug.ini
[XDebug]: Cleaning up.
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /usr/local/bin/../var/log/php-build/error.5.3.8.20120106174319.log
[Success]: Built 5.3.8 successfully.

ちなみにphp.iniは~/.phpenv/versions/5.3.8/etc配下のを使うようになっています。また~/.phpenv/versions/5.3.8/etc/conf.d配下のものも読むようになっており、xdebug.iniなどが置いてあります。バージョンごとにiniファイルを持っているので便利です。

phpenvを使ってみる

ではphpenvにて切り替えられるバージョンを調べてみます。

$ phpenv versions
5.3.8

先ほどインスールした5.3.8が使用できる状態になっていますので、グローバルに使うようにします。

$ phpenv global 5.3.8
$ phpenv versions
* 5.3.8 (set by /Users/dataich/.rbenv-version)
$ php -v
PHP 5.3.8 (cli) (built: Jan 11 2012 23:20:46)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
with Xdebug v2.1.2, Copyright (c) 2002-2011, by Derick Rethans

また、下記のようにlocalを使うとカレントディレクトリに.rbenv-versionというファイルが作られ、そのディレクトリ配下では一度指定したバージョンが使われるようになります。

$ phpenv local 5.4snapshot

phpenv rehashコマンド

phpenvでは.phpenv/shims/にパスを通すようになっており、そこを介してexecutableなコマンドを実行したりします。

$ ll .phpenv/shims

何もないはずです。ここを構築するにはrehashを使います。

$ phpenv rehash
$ ll .phpenv/shims/
total 56
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 phar
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 phar.phar
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 php
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 php-config
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 phpize
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 pyrus
-rwxr-xr-x 7 dataich staff 102 1 11 23:31 pyrus.phar

これを実行することでインストールされているPHPやPEARモジュールの実体を探してきて、シムリンクぽいシェルスクリプトが作成されます。新しいバージョンのPHPや、phpunitなどの実行モジュールをインストールした後には実行しておきましょう。

Pyrus

で次にPyrusです。PEARの後継にあたるパッケージマネージャです。使ってみます。
php-buildでインストールした際に既に使えるようになっています。

$ pyrus config-show
Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D
Using PEAR installation found at /Users/dataich/.phpenv/versions/5.3.8/pyrus
System paths:
php_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/php
ext_dir => /Users/dataich/.phpenv/versions/5.3.8/lib/php/extensions/no-debug-non-zts-20090626
cfg_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/cfg
doc_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/docs
bin_dir => /Users/dataich/.phpenv/versions/5.3.8/bin/
data_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/data
www_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/www
test_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/tests
src_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/src
php_bin => /Users/dataich/.phpenv/versions/5.3.8/bin/php
php_ini => /Users/dataich/.phpenv/versions/5.3.8/etc/php.ini
php_prefix => /Users/dataich/.phpenv/versions/5.3.8/bin/
php_suffix =>
...

パッケージのインストール先ディレクトリ等がphpenvで指定している現在のバージョン配下になっています、素晴らしい!これでPEARモジュールは現在使用中のPHPのバージョン配下に収まることになります。

pyrusコマンドは第一引数にディレクトリを渡してやることで、そのディレクトリローカルなパッケージ管理ができるようになるので、非常に便利です。ただphp-buildが生成するshimにバグがあって、使えない状態だったのですが、作者さんに投げたところ数時間で対応していただきました、これで常用できそうです。
#35: Cannot use pyrus locally – Issues – CHH/php-build – GitHub

ただし現状Pyrusだとプロジェクトローカルなインストールは簡単なのですが、依存関係の設定ファイルだけリポジトリに上げておいて、コマンド一発で全部インストールみたいなことが難しいです。package.xmlを作ればできるようなのですが、そもそもPEARモジュールのビルド用ぽくて、扱いが難しいです。次のエントリーではその辺りを上手く解決してくれる、Onion、Composer辺り扱ってみます。

参考

phpenv で複数の PHP 環境を管理する
php-build で PHP 5.4.0 beta1 をビルドする
Using Pyrus To Manage PEAR Installable Vendor Libs

Facebooktwitterlinkedintumblrmail