#BC<blockquote
Explore tagged Tumblr posts
topgoprovideos-blog · 5 years ago
Photo
Tumblr media
Midweek snow breaks brought to you by + from Black. Pretend to ski his 2nd pl… Midweek snow breaks delivered to you by @markus1eder + #HyperSmooth from #GoProHERO7 Black. Fake to ski his 2nd place #FreerideWorldTour run from Kicking Horse Mountain in British Columbia.
0 notes
gu4 · 4 years ago
Quote
ここでオライリーは、いきなりジョン・メイナード・ケインズの『一般理論』を以下の箇所を引用している(訳文は山形浩生訳から引用)。 事業の安定した流れがあれば、その上のあぶくとして投機家がいても害はありません。でも事業のほうが投機の大渦におけるあぶくになってしまうと、その立場は深刻なものです。ある国の資本発展がカジノ活動の副産物になってしまったら、その仕事はたぶんまずい出来となるでしょう。 betting economy は「カジノ活動の副産物になってしまった」経済を指しているが、ここではその典型として WeWork が挙げられている。ソフトバンクが投資した巨額の金が煙のごとく消え失せたことも書かれており、ソフトバンクも賭博経済、カジノ資本主義の一味と見られているということですね。
ティム・オライリーが「シリコンバレーの終焉」について長文を書いていたのでまとめておく - YAMDAS現更新履歴
0 notes
trojanjean · 7 years ago
Note
Questions from your recent ask post! 24, 43, 55, 73, 127, 145, 148?
omg thank you!!!
24. Favorite part of your daily routine? 
if i REALLY have my shit together and i manage to wake up really soon, my favourite moment probably is sitting on my couch before 6am with a coffee cup in my hand, it’s still quiet and i’m not in a rush to leave anywhere. i can close my eyes and breathe in deep and get into the mindspace i need to have for the day! :) but it happens rarely bc i love to sleep lmao so usually when i get home from work, sit down and have a cup of coffee/tea :) 
43. Do you smile at strangers?
yeah, i do :) 
55. Favourite blog?
ohh omg this is a difficult question? i love my mutuals’ blogs and i follow too many people to ever have the time to scroll down my dash for a v long time so i usually check a few blogs individually :)) i don’t want to choose one or make a list in case i forget someone super awesome but liiiike, i check out for example @lecheesie @h-y-p-h-e-n-d-o-t-s @vityanikiiforov @kumikirin @lovclcs @happyfluids regurarly bc they all have great great content and i love them! but this is just a few and i should reaaally do a blog rec some day because there are so many awesome people here and sfsdg!!!!
73. Do you sleep with stuffed animals?
no, but only because if i took a few stuffed animals, i’d had to take ALL of them, otherwise some of them would get sad and then i’d get too sad dfgdg i have a problem i know. i had to put a few of my stuffed animals into a closet bc i had guests and i needed some extra room and i gave them a pep talk how i wasn’t going to abandon them :’’)) i give emotions to everything, if i’m really really tired i pick up a little bruised items at the grocery store too because no one else will have them and then they’ll get sad etc.
127. What makes you happy?
simple things! stability in my life & that i can trust that everything goes like i’ve planned. good coffee and time to drink it in peace. waking up super early & also sleeping in! sunday mornings in bed, watching friends & how i met your mother on netflix, pizza and wool socks. winter, autumn & thermos mugs filled with earl grey. writing and reading. 
145. Tea or Coffee?
i have soo many different teas and i’m in love with earl grey but...i can’t function without coffee and i drink wayyy too much of it. but if i’m in a place where i can choose to drink either tea or coffee, i choose coffee. so yeah, coffee. 
148. What’s your favourite quote?
"This is the only country in the world," said Wednesday, into the stillness, "that worries about what it is."
"What?"
"The rest of them know what they are. No one ever needs to go searching for the heart of Norway. Or looks for the soul of Mozambique. They know what they are."
neil gaiman - american gods 
idk i just really love american gods a lot! :)) 
7 notes · View notes
phpmentors · 7 years ago
Text
「現場で役立つシステム設計の原則」批判 (2) ~ポリモーフィズムは何のために?~
増田亨氏の「現場で役立つシステム設計の原則]」批判の第2編です。
(2)ポリモーフィズムは何のために?
オブジェクト指向の要件
本書には「変更を楽で安全にするオブジェクト指向の実践技法」というサブタイトルが付与されています。オブジェクト指向が何かという点については、論者によって違いはあるものの、以下の3つが要件とされることには、多くの人が合意するでしょう。
カプセル化
インヘリタンス(継承)
ポリモーフィズム(多態)
前回で明らかになったように、カプセル化は、オブジェクト指向とは独立にモジュール分割の指導原理としてデイビッド・パーナスにより提唱された「情���隠蔽」を敷衍したものです。オブジェクト指向の要件ではありますが、オブジェクト指向固有のアイデアではありません。
インヘリタンスは便利な機能ですが、コンポジションや移譲により代替できるので、オブジェクト指向の本質的な要件とは見做されなくなってきたかと思います。
となれば、プログラミングの歴史にオブジェクト指向が付け加えたものは、ポリモーフィズムであるということになります。オブジェクト指向のもっとも偉大な貢献は、イヌがワンと鳴き、ネコがニャーと鳴くことです!
さて、こうした視点から本書を通読すると、まず、カプセル化については、その手段に過ぎない「データと処理を一体にする」という点に囚われ過ぎて、目的である「情報隠蔽」を取り逃がしているということが言えるかと思います。これが前回の指摘でした。
本書でのポリモーフィズム
では、本書ではポリモーフィズムはどのように扱われているでしょうか。
本書でポリモーフィズムを明示的に扱っているのは、「Chapter2 場合分けのロジックを整理する」だけです。この章でのポリモーフィズムの用途は、区分値に関する条件分岐(if文/switch文)を排除することです。
ポリモーフィズムのこうした利用方法は、マーティン・ファウラーのリファクタリング本で紹介され知られるようになったかと思いますが、便利でもあり、広く使われているものでもあると思います。
ただ、こうした「区分値ポリモーフィズム」は、ポリモーフィズムを適用可能なユースケース全体の中で、かなり周辺的なものであるように私には感じられます。その理由について以下ご説明します。
ポリモーフィズム ― 典型的な用法
その前にまず、ポリモーフィズムの典型的な用法とはどのようなものでしょうか。前回ご提示した、受注(SalesOrder)における値引き計算を例にご説明しましょう:
class SalesOrder { Money unitPrice; Quantity quantity; // ... Money amount() { if (isDiscountable()) return discount(unitPrice, quantity); return unitPrice.multiply(quantity); } // ... boolean isDiscountable() { return quantity.compareTo(discountCriteria) >= 0; } }
このコードでは、開示してよい知識と隠蔽したい知識を以下のように切り分け、前者をisDiscountable()に閉じ込めました:
開示してよい知識
受注ごとにその内容に応じて値引き可否が決まるという知識。
隠蔽したい知識
注文数量・金額等にもとづく具体的な値引き決定ルール。
ここで、「隠蔽したい知識」をなぜ隠蔽したいかというと、それが変わりやすいと考えるからです。なら��、一歩進んで、変わりやすい部分は差し替え可能にしておこうという発想が生まれます:
class SalesOrder { Money unitPrice; Quantity quantity; DiscountPolicy discountPolicy; // ... boolean isDiscountable() { return discountPolicy.isDiscountable(this); } }
ここで、DiscountPolicyは、以下のようなインターフェースです:
interface DiscountPolicy { boolean isDiscountable(SalesOrder salesOrder); }
DiscountPolicyの実装のひとつとして、QuantityBasedDiscountPolicyがあります:
class QuantityBasedDiscountPolicy implements DiscountPolicy { Quantity discountCriteria = Quantity.valueof(100); boolean isDiscountable(SalesOrder salesOrder) { return salesOrder.getQuantity().compareTo(discountCriteria) >= 0; } }
QuantityBasedDiscountPolicyは、たぶん、DIコンテナなどにより、SalesOrderのdiscountPolicyに注入されるでしょう。
この例で、ポリモーフィズムは、SalesOrderに関する様々な関心事から値引き計算に関する関心事を分離するのに用いられています。 例えば、テストという局面をとっても、QuantityBasedDiscountPolicyはSalesOrderに関する他のテストから切り離しでテストできますし、SalesOrderの方は(スタブを用いて)値引き計算の詳細を考慮せずにテストすることができます。 さらに、このソフトウェアが成功し、他社でも使われるようになれば、値引き計算ルールをこのように簡単にカスタマイズできることは、さらなるメリットをもたらすでしょう。
DiscountPolicyのように、特定の計算/判定条件をカプセル化し差替可能にするというポリモーフィズムの利用法は、GoFのデザインパターン本で「ストラテジー(別名:ポリシー)」として知られており、エリック・エバンスのドメイン駆動設計本でも、ごく最初の方で、オーバーブッキングポリシーという例が紹介されています(p.19/位置No.1068)。高度な利用法ではなく、極めて普通な用いられ方かと思います。
前回お話しした「情報隠蔽(=カプセル化)」では、隠蔽したい知識と開示してよい知識を区分して両者を別のモジュール(クラスもモジュールです)に割り振りました。 ポリモーフィズムは、そこから一歩進んで、それら2つのモジュールを切り離し、「疎結合化」するのに役立ちます。「疎結合」というと大げさに響きますが、要するに処理の依頼側と引受側2つのモジュールがあって、依頼側が引受側を知らずとも処理を依頼できるということです。この例で、値引き可否判定を依頼する側であるSalesOrderクラスはQuantityBasedDiscountPolicyクラスを知りません。
こういった意味における疎結合化は、オブジェクト指向以前も行われていましたが(*1)、気軽に、広範に適用できるようになったのは、やはりポリモーフィズムが生み出されてからのことです。
区分値ポリモーフィズムと本書に対する評価
さて、ポリモーフィズムの典型的なユースケースをおさらいした頭で、「区分値ポリモーフィズム」を見直してみましょう。
本書が説明する通り、区分値ポリモーフィズムには、if文やswitch文を排除することで、ソースコードの読みやすさを改善する機会を提供する、という役立ちがあります。
しかし、区分値オブジェクトのメソッド(本書の例では、yen()など)を呼び出す側のプログラムは、区分値オブジェクトのクラスを「知って」いるのが通常ですから、処理の依頼側と引受側は結合したままです(*2)。 ですから、前述したように「疎結合化」をポリモーフィズムの大きな意義と捉える立場からすれば、区分値ポリモーフィズムはやや傍流的な用法に見えることがお分かり頂けるでしょう。
公平に見て、本書は、ポリモーフィズムの他のユースケースについて触れていないだけであり、それらを否定しているわけではありません。ですから、本件は、本書の問題というより、読む側が注意すべき点である、ということなのかもしれません。
ただ、「多態は、区分ごとのロジックをクラス単位に分離してコードを読みやすくするオブジェクト指向らしいしくみです(p.58/位置No.1040)」といった説明を読む読者、とりわけオブジェクト指向の経験が浅い読者が、ポリモーフィズムの主な用途は区分ごとの場合分けロジックを整理することなのだと受け止めるのは自然なことでしょう。しかし、その道の先は行き止まりなのです。
むしろ、初級者には、疎結合化というビジョンのもとで、できるだけ簡単な入り口を示してあげるのが親切というものでしょう。上述したポリシーあるいはストラテジーパターンはそのような入り口として好適な例のひとつと思います。
「現場で役立つシステム設計の原則」という格調高いタイトルと「変更を楽で安全にするオブジェクト指向の実践技法」という具体的な副題を持つ300ページ超の本の中で、オブジェクト指向の業績の中心にあるポリモーフィズムについてこのように周辺的なユースケースのみ解説されている事態は、少なくとも私には驚異的なことです。
ポリモーフィズム ― さらなる展開
今回の批判はこれで終わりですが、例として取り上げた値引き計算のケースは、ポリモーフィズムの可能性を検討する上で興味深いので、もう少し深堀りしてみましょう。 前回以来の例では値引き可否判定ロジックの扱いが焦点でしたが、実際には可否を判定するだけでなく値引き額の計算が重要でしょう。業種にもよりますが、値引きの計算は複雑で、特定品目限定の値引き、過去の取引履歴に基づく値引き、一回の総発注額に基づく値引き、キャンペーンでの値引きなど多岐にわたるかもしれません。また、そうした値引きルールは、時の経過に応じて追加され、また廃止されていきます。システムは、そうした諸々の値引きについて、理由と金額をお客様に提示する必要があるでしょう。
こうした状況にどう対応すればよいでしょうか。SalesOrderクラスは、isDiscountable()メ���ッドで値引き可否だけを返せばよいのではなく、値引きの詳細を返さなければなりません。例えば、以下のようなメソッドを備えることになるでしょう:
List<Discount> getDiscounts();
Discountは、値引き理由の説明と値引き額を保持するオブジェクトです:
class Discount { String description; Money discount; // ... }
ここでの焦点は、値引きルールの詳細を隠蔽することに加えて、その時々に応じて値引きルールを追加し、あるいは廃止出来るようにすることです。それを踏まえれば、getDiscounts()の詳細は以下のようになるでしょう:
class SalesOrder { // DIコンテナなどから値引きポリシーのリストを設定 List<DiscountPolicy> discountPolicies; // ... List<Discount> getDiscounts() { List<Discount> discounts = new ArrayList<Discount>(); // 値引きポリシーを適用 for (DiscountPolicy discountPolicy : discountPolicies) { Discount discount = discountPolicy.getDiscountFor(this); if (discount != null) { discounts.add(discount); } } return discounts; } }
インターフェースDiscountPolicyは以下のようになります。
interface DiscountPolicy { /** * 与えられた salesOrder に対する値引きを計算し、その結果を Discount として返す。 * 当ポリシーでの値引きが salesOrder に適用されない場合は null を返す。 */ Discount getDiscountFor(SalesOrder salesOrder); }
このようにしておけば、新しい値引き制度が出来たときには、それに対応するDiscountPolicyを作成してシステムに登録するだけで対応が完了します(*3)。
値引き計算以外に、請求/回収条件、在庫引当、配送方法などにも同じような仕組みが適用可能かもしれません。こうした手法を常に適用すべきということではありませんが、適用しようと思えば出来る、ということを理解していると、設計における選択肢の幅が顕著に広がります。
こうした例をお示ししたのは、ポリモーフィズムというものが過度に技術的なものと受け止められているのではないかと私が危惧しているからです。
イヌがワンワン、ネコがニャーニャーという説明ばかりでポリモーフィズムはわからん、という方が多いですが、一方でその方もDIコンテナは使っていたりします。DIコンテナは、技術的環境に依存するオブジェクトに関して、アプリケーションにはインターフェースだけ提示し、その実装はポリモーフィズムによって実行時に結合することで、アプリケーションと技術的環境を疎結合に保つための仕掛けです。ポリモーフィズムのメカニズムが本当にわからないのであればDIコンテナを使うことさえ出来ないはずです。
ですから、多くの人にとってわからないのは、ポリモーフィズムのメカニズムではなく、「使いどころ」なのだろうと思うのです。フレームワークなどがポリモーフィズムを使っているのはわかっている。ただ、自分たちが書いている「アプリケーション」のコードにおいてどういう局面でポリモーフィズムを使えばよいのか、わからない。結果として、ポリモーフィズムは自分たちに関係ない「技術的」な概念だと感じてしまう。そういうことではないでしょうか。
実際には、それは誤解で、アプリケーション開発においてもポリモーフィズムはカジュアルに利用できます。値引き計算の例ではそれをご理解頂きたかったわけです。ポリシー(ストラテジー)パターンは、ポリモーフィズムのユースケースのごく一部に過ぎませんが、疎結合化というポリモーフィズムの本旨に沿っており、かつ、利用価値も高いものだと思います。
杉本 啓 @sugimoto_kei 経営管理基盤ソフトウェア fusion_place の、プログラマ兼設計者 http://www.fusions.co.jp
[脚注]
[1] 昔からある「ユーザ出口ルーチン」などはこの例でしょう。 [2] 料金計算など区分値に依存するメソッドを区分値クラスに移すことと、その計算にポリモーフィズムを適用することは別問題です。例えば本書p.60/位置No.1062のFeeTypeクラスは以下のように記述することもできます(label()に関する実装は省略)。
enum FeeType { ADULT, CHILD, SENIOR; Yen yen() { switch (this){ case ADULT: return adultFee(); case CHILD: return childFee(); case SENIOR: return seniorFee(); default: throw new UnsupportedOperationException("Fee for fee type [" + this + "] not defined."); } } private Yen adultFee() { return new Yen(100); } private Yen childFee() { return new Yen(50); } private Yen seniorFee() { return new Yen(80); } }
p.60/位置No.1062のコードとこのコードを比べてみると、料金計算方法という知識がFeeTypeクラスに隠蔽されている点は同じで、大人・子供・シニアの料金計算がそれぞれ別のメソッドに分離されている点も同じです。違いは、条件分岐に switch文を使うかポリモーフィズムを使うかという点だけです。 こうしたメソッドが複数あるならば、それぞれの実装でswitchを書くより、ポリモーフィズムを用いるべきでしょう。上記の例のようにswitchが1箇所だけであれば、いずれにするかは、設計の良否というより多分に好みの問題と、私は思います。
なお、このケースではそもそもポリモーフィズムを使うほどのこともなく、以下のコードで十分です。
enum FeeType { ADULT(100), CHILD(50), SENIOR(80); private final Yen yen; private FeeType(int yenAsInt) { this.yen = new Yen(yenAsInt); } Yen yen() { return yen; } }
ただ、これは、単にサンプルコードの選択に関する趣味の問題であって、区分値ポリモーフィズムの妥当性という論点には影響しません。
[3] ここで示したコード例は、値引き制度の間に相互依存関係がないという想定にもとづいています。依存関係があり得る場合(例えば上得意先向け値引きを適用したときにはキャンペーン値引きは適用しないといった条件に対応する場合)、DiscountPolicyにDiscountのリストを渡し、各ポリシーがそのリストに対してDiscountを除去したり追加したりできるようにする方がよいかもしれません。
interface DiscountPolicy { /** * 与えられた salesOrder に対する値引きを計算し、その結果を DiscountのListに追加する。 * リストから既存のDiscountを除去しても構わない。 */ void updateDiscounts(SalesOrder salesOrder, List<Discount> discounts); }
この場合、Discountに、値引き制度を識別するためのDiscountTypeなどを保持させることも必要でしょう。
値引き計算といった機能をこのように疎結合化するにあたり、疎結合化されたモジュール間の役割分担をどのように設計するかは極めて重要です。あるいはそれこそがオブジェクト指向にもとづくアプリケーション設計の核心部分かもしれません。 「オブジェクト指向」という言葉を作ったアラン・ケイは「オブジェクトよりもメッセージング」と強調したメールの中で、以下のように言っています:
The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.
(拙訳)偉大で成長可能なシステムを作る上でのカギは、個々のモジュールの内部特性や振る舞いがどうあるべきかということにではなく、むしろ、モジュールたちがどのようにコミュニケ―トするかをデザインすることにこそある。
また、「マルチパラダイムデザイン」で、ジム・コプリエンが提示した「共通性/可変性分析」も、こういった相互作用に重点を置いた設計手法です。
6 notes · View notes
got7-texts · 8 years ago
Note
Right so I'm terrified about my future. I'm a straight A student, never gotten a B since I moved to my current home, but though I'm well rounded, I have no future plans. At all. I don't know my passion and I'm just so... Idk. Average isn't the right word. This'll sound pretentious but... It's like I'm good at nearly everything I try, and that makes me uncomfortable bc I don't know what I like best. (Part 1)
I'm going to college in a few years and I'm scared bc I literally have to decide my entire life. What makes it worse is that everyone says to me "oh you'll go far in whatever you do" and I just want to tell them no... I don't know what to do... I'm really just a failure... But I can't say that and then there's just more and more expectations and I just don't know what to do. I feel so fake because I pretend to be loud and vicious and savage but I'm just so terrified about everything. (Part 2)
The first thing to remember is that you’re not alone  NOT decided when you choose your college or major. You shouldn’t feel any pressure to do what others tell you - it’s your life and you should make your own path.
Instead of just thinking about what to study, I think you should take some time to think about the type of impact you want to make. You don’t necessarily need to know what your passions are (sometimes following your passions isn’t the best path), but rather find something that’s important to you, whether it’s working with people, animals, computers, books, etc.
You mentioned that there are lots of things that you’re good at, so maybe try to find something that challenges you! Talk to seniors at your high school or college kids and get to know what they’re studying and why. I’m a firm believer in reaching out to others. There’s no shame in asking for help - people are actually very flattered when you do.
You’re not fake, believe me, if you were, you wouldn’t be thinking about things so deeply like this. You care about your future and that’s amazing! So many people don’t, so you’re already ahead of the curve! 
Don’t give up hope, don’t be scared, and just keep looking for something that interests you. When you find it, grab onto it and learn as much as you possibly can about it. 
Not everyone has a single ‘dream’ or a ‘goal’. Just take it one step at a time and keep trying to expand your interests and horizons. You’ll definitely find something that interests you. I promise
Feel free to message me if you ever have any questions or worries, I’d be more than happy to help~
6 notes · View notes
intermundos · 8 years ago
Text
so u wanna stan shinee
aight i know everyone n their mom has made a primer for shinee but most of them haven’t been updated since like 2013 so i’m making my damn own because i love these boys so much!!!
let’s get down to the basics
Tumblr media
these sweet babes debuted on May 25th, 2008! their fandom name is shawols (sha [shinee] + wol [world]) and their fandom color is pearl aqua blue~ now to the members!
**Onew **(Lee Jinki) - born December 14, 1989 - leader! - literally the best leader in all of kpop he’s won an award for it
if the feeling of warm sun on your face was a human it would be jinki
well known for having a super forceful finger flick (aka ttakbam)
he’s really a man of weird talents and i love him
instagram & twitter (rarely tweets, usually just instagram posts)
Jonghyun (Jjong) (Kim Jonghyun) - April 8, 1990 - December 18, 2017 - main vocalist! (seriously this boy’s got fucking PIPES) - the only member with tattoos - cries at the drop of a hat, SO soft-hearted, my sweet babe
widely known for his talent as a songwriter
solo stuff: Base _(2015) - _Story Op. 1 (2015) - She Is (2016) - Story Op. 2 _(2017) - _Poet | Artist (2018)
instagram & twitter
Key (Kim Kibum) - born September 23, 1991 - lead rapper! - king of fashion and instagram and my heart - also speaks Japanese and English! king of being multilingual - unabashedly himself but gets very shy when complimented - side-project: Toheart - 1st Mini Album (2014) - instagram + instagram for his dogs (yes he’s that kind of person i lvoe him)
Minho (Choi Minho) - born December 9, 1991 - main rapper and face of the group! - soccer is his lifeblood, i love my sport boy - he’s so supportive of all of the members it’s the sweetest thing i’m emo - the most competitive human being alive - ^literally he doesn’t drink bc he feels like that’s alcohol “beating” him - no social media :(
Taemin (Lee Taemin) - born July 18, 1993 - main dancer and maknae! - damn the boy knows how to sin, but so so shy off-stage - has suffered through the most unfortunate hairstyles - honestly a living meme as well as the light of my life - solo stuff: Ace (2014) - Press It (2016) - Sayonara Hitori (2016) [J]
Flame of Love (2017) [J] - Move (2017) - Move-ing (2017) [re]
he’s a super private person, so no social media either :(
NOW TO THE GOOD STUFF
**music videos **(playlist)
Korean: Replay + dance ver. | Love Like Oxygen + dance ver. |
Amigo |
 Juliette + dance ver. | Ring Ding Dong | Lucifer + dance ver. | Hello | Sherlock + dance ver. | Dream Girl + dance ver. | Why So Serious? | Everybody + dance ver. | Colorful | View + dance ver. | Married to the Music + dance ver. | 1 of 1 | Tell Me What to Do
Japanese: Replay | Juliette | Lucifer | Sherlock | Dazzling Girl |
1000 Years |
Fire | Breaking News* | Boys Meet U* | Everybody + dance ver. | 3 2 1* | Lucky Star* | Downtown Baby* | Your Number* + dance ver. | Sing Your Song* | DxDxD | Winter Wonderland | Get the Treasure (* - unfortunately these are on various other streaming sites bc shinee’s japanese label hates youtube)(if they don’t work, let me know!)
Toheart (Key’s side project): Delicious + dance ver. | Tell Me Why
Taemin (solo): Danger + dance ver. | Ace | Drip Drop | Press Your Number + dance ver. 1 + dance ver. 2 | Sayonara Hitori | Move + solo dance + duo dance | Thirsty | Day and Night
Jonghyun (solo): Crazy (Guilty Pleasure) | Deja-Boo | Hallelujah | Fortune Cookie | End of a Day | She Is | Lonely | Shinin’ | Before Our Spring
live performances (just my faves bc i’m biased)
like a fire - jonghyun and key hit some crazy fucking high notes in this and we are all so blessed this performance saved kpop
odd eye - such a great song tbh (and key has an eyepatch??? yes)
everybody - these outfits are unreal i love them and the FANCHANTS hot damn y’all
pretty boy - this is a song off of taemin’s solo mini album that he did with kai from EXO and it’s LIT Y’ALL (taemin’s outfit lmao please set me on fire)
internet war - Y’ALL. THIS VIDEO. THIS VIDEO RUINED ME. JUST WATCH IT.
the entire tokyo dome concert - the most lit concert i’ve ever witnessed in my life ohhhh my god i’ve cried at the ending three different times this week. unfortunately impossible (as far as i can tell) to find as a whole, so the main link is to the majority of the concert. - here you can watch the playlist of the in-between parts where they talk to the audience (aka “ments”) with english subs (#6 is the best one if you don’t cry ur not human sorry!!). also their individual performances! - taemin - u will understand why i said the boy knows how to sin
- key - U WILL UNDERSTAND WHY I SAID HE’S HIGH-KEY KINKY - jonghyun - hello god is that u? i found an angel here on earth - onew - HE CRIES SO I CRY WE ALL CRY WHEN JINKI CRIES also taemin plays the piano kill me - minho - literally too cute for words, minho might also be an angel
variety/reality shows
one fine day - honestly the best way to get to know shinee as individuals. they each get sent off on vacation alone to a place of their choosing and it’s honestly so endearing and funny some of the situations they get into. i love my five sons. (if the video doesn’t work, try clicking on a different server underneath the video player! VIP usually works the best) (dream girl)
_ knowing brother - [ jonghyun | ot5 ] - idek how to explain this show....a bunch of older famous guys are the hosts and they act like they’re in school? it’s super funny tho 10/10 (she is, 1 + 1)_
happy together - this is more of a talk show but 95% of it is spent roasting people it’s so funny_ (1 of 1)_
weekly idol - [ 1 | 2 ] [ 3 ] [ 4 ] - the best variety show for a kpop group to appear on. if you’re getting into a new group, weekly idol would be my no.1 recommendation (if they’ve been on it). MY PRAYERS WERE ANSWERED AND THEY WENT ON IT FOR THEIR 1 OF 1 COMEBACK IT’S SO GOOD Y’ALL! (sherlock, dream girl, 1 of 1)
hello baby - [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 ] - if you’re unfamiliar with the show, basically a kpop group has to be the sole caretakers of - you guessed it - a baby! considering shinee was basically made up of babies itself at this point, it’s pretty cute. they call each other appa a lot and i die. (just click on the numbers underneath the video player to get to the next episode!) (replay)
v app - [ key+minho | taemin+jjong+onew ] [ sketch | ot5 ] - GOD BLESS PLEASE JUST FUCKING GIVE SHINEE A VARIETY SHOW OF THEIR OWN!!!! (mttm, 1 of 1)
snl korea - [ ot5 ] [ taemin ] [ jonghyun ] - you probably know the drill with snl, same as the us version so there’s a lot of super funny sketches! (odd, press it, she is)
blue night - [ 1.1 | 1.2 | 1.3 ] [ 2.1 | 2.2 ] [ 3.1 | 3.2 ] - shinee on jonghyun’s (former) radio show! it’s so great tbh i feel like they never do things with all five of them so this is a gem (odd, 1 of 1, 1 + 1)
key’s know how - key did this super fucking adorable vlog series for mnet in the summer of 2015 that’s basically a little sneak peek into how he ~lives oh my GOD it’s so CUTE i love key (odd)
beatles code - the four hosts of this show dress up as the beatles for some inexplicable reason but shinee was really cute when they were guests on it~ (dream girl)
shinhwa broadcast - [ 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 ] [ 2.1 | 2.2 | 2.3 | 2.4 | 2.5 | 2.6 ] [ 3.1 | 3.2 | 3.3 ] - shinee was a guest on shinhwa’s variety show for a few episodes and it’s honestly THE BEST_ (sherlock)_
keyword #boa -  (still updating) key does a really cute travel/eating show with labelmate boa. he’s a huge fan of hers, so this leads to a lot of endearing moments. (1 + 1)
if any of the videos are missing/links are broken, just send me a message and I’ll try to find new links!
(last updated 2/1/2018)
4 notes · View notes
chem-love · 7 years ago
Link
youtube
輿水はこの事件で核が使用されたと主張している。一見すると「トンデモ陰謀論」に聞こえる。だがその実あの粉塵を浴び、吸引した多くの無辜の民が癌で死亡している。私も仕事で多くの粉塵を吸引し浴びているが健康体である。寧ろ建設業界で働く者は身体を動かし良く食べて良く寝るせいか健康体が多い。米国の警察、消防関係者の訓練がどの程度か知らないが日本の建設関係者に負けない程度は屈強なはずだ。その屈強な男たちがあの粉塵を浴びて何年も経った後に癌を発症するのか?
日本の被爆者たちと911で粉塵を浴びた者たちとの接点、それは罹患した病気が非常に似通っているという点だ。下の画像はヒロシマの被爆者が罹患した病気のグラフだ。
信じがたいが核が使われたという合理的疑問が無い
911救援者が様々な癌に罹患している。 <(http://www.asyura2.com/0601/war81/msg/241.html>
正月早々に911首謀者が訴追され起訴されたとの怪情報が飛んでいたが後追い記事が無い。
トランプ氏には一刻も早く究明と断罪を望む
0 notes
corpo-sant-blog · 7 years ago
Text
#ひとり修行 第二回:明治村で夏目漱石の無罪を勝ち取りました
この記事は ひとり修行 Advent Calendar 2017 - Adventar  2日目の記事です
この記事を書き始めたのが22:10、今私は名古屋にいます。
博物館明治村×リアル脱出ゲーム 大逆転裁判2 「容疑者」夏目漱石最後の事件 ゴーストライターの明暗|博物館明治村
こちらの謎解きをしに夜行バスで往復とかいう己の年齢を顧みない旅程を組んでいます。
一年ぶり2回目 pic.twitter.com/wGIOUAE2HP
— ぱすた (@_ochano02) 2017年12月2日
(2年ぶりでした)(記憶ガバガバ)
明治村の謎解き、制限時間が10:00〜15:30とかなり長め(リアル脱出はだいたい60分くらい)でゆっくり進めることが出来るのがよい。 推理が行き詰っても焦って思考停止にもならないし、気分転換がてらコラボメニューを食べたり出来るのでありがたい……。夜行バスで疲れた身体でも安心……。
今回は成歩堂版・ホームズ版と謎が二種類あって両方をクリアするとトゥルーエンドが…!?みたいな感じだったらしいのですがそのことに気付いたのは答え合わせをしに行った時でした。 てっきり難易度が違うだけだとばかり……。
勝ちましてよ pic.twitter.com/CoajR2TREn
— ぱすた (@_ochano02) 2017年12月2日
<
p>今年も無事ソーセキさんを無罪にできて良かったです(誤解を生む発言)ホームズ版で進めたので成歩堂くんの方はどんな話だったのか気になる…。
0 notes
trojanjean · 7 years ago
Note
daisies,1975, plants cactus, sunrise, piercings, bands, space and white bed sheets (whoops das a lot ^^;;)
daisies: what is the greatest accomplishment of your life?
i’m lazy, uninspired, anxious and academically dumb, so i guess graduating with a degree is sort of a good thing? i also have a permanent job and an apartment, that’s something? 
1975: what is the first happy memory that comes to mind, recent or otherwise?
recent: this morning i was with my nephew and i was singing and dancing with him and he laughed like a 2-month old baby can and it was super precious, i love him
plants: pick a person to stargaze with you and explain why you picked them.
my girlfriend because i’m sappy and romantic like that. 
sunrise: pick a quote and describe what it means to you personally.
i love walt whitman and i bought a poetry collection of his a few years ago when i was feeling super helpless, and the book really helped me and calmed me down? my all time favourite poem is to you, and i really love the ending of it: 
Through birth, life, death, burial, the means are provided, nothing is scanted,Through angers, losses, ambition, ignorance, ennui, what   you are picks its way.
i like it just because :’) 
piercings: do you wear a lot of makeup? why/why not?
no. just because i don’t feel like it and i’m too old and impatient to start learning now hehe 
bands: talk about a song/band/lyric that has affected your life in some way.
nightwish was a huge deal to me when i was a teenager. it helped me through school and high school (bc those sucked big time) and i got soooooo many friends just because we loved the same band. i’ve met 5-10 people from the internet just bc of nightwish? we went to concerts together and queued overnight, etc. it was so important for me at the time. i’ve seen nightwish live 13 times and my nightwish fangirl times were magical and full of hope and love.
space: do you have a desk/workspace and how is it organised/not organised?
well, i have a desk. my dad bought it for me from a recycling centre and restored it a little and it’s LOVELY. but rn it’s just a space for me stereos, keys and other papers because i don’t need a desk for anything. but i don’t want to get rid of it either :’) 
white bed sheets: what is your night time routine?
doing the dishes, then showering + brushing my teeth etc. putting on smth from netflix while i dry and collect my stuff for the morning. checking that i’m remembering my next day’s shift correctly, then netflix/reading/sleeping depending on my mood. 
2 notes · View notes
phpmentors · 7 years ago
Text
「Lean Architecture / DCI Evening」参加レポート
2017年10月18日、James Coplienさんとその奥様であるGertrud Bjørnvigさんをお招きして、「Lean Architecture / DCI Evening 」というイベントを開催しました。日本ではソフトウェアパターンやアジャイルのリーダーとして知られるJames Coplienさんは、『 マルチパラダイムデザイン 』(1998年)でドメインとドメイン間の関係を中心に据えた設計パラダイムを提唱していました。Coplienさんは2009年、MVCアーキテクチャの考案者である Trygve Reenskaug さんと共に「DCIアーキテクチャ」を発表しました。2010年、CoplienさんはGertrudさんとともに書籍『 Lean Architecture 』を上梓、トヨタ生産方式をソフトウェアアーキテクチャに適用するリーンアーキテクチャについて、DCIアーキテクチャをそのビルディングブロックと位置づけた具体的な方法を記述しました。今回、マルチパラダイムデザインの読書会を大阪で開催していた縁から、表題のイベントを開催することができました。この記事ではセッションの内容についてトークを再現する形でお伝えしたいと思います。
NOTE: (※)内は筆者によるコメントです。また、基本的に英語から修正せずに翻訳しているので、事実関係に関しては確認がとれていないものもあります。
CoplienさんによるDCIアーキテクチャの概説
Coplienさん(以下、C): 最初にクイズをします。みんな立って。DCIは、DCIと呼ぶ前はなんと呼んでいたか知っていますか?・・・DCA (Data-Collabolation-Algorithm)(※関連リンクを参照)です。知ってた人はそのまま立って。これを差し上げます。(※参加者の一人がサイン付きのLean Architectureをプレゼントされる)
C: (※DCIで開発するための言語基盤とIDEを提供する)Trygveのプログラムの拡張子は「.k」になっているのはなぜでしょう?これは哲学者のカントからとっている。
C: オブジェクト指向プログラミングができない、モダンな言語はなんでしょう?Rust?Java。OK、それだ。Javaはオブジェクト指向ではなく、クラス指向の言語だ。
C: DCIのWebサイトfulloo.infoにいろんなリソースがあります。サンプルコードとかビデオとかも入っている。
C: 今日はインフォーマルな会です。小さいDCIのチュートリアルをすることもできるし、私が最近どういう研究をやっているかを話すこともできる。DCIが実際にどうやってプログラマーの集中力を高めてエラーを取り除くことができるかということを話してもいいし、Trygve言語の実際の例もお見せすることができる。見た目はJavaみたいだけどね。そこには、コンテキストとロールも登場する。設計の話もしてもいいし、ドメイン分析の話をしてもいい。
参加者A: ドメイン分析とTrygve IDEも見たい。私たちは大阪で「マルチパラダイムデザイン」の読書会をしていました。MPDとDCIをどのように繋ぐかの話も聞きたい。
C: 今日は何人、大阪から来たの?Oh! DCIを殆ど知らないという人は?最初に小さいインタラクションをしましょうか。15分くらい。
C: マルチパラダイムデザインは、クラスベースの言語に基礎を置いて議論を展開している。DCIはリアルなビルディングブロック(構成要素)とオブジェクト群のネットワークです。そこが大きな違いです。ドメイン分析とかユースケース、ロールのアクターに関しては後ほど妻が説明してくれる。
C: まずはDCIの触り。簡単なデモを。銀行口座間の送金のケースを考えてみる。ソフトウェア上ではそれはどういう状態でしょうか。クラスを書いて、オブジェクト同士をインタラクションさせますね。���ラスを書くときというのは、クラスの全てのメソッドを考慮して書く必要がある。
C: ATMの例を考えてみましょう。ATMが稼働していて、それを確認するために、コンソールにオブジェクトIDをプリントするプログラムを考えてみましょう。
(※メソッドが呼ばれるたびにオブジェクトIDがプリントされていくデモ)
C: これを見て何かパターンは見つかるでしょうか? 単に同じオブジェクトが延々と呼ばれていることがわかるだけですね!(※会場笑)呼ばれるオブジェクトの順番とかは全然重要ではなかったわけです。
C: 次にオブジェクトIDではなく、クラス名が表示されるようにしてみましょう。クラス名は重要ですよね。コンソールを見てパターンは見つかりますか?ないですね。これもまだ完璧ではないようです。クラスのうち、2つは口座に関するもの、最後の3つ目は通貨に関するものだということはわかります。しかし、アーキテクチャの振る舞いはクラスだけでは表現されていないようです。
C: さて、今度はメソッドが呼ばれる毎に、役割(※ロール)がプリントされるようにしてみますよ。・・・Ah ha!(※会場笑) 分かりましたね。お金を送金するときの構造はこういうふうになりますよね。構造は役割(※ロール)の中に入っています。
C: 1つの銀行に2つ以上の口座を持っている人はいますか?(※会場から手が)それでは、私に1つの自分の口座から他の口座に送金するユーザーストーリーについて説明して下さい。
参加者B: ある口座からある口座に送金します。妻にダイアモンドを買うために。貯蓄口座から普通口座へ。
C: もっと一般的に言うと?
参加者B: 振込元から振込先へ送金する。
C: 振込元口座を持っている人はいますか?それは、オブジェクトでしょうか?クラスでしょうか?なんでしょうかね、振込元口座みたいな役割とは?・・・人はこれを役割(ロール)として考えているわけですよね。クラスやオブジェクトとして役割(ロール)を考えてはいないですよね。
C: アラン・ケイの最初に考えていたオブジェクト指向というのはヒューマンメンタルモデルをコンピュータに適用させたものでした。そのメンタルモデルを今発見したのです!
参加者B: どうやって、口座の振込元とか振込先とかを判別するんでしょうか?
C: ピアジェという発達心理学者がいます。ピアジェに「オペレーショナルモデル理論」というのがあります。ビルディングブロック(※構成要素)を使って論理的に考える必要があります。オブジェクトやクラスではないものがあるのです。おそらく私たちは最初にオブジェクトを学び、その後にクラス・クラス化を学ぶようです。子どもが一番最初にオブジェクトを学ぶ時は、全てを自分自身として認識するようです、母親さえも自分だと思う。4-7ヶ月の間に区別をつけることができるようになっていく。小さな子どもは馬を見た時に、馬を指差して「犬!」と叫ぶ。(※あ〜!と会場共感の声)こういった認識は物事に共通性を見出していることによって成り立っています。私たちはプログラムを問題解決のために書いています。子どもは8ヶ月くらいの時に原因と結果という因果関係について学ぶ。その頃から机を押したり、上にあるものを叩いたりして何かが落ちたりするのを楽しむ。そうして最終的には、問題解決する能力を学習していく。それがオペレーショナルモデルと呼ばれるものです。
C: プログラムを通して問題解決するためにこの考えが必要ですね。プログラムを書くときにはどうやっているのでしょう?ここにこのようにオブジェクトが散らばっている。そしてオブジェクトをつなげるユースケースがある。これはまた別のユースケースですね。これはまた別のユースケース、また別のユースケース・・・(※会場笑)ユースケースはオブジェクトのシーケンスではないんですよね、こう見ると。順番があるわけではない。
C: では、ユースケースのコードをオブジェクトよりも上のレイヤーに取り出す、ということをやってみましょう。今、ユースケースのコードは、オブジェクトのクラスの中にあります。このユースケースの部分を、クラスの外側に出すのです。そうすると、オブジェクトの方は基本的なクラスのインスタンスのままなので、とても単純です。しかし、これらは実際のところユースケースの一部にはなりません。では、ユースケースの部品は何でしょうか? ロールですね。ユースケースの部品は、ロールの中にあります。開発者は、このようなロールの中からいくつかを選んでまとめます。このまとまりを、コンテキストと呼びます。 つまり、コンテキストがユースケースに相当します。そして、ユースケースを実行するには、サブジェクト(※ユースケースの入り口となるエンティティ、後述のサンプルコードのTransferMoneyContext.SOURCE_ACCOUNTに代入されるオブジェクトにあたる)にこれらのメソッド(※ロールのメソッド)をインジェクトします。このオブジェクト(※他のエンティティ、後述のサンプルコードのTransferMoneyContext.DESTINATION_ACCOUNTに代入されるオブジェクトにあたる)にもこれらのメソッドをインジェクトします。
C: オブジェクトは既にあるからユースケースを書きたい。例えばヘリコプターを飛ばすことについて考えてみましょう。オペレーショナルモデルで思考して、ロールを考えます。映画の「マトリックス」を見たことがあるますか?トリニティはヘリコプターを飛ばさなければいけなかったですよね。ヘリコプターを操縦するプログラムをダウンロードしていました。ロールのプログラムをダウンロードすることによってヘリコプターを飛ばすことができたわけです。ランタイムでオブジェクトに対してどのようにユースケース上で振る舞うのかを教えてあげる。ユースケースが終わると、オブジェクトは何をやるか、何をやったかを(※どのように振る舞うかを)忘れてしまうわけです。
参加者B: トリニティはオブジェクト(※エンティティ)、パイロットはロールということですね。
C: トリニティは、ヘリコプターを操縦するためのメソッドを持っている。手を動かしたり、足を動かしたりといった基本的なトリニティが持っているメソッドを使うことができる。コンテキストがヘリコプターを運転させる。トリニティは基本的な動作はできる。コンテキストとトリニティの間のメソッドの契約というものが必要で、トリニティは人なので人が持っているメソッドだけが使えるという契約がある。手を動かすとか。ヘリコプターを操縦するというのははコンテキストです。ロールはデータを持たない。純粋にメソッドを持っている。以上がDCIの基本的な話でした。
参加者C: ロールとクラスの違いがまだわからない。
C: クラスはデータを持ちます。あなた達はいわば人間クラスのインスタンスですよね?そこから初期化されている。(※会場笑)ヘリコプターパイロットはロールなので、ヘリコプターパイロットのインスタンスを作ることはできない。人間が必要なんです。あるいはロボット?もしくはゴリラ。
参加者C: Javaのインタフェースはロールに近い?
C: 似てるとは言えるけど、実装がないからロールを完全に表すかというと違うと思います。(※Java 8以降はインタフェースは実装を持てるようになりましたが)あと、Javaはインタフェースは静的に決まっていて、動的に決めることができないというところが異なります。クラスがインタフェースをextendするというのを全てコンパイル時に決めなければなりません。
参加者D: Swiftのプロトコルエクステンションを使うと近いことができますか?
C: Objective-Cでお腹いっぱいなので、Swiftの学習は避けているものでね(※会場笑)プロトコルエクステンションを使うと近いことができるようです。
参加者C: クラスとロールの違いについて。Java クラスとインタフェース、Scala クラスとトレイト、C++ 動的クラス、Virtualクラス これらはDCIの実装として使うことができるか。
C: Scalaのトレイトはかなり近いです。Scalaではトレイトのミックスインを使う。トレイトを使ってクラスに合成できる。その結果クラスは両方の機能のメソッドを持つことができる。C++ではどうするか?C++の場合はクラスの合成に継承を使ってしまうので難しい。どうするか?ロールをテンプレートを使って書くことができる。テンプレートを使えばDCIを実現することは可能です。ただそれはコンパイルのタイミングになってしまう。ダイナミックではない。fulloo.infoも見てくださいね。なんとなく、DCIのイメージが掴めましたか?
C: DCIのための言語として気に入ってるものの一つはRubyです。オブジェクトの拡張が簡単にできる。モジュールを使ってミックスインすることもできます。ただ、メソッドは自由に追加することはできるが、それを取り外すのが難しい。名前の衝突の問題もある。Matzはこの問題について理解してくれたが、一度インジェクトしたものを引き剥がす機能を入れることまでは、説得するには至らなかった。Rubyの仮想マシンを変更すればできるのですがね。
(※実は筆者はRubyistなのですが、refinementを使うとある程度は目的に適うのではないのかなーと思ってしまいました)
C: Trygveを使ってる人。(※一人だけ手が挙がる)オープンソースですよ!(※会場笑) お金の送金のサンプルを見せていきます。ここにクラスがあります。これはドメイン分析から抽出されたものです。 amount()(金額) などのメソッドを持っている。クラス指向のプログラミングならこんなものでしょうか?Trygveの紹介をしていきますね。
(※以下のコードはTrygve で書かれた送金のサンプル https://github.com/jcoplien/trygve/blob/master/examples/july_money_transfer.k より引用)
/* * july_money_transfer.k */ class Currency { public Currency(double amount) { amount_ = amount.clone } public Currency +(Currency amount) { assert(false) return this; } public Currency -(Currency amount) { assert(false) return this; } public Currency() { } public String name() const { assert(false); return "" } public String sign() const { assert(false); return "" } public double amountInEuro() const { assert(false); return 0.0 } public double amount() const { return amount_ } public String toString() const { return amountInEuro().toString() } public int compareTo(Currency other) { if (amount() > other.amount()) return 1 else if (amount() < other.amount()) return -1; return 0 } private double amount_ } class Euro extends Currency { public Euro(double amount) { Currency(amount) } public Euro -(Currency amount) { return new Euro(amount() - amount.amountInEuro()) } public Euro +(Currency amount) { return new Euro(amount() + amount.amountInEuro()) } public String name() const { return "Euro"; } public String sign() const { return "€"; } public double amountInEuro() const { return amount() } public String toString() const { return amount().toString() } } class Account { public Account(int acctno) { acct_ = acctno } public String accountID() const { return acct_.toString() } public Currency availableBalance() const { assert(false); return null } public void increaseBalance(Currency amount) { assert(false) } public void decreaseBalance(Currency amount) { assert(false) } public void updateLog(String message, Date dt, Currency amount) { assert(false) } private int acct_ } class CheckingAccount extends Account { public CheckingAccount() { Account(1234); availableBalance_ = new Euro(100.00) } public Currency availableBalance() const { return availableBalance_ } public void decreaseBalance(Currency c) { availableBalance_ = availableBalance_ - c } public void updateLog(String message, Date t, Currency c) const { System.out.print("account: ").print(accountID()) .print(" CheckingAccount::updateLog(\"").print(message) .print("\", ").print(t.toString()).print(", ") .print(c.toString()).print(")") .println() } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } private Currency availableBalance_ } class SavingsAccount extends Account { public SavingsAccount() { Account(1234); availableBalance_ = new Euro(0.00) } public Currency availableBalance() const { return availableBalance_ } public void decreaseBalance(Currency c) { assert(c > availableBalance_); availableBalance_ = availableBalance_ - c } public void updateLog(String logMessage, Date timeOfTransaction, Currency amountForTransaction) const { assert(logMessage.length() > 0); assert(logMessage.length() < MAX_BUFFER_SIZE); // assert(new Date() < timeOfTransaction); System.out.print("account: ").print(accountID()) .print(" SavingsAccount::updateLog(\"").print(logMessage) .print("\", ").print(timeOfTransaction.toString()) .print(", ").print(amountForTransaction.toString()) .print(")").println() } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } private Currency availableBalance_; private int MAX_BUFFER_SIZE = 256 } class InvestmentAccount extends Account { public InvestmentAccount() { Account(1234); availableBalance_ = new Euro(0.00) } public Currency availableBalance() const { return availableBalance_ } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } public void decreaseBalance(Currency c) { availableBalance_ = availableBalance_ - c; } public void updateLog(String s, Date t, Currency c) const { System.out.print("account: ").print(accountID()) .print(" InvestmentAccount::updateLog(\"") .print(s).print("\", ").print(t.toString()) .print(", ").print(c.toString()).print(")") .println() } private Currency availableBalance_; } class Creditor { public Creditor(Account account) { account_ = account } public Account account() { return account_ } public Currency amountOwed() const { return new Currency(0.0) } private Account account_ } class ElectricCompany extends Creditor { public ElectricCompany() { Creditor(new CheckingAccount()) } public Currency amountOwed() const { return new Euro(15.0) } } class GasCompany extends Creditor { public GasCompany() { Creditor( new SavingsAccount()); account().increaseBalance(new Euro(500.00)) // start off with a balance of 500 } public Currency amountOwed() const { return new Euro(18.76) } } context TransferMoneyContext { // Roles role AMOUNT { public Currency(double amount); public Currency +(Currency amount); public Currency -(Currency amount); public String name() const; public String sign() const; public double amountInEuro() const; public double amount() const; public String toString() const; public int compareTo(Currency other) } requires { Currency(double amount); Currency +(Currency amount); Currency -(Currency amount); String name() const; String sign() const; double amountInEuro() const; double amount() const; String toString() const; int compareTo(Currency other) } role GUI { public void displayScreen(int displayCode) } requires { void displayScreen(int displayCode) } role SOURCE_ACCOUNT { public void transferTo() { // This code is reviewable and meaningfully testable with stubs! int SUCCESS_DEPOSIT_SCREEN = 10; // beginTransaction(); if (this.availableBalance() < AMOUNT) { // endTransaction(); assert(false, "Unavailable balance") } else { this.decreaseBalance(AMOUNT); DESTINATION_ACCOUNT.increaseBalance(AMOUNT); this.updateLog("Transfer Out", new Date(), AMOUNT); DESTINATION_ACCOUNT.updateLog("Transfer In", new Date(), AMOUNT); } // GUI.displayScreen(SUCCESS_DEPOSIT_SCREEN); // endTransaction() } } requires { void decreaseBalance(Currency amount); Currency availableBalance() const; void updateLog(String msg, Date time, Currency amount) } role DESTINATION_ACCOUNT { public void transferFrom() { this.increaseBalance(AMOUNT); this.updateLog("Transfer in", new Date(), AMOUNT); } public void increaseBalance(Currency amount); public void updateLog(String msg, Date time, Currency amount) } requires { void increaseBalance(Currency amount); void updateLog(String msg, Date time, Currency amount) } public TransferMoneyContext(Currency amount, Account source, Account destination) { SOURCE_ACCOUNT = source; DESTINATION_ACCOUNT = destination; AMOUNT = amount } public TransferMoneyContext() { lookupBindings() } public void doit() { SOURCE_ACCOUNT.transferTo() } private void lookupBindings() { // These are somewhat arbitrary and for illustrative // purposes. The simulate a database lookup InvestmentAccount investmentAccount = new InvestmentAccount(); investmentAccount.increaseBalance(new Euro(100.00)); // prime it with some money SOURCE_ACCOUNT = investmentAccount; DESTINATION_ACCOUNT = new SavingsAccount(); DESTINATION_ACCOUNT.increaseBalance(new Euro(500.00)); // start it off with money AMOUNT = new Euro(30.00) } } context PayBillsContext { public PayBillsContext() { lookupBindings } role [] CREDITORS { } requires { Currency amountOwed() } stageprop SOURCE_ACCOUNT { public String accountID() const; public Currency availableBalance() const; public void increaseBalance(Currency amount) unused; public void decreaseBalance(Currency amount) unused; public void updateLog(String message, Date dt, Currency amount) unused } requires { String accountID() const; Currency availableBalance() const; void increaseBalance(Currency amount); void decreaseBalance(Currency amount); void updateLog(String message, Date dt, Currency amount) } // Use case behaviours public void doit() { for (Creditor credit : CREDITORS) { // Note that here we invoke another Use Case TransferMoneyContext xfer = new TransferMoneyContext( credit.amountOwed(), SOURCE_ACCOUNT, credit.account()); xfer.doit() } } private void lookupBindings() { // These are somewhat arbitrary and for illustrative // purposes. The simulate a database lookup InvestmentAccount investmentAccount = new InvestmentAccount(); investmentAccount.increaseBalance(new Euro(100.00)); // prime it with some money SOURCE_ACCOUNT = investmentAccount; Creditor [] creditors = new Creditor [2]; creditors[0] = new ElectricCompany(); creditors[1] = new GasCompany(); CREDITORS = creditors } } { // Main TransferMoneyContext aNewUseCase = new TransferMoneyContext(); aNewUseCase.doit(); PayBillsContext anotherNewUseCase = new PayBillsContext(); anotherNewUseCase.doit() }
C: Account(口座) という別のクラスがあります。ドメイン分析から抽出されたものです。口座番号というデータを持っている。メソッドは increaseBalance()(残高増) と decreaseBalance()(残高減) 。口座番号を与えれば、このメソッドを使っていろんなことができる。いわば、ちょっと高級な Integer みたいなものです・・・。全くもって良くないですね!貯金用の口座とか、投資用の口座とかどんどん増えていってしまいます。会社の口座、お金���債権者… ここまでができの良くないクラス指向のプログラミングのやり方でした。
C: さて、それでは送金のユースケースについて見ていきましょう。Context がキーワードです。多くの点でクラスのように見えるのだけれど、クラスとは異なっていて、ほとんどの場合データを持たずにロールだけを持っている。 Amount(金額) と呼ばれるロールはとてもシンプルなロールです。これで資金移動をすることができる。
C: (※デモを見せて)これがロールのインタフェースのシグネチャです。オブジェクトがこれらのメソッド全てをサポートするように定義する必要があります。これを「必須の契約」(※the requires contract)と言います。オブジェクトがロールを表現する場合、これらのメソッドを全てサポートしなければならない。
参加者C: ここで言う契約とは、「契約による設計」の契約のことですか?
C: その通りです。バートランド・メイヤーという人が提唱した契約による設計。この人の言ってることは、だいたい合っているけど突き詰められていない。
参加者B: メイヤーの考えのどこが機能しないんでしょう?
C: クラスAがあり、そこにメソッド1があります。そこには事前条件、メソッド実行、事後条件があります。メソッド1は事前条件が真であることを要求し、事後条件が保証されていることを約束します。次にメソッド1の中からメソッド2を呼ぶケースを考えてみましょう。メソッド2にとっての事前条件を見た時、メソッド2にとってはメソッド1が状態を維持してくれているという想定をしているわけですが、メソッド1の実行中に自己隠蔽されている状態の中で条件がおかしくなった状態でメソッド2を呼ぶとメソッド2が結果保証している事後条件が壊れてしまうことがある。
C: クラス側で本体となる実装を持たないのは、ロールのプレイヤーの持っている実装を使うだけだからです。ロールを演じるオブジェクトの実装を使います。別のオブジェクトに由来するメソッドを使うわけです。これらのメソッドはパブリックインタフェースで、ロールが何をするかを知ることができます。
C: よりわかり易い例として SourceAccount(振込元口座) と呼ばれる別のロールも見ていきましょう。SourceAccount は transferTo()(〜に送金する) として呼ばれるメソッド、責務を持っています。今からこの箇所のコメントを外して動くようにしましょう。トランザクションを開始しますよ。もし振込元口座が利用可能な残高を持っていれば、コメントを外した箇所は何になるでしょうか?
参加者B: ��ールを注入されたオブジェクト
C: そうです! SourceAccount ロールを適切に演じるオブジェクトです。利用可能な残高はどこでしょうか?気をつけてください。ここ(※ロール)にはありませんよ。残高は、ロールを演じる口座オブジェクトの側、ロールプレイヤーにあります。
C: クラスみたいだけれど、ランタイムで考えられるようにしてくれます。SourceAccount ロールを演じるオブジェクトについて考えてほしいです。ロールプレイヤーはマトリックス(※コンテキストが持つロールとオブジェクトのマッピング表)によってもたらされるものです。ロールがオブジェクトに注入されると、オブジェクトが機能を持つようになって、送金ユースケースを実現できるようになります。送金メソッドは振込元の Account オブジェクトに注入されます。
C: こちらは別のロール、DestinationAccount(振込先口座) です。DestinationAccountはメソッド transferFrom()(〜から送金される) を持ちます。transferFrom() メソッドは DestinationAccount の残高を更新します。
C: コンテキストのコンストラクタを見てみましょう。TransferMoneyContext(送金コンテキスト) です。コンテキストの中で何がオブジェクトかを伝える必要あります。送金の金額、振込元、振込先、口座の種類。
C: マトリックス(※コンテキストが持つロールとオブジェクトのマッピング表)を表すオブジェクトを持っていて、ロールのメソッドが振込元の Account オブジェクトに注入されます。要はこれ(※コンテキスト)はオブジェクトだと言うことです。Account オブジェクトに対して振込元口座にあるべきメソッド群を与えていきます。送金ユースケースのためにロールプレイヤーが演じるメソッド群です。そうすれば、ランタイムでオブジェクトを組み立てることができます。
C: 他のユースケース、お金を支払うについて見ていきましょう。特別なロールがあります。そして、Amount や SavingsAccount(貯蓄口座) のようなオブジェクトが新たに一つここにあります。これらは、プラグアンドプレイをするために用意したアクターです。私が台本を書いたロールがあり、アクターは芝居においてロールを演じます。
C: これは舞台のようなもので、大道具(stage props)はアクターの持っている道具です。大道具だけでは、一切何もできません。ただデータを引き出すことはできます。
参加者B補足: 何かをすることはできないのだけど、データを引き出すことはできる。
C: このロールの全てのメソッドは const で、アクターの状態を変更することはできません。
参加者B: const というのはロールの型かなにかですか?
C: そうです。ロールの束縛、制約の種類です。
C: さて、stage props (大道具に由来する機構名) の使いどころはわかりますか?オブジェクトは2つのロールを一度に演じるかもしれません。同じオブジェクト、同じインスタンスで二役を一度にこなすことがあります。とても複雑な例として再帰実行になるケースもありえます。これが先程上がっていた問題の一つで、複数回呼び出したら事前条件が崩れることがあるという例です。このstage propsはデータを更新しないから、問題が起こらないようにすることができます。
C: ちょっと難し目の例を見てみましょう。Javaのグラフ描画のデータ構造です。ブロック崩しと言われるピンポンゲームです。変数の中をチェックするデバッガも入っています。700行くらいのプログラムでこれができます。
C: MPDからDCIへどう変遷していくかについて。よく知られているように、対象のドメインを理解することから始めます。殆どの場合、インタラクティブなプログラムはクラス指向のプログラムでできています。オブジェクト指向プログラミングとは、アラン・ケイが定義したように、オブジェクト同士の協調によるネットワークです。これをどうやって意識するかについて。
GertrudさんとCoplienさんによるユーザーストーリー、アジャイルとリーンアーキテクチャ
Gertrud さん(以下、G): 皆さんはユーザーストーリーは知っていますか?ユースケースは?アジャイルになるためにはユーザーストーリーをたくさん作りましょう。リーンになるためには、ユースケースが必要。
G: ユーザーストーリーの��式(フォーム)として、以下のようなフォーマットで考えるといいです。
As a <USER or ROLE> 例: 口座を持っている人として I want <FEATURE> 例: ある口座から別の口座に移したいという行為 So I can <MOTIVATION> そうすればなにができるか。例えば、ダイアモンドを買ってあげることができる。
ユーザーストーリーの構成要素はこのようになっています。これをブレインストーミングなどでたくさん作っていく。 上から、Who、What、Why に対応している。
G: ユーザーロールには、口座を持っている人、銀行の従業員、(※例えば電気代を支払おうとする)市民などがいます。
G: お金の送金は、今回の場合、全てのロールで行うケースがある。しかし、それぞれのロールでやりたい事は違う。ロールやモチベーションによってコンテキストが変わってくる。実装する前に、モチベーションがわかるので、実装することができる。これは実装する前に知る必要があるんです。
G: ユーザーストーリーの洗い出しは、ブレインストーミングであげていく。するとかなり数が増えていく。そこから一般的な(※抽象度の高い)状態に近づけていく。そうすれば、ユーザーストーリーからユースケースに落とし込むことができる。
G: ユーザーストーリーは具体的で、抽象的なのがユースケース。どこまで抽象的にするべきか?コードで理解できるレベルまでです。ユースケースをリーダブルコードに落とし込めるところまで持っていくのが目標になる。
G: ユーザーストーリーはインプットなので、なるべくたくさんの実例を出したほうがいい。銀行の業務であれば、昔に使っていた小切手の話をユーザーストーリーとして抽出するくらい。
G: ユースケースの段階で要点を厳密に抽出する。これがそのままプログラムに使われるから。
(ここで休憩に入りました)
G: ユースケースで大事なことはターミノロジー(※用語)。システム分析とシステム設計で同じボキャブラリー、ターミノロジーを使ってお互いの同意を取っていくことが大事。関係者の間で合意をとるのも大事になってくる。
G: 分析と設計で、同じボキャブラリー、同じターミノロジーを使って話をするので、相互に一貫性をもたせることができる。もちろん違うチームに行くと言葉も変わっていく。
G: 銀行だったら銀行員にも話を聞かないといけない。ドメインエキスパートだけではなく、銀行員もチームに入って、彼らの使っている用語をコードに落とし込んでいく。ユースケースレベルになると、コードのステップレベルまで落とし込めるようになる。
G: コアシナリオとサテライトシナリオというのがある。コアシナリオはシナリオの中でも本道で大事な物。サテライトシナリオは、例外的だったり拡張されていたり複雑だったりするもの。それでも、システムはこういうものもカバーしなければならない。
参加者: なぜ、「サテライト」という用語にしたか?
G: オリジナルの用語は、インクルードとエクスクルードだった。その使い分けはわかりにくいので、コアシナリオとサテライトシナリオにした。また、デビエイション(※deviation: 逸脱、脱線、偏向)と一時期は呼んでいた。コアシナリオじゃないなにか、そんな感じ。
G: ユースケースという用語は昔ながらの用語で古臭い感じがするので使わない方向でというのはある
G: 感覚的にはコアシナリオがスコープ全体の80%、残りはサテライトシナリオという割合になる。
G: サテライトシナリオのほうがアジャイルっぽいやり方で進めていける。そもそも複雑だったり、変わりやすかったりするので。
G: 具体的なユーザーストーリーをユースケースに落としていく時に、どこまで一般化するのか。例えば、銀行で資金移動する時に使う一般的な用語は送金するという用語とか、そういうことを考えてちょうどいい落とし所を見つけていく。
C: 銀行口座の残高がマイナスになった時に、自動的に所有者の他の口座から振り替えてマイナスを補填するような、システム起動のユーザーが関与しない形でのシステムオペレーションを考える。MVCはエンドユーザーから見た、それに基づいたプログラミングモデル。DCIはプログラマーサイドのユーザーモデルを表現している。先程の、ユーザーがでてこないシステムオペレーションのようなシステムオペレーションも自然に扱うことができる。
G: ターミノロジーがとても大事。ターミノロジーのデータベースを会社が持っていて、緻密に定義した辞書を持っている。そう、会社に辞書がある。プログラムの中の変数やファイル名なんかもそのデータベースを見て決める。 辞書に用語がなければ、辞書に追加したり変更したりする。追加するときにはちゃんと申請しなければいけない。
G: ソースコードの中にはコメントを書いてはいけない。さきほどの辞書を使って、ソースコードが、例えば英語からドイツ語などの自然言語にそのまま翻訳されるので。ソースコード中にコメントがあるとその内容をいちいち翻訳しなければならなくなる。
G: 最初に生まれた子供と同じくらいの注意深さで名前をつけよう。
C: ポリモーフィズムがないからコードが読みやすいのかもしれない。ポリモーフィズムがあると、メソッドがどこから呼び出されるかわからないからプログラムの見通しが悪くなる。ボキャブラリーも大事だが構造も大事。ある研究では、ユースケースのいろんな箇所にコードを分散させるとエラー率が70%増えるという調査結果がある。
C: リーンアーキテクチャの良いところとして、エラーを早く見つけることができることがある。テストをしているときではなく、コードを読んでいる時にエラーに気づくことができる。
C: フォードは組み立てを実際にして、テストは最後に確認している。トヨタの場合は、組立時にその場でテストをしている。リーンのアプローチの1つとして、問題をより早く見つけるという利点がある。
C: アジャイルとリーンについて。リーンはクラスの構造が重要。リーンにコストをかけて、アジャイルで実際にどう稼いで行くかを考える。アジャイルはオブジェクトのインタラクションが重要。
C: ドメイン分析とユースケース分析も同時並行的にやる。同時並行的にやると重なる場所がある。みんなそれぞれ同時に実行していく。
C: 野中先生がトヨタにいた時に気づいた。それぞれの分析がかさなりあって進んでいく。これを、刺し身モデルという。(※ラグビーの)スクラムも刺し身。挟まり合っているでしょ。ウォーターフォールとは違って皆が全てのことをやるからスクラム。
C: リーンは長い期間のプランニングが必要で大事になってくる。アジャイルはフィードバックに応じた再調整が肝要。リーンは、深いレベルの専門家が作る。アジャイルはなんでもありみたいなところがある。スクラムとDCIはそのふたつのことをやる。
C: パターンも同じように両方のものを含む。これは日本の禅から来ていると思います。パターン系のガイダンスに従って、門を通��てゴールに近づくことはできるのではないか?パターンもスクラムも、ある程度のレベルではDCIも、ほとんどは日本由来のもの。道教だよね、これ。
C: リーン側のほうは、日本のトヨタの思想。山田 ひろしと言う有名なエンジニアでホンダの人がトヨタに教えた。(※原典見つけられず)
C: アジャイルのほうは、日本でよく知られた比喩で伝えるのは難しいですが… 社会的構造が違うので。デンマークは、社会がとてもフラット。日本は階層的なところがある。よりシステム化されているので、色々なルールが存在する。日本は、もうちょっとアジャイルのほうをエクササイズするといいかもしれません。
C: 実際の開発の流れ。ドメイン分析 → 共通性可変性分析 → クラス → インタフェース、API設計。最初はインタフェースしか書かない。もしかしたらスタブくらいは書くかもしれない。実装はいつ書くか?ユースケースのタイミングで。Just In Time。ユースケースが必要とするインタフェースだけを実装する。(※インターフェイスをクラスで実装するのではなく、インターフェイス自体を実装する)インタフェースは抽象的な概念で、ロールは具体的なインタラクションやアルゴリズムなので、そのタイミングで。
C: この中でプラットフォームを開発している人。プラットフォーム開発はリーンではない。あらかじめ用意しておくもの。だからリーンではない。使わないものを作る時は会社が危なくなる。これは、無駄と言います。
C: DCIアーキテクチャを利用した開発の順番としては、まずアーキテクチャを作ってそれからそれぞれデータベースとかGUIのインタフェースを作る。会社としてなにを売るかというのはいろいろあるけど、売るのはユースケース。それぞれのクラスを売っているわけではない。ユースケースは、それぞれのデータベースとかサーバーとかクライアントのユーザーインタフェースなどを少しずつ重ねたもの。
C: 生産性が一番の無駄を生むと、トヨタの大野耐一さんがおっしゃっている。
C: こういう話を、「object-composition」というメーリングリストで話をしているので、入ってくださいね。
C: 1月にまた東京に来るので、またこういう会を開催しましょう!
最後に、GertrudさんとCoplienさんと参加メンバーで集合写真を撮りました。
Tumblr media
NOTE: 当日は同時翻訳付きの英語トークでした。通訳の任を快諾してくださった、 @ganchiku さん、@remore さん、ありがとうございました。また、記事を書くにあたっては英語の下訳で @kuma_nana さんに貢献していただきました。こちらもありがとうございます。もちろん、当ポストの文責は執筆者である私にあります。
関連リンク
fulloo.info
The trygve language project
マルチパラダイムデザイン読書会
[Reenskaug 2006] Trygve Reenskaug. MVC and DCA Example program comments
object-compositionメーリングリスト
関連記事
PHP Mentors -> Beyond MVC
PHP Mentors -> Debasish Ghosh氏のブログ記事「ドメイン駆動設計:可変性の管理」を翻訳しました
PHP Mentors -> PHPカンファレス2015 PHPメンターズセミナー「モデルを設計せよ!―ドメイン駆動設計を超えて」参加レポート
0 notes