Daily Grind

システム開発関連の忘備録です

VIPの設定

/etc/sysconfig/network-scripts/ifcfg-eth0の場合

eth0をコピーしてeth0:1を作成します。

/etc/sysconfig/network-scripts/ifcfg-eth0:1

IPADDRとDEVICEとNAMEを変更してください。

※IPADDRはVIP、DEVICEにはeth0:1のようにしてください。


 /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.9.103
NETMASK=255.255.255.0
ONBOOT=yes
NAME=eth0


/etc/sysconfig/network-scripts/ifcfg-eth0:1

DEVICE=eth0:1			※変更
BOOTPROTO=static
IPADDR=192.168.9.113		※変更(VIPを設定)
NETMASK=255.255.255.0
ONBOOT=yes
NAME=eth0:1			※変更(NAMEが無い場合は追記)

設定後はネットワークの再起動を行ってください。

service network restart

マトリクスでの論理検証(メモ)

 マトリクスでの論理検証メモ

 ※個人的なメモです。



 簡単に言うと、以下のような表を作ります。

+――――+――――――+――――――+――――――+――――――+
|    |イベント-1|イベント-2|イベント-3|イベント-N|
+――――+――――――+――――――+――――――+――――――+
|状態-1|      |      |      |      |
+――――+――――――+――――――+――――――+――――――+
|状態-2|      |      |      |      |
+――――+――――――+――――――+――――――+――――――+
|状態-3|      |      |      |      |
+――――+――――――+――――――+――――――+――――――+
|状態-N|      |      |      |      |
+――――+――――――+――――――+――――――+――――――+

 状態-1であるときに、イベント-1がきたらこうしてこうなる、
 イベント-2がきたらこうしてこうなる、… というのをマスの中に書いていくという作業です。

 これにより、ある状態で、あるイベントが発生したときの処理が明確になり、タイミング障害をつぶせます。


 マスの中は、普通、以下の内容が書かれます。
- その場合の処理内容
- 処理後の状態


 まずは期待値ではなく、現版での実際の処理内容を書いてください。

 書いてみると、おそらく、処理内容がおかしい、状態遷移がおかしい、処理がなくてマスが埋められない(これがタイミング障害と呼ばれるもの)というのが出てくると思います。

 作り方の順序としては、以下が良いでしょう(Excelが良いと思う)。

0) 何を起点にするか

起点をどこにするか、きめましょう。

1) 横軸(イベント)を抽出する。

   どんなイベントを受けるのかをずらずら書いていきます。
   たとえば「センサーからの機器検出通知受信」とか。

   ※私はイベントを先に抽出する方が楽だと思いますが、どうかな。
状態は、どれを状態と言うかで頭を使うので。

2) 縦軸(状態)を抽出する。

どんな状態があるのかをずらずら書いていきます。
   普通は「イベントを待っている状態」が1番に来るでしょう。

3) 各マスを埋めていきます。

パフォーマンス測定

[コンピュータの管理] - [パフォーマンス] - [データコレクター] - [ユーザー定義]
を選択し、[新規作成] - [データコレクターセット]を選択

「手動で作成する」を選択する

「データログを作成する」で「パフォーマンスカウンター」をチェック

「追加」を選択する。
※サンプルの間隔はデフォルト(15秒)でよい。

使用可能なカウンターとして、「Process」を選択し、以下を追加
・Handle Count
・Private Bytes
・Thread Count
・Working Set
・Working Set - Private
選択したオブジェクトのインスタンスから
測定するプロセスを選択する(起動しておく必要あり)

※↑のはCPUはとってないので、採取したいプロセスの
 「Process」オブジェクトから採取される「ProcessorTime」(ちがうかも)
 を採取したほうがよいかも。

で完了

追加したやつを「再生」する。
測定をやめるときは「停止」する。
 C:\PerfLogs配下にblgファイルができているので開いて確認。

テスト観点

個人的なメモです。

テスト観点としては、以下は抑えとく。


・OS種別
・ブラウザ種別
・ディスプレイサイズ、フォント、フォントサイズ
・入力値(文字列や配列が空やnull書式)
閾値(最大、最小、異常値、境界値)※桁数、文字列長、数値
・最大長文字列での表示
・文字列のエスケープ処理(CSV、URL...)
・タブオーダー
・優先度(画面の優先度、処理の優先度...)
・検索条件の一致、不一致(完全一致、前方一致...)
・メッセージ、ログ出力
・画面遷移
文字コード
・ボタン連打
・DB異常(タイムアウト、デットロック)
・Webサーバ異常
・競合(他機能との)
・多重起動
・通信速度(帯域)
・高負荷
・多言語(表示、領域に収まるか、非互換はないか)
・前版と互換性の確認(ソート順が変わって非互換になったり)
・多数台環境
・長期間稼動(プロセスのメモリ増加、CPU増加、差分をチェック)
・ファイルエラー、競合
・ネットワーク切断、復旧
・リトライ処理(エラー発生後に正常動作するか等)
・その他エラー系、異常系
・ユーザ権限
・下位互換

gettextによる多言語化

目次
1.gettextによる多言語化の基本的な処理手順
2.サンプル
3.懸念事項



1.gettextによる多言語化の基本的な処理手順
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

(1) ソースコードに、"xgettext"で検出する為のマクロ定義を埋め込む。
  setlocale()など必要な前処理やヘッダファイルインクルードを組み込む。
(2) xgettextでメッセージを抽出し、翻訳のためのテンプレートファイル(.potファイル)を作成
(3) テンプレートファイルを基に各言語に翻訳し、テンプレートカタログ(.poファイル)を作成
(4) メッセージカタログをバイナリファイル(.moファイル)に変換する
(5) 作成したバイナリファイルをロケールディレクトリに置く。


2.サンプル
 ̄ ̄ ̄ ̄ ̄ ̄
以下のソースを多言語化してみる。

 【test.c】

#include <stdio.h>                     
                                       
char *msg = "GNU gettext excersize";   
                                       
int main() {                           
    puts("Hello, World!");             
    puts(msg);                         
    return 0;                          
}                                      

(1) ソースコードに、"xgettext"で検出する為のマクロ定義を埋め込む。
  setlocale()など必要な前処理やヘッダファイルインクルードを組み込む。

 【test.c】

#include <stdio.h>                                                                      
                                                                                        
/* setlocale() */                                                                       
#include <locale.h>                                                                     
                                                                                        
/* bindtextdomain(), textdomain() */                                                    
#include <libintl.h>                                                                    
                                                                                        
#define _(String) gettext(String)                                                       
#define N_(String) gettext_noop(String)                                                 
#define gettext_noop(String) (String)                                                   
                                                                                        
char *msg = N_("練習サンプル");                                                         
                                                                                        
int main() {                                                                            
    /* ロカール名を環境変数から取得 */                                                  
    setlocale(LC_ALL, "");                                                              
    /* ドメイン名"test"のメッセージカタログディレクトリをカレントディレクトリに設定 */  
    bindtextdomain("test", ".");                                                        
    /* ドメイン名を"test"に設定 */                                                      
    textdomain("test");                                                                 
	                                                                                     
    puts(_("こんにちは、世界!"));                                                      
    puts(_(msg));                                                                       
    return 0;                                                                           
}                                                                                       

コンパイル

	$ gcc -Wall -o test test.c   
	$ ./test                     

(2) xgettextでメッセージを抽出し、、翻訳のためのテンプレートファイル(.potファイル)を作成する

	$ xgettext -k"_" -k"N_" -o test.pot test.c --from-code=UTF-8  
	$ ./test                                                      

  ※キーワードに"_", "N_"の二種類を指定することで、両方のマクロが適用された翻訳対象文字列を抽出できる。

(3) テンプレートファイルを基に各言語に翻訳し、テンプレートカタログ(.poファイル)を作成する

$ cp test.pot en.po

  en.poを編集して英訳する。

 【en.po】

	"Content-Type: text/plain; charset=UTF-8\n"   ※今回のサンプルではUTF-8を指定した。
	...                                           
	#: test.c:13                                  
	msgid "練習サンプル"                          
	msgstr "GNU gettext excersize"                
	                                              
	#: test.c:23                                  
	msgid "こんにちは、世界!"                    
	msgstr "Hello, World!"                        


(4) メッセージカタログをバイナリファイル(.moファイル)に変換する

	$ msgfmt -o test.mo en.po           

(5) 作成したバイナリファイルをロケールディレクトリに置く。

	$ mkdir -p ja/LC_MESSAGES             
    $ cp test.mo en/LC_MESSAGES/test.mo   

(6) 動作確認

	$ LANG=C ./test                       
	こんにちは、世界!                    
	練習サンプル                          
	                                      
	$ LANG=en_US.UTF-8 ./test             
	Hello, World!                         
	GNU gettext excersize                 


3.懸念事項
 ̄ ̄ ̄ ̄ ̄ ̄
(1) LANG=Cの場合の表示。

 「LANG=C」では、動作的にはmsgidがそのまま出力されます。
 今回は、_("日本語")のメッセージカタログを持つことになるので
 「LANG=C」だと日本語リテラルで出力されます.

(2) ソースの文字コード

 ソースファイルの文字コードは統一しておく必要があります。
 既存ソースの文字コードが統一されていない場合は文字コードの変更が必要です。

Gitで特定のバージョンのソースを取得


■特定のバージョンのソースを取得する方法
 あるbranchの最新版でなく、以前のバージョンのソースを取得する方法です。
 ※ローカルに最新のクローンがある状態前提です。

 ①右クリックのメニューの TortoiseGIT>切り替え> [...]をクリック
 ②対象ブランチを右クリック > ログを表示
 ③対象のコミットログを右クリック > ここへ切り替え
 ④「新しいブランチを作成」のチェックは外して、OKボタンを押下。

 単純にログ画面を表示して③からの操作をするだけでもOKです。