MiechでYahoo!ブログのRSSが読めない / MiechでYahoo!ブログのRSSが読めない(2)

MiechでYahoo!ブログのRSSが読めない

Yahoo!ブログのRSSをMiechに登録したところ、×アイコンが出てしまいRSSを読むことができないようだ。

最初はYahoo!ブログのRSSが2.0だからMiechが対応していないのかと思ったが、Yahoo!ブログは優秀なことにRSS2.0/RSS1.0/RSS0.91の三種類を用意していたため、すべて試したが結果は同じ。

MiechでYahoo!ブログのRSSが読めない(2)

気になったのでデバッグモードで調べたところ、CAtlHttpClient::Navigateで取得に失敗している。

失敗したときの戻り値はRR_READCHUNKEDBODY_FAILED(チャンク転送エンコードされた応答の読み取りに失敗しました。)だった。

最終更新時刻: 2008年07月30日

PHP 5.0.4 install / fork / wait

PHP 5.0.4 install

pcntlモジュールを使いたかったのでついでに最新版のPHP5を落としてきてインストール。

./configure  --with-apxs2=/usr/local/apache2/bin/apxs \
             --enable-mbstring \
             --enable-zend-multibyte \
             --with-zlib \
             --enable-pcntl

fork

forkを使ったことが無いので勉強中。

PHPのpcntlモジュールは基本的にUNIXのシステムコールと同じ使い方のようなので、UNIXのシステムコールのサンプル等を見ながら。

あと、http://www.php.net/manual/ja/function.pcntl-fork.phpに投稿されているサンプルを参考に。

スタイルを変更してコメントを追記しただけでほとんど転載。

#!/usr/local/bin/php
<?php

class Process
{
    var $ident;

    function Process($ident){
        $this->ident = $ident;
    }

    function go(){
        for($i = 1; $i < 10; $i++){
            sleep(1);
            echo $this->ident . $i . "\n";
        }
    }
}

$childrenTotal = 3;
$childrenNow = 0;
$childrenNames = array( 'a', 'b', 'c' );

while($childrenNow < $childrenTotal){
    $pid = pcntl_fork();

    if($pid == -1) {
        die("error\n");
    }elseif($pid == 0){
        // 子プロセス
        $childrenNow++;
    }else{
        // 親プロセス
        $process = new Process($childrenNames[$childrenNow]);
        $process->go();
        die();
    }
}

?>

なんだけど、これって子プロセスを生成して自身はdie()して、さらにその子プロセスが子プロセスを生成して自身はdie()...ってなってるように見えるだけどそういうもの?

...
while($childrenNow < $childrenTotal){
    $pid = pcntl_fork();

    if($pid == -1) {
        die("error\n");
    }elseif($pid == 0){
        // 子プロセス
        $process = new Process($childrenNames[$childrenNow]);
        $process->go();
        die();
    }
    // 親プロセス
    $childrenNow++;
}

?>

で、いいと思うんだけど。

後、最後に子プロセスの終了を待って処理を行うようにするにはwaitすればいいのかな?

// 子プロセスの終了を待つ
pcntl_wait($status);
print("end\n");

?>

wait

さっきのwaitは子プロセス分必要だった。

// 生成した子プロセスの終了を待つ
$childrenNow = 0;

while($childrenNow < $childrenTotal){
    pcntl_wait($status, WUNTRACED);
    $childrenNow++;
}

print("end\n");

さっきのだと実行結果はこう

$ ./pcntl.php
a1
b1
c1
a2
b2
c2
...
a8
c8
b8
b9
end  <- ここで出てる
c9
a9

修正後

$ ./pcntl.php
a1
b1
c1
a2
b2
c2
...
a8
c8
b8
b9
c9
a9
end  <- ちゃんと最後に出た

無事最後にendが出た。

それから、CLI版だと出力バッファリングはないはずだけど念のため最初にob_end_flush()を入れておく。

最終更新時刻: 2008年11月09日

椅子探し / Atom / 今欲しいキーボード

椅子探し

今、アーロンチェアに腰掛けながらThinkPadで日記を書いてます。ショールームで。

コンテッサと比べてみて、すわり心地はやっぱりアーロンチェアのほうがいいかも。でもやっぱり事務椅子なので疲れないけどくつろげない。特にヘッドレストがないから眠ることはできない。

最終更新時刻: 2008年11月16日

Windows XP SP2でのWebDAVアクセス / バッテリ再生サービス / アルゴリズムの勉強中 / ユークリッドの互除法 / ファミレスに移動 / 日曜日は勉強の日 / e-typing / .procmailrc / Canon PowerShot Pro1 / IXY DIGITAL 600

アルゴリズムの勉強中

自分は今までアルゴリズムの勉強とかしたこと無かったので、今からでも勉強することにする。

一応知識としては持っていて、業務で必要であれば調べて使ったりするけどそれでは効率が悪い。一通りいつでも使える状態のほうが何かと便利だし、応用もできる。

と、去年から似たようなことを書いてる気がするが、今回きちんと集中するために図書館にきて集中して勉強することにする。

教科書として「岩波講座ソフトウェア科学3 アルゴリズムとデータ構造」を選択した。

どうでもいいけど前に座ってる人(かなり分厚い専門書を読んでいらっしゃる)から酸っぱい匂いがして敵わない。多少の体臭ならともかくこれは公害だ。ていうか気持ち悪くなってきた。

ユークリッドの互除法

アルゴリズムの基本例であるユークリッドの互除法から。

教科書ではPascalのサンプルコードなのでCで書き直した。これから暫くはこんな感じの拙いコードを日記で公開していこうと思う。かなり恥ずかしいけどこうでもしないと続けられなさそう。

/*
    • 最大公約数を求める
    • (ユークリッドの互除法)
    • /
#include "stdio.h"
#include "stdlib.h"

int gcd(int, int);

int main(int argc, char *argv[])
{
    int ans;

    if(argc < 3){
        fprintf(stderr, "input error.\n");
        return 1;
    }

    ans = gcd(atoi(argv[1]), atoi(argv[2]));

    printf("gcd = %d\n", ans);

    return 0;
}

int gcd(int m, int n)
{
    int r;

    while(r = (m % n)){
        m = n;
        n = r;
    }

    return n;
}

再帰でも書けるけど、あまりわき道にそれないように愚直に書いていく方向で。

他、今のところ(アルゴリズムと計算量の途中まで)の重要ポイント。

  • アルゴリズムの正しさは以下の2点で保証される
    1. 答えが正しいこと
    2. 計算を完了すること
  • アルゴリズムの証明の方法
    • プログラム中の特定の場所で変数の間に成立する条件式を表明(assertion)という。
    • ループ中で常に成立している表明をループ不変条件という。
    • ループ不変条件では前述の正しさの(1)を証明できる。
    • (2)は忘れがち。ていうか忘れると無限ループになったりするので気をつけること。

初心に返った気分。

Googleで見つけたユークリッドの互除法の証明とか

ファミレスに移動

図書館は夕方に追い出されたのでファミレスに移動。

タイピングの練習をしつつ雑談。

e-typingで遊んでみたところ、レベルは「Great!!」と出た。もう一度やったところ「Lighting!!」で「イナズマより速い!」とかなんとか。一応職業プログラマとしての面目は立った?

ここ最近作りたいと思ったもの(アプリ)をメモった。

日曜日は勉強の日

これから日曜日は他に予定が無ければ勉強の日とする。

忘れないうちに日曜日の持ち物をメモしておく。

勉強道具

  • 筆記用具
  • メモ帳、ノート
  • 教科書(「岩波講座ソフトウェア科学3 アルゴリズムとデータ構造」)
  • ThinkPad X31
  • Thinkpad 予備バッテリ(充電しておくのを忘れずに)

その他

  • ThinkPadのトラックポイント
  • タイピング練習ソフト
  • iPod(充電を忘れずに)
  • 図書館の利用カード
  • デジカメ(充電を忘れずに)

デジカメとタイピング練習ソフトとThinkPadのトラックポイントは今回忘れた物。

追記:高校数学の本も追加

e-typing

3回目で「Mania!!」になった。コメントは「タイピングマニアです!!」。

入力時間は52秒82。スコアは379pt。

でも歴代ランキングを見るとトップランカーのスコアは600〜700点台。遠いな。

.procmailrc

「未承諾広告※」のフィルターを追加

かなりいい加減。ちゃんと整理しないと。

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$MAILDIR/procmail.log
SENDMAIL=/usr/sbin/sendmail
TIMEOUT=60

:0 fw
| /usr/local/bin/bsfilter --pipe --insert-flag --insert-probability

:0
* ^Subject:.*\/.*
* ? echo "$MATCH" | nkf -Zme |grep '未承諾広告'
.00Spam/

:0
* ^X-Spam-Flag: YES
.00Spam/

:0
* ^X-ML-Name: cppll
.cppll/

:0
* ^Sender: owner-mfc@ml.acty-net.ne.jp
.mfc/

:0
* ^Sender: php-users-bounces@php.gr.jp
.PHP-users/

:0
* ^Sender: php-dev-bounces@php.gr.jp
.PHP-dev/

:0
* ^X-ML-Name: xyzzy
.xyzzy/

:0
* ^To: root@mylab.jp
.root/

:0
* ^Sender: pgsql-jp-admin@ml.postgresql.jp
.pgsql-jp/

:0
* ^Sender: tdiary-devel-admin@lists.sourceforge.net
.tdiary-devel/

:0 c
* < 10099
! 携帯メールアドレス

:0
$DEFAULT

参考にしたページ

http://www.jaist.ac.jp/~fjt/procmail.html

同ページより「未承諾広告※」のより厳格なパターン

# SPAM filter
# 「未承諾広告※」と書かれているメールをゴミ箱へ捨てる
:0
* ^Subject:.*iso-2022-jp
* ^Subject:.*\/.*
* ? echo "$MATCH" | nkf -meZ2 | sed 's/[[:space:]]//g' | egrep '未承諾広告※'
$MAILDIR/trash/.

Canon PowerShot Pro1

最近、別々の友人がCanonのデジカメを購入した。どちらも試用させてもらったので素人から見た感想を書く。

まずは「PowerShot Pro1」から。

Canon PowerShot Pro1 PSPRO1

スペック的には、一眼レフを除けば最近の小型お手軽志向のデジカメとは一線を画す製品だと思う。それは本体の大きさや800万画素という画素数だけでなく、フラッシュのアタッチメントが付いていることや、広角の写真も撮れるレンズ(この表現あってるのかな)がそうさせている。

友人としては「外付けのフラッシュを付けたい」というのが選択の基準になったとか。

今自分が持っているCONTAXの小型デジカメに比べて特に羨ましかったのは、近くの被写体に焦点を当てて遠くの背景をぼかす写真が撮れる事。よく知らないがこれは多分、レンズが収まってるタイプのデジカメでは難しいんだろう。

ひとつ残念だったのはファインダーが光学式でなくデジタルだったこと。つまりファインダーを除くと液晶画面があって、そこでメニューも表示できる。でもこれは通常の液晶画面でも確認できるし、ファインダーは光学式のほうが良かった。

液晶と言えば、液晶画面が独立して動くのはかなり便利。以前使っていたSONYのデジカメもそうだったんだけど、これは色んなアングルで撮影する際にとても役に立つ。

一眼レフの大きさを考えると、気軽に持ち運べる大きさで以上のようなカメラ本来の楽しみを味わうことができるこの機種は性能と手軽さをうまくトレードオフした製品だと思う。

レビューサイト

IXY DIGITAL 600

次は「IXY DIGITAL 600」。

Canon IXY DIGITAL 600 IXYD600

さっきのPro1とは別の制約の中で性能を追求した製品という印象。制約とは、Pro1とは明らかに違うそのコンパクトなスタイル。さっきの感想から引用すると「レンズが収まってるタイプのデジカメ」。かと言って「小型お手軽志向のデジカメ」というほど小さくはないし「お手軽」というのもちょっと違う。

もちろん、お手軽ではあるんだけど、それだけでなくマニュアルでの撮影もいい感じ(これは後日書く)。それに今までのCanon製デジカメに比べて起動が早いのも特徴らしい。これは実際に試してみて確かに早いと感じた。

まだ書きたいことがあるんだけど後日。

レビューサイト

最終更新時刻: 2008年10月26日

iPodのDockが欲しい / JBL on stage

iPodのDockが欲しい

購入後1ヶ月程度で飽きてしまったiPodに再び活用の機会を与えるため、まずは久しぶりに充電しようとする。

そこで改めて気が付いたんだけども、自分が購入した20GBタイプにはDockが付属していない(それを忘れて小一時間探してしまったのは内緒)。で、電源アダプタから直で繋いで充電するわけだけど、このケーブルが結構邪魔。

そこでDockの値段を調べてみたところ4500円と、まぁ衝動買いできそうな値段。

Apple M9602G/A iPod (Click Wheel)Dock

が、しかしここで余計なことを思い出す。BOSE製の「iPod用スピーカー付きクレードル」みたいなのなかったっけ?と。

Bose Export,Inc. SoundDock(サウンドドック)iPodR、iPodR mini専用サウンドシステム

充電もできるし、リモコンも使える。お店で視聴したこともあるけどいい感じだった。でもPCとの接続ができないし、何より相応のお値段。衝動買いは無理。

そこでもう少し調べたところ、スピーカーつきのDockはBOSE以外のサードパーティからも発売されている。そもそも飽きてしまった理由が「利用シーンが少ない」だったので、室内でもiPodで音楽が聴けるようになれば活用の幅も広がると思う。

というわけでスピーカー付きDockを狙うことにした。毎度のことながら「余計な理由をこじつけて無駄な買い物をしてしまう」パターンっぽいけど、今のところは考えない方向で。

JBL on stage

JBL on Stage J ONSTAGEJ HARMAN

  • 充電ができる
  • PCとの接続ができる
  • BOSEのと違ってリモコンは無い
  • 値段はApple純正Dockよりは高いけどBOSE製よりは安い

もし買うならこれ。

最終更新時刻: 2008年11月06日

図書館で勉強 / IMEツールバーの機能を呼び出すショートカットキー / データ構造 / 撮影会 / gccでC++のコンパイル / NULLを定義しているヘッダ

図書館で勉強

先日書いたとおり、日曜日なので図書館でお勉強開始。

先週と同じ「岩波講座ソフトウェア科学3 アルゴリズムとデータ構造」をメインに、近くにあった、「コンピュータ英語活用辞典」をアームレスト代わりに積んでおく。

アルゴリズムとデータ構造 (岩波講座 ソフトウェア科学 3)(石畑 清)

コンピュータ英語活用辞典(三島 浩/相磯 秀夫)

IMEツールバーの機能を呼び出すショートカットキー

Ctrl+F10

すぐ忘れるのでメモ。

http://homepage2.nifty.com/winfaq/c/ntperf.html#1376

データ構造

今日は基本的なデータ構造について勉強。

「岩波講座ソフトウェア科学3 アルゴリズムとデータ構造」で言うと「1.3 基本的データ構造」。

撮影会

昼食ついでにデジカメの撮影会。

公園を散歩しながらマクロモードを使って花などを撮影する。友人に貸りたIXY DIGITAL 600の性能の高さに驚く。

Canon IXY DIGITAL 600で撮影した写真(リサイズのみ)。黄色い花は普通のマクロ、白と紫の花はデジタルマクロを使って撮影。

IXY DIGITAL 600で撮影した写真1IXY DIGITAL 600で撮影した写真2

CONTAX SL300RT*で撮影した写真(リサイズのみ)。どちらもマクロモードを使って撮影。

SL300RT*で撮影した写真1SL300RT*で撮影した写真2

gccでC++のコンパイル

クラスにコンストラクタを実装して

gcc hoge.cpp

としたらエラーが出てコンパイルできない。

hoge.cpp: undefined reference to `vtable for Hoge'

Hogeはクラス名。

下記ページを参考に-lstdc++をつけるとコンパイルできた。

gcc hoge.cpp -lstdc++

標準ライブラリを使ってないのにstdc++が要るって言うのがよくわからないけどそういうことらしい。毎度指定するのは面倒(環境変数で解決出来る気も)だし出力ファイル名も変えたいから、Makefileを覚えて使おうかな。

NULLを定義しているヘッダ

何もインクルードしていないファイルをgccでコンパイルしたら

hoge.cpp:21: error: `NULL' undeclared (first use this function)

恥ずかしながら「NULLって処理系内部で定義されてるんじゃないの?」と思った。

そういえばどこかのヘッダーで

#define NULL 0

って定義してあった気がしなくもない。こういうときC言語をきちんと勉強してないことがばれる。K&Rを再読したほうがいいのかも。

で、どこで定義されてるのか考えてみた。stdio.hだけインクルードするコードでもNULLは使えた記憶があるので、stdio.hだろうか。と一瞬考えたがすぐに、多分stdio.hも他のヘッダーをインクルードしてるんだろうと思い直す。

調べてみたところstddef.hで定義されていることがわかった。大抵他のインクルードファイルから間接的にインクルードされるので、今まで気にしたことがなかった。

http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide50-1.html

NULL とはヘッダファイル stddef.h で定義された定数(マクロ)で,それ自体 NULLポインタ定数です。但し,NULLポインタ定数 NULL を使うには,次のヘッダファイルのいずれかを読み込むことが必要です。

stddef.h,stdio.h,stdlib.h,string.h,time.h,wchar.h
最終更新時刻: 2008年07月16日

Makefile / C++/MFCの勉強にお薦めの本 / 水泳

C++/MFCの勉強にお薦めの本

CとJavaは使える後輩に、雑談がてらC++/MFCのお薦めの本を紹介した。

といっても僕はあまり本を読まない(買うけど)ので、C++についての一冊だけしか紹介できなかった。

Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series(Scott Meyers/吉川 邦夫)

MFCについても何か薦めようと思ったのだけど、これといった良書を知らないので、必要になったらMSDNで調べればいいよ。と教えておく。

MFCを学ぶ上で前提知識として持っていてほしいのはC++の知識(これはEffective C++の範囲で十分)とWin32 APIの知識。Win32 APIのみでのプログラミング(MFC使わずにWinMainから始まるやつ)は知識としてだけでも持っているとMFCの理解に役立つ。

2ch Books ver.2 推薦図書/必読書のためのスレッド@2ch

あとは、CodeGuruとかCode Projectあたりのサンプル読めばいいんじゃないかと。

水泳

久しぶりに泳いできた。前回が2月24日だから2ヵ月半ぶり。距離はいつもどおりで1km。

最終更新時刻: 2008年12月18日

コンパイラを実装するためのメモ / 1日でわかるMFC

コンパイラを実装するためのメモ

今はまったくその予定はないけどメモ。

1日でわかるMFC

http://hp.vector.co.jp/authors/VA011804/mfc_01.htm

スレッドのサンプルがシンプルでわかりやすかった。

最終更新時刻: 2008年10月30日

Effective C++より

チームメンバーとコーディングについて話すときや、後輩の指導のときなどにEffective C++で書かれているようなことを説明することが多い。

すごく基本的なところだと

void Hoge::setName(CString name)

void Hoge::setName(const CString& name)

のが好ましいだとか、deleteするときは

if(p != NULL){
    delete p;
    p = NULL;
}

しましょうとか。

Amazonのレビューより。

本書は既に知られている通り、もはやバイブル化されつつある。 それでは何故、皆読むのか? 答えは簡単。これを読んだ人が、自分と同じ境遇に立った開発者に必ず勧めるからである。

まさにその通りだと思う。というわけで後輩に貸し出し中。

それにしても、技術書って読むだけじゃなく理解しなきゃいけないから読書の楽しみがないな。

追記:

鈴木一生さんの推薦本

http://www.issei.org/diary/_20031207/?date=20030826#p06

手元にある本

  • 「Effective C++」
  • 「Exceptional C++」
  • 「エキスパート C プログラミング - 知られざる C の深層」

手元に欲しい本

  • 「Linkers & Loaders」
  • 「Effective STL」
  • 「プログラミング言語 C++」
最終更新時刻: 2008年11月12日

はてなRSS

ここのRSSがはてなRSSに登録されているという話を聞いたんだけどリンク元には出ていない。今度久しぶりにanalogで調べてみよう。

最終更新時刻: 2008年11月06日

analogセットアップ / 図書館で勉強中 三週目

analogセットアップ

今まではWindowsクライアントにログをダウンロードして解析してたんだけど、今回Webサーバーにanalogをセットアップしてcronで動かして、Webで確認できるように設定した。

図書館で勉強中 三週目

日曜日なので図書館で勉強。

昨日、neonで遊んでて睡眠不足気味なのでアルゴリズムの勉強ははかどらず。というか図書館でもコーディングしてる。

neon HTTP and WebDAV client library

最終更新時刻: 2008年11月02日

WebDAVでスケジュール共有 / ロゴひとつで / 小物にこそ問われるセンス / 水泳

ロゴひとつで

ロゴひとつでサイトのイメージが変わる。シンプルなサイトであればあるほど、たまのちょっとした変化が新鮮だ。Googleはその好例だと思う。

小物にこそ問われるセンス

上の続き。シンプルなサイトはちょっとしたことでイメージが変わってしまう。

今日ロゴが更新されていたサイトは、毎日見てるのに「あれ?変わってるけどいつからだっけ?」と思ったくらい自然。まるで昔からそのロゴであったかのようだ。

小さなロゴ(というかバナー)でも色、大きさ、文字のバランスを見てすぐにプロの仕事だとわかる。というかこういう小物にこそセンスが光る。

全体として綺麗なページでも小さなバナーやアイコンで台無しになったり、全体は凡庸あるいは素っ気無いページでも綺麗なバナーひとつでセンスのいいページになったり。

もちろん、今日更新されていたサイトは後者。

水泳

500m。10時半からだと1kmはちょっときつい・・・。

最終更新時刻: 2008年10月23日

WebDAVクライアント

WebDAVクライアントのプロトタイプを実装中。上手くいったらちゃんと作るかも。

WebDAVクライアント

先週の金曜日夜にneonライブラリで遊んで、日曜日の勉強時間+αでなんとかリストが表示できる状態になった。(これとanalogの設定で勉強時間が潰れてしまった)

動機メモ

  • 図書館で勉強するときに自宅のWebDAVサーバーにアクセスする軽めのツールが欲しい。
  • Windows標準のDAVクライアント(WebFolder)が重すぎ/癖ありすぎ。
  • C/C++/MFC等の勉強のため。
  • アルゴリズムの勉強だけじゃつまらないので、多少なりとも役に立つツールを作りたかった。
  • neonは応用範囲広そう。

やったことメモ

  • neonライブラリのコンパイルを通す
  • neonでWebDAV機能を有効にするためにexpatライブラリをリンクする。(スタティックリンクに失敗したので、とりあえずDLLで)
  • cadaver for cygwinのソース等を参考にneonのAPIの使い方を調査。
  • mfcで適当なダイアログ作って接続。
  • BASIC認証ができることを確認。
  • とりあえず指定URIのリソース一覧を取得してリストにするようにしてみる。
  • なぜか取得に失敗。小一時間悩む。
  • リンクしていたexpatがUNICODE版ビルドであることに気づく。かなり間抜け。
  • expatをMBCS版ビルドに変更したらリストが取得できた。
  • リストコントロールに表示成功。
最終更新時刻: 2008年11月05日

WebDAVクライアント(2) / 構造体を宣言時にゼロクリア / ブログはコテハンで書くべきか、捨てハンで書くべきか / COMとpimplイディオム

WebDAVクライアント(2)

neonにopensslをリンクしてhttps通信に成功。ただしまだ証明書とか見てない。

あとはzlibをリンクして圧縮通信に対応させると、HTTPクライアントとしては十分な機能を備えることになるかな。

zlibをリンクするのは簡単そうだし、他の実装が終わったあとにでも作業する。httpsを先に試したのは後でつまづきそうだったから。

構造体を宣言時にゼロクリア

neonライブラリに下記のようなコードがあった。

struct fetch_context ctx = {0};

構造体を0クリアしているんだとわかるんだけど、よく考えてみると違和感がある。

つまり、{0}は構造体の最初のメンバーだけを初期化しているのであって、以降のメンバーは不定値なのでは?という疑問。

調べてみたところ、次のような理由によってゼロクリアされるということがわかった。

{0}は構造体を「0で埋める」ための特別な記述ではなく(当たり前なんだけど)、最初のメンバーに0で初期化するのみ。ただ、「初期化子が省略された場合に残りのメンバーを0で初期化する」という仕様((-これはあとで確信できるソースを探しておこう。K&Rに書いてあったっけ?-))のため結果として構造体全体が0で埋められるのである。

これでいちいち::ZeroMemory()とかmemset()しなくてもこの書き方で初期化できる。

こんなときに便利。

const struct hoge empty = {0};
static struct hoge empty = {0};

COMとpimplイディオム

どちらも軽く本で読んだだけだけど似てる気がする。

最終更新時刻: 2008年10月28日

構造体を宣言時にゼロクリア(2) / WebDAVバージョニング実装に関するメモ

構造体を宣言時にゼロクリア(2)

「構造体を宣言時にゼロクリア」というのはちょっと間違い。「構造体のメンバーを宣言時に0で初期化」くらいが正しかった。

昨日「これでいちいち::ZeroMemory()とかmemset()しなくてもこの書き方で初期化できる。」と書いたけど、これらの関数を使って0で埋めた場合と{0}で初期化したときでは結果は等価ではない(ように思える)。

memset()等を使った場合はパディングも含めて0クリアされる。しかし、{0}は各メンバーに0を設定するがパディングは0クリアされないと思う。

struct Hoge{
  int a;
  int b;
};
Hoge hoge_a = {0};
Hoge hoge_b;
memset(&hoge_b, 0, sizeof(hoge_b));

if(memcmp(&hoge_b, 0, sizeof(hoge_b) == 0){
   // 多分ここは通らない(VC++のデバッグモードなら通りそう)
   printf("memcmpで一致.\n");
}
if(hoge_a.a == hoge_b.a && hoge_a.b == hoge_b.b){
   // ここは通る
   printf("メンバー単位で一致.\n");
}

WebDAVバージョニング実装に関するメモ

最終更新時刻: 2008年09月02日

サーバダウン

昼過ぎから18時ごろまでwww.mylab.jpがダウン。先週も数時間落ちたし、要対策。原因は多分熱暴走。

最終更新時刻: 2008年11月04日

肥えた

今日髪を切りに行ったら「肥えた?」と聞かれた。やっぱり?確かに就職してからここ1年で不健康な生活が続いてるから太らないはずがないんだけども。

で、夜プールに行き始めたという話をしたら、それなら泳ぐ30分くらい前にパンを食べて、泳いだ後におかずを摂取するのが良いとアドバイスを受ける。

最終更新時刻: 2008年11月21日

図書館で勉強 四週目

先週に引き続いてアルゴリズムの勉強を休止してコーディングに集中。

WebDAVクライアントのテスト用にローカルでWebDAVサーバが欲しいので帰ったらローカルでApacheを立てる。

最終更新時刻: 2008年09月02日

CListCtrlの選択範囲のスタイル / CListCtrlのちらつきを抑える

CListCtrlの選択範囲のスタイル

選択範囲のスタイルはマニフェストファイル(.manifest)によって設定できるらしい。

manifestありmanifestなし

実行したアプリケーション

http://www.codeproject.com/cs/miscctrl/listviewxp.asp

XP Visual Styleの適用方法

http://www31.ocn.ne.jp/~yoshio2/vcmemo8-1.html

追記:あれ?なんか.manifest作っただけじゃだめぽ。.NET使えばいいのか、拡張スタイルの設定が必要なのか、はたまた最新のSDKが必要なのか・・・。

追記:SetExtendedStyle(LVS_EX_DOUBLEBUFFER)でできるようになった。

CListCtrlのちらつきを抑える

CListCtrlの選択範囲のスタイルが気になったのは、元々次の理由からだった。

  • リストコントロールにファイル/フォルダ一覧を表示させたところ、選択範囲が画面外にはみ出したときに発生するスクロールで項目がちらつく。(オーナーデータを使っているせいか?)
  • おそらくリストコントロールを使っているであろうエクスプローラの画面ではちらつかない上に選択範囲がなんかかっこいい。

で、LVS_EX_DOUBLEBUFFERを使ったところ、ちらつき問題と選択範囲のスタイルが両方とも解決した。

ちなみにhttp://www.codeproject.com/cs/miscctrl/listviewxp.aspによると

In Windows XP, there is an extended-style called LVS_EX_DOUBLEBUFFER. This is what we want. Unfortunately it is only available for Common Controls version 6, which means we need Windows XP as well as a manifest file (or embedded resource). Additionally there is a style called LVS_EX_BORDERSELECT which tells the ListView (in Large Icon mode) to highlight the border of the icon rather than to paint over it (This is available with Common Controls version 4.71, so this will work without XP).

らしいので、残念ながらWindows XP以降でしか使えない上にmanifestファイルは結局必要となる。

LVS_EX_BORDERSELECTはXPでなくても動くようだけど、今は特に必要ないかも。

最終更新時刻: 2008年06月10日


Excelファイルをショートカットメニューから読み取り専用で開く / blogWatcher / 巨大なファイルを扱う

Excelファイルをショートカットメニューから読み取り専用で開く

http://www.moreexcellent.com/excel/tips/readonly.htm

Excel XPで説明されてるけどExcel 2000でも使える。

フォルダオプションから.xlsに対するアクションに「読み取り専用で開く」を追加。アクションを実行するアプリケーションに下記コマンドを設定する。

"C:\Program Files\Microsoft Office\Office\EXCEL.EXE" /e /r "%1"

パスは環境による。キモとなるのは/rオプション(おそらくreadonlyのr)。

多分他のOfficeアプリケーションでも使える。

巨大なファイルを扱う

Win32ならばCreateFileMappingを使ってファイルマップドオブジェクトを作るとか。

いろいろ制限もあるので注意。

最終更新時刻: 2008年10月29日

ベクトルグラフィックライブラリ / Macro to initialize GDI+ in VC6.0 MFC projects / 自分にとってプログラミングとは

ベクトルグラフィックライブラリ

  • Cairo

同じくMozillaのSVG実装で使われているものとしてlibartもある。

Macro to initialize GDI+ in VC6.0 MFC projects

http://www.codeproject.com/vcpp/gdiplus/vc6gdiplusmacro.asp

自分にとってプログラミングとは

職業プログラマーになってちょうど1年。自分にとってのプログラミングをメモ。

趣味でそれを行うときは目的を達成するための手段。昔はコーディングそのものが楽しかった時期もあったけど最近そういうのはあまりない。ゲームプログラミングは後者の色が強いかも。

プログラマーでないときに仕事でプログラミングするときは前者。仕事を効率よく進めるためにプログラミングする。

職業としてプログラミングをするときは、プログラミングそのものが仕事であり目的。

最終更新時刻: 2008年08月30日

ファイル選択ダイアログで落ちる / ファイル選択ダイアログで落ちる(2) / ファイル選択ダイアログで落ちる(3) / ファイル選択ダイアログで落ちる(4) / 日本語の作文技術

2011.6.9追記:

結論から書くと、アプリケーション中で一回CoInitialize(NULL);を実行しておけば良いです。

ファイル選択ダイアログで落ちる

ダイアログにボタンを置いてファイル選択ダイアログ(CFileDialog)を表示させる。これを2回繰り返しただけで落ちる現象に悩まされている。

再現手順はこう。

  • ダイアログ上のファイル選択ダイアログを開く。
  • ファイル選択ダイアログのファイル(フォルダでは再現しない)上にマウスカーソルを持っていきツールチップを表示させる。
  • キャンセルしてダイアログを閉じる
  • 再度ファイル選択ダイアログを開きマウスーカーソルをファイルの上に持っていくとツールチップが表示…されずに落ちる。

表示しているファイルも、デスクトップでは出るが他のフォルダでは再現しない。

Release版だとエラーメッセージすら出ない。デバッグ版では次のメッセージが出る。「ハンドルされていない例外はhoge.exe(SHELL32.DLL)にあります:0x0000005: Access Violation。」

最初はOPENFILENAME構造体の違いで発生するのかと思ったが、微妙。

SHELL32.DLLで出るということはシェル拡張アプリケーションがファイルの情報を表示するときに例外を発生させているのかとも思えたり。もしそうだとしたらクリーンな環境のPCでは再現しない可能性がある。帰ったら試してみる。

困ったことに自分で作っているアプリでなくても発生する。やっぱりThinkPadの環境が腐ってきたのかも。

次に身の回りのツールで検証してみた。

  • putty 0.54の設定画面で発生。ソースを見るとdswがあるのでVisual C++ 6.0以前を使っているっぽい。MFCは見当たらず、APIのみで表示しているのではないだろうか。
  • Wake up On Lan tool ver.1.93で発生。
  • WWWCでは発生せず。開発環境はおそらくVisual C++ 6.0。ただしMFCを使わずAPIのみ。
  • TortoiseSVNでは発生せず。開発環境はVS.NETとMFC。
  • xyzzyでは発生せず。開発環境はVC++6.0以前と思われる。MFCは使わずAPIのみ。

ファイル選択ダイアログで落ちる(2)

ス切りボでも発生せず。ス切りボはVC++6.0とMFCでビルドされているがファイル選択ダイアログはAPIで表示している。(GetOpenFileName)

TortoiseSVNは全体的にMFCを使っているがファイル選択はAPIを使っていた。

どうも、APIを使った場合は落ちないらしい。それではMFCを使っていないであろうputtyは?というと、よく見たらGtkを使っているので、また状況が違う。

それでは、codeproject等に登録されているCFileDialog代替クラスは大丈夫なのではないだろうか。OPENFILENAME構造体のサイズも意識しているものもあるし。(この構造体が原因かどうかはわからないけど)

比較的シンプル。が、落ちた。ちなみにこいつはダイアログベースではない。

OSの自動検出までできるっぽい。が、落ちた。

これも比較的シンプル。でも落ちた。

ボタンの位置とかずれまくり。が、落ちない。

まだそれぞれのコードは見てないので原因は不明。

ファイル選択ダイアログで落ちる(3)

おとなしくファイルオープンだけAPIで書くか。本当はもうMFCごと捨てたいけど。

そもそも原因がThinkPadの環境(インストールしているシェル拡張アプリ)とか、Windowsのバグとかいろいろ考えられるがそんなことはどうでもよく、問題なのは落ちるアプリと落ちないアプリがあるってことだ。一律落ちるならこんなことに時間をかけないで諦める。

API使ってもひょっとして落ちないだけでリソースを食いつぶしてるのかもしれないけど、それはそれ、これはこれだ(なげやり)。もしそうだとしてもそれはアプリケーション側で対処するのは難しいと思う。それにファイルダイアログごときにこれ以上時間をかけるわけにもいかない。

追記:miechは大丈夫だった。CFileDialog使ってるのになんで?と思ったら、WTLのCFileDialogだった。WTLヽ(´ー`)ノマンセー(本当は.NETだからなのかも)

さらに追記:VC.NET 2003(MFC7.0だっけ?)のCFileDialogでも落ちた。

ファイル選択ダイアログで落ちる(4)

やっぱりというかなんと言うか、家のデスクトップ(Windows XP SP2)では落ちない。

OSは開発環境であるThinkPadと同じWindows XP SP2なので後はインストールされているソフトウェア、特にシェル関連のソフトが怪しい。

というわけでデスクトップに無く、ThinkPadにインストールされているソフトをShellに近いものから入れていく。

まずはTortoiseSVNをインストール。再現せず。次にTortoiseCVSとAdobe Reader 7.0。ビンゴ、再現した。AdobeReader 7.0をアンインストール。再現せず。こいつかYO!!確か7.1アップデータが出てたはず、入れてみるが再現する。

念のためThinkPadのAdobe Reader 7.0を削除すると、落ちなくなった。決定的。Adobe Readerだけのバグではなく、複合的な要因によるものかもしれないけど、とりあえずAdobe Reader 7.0を入れてない状態では落ちないことが確認できた。

ちなみにAdobe Readerを疑ったのはファイル選択ダイアログのファイルにカーソルを当てたときにデバッグウインドウに次のメッセージが出たから。

'C:\Program Files\Adobe\Acrobat 7.0\ActiveX\pdfshell.dll' をロードしました、
合致するシンボル情報は見つかりませんでした。

あぁ、シェルに居るのか。と。もちろん他にもいろいろ居るんだけど(zipを解凍するためのDLLもちょっと疑った)ひときわ目立った。

けどやっぱり気になるのは「すべてのアプリケーションで落ちるわけではない」ということ。しかも今APIで(落ちないアプリと同じように)作ったのに落ちるし…。API使ってるはずのFFFTPも落ちるし…。あ、メモ帳も落ちた。もう嫌になってきた。

最終更新時刻: 2011年06月09日

ファイル選択ダイアログで落ちる(5) 中間報告 / ファイル選択ダイアログで落ちる(6) / ファイル選択ダイアログで落ちる(7) / GDI+ / MFCでOpenGL

ファイル選択ダイアログで落ちる(5) 中間報告

身の回りのPC4台共で現象が再現した。が、どのマシンも自分が常用しているマシンであるため環境が似通りすぎていてあまり検証にならない。しかもAPI(GetOpenFileName)かMFC(CFileDialog)も関係ないみたい。manifestの有無(comctl32.dllのバージョン)でもないみたいだし、使用したSDKの違いでもなさげ。

再現したPCに共通する項目を挙げてみる

  • Windows XP SP2
  • Adobe Reader 7.0 を導入している
  • 関係ないと思うけど、フォルダオプションはちょっと弄ってる(拡張子を表示するとか縮小版をキャッシュしない、など)

それ以外はほぼインストールしたままの状態の放置マシンから、開発環境やらいろいろ入ってる現役マシンまであるので(ソフトウェア的に)共通する項目が見当たらない。ハードウェア的にはPentium3からPentium4(HT対応)まで世代が散らばってるので(Intel CPUに偏ってるけど)原因とは考えにくい。

メモ帳による再現方法を。

  • メモ帳を起動
  • メニューの「ファイル」-「開く」でファイル選択ダイアログを開く
  • デスクトップ上のアイコンにマウスカーソルを持っていきツールチップを表示させる。このときアイコンはフォルダでは再現しない。また、*.exeでも再現しにくい。とりあえず*.txtとか*.zipとかで再現した。
  • キャンセルして一旦ファイル選択ダイアログを閉じる。
  • 再度同じ手順でファイル選択ダイアログを開きデスクトップ上のアイコンのツールチップを表示させようとすると落ちる。

同じ環境/違う環境で試された方は、ぜひ「再現した/しない」のツッコミ入れてください。その際、環境(OS/Adobe Readerのバージョン他)も書いてもらえるとより参考になります。

ファイル選択ダイアログで落ちる(6)

デバッグモードで実行すると、常にcall命令が発行されるところで落ちている。で、callする値を見ると確かに不正なアドレスを示しているんだけども、その先まで辿っていくのは自分のスキルを考えるとコスト高すぎ。

callするまえにレジスタを退避してるっぽいとかはなんとなくわかるんだけど、落ちる理由と対策まで探るのはムリポ。

けどこういうときのためにもアセンブリ言語は習得しておきたい。

追記:常にcall命令が発行されてるところというわけでもなさげ。ソースによって位置が違う。「落ちないアプリ」は破壊される領域がたまたま安全な領域というだけなのかも。

ファイル選択ダイアログで落ちる(7)

同じ現象が発生してる方ハケーン!

最後のURLから引用させてもらう。

この件は、Adobe Reader 6.0/7.0でインストールされるpdfshell.dll(通常はC:\Program Files\Adobe\Acrobat 7.0\ActiveX\pdfshell.dll)によるアクセス違反らしい。確かに、そのファイルを一時的に他に移すと、メモ帳が異常終了することはなくなった。

Adobeにも報告されたようなので、対応されることを祈りつつ下記コマンドを発行してpdfshell.dllに消えてもらう。

regsvr32 /u "C:\Program Files\Adobe\Acrobat 7.0\ActiveX\PDFShell.dll"

http://www.geocities.co.jp/SiliconValley-PaloAlto/5936/customize/unwished.html

追記:せっかくアンレジストしたのに次にReaderを起動したときに復元されてしまった・・・。アンインストールするしかないのかな。

それにしてもオンラインアップデートを確認すると「Adobe Acrobat 7.0.1およびReader 7.0.1アップデート」のステータスが「インストールされています」なのに「Adobe Readerについて」でバージョンを確認すると「バージョン 7.0.0」になっているのも少し気になる。

最終更新時刻: 2009年01月20日