2009年4月6日月曜日
シェルスクリプトとMySQL

忘れないように、メモ。

シェルスクリプトとSQLの合体。

フツーにSQLを実行するの場合は…

mysql -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF

ってことで。

で、実行結果を取得したい場合は
RESULT=`mysql -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF`

と、コマンドの実行時と同じく「`」で括っておしまい。

SELECTの場合なんかでカラム名まで取得されちゃうので、
RESULT=`mysql -N -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF`

と「mysql」に「-N」オプションを付ける。



0 コメント | コメントを書く | コメントの表示
2009年3月25日水曜日
「?param=value」で400エラー

Webサイト構築のお仕事中…

テスト環境での作業が終わったので、本番環境へ移行作業をせっせと実施。

サーバ管理者がダイジェスト認証を設定。

ログイン。

OK。

とりあえず管理画面へアクセス。
でもって、次のページへ…

行けません。

「400」だってさ。
「不正な要求」だってさ。

試してみると「abc.php?param=value」のようなURLがNGで、「abc.php」だと上手く行く。

テスト環境だと問題なかったのに…

GETパラメタの問題かなぁ?
PHPの設定かなぁ?
Apacheの設定かなぁ?

ん?
サーバ管理者のPCだと問題がない?
違いは?
僕のPCがIE6で、彼のがIE7?
なんでだろう?
他のPCでも試してみたけど、IE6だけがNGのようだ。
IE6固有の問題?
でもテストサーバじゃOKだったもんなぁ…

かれこれ2~3時間くらいでしょうか?

ついに突き止めました。

HTTP クライアントを作ってみよう(6) - Digest 認証編 -
http://x68000.q-e-d.net/~68user/net/http-auth-2.html

上記サイトにこう書いてある。

ただし、IE6 では Digest 認証を使って foo.cgi?FOO=BAR のような URL にリクエストすると、誤ったリクエストを送ってしまうバグがあります。以下の URL は Mozilla や FireFox では正しく閲覧できますが、IE6 だと正しいユーザ名・パスワードを送信しても、 400 Bad Request になってしまいます (Windows XP SP2 + IE6 で確認)。

えぇっ!?
どういうこと??

パケットを見てみると、IE が送信した Authorization ヘッダの uri には「?FOO=BAR」の引数部分が含まれていないようです。


はぁ…
たしかにApacheのログを見ると、「?」以降があるのとないのとを比較して、アンマッチとかってなってる。

これは IE のバグですが、いつまでたっても修正されないので、 Apache-2.0.51 からサーバ側で無理矢理対応する仕組みが設けられました。 httpd.conf や .htaccess に以下のように記述しておけば、 IE でも上記のような URL に正しくアクセスできます。


書いてあるとおりに、修正を行う。
他のVirtual Hostに影響を与えないよう、.htaccessに以下を挿入。
# User-Agent ヘッダに MSIE という文字列が含まれていたら、
# 環境変数 AuthDigestEnableQueryStringHack に「On」をセットする。
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On


正常に動きました。
php.iniのdiffを取りました。
httpd.confもdiff取りました。
相違点はここくらかと思ったけど、まさかダイジェスト認証が問題になるとは…
よく考えれば、テスト環境ではダイジェスト認証をかけてなかったわ。

辛いなぁ…



0 コメント | コメントを書く | コメントの表示
2009年3月18日水曜日
文字が化けるのです。

PHPの話題。

最近、PHPをアレコレする仕事が多いのですが…

デザインも上がってきて、僕の作ったロジックと合体!と思って作業を始める。

サーバ管理者が、デザインチームのHTMLをアップしてくれたので、ブラウザから確認。
UTF-8で作ってあるのね。
OK、OK。

でもって、デザインと合体しない管理画面をまずはアップして、アクセスしてみる…

…え?

文字化けしてんじゃん。
正確には、文字コードを正しく認識してない。
ファイルはUTF-8で保存してるし、METAタグでCHARSETをUTF-8にしてるのに。

まずは自分を疑った。
でも結局は、php.iniの問題だと発覚。

default-charsetがSHIFT-JISになってました。
なので、HTMLは正しくUTF-8と認識されて、PHPのファイルだけがSHIFT-JISと認識されるという状態になってました。

あとはmbstring関係とかも確認しておかないとね。



0 コメント | コメントを書く | コメントの表示
2009年2月24日火曜日
EVENTQUERY

久しぶりに投稿してみる。
最後に投稿して以来、仕事ではCとJAVAを併用して、今年に入ってからはPHPをごにょごにょしてたんだけど、今度はAccessになりそう。

で、少し前に居た常駐先で使ってたバッチを、自分の会社でも使おうとしたら、動かなくて…

このテの会社って出勤、退社時間って、自己管理なことが多い。
だけど、毎日Excelにぽちぽち入れてくのって、面倒だし、忘れるんだよね。
ってことで、週末なんかにまとめて入力するんだけど…
そういうときって、PCの起動時間を確認することが多い。

[スタート]→[設定]→[コントロールパネル]→[管理ツール]→[イベントビューア]

システムからeventlogの開始と終了を確認するんだけど、ま、面倒だよね。
なので、バッチを作ってみた。

検索部分だけピックアップすると、こんなイメージ。



CSCRIPT //H:CSCRIPT //S //NOLOGO
:
EVENTQUERY /FI "ID eq 6005" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6005>> log.txt
EVENTQUERY /FI "ID eq 6006" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6006>> log.txt
:



ID6005はeventlogの起動、6006は停止のID。
勿論、%YYYY%とかは、変数で設定させるんだけど…

出力結果にはヘッダ部分があるので、log.txtにはGREPで必要な行だけ落としてる。
でもCygwinとか入れないと、GREPは使えないので…

あとはFORとかでまわして、時刻だけ抜き出したりして、整形すればOK。


でも、常駐先の環境ではこれで動いたんだけど、自社に戻ったら、動かない。
CSCRIPT //H:CSCRIPT //S //NOLOGO
してるけど、CSCRIPTで動かせ!とダイアログが表示される。

仕方なく、
CSCRIPT C:\WINDOWS\SYSTEM32\EVENTQUERY.vbs
に書き換え。

なんだろう?



0 コメント | コメントを書く | コメントの表示
2008年8月12日火曜日
viでエラーが発生して保存できない(追記あり)

えーっと、cygwinなんだけど、viで保存(:wq)時にエラーが出た。



"ファイル名" E513: write error, conversion failed (make 'fenc' empty to override)
Press ENTER or type command to continue



なんだ?

っつーか、fencってなんだよ。
:set fenc

としてみる。
fileencoding=sjis

まぁ、cygwinだからね、Shift-jisだね。

…で?

検索してみよう。

http://vim.cybermirror.org/messages/ja.po
msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
msgstr "E513: 書込みエラー, 変換失敗 (上書するには 'fenc' を空にしてください)"


あぁ、そうか。

ってことで、こうしてみる。
:set fenc=

で
:wq

無事終了。

再度viで開いてみる。
勿論fencを確認しても空っぽなんだけど、sjisに再設定してみると、やっぱりE513のエラーがでる。
また空にすればいいだけの話なんだけどさ。
このfenc/fileencodingって、なんのためにあるのだろう??

情報は少なそうだなぁ。
何故このファイルだけ…

ちょっと調べてみた。
エンコードを指定して開き直す方法があった。
:e ++enc=sjis

実行してみると…(sjisでなくてもshift_jisでもOKみたい)
"ファイル名" [converted][CONVERSION ERROR in line 94] 170L, 2914C


なぁにぃぃぃ!

で、94行目を見ると、"\"が"?"に置き換わっている(括弧をエスケープする目的の"\")。
ここがいけないのかと思って、"?"を"\"に置き換えるが、やはりsjisでは保存できないようだった。
(追記:当然だわな、sjisにバックスラッシュってないもんね)

エンコードを変更することで"\"が"?"に置き換えられるのと、同じ原因なのかな?
(追記:sjisでバックスラッシュを表示させようというのがそもそもの誤りに気づかない僕って…)

stupidGeek
エラーコード:E513を克服する

ここを読むと、同じくE513のエラーに苦戦した経緯と解決に至った内容が書かれている。
でも、ちょっとこのケースは違うな。

…

やっぱり、"\"の部分で、他の文字コードと誤認されているのかな?
(追記:だからそろそろ気づけ、俺!)

vi abc

で、テキトーに「aaaaa」と書いて保存(:w)。
正常、正常。
:set fenc

でファイルエンコードを確認する。
 fileencoding=

空っぽ。
一旦閉じて(:q)、再度開く。
vi abc

ファイルエンコードを確認する。
:set fenc

 fileencoding=sjis

よく考えたら~/.vimrcでfileencodingをsjisに設定してるわ。
で上書き保存・終了(:wq)すると、正常に終われる。
再度開いて(vi)、問題の"\"を書いて、保存(:w)すると…
"abc" E513: write error, conversion failed (make 'fenc' empty to override)
Press ENTER or type command to continue

そういうことですか。
エンコードがshift_jisの場合には"\"がエラーになるのね。
"\"を使うなら、fencは削除しないといけないか…
(追記:というかutf-8とかeucなら大丈夫なんだろうな)

根本的な解決にはなってないな。


ちなみに、これらの作業ってPoderosaから実行してたんだけど、これをDOS(インストール時に作成されるショートカット)から実行すると
"ファイル名" E513: 書込みエラー, 変換失敗 (上書するには 'fenc' を空にしてください)
続けるにはENTERを押すかコマンドを入力してください

と、日本語でエラーが表示される。


(追記 - 2010/03/02)
久しぶりにコマンドプロンプトでvimを使ったが、エラーにならなかった。
「何故だ!」と思って、TeraTermのcyglaunchとPoderosaで試したけど、問題なく…

ふと.vimrcを見てみたら、こう設定されてた。
set encoding=japan
set fileencodings=sjis,utf-8,iso-2022-jp,euc-jp
set nu
set tabstop=4

fileencodingsの設定が変わってる!?

やべ、全然記憶にないわ。
とりあえずこうやって複数指定すれば回避できるんだな。
修正したときに、ここにも追記すべきだったな。



0 コメント | コメントを書く | コメントの表示
2008年8月5日火曜日
インストール時のスクリーンショット - Redhat

お久しぶりの更新。
ちょっと仕事でJAVAやってたんで、とりあえず書くことが無かった。

で、久しぶりにUNIX系OSのインストールをするので、ちょっと思い出したことを書いておきます。
※実際に作業したのは1年前なので、最新バージョンでは違うかもしれません。

インストール時のスクリーンショットの撮り方(取り方?)です。
まぁ、メモすりゃいいんだけど、作業記録としてあった方が確実でしょ?
でも、この方法が他のOSでも通用するか判りません。
一応、Redhat Enterprise Linuxでの方法です(でした)。
これからちょっと他のインストールがあるので、試してみようかと思います。

インストール時のスクリーンショット
 Shift + PrtSc
 後半はPrtScのみで取得できます(どこからか忘れた)。

うまく取れるとダイアログが出るので、取れたかどうか不安になることはないかと思います。



0 コメント | コメントを書く | コメントの表示
2008年5月9日金曜日
SET

せっかくなので、バッチファイルについて、もう少し。
正直、今更な話だけど、案外探すのが面倒なので、とりあえず自分用にここへ。

対話形式でなにかやろうとすると、コマンドプロンプト/MS-DOSって、どーしてもSETコマンドに頼らざるを得ない。
そんなときは

@ECHO OFF
SET /P TESTMSG=ここに何か入力してください。:
ECHO %TESTMSG%

として、バッチファイルを実行すると…
C:\>test.bat
ここになにか入力してください。:

で入力待ちになるので、なにか入力してエンターを押すと、入力された文字列がTESTMSGに格納される。
ECHOでそのTESTMSGを表示しておしまし。
C:\>test.bat
ここになにか入力してください。:テストメッセージ
テストメッセージ
C:\>


この場合、事前にTESTMSGになにかセットしておいても、入力で上書きされる。ただし何も入力をしないで、エンターを押すと、なにも格納されない。
なので、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)

とかやると、何も入力しない場合にはANSWERは空のまま。IF文でエラーになってしまう。
C:\>test.bat
よろしいですか?[Y/N]:
Yの使い方が誤っています
C:\>

対策するなら、「"」で括るか、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I "%ANSWER%" EQU "Y" (
ECHO 了解いたしました。
)

あらかじめ、なにか値を入れておくしかないのかな?(ここではデフォルトでNを入れてみた)
@ECHO OFF
SET ANSWER=N
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)


こうやってSET /Pだとその値を変更/更新することができるんだけど…

うーん…
こうして書いてみると、なにか忘れてることがある気がしてならん。

あぁ、そうそう、このSETコマンドはやはり環境変数の操作を行うものだから、バッチが終わっても有効なのだな。
なので、処理の最後で
SET 変数名=
で解放するか、処理の最初で初期化(解放と同じ)する必要があるね。

さっきの「よろしいですか?[Y/N]」のバッチだと、1回目にYと入力したあとすぐ2回目を実行し、空エンターで再度IF文に入るのだが、1回目に格納したYが未だ入ったままであるため、IF "入力" == "Y"が有効になってしまう。


…まぁ、とりあえずこんなカンジで書いていこうかと思ってる。
備忘録代わりってことでさ。



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.