はてなキーワード: grepとは
【お知らせ】2011/09/07
http://d.hatena.ne.jp/uniqueweb/20110906/1315285545
プログラムは全く得意じゃないけれど最近よく見かけるようになったエロ動画検索を自分でも作ってみたくて頑張ってみました。
近年、インターネットの普及によりエロ動画が自宅で簡単に見れるという素晴らしい時代になりました。
自分が若い頃はインターネットなんてものはなくエロビデオが主流でドキドキしながらレンタルビデオ屋に行き、可愛い女の子がレジにいない隙を見計らってお兄さんにパッケージを伏せて空箱を渡しビデオを借りたものでした。
お兄さんにビデオの空箱を渡そうとした時に可愛い子がレジに戻ってきて焦って渡すのをやめてものすごく変な動きをしながらエロビコーナーに引き返していくなんてことも多々ありましたw
僕のお気に入りといえば「白石ひとみ」や「あいだもも」といった女優でよく借りてました。エロビを借りるということがものすごく恥ずかしい時代?年頃?でカモフラージュに普通のビデオと一緒に借りるということもしていました。それはそれは大変な思いでオナニーしてたんです!
しかも、ビデオデッキ自体が貴重な時代でリビングに一台しかないのが当たり前でした。
深夜家族が寝静まってからヘッドフォンとビデオを抱えリビングに行き暗がりの中でヘッドフォンをテレビに差し込んでビデオの再生ボタンを期待に胸をふくらませながら押したものです。いいシーンを何回も見るためにビデオを巻き戻すんですが、ビデオを巻き戻すガチャンガチャンという機械音で家族が起きてこないか?とかそれはそれはドキドキしながら見てました。一仕事終えたあとヘッドフォンを外したらジャックが外れていて大音量で喘ぎ声が響き渡っていたなんてこともありました。誰も起きてこなかったのは優しさなんでしょうか?w
さて、大分前置きが長くなりましたがエロというものはものすごい技術発展させるものだと思います。エロのおかげで日本でビデオは普及しエロのおかげで日本でインターネットはものすごく普及したと言っていいと思います。自分もエロを通して技術の発展に貢献し自分自身のスキルアップになれば。という高い志を持ってこのサイトを制作しました。決して自らのオナニーライフの充実と性癖を充たすため作ったわけではありません・・・w
※2011.08.07 利用中のサーバーに障害が発生しているようで現在サーバーに接続できない状態となっています・・・
サイト名の由来は抜きネタからきています。抜きネーター、ヌキネーターという感じですw
エロサイトの制作工程を日記にしてみたんで良かったら読んで下さい。そしてこのサイトを使って夜いろいろと励んでくれたら嬉しいです。
まず前提条件としてお金をほとんどかけたくない。アダルトサイトであるということから
月の予算は5000円以内で考えていたのでけっこう探すのが大変でした。
日本でアダルトサイトを許可している所はかなり限られていてさらにやりたいことができるのは
専用サーバーかVPSしかないのでそうなると専用サーバーは予算オーバーなので
VPSで探すことになり検索しまくってはじめに見つけたVPSはKAGOYAのVPSだったのですがβ版で募集を締め切っていて泣く泣く諦めました。
KAGOYAはかなり評判がいいみたいなので使ってみたかった。
次に見つけたのが○○○VPS。海外サーバーで日本語サポートがあり転送量の制限なしディスク容量100G
月1300円程度で借りれるということで初期設定費用に5000円程度かかりましたが借りてみました。
結果、ここは最悪でした。
あまりの酷さに1ヶ月で解約。
よく調べてみたら評判がものすごく悪い某VPSの再販らしいです。
もう失敗したくないと思い今度は比較的有名な海外サーバーLINODE。
iptablesの設定でどうしてもうまくいかなくて拙い英語でメールしてみたら
10分しないうちに返信がきました!
メールに書かれているとおりにコマンドを入力したらあっさり解決。
担当のブライアンはなぜか分からないけどとてもフレンドリーで親切に感じましたw
LINODEは複数のディストリビューションから好きなものを選択できるので
とりあえず、64bit版を選択。
一番面倒だけど重要だということで
Tripwire
ほんとに面倒でした。
はじめはmysqlにストレージエンジンgroongaを使おうと思ったのですが
初めに借りた最悪なVPSはOSが32bit版だったのでgroongaがのソースが見つからずなぜかと思っていたら
どこかで見つけた記事で32bit版ではgroongaの性能を発揮しきれないということで32bit版の提供をやめてしまったらしいと書いてたので
じゃあ、sennaにするかということで最悪VPSでsennaをインストール。
その後LINODEに変更したのでOSに64bit版を選択し念願のgroongaをインストール。
しかし、調べてみると
プログラムもそれに合わせてその都度書き換えたので2度手間どころか3度手間4度手間でした・・・
まず
そして下記の順番でインストール
rpm -ivh mecab-0.98-tritonn.1.0.12a.x86_64.rpm
rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
rpm -ivh senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
rpm -ivh MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ivh MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ivh MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ivh MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm
my.cnfの設定をして終了
で肝心の全文検索ですがデータ件数が5万件程度で少ないせいなのか、あいまい検索と比べてそれほど速さを実感できなかったです・・・
でもきっとすごく速くなったはず!
ちなみに「麻美ゆま おっぱい」で検索した場合、0.01 secで結果が返ってきました。
さて、動画データの作成ですがいくつかのエロサイト等制作記事でもあるようにスクレイピングということをします。
スクレイピングとはWEBサイトから特定の情報だけを取得することでネット上にあるサイトをクロールして必要なデータだけを拾ってデータを作るといった感じでしょうか。
スクレイピングのプログラム自体は以前にTidy関数を使って為替データを10分おきに取得するような物を作ったことがあったのでそれほど時間はかからないかなと思ったのですがけっこう時間かかりました。
スクレイピングにはTidyとhtmlSQL、それにPHP Simple HTML DOM Parserを使いました。
SQL みたいな文法で HTML を抽出する PHP のライブラリ
htmlSQLよりアツい!?jQueryみたいにセレクタでHTMLをparse(解析)する「PHP Simple HTML DOM Parser」
3つの中で抜群に使えるのはPHP Simple HTML DOM Parserだったんですが
ループ処理させるとメモリがすごいことになって今回のようなスクレイピングに向いてないみたいで
結局、htmlSQLとTidyの両方を使ってスクレイピングしました。
両方ともPHP Simple HTML DOM Parserに比べるとうまくデータの取得ができないことが多く残念な感じなんですが他に選択肢がないので・・・
使える順に並べると
といった感じかもしれません。
おおまかにデータを取得して正規表現で特定データを抜き出しました。
http://affiliate.dmm.com/link.html
利用可能な物はパッケージ画像、サンプル画像(縮小)と書かれていたのでそれに従い画像を利用。
注記に※ユーザーレビューは引用いただけません。とだけ書かれているのでそれ以外は引用ありと判断して説明文とタイトルなどを利用
女優データとジャンルデータ、DVDデータ、を紐付けたデータベースを作成し検索ワードに応じて検索結果に関連する商品を表示させるようにしました。
現状、売り上げ0で意味があるのか分かりませんけどw
エロサイトということで多少はチューニングとか設定とかしないとまずいかもと思い色々調べて設定しました。
やったこと
KeepAlive On MaxKeepAliveRequests 60 KeepAliveTimeout 3 <IfModule prefork.c> StartServers 7 MinSpareServers 5 MaxSpareServers 10 ServerLimit 30 MaxClients 30 MaxRequestsPerChild 4000 </IfModule>
様子見ということで2日間で設定してみました。
query_cache_limit=1M
query_cache_min_res_unit=4k
query_cache_size=16M
query_cache_type=1
とりあえずこんなところを設定してみましたが、爆発的なアクセスがあるわけでもないので有効なのか今のところ分かりません(-_-;)
Apache Benchでテストはしてみましたけど問題はない感じですが実際にチューニングができているか分かりません。
プログラマーとして有名なゆうすけさんのサイトとgoogleを参考にしました。
シンプルで使いやすいようにしようと思いこのデザインにしました。
クロスブラウザはIE7、firefox3、chromeで行いました。
可変ものって作ったことなかったんですがけっこう面倒なんですね。
ブックマーク機能とメニューの折りたたみ機能、検索結果の表示方法切替を作りました。
まず、ブックマーク機能ですがログインなしで気に入った動画をブックマークできるようにしました。
ブックマークに追加した動画はブックマークページで確認できるようにしました。
cookie機能を利用したらいけると思い色々調べてjquery.cookie.jsを利用。
保存したクッキー情報を呼び出してphpに渡して処理し指定要素にブックマーク一覧をloadメソッドで表示させるという感じです。
$(function(){ $("#youso").load("xxx.php"); });
メニューの折りたたみ機能は人気AV女優やAV女優別、人気タグなどをそのまま表示させるとずらっと長くなって邪魔だったのでつけました。
これには同じくjquery.cookie.jsを利用しました。
参考サイト:http://blog.caraldo.net/2009/03/newjqqookiemenu.php
検索結果の表示方法切替にはZoomer Galleryを利用しました。
参考URL:http://phpjavascriptroom.com/?t=ajax&p=jquery_plugin_zoom#a_zoomergallery
検索結果ページで表示される
[ここの画像]
××× の検索結果
44件中 1~10件目を表示
ここの画像の部分をクリックするとgoogleイメージ検索みたいに一覧でイメージ表示できるようにしてみました。
基本的に動画の埋め込みを許可しているサイトのみプレイヤー表示をしそれ以外は画像を表示し動画データへリンクするようにしました。
埋め込み部分はあらかじめそれぞれのサイトに対応したプレーヤー部分のコードを記述しVIDEOIDの部分に置き換えるような形にしました。
XVIDEOSを例にすると
XVIDEOSの場合かならず動画のurlがhttp://www.xvideos.com/videoXXXXXX/のようになりますのでXXXXXXの部分を
VIDEOID部分に置き換えるようにプログラムを組みました、
埋め込み部のソース
>||<object width="510" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" ><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="allowScriptAccess" value="always" /><param name="movie" value="http://static.xvideos.com/swf/flv_player_site_v4.swf" /><param name="allowFullScreen" value="true" /><param name="flashvars" value="id_video=VIDEOID" /><embed src="http://static.xvideos.com/swf/flv_player_site_v4.swf" allowscriptaccess="always" width="510" height="400" menu="false" quality="high" bgcolor="#000000" allowfullscreen="true" flashvars="id_video=VIDEOID" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>
||<
その他の動画サイトもURLの一部分のデータを使っているので同様の処理をしました。
実際の作業は2、3週間ですが色々調べる時間が多くて制作に2ヶ月くらいかかりました。
自分でエロ動画検索を作ってみて有名プログラマーさん達がいかに優秀なのか思い知らされました。
全くWEBの知識がない人で4、5ヶ月ですごいの作っちゃう人とかもいるみたいですし世の中広いな~と思います。
大分、色んな知識を得ることができました。
これからプラグラムを勉強しようと思う人はぜひエロサイトから入ってみて下さい。
そんなこんなで?頑張って作ってみたエロ動画検索、良かったら使ってみて下さい。
これで少しは技術の発展に役立てたでしょうか?w
P.S エロサイトを作っていてはじめは楽しくて興奮しながら作ってたのですが最後の方はエロい物を見ても全く反応しなくなりましたw
不能ではないんですけど・・・今現在も性欲が著しく減退しております・・・
そしてスーパーpre記法がうまういかないのはなぜ?はてな匿名ダイアリー初投稿で全然分からない・・・
そしてそしてプログラマーさんとかデザイナーさんとかエロい人とかお気軽にお声をおかけ下さい。
【お知らせ】2011/09/07
まぁ、タイトルの「レガシープログラマ」とは私の事なんですけどね。
if( foo == TRUE ){
という判定文をよく見かける(fooはいろんなオブジェクトだと思ってほしい)。
個人的には、この書き方、嫌いなんだよね。
if( foo ){
か
if( foo != FALSE ){
と書いて欲しいわけよ。とにかく「TRUEか?」という判定にはして欲しくないわけです。
で、なんでこう書くの?と外注や若い連中に聞いたら、「TUREは1ですから」と必ず答える(断言する)。
あ、あれ???自分は「TRUEはFALSEでは無い。確定しているのはFALSE=0という事だけ」だとずっと思っていたんですわ。
古いC言語風に書けばこんな感じ。
#define FALSE 0 #define TRUE (!FALSE)
確かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。
新しいC++や規格ではBOOL型というのがきちんと定義されたと思うけど、製品寿命が20年とかいう私の職場では、DOSやC(K&R)、アセンブラは現役だし、プラットフォームもなにもWindowsに限らない。組み込みマイコンも使う(うちのところはVxWOKSだが)し、UNIXやLINUXも使う。
もちろん、マネージドC++(.netFramework)やC#、JAVA、Parlも私は使うし。でも、どのプラットフォームでどの言語になっても「TRUEか?」という判定文は使ってこなかった。
で、試しに、VC2008のincludeフォルダをgrepしてみたら、
#define TRUE 1
あ、ほんとに「1」だ。
typedef bool int
なんて見かけるから、やろうと思えば「5」でも何でも数字が入ってしまうわけですよ。そこで「== TRUE」なんてやられたら、絶対に成立しないわけで。バグの温床になるんじゃないかなー、と思ってかたくなに前述の姿勢を持っていたわけです。
今(最近の)言語はきちんと「BOOL」型(またはboolという名のクラス)を定義されていて、コンパイルエラーになるか、自動的に補正してもらえるのかもしれないけど、ちょっと気持ち悪い。
最近、ちょくちょく外注や若い連中と意見や話が合わず、「ああ、俺ってレガシープログラマなんだな」と思う事が多くなった今日この頃。ネットワークに平気でリトルエンディアンのデータを流すとか、勘弁して欲しい。LANアナライザでデータが見にくくてしょうが無い。
5年以上ぐらい前にPerlのレガシーコードで書かれたcgiって駄目なプログラムのお手本だな。
1ファイル何千行もあるcgiで、一生懸命条件分岐や関数呼び出ししながらprintしてHTML作っていくやつ。
後から他人がレイアウト変更とか不可能に近い。
同じような処理(例えば掲示板だと新規書き込み、書き込み確認、書き込み修正など)があちこちに分散してて、全部探し出さないと変更できないとか。
俺が今作ってるWebアプリではSmartyなどのテンプレ使ってロジックとデザインの分離が当たり前なのに(ちなみにSmartyは分離がイマイチ、最近は他のを使ってる)、この時代にはそんな考え毛頭なかったんだね。
拡張子もcgiだったりplだったり。*.cgiでgrepしても出てこない処理のせいで半日つぶした。
それは、使ったほうが分かりやすい例ではあるけど、わかんない人も多いかと思うよ。
それよりも、関数を引数にするアルゴリズム関連は 正直 やめてほしい。
長めの関数の中盤ぐらいに書いてあって、その中の値がおかしいのか、デバッグするときに、関数本体がどこにあるのか、
わざわざgrepしなきゃいけないとか、時間がもったいない。IDEでジャンプでもいいけど、IDEサポートあってもめんどうだ。無いことだってあるんだよ。
その関数が随所で使いまわされているなら、まだわかるけどね。
かいている人間は、それでいいのかも知れないけど引き継いでデバッグする方の事も考えて書いて欲しい。
巨大なシステムやってると、書く方は量が少ないが、デバッグする方は、システム全部デバッグしてるんだぞと。
そうならないように、モジュール化してくれるのが一番だが、どんなにモジュール化してあっても、どこで起きてるかわからないから、全部見なきゃいけないバグなんて余裕で起きるんだよ。orz
100時間ぐらい、高負荷テストしてると落ちるとかね。当て推量はするけどさ、たのむ、みんな、分かりやすく他人がデバッグしやすく書こうぜ!
元ネタ http://phpspot.org/blog/archives/2009/12/phpjavascriptph_1.html
面白そうだと思ったので僕もやってみた。モジュールはPerl5.8系の標準モジュールのみ利用可という制限。
全部はキツイので関数処理関係の関数(http://php.benscom.com/manual/ja/ref.funchand.php)だけ実装してみた。
use strict; use warnings; =head2 call_user_func $ret = call_user_func($function,@param); $ret = call_user_func([$class,$method],@param); example1 sub plus { $_[0] + $_[1] } print call_user_func('plus',10,20); # 30 example2 package Foo; sub plus { $_[1] + $_[2] } package main; print call_user_func(['Foo','plus'],10,20); # 30 =cut sub call_user_func { my $proto = shift; if ( ref $proto eq 'ARRAY' ) { return $$proto[0]->${\$$proto[1]}(@_); } else { require Pod::Functions; if ( $Pod::Functions::Flavor{$proto} ) { return eval qq{$proto(\@_)}; } else { no strict 'refs'; return $proto->(@_); } } } =head2 call_user_func_array $ret = call_user_func_array($function,\@param); $ret = call_user_func_array([$class,$method],\@param); example sub plus { $_[0] + $_[1] } print call_user_func_array('plus',[10,20]); # 30 =cut sub call_user_func_array { return call_user_func(shift,@{+shift}); } =head2 create_function $code = create_function($args_str,$code_str); example $code = create_function('$c,$d=1','print $c+$d'); $code->(10); # 11 =cut sub create_function { my $args = shift; my $code = shift; my $default = 0; my @args = split /,/,$args; my $code_str = 'sub {'; for my $arg (@args) { if ( $arg =~ /^\s*(\$[a-zA-Z][\w]*)\s*(?:=\s*(.+))?\s*$/ ) { my $val = $1; my $def = $2; if ( defined $def ) { $default = 1; $code_str .= qq{my $val = \@_ ? shift : $def;\n}; } else { die 'parse error' if $default; $code_str .= qq{my $val = shift;\n}; } } } $code_str .= $code . '}'; my $sub = eval $code_str; die $@ if $@; return $sub; } =head2 forward_static_call $ret = forward_static_call($function,@param); $ret = forward_static_call([$class,$method],@param); =cut sub forward_static_call { call_user_func(@_); } =head2 forward_static_call_array $ret = forward_static_call_array($function,\@param); $ret = forward_static_call_array([$class,$method],\@param); =cut sub forward_static_call_array { call_user_func_array(@_); } =head2 func_get_arg $arg = func_get_arg($no) example sub foo { print func_get_arg(1) } foo(100,200); # 200 =cut sub func_get_arg { my $n = shift; package DB; @DB::args = (); () = caller(1); return defined $DB::args[$n] ? $DB::args[$n] : undef; } =head2 func_get_args @args = func_get_args() example sub foo { print join ':', func_get_args() } foo(11,22,33); # 11:22:33 =cut sub func_get_args { my $n = shift; package DB; @DB::args = (); () = caller(1); return @DB::args; } =head2 func_num_args $arg_count = func_num_args() example sub foo { print func_num_args() } foo(11,22,33); # 3 =cut sub func_num_args { my $n = shift; package DB; @DB::args = (); () = caller(1); return scalar @DB::args; } =head2 function_exists $bool = function_exists($func) example sub foo {} print function_exists('foo'); # 1 print function_exists('bar'); # 0 print function_exists('rand'); # 1 =cut sub function_exists { my $func = shift; return 1 if exists &$func; require Pod::Functions; return $Pod::Functions::Flavor{$func} ? 1 : 0; } =head2 get_defined_functions $funcs = get_defined_functions() =cut sub get_defined_functions { require Pod::Functions; return { internal => [ keys %Pod::Functions::Flavor ], user => [ grep { exists &$_ } keys %:: ], }; } =head2 register_shutdown_function register_shutdown_function($func,@param); register_shutdown_function([$class,$method],@param); =cut { my $REGISTER_SHUTDOWN_FUNCTION = []; sub register_shutdown_function { my $proto = shift; push @$REGISTER_SHUTDOWN_FUNCTION, [ do { if ( ref $proto eq 'ARRAY' ) { $$proto[0]->can($$proto[1]); } else { require Pod::Functions; if ( $Pod::Functions::Flavor{$proto} ) { sub { eval qq{$proto(\@_)} }; } else { no strict 'refs'; \&$proto; } } }, [@_] ] } END { $_->[0]->(@{$_->[1]}) for @$REGISTER_SHUTDOWN_FUNCTION; } }
思ったよりも難しかった。標準関数一覧を取る手段がなかったので標準モジュールを利用して標準関数の一覧を取得した。
あと文字列から標準関数を呼び出すスマートな手段が思いつかなかったのでeval便りに。
create_functionはかなりゴリ押し。myを勝手に付けたりデフォルト引数にも対応してたり細かい芸が光る(自分で言うな)
forward_static_callはぶっちゃけPerl的にcall_user_funcと殆ど処理が変わらないのでそのまま利用。
func_get_arg系は結構クリティカルだなー。@DB::argsをリアルに使ったの初めてだよ。
register_shutdown_functionはちょっとねー。ENDブロックを利用してるわけなんだけど当然mod_perlとかではうまく動かない。あとシグナルとか使った方が良いのかもしれない。
ヒマがあったら他の関数とかも実装してみたいかも。
http://anond.hatelabo.jp/20090914132607 の増田です。
こんな話きいても面白いと思ってくれる人いるわけねーだろ、みたいなテーマで調べものをしてます(本業はというと不景気で自席待機中、次の派遣先は決まらないかもしれない)。自分が首になって家内ともども路頭に迷うかもしれないのに、不思議と危機感がなくて。
CiNii のサイトにいくと、とある学会誌の創刊号から何年かが全部無料公開されてて、創刊号にはなんと当時の科学技術庁長官、中曽根康弘氏が祝辞を寄せてるわけです(さてどこの雑誌でしょう)。とある単語をさがしてその検索のきかない pdf を延々延々「目 grep」してます。で、二段組みなので狭い画面で見ると
と2passかかる。疲れ目がひどくてブルーベリーのサプリがありがたい。
あと JIS の規格票とかも検索するのですがこの検索がまた動きが微妙なんだ。
資料の探索範囲はストーリーが見えてくるに従って広がっているのですが、なんか自分の知識には主に理論面であちこち欠落があって、定番的教科書に何が書いてあるのか知らないままやっているもので、あちこち致命的ではないもののぼろが見えてきて、それを全部繕ってるといつまでも終わりそうになくて、しょうがないから切り捨てたりごまかしたりして、まあ本に書いてないような新事実もちょっとだけ確認はしたものの。
結局やってることはといえば、安楽椅子、もしくはマトリックス内歴史家で、pdf になってないものにはほとんど手が届いてない。
要するに、キーパーソンにアポとるのが怖いんです。勉強不足を pgr れて瞬殺されるのが怖いんです。自分が持って行った新事実を喜ぶどころか不機嫌な顔で、おまえうざい、って言われてすべてが終わりになる恐怖がいつまでも去りません。円満退社したとはいえ古巣の元上司に「いまは職を転々としながらこんな金にならないことにまで手を出してます」と自己紹介するのもこわいし、要するにすべてが怖いです。
私ごときが全てを知ろうなんておこがましいんですが、何の権利があって、自分の先生でもない人に質問をするのか、その根拠が見えません。
まあ恥を晒し大失敗するしかないんだろうけど。
% diff host.old host.txt | grep '[<>]' | sort > 16x16.hatelabo.jp > b.st-hatena.com > copie.hatelabo.jp > maintenance.hatena.ne.jp > uicon.st-hatena.com
それと、はてラボ新サービス、漏れていた maintenance も加え調べる。
% diff resolve.old resolve.txt | grep '[<>]' | sort > 59.106.108.101: maintenance.hatena.ne.jp. > 59.106.108.72: b.st-hatena.com. > 59.106.108.72: uicon.st-hatena.com. > 59.106.108.93: 16x16.hatelabo.jp. > 59.106.108.93: copie.hatelabo.jp.
http://anond.hatelabo.jp/20090408100019
ベンチを取ってみると、ハッシュの方が速かったです。
UPSERT処理SQL生成処理の汎用化に使用中だったのですが、プロファイルすると結構時間をくっていたので、key設定時まで遡って再構築したいと思います。
#!/usr/bin/perl use strict; use warnings; use Benchmark; my $item = { date => undef, type => undef, value => undef, title => undef, views => undef }; my @key = ('date', 'type'); my %key; my @update; timethese(1000000, { use_grep => sub { @update = grep { my $a = 1; foreach my $b (@key) { $a = 0 if $_ eq $b; } $a; } keys %{$item}; }, use_hash => sub { %key = map { $_ => 1 } @key; @update = grep { not exists $key{$_} } keys %{$item}; }, } );
実行結果
Benchmark: timing 1000000 iterations of use_grep, use_hash... use_grep: 10 wallclock secs ( 9.84 usr + 0.00 sys = 9.84 CPU) @ 101595.04/s (n=1000000) use_hash: 5 wallclock secs ( 6.43 usr + 0.00 sys = 6.43 CPU) @ 155593.59/s (n=1000000)
http://anond.hatelabo.jp/20090408034449
リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。
元のコードはgrep内でリニアサーチをやっているわけですから、ここにハッシュテーブルを使うわけです。
my %key = map { $_ => 1 } @key; my @update = grep { not exists $key{$_} } @items;
ベンチは取っていないですが、多分早いです。
ただ、その分メモリを食いますし、@itemsに対し@keyの方が長大だと、あまり効率が良くないかも知れません。
その場合、ソート済みならバイナリサーチでやってみるとか、そもそもkeyをハッシュで管理するとか、GDBMやsqlite等を使って永続化するとか、keyの入手段階から検討したほうが良いかもしれません。
忘れないうちに調べてみた。
% diff host.old host.txt | grep '[<>]' | sort > d2.hatena.ne.jp > ugomemo.hatena.ne.jp > url.hatena.ne.jp
新サービスうごメモと、漏れていた d2, url を加えた。
% diff resolve.old resolve.txt | grep '[<>]' | sort > 59.106.108.80: d2.hatena.ne.jp. > 59.106.108.91: url.hatena.ne.jp. > 59.106.108.94: ugomemo.hatena.ne.jp.
今回は 59.106.108.64/27 だった。59.106.108.96/27 との使い分けに何か法則があるのだろうか。
はてなキーワード、はてなブックマークのリニューアルに加え、はてラボ新サービスも始まったので、ここ半年近くの変化を調べてみた。
% diff host.old host.txt | grep '[<>]' | sort > bbeta.hatena.ne.jp > bottle.hatelabo.jp > counting.hatelabo.jp > favicon.hatena.ne.jp > img.b.hatena.ne.jp > img.f.hatena.ne.jp > k.hatena.ne.jp > news.hatelabo.jp
対象に、新サービスによるものと、漏れていた img.f.hatena.ne.jp を加えた。
% diff resolve.old resolve.txt | grep '[<>]' | sort < 221.186.146.26: mail.hatena.ne.jp. < 221.186.146.26: ns.hatena.ne.jp. < 221.186.146.26: sv.hatena.ne.jp. < 221.186.146.27: hatena.ne.jp. > 59.106.108.101: ns.hatena.ne.jp. > 59.106.108.101: sv.hatena.ne.jp. > 59.106.108.102: k.hatena.ne.jp. > 59.106.108.103: favicon.hatena.ne.jp. > 59.106.108.105: img.b.hatena.ne.jp. > 59.106.108.106: bbeta.hatena.ne.jp. > 59.106.108.69: img.f.hatena.ne.jp. > 59.106.108.86: hatena.ne.jp. > 59.106.108.93: bottle.hatelabo.jp. > 59.106.108.93: counting.hatelabo.jp. > 59.106.108.93: mail.hatena.ne.jp. > 59.106.108.93: news.hatelabo.jp.
221.186.146.24/29も消え、外向けサーバは完全にサクラのみでの運用に切り替わったようだ。
img.f.hatena.ne.jp と f.hatena.ne.jp、hatena.ne.jp と www.hatena.ne.jp は同じゲートウェイとなっている。
おれはもうMooseしかつかわねぇ。後にも先にもMooseMooseMooseMooseMoose!!!!!!!!!!!1111111
ってな人の為にいつでもどこでもMooseする。automooseを実装しますた。
package automoose; use strict; use warnings; sub import { strict->import; warnings->import; } package automoose::before; use Moose; no Moose; package automoose::after; use Moose; my @before = keys %automoose::before::; my @after = keys %automoose::after::; my @exports = do { my %u; @u{@before} = (); grep { !exists $u{$_} } @after }; package UNIVERSAL; use Moose; for my $func (@exports) { __PACKAGE__->meta->remove_method($func); __PACKAGE__->meta->add_method($func,sub { my $class = shift; my $auto = $class.'::__auto__'; no warnings 'redefine'; local *Moose::_get_caller = sub { return $class }; Moose->import( { into => $auto } ); my $code = $auto->can($func); $class->meta->add_method($func,sub { shift; goto $code; }); goto $code; }); } 1;
使い方はいたって簡単。useするだけ。
use automoose; my $obj = Foo->new;
いきなりnewが呼べちゃう。
他にも
use automoose; Foo->has( hoge => is => 'rw' ,default => 9999 ); Foo->has( muge => is => 'rw' ,default => 7777 ); print Foo->new->hoge; print Foo->new->muge; Bar->extends('Foo'); print Bar->new->hoge;
ょーかんたん。げーべんり。
しっかしこれ、automooseだけど実装するの結構めんどかったのよ。Moose-0.44をベースに作ったんだけどさ。
Moose内部で使用している$CALLERって変数がレキシカルなもんだから、どうやってそれを外から制御すればいいのかすんごい苦労したわけさね。
で結局importの引数にinto渡してさらにMoose::_get_caller関数を上書き無理矢理ハックしたってわけさ。
でもね。でもね。でもね。ちょっと聞いてよ。
ふと最新のMoose-0.50見てみたらさ、Moose::__CURRY_EXPORTS_FOR_CLASS__なんて関数が定義されてるわけよ。
外から明示的に$CLASSを変更できるインターフェイスなわけよ。おいおいおいおい、勘弁してくれよ。こっちゃ折角苦労してハックしたのにあっさり公式対応するなってばよ。メゲルヨ?ぼく。
まぢめげるよ。めげる。ってかもうめげたよ。もうMooseなんてつかわんね!つかわんね!
Mooseなんて大嫌いだー!
俺はMooooooooooseをやめるぞぉおおおおおおおおお、JOJOぉぉぉおおおおお!!!!11
今回、洩れていたauth,gw,mail,nsを加えている。
% diff resolve.old resolve.txt | grep '[<>]' | sort < 125.206.202.66: graph.hatena.ne.jp. < 125.206.202.66: i.hatena.ne.jp. < 125.206.202.66: map.hatena.ne.jp. < 125.206.202.66: q.hatena.ne.jp. < 221.186.146.26: mail.hatelabo.jp. < 221.186.146.27: www.hatena.ne.jp. < 221.186.146.28: anond.hatelabo.jp. < 221.186.146.28: hatelabo.jp. < 221.186.146.28: music.hatelabo.jp. < 221.186.146.28: searchplus.hatelabo.jp. < 221.186.146.28: serif.hatelabo.jp. < 221.186.146.28: sns.hatelabo.jp. < 221.186.146.28: sv.hatelabo.jp. < 221.186.146.28: wordlink.hatelabo.jp. < 221.186.146.28: world.hatelabo.jp. < 61.196.246.68: screenshot.hatena.ne.jp. < sv.hatelabo.jp.: www.hatelabo.jp. > 221.186.146.26: mail.hatena.ne.jp. > 221.186.146.26: ns.hatena.ne.jp. > 59.106.108.66: gw.hatena.ne.jp. > 59.106.108.86: www.hatena.ne.jp. > 59.106.108.87: screenshot.hatena.ne.jp. > 59.106.108.88: map.hatena.ne.jp. > 59.106.108.89: i.hatena.ne.jp. > 59.106.108.90: auth.hatena.ne.jp. > 59.106.108.92: graph.hatena.ne.jp. > 59.106.108.93: anond.hatelabo.jp. > 59.106.108.93: hatelabo.jp. > 59.106.108.93: mail.hatelabo.jp. > 59.106.108.93: music.hatelabo.jp. > 59.106.108.93: rokuro.hatelabo.jp. > 59.106.108.93: searchplus.hatelabo.jp. > 59.106.108.93: serif.hatelabo.jp. > 59.106.108.93: sns.hatelabo.jp. > 59.106.108.93: sv.hatelabo.jp. > 59.106.108.93: wordlink.hatelabo.jp. > 59.106.108.93: world.hatelabo.jp. > 59.106.108.93: www.hatelabo.jp. > 59.106.108.99: q.hatena.ne.jp.
気がつくと、61.196.246.64/29と125.206.202.64/29が消え221.186.146.24/29が残るのみとなった。
おそらくこれで移転完了だろう。そこで、改めてサーバ一覧を示す。
inetnum: 221.184.0.0/13 (221.184.0.0 -221.191.255.255) netname: OCN-JPNIC-JP inetnum: 221.186.146.24/29 (221.186.146.24 - 221.186.146.31) netname: HATENA 221.186.146.26: mail.hatena.ne.jp. 221.186.146.26: ns.hatena.ne.jp. 221.186.146.26: sv.hatena.ne.jp. 221.186.146.27: hatena.ne.jp. inetnum: 59.106.0.0/16 (59.106.0.0 - 59.106.255.255) netname: SAKURA inetnum: 59.106.108.64/26 (59.106.108.64 - 59.106.108.127) netname: HATENA 59.106.108.66: gw.hatena.ne.jp. 59.106.108.67: red.hatena.ne.jp. 59.106.108.67: red3.hatena.ne.jp. 59.106.108.68: mobile.hatena.ne.jp. 59.106.108.69: f.hatena.ne.jp. 59.106.108.70: rimo.tv. 59.106.108.71: mgw.hatena.ne.jp. 59.106.108.72: b.hatena.ne.jp. 59.106.108.73: g.hatena.ne.jp. 59.106.108.74: a.hatena.ne.jp. 59.106.108.75: r.hatena.ne.jp. 59.106.108.76: ring.hatena.ne.jp. 59.106.108.77: d.hatena.ne.jp. 59.106.108.78: w.hatena.ne.jp. 59.106.108.81: counter.hatena.ne.jp. 59.106.108.82: search.hatena.ne.jp. 59.106.108.84: h.hatena.com. 59.106.108.84: h.hatena.ne.jp. 59.106.108.86: www.hatena.ne.jp. 59.106.108.87: screenshot.hatena.ne.jp. 59.106.108.88: map.hatena.ne.jp. 59.106.108.89: i.hatena.ne.jp. 59.106.108.90: auth.hatena.ne.jp. 59.106.108.92: graph.hatena.ne.jp. 59.106.108.93: anond.hatelabo.jp. 59.106.108.93: hatelabo.jp. 59.106.108.93: mail.hatelabo.jp. 59.106.108.93: music.hatelabo.jp. 59.106.108.93: rokuro.hatelabo.jp. 59.106.108.93: searchplus.hatelabo.jp. 59.106.108.93: serif.hatelabo.jp. 59.106.108.93: sns.hatelabo.jp. 59.106.108.93: sv.hatelabo.jp. 59.106.108.93: wordlink.hatelabo.jp. 59.106.108.93: world.hatelabo.jp. 59.106.108.93: www.hatelabo.jp. 59.106.108.97: d.hatena.com. 59.106.108.97: hatena.com. 59.106.108.97: m.hatena.com. 59.106.108.97: m.hatena.ne.jp. 59.106.108.97: s.hatena.com. 59.106.108.97: s.hatena.ne.jp. 59.106.108.98: w.hatena.com. 59.106.108.99: q.hatena.ne.jp.
ほんとにこの人は議論というものをわかってるのかね。一つの論点を挙げたらそれと心中しないといけないとでも思ってるんだろうか。
じゃあまず撤回するところからはじめろよ。くぐるまたぐらを激しく間違えてんだよ君は。
そういう意味でこの批判は文字通りナンセンス(無意味)。「このような論点が存在する」という主張は「このような価値観こそが正しく、他は全て間違っていると信ずる」というものとは全く異なる。だいたい俺が一度でも「役に立つから良い」などと主張したか?「役に立つものだけが良いものだ」と思っている奴が相手だと想定したから、「ある特定の価値観を認めたしてもこういう論点が存在する」と言ったのだ。それのどこが、俺がその「特定の価値観」を主張したことになるのだ。
これだけ言ってもわからないとしたら、君は論理的思考というものが全くできないと言って然るべきだろうね。
なお、くぐるまたぐらを間違えたことは認めるが、それは君がどういう思想の持ち主だったかを読み違えただけだ。しかし、匿名でものを書いている君が「俺様のことを正しく理解しないとは無礼千万!」などという資格はまるでないぞ。
それもまた極端な価値観だな。文学は神聖にして侵すべからずというのか。芸術的にも価値があり、経済的にも価値があるならなおのことよいではないか。
じゃあ例えば君が美術館の館長で、「芸術なんて無駄なものに金が出せるかボケぇ」ってな思想の持ち主の市長によって予算が激減させられそうになったとき、彼にどう反駁するんだ?芸術に対して経済的有用性を云々するのは冒涜である、と主張して、その結果宗教論争に陥って君は解雇、職員も路頭に迷う、なんてのが理想なのか?それこそ勘違いヒロイズムもいいところだ。職員はいったいどうなるのだ。
これが「世に差別や不正が溢れているとして、そりゃ一凡人に出来ることは少ないが、開き直って加担するような真似は俺には出来んね」といった人間の言葉なんだからお笑いぐさだね。
文化を有用性で測るのは冒涜だとかおっしゃったのはどこの誰様でしたっけねえ。
日本は所詮アジアだよ。それが証拠に、自由主義も民主主義もまるで精神的なところに根付いてなくて、簡単に前時代的な思想に転ぶじゃないか。
差別発言ですな。そう言い切ったあなたが19世紀の人間ならあなたはヘーゲルになれたかもしれない。だが今は21世紀なのでな。ヘーゲルの5693番煎じぐらいのことを言っても「事実関係に反する」と言われて終了。欧米先進国様にもキリスト教原理主義とか移民排斥とか悪しき伝統の宿痾はいくらでもある。
あんたがもしヘーゲルなら、あるいは丸山眞男でもいい、欧米先進国様の良い点だけに憧れを持って、悪い点を等閑視していたとしても、情報の不足として酌量された点はあるだろう。だが現代ではそうはいかないぞ。
アベレージをほどほどに高く保ちつつ、それで足りないようなエリートは海外で一流の教育を受けて来い、って言ってるだけなんだが。
わざわざそんなことをしたってなんのメリットもないし、むしろデメリットしか想定できないと主張しているのがわからんのか。
えーと、それから旧帝大の卒業生が世の中のどれだけの割合になるのか調べてからものを言おうね。
Fortranを知らないなんて一言も言ってないのにねえ。天声でも聞こえたのかなあ。
実践的なことばっかやってんじゃねーか。お前がその実践性を理解できてないだけだ。
釈迦に説法。仮にも俺は工学修士だ。お前ごときがエラそうに言ってる話なんて学ばずとも勝手に覚えたわ。
工学は実践に直結しているに決まってるじゃないか。「実践」のレベルが違うと言っているのだ。誰が講義でEmacsやgrepの使い方なんか教えてるか、馬鹿馬鹿しい。時間を掛ければいつでも必要なだけ身に付けられることをわざわざ貴重な時間をいくらも割いてまで教えるわけがなかろう。
だいたい、線型代数も微積も何も理解できないお前ががあのシラバスの内容を大まかにでも正確に理解できているわけがないんだがね。それのどこが君のいったような意味で「実践的」なのだ?え?
言っておくが、どっかで聞きかじったような言葉を言葉として知っていることと、内容まで理解していることは天と地の差だぞ。誰かがあの内容に沿って作ってくれたライブラリを使ってコーディングすることは「情報工学」じゃないぞ。わかってんのかその違いが。
反応してくれた人がイター!
ちょっと嬉しい。
> 別にrubyでもsedでも良いけど、正規表現で問題なくパース出来るんじゃない?
毎回正規表現考えるのも面倒かなーとかとか。
> 位置あわせでよいのかな?ほかにある?
理想を語ると出力形式指定できれば最強だなーとか妄想してた。
--output-style "[%p<>%u<>%g<>%s] %n"
とすると
| |-- [-rw-r--r--<>hoge<>hoge<>9108] HTTP_BAD_GATEWAY.html.var
みたいな。
別にコマンド的である必要はまったくないっす。
> # tree -pugs | perl -e '@line=<>; $max=(sort map {/(.*?)\[/; length($1)} @line)[0]; map {s/(.*?)\[/$1 . " "x($max-length($1))."\["/e} @line; print @line'
実行してみたら出力に変化がなかった。アルェー?
何にせよPerlじゃね?ってのは超同意。
とかく出力形式を指定できたら便利だなーと。
この手のディレクトリ状況調べて提出してちょ、みたいな要求はちらほらあるのですよ。
付け加えると、CSVで出してちょーみたいな要求の場合はfindとかlsとかgrepとかその辺組み合わせてどうにでもなる感じです。
いや十分教養俗物だろ。情報工学関連への言及が他と比べてショボくて、ああ専門外なのねー、とニヤニヤ出来たけど。
ご立派なことだが、それじゃあどうやってこの文化格差システムを崩壊させられるっていうんだね?
そのためのハッカー、そのための非モテ、そのためのオタなんじゃねーの。
少なくとも、自分から階級格差を肯定し追認する側に回っていることを公言するような
バカな真似はしたくねえな。そういうのは腹ん中だけで後ろ暗く誇ってろ。
俺がいつそんな主張をしたというんだか。
役に立たないし、高校教育程度じゃステータスシンボルにならんとは思ってるがな。
どう考えても違うだろ。現実問題として自国で教育の多くを賄える国の方が「国力」(経済力だと思えば)が高いのは自明じゃないか。
全然自明じゃないだろ、何言ってんだ? MITを日本にも作れってか?
外国で本当の一流を学んでもらったほうが本人のためになるし、コスト削減にもなる。
公教育が注力すべきは、普通に働く普通の人の水準を上げることだ。
一般には「自文化について語れる」ことが「教養」の前提とされているがね。
欧米でギリシャ語やラテン語や古典文学が重要視されるのは、それが彼らの民主主義やら哲学やら自然科学やら数学やらの源流にあるからだ。
源氏物語や万葉集が何に生かせるってんだよ。葉隠でハラキリ根性でも学べってか?
欧米の古典を読む機会をもっと作れ、というのなら、エリート主義だとか文化資本云々で不愉快には思うが、一目おける意見だとは思うぞ。
それから「基礎教養」の件だが、「覚えておいて損はない」程度のことかよ。拍子抜けした。
何に拍子抜けしてんのかしらんが、基礎教養ってなそういうもんだ。お前も言ってたろ、ジェネラルな知識がどうこうって。情報処理試験に出てくるような類の知識は、そう知的に高度でもないが、少なくとも無駄ではない。
あのさあ、なんでパターン認識とか待ち行列とかの例を挙げたと思う?こういう分野では数値計算が重要になるから、基本的に低レベルに近い言語でプログラムを書くことが望まれるし、似たようなプログラムを使い回すから生産性という意味でもそれで大した影響がないということだ。
そもそも俺は低水準言語の話はしてなかったと思うが?
「低水準言語で十分」という例を挙げてどうすんだ。「低水準言語が有効/必要」な例をあげろよ。機械よりの視点で細かい制御が望まれる例を挙げるべきだ。専用ハードウェアに効率的に仕事させるために、機械語レベルでの知識が必要になるケースは今でも多くある。
つまり、「基礎教養」の勉強をサボっても、君が線型代数や微積をサボったほどの悪影響もないということだ。少なくとも建前上は。それでもなおかつ「必修」とされることの意義を問うている。
お前の例が不適切なだけだろ。アホか。
てっきり、「基礎教養」を学べばコンピュータの中身のイメージがしやすくなって、効率の良いプログラムを書くための感覚が身に付く
そんな印象論はしとらんし、最適化は最適化で別個に学ぶべき領域だろ。高級言語レベルでの最適化の本だっていっぱいあるが。
技術者コミュニティの発展や運営のために一定の共通言語を身に付ける、とかそういう答えが返ってくると思ったし、古典を学ぶ意義をそういうところに見出すこともできる
全然違うだろ。源氏物語や万葉集の読解を具体的に何に使えるってんだ。プレゼンのハッタリくらいにしかならねーんだろ?
情報処理試験に出るような基礎教養は、全部使いどころがある知識だぞ。当たり前に使いすぎてて意識してない人が多いが。
ちなみに俺が「基礎教養」で想定していたのはそうした技術の「使い方」ではなく、「考え方」の方だ。
「使い方」から遊離して「考え方」だけを煎じ詰めていくのは、プログラマレベルでの実践的な志向ではないだろうな。学問的には意義があるが。
特にOSについては基礎理論のことで、UNIXという特定のOSを扱うノウハウのことではない。大学で教えていることについて語っているのだからそれは自明だと思ったが。
あまりにもUNIXはメジャーすぎる。UNIXという「特定」OSの実装から離れた所で抽象的にOSを煎じ詰めるのはかなり学問的な領域だと思うが。もう基礎とはいえないだろう。
もちろん、UNIXという実装を学びながらそこに被せる形では、OSの基本概念だとかOSI7階層モデルだとかは触るだろうけどさ。
あと、正規表現を考えるときに一々有限オートマトンなんて考えないだろう。そもそも、現状使われている正規表現は本来の意味での正規言語を逸脱してるんだから。
どう拡張されて、それで表現力がどう広がっているのか、というようなところへ、一通り形式言語を学んでない人では想像が及ばないだろう。GREPのやり方ひとつでセンスは分かるもんだぞ。
正式公開&オープンのプレスリリースも出たので、新しいサーバを調べてみた。
% diff resolve.old resolve.txt | grep '[<>]' | sort < 221.186.129.147: counter.hatena.ne.jp. < 221.186.129.147: search.hatena.ne.jp. > 59.106.108.78: w.hatena.ne.jp. > 59.106.108.81: counter.hatena.ne.jp. > 59.106.108.82: search.hatena.ne.jp. > 59.106.108.84: h.hatena.com. > 59.106.108.84: h.hatena.ne.jp. > 59.106.108.98: w.hatena.com.
いつの間にか 221.186.129.144/29 がなくなっていた。
さて、w.hatena.ne.jp. と w.hatena.com. が違うのが興味深い。そして飛んでいるアドレスも興味深い。
ところで残っているqは移すのだろうか?
台風の影響で書き込み数とか減るのかな?とか思ったので調べた。
09-04 00 ********** 09-04 01 ******* 09-04 02 ********* 09-04 03 **** 09-04 04 *** 09-04 05 *** 09-04 06 ** 09-04 07 ***** 09-04 08 * 09-04 09 ****** 09-04 10 ****************** 09-04 11 ************************************ 09-04 12 ********************** 09-04 13 *************************** 09-04 14 ********************************************* 09-04 15 ********************************************* 09-04 16 ********************************** 09-04 17 ************************************* 09-04 18 **************** 09-04 19 ************** 09-04 20 ************************** 09-04 21 *********************************** 09-04 22 ****************************************** 09-04 23 *************************** 09-05 00 **************** 09-05 01 ********** 09-05 02 ****** 09-05 03 ********* 09-05 04 **** 09-05 05 ********* 09-05 06 **** 09-05 07 * 09-05 08 ***** 09-05 09 ********************************************* 09-05 10 ******************************************************************************* 09-05 11 ******************** 09-05 12 ************* 09-05 13 ******************************** 09-05 14 ****************************** 09-05 15 ********************************************************************** 09-05 16 ********************************************************************** 09-05 17 ***************** 09-05 18 ******************************** 09-05 19 ************************************* 09-05 20 ********************* 09-05 21 ************************************************ 09-05 22 *************************************************** 09-05 23 ************************************************ 09-06 00 **************************************** 09-06 01 ****** 09-06 02 *** 09-06 03 ************* 09-06 04 ****** 09-06 05 *** 09-06 06 *** 09-06 07 *** 09-06 08 ***** 09-06 09 ***** 09-06 10 ******************************* 09-06 11 ***************************** 09-06 12 ************* 09-06 13 **************************** 09-06 14 ****************** 09-06 15 *********************** 09-06 16 ************************************** 09-06 17 **************************************************************************** 09-06 18 ********************************* 09-06 19 ************* 09-06 20 ********************** 09-06 21 **************************************************** 09-06 22 *************** 09-06 23 ******************** 09-07 00 ************ 09-07 01 **************** 09-07 02 ************** 09-07 03 ********* 09-07 04 ****** 09-07 05 ** 09-07 06 *** 09-07 07 *** 09-07 08 ********** 09-07 09 ************** 09-07 10 *********************** 09-07 11 *********** 09-07 12 ********************* 09-07 13 ************************* 09-07 14 ******************** 09-07 15 ************************************* 09-07 16 *************** 09-07 17 ******** 09-07 18 ********** 09-07 19 ********* 09-07 20 ****** 09-07 21 ********* 09-07 22 *********** 09-07 23 ************** 09-08 00 **** 09-08 01 **************** 09-08 02 **************** 09-08 03 **** 09-08 04 *** 09-08 05 **** 09-08 06 ** 09-08 07 *********** 09-08 08 ******* 09-08 09 ***** 09-08 10 ***** 09-08 11 ************************* 09-08 12 *********** 09-08 13 ******************** 09-08 14 **************** 09-08 15 ******************* 09-08 16 ********************* 09-08 17 ************************************* 09-08 18 ************************* 09-08 19 ****************** 09-08 20 ********** 09-08 21 ************** 09-08 22 ********* 09-08 23 **** 09-09 00 ********* 09-09 01 ************* 09-09 02 **** 09-09 03 ***** 09-09 04 **** 09-09 05 ** 09-09 06 ***** 09-09 07 ***** 09-09 08 ** 09-09 09 *************** 09-09 10 *** 09-09 11 ****************** 09-09 12 ******** 09-09 13 ******** 09-09 14 ************ 09-09 15 ***************** 09-09 16 ******** 09-09 17 **************** 09-09 18 ************* 09-09 19 ************** 09-09 20 ************* 09-09 21 ******************* 09-09 22 ************** 09-09 23 ************ 09-10 00 **************************** 09-10 01 ******************** 09-10 02 ********* 09-10 03 ********** 09-10 04 *** 09-10 05 ** 09-10 06 **** 09-10 07 *** 09-10 08 ***** 09-10 09 ********** 09-10 10 ***************************** 09-10 11 ******************************* 09-10 12 ***************************** 09-10 13 ******************* 09-10 14 ********************** 09-10 15 *********************** 09-10 16 ********************* 09-10 17 ********************************************************** 09-10 18 ******************************************** 09-10 19 ************************* 09-10 20 ********************* 09-10 21 ************************ 09-10 22 ********************************* 09-10 23 ***************
良くわからないけど22ー23が減ってる気もする。つか、やっぱり昼が多いとか、そっちの方が興味深かった。
念為記録
grep Permalink anond20070906.txt | perl -pe '/\b(\d\d):\d\d\b/ and $_="$1\n"' | sort | uniq -c | perl -ne '($n,$d)=split;print "09-06 $d ", "*"x$n, "\n"' > anondgraph.txt
さて、とうとうダイアリも移転し、すっかり寂しくなったはてなサーバ室に書き記しておく。
% diff resolve.old resolve.txt | grep '[<>]' | sort < 125.206.202.83: d.hatena.ne.jp. < 221.186.129.146: d.hatena.ne.jp. < 221.186.146.29: d.hatena.ne.jp. < 61.196.246.67: d.hatena.ne.jp. > 59.106.108.77: d.hatena.ne.jp.
これにより125.206.202.80/29がなくなった。他の回線も見直しするのだろうか。