匠の伝承w マルチな時代の設計と開発 パート7.

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

1 なんとなく Ajax ~新しくて古い XMLHttp 川合孝典 (Kansai.pm) 2005/5/22.
OWL-Sを用いたWebアプリケーションの検査と生成
シーケンス図の生成のための実行履歴圧縮手法
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
ブラウザの基本操作 前のページに戻る ブラウザの左上にある 「戻る」ボタンで、自分がたどってきた一つ前のページに戻ることができます。
第3回参考文献発表 PHP言語 岩永逸平.
東京工科大学 コンピュータサイエンス学部 亀田弘之
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
Struts1.xの脆弱性(CVE ) に対するSDEの対処:推奨タイプ (サンプルソースコードの公開)
IO - 入出力 小西 亨.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
Log4netを使ったロギング機能 オガシン.
Log4netを使ったロギング機能 オガシン.
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
ケータイキット for Smarty のご紹介
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
DBバックアップあーんどリカバリ HN おいろん.
DBバックアップあーんどリカバリ HN おいろん.
自作組込みOSを エミュレータで 動かしてみた 坂井弘亮 (KOZOSプロジェクト) Twitter ID:kozossakai.
「まめだくん Ver.1.0」 特徴と利用方法.
匠の伝承w マルチな時代の設計と開発 パート2.
RAD Studio 14/09/27 TEffectを使った綺麗なForm
第8回 プログラミングⅡ 第8回
HTTPプロトコルとJSP (1) データベース論 第3回.
変数のスコープの設計判断能力 を育成するプログラミング教育
HTTPプロトコル J2EE I 第7回 /
Linuxカーネルについて 2014/01.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
第8章 Web技術とセキュリティ   岡本 好未.
概要 Boxed Economy Simulation Platform(BESP)とその基本構造 BESPの設計・実装におけるポイント!
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング 2 ファイル処理.
匠の伝承w マルチな時代の設計と開発 パート7.
図書館職員のための アプリケーション開発講習会
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
Microsoft MVP for Development Tools – Visual C++
Windows PowerShell Cmdlet
マルチスレッド処理 マルチプロセス処理について
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング演習I 2003年6月25日(第10回) 木村巌.
Microsoft MVP for Development Tools – Visual C++
前回の練習問題.
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
Nakano School of Business 経営情報ビジネス科 【 C言語入門(Test2)】
ゲーム開発モデルの基礎.
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
Microsoft MVP for Development Tools – Visual C++
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
C言語 はじめに 2016年 吉田研究室.
マイグレーションを支援する分散集合オブジェクト
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
匠の伝承w マルチな時代の設計と開発 パート4.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
「マイグレーションを支援する分散集合オブジェクト」
JSPの基本 データベース論 第2回.
標準入出力、変数、演算子、エスケープシーケンス
匠の伝承w マルチな時代の設計と開発 パート4.
モジュール分割.
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

匠の伝承w マルチな時代の設計と開発 パート7

スピーカー自己紹介 / \ / ─ ─\ ゆーちです。 / ,(●) (●)、\ 現役のエンジニアです。プログラム書いてます。     /      \    /  ─    ─\    ゆーちです。  /    ,(●) (●)、\   現役のエンジニアです。プログラム書いてます。  |       (__人__)    |     \     ` ⌒´   /    本名は、内山康広といいます。 ,,..イ.ヽヽ、___ ーーノ゙-、.    31歳(H)です。おっさんです(笑) :   |  ‘; \_____ ノ.| ヽ I     |  \/゙(__)\,|  i |      >   ヽ. ハ  |   ||  株式会社シーソフト代表取締役です。                  自宅警備員化してますが、ほっといてくださいw BkReplyer を使いましょう(笑)。 http://www.vector.co.jp/soft/win95/net/se476325.html Special thanks for 2ch.

ログって見る。 ログ全般の話 ログ出力を実装する。 要求と技術的な反映方法を重点にお話します。 本日の内容 ログって見る。  ログ全般の話  ログ出力を実装する。 要求と技術的な反映方法を重点にお話します。 log4.net を使えばすむ、という話ではないです。

OSのログイン/ログアウト、ネットワークアクセスの記録、 ハードウェアやサービスの稼働状況 ・アプリケーションのログ ログってどのように利用してますか? ・システムのログ OSのログイン/ログアウト、ネットワークアクセスの記録、 ハードウェアやサービスの稼働状況 ・アプリケーションのログ 金融などで利用されるログ オペレータと金銭の動き ・デバッグ用のログ printf や TRACE の代用:恒久的に記録

大別するとこんなかんじ 1.セキュリティログ ログイン、アクセスの認可、リソースの取り扱いなどに関する処理の記録 ⇒セキュリティの診断、証拠の収集や解析 2.業務ログ  OS、AP、主要業務の動作記録  ⇒問題発生時の解析、障害時の復旧 3.ソフトウェアログ  ・致命的なエラーや例外発生時の記録  ・処理の続行に問題はないが、記録しておくべき警告レベル  ・マウスやキーボードなどのオペレーションのトレース  ・タスクやスレッドの切り替わり、状態遷移の記録  ・通信などのメッセージ送受信の記録  ・ある時点の変数の値や処理内容のダンプや記録  ・ループなどの制御事象の記録  ・単なるコメント  ⇒デバッグを目的とするものが多い

3.(ソフトウェアログ)がしっかりしていれば、 1.(セキュリティログ)、2.(業務ログ)を吸収できるはず。 ソフトウェアログ、だいじ。 3.(ソフトウェアログ)がしっかりしていれば、 1.(セキュリティログ)、2.(業務ログ)を吸収できるはず。   でも、世界中で共通の仕様があるわけではなさそう。会社やプロジェクトで   独自に実装されていて、その見方もそれぞれ固有の場合が多い。

ログ・・・こんなカンジになってませんか? 実際のログ出力(弊社ソースから抜粋) [perl] #配列生成の失敗時 $main::log->critical( "Fail to new CarrierContainer." ) if( $main::log ); [php] /*内部変数のダンプ*/ $logger->variable('$result',$result); $logger->info('$data:'.print_r($data,true)); $logger->info( "Read Config File ..................OK" ); [C++] //パケット送信内容の記録 String logString; logString.sprintf( L"送信[%s][%d] [%s]", host_.c_str(), port_, message_.c_str() ); logTextQueue->Put( logString.c_str(), strlen( logString.c_str() ) );

ログ出力の要素 ・__FILE__, __LINE__ ソースの位置、クラス名、メソッド名(デバッグ用) ・記録された時刻 ・コンテキストの位置 ・ログインユーザ、オペレータ(認証記録、データ更新記録・調査用) ・文字列。整形された文字列。(値のダンプもテキストとして出力) ・ログの区分(ログにはカテゴリレベルが必要)  致命的なエラー(ディスクフル続行不能)  一般エラー(超えた値の入力による続行不能)  警告レベルのエラー(継続は可能だが問題があるかも知れない記録)  タスクのスイッチングや、制御の流れの記録(デバッグ用)  通信電文や、要求内容とその応答内容の記録  操作内容の記録(再現性試験で利用できるようなレベル、実行したSQL文とか)  デバッグ用に解説文やコメントを出力しておく ・カテゴリレベルは、動的に変化できると望ましい 稼働中のアプリケーションにデバッグ分のログを出したり出さないようにする

・ランダムアクセスファイル(ローテーション) ⇒1つのログの長さを固定するか? ログをどこに出力するか? ・テキストファイル ・XML,CSV ・データベース ・LAN出力 ・ランダムアクセスファイル(ローテーション) ⇒1つのログの長さを固定するか?

ログ出力の簡単なサンプル Example1 簡単すぎる(笑)

機能の追加 実際の業務で、このクラスが標準的なライブラリとして使えるでしょうか? Exapmle2 1.ファイル名、行番号を追加。 2.日時を追加 3.コンテキスト情報 4.printf 形式で整形文字列を追加 5.レベルを追加 6.動的なレベル変更機能(デバッグ時と稼働時でわけたくない) このへんまで行ってみましょう。 <パラメータの考察:クラスで吸収できるものとそうでないもの> *const char *__FILE__ //フルパス名⇒△ログにはファイル名だけ *int line = __LINE__; *ELogLevel level = LOGLEVEL_ALWAYS; △SYSTEMTIME sysTime; ::GetLocalTime( &sysTime ); △ContextId = ::GetCurrentThreadId(); △ContextInfo = (unsigned int)::GetCurrentThread(); ここまでは、誰もが書きそうな内容です。 実際の業務で、このクラスが標準的なライブラリとして使えるでしょうか? Exapmle2

使えない理由 ・毎回 __FILE__, __LINE__ とタイプするの、めんどくせー。 ・printf形式のフォーマット出力をサポートしたい ・必要?不要? 出力する内容はごもっともだがシステムには不要なデータもある 出力形式は、こちらの都合に合わせたい。 ・テキストファイル?バイナリファイル? intやDWORDの値をテキスト化して記録するなどリソースの無駄遣いだ。 データベースに出力する、UDPでポート出力したい、など出力先変更 出力方法は、プロジェクトの都合に合わせたい。

理想型を考えよう ・毎回 __FILE__, __LINE__ とタイプするの、めんどくせー。 ・printf形式のフォーマット出力をサポートしたい どのような記述形式だと、開発者の負担がないか。 >記述を最小限にしたい。 LOG( L"ログ値(%d) ログメッセージ(%s)", value, text ); >レベル設定は、次のように TRACELOG( L"OnClick X(%d), Y(%d)", x, y ); DEBUGLOG( L"デバッグ=%s", text ); __FILE__, __LINE__ を書かない方法・・・ ★マクロ定義で解決しようとすると・・・ #define LOG( msg ) logger->Put( __FILE__, __LINE__, LOGLEVEL_ALWAYS, msg ); #define TRACELOG( msg ) logger->Put( __FILE__, __LINE__, LOGLEVEL_TRACE, msg ); #define DEBUGLOG( msg ) logger->Put( __FILE__, __LINE__, LOGLEVEL_DEBUG, msg ); msg に、printf 形式の可変引数をとれなくなってしまう・・・ #define LOG( format, ... ) とは、書けない・・・

Exapmle3 P.S. 最近のC++拡張でマクロ定義に可変引数が渡せるようになりましたが、それを使っても実現できませんでした。 では、どうやるか。 Example3 で実装してみましょう。

Exapmle3のポイント SLogWriter オブジェクトの生成過程、operator() でのパラメータ展開がミソ。 #define LOG SLogWriter( Logger, __FILE__, __LINE__, LOGLEVEL_ALWAYS ) : #define DEBUGLOG SLogWriter( Logger, __FILE__, __LINE__, LOGLEVEL_DEBUG )

1:ファイルをずっとオープンしたままで良いの? 2:改行コードって 0d0a とは限らないんだけど。 3:マルチスレッドで動作しないじゃんw 出力形式の変更 このままでは、まだ使えない。 テキストファイルの場合、 1:ファイルをずっとオープンしたままで良いの? 2:改行コードって 0d0a とは限らないんだけど。 3:マルチスレッドで動作しないじゃんw 4:うちは、ログはデータベースに書いてるから、このクラスは使えない では、Example4 で、出力方法を切り離してみましょう。

Example4 のポイント Adapter パターン Loggerに必要だった、初期手続き、終了手続き、書き込み手順を仮想関数化 フォーマット変更を独自拡張したクラスで実装。 マルチスレッドへの対応もOKになりました。 データベースを利用する場合のクラスをどのように実装するかは、わかりますね?

その他 利用しているライブラリのもう一つの拡張 ・すべて同じログ(ファイル)に出力するのか?    大規模システムなどでは、サブシステムごとにログを振り分けたい。    クラスごとに出力するログを変更    LogManager による、アプリケーションログの一元管理    アプリケーションには LogManager をリンクしておき、システム要件にあわせて    アダプタクラスを再利用していけば、いつでも使えます。

ログを見たい    ログは、デバッグや、運用中のシステム障害の解析に必要不可欠なものです。    横河デジタルコンピュータの TRQer プログラムの動作ログを解析し、高速に    グラフ作成してデバッグ効率を効果的にします。    私も開発に関わっています。    制御システム開発している人は、いますぐ発注してください。    (笑) http://www.yokogawa-digital.com/TRQer/

まとめ 今回は、ログを出力するというシーンを元ネタにして 汎用的なクラスライブラリにするための思考と実装の過程を説明してみました。   今回は、ログを出力するというシーンを元ネタにして   汎用的なクラスライブラリにするための思考と実装の過程を説明してみました。   ソース位置情報や時刻情報の持ち方、渡し方(可変長の引数)   できるだけ記述を簡略にするためのマクロの利用と Writer クラスの拡張。   ほかのシステムでも使えるように、出力方法を切り離して実装する Adapter クラス   C++でしかできないワザもありますが、基本的な姿勢は、    「同じようなコードを2度以上書かないようにする」   ということを常に意識することだと思います。

DLLで、今開発したようなことが実装されてます (笑) log4.net DLLで、今開発したようなことが実装されてます (笑)   レイアウト定義も別に用意できるとか便利な部分も多いですね。   あちきは、いまんとこ、使わない・・・

ご静聴ありがとうございました。 m(_._)m                                  ,.へ   ___                             ム  i  「 ヒ_i〉                            ゝ 〈  ト ノ                           iニ(()  i  {              ____           |  ヽ  i  i           /__,  , ‐-\           i   }  |   i         /(●)   ( ● )\       {、  λ  ト-┤.      /    (__人__)    \    ,ノ  ̄ ,!  i   ゝ、_     |     ´ ̄`       | ,. '´ハ   ,! . ヽ、    `` 、,__\              /" \  ヽ/    \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    /        ヽ.      ヽ::〈; . '::. :' |::/   /   ,. "         `ー 、    \ヽ::. ;:::|/     r'"      / ̄二二二二二二二二二二二二二二二二ヽ      | |       お し ま い         │|      \_二二二二二二二二二二二二二二二二ノ 次回、実際の運用やログを見るための方法を解説するかも(笑)知れません。 Special thanks for Yaruo charactors