みぃちゃんの頭の中はおもちゃ箱

略してみちゃばこ。泣いたり笑ったり

やすものがいの ぜにうしない

2014年09月15日 22時09分17秒 | 日常のあれこれ
中国メーカーの製品をさけるように なった直接の原因は、実家で ははが つかっているラジカセです。

ある ひ、ははがキッチンでラジオをきこうと近所の家電量販店でラジカセをかってきました。ラジオだけ きければ十分と、やすさ重視で えらんだのが中国メーカーの製品。

つかいはじめた当初は問題なく動作していました。ところが、次第にスイッチの接触不良が ひどく なってきました。しらないうちに おとが よわくなったり きこえなくなったり するんだとか。ちかくで とだなをあけしめすると その振動でプツリと おとが とぎれてしまう始末。

やすものがいの ぜにうしないとは よく いったもの。日本のメーカーによる品質管理の もとで中国で製造されたものは別として、中国メーカーが独力で製造した製品は あてに なりません。

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

温水洗浄便座、ネットで即決

2014年09月14日 22時06分04秒 | 日常のあれこれ
温水洗浄便座が こわれてしまいました。スイッチかセンサの故障だと おもいますが、15年も まえの機種なのでメーカーも部品の在庫を処分しており、修理できないはずです。15年も つかえば もう寿命でしょう。あたらしいものに かいかえます。

ちょい ちょいとネットのショッピング サイトで検索して (ただしAmazonは つかわない)、「温水洗浄便座」と いうキーワードで検索しているのに洗浄機能が ないものまで検索結果に でてくることにイライラしながら (いまだに なおらないショッピング サイトの大欠陥)、めぼしい製品をさがします。高機能は もとめず実用一点ばりで即決。ごく短時間の あっけない かいものでした。洗浄機能だけ あれば十分なのですが、消臭機能まで ついています。おどろくことに1万5000円をきる ねだんでした。しかも ちゃんと日本のメーカーの製品であり、決して中国メーカーの粗悪品では ありません。

15年前に かったときは近所のホームセンターで たしか3万円ほど しました。それが ときをへて半ね以下に なっているとは。大量生産おそるべし。

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

こんなに大変だったっけ?

2014年09月13日 22時50分02秒 | IT・デジタル
ぽち ぽち ぽちとコーディング。原理は単純なのですが、コードに おとすと なると結構大変です。こんなに大変だったっけ?

ノートに擬似コードで かいたアルゴリズムは ごく単純なのですが、
for u∈Wn do
	...
end for
なんて かいても実際にはWnが連想配列の配列の配列だったり、たくさん あるデータの なかから効率よく必要なデータを検索できるようにインデックスをはったり、処理の方向を逆転できるように したり、なんてこと してると やっぱり複雑にも なるか。おちついて ひとつ ひとつコーディングしていきましょう。

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

びわの きに すず

2014年09月12日 22時26分54秒 | 日常のあれこれ
リー、リー、リー、リー、リー

実家の にわが にぎやかに なってきました。

リー、リー、リー、リー、リー

この なきごえはアオマツムシだそうです。この むしは きの うえで なくんだとか。とすると、びわの きに のぼっているのでしょう。あまりに おおくの むしが しきりに なくので、まるで びわの きに すずをたくさん つけたみたい。なつはセミ。あきはアオマツムシ。これだけの むしが いったい どこに かくれていたのか。

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

メンバ関数を呼び出す出力反復子 (C++)

2014年09月11日 21時30分00秒 | IT・デジタル
以前にC++で作った出力反復子を汎用化しました。指定したオブジェクトの指定したメンバ関数に引数1個を渡して呼び出す出力反復子です。
template< class Target,
	class RetType,
	class Par1Type,
	class BaseIter = std::iterator< std::output_iterator_tag, void, void, void, void>
	>
struct UnaryMemberCallIterator_cref
	: public std::iterator_traits< BaseIter>
{ public:
 typedef RetType (Target::*func_type)( const Par1Type &);
 UnaryMemberCallIterator_cref( Target &trg, func_type f)
				: trg_( trg), func_( f) { }
 UnaryMemberCallIterator_cref &operator =( const Par1Type &x)
				{	(trg_.*func_)( x);
					return *this;
				}
 UnaryMemberCallIterator_cref &operator * ( void) { return *this; }
 UnaryMemberCallIterator_cref &operator ++( void) { return *this; }
 UnaryMemberCallIterator_cref &operator ++( int ) { return *this; }
protected:
 Target &trg_;
 func_type func_;
};

この出力反復子に書き込むと、その値が引数として渡されてメンバ関数が呼び出されます。

*out++ = x; // (trg_.*func_)(x) が呼び出される。

この反復子クラス (UnaryMemberCallIterator_cref) を直接使おうとしても使えるのですが、

class Hoge
{
public:
void some_func( const SomeRecord &i);
};

Hoge hoge;
copy( container.begin(), container.end(),
UnaryMemberCallIterator_cref< Hoge, void, SomeRecord>( hoge, &Hoge::some_func));

戻り型と引数の型をテンプレート引数で指定しなければならないのは美しくありません (copyでループするだけならこのような反復子を作る必要はありませんが、簡単な例として示しました。本来は、呼び出し先の関数が複数の結果を出力するため、結果を回収する手段として作った出力反復子を一般化したものです)。

で、ヘルパ関数を用意する、と。

template< class Target, class RetType, class Par1Type>
UnaryMemberCallIterator_cref< Target, RetType, Par1Type>
unary_member_call_iterator( Target &trg, RetType (Target::*f)( const Par1Type &))
{
return UnaryMemberCallIterator_cref< Target, RetType, Par1Type>( trg, f);
}

本体よりも戻り値や引数の宣言のほうが長い、ステキな関数に。

Targetがコンテナでなければ基底クラスBaseIterに意味はないので、ヘルパ関数はBaseIterを省略するバージョンのみを用意しました。Targetがコンテナの場合にそのTarget::iteratorを基底クラスとする出力反復子を生成するには、別のヘルパ関数 (unary_member_call_container_iteratorなど) を作る必要があります。

これですっきり書けるようになりました。

copy( container.begin(), container.end(),
unary_member_call_iterator( hoge, &Hoge::some_func));

ヘルパ関数を一段かませないといけないのが何だかまどろっこしいけど。

UnaryMemberCallIterator_crefはメンバ関数の引数型がconst Par1Type &の場合のクラスです。ここまで来たら、値渡し版の反復子クラスや非const版の反復子クラスも用意しておきたい。そうなれば対応するヘルパ関数も。