nDiki : grep

2011年4月27日 (水)

今日のさえずり: 風強いな。スカートはいてこないで良かった。

2011年04月27日

  • 09:14 風強いな。スカートはいてこないで良かった。
  • 09:26 駅からオフィスの間にベーカリーないかな。そろそろお昼にパン食べたい。ちょっと横道に入るぐらいの範囲にあると嬉しい。
  • 09:42 出社。
  • 10:09 そういえば、朝ドリンクマシーンでアイスコーヒーをチョイスしたら、カルピスみたいなのが出てきた。ミルク水だった(まだ机の上にある)。
  • 12:16 上のフロアに巨大な虎がいてビックリした。PostScript のアレみたいな顔の。
  • 12:43 初学食。
  • 12:46 イーゴカード気になる。
  • 14:46 cpanm 入れて perltidy をセットアップ。perltidy が無いと Perl プログラム書けない。
  • 14:52 1行も修正しないでチケットをクローズできる予感。
  • 15:52 ack も入れて (setq grep-find-command "~/local/perl/bin/ack --nocolor --nogroup ")
  • 16:56 Becky! また「データの整合性エラーが発生しました。」が出た。泣ける。Sylpheed にするか。
  • 17:10 やはり1行も修正せずにチケットクローズった。
  • 17:37 @yasa_gurek0 花粉まだ飛んでますね。止めてみたんですが、そうしたらムズムズが戻ってきました。
  • 18:21 @mahoyaya こちらは Becky! で連日でまくりです。最新バージョンなんですけどねぇ。
  • 18:34 退勤。この時間でも風強いままだな、今日は。
  • 18:57 @yasa_gurek0 やはり例年通りゴールデンウイーク明けまでは飛ぶんですかねぇ
  • 21:38 次の URL から Cacoo 登録すると作成できるシート数が +5 っていうのやってる。 https://cacoo.com/r/y8Zcb @cacooapp
  • 21:39メールきてたから、もうみんな紹介してるのかな。
  • 22:26 @nye_c ありがとうございます。16進数的にはまだまだ……(というありがちな言い訳)。
  • 22:46 「秋田の書店」ってあったのを見て「秋田書店?」と思ったけど、秋田書店の本社は東京都千代田区飯田橋
  • 22:46 秋田貞夫氏によって創立されたから秋田書店なのか。
[ 4月27日全て ]

2013年4月13日 (土)

今日のさえずり: 初代メリットシャンプーの容器欲しい。水鉄砲になるアレ。

  • 07:57 テスト発報じゃなかったの……。
  • 08:03 テレビつけたけども地震の話どこもやってないので何とも無かったのかな?
  • 08:40 安否登録(被害無し)返信完了。
  • 08:49 他の人の安否を確認できない。ユーザIDとパスワードって。
  • 08:55 やっぱり安否確認、mixi とか Twitter とか青いのとか普段使っているやつの方が少人数だったら把握しやすいよねぇ。複数サービス使ってれば多重化されてるし。
  • 09:51 久しぶりにジュエルペット観ようかとこっそり思ってたんだけれど、もうこんな時間。
  • 10:24 Amazon.co.jp の「プロフィールに写真アップロードする」の「掲載規約」に「個人を特定できる情報は一切掲載できません」とある。
  • 10:27 ポケモンセンタートウキョー行くのどうかなと思ったけど、基本物販なのかな。
  • 11:46 初代メリットシャンプーの容器欲しい。水鉄砲になるアレ。
  • 17:10 午後は工作してた。 http://t.co/UmrkfbH0GY
  • 17:43 地震後のチームメンバのアクティビティの確認、今全員分できた。
  • 23:32 チーム内では ack するが主流。 RT @yosh8: コマンドがなんであれ、「grepする」だよね。「ackする」「agする」じゃ意味通んないよね。
  • 24:32Google リーダー検索」「Google ウェブ履歴検索」「はてなブックマーク検索」「Evernote 検索」して、ようやく最後に Pocket に入れていたのを思い出して再読したかった記事に辿りつけた。一元管理しときたいなぁ。
  • 25:12 @yosh8 みんな「あっくする」って言ってますね。
  • 25:15 Aterm の新しいの待ってたんだけど、新機種が3月27日に発表されてもう発売されていた。でもこれハイエンドだしお高いなぁ。やっぱ AtermWR8750N で十分かな。
  • 25:34 PA-WR8750N-HP/E 注文した。
[ 4月13日全て ]

2013年7月23日 (火)

Perl で「いくつかの値のどれかと同じか判定」するにはやはりハッシュにして exists するのが速い

Perl で「ある値が、いくつかの値のどれかと同じか判定」するには、あらかじめ判定用のハッシュを作っておくのが定石だし、実際に速い。けど実際にどれぐらい速いのかな。

試してみる。手元の環境は Perl 5.14.2。どれかにマッチするのは 0.1% というケースでベンチマーク

 #!/usr/bin/perl

 use warnings;
 use strict;

 use Benchmark qw(cmpthese);
 use List::MoreUtils qw(any);

 foreach my $size (3, 10, 100) {
   my @a = (1 .. $size);
   my %h;
   $h{$_}++ foreach @a;

   cmpthese(
     -30,
     {
       "grep($size)" => sub {
         foreach my $i (1 .. $size * 1000) {
           my $exists = grep { $_ == $i } @a;
         }
       },
       "any($size)" => sub {
         foreach my $i (1 .. $size * 1000) {
           my $exists = any { $_ == $i } @a;
         }
       },
       "exists($size)" => sub {
         foreach my $i (1 .. $size * 1000) {
           my $exists = exists $h{$i};
         }
       },
       "make & exists($size)" => sub {
         foreach my $i (1 .. $size * 1000) {
           my %my_h;
           $my_h{$_}++ foreach @a;
           my $exists = exists $my_h{$i};
         }
       },
     }
   );
   print "\n";
 }

結果

                   Rate        any(3) make & exists(3)       grep(3)    exists(3)
 any(3)           107/s            --             -33%          -77%         -87%
 make & exists(3) 160/s           49%               --          -66%         -80%
 grep(3)          471/s          339%             194%            --         -43%
 exists(3)        820/s          665%             412%           74%           --

                    Rate      any(10) make & exists(10)     grep(10)  exists(10)
 any(10)           21.1/s           --               -8%         -67%        -91%
 make & exists(10) 23.0/s           9%                --         -65%        -90%
 grep(10)          64.9/s         208%              182%           --        -73%
 exists(10)         240/s        1036%              941%         269%          --

                     s/iter make & exists(100)   any(100)  grep(100) exists(100)
 make & exists(100)     3.48                 --       -50%       -65%        -99%
 any(100)               1.75                99%         --       -30%        -97%
 grep(100)              1.23               182%        42%         --        -96%
 exists(100)        4.49e-02              7643%      3797%      2641%          --

やはりハッシュを作っておいた方が速いね。ただし毎回その場で配列に入っているものからハッシュを作って判定処理するぐらいなら100個程度なら grep した方が速い。

配列の全件をほぼ毎回舐めることになる今回のケースでは any よりも grep の方が速い。

Happy Benchmarking!

[ 7月23日全て ]

2014年2月19日 (水)

今日のさえずり: 風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか

2014年02月19日

  • 08:41 “ベル研究所が開発するOS「Plan 9」が新たにGPLv2で公開される | SourceForge.JP Magazine” http://bit.ly/1jPdzy3
  • 09:24 iddy 終了。リンクとか外さないと。 / “【重要なお知らせ】iddyサービス終了のお知らせ | iddy 開発者ブログ” http://bit.ly/1feX5Mf
  • 09:24 7,000円台ぐらいまでで出たら即買ってもいいな。iPad 2 での FaceTime のかわりになる。もし国内で出る事があればもっと高くなるんだろうなぁ。 / “数千円で買えて携帯会社と契約不要の「Skypeスマートフォン...” http://bit.ly/1feX7Uk
  • 09:24 「運営者が飽きた」 / “iddy 終了について補足 | WWW WATCH” http://bit.ly/1m7oLnX
  • 10:35 歌うキーボード ポケット・ミク (大人の科学マガジン特別編集)とな。 http://amzn.to/1bjmkNH
  • 21:25 今作っている機能、テーブル1つで済ませるつもりだったけれど、ゴチャゴチャしてきたのでやっぱり明日分ける。
  • 22:53 “大雨・大用に日本野鳥の会バードウォッチング長靴” http://bit.ly/1cpOp4s
  • 24:29 さてこの Subversion で管理しているコードを Git 管理にするかなととりあえず svn log したら「作業コピーではありません」と出て、あれっと思ってみたら CVS/ というディレクトリが。
  • 24:33 そしてなんでこれ /var/www 以下できちんと動いているのに手動で動かすとモジュール見つからないのって思って風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか。
  • 25:03 “文字列検索コマンド「grep 2.17」リリース | SourceForge.JP Magazine” http://bit.ly/1gVu5sN
  • 25:03 “CSRF対策用トークンの値にセッションIDそのものを使ってもいい時代なんて、そもそも無かった” http://bit.ly/1kXbPTN
[ 2月19日全て ]

2014年3月17日 (月)

howm + Markdown + Plack

Emacshowm 上で書いたノートなどをさくっと共有したい時に、わざわざ Wiki 上や IRC 上や Google ドライブ上に転記したり更新したりするのが面倒なので、そのまま見られるようにしたいなと。

この間 howm で書く時のフォーマットを Markdown にしたので、howm-directory をそのまま Plack::App::Directory::Markdown で見られるように設定してみた。

howmMarkdown を使う設定

完全じゃないけれど今のところこんな感じ。

 (setq howm-file-name-format "%Y/%m/%Y-%m-%d-%H%M%S.md")

 (setq howm-view-title-header "#")
 (setq howm-view-title-regexp (format "^\\(%s|=\\)\\( +\\(.*\\)\\|\\)$"
                                     (regexp-quote howm-view-title-header)))
 (setq howm-view-title-regexp-pos 3)
 (setq howm-view-title-regexp-grep (format "^(%s|=) +"
                                      (regexp-quote howm-view-title-header)))

非公開用 howm-directory と公開用 howm-directory は

の通り下記のように設定。

 (defun my-howm-set-directory (dir &optional keyfile)
   `(lambda ()
      (interactive)
      ;; kill current keyword buffer first to avoid the error
      ;; "howm-get-buffer-for-file: Buffer name ` *howm-keys:*' is in use"
      (kill-buffer (howm-keyword-buffer))
      (setq howm-directory ,dir)
      (when ,keyfile
        (setq howm-keyword-file ,keyfile))
      (setq howm-menu-next-expiry-time (current-time))
      (message "%s" ,dir)))

 (defun my-howm-switch-directory (dir &optional keyfile)
   (funcall (my-howm-set-directory dir keyfile))
   (howm-menu))

 (global-set-key "\C-c,1" (my-howm-set-directory "~/var/howm/" "~/.howm1-keys"))
 (global-set-key "\C-c,2" (my-howm-set-directory "~/srv/howm/" "~/.howm2-keys"))

Plack::App::Directory::Markdown

cpanm でインストール。簡単に起動するなら付属の pad-markdown.pl で。

 #!/bin/sh
 PAD_MARKDOWN=$HOME/local/perl5/perlbrew/perls/perl-5.18.2/bin/pad-markdown.pl
 ROOT=$HOME/srv/howm
 PORT=9119

 $PAD_MARKDOWN --root=$ROOT --encoding=utf8 --title='howm' --port=$PORT &

これで後は C-c,2 C-c,c で howm ノートを作って保存すれば http://HOST_NAME:9119/2014/03/2014-03-17-231015.md ですぐ見られるようになる。あるいは ~/srv/howm/ 以下に適当に .md ファイルを作ってもよい。適当に楽ちん。

欲を言うと検索できるようにしたりページ間リンクを簡単に張れるようにしたりとかしたいなあと思うのだけれど、そのまま進むと(フォーマットこそ違えど)この nDikiDiKicker と同じ機能になってくるので、今はそこまでしなくてもいいかな。その時に他人にシェアしたいのはピンポイントで1ページだけがほとんどだし、自分自身は howm 上で検索できるし。

こう考えてみると「Emacsプレーンテキスト」で「書いて保存すれば(あるいはそしてリモートに同期すれば) 明示的な変換作業しないで勝手に公開」されて、書く場所は「年月別ディレクトリ」とか「デイリーなノートとは別のページが作れる」とか「検索grep レベルできる」とか、まあ結局自分が欲しいものは昔から変わらないなあ。

[ 3月17日全て ]

2014年3月23日 (日)

Day One日記を書いてmixi日記に投稿する

ここ最近プライベート日記はスマートフォンアプリを使っていて、今は Day One を使っている。一方公開日記Web 日記としてこの nDiki をつけている。前者は完全非公開、後者は全体公開。

たまに特定グループ向けに公開したいなと思ったりするのだけれど、身近に使えるのはやはり自分の場合mixi日記かな。ただ日記メディアとして便利なんだけれど、自分はローカルホスト上で grep できるように手元にも記事ファイルを置いておきたい(Emacs + howm検索したい)。

ということでグループ公開したい日記Day One で書いて、mixi日記に上げるようにしてみようかなと。これならスマートフォンでも草稿かけるしアプリ上でプライベート日記と同じタイムラインに並べて見られるし、 DropboxXML エントリファイルが作られるので Linux 上で grep がかけられるし。

で一度手順を流してみた。iOS デバイス上で完結させるとどれぐらいの手順になるかどうか、 Publish 公開も含めてやったのが以下。

日時を統一したり permalink を取得して書き込み直したりしているので手順がちょっと多いけれど、実際にはグループ公開の場合は Publish しないのでもっと少ない手順になる(写真を載せると逆にもうちょっと手間がかかる)。あと PC 使っている普段の状況なら Emacs + Google Chrome でさっとやってしまうのでもっと楽。やれば自動化もできるとは思うけれどもそこまではいっかな。

[ 3月23日全て ]

2014年3月25日 (火)

EmacsOrg Capture でぼっちつぶやき

あとで整理してまとめたりできるように、ふと思ったことを非公開で1人 Twitter タイムライン的にログっておくのに PC 上でなかなかいいのないんだよねとずっと思っていたんだけれど Emacs の Org mode にある Org Capture 試してみたらいい感じだった。

普段 Org mode 使っていないので Org Capture で必要なところだけ設定してみた。

 (require 'org)

 (setq org-capture-templates
       '(
         ("t" "Timeline (local)"
          plain
          (file (concat "~/var/timeline/timeline-" (format-time-string "%Y-%m-%d") ".md"))
          "- [%(format-time-string \"%Y-%m-%d %H:%M:%S\")] %?\n")
         ("n" "Note (local)"
          plain
          (file (concat "~/var/note/" (format-time-string "%Y-%m-%d-%H%M%S") ".md"))
          "# %?\n[%(format-time-string \"%Y-%m-%d %H:%M:%S\")]\n")
         ("T" "Timeline"
          plain
          (file (concat "/naney@example.com:/home/naney/var/timeline/timeline-" (format-time-string "%Y-%m-%d") ".md"))
         "- [%(format-time-string \"%Y-%m-%d %H:%M:%S\")] %?\n")
        ("N" "Note"
         plain
         (file (concat "/naney@example.com:/home/naney/var/note/" (format-time-string "%Y-%m-%d-%H%M%S") ".md"))
         "# %?\n[%(format-time-string \"%Y-%m-%d %H:%M:%S\")]\n")))

 (global-set-key (kbd "\C-cc") 'org-capture)

'C-c c t' すると

 - [2014-03-25 23:24:25]

が書かれたバッファが開くので適当に何か書いて C-c C-c する。と、~/var/timeline-2014-03-25.md にその内容が追記される。

TRAMP でリモートホスト上のファイルを開く時のファイル名を指定してみたらうまくいったので、さくっとリモートファイルにも追記できてすごく嬉しい。ので 'C-c c T' で書き込めるように設定してみた。これで Dropboxrsync / Unison などで同期する必要がなくていろいろ良い。

あとは追記型ではなくて都度新しくノートファイルを起こすタイプの設定も追加しておいた('C-c c n' と 'C-c c N' で呼び出し)。howm で 'C-c , c' するのと同じ感覚で作れる。こちらもリモートホスト上にファイル名で悩む必要なくさくっとノートを書いておくことができて良い(そのかわり howm みたいに grep できないけれど)。

2014年3月27日追記

リモートホスト上のファイルへの保存の方を良く使うので、'C-c c' の後のキーは小文字の方をリモートに、大文字の方をローカルに変更。

[ 3月25日全て ]

2014年5月14日 (水)

EmacsTRAMP でリモートホストでプロセス走らせられた

EmacsTRAMP で直接リモートホスト上のファイルを開いて編集できるの便利なんだけれど grep できたりするとさらに便利なのになーと思ったら、いつのまにかできるようになっていた。

/ssh:username@example.com:/home/username/ とかで Dired 開いているところで M-x grep-find とか M-x shell-command とかでコマンドを実行すると、きちんとリモートホスト側で実行して結果をバッファに出してくれる。

良い。

追記

MagitTRAMP 経由で動くと教えていただいた。素晴しい。

今日のさえずり: フェイタス5.0 ってフェイタス 2000 ってことか?

  • 07:21 7月の保養施設落選!
  • 10:41 神田明神のIT情報安全守護の実物初めて見た。……ちょっぴりチープ。本当に基板ぽいバージョン出ないかなー。
  • 10:51 あ、 EmacsTRAMP って今は grep-find や shell-command なんかもリモートホストで動かせるんだ。
  • 21:05 フェイタス5.0 ってフェイタス 2000 ってことか?
[ 5月14日全て ]

2014年7月30日 (水)

Text::Markdown::Discount でテーブルや ``` や自動リンクなどの拡張を使う

最近ノートやちょっとしたドキュメントは Markdown で書いて、Plack::App::Directory::Markdown (記事) (に手を入れて grep 検索や recent リストを表示できるようにした) Markdown ビューアで参照したり、関係者に見せたりしている。

重宝しているんだけれど、内部で使っている Text::Markdown Perl モジュールは、テーブルや GitHub Flavored Markdown にある fenced code blocks (``` で挟むやつ) が使えないのでちょっと不便になってきた。

Text::Markdown::Discount Perl モジュールはこの辺の拡張が使えるので、こちらに切り替えることにした。

このモジュールは discount というC言語書かれた Marrkdown 処理コードを使うもので、Text-Markdown-Discount 内に同梱されている。

そのままインストールすると fenced code blocks が有効になっていないので以下のようにしてインストールする。

 $ tar zxvf Text-Markdown-Discount-0.11.tar.gz
 $ cd Text-Markdown-Discount-0.11

 ここで Makefile.PL 中の

   qq{( cd $extdir; CC='cc -fPIC' sh configure.sh; make )\n}

 を

   qq{( cd $extdir; CC='cc -fPIC' sh configure.sh --with-fenced-code; make )\n}

 に変更する。

 $ cpanm .

で Text::Markdown::markdown() のかわりに Text::Markdown::Discount::markdown() を使うようにすれば OK。

なお自動リンクをしたい時には

 my $html = Text::Markdown::Discount::markdown($markdown_text,
   Text::Markdown::Discount::MKD_AUTOLINK);

のようにオプションを指定してあげる。

[ 7月30日全て ]

2015年4月23日 (木)

OS Xhowm を使うのに GNU grep を入れた

この間 HomebrewOS X にインストールした Emacshowmノート一覧が出ないなと思って困っていたんだけれど、どうやら OS X に入っている grep を使っていると駄目らしい。

 brew install homebrew/dupes/grep

した後 Emacs 側で

 (setq howm-view-grep-command "/usr/local/bin/ggrep")

したら普通に動くようになった。

[ 4月23日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Process Time: 0.024377s / load averages: 0.06, 0.21, 0.22