IE11の互換性の変更点

何気にアクセスログ解析を見たところ、ブラウザ別アクセス数で"Mozilla/5.0"が1位になっているのに気付いた。

Netscapeシリーズかと思ったらそうではなく、昨年11月にリリースされた「Internet Explorer 11」で「ユーザーエージェント文字列が変更されたらしい。

**“compatible”とか“MSIE”というトークンが無くなる一方で“like Gecko”**トークンが追加されるという大胆な変更は、「今までのIEとは違う」という立ち位置を表すもので、Windows 8.1のInternet Explorer 11では

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

Windows 7のInternet Explorer 11では

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

となっているそうだ。

他にもIE11 の互換性の変更点が公開されているので、参考にされたい。

ついでに64bit版「Google Chrome」も出たよ。

参照

Windows デベロッパー センター http://msdn.microsoft.com/ja-JP/windows/

ITmedia PC USER http://www.itmedia.co.jp/pcuser/

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

窓の杜 http://www.forest.impress.co.jp/

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

TrustyとPT2

Ubuntu 14.04(Trusty Tahr)を入れたML110G7へのサーバ移行作業。

earthsoft PT2

アースソフト PT2

F-PLUGBluetoothのペアリングが解除される問題が残っているものの、それ以外は特に問題無い事が確認出来たので全面的にML110G7へ移そうかと思ったのだが、ML110G7にはPCIスロットが全く無いのでPT2が浮いてしまう事に気付いた。

改めて整理するとGT110b自体は昨年2月にB75マザーGIGABYTE GA-B75M-D3Hへ喚装済み。という事はハード的にはUSB3.0やSATA3.0もReadyで、問題の根幹はOSであるUbuntu 10.04が古い事に尽きる。

とは言えアップデートに手間取ってGT110bを長時間止めるわけにもいかないのでML110G7へ移行すべしと相成ったわけだが、クリティカルなサービスはML110G7に移行してしまったので、改めてGT110bをアップデートしてみる事にする。

まずはML110G7の時と同じ手順で、ターミナルから

yano@GT110b:~$ **sudo apt-get install update-manager-core**
yano@GT110b:~$ **sudo do-release-upgrade -d**

を投入する手順でトライしてみたが、どうもCPAN/Perl絡みで残骸由来の不整合が残っている(俗に言う「腐った」状態)らしくエラー終了してしまった。

10.04からだと12.04、14.04と2段階上げなければならない事も考慮してオンラインアップグレードを諦め、CD-ROMからクリーンインストールを実施。欲張ったのが災いした区画設定のミスなどでやり直す羽目にも陥ったが、3度目の正直で無事導入完了。

なお、B75マザーGIGABYTE GA-B75M-D3Hでもbiosdevnameの問題が発生。/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT

# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
**GRUB_CMDLINE_LINUX_DEFAULT**="nosplash biosdevname=0"
GRUB_CMDLINE_LINUX=""

と追記して、

$ sudo update-grub2

とする必要があった。

さてカードリーダーSCR3310-NTTComのインストールは

yano@GT110b:~$ **sudo apt-get install libccid pcsc-tools libpcsclite-dev pcscd**
yano@GT110b:~$ **sudo pcsc_scan**

でOK。pt3_drvML110G7に展開したhttps://github.com/m-tsudo/pt3.gitのソースツリーをコピー&インストールして、

blacklist earth-pt1

と書いた/etc/modprobe.d/blacklist-earth-pt1.confを用意するだけでOKかと思いきや、

yano@GT110b:~$ **sudo modprobe pt3_drv**

とやっても/dev/pt3video?ができない問題に直面。

いろいろと調べてみてもよくわからなかったのだが、一晩置いてよく考えたらGT110bに実装しているのはPT3ではなくPT2なので、pt3_drvではなくpt1_drvが正解。いくらpt3_drvをロードしたところで/dev/pt3video?ができないのは当たり前というオチだった。

しかし、手元の

トワイライトエクスプレスも終了

不定期ながら国内最長のブルートレイントワイライトエクスプレス

大阪~札幌の寝台特急『トワイライトエクスプレス』来春廃止へ

レスポンス記事より

JR西日本の豪華寝台列車、10両編成で定員30人程度にという明るい話題の裏で、2015年春の廃止がアナウンスされた。

まぁ、時間の問題というのは火を見るより明らかだったが、やはり縁が無いままに終ってしまいそうだなぁ。

夏休みに向けて山口線の復旧に伴うSL「やまぐち」運行計画を発表とか、JR 2014年夏の臨時列車で「あけぼの」が18日間運転西鉄313形の旧塗装車、5月23日から運転開始という明るい話題の方に注目するかな。

参照

レスポンス(Response.jp) http://response.jp/

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

Tetsudo.com(鉄道コム) http://www.tetsudo.com/

トワイライトエクスプレス http://www.jwfsn.com/twilight/

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

田植え体験

今日は昨年に引き続き小石原で田植え体験。

田植えを背景にどろんこ遊びに熱中!

どろんこ遊びに熱中!

しかも5月の連休到津の森公園で遊んだ"ayanoちゃん"と一緒と言う事で、小石原公民館で合流した直後からテンション最高潮。

今年は長靴や軍手は最初から用意せず草履で参戦。トイレを済ませた後は5分ほど歩いた後、裸足で田んぼへ。

3列ほど進んだところで、「気持ち悪い」と言っていた"ayanoちゃん"がリタイヤ。“なっちゃん"も仲良しがいなくなった事ですぐに飽きてリタイヤしてしまったが、その後はアマガエルを捕まえたり愉しく遊んだね。

ちょっと泣いたりもしたけれど、お昼ご飯も一膳ペロッと平らげたし、昼からは山に登ったり行者杉を観に行ったりしたけれど、終始元気元気な2人でした。

7月になったらまた棚田親水公園にでも遊びに来ようかね。

参照

福岡県東峰村 http://www1.vill.toho.fukuoka.jp/

Facebook https://www.facebook.com/

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

ハンバーガーSUKEYA

なっちゃんとハンバーガー

手作りハンバーガー「SUKEYA」にて

今日のランチは箱崎小学校の裏手、住宅街にひっそりと佇む手作りハンバーガー「SUKEYA」へ。

カリッと焼き上げられたバンズに手作りのパティがベストマッチ。トマトとピクルス、ベーコンと卵、レタスと千切りキャベツで野菜もたっぷり。全部載せると大変な事になりそうな勢い。

まさに佐世保バーガーに匹敵するボリュームとクオリティで550円。ドリンクも大きなコップにたっぷりで150円~だし、箱崎っぽい良心を感じる。

お昼時とあってテイクアウトのお客さんもひっきりなしに来ていたよ。

ハンバーガーSUKEYA TEL:092-204-2000 月曜定休 11時半~15時、18~21時
〒812-0053 福岡市東区箱崎2-2-27

参照

Hamburger SUKEYA(スケヤ) http://www.sukeya.biz/

食べログ http://tabelog.com/

Facebook https://www.facebook.com/

ホットシューカバー

2012年12月に調達したOLYMPUS PEN Lite E-PL5

ホットシューカバー復活

PEN Lite E-PL5

なんだかんだで1年半になるものの、ストロボ撮影なんて数えるほどもしないので全く気付かなかったのだが、いつしか「ホットシューカバー」が無くなっていた。

機能的には全く問題無く、単に気分の問題だが…やっぱり気分がよろしくないので、速やかに調達しようと手配を試みたのだが、どういうわけかヨドバシやAmazonはおろか、本家オリンパスのオンラインショップですら取り扱いが無く、安そうな割に予想外に入手困難な代物である事に気付いた。

唯一取り扱いがあったのが、【楽天市場】カメラのミツバ。1個200円、メール便送料164円というのは決して手が出ない価格ではないのだが、何となくここで妥協したら「負け」のような気がしてカートに入れたところで、調査を再開。

一般に流通していない事を考えると、どうやら修理用の保守部品としてのみ存在するものと推察されるので、オリンパスサービスステーションに相談すれば手に入る可能性がありそうだ。

というわけで、ようやく平日の天神方面に出掛ける用事があったので、渡辺通りオリンパスサービスステーション福岡に問合せて目論み通り調達に成功。

1個100円だったので、また紛失する可能性を考えて2個査収。税込216円で済んだのは作戦勝ちと言っていいだろう。

参照

オリンパスイメージング http://olympus-imaging.jp/

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

TrustyとIPMI

ようやく落ち着いたかに見えるgoto2048/fplug_for_linuxによる消費電力測定。

明るさや温度、湿度も測れるというので調子に乗っていろいろと試してみているのだが、実は激安と言えどもサーバグレードであるHP ProLiant ML110 G7には筐体内にも多数のセンサが実装されていて、HP Integrated Lights-Out 3 (iLO 3)でリモート監視できるようになっている。

「折角なのでこちらもゴニョゴニョできないかしらね…?」とグルグル調べてみたところ、何気にIntelligent Platform Management Interface (IPMI)と互換性がある事から、LinuxベースでもOpenIPMIによって取得できる事がわかったので、Kodai’s Blog: Ubuntu 9.10でML115のIPMIを利用する【自宅サーバ構築】9. HP ProLiant ML110 G7で温度とFAN回転率解析: Pythonと自分 ~ a python lifeを参考にUbuntu 14.04(Trusty Tahr)ベースでトライした。

基本的には

yano@ML110G7:~$ sudo apt-get install openipmi ipmitool
yano@ML110G7:~$ sudo /etc/init.d/ipmievd start
yano@ML110G7:~$ sudo /etc/init.d/openipmi start

すれば良いだけなのだが、/dev/ipmi0がお馴染みの**“No such file or directory”**というエラーになった。

しかし、手動で

yano@ML110G7:~$ sudo modprobe ipmi_si
yano@ML110G7:~$ sudo modprobe ipmi_msghandler
yano@ML110G7:~$ sudo modprobe ipmi_poweroff
yano@ML110G7:~$ sudo modprobe ipmi_devintf
yano@ML110G7:~$ sudo modprobe ipmi_watchdog
yano@ML110G7:~$ sudo /etc/init.d/ipmievd start
yano@ML110G7:~$ sudo /etc/init.d/openipmi start

する分には大丈夫なのでよくよく調べてみると、

fplug_for_linux

先日導入したgoto2048/fplug_for_linux

F-PLUG

F-PLUG

温度(Temperature)の応答メッセージが1バイト短い問題は、ひとまずデータの最後から2バイトに注目するように改修したのだが、やはり「1バイト短い」だけではなく別種別の応答が返ってくる事例もあってゴミデータっぽい値となっている事がわかった。

そういうわけで定石通り「SEOJクラスコード」が期待と違ったらリトライするようにしようかと思ったのだが、そこで温度(Temperature)の応答メッセージで「SEOJクラスコード」が漏れる問題に再び行く手を阻まれた。

もしかして、TIDが使われていない(常時ゼロ)のが問題なのではないか?というのも気になったので、カウントアップするTIDを載せてみたものの結果は変わらず。しかし、「SEOJクラスコード」が無くても「TIDがある」事で各情報の要求と応答メッセージが紐付けできるようになるので、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 <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("write()=%d,errno=%d\n", ret, errno);
#endif
            switch ( errno ){
            case ENOTCONN :
                tmspec.tv_nsec = 500 * 1000 * 1000;
                nanosleep(&tmspec, NULL);
                break;
            }
        }
        if ( ret <= 0 )
            break;
        tmspec.tv_sec = 0;
        tmspec.tv_nsec = 250 * 1000 * 1000;
        nanosleep(&tmspec, NULL);
        ret = read(fd, res_buf, bufsiz);
        if ( ret <= 0 )
            continue;
        dump_message( "read:", res_buf, ret );
        if (4 < ret && !memcmp(req_buf, res_buf, 4)){   // TID match
#ifdef DEBUG
printf("read()=%d,errno=%d\n", ret, errno);
#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, "--");
    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;
    struct termios oldtio, newtio;
    char *cmd;
    if ( argc == 1 ) {
        printf("Usage: fpstatus <option>\n");
        return(0);
    }
    if ( *argv[1] == '-' ) argv[1]++;
    fd = open(SERIAL_PORT, O_RDWR);
    if ( fd < 0 ){
        perror("open(/dev/rfcomm0)");
        return 0;
    }
    tcgetattr( fd, &oldtio );
    newtio = oldtio;
    newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
    tcsetattr(fd, TCSANOW, &newtio);
    for ( cmd = argv[1]; cmd && *cmd; cmd++ )
        fplug_main(fd, *cmd);
    printf( "\n");
    tcsetattr(fd, TCSANOW, &oldtio);
    close(fd);
    return 0;
}

受信メッセージが期待する種別の応答でない場合は新しいTIDをアサインして要求からリトライする。5回送信しても期待する種別の応答が得られなかった場合、取得値は"–“となる。

カムラッチハンドル

リフォームして3年になる築20余年の我が家。

カムラッチハンドル

カムラッチハンドルDC-640

4月にリビングのサッシを全てペアガラスに交換してもらったばかりなのに、先週出窓のハンドルが1つ壊れてしまった。築20余年なのでどこが壊れても不思議ではないのだが、タイミングが悪すぎる。

早速先般の業者に相談したところ、4箇所で2万円強。しかも2週間掛かるという事なので返答を保留し、善後策を再検討。

サッシのハンドルなんて仕組みは単純な製品なのでホームセンターにも代替品があるんじゃないかとググってみたところ、中西産業株式会社カムラッチハンドルがいい感じで使えそうだ。

特にDC-640なんてそっくり…と思ったら、取り扱い店のオカノ金属株式会社の住所って福岡市博多区半道橋…すぐ近くじゃないですか。

というわけで、問合せてみたところ残念ながらDC-640はシルバーしか在庫が無いという事だったが、カーテンの陰に隠れるハンドルと交換してしまえば大丈夫なので、奥さんに速攻で出動して貰って調達。なんと990円。4つ買っても4000円しないというのは「勝った」感がある。

ちなみにブロンズ加工に2週間掛かるという事だったので、リフォーム業者の見積り結果も同じ事情だったのだろう。ところでブロンズ加工ってどれくらい加算されるのかな…

参照

中西産業株式会社 http://www.nakanishi-sangyo.co.jp/

オカノ金属株式会社 http://okanokinzoku.com/

サッシ金物専門 オカノ金属株式会社 通信販売部 http://ec.okanokinzoku.com/

楽天BOX

楽天で注文した商品を受け取れる宅配ロッカーが「なんば駅」と「関西大学」に登場という話。

通販商品の受け取り用ロッカー「楽天BOX」開始

Engadget 日本版より

「なんと関西大学に登場」ってどういう事かと思ったら、「なんば駅と関西大学に登場」だったのはさておき。

最寄り駅ならいざ知らず、わざわざ「なんば」から持って帰るメリットって一体…、楽天ブックス@コンビニ受取便でいいんじゃないの?と思ったのだが、楽天ブックスの商品に限らず楽天市場全体が対象となるのがメリットかな。

と思ったのだが、実は対応店舗は3店舗ほどに過ぎないという事なので、Amazon.co.jpのコンビニ受取はおろか楽天ブックス@コンビニ受取便以上にこぢんまりとした案件のようだ。orz

まずは、どれほどの利用者がいるのか興味深い。

参照

Engadget 日本版 http://japanese.engadget.com/

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

【楽天市場】楽天BOX http://event.rakuten.co.jp/r-box/