2014年2月24日月曜日

Androidが4.4で絵文字にちゃんと対応した

というわけで、随分前のことなんですが、

絵文字を入力できるマッシュルームアプリを作りました!

絵文字マッシュ - Google Play の Android アプリ
https://play.google.com/store/apps/details?id=jp.mstssk.emoji_mush
公開したのは2013年11月18日なんですが、サボってblog書いてませんでした。

※以下、絵文字について知ってることをつらつら書いています。間違ってたら、Twitterかコメント欄でツッコんでください。

KitKatで絵文字を改めてサポートした

2013年10月31日にリリースされた Android 4.4 KitKat にて、絵文字への対応が一新され、カラフルな絵文字がしっかり表示されるようになりました。
Android - 4.4 KitKat
http://www.android.com/versions/kit-kat-4-4/
4.3 Jelly Bean 以前でも絵文字は表示できていましたが、いくつかのものが白黒で表示されるのみで、殆どが表示できていない状態でした。
※メーカーのカスタムにより絵文字フォントがなくなってしまっている機種もあります。

ガラケーの絵文字に対応したわけではない

KitKatで対応したのは、Unicode 6で定義された絵文字です(最終的にUnicodeに含まれなかったものもサポートされています)。
ガラケーの絵文字については、各キャリアから販売されているAndroid端末は元々対応しています。

今回の絵文字対応というのは、ざっくり言ってしまえば「iPhoneで使ってる絵文字がAndroidでも表示されるようになったよ」という事だったりします(絵は違っています,後述)。
元々、iPhoneの方が先行してUnicodeの絵文字を表示・入力できるようにはなっていました。
そもそもUnicodeの絵文字は、ガラケーの絵文字を元にGoogleとAppleが共同でUnicodeに提案したものが元になっているのです。
絵文字の符号化提案は Google および Apple 社によって共同提案され、2009 年 2 月 6 日に Unicode 技術委員会にて正式に了承されました。

Google Japan Blog: 絵文字の Unicode 符号化に関するアップデート
http://googlejapan.blogspot.jp/2009/03/unicode.html

そのため、iPhoneではUnicodeの絵文字(最終的にUnicodeに含まれなかった物も含めて)をサポートしており、遅れながらもAndroidも対応するようになりました。

勿論、ガラケーの絵文字をそのまま国際的な規格に持っていけるわけがありません。
そのゴタゴタについて特集したコラムがあります。読み物としても面白いのでオススメです。
特集 : 絵文字が開いてしまった「パンドラの箱」 - CNET Japan http://japan.cnet.com/sp/column_emojipandora/

ガラケーの絵文字は?

国内のJelly Bean以前のAndroid端末では、ATOK for Androidなどの絵文字入力機能を使うことで、従来のガラケーの絵文字を入力できていました。
実はこの時入力しているの絵文字は、Unicodeのものではなく、Googleが独自に定義したコードポイントだったりします。これは、Unicodeへの提案より前にGmailでガラケーの絵文字を相互置換するようにした際の、中間コードとして定義されたコードポイントです。
相互置換機能の成果物が emoji4unicode として公開され、それを元にUnicodeへの提案も行われました。

emoji4unicodeによる、各キャリアとGoogleの定義したコードポイントの対応表は、Unicodeコンソーシアムのサイト上で公開されています。
Emoji Symbols: Background Data
http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html
※サイズが大きいページなので注意!

ちなみに、キャリアメールソフト上での絵文字入力機能については、手元に環境が無いし普段使ってないので調べてません。
同様にGoogleのコードポイントで入力しているか、何かゴニョゴニョしてるんでしょう。いずれにせよ、メールサーバ側で各キャリアの絵文字の相互置換が必要なので、あまり変なことはしていないと思います。

デザインしたのは日本の会社

Googleが Googleハングアウト で使われていた絵文字を AOSP にポーティングしたことで、Androidでこんなに綺麗な絵文字が使えるようになりました。
そして、このハングアウトの絵文字は日本の IC4DESIGN という会社が作ったものでした。すごい!
日本の絵文字を世界へ: 日々の日記
http://ic4design.cocolog-nifty.com/ic4design/2013/05/post-f655-5.html
google hongout of IC4DESIGN'S WORKS
http://ic4design.com/top4/Coner/pg839.html

ちゃんと表示されない絵文字もある

至れり尽くせりかと思った絵文字対応ですが、「数字の囲み文字」と「国旗絵文字」はまだちゃんと表示されない様です。

「数字の囲み文字」と「国旗絵文字」自体については、下記ページを読んでいただければ面倒くさいことがわかると思います。
絵文字だョ! 符号化文字集合(後編) | mixi Engineers' Blog
http://alpha.mixi.co.jp/2012/10663/

つまりは、特別な文字の組み合わせで1つの絵文字を表すものが軒並みちゃんと表示されていないんです。
Nexus5(4.4.2 KitKat)で実際どのようになっているかちょっと調べてみました。
Unicode 文字 数値参照 期待している表示 実際の表示 期待している表示が実際に割り当て
られている文字(Googleによる独自定義)
U+0031 U+20E3 1⃣ 1⃣







U+FE82E
U+1F1EF U+1F1F5 🇯🇵 🇯🇵







U+FE4E5
※画像はNexus5(4.4.2 KitKat)でのハングアウトアプリ上の表示のキャプチャ。日の丸のみWebのハングアウトのキャプチャ。

囲み文字はちゃんと直前の文字と結合していないし、国旗も Regional Indicator Symbol の代替アルファベット表示になっています。
その代わり?に、本来表示されて欲しい文字シンボルはGoogle独自定義のコードポイントに割り当てられています。
かと言って、Google独自定義のコードポイントの方ならすべてちゃんと表示されるかというと、そうではありません。Nexus 5で試したところ、Google独自定義のコードポイントで表示されるのは、この囲み文字と国旗絵文字だけでした。

ちなみに、問題の絵文字はKitKatのデフォルトのキーボードの絵文字パレットにも含まれていません。「あぁ、結合文字対応するの諦めたんだろうなー」と思ったりしましたが、ちゃんと表示されてくれないのはやっぱり嫌なのでAOSPにチケットは投げておきました。是非皆さん★を付けましょう。
Issue 66045 - android - Several emoji symbols(Keycap numbers and Regional flags) are not correctly with KitKat. - Android Open Source Project - Issue Tracker - Google Project Hosting
https://code.google.com/p/android/issues/detail?id=66045

アプリ作成時の愚痴



参考

  • List of iOS Emoji http://www.grumdrig.com/emoji-list/
  • Emoji unicode characters for use on the web http://apps.timwhitlock.info/emoji/tables/unicode
  • emoji4unicode - Emoji for Unicode: Google Emoji private use mapping data and tools - Google Project Hosting https://code.google.com/p/emoji4unicode/
  • Emoji Symbols - Unicode Symbols https://sites.google.com/site/unicodesymbols/Home/emoji-symbols
  • Unicode絵文字とキャリア絵文字 http://www.slideshare.net/hiroakiohashi148/unicode-24674603
  • NotoColorEmoji.ttf - platform/external/noto-fonts - Git at Google https://android.googlesource.com/platform/external/noto-fonts/+/kitkat-release/NotoColorEmoji.ttf

    ↓サイズが大きいページなので注意
  • Emoji Symbols: Background Data http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html
  • Emoji unicode characters for use on the web http://apps.timwhitlock.info/emoji/tables/unicode

    変更履歴

    修正 2014-04-11
    Nexus 5のAndroidのバージョンを間違えていたので修正。
    4.4.3 -> 4.4.2
  • 2013年7月26日金曜日

    gitはじめて勉強会

    先日、内輪でgitの勉強会で講師をやってきました。

    資料

    当日使ったスライド。
    あまりgitはどうだなんだという説明はせず、とにかくハンズオンでやってみる事が目的でした。


    反省点

    講師っていうのは初めてだった事もあり、諸々反省点がありました。
    • 内容が参加者に合っていなかった
      講師の都合でterminal上での操作前提の内容にしていたけど、慣れていない人に教えるにはやはりSourceTreeなど使った方がいいかもしれない。
      自分では commit や diff 見る程度はEclipse上でやるけど、その他はterminal上でばっかり操作していて、他のやり方を教えられるほど知らないのがネック。

    • つめこみ過ぎた
      git init から push まで粗方詰め込んだ上で、その他のコマンドの説明も諸々…という内容にしたら、目的が何処かに行ってしまった感じになった。
      色々やるより、必要最低限をしっかりやる方が最初のとっかかりとしては良さそう。
      細かい説明はいちいちせずに「○○をするにはどうするか」という目的ベースで進めた方が覚えやすいかな。

    • 脱線し過ぎた
      ただでさえ詰め込みすぎて時間の余裕があまり無いのに、途中途中の質疑応答に時間をかけすぎた。push の話をする頃にはタイムオーバーだった…
      場合によってはバッサリ時間を切って進めて、時間配分をずらさないようにしないと、なかなか話が進まない。

    第2回があるかどうかは皆の声援次第。

    2013年5月16日木曜日

    PlayMusicアプリが新しくなってた

    Google I/O 2013の開催と同時にPlayMusicのAndroidアプリが更新されてたのでちょろっと書きなぐった。

    所感メモ


    String.prototype.replaceのコールバック関数

    jsの String.prototype.replace メソッドは正規表現とコールバック関数を使った時、コールバック関数の引数が正規表現のマッチグループの数によって変わる。
    知らなかったので、ちょっと試して確認した時のメモ

    GoogleChrome バージョン 24.0.1312.52 で動作を確認したもの

    ただの文字列:

    1:マッチした部分
    2:マッチしたインデックス
    3:元の文字列全体

    グループの無い正規表現:例 /[a-z]/

    ただの文字列の場合と同じ

    グループが1つの正規表現:例 /a([a-z])/

    1:正規表現マッチした部分
    2:マッチしたグループ部分
    3:マッチしたインデックス
    4:元の文字列全体
    試したコード
    "abcd".replace(/a([a-z])/, function(a,b,c){console.log(a,b,c);return a;});

    グループが2つの正規表現:

    1:正規表現にマッチした部分
    2:マッチした1つ目のグループ部分
    3:マッチした2つ目のグループ部分
    4:マッチしたインデックス
    5:元の文字列全体
    試したコード
    "abcd".replace(/a([a-z])([a-z])/, function(a){console.log(arguments);return a;});

    グループが3つの正規表現:

    マッチした部分の引数が増えて、インデックス・元の文字列全体が後ろにずれる。

    まとめ

    正規表現にgオプションを付けた場合も、それぞれのマッチ部分に対してそれぞれ上記同様にコールバック関数が呼ばれる。

    仕様書を読むと、
    第1引数:マッチした部分文字列
    マッチグループ(captures)の数分の引数
    マッチグループ(captures)の数+2番目の引数:マッチしたインデックス(マッチした文字列までのoffset)
    マッチグループが無いなら第2引数。1つあれば第3引数。2つあれば第4引数。
    マッチグループ(captures)の数+3番目の引数:元の文字列

    MDNのページに大分詳しく載ってる。

    参考

    2013年2月7日木曜日

    UbuntuでのEclipseのツールチップの色を変更する

    Unity採用以後のUbuntuで使われているGnomeのAmbianceテーマは、Eclipse上でのツールチップ表示の背景が真っ黒になってしまって見辛いったらありゃしない。
    背景色を変更する方法を見つけたのでメモ。

    テーマの色を変更する方法

    themes - How to change tooltip background color in Unity? - Ask Ubuntu
    http://askubuntu.com/questions/70599/how-to-change-tooltip-background-color-in-unity
    上記Q&Aでは、回答として大別して3つの方法が寄せられている。
    1. テーマの設定ファイルを直接書き変える
    2. gnome-color-chooser を使う
    3. ~/.gtkrc-2.0 に記述する
    今回は3つ目を採用。/usr/の下を直接書き換えるのは気が引けるし、~/.gtkrc-2.0 は作ってあってコピペできる記述例もあったので、gnome-color-chooserをインストールするより早いだろう、と。

    設定ファイルの内容

    ~/.gtkrc-2.0 に以下を記述する。
    style "gnome-color-chooser-tooltips"
    {
      bg[NORMAL] = "#FFFFAF"
      fg[NORMAL] = "#000000"
    }
    widget "gtk-tooltip*" style "gnome-color-chooser-tooltips"
    

    参考ページにある例では、~/.gtkrc-2.0-gnome-color-chooserという別ファイルに記述して、そのファイルを読み込む設定(include ".gtkrc-2.0-gnome-color-chooser")を~/.gtkrc-2.0に記述するようになっているが、手っ取り早く直接記述した。
    これでツールチップが見覚えのあるクリーム色になった。

    環境

    • Thinkpad x201s
    • Ubuntu 12.04.1 LTS Precise Pangolin
    • Eclipse 3.7 Indigo

    2013年1月23日水曜日

    GoogleChromeはページを指定してPDFを開ける

    GoogleChromeの内蔵PDFビューワはページを指定してPDFを開けます。

    PDFのURLの末尾に「#page=5」とか付けるだけ。

    ↓の場合なら、PDFの4ページ目を開いてくれます。
    http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=4

    ページ番号は0から始まるので注意。