2011年10月18日火曜日

fmt:formatDate が効かない?

・JSTL の fmt タグでフォーマットが無視される場合のメモ - hoge256ブログ
・fmt:formatDateはリクエストヘッダにaccept-languageが設定されていない場合フォーマットしてくれない - こせきの技術日記 - 技術日記

上記ページの通り。

・目的
<fmt:formatDate value="${day}" pattern="yyyy-mm-dd"/> みたいにフォーマットを指定して出力したい

・現象
ブラウザから見るとフォーマットされた状態で出力されるが、
curl コマンドでリクエストをすると、フォーマットされない状態(Sun Aug 28 10:05:13 JST 2011 の形)で出力されてしまう。

・原因
ロケール情報が設定されていないため。
Accept-Language が送られていれば良いので、ブラウザ経由では問題なかった。

・対応
<fmt:setLocale value="ja-JP" />
でロケール情報を設定すれば回避できる。

2011年4月11日月曜日

スレーブサーバのデータをファイルコピーで入れてレプリケーションを設定する(mysql)。

■なんでこんなことしたの?
・slave02 のレプリケーションが止まってたのに
 取込前にマスターのバイナリログが消えたから。

■構成
・マスター:master01
・スレーブ:slave01
・これから作るスレーブ:slave02

■前提
・slave01 は既に存在していてレプリケーション構築済み。
・slave02 は mysql インストール済み。データはすべて消えても良い。
・master01 は止めてはいけないが slave01・slave02 は止めてよい。

■手順
・slave01 を止めて、データファイルを取得
・slave02 のデータファイルを置き換える(余計なファイルもあるので一部消す)
・slave02 のレプリケーションに関わる設定を変更する

# コピー先(新しくスレーブにするサーバ) で準備
ssh username@slave02
# slave02 で mysql 停止
mysql -uroot -p
show slave status\G
stop slave;
quit

/etc/init.d/mysql stop
ps aux | grep mysql # プロセスが存在しないことを確認

# slave02 で /var/lib/mysql をリネーム
mv /var/lib/mysql /var/lib/mysql_backupdata

# コピー元(既にスレーブになっているサーバ) でファイル取得
# master01-slave01 のレプリケーションを停止
ssh username@slave01
mysql -uroot -p
show slave status\G
stop slave;
show slave status\G
# slave01 の show slave status\G の内容を記録
echo "show slave status\G" | mysql -uroot -p > slave01_show_slave_status.txt
# slave01 で mysql を停止
hostname # 念のため確認(マスター止めてしまわないように)
/etc/init.d/mysql stop
ps aux | grep mysql
# slave01 の /var/lib/mysql を tar.gz で固める
tar cvzf ~/slave01_mysql_data.tar.gz /var/lib/mysql
# slave01 で mysql を起動
/etc/init.d/mysql start
# master01-slave01 でレプリケーションを再開
# やる前に動作確認すること。
ssh username@slave01
mysql -uroot -p
show slave status\G
stop slave;
show slave status\G
# slave01 で固めたファイルを slave02 に転送
scp ~/slave01_mysql_data.tar.gz username@slave02:/home/username/slave01_mysql_data.tar.gz

# 再びコピー先で作業
ssh username@slave02
# slave02 でそのファイルを展開して、コピーする
tar xvfz ~/slave01_mysql_data.tar.gz
# slave02 で下記に該当するファイルを削除
  ・.info ファイル
  ・.index ファイル
  ・バイナリログ (サーバ名-bin.数字)
  ・リレーログ (サーバ名-relay-bin.数字)
# slave02 で mysql を起動
/etc/init.d/mysql start
# slave02 で change master を実行
# 設定値には、slave01 で取っておいた show slave status の値を用いる。
mysql -uroot -p
CHANGE MASTER TO
MASTER_HOST='master01のIPアドレス'
, MASTER_USER='レプリケーション用ユーザ名'
, MASTER_PORT='3306'
, MASTER_PASSWORD = 'レプリケーション用パスワード'
, MASTER_LOG_FILE='slave01 の Relay_Master_Log_Fileの値'
, MASTER_LOG_POS='slave01 の Exec_Master_Log_Posの値'
# slave02 で start slave する
start slave;

# おわり。

2011年2月23日水曜日

jQuery で画像タグに指定された URL を取得する方法

jQuery を使っていて、
<img src="img/hoge.jpg" id="hogeImage"> のような
相対パスで画像 URL を指定しているimg タグがあった場合、

・$('#hogeImage').eq(0).attr('src')
・$('#hogeImage').get(0).src

この2つでは、取れる値が異なります。

jQuery の attr メソッドを使うと、タグの src 属性に書かれているままの値(この場合だと相対パス)を取得できます。
→ img/hoge.jpg
後者のように HTMLImageElement の src プロパティを見るとフルパスが取得できます。
→ http://example.com/img/hoge.jpg (http://example.com/hoge.html がそのページの URL だとしたら)

2011年2月3日木曜日

MySQL でユーザの追加と削除

削除は、権限削除 → ユーザそのものの削除 という手順を踏まないといけないらしい。
作成時のように一発でできないのは少々面倒…

ユーザの確認
SELECT User, Host FROM mysql.user;

ユーザの権限確認
SHOW GRANTS FOR 'ユーザ名'@'ホスト';

ユーザの作成(+権限追加)
GRANT SELECT, INSERT, UPDATE, DELETE (など、必要な権限を列挙) ON `データベース名`.テーブル名 FROM 'ユーザ名'@'ホスト' IDENTIFIED BY 'パスワード';

ユーザの削除(+権限削除)
REVOKE SELECT, INSERT, UPDATE, DELETE (など、設定されている権限を列挙) ON `データベース名`.テーブル名 FROM 'ユーザ名'@'ホスト';
DELETE FROM mysql.user WHERE user='ユーザ名' AND host='ホスト';
FLUSH PRIVILEGES;

# DELETE の代わりに、DROP USER 'ユーザ名' でも削除できるらしい。


参考
MySQLクイック・リファレンス

2010年11月29日月曜日

mysql で時々使うけどおぼえられないものメモ。

ロック回避してダンプ
mysqldump -uユーザ名 -p --skip-lock-tables DB名 テーブル名 > ファイル名

指定した条件のレコードだけダンプ(テーブルの作成情報はなし)
mysqldump -uユーザ名 -p -t "--where=カラム名='文字列'" DB名 テーブル名 > ファイル名

CSV 出力 (これで Errcode: 13 になる場合アクセス権限が無い)
select * into outfile '/tmp/ファイル名.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' from テーブル名;

windows xp で手動でサービス登録
mysqld-nt --install-manual service_name

2010年10月21日木曜日

PHP の設定の short_open_tag

ひとりで PHP 書いてるとか、
PHP のタグは必ず「<?php」を開始タグとして使いましょうって決まってるとか、
そういう状態なら short_open_tag は Off で良いけれども。

誰かが書いたソースを持ってきたら、クラスが見つからないとのエラー。
よく見たら、開始タグが「<?」…

php.ini に short_open_tag = On を書いたら動くようになった(既にあった Off は消した)。
めでたし。

Apache に PHP の設定

Apache インストール済み、PHP インストール済み(場所はC:/php/とする)、
でも連携はしてない、という状態から連携させる。

LoadModule php5_module C:/php/php5apache2_2.dll

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

必要に応じて
PHPIniDir C:/php/php.ini


これらを httpd.conf に追加すれば良さそう。
LoadModule で読み込む dll は連携させる Apache のバージョンにあったものを使う。
そうでないと、Apache の起動に失敗してしまうらしい。

2010年8月19日木曜日

了解じゃなくて。

かしこま・る【×畏まる】
3 命令・依頼などを謹んで承る意を表す。承りました。「はい、―・りました」

うけ‐たまわ・る〔‐たまはる〕【承る】
1 「受ける」の謙譲語。謹んで受ける。お受けする。「大役を―・る」
2 「聞く」の謙譲語。謹んで聞く。拝聴する。「ありがたいお話を―・りました」

しょう‐ち【承知】
2 依頼・要求などを聞き入れること。承諾。「申し出の件、確かに―した」


「了解」と「承知」の違いってなに? - Ameba News [アメーバニュース]
「了解」は承認という上から目線の意味が入るため、あまりビジネス用語として使用しないほうが賢明なようです。

2010年8月18日水曜日

障害対応日記

お客様から何だかおかしいから調べてほしい、と言われる。
おかしいのはわからなくはないけど、何がおかしいのかわからなくて、ぽかーん…

自分一人で調べるのも限界があるので、自分で調べつつ、
アプリを作った人、インフラに明るい人、バッチを作った人に相談。
調査してもらった結果、原因判明。

お客様への説明が遅い。
調査中でも、調査中だからこそその旨を連絡すべき。
「調べます」「原因はこれだと思われます」、
「暫定的にこういう対応をしたいです」「恒久的に…」というのを細々分けて連絡する。
状況が見えないと不安なのはみんな同じ。

インフラに明るい人と先輩が話して、対応方針が決定。

方針が決まればあとは実行するだけ。
社内に作業の一覧提示して確認、足りないところは指摘してもらう。
お客様に理由、作業内容、リスク、日程などを説明。
社内外の人にそれぞれ作業を依頼。
で、作業実施。



・原因の究明の仕方がわからない
 →誰に相談したら良いかわからなかった
 →誰に相談すれば良いの?という相談を早くしたら良かった。

・お客様に何をどのタイミングでどの程度の粒度で言ったら良いのかわからない
 →それこそ早く上司に相談するところ
 →基本はまめに。わからないのはみんな不安。

・なんだかぱにくってる
 →落ち着け。
 →複雑なことは分けて、ひとつずつ片付ける。



以下、余談というか独り言。

方針が決まったあととか、何度か先輩に「あとは頼んだ!」って言われた。
それをぼんやり「もしかして好きにして良いってことか?(自分勝手という意味ではなくて)」と考えた。
お客様へのメールは上司に見てもらってるし、他は目に余れば止めてくれるか、と思ったらなんだかふっ切れて、
あとはもうやること順繰りに人にお願いしまくる、という「いつも通り」に落ち着いた。

昔々、「お前『働かなくて』いいから! 見て回って指示すんのがお前の仕事だから!!」と言われたのが懐かしい。
落ち着かなくて結局延々アイロンがけしたりとか。

2010年7月13日火曜日

TortoiseSVN でファイルの移動

Subversion(TortoiseSVN)でファイルやフォルダを移動する方法(手順)
削除・移動・名前の変更
これらのページが参考になった。

エクスプローラで、移動元のファイルを選んで、右クリックで移動先へドラッグ&ドロップ。
ドロップの際にメニューが出るので、「SVN バージョン管理ファイルをここに移動する」を選択。

2010年6月25日金曜日

form の提出ボタンの作り方

<input type="submit" value="submit!!">
<input type="image" src="image.jpg">

<button type="submit">submit!!</button>
<button type="submit"><img src="image.jpg"></button>

(JavaScript を使用する場合)
<input type="button" value="submit!!" onclick="document.myForm.submit();">
<button type="button" onclick="document.myForm.submit();">submit!!</button>

<input type="image" src="image.jpg"> が提出ボタンなのは
名前からわかりづらく、落とし穴ではないだろうか。

JavaScript で入力内容チェックをかけた後に送信する場合、
提出ボタンの規定の動作として送信が行われるため、
JavaScript 内で submit メソッドは使わない・使う際は規定の動作をキャンセルする必要がある。
例えば onclick="check(); return false;" のように。
onsubmit については IE で問題があるという話を見かけたので、調べないと使えるかどうかはわからない。

参考サイト
Forms in HTML documents (ja)