アラのアラアラしい日記

こっそりかいてます

homebrewの最新バージョンでscreenがinstall出来なくなった時の対処法

こんばんわ!!
2日かけてバグと戦うような情弱エンジニアです。精進が必要です。

homebrewを新しくインストールし直したら、brew searchしてもscreenが検索結果に出なくなりました。
今日はその対処法です。
utf-8パッチ付きのものをインストールすると、出なくなっていた絵文字等も表示されるようになります。
まずはtapします。

brew tap rcmdnk/homebrew-rcmdnkpac

続いてインストールです。

brew install screenutf8 --utf8

これでscreenが無事にインストールされるはずです。
また、ターミナルを再起動すると所々おかしかった動作も正常に動作するようになると思います。
誤作動がある方は是非お試しください〜

AVFoundationを使ったビデオの処理で「Cannot Complete Export」エラーが出た(iOS9.2~)

こんばんわ!
平日の睡眠不足から、休日に22時間ぶっ通しで寝てしまったところ一時的に精神状態が鬱になった人です。
睡眠の取り過ぎも良くないようですね。

今日はiOS9.2になってからぶつかったバグについてのログです。
Apple先輩徐々に色々厳しくなってますね。

AVFoundationを使ったビデオのexportは映像と音声を分けて定義するのですが、
OSをiOS9.2にしてから今まで成功していたexportで以下のようなエラーが発生しました。

AVAssetExportSession Error -11820 Cannot Complete Export

エラー内容の通り、exportが出来なくなっていたんです。
調査してみると以下のコードに問題があることが分かりました。

AVMutableComposition* composition = [AVMutableComposition composition];
AVMutableCompositionTrack * composedAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                              preferredTrackID:kCMPersistentTrackID_Invalid];
[composedAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, kCMTimeZero)
                                                       ofTrack:[[video0 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                                        atTime:kCMTimeZero
                                                            error:nil];

ユーザが音声をミュートに設定していた場合、AVMediaTypeAudioを呼び出していたにも関わらず 音声の再生時間をゼロ秒からゼロ秒に設定していたのが原因でした。

iOS9.2から、定義して使用しないようなコードを書くとexportエラーが起こるようです。
全くおっしゃる通りです!使わないものを定義してどうするんでしょうね!

という訳でミュート設定の場合のみ定義AVMediaTypeAudioの定義をするようにしたら無事にエラーが起こらなくなりました。
非常に初歩的なことですが、こういう細かいところが大切ですしチェックされるようになったのだなと思いました。

綺麗なコードを書いていきたいですね。。
あとバージョンアップ毎に入念なチェックをしなければいけませんね!反省しました!!それでは!!

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桁くらいの値しか取得できなかったので利用を断念しました。。。
これ使っている人がいたら是非教えてください〜〜〜