2011年3月5日土曜日

ブログ引越し b

こちらのブログは閉鎖して、ブログを移転します。

2009年10月9日金曜日

サンシャイン牧場 b

初めてのmixiアプリに挑戦

久々にmixiにログインしたら、なんか色々mixiアプリの招待がきてた。色々みてると、今話題のサンシャイン牧場を発見。名前こそ聞けど、mixiにぜんぜんログインしてなかったから、ずっとなんだろう?と思ってた名前だった。



サンシャイン牧場をプレイ

とりあえずやってみた。
Flashアプリなのね。
昔やっていた「牧場物語」のゲームを思い出した。あれよりははるかにシンプルだが、これぐらいのシンプルさだから、続くのかもね。中国の方が開発されているようで、日本語が辺なところが多々あるのはご愛嬌。


Safariで切り取って、Dashboardに設置してみた。なかなかよいかも。
マイミクがすでに何十人もこれやってたおかげで、最初のうちから、いろんな牧場見に行ったり、荒らしたりできて楽しい。メッセージ見ると、結構な頻度で周りからのちょっかいがくる。なんかサーバーのアクセスログ見てる気分だ。。。でもなかなか面白い。






iPhoneで

少しやってみたが、結構こまめに見ておかないと、干からびてたり、育ったのに収穫し忘れて、作物をどんどんマイミクに持っていかれたりする。となると、iPhoneなんかでチェックしたいところ。
しかしサンシャイン牧場はFlashアプリなので、iPhone上ではそのままでは遊ぶことができない。
てっとり早い方法としては、VNCやリモートデスクトップなどを使い、PC上のブラウザで実行しているサンシャイン牧場を、iPhoneからリモートで操作する方法が思いつく。

今回使用したiPhoneアプリは「Mocha VNC Lite」というVNCクライアントである。Mocha VNCには有料版と無料版があるが、今回の様にサンシャイン牧場したいだけであったら、無料版で十分。

macでの設定方法は、iPhoneからWindows、Mac PCを操作できるアプリ【Mocha VNC Lite】 などを参考のこと。Windowsだったら、PC側にVNCサーバーを導入してMocha VNC Liteを使うか、もしくはWindows標準のリモートデスクトップを有効にして、iPhoneアプリとしては「RDP」を使用すればいいと思う。



導入後、iPhoneの画面から、家のmacを遠隔で操作しているスクリーンショット。


こんな感じ。
水やり、虫取りは、作物をタップしていくだけなので、3G回線でもなんらストレスなく使えた。



拡大縮小もVNC側でできるから、特に操作ではこまらなかった。

2009年10月6日火曜日

backup shell script b

#!/bin/sh
export LANG=C

DATE=`date '+%Y%m%d_%H%M'`
GENERATION=2
BACKUP_PATH='/path/to/backup/dir/'
ARCHIVE_TARGET_DIR='/path/to/target/dir'
ARCHIVED_FILE_NAME=${ARCHIVE_TARGET_DIR##*/}_${DATE}.tar.gz



archive() {
echo "archive ${ARCHIVE_TARGET_DIR}"
tar zcf /tmp/${ARCHIVED_FILE_NAME} ${ARCHIVE_TARGET_DIR}
}


delete_old_backup() {
num=`ls -t ${BACKUP_PATH}${ARCHIVE_TARGET_DIR##*/}_*.tar.gz | wc -l`
num=`expr ${num} - ${GENERATION}`
if [ ${num} -gt 0 ]
then
echo "deleting ${num} files..."
for file in `ls -t ${BACKUP_PATH}${ARCHIVE_TARGET_DIR##*/}_*.tar.gz | tail -${num}`
do
rm -f ${file}
done
fi
}

if archive
then
mv /tmp/${ARCHIVED_FILE_NAME} ${BACKUP_PATH}
delete_old_backup
echo 'backup successful!'
fi

2009年9月30日水曜日

ATNDのイベントをGoogle Clendarに登録するGreasemonkeyスクリプト b

探せばもうありそうな気もするけど、ほしいなと思ったので書いてみた。

インストール


Firefox アドオンのGreasemonkeyがすでに導入済みならば、
ここをクリックして、スクリプトをインストールできます。

ソース


最終更新:2009/10/05 01:04
ボタンが表示されない場合があるのを修正しました。
やっつけ仕事。
// ==UserScript==
// @name atnd2gcal
// @version 1.3
// @namespace http://tbl.jp
// @description author: takabow
// @include http://atnd.org/events/*
// ==/UserScript==

(function() {
var xpathTitle = "id('main_title')/h1";
var xpathMemberList1 = "//div[@class='side_member_num']"
var xpathMemberList2 = "id('member_list')";
var xpathDate= "id('events_show_contents')/div/dl[1]/dd/abbr/@title";
var xpathPlace= "id('events_show_contents')/div/dl[3]/dd[@class='location']";
var title = document.evaluate(xpathTitle ,document,null,7,null).snapshotItem(0).firstChild.data;
var eventDiv = document.evaluate(xpathMemberList1 ,document,null,7,null);
if(!eventDiv.snapshotItem(0)) {
eventDiv = document.evaluate(xpathMemberList2 ,document,null,7,null);
}
var abbr1 = document.evaluate(xpathDate ,document,null,7,null);
var abbr2 = document.evaluate(xpathPlace ,document,null,7,null);
var startDate = abbr1.snapshotItem(0).firstChild.data;
var endDate = startDate;
if(abbr1.snapshotItem(1)) {
endDate = abbr1.snapshotItem(1).firstChild.data;
}
var place = abbr2.snapshotItem(0);
var place1 = place.firstChild.data;
if(place.childNodes[1]) {
place1 += place.childNodes[1].firstChild.data;
}
var gcalURL = document.createElement('a');
var gcalp = document.createElement('p');
var gcalImg = document.createElement('img');
gcalImg.src = 'http://www.google.com/calendar/images/ext/gc_button2_ja.gif';
gcalImg.alt = "このイベントをGoogle Calendarに登録";
gcalURL.href = 'http://www.google.com/calendar/event?action=TEMPLATE&dates=' + startDate + "/" + endDate + '&location=' + encodeURIComponent(place1) + '&text=' + encodeURIComponent(title) + '&details=' + document.URL;
gcalURL.appendChild(gcalImg);
gcalp.appendChild(gcalURL);
eventDiv.snapshotItem(0).appendChild(gcalp);
})();

2009年4月25日土曜日

Debug Hacks Conference 2009 b

4/23(木)にDebug Hacks Conference 2009に参加してた。実のところ、いわゆる最近流行の"勉強会"に参加するのはこれが初めて。最初ちょっとどきどきした :D



最初に感想


かなり面白く、また有益なカンファレンスだった。実際日頃から開発をしている人の考え方やアプローチを聞くことができた。

ところで、今回の参加者の方はやはり仕事で開発をされる方や、趣味で開発をされている方が多かったのだろうか。そこは実は結構気になるところだったりする。なぜなら自分は開発者ではないからだ。趣味で開発をしないといったら嘘になるが、仕事でソースコードに触れる機会はほぼないし、学生時代と比べて日常的にソースコードに触れることはほとんどなくなってしまった。

しかしながら、仕事ではコンサルティングといったことを行うため、さまざまなシステムを見る機会がある。そこではパッケージ製品やお客様の重要なシステムのように、ソースコードにアクセスできないものが多々ある。そのような場合printf()デバッグなんてそもそもできないわけで、限られた情報やツールを使ってシステムを解析し、問題点を特定する必要がある。

Conference中に「バグは自明である」という言葉が登場した。まったくもってその通りだと思う。しかしソースコードを見ることができないシステムのように、外から隠ぺいされた場合バグは自明ではなくなってしまう。

今回、書籍DEBUG HACKSやDebug Hacks Conferenceに期待した内容は、上述したように如何にして"非破壊的"にシステムの問題点を特定するかである。その方法はログを見るといった基本的なところから始まり、straceなどのツールを使うこともあるだろう。もちろんアーキテクチャを知らなければ、ツールを使えたとしても本質的な部分へのアプローチは難しい。

今まで断片として学び経験してきたDebug手法だが、DEBUG HACKSを通して、これらの基本及び応用を、体系だって再度学んで行きたいと思う。

発表内容の詳細は他の方がblogで詳しく書かれているし、そもそも動画もアップされているので、中身についてはメモ程度に。


よしおかさん


書籍DEBUG HACKSの "はじめに" を朗読。


大和さん


自分は参加登録のページでの投票にstraceの話を聞きたいと投票したのだが、したかいがあったかな。

~strace~
・straceの定石は最後から見る
・strace -i でアドレス表示
 → アドレスを使ってgdbでブレークポイント

Q:アドレスがランダマイズされる場合はどうすればいい?
 A:基本的にはそういう場合は使えない。それが起こらない環境でやるしかない。


大岩さん


RPMコマンドの -f オプションや -lオプションのことは初めて知った。そういう使い方もあったのかと。sh -x はよく使ってる。デフォで使っておきたい。

~RPMコマンドによるデバッグ~
問題:/var/spool/clientmqueue/ にファイルにどんどんたまる
解決:ファイルが作成されないようにしたい
疑問:いつ誰が作ってるか分からない。

・こういうときはrpmコマンドを使う
# rpm -qf /var/spool/clientmqueue
 → sendmail-8.13.802.2AX と表示されるのできっとメール関係
・実際に生成されるファイルの中身を見る。
 → logwatch が書かれていた
# rpm -ql logwatch | grep etc

~スクリプトのデバッグ~
・bashであれば -x オプション
 → 結果だけでなく、実行されたコマンドも表示される。


安部さん


~GDBネタ~
・ユーザー定義コマンドが便利
 → debuginfoがなくても、がんばればきれいに構造体をダンプできる。
 → でもアドレスとか変わっちゃうだけで使い物にならなくなる。
  → やはりdebuginfoのシンボル情報だけでもあると楽
 
 

島本さん


~malloc() free()で障害~
・free()でsegmentation faultが起こった。
・大体の場合はこれはアプリケーションのバグ
 - 2重開放
 - 不正アドレスの開放
・デバッグ方法は
 - メモリバグ検出ツール(Valgrind)
 - glibcのMALLOC_CHECK


吉田さん


~Debug Hacks Hacks~
・Debug Hacksを使うためには、問題をの切り分けが必要。
・相関関係≠因果関係
・真の目的は何かを考える?
 → 期限は?
  → "できるだけ早く"ではダメ。明確に。
 → 最悪のケースを考える
・事例調査
・誰が対処する?
 → 自分より効率的に対処できる人や団体。助言をもらえる人。
・責任と期限を決めたら行動ありき
・目的のために、"有効ならば"手段は選ばず。
 → つまり本末を転倒しない
・原因は?
 → 疑わしいものがあったら1つずつ試す。
  → まとめてやるとどれが原因か分からない。
・事前準備
 各種バックアップなど
・覚悟を決める
 → 壊れたら最悪どうする?
・切り分けの方法
 → 再現性
 → 再現手順が100%になったらほぼ完璧


Yuguiさん(園田裕貴さん)


・Rubyそのものの開発のお話
・バグを再現させる

・しかし現実にはレガシーコードの存在
 → テストがないコード
 → そのコードはなぜ必要?本当に必要?
  → 不要だと思うなら削除
   → 削除しても動くなら本当にいらないコード

・バグは自明である
 → assertをたくさん仕掛ける
  → assertを消していったら最終的に1箇所しか残らなかった。

・デバッグで特定に苦労する時点で敗北
 → しかし負けることもある。
・バグを二分探索
・誰(何)がデータを壊したか?
 1. その場で壊された → 自明
 2. フレームを上に上る → 引数
 3. ひたすらwatch、条件でbreak point

・それでも敗北するときもある。マルチ・スレッド。
 → 最終的には試行錯誤


おまけ


Q:本の表紙が蚊取り線香なのは?
 A:むしをとりましょう
   → 蚊取り線香


よしおかさんから告知


・5/9に新宿のジュンク堂で、共著のみなさんとお話し
・5/28(木)参加できなかった向けに、またイベントを開催。ミラクルリナックスの会場予定。
・Japan Linux Symposiumが10/21~23に秋葉原で開催。Linusとかも来る。


戦利品


2009年4月21日火曜日

平成21年度データベーススペシャリスト試験 b

平成21年度春期試験データベーススペシャリスト試験(DB)を受けてきた。高度情報処理技術者試験は一昨年のテクニカルエンジニア(ネットワーク)1に次いで2つ目。

所感


所感としては、ネットワークは普段触れていたら受かるような試験だったのに対し、データベースは普段触ってるだけじゃ受からない試験かなというところ。

一昨年のネットワーク試験では、特に午後対策もせずに臨んだが、当時大学院で専攻していたこともあり合格することができた。

しかし今回のデータベース試験はというと、用語や定義をしっかり覚えておかなければ、とても記述問題を書くことができなかった。


午前


今回から午前が午前Iと午前IIに分かれた。午前Iは高度情報処理試験の共通問題(30問)。午前IIはデータベーススペシャリストの専門問題(25問)。採点に関しては今までどおり、午前Iが合格点に満たなければ午前IIは採点されず、午前IIが合格しなければ午後Iは....という方式。

午前Iは今までで言うところの基本情報や、ソフトウェア開発技術者の午前問題に近い気がする。計算問題は定番の問題が登場。ただし、用語や制度名の意味を問う問題は、ここ2年ぐらいに登場した新しいものも出てくるので注意。

午前IIは2/3はSQLや正規化といったいわゆるDB的な問題だけど、残り1/3はどちらかというとIT一般問題。DBの問題は勉強するとして、残り1/3の一般問題は午前Iの延長みたいな感じだから、午前Iの勉強でまかなえそう。

とりあえず試験後に公開された解答で採点したところ、
午前I : 25/30
午前II: 22/25
だった。


午後


午後Iは、まじめに勉強(対策)していない自分にとって地獄の問題だった。まず問3が普通のSQLを含む問題だったので、迷わず選択。さて問題なのがもう1問をどうするか。問1も問2も、まじめに勉強した人にとっては簡単だと思うけど、サボった自分にとってはとても書けない記述問題。「関数従属」とかそういう単語を使いまくって記述するやつですね。仕方なしに問2を選んだけど、これはマジで落ちた。ムリ。

午後IIは、午前Iが散々だったのでもうまじめに受ける気力がなくなってぐだぐだ:p
問1を選択した。バックアップとレプリケーションが絡む標準的な話だったので、割と書くことができた。
あー・・・午前Iが悔やまれる。



1:新区分における「データベーススペシャリスト試験」に相当する過去試験

2008年12月17日水曜日

RHEL5をDELLへ入れようとすると、インストーラがハングアップする(Xが起動しない) b

Red Hat Enterprise Linux 5 Update 2 をDELLのとあるPCにインストールしようとしたら、最初のメディアチェックのあと、インストーラーが立ち上がらずハングアップ。

Running anaconda, the Enterprise Linux system installer - pease wait...
Probing for video card: Intel Corporation 82Q963/Q965 Integrated Graphics Controller
Attempting to start native X server
Waiting for X server to start...log located in

と出た瞬間にハングアップ。画面真っ暗。
ドライバの相性問題かね。

とりあえずtextでインストールしたけど、やっぱりその後startxしてもハングハング。
探してみたらこんなの発見。
別にこれじゃなくてもいけると思うけど、まぁ新しいからこれ入れとくことにしたー

[xorg-x11-drv-i810]
http://www.jp.redhat.com/support/errata/RHEA/RHEA-2008-0420J.html
xorg-x11-drv-i810は、X Window System のX.org実装に対応したIntel統合グラフィックスチップのドライバを提供します


yum install xorg-x11-drv-i810

で簡単インストール。
あとは

/etc/X11/xorg.conf のDeviceセクションでドライバをi810に書き換えるだけで完了。
Section "Device"
Identifier "Videocard0"
#Driver "intel"
Driver "i810"
EndSection


無事startxできました。

2008年12月16日火曜日

SyntaxHighlighterを試す b

SyntaxHighlighterテスト


public class Test {
public static void main(String args[]) {
System.out.println("Hello world!");
}
}



できた

NetAppに再起動なしでdefault gateを設定する b

ファイルサーバーとして使っているNetApp社のストレージの設定をしていたときのこと、、、
NFSマウントして使っているのだが、こいつのネットワークの設定でデフォルトゲート間違ってたので修正したら、再起動しないと反映されないとか書いてやがった。
ちなみにブラウザから設定していた。



デフォルトゲートが間違っているために、一部のネットワークからNFSマウントできなくて困っていたのだが、すでに接続されているネットワーク(のNFS)を切断は避けなくてはならないため再起動できない。sshで直接接続してから、ルーティングテーブルを手動で書き換えようと情報量の少ないman routeをみながらあれこれ試してたらやっとできた。 ←(危険)

例えば192.168.1.1 -> 192.168.0.1 に変えたければ、以下のコマンドでいけた。

>route delete 192.168.1.1
>route add net 0.0.0.0 192.168.0.1 1

でも
>route -f
してフラッシュすると消えちゃうっぽい。

気持ちよくなるためには、やっぱそのうち再起動が必要なのかね。
NetAppはわからん。
全然普通のUnix的なコマンド少ないし(lsぐらいほしい)、
sshからの切断が Ctrl+Dだったりするし(exitって叩いたらCtrl+Dしろって出る…)。

2008年11月21日金曜日

夕焼け空に映える富士山 b

昨日今日と、会社から見える富士山がきれいだった。都内からでもこんなにもみえるんだね。

沈む夕日が富士を照らし、その影が一筋の黒い線として空に映っている - 2008/11/20



いつになく赤い夕日が雲と富士を照らしていた - 2008/11/19