北海道北見たまねぎがたっぷりの濃厚スープ

北海道北見たまねぎがたっぷりの濃厚スープ

近くのドラッグストアで売っていたので、買ってみた。

すっきりしていて、柔らかい口当たり。美味しかった!

普段はクノール派なので、コンソメスープはこれを飲んでいた。

でもチーズクルトンが何となく好みじゃなかったので、他のものに変えたかったんだ。チーズは嫌いじゃないのだけれど、このクルトンはわたしにとって、チーズ感が強すぎた。

北海道くらし百貨店のスープも、買ってからチェダーチーズ使用の旨に気付いて一瞬かなしみに満ちたのだけど、飲んでみたら気にならない程度だった。というか、わたしは言われなければ分からなかっただろう。次からはコレにする。

プログラムのコメントとチケット駆動開発

コメントのいらないプログラムの書き方 - NZ MoyaSystemはてなブックマークに、こんなコメントがあった。

NG。コメントは処理の意味でなく仕様の意図を書く。

まさにその通りだと思った。

それと同時に、 Redmine のチケットや Backlog の課題にも理由を書いて欲しいことを、思い出した。
作業内容をチケットに起こしてくださいと言うと、何をするのかだけ書かれるケースが、わたしの周りでは目に付くんだよ。
それでは何故そうするのかが分からない。何をするかも大事だけれど、何故そうするのかも大事なはず。後から問題が発生した場合に、何故その実装が必要だったのかが不明だと「わざわざ変えたのだから理由があるはずで、理由があるなら只 revert しちゃいけないはずなんだが、その理由が分からないから困る……」という話になる。なるんだって。わたしの経験上。うぅ。
だからチケットには何故この作業が必要になったか、そしてこの作業は何をどうするのか。それが残るようにして欲しい。

ちなみにわたしは、もう何年も前のことだけど、テストクラスをコメントつきで充実させたはいいが、テスト対象のクラスに一切コメントを入れなかったことがあって、上司に笑いながら「確かにテスト読めば分かるんだけどさぁ、コメント入れて欲しい」と突っ込まれたことがある。その節はたいへん申し訳なかった。当時のわたしは、単体テストで機能を網羅したぞとご満悦でした。

ところで、なんとなくチケット駆動開発をググって Wikipedia を眺めたら。

大阪中央公会堂で行われたTiDD関西勉強会にて、「TDDと同じ略称だと紛らわしいので、TiDDにしよう」で決まった。iが小文字なのは、おしゃれだからである。

おしゃれだからであるに、くすっと笑ってしまった。

memcached 1.4.4-14 on Windows 10 Pro が無反応になる悲しみ

最近、 Windows 10 Pro に memcached 1.4.4-14 を入れるという悲しみの環境にいる。

memcachedWindows で Memcached を使う - make world を参考に、サービスとしてインストールした。

これがたまに、へそを曲げる。
何が原因か分からないのだが、 java からアクセスしても接続ログを出すだけで、その後は応答がなくなってしまうのだ。

いつもなら、サービスの再起動で直った。

しかしあるとき。何度サービスを再起動しても直らなくなってしまった。
丁寧に停止してから開始してもダメだし、OS再起動でも直らなかった。

さすがに困るので、いろいろ調べてみたところ、高速スタートアップなる機能があることを知った。

Windows 10で高速スタートアップを無効にする:Tech TIPS - @IT に従い、設定を確認したところ、たしかに高速スタートアップが有効になっている。

とりあえず、 Shift キーを押しながらのOSシャットダウンを試してみた。

…… memcached の挙動が戻った。
きちんと応答がある。

助かった。ありがとう、ネットの叡智よ。

……そもそもの Windowsmemcached を入れねばいけない環境を改善するためにはどうするか、考えよう。ぐぬぬ

docker コンテナへ memcached の image をデプロイすることにした。無理やり低いバージョンを Windows のサービスとして動かすよりは、マシじゃないかな。

フローフシのマスカラ

話題になっていたので、買ってみた。選んだのは、こちら。

モテマスカラ NATURAL 2

モテマスカラ NATURAL 2

フローフシ モテマスカラ TECHNICAL 3

フローフシ モテマスカラ TECHNICAL 3

自慢じゃないが、わたしはメーキャップのことがよく分からない。どんな部分が優れているか、もしくは劣っているかについては語れない。とりあえず、小さなマスカラブラシが下まつげに特効と呼べる性能を発揮したことには感動した。

ウォータープルーフとお湯落ちタイプの両立を叶えた新技術「WPフィルムⓇ」を採用とのことではあるが、Bifesta (ビフェスタ) うる落ち水クレンジング アイメイクアップリムーバー 145mLでよく落ちる。

エンジェルフロート、購入

とある事情で入手した、市場価格は少しお高めの低反発枕

こいつが合わなかったのか、とてつもない肩凝りというか寝違え感というか、そういうモノを覚えてしまい、人生で初めてアンメルツを買うところまで追い詰められていた。

枕が原因かと疑い、とりあえず余っていた毛布を折り畳んでタオルでくるんで使っていると寝違え感こそ無くなったものの、流石にリラックスからはほど遠い。

そういうわけで、ネットで探したまくら屋本舗へ行ってきた。

店員さんに「お時間ありますか」と聞いていただけたので、頷くとカルテとやらへの記入から開始。それを基にヒアリングをされ、首のカーブや寝方の測定、枕の試用などをさせていただけた。汗だくだったにも拘わらず嫌な顔ひとつなかった店員さんに感謝する。理想的な枕の高さについても聞かせてもらえて面白かった。

最初に試させてもらった枕は、好いなって感じがあった。ただ、ふむ、にゃるほどってところであった。

次のが素晴らしかったんだ。ふわっふわなくせにきちんと支えてくれて、包まれる安心感。あっコレだって思った。

この、2つめの枕がエンジェルフロート

後で聞いたら最初に出してくれたのがフルオーダーで、ソレもいちばん柔らかいセッティングだったらしい。測定の結果、肩というか首の凝りが酷かったから、合わせて出してくれてたそうで。あまり硬いと、ソレに反発して筋肉が強張り、余計に凝ってしまうのだとか。

本当はフルオーダーをいただくつもりで行ったから少し残念だったけど。身体がもっとも気持ち好いモノを選ぶのが好かろう、というわけでエンジェルフロートを購入。寝るのが楽しみになったよ。

良いモノは、好い。

わたしにマドラーの善し悪しなんて判らないだろうし、なんて思い、てきとーに買った1本目。小型の泡立て器みたいなソレが、カップスープを作るにはダマの残りやすいスプーンより使いやすかったから、もう1本くらい買いたそうと Amazon さんを巡った。そして見つけたのがこちら。

柳宗理 マドラー 日本製 000227

柳宗理 マドラー 日本製 000227

これ。好い。素晴らしい。

ある程度の重みがあって掻き混ぜやすい。軽いだけの1本目とはまるで違う手触り。くるくると滑らかに周り、でもすっぽ抜けそうな軽さはない。もちろんダマなんて出来ない。インスタントスープの粉は綺麗に溶けきる。

最初からこちらを買っておけば……いや、今からでも遅くない、2本目いっちゃうか……!

JUnit + JMockit で System.exit(int) と標準入出力の差し替え

まぁ、タイトル通り。今、ちょっと勝手に遊べる環境があるので JUnitJMockit でテストしてみているのだけれど、こいつがウェブアプリではなくコンソールから起動する昔ながらのツールなので、今まではほとんど触らなかった部分の呼び出しも確認したくて困る。

そういうわけで、以下がサンプルコード。なんとなく分かると信じて。

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import mockit.Expectations;
import mockit.Mocked;
import mockit.VerificationsInOrder;

import org.junit.Test;

public class SystemIOTest {

	// System.exit が動くと JUnit ごと終了するので
	// モック化しておく
	@Mocked("exit")
	System s;

	@Test
	public void test_標準入出力を差し替える(@Mocked final PrintStream ps1)
			throws IOException {

		// prepare
		// 標準入力を差し替える
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"abcdefghijklmnopqrstuvwxyz".getBytes());
		s.setIn(bais);

		// expectations
		new Expectations() {
			{
				// ps1 の #checkError() のみ true を必ず戻す
				onInstance(ps1).checkError();
				result = true;
			}
		};

		// 標準入力からデータを読み込む
		byte[] b = new byte[3];
		assertThat(System.in.read(b, 0, b.length), is(3));
		assertThat(b, is(new byte[] { 'a', 'b', 'c' }));

		// Expectations の影響を受ける PrintStream
		System.out.println("標準出力への出力");
		System.exit(1);
		assertThat(ps1.checkError(), is(true));

		// Expectations の影響を受けない PrintStream
		final PrintStream ps2 = new PrintStream(new ByteArrayOutputStream());
		ps2.println("バイト配列への出力");
		assertThat(ps2.checkError(), is(false));

		// verifications
		new VerificationsInOrder() {
			{
				// 標準出力への出力を確認できる
				ps1.println("標準出力への出力");
				times = 1;

				// System.exit(int) の呼び出しが確認できる
				s.exit(1);
				times = 1;

				// Expectations の影響は受けないが処理はレコードされている
				ps1.println("バイト配列への出力");
				times = 1;
			}
		};

	}

}