はてなキーワード: CSVとは
Webシステムとは縁遠い事務職のリーマンが、ある日思い立って、ニッチな用途の検索エンジンサービスを作ってみたので、ちょっと書いてみようと思います。
ちなみに、検索エンジンといっても、googleカスタム検索とかのお茶濁し系じゃなくて、apache Solrというオープンソース検索エンジンを、VPS上で動かしているという、それなりに本
気度の高いものです。
なんで素人がそんな物騒なものを動かす羽目になったかは、後述。
やりたい構想みたいなことを思いついたのは、もう6、7年前ほど前のこと。初めて独り暮らしを始めたときに、ひどく不便を感じたことがあり、こんなサービスがあったら便利だなあ、
ちなみにその妄想をふと高校の同期に話したとき、そのサービスはどこにあるのか?!と、えらくがっつかれたのを、覚えてます。まあ、俺と同じく偏執狂の奴だったからだと思います
が。
ただ、しがない事務職リーマンということもあり、当然、技術も無く、そのときは、やるならこんな名前のサービス名だろうなあ、とか、そんな妄想レベルで、話は終わっていました。
そんな感じで、5年ほど月日は経ち、なんとなくリーマン人生の流れも見えてきたところで、以前、妄想していたことを、ふと思い出しました。
5年も経ったら、さすがに自分が考えたようなこと、誰かがやっているだろうと調べてみたところ、意外なことに、競合になるようなサービスは存在せず。ちょうど異動があって、少し時
間が出来たこともあり、じゃあ、着手してみようかと思い立ちました。
やりたいことは、大手サイトの情報検索。ただ、商品ページ内の特定情報、それも、商品ごとに正規化されていない表記を、正規化して抽出する必要があったので、大手サイトの既設API
だけではとても実現不可能でした。
まあ、だからこそ、5年間、誰もやろうとしなかったんでしょうが。
ということで、とても一発では解決できなさそうな内容だったので、自分でなんとか実現できそうな機能に細分化して、各個撃破していくことにしました。
随分と考えた結果、
以上に区分できると考えて、これらを各個撃破していくこととしました。
また、技術もなく、プログラミングも出来ず、ましてやlinuxサーバのお守りをしたことなんて当然ないので、インターネット上に置くサーバですべての処理を完結させるのではなく、イ
ンターネット上に置くリソースは最小限に留め、できる限り、勝手がわかる自宅のwindowsパソコンで処理を行うことにしました。
ちなみにさらっと結論だけ書いてますが、ここまで至るまでに、いろいろと調べ続たり、考え込んだりしていたので、思い立ってから3ヵ月は掛かってます。。。
さて、やる方針を決めたあと、はじめに着手したのは、要の検索エンジンサーバです。
いろいろとググって調べて、mySQLというやつか、apache Solrというやつかに絞りましたが、結局、Solrを使うことにしました。
MySQLのほうが実績は多そうだったのですが、Solrのほうが検索専門で、滅茶苦茶動作が速いらしいということ、MySQLでも出来るが特に速度が遅いらしい全文検索機能も使いたかったこ
と、あとファセット機能がジャンル絞りこみに便利に使えそうだったので、というのが理由です。
ちょうどSolr本が発売されていたこともあり、それを参考に、自分が使うように設定ファイルを変更していきました。
しかし、初めは設定ファイルの内容も意味不明な上に、私の書き方も雑なのか、少しいじっただけでまったく動かなくなる。結局、設定ファイルを一文字ずつ変更しては動作検証、とい
った始末で、進捗は地を這うよう。ある程度思い通りにSolrを扱えるようになるまで、3ヵ月以上掛かったでしょうか。。。
さらに、検索エンジンのフロントエンド(Solrの検索結果を、htmlに変換するプログラム)も書かなければならない。プログラミングが出来ない人間には、これが本当に辛かった。
Solr本に、いろんなプログラミング言語でサンプルがあったのですが、迷った末に、わずか数行なら書いた(≒コピペした)経験があるという理由で、javascriptを苦渋の選択。
しかし、選択はしてみたが、基礎が本当に無いから内容がサッパリ頭に入ってこない。こちらも、わかるところから本当に1文字ずつ変えていくといった手探り状態。
プログラミングについては、今回のためだけだから、といった理由で、一切基礎をやらずに着手したのが裏目に出たのか、サンプルのソースをモノにして、書き上げるのに、ゆうに半年
以上。本当に時間が掛かりました。
さらに、Solr周りで計9ヶ月間ハマっていた頃、忘れもしない、kanzen21のおっさんが彗星のように現れて、衝撃を受けることになります。
大手サイトのページをクロールして検索エンジンを作る手法は、私と考えていた構想の枠組みとまさに「完全に一致」な訳で。。。
図書館事件に注目していたのも同じで、あまりの一致具合に衝撃を受けっぱなしでした。
その後の成り行き等も含めて、興味深く観察させて頂き、本当に参考になりました。
そんな感じで紆余曲折もありましたが、ようやく難題だった、プログラミング関連に目処が立ってきたので、あとはクローラと肝心のデータ処理です。ここからは、勝手知ったるwindows
まず、クローラですが、専用のクローラをwindows用に探してきたり、それを設定するのも大変なので、今回はテレホーダイ時代に使っていたような、フリーのweb巡回ソフトを利用する
こととしました。指定のhtmlをダウンロードしてくるだけなので、別に変に新しいものに手を出す必要もないので。
また、ダウンロードしてきたhtmlファイルについては、これまたフリーの日本語処理ツールでcsv方式に加工することにして、処理ルール部分を相当に作り込みました。
このあたりは、全体を通して見てもキモの部分なんですが、ある意味、ちょっとしたパズル感覚だったので、プログラミング言語の部分と違って、かなり楽しかったです。
あとは、msdosのバッチファイル(これは前から知っていた)で、これらの処理を繋ぎ、cygwinのcurlとかいうツールで、連続して検索エンジンサーバにcsvファイルをアップロードする
仕組みを作りました。
検索エンジンサーバには、容量は少ないが、安くて高性能という、今回の用途にピッタリだった、さくらのVPSを借りて設定。CentOSのサーバ構築ホームページを見ながら、サーバとか
Solr管理URLとかにセキュリティを掛けて、こちらも素人ながら、意外とすんなり設定。
ホームページは、vpsサーバに相乗りさせるのではなく、別にさくらのレンタルサーバを借りました。apacheの設定方法等を習得する必要がありませんし、vpsのリソースをapacheと分け
合う必要が無くなるので。ホームページのhtmlファイル、cssファイル等も調べながら設定し、画像も準備しました。
あと、構想を思いついたときに妄想していたサービス名の.comドメインは、すでに他者に取得されていたのですが、どうも使っている風にも見えなかったので、whoisで出てきたメールア
ドレスに連絡して交渉し、幾ばくか払って買い取りました。
結局、足かけ18か月。ようやく完成。
楽天市場の家具を、幅x奥行x高さ(家具サイズ)で検索できる、楽天市場・家具カテゴリ専門の検索エンジン
この商品数規模(データ収録約30万アイテム)で、1センチ単位で家具のサイズ指定検索が可能な手段は、商用サービスも含めて、ほかには存在しないと思います。
kanzen21と違って、エロじゃないから華はないけどね。。。
ちなみに冒頭で少し書いたきっかけですが、就職して独り暮らしを開始したときに、新しい家にピッタリサイズの家具が欲しかったのですが、これが楽天で探すのは至難の技でして。
楽天で家具を探してみようと思った人には判っていただけると思うのですが、楽天では、価格では範囲指定やソートができても、サイズでは検索出来ないんです。
これは、楽天では、商品のサイズ情報は商品の自由記述欄に記載することになっているためで、商品ごとにサイズの記載方法がバラバラのため、検索が事実上、不能となっています。
家電製品とかに関しては、種類が少ないこともあり、メーカーのホームページとかでサイズを確認した上で、商品型番で検索すればいいので、それほど問題にはならないのですが、家具
って、種類が非常に多く、型番もあったり無かったりで、家電のようにサイズを調べることができません。
・・・ということで、カグサイズでは、楽天の商品ページにいろいろな書式で書かれているサイズ情報を拾って解析して正規化し、範囲指定やソートして検索ができるようにしています
。
また、単に寸法サイズを拾うだけでは、梱包サイズとか引き出し内寸とかも引っ掛かってしまうので、それらは出来るだけ排除して、商品の外寸が優先して引っ掛かるよう、アルゴリズ
ムを調整しています。
単位(センチとミリ)に関しても、商品ごとにバラバラ(単に単位だけでなく、商品説明のどこに"センチ"とか"ミリ"と記載しているかについてもバラバラです。)なので、サイズ表記
の前後の状況をみて、正しいと思われる単位で拾うようにしています。
あと、変わった使い方としては、欲しい家具の価格比較みたいなこともできます。
家具は、同じ商品でも、店ごとに型番が違ったりすることがよくあり、簡単には価格の比較が行いづらいジャンルの商品です。
しかし、型番は違っても、同じ商品なら原則、サイズは同じですから、欲しい商品とまったく同じサイズで検索をかけると、同等商品があるのかどうか比較しやすい・・・といった使い
方もできます。
と、そんな感じで、しがない事務職リーマンが作ってみた、ニッチな用途の検索webサービスを、サービスインさせて頂きました。
一般に公開されていて、誰でもアクセスできる情報でも、ニーズが有りそうな切り口の条件で検索性を高めれば、新しい価値を創造できるんじゃないかという実験です。
もしよろしければ、ぜひ、使ってみてくださいー。それでは!
----------
http://webrocketsmagazine.com/entry/20111209/html-code-generation-using-excel.html
http://mattn.kaoriya.net/software/vim/20111215034338.htm
http://d.hatena.ne.jp/takuya_1st/20111217/1324105198
真のプログラマーなら単純なHTML生成するのにテキストエディタは使わないよ。単純なHTML生成が必要なプログラマーなら、プログラムでやるでしょ。いちいちプログラムを書くのがだるい?いやいや、単純なHTMLの生成が必要なプログラマーなら、リストやディクショナリといった汎用的なデータ構造やCSVファイルといった汎用的な形式のファイルから、自動的にHTMLを出力するライブラリぐらい書いてるでしょ。わざわざ同じ作業をやるなんてめんどくさい。それにそのプログラムは他でも使うことができるしね。しかもPythonやRubyならほぼシェル感覚で使える。わざわざテキストエディタを使って同じ作業をする必要性はないね。真のプログラマーなら単純なHTMLの生成はプログラムでやるでしょ。プログラマーなんだから。
パソコンの前でPSS(いわゆるゴッド)をやる時間を確保しにくくなった自分のやり方メモ。
の一日分のテストで瞬間的に意味がでてこなかったものをtxtに書き出し、ある程度量がたまったら
に覚えられない単語を突っ込んで問題ファイル(.csv)を生成。
単語の羅列だけいれても、和訳までちゃんとついてcsvファイルになる。
・i暗記(iPoneアプリ)
ここは問題の共有ができるけれど、apsseで作成した問題を再配布するのは禁止されてるから注意。
復習時は最初に作ったi暗記用の「初期の自分がわからなかった単語カード」が結構役に立つ。
Super英単語のいいところは、クリアした章でもすぐに初期化して最初からテストできること。
■ずるっこ!を中心にしたもの■
・ずるっこ!http://zurukko.jp/
・apsse
の無視リストにずるっこ!から引っ張ってきた暗記済み単語リストをいれる。
http://www.vector.co.jp/soft/win95/util/se270425.html
あとは適当に覚えたい単語リストをapsseにつっこめば、ずるっこ!に登録された単語は除外された問題ファイルができる。
ずるっこ!にあまり簡単な単語が登録されていなくて、レベルの低い単語でも問題が生成されて煩わしい場合
http://d.hatena.ne.jp/softether/20110129
http://d.hatena.ne.jp/softether/20110204
開発者が公開してくれたこのリストが非常に役立つ。クリックしまくる。
読書猿さんがまとめてくれた記事が役立つ。
http://readingmonkey.blog45.fc2.com/blog-entry-413.html
他、多少古いけど
http://icarus.imc.hokudai.ac.jp/jugyo/huvl/
なんかは大学教授からの「願い」を感じるリストで眺めていて非常に感じ入るものがある。
覚える単語リストが「覚えた単語リスト」になったら、もちろんapsseの無視単語リストに追加。
数回繰り返すと、ずるっこ!との連携がしんどくなってくるかも?
i暗記じゃ音声がでないって?この方法じゃ発音記号もでないって?
そうなんだよ。
リスニング教材には好きなpodcastや市販の教材をあてるべきだと思う。
でも、隙間時間にボキャビルやってみたいって人にはちょっとおすすめしてみたい。いろいろ応用効きます。
http://anond.hatelabo.jp/20110306231354
答えてみるぜ。ついでに他の道具についても書いておくぜ。
俺が使っているのはコンビウエルネス社(コナミスポーツの子会社)のエアロバイクaiだ。
これ店によっては15万などと値付けがされているようだが、買うところを間違えなければ10万ぐらいだ。(Amazonでも送料無料で買える)ポイントは
と言うところだ。説明すると
このポイントは最低限重視した方がよいと言うポイントであり、この点を満たしている物というのは安価なものではほとんど無く、家庭用では俺が調べた範囲ではコンビウエルネス社のエアロバイクaiしかなかったのでエアロバイクaiを使っている。他に良いものがあればそれでもいい。
また選ぶ課程でアルインコのエアロバイクを買い、買って1週間でペダルの部分がいかれてこすれるような音がするようになり、スムーズに回らなくなった事を書いておく。それは当然といえば当然で、耐荷重100キロの奴を130キロが乗れば壊れる。決してメーカが悪い訳ではなく、選び方を間違えるとこうなるという話だ。
このほかにゴム製の防振マットは買ったりしているが、それらは住宅事情に合わせて購入すると良いと思う。
最後に、何故俺がウォーカーやマルチトレーナーの類いでは無く、エアロバイクを選んだについて書いておく。何故かと言えば、足腰への負担をさけたかったからだ。
ウォーカーなどだといくらクッションをひいても体重が足にかかってくるので過体重の奴は膝や腰に強い負担がかかる。一方エアロバイクなどの自転車運動では、サドルに体重を預けることができるのでかなり足腰への負荷は軽い。(ただゼロにはならない。ほぼゼロというと水中運動)また帰宅がよる遅くになることが多いのと、好きなことをしながら運動ができる事なども重視して今はエアロバイクをメインにしてやってる。ここら辺は何度も言うようだが自分の希望や住宅事情などを加味し、それぞれがあったものをやるのが一番だと思う。ただその場合でも「保証体重」「連続動作時間」「脈拍計測機能」の三つは要チェックだ。
このほかに道具について俺が使っている物を書いておく。
これらは別に自分でグラフを書いて記録していく気があるならこういう記録機能がついたもので無くても良いと思う。俺はそれはとてもできそうに無いし、データは継続して取得してこそ意義があると言う面もあって自動記録を選んだ。
は確実にチェックしておいた方が良い。安価な体重計だと基準100キロで110キロぐらいまでしか計れなかったり、100キロまでは100グラム単位だが、100キロ以上は200グラム単位などとなっていて毎日計測する上ではあまり役に立たないものもある。
また血圧計も、
ちなみに何故血圧計も買ったかというと、100キロ超のデブがやせていく課程では、血圧が簡単に計測でき体の状態が良くなっていくことを実感しやすい指標であるためだ。
体が大きい場合、体中に血液を送らなければならないため一部の例外を除いて心臓は高い圧力で値を送る。そのため血圧は高くなる。これは肥満が原因のものであればやせることで直る。そのためやせていく課程で血圧も落ちていき、体重と同じく知っておくとぐんぐん数字が改善していくので励みにしやすい。
このほかに何かあればわかる範囲で答えるぜ。
「こっちが金払ってるんだから、ちゃんとやってくれるだろう。システム内部までいちいちチェックしなくていいよね」って思ってると思うぞ。
「こっちが金払ってるんだから、ちゃんとやってくれるだろう。申請内容までいちいちチェックしなくていいよね」
「こっちが金払ってるんだから、ちゃんとやってくれるだろう。検査結果までいちいちチェックしなくていいよね」
姉歯とか道路保全技術センターとかの依頼担当者もそういうふうに思ってたと思うぞw
ちゃかすのは置いといて。
今までにこういうのがなかったなら「油断してたのかなー」と思うんだけれども、前もこんなのなかったっけ?
すごく単純に考えたって、外から見えるところに、しかもCSV形式で置くデータじゃないっしょ。
自分はweb関係は大昔にちょこっとかじったくらいしか知識はないけれど、それでもおかしいと思う内容だよ。
ましてや商売で、少なくないお金が絡んでるんだから、「買ったものだからわかりません」は通らないよ。
全部把握しろ、自社で作れとは言わないけどさ。
情報が漏れた人たちはどうするんだろ。電話番号は変えられなくないけど、名前と住所はなぁ。
見ちゃった人の中に知人がいたらもうオワタ。
http://gigazine.net/index.php?/news/comments/20090527_rakuten_csv/
10円で販売というのは、システムを悪意に取っているが、特定業者にはCSV形式で個人情報がDLできるようになっていたことと
http://japan.cnet.com/news/sec/story/0,2000056024,20085874,00.htm
などがあるものの、基本的にmixi本体による騒動はなし。
パスワードも平文を送ってくるなどという事は無し
DeNA : http://www.security-next.com/004849.html
モバゲー事態はセキュリティというよりも、青少年育成の観点から問題視される
はてな:有名どころではDoCoMoなどもモバイルのURLをそのまま出したために
セッションハイジャックされた件などが記憶に新しい。
悪徳商法マニアクスが悪徳商法関連の記事を書いたところ、営業妨害としてはてながクレームをもらい
GREE:ウォッチしてないので、知らんw
いずれにしろ、mixi GREE DeNAなどは、いわゆる非技術者向けサービスのためにフィッシング詐欺が憂慮されるが、
あまり、フィッシング詐欺(マンインミドル含む)にたいして強固とは言えないのではないか?という疑惑はある。
Yahooや銀行はコレに対抗するためにセキュリティーシールなどを導入している。が、やはり、マンインミドルにたいして
安全かどうかは疑問。
つか、銀行でも、行員による使い込みなどは、たまに起きるし、セキュリティーってなに?って気はする。
http://anond.hatelabo.jp/20090528203547
「楽天専用のメールアドレス」なのに、名前・住所等個人情報が入ったSPAMメールが届くという報告が相次ぎ、段々大きな騒ぎになっていく
↓
GIGAZINEがその件を紹介。
↓
(ここが重要) 疑問:以前の個人情報流出事件を受けて、楽天を仲介させることでメルアドは店舗に渡さないようにしましたと宣言してたんだからそんなことはもう起きえない筈だけど何故? http://www.rakuten.co.jp/com/faq/information/20050802/ とGIGAZINEが疑問を提示
↓
(GIGAZINEが答えを見つける) 楽天はユーザーにはそう説明しながら店舗にメルアドを見れる状態にしていた。さらに申請と許可が必要だけど金を払うとCSVでまとめて個人情報の提供を受けることも出来る。
↓
GIGAZINEが『楽天、利用者のメールアドレスを含む個人情報を「1件10円」でダウンロード販売していることが判明』というタイトルで記事をリリース。
↓
x:それを見た人がmixiやblogに「楽天がSPAM業者に個人情報を売りつけた!許せない!!」と書く
○:それを見た人がmixiやblogに「楽天は個人情報を店舗側に漏らした上で、それで商売までしている。」と書く
↓
楽天擁護派: それはCSV化手数料であって、情報に対する料金ではない
冷静:楽天がメルアドを店舗に渡さないと嘘付いていたのが問題。メルアド渡したり、販売してるのは事実だけど、情報料と見るか、システム利用料と見るかで言い分・見方は変わるよね。
慌てる派:クレカ情報までかよ!退会だ!(クレカ情報が渡っているのは例外的に認められた一部の店舗だけ)
↓
楽天が「事実の認識の誤り」と主張。事実が違うともどこが違うとも言わないので、答えになっていないよなとまだ騒ぎは続く。
↓
GIGAZINE続報待ち。
グーグル「民主党」検索の不思議◆みんなで見よう!Youtubeとニコニコ動画◆ ~Fall Season~―秋のみん見よ、始まる―
http://hyukkyyy.blog122.fc2.com/blog-entry-1113.html
今(2009/1/27 03:00:00)はもう、「民主」で検索すると普通に検索候補が出てくるんだけどね。でもさっき(0時ごろ)までは、出てこなかった。
ということで既に用無しの感もあるけど、せっかくなので検索候補をメモしてみた(CSV形式w)。手打ちなのでミスがあるかもしれないけどゴメン。
何かが見えてくると面白いのだけれど。
◆◆◆
み,みずほ銀行,5150000,みぃ,34100000,みんカラ,95600000,三井住友,6910000,三菱東京ufj,7560000,三菱,48300000,三菱電機,3810000,ミクシィ,5200000,宮崎あおい,1910000,三越5090000
みん,みんカラ,95600000,みんなの就職活動日記,665000,みんなのうた,1460000,みんなのキャンパス,410000,みんなのゴルフ,610000,みんなのfx,1320000,みんなのシネマ,898000,民事再生法,2950000,民法,8120000,ミント神戸,342000
みんし,みんしゅう,60400,民主党本部,466000,民主主義,3010000,民主党 韓国,1680000,民主党 支持母体,519000,民主党議員,825000,民宿,11600000,民宿 検索,2430000,民商,1320000,民社党,175000
みんしゅ,みんしゅう,60400,民主党本部,466000,民主主義,3010000,民主党 韓国,1680000,民主党 支持母体,519000,民主党議員,825000,民主党 前原,690000,民主党 岡田,1370000,民宿,11600000,民宿 検索,2430000
みんしゅと,民主党本部,466000,民主党 韓国,1680000,民主党 支持母体,519000,民主党議員,825000,民主党 前原,690000,民主党 岡田,1370000,民主党 政策,4310000,民主党 長妻,341000,民主党 前田,626000,民主党 沖縄ビジョン,170000
みんしゅとう,民主党本部,466000,民主党 韓国,1680000,民主党 支持母体,519000,民主党議員,825000,民主党 前原,690000,民主党 岡田,1370000,民主党 政策,4310000,民主党 長妻,341000,民主党 前田,626000,民主党 沖縄ビジョン,170000
民,民事再生法,295000,民事再生法 とは,699000,民事訴訟法,653000,民法,8120000,民安ともえ,297000,民宿,11600000,民生委員,613000,民明書房,239000,民族衣装,894000,民音,369000
民主を,民主を斬る,103000,民衆を導く自由の女神,29900
民主に,民主にいがた,14700,民主に一度、政権任せてもよい,169000,民主には政権担当能力はない,27100
民主の,民主の壁,508000,民主の平岡,140000,民主の石井,725000,民主の山岡,166000,民主の正体,295000,民主のマルチ問題,858000,民主の政党マーク,244000,民主のhp,802000
民主が,民主が政権交代を急いでいるのは一刻も早く韓国を支援したいからだ,9970,民主が政権,698000,民主が政権を取って、日本が中国の属国になるよりはマシだろ。,394000,民主が単独過半数,147000,民主が税制大綱骨格,3350
◆◆◆
ちなみに「民主党+格助詞」では、何も候補が出ませんでした。
Aというワードを入力してBを引っ張り出せなくても、Bというワードを入力してAを引っ張り出せるんですね。これは面白い。
「民主」のキーワード(NGワード)にズバリでフィルタをかけていたのかな。
そして「名+NGワード」「NGワード+名」「名+NGワード+名」もNGにした。
ただし「NGワード+格助詞+何か」で1つの慣用句のようになった(みんなが同じ言い回しをする)ワードはすり抜けた。
読み仮名経由もすり抜けた。
こんなとこ?
SP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.sp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.sp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[0]+"|"+m.music_list[i].diff[1]+"|"+m.music_list[i].diff[2]+"],"+x.level[0]+","+x.score[0]+","+t[x.flag[0]]+","+x.level[1]+","+x.score[1]+","+t[x.flag[1]]+","+x.level[2]+","+x.score[2]+","+t[x.flag[2]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
(たぶん)DP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.dp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.dp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[3]+"|"+m.music_list[i].diff[4]+"|"+m.music_list[i].diff[5]+"],"+x.level[3]+","+x.score[3]+","+t[x.flag[3]]+","+x.level[4]+","+x.score[4]+","+t[x.flag[4]]+","+x.level[5]+","+x.score[5]+","+t[x.flag[5]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
あれだなー、落ち込むなー。
世に言うデスマーチと比べりゃ、今月生理なかったけどヤバいかしら!!くらいの落ち込みなんだろうが。
なにが悪かったんだろうか。どうすればよかったのだろうか。
データの入れ替えが、上手く行っていなかったんだ。社会人二年目のぼくは、係長とタッグを組んで、お客様の現行システムのデータを、新システムの仕様にあわせて変換して、テーブルに移し変える、いわゆるコンバート作業を言い渡されていた(本当はデータ変換プログラムを作るだけだった)。
とりあえず係長の用意した仕様にあわせて……いや、違う。仕様書はなかったんだ。旧データと新データの項目の対応付けだけ、言い渡されたんだった(データ型も項目長も違っていた)。
まずプログラムの作りからして、間違っていた。実行前に踏むべき手順が、この作りだと多すぎる。とっととパンツ脱がしてズッポシ行きたいのに、昭和臭いコートから脱がしてあげなきゃならん作りになっている。手間がかかりすぎる。要は旧データをCSV吐き出し⇒CSVをSQLLorderで取り込み⇒取り込んだワークテーブルをプログラムで実データに変換⇒やっとInsert、なんてことをしなくちゃいけない。
それから変換プログラム自体のパフォーマンスだ。2年分のデータを取り込む、という作業に耐えられていない。ってか2年分もあるんスか係長、ぼくまだ学生だったころのデータなんスけど。とか言ったら鼻で笑われた。ともあれ、実行するだけで一晩かかるような処理を4本抱えていて、それを一日でやれというのだから、土台無理な話だ。時をかけるリーマン(With生成データ)にならないといけない。もっと早く動くものを作るか、もっと早く元データが用意されていなければいけなかった。
そして、作られたデータも正しくなかった。
コンバートした後で、新システム上で正常に動かなかった。これは、きっと事前にチェックできていれば回避できた。ぼくはそれをぼくの仕事ではないと思っていたし(言われたとおりのデータが用意できたかどうかの確認までしかしなかった)、他の人にしても、それを確かめる余裕がなかった。
あー。問題としては、
こういうことか。特に、重い処理を一晩で終わらせたい、というあたりと、ミスが多いというあたりが今回ぼくの三連休を奪った原因の主たる部分だな。殺す。
じゃあどうすればよかったのか。
三連休は昼も夜もなくセックスする予定だったのが、すべて駄目になった。けれどもまあ、こういう経験もいつの日かプラスに作用する日が繰るかも……
「明日から戦争だから」
「マジスか!!」
山を越えられる気がしない。
反応してくれた人がイター!
ちょっと嬉しい。
> 別に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とかその辺組み合わせてどうにでもなる感じです。
訳してみた。あらためて、和訳はものすごく時間を要する作業だということがわかった。もうしないと思う。
注意:以下は意訳、適当訳、稚拙訳であり、誤訳を多々含んでいることは確実であり、Joel氏が本当に以下のように述べているとは限りません。
なぜMicrosoft Officeファイルフォーマットはこんなにもややこしいのか (そしてその対処法を幾つか)
Tuesday, February 19, 2008
先週、MicrosoftはOfficeのバイナリフォーマットを公開したが、このフォーマットは殆ど正気でないように見える。Excel 97-2003ファイルフォーマットは349ページのPDFファイルだ。でも待って、それで全部じゃない。このドキュメントには次の面白いコメントが書いてある。
それぞれのExcelワークブックは1つのcompound fileに収められている
つまり、Excel 97-2003ファイルはOLE coumpound documentで、それは結局、1つのファイル内にあるファイルシステムである。これは、理解するのにあと9ページはスペックを読まなくちゃならないぐらいには十分に複雑だ。そしてこれらの「スペック」は、普通我々が考えるようなスペックというよりは、Cデータ構造みたいに見える。これ全体が階層的ファイルシステムなのだ。
もしあなたが週末を、Wordドキュメントをブログにインポートしたり、あなたの個人的な財務データからExcelフォーマットのスプレッドシートを生成するような気の利いたコードを書くのに使おうと思ってこれらのドキュメントを読み始めたなら、このスペックのややこしさと長さがそんな気をあっという間に失せさせるだろう。普通のプログラマはこのOfficeバイナリファイルフォーマットについて次のような結論を下す:
この4つ全てについて、きみは間違っている。ちょっとだけ掘り下げて、これらのファイルフォーマットがどうしてこんなに信じがたいくらいに複雑なのか、なぜMicrosoftの悪いプログラミングを反映しているのではないのか、そしてそれを回避するためにあなたに何ができるか、を明らかにしよう。
理解すべき最初のことは、これらのバイナリファイルフォーマットはちょっと違ったデザインゴールを持って設計されたということだ。たとえばHTMLとは。
これらはすごく古いコンピュータで速く処理できるようにデザインされた。Excel for Windowsの初期のバージョンでは、1MBのRAM、20MHz動作の80386が Excelを快適に走らせることができるための妥当なものだった。このファイルフォーマット内には、ファイルを素早く開いたり閉じたりするための最適化が沢山仕込まれている:
これはライブラリを使うことを想定して設計されている。もしあなたがバイナリをインポートするものを1から書き上げたいと思ったら、Windows Metafile Format (何か図を描く場合) や OLE Counpound Storage みたいなものをサポートしなくてはいけなくなる。もしあなたが Windows上でやるのなら、そうしたことをたいしたことのない作業にするためのライブラリのサポートが存在する... そういったフィーチャーを使うことは(元々)マイクロソフトチームのためのショートカットだった。でもあなたが全部を自分でスクラッチから書くなら、全部の作業を自分自身でやらなくてはいけない。
オフィスはcompound documentsに対して広範囲のサポートを持っている。例えば、スプレッドシートをWord文書に埋め込んだりできる。完璧なWordファイルフォーマットのparserは、同じように、埋め込まれたスプレッドシートで何かインテリジェントなことが出来るべきだろう。
それは相互協調性(interoperability)を意識してデザインされてはいない。仮定されていたのは、WordファイルフォーマットはWordからのみ読み書きされなくてはいけない、ということで、それは当時においては十分に合理的なものだった。これは、Wordチームのプログラマがファイルフォーマットをどう変更するかについて決定を行う場合にはいつでも、彼らが気にするのは (a)何が高速か (b)Wordのコードベースにおいて最小の行数になるのは何か、だったことを意味する。SGMLやHTML-interchangeableといった標準ファイルフォーマットのようなアイデアは、最初にインターネットがドキュメントの相互交換を実現するまで現実のものにはならなかった。それはOfficeバイナリフォーマットが最初に考案されてから10年後のことだったのだ。ドキュメントを交換するのにインポーターとエクスポーターを使うことができるという仮定が常にあった。実際Wordは簡便な交換のために設計されたRTFと呼ばれるフォーマットを持っており、そのフォーマットは殆ど最初のころからあり、今も100%サポートされている。
それはアプリケーションの全ての複雑さを反映していなくてはいけない。 全部のチェックボックス、全部のフォーマッティングオプション、そして全部の、Microsoft Officeのフィーチャーは、ファイルフォーマットのどこかで叙述されていなくてはいけない。Wordのパラグラフメニューにある、"Keep With Next" と呼ばれるチェックボックス、これはパラグラフを、その後ろのパラグラフと同じページに置くのに必要な場合は、次のページに移動させるもの(?)だが、これもファイルフォーマットの中に無くてはいけない。そしてこれはつまり、あなたがWordドキュメントを正しく読み込める完璧なWordクローンを実装したいなら、そういったフィーチャーを実装しなくてはいけないということだ。Wordドキュメントをロードする競争力のあるワードプロセッサを作っているのなら、ファイルフォーマットからそのビットをロードするコードを書くのには1分しかかからないかもしれないが、ページのレイアウトアルゴリズムをそれに対応させるのに何週間もかかるかもしれない。もしあなたがそうしない場合、カスタマーがあなたのクローンでWordファイルを読み込んだら、全部のページがぐちゃぐちゃになってしまうだろう。
それはアプリケーションの歴史を反映していなくてはいけない。 このファイルフォーマットに見られる多くの複雑さは、古く、複雑で、愛されず、めったに使われないフィーチャーを反映している。それらはファイルフォーマットのなかに後方互換性のためにまだあり、そしてMicrosoftにとってその辺りのコードを残しておくことには何らコストはかからない。しかしあなたがこれらのファイルフォーマットをparseおよびwriteする一貫した完全な仕事をしたいと思うなら、Microsoftのインターンが15年前にやったのと同じことを全て、またやらなくてはいけない。要点は、何千人年の仕事が今のWordやExcelには費やされてきたのであり、これらのアプリケーションの完璧なクローンを作りたいと本当に欲するなら、あなたは何千人年を費やさなくてはならないことになる、ということだ。ファイルフォーマットは単に、アプリケーションがサポートする全てのフィーチャーの簡潔なサマリーなのだ。
手始めに、小さな例を一つ、深く見てみよう。Excelのワークシートは色々なタイプのBIFFレコードの集まったものだ。私はスペックの一番最初のBIFFを見てみたい。1904と呼ばれるレコードだ。
Excelファイルフォーマット仕様のこのレコードについての記述は非常に曖昧なものだ。そこでは単に、1904レコードが「1904日付システムが使われているかどうか」を示すレコードだ、と述べているだけだ。ああ、使えない仕様書の典型的な一例だ。あなたがExcelファイルフォーマットで何かしている開発者で、そしてファイルフォーマット仕様にこう書いてあるのを見つけたなら、あなたがMiocrosoftは何かを隠しているのだと結論付けたとしても無理はない。この情報の断片は十分な情報をあなたに与えはしない。あなたには幾ばくか外部の情報が必要で、私は今ここで、それを提供しよう。Excelワークシートには、2種類ある。日付のエポックが1900/1/1のもの(これには、Lotus 1-2-3 との互換性のために故意に入れられた閏年に関するバグがあるが、ここでそれについて述べるのは退屈すぎる)、および、1904/1/1のものだ。Excelは両方をサポートしているが、それはExcelの最初のバージョンはMac版であり、それは単に簡単だったという理由でOSのエポックを使っていて、しかしWindows版のExcelは1-2-3のファイルをインポートできなくてはならず、そしてそれは1900/1/1をエポックとして採用していたからだ。あなたが涙ぐむのも無理はない。歴史のどの時点においても、プログラマが正しいことをしなかった、という時はないのだが、しかし現実にあなたが手にしているものはこれなのだ。
1900と1904のファイルタイプは両方とも世の中には広く存在しており、それは通常、ファイルがWindowsとMacのどちらで作られたかによる。一方のタイプから他方のタイプへ黙って変換するのはIntegrity的に問題があるので、Excelはファイルタイプを変換することをしない。Excelファイルをparseするためには、あなたは両方を扱わなくてはならない。それはファイルからこのbitをロードするだけの問題ではなく、あなたが日付表示と両方のエポックを扱うparsingのコードまで書き直さなくてはいけないということを意味する。実装には何日かかかるだろうと私は思う。
実際、あなたがExcelクローンの作業をするなら、日付の扱いについて、あらゆる種類の微妙なディティールを発見することになるだろう。Excelは日付の値をいつ変換するのか? 表示の整形はどうやっているのか? なぜ1/31は今年の January 31と翻訳され、また一方で1/50はJanuary 1st, 1950と翻訳されるのか? Excelのソースコードと同じだけの量のドキュメントを書かないがぎり、振る舞いに関しての微妙なビットを全て完全に記述することはできない。
そしてこのレコードは、あなたが扱う何百もあるBIFFレコードの最初の1つに過ぎず、しかももっとも単純なものなのだ。他のレコードの殆どは、より多くのプログラマーを涙に暮れさせるぐらいには十分複雑だ。
唯一導き得る結論はこれだ。
MicrosoftがMicrosoftとOfficeのファイルフォーマットをリリースしたことは大変有用なことだが、しかしそれでOfficeファイルフォーマットをインポートしたり保存したりするのが楽になるということは全く無さそうだ。それらは狂気じみて複雑で、リッチなアプリケーションで、そしてあなたは人気のある20%の部分を実装して80%の人々を幸せにするというくらいのことしかできない。バイナリファイル仕様によってなされるのは、多く見積もっても、著しく複雑なシステムのリバースエンジニアリングにかかる時間を何分か削減するくらいだろう。
オーケー, 私はいくつか回避法を教えると約束した。良いニュースは、殆どの良く知られたアプリケーションにとって、Officeバイナリファイルフォーマットを読み書きしようと試みることは誤った決定だということだ。あなたが真剣に考えなくてはいけない代案が2つある。Officeそのものにそれをやらせるか、書き込むのが簡単なファイルフォーマットを使うかだ。
ヘビーな仕事はOfficeにやらせよう。WordとExcelは実に完全なオブジェクトモデルを持っており、COMオートメーションの手段が可能で、これであなたは何でもプログラムでやるようにできる。多くのシチュエーションでは、Office内のコードを再利用するほうがそれを実装しようとするよりも良い。ここにいくつか例がある。
この手のアプローチは、全ての種類の一般的なOfficeタイプについての、サーバ上であなたがやりたいと思うであろうアプリケーションで、うまくいくだろう。例えば:
これらのケースの全てにおいて、Officeオブジェクトにインタラクティブ動作でないことを教えてやる方法があり、だから表示をアップデートするのに煩わされたり、ユーザに入力を促す必要はない。ところで、このようなやりかたでいく場合には、gotchas(?)がいくつかあり、そしてそれはMicrosoftは公式にサポートしているものではない。だからあなたがそれを始める前にはKnowledge baseの記事を読むように。
書き込むファイルにはもっとシンプルなフォーマットを使いなさい。単にOfficeドキュメントをプログラムで生成したいなら、殆どいつでもOfficeバイナリフォーマットよりももっと良いフォーマット、WordやExcelでも問題なく開くことができるようなフォーマットが存在する。
いずれにせよ、全てのOfficeファイルを完全に読み書きできるような、文字通りのOffice競合製品を作ろうとする(その場合には、何千年もの作業があなたに予約される) のでない限り、Officeバイナリフォーマットの読み書きをするというのは、何であれあなたが解決しようとしている問題を解決するためのもっとも労働集約的な方法だ。
時間があったので電話でちろりと問い合わせてみた。
派遣だかアルバイトだかの女の子を問い詰めても可哀相だなと思うので、
電話番号が漏れたみたいだが、どうせネットショップに出してる名前と電話だから仕方ないや。
(セールスの電話が掛かってくるのはこういう所から纏めて漏れてるのかな??)
担当者が変わった。
この度、当社の広告主のご担当者様情報を含む業務関連情報が、ファイル
交換ソフト「Winny」を通じてインターネット上に流出したことが確認されました
ので、以下の通りご報告申し上げます。
その前にこのwinnyで流出したという表現が疑問だったので、
ウイルスに感染したというのでなければ意図的にもらしたということになる。
そういうことですか?と聞いた。
そしたら的外れな答えが返ってきたのだが、その答えが驚くべき回答だった。
派遣がフリーメールのアドレスに自宅にデータを添付送信してwinnyで漏れたということ。
いやいやいやいや、ちょっとまて。
それはwinnyでなくてもフリーメールで送ってる時点でデータ漏れしてるだろ。
やっぱりどんな形式で漏れたのか気になる。
おまけ
平素はXXXXXXXをご利用いただき、誠にありがとうございます。 この度、当社の広告主のご担当者様情報を含む業務関連情報が、ファイル 交換ソフト「Winny」を通じてインターネット上に流出したことが確認されました ので、以下の通りご報告申し上げます。 このような事態が発生し、広告主の皆様に多大なるご迷惑とご心配をおかけ しておりますことを深くお詫び申し上げます。 1.流出した情報 広告主ご担当者様情報を含む業務関連情報が流出いたしました。 ご担当者様情報は、弊社の管理画面をお使いいただく際にご登録いただい ているご担当者様の氏名、Email、会社名、会社住所、電話番号等です。 ご登録いただいたパスワードおよびクレジットカード番号、銀行口座など一般 の方が入手して悪用できるような情報は含まれておりません。 なお、情報の流出が確認されたお客様のアカウントは以下となります。 XXXXXXXXXXXXXXX 2. 経緯 当社に2007年8月まで勤務しておりました元派遣社員が、自宅で作業をする ために広告主ご担当者様情報を含む業務関連ファイルを無断で自宅の個人 所有PCに保存しており、この情報がファイル交換ソフト「Winny」のネットワーク 上に流出いたしました。 3. 再発防止策 弊社は、これまでも、お客様の情報の保護を図るため、社内規程の制定をは じめとする安全管理体制の整備、アクセス制限やデータの保管ルールの徹底 等によるセキュリティの強化、従業員に対する継続的な教育研修、といった 種々の安全管理措置を講じて参りました。しかし、今回このような事態が発生 したことを厳粛に受け止め、従業員教育をこれまで以上に徹底し、退職や契約 終了時の情報漏洩対策を含む情報セキュリティ管理体制を一層強化すること により再発の防止に努め、お客様からの信頼の回復に全力を尽くして参ります。 4. 本件に関するお問い合せ このメールの返信にてお問い合わせいただきました場合には、ご返答までに かなりのお時間を要する可能性がございます。お問い合わせに関しましては、 下記フリーダイヤルにいただきますようお願い申し上げます。 フリーダイヤル: 0120-XXXXXXXX 受付時間: 9:00??18:00(土日祝日は除く) なお弊社では、情報流出が判明した場合、原則速やかに公表する方針として おります。しかし「Winny」を介しての情報流出の場合は、IPA(独立行政法人 情報処理推進機構)の指針を参考とし、公表を控えるという方針をとっておりま す。これは「Winny」の特性上、公表することによりお客様の情報が伝播する可 能制が高まり、更なるご迷惑をおかけする可能性も高まるからです。 今回の件は、この方針に基づき公表を控え、お客様に個別にご連絡を差し上げ ております。 この度は、広告主の皆様の情報が流出する事態となり、ご心配とご迷惑をお かけしておりますことを重ねて深くお詫び申し上げます。
http://anond.hatelabo.jp/20070313163701
そう思ったらid:kibashiri先生がまとめてくれていた。
http://d.hatena.ne.jp/kibashiri/20060501
理系らしくコピペ→置換を駆使してcsvに→エクセルでソート→集計。
衆議院480名 12.29%
医学部 7 歯学部 1 工学部 25 工学化学科 1 理工学専攻 1 旧制大阪高等医学専門学校 1 農学部 8 薬学部 4 理学部 2 理工学部 9
参議院242名中(15.70%)
医学専門学群 1 医学部 11 工学部 9 歯学部 1 地球環境科学 1 理工学 2 農学部 9 薬学部 2 理学部 1 電気工学科 1
ここまでやってからkibashiriさんのところに既に理系について纏まってた。がっくときたぜ。