プロジェクト毎に Xcode のバージョンを指定する方法

By | 2014年11月6日

ソースコードに書く方法でもいいんですけど、他にうまいことできないかなと思って少し調べてみました。
どうやら Run Script でも同じようなことができそうです。

Xcode Run Script Build Phase debugging」をみて知ったのですが、echo "error: ***" とするとビルドを失敗させることができるみたいです。
ほかにも warnings や note といったものがあるようです。

ただ shell や bash だと意図した挙動になるのですが、他の言語だとビルドエラーにならないです。

ここで重要になってくるのが Run Script の実行する順番です。
Compile Sources の前に実行するようにしないと、一度目のビルドは通ってしまうので気をつけないといけません。

gist にサンプルがあるのでどうぞ。

Peco & ec2list で快適にEC2インスタンスにSSHする

By | 2014年7月1日

AWSのAPIをカジュアルに」の 24 ページ目に”Unix的な小道具を作る”とあるのですが、これがとても便利そうでした。
何をするのかというと EC2 インスタンスの一覧を取得し、選択したホストに SSH します。
というわけでさっそく Zsh に設定してみました。

事前準備

IAM Management Console」に登録して API へのアクセスキーを発行し、~/.aws/config に保存しておきます。
ここで Policy の設定をミスっていて API にアクセスできなかったので確認しておくと変にはまらないかと思います。

Peco をインストール

Homebrew を使っている場合

$ brew tap peco/peco
$ brew install peco

Go の環境がある場合

$ go get github.com/peco/peco/cmd/peco

ec2list をインストール

$ gem install ec2list

(※) ec2list は memoize しているので毎回リクエストが発生するわけではありません。

$ ec2list

これで一覧が表示されていれば成功です。
default 以外の profile を使用する場合は以後、 s/ec2list/ec2list –profile [profile名]/ で置換してください。
エラーがでる場合は Policy の設定がおかしいか、~/.aws/config の設定がおかしいかだと思います。

Zsh の設定

$ ec2list | peco | cut -f 3 | xargs -o -n 1 ssh

このコマンドで選択したホストに SSH ができれば成功です。
毎回これを実行するのもめんどくさいので alias か、もしくは keybind を設定しておけば幸せになれるかと思います。

alias

[~/.zshrc]
 
alias peco-ec2ssh="ec2list | peco | cut -f 3 | xargs -o -n 1 ssh"

keybind

[~.zshrc]
 
function peco-ec2ssh() {
  echo "Fetching ec2 hosts..."
  local selected_host=$(ec2list | peco | cut -f 3)
  if [ -n "${selected_host}" ]; then
    BUFFER="ssh ${selected_host}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-ec2ssh
 
bindkey '^q' peco-ec2ssh

これで ^q を押せば SSH できるようになりました。
便利ですね。

Peco と ec2list の組み合わせでやりましたが、ec2ssh‘$ grep -E ‘^Host[[:space:]]+[^*]’ ~/.ssh/config | peco | awk "{print \$2}" | xargs -o -n 1 ssh’ の組み合わせでもいいと思います。

ではでは。

Mountain Lion で rbenv + Pow 環境下で Rails をうごかす

By | 2012年12月3日

基本的にはpow + rbenvで手軽なRack環境構築をみたままやりました。

LoadError: no such file to load -- bundler/setup

基本的には問題なかったのですが上記のようなエラーが出力されていて、アプリが起動しませんでした。

これは pow がシステムの ruby を実行していため bundler がなくておこられていました。(rbenv 下に bundler をいれています。)

なので pow からも rbenv の ruby を使うようにしてやればおkです。

~/.powconfig
export PATH=~/rbenv/shims:~/.rbenv/bin:$PATH
eval "$(rbenv init -)"

よくある rbenv を使う際の設定ですね。

あとは pow を再起動してやれば起動すると思います。

rvm の場合も同じように ~/.powconfig でやればいけるとは思うんですけど

pow —print-config

としてやると POW_RVM_PATH というのがあるのでひょっとしたら path をとおしておくと勝手にやってくれるのかもしれませんね。

pow –install-systemをするのを忘れて routing されなかくて悩んでたのでみなさんは気をつけましょうw

touch ${RAILS_ROOT}/tmp/restart.txt

上記のように touch してやると再起動できます。

既にファイルがあってもタイムスタンプをみて再起動してくれるみたいですね。

しばらくこの環境で powder を使って様子見しようかなと思います。

iOS, Android, perl間で AES暗号化を行った通信をする

By | 2012年3月2日

Andorid, iOS, サーバー(perl)間で暗号化して通信する必要があったのでまとめてみました。

処理の流れはこんな感じ

クライアント(iOS, Android) からの通信
         [Request]                            [Response]
        plain text                       plain text
           ↓                                   ↑
        cipher text                        cipher text
           ↓                                   ↑
        base64 text                      base64 text
           ↓                                   ↑
          WAN(POST)                       WAN
           ↓                                   ↑
        base64 text                      base64 text
           ↓                                   ↑
        cipher text                        cipher text
           ↓                                   ↑
        plain text                      plain text

鍵は事前に交換してるものとして話をすすめます。

結論からいうと iv さえあわせとけば特にハマリませんでした。
そういいつつここで大分はまったんですけどねw

とういわけで iv をそろえないといけないので今回は iOS で NULL(0x00 x 16 Byte) にあわせました。

それは「CCCrypt(Objective-C) で暗号化したデータを Crypt::OpenSSL::AES(perl) で復号化する」を参考にしただけで特に理由はありません。

本来なら C で Android, iOS 用のライブラリをつくっちゃったらよかったのだろうけどもと思いつつそこまでやってません。

あと GET で暗号化したものを通信する際は Base64 を URLSafe にして encode / decode してください。

perl

#!/usr/bin/env perl
 
use strict;
use warnings;
 
use Digest::MD5 (); 
use MIME::Base64 (); 
use Crypt::CBC (); 
 
sub main {
    my $key = 'e8ffc7e56311679f12b6fc91aa77a5eb';           #Digest::MD5::md5_hex(time); とか。
    my $cipher = Crypt::CBC->new(
        -key         => $key,
        -literal_key => 1,
        -cipher      => 'Crypt::OpenSSL::AES',
        -header      => 'none',
        -iv          => pack('C*', map {0x00} 1..16),
    );  
 
    ############## Request(decrypt) ##############
    my $base64_text = "BhSJd4mRRJo+fGzpxIOUNg==";
    my $cipher_text = MIME::Base64::decode_base64($base64_text);
    my $plain_text  = $cipher->decrypt($cipher_text);
    print "plain text for request : $plain_text\n";         # plain text for request : crypt text!!
 
    ############## Response(crypt) ##############
    $plain_text  = "I'm hungry!";
    $cipher_text = $cipher->encrypt($plain_text);
    $base64_text = MIME::Base64::encode_base64($cipher_text);
    print "base64 text for response : $base64_text\n";      # base64 text for response : 72XrlydqnUzVrDfDE7ncnQ==
 
    return 0;            
}                        
 
exit main() unless caller;

iOS

AES crypt category」と「Base64 category」をもってきて
import すれば下記の方法でいけます。

NSString *key = @"e8ffc7e56311679f12b6fc91aa77a5eb";
 
NSData *cipherData;
NSString *base64Text, *plainText;
 
//############## Request(crypt) ##############
plainText  = @"crypt text!!";
cipherData = [[plainText dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
base64Text = [cipherData base64Encoding];
NSLog(@"%@", base64Text);            //BhSJd4mRRJo+fGzpxIOUNg==
 
//############## Response(decrypt) ##############
base64Text = @"72XrlydqnUzVrDfDE7ncnQ==";
cipherData = [base64Text base64DecodedData];
plainText  = [[NSString alloc] initWithData:[cipherData AES256DecryptWithKey:key] encoding:NSUTF8StringEncoding];
NSLog(@"%@", plainText);            //I'm hungry

Android

AndroidでAESの暗号化する」を参考にしてつくりました。
違うのは鍵を外部からうけとれるようにしたのと、 iv を 0x00 の 16 Byte にそろえたくらいです。
Base64 で encode / decode しないといけないので Android SDK 2.2 以上だと動きます。
2.1 以下で使用する際は別途 Base64 のライブラリを用意してください。

エラーのハンドリングとかちゃんとしていないので参考程度にしてください。

AES256 encryption on Android

String key = "e8ffc7e56311679f12b6fc91aa77a5eb";
byte[] keyBytes = key.getBytes("UTF-8");
byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
String plainText;
byte[] cipherData;
String base64Text;
 
//############## Request(crypt) ##############
plainText  = "crypt text!!";
cipherData = AES256Cipher.encrypt(ivBytes, keyBytes, plainText.getBytes("UTF-8"));
base64Text = Base64.encodeToString(cipherData, Base64.DEFAULT);
Log.d("encrypt", base64Text);   //BhSJd4mRRJo+fGzpxIOUNg==
 
//############## Response(decrypt) ##############
base64Text = "72XrlydqnUzVrDfDE7ncnQ==";
cipherData = AES256Cipher.decrypt(ivBytes, keyBytes, Base64.decode(base64Text.getBytes("UTF-8"), Base64.DEFAULT));
plainText = new String(cipherData, "UTF-8");
Log.d("dcrypt", plainText);         //I'm hungry

いじょう。

“attaching to [appname]”で止まり起動しなくなった時の対処法

By | 2011年8月26日

Simulator を起動すると “attaching to [appname]” で hang する状態になってしまった。
そして無駄に時間を費やすハメに。。。

色々いじるも拉致があかず実機に転送してみるとThe application does not have a valid signature.というポップアップが!!
Titanium を使ってた際にこれでハマったことがあったので助かった。

原因は .app の直下に contents というフォルダを作っていたためでした。
詳細はここで説明していますのでそちらでどうぞ。
contents というフォルダをリネームすると起動したり実機に転送することができた。
Titanium だけと思ってたけども違ったみたい。それにしても、もう少しワーニングなりなんなり出してほしいものですね。

その他にも以下のような原因でもなるらしいです。
XCode 4 hangs at “Attaching to (app name)”
XCode4でSimulatorで動かそうとしたらAttaching to…で固まる
Xcode4: Attaching to MyApp

とにかく contents というフォルダを .app 直下に作らないことが吉です。