記事一覧

うじゅうジェネレータver1.0.2

UJU ver1.0.2

インラインフレーム全てにマテリアライズしてしまう不具合修正などしたのでUJUをver1.0.2に。
併せてびーふれんずのUserJSも更新しました。

うじゅうジェネレータver1.0.2

昨年からずっと放置していたうじゅうジェネレータもver1.0.2に追いつきました。
作成環境としてはショボイのでもう少しどうにかしたいところです。

SSP/2.02.19で狭くなったメニューを元に戻す

オーナードローメニューが狭くなった

昨日リリースされたSSP/2.02.19で Windows Vista / Windows 7 向けの改良が行われた模様です。
メイリオのフォント情報を読み取って行間を詰めたりしているようで、オーナードローメニューが以前より狭くなりました。
特に見づらいわけでもないですし慣れの問題だと思いますが、設定で行間を調整することも出来ます。

ファイル 67-1.png

行間の設定の方法

オーナードローメニューから、「設定」->「本体設定」->「表示」->「メニューの縦方向の余白設定」を「4」にする。

ファイル 67-2.png

これでおおよそ以前と同じくらいの行間になります。

ファイル 67-3.png

「びーふれんず」をUserJS化してみた

このサイトで配布中のゴースト「びーふれんず」をUserJS化してみました。
例によって右下の青いボックスにマウスホバーすると起動するゴーストを選択出来ます。
聞きかじった知識でUserJS間の通信を実践してみました。
Firefox, Safari, Google Chromeで右クリックメニューから「ゴースト切り替え」「ゴースト呼び出し」が出来ます。(Opera、IEは仕様的に無理)
既に設置済の「うじゅら&うじゅう」もアップデートしました。

入手先

追記

ブラウザ版Apricotが出てますね。

別に対抗意識とか燃やしてるわけじゃないですけど、ウチのUserJSは、下記のようなコードをHTMLの<head></head>内に書くことでお持ちのブログに自由に貼ることもできます。

<script type="text/javascript" src="http://home.384.jp/evidence/js/ujurauju.js" charset="utf-8"></script>

Webページ設置も出来るように作ってありますので。

ページを開いたらすぐ起動して欲しい場合は(ソースをDLして自前で設置する必要がありますが)ソースの上の方にある"bootAfterPageLoad: false"って書かれてるところを"bootAfterPageLoad: true"に変えるだけです。

このへんのドキュメントも配布ページにまとめておかないといけないですね。

YAYAの関数ISVARはちょっと危険

ISVARとは何か

指定した名前の変数が存在しない場合に0, グローバル変数が存在する場合に1, ローカル変数が存在する場合に2 を返す関数です。変数の存在の有無の判定に用いられます。

ISVARの何が危険なの?

YAYAに限らず里々や華和梨においても、「変数の削除」をする際には「変数に空文字を代入する」という手法がよく用いられると思います。YAYAでも空文字を代入して終了すればセーブデータにも残らず次回起動時に変数は存在しないことになります。YAYA Tc538-3 にて空文字が代入された変数もセーブ対象に変更されました。(2010/01/21 追記)

でも実は空文字を代入しても変数は消えないのです。次の例を見てみましょう。

{
  hoge = 1          // 変数を作成
  --
  ISVAR('hoge')     // => 1
  --
  hoge != ''        // => 1
  --
  hoge = ''         // 変数に空文字を代入
  --
  ISVAR('hoge')     // => 1
  --
  hoge != ''        // => 0
  --
  ERASEVAR('hoge')  // 変数を明示的に削除
  --
  ISVAR('hoge')     // => 0
  --
  hoge != ''        // => 0
}

変数に空文字を代入した場合でもISVARは1を返します。本当の意味で変数を削除するためには専用の関数ERASEVARを使わなければならないのです。
明示的にERASEVARで削除した後にISVARの戻り値が0になっているのがわかると思います。また、削除後の変数と空文字との比較で、存在しない変数と空文字を比較すると真となることも確認できます。

しかしYAYAは空文字が代入されている変数をセーブデータに保存するようなことはしません。次回起動時には空文字が代入された変数は自動的に綺麗に消されてしまうので、「空文字の代入で変数が削除される」と誤解される方も多いと思われます。YAYA Tc538-3 にて空文字が代入された変数もセーブ対象に変更されました。

どうすればいいの?

空文字が代入される度にそれを検出してERASEVARで削除する、なんて煩わしいやり方は褒められたものではないので、ISVARを使わずに、空文字との比較で判定するのが良さそうです。
例えばユーザ名を入力してもらった時に空打ちされた場合、変数に空文字が入った状態ですのでISVARで判定すると「ユーザ名が入力されている」と誤判定する恐れがあります。また、初回起動などの本当に変数がまだ存在しない場合でも空文字と比較すれば存在の判定は可能です。

2010年あけましておめでとうございます

賀正

あけましておめでとうございます。
今年もよろしくお願い申し上げます。

今日は特に何も無いです。新年のご挨拶だけ。

抱負とか

去年の抱負を見てみたらSAORI作るとか書いてましたけど、そんな気配すらない一年でしたね。ダメすぎる。

今年はあまり高望みをせずに、自分に出来ることをやっていこうと思います。

出来ることを増やすのは良いことですし、スキルを磨いたりアウトプットを増やすことも大切ですが、ちょっと一休みをして。
面白い物語を読んだり、可愛いイラストを眺めたり、美味しいものを食べたり、ためになる話を聴いたり、自分と違う価値観に触れる機会が増えたりしたらいいなと思います。

皆様にとっても良い一年でありますように。

Google Chrome のテーマを作ってみた

スクリーンショット

ファイル 63-1.png

インストール

choronishiki.crx

謝辞

背景の素材に「にしき」を使わせて頂きました。

フォントに「Nishiki-teki」を使わせて頂きました。

テーマ名は「ちょろにしき」です。

来年もまた皆様に素敵な出会いが訪れますように。
それでは、よいお年を。

YAYAの関数TOAUTOはちょっと危険

先に結論を画像で

ファイル 62-1.png

便利な関数TOAUTO

YAYAにはTOAUTOというとても便利な関数があります。

YAYAには「文字列型」と「数値型」の2種類の変数の型が存在し(配列とかは除く、厳密には整数型と実数型に分かれる)、扱いが全く異なります。

{
  1 + 1     // => 2 (数値型)
  --
  '1' + '1' // => '11' (文字列型)
}

数値型に変換できる文字列は数値型に、そうでないものは文字列型のまま返す関数がTOAUTOです。

{
  TOAUTO('123')  // => 123 (数値型)
  --
  TOAUTO('hoge') // => 'hoge' (文字列型)
}

便利ですね。

TOAUTOの何が危険なの?

例えばこんな場合
{
  TOAUTO('0123')  // => 123 (数値型)
}

'0'が何処かへ行ってしまいました。これでは困ります。
これは文字列のままにして欲しいケースが考えられます。
(ユーザ名とかパスワードとか)

TOAUTO使わなきゃいいじゃん

お好きなYAYAゴーストを立たせてユーザ名を'0123'と教えてあげて下さい。
9割方「123さん」として覚えられてしまいます。TOAUTOなんて使った覚えも無いのに。

これはYAYAのせいではなく、現在広く普及しているYAYAミドルウェアでSHIORIリクエストの値がデフォルトでTOAUTOを経由させてしまっていることに起因します。referenceを参照した時点で既に'123'に書き換えられているのです。(ウチのGHOSTもだよ!/(^o^)\)

どうすればいいの?

「はろーYAYAわーるど」を例にすると、yaya_shiori3.dicの412行目にTOAUTOを使っているので、これをやめることです。(SHIORI3FW.AUTO_DATA_CONVERTをOFFにしているという前提の話)
でもreferenceの値が自動で型変換されているという前提で今まで辞書を書いていた場合GHOSTがまともに動かなくなるでしょう。それは困ります。

なので、こんな方法で回避しては如何でしょうか。

{
  _value = '0123'
  if TOSTR(TOAUTO(_value)) == _value {
    var.req.value ,= TOAUTO(_value)
  }
  else {
    var.req.value ,= _value
  }
}

再度文字列として評価したときに元々の文字列と一致した場合のみ数値に変換。そうでない場合は文字列のまま。

今のところ困ってないしそこまでする必要あるの?

必要ないと思います。必要になったときに対策しましょう。

余談

AYA as SAORIのシステム辞書はTOAUTOを使っていません(AYA5にはTOAUTO無いのかな?)。数値と評価され得る場合もreferenceレベルでは文字列として参照されます。

SSPから言語の設定の通知が来てる

バイリンガルゴーストを目指して

最近何となくSSPの言語をEnglishで使ってみてるのですが、SSPからPLUGINに言語についての通知がされていることを、SSPのバグ報告レポート作成時に発見しました。

// request
GET PLUGIN/2.0
Charset: UTF-8
Language: english
ID: version

これをゴーストが読めば、ユーザの環境に合わせてEnglishの時だけ英語で喋るバイリンガルゴーストが作れる!と思ってGHOSTのssp_shiori_logも見てみました。

=====send=====
GET SHIORI/3.0
ID: version
Charset: UTF-8
SecurityLevel: local
Sender: SSP

ゴーストには通知されないのね。残念。

PLUGIN作者は非日本語圏ユーザの環境も考慮して英語でのインターフェースも用意しておけ、というSSPからの熱いメッセージだろうか。

Twitterの発言をTumblrにまとめるYAYAスクリプト

用意するもの

手順

Twitter側の準備
  • まとめたい発言をfavoって集める。淡々と。
ゴースト側の準備
  • twitalkのインストール
  • サプリメントを当てる
  • twitalkの辞書(拡張子.dic)のどこでもいいので以下のスクリプトを張り付ける。
    usernameとpasswordは自分のを設定する。
    keyはzが嫌なら変える。
sys.key.z
{
  _username = 'username'  // set your username
  _password = 'password'  // set your password

  _fname    = 'favo.txt'
  _event    = 'OnGetFavoritesFromTwitter'
  _url      = "http://%(_username):%(_password)@twitter.com/favorites.xml"
  "\![execute,http-get/
    ,%(_url)/
    ,--async=%(_event)/
    ,--file=%(_fname)/
    ,--param-charset=UTF-8/
  ]\e"
}

OnGetFavoritesFromTwitter
{
  _path = GETSETTING('coreinfo.path') + 'var\favo.txt'
  _id = GetXPath('open', _path)
  _screen_name = IARRAY()
  _text        = IARRAY()
  _url_id      = IARRAY()
  if _id {
    for _i = 1; _i <= 20; _i++ {
      _tmp = GetXPath('get', _id, "/statuses/status[%(_i)]/id")
      if _tmp == ''; break;
      // id
      _url_id      ,= _tmp
      // screen_name
      _screen_name ,= GetXPath('get', _id, "/statuses/status[%(_i)]/user/screen_name")
      // text
      _text        ,= GetXPath('get', _id, "/statuses/status[%(_i)]/text")
    }
    _nop = GetXPath('close', _id)
//    _nop = FDEL(_path)
  }

  _filename = GETSETTING('coreinfo.path') + 'var\stot.txt'
  if !FOPEN(_filename, 'w')
    return

  _flag = 0
  for _i = ARRAYSIZE(_url_id) - 1; _i >= 0 ; _i-- {
    _str = "%(_screen_name[_i]):%(_text[_i]) [http://twitter.com/%(_screen_name[_i])/status/%(_url_id[_i])]"
    FWRITE(_filename, _str)
  }
  FCLOSE(_filename)

  "\![open,file,%(_filename)]\e"
}

OnKeyPress
{
  if ISFUNC('sys.key.' + reference[0]) {
    EVAL('sys.key.' + reference[0])
  }
}
  • zキーを押せばfavoったpostがSTOT形式(後述)で保存されるので、手動でTumblrに張り付ける(手抜き)
閲覧者側の準備

Greasemonkey使ってる人はこれをインストールすると見やすい。

結果

こんな感じにまとめられる。

その他

ShareTwitterOnTumblr(STOT)っていう発言まとめ用の便利なGreasemonkeyスクリプトが昔あったのですが、度重なるTwitterの仕様変更にメンテが追い付かない状態で、YAYAで自作して現在に至るまで使っています。
Tumblrに投稿するまで自動化したいけど面倒なので手動で。

うじゅうジェネレータ

ブラウザにキャラクタを常駐させるUserJSジェネレータ

突貫で作った。

やること
  • 画像のアップロード対応はそのうち
  • バルーンとか変えたい
  • キャラクタを立てながらの状態でサーフィス変えたりトーク確認したりバルーンの初期位置合わせとか
  • 解説をゴースト自身にさせたい