MW211 EXIT

devlog
SVN/実行権限
2013年05月01日
Linuxからシェル等を追加する場合には、その時点の実行権限で追加され、
チェックアウト(更新)やエクスポートするとその実行権限が初期設定される。

しかし、Windowsの場合は実行権限という概念自体がないので
「rw-r--r--」(644)の権限で登録されてしまう。

実行権限を登録したい場合には、プロパティを選び。
┌─────────────┐
│├SVN更新                 │
│├SVNコミット             │
│└TortoiseSVN             │
│  └プロパティ            │
└─────────────┘
そこから、「新規→実行形式」を選ぶ。
┌プロパティ───────────────────┐
│┌──────────────────────┐│
│└──────────────────────┘│
│┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐│
││    ││    ││    ││    ││    ││新規││
│└──┘└──┘└──┘└──┘└──┘└└実行形式
└────────────────────────┘
そこで「実行形式」のラジオボタンを有効とすればOK。
┌──────────────────────────┐
│【注意】このプロパティはWindowsでは効果がありません │
│  ●実行形式                                        │
│  ○非実行形式                                      │
│┌─────┐┌─────┐┌─────┐          │
││    OK    ││キャンセル││  ヘルプ  │          │
│└─────┘└─────┘└─────┘          │
└──────────────────────────┘
これで「rwxr-xr-x」(755)の権限となるので、このままコミットすればよい。

ただし、これをWindows上(TortoiseSVNとか)から、チェックアウト(更新)等しても
ダメで、Linuxコマンドでチェックアウト(更新)等して初めて権限が反映される。
ということに注意。
分類:SVN
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
前へ 1 … 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 … 156 次へ