読者です 読者をやめる 読者になる 読者になる

ごちゃログぴこっ

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

EmuLuaでTwitterるわ!

Basic認証が廃止されてしまったので、以下の内容は現在利用できません。こちらをご覧ください→LuaでTwitterにpost!

LuaでTwitterるわ! という素晴らしい記事がありますので,流用してemutweet.luaのようなスクリプトを書けば,簡単にTwitterに追記回数キリ番記念postとかできちゃいます! おしまい!

……と言いたいところですが,実際の利用にあたってはいくつかのハードルが並んでいるのでちょっとまとめておきます.

lua-iconv

Twitterにリクエストを投げるにあたってlua-iconv文字コードutf-8に変換するのですが,lua-iconvのWindowsバイナリは知る限りどこにも置かれていません.コンパイル済みのバイナリを作成したので置いておきます.

iconv.dll をライブラリを入れるディレクトリ(スタンドアロンのものならclibs,EmuLuaならエミュレータディレクトリ)に入れることで,無事にライブラリを利用することができます.

MinGWを用いて自前でコンパイルする場合

自前でコンパイルするのも難しくはありません.MinGWをインストールしてgccコンパイルします.まずはiconvをMinGWのダウンロードページから libiconv-1.13.1-1-mingw32-dev.tar.lzma (バージョンは適宜最新のもの,lzma7-zipで展開可)をダウンロード・展開して,然るべきディレクトリに配置します.あとはluaiconv.cをコンパイルしてdllを作成するだけです.コマンドはLuaBitOpに付属のMakefile.mingwが参考になります.-static -liconv を指定してiconvをスタティックリンクしますが,このとき,オプションをソースファイル名の後に記すよう注意が必要です(参考: 静的ライブラリのリンク時にundefined referenceエラーが出る(gcc)).

ライブラリの複製・配置

Twitterに書き込むにあたってはさまざまなライブラリが利用されています.Lua for Windowsに含まれるライブラリとiconvをあわせれば必要なライブラリはすべてそろいます.しかしながら,EmuLuaでの利用にあたっては,必要なものをエミュレータディレクトリに複製しなければなりません.よって,clibsフォルダの中にある一部のファイル・フォルダ,luaフォルダの中にある一部のファイル・フォルダ,それからiconv.dllをエミュレータディレクトリにコピーします.必要なファイルの詳細は次のとおりです.

  • clibs
    • mime (フォルダごとコピー)
    • socket (フォルダごとコピー)
    • lxp.dll
  • lua
    • lxp (フォルダごとコピー)
    • socket (フォルダごとコピー)
    • ltn12.lua
    • mime.lua
    • socket.lua
  • iconv.dll (上述のもの)

これでようやく実行可能になるはずなのですが……

クラッシュの防止

いざ実行してみるとクラッシュしたりします.詳細は追っていませんが,ライブラリがLuaエンジンが,コピー元であるLua for Windowsの用いているものと異なる場合に,そのようなクラッシュが発生してしまうように見えます.よって,動作にあたってはLua for Windowsのlibフォルダからlua51.dllをコピーしてきて配置しなければなりません.

しかしながら,多くのエミュレータLuaライブラリを静的にリンクしているので,DLLを配置したところで意味がありません.とりあえず,snes9x, vba, pcsx, desmume 0.9.5+ に関しては,lua51.dll にリンクするバージョンを作成して,Downloads ページに配置しました.EmuLuaでTwitterに書き込みたい好奇心旺盛な方は,試してみるとよいかもです.

あるいは,上記ライブラリの入手元を変えて解決する道を探る方が賢いのかもしれません.

emutweet.lua について

まずはスクリプトテキストエディタで開いて,メールアドレスとパスワードを記載しましょう.そうしないと動きません.何なら外部ファイルからそれらを読み取る形式にした方が,svnに配置して扱うような場合にはよいかもしれません.

一定の追記回数ごとにpostするようになっていますが,工夫次第で条件やpost内容は変えられます.注意点を挙げるとすれば

  • 秒間60回などの連投を試みないよう厳重に注意してプログラミングする
  • post内容は140字以内に収まるようにする
  • ソースコードに日本語を記述すると,稀にそれが原因でスクリプトエラーが起きるかもしれない(ASCII以上のことは考慮されていないため)

などでしょうか.おもしろい利用案があれば見てみたいものですね!

追記:エミュレータによっては次の一行を末尾に加えないといけないかもしれません.

while true do emu.frameadvance() end