ロケプラ

最近、ロケプラ(http://rokepura.com/) っていうサイトがあることを知った。
何ができるかというと、

  • 店でブラブラとウインドウショッピングしていて、
  • 気に入ったものがあれば、そこで買う前にスマホで商品をバーコードスキャンして
  • ネット上で価格を調べて、一番安いところで購入

というウェブサイトとスマホアプリを組み合わせたサービス。技術的にはシンプルだと思う。UIやSNSな部分はそれなりに作りこんでいるんだろうけどそれはまた別にして。
すごい時代だなぁ。その店に行ってるのに、スマホで他の店から買ってるという事態が起きるということか。。 もはやリアル店舗は単なる展示場になり下がるのか。
リアル店舗はもっと差別化しないとダメだな。
ここでしか買えないものとか、店員さんが懇切丁寧に教えてくれるとか、居心地がイイとか。
飲食店はさすがにそこにある意味はありそうだけど、基本持ち帰るものは全て対象になりそう。
通販が発達したこの時代、店舗側は客が店舗に行くように仕向ける努力をますます求められそう。

Janetter2でアカウント登録できない

ものすごい久しぶりに記事をポスト。
Janetterっていうよく出来たTwitterクライアントを使い始めた。キーボード操作できるところが好み。j/kが進む/戻るみたいな。
でも、その前にインストール時にアカウント登録失敗して中々先に進めなかったのでそれをメモしておく。

現象

  • 現象としてはインストールウィザードで、アプリ連携するための設定がありID/PASSの入力が必要だが、入れても失敗メッセージ。ところがあとでウェブブラウザでTwitter上の設定を見に行くとアプリ連携は許可されている不思議。



  • ID/PASSが通らないので自身のtweetはもちろん出来ないが、タイムラインは見えるので一見動いてそうに見えるところがタチが悪い。要するにtweetだけできないのでそれをブラウザでやっても良かったが面倒すぎる。

原因と対策

  • 結論から言うとプロキシの設定がまずかった。
  • オフィシャルサイトのFAQには「プロキシ環境下でタイムラインの画像が表示されない」の解決策としてIEのプロキシ設定の変更を挙げていて関係なさそうだったが、プロキシは確かに影響してそうなので、念のため外した。けどダメだった。ファイアウォールかセキュリティソフトかなーと思って一時的に外したけどダメ。
  • 管理者権限で実行しているし、どうしたものかと、
C:\>netstat -all

とかしてみたら、プロキシサーバからの応答をListenしている状態になっていることが分かった。

  • で、思い出したのが環境変数 http_proxy。これもかー。unsetしたら無事つながった。でも注意書きがないところを見ると同じような環境でハマってる人、他にもいないのかな。
  • 一時的に環境変数外す方法ないかな。コマンドプロンプトアプリならバッチファイルの先頭行に環境変数をunsetするように書いておけばよさそうだけど、GUIアプリだからバッチファイル起動にすると黒い画面が常駐してヤナ感じ。最小化起動するしかない?誰かイイ方法あったら教えてください。

その他

  • 関係ないけど、以下追記。他のtwクライアント、Saezuriとかは直接twitterと通信するようだが、こいつはバックグラウンドで別プログラムが走っていて、そいつ経由で通信させる仕掛けらしい(Janetter2起動と同時に起動?)。見えてるウインドウ自体はブラウザみたいなもんで、テーマ(要するにLook & Feel)がhtml+css+jsで出来ているようだ。

Bookmark

たまりにたまっていたのでflush。

シリアライズ/シリアライゼーション

データの直列化とも言われるシリアライゼーション。意味をつかみかねていたのでググッて調べてみた。

データの直列化とは,大雑把に言えばPerlのデータ構造(スカラー,配列,ハッシュ,リファレンスなど)を単一の文字列で表現することだ。

構造を持ったデータをファイルとして保存したり、ネットワークを通じて送ったりする必要が生じたとしましょう。その場合、メモリ上のデータをそのまま送るわけにはいきませんから、複雑な構造を壊さないように注意しながら一次元のバイト列に変換します。これがシリアライゼーションです。

ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるように変換すること。

  • Cでとある設定データを保存している構造体の情報をまるまるバイナリでファイルに保存して、次回起動時に読み込むとかやってたことがあったけど、それに近いのかな。
  • データの持つ意味としてはどちらも同じだけど、どのレイヤでデータを扱うかの違いかな。例えばPerlのデータ構造をYAMLとかJSONファイルに落とし込むとすると、IOのレベルではバイト/ビット単位で扱うことになるので直列的になる。一方で言語レベルではハッシュや配列を使って構造的に取り扱える。
  • このシリアライズという言葉を使う時は単に直列化するということだけじゃなくて、加えて本来言語特有である内部形式の構造化されたデータを「汎用的に扱えるように」という意味がプラスされている気がする。
  • Wikipediaに面白い例えが書いてあった。

シリアライズは、SFなどに登場する転送装置に喩えられることがある。物質を一旦量子に変換してから遠隔地に転送し再び物質に戻すというテレポーテーションがシリアライズに似ていることからそう喩えられた。これはまさに、他のネットワーク上にあるシリアライズされたオブジェクトをファイルとしてリモートから転送してからデシリアライズして外部メソッドを自分のネットワーク上で呼び出すために利用されるJava RMIの動作原理にも似ている。

    • 転送装置と聞いてスタートレックを思い浮かべた自分は古いのかしら・・。てゆーかRMIってそうやって動いてるんだ。

WBC

昨日はすごい盛り上がりでした。WBC関連でブックマークしておく。

YAMLでテストケースを書く2

  • テストケースを
- TestCaseNo: 1
  TestHTML:   test1.html
  Expect:     [1,2,undef]
  • のように書いてて、いくらやってもundefが来ないなーと思ったら「undef」という文字列リテラルが来てたということに時間かかって気づいた(>_<)
  • そういえばYAMLperlにとってのundef(未定義)な値は表現する方法あるのかしら?と思ったらあった。YAML::SyckでImplicitTypingフラグを1にしておいて「~」をセットすれば良い。

$YAML::Syck::ImplicitTyping
Defaults to false. Setting this to a true value will make Load recognize various implicit types in YAML, such as unquoted true, false, as well as integers and floating-point numbers. Otherwise, only ~ is recognized to be undef.

  • これでYAML::Syckでテスト書く時はImplicitTypingフラグは必須かもしれない。というわけで正解は
- TestCaseNo: 1
  TestHTML:   test1.html
  Expect:     [1,2,~]

YAMLでテストケースを書く

  • 自作Perlモジュール(Perlはライブラリと呼ばないのかな)のテストを書いている。Perlでテストを書き方よく分かってないので色々調べたり勉強したり試行錯誤。
  • テストは実際に実行した値と期待値が一致するかどうかの積み重ねが基本。Perlはテストのためのモジュールやツールがとても充実しているんだね。他言語と比較できるほどの知識は持ってないんだけど。テスト自動化したり、簡単に書けるようなヘルパースクリプトがあったり、カバレッジ測定できたり、もう誰かがCPANにupしていたり。あんまりそういう効率の良いテストしたことなかったので新鮮。
  • で、CPANモジュールのテストスクリプトを色々眺めてみたが、結構書き方にこれというのもない感じ。みんな目的が違うので当然か。で、テストケースをずらずらと書き並べておけば後はそれを自動的に読み込んでテストしてくれる方法でいい方法ないかと考えた。ハッシュと配列組み合わせてネストしてと考えて組んでみたが、ネストが深くなってくるとコードが見づらい。
  • で、YAMLファイル作ってそこにテストケース書けば良いのではと思ったのが今回のエントリ。ま、すぐ思いつく程度のことなのでみんなやってるんだろうなと思いながらメモ。YAML自体よくわかってなかったので調べながら。JSONと共用できるフォーマットがいいのかな。JSONもよく分かってないけど。
- TestCaseNo: 1
  TestHTML:   test1.html
  Expect:     [1,2,3]
- TestCaseNo: 2
  TestHTML:   test2.html
  Expect:     [4,5,6]
  • Test。YAML::Syckの方がCライブラリを使ってて高速らしいし、ppmでもさっくりinstall出来たのでこっちを使う。Test::Deepは今回の目的みたく単純なパラメータ比較ではなく、ネストされたパラメータを比較するのに使えるテストモジュール。
use strict; use warnings;
use Test::More qw(no_plan);
use Test::Deep;
use YAML::Syck;

$YAML::Syck::ImplicitTyping = 1;# スカラー値が全部文字列として扱われないように
my $TestCase = YAML::Syck::LoadFile("t/TestCase1.yml");

foreach my $t (@$TestCase){
    $Crawler->{CACHEFILE} = "t/".$t->{TestHTML};
    my $result = $Crawler->Scrape();
    cmp_deeply($result,$t->{Expect},"Result value is valid.");
}
  • ひとつ問題。YAMLファイルをUTF8にしてYAML::Syck::LoadFileすると例外で落ちる。日本語をキーにしたハッシュを入れるということと、テスト対象モジュールがutf8で処理している関係でutf8にしておこうと思ったんだけど。
  • SJISにしておくとバイナリとして扱えるようで、とりあえずLoadFileはできたので、その日本語キーをテストスクリプトでEncode::decode("sjis",$japankey);してcmp_deeplyした。
$YAML::Syck::ImplicitUnicode = 1;
  • というフラグもあるみたいだけど効果なし。というよりよく分かってないので後日調査。
参考リンク