Kindle Fireを取り寄せたのでRoot奪取しないでどこまでできるかレポート

Amazon.com 米国国内でしか買えないらしい Amazon の Kindle Fire ですが、Hop・Shop・Go 使って購入しました。 途中で関税かかってしまいましたが、まあ iPod touch 程度のお値段なんで安いです。 ダンボの中身は非常に簡素 サイズは Galaxy Tab と同じ7インチのようです。今まで Android 端末は WSL JAPAN Xvision(P10AN01) だったので、液晶は見違えるほどよく感じます。ただ、Kindleとして持つと明らかに重いです。ちょっと片手で持って読むというのは長時間は辛い気がします。ただラバーで覆われているため、カバー要らずでフィット感は良好です(DSっぽい)。 Lock画面の画像は毎回変わるがCoolなものばかり。 Kindle Fire は、Androidではあるものの Amazon の独自仕様です。しかし、既にOSのソースコードが公開されているし、多分相当Hackされるはずなので文鎮化することは無いと期待しています。 アクティベートにはAmazon.com のアカウントが必要です。ただ、自分の場合登録先の住所が日本であるため、アプリを専用マーケットからダウンロードしてインストールすることはできません。米国内向けにしか売ってないためこれで通常は問題無いのですが、日本で使うにはほとんど何もできないことになります。 Android 端末は Rootを奪取すればなんでも頑張ればいけますが、とりあえずやらずにどれだけ使えるか確認してみました。 Docs(電子書籍) 電子書籍に関しては、O’relly.com の本が mobi ファイルを入れてみました。epubには対応していません。これはアクティベートすると、xxxxx@kindle.com という受付メールアドレスが与えられるので、ここにアカウントのメールアドレスから送信すると、ダウンロードできます。クラウド経由な手法です。 Music, Videoなど マイクロUSBケーブルを持ってなかったので急いで購入しました。これでPCに繋ぐとパッと見てわかるフォルダ構成なので、Music, Videoなどそれぞれのフォルダにファイルコピーすれば視聴可能です。Webブラウザからダウンロードすることはできないようです。 Apps(アプリケーション) 写真用のGalleryなどのいくつかのアプリは、プレインストールっぽく(初回起動時にダウンロード)なっており、最低限のアプリをインストールできるようにはなっています。ただ、それ以外のものは apk ファイルをブラウザからダウンロードしてインストールするしかありません。そのためにはSettingからソース不明のアプリをインストールできるように設定しておきます。 問題は apk ファイルをどう用意するかですが、自分の場合は既に Android 端末を持っていたので、そこで Root Uninstaller というアプリを使って、Twitterなどのアプリを「Backup」する方法でapkファイルをSD カード経由で取り出しました。Angry Birdsなどこの方法でインストールできました。 iOSアプリとしても有名な Pulse がプレインストールされている。 Kindle Fireには端末自体に Back ボタンや Home ボタンはなく、下からスライドして画面上に出る。 まとめ Root取らずとも、Docs, Music, Video, Apps, Web とほぼ一通りの機能は使えました。 Android をある程度 Hack した経験がないと辛いでしょう。 最後にもう一度、本体にマイクロUSBケーブルは付いていませんが必須です。 ちょっと重いかな。

2011年11月26日 · Toshimitsu Takahashi

JSONP ならぬ HTMLP を Amazon XSLT で試してみた

Amazon Web Services では Style 引数に XSL ファイルの URL を指定することでレスポンスの XML を Amazon のサーバ側でパースできる。これを使って、JSONP 形式に返すサンプルが色々あった。でも単純に表示するだけなら innerHTML に HTML を流し込むだけの方が楽だろう。 ということで JSON with Padding ならぬ HTML with Padding(で合ってる??)を試しに作ってみることにした。 function awsResult(html){ document.getElementById(‘content’).innerHTML = html; } と定義しておいて、Script タグの Padding によって、 awsResult(’ ・・・ ’); 最終的に上記のように返ってくれば、 ・・・ の部分を content に表示できる。 awshtmlp.xsl AWS に渡す XSL ファイルの内容は次のとおり。 ポイントは Callback 引数を拡張定義することで aws:OperationRequest/aws:Arguments/aws:Argument[@Name=‘Callback’]/@Value から引っ張って出力していること。これでコールバック関数名(前述の awsResult)は固定せずに済む。 また HTML 出力としているが結果は JavaScript であるので、インデントはさせない(改行はさせない)で、「’」で囲う。そして escape-apos でタイトルとラベルに含まれている場合はエスケープするようにしている。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2005-10-05" exclude-result-prefixes="aws"> <xsl:output method="html" indent="no" encoding="UTF-8"/> <xsl:template match="/aws:ItemSearchResponse"> <xsl:value-of select="aws:OperationRequest/aws:Arguments/aws:Argument\[@Name='Callback'\]/@Value"/> <xsl:text>('</xsl:text> <xsl:apply-templates select="aws:Items"/> <xsl:text>')</xsl:text> </xsl:template> <xsl:template match="aws:Items"> <ul class="amazonList"> <xsl:apply-templates select="aws:Item"/> </ul> </xsl:template> <xsl:template match="aws:Item"> <li> <a> <xsl:attribute name="href"><xsl:value-of select="aws:DetailPageURL"/></xsl:attribute> <xsl:call-template name="escape-apos"> <xsl:with-param name="target" select="aws:ItemAttributes/aws:Title"/> </xsl:call-template> </a> <xsl:apply-templates select="aws:SmallImage"/> <span class="label"> <xsl:call-template name="escape-apos"> <xsl:with-param name="target" select="aws:ItemAttributes/aws:Label"/> </xsl:call-template> </span> <span class="price"> <xsl:value-of select="aws:ItemAttributes/aws:ListPrice/aws:FormattedPrice"/> </span> </li> </xsl:template> <xsl:template match="aws:SmallImage"> <img> <xsl:attribute name="src"><xsl:value-of select="aws:URL"/></xsl:attribute> <xsl:attribute name="width"><xsl:value-of select="aws:Width"/></xsl:attribute> <xsl:attribute name="height"><xsl:value-of select="aws:Height"/></xsl:attribute> </img> </xsl:template> <xsl:template name="escape-apos"> <xsl:param name="target"/> <xsl:variable name="m"><xsl:text>&apos;</xsl:text></xsl:variable> <xsl:variable name="r"><xsl:text>&amp;apos;</xsl:text></xsl:variable> <xsl:choose> <xsl:when test="contains($target, $m)"> <xsl:value-of select="substring-before($target, $m)"/> <xsl:value-of select="$r"/> <xsl:call-template name="escape-apos"> <xsl:with-param name="target" select="substring-after($target, $m)"/> </xsl:call-template> </xsl:when> <xsl:otherwise><xsl:value-of select="$target"/></xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> サンプル HTML 下記は検索ボックスの内容を HTML with Padding(?) で投げて、結果を表示するサンプルである。 ...

2008年5月26日 · Toshimitsu Takahashi

Ruby の REXML と RSS Maker で Amazon で売れてるオライリー本のフィードを簡単に作る

使用したライブラリ open-uri rexml/document rss/maker RSS Parser ※ We retire raa.ruby-lang.org という Amazon Web Service を簡単に使えるライブラリも存在するが、単にリストを取得するだけなので今回は見送った。 コード RSS 2.0 で出力する。RSS::Maker.make(version) で引数にバージョンを入れて指定する。 Description にイメージと著者、出版日、価格を入れている。Author は複数タグあるため、カンマで結合。 同じようなものを仕事で Java で作ったことがあったが、Ruby などの Light Weight 言語の手軽さを知ってしまうと戻れない。 結果: http://feed.tilfin.net/amazon/oreilly-bestseller.xml 下記のコードでは、ファイル書き出しをコメントアウトして、CGIとしての動作を有効にさせている。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #!/usr/bin/env ruby # # Amazon O'Relly Sales Ranking # Rss feed # ################################# require 'open-uri' require 'rexml/document' require 'rss/maker' param = { 'Service' => 'AWSECommerceService', 'AWSAccessKeyId' => '☆アクセスキーID☆', 'AssociateTag' => '☆アソシエイトID☆', 'Operation' => 'ItemSearch', 'SearchIndex' => 'Books', 'ResponseGroup' => 'Medium', 'Sort' => 'salesrank', 'Publisher' => 'オライリー' } params = param.map do |key, value| "#{URI.encode(key)}=#{URI.encode(value)}" end.join("&") doc = nil open('http://webservices.amazon.co.jp/onca/xml?' \+ params) { |resp| doc = REXML::Document.new(resp) } rss = RSS::Maker.make("2.0") do |maker| maker.channel.title = "O'Reilly ベストセラー (Amazon)" maker.channel.description = "O'Reilly の Amazon.co.jp のセールストップ 10 を紹介" maker.channel.link = "http://feed.tilfin.net/amazon/orelly-bestseller.xml" number = 0 doc.elements.each("/ItemSearchResponse/Items/Item") do |item| itmat = item.elements\["ItemAttributes"\] number += 1 entry = maker.items.new_item entry.title = number.to_s + '. ' \+ itmat.elements\["Title"\].text entry.link = item.elements\["DetailPageURL"\].text desc = nil item.elements.each("MediumImage") { |img| desc = <<EOS <img src="#{img.elements\["URL"\].text}" width="#{img.elements\["Width"\].text}" height="#{img.elements\["Height"\].text}"><br> EOS } desc += itmat.elements.each("Author") { |a| a.text }.join(", ") \+ " (著)" desc += "<br>発売日:" \+ itmat.elements\["PublicationDate"\].text.gsub(/-/, '/') desc += "<br>" \+ itmat.elements\["ListPrice/FormattedPrice"\].text entry.description = desc entry.date = Time.now end end print "Content-Type:application/rss+xml\\r\\n\\r\\n" print rss #open("oreilly-bestseller.xml", "w") { |out| \# out.print rss #} #``` ※IE7だと application/rss だけではフィードだと認識されなかった。

2008年1月3日 · Toshimitsu Takahashi

Jakarta Commons HttpClient

仕事で Java Web アプリケーションサーバから Web サービスを叩いてみるということで、HTTP クライアントをどうしようかと考えた。 プロキシ認証とかリトライとかタイムアウトとか色々ありそうなので Jakarta Commons HttpClient を試してみた。せっかくなので、Amazon Web Service を触ってみる。 http://jakarta.apache.org/commons/httpclient/ package sample; import java.io.IOException; import java.io.InputStreamReader; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpMethodParams; /** * @author tosshi / public class Main { /* * @param args */ public static void main(String[] args) { HttpClient client = new HttpClient(); // ソケットタイムアウトは 1秒 client.getParams().setParameter(“http.socket.timeout”, new Integer(1000)); /* * プロキシの認証が必要なとき * * Credentials cred = new UsernamePasswordCredentials(“PROXYAUTHID”, “PROXYAUTHPASS”); * HttpState state = new HttpState(); * state.setProxyCredentials(AuthScope.ANY, cred); * client.setState(state); */ // URIを指定して GET を生成 GetMethod method = new GetMethod(“http://webservices.amazon.co.jp/onca/xml"); // リトライは3回 method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false)); // クエリをセット NameValuePair[] pairs = { new NameValuePair(“Service”, “AWSECommerceService”), new NameValuePair(“AWSAccessKeyId”, ☆取得したAWSのアクセスキーID☆), new NameValuePair(“Operation”, “ItemSearch”), new NameValuePair(“SearchIndex”, “Music”), new NameValuePair(“ResponseGroup”, “Small”), new NameValuePair(“Artist”, “BENNIE K”), }; method.setQueryString(pairs); try { // 実行 int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { System.err.println(“Method failed: " + method.getStatusLine()); } // レスポンスをアウト InputStreamReader isr = new InputStreamReader( method.getResponseBodyAsStream(), method.getResponseCharSet()); final int BUFFER_SIZE = 1024; char[] buffer = new char[BUFFER_SIZE]; int readSize; while ((readSize = isr.read(buffer, 0, BUFFER_SIZE)) > 0) { System.out.print(new String(buffer, 0, readSize)); } isr.close(); } catch (HttpException e) { System.err.println(“Fatal protocol violation: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println(“Fatal transport error: " + e.getMessage()); e.printStackTrace(); } finally { // 接続を解放 method.releaseConnection(); } } }

2007年5月23日 · Toshimitsu Takahashi