2014年3月17日月曜日
サイクロマティック複雑度
ソフトウェア開発の定量化法
共立出版」
1. 10 以下であればよい構造
2. 30 を越える場合,構造に疑問
3. 50 を越える場合,テストが不可能
4. 75 を越える場合,いかなる変更も誤修正を生む原因を作る
別な基準。(ちょっと厳しい)
1-10 :良い。
11-20 :少し複雑。危険度は小。
21-50 :複雑。危険度は大。
50以上:悪し。非常に危険!
2013年6月18日火曜日
ハードウェア構成を調べる
Linux:/usr/sbin/dmidecode
Mac:system_profiler
Windows:dxdiag、msinfo32.exe(詳細)(ファイル名を指定して実行)
2013年4月4日木曜日
OUI
OUIとは
OUI(organizationally unique identifier)とは、
イーサネットLAN内で使われるMAC(medium access control)アドレスの前半部分を指す。
MACアドレスは、LAN機器のベンダーが製品出荷時にLANアダプタなどに固定で割り当てる
48ビットのアドレス情報である。
http://itpro.nikkeibp.co.jp/article/Keyword/20070222/262809/
http://standards.ieee.org/develop/regauth/oui/public.html
「search for:」24bit 値をhexで入力。0000xx
2013年2月26日火曜日
/proc/[pid]
プロセスの情報がいろいろ入手できる
[pid]==`pgrep myprog.exe`
/proc/[pid]/fd
/proc/[pid]/stat
/proc/[pid]/status
/proc/[pid]/task
/proc/[pid]/cmdline
/proc/[pid]/exe
/proc/[pid]/maps
/proc/[pid]/smaps
/proc/[pid]/statm
2013年1月24日木曜日
gobjdump elfdump
コンパイルしたgccnバージョンを知りたい。
gobjdump -s --section .comment /path/binary
プログラム(バイナリ)が一致するのか。
elfdump -k program
checksum値を比較してみる。
gobjdump -d program
逆アセンブルして比較してみる。
2013年1月22日火曜日
Toast 11 Titanium 再インストール
Mac OSクリーンインストール後、
Toast 11 Titaniumをインストールしようとした。
アプリバンドルで購入。
販売元のダウンロードサービスが期限切れでダウンロードできない。
開発元のダウンロードサービスは、購入コードが必要。
直接購入していないので該当するような購入コードを持っていない。
Time Machine からコピー。
・アプリケーションフォルダ内のToast11フォルダ
・ライブラリ内のToast11のメニューテンプレライブラリ(場所は...)
これがないとメニューテンプレ選択でない(1種類のみとなる)
Time Machineから単純にコピーしただけだと、
Toast11起動時に常に
xxxが変更を加えようとしています
とMacの管理者パスワード入力を尋ねられる。
パスワード入力すると起動はする(使えるのかは未確認)
アプリケーションフォルダ内のtoast11フォルダを
圧縮解凍すると特権等カレントユーザーに合致した状態と
なったようで起動した。
iDVDで作成したTSフォルダをDVDに焼くことができた。
iDVDをMountain Lionで使用する方法はあとで追記する。
2012年12月27日木曜日
C言語 デバッグ用マクロ
http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html#Variadic-Macros
#define DMSG_ERR( p_fmt, ...) printk(KERN_ERR "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_WARNING(p_fmt, ...) printk(KERN_WARNING "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_NOTICE( p_fmt, ...) printk(KERN_NOTICE "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_INFO( p_fmt, ...) printk(KERN_INFO "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
2012年12月20日木曜日
2012年12月19日水曜日
(DVD)メディアのチェックサム md5sum
チェックサム md5sum
(DVD)メディアは単純にチェックサムを比較することが出来ない。
http://www.debian.org/CD/faq/index.ja.html
$ /usr/bin/isosize -x /dev/hdc
sector count: 4425, sector size: 2048
$ dd if=/dev/hdc count=4425 bs=2048 | md5sum
書き込み済みの光学メディアを検証する場合
メディアの種類によっては ISO イメージにあるものよりも多くのバイト数を返してくる可能性
この後方に付くゴミは TAO モードで書き込まれた CD、追記された DVD-R[W]、
フォーマット済みの DVD-RW, DVD+RW, BD-RE、さらに USB キーの場合不可避
ISO イメージ自体にあるのと正確に同数のセクタのデータをメディアから読み込む必要があり
メディアからそれ以上に多くのバイトを読み込んだ場合チェックサムの結果は違うものになる
2012年12月14日金曜日
環境変数
forkした子プロセスは、環境変数も引き継ぐ。
getenv
putenv
setenv
unsetenv
environ (7) 大域変数
clearenv すべての環境変数をクリアする(空にする)posixでない!?
su コマンドを '-' 付加して実行すると、環境変数は引き継がない。
シェルをログインシェルにする。
/etc/profile.d/*.sh に環境変数を設定する各種スクリプトがある。
すべての環境変数を表示する。
$ gcc -Wall -o my_printenv my_printenv.c
#include <stdio.h>
extern char **environ;
int main()
{
char **ep = environ;
char *p;
FILE *fptr;
fptr = fopen("/tmp/xxx.txt", "a");
fprintf(fptr, "-------------\n");
while ((p = *ep++))
fprintf(fptr, "%s\n", p);
fclose(fptr);
return 0;
}
2012年12月11日火曜日
2012年12月5日水曜日
特殊なデバイス
/dev/null
書き込み全て破棄、読み取りは常にEOF
/dev/zero
書き込み全て破棄、読み取りは永遠にnull文字(\0)
/dev/full
書き込みは常にエラーerrno=ENOSPC(デバイス容量FULL)、読み取りは永遠にnull文字(\0)
・異常時対応の動作テストをする際に有用
・null,zeroデバイスは書き込み無視するので、不要なI/Oを破棄する際、無用のオーバーヘッドがない手頃な方法
/dev/random (暗号用。長時間I/Oブロックの可能性アリ)
/dev/urandom (普通のアプリはこちら)
乱数生成デバイス
#include <stdio.h>
int main()
{
int value;
FILE *fptr;
unsigned int w_i;
fptr = fopen("/dev/urandom", "r");
if(fptr==NULL) { return -1; }
for(w_i=0; w_i<20; w_i++) {
fread( &value, sizeof(value), 1, fptr);
printf("%2d value = 0x%08X %u\n", w_i, value, value);
}
fclose(fptr);
return 0;
}
タイマ時間
***
*
* gcc -Wall -lrt -o clock clock.c
*
***/
/***
Linux mtlx02 2.6.18-128.el5 #1 SMP Wed Dec 17 09:03:25 PM EST 2008 x86_64 x86_64 x86_64 GNU/Linux
clock=0 sec=0 nsec=999848 分解能約1ms CLOCK_REALTIME
clock=1 sec=0 nsec=999848 分解能約1ms CLOCK_MONOTONIC
clock=2 sec=0 nsec=1 分解能1ns CLOCK_PROCESS_CPUTIME_ID (TSC)
clock=3 sec=0 nsec=1 分解能1ns CLOCK_THREAD_CPUTIME_ID (TSC)
***/
#include <stdio.h>
#include <time.h>
int main()
{
clockid_t clocks[] = {
CLOCK_REALTIME, /* システム全体の実時間(real time、wall time) */
CLOCK_MONOTONIC, /* 任意の時点からの経過時間 */
CLOCK_PROCESS_CPUTIME_ID, /* プロセス毎に使用可能なCPUが備える高分解能の時計 */
CLOCK_THREAD_CPUTIME_ID, /* プロセス毎の時計と同じだが、スレッド毎に使用可能 */
(clockid_t) -1
};
char *clocksStr[] = {
"CLOCK_REALTIME", /* システム全体の実時間(real time、wall time) */
"CLOCK_MONOTONIC", /* 任意の時点からのけ化時間 */
"CLOCK_PROCESS_CPUTIME_ID", /* プロセス毎に使用可能なCPUが備える高分解能の時計 */
"CLOCK_THREAD_CPUTIME_ID", /* プロセス毎の時計と同じだが、スレッド毎に使用可能 */
""
};
int w_i;
/* 分解能表示 */
printf("clock_getres\n");
for(w_i=0; clocks[w_i]!=(clockid_t) -1; w_i++) {
struct timespec res;
int ret;
ret = clock_getres(clocks[w_i], &res);
if(ret) {
perror("clock_getres");
} else {
printf("%30s : clock=%d sec=%ld nsec=%ld\n",
clocksStr[w_i],
clocks[w_i], res.tv_sec, res.tv_nsec);
}
} /*for(w_i)*/
/* 現在時刻表示 */
printf("clock_gettime\n");
for(w_i=0; clocks[w_i]!=(clockid_t) -1; w_i++) {
struct timespec res;
int ret;
ret = clock_gettime(clocks[w_i], &res);
if(ret) {
perror("clock_getres");
} else {
printf("%30s : clock=%d sec=%ld nsec=%ld\n",
clocksStr[w_i],
clocks[w_i], res.tv_sec, res.tv_nsec);
}
} /*for(w_i)*/
return 0;
}
Linuxハングアップ次の操作
↓下記、下の項目に行くほど程度のひどいハングアップ。
・Ctrl+q(Ctrl+sを押している場合の解除)
・Ctrl+d(入力待ちの場合、入力を終了)
・Ctrl+c(プロセスの終了)
・Ctrl+\(プロセスの終了)
・Ctrl+z(プロセスの停止)
・仮想コンソールに切り替える(X上Ctrl+Alt+F2、コンソール上Alt+F3)
・Ctrl+Alt+BackSpace(X上Xセッションを終了)
・CTRL+ALT+DEELTE(再起動)
・Alt-SysRq-s(sync) → Alt-SysRq-u(unmount) → Alt-SysRq-b(reboot) (システム再起動)
※sysRqキーがない場合、PrintScreenキー
・Alt+SysRq+b (syncせずに再起動)
・電源ボタンを押す(押してみる)
・リセットボタンを押す(押してみる)
・電源ボタン長押し
・コンピューターの電源OFF
・電源コードを抜く
デバッグツール debug tool
実行中のアプリケーションを外から観察するコマンド
strace システムコールをトレース(カーネルと何を話しいてるか)
ltrace 共有ライブラリをトレース(*.soと何を話しいてるか)
lsof LiSt Open Files。どのファイルを使っているか調べられる。(ファイル≒unixは全てファイル)
tracef 関数呼び出しをトレース(フリーツール!?)
ftrace 関数呼び出しをトレース(フリーツール!?)
ldd 依存ライブラリ
http://d.hatena.ne.jp/koseki2/20090619/TraceProc%29
2012年11月30日金曜日
2012年11月23日金曜日
Google Document Spreadsheet 曜日 weekday
=IF(a2="", "", IF(WEEKDAY(a2, 2)=1, "月", IF(WEEKDAY(a2, 2)=2, "火", IF(WEEKDAY(a2, 2)=3, "水", IF(WEEKDAY(a2, 2)=4, "木", IF(WEEKDAY(a2, 2)=5, "金", IF(WEEKDAY(a2, 2)=6, "土", IF(WEEKDAY(a2, 2)=7, "日"))))))))