2016年06月12日

Elecomの無線LANポータブルルーターを子機モードで使う際の問題点

本当はもっと詳細なものを途中まで書いてたんだけど、問題が次々出てきて面倒臭くなってやめた。
本題
以下、モバイルルータではなくポータブルルータであることに注意。
ここでは、モバイルルータは移動中に利用するもの、ポータブルルータは持ち運びしやすいように小型化したもの、という理解で良いと思う。

Elecomは『無線LANポータブルルーター』という持ち歩きに便利なルータを販売している。
例えば、出張先のホテルに有線LANしかない場合でも、ポータブルルータにLANケーブルを繋げば無線LANが使えるようになる。
一人で複数の無線LAN端末を持っている今の時代、非常に便利な製品ではなる。
尚且つ安価だ。
最新の上位機種では、IEEE 802.11acにも対応している。

このシリーズの比較的新しい機種は、子機モードというのを備えている。
子機モードというのは、有線LANにしか対応していない機器を無線化させる機能だ。
ちょっと前までは、このような事をしようとすると、家庭用ルータのミドルクラスの製品を購入しないといけなかったが、これにより安価で実現できるようになった。
うちではこの目的のために複数の機種を持っている。
ルータには推奨接続数というのがあるが、子機モードで使う場合は配下に接続する端末は1,2台のため、問題にはならないはず。

ところがこの子機モード、現状で使うには色々問題が発生する事がわかった。

ここでは、元からあったネットワークをネットワークA、ポータブルルータで新たに作成されるネットワークをネットワークBとする。
また、ネットワークAに接続してる端末を端末A、ネットワークBに接続している端末を端末Bとする。
検証に使ったのはWRH-300XX2シリーズのWRH-300BK2という機種。ちなみに、他の機種のうちいくつかに似たような挙動をするものがあった。
手順
工場出荷時、他の設定をすることなく動作モードの子機モードを選択
子機モードに切り替えるため再起動
無線設定でネットワークAの無線LANのSSIDとパスワードを設定
設定を反映させるため再起動
何が起きるのか
この時、ポータブルルータにはIPアドレス「192.168.2.251」が振られる。
(IPアドレスは設定画面で変更可能。)
ネットワークAがDHCPの場合、ポータブルルータにもIPアドレスが振られるが、「192.168.2.251」は有効のままとなる。
つまり、ネットワークAのDHCPが「192.168.1.0/24」で運用されていた場合、ポータブルルータには「192.168.2.251」と例えば「192.168.1.2」のようなIPアドレスとなる。
また、端末Bには「192.168.1.3」のようなIPアドレスが振られる。
ポータブルルータは、HTTPでアクセスする設定画面のために80番ポートと、DNSのために53番ポートを開いている。
問題1
一見正常に動作しているように思えるが、ポータブルルータはネットワークA側も53番ポートを開いてしまっているため、なんらかのきっかけで端末AはポータブルルータのDNSを見にいくようになってしまう。
ネットワークAに設置された正規のDNSにリレーされていれば問題ないのかもしれないが、実際はリレーされない。
一旦こうなると、端末Aはインターネットに接続できなくなる。
問題2
ネットワークAの系が「192.168.2.0/24」だった場合に起こる。
端末Aから「192.168.2.251」にアクセスするとポータブルルータが簡単に見える。
つまり、端末Aから「http://192.168.2.251/」で設定画面へのログイン画面が表示されるようになる。
設定画面は、ネットワークAから見えるかどうか選択できるようにするか、ネットワークBからしか見えないようにすべきだと思う。
問題3
ネットワークAにポータブルルータが2つ接続された場合、同じIPアドレスに「192.168.2.251」が2つ存在してしまう。
同一ネットワークに同じIPアドレスが存在すると何が問題なのかは説明するまでもないよね。
製品のサイトを見るとホテルで使う事を想定しているが(製品名のWRHは多分Wireless Router Hotelの略)、不特定多数が宿泊するホテルだと起きる可能性が高くなるというのは皮肉にしかならない。
所感等
うちの環境で問題1が度々起きていたが、再現がなかなかできないため原因特定までに2ヶ月もかかってしまった...。
問題1の整理をしていたら、さらに問題2,3が見つかって流石に疲れた。
非常に迷惑な挙動としか言いようがない。
どうすべきかというと、まずネットワークA側にはDNSとHTTPは開けないほうが良いと思う。
あと、DHCPの有効無効が選択できるようにすることと、ネットワークAのDHCPを無視しないことかなあ。
実は見つかった問題は他にもあるけど、ここに書くのは上記3つにしておく。
詳細は書かないけどハードウェアメーカーらしくソフトウェアに難があり、「あー、一部で話題になってたのってこれね」と思った。
正直、ソフトウェアにももう少し力を入れたほうが良いと思った。
Elecomに連絡しようとしたら問い合わせ用のメールアドレスもフォームもないし...。
電話で話をしても、繋がるまで待たされるし、繋がってもサポート窓口で、この手の話がわかる人にたどり着くまでに同じことを何度も話しないといけない。
問い合わせ窓口にメールかフォームがあれば、製品のユーザに面倒なことをさせなくて済むんだけどそこのところどう考えてるんだろう。
あ、一応FAXもあるけど今時FAXっていうのもね...。

2016年03月18日

ズンドコキヨシ with Scratch

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そこで、Scratchで作ってみた。
せっかくScratchで作っているので歩かせてみた。
関連リンク

2016年03月17日

ズンドコキヨシ with PowerPoint VBA

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そこで、PowerPoint VBAで作ってみた。
Sub addSlide(text As String, Optional size As Integer = 360)
    With ActivePresentation.Slides
        Dim slide As slide
        Set slide = .addSlide( _
            Index:=(.count + 1), _
            pCustomLayout:=.Parent.SlideMaster.CustomLayouts(7) _
            )
        With slide
            Dim shape As shape
            Set shape = .Shapes.AddShape( _
                Type:=msoShapeRectangle, _
                Left:=0, _
                Top:=0, _
                Width:=960, _
                Height:=540 _
            )
            With shape
                .TextEffect.FontSize = size
                .TextFrame.TextRange.text = text
            End With
        End With
    End With
End Sub

Sub Zundoko()
    Do While True
        If Rnd < 0.5 Then
            addSlide "ズン"
        Else
            addSlide "ドコ"
        End If
        With ActivePresentation.Slides
            Dim zd As String
            zd = ""
            For i = 4 To 0 Step -1
                If .count - i > 0 Then
                    If .Item(.count - i).Shapes.count > 0 Then
                        zd = zd + .Item(.count - i).Shapes.Item(1).TextFrame.TextRange.text
                    End If
                End If
            Next
            If zd = "ズンズンズンズンドコ" Then
                Exit Do
            End If
        End With
    Loop
    addSlide "キ・ヨ・シ!", 144
End Sub
関連リンク

2016年03月16日

ズンドコキヨシ with AppleScript

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そこで、AppleScriptで作ってみた。
『ズン』と『ドコ』はログの履歴のメッセージに表示され、『キ・ヨ・シ!』は結果に表示される。

比較演算子さえも英語のように記述できるAppleScriptの特徴がよく出ていると思う。
(もちろん記号でもOK。)
set zundoko to {}
repeat while zundoko as string is not equal to "ズンズンズンズンドコ"
    set r to random number from 0 to 1
    if r is equal to 0 then
        set zd to "ズン"
    else
        set zd to "ドコ"
    end if
    log zd
    set the end of zundoko to zd
    repeat while ((count zundoko) is greater than 5)
        set zundoko to rest of zundoko
    end repeat
end repeat
return "キ・ヨ・シ!"
関連リンク

2016年03月15日

ズンドコキヨシ with Excel VBA

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そこで、Excel VBAで作ってみた。
Sub Zundoko()
    Do While True
        If Rnd < 0.5 Then
            ActiveCell.Value = "ズン"
        Else
            ActiveCell.Value = "ドコ"
        End If
        Cells(ActiveCell.Row + 1, ActiveCell.Column).Activate
        Dim zd As String
        zd = ""
        For i = 5 To 1 Step -1
            If ActiveCell.Row - i > 0 Then
            zd = zd + Cells(ActiveCell.Row - i, ActiveCell.Column).Value
            End If
        Next
        If zd = "ズンズンズンズンドコ" Then
            Exit Do
        End If
    Loop
    ActiveCell.Value = "キ・ヨ・シ!"
End Sub
関連リンク

ズンドコキヨシ with 秀丸マクロ

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そこで、秀丸マクロで作ってみた。
秀丸マクロには、配列がないため文字列の連結で対応した。
また、浮動小数点版の秀丸でないと乱数が使えない。
Windowsが起動してからの経過時間を取得するtickcountという、一見乱数につかえそうなものがあるが、単位がミリ秒であるため、ループ内で使用すると同じ値が連続して帰ってきてしまう。
今回のような用途では、擬似乱数生成器を自分で実装する必要がある。
ここでは、線形合同法を用いた。
また、実装した乱数生成器は偶数と奇数を交互に返すため、このまま利用すると『ズンドコ』を延々に繰り返してしまう。
これを避けるために、10の位を判定に利用している。
$zundoko = "";
#rand = tickcount % 256;
while($zundoko != "ズンズンズンズンドコ") {
    #rand = (129 * #rand + 83) % 256;
    if ((#rand / 10) % 2 == 0) {
        $zd = "ズン";
    } else {
        $zd = "ドコ";
    }
    insert $zd;
    $zundoko = $zundoko + $zd;
    $zundoko = rightstr($zundoko, 20);
}
insert "キ・ヨ・シ!";
秀丸マクロ実行のたびに『ズン』もしくは『ドコ』の出力を一度しか行わないのであれば、乱数代わりにtickcountを利用できる。
ここでは配列代わりに出力済みのテキストを使い、より簡潔に記述している。
if (tickcount % 2 == 0) {
    insert "ズン";
} else {
    insert "ドコ";
}
$str = gettext(x - 20, y, x, y);
if ($str == "ズンズンズンズンドコ") {
    insert "キ・ヨ・シ!";
}
後者のマクロは、秀丸のマクロ登録でこのマクロをキーに割り当てると、『ズン・ズンズン・ズンドコ』のリズムでキーを押しながらマクロを実行できるので、ある意味気持ちいい。
複数人で誰が『キ・ヨ・シ!』を出すのかという『ズンドコゲーム』も可能だ。
成功確率も1/32のためそれなりにエキサイトするのではないか。
関連リンク

2016年01月22日

「盗み見できるカメラ」をメーカー別に数えてみた

まずはこれ。
不用意に公開しているWebカメラがたくさんあるとか、それを収集したサイトがあるとか、結構前から有名な話だと思ってたんですが違うんですかね。
某社の仕様がアレなので◯◯すれば見つかりやすいとかなんとか。

で、報道されていたサイトにはWebカメラのメーカー名が載っていたので、メーカー別にカウントしてみた。
どれくらいの割合なのか前々から気になってたしね。
カウント方法は単純にスクレイピングしただけ。
対象は日本国内に限った。
せっかく色々隠して報道されているのに不必要な情報まで載せたくないのでコードは載せない。

で、集計結果。
PanasonicHD : 1767
Panasonic : 839
Foscam : 1
Axis : 273
Sony : 64
Axis2 : 2
NetCam : 2825
NetCamはコインパーキングに設置された映像が多く、想像するにそういうソリューションを展開して意図的に公開しているっぽい。
NetCam以外のメーカー品でも意図的に公開しているカメラもあるはずだけど、NetCamを除外した数値が「意図せず公開されているであろうWebカメラ」の実数に近いと思う。
この数値も収集されたカメラだけのものなので、実際はもっと多いはず。
しかし、想像はしていたけど凄い割合だ。
メーカーもメーカーだけど、防犯カメラ設置を担当したであろう業者も業者だよね。

あと、NHKでの報道は効いたらしく、コードを書いている間に100サイト以上減っていった。さすがテレビというところか…。
(時間帯によって変化しているだけかもしれないけど。)

2016年01月13日

「痛いの痛いの飛んでけ」の痛みはどこに飛ばすのか

「痛いの痛いのお父さんの方に飛んでけ!」とか
「痛いの痛いのお母さんの方に飛んでけ!」とかして
大袈裟に痛がってあげるのオススメ。
普通に「痛いの痛いの飛んでけ!」ってやるより
リアクションを見て喜んですぐ泣き止む。
そのうち直ぐに一緒になって
「痛いの痛いの◯◯の方に飛んでけ!」ってやるようになる。
欠点は、転んだりしていない時に突然
「痛いの痛いの◯◯の方に飛んでけ!」ってやられて
反応に困ることかな。
特に人前でやられると対処に困る。

2015年12月01日

楽譜も数式も

楽譜も数式も一種のDSLなんですよ。コンピュータ言語ではないけども。
※ 念のため補足 : 正確にはDSLは"コンピュータ言語"という意味を含みます。

2015年04月01日

HTML 4.1が勧告されました (エイプリルフールの嘘情報です)(追記あり)

HTMLの新しいバージョンであるHTML 4.1が勧告されました。
HTML 4.1で追加されたのはエイプリルフール用の仕様のみとなります。
たったこれだけの仕様追加でバージョンが上がってしまうのは奇妙に思われるかもしれませんが、理由を含めて解説してみたいと思います。
導入までの経緯
毎年、4月1日のエイプリルフールには各サイトが創意工夫を凝らしたエイプリルフールの特設ページを作成することが慣例となっています。
多くの特設ページはエイプリルフールが終わると削除されるのですが、一部のコンテンツはインターネット上に残り続けています。
この傾向は、特に個人のブログに公開されたエイプリルフールのエントリーに顕著です。
4月1日中はインターネット利用者は警戒しつつネットを利用していますが、普段のネット利用時には多くの利用者は警戒を解いてしまいます。
このような時に偶然エイプリルフールのコンテンツに訪れると、書かれている情報を鵜呑みにしてしまう危険性があります。
また、見た目ではエイプリルフールの特設ページと判断がつくようになっていても、スクリーンリーダー利用者には判断がつかないことが多く、アクセシビリティー的にも問題です。
このようなページは検索結果に表示されないよう各検索エンジンは改良され続けましたが、異常とも言える程の手の込んだ特設ページとのイタチごっこに検索エンジンが根を上げ、エイプリルフールのコンテンツ判断のための仕様の提案に至りました。
嘘の情報に驚いてブランコから転げ落ちることがないようにするためにも、賢明な判断だったと思います。
以下、「嘘情報」「嘘ページ」等の用語を使っていますが、『エイプリルフールの嘘情報』という意味です。全て書いてしまうと、冗長になっていまい読みづらいので省略していますのでご注意ください。
変更点ですが、以下の要素とmeta要素用の指定が追加されました。
aprilfool要素
嘘情報を指定する時に使用します。
ブログでエイプリルフールのエントリーを公開する等、ページの一部に嘘情報がある時を想定しています。
aprilfool要素 使用例
<aprilfool>HTML4.1がリリースされました</aprilfool>
meta要素による指定
ページ全体が嘘情報である場合に使用します。
特設ページや特設サイトで使用することを想定しています。
meta要素による指定 使用例
<meta name="aprilfool" content="true">
仕様の策定段階では嘘エントリーや嘘ページへのリンク用に、link要素のrel属性に「aprilfool」を指定する案もありましたが、複雑になりすぎるためにHTML41まで見送られました。
<link rel="aprilfool" href="[嘘情報のURL]">HTML4.1がリリースされました</link>
また、ディレクトリ配下全てを嘘情報として指定できる「aprilfool.txt」というファイルを用いる仕様も提案されていましたが、こちらはrejectされました。
aprilfool.txtについて、少し興味深い話があったので紹介します。
当初は、嘘情報ディレクトリの直下にaprilfool.txtファイルがあるかどうかで判定する仕様だったのですが、嘘情報判定処理を先行して実装した検索エンジンが、偶然とある企業サイトのルート直下にあったaprilfool.txtファイルを認識してしまい、サイト全体が嘘情報と判定されてしまう事故が発生してしまいました。
エイプリルフールのジョークのアイディアをメモしたファイルだったらしいのですが、誤判定によりPVが激減してしまい、担当者にとってはジョークでは済まない事態になったそうです。
そこで、aprilfool.txtには、AprilFool-Keyと呼ばれる文字列を含める仕様が提案されました。AprilFool-Keyは、UUIDをBase64でエンコードしたものです。
最終的にrejectされた理由なのですが、そもそもディレクトリ配下全てを嘘情報として指定するユースケースがどれだけあるのかという議論が発端になりました。
誤判定の事故にもあったように、サイト全体を嘘情報として指定することさえもできる非常に強力な仕様です。
エイプリルフールどころか、日々発信している記事が嘘の記事で、サイト全体が虚構であると謳っているサイトでさえ、後に「噓から出たまこと」で嘘でなくなる事態が発生し、サイト内に誤報や謝罪等の、事実の記事が紛れ込んでいます。
このようなサイトでもaprilfool.txtは使われないだろう(そもそもエイプリルフールの記事ではないので本来は仕様の対象外ですが...)と予測できることから、aprilfool.txtは不要だという意見が多数となりました。
「一部の事実の記事は『<meta name="aprilfool" content="false">』を指定すれば良い」という意見もありましたが、rejectの流れを覆すにはいたりませんでした。
なぜHTML5.1以降ではなくHTML 4.1?
最初は、当然のようにHTML.next、HTML5.1の文脈で仕様策定が進んでいました。
しかし、ある古参のサイトの管理者から次のような意見が出されました。
「古いCMSを使ってサイトを管理しているが、HTML 4.01の出力までしか対応していない。もし、エイプリルフール用の仕様がHTML5.1以降になってしまうと、嘘記事を公開することが難しくなってしまう。」
なるほど、もっともな意見です。
このため、古いCMSでも少しの修正で対応できるようにするために、HTML 4.01にエイプリルフール用の仕様だけを追加したHTML 4.1を策定することになりました。
これにより、サポートが終了したCMSでも例外的にHTML 4.1に対応したバージョンがいくつかリリースされてはじめています。また、開発が完全に止まっているCMSであっても、HTML 4.1対応のパッチやプラグインを有志が公開しており、バージョニングの方針転換が功を奏する結果となりました。
ブラウザの挙動
嘘情報が含まれたページをブラウザで開くと、警告が表示されるようになります。
日本語版のブラウザの場合、『このページはエイプリルフールのページです。』もしくは『このページにはエイプリルフールの情報が含まれています。』と警告されます。
一部のブラウザでは設定変更で嘘情報を非表示にすることもできますし、同様の機能を持つプラグインも出てきていますので、気になる方は導入してみてはいかがでしょうか。
子供等の判断能力が未熟な方が使われるブラウザでは、嘘情報の非表示機能は必須になるかもしれません。
その他の主な事例
検索エンジン側の対応は様々です。
デフォルトの検索結果に嘘情報が表示されないようになったところ、検索オプションで指定できるところ、面白いところでは「嘘情報のみを検索する」オプションを追加した検索サイトもあります。
また、嘘情報が簡単に判断できるようになったことから、エイプリルフールのジョークを収集しまとめてみることができるWebサービスが登場しました。
この仕様を悪用する動きも出てきました。
ある企業が、不祥事に対する謝罪文が検索結果に表示されないことを狙い、謝罪文にaprilfool要素を使用する事例が発生しました。
エイプリルフールコンテンツ判定処理を導入し始めた頃の検索エンジンは、嘘情報を検索結果に表示しないエンジンばかりだったからです。
しかし、ジョーク収集サイトに謝罪文が収集され、aprilfool要素を使用していることが発覚し、炎上してしまいました。
今では各検索サービスはこのような使用方法にはペナルティを課し、企業サイト全体のランクを下げことにしているようです。
まとめ
わかっているとは思いますが、このエントリー自体が嘘情報ですよ。
2015/04/02 追記
このネタは、上に書いた通り、今の状況が問題ではないかと言う問題提起です。

何年か前、エイプリルフールとちょうど反対の10月1日に書いたエントリーが以下。
この時はほとんど反応がなかったのですが、今回はメタ的な手法を使ってエイプリルフールのジョークとして書いたためか、それなりに大きな反応がありました。
各所の反応を見ていると、やはり同じようなことで困っている人や問題だと思っている人がいました。
この仕様は、長い間考えて(妄想とも言う)いたことを書きだしたもので、良いアイディアとして捉えられたようです。
ただ、今は日本語圏内の反応しかわからないため、英語に翻訳したものを書いてみました。
Google翻訳を使っただけなので変な部分もあるかも知れませんが...。
GitHub上に公開していますので、おかしなところがあればpull requestをもらえればと思います。
あと、本当に仕様化するのであれば、aprilfoot要素ではなくjoke要素のほうが汎用的かなと思っています。
Google

タグ クラウド