忘れん坊のサンタクロース

iOS,Androidアプリ開発についての忘備録です。技術関連情報など掲載していこうかと考えています。時々関係ないことも書くかも。。

OS X El Capitanのrootless(System Integrity Protection)について

rootlessとは

System Integrity Protection(SIP)。通称rootlessはシステムの重要な部分に関してroot権限ですら変更できないような 領域を作ることによりシステムを保護する機能。デフォルトでは有効となっているため、これを無効化しないかぎりユーザによるシステム領域の変更は認められない。

アクセスが制限されるディレクトリーは以下となる
/System
/bin
/usr
/sbin

サードパーティー製のアプリケーションやインストーラーについては今後以下に書き込む
/Applications
/Library
/usr/local

保護されているファイルの確認

ターミナルで以下のコマンドを叩くとrootlessによって保護されているファイル、デイレクトリの一覧が表示される

cat /System/Library/Sandbox/rootless.conf

ディレクトリ内のファイルがrootlessの制限対象であるかどうかはlsコマンドの「O」オプションで確認することができる
グループ名の右横に「restricted」とあるディレクトリはrootlessの対象であり、rootであっても書き込みできない

sh-3.2# ls -lO
total 8
drwxr-xr-x     5 root     wheel  restricted   170  8  2  2015 X11
lrwxr-xr-x     1 root     wheel  restricted     3  4  4 17:29 X11R6 -> X11
drwxr-xr-x     3 root     wheel  restricted   102  2 27 16:11 adic
drwxr-xr-x  1055 root     wheel  restricted 35870  6  6 18:42 bin
drwxr-xr-x   266 root     wheel  restricted  9044  6  6 18:42 lib

rootlessの操作

Rootlessを操作する場合はcsrutilコマンドにて操作を行う。

ステータス確認

pc086:~ hogehoge$ csrutil status
System Integrity Protection status: enabled.

解除方法

必要な作業はリカバリーモードのターミナルで「csrutil disable」と入力すること。

  1. Command+Rを押しながらMACを再起動でリカバリーモード起動
  2. トップメニューから「ユーティリティー>ターミナル」と選んでターミナルを起動
  3. csrutil disableというコマンドを実行
  4. MACを再起動
  5. ターミナルで「csrutil status」というコマンドを実行

rootless変更が完了していれば「System Integrity Protection status: disabled.」と表示されます。

参考URL

RxJava2の使い方をなんとなく

RxJava2使ってみたいけれど学習コスト高いって聞くし現状のコードでいいかなーって方、実は私もそう思ってました。
しかし、DroidKaigi2017に出席した際、かなりのセッションでRxJavaについて触れられていて、もうAndroidに限らずアプリエンジニアとしてスタンダードなのかなと思い、学習を始めました。今回はそんなこんなで学習を進めた結果なんとなくわかってきたことを若輩エンジニアなりに書きたいと思います。

ストリームがどうこうバックプレッシャーがうんぬんと言うお話は一切はしませんw
かなりざっくりとした使い方だけをご説明します。

例としてとりあえず文字列が欲しい時の超簡単なObservableを実装したいと思います。
まず全体的な流れとしては以下になります。

1.Observableを定義する
2.Observableをsubscribe(購読)する
3.値をゲット

ではまずObservableを実装してみましょう。
これはObservableがsubscribeされた時の挙動を定義します。

Observable<String> observable = Observable.create(e -> {
    String name = "tokyo tanaka";
    return e.onNext(name);
});

これでobservableがsubscribeされた時、nameが渡されるようになります。
では、このobservableをsubscribeしましょう。

TextView textView;
observable.subscribe(s ->{
    textView.setText(s);
});

はい!これでtextViewに先ほどのnameがセットされました!!
、、ここでみなさん、これの何が嬉しいわけ?っと思いましたでしょうか。

ではちょっと応用を足して例えば、
API通信した結果の文字列を取得したいときObservableを使用すると、

Observable.create(e -> {
     //例えば同期通信処理
    String name = ApiClient.getInstance().getName();
    if(name == null){
        name = "failed name";
    }
    e.onNext(name);
})
.observableOn(AndroidSchedulers.mainThread())    //subscribe内での処理を行うスレッド指定(メイン)
.subscribeOn(Schedulers.io());    //Observable.create()内での処理を行うスレッド指定(ワーカー)

これをsubscribeすると通信処理が終わったかを意識せずにTextViewに値をセットすることができます。状態変数を持たなくていいということですね。
RxJavaのいいところは他にもあり、Observableをくっつけたり、違う値を返すObservableにできたりできます(map(), flatMap()といったオペレータ群)、RxJavaが分かり始めるとこういったオペレータ群にどんなものがあるのかを探すのが楽しくなっていくと思います。多分。

何はともあれ、使い方がわかってくると無敵なんじゃないかってくらい便利な代物ですので、みなさんもぜひ学習して、使ってみてください。

RxJavaって何っ!!って人集まれ。

最近、Androidの開発をしている中でRxJava使えないと時代に取り残されそう、、と思ったのでいろいろ調べてみました。 概念部分についてはいろんなサイトを漁って溺れるよりは下記のサイトをじっくり読むのがいいかと思います。

リアクティブプログラミングとRxJavaの概要 (1/6):CodeZine(コードジン)

そして、概念的知識、AndroidでのRxJava、iOSでのRxSwiftについての基本的知識は「モバイルアプリ開発エキスパート養成読本」という書籍のRxについて触れている部分でほぼ完全に理解できるかと思います。

f:id:appera:20170509151013p:plain

僕の持っている知見の詳細は後日まとめますのでひとまずはこれで、、。

小さい画像のImageButtonだとタップ範囲が狭いってときの拡張法

タイトルには拡張とありますが、実際のところ、ImageViewを持つレイアウトにクリックイベントを実装している感じです。

           <RelativeLayout
                    android:layout_width="?attr/actionBarSize"
                    android:layout_height="?attr/actionBarSize"
                    android:onClick="onClickBack">

                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:layout_centerInParent="true"
                        android:scaleType="fitXY"
                        android:src="@drawable/icon_back" />

                </RelativeLayout>

あとはActivityでクリックイベントを実装してあげれば気持ち良くタップが効いてくれます。

command failed due to signal segmentation fault 11がXcode8で発動、、。

Swift3への移行が完了しているプロジェクトを開いたときにのcommand failed due to signal segmentation fault 11が出ました。しかもSourceKitServiceが予期しないほげほげで終了してしまう、、。

 

単刀直入に解決策を言うと

$ rm -rf ~/Library/Developer/Xcode/DerivedData

でおっけいです。過去のデバイスデータが悪さをしていたのだろうか?

ひとまず解決ですが。こいつにたどり着くまでにかなりの時間を喰われましたorz

Xcode8,Swift3.0に以降したときの体験談

タイトル通り環境をXcode8,Swift3.0に移行したときの体験談です。しかし、その前に僕は下記の記事を見て悪あがきをしました。

XCode8に移行した際にしたこと(その場しのぎ編) - Qiita

このリンクの内容Xcode8にしたいけどSwift3.0はちょっとまだ、、って人にはお勧めです。

そんなこんなでXcode8には移行できたのですが、やっぱり3.0を使わないと時代に取り残されそうなので重い腰をあげて最新の仕様に対応しました。

 

Xcode8には既存のプロジェクトをSwift3.0に自動で互換してくれる機能があるのですがcocoapods周りのことを考えても絶対にコンパイルは通らないんだろーなと思ってましたが案の定その通りでした。ここで思ったことは移行対応前にGitにプロジェクトあげておくことをお勧めします。かなり。

ゲームでもそうなんですけどやっぱりセーブデータって大事。。笑

 

さぁ、いこう!(移行)

ということでまずは2.3を使用する設定をしているのでこれを解除します。

TARGET->Build SettingにあるUse Legacy Swift Language versionをNoにします。

 

f:id:appera:20161007095250p:plain

 

これを変更するとエラーが吐かれます、、(戦闘態勢)

f:id:appera:20161007095524p:plain

要は[Edit > Convert > To Current Swift Syntax...]からバージョン選べ、はよ。って感じですね。仰せのままに、、

f:id:appera:20161007095818p:plain

Convert to Swift3にチェックを入れてNext!!

その後、自動変換するファイルを選択できる画面が出てくるので選択します。プロジェクトとTest, UITestを選択してcocoapodsでインストールしているライブラリは選択しません。

 

おそらくほとんどの開発者の方はRealmSwiftを使っていると思うのですがこれをSwift3.0に対応するにはpodfileを以下のリンクを参考にしました。

 

blog.ch3cooh.jp

 

これから移行される方は頑張って下さい!
ハマる人はハマるという感じですね、、。