Tcl/Tkアプリケーションを単一の実行ファイルにして配布する方法

 Tcl/Tk スクリプトを実行するには Tcl/Tk の実行環境が必要になるんですが,残念なことに Windows では標準で Tcl/Tk はインストールされてないです.配布する際には Tcl/Tk の実行環境をユーザにインストールしてもらう必要があります.

 しかし折角 GUI アプリケーションが手軽に書ける Tcl/Tk なのに,それを使用するのに手間が掛かるのも嫌な話です.それが,Starpacker というツールを使うとなんと tcl スクリプトと Tcl/Tk の実行環境をまとめて単一の実行ファイルに出来ます.

続きを読む

i686-w64-mingw32 のコンパイル済みバイナリ入れたら一発で動いた

ありがたくも有志がビルドしてくれてるバイナリが普通にあったのでそれ入れたら一発で出来ました.

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/rubenvb/gcc-4.7-release/

ここのi686-w64-mingw32-gcc-4.7.4-release-linux64_rubenvb.tar.xzを使いました.

最初からちゃんと調べておかないとダメですね. 単にcentosのyumから入るmingwが4.4.6なのが不満なだけだったので,4.8.2じゃないですがひとまずこれで満足.

さくらVPSのcentos に i686-w64-mingw32 が……入れられない

http://kanedaq.blog24.fc2.com/blog-entry-10.html

ここを参考にして gcc-4.8.2 をビルドしてみたが,手順5の途中で

checking for wchar.h... (cached) yes
checking for wctype.h... (cached) yes
checking for ld version... 22300
checking for ld that supports -Wl,--gc-sections... configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.
make[1]: *** [configure-target-libstdc++-v3] エラー 1
make[1]: ディレクトリ `/tmp/gcc-4.8.2/build' から出ます
make: *** [all] エラー 2

となって進めない.

うーーーーーーーーん

とても単純なWebサービスを一時間で作った

作ったもの

md.nyaocat.jp

http://md.nyaocat.jp/?url=(マークダウンファイルのURL)

これでMarkdownファイルをhtmlに変換して表示してくれる. あまりセキュリティ考えてないので悪いところがあったら教えてください.

ソースコード

Github nyaocat/md.nyaocat.jp

実質1ファイルのみで非常に単純.

工程

  1. お名前.com のレコード設定で md.nyaocat.jp を設定した
  2. Github にリポジトリを作った
  3. サーバでCloneしてコード書き始める(コミット履歴
  4. Twitter にURL載せてみる
  5. 指摘してくれたアカンところをちょいと修正

反省点

この程度のものも作ってみると1時間かかってしまうんだな,ということがわかりました.

エラーチェックやレコード設定,Github にリポジトリ作る部分が本質的な部分じゃないのに複数の サイトにアクセスして設定する必要があって面倒でした.

あと,Javascript よくわかってなくて Javascript正規表現使う方法とか調べながら書いてたのが良くありませんでした.

これの今後

  • サーバ側でなくクライアント側で変換させる
  • CSS 自分で用意する
  • 見出しをピックアップして目次メニューつけたりすると良いかも
  • 第一レベルの見出しごとにプレゼンテーションになるようにすると便利かも

(Lua)読み取り専用テーブルモジュールを本気出して作った

Lua readonly module (https://gist.github.com/nyaocat/7380582)

このモジュールを介して作成されたテーブル・ユーザーデータのフィールドは絶対に変更出来ません. (debugライブラリを除く)

他の類似モジュールとの違い

いくつか "Lua Read Only" で検索しても似たのが出てくる.

  • newproxy を使用してるので rawset でも変更できない
  • getmetatable されても変更出来ない
  • メタメソッドも全て対応
  • #演算子対応
  • pairs,ipairs,next に半分対応
  • メンバ関数経由でのみ更新可能

これらを全部満たすリードオンリーテーブルモジュールはぱっと検索した限り見当たらなかった

サンプルコード

ERROR! とコメントされた行でエラーが発生します

readonly = require "readonly"
arr = readonly.readonly {3, 9, 7, 4}
print(arr[2]) -- OK
arr[1] = 98   -- ERROR!


t1 = readonly.readonly {
  val     = 10,
  getVal  = function(self)         return self.val   end,
  setVal  = function(self, newval) self.val = newval end
}
t1:getVal()   -- OK
t1:setVal(20) -- ERROR!
t1.val = 30   -- ERROR!

t2 = readonly.readonly2 {
  val     = 10,
  getVal  = function(self)         return self.val   end,
  setVal  = function(self, newval) self.val = newval end
}
t2:setVal(20) -- OK
t2:getVal()   -- OK
t2.val = 30   -- ERROR!

for k, v in ipairs(arr) do end -- ERROR!
for k, v in pairs(t2)   do end -- ERROR!
for k, v in readonly.ipairs(arr) do end -- OK
for k, v in readonly.pairs(t2)   do end -- OK

readonly(tbl) は与えられたテーブル,ユーザデータを読み込み専用にして返します.

readonly2(tbl) はメンバ関数経由での更新のみを許可します.

readonly(), readonly2() で作成された読み込み専用テーブルは標準の next, pairs, ipairs で使用出来ません.

代わりに, require("readonly").next, require("readonly").pairs, require("readonly").ipairs を使用して下さい.

これらの関数はこのモジュールで作成された読み込み専用テーブル意外のテーブルに対しては標準の next, pairs, ipairs を使用するため, これらの関数で標準の関数を置き換えても問題ありません.

フィールドが更新出来ない以外は元のテーブルと全く同じようにアクセス出来ます. __index を用いてLuaでクラスを表現している場合でも問題ありません.

このモジュールは Lua5.1 で実行してもグローバル変数にモジュールをセットしません. これは Lua5.2 での一般的なモジュール挙動と合わせたためです. local readonly = require "readonly" として実行してください.

このモジュール自体は Lua5.1, Lua5.2 両方で動くはず(多分)です.

このファイルを単体でlua readonly.luaとして実行すると簡単なテストが実行されます. http://ideone.com/soulZG require した時にはテストは実行されません.

以下実装の解説というかなんというか読み込み専用モジュールの作り方

続きを読む

Lua で Python の if __name__ == '__main__':

Pythonなら単体テスト自動化もバッチリ

Python だと if __name__ == '__main__': でファイル単体で実行された時の動作を記述出来るらしい.いいな. モジュールのファイルを単体で実行した時に意味をもたせられるのは単純に面白い気がする.

Lua でも出来るよ!

続きを読む