vlookupの列指定を数値でやってしまうと、列の順序を変えられなくなって困るので、match関数でヘッダから列名を検索することにした。その代わり列名は固定。
.bat, .wsh, .vbs
vbsだけ使えることがわかった.
GW
最近,日記らしいことを全然書いていませんでした.
ヘッドフォンのコードに足を引っかけて落として壊してしまったので,
ついにホットボンドを買ってきました.
強度を持たせようと思って盛りすぎたので少しいびつな形になったけど,使用感はまずまず.
これならまだしばらくは使えます.
前からホットボンドが欲しかったんだけど,いざ買うとなると今は特に困ってないからなあ,と思って買いませんでした.
これで色々壊れても直せますね.
母の日だったので,カーネーションをプレゼントしました.喜んでもらえたのかな?
父が仕事で使う長靴が欲しいと言うのでそれも購入.長靴くらいすぐ買えるがな!
最近,家の中で不便なところを探して直していってます.
安価で簡単に改善できるところがたくさんあるので,
ほったらかしにせず注意して見直してます.
さあー明日からまた頑張って恐ろしい職場に行かなきゃ!!><;
スレッドセーフな銀行クラス(2)
すべてのメソッドの内容を synchronized ブロックに含めるのならクラスを synchronized クラスにしてもよい.
synchronized クラスのメンバはそのインスタンスを shared 型で生成しなければ呼び出せないので,この場合には new Bank ではなく new shared(Bank) とする.
import std.stdio; import core.thread; synchronized class Bank { private int money_; void payin(int m) { money_ += m; } void payout(int m) { // お金があるときだけ出金する if (money_ - m > 0) { money_ -= m; } if (money_ < 0) { // ここには来ない throw new Exception("pay out exception."); } } int money() @property { return money_; } } void main() { auto bank = new shared(Bank); auto tg = new ThreadGroup; bool isRunning = true; // 100ずつ出金する人 tg.create = { while (isRunning) { try { bank.payout(100); } catch (Exception e) { isRunning = false; // 両方のスレッドを終了する throw e; } } }; // 100ずつ入金する人 tg.create = { while (isRunning) { bank.payin(100); } }; // スレッドを回す tg.joinAll(); }