MW211 EXIT

devlog
PHP/ドキュメントルート
2013年05月18日
「$_SERVER['DOCUMENT_ROOT']」にて、Apacheの設定ファイル「httpd.conf」中に
定義しているドキュメントルートが取得できる。
┌──────────────────────────────────────┐
│DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" │
└──────────────────────────────────────┘

ドキュメントルート直下に以下のソースコードを記述したファイルを定義して
これをアサインすれば、ドキュメントルートの代替にできる。
┌──────────────────────────────────────┐
│define('DOCUMENT_ROOT2', str_replace('\\', '/', dirname(__FILE__)));        │
└──────────────────────────────────────┘
ま、こいつのいいところは、ドキュメントルート以外でも使えるということだ。

ドキュメントルート配下のサブドキュメントルート的なところに置けば、
サブの中でドキュメントルートっぽく使えるようになる。
分類:PHP
IE/勝手に接続されるのを防止
2013年05月17日
某接続ツールをインストールしたら、
IEを開く度に勝手にインターネットに接続されるようになってしまった。

セキュリティの観点とかからそんな安易に接続して欲しくない。

調べたらIEの以下が「ネットワーク接続が存在しないときには、ダイヤルする」に
勝手に設定変更されていたのであった。
┌─────────────────────────────┐
│インターネットオプション                                  │
├─────────────────────────────┤
│┌────────┌──┐───────────────┐│
││                │接続│                              ││
│┌────────┘    └───────────────┐│
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
││プロキシサーバーを構成する必要がある場合は、          ││
││[設定]を選択してください。                            ││
││  ●ダイヤルしない                                    ││
││  ○ネットワーク接続が存在しないときには、ダイヤルする││
││  ○通常の接続でダイヤルする                          ││
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
└─────────────────────────────┘
「ダイヤルしない」にすればOK。
分類:ブラウザ
SQL/途中で並べ替えても保証はされませんよ
2013年05月16日
ソートキーが二つ以上ある場合、優先度の低い順にソートしていけば、
並び替えができる(Excelなんかで試してみればいい)。
  ┌─┐                    ┌─┐                    ┌─┐
  │B2│                    │A1│                    │A1│
  │A1│─ 二列目でソート →│B1│─ 一列目でソート →│A2│
  │B1│                    │B2│                    │B1│
  │A2│                    │A2│                    │B2│
  └─┘                    └─┘                    └─┘

ということで、以下のような並び替えを…
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    ORDER BY 列1 ASC,                                                       │
│             列2 ASC;                                                       │
└──────────────────────────────────────┘
以下のように副問い合わせで代用できるような気がする。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM (SELECT *                                                          │
│              FROM 表                                                       │
│              ORDER BY 列2 ASC                                              │
│          ) AS 別表                                                         │
│    ORDER BY 列1 ASC;                                                       │
└──────────────────────────────────────┘

でも、これは保証されない。
字面上は想定通りの処理順で記述したつもりでも、
オプティマイザっていうSQLを解析する機能が、処理順を適切に調整してしまうのだ。

ということで、ご注意を。
分類:SQL
PostgreSQL/avg()の精度
2013年05月15日
「avg()」と「sum()÷count()」に違いがあるか実験してみた。
┌──────────────────────────────────────┐
│WITH "data"("value") AS (                                                   │
│         SELECT trunc(random() * 10000)         --サンプル値の幅(0~9999)   │
│             FROM generate_series(1, 10000, 1)  --サンプル数(10000件)       │
│     )                                                                      │
│SELECT CASE                                                                 │
│         WHEN "avg" = ("sum" / "count") THEN '一致'                         │
│         ELSE                                '不一致'                       │
│       END AS "判定",                                                       │
│       "avg"           AS "平均",                                           │
│       "sum" / "count" AS "合計÷件数"                                      │
│    FROM (SELECT avg("value")   AS "avg",                                   │
│                 sum("value")   AS "sum",                                   │
│                 count("value") AS "count"                                  │
│              FROM "data"                                                   │
│         ) AS "as_data";                                                    │
└──────────────────────────────────────┘
違いはないみたい(同じロジックなのか?)。

ついでに実行計画をみてみた。
┌──────────────────────────────────────┐
│EXPLAIN                                                                     │
│SELECT avg(列) FROM 表;                                                     │
├──────────────────────────────────────┤
│Aggregate  (cost=コスト rows=行数 width=行幅)"                              │
│  ->  Seq Scan on 表  (cost=コスト rows=行数 width=行幅)"                   │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│EXPLAIN                                                                     │
│SELECT sum(列) / count(列) FROM 表;                                         │
├──────────────────────────────────────┤
│Aggregate  (cost=コスト rows=行数 width=行幅)"                              │
│  ->  Seq Scan on 表  (cost=コスト rows=行数 width=行幅)"                   │
└──────────────────────────────────────┘
ほぼ同じ。ほんのちょっとだけ後者の方がコストが高いようだ。
#やっぱりまわりくどいと最適化には悪影響なの?
分類:PostgreSQL
Windows/日本語入力と半角スペース
2013年05月14日
MS-IMEで日本語入力状態となっている時に、
スペースを入力すると全角スペースが入力されるが、
半角スペースを入力するために日本語入力状態をいちいち解除するのはめんどくさい。

そこで、簡単に半角スペースを入力する方法。

  「shift」+「スペース」

「shift」キーを同時に押すだけでOK。
分類:Windows
Windows7/クイック起動を表示させる方法
2013年05月13日
タスクバー(Windows画面下部)で右クリックして以下の通り「新規ツールバー」を選択。
┌────────┐
│フォルダーを開く│  ┌────────┐
│ツールバー      │→│アドレス        │
│重ねて表示      │  │言語バー        │
~~~~~~~~~~  │~~~~~~~~~
│プロパティ      │  │新規ツールバー  │←これを選択
└────────┘  └────────┘
以下のようなダイアログが表示されるので、URLを以下のように入力し、
「Quick Launch」フォルダを選択。
┌────────────────────────────────────┐
│新規ツールバーフォルダーの選択                                          │
├──┬─────────────────────────────────┤
│URL │%USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer         │
├──┴─────────────────────────────────┤
│□Quick Launch                                                          │
│□UserData                                                              │
├─────┌─────────────────────────────┐┤
│フォルダー│Quick Launch                                              ││
│          └─────────────┌────────┐┌─────┐│ 
│                                      │フォルダーの選択││キャンセル││
└───────────────────└────────┘└─────┘┘
これでタスクバー上に「Quick Launch」が表示される。
後は必要なものを適宜移動すればOK。
なお「Quick Launch」ツールバーを右クリックして、
以下のチェックをはずす(クリックする)とアイコンのみの表示になる。
┌───────────┐  ┌───────────┐
│    表示              │  │    表示              │
│    フォルダーを開く  │  │    フォルダーを開く  │
│レ  ボタン名の表示    │→│    ボタン名の表示    │
│レ  タイトルの表示    │→│    タイトルの表示    │
│    ツールバーを閉じる│  │    ツールバーを閉じる│
~~~~~~~~~~~~~  ~~~~~~~~~~~~~
│    プロパティ        │  │    プロパティ        │
└───────────┘  └───────────┘
分類:Windows
C言語/連想配列的定数のようなもの
2013年05月12日
連想配列を実装していないC言語において、
連想配列的定数のような、データベースの定数テーブル的なものを代用する処理。

まず、構造体を決める。列はいくつでもOK。
┌──────────────────────────────────────┐
│typedef struct {                                                            │
│    int    id;                                                              │
│    char*  name;                                                            │
│} DEF;                                                                      │
└──────────────────────────────────────┘

次に値を設定する。グローバル変数(配列)として先頭で定義してしまう感じか。
┌──────────────────────────────────────┐
│DEF gDef[] = {                                                              │
│    { 1,"北海道"},                                                          │
│    { 2,"青森県"},                                                          │
│    { 3,"岩手県"},                                                          │
│};                                                                          │
└──────────────────────────────────────┘

これを「id」指定で取得する関数をつくる。
┌──────────────────────────────────────┐
│DEF*  getDef(int  id) {                                                     │
│    for (int i = 0; i < (sizeof(gDef) / sizeof(gDef[0])); i++) {            │
│        if (gDef[i].id == id) {                                             │
│            return &gDef[i];                                                │
│        }                                                                   │
│    }                                                                       │
│    // 該当なしはNULLを返す                                                 │
│    return NULL;                                                            │
│}                                                                           │
└──────────────────────────────────────┘

ま、こんな感じで必要に応じて、関数をアレンジしつつ実装していくことになる。
switch-case文の雨あられよりは大分ましになるだろう。
分類:C/C++
Apache/Basic認証
2013年05月11日
Basic認証を設定したディレクトリはログインダイアログで
ログインID(ユーザ名など)とパスワードを入力して照合されないと
そのファイルにアクセスできなくなる。

ログインダイアログとか定型のものが使えるので便利かも。

実態としては、Apacheの設定にて、特定ディレクトリのアクセスを拒否した上で
Basic認証で特別に許可にしてあげますよといった感じ。

以下に設定ファイル「.htaccess」を使った場合を記述する。

設定ファイル「.htaccess」を対象とするディレクトリ直下に置く。

設定ファイル「.htaccess」の内容
┌──────────────────────────────────────┐
│<Files ~ "^\.(htaccess|htpasswd)$">                                         │
│    deny from all               ←ログイン関係のファイル以外全てアクセス拒否│
│</Files>                                                                    │
│                                                                            │
│Order deny,allow                      ←基本「拒否」、でも例外的「許可」あり│
│AuthType Basic                        ←Basic認証ですよ                     │
│AuthUserFile C:/www/.htpasswd         ←パスワードファイルのファイルパス    │
│AuthName "Password Area"              ←ログインダイアログに表示される      │
│Require valid-user                                                          │
└──────────────────────────────────────┘

設定ファイル「.htaccess」で指定したパスワードファイルの場所に
パスワードファイルを置く(指定と一致すればよく、ファイル名は任意)。
#なお、相対パスにすると、Apacheの実行ファイルからの相対パスと
  なってしまうようなので、絶対パスの指定となる。

パスワードファイル(.htpasswd)の内容
┌──────────────────────────────────────┐
│user:pass                                    ←「ユーザID:パスワード」の形式│
└──────────────────────────────────────┘
とりあえずは平文のケースは上記の通り。

ある程度暗号化(符号化?)してセキュリティを高めることはできるようだが
それについてはおいおい。
分類:Apache
Apache/ディレクトリへのアクセス
2013年05月10日
特定の相手のみアクセスを許可したい場合(残りは全てアクセス拒否)。
┌──────────────────────────────────────┐
│<Directory ディレクトリ>                                                    │
│    Order deny,allow                                                        │
│    Deny from all                                                           │
│    Allow from 特定の相手                                                   │
│</Directory>                                                                │
└──────────────────────────────────────┘
「Order」は処理順をあらわし、全てをアクセス拒否してから、
特定の相手のみ許可することになる。
よって、優先順とは逆になる。
(後の方が上書となるので結果的に優先順が高くなる)

特定の相手のみアクセスを拒否したい場合(残りは全てアクセス許可)。
┌──────────────────────────────────────┐
│<Directory ディレクトリ>                                                    │
│    Order allow,deny                                                        │
│    Allow from all                                                          │
│    Deny from 特定の相手                                                    │
│</Directory>                                                                │
└──────────────────────────────────────┘
「Order」は処理順をあらわし、全てをアクセス許可してから、
特定の相手のみ拒否することになる。
よって、優先順とは逆になる。
(後の方が上書となるので結果的に優先順が高くなる)


特定の相手はIPアドレス、ホスト名で指定します
#なお、前述の通り「all」にすれば「全て」の意味になる。

IPアドレスの場合は前方一致検索になる。
・「192.168.1.1」の場合  →  「192.168.1.1」が該当
・「192.168.1」  の場合  →  「192.168.1.0~255」が該当

ホスト名の場合は後方一致検索になる。
・「.xxx.com」の場合     →  「.xxx.com」や「xxx.xxx.com」などが該当
分類:Apache
Apache/お気に入りアイコンエラー・後編
2013年05月09日
【エラーログを抑止する方法】
  エラーを揉み消してしまう。
  Apacheの設定ファイル(httpd.conf)に以下を記述する
  ┌────────────────────────────────────┐
  │Redirect 404 /favicon.ico                                               │
  └────────────────────────────────────┘
  これは、「/favicon.ico」(ドキュメントルート直下のお気に入りアイコン)が
  見つからない(404エラー)の場合、リダイレクトする(がリダイレクト先はない)
  これにより、エラーが揉み消される。
  しかし、アクセスログは欺けない。

【アクセスログを抑止する方法】
  さすがに揉み消せないので、ログに出力させない方向で対処する。
  ┌────────────────────────────────────┐
  │SetEnvIf Request_URI "^/favicon\.ico$" no_log                           │
  │<IfModule log_config_module>                                            │
  │    CustomLog "C:/logs/access.log" common env=!no_log                   │
  │</IfModule>                                                             │
  └────────────────────────────────────┘
  「env」で「no_log」変数(変数名は任意)に条件(お気に入りアイコン)を指定して
  「!=」でこれを除外する形となる
分類:Apache
前へ 1 2 3 次へ