(2010-01の一覧)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2010-01-31 Sun (他の年の同じ日: 2006 2007)

クリップボードのテキストをコマンドラインperlで変換
2010-01-31-1 / カテゴリ: [cygwin][perl] / [permlink]

  • /usr/bin/getclip
クリップボードの中身をstdoutへ出力する。
cygutilsパッケージに含まれる。

  • /usr/bin/putclip
stdinをクリップボードへコピーする。
cygutilsパッケージに含まれる。

これらとperl(-e によるコマンドライン実行)をパイプで組み合わせれば、「エディタの置換機能じゃちょっと困難だけど、スクリプトにするまでもない変換」なんかをサクサク実行。

例: 開いているエクセルの特定部分をコピーしたデータ(tab区切り)をpukiwikiの表形式に変換
% getclip | perl -ple 's/^|[,\r]/|/g' | putclip
入力
入力エクセル
出力
|ID|曲名|アーティスト|ファイルサイズ|再生時間|再生回数|
|4863|私の時間|初音ミク|6412945|266919|1024|
|4879|SUPER HATSUNE BEAT vol.1|初音ミク|4613135|575373|919|
|4917|SING&SMILE LONG ver.|初音ミク|1809195|223869|919|
|5081|ぴんぽんだっしゅ!|初音ミク|2188842|136097|954|
|5133|みくみくにしてあげる♪|初音ミク|1198334|99134|940|
|5149|ラジカルペイント|初音ミク|1572383|97567|984|
|5193|教えて!! 魔法のLyric|初音ミク|2070128|257619|952|
|5257|電脳スキル|初音ミク|3157470|196832|866|
|5267|魔法少女ラジカルペイント(Long Ver)|初音ミク|1838250|228649|885|
|5691|とらいあんぐる☆Girl's Heart|初音ミク|3608040|180035|1091|

例が適当すぎるだろ…

-p はこっち
スクリプトでがっつり変換するならこちら。=> [2006-03-08-3]

スキー
2010-01-16-1 / カテゴリ: [diary] / [permlink]

年1回のスキーに行ってきた!日帰り!ここかな(かぐら)?

いつも手足が筋肉痛になるのでかなり気をつけて滑ってみたが、全てのダメージが腰に来てしまい、次の日起きれなかった…
げれんで!
2010-01-11 Mon (他の年の同じ日: 2005 2006)

(svndumpfilter)コミットの取り消し
2010-01-11-1 / カテゴリ: [svn] / [permlink]

前提省略して実際にやってみた。
リポジトリのリビジョンの取り消しより
TortoiseSVN は決してデータを失わないため、「巻き戻した」リビジョンはまだ中間リビジョンとして存在しています。HEAD リビジョンが以前の状態になっただけです。すべての痕跡を削除して、リポジトリから完全に見えなくする場合は、もっと極端な手段を採らねばなりません。これは本当に十分な理由がなければ、お勧めしません。考えられる理由としては、誰かが公開リポジトリに機密文書をコミットしたなどでしょう。

リポジトリからデータを削除する唯一の方法は、Subversion コマンドラインツールの svnadmin を使うことです。この実行方法の説明は、Repository Maintenance にあります。(訳注: 日本語訳は Subversion によるバージョン管理 にあります)

使うコマンド
直前の1リビジョンのコミットを全てなかったことにするのであれば、YappoLogs: 悪のりで学ぶsvnadmin/trac入門実用編のとおり、dump/load でいける。でも、特定のファイルのみをなかったことにするには dump/load のみでは対応できない。ここで svndumpfilter を使って、ダンプデータにパスでフィルタリングをかける。

1. 現リポジトリの退避

$ cd /path/svn
$ mv repos repos.org

2. 元と同じ名前で空リポジトリの作成(フィルタ結果をここに置く)

$ svnadmin create repos

3. リポジトリのダンプ

$ svnadmin dump repos.org > repos.dump

4. ダンプのフィルタリング

$ svndumpfilter exclude '/foo/bar/baz' < repos.dump > repos.dump.new
パスはリポジトリにおけるフルパス指定

5. フィルタ結果のリストア

$ svnadmin load repos < repos.dump.new

これで、/foo/bar/baz 以下がなかったことになる。
3,4,5 はパイプで一撃でもいける
$ svnadmin dump repos.org | svndumpfilter exclude '...' | svnadmin load repos

クライアント側は update/commit や、クリーンアップではなかったことにできなかった。よくわからなかったので、ファイルシステム上から単に削除した(^^;


参考
svndumpfilter: 気の向くままに・・・
2010-01-06 Wed (他の年の同じ日: 2006 2007)

今更だけどFizzBuzz問題(正規表現で)
2010-01-06-1 / カテゴリ: [programming][正規表現][perl] / [permlink]

更にPerlネタ

昨日([2010-01-05-1])に引き続き他人の日記をこっそり覗き見しているとFizzBuzz問題のPerlのコードを発見
2年位前に結構盛り上がってたみたいだけど、何故かリアルタイム参戦してなかったので、ちょっとやってみた。

が、何のヒネリも入らなかった。
perl -le 'print (($_%15==0)?"FizzBuzz":($_%3==0)?"Fizz":($_%5==0)?"Buzz":$_) for (1..100)'

んで、件のエントリに
剰余を使うな

とかありました
とあったし、ワンライナーは出尽くしてるっぽいので、剰余禁止(ついでに乗除算禁止、変換テーブル禁止)で、Perl使いらしく正規表現(キャプチャ禁止)でマニアックに実装してみた。
(ググったらそのものズバリな正規表現でFizzBuzzは見つかったけど、手持ちスキルはPerl5.8止まりなのでよくわからんかったorz <- 何がPerl使いだ>自分)

#!/usr/bin/perl -l
for (1..100) {
  s/(?<=[50])$/Buzz/;
  for (($a = $_) =~ s/\D*//g; $a !~ /^.$/; $a =~ s/(\d)(\d)/$1+$2/eg){}
  s/(?=$|\D)/Fizz/ if $a =~ /[369]/;
  s/\d+(?=\D)//;
  print;
}

とりあえず解説。
処理の流れ: 5倍数時は"数字Buzz"に置換、3倍数時は"数字Fizz"に置換、最後に数字以外が付加されていれば数字を削除して出力する。先に5を処理してるのは "5か0 + (非数字があるか空)" のパターンでキャプチャ不使用で末尾にBuzzを付加するパターン置換がどうしてもできなかったからorz

  • 1行目: シェバングは -l 付き。print; 単体で手抜き出力させるため:p
  • 2-8行目: 1から100までループ
  • 3行目: 「5の倍数は1桁目が0か5」なので、末尾($)が5or0([50])の場合に、数字部分を残して((?<=))末尾のみをBuzzに置換。数字は3の倍数判定に使用するので消さない。
  • 4行目: 「3の倍数は各桁の数字の和が3で割り切れる」ので、各桁の和を求める処理を1桁になるまで繰り返して3or6or9なら3の倍数ってことで、4行目のfor()の初期処理で倍数判定処理用に一時変数に一旦コピー(これがかなり気に入らん)、ただし既に5の倍数時はBuzzが付加されているので、数字以外(\D*)はコピー後($a = $_)に消去(s///g)、継続条件式で1桁判定(length($a)!=1に置換え可)、更新式で"数数"を((\d)(\d))数+数($1+$2/e)に全部(g)置換(s///)する。
  • 5行目: 「元のループ変数($_)」を1桁になるまで求めた各桁の和($a)が3or6or9(/[369]/)だった場合のみ(if修飾子)置換。ただし5の処理で既にBuzzが付いてる場合があるので、次の文字((?=))が末尾か非数字($|\D)の位置を置換。
  • 6行目: この時点で、数字のみ or 数字+Fizz or 数字+Buzz or 数字+FizzBuzz になってるので、次の文字((?=))が非数字(\D)の数字全て(\d+)を消去(s///);
  • 7行目: 出力
てか、Perlって空処理の制御構文でもブレース省略できないのね。
Cだと
for (...);
ってできるけど。


あ、多分当時はCに毒されてPerlを忘れつつあったから、面倒がって流行に乗らなかったのかも。(2007年のprogrammingカテがCばっか…)
2010-01-05 Tue (他の年の同じ日: 2007)

世界のナベアツ問題をワンライナーで
2010-01-05-1 / カテゴリ: [programming][perl] / [permlink]

ネタがないと言いつつ見つかってしまった。というか、2年ぶりくらいの戯術ネタ。

前の部署の同期がブログで「perlで世界のナベアツ問題」と題してコードを書いてたのをたまたま発見したけど、最後に、単に改行とインデントを削っただけのワンライナーを載せてるのでちょっと添削してみた

元(http://d.hatena.ne.jp/bata64/20080410/1207801849から引用)
perl -e 'foreach(1..40){if($_%8==0){print"$_ぅぅういえぇえあ\n";}elsif($_%3==0||$_=~/3/){print"$_っ!!\n";}else{print"$_\n";}}'

アレンジ後
perl -le 'print !($_%8)?"$_ぅぅういえぇえあ":(!($_%3) or /3/)?"$_っ!!":$_ for(1..40);'

一応解説
  • -lは、printなどで自動改行するためのオプションスイッチ(ぺるりめも書いてねぇ…)。
  • foreach でなく for なのは単にタイプ数の削減(Perlでは、forとforeachは同じ働きをする)、更に、ループブロックとして使用せず、文の修飾子として記述することで、ブレースを削除( expr if cond; の要領)。
  • 出力部分を print の引数に三項演算子を使用することで、1文に圧縮。
  • 剰余0の検知を比較演算子でなく、否定を使うことでなんとなくスマートに。(多分見にくくなってる)
  • 3のマッチングの $_ =~ の削除はセオリー通り
やっぱ1文で書いてこそのワンライナーだよねっ :D
ちなみに元の要件はチェックしてないのでアルゴリズム自体は知らん:p


chalowってリスト表記どうすんだっけ…


リスト対応したぜ [2011-06-13-1]
Referrer (Inside): [2010-01-06-1]
2010-01
前の月 / 次の月 / 最新

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12