カブのヘッドライトのバルブ交換

仕事から帰ったら、カブの練習で近所をうろうろしています。

自転車通勤を続けている以上、必然的に夜にしか走ってないのでヘッドライトの点灯は必須です。というか二輪車は常時点灯が義務付けられています。

数日前、烏帽子岳から帰ってきた後にヘッドライトが暗すぎるんじゃないかと点検したところ、ハイビームが切れてることが分かりました。

一つのバルブの中にロービームとハイビーム用の2つのフィラメントがあり、ハイ用が切れてたってことですね…。普段ハイは使わないので支障はないものの、ローもかなり弱々しいし、ローも死んだら完全に整備不良になっちゃうので交換してみました。

購入したのは、「M&Hマツシマ PH-7 12V30/30W (B2・CL) 4 4B2C」。もっと安いものもありましたが、それなりに明るい!と良いレビューのものを購入してみました。 プラスドライバーで2箇所のネジを開くだけで取れました。とても簡単。古いバルブを抜いて新しいものと交換するだけです。

初めてだったのでちょっと迷ったのが「光軸調整」。ヘッドライトの真下にあるネジで調整するらしいですが、最初はネジを開け締めするとバルブが動いて上下するんだと思ってました。もう一度外してみても、真下のネジはバルブにつながってない…。

いろいろ触ってると、ハンドルにはめ込む時にヘッドライト全体(取り外してる部分すべて)を上下させて、良い具合のところで真下のネジを固定するということに気付きました。なるほどー。

無事に調整もでき明るくなりました。良かった。

烏帽子岳に行ってきました。

会社から帰ってから、カブの練習がてら烏帽子岳に登ってきました。

山道初挑戦。2速と、たまに1速を使いながら上がるとぐんぐん進んでくれました。くねくねした山道だとかえって車よりも走りやすいのかもしれません。

夜の7時半ですが陽が長いですねー。

山の上は少し雲がかかっていて、ひんやりとして、蝉の声だけでした。

人っこ一人いない!

なんだか寂しくなってきたので、缶コーヒーを1杯呑んですぐに下山しました。

下山中、どんどんと辺りが暗くなっていき、森の中は真っ暗になってしましました。

ヘッドライトがとても暗い!

消えかけの蝋燭っていう言葉がぴったしな明るさでした。

原付ってこんなもんなのかなぁ…?→つづく

スーパーカブは整備中

バイク屋さんに用事で行くと、購入したスーパーカブが納車に向け整備中でした。レッグシールドが外され華奢なフレームがあらわに…!(照)

もう一応自分のカブのはずですが、念の為許可をいただいてパシャパシャ撮りました。

レッグシールドがないとスリムな見た目。

とてもかわいい。造形が手塚治のキャラクターっぽいです。

走行距離349.7km…(笑)

購入時になかった佐世保市の仮ナンバーがついていました。

二輪車のエンジンをまじまじと見るのも初めてでした。

楽しみ!

中古のスーパーカブを買いました

これまでも電動アシスト自転車のビビ・ストロングでうろうろしていました。普通四輪免許を取得して数週間、車を運転する機会はあったものの、狭い道が多い佐世保の街で普段使い用に乗るとなると四輪車はどうしても手軽感が薄れてしまいます。かといって自転車では、たとえ電動アシストとは言え山は越えられない…。そこで、手軽な足として原付を買おうと思いました。

学生時代に新聞奨学生をしていた私にとって、50ccの二輪といえばスーパーカブ。学生は自転車での配達でしたが、同じ営業所のおっちゃん達が乗っていたカブの軽やかなマフラー音が忘れられません。あれほど朝の鳥のさえずりに似合うマフラー音は他にないんじゃないかと思っています。

さて、手頃な値段の丸目カブ50を近所のバイク屋さん数店で探していたのですが、手頃なのは角目しか在庫がないようで、Goobikeを漁っていたところリトルカブの掲載を見つけました。

リトルカブは小さいイメージがあったので、どんなものかと一度跨らせてもらおうと思ってお店に連絡すると、掲載されていたリトルはすでに売約済み。代わりに勧められたのがこのカブです。

うわあああ、色がとってもビビット…!

2002年式スーパーカブ50DXで、走行距離は349kmでした。15年モノでそんなワケないので、走行距離疑惑車扱いでこの値段らしいです。

社外品は

  • シートが1.5倍くらいのサイズ(タンデムシートじゃないと思う)
  • リアサスペンション
  • リアキャリア(シート巨大化のため)
  • マフラー

で、エンジンはノーマルとのこと。

元々は、

enter image description here

こういう色の車体だったらしいですが、前オーナーの人が

これに塗っているそうです。シート下のガソリンタンク上部が確かに深緑。お店の方が丁寧に説明してくれました。

前から見たところ。後になって気付いたのですが、レッグシールドもホンダの純正品でした。

体が大きい自分にとって、このシートは魅力的。また、本体9.5万円っていうところにも想定してた予算10万円前後にぴったりです。

正直なところ、原付を買うのは初めてのことだし他のところはよく分かりません。

となると、あとは色か…!

30過ぎのオッサンが乗るにはちょっとポップすぎないか、カブと言えば労働者のバイク…!、油と泥と錆が似合うんじゃないのか!(※勝手なイメージです)

色だけに色々迷いましたが、詳しくもない以上、確固たるこだわりもありません。

よし買う!買っちゃいました!ヒャッホーィ!

こうなったら後は楽しむのみ!です…!

LMDE(Linux Mint Debian Edition)2 で Google Drive を使う

Linux で Google Drive を使う方法は google-drive-ocamlfuse 一択かなーと思っていたら、Grive というオープンソースのソフトを知ったので入れてみました。google-drive-ocamlfuse は fuse でマウントできるのに対し、Grive は Windows 版の Google Drive クライアントのように同期させるためのソフトです。(Google ドキュメントで作成したファイルは同期されません)

fuse でマウントすると、ローカルにデータを置いておかなくてもバックエンドで Google Drive にアクセスして省スペースになりますが、ネットワークが切れたり、通信コストを抑えたい場合に厄介です。Grive は二重にデータを保持するもののネットワーク環境がなくてもデータが利用可能ですし、Grive を単体で使うと自動同期もしないので、ユーザーが好きなタイミングで同期することができます。

自分にぴったり…! ピコーン (‘A`)

公式サイト

LMDEやDebianのリポジトリにあって、APT で降ってくる grive を最初に入れたものの使えず、調べてみると新しいバージョンを使った方がいいらしいです。 ということで、Github から入手してビルドします。

インストール方法は、公式の手順のとおりです。

1. ビルドに使うものをインストール

C++ 方面の団体さんがお着きです。

sudo apt-get install git cmake build-essential \
  libgcrypt11-dev libyajl-dev libboost-all-dev \
  libcurl4-openssl-dev libexpat1-dev libcppunit-dev \
  binutils-dev

2. ダウンロード、ビルド、インストール

cd /tmp
git clone https://github.com/vitalif/grive2.git
cd grive2
mkdir build
cd build
cmake ..
make -j4
sudo make install

インストールすると次の位置にコマンドが配置されました。

$ sudo make install
[ 78%] Built target grive
[ 83%] Built target btest
[ 98%] Built target unittest
[100%] Built target grive_executable
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/grive
-- Installing: /usr/local/share/man/man1/grive.1

3. 初回設定

初回の Google アカウント認証は WWW ブラウザ経由で行います。 同期用のディレクトリは作成されないので、自分で作って移動します。 最初、ホームディレクトリで grive コマンドを実行してしまい焦りました。(-p dir オプションを指定することにより、ディレクトリを指定することも可能。省略時はカレントディレクトリです。)

$ mkdir ~/GoogleDrive
$ cd ~/GoogleDrive
$ /usr/local/bin/grive -a

-a オプションが初回の認証を行うオプションです。認証用 URL が印字されるので、そのリンクを WWW ブラウザで開きます。

$ /usr/local/bin/grive -a
----------------------
Please go to this URL and get an authentication code:

https://accounts.google.com/o/oauth2/auth?... # ← 認証コード

-----------------------
Please input the authentication code here: 
(ここに認証コードをコピペ)
Reading local directories
Reading remote server file list
Synchronizing files
...

認証コードを貼りつけた後は、Return キーを押してそのまま待ってください。手癖で C-d などタイプしてしまったら、そのまま終了してしまいます(終了させてしまいました)。 あとは Google から降ってくるファイルを淡々と眺めていくだけです。

初回の同期に終了すると

Finished!

と表示されてコマンドが終わります。

4. その後の同期

あとは、

$ cd ~/GoogleDrive
$ /usr/local/bin/grive

または

$ /usr/local/bin/grive -p ~/GoogleDrive

とすれば、同期することができます。Ubuntu では grive-tools パッケージを入れたら常駐型の GUI ソフトが入って自動同期してくれるようですね。僕の場合は、Git のプッシュとプルのようにマニュアル同期の方が助かるのでこれ以上の設定はしませんが、ユーザー権限で動く grive を cron に登録しておけば自動同期も可能だと思います。

Let’s Encrypt + nginx で SSL 化

自分用の覚え書きです。

環境

  • Debian GNU/Linux Jessie
  • さくらVPS
  • ドメイン取得・DNS設定済
  • Let’s Encrypt を利用

準備

手順は大体ここに載っているとおり。ドメインが割り当てられたホストにログインして certbot を使って証明書を発行します。Debian の Jessie の場合、APT リポジトリに backports を追加します。

# echo 'deb http://ftp.debian.org/debian jessie-backports main' \
  >> /etc/apt/sources.list
# apt update

backports から certbot をインストールします。

# apt -t jessie-backports install certbot

次にファイアウォールで外部から80番(HTTP)ポートにアクセスできるようにしておきます。Let’s Encrypt のホストがドメインを確認する時に接続し、certbot が実行されているホスト、申請内容が正しいかチェックするためです。iptables/ufw、各種クラウドサービスのインバウンド設定は割愛します。

証明書の発行

certbot を実行します。 -d オプションでドメインを指定します。複数個を指定して OK です。

# certbot certonly --standalone -d example.com -d www.example.com

画面に表示される手順に従って、項目を入力していきます。メールアドレスは、証明書の失効の通知などが届く連絡先になります。ここでは、HTTPD を止めると書いてありますが、私の環境では無停止でいけました。HTTPD が立ち上がってたらcertbot が80番でListenしなくなった、とかそういう事かな。

端末に

IMPORTANT NOTES:

とメッセージが出て、ドメインや失効日が表示されたら正常終了です。次の場所に証明書が保存されます。

/etc/letsencrypt/live/example.com/*.pem

nginx の設定

設定ファイルの server 項目を下記のように編集します。

# -- snipped --
server {
  listen *:80;
  server_name example.com *.example.com;
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl;
  ssl on;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  # -- snipped --

非SSL(http://~)経由でのアクセスをSSL経由のアクセスをするようリダイレクトしています。また、SSL のプロトコル指定では、脆弱性がある SSLv3 を抜いて無効にしています。 コンフィグテストを行なって問題がないようであれば、リロードします。

# /etc/init.d/nginx configtest
[ ok ] Testing nginx configuration:.
# /etc/init.d/nginx reload

必要に応じて、外部から443番ポートへのアクセスを許可すれば完了です。

証明書の更新

Let’s Encrypt が発行してくれる証明書は90日間で失効します。定期的に更新する必要があります。 手動で行うには certbot コマンドに renew オプションを与えます。このホストに登録されている Let’s Encrypt のすべての証明書の有効期限を調べ、失効日が近いものを更新してくれます。 試しに実行してみると

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
#

となりました。先ほど作ったばかりの証明書なので、ここは「リニューアルする必要なし」です。

手動更新はアレですので、cron に登録しておきます。

# echo 'certbot renew && /etc/init.d/nginx reload' > /etc/cron.weekly/certbot
# /etc/init.d/cron reload

以上です。

参考

LMDE2 で RAID10 環境を組みました(追加編)

メインマシンはデータ保存用に3TBのハードディスクを4本積んでいます。前回換装してから3年半ほどが経ち、使用時間が軒並3万2000時間を越えている状態です。 去年の10月に新しいマシンを組んだ際にハードディスクをそのまま移し騙し騙し使っていたのですが、先週になってとうとう1台がシステム側から認識しない自体が発生しました。システムを再起動すると正常に認識し、特に物理的なエラーも論理的なエラーも発生していなかったものの、良いタイミングだと思い換装することにしました。

将来の換装のためと全12TBのストレージ領域中5.5TBまでデータの整理を行なっていたので、新しい3TBストレージを4本準備してRAID10を組んでみます。

準備

下記のものを4台購入しました。

これらを使って標準的な RAID10 構成にしたいと思います。新規のストレージをマシンに接続するとそれぞれ sdc, sdd, sde, sdf と認識されているとします。

システムから認識される論理デバイスは /dev/md0 になる予定です。ストレージの利用率は50%のミラーリング+ストライピング構成です。

早速、それぞれのストレージを parted を使って初期化します。以降はほぼずっと root 権限での作業になります。

for t in /dev/sd{c,d,e,f}; do \
  parted --script $t "mklabel gpt"; \
  parted --script $t "mkpart primary 0% 100%"; \
  parted --script $t "set 1 raid on"; \
done

GPT に設定し、パーティションを作成後、RAID フラグを立てています。初期化に成功すると、

$ ls /dev/sd*1
/dev/sdc1
/dev/sdd1
/dev/sde1
/dev/sdf1

パーティションに対応するデバイスファイルが生成されます。

ソフトウェア RAID の構築

Linux でソフトウェア RAID を実現するには、例に漏れず mdadm を使います。インストールは次のとおり。

apt update
apt install mdadm

実行します。

mdadm --create /dev/md0 -v --raid-devices=4 --level=raid10 \
  /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1

/dev/md0 は作成したい論理デバイスファイル名です。 --level=raid10 で RAID10 を指定しています。最後にデバイスを指定しています。 こちらの記事によると、デバイスの順序によってどのデバイス同士が RAID1 ペアなのかの構成が変わるようですね。 コマンドを実行すると、最終確認をしてくるので y と入力。

mdadm: array /dev/md0 started.

と表示されシェルに戻ってくれば設定終了です。あとはバックグラウンドで初回の resync 処理が走るので

watch -n 5 -d cat /proc/mdstat

で進捗状況を見ましょう。私の環境では処理が終わるまでに6、7時間を要しました。resync している最中でも /dev/md0 を使うことは可能ですがパフォーマンスが凄く落ちてしまうので、できるだけ放っておく方が無難。処理している間に、アレイ情報をファイルに書き出しておきます。これをしないと次回起動時にアレイを正しく扱ってくれません。

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

mdadm.conf の内容は下記のようになりました。

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=**********:0 UUID=********:********:********:********

末尾にアレイ情報が追記されています。これで再起動しても正しくアレイを認識できるようになります。なお、resync 中に再起動をかけると処理が最初からやり直しで、自動的に実行もしてくれないので手動で実行する必要があります。 アレイとしてスキャンしたいデバイスを明示的に指定したりするには、 DEVICE 部分を指定します。

resync 処理が完了したら /proc/mdstat の内容が

cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sdd1[0] sde1[3] sdf1[2] sdc1[1]
      5860268032 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 0/44 pages [0KB], 65536KB chunk

unused devices: <none>

となります。 [UUUU] の部分が「4本すべて正常」を表しています。異常が出た場合には、この U_ (アンダースコア)になります。例えば、sed1 に異常があった場合は [U_UU] という表示になります。

論理デバイスを初期化

論理デバイスの /dev/md0 が使える状態になったので、後は通常どおりフォーマットしてマウントします。

mkfs.ext4 /dev/md0
mkdir /mnt/raid10
mount /dev/md0 /mnt/raid10

私の環境の場合、 df -h で5.5TBボリュームとして認識しました。

定期チェック設定の確認

mdadm をインストールすると、自動的に cron に定期チェックのスクリプトが登録されます。

cat /etc/cron.d/mdadm
#
# cron.d/mdadm -- schedules periodic redundancy checks of MD devices
#
# Copyright © martin f. krafft <madduck@madduck.net>
# distributed under the terms of the Artistic Licence 2.0
#
# By default, run at 00:57 on every Sunday, but do nothing unless the day of
# the month is less than or equal to 7. Thus, only run on the first Sunday of
# each month. crontab(5) sucks, unfortunately, in this regard; therefore this
# hack (see #380425).
57 0 * * 0 root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; \
  then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi

毎週日曜日の午前0時57分に実行され、その日が毎月7日より前…つまり毎月最初の日曜日であれば、 checkarray コマンドが実行されます。「平日は避けたいけど、実行は月に1回だけでいい」という設定を crontab では素直に書けないのでコメントで軽くdisってますねー。実行するトリガーを決めるのは実行したいもの各々によって違うはずなので、cron は今以上高機能化する必要もない気もします。一方で「日付や曜日、何分毎…といったある程度の時間の概念を扱っているし、可読性が落ちてバグも増えるから、このくらい標準機能で出来てもいいじゃない」と言いたくなる気持ちも分かります。

手動でのチェック

cron にも登録されている /usr/share/mdadm/checkarray はスケジュールを考慮しており、最近チェックが走ったアレイはチェックをスキップします。手動で強制的にチェックを行いたい場合は次のコマンドを実行します。

echo check > /sys/block/md0/md/sync_action

また、停止したい場合は

echo idle > /sys/block/md1/md/sync_action

を実行します。リビルド中に sync_action に書き込んでもエラーになって弾かれるため注意が必要です。

様子は構築時同様に cat /proc/mdstat で確認することができます。

気付いた点

  • 今回はあわてて作業をしたため忘れていましたが、障害発生時にどのストレージを換装すればいいかスムーズに見極めるため、ラベルを付けていた方がいいです。
  • 通電したまま電源やSATAケーブルをいじるのが怖くて今回は試してませんが、SATAもホットスワップに対応してるんですねー。内蔵デバイスでの運用ばっかりなので考えてもみませんでした。
    確かに外付けSATAがある訳だ…。
  • 暇が出来たら、今度は既存のストレージ(しかもブートデバイス)のRAID化をやってみようと思います。最近、CUDA 環境を整えようといろいろやっていたら update-initramfs の実行処理が帰って来なくなるようになってブートシーケンスを触るのは毎回どきどきします。まあ、ブートデバイス周りだけだから GRUB 設定だけでいけるのかな…。

参考

Linux で Microsoft Xbox One Kinect センサーを使ってみました

先週からスマホカメラUSBカメラ×2台Kinect 360 と深度マップ撮影をやっていて、とうとう Kinect One の購入に至ったので書いておきます。

新品が到着

Amazon で Kinect One 本体専用の電源・USBアダプターを購入しました。本体が1,4000円に対して電源・USBアダプターが5250円というのはなかなかのお値段バランス。

ちなみに、Kinect 360 (v1) と Kinect One (v2) の違いについては次のページが詳しいです。

udev 設定

環境によるのかもしれませんが、Kinect 360 (v1) はホストマシンと USB 接続するとそのまま利用できていました。今回の Kinect One (v2) では、一般ユーザ権限で Kinect を使うのに udev の設定が必要だったので書いておきます。

root 権限で /lib/udev/rules.d/90-kinect2.rules を新規作成し、公式にある次の内容を記述します。

# this file belongs in /etc/udev/rules.d/
# ATTR{product}=="Kinect2"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02c4", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d8", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d9", MODE="0666"

udev のルールを再認識させるためには、root 権限で

udevadm trigger

した後に、Kinect を使いたい一般ユーザ権限の再ログイン・Kinect の再接続をすれば良いようです。 システム側には3つのデバイスとして認識されているようですね。RGBカメラ、Dカメラ、マイクかな。

参考までに、dmesg は次のとおりになっていました。

[2319025.138813] usb 2-1: new SuperSpeed USB device number 9 using xhci_hcd
[2319025.156457] usb 2-1: New USB device found, idVendor=045e, idProduct=02d9
[2319025.156464] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.156469] usb 2-1: Product: NuiSensor Adaptor      
[2319025.156473] usb 2-1: Manufacturer: Microsoft Corporation  
[2319025.159153] hub 2-1:1.0: USB hub found
[2319025.159284] hub 2-1:1.0: 1 port detected
[2319025.494131] usb 1-7: new high-speed USB device number 31 using xhci_hcd
[2319025.624314] usb 1-7: New USB device found, idVendor=045e, idProduct=02d9
[2319025.624321] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.624326] usb 1-7: Product: NuiSensor Adaptor      
[2319025.624330] usb 1-7: Manufacturer: Microsoft Corporation  
[2319025.625176] hub 1-7:1.0: USB hub found
[2319025.625337] hub 1-7:1.0: 1 port detected
[2319026.724222] usb 2-1.1: new SuperSpeed USB device number 10 using xhci_hcd
[2319026.740876] usb 2-1.1: New USB device found, idVendor=045e, idProduct=02c4
[2319026.740883] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4
[2319026.740888] usb 2-1.1: Product: Xbox NUI Sensor
[2319026.740892] usb 2-1.1: Manufacturer: Microsoft
[2319026.740896] usb 2-1.1: SerialNumber: XXXXXXXXXXXX

lsusb でも3つのデバイスとして認識されています。

freenect2 のビルド

Debian ベースである LMDE2 (Linux Mint Debian Edition) では、公式リポジトリにあるのは v1 向けの libfreenect だけです。そこで、Open Kinect Project の Github リポジトリから libfreenect2 を入手してビルドします。システム要件やビルド方法は README.md に書かれているとおりです。依存しているライブラリのほとんどは APT でインストールすることができます。 一点だけひっかかったのは、

Install libusb. The version must be >= 1.0.20.

の部分。 LMDE2 公式リポジトリは2017年3月現在、libusb のバージョンが 1.0.19 しか提供されていないようです。そこで、

ここから libusb の 1.0.20 のソースコードをダウンロードし、make install しました。なお、Ubuntu の場合だったら deb パッケージがこちらで配布されています。 freenect2 のソースコードにある depends ディレクトリの中身にある程度依存関係をアレしてくれるスクリプトが入っているので、そちらを参考にしてもいいかもしれません。

参考にならないであろう私がインストールした経緯はこちらです。今回 Kinect One を買って無駄にならなかった…ぞ!!!

RTAB-Map のビルド

RTAB-Mapは公式マニュアルを参考にインストールします。

今見たら ROS 版や Docker 版もあるんですね…、私は APT で全部揃えて cmake しました。

参考