[ruby]電源マップをメールで送信

モバイラーズオアシスAPIの使用サンプルをもう一つ。こちらは、モバイラーズオアシス 電源マップAPIを利用して、指定された位置の電源マップのURLをメールで送るサンプルです。

メールを送るためには、メールを送るためのSMTPサーバが必要になります。
とはいえgmail全盛の今の時代、メールサーバを立てるといわれてもピンとこない人も増えているので、そういう方はgmailのメールサーバを利用するのが良いかと思います。
「gmailのメールサーバを使う場合」のコメントを外してユーザー名とパスワードを設定すれば、自前のメールサーバの代わりにgmailのサーバを使うことが出来ます。

dengenmail2.png
dengenmail.png

[ruby]モバイラーズオアシスAPIの使用サンプル

Mashup Awards 8 (#MA8)に提供しているモバイラーズオアシスAPI。「Rubyでのサンプルが欲しい」との声をいただきました。
とっくに応募期間が終わって表彰式当日ではありますが、今後もAPIを利用していただく機会はあるだろうと思うので、一応サンプルを用意しました。

あまり上手い例を思いつかなかったので、ごくシンプルに、コマンドラインでもらった緯度経度周辺のお店をリストアップするコマンドです。

Ruby1.9を想定して書いてありますが、1.8でも、JSONライブラリを入れれば動くんじゃないかと思います。

moapi.png

[iPhone]現在地から目的地まで経路探索

経路探索

iPhone上で、

http://maps.google.com/maps?saddr=My%20Location&daddr=[title]@[lat],[lng]&z=15

という具合に、「My Location」から目的地までの経路を探索させると、GPSで現在位置を取得して現在位置から目的地までの経路を示してくれる、という小ネタがあります。例えば電源検索では、この挙動を利用して現在位置からカフェまでの経路を表示してもらっています。

iOS6でMapsアプリはAppleMapに置き換わってしまいましたが、この機能自体はブラウザ版のGoogleMapsでも動作するので、iPhone5でも使うことが出来ます。

ところが最近、なんか仕様変更があったらしく、「My Location」が現在位置に置き換わらなくなってしまいました。健気に「My Location」という地名を検索して無意味な経路を表示しようとしてしまいます。
mylocation.png

ドキュメントに明示されていた機能じゃないので、なくなってもしょうがないのですが、同等の機能はどうにかして実現したいところです。

いろいろ試した結果、こうやると実現できるっぽいことがわかってきました。

http://maps.google.com/maps?daddr=[title]@[lat],[lng]&z=15

saddr(出発地点)の指定を省略すると、勝手に現在位置で補完してくれるみたいです。

これもドキュメントに明示されていない挙動なのでいつまで動くか怪しいのですが、「My Location」を置き換えるよりは筋がいい動きだと思うので、自分のアプリに関しては、当面これで実装しておこうかなーと思っています。

[Titanium]電源コンパス

device-2012-10-10-083524.png

Mashup Awards 8 (#MA8)にモバイラーズオアシス電源検索APIを提供しているので、API提供企業(!)として
#MA8 東京CaravanVol.03に行ってきました。

APIの活用サンプルということで、つねに最寄りの電源スポットのほうを指し示すコンパスアプリというのをつくってみたので、ソースコードを公開します。

英語環境の人に機械翻訳を提案するスクリプトMayITranslate

テレビ局の番組WEBページの英語版で、「木下グループ」が「キオロシグループ」になっちゃってて、それはないんじゃないの、ということで話題になっています。

  • テレビ東京HPが自動機械翻訳でめちゃくちゃな英語になっている。 – Togetter
  • 禿頭帽子屋の独語妄言 side A: # 今度はテレビ東京のサイト – 機械翻訳システムの害はかなり広いのかも
  • 「機械翻訳だからしかたないでしょう」
    世の中的には、おおむねこれで済んでしまう話なのでしょうか。
    実際、機械翻訳を表示するサイトにはたいてい免責条項が書いてありますよね。
    (中略)
    提供元は「システムを提供しているだけ」と言い、そのシステムを使うほうも「責任を負いません」と言い逃れている。
    そんな情報、発信する意味があるのですか?
    (禿頭帽子屋の独語妄言 side A: # 今度はテレビ東京のサイト – 機械翻訳システムの害はかなり広いのかも)

    実際には、日本のコンテンツに興味がある人たちの中には、翻訳サイトを通して日本のWEBを見ている人が結構いるみたいなので、翻訳結果を提供することにまったく意味がないこともないとは思うのですけれど、テレビ局自身が提供する公式サイトの一部(に見える)からには、クオリティが低かったら文句言われても仕方ないですよね・・・

    ところで、GoogleのChrome ブラウザには、母語以外のWEBサイトを見ると翻訳を申し出てくる機能がついています。
    chrome.jpg

    こんな機能があるのだったら、なおさらテレビ局が自前で機械翻訳結果を提供する必要なんてないような気がします。
    実際には、特定のブラウザの機能をあてにすることは出来ないという理由で、自前提供することにしてしまったのだとは思いますが。

    ということで、同様の機能をどのブラウザでも提供できるようになるスクリプトというのを作ってみました。WEBページ制作者がページに組み込んでおけば、ブラウザの言語設定が日本語以外になっている人が見に来た時だけ、Google翻訳の案内が表示されます。

    mayitranslate.jpg

    「Translate」ボタンを押せば、「翻訳結果はGoogleが出しているものだから間違っているかもしれないよ」の旨のメッセージを出したあと、Google翻訳での検索結果ページに移動します。
    googletranslate.jpg

    これなら、誰が見たってGoogle翻訳の結果であることが明白なので、ちょっとくらい変であろうと、スポンサー名が間違っていようと、まあそんなもんだよね、Googleさんがんばれ、ですませることが出来ます。
    英語圏の人も、翻訳したページは提供してないから機械翻訳をみてね、というメッセージを明快に理解することが出来ますよね。

    maiitranslate.js

    ダウンロードして自分で改造して使われる分には、パブリックドメインに寄贈されたスクリプトとして扱っていただいて結構です。
    設置を代行してほしいとか、メッセージを差し替えたいとか、Google翻訳の代わりにExcite翻訳を使いたいとか、そういった対応は有料で承りますので、ご興味のある方はお気軽にお問い合わせくださいませ。

    [Titanium] webviewのリンク先をブラウザで開く

    stockxchng_331498_2788_stormy.jpg

    WebViewで開いたページに対して、リンクをクリックした時の挙動をコントロールしたい、というのは人類共通の願いで、過去にもたくさんの方がブログ記事を書かれています。

    最初の2つは、webviewのbeforeLoadイベントを使う例で、あとの2つは(もぎゃろぐとひげろぐ。ぷぷぷっ)HTMLの中でリンククリックをハンドリングして、Ti.App.fireEventでアプリに飛ばしたイベントを使って何とかしようという例です。

    前者は、iOSとAndroidの違いやTitaniumSDKのバージョンによって動いたり動かなかったりしているのが難点で、後者は、JavaScriptのコードがバグっているとデバッグが超大変(printfデバッグすらできない!)なのが難点です。

    さて、ありがちな要求として、ランチャーがわりにローカルのHTMLファイルをwebviewで開いておいて、その後のリンク先は全部ブラウザで開いてほしい、という要望が考えられます。というかボクが欲しかったのにそういうサンプルが見当たらなかったので、自分で書きました。

    ポイントとしては

    • beforeLoadは最初のローカルHTMLの読み込みに対しても呼び出されますので、urlが’file://’かどうか確認して、ローカルファイルじゃない時だけ処理するようにしています。
    • beforeLoadでブラウザを開いたとしても、webview自体が次のページを読みに行ってしまうことは阻止できません。できるのかもしれないですけど、うまいやり方を思いつかなかったので、stopLoadingで阻止しつつ、念のため、loadイベントで戻れるときはgoBackさせて強引に最初のページを維持させています。
      これをやっておかないと、特にAndroidでBACKボタンを押してアプリに戻ってきた場合に、次のページを開いているwebviewが見えてしまいます。
    • 余談ですが、Ti.Platform.openURLって、Androidだとちゃんとインテントを聞いてくれるのですね。問答無用で標準ブラウザが開くのだと思っていました。

    TitaniumSDK2.1.2GAだと、AndroidとiPhone両方で動作しています。
    この例はbeforeLoadイベントを使っているので、将来的にまたSDKがバグったり直ったりすると、また動かなくなるかもしれませんが、その時は自力でがんばってくださいませ:-)

    [Titanium] dpとpixelの変換

    Androidアプリ with TitaniumMobileに挑戦中。iPhoneだと動くコードが動かない理不尽さを見ていると、HTMLを書いてIE6で見ると崩れまくっていたあの頃を思い出しますね。

    さて、そんなandroidでは、解像度の異なる端末に対応するため、数値はdip指定するのが原則です。

  • New Defaults for Android Layouts in 1.7 « Appcelerator Developer Center
  • Y.A.M の 雑記帳: Android multi screen 対応
  • ところが、view.animateとか、scrollView.setContentOffsetのように構造体をとる関数はたいていdp表記に未対応で、pixel単位で指定してあげる必要があります。変換関数が必要!

    このあたりのことはこの記事で解説されていて、

    TitaniumMobileのハマりポイントとお作法メモ at HouseTect, JavaScriptな情報をあなたに

    dpとpixclの変換関数なんかも提案されているのですけど、用途と合わなかったので、俺バージョンを作りました。

    元コードとの違いは

    • View.widthなどで取得できる ‘100dp’などの記述をそのまま渡せるようにした
    • 同様に、view.widthにそのまま渡すことを意識して、dpは’100dp’みたいな文字列で返すようにした

    というあたりです。

    じゃらんで見た宿の情報が漏洩しまくっている

    twitterのまとめで有名なtogetterのこの辺に、じゃらんとか楽天の広告が出てきますよね。
    WS000.JPG
    右上の(i)をクリック。


    「あなたのブラウザでは、jalanjpのWebサイトで以下の商品をご覧になられています。」

    ご覧になられています、じゃねー! どこだか分からない広告会社が何でそんなことを知っている!

    これは、第三者クッキーと呼ばれる技術をつかったものです。つまり、CRITEOという広告会社が、Togetterにも じゃらんにも広告を配信しているので、じゃらんの閲覧履歴を元にTogetterに広告を出すことが出来ているわけですね。

    じゃらんのプライバシーポリシーを見ると、たしかにこの広告が使われていることが説明されています。

    この話題、気づくきっかけになったのはこのブログの記事でした。

    バナー広告の下に「楽天」とあるので楽天の広告と思ったのですが,右クリックすると「Powerd by Criteo」とあるのでCriteoによる行動ターゲティング広告であることがわかりました.
    (CRITEOの広告が楽天でチェックした商品を表示している件: 何の変哲もない福岡生活…)

    楽天のサイトにも、たしかにCRITEOの広告が使われていることが明示されています。

    二匹いたらもっといると思え。

    これは気持ち悪い。つまりCRITEO社は、僕が楽天で鳥かごを買った買おうとしたことだけじゃなく、All Aboutでジャムのレシピを調べたことも、時事通信で昨日の阪神タイガースの勝ち負けを見たことも全部知っているわけです。
    ヨメと今度行こうかと思っていた旅行の行き先まで!

    これは気持ち悪すぎる!断固抗議だ!

    ふと振り返ると

    ところで、自分の運営しているモバイラーズオアシス-街の電源検索サイトでは、Googleアドセンスを使って広告を表示しています。あと、このブログにも出ているはずです。
    このGoogleアドセンスも、行動ターゲティング広告をやっています。

    Google Japan Blog: 新しい広告のプログラムのテストについて

    つまり、モバイラーズオアシスだって、Googleを通して上記の気持ち悪い状況をつくりだす一翼を担っていることになりますね。えらそうにリクルートさんを批判できる立場にはないわけです。

    かといって、今モバイラーズオアシスからアドセンス広告を外すと、運営が干上がってしまいます。ううむ。

    言い訳かもしれないのですけど、GoogleとCriteo社では気持ち悪さが全然違うと思うのは、僕の勝手でしょうか?
    Googleであれば、ストリートビューの件を初めとして、これまでいろいろな事件が起こって、それに対してどんな対応をしてきたか一通り見てきています。あるいは、及川さんを初めとして、中の人も何人も知っています。そのGoogleなら、まあそんなに無茶はしないだろう、という気がするのです。
    我が身かわいさ故の偏見かなぁ。

    第三者クッキーを拒否する方法

    罪滅ぼしになるかどうかは分かりませんけど、最後に、この手の追跡を回避するために、第三者クッキーを拒否する方法を紹介しておきます。
    お使いのブラウザによりますけど、

    という感じです。safariは最初から拒否する設定になっているみたいですね。

    気持ち悪いことに気づいたので広告を全廃しました!とか、リクルートにたいする抗議運動を開始します!とかかっこいい記事じゃなくて申し訳ないのですけど、とりあえず、これを見て気持ち悪いと感じた人が増えるだけでも、世の中なんか変わるのではないかな、と期待を込めて。

    2012-05-13 10:25:20訂正
    楽天で「買った」ものの情報は流れていないみたいですね。その前の閲覧履歴が渡っているので、これがいいかな、あれがいいかな、と思っている段階の情報が流れているだけのようです。

    Amazonが導入するロボット倉庫の仕組み

    Amazonが650億円掛けて導入する倉庫ロボットがすごいということで話題になっています。

    すごいのはいいのですけど、動画貼って終わりの記事ばっかりで(みんなずるいよね!)、具体的に何をしているのかちっとも分からなかったので、がんばってヒアリングしてみました。想像以上に面白い仕組みだったので、説明します。

    最初、ロボットが棚から商品を集めてくるのだと思っていたのですが、違いました。商品のある棚を従業員の所に持ってくるのです!

    WS006.jpg
    オレンジ色のロボットが商品の載った棚を持ち上げて運びます。

    WS000.jpg
    従業員の所に到着。

    WS003.jpg
    天井のカメラから光が当たってピックアップする商品をお知らせ。
    #動画をよーく見ると、左側のカップのあたりに光が点滅しているのが分かります。たぶん、天井のカメラで棚に貼ってある二次元バーコードを認識して照射しているのでしょう。

    WS004.jpg
    従業員が指示された商品をピックアップしてバーコードを読ませると、役目を終えた棚(ロボット)は自動的に所定の位置に戻っていきます。
    従業員は一歩も歩くことなく、次々にやってくる棚から商品をスキャンして箱に放り込むだけで、ユーザーの注文が完成していきます。

    よく知られている話ですが、Amazonの倉庫はアルファベット順や商品順ではなくまったくランダムに配置されているので、似たような商品の一巻と二巻を取り違える、といった事件も起きません。
    参考:これがアマゾン・コムの配送センターだ « WIRED.jp Archives

    一方で、ロボットのほうもコンピュータの指示に従って棚を運ぶだけなので、商品を拾い集めるロボットを作るよりずっとシンプルなシステムにすることができます。
    複雑なシステムにすると壊れた時の修理が大変になりがちですが、このシステムなら、同じロボットがたくさんいるだけなので、壊れた機体は修理送りにして予備のロボットを投入すれば簡単に復旧させることができます。
    こういうロボットが1000台程度、バスケットボールコート数個分の倉庫を走り回るのだそうです。

    WS001.jpg
    なお、ロボットは必ずしも棚を元の位置に返すとは限らなくて、よく売れている商品が多い棚は近くに、あまり売れていない商品が多い棚は遠くに戻すことで出荷効率を改善するようになっています。
    商品一個入れるたびに巨大な棚を持ち歩くのは燃費が悪そうですけど、こういう工夫によって補われているのでしょうね。

    参考記事

    2012-03-21 10:45:24追記
    このロボット、Kiva Systemsっていう米国のベンチャー企業の物だったのですが、Amazonが買収することが決定したそうです。さすが。
    Amazon、ロボットメーカーのKiva Systemsを7億7500万ドルで買収 – ITmedia ニュース

    「世界を変えた6つの飲み物 – ビール、ワイン、蒸留酒、コーヒー、紅茶、コーラが語るもうひとつの歴史」

    最近読んで面白かった本の話。世界を変えた6つの飲み物 – ビール、ワイン、蒸留酒、コーヒー、紅茶、コーラが語るもうひとつの歴史

    ビールやワイン、蒸留酒、コーヒー紅茶にコーラまで、その飲み物がどうやって開発されて、なぜヒットしたのか、社会にどんな影響を与えたのか、といった具合に、飲み物を通して歴史を語った本です。

    beer

    例えば、古代メソポタミアで最初に一般化したアルコールはビールでした。
    なぜかというと、穀物を水につけておけば勝手に出来上がったから。穀物を水につけておくと麦芽糖ができて甘くなります。これが空気中の酵母と偶然触れ合ってアルコールに変化したのです。
    原理的には果物とか蜂蜜でも可能なはずだったのですが、当時穀物はたくさんあったので、人類はこの偶然に改良を繰り返してビールを造る方法を学習しました。

    7000年くらい経って都市が成立すると、ビールは一種の通貨として使われるようになります。エジプトでピラミッド建築の労働者が一日働くと、パン3-4斤と4リットルのビールがもらえたのだそうです。
    必需品だから誰でもほしがるし、たくさん蓄えておいて公平に分け与えることができるので、通貨としては便利だったのですね。

    このあと出てくるワインとも共通する話なのですけど、アルコールはそれ自体が殺菌作用を持つし、製造過程で沸騰したりしているので、かなり長い間、下手な水より安全な飲み物でした。
    そういうわけで、ギリシャ時代ローマ時代の間に、食事の時にはビールやワインを飲む習慣が一般化します。
    古代ギリシャでは、神官といえども朝食から(!)ワインを飲んでいたので、ちゃんと仕事ができる状態に戻るのに時間がかかって苦労していたのだそうです。17世紀になって、アラビア生まれのコーヒーがヒットしたのは、酔っぱらわなくてもいい食事時の飲み物、という理由だったのだとか。

    西ヨーロッパは、数世紀の間立ちこめていたアルコール性のもやのなかからようやく抜け出した。「このコーヒーという飲み物のおかげで」と1660年にあるイギリス人が書いている。
    「諸国において、節酒の傾向がよりいっそう進んでいる。徒弟や助手らはかつて、朝にエール、ビール、ワインなど、脳にめまいを起こさせるものを飲んでいたため、多くのものは仕事に適さない状態だった。
    だが彼らは今や、この目を醒ましてくれる文明的な飲み物のおかげで、まともに勤められるようになっている。」

    sxchu_1121914_tea.jpg

    一方お茶は、もともと中国で飲まれていた飲み物だったのですが、これも大航海時代にヨーロッパに渡って大ヒットしました。
    とはいえ当時中国の技術力は圧倒的で、ヨーロッパの品物なんてあんまりほしい物がないよね、という状態。しょうがないのでヨーロッパ側は代金として銀を支払っていたのですけど、貴金属は限りがあるのでそうそう出せるものではありません。
    あんまりにも高いので、「なんか安いお茶はない?」ということで輸入されたのが、うっかり放置して酸化させちゃった茶葉からできた安物のお茶「紅茶」だったのだそうです。
    イギリスでは、苦い紅茶をおいしく飲むために牛乳を入れて飲むアイデアが発明されました。

    ちなみに同じ頃日本では、高級品の茶を飲む作法にこだわった結果、世界に類を見ないほど複雑な「茶道」が生まれました。あんまり合理的じゃないところにこだわって、意味は分からないけどなんだか凄いものを作ってしまう国民性は、この頃から変わってないのかもしれないですね。