プログラミング雑談

もくじ
メインページに戻る

VS2008 Express Editionで遊ぶ

最近はWindowsのプログラムも書いて遊んでいます。
昔々Visual C++ 5.0を買ったことがあり、チュートリアル本を見ながらWindowsのプログラミングの勉強をしたことがありますし、MFCで簡単なプログラムを書いたこともあります。でもWindowsのアプリケーション開発を職業にしているわけでもないのでほぼ素人です。
いわゆるNetBookでしたっけ。安いノートPCを買ってVisual Studio 2008 Express EditionのVC++をインストールして、無料の環境でどこまで作れるのか身をもって実験しています。
とりあえず外付けモニタを使わないとはかどりません。SDKのドキュメントを表示しながらVisual Studioのエディタ画面(?)に関数を書こうにも画面が狭すぎてSDKのドキュメントを参照できません。
でも外付けモニタさえつけてしまえば結構使えます。
面倒な事を考えたく無かったのでSTLも使っています。まだstringとかwstringとかしか使っていませんが、一から処理を書かなくてもよいので楽ですね。
一応アプリケーションとして当たり前のことを実現しようとするといろいろな事をやらなくてはならないのですね。普通にテキストエディタで書いたファイルを読み込んで処理しようとするとcharからwchar_t への変換が必要になったり、前回の設定を復元するためにiniファイルにアクセスしたり。
作っているのはちっちゃいプログラムなんです。年賀状の宛名印刷です。凝ったことは何もしないで、CSVファイルの住所録を読み込んで印刷するだけ。世間にフリーソフトがたくさんあるのは知っています。私も過去3年くらい使っています。えと、作ることに意義があるということで。
今の感じだと当初作りたかったものが出来上がるとリソースを除いて100KB位のexeになるんだろうな。

2008年11月07日 プログラミング雑談

作りたいアプリはあるけど構想中

プログラミングの勉強がてらWindowsで私専用のwebページ作成アプリを書いてみようかなと思い始めてかれこれ半年。年末に年賀状宛名印刷ソフトを作って、完成しないまま無理やり宛名だけ印刷できたところで時間切れ。webページ作成アプリはどんなアプリを作れば便利なのか構想すら曖昧なままだったりして。

2009年01月17日 プログラミング雑談

連休中はプログラムのひとつも書けるかな

5月の大型連休の間に何かプログラムでも書きたいなぁと思う今日この頃。
去年、年賀状印刷プログラムが作りかけなので完成させたいところですが、まとまった時間が取れそうにありません。プログラミング関連では「Advanced Windows Debugging」など読んでいるのでLeakDiag.exeとかをいじってみたり。LeakDiagってautodiag.iniをきちんと書けばアプリの起動から終了までのリークが検出できそうな雰囲気なのですが、どうしてもアプリの立ち上げでSleep()して、その隙にLeakDiagを設定しなくてはならない感じ。無料で入手できるツールでリークの発生するGlobalAllocの行が特定できるのは実にありがたいので、活用したいのですが・・・・。
わけあってWindows Mobileのプログラミングも調べ始めました。古いバージョンのWindows CE向けの開発ツールは無料で入手できるそうで。Win32のサブセットが使えるのかな。WILLCOMのPHSであるところのzero3[es]を使っていますが、最近はフルキーボードは外付けでよいから厚ぼったい筐体をスマートにできないものかと思ったり。NTTドコモのケータイも家にあるけど、ケータイにはフルキーボードを接続できないのでiモードのメールで長い文章を書こうという気にならないし。あ、違った。キーボードの話題ではなかった。zero3[es]にキーボードをつないで、このページを更新するのも良いなと思ったもので、簡単webページ作成ソフトとか作れたら面白いだろうなと。まだCEのプログラミングに入門すらしていないのでたぶん実現しないのですけど。
まずWindows上で実現させたいなぁ。ブログなら自動でできてしまうようなことを全て手動でhtmlを書いていると、時々文章を書くことすら面倒になってくることがあるんだよね。

2009年05月03日 プログラミング雑談

サイトリニューアル(どこが?)

しばらく更新していませんでしたが生きています。
ADSLをフレッツからイーアクセスに切り替えて、最悪2週間くらいアクセスできなくなるかなと思いましたが意外とすぐに切り替え工事が済んで、結局一晩使えなかっただけでした。
これで毎月の通信費が3,000円近く安くなるはず。
そういえば、今はメールのためにWILLCOMのPHSを使っているけれど、ドコモ携帯電話もメールの利用料が基本料金に含まれるコースができるのでWILLCOMを解約するという手もアリになってきたんですよね。そうすると2,900円位通信費がまた安くできる・・・かも。ドコモのiモードはパケ放題にしてもパケット料金0.08円と馬鹿高だけど、WILLCOMはパケ割にすると0.01円位だからパケットをたくさん使うならWILLCOMが断然安いという利点はまだあるのだけれど、私ってパケット使わないからなぁ。

さてさて、話がそれましたが、表題の「サイトリニューアル」は別にADSLを切り替えたことではなくて、このページの作成環境を切り替えていました。
ということで、このページを作るだけのためのプログラムを書いていました。Windowsベースのコンソールアプリです。そういうプログラムを作りたいなぁと思い始めて1年、具体的にどう作ろうか考え始めて3日。まだ構想の1割もできていないのですが、完成までがんばっちゃうと年内の更新はなくなってしまうので、試運転がてら。
見た目はぜんぜん変わっていませんが、多分左側に見えているカレンダーとカテゴリーのリンクは自動生成になりました。まだカレンダーにリンクをつけるのは手作業なので、この部分は今後の実装。
構想としては「これより古い独り言」のページを自動生成したいんだけどなぁ。これも後日。

2009年11月03日 プログラミング雑談

Test Firstでなくてもcppunitは便利かも

今夜もcppunitでこのページの生成プログラムのテストコードを書いていました。
簡単なコードの部分からテストを書き始めて、徐々にテストしにくい、現実にバグが入っているだろうと思う部分のテストコード作成に移ってきています。cppunitって使ったことがあまり無かったので、どういうテストを書くのかいちいち考えながらやっているので面白いです。
今は「大体動くプログラム」があって、それに合わせてテストを書いていますが、それでもテストを書きながらプログラム本体を修正しますし、テストするためにプログラム本体を設計しなおしたくなったりします。そんなことをしながら今日思ったのは、プログラムを修正するときに直し間違えたときにcppunitを使っていると発見が早いということと、テストコードをプログラム本体と同時に作成すると、プログラムの怪しい部分をテストコードですぐに確かめられるので便利だということ。
しばらくは「このページの生成プログラム」と「テストコード」で遊べそうです。

2009年11月16日 プログラミング雑談

プログラムは完成していないのに次の野望

htmlを手で書かなくてもサイトが更新できるようになったもので、少し欲が出てきたのかRSSにも対応したいなぁと思いはじめました。
まだ私のwebページ自動生成プログラムは完成していないというのに・・・。
あと実働で数日あれば今作っているwebページ生成プログラムは一段落するだろうから、その後windowsアプリ化とかRSS対応とか手を出すのも良いかも。
そういえば年賀状宛名印刷プログラムも昨年の年賀状シーズンが終わったら放置していた・・・。windowsの表示関連でいろいろ遊んではいましたが、ウインドウの再表示処理がどうも不完全(クライアント領域ではなくてタイトルバーなどで再表示されない部分かある)というあたりで止まってます。
年賀状宛名印刷という点ではタイトルバーの再表示が欠けても問題ないから再開しようか・・・。
そういえば今年も写真の年賀状にしようとしているので写真を選んで写真屋に注文しないと・・・。
年末はやっぱりプログラムを書いている場合ではないかも。

2009年11月20日 プログラミング雑談

忘れる前に今回作っているプログラムについてメモ

ここしばらくの間作成していたプログラムもようやく最初の段階に達して使えるところまで来たので、つまづいたところをメモしておきます。
(1) C++の標準出力について
普通に次のようなプログラムを書きました。
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
int main(int argc, char* argv[])
{
    std::wcout << TEXT("Hello world! あいうえお") << std::endl;
    return 0;
};
今回作るのはコンソールプログラムですが、Visual Studio 2008 Express Editionを使っていますので、一応最近のWindowsプログラムっぽくテキストはTEXT("")マクロを使おうかなと思っちゃったわけです。
このプログラムの出力は
Hello world!
です。「あいうえお」以降の部分が出力されません。最後のstd::endl;も出力されていません。
std::wcoutをstd::coutにすると、"Hello world!"すら出力されず、ポインタのアドレスらしいものが出力されます。
    std::cout << TEXT("1 Hello world! あいうえお") << std::endl;
    std::wcout << TEXT("2 Hello world! あいうえお") << std::endl;
    std::cout << "3 Hello world! あいうえお" << std::endl;
    std::wcout << "4 Hello world! あいうえお" << std::endl;
とすると、期待通りに出力されるのは3だけです。
・・・・と、ここまでがVisual Studio 2008 Express EditinのC++でコンソールプログラムのデフォルトなんですが、プロジェクトのプロパティの全般設定で文字セットを「マルチバイト文字セットを使用する」設定にすると1から4まで全て期待通りに出力されます。
今回私が作っているプログラムではユニコードを使用する設定なのですが、なぜか上記4の形式で期待通りに出力できています。理由はわかりません。この問題で半日くらいあれこれ設定をいじったときに何かあったのかもしれません。

2009年11月24日 プログラミング雑談

忘れる前にCppUnitについてメモ

今回作成しているプログラムではCppUnitを使って単体テストしながら作成しました。
昨日は(1)でしたので今日は(2)
(2) CppUnitのランタイムライブラリを使うときのランタイムライブラリ設定について
コマンドラインプログラムですので、DLLとか使うのは何だか変な気がしたんですよね。理屈ではコマンドラインプログラムでもWindowsのGUIプログラムと同様に普通に使えば良いというのはわかります。
私の好みとして、VC++のランタイムDLLってPCによってインストールされていたりされていなかったりするので、exeのサイズを特に小さくしたい欲求がなければランタイムライブラリは使いたくないという気持ちはあります。というわけで、ランタイムライブラリは使わずに静的にリンクするためにプロジェクトのプロパティのC/C++コード生成のランタイムライブラリは「マルチスレッド」としました。「マルチスレッドDLL」は使いませんでした。
そうしたところ、CppUnitがうまくリンクできなくなりました。
結局、CppUnitを使うのはデバッグ時だけですので、デバッグ時のランタイムライブラリを「マルチスレッド デバッグDLL」と、リリースビルド時を「マルチスレッド」としました。
私はCppUnitの使い方はまだ初心者ですので、@ITのチュートリアル記事を参考に環境を作っています。最初「マルチスレッド デバッグ」でコードを生成するときにはcppunitd.lib、「マルチスレッド デバッグDLL」でコード生成するときにはcppunitd_dll.lib、cppunitd_dll.dllを使えば良いのかなと思っていたのですが、どうもこれは関係なくて、常に「マルチスレッド デバッグDLL」でコードを生成して、cppunitはスタティックリンクしてcppunitd.libを使えばよさそうです。
※2009年12月13日訂正
CppUnitを@ITの記事を見ながらビルドしたのがかなり昔だったので忘れていましたが、冷静になってよく思い出せばCppUnitを「マルチスレッド デバッグDLL」でビルドしたからテスト対象コードも「マルチスレッド デバッグDLL」にしなくてはならないだけでした。
CppUnitのライブラリを「マルチスレッド」としてリリースビルドしたら、リリースビルド時もCppUnitのライブラリをリンクしてビルドできるようになりました。バグって、そんなものだよね・・・。

気が向いたら、明日は(3) sizeofについて・・・初歩的なことなのですが、いつも混乱してしまうので。

2009年11月25日 プログラミング雑談

忘れる前にsizeofについてメモ

プログラミングは本をしっかり読んで勉強するというよりはプログラムを実際に作って覚えるというスタイルの私はsizeofがよく理解できていませんでした。
構造体などのポインタをsizeofすると構造体のサイズが取れるのかポインタのサイズが取れるのか、いつもわからなくなっていました。
char strTest[256];
と宣言するとsizeof(strTest)で256がとれるらしい。
でも関数の引数でfunction(strTest);などとやると、function(char* strTest)の関数内でsizeof(strTest)するとポインタのサイズである4がとれたりします。
要はsizeofする場所で変数がどう見えるかが問題なんですね。
sizeof(strTest[0])とすれば1がとれるのは私にもわかるんですけどね。

2009年11月27日 プログラミング雑談

WindowsのDLLで共有メモリを使ってプロセス間データ交換

Windowsのプログラムを作っていまして、プログラム間でデータのやり取りをしたくなりました。
いろいろな方法があるようですが、今回はDLLにデータ交換用のメモリ(変数)を確保して、そこで交換するという方法。
DLL中で
#pragma comment(linker, "/section:.myseg,rws")
#pragma data_seg (".myseg")
    INT i = 0;
#pragma data_seg()
とかすれば、変数iはこのDLLをリンクするプログラムで共有できるようになる。
変数iに初期値を入れないとセグメントがuninitialized dataになって、data_segではなくbss_segになるとかで、もしかしてdata_segをbss_segとかに書き換えればよいのかな? 試してみたらbss_segでいいみたい。でもiを初期化するタイミングはどうすればいいのだろう。調べればわかるだろうけど。
それはともかく、最近C++でプログラムを書く練習をしていますので、なんとなくこの共有領域の変数iが裸で外に出ているのが怖くて、クラスで包んでprivateにして、そのクラスを共有領域に置いて、メソッドを公開したいと思ったのですが、どうもWindowsではそのようなことは危ないらしいです。メモリマップドファイルを使うと良いらしい。
やっぱり初期化の問題はあるけれど、
class MyDllClass {
private:
    INT i;
public:
    MyDllClass(){ i = 0;}
    ~MyDllClass(){}
    int Add(){
        i++;
        return i;
    }
};
#pragma comment(linker, "/section:.myseg,rws")
#pragma bss_seg (".myseg")
MyDllClass _cc;
#pragma bss_seg()
とかやればとりあえず動いたけれど、やっぱり初期化をどうするかという問題が。最初にLoadLibraryした人が初期化すれば良いのだろう。
初期化の問題が解決したとしても、文脈は少し違うのですが「DLL内のデータをアプリケーションまたはほかのDLLと共有する方法」というMicrosoftのページで「(前略)Micorosoftではプロセス間でのC++オブジェクトの共有をお勧めできません。(中略)クラス インスタンス自体は共有しないでください」とありますので、結局使えないのですけど。ここでは全文はコピーしていませんが、このMSのページからは仮想関数さえ使わなければ自己責任で使って良さそうな感じにも読めます。まあWindowsの挙動がわかっていない私のような素人Windowsプログラマがやっていい技でもなさそう。

2009年12月06日 プログラミング雑談

ASP.NET入門中

なぜか突然ASP.NETの入門書を読んでいます。
そうだよねぇ。きっと自分のwebページを自動生成するアプリを書くなら本当はこういうツールを使うのでしょうね。
一応C++まで使うプログラマですのでC#を使いたい人向けのASP.NETの入門書を読んでいます。
1年位前にVisual C#の入門書を途中まで読んで飽きちゃった私ですが、このときの飽きちゃった原因はVisual StudioとC#と.NETがごちゃごちゃになった本だったのが原因だったような気がします。今回のASP.NETの入門書はその辺が別々になっていてとても読みやすい感じです。まあ、Visual StudioやC#のページが本の最初のほうにあるので、いまだにASP.NET関連のページに到達していないのですけどね。

2010年01月23日 プログラミング雑談

久々にプログラムをいじる気に

システム手帳の用紙を印刷するプログラムを作っています。
仕事ではなくて趣味で。
多分私の仕事はプログラマだったと思うけど、最近仕事でプログラムを書いていないなぁ。
あ、いきなり話がそれた。
見開きで一週間になっていて、その日の時刻毎の予定と、その週のToDoと、その日のToDoと、ちょっとしたメモが少し書ければよいという感じのページです。
雰囲気としては「7つの習慣」の第三の習慣のところに出てくるような週間予定表からミッションステートメント的なところを削除した感じで作っています。えと、7つの習慣がベースなのではなくて、「気がつくと机がぐちゃぐちゃになっているあなたへ」とかいう本のスケジュール表がベースです。思えばこの本が私のスケジュール管理の入門書でした。その後「7つの習慣」とか読んだりして方向修正したりします。
ああ、今度どっちの本もきちんと読み直そう。

また話がそれた。
システム手帳用のスケジュール表を印刷する話でしたね。
超手抜き版ですが、適当に罫線を引いて、時刻を書いて、日付を書いて、印刷するというプログラムは新年早々に作ったんですよね。
昔はWindows98でExcel95で作ったスケジュール表だったのですが、さすがにWindowsXPのPCにExcel95をインストールするのも気が引けたし、個人でExcel2007を買うほどの富豪でもないし、OpenOffice.Orgとかでスケジュール表を作っても良かったけど、せっかく一応職業プログラマ(だった?)わけだしプログラムを書いて見ようと思ったので。
どのくらい手抜きで作ったかというと、日付は全部コード中にベタベタに書いてあるというすばらしい手抜きぶり。プログラマなら日付をインクリメントするプログラムを書いたほうが早いし間違いがないだろうとツッコミたくなるような出来栄え。言い訳すると、私は職業プログラマだったけどUI付近には縁がなかったので文字列関数とか日付関数とかのランタイムライブラリって趣味でしか使ったことがないので、なんとなく日付の処理がめんどくさかったのです。
で、今日は超手抜き版に日付関数を入れて、日付をプログラムに書かせるように直していたというわけでした。さっきやっとできました。なかなか充実した夜だったと思い込むことにしよう。
それにしても、_localtime64_sで、どうして月だけ1月が0って感じで1ずれるんだろう。

2010年03月10日 プログラミング雑談

Windowsのコンソールプログラム

Windowsのコマンドラインのプログラムを作っていて、どうして文字コードにUnicodeを使うとstd::coutとかstd::wcoutとかがうまく使えないのだろうと思っていましたが、もしかしてコマンドのシェルが間抜けだからダメだったのか。
Unicodeを標準出力に出そうとしても出せないみたい。
半年くらい前からどうしてダメなのかずっと引っかかっていたのですが、私としてはやっと解決です。満足いく解決ではないのですけど。
コンソールアプリではShift-JISでいくしかないのか。なんだか残念。標準出力を使わないように作り直すのも面倒だなぁ

2010年05月01日 プログラミング雑談

システム手帳印刷プログラムの残作業

ふと気がつけば5月15日。毎週1回は更新するつもりがすっかり間が開いていました。
ま、アクセスカウンタもあまり動いていないようなので、更新を期待している人もそもそもいないだろうということで。
・・・と、何を書こうか考える前に書き始めてしまいました。
自分用の、システム手帳を印刷するプログラムをしばらく前から作っていましたが、使い勝手をあれこれ言わなければ使えるところまで出来ました。あとは使い勝手を改善して、プログラム内部のつくりをきれいにして・・・というところが当面の課題です。
まずやりたいのがツールバーの追加。今は何でもメニューで操作するようにしてるけどシステム手帳のページを印刷するだけの単機能のアプリなんだからツールバーをマウスでカチカチっと操作すると印刷が完了するくらいの手軽さが欲しいです。
Visual Studio 2008のVCでネイティブWin32アプリなんですけどどうやってツールバーを作るんだろう・・・と思って何週間か手が止まっていました。ツールバー自体はコモンコントロールなんですね。ボタンのイメージ(ビットマップ)も手元の古い本を見ていたら作れそうな気がしてきたし。ビットマップは何種類かの大きさを作らないといけないみたいだけどその辺の作り方は後で調べよう。
次にやりたいのは印刷中断用のダイアログ作成、その次にやりたいのはCppUnitのテストコードを作ること。
どうせいつものように自分専用のちっちゃなアプリですのでそこまでで良いかな。
あとは次にプログラムを書くときに再利用しやすいように何かしたいのだけれど、毎日プログラムを書いているわけではないので、きっと次に作るときって何年も先で、今回何かプログラム用に部品を作っても部品の使い方を忘れているに違いない。あ、そっか、プログラムのドキュメント代わりにDoxygen形式のコメントを入れてDoxygenにかけておくか・・・。

2010年05月15日 プログラミング雑談

久しぶりにプログラムを書こうという気に

自分用のシステム手帳印刷プログラムは一応できたのですが、せっかくなので公開できるようにきちんと作り直してこのwebページで公開しようかなと。
以前このwebページを生成するプログラムを公開したいとかいった記憶がありますが、あまりにこのページ専用のアプリになってしまったので公開しても需要が全くなさそうで公開をしようという構想をこっそり取り下げてしまった前科のある私ですので、果たして公開までたどり着けるか不明。

2010年06月02日 プログラミング雑談

みんなどうやってプログラムを書くんだろ

システム手帳の印刷プログラムとか年賀状宛名印刷プログラムとかここのサイトの更新プログラムとか、一応造って使っているプログラムはあるけれど、毎回スクラッチから作っているような気がして非効率的。
せめてWindowsの標準的な処理・・・スクロールバーとかツールバーとか、ウインドウの再描画とか印刷とかという、プログラムの中身に関係ない処理くらい自前のライブラリにしてしまいたいと思い始めてかれこれ何年だろう。年賀状宛名印刷プログラムを考えていた頃からだから・・・何年だかわからない(笑)
この手のことを考えて、実行に移そうと思ったときにいつも考えるのは「MFCや.NETでいいじゃん」ということ。でも私、MFCのランタイムをインストールしなくてはならないとか.NET3.0をインストールしなくてはならないとか、そういう面倒なことが嫌いなんですよね。そういうのを全部スタティックリンクしてしまえば良いのかもしれませんが、それではつまらない単機能のプログラムなのにexeのサイズが数メガバイトとかいうみっともないことになるし。
スマートフォンとかクラウドとかいうのが流行っている時代だからDOSコマンドプロンプトアプリやWin32ネイティブアプリなんて書いてもどうしようもないという気がするし、そもそもそこまでMicrosoftが好きではないしなぁ。こんなことを考えていても私は幸せになれないので、今のところWin32で自前のちっちゃな共通処理の実現に励もうか。

2010年06月13日 プログラミング雑談

Document-Viewアーキテクチャってどうやるんだろ

相変わらずこりもせずWin32ネイティブの簡単なアプリを書いています。
ここ数日はちょっと中断。せっかく作るのならば力の及ぶ範囲で美しく作りたい。ということで、せっかくWin32アプリなんだからMFCではないけれどMFCでは必須らしいDocument-Viewとやらでやってみたい。でもDocument-Viewってどうやるの?
MVCパターンをM-VCにしたものみたい。
そこまではなんとなくわかったような気がする。
今回はDocumentが入れ子になってるCompositパターンで作ろうとしていたのですが、このときはView側でGetDocumentするときにどうしたらよいのだろう。View側で入れ子になったDocumentを展開していくのかな。それともDocument側からViewを呼び出すように組めばよいのかな。後者のほうが実装は簡単になりそうな気がするけど、なんだかDocument-Viewっぽく無いような気がする。
Document側に入れ子のDocumentを返すようなメソッドを作って、View側でそれを呼び出して入れ子データを展開するのがよさそうだなぁ。
DocumentはどのViewから呼び出されてるか知っている必要はないんだよね。って事は、Documentを取り出してから対応するViewを探すのは難しそうだ。Abstruct FactoryパターンをView毎に適用する感じなのかなぁ。それはそれで面倒そうだ。

2010年06月18日 プログラミング雑談

CompositパターンとDocument-Viewアーキテクチャ

ここしばらくプライベートの時間が確保できなかったので、思い切って有給休暇を取得して時間を確保。自分用のシステム手帳印刷プログラムの骨格部分の試作を実施。
この前から悶々としてたのが、Compositパターンでページ内のオブジェクトを入れ子にしたときにDocumentとViewの関連付けをどうしようかということ。
Document-ViewのDocument側はとりあえずCompositパターンでこんな感じかと。
Document側クラス図
適当なUMLエディタがなかったので手書き・・・
ページと線と文字の関係はこんな感じ
ページが線と文字を所有
一方、Document-ViewのView側はCompositパターンとかにしないで普通に継承してみただけ。
描画オブジェクトViewクラスにDrawメソッドを作る
ここでDocumentとViewをどうやって結びつけるのかで悶々としていました。
描画オブジェクトViewクラスにページオブジェクトを渡してDraw()すると、ページオブジェクト内に入れ子になっている線や文字もDraw()できるというのを目指したのですが、ページViewクラスのDrawで線オブジェクトや文字オブジェクトを取り出しても対応するViewがわからないのです。
ViewはどのDocumentを使うか知っているけれど、DocumentはどのViewから描画されているか知らないのがDocument-Viewらしいので、Drawメソッド内で子のDocument(線とか文字とか)を取り出しても対応するViewが取り出せないのです。

結局、今回はFactoryメソッドを使って、Documentに対応する描画オブジェクトViewを生成してみることにしました。プリンタに出力するViewと画面に表示するViewは違うFactoryで生成するということになります。
なんとなくあまりシンプルではないような気がしてます。きちんとしたDocument-Viewって違うんだろうなという不安が・・・。
でもこれで試作は動いたし、正しいDocument-ViewになっていなくてもDocumentとViewの分離は出来たような気がしますので、今回の骨組みで完成まで持っていこうかなと思っています。

2010年06月28日 プログラミング雑談

バイブルサイズの手帳印刷プログラム試作中

春頃に試作していたバイブルサイズの手帳印刷プログラムは単に試作でしたので「とにかく動けばよい」という感じでつくりました。
画面はこんな感じ。
手帳印刷プログラム画面
見ての通り、クラシカルなWin32アプリです。
Visual Studio 2008 Express Editionで作りましたので、Windows 2000以降で動くようです。
実行ファイルはこれです。
ソースファイルはこんな感じ。
このバージョンを公開するつもりはそもそもなかったので、いろいろWin32アプリとしてやるべきことをやっていません。例えば印刷中止用ダイアログが出ないので、印刷開始したら中断できないとか、ツールバーがメインのウインドウ座標上にあって、redrawのメッセージをツールバーに送っていないのでメインのウインドウをリサイズするとツールバーの表示が変になるとか。
スクロールバーもつけたかったけれどまだつけていません。
・・・などなど、数多くの問題がありながらもこのプログラムはこれでオシマイ。
この試作を捨てて、C++っぽく全面書き換えを始めました。
拡張子がcppだけど、クラスを一つも使っていないなんて・・・という感じでしたし。
Compositパターンを使ってページオブジェクトを作ってその中に線オブジェクトと文字オブジェクトがあって・・・Document-View構造にしたいなぁ・・・とか考えているのは楽しいのですが、やってみると一歩毎に壁がある感じ。なかなか進みません。
まずはこの試作と同等レベルで画面表示するところまで行きたいと思っています。
今はこんな感じ。
改良版手帳印刷プログラム画面
オブジェクト指向っていいなぁと思ったのは、ちゃんと設計すればあとはページオブジェクトに部品を追加いるだけで他のモジュールに手を加えなくて良いこと。線を増やしたり文字を増やしたりしても、表示ルーチンは全然いじらなくて良いというのは楽です。
楽だと言っておきながら、日曜プログラマなもので、このペースだとプログラムが出来るのは夏休み頃かなぁ。でも、このプログラムならばその後改良して、以前から作りながら中途半端で挫折していた年賀状宛名印刷プログラムに応用するのも簡単になりそう。
懸念事項が一つ。右手が痛いです。
整形外科とかに行ったほうがいいかなぁ。この界隈だとどこにあるんだろ。内科や皮膚科は行くけど整形外科って知らない。

2010年07月03日 プログラミング雑談

手帳印刷プログラム進捗

最近、XPエクストリーム・プログラミング入門とかいう本を読みました。
著者の趣旨とは違うかもしれないけれど、最初からきれいに実装しようとして手が止まるくらいならば汚くてもプログラムを書いたほうが良いのだ!という気がしました。
ということで、今日もちょっとだけプログラムを書きました。
Windowsプログラミングでは殆どの場合は画面表示の処理を書いていますが、プリンタの場合はページの余白の分のオフセット処理が必要なんですよね。最近の家庭用プリンタは余白なしで印刷できるので画面と同じように書いてもずれずに印刷できてしまうのでバグにちょっとだけ気がつきにくいです。
GetDeviceCaps(hdc, PHYSICALOFFSETX)、GetDeviceCaps(hdc, PHYSICALOFFSETY)で余白分のピクセル数を取得してずらさなくてはなりません。ということで、昨日公開した試作のプログラムから印刷処理をコピーして、多分印刷できるようになりました。まだ1ページ分の印刷しか出来ませんので、複数ページのオブジェクトを印刷する処理に成長させなくては・・という状況です。
複数ページ印刷に対応したらスクロールバーをつけたいなぁ。スクロールバーの前にタスクバーかな。

2010年07月04日 プログラミング雑談

プログラムは毎日作らなくては・・・

昨日から久しぶりに作りかけのプログラムをいじり始めました。
いじり始めたと言っても昨日と今日でまた中断期間に入ると思います。
作っているのは相変わらずシステム手帳の印刷プログラムです。一応印刷できるようになりましたので使い始めているのですが、WYSIWYG(What You See Is What You Get)の画面表示が出来ていませんし、春頃作ったバージョンで実現していたUIが全く入っていないのでまだまだ完成までは時間がかかりそうです。
昨日はリソースのリークのデバッグをしていました。
CreateFontIndirect()で失敗するのでDeleteObject()し忘れているのだろうと思ってデバッグしてもなかなか原因が見つからない。CreateFontしたあとはきちんとDeleteしているのに・・・ということで2時間ほど。結局Fontはリークしていなくて、penをCreateしたあとDeleteしていないことが発覚。まあバグってこんな感じで入り込むのですよね。
まだ小さいプログラムのうちに問題が見つかってよかった。
それにしてもこの前いじったときから1ヶ月くらい経ったようで、どんなコードを書いていたか殆ど記憶にありません。やっぱり毎日毎日継続して作っていかないとダメですね。
今日はスクロールバーをつけようとしています。
デザインパターン的にはDecoratorのはず。でもまだWin32プログラミングでデザインパターンに合わせるのに慣れていなくてはかどりません。精進しなくては。
今日中にスクロールバーをつけてしまわないと次に取り掛かれるのはいつになるかわからないのでちょっと気合を入れてがんばろー。

関係ないけど、この夏のジブリの映画のアリエッティだっけ、の設定を聞いていたら「あおいちゃんパニック」の「きぴきゃぴ」を連想していました。「アリエッティ "きぴきゃぴ"」でググったら2件ヒット。私だけではなかった・・・でもたった2件とは。
そのうち1件はtwitterで、発言者のサイトを見たりして、「伺か」とかいうツール?を知りました。昔Microsoft Officeでイルカのカイルとか居ましたけど、あれよりはかなり役に立ちそうなデスクトップ用のアシスタントのようです。無機質なツールも良いけれど、萌えキャラのツールも癒されるかもしれない。長く付き合うツールなら無機質なのが好みだけど。

2010年08月11日 プログラミング雑談

システム手帳印刷プログラム(作り直し版)

7月3日頃にC++で作り直し始めたシステム手帳印刷プログラムも一応自分で使うことが出来るレベルに到達しました。
現時点のシステム手帳印刷プログラム
前回作ったバージョンよりも垂直スクロールバーが使えるところと、複数ページ表示に対応したところが新しいです。
あとはツールバーをつければ前回作ったバージョンと同等、さらに水平スクロールバーをつければ当初作ろうと思っていた機能が一通り入るというところまで来ました。Document - Viewアーキテクチャの自己流の解釈で作ってましたがクラスの機能がおかしな割り当てになってしまった部分がありますし、Windowsメッセージの処理がViewに入っていないので、機能が一通り入ったらそのあたりの修正に取り掛かりたいと思います。
あ、そうだ。印刷中ダイアログも表示しなくちゃいけなかったんだ。
ゆっくりプログラムを書く時間がまた暫くとれなくなるので当初作りたかったものが完成するのはいつになることやら。年内には完成させたいのですが・・・。
疲れた。でもプログラムを書くのって楽しいですね。

2010年08月13日 プログラミング雑談

システム手帳印刷プログラム 残作業がいっぱい

日曜が終わって明日は仕事。
とりあえず一週間はほとんど趣味のプログラミングは進まない見込みです。
一区切りまで作りこみたかったのは
・ツールバー
・印刷中ダイアログ表示
・Document - Viewっぽい作りこみ
なのですが、ツールバーはちょっと面倒なことがわかったので、後日取り掛かることにしました。その代わりに
・クライアント領域の子ウインドウ化
を先に作らなくてはならないようです。
垂直スクロールバーをつけてツールバーをつけたらツールバーがクライアント領域内なので垂直スクロールでツールバーもスクロールされてしまうというのに気がついて、ツールバーの部分はスクロール対象外にしようか、ツールバーを別ウインドウにしようか思案していました。
結局どちらの方法をとるにしても子ウインドウを作らなくてはならないわけで、設計とか考えずにガリガリ書いてしまえば実現は出来るでしょうが、今回はC++っぽくクラスを作っていきたいのでそのあたりの設計をしたいなぁと思っています。
そんなわけでツールバーをきちんと作ろうとすると考える時間が必要なので、ツールバーは無くても支障がないというわけで先送り。当面は
・印刷中ダイアログ表示
・Document - Viewっぽい作りこみ
を優先して、その後子ウインドウの設計、作りこみ という順でとりかかり、その後ツールバーの組み込みをすることにします。

きちんと設計して作って、ライブラリを再利用したいと思っていますが、この次にプログラムを書くのは何年か先のことで、その時にはWin32のアプリは仕様が大幅に変わっていたりして。そうでなくてもどんな仕様でライブラリを作ったか忘れて、また最初からアプリを書きそうな気がする。

2010年08月15日 プログラミング雑談

WindowsのCrypt API

先週から一週間ほど、楽しい仕事をしてました。
本当は私が自分でするべき仕事ではなかったのかもしれませんが、納期に間に合いそうにない気配が濃厚になってきたので手出ししてしまいました。
あまり詳細を書くと職場の人に見つかってしまうので(見つかっても別にヤバイ事は無いのですが、(そうではない人から見て)アニメオタクな話題も書いているので隠れていたいので)概略だけ。

指定されたアルゴリズムでハッシュ値を計算して、そのハッシュ値をキーにしてAES暗号化するプログラムを書く仕事で、Microsoftのサンプルプログラムをベースに試作しました。サンプルにはMD5でパスワードをハッシュして、それをキーにして任意のファイルをRC4で暗号化し、別のサンプルプログラムで復号するというのがありましたので、RC4の部分をAESにしたら簡単に動作させることが出来ました。
ところが、そのようにして作成した暗号が、試験用のツールでエラーになるのです。
なぜ?
先週4日間、職場でも自宅でもそればっかり考えていました。指定されたアルゴリズムを何度も何度も繰り返し読み直しましたし、Windows SDKのCrypt関数の説明も読み直しました。今回はポピュラーなものを作ろうとしていましたので、同じ事をして苦労した話がないかググッたりもしました。
ポピュラーな題材だと思うのですが、今回の開発ターゲットのC言語でのネタはwebでは見つけることが出来ず、JavaやC#のコードをそれぞれ一つずつ見かけました。うーん、私がCで実装したのと同じに見えるなぁ・・・
3日目位に、Windows SDKのCryptDeriveKey()の説明の下のほうに「ハッシュ計算がSHA-2じゃなくて、かつ、暗号化に使うアルゴリズムがAESの場合は計算したハッシュ値をさらに勝手に加工しちゃうよ」(意訳)という記述に気がついた。なんてこったい。RC4で作った暗号は試験用ツールにパスしたので、アルゴリズムだけAESにすればそのまんま動くと信じてたよ。ハッシュ計算は指定されたアルゴリズムでなくてはならないので、勝手にいじられたら困るんですけど。だまされた。
こんなトラブルがなければ1日でできる試作だったのに4日もかかってしまった・・・
[今回の教訓]CryptDeriveKey()には気をつけろ

2010年09月08日 プログラミング雑談

手帳印刷プログラム

そろそろ年末だしなぁと思って、春だったか夏だったかに作っていた手帳印刷プログラムをいじり始めました。
確か、印刷中ダイアログを表示して印刷が中止できるようにするのと、ツールバーを表示するようにするのが当面の課題だったはず。
どちらもチュートリアル本のサンプルの通り作れば直ぐに入れることが出来る機能だったのですが、調べて実装するのが億劫で今日まで延ばしてきました。
とりあえずツールバーはこんな感じ。
スクロールしてもツールバーが消えない
スクロールしてもツールバーが消えないのが当たり前のことなんだけどいざ実現するのが面倒でした。技術的にはチュートリアル本にあるようなレベルなので簡単なはずですが、取り掛かるのが面倒でした。
ただし本当にチュートリアル本レベルで汚く試作した感じですので、あとはきれいに書きなおしてテストプログラムも書いて・・・というところで完成ということにしてしまいたいです。

2010年12月13日 プログラミング雑談

プログラムを書いてみた

プログラムを書いてみたって言っても、ちっちゃいプログラム。
コメントと空行込みで70行くらいの。
プログラムのロジック自体はすぐに書けたけれど、strcpyではなくて_tcscpy_sとかいうところの書き換えと、VS2015だとexeが128KBになるのが気に食わなくて、ビルド方法を調べてたりしたら2日くらいかかってしまった。
趣味だから許されるのんきなスケジュール感だなぁ。
実行ファイルとソースファイル

2016年07月30日 プログラミング雑談

CppUTestと戯れる

このwebページは2008年頃だったかにテキストからhtmlを生成するプログラムを書いて、以降ずっと使い続けています。
最初のうちはcppunitで単体テストを書いてました。このあたりで話題にしていましたね。
最近、また単体テストを書こうかなと思って、前回cppunitを使った時にはmockとか使っていなかったので、mockってのを使ってみたいなぁと思っていろいろググっていました。
どうもcppunitは長い間更新されていないようですね。
google testとかCppUTestとか、新しめのテストツールもいろいろあるようです。
ってことで、CppUTestで単体テストを書くための試作というか練習をしていました。
このページを見ながら右往左往。
何日か費やして、やっと到達したのがこのレベルのソースファイル
なかなか充実した日々だった。

2017年01月08日 プログラミング雑談

mockppと戯れる

mockpp-1.16.6のソースをダウンロードして msvc8\mockppの下にmockpp.slnがあるのでこれでVS2015を開いて ビルドしてみるとmockppでmockpp_production_44d.libが見つからないと言ってくるので リンカーの追加の依存ファイルからmockpp_production_44d.libを削除すると、とりあえずビルドが通るみたい。追加の依存ファイル名をmockpp_production.libに変更するのも良さそう。 それにしても$(Outdir)がTEMP以下にできるのが面倒だな。

2017年01月29日 プログラミング雑談

メインページに戻る

Valid XHTML 1.0! Valid CSS!