みぃちゃんの頭の中はおもちゃ箱
略してみちゃばこ。泣いたり笑ったり
 



umejam00.jpg: 梅の み

梅の みが すこし てに はいりました。ジャムを つくりましょう。砂糖は つかいません。

材料

  • 梅の み (きいろく熟したもの)

  • はちみつ (梅の おもさの2/3くらい。このみで加減します)



つくりかた

1. 梅の みを ひと晩みずに つけます。

umejam01.jpg: 梅ジャムを つくる (梅を みずに ひたす)

2. ざるに あけて、みの なりくちを つまようじで とります。今回は、熟して きから おちた みを つかうので、なりくちが ありません。

3. 圧力なべに みず100ccを いれます。高圧側の おもりを つかい、沸騰したら所定の時間だけ にたててから ひを とめます。

4. なべを あけられる状態に なったら、ざるに あけ、みずけを とります。

umejam02.jpg: 梅ジャムを つくる (にた梅の みずけを きる)

5. みを つぶします。圧力なべで にると やわらかく なるので、うらごしは しません。

umejam03.jpg: 梅ジャムを つくる (にた梅を つぶす)

たねは いれたまま。あとで しゃぶります。

6. つぶした梅の みに はちみつを いれます。よわびに かけて につめます。あついうちに瓶に つめます。

umejam04.jpg: 梅ジャムを つくる (瓶に つめる)

できあがり。

すっぱくて さわやかなジャムです。あつい季節に ぴったり。

※ この記事の本文からは漢字の訓を排除しています。


コメント ( 0 ) | Trackback ( 0 )




C++でのコーディング。文字列のキーとともに文字列を格納するコンテナを定義しました。便利に つかっていましたが、取得した文字列をデータ列と みなして解釈し、そのデータ列を任意のコンテナに格納する機能を実装したいと おもいました。たとえば、キーを指定して取得した文字列を (コンマ区ぎりなどの) 数値列と みなして、それぞれの数値を任意の かた (intやdoubleなど) に変換してコンテナに格納する機能は、利用する機会も おおいでしょう。

データ列の かたは いろいろ かんがえられるので、外部からはget()メンバ関数をよびだし、そのget()メンバ関数が内部でデータ列の解釈方法を指定して別のメンバ関数をよびだすように構成します。
class A
{ public:
	...
	// 外部からはこの関数をよびだす。
	// データの かたに よって分岐させるためのヘルパ関数
	template <class OutIter>
	 OutIter get(const std::string &key, OutIter oi) const;

protected:
	template <typename T> struct StringParser;

	// 実際の処理では、上記のget()が以下のget()をよびだす
	template <class Parser, class OutIter>
	 OutIter get(const std::string &key, Parser parser, OutIter oi) const;
	...
}

// データ解釈用の関数オブジェクト群
template <typename T> struct A::StringParser
{
 T operator () (const std::string &s);
};

template <> struct A::StringParser<int>
{
 int operator () (const std::string &s) { return std::atoi(s.c_str()); }
};
template <> struct A::StringParser<long>
{
 long operator () (const std::string &s) { return std::atol(s.c_str()); }
};
// and so on...

template <class Parser, class OutIter>
 OutIter A::get(const std::string &key, Parser parser, OutIter oi) const
{
	while (...) {
		...
		// いろいろな処理
		...
		*out_to++ = parser( elem);
				// かたによる処理の ちがいをparserで吸収
	}
	return oi;
}

// クラス外からはこのget()をよびだす
template <class OutIter>
 OutIter A::get(const std::string &key, OutIter oi) const
{
	return get(key, StringParser< decltype(*oi) >(), oi);
}

void f(A &a)
{
	std::vector<int> v;
	a.get(key, std::back_inserter(v));
	...
}

でも、これは不正なコード。decltype(*oi)がintに なることを期待していますが、そうは なりません。back_inserter()で生成される反復子の かた (クラス) はback_insert_iterator<Ctn>ですが、back_insert_iterator<Ctn>::operator *()が かえす かたは そのクラスに対する参照 (back_insert_iterator<Ctn> &) です。decltype(*oi)はback_insert_iterator<Ctn> &になります。これに対応するStringParserは ありませんから、コンパイル エラーが でます。

関連記事: 2014年9月5日: だまされてる?

上記のA::get()を以下のように かきかえることも できません。
template< class OutIter>
 OutIter A::get(const std::string &key, OutIter oi) const
{
 return get(key, StringParser< typename std::iterator_traits<OutIter>::value_type >(), oi);
}

iterator_traits< back_insert_iterator<Ctn> >::value_typeはvoidなので、上記の第2パラメータはStringParser<void>()に なってしまいます。もちろんvoid用のStringParserは定義できないので (文字列からvoid値を取得するのは無意味ですし、データの解釈方法も判別できません)、この方法でも問題を解消できません。

たしかに出力反復子の もどりがたを一般的に定義することは できません。でも、ポインタと おなじ はたらきをする反復子など、特定の反復子に ついては正当な かたを定義できるのだから、これくらい できても いいんじゃないかとC++の仕様に文句をいうわけです。

しかたが ないので
template <typename T, class OutIter>
 OutIter A::get(const std::string &key, OutIter oi) const
{
	return get(key, StringParser<T>(), oi);
}

void f(A &a)
{
	std::vector<int> v;
	a.get< decltype(v)::value_type >(key, std::back_inserter(v));
	...
}

として しのぐことに しました。うーん。不格好だし、ながったらしいなぁ。

template <class Container>
 void A::get_push_back(const std::string &key, Container c) const
{
	return get( key,
		StringParser< typename Container::value_type >(),
		std::back_inserter( c));
}

void f(A &a)
{
	std::vector<int> v;
	a.get_push_back(key, v);
	...
}

結局、push_back専用のメンバ関数を用意することに。ようやく すっきりしました。ほかにpush_front版やinsert版も かんがえられますが、この関数はデータ列を先頭から解釈して順番にコンテナに格納することから、頻繁に つかうのはpush_backでしょう。ほかのバージョンは「不格好」版をつかうことにします。

※ この記事の本文からは漢字の訓を排除しています。


コメント ( 0 ) | Trackback ( 0 )




D70s with SIGMA 17-70mm F2.8-4.5 DC Macro thru Kenko Pro1D Protector (W), Aperture priority AE (F=7.1 SS=1/100s), 0.0EV (Matrix metering), ISO200, WB=Sunny (+0), f=70mm (35mm-equivalent: 105mm)


コメント ( 0 ) | Trackback ( 0 )




D70s with SIGMA 17-70mm F2.8-4.5 DC Macro thru Kenko Pro1D Protector (W), Aperture priority AE (F=6.3, SS=1/80s), 0.0EV (Matrix metering), ISO200, WB=Sunny (+0), f=70mm (35mm-equivalent: 105mm)

あかい はなに ふゆの なごり。

※ この記事の本文からは漢字の訓を排除しています。


コメント ( 0 ) | Trackback ( 0 )




D70s with SIGMA 17-70mm F2.8-4.5 DC Macro thru Kenko Pro1D Protector (W), Aperture priority AE (F=4.5, SS=1/400s), -0.7EV (Matrix metering), ISO200, WB=Sunny (+0), f=70mm (35mm-equivalent: 105mm)

なかには、まだ かたい つぼみも たくさん。

AAF1260.jpg: しだれうめ
D70s with SIGMA 17-70mm F2.8-4.5 DC Macro thru Kenko Pro1D Protector (W), Aperture priority AE (F=6.3, SS=1/125s), +1.0EV (Matrix metering), ISO200, WB=Sunny (+0), f=70mm (35mm-equivalent: 105mm)

ひが くれてきちゃった。

※ この記事の本文からは漢字の訓を排除しています。


コメント ( 0 ) | Trackback ( 0 )



« 前ページ