はてなキーワード: DSLとは
2ちゃんねるで女叩きがあったことは筆者自身見て知っているが、なぜそのような空気感が醸成されたのか?についてはニコニコ動画登場以降にインターネットへ新規参入した筆者にはわからない
便乗して、現時点で四十台の人間の視点からインターネットの文化の変遷について書く。
ごく普通の家庭からインターネットに接続するようになったのは 2000 年を過ぎた頃のことで、それ以前のインターネット参加者は限られていた。
あたりが主。
インターネットを利用するにあたって費用のハードルがどれくらいだったのか。
1990 年台の中頃では平均的なパソコンの値段が 30 万円前後くらいで、ガチなユーザなら 80 万~ 120 万円くらい (周辺機器を含む) は出してた。
回線はダイアルアップだったりするのでそれだけでも通話と同じ料金 (最低で三分十円、アクセスポイントまでの距離次第でもっと高額) がかかる。
バブル経済の残滓がまだ残っている時代ではあったが、普通の家庭でそれだけの額を出そうという人はそんなに多くなかっただろう。
テレホーダイサービスが始まってもそれが全国的なサービスとして提供されるまで少し時間がかかった。
2000 年を過ぎた頃にインターネットが急成長しはじめた。
この頃には田舎でも DSL 回線がまあまあ利用できるようになった。
女性が増えたというよりはインターネット人口そのものが爆発的に増えた。
私にとって「インターネット黎明期」とは 2000 年より前のことを指す。
(私の文章ではこの定義に基づいて「黎明期」と述べていると解していただきたい。)
私が用語を定義するなら 2000 年から 2010 年あたりを (日本における) インターネット成長期とでも呼ぶだろう。
私個人の経験で言うなら、このインターネット急成長前にも女性ユーザはいたが特に厄介だったという記憶はない。
インターネット急成長以後の新参のインターネット参加者は男女関係なくリアルの感覚をインターネットに持ち込んでいた。
ただ、元々の「リアルの感覚」が女性は「話題」ではなく「人」で分けがちなんだと思う。
話したい人には何でも話してあまり話したくない人とはやりとり自体をひかえ、場所ごとに違う話題を取り上げるという感覚が希薄なように見える。
あるスレに馴染んだらそこの人と仲良くなった気分になって別の話題でもよいと思ってしまったんだろう。
そこの人たちと仲良くなろうという意識はあったし、仲良くなるまでは何でも話そうという感じでもなかった。
id:toshimasaki 弱者女性は男性の性欲や支配欲を満たす存在として需要があるが逆はあまりないというだけの話。知的精神に問題があっても体が元気ならセックスできるし子どもも産ませられる。言いなりにもさせやすい。反吐が出るが。
https://b.hatena.ne.jp/entry/4698582318593596514/comment/toshimasaki
[だっからさああああああああああ いったい何回説明したら気が済むん??? ]
https://b.hatena.ne.jp/entry/s/anond.hatelabo.jp/20210216171259
世に多数いる「障害・問題持ち女性と健常男性」カップル・夫婦の男性は「性欲や支配欲を満たすために付き合ってる」となんの根拠もなく決めつけ侮蔑する偏見に満ちた、この酷すぎるブコメがトップブコメ。
これ書いたid:toshimasakiとスター付けた連中、世に多数いる「障害・問題持ち女性と健常男性」カップル・夫婦すべてをバカにして侮蔑してる自覚あるの?
直接侮蔑された男性だけでなく、「こんな素敵な彼くんが」とニコニコ顔の女性に「お前のパートナーはお前に対して愛でなく性欲と支配欲で付き合ってんだぞ。お前の頭がアレでも体はセックスできるし孕めるし、頭アレで寧ろ言いなりにさせやすいから付き合ってんだぞ。」と顔に泥ぬりたくってる自覚あるの?「障害・問題持ち女性と健常男性」カップル・夫婦の当事者がこれ読んだらどんな気分になるか想像した上で書いてスター付けてるの?
本気でそう思ってるなら、障害・問題持ち女性を男の性欲・支配欲から守るために、障害・問題持ち女性に対し「あなたと付き合おうという男なんて、みんなあなたの体目当てで、セックスして孕ませて言いなりにするために近寄って来てるんだよ!みんな拒絶して!」と堂々と社会運動として呼びかけてみろよ。できないだろ。
それは「あんたらみたいな女にまともな男が近づいてくるはずがない」という偏見そのものだもの。
そういう偏見が自分にあること自覚してる?自覚してるだろうね。匿名でないとこんなブコメ書いて支持できないもんね。
それとも、「女性は恵まれてる存在であってはならず、常に搾取され虐げられる哀れな存在でないといけないんだ」というジェンダーバイアスで反射的にブコメ書いてスター付けちゃったのカナ?
まあそのほうがフェミニスト的には都合いいよね。弱者・被害者ポジションは最強で、常に他者に一方的に要求をつきつけて、何の義務も負わず責任もとらなくていいもんね。楽だよね。心地いいよね。「守りたい、このポジション」とつい口が滑って本音が出ちゃうのも仕方ないよね。
女性性が優位な「弱者・被害者」ポジションを維持するためなら、当事者を侮蔑することに何ら躊躇しない、それがはてフェミなんだね。
軽蔑するよ。
greenT トップコメ、鬱をケアする彼くんの漫画を見るたびにこいつは性欲や支配欲で女を手に入れたんだなって想像しながら読んでるのか。歪みがすげえな
これな。
2/17 16:30時点でこの侮蔑ブコメにスター付けてる歪みがすげえ連中、スター消す前に保全しとく。
damonon
damononさん がスターを付けました。
skgctom
nicoyou
Cottonton
Cottontonさん がスターを付けました。
tswi
tswiさん がスターを付けました。
baronhorse
baronhorseさん がスターを付けました。
wanimiho
wanimihoさん がスターを付けました。
binbocchama
binbocchamaさん がスターを付けました。
kralica
kralicaさん がスターを付けました。
kralica
kralicaさん がスターを付けました。
hitoyo14142
hitoyo14142さん がスターを付けました。
kutabirehateko
kutabirehatekoさん がスターを付けました。
utabuti
utabutiさん がスターを付けました。
nacady
nacadyさん がスターを付けました。
Qalicen
Qalicenさん がスターを付けました。
Qalicen
Qalicenさん がスターを付けました。
sinsara
sinsaraさん がスターを付けました。
kamezoo
kamezooさん がスターを付けました。
lenore
lenoreさん がスターを付けました。
lifeisadog
lifeisadogさん がスターを付けました。
pufi
pufiさん がスターを付けました。
pikopikopan
pikopikopanさん がスターを付けました。
pikopikopan
pikopikopanさん がスターを付けました。
pikopikopan
pikopikopanさん がスターを付けました。
hyoutenka20
hyoutenka20さん がスターを付けました。
Arturo_Ui
Arturo_Uiさん がスターを付けました。
AODeath
AODeathさん がスターを付けました。
AODeath
AODeathさん がスターを付けました。
Mofuyuki
Mofuyukiさん がスターを付けました。
LaNotte
LaNotteさん がスターを付けました。
tttkm
mobile_neko
mobile_nekoさん がスターを付けました。
napsucks
huta-ai
rshi
rshiさん がスターを付けました。
grandao
grandaoさん がスターを付けました。
shimajitan
shimajitanさん がスターを付けました。
MiG
MiGさん がスターを付けました。
tutumisuke
tutumisukeさん がスターを付けました。
ikanosuke
ikanosukeさん がスターを付けました。
chinachang
chinachangさん がスターを付けました。
usaginokainushi
politru
politruさん がスターを付けました。
m4i
m4iさん がスターを付けました。
aaaaaaaaaa10
aaaaaaaaaa10さん がスターを付けました。
stk132
stk132さん がスターを付けました。
melion
melionさん がスターを付けました。
yetch
yetchさん がスターを付けました。
tsubaki315
tsubaki315さん がスターを付けました。
hamu_start
hamu_start
hamu_start
hamu_start
hamu_start
arcom
kerokeropippi
kerokeropippiさん がスターを付けました。
kinnosabakan
kinnosabakanさん がスターを付けました。
shiju_kago
shiju_kagoさん がスターを付けました。
birnamwood
birnamwoodさん がスターを付けました。
iroha2_hohe
iroha2_hoheさん がスターを付けました。
kuroi122
kuroi122さん がスターを付けました。
amtmt
センスの無い奴の問題は、知識がないことではなく、頭がおかしいことなんだ。
これは後天的に直せない。そして、センスのないプログラマは他人に迷惑をかける。だから、センスのない奴はプログラマになってはいけない。
こんなのは誰でも書ける。身長(m)と体重(kg)を受け取って、(体重)÷(身長*身長)を計算して出力するだけだ。
GUI等をつけたとしても、総コード行数10数行で実装できるだろう。
ところが、センスのないやつは全く違うことを考える。
彼らの一部は、BMIを計算するプログラムを作るのに、なぜかユーザー登録画面を作ろうとする。
そして、身長と体重のほかに、年齢や性別などの様々なパラメータを管理できるようにし、それらのパラメータを日ごと、あるいは週ごと、あるいは月ごとに入力できるようにし、指定期間での推移をグラフで表示するシステムを作り出す。
ユーザーごとに管理するパラメータの種類は増減するため、BMIを計算する場合、「身長と体重はどのフィールドに格納されているか」というような間接的な情報が必要になり、それを記載した設定ファイル等を読み取る別のプログラムを作り出す。
BMI以外の様々な指標を計算させるために、設定ファイルに書ける独自のDSLのようなものを作り、パラメータ同士の加減乗除や、指定した期間の移動平均などを計算できるようにする。
データ定義にもとことん拘る。単位を何にするかとか、グラフで表示したときに何色にするかとか、軸に単位を表示するかとか、スケールからはみ出したときにどう表示するか等のありとあらゆる情報を各パラメータに対して定義できるよう設計する。
こうして出来上がった巨大なシステムは、身長Hと体重Wを入力すると、W/H*Hの結果を表示するためだけに使われる。
既に述べたように、ここで問題なのは、彼がYAGNI(You Ain't Gonna Need It.)という原則を知らないことではない。
「普通の開発者ならあえてそんなことはしない」ということを自然に行ってしまうこと。これが本質的な問題なのだ。
ちなみに、センスのない奴の頭のおかしさというのは、本当に常軌を逸している。だから、読者がすっと腑に落ちるような例を挙げることは極めて難しい。
たとえば、「数学ができない生徒がいる」という現象を説明するためには、「計算問題は解けるが、文章問題は解けない」というような類型を示すことができる。しかし、「センスのないプログラマ」は、常人の世界観を超越しているので、そういうシンプルな例示や説明ができない。上に書いたたとえ話ですら、実在する彼らに比べれば、まだマシなのである。
グラビアのスキャン画像を蒐集する趣味を楽しんでいた時期がある。
グラビアと言っても日本の週刊誌やアイドル雑誌のグラビアではなく、主に海外のソフトコア雑誌やセレブ誌のグラビアである。
飽きてやめてしまうまでの数年間、日本人の同好の士とは出会えなかったので、たぶん日本人でそれをしていた人はごく少数だったんじゃないかと思う。
自分はただのエンジョイ勢だったのでそれほど深い知識があるわけじゃないけど、日本語の文献も見つからないようだし、思い出としてちょっと書き留めておこうと思う。
だいたい20年くらい前の昔話。
よくわからないが、Online Scan Collection とか scanz(warezのノリ?)と呼ばれていたと思う。
スキャナーと呼ばれる職人が配布する画像ファイル(主にグラビア)をコレクターが集めたり、コレクター同士でトレードしたりする遊び。スキャナーはコレクターを兼ねていたりもするし、コレクターがスキャナーとなって配布を始めたりもする。
配布される画像はスキャンと呼ばれる。紙媒体で売られている雑誌のグラビアを高解像度のフラットベッドスキャナで読み取り、もとが印刷物であったことなどわからないくらい美麗にレタッチされたJPEG画像である。600dpiクラスのスキャナと高機能のレタッチソフト(ほぼPhotoShop一択)がたぶん必須。
題材は大半がセクシーな女性のグラビアで、ヌードでもPLAYBOYやPENTHOUSEに載る程度のおだやかなもの。水着、下着姿のものも多い。が、たまに美しい風景のシリーズがあったりもする。
画像の片隅にはそれを作ったスキャナーのシグネチャ(かっこいいアイコンなど)がウォーターマークとして付される。
あ、上で「日本人はごく少数」と書いたが、おそらく日本人だろうというスキャナーはいた。中でも印象に残っているのは Kuni Scan という2万枚ほどのシリーズで、題材が日本のグラビアだったし名前からして日本人だろう。Kuni Scan で画像検索すると今でも彼の作品の一部を見ることができる。
今でもそうだが印刷物をスキャンして配布するのは明白にコピーライト違反であるし、ことに題材が肖像権にがっつり抵触していることもあって、一次配布はきわめて目立たないかたちで行われていた。
スキャナーたちが「新しいのできたよー」と最初の配布を行うのはおそらくIRCチャンネルだったと思う。自分は外人たちと英語でリアルタイムのチャットをする自信がまったくなかったのでIRCにはほとんど近寄らなかった。なので一次配布の現場のことはよく知らない。
当時はimgurのような匿名画像アップロードサイトなどもなかったのでこのような個人間のやりとりで配布が行われていたのだろうと思う。
この時、スキャナーは画像とともにスキャンリストも一緒に配布するのであるが、それについては次で述べる。
スキャンは数十枚~100枚程度のテーマを持ったシリーズとしてリリースされる。テーマはモデルであったり、雑誌であったり様々。
最新リリースには必ずそのシリーズに含まれるファイルの一覧を記したCSVが添えられる。
リストに記されているのは [ ファイル名, ファイルサイズ, CRC32 ] の3項目(CRC32はファイルの指紋のようなもので、データの同一性を確認するのに用いられる通信技術)。
この3項目が一致していないとオリジナルデータと認められず、集めたことにならない。
たとえばWebで目当てのファイル名の画像を見つけたとしても、それが何者かの手によってリサイズされていたり再圧縮されていたりするとCSVと数値が一致せず、コレクションに加えることができない。
シリーズには継続中のシリーズとすでに完結したシリーズがあり、CSVファイルに[finished]といった名前がついているのが完結したシリーズである。これに載っているスキャンを全部集めたらコンプリート。
CSVはこんな感じで今でも配っているのを見つけた。
http://www.scancollections.com/CSV/list_csv.php
(私がかつてひとつだけスキャナーとして配布したシリーズも含まれていた。なんだかうれしい)
一次配布時にIRCを通じてスキャナーから直接手に入れることのできなかったスキャンは別の手段で探すことになる。
Webにアップされているものを探したり、同好の士とトレードしたり、alt.binaries(ニュースグループ)でも交換が行われていたように思う。
私は主にWebサイト経由で集めていたのだけれど、当時個人ホームページの割り当てボリュームは数MB程度がふつうだったので、スキャンをアップしてくれるサイトも古いものはどんどん消されてしまった。しかも1枚1枚がやたらでかい。今でこそ一辺が1000ピクセル以上あるような大きな画像でも表示は一瞬だけれど、DSLすらなかった時代の混み合うテレホーダイのISDN回線では300KB程度のJPEGでも上からじわじわ表示されてくるのを待つ感じだった。
海外の同好の士からトレードを持ちかけられることもあった。トレカの要領。ロシアや台湾のコレクターと、お互い非母国語の英語でたどたどしく「おまえこれ持ってるか」「おれのこれやる」とトレードのやり取りをするのである。基本は1:1で持ってないもの同士を交換というタテマエだけど、自分は持っているものは気前よく差し上げていた。ドイツのコレクターとはたまたま音楽の趣味が合ったのでしばらく文通してたな。
そうやって新しく手に入ったスキャンがあると、コレクションマネージャーみたいなソフトを使ってCSVと照合する。CSVと一致しないデータを取り除いてくれたり、リネームやフォルダ分けを自動でやってくれたりするスキャンコレクションに特化した管理ソフトがあったのである。
自宅のネット回線をFTTH常時接続に変えたとたんにコレクションがつまらなくなった。
どんなサイトも画像もピュンピュン一瞬で表示されるし、コレクションがウン千枚詰まったZIPファイルですらたちまちダウンロードされて、「苦労して一生懸命集める」という手応えがなくなって、「やりがい」がなくなってしまったのである。
DSL、常時接続の普及にともなってネット上には高解像度データがあふれるようになり、スキャンでしか見ることのできなかった美麗画像の希少性がどんどん下がっていったこともあると思う。
「それ俺もやってた!」って人いますか?
日経xTECHの元記事を読んでもCOBOLの特徴があんまり伝わってこない感じだし、かといってそれをディスってもしょうがないので、書いてみた。
https://anond.hatelabo.jp/20190205192741
COBOLは本質的にはDSLなんだけど、一見汎用プログラミング言語に見えてしまってRubyやPythonなんかと比較するのが誤解のもとではあると思う。今の人でも知ってそうなCOBOLに似ている言語はたぶんSQLで、データを処理するための専用言語。ただ、SQLは頑張ればすごく複雑なこともできるパワフルな言語で、だからこそ現代でも生き延びているわけだけど、COBOLはわりとシンプルなデータ処理を想定している感じ。
SQLだけでアプリケーションを作れないのは触ったことある人なら誰でもわかると思う。普通はJavaやRubyで全体の流れを記述してデータベース入出力をSQLで書く。COBOLもそんな感じで、全体の流れをJCLやShellスクリプト、あるいはJP1のような運用管理ソフトで書く。SQLの1個の処理に相当するのがCOBOLのコンパイル単位で、それごとにソースファイルが分割される。ひとつのソースファイルに2個以上の処理を書くこともできるけど普通はしない。ここまで理解すると古いCOBOLに1ファイル内のすべての処理に影響するグローバル変数しかないのや、今のCOBOLにコンパイル単位をまたぐ真のグローバル変数がないのも、それほどクリティカルではないことがわかると思う。もし、本当に複数の処理にまたがる値が必要なら、データベースに格納してしまえばいいんだし。
で、SQLでいうところのデータベースに相当するのがCOBOLではデータファイル。sedやawkでテキストファイルやCSVファイルを行ごとに処理するのとちょっと似てるけど、COBOLの場合は固定長ファイルという点が違う。改行文字は入ってなくて、たとえば150バイトごとに次のレコードみたいな形式。これの1レコードごとに何月何日何時に〇〇という商品を□□円で売ったとか書いてあるのが典型的なデータの内容。それを集計して今日は〇〇が何個売れて売上がどれだけあったとか、出金合計がいくらで入金合計がいくらで、みたいな財務諸表を作ったり。SQLと同じように税率なんかが書いてあるマスタデータと、日々の売り上げが書いてあるトランザクションデータがあって、突き合わせたりということもする。こういう集計処理だからUIはなくて、夜中に自動起動するようなバッチプログラムが主な使われ方。(混乱するから余談だけど、今のCOBOLはSQLを使って普通のRDBにもアクセスできる。ただ使い方としては、RDB→ファイル処理→ファイル処理→ファイル処理→ファイル処理→ファイル処理→RDBみたいに、最初と最後だけみたいなのが普通)
入出力がファイルだから今の感覚で考えるとアクセスは遅い。でもメリットもあって、1回に1行しかメモリに乗せないからどんな巨大なデータでも時間さえかければ処理できる。それこそ国民ひとりひとりの年金データとかね。あと、途中でバグや不正データで止まってもデータを失うのは最小限で済むので復旧が比較的楽だったり。
データベースの話に戻ると、テーブル定義はどこに書いてあるかというとデータファイル側ではなくてCOBOLプログラム側、というのがSQLと一番違うところかも。つまり、このデータファイルの構造はこれこれこうなっていると想定して読みます、とソースコードに自分で書く。当然実際のデータ構造がそれと違ってたらおかしくなる。
まあそんな感じで80年代くらいに会計処理をする目的だったら悪い言語ではなかったので、銀行や官公庁とか、電力水道ガスといったライフラインを扱う大企業がこぞって導入して今に至る感じ。普通の大企業は途中でSunとかに置き換えてその後Linuxやクラウドにさらに置き換えたりしたけど、最初に作ったシステムが大きければ大きいほど、重要であれば重要であるほど現代的な環境に置き換えられないというのが今の課題。
例えば「AB」という概念があった時, 「ABAB」「ABのAB」「ABに関するAB」という概念も成立しうる場合, その概念は「メタAB」と呼べそうである.
あたりがぱっと思いつくけれど, 身近な例でも応用できないだろうか.
意外と難しい.
Rails のことはかなりわかっている方だと思う。
だが、最近 Django (Python のウェブフレームワーク)を使いはじめて、いままで苦労して Rails を使ってきた努力は何だったのだろうと思った。
Rails は Ruby の柔軟さを利用(悪用)して、徹底的に Ruby 言語が改変されている。
DSL が多用されている。
要するに、「レール」を外れると、どうしたらいいのかすぐわからなくなるのだ。
だから四六時中、フレームワークやプラグイン(gem)のソースコードを解読しようと格闘する羽目になる。
その点 Django は Python らしく、フレームワークは余計なことをしない。こちらが何かしないかぎり、何も起こらない。
すべては明示的(explicit)に行う必要がある。
明示的なものは暗黙的(implicit)なものよりよい、というPython、そして Django の思想。
なんという安心感だろうか。
たしかに Rails のほうが開発に必要な記述量は少なくなるかもしれない。だけど、わずかな記述量を節約したところで、見通しが悪くなったら元も子もないではないか。
私は、本当に Rails 教に洗脳されていたんだな、といま感じている。そして、洗脳から解放され、いま、より広くて成熟した Python コミュニティに参加しようとしている。Ruby も悪くない言語だし、Rails もよいフレームワークだけど、もういいかな。これからは Python と共に歩もう。
最近、Python にどっぷり浸かるようになって、「Ruby 教」とも呼べる宗教的な縛りから解放されるようになってきた。それにつれて、いままで Ruby コミュニティで当たり前とされてきたいくつかのプラクティスに対して批判的な気持ちが育ちつつある。
いままで一部の人たちが Ruby 界隈を忌み嫌っているのを見てきたが、その理由がわからなかった。でも、Ruby が一種の新興宗教のようなものだ、と考えればその理由は理解できる気がする。
プログラミング思想というのは、絶対の正解がないために、結局、それを信じる人たちが集うという「信仰」の形を取るしかない。より主張の強いグループが宗教的な形を帯び始めるのは少しも不思議ではないだろう。
P.S.2
Rubyな人たちは二言目には「テスト」とかいうけど、自動テストがすべてを救ってはくれないよね。
結局yamlはデータ構造を現すもので、プログラミング的な繰り返しとかIF文は無理やり過ぎて違和感しかない
RubyのDSLって普通にダメだねこりゃ。実行順序も分からんし、普通にRubyで書いた方が良い気さえする
独自のSyntax覚えるのかったるすぎる。大して便利じゃない
何でもやろうとすると結局、プログラミング言語みたくなってどんどん可読性が落ちる
結局最後はbashで良いんじゃねーかなってなる。シンプルにできるなら一番筋が良いのはansibleだけど微妙に書き方変わったりして追従がかったるい
俺の知ってる会社でchefで全自動だぜ!とか言ってキラキラ感だしてる会社あったんだが今は全然回ってないらしいww
一時はもてはやされたけどDockerとか出てきた昨今こんなの今頑張らなくてもいいのかもな
分かったのは言語の多機能さというのは、一点水準さえ満たしていれば、それ以上足しても生産性に寄与しないという事
自分しか使わない、最初書くときに限れば書きやすいと思うこともあるが、それ以上に保守性を落とす
ライブラリを利用したり他人のコードを読む機会の方が多い昨今マイナス要素でしかない
perlのスローガンだかに "There's More Than One Way To Do It." というのがあるらしいが、読む側からするとたまったもんじゃない
演算子がオーバーロードされてるかも?モンキーパッチされてないかな?等々あれこれ想定しなきゃいけないのが苦痛でしかない
パスの選択肢を見せた事で沢北が集中できなくなってしまったから
DSL(笑)が良いと思ってるのは最初だけで、最終的に負債にしかならない糞コード
統計・機械学習系のライブラリが皆無で先細りのイメージしかないからRailsと一緒に心中ください
リスト評価、スカラー評価とか意味わかんねーくくりもtie変数もアイディアは糞中の糞
Perl6にいたってはわけわかんねー演算子のオンパレードで悪いところをさらに悪くした感じ
毎度毎度、バージョンアップで非互換な修正加えてコードの修正が必要になって、Gemも上がって依存が壊れて
いつまでやってんだよw
Railsのプロジェクトでどれだけの人が最新版に追従できてんだよ?テストを書いてれば余裕?
本当かよ?正直に言ってみろよ?実際はレガシーRailsの山だろw
ヘルパーやらマイグレーションの仕組みやら最初は良いかなと思ったけど、どう考えてもやり過ぎだ
短くかけるとか喜んでるやつは一度考え直せ
それで良いんだって?自分がコントロールできない知らないコードに依存して結局バージョンアップで地獄みてるだろw
最低限中で何が起きてるか理解しとけよwまあ理解できるころにはRailsでなくても良かったんやwってなるけどなw
RAILS_ENV=productionだとstaticファイルは自分で返さないassetコンパイルで小さくしましょう
→ developmentで動いてたけど本番だと動きませんでしたw
毎度毎度、アホみたいにGem入れやがって、もう自分で把握できる状態じゃねーだろ?
bundlerだから完璧にvendoring出来ますだって?
本当かよnaitive extensionのGemなんてどう考えたってRails管理外のヘッダファイルに依存すんだろ
めんどくせーなbundlerもこけるし、rbenv使ってrubyのバージョン揃えろとか
ホントめどくせーよ
deployもcapistrano便利とか言ってるけれど、そんなに便利じゃねーよw
あんなDSL覚える時間あんならシェルスクリプト書けるようになっとけ
rackサーバがたくさんあってよかったねじゃねーよ集約しろ馬鹿w
unicorn, pumaで比較しましたとかアホ記事書いてる暇あるなら集約するかなにかしとけ
この手の話すると信者が使わない方法もある・選択しない方法もあるとか擁護してくるけど
そりゃあるけどそれ調べんのがめんどくせーって言ってんだよw
何でもかんでもレールに乗せてそれを強要してくるような感じがすんだよw
http://anond.hatelabo.jp/20160902031012
はてブで批判してる人たちよりよほど志のある学生さんだと思うので、いろいろ書いてみます。おっさんのたわ言ではありますが、元記事の人にすこしでもヒントになればと思って。
まず、日本の大学で勉強しても実用的なソフトウェアが書けるようにはなりません。どういうことかというと、「情報系の大学に行けば○○が作れるようになる!」という世間一般の期待と、実際に大学で教えている内容には大きなギャップがあるということです。
これは大学が悪いのではなく、大学はそもそもそういうものであって、それが世間に認知されてないというだけです。
具体的に挙げてみましょう。
大学で教えてる内容ってこんな感じなので、ゲームやアプリやサービスを作ることが目的の人から見ると、役に立たない内容にしか見えませんし、実際たいして役に立ちません。その証拠に、大学の情報系学科を出ていないのにゲームやiOSアプリやWebサービスを作っている人はゴマンといるし、逆に日本の大学の先生でゲームやiOSアプリやWebサービスを作れる人はほとんどいません。
これは重要なことなのでもう一度書きますが、日本の大学の先生でゲームやアプリやサービスを作れる人はほとんどいません。大学の先生が得意なのは、プログラムを書くことではなく論文を書くことです。論文のためにプログラムを書くことはありますが、あくまでおまけです。
そのため、大学で勉強してもゲームやアプリやサービスが作れるようにはなりません。だって教えている側の先生が、ゲームやアプリやサービスを作ったこともなければ、作り方も知らないんだから。
そういう経験のない人たちばかりですよ、日本の大学の先生って。そんな人たちの授業を受けて、アプリやサービスが作れるようになると思うほうがおかしいでしょう。
ためしに、先生方のTwitterアカウント名でGithubを検索してみてください。いまどきGithubにアカウントがないとか、あったとしてもTestCaseすらないコードとか、そんなものばかりです。「研究内容をライバルに知られるわけにはいかないからGithubは使わない」という言い訳する人がいそう。けど、本当はGitが使えないだけでしょ?
あるいは、先生方の個人ページや研究室の紹介ページを開いて、HTMLソースを見てみてください。doctype宣言がないとか、viewportの指定がないとか、Pタグの中にULタグを使ってるとか、そんなのばかりです。HTMLすらろくに書けない人が、Webアプリを作れると思いますか?きっとXSSもCSRFも知らないですよ。
ですので、そういうことを勉強したいなら、ベンチャーやIT系企業に入るべきです。大学でそういうことを勉強しようとしても、教えられる人がいないから無理。
(「大学はそんなことを教える場所ではない!」と怒る人いると思うけど、教えられる先生がいないという事実をごまかすために怒ってるだけだから。)
とはいっても、大学の先生がプログラムがいっさい書けないというわけではないです。彼らが得意なのは、コンパイラやインタプリタやOSやソルバを作ることです。これらも実用的なソフトウェアと言えなくはありませんが、ゲームやアプリやサービスとはジャンルが大きく違います。
そのため、大学の情報系学科に進めばコンパイラやOSや機械学習ライブラリを書けるようにはなるかもしれませんが、それはゲームやアプリやサービスではないので、繰り返しになりますがそれらを作りたい人には大学は向きません。
じゃあ大学で授業を受けるのってムダなのかというと、必ずしもそうではないです。
大学で教えている内容って、ゲームやiOSアプリやWebサービスが一通り作れるようになってから、その先を目指すときになって初めて必要になることが多いです。たとえば、
こういうときになって、初めて大学で教わった内容が生きてきます。逆にいうと、そういう状況にならないと、大学で教わった内容は生きてこないと言えます。(情報系の学科で学んでいるなら、ライブラリや言語やOSを「使う人」ではなく「作る人」にぜひともなってほしいですね。)
元増田は、社会に役立つ実用的なソフトウェアを作りたいようです。しかし残念なことに、大学が教えている内容はその目的には合致していないことを説明しました。
こういう事情なので、元増田には大学をドロップアウトしてIT系の会社に入社することをお勧めします。ドロップアウトが難しいなら、インターンやバイトでなんとしても入り込むことです。
入るべき会社は、教育に力を入れている会社です。20人未満の小さな会社では教育に力を入れている余裕はないので、小さな会社はやめたほうがいいです。簡単にぐぐってみたところ、はてなやPixivやクックパッドやDeNAやドワンゴは教育制度が確立しているようです(違ってたらごめん)。そういった会社に入ったほうが、大学の授業を受けるよりも、元増田の目的にかなうのは間違いありません。
そして何年か働いて、iOSアプリやWebサービスが一通り作れるようになったら、大学に入り直すことです。これはとても効果的なので、元増田には強くお勧めします。
上で説明したように、大学というところは、ゲームやアプリやサービスの作り方は教えてくれず、それらが作れるようになって初めて役に立つことを教えてくれます。そのため、元増田はIT系の会社に入ってアプリやサービスの作り方を勉強し、それらが作れるようになってから再度大学の門をたたくのが、いちばん効率的です。
なお繰り返しますが、入るべき会社は「教育に力を入れている会社」です。今のIT系企業では、インターン生を「格安で使えるバイト君」としか見なしていない会社が多すぎます。そういう会社は、コストが掛かることはいやがるので、教育もろくにはしてくれません。逆に教育に力を入れている会社では、インターン制度を「将来の戦力を選別する期間」と見なしています。
残念ながら、そういう会社は東京に集中しているようです。例外は京都のはてなくらいでしょうか。地方の大学生にとってはつらい現実なので、はてなやPixivやドワンゴは地方でのインターン開催をお願いします。あとレベル5は九大と九工大の学生を鍛えてあげてください。
余談ですが、学生さんにひとこと:
インターンやバイトで潜り込む先の会社を選ぶときは、就活と同じような時間をかけて選んでください。バイトだからとかインターンだからという軽い気持ちで会社を選ぶ大学生が多いから、それを食い物にしている悪質経営者があとを立ちません。インターン生が「格安の学生バイト」として使われている現状を是正するために、学生のほうでも注意してください。
ドロップアウトを進めた手前、書こうと思ったけど、長すぎるのでやめた。
リツイートが100超えたら書く。
Qiitaに書こうかと思ったけど、言いたいことも言えない、こんな世の中じゃ。
モバイルファースト、APIファーストな文脈でハイブリッドWebをやってきた目からすると、サーバーサイドでHTMLを生成してページ遷移させるなどという90年代調のクラシカルな発想を基本に据えるフレームワークはとても斬新に思えました。HTMLをゴリゴリ生成するなんてよほど特殊な最適化をしようとするのでなければそもそも発想として出てこないです。それでいてDSLやメタプログラミング等のテクニカルな技法が宝石のように鏤められている様はまるでエジプト時代の骨董品を見るかのような趣がありました。turbolinkなどは、かつて表計算ソフトに出しゃばっていたイルカを思い起こさせる味があります。かつて慣れ親しんできたSPAが星のように遠い存在になりました。
Web界隈の人々がモデルだとかアクティブレコードだとか"MVC"だとかを非常に具象的に話す様を見るにつけ、お前らどんだけPofEAA読み込んでるんだよと畏怖していた時期が僕にもありましたが、どうやら彼等はRailsのクラスやディレクトリという特定の実装について話していただけだったようです。Modelという概念もこれだけ肥大化してしまったら、オリジナルな概念で彼等と会話するのは諦めるべきかなと思いましたし、Railsの"MVC"をアンクォートして語るのはもはや害悪であるとすら感じました。
Rails界隈の人がよく「Railsの流儀」や「正しい"MVC"」というのを口角泡を飛ばして議論しているのを目にするのですが、おそらく外に広がる不条理で火傷を負って快適なRailsの世界に引き篭もった結果としての一種のストックホルム症候群なのだなと思いました。いまやAjaxとかWebsocketとかWebRTCとかを組み込もうとする至極真っ当な方法論がとてつもない高難度に見えてきます。設定よりも規約、というのも一つの方向性だと思いますが、ドメインやサービスレイヤの名前空間を構築しようとしたりコードジェネレーションしようとしたりしただけで地獄のようなCircular Dependency罰を受けてしまったので、自分がとても間違った事をしているような気がしてしまいました。とはいえConcernsに特別な名前や役割を与えられても正直しんどいので、皆が皆libにゴミを放り込んでいく様子にも納得がいきました。
RailsをAPIサーバーとして使おうとするとまずビューが無くなってMとCだけになりますが、いわゆる"MVC"の文脈で育ったエンジニアがなぜ息を吸うようにFat ControllerやFat Modelを作ってしまうのかという事が良く分かりました。多くのRailsのリファクタ手法と称されているものはクラスを書くファイルを分割する事以上のものでは無いように思えたので、Rails使いを大きめなAPIサーバー案件に回すときはセットポジションでDDDの青本を投げつける必要が有るなと思いました。
ビューとコントローラを結合させた場合、結合テストはCapybaraとかのBDDでマークアップサイドとの干渉を恐れながら強い気持ちでメンテしていくしか無いのかなと思いました。おそらく脳に電極を埋め込んでいるか、緑色のランプを見るだけでハイになれる特殊な人にしか生き抜けない闇が垣間見えました。コントローラを薄くしてサービスレイヤを挟めばその辺りもうまくいけそうな気がしましたが、ビューからヘルパーやモデルがいくらでも透けて見えてしまうという状況では裏側の完全性に自信を持つ事は難しそうでした。
ビューがRubyを叩いて永続化レイヤと直接コミュニケーション出来るというのはとても生産性が高いのだろうとは思いましたが、こうして出来たパーシャルやら何やらをデザイナーとどうやって共有するかを考えると頭痛が痛くなりました。おそらく適当に切り出して綺麗な空間をassets以下に構築した上でpublicにRPCのような窓口を備えたゴミを量産していくのかなと思いましたが、もっと綺麗な方法はあるのかもしれません。でもきっとRails案件に関われるデザイナーはRubyもバリバリ書けるに違いないはずなので、ここが問題になる事は無いのだろうなと思いました。
RESTはとても美しいパラダイムではありますが、そもそもHTTPがさほど美しくないので歪んだ空間には目を背けるか勝手解釈を与える事で人は初めてRESTfulを名乗る事が出来るのだと思います。GETがbodyを(公式には)持たないという事について美しい説明を与える事は出来ないでしょう。サーチAPIはどうしますか。ステータスコード足りなくないですか。401エラーはどうしますか。そしてRESTはあくまでリソースを抽象化する美しい概念なので、アクションや副作用については貧弱です。動詞が足りないですし、一般動詞に狭義の意味を与えてドキュメントするのは二度手間にしか見えません。PUTには冪等性があるべきみたいなこだわりは家の猫にでも説教してればいいと思います。というわけで、REST的な設計を拝借することはよしとしても、「○○はRESTでは無い故云々~」みたいな注文はやめて頂きたいものです。
とか言わないで欲しいです。こういう時にセットでPHPをディスって悦に浸るのは知る限りRubiestとPythonistaと中学生だけです。それにこれはあくまでサーバーサイド初心者の感想なので、想像するにこれ系のFWは多かれ少なかれ似たような不満を抱えるものなのかなと思います。というわけで、おそらくこれから選択肢がある限りはRailsを使い続けると思います。
これ読んでも関数型分からないけど、入り口の前あたりに立つために
プログラマとしての引き出しが増える。
って書くと「そんなもんどんなプログラミングテクニックだって一緒だわ」って言われそうだけど、でもそうとしか言い様がない。
とりあえず、オブジェクト指向と同じで、プログラムを構造化して、複数のレイヤーに切り分けて部品化していくテクニックだとは言える。
ただオブジェクト指向とは大分切り口が違う。何ていうか、割と直交する切り口でプログラムの構造を切り分けていく。
なので、関数型とオブジェクト指向と両方憶えるだけで、大分切り口の引き出しが増える。
オブジェクト指向と関数型両方憶えると、プログラマとしての引き出し増やすのに効率が良い、って思えば良いかも。
オブジェクト指向は、プログラムの各部品を「あれの中のこれの中のそれの中にあるあれ」みたいな感じで組み合わせる。
部品が更に細かい別の各部品で構成されていて、それぞれの部品が噛み合わさって、複雑な一つのプログラムを構成するような切り方。
関数型言語は、プログラムの部品を「あれをした物にこれをした物にそれをした物にあれをする」みたいな感じで組み合わせる。
もっというとプログラム全体を簡単に記述するできるDSLがあって、そのDSLを簡単に実装するためのDSLがあって、DSLの入れ子構造で一番小さい部品はシンプルな関数、みたいな切り方。
ケースバイケース。
ではあるんだけれど、シンプルな部品を大量に組み合わせて構成するのがしっくりくるならオブジェクトで、部品数が少ないんだけど一個一個が複雑な動作する構成にしっくりくるのが関数型……かも?
関数型言語たる条件として「関数が第一級オブジェクト」ってのがあるんだけど、関数が第一級オブジェクトだとイミュータブルなデータを素直に扱える。
で、イミュータブルなデータ構造使うと色々便利、ってことで実例として一番出てくるという。
関数型言語のエポックメイキング的な言語が三つくらいあって、元祖のLispとその流れ汲んだMLとMLの一種で関数型をある種の到達点に持っていったHaskellって感じ(独断と偏見)。
で、このうちのMLって奴が、プログラミング言語に型システムがついてるんじゃなくて、型システムにプログラミング言語がついてきた存在だったりする。
型で色々やるために生まれたわけで、まぁなんというかそもそも型と密接な関係にあって、Haskellもその流れを汲んでて、こいつが超有名になった、って感じ。
おかげさまで、型使って色々やったりする方法が日々考えられているわけです、静的型付関数型の世界では。
関数型言語ではよく「関数と関数を引き取って、合成した関数を返す関数」みたいなのが使われるんだけど、関数と関数の合成って、それ合成された関数がもともと引数として与えられていた関数憶えてないと無理やん? 自分自身の構成部品憶えてられないわけだから。
クロージャあると憶えててくれるわけですよ。
そんな感じで高階関数を実用的なレベルで使うのには大体必須と言う。
関数型言語はDSLを作りまくる言語みたいに書いたけど、モナドはちょっと複雑なDSLを簡単に作らせてくれる仕組みだと思っとけば良い。
まず純粋の定義だけど「全ての関数は同じ引数を与えられた際、必ず同じ値を返す」ってことで、これがいわゆる副作用がないって状態だ。
で、これって逆に言えば「プログラム内である関数に対して、絶対に同じ引数を与えさえしなければ、その関数がどんな値を返したところで、事実上純粋だと言えてしまう」ってことでもある。
本末転倒感があるんだけど、HaskellではIOモナドという仕組みと特別なmain関数を使って「呼び出すたびに絶対に違う引数を自動的に関数に与えてくれる仕組み」を実現していて、こいつを使って入出力する。
うん……凄い本末転倒。ちなみにこの自動的に与えられる引数はRealWorldって名前がついていて、要は「刻一刻と変わり続け絶対に同じ状況にならない現実世界の状態を引数に取っちまっているようなもんだからしょうがないだろ?」的な感じ。
otsune|kanimaster|jt_noSke|habuakihiro|mohno|munyuu|ChimeraJpn|DoukiHousou|Nazo_Gen|wataru-ishizuka|kenken610|ncc1701|koumet|s62|gingin1234|saposaposen|SiroKuro|hascup|s_hosokawa|thermalpaper|triggerhappysundaymorning|foobaafoo|marupin|chintaro3|minakon1979|NOV1975|predator995|goodhome2|Frequency_Random|jankoto|netisfree|API|artzt|iiyoko|LossCuts|kame2332|vid|gasemato|oguogu|kyoupon3|Moonlightdance|cybo|yo_423|palo|thesecret3|skywave1493|HSE|yingze|tanizakura|Outfielder|RIP-1202|itsukiranru|kento255|nekora|kentultra1|mitsu0227|F-SQUARE|hatenkou001|yhiroko60|ruletheworld|ototake|kaorionda|kurodamiho|malark|iya_honto|Dursan|takuyakoba|m-matsuoka|mk-biz|k-takahashi|arbitrage1979|abdullahthebutcher|jujubea|kumonopanya|mai0727|kenyu77|c6216|akibakaori|furukatsu|deadcatbounce|TOM2005|ks1234_1234|manydsvn|Yagokoro|A410|Hige2323|activecute|KANIBUCHI|Zarathustra1951-1967|hatoken|ftype|etherealcat|taikoubou1|toraba|Midas|infobloga|motowota|enderuku|tamase|vitamin_G|www6|hatredlef|chnpk|vanish_l2|katsura_1|zions|tdam|momo21C|braverobo|looot|kirche|a3sw|K-yamada|chousuke7|big_song_bird|neogratche|hagakuress|Assume|Takewaka1976|Gakkuri-Kanabun_09|nextworker|pribetch|shikaku3|fujichan1234|Membrane|justgg|andalusia|clclcl|ka-ka_xyz|teracy_junk|weekly_utaran|SENAKA|okurus|mori-yoshiro|yamamoto8hei|sudo_chown|fumichan23|sashatwix|uciga|babylonia2011|mizuno8387|touitsumizuchan|moonie|wavewave2013|member21|evifrailove|kimkim108|ucadachi|tameniikiru|satromi|xxix29|anpo-sumeragi|sonickhedge|anigoka|yuka_taso|nicotag2525|yuhtan|blackwing83|yoshiyuki007|renaikogaku|FEFE|aikoku_sensei|yoshino2|st_valley|serio|asahinoataru|denden-cafe|geist1979|heyacho|Harnoncourt|Hiro0138|shoot_c_na|TakamoriTarou|spoichi|sekiryo|sukemasa_fujiwara|a2de|bakeneko44|zichao|gremor|timeismoney|pink_revenge|bumble_crawl|moccai|eijiso|UlickNormanOwen1924|daigakuseikyou|sys-arts|glass-_-onion|k146|rt25|seamore0228|katayoshi|wbbrz|mgkiller|shichimin|mobanama|a96neko|hirokazuiwai|mostaga|okemos|Jolokia|obata_hiroshi|John_kit_tea|tiro2010kina|utushi|gulugulu|tetradrop|Baatarism|daruism|wangshot1155|axel69|yingbb|satomi_hanten|Chosuke|keima1230|ripple_zzz|unaken|jitojito|mnox|cladegifan|Moodykajigaya|saekik|dodorugefu|l-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_l|hobo_king|shun346|munioka303|ao-mid|koubemise|gomunaga|minaminoani|yasyas|sybianoid|ysync|washita|dagama|aaact4|Kukri|the_sun_also_rises|aruzentina|araigumanooyaji|tonapa|napsucks|ferias|y-wood|attoku|Naotoh|midnightseminar|daruyanagi|gimonfu_usr|buu|Snail|sakuragaoka99|hyakuhyaku|charleyMan|doroyamada|kempff_n|yem3399op|AmahaYui|nippondanji|sacredjustice|ken5chi|myosho|melo-ria|kikori2660|hidamari1993|raf00|batz-22|nokonoko11|operazard|orihime-akami|aimind77|taka_atom1007|kaionji|tyokorata|ashigaru|JULY|amateur2010|habuakihiro|kyuuiti92|sa_tie|jack_oo_lantern|kingate|monono|bengal00|miitocha6|hrn_k1|fragilee|ahmok|kibitaki|matsOS|simbelmyn|a1101501j|srsrbilly|filinion|bitey|falkbeer|jojojojoen|ketudan|ym_lennon_papa|doudemoii99|locust0138|Oriuta27|naokibtn|twisted0517|ryokusai|tonatonatonac|velvetgrouse|npoposse1|nekosichi|LawNeet|jay926|osakana110|kzhvsonic|komamix|bookiori|copuy|dmnlk|dog_me|Donca|d_animal141|ebi73|evertex|hamhamtarou|hatataw85|i_am_kawai|khujhlo|maedakingdom|mikayu55|mi_zu_ta_ma_mi|moemoe386|nanagami|nurie19782|omosoku|outotsu|reglanz|saitousansaito|shrimp17|toshi19650104|TsutomuOnoda|unyuunyuho|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW|yoshirou777|houyhnhm|synonymous|zaikabou|ululun|sin2mo|xevra|daybeforeyesterday|omf|H58|politru|hazama-hazama-hazama|Apeman|believemeimaliar|ksaitou|YTR8335HS|letterdust|bogus-simotukare|sotokichi|mangakoji|Louis|omega314|noabooon|guldeen|tadasukeneko|okachan_man|kuippa|mahal|lkhjkljkljdkljl|TERRAZI|BassVoiceXYZ|feita|haunebu2|m_yanagisawa|simpe|sorarisu0088|marsrepublic|ponako10|superpuma|o030vv|kathew|k_wizard|festerfester|as1_htn|foxtrot0829|d0i|yakouhai|kiku72|vocaloid|and_hyphen|b4takashi|nattoh|hate_flag|okanoao|frothmouth|with-must-fel|bakadomoga|gasparl|AKIT|fk0407|takehana_masaki|noraneko|pollyanna|pokute8|msukasuka|pazpon|SHOWFKUP|yoko-hirom|vanacoral|kogarasumaru|K-Ono|nanospectives|ponyorin|kumaroku|suzu_hiro_8823|kosui|tenkinkoguma|pero_pero|hi_kmd|sasurai7|dai_air|hatebu_music|dononymous|kenjou|nabeteru1Q78|tarekenroom|momopopohate|miyamotosan|debriel|hihi01|n-styles|wandering_emanon|shueiwaka|yutamoty|kimikitan|browneyes|beth321|gikazigo|rosaline|kitamati|shouchan7428|longroof|loveanime|gureusa-and-kurousa-rabbits13|h5c223tc6qvxc|tsukitanuki|Taro416|arama000|baka020|Lumin|gmochein|masa_bob|takanofumio|qadapix|richest21|nenashigusanora|penguin_002|kagecage|drumandara|app2641|internus|topisyu|north_god|echo2944|honeybe|fujiyama3|ricemountain|zeromoon0|negril67|k19d|moghiko|sqrt|minonet|trini|kazukichi_0914|chris4403|Blue-Period|korn_freak|iasna|lastent|SndOp|pepeky|treve2013|Lag_TY|sakura_123|cider_kondo|garage-kid|sketchlife|kana321|inukorori|fumifumi43|aukusoe|oinosaka|macchauno|high_grade_works|gdk0213|poppun1940|west-hiroaki178|kasumani|ekken|TM2501|rascalrascal|d1b|ikari51|meme-o|plutan|feather_angel|katc|iwax666|i2i|fuba|Asay|hatekun_b|takanorikido|sunamandala|akira-2008|jaikel|suikax|Falky|Nean|yas-mal|aodifaud09|solidstatesociety|furakutaru|kyo_ju|raitu|tg30yen|jou2|miruna|rag_en|nuicksilver|kodamatic2|quabbin|kana-kana_ceo|Arturo_Ui|REV|juverk|haruharu1|terminalhead|kazoo_oo|ellm9|rAdio|akikan2|naohero22|nenesan0102|oyasai55|glasstruct|pullphone|ramyana|abc0123|Gl17|sabacurry|shigeto2006|popoi|netcraft|vndn|craft_kim|kenjiskywalker|sonicdrum|jorgekosuke|ytn|analogical|kaz256|birk|arayutw|tomymot|sisui_ro|hidex7777|uwasanoaitsu|uhyorin|shunpei55|yuki_2021|ore_de_work|narwhal|GOT4416|nurupo889|cutplaza|Notizie|kisiritooru|Caat|washburn1975|zyusou|luccafort|my-kana|thirty206|Journey|rider250|MK3110|mizu2014|jaga_rikoo|steel_eel|mousecat|wapa|Saitamakei|n2khjm|tamtam3|sho|lesamoureuses|kyupi-n|blueboy|yoruneco|meerkat00|copyxxx|shukaido170|kaz_the_scum|munetak|caligo|hokuto-hei|agleldvr|hikaruda|mah_1225|okxiav|uma666|coolstyle|Ivan_Ivanobitch|straychef|theatrical|kazuya030|sakuracon|mame-tanuki|SusanoJapan|exadit|catryoshka|s1_snake|h1romi|miss0803|Soregasi|SEIKI|mobile_neko|miryu2008|cake_holl1515|Borom|sync_sync|zorio|highrise|Lhankor_Mhy|John_Kawanishi|karatte|yoko_kitchen|kyoumoe|katabiragawa|coper|quix_que|scopedog|usi4444|Ayrtonism|hitouban|nunnnunn|Jun-Sugihara|amakanata|peco_poco3408|nemu_ichinose|ikurazu|ryo71724|suminotiger|bambi_eco1020|koiyaro|nao0990|nekonekonekotori|kagamihoge|gui1|hkurata|maicasato|akawi|mae-9|teacheers|banban|akimaruworks|yzxnaga|Amontrue|Gustav13|zmoi|ze-ki|haruna26|gin0606|paradisecircus69|primedesignworks|amori|kouas1100|trade_heaven|ricenoodles|gryphon|style_blue|upran|bzb05445|kikuchi1201|fusanosuke_n|Nowhereman|Domino-R|suburban_researcher|agage|coolpix|smilestyle55|seagullwhite|chess-news|zuiji_zuisho|koyhoge|rorinana|W53SA|Changeoneself_Lifehack|yukimurasama|omiya6048|SchizoidMan|daichan330|aquos12345|sarcoid|asobi|TakahashiMasaki|bioweb|non-chan3|k-h|a_micchan|t_utsumi|nakomaru|re_peko|benelux|BuntaPig|T_Tachibana|goodbadnotevil-syamo|chobinuke|barias|s4d|sumito0720|amamiya1224|asarina-k|snowwhite1090|peketannku|kirifue|tsuki-rs|nagisabay|masaki_akiko|Sato_4tree|aozora-pedal|cyborgninja|x9629|natsu_san|joker1007|linden|terurou|benkeiblog|lordkf|keim_at_Si|toomuchpopcorn|marumusu10|rokujyouhitoma|mshs0609|damae|peketamin|USuck|poipoichang|era1978|lastline|kanamatch|ElizaAcolyte|azumi_s|Pandasista|masutaka26|dadapon|kamei_rio|kyasarin123|coppieee|nobby81|shoshirasaka|kastro-iyan|aktk_f|toripika|unsoluble_sugar|alovesun|Ta-nishi|lylyco|meeakat|hidamalar|yubigasol|neco22b|a-lex666|brendon|himomen|htb48|Marin_MTB|mumincacao|vanillableep1618|shoG3|calcan|youichirou|Landmine|azure-frogs|You-me|kissuijp|yamuchagold|comzoo|zakinco|Vorspiel|YOW|syuu1228|whkr|death6coin|izatan|seiyuDB|camellow|koluku|yunottinoatama|Nyoho|pianocello7|shufuo|princo_matsuri|ikkiii|typex2|kurisann000|at_yasu|kiyohero|tahaji0117|mizukemuri|moritata|takuya916|gigi-net|odoru-mn|htnmiki|ippeichangg|POPOT|BRITAN|taihe|moons|ntmukai|ptolemychan|kagobon|niryo0113|zz_sexy|underd|migurin|Besucher|yuki_drop|nomitori|navix|maijun2|vhthlh|mas4bookmark|killerQueen|ipa5963|hajime0329|o_mega|xr0038|hoshinasia|studio3104|yaruo3dao|inulab|sho_yamane|naga_sawa|shamr|qittu|QJV97FCr|masudamaster|white_rose|mifasorashido|kaitoster|mujisoshina|Rlee1984|narug_summers8|osushi_soba|k71360274|lejay4405|dododod|shields-pikes|yuta25|aquarla|mame_koo|ZeroFour|syakinta|kkobayashi|richard_raw|mmsshhrr|neriu|hase0831|chuunenh|hiroshi_revolution|tatage21|seabreamlover|ranpei|aassddmizuta|nagaichi|monakiko|miyagi12|sawayaka_b|kamibukuromiata|mkusunok|tenchikometen|turry|miya999|kamayan1980|kiyo560808|biztaka|miki3k|El_Fire|kirte|tanmeso|maritimecolor|masuruku|suna_kago|kurahito3|ikd18|kouhei_kain|mcddx30|timetrain|sima_pan|pomojan|usagino-mori|tyu-ba|masakih|riocampos2|rain-tree|sakuragaoka|zu2|lyri|komochishisyamo|suzuki84g|hal9009|hakidameru|makoto725|shinagaki|aki-17|shiba_yu36|uturi|gfx|fjwr38|mico-mico|y-yosuke|desuzo896|buffbuffrat|Barton|ornith|unyounyo|turretmusuko|wes2626|negi_a|aratah|tiki0108|YaSuYuKi|kuroi122|yk4192|yoiIT|takhino|kakipo|isano|qtamaki|ustam|hiero|kakakauchi001|sin4xe1|gdno|tkamu|AR30|gugod|chochonmage|sika2|metroq|ikusana|tkysktmt|tanaka_yuuma|takuzo1213|y-mat2006|yuiseki|suzukidesu23|hisawooo|KoshianX|tskk|shunning|mochidori|namikawamisaki|mustelidae|MoneyReport|ente04|isshoku|take-it|kiku-chan|reima|kiichan1115|cj3029412|jassmaz|silverscythe|cloq|ossan3|crapman|yuchan893n|muchonov|sph_375|namawakari|sugikota|taketyan|Swatz|kuroaka1871|tanorityy|daddyscar|ch1248|yeenee|testa_kitchen|wl0x0lw_lenz|pirokarupin|katanyan|tikani_nemuru_M|papamao|misias|jiskay|Aodrey|bean_hero|flclover7|kura-2|kaeru8823|Cliche|EG_6|yukitanuki|hungchang|ktasaka|inmysoul|inurota|georgek5555|jKandai|oka_mailer|mikanyama-c|watto|chikurou|Sediment|tecepe|toshi20|marony0109|fellfield|aflat_1000dai4|xisher|narukis|kagasan|gnt|Sinraptor|blackwatch|Ni-nja|kyrina|hasiduki|tomiyai|c_shiika|caplsy|whiteball22|manFromTomorrow|nejipico|zatpek|kotobukitaisha|mah-fa|m_uchino|yujing_musume|yotinakk|sumida|NAPORIN|modal_soul|oceo|hamatsu|naoto111|misaquo|muso00|Cunliffe|sink_kanpf|hiruhikoando|doronpa55|hunyoki|laranjeiras|kirigirigirl|barubari2955|outroad|ecochiko2|alloreverything|hagex|sny22015|aurijpn|bbb_network|jogjogjog543|outland_karasu|linus_peanuts|watakochan|ponkotukko|totoronoki|tpircs|hitode909|keishut725|wakasatoshi|iida-kana|tanukichi087|north_korea|watapoco|lp008962|tohima|aereal|Caerleon0327|horahareta13|footwork_x|satis|kazuhooku|s_tosha|deeeet|reteru|sigwyg|toya|gorodoku|operationservicebu|itamae|kohgethu|ureyubo|kaipu1224|usa02|usamyu56|mockingbird0619|hylom|kanariezuki|Vudda|tsubame_nanami|djsouchou|rio123dx|rikzen|sampaguita|el-bronco|ranobe|kotaro0413|IkaMaru|luxsuperpoor|Gelsy|momizikeiko|TequilaBancho|dadywada|welchman|lochtext|uunfo|bronson69|mesomeso|soooma|sucelie|cs133|monica83jpn|penguaholic|n_pikarin7|nonogray|wienerhorn|mmdawson|CDG|himashuhu|omerico|kazuya53|shimaguniyamato|zhenyan|shironeko_t|akihiko810|s-tomo|t_trad|gagegogi|utaro2013|murishinai|Sigma|deneb-y|reachout|mo__ki|k-rallyart|nymc|ueshin|popoon|masato611|kotesaki|taka2071|reikax|duck75|menjoh4486|keloinwell|Akimbo|exterminator|mk16|ni-ten0|mainyaa|hiro_y|twilightmoon99|shiromochi923|fb001870|seppu|suzutreeadd1plus5|hiroyukixhp|nogutyo|thyme56|kyokucho1989|sensitiveplus|thyself2005|fa11enprince|adgt|mu_hal|sato0427|vifam84|BT_BOMBER|yunoka0314|tetsuya_m|mogmognya|sirocco|Yozhik|kskmeuk|coolworld|yamada_maya|alphabet_h|kankichi20|louis8917|kowyoshi|ohira-y|wata88|toratorarabiluna273momomtan|kiyoami|An7s|smbd|puruhime|hiromo2|takashi1982|nagaimichiko|opemu|shifting|buhikun|SirVicViper|Dirk_Diggler|Rinta|haruhiwai18|goldwell|dgwingtong|hotsuma|wwitzmaster|spherera|gsindiv|asahiko|senomama|aoi-sora|oktnzm|onigashira_3|kerokero0218|daisuk-com|soulful828|hatchman|kongariknow|nyokkori|kirin_tokyo|hyougoishin7|Utasinai|kamm|BlackJoker|mugdmugdmugd|automaton37564|nicoxnico|diet55|nasunara56|bloominfeeling|nariakioki|infomuseum|sub_low|MagnesiumRibbon|mekurayanagi|kast|evolymyllas|omi_k|name-25137412|urbansea|zyoucun|kyuuuuuu66|JacknicoL|da-vinci-da|NMDA|jkondo|mtakano|otokinoki|nijuusannmiri|TT_TT|Dersu|nandeyanen36|matsuo0221|nobodyplace|wetfootdog|Micawbe|kalmalogy|taka18782|kumeyu|AHOUJIN|letoro_mania|rgfx|kanu-orz|yukitoame|Mu_KuP|bullsco88|rn88888|soylent_green|kenchan3|deep_one|sarariiiiin|stumsky|kunipon|dobashi|naglfar|anoncom|smicho|sundays_co|arien_nu|junp_n|sagisite|hamukatumix|pinkyblue|mikankueyo|penpen-0704|kenzy_n|kakimasu|Yoshitada|nakayubi3|wow64|sase|xxbb77|tamamusi|cruyf|zinjoutarou|Kmusiclife|yoshiyoc|lestructure|kaanjun|cleome088|duckt|debabocho|hogeanonym_20101012|Panthera_uncia|Windfola|nekonyantaro|kloud|m-kawato|kako817v002|sugar_jirou|shun_libra|Mattyan|oskimura|MermaidSong|cubed-l|Shingi|shikiarai|norinorisan42|ookamu|take1117|CrowClaw|Sarutani|tannomizuki|nishinq|kukky|cider3613|law|Dicer|kane_to_onna|hikky1022|dowhile|inaminn|morita_non|oono_n|kouchi203|MS310ru|naotoj|enkunkun|Ukey|grshb|hattoushinha|jurgen|nekobosi|pha|kujoo|deamu|K_SHIKI|zebraeight|roppara|raraya|atoh|hakodama|fk_2000|matsuwo|kemononeko|mememememiti|uncloud|kei_1010|naqtn|gohankun|julajp|tomoya5|mirror_fukuyama|masa-wo|mattttsu|kimzo|denken|brainparasite|kanose|udzura|RPM|snobocracy|nre20689|murashit|Nihonjin|orangestar|p_shirokuma|nakakzs|kkk6|suVene|megamouth|aureliano|kensuu|yoh596|Red-Comet|i196|FunnyBunnyDizzy|tuisumi|hana5521|showgotch|endlessdoor|gnufrfr|Nayuta|sho322|barlog|naquamura|DustOfHuman|soteciki|nagonagu|hal-e|abc1cba|cho45|kawango|basseyboost|yuyans|BIFF|uzusayuu|shifumin|closer|semimaru|funapon33|rusemoly|demodemodatte|sifue|brtRiver|tatsunop|snowdrop111|gouzou|y-kawaz|amigogrj|the_dirty_boogie|rokushou|on_your_mark|monaken|ROYGB|D1953ColdSummer|FUKAMACHI|uxoru|NOT4beat|zenibuta|utd_sn3781|kubomi|nuba|ki-sa|ttttttttt123|saz_go|norinaka|yP0hKHY1zj|susahadeth52623|ScarecrowBone|kujira_aoi_blue|suteacco|mats3003|manaten|shibuyan730|tsutomu-switch|FTTH|msmaiplruri|mixxcolors|cinefuk|dsl|chocolaterock|sjn|toritori0318|e-chikuwa|nayuko22|atsuyoshinarumi|sand_land|wsskho_m|houjiT|oritako|kijtra|ogawalaw|tsu_nyan|nochiu74|Yuta_Eno|hanyA|gajumaro|kiyo_hiko|haruten|ShangriLa|jiminko|rti7743|tamasuji|about42|n_y_a_n_t_a|charismanbou|howlingmoon|nisezen|guru_guru|katsushisasaki|tmura3|yamaimo_san|kz78|saizou4|CCCPdotK|pkm|fut573|nemuibayashi|neowotona|tnh|gintasoy|asamaru|sora-papa|aomeyuki|fjsk|obimaruko|moomintroll0814|n314|yoshihiroueda|pukarix|fooky|nerimarina|genzouw|skur2|jgoamakf|loop|henohenoktmk|haruways|mikawa_1964|shigeno57|h935|royaltouch1297|palehorse82|mfrider|mama_yuyu78|syu614|Countdown|decnonet|Waspkissing|Hamachiya2|dusttrail|jeffwayne|sktknko|Hana56|go32ing|GROOVY|LaNotte|junnishikaw|chazuke|mchmakki|kimasse|sm3823|tweetbot|fukurow57|khss_keita|Ereni|Dy66|lovely|studiosilk|clapon|sukekyo|tomoneko029|mifio|haburashi13|ajic0n|Amrak|font-da|j-crouch|OzzyZOW|neko-panchi842|junmk2|sachi_pop|funkynaonao|lenore|yuki_sheena|hinaho|ohmomo|Yuryu|toh_chika|Eriador|ophites|erya|wander1985|keys250|lisagasu|hariopip|mpresso|saicolobe|chrl-ohya|ichiharu12|un_eternity|kyabana|slywalker|as3187|y-towa|heaco65|Zephid|chira_rhythm55|hazisarashi|Isuzu_T|kuzumaji|itotto|poponponpon|Dreaming-realist|skgctom|aplmyuki|ushi_mo|GuriGura|kato_19|qppxw221|yuuy0424|nomeaning22|dal|hisamichi|T-norf|angmar|shea|tnakamura|citron_908|ohnosakiko|rin51|sasakill|mixvox-j|saigami|bookbridge|goemon08|kerodon|segrokamome|seachikin|kaz-coz|marief8107|eriko315|a_dogs|senchafreak69|fuyuohmine|kananaka|AfroRay|kaerudayo|bigboy-kyt|abc9razysalt|KIKUKO|mahiru123|nogikusan|a666666|kurapapa|yuki_koga|ttrr|attrip|shun1s|mini_big_foo|yamadar|aliaki|rainbow_doll|rirekichi|potD|nanoha3|AltNight|takuwz|nowa_s|ebibibi|remcat|makopooy|navagraha|kamemoge|ikd9684|gedroid|chap_py|sripura|yhm96625|bluemuddy|fjb1976|taturo-00|hkn|workingmanisdead|mst_capri|rosedust1192|takefour|upapa04|Ez-style|igusa|umiusi45|nicottowatch|hatayasan|simplemind|kangiren|ikihaji_kun|sisya|elephantskinhead|sakichi33|wasai|posinega|tydk27|apricotbarley|ysog|umi1334|mantol|suihan74|hobohate|enemyoffreedom|underhitpoint|yachimon|findelight|adliblogger|tsupo|hanya_pung|uehaj|musyokuneet556|ninosan|Ohgyoku|sakuratandotbiz|arlu|lovecall|kasajei|flagburner|taka222|rocketboy_miya|linuxdiary|akio6o6|originalorange|behoimin555|bulldra|ami-go40|aoiro_moon|ko-ya-ma|masao_hg|u_eichi|s17er|ubiquitous2011|zentarou|ryoju|Lobotomy|cardmics|batti-8|new3|morimemeta|asimino|wschldrn|luvlife|tenku65820|tailtame|eriotto|RINKINGA|tukirou|soratokimitonoaidani|lost312|td_kirin|tsfmysd|caq|thrakt|bbk0524|keshitai|tuki0918|kunitaka|fuzz0114|michiki_jp|t-ueno|Islecape|HBK-mn|hyolee2|mattilda|dogear1988|trashtoy|wadap|kubodee|sokodora|hirosh_yoshida|kp1|AC0|miyadai454|dj_superaids|onelineca|edechang|sextremely|suzuki_yamadori|halcana|kawa7610|likk|hiromikov|unigame|todo987654321|kuxttoba|unionia|spacefrontier|asazuki508|type-100|IthacaChasma|MersA|yellowbell|rajahbrooke|YMZ|simabuta|mongrelP|masm|hharukaa|pazl|moiwamoiwa|redlabel|laislanopira|usukeimada|Nobeee|ktakemoto|kaggiko-chie|tahatahon|allezvous|whazuparthur|mofutofu|tackyv0o0v|yamadadadada2|yukke1006|T_Haahi|masudamasuo|yoooen|dobonkai|YukeSkywalker|datemakio|until600331|mak_in|pacha_09|threecloudjp|shira0211tama|kumokaji|americanboss|dual_shock_blue|utsuro|akiat|geerpm|spamalot|Luigitefu|tonton-jiji|kuriemon|northlight|dummy1|xsinon|kaeru-no-tsura|ledsun|odoratec|uwananiwosuru|gazi4|lotusland|montnoir|dennou_kurage|aienstein|hanazukinokita|cheapcode|megane1972|wakachi_fehhu
みんな少ないね。おれは前はかなり非表示に入れてたよ(下を見てね)。気にいらない記事をブクマしてるやつらは全員非表示にしてた。これだけ非表示にしてもたいして見える景色は変わらない。いまは元に戻したけど。うぜえと思ったらどんどん非表示にするといいよ。(*追記 なんか改行しないせいか途中で切れてたので、ところどころ改行してみた)(*追記2 文字数制限でもあるのか全部入らないので別記事にする→http://anond.hatelabo.jp/20140504105600、http://anond.hatelabo.jp/20140504110458)
angmar|ryokusai|activecute|mamasan84|hurdle91_4|TakahashiMasaki|tajimaboard|hatake|metalbabble|xevra|ftype|zaikabou|atoh|zenibuta|IGA-OS|waccher|susahadeth52623|FukayaAruto|Hana56|rfg5ks|ys0000|CavalleriaRusticana|solidstatesociety|cheapcode|Yagokoro|tanakadaishi|Cichla|y2_naranja|nagaichi|www6|ain_ed|anticipate|yurutena|akkakka|jtw|konkon1986|frsatti|rag_en|aenea|junshoku-159|skeleton-lair|fusionstar|n_pikarin7|edr|tirol28|ttlweb|mintpafe|almondcrisp|by-the-A|sagonohashi|papaopao|kingworld|Southend|phe|babanshika|mujisoshina|koubemise|telmine|kawatuka|mi2maru|honeybe|pumpkinphilicity|rika-rikarin|WinterMute|rz1h931f4c|snipesnaps|hamatsu|aminisi|faintmemory|Carbon12|narita_seiki|yuki-endo|syuu1228|Kou_RYU|ult100|h_tksn|DrFaust|imai78|momonger|Iridium|deadcatbounce|tender_apricot|Louis|ore_de_work|ranobe|ask11|aont|m_uchino|citron_908|orenonihongogayabai|temtex|raf00|barnout|raizon_detre|wartanenemon|HirokiJpn|chochonmage|jaikel|sulraw|MersA|ululun|hokuto-hei|ketudan|runeharst|k_gobo|n-styles|tomitake_flash|ta|takey107|pulp_literature|shibuyan730|vierger|karpa|feita|Serious|isshoku|hisamura75|quwachy|chuck_41|timetrain|kurai|icchan0000|vid|F-SQUARE|saebou|zz_sexy|me5655|md2tak|vitamin_G|konekonekoneko|false_alarm|kawacho|harumomo2006|tannsuikujira|diveintounlimit|mainichigomi|Irris|what_a_dude|konstantinos|koinobori|dlit|Sinraptor|ghostbass|sor_a|AmanoJack|kono1|Pokopon|genovese33|iwasi8107|Tamemaru|kirarapoo|goldwell|furukatsu|inadatomoaki|xufeiknm|mohno|north_god|mk-biz|zu2|kurostocking|shikinami|kahusi|Harnoncourt|rzio|mappy0x1e|tohky|delphinus35|imoguratan|hidenob|kirishima2813|tikani_nemuru_M|bsiyo|nanoha3|abtendon|hal9009|ChieOsanai|brimley3|gigi-net|no45|yajicco|sakage001|jituzon|Amerikan|wackunnpapa|ruletheworld|monaken|kimuratoshifumi|yuka_taso|kensir0u|mushi_cake|naok1991|irigium|goodhome2|lightningraft|lv-99|mashiroinc|wasara|mobanama|funaki_naoto|arktks00|tutomutti|MagnesiumRibbon|Snail|a1101501j|kowyoshi|snobsnog|rAdio|oskimura|soylent_green|Inuneco|nakakzs|Naotoh|paulownia|malark|itotto|law|key_motar|ryankigz|DG-Law|BEW|gyaam|sekiryo|noitseuq|HMCO-409|miruna|masa2501|rosa_nera|schnja|raitu|hiroyukiegami|gerling|hihi01|tappyon|kanimaster|omega314|CrowClaw|masaru_al|tezawaly|tester000|a2de|fazz0611|m-matsuoka|y-shift|Ri-fie|motorunder|cubick|gilugilu|oldriver|ueda2|k_ueda|TiMaria|thesecret3|nuke|sdsdsdd|whiteness|sunoho|riu3o|copipegetter|sugowwww|PSV|jay926|SiroKuro|tonapa|mfrider|inet_malic|kmyken1|passy_no_okan|mats3003|kamisetsu|h108|zonia|jollymolly|sajiwo|Junpecon|pompom20|qma5|netnotora|machida77|kyoumoe|sinx|simulacre|Geroro|nekoaruki|on_your_mark|chihhi1105|matsuda0111|repunit|t_ommy|utd_sn3781|seenone|iguchitakekazu|boke-boke|ymScott|gure3333|saurel|acchonburike|chocolate-choko|more_white|migurin|ID_u1nje3rh|install_maido|Memeo|kumonopanya|solaris_almagest|labeneko|Ilovenoel|junya_asa|don_ashill|laislanopira|serizawawawa|yachimon|ZeroFour|atoz|chi_to|isikasa|AKIYOSHI|n_euler666|namasutenohito|k_wizard|onanieCEO|minorito0411|kazuichi85|waferwader|gogatsu26|takanofumio|SerpentiNaga|kaworry|rjbook|baatmui|deadcalm|Scatterbrain|htktyo|medicineman|jun8|kaos2009|curln|sika2|TKK8637F|hvc-001|temtan|Dersu|Nowhereman|death6coin|himajin774|yutamoty|atsushifx|worris|halfstory|sasahira|noraneko|suzu_hiro_8823|dreamplan2004|u-chan|u_eichi|fuuumi_jp|reima|siso3|mrmt|RocRoc36|oreimo|Cliche|f_e_ita|Ratty|O_C_T|nunnnunn|y883p2|HitTheSupportersBull|mansour|chintaro3|wacking|erohi69|tareishi|www_taca|meganemegane103|hiro-rock|headstream|vanish_l2|dark_dove|kadukimoon|na23|lbuki|KANIBUCHI|gokino|CelestialFire|kaerudayo|remsleepless|jimihendrix0418|tsumiyama|coffee_and_tv|shinobu11|complex_cat|mightyflapper|yamanone44|harpy|yoghurt|teren|yamigome|joruri|napsucks|sagittaro|buripig|TsumuRi|setoFuumi|klaftwerk|zakima4|noma-n|wassy_5|corgi_corgi|mizkiyo|makoponpon|mayu_boooon|Clock0311|f-nyoro|wawawaw73|planetes|wands_ace0|amajam|Soraneko|kurokuragawa|karatte|nakamurabashi|goodbadnotevil-syamo|arakawakumiko|hamanako|API|WereIm|Cunliffe|gasemato|smartbear|rikopapa|skintight|pop23|sbr_m|shipayon|giant-killing|Gesaku_G|rxjun|KIM625|Mist|masatanz|hatesenID|murderboy|boom-boom-boom|hanaseleb|MHz0129|sooe|iMomonga|amamiya1224|zakshin|kimamaxx|high-d|moshimoshimo812|miryu2008|erogazo2|ks1234_1234|knagayama|uporeke|kuborie|welpherd|perfectspell|neogratche|sakurasuisan|maru-herzen|idiOt|yukatti|bohemianway|takaharu07|y-mat2006|hidematu|gensouyugi|weissorvice|aereal|wazurai|pokkurishibou|nashitomo|izumino|steel_eel|heal106|okakao|amamako|gapao|kisaragisan|waumao|okemos|sillyfish|kzhvsonic|manndora|sa_tie|Nakano_Hitsuji|tenku65820|tsunami246|kikujidou|SIVAPROD|tano13|tunaguinfo|Francesco3|coldbrain|koutyalemon|hiruhikoando|Rings_of_Saturn|guldeen|aotake16|besvna|mackey13|mikemaneki|a_dogs|wideangle|shinpei0213|mg69|sichimin|cubed-l|CIA1942|turu_crane|yetanother|Nachbar|kamikami3594|takobue|ext3|yahen|KoshianX|Cujo|goma108|Mikagura|an111|matagashi|Fou|ritsuca_ms|kagiya|mizunotori|feinyao|karin0712|nasuhiko|setopero|one-night|memoclip|kits|taninsw|maturi|ezk|dal|toaruR|sugi-cho|appletriangle|orchid_888|sisya|karekomi|shibudqn|takari27|hshinoda|pikayan|yukisatoshi|kozai|qxpi|yamifuu|hisaichi5518|ryukawasa|kangiren|tora_17|karuran|CGA|takeishi|shimomurayoshiko|enemyoffreedom|shijuushi|xr0038|nmit1939|anbul-441-x|snow113|misias|asami81|tekitouotoko|kussun|rs6000moe|yasumo|pycol|Mash|fm7743|fs001493|fogshadow|inumash|blue456|feilung|yuiseki|northlight|denken|ringo304|briers|sutara_lumpur|nippondanji|azumi_s|katow|SHMT|Tomato-360|sadadad54|iluka18|morriedes|lostman6|kurano|ken47|SasakiTakahiro|dododod|shortcut3|shin1830|T_Tachibana|kwhm|akawi|mizukemuri|kmagami|wander1985|mangakoji|shby_sht|skymkt|mahal|wanderingdj|ocura|sirocco|hyperkick|neojin|yokomichisizuka|spring-ephemeral|undo0530|aklaswad|takhasegawa|nogikusan|inoken0315|b00512177|unigame|multiplex00|manFromTomorrow|chinu48cm|mi0115619|seabose|hasetaq|miulunch|rxh|caz-spatial|zakkie|camel_neck|donncherrrryy|suift|kakkunpakkun|takadayararetayo|Assume|bsumoru|redfang396|hatoken|ysync|kyorakuan|taro-r|qpwo1|bioweb|wdnsdy|Domino-R|gifumaster|aitanisan|mycrabhands|juner|zatpek|tyuke|fumysan|tailtame|mikkemac|osakana110|KH_suecat|lucy5485|GEGE|jeswear|yamada_si|ryosukeoi|shoot_c_na|ak9|makaronisan|magaz11|umiusi45|ricto|dp643|crazy_pumpkin|FAEB|iaskell|anigoka|linden|llil|hbkm|kurahito|niccoro|dsl|escape_artist|azurun|asitanoyamasita|meme-o|atolsha|highcampus|frivolousman|yaoki_dokidoki|GiGir|kaitoster|p_shirokuma|genesis|zuzusea|ddd01|there_and_here|torinanban|ardarim|mashori|scoops|yspmymt|aoasagi|nzai|sota344|yu14f|tukinoha|Run2|y_arim|hazardlamp0855|alshine5|measure0315|fukken|sander|kathew|bigburn|darry129|yukikeiichi|chlono|Erlkonig|sontyo|Real_Great|youichirou|s_atom11|Santamaria_morishi|te2u|FFF|nextworker|yuaaa|top-poi|shaphere939|damepon|ka_ko_com|noreply|fuba|uxoru|harax|marvelarrows|omosoku|evertex|testa_kitchen|noritak|sin_cos|kashmir108|Philos|acqua_alta|nicovideoch|cloverleaf24|uduki_45|momo_suke|naru0504|o_mega|sotokichi|plutan|A410|hanazappa|crescent398|habanero02|bluesunday|Phys|donkey145|momomubi|hyougen|toocheapjp|fontedeagua|yteppei|came8244|bb_river|shimazoom|gebugebu|kybernetes|type-m-c|instance0119|smtp|shimada65536|SoraNyasukE|mfigure|ten_ad|air25|cutxout|yukky2000|jingi469|SZKAKTK|mil-memory|tama_no|nrke|ritsuch|kossie89|reve_rainforce|rinrinbell|poccopen|asiamoth|tow-mas|panparade|urarai|ten7132|a6u|kusaret|perucho|REV|paraselene|rdcs|dekijp|yasunori|Dic|t-rio|anoncom|John_Kawanishi|hyaknihyak|honyapen|koyhoge|uasi|arajin|lancys|ukdata|rairai16|hiroomi|angelica4ro|kidego|hakodama|unnmo|yukipo2008|ermine_twitter|imo758|shinpson|Naruhodius|Pz-4|sadn|pinoem|noname_lab|Usaku|babelap|hirali|yamakozawa|ocha39|whiteball22|sezitak9|necolaus|hannover|Barak|ahya365|EurekaEureka|suimon|Pasta-K|zoidstown|silvermoai|love-peanut|nekozea|toronei|haru-s|deeplove|TEtra|nkoz|GilCrows|nasunori|asmblr|dodorugefu|ueday|gogo0721|plustica|kobayasiikumi|howaito_denkyu|mst66|rsh|howdying|spade9970|TOKOROTEN|shinagaki|hidesuke|lovelovedog|siromado|d_pressure|coldcup|amesuke|kenzyarai|termin2|hitohitohitto|y-kawaz|jnanukom|hashimoto0226|takeyamaken1989|zorio|otsune|tatsuzawa|nemiko0324|R_Goines|kubodee|pulltop-birth|impuritynot|loliniichan69|cazukit61|tuds7280|pochi-p|Xenophias|zeki|akumasyougun|sucrose|chopapapa|takashi1970|manaten|TYK|suzunami1001|Jinmen|rin51|qnighy|gikazigo|kir_royal|ohmomo|yamada55|halt_haru|prodakuto|kousuke425|hazime2914|keyxxyz|kuroneko15|doraman|kobo454|Shimataroh|Sumitomo|nicoyou|jingi2525|kimottamakimo|cheva|era1978|bovis|kaipu|worcel_0910|wakabatan|tenkoma|u-ichi|anpo-sumeragi|neco22b|bobcoffee|u-c-h-i|choco-holic|akishin999|takuwz|torish|dnsystem|Aiffet|yuhsuke19_hg|solailo|kensk714|farfromforest|type-100|cupnude|NOKIA|a96neko|Lif|benriman|mesowest|makimura_amane|rna|quesera2|chihaya_72|gggsck|yukkie_strike|frog78|geromi|ku4ro|perisy|mk16|deep_one|hiyamad|a_matsumoto|sai-coro|mock_on|smicho|kameniwa|kokogiko|keiseiryoku|ktasaka|sophizm|unterwelt|mate-ra|ashitamad22|kamayan|panpanpanda728|hiromi163|tekipaki_work|ramyana|very_high_energy|Misapon07|Keee|softnet|est-ferelith|SizSiz|mk_chap|boukoku_db|plopea|tabyy|Hakase|gajumaro|kskb|outalaw|dita_69|kurean|netto_mk|tk18|eagletmt|vimp_fun|Magicant|junboo28|textmarch|yamakaz|amemorandum|nekoluna|da-yoshi|rikokis|muhimebiko|Makkon810501|karimikarimi|pushol_imas|crimson00|c430c|yhmt|ago_kyo|hotnot|kuronaga|goroyung|sikii_j|Bottoms_at_Narashino|elve|bunbun56|tanemurarisa|kamizyousan|KAOLY|KatmanZ|hidex7777|DocSeri|gauqui|hiby|zekky_f|natsu_san|toratorazero|tigertissue|takanorikido|stick01|rerofumi|t_sabaku|latemder|gogorou|masterknight|clworld|thvenr|pacchii|rikuo|keta_chop|kasuyarou|hu-ya|kura-kura|aka-ari|domenetwork|ken3884|BRITAN|harasyo865|sea_side|MAXjeep|aria_corp|kotamania_00|yutta125|agni|jalapeno78|nobby81|secondary9999|whirl|rxv15051|dudley_ty|lain1394|pugiemonn|arlu|mits_00|Heron|pega2s|cosmetick|tokigami|p_ny|thrthrsvn|fellows|ikemo10|hase0831|hexol|decimal|xzglrete|bookmarkjp|atawi|nugget|takayuki666|dokumizu|unyuunyuho|tzt|humid|himitsudesu|hildo|s-tomo|joyjoyjo|Coolions|kudokann|seaview_p35|totttte|sorshi|tricksterchaos|ikoekoe2|irhutnyui|brax|kasuga-k|sekiyado|porimern|silverscythe|pccs15|rutenworks|oka_Elizabeth|beaux25|kenny_green|osankuma|dirtjapan|plumsyrup|haru-mutsuki|Rikerike|modahand|fujeans|Netalacy|kazoo_oo|itouhiro|fright|crea555|samepa|kana-kana_ceo|multi12|b4takashi|nnh|FeZn|richard_raw|qinmu|neko73|takisok|rumbaba|shinchu|ya--mada|rk22|fabu0405|someinu|haruka-izumi|taqpan|Cetus|candy296|cubeon|reds_akaki|MERIHARIBOY|hidekkytsuji|TiTo|gomis|arien_nu|pogemutaBN|AmaiSaeta|masarusanjp|Nihonjin|SL230|mikage014|jackbartlett_mhp3|gui1|a-mutter|aegis09|FTTH|kusigahama|dame_40|sakurasakuras|laiso|mumu3|sank0n|shimanp|hush_in|ekwosbooks|yuumi09|lifespiel|geppey|wancyope|Mukke|kugyuemon|shmras|caliburn|oppekepei|t-tanaka|lepton9|lemon_tea906|madhatter08|weeklydennpagraph|orbis|posinega|damekana|inaco175|sasaplus1|waribashi|Eis|sik308|sigege|mustang1234|iitripod|Muke|solunaris149|sumoa|munetc|egpehcbd|junmyk|kk_solanet|shiba-710|Bifuteki|t-murachi|kommunity|asagiazure|erog|myoukabi|neko0_neko0|SimonMajin|McCammon|racec|funekaz|eo64air|watchcat|kabutch|Gelsy|kitayama|nvs|AnonyPre|masudamaster|usamyu56|hamusoku3|jojo0312|oreimo1234|braverobo|Outfielder|FEFE|radu|T_da|hatebu_test2|ksaitou|fuga_maito|wata300|k-noto3|tomo31415926563|tencube|vanacoral|kogarasumaru|min2-fly|negi_a|kagioo2uma|ippai_attena|mizuki-yu|ncc1701|gimonfu_usr|holidays1976|appbank|abiruy|pasokonta|sleepyuzura|asakura-t|seachikin|atsk|bewzew762|revanya|flasher_of_thought|yasugoro_2010|rainbowsazaki|kagurakanon|repulse|idoyesido|terata|orosi02|Chlocha|takhino|mu025rara284|yamanka00|ninntai|sak1ta|Sion96|dai_original|hoshiyo|kujoo|nj0831|funiuni|egys3|Briareos|warriorking|bzb05445|juyenmaru|tanakara_botamochi|joenaha|riksdybednmtuk|dokaisha|vdsayere|TakamoriTarou|home1986|isaisstillalive|muramasa0717|lqgq|tinsep19|cad-san|katryo|garage-kid|Yamakatsu|Okky|emiladamas|suesh32|cotton6|maromii|kasajei|gabuchan|tukasa55|ryuzi_kambe|kaz5555|STARFLEET|okra2|mythm|repon|shields-pikes|kari-ko|cha-cha-ki|Sucker|takeodon|houyhnhm|takimo|tamakoshidada|kash06|kasaraku1|onavi|hanatarekozo3|kyotoeye|mornig89|cormorantcraft|seiyuDB|waman|benrista|nishiokamakoto|dora_rash|mkzk|twisted0517|y_ryuzan|takc923|HSIN|omi_k|sumida|vanishatea|detteyouchi|junkbots|segawa-y|thun2|delusion_epk|birthday66|tsfmysd|str017|mike_neko|k-p_aoikuma|sakura-hayabusa|sasaq|yakitori-siro|childdoc|komamix|U1and0|sasaboushi|ShangriLa|genpi|iww|as62|Gustav13|
ゆーすけべーさんが以前に作ってたimeeroみたいな感じです。画像Blogをスクレイピングしてエロ画像を効率的に見るサイトです。
なお、先程解約手続きを済ませたので4月末くらいに見れなくなります。エロサイト自体にあまり興味がなく、ローンチしたらやる気が無くなったのです。
テスト駆動開発がやりたく、DSLに強いロック魂を感じたRSpec。
はやりに乗ってBootstrap。
特にCapistranoは名前がキュートでやっていることがカッコイイのでどうしてもやりたい技術でした。
あと、メインとなるRailsはこの記事に書いているスキルの中で唯一経験が無かったというのが一番の理由です。Rubyが好きなのもありますけどね。
いやぁ、退職しようとすると会議室で8時間説教されるって都市伝説じゃないんですね〜。
ところで転職活動をした感覚だと、今より給与が2倍出るところでも簡単に内定が出ることが分かりました。
転職活動やエロサイト作成を通して精神的な余裕も出ましたので、もう少しSIerそのものの問題、仕事の進め方などを熟考した上で、本当に正しいSIerのあり方を考えたいと思います。無理そうなら逃げます。
以上、よろしくお願いいたします。
id:minamiyama1994 さん、反論してくださってありがとうございます。
Haskellファンのご意見がいただけて嬉しいです。元増田です。
記事全体で「関数型言語」と呼ばれているものは「関数型言語一般」ではなく「Haskellや一部OCamlの話題を含むごくごく一部の言語」の話である
わかりにくくてすいません。記事では「関数型言語」の話はしていません。「関数型プログラミング」の話をしました。
「関数型言語」は範囲がよりボンヤリとした表現です。たとえばC言語が関数型言語かどうかをみても賛否両論にわかれるでしょう。
私が記事を書いた目的は、”関数型プログラミングに縁のない人に関数型プログラミングをわかりやすく紹介したい”でした。
その目的のため、「関数型言語」という表記を注意深くとり除き、代わりに「関数型プログラミングをサポートした言語」という言い方をしています。
このスタンスの上で、
”関数型プログラミングをフルにサポートした言語”の代表として、Haskellを紹介し、
”関数型プログラミングへのサポートが片手落ちな言語”として、LispやErlangなどを扱いました(それらのファンの皆、ごめんなさい)。
関数型プログラミング初心者の方は、それらの差異なんてどうでもよい、と考えるのではないでしょうか。
関数型プログラミングとは何が良いのか、を大雑把に知りたい。
そうなのではと考えて、あえて区別せずに記事を書きました。
「たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて」? モナドはそんな限定的用途のものではないし、パーサの理解とは無関係だ(単にライブラリの設計の問題)。それにApplicativeスタイルのほうがパーサが書きやすいという人もいるだろう
id:minamiyama1994 さんの仰るとおり、モナドはパーサー以外の多くの応用があります。
現状多くのパーサーがモナディックパーサーとして書かれています。モナディックでないパーサーは、あまり多くのユーザーには使われないでしょう。
モナドなどの抽象的な構造が幅を利かせてるお陰で、ライブラリに秩序が生まれ、ユーザーはそれを使いやすく・読みやすくなっている、というのが私の言いたかった主張です。
(なお細かいことで恐縮ですが、ある種のモナディックパーサーはApplicativeでは書けません。その点をお忘れですよ)
「テキスト処理」に対して
お前それShellやPerl、RubyやPythonの前でも言えるの?
「GUI」に対して
この二つは、先人が不利な環境ですごく頑張った成果が現状なのだ、と思っています。
本質的には関数型プログラミングの強みが活かせる分野のはずです。
「個人の技量の話題」
「レシピ」に関しては、関数型プログラミングのスタイルでは、手続きを手続きとして自然に表現できるのに対し、オブジェクト指向ではできない(DSLチックなものになってしまう)、ということを言いたかったのですが、
わかりにくかったですね。
「書きやすい」
(*)関数の例で、関数型プログラミングの無駄の無さを示せた、と思ったのですが…
マヂですか…反論のためのでっち上げとかじゃなくて(失礼)?(追記: Haskellの方が「短く書ける」、のタイポだそうです)
Haskell布教のために有休とって4時間かけて書いたのにーw
撲滅…
ショボーン(´・ω・`)
近年、関数型プログラミングの重要性はいろんなところで叫ばれています。
Javaの最新バージョンに関数型プログラミングに関する新機能が加わりました。
Rubyも昨今、関数型プログラミングへのサポートが手厚くなってきています。
プログラミングの教科書の大手、オライリー社から、Javascriptで関数型プログラミングを行うための解説書が発行されました。
関数型プログラミングへの注目度は高まってきています。
おそらく、みなさんは既にオブジェクト指向が何か、を知っています。
でも関数型プログラミングとは何か、胸を張って語れる人は、周りに見当たらないかと思います。
実際、オブジェクト指向によってプログラミングする方法は、わかりやすい解説があちこちにある一方で、
関数型プログラミングとは何か、何が良いのか、ということについての、よいまとめは見つけることはできませんでした。
この記事を読む方の中で、「関数型プログラミングを取り入れるか・取り入れないか」で切実に悩んでいる人は、おそらくいないでしょう。
この記事はあまり細かいところに立ち入りません。関数型プログラミングを使う側の立場に立って、利点や向き・不向き、それが導くスタイルを書きました。
みなさんは鳥のように飛んで、高い空から、関数型プログラミングとは何か、何が良いのか、を見渡してください。
オブジェクト指向的アプローチは、名前をつけてプログラムを整理する。
関数型プログラミング的アプローチは、汎用部品でなんとかする。
Googleが近年リリースした言語、Goには、”継承”を直接サポートする仕組みが無いことが話題になりました。
また、Mac OSXの基幹ライブラリCore Foundationは、ライブラリ自体はC言語で書かれているにもかかわらず、その設計方針は明確にオブジェクト指向です。
その本質とは"名前をつけて対象を識別し、それを扱うこと"、にあります。
最もプリミティブなオブジェクト指向の対象は、ファイルハンドラです。あるファイルを開いて、読み込んで、あるいは書き込んで、ファイルを閉じる。
これらの処理をまとめたら、わかりやすいですよね?
対象に関する処理を、対象の周りにまとめる。これがオブジェクト指向の基礎的な理念です。
識別することとイコールで比較できることは、とても良く似ています。
イコールによる比較は、オブジェクト指向では鬼門であることが知られています。
PointクラスのインスタンスとColoredPointクラスのイコール演算をどう決めればいいかに、正解はありません(詳しくは"effective java"をご参照ください)。
また名前をつけて識別する対象は、フワフワしていてはいけません。
たとえば、"軍人の階級"をオブジェクトにしたとしましょう。"大佐"クラスのある兵士は名前のフィールドや、性別のフィールドを持っているでしょう。
ところで彼が昇格したときに何が起こるでしょうか。
新たに"少将"クラスのインスタンスが作られます。"大佐"クラスを破棄する前に、名前、性別、その他沢山のデータを引き継がなくてはいけません。フィールドを増やしたい場合はその都度コードに修正を加える必要があります(*)。
なるべくイコール比較を避けたい。対象は不安定なものではいけない。では何に名前をつけて、識別するか。そこにオブジェクト指向技術者の熟練度が現れるのです。
一方、関数型プログラミングでは、特定の何かに名前をつけるより、極力、汎用部品でなんとかしようとします。
関数自体をリストなどのデータ構造に詰めることもよく行われます。
実は、関数型プログラミングというのは本質を表していません。
関数をはじめとして、リスト・ツリーのようなコンテナ、手続きを抽象化したもの、回路を抽象化したもの。
あらゆる対象を値として、合成し、ときに分解し、新しい値を作ります。
変数に適用する処理を作りあげることが、とても簡単だからです。
四則演算が定義されたデータを詰めたデータ構造もまた、四則演算可能だったり。
誤解を恐れずに言うと、オブジェクト指向がトップダウンなのに対し、関数型プログラミングはボトムアップです。
関数型プログラミングをサポートする言語には、沢山の汎用部品が定義されています。
このような構造をインターフェイスとして、様々なライブラリが組まれているので、
たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて、
パーサーを理解できれば、JSONパーサー・ XMLパーサー・markdownパーサー・C++パーサー ... などを理解するのはとても容易です。
理解しやすいこと。これが関数型プログラミングの大きな利点です。
追記:
また、汎用部品と型のお陰で、ライブラリのドキュメントが圧倒的にひきやすい、というメリットも有ります。
Haskellな人がPythonにトライした結果 - Togetterまとめ
関数型プログラミングは「厳密な事前設計を必要とするため、簡単なことをやるのにも時間が掛かる」。
>> map (*2) [1,2,3] [2,4,6]
邪魔な”儀式”や、"おまじない"のコードが徹底的に撤廃されているためです。
関数型プログラミングのコードは、潔癖かつ濃密です。
たとえばC言語でint hoge(int x,int y)が定義されているとき、hoge(3)はなんの意味も持ちませんが(コンパイルでコケますが)、関数型プログラミングでは意味があり、実際に有用です。
上の例では、「掛け算をする」(*)関数は、二引数関数ですが、それに引数を渡して作られた「2を掛ける」関数(*2)は、一引数関数になります。
関数型プログラミングでは、「簡単なことは簡単にでき、複雑なことは複雑にできる。ただし、間違ったことは殆どできないか、全くできない」。
また、静的型付けの力によって、コード補完は非常に強力になっています。インテリセンスの比ではないです。
たとえば、関数中のある表記の型を任意に表示できます(GHC/TypedHoles - HaskellWiki)。
やがてやってくる未来には、プログラムをテキストエディタで書くことは時代遅れになっているでしょう。
統合環境のサポートで、バグやミスの少ない、スムーズなプログラミングができます。
そしてその環境で動くプログラミング言語は、関数型プログラミングをサポートした言語なのです。
以下の様な兆候を感じたら、あなたはそのプログラムを関数型プログラミングで書くべきです。
一般に、オブジェクト同士の相互作用が複雑になるほど、オブジェクト指向では手に負えなくなっていきます。
そういうときは、オブジェクトを直接扱わず、替わりにその"相互作用"を扱うことで、複雑さを軽減するアプローチが有効です。
それこそが関数型プログラミング的アプローチです。
特にオブジェクト指向が有効なのは、プログラミング初心者がそのコードをいじるかもしれないときです。
関数型プログラミングは、強固さと柔軟さの代償として、高い学習コストを伴います。
オブジェクト間の相互作用が複雑でなく、着目している(名前をつけている)概念が安定しているとき。
そして、プログラムをいじる人たちの間で共通理解が図れているならば、オブジェクト指向が有利です。
遅延評価という機能によって、レガシーな言語で扱えなかった、巨大な数を扱うことができます。
関数型プログラミングで書かれたプログラムは、正確さが要求される、金融関連の業界で使われています。
手続きとしてパーサーを記述できるので、テキスト処理プログラムはより理解しやすく、メンテナンスしやすいものになります。
関数型プログラミングを知らない人は、「正規表現でおk」と言いますが、
彼の書いた複雑な正規表現は、半年後には(書いた本人でさえ)理解できなくなっていることでしょう。
手続き一般を扱うことができるので、途中で割り込みのある手続きの表現も容易です。
関数型プログラミングをサポートしていない言語ではコルーチン(ファイバー)などをつかってなんとかするしかありません。
さもなくば、非並行処理では普通に関数として記述できるところを、並行処理のために、Builder,Strategy,Command,Interpreterパターンを駆使して書き直すことになります。
Javascript使いの方は、Deferredなどの構造を使うでしょう(http://qiita.com/KDKTN/items/4c6986049d204f0645d8)。
C++使いの方はBoostで頑張りましょう。破滅的に解りにくいコンパイルエラーメッセージと格闘してください。
もう少し簡単な例をあげます。
あなたは、あるレシピにしたがって、自動的に料理を行うマシンの制御プログラムを書いているとしましょう。
1. まず玉ねぎを炒める。
2. 飴色になったら、肉を加えて炒める。
3. 野菜を加える。
4. 水を加えて煮る。
5. スパイスを加える。
…できませんよね?何故ならば、各ステップの"間に"、マシンのロボアームの位置や動きを調整する処理が必要だからです。
これをオブジェクト指向でやろうとすると、各ステップの副作用として、それらの処理を行うことになります。
そうすると、マシンが二機に増えた時などの変更量は、絶望的なものになります。
あるいは関数として表現するのを諦め、手順全体をDSLで記述できるようにします。
このアプローチは関数型プログラミング的です。しかし関数型プログラミングをサポートした言語の助けなしでは、そのDSLを記述するために沢山のユーティリティーコードを書かなくてはならないでしょう。
オブジェクト指向的アプローチでこの問題をエレガントに解こうとすると、クラス化の粒度を上げる事になります。
野菜クラス、フライパンクラス、ボイルクラス、フライクラス、焼き加減クラス、アームクラス、野菜の大きさクラス、切り方クラス、焼き方クラス、"焦げたよ"クラス、etc...
こうすると早晩レシピはプログラムのコード上から消え去ることになります。上記のたった5行は、依存性注入のオブジェクトグラフを構築するコードに取って代わることになります。そこには沢山の挙動の制御がオプションとして付記されているのです。
カレーなど、ある種のレシピに限定することで、見た目の理解しやすさを得ることができますが、一方それは表現力を損なうことを意味します。
C言語などではマクロを使うこともできますが、それは結局、関数型プログラミング的アプローチの意味するところと同じになります。すなわち、補助のために沢山のコードを書くことになるでしょう。
iOSのAppstoreアプリは、"無料"と書かれたボタンを押すと、それが"インストール"ボタンに変わり、それをもう一度押すと、ダウンロードの進捗を表すインジケータに変わり、それを押すとダウンロードをキャンセルできます。
このように、位置は同じなのに、ステートに依って見た目と機能が変わるボタンは複雑です。
これをオブジェクト指向で実現しようとすると、
という下らない問題にぶつかります。
一方関数型では、"機能"、"見た目"、"状態"、を独立に扱って、それらを合成してボタンを作るので、迷うことはありません。
「同じ位置にあるUIオブジェクトは、コード上で(インスタンスとして)独立して、他から干渉を受けない」
この条件が満たされているうちは、オブジェクト指向でGUIを実現することに無理はありません。
しかし、携帯端末のような小さい画面で、多くの機能を達成するためには、UI要素はコンテキスト依存的に複雑になりがちです。
近年、PCのディスプレイの大きさは、頭打ちになってきました。
画素数は増えているのですが、MacにおけるRetinaのように、複数ピクセルでひとつのドットを表すようになってきています。
これは、ひとつの画面に置かれるボタンなどのUI要素の数は、これから先の未来で増えることはない、ということを意味します。
したがって、未来のGUIのプログラミングは、注意深く機能をピックアップして制限するというデザイナーの努力を脇におけば、
関数型プログラミングの力を頼るしか無いでしょう。
つまり…
Haskell さいこうなのおおおおおおおおおおおおおおおおおお!! おしっこ漏れちゃうのおおおおおおおおおおおおおおおおおおおお(゜∀。)ワヒャヒャヒャヒャヒャヒャ
1. google:すごいHaskellたのしく学ぼう を注文する。
2. Download Haskell を自分のPCに導入する。
3. コンソールにghciと入力して、対話型コンソールを立ち上げる。
4. 次の関数をコンソールに打ち込んで、結果を見る。即値で書かれているところとかをいろいろ変更してみて、感動する。
take 4 $ map (*2) [1..]
追記:
いかがでしたか?
ちまたには、関数型プログラミングの利点は変数が無いことだ、とか、より安全だから、とか、より速いから、などという妄言が満ち溢れています。
オブジェクト指向と関数型プログラミングは、水と油ではありません。プログラマは自分のプログラムに最適なアプローチを選ぶことができます。
一般にはあまり知られていないことですが、Haskellにもオブジェクト指向へのサポートがあるんです(Lensライブラリ、これを使用したサードパーティ製ライブラリも最近増えてきています)。
この記事を読んだオブジェクト指向プログラマのあなたが、少しでも関数型プログラミングに(そしてHaskellに)興味を持ってくださって、ホームセンターの大人用オシメのコーナーが大賑わいになれば幸いです。。
ここの所は、今回の例ではいまいち見えづらい気がする。今回の例で複雑になっているのはモデルだけである。ビューがやる事は、「納刀する」「変色した血が飛び散る」イベントをlistenして画面に描画するだけのはず。MVCのイベント機構は、モデル→ビューとコントロール→モデルのメッセージ通知を行うためのもので、モデル同士の通信についてはノータッチ。モデル内での相互作用に、単なるメソッド呼び出しを超えたあれこれが必要なら、DSLを作るなり自前でイベント機構を作るなり好きにして下さい、というスタンスかなあと思われ。
といってもQtのsignal/slotなんかはモデル同士の通信にも使えるわけで、そういう意味で最近のGUIエンジンはMVCの範囲を超えつつある。具体的に「Controllerからの入力もModelの自発的な状態遷移も、同じイベント機構で扱いましょう」というのはMOVEの考え方に非常に近い。
http://blog.neo.jp/dnblog/index.php?module=Blog&action=Entry&blog=pg&entry=3442&rand=9193a
MOVEの考え方からいえば、モデルの責務が吸い出されて単なるデータになってしまうのは、むしろコンセプト通りであるとも言える。
なお、単純な例を超えてRPGの実装を自分が考えるなら、オブジェクト指向設計としては攻撃方法型や特殊作用型(毒とか呪いとか)同士の相互作用を主眼に置いた感じになって、モンスターや勇者は単なるデータに近付いていくだろうなあ、と予想してみる。組んでみないと分からない事もあるだろうけれども。
例えばスーファミのFFみたいな、古典的なRPGの戦闘シーンを作っていて、「勇者がモンスターを攻撃する」。
勇者.attack(モンスター);
という設計だったとする。
これに「モンスターが毒を受けて、自死する」という挙動を追加するケースを考える。
毒.attack(モンスター);
やや複雑な変更になりそうだが、勇者の攻撃とのタイミングの差で、
のようになるとしよう。
まず、インターフェイス"攻撃者"をつくって、「勇者」、「毒」をその実装とする。加えて...
斬撃後に死んでいた場合(*) 、納刀する
攻撃前に既に死んでいた場合、攻撃できないようにする
この設計変更によって、
が、
の4パターンに増えた(※ただし最後のパターンに関しては今回特に修正の必要はなかった)
攻撃者がひとつ増えるごとに、これらの分岐は倍、倍に増えていく怖れがある。
あらたに攻撃者を追加すると、既存の攻撃者を変更しなければならない。
この変更によって、全体の時間的な流れがよくわからなくなった。
等々の分岐が並ぶことになる。この分かりにくさは単にStateパターンを導入しただけでは本質的には改善しないだろう。
MVCにおけるモデル、は振る舞いを持ったデータだ。モデルが状態変化したとき、イベントが発生する。
しかしその状態変化が別のモデルの状態変化のタイミングに影響をうけるとき、モデルの設計はとても複雑になり、読みにくくなってしまう。
モデルで発生するイベントが多く、複雑になるほど、ビューとの関連は密になる。
このような複雑さをプログラマが支配するのは、とても大変だ。
みなさんも体験したことがないだろうか、GUIで「ホニャララしているときにホゲホゲするとバグる」みたいな挙動を。
すると、上部に表示される「更新時刻」の表示位置がおかしくなる。
RPGの設計は、たとえば下記のように記述できるDSLを導入すると、劇的に改善する。
タイミング:毒 ⇒ 死ぬ ⇒ 斬撃 の順なら、納刀する タイミング:毒 ⇒ 斬撃 ⇒ 死ぬ の順なら、変色した血が飛び散る
オブジェクト指向ではこれはStateパターンとStrategyパターンを組み合わせることで実現できる。
でも、このような設計にすると、勇者やモンスターのモデルオブジェクトの責任は極端に少なくなってしまう。
加えてオブジェクト間のやりとりの複雑さがDSLに押し込められるので、オブジェクトの主体性も殆ど無くなってしまい、
うん、ただのデータでいいや。
---------------------------
(*) 攻撃時に相手の状態を問い合わせるのが醜い。これを避けるには、モンスターが毒で死んだ時に勇者にイベントを通知して、勇者を”戦意喪失”状態に変化させる手がある。