2011年12月27日火曜日

Visioで接続ポイントを追加する


プログラムの相関図をVisioで描いていて、「一つのオブジェクトに複数のプログラムがアクセスする」という事象に遭遇した。
単に、そのままコネクタを接続させれば目的は果たせるんだけど、一つの図形にコネクタが何本もくっついて、コネクタの方はみんな重なって表示されてしまって、どうにも見づらい…。
どうにかならないのかなぁ、と思って調べていたらオブジェクトの接続ポイント増やせばいいことが分かった。
http://office.microsoft.com/ja-jp/visio-help/HP001231166.aspx

簡単に書くと

  1. メニューの[表示]から[接続ポイント]をクリックして、接続ポイントツールを使えるようにする
  2. 接続ポイントを追加したい図形をクリック
  3. [コネクタツール]の横の▽をクリックして[接続ポイントツール]を選択
  4. 接続ポイントを追加した図形上で、Ctrlを押しながら、クリックすればOK


これで見やすくなった!

2011年12月15日木曜日

pg_queryでSQLの失敗時にFALSEを返さない


PHPからPostgreSQLへpg_queryでSQL文を実行してみている。
その時に、構文間違いやデータ整合性などの理由で失敗する。
で、エラーを出して終了してしまう。

マニュアルによるとFALSEを返すはずなんだけど…。
とりあえずset_error_handlerでカスタムエラーハンドラを作って対処してみた。



function pg_query_test( $conn )
{
  $sql = "INSERT INTO NO_EXIST_TABLE VALUES ( 1 );";
  // エラー終了させないようエラーハンドラをセット
  set_error_handler( "my_error_handler" );
  $result = pg_query( $conn, $sql );
  restore_error_handler();if ( $result )
  {
    return true;
  }
  else
  {
    return false;
  }
}
function my_error_handler( $errno, $errstr, $errfile, $errline )
{
  echo "[errno]:   $errno\n";
  echo "[errstr]:  $errstr\n";
  echo "[errfile]: $errfile\n";
  echo "[errline]: $errline\n";
}
?>


実行してみて、errnoは2(E_WARNING)と分かった。
しかし、pg_queryの前でset_error_handlerして、終わったらrestore_error_handlerってのもあんまりスマートなやり方じゃないね…。
ひとまずこれで行っておくか…。

と思いきや、pg_queryだけじゃなくて、pg_copy_fromなんかでも同じようにエラーを出して終了しちゃう…。
さすがにpg_系が全部間違っているとは考えにくいので、DBかPHPの設定?と思い、とりあえず/etc/php.iniを見てみた。
"Error handling and logging"の部分で、
error_reporting  =  E_ALL
となっているのを発見。

試しに関数内で
error_reporting( E_ERROR );
にしてみたところ、失敗してもちゃんとFALSEを返すようになった!

ただ、これだと毎回error_reporting関数を呼ばなくちゃいけないので、面倒。
/etc/php.iniを変えて問題なければ、書き換えたほうが楽だね。
多分、問題ないけど検証してからやってみよう!

2011年12月14日水曜日

シェルスクリプトの関数にパイプで渡す


bashでシェルスクリプトを書いていて、関数を使っていたんだけど、パイプで標準入力を渡したくなった。
で、どうしたもんかと思っていたら、こちらに出会った。
http://dsas.blog.klab.org/archives/51060184.html

これは素晴らしい!
実はパイプでどう受けるとかも知らなかったので、
cat -
を知っただけで目からウロコ。

さらには、testコマンドで パイプで繋いできてるのかまで判定できると知って衝撃。
これは便利。

助かりました!

2011年11月29日火曜日

rootでパスワードなしのSSHを使用してrsync…危険じゃないの?


元々はFTPだけしか使えない、ログイン不可のユーザ(シェルが/sbin/nologin)でrsyncも出来るようにしたかった。
でも、nologinのユーザだとrsync -e sshとしても失敗。
rsyncはログインしなくちゃできないから、それも当然。

そこで、rsync用のユーザを作って、rsyncすることにした。
sshでパスワードなしにすることも簡単。
ただ、ファイルの権限がrsyncになってしまう…。chmodで変更が出来ない…。
chmodはrootじゃないとダメだから。

じゃあ、rootでパスワードなしのSSHなら出来る。
いや、それはさすがにマズイ。
どうしたもんか、と思っていたところ見つけた。
http://sonic64.com/2004-11-17.html
http://www.ice.is.kit.ac.jp/~umehara/misc/comp/20061121.html

つまり、鍵ファイルによって実行できるコマンドを絞ることが出来る。
authorized_keyの鍵情報にcommandを追加。
そこにrsyncコマンドを入れておけば、いいわけだ。
通常のsshは鍵なしだから、普通にsshしてきたら普通に使える。
鍵を指定してsshしてきたら、指定したcommandだけ実行して終わり。

全然知らなかったけど、sshは奥が深いね!なんとなく世界が広がる気がする!

2011年11月21日月曜日

MCITP合格


70-663 Pro: Designing and Deploying Messaging Solusions with Microsoft Exchange Server 2010に合格。
この前受けた、70-662の上位資格。

日本語では情報が乏しいので、英語のテキストや問題集を使い、英語で受けた。
変な訳とかないので、その辺は英語の方がいいのかも。
テキストは一回通して読みつつ、あとは問題集を繰り返しやった。
多分、7回ぐらい。
分からないところをテキストとtechnet等でチェック。

他の人の合格体験記を読むと、technetだけで合格してたりするね。
スゴイわ、尊敬。
問題集なかったら絶対ダメだったと思う。

Exchange Server 2010の上位資格なんだけど、未だに本社のExchange Serverには触れないまま…。
忘れてしまう前に触っておきたいなぁ…。

2011年11月17日木曜日

PostgreSQLで文字列の結合(||)をすると勝手にトリムされる


開発中に「あれ?!」と思ったので記録の意味で。

DBからデータを引っ張っていて、フィールド定義はtext型だが、固定長で出力する必要があったため、
SELECT 'hoge ' || field1::char(20) FROM table1;
というように書いた。

が、結果は
hoge AAA↵(改行コード)
というように勝手にトリム(trim)されている。

なんで?と思って、調べたら文字列を結合する演算子の||は、返す型がtextのため、不要な空白は消してくれているらしい。

なので、実装には
SELECT 'hoge ' || rpad( field1, 20 ) FROM table1;
というようにしたら大丈夫になりました。

2011年11月15日火曜日

redmine 1.2.1にredmine_importerをインストール


CSV形式でチケットをインポートできるredmine_importerをインストールした。
ホントはMS Projectからそのままが一番よくて、suerさんが作成してくれたXML形式なら対応しているプラグインもあるんだけど、データが大きすぎたようで読み込めなくなっちゃったので、一旦CSVにしてからインポートすることに。


redmine_importerを元々知ってたわけじゃなく、調べているうちに知っただけ。
rchadさんが作り、junoさんが改良してくれて、ネットではこちらの手順がいっぱいあった。
日本語で使う時には、langフォルダにあるja.ymlをconfig/localesに置いて、インデント揃えて、といろいろあってやってみたけど、結局うまく行かず。
もしかして、バージョンが違うから合わない?と思い、探ってみると2年以上更新がない…。

どうしよう…と思ったけど、githubで同じ名前で検索かけたら、tsukanoさんって方が作っているじゃないですか!
https://github.com/tsukano/redmine_importer
これを入れたらすんなり動きました!
どうもありがとうございます!!

2011年10月21日金曜日

コマンド置換でタブが消える


Korn shellでのコマンド置換をしていた。
タブ区切りのファイルの一行目だけを変数に代入しようと

hoge=`head -1 tab_file`

として無事格納。
なんだけど、その後の処理で、どうも躓く。

保存されている文字列は
aaa bbbb cc
というような形で当然、これがタブ区切りになっているはず。

しかし、
$ echo $hoge | cat -t
とやると
aaa bbbb cc
となるだけ…。

本来、タブ区切りになっていれば
aaa^Ibbbb^Icc
とタブの部分が「^I」になるはず…。

念のため、od -xコマンドでダンプをしてみると、やはりタブ(0x09)ではなくスペース(0x20)になっている。

$ echo $hoge | od -x
0000000 6161 61
20 6262 6262 2063 630a
0000014
$ head -1 tab_file | od -x
0000000 6161 61
09 6262 6262 0963 630a
0000014

headが悪いのかと思い、awkやperlで一行目だけ取ってみたが結果は同様。
「シェルの問題?」と思い、zshに変えたら、うまく行った。

% echo $hoge | cat -t
aaa^Ibbbb^Icc

とりあえずなんとかなったけど、それしかないのかなぁ…?
どなたか何か知ってたら教えてください!!

2011年10月20日木曜日

シェル変数をperlで扱う

備忘録。

シェルスクリプトを書いていて、便利なperlの力を借りたくなる時がある。
何度か「どうだったっけ?」と調べているので、備忘録として書いておこう。

hogeというシェル変数をperl上で扱いたいなら、シェルに展開させればいいので

hoge="hogehoge"
perl -e 'print \"$hoge\";' 
あるいはperl -e 'print "'$hoge'"';

環境によってはどっちかしか動かなかったりするみたい。

joinコマンドに渡すパラメタを作りたくて使ったのが下記。
( $field_num はフィールド数を格納したシェル変数 )

OUT_PARAM=`perl -e 'foreach ( 1..'$field_num' ) { print "1.$_ ";}'`
これで1.1 1.2 1.3 1.4 ...というような文字列が返される


2012.12.27 追記

perlのバージョンなのか、別のサーバでうまく動かなかったので、再度調べてみた。
一番いいのは、環境変数に突っ込んでしまうことみたい。


export hoge="hogehoge" 
perl -e 'print "$ENV{hoge}";' 
※export の代わりにtypeset -x でもOK


シェルスクリプトの中で環境変数に入れれば、子プロセスには引き継がれるけど、親が終われば、そこで元に戻るので、他に影響はないはず。

こっちの方が確実みたいです!

2011年10月13日木曜日

rpmが固まる


rpmが固まってしまい、無理矢理killするしかなくなってしまった…。
調べてみたら、
# rpm --rebuilddb
すれば直る、とあったのでやってみた。なんかDBがおかしくなっちゃったのね。
無理矢理killしたりも悪かったんだろう。

コマンド打って放置。
あれ、20分ぐらい経つけど、まだやってる…。
また固まってない??

さらに調べてみると、どうやらロックファイルが残っているため固まってしまうらしい。
http://his.luky.org/ML/linux-users.a/msg00348.html
# rm -f /var/lib/rpm/__db.*
# rpm -vv --rebuilddb
-vvを付けたので今度は動いているかは確認出来る。
お、5分もかからず復活!
よかったよかった!

しかし、killするしかないってのはキビシイ…。

Seleniumを使ってみた その3


前回前々回と引き続きSelenium 2.0の話。
Webアプリのテストに便利そうだけど、全部自分でスクリプト書くのはちょっと面倒だなぁ、なんて思っていたら、ちゃんとツールがあった。
Selenium IDE

Firefoxのアドインで、実際にブラウザ操作しながら記録できる。
しかも、その記録はJava, PHP, Perl, Rubyなど多種の言語にエクスポート可能!!
もちろんエクスポートしたコードはSeleniumが動いているサーバに置けば実行可能。
これはスゴイ!

自分でソース見ながら「このテキストボックスのIDがこれで、パスワードのIDがこれ…」とか地味な作業が一気になくなる。
なんて便利なんだ!!

とりあえずPerlでやってみる。
cpanでいろいろインストールが必要だったが、特に問題なく終了。
ただUTF8が前提なので、is_test_present_okなどで日本語の文字列の存在確認をしようとするとそのままだと失敗する。
use utf8;
を最初にくっつければ動くようになった!

2011年10月12日水曜日

Seleniumを使ってみた その2


前回は導入しただけなので、引き続き、Seleniumを使ってみる。

まずはWebDriverのドライバ(ややこしいな)を選ぶ。
大雑把に言ってしまうとWebDriverは、ブラウザの名前。
Firefox, IE, Chrome, Opera, iPhone, Android, それにHtmlUnitというのがある。
(2011年10月12日現在では、Opera, iPhone, Androidは使用不可)
例えば、Firefoxのドライバは、Firefoxをブラウザとして使用してテストする。
IE, Chromeもその名のとおり。
HtmlUnitというのはサーバから返されるHTML文書を解析して動くらしい。
テキストだけなのでやりやすいけど、実際の画面は見えないし、「本当にIEで動かしたらどう見えるか?」は分からないのが欠点。
でも、Rubyではサポートされてない…。

使い方は
driver = Selenium::WebDriver.for :<ドライバ名>
とすればロードされる。

テストしたいページを開くには
driver.get
となる。

さて、例えばログイン画面が出てきて、ちゃんとログインできるかテストするにはどうするか?
そんな難しい話ではなく、HTMLエレメントの名前やらIDを使って指定すればいい。

まずはエレメントを探す。
id = driver.find_element :name => "username"

そのエレメントに値を入力するには
id.send_keys <ユーザ名>

パスワードも同様に
pass = driver.find_element :name => "password"
pass.send_keys <パスワード>

でフォームの内容を送信。
pass.submit

divのcontentクラス内のh3を取得(10秒だけ待つような設定)
wait = Selenium::WebDriver::Wait.new(:timeout => 10 ) #10 秒
begin
  result = wait.until { driver.find_element(:xpath => "//div[@class='content']/h3") }
ensure
  driver.quit
end

これでassertとかすればよさそう。

Selenium 2.0は便利だけど、ドキュメントがまだまだ整備されていないのが残念。
これからどんどん増えることを希望。

さらに続きます。

Seleniumを使ってみた その1


最近リリースされたSelenium 2.0を使ってみた。
http://seleniumhq.org/
公式には前バージョンからいろいろ変わった点があるが、そもそも前バージョンを使ったことがないので、この辺は読み飛ばし。

テストプロジェクトの設定で、2011年10月12日現在ではJava, C#, Python, Rubyしかサポートされていないらしい。
この中じゃJavaが一番分かるかなぁ、と思いきやMavenを入れる必要があるっぽい。
いや、なくても出来るんだろうが大変らしい。
業務でJava使わないからそこで時間取られるのもなぁ。
う~ん、サンプルコードしか打ったことないけどRubyにするか(無謀?!)。

まずはインストール。
公式からSelenium Serverをダウンロードしたけど、要らなかったかも…。
http://seleniumhq.org/download/

単に
# gem install selenium-webdriver
でよかったみたい。

rubyのサンプルコードも公式にあったので、そのままコピペしてgoogleTest.rbというファイルに保存し動かしてみる。

% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/binary.rb:116:in `path': Could not find Firefox binary (os=linux). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path= (Selenium::WebDriver::Error::WebDriverError)

失敗。
firefoxを使ってテストしているのに、firefoxが入ってなかった…。
そういえばfirefoxがなかった。yumでインストール後、再度実行。
% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:77:in `connect_until_stable': unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:37:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/socket_lock.rb:20:in `locked'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/bridge.rb:19:in `initialize'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `new'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `for'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver.rb:81:in `for'
        from googleTest.rb:4

またも失敗。
そうか、firefoxだからGUIが必要。CUIでやってたらそりゃ起動できないわ。

気を取り直してGUIで実行。
(TeraTerm + Xmingの環境構築はこちらを参考に。)
http://d.hatena.ne.jp/information-world/20090602/1243938029

firefoxが起動後、パパっと勝手に動いて結果出たら終了。
% ruby googleTest.rb
Page title is Cheese! - Google 検索
Page title is Cheese! - Google 検索

なかなかおもしろい!
続きます!

2011年9月29日木曜日

TestLinkのインストール


テスト管理ツールのTestLink、redmineとも連携できるらしいので思い立ってインストールしてみた。
マニュアルに従ってインストール。
https://sourceforge.jp/projects/testlinkjp/downloads/33628/install_manual.pdf

が、ブラウザで最初に開いたときにPHP 5.2移行が必要ということで躓いた。
CentOS 4系なので、公式yumではPHP5.1までしかない。
ソースからしかないのかなぁ、と思って調べたところ、REMIというレポジトリを使えばPHP5.2をCentOS4系からもインストール出来るらしい。
http://memorandum.yamasnet.com/archives/Post-165.html
これでOK!

さて、ブラウザからクリック一つで自動インストール、と思いきや、
Your PHP installation don't have PHP DB extension - without it is IMPOSSIBLE to use Testlink.Failed!

なんだかよく分からない。
とりあえずyumでphp-mysqlを入れて、php.iniもいじってみたけど、ダメ。

仕方ないので、マニュアルにある通り手動でやってみた。
クリック一発でもないけど、そんなに大変でもない。

設定完了でログイン成功!!
…あれ、一瞬でセッションが切れました、再度ログインしてください、になってしまう。
Your session has expired! Please login again

どうやら
/var/lib/php/session
に書き込み権限がなかったので、セッション切れ状態になってしまったみたい。
書き込み権限を付与したところ、正常に動くようになった!

とは言え、TestLinkに慣れなすぎてなにしていいかよくわらない…。

2011年9月16日金曜日

MCP合格

MCPに合格した。

初のMCP。
何故かいきなり70-662

TS: Microsoft Exchange Server 2010, Configuring

というやつ。

単に親会社で導入することになり、研修を受けさせてもらったので、せっかくだからと受けてみた。

日本語の問題集とかあまりないので、英語で。
英語に抵抗がない人は英語で受けた方が絶対いいと思う。変な訳の心配ないし。

2011年9月13日火曜日

Exchange Server 2010の自動構成がうまく行かない

メールシステムがDomino ServerからExchange Server 2010に変わった。
本社から「Outlook起動すれば自動構成(autodiscover)が動くから考えることない」と言われていたが、うまく動かないユーザ(PC?)がある…。
まぁ、自分のPCもそうだったんだけど。
まずサーバの構成を探してる時に
0x80070057
のエラーが出てしまう…。

本社に問い合わせて、手動でサーバ名を設定したら、とりあえずメールの送受信はできるようになったけど、アドレス帳が見えない。
オフラインアドレス帳も取ってこれない。
これはちょっとマズイでしょ…。

Exchange Server 2010にはまだアクセス権限がないので、クライアント側で出来ることをやるしかない。
autodiscoverが動く人と動かない人の違いを突き止めたいけど、全員Outlook 2010なので、バージョンによるものではない。ネットワークも同じセグメント、PCもほぼ全員XP。Win7も一台あるけど、普通に動いてる。WSUSからパッチも当てていて、特に差異はない。
とりあえずOutlookでプロファイルを作り直したけど解決せず。
Outlookの再インストールもしたけど、変化なし。

パケットキャプチャを入れて動作を見てみたりもしたけど、なぜautodiscoverが届かないかはよく分からない。
ADで問い合わせをして、デフォルトサイトを見て、という基本の動作も見直して、pingやnslookupをしてみたり、一応dnsflushしてみたりもしたけど、おかしいところはないっぽい。

どうしたもんかと思い、いろいろ探しているうちにautodiscoverのファイルをローカルに置いて設定する方法が見つかった。
原因調査はさておき、とりあえず問題を解決しようと思い、やってみた。
http://support.microsoft.com/kb/2028193/en-us

まずはうまく行っているPCで
C:\Documents and Settings\ユーザ名\Local Settings\Application Data\Microsoft\Outlook\<不規則な文字列> - Autodiscover.xml
をうまく行っていないPCにコピー。

で、..タグ全体を削除。
さらにのユーザID部分を削除してAutodiscover.xmlとして任意の場所に保存(仮にC:\Autodiscover.xmlとする)。

そうしたら、regedit(バックアップは取ったほうがいいかも)で
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Outlook\AutoDiscover





DWORD: 「PreferLocalXML」を作成。
値は「1」に。

さらに文字列: <企業のドメイン名>
値: さっき作成したAutodiscover.xmlのパス(C:\Autodiscover.xml)


これでOutlookに戻って、autodiscoverを行えば正常に通りました!

2011年8月26日金曜日

redmineのアップグレード


現在使用中のredmineは0.9.3で、既にかなり古い…。
機能も豊富になったらしいので、バージョンを上げたいが、いきなり稼働中のものに触るのは恐ろしいので、まずは開発環境に移してこちらを参考にしながらアップグレードを試みた。
http://redmine.jp/guide/RedmineUpgrade/

ruby, rails, rakeあたりは新しいのに上げておこう!とアップデートしてしまったのが運の尽き。
これが結構悪さした。

rake generate_session_store
これが失敗。
rake/rdoctask is deprecated.  Use rdoc/task instead (in RDoc 2.4.2+)
こういうエラーが出る。

ちょっと調べてみると、rakeのバージョンが新しすぎるらしい。
とにかく新しいものならいいってわけないか…。

ちょっと公式に戻ってみよう。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements

1.2.1は
ruby 1.8.6 か 1.8.7
rails 2.3.11
rack 1.1.1
が必要。
さらに
Rake 0.8.7 is required (rake 0.9.x is not supported by Rails yet)
と思いっきり書いてあった…。

この辺、揃えたらあっさり成功。
やっぱり公式はちゃんと読まないと。

2011年8月25日木曜日

COPY文に条件指定


PostgreSQLのCOPY文で条件指定が出来るらしい。
http://d.hatena.ne.jp/yuum3/20071213/1197535601

COPYはテーブル全体をファイルに落としたり、反対にファイルからテーブルに突っ込んだりできるが、条件指定は無理だと思ってた。
COPY ( SELECT ... ) TO '/tmp/filename';
とSELECTでなんでも出来るなら、これはいろいろ捗りそう!

と思い、やってみたけどダメ…。
なんで?COPY ( SELECT ...と打っても、SYNTAX ERRORに。
PostgreSQLのバージョンも8.1.4。8系なら大丈夫、とあったが、やっぱりこれかなぁ?

公式のドキュメントをみてみると
http://www.postgresql.jp/document/pg814doc/html/sql-copy.html
COPY文の定義として(SELECT のようなクエリは打ち込めなくなってる…。

いつから出来るようになったんだろう…?と探してみると
http://www.postgresql.jp/document/pg820doc/html/sql-copy.html

8.2.0からは可能になったみたい。
プロダクションなので簡単にバージョンアップは出来ないし、そこまでリスクを負うほどのことでもないし。

ということで、結局試さないままでした。


2011年8月3日水曜日

ostをpstに変換

Exchange Online(BPOS)を使っていたのだが、社内でExchange Server 2010を導入することになった。
現在のメールも移行させたいが、保存されているのはオフラインキャッシュであるostファイルにある。
pstファイルに変換しないといけないのかと思い、いろいろ調べてみた。

英語のソフトしかない。
とりあえずデモ版を使ってみる。

Advanced Exchange Recovery
日本語も大丈夫そう。だけど、受信トレイの下にユーザが作成したフォルダがない…。どこにも見当たらない…。
Recovered_FolderXXというフォルダがあるけど、中身は送信済みと削除済み。
Recorered_GoupXというフォルダもあるけど、会議室予約の応答とかでユーザが意識していない情報。
ユーザが作成したフォルダがないのはちょっと困る。

Recovery Toolbox for Outlook
これも日本語も大丈夫。文字化けも見当たらない。ただ復元されたフォルダは「ルートメールボックス」→「IPM_SUBTREE」の下だった。
ユーザが作成したフォルダもあったけど、何故か「削除済みアイテム」の下。変な構成だ。
ostを解析した後、変換するフォルダやアイテムを選べるのはありがたい。
pst変換だけじゃなくて、メールは.eml、コンタクトは.vcfに変換できるけど、こっちは文字化けしたりちゃんと変換出来ていなかったり。
おまけぐらいに思ったほうがいいのかも。

Convert ost to pst
たまに文字化けがある。まぁ、上の二つも全部見れるわけじゃないから、同じかもしれないけど。
かなり重い…。
デモ版だとpstが作れないからなんとも言えない。

と、こんなに調べちゃったわけですが、実は単に「エクスポート」すればpstが出来ることが判明…。
Outlook 2010なら「ファイル」→「開く」→「インポート」→「ファイルにエクスポート」で出来ちゃいます。

上のソフトは、もうOutlookからそのostでアクセス出来ず、ostにしかデータが残ってない時に使うのかな。
とにかく、ツールは買ってないのでそこまでのレビューは出来ません!

2011年7月26日火曜日

WSUSでクライアントPCの状態が「まだ報告されていません」のままになってしまう

今までWindows Server 2003で運用していたが、ついにWindows Server 2008 R2にした。
ほぼ順調だったが、WSUSで躓いた…。

WSUSのコンソールからクライアントPCは見えるのだが、いつまで経っても「まだ報告されていません」のまま。
40台あるうちの1台だけ何故か3%ほど報告しているのもよく分からないが完全に状態を報告したPCはない状態…。
ドメインコントローラは複数台あったので、GPOも今までのままでWSUSサーバの設定も原則的には変えていないはず。
何が悪いんだ…?!
wuauclt.exe /detectnow
wuauclt.exe /reportnow
やらはやってみたけど、状況は変わらない。

C:\Windows\WindowsUpdate.logを見ると
WARNING: WinHttp: SendRequestToServerForFileInformation failed with 0x801901f7
WARNING: WinHttp: ShouldFileBeDownloaded failed with 0x801901f7
WARNING: DownloadFileInternal failed for http://swptyo1ad1/selfupdate/wuident.cab: error 0x801901f7
とか
FATAL: IsUpdateRequired failed with error 0x80244022
WARNING: SelfUpdate: Default Service: IsUpdateRequired failed: 0x80244022
WARNING: SelfUpdate: Default Service: IsUpdateRequired failed, error = 0x80244022
WARNING: Skipping scan, self-update check returned 0x80244022
WARNING: Exit code = 0x80244022
とかある。調べたところ、503 Server Unavailableの状態ということので、多分WEBサーバの設定がおかしいんだろう…。
ちなみに、プロキシは使っていない。

IIS、正直あんまり触ったことない…。

とりあえずもっと情報が欲しいので、クライアントPCにclientdiag.exeをインストール
ダウンロードはこちらから
http://download.microsoft.com/download/9/7/6/976d1084-d2fd-45a1-8c27-a467c768d8ef/WSUS%20Client%20Diagnostic%20Tool.EXE

C:\TEMP>clientdiag
WSUS Client Diagnostics Tool
Checking Machine State
        Checking for admin rights to run tool . . . . . . . . . PASS
        Automatic Updates Service is running. . . . . . . . . . PASS
        Background Intelligent Transfer Service is running. . . PASS
        Wuaueng.dll version 7.4.7600.226. . . . . . . . . . . . PASS
                This version is WSUS 2.0
Checking AU Settings
        AU Option is 4: Scheduled Install . . . . . . . . . . . PASS
                Option is from Policy settings
Checking Proxy Configuration
        Checking for winhttp local machine Proxy settings . . . PASS
                Winhttp local machine access type
                       
                Winhttp local machine Proxy. . . . . . . . . .  NONE
                Winhttp local machine ProxyBypass. . . . . . .  NONE
        Checking User IE Proxy settings . . . . . . . . . . . . PASS
                User IE Proxy. . . . . . . . . . . . . . . . .  NONE
                User IE ProxyByPass. . . . . . . . . . . . . .  NONE
                User IE AutoConfig URL Proxy . . . . . . . . .  NONE
                User IE AutoDetect
                AutoDetect in use
Checking Connection to WSUS/SUS Server
                WUServer = http://<サーバ名>
                WUStatusServer = http://<サーバ名>
        UseWuServer is enabled. . . . . . . . . . . . . . . . . PASS
        Connection to server. . . . . . . . . . . . . . . . . . PASS
WinHttpDownloadFileToMemory(szURLDest, NULL, 0, NULL, NULL, NULL, &downloadBuffer) failed with hr=0x801901f7
No Error description could be found
Press Enter to Complete
あんまりよく分からないが、繋がってはいるもののそこから先がダメ。503 Server Unavailableって所で引っかかってるらしい…。

よく分からないので、一旦WSUSとIISの役割を削除して、再度追加。
それで直ればいいなぁ、と期待したものの、直らない…

そもそもIISがちゃんと構成されていないのでは?と思ったので、WSUSとIISを削除して、今度はIISのみ追加。

むむ、デフォルトウェブサイトにつないでもやっぱり503 Server Unavailable…。
やはりIISがおかしい。

IISが503を返す理由を調べているうちに、どうもサービスを起動する権限がおかしい可能性があることが分かった。


  1. 管理ツールから「インターネット インフォメーション サービス(IIS)マネージャ」を起動
  2. 中央部の接続ペインから実行サーバ名をクリックし、アプリケーションプールを選択
  3. 右ペインの「DefaultAppPool」を右クリックして、「詳細設定」を選択
  4. プロセスモデルのIDを「NetworkService」にする(本来はこれがデフォルトだが、このサーバではApplicationPoolIdentityとなっていた)
  5. OKで終了し、再度DefaultAppPoolを右クリックして、「再起動」させる

これでIISは正常になった。

もう一度、WSUSを追加したところ、正常に動作。

やっと終わった~!

2011年7月15日金曜日

印刷ジョブが消えない

Windows Server 2003 と2008 R2がプリントサーバになっているが、印刷ジョブが止まってしまうことがある。
まぁ、サーバに限らずクライアントPCでもよくあることではあるけれど…。

印刷ジョブが泊まってしまったら、削除するのに「キャンセル」を押す。
それでも、消えないまま固まってしまうことがある…。
プリンタの電源を切ってもジョブは残りっぱなしだし。
Linuxならコマンドでなんとかなるんだが…。

どうしたもんかと思い調べてみたら、こちらと同じ対処で出来た。
http://naosan.way-nifty.com/it/2009/05/post-88fa.html

Print Spoolサービスを止めて、C:\Windows\system32\spool\printersの*.SHDを削除、でPrint Spoolをまた開始、という流れ。
サーバなので、この間全部の印刷が出来なくなるけど、まぁ、仕方ない。
また、もしかしたら*.SHDだとその時スプールされているジョブが全部消えるかもしれない。
その辺は検証してくしかないかな…。

誰か、いい方法知ってたら教えてください!

2011年7月14日木曜日

PostgreSQLでpsql以外からCOPY FROM/TO を使う

PostgreSQLで便利なCOPY文。
でも、COPY FROM/TO 'ファイル名'を使うにはスーパーユーザ(superuser)権限が必要…。
ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
なんでもかんでもスーパーユーザにするのはよくないので、なにか方法はないかと調べてみた。

一つは\copyを使う方法。
C言語でlibpqを使って繋げているので、「単純にcopyを\copyにすればいいのか?」と思い試してみたが、やっぱりダメ。
そう簡単ではありません。
要は\copyはpsqlのコマンドであり、PostgreSQLに取っては分からないコマンドになってしまうから。

もう一つは、ヒントにも書かれているstdout, stdinを使う方法。
C言語からどうやればいいんだろう?
ということで、公式のドキュメントを参照。
http://www.postgresql.jp/document/9.0/html/libpq-copy.html

PQPutCopyData関数を使えばいいらしい。
ただいきなり発行できるわけではなく、まずCOPY_IN状態にしなくちゃならない。
COPY_IN状態にするにはどうしたらいいかというと、普通にPQExecで"COPY FROM STDIN..."を実行させればいいだけ。
こうなってからPQPutCopyData関数を使えばstdinから入れているように見せられる、とそういうわけか。

ここまで調べて、さあ実装しよう!と思ったら、上司から「そのユーザ、スーパーユーザにしちゃっていいよ」とのお言葉…。
まぁ、他にもいろいろあるユーザだし、プログラムの実行しかしないログインも出来ないユーザだからいいっちゃいいけどね。

ちょっと拍子抜けでした!

gdbの使い方

C言語での開発は好きじゃない…。
比べればまだいいけど、Javaもあんまり好きじゃない。
気楽なスクリプト言語が一番好み。

でも、仕事では既にC言語で書かれちゃってて、さらにメモリ破壊なんてことが起きたりするわけで。
動かすマシンを買えたらアーキテクチャの違いか何かで、今まで動いていたプログラムが急に動かなくなったりする。
まぁ、潜在的に抱えてたんだろうけど…。

そんな時に使えるのがgdb。
gdbはソースレベルのエントリを利用してデバッグを行うシンボリックデバッガ。
ソースがなく、プログラムしかない場合は機械語レベルでデバッグを行うアブソリュートデバッガを使うけど、ずっと大変そう…。
幸いソースはあるので、gdbを使う。
何ができるかって、プログラムを一行ずつ動かしたりして、その都度変数やスタックなんかを見ることが出来る。

まずは下準備。
-g オプションを付けてコンパイル。
要はこのオプションを付けることで、デバッグに必要な情報を実行ファイルにいれていると思われる。

で、gdbの起動。引数としてデバッグしたいプログラムを渡しちゃうと楽。
$ gdb sample
次はブレイクポイントの設定。
ソースコードを見ながら、挙動を監視したい辺りにブレイクポイントを設定
(gdb) break 5
※短縮してb 5 でも動く

で、いよいよプログラムの実行。
引数はrunコマンドに渡せばいい。
(gdb) run parameter1 parameter2

もちろんブレイクポイントまでで止まる。それ以前にエラーがあればそこで止まるけど。

お次は変数の確認。
(gdb) print hoge
※短縮して p hogeでも動く

次の行に進むには
(gdb) next
※短縮してnでも動く
まとめてN行進むには
(gdb) step N
※短縮してs Nでも動く。Nを省略すると1行進む

次のブレイクポイントまで一気に進むには
(gdb) continue
※短縮してcでも動く

やめたくなったら
(gdb) kill
あるいは一気に
(gdb) quit
で抜けてもいい。gdbが動かしていたプログラムはquitすれば止まる。

以上、簡単な使い方。
もっと詳しく知りたい人は以下で!
http://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/compile.html
http://uguisu.skr.jp/Windows/gdb.html

2011年7月13日水曜日

tsharkでパケットキャプチャ

Ciscoのスイッチに大量のパケットが送られているようでネットワーク帯域のほとんどを消費してしまい、ネットワークが非常に遅くなってしまった。
どんなパケットが送られてきているのか調べるためにwiresharkのCUI版、tsharkでキャプチャしてみた。

まずはスイッチ上での設定。
FastEther0/1のポートが本番稼動しているが、そこにキャプチャ用のサーバを入れて、というわけにはいかないので、monitorコマンドを使用。
空いている10番ポートに同じパケットが流れるようにする
monitor session 1 source interface Fa0/1
monitor session 1 destination interface Fa0/10
キャプチャするサーバのeth1にはアドレスも何も振らず10番ポートと接続。
これで準備完了。
$ tshark -i eth1 -t ad -w <ファイル名>
これで指定したファイルにキャプチャが取られて行く。
止めないと永遠にキャプチャし続けるので適当なところでCtrl+Cで打ち切る。

キャプチャしたファイルを読み込むには
$ tshark -r <ファイル名>
で読める。

ただダラダラ読んでも解析が難しい…。
ログ集計スクリプトを組まなくちゃダメかなぁ、と思ったらちゃんとtsharkに統計機能があった!

というわけで、
$ tshark -r <ファイル名> -z conv,ip            # IPごとに集計
$ tshark -r <ファイル名> -z io,phs             # プロトコル階層で集計
$ tshark -r <ファイル名> -z io,stat,600,eth    # 600秒ごとにethフレームとして集計
とすればログのあとに統計情報が出てくる。
これは便利!

tsharkに関してはこちらを参考にしました。
集計の部分がすごく分かりやすい!
http://assimane.blog.so-net.ne.jp/2011-01-08

2011年7月7日木曜日

Windows Server 2008R2 SP1の日本語版を英語表示に

海外チームのサポートを得るためと、エラー情報を英語で探すために、Windows Server 2008 R2 SP1の日本語版を英語表示にしたい。
MicrosoftからMultilingual User Interface Language Packが出ているので、それをインストールするだけ。
と思いきや、取得した.exeを実行してlpファイルが出来上がるものの、数秒で消えてしまう…。

何故だ?!

と思って、イベントログを見てみると
イベントID: 1014
en-US 向け言語パックはこのシステムに適していません。お使いのシステムのアーキテクチャおよびエディションを対象とする適切な言語パックをダウンロードしてください。
とか言ってくれちゃう…。

もしかして、ia64版をダウンロードしたのか?と思って確認したが、やはりx64版。

調べてみたら、サーバのOSがSP1だった。
あ、SP1だと入らないものなのね…。

あとはこちらを参考に作業したら、正常に入った!

ダウンロードするファイルは、Windows Server 2008 R2の人はこちら
SP1の人はこちら

2011年7月5日火曜日

シェルスクリプトで最後の引数を取得したい

検証したのはKorn Shellだけど、bashやPOSIX準拠shでも動くはず。

最後の引数を取得するには、引数の数は$#に格納されているので、
$$#
とすればよさそうだが…?


!/bin/ksh
echo "Number of arg: $#"
echo "Value of last index: $$#"

(arg_test.sh)

実行すると
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: 19401#
※本来はe5と出て欲しいのに…

考えて見れば分かるが、$$#はシェルが特殊変数$$と解析し、PIDを出力する。
さらに#が付いているので、リテラルとして追加してecho出力、となった。

エスケープすればいいのか?と思い、


echo "Value of last index: \$$#"


としてみても、
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: $5
う~ん、もう少し。

いろいろ調べると、こういう時は組み込み関数evalを使えばいいらしい。


echo "Value of last index: `eval echo '$'$#`"


これでOK。
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: e5
想定通り!


ただ、これだと引数が9個までならいいけれど、10個以上になるとうまく行かなくなってしまう。
$ ./arg_test.sh a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11
Number of arg: 11
Value of last index: a11
これはeval echo '$'$#の中で$#が$11と置き換わったが、シェルスクリプトの引数は$1, $2, $3,...でアクセスできるが、$9までしかない。
$11は$1と1と解釈されたので、$1="a1"と"1"が出力されている。
10番目移行の引数にはshiftしていくか、${10}などとする必要がある。

なので、


echo "Value of last index: `eval echo '$'{$#}`"


にすれば
$ ./arg_test.sh a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11
Number of arg: 11
Value of last index: k11
と10個を超えても大丈夫になった。

2011年7月1日金曜日

PostgreSQLで権限の確認

PostgreSQLでの権限の確認は以下が参考になった。
http://www.dbonline.jp/postgresql/role/index3.html

\zで見れる。

db=# \z
                              Access privileges
 Schema | Name | Type  |     Access privileges     | Column access privileges
--------+------+-------+---------------------------+--------------------------
 public | test | table | postgres=arwdDxt/postgres+|
        |      |       | =r/postgres              +|
        |      |       | dba=arwdDxt/postgres     +|
        |      |       | dml=arwdD/postgres        |
(1 row)

権限を付けたユーザ(ROLE)はそのまま削除できない。
なので、削除したい場合は先にREVOKEを行ってからDROP ROLEを行う流れとなる。

2011年6月に読んだ本

6月の読書メーター
読んだ本の数:13冊
読んだページ数:3107ページ

強運強運
こういう生き方してたらそれは強運にもなる、と思わされた。常に一歩上を目指す。そうすると疲れちゃうと思うかも知れないが、竹の節のようになっているので、上にいくほど次の一歩が楽になる。大変なのは最初だけ。全ては基本から。名著「人を動かす」はその基本をしっかり書いてあるので最低7回読みといい。
読了日:06月30日 著者:斎藤 一人
zsh最強シェル入門zsh最強シェル入門
「zshの本」より読みやすい。その分、情報は少ないがまず慣れる、どんなものか掴む、という意味ではこちらのほうが取っ付き易いと思った。
読了日:06月29日 著者:中島 能和
幸福力(しあわせりょく)[CD付き]幸福力(しあわせりょく)[CD付き]
五回目。自分の修行を一生懸命やってないから、まわりが気になって仕方がない。まずは一生懸命やってみる。そうすると中心軸が出来る。不動の心になる。
読了日:06月24日 著者:斎藤一人
Redmineによるタスクマネジメント実践技法Redmineによるタスクマネジメント実践技法
備忘録から始めて、アジャイル開発へ。運用のノウハウは参考になるが、いくつか具体的な例もあるともっと分かりやすかったと思う。とにかく、自分で導入して試行錯誤するしかなさそう。
読了日:06月23日 著者:小川 明彦,阪井 誠
プロのための Linuxシステム構築・運用技術 (Software Design plus)プロのための Linuxシステム構築・運用技術 (Software Design plus)
思ったより数段よかった!「こういうことをするにはこうすればできます」という技術書は溢れているが、実務に関わる人から「この技術は実際の運用では使いません」等、業務での推奨などを書いているのはあまりない。無意識に叩き込まれるまで何度も読み直したい本!
読了日:06月18日 著者:中井 悦司
ここ―食卓から始まる生教育ここ―食卓から始まる生教育
「子供は育てられたように育つ」「思春期に問題が起こるのではなく、お腹にいるときから始まっている。思春期にそのサインを出しているだけ」。とにかく愛情が大切。抱きしめること、話を聞くこと、一緒に遊ぶこと、一緒にごはんを食べること、なるべくちゃんとした食事を食べること。性の話は家庭でしない。すればするほど、性の敷居が低くなり安易に踏み越えてしまう。実は「恥ずかしいこと」のままでよかったりする。
読了日:06月16日 著者:内田 美智子,佐藤 剛史
背教者ユリアヌス (中) (中公文庫)背教者ユリアヌス (中) (中公文庫)
ページをめくる手が止まらない!宦者の陰謀のせいもあり、ガリアの統治がうまく行きかけると謀反が起きていたこともあり、皇族の血によって統治を思い立った皇帝。哲学に傾倒するユリアヌスに突然の抜擢だったが、哲学の本質は軍事にも活かせたようで思いのほか活躍するユリアヌス。今のところ、うまく行っているが、この後どうなる?!
読了日:06月14日 著者:辻 邦生
人生カンタンリセット!夢をかなえる「そうじ力」人生カンタンリセット!夢をかなえる「そうじ力」
毎朝、出勤したらデスクを片付ける!
読了日:06月12日 著者:舛田 光洋
知識ゼロからの世界史入門〈1部〉近現代史知識ゼロからの世界史入門〈1部〉近現代史
読了日:06月11日 著者:
天才エジソンの秘密 母が教えた7つのルール天才エジソンの秘密 母が教えた7つのルール
何度失敗しても諦めずに挑戦し続けたエジソン。そのルーツは母の教えで、失敗を失敗と思わせなかったところにある。短所を直すことに注意を注げば、ただの人にしかなれない。短所を補って余りある長所を伸ばせばオンリーワン。
読了日:06月10日 著者:幸田 ヘンリー
ヤッさんヤッさん
これはおもしろかった!「ホームレスでも矜持は忘れちゃいけない」「都会に生かしてもらっていることに感謝はしても、媚びへつらう必要はない」。カッコイイ!上司、会社、取引先に感謝はすべきだけど、媚びへつらう必要はないよねぇ。なんだかいろいろ考えさせられました!
読了日:06月06日 著者:原 宏一
眼力 (CD付)眼力 (CD付)
二回目。政府は英語が話せる人なんて欲しくなかった。だから、This is a penから始める。この文章、リアルで使ったことない…。そういったことを見抜く眼力をつけよう。
読了日:06月01日 著者:斎藤 一人
宝くじ(超)当せんデータ「当たる人のルール」がわかった宝くじ(超)当せんデータ「当たる人のルール」がわかった
「宝くじはよく当たる売り場で買え!バラで買え!」のような必勝法の本ではない!当選した人を取材して、共通点をまとめたもの。「となりの億万長者」のようなスタイル。お金持ちの習慣を学ぶにはいい!
読了日:06月01日 著者:

読書メーター

2011年6月30日木曜日

heartbeat + SVN でエラー

heartbeatでサービスが引き継がれた際に、Subversion(SVN)でエラーが出た。

コミット時にリポジトリのdb/txn-current-lock に書き込めない、とあった。

調べてみると、ファイル・ディレクトリのオーナーが違う人になっていた。
要は、稼動系のuidとgidが待機系と違っていた、ということ。
usermod, groupmodで合わせたらあっさりコミット出来た。

こういうことも気を付けないといけなかった…。

heartbeat で cron設定を引き継がせる

heartbeatでcron設定(crontab)を引き継がせたくていろいろ調べてみた。

アプローチしては、似通ってくるけど3つぐらい

  1. 別ユーザのcronで自分のノードの状態を監視し、状態に応じてcrontab -u <ファイル>を実行する方法
  2. ha.cfの外部スクリプトでノードの状態を監視し、状態に応じてcrontab -u <ファイル>を実行する方法
  3. /etc/init.dにcrontab -u <ファイル>を実行するスクリプトを書いて、haresourceから起動させる方法

3がキレイだと思ったので、これを採用。
/etc/init.d/hacrontabとして


#!/bin/bash
# get functions
. /etc/init.d/functions
# See how we were called.
case "$1" in
  start)
    logger -s -t "$0" "setting up root crontab: /data/crontab/hacrontab"
    /usr/bin/crontab -u root /data/crontab/hacrontab
    echo
  ;;
  stop)
    logger -s -t "$0" "removing root crontab"
    /usr/bin/crontab -u root -r
    echo
  ;;
  status)
    echo "$0 status: "
    echo "crontab -u root -l:"
    crontab -u root -l
    ;;
  *)
    echo "Usage $0 (start|stop|status)"
    ;;
esac
exit 0


適当だけど…。
これを両方のノードに置き、/etc/haresourcesの最後にhacrontabを追加してheartbeatを再起動。
これでOKでした!

heartbeat + drbd でクラスタ化…、なのに同期が取れていない?!

Linuxサーバ2台でheartbeat + drbd を使用して2ノードクラスタを作っている。
稼動系がサーバが落ちてしまい、ちゃんと待機系に切り替わったのはいいんだが、どうもディスクの同期が取れていないっぽい…。
「まさか、待機系のmysqlはdrbdでミラー化されたディスクじゃなくてローカルディスクを見ている?」
と思ったが、そんなことはない。ちゃんとdrbdを見ている。
では、なぜ?とdrbdのステータスを見たところ

# service drbd status
drbd driver loaded OK; device status:
version: 0.7.25 (api:79/proto:74)
GIT-hash: 3a9c7c136a9af8df921b3628129dafbe212ace9f build by root@linux01, 2009-11-05 10:46:57
 0: cs:WFConnection st:Primary/Unknown ld:Consistent
    ns:0 nr:0 dw:31412 dr:108445 al:308 bm:435 lo:0 pe:0 ua:0 ap:0

ん、St: Primary/Unknown?
確か、Primary/Secondaryだったはず。
調べてみると、Secondaryとなるべき相手が見つからない状態になっている。

通信に使うNICも動いているけど、なんでだろう?

こちらを参考にして以下をやってみた。


ひとまず今マウントされているPrimaryの方を外付けディスクにバックアップ

# dd if=/dev/drbd0 of=/dev/sdb bs=16384

バックアップされたのを確認後、Secondary側で今のデータを捨て、リソースに繋ぐようにコマンド実行

# drbdadm -- --discard-my-data connect r0
※すぐ終わる

そして、Primary側でリソースに繋ぐ(PrimaryのデータをSecondaryも持つはず)

# drbdadm connect r0
※データ量にもよると思うが、数秒で終わった

もう一度、ステータスを確認してみる。

# service drbd status
drbd driver loaded OK; device status:
version: 0.7.25 (api:79/proto:74)
GIT-hash: 3a9c7c136a9af8df921b3628129dafbe212ace9f build by root@linux01, 2009-11-05 10:46:57
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:216312 nr:0 dw:144992 dr:410449025 al:490 bm:1064 lo:0 pe:299 ua:0 ap:0
        [====>...............] sync'ed: 24.5% (687712/902828)K
        finish: 0:00:19 speed: 35,852 (35,852) K/sec
よかった。

2011年6月22日水曜日

Google Spreadsheetを使った家計簿

家計簿はいろいろ悩むところ。
紙、かんたんなソフト、Excel、Microsoft Moneyなど高機能ソフト、いろいろ試してみた。

そこで気付いたのが、機能うんぬんよりも続けることへのハードルが低いものが一番。


高機能なものもいいんだけど、うち帰ってPC立ち上げてソフト上げて、ってやるのはちょっと大変。
(それでも2年ぐらい続けたけど…)
銀行から取り込みとかも出来るけど、「これは本買ったヤツだ」「これは服だから…」と費目を調整するのが億劫になる。
別に税務署に提出するわけでもないし、ある程度記録が出来れば十分。
そして、家でしか出来ないものではなく、スマホから出来たりすればさらにいい。
やっぱりまとめてって言うのは、億劫になるので、その都度がベスト。

というわけで、Google Spreadsheetを使って家計簿を作ってみた。
作り方はライフハックが一番分かりやすかった。

さて、今度こそ続くといいんだが…。

2011年6月21日火曜日

Subversionのコミットログを変更する

こちらを参考にした。
完全にこれで解決したので自分が書くこともないけど…。

Subversion(SVN)でコミットしたログを編集するには、TortoiseSVNから「ログを表示」→「ログメッセージを編集」でOK。
ただ、

Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
などと言われることがある。

その時は、Linuxサーバ上でhookスクリプト(pre-revprop-change)を書けばいいだけ。
テンプレートそのままでいいので、cpして実行権限を加えておけば出来た。

PHPからサブシェルを使う

PHPから外部プログラムを使うには、execやsystemなどの関数が用意されている。
が、例えば
% diff -c <(sort $foo) <(sort $bar)
のようなサブシェルを含んだものを呼び出すと失敗…。
sh: -c: line 0: syntax error near unexpected token `('
とエラーが出てしまう。

解決出来ないかな~、といろいろ探したが断念…。
仕方ないので、PHP上で一時ファイルを作って対応した。

なにかいい方法知ってたら教えてください!

TeratermでCtrl+Cが利かない…

Teratermでサーバに入っているが、特定のサーバでCtrl+Cが利かなくなってしまった…。
なんでだろう?と思って、調べたら以下がヒット。
http://ziddy.japan.zdnet.com/qa4546116.html

言われたとおり、サーバ上で
% stty -a
と打ってみると intr = DELになってた。
自分はzshを使っているので、.zshrcにstty intr ^Cと書きこんで一旦ログアウト&ログイン。

ちゃんとCtrl+Cが利くようになりました!