MW211 EXIT

devlog
Smarty/コメントの改行が変わった
2013年04月08日
「Smarty3.1.7」から仕様が変わったらしく、コメントの改行の扱いが違う。
┌──────────────────────────────────────┐
│{**************}                                                            │
│{*  コメント  *}                                                            │
│{**************}                                                            │
│<HTML>                                                                      │
└──────────────────────────────────────┘
上記みたいなコメントを付けた場合

「Smarty3.1.6」だと、隙間は空かないが、
┌──────────────────────────────────────┐
│<HTML>                                                                      │
└──────────────────────────────────────┘

「Smarty3.1.7」だと、隙間が空いてしまう。
┌──────────────────────────────────────┐
│                                                                            │
│                                                                            │
│                                                                            │
│<HTML>                                                                      │
└──────────────────────────────────────┘

以下だと、「Smarty3.1.7」でも隙間が空かない。(…けどね)
┌──────────────────────────────────────┐
│{***************                                                            │
│**  コメント  **                                                            │
│****************}<HTML>                                                     │
└──────────────────────────────────────┘
分類:Smarty
C言語/文字列比較
2013年04月07日
文字列比較は「strcmp()」系関数で行う。
戻り値が、同じ場合は「0」、違う場合は「0以外(正の数・負の数)」となる

全文一致検索をしたい場合。
┌──────────────────────────────────────┐
│if (strcmp(被検索文字, 検索文字) == 0) {                                    │
└──────────────────────────────────────┘

前方部分一致検索をしたい場合。
┌──────────────────────────────────────┐
│if (strncmp(被検索文字, 検索文字, sizeof(検索文字)) == 0) {                 │
└──────────────────────────────────────┘

例としては以下のような感じとなる。
┌──────────────────────────────────────┐
│strcmp("Windows7", "Windows")                               → 非該当(0以外)│
├──────────────────────────────────────┤
│strncmp("Windows7", "Windows", sizeof("Windows"))                 → 該当(0)│
└──────────────────────────────────────┘
分類:C/C++
設計/書庫形式および圧縮形式のまとめ
2013年04月06日
独断と偏見でまとめてみた。
┌─┬─┬──────┬─┬─┬───────────────────────┐
│PC│UX│    形式    │庫│圧│                                              │
├─┼─┼──────┼─┼─┼───────────────────────┤
│-│○│tar[.tar]   │○│-│オプションで指定すれば他の圧縮とも連携できる  │
├─┼─┼──────┼─┼─┼───────────────────────┤
│-│○│compress[.Z]│-│○│かつてはUNIX系の標準であったが                │
│  │  │⇔uncompress│  │  │特許の問題でフリーでなくなった衰退            │
├─┼─┼──────┼─┼─┼───────────────────────┤
│-│○│gzip[.gz]   │-│○│UNIX系の標準                                  │
│  │  │⇔gunzip    │  │  │「GNU ZIP」の略                               │
├─┼─┼──────┼─┼─┼───────────────────────┤
│○│-│LHA[.lzh]   │○│○│かつてPC系標準であった国産圧縮形式            │
│  │  │            │  │  │近年、ウイルススキャンで                      │
│  │  │            │  │  │中身を検出できない問題を抱える                │
├─┼─┼──────┼─┼─┼───────────────────────┤
│○│○│ZIP[.zip]   │○│○│PC系の標準、UNIX系もあり                      │
│  │  │            │  │  │書庫も兼ね備えるが圧縮しながら書庫に入れる感じ│
│  │  │┌─────┤  │  ├───────────────────────┤
│  │  ││ [.jar]   │  │  │Java用標準だが、その実体は「ZIP」             │
└─┴─┴┴─────┴─┴─┴───────────────────────┘
             PC…Windows向け、UX…UNIX系向け、庫…書庫機能あり、圧…圧縮機能あり
分類:設計
C言語/NULLポインタと文字長ゼロの文字列の違い
2013年04月02日
NULLポインタを引数に入れると例外を引き起こすものでも
文字長ゼロの文字列を入れても例外とならない場合もある。

この二つの区別はなかなかつきづらい。
以下に例をまとめてみたが、実際はこんなに単純ではなく、
ポインタ(アドレス)を引き継いだりして複雑だったりする。

NULLポインタの例。
┌──────────────────────────────────────┐
│// NULLのアドレスを取得した                                                 │
│char*  str = NULL;                                                          │
└──────────────────────────────────────┘

文字長ゼロの文字列(空文字)の例。
┌──────────────────────────────────────┐
│// 空文字の文字列リテラルのアドレスを取得した                               │
│char*  str = "";                                                            │
├──────────────────────────────────────┤
│// NULL(0)で全初期化した                                                    │
│char  str[16];                                                              │
│memset(str, 0, sizeof(str));                                                │
├──────────────────────────────────────┤
│// 先頭をNULL(\0)とした                                                     │
│char  str[16];                                                              │
│str[0] = '\0';                                                              │
└──────────────────────────────────────┘
分類:C/C++
C言語/qsort()NULLあり文字列配列の場合
2013年04月01日
「strcmp()」は比較対象にNULLが入ると例外となってしまう。
一部の処理系では、比較対象の両方ともがNULLなら同一(戻り値0)とみなす場合あり

ということで、文字列の比較の場合はNULLの考慮が必要だ。

NULLが混じった文字列配列を並び替える場合。
┌──────────────────────────────────────┐
│char*  配列[] = {"ccc","aaa","eee",NULL,"ddd"};  // サンプルデータ          │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にして、NULLを先頭とする場合  → NULL,"aaa","ccc","ddd","eee"        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return -1;}                            │
│    if (*(const char**)b == NULL)   {return  1;}                            │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 昇順にして、NULLを末尾とする場合  → "aaa","ccc","ddd","eee",NULL        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return  1;}                            │
│    if (*(const char**)b == NULL)   {return -1;}                            │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にして、NULLを先頭とする場合  → NULL,"eee","ddd","ccc","aaa"        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return -1;}                            │
│    if (*(const char**)b == NULL)   {return  1;}                            │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にして、NULLを末尾とする場合  → "eee","ddd","ccc","aaa",NULL        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return  1;}                            │
│    if (*(const char**)b == NULL)   {return -1;}                            │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++
Windows7/KoreaなんとかCenter
2013年03月31日
Windows7を再インストールしてたら、
「Korea Media Player Center」と「Korea Messenger Center」ってのが
デスクトップのショートカットとしてあらわれた。

うわっ!ウイルス?って思ってしまったが、
韓国語の言語パックをインストールすると追加されるみたい。

韓国の公正取引委員会がどうしたこうしたでこんな形になってるらしい。

びっくりしたよ、もう。
分類:Windows
C言語/qsort()構造体配列の並び替え
2013年03月30日
qsort関数は、構造体配列も並び替えることができる。
構造体内には複数の項目があるので、そのうちキーとする項目を選び、
それに対して比較関数で並び替えの比較をするように実装する

数値項目をキーとして並び替える場合。
┌──────────────────────────────────────┐
│typedef struct {                                                            │
│    int   キー;                                                             │
│    char  その他項目[16];                                                   │
│} 構造体型;                                                                 │
│構造体型  配列[];                                                           │
│// 構造体配列にサンプルデータを設定するところは省略                         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return  ((構造体型*)a)->キー - ((構造体型*)b)->キー;                    │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return  ((構造体型*)b)->キー - ((構造体型*)a)->キー;                    │
│}                                                                           │
└──────────────────────────────────────┘

文字列項目をキーとして並び替える場合。
┌──────────────────────────────────────┐
│typedef struct {                                                            │
│    char  キー[16];                                                         │
│    int   その他項目;                                                       │
│} 構造体型;                                                                 │
│構造体型  配列[];                                                           │
│// 構造体配列にサンプルデータを設定するところは省略                         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);                             │
├──────────────────────────────────────┤
│// 昇順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return(strcmp((char*)(((構造体型*)a)->キー),                            │
│                  (char*)(((構造体型*)b)->キー)));                          │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return(strcmp((char*)(((構造体型*)b)->キー),                            │
│                  (char*)(((構造体型*)a)->キー)));                          │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++
C言語/qsort()
2013年03月29日
qsort関数は、第四引数に比較関数名を指定して、
その比較関数で昇順降順の実装を行う。
なお、昇順と降順は、比較する項目の順番を入れ替えるだけ切り替えることができる。

数値配列を並び替える場合。
┌──────────────────────────────────────┐
│int  配列[] = {3,1,5,2,4};  // サンプルデータ                               │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合  → 1,2,3,4,5                                             │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return *(int*)a - *(int*)b;                                             │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合  → 5,4,3,2,1                                             │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return *(int*)b - *(int*)a;                                             │
│}                                                                           │
└──────────────────────────────────────┘

文字列配列を並び替える場合。
┌──────────────────────────────────────┐
│char*  配列[] = {"ccc","aaa","eee","bbb","ddd"};  // サンプルデータ         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合  → "aaa","bbb","ccc","ddd","eee"                         │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合  → "eee","ddd","ccc","bbb","aaa"                         │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
└──────────────────────────────────────┘
strcmp()を使うところがミソ。

※NULLの対策が抜けていた(後述)
分類:C/C++
C言語/strlen()とNULL
2013年03月22日
「strlen()」は指定されたアドレスから最初に出現する「NULL(\0)」の手前までの
長さを計測してくれる関数。

ということで、つい、「NULL(\0)」を渡したら「0」になるじゃないかと錯覚しがち。
┌──────────────────────────────────────┐
│strlen("")                                                            →0   │
│strlen(NULL)                                                          →例外│
└──────────────────────────────────────┘
最初の位置がわからないんで例外になってしまうんですね。
分類:C/C++
秀丸マクロ/grep後のソース抽出
2013年03月21日
フォルダ配下をgrepした場合、たまにソースと関係ないファイルもひっかかる時がある
ということで、そういうバイナリファイルとかを除去する秀丸マクロ
(注意)実際に使う場合には、自分の環境合わせて内容を見直してください
      さもなくば本当に必要なソースまで除去されてしまう危険性があります
┌──────────────────────────────────────┐
│// 実行系ファイル                                                           │
│replaceallfast ".*\\.bin\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.cgi\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.dll\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.exe\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.sh\\(.*"               , "", casesense, regular;       │
│                                                                            │
│// 画像系ファイル                                                           │
│replaceallfast ".*\\.ico\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.jpg\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.png\\(.*"              , "", casesense, regular;       │
│                                                                            │
│// データ系                                                                 │
│replaceallfast ".*\\.csv\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.log\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.pdf\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.txt\\(.*"              , "", casesense, regular;       │
│                                                                            │
│// SubVersion                                                               │
│replaceallfast ".*\\.svn.*"                 , "", casesense, regular;       │
│                                                                            │
│// Smarty                                                                   │
│replaceallfast ".*\\\\templates_c\\\\.*"    , "", casesense, regular;       │
│                                                                            │
│// VisualStudio                                                             │
│replaceallfast ".*\\.vcxproj\\(.*"          , "", casesense, regular;       │
│replaceallfast ".*\\.vcxproj\\.filters\\(.*", "", casesense, regular;       │
│replaceallfast ".*\\.cache\\(.*"            , "", casesense, regular;       │
│replaceallfast ".*\\.cs\\(.*"               , "", casesense, regular;       │
│replaceallfast ".*\\.idb\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.ilk\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.ipch\\(.*"             , "", casesense, regular;       │
│replaceallfast ".*\\.lastbuildstate\\(.*"   , "", casesense, regular;       │
│replaceallfast ".*\\.obj\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.pch\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.pdb\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.sdf\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.sln\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.suo\\(.*"              , "", casesense, regular;       │
│replaceallfast ".*\\.tlog\\(.*"             , "", casesense, regular;       │
│                                                                            │
│// その他                                                                   │
│replaceallfast ".*\\.o\\(.*"                , "", casesense, regular;       │
│replaceallfast ".*\\.tmp\\(.*"              , "", casesense, regular;       │
│                                                                            │
│// 空行に置換していたものを最後にまとめて除去                               │
│replaceallfast "^\\n", "", regular;                                         │
└──────────────────────────────────────┘
それぞれ該当する行を空行にして最後に空行を除去するという方式だ
分類:秀丸エディタ
前へ 1 … 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 … 156 次へ