IT

Roombaバッテリー交換

昨年9月に互換バッテリーに交換した「ルンバ577」。

交換用バッテリ

珍しく純正ですが…何か?

毎晩定期運転+αで酷使していたところ、1年と持たず10ヶ月ほどでホームベースに戻れないようになってきた。

最初に買った「ルンバ560」のバッテリーが2年以上持った事を考えると、4500mAの大容量で半額以下と言えども10ヶ月しか持たないのでは互換品の方が安いとも言い難いので、今度は純正のルンバ交換用バッテリーを調達。

さすがに定価の1万円で調達できるほど優雅ではないが、Amazonや楽天だと純正品と思っても互換品が届く恐れも多分にあるので、14%OFF+10%還元で実質8,352円だったヨドバシから調達。

さて、どれくらい持つかな…

参照

ヨドバシ.com http://www.yodobashi.com/

アイロボット https://store.irobot-jp.com/

SAQ2 JAPAN

総務省が発表した「SAQ2(サクサク)JAPAN Project」。サッカー日本代表、通称「ザックジャパン」関連の事かと思ったらさにあらず。

東京オリンピック/パラリンピックが開催される2020年を見据え、訪日外国人向けの無料Wi-Fi環境などを整備するためのアクションプラン…という事だが、真っ先に上げられたパブリックなWiFi環境や、プリペイド式SIMカードによるモバイル通信環境の整備というのは地方自治体や民間レベルで現実にどんどん展開されているので、今更政府が旗を振う必要がどこにあるのかと思う。

一方、INTERNET Watchの記事でも触れられている「外国人旅行者の“技適なし”端末の取り扱い」についてはナイスな着目で、確かに大出力で電波障害などを誘引する邪悪な無線装置などを排除する為に「技術基準適合証明」が必要というのは理解できるのだが、グローバルモデルの携帯端末でもいちいち日本独自の証明が必要というのはいかにも世知辛い印象でなんだか切ない。

日本の「技術基準適合証明」があったところで対応バンドや通信方式の違いがある(例えばmova端末はもう使えない)し、キャリアロックやSIMロックなどの妙な足枷もあるので、実際に通信ができるかどうかはまた別の話だ。

どうせならば外国人旅行者に限らず広く国民に喜ばれるよう、欧米の認証も国内のそれと同等と認めるとか、大胆な規制緩和を期待したい。

技適だけでなく、携帯電話への課税検討とかやってる暇あったら売上高の0.2%と激安に設定されているテレビの電波利用料とかも見直して欲しいね。消費税アップの一方で電波利用料下げ、改正電波法が成立 携帯会社の負担軽減とか、どう考えてもアンバランスでしょう。

TPPや集団的自衛権よりも、電波オークションを実現して国債を少しでも早く償還する方が優先だと思うのだけれど。

参照

INTERNET Watch http://internet.watch.impress.co.jp/

総務省 http://www.soumu.go.jp/

河野太郎公式ブログ ごまめの歯ぎしり http://www.taro.org/

総務省 電波利用ホームページ http://www.tele.soumu.go.jp/

Wikipedia http://ja.wikipedia.org/wiki/

GPSトラッカー

待望のSIMフリーのGPSトラッカー、TR-313Jが発売されたので早速調達。税込24,948円也。

左からGT-120、TR-313、DG-100

GPSデバイス御三家

ちょうど2008年のDG-100と2009年のGT-120の間くらいのサイズだが、これで3G通信モジュールを内蔵。しかもFOMAプラスエリア対応でSIMフリーと来れば死角無し。手持ちのBB.exciteモバイルLTEもAPN設定をするだけで問題無く使えた。

ちなみにAPN等のプロバイダ情報はUSBで接続したWindowsのezToolユーティリティから設定する必要がある。説明書には

電源ボタンを押し、電源ランプを赤く点滅させます。

と書いてあるが「電源ボタン」は長押しでなくワンタッチ。インジケータが一瞬赤くなったかな?という程度で良い。Windows 7が新しいUSBデバイスの接続を検出し、「STM32 Virtual COM Port」と認識してくれるのでセットアップウィザードに従ってWindows Updateからドライバを導入すればOKだ。

しかし、ハードウェア用に推奨されるドライバーや更新プログラムを自動的に取得する機能を有効にしていなかったので、いつまで経ってもezToolユーティリティがCOMポートを認識せずに困ったけれどもな。

ちなみに5分間隔の設定でトラッキングさせてみたところ、朝9時から19時過ぎまで10時間ほどの稼動でバッテリー残量は43%となったので、まぁ実働1日というところか。

位置情報はWebブラウザからezfinderにアクセスする事で"現在位置"と"履歴"が確認出来るが、ezToolユーティリティから本体に設定する「レポート間隔」というのは「GPS情報の採取」と「アップロード」の両方を含むようだ。つまり、ビル陰や電車の移動などで偶々そのタイミングでGPSを捕捉できない"おしい状況"だった場合でも、ずっと地下街に籠っていた"絶望的な状況"と同じ結果になるという事だ。

また仕様に「ログ記録件数」の記載が無かったのが引っかかっていたのだが、後からUSBで接続して航跡ログを吸い上げるという事もできないようなので、どうやら内部ではトラッキングログは全く保存されていないものと推察される。…という流れを纏めると、航跡ログの粒度は最高でも「レポート間隔」。不幸にして**“GPSの捕捉”と“モバイル通信”**のいずれか一方でも失敗すれば当該セクタの位置情報は完全に失われる為、粒度は低めに推移しそうな予感。

GlobalSat製なのでDG-100のような洗練されたGPSロガーに"オンライン機能が付加された"ものを期待したのだが、みまもりケータイやあんしんGPSと同様に**“オンライン専用”**という思想だったというのは少なからず期待外れ。

【訂正】みまもりGPSは旅行やジョギングのルートを記録できるそうなので、どうやら航跡ログが採れるらしい。

このままでは何とも使い道が微妙なので、まずはTraccarには対応させ、ezfinder無償版の履歴(航跡)が1日分しか見られない問題くらいは乗り越えたい。

ところで、GT-120はいつまで経っても充電が終わらないのだが、ついに内蔵バッテリーが死んでしまったかな…

参照

INTERNET Watch http://internet.watch.impress.co.jp/

GPS受信機とロガーの通販【GPSDGPS】 http://www.gpsdgps.com/

3G/GPSトラッカーサイト http://www.trackers.jp/

MobileAction日本正規代理店 http://www.i-gotu.jp/

GlobalSat http://www.globalsat.com.tw/

ezfinder Tracking Portal http://www.ezfinder.com.tw/

Traccar - open source GPS tracking system http://www.traccar.org/

児童ポルノ禁止法改正

昨年書いた「児童ポルノ禁止法改悪案」。マスコミが「集団的自衛権」を巡る自公の攻防ばかりに目を奪われている隙に6月5日の衆院本会議に続いて「捜査権の濫用防止」等の附帯決議と共に参議院法務委で可決された。

漫画やアニメ、CGについては対象外になったのは良かったが、「みずからの性的好奇心を満たす目的」って捜査当局はどうやって立証するつもりなんだろうか?

「単純所持の罰則適用」については「国際社会からの批判」を理由にしている事からも、やっぱり「子どもを守るという視点」を欠いた大人の事情だけが後押ししているような印象を受ける。

育児放棄や虐待で生命の危機に瀕している子供達に手を差し伸べる方がよほど先だと思うのだが…

参照

ITmedia ニュース http://www.itmedia.co.jp/news/

弁護士ドットコム http://www.bengo4.com/

NHKニュース http://www3.nhk.or.jp/news/

参議院議員 山田太郎 http://taroyamada.jp/

ハフィントンポスト http://www.huffingtonpost.jp/

fplug_for_linux

先日導入したgoto2048/fplug_for_linux。

F-PLUG

F-PLUG

ゴミデータっぽい値が採れたりしたので改修にトライしていたが、シリアル通信のパラメータやリトライ手順など地道にプロトコル実装を固める事で、1週間以上連続で安定して(ペアリングも解除されずに)計測できる事を確認した。

ポイントとしては

RTS/CTSによるフロー制御 Rawモード送信 非カノニカル受信 応答が無い場合は要求を再送信

で、最終版のfpstatusは以下の通り。

#include <stdint.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "fplug.h"
#undef  DEBUG
#define ENOTCONN_RETRY_MAX      10
#define MSG_RETRY_MAX           5
#define FPLUG_EXEC(fd,msg,buf)  fplug_exec((fd),(msg),sizeof((msg)),(buf),sizeof((buf)))
typedef unsigned char uchar;
static uint16_t tid = 0x0001;
void hunt_tid(uchar *buf)
{
    *(uint16_t *)&buf[2] = tid++;
}
typedef uchar uchar;
static void dump_message( char *mes, uchar *buf, int size  )
{
#ifdef DEBUG
    int cnt;
    printf( "%s", mes );
    for ( cnt=0; cnt<size; cnt++ ) {
        printf( "%02X,", buf[cnt] );
    }
    printf( "\n" );
#endif
    return;
}
int fplug_exec(int fd, uchar *req_msg, size_t req_len, uchar *res_buf, size_t bufsiz)
{
    struct timespec tmspec = { 0, 1000 * 1000 };
    int ret, i, j;
    uchar req_buf[BUFSIZ];
    memcpy(req_buf, req_msg, req_len);
    for (i = 0;i < MSG_RETRY_MAX; i++ ) {
        hunt_tid(req_buf);
        dump_message( "Command:", req_buf, req_len);
        for (ret = j = 0;j < ENOTCONN_RETRY_MAX; j++ ) {
            ret = write(fd, req_buf, req_len);
            if ( ret == req_len )
                break;
#ifdef DEBUG
printf("%s:%d; write()=%d,errno=%d\n", __FILE__, __LINE__, ret, errno);
#endif
            switch ( errno ){
            case ENOTCONN :
                tmspec.tv_nsec = 500 * 1000 * 1000;
                nanosleep(&tmspec, NULL);
                break;
            }
        }
        if ( ret <= 0 )
            break;
        for (j = 0;j < MSG_RETRY_MAX && !(ret = read(fd, res_buf, bufsiz)); j++ ) {
            tmspec.tv_sec = 0;
            tmspec.tv_nsec = (j+1) * 100 * 1000 * 1000;
            nanosleep(&tmspec, NULL);
        }
        if ( ret <= 0 ){
#ifdef DEBUG
printf("%s:%d; read()=%d,errno=%d\n", __FILE__, __LINE__, ret, errno);
#endif
            continue;
        }
        dump_message( "read:", res_buf, ret );
        if (4 < ret && !memcmp(req_buf, res_buf, 4)){   // TID match
#ifdef DEBUG
printf("%s:%d; read()=%d\n", __FILE__, __LINE__, ret);
#endif
            return ret;
        }
    }
    return -1;
}
int fplug_main( int fd, int mode )
{
    int cmd;
    int cnt;
    int ret;
    int i=0;
    uchar buf[BUFSIZ];
    uchar *szMode, szResult[BUFSIZ];
    time_t timer;
    struct tm *t;
    strcpy(szResult, "x");
    szMode = szResult;
    switch(mode) {
    case 'h':
        szMode = "FP_HUMID";
        for ( i = 0; i < MSG_RETRY_MAX && 0 < (ret = FPLUG_EXEC(fd, Humid, buf)); i++ ){
            uint16_t a = *(uint16_t *)&buf[ret-2];
            if ( 100 < a )
                continue;
            sprintf(szResult, "%d", a );
            break;
        }
        break;
    case 'i':
        szMode = "FP_ILLUM";
        for ( i = 0; i < MSG_RETRY_MAX && 0 < (ret = FPLUG_EXEC(fd, Illum, buf)); i++ ){
            uint16_t a = *(uint16_t *)&buf[ret-2];
            if ( 0xFFFD < a )
                continue;
            sprintf(szResult, "%d", a );
            break;
        }
        break;
    case 't':
        szMode = "FP_TEMP";
        for ( i = 0; i < MSG_RETRY_MAX && 0 < (ret = FPLUG_EXEC(fd, Temp, buf)); i++ ){
            int16_t a = *(int16_t *)&buf[ret-2];
            if ( a < -100 || 500 < a )
                continue;
            sprintf(szResult, "%.1f", (float)a / 10);
            break;
        }
        break;
    case 'w':
        szMode = "FP_WATT";
        for ( i = 0; i < MSG_RETRY_MAX && 0 < (ret = FPLUG_EXEC(fd, RWatt, buf)); i++ ){
            int16_t a = *(int16_t *)&buf[ret-2];
            if ( 2000 < a )
                continue;
            sprintf(szResult, "%.1f", (float)a / 10);
            break;
        }
        break;
    default:
        szMode = "FP_unknown";
        break;
    }
    printf( "%s=%s;", szMode, szResult);
}
int main(int argc, char *argv[])
{
    int fd, opt;
    struct termios oldtio, newtio;
    char cmdbuf[16];
    char *cmd = cmdbuf, *cmd_all = "with";
    memset(cmdbuf, 0x00, sizeof(cmdbuf));
    while ((opt = getopt(argc, argv, cmd_all)) != -1) {
        switch (opt) {
        case 'w':
        case 'i':
        case 't':
        case 'h':
            *cmd++ = tolower(opt);
            break;
        default: /* '?' */
            fprintf(stderr, "Usage: %s [Options] device\nOptions\t-w\tPower consumption(W)\n\t-i\tIlluminance\n\t-t\tTemperature\n\t-h\tHumidity\n", argv[0]);
            exit(EXIT_FAILURE);
        }
    }
    if ( argc <= optind ){
        fprintf(stderr, "Usage: %s [Options] device\nOptions\t-w\tPower consumption(W)\n\t-i\tIlluminance\n\t-t\tTemperature\n\t-h\tHumidity\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    fd = open(argv[optind], O_RDWR);
    if ( fd < 0 ){
        perror(argv[optind]);
        return 0;
    }
    if ( !cmdbuf[0] )
        strcpy(cmdbuf, cmd_all);
    tcgetattr( fd, &oldtio );
    newtio = oldtio;
//  newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
    newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD | CRTSCTS;
    newtio.c_oflag = 0;         /* Rawモード出力 */
    newtio.c_lflag = 0;         /* 非カノニカル入力 */
    newtio.c_cc[VTIME]=0;       /* キャラクタ間タイマは未使用 */
    newtio.c_cc[VMIN]=0x00;     /* ブロック受信しない */
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);
    for ( cmd = cmdbuf; cmd && *cmd; cmd++ )
        fplug_main(fd, *cmd);
    printf( "\n");
    tcsetattr(fd, TCSANOW, &oldtio);
    close(fd);
    return 0;
}

これで期待通りにデータが採れるようになった。

RFC2616 is Dead

HTTPの標準規格が15年ぶりに改訂、文書を6分割し改善仕様を盛り込むという記事に触発され、RFC-Editor Webpageを見て卒倒しそうになった。

Hypertext Transfer Protocol

en.wikipedia.orgより

RFC 7230 - (HTTP/1.1): Message Syntax and Routing RFC 7231 - (HTTP/1.1): Semantics and Content RFC 7232 - (HTTP/1.1): Conditional Requests RFC 7233 - (HTTP/1.1): Range Requests RFC 7234 - (HTTP/1.1): Caching RFC 7235 - (HTTP/1.1): Authentication RFC 7236 - Initial Hypertext Transfer Protocol (HTTP) Authentication Scheme Registrations RFC 7237 - Initial Hypertext Transfer Protocol (HTTP) Method Registrations RFC 7238 - The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect) RFC 7239 - Forwarded HTTP Extension 合わせて10本はなかなかのボリュームで目眩がする。

ストビュー着々

ニュース ちょっと前だけど ストリートビュー

波照間島より

波照間の素泊り宿 美波のオーナーが主催するブログ波照間島によると1ヶ月ほど前にルーフにカメラを載せたストリートビュー撮影車が来て撮影していったそうだ。最近はプリウスばかりでは無くインプレッサもあるんだなぁ。

気が付いたらウチの実家の前も対応済みだし、昨年11月に目撃された喜界島を始めとした、沖永良部や与論島など奄美群島の大部分の道路は既に対応済みとなっているので、そろそろ携帯電話のエリアを越えてしまう日も近いのかもね。

港ターミナルでWiFi可能にという話は、竹富町FREE Wi-Fiの一環で石垣港離島ターミナルを中心に竹富島や西表島はおろか、鳩間島、小浜島、黒島を含めた21箇所に無料のWiFiスポットを整備したと言う事だ。ほっほ~、なかなかやるね。

参照

波照間の宿 美波 日本最南端 http://homepage2.nifty.com/minami85/

波照間島 http://minami85.ti-da.net/

安栄観光 - スタッフブログ http://www.aneikankou.co.jp/staffblog/

フルノシステムズ http://www.furunosystems.co.jp/

Wikipedia http://ja.wikipedia.org/wiki/

スマ放題

スマホ時代の新料金プラン「スマ放題」登場!

スマ放題特設サイトより

ソフトバンクの『スマ放題』6月11日から申し込み開始、ドコモの「カケホーダイ&パケあえる」との差分は「データくりこし」「家族おトク割」との事。

「データくりこし」は5Gバイト以上のプランのみが対象で、「家族おトク割」と「家族データシェア」は併用不可だそうだ。

参照

ITmedia Mobile http://www.itmedia.co.jp/mobile/

Engadget Japanese http://japanese.engadget.com/

ケータイ Watch http://k-tai.impress.co.jp/

ソフトバンク http://www.softbank.jp/

ソフトバンクモバイル http://www.softbank.jp/mobile/

Wikipedia http://ja.wikipedia.org/wiki/

Infostealer.Bankeiya

2月にIeの脆弱性を突いて感染を広めたマルウェア、Infostealer.Bankeiya。INTERNET Watchの記事によると

不正プログラムは、日本のインターネットバンキング利用者を狙う不正プログラム「Infostealer.Bankeiya」で、ゆうちょ銀行とみずほ銀行のオンラインバンキングへのアクセスを監視し、アクセス時に偽のログイン画面を表示し、IDやパスワード、第2暗証番号などの情報を盗もうとするものだという。

という発表から、具体的に日本人を狙った攻撃が始まったという事で注目を集めていた。

5月になってFlashの脆弱性を突いて感染する亜種のInfostealer.Bankeiya.Bが発生、旅行代理店の「his-j.com」、ブログサイトの「jugem.jp」、動画共有サイトの「pandora.tv」が侵害されていた事が明らかになっているが、今度はバッファローのダウンロードサーバで公開されていたソフトにも感染していた事が判明。

著名な企業の公式サイトが侵害され、マルウェア感染を拡げる形となった事態はかなり深刻だ。

しかし@ITの記事にもあるように何となく表に出ている問題ではなく、業務委託先であるコンテンツプロバイダの問題であるように思える。バッファローの委託先であるCDNetworksにしても、第一報のセキュリティ侵害に関するお知らせなんてどことなく呑気なタイトルだし、本日発表された経過報告にしても原因については未だに「推測」の域を出ないままという体たらくで、何となく「認証サーバ経由への移行作業における些細な不手際から侵入を許してしまった」というところに着地しそうな気配すらあり、そんなとこに任せておいて大丈夫なのかな?と心配になる。

取り敢えず、各種アンチウィルスソフトのアップデートと、59件ものIeの脆弱性修正を含む6月の月例セキュリティパッチ、「Flash Player」「Adobe AIR」の脆弱性を修正したバージョン「14」を適用しましょう。

参照

@IT http://www.atmarkit.co.jp/

INTERNET Watch http://internet.watch.impress.co.jp/

ITpro http://itpro.nikkeibp.co.jp/

マイナビニュース http://news.mynavi.jp/

Symantec Connect コミュニティ http://www.symantec.com/

Heartbleed

Heartbleed

http://heartbleed.com/より

今年4月、OpenSSLに発見されたCVE-2014-0160通称ハートブリード問題。

幸いにしてHeartbeat機能が未実装される前のレガシーなUbuntu 10.04ベースだった「自宅サーバ」や「さくらVPSな自前サーバ」は影響を受けないという事だったので、騒動を静観しつつ各方面の情報を整理してみたが、具体的に言うと

OpenSSL 1.0.1 から 1.0.1f および 1.0.2beta1 において Heartbeat メッセージの処理において境界チェックの問題があり、OpenSSL が動作しているマシンのメモリ情報を取得可能な状態にあった

という事で、「Heartbeat RequestのPayload lengthが実際の長さより大きかった場合のケアが不足していた」というお粗末なバグな雰囲気だ。

狙った情報がピンポイントで採れるわけでは無いものの「サーバーの秘密鍵やパスワード等が漏洩」する**“可能性がある”のは間違い無い事からそれなりに深刻な問題である事は否定しないが、それにしてもGW前に起こったセキュリティ アドバイザリ 2963983 – Internet Explorer の脆弱性により、リモートでコードが実行されると同様にマスメディアの騒ぎ方は甚だ不自然**な印象を受ける。

先週は**「CCS Injection脆弱性」**CVE-2014-0224が見つかった。OpenSSLのハンドシェーク中にChangeCipherSpecを受け付けてしまう事で「弱い鍵」を使用させるよう仕向けられ、暗号化通信の内容を第三者(=攻撃者)が読み取ったり、改ざんしたりする事が可能になるそうだ。

UbuntuUpdatesのPackage “openssl” (trusty 14.04)でチェックしたところ"Latest version:1.0.1f-1ubuntu2.2"で「対応済み」のようなのでひと安心。

16年もの長い間発見できなかった問題を発見したのは株式会社レピダムの菊池正史氏という事で、珍しく日本語による詳細な経緯も公開されているが、ハートブリード問題を受けて「OpenSSLのコードって実際のところ大丈夫なのかな?」と思ったのが発端だったとかなかなか興味深い。

「大丈夫?」という意味では2010年に1.0になったばかりのOpenSSLだが、1998年の0.9.1から15年以上(暗号技術の輸出規制もあって表面化していないが実際はそれ以前から)開発が続いている経緯としがらみからブラックボックスがあるのかもと思われるので、“よりセキュアな実装"を目指しているLibReSSLにも期待したい。

参照

@IT http://www.atmarkit.co.jp/

UbuntuUpdates http://www.ubuntuupdates.org/

OpenSSL http://www.openssl.org/

CVE https://cve.mitre.org/