はてなキーワード: builderとは
なんでだろう
これまで改良はされてきたし、最新のは知らんのだけど、
プロジェクトの設定とかとりあえず必要最低限だけ表示すればいいのにドバーッと全部表示してしまってて、
しかも結局はコマンドラインのオプションをGUIでチマチマ書くような感じになってしまってて、
これIDEの意味あんの?みたいになるわけだけど、Xcodeを使わないと基本的にMacやiOSのアプリを開発できない縛りもあるわけで、
あと、うろ覚えだけど昔たしかInteface Builderのnibファイルとかバイナリだったんじゃなかったかな
バージョン管理しづらい、差分が分からない、うっかりマウスを滑らせてどこか変更してしまっても分からない、
この間、増田でプレイしたゲームを晒してたのを見て面白かったから自分のも晒してみる。
おすすめがあったら教えてくれ。
↓
Rocket League
Sid Meier's Civilization V
RimWorld
METAL GEAR SOLID V: THE PHANTOM PAIN
Heat Signature
7 Days to Die
Assassin's Creed IV Black Flag
Sniper Elite 4
Reassembly
METAL GEAR SOLID V: GROUND ZEROES
The Witcher 3: Wild Hunt
Kerbal Space Program
Watch_Dogs 2
Tom Clancy's Ghost Recon® Wildlands
Tom Clancy's Splinter Cell Blacklist
Dungeon Warfare
Far Cry 4
Graveyard Keeper
Starbound
INSIDE
Stardew Valley
Project Zomboid
Papers, Please
BioShock Infinite
Universe Sandbox
Portal 2
Avorion
Starbound - Unstable
Superflight
DARK SOULS™ II
How to Survive
Quantum Break
Undertale
GRIS
Age of Empires® III: Complete Collection
Gunpoint
片道勇者
Garry's Mod
The Talos Principle
Return of the Obra Dinn
Rebel Galaxy
Game Builder
Valiant Hearts: The Great War™ / Soldats Inconnus : Mémoires de la Grande Guerre™
DiRT Rally
Invisible, Inc.
UNDEFEATED
Sins of a Solar Empire: Rebellion
Wallpaper Engine
The Witness
Age of Empires II (2013)
The Flood
VRChat
Grow Home
Age of Empires II (2013): The Forgotten
Assassin's Creed III Remastered
Audio Party Pack (オーディオ・パーティパック)
BioShock 2
BioShock 2 Remastered
BioShock Remastered
Borderlands 2: Headhunter 1: Bloody Harvest
Borderlands 2: Headhunter 2: Wattle Gobbler
Borderlands 2: Headhunter 3: Mercenary Day
Borderlands 2: Headhunter 4: Wedding Day Massacre
Borderlands 2: Headhunter 5: Son of Crawmerax
Borderlands: The Pre-Sequel
BROKE PROTOCOL: Online City RPG
Cities: Skylines - After Dark
Cities: Skylines - Green Cities
Cities: Skylines - Mass Transit
Civilization V - Scrambled Continents Map Pack
Crusader Kings II
Crusader Kings II: African Portraits
Crusader Kings II: South Indian Portraits 5 Year Anniversary Gift
Cuisine Royale
Dead Rising 3 DLC1
Dead Rising 3 DLC2
Dead Rising 3 DLC3
Dead Rising 3 DLC4
Door Kickers
Evolvation
For Honor
Fortified
Hacknet
Insurgency
Killing Floor Mod: Defence Alliance 2
Murderous Pursuits
PAYDAY 2
Pinball FX3
Prismata
Regions Of Ruin
Satellite Reign
Sid Meier's Civilization III: Complete
Sid Meier's Civilization V: Brave New World
Starpoint Gemini 2
Stellaris: Original Game Soundtrack
Streamline
The Escapists 2 - Dungeons and Duct Tape
The Flame in the Flood
The LEGO® NINJAGO® Movie Video Game
The Talos Principle - Bonus Content
The Talos Principle - Prototype
The Talos Principle - Soundtrack
The Talos Principle: Road To Gehenna
The Witcher 2: Assassins of Kings Enhanced Edition
The Witcher: Enhanced Edition
Viscera Cleanup Detail: Shadow Warrior
Yume Nikki
ZACH-LIKE
・出版の裏側
チャンネルの性質上ピー音や伏せ字も沢山あるがそれでも十分面白い
漫画家やライトノベル作家志望の人間からも多くの質問が寄せられるが
「まずはネットで腕試ししてから送ってこい」というのが最近の定番の返しになっている
ゲストはいつも匿名形式での参加となっているためコメント欄では推理大会が開かれる
女装に関してズブの素人だった人間が徐々にレベルアップしていく様子を楽しめる
最初はただ単にユニクロなどで買ってきたものを着るだけだったが
わずか一年の間にガチで女性にしか見えないレベルにまで到達してしまう
建築家のスキルを生かしてLEGOで家を組み立てるというチャレンジをしている
ただ単にガワだけを再現するのではなく機能性の高い本格的な住宅を建築中
”Primitive Technology”を連想するという人がコメント欄にもちらほらいる
・巷のデバッガー
街なかを歩いているときに見かけた様々なものを紹介するという動画を上げているが
見たものをあたかも”現実のバグ”であるかのように紹介するというユニークな手法をとっている
加えて豊富なゲーム知識と絡めて説明することでよりいっそうのおかしみを漂わせている
コメント欄では「これがゲーム脳か……」というような文言が定番化している
海外ファンからは映画マトリックスになぞらえてモーフィアスとあだ名されている
・ミニヨンズ
金と暇を持て余したアラサー兄弟がひたすらミニ四駆の限界に挑み続けている
回を増すごとにヤバさがインフレしているところも懐かしの少年漫画っぽくていい
http://anond.hatelabo.jp/20170220005414 の1年間隔のデータ。
前エントリの5年毎のデータじゃ思い出を振り返るには分解能が足りない気がしたので1年間隔で補足します。興味ない人にはスパムエントリ並にうざいのだろうから申し訳ないけど、その当時を見てたらただの数字の羅列には見えないのですよ。近々はてブシステムに大幅な改修が入るらしいから今やっとかないと来月も同じように見られるとは限らないしね。
2005年3月 | 2006年3月 | 2007年3月 | 2008年3月 |
---|---|---|---|
386ドメイン | 439ドメイン | 312ドメイン | 280ドメイン |
www.itmedia.co.jp(165) | d.hatena.ne.jp(175) | d.hatena.ne.jp(114) | d.hatena.ne.jp(191) |
japan.cnet.com(66) | japan.cnet.com(49) | blog.livedoor.jp(63) | blog.livedoor.jp(78) |
d.hatena.ne.jp(36) | www.itmedia.co.jp(38) | www.popxpop.com(59) | www.itmedia.co.jp(50) |
internet.watch.impress.co.jp(34) | blog.livedoor.jp(30) | www.itmedia.co.jp(50) | www.asahi.com(40) |
hotwired.goo.ne.jp(32) | internet.watch.impress.co.jp(21) | gigazine.net(43) | gigazine.net(31) |
headlines.yahoo.co.jp(28) | phpspot.org(20) | phpspot.org(29) | coliss.com(28) |
www.asahi.com(28) | plusd.itmedia.co.jp(18) | anond.hatelabo.jp(23) | anond.hatelabo.jp(26) |
itpro.nikkeibp.co.jp(26) | japanese.engadget.com(17) | www.youtube.com(19) | www.ideaxidea.com(23) |
pc.watch.impress.co.jp(21) | www.asahi.com(17) | www.atmarkit.co.jp(16) | alfalfa.livedoor.biz(18) |
pcweb.mycom.co.jp(21) | itpro.nikkeibp.co.jp(15) | www.designwalker.com(16) | japan.cnet.com(18) |
blog.livedoor.jp(20) | www.atmarkit.co.jp(15) | japan.cnet.com(15) | phpspot.org(17) |
www.watch.impress.co.jp(17) | www.ringolab.com(13) | journal.mycom.co.jp(15) | e0166.blog89.fc2.com(13) |
www.ringolab.com(15) | www.mainichi-msn.co.jp(12) | portal.nifty.com(15) | sankei.jp.msn.com(13) |
nikkeibp.jp(14) | jkondo.hatenablog.com(10) | netafull.net(13) | wiredvision.jp(13) |
www.atmarkit.co.jp(13) | www.excite.co.jp(9) | itpro.nikkeibp.co.jp(12) | itpro.nikkeibp.co.jp(12) |
www.forest.impress.co.jp(13) | www.forest.impress.co.jp(9) | blog.goo.ne.jp(10) | www.atmarkit.co.jp(11) |
shinta.tea-nifty.com(12) | www.nyasoku.com(9) | guideline.livedoor.biz(10) | blog.goo.ne.jp(10) |
www.geocities.jp(11) | q.hatena.ne.jp(8) | www.ideaxidea.com(10) | www.designwalker.com(10) |
www.hatena.ne.jp(10) | hotwired.goo.ne.jp(7) | labs.unoh.net(8) | japanese.engadget.com(9) |
slashdot.jp(9) | pcweb.mycom.co.jp(7) | q.hatena.ne.jp(8) | ascii.jp(8) |
finalvent.cocolog-nifty.com(8) | takagi-hiromitsu.jp(7) | www.100shiki.com(8) | urasoku.blog106.fc2.com(8) |
japan.internet.com(8) | www.future-planning.net(7) | www.watch.impress.co.jp(8) | www.moongift.jp(8) |
www.mainichi-msn.co.jp(8) | www.hatena.ne.jp(7) | zapanet.info(8) | www.nicovideo.jp(8) |
allabout.co.jp(7) | bb.watch.impress.co.jp(6) | 2log.blog9.fc2.com(7) | business.nikkeibp.co.jp(7) |
bb.watch.impress.co.jp(7) | caramel-tea.com(6) | business.nikkeibp.co.jp(7) | web-tan.forum.impressrd.jp(7) |
blog.bulknews.net(7) | fragments.g.hatena.ne.jp(6) | www.forest.impress.co.jp(7) | www.yomiuri.co.jp(7) |
blog.japan.cnet.com(7) | gigazine.net(6) | www.j-cast.com(7) | guideline.livedoor.biz(6) |
kiri.jblog.org(7) | headlines.yahoo.co.jp(6) | ameblo.jp(6) | jkondo.hatenablog.com(6) |
naoya.dyndns.org(7) | kengo.preston-net.com(6) | e0166.blog89.fc2.com(6) | labaq.com(6) |
www.excite.co.jp(7) | naoya.g.hatena.ne.jp(6) | internet.watch.impress.co.jp(6) | www.j-cast.com(6) |
www.future-planning.net(7) | neta.ywcafe.net(6) | web-tan.forum.impressrd.jp(6) | www.kajisoku.org(6) |
www.nikkansports.com(6) | pc.watch.impress.co.jp(6) | codezine.jp(5) | dain.cocolog-nifty.com(5) |
www.yomiuri.co.jp(6) | portal.nifty.com(6) | www.aoky.net(5) | finalvent.cocolog-nifty.com(5) |
antipop.zapto.org(5) | satoshi.blogs.com(6) | www.asahi.com(5) | news23vip.blog109.fc2.com(5) |
blog.goo.ne.jp(5) | shinta.tea-nifty.com(6) | www.simplexsimple.com(5) | plusd.itmedia.co.jp(5) |
blog.tatsuru.com(5) | www.geocities.jp(6) | blogpal.seesaa.net(4) | portal.nifty.com(5) |
k-tai.impress.co.jp(5) | www.youtube.com(6) | css-happylife.com(4) | satoshi.blogs.com(5) |
www.cnn.co.jp(5) | ameblo.jp(5) | cyblog.jp(4) | takagi-hiromitsu.jp(5) |
www.nikkei.co.jp(5) | blog.goo.ne.jp(5) | dain.cocolog-nifty.com(4) | wsoku.blog44.fc2.com(5) |
artifact-jp.com(4) | jibun.atmarkit.co.jp(5) | loconet.web2.jp(4) | www.afpbb.com(5) |
hail2u.net(4) | nikkeibp.jp(5) | plusd.itmedia.co.jp(4) | bb.watch.impress.co.jp(4) |
homepage.mac.com(4) | www.geocities.co.jp(5) | satoshi.blogs.com(4) | blog.creamu.com(4) |
kengo.preston-net.com(4) | www.yomiuri.co.jp(5) | tech.nitoyon.com(4) | builder.japan.zdnet.com(4) |
takekuma.cocolog-nifty.com(4) | beta.g.hatena.ne.jp(4) | www.geekpage.jp(4) | fujipon.hatenadiary.com(4) |
www.100shiki.com(4) | blog.japan.cnet.com(4) | www.heiwaboke.com(4) | headlines.yahoo.co.jp(4) |
www.geocities.co.jp(4) | column.chbox.jp(4) | www.kajisoku.com(4) | journal.mycom.co.jp(4) |
www.sem-research.jp(4) | dogfood.g.hatena.ne.jp(4) | www.kitami.tv(4) | lifehacking.jp(4) |
dain.cocolog-nifty.com(3) | ekken.blog1.fc2.com(4) | www.sankei.co.jp(4) | netanabe.blog78.fc2.com(4) |
homepage1.nifty.com(3) | hatena.g.hatena.ne.jp(4) | www.tatamilab.jp(4) | www.4gamer.net(4) |
japanese.chosun.com(3) | plaza.rakuten.co.jp(4) | www.tez.com(4) | ameblo.jp(3) |
kotonoha.main.jp(3) | web.archive.org(4) | coliss.com(3) | jp.techcrunch.com(3) |
my.casty.jp(3) | akihitok.typepad.jp(3) | hatena.g.hatena.ne.jp(3) | koerarenaikabe.livedoor.biz(3) |
nais.to(3) | arena.nikkeibp.co.jp(3) | headlines.yahoo.co.jp(3) | ktdisk.hatenablog.com(3) |
sagittarius.dip.jp(3) | blog.tatsuru.com(3) | jp.techcrunch.com(3) | labs.unoh.net(3) |
sasapanda.com(3) | blogpal.seesaa.net(3) | la.ma.la(3) | mainichi.jp(3) |
www.sankei.co.jp(3) | bogusnews.seesaa.net(3) | medt00lz.s59.xrea.com(3) | mereco.hatenadiary.com(3) |
www.tokyo-np.co.jp(3) | dain.cocolog-nifty.com(3) | mellowmoon.blog93.fc2.com(3) | netafull.net(3) |
www.zakzak.co.jp(3) | fujipon.hatenadiary.com(3) | tangerine.hateblo.jp(3) | pc.watch.impress.co.jp(3) |
x51.org(3) | nb.nikkeibp.co.jp(3) | www.akiyan.com(3) | waranote.blog76.fc2.com(3) |
news4vip.livedoor.biz(3) | www.future-planning.net(3) | workingnews.blog117.fc2.com(3) | |
takekuma.cocolog-nifty.com(3) | www.gizmodo.jp(3) | www.excite.co.jp(3) | |
ttchopper.blog.ocn.ne.jp(3) | www.virtual-pop.com(3) | www.forest.impress.co.jp(3) | |
ultrabigban.cocolog-nifty.com(3) | www.yomiuri.co.jp(3) | www.gizmodo.jp(3) | |
www.100shiki.com(3) | www.watch.impress.co.jp(3) | ||
www.fmmc.or.jp(3) | |||
www.h-yamaguchi.net(3) | |||
www.hyuki.com(3) | |||
www.ideaxidea.com(3) | |||
www.lucky-bag.com(3) | |||
www.sv15.com(3) | |||
yukawasa.hatenablog.com(3) | |||
zerobase.jp(3) |
(※カッコ内は回数)
毎年3月の全ホットエントリを http://b.hatena.ne.jp/hotentry/20050215 から取得。タイルレイアウトで取得したので1日49件×31日で月間合計1519件弱のデータを基にしている。重複はuniqで取り除いてある。
newしてから渡せば良いと思うよ。
いちいちクラスに分ける理由は、こういう感じで、クラス内の変数にアクセスすれば、画面事の表示とかが簡単に出来る的な?
// Javaの書き方しらん、インターフェースを実装することを定義したい
public class EventHoge : View.OnClickListener {
//画面事の名称
// Javaの書き方しらん、インターフェースのメソッドを実装することを定義したい
public void View.OnClickListener.onClick(View v) {
AlertDialog.Builder dlg;
dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("画面の名前:" + ViewName); // 画面名称が表示されるイメージ
dlg.setMessage("Hello, サンプル!");
dlg.show();
//<ーー
}
}
// Androidなにも知らんけど、元増田がボタンにイベントを書く処理が書いてあるクラスのことが言いたい
// そのメソッド
final Button button = new Button(this);
button.setText("ダイアログの表示");
View.OnClickListener ocl = new EventHoge();
ocl.ViewName = "画面その一";
button.setOnClickListener(ocl);
}
}
こんな感じにすれば、画面が二つあって、
その画面の名称を表示するようなボタンを、二つメソッドをコピペして作らなくていい的な?
サンプルは、出来るだけとっちらかさないよう、匿名クラスとか使って、サンプルで紹介したいところ「だけ」を書くんだよね。
だから、そのサンプルがどういう意味かをちゃんと読み取って、自分ならこう書くとか、こう書けるか? とかを考えてこそ勉強だと思うよ?
今回のレイだと「View.OnClickListener」っていうインターフェイスを実装したクラスを、setOnClickListenerすればいいってことさえわかれば、
匿名クラス?(っていうのかな? ちょっと用語はよくしらん、クラス定義を使い回さず、その場だけのクラス定義を書く書き方)とかを使わずに、
どういうふうに応用ができるか? とか頑張れ!
頑張れ!
頑張れ!
はああああああ。
おれはビールを飲む!
うーん?
いや、なんか、通じてないな。
もうちょいサンプル詳しく書くから、サンプルのどこがわからないか言ってくれ。
// Javaの書き方しらん、インターフェースを実装することを定義したい
public class EventHoge : View.OnClickListener {
// Javaの書き方しらん、インターフェースのメソッドを実装することを定義したい
public void View.OnClickListener.onClick(View v) {
AlertDialog.Builder dlg;
dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("サンプル");
dlg.setMessage("Hello, サンプル!");
dlg.show();
//<ーー
}
}
// Androidなにも知らんけど、元増田がボタンにイベントを書く処理が書いてあるクラスのことが言いたい
// そのメソッド
final Button button = new Button(this);
button.setText("ダイアログの表示");
button.setOnClickListener(new EventHoge());
}
}
こうやって、クラス分けて書けば、外とか中とか、全く関係なくなるじゃん。
元増田のサンプルだと、メインの中でインターフェースを実装したクラスの実装を書いてるから、中とか外とかがあるんじゃないのか?
自分でクラスとして定義して、そっちで実装すれば、メインは紐づけるだけでよくなって、仮引数?の中で実装しなくてもすむじゃん。
よくわからん。
中が嫌なら外でかきゃいいじゃん。
// Javaの書き方しらん、インターフェースを実装することを定義したい
public class Hoge : View.OnClickListener {
// Javaの書き方しらん、インターフェースのメソッドを実装することを定義したい
public void View.OnClickListener.onClick(View v) {
AlertDialog.Builder dlg;
dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("サンプル");
dlg.setMessage("Hello, サンプル!");
dlg.show();
//<ーー
}
}
// メインスレッド的なところ
final Button button = new Button(this);
button.setText("ダイアログの表示");
button.setOnClickListener(new Hoge());
こう書けば、中で書かなくて良い気がするけど、駄目なの?
なんか、インターフェースだから引数の中ってのが意味わからん。
どう関係してるの?
近年、関数型プログラミングの重要性はいろんなところで叫ばれています。
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に)興味を持ってくださって、ホームセンターの大人用オシメのコーナーが大賑わいになれば幸いです。。
Slicehost VPS Hosting is now Rackspace Cloud Servers hosting
Slicehost Articles: IP failover - High Availability explained
All requests for the website come to the front end Slice.
That Slice then proxies the request to larger Slices running in the backend of the network.
Slicehost Articles: IP failover - Slice setup and installing Heartbeat
Monitoring Ubuntu Services Using Monit | Ubuntu Geek
$ sudo tasksel
Slicehost Articles: Ubuntu Hardy setup - page 1
Slicehost Articles: Ubuntu Hardy setup - page 2
Automatic Rails on Ubuntu 8.04 LTS « Enjoying Rails
joerichsen's gist: 16225 — Gist
Setting up Ubuntu Jaunty for Ruby and Rails development | Joe Ocampo's Blog
5-minutes to Rails // Slicehost VPS Hosting is now Rackspace Cloud Servers hosting
slicehostでRails2.2.2を動かすまで - なんとなく日記
Slicehost Articles: Ubuntu Hardy - Ruby on Rails
Slicehost Articles: Ubuntu Gutsy - Django installation
UbuntuにLAMPサーバを手早くインストールする方法 - builder
LAMP(Linux、Apache、MySQL、PHP)サーバを手早くインストールする最も簡単な方法
Slicehost Articles: CentOS setup - page 1
Slicehost Articles: CentOS setup - page 2
CentOSのPHPにはマルチバイト対応入ってませんのであとから入れましょう (技術メモ)
タグ「slicehost」を含む新着エントリー - はてなブックマーク
naotaka blog » Blog Archive » Slicehostに申し込み
slicehostでUbuntu8.04の設定1 初期設定 - delab
Slicehost : Tag Archives - delab
ホスティングサービス Slicehost のドキュメントがすばらしい : 僕は発展途上技術者
SlicehostへのRedmine導入手順(Ubuntu Gutsy)
つくるぶガイドブログ: 失敗しない Rails が動かせるホスティングサービス選びと環境構築
具体的にどこがおすすめかという質問を受けた場合、共用サーバーならば海外の Slicehost、専用サーバーならさくらインターネット
Slicehost に移行しました - milk1000cc
Web 管理画面で、OS 再起動・再インストール、コンソール操作、DNS 設定などができます。
バックアップ入れても月額 $25、
レンタルサーバはさくらインターネット | 「さくらのレンタルサーバ」「さくらのマネージドサーバ」
格安レンタルサーバーならステップサーバー | 高機能で格安なレンタルサーバーTOP
レンタルサーバーNSF - 月額100円〜容量無制限可の格安レンタルサーバー
ロリポップ!レンタルサーバー - 月額105円~容量最大30GB 初期費用半額キャンペーン中!
チカッパ!レンタルサーバー - ご利用中のユーザー様へのご案内
レンタルサーバー「heteml」 - 大容量・高機能のレンタルサーバー
Slicehost VPS Hosting is now Rackspace Cloud Servers hosting Slicehost Login
Linode - Xen VPS Hosting Linode Login
Linode.comのVPSホスティングを契約してみた - m-kawato@hatena_diary
Webbynode Hosting - Host and Deploy Ruby on Rails, Django, Node.js, PHP and more
VPS Hosting � Virtual Private Server Hosting | DataRealm.com
Coupon codes, promotions and special offers - CheapVPS
VPS :: VPS Hosting :: VDS :: Virtual Private Servers :: Virtual Dedicated Servers :: Server Axis
RootBSD - FreeBSD and OpenBSD VPS Hosting - Welcome to RootBSD
レンタルサーバーならVPSレンタルサービス|VPS stock
激安の専用サーバ:ServerPronto なんと月額$29〜 | 海外サーバ.jp
サーバ本体無償提供、ホスティング向きハウジングサービスを月額7,780円で
専用サーバの料金と仕様 | 専用レンタルサーバ(ホスティング)のさくらインターネット
Dedicated servers | Windows and Linux dedicated web servers
Dedicated Servers, Self-Managed Dedicated Server, Dedicated Hosting at ServerPronto
MegaNetServe - Value Driven Dedicated Servers on Linux, Windows 2008, Windows 2003 & FreeBSD
Domain Names, Web Hosting and SSL Certificates - Go Daddy
Dedicated Servers, vSERVERs – SERVER4YOU
Web Hosting | Dedicated Hosting | Domain Registration |
海外の安い専用サーバプランをいろいろ並べて検討してみた - GIGAZINE
再度、レンタルサーバ(共有ではなく「専用」です)で、国内外を.. - 人力検索はてな
Website Hosting in the Yahoo! Directory
デル株式会社(Dell Japan)の公式サイト | Dell 日本
HP-ProLiant-ML115 G5まとめwiki - トップページ
各メーカーの最安サーバを比較検討してみた - GIGAZINE
バックエンドアーキテクチャーのおかげで、2テラバイトの画像を、$1000のLinuxサーバー1台で賄うことができる。だから、年間わずか20万ドル程度の設備投資で、現在サーバー500台を保有している。
ドメイン登録 - VALUE DOMAIN:バリュードメイン
Domain Names, Web Hosting and SSL Certificates - Go Daddy
Amazon S3をWindowsにマウントできるJungle Disk Kawanet Tech Blog/ウェブリブログ
Online storage and backup | Secure file sharing | Unlimited online storage | Jungle Disk
Amazon.co.jp: 現場が教えるホスティングサービスの勘所―立ち上げから運用管理までのノウハウ (NEサポートシリーズ): 合阪 省: 本