たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
Page 1/1: 1
INIファイルから文字列を読み込んで、それを空白(カンマ、コロン、パイプ、など何でもいいけどとにかく区切り文字)で区切ってループ回す、ということをNSISでやろうと思ったらどうやるのがスマートなんだろうか。
とりあえず見よう見まねと試行錯誤でこんな感じに書いたら一応期待通りに動いた。
!include "LogicLib.nsh"
!include "WordFunc.nsh"
!insertmacro WordFind
(中略)
Var STRING
Var PART
Var INDEX
(中略)
StrCpy $STRING "aaa bbb ccc ddd"
StrCpy $INDEX "0"
${While} 1 == 1
IntOp $INDEX $INDEX + 1
${WordFind} $STRING " " "+$INDEX" $PART
${If} $INDEX > 1
${IfThen} $PART == $STRING ${|} ${Break} ${|}
${EndIf}
Call MyFunction
${EndWhile}
${WordFind}
の第1引数が元の文字列、第2引数が区切り文字で、第3引数に「その文字で区切った後の配列の何番目の要素か(添え字は1から始まる)」を指定すると、第4引数の変数に要素の内容に相当する文字列が格納される。0番目あるいは配列の長さ(に相当するもの)よりも大きな数字を第3引数に渡すと、返り値は元の文字列そのままとなるので、これを脱出条件としてループさせてみた。
9月2日追記。配列(のようなもの)の長さが1つの時のことを考慮してなかったので修正した。
NSISは調べてみると結構色んな事ができそうではあるんだけど、日本語で解説された資料ってのが全然見つからないし、機能の詳しい使い方の説明も不足してたりして、マジ困る。仕方ないからFirefoxのインストーラで実際に使われてる物のソースを見たりなんかして。
いや、ロジックを丸パクリしたかったんじゃなくて、もっとささやかな話で、MUI(Modern User Interface、インストーラのウィザード形式の画面を提供するライブラリ)でMUI_PAGE_CUSTOMFUNCTION_PREを使って特定のページを条件次第でスキップするにあたって、ヘルプには「そういうこともできる」としか書かれてなくて実際のやり方が載ってなかったから、それを調べたかったんですよ。
Railsの案件で、Rails自体の詳細な挙動が分からなくて困ってた時も結局須藤さんには「Railsのソースを読め」と言われてしまったし。ドキュメントが不足してて困るって話と、ソースが読めれば資料になるからオープンソース万歳!って話と、そんなだからドキュメントを敢えて作る気にならなくてドキュメント不足が余計に加速されちゃうんだよって話と、色々混ざっててスッキリしない。
ちなみに調査結果としては、MUI_PAGE_CUSTOMFUNCTION_PREで指定したコールバック関数でAbortすればそのページはスキップされるようになる、ということだった。
NSIS(Nullsoft Scriptable Install System)というものがあって、元々はWinampのインストーラを作るために使われてたらしいんだけど、これを使うとCとかVBとかDelphiとか分からなくても(簡単なものなら)Windows用のネイティブアプリケーションを作れる。まあ元々インストーラ作成用に作られたものだから、インストーラじゃないものを作るのは大変なんだけど。有名どころではPortable Firefoxの正体がNSISだったりする(大まかな処理の流れを紐解くと、USBメモリに置いたFirefoxの実行ファイル群とプロファイルをテンポラリフォルダにコピーして、起動オプション付きで起動することで強制的にそのプロファイルで起動し、Firefoxが終了したらプロファイルに行われた変更をUSBメモリに書き戻す、という感じ)。あとFirefoxのWindows版インストーラもNSIS製。
しかし厄介なことに制御構文がGoToっぽいものばっかりで、if/then/elseで複数行のブロックに分岐するといったことすらできないから、とかちょっと凝ったことをしようとすると、いつの時代のプログラムだよ!!と言いたくなるようなワケの分からん読みにくいスクリプトになってしまう。
Var MYVAR
StrCpy $MYVAR "ほげほげ"
; 第1引数が第2引数と等しければ第3引数で示された行へ、異なれば第4引数で示された行へ。
StrCmp "$MYVAR" "" "" NOT_BLANK
StrCpy $MYVAR "空ですよ"
GoTo EXIT
NOT_BLANK:
StrCpy $MYVAR "空じゃないですよ"
EXIT:
これはマジで死ねる。
……と思ってたんだけど、ヘルプをよくよく読むと、LogicLibという標準ライブラリを使えばもーちょっとマシな制御ができるようになるとあったので早速試してみた。
!include 'LogicLib.nsh'
...
StrCpy $MYVAR "ほげほげ"
${If} "$MYVAR" == ""
StrCpy $MYVAR "空ですよ"
${Else}
StrCpy $MYVAR "空じゃないですよ"
${EndIf}
うわ、これ超便利。NSISが一気に実用的になった!!! ちなみにswitch/caseとかwhile/for/do系のループとかもあります。
ということに感動して昨日はウッカリ深夜までNSIS漬けになってしまいました。
Page 1/1: 1