MW211 EXIT

devlog
C/文字列のコピー
2012年10月17日
┌──────────────────────────────────────┐
│char    *in;                                                                │
│char    out[16];                                                            │
└──────────────────────────────────────┘
出力文字列が配列でサイズが決まっているが、
入力文字列がポインタでサイズがわからない場合に、コピーする方法。(in→out)

入力サイズが大きすぎて、末尾のNULL(\0)が落ちてしまうと例外の元になる。

「入力サイズ≦出力サイズ」がある程度保証されているのであれば、
strcpy()を使ってしまえばよい。
┌──────────────────────────────────────┐
│if (strlen(in) < sizeof(out)) {                                             │
│    strcpy(out, in);                                                        │
│}                                                                           │
└──────────────────────────────────────┘
strlen()のサイズと末尾の\0を足したサイズがsizeof()より大きくなってはいけないので
「<=」ではなく「<」である点に注意。

サイズいっぱいにぎりぎりまでコピーしたい場合は、strncpy()を使う。
┌──────────────────────────────────────┐
│memset(out, 0, sizeof(out));                                                │
│strncpy(out, in, sizeof(out) - 1);                                          │
└──────────────────────────────────────┘
末尾の\0分引いたサイズをコピーすることになる。
また、末尾が\0であることを保証するために、直前に\0(0)で全クリアが必要だ。
分類:C/C++
SVN/差分物件の置換方法
2012年10月15日
SVN管理された環境で対象とするフォルダを右クリックし、
「Tortoise」→「ログを表示」を選択。

更新履歴(ログメッセージ)が表示されるので、
対象となる期間をShift(もしくはCtrl)を押しながら、全て選択(反転させる)。
右クリックし「リビジョンを比較」を選択。

差分ファイルが一覧表示されるので、
Shift(もしくはCtrl)を押しながら、全て選択(反転させる)。
右クリックし「選択をエクスポート」を選択。

出力先を聞いてくるので、任意のフォルダ配下を選択すると、
そこにフォルダ構成を維持して差分ファイルが出力される。

これらを丸ごと既存物件に上書する。
分類:SVN
C言語/文字列の自家生成
2012年10月14日
自前で文字列を生成してそのポインタを返却する関数があった場合、
返却する文字列の実体は「static変数」にしておかなければならない。
なぜなら、関数が終了した時点で、実体がなくなってしまうからである。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    static const char  str[4];                                              │
│    sprintf(str, "%s", "abc");                                              │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
但し、ポインタアドレスを中継するだけならば、「static変数」でなくてもよい。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str;                                                       │
│    getSub(str);  // 文字列のアドレスが返却される                           │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
なので、こんな感じで初期化したりできる。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str = "";  // 初期化                                       │
│    getSub(str);  // 文字列のアドレスが返却される                           │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
極端な話、以下のようなものもOKだ。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str = "xyz";                                               │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
文字列リテラル(上記の例では"abc")は、無条件でstaticでconstなものになるらしい。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    static const char*  str = "abc";                                        │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++
C言語/ポインタのキャスト
2012年10月13日
ポインタをキャストする場合、(括弧の中にあるとはいえ)前方に「*」があるので、
実体値となってしまうような錯覚をするがそれはない。

ポインタ「int* a;」を「b = (unsigned int*)a;」のようにキャストした場合、
「b」にはアドレスが代入される(「*a」ではない)。
つまり「unsigned int* b;」と定義しておかなければならない。
「int c;」に代入したい場合には、「c = *a;」、
「unsigned int d;」に代入したい場合には「d = *((unsigned int*)a);」だ。
┌──────────────────────────────────────┐
│int*           a;                                                           │
│unsigned int*  b = (unsigned int*)a;                                        │
│int            c = *a;                                                      │
│unsigned int   d = *((unsigned int*)a);                                     │
└──────────────────────────────────────┘
分類:C/C++
ExcelVBA/英字を含むかの判定
2012年10月12日
「Like」を使う。
┌──────────────────────────────────────┐
│If Selection.Cells.Value Like "*[A-Za-z]*" Then                             │
│    MsgBox "英字を含む"                                                     │
│End If                                                                      │
└──────────────────────────────────────┘

反対の場合は、こう。
┌──────────────────────────────────────┐
│If Not Selection.Cells.Value Like "*[A-Za-z]*" Then                         │
│    MsgBox "英字を含まない"                                                 │
│End If                                                                      │
└──────────────────────────────────────┘
「If 調査対象 Not Like」ではなく「If Not 調査対象 Like」なので注意。

なお、単純に特定の文字(例えば「A」)を含むかの判定は「InStr()」を使う。
┌──────────────────────────────────────┐
│If InStr(Selection.Cells.Value, "A") > 0 Then                               │
│    MsgBox "Aを含む"                                                        │
│End If                                                                      │
└──────────────────────────────────────┘

反対の場合は、以下のいずれか。
┌──────────────────────────────────────┐
│If InStr(Selection.Cells.Value, "A") = 0 Then                               │
│    MsgBox "Aを含まない"                                                    │
│End If                                                                      │
├──────────────────────────────────────┤
│If Not InStr(Selection.Cells.Value, "A") > 0 Then                           │
│    MsgBox "Aを含まない"                                                    │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
Excel2010/マクロメニューの表示方法
2012年10月11日
「ファイル」→「オプション」→「リボンのユーザー設定」にて
「開発」のチェックボックスにチェックを入れる。
┌─────────────────────┐
│Excelのオプション                         │
├──────────┬──────────┤
│                    │┌──────┬─┐│
│リボンのユーザー設定││メインタブ  │▼││
│                    │└──────┴─┘│
│                    │┌────────┐│
│                    ││メインタブ      ││
│                    ││■開発          ││
│                    │└────────┘│
├──────────┴──────────┤
│                                      [OK]│
└─────────────────────┘
分類:Excel
PostgreSQL/並び順の更新
2012年10月10日
対象列を基準として並び順を更新したい場合のSQL文。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 並び順 = (SELECT COUNT(*)                                           │
│                      FROM 表 AS t1,                                        │
│                           表 AS t2                                         │
│                      WHERE 表.主キー  = t1.主キー                          │
│                        AND t1.対象列 >= t2.対象列                          │
│                      GROUP BY t1.対象列)                                   │
└──────────────────────────────────────┘
分類:PostgreSQL
CSS/Chromeのinpuタグの横幅パーセント指定
2012年10月09日
「tdタグ」中に「inputタグ」による入力欄を設置し、
その入力欄を如何なる時も「tdタグ」いっぱいに広げて表示させたいケースがあった。

なので、「inputタグ」の「width」指定を「100%」とし、
「tdタグ」の「width」指定に「px」単位や「em」単位で横幅を指定して
自由に制御するように企てた。

たいていのブラウザは意図した通りに「inputタグ」入力欄が追従したのだが、
「Chrome」だけは違った。

「tdタグ」の「width」を狭くしても効かないのだ。
「tdタグ」が広がってしまう。
これでは間延びしていけない。

どうしたものかと途方に暮れていたところ
「tdタグ」の「width」指定を「max-width」指定に代えたらうまくいった。

でも、弊害が怖い。。。。。
分類:CSS
CSS/width
2012年10月08日
IE8で画面が小さいと「width」が効かない。

:
:
:

「min-width」だと効いた。

う~ん。。。。
分類:CSS
PostgreSQL/表から該当項目数を求める
2012年10月07日
┌──────────────────────────────────────┐
│┌────┬────┬────┬────┬────┐                        │
││  キー  │  枝番  │小条件1 │小条件2 │小条件3 │                        │
│├────┼────┼────┼────┼────┤┐                      │
││   A   │    1   │   ○   │        │        ││                      │
│├────┼────┼────┼────┼────┤│                      │
││   A   │    2   │        │        │   ○   ││                      │
│├────┼────┼────┼────┼────┤│グループ              │
││   A   │    3   │   ○   │   ○   │        ││                      │
│├────┼────┼────┼────┼────┤│                      │
││   A   │    4   │        │        │   ○   ││                      │
│├────┼────┼────┼────┼────┤┘                      │
││   B   │    1   │        │   ○   │        │                        │
│└────┴────┴────┴────┴────┘                        │
│                    └──────────────┘                        │
│                               フィールド                                   │
└──────────────────────────────────────┘
上記のようなテーブルから、グループ毎に○の数を求めるSQL文。(Aなら5つ)

┌──────────────────────────────────────┐
│SELECT キー,                                                                │
│         SUM(CASE WHEN 小条件1 = TRUE THEN 1 ELSE 0 END)                    │
│       + SUM(CASE WHEN 小条件2 = TRUE THEN 1 ELSE 0 END)                    │
│       + SUM(CASE WHEN 小条件3 = TRUE THEN 1 ELSE 0 END) AS 件数            │
│    FROM 表                                                                 │
│    WHERE 大条件 = TRUE                                                     │
│    GROUP BY キー;                                                          │
└──────────────────────────────────────┘
SUM()の中で、CASE文を使えば簡単にできる(文自体は長文になるけど)。
分類:PostgreSQL
前へ 1 2 3 次へ