Archive for the ‘ソフトウェア’ category

GitとSubversionを共存させる

2月 27th, 2010

git svn cloneして、ファイル編集して、git commitして、git svn dcommitでSubversionサーバに変更を反映させる。Subversionの変更を取ってくるのはgit svn rebaseだ… なんてのがWeb上で探してすぐ見つかる情報ですが、これでは複数人でgitを使う場合の運用ですぐに行き詰まってしまいます。

実用Gitの16章に定石が載っていると聞き、さっそく買って読んでみました。他の章を飛ばして16章だけ読んだせいもあるのか自分の中ではまだうまく消化出来ていません。とりあえず手順だけ書いておきます。

◯前提条件
git svnを行う窓口は1箇所にする。git svnのオプションを変えたり、とってくるリビジョンを変えただけでもコミットオブジェクトは変わってしまう。

◯前準備
git svnを使ってSubversionリポジトリのcloneを作る

% mkdir example-svn.git
% git svn clone –stdlayout –prefix=svn/ http://example.jp/svn-repos/

git bareリポジトリを作る

% mkdir example.git
% cd example.git
% git init –bare –shared=true

git svnリポジトリからmasterとSubversionのブランチをgitのセントラルリポジトリにpushする。

% cd ../example-svn.git
% git push –all ../example.git
% git push ../example.git ‘refs/remotes/svn/*:refs/heads/svn/*’

◯Subversionにマージを書き戻す

% git checkout svn/trunk
% git merge –no-ff new-feature
% git svn dcommit

何度も実用Gitの解説を読んでいるのですが、マージを書き戻すところだけどうにも謎です。多分きちんとリモート追跡を理解できてないのでしょう。この休みにまた時間をとって勉強することにします。

実際にやってみて出来ることは確認したのですが、

  1. Subversionへの書き戻しを手動でやらないといけない
  2. Subversionのログに残るメッセージがgit mergeで生成されたものになってしまい、何の変更をしたのかSubversionからはさっぱりわからない

という問題があることも分かりました。

そこで上記でいうexample-svn.gitのフックスクリプトを作成し、example-svn.gitのmasterに変更がpushされたらSubversionに書き戻す処理を自動化してみました。動く気はしているのですが、理解が足りてないせいで、思わぬ問題を引き起こすかもしれませんのでご注意ください。

#!/bin/sh

# checkout svn/trunk
git checkout svn/trunk

# Store git log before merge
log=$(git log last-merged..master --pretty=format:"%h %s" --reverse)

# merge master to svn/trunk, don't commit
git merge --no-ff --no-commit master

# commit with git log message
git commit -a -m "$log"

# push back to svn repository
git svn dcommit

# tag last merged
git tag -d last-merged
git tag last-merged master

◯2010年3月3日追記
テスト環境ではうまく行ったのですが、本番環境でgit->Subversionの自動同期をしてみたところ、ソースファイルが削除される問題が起きてしまいました。
git push, git mergeとかのどこかでうまくいってないのにsvn dcommitまで行われたのが直接の原因ですが、なぜこうなったのかログを見ても原因が分からなかったので自動同期は止めました。

◯2010年3月4日追記
よくよく考えたらsvnのゲートウェイとなるリポジトリのmasterとsvn/trunkは別個の歴史を辿るんですね。なので前にマージされてからの差分を求めるにはsvn/trunk..masterでは駄目ですね。上のスクリプトはなんとなく書き換えてみましたが、gitの理解が足りてないですね。

Linuxで一定時間後にプログラムを起動する

1月 27th, 2010

複数のプログラムを同時に動かしても互いに干渉しないなんて今時当たり前ですが、添付ファイルを一時的に用いるプログラムでデータ取りする作業があって、添付ファイルの書き出しで競合が生じる問題に悩まされました。10000枚ぐらい画像を一度に処理するので8時間ぐらいかかってしまいます。

「今日はもう帰りたいんだけど、あと1時間ぐらいしたらデータ取りが終わるから1時間半後にこのプログラム回しておきたいんだけど」というニッチな悩みをしていたところ、Linuxで一定時間後にプログラムを起動する方法を見つけました。
一定の時間後にプログラムを実行するには

例えば1分後にprocess_dataコマンドを実行するなら

% sleep 60; ./process_data

とやっておけばいいそうです。sleepコマンドを使うとターミナルの応答が返ってこなくなりますが、GNU screenと合わせれば問題なしですね。

さらにatコマンドを使って指定時間にプログラムを起動する技もあるそうです。

% at now + 1 hour
at> ls
at> date
at> ([Ctrl]+[D]キーを押す)
warning: commands will be executed using /bin/sh
job 8 at 2001-02-09 14:38

探せば便利な技があるんですね。

TortoiseSVNのオーバーレイアイコンが表示されないとき

1月 10th, 2010

TortoiseSVNだけじゃなくてTortoiseCVS/TortoiseHg/TortoiseGitでも同じだと思います。オーバーレイアイコンが表示されない原因はアイコンキャッシュが壊れていたりといろいろ原因があるのですが、ついこの前気づきにくい理由で表示されないことがあったので参考までに紹介しておきます。

会社の作業環境ではTortoiseSVNとTortoiseGitをインストールしていたのですが、いつからか両方のオーバーレイが表示されなくなってしまいました。てっきり両者が競合でもしてるか、TortoiseGitが悪さでもしているのだろうと思っていたのですが、調べてみるとWindowsの仕様で表示されなくなっていました。

Windowsではオーバーレイさせるアイコンをレジストリで記憶していますが、最大で15個という制限があるそうです。それ以上もレジストリに登録できるのですが、最初に登録されたものから無効になってしまうそうです。自分の場合、あとからインストールしたOffice2010(Microsoft Ofiice Groove?)が原因だったようです。

対処法としてはレジストリをチェックして15個以上登録されてないか確認し、不要なものをアンインストールするか、レジストリの不要項目を削除すればOKです。チェックするレジストリは”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
\CurrentVersion\Explorer\ShellIconOverlayIdentifiers”です。

以下のブログを参考にさせていただきました。

Google Chromeに乗り換えた! ついでにGoogle Readerにも

1月 10th, 2010

タイトルのままですが、MacのGoogle ChromeがExtensionサポートするようになったので(Devチャンネルだけですが、まだ)、メインのブラウザをGoogle Chromeに乗り換えました。乗り換えた一番の理由はFirefoxの動作が遅かったことです、特に起動時間は拡張を多数突っ込んでいるせいか耐え切れないものでした。パソコンを使う= ブラウザを使う となっている現状では起動時間の遅さは致命的です。ということでGoogle Chromeサイコー、Chrome Extension便利! です。

Googleするとすぐ見つかる情報ですが、おすすめのExtensionは重要度別におすすめするGoogle Chromeのエクステンション:945分の50選でみつけました。あとChromeのDevチャンネルはEarly Access Release Channels (The Chromium Projects)で見つかります。

・・・

そんな便利なGoogle Chromeですが、Livedoor Readerのピンを開くのに問題があってポップアップブロックをブロックしてしまうため、ピンを開くことができません。Chromeを引数付きで起動すれば回避できるらしいのですが、Macのアプリケーションでやる方法がわからなかったのでGoogle Readerに乗り換えてしまいました。これでfeedly: a magazine-like start pageも試せますし。

ということでよりGoogle依存が進んだ作業環境の紹介でした。

iPhotoがおかしいときに試すこと

11月 22nd, 2009

iPhoto

2003年ぐらいからの写真が撮りためられているiPhotoですが、データは全部で20ギガバイトを超えており最近アプリの調子が悪いことが多々有ります。具体的には読み込み途中にフリーズしてデータが消えたり、読み込んだはずのファイルが消えてしまい、キャッシュからは見えるものの参照不能ということがありました。

Googleで調べてもきちんとした原因も、対策も見つからなかったのですが、iPhotoのライブラリファイルを作り直す方法を見つけたので紹介しておきます。Appleの公式Helpページのようですが、引用している人が少ないのか検索結果の上位に表示されないので見つけにくいかと思います。

iPhoto 6 and later:iPhoto ライブラリを再構築する方法

iPhoto ライブラリを再構築するには、以下の手順に従います:
1. iPhoto を開いている場合は終了します。
2. キーボードの「Command」キーを押しながら「Option」キーを押します。
3. iPhotoを 起動します。
4. ライブラリ再構築の確認ダイアログが表示されるまで、キーは押したままにします。
5. 再構築のオプションのダイアログが表示されます。使用したいオプションを選択します。
6. 「再構築」をクリックして再構築を開始します。完了までに数分かかる場合があります。

だそうです。

自分のところで問題となったキャッシュとリンク切れの問題はこれで解決可能です。しかしWindows時代に使っていたPicasaと比べるとトラブルが多い印象です。

Hudsonでハマった話

10月 30th, 2009

今日会社でHudsonにハマった話。

毎夜のストレステストが落ちてた報告がメールできていて問題に気づきました。
エラーメッセージを見るとHudsonでジョブを起動したときに落ちていたので、前日にアップグレードしたHudsonのバージョンの関係かとSlave周りの設定を見直してました。

結果として間違っていたのはHudsonのバージョンではなく、整理したPluginの問題でした。Mercurialやrubyなど使ってもいないプラグインが多数有ったので一括して使わなくしたのでした。その中にSubversionプラグインがあったのですが、これはHudsonのSubversionサポートを強化してくれるプラグインではなくて、Subversionサポートそのものを提供してくれる物だったんですね。昔はSubversionだけ組み込みで提供してくれていたのでうっかりハマりました。

同じ間違いをする人がいるとも思えませんが、参考まで。

iPhotoでiPhoneの写真の読み込みに失敗すると…

10月 25th, 2009

散々な目に有ったので忘れないようにエントリ。

iPhotoで写真を読み込むと、写真を読み込み終わった後にオリジナルを消すかどうか聞いてきますが、この後で削除中にiPhotoがフリーズするとPCへのデータ吸い出しは失敗し、オリジナルのデータは削除されているという散々な状態になります。というか実際なっていたい目を見ました。Appleひどすぎます。

iPhone上のデータはあきらめがついたのですが、iPhoneのカメラロール上の写真数表示と実際の写真数に食い違いが出て2度困ることになりました。

解決法ですが、 窓の杜 – 【REVIEW】iPhone/iPod touch内のファイルをエクスプローラ風に管理できる「DiskAid」の用なツールをつかってiPhone上のファイルを扱えるようにし、DCIMフォルダを削除すれば元に戻ります。

ChangeLogメモをEvernoteに一本化した

9月 30th, 2009

タイトルの通り。

大学時代から使っていたChangeLogメモとchalowですが、Evernoteを使い始めたところ画像の扱いとかiPhoneとの連携とか便利すぎて気がついたらChangeLogメモがほったらかしになっていました。2箇所にメモが散らばっているのも具合が悪いので思い切ってEvernoteにデータを移行しました。ChangeLogメモ自体は残しておいても邪魔にならないし、Evernoteに何かあってもエクスポートはできるみたいなので多分大丈夫でしょう。

作業手順ですが

  1. chalowでChangeLogファイルを変換
  2. 不要なHTMLファイルを削除(日別のページとインデックスページだったかな?)
  3. EvernoteでChangeLogインポート用のノートブックを作成
  4. HTMLファイルをインポート

とやりました。

いくつか手こずったとこもありました。

  1. chalowの設定が面倒だったのでRuby実装のrchalowにした
  2. MacのEvernoteだとインポートがうまく動かなかったのでWindowsでやった
  3. 拡張子がhtmlだとインポートできなかったのでhtmにした
  4. ChangeLogメモも変換後のHTMLファイルもUTF-8で統一されていたのにインポートしたら文字化けした。しょうがないのでShiftJISに変換してインポートした

これでメモ環境が快適になりました。

会社でgitを使い始めたのでWEB+DB Press Vol.50を読み直した

9月 22nd, 2009

今年のはじめからちょくちょくチャレンジしては壁に跳ね返されていたGitですが、先週あたりからようやくまともに使えるようになってきました。前提条件はこんな感じ

  • 共有リポジトリはSubversion、今後もずっとSubversion
  • プログラムはWindowsとLinuxで動くように作ってる、ソースは1種類
  • エンコーディングはBOM有のUTF-8、改行コードはLFCR
  • LinuxのgccはBOM有だと受け付けてくれないのでビルド前に文字コード変換を挟んでいる
  • Subversionのリポジトリは複数プロジェクト共同で、古いリビジョンだと存在しないパスがあったり、パスが途中で変わったりしている

何回かチャレンジしたときはmsysgitを使ってgit svnでのチェックアウトを試みたのですが、昔のリポジトリに同じパスのデータが無いのがまずいのかエラー終了してしまうところであきらめていました。
今回は出たばかりのTortoiseGitのバージョン1系を使い、TortoiseGitで(実際にはmsysgitなんだけど)svnリポジトリからのチェックアウトを試みて、昔のリビジョンだとエラー終了するのを指定リビジョン以降のチェックアウトに限定することで回避しました。

修正や機能追加の際にトピックブランチを作って平行開発、終わったらmasterにマージしてsvn dcommitして共有リポジトリにアップ。こんな流れで周囲の和を乱すことなく開発を進められる所まで来ました。途中gitの意味不明なエラーに遭遇したものの、TortoseGitのバージョンがこなれていくに従って徐々に減っていくでしょう。

gitの使い方はWebとWEB+DB Press Vol.50のgit特集と、オーム社の入門gitを使って勉強しました。Webの情報は古いのが引っかかったり、そもそもズバリな悩みの解決法がまだ見つかりにくく、オーム社の入門gitはリファレンスとしては有用そうに見えるのですが、git stashなど基本的なコマンドの解説が無く、WEB+DB PRESSのが一番使えることに間違いなさそうです。

gitのコミッターが書いた秀和システムの入門gitが先週土曜日に発売されましたが、Amazonからまだ発送されてきません。内容はWEB DB Pressをさらに深くしたものらしいので、日本ではこれが決定版になりそうな気がしています。

WEB+DB PRESS Vol.50 (大型本)
477413838X 入門git (単行本(ソフトカバー))
427406767X 入門Git (単行本)
4798023809

Hudsonのよくわからないエラー

9月 20th, 2009

SCMのポーリングが実行
Updating http://example.com/svn-repos/
FATAL: Unable to call getCredential. Invalid object ID 109
java.lang.IllegalStateException: Unable to call getCredential. Invalid object ID 109
at hudson.remoting.RemoteInvocationHandler$RPCRequest.perform(RemoteInvocationHandler.java:268)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:255)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:215)
at hudson.remoting.UserRequest.perform(UserRequest.java:104)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:236)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)

Windowsのスレーブで1.317から出るようになったみたい。
Subversionのリポジトリをポーリングしてビルドを動かすようにしているけど、出るときとでないときがあります。1回目はエラーがでて、2回目は出ない感じ。何なんでしょう?

・・・

下のスレッドで議論されている内容が原因みたい。斜め読みだけどSingletonの使い方がおかしいのかな?
Nabble – Hudson dev – Error in SubversionSCM “Unable to call getCredential”
このnabble.comってのはどんなサイトなんだろう? 修正パッチも有ったみたいだけどHudsonのMLには同様の情報は流れてないのかな。

・・・

よくHudsonのバグリストを探してみたら見つかった、これな気がする。
hudson: 課題 4176
現在もステータスはOpenになってるし、問題として認識されているんだろう。
個人的には毎日何回もエラーメールが飛んできて困るので2票ほど投票してみた。結構根が深い問題なのだろうか、気長に待とう。