台風が来たので自宅勤務してみた

台風がきていて、会社には行けそうだったけど無理せず自宅勤務でいいよって連絡がきてたので自宅勤務してみた。午後に山手線が止まっていたので、結果的に正解だった。家でフルタイムの仕事をしてみた率直な感想としては、仕事はできるけど慣れていないからか集中するのが難しいな、という所だった。

インターネットに繋っていれば仕事ができて、自宅はインターネットに繋っているので自宅で当然仕事ができる。ただ、会社で使っているモニタとキーボードがなかったので使い勝手はいつもと違うし、空調や照明なんかもいつもとは違うので違和感がある。特に、照明は暖色系のものを使っているので仕事向きではないような気がした。

家の中でもくつろぐスペースと何か作業するスペースをちゃんと分けたいなあ。

Rubyでstdoutl/errを標準出力/エラーとファイルの両方に出力する

stdout/stderrをファイルにも出力したくていろいろ調べて、いい感じの解決方法を見つけたのでメモしておく。

ruby-listにmatzが投稿していた(Re: puts,printの出力をファイルにも出力するには)。

これを実行すると、こうなる。

[ruby]
defout = Object.new
defout.instance_eval{@ofile=open("/tmp/test.log", "w")}
class <<defout
def write(str)
STDOUT.write(str)
@ofile.write(str)
end
end
$stdout = defout

puts ‘aaa’
[/ruby]

[text]
$ ruby ./test.rb
aaa
$ cat ./test.log
aaa
[/text]

なるほど、標準出力と標準エラーにputsされている。便利。

これができると、次はstdoutとstderrの両方をファイルにも出力したくなる。その場合はこうしちゃえばいい。

[ruby]
defout = Object.new
defout.instance_eval{@ofile=open("/tmp/test.log", "a")}
class <<defout
def write(str)
STDOUT.write(str)
@ofile.write(str)
@ofile.flush
end
end
$stdout = defout

deferr = Object.new
deferr.instance_eval{@ofile=open("/tmp/test.log", "a")}
class <<deferr
def write(str)
STDERR.write(str)
@ofile.write(str)
@ofile.flush
end
end
$stderr = deferr

puts ‘aaa’
warn ‘bbb’
puts ‘ccc’
[/ruby]

[text]
$ ruby ./test.rb
aaa
bbb
ccc
$ cat ./test.log
aaa
bbb
ccc
[/text]

flushしないとtest.logにstdoutが先に全て出力され、その後にstderrが出力されてしまうようだ。また、この方法だとsystemのような子プロセスの出力はteeされないので注意しないといけない。

APS-CからMFTに乗り換えた

写真を撮るようになってからずっと使っていたPENTAXとGRからLumix(Panasonic)に乗り換えた。フォーマットとしてはAPS-Cからマイクロフォーサーズ(MFT)。自分の中でかなり大きな変換点なのでいろいろ書いておく。

PENTAX

確か大学2年の頃に写真を撮るようになって、その時初めて買ったカメラがPENTAXのK100D Superだった。それからずっとメインカメラとして使っていた。しばらく撮らなくなったこともあったけど、2012年頃にK-5IIに買い替えて、その後FA31を購入している(2014年)。

GR

持ち歩き用にコンデジが欲しいな、と思って購入したが、スマホと役割りが被っているのと画角が自分の好みでなかった。スマホよりボケるけど暗所ではスマホの方が便利。

Lumix

購入したのはGX7 mk2とLumix 12-35mm f2.8。FA31ばかり使っていて少し飽きていたのと、そもそも歩きまわるのが好きなので一眼レフが重いという問題があり、乗り換えることにした。K-5IIとFA31で1.1kgなのに対し、GX7mk2と12-35mmだと731g。体積的にも小さくなって、これならずっと持ち歩けそう。大事なのは写真を撮ることで、自分の行動に合うものを選ぶべきだ。K-5IIはフィールドカメラで質実剛健だったが、そんな性能を必要とする場所に行くことはまずないのだ…

所感

やはり軽くてコンパクトなのはよい。コンパクトすぎてダイヤル操作が若干辛い事があるが、使い始めてまだ数週間なので様子見だろう。画質は、やはりAPS-Cに比べると若干負けている事があると思う。先日夕日を撮ったが、ISO200〜400で結構ノイズが乗っているように見えた。MFTだからなのか、手ぶれ補正等の影響なのかは分からないのでこれももうしばらく使ってみる必要がある。背面液晶がタッチパネルなのだが、これは非常に便利なので全ての背面液晶はタッチパネルになるべき。

 

P1010608
GX7 mk2で撮影した夕焼け。ISO200。

カーテンの自動開閉を実現するためにmornin’を買った

先日、mornin’というカーテン自動開閉ガジェットの存在を知った。

http://blog.horimisli.me/entry/mornin

調べてみると3,985円とお手軽だったのでさっそく購入して使ってみることにした。朝、amazonで2個購入して、翌日に到着。2個買った理由だけど、1個だけだとカーテンが両開きの場合片方しか操作できないためです。

開閉方法はタイマーによる自動操作とスマホをリモコンとして使う手動開閉の2種類。リモコンは複数のmornin’を同時に操作可能。スマホとmornin’を紐づける必要があるが、すごく簡単に紐づけることができた。

 

IMG_4493

 

操作したらこんな感じで開閉する。結構音は大きいが、この音で目が覚めることは自分の場合はないかな?

Hi-SPEED MODEを有効にすると若干早く動かすことができる。

目的は自動開閉なので、タイマーを設定する。とりあえずこういう時間にしてみた。

 

IMG_4494

 

IMG_4495

今朝自動で開いていたが、全く気づかなかった。結構いい感じ。

ただ、1点気になっていることがあって、それはカーテンを開いた時に端まで開かない所があること。カーテンランナーの間に設置するため避けられないのだが、なんとなくしまらないなあ。

IMG_20160807_115949

 

とはいえ、満足。アプリの操作も迷うことがないし設置も簡単で、すごくよくできたプロダクトだと思う。おすすめです。

 

Vagrant + CentOS7+ kdump でVMのメモリサイズが小さいとkdumpの起動に失敗する

別にVagrantに限った話ではないけど。
Vagrantでprovisionする時にkdumpを起動しているのだが、VMのメモリサイズが1GBになっているようなVMだとそれが失敗していた。
原因と対策について整理しておく。

発生した問題

例えば、以下のようなVagrantfileでVMを起動するとする。

[ruby]
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
config.vm.box = "centos/7"

config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end

config.vm.provision "shell", inline: <<-SHELL
yum install -y kexec-tools
systemctl start kdump.service
SHELL
end
[/ruby]

手元に作る環境なので、productionとは異なりメモリサイズを小さくしておく、ということは十分に有り得る。
この時、vagrant upすると以下のようになりprovisioningに失敗する。

[text]
==> default: Running provisioner: shell…
default: Running: inline script
==> default: Loaded plugins: fastestmirror
==> default: Loading mirror speeds from cached hostfile
==> default: * base: ftp.iij.ad.jp
==> default: * extras: ftp.iij.ad.jp
==> default: * updates: ftp.iij.ad.jp
==> default: Package kexec-tools-2.0.7-38.el7_2.1.x86_64 already installed and latest version
==> default: Nothing to do
==> default: Job for kdump.service failed because the control process exited with error code. See "systemctl status kdump.service" and "journalctl -xe" for details.
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
[/text]

原因

このログからではよくわからないので、VMにログインして状況を確認する。

[text]
takaishiryou-no-iMac $ vagrant ssh
[vagrant@localhost ~]$ sudo systemctl status kdump.service
● kdump.service – Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since 水 2016-08-03 14:01:48 UTC; 2min 55s ago
Process: 1597 ExecStart=/usr/bin/kdumpctl start (code=exited, status=1/FAILURE)
Main PID: 1597 (code=exited, status=1/FAILURE)

8月 03 14:01:48 localhost.localdomain systemd[1]: Starting Crash recovery kernel arming…
8月 03 14:01:48 localhost.localdomain kdumpctl[1597]: No memory reserved for crash kernel.
8月 03 14:01:48 localhost.localdomain kdumpctl[1597]: Starting kdump: [FAILED]
8月 03 14:01:48 localhost.localdomain systemd[1]: kdump.service: main process exited, code=exited, status=1/FAILURE
8月 03 14:01:48 localhost.localdomain systemd[1]: Failed to start Crash recovery kernel arming.
8月 03 14:01:48 localhost.localdomain systemd[1]: Unit kdump.service entered failed state.
8月 03 14:01:48 localhost.localdomain systemd[1]: kdump.service failed.
[/text]

起動に失敗したkdump.serviceのstatusを確認すると、「No memory reserved for crash kernel」と表示されている。
これは、メモリをkdump用に割り当てたいが、VMのメモリサイズが不足していて割り当てられないというエラーのようである。

このページの手順2.1によると、割り当てるメモリの量は/etc/default/grubを見れば分かる。実際に見てみるとcrashkernel=autoとなっている。autoの場合は予約するメモリサイズが自動的に設定される。どういう値になるかはこのページに書かれており、また、自動設定に必要な最小メモリサイズの情報がこのページに書かれている。後者を見ると、x86_64の場合は2GB必要であるということが分かる。つまり、上記Vagrantfileでは1GBしかメモリを用意していなかったためkdump用にメモリを確保しておらず、kdumpの起動に失敗したのである。

解決方法

解決方法として、以下が挙げられる。

  1. VMのメモリサイズを2GB以上にする
  2. crashkernelの値を変更し、固定値にする

てっとり早いのはメモリサイズ変更だが、kdumpのためだけに2倍のメモリを使うというのはなんだかしゃくである。なので、crashkernelの値を変更して、固定値にする方法を採用する。

手動で変更する場合はここの手順通りに作業を進め、crashkernelの値を128Mにして再起動すればよい。しかし、Vagrantの場合再起動した後にkdumpを起動する必要があるため、ややこしい。

そこで、aidanns/vagrant-reloadを使う。これはprovisioningの途中でVMを再起動して、その後のprovisioningをやってくれるというvagrantのプラグイン。Vagrantfileを以下のように修正してやる、。

[ruby]
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_plugin "vagrant-reload"

Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end

config.vm.provision "shell", inline: <<-SHELL
sed -i "s/crashkernel=auto/crashkernel=128M/g" /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
SHELL
config.vm.provision :reload

config.vm.provision "shell", inline: <<-SHELL
yum install -y kexec-tools
systemctl start kdump.service
SHELL
end

[/ruby]

vagrant upするとちゃんとVMが再起動し、sshで再度接続して次のprovisioningに進んでいることがわかる。

[text]
==> default: Running provisioner: shell…
default: Running: inline script
==> default: Generating grub configuration file …
==> default: Found linux image: /boot/vmlinuz-3.10.0-327.22.2.el7.x86_64
==> default: Found initrd image: /boot/initramfs-3.10.0-327.22.2.el7.x86_64.img
==> default: Found linux image: /boot/vmlinuz-0-rescue-cb81bd8ac73c409cb970c217f287cf9f
==> default: Found initrd image: /boot/initramfs-0-rescue-cb81bd8ac73c409cb970c217f287cf9f.img
==> default: done
==> default: Running provisioner: reload…
==> default: Attempting graceful shutdown of VM…
==> default: Checking if box ‘centos/7’ is up to date…
==> default: Clearing any previously set forwarded ports…
==> default: Clearing any previously set network interfaces…
==> default: Preparing network interfaces based on configuration…
default: Adapter 1: nat
==> default: Forwarding ports…
default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running ‘pre-boot’ VM customizations…
==> default: Booting VM…
==> default: Waiting for machine to boot. This may take a few minutes…
default: SSH address: 127.0.0.1:2200
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Remote connection disconnect. Retrying…
==> default: Machine booted and ready!
[default] GuestAdditions 5.0.26 running — OK.
==> default: Checking for guest additions in VM…
==> default: Rsyncing folder: /Users/r_takaishi/src/github.com/takaishi/dev-vm/centos7/ => /home/vagrant/sync
==> default: Machine already provisioned. Run vagrant provision or use the --provision
==> default: flag to force provisioning. Provisioners marked to run always will still run.
==> default: Running provisioner: shell…
default: Running: inline script
==> default: Loaded plugins: fastestmirror
==> default: Loading mirror speeds from cached hostfile
==> default: * base: ftp.riken.jp
==> default: * extras: ftp.riken.jp
==> default: * updates: ftp.riken.jp
==> default: Package kexec-tools-2.0.7-38.el7_2.1.x86_64 already installed and latest version
==> default: Nothing to do
[/text]

provisioningする度にVMを再起動するので時間が伸びるのがデメリット。