記事一覧

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ジェネレータ

突貫で作った。

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

userscripts.orgへお引っ越し

ブラウザにキャラクタを常駐させるUserJS置き場に

そろそろ飽きてきたのか放置気味のUJU(ブラウザに以下略)ですが、ちゃんとした配布場所を確保するためにuserscripts.orgのアカウントを取得してアップロードしました。

アップロード記念ということで当たり判定の追加、アニメーション(Webkit系ブラウザのみ対応)の追加をしました。
このページの右下の青いボックスをクリックするとデモが見れます。
とりあえずブラウザで動くことを優先しているので伺かとの互換性は低いです。

今後の予定など

最近JavaScriptばかり弄ってる気がするのでそろそろ他のことを勉強した方が良いなと感じる今日この頃です。
気が向いたらuserscripts.orgのデータはちょこちょこと更新するつもりですが、細かい変更の告知はこちらではしないかもしれません。
伺かとの互換性に関しては、今の自分のスキルでは難しいというのが正直な感想で、簡易な記法でキャラクタ制作をするためのプラットフォーム化は諦めようと思います。
猫姫みたいな感じにできればいいんですけどね。
伺かの辞書をコンバートしてUserJSを出力するようなアプリを別の言語で作ってみるのもいいかも。

javascriptがOFFでも色々大丈夫なように

名前がSで始まるレンタルサーバとか

Gumblarウイルスの亜種による被害が急増しているようですね。
みなさんはWebブラウジングするときjavascriptは切っていますか?
私も普段はflashもjavascriptも切っているのですが、名前がSで始まるレンタルサーバとかで巨大な広告がデフォルトで表示されるようになって困っております。
マウスホバーならjavascript使わなくてもCSSでできるだろ…。

というわけでサイト側でCSSを使ってjavascriptがOFFでもONの時と全く同じ挙動を実現するようにしてみました(IE6を除く)。

同様な悩みをお持ちの方がいらっしゃるかもしれないのでZIPにして晒しておきます。

以前作ったUserJSの更新

上記の件に付随して以前書いたUserJSを更新しました。

tukatterのAutopagerize用SITEINFO

tukatter

tukatter

SITEINFO

{
    url:          '^http://tukatter\\.shillest\\.net/.*',
    nextLink:     '//div[contains(concat(" ", normalize-space(@class), " "), " pager ")]/strong/following-sibling::a',
    pageElement:  '//div[contains(concat(" ", normalize-space(@class), " "), " main ")]',
    exampleUrl:   'http://tukatter.shillest.net/',
}

Firefox + Greasemonkey でのSITEINFOの追加の仕方

  • [ツール]->[Greasemonkey]->[ユーザスクリプトの管理]
  • 左上の窓の"AutoPagerize"を選択->左下の"編集"(UTF-8対応のテキストエディタなら何でもOK)
  • 42行目あたりにある"var SITEINFO = ["以降を以下のように書き換える。

ファイル 56-1.png

var SITEINFO = [
    /* sample
    {
        url:          'http://(.*).google.+/(search).+',
        nextLink:     'id("navbar")//td[last()]/a',
        pageElement:  '//div[@id="res"]/div',
        exampleUrl:   'http://www.google.com/search?q=nsIObserver',
    },
    */
    /* template
    {
        url:          '',
        nextLink:     '',
        pageElement:  '',
        exampleUrl:   '',
    },
    */
    {
        url:          '^http://tukatter\\.shillest\\.net/.*',
        nextLink:     '//div[contains(concat(" ", normalize-space(@class), " "), " pager ")]/strong/following-sibling::a',
        pageElement:  '//div[contains(concat(" ", normalize-space(@class), " "), " main ")]',
        exampleUrl:   'http://tukatter.shillest.net/',
    }
];

ファイル 56-2.png

幸せ。

ファイル 56-3.png