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

会社で使っているRedmineをgithubで公開されているものに差し替え

3月 23rd, 2010

何でこれまでやってなかったのかと言うと、うちの社内から社外のSubversionリポジトリにアクセス出来なかったからです。アクセス制限がかけれられているわけではなくて、間に挟まったプロキシがSubversionが独自に拡張したHTTP命令を解釈できないようなのです。

ということで、githubでホストされているedavis10's redmine at master – GitHubを見つけて、これをcloneして使うようにしました。masterからインストールサーバ用にカスタマイズして使いましたが、タグやリリースブランチもきちんと切ってくれているのでgitさえわかれば好きに改変して使えますね。tar.gzでダウンロードしたものを使うよりもずっと便利です。

本体をgit管理にすると、プラグインもgit管理で最新版に追従したいところなんですが、ソースの置き場所がgithubにあったり、Google Codeにあったり、RedmineのSubversionにあったり統一感が無い感じです。個人的にはgithubで統一して欲しいのですが、それぞれ事情があるのでしょうね。このあたり、ブラウザから選択してインストール出来るHudsonはよく出来ているなと感心します。

あと今日公開された日本語環境で読みやすいRedmine用テーマ「farend basic」公開 | Redmine.JP Blogも使ってみて気に入ったのでデフォルトのテーマにしました。これまで本家にあったAlternativeを使っていたのですが、メイリオの効果かfarend basicの方が文字周りが綺麗に感じます。Redmineユーザの方は一度試してみることをおすすめします。

Subversion, Git, Redmine, Hudson – 結局こうなった

3月 21st, 2010


前に考えていた開発プロセスの変更を色々試行錯誤してみてある程度固まってきました。過去の記事は以下からどうぞ。

ネットワークが切り離された外部チームとのやりとりは結局git bundleにしました。外部チームからはパッチでもらい、レビューした後に適用する。ある程度開発が進んだらgit bundleでリポジトリをコピーして外部チームに送付。外部チームはbundleファイルをそれぞれcloneして開発を行い、適宜git fetch/git pullしながら更新に追従します。タスクの粒度が1タスク1人だったこと、外部チームで別途central repositoryを設けることによるメリットが読めなかったのでこの形を取りました。開発メンバのGitレベルが上がればまたちがった使い方があるのかもしれません。チームの大半が入門Gitを読んだ程度だとこれぐらいから始めるのが混乱が少ないようです。
「masterだけ送ればいいから % git bundle create reponame.bundle master」でOKと思ってbundleファイルを作ったところclone出来ない問題が起きて半日ほどハマることがありました。「% git bundle create reponame.bundle master HEAD」じゃないと駄目みたいです。リポジトリ全部のコピーを送るなら「% git bundle create reponame.bundle –all」でもいけます。

以前はgitリポジトリの変更をSubversionに自動で書き戻すことを考えていましたが、GitとSubversionを共存させる » tune webで書いたようにSubversionに登録されたソースが削除されてしまうことがあり、結局手動にしました。週に1回ぐらい書き戻すことを想定しています。それに合わせてRedmineやHudsonが参照するリポジトリもgitに変更しました。

Hudsonのgitプラグインでポーリングする設定をしてみたのですが、ポーリングのログを書き込むところでたまにエラーが起きて止まってしまうため、gitのフックスクリプト(post-receive)でHudsonのジョブをcurlでキックするようにしました。ジョブはWindowsとLinuxとあるのですが、Windowsが苦戦しました。まずWindowsのジョブを実行するPCにmsysGitを入れて、コマンドプロンプトからgitコマンドが叩けるようにします。次にHudsonのgitプラグインでは認証を入力することが出来ないので、gitリポジトリをhttpで読めるようWebサーバの設定を行いました。gitのhttp公開は単にリポジトリのフォルダにアクセス出来るようすれば良いだけなので簡単です。あとはhooks/post-updateに”git update-server-info”を追加すればOKです(参考:git update-server-info)。

Hudsonのgitプラグインはテスト対象をワイルドカードを含むブランチ名で指定できるので、少し時間をかければpre-test commitも出来そうです。前は良く分からないなんて書いてしまいましたが、少しgitプラグインを使ってみれば感触がつかめるのではないかと思います。近々に必要な機能ではないので、また時間がある時に試してみようと思っています。

Redmineでgitを参照するにはRedmineと同じサーバにbareリポジトリを置く必要があります。別サーバで動かしているなら中央リポジトリからRedmine用のリポジトリに自動でpushする設定をすればいいでしょう。Redmineの昔のバージョンではリポジトリビューワが遅かったらしいのですが、0.9以降で試した限りでは気になるほどではありません。Subversionの頃よりも見やすくなった気さえします。trunkとbranchを切り替えて表示するのがSubversionより楽だと思います。リポジトリビューワがあまりに見やすいのでgit-webのインストールをやめたほどです。ソースレビューにgerritを検討しましたが、LDAP認証の設定をするところでうまく動かず断念してしまいました。最もr-labs – Code Review – Redmineが最近のバージョンアップでどんどん良くなっているので不要かもしれません。Redmineがより使われるようDoxygenで自動生成している内部仕様書もRedmineのRedmine – PluginEmbedded – Redmineですぐ見れるようにしてみました。

gitのフックスクリプトはhooks/post-receiveでメールを流す設定だけ有効にしています。コミットメッセージに Issue ID を含むことを強制させる Git のフックスクリプトを書きました|SNS構築の手嶋屋を参考にhooks/updateをつくってみたのですが、gitで自動生成されるコメント(マージとか)はRedmineのコミットIDを含まないのが問題になり結局止めています。この辺はまた時間をとってフックスクリプトを見直す必要がありそうです。

時間もかなり費やしましたが、昨年までよりも開発に専念出来る体制がようやくできました。Joel先生も分散バージョン管理で間違いないって、ベイビーと言ってるほどなので分散バージョン管理に移行しましょう!

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に変換してインポートした

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