Stacks

技術関連のメモ書きです

Timemachine over SMB

やりたいこと

それまではTimemachine のバックアップ先はiMac に直接つないでいた外付けHDD を使っていたのですが、MacBook Pro に乗り換えたので、外付けHDD をファイルサーバーにつないでSamba 経由でTimemachine のバックアップ先とする。

環境

ファイルサーバー

Mac

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機能を使った学習リモコン、赤外線リモコンを動かす方法

購入した部品

上述のページを参考に

環境

項目 内容 備考
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 を買って、セットアップするまでのメモです。やったことは以下です。

  • SDカードにRaspbian をインストール
  • 鍵認証でSSH ログインできるようにする
  • OS の設定色々
  • 有線LANと無線LANIPアドレス固定化
  • 無線LAN設定

バイスRaspberry Pi 3 Model B - Raspberry Pi です。

セットアップは自宅のiMac で行いました。

OS イメージのダウンロード

GUI は特に不要なのでLITE を入れます。バージョンはSTRECHでした。

www.raspberrypi.org

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と無線LANIPアドレス固定化

$ 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);
}

参照先

stackoverflow.com

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 に入れ続けると環境がごちゃついて嫌。

環境

  • Mac OS X(10.10.5 Yosemite)
  • iMac Late 2009
    • メモリ12GBに増設

VirtualBox をインストール

ここからMac 用のdmg イメージをインストールします。 Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle

Vagrant をインストール

同様にここから。

Vagrant by HashiCorp

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

プラグイン

取り敢えずこのあたりは便利そうなので入れておきます。

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 でできます。