PC関係のメモ
M88のソースを眺める / 進歩無し / [buy][book] C Magazine 2004年8月号
M88のソースを眺める
ciscさんが書いたM88(PC-8801エミュレータ)のソースコードを眺める。レベルが高く、良質なコードだ。
中で何やってるかまでは理解できないので、主に*.hを本当に「眺めて」いただけ。
進歩無し
7月30日の「ユーザビリティーの低いページをユーザが直す」のエントリを読んでから、長年日記を見てみた。去年は「駄目なサイト」に関するメモが書いてある・・・。
進歩がないどころか今年は前向きさがなくなってる分たちが悪い。とはいえもうWebサイト作る仕事でもなくなってしまったのでユーザとして使いにくいサイトに文句をたれてるだけなんだけど。(よけいに悪い)
C Magazine 2004年8月号
Excelで元データ作り
PDFの仕様書を読んで、条件その他をExcelにリスト化した。
それをコピーしてエディタに貼り付け、タブをカンマに変換してCSVファイルっぽくして保存する。そのファイルをPHPスクリプトでCのソース(データの初期化)として生成した。
あとはExcelファイルのほうをちょっと加工して仕様書に添付する予定。これで仕様書とソースの整合性が取れる。
課題としては、
- CSVからCのソースを生成するツールは汎用的にしたい。
- 単純な文字列操作なのでPHPではなくperlで作り直したい。
- CSVから仕様書に添付するための小奇麗なExcelファイルを生成したい。
- CSVからCのソースを生成するときにタブで整形するのが面倒でやらなかった。
所感
- 今回は規模が小さかったので自前で済ませたが、データから仕様書とソースを生成するノウハウ/ツールは探せばいろいろありそう。
- ソースから仕様書を生成するツール(DoxygenとかHotなんとか)は一般的。
今日も仕様書作り / 缶コーヒー飲みすぎ注意 / コーディング禁断症状
今日も仕様書作り
今日は一日仕様書作り。開発言語は日本語です。
最初はパターンを覚えなきゃいけないから大変。
缶コーヒー飲みすぎ注意
3本が限界。特に組み合わせが危険。
どうも自分には缶コーヒーが合わないらしく、飲みすぎると吐き気がする。飲みすぎ注意。
コーディング禁断症状
ひたすら仕様書書いてると、無性にコードが書きたくなってくる。ので、たまにコードを書きつつ作業をすすめる。
咳 / Tar32.dllを使う / フローを書く / tar+compress圧縮してFTP転送 / [todo] テンポラリディレクトリに対するイメージ / のど飴
咳
熱があるわけではなく、単に咳が出る。免疫力が低下してると思われ。
追記:のどが痛くて会話に支障が・・・。盆休み明けなのに、休み前より弱ってるという罠。
Tar32.dllを使う
ファイルを圧縮してUNIX機へFTP転送する部分を作成中。圧縮形式はgzip or compressを使いたいのでTar32.dllを使うことにした。
で、ふと思ったんだけど最近のFTPサーバならサーバからクライアントへのダウンロードのときに圧縮しながら転送できたとはずだけど(うろ覚え)、逆にアップロードでは可能なのかな?もちろん、どちらにしてもクライアントとサーバの両方で対応してなきゃいけないだろうけど。
HTTP/1.1の圧縮転送みたいにRFC等で規格化されてればそれに準拠したいが、ちょっと探した限りでは無いっぽい。
フローを書く
めずらしくコーディング前にきちんとフローを書いた。使用ツールはExcel。
フローができてしまえばあとはガッとコーディングするだけなので結果的に楽だ。案の定、フロー書いてるといくつか気になる点とか、推敲すべき点が出てきた。良かった、ちゃんと書いて。
tar+compress圧縮してFTP転送
VC++でやると手っ取り早そうなのは、前述のTar32.dllを使って圧縮して、MFCのCFtpConnectionクラスを使ってFTP転送する方法。
これだけなら問題ないけど、転送するファイルの条件等が複雑だからそっちが大変。そういえば、一旦圧縮するわけだけどテンポラリディレクトリって使ったこと無かった。そこもちょっと心配なので調べておこう。
テンポラリディレクトリに対するイメージ
Linuxなら/tmp、最近のWindowsならC:\Document and Settings\user\Local Settings\Tempになるんだろうか?
OSが適当なときにガベージコレクトするのか、それともアプリケーション側で削除するのか。多分後者だろうけど、それだと行儀の悪いアプリを入れたときに消えてくれないから前者もやってるのかな。
Windowsの場合はシェルAPIでテンポラリディレクトリが取得できそう。Linuxなんかでは各ツールのconfファイルで指定してることがある。
と、適当に書き散らしておいて後で調べる予定。
のど飴
喉が痛いのが一向に直らないのでカンロの梅のど飴を試してみた。結果、最初のうちは気休めになった。けどすぐに利かなくなった。というか、食べ過ぎると太りそうなのでやめた。
帰ったら温かい梅酒(我が家の風邪薬)飲んで寝よう。
以前作ったシステム / システムに新機能追加 / 関数ポインタ / 咳が止まらない
以前作ったシステム
前の会社で作ったシステムは、聞くところによると僕が居なくなった時(2ヵ月半前)のまま大きなトラブルもなく動き続けているらしい。
現在は(多分)3つ程度のシステムが稼動しており、それぞれが小さなシステムではあるが、それをさらに小さなツールに分けている。データの更新、表示等が干渉しない別々のプログラムとして動いているのでトラブル時も問題の切り分けがしやすい(はず)。
また、それらのツールを別々のサーバに配しているのでサーバメンテ/リプレースも行いやすい(はず)。
さらにそれぞれのサーバの信頼性と目的にあわせてツールをおいているので、末端が止まっても致命傷になりにくい(はず)。
もちろん、小さなトラブルはある。だけどいろんな人に支えられてるので安心だ。もちろん、僕もできる限りのサポートをしていきたい。
システムに新機能追加
書きたいこととかなりずれた。
こないだ飲んだときに「前やってたアノ機能を復活できん?」と聞かれてたことについて書くつもりだったのだ。
結論から言うとあのままじゃ実用に耐えない機能なんだけど。
で、今僕の手元にあるアーカイブが辞める3ヶ月前のソース。確かにそこにはアノ機能が含まれてるけど、これそのまま送ったら今の担当者に殴られそうだなぁ。8割がたできてるけど、ボツになったから完成はしてなかったりする。保留。
関数ポインタ
まだ実際に使う機会がないんだけど、多分呼び出す関数を動的に決定したいときに使うんだろう。用途としてはPHPの可変関数と同じかな?
咳が止まらない
単に喉が痛くて咳が出るだけなんだけど会話に支障が出るし、咳ばっかりしてると印象がよろしくない。
こういうときはあれだ、泳ぎにいきたい。そういえば、ここ2ヶ月で2回しか泳いでないな。
レコードのジャケット作り(2) / Illustrator CSを使ってみて / RSS Banditの新機能 / CFileFindで使えるワイルドカード
レコードのジャケット作り(2)
先日依頼主の友人が家に来て、画面を見ながらデザインを決定した。やっぱり共同作業でわいわいやると早いし楽しい。
あとは僕が入稿用のデータに起こすだけという状況。
- 文字の修正
- 3色刷りのデータを単色ごとのデータに分ける。&Pantoneで色指定。
- アウトライン化
- 一部リンク画像を仮でpsd形式でやってた部分を修正。
- Illustrator CSで作ったので8.0形式で保存しなおし。
- その他DTP的な作業。
といったところ。
Illustrator CSを使ってみて
今回多分初めてIllustrator CSを使ったけど、印刷のインターフェースが直感的で良かった。最初は戸惑ったけど。
あとCSからの機能ではないかもしれないけど便利だったのが、リンクされたEPSの高解像度プレビュー。デフォルトだと低解像度プレビューだ。メニューの「編集」-「環境設定」-「ファイル管理・クリップボード」の「リンクされたEPSに低解像度の表示画像(プレビュー)を使用」のチェックをはずしてやればOK。
RSS Banditの新機能
http://www.masahiko.info/it/archives/000399.htmlより
「dasBlogのブログ」「FTPサーバー」「ネットワーク上の共有ファイル」などのリモート・ストアレージにRSSフィードのリストを格納できるようになりました。
実際入れてみたらWebDAVに対応してる!まさにこの機能が欲しかった!
CFileFindで使えるワイルドカード
CFileFindに限らずWindowsで使えるワイルドカード全般にいえることだと思うけど、UNIXのワイルドカードに比べてかなり貧弱だといまさら気づいた。
- 「[0-9]」とかは無理で「*」「?」しか使えない。
- ディレクトリをまたぐ指定も無理(c:\hoge\*\*.txtみたいな)。
時間ができたらUNIX並みのワイルドカード展開やってくれるライブラリを探そう。さらに時間があったら自分で作る。
情報処理技術者試験申込み / RSS Bandit のRemote Storage機能を使う
情報処理技術者試験申込み
今年は情報セキュリティアドミニストレータ試験を受験することにした。
RSS Bandit のRemote Storage機能を使う
常々RSSリーダーに登録するサイトリストをWebDAVなんかで共有できないかと考えていたところ、RSS Banditにどんぴしゃと思われる機能が実装されてた。
というわけで急遽WebDAVサーバを立ち上げて、このRemote Storage機能を試した。
SharpReaderからExportしたOPMLをRSS BanditにImportした。無事動くことを確認する。「Tools」-「Options」-「Remote Storage」にWebDAVサーバ接続情報(URL、ユーザ、パスワード)を設定して「Tools」-「Upload Feeds」を選択する。そうするとWebDAVサーバ上にzipで固めたxmlファイルがアップロードされた。
別のPCにも同じRemote Storage設定をして「Tools」-「Download Feeds」すると、同じFeedsが見れる。すばらしい。
最近自宅でもノートとデスクトップで同期を取るのが面倒になってたのでこれは非常に助かる。SharpReaderから乗り換え決定。
欲を言うと、新しいFeedを追加したときにサーバ上の情報も更新されるとか、自動で同期を取ってほしい。ってオープンソースなんだから自分で実装すればいいんだけども。
RSS Bandit 2日目
使い始めて二日目。いろいろ気になる点というか使いづらい点がある。これまで2度ほどSharpReaderから乗り換えようと思って挫折してるのは、な〜んか合わないからなんだろう。
気になる点いくつか
- デザインが好みじゃない。
- カテゴリを選択するたびにFeedのリストが更新されるのがうっとおしい。
- サブカテゴリのFeedが表示されない。
- Feedを追加したときなどRemote Storageを自動で更新してほしい。またはそのオプションがほしい。
- FeedをクリックしたときにRSSのDescriptionじゃなくてページを表示してほしい。
未来像 / tDiary 2.00を入れた
未来像
いろいろなことを話した結果、今後の目標は「25歳の俺はシャア」ということに。<酔っ払い
あと、明日(すでに今日)24時間テレビだ。チェックせねば。
tDiary 2.00を入れた
このメモに使ってるtDiaryを1.5.7から最新版の2.0.0にバージョンアップした。
メジャーアップデートの目玉と思われる「狭義のウェブログツール三種の神器」はすでに入れてたから、今のところ目立った変化は感じられない。
と、思ったら吐き出すRDFのフォーマットが若干変わってるかな?
tar.Zを作る / Tar32.DLLでDumping objects / MonaOS作者さんの日記
tar.Zを作る
Tar32.DLLを使ってtar.Zを作ろうと思ったいたらcompress圧縮はLZWアルゴリズムを使っていて特許問題のため展開のみで圧縮がサポートされていなかった。
幸い(?)LZWの特許自体は6月に期限切れになっているので自前でコードを書くことにした。
Tar32.DLLでDumping objects
デバッグモードでビルドして実行したらデバッグウインドウにメモリの内容がダンプされたのでメモリリークしてるんじゃないかとはらはらしたが、ソースを追いかけてみるとデバッグ用の出力でメモリリークじゃなくて一安心。
tar32api.cppのTar関数内の以下の個所
_CrtMemCheckpoint(&memstate); ret = tar_cmd(_hwnd,_szCmdLine,_szOutput,_dwSize); _CrtMemDumpAllObjectsSince(&memstate); // check memoryleaks. // (the first time call happen memory-leak becaus of C/C++ runtime.)
レスポンスファイルを使って圧縮 / テンポラリファイル
レスポンスファイルを使って圧縮
テンポラリファイル
- テンポラリファイルはOSが消してくれるわけではないらしい。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_FILETemp.html
Debianにqmail導入 / ジャケット完成
Debianにqmail導入
qmail-srcを使った。
ジャケット完成
今日最後の修正を終えて入稿データを渡した。
まずは試し刷りをするらしい。緊張する。
grep結果からジャンプ / [xyzzy] xyzzyの正規表現 / メールサーバ構築中
grep結果からジャンプ
F10キーでジャンプできる。
xyzzyの正規表現
http://terai.s55.xrea.com/index.php?xyzzy#content_1_21より
Perl風の正規表現ではなく、Lisp風の正規表現なので...<中略>...例えばグループ化の参照には、"$1"ではなく、"\1"を使います。
メールサーバ構築中
今のメールサーバをリプレースする予定。現状の問題点。
- ハードウェアの老朽化(というかもともと古い)のため音がうるさい。(一番の理由)
- POP3なのであちこちのマシンにメールが散らばっている。
- 最近のセキュリティ機能に未対応。
計画。
- 今より静かなマシンで動かす。静音のHDDに換装済みのIBM PC300GLを使用する予定。
- IMAPを使って一元管理。
- 比較的新しいセキュリティ機能を使いたい。(IMAPS、SMTPSみたいな)
Debian Linuxとqmailを使う予定だったが、そもそもDebianとqmailの相性が良くない。そしてqmailが標準では当然のごとくSMTP-AUTH等のセキュリティ機能に対応していない。今回POP3を使うかどうか未定なのでPOP before SMTPではなくSMTP-AUTHを使おうと思っていたのに。
もう少し要件をまとめてから、OSとMTAを検討しようかな。
OSの選択肢としては
- Debian Linux
- Fedora Core
- FreeBSD
好みで言うとメールサーバにはFreeBSDが合っている気がする。けど僕が慣れていないのでたぶん使わない。
MTAの候補としては
- qmail
- postfix
- exim
あたり。これまた好みでいくとqmailがいい。慣れているし。バーチャルドメイン使わないからvpopmailは使うかどうか未定。
IMAPサーバにはCourier-IMAPを使う予定。
メールサーバを構築中(2) / IMAP before SMTP / 調査中に見つけたページ / netqmail インストールメモ / Courier-IMAP 3.07 をインストール / すごい環境 / C++でBase64 / MFCで文字列が数値かどうかのチェック
メールサーバを構築中(2)
Fedora Core 2 をインストールした。昨日からDebian LinuxとFedora Coreを合わせて5回以上入れなおしてる気がする。
MTAにはqmailにパッチを合わせたnetqmailを使う。
IMAP before SMTP
IMAPを使うときはSMTP-AUTH使うしかないと思ってたらちゃんとIMAP before SMTPなんてのがあった。手軽そうなのでこれ使おう。
調査中に見つけたページ
netqmail インストールメモ
sendmail のサービスを止める(自動起動も切る)
/etc/init.d/sendmail stop chkconfig --del sendmail
ダミーのシェルを追加
vi /etc/shells /bin/false
ユーザの作成
mkdir /var/qmail groupadd -g 81 nofiles useradd -u 81 -g nofiles -d /var/qmail/alias -s /bin/false alias useradd -u 82 -g nofiles -d /var/qmail -s /bin/false qmaild useradd -u 83 -g nofiles -d /var/qmail -s /bin/false qmaill useradd -u 84 -g nofiles -d /var/qmail -s /bin/false qmailp groupadd -g 82 qmail useradd -u 85 -g qmail -d /var/qmail -s /bin/false qmailq useradd -u 86 -g qmail -d /var/qmail -s /bin/false qmailr useradd -u 87 -g qmail -d /var/qmail -s /bin/false qmails
展開してパッチをあててコンパイルしてインストール。
tar xvfz netqmail-1.05.tar.gz cd netqmail-1.05 ./collate.sh cd netqmail-1.05 make setup check
設定ファイルをコピー
./config-fast example.com
起動スクリプトをコピー
cp /var/qmail/boot/home /var/qmail/rc
sendmailを置換
rm /usr/sbin/sendmail ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
Courier-IMAP 3.07 をインストール
SSLに対応させるためにOpenSSLを入れた。
openssl-0.9.7d.tar.gz cd openssl-0.9.7d ./config make make test make install
OpenSSLはこれだけ。あとはIMAP側がうまく検出してくれる。
今ふと思ったんだけど、RPMでもOpenSSLが入ってる(rpm -qa|grep opensslで確認したらご丁寧にopenssl-develも入ってた)。どっちが使われたかわからない・・・。
次はCourier-IMAPのインストール。眠かったので適当。
tar xvfj courier-imap-3.0.7.tar.bz2 cd courier-imap-3.0.7 ./configure --enable-unicode make make install make install-configure
makeまでは一般ユーザで行った。(rootだとエラーになる)
PAMで認証させると無事接続できたがSSL接続だと失敗する。鍵の作成をミスってる模様。(/var/log/maillogにエラー出てた)
以下覚えがき
- --enable-unicodeって必要?
- OpenSSLの脆弱性が見つかるたびにコンパイルするの?
- Debian LinuxのBackportsにCourier-IMAPのパッケージがある?あればそれ使ったほうが楽そう。
- でもパッケージのだとIMAP before SMTPとかできるのかなぁ。あまり弄りたくないし。
寝る。
MFCで文字列が数値かどうかのチェック
http://mtakahashi.com/old/a6500.htmlのA6479より
// strにチェック前文字列が入っています。
CString res = str.SpanIncluding("0123456789");
if(res == str){
AfxMessageBox(_T("これは数字なり〜"));
}
SpanIncludingに渡す値を"0123456789ABCDEF"にすれば16進数かどうかもチェックできる。


_ hajime [ツッコミメールのテスト]
_ hajime [送信先を変更してさらにテスト。]