Gururi.log

id:Gururiの記録です。

2017買った物

MacBook Pro (15-inch, 2016)

TouchBar付きの奴。初売りには行きましたが、対象になる商品では無かったので1日置いて翌日に普通の買い物*1として買ってきました。なお、前のMacBook Pro(2013)はその後Windows10 ProをインストールされてWindowsマシンになりました。正直無印で良かったんじゃ無いかと思っている。

Windows10 Pro

上述のMacBook Pro(2013)にインストールするために購入。Windows10ってディスクイメージが自由にダウンロード出来るのね。で、インストール中に(持ってれば)コードを入れると正規のWindows10になるという事だったので、事前に用意しておきました。なお、macOSは消してしまってWindowsのみインストールされている状態です。今更BootCampじゃないですしね。
なおバックアップは紆余曲折を経てTranscendのJetDrive Lite 360(64GB)にしています。まあ全部バックアップするわけじゃないですし。

Nintendo Switch

イオン幸町にふらっと行ったら残り2台、というのに遭遇したので保護。当初はゼルダばっかりでしたが、今はすっかりイカになってます。


このスクショではSSAになってますが、昨晩時点ではSAAです。ガチアサリについて行けるか、今からちょっと心配です(;´Д`)

*1:AppleStoreの初売りは1日だけである。

2016買った物

iPhone7を購入(iPhone6からの買い換え)

iPhone7でついにFelica搭載ということで、乗り換えました。今まで3G→4→5→6と来て、S付きのiPhoneは買ったことが無かったんですが、今回もやはりS無しのを買ってしまいました。きっと7Sが出た時も悔しい思いをするのでしょう。

Apple Watch Series2を購入(新規)

MacBook Proのロック解除が出来るというので(それだけじゃないが)、Apple Watch Series2を購入。最初ロック解除出来なかったけど、2ステップ認証と2ファクタ認証が違う物だと認識できたので無事解決した。




なおAppleストアのお姉さんにもお知らせしてきました(無事に出来るようになったかどうかは確認していない)。

Office365Soloを購入(新規)

長男の分は昨年春にMacBook Pro(13)を購入した時に一緒に購入し、この春に1回更新しているけどこれは自分用。
次男の夏休みも終わろうかという時期に嫁さんが入院しまして、嫁さんの職場で色々やらせてもらってた次男の自由研究、レポート作成もMac借りてやるつもりだったらしいんだけど、それも借りられない……という状態。Macは自宅に余ってるmac mini2010(ただしSSDに換装してるのでそこそこ速い)があるけど、問題はOffice。我が家で使ってたOffice2011は3ライセンス版で、俺・嫁・自宅のmac mini(2012)に入ってる。ということで俺のからアンインストールしてmac mini2010にインストール、俺のは365Soloに、とした次第。まあ大体Excelしか使ってない気もするんだけど……あ、OneDriveは使ってるな。同窓会の写真とか。

2017年初売り

仙台の正月と言えば初売りですが、来年はAppleストアに行ってみようかと思います。福袋は買えないと思うけどね。

iPhoneのバックアップパスワードを忘れたら大変という話

帰宅したら長男が頭を抱えていた

珍しく*1mac miniの前に座って何やら頭を抱えている。聞けばiPhone5Sのバックアップを暗号化するためのパスワードが思い出せなくて難儀している模様。

色々試してみたが駄目で解除ソフトを買いそうになったけどやめた。

iOS:暗号化されたバックアップのトラブルシューティング - Apple サポート
を見ると、「とりあえず色々試してみろ!」と書いてある∩( 'ヮ' 三 'ヮ' )∩
このパスワード、忘れるとiPhoneを初期化するしかなくなるというなかなか恐ろしい話で、俺も心あたりを色々入れてみるが、どれも駄目であった。とりあえず飯を食う。
パスワードで保護されたBlackBerryとiPhoneとiPodとiPadバックアップへのアクセスをゲット!
なんてのも見つけたけど、9,995円は流石に即決出来ない。

そして解決へ

そのうち長男が「たぶん暗号化したのは交換したとき」と言い出した。そういやロックボタンが馬鹿になって昨年末に交換したな。で、俺のMBPに息子のアカウントを作って*2、そこにiPhoneのバックアップを取った様な……でも春に自分のMBPを買ったときに「もう要らないよね?」ってアカウント消しちゃったよーな。駄目元でTime Machineを遡ってみると……あったわ∩( 'ヮ' 三 'ヮ' )∩
以下復元手順。

長男のアカウント(のフォルダ)を復元

~/Library/Application Support/MobileSync/Backup/の中のフォルダ名を確認

~/Library/Keychains/login.keychainを俺のフォルダにコピー

Keychain Accessで開く

さっきのフォルダ名を息子のキーチェーン内で検索

発見!

ログインパスワードでロック解除*3

パスワードは gururi*4

おい( ´∀`)σ)∀`)

まあ無事に判って良かったねというのとやっぱりTime Machineすげえってことで。いやあ、助かったわ。

*1:春から大学生になったのでMacBook Proを与えてある。

*2:昨年末のお話なので、当然彼のMacBook Proはまだない。

*3:何度か間違っていたみたいだけど最終的には無事解除出来た。

*4:犯人はヤス 的な。

ブロードバンドルータ

さらばBBR-4HG

自宅サーバを稼働している関係上、NATループバックが必要と固く信じているので、BBR-4HGをずっと使用し続けていた。フレッツの契約が200Mbpsになってもこいつを使い続けていたので、こいつのせいで最大100Mbpsのままであった。ヤマハのルータだとNATループバックが普通に使えるという話もあるのだが、いかんせんヤマハのは高くて手が出ない。そこへようやく現れたのが同じバッファローのWZR-1750DHP2である。ファームウェアアップデートの履歴を見るとVer.2.20で「NAT-Loopback機能に対応しました。」とさらっと書いてある。だからそういう重要な機能はもっと宣伝しようよ……。そんなわけで買って来ました。ケーズデンキで16,800円だったんだけど交渉の結果13,500円になりました。ありがとう店員さん*1

BUFFALO 有線BBルータ ハイエンドセキュリティモデル [BBR-4HG]

BUFFALO 有線BBルータ ハイエンドセキュリティモデル [BBR-4HG]

こんにちはWZR-1750DHP2

なお、こいつの無線LAN機能には全くもって興味が無いため、速攻で無線LANに関する機能は全てオフにされた。完全に有線ルータ扱いである。まあ用があるのはギガビットイーサネットとNATループバックだけだからな。購入時のファームウェアバージョンは2.20。ちょうどNATループバックに対応したバージョンであった。しかも家の中の機器で有線接続しているのは最早1階和室においてあるmac mini(サーバ)、AirMac Extreme、NAS、テレビ&レコーダだけなので、1階2部屋・2階3部屋からの有線接続を無理にルータに突っ込む必要も無いため、4ポートで十分。
BBR-4HGから接続IDとパスワード、DHCPの割り当て一覧、接続先経路の一覧、アドレス変換の一覧などなどをコピーして新ルータに設定。キーチェーンに控えていた接続IDが古いものだったり、DHCPの割り当てを上手く編集できなかったりしたが、特に問題無く設定は完了。問題は設置だな。入れていたマルチメディアボックスに物理的に入らん。幅が大きいのでBBR-4HGがあった場所には入らないし、ひかり電話ルータの上に重ねると蓋が閉まらん。どうしたものか。とりあえずひかり電話ルータにネジで仮留め*2したので落ちはしないと思うが。そのうちボックス内部の整理もしないといかんな。あるいはボックスのリプレースか。

そしてNATループバック

自分のサーバに設置しているIPアドレス表示CGIにアクセスしてみると、ルータのLAN側IPアドレスが表示された。BBR-4HGではWAN側IPアドレスが表示されてたから、本当に外からアクセスしている形だったが、そうではなくあくまでアドレス変換ルールに従ってLAN側に転送してるだけみたいだな。まあ問題無いけど。なお、BBR-4HGでは「デフォルトに設定した接続先で取得したIPアドレス」にしか外部から接続出来なかったが、WZR-1750DHP2ではどのIPアドレスでも接続の待ち受けが可能になった*3。以前は固定IPアドレスの設定をデフォルトに、動的IPアドレスの設定を2番目に設定し、外に接続するときは接続先経路の設定で動的IPアドレスを使って外に出る*4ようにしていた*5。この仕様だと、デフォルトを動的IPアドレスにしておいて、「固定IPアドレスでアクセスしたいドメイン/IPアドレスだけに経路を設定」すればいいので非常に楽で良い。
設定インターフェースは今風だが、そこかしこにBBR-4HGの臭いがプンプンします。BBR-4HGをNATループバックの為だけに使い続けていた俺みたいな人が買い換えるには良いと思います。

*1:と言いつつ貼るのはAmazonへのリンクである。

*2:NTTからすれば何しやがる、という所業だがそこ以外に留める場所が無いのだ。

*3:PPPoEマルチセッションのどのIPアドレスを使ってもサーバを立てられるということ。あんまり意味無いけど。

*4:192.168.x.0/24からの接続は動的IPアドレスを使うように設定。WZR-1750DHP2ではこの設定が出来ない。問題無いけど。

*5:固定IPアドレスで外にアクセスしたくないから。

Mavericksで定期的に実行されるスクリプトの設定を修正

毎日/毎週/毎月定期的に実行されるスクリプト

職場のサーバがめでたく*1全てMavericks Server搭載のmac mini Serverに更新されたのだが、
Mavericksになって設定が変わったようで、変なタイミングで実行されるようになってしまった。それを修正したのでメモ。

どう変わったか?

今回問題にしているのは、/etc/periodic/{daily|weekly|monthly}/に置かれたスクリプトを定期的に実行する設定。これは過去の(Mac)OS Xでも同じ*2なのだが、設定が異なっている。
Mountain Lionまでは

daily 毎日3:15
weekly 毎週土曜日3:15
monthly 毎月1日5:30

だったのが、Mavericksでは

daily 86,400秒*3ごとに1回
weekly 604,800秒*4ごとに1回
monthly 2629746秒ごと*5に1回

となってしまった。何時に起動する、という指定ではなくなっている。指定されているのは実行間隔で、このためにあらぬ時刻に実行されていた。職場のサーバではログローテートやプロキシサーバの集計を行っているのでこれはまずい。

どう直したか

Mountain Lion以前と同じ設定に直せればいいや、ということで、それを目標とした。

設定の確認

とにもかくにも、今と以前の設定を確認するところからスタート。設定ファイルは、MavericksでもMountain Lionでも、 /System/Library/LaunchDaemons/com.apple.periodic-{dai|week|month}ly.plist であるので、これの中身を確認する。sudo -sでrootになり、defaultsコマンドで確認してみる。例示はdailyのものである。

実行するコマンド
defaults read /System/Library/LaunchDaemons/com.apple.periodic-daily

Mountain Lionまでの設定は

{
AbandonProcessGroup = 1;
Label = "com.apple.periodic-daily";
LowPriorityIO = 1;
Nice = 1;
ProgramArguments = (
"/usr/sbin/periodic",
daily
);
StartCalendarInterval = {
Hour = 3;
Minute = 15;
};
}

であるが、Mavericksでは

{
AbandonProcessGroup = 1;
Label = "com.apple.periodic-daily";
LaunchEvents = {
"com.apple.xpc.activity" = {
"com.apple.periodic-daily" = {
AllowBattery = 0;
GracePeriod = 14400;
Interval = 86400;
Priority = Maintenance;
Repeating = 1;
};
};
};

LowPriorityIO = 1;
Nice = 1;
ProgramArguments = (
"/usr/libexec/periodic-wrapper",
daily
);
}

となっている。StartCalendarIntervalがなくなり、LaunchEventsに置き換わっている。また、ProgramArgumentsが/usr/sbin/periodic dailyから/usr/libexec/periodic-wrapper dailyに変更されている。manを見るとわかるが、periodic-wrapperを直接実行することは出来ない*6。じゃあこれはなんなんだ?となるが、/usr/sbin/periodicは健在で、こちらに適切な引数を与えて実行すれば良いので、取り敢えず深く考えないことにする。

設定の変更

基本的には以前と同じにすれば良いので、実行すべきコマンドを適切に変更した上で、スケジュールをLaunchEventsではなくStartCalendarIntervalで指定すれば良い。オリジナルの設定ファイルは、拡張子をplis_として別名保存し、設定を変更してみた。以下は変更の為のコマンドである。launchctlで一度unloadして、ファイルをコピーし、設定を書き換えたのち、再びlaunchctlでloadする。
赤字で書いた部分を変更すれば、任意の日付・時刻に実行させることができる。

periodic-dailyの変更
launchctl unload -w /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
cp /System/Library/LaunchDaemons/com.apple.periodic-daily.plist /System/Library/LaunchDaemons/com.apple.periodic-daily.plis_
defaults delete /System/Library/LaunchDaemons/com.apple.periodic-daily LaunchEvents
defaults write /System/Library/LaunchDaemons/com.apple.periodic-daily StartCalendarInterval -dict Hour -int 3 Minute -int 15
defaults write /System/Library/LaunchDaemons/com.apple.periodic-daily ProgramArguments -array /usr/sbin/periodic daily
launchctl load -w /System/Library/LaunchDaemons/com.apple.periodic-daily.plist

periodic-weeklyの変更
launchctl unload -w /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist
cp /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist /System/Library/LaunchDaemons/com.apple.periodic-weekly.plis_
defaults delete /System/Library/LaunchDaemons/com.apple.periodic-weekly LaunchEvents
defaults write /System/Library/LaunchDaemons/com.apple.periodic-weekly StartCalendarInterval -dict Hour -int 3 Minute -int 15 Weekday -int 6
defaults write /System/Library/LaunchDaemons/com.apple.periodic-weekly ProgramArguments -array /usr/sbin/periodic weekly
launchctl load -w /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist

periodic-monthlyの変更
launchctl unload -w /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
cp /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist /System/Library/LaunchDaemons/com.apple.periodic-monthly.plis_
defaults delete /System/Library/LaunchDaemons/com.apple.periodic-monthly LaunchEvents
defaults write /System/Library/LaunchDaemons/com.apple.periodic-monthly StartCalendarInterval -dict Day -int 1 Hour -int 5 Minute -int 30
defaults write /System/Library/LaunchDaemons/com.apple.periodic-monthly ProgramArguments -array /usr/sbin/periodic monthly
launchctl load -w /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist

書き換わったかどうか確認してみよう。

for i in dai week month
do
defaults read /System/Library/LaunchDaemons/com.apple.periodic-${i}ly|less
done

もっと詳細に指定したい場合はlaunchdの時刻指定を複数時刻にしたい - 別館 子子子子子子(ねこのここねこ)を参照のこと。

*1:ファイルサーバについては実はあまりめでたくなかったが、今回は関係無い。

*2:/etc/{dai|week|month}ly.localがあると続けてそれを実行するのも同じ。

*3:1日

*4:7日

*5:約30.4日

*6:実行してみても、実行されて欲しいスクリプトが実行されない。

自作FusionDrive

きっかけ

ひょんなことからMac mini Server版(Mid 2011・SSD256GB+HDD750GB)を入手したので、せっかくだからFusionDriveにしてみたもの。

やりかた

SecondSolution Mac mini(Late2012)自作Fusion Drive化を参考にした。ただし、4番の

diskutil coreStorage createVolume DC59AAB8-180C-4008-978D-13B184A73C09 jhts+ "Macintosh HD" 100%

diskutil coreStorage createVolume DC59AAB8-180C-4008-978D-13B184A73C09 jhfs+ "Macintosh HD" 100%

が正しい。
普段からTerminal使ってる人にとっては、「壊してしまうかもしれないという気持ちに打ち勝てる勇気を持てるか」よりも、こういう間違いの方が怖いと思う(まあ間違ってたら先に進めないだけだったけど)。

結果

Xbenchで測ってみた。常用しているMacBook Air 13(Mid 2011)特盛りが333.93、今回のFusion Driveが281.08とちょっと遅い。 HDDの分なんだろうか?

MacBook Air
Disk Test 333.93
Sequential 205.90
Uncached Write 388.40 238.47 MB/sec [4K blocks]
Uncached Write 350.74 198.45 MB/sec [256K blocks]
Uncached Read 86.38 25.28 MB/sec [4K blocks]
Uncached Read 412.39 207.27 MB/sec [256K blocks]
Random 883.05
Uncached Write 815.36 86.32 MB/sec [4K blocks]
Uncached Write 639.05 204.58 MB/sec [256K blocks]
Uncached Read 1556.55 11.03 MB/sec [4K blocks]
Uncached Read 912.36 169.29 MB/sec [256K blocks]

FusionDrive
Disk Test 281.08
Sequential 181.12
Uncached Write 291.83 179.18 MB/sec [4K blocks]
Uncached Write 260.85 147.59 MB/sec [256K blocks]
Uncached Read 82.93 24.27 MB/sec [4K blocks]
Uncached Read 361.64 181.76 MB/sec [256K blocks]
Random 627.18
Uncached Write 451.96 47.84 MB/sec [4K blocks]
Uncached Write 572.75 183.36 MB/sec [256K blocks]
Uncached Read 1587.11 11.25 MB/sec [4K blocks]
Uncached Read 558.94 103.71 MB/sec [256K blocks]

うーむ……。

iPhoneのBluetoothテザリングで自動接続

きっかけ

ひとりぶろぐ » MacBookに3G/LTE通信機能が搭載されたらいいのにな。そんな願いにアプローチするLidSyncPAN
iPhone5のテザリングは便利である。俺も常時Lightningケーブルを2本、ポケットに持ち歩いているが、やはりiPhoneを取り出し、ケーブルを繋ぎ、iPhoneが落っこちない場所を確保して、と結構面倒くさい。そんな中、上記の記事が流れて来た。確かはてブのホットエントリーだった気がするが、まあどうでもいい。俺的な問題点は

  • 蓋の開け閉めだけかぁ……
  • EasySIMBLが必要?あんまり入れたくないなあ……

この2点。よろしい、ならば自分で書くしかあるまい。

仕様

  • 基本的にAppleScriptで制御すること。
  • 特殊なユーティリティの使用禁止。Mavericksの基本機能だけで使えること。
  • より優先される他のネットワーク接続(たとえばWiFiによる接続)が検出されたらテザリング切断。
  • より優先される他のネットワーク接続が無くなったらテザリング開始

スクリプト

普通にポインタを操作して接続・接続解除を行う場合、

  1. メニューバーのBluetoothアイコンをクリック
  2. 接続したいiPhoneの名前をクリック
  3. 「ネットワークへ接続」または「ネットワークから接続解除」をクリック

という流れになる。てことはSystem Eventsだな。大前提として、メニューバーにはBluetoothが表示されているものとするのでその辺のエラー処理は省略。

まずは接続・接続解除のためのAppleScript

このスクリプトはコンパイルして適当な場所(~/Documents/AppleScript/TetheringController.scptとか)に放り込んでおく。

property iPhone : "Gururi's iPhone" --実際にメニューに表示される自分のiPhoneの名前を入れておくこと

on tethering(flag)
	if (flag) then
		set {select_menu, notifymessage, notifytitle} to {"ネットワークへ接続", "Bluetoothテザリングを開始しました", "テザリングを開始しました。"}
	else
		set {select_menu, notifymessage, notifytitle} to {"ネットワークから接続解除", "別の接続を認識したのでテザリングを停止しました", "テザリングを停止しました。"}
	end if
	tell application "System Events"
		tell application process "SystemUIServer"
			try
				tell menu bar 1
					set bt to item 1 of (menu bar items whose description is "bluetooth")
				end tell
				tell bt
					click it
					click menu item iPhone of menu 1
					click menu item select_menu of menu 1 of menu item iPhone of menu 1
				end tell
				display notification (notifymessage) with title notifytitle
			on error errMsg number errNum
				click bt
			end try
		end tell
	end tell
	return flag
end tethering

on tetheringon()
	return my tethering(true)
end tetheringon

on tetheringoff()
	return my tethering(false)
end tetheringoff
次に用意するのはシェルスクリプト

色々悩んだんだけど、networksetupの-getinfoサブコマンドでIP addressを取得できるかどうかで、そのnetworkserviceが接続されているかどうかを判断することにしてみた。とりあえず俺の環境ではメインがWi-FiでテザリングがBluetooth PANなのでこんな感じになってますが、必要に応じて該当する部分を変更・追加すれば使えるんじゃないかなー、と思います。サービス名とか、if文とか。

#!/bin/zsh
while [ 0 ]
do
PAN=`networksetup -getinfo "Bluetooth PAN" |grep '^IP address:' |wc -l`
WIFI=`networksetup -getinfo Wi-Fi |grep '^IP address:' |wc -l`
#-getinfoのあとの"Bluetooth PAN"やWi-Fiは、「ネットワーク」システム環境設定でのサービス名。
#サービス名が空白を含む場合は""で全体を囲むか、空白をエスケープすること。
if [ $WIFI -eq 0 ];then
	#$WIFIが0→Wi-FiでIPアドレス無し
	if [ $PAN -eq 0 ];then
		#$PANが0→Bluetooth PANにIPアドレス無し
		osascript -e 'tetheringon() of (load script alias (((home directory of (system info)) as string) & "Documents:AppleScript:TetheringController.scpt"))'
		#~/Documents/AppleScript/TetheringController.scptを読み込んでtetheringon()を実行
	fi
else
	#$WIFIが0でない→Wi-FiでIPアドレスあり
	if [ $PAN -eq 1 ];then
		#$PANが0でない→Bluetooth PANにIPアドレスあり
		osascript -e 'tetheringoff() of (load script alias (((home directory of (system info)) as string) & "Documents:AppleScript:TetheringController.scpt"))'
		#Wi-Fiの接続を使用するのでPANの接続は切る。
		#~/Documents/AppleScript/TetheringController.scptを読み込んでtetheringoff()を実行
	fi
fi
sleep 10
#次のループに行く前に10秒待ちます。この時間はお好みで。
done

こいつは/usr/local/bin/TetheringControllerにインストールして、

% sudo chown root:staff /usr/local/bin/TetheringController
% sudo chmod 755 /usr/local/bin/TetheringController

しておきます。

ほいでもってlaunchd用のplistファイル

TetheringControllerを呼び出して起動してくれるようにするための設定ファイルです。今回は自分だけで使うので、保存場所は~/Library/LaunchDaemons/com.gururi.tetheringcontroller.plistです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<true/>
	<key>Label</key>
	<string>com.gururi.tetheringcontroller</string>
	<key>OnDemand</key>
	<false/>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/bin/TetheringController</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>
監視のオンオフAppleScript

次で最後。こいつは~/Library/Scripts/に放り込んでおいて、スクリプトメニューバーに表示し、実行する度に監視の開始・停止を相互に切り替える。ファイル名、俺は「トグルテザリング監視」にしてる。まあファイル名は自分が分かればいいのでお好きにどうぞ。

on run
	do shell script "launchctl list|grep tetheringcontroller|wc -l"
	if (result as integer) = 0 then
		do shell script "launchctl load -w ~/Library/LaunchDaemons/com.gururi.tetheringcontroller.plist"
		display notification "テザリングの監視を開始しました" with title "テザリング監視開始"
	else
		do shell script "launchctl unload -w ~/Library/LaunchDaemons/com.gururi.tetheringcontroller.plist"
		display notification "テザリングの監視を停止しました" with title "テザリング監視停止"
	end if
end run

以上を適切な場所にインストールした上で、監視のAppleScriptを実行すればよろし。一度監視を開始すれば、ログアウト/再起動後も監視は継続されます。

インストーラパッケージ

基本的に俺が使うために作った物を「使う物好きもいるかもなー」的な考えで公開しているだけなので、そんなものは無い(・ω・)

追記

LidSyncPANと同様、初回起動時に「システム環境設定>セキュリティとプライバシー>プライバシー>アクセシビリティ」からTetheringControllerに対して制御の許可を与えてやる必要があります。