「grep」を含む日記 RSS

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

2011-08-04

独学のプログラムエロ動画検索作ってみた

【お知らせ】2011/09/07

新しいエロWEBサービス作りました

http://d.hatena.ne.jp/uniqueweb/20110906/1315285545



プログラムは全く得意じゃないけれど最近よく見かけるようになったエロ動画検索自分でも作ってみたくて頑張ってみました。

近年、インターネットの普及によりエロ動画が自宅で簡単に見れるという素晴らしい時代になりました。

自分が若い頃はインターネットなんてものはなくエロビデオが主流でドキドキしながらレンタルビデオ屋に行き、可愛い女の子レジにいない隙を見計らってお兄さんにパッケージを伏せて空箱を渡しビデオを借りたものでした。

お兄さんにビデオ空箱を渡そうとした時に可愛い子がレジに戻ってきて焦って渡すのをやめてものすごく変な動きをしながらエロビコーナーに引き返していくなんてことも多々ありましたw

僕のお気に入りといえば「白石ひとみ」や「あいだもも」といった女優でよく借りてました。エロビを借りるということがものすごく恥ずかしい時代?年頃?でカモフラージュ普通ビデオと一緒に借りるということもしていました。それはそれは大変な思いでオナニーしてたんです

しかも、ビデオデッキ自体が貴重な時代でリビングに一台しかないのが当たり前でした。

深夜家族が寝静まってからヘッドフォンビデオを抱えリビングに行き暗がりの中でヘッドフォンテレビ差し込んでビデオ再生ボタンを期待に胸をふくらませながら押したものです。いいシーンを何回も見るためにビデオを巻き戻すんですが、ビデオを巻き戻すガチャガチャンという機械音で家族が起きてこないか?とかそれはそれはドキドキしながら見てました。一仕事終えたあとヘッドフォンを外したらジャックが外れていて大音量で喘ぎ声が響き渡っていたなんてこともありました。誰も起きてこなかったのは優しさなんでしょうか?w

さて、大分前置きが長くなりましたがエロというものものすごい技術発展させるものだと思いますエロのおかげで日本ビデオは普及しエロのおかげで日本インターネットものすごく普及したと言っていいと思います自分エロを通して技術の発展に貢献し自分自身のスキルアップになれば。という高い志を持ってこのサイト制作しました。決して自らのオナニーライフの充実と性癖を充たすため作ったわけではありません・・・

※2011.08.07 利用中のサーバーに障害が発生しているようで現在サーバー接続できない状態となっています・・・

※2011.08.07 23:53 復帰した模様です

サイト名:ヌキネーター

サイト名の由来は抜きネタからきています。抜きネーター、ヌキネーターという感じです

エロサイト制作工程日記にしてみたんで良かったら読んで下さい。そしてこのサイトを使って夜いろいろと励んでくれたら嬉しいです

では制作日記を書いていきたいと思います

サーバー選び

まず前提条件としてお金ほとんどかけたくない。アダルトサイトであるということから

サーバー選びからはいりました。

月の予算は5000円以内で考えていたのでけっこう探すのが大変でした。

日本アダルトサイトを許可している所はかなり限られていてさらにやりたいことができるのは

専用サーバーVPSしかないのでそうなると専用サーバー予算オーバーなので

VPSで探すことになり検索しまくってはじめに見つけたVPSはKAGOYAのVPSだったのですがβ版で募集を締め切っていて泣く泣く諦めました。

KAGOYAはかなり評判がいいみたいなので使ってみたかった。

次に見つけたのが○○○VPS海外サーバー日本語サポートがあり転送量の制限なしディスク容量100G

月1300円程度で借りれるということで初期設定費用に5000円程度かかりましたが借りてみました。

結果、ここは最悪でした。

  • 通信が頻繁に切れる
  • 激重
  • 借りて一ヶ月もしないうちにサービス継続が困難になりそうなのでIPが変わるとかメールがくる
  • まりに通信環境が悪すぎるとメールすると環境調査に協力してくれとメールがくる
  • 時間をかけて沢山の項目を調べて返信するも全く返答がない。

まりの酷さに1ヶ月で解約。

よく調べてみたら評判がものすごく悪い某VPS再販らしいです

お金時間をドブに捨てました・・・

もう失敗したくないと思い今度は比較的有名な海外サーバーLINODE

日本語サポートはないけれど抜群のサポートです

iptablesの設定でどうしてもうまくいかなくて拙い英語メールしてみたら

10分しないうちに返信がきました!

メールに書かれているとおりにコマンド入力したらあっさり解決。

素晴らしい!はじめからLINODEにすればよかった。

担当ブライアンはなぜか分からないけどとてもフレンドリーで親切に感じましたw

サーバー設定

LINODEは複数のディストリビューションから好きなものを選択できるので

とりあえず、64bit版を選択。

サーバー設定はほんとに面倒ですね。

一番面倒だけど重要だということで

SSH

Tripwire

chkrootkit

Clam AntiVirus

iptables

Apache

SSL

その他各種監視ツールの導入をしました。

ほんとに面倒でした。

データベース

はじめはmysqlストレージエンジンgroongaを使おうと思ったのです

初めに借りた最悪なVPSOSが32bit版だったのでgroongaがのソースが見つからずなぜかと思っていたら

どこかで見つけた記事で32bit版ではgroongaの性能を発揮しきれないということで32bit版の提供をやめてしまったらしいと書いてたので

じゃあ、sennaにするかということで最悪VPSsennaインストール

その後LINODEに変更したのでOSに64bit版を選択し念願のgroongaをインストール

しかし、調べてみると

などが理由で、結局sennaに戻して2度手間に・・・

プログラムもそれに合わせてその都度書き換えたので2度手間どころか3度手間4度手間でした・・・

senna導入はrpmでさくっといけるので簡単です

依存関係で少しはまりました。

まず

# rpm -qa | grep -i mysql

mysqlインストールされてたら削除

perl-DBIが必要なのでインストール

# yum install perl-DBI

そして下記の順番でインストール

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分おきに取得するような物を作ったことがあったのでそれほど時間はかからいかなと思ったのですがけっこう時間かかりました。

スクレイピングにはTidyhtmlSQL、それにPHP Simple HTML DOM Parserを使いました。

下記のサイトを参考にしました。

phpによるスクレイピング処理入門

SQL みたいな文法で HTML を抽出する PHP のライブラリ

htmlSQLよりアツい!?jQueryみたいにセレクタでHTMLをparse(解析)する「PHP Simple HTML DOM Parser」

つの中で抜群に使えるのはPHP Simple HTML DOM Parserだったんです

ループ処理させるとメモリがすごいことになって今回のようなスクレイピングに向いてないみたいで

結局、htmlSQLTidyの両方を使ってスクレイピングしました。

両方ともPHP Simple HTML DOM Parserに比べるとうまくデータの取得ができないことが多く残念な感じなんですが他に選択肢がないので・・・

使える順に並べると

PHP Simple HTML DOM Parser

htmlSQL

Tidy

といった感じかもしれません。

おおまかにデータを取得して正規表現で特定データを抜き出しました。

広告との連携

広告にはDMMアフィリエイトを利用しています

http://affiliate.dmm.com/link.html

利用可能な物はパッケージ画像、サンプル画像(縮小)と書かれていたのでそれに従い画像を利用。

注記に※ユーザーレビュー引用いただけません。とだけ書かれているのでそれ以外は引用ありと判断して説明文とタイトルなどを利用

女優データジャンルデータDVDデータ、を紐付けたデータベース作成検索ワードに応じて検索結果に関連する商品を表示させるようにしました。

現状、売り上げ0で意味があるのか分かりませんけどw

負荷対策とか転送量とかDOS攻撃対策とか

エロサイトということで多少はチューニングとか設定とかしないとまずいかもと思い色々調べて設定しました。

やったこと

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を参考にしました。

シンプルで使いやすいようにしようと思いこのデザインしました。

3カラム中央可変となっています

クロスブラウザ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を利用しました。

参考URLhttp://phpjavascriptroom.com/?t=ajax&p=jquery_plugin_zoom#a_zoomergallery

検索結果ページで表示される

[ここの画像]

××× の検索結果

44件中 1~10件目を表示

ここの画像の部分をクリックするとgoogleイメージ検索みたいに一覧でイメージ表示できるようにしてみました。

動画表示ページ

基本的に動画の埋め込みを許可しているサイトのみプレイヤー表示をしそれ以外は画像を表示し動画データリンクするようにしました。

埋め込み部分はあらかじめそれぞれのサイト対応したプレーヤー部分のコード記述しVIDEOIDの部分に置き換えるような形にしました。

XVIDEOSを例にすると

XVIDEOS場合かならず動画urlhttp://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

新しいエロWEBサービス作りました

http://d.hatena.ne.jp/uniqueweb/20110906/1315285545

2011-05-15

レガシープログラマ

まぁ、タイトルの「レガシープログラマ」とは私の事なんですけどね。

最近(?)外注や自社の若いのが作ってくるプログラム

    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だが)し、UNIXLINUXも使う。

もちろん、マネージドC++.netFramework)やC#JAVA、Parlも私は使うし。でも、どのプラットフォームでどの言語になっても「TRUEか?」という判定文は使ってこなかった。

で、試しに、VC2008のincludeフォルダgrepしてみたら、

#define TRUE 1

あ、ほんとに「1」だ。

処理系によっては(特に古い処理系)、

typedef bool int

なんて見かけるから、やろうと思えば「5」でも何でも数字が入ってしまうわけですよ。そこで「== TRUE」なんてやられたら、絶対に成立しないわけで。バグの温床になるんじゃないかなー、と思ってかたくなに前述の姿勢を持っていたわけです

今(最近の)言語はきちんと「BOOL」型(またはboolという名のクラス)を定義されていて、コンパイルエラーになるか、自動的に補正してもらえるのかもしれないけど、ちょっと気持ち悪い。

最近、ちょくちょく外注や若い連中と意見や話が合わず、「ああ、俺ってレガシープログラマなんだな」と思う事が多くなった今日この頃ネットワークに平気でリトルエンディアンのデータを流すとか、勘弁して欲しいLANアナライザでデータが見にくくてしょうが無い。

でもなー、何も、Windows統合開発環境だけの仕事で食っていけるとは思って欲しくないなぁ。

2010-08-28

5年以上ぐらい前のPerlcgiは駄目プログラムの見本の宝庫

5年以上ぐらい前にPerlレガシーコードで書かれたcgiって駄目なプログラムのお手本だな。

1ファイル何千行もあるcgiで、一生懸命条件分岐や関数呼び出ししながらprintしてHTML作っていくやつ。

後から他人がレイアウト変更とか不可能に近い。

同じような処理(例えば掲示板だと新規書き込み、書き込み確認、書き込み修正など)があちこちに分散してて、全部探し出さないと変更できないとか。

クラスオブジェクトに関してはそれ何?な世界

俺が今作ってるWebアプリではSmartyなどのテンプレ使ってロジックデザインの分離が当たり前なのに(ちなみにSmartyは分離がイマイチ最近は他のを使ってる)、この時代にはそんな考え毛頭なかったんだね。

拡張子cgiだったりplだったり。*.cgigrepしても出てこない処理のせいで半日つぶした。

トンでもないコーディングスタイルが広まって、まだ相当数残ってんだな。

これからのプログラマが間違っても真似しないように、定期的に話題にしてフルボッコにすべきだと思う。

2010-07-28

http://anond.hatelabo.jp/20100728220232

それは、使ったほうが分かりやすい例ではあるけど、わかんない人も多いかと思うよ。

それよりも、関数引数にするアルゴリズム関連は 正直 やめてほしい。

長めの関数の中盤ぐらいに書いてあって、その中の値がおかしいのか、デバッグするときに、関数本体がどこにあるのか、

わざわざgrepしなきゃいけないとか、時間もったいないIDEジャンプでもいいけど、IDEサポートあってもめんどうだ。無いことだってあるんだよ。

その関数が随所で使いまわされているなら、まだわかるけどね。

かいている人間は、それでいいのかも知れないけど引き継いでデバッグする方の事も考えて書いて欲しい。

 

巨大なシステムやってると、書く方は量が少ないが、デバッグする方は、システム全部デバッグしてるんだぞと。

そうならないように、モジュール化してくれるのが一番だが、どんなにモジュール化してあっても、どこで起きてるかわからないから、全部見なきゃいけないバグなんて余裕で起きるんだよ。orz

100時間ぐらい、高負荷テストしてると落ちるとかね。当て推量はするけどさ、たのむ、みんな、分かりやすく他人がデバッグしやすく書こうぜ!

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-09-24

サーベイつかれた

http://anond.hatelabo.jp/20090914132607増田です。

こんな話きいても面白いと思ってくれる人いるわけねーだろ、みたいなテーマで調べものをしてます(本業はというと不景気で自席待機中、次の派遣先は決まらないかもしれない)。自分が首になって家内ともども路頭に迷うかもしれないのに、不思議と危機感がなくて。

CiNiiサイトにいくと、とある学会誌の創刊号から何年かが全部無料公開されてて、創刊号にはなんと当時の科学技術庁長官中曽根康弘氏が祝辞を寄せてるわけです(さてどこの雑誌でしょう)。とある単語をさがしてその検索のきかない pdf を延々延々「目 grep」してます。で、二段組みなので狭い画面で見ると

  • 右側みる
  • 左側もちらちらみる
  • 右側みおわる
  • スクロール戻して左側みる

と2passかかる。疲れ目がひどくてブルーベリーサプリがありがたい。

あと JIS の規格票とかも検索するのですがこの検索がまた動きが微妙なんだ。

資料の探索範囲はストーリーが見えてくるに従って広がっているのですが、なんか自分の知識には主に理論面であちこち欠落があって、定番的教科書に何が書いてあるのか知らないままやっているもので、あちこち致命的ではないもののぼろが見えてきて、それを全部繕ってるといつまでも終わりそうになくて、しょうがないから切り捨てたりごまかしたりして、まあ本に書いてないような新事実もちょっとだけ確認はしたものの。

結局やってることはといえば、安楽椅子、もしくはマトリックス歴史家で、pdf になってないものにはほとんど手が届いてない。

そして金がないから古本をこれ以上買うのは家内の目が怖いし。

要するに、キーパーソンアポとるのが怖いんです。勉強不足を pgr れて瞬殺されるのが怖いんです。自分が持って行った新事実を喜ぶどころか不機嫌な顔で、おまえうざい、って言われてすべてが終わりになる恐怖がいつまでも去りません。円満退社したとはいえ古巣の元上司に「いまは職を転々としながらこんな金にならないことにまで手を出してます」と自己紹介するのもこわいし、要するにすべてが怖いです。

私ごときが全てを知ろうなんておこがましいんですが、何の権利があって、自分先生でもない人に質問をするのか、その根拠が見えません。

まあ恥を晒し大失敗するしかないんだろうけど。

2009-06-17

[]今昔その9

st-hatena.com なるドメインが加わっている。

% 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.

結局、*.st-hatena.com の実体(フロントエンドだけど)は b.hatena.ne.jp らしい。

2009-04-11

ありがとうございます。

http://anond.hatelabo.jp/20090408100019

ベンチを取ってみると、ハッシュの方が速かったです。

UPSERT処理SQL生成処理の汎用化に使用中だったのですが、プロファイルすると結構時間をくっていたので、key設定時まで遡って再構築したいと思います。

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;

my $item = { date =&gt; undef, type =&gt; undef, value =&gt; undef, title =&gt; undef, views =&gt; undef };
my @key  = ('date', 'type');
my %key;
my @update;

timethese(1000000, {
        use_grep =&gt; sub {
            @update = grep { my $a = 1; foreach my $b (@key) { $a = 0 if $_ eq $b; } $a; } keys %{$item};
        },
        use_hash =&gt; sub {
            %key = map { $_ =&gt; 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)

2009-04-08

Re: Perl配列Aから配列Bにある要素を取り除くには?

http://anond.hatelabo.jp/20090408034449

リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。

元のコードgrep内でリニアサーチをやっているわけですから、ここにハッシュテーブルを使うわけです。

my %key = map { $_ =&gt; 1 } @key;
my @update = grep { not exists $key{$_} } @items;

ベンチは取っていないですが、多分早いです。

ただ、その分メモリを食いますし、@itemsに対し@keyの方が長大だと、あまり効率が良くないかも知れません。

その場合、ソート済みならバイナリサーチでやってみるとか、そもそもkeyハッシュ管理するとか、GDBMやsqlite等を使って永続化するとか、keyの入手段階から検討したほうが良いかもしれません。

また、cpanを探せば色々な配列操作を行うモジュールがあるかもしれません。

Perl配列Aから配列Bにある要素を取り除くには?

@itemsから@keyにある要素を除いたリストを@updateとして欲しいのですが、

下記のコードよりも、より高速な記述があれば是非ご教授くださいませ。

my @update = grep { my $a = 1; foreach my $b (@key) { $a = 0 if $_ eq $b; } $a; } @items;

2009-02-22

http://anond.hatelabo.jp/20090222100251

正規表現って言葉すら知らないHTMLコーダには閉口した。

どうやって置換とかgrepすんの? やっぱ手打ちっすかw

2008-12-18

[]今昔その8

忘れないうちに調べてみた。

% 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 との使い分けに何か法則があるのだろうか。

2008-12-09

[]今昔その7

はてなキーワードはてなブックマークリニューアルに加え、はてラボ新サービスも始まったので、ここ半年近くの変化を調べてみた。

% 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.jphatena.ne.jpwww.hatena.ne.jp は同じゲートウェイとなっている。

漏れているホストがあったら是非とも教えてほしい。

2008-10-19

http://anond.hatelabo.jp/20081019121356

そこは増田メモなんだから別にどうこうないとおもうが。

つーか

  1. dir最強
  2. sort!uniq!
  3. cmd.exe愛してる
  4. sh知らない奴はもぐり
  5. やっぱlsだろ
  6. grepつよすぎ
  7. findあれば死ね
  8. sedないと死ぬ
  9. 俺はshを知らなさすぎた
  10. おれはUNIXいくぞ。UNIXいく。

2008-09-04

東方地霊殿価格

店ごと通販

価格 内約 特典
とらのあな 2,070円 1,470+送料600 なし
WCクレカ 2,070円 1,470+送料600 なし
GREP銀行振込 2,170円 1,470+送料490+振り込み手数料210 ポスカ ととね/画
WC代引き 2,220円 1,470+送料手数料750 なし
メッセサンオー 2,310円 1,470+送料525+代金引換手数料315 トレカ alphes/画
メロンブックス 2,310円 1,470+送料525+代引き手数料315 なし

とりあえずメロンブックスで注文は一番あり得ない

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-05-17

[]今昔その6 - 情報募集中

以下のIPアドレスに関する情報を求めています。


本社移転もあったことだし、久々に調べてみた。

今回、洩れていた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.

2008-04-16

http://anond.hatelabo.jp/20080415232005

ほんとにこの人は議論というものをわかってるのかね。一つの論点を挙げたらそれと心中しないといけないとでも思ってるんだろうか。

じゃあまず撤回するところからはじめろよ。くぐるまたぐらを激しく間違えてんだよ君は。

そういう意味でこの批判は文字通りナンセンス無意味)。「このような論点が存在する」という主張は「このような価値観こそが正しく、他は全て間違っていると信ずる」というものとは全く異なる。だいたい俺が一度でも「役に立つから良い」などと主張したか?「役に立つものだけが良いものだ」と思っている奴が相手だと想定したから、「ある特定の価値観を認めたしてもこういう論点が存在する」と言ったのだ。それのどこが、俺がその「特定の価値観」を主張したことになるのだ。

これだけ言ってもわからないとしたら、君は論理的思考というものが全くできないと言って然るべきだろうね。

なお、くぐるまたぐらを間違えたことは認めるが、それは君がどういう思想の持ち主だったかを読み違えただけだ。しかし、匿名でものを書いている君が「俺様のことを正しく理解しないとは無礼千万!」などという資格はまるでないぞ。

だいたい、文学価値社会経済的国政的有用性で測ろうなどというのがそもそも冒涜だ。

それもまた極端な価値観だな。文学は神聖にして侵すべからずというのか。芸術的にも価値があり、経済的に価値があるならなおのことよいではないか。

知的社会政治的有用性で芸術を測ってる段階で、俗物だと思うけどなあ。

じゃあ例えば君が美術館の館長で、「芸術なんて無駄なものに金が出せるかボケぇ」ってな思想の持ち主の市長によって予算が激減させられそうになったとき、彼にどう反駁するんだ?芸術に対して経済的有用性を云々するのは冒涜である、と主張して、その結果宗教論争に陥って君は解雇、職員も路頭に迷う、なんてのが理想なのか?それこそ勘違いヒロイズムもいいところだ。職員はいったいどうなるのだ。

俺、別に英語帝国でいいと思ってるけど。

これが「世に差別不正が溢れているとして、そりゃ一凡人に出来ることは少ないが、開き直って加担するような真似は俺には出来んね」といった人間言葉なんだからお笑いぐさだね。

欧米古典文化には、確かに今でも通じる知的、思想的、社会政治的意義はあるよ。

文芸的な、要は道楽としての価値は認めるが、それ以上のものはないだろ。やっぱぜんぜん違うよ。

文化を有用性で測るのは冒涜だとかおっしゃったのはどこの誰様でしたっけねえ。

日本は所詮アジアだよ。それが証拠に、自由主義民主主義もまるで精神的なところに根付いてなくて、簡単に前時代的な思想に転ぶじゃないか。

差別発言ですな。そう言い切ったあなたが19世紀の人間ならあなたはヘーゲルになれたかもしれない。だが今は21世紀なのでな。ヘーゲルの5693番煎じぐらいのことを言っても「事実関係に反する」と言われて終了。欧米先進国様にもキリスト教原理主義とか移民排斥とか悪しき伝統の宿痾はいくらでもある。

あんたがもしヘーゲルなら、あるいは丸山眞男でもいい、欧米先進国様の良い点だけに憧れを持って、悪い点を等閑視していたとしても、情報の不足として酌量された点はあるだろう。だが現代ではそうはいかないぞ。

アベレージをほどほどに高く保ちつつ、それで足りないようなエリート海外で一流の教育を受けて来い、って言ってるだけなんだが。

そんな極少数のエリートのために世界最高峰教育機関を整備するコストは、バカにならんと思うがね。

わざわざそんなことをしたってなんのメリットもないし、むしろデメリットしか想定できないと主張しているのがわからんのか。

えーと、それから旧帝大卒業生が世の中のどれだけの割合になるのか調べてからものを言おうね。

それを言うなら、そもそもFORTRANも知らんバカが情報工学を語るなw

Fortranを知らないなんて一言も言ってないのにねえ。天声でも聞こえたのかなあ。

実践的なことばっかやってんじゃねーか。お前がその実践性を理解できてないだけだ。

釈迦に説法。仮にも俺は工学修士だ。お前ごときがエラそうに言ってる話なんて学ばずとも勝手に覚えたわ。

工学は実践に直結しているに決まってるじゃないか。「実践」のレベルが違うと言っているのだ。誰が講義Emacsgrepの使い方なんか教えてるか、馬鹿馬鹿しい。時間を掛ければいつでも必要なだけ身に付けられることをわざわざ貴重な時間をいくらも割いてまで教えるわけがなかろう。

だいたい、線型代数微積も何も理解できないお前ががあのシラバスの内容を大まかにでも正確に理解できているわけがないんだがね。それのどこが君のいったような意味で「実践的」なのだ?え?

言っておくが、どっかで聞きかじったような言葉言葉として知っていることと、内容まで理解していることは天と地の差だぞ。誰かがあの内容に沿って作ってくれたライブラリを使ってコーディングすることは「情報工学」じゃないぞ。わかってんのかその違いが。

無知は罪ではないし、自分の無知を自覚できないことに同情の余地はあるが、自分が賢いと思い込むのは迷惑千万だな。

2008-04-15

http://anond.hatelabo.jp/20080415173401

反応してくれた人がイター!

ちょっと嬉しい。


> 別に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とかその辺組み合わせてどうにでもなる感じです。

ツリー構造が見える形でいろんな出力できると楽しいよね!とかちみっと思って。

2008-04-14

http://anond.hatelabo.jp/20080414082418

いや十分教養俗物だろ。情報工学関連への言及が他と比べてショボくて、ああ専門外なのねー、とニヤニヤ出来たけど。

ご立派なことだが、それじゃあどうやってこの文化格差システムを崩壊させられるっていうんだね?

そのためのハッカー、そのための非モテ、そのためのオタなんじゃねーの。

少なくとも、自分から階級格差を肯定し追認する側に回っていることを公言するような

バカな真似はしたくねえな。そういうのは腹ん中だけで後ろ暗く誇ってろ。

君が「古典なんて役に立たないから学校で教えるな」という意見を放棄するなら

俺がいつそんな主張をしたというんだか。

役に立たないし、高校教育程度じゃステータスシンボルにならんとは思ってるがな。

どう考えても違うだろ。現実問題として自国で教育の多くを賄える国の方が「国力」(経済力だと思えば)が高いのは自明じゃないか。

全然自明じゃないだろ、何言ってんだ? MIT日本にも作れってか?

本当にトップクラスエリートなんてほんの一握りだ。

外国で本当の一流を学んでもらったほうが本人のためになるし、コスト削減にもなる。

公教育が注力すべきは、普通に働く普通の人の水準を上げることだ。

一般には「自文化について語れる」ことが「教養」の前提とされているがね。

欧米ギリシャ語ラテン語古典文学重要視されるのは、それが彼らの民主主義やら哲学やら自然科学やら数学やらの源流にあるからだ。

源氏物語万葉集が何に生かせるってんだよ。葉隠でハラキリ根性でも学べってか?

欧米古典日本古典では持つ意義がまるで違うだろ。

欧米古典を読む機会をもっと作れ、というのなら、エリート主義だとか文化資本云々で不愉快には思うが、一目おける意見だとは思うぞ。

それから「基礎教養」の件だが、「覚えておいて損はない」程度のことかよ。拍子抜けした。

何に拍子抜けしてんのかしらんが、基礎教養ってなそういうもんだ。お前も言ってたろ、ジェネラルな知識がどうこうって。情報処理試験に出てくるような類の知識は、そう知的に高度でもないが、少なくとも無駄ではない。

あのさあ、なんでパターン認識とか待ち行列とかの例を挙げたと思う?こういう分野では数値計算重要になるから、基本的に低レベルに近い言語プログラムを書くことが望まれるし、似たようなプログラムを使い回すから生産性という意味でもそれで大した影響がないということだ。

そもそも俺は低水準言語の話はしてなかったと思うが?

「低水準言語で十分」という例を挙げてどうすんだ。「低水準言語が有効/必要」な例をあげろよ。機械よりの視点で細かい制御が望まれる例を挙げるべきだ。専用ハードウェアに効率的に仕事させるために、機械語レベルでの知識が必要になるケースは今でも多くある。

つまり、「基礎教養」の勉強をサボっても、君が線型代数微積をサボったほどの悪影響もないということだ。少なくとも建前上は。それでもなおかつ「必修」とされることの意義を問うている。

お前の例が不適切なだけだろ。アホか。

てっきり、「基礎教養」を学べばコンピュータの中身のイメージがしやすくなって、効率の良いプログラムを書くための感覚が身に付く

そんな印象論はしとらんし、最適化最適化で別個に学ぶべき領域だろ。高級言語レベルでの最適化の本だっていっぱいあるが。

技術者コミュニティの発展や運営のために一定の共通言語を身に付ける、とかそういう答えが返ってくると思ったし、古典を学ぶ意義をそういうところに見出すこともできる

全然違うだろ。源氏物語万葉集の読解を具体的に何に使えるってんだ。プレゼンのハッタリくらいにしかならねーんだろ?

情報処理試験に出るような基礎教養は、全部使いどころがある知識だぞ。当たり前に使いすぎてて意識してない人が多いが。

ちなみに俺が「基礎教養」で想定していたのはそうした技術の「使い方」ではなく、「考え方」の方だ。

「使い方」から遊離して「考え方」だけを煎じ詰めていくのは、プログラマレベルでの実践的な志向ではないだろうな。学問的には意義があるが。

特にOSについては基礎理論のことで、UNIXという特定のOSを扱うノウハウのことではない。大学で教えていることについて語っているのだからそれは自明だと思ったが。

あまりにもUNIXメジャーすぎる。UNIXという「特定」OSの実装から離れた所で抽象的にOSを煎じ詰めるのはかなり学問的な領域だと思うが。もう基礎とはいえないだろう。

もちろん、UNIXという実装を学びながらそこに被せる形では、OSの基本概念だとかOSI7階層モデルだとかは触るだろうけどさ。

あと、正規表現を考えるときに一々有限オートマトンなんて考えないだろう。そもそも、現状使われている正規表現は本来の意味での正規言語を逸脱してるんだから。

どう拡張されて、それで表現力がどう広がっているのか、というようなところへ、一通り形式言語を学んでない人では想像が及ばないだろう。GREPのやり方ひとつでセンスは分かるもんだぞ。

2007-12-20

[]今昔その5

正式公開&オープンプレスリリースも出たので、新しいサーバを調べてみた。

% 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は移すのだろうか?

2007-09-07

荒れてるね

台風の影響で書き込み数とか減るのかな?とか思ったので調べた。

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

2007-07-11

[]今昔その4

新サービスリリースなので、新しいサーバを調べてみた。

% diff resolve.old resolve.txt | grep '[<>]' | sort
> 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.

実はゲートウェイは一つ、英語サービスサクラらしい。

2007-06-26

[]今昔その3

さて、とうとうダイアリも移転し、すっかり寂しくなったはてなサーバ室に書き記しておく。

% 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がなくなった。他の回線も見直しするのだろうか。

- 転職ならen
- 派遣ならen
2ページ中1ページ目を表示(合計:29件)