フレームワーク
VisualStudioなんか使っていると、よく目にするのが「Afx」という単語。
初めて「StdAfx.h」を見たとき、会社の先輩に「スタンダードあふっくす」って言ったら
「恥ずかしいからそんな呼び方しないでくれ」と言われたのを覚えてます(^-^;
「Std」は「スタンダード」ってのがなんとなく分かるけど、
「Afx」って想像もつかなかったわけで。。。
で!
調べてみるとwikipediaに書いてありました。
wikipedia(MFCについて)
http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library
この中で、以下のように記載されていました。
『MFCの開発中の呼び名が“Application Framework Extensions”で、省略して“Afx”って呼んでたんだぜぇ』
なるほど納得です(^-^)
ちなみに「FrameWork」ってのもよく耳にするけど、
そもそも何を指しているのだ?
って思う方もいるはず!
(いないかな;)
コチラもwikipediaに記載されていました。
wikipedia(アプリケーションフレームワークについて)
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF
要約すると、
みんな標準的に使いたいだろう関数やクラスをライブラリにしといたので、
使いたい機能があれば、コーディングしなくても使えるぜ。
ってことです。
Windows開発でいうところのMFCみたいなものですかね。
ボタンクラスやらスクロールバークラスやら。etc...
余談ですが。。
業務ソースコードを見ていると、たまに古い実装がそのまま使用されているところがでてきて、
スクロールバークラス使えばラクなのに、なんでボタンクラスをやりくりして頑張ってるんだろー
って思ったことがありました。
いろいろ歴史を調べてみたところ、当時はまだスクロールバークラスが無かったため、
ボタンクラスを使って自前でやっていたということが分かりました(^-^;
いまの開発者ってのは、ダイブ恵まれた環境にいることを実感した次第であります。。
スリップリングの仕組み
ハード系の仕事をしていると、たまに「スリップリング」という言葉を耳にします。
なんだそれ?w
って思って調べてみると、なんてこたない。
モノ自体は知っているけど、名前を知らないアレでした;;
通常、電源の供給元ってのは固定系から出ていますが、
供給先が固定系とは限りません。
そう。
回転系へ電源を供給したいときもあるのです。
UFOをイメージしてみたら分かりやすいでしょうか。
ぃぁ、余計分かんねぇよ(´Д`)ノ
どちらかっていうと、
UFOキャッチャーのアーム(横軸に回転するタイプ)をイメージした方が分かりやすいでしょうか(^-^;
または、ショベルカーの先端とかetc
電気を必要とする対象物が回転系であり、ストッパーもなく360度以上回る場合、
グルグル回っていくと、電気を供給しているケーブルが断線してしまいますよね。
じゃぁどうやって電気を供給するかっていうと、
スリップリングの出番なわけです。
スリップリングは、
電気を通すケーブルと回転体を分けた構造になっているため
断線することなく360度以上回ることができる作りになっているのです。
肝心の電気を流す部分ですが、
供給元からはブラシを介して回転リングに電気を流し、
供給先は回転リングを介して電気をもらいます。
[ブラシ]
[回転リング]
回転リングとブラシは、こんな感じ(↓)で接しているみたいです。
知っているヒトからすれば当たり前の話かもしれませんが(^-^;;
長年ソフトだけをやってきた私からすれば、未知の部分でして。。
大変勉強になりました(u_u*)
あと、「ヘリサート」ってのも良く耳にしますね(^-^)
ヘリサート
へりさーと
つぃつぃクチに出したくなってしまうのは、私だけでしょうか(^-^;
比較ツール
ソースコードのリビジョンを何度かあげていくと、
どのバージョンでどういった改修を行ったのか見返すときがたまにあります。
ソースコードはテキストファイルなので、基本的にどんなdiffツールでも対応していると思います。
しかしながら、Word/Excel/PowerPointなどは、
独特なフォーマットに基づいて記載されているため、
文字以外の情報を多く含んでいます。
ex) フォント、スタイル、ポイント
つまり、通常のテキストエディタ用の比較ツールを使用すると
文字以外の情報部分が物凄く邪魔をして、本当に知りたい差分ってのが分かり難くなってしまいます。
そこで、Word文書とかも比較できるツールがあればイイのになーって思って探していると・・・
ありました!
なんと、以外にも!
普段愛用しているWinMergeでできるみたいなのです!!
やり方としては、
①WinMergeの公式サイトから、インストーラを拾ってきて、普通にインストールします。
公式サイト:http://winmerge.org/
イストーラ参考:WinMerge-2.14.0-jp-16-Setup.exe.zip
②次にWinMergeのプラグインを拾ってきて、テキトーに解凍します。
サイト:http://freemind.s57.xrea.com/xdocdiffPlugin/index.html
プラグイン:xdocdiffPlugin_1_0_6d.zip
③WinMergeを解凍したフォルダに、プラグインを入れます。
④WinMergeを起動して、プラグインの設定を「自動展開」にします。
⑤終わり。
これで準備はできたので、
あとは比較対象に、docファイルやらxlsファイルを指定するだけです♪
楽チンですねo(^-^)o
SVNでファイルを取得すると、タイムスタンプが取得日になってしまう
開発を続けていくと、ソース管理が結構重要になってきます。
メインとなる製品ソースから特注版を作るのに派生させたり、
1つ前のバージョンではうまく動いていたので、バージョンを戻したかったり。
メジャーな管理ツールとしては以下が挙げられます。
・MS Visual Source Saf[通称:VSS](MSライセンス必要)
・Subversion[通称:SVN]
・Git
・Mercurial
どんなことでも使い慣れた環境が一番ですよね。
私はVSSがお気に入りだったりします(^-^;
※pdfが読めなくなる不具合ありますが、パッチ(KB925234)ありますし。。
さて、今回はSVNの話。
最近このツールを使い始めたんですが、
オリジナルファイルのタイムスタンプを覚えてくれないということが発覚;;;
SVNの初期設定では、リポジトリから取得した「現在時刻」がタイムスタンプとなるようです。
なにか設定は無いものかといろいろと調べてみると、
タイムスタンプに「コミットした時刻」なら設定することができるようです。
タイムスタンプに「コミットした時刻」を設定するのは以下2通り。どちらでも可。
①SVNの「設定」-「全般」より、「ファイルの更新日時を[最終コミット日時]に設定する」のチェックON
②SVNの「設定」-「全般」-「編集」より、SVNの設定ファイル(config)を開く。
以下の値を設定して閉じる。
[miscellany]
use-commit-times = yes
①と②は連動してるのかと思っていろいろ試してみましたが、非同期でした(^-^;
しかしながら結局はSVNの仕組み上、
どう頑張っても「オリジナルファイルのタイムスタンプ」にはならないようです。
ソースを管理する上で、タイムスタンプを覚えてくれないのは致命的ですよね・・・
んーーーーー。
残念。。。
SVNでオリジナルファイルのタイムスタンプを残す方法を知っている方いましたら、
是非とも教えてください;;;
余談ですが、
いろいろとグーグル先生に聞いてみると、
オリジナルファイルのタイムスタンプなんかクソ食らえだ!という記載をよく見かけました。
果たしてホントにそうでしょうか?
私は荒れた開発環境にコンサルとして入ることがあるので、以下の事由により必要性を感じています。
・過去ソースが管理されていない
・過去リリースバージョンが管理されていない
・過去の来歴が管理されていない
・過去改修したソースがサーバ上のいろんなところに散らばっている
たとえばサーバ上に散らばったソース。
タイムスタンプがすべて同じ日時だったら、以下判断できるでしょうか。
・最後に改修したのはいつ頃か?
・どれが新しいのか?
また毎度毎度、改修するたびに触るソース。
逆に長年触ってないソース。
これらは設計者にとって、非常に重要な情報だと私は感じています。
・毎度毎度触るソース
不具合が頻発するような複雑な処理をやっている
重要な機能を集約している
→障害が発生したときに、比較的優先度高く参照する対象
・長年触ってないソース
簡易な処理な処理で不具合が発生しにくくメンテ不要
作ったけど使ってない💦
→閲覧頻度低くても問題ない
キチンと管理された環境で開発している、言わば温室育ちのような方には無縁の話かと思いますが;;
世の中には様々な開発環境があるので、情報が多ければその分だけ打つ手も検討できるもんです(u_u*)
私はこれまでにいろんな環境を見てきました。
・構成管理がされていない
エンドユーザーにリリースしているのにバージョン管理されていない
設計者のローカルPCにしかコードが無い
設計書・設計メモ・設計思想が無く、よくわらない数値を足している、意味の無さそうな処理をしている
・複数人開発のプロジェクトなのにコーディング規約が無い
俗に言うスパゲッティーコードだらけ
規約をガチガチに作ったことで、規約そもそもが多く把握しきれず守られていない
声の大きいヒトの思想で作ったため全体を見ると支離滅裂
私が交通整理することで散らばったソースを管理したり、プロジェクトの構成を作り替えることで
後任者へ引き継ぐなんてことをしてきたりするわけです(^-^;;
※放っておいたらスクラッチ行きです💧果てしない工数がかかります。。。
まとめると・・・
情報は多いに越したことは無い。
不要と思われる情報は使わなければ良いだけで、
あえて削らなくても良いのではないでしょうかね。
ファイルオープンダイアログ
GUIを使って、ユーザにファイルのフルパスを指定させたいとき・・・・ありますよね。
よく見るこんな画面です。
実はそんなに大変じゃなく、数ステップで書けちゃいます。
「ファイルを開く」ときのソースはコチラ(↓)
BOOL CMainDlg::OnButtonPush() // ファイルを開く CFileDialog *dlgFile; CString strFileName; dlgFile = new CFileDialog(TRUE, "txt", NULL, OFN_CREATEPROMPT, "*.txt|*.txt|全て(*.*)|*.*||"); if ( dlgFile->DoModal() == IDOK ) { strFileName = dlgFile->GetPathName(); }
同様に、「名前を付けて保存する」ときのソースはコチラ(↓)
BOOL CMainDlg::OnButtonPush() // ファイルを開く CFileDialog *dlgFile; CString strFileName; dlgFile = new CFileDialog(FALSE, "txt", NULL, OFN_CREATEPROMPT, "*.txt|*.txt|全て(*.*)|*.*||"); if ( dlgFile->DoModal() == IDOK ) { strFileName = dlgFile->GetPathName(); }
「ファイルを開く」ときと、「名前を付けて保存する」ときの違いは1ヶ所だけです(^-^;
なので、コチラ(↓)のようにまとめてしまうと便利です。
// 汎用的な作り #define FILE_EXT "txt" #define FILE_EXT_ALL "*.txt|*.txt|全て(*.*)|*.*||" CFileDialog *dlgFile; CString strFileName; BOOL bIsFileOpen = TRUE; dlgFile = new CFileDialog(bIsFileOpen, FILE_EXT, NULL, OFN_CREATEPROMPT, FILE_EXT_ALL); if ( dlgFile->DoModal() == IDOK ) { strFileName = dlgFile->GetPathName(); }
マルチスレッド
前回のプログレスバーの宿題です。
プログレスバーが動いているとき、Stopボタンで自由なタイミングに止めたかったんですが
Startボタンのイベント処理内でプログレスバーを動かしてしまっていたため、
Stopボタンのイベントが発行できませんでした;;
そこで、
プログレスバーの動作処理は別スレッドで実施し、
Startボタンのイベントとしては、スレッドの生成だけにします。
すると、すぐにStartボタンのイベントがreturnされるので、
Stopボタンのイベントが発行できるようになるのです。
画面左下の「Start」ボタンを押すと、プログレスバーが動き出します。
画面中央の「Stop」ボタンを押すと、プログレスバーが止まります。
ソースはこんな感じ(↓)
ProgressBarDlg.cpp
BOOL CProgressBarDlg::OnInitDialog() { // プログレスバー範囲設定 m_ddx_progress.SetRange32(0, PROGRESS_MAX -1); // 位置表示をリセット GetDlgItem(IDST_STATES)->SetWindowText(""); } void CProgressBarDlg::OnBnClickedStart() { m_bProc=TRUE; AfxBeginThread(ProcThread, this); } void CProgressBarDlg::OnBnClickedStop() { m_bProc=FALSE; } UINT ProcThread(LPVOID pParam) { CProgressBarDlg* pDlg=(CProgressBarDlg*)pParam; CString str; for (int i = 0; i < PROGRESS_MAX; i++) { // Stop要求があったので終了 if ( pDlg->m_bProc == FALSE ) { break; } // 現在位置設定 pDlg->m_ddx_progress.SetPos(i); // StaticTextに進捗を表示 if ( i% PROGRESS_VIEW == 0 ) { str.Format("%d/%d", i/PROGRESS_VIEW, PROGRESS_MAX/PROGRESS_VIEW); pDlg->GetDlgItem(IDST_STATES)->SetWindowText(str); } } // 位置をリセット pDlg->m_ddx_progress.SetPos(0); // 位置表示をリセット pDlg->GetDlgItem(IDST_STATES)->SetWindowText(""); return TRUE; }
ProgressBarDlg.h
#define PROGRESS_MAX (100000) #define PROGRESS_VIEW (100) UINT ProcThread(LPVOID pParam); class CProgressBarDlg : public CDialogEx { protected: BOOL m_bProc; }
ProgressBarDlg.rc
CONTROL "",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,7,7,173,18 LTEXT "10000/10000",IDST_STATES,141,25,39,8 PUSHBUTTON "Start",IDBT_START,7,45,54,15 PUSHBUTTON "Stop",IDBT_STOP,65,45,54,15 DEFPUSHBUTTON "閉じる",IDOK,130,46,50,14
プログレスバーの処理を、別プロセスProcThread()にもっていきました。
Startボタンが押されたら、このプロセスを起動するだけでイベント処理を終わらせます。
Stopボタンが押されたら、プロセス内のfor文を抜けるようにしてあります。
こんな感じで、重い処理は別プロセスに分けてあげると
メインのウィンドウは自由に動けるので使い勝手がよくなります♪
プログレスバー
ちょっと重い仕事をさせるとき、あまりにも動かなさすぎて
処理がハングしてるのか不安になるときありますよね。
バックグラウンドの処理では、
正常に処理できているのかハングしているのか見分けがつきませんので(^-^;
そんなときはプログレスバーの出番です!
全体がどれくらいあって、残りがどれくらいかってのを画面に表示させてあげると
ユーザーが見て分かるので、結構安心したりするものです。
画面左下の「Start」ボタンを押すと、プログレスバーが動き出します。
ソースはこんな感じ(↓)
ProgressBarDlg.cpp
BOOL CProgressBarDlg::OnInitDialog() { // プログレスバー範囲設定 m_ddx_progress.SetRange32(0, PROGRESS_MAX -1); // 位置表示をリセット GetDlgItem(IDST_STATES)->SetWindowText(""); } void CProgressBarDlg::OnBnClickedStart() { CString str; // StaticTextに表示する文字列 for (int i = 0; i < PROGRESS_MAX; i++) { // 現在位置設定 m_ddx_progress.SetPos(i); // StaticTextに進捗を表示 if ( i% PROGRESS_VIEW == 0 ) { str.Format("%d/%d", i/PROGRESS_VIEW, PROGRESS_MAX/PROGRESS_VIEW); GetDlgItem(IDST_STATES)->SetWindowText(str); } } // 位置をリセット m_ddx_progress.SetPos(0); // 位置表示をリセット GetDlgItem(IDST_STATES)->SetWindowText(""); }
ProgressBarDlg.h
#define PROGRESS_MAX (100000) #define PROGRESS_VIEW (100)
ProgressBarDlg.rc
CONTROL "",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,7,7,173,18 LTEXT "10000/10000",IDST_STATES,141,25,39,8 PUSHBUTTON "Start",IDBT_START,7,45,54,15 DEFPUSHBUTTON "閉じる",IDOK,130,46,50,14
テキストの表示は100回中1回に間引きしています。
そのまま表示すると画面がチラつくぐらいリフレッシュするので(^-^;
「Stop」ボタンも実装しようかと思ったんですけど、プログレスバーの処理をやっている場所がマズくてこのままではダメぽ。
Startボタンのイベントでグルグル回りだしてしまうので、他のイベントを受け付けてくれないのです;;
おそらく、
Startボタンを押したタイミングで別プロセスを起動し、そっちでプログレスバーの処理を実施。
Startボタンのイベントはすぐにreturnして処理を返してあげないと、別のイベント(Stop要求とか)が受けられない感じですかね。。
別プロセスを起動するっていうのはまたの機会に(^-^)
はてなブログの使い方(お試し板)
ハテナ記法ってのを試してみたかったんですけど、
いろいろ試行錯誤したのに何故かダメぽ。
どんな記載すればよいかって記事はみつかるんですけど、
どこにその記載をすればよいかってのが分からず;;
「見たまま編集」ってトコに書いてもダメだし、
「HTML編集」にしてもダメだし。。。
普段から結構なモノグサなんですが;;
仕方なくブログの設定を見にいくことに(^-^;
すると、こんなところに設定する場所が!
「編集モード」を「ハテナ記法」に変更。
やっとこハテナ記法ってのが使えるようになったぞぉw
ふふ~ん♪
ということで、さっそく表を作ってみました。
A組 | B組 | C組 | D組 | E組 | |
---|---|---|---|---|---|
1年生 | 36 | 37 | 38 | 39 | 40 |
2年生 | 37 | 35 | 39 | 36 | 35 |
3年生 | 37 | 38 | 36 | 35 | 39 |
Preformatted Text
ソースコードとか。。
Redmine
プロジェクトのリーダー or マネージャになると、
業務全体の工程管理が必要になってきます。
自分のアタマの中だけでスケジュールを組めるとしても、
業務に携わる人がみんな同じ方向を向くために、可視化することをお勧めします。
最初の頃は、言われた仕事だけを淡々とこなす人が多いかと思いますが、
仕事の流れや目的が分かってくると、全体のスケジュールとかを意識してくるようになってきます。
部下からある日突然、プロジェクトの全体日程を聞かれたとき
口頭ベースだけの説明では理解してもらうのに時間や手間がかかるかと。。
「いつ」「どこで」「誰が」「なにをやっているのか」「いつまでに終わるのか」
この辺をパッ見で分かる資料があると便利ですよね(^-^)
「おまえが工程を意識する必要はない!」
「オレが全て把握しているんだから、オレに従え!」
なんてーのは論外。
部下はいつまで経っても成長する機会を与えてもらえないですよね。
また上司の判断が100%正しいなんてことは有りえないですしね。。
ヒトは過ちを犯す生き物であり、上司もまたヒトの子ですから(^-^;
私がいつも心掛けているのは、
「会社帰りに自分が事故って死んでしまったら」
というのを意識してます(^-^;
とある情報について、自分しかもっていないというのはNG。
情報は必ず関係者に周知。
内容によっては有識者にだけ展開。
資料や仕様書、調査書などは分類わけしてサーバに。
どうしても部下や関係者に流せない情報は、上司にCCか何かで投げておく。
これでいつ死んでも大丈夫です!
(縁起でもねぇ;;
さて。
前置きが長くなりましたが;;
上記を実現するツールとして今回紹介するのはRedmineです。
まずは公式サイトからダウンロードしてきて、サーバ等にインストールします。
http://redmine.jp/
使用方法は簡単で、ブラウザからサーバにアクセスすれば良いだけです♪
↓Google Chromeからこんな感じで。
「サーバー名/redmine」
Redmineに登録されていないメンバーは、閲覧のみ可能です。
編集権限が必要であれば、管理者に登録してもらいましょう。
Redemineでは、プロジェクトごとに以下のような機能を設定or閲覧できます。
・担当メンバー
→プロジェクトに携わるメンバーを登録します。
・メンバーの権限
→各メンバーごとに権限を設定できます(管理/開発/報告 など)
・チケット
→プロジェクト内の業務単位です。
・ガントチャート
→全体の日程が見れます。
・カレンダー
→日単位で、活動が見れます。
・ニュース
→私は使ってません;;
・文書
→仕様書などをおいとけます。
・Wiki
→プロジェクトに関する情報を記載します。
自由度が広いので、なんでもできるイメージです。
・ファイル
→Redmine上でリンクを貼っている対象ファイルの現物をおいときます。
Redmineの記載はコチラ(↓)が参考になりました。
http://redmine.jp/tech_note/RedmineWikiFormatting/
実際の使い方やスクリーンショットなんかも、
これまたWeb上にはゴロゴロ転がっているので、
このブログでは割愛させて頂きます。。
処理時間の計測
Windows等の非RTOS向けのプログラムに比べると、
vxWorks等のRTOSのプログラムってのは、
処理時間がものすごくシビアだったりします(^-^;
そんなわけで、
いかに可視化されたキレイなコードで、処理時間の最適化を行うのか?
ってのが重要になってきます。
そこで、処理時間を計測するためのAPIをいくつか紹介してみます。
これらのAPIはプラットフォームに依存して使用可否が決まってきたりするので、その辺も含めて。
time()
[プラットフォーム]
・Windows ・・可
・Linux ・・・可
・vxWorks ・・可
[精度]
・秒(sec)
[参考]
http://www9.plala.or.jp/sgwr-t/lib/time.html
gettimeofday()
[プラットフォーム]
・Windows ・・不可
・Linux ・・・可
・vxWorks ・・不可
[精度]
・マイクロ秒(μsec)
[参考]
http://www.argv.org/~chome/blog/noisefactory/2008/02/gettimeofday.html
clock()
[プラットフォーム]
・Windows ・・可
・Linux ・・・可
・vxWorks ・・可
[精度]
・システムクロックに依存(※)
[備考]
・Windowsでは、計測を開始した時刻から終了した時刻までの時間を計る。
・Linux/vxWorksでは、実際にCPUを使用していた時間を計る。
お試し版でsleep()を使用してみたところ、後者では処理時間が計れなかった。
tickGet()
[プラットフォーム]
・Windows ・・不可
・Linux ・・・不可
・vxWorks ・・可
[精度]
・システムクロックに依存(※)
[参考]
http://www.vxdev.com/docs/vx55man/vxworks/ref/tickLib.html
https://supportforums.cisco.com/docs/DOC-31076
vxTimeBaseGet()
[プラットフォーム]
・Windows ・・不可
・Linux ・・・不可
・vxWorks ・・可
[精度]
・ナノ秒(nsec)
[参考]
http://borkhuis.home.xs4all.nl/vxworks/vxw_pt2.html
※システムクロックとはtick値(1秒当たりのクロック数)のことで、以下で定義されている。
time.hにdefineされているCLOCKS_PER_SECの値。
なおvxWorksでは60がセットされていた。
(例)
CLOCKS_PER_SEC=1 ・・・1tick=1秒
CLOCKS_PER_SEC=60 ・・・1tick=1/60秒
この辺の話はWeb上にいくらでも転がっているので、詳細はそっちのサイトを見てもらうとして。。。
同じような話をあっちでもこっちでもーーってやるのは非効率かと判断しました(^-^;
(手を抜いただけだったりして;;