マッチしなかった要素を探す

ちょっと表現が微妙なんだけど

  • 正規表現マッチを使い
  • マッチしない要素(行など)

を探す方法が急に気になったのでまとめてみた。

grep -v

GNU grep, BSD grep の場合は -v オプションが使える。–invert-match で、まさに「マッチしなかった行を探す」目的に使う。

awk '!/RE/'

awk の場合は基本的な動作を

パターン { アクション }

で記述する。このパターンを ! で否定すればマッチしない場合の動作を簡単に記述できる。

フィールドなどを明示する場合は

$1 ~ /RE/

がマッチするパターンで

$1 !~ /RE/

がマッチしないパターンになる。この ~, !~ の書き方は他の多くの LL にも採用されている。少なくとも Perl, Ruby では ~ を =~ で置き換えるだけでパターンの部分は記述できる。

Perl の grep()

Perl には list の中から特定のパターンにマッチする要素だけを抜き出す grep() 関数がある。これは

grep( /RE/, LIST )

という形で使う1。このとき !/RE/ とすればマッチしないものだけを抜き出せる。

Ruby の Enumerable#grep()

Ruby には Perl の grep によく似た機能があって、それが Enumerable#grep(). 構文こそ違うけど、働きはよく似ている。ただし、

Enumerable#grep( !/RE/ )

とは書けない。どうするのかなぁと思ったけど、こう書くしかないのかな?

Enumerable#select { |e| e !~ /RE/ }
Enumerable#find_all { |e| e !~ /RE/ }
Enumerable#reject { |e| e =~ /RE/ }

最近は find_all が有名っぽいので find_all で否定のマッチを書く場合が多いのかも。reject は意味は分かるけどまどろっこしい感じがする。

PHP の preg_grep()

PHP には PCRE を使って正規表現周りの機能を実現している preg_XXX() 関数群があって、この中に Perl の grep() のような preg_grep() がある。ただし、PHP には正規表現リテラルはないので

preg_grep( !/RE/, array() )

のようには書けない。どうするかというと、

preg_grep( '/RE/', array(), PREG_GREP_INVERT )

のように第3引数に PREG_GREP_INVERT という定数を与えてやる。

sed -ne '/RE/!p'

[2010-10-123 追記]

Twitter / eban: @finalfusion えー? sed -ne ' …

さらにツッコミがあったので。場外場外。

sed 使ってないので未確認で垂れ流しますよ。

[2010-10-11 追記]

Twitter でツッコミがあったので。

sed の説明はしません(笑)

改めて思うと !/RE/ の書き方は awk じゃなくて sed 由来かな? あるいはもしかして ed ? じゃないよな、たぶん。

  1. だけじゃないけど 

古い ports の freebsd-update が使えなくなってた

ちょっと放ったらかしてた自宅サーバをメンテしてやろうと思ったら freebsd-update がいきなり動かない。

!?

特攻の拓なみにこのマークが頭の中に出た。だって freebsd-update できないとバイナリで release 上げることもできない。昔の方法に逆戻り。面倒くさい。

と気づいたのはもうすでに何日も前の話で。やべーなコレ、どうにかしなきゃと思いとりあえず @kyubot に投げたのが昨日。ちょっとググってみた程度だとどうもそれっぽい情報に行き当たらない。

で、この日、困ったなぁとつぶやいたところ、これには反応が。

22:13:17 <liar_l> @wtnabe freebsd-updateのサーバーって変更があったんで
すか?

いやサーバに変更があったかどうかはよく知らないなぁ。てゆーか変更あるとしたらこのタイミングじゃないよな。と思いながら返事。

22:17:23 >wtnabe< @liar_l 標準で入る前の freebsd-update を使い続けて
release も上げてきてたんですよ。

これに対して

22:22:17 <liar_l> @wtnabe なるほど。
http://svn.freebsd.org/viewvc/base/head/etc/freebsd-update.conf?view=log
この辺から持ってくるのじゃ、ダメなんでしょうか。

いやそれがね。今 freebsd-update.conf が実は2つシステムに入ってて /etc/freebsd-update.conf は読まれてないのは確認済みなのよ。/usr/local/etc/freebsd-update.conf と書式が違うのも確認済みで、実は新しい conf が手に入りゃ問題が解決するわけでもないんだよなー。と心の中でつぶやいたところでハタと思いついた。

22:24:34 >wtnabe< @liar_l あ。ports のを消せばいいのかも。

そうです。これまで使っていた freebsd-update は 6.2-RELEASE で標準になったものではなく、5.x 時代に ports で入れたものなのです。/usr/local/etc/freebsd-update.conf が読まれていることからもそれは明らか。

だったら標準のやつだけにすりゃいいっつー話なのでは。ということで

cd /usr/ports/security/freebsd-update
sudo make deinstall
sudo freebsd-update fetch

キター。

22:26:59 >wtnabe< @liar_l キター

たったこれだけのことだったんだけど、一人だと結構簡単に行き詰まってしまう。悪いクセだ。

Puppet ダウンロードできる?

Puppet を試してみようと思うんだけど、どうも OSX はイマイチっぽい。でもまぁとりあえず Fink で入れた Ruby なら標準の Ruby とは動きが違うかもしれないよなーと思って落としてみようと思ったんだけど、なんかちゃんと落とせないよ? Puppet の tarball はともかく、Facter が落ちて来ないし、gem の方は両方ともダメだ。

んーなんだか急にやる気なくなったな。サイトの方も SSL の警告がやたら出てうっとぉしい。こういうのもったいないよなぁ、せっかくよさげなツールなのに。

画面の広さを取り戻せ

そういえば。ずっとずっとずっと。Emacs で無駄にメニューバーを表示させていたことを思い出した。ちゅーことで以下の設定。

; ツールバーを表示しない
(tool-bar-mode 0)
; メニューバーを表示しない
(menu-bar-mode -1)

ま、no window で使っているのでツールバーはもともとないんだけど。

例によって bookshelf.jp より。

15.3.7 メニューを消したい (2004/01/15) (Meadow/Emacs memo: 基本的な設定)

これで1行取り戻したぞ。上の黒い行(白バックなので)がなくなっただけで急に広く感じるのはなんでだろ。

これで

  • Terminal 全体で54行
  • screen の status で1行減
  • Emacs の mini-buffer と status で2行減
  • Emacs のウィンドウを上下に分割
  • 分割したウィンドウの status で1行減

おぉ。1ウィンドウ 80 * 25 の前時代的な環境のできあがり。やっぱこれくらいが落ち着く。

そして、このウィンドウで読める範囲でメソッドを書け > 誰ともなく

マイクロソフト、オープンソース開発サイトでWikiソフトを公開

from CNET Japan

Microsoft が

  • IIS 5
  • ASP.NET
  • C#

で Wiki エンジンを公開した。名前は FlexWiki それ以外の特徴は知りません。試してないので日本語が通るかどうかも分からない。興味はあるのでソースを見てみたが「わー C# だー」以上の印象がないのは単に昼飯食って眠いせいだろうか。

Google の技術を出版業界に

http://japan.linux.com/enterprise/03/09/17/0215214.shtml

ちと古いネタですが。

この話は面白いですね。楽をするために苦労するのをいとわない人たちにとってなかなか興味深い話だと思います。サーバで全部サムネイル作って Namazu みたいに簡単に検索できるような仕掛けがあったらいいなぁ。

(きっとすでにどこかにそれっぽいものはあるに違いない。)

再び TCO

Windows vs. Linux、ホントに安いのはどっち?@CNET

極めて個人的な感想を言わせてもらえば、Windows の方が初期教育コストは低いと思いますが、そのスキルは使い捨てですぐに使いものにならなくなる傾向があると思います。

逆に Unix 系は初期コストは高いが身につけたスキルは長い間使えます。10年前のソフトが最新のシステムでも問題なく動作する、10年前のノウハウが多少の修正はあるにせよ通用するという状況は、少なくとも現在の Windows ではちょっと難しいでしょう。でも Unix ではそれが可能です。(もちろん頭が古いままでもよい、と主張する気はないですが。)

「短いスパンで、所属する組織が払うコスト」を計算した場合は Windows の方が安いでしょう。でも業界全体でのコストは Unix の方が時間とともに小さくなっていくのではないでしょうか。Windows の場合はライセンス変更やサービスの変更など Microsoft の胸先三寸でコストは変わります。時間とともに小さく、、、ってのは Microsoft の存亡を否定してるので無理な話ですよね。

あと、本当に Linux 使える人の人件費は高いのですか? そんなのごく一部の会社のごく一部の時期の話じゃないの?(泣) それと、BSD 系も忘れないでいただきたい(怒)

(ここではあえて商用 UNIX のことは忘れています。)

TAB 式ナビ

って、前提としてすべて同じ UI じゃないとダメなわけですよね。UI が変わるならタブ式はやめて全部トップページに返す方式の方がよいと思う。

About

例によって個人のなんちゃらです