MW211 EXIT

devlog
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シェル
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
前へ 1 … 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 … 156 次へ