Timemachine over SMB
やりたいこと
それまではTimemachine のバックアップ先はiMac に直接つないでいた外付けHDD を使っていたのですが、MacBook Pro に乗り換えたので、外付けHDD をファイルサーバーにつないでSamba 経由でTimemachine のバックアップ先とする。
環境
ファイルサーバー
Mac
- OS: OS X 10.14(Mojave)
- 端末: MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
SMB 側でやること
smb.conf に以下を追記
[global] 〜中略 # for timemachine vfs objects = catia fruit streams_xattr fruit:metadata = stream fruit:encoding = native fruit:veto_appledouble = no 〜中略 [Timemachine] # 共有フォルダ指定 ※path は適宜変更 path = /mnt/usbdisk2/timemachine guest ok = yes guest only = no writable = yes fruit:time machine = yes fruit:time machine max size = 1T
samba を再起動
sudo smbd restart
Mac 側でやること
上述のディレクトリをマウントし、ターミナルから以下のコマンドを実行
sudo defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1 sudo tmutil setdestination smb://guest:guest@{ファイルサーバーのIPアドレス or ホスト名}/マウントディレクトリ名
初回はかなり時間がかかります。
Raspberry Pi 3 Model B で赤外線リモコン学習&操作
やりたいこと
- 家にある赤外線リモコンの信号を学習する
- 学習したリモコンの信号を発信して機器を操作する
参考ページ
Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
購入した部品
上述のページを参考に
- 赤外線受信モジュール:OSRB38C9AA
- 赤外線LED:OSI5LA5113A グレー
- 1/4W 1kΩ カーボン抵抗
- 1/4W 47Ω カーボン抵抗
- NPN トランジスタ:2SC1815-BL
- ブレッドボード:EIC-15010
- ジャンパーワイヤー:BBJ-20
環境
項目 | 内容 | 備考 |
---|---|---|
OS | Raspbian Stretch | つまりDebian 9 |
赤外線送受信のハンドリング | LIRC 0.9.4c | Stretch でapt-get install するとこのバージョン |
LIRC セットアップ
ファームウェアのアップデート
$ sudo rpi-update $ sudo reboot
インストール
$ sudo apt-get -y install lirc $ sudo rpi-update
設定ファイル lirc_option.conf を編集します。 ドライバとデバイスの指定及び後でPython からソケットに直接コマンドを送信したいのでlisten も。
$ sudoedit /etc/lirc/lirc_option.conf 〜略〜 driver = default device = /dev/lirc0 〜略〜 listen = 127.0.0.1:8765
/boot/config.txt にGPIO の入出力ピンを指定します。今回は17番を出力に、18番を入力にしました。 dtparam=invert=on はトランジスタ経由なので正論理となるため不要です。
$ sudoedit /boot/config.txt dtoverlay=lirc-rpi dtparam=gpio_out_pin=17 dtparam=gpio_in_pin=18 dtparam=gpio_in_pull=up
Raspberry Pi のGPIO ピンは公式ドキュメントを参考のこと。 www.raspberrypi.org
ここで一度リブートします。
$ sudo reboot
/dev/lirc0 が存在するか確認します。
$ ls -l /dev/lirc* crw-rw---- 1 root video 244, 0 11月 12 12:53 /dev/lirc0
lsmodで lircの存在を確認します。
$ lsmod | grep lirc lirc_rpi 9032 0 lirc_dev 10583 1 lirc_rpi rc_core 24377 1 lirc_dev
赤外線受信のチェック
LIRC をインストールすると同梱されているコマンド mode2 で赤外線受信モジュールがリモコンの信号を読み取れるか確認します。
まず、lircd デーモンを停止(STRETCH 以降のやり方)
$ sudo systemctl stop lircd
以下のコマンド実行後に赤外線受信モジュールにリモコンを向けてボタンを押し、受信できればOKです。
$ sudo mode2 -d /dev/lirc0 Using driver default on device /dev/lirc0 Trying device: /dev/lirc0 Using device: /dev/lirc0 この後、リモコンを赤外線受信モジュールに向けて何かボタンを押す。 正しく動いていれば↓のようなパルスが表示される。 space 14384396 pulse 2356 space 627 pulse 1161 space 617 pulse 574
リモコンの信号を保存する
同じくLIRC のirrecord でリモコンの信号をLIRC でハンドリングできるファイルに保存できます。
$ irrecord -n -d /dev/lirc0
手順は割愛。家の照明用リモコンはmode2 で受信した生データを加工しないと無理でした。
出力されたファイルを/etc/lirc/lircd.conf.d 以下にコピーします。左記のディレクトリに予め保存されているdevinput.lircd.conf はリネームするか消しておきます。
信号を送信する
lircd をリスタートしておきます。※これをやらなくても、後述のirsend を実行すると自動的にデーモンが起動しました。
$ sudo systemctl start lircd
登録したリモコンの定義内容を確認します。
リモコン一覧の表示 $ irsend LIST "" "" tv_sony light_livingroom
リモコンのボタン一覧を表示
% irsend LIST light_livingroom "" 0000000000000001 power 0000000000000002 change 0000000000000003 fan_3 0000000000000004 fan_2 0000000000000005 fan_1 0000000000000006 fan_up 0000000000000007 fan_down 0000000000000008 fan_off
リモコン送信
$ irsend SEND_ONCE light_livingroom power
補足:irrecord で作成した定義ファイルではうまくいかないとき
自宅の照明はirrecord で作成したファイルではうまく動かなかったので、mode2 の信号を利用しました。 (SONY のテレビリモコンは問題なし。規格の問題かと。)
手順はざっくりと次のようになります。
mode2 で信号をファイルに書き出す。
mode2 -d /dev/lirc0 | tee light.txt
light.txt に対して、以下のスクリプトでデータを加工し、
import argparse import re parser = argparse.ArgumentParser(description='Parse output of mode2 command') parser.add_argument('-i', '--input', required=True, help='input file of mode2 output') parser.add_argument('-o', '--output', required=True, help='output file parsed') args = parser.parse_args() inFile = open(args.input) lines = inFile.readlines() inFile.close outFile = open(args.output, 'w') pattern = r"pulse|space" isFirstLine = False outList = [] for l in lines: l = l.strip() matchRes = re.match(pattern, l) if matchRes is None: continue if not isFirstLine: isFirstLine = True continue data = l.split(' ') outList.append(data[-1]) if len(outList) > 17: outFile.write(" ".join(outList) + "\n") outList = [] outFile.write(" ".join(outList) + "\n") outFile.close
/etc/lirc/lircd.conf.d/ 以下に配置するファイルのボタン名以下の信号データ部分にペタッと貼り付けて以下のようにしました。
begin remote name light_livingroom bits 25 flags RAW_CODES eps 30 aeps 100 header 1228 398 one 0 0 zero 0 0 gap 28133 toggle_bit_mask 0x0 frequency 38000 begin raw_codes name power 1209 447 374 1252 368 1220 1211 451 1171 454 1173 450 375 1238 375 1249 375 1246 376 1257 1173 443 376 1248 373 8246 1216 443 376 1246 375 1255 1177 442 1178 450 1180 441 372 1248 375 1220 412 1238 377 1248 1181 453 364 1247 382 8243 1187 470 373 1250 373 1247 1181 445 1191 433 1181 442 375 1225 397 1248 375 1248 375 1248 1179 449 370 1248 377 8241 1224 437 347 1275 349 1250 1206 443 1182 412 1211 443 374 1248 377 1245 378 1219 406 1210 1216 450 374 1207 410 8242 1189 436 380 1242 381 1239 1259 369 1188 437 1184 439 381 1241 382 1239 465 1158 391 1237 1187 434 381 1242 381 8266 1241 386 380 1242 430 1196 1219 407 1209 441 1183 441 376 1214 408 1214 408 1215 409 1247 1186 437 374 1249 376 name change 1182 438 380 1242 381 1243 1186 440 1184 436 1189 437 379 1243 1189 435 381 1243 381 1246 375 1242 379 1242 385 8271 1189 436 382 1242 434 1189 1249 376 1186 437 1188 441 375 1242 1188 438 431 1191 381 1242 380 1245 379 1241 382 8279 1183 437 379 1242 382 1243 1191 435 1185 436 1188 440 384 1236 1187 437 380 1240 383 1242 383 1240 382 1240 381 8274 1191 436 380 1241 381 1242 1188 437 1188 436 1193 432 380 1242 1188 437 380 1243 388 1231 385 1242 380 1240 381 8274 1189 438 380 1242 387 1236 1187 437 1193 431 1189 435 382 1241 1188 437 380 1242 381 1242 381 1241 382 1242 381 8266 1192 436 379 1244 447 1174 1189 439 1187 437 1189 436 377 1241 1190 433 383 1242 381 1247 374 1244 437 1182 389 8262 1189 436 381 1248 376 1240 1190 436 1186 441 1187 436 379 1242 1245 379 381 1239 383 1242 381 1243 380 1248 376 〜略〜 end raw_codes end remote
Raspberry Pi 3 Model B セットアップ
Raspberry Pi 3 を買って、セットアップするまでのメモです。やったことは以下です。
デバイスは Raspberry Pi 3 Model B - Raspberry Pi です。
セットアップは自宅のiMac で行いました。
OS イメージのダウンロード
GUI は特に不要なのでLITE を入れます。バージョンはSTRECHでした。
SDカードにOS をインストール 〜 SSHログインまで
こちらのドキュメントに従っていきます。 www.raspberrypi.org
SDカードをMac に差したら、どこに認識されたか確認し、アンマウントする(この場合はdisk2 でUntitled という名前でマウント)
% diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *500.1 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 499.2 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *2.0 TB disk1 1: EFI EFI 209.7 MB disk1s1 2: Apple_HFS BACKUP 2.0 TB disk1s2 /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *16.1 GB disk2 1: Windows_FAT_32 16.1 GB disk2s1 % df Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk0s2 975093952 491880216 482701736 51% 2834820 4292132459 0% / devfs 373 373 0 100% 646 0 100% /dev map -hosts 0 0 0 100% 0 0 100% /net map auto_home 0 0 0 100% 0 0 100% /home /dev/disk1s2 3906357344 1461789224 2444568120 38% 17511180 4277456099 0% /Volumes/BACKUP /dev/disk2s1 31440896 5760 31435136 1% 0 0 100% /Volumes/Untitled % sudo diskutil unmount "/Volumes/Untitled/"
先程、ダウンロードしたRaspbian のイメージをSDカードにコピーします。
% sudo dd bs=1m if=`pwd`/2017-09-07-raspbian-stretch-lite.img of=/dev/disk2 conv=sync
最初からSSH でログインしたかったので、ルートディレクトリにsshファイルを作成します。
% touch /Volumes/boot/ssh
SDカードをiMac から取り出します。
% sudo diskutil unmount "/Volumes/boot/" % diskutil eject /dev/disk2
Raspberry Pi にLANケーブルを差し込み、電源をプラグを指して起動し、arp -a とかで追加されたIPアドレスを見つけます。
IPアドレスが分かったら、SSH でログインします。pi ユーザーの初期パスワードはraspberry です。後で適宜変えておきましょう。また、piユーザーは色々な権限と紐付いているので、別のユーザーを作ってもよいでしょう。
% ssh pi@<IPアドレス>
後で鍵認証でSSHログインできるようにしたいので、Raspbian 側のホームディレクトリに.ssh ディレクトリを作成します。
$ mkdir ~/.ssh
鍵認証でSSH できるようにする
Mac側での作業
Mac 側で鍵を作成します。鍵名やパスフレーズは適宜設定してください。秘密鍵と公開鍵が出力されます。 ここでは、id_rsa_pi とします。
% cd ~/.ssh % ssh-keygen -t rsa -b 4096
~/.ssh/config にエイリアスを記述します。ユーザーは、ここでは便宜上pi ユーザーとします。
Host pi HostName <ラズパイのIPアドレス> User pi IdentityFile ~/.ssh/id_rsa_pi
公開鍵をRaspbian 側にコピー
% scp id_rsa_pi.pub pi@<IPアドレス>:~/.ssh/authorized_keys
Raspbian 側での作業
各種権限を変更しておきます。
$ sudo chmod 700 .ssh $ sudo chmod 600 authorized_keys
これで、鍵認証でSSHログインできるようになるはずです。
% ssh pi
OS の設定色々
raspi-config でOS の設定
sudo raspi-config
で、諸々の設定ができます。自分が設定したのは次のあたり
項目 | 設定内容 |
---|---|
Change User Password Change Password for the current user | pi ユーザーのパスワード |
Localisation Options | |
Change Locale | ja.UTF-8.UTF-8 追加 |
Change Timezone | Tokyo |
Change Wi-fi Country | Japan |
Advanced Options | |
Expand Filesystem Ensures that all of the SD card storage is available to the OS | ディスク領域拡大 |
設定後はリブートが必要です。
apt のリポジトリサーバー変更
$ sudoedit /etc/apt/sources.list
http://ftp.jaist.ac.jp/raspbian に変更
NTPD 設定
Raspbian STRECH の途中からNTPD がなくなってるので設定します。 参照:NTPD missing on latest Raspian? - Raspberry Pi Forums
$ sudo apt-get -y install ntp $ sudo systemctl enable ntp $ sudoedit /etc/ntp.conf デフォルトのpool 指定をコメントアウトし、 #pool 0.debian.pool.ntp.org iburst #pool 1.debian.pool.ntp.org iburst #pool 2.debian.pool.ntp.org iburst #pool 3.debian.pool.ntp.org iburst これを追加 pool ntp.jst.mfeed.ad.jp iburst restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrust notrap $ sudo systemctl restart ntp $ sudo ntpd -p
有線LANと無線LAN のIPアドレス固定化
$ sudoedit /etc/dhcpcd.conf 以下の行を追記 ※DNS の8.8.8.8 はお好みで # 有線LAN interface eth0 static ip_address=<任意のIPアドレス>/24 static routers=<ルーターのIPアドレス> static domain_name_servers=<ルーターのIPアドレス> 8.8.8.8 # 無線LAN interface wlan0 static ip_address=<任意のIPアドレス>/24 static routers=<ルーターのIPアドレス> static domain_name_servers=<ルーターのIPアドレス> 8.8.8.8
無線LAN 設定
こちらに書いてあることをそのままやりました。 www.raspberrypi.org
$ wpa_passphrase <SSID> <Passphrase>
の出力結果を /etc/wpa_supplicant/wpa_supplicant.conf に反映します。 802.11a は非対応です。また、ステルスモードのSSID にはscan_ssid=1 を追記します。 生のパスフレーズがコメントされているので消しておきます。
network={ scan_ssid=1 ssid="hoge" # psk="生のパスフレーズ" … これは消す psk=<暗号化されたパスフレーズ> }
設定後に
wpa_cli -i wlan0 reconfigure
の結果にOK が返れば成功です。
ip addr
でIPアドレスを確認しておきましょう。
launchMode がsingleTask のActivity でIntent を受け取る
launchMode="singleTask" のActivity ではgetIntent() で取得したIntent のExtras などが欠落する。
これはAndroid Developer のドキュメント にあるようにlauncMode がsingleTop やsingleTask の場合はonNewIntent() をコールしているかららしい。
この場合はonNewIntent(Intent intent) をオーバーライドする。
@Override protected void onNewIntent(Intent intent) { // Override cause of singleTask app super.onNewIntent(intent); setIntent(intent); }
参照先
AppCompatActivity を継承したActivity でMenu を使う場合
item ノードの属性「actionViewClass」をapp: にしないとgetActionView() でNULL が返される。 要注意。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_id" android:orderInCategory="100" android:title="@string/title" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always" /> </menu>
Vagrant+VirtualBox 導入メモ
やりたいこと
Mac 上で仮想環境を簡単にスクラップ&ビルドできるようにする。 色々勉強するのにMac に入れ続けると環境がごちゃついて嫌。
環境
VirtualBox をインストール
ここからMac 用のdmg イメージをインストールします。 Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle
Vagrant をインストール
同様にここから。
CentOS のイメージを入れて立ち上げる
イメージの選択はVagrant Cloud から選びます。
今回はbento/centos-7.1 にします。
初期設定
VM 用のディレクトリを作成 → CentOS 用のVagrant ファイルを作成 → 取り敢えず起動。
mkdir ~/vm/centos cd ~/vm/centos vagrant init bento/centos-7.1 vagrant up --provider virtualbox
VagranFile の編集
プライベートネットワークと他のデバイスからアクセス可能にする。 ※この辺は目的に応じて
config.vm.network "private_network", ip: "192.168.33.10" config.vm.network :public_network
メモリを増やす
config.vm.provider "virtualbox" do |vb| vb.memory = "2048" end
設定を反映するためにリロード
vagrant reload
ssh でアクセス可能にしておく
vagrant ssh-config --host centos7 >> ~/.ssh/config
プラグイン
取り敢えずこのあたりは便利そうなので入れておきます。
- sahara:サンドボックス機能。ロールバックができる。
- vagrant-vbox-snapshot:VMのスナップショットを作成する。
- vagrant-omnibus:Chef を自動でプロビジョニング
- aws:AWS を操作するのに使う
- vagrant-global-status:仮想端末情報を一覧表示してくれる
vagrant plugin install sahara vagrant plugin install vagrant-vbox-snapshot vagrant plugin install vagrant-omnibus vagrant plugin install vagrant-aws vagrant plugin install vagrant-global-status
確認は vagrant plugin list でできます。