Hatena::Diary

maru.cc@はてな RSSフィード

2010-09-07

[]Becky!2からThunderbird3への移行あれこれ

私がPCを使い始めた時から10年近く愛用していた Becky! Internet Mail Ver.2 をついに手放す時が来てしまいました。


家の環境はMacになり、メールは Gmail only。Android端末との親和性も高く個人メールはすべてGmailで完結しています。

会社での業務では、Becky!を使用してきました。


移行した理由は、Becky!を見限ったということでは全くなく、使い続けたいのですが、以下のような理由で泣く泣く切り替えをしました。

  • 基本、個人で買ったシェアウェアはNG。全社的に Thunderbird推奨。
    • 古株の特権(?)で、個人で買ったアカウントを使って少数派として使い続けてきました
  • 最近、PCが不調でバックアップしてリカバリをしたところ、ミスでバックアップに失敗して過去メールが消失。。
  • 新規に設定するのであれば、Thunderbirdへ ということに。

当然、切り替えたら、いろいろなところが気になります。

慣れれば解決する問題や、拡張機能で解決することもあると思うので、備忘録的に残しておこうと思います。


※随時追記していきます。


Ctrl+Spaceが効かない


振り分け設定がめんどくさい


Agante機能がほしい

2010-05-26 このエントリーを含むブックマーク このエントリーのブックマークコメント

まったく更新出来ていなかったので、最近の近況など。


仕事

仕事でポジションが変わってずいぶん忙しくなりました。。

今までは、開発部のリーダーだったので、開発部内のことをメインに考えればよかったのだが、もちっと会社全体のことを考えるようになり、物を作る以外の調整や考えなければならないことが増えてきている。


その他

HT-03Aは、落としてしまった後、FOMAカードだけ再発行して旧端末に指していたのだが、3月にNexusOneを買った。

昨日、Android2.2のアップデートをしてみたが、想像以上にいいし問題無さそう。

ポータブルWi-Fiアクセスの機能を使うとお手軽にPC等からアクセスできるのがいい。欲を言うともちっと接続スピードが出るといいんだけどね。


アプリも最近作るようになってきた。

iPhoneもアプリも会社で作るようになってきたので、会社iPhoneを触ってみると、Androidインターフェイスよりもよくできているなーと思ったりした。

アプリ関連はもう少し情報たまったら書いていければと思う。


BPStudyという勉強会で刺激されたこともあり、Google Chromeの拡張を少し書いてみたりとかしている。

2010-03-04

[][]保存時にリアルタイムテスト実行でお手軽テスト

普段、Ethnaを使用して開発しているのだが、EthnaはWeb画面でテスト結果表示なので、どうしても一手間増えてしまう。

実際にテストケースを書いてブラウザで確認するのであれば、テストケースを書かずに、書いた実コードをブラウザで動作確認していた時と変わらず、Alt+Tab、Ctrl+R とかするのであれば、実コードを実行するいままでのやり方で済ませてしまい、なかなかテストケースを書くというやり方が浸透しない。

もしくは、最初はするけど、忙しくなるとしなくなるという状況でした。


テストケースを書くことで得られる安心感や、結果としてクオリティの担保になるというのは、理解してもらえるとは思うのだが、Alt+Tab、Ctrl+R という、今までと同じ手順ではない、テストを書く方が楽。という方法が確立できればいいのではないか。なんて考えていた。


つい先日、Ethnaの今後のロードマップを考える というか 話し合う飲み会があったのだが、そこでテストの話が少し出た。

id:sotarok から、ファイルの保存時に自動でテストを実行なんて話を聞いて、いつぞやのPHP勉強会で、kunitさんのTDDの話を思い出した。


ちょうど、今回途中参加した案件では、Ethnaではなく独自フレームワークっぽいもので作成だったので、TDDをすべく環境を整えてみた。

テストライブラリに何を使うか

ばっちりテストを書くというよりは、手軽に書きたいので、limeというテストライブラリを使おうとした。

limeでなるべく気軽にユニットテストを書く - id:anatooのブログ

[PHP] limeでTDDを体験する - DQNEO起業日記

このあたりが参考になるだろうか。

SimpleTestのようにクラスを作らずに手軽に出来るのが利点だ。


ところがどっこい、今回の案件は PHP4 でした。。。

limeは当然PHP5用なので、少し書き換えてPHp4用にしようかと思ったが、テストライブラリ自体が信用できない自分が書いたコードというのは意味がない。。。


他に使えそうなのが、PHPUnit、SimpeTest、phptなどなど。

phptは、ちょっと手間がかかるので無理かも。とういことで、Ethnaで使い慣れた SimpeTest を使うことにしました。


お手軽テスト

お手軽にテストするために、テスト用にわざわざ何かを実行するのは手間なので、実行ファイルの最後にテストを書くようにした。

limeでなるべく気軽にユニットテストを書く - id:anatooのブログ

このあたりを参考にしてみる。

<?php
define('BASE', realpath(dirname(__FILE__).'/../'));
class ActionForm1
{
    //ここに実際のコード
}

// test
if (debug_backtrace()) return;
include_once BASE.'/lib/test_autorun.php';
include_once FR_BASE.'/lib/test_autorun.php';

class Test_ActionForm1 extends UnitTestCase
{
    var $ac;
    function setUp()
    {
        $this->ac = new ActionForm1();
    }

    function testPrepare()
    {
        //ここにテストコード
        $this->assertEqual($this->ac->hoge, 'hoge');
    }

}

こんな感じだ。

すこし長くなるが、vimで実行すると、保存後に :!php % とするとテストが実行できる。

test_autorun.php

テストの実行ファイル

<?php
require_once dirname(__FILE__) . '/simpletest/unit_tester.php';
require_once dirname(__FILE__) . '/simpletest/mock_objects.php';
require_once dirname(__FILE__) . '/simpletest/collector.php';
require_once dirname(__FILE__) . '/simpletest/default_reporter.php';

register_shutdown_function('test_autorun');

/**
 *    Exit handler to run all recent test cases if no test has
 *    so far been run. Uses the DefaultReporter which can have
 *    it's output controlled with SimpleTest::prefer().
 */
function test_autorun() {
    $candidates = array();
    foreach (get_declared_classes() as $class) {
        if (substr(strtolower($class),0,5) == 'test_') {
            $candidates[] = $class;
        }
    }
    $loader = new SimpleFileLoader();
    $suite = $loader->createSuiteFromClasses(
            reset($candidates),
            $loader->selectRunnableTests($candidates));
    $result = $suite->run(new DefaultReporter());
    if (SimpleReporter::inCli()) {
        exit($result ? 0 : 1);
    }
}



実行結果は

:!php form1.php
test_actionform1
OK
Test cases run: 1/1, Passes: 0, Failures: 0, Exceptions: 0

続けるにはENTERを押すかコマンドを入力してください

さらに一歩進んで

これだと、保存後にコマンドを実行する必要がある。

もう一歩進んで、保存時に自動的にテストが実行されるようにしてみる。

kansit という、rubyのスクリプトがあることを id:sotarok から教えてもらったのだが、開発しているサーバには rubyが入っておらず、rubyの環境を整えるよりは、作った方が早いので以下のようなものを作ってみた。

<?php
$dirs = array();
foreach ($argv as $arg) {
    $dir = realpath($arg);
    if ($dir && is_dir($dir)) {
        $dirs[] = $dir;
    }
}

$files = array();

while (1) {
    usleep(500);
    $target = array();
    foreach ($dirs as $dir) {
        foreach (glob($dir.'/*.php') as $file) {
            if (isset($files[$file]) && $files[$file] != filemtime($file)) {
                $target[] = $file;
            }
            $files[$file] = filemtime($file);
        }
    }
    if (count($target)) {
        exec('reset');
        foreach($target as $file) {
            echo ">>run test {$file}\n";
            //passthru('php -l '.$file);
            passthru('php '.$file);
            echo "\n";
        }
    }
}

コマンドラインで実行し、引数に監視対象のディレクトリを指定するというスクリプトです。

無限ループで監視を続けるので、停止をするときには、Ctrl+C で止めてください。


開発する環境

screen を縦分割します。

上の画面を 10行ほどにして、そこで、上記の監視スクリプトを実行しておきます。

で、下の画面で普通にコードを書いて、保存をした瞬間に上の画面で結果が表示されます。


Erase is backspace.
>>run test /path/to/form1.php
test_actionform1
OK
Test cases run: 1/1, Passes: 0, Failures: 0, Exceptions: 0

こんな感じ。


保存時に毎回見るわけではなく、気にせずがつがつ書いていけばいい。

PHPの構文エラーもすぐに気づくし、通ると思った瞬間に確認すればいい感じです。

それに、画面上部は常に視界の片隅に入るので、結果がNGの場合に長い行が出るので、気にしていなくても目に入ってくる。



ちょっとしたことだが、コードを書く作業の妨げにならずに何度もテストが実行され、コードが正しく動くというのに自信が持てるので、作成中多少手戻りが発生しても、影響範囲とかを考えたり悩んだりしなくて済むのが楽だ。

2010-02-26

[][]RedmineでCVSとSVNのコミットコメントの文字コードが違う場合の対処

現在うちで使っているメインのバージョン管理ツールは SVN(Subversion) だが、過去の案件で CVS を使っているものがある。

開発が活発に続いているものは、タイミングをみて SVN へ移行してきたのだが、ひそやかに保守が続いていて、そこまでコストをかけられないものは CVS のままという状況だ。


SVN から GIT などの分散リポジトリも使ってみようということになり、今までは、SVN+Trac だったのを、Redmine に移すことにした。

(Redmine を CakePHP へ移植している candycane も考えてみたのだが、ちょっとまだ実務に投入するのは怖いかなぁと。。)

せっかく Redmine にするのであれば、CVSの案件もまとめて管理をしようということになり、追加をしようとしたが、CVSのバージョンが古くてリポジトリの追加ができなかった。


Redmine では、CVSのリポジトリを参照するのに rls というコマンドを使用しているのだが、これが、yum などで入れたバージョンでは使えないのでした。

そこで、ローカルのサーバで CVS の環境を構築して、実際にアップデートしてみてテストを行った。


役に立ったサイト。

http://www.nongnu.org/cvs/

http://www.sea-bird.org/doc/Linux/cvs_pserver.html

http://www.sea-bird.org/pukiwiki/index.php?CVS%2FCVS%A5%B5%A1%BC%A5%D0%A4%CE%C0%DF%C4%EA%A4%CE%B4%AC

http://www.asahi-net.or.jp/~wv7y-kmr/memo/cvsserver.html#cvsaccess


アップデートのログ

# cd /usr/local/src
# wget http://ftp.gnu.org/non-gnu/cvs/binary/feature/x86-linux/RPMS/i386/cvs-1.12.12-ximbiot.1.i386.rpm
# rpm -qa | grep cvs
cvs-1.11.2-10
# rpm -Uvh cvs-1.12.12-ximbiot.1.i386.rpm
Preparing...                ########################################### [100%]
   1:cvs                    ########################################### [100%]
# rpm -qa | grep cvs
cvs-1.12.12-ximbiot.1

これで無事に Redmine から CVS のリポジトリが参照できました。


コミットコメントの文字化け対処

CVS 登録直後は、リポジトリは参照出来るのだが、以下のコマンドを動かしてコミットログを取得すると動かなくなる

ruby /phat/to/script/runner "Repository.fetch_changesets" -e production

CVS を redmine に登録すると、コミットログが文字化けしてしまい、文字化け状態だとリポジトリが開けないという状況になってしまいました。

http://redmine.jp/faq/repository/shift_jisutf-8/

このあたりの対応とか、リポジトリ消して作り直しとかしてるんですけどねぇ。。。


いろいろ確認したところ、

管理>設定>リポジトリ の

コミットメッセージのエンコーディング = Shift_JIS

にすれば、CVSは文字化けせずに表示できるが、SVNが文字化けをする


めんどくさいので、CVSの時だけ nkf を通して文字コードを utf-8になるようにパッチ当てちゃいました。

/path/to/redmine/lib/redmine/scm/adapters/cvs_adapter.rb のファイルです。

--- cvs_adapter.rb.bk   2010-02-26 19:23:10.000000000 +0900
+++ cvs_adapter.rb      2010-02-26 19:24:03.000000000 +0900
@@ -66,6 +66,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} rls -e"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)
@@ -111,6 +112,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} rlog"
           cmd << " -d\">#{time_to_cvstime(identifier_from)}\"" if identifier_from
           cmd << " #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           shellout(cmd) do |io|
             state="entry_start"

@@ -230,6 +232,7 @@
           logger.debug "<cvs> diff path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
           path_with_project="#{url}#{with_leading_slash(path)}"
           cmd = "#{CVS_BIN} -d #{root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -247,6 +250,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} co"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " -p #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           cat = nil
           shellout(cmd) do |io|
             cat = io.read
@@ -260,6 +264,7 @@
           logger.debug "<cvs> annotate path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
           cmd = "#{CVS_BIN} -d #{root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           blame = Annotate.new
           shellout(cmd) do |io|
             io.each_line do |line|

これで、すでに文字化けているリポジトリは削除して再設定し、script/runner を再実行でコミットコメントも文字化けせずに取得できました。