svn最新だけをclone

職場はsvnで個人的にgitを使うときなど、全部持ってくると死ぬほど時間がかかるので最新のtrunkだけ持ってくる。

% git svn clone -rHEAD https://svn.example.com/unk/trunk unk

svnから更新分を持ってくる

% git svn rebase

svnへ更新分を反映する

% git svn dcommit

空ディレクトリの削除をsvnにお伝えする

% git svn dcommit --rmdir

svnをgitに変換

-sは--stdlayoutでtrunk/, branches/, tags/構成を想定してブランチに変換してくれるそうです。

% git svn clone -s http://foo.com/repos/project

ブランチ一覧

% git branch

ブランチ作成

% git branch michel-jackson

ブランチ切り替え

% git checkout michel-jackson

ブランチ作りつつ切り替え

% git checkout -b michel-jackson

ブランチをマージ

% git checkout master
% git merge michel-jackson

一個前のコミットをなかった事にする

% git reset HEAD^

昔のコミットを修正する

% git rebase -i 695b1eb
(修正)
% git commit --amend
% git rebase --continue

タグ付ける

% git tag v0.0.1
% git push --tags

タグ情報付きで持ってくる

% git pull --tags

一つ戻して無理やりpush

% git reset --soft HEAD^
% git ci -a -m 'やりなおし'
% git push origin master --force

ブランチをpush

% git push origin win32

localにphp5.3.1とwordpress2.8.6をインストールしてみるが、DBに繋がらないとのエラー。詳細が知りたいのでphp.iniのerror_logを設定してエラーログを見てみるが何も出力されてない。

<?php trigger_error('error raising!'); ?>

上記の様なスクリプトを実行してみると確かにエラーログに残るのだが・・・。

% grep -r @mysql .
./wp-includes/wp-db.php: $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true);
./wp-includes/wp-db.php: if (!@mysql_select_db($db, $this->dbh)) {
./wp-includes/wp-db.php: $this->result = @mysql_query($query, $this->dbh);
./wp-includes/wp-db.php: while ($i < @mysql_num_fields($this->result)) {
./wp-includes/wp-db.php: $this->col_info[$i] = @mysql_fetch_field($this->result);
./wp-includes/wp-db.php: while ( $row = @mysql_fetch_object($this->result) ) {
./wp-includes/wp-db.php: @mysql_free_result($this->result);

なるほど・・・。

これだと原因究明が難しいのでmysql_connectの@を取って実行してみた。

% diff wp-includes/wp-db.php{,.org}
341c341
< $this->dbh = mysql_connect($dbhost, $dbuser, $dbpassword, true); # FIXED by komagata
---
> $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true);

php_errors.log:

[14-Dec-2009 02:49:02] PHP Warning:  mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in /users/komagata/Sites/wordpress/wp-includes/wp-db.php on line 341
[14-Dec-2009 02:49:02] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: No such file or directory in /users/komagata/Sites/wordpress/wp-includes/wp-db.php on line 341

なるほど、/tmp/mysql.sockにソケットファイルがあると思っているために接続できないらしい。

PHP: 実行時設定 - Manual

mysql.default_socket string

他にソケット名が指定されない場合、ローカルなデータベースサーバに 接続する時のデフォルトのソケット名。

php.iniにデフォルトのMySQLのsocketの場所を設定できる項目があることがわかった。ちなみに接続時のhostにもlocalhost:/path_to/mysql.sockといった指定が可能らしい。

PHPのマニュアルは非常に詳細な内容も記載されていて、日本語訳も充実しているので巷で問題になってたりすることの殆は公式マニュアルで解決することが多い。

macportsで入れた場合のmysqlのデフォルトのsocketの場所である/opt/local/var/run/mysql5/mysqld.sockを指定したら動いた。

問題解決のためにはコード内でエラー抑制はせず、各個人の環境でdisplay_errorsやerror_logを設定すべきだと思うが、php.iniが弄れない共有レンタルサーバーで使われることが多い事や、エラーがズラズラでてもパニックに陥るだけといった理由でこういう作りになっているのかなと思った。

本番環境ではすべきでないが、大抵の共有レンタルサーバーと同じ様にdisplay_errosOnにした場合、エラー抑制子を外すと、データベースに接続できない場合はこんな感じになる。

データベースエラー

たしかにちょっと怖い感じがするかも。初めてのインストールでこれが出たら諦めちゃう人も多いかも。

Macにインストール

% sudo port install php5 +apache2 +pear
% sudo port install php5-mysql php5-mbstring
% cd /opt/local/etc/php5
% sudo cp php.ini-development php.ini
% sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
[activating module `php5' in /opt/local/apache2/conf/httpd.conf]
% sudo vi /opt/local/apache2/conf/httpd.conf
# mode_php5
Include conf/extras-conf/mod_php.conf

Timezoneを設定

/opt/local/etc/php5/php.ini

[Date]
date.timezone = Asia/Tokyo

MySQL設定

/opt/local/etc/php5/php.ini

[MySQL]
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock

portsで入れたphpとmysqlそれぞれの見に行くsockの場所のdefaultが違う。

あと半月ちょっとで2010年ですが、想像してたのと随分違うなあ・・・。

ストリートファイター2010

sf2010

ストリートファイター4

ストリートファイター4

関連:PLANET5の厳しさ - p0t

PythonでCSVのFixtureをYAMLに変換(添削希望・・・)などと書いていたんですが、なんとid:perezvonさんが添削してくださいました!

あざーっす!

元のコード:

import sys
import csv

if (len(sys.argv) < 2):
  print 'Usage: %s ' % sys.argv[0]
  quit()

csv_file = sys.argv[1]

filename, suffix = csv_file.split('.')
reader = csv.reader(file(csv_file, 'r'))
i = -1
res = []
for row in reader:
  i += 1
  if i == 0:
    column = row
    continue

  s = filename + str(i) + ":\n"
  for j in range(len(column)):
    s += "  " + column[j] + ": " + row[j]  + "\n"
  res.append(s)

f = open(filename + ".yml", 'w')
f.write("\n".join(res))
f.close()

添削していただいたコード:

import sys
import csv
import yaml

def main(src, dest):
    reader = csv.reader(file(src))
    data = list(reader)

    result = []
    cols = data[0]
    rows = data[1:]
    for row in rows:
        result.append(dict([(k, v) for k, v in zip(cols, row)]))

    yaml.safe_dump(result, file(dest, 'wb'),
                   default_flow_style=False,
                   encoding='utf-8',
                   allow_unicode=True)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print 'Usage: %s [filename]' % sys.argv[0]
        sys.exit(1)

    src = sys.argv[1]
    dest = src.replace('.csv', '.yml', src.rindex('.'))
    main(src, dest)

ジーザス・・・スマート!

こちらを参考に復習していきたいと思います。

まずこの部分。

if __name__ == '__main__'

なるほど〜Rubyでもやりますね。この辺は無意識にできるようになりたい。

rows = data[1:]

csvの1行目以降を簡単に取っている。どうも簡単なデータ構造を基本的な処理の組み合わせでシンプルに扱うというところを疎かにしがちで冗長になったり、安易にクラスにしたりするので反省していきたい。

そしてこのコードの処理の大半が次の一行に凝縮されている。

result.append(dict([(k, v) for k, v in zip(cols, row)])

zip関数を使うと複数のシーケンスを簡単に回せるんですね!これ、Rubyだとちょっと面倒な処理だと思います。(俺のRubyスキルの低さ含めて)

これはモテる!

yaml.safe_dump

そしてyaml.safe_dump。まさに元エントリーで書かれているように、普通にyaml.dumpして(´・ω・`)となっていました・・・。

dest = src.replace('.csv', '.yml', src.rindex('.'))

ここも素敵。元のコードだとピリオドが一つ以上あるファイル名でおかしなことになりますね。

同じ問題をうまい人にも解いてもらってそれを見るのはとても勉強になりますね。プログラマの教育の話でも目の前で解いて見せるという話がありましたが、とても効率的な気がしました。

日々ブログに恥を垂れ流してますが時々こういう良い事があるので嬉しいですね。ありがとうございます!

参照:PythonでCSVのFixtureをYAMLに変換 - スコトプリゴニエフスク通信

関連:PythonでCSVのFixtureをYAMLに変換(添削希望・・・) - p0t

「やまざき冬のテスト祭りで小皿を当てよう」ということで設定の見直し中。

以前は少し面倒だったautotestのgrowl通知がスマートになってました。

% sudo gem install autotest-growl
% vi ~/.autotest
require "autotest/growl"
GrowlHelperApp

楽になったもんですなー。

Mr.Tブログを復活させるべくWordPress2.8.6を実家サーバーに入れてみる。

インストール

$ sudo apt-get install libapache2-mod-php5 php5-mysql
$ mysqladmin -uroot -p create mrt
$ mysql -uroot -p -e "grant all on mrt.* to mrt@localhost identified by 'unk';"

$ wget http://ja.wordpress.org/wordpress-2.8.6-ja.zip
$ unzip wordpress-2.8.6-ja.zip
$ mv wordpress mrt
$ cd mrt
$ cp wp-config-sample.php wp-config.php
$ sudo chown deployer:www-data wp-content
$ chmod g+w wp-content
Mr.T

できた。

Mr.T

ネットワーク

プライベート

192.168.0.1

255.255.255.0

グローバル

219.117.237.232 - 219.117.237.239

255.255.255.248 / 29

DHCP

192.168.0.? - 192.168.0.?

Hostname Reading Private IP Global IP Memory Swap HDD OS Description
rooter
192.168.1.1 202.61.22.113



ルーター
komagata コマガタ 192.168.1.100




無線LANアクセスポイント
arial アリアル 192.168.1.101 219.117.237.234 8GB 512MB 8GB Debian Lenny Domain0
lucida, storage ルーシダ 192.168.1.102 219.117.237.235 512MB 256MB 1TB Debian Lenny ファイルサーバー、リポジトリ
courier クーリエ 192.168.1.103 219.117.237.236 6GB 3GB 500GB Debian Lenny ステージング、開発
verdana ベルダナ 192.168.1.104 219.117.237.237 512MB 256MB 100GB Debian Lenny BTS、ツール
helvetica ヘルベティカ 192.168.1.105 219.117.237.238




実家のサーバー(Debian lenny)にRemedie入れたら、動いたんだけどOPMLインポートしてアクセスすると落ちる。

動いてるヤツのremedie.db持ってこようかな?

$ perl bin/remedie-server.pl 
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
HTTP::Engine::Interface::AnyEvent : You can connect to your server at http://0.0.0.0:10010/
We won't be doing any rendezvous publishing, please install a Net::Rendezvous::Publish::Backend:: module
We won't be doing any rendezvous publishing, please install a Net::Rendezvous::Publish::Backend:: module
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
"unicode" attribute will be deprecated. Use "sqlite_unicode" instead. at /usr/local/lib/perl/5.10.0/DBI.pm line 708.
Malformed UTF-8 character (fatal) at /usr/local/lib/perl/5.10.0/XML/LibXML/Error.pm line 217. at /usr/local/share/perl/5.10.0/HTML/TreeBuilder/LibXML.pm line 59
[Perl] Google Web Search API検索処理サンプル Kawa.netブログ(川崎有亮)/ウェブリブログ

Google Web Search API のサンプルコードもメモしておく。
Perlの場合は、SOAP::Liteモジュールを使うのがカンタン。
『link:www.kawa.net』 のリンク元検索をはじめ、特殊な検索も可能。

(中略)(以下コメント欄)

SOAP::Liteモジュールの保存場所など設定の詳細がさっぱりわからないです。どうしても、このサンプルを実行できないです…
何か、保存場所が決まっていたりしていますか?

ゆうすけさんがここにお示しになっているサンプルを改良すればどうにかなると思ったのですが、なにぶんGoogle Web Search API の詳細がわからない&期限が迫っているという状況で、もう困り果てています。よりによって、ゆうすけさんがお示しになっているサンプルすら実行できないですから…

よろしければ、以下のメールアドレスにGoogle Web Search API によって取得した検索結果の「上位100件取得」「それぞれ100文字取得」をテキストデータとして取得するということを達成するプログラムのサンプルを示してくださるとありがたいですが…もう切羽詰ってます…

dinamo_moskvaあっとhotmail.com
あっとは勿論@に直してください。

よろしくお願い申し上げます。頼りにしてます…

勉強中の人
2006/08/21 09:55


サンプルスクリプトのソースコード中の『-&gt;』は『->』です。
たぶん、このブログのシステムの関係で化けてしまってますね。

コマンドラインから
『perl -MSOAP::Lite -e "print($SOAP::Lite::VERSION)"』
を実行してみた結果はいかがでしょうか?

また、SOAP-Lite-0.69.tar.gzをダウンロードした場合は、
libディレクトリ内のすべてのサブディレクトリ(SOAPなど)を
上記Perlスクリプトと同じディレクトリ(カレント)に置けば、 バージョン0.69を利用することができます。

どのようなエラーが表示されるのでしょうか。
それとも、何も表示されない?
サマリ(おおむね先頭100文字相当)は $item->{snippet} で取り出せるので
そんなに難しくないと思います。がんばってください。

ゆうすけ
2006/08/21 12:42

川崎ゆうすけさんは神か仏かゴータマ・シッダールタか。(重複)

兄貴ぃ(川崎さん)!俺にやらせてつかあさいっ!俺が必ずヤツのタマ取ったりますけん!