はてなキーワード: builderとは
例えば、俺、CoffeeScriptが嫌いだったんだけど、なんで嫌いかっていうとRubyが嫌いだからなんだけど(諸説あります
でも、頑張ってCoffeeScriptゴリゴリ書いてた人たちっていると思うんだよね
自分はTypeScript登場時からずっとTypeScriptなんだよね
あの、DelphiとかTurbo PascalとかC++ BuilderとかC#の原作者だよ?
しかし、なんだ、こうやって陳腐化していくことがどれほど多いことか、IT関係は
これが理系で機械工学関係だったら、流体力学とか材料工学が陳腐化するなんてないよね?
だから、大学で習う情報工学だとしたら、やっぱりできるだけ普遍的なことを習ってるはずなんだよ
でも、ITはyak shavingが多いよね
本質的な知識を得るために、WindowsやLinux上の環境で学ばなければならないわけで、
落ち着いて情報工学の勉強をするために、Windowsの余計な情報を表示するウィジェットの閉じ方を学ばなければならなかったりする、馬鹿げてるよね
そう考えると、料理、絵、音楽、みんな普遍的なものの集まりだよね
料理の四面体なんてあるけど、煮る焼く炒める蒸すどれも不変な過程だよね
調理器具だって、フライパンや鍋が日進月歩に進化して、以前のバージョンが使えない、なんて買い替え需要を促すための嫌がらせをメーカーがしたりもしない
絵だって、証券用インクとペンだとしても、液晶ペンタブレットだとしても、筋肉の知識とか、パースの知識とか、不変だよね、永遠に変わらないものだよね
まあ、流行の絵柄とかは変わるけど、そういう流行に流されないのも大事だよね
個性がない、ってことは、誰かが絵を見て、これは~さんの絵だ、って気づかれないってことだから、商品価値がなくなっちゃうよね
音楽理論も変わらない、楽器の弾き方も変わらない、正直、ギターなんてどこのメーカー買ったって同じようなものなんだけど、
同じエレキギターを何本も持ってる人っているよね、お金持ちだよね、自分はチューニングがそれぞれ違うギター複数本持ってるけど、それはチューニングのためなんだよね
話を戻すと、ITクソつまらなくなった、の元の文章にもTypeScriptでクソアプリ書いてたときが楽しかったみたいな話があったけど、
俺がMacOSX 10.2だったかで作ったアプリは、現在のMacではまったく動かないからね
だったんだけど、今のWindowsはAppleみたいになっちゃったよね、足切り、足切り、Windows 10は動くけど、11は動かないマシンが大量発生
ポケットモンスター赤緑のソロプレイに注目が集まっているRiJだが、もう一つの見所が、今何が起こっていて、何が超絶技巧なのかを視聴者に教えてくれる解説である。
現在、YouTubeに上がっているものの中から、「クリアまで1時間以内」「解説が面白さを引き立てている」という視点でピックアップした。
なお、これからアップされるものの中でも、紹介したいもの(例えば、「wallprime」など)があるので、できれば追記したい。
(トラバの助言を受けて、YouTubeからtwitchのリンクに変更した。コメントから当時の臨場感が伝わってくると思う。一方、YouTubeの方は走者さんや解説さんがコメントを書いていることもあるし、視聴者もコメントを残せるので、こちらも見てほしい)
(追記:速報版の6つに、ラストまでの4つを加えて完成。リンクとして張れるのは9本までのようなので、1本は頭を削った)
RITE
https://www.twitch.tv/videos/2221332904
走者兼解説。
フレーム単位で9段階のジャンプを使い分け、精密な十字キー操作を行いながら、淡々と各面のポイントを述べていく解説がクール。
Lonely Mountains: Downhill
https://www.twitch.tv/videos/2221428977
キャラが死ぬたびに、こらえきれずに吹き出す解説さんにつられ、会場も爆笑につぐ爆笑。
人が死んでんねんで!
SkateBIRD
https://www.twitch.tv/videos/2222178941
解説さんがいなければ、プレイの意味が全く分からなかったゲーム。
序盤の「モンチ、モンチモンチモンチスクリームモンチモンチモンチ!!」はぜひ聞いてほしい。
ソロモンの鍵
https://www.twitch.tv/videos/2222216364
超絶テクニックを「うまいー」「はいうまいー」「うまいねー」と妙なテンションで流すのがシュール。
「次の面は癒やし」からの仕事猫案件、グダるけれど、グダった後のトークも面白い。
https://www.twitch.tv/videos/2222276074
一方で、すぐにダウンするためコンボを決めさせてくれない敵に「勝手に倒れてどうするんだ!RTAだぞお前!」と説教したりとやりたい放題。
https://www.twitch.tv/videos/2223151102
時に無茶ぶりをし、時に圧をかけるのもたまらない。
「世界記録って、速いですからね」は今大会で1、2を争う名言。
(追記)
https://www.twitch.tv/videos/2223819722
走者兼解説。ギリギリのシチュエーションを率直に言語化してくれるので、自分がプレイしているような気分になる。
「(天井から石が降ってきて)あっヤバ(瞬間に生存ルートを見つけて)くない…。ヤバくないですよ」と強がるのも面白い。
wallprime
https://www.twitch.tv/videos/2223820910
壁に表示された4桁までの数字を、ひたすら素因数分解していくゲーム。
走者の頭はどうかしているとしか思えない超速「素数パンチ」に加え、
解説さんの「どうやって素因数分解をしているのか…ですが、基本は覚えます(7割は覚えている)」との発言が加わり、
https://www.twitch.tv/videos/2223897031
プレイ時間のうち3分の2ぐらいは、ただ待つだけなのだが、そこを解説に定評あるワイズさんが、
ゲームプレイや、ゲーム周りの情報だけでなく、人間批評、社会批評も含めて解説していく。
tps://www.twitch.tv/videos/2224602471
正確にレゴブロックを組み上げていく走者と、それに合わせてよどみなくストーリーを展開していく解説さんのタッグ。
RTAと知らなければ、Eテレの番組かな?と思うほどの完成度。
さて、最後になるが、実は当初(大会が終了する前)、10本を紹介するつもりであり、10本目はスーパーマリオ64目隠しプレイで締めるつもりでいた。
走者のBubziaさんは、昨年夏のRiJに目隠しゼルダBotWの目隠しプレイを披露し、目隠しときメモとともに社会(の一部)を震撼させたので、覚えている方も多いだろう。
スーパーマリオ64でも、RiJ 2021 Winterで目隠し・スター70枚というレギュレーションを走りきっており、解説はそのときと同じ宇佐見まさむねさん。
Bubziaさんにとって、とても納得のいくプレイではないことは明らかであり、おすすめに挙げることは躊躇せざるを得なかった。
しかし、宇佐見さんの、走者の操作だけでなく心情とも完全に同期し、Bubziaさんが失敗した場面で、各トライアルの何が失敗の要因かを正確に言語化した解説は、
個人的にはある種の美しさを感じた。
おすすめはできないが、一度見てほしいとも思う。
なんでだろう
これまで改良はされてきたし、最新のは知らんのだけど、
プロジェクトの設定とかとりあえず必要最低限だけ表示すればいいのにドバーッと全部表示してしまってて、
しかも結局はコマンドラインのオプションを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に)興味を持ってくださって、ホームセンターの大人用オシメのコーナーが大賑わいになれば幸いです。。