MW211 EXIT

devlog
Apache/GET・POSTパラメータの追跡2
2013年10月24日
「multipart/form-data」の場合。

ログ上には以下のようなデータが出力されている。
┌──────────────────────────────────────┐
│… mod_dumpio.c(55): mod_dumpio:  dumpio_in (data-HEAP): xxx bytes          │
│… mod_dumpio.c(74): mod_dumpio:  dumpio_in (data-HEAP): -------------------│
│… mod_dumpio.c(142): mod_dumpio: dumpio_out                                │
└──────────────────────────────────────┘

「-------------------」の部分を解析する(改行コードを変換する)と
以下のような感じで、POSTデータがあらわれてくる。
┌──────────────────────────────────────┐
│-----------------------------xxxxxxxxxxxxx                                  │
│Content-Disposition: form-data; name="id"                                   │
│abc                                                                         │
│-----------------------------xxxxxxxxxxxxx                                  │
│Content-Disposition: form-data; name="name"                                 │
│xyz                                                                         │
│-----------------------------xxxxxxxxxxxxx                                  │
│--                                                                          │
└──────────────────────────────────────┘

境界線の定義とかも実はその前で出力されている。
┌──────────────────────────────────────┐
│… mod_dumpio.c(74): mod_dumpio:  dumpio_in (data-HEAP):                    │
│                       Content-Type: multipart/form-data;                   │
│                       boundary=---------------------------xxxxxxxxxxxxx\r\n│
└──────────────────────────────────────┘
分類:Apache
Apache/GET・POSTパラメータの追跡1
2013年10月23日
GETもしくはPOSTされたデータが本当にApacheでやりとりされているのか
トレースできるモジュールがApacheにはある。

「mod_dumpio」である。
既定では封印されているので(処理が重くなる?)、解き放ってあげねばならない。

「httpd.conf」を編集する。

以下のモジュールがコメントアウトされ封印されているので
先頭の「#」を除去して封印を解く。
┌──────────────────────────────────────┐
│LoadModule dumpio_module modules/mod_dumpio.so                              │
└──────────────────────────────────────┘

ついでに以下も記述(追加)する。
┌──────────────────────────────────────┐
│DumpIOInput On                                                              │
│DumpIOOutput On                                                             │
└──────────────────────────────────────┘
#これが正しい作法か疑問だが、上記「LoadModule」の次の行に追加したらOKだった。

ログレベルを「debug」にする。
┌──────────────────────────────────────┐
│#LogLevel warn                                                              │
│LogLevel debug                                                              │
└──────────────────────────────────────┘

これで設定完了。Apache再起動。

エラーログに、出力される。
#エラーログは以下のような感じで「httpd.conf」に設定されている
┌──────────────────────────────────────┐
│ErrorLog "logs/error.log"                                                   │
└──────────────────────────────────────┘

以下のような文言が出力されていれば設定成功。
┌──────────────────────────────────────┐
│… mod_dumpio.c(…): mod_dumpio: …                                         │
└──────────────────────────────────────┘
分類:Apache
Windows/タスクスケジューラでパスワードがないと
2013年10月21日
タスクスケジューラで、パスワードのないアカウントに実行させる設定をすると
エラーが発生する場合がある。
┌──────────────────────────────────────┐
│定時タスクのプロパティ                                                      │
├──────────────────────────────────────┤
│┌──┐                                                                    │
││全般│                                                                    │
││    └─────────────────────────────────┐│
││┌セキュリティオプション───────────────────────┐││
│││○ユーザがログオンしているときのみ実行する                          │││
│││●ユーザーがログオンしているかどうかにかかわらず実行する            │││
│││  □パスワードを保存しない  タスクがアクセスできるのは              │││
│││                                  ローカルコンピューターリソースのみ│││
│││■最上位の特権で実行する                                            │││
││└──────────────────────────────────┘││
│└────────────────────────────────────┘│
└──────────────────────────────────────┘
上記の設定だろ、以下のエラーダイアログが表示される。
┌──────────────────────────┐
│タスクスケジューラ                                  │
├──────────────────────────┤
│タスク○○でエラーが発生しました。エラーメッセージ:│
│1つ以上の指定された引数が有効ではありません。       │
└──────────────────────────┘
意味がわかりづらいが、パスワードがないのでセキュリティ的に無理ってことらしい。

仕方ないから、「パスワードを保存しない」と宣言するしかないみたい。
┌──────────────────────────────────────┐
│定時タスクのプロパティ                                                      │
├──────────────────────────────────────┤
│┌──┐                                                                    │
││全般│                                                                    │
││    └─────────────────────────────────┐│
││┌セキュリティオプション───────────────────────┐││
│││○ユーザがログオンしているときのみ実行する                          │││
│││●ユーザーがログオンしているかどうかにかかわらず実行する            │││
│││  ■パスワードを保存しない  タスクがアクセスできるのは              │││
│││                                  ローカルコンピューターリソースのみ│││
│││■最上位の特権で実行する                                            │││
││└──────────────────────────────────┘││
│└────────────────────────────────────┘│
└──────────────────────────────────────┘
これなら設定できる。
分類:Windows
PostgreSQL/テーブルのバックアップ
2013年10月20日
メンテナンスがしやすいプレーンテキスト(insert文)を取得する手順。

「pgAdminⅢ」のツリー上から、対象テーブルを右クリックし
「バックアップ」を選ぶ。

「ファイル名」と「フォーマット」を選ぶ
┌──────────────────────────────────────┐
│┌────────────────────────────────────┐│
││                ┌──────────────────────────┐││
││ファイル名      │C:\(ファイルの保存先)                               │││
││                ├──────────────────────────┤││
││フォーマット    │Plain                                               │││
││                └──────────────────────────┘││
│└┐                    ┌────────────────────────┘│
│  │ファイル・オプション│                                                  │
│  └──────────┘                                                  │
│                                            ┌──────┐┌──────┐│
│                                            │バックアップ││ キャンセル ││
│                                            └──────┘└──────┘│
└──────────────────────────────────────┘

「#1ダンプオプション」を選び、以下をチェックする。
┌──────────────────────────────────────┐
│┌────────────────────────────────────┐│
││┌クエリー──────────────────────────────┐││
│││□CREATE DATABASE構文を含む                                         │││
│││□DROP DATABASE構文を含む                                           │││
│││■列名インサート使用                                                │││
│││■インサートコマンド使用                                            │││
││└──────────────────────────────────┘││
│└─┐                  ┌────────────────────────┘│
│    │#1ダンプオプション│                                                  │
│    └─────────┘                                                  │
│                                            ┌──────┐┌──────┐│
│                                            │バックアップ││ キャンセル ││
│                                            └──────┘└──────┘│
└──────────────────────────────────────┘

「バックアップ」を実行する。
┌──────────────────────────────────────┐
│┌────────────────────────────────────┐│
││                                                                        ││
││プロセスは、0のリターンコードを返しました。                             ││
│└───┐          ┌──────────────────────────┘│
│        │メッセージ│                                                      │
│        └─────┘                                                      │
│                                            ┌──────┐┌──────┐│
│                                            │    完了    ││ キャンセル ││
│                                            └──────┘└──────┘│
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/(新)連番を前詰に振り直す
2013年10月19日
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 列 = (SELECT COUNT(*)                                               │
│                  FROM 表 AS 別表                                           │
│                  WHERE 別表.列 <= 表.列);                                  │
├──────────────────────────────────────┤
│SELECT setval ('AutoNumber用列名', (SELECT COUNT(*) FROM 表), true);        │
└──────────────────────────────────────┘

以下、検証例。

テスト用データを作成する。
┌──────────────────────────────────────┐
│CREATE TABLE "test"                                                         │
│(                                                                           │
│    "id" bigserial NOT NULL,                                                │
│    "no" integer   NOT NULL,                                      ┌─┬─┐│
│    PRIMARY KEY ("id")                                            │id│no││
│);                                                                ├─┼─┤│
├─────────────────────────────────│ 1│ 1│┤
│INSERT INTO "test" ("no") VALUES (1);                             │ 2│ 2││
│INSERT INTO "test" ("no") VALUES (2);                             │ 3│ 3││
│INSERT INTO "test" ("no") VALUES (3);                             │ 4│ 4││
│INSERT INTO "test" ("no") VALUES (4);                             │ 5│ 5││
│INSERT INTO "test" ("no") VALUES (5);                             │ 6│ 6││
│INSERT INTO "test" ("no") VALUES (6);                             │ 7│ 7││
│INSERT INTO "test" ("no") VALUES (7);                             │ 8│ 8││
│INSERT INTO "test" ("no") VALUES (8);                             └─┴─┘│
└──────────────────────────────────────┘

欠番をつくる。
┌─────────────────────────────────┌─┬─┐┐
│DELETE FROM "test" WHERE "id" = 1;                                │id│no││
│DELETE FROM "test" WHERE "id" = 3;                                ├─┼─┤│
│DELETE FROM "test" WHERE "id" = 5;                                │ 2│ 2││
│DELETE FROM "test" WHERE "id" = 7;                                │ 4│ 4││
└─────────────────────────────────│ 6│ 6│┘
                                                                    │ 8│ 8│
                                                                    └─┴─┘

前詰に更新し直す。
┌─────────────────────────────────┌─┬─┐┐
│UPDATE "test"                                                     │id│no││
│    SET "id" = (SELECT COUNT(*)                                   ├─┼─┤│
│                         FROM "test" AS "as_test"                 │ 1│ 2││
│                         WHERE "as_test"."id" <= "test"."id");    │ 2│ 4││
└─────────────────────────────────│ 3│ 6│┘
                                                                    │ 4│ 8│
                                                                    └─┴─┘

最終連番が「8」のままなので、「4」に戻す。
┌──────────────────────────────────────┐
│SELECT setval ('test_id_seq', (SELECT COUNT(*) FROM "test"), true);         │
└──────────────────────────────────────┘

試しに新たなデータを追加すると、適切に末尾に追加されることが確認できる。
┌─────────────────────────────────┌─┬─┐┐
│INSERT INTO "test" ("no") VALUES (99);                            │id│no││
└─────────────────────────────────├─┼─┤┘
                                                                    │ 1│ 2│
                                                                    │ 2│ 4│
                                                                    │ 3│ 6│
                                                                    │ 4│ 8│
                                                                    │ 5│99│
                                                                    └─┴─┘
分類:PostgreSQL
VC++/再頒布可能パッケージ
2013年10月18日
「Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)」ってのがある。

「Visual C++で開発されたアプリケーションを
  Visual C++ 2010がインストールされていないコンピューター上で
  実行するために必要な、Visual C++ライブラリの
  ランタイムコンポーネントをインストールします。」

ってことらしい。

「vcredist_x86.exe」ってのを、マイクロソフトのサイトからダウンロードして
インストールすればよいらしい。
分類:C/C++
Windows7/リモートデスクトップ
2013年10月17日
各エディション毎にリモートデスクトップを使えるか否かは以下の通り。
┌────────────┬─────┬─────┐
│                        │ 接続する │接続される│
├────────────┼─────┼─────┤
│Windows 7 Enterprise    │    ○    │    ○    │
│Windows 7 Ultimate      │    ○    │    ○    │
│Windows 7 Professional  │    ○    │    ○    │
├────────────┼─────┼─────┤
│Windows 7 Home Premium  │    ○    │    ×    │
│Windows 7 Home Basic    │    ○    │    ×    │
│Windows 7 Starter       │    ○    │    ×    │
└────────────┴─────┴─────┘
分類:Windows
Windows/リモートデスクトップの設定
2013年10月16日
「コンピューター」を右クリックして「プロパティ」を選択。
そこから「リモートの設定」を選択。
以下のように設定する
┌──────────────────────────────────────┐
│システムのプロパティ                                                        │
├──────────────────────────────────────┤
│                                                              ┌────┐  │
│┌──────────────────────────────┘リモート└┐│
││┌リモートデスクトップ────────────────────────┐││
│││オプションをクリックし、必要がある場合は接続できるユーザーを        │││
│││指定してください                                                    │││
│││  ○このコンピューターへの接続を許可しない                          │││
│││  ●リモートデスクトップを実行しているコンピューターからの          │││
│││    接続を許可する                                                  │││
│││    (セキュリティのレベルは低くなります)                            │││
│││  ○ネットワークレベル認証でリモートデスクトップを実行している      │││
│││    コンピュータからのみ接続を許可する                              │││
│││    (セキュリティのレベルは高くなります)                            │││
│││                                                    ┌──────┐│││
│││                                                    │ユーザの選択││││
│││                                                    └──────┘│││
││└──────────────────────────────────┘││
│└────────────────────────────────────┘│
│                                  ┌─────┐┌─────┐┌─────┐│
│                                  │    OK    ││キャンセル││   適用   ││
│                                  └─────┘└─────┘└─────┘│
└──────────────────────────────────────┘
分類:Windows
PECL/パッケージインストール手順
2013年10月15日
まず、PECLがPHPに標準添付されていないか確認する。
┌──────────────────────────────────────┐
│C:\Program Files (x86)\PHP>php -i                                           │
└──────────────────────────────────────┘
上記で、PHPのインストール情報を確認し、キーワード検索する。

「zip」パッケージはインストール済みだった。よって、インストール不要。
┌──────────────────────────────────────┐
│C:\Program Files (x86)\PHP>php -i                                           │
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
│zip                                                                         │
│                                                                            │
│Zip => enabled                                                              │
│Extension Version => $Id: 75f98b591f6e5b656786b38e42f0ca759a8eca80 $        │
│Zip version => 1.11.0                                                       │
│Libzip version => 0.10.1                                                    │
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
└──────────────────────────────────────┘
インストールしてしまうと二重呼出エラーとなってしまう。
┌──────────────────────────────────────┐
│Warning: Module 'zip' already loaded in Unknown on line 0                   │
└──────────────────────────────────────┘

そこで、(使い道はよくわからないが)該当のない
「trader」パッケージを対象にしてみる。

まず、未インストールである実験をしてみる。
「trader」パッケージの関数「trader_sum()」を実行してみる。
┌──────────────────────────────────────┐
│var_dump(trader_sum(array(2,4)));                                           │
├──────────────────────────────────────┤
│Fatal error: Call to undefined function trader_sum() in …                  │
└──────────────────────────────────────┘
未定義エラーが発生する。

さて、インストール。
まず、「http://pecl.php.net」で検索して、ダウンロードコーナーを探し、
Windows版のdllをダウンロードする。
今回の場合、「php_trader-0.3.0-5.3-ts-vc9-x86.zip」が入手され
この中に「php_trader.dll」が入っていた。

このdllを「C:\Program Files (x86)\PHP\ext」に置く。
で、「php.ini」を以下に書き換えて、Apache再起動。
┌──────────────────────────────────────┐
│[PHP]                                                                       │
│;;;;;;;;;;;;;;;;;;                                                          │
│; Fopen wrappers ;                                                          │
│;;;;;;;;;;;;;;;;;;                                                          │
│extension_dir="C:\Program Files (x86)\PHP\ext"                              │
│;;;;;;;;;;;;;;;;;;;;;;                                                      │
│; Dynamic Extensions ;                                                      │
│;;;;;;;;;;;;;;;;;;;;;;                                                      │
│extension=php_trader.dll                                                    │
└──────────────────────────────────────┘

さっきの命令を再度実行すると、見事に結果が返ってきた。
┌──────────────────────────────────────┐
│var_dump(trader_sum(array(2,4)));                                           │
├──────────────────────────────────────┤
│array(1) { [1]=> float(6) }                                                 │
└──────────────────────────────────────┘
(なにやっているかはわからないけどね)
とにかく、インストール成功!

アンインストールするには、dllの実体を削除して、
「php.ini」の「extension=」を削除してしまえばよい。
※「extension_dir=」はいじらない方がよさそうだ
※Apacheを停止しないと、dllは掴まれているの削除できないようだ
分類:PECL
PECL/実録あるパッケージのインストール
2013年10月14日
「zip」パッケージをインストールした手順(といっても後述の通りオチあり)。

まず、「http://pecl.php.net」で検索して、ダウンロードコーナーを探す。

「http://pecl.php.net/package/zip/1.12.2/windows」と判明したいので
今回は「PHP 5.3.17」にインストールする予定なので
「PHP 5.3」の「5.3 Thread Safe (TS) x86」を選択し
「php_zip-1.12.2-5.3-ts-vc9-x86.zip」をダウンロードする。

これを解凍し、中から「php_zip.dll」を取り出して
「C:\Program Files (x86)\PHP\ext」に置く。

「php.ini」を以下に書き換えて、Apache再起動。
┌──────────────────────────────────────┐
│[PHP]                                                                       │
│;;;;;;;;;;;;;;;;;;                                                          │
│; Fopen wrappers ;                                                          │
│;;;;;;;;;;;;;;;;;;                                                          │
│extension_dir="C:\Program Files (x86)\PHP\ext"                              │
└──────────────────────────────────────┘

ちなみに、「php.ini」に指定を追加する必要はないようだ。
┌──────────────────────────────────────┐
│[PHP]                                                                       │
│;;;;;;;;;;;;;;;;;;;;;;                                                      │
│; Dynamic Extensions ;                                                      │
│;;;;;;;;;;;;;;;;;;;;;;                                                      │
│extension=php_zip.dll                                                       │
└──────────────────────────────────────┘
もし、追加すると二重呼出エラーが発生する。
┌──────────────────────────────────────┐
│C:\Program Files (x86)\PHP>php -i|clip                                      │
│Warning: Module 'zip' already loaded in Unknown on line 0                   │
└──────────────────────────────────────┘

以下のようなテストプログラムを動かすと、ZIP圧縮ファイルの中身一覧が表示される。
┌──────────────────────────────────────┐
│$zip = zip_open('C:\xxxx\xxxx.zip');                                        │
│$entry = zip_read($zip);                                                    │
│while ($entry) {                                                            │
│    echo zip_entry_name($entry) . "\n";                                     │
│    $entry = zip_read($zip);                                                │
│}                                                                           │
│zip_close($zip);                                                            │
└──────────────────────────────────────┘

っていうか、「php_zip.dll」を削除してみたが、上記はそのまま動く。

よくよく調べてみると、標準でPHPに付随していたようだ。
┌──────────────────────────────────────┐
│C:\Program Files (x86)\PHP>php -i|clip                                      │
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
│zip                                                                         │
│                                                                            │
│Zip => enabled                                                              │
│Extension Version => $Id: 75f98b591f6e5b656786b38e42f0ca759a8eca80 $        │
│Zip version => 1.11.0                                                       │
│Libzip version => 0.10.1                                                    │
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
└──────────────────────────────────────┘
ということで、他で仕切り直し。

ちなみに、「pecl install zip」でインストールを試みるとエラーとなる。
┌──────────────────────────────────────┐
│C:\Program Files (x86)\PHP>pecl install zip                                 │
│downloading zip-1.10.2.tgz ...                                              │
│Starting to download zip-1.10.2.tgz (236,912 bytes)                         │
│.................................................done: 236,912 bytes        │
│61 source files, building                                                   │
│WARNING: php_bin .\php.exe appears to have a suffix .exe, but config        │
│ variable php_suffix does not match                                         │
│ERROR: The DSP zip.dsp does not exist.                                      │
└──────────────────────────────────────┘
分類:PECL
前へ 1 … 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 … 156 次へ