キャッシュの制御

CSSjavascriptなど外部のファイルを読み込むとき

ファイルは更新したのにキャッシュのせいで更新が反映されない。

そういう時は

 

<script src="../js/jquery/test.js?ver=1.0"></script>

 

ってやればいいらしい

 

ver=数字 を更新すれば、キャッシュから読み込まずサーバから取得

逆に同じにしておけば、キャッシュの内容が適用される

キャッシュの制御が可能なようです。

 

 

ワイルドカードの範囲

ワイルドカードを使った置換方法がうまくいかない。(失敗談のみ)

 

受付番号「○○○○」番号

この文の○○○○の部分をDBから取得した数値に置換したい。

けれど↑の文字は文章の一部であって、複数出てきます。

 

受付番号「○○○○」番号のお客様

振込が完了致しましたのでご連絡致します。

受付番号「○○○○」番号のお客様には多大なるご迷惑を御掛け致しました。

 

こんな感じのテンプレートがあります。

だからテンプレート文章をString型で保持して

String stg = テンプレの文章;

String no  = 取得した番号;

stg.replaceAll( "受付番号「.*」番号", "受付番号「"+no+"」番号" );

で置き換えようと思ったのですが。。。

.*」 では

 

受付番号「○○○○」番号のお客様

振込が完了致しましたのでご連絡致します。

受付番号「○○○○」番号のお客様には多大なるご迷惑を御掛け致しました。

 

赤い部分までヒットしてしまい、

置換したくない文字列まで置換されてしまいました…。

はじめにヒットした”受付番号「”から

最後にヒットした”」番号”までが

対象になるようですね。

 

テンプレートの番号に置き換わる部分が

必ず○○○○とされていれば、

ワイルドカードなど使わずにできたのですが、

テンプレート管理方法がバラバラでこうならず…。

 

1行に1ワードしか出ないという条件ならば、

改行コードで区切って毎行置換する方法で落ち着く予定です。

しかし、正規表現でどうにかならないものかなぁ。

Submitボタンの二度押し禁止

ボタンを二度押し対策をJavascriptで実装する。

検索すればたくさん出てくるけれど、ここは自分用メモ帳なので書きます。

 

    <script type="text/javascript" language="JavaScript">
<!-- function no2click(form) { var e = form.elements; for (var i = 0; i < e.length; i++) { if (e[i].type == 'submit') { e[i].disabled = true; //disabled属性を有効にしてボタンを無効にする } } } //--> <form action="XXXX.jsp" method="post" onSubmit="return no2click(this)"> <input type="submit" value="送信ボタン">

↑の様なボタンを無効にするのが好みです。

でも業務ではアラートを出すタイプが多かった気がします。

アラートが出るタイプは 

    <script type="text/javascript" language="JavaScript">
<!-- var cnt = 0; //クリック回数カウント用 function no2click(form) { if( cnt == 0 ){ //初クリックでは必ずここを通る cnt = 1; //カウント数更新 } else { //2度目以上 alert('二重クリック禁止です。'); return false; } } //--> <form action="XXXX.jsp" method="post" onSubmit="return no2click(this)"> <input type="submit" value="送信ボタン">

こんな感じです。 

 

どちらが親切なのかはよくわかりません。 

別サーバでの検索、ファイルのコピー

Aサーバにあるテキストファイルをfindで検索し、Bサーバにコピーしたい。

find条件についてはコチラ
http://leo029.hatenablog.com/entry/2013/02/09/012920

Aサーバからコマンドを実行する場合は
find /home/Adirectory -maxdepth 1 -name "XXX_*.txt" | xargs -i scp {} $USER_NAME_@$SERVER_IP:コピー先ディレクトリパス

シェルスクリプトを使ってパス無しで実行するとき
パスワードは対話型で回避

	expect -c "
		## sshでAサーバに入る
		spawn ssh $USER_NAME_FROM@$SERVER_IP_FROM 
		expect {
			\"Are you sure you want to continue connecting (yes/no)?\" {
				send \"yes\r\"
				expect \"password:\"
				send \"$PASSWORD_FROM\r\"
			} \"password:\" {
				send \"$PASSWORD_FROM\r\"
			}
		}
		## 結果ファイル名検索・Bサーバへコピー
		expect \"$ \" { 
            send \" find コピー元パス -maxdepth 1 -name "XXX_*.txt" | 
            xargs -i scp {} $USER_NAME_TO@$SERVER_IP_TO:コピー先リパス \r\" }
		expect {
			## Bサーバのパスワードが必要になる
                        ##(sshでAサーバにいることになってるため)
			\"Are you sure you want to continue connecting (yes/no)?\" {
				send \"yes\r\"
				expect \"password:\"
				send \"$PASSWORD_TO\r\"
			} \"password:\" {
				send \"$PASSWORD_TO\r\"
			}
		}
		expect 
	"

こんな感じ

findコマンドを使って1階層からファイルを探す

Aディレクトリ直下にある「XXX_YYYYMMDD.txt」ファイルのパスが欲しい。
しかし、Aディレクトリ配下には過去の「XXX_YYYYMMDD.txt」を
退避するlogファイルがたくさんある状態。

homeAdirectoryXXX_YYYYMMDD.txt
   ├logFile1
       └XXX_20120101.txt
   ├logFile2
       └XXX_20120201.txt
   ├logFile…
   ├logFile…
   └logFile…
こんな感じ。

普通に find /home/Adirectory -name "XXX_*.txt" で実行すると logファイルに退避されたテキストファイルも取得してしまう。

解決コマンドはこれ find /home/Adirectory -maxdepth 1 -name "XXX_*.txt"

-maxdepth nを使うことで見るディレクトリを絞ることができた。
nを0にするとディレクトリ配下は見ない。 ディレクトリ配下(1階層のみ)なので「-maxdepth 1」

USER_TAB_COLUMNSを使ったOracleDBのテーブル調査

DB①が壊れたのでDB②に①の内容を退避させたが、
テーブル定義が全て正しく退避されているか確認をするため、
USER_TAB_COLUMNSを使って調査を行った。

 

【基本】

select * from USER_TAB_COLUMNS;

--ユーザがアクセスできる全てのテーブルのカラムが抽出される

 

【実施したSQL

SELECT
TABLE_NAME, 
COLUMN_NAME, 
DATA_TYPE, 
DATA_LENGTH, 
DATA_PRECISION, 
DATA_SCALE, 
NULLABLE,
DEFAULT_LENGTH, 
DATA_DEFAULT 
FROM
USER_TAB_COLUMNS 
WHERE
TABLE_NAME IN ('テーブル名','テーブル名',…中略…,'テーブル名'
--テーブル名を制限しないと1000レコード超したため
ORDER BY TABLE_NAME, COLUMN_NAME
--Diffを見やすくするためのorderby

 

これを①と②で実施し結果を比較した

sshとsedを使って別サーバのファイルの文字列を書き換える

問題:

置換文字列に「;(セミコロン)」がある場合

 

やりたかったこと

.txtファイルの9行目の文字列を書き換えたかった。
%days = ("21"=>"23"); //常に21と23の数値が入っているわけではない

%days = ("24"=>"25");

こんな感じ

 

失敗:

spawn ssh $USER_NAME_@$SERVER_IP 'sed -i.bak -e ¥¥¥"9c %days = ("24"=>"25");¥¥¥" 置換対象ファイルパス.txt'

→「;」のせいで複数コマンドがあると思われちゃう

 

コンソールはこんな感じ

spawn ssh USER_NAME_@SERVER_IP sed -i.bak -e "9c 文字列AAA
invalid command name """
   while executing
"¥" 置換対象ファイルパス.txt"

 

解決策:

セミコロンを文字列として認識する方法がわからなかったので
置換文字列の条件を追加する
(ついでにsshからも1回離してしまった。。。)

 

expect ¥"$ ¥" { send ¥"sed -i.bak$NOW -e '9s/¥¥¥"..¥¥¥"=>¥¥¥"..¥¥¥"/¥¥¥"24¥¥¥"=>¥¥¥"25¥¥¥"/' 置換対象ファイルパス.txt ¥r¥" }

 

おまけ:

一列での定義でもできた

spawn ssh $USER_NAME_@$SERVER_IP sed -i.bak$NOW -e '9s/¥¥¥"..¥¥¥"=>¥¥¥"..¥¥¥"/¥¥¥"24¥¥¥"=>¥¥¥"25¥¥¥"/' 置換対象ファイルパス.txt

 

参考サイトさま

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/