2017年6月11日日曜日

Xcode の古いシミュレータを削除して Mac のディスクを節約

Mac Book Air で Xcode を使っていると、すぐにディスク不足になってしまいます。

消費量を調べてみると、使わなくなった古い iOS シミュレータが残ったままになっていたので
掃除方法を調べてみたのですがググっても情報が少なかったので方法を書いておきます。

現状把握

まずはディスク消費量を確認。
MacBook-Air:~ $ du -sh ~/Library/Developer/*
4.5G Library/Developer/CoreSimulator
4.2M Library/Developer/Shared
 30G Library/Developer/Xcode
CoreSimulator の下にシミュレータが格納されています。
4.5GB。

最新のiOSの分だけ使っているつもりでもこんな感じで100個くらい入っています。
MacBook-Air:~ $ ls ~Library/Developer/CoreSimulator/Devices/
02920FBA-70BB-4151-A812-2781B21C9310 85294178-C816-445D-B721-0F5B66EB6C1C
0C6A0874-5BA9-4C67-BB20-F57BF0BCAD3B 857ED83C-660E-4DA0-9B47-93604E175793
0F9F2A17-034E-416E-A871-1FBE54F6C6ED 85B3622F-4C8B-4ADA-8F82-4C9CF4759E39
11E82193-8207-4AF1-A6B4-286113C0490C 85D35A3C-6682-48DD-B35E-C5870E8975A9
16469CC0-4DD0-42C8-A782-CEFE4C505756 8A8FDA9A-F064-420A-8684-7666559F4D61
    :

必要のないシミュレータを確認する

大量のシミュレータについて、1個ずつ内容確認して削除するとか、、、絶対嫌ですね。
そこはさすが Apple さんです。ちゃんとコマンドを用意してあります。
「xcrun simctl list」で全シミュレータの状態を表示してくれます。
MacBook-Air:~ $ xcrun simctl list
== Device Types ==
iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s)
iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5)
    :
== Runtimes ==
iOS 10.3 (10.3 - 14E269) (com.apple.CoreSimulator.SimRuntime.iOS-10-3)
tvOS 10.2 (10.2 - 14W260) (com.apple.CoreSimulator.SimRuntime.tvOS-10-2)
watchOS 3.2 (3.2 - 14V243) (com.apple.CoreSimulator.SimRuntime.watchOS-3-2)
== Devices ==
-- iOS 10.3 --
    iPhone 5 (1AD05780-679D-4819-B841-97DDF6F572F6) (Shutdown)
    iPhone 5s (3D7CBDDC-6D4D-4154-A815-A85CE2953F25) (Shutdown)
    iPhone 6 (822F3C1D-C566-42A5-A888-8864FEA1C5D0) (Shutdown)
   :
-- tvOS 10.2 --
    Apple TV 1080p (2E35F89E-2C32-4689-83D9-D2ADCEBE34F3) (Shutdown)
-- watchOS 3.2 --
    Apple Watch - 38mm (0C6A0874-5BA9-4C67-BB20-F57BF0BCAD3B) (Shutdown)
    Apple Watch - 42mm (BDB19BBE-8386-4DF2-B103-E1A5B969D4D3) (Shutdown)
    Apple Watch Series 2 - 38mm (B58B5DB4-9F9F-4FF0-A830-AEF9C2AF057B) (Shutdown)
    Apple Watch Series 2 - 42mm (6ACBB806-43DE-47F7-838F-EF1BA64DCB1C) (Shutdown)
-- Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-10-0 --
    iPhone 5 (435DED31-5DCA-4FBF-8CC5-3BA5E6FFD1D0) (Shutdown) (unavailable, runtime profile not found)
    iPhone 5s (76FDA547-B754-4100-B51C-0731EB62F7CB) (Shutdown) (unavailable, runtime profile not found)
    iPhone 6 (C28739B4-4A8B-40BB-A311-CB1DDCBD60E2) (Shutdown) (unavailable, runtime profile not found)
   :
-- Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-10-1 --
    iPhone 5 (E72D4C90-3589-40F9-9A8E-A63DD3239BFA) (Shutdown) (unavailable, runtime profile not found)
    iPhone 5s (1AE73560-DDB7-4BDA-BC32-B36A0000EF57) (Shutdown) (unavailable, runtime profile not found)
   :

ここで、ポイントになるのは「Unavailable」と書かれているところです。
私の場合、最新のiOS(現時点で10.3)のシミュレータしか入れていないつもりなのですが、
10.0や10.1のシミュレータが存在して「Unavailable」になっています。

これらは10.0のシミュレータをインストールして使った後、
シミュレータ本体を削除したにも関わらず、デバイスイメージだけ残ったもののようです。

不要なデバイスイメージを削除する

これで不要なフォルダを特定できましたが、これらを1個ずつ削除するのもちょっと嫌です。
そこはさすがAppleさん。一撃で削除するツールがあります。
MacBook-Air:~ $ xcrun simctl delete unavailable
はい、以上、終わり。
4.5GB も使っていたフォルダが 140MB になりました。

MacBook-Air:Devices isao$ du -sh ~/Library/Developer/*
140M /Users/isao/Library/Developer/CoreSimulator
4.2M /Users/isao/Library/Developer/Shared
2.9G /Users/isao/Library/Developer/Xcode

2017年4月29日土曜日

iOSアプリ - Oyakodon

世の中でマストドンというサービスが話題になっているようなので勢いだけでクライアントアプリを作ってみました。
名前も勢いだけの語呂で「Oyakodon」。


マストドンとは?

ざっくり言うと Twitter のようなサーバ(インスタンス)があちらこちらに立ち上がっている状態でしょうか。
各インスタンスは独立な存在で、ユーザアカウントも別々です。

ただし、異なるインスタンスのユーザをフォローしたり、他のユーザがフォローしている
外部インスタンスのユーザの投稿がタイムラインに出てきたりと、インスタンス間で微妙な繋がりがあります。

そのため、Twitter や Facebook のように中央集権的に特定の企業が権限を持っていたり、
サーバダウンによってサービス全体が停止することがありません。

マストドンクライアントアプリ - Oyakodon

特徴その1:複数インスタンスのタイムラインをフリック切り替え
インスタンスが分散して存在しているため、マストドンを使っていると複数のアカウントを使い分けたくなってきます。
他のマストドンアプリは設定画面からアカウントを切り替える仕組みになっているものが多いようです。
それはそれでインスタンスを独立に扱えるので良いのですが、多数のタイムラインを一度に見るには不向きですね。

そこで、画面を横フリックすることで次々にタイムラインを見ることに特化したアプリを作ってみました。
とにかくサクサクとインスタンスを切り替えることに特化したので、同一インスタンス内で表示できるタイムラインは1つです。
マストドンには「連合」「ローカル」など複数のタイムラインがありますが、それらの切り替えはあえて設定内に押し込みました。
他のアプリではインスタンス内の切り替えが表に出ていてインスタンス切り替えが設定内なので、このアプリでは逆の考え方ですね。

特徴その2:ストリームタイムライン表示
マストドンのWeb表示の特徴の1つにストリームタイムラインがあります。
ストリームタイムラインではユーザ操作なしでほぼリアルタイムにタイムラインが更新されていきます。
これをアプリでやろうとすると色々問題があるので不採用としているアプリが多いようです。

Oyakodon では問題点に目を瞑ってストリームタイムライン表示にしました。
バッテリー消費が大きいと思うので外出中などの使用の際はご注意ください。
また、若干強引にWebの表示をそのまま嵌め込んだので、時折表示が乱れる場合があります。
おかしくなるケースを見つけた方はご指摘ください。

既知の問題

v1.0 では既知の問題がいくつかあります。
数点については既に修正済みバージョンをAppStoreに申請中なのですがレビューに時間がかかっているようです。
他にも見つけた方はコメント欄等でご指摘いただけると助かります。
  • iOSのバージョンによってはPawoo など一部のインスタンスへのログインに失敗する。
  • Pixiv, niconico などのアカウント連携でのログインができない。
  • ヘッダ部分のタイトル等は不要。

今後の機能拡張予定

AppStore レビュー欄や Twitter, mstdn.jp などでもご指摘をいただいていますが、
今後、次の点について拡張する予定です。

  • タイムライン切り替えを快適にする目的の拡張
    - タイムラインを表示する順序の並び替え機能。
    - 広告削除手段
  • iPhone/iPad を立て掛けてタイムラインを流しっぱなしにする目的の拡張
    - 横向き表示
    - ヘッダ部分を一切表示しない設定
    - iOSのスリープを無効化する設定
  • マストドンをマルチインスタンスで利用する目的の拡張
    - インスタンス追加の画面の改良
    - インスタンス追加の画面で他のインスタンスを紹介

2017年4月8日土曜日

FlashAir+Arduino+Raspberry Piで温湿度計(4):Raspberry Pi で見える化する〜完成

[This report is also available in English.]

もくじ
  1. 準備〜センサから値を読む
  2. iSDIOを使いながらSDカードを読む
  3. Arduino から Raspberry Pi に測定値を送る
  4. Raspberry Pi で見える化する〜完成

ようやく最終回です。
Arduino から送られてきたデータを Raspberry Pi で受け取り、
Java Script で見える化します。

今回作成する PHP, JavaScript は Github に置きました

おさらいですが、全体の通信シーケンスは次のようになります。


データ収集APIでArduinoからの送信を受け付けます。
受け取ったデータはログファイルに書き込んでおき、
タブレット用表示ページのJavaScriptから参照させる流れです。

Raspberry PiでWeb APIを動かす

Apache と PHP で Web API を作ります。
単にパッケージをインストールするだけです。
ググればたくさん情報が見つかりますので詳細は省略します。
pi@raspberrypi ~ $ sudo apt-get install apache2
pi@raspberrypi ~ $ sudo apt-get install php
pi@raspberrypi ~ $ sudo systemctl start apache2
インストール後、/var/www/html/ に置いたファイルを HTTP 経由で参照できるようになります。

データ収集API

2017年4月3日月曜日

FlashAir+Arduino+Raspberry Piで温湿度計(3):Arduino から Raspberry Pi に測定値を送る

[This report is also available in English.]

もくじ
  1. 準備〜センサから値を読む
  2. iSDIOを使いながらSDカードを読む
  3. Arduino から Raspberry Pi に測定値を送る
  4. Raspberry Pi で見える化する〜完成

前回までで Arduino から FlashAir を使う準備が整いました。
今回はついに FlashAir から Raspberry Pi にデータを送ります。
今回作成したソースコードは Github に置いてあります。

Arduino と FlashAir を接続する

図のように接続します。


SD カードの各ピンの意味は次の通りです。
今回はチップセレクトを4番ピンにしました。
シルク意味
CD未使用
CSチップセレクト
CLK同期用クロック
SDOデータ出力
SDIデータ入力
GNDグランド
3.3V3.3V 電源
5V5V電源


FlashAir から設定値を読み込む

せっかく SD 読み書きと iSDIO の両方を使えるようにしたので、SD カード領域に保存した設定値を参照できるようにします。

2017年4月1日土曜日

FlashAir+Arduino+Raspberry Piで温湿度計(2):iSDIOを使いながらSDカードを読む

[This report is also available in English.]

もくじ
  1. 準備〜センサから値を読む
  2. iSDIOを使いながらSDカードを読む
  3. Arduino から Raspberry Pi に測定値を送る
  4. Raspberry Pi で見える化する〜完成

前回はDHT22で温度と湿度を計測しました。

今回は計測結果を送信、、、と言いたいところですが、その前に FlashAir の iSDIO ライブラリを改造します。

FlashAir の iSDIO と SDカード機能を両立させる

FlashAir Developers のチュートリアルに従うと、FlashAir で iSDIO を使って HTTP 接続できます。
FlashAir Developers:Arduino 向けチュートリアル

ところが、このチュートリアルでは SD カードアクセス機能が殺されています。
このチュートリアルのソースを使っていると Arduino 標準の SD カードライブラリが動作しなくなるので、自力でライブラリを改造する必要があります。

FlashAir+Arduino+Raspberry Piで温湿度計(1):準備〜センサから値を読む

[This report is also available in English]

もくじ
  1. 準備〜センサから値を読む
  2. iSDIOを使いながらSDカードを読む
  3. Arduino から Raspberry Pi に測定値を送る
  4. Raspberry Pi で見える化する〜完成

カミさんが「温湿度計が欲しい」と言うので作ってみました。
Arduino で測定した温湿度計を FlashAir で Raspberry Pi に飛ばして Web 表示します。

【今回のポイント】
  • FlashAir, Arduino, Raspberry Pi を連携させてセンサデータを見える化
  • DHT22 で温度と湿度を計測
  • Arduino で浮動小数を文字列変換
  • FlashAir の iSDIO での WiFi 接続と SD カード読み書きを両立 (次回の記事で解説)
  • Chart.js でバブルチャートを表示 (次回の記事で解説)


完成するとこうなります。


複数の部屋のデータが表示されていますが、温湿度計は1台です。
各部屋の比較をしたいだけなので、1箇所ずつ測定してからデータを重ねました。

温湿度計自体はこんな感じ。
顧客(カミさん)からは「思ってたのと違う」という賛辞をいただきました。



全体設計

2017年3月19日日曜日

Raspberry Pi の autofs で NAS のバックアップ

自宅の全てのデータを NAS に保存しています。
NAS は RAID でミラーリングしているとは言え、飛ぶときはミラーもろとも飛ぶので
2台体制で定期的にコピーするようにしています。

2台のメーカーが違っていたり、特定のフォルダだけコピーしたいようなケースでは
NAS が持っているネットワークバックアップ機能では対応できないことがあります。

そこで、我が家では Raspberry Pi で NAS 間のデータバックアップを動かしています。

滅多に変更しないもので、毎回やり方を忘れがちなので備忘録としてメモしておきます。

バックアップの前提

  • NAS2台ともWindowsファイル共有。
  • いつも1台(稼働系)に書き込み。もう1台(冗長系)はバックアップ専用。
  • 冗長系が壊れたら、新しく購入したNASを稼働系にして、元の稼働系を冗長系に置き換える。
  • 稼働系が壊れたら、新しく購入したNASを稼働系にして、冗長系から書き戻す。
    (常に冗長系を旧機種にするため。)
  • NASを再起動しても Raspberry Pi のバックアップ機能には影響がないようにしたい。


IP アドレスの設定