fc2ブログ

リハビリがてらこんなものを(FAM)

2010.04.15.Thu
某所でjpgやpngでスクリーンショットを作りたいとか書いてあったので、なんとなく作ってみました
jpg等の拡張子でsavescreenshotを使うと自動的になでしこでその拡張子に変換して吐き出します(ちゃんと指定されたパスに作成します)。
速度はbmpの方が圧倒的に速く、png→jpgの順に遅くなっていきます。
こんなんでよかったら使ってくださいということで。
プラグイン使うとか他の速いプログラム使えばもっと速くなりそうなので、すぐに他の偉い人がもっといいものを作るかもですが。

作ってて最後の最後で気付いたんですが、Luaって、実行プログラムの絶対パスを取得できないんですかね?
package.pathを出力したものを見る感じ、そんなこともなさげなんですが。
なでしこに作成するスクリーンショットの絶対パスを渡せなくて数時間悩みました。
これについては最終的にはLuaからos.renameさせればいいや、ってことで落ち着きました。



ペンぷろに関しては「リハビリがてら」とかいってる時点でどういう状況かだいたい察してください。
やっていないわけではないけどたいして進んでもいないという感じです。
ゴールはさほど遠くないけれど推進力の低下が著しい・・・。
スポンサーサイト



getbyteの挙動がよろしくない?(FAM)

2009.12.05.Sat
ふとgetbyteの機能はLua単体で実現できるのではないかと思い立ち、調べたり実験したり。
結果、Lua単体では全角(2バイト)文字の文字コードは調べられないっぽいので多分無理、っつーことに。
string.byteの説明で『文字コードの数値は、プラットフォームを超えての可搬性がない』ってのがあって、最初何のことかわからなかったけど、おそらくこのことなんだろーな。


で、これを調べている時に調べる文字列の最初の1文字だけ調べるために「string.sub("調べる文字列",1,1)」と書いてたんですが、これ、全角だと正しい値を返さないんですよね。
Nスクのmidと同じような挙動といえばいいかしら?
最初の1バイト分の文字コードを無理矢理取り出して変換してるんかその辺はよくわからんけど、まあ、使えないってことは確か。

それに気付かずに拙作のスクリプトのgetbyteではcmpに渡す前に文字を「string.sub("調べる文字列",1,1)」という風に最初の1文字だけ取り出していたのできっとうまくいかないこともあるんでないかと(テストプレイした限りではたまたまなかったけど)。
ついでに元のやつだと全角スペースは半角として判定されていたり、「゚」から始まる文字列(「゚」のみなら問題ない)が全角として判定されたりされるっぽいのでその辺を文字コード表を見ながら修正。
・・・と思ったらcmpの比較順だと半角カナあたりがすごい中途半端な場所にあったのでそれを調べるのに四苦八苦。
というわけで、getbyte改。


function getbyte(linestr)
  if linestr=="" then
    return 0
  end

  local rtnint
  local int0=NSGetIntValue(0)
  
  local function getbyte_cmp(cmpstr)
    NSExec('cmp %0,"'..linestr..'","'..cmpstr..'"')
    return NSGetIntValue(0)
  end
  local function getbyte_judge()
    if getbyte_cmp(" ")<0 or (getbyte_cmp("。")>=0 and getbyte_cmp("漾")<0) then
      return 1
    end
    return 2
  end
  
  rtnint=getbyte_judge()
  NSSetIntValue(0,int0)
  return rtnint
end


これで今度こそ大丈夫なはず。ついでにペンぷっとの中のやつも書き換えました。
既に落とした人は落としなおしたほうがいいかも。まあ、実害もまずないだろうけど。
明らかにおかしい結果が出た方がおられましたらお手数ですがBBSなりで連絡してくださるとありがたいです。



例によって自分専用覚え書き。
・Luaの命令文は大文字小文字を区別する。これを知らずにうろ覚えでスクリプトを打っていくとエラーが出るはずがない箇所でエラーが出て苦労する(した)。そういうことを踏まえると、命名規則さえ覚えりゃなんとかなるとはいえ、NスクのLua命令文はやたらと大文字小文字混ぜた物になってるのでこれはどうかと思ったり。ほとんどの命令文は冒頭の「NS」(およびせいぜい次の1文字)だけ大文字にすりゃ十分だと思うんだけど。Lua初心者が挙動を手探りするために多用すると思われる「NSOkBox」なんて短い文字数の中に嫌がらせのように大文字小文字混ざっているし。
・Luaでは文字列がキーのテーブルdummytable["key"]をdummy.keyのように書き換えれるが、dummytable["key1"][kwy2]をdummy.key1["key2"]のように混ざった形で書くことも可能。dummy["key1"].key2も可能。テーブルの変数入れない部分はkey="key"とおいて["key"]と[key]を同値にしようかと企んでいたけど、可変部分は[]でくくり、変数入れない部分は.keyみたいな形で書いたほうがデバッグ時の可読性も格段にあがりそう。

寝てないけどこれから仕事です(FAM)

2009.12.04.Fri
このままだとまたずるずると長引きそうなので無理してがんばりました。
ペンぷっとの心残り部分直した奴できました。
こちらです。

追加機能を列挙
・Luaのスクリプトを送れるようになった
・english(>使う奴)にも対応になった
・スクリプト記入部分のGUI部品を変更(機能が増えて64KB以上にも対応)
・テキスト欄を中ボタンでクリックすると送信できるようになった
・スクリプト行送信できるようになった

こんな感じ。
他はりーどみーを読んでもらうこととして、スクリプト行送信だけちょっと説明。
実行時のカーソル位置で判断して、その前のテキスト文から次のテキスト文までの命令文および次のテキスト文を送信します。
わかりやすくいうと、1クリックで実行される部分を送信、ということで。
実際に使う分には選択行送信とかよりも役に立つと思います。



11月終わり頃から続いていた雑務や些事の類はこれでほとんど片付きました。
今週末からようやくペンぷろった~の開発を再開できます。
その前にしばらく仮眠を取らせていただきます。おやすみなさい。

本気で仕事がやばいので月末まで潜る~(FAM)

2009.11.26.Thu
とりあえずメモだけでも残す。

ペンぷっとを作ってよかったことは以前よりもluaの挙動がわかった(ような気がする)ことですかね。
やっぱり実際にいじってみないと覚えられないです。
しかし、いまだにluaを使うことによるメリットを肌で感じてはいないなあ。
自分の使い方だとせいぜい変数の取り扱いが便利になったのと文字列をいじりやすくなったのとNSExecが使えるようになった、ということぐらいでしょうか。
まあ、それだけで十分大きいという見方もありますが。

ペンぷろった~でペンぷっとの機能を取り込むことは確定で。
構想では擬似的にNスクのスクリプト処理(テキスト表示含む)を行いながらスクリプトの修正できそう。
gotoやgosub、ifといった命令は正常に行えないんでユーザー定義命令を作る必要もありそうですが。
そんなこと考えるよりはやく動かせるようにすることのほうが大事なんですけどね!



以下、いつものごとく自分専用覚え書き。
・ローカル変数とローカル関数は実際に使う部分よりも前に書いておく。内部的には順番に読んでは置き換えていってるんかしら。
・if文の閉じ忘れ注意。ブロックが閉じないエラーはどこが悪いのかわかりにくいことが多いのでやっかい。中身を書く前にまず閉じてしまえ。
・Nssleepがおかしい? もしかしたらバグ掲示板に報告すべきことかもしれませんが多分自分の解釈違い。ウェイト目的ではなく無限ループでのビジー回避目的には使えない(NSDoEventsを使えってことかもしれない)。無限ループでのビジー回避目的なら面倒なんでNSExec("wait 1")でOK。

ツールを使わない場合(FAM)

2009.11.24.Tue
せっかくだからツールを使わずinputで命令文を入力させる場合のを。

--ここから
NSExec("luasub penput2")

----------文字列の全角半角を判断する(全角なら2を、半角なら1を、""なら0を返す)
function getbyte(linestr)
  local rtnint
  local int0=NSGetIntValue(0)
  local getstr=string.sub(linestr,1,1)
----------cmpに入れるとエラーになりそうなものをあらかじめ排除
  if linestr=="" then
    return 0
  end
  if getstr=="," or getstr=='"' then
    return 1
  end
  
  function getbyte_cmp(cmpstr)
    NSExec('cmp %0,"'..getstr..'","'..cmpstr..'"')
    return NSGetIntValue(0)
  end
  function getbyte_judge()
    if getbyte_cmp("、")<0 or (getbyte_cmp("。")>=0 and getbyte_cmp("゚")<=0) then
      return 1
    end
    return 2
  end
  
  rtnint=getbyte_judge()
  NSSetIntValue(0,int0)
  return rtnint
end

function NSCOM_penput2()
  local rtnstr
  local str0=NSGetStrValue(0)
  NSExec('inputstr $0,"命令文、もしくはテキスト文を入力してください",2047,0')
  rtnstr=NSGetStrValue(0)
  NSSetStrValue(0,str0)
  
  if string.sub(rtnstr,1,1)==";" then
    return
  end
  if getbyte(rtnstr)==1 then
    NSExec(rtnstr)
  end
  if getbyte(rtnstr)==2 then
    NSExec('puttext "'..rtnstr..'"')
  end
end
--ここまで


全部luaで。htmlの見た目重視で本来タブを入れている所を全角スペース2つに置き換えているので、コピペする方は全角スペースをタブなり半角スペースなりに置換してください。
Nスクのスクリプトにpenput2と書くと命令文待ちになり、1文字目が半角なら命令文を実行、全角ならテキストを表示し、元のスクリプトに戻ります。
なにもせずに戻る時は1文字目が「;」の文を打ち込んでください。

上のスクリプトは最初の1文字が何バイト文字か返すgetbyte命令とメインの実行部分のpenput2命令。getbyte命令はpenput2命令で使うので一緒に書いてください。
getbyte命令は幻惑郷さん永字八法さんのところに書かれていた記事を元にそれっぽく。(※のちにこのままだと不完全だということがわかりましたんで、getbyte命令はこちらのを使ってください)
penput2命令はそのままだと使いにくいと思うので、NSExec(rtnstr)の後にNSUpdate()なりNSExec(print 1)を入れるなりいれるなど使う人が各自でいじってくださいな。