今月の読書日記

宮本常一が撮った昭和の情景 上巻

宮本常一が撮った昭和の情景 上巻

  • 作者:宮本 常一
  • 発売日: 2009/06/08
  • メディア: オンデマンド (ペーパーバック)
マトリ 厚労省麻薬取締官 (新潮新書)

マトリ 厚労省麻薬取締官 (新潮新書)

科学用語図鑑

科学用語図鑑

  • 作者:水谷淳
  • 発売日: 2019/01/26
  • メディア: 単行本

Rainmeterを使ってみようの巻 〜Lua Scripting〜

覚えたら何かすごく便利な気がするので勉強を始めてみた。取り敢えず5chのスレを覗いてみると話が高度過ぎてついていけない。考えてみればLuaは元々C/C++の組み込みなのでそっち方面の人間ばっかりが集まってるのか。まあいいや、何か難しい事がしたい訳でもなくRainmeterをより楽にしたいだけだし。

概要

Luaの最新は5.3だがRainmeterで使用可能なLuaのVerは5.1。ちょっと触ってみた感想はLua単体だと出来る事は少ない。元々がCの組み込みなのでLua単体だと低機能。ややこしい事はCの方でやれという発想なんだろう。それはまあ別にいいが正規表現の実装が独特。いわゆるPerl準拠とはかなり違う。ここらはリファレンスを熟読しないと間違いの元。
さて、Python辺りのScript言語を使うのと何が違うのかというと一つはパッケージとして配布する事が出来るという点だがまあこれは殆どの人には関係ない事だろう。もう一つはRainmeterのBangを使えるという事。つまり実行結果をMeterに面倒なく反映できる。Pythonだと一旦txtに書き出してそれをWebParserで読み取る等の作業がいる。RainmeterにおけるLuaの存在意義はほぼこれのみだと個人的には思う。

Script Measure

[MeasureName]
Measure=Script
ScriptFile=MyScript.lua

これはLua scriptをロードするだけで実行は!CommandMeasureで行う。詳細は下記。

Options

これでLua scriptに引数を与える事が出来る。

[MeasureName]
Measure=Script
ScriptFile=MyScript.lua
MyOption=Hello, world!

Lua script内でSELFオブジェクトを通じてMyOptionを得る事が出来る。

!CommandMeasure

!CommandMeasureを使ってLuaコードを実行できる。

!CommandMeasure "MyScriptMeasure" "MyFunction()"
!CommandMeasure "MyScriptMeasure" "a = b; print(SKIN:ParseFormula('(2 + 2)'))"

Rainmeterは「"」しか認識しないので引数内で使うなら「'」を使う事。

Initialize

Initialize関数が定義されている時skinがloadまたはrefreshされた時1回だけ実行される。これはscript Measure自体が無効になっていても実行される。!SetOptionで実行scriptを変更した時も実行される。ちなみにdofileを使えばimportと同様の事が出来る。

function Initialize()
	dofile(SKIN:GetVariable('@').."MyDoFiles\\toolkit.lua")
	dofile(SKIN:MakePathAbsolute("toolkit.lua"))
end

Update

Update関数が定義されている場合Script Measureが更新されるたびに実行される。

function Update()
	MyVariable = "Hello, world!"
	return MyVariable
end

Update関数の返り値はScript Measureの返り値となる。

Log

printを使用する事

print("The current value of MyVariable is: " .. MyVariable)

Functions

SKIN object

SKINオブジェクトは自動的に生成される。

Method名 引数 概要
GetMeasure MeasureName 指定された名前のMeasure objectを生成する。ない場合はnilを返す。
MyMeasure = SKIN:GetMeasure("MeasureName")
GetMeter MeterName 指定された名前のMeter objectを生成する。ない場合はnilを返す。
MyMeter = SKIN:GetMeter("MeterName")
GetVariable VariableName
Default
ここでDefaultは任意。ユーザー定義変数の値を返す。ない場合はDefaultで与えられた値を返しDefaultが与えられてない場合はnilを返す。
MyVariable = SKIN:GetVariable("VariableName", "n/a")
Bang BangName
BangArg1
BangArg2
...
BangArgN
Bangを実行する。BangArg1以降はBangの引数。
someVar = 12
SKIN:Bang("!SetOption", "MeterName", "Text", "Hello, world!")
SKIN:Bang("!SetOption", "MeterName", "FontSize", someVar)
SKIN:Bang("!UpdateMeter", "MeterName")
SKIN:Bang("!Redraw")
MakePathAbsolute File/Folder 相対Pathをskinフォルダからの絶対Pathに変換する。
MyPath = SKIN:MakePathAbsolute("MyImage.png")
ReplaceVariables String 変数を含む文字列を処理する。Section変数も有効。
MyString = SKIN:ReplaceVariables("The value of MyVariable is #MyVariable#.")
ParseFormula FormulaString 数式の結果を返す。数式でない場合はnilを返す。Rainmeterの組み込み関数は括弧で括る必要がある事に注意する事。
numToRound = 239.78
roundedNum = SKIN:ParseFormula("(Round("..numToRound.."))")
Measure object

Measure objectはGetMeasureを使用して生成する。

MyMeasure = SKIN:GetMeasure("MeasureName")
Method名 引数 概要
GetValue Measureの値を数値で返す。
MyMeasureValue = MyMeasure:GetValue()
GetStringValue Measureの値を文字列で返す。
MyMeasureValue = MyMeasure:GetStringValue()
GetOption OptionName
Default
ここでDefaultは任意。Optionの値を文字列で返す。Optionが存在しない場合はDefaultを返し未指定の場合は空白を返す。
MyGroup = MyMeasure:GetOption("Group", "None")
GetNumberOption OptionName
Default
ここでDefaultは任意。GetOptionと同じだがこちらは数値で返す。
MyUpdateDivider = MyMeasure:GetNumberOption("UpdateDivider", 1)
GetName Measure名を文字列で返す。
MyMeasureName = MyMeasure:GetName()
GetMinValue Measureの最小値を返す。
MyMeasureMin = MyMeasure:GetMinValue()
GetMaxValue Measureの最大値を返す。
MyMeasureMax = MyMeasure:GetMaxValue()
GetRelativeValue Measureの値を0.0-1.0間の%値として返す。当然MinValueとMaxValueに依存する。
MyMeasureValue = MyMeasure:GetRelativeValue()
GetValueRange Measureの値の範囲つまりMinValueとMaxValueの差を返す。
MyMeasureRange = MyMeasure:GetValueRange()
Disable Measureを無効にする。
MyMeasure:Disable()
Enable Measureを有効にする。
MyMeasure:Enable()
SELF object

SELFオブジェクトは自動的に生成される。全てのMeasure objectはSELF objectでも有効。

MyScriptMeasureName = SELF:GetName()
Meter object

Measure objectはGetMeterを使用して生成する。

MyMeter = SKIN:GetMeter("MeterName")
Method名 引数 概要
GetOption OptionName
Default
ここでDefaultは任意。Optionの値を文字列で返す。Optionが存在しない場合はDefaultを返し未指定の場合は空白を返す。
MySolidColor = MyMeter:GetOption("SolidColor", "000000")
GetName Meter名を文字列で返す。
MyMeterName = MyMeter:GetName()
GetX Absolute ここでAbsoluteは任意。X座標を返すのだがAbsoluteがtrueの場合絶対値を返す。
MyX = MyMeter:GetX()
GetY Absolute ここでAbsoluteは任意。Y座標を返すのだがAbsoluteがtrueの場合絶対値を返す。
MyY = MyMeter:GetY()
GetW Meterの幅を返す。
MyW = MyMeter:GetW()
GetH Meterの高さを返す。
MyH = MyMeter:GetH()
SetX X MeterのX座標を与える。Referenceには書いてないが当然引数を指定する必要がある。
MyMeter:SetX(100)
SetY Y MeterのY座標を与える。
MyMeter:SetY(100)
SetW W Meterの幅を与える。
MyMeter:SetW(100)
SetH H Meterの高さを与える。
MyMeter:SetH(100)
Hide Meterを非表示にする。
MyMeter:Hide()
Show Meterを表示する。
MyMeter:Show()

Restrictions

次のLua Libraryは現在はRainmeterでは使用不可。

  • LuaCURLの様なコンパイルされたライブラリ
  • require, os.exit, os.setlocale, io.popen, collectgarbage

Inline Lua

Script MeasureのSectionVariable経由でLua内関数を実行またはLua内の変数を取得できる。関数を実行した場合SectionVariableの値は当然関数の返り値となる。今のところ実行できるのは関数のみでLua Statementを単独で実行は出来ない。

[&ScriptMeasureName:LuaFunctionName(numberParameter, 'stringParameter', ...)]
[&MeasureMyScript:myVariable]

以下はいくつかの注意点

  • SectionVariableなんだから当然DynamicVariables=1が必要。
  • 関数の引数は引用符で括らないと変数扱いされる。
  • 関数の引数にtableを指定する事は出来ない。
  • nilを引数で指定する事は可能だが返り値とする事は出来ない。
  • tableをindex付きで引数に指定する事は出来ない。
  • skinの初回更新前はMeasureおよびMeterの初期値は0もしくは""が設定されるので注意する事とあるが関数の引数にMeasureの値をSectionVariableで引っ張ってくる場合の事。
[Rainmeter]
Update=1000
AccurateText=1
DynamicWindowSize=1

[MeasureGetUserName]
Measure=Plugin
Plugin=SysInfo
SysInfoType=USER_NAME
UpdateDivider=-1

[MeasureScript]
Measure=Script
ScriptFile=SimpleLua.lua
Disabled=1

[MeterWelcome]
Meter=String
FontSize=20
FontWeight=400
FontColor=255,255,255,255
SolidColor=47,47,47,255
Padding=5,5,5,5
AntiAlias=1
Text=[&MeasureScript:GetWelcome('[&MeasureGetUserName]')]
DynamicVariables=1
function GetWelcome(inArg)
	hourOfDay = tonumber(os.date('%H'))
	if hourOfDay < 12 then
		greetingText = 'Good Morning'
	elseif hourOfDay < 17 then
		greetingText = 'Good Afternoon'
	else
		greetingText = 'Good Evening'
	end
	welcomeText = greetingText..', '..inArg
	return welcomeText
end

この例は特に解説なんか必要ないがScript MeasureがDisabledとなっているのはUpdate関数もないし返り値も使われてない為Measure自身は動いている必要はないので。

今月の読書日記

詳説 日本仏教13宗派がわかる本 (The New Fifties)

詳説 日本仏教13宗派がわかる本 (The New Fifties)

  • 作者:正木 晃
  • 発売日: 2020/03/05
  • メディア: 単行本(ソフトカバー)
特攻隊員の現実 (講談社現代新書)

特攻隊員の現実 (講談社現代新書)

大奥のおきて 「女人版図」しきたりの謎

大奥のおきて 「女人版図」しきたりの謎

  • 作者:由良弥生
  • 発売日: 2007/09/27
  • メディア: 単行本(ソフトカバー)

Annieの使い方メモ

youtube-dlではbilibiliが動かないので仕方なくAnnieとやらを使う事にしたが、どうもドマイナーなソフトらしく日本語の情報が皆無。仕方ないのでまた使い方をまとめる事にした。

インストール

面倒な事は何もないがバイナリはReleasesページから。

使い方

コマンドラインから使うのでyoutube-dlと同じように

annieのpath [OPTIONS] URL [URL...]

てな感じで使う。

Option

-i
動画情報を表示する。利用可能なformatが出てくる。
-F string
urlをまとめて記述したtxtのpathを指定する。
-d
デバッグモードで実行する。
-j
諸情報をJSON形式で表示する。
-v
Verを表示する。
Download
-f string
downloadするstreamを指定する。-iで確認することが出来る。
-p
playlist内の動画全てをdownloadする。
-n int
同時download数を指定する。ただしマルチパート動画のみ。defaultは10.
-c string
cookieを指定する。
-r string
referrerを指定する。
-cs int
download時のchunk sizeを指定する。単位はMB。速度制限がかかるような場合に使う。
Network
-retry int
download時の試行回数を指定する。defaultは10。
Playlist
-start int
-end int
開始または終了するplaylist内の動画番号を指定する。
-items string
playlist内のdownloadする動画番号を1,5,6,8-10の様にカンマ区切りで指定する。
Filesystem
-o string
-O string
-oでdownloadするディレクトリを、-Oでファイル名を指定する。これは必ず分けて指定する事。-oでfull pathを指定すると怒られる。
Subtitle
-C
字幕もdownloadする。
Youku

youkuは使わないので意味が全く分からんがoptionにあるので一応掲載。

-ccode string
Youkuのccodeを指定する。defaultは0590。
-ckey string
Youkuのckeyを指定する。defaultは長いので省略。
-password string
Youkuのpasswordを指定する。
aria2

なんでも分割された動画は自分でくっつける必要があるらしい。勝手にやってくれないのか。

-aria2
RPCでAria2を使う。
-aria2addr string
Aria2のアドレスを指定する。(default "localhost:6800")
-aria2method string
Aria2のMethodを指定する。(default "http")
-aria2token string
Aria2のRPC Tokenを指定する。

JDownloader2 パッケージャのダイナミック変数の使い方

ファイルのリネームを自動でやりたい。具体的にはURLの一部分をファイル名に取り込みたい。この程度は必ず出来るはずだと思うがやり方が分からない。設定をつらつら眺めてるとパッケージャーとやらで何か出来そうな気がする。なるほど規則の適用条件と設定内容を決めるのか。設定内容の中にファイル名というのがあるしダイナミック変数というのも出てくる。きっとこれだ。しかしダイナミック変数の中にURLがない。暫くいじってもよく分からないので5chの該当スレッドをみると同じような質問が出ててURLを設定しないから出てこないんだとある。条件部分のダウンロードURLとかソースURLの事かしら。ちゃんとソースURLを指定してるけど出てこないぞ。またまた適当にポチポチしてたらやっと分かった。つまりワイルドカード部分を変数として使うのね。つまり

example.com/*

などとすると

<jd:source:1>

というのが使えるようになる。また

example.com/*/*

という指定の仕方をすると

<jd:source:1>
<jd:source:2>

と2つ使えるようになる。

いやいやこれはヘルプか何かがないと分からんよ。

今月の読書日記

戦国と宗教 (岩波新書)

戦国と宗教 (岩波新書)

世界史のミカタ (祥伝社新書)

世界史のミカタ (祥伝社新書)

日本人が知るべき東アジアの地政学 ~2025年 韓国はなくなっている~

日本人が知るべき東アジアの地政学 ~2025年 韓国はなくなっている~

  • 作者:茂木 誠
  • 発売日: 2019/06/25
  • メディア: 単行本(ソフトカバー)

SandyおじさんのHDDがヤバいので交換するついでにメモリを増設してみた

以前から思ってたけどデータ用のHDDがヤバそう。なんせSandyおじさんなのでいっそおニューのRyzenマシンでも買うかとちょっぴり思ったがブラウザと専ブラが動けばそれでいいという程度の用途なので現状特に不満はない。ちなみに2500kにメモリ4Gという煽り対象にジャストフィットなスペック。電源は以前交換してるので平気なはず。なのでOS用HDDとセットでSSDにするついでにメモリの増設という計画を立てた。

まずSSDに換装

買ったSSDは以下の物。正直データ用がSSDである必要は全くないのだが少しでもPCが静かになるかと思って。

Windows7からの無償Upgrade物なのでパーツ交換時のライセンスがどうなるのか不安なのでまずSSDだけ換装して認証を通すという作戦。SSD自体は特に問題なく認識するがOSの書き戻しでつまずく。何だかOSが立ち上がらない。調べると何でもOSと回復ドライブはセットで戻さないといかん様子。OSだけ書き戻してもいかんかったのね。OSとデータ共に全て書き戻してこの作業は終了。なおPCの騒音は特に変わらない模様。ですよねー、まあ主な騒音の原因はCPUファンだしね。
さて、SSDにしての感想だが確かにOSの起動は劇的に速くなった。でも起動してしまえば後はまあボチボチでんなって感じ。大型ソフトを動かせばまた違うんだろうがネット専用PCにSSDの必要性は薄いらしい。

次はメモリを増設

買ったのは以下の物。別に4Gでも困らなかったが何せ今はメモリが安いのでついでにという感じ。ちょっとどうかなと我ながら思うけど16Gで6000円という値段には勝てなかった。しかし一時期は16Gで2万円とかしてたから劇的に安くなったね。

少々不安なのが今刺さってる2G*2のメモリは1333でこいつは1600なんだよね。ひょっとしたら同時には動かんかもしれん。という心配をしながらメモリ増設の作業に取り掛かる。以前静電気でメモリを飛ばしてるので慎重に作業開始。まあメモリを空きスロットに刺すだけなので作業自体はすぐ終わる。が、案の定エラーを吐く。仕方ないので既存の2G*2を外すとあっさり起動。ああやっぱりね。まあ16Gも20Gもあまり変わらないからいいよね。さてメモリ交換の感想だが何せ用途が用途なので別に感動はない。

まとめ

ゲームしなきゃ未だに2500kで何も困らないんだから凄いもんだ。officeやゲーム等の大容量ファイルを大量に読みに行くようなソフトを使うならSSDは有用。メモリは頻繁にスワップ起こすならメモリ増設すればいい。じゃなきゃ必要ない。心配してたライセンスもMSアカウントに紐付けてたからかもしれんけど特に問題なかった。

追記

データ用ストレージにSSDはいらんかもと思ったが圧縮ファイルの扱いが劇的に楽になった。解凍作業の速い事速い事。やっぱデータ用でもSSDはいる子だった。