KWZのサムネイル画像
こちらの記事。
サムネイル画像に関する新事実 - 馬鹿な人日記
え!非可逆圧縮だったのか・・・
どうりでわからないわけだ・・・
「JPEGみたいな」か、JPEGのフォーマットでも見てみるか・・・って!
そのままJPEGでした。ものすごくそのままJPEGでした・・・・・・っ!
内容 | サイズ | 備考 |
---|---|---|
セクション識別子 | 4byte | KTN (最後1byteは02) |
セクションサイズ | 4byte | |
不明 | 4byte | フラグのようには見えない |
ここから、そのままJPEGの定義に従って書かれています。
その情報によると、サイズは64x80です。
また、途中に妙に規則的なデータが並ぶのは、ハフマン法テーブル定義のようです。
謎の4byteを除けば、これでサムネイルはものすごく簡単に求まりました・・・
まさかビットマップをJPEGでぶち込んであるとは・・・・・・・
確かに、可変長のフォーマットとは任天堂変なところにこだわるなと思ったのです。
サムネイルはまとめて大量にさばく必要があるので、速度を重視するとほぼ生データで入れるほうが楽だよなあと思っていたのですが、どうやら3DSにJPEGデコーダのAPIでも存在して、そいつに投げるだけでいい感じにしてくれる、ということではないでしょうか。
id:bakanahitoさんがほかの構造をまとめてらっしゃいますので、これを混ぜて暇があればソフトにしてみようか。
その他発見&軽くまとめ - 馬鹿な人日記
うごメモ3DS、KWZの簡易調査2
さとちびさんのご協力により、もう少しデータ構造が見えてきました。
はてなグループ
情報を整理してみる - 馬鹿な人日記
id:bakanahitoさんの解析記録が増えていたのでこちらも参考にさせていただきました。
サムネイル
さとちびさんがあげてくれたファイルは、単色塗りつぶしのファイルです。
id:bakanahitoさんの調査によると、0x00D0から一致データが途切れるとのことでしたが、さとちびさん'sデータでは、0xE0〜0x32Cまで、データが完全に一致しました。
また、サムネイルか完全に一致すると予想される無色塗りつぶしと、白塗りつぶしで
は0xE0から0x41Fまでの一致が見られました。
ここら周辺にサムネイルデータが格納されている可能性は高いです。でも、ppmでは1500byte以上サムネイルに必要としていたので、これだと足りないなぁ・・・
また、無色-白は一致し、ほかの色では一致しない、0xE0の前4byte(0xDC〜0DF)にサムネイルの色情報か何かがあるかもしれません。
ファイルは改造すると削除されてしまうはずですが、一覧に表示するところまではPPMの時にはできたのでもしかすると・・・?
ただ、サムネイルの実データとみられるところのフォーマットは激しく不明です。
1色塗りつぶしなのですからすべて同じ数値がずらっと並ぶと思いたいのですが、ランダムとは言えない、でも同じではない数値がならんでいます。
そのあと
0x428、無色ではここから00が続くのですが、白で塗りつぶされたデータは0x480まで00以外の数字が多く入っています。
ここは、ページまたはレイヤーのヘッダー情報が記載されている可能性が高いと予想されます。
解析したい人は白の塗りつぶしデータがいいかもしれません。
他の色での塗りつぶしだとぐちゃぐちゃになるところが、規則的なデータになる部分がありました。
さて、さらにそのあと。白の塗りつぶしを見た結果です。
100byte程度の不明データの後に0x08という特徴的な数値が15byte、F9 00やA9 5Dをはさんでまた0x08というのが続きます。ここらへんが本データとみるのが妥当でしょう。
PPM時代で考えると、F900などは行ごとのデコード用のデータの可能性が高く、その前の100byte程度のデータはそのレイヤーのデータかもしれません。
とにかく、これ以上は実機なしでは限界そうです・・・
うごメモ3DS、KWZの簡易調査
さとちびさんがkwzファイルを上げてくれたので、中を見てみました。
はてなグループ
といっても、少し前にほかの方が同様の解析を行っているみたいです^^;
うごメモ3D解析 - 馬鹿な人日記
とりあえず、上の方とかぶる部分は大きく省きます。
まず、ファイル名。PPMの方では16進数と10進数の組み合わせだったのですが、このバージョンでは小文字と数字をすべて使うみたいです。
PPMのときはMACアドレスや作品の書き換え回数でファイル名が変化していました。
うごメモPPM仕様まとめ(1) 作者IDと作品ID - NoMeaning
そのあと。
さとちびさんからもらったメモデータがどのようなものかわからないのでなんとも言えませんが、0xE0付近から妙に上位ニブル(上4bit)が妙に平坦なデータが続く。
そのあとも乱数とはいいがたい、連続データとみられるものが並ぶ。
なんらかのヘッダー情報の可能性がある。PPMでは、サムネイルデータや各ページへのアドレスリストなどが格納されていた。
0x330あたりから乱数データが始まるので、そこが画像データか。(もしくは、上の部分が画像で、ここから音声データなのか)
僕の3DSなしでは限界がありますね。本当はループなどごとにファイルを作っては見て、作っては見てを繰り返してフォーマットを確かめるのですが、さすがにほかの方にそこまで負荷を負わせるわけにはいかんです・・・
PPMWatch2.0.0.1β & ソース 公開
PPMWatch2.0.0.1βを公開しました。
http://www.geocities.jp/ugomemo_harimau/PPMWatch2/
そして、同時にソースコードも公開しました!
そのためにいろいろ仮想メソッドにしたり、protectedにしたりしています。
とりあえず現在は再使用禁止ですが、使いたければ言ってください。
意見募集中!
機能の追加のご要望受付中です。
なお、こちらでも情報公開中です。
Harimauの編集記録等 - うごキャラクラブ
うごメモ仕様まとめ(3) うごメモはてな上にあるいろいろな情報2
前回の書き忘れみたいなもんです。
コメント
メモのコメントは違うページになっています。うごメモはてなでもAjaxで動的に読み込まれています。(Javascriptがoffだとiframe)。そのページのURLは
http://ugomemo.hatena.ne.jp/作者ID@DSi/movie.comment/作品ID
となります。
- div.comment-pager 最初と最後にあるコメントのページャーです。ここから現在のページや合計ページ数を取得できます。
- li 一つ一つのコメントはliによって囲われています。以下の属性が存在します。
- class このメモの作者のコメントにはmovie_authorがつきます。また、id:ugomemohatenaのコメントは「 ugomemohatna」がつきます。それ以外は空文字のようです。
- data-author-name 「(作者名)さんのコメント」という文字が入ります。
- data-qm-uriコメントがうごメモシアターのちょっとメモで行われている場合、その場所を示します。ちょっとメモでない場合は空文字です。
- li > span.commentheader ヘッダ情報ここから作者画像、作者名、ID、投稿日時、コメントIDを取得できる。
- li > span.commentheader > span.timestamp > a hrefにコメントの個別ページ、nameには(id)-cの後ろにタイムスタンプと思われるコメントIDがついている。コメントIDは一意識別子として利用可能な模様。
- li > span.commentheader > span.timestamp > a > time datetime属性に具体的な投稿日時が書いてある。
また、コメントを削除できる権限を持っている場合、li > span.commentheaderの最後に消去用のフォームが現れる。それと、コメントには作品が貼り付けられる場合があるので考慮すること。さらに、id:ugomemohatenaのメモ(それ以外のIDでもあるかもしれないけど)にはspan.commentheaderの最初にはa[href="/images/ugomemo_police.png"].iconが存在します。(うごメモポリス!?)
なので、絶対にspan.commentheaderは要素の番号で取得しないようにしてください。XPathやセレクタ、要素名などの手段で絞ってください。
メモ検索
検索ページは以下。
http://ugomemo.hatena.ne.jp/search?word=■&obj_type=●
■には検索キーワード(URLエンコードしてください)
●には検索タイプ(author、channel、movie)
●を省略すると、作者とチャンネルが3つと、作品がいくつかの検索結果が出てきます。
2ページ目以降はmovieと同じになります。
コマンド検索
コマンド検索は、XMLで取得することができます。途中までの入力でも可能です。うごメモはてなでもAjaxで動的に結果を取得しています。5個以上入力した場合にのみ取得していますが、1つでも取得できます。ただし、いうまでもなく正しいものはまず出てこないので、リソースの無駄遣いを減らすため、5つ以上の時だけ取得するべきでしょう。
取得
XMLのURLは以下です。
http://ugomemo.hatena.ne.jp/c.xml
パラメータはcommand_prefixの1つだけのようです。指定されていないと400が返ります。
2ページ目以降はたぶん取得できません。不便不便。指定の際には以下を半角で指定します。
↑ | N |
→ | E |
← | W |
↓ | S |
A | A |
B | B |
X | X |
Y | Y |
L | L |
R | R |
結果
XMLは以下のような構成になっています。[]は属性を示しています。
items[command_prefix]
┣dsi_users
┃┣dsi_user[command]
┃┗以下dsi_userが複数
┣channels
┃┣channel[command]
┃┗以下channelsが複数
┣movies
┃┣movie[command]
┃┗以下movieが複数
items[command_prefix]は、command_prefixパラメータが入ります。dsi_users、channels、moviesは形式が同じです。commandはそのアイテムのコマンド。(上の表のようにアルファベットになっています。)また、かくアイテムリストの中身が存在しない場合、
それぞれのアイテムの中身はHTMLとなっており、タグなどもエスケープされてテキストノードになっています。検索ページにそのまま使われているようです。
絵文字
うごメモではちょくちょく絵文字が使われます。(ちなみに、絵文字の概念は日本発祥なので、外国でも「emoji」と表記されます。)PCのUAで取得した場合、imgタグとして展開されます。
- DS絵文字
<img src="http://ugomemo.hatena.ne.jp/images/dsi/m/U+E000.gif" alt="" width="11" height="13" class="emoji emoji-ds">
となり、altに絵文字の番号が、hrefに画像のURLがあり、そのファイル名から文字コードを取得できます。また、この場合はclassにemoji_dsが指定されています。
これは、DSがUnicodeの空き領域に絵文字を入れたのでこうなっています。
- Google絵文字
はてなプラスになると使える絵文字では、
<img src="http://ugomemo.hatena.ne.jp/images/emoji/e-962.gif" alt="" width="16" height="16" class="emoji emoji-google">
のようなものが存在します。
これはGoogleとかが制定したunicodeの絵文字です。
http://www.unicode.org/~scherer/emoji4unicode/snapshot/emojidata.pdf
に一覧表が出ています。上のe-962を見るとケーキになっていますね。
この表やGitHub - google/emoji4unicode: Automatically exported from code.google.com/p/emoji4unicodeあたりも参考。
これら(DS絵文字のみ?)は作者名に使われることもあり、その場合にはなんと堂々と作者名にimgタグが挿入されています。属性でも。なので、作者名の変数のサイズは可変にするかimgタグをUnicodeに変換して保存しないと面倒なことになります。作者名をUnicodeに変換するルーチンが必要なりそうです。
ソフトを作る場合、はてなの画像を使うなら負荷を減らすため先にまとめてダウンロードしてローカルにおいておくことを強く推奨しておきます。
ケータイで見た場合、それぞれのキャリアの絵文字となって表示されます。
投稿作品ID
(投稿作品IDについてはうごメモPPM仕様まとめ(1) 作者IDと作品ID - NoMeaning参照)
うごメモシアターと通報ページにのみ書いてあります。
チャンネル
関連付けた作品一覧も別ページになっていてAjaxで作成されています。
http://ugomemo.hatena.ne.jp/作者ID@DSi/movie.channels/作品ID
このページには以下の情報が含まれます。
- チャンネル名
- サムネイル
- 関連付けた作者名(本人の場合のみIDが書いてある模様)
- 解除権限がある場合、解除ボタン
不明
http://ugomemo.hatena.ne.jp/作者ID@DSi/movie.children/作品ID
を指定するとおかしなページが表示されます。文字がなく、一部のタグが壊れています。
bodyのdata-children-path属性にこのページが指定されているのですが、最近までそんなのなかった気が。
将来的に何かがある可能性があります。
うごメモ仕様まとめ(2) うごメモはてな上にあるいろいろな情報
うごメモ仕様まとめ一覧 - NoMeaning
うごメモはてなにあるいろいろな情報の一覧です。
普通にうごメモはてなからみられるものは省略します。
なんか書き忘れている気がするので後で追加するかもしれません。
作者の情報
普通では見られないものや、内部処理用のデータです。
- お気に入り作者
お気に入りにしている作者をJSON形式で取得することができます。(javascripterならJSONはみんな好きですよね!!)
http://ugomemo.hatena.ne.jp/(作者ID@DSiかはてなID).favorite_authors?mode=js
ちなみに、?mode=の後ろにいろいろつけてみましたがどれも404でした。ほかに404以外のものがあれば教えて。
これをパースすると以下のように処理可能です。
items
├item
│├key 「/作者ID@DSi/」(なぜkeyか知らないけどデータベースの主キーとしてでも使っているのでしょうか)
│├name 「作者名」
│├path 「/作者ID@DSi/」(作者ページからホスト名をとったものと思われる。keyと同じ)
│├profile_icon_path 「http://image.ugomemo.hatena.ne.jp/thumbnail/作者ID/メモID_s.gif」(作者のサムネイルに設定されているメモの画像)
├item
・・・(以下続きます)
RSSでの情報
うごメモはてなランキングのRSSはパラメータである程度情報を指定することができます。
うごメモはてなランキング RSS フィード - Hatena Developer Center
ほかのチャンネルや作者にもRSSフィードがあり、更新を監視することができます。
ここでは上記のページのパラメータのうち、「locale.region」と「locale.lang」のみ有効です。
RSSの規定に従っているほか、独自のデータも含まれています。
追加されているデータは、「hatena名前空間」と「ugo名前空間」に配置されています。
hatena名前空間ははてな全体で同じもので、仕様も公表されています。
はてなXML名前空間 - Hatena Developer Center
うごメモの名前空間、ugoについて、簡単にまとめてみます
ルート要素直下の「channel」要素の下には情報があります。
- @about チャンネルや作者ページのリンク
- title RSSのタイトル
- link チャンネルや作者ページのリンク
- description チャンネルや作者の説明文
- dc:creator 作者名
- ugo:count メモの数
- ugo:first 最初のページのURL
- ugo:lastPage 最後のページ番号
- ugo:last 最後のページのURL
- ugo:currentPage 現在のページの番号
- ugo:textLang 言語
- ugo:regionCode 表示する範囲
- ugo:offset このページにある最初のメモが全体の何番目のメモか
- items このページに含まれるメモの一覧
疲れたので、あとは気合で・・・
そのほか
はてなのAPIを使うことでスターなどの情報を得られる場合があります。
TOP - Hatena Developer Center
うごメモ仕様まとめ(2) うごメモはてな上のメモファイル
うごメモ仕様まとめ一覧 - NoMeaning
うごメモシアターにアップロードされたメモは、うごメモはてなのために様々な形式に変換されて、HTTPでダウンロード可能になります。
画像形式
メモのサムネイル画像およびサムネイルのアニメーションはこちら。
うごメモはてなのサムネイルGIF一覧表 - NoMeaning
うごメモ形式と動画形式
うごメモで扱えるPPM形式のファイルや動画のファイルは以下のようになります。
http://image.ugomemo.hatena.ne.jp/(拡張子)/作者ID/メモID.(拡張子)
のようになります。
なので、PPMファイルの場合http://image.ugomemo.hatena.ne.jp/ppm/作者ID/メモID.ppm
FLVファイルの場合、http://image.ugomemo.hatena.ne.jp/flv/作者ID/メモID.flv
対応している形式は現在は以下です。
FLV、PPM、3GP、3G2
cloudfront.net
各形式はcloudfront.net上にも置かれています。
cloudfront.netというのは、アマゾンが運営する「CDN」と呼ばれるものです。
詳細 => Amazon CloudFront(グローバルなコンテンツ配信ネットワーク)| AWS
たとえば、うごメモはてなのプレイヤーでは、このcloudfront.netのURLを指定しています。
私も詳しくはないのですが、CDNについて簡単に説明しておきますと、ファイルをいろいろなところに自動で置いておいてくれるシステムのことです。長い距離の通信にはどうしても時間がかかりますが、CDNを使うと近いところからダウンロードできるのでとても速くなります。