patchコマンド

svnやgitを使ってると、特に意識することはないけど、
仕組みというか概念というか、とりあえず使ってみた。



diff -u 1.pl 2.pl
--- 1.pl 2011-06-29 23:49:54.000000000 +0900
+++ 2.pl 2011-06-29 23:50:10.000000000 +0900
@@ -1,3 +1,3 @@
1
-2
+22
3
diff -c 1.txt 2.txt
*** 1.pl 2011-06-29 23:49:54.000000000 +0900
--- 2.pl 2011-06-29 23:50:10.000000000 +0900
***************
*** 1,3 ****
1
! 2
3
--- 1,3 ----
1
! 22
3
-uを付けるとunified 出力形式を用いる。
-cを付けるとcontext 出力形式を用いる。

まぁどちらでもよいけど、-uを選択。

それをsample.patchとして保存。

基本的な使い方
patch <sample.patch

オプション
-b : バックアップ -B だとプレフィックスを指定できる
-R : パッチは新旧のファイルが反転しているとみなす。
--dry-run : パ ッチを当てたときの結果を表示
-f : 問い合わせ無しの実行
-i [pach file] : パッチをファイルから読み込む - を指定すると標準入力(デフォルト)
-p[num] : 適用するパスのプレフィックスを[num]個削除する
--verbose : 詳細情報表示

ファイルの圧縮/解凍

今更な感じだけど、覚えていないので、メモ程度に記述

tar zcvf 圧縮後のファイル名 対象ファイル...
tar zxvf 圧縮ファイル

詳細も調べたいけど今ではない。

異なるサーバ間のファイルをマージする

開発環境が複数あると、マージなんかが大変になるわけで、比較的簡単にやりたい。
出来ればGUIでやりたいのだが、WindowsのWinMergeみたいな便利なものがなく、
ひとまず p4Mergeでチャレンジ

1.まずマウントしてローカルファイルのアクセスをできるように
mount -w -t smbfs //user:pass@dev1/path /mnt/dev1/path/
mount -w -t smbfs //user:pass@dev2/path /mnt/dev2/path/

2.p4mergeを呼び出す
p4merge ベースファイル 左側のファイル 右側のファイル マージ結果ファイル
p4merge /mnt/dev1/hrk_ys/lib/Foo.pm /mnt/dev1/hrk_ys/lib/Foo.pm /mnt/dev2/hrk_ys/lib/Foo.pm /mnt/dev2/hrk_ys/lib/Foo.pm

ベースファイルはsvn HEADとかから取得するといんだろうなー。

※Automatorを使うと便利 テキスト入力から取得してコマンドを作るみたいな
※dev_host1 dev_host2 lib/Foo.pm => p4merge ...

ひとまずこれでGUIでなんとか出来る。

Perlのeachには気をつけろ

perlのeachではまったので、メモを。

$ perl -v
This is perl, v5.8.5 built for i386-linux-thread-multi

サンプルソース
use strict;
use Data::Dumper;

use Test::More;

my $hash = +{ a => 1 };
#note explain $hash;
Data::Dumper->new( [$hash] )->Sortkeys(1)->Dump;
ok each %{ $hash };


結果
not ok 1

ちなみに、Sortkeys(0)をすると、okとなります。
同様にnote explain $hashでもnot okになります。
explain は内部的にData::Dumperを呼んでいるため。

そして、何が原因か探ろうとおもったのですが、
中身がData::Dumper::Dumpex(実物はxs)なので断念。

たぶん、eachでつかうitaratorがリセットされてないだけだと思いますが。。

こんな感じです。

use strict;

use Test::More;

my $hash = +{ a => 1 };
#note explain $hash;
#Data::Dumper->new( [$hash] )->Sortkeys(1)->Dump;
while (my $k = each %{ $hash } ) {
last
}
ok each %{ $hash };


ついついexplainしたくなりますが、気をつけます。

DataStoreの辛いところ

# DataStoreの限界 FacebookやインスタグラムのようなSNSで、投稿、公開範囲、お気に入りなどの機能をDataStoreで実現しようとするとどうしても辛くなる。 ## DataStoreで実現可能? - users - id - feeds - i...