アラのアラアラしい日記

こっそりかいてます

El capitanでpackageが全体的におかしくなった時の対処法

こんにちは!年収が4万円上がったのでマットレスを変えた人です。
3600円でした。(安)

今日はmacをel capitanにした時にrubyの挙動がおかしかったり、homebrewがinstall出来なくなったりした時の対処メモです。
私はrailsのアップデートをしようとした時に、rubyのあるディレクトリでpermissionエラーが出ていることが分かりました。

今回のアップデートから、/usr/bin以下のディレクトリのpermissionが変わって、ログインユーザで使えるものが限られたようです。
この他にもhomebrew等でパッケージのインストールが出来なくなったり、ライブラリのアップデートが出来なくなっていました。

こんな時は、homebrewを一度アンインストールしてから再度インストールするとパッケージの使用先が全体的に綺麗になります。
アンインストールは以下

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

続いてインストール

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

前のhomebrewでインストールした系は全て消えているので、もう一度インストールし直します。 Rubyの例です。

$ brew install ruby

この時に、前にインストールした時に残っているファイルが存在している為にエラーが出ることがあります。
前回のインストールが必要ない場合はそのまま上書きしてしまいます。

$ brew link --overwrite ruby

こんか感じで完了です。
rails等のエラーが出ていたgemのインストールも、綺麗にインストール出来るようになります。

困っている時はぜひ試してみてください!

export archived project to ipa file on command line

おはようございまーーーす(小声)
注射の針が刺さる瞬間が見れない人です。

xcodeをバージョン7に上げてから色々と不具合が多いのですが、
今回はアーカイブしたプロジェクトをexportするところで突如xcodeが落ちる謎現象に包まれたので、
exportをコマンドから行うメモです。
やっぱりX.0系は触らずにX.1系になるまで待った方がいいようですね。

このexportにはxcodebuildというコマンドを使います。
以下のリンクにman pageがありますが、xcode build --helpした方が見やすい上に詳しいです。
developer.apple.com

実際を使用したコマンドは以下のような感じです。

-exportOptionsPlistオプションに関してはなくても大丈夫ですが、deprecated warnが出るので付けた方が安心です。

また、-exportProvisioningProfileに関しては対象の.mobileprovisionのファイルパスを指定してもいけるようですが、
稀に一致するprovisioning profileがないよってエラーが出るので、名前で指定した方が安心です。

それでは、よいゆめを〜〜〜

ottoちょっとだけ使ってみた

こんにちは!「みそスープ」って呼ぶ日本人が許せないタイプの人です。

今回は最近でたottoを使ってみたメモです。開発環境編です。
ottoに関しての説明は以下にあるので省略しますね!(ニッコリ)
Otto by HashiCorp

まず、ottoコマンドを利用するためにバイナルファイルをダウンロードします。
ダウンロードしたファイルを解凍して、/usr/bin~/binに置くだけで準備完了です。
これだけでもかなりありがたいですね?

ottoファイルをセットしたらコマンドを確認します。

$ otto
usage: otto [--version] [--help] <command> [<args>]

Available commands are:
    build      Build the deployable artifact for the app
    compile    Prepares your project for being run.
    deploy     Deploy the application
    dev        Start and manage a development environment
    infra      Builds the infrastructure for the Appfile
    status     Status of the stages of this application
    version    Prints the Otto version

コマンドの使い方がダラっと表示されます。

公式のドキュメントにはサンプルがありますが、今回は自分のRailsプロジェクトで触ってみたのでそんな感じで。
プロジェクトのホムーディレクトリに移動して、ottoでアプリケーションを動かすための準備をします。

$ otto compile

これによって、.ottoid ファイルと.otto/ディレクトリが作成されます。(この中にVagrantfile等が入っています)
この時点でどんなアプリケーションなのかを判断しているそうですね。

次にottoでvagrantを起動し、SSH接続します。
接続したらbundleを入れておきます。

$ otto dev   #最初は時間がかかります。
$ otto dev ssh
$ bundle

あとはWebサーバの起動するだけです。公式ではrackupを使っていますが、
今回は今までのプロジェクトをそのまま使いたかったのでrails serverしました。

$ bundle exec rails s
INFO  WEBrick::HTTPServer#start: pid=10078 port=3200

こんな感じでWebサーバがスタートするので、あとは対象のポートに合わせてブラウザで動作を確認するだけ!
IPアドレスotto devした時にサラッと表示されていますがぐちゃぐちゃして分かりづらいので、以下のコマンドで確認することが出来ます。

$ otto dev address
172.16.1.253

今回の場合だとhttp://172.16.1.253:3200/で接続出来ます。

最後に、使い終わった環境は全てサクッと削除出来ます。

$ otto dev destroy

また、suspend等のvagrantコマンドを使いたい場合はotto dev vagrantで利用可能です。

xcodeをアップデートしたらXVimとかのプラグインが動かなくなるアレ

こんにちは!忍びの者です。
カレー色のシャツを着てくるインド人の同僚が最近やっと心を開いてくれるようになりました。

今回はxcodeをアップデートした時に毎回プラグインが消えてしまうので、
復活方法のメモです。超自分の為です。
XVimを例に書いていこうと思います。

まずはアップデートxcodeのバージョンにXVimが対応しているかを確認します。
github.com

対応している場合、既にローカルに存在しているXVimディレクトリでmasterをpullしてmakeし直すだけです。

$ cd ~/Library/Application Support/Xcode/plugins/XVim  // このディレクトリは適宜変更してください。
$ git pull origin master
$ make

xcodeを再起動するとプラグインに反応して「Load bundle」が「Skip bundle」を聞いてくるポップアップが表示されるので、
「Load bundle」を選択します。
楽勝ダナコレ

以上の方法で出来なかった場合、xcodeのバージョンに応じたUUIDをプラグインのplistに追加します。
UUIDは以下のコマンドで確認することが出来ます。

$ /usr/libexec/PlistBuddy -c 'Print DVTPlugInCompatibilityUUID' "/Applications/Xcode.app/Contents/Info.plist"

ちなみに、β版xcodeで使いたい場合は以下です。

/usr/libexec/PlistBuddy -c 'Print DVTPlugInCompatibilityUUID' "/Applications/Xcode-beta.app/Contents/Info.plist"

こうすると、0420B86A-AA43-4792-9ED0-6FE0F2B16A13のようなUUIDが取得出来ます。

次に以下のファイルを開きます。

~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/Info.plist

すると、<key>DVTPlugInCompatibilityUUIDs</key>というタグの中にUUIDが並んだ箇所が出てくると思うので、その並びに先ほどのUUIDを追加します。

保存をしてxcodeを再起動すると、先ほど説明したようなポップアップが表示されるようになります。

この辺一気にチェックしてアップデートしてくれる何かがあると便利そうですね〜〜〜
という訳で今回はこんな感じで。今日もご飯が美味しいです。

AVFoundationでカメラの明るさを調整しよう

こんにちは!IE9を使う人です。
英語公用語の社内でジャパナイゼーションを進めていることが上司にバレました。

さて、しばらく仕事でカメラアプリを作成していますが、今回はobj-cでの明るさ調整のメモです。

私自身にカメラの知識がなさすぎるので、もどかしいところが多いかと思いますがご了承ください(おじぎ)。

カメラの明るさ(露出度)を調整するには、カメラのオフセット(基準点からの差で表した値)、デュレーション(1カットの編集・特殊効果時間の長さ)、バイアス(000秒で撮影されたときに現れる映像)等が関係しているそうですが、
スライダーでISO感度をユーザに調整してもらうのが一番使いやすいかと思います。
ISOとは、国際標準化機構(International Organization for Standardization)の略で、写真感光材料の感光度を設定したものを言うそうです。
結局のところなんなんでしょうね。カメラって奥が深いんだなァ。

まず、使用する変数を準備します。(カメラ設定等は省略しています)

@property (nonatomic) AVCaptureDeviceInput *videoDeviceInput;
@property (weak, nonatomic) IBOutlet UISlider *exposureSlider;

次にviewDidAppear内でスライダーにISOの値をセットします。

- (void)viewDidAppear:(BOOL)animated
{
    // デバイス情報を取得
    AVCaptureDevice *device = [[self videoDeviceInput] device];

    // sliderの最小値・最大値を設定 (ISOの最大・最小にする)
    self.exposureSlider.minimumValue = device.activeFormat.minISO;
    self.exposureSlider.maximumValue = device.activeFormat.maxISO;

    // ISOの中間値を計算して結果を変数に代入
    float midISO = (self.exposureSlider.minimumValue + self.exposureSlider.maximumValue) / 2;
    self.exposureSlider.value = midISO;

    NSError *error = nil;
    // デバイスのロック
    if ([device lockForConfiguration:&error])
    {
        // ISO初期値(中間値)でカメラを表示
        [device setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent ISO:midISO completionHandler:nil];
        // デバイスロックの解除
        [device unlockForConfiguration];
    }
    else
    {
    NSLog(@"%@", error);
    }
}

viewDidAppearよりも前のライフサイクル内でカメラ情報を取得しようとすると、
View自体がAVCaptureDeviceを完全に読み込む前にISO値を取得してしまう為、正しい値が取れなくなります。

また、デバイスのロックに関しては、デバイスの設定を変更する為に動いているデバイスのフォーカスや露出をロックする必要があります。
設定の変更が終了したら再度デバイスのロックを解除します。

続きましてスライダーが変更された時の振る舞いです。

- (IBAction)changeISO:(id)sender
{
    // デバイスの取得
    AVCaptureDevice *device = [[self videoDeviceInput] device];

    UISlider *control = sender;
    NSError *error = nil;
    if ([device lockForConfiguration:&error])
    {
        // 取得した値をISO値にセットしてカメラ表示を変更
        [device setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent ISO:control.value completionHandler:nil];
        [device unlockForConfiguration];
    }
    else
    {
    NSLog(@"%@", error);
    }
}

storyboard内のスライダーにIBActionを付けて値を取得し、ISOを調整します。

こんな感じで、以下のような結果になりました。

最初
f:id:wknar0311:20150825143156p:plain

暗くした
f:id:wknar0311:20150825143134p:plain

明るくした
f:id:wknar0311:20150825143146p:plain

うまくいきましたな。
ちなみに今回のこのカメラの調整はiOS8以降での対応だそうなのでちょっと注意です。
(2015/07時点でiOS8ユーザは8割超のようなので大きな影響はないかと思いますが。)

できなかったこと

本当は最初、初期値を取得する為にAVCaptureISOCurrentを使用する予定でしたが、
maxISOが3桁なのに対して30桁くらいの値しか取得できなかったので利用を断念しました。。。
これ使っている人がいたら是非教えてください〜〜〜

RaspberryPiとICカードリーダ

こんにちは!つま先に手が届かない人です。

今回は久しぶりのraspiネタです。
非接触ICカードリーダを買ったので、それを使ってICカードのIDをとるまでのメモを残しておきます。

買ったのはこれ。
www.sony.co.jp
SONYのRC-S380です。raspi系でこれを使ってる人をよく見かけるのと比較的新しいモデルなので購入しました。

こんな感じです。
f:id:wknar0311:20150813162046j:plain

まず、PythonからUSBを使う為のパッケージをインストールします。

$ sudo apt-get install python-usb

次にNFC規格カードを読み書きする為のnfcpyをダウンロードします。

$ wget https://launchpad.net/nfcpy/0.10/0.10.0/+download/nfcpy-0.10.0.tar.gz
$ tar xvzf nfcpy-0.10.0.tar.gz

nfcpyの最新バージョンはこちらから確認できます。

解凍したディレクトリ内にいくつかサンプルスクリプトがありますが、
カードの読み取りはtagtool.pyというファイルの実行で行えます。

$ sudo nfcpy-0.10.0/examples/tagtool.py

これにより、以下のような結果が取得できます。
(それぞれの値は実際の値ではありません。)

IDm=031402145812f56f PMm=140b4b498435e0ff SYS=a283

意味は以下の通りです。

名前 意味 説明
IDm 製造ID カードを識別する為のID
PMm 製造パラメータ カードの種別と性能を識別する為のパラメータ
SYS システムコード システムを特定する為の値で、事業者および使用目的ことに割り当てられる

詳細はこちらからどうぞ〜

IDmがカードごとに振り分けられているユニークなIDです。
今の私の持っているカードでは、SUICA, nanaco, edyで読み取ることが出来ました。
アミュパスはダメでした(真顔)

他のデバイスとの組み合わせを考えているので、
何か完成しそうになったらまた書こうと思います。

android開発メモ

こんにちはニンジャです。暑くて圧倒的に脳が動いていません。
今回はandroid開発で困って調べたりした小さいメモ群団をここに残しておきます。
間違いとかフワッとしていることが多いので、自己満エントリですすみませんでした。

android commandを使えるようにする方法

android studioが既に入っている場合、
以下でandroid系のコマンドが使えるようになります。

export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH

これによってemulatorコマンドやadbコマンドも利用可能になります。

android studioでアプリやテストの実行

android studioでアプリを実行すると、INSTALL_FAILED_NO_MATCHING_ABISというエラーが起こることがあります。
ABIは「Application Binary Interface」の略で、ネイティブライブラリを使うアプリなのにABIがそれをサポートしていない為に起こるエラーです。

私がこのエラーに直面した時は、実行したアプリがカメラライブラリを利用するものでしたのでこれが起きました。

特にABIx86はネイティブライブラリをカバーしていないものが多い為、エラーが出ることが多いようです。
その場合は、ABIx86以外のデバイスを使用すると実行できるようになります。
(android studioでのemulatorの追加方法はこちらのリンクが参考になります。)

PCにインストールされている機種一覧は、

ls ~/.android/avd/

でも確認できます。

emulatorのカメラが動作しない場合

macandroid emulatorを起動する場合は、AVDマネージャの"Show Advanced Settings"から起動するカメラ(webcam等)を選んでおいてから、
Photo Boothをバックグラウンドで実行している必要があります。
Photo Boothなしで起動すると、emulator: ERROR: Unrecognized pixel format 'v024'のようなエラーが起こります。
iOSの場合はemulatorでカメラが起動できませんので、これは結構便利だと思いました。(撮った写真等はライブラリに保存も出来ます。)