vimで行のパターン削除

in

昨日は仕事でデータ集計をしたのですが作業の中で、あるパターンの行だけを削除する必要があったのですが、perlやrubyでスクリプトを書くほどのこともないのでvimでサクっと削除しようと思ったのですがコマンドがどうしても思い出せず悲しい思いをしました。

vimは基本的にプログラムを書くときに使っているので「あるパターンの行をすべて削除」なんてことはあまりやらないのですが、それでも長年のvim愛好者としては悲しい。

:g /pattern/d

【SoftwareDesign総集編】でゲットしたvim逆引きリファレンスに救われましたという情けない話でした。

それにしもこの総集編はいいです。時代の彼方へ去っていた記事もありますが、古くともまだまだ有益な情報が一枚のディスクに収まるって便利。とりあえず目についた

  • UNIXプログラミングツールをマスターせよ2008
  • 関数プログラミングことはじめ
  • GNU grep/egrep正規表現リファレンス
  • MySQL最前線2007
  • vim逆引きリファレンス
  • オープンソースで飯を食う
  • LightweightLanguage最新動向2006

あたりをevernoteに放り込んで暇なときに読み返してます。

Software Design 総集編 【2000~2009】(DVD付)
Software Design 総集編 【2000~2009】(DVD付) SoftwareDesign 編集部

技術評論社 2010-02-17
売り上げランキング : 67

Amazonで詳しく見る by G-Tools

clippy 0.7公開しました

in

ずっとHaskellばかりやっていましたが外部ファイルをテキストに指定できるようにclippyもバージョンアップしました。併せて環境設定用のプラグインも作成しています。

clippy環境設定

clippyダウンロードページからclippyPreferenceをダウンロード・解凍し、ホームフォルダの「ライブラリ」-「PreferencePanes」にコピーしてください。

この環境設定から、使用するテキストの指定や履歴保持回数・ホットキーなどを変更できます。テキストの文字コードはUTF8固定ですのでご注意ください。また、v10.6 SnowLeopardのみの対応です。

Project Eulerが楽しい

in

Haskellの勉強だと思ってProject Eulerはじめたんですが、思いの外ハマってしまって嬉し楽しです。年明けから始めて二月にようやくレベル1まで到達しました。一応、すべての問題をHaskellで解きました。苦労したのはProblem23で、先にC++のプログラムを作成して答えはわかっているのにHaskellでうまく書けずどうやってもStack OverFlow***。再帰再帰がうまくないのはわかっていたので$!とかseqとかいろいろやってみましたがダメ。で、最終的にはData.Arrayを再構築しながら切り抜けました。この方法は、google先生の助けをかりたのですがコピペはしていないのでマイルールには抵触しないです。σ(^_^;)?

この先、問題が難しくなることを考えればどう考えても全問解答まで一年以上かかる計算ですが、楽しくて止められません。

プログラミングHaskell (第八章の練習問題)

in

翻訳片手に再びトライ。この章にあるdo構文は、ghci環境では動作しないこともあり等価の(>>=)を使い(原著p77,翻訳p93参照)ます。また、ghci環境下ではPrelude.>>=と重複するためすべてMainの修飾子を付加しています。

8.10 (1) int::Parser Intを定義せよ

プログラミングHaskell (第八章の練習問題)の前に

in

八章は原著で玉砕していて僕にとっては鬼門です。練習問題に入る前に原著を読んだときに躓いたことを整理しておくと、躓きはテキストの例題にある1番目と3番目をペアで返すpのコード

p = do x <- item'
       _ <- item'
       y <- item'
       return' (x,y)

を入力してもエラーになって先に進めなかったこと。このこと自体はググってみたら、

p = item Main.>>= \x ->
    item Main.>>= \_ ->
    item Main.>>= \y ->
    return' (x,y)

のように、(>>=)を使えばうまくコードを実行できることはわかったのですが、肝心の実装が理解できず苦しみました。例えば、`parse item "abcde"`の結果が('a',"bcde")であるなら、`p "abcde"`は、

return' (('a',"bcde"),('c',"de"))

じゃないの?というところから抜け出せずにい(た|る)わけです。

プログラミングHaskell (第七章の練習問題)

in

7.8 (1) [f x|x <- xs, p x]をmapとfilterを使って書き直すとどうなるか?

a'::[Int]
a' = map f (filter p xs)
  where
    xs = [1,3..50]
    f  = (*2)
    p  = (<18)

まあ、これはいいかな。

7.8 (2) 標準ライブラリの定義をみないでall,any,takeWhile,dropwhileを定義せよ

プログラミングHaskell (第六章の練習問題)

in

新年おめでとうございます。本年もボチボチとよろしくおつきあいいただける僕としてもうれしいです。

6.8 (1) 負でない整数に対する累乗演算子を定義せよ。またその定義で2^3を簡約せよ

(#) :: Int -> Int -> Int
m # 0 = 1
m # (n + 1) = m * (m # n)

(Prelude.^)とバッティングするので(#)にしてます。

 2#3
 = 2*(2#2)
 = 2*2*(2#1) 
 = 2*2*2*(2#0) 
 = 2*2*2*1
 = 8

ところで、僕の解答ですが括弧がないです。一見したときは正しいと思ったのですがこの間違いは大きい気がします。結果の8は同じですが、問題の意図からすれば零点といってもいいくらい。

プログラミングHaskell (第五章の練習問題・シーザーの暗号)

in

5.7 (8) シーザー暗号のプログラムを大文字も扱えるように変更せよ

だんだん、プログラムらしくなってきました。問題のシーザー暗号のプログラムがどこまでのことを指すのか今ひとつわかりませんでしたが、crackの箇所は大文字の出現頻度がわからないのでとりあえず、暗号化するところまで。まず、let2intを改造して大文字もint変換できるように修正します。

プログラミングHaskell (第五章の練習問題)

in

5.7 (1) リスト内包表記を使って1から100の二乗の和を計算する式を考えよ

sum' = sum[x^2 | x <- [1..100]]

まぁまぁ、このあたりは...ね。

5.7 (2) replicateをリスト内包表記を使って定義せよ

プログラミングHaskell (第四章の練習問題)

in

4.8 (1) 偶数の長さをもつリストを半分に分割するhalve::[a] -> ([a],[a])を定義せよ

havle::[a] -> ([a],[a])
havle xs = (take n xs, drop n xs)
where n = length xs `div` 2

リストの長さが奇数でもOKだが?例外をスローすべきなのか?この章までではエラー処理についてはなにも言及されていないのでこのままで。解答には、

halve xs = splitAt (length xs `div` 2) xs

というのもありました。通常、こちらを使うべきですね。

プログラミングHaskell (第三章の練習問題)

in

まだまだ、調子よく進んでますが...

3.11 (1) 以下の値の型は何か?

a :: [Char]
a = ['a','b','c']
b :: (Char,Char,Char)
b = ('a','b','c')
c :: [(Bool,Char)]
c = [(False,'o'),(True,'l')]
d :: ([Bool],[Char])
d = ([False,True],['o','l'])
e :: [([a]->[a])]
e = [tail,init,reverse]

最後の問題は、括弧はつけなくとも大丈夫だとは思いましたがあえて関数のリストということであえてつけてみましたが冗長なのでむしろわかりにくくなるかもしれないので減点。

プログラミングHaskell (第二章の練習問題)

in

プログラミングHaskell 第二章練習問題。(Hugsを用いて実行はghc v6.10.4です)このあたりはまだ、余裕があります。(^^)

2.6 (1) 括弧をつけよ

-- 2^3*4
a=(2^3)*4
-- 2*3+4*5
b=(2*3)+(4*5)
-- 2+3*4^5
c=2+(3*(4^5))

2.6 (2) Hugsを用いて実行せよ。

*Main>: a
32
*Main> b
26
*Main> c
3074
*Main> d

2.6 (3) エラーを修正しHugsで実行せよ

NSURLのエスケープ指定

in

clippyのエイリアスに日本語ファイル名を指定すると読み込めないというバグがありました。自分では滅多に日本語ファイル名などというのは使わないので全然ノーマーク。

NSString:stringWithContentsOfURL:encoding:errorを使って読み込みする際、読み込むファイルのNSURLを単純に生成してました。

NSString *contents = 
  [NSString stringWithContentsOfURL:[NSURL URLWithString:filename] 
  encoding:NSUTF8StringEncoding error:&err];

これだとNSURL:URLWithStringはnilを返しますが、なんのチェックもなしです。(^^ゞなんでもかでも一行に納めるとこういう場合がきつい。ちゃんと2ステップ踏んで、fileスキームもちゃんとエスケープしないとダメですね。

NSURL    *url = [NSURL URLWithString:
  [filename  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString *contents = 
  [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&err];

便利なものがあって助かりました。しかし、どうせならエスケープするというのをデフォルトにすればいいのになぁ。などと少し思ったりもします。

プログラミングHaskell (翻訳版)で再び (第一章の練習問題)

in

しばらく頭を冷やしている間に立て続けにProgramming in HaskellとRreak World Haskellの翻訳がでて大忙し。Programming in Haskellが翻訳中なのは知っていましたが山本さんとうとうですねー。お疲れ様。ということで、邦訳でもう一度丁寧に読み返しはじめました。

すべてのウィンドウ情報を取得する方法。Scripting Bridge vs AX*

in

OSXである時点の表示されているすべてのウィンドウ位置を取得するのはScripting Bridgeで簡単にできると思っていたのですがいざやってみたらうまくできませんでした。やり方は、起動中のすべてのプロセス取得。そのプロセスが持っているウィンドウ情報を引き出すという手法でできると思ったですが...

まず、起動中のプロセス取得。これはシステムイベントから取得できます。

  SystemEventsApplication *systemEvents   = 
  [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
  SBElementArray *procs = [systemEvents processes];

でこのプロセスからウィンドウ情報を取得します。

for(SystemEventsProcess* proc in procs)
{
   for (SystemEventsWindow *w in [proc windows])
   {
      NSLog(@"%@ :%@ (%.1f:%.1f,%.1f:%.1f),%d,%@,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
            [proc name],
            [w name],
            w.bounds.origin.x, w.bounds.origin.y,
            w.bounds.size.width,w.bounds.size.height,
            w.closeable,
            [[w document] name],
            w.floating,
            w.id,
            w.index,
            w.miniaturizable,
            w.miniaturized,
            w.modal,
            w.resizable,
            w.titled,
            w.visible,
            w.zoomable,
            w.zoomed
         );
     }
  }

これで完璧だと思ったのですが、取得できたのはw.nameだけ。あとは皆NULLかゼロという悲惨な状況でした。プロパティはあるのになんで!

コンテンツの配信