iOSのヘッドフォンモードを解除する

どうも Siri からのフィードバック音声がスピーカーから聞こえないなあと iPhone の音量ボタンを押すとアイコンと共に「ヘッドフォン」の文字があったのでググってみるとヘッドフォンモードが解除できなくなる問題というのがあるそうで、日本語で検索すると、再起動、イヤフォンジャックの物理的な掃除、ストアに持ち込む、の三点セットな記事が多く、イヤフォンによる音量調節やスピーカーフォンでの通話、サウンド環境設定のボタンで変更の動作も問題が無いのでソフトウェアの解決方法を更に調べたところ、公式フォーラムで見つけた解決方法が役に立ちました。

http://hkitago.tumblr.com/post/179840974976

具体的な操作は簡単で、設定>一般>アクセシビリティ>通話オーディオルーティングと遷移し、初期状態では未選択の「Bluetoothヘッドセット」と「スピーカー」の選択項目を適当に選んで音量ボタンを押して表示を確認していくと、音量アイコン上部の文字が「ヘッドフォン」から「着信/通知音量」となって解決しました。

原因は恐らく、複数台の macOS と iOS 端末とペアリングし頻繁に切り替えて使っている AirPods にあると思うのですが定かではありません。参考にしたフォーラム内には機内モードにして解決したという報告もあるので、イヤフォンジャックに綿棒を突っ込む前に目を通してみると良いかと思います。

参考

ドアラッチの故障

一週間前くらいからガタガタと言い出していたドアラッチが、ノブ制御不能になり作業部屋へ入る事ができなくなってしまいました。参考動画でドアラッチ自体を薄く硬いもので押せば引っ込むのが分かったので、針金ハンガーを折って向かうと、

枠に返しがあり直接アクセスできないので、仕方なくドアノブ修理の検索で掛かった業者に来て見積をお願いしました。赤枠部分を切断する必要があり料金は交換混みで3万超えの作業費で、少し業者さんと話したところ次のようなことが判明したので、自分で解決してみようと思いました。

  1. 木枠を削ればドアラッチが見えるので開けることは簡単
  2. ドアラッチの高さは片方づつ異なっており、押して開く側の方が低い

賃貸物件のため(1)は管理会社と相談する必要があります。外から部屋を見ると窓の鍵が開いて管理会社で梯子を借りてということも思いついたので一旦メール連絡を入れつつ、(2)によって力を加える方向が分かったので差し込む物を材質から検討しました。

  • 子供のコロコロのおまけについているカードゲームの少し硬めの厚紙
  • ツナ缶の蓋
  • 針金ハンガー
  • スーパーのパイナップル用プラスチック容器

3分ほど押し引きしていると開きました。

コツは強く押し少し引きながらラッチがあるであろう写真四角グレーがある中心まで動かして行くことです。実際に下から上への方向で開いた気がします。

参考

Xcodeプロジェクトを複製してホーム画面にアイコンを並べる

基本的な挙動は同じだけど、数パターンでアプリを提示しないといけないという状況があります。そんな時には元になるプロジェクトを複製してアプリ名称の末尾に数字等を添えてホーム画面に並べられるように AdHoc 形式で配布する事になるのですが、半年以上に一度くらいの頻度でやってくるこの作業の度に同じ Stack Overflow ページを参照しているのと、日本語で検索した結果の手法が若干回りくどいものが散見されたので書いておこうと思います。環境について、現在は Xcode Version 9.4.1 (9F2000) を使っていますが、参照している Stack Overflow の回答の日付から察するに Xcode 6くらいから同じ作業だった気がします。コマンドラインのみで行う方もいましたが、今回は GUI 操作を選びました。

Duplicate and rename Xcode project & associated folders – Stack Overflow

具体的な手順を簡易に訳すと、

  1. ファインダでプロジェクトフォルダを複製し名称変更
  2. Xcode の左パネルでプロジェクトを選んだ状態で右パネル Identity and Type の Name を変更
  3. Manage Schemes からスキーム名称を変更
  4. Targets > General > Bundle Identifier を変更
  5. ファインダで複製したプロジェクトフォルダ内直下のソースフォルダ名称を変更
  6. Xcode の左パネルのファイル名が赤色に変わるので、フォルダを選んだ状態で右パネル Identity and Type の Name を変更、更にその直下 Location にあるグレーのフォルダアイコンを押して該当するソースフォルダを選択
  7. Targets > Build Settings > Packaging > Info.plist File にあるパスを変更

覚えておくにはかなり面倒で、うる覚えで作業順序を間違えると方法も変わり試行錯誤の露頭に迷った結果、複製後のフォルダを削除してやり直しという厄介な作業になります。

日本語でググった結果上位5つくらいを確認してもっと簡単な方法があるなと思ったのは手順3のスキーム名称の変更のやり方で、左下の「+」や「-」ボタンで追加削除、右上の「Autocreate Schemes Now」ボタンを使う事なく、

表示されるスキーム名をクリックすると変更可能になるので、

名前を変えてリターンすると完了します。

もう一つは同様の手法を取る手順7で、

変更箇所の文字列をクリックすると、

簡単に変更ができます。

参考にしている Stack Overflow ページにも書いてあるのですが、検索窓に複製元のプロジェクト名を入れると外部ライブラリを使うプロジェクトの場合にも変更が容易になります。

参照

最終的に納品先の端末にはこのようにアプリ名がずらずらと並んでいく事なります。

最後に暴言を吐くと、Android と比較してク*面倒臭い事極まりないという感想になります。

Grade Sync Issues: (5 warnings) 回避

数ヶ月ぶりに Android アプリ案件をやったところ表題のようなエラーに出くわして回避したお話です。

内容はリンク先にもある通り、先方の都合で2018年末に使えなくなるから変更しろということで、 Gradle Script/build.gradle(Module:app) に記述のある “compile” 文字列を全て “implementation” に書き換えてから右上の Sync Now リンクを押します。具体的には、dependencies の中にある4箇所、compile fileTreeandroidTestCompilecompiletestCompile を implementation fileTreeandroidTestImplementation implementationtestImplementation とします。

解決前:

解決後:

参考:

Googleファミリーリンクで子供の端末を制御する

昨年、安価な子供の位置情報確認方法について書いたのですが、iOS のようなペアレンタルコントロール機能が Android には無いので、アプリを無効化しても Chrome ブラウザを使い際限なく Youtube 視聴をしてしまったり、子供の友人が勝手にロック画面からカメラを起動して街中で動画を撮影するといったような子供あるある問題が表面化してきたので対策を考えていたところ、Google が「ファミリーリンク」という制御アプリを日本向けにリリースしたので導入してみました。環境は前回同様、子供の端末に Huawei SIMフリースマートフォン P8 lite に 0 SIM を利用します。

まず現在年齢を詐称して登録していた子供の端末のアカウントのデータをバックアップしました。
$ adb backup -f backup_20180604.ab -all -nosystem -apk -obb

次にこの端末に親管理者となる自分のアカウントを追加し Google ファミリーリンクのアプリをインストールして進むのかと思いきや、別端末から管理する必要がある事が分かりました。公式の文書には「〜の端末」や「〜の Android」と言った記述がなく分かり難い事半端ありませんでした。

気を取り直して子供の端末を初期化し、自分の端末(iOS と Android 共)にも Google ファミリーリンクのアプリをインストールし、子供のアカウントを正しく再取得した後に2台並べて設定、Chrome のフィルタで youtube.com ドメインの追加、アプリ管理、位置情報、その他からフォト共有をオフにし、1日の利用上限とおやすみ時間を指定して無事完了しました。

次に上部スワイプからショートカットで Wi-Fi をオフにしてデータ通信での挙動を確認してみたのですが、先のアプリの管理で「端末管理」と「EMUI」をブロックすると「設定>データ通信量の管理」の項目が非表示になってしまう事が分かったので、一旦許可済みにして「ネットワーク通信を行うアプリ」と「1ヶ月の利用可能なデータ通信量」の設置を行いました。

そしてネットワーク通信を行うアプリを観測してみたところ、10085 というアプリが位置情報を取得する際に必要な事が判明したので「ネットワーク通信を行うアプリ>システムアプリ」でモバイルデータのチェックを入れてみたのですが、Google ファミリーリンクのアプリにある他の設定を変更する事ができませんでした。

もう一度設定画面を確認してみると、10085 前後に存在している 10008, 10012, 10014, 10017, 10026, 10029, 10031, 10032, 10045, 10050, 10058, 10064, 10070, 10074, 10080, 10081, そして 10086 という多数の怪しい名称のアプリが関係しているだろうと推測して全てにチェックを入れるとうまく動きました。

それぞれのアプリがどの設定に関連するのか調べるのは面倒だったので放置していますが、 10032 をオフにする際「モバイルデータ通信の無効化」というタイトルのダイアログを表示し「MMS メッセージの送受信」が不可能になる旨の警告をしていました。結構な数のアプリなので通信量が若干心配なのですが、幸運にも 6.0(Marshmallow)端末で対応できましたし、フィルタリングや時間制限など MacOS に近い制御が可能だという事で、iPhone SE2 が出たらどうなるか分からないところ、暫くこれで運用してみようと思います。

参考:

サポート対象外のMacでNight Shiftを使う

昨年内部ディスクを SSD に換装して快適さを取り戻した開発機で使っている iMac Mid-2011 ですが、リビング用に購入した MacBook と比較してみるとスマホでは一般的な機能になっている Night Shift の設定が欠けている事に気が付きました。調べてみると、iMac に関しては2012年型から使える機能なようで、ブルーライトで失明してしまったお婆さんの体験談を近所にお住いの方から伺った事もあって、ソフトウェア側から何かできないものかともう少し追いかけると、MacRumors のフォーラムに相当する内容が書かれていました。

参考:

インストーラがあったので簡単に済ませようとしたのが運の何とかではありませんが、再起動後の起動画面で無線キーボードとトラックパッドを認識しなくなると言う問題に直面、内容をよく読むと macOS 10.13.2 は検証中だと…。背面の電源ボタンで強制終了し、コマンド+Rキーで内蔵の macOS 復元システムを立ち上げ、クソ長いクリーンインストールと Time Machine バックアップからの復元か〜と思っていた矢先、SSD にした恩恵に与る事ができました。

気を取り直し原典に当たる事にして、日本語の説明も参考にしつつも、その手順の内容が箸折ってあったのと途中で問題があったので経過を書いておこうと思います。

まず CoreBrightness.framework のバックアップは、デスクトップ等にドラッグしたり直接副クリックからの圧縮をしてデスクトップに移動させるのでも良いのですが、パーミッションが {User}:staff に変更されてしまうため戻すことの手間や後述する手順の作業内容を考えるとゴミ箱にぶち込むと言う手もありそちらの方法を選択しました。

次にエディタアプリで CoreBrightness.framework を開く場合、このフレームワークの置いてある場所 /System/Library/PrivateFrameworks/ で書き込み権限が無いため、一旦デスクトップ等の場所に複製したものを編集しました。編集アプリには iHex を利用しました。

そして、CoreBrightness.framework の ModelMinVersionBLR と言うシンボル名のアドレスを拾います。
$ nm /S*/L*/PrivateFrameworks/CoreBrightness.framework/CoreBrightness|grep _ModelMinVersion
0000000000035000 S _ModelMinVersionBLR

更に16進数ダンプを表示して編集箇所の目星を付け、編集アプリでファイル内検索を利用し実際の編集箇所を見つけます。
$ xxd -s 0x35000 -l 28 /S*/L*/PrivateFrameworks/CoreBrightness.framework/CoreBrightness
00035000: 0900 0000 0100 0000 0d00 0000 0600 0000 ................
00035010: 0500 0000 0600 0000 0800 0000 ............

今回は iMac12,1 に対応させるべく 0d000c00 に書き換え、保存した CoreBrightness.framework を /System/Library/PrivateFrameworks/ へ戻し、$ sudo chown -R root:wheel /System/Library/PrivateFrameworks/CoreBrightness.framework と権限を元に戻しました。

これで最後と思った codesign コマンドでエラーが返ってきました。
$ sudo codesign -f -s - /S*/L*/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness
/System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness: replacing existing signature
codesign_allocate: error: unable to locate xcodebuild, please make sure the path to the Xcode folder is set correctly!
codesign_allocate: error: You can set the path to the Xcode folder using /usr/bin/xcode-select -switch
/System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness: the codesign_allocate helper tool cannot be found or used

2つ目のエラーに書いてある sudo xcode-select --switch /Applications/Xcode.app を試しても、Xcode の「環境設定>Locations>Command Line Tools」を確認するも問題がなく、結局1つ目のエラーにあるように .bash_profile ファイルへ export PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ とパスを記述し再読み込みして解決しました。

$ vi .bash_profile
$ source .bash_profile

ここまでやっておいて何なんですが、OS の更新毎に作業が発生する事や、子供が産まれてからは17時以降の作業はやらないようにしているのであまり必要がなかったのかもしれません。

参考:

Macを買ったらやるべき4つ目のこと

最近まで「一人一台の iPad(タブレット)」という理想を持っていましたが、外出先で本を読むには5インチ超えの携帯端末を所有している事や、Youtube や Amazon プライムといった映像を視聴するには大画面で AppleTV の体験の方が優れていると気が付いた事もあって、そろそろコンピュータ教育を始めても良い頃かなと思った子供の10歳の誕生日を契機にマルチアカウントで使う MacBook 2017 (1.3GHz Dual-Core Intel Core i5) をリビングに導入しました。

そこで初めて MacOS を使う子供用のアカウントを設定していたところ、過去に書いた「Macを買ったらやるべき」3項目

  1. システム環境設定>キーボード>ショートカット>キーボード>次のウィンドウを操作対象にする ショートカットキーを⌘`に変更
  2. Dock に Recent Applications のスタックを作る
  3. スクリーンキャプチャの保存先を変更する

に追記すべき事柄があったので一応記しておこうと思います。

具体的には、「システム環境設定>キーボード>ショートカット>入力ソース>前の入力ソースを選択」のショートカットキーを「⌘スペース」に変更します。米国の利用者は基本的に入力ソースを変更する必要がないのでタイプしやすい方の割当の変更は不思議ではないのですが、その真の理由は定かではありません。

加えて最新の写真アプリには iOS のスクリーンショット画像を集めるアルバムが自動的に作られている事から、フォルダアクションを使って MacOS で撮影したスクリーンショットも写真アプリへ追加できるようにすると良い気もしています。

当初、Mac mini を HDMI 接続でテレビに出力する方法も模索していたのですが、現状を考えると手が出ませんでした。

http://hkitago.tumblr.com/post/172549008795

最後に、安価な MacBook Air 発売の噂を横目にしつつも、数日触った感じとしては完成度が高く全く不満がありません。

SSD よりも高速なストレージや Intel CPU 脱却話も気になりますが、ハード性能向上は今後どうなることやら。

参考

通知センターの計算機の問題

確定申告の時期ということもあって High Sierra の通知センターにある計算機ウィジェットを使っていたところ、2本指スワイプのジェスチャーで呼び出す度に表示が一定値に固定されるという問題に悩まされました。

調べると幾つか類似の報告がある中で MacRumors のフォーラムに解決方法がありました。

http://hkitago.tumblr.com/post/171078016921

フォーラム内にもこの plist ファイルの中身を覗いてみた人がいらしたので、一応確認しました。

ファイル情報を確認すると High Sierra へ更新する前のもので、察するに前仕様で使っていたファイルが残っていて呼び出す毎に読み込んでいたのだろうかと思います。

報告を見ていると色んな数字にリセットされるようなのですが、面白かったのは MacRumors のフォーラムの2ページ目に同じ “375” になった方がいらしたことです。表示数をファイルに保存して起動毎に読み込んでいたと想像した前仕様にしては奇遇過ぎるので実際にどんな数字を保存していたのかとても気になるところです。

参考:

大文字/小文字を区別「する」から「しない」HDDへの移行方法

直前の投稿でさらっと作業内容の詳細を述べずに進んでしまった次の部分について追記します。

解決方法は「大文字/小文字を区別しない」ディスク形式にするより他無いらしく、一旦別の「大文字/小文字を区別しない」ディスクを用意してデータを往復させることにしました

情報源: photoslibraryを置くディスク形式 – hkitago software development

写真アプリのライブラリを「大文字/小文字を区別する」から「大文字/小文字を区別しない」ディスクへコピーしようとすると当然次のようなエラーを返してきます。

“写真 Library.photoslibrary”はコピーできません。コピー先ボリューム上に同じ名前の別の項目が存在しており、コピー先ボリュームはファイル名の大文字/小文字を区別しません。

そこでまず思いついたのが、TimeMachine バックアップが登場する以前に利用していた rsync コマンドでした。

http://hkitago.tumblr.com/post/169802245421

単に自分で配置したファイル群であればこのやり方で問題が無いのですが、iTunes や写真アプリのライブラリは別途データベースでファイルを管理していて整合性が取れなくなってしまう懸念があって却下しました。

次に考えたのが、ライブラリをコピーする前に実際にどのファイル名が大文字小文字違いで重複しているのかを調べて、iTunes や写真アプリ内からファイル名を変更すればデータベースもそれに応じて変更されるだろうというもので、次のコマンドを利用しました。

http://hkitago.tumblr.com/post/169756177861

iTunes ライブラリではアーティスト名やテレビドラマ名の先頭が大文字のものと小文字のものが混在していたので、アプリ内からそれぞれ変更して対応することができました。

ところが写真アプリでは、編集した写真のファイル名の拡張子を小文字にしてデータを複製するという古い iPhoto 時代の仕様が悪さをしていたようで、アプリ内からのファイル名変更ができず10枚ほどしかなかったこともあってこれらのファイルをファインダー上で順に削除しました。

そして TimeMachine の「今すぐバックアップを作成」を実行し、「大文字/小文字を区別しない」ディスク形式へフォーマット後にデータを3日ほど掛けて戻しました。

photoslibraryを置くディスク形式

Bluetooth の仕様が変更になった影響でポケゴープラスが使えなくなった問題が解決したのでようやく iPhone を iOS11 に更新し年末年始に撮り溜めていたカメラのデータを High Sierra の写真アプリに取り込もうとしたらこのようなエラーを表示しました。

この “jpegvideocomplement” を検索語に調べてみると、写真アプリのデータである photoslibrary が格納されているディスク形式が「大文字/小文字を区別」している場合に起きるということが分かりました。

http://hkitago.tumblr.com/post/169719340056


また原因を同じとして起きる問題に Live Photos (ライブフォト) を読み込めなくなることがあるようで、実際に High Sierra に更新する9月末以降のライブフォトがライブラリにありませんでした。

解決方法は「大文字/小文字を区別しない」ディスク形式にするより他無いらしく、一旦別の「大文字/小文字を区別しない」ディスクを用意してデータを往復させることにしましたが、同じディスクに置いていた iTunes ライブラリなど含めて 2.5TB ほどあるので時間が掛かって仕方ありません。

また関連して、少し前に画面撮影のデータが読み込めない問題があったのですが、


ファイル名に時間を付けないことで回避したように思えて、上述したディスク形式の問題で結局読み込めないという羽目になっています。

今回の教訓として iOS11 と High Sierra へ移行するにはディスク形式に注意すべきでしたが、単に APFS の内蔵ディスクを使う一般的な環境下であれば特に気にする必要がありません。

http://hkitago.tumblr.com/post/169719429926

ただ APFS は SSD に最適化した形式なので、外付け HDD は Mac OS 拡張 (HFS+) のままで十分かと思います。今後写真データは増えて行く一方だと予想できるので、一時的な作業場所として APFS の内蔵 SSD と保管用の HFS+ の HDD とライブラリのデータを分けて管理する必要があるのかなと感じると同時に、写真アプリは起動時にオプションキーを押すことでライブラリの切り替えが容易になっていますが、アプリ内でデータを別のライブラリに移動するような機能があると便利な気がしました。

参考: