「BAR」を含む日記 RSS

はてなキーワード: BARとは

2010-01-23

gcclink time optimization

gcc-4.5 から link time optimization (lto) と呼ばれる最適化が可能になった。

従来の分割コンパイルでは、コンパイル単位(ファイル)での最適化しかできなかった。例えば、別ファイル関数をインライン展開することはできないし、引数に渡されたポインタの escape analysis も諦めざるを得なかった。

lto はコンパイルする時に、中間表現(GIMPLEのバイトコード表現)をオブジェクトファイルに残しておき、リンクするときに、すべての中間表現を使って最適化しなおす。要は、ソースコードを全部とっておいて、最後に全部をコンパイルしなおすのと、同じようなものだ。

最大の欠点は、最後にコンパイルしなおすところだ。
このコンパイルは一回のコンパイルであり、単一プロセスで実装されているのでマルチCPUを生かせない。(いっぽう、分割コンパイルなら依存関係が緩いので並列化しやすい。)また、プログラム全体は巨大であり、最適化するのに時間がかかる。

使いかたは簡単だ。-fltoを付ければいい。

gcc-4.5 -c -O2 -flto foo.c

gcc-4.5 -c -O2 -flto bar.c

gcc-4.5 -o myprog -flto -O2 foo.o bar.o

2009-12-10

PHPのあの関数Perlでやるには?

元ネタ 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とかではうまく動かない。あとシグナルとか使った方が良いのかもしれない。

ヒマがあったら他の関数とかも実装してみたいかも。

プログラ増田のあなぐら

2009-11-08

450 :名無しの心子知らず:2009/11/05(木) 18:15:06 ID:IkeOreMy

»275

すっごい遅いレスで申し訳ないが、マジかよと思って調べたら

東京六本木麻薬危険地帯に指定されてるんだな、ぶっ飛んだ。

この危険地帯指定って、いわゆる暴動やら戦争やらでやばい国に旅行者が行かないようする為のものなんだよね。

それが国じゃなくて六本木という一地域指定って・・どんだけ。

Americans told to avoid Tokyo bar district after spate of robberies

http://www.guardian.co.uk/world/2009/mar/18/us-embassy-tokyo-warning

(Guardian: 18 March 2009)

そしてこう続く

“米大使館に先立って、英国オーストラリア大使館が同様の警告を出していた。”

「薬物で意識不明にさせ高額請求」、外国人ねらい六本木で急増 米大使館警告(AFP通信)

http://www.afpbb.com/article/disaster-accidents-crime/crime/2583516/3929658

多くの海外メディア報道

http://www.google.co.jp/search?hl=ja&q=US+Embassy+warns+Roppongi

Wikipedia 英語版でも言及されている

http://en.wikipedia.org/wiki/Roppongi#Nightlife_in_Roppongi

2009-09-02

あるBAR常連の間で起きたショボい出来事

A=私。28歳。恋人なし。一応女性

B=24男性

C=28歳男性。Aと同い年で友達。いいヤツ。Bの先輩。

D=22歳男性。和ませキャラだが、若干笑われキャラも入っている。

E=22歳女性

年齢は便宜的に。全員あるBAR常連

AとB:Cを介して知り合い、店で隣席になれば話しをするようになり、2回ほど2人で晩ご飯を食べに行ったことがあるという関係

ある時、DくんがEちゃんに告白してフラれた。

EちゃんはそれまでDくんに思わせぶりな態度をとっていたため、この顛末を知っている関係者は「あーあ…(可哀想…)」「相手が悪かったね」「全力でDくんをはげまそう」という反応だった。

ところが、その直後くらいから、BARの店内でちょくちょくEちゃんがBくんにしなだれかかったり、ソファー席で膝枕したり、いちゃつくようになる。しかもDくんがいてもおかまいなし。

この件を知っている一部の人はEちゃんに対して好意的な見方をしなくなったし、Eちゃんは他のコミュニティでもいわゆるサークルクラッシャー的な行動をしてて「あの子には気をつけた方がいいよ」と言われているというような噂が流れた。

しかし私が驚いたのは、Bくんが、DくんとEちゃんの間の顛末を知りつつ、Eちゃんがいちゃいちゃしてくるのを受け入れていたということ。

そこである日、Bくんと帰り道が一緒になった時に「2人はつきあってるの?」と聞いた。

そしてBくんが「友達だよー」と言うので、「せめてDくんがいるところでは控えたほうがいいんじゃない?」とつい言ってしまった(これがお節介)。

これに対してBくんは「うーん、でもEちゃんも寂しいんだよねー、きっと。僕もわかるからさー」と言った。

勝手な話だが、このひとことはBくんへの私の評価を暴落させるに十分だった。

その後、私はBくんと距離をとり、疎遠になった。

それから約1年経ったこの間、人づてに「BはA(=私)にフラれてからチャラくなった」とCさんが言ってたのを聞いた。

そういえば、Cさんは上の顛末を全然知らないからなー。

Bくんとはつきあってもいないし、Bくんに好きだ、とか、つきあって欲しい、とか、それらしきことは一度も言われたことがなかった。

しかし、よりによって私に振られたからチャラくなったとは…。

かなり心外。

その前からチャラかったじゃん!というのもあるし、もう今となっては弁解することもできない。

弁解するためには、上の事情を全部言わなければならない。

お節介なんてするもんじゃないし、人間関係って難しいなー。

それにしても心外だ!!!

2009-03-18

公明党都議選重視?

コピーして、test.htaのような拡張子HTAで保存

HTAプログラム

 ↓

<html&gt;

<head&gt;

<style type="text/css"&gt;dt{float:left;clear:left;width:10em;}</style&gt;

<meta content="charset=Shift_JIS"/&gt;

</head&gt;

<body&gt;

<script type="text/javascript"&gt;</p&gt; <p&gt;window.onload = init;</p&gt; <p&gt;var url = [</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data03_04.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data03_04.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html</a&gt;"</p&gt; <p&gt;];</p&gt; <p&gt;var base = "<a href="http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/"&gt;http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/</a&gt;";</p&gt; <p&gt;var file = ["chiyoda","chuou","minato","shinjyuku","bunkyo",</p&gt; <p&gt; "taitho","sumida","koutho","sinagawa","meguro",</p&gt; <p&gt; "ohta","setagaya","shibuya","nakaono","suginami",</p&gt; <p&gt; "toshima","kita","arakawa","itabashi","nerima",</p&gt; <p&gt; "adachi","katushika","edogawa"];</p&gt; <p&gt;for(var i=0; i<23; i++){</p&gt; <p&gt; url.push(base + file[i] + "\.html");</p&gt; <p&gt;}</p&gt; <p&gt;var id = [</p&gt; <p&gt; "2007 参院比", "2005 衆院比", "2005 都議会", "2004 参院比", "2003 衆院比",</p&gt; <p&gt; "2001 参院比", "2001 都議会", "2000 衆院比", "1998 参院比", "1997 都議会"</p&gt; <p&gt;];</p&gt; <p&gt;var ku = [</p&gt; <p&gt; "千代田","中央","港","新宿","文京",</p&gt; <p&gt; "台東","墨田","江東","品川","目黒",</p&gt; <p&gt; "大田","世田谷","渋谷","中野","杉並",</p&gt; <p&gt; "豊島","北","荒川","板橋","練馬",</p&gt; <p&gt; "足立","葛飾","江戸川"</p&gt; <p&gt;];</p&gt; <p&gt;var regexku = new RegExp("(" + ku.join("|") + ")区");</p&gt; <p&gt;var iframe = [];</p&gt; <p&gt;var data = {};</p&gt; <p&gt;var parse = [ function(){</p&gt; <p&gt; var d = iframe[0].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "0"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[1].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=nobr[i].parentNode; j<4; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "1"] = e.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[2].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue) &amp;&amp; nobr[i].parentNode.tagName == "SPAN"){</p&gt; <p&gt; for(var j=0, e=nobr[i]; j<6; j++){</p&gt; <p&gt; e = e.parentNode;</p&gt; <p&gt; }</p&gt; <p&gt; var e2 = e.nextSibling.nextSibling.firstChild.childNodes[2].firstChild;</p&gt; <p&gt; var k = 0;</p&gt; <p&gt; data[RegExp.$1 + "2"] = 0;</p&gt; <p&gt; while(e2){</p&gt; <p&gt; if(e2.firstChild.firstChild.nodeValue.indexOf("公明党") != -1){</p&gt; <p&gt; data[RegExp.$1 + "2"] += parseInt(e2.parentNode.nextSibling.childNodes[k+2].firstChild.nodeValue.replace(",",""), 10);</p&gt; <p&gt; }</p&gt; <p&gt; e2 = e2.nextSibling;</p&gt; <p&gt; k++;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "2"] = int2str(data[RegExp.$1 + "2"]);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[3].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<19; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "3"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[4].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; var regexku2 = /(大田|世田谷|練馬|足立|江戸川)/;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; continue;</p&gt; <p&gt; }</p&gt; <p&gt; if(regexku2.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = (data[RegExp.$1 + "4"] || 0) </p&gt; <p&gt; + parseInt(td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(",","").replace(/\.\d+/,""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; for(var j=0; j<5; j++){</p&gt; <p&gt; data[ku[[10,11,19,20,22][j]]+"4"] = int2str(data[ku[[10,11,19,20,22][j]]+"4"]);</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[5].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "5"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[6].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<7; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "6"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"").replace("-","0");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[7].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<9; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "7"] = e.firstChild.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[8].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "8"] = int2str(td[i].nextSibling.firstChild.firstChild.firstChild.nodeValue);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(n){ return function(){</p&gt; <p&gt; var d = iframe[n+9].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; data[ku[n]+"9"] = 0;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if((((td[i].firstChild || 0).firstChild || 0).nodeValue || "").indexOf("公明") == 0){</p&gt; <p&gt; data[ku[n]+"9"] += parseInt(td[i].parentNode.lastChild.firstChild.firstChild.nodeValue.replace(",",""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; data[ku[n]+"9"] = int2str(data[ku[n]+"9"]);</p&gt; <p&gt; show();</p&gt; <p&gt;}}];</p&gt; <p&gt;function init(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.createElement("dl");</p&gt; <p&gt; dl.appendChild(document.createTextNode("\n【" + ku[i] + "区における公明票】\n"));</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = document.createElement("dt");</p&gt; <p&gt; var dd = document.createElement("dd");</p&gt; <p&gt; dt.innerText = id[j];</p&gt; <p&gt; dl.appendChild(dt);</p&gt; <p&gt; dl.appendChild(dd);</p&gt; <p&gt; }</p&gt; <p&gt; document.body.firstChild.appendChild(dl);</p&gt; <p&gt; }</p&gt; <p&gt; for(var i=0; i<32; i++){</p&gt; <p&gt; var e = document.createElement("iframe");</p&gt; <p&gt; iframe[i] = e;</p&gt; <p&gt; e.style.display = "none";</p&gt; <p&gt; if(i<9) var f = parse[i];</p&gt; <p&gt; else var f = parse[9](i-9);</p&gt; <p&gt; e.attachEvent("onload", f);</p&gt; <p&gt; e.src = url[i];</p&gt; <p&gt; document.body.appendChild(e);</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function show(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.body.firstChild.childNodes[i];</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = dl.childNodes[j*2+1];</p&gt; <p&gt; dt.innerText = id[j] + " " + (data[ku[i]+j] || "");</p&gt; <p&gt; dt.nextSibling.innerText = bar(data[ku[i]+j], j);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function int2str(num){</p&gt; <p&gt; return new String(num).split("").reverse().join("").replace(/(\d{3})/g,"$1,").split("").reverse().join("");</p&gt; <p&gt;}</p&gt; <p&gt;function bar(str, flag){</p&gt; <p&gt; str = str || "";</p&gt; <p&gt; if(str == "" || str.length < 5) return "";</p&gt; <p&gt; var num = parseInt(str.match(/\d+/)) + 1;</p&gt; <p&gt; var arrow = (flag == 2 || flag == 6 || flag == 9) ? " ←" : "";</p&gt; <p&gt; var _bar = new Array(num).join("|") + arrow;</p&gt; <p&gt; return _bar;</p&gt; <p&gt;}</p&gt; <p&gt;</script&gt;

</body&gt;

</html&gt;

2009-02-18

[] <中国語中文

[Resources] リンク集 Useful Link Resources

学習に役立つリンクを集めた言語学総合サイトなど。

  1. 無料中国語学習できるサイト初心者用) - NAVER まとめ
  2. 中国語半年マスターした私が教える人生を変えた勉強法
  3. Web site Titleサイト名)

[Learner’s Available Language/ Learning Language] 何語で何語を学ぶ Learning - by -

[Japanese/English] 日本語中国語を学ぶ Learning Chinese by Japanese

  1. 中国語辞書 by 楽訳中国語
  2. 楽訳中国語教室
  3. 中国語会話入門
  4. こんな時だから旅の中国語英語
  5. 中国語学サイト Virtual 中国語講座
  6. あいうえお中国語中国語学習・中国語講座
  7. 我愛中国語
  8. オンライン中国語学習-中国語とは?<中国情報局
  9. 中国語教材 - BitEx中国語
  10. 紅の中国語講座
  11. ピンイン(Pinyin)と漢字の壺
[Speaking] 会話
  1. 実用中国語講座--無料で学べる中国語学サイト--
Pronunciation /pinyin /発音 /声調
  1. 中国語発音塾:スペースアルク
  2. BB中国語発音
  3. 中国語の基本発音 / 中国語学サイト中文広場
  4. 中国語発音講座
  5. 中国語発音辞書(ピンイン検索) / 中国語学サイト中文広場
  6. 音韻配合表 | 発音編 | 中国語教材 - BitEx中国語

[Dictionary] オンライン辞書 Online Dictionaries

  1. 中国語達人への道

[Translation] 翻訳サイト Free Online Translation Sites

[Tool] 学習ツール Helpful Tools for Learning Language

  1. Chinese Perapera-kun: Chinese Popup Translator :: Firefox Add-ons
  2. ピンイン(pinyin)変換サービス -- 書虫
  3. [Ajax] 中国語漢字ピンインローマ字ルビ
  4. 中国語ピンイン変換の「どんと来い、中国語」にようこそ! | どんと来い、中国語
  5. 下载谷歌拼音输入法(google pinyin)

[Portal] 学習言語圏のポータルサイトテキストソース Portal Sites of Learning Language / Text Sources

学習言語ポータルサイトなど。

[RSS] RSS feeds

ツールリンクアップデート更新中の教材紹介記事など。

[Podcast] ポッドキャストリスニング教材 Podcasts / Listening Resources

[Youtube] 動画学習 Movie Resources

  1. YouTube - cnstation's Channel

[Culture] 文化マナー生活習慣 Culture / Manner / Life Style

冠婚葬祭言語生活必要情報など

[Set up] タイピング基礎、言語入力システムインストール Set up Tips for the Absolute Beginners.

  1. How to display/input Chinese? – Support - Learn Chinese

[Vocabulary] ボキャブラリー、語彙習得

[News] ニュースソース

[Extensive Reading] 読み物(小説ブログなど) Novels / Blogs

[Search Word] 検索ワード Words and Sites for Searching Resources

  1. ○○語 华语/華語、汉语/漢語、中文
  2. 学習
  3. 勉強 教学/教學
  4. 教育 
  5. 方法
  6. 教材
  7. 翻訳
  8. 辞書
  9. 便利
  10. 役立つ
  11. 文法
  12. 練習

[Tips] お役立ち記事など

[Just For Fun] おまけ Bonus Materials

[Unedited] 未編集備忘録 Transient stock/ Memorandum

  1. 中国語All About
  2. オンライン中国語学習-中国語とは?<中国情報局
  3. YellowBridge Chinese-English Dictionary
  4. Ting - Chinese English Dictionary Study Center 听-汉英词典学习中心 -Learn Language
  5. Tongue Twisters -- Ting -- Chinese - English Language
  6.  
  7. Best Chinese Websites
  8. China Daily Website - Connecting China Connecting the World
  9. Chinese Tool Bar
  10. 中国語例文検索中国語入力
  11. 日本作品_日本文学_日本作家_日本小说_日文小说_日文书籍_贯通日本
  12. 華流ドラマ 三国志 「連環計」 1-6 ネット中国語
  13. 中国語学習,質問掲示板:(中国語入力可能)-Mahoo!上海
  14. PTT批踢踢實業坊 - 首頁
  15. Chinese Forums
  16. MDBG Chinese-English dictionary
  17. 中国語】 お勧め参考書辞書を教えてください!≫ 【国際】 2ch世界ニュース (゚∀゚ )!
  18. 中文 - HSK-中国汉语水平考试
  19. ジュンク堂書店 聴読中国語
  20. 中国語」は存在しない!! 使用言から見た統一国家中国」の内実
  21. 美人中国人講師初心者から上級者まで中国語講座が学べる 600本無料動画が良い! | Last Day. jp
  22. 中国語達人への道
  23. 中国語ピンイン変換や、簡体字繁体字変換・多音字辞典なら | どんと来い、中国語

語学学習サイト個人的リンクメモ / Lists of Language Learning Links)

http://anond.hatelabo.jp/20090101193230

2008-11-01

書き方テスト

#!/usr/bin/perl -w
use strict;
print <<END;
<html><body>
  <h1>Hello! World.</h1>
</body></html>
END
 class Foo
   def bar'baz' # return baz
   end
 end

2008-10-10

メタ構文変数

英国では "John Smith",

日本では「山田太郎」、

プログラミング言語では「メタ構文変数」と呼ばれ hoge とか foo とか bar とか名付けられる変数であり、

ドメインではたびたび example.com (※RFC2606で規定されている) と書かれる、こういった名前

それでは、この日記の著者として頻繁に登場する「増田さん」もその一種?

いいえ。似ているとしたら、星新一小説に出てくる「エヌ氏」のほうでしょう。

彼らが、時には科学者、時にはサラリーマン、時には「ただの青年」として星新一ワールドを彩るのと同じように、私たちも「増田」という名前だけを借りて、それぞれが苦悩や幸福を抱えて多種多様人生を送り、その断片の集合が、ここ「はてな匿名ダイアリー」をかたちづくっているのです。

さて、この「増田さん」の物語が今後どのような展開を迎えるのか? 乞うご期待ですね!

2008-09-23

正規表現の機能の覚書き

はじめに

「はじめての正規表現」ホッテントリ入りしていますが、

導入としては、何に使うのかがわかりやすくて良いのではないかと思います。

あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。

正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)

例では「検索」か「置換」をするものとして話を進めていきます。

「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)

正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。

(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)

メタ文字とリテラル文字

正規表現には、メタ文字とリテラル文字というものがあります。

メタ文字とは機能を持つ文字で、『.』『*』『*?』といったものが当てはまります。

リテラル文字は「文字それ自体」と解釈される文字で、『 』『a』『<』といったものです。

アルファベットや数字はリテラル文字なので、

「検索する文字列:『egg』 置換する文字列:『chicken』」

などとすれば、正規表現を使わない置換と同じ効果になります。

なお、検索して検索文字列が当てはまることを「マッチする」と言います。

メタ文字に使われている文字を検索したい場合は、直前に『\』を置きます。(これを「エスケープ」と呼びます。)

.*?^$()[]{}』などがメタ文字です。

$100』を検索したければ、『\$100』とすればいいということになります。

(『\』は環境によって、半角の『¥』『\』のどちらかになります。)

言語、ツール、モードなどによっては『@/#』もエスケープが必要です。

また、『\』自体は常にエスケープが必要です。

繰り返しについて

メタ文字意味
?直前の文字を0回または1回繰り返す
*直前の文字を0回以上繰り返す
+直前の文字を1回以上繰り返す
{n}直前の文字をn回繰り返す
{n,}直前の文字をn回以上繰り返す
{n,m}直前の文字をn〜m回繰り返す

これらのメタ文字は「量指定子」といって、直前の文字の繰り返しを意味します。

*』は「任意の文字を0回以上繰り返す」とありますが、

「0回以上繰り返す」とは、「全く何もなくてもいいし、いくらあってもいい」という意味です。

よって、『?』は「あってもなくてもいい」、『+』は「1つ以上あればいい」と解釈できます。

colou?r』は『u』があってもなくてもいいので「colorかcolour」ということになります。

{n}』は、たとえば『-{15}』なら、「ハイフン(-)が15個続くもの」となります。

-{10,}』なら「ハイフン(-)が少なくともは10個続くもの(多いのはいくらでも)」、

-{10,15}』なら「ハイフン(-)が10〜15個続くもの」となります。

また、複数の文字を繰り返したい場合は括弧で囲みます。

(Gang){2}Dance』は『GangGangDance』と同じ意味になります。

欲張りと非欲張り

メタ文字意味
?直前の文字を0回または1回繰り返す(欲張り)
*直前の文字を0回以上繰り返す(欲張り)
+直前の文字を1回以上繰り返す(欲張り)
??直前の文字を0回または1回繰り返す(非欲張り)
*?直前の文字を0回以上繰り返す(非欲張り)
+?直前の文字を1回以上繰り返す(非欲張り)

「欲張り」とは、「なるべく多くの文字に適用しようとする」、

「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。

対象文字列が『aaa bbb ccc』だとします。

すると、検索する文字列が『a+』なら『aaa bbb ccc』、

検索する文字列が『a+?』なら『aaa bbb ccc』が置換対象となります。

(「すべてを検索/置換」する場合は当てはまりません)

「『a』を1回以上繰り返す」ということは、『a』でも『aa』でも『aaa』でもマッチすることになりますが、

「欲張り」かそうでないかで実際のマッチは変わってくるわけです。

文字クラス

文字クラス意味
[abc]a、b、cのいずれか
[a-z]a〜zのいずれか
[^a]a以外の文字(改行文字を含めaを除いた全て)
[^a-z]a〜z以外の文字(改行文字を含めa〜zを除いた全て)

文字クラスは『a』や『<』などの代わりに文字の種類を指定するものです。

a〜eのどれかの1文字という指定をしたい場合に『[abcde]』や『[a-e]』といった指定ができます。

また、文字クラス内の最初に『^』をつけて『[^abc]』などとすれば、

「a、b、c以外の何の文字でもいい」とすることができます。

間違いやすいのが「そこにaもbもcも存在しなければいい」という意味ではないということです。

文字クラスは「なんらかの1文字の身代わり」なので、それは何か1文字を表しています。

-』は範囲を表すのに使用します。そのため、『[;-%]』で「; - %のどれか」を表現することはできません。

-』を含める場合は必ず最初に持ってきます。すると『[-;%]』という風になります。

「; - %以外の文字」としたいならば『[^-;%]』とします。

[』や『]』、『\』を文字クラスに含めたい場合は直前に『\』を置いてエスケープします。

「『[』または『]』」であれば『[\[\]]』となります。

^』やその他の記号は先頭に置かなければいいので、エスケープの必要はありません。

.』は「改行以外のすべての文字」を表しています。

改行は『\n』で表されるため、『.』は『[^\n]』と等価です。

(ただし、正規表現モードによっては「改行も含めすべての文字」を表す場合もあります)

文字クラスにはいくつかの略記法があります。

文字クラス意味同等の表記
\w記号や空白ではない文字すべて[a-zA-Z0-9_]
\W記号や空白ではない文字以外[^a-zA-Z0-9_]
\d数字[0-9]
\D数字以外[^0-9]
\sタブや改行など、空白類とされる文字[ \t\n\r\f\v]
\Sタブや改行など、空白類とされる文字以外[^ \t\n\r\f\v]

(*間違って『\s』の同等の表記にも『^』がついていたのを修正しました)

(『\t』はタブ、『\v』は垂直タブ、『\r』はキャリッジリターン(CR、改行の一種)、『\f』は改ページ)

これらは『[a-fA-F\d]』のようにすることで、文字クラスブラケット角括弧)内に含めることができます。

「同等の表記」と書きましたが、文字をユニコードして扱うツールの場合は、上記が同等の表記にはならず、

たとえば『\d』であれば漢数字が含まれてしまったりするので注意が必要です。

選択

(A|B)』は「AまたはB」という意味です。(これを「選択」と呼びます)

(A|B|C)』なら「A、B、Cのどれか」という意味になります。

(gray|grey)』は『gr[ae]y』とほぼ等価となります。

[ae]』は「1文字のaまたはb」という意味になるので結果的に、ほぼ同じ効果が得られるわけです。

(ただし、これはgrayとgreyの違いが1文字だけだったためで、そうでない場合はこうはなりません)

気をつけなければならないのは、その順番です。

(Java|JavaScript)』で検索すると、対象文字列内に存在する『Java』と『JavaScript』すべてマッチするように思えますが、

JavaScript』は選択肢の前(左)のほうにある『Java』が当てはまってしまうため、

Script』部分にはマッチせず、『JavaScript』というマッチになってしまいます。

選択では左側が優先されるので、『(JavaScript|Java)』とすることでこの問題は防げます。

言語、ツールによっては、この問題が起こらない=順番関係なく長いほうを適用しようとするものもあります)

アンカー

メタ文字意味
^行頭
$行末
\b単語境界
\B単語境界以外

リテラル文字や文字クラスが「文字自体」にマッチするのと違い、アンカーは「位置」にマッチします。

検索する文字列が『^』、置換する文字列が『>』なら、「行頭に『>』を挿入する」という意味になります。

単語境界とは、「単語を構成する文字=『\w』に相当する文字」と「単語を構成しない文字=『\W』に相当する文字」の間の位置のことです。

regular expression.』なら『^regular^ ^expression^.』の4ヶ所に当てはまります。

\b.*?\b』とすれば単語すべてにマッチさせることができます。

しかし、「単語構成文字」が基準なので、『JavaScript』は1単語でも、『L?K?O』は1単語とは見なされません。

アンカーは位置にマッチするので、文字クラス内に含めることはできません。

^』や『$』を文字クラスに含めても、その文字自体という意味になります。

つまり、『[^$]』なら「行頭または行末」ではなくて、「『$』文字以外」ということになります。

また、『\b』は文字クラス内のみ、バックスペース文字を表す場合が多いようです。

大文字と小文字

正規表現には、大抵「大文字と小文字を無視する」というオプションがあります。

これが入っていないと「『to:』で検索しても『To:』にマッチしない」といったことが起こります。

言語、ツールによっては、正規表現の一部にのみ大文字と小文字を無視する機能があるものもあります。

例えばRubyでは『(?i:foo)』という形式を使用できます。

(?i:Ruby) Python』という表現なら、『ruby Python』や『RuBy Python』にはマッチしますが、

RUBY PYTHON』にはマッチしない、ということになります。


キャプチャと後方参照

括弧内に入れた文字列は、ある場所に記憶されます。(「キャプチャ」と呼びます)

これは『\n』という表記を使って呼び出すことができます。(nは数字)

同じ単語が2連続で出てくるもの(『merry merry』みたいなもの)を探すという場合、

\b(\w+)\b \1』とすることができます。(ここで使った『\1』を「後方参照」と呼びます)

こうすると、『\1』の部分は、『(\w+)』を使ってマッチしたものと同じものがあるものとして解釈されることになります。

括弧を何個も使う場合は、左の括弧から順に『\1』、『\2』、『\3』となります。

また、後方参照は置換文字列にも使うことができます。

つまり置換文字列内に『\1』と書けば1番目の括弧、

\2』と書けば2番目の括弧でキャプチャされたものがそこに入ることになります。

この場合、言語、ツールによっては『\n』ではなく『$n』を使う場合もあるようです。

括弧は『(foo|bar)』という選択や、『(humbert){2}』というグループ化など、キャプチャ以外にも使われます。

そのため、キャプチャに使われた数字をわかりやすくするために、キャプチャしない括弧もあります。

それには『(?:foo)』という表記を使います。

前の例であれば『(?:foo|bar)』と『(?:humbert){2}』になります。

先読みと否定先読み

「その位置の続くものを確認する」というのが「先読み」です。

対象文字列を『JavaScript Java Applet』として考えてみましょう。

Java(?=Script)』は「『Script』が後に続く『Java』」にマッチします。

(?=Script)』の部分が、「『Script』が後に続くかどうか」をチェックしているので、

後ろに『Script』が続かない単なる『Java』にはマッチしません。

(?=Script)』の部分は「後に『Script』が続く位置」にマッチしていることになります。

この例のマッチは『JavaScript Java Applet』となります。

逆に、『Java(?!Script)』とすれば、「『Script』が後に続かないかどうか」をチェックするので、

後ろに『Script』が続かない単なる『Java』にマッチさせることができます。

こちらは「否定先読み」と呼びます。

この例のマッチは『JavaScript Java Applet』となります。

言語、ツールによっては、「その位置の前にあるものを確認する」という「戻り読み」「否定戻り読み」がサポートされているものもあります。

(これは『(?<=foo)』『(?<!=bar)』という形で使います)

先読みや否定先読み、戻り読みなどをまとめて「前後読み」と呼びますが、

前後読みは位置にマッチするため、戻り読みは先読みとは通常書くべき位置が逆になります。

(?<Mozilla )Firefox』とすれば、『Mozilla 』に続く『Firefox』のみにマッチします。

強欲な量指定子とアトミックなグループ

メタ文字意味
?+直前の文字を0回または1回繰り返す(強欲)
*+直前の文字を0回以上繰り返す(強欲)
++直前の文字を1回以上繰り返す(強欲)

上のほうで?、*、+は「欲張り」だと書きましたが、「欲張り」な量指定子も“ゆずる”ことがあります。

対象文字列が『"something"』だとして、検索文字列".*"』はこれにマッチします。

しかし、強欲な量指定子*+』に置き換えて『".*+"』とするとマッチしません。

これはなぜかというと、「欲張り」な量指定子を使った『.*』の部分は、

最後の『"がなければ『something"』にマッチすることになりますが、

正規表現の最後に『"』があるために、対象文字列の最後の『"』をゆずっているのです。

しかし、強欲な量指定子*+』はゆずることがないため、

.*+』の部分が『something"』にマッチしてしまい、

正規表現の最後の『"』にはマッチできなくなるのです。

強欲な量指定子サポートしていない言語、ツールでも、「アトミックなグループ」というものが使える場合があります。

アトミックなグループでは『(?>foo)』という表記を使います。

\w?+』なら『(?>w+)』、『\w*+』なら『(?>w*)』、『\w++』なら『(?>w+)』で代替できます。

意図しないマッチに気をつける

*』の「直前の文字の0回以上の繰り返し」はよく気をつけないと、間違ったものにまでマッチしてしまいます。

リテラル文字と文字クラスは「文字自体」にマッチすると書きましたが、

-*』というような表現は、『-』や『--------』だけでなく、

『』つまり、空文字列にもマッチしてしまうのです。

なぜそうなるかというと、「0回以上」ということは「なくてもいい」ということだからです。

文字列へのマッチは、実質上「位置」へのマッチと似たようなものになります。

検索文字列を『-*』として一括置換すると、

-』や『--------』が置換されるだけでなく、

-』が存在しないすべての場所に置換文字列が挿入されてしまうことになります。

正しい正規表現を書くためには、「どう書けばマッチするか」だけでなく、

「どういう場合にマッチしなければいいか」についても考えてみる必要があります。

ワイルドカードの『*』≒正規表現の『.*

「はじめての正規表現」で、

ワイルドカードの『*』=正規表現の『.*

とありますが、これは厳密には微妙に違います。

ファイルグロブでは《*》は「任意の文字を1回以上繰り返す」

つまり、1文字以上あればなんでもいいということになります。

この意味だと、《*.*》は "foo." や ".bar" は当てはまりません。

しかし、「0回以上」であればマッチすることになります。

正規表現では「1回以上繰り返す」は、《+》なので、

「任意の文字を1回以上繰り返す」は『.+』となります。

よって、《*.*》とほぼ等価な表現は『.+\..+』となります。

これは私の勘違いでした。miauさんご指摘ありがとうございます。

「*.*」は foo. にマッチするはずだし、.barマッチしないのは、「*」がドットファイルマッチしないっていう特殊ルールがあるから・・・ですよね?

ワイルドカード(ファイルグロブ)の「*」って - miau's blog


ファイルグロブの《*》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。

*.*》とほぼ等価な表現は、正しくは『(?!\.).*\..*』となります。


最後に

正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。

\d{4}[-/]\d{1,2}[-/]\d{1,2}』で日付と思われる文字列を検索することができますが、

これは『00-0000-00-00』というものにもマッチしてしまいます。(『00-0000-00-00』)

かしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、

どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。

冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、

その辺りについては各言語、ツールの説明を参照してください。

本格的に学びたい場合はオライリー「詳説 正規表現」おすすめです。

(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)

また、PHP正規表現チェッカーですぐに試せるようです。

関連リンク



反応への応答

b:id:K-Onoさんの

なぜ増田? これでidデビューしてもいいんじゃないのか?

について。

実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、

匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。

*2008-09-23 誤記の修正と、一部加筆しました。

*2008-09-24 ワイルドカード記述を修正しました。

*2008-09-24 文字クラス記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。

*2008-09-24 「意図しないマッチに気をつける」を追加しました。

2008-09-16

キャラ診断 from TV asahi 恋愛百景

キャラ診断

恋人誕生日彼女ならどうするとおもう?

返答によって5つのパターンに分けれるらしい。 from TV asahi 恋愛百景

おもろそうだったからメモってみた。

Type2の返答が怪しいけど。

Type1: まぐろ女子

返答

とりあえずあう

外見

ストレートの髪型

トップスは白地、

GAPラルフ、アニエス

おしゃれすぎない

恋愛にたいして

奥手、基本的に受身

いい場所は?

麻布十番 CAFELIFE

http://www.k-n-p.net/cafelife/

アールグレイでも飲みながらケーキ

口説き方

好きを間接的に伝える

「○○のこと気になってたんだ」

「でも、どうして?」

チェックメイト

「君といると落ち着く」「もっと一緒にいてほしい」

NGワード

「暇」「つまらない」

Type:2 シゲキス

返答

おしゃれなお店に行く

外見

キラキラ系の流行ファッション

女を強調するハイヒール

恋愛に対して

レベルの高い恋愛を求めるハンタータイプ

恋の始まりがピークでやがて冷めていく

いい場所は?

彼女が友達に自慢できる斬新な場所

銀座5丁目のBAR MASQ

http://www.masq.jp/top.html

口説き方

意外性に弱い

サプライズで突然のプレゼント

「○○なら似合うと思って」

チェックメイト

「君みたいな素敵な女性は初めてだよ」

「君と一緒にいる時間が一番幸せかな」

NGワード

「○○ちゃんもカワイイよね」

Type:3 イージーファミリー

返答

DVDプレゼントする

外見

Tシャツジャージ

髪の毛をひとつにまとめて

大きなかばんを斜めがけ

恋愛に対して

自然体で正直

いい場所は?

公園居酒屋野球観戦

口説き方

飾らない、いつわらない

チェックメイト

「好きです」

NGワード

「女のくせに」

Type: 4 ヘビーラバー

返答

指輪などの身につけるものをプレゼントする

外見

露出が少ない

柄物を着ない

なぜか大きなかばん

恋愛に対して

顔をじっとみつめていたいタイプ

愛されるより愛したい

自分のことを愛す人に興味がわかない

いい場所は

騒がしいお店はやめておく

静かなカフェ夜景、個室を選ぶ

銀座 店(TOMORU)

http://www.rasinban-za.com/tomoru.html

口説き方

自分が4、相手が6ぐらいがいい

相手に追いかけさせる余白を与える

チェックメイト

「君の事をもっと知りたいな」

NGワード

「お前には関係ないだろ」

Type: 5 魔性

返答

ほしいものをかってあげる

外見

胸元が開いた服

小物

髪型はクルふわ

恋愛に対して

行動が計算じゃない

恋愛に執着しない、相手に気のあるそぶりが自然にできる

なかなかつかまえれな

いい場所は?

ゴルフバー 銀座 FURATTO

http://furatto.jp/

口説き方

彼女のファンになるのは禁物!!!

チェックメイト

ライバルと違う行動をみせつつ

器の大きさを見せる

NGワード

束縛するようなことを言っちゃだめ

「一生一緒にいよう」

以上5つのパターン

相手がどのパターンに属するか見極めるまでに

勝負が決まってるきがするのは俺だけか?

2008-06-21

[]もういつでもどこでもだれでもMooseでいいじゃねぇか

おれはもう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

プログラ増田のあなぐら

2008-03-19

http://anond.hatelabo.jp/20080319175618

関数引数型が組み込み型であった場合にそれをconstな参照型にすると

というところがよくわからないのだけど、

void foo(const int &bar)

ということ?このばあい参照型にする必要があるんだっけ?

2008-03-06

IE8の新機能

Internet Explorer 8 Readiness Toolkit

Activities

WebSlices

Favorites Bar

Automatic Crash Recovery

Improved Phishing Filter

2008-02-29

[]「,」と「=>」の違いについて

結論→一緒。

すまん嘘。

ほぼ同じ意味だって言いたかったの。カンマもイコールダイナリもほとんど同じ感覚で使用できる。

唯一つ違うのはイコールダイナリの左辺に置いた文字列は裸でも良いってところにある。

どういうことか?んー。


my @hoge = ( 'foo' , 'bar' );

これはカンマを使っているわけだが、当然文字列を指定する場合、シングルクォートでくくらねばならない。

しかしイコールダイナリを使えば左辺の値のみシングルクォートでくくらなくてもよくなる。


my @hoge = ( foo => 'bar' );

こういうことだ。当然こんな風にもかける(普通あまりこんな書き方はしないが)


my @hoge = ( foo => bar => baz => 'hoge' );

これらの書き方はハッシュに値を代入する際に良く使われる傾向がある。


my %hoge = (
	foo => 1,
	bar => 2,
);

しかし、気をつけなければならないこともある。いくらシングルクォートが必要ないとは言っても記号が混ざってるとその限りではない。


my %hoge = (
	10-1 => 'bar',
);

これは引き算と見なされる。10引く1というわけだ。

ドットの扱いにも注意が必要だ。


my %hoge = (
	foo.bar => 1
);

このように文字同士だとstrict環境下でエラーになる。だが数値同士ならエラーにならない。


my %hoge = (
	1.1 => 'foo'
);

この場合、「1.1」というキーが生成される。

また、vの扱いにも気をつけなければならない。


my %hoge = (
	v1 => 'foo'
);

上記は「v1」というキーが生成されるが、


my %hoge = (
	v1.1 => 'foo'
);

上記はエラーになると思いきや、エラーにならずバージョン文字列に変換されてうまく動いてしまう。

標準関数等も文字列として扱われる。


my %hoge = (
	rand  => 'foo',
	undef => 'bar',
);

関数を展開したくば()をつけると良い


my %hoge = (
	rand()  => 'foo',
	undef() => 'bar',
);

アンダーバーの扱いにも注意する必要がある。


my %hoge = (
	a_a => 'foo',
);

これは「a_a」というキーが生成され、正しく動いてくれる。が、数値同士を繋いだ場合は話が別だ。


my %hoge = (
	1_1 => 'foo',
);

これは「11」というキーになってしまう。この問題は1_1と11が等価であることに起因する。気をつけたし。


しっかし、「,」と「=>」はほぼ同じと言っておきながら「=>」を使う場合は裸の文字列の扱いに対する注意が多すぎて困る。

やはり文字列は文字列で明示的にシングルクォート等でくくるのが一番なんじゃないだろうかと思う今日この頃である。

プログラ増田のあなぐら

2008-02-16

C++で分からない事があるので丸投げ 賢い増田教えてくれえ

VC++2005使ってます。

構造体内に構造体を持たせて、その構造体が親の構造体を継承するコードを書いたんだけど

template<typename T> struct foo{
	typedef T type;
	template<typename T_> struct bar : foo<T_>{};
};

int main(){
	foo<int>;
	{ foo<int>::type a; } // 変数を定義すれば良いのかよ!?
	foo<int>::type; // error C2059: 構文エラー : '空の宣言'

	foo<int>::bar<short>;
	{ foo<int>::bar<short>::type a; }
	foo<int>::bar<short>::type; // error C2059: 構文エラー : '空の宣言'

	// error C2039: 'bar<long>' : 'foo<T>::bar<T_>' のメンバではありません。
	foo<int>::bar<short>::bar<long>;

	return 0;
}

何故か先の二例では空の宣言というコンパイルエラーで蹴られるし、最後の例に至っては継承を使って本来の目的である“入れ子構造体を必要であれば事実上無限に定義する”をしようとしているのに、これがまるでできないかの如くエラー

どういうことなんだよおおおおお 後、前は増田にcppコード書くと何故か文字化けしたんだけど、今は直ってる!中の人ありがとうGJ

2007-11-08

http://anond.hatelabo.jp/20071108142721

宗教ってのは信じることだからなぁ。そして信じるってのは都合の悪いことに目を瞑ることだもん。もう少し言えば、私が信じているFOO様が悪人であるはずが無い、という自己肯定でもある。私が信じているBAR教が人として許されないことをしているですって?そりゃ沢山人が居るんだもん中には変な人も居ますよ。

無垢だけど間違ってる人って沢山居るよ。宗教に限らない。でも、宗教と○○○は怖いな。

2007-09-09

スイブルスイーパー」でぐぐった

「fooはbarだ」と言って良いなら「fooはbarではない」と言っても良いはずだ。

たとえ「お菓子がおいしかった」とか「道で転んだ」とかたわいの無い話でも批判されなければならないのは決して特殊な場合ではないだろうし、どっちにしても、そもそも書いてる本人が決められることではない。mixi犯罪報告をして炎上する人が後を絶たないのは、自分が批判されるようなことを書いているという自覚が無い人が後を絶たないということだ。

2007-06-17

オサレBar or 小粋な居酒屋

さてさて、彼女をどちらへ連れて行くか・・・。

2007-05-02

何もかもがうまくいく夢をみた。

いつもは怖い夢しか見ないのに、何もかもうまくいく楽しいリアルな夢をみた。

・なぜか元bar bのしゅうさんと一緒に仕事してた。敬愛してる人だったからうれしかった。

トレーナーの人と軽いスパーリングをして、「もう完璧ですね」といわれた。めちゃめちゃうれしかった。

だけど、おきて夢だと分かるととてもがっかりした。

夢は夢か、、、

でもどうか正夢になりますように。(特に二番目

2007-03-28

この辺どうにかならないわけ? っていうか「ラーで圧縮して」とか言われたらRARだと思うじゃん普通。形式名の方で、LZHって言ってよ。

2007-03-18

http://anond.hatelabo.jp/20070318024337

そんなに高いお酒ではないよ

確か10yで3000円台

まぁ1回くらいBARで飲んでみてから家用に行くのが常套手段だけど苦笑

エロくないよ!エロくないんだからねっ!!

http://anond.hatelabo.jp/20070317225847

ちなみに、クッキーモンスターの話は直接関係しません。それも(好まれない)技の一つとして使えるという事ではありますが。

たとえば、ここ匿名ダイアリをみると、www.google-analytics.com にリファラ付きでアクセスし、そこからクッキーが飛んでくる。これは、今、私が書いているページでも同様だ。ということは、クッキーの値と、私のIDが関連付けできる、ということでもある。そして、私があんなブログやこんなブログを見に行った時、そこにも google analytics が設置してあれば、はてなと同様に、www.google-analytics.com にリファラ付きでアクセスし、そこへクッキーを飛ばす。

つまりそれは、

と、www.google-analytics.com にはわかってしまう、ということでもある。もちろん、www.google-analytics.com の所有者である google は、analytics のアカウント毎のアクセスしかユーザには教えないし、内部でも個人単位アクセス動向を調べるようなことはしていない、と信じている。

私には、それを確かめるすべはないが。

analyticsは、文字通りアクセス解析の仕組みなのだが、同様の事を行なっているのは、そういうサービス以外に広告サービスがある。doubleclick.net などが有名だ。彼らは、自社のサービスである広告効果アクセス動向を知るための、アクセス解析を行なう目的で使っている、はずだ。それ以外では使っていないと信じたい。しかし、あまたある広告サービスアクセス解析サービスが、

  • 本当にサイト間にまたがる動向を出していないのか?

とか

という話はある。

とか売ってるかも知れない。それを肯定する材料も否定する材料も、私はもっていない。

こういうのは tracking って呼ばれてるんだっけか。下はIPアドレスリファラの関連付けからはじまり、このクッキーで精度を高める方法、さらに JavaScript で滞在時間等も出すとかある。たしか。

で、これらは実施者からみれば、アクセス動向を正確に知りたいだけなんだよ、ブラウザの標準機能を使ってるだけなんだよ、って話だけど、アクセス側からみると、本来関連付けられる事のない、別サイトアクセスが関連付けられるのはどよ、ってなるわけだ。私がサイトAとサイトBをみていた事を、なんであんたが知ってるんだと。A店とB店で価格を見比べていた、なんて事があんたに知られるのはキモイんだよと。それってストーカーじゃないのかと。

とは言え、私の1クリックは、何千何万何百万のうちの1つだし、実名や住所と紐付いているわけでもないし、クッキーなくてもIPアドレスリファラはあるわけだし、ユーザ動向の調査が目的倫理に反するような事には使わないっていってるし、そんな悪い事をするなんて、ごく一部だろう。そもそも、そんなにうまくいくほどのものではないだろう、気にするほどの事じゃない。ともいえる。

ちなみに、この時クッキーモンスターを使うと、情報収集している主体をわかりずらくする事ができる。*.ne.jpクッキーを送ると、そのクッキーを送ってくるアクセスを逃すと、どこが送ったのかわからない。foo.ne.jp bar.ne.jp hoge.ne.jp ほかさまざまなドメインをとっておけば、関連しないと思ったアクセス間でも関連付けられる。そういう意味で、トラッキング目的クッキーである可能性は高いし、隠蔽工作を行なっているならば、ろくなものではないだろう、とはいえる。単に、CGIなどのバグの可能性もあるけれど。

ここらあたりは、論理的にできる事、技術的に妥当な所、倫理的にあるべき所、一般ユーザとして当然と思える事、行なう側が当然であるべき事が、まだまだ一致しきれていないから、良い悪いが揺らいでいて、個別事例を、一般解として、これはNG、これはOKと判断するのが難しくて、スパイウェア検知ソフトベンダ各社は、そういう部分は人それぞれですので、低いラインに併せて検知するようにしているんです、判断は自社基準です、実施側の理解不足や基準見直しなどで、随時変更します、という。クッキーは「ウェア」なのか?という事は抜きにして。

ログイン ユーザー登録
ようこそ ゲスト さん