MW211 EXIT

devlog
PostgreSQL/等価なもの(1)
2013年04月30日
「current_date」は「'now'::date」とも書ける。
分類:PostgreSQL
PostgreSQL/表を列みたいに誤用したところ…
2013年04月29日
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 ORDER BY 列 ASC;                                          │
└──────────────────────────────────────┘
とすべきところを、誤って
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 ORDER BY 表 ASC;                                          │
└──────────────────────────────────────┘
としてしまった。(「ORDER BY」の指定が列ではなく表)

でも、結果がちゃんと出力された。
一体、何をもってソートされたのだろう?

「GROUP BY」の場合は、どうなんだろう?
ということで、試行錯誤の末、
「GROUP BY 表」でエラーとならないSQL文を見つけ出した。
┌──────────────────────────────────────┐
│SELECT 表 FROM 表 GROUP BY 表;                                              │
└──────────────────────────────────────┘

っていうか、以下ができてしまうじゃないか。
┌──────────────────────────────────────┐
│SELECT 表 FROM 表;                                                          │
└──────────────────────────────────────┘

出力結果は「(■,■…)」みたいな感じで、型がその表名型だって。

ってことは、さっきの「ORDER BY」の件は、だいたい察しがつくわな。
分類:PostgreSQL
PostgreSQL/除数ゼロエラーとNULL
2013年04月28日
割り算の場合、割る数(分母)を「0」にすることはできない(除数ゼロエラー)。
SQL文でも同じで、「division by zero」エラーが発生する。
┌──────────────────────────────────────┐
│SELECT 6 / 3;                                             →「2」(integer型)│
├──────────────────────────────────────┤
│SELECT 6 / 0;                             →エラー(ERROR:  division by zero)│
└──────────────────────────────────────┘
では、NULLは?
NULLは「0」なのか?分母にとれない?

いやいやそんなことはない。
NULLは何もかもをNULL色に染めてしまうのだ。
┌──────────────────────────────────────┐
│SELECT 6 / NULL;                                       →「NULL」(integer型)│
├──────────────────────────────────────┤
│SELECT NULL / 3;                                       →「NULL」(integer型)│
└──────────────────────────────────────┘
ということで、NULLについては除数ゼロエラーの対策が要らないというお話でした。
#但し、システム毎に仕様があるだろうからそれに合わせるように注意が必要
  例えば、NULLが分母になる場合100%扱いにするとかの、ローカルルールについてだ
分類:PostgreSQL
SERVER_NAMEとHTTP_HOSTの違い
2013年04月27日
CGI環境変数「SERVER_NAME」($_SERVER['SERVER_NAME'])と
「HTTP_HOST」($_SERVER['HTTP_HOST'])の内容はたいていは同じなので混同してしまう。

これ二つの違いとは?
簡単にいえば、「SERVER_NAME」はサーバが持っている名前、
「HTTP_HOST」はブラウザがサーバ名として要求された名前
(人間に例えれば、「鈴木く~ん」と呼ばれた名前ってことか)ってこと。

よって、「クロスサイトスクリプトく~ん」と呼ばれる可能性があるので
「HTTP_HOST」を扱う場合には、サニタイズを施す必要がある。
#常識的には自ら「クロスサイトスクリプトくん」を自称することはないので
  「SERVER_NAME」の方はサニタイズ不要

もう少し厳密にいうと
【SERVER_NAME】
  Apacheの設定ファイル「httpd.conf」で設定している
  (文字通り)「ServerName」の値
  但し、「UseCanonicalName」が「On」に設定されないと反映されないらしく
  IPアドレスやドメイン名となることが多い
【HTTP_HOST】
  リクエスト電文中の「host:」の値

また、ポート番号(例えば「:8080」)を指定した場合は、
呼びかけた側の「HTTP_HOST」はポート番号も付随するが、
呼ばれた側の「SERVER_NAME」はサーバ名はポート番号を含まないので
ポート番号は除外された形となる(らしい)。
ちなみにポート「:80」で実験してみたが、
ブラウザが「:80」を勝手に省略してしまうらしく、差分はなかった。
分類:Apache
C言語/constまとめ(1)
2013年04月26日
  const宣言の有無が違うポインタはそのままやりとりできない
  ┌────────────────────────────────────┐
  │    const int*  constポインタ;                                          │
  │          int*  非constポインタ;                                        │
  │×  非constポインタ = constポインタ;                // そのままでは不可 │
  │×  constポインタ   = 非constポインタ;              // そのままでは不可 │
  │○  非constポインタ = (int*)constポインタ;          // キャストすれば可 │
  │○  constポインタ   = (const int*)非constポインタ;  // キャストすれば可 │
  └────────────────────────────────────┘
分類:C/C++
Excel/ランダムサンプル
2013年04月25日
Excel関数にて、あらかじめ決まった選択肢のうちから適当に表示したい場合。
┌──────────────────────────────────────┐
│=CHOOSE(ROUNDUP(RAND()*3,0),'A','B','C')                                    │
└──────────────────────────────────────┘
「A」か「B」か「C」がランダムで表示される。
分類:Excel
PostgreSQL/更新順は指定できませんよ
2013年04月24日
挿入時には挿入順(並び順)を指定できる。
┌──────────────────────────────────────┐
│INSERT INTO 出力表 (列) SELECT 列 FROM 入力表 ORDER BY 列 ASC;              │
└──────────────────────────────────────┘

更新時には更新順(並び順)を指定できない。以下は(「ORDER BY」以降)無理。
┌──────────────────────────────────────┐
│UPDATE 出力表 SET 列 = 入力表.列 FROM 入力表 ORDER BY 入力表.列 ASC;        │
└──────────────────────────────────────┘

解決策としてはSQL関数を使うってのがある。
┌──────────────────────────────────────┐
│仮入力表 RECORD;                                       DECLARE領域で変数定義│
├──────────────────────────────────────┤
│FOR 仮入力表 IN SELECT 列 FROM 入力表 ORDER BY 列 ASC LOOP                  │
│    UPDATE 出力表                                                           │
│        SET 列 = 仮入力表.列                                                │
│        WHERE 列 = 仮入力表.列;                                             │
│END LOOP;                                                                   │
└──────────────────────────────────────┘

ま、たいていは影響のない話だろう。タイムスタンプをつけても同一になるだけだし。
これが問題となったのは、「UPDATE」にトリガを仕込んで
変更履歴を「INSERT」させた時。
変更履歴が意図した順で追加されなかったのだ。
分類:PostgreSQL
C言語/小数点以下を四捨五入
2013年04月23日
「0.5」を足して、小数点以下を切り捨てる方式がオーソドックスか。
  ・0.4 → 0.9 → 0
  ・0.5 → 1.0 → 1
  ・0.6 → 1.0 → 1
負の数の場合は、反対になるので「0.5」を引いて小数点以下を切り捨てる。

double型を使う場合は、こんな感じ。これが基本。
┌──────────────────────────────────────┐
│if (被除数 < 0) {                                                           │
│    商 = (int)(((double)被除数 / 除数) - 0.5);                              │
│} else {                                                                    │
│    商 = (int)(((double)被除数 / 除数) + 0.5);                              │
│}                                                                           │
└──────────────────────────────────────┘

しかし、double型を使うと精度が落ちるので、使いたくないという場合には、
「10」を掛けて、「5」を足して(引いて)、「10」で割って、
小数点以下を切り捨てるという風にまわり道になる。
┌──────────────────────────────────────┐
│if (被除数 < 0) {                                                           │
│    商 = (int)((((被除数 * 10) / 除数) - 5) / 10);                          │
│} else {                                                                    │
│    商 = (int)((((被除数 * 10) / 除数) + 5) / 10);                          │
│}                                                                           │
└──────────────────────────────────────┘
順番を間違えて「(被除数 / 除数) * 10」としないように注意。
一度たりともダークゾーン(小数点以下)へ近づかないようにするのがポイント。
分類:C/C++
PostgreSQL/最大値を更新(2)
2013年04月22日
もうちょっと簡単な方法。
これだと、更新するレコードのみを更新できる。
┌──────────────────────────────────────┐
│UPDATE 更新表                                                               │
│  SET 最大 = 入力表.値                                                      │
│  FROM 入力表                                                               │
│  WHERE 入力表.キー = 更新表.キー                                           │
│    AND (入力表.値 > 更新表.最大                                            │
│      OR 更新表.最大 IS NULL)                                               │
└──────────────────────────────────────┘
ちなみに「SET 最大 =」のところを「SET 更新表.最大 =」としてはいけないみたい。

それと、これはPostgreSQL独自の仕様の模様。
分類:PostgreSQL
シェル/囲いの違い
2013年04月18日
シェルにおいてはいろいろな記号で変数や処理を囲うことになるが
この違いをまとめた。

まず、変数は「$変数」でも「${変数}」でもよい。
「{}」の扱いはこの程度の認識でOK。

それ以外の各記号の違いはこんな感じとなる。
┌───┬────┬────┬────────────────────────┐
│ 囲い │変数展開│処理展開│                      説明                      │
├───┼────┼────┼────────────────────────┤
│ '■' │   ×   │   ×   │純粋な文字列として扱われる                      │
├───┼────┼────┼────────────────────────┤
│  ■  │   ○   │   ×   │(囲いなし)                                      │
├───┼────┼────┼────────────────────────┤
│ "■" │   ○   │   △   │                                                │
├───┼────┼────┼────────────────────────┤
│ `■` │   ×   │   ○   │ネストができない旧型                            │
├───┼────┼────┼────────────────────────┤
│$(■) │   ×   │   ○   │二重括弧で四則演算もできる新型                  │
└───┴────┴────┴────────────────────────┘

変数展開についてのそれぞれの結果は以下の通り。
┌──────────────────────────────────────┐
│$ I=8;echo '$I';                             →展開なし「$I」               │
│$ I=8;echo $I;                               →変数展開「8」                │
│$ I=8;echo "$I";                             →変数展開「8」                │
│$ I=8;echo `$I`;                             →処理展開「ash: 8: not found」│
│$ I=8;echo $($I);                            →処理展開「ash: 8: not found」│
└──────────────────────────────────────┘

二重括弧による四則演算についてのそれぞれの結果は以下の通り。
┌──────────────────────────────────────┐
│$ echo '(1 + 1)';                                              →「(1 + 1)」│
│$ echo (1 + 1);     →「ash: Syntax error: word unexpected (expecting ")")」│
│$ echo "(1 + 1)";                                              →「(1 + 1)」│
│$ echo `(1 + 1)`;                                    →「ash: 1: not found」│
│$ echo $((1 + 1));                                                   →「2」│
├──────────────────────────────────────┤
│$ echo $(expr 1 + 1);                                                →「2」│
│$ echo `expr 1 + 1`;                                                 →「2」│
└──────────────────────────────────────┘
「$(())」は「expr」コマンドと同等になる、これは便利。
分類:Linuxシェル
前へ 1 2 次へ