MW211 EXIT

devlog
C言語/strlen()とsizeof()の違い
2013年04月13日
基本的に「strlen()」で得られる値は、「sizeof()」で得られる値より
「1」だけ小さい(末尾の「\0」一つ分小さい)

┌──────────────────────────────────────┐
│strlen("abc")                                                            →3│
├──────────────────────────────────────┤
│sizeof("abc")                                                            →4│
└──────────────────────────────────────┘

「sizeof()」は末尾の「\0」も含めてカウントする。
逆にいえば「strlen()」は「\0」の手前までカウントする
┌────┐┌─┬─┬─┐
│strlen()││a │b │c │    → 3
├────┤├─┼─┼─┼─┐
│sizeof()││a │b │c │\0│→ 4
└────┘└─┴─┴─┴─┘
分類:C/C++
Windows7/自動ログイン
2013年04月10日
PCの電源をオンして、Windows7を起動すると、
ユーザを選択する画面が初期表示される。
ここからユーザを選択して、ログインパスワードを入力すると、
初めてそのユーザのデスクトップ画面へと進むわけだが、
これを自動化する方法がある。

この設定を行えば、電源をオンするだけで、
そのユーザのデスクトップまで直行してくれる。
ただし、セキュリティ的には弱くなるので、状況に応じて使用を検討のこと。

Windowsの「スタートメニュー」で「プログラムとファイルの検索」欄に
「netplwiz」を入力し、「ユーザーアカウント」ウインドウを開く。
┌──────────────────────────────────────┐
│ユーザーアカウント                                                          │
├──────────────────────────────────────┤
│┌────┐────┐                                                      │
││ユーザー│詳細設定│                                                      │
││        └───────────────────────────────┐│
││■ユーザーがこのコンピューターを使うには、                              ││
││  ユーザ名とパスワードの入力が必要                                      ││
││                                                                        ││
││このコンピューターのユーザー                                            ││
││┌───────┬───────────────────────────││
│││ユーザー名    │グループ                                              ││
││├───────┼───────────────────────────││
│││■admin       │Administrators                                        ││
││└───────┴───────────────────────────││
│└────────────────────────────────────┘│
│                                  ┌─────┐┌─────┐┌─────┐│
│                                  │    OK    ││キャンセル││   適用   ││
│                                  └─────┘└─────┘└─────┘│
└──────────────────────────────────────┘
既定のユーザとしたいものを、「このコンピューターのユーザー」の表から
反転させて選択。
そして「ユーザーがこのコンピューターを使うには、
  ユーザ名とパスワードの入力が必要」のチェックボックスを外す
「OK」をクリックすると、パスワードを聞いてくるので入力する。

これで次回以降、Windows起動時に、そのユーザとパスワードで自動でログインされ
初期画面がデスクトップとなる。
分類:Windows
TortoiseSVN/ローカル管理しない
2013年04月09日
一部のファイルやフォルダを更新したりコミットしたりしたくない場合に、
それらをローカル管理外とすることができる。

以下のように設定する。
┌─────────────┐  ┌────────────────┐
│└TortoiseSVN             │  │更新                            │
│  └特定のリビジョンへ更新│→├────────────────┤
└─────────────┘  │┌更新の深さ─────────┐│
                                ││┌──┬─┐┌──────┐││
                                │││除外│▼││項目を選択..│││
                                ││└──┴─┘└──────┘││
                                │└──────────────┘│
                                │                        ┌──┐│
                                │                        │ OK ││
                                │                        └──┘│
                                └────────────────┘

これで、SVN更新(ダウンロード)されなくなる。

★フォルダ単位でしか設定できない(ファイル単位での設定はできない)ので注意
分類:SVN
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++
前へ 1 2 次へ