will and way

ただの自分用メモを人に伝える形式で書くことでわかりやすくまとめてるはずのブログ

続・Mac OSXの設定をAnsibleで9割以上自動化する

blog.matsuokah.jp

今年の1月に書いた記事では

  • Ansibleをインストールの自動化
  • Ansibleによるアプリのインストールや設定の自動化

の2つを行いました。

今回の記事では

  1. masによるアプリのインストール
  2. Ansibleのアップデート
    1. それに伴い、defaultsコマンドのv1系の実装を削除
  3. 終了後の通知
  4. その他あるべきディレクトリ構成にリファクタ

を、行いました。

1. masを使う

前回、できていなかったものが、AppStoreからアプリのインストール。

Macでの開発環境構築をできる限り自動化する。 - Qiita

という記事の中でmas-cliが紹介されていたので使ってみた。 mas-cliとはコマンドラインでAppStoreのアプリケーションをインストールできるようにしたアプリケーション。

  • 署名・審査を通過したアプリケーションソースなので安全
  • 自動的にアップデートされる

という2点の理由から、brew-caskよりもこちらのほうがなにかといい。

1. brewでmasをインストール

brewでインストールするアプリリストに追加

2. AppStoreのログイン情報を設定ファイルに記載

mas signin ${ID} "${PASSWORD}"

という形式でサインインしてから、インストールします。masのroleでは最初にsignoutし、signinしてからアプリのインストールを開始しています。

3. アプリのリストを記載

mas_applications:
  - {name: 'Slack', store_hash: 803453959}
  - {name: 'CCMenu', store_hash: 603117688}
  - {name: 'Apple Configurator 2', store_hash: 1037126344}

試しで3つだけアプリケーションのIDを列挙しました。 nameは使われないですが、hashだけだと何のアプリケーションかがわからなくなるので。

4. アップデート

自動アップデートを有効にしてれば、不要ですが

mas upgrade

で、AppStore経由でインストールしたアプリをすべてアップデートすることができます。

mas-cliを使う上でのTIPS/NOTICE

1. アプリのリストを取得する

もし、PCを乗り換えるならmasをインストールして下記のワンライナーを実行すれば、AppStore経由でインストールされているアプリ名とハッシュがgroup_varsに記載するべきフォーマットでリストされる

~/W/provisioning ❯❯❯ mas list | sed -e"s/\([0-9]*\)\ \(.*\)\ (.*/- {name: '\2', store_hash: \1\}/"
- {name: 'Apple Configurator 2', store_hash: 1037126344}
- {name: 'Xcode', store_hash: 497799835}
- {name: 'Word Writer', store_hash: 931198233}
- {name: 'Keynote', store_hash: 409183694}
- {name: 'iMovie', store_hash: 408981434}
- {name: 'CCMenu', store_hash: 603117688}
- {name: 'Evernote', store_hash: 406056744}
- {name: '1Password', store_hash: 443987910}
- {name: 'Slack', store_hash: 803453959}
- {name: 'Dash', store_hash: 449589707}
- {name: 'LINE', store_hash: 539883307}
- {name: 'GarageBand', store_hash: 682658836}
- {name: 'LadioCast', store_hash: 411213048}

2. CLI経由だとインストールできないケースがある

CCMenu

CCMenu

CCMenuというアプリケーションは何故か、AppStoreからGUIで操作しないとインストールできなかった

3. AppStoreよりもbrew caskのほうがアップデートが進んでるケースが有る。

Alfredはcaskだと最新の3系がインストールされます。AppStoreからDLすると2系になってしまいました。(2016/10/08現在)

2. 通知する

MESSAGE="Provisioning is successfull, please restart or re-login"
osascript -e "display notification \"${MESSAGE}\" with title \"osx-provisioing\""
say "${MESSAGE}'"

終わったあとこちらをフックしています。通知センターに通知して、sayコマンドで再起動を促すメッセージを喋らせてます。

f:id:matsuokah:20161008182332p:plain

いい感じだ〜

github.com

【読書】Unixという考え方 ― その設計思想と哲学

きっかけはgithubのissue

この本を読むきっかけになったのは
emacs界隈ではデファクトであるmagitvimに持ってきた
vimagitのとあるissueのやり取り。

そのissueとはAny plans to add blame command?
つまり、blameの実装予定はあるのか?という質問である。

その中でauthorは一つのことをうまくやるというUnixの哲学に基づき、その提案は棄却すると回答し、vim-fugitiveというプラグイン:Gblameを案内した上で、won't fixとして片付けている。

僕にとってこれは少しカルチャーショックを受けると同時にUnixの哲学に絶大な好奇心を抱いた。

大学の頃にそんな話を授業で聞いたけど完全に忘れてしまっていた。Amazonで調べてみるとあるじゃないか。即ポチった。

プログラムとして何に集中すべきか

この本が繰り返し伝えることは、「一つのことをうまくやること」だった。まさにissueの回答そのもの。

プログラム(プロダクト)として何が素晴らしいのか?ということは、常々、少ないバイト数、速さ、省メモリなど様々な視点があるが、
Unixという哲学では「小さいこと」が美しいと定義付けている。

それはすべてを包括しており小さいことは

  • 依存が少ない
  • 使い方がシンプルになるので、使いやすい
  • 小さいプログラムはプログラム自体が必要とするメモリへの展開が小さくて済む
  • メンテナンスしやすい
  • 組み合わせやすい

つまり、小さいものを組み合わせて大きいことをしようということだ。

Unix|(パイプ)がまさに「組み合わせで大きいことをしよう」表現している。
標準出力を次のプログラムに渡すことで、自分の好きな出力を得ることができる。

ファイルをcatしたら、grepしたいかもしれないし、sedしたいかもしれない。もしパイプという概念がなく、catがそれらを内包するしかなかったらどうなるだろう。

欲しい機能があっても、catに組み込まれない限り使えないので不便極まりない上に、installする上で依存するプログラムも大きくなるのでビルドにも時間がかかるだろう。

こう振り返ってみると、なんてよくできた哲学なんだ。。。と感銘他ならなかった。

登場した本

Unixという考え方 ― その設計思想と哲学

エンジニアはなぜ勉強し続けるの?

今日、後輩とのランチで「なぜエンジニアは勉強し続けなければならないのか?」という話題になった。

結論は 「エンジニアという職業は手段を売り物にしているから

そして、「手段」は新しいものがでてきては、古いものは使われなくなるサイクルがとてつもなく早い。

毎年のiOS/AndroidSDKのアップデートでは新たなAPIがどんどんでてくるし、
Githubにはかなりの数のライブラリが毎日、公開されてるわけで。

したがって、勉強をしないということは

  1. 「手段」を磨いたり新しいものを取り入れることが出来ない
  2. 効率的な実装の選択肢が減る
  3. 切り捨てられる技術を使い続ける
  4. 腕を磨いているエンジニアと相対的に市場価値が下がる

一言で言うと、「エンジニアとして死んでる

また、技術のアップデートは新しいものを取り入れる以外のことも必要。
例えば以下のようなもの。

  • 規格
  • 哲学
  • 概念
  • パターン

これらは使う技術が変わっても、使いまわせる財産になると思う。

腕を磨くこと、新しいものに目をキラキラさせることはエンジニアの素養の一つとして大事にしていきたい。

Intensity shuttleを使ってMacでWii Uを録画する

負けた試合の分析や、プライベートマッチでふざけてる動画がとれるのは楽しい!ということで、録画の環境を紹介。

紹介すること

  1. 最短の手順
  2. Intensity Shuttle for Thunderboltとは
  3. HDMIスプリッター USB給電タイプを購入した話
  4. 動画の録画にはOpen Broadcaster Software(通称OBS)
  5. Nintendo Creators Programについて

手順

  1. Wii U→Intensity Shuttle→TVの構成をHDMIでつなぐ
  2. Intensity Shuttle→MacをThunderboltで繋ぐ
  3. Wii Uの設定で画面解像度を720oに選択する
  4. Open Broadcaster Software(通称OBS)のMac版をインストール
  5. OBSを立ち上げて、Wii Uをソースに追加する
  6. OBSの設定
  7. 録画して、Youtubeにアップロード

述べた手順で撮った動画がこちら

youtu.be

Intensity Shuttle for Thunderboltとは

パススルー方式で、1080p30fpsや720p60fpsで録画可能なキャプチャボードです。 USB3.0方式とthunderbolt形式があり、自分はMacなので後者を選択。

手頃な値段かつそれなりの高画質(1080p60fps)を探してたんですが、はMacユーザーにとって、あまり選択肢は多くなさそうです。
ヨドバシかどこかの家電量販店のキャプチャボードランキングでも、Mac対応のものではこれが1位でした。

※パススルー方式とは、キャプチャボードを通すものの、アウトプットにラグがない形式のキャプチャボード

HDMIスプリッター USB給電タイプを購入した話

理由は2つ

MediaExpressをアクティブにしてないとTVにソース(Wii Uの画面)が転送されない

Wii U→Intensity Shuttle→TVで接続するとMacでアプリを開いて、アクティブにしておかないとWii Uのプレーができません。 MacChromeやFinderを見たりすると、画面の転送がストップしてしまう。。。

たまに暗転する

プレー中にTVが真っ暗になるケースが何回かありました。1試合に1回は起きてるかな。
録画は問題なくされてるが、プレーに響くので結構辛い

ということで、自分はHDMIスプリッター USB給電タイプ を購入しました。

USB給電式のいいところは、Wii Uから電源をとれるところ。 これで今のところ、キャプチャしたい時だけMacをつないでいます。

※スプリッタの購入と同時にHDMIケーブル1.5m を2本買うことをお忘れなく。

構成

f:id:matsuokah:20160221152529p:plain

そんなに難しくないですね。PS4を繋ぎたくなったら今度はスプリッタの前にHDMIの切替器をおいて、PS4Wii Uをつなぐのだろうか・・・?

ただし、ブラビアリンクが使えなくなるとのレビューを見かけたし、PS4はデフォルトで録画機能がついてるので、今はWii Uのみ。

mp4に変換していおいて、Youtubeをストレージとして使うのが利口なのではないかと思う。

Nintendo Creators Programについて

Youtube上のNintendoの著作物での広告売上をシェアする仕組み。もともと、任天堂の著作物を含む動画の広告売上はすべて任天堂に入ってたけど、それが投稿者にシェアされるようになった。
プログラムが適用されるソフトも決まってるのでYoutubeに動画を投稿する際には確認すべし。 公式: https://r.ncp.nintendo.net/guide/ Wikipedia: Nintendo Creators Program - Wikipedia

Splatoonの動画を取るだけで、任天堂様に貢献できるのはいいこと。イカのサポートは長くやってほしい。

OBSの設定

OBSの設定には、

  1. 全体設定(global.ini)
  2. 動画の設定(プロファイル)

の、2つがあります。

いい感じにしたファイルをGoogle Driveにあげておいたので使ってみてください。

f:id:matsuokah:20161008113809p:plain

f:id:matsuokah:20161008115223p:plain

OBS > ファイル > 設定フォルダーを表示basicといフォルダとglobal.iniというファイルを置き換えれば、1280x720の動画がmp4で取れるようになっています。

Wii Uのキャプチャに必要だったもの

SplatoonのAmiibo3種(ボーイ、ガール、イカ)ゲット!+α

f:id:matsuokah:20160131193040j:plain

やっとSplatoonAmiiboを3種類ゲットしました!!!!!!!
ミッションクリアするとギアがもらえるので、粛々とネットで調べてたんですよ。

しかしネットではびこるのは転売

元値は単体で1200円、トリプルセットで3000円なのですが、
1つ2000円くらいしてたりして、買う気になれなかった。いまは、1600円くらいに落ち着いてるけど、転売ヤーが儲かるところが気に喰わないので定価ゲットを狙ってた。

Amazonプライムなら定価だろうという謎の自信に満ち溢れてたんですが、へし折られました(笑)

1月中旬には多くの家電量販店で再販されたみたいだが即品切れのよう。
ノジマオンラインやヨドバシ.comでも売り切れだったので諦めていた。

しかし、Twitterでは「店頭に普通に売ってたー」と複数見かけたので、朝イチで渋谷のヤマダに行ってきました!

イカが残り1こ、ガール、ボーイは残り2こだったので、運が良かった!

早速、ガールのミッションをクリアしまして、イカパッチンやらヒーローチャージャーレプリカをゲットしました〜

普段、シューターの自分にとって、DJたこ将軍をチャージャーやるのは本当に辛かった。。。

ついでに

PS4のコントローラー充電器も買いました

f:id:matsuokah:20160131193911j:plain

アタッチメントを充電部分につけて置くだけ。

いままで、USBコードが1本しかなく、コントローラー1つをローテしながら使ってたが、これで解決。 ついでに、定位置に戻す、つまり片付けるようになりそうなので良さそう。

ちなみに2つおくとこんな感じ

f:id:matsuokah:20160131194131j:plain

イイネ!

お値段1900円ほど。

iPhoneをGenius Barに持って行く前にすること

Genius Barとは

iPhoneをはじめとするApple製品のカスタマーサポートで、各Apple Storeで専門スタッフが不具合をマンツーマンで聞いてくれるサービス。

私はiPhone5Wi-Fi接続不良、iPhone6の予期せぬ終了で計2度、お世話になりました。

前回持って行った時、スタッフと話していて勉強になったことを紹介。

予約する

当日行って受付するのもいいですが、予約してから行くとほとんど待たずに診てもらうことができる。当日だと予約できないことがあるので、2〜3日前に予約することをおすすめ。

診断する

予約時に診断することが強制されている。入力したメールに診断URLが添付されてくる。それを開くと診断が始まり、Appleに型番をはじめとするiPhoneのハード情報が送信されるため、店頭で設定を開いて型番などを教える必要がなくなる

f:id:matsuokah:20160131192139p:plain

DFUモードによる復元

バックアップをしてから実行してください。
PCにつなぎ、iTunesに繋いだ状態でホームボタンと電源ボタンを押し続けると、基盤レベルの復元モードになる。

店員さんいわく、「普通のリストアと違い、これでソフトウェアの問題なのか、ハードの問題なのかの切り分けができる。ソフトの問題ならこれで直る。実行後1週間くらい試験的につかってみてください」

また、急にアプリが強制終了するようになったり、動作がもっさりする場合もこれで直るケースが有るという。ただし、この方法は公にしていない。

フロー

したがって、持って行く前に

  1. DFUモードによる復元を行う
  2. 試験運用
  3. なおらなければ予約
  4. 診断

というフローをとれば、交換したい時だけお店にいけばいいことになります。

保証対象かどうかは、スタッフに尋ねないとわからないので、無償で交換できるか知りたい場合も行く必要あり。 対象外の場合はまるごと交換で3万4,5千円でした(2016/1/31時点のiPhone6 128GB)。

まとめ

  • Apple Storeに持ってく前にやるべきはDFU復元、試験運用、予約、診断
  • 保証対象かどうかはお店で知ることができる
  • 保証対象なら無償、対象外なら3万程度かかる
  • DFU復元は動作が重くなった、急にアプリが強制終了するようになったなどの場合にも直るケースがある
  • DFU復元は非公式

iTunes Connectでアプリがレビューに入ったとか、リジェクトされたとかをslackに通知する

blog.matsuokah.jp

から、派生して作った。ヤマトはラインで見れちゃうのでいらない子になっちゃったしね。今まで、一部の人がメールを受け取った際にチームに共有してたのでタイムラグや共有し忘れを防ぎたくてつくった

今回もGMailを定期的にGoogle App Scriptで読み込んで、SlackのWebhookを叩くという流れ。

iTunes Connectからくるメールの件名はフォーマットが決まってるのでそれに応じて通知を変えたら見やすくなりました。

レビューが通った場合はこんな感じ

f:id:matsuokah:20160118200745p:plain

ステータスは全部で8つかな。

  • Processing for App Store => アップロードが完了し、アプリの処理中の状態
  • has completed processing => アップロード後の処理が完了した状態
  • Waiting For Review => 申請が完了しました。レビュー待ちな状態
  • Developer Rejected => アプリの申請を取り下げた状態
  • In Review => レビューに入った状態
  • New message from App Review => レビューアプリに対して、Appleより連絡があった状態。おもに仕様の確認やリジェクトの時
  • Pending Developer Release => レビューを通過した状態
  • Ready for Sale => 公開処理が完了し、ストア反映待ちな状態

特に、"has completed processing"は1時間で終わるときから1日位かかるときもあったので、見逃しがちだった。これで迅速な申請作業に移れそう。

ソース

gist.github.com