あの人に会ひたい


これは何?

このプログラムはAndroid向けのAppWidgetです。


昔、昔、大昔、Windowsがまだ98と呼ばれていた時代。
それはそれは多くの人に愛されたデスクトップマスコットがありました。
それは「何か」と呼ばれました。


このプログラムはデスクトップマスコットとして存在した一人の少女と化け物を、当時のPCにも負けない性能を持つ携帯に召喚するものです。
携帯はAndroidでなければなりません。

ここにiPhoneは無い。帰れ。

謝辞

伺か」は以下が本家となります。

http://usada.sakura.vg/


シェルは「補完さくら」を利用しています。
現在は派生の「.さくら」として公開されています。
管理者はdot_stationの駅長様(id:dot_station)です。
「.さくら」については以下をご覧ください。

http://www.nanican.net/dot-sakura/

「さくら」のシェルはオリジナルはsaxyun氏により描かれました。
その後複数の方の手によりsurfaceが追加されてきたとのことです。

ドットステーション様の二次利用に関する記述より当方が使用可能と判断しました。
しかし、問題が発生した場合には直ちに公開を停止いたします。


また色々な面でSSTP Bottleサイト様にはとてもお世話になりました。

http://bottle.mikage.to/index.shtml


他にも数々のサイトの情報を参照させて頂きました。
皆さま、ありがとうございました。

インストール方法

そうです。またなんです。
マーケットからダウンロードできるなんて、思わないでください。
作者はマーケットのIDすらまだ取っていません。

http://code.google.com/p/android-apps-by-minghai/

またここから頑張ってソースコードをダウンロードしてください。
プロジェクト名はNiseSakuraです。


頑張ってビルドしたら頑張ってインストールしてください。
頑張って起動したら、きっとその努力が報われるはずです。


インストールが済みましたら、ホーム画面にて画面上の空いているところを長押ししてください。
すると、ダイアログが出ますのでウィジェットを選択してください。
ウィジェットの選択ダイアログに変わったらうにゅうのアイコンを探してクリックすればOKです。
この時、このウィジェットウィジェットに許される最大サイズを利用します。
必ずショートカットや他のウィジェットを何も置いていない画面にて実行してください。

何ができるの?

かつて「任意」は人格を形成するゴーストと外観を形成するシェルの二つを持ち、自ら話すことも姿を変えることもできました。
しかし長い年月が過ぎ、彼女はそのゴーストを失い話す言葉も失ってしまいました。


…嘘です。


作者の手抜きにより、まだゴーストは移植されていません。
そのため少女と化け物は自ら話すことができません。
ユーザーさんは彼女と化け物に言葉を与えてあげてください。


「何か」に話してもらうにはさくらスクリプトを書く必要があります。
「何か」に送るさくらスクリプトの1単位をメッセージとここでは呼びます。


Android上での「何か」はメッセージをキューイングし、自動的には開始しません。
これはAndroidではアプリは全画面のActivityとして実行されるため、通常他のアプリケーションを実行時にはWidgetを見ることもできないためです。


メッセージが存在する場合、うにゅうを押すとメッセージが再生されます。
もう一度押すと一時停止になりますが、現在再生中のメッセージは失なわれますのでご注意ください。
うにゅうを連打すると先に進めます。再起動後に同じメッセージが表示された場合にお使いください。

どうすれば話すの?

彼女と化け物に言葉を吹き込むには3つの方法があります。


彼女と化け物に話してもらうにはさくらスクリプトを覚える必要があります。
難しそうですが、とても簡単です。
さくらスクリプトに関しては以下のボトルご本家の説明をご参照ください。

http://bottle.mikage.to/start.html


現在、使用可能なsurfaceは0から8までと20の看板のみです。
うにゅうは10と11だけです。
存在しないサーフェスが指定された場合、任意は0、化け物は10にて代替されます。

サーフェスに関しては以下のサイトにある表がとてもわかりやすいです。

http://www2.airnet.ne.jp/~sirataki/ukagaka/bottlable.html

この表からわかるとおり、本家様では複数のゴーストが使えます。
しかし、現状のWidgetは「任意」しか利用できません。

Android版さくらスクリプトインタプリタは独自の仕様があります

  • スクリプトの実行以前にサーフェスは0と10に、吹き出しの中身は全てクリアされます
  • \tは意味がありませんが、最初に付けてください
  • \eはその行のそれ以降の記述を全て無視します
  • 操作対象が\hや\uで変更されたとき、新しい対象の吹き出しはクリアされます。
  • \URLに対応していません。URLは直接記述してください。(Bottle除く)
  • ユーザーさんのクリックを求めるような機能は一切実装されていません
  • 食べ物などの辞書も、%msなどの辞書コードも実装されていません
  • 吹き出しのスクロールが実装されていません。長いセリフは避けてください
Twitterを使う

Twitterに専用のID、@nisesakuraを用意しました。

さくらとうにゅう (@nisesakura) | Twitter

御自身のアカウントから好きなクライアントを使って@nisesakuraに向けてさくらスクリプトをリプライとして送ってください。
すると世界中でAndroidに「何か」をインストールしている人全て、およそ私一人が(^^;、あなたのさくらスクリプトを読むことができます。


このとき@nisesakuraのidの後に必ず空白を1個だけ置いて、\tから始めてください。
\tはこのプログラムでは何も行ないませんが、さくらスクリプトであるかどうかの判定に使われています。
\tから始めないとさくらスクリプトではないとして、無視されます。


140文字でさくらスクリプトの会話を書くのはかなり大変です。小ネタで勝負してください。

現状では10分に1回チェックです。変更できません。

SSTP Bottle

SSTP Bottleのログ取得APIをポーリングして、「任意」が話します。
残念ながらSSTPを正確に移植した訳ではないのでポーリングです。リアルタイムに表示はできません。
また投稿機能がまだありませんので、読むだけです。
チャンネルは全チャンネルを読み込みます。
ゴースト指定は無視していますので、誰用のスクリプトも「任意」と化け物が話します。

現状では10分に1回チェックです。変更できません。

暗黙Intent

Androidマルチタスクが利用可能な、本物のLinuxシステムです。
Intentを用いてプロセス間通信が可能です。

Intentを用いて少女と化け物にさくらスクリプトを届けることができます。
つまりどんなプログラムからでも「任意」に話をさせることが可能です。


以下のコードを参考にしてください。

          Intent intent = new Intent();

          intent.setAction(Intent.ACTION_INSERT);
          intent.setType("text/sakura_script");
          intent.putExtra("message", line);
          ComponentName name = startService(intent);

アクションにはVIEWとINSERTが現状で使用可能です。
VIEWは他のメッセージが再生中でなければ再生をすぐに開始します。
INSERTはキューにメッセージを加えます。
通常はINSERTを使用してください。
VIEWを用いるとキューにある全てのメッセージが再生されてしまいます。


MIMEタイプには"text/sakura_script"を指定します。必須です。


Extraにキーを"message"にてさくらスクリプトを保存してください。


Intentの宛先がサービスであることに注意してください。
startActivityではなく、startServiceでなければなりません。

プログラムの中身

AppWidgetです。
元々、本家のガイドを読まずにブログのサンプルを読んでAppWidgetを書き出した私はServiceが必須だと勘違いしておりました。
その後、気付いたのですがServiceからRemoteViewを更新できるのであれば、AppWidgetに対するBroadcastIntentに拘わらずServiceから連続で画面を更新できるのではないかと考えました。


そこでテキストをアニメーションさせるようにしたところうまく行ったので調子に乗って作ったものがこれです。


予定ではSHIORIの実装である華和梨を実装してから公開するつもりだったのですが、思いっ切りネタが被っている方を見つけてしまいました。(^^;

闘争より逃走したい日記


こちらのミクが実に出来が良いのでこれはやばいなと思い、ちゃっちゃと未完成のまま公開することにした次第です。(^^;


最初はnarを動的に読むように作成しはじめたのですが、ファイルからBitmapを読むとAppWidgetがとても遅くなり使用に耐えられませんでした。
RemoteViewに動的に作成した大きなBitmapを利用すると更新が非常に遅くなるようです。
これはリソースのIDを用いると非常に速いので、Bitmapを用いた場合にpixelのint[]を全てリモートプロセス上に通信しているのではないかと考えています。
「何か」のアニメ機構は大きさの異なるサーフェスを重ねて新しい絵を作るタイプです。この方法で動的にアニメーションをさせるのは現状では難しそうです。


またRemoteViewに関する現状の問題点として、RemoteView上のTextViewをスクロールさせることができません。
setTextしかできないので画面幅を越えると文字が読めなくなってしまいます。


またTextViewに対し、レイアウトにてAutoLinkを設定するとTextView上ではちゃんとクリッカブルになりますが、クリックすると新しいActivityが起動できずに落ちます。これはTextView内部のonClickにて新しいタスクであるフラグを立てていないことが原因のようです。
どうやらSDK1.5r3ではAutoLinkを使わずに自前でPendingIntentを用いてURLをViewするコードを書かねばならぬようです。

他のゴーストを作る


他のゴーストを作りたい方は新しいAppWidgetとして新規のアプリケーションを作成してください。
surfaceは全てR.drawableにsurface[番号].pngとしてそのまま入っております。
それらを上書きしてください。


伺かではPNGは透過PNGではなく、座標(0,0)のドットの色が透過指定色となります。
Androidでは透過PNGを利用できますので、事前に透過PNGに直す必要があります。
これを自動で行なうActivityを作りましたのでご利用ください。プロジェクト名はAlphaTestです。
/sdcard/nisesakura/ghostに透過色を直したいPNGを入れて実行すると、/sdcard/nisesakura/plusAlphaに透過色を透過率100%に直したPNGが同名のPNGファイルとして保存されます。


問題はBitmapの大きさです。
オリジナルのPNGは比較的大きなものが多いです。
しかしAndroidは現行のHTC-03AでHVGA(480x320)しかありません。
このため透過色を直す前に縮尺を調節しなければなりません。

# ImageViewにmaxWidthとmaxHeightを設定する手段もありますが、
# 毎回縮小させると余計な電池を消費すると思われます。


現在、AppWidgetの任意は補完さくらの50%サイズ、200x153です。
うにゅうは64x64になります。


AppWidgetではRelativeLayoutを用いています。
最初に「任意」用ふき出しを一番上に書き、「任意」を右下端に書きます。
うにゅうのふき出しを「任意」の左に書き、うにゅうを画面の下端でかつ、「任意」の左に書きます。
このため、画像のサイズが変更されると立ち位置が微妙に移動します。
例えば「任意」にうにゅうのサーフェスを割り当てるネタは良くありますが、それを行なうと「うにゅう」が右に移動します。
新しいGhostを作成される場合には画面設計を見直す必要があるかもしれません。


最後にAndroidManifest.xml、およびvalue/string.xmlにあるゴーストの名称を変更してください。

最後に

次の予定ですがSKKに戻って今度こそまともに使えるものにしたいな、と考えてはいます。
しかし私のことなのでさらなる新しいネタに飛び付いてしまうかもしれません。
えんいー。