テーブルが破損した場合

クエリの中断などでテーブルが破損した場合
Can't find file tbl_name .MYI (Errcode: nnn ) のような
エラーが表示される。
 
【例】
DB:db_xxx
修復が必要なテーブル:table_zzz
 
●修復方法1
コマンドラインからMySQLへログイン。

mysql -u root -p;

使用しているDBを指定。

use db_xxx

*1
テーブルの修復。

repair table table_zzz;

 
●修復方法2
対象のMYIファイルが存在するDBのディレクトリに移動する。

cd /var/lib/mysql/db_xxx/

テーブルの修復。

myisamchk -r table_zzz

*1:mysql -u root -p db_xxx でもok。

別のネットワークの端末からscpでファイルをコピーするバッチ処理

別のネットワーク端末からファイルをコピーする処理を自動化したい。
そういう時は、本当はセキュリティを考慮して
公開鍵認証を使ってscpでファイルをコピーするのが一番良いやり方。
その辺りは↓とか参考にすると良いのかな?
ssh scp sftp の正しい自動実行方法
 
これは公開鍵認証を使えない時の最終手段。
 
filecopy.expというファイルを作る。
中身は↓こんな感じ。

#!/usr/bin/expect

set timeout 5
spawn /usr/bin/scp -q user@xxx.xxx.xxx.xxx:file.txt /directory1/directory2/.
expect "Password:"
send "password\n"
interact

expectは「この文字列が表示されたら」なので
scpを実行した時にパスワードを聞かれたら
sendで指定したパスワードを入力する、ということになる。
 
ファイルを用意したら

$ expect filecopy.exp

で、実行すればOK。
file.txtは/directory1/directory2/にコピーされる。
 

背景画像の指定

↓のコードではFireFoxで背景画像が正しく表示されない。

<head>
	<title>******</title>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
	
	<style type="text/css">
	<!--
	body {
	background-image: url(image/Background.jpg);
	background-repeat: no-repeat;
	background-position: right bottom;
	}
	-->
	</style>
</head>

 
↓のように記述する。

<head>
	<title>******</title>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
	
	<style type="text/css">
	<!--
	body {
	background: #ffffff url(image/Background.jpg) no-repeat fixed right bottom;
	}
	-->
	</style>
</head>

 
この記述だとFireFoxでもIEでも意図した通りに表示される。

FirebugのXPathの解釈とPerlのXPathの解釈が違う???

気象庁のwebサイトから予報の内容を取得しようとしてハマった。
 
天気予報のページからは取得できたので
週間予報のページからの取得もやってみようと思ったら
何故か上手くいかない…何でだ?(;´Д`)
 
書いてみたコードは↓これ。

#!/usr/local/bin/perl
use URI;
use Web::Scraper;

binmode(STDOUT,":encoding(cp932)");

my $WeatherInfo = scraper {
	process "/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr/th[2]", day => 'TEXT';
	process "/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr[2]/td/img", weather => '@alt';
};

my $res = $WeatherInfo->scrape(URI->new("http://www.jma.go.jp/jp/week/319.html"));

print $res->{day}."\n";
print $res->{weather}."\n";

 
XPathFirebugで取得して指定してるんだが…
HTMLを見ても合っていそうなのに結果は空白…。*1
 
暫くパスをいじっているうちに原因が判明。
Firebugで取得したXPath

/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr/th[2]

HTMLの通りだ。
しかし。

/html/body/div[2]/div[2]/div[5]/p/table/tr/th[2]

「tbody」の部分を削ってみるとデータが取得できた。
Σ( ̄□ ̄;) FirebugPerlXPathの解釈は違うのか?!
どっちが合ってるのかは私には分かりませんが…*2
 
さらに驚いたのは

/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr[2]/td/img

↑こっち。

/html/body/div[2]/div[2]/div[5]/p/table/tr[2]/td/img

直したのに表示されたデータは空白。
「tbody」を削ってもデータを取得できないのだ。
原因は「tr[2]」の部分。

/html/body/div[2]/div[2]/div[5]/p/table/tr[3]/td/img

添え字の2を3に直したらデータを取得できた。
見た目でもHTMLでも2で合っている筈なのに。
 
原因は
tr[1]とtr[2]の間にあるformタグ。
tr[2]で取得できるはずのデータはtr[3]の扱いになり
tr[2]と指定して取得されるのはformタグの中身ということになる。
formタグの下は何もないので取得データは空白となる。
 
これはひどい(>_<)
 
最終的にコードは↓になりました。

#!/usr/local/bin/perl
use URI;
use Web::Scraper;

binmode(STDOUT,":encoding(cp932)");

my $WeatherInfo = scraper {
	process "/html/body/div[2]/div[2]/div[5]/p/table/tr/th[2]", day => 'TEXT';
	process "/html/body/div[2]/div[2]/div[5]/p/table/tr[3]/td/img", weather => '@alt';
};

my $res = $WeatherInfo->scrape(URI->new("http://www.jma.go.jp/jp/week/319.html"));

print $res->{day}."\n";
print $res->{weather}."\n";

 
実行結果。

27火
晴れ

*1:エラーは出ない

*2:Firebugの方が合ってる気はするけど…