2010年8月31日火曜日

boost::filesystem で link2019 備忘録

 boost::filesystem で、LINK2019 codevec ... とか、generic_string とかで、リンクができずに怒られた。原因が良くわからずに、四苦八苦していたのだが、エラーをよく見ると、unsigned short の文字が!!! wchar_t を組み込み型としてコンパイルしていなかったのが原因だった…。

iPadのバックアップが死ぬほど遅い

 いろいろと調べているうちに、Windows7の場合
/Users/username/AppData/Roaming/AppleComputer/MobileSync/Backup フォルダ下に iTunes のバックアップが取られている事がわかった。
 まずやる事は、ウィルス・チェッカーにて、このフォルダを捜査の対象外に設定する事だ。そして、どうせウィルスが活動するのだから、活動して感染しそうになった時に考えれば良いという事で、USBデバイス等の積極的なスキャンもオフにする事にした。次に、/Program Files (x86)/Common Files/Apple/Mobile Device Support/AppleMobileBackup.exe と、AppleMobileDeviceHelper.exe もプロセスの対象外に設定した。

 それでも、バックアップが死ぬほど遅いのに変りない。大量にテンポラリ・ファイルを作成するアプリは?と探っていたら「雑誌オンライン」が犯人であった。なんとかしてくれ。Explorer Flicker も、そこそこテンポラリファイルが多い。雑誌オンラインで雑誌を4冊購入したけど、アプリごと削除するかもしれん。かごの中の鳥も勘弁ならん上に、こうテンポラリファイルが多いのでは、かなわん。4冊分の雑誌代金よりも時間の方が貴重なのだ。

追記:「雑誌オンライン」の設定から、キャッシュを全てクリアし、Explorer Flicker を削除したら、あっという間にバックアップが完了するようになった。予告「雑誌オンライン」アプリの余命は、あと3ヶ月。それまでにテンポラリファイル数を減らす改善がされない場合には、このアプリはfujisanに続いて削除する。

更に追記: テンポラリファイルを調べていて、Zinio と Sonata note も削除する事にした。Sonata note は面白いアプリだと思うのだけども、最近は起動していない。

2010/11/13 追記:Zinioでは、ライブラリのバックアップをスキップする設定が可能になっている。この設定をすると、バックアップが速くなる。

2010年8月28日土曜日

自転車通勤の効果

昨年の五月からはじめて、八月末に鎖骨骨折、今年の四月中ごろ完治。という経過をたどっています。昨年から、今年の四月までは、そんなに体重が落ちませんでした。落ちても、せいぜい二キロ以内。ところが、今年は体質が改善されたためか、六キロほど痩せました。67k前後から61k前後に!体脂肪率も23前後から19ぐらいに!身長が172.5cmぐらいなので、110を引くと62.5。いい傾向です。通勤で片道13キロなんで、一日26キロ走っている勘定になります。体質が改善すると、盆休みと雨続きで、運動しなくても体重が増えません。
自転車通勤していなければ、糖尿病になる可能性が大きかったと、あらためて感じている今日この頃です。通勤時間ですが、慣れると自転車の方が速いです。皆さんも是非、自転車通勤を試してみてください。

2010年8月27日金曜日

Windows の PageSetupDialog ではまる(3)

その1その2、ときて、車輪の開発を行うよりない・・・という結論でしたが、なんとか回避する方法はないものか?
という事で、親ウィンドウと連帯して、ページ設定ダイアログを開きなおすという手法で回避する事にしました。今度は大丈夫です。

 流れは、こんな感じです。
  1. 親ウィンドウに対して、開きなおしをしてほしいフラグを設定する
  2. PrintDialog 中の HDEVMODE をコピーして保管する
  3. PrintDialog 中の HDEVNAMES をコピーして保管する
  4. ::PostMessage( m_hDlg, WM_COMMAND, IDCANCEL, 0 ); する
  5. 親ウィンドウ側の処理で、開きなおししてほしいフラグがあれば、フラグをクリアして、再度、ページ設定ダイアログを開く。その時には PAGESETUPDLG構造体に(2,3)で保管したものを流用する。


 ダイアログをキャンセルしても、プリンタの情報等は更新されてしまいますが、しょうがないところでしょう。キャンセル時の HDEVMODE と HDEVNAME も保管しとくか???

Windows の PageSetupDialog ではまる(2)

結局のところ、PageSetupDlg というコモンコントロールの用紙選択コンボボックスを書き換えるという手法で対応することにしました。
 用紙選択コンボボックスは、Dlgs.h にて cmb2 と定義されています。給紙方法が、cmb3 です。

//
// Combo boxes.
//
#define cmb1 0x0470
#define cmb2 0x0471
#define cmb3 0x0472
#define cmb4 0x0473
...


WTL を使っている場合は、CComboBox を利用して

void CCustomPageSetupDialog::OnInitDialog( HWND hDlg ) {
m_hDlg = hDlg;
m_combo_size.Attach( ::GetDlgItem( hDlg, cmb2 ) );
m_combo_kyusi.Attach( ::GetDlgItem( hDlg, cmb3 ) );
}
void CCustomPageSetupDialog::OnDestroy() {
m_combo_kyusi.Detach();
m_combo_size.Detach();
}

という感じでアタッチできます。
で、プリンタ設定ダイアログを呼び出した直後にプリンタ設定ダイアログの DEVMODE をぱくってきて
以下のような感じで、用紙サイズをシンクロさせます。

void CCustomPageSetupDialog::SyncPaperSize() {
DEVMODE* pDev = GetDevMode();
int n = DeviceCapabilities( (LPCSTR)pDev->dmDeviceName, NULL, DC_PAPERS, NULL, pDev );
struct paper_name { char name_[64]; };
boost::scoped_array<paper_name> pn( new paper_name[ n + 2 ] );
boost::scoped_array<WORD> pi( new WORD[ n + 2 ] );
DeviceCapabilities( (LPCSTR)pDev->dmDeviceName, NULL, DC_PAPERNAMES, (LPSTR)pn.get(), pDev );
DeviceCapabilities( (LPCSTR)pDev->dmDeviceName, NULL, DC_PAPERS, (LPSTR)pi.get(), pDev );
m_combo_size.ResetContent();
for( int i = 0; i < n; ++i ) {
int item = m_combo_size.AddString( pn[i].name_ );
DWORD_PTR siz = pi[i];
m_combo_size.SetItemData( item, siz );
}
// プリンタ設定で選択された用紙を選択
for( int i = 0; i < n; ++i ) {
if( pDev->dmPaperSize == m_combo_size.GetItemData( i ) ) {
m_combo_size.SetCurSel( i );
break;
}
}
GlobalFree( pDev );
}

予想通りというか、dmPaperSize は、コンボボックスのItemDataPtr として保持されていました。
ここは、たぶんドキュメントに記述されていないです。
あほくさ・・・

追記:プリンタ設定ダイアログにてプリンタが変更されている場合、ページ設定ダイアログにて
 用紙サイズを変更した場合の副作用が生じて、ページ設定ダイアログ内のプリンタ情報
(=hDevNames と思われる)をうまく更新しないと、プリンタが元に戻ってしまいます。
 コモンダイアログがプリンタ情報のコピーを使用している場合は、どうにもならないので、
 やはり、車輪の開発で、自前でページ設定ダイアログを作成するほうが良さそうという
 結論にならざるを得ません。

結論:車輪の開発をしないと不可避です。
 PageSetupDlg API がプリンタ情報のコピーを保持しているので、どんなに頑張ってプリンタ情報を
 変更しても、用紙サイズのコンボボックスの値を変更した時点で、DEVMODE構造体が元のプリンタの
 情報に戻されてしまいます。

Windows の PageSetupDialog ではまる

 Windows には、CommonDialog と呼ばれるものが存在します。色の設定、フォントの設定、プリンタの設定、ドキュメントの印刷ページ設定などが、これで行えます。ルック&フィールを統一しようという趣旨で提供されています。
 ある日、PageSetupDialog に存在していた プリンタの選択機能が取り除かれました。Windows Vista からです。糞OS Vista から取り除かれました。
 ドキュメントでは
http://msdn.microsoft.com/ja-jp/library/cc410957.aspx

PrintDlg 関数は、[プリンタの設定]ダイアログボックスを表示することもできます。
しかし、新しいアプリケーションはこの目的で PrintDlg を使うべきではありません。
[プリンタの設定]ダイアログボックスは、PageSetupDlg 関数が作成する
[ページ設定]ダイアログボックスによって置き換えられています。

と、ありますが、こうせざるをえない状況を強いられているのです。

 さて、CommonDialog では、Hook によりハンドラを設定してカスタマイズを行います。
しかし、PageSetupDialog 内のプリンタを変更する手段が用意されていません。もっと言うと、強いられた状況において、プリンタの設定ダイアログで変更された用紙サイズ等の情報を反映させるための手段が用意されていません。つまり、車輪の開発で自前でプリンタを変更する手段を実装しないといけなさそうなんです。
 何故プリンタの設定ボタンが急に無くなったのでしょう?無くなったら、無くなったで代替手段を用意してくれても良さそうなもんですが、完全に隠蔽されていて対処のやりように困ってます。
 残された手段は、コモンダイアログを使わない事。何のためのコモンダイアログなのか、ぼやきまくりっす。

2010年8月26日木曜日

passenger ? mongrel_cluster

まぁ、passenger と mongrel_cluster どちらを使ったらええの?とお悩みの方は多いと思います。
将来性を加味した場合、mongrel_cluster は、もうメンテナンスされてなさそうなんで、先行きは暗いです。しかも、長期に稼働させる事を考えると、定期的にリスタートさせる必要があるでしょう。
今後は、passenger を使うのが主流になるような気がしてます。ただし、現時点では CentOS にて passenger を選択する場合には、SELinux の事はスッパリと諦める覚悟が必要です。ここをクリアできるのは、SELinux マスターの方だけでしょう…。テンポラリ・ファイルを設定して…など…ゴニョゴニョとチャレンジしてみましたが、似非ネットワーク管理者には無理な事でした。
 passenger は、結構簡単に動作させる事ができます。はまりどころは、Rails の public とかに、.ht* 系のファイルが残っていて、mod_rewrite のルールが記述されており、そいつが邪魔をしている。あるいは、environment の指定を httpd の conf ファイルに書き忘れていて、dbに接続できていない。といったあたりになります。

2010/12/03 追記: CentOS Passenger + SELinux 成功例を見つけた。

2010年8月25日水曜日

電子書籍ショップがひでぇ

ZINIOのデフォルト地域がやっと日本になったが、何故か日本だけ選択できない。何かとてつもない陰謀を感じる。iPadユーザには、敷居の高いfujisanは、使えそうもないので削除した。雑誌オンラインでも代用が効くので…。ただ、こいつもカゴの中の雑誌なんで、4冊購入したが、ここで打ち止めにしようと思う。毎回ログインボタンを押すのもうんざりだし、ビュウワを選べないのは致命的。理想書店は、新着本がわからないので、いずれ使い物にならなくなるだろう。こいつのビュウワは、まだ読み易いが、カゴの中の本にかわりはない。楽天ブックス、iPadでリアル書籍を買えってか?
eBook, PDF で電子書籍を販売する予定のアプリがあれば、喜んで乗り換えまっせ!さもなくば、自炊したほうが良い。

仕事でけん

 いや、仕事はしてるのだが、コーディングの方やらをやっている時間がねぇ。ミッション・クリティカルなコードを結構、俺が押さえてるのに、そいつをどうこうする時間がねぇ。

2010年8月24日火曜日

BOOST_SCOPED_ENUM_START

 boost::filesystem::copy_file を使おうと思って、オプションについて調べていたら、


BOOST_SCOPED_ENUM_START(copy_option)
{fail_if_exists, overwrite_if_exists};
BOOST_SCOPED_ENUM_END


という記述にぶち当たった。実は、boost::filesystem::overwrite_if_exists と指定したら、コンパイルエラーで怒られて、えー?じゃ何を指定すればいいんだわさ???となったわけです。

 ご存知のとおり、enum は scope じゃないので、コードを書く上で、いろんなものが、ごっちゃり混ざって美しくない。て訳で、BOOST_SCOPED_ENUM_START -> BOOST_SCOPED_ENUM_END で効率よくスコープ付きの enum を定義しようってことらしい。

boost::filesystem::copy_option::overwrite_if_exists で、めでたくコンパイルも通りました。

2010年8月21日土曜日

カゴの中の本

iPad で本を購入してるが、どいつもこいつもアプリの中に閉じ込められていて、だんだん鬱陶しくなってきた。こんな、使いづらい仕打ちを受けるぐらいなら、新書や中古本を買って自分でスキャンした方がマシだ。
マシだマシだマシだマシだマシだマシだマシだーーーーーーーーーー

2010年8月19日木曜日

boost::filesystem 習作

いやー、ここんところ boost のリリースのタイミングが速い。実は、今まで使用するのを避けていたライブラリがありました。boost::filesystem です。もちろん、Version 3 のような日が来るまでは使えないと思っていたからです。
 と、そんなこんなで、晴れて boost::filesystem を使ってみる事に…。ただの exists に FindFirstFile -> FindClose せんだけでも、随分すっきり書ける。しかし、findfirst に相当する部分が無いようだ。この辺は、path_iterator と range 使ってスマートに書けって事なんだろうか? OSのFileSystemが面倒みるのと、ゴリゴリとフィルタを書くのとどっちがいいんだろう…。


#define BOOST_FILESYSTEM_VERSION 3
#include <iostream>
#include <boost/format.hpp>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

namespace {
std::string make_backup_filename( const char* basename, int cnt ) {
return boost::str( boost::format( "%s.%03d" ) % basename % cnt );
}

std::string shift_and_find( const char* basename, int maxcnt ) {
std::string result = make_backup_filename( basename, maxcnt );
boost::filesystem::path p( result );
// バックアップ・カウント分のバックアップが作成されている場合
if( boost::filesystem::exists( p ) ) {
//一番古いファイルは、ベースのファイル名.001
p = make_backup_filename( basename, 1 );
boost::filesystem::remove( p );
// ベースのファイル名.00N (N >= 2) に対して
// Nをデクリメントしたファイル名にする
boost::filesystem::path n;
for( int i = 2; i <= maxcnt; ++i ) {
n = make_backup_filename( basename, i );
if( boost::filesystem::exists( n ) )
boost::filesystem::rename( n, p );
p = n;
}
} else {
// ベースのファイル名.00N (N > 0 && N < backupcount)
// で最大のものを見つける。
for( int i = maxcnt - 1; i > 0; --i ) {
p = make_backup_filename( basename, i );
if( boost::filesystem::exists( p ) ) {
p = make_backup_filename( basename, i + 1 );
break;
}
}
}
return p.generic_string();
}
}

int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "Usage: bktest basename\n";
return 1;
}

cout << shift_and_find( argv[1], 5 );

return 0;
}

電子障壁その後

せっかくなので、national geographic に、
俺は日本のiPadユーザだ。今世紀ITの世紀なのに、zinio でさえ電子書籍が買えなかった。ペーパーバックの配送なんていらんから、電子書籍の販売について、検討してくれ。
という趣旨の問い合せをしてみたら、
残念ながら、君の地域ではリクエストには応えられない。詳しくはカスタマーサービスに問い合わせてみてくれ。
という感じの返答がきた。何か契約が絡んでるのかも。本家ホームページでの価格も、アメリカ、カナダ、その他で違っていたから、そことの折り合いがつかないのかもしれない。

2010年8月18日水曜日

いろいろ

 まぁ、Pマークの審査が通ったと思ってたら、また二ヶ月以内に審査のための書類を用意しなくてはならない。そして、今抱えてる仕事も重たいので、時間が取れるとも思えない。気分はブルーオーシャンですわ。どないすんねん。iPadで雑誌をちら読みしてたら、ブラックITなる言葉が暗躍していた。
 東京の会社がニアソーシングという言葉と共にパートナー企業を探しに来てたけど、話を聞いた感じでは、単価も納期の相当厳しいと感じた。売上と人数から逆算すると、元請けでも、おそらく現在のうちの会社の受託価格と変わらない。そこを、もう中国とか人件費の安いところでカバーしている感じだ。しかし、外注する仕様書を書くだけでもアホらしい気がする。詳細な仕様書を書いた時点で、既に7割は完成しているだろうからだ。
 日本の受託ソフトウェア産業は、そのうち死ぬような気がしている。予算はありません。期間もありません。だから、だんだんと割に合わなくなって、セット受託しか残らないのでは?と・・・。ここを差別化して生き残った会社は強いんだろうけど、半自動プログラミングでも無ければ無理っぽい。DRY原則程度では、とてもペイできません。要するに、受託に見せかけて受託したら負けという変な状況が理想的。SaaSでプラットフォーム戦略にみんな流れるわけだわ。

 8/16 にフェリーに乗って帰ってきたんだけど、京都では大文字焼きをしていました。大阪育ちなんだけども、生まれてこのかた、大文字焼きなんて全く無縁でした。ただ、見物する時間も取れなくて、かろうじて、電車の中から「大」の字を拝むことができました。これは、これで感慨深いものがありました。

 プログラミングの魔導書 vol 1 のレビューも、ざっとしてみたいところなのだが、コードも交えてレビューする余裕がねぇ。
 Visitor パターンについての雑感(C++で使うと、ひでぇので、もう二度と使いたくない。機能拡張が恐ろしくしんどい)。
 もう少しベタな記事の方が、読者層が広がるのではなかろうか?比較的ベタな記事は、boost::serialization。
 Crowling In the stream 正直、あまり泳ぎたくない場所ゆえに、面白かった。
 Variadic Template は、スペースの問題もあって難しいかもしれないけれども、もう少し動機を書いた方が良い気がしました。つまり、今までは、こんなコードを書いていたんだけども、もうちょっとマシな書き方はねぇのか?と感じた瞬間があると思うのです。ここが無いと、このコードにどんなメリットがあるのか、ピンとこない感じがしました。自分が不勉強なだけかもしれません。
 Oven range cooking は template と延遅評価にもう少し解説があると、もっとオモロかったかも? boost::numeric::ublas など、この辺は割と重要なトピック…てか? 参照を返す at, front, back 馬鹿と鋏は使いよう・・・初心者には、ちょぅと怖い。
 Hello C++ world. ブログで読んでいたので・・・すみません。でもADLの説明はしっくりきたかも?
 メタプログラミング・・・この手のコードは、書いている時に何か変なものに取り憑かれているのだ・・・後から冷静になって「俺は一体何を書いていたんだ?このコードは、一体何をしているんだ?」と首を傾げるのが、たぶん普通の感覚。この記事を読めるのは、ごく少数のような気がしました。
 Chrono ・・・ melpon さんのブログ記事から考えると、おとなしめな感じ。でも、その分、一般向けでわかりやすい感じがしました。
Boost.Asio ・・・ ここは、私も相当突っ込んでるので、なんとも・・・。応援してます。
 BoostCon ・・・ マシンガン質疑応答ディスカッション、怖ぇ~
 ムーブ・コンストラクタ ・・・ この記事のおかげで、rvalue がすっきり爽快。実はコンテナ操作のコピーコストを気にして、ポインタで保持するとか、今まで悩みの種のひとつだった。

 C,C++ はメモリをレイアウトする言語だ。GCなんて言語機能としていらねぇ。ライブラリでも書いてろ。

 iPad で プログラミングの魔導書 vol1 を読むためには、PDFをPDFに変換する必要がありました。私は、iPadで読んでます。


 

2010年8月9日月曜日

盆休み

 iPadで自炊するようになって、1度読んだ事のある本を読み返す事が多くなりました。もちろん新書0という訳でもないです。気に入った本は何回読んでも面白いです。
 ほんとは9日から休みを取って9日間を確保したかったのですが、仕事の都合でダメでした・・・。そんな訳で、水曜日から盆休みです。また、ネットとは無縁の世界になります。印刷物の代わりにPDFに出力したものをiPadに入れて持っていこうと思ったら、iPadにかまけないで盆休みは子供の相手をちゃんとしてほしいと怒られました。そんなつもり無いっちゅうねん。
 個人情報保護管理責任者の仕事とか、勘弁してほしい事だらけです。才能の無駄使いです。あほみたいにやる事があって、休日中もうなされそうです・・・。休日後のいちばんしんどそうな時期に、俺ひとりでプロジェクト担当です。折衝・コーディング・マニュアル・残設計・部分納品・設定・データコンバート・デザイン・インストーラ作成・・・体がいくつあっても足りなさそうです。

2010年8月8日日曜日

公式サイトの情報は、ちゃんと書こうよ

 地球最古の恐竜展に、息子を連れて行きました。
事前に下調べし、
公式サイトの「アクセス」

■[札幌展]
2011年7月2日(土)-8月28日(日)
会  場:北翔クロテック月寒ドーム
主  催:NHK札幌放送局、NHKプラネット北海道、北海道新聞社、財団法人北海道体育文化協会

の記述を信じて、地下鉄福住駅から、月寒ドームまで歩きました。
現場に着くと、トヨタの車の試乗会しかやっていなくて、係員の人に尋ねると「ここで今日は他にイベントなんてやってませんよ?」との事。狐につままれたような気分で、疲れた~という、うちの坊ちゃんを連れて歩いて福住駅に引き返しながら、嫁さんに確認してもらうと、札幌ドームだよ?との返答。

 朝一番(午前5時)にプログラミングの魔道書をダウンロードしようとしたら、ダウンロードできなくて5回ぐらい繰り返してもダメでした。そこで問い合わせたら、akiraさん直々にダウンロードが問題なくできますよという回答をいただいて、同じアカウントとパスワードで、すんなりダウンロードできて、もしかしてメールアドレス5回も(@と.を)打ち間違えたかなーと恐縮していたところに、嫁さんから札幌ドームだよとの返答をもらい、俺の頭が壊れてしまったのか???とも思いました。

 でも、さっき確認したら、会場:北翔クロテック月寒ドームって、書いてあんじゃん。ちょー、頼むよ、公式サイト…。

 追記:よくよく見ると、2011年じゃん… orz 。やっぱ、どうかしてたのは、俺の頭か・・・
本当の公式サイトは、こっちでした。酷い間違い

2010年8月6日金曜日

今回もキツイなー

今回の受注も厳しいのだ…。工期も短ければ、価格も安く、難度も高い。別に、ウェブのシステムだから、特段しんどい訳じゃないとも思う。しかし、社内ではウェブのシステムは、高コストでペイしないという感覚で見られていると感じる。しかし、最近、仕事の芽があるのは、ことごとくウェブの話だ。無理してでも、ここを鍛えないと未来はないだろう。
正直、本音をいえば、なんで他人の面倒を見なきゃならんのだ?という感覚が強い。仕事に対する姿勢が社員とは、違うのでGIGAZINEさんの人材募集の話が身に染みて解る。
それは置いておいて、単価の安すぎる仕事は、お客さんのためにもならないし、会社のためにもならない。こんかいは、ちょっと反省しよう。

2010年8月1日日曜日

電子古本屋

 もしかしたら、法律の方が追いついていないとは思う。中古ゲームも一時期、使用許諾権の問題でもめていたと思う。
 本をスキャンしてて無駄だと思うのが、日本全国中で同じ本をスキャンしている人が何人いるのだろうか?という事である。こういう不毛な作業は、プログラマからしてみれば、時間の浪費に思えてしょうがない。本と引換に、誰かが綺麗にスキャンしてくれた電子本と交換してくれたら、どんなに労力の削減になるだろうか?と、考えてしまうのである。DRY(Don't Repeat Yourself)原則の日本全国版といったところである。
 さて、これが許されるのであれば、実在書籍の破棄証明書を電子的に発行して、既に綺麗にスキャンされた電子本と交換するというビジネスが成立するのではないだろうか?大手の古本屋Bookoffならば、それが可能だろう。リアルな書籍を販売しながら、電子化対応本の場合には、手数料を取って、その場で書籍の破棄と電子本を行うというわけだ。持ち込みの書籍も手数料を取って、電子本と交換なんて事もできるかもしれない。
 スキャン代行業者も、こういうチャンスはあるんだろうけど、書籍を預かるだけなので手元に電子本を置くわけにはいかないのだろう。そもそも、スキャン代行の場合は、本に書き込みされた内容込みで電子化なので、ダメな場合もあるか…

電子障壁

Zinio で national geographic 誌を12ヶ月講読しようと、カ-ドまで入力したのに、あんたの地域では、この本は売れない…と、拒否されてしまった。軍事機密や技術書なら、わかるが、フラットな情報時代に、この時代錯誤感はなんだ?俺が読みたいのは、英語版だ。
アホだろ?ACMで論文だって読める時代だぞ???