pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


mamorio と TrackRを比較する

落し物追跡タグでメジャーどころと言えば、mamorioかTrackRだと思う。

しかし実際に現物を使って比べてみると2つは似ているようで案外違います。なので、機能ごとに比べてみます。

とりあえずざっくりとした比較表

基本の話として、デバイスとの通信が行えなくなるとスマートフォンアプリから通知させることができます。この機能は on, off のどちらにも設定可能のようです。また「みんなで探す」「Crowd Locate アラート」という名称のサービスにより、自分が紛失したデバイスの近くに mamorio や TrackR をインストールしたユーザがいて検知できたら、その場所の通知が受けられます。

この時に誰がそれを見つけたかは通知されません。

比較項目 mamorio TrrackR
バイスからスマホのアラームを鳴らして探す できない できる
スマホからデバイスのアラームを鳴らすして探す できない できる
近くにない時の通知 Push通知 Push通知および指定秒間のアラート音
クラウドサーチ 可能(みんなで探す) 可能(Crowd Locate アラート)
発見場所の履歴表示 可能 可能(スマホアプリ バージョン6以降)
電池残量確認 アプリで可能 アプリで可能
電池交換 不可能(ただし半額で新品に交換できるサービスあり 可能
紛失時の保険サービス オプションサービスあり 2017/12時点では日本ではサービスなし(TrackRにdocomoが出資したので、そのうちあるかも)
ビーコンかどうか iBeacon ビーコンではない
ペアリング 必要(画面上に置いて実施) 必要(もっとも近くにあるペアリング待ちデバイスを検出)

※ペアリングについては mamorinoは iBeacon (BLE Beacon) らしいので、Bluetooth用語のペアリングというよりは「最も近い距離にある mamorino の Major, Minor を取得して紐付ける」という意味でのペアリングと思われます。

それぞれの製品に向くユーザ

「みんなで探す」「Crowd Locate アラート」の機能を期待している方は、買わないほうが良いです。これらの機能は使えればラッキーくらいに考えておく方が良いでしょう。これらの機能は自分の行動範囲に同じ製品のユーザが居た場合に限って使える機能です。

電池交換が苦手な方は mamorio を選び、電池が減ってきたら新品交換サービス (otakiage) を利用するのが良いです。新品の半額、約1500円程度で交換してもらえます。腕時計の電池交換もこれくらいの費用はかかりますから、同じようなものですね。新品交換になるという点は扱いが雑な場合にも向くかもしれません。

またmamorio、TrackRとも防水ではないので、水濡れする可能性がある場合は使えません。

家の中で鍵や小物を紛失しがちな方は TrackR の方が良いと思います。スマホ側からTrackRを鳴らして探せるので、すぐに見つかりますよ。

注意点(TrackR)

TrackR の方はデバイスとのリンクが切れたことをスマートフォン側に通知する機能を「携帯電話分離アラート」という名称で設定できます。これは携帯電話の置き忘れを想定しているようなので、置き忘れた携帯電話でアラート音が鳴ります。

しかしこの機能は微妙に使いづらいです。

例えば職場でトイレに行くときにスマホは持っているけどTrackRはカバンの中、というような場合にスマホ側でTrackRが検出できなくなってアラートが鳴り出す状況が起こります。これ自体は仕方がないことなのですが、アラート音はマナーモードでもきっちり鳴ります。これはあまり嬉しくない。

こういう状況を想定したためか、TrackR には特定のWiFiに接続しているときは置き忘れ通知をしない設定が可能です。しかし先の例でいうとトイレでWiFIの電波を拾えない場合は全く役に立ちません。

ただし呼び出し音はスマートフォンにインストールした音楽に変更可能なので、「無音のmp3データ」を割り当てれば無音化できます。

同様の理由により「デバイス分離アラート」も使いどころが微妙な気がします。

注意点(mamorio)

mamorioのプッシュ通知はたんなるプッシュ通知なので、スマートフォンがマナーモードの場合は音はなりません。

mamorioではmamorioアンテナというアプリを使うと、自分のmamorinoタグがアンテナの近くに入った、出た、という情報の通知を受けられるようです。

たとえば自宅にmamorinoアンテナをインストールしたタブレットを置いておき、子供のカバンにmamorioアンテナをつけておけば、学校に行った、帰宅した、などの情報がとれます。

あるいは公共施設の落し物センターにmamorinoアンテナがあって、自分の忘れ物にmamorinoタグ付けがついていれば、センターに届いた時点で自分のmamorinoアプリに通知が来るわけです。この時の通知では、個別のmamorioアンテナに設定した名前も通知されるようです。

これは一見便利なのですが、微妙な注意点があります。それは、自分が設置したmamorinoアンテナの近くに自分以外のmamorioタグが近接すると、そのmamorioアンテナの名前がほかのユーザーに通知されることを意味します。

つまり、mamorinoアンテナには個人を特定可能な名称は、付けてはダメだと言うことです。

私的に使うなら、番地を除いた住所を設定するのが無難な気がします。

サンデープログラマーが mamorio や TrackR を別の目的に転用したいと考えた場合の注意点

mamorioはiBeaconらしいので、手持ちのmamorioを使って何かやりたい場合は普通にiBeacon向けのプログラミングで UUID, Major, Minor を指定して検知すれば良いはずです。

shima-nigoro.hatenablog.jp

TrackR はiBeaconではなく、普通のBluetoothLEデバイスです。したがって TrackR を使って何かやりたい場合は LightBlue Explorer や nRF Connect for Mobile などを用いて解析した上で必要な実装を行うことになります。 TrackR もたぶん iBeacon だと思います。そうでないと、クラウドサーチの機能が使えないはず。だけど UUID や Majir, Minor について真面目に調べてません。すみません。

OpenWRT/LEDEの各種ログの閲覧時にMACアドレス情報にホスト名を追記するスクリプトを書いてみる

OpenWRT/LEDEではログ表示に logread コマンドを用いるわけですが、このログには WiFi への接続情報や DHCP に関する情報が出力されており、ここには MAC アドレスも記録されています。

この MAC アドレスとホスト名の紐付けは /tmp/dhcp.leases に記録されているのですけど、どの機材がどのようにアクセスしてきたかを確認したいときに logread と dhcp.leases を交互に見比べれるのは面倒です。

そこで、dhcp.leases を使って MACアドレス→ホスト名の変換を行ってくれるフィルタを描いてみました。

使用前、使用後の比較

普通に arp するとこんな感じですね。

root@LEDE:/# arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.1.80     0x1         0x2         b8:e8:56:00:00:00     *        br-lan
192.168.1.1      0x1         0x2         00:26:92:03:be:e8     *        br-lan
192.168.1.78     0x1         0x2         f4:0f:24:00:00:00     *        br-lan

これはあまりわかりやすくない。で、今回作成した mac2hostname を使うとこんな感じ。

root@LEDE:/# arp | mac2hostname 
IP address       HW type     Flags       HW address            Mask     Device
192.168.1.80     0x1         0x2         b8:e8:56:00:00:00(Macbook)     *        br-lan
192.168.1.1      0x1         0x2         00:26:92:03:be:e8     *        br-lan
192.168.1.78     0x1         0x2         f4:0f:24:00:00:00(iPhone7)     *        br-lan

これならわかりやすい。そして置換が行われていない表示されるホスト名は各機材で設定のものが用いられます。ホスト名が追記されない箇所はIPアドレス固定割当でしょうから特に支障はないはず。

#!/usr/bin/awk -f
#
# /usr/bin/mac2hostname
#
BEGIN {
    # DHCPリースの読み込み
    readDHCPLeases();
}

{
    "date -r /tmp/dhcp.leases +%s" | getline LastUpdateDHCPLease

    # DHCPリースが更新されていたら再読み込みする
    if ( LastCheckDHCPLease < LastUpdateHDCPLease ) {
        readDHCPLeases();
    }

    # 1行読み込むたびに既知のMACADDRESSを探してホスト名に置換する
    for (macaddr in mac2hostname) {
        gsub(macaddr, mac2hostname[macaddr] "(" macaddr ")" )
    }
    print $0
    fflush()
}

function readDHCPLeases() {
    LastCheckDHCPLease = systime();
    while((getline < "/tmp/dhcp.leases") > 0) {
        mac2hostname[$2]=$4
    }
}

SQLiteでサポートされないSQLの機能を確認する

Wikipediaには「SQLiteはSQL92の機能の多くを実装」と書いてあるのですが、では実装されていない機能は何だろうかと思って調べてみました。

具体的にはココに出ているのですが、 http://www.hwaci.com/sw/sqlite/omitted.html

下記5点の実装が行われていないようです。

  • RIGHT と FULL OUTER JOIN
  • ALTER TABLE の完全なサポート
  • trigger の完全なサポート
  • View への書き込み
  • GRANT と REVOKE

なお、ストアドプロシージャもSQLiteではサポートされないようです。

代わりにユーザ定義関数という仕組みがあるけれど、これはストアドプロシージャとはちょいと違う感じ。

LEDEでWLI-UC-GNMを使う設定

LEDE で WLI-UC-GNMを使う場合は kmod-rt2800-usb をインストールする

opkg install kmod-rt2800-usb

Raspberry Pi 3 や Zero W には WiFi を内蔵しているけれど、もう一つ追加しておくと無線LAN - 無線LANのブリッジができるので、これはこれで案外便利なのですよ。

Raspberry Pi 3にLEDEをインストールした後の初期設定作業を自動化する

以前に Raspberry Pi 3 + LEDE で携帯用WiFiを作る話を書きましたが、手作業でイロイロ設定するのは少々面倒くさいものです。

pslabo.hatenablog.com

そこで、uci コマンドによる初期設定スクリプトを書きました。この例では以下の設定が行えます。

出張での宿泊時に部屋のLANに繋いで使う想定の設定です。

このスクリプトは LEDE のイメージを PC で SD カードに焼いたのち、そのカードに追加インストールしておけば、初期起動時に実行するだけで設定完了します。

#!/bin/sh -x

uci set dropbear.@dropbear[0].Interface=lan

uci set dhcp.lan.ra_management='1'
uci set network.lan.ipaddr='192.168.4.1'
uci set network.lan._orig_ifname='eth0 wlan0'
uci set network.lan._orig_bridge='true'
uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.ifname='eth0'
uci set network.lan.ifname='eth0'
uci delete network.lan.ifname

uci set wireless.radio0.disabled='1'
uci set wireless.radio0.country='JP'
#uci delete network.lan.ipaddr='192.168.1.1'
#uci delete wireless.default_radio0.network='lan'
#uci delete wireless.default_radio0.ssid='LEDE'
#uci delete wireless.default_radio0.encryption='none'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.network='lan'
uci set wireless.default_radio0.ssid='[設定するSSID名]'
uci set wireless.default_radio0.key='[WPA-PSKのパスフレーズ]'
uci delete wireless.radio0.disabled='1'

実行したら uci commit 、reboot するだけで設定が有効化されます。ただしこの時点では Web UI のパスワードが未設定なので、パスワードは必ず設定してください。

LEDEでパッケージのインストール時に "package "kmod-usb-net" postinst script returned status 255." が出るのを抑止する

LEDE でパッケージのインストールを行うと、以下のようなメッセージが出る場合があります。というか kmod-usb-net をインストールしていると必ず出ます。主に、Raspberry Pi を LEDE でルータ化している場合に出る現象です。

Collected errors:
 * pkg_run_script: package "kmod-usb-net" postinst script returned status 255.
 * opkg_configure: kmod-usb-net.postinst returned 255.

Collected errors: と表示されているので気持ち悪いのですが、このエラーは無視しても大丈夫のようです。

このエラーの原因は命名規則の中で usb-net と usbnet が混在していることが原因のようです。 ただし usb-net, usbnet のいずれでも実態は無いようなので参照できないことで問題が起きることはなさそうです。

とはいえ出ない方が精神衛生上よろしいので、とりあえずメッセージを抑止する方法をメモとして残しておきます。

下記の1行をシェルから実行するだけです。Webの管理画面から同様の変更が行えるかどうかは調べていません。

cp -p /etc/modules.d/usb-net /etc/modules.d/usbnet

Ubuntu 16.04 で Desktop を後から追加したり、それをさらに無効化したりする

Ubuntu 16.04 を Desktop 無しでインストールした環境に対して、後から Desktop を追加したくなった場合のコマンドはこれ

$ sudo apt install ubuntu-desktop

そして、追加したのは良いけれど常時使いたいわけではないので、普段は無効化しておくことにする。

OS起動時にDesktopを有効化する、しないの設定は以下のコマンドでOK。

# ログイン時の Desktop を無効化
$ sudo systemctl set-default multi-user.target 

# ログイン時の Desktop を有効化
$ sudo systemctl set-default graphical.target

# 現在のログイン時設定の確認
$ sudo systemctl get-default

またOS起動後に Desktop を起動、停止したい場合は以下のコマンドで行う

# Desktop の起動
$ sudo systemctl start lightdm

# Desktop の停止
$ sudo systemctl stop lightdm