2015年12月22日火曜日

Yukari for Android 1.2

この記事は「Twitterクライアント開発マン Advent Calendar 2015」 22日目の記事です。


結月ゆかりさん、お誕生日おめでとうございます。心よりお祝い申し上げます。

長い長い混迷の期間を経て、ついに時間切れです
2015年の最後に、Yukari for Android 1.2.1をお届けします。


Yukari 1.2.1の新機能

正直、Yukari 1.2alphaが長かったので皆さん飽きているでしょう。というか、1.1からの差分をまとめていたらキリがありません。1.2.0alphaの最終一般リリース(r.244)からの差分をお届けします。

  • フィルタシステム / Yukari Query β
  • QRコードのテキストプレビュー機能
  • 再生不能な動画リンクを極力避けるように判定を修正
  • ページングの状態がタブ切り替えによってリセットされるバグの修正
  • ブックマーク上でプラグインを起動する際、表示と1つずれて起動されてしまう(最悪落ちる)バグの修正
  • 5インチ以上の端末で使うとサムネイルが極端に小さくなるバグの修正
  • ナルシストオプションの可否に関わらず、TLタッチ拡張で自己ふぁぼが行えるバグの修正

フィルタシステムについて

以前より長らく予告していた、ツイートの高度フィルタリング機能の実装です。
名前は「Yukari Query」と言います。ベースとなった言語をもじりました。
時間とやる気、他様々な要因によって、まだβ段階です。

ベースはSQL, Krile Query (StarryEyes), Lispです。これらを参考として、大枠にはSQL, KQ形式の表現で見やすさを、条件評価式の記法にS式を用いることで実装の手軽さを取りました。

どのような言語になっているか。最低限、何でも表示するとしたらこうです。
from * where (t)

大枠として from や where といったSQLライクな記述が見られます。これは存じている方であればその通り、ツイートの取得元、その抽出条件をそれぞれ表します。
from句の * は「全ての受信ツイートを対象とする」といった意味を持ちます。ちょうどKQのそれに近い性格を持ちます。
では、where句はどうでしょう。(t) はS式由来の記法となります。
この場合、(t) の t とはブーリアン値のTrueを指しますので、結果は真ですね。それだけですので、ツイートは全て真と評価され、TLに表示されることでしょう。

詳しい説明は、Yukari Wikiの以下ページを御覧ください。
Yukari Wiki / Yukari Query

Yukari Queryを使用するには、以下の方法があります。

  1. Filter タブを作成する
    タブの編集画面で、Filterタブを作成してください。
    作成後、エントリを長押しするとクエリ編集画面が開きますので、クエリを入力して保存して下さい。
    再起動後、保存したクエリでタブが有効になります。
  2. 「クエリを実行」コマンドを実行する
    検索メニューに新設されています。これをタップすると、クエリ編集画面が開きますので、クエリを入力して実行して下さい。新規タブで実行されます。


このエントリの残りでは、Yukari Queryのサンプルを幾つか紹介します。Wikiと被るかもしれませんが大目に見てください。
見やすさのため、改行とインデントを加えていますが、実際の入力の際には適当なスペースが空いていればだいたい解析してくれます。

from home:"<screen_name>" where (in ?text "ゆかり")
Home TLから、本文に"ゆかり"という語句が含まれているツイートを抽出します。ごく基本的な形です。

from home:"<screen_name>" where (or
  (in ?text "ゆかり")
  (in ?text "Yukari")
)
"ゆかり"だけでは飽きたらず、"Yukari"も含めてしまいましょう。このように、or関数を用いることで複数の条件を指定することが出来ます。もちろん、and関数もありますよ!
orが"いずれかが真"、andが"全て真"、ですね。

from home:"<screen_name>" where (regex ?text "(結月)?(ゆかり|ユカリ|[Yy]ukari)")
たとえば本文でいずれか、のような条件が多くなってきたら、正規表現を検討するのもありかもしれませんね。この場合、"ゆかり""Yukari""yukari""結月ゆかり"なんかが該当しますかね。
regex関数では、Javaの標準ライブラリが扱える形式の正規表現を使用することが出来ます。詳細はJava SE6のJavadocとか読んでください。
パフォーマンスは計測してないので、まぁなんというか無理はしないでくださいね。

from * where (and
  (= ?source "Yukari for Android")
  (or
    (in ?text "ユッカリーン")
    (regex ?text "(ゆかりさん){2}")
  )
)
まぁ、なんだ。アレだ。y4aで様々な愛情表現を行っているツイートを抽出する例です。

Krile Queryなどを使ったことがある人なら、すぐにどんなことができるかピンと来るかもしれません。そうではない人は、あまりピンと来ないかもしれません。
要するに条件をつなげて俺だけのタイムラインを作るぜ、という夢がモバイルでも始まったということです。

Yukari Query実装の最大の理由は「モバイルでも妥協しない、デスクトップクライアント並のことをするための機能を載せる」ってことです。
操作しにくくスペックも劣るモバイルだからこそ、できる範囲でスマートにこなせるようにする。それは方向性としてとても正しいと思います。
ですが、昨今の端末はどうでしょうか。昔と比べたらスペックも上がりました。3Dモデルがわいわい動きまわるリッチなソーシャルゲームをしている人も増えました。例えば白猫や乖離性、一昔前と比べたらだいぶすごいですよね。それを支えられるだけの力を持った機種がたくさん出回っているのです。
なら、テキストの大量処理なんて、できないわけないですよね?
じゃあ、やってみましょうよ。ってことです。

これからヒマな時に、徐々にfromソースなどを増やして実用的にしていきます。

バグ報告や要望は@yukari4aで受け付けております。
それでは、これからもよろしくお願いします。そして良いお年を!