610月/120

ベトナム

10月 6th, 2012

いよいよベトナムへ。

大阪の関空付近で前泊することにしていたが、台風が近づいているということもあり、急遽、さらに前日の9/29に移動することに決めた。関空から飛行機は飛んだが愛媛~大阪間の電車&新幹線が動かずに移動できなかった、という最悪パターンは防ぎたかったので。空路を選択していたら、また面倒なことになっていたかもしれなかったので、陸路を選択しておいて正解だったかも。

しばらく優のドッチボールの練習相手になってやれないのでその練習と、まだ買う必要があった肩掛けバックの購入などをいそいそと済ましJR松山駅へ。いざ出発と電車が動き出したところで、嫁がこちらに向かって叫んでいる。「なに?」と窓の方に耳を傾けると、「車のかぎーーー!!!」とwww。駅まで私が運転してきて鍵をポケットに入れたままだった。そんな様子を見ていた車掌さんが電車を止めてくれて、無事に鍵を渡すことができた。スペアキーがなかったので2か月半もの間、JR松山駅の駐車場に置きっぱなしにするところだったw。ありがとう!JR松山駅の車掌さん!!

その日の晩は妹宅でまったり。子供をてがったり、妹旦那と酒を飲んだり。

次の日は台風が上陸するとのことだったが、チェックインが14時だったのでどうしようかなーとか言っているうちに昼が過ぎ、そろそろ妹宅を出ようかというところで台風もいよいよ接近。軒並み電車が運航停止になっていくなか、なんとかホテルまで辿り着けた。ホテルに着く直前は傘もさせない状態だった。関空とを結ぶ関空線は車も含め通行止めになっていたから関空横(島内)のホテルにしてたらアウトだった。(その場合は、チェックインが遅くても、早めに関空には入ってただろうけど)

そんなこんなで色々あったけど、無事関空から飛行機は飛び立ち、予定通りにベトナム - ダナン入りしたのであった。

ギャラリー (2012/9/29 – 2012/10/21)

Vietnam

49月/120

稲刈り

9月 4th, 2012

今年も稲刈りの季節がやってきた。今年は実家方面は雨ばかりで、稲が倒れまくり。枯れっかれで、収穫できなそうな稲もチラホラ。そんな状態なのでなる早やで借りたかったので、土曜日に刈ることにしていたのだが、土曜・日曜ともに微妙な天気。昼から雨予報。日曜日も同じような予報なので、金曜日の仕事がまぁまぁ遅かった割りに、早めの起床&帰省。流石に今回は高速使って時間短縮で。8:30に自宅を出発。ほぼ10時だったので1時間30分か。以前、Facebook友人から聞いていたのだが、気持ち遅かったぐらいで、ほぼ予想通り。早くなったなぁ。あの峠を飛ばして帰れなくなったのはちょっと寂しい気もするけど。

実家到着後、即コンバイン始動して、稲刈りを開始。すると間もなく、コンバインの中からガラガラと嫌な音が。さらに脱穀した直後のもみ米がコンバインの脇からぽろぽろ落ちて、なかなか袋に溜まらない。ガラガラという音も次第に大きくなり続ける訳にはいかない状態になってきた。そこで業者の人を呼んだら、内部の部品がひん曲がって、それが原因で音が出ていたことが判明。通常はこんなことにならない部品だが、ネズミが沢山ものを運び込むので、それがひん曲がる原因になったのかなぁ~と。すぐには直せないってこことで、一旦持ち帰ることになり、この日の稲刈りは終了。これなら潜りに行っとけば、、、とも思ったが、日曜日に判明していたとしたら、稲刈りそのものが来週に持ち越しになっていたので、土曜日の内に分って良かったといえば良かった。(持ち帰ってもらった時点では、日曜日までに直るかは不明だったのだが)

代わりに前回の草刈り時に刈れなかった草を刈り、その日(土曜日)は終了。

心配だったコンバインは日曜日の9:30には届き、無事稲刈りを再開することができた。露払いやら、倒れた稲の中で収穫できそうな稲を起こしたりした後、本格的な稲刈り再開。日曜日も天気予報が微妙(雲がやや多いかなぐらいで、日差しはあったのだが)ということで、昼飯も食べずに稲刈りを続けて、13:30には終了。そして使い終わったコンバインの掃除やら、刈った後のもみ米を乾燥業者に持ち込んで一息ついたところで、ザァーーーーーーーーっと雨がw。いやぁ~、ほんと急いで刈っといて良かったw。

収穫量も、去年より3袋ぐらい少なかったけど、お袋と俺ら家族が1年間、食べる量は確保できたので一安心。さて!来年も頑張るぞぉ~!!

168月/120

cronと改行コード(CR+LF)

8月 16th, 2012

ハマったので。

cronで定期的に実行する内容をcrontabファイルに記載している。
/etc/cron.d配下にファイルを配置したり、/etc/crontabに行を追加して利用する場合は、誰でも見やすい場所にあるので誰でも気が付きやすいが、ユーザー毎にcrontab -eで設定を行うと、どのユーザーで設定を行ったのかを把握していないとなかなか気が付かない。特に複数のユーザーが開発を行っているような環境では。

そこで、gitの対象となるファイル群の一部としてreadme.txt + crontab.txtを作成し、その辺りが誰でも分かるようにしていた。
これまでは、crontab.txtはLinux環境に合せて改行コードもLFだったのだが、何かの拍子(まぁWindows環境で編集したタイミングではあるんだろうけど)にCR+LFに切り替わっていた。

それを気が付かずに、別担当者がcrontab.txtの内容をターミナルソフト(多分Putty)でコピー&ペーストしたため、crontabの改行コードもCR+LFになっていたようだ。

これが原因で、、、
・crontabに記載しているshが呼ばれない。
・呼ばれない原因が、shファイル?shファイル内に記載しているディレクトリ?ファイル?が見つからないエラーになっている。(っぽい)
のような事象になっていた。

↑で「っぽい」と書いたのは、以下の理由により原因がはっきりしなかったため。

crontabに記載していたのは以下の内容だった。
—–
*/15 * * * * sh /xxx/xxx/xxx/xxx/xxx/backup.sh
—–

Linux上のローカルユーザー宛てにメールが飛んできていたので、エラー内容を確認するも、
—–
No such file or directoryup.sh
—–
と訳が分からないエラーになっていた。このため、shファイルが無い?shファイル内に記載しているディレクトリ?ファイル?が無い???と悩んでいた。

その後、色々と調べた結果、改行コードが以下のようになっていたことが判明した。
—–
*/15 * * * * sh /xxx/xxx/xxx/xxx/xxx/backup.sh[CR][LF]
—–

CRが影響して、
・backup.shを backup.sh[CR] として認識していたっぽい。
・エラーメッセージの改行がおかしくなる。
となり上記のような事象となっていたようだ。

メッセージも本来(shファイルが見つからない場合)であれば、
—–
/xxx/xxx/xxx/xxx/xxx/no_exists_backup.sh: No such file or directory
—–
となっていたと思われる。

あと、shファイル内に記載しているディレクトリかファイルが存在しないのかをチェックするために、shファイル内にecho “START”といった感じでecho文を埋めまくったのだが、これもCRの影響でかうまく表示されてなかった。(CRを除去すると、これもうまく表示されるようになった)

さらに、初期のcrontab -eで改行コードがCR+LFになっていると、以降の編集ではLFにすることができなかった。
これは、
1.crontab -eで、一旦、全行削除。
2.LFに変換したcrontab.txtの内容をコピー&ペースト。
とやっても、改善されなかったため。

1.crontab -eで、一旦、全行削除し、保存終了(:wq)。
2.LFに変換したcrontab.txtの内容をコピー&ペースト。
とすると、ようやく改善された。

あとで気が付いたのだが、crontab -e後の画面下部に

—– 改行コードがCR+LFの場合
“/tmp/crontab.XXXXmZuzWz” [dos] 2L, 98C

—– 改行コードがLFの場合
“/tmp/crontab.XXXXmZuzWz” 2L, 98C

といった感じで、[dos]が出るかどうかでも判断できるみたい。

viで改行コードがCR+LFになっているファイルを開くと行の末尾に^Mが表示される場合があるが、今試してみる限りでは表示されない。
これが表示されるともっと早くに気が付いたと思うのだが、、、どういう場合にでるんだったっけ???

158月/120

四万十楽舎

8月 15th, 2012

8/13 ~ 8/14に、四万十楽舎に遊びに行ってきた。

四万十楽舎とう名前は初めて聞いたのだが、場所的にあの建物かなーと思っていたら、その通りだった。その建物というのが、昔よく手長エビを捕りに来ていた場所の近くにあった小学校。四万十楽舎とは廃校となった小学校を改築した宿泊施設だった。

前週の中頃の天気予報では雨予報でどうなるか心配だったけど、8/13は運よく晴れた。8/14は小雨がぱらつく程度で、四万十川で泳いだり魚釣りをする分には問題がなかった。実家に帰って知ったのだが、他の県では記録的豪雨で災害に見舞われていたようだが、こちらは全然大したことがなくて良かった。

8/13は、四万十楽舎からちょっと戻った場所にある岩間沈下橋で泳いだ。橋の上から水面まで4mぐらいだったので優に飛び込ませるにはよい高さかなってことで。優はびびりながらも、飛び込むことはできた。終始、腰が引けた感じで飛び込んでいたがw。私も以前なら、こういうのはぜんぜん平気だったのだが、飛び込む瞬間のフワリとした感覚がすごーーく嫌な感じだった。それでも、童心に返り飛び込みまくったのだがw。最後までその感覚は消えなかったなー。

  

そうそう、このブログを見てこの沈下橋まで泳ぎに行くって人は回りに居ないけど、沈下橋を支える柱に鉄の棒(人の手で除去できるレベルのものではない)が引っかかっており、その上に飛ぶ込むと危ないので、柱と柱の間から飛んだほうが良い。怖がる人が、より低い位置で飛ぼうとすると、ちょうど柱の上から飛び込むことになる造りになっているのよね。路面から一段下に降りれる構造と言えば良いだろうか。

夕方は楽舎の下で魚釣り。入れ食い状態でハヤ(カワムツ)、イダ(ウグイ)、アイカワ(これは食べてもまずいという印象だったので即放流)が釣れた。あとは見慣れない魚が釣れた。釣った魚は楽舎で揚げてもらえるとのことで、その日の夜ご飯の一品となったw。
ハヤは小学校の時のイベントで食べたっきりだった。それなりの味で以降、食べる気にはならなかったw。久し振りに食べてみたけど、やっぱそれなりw。見慣れない魚は小さかったので頭以外をバリバリと食べることができ、なかなかおいしかった。(今、ネットで調べてみるけど、これ!っていうのが見つからない。ボラかキンブナか???って感じ。でも、河口から随分離れているのでボラではないだろうから、やっぱキンブナ???)

8/14は小雨だったけど、優と川エビを捕るために楽舎の下の川で泳いだ。
が、昔とは違って川原にエビが住めそうなポイントがなかったので、一匹も見かけることができず。今頃は、やはり捕れる場所をしっていないと、捕るのが難しいのかなという印象。

その後(8/14の午後 ~ 8/15の午前中)は、実家に帰って草刈をした。時間が無いため、草刈り機を左右にぶんぶん振り回したので、腰がちょっと、、、

177月/120

須ノ川公園の海水浴場

7月 17th, 2012

須ノ川公園の海水浴場に行ってきた。波打ち際から10mほど沖に出たらサンゴが見えるのでシュノーケリングを楽しめるってことで。

前日から実家に帰省し稲を植えていない田んぼを耕してたりしてたので、実家からとなるが1時間ちょいで着いた。松山からだと、宇和島を越した津島近辺まで行けるので2時間ぐらいで行けるだろうか。以前だと3時間近くかかっていたと思うので随分近くなったものだ。

砂浜かと思いきや結構ゴツゴツとした石の海水浴場だったが、丸い石ばかりだったので裸足でも問題ないかな。特にサンゴが居そうな岩場辺りは小粒な石だったし。

須ノ川海水浴場

海に入った早々、岩の間にタコ発見。狩猟なしのシュノーケリングを想像していたので道具は一切なし。打ち上げられていた竹で突こてみたりと粘ってみたが、どうにもならず断念。

その後はプカッ~と波に漂いながらサンゴ眺めたり、優に潜り方(耳抜きとか)を教えたりしながら、マッタリとシュノーケリングを楽しんだ。さて、上がって帰るかというタイミングで石の下に隠れているタコを発見。優にも潜らせて見せた後、石を剥ぐって手掴みでゲット。剥ぐれる程度の石の下に隠れているタコだったので、小ぶりなタコだった。

帰宅後は、久し振りに自宅のミニデッキでBBQ。タコもおいしく頂きました。

BBQ

127月/120

lvm2パッケージを消してしまった場合

7月 12th, 2012

CentOS 6 minimal で不要なパッケージ(私的に)

http://truering.info/?p=625

の続き。

仮想環境であれば、マザーボードの状態を監視するlm_sensorsは要らなかったな、、、と思って消したらlvm2を消してしまった。(lmなんちゃら==lvm2だったか???と思ってw)

論理ボリュームを利用しているにも関わらずlvm2パッケージを消してしまうと、再起動後は論理ボリュームが認識されずファイルシステムが読み取りとなる。
この場合は以下の手順で復旧できた。

1.電源投入
2.メンテナンスモードでログイン
3.読み取り専用を、書き込み可能状態にする。
投入するコマンドは以下の通り。
mount -o remount,rw /dev/mapper/VolGroup00-LogVol00_root
※/dev/mapper以降は、画面上に表示されているパスを入力する。
※df -hすると、/dev/mapper/VolGroup00-LogVol00_rootが/にマウントされていたので、
上記のパスだったが、そこは環境/状況に応じて切り替える必要があるかも。
4.lvm2を再インストールする。
yumが使えたら、
yum install lvm2
駄目なら、
rpm -ivh http://…/lvm2-2.02.95-10.el6.x86_64.rpm
※URLは、CentOSのミラーサイトなどからパッケージURLを求める。
5.再起動する。
※Hyper-V上のゲストOSの場合はうまく再起動できなかったので、強制電源OFFして起動しなおしたらうまくいった。

117月/120

policycoreutilsパッケージを消してしまった場合

7月 11th, 2012

CentOS 6 minimal で不要なパッケージ(私的に)
http://truering.info/?p=625

の続き。

削除可能なパッケージを探す場合、yum removeで消そうとしてkernelとか主要パッケージが対象となるか(消さない)、ならないか(消す候補)で調べていったのだが、中には単体で消せそうだけど、消したら次回起動時にkernel panicやファイルシステムが読み取り専用で起動してしまうこともある。その1つが、policycoreutilsパッケージ。(恐らく、SELinuxの関連パッケージを消したら不要だと思うけど、無効にしただけだとどうか、、、は試したことがないような気がする)

policycoreutilsパッケージを消した時、kernel panicになり起動ができなくなるのだが、この場合は、SELinuxを無効に&Singleモードで起動し、policycoreutilsを再インストールすれば起動できるようになる。超ざっくりだけど手順は以下の通り。

1.電源投入。
2.Grubの起動直後のカウントダウン時に何かしらのキーを選択して、Kernel一覧を表示する。
※CentOS(2.6.xxx…)という項目が一覧表示され、古いKernelを選択できる画面。
3.先頭にある「CentOS(2.6.xxx…)」を選択したまま、e を選択。
4.さらに「kernel /vmlinuz…」を選択して、e を選択。
5.「kernel /vmlinuz…」のコマンド行の編集状態になるので、末尾に「selinux=0 single」を追記。
6.エンターキー押下などにより、編集状態を終了。
7.b を選択して起動。
8.yum install policycoreutils でインストール。
※起動直後はメンテナンスモードになって、rootのパスワードとかを入れないといけなかったかも。
9.再起動

policycoreutilsパッケージを消してkernel panicになってしまう以外に、、、lvm2パッケージを削除してしまって、再起動後は(論理ボリュームが正常に認識されずに)ファイルシステムが読み取り専用になる、、、なんてことも。この話も後程。

107月/120

CentOS 6 minimal で不要なパッケージ(私的に)

7月 10th, 2012

ここ最近、CentOS 6をインストールする時はminimal構成でセットアップしてから必要なパッケージをインストールしている。
例えば、以下のように。

yum install acpid (仮想の場合は不要。論理スイッチないし)
yum install logwatch
yum install ntp
yum install wget
yum install yum-cron

そして、/etc/init.d配下を覗いて不要そうなデーモンを削除する。(パッケージ名は、rpm -q –whatprovides /etc/init.d/xxxxx で調べる)

yum remove device-mapper-multipath (CentOS5では、kernelも対象になるのでNG)
yum remove iscsi-initiator-utils (CentOS5では、kernelも対象になるのでNG)
yum remove libcgroup
yum remove fcoe-utils
yum remove lldpad
yum remove rpcbind
yum remove yum-updatesd

これでスッキリするんじゃなかろうか。

上記削除パッケージは、yum removeで消そうとして、kernelとか主要パッケージが対象となるか(消さない)、ならないか(消す候補)で調べていったのだが、中には単体で消せそうだけど、消したら次回起動時にkernel panicやファイルシステムが読み取り専用で起動してしまうこともあるので注意が必要だ。(その話は、後述)

57月/120

cron + sh + wget 改め curl で HTTPレスポンスコード判定

7月 5th, 2012

定期的に、とあるURLを呼び出すのにcron + sh + wgetで行っていた。

RESULT=`wget $URL –server-response –spider 2>&1`
CHECKRESULT=`echo $RESULT | grep -c ‘HTTP/1.0 200 OK’`
if [ $CHECKRESULT -eq 0 ]; then
cat $RESULT | mail -s “$MAIL_TITLE” $MAIL_TO
exit
fi

HTTPレスポンスコードの判定がスマートじゃないなぁ~(200固定だしw)と思いながらも。

今回、HTTPレスポンスコードに応じて処理を振り分ける必要が出てきたので、HTTPレスポンスコードをスマートに判定するやり方(というか、値判定が容易にできる方法)が無いか再度調べていたら、curlでできそうなことが分かった。
その結果、以下(cron + sh + curl)のように。

RESULT=`curl –silent –write-out %{http_code} –url $URL1 –output $DOWNFILE1`
if [ $RESULT -ge 400 ]; then
cat $DOWNFILE1 | mail -s “$MAIL_TITLE” $MAIL_TO
exit
fi

うん、いいんじゃないでしょうか。

286月/120

git : originが無いサーバー上にデプロイする

6月 28th, 2012

pushされたと同時にoriginがあるサーバー上でデプロイする場合はフックしてやればいいかってことは分かったのだが、originがないサーバー上でpushを切っ掛けにデプロイしたい場合はどうしたらいいのかなー、、、と思いつつも、とりあえずはcronで定期的にデプロイするかなと。

これが最初から分かっていればとか、環境を自分で設定したものだったとしたなら、デプロイ用のアカウント+パスワード認証じゃなくて鍵認証(パスフレーズなし)にしてやるのだが、そうでもない環境でやる必要があったので、ちょっと難儀した。特にgit pullのパスワード入力の自動化。

調べた結果、expectコマンドが利用できるらしく、最終的には以下のようなスクリプトが出来上がった。

#!/bin/bash

expect -c ”
spawn git pull
expect \”password: \”
send \”PASSWORD\r\”
interact

cp -r html/* /var/www/html

exit 0

spawnで指定コマンドを実行し、expectで書いた文字がコンソール上に表示されたら、sendで書いた文字を入力する、ということかな。

上記以外にも、git/configや.ssh/configにこういう設定を入れればよりスマートになるとか、あれば教えてください。

追記:
上記のスクリプトをシェル上で実行したら問題なかったけど、cron実行させたらうまく動かなくなった。
どうやら、expectの終わり方がまずいみたい。シェル上で実行した場合は、expectにて奪い取ったシェルの制御をinteractにてユーザーに制御を戻す、ってことが必要なのだが、cronはdaemon実行だからかtthの割り当てが無いからか、interactではなく、さらにexpectにて別の結果を持って自前でexitするなどして終了する必要があるようだ。
そこで以下のように修正(done.か、Already…があれば終了する)。だから、git -q pullでのサイレント実行はNGかな。

#!/bin/bash

expect -c ”
spawn git pull
expect \”password: \”
send \”PASSWORD\r\”
expect { \”done.\” { exit 0 } \”Already up-to-date.\” { exit 0 } }

cp -r html/* /var/www/html

exit 0

あと、cronで実行すると、git pullの実行結果が標準出力に出力されるため、cronの実行結果がガシガシ飛んでくる。なので今回は/dev/null行きとする。
以下のように。

*/15 * * * * root sh /root/auto_git.sh > /dev/null 2>&1

追記:
done.が出るタイミングは、まだpull中の段階なので、先にcpが走ることになるのかな。ってことで、
expect { \”files changed\” { exit 0 } \”insertions\” { exit 0 } \”deletions\” { exit 0 } \”Already up-to-date.\” { exit 0 } }
とした方がいいのかな。(3つの文字列は1行に出るが、出ないものもあるだろうから、ってことで3つ書いたが、正規表現で1つに纏めればいいが、取り急ぎってことで)