ORM : Object-relational mapping

オブジェクト関連マッピング

 

rails で DB を扱うってなると Active Record の知識が必要になる。んで、勉強してたらだいぶ行き詰まった。

 

当初の理解はこの程度

 

SQL文を自動生成してくれる便利なヤツ!

 

・・・しょーもない認識でしたmm

 

 

そして・・・

 

大抵の人が同じ認識だった汗

 

 

でも、あながち間違った認識でもない。

 

言ってみればメソッドが定義されているようなもので、使う側からしてみればメソッドを呼び出すだけで使えるという便利な代物である。

 

素の SQL は一見するとシンプルで、直接扱えるという生感があるわけだが、それがいいよね!という話を押し通そうとすると、じゃあ ruby とかのプログラミング言語でも同じだよね?オブジェクト指向とかいらないよね!っていう話になる。

 

つまり SQL をどう扱うのがいいかという話を突き詰めたところに、 ORM が存在する。

 

 

その上で、オブジェクト指向言語とのインピーダンスミスマッチを解消する。

 

 

つまり、SQLオブジェクト指向言語も両方知らないとORMは語れないということになる。

 

それも深い理解が必要に思える。

 

 

 

一つを掘り下げようと思っても別のところでボトルネックが発生するぜ・・・そりゃ、行き詰まるぜ!

 

まだまだだ俺(汗

◯◯駆動開発

テスト駆動開発を学び、ドメイン駆動開発なるものがあるというのを知り、なんか駆動開発っていっぱいあるっぽいね?ってなったので調べてみたので、こんなものがあるんだなぁという記事です。

 

テスト駆動開発

それぞれの機能を作る際まずテストを先に書き(テストファースト)、そのテストが動作する実装を行う。さらに、テストコード自体も成熟させて行くことにより、開発者の確信を裏付けていく。

アジャイル開発に向く。

 

ビヘイビア駆動開発

テスト駆動開発からの進化系。テストファーストにてテストをただ書くというのではなく、求められる振る舞い(ビヘイビア)、つまり仕様(スペック)を定めることにより、より自然な形での開発を行う(スペックファースト)手法。

 

ドメイン駆動開発

ドメイン駆動設計というデザイン段階からの考え方の派生。ドメインの設計をモデルベースで行うべきだという考え方。

 

モデル駆動開発

ドメイン駆動設計で扱うモデルベースの考え方を元にした開発。

 

 

色々あるみたいだけど・・・結局のところ名前が大事なんじゃないなってことかなという結論に。

 

どの開発においても設計は大事だし、テストも大事だし・・・

 

ただ、ソフトウェアというものは、開発してリリースして終わりじゃないよっていうのが前提になるので、アジャイル開発手法のようなソフトウェアを育てるという思考回路が重要となり、その上でそれにフィットするオブジェクト思考というものがあり、どういうモデル設計を行い、どういう実装を行うのかという点にある気がします。

 

他にも色々ある◯◯駆動開発をみてみると、開発者の好みというか哲学のようなものが垣間みえてくるような、そんな◯◯駆動開発でした。

有価証券報告書には虚偽記載があってもいいんだぜ?

ふと何気なく目にしたニュースに

 

金融商品取引法違反(有価証券報告書の虚偽記載)の罪」

 

で再逮捕なんてなのがあって、このあたりの法律って知らん人多いんだろうなぁと思ったので記事にしてみます。

 

まぁ勿論、前提として虚偽記載があってはならないというのは間違いではない。

 

ただし、この際虚偽記載の内容が問題となる。

 

そもそも金融商品取締法というのは、投資家保護のための法律である。株主保護のためでも、一般人保護のためでもないのである。

 

では、投資家保護という観点からみた場合、どういう内容の虚偽記載が虚偽記載として該当するのかという点が一つのテーマである。

 

結論から言えば

 

投資の意思決定に重要な影響を及ぼす恐れがあるかどうかで判断される

 

つまり、金融商品取締法違反だと言い切るには、重大な影響を及ぼすと断定できなければならなし、逮捕するともなれば、ただ虚偽記載を行ったかどうかではなく、投資家の意思決定にとって重要な要因であるであることを説明しなければならないはずである。

 

取締役の報酬はガバナンスの問題である以上、重要な影響がある可能性は十分にある

 

ただ、報道を見ている限り、金額だとか手法についての説明がなされるばかりであり、さらには、それを報酬の過少申告だなんて見出しで一般人感覚にまで落とし込み、金額ばかり強調し、どうです?悪いことしてるでしょ?みたいなやり方は詐欺としか言いようがない。

 

つまり、あくまでも今回の件に関していえば、投資家の判断に影響を与えるのはガバナンス上の問題であって、金額云々の資産状況の問題ではない(資産状況から見れば軽微)のですよ。

 

まぁ騙される方も騙される方なので、騙されないためにも読んでおいてね!ってことでこの記事を書いているわけなんだけども。。

 

そしてさらに、今回監査法人の責任は問われていない。

 

ちなみに監査法人についてもよく知らない人がいると思うので、補足しておくが

 

会社が適正な有価証券報告書を提出することについて、会社と共に責任を負っている

 

つまり、連帯責任なんですよ。

 

監査法人にも責任を負わせることによって、監査をしっかりしてもらおうぜ!っていう話なんですよ。

 

一応監査法人側も、問題点は認識していて指摘した上で会社から回答を受け取っているらしいが。。。

 

だが、「問題ないって言われたので問題なしとしました!」とはならない。確認という監査手続きそのものが正しかったのかということも議論されなければならないだろう。

 

勿論回答には納得していなかったにしても、有価証券報告書の全体としての判断に影響を与えないと判断したはずである。

 

つまり、日産と同じくらい監査法人に対しても批判が向けられて当然であるのに、そうは見えないという点にも違和感を覚える。

 

億単位の金額に気を取られ、ゴーン氏個人にばかり目が行きがちだが、日産っていう会社がダメだったね!っていうのが露見したと考えた方がいい。

 

そもそものガバナンスがダメだったんですよ。

 

ゴーン氏を悪人に祭り上げることにより、その膿を出して、日産は再生します!みたいなスローガンを掲げているみたいだけど、

 

そもそもお前ら自身がダメだったんじゃん!

 

ダメなやつが今更なに言ってんの?

 

っていう点にも目を向けた方がいい。

 

暴力団の組織がさ、

「ワンマンだった会長クビにしたんでうちの組はもう健全です!」

 

なんて言ったって誰も信じないでしょ?

 

 

司法取引だの虚偽表示だの聞きなれない漢字の多さについつい思考停止状態になりがちだが、気をつけて頂きたく。

 

【Ruby】puts と print の違いは改行の有無のみではない!?

puts だと改行が入って、print だと改行が入らない!

 

こんな検索結果を見て、超初心者だった頃は「へ〜〜〜!!」っとなったのを覚えている。

 

しかし結局矛盾に行き当たる。

 

puts [ ] と puts { } 、つまり配列とハッシュでは、配列には改行が入り、ハッシュには改行が入らず { } がそのまま出力されるということに対しての説明がつかないのだ。

 

WHY?

 

仮に改行を入れているんだという説が正しいとするならば、何を基準に改行を入れているんだということが重要となるハズである。

 

配列

["A", "B", "C"]

 

ハッシュ

{"A" => "a" , "B" => "b", "C" => "c"}

 

まずは、配列同士で比較してみる

 

puts ["A", "B", "C"] 

A

B
C

 

print  ["A", "B", "C"]  

 ["A", "B", "C"]  

 

この時点でもどうやらただ改行が入っているというだけでもなさそうである。

 

puts は中身を一つずつ("A"ではなく A として)出力

print は右側をそのまんま出力

 

しているように見える。

 

続いてハッシュ

 

puts {"A" => "a" , "B" => "b", "C" => "c"}

エラーwww

 

print {"A" => "a" , "B" => "b", "C" => "c"}

エラーwww

 

・・・ruby の闇に出会う。。

 

どうやらこのままだとハッシュとして認識してくれないらしく、解説しだすと横道逸れまくりなので、飛ばして以下の方法で代用

 

puts({"A" => "a" , "B" => "b", "C" => "c"})

{"A"=>"a", "B"=>"b", "C"=>"c"}

 

print({"A" => "a" , "B" => "b", "C" => "c"})

{"A" => "a" , "B" => "b", "C" => "c"}

 

どちらも同じ出力となる。

 

 

「,(カンマ)」で区切られて改行が入っているという訳ではない。

 

どうやら、形式的な理由により改行が実行されている訳ではなさそうである。

 

では、なんなのかというとおそらく「オブジェクト」の捉え方の問題なのだと推察する。

 

puts においては

 

配列はオブジェクトの集まり

ハッシュは一つのオブジェクト

 

として認識されていると考えるとしっくりくる

 

print は読んで字のごとくただのprint(印字)であり、puts は put (配置)なのだ。

 

だからオブジェクトを一つずつ、put する。

 

ただ、改行を入れている訳ではない。

そもそも、改行を入れてたいだけなら何もメソッドとして組み込むほどのものではないだろう。

 

もちろん、ハッシュにおいて、キーもバリューもそれぞれオブジェクトである。

ただ、どういうまとまりでオブジェクトを扱うかが大事なのだと思う。

 

改行がなぜ入るのかというと、別なオブジェクトとして扱っているということを表していると考えるのが自然だ

 

つまり、配列はその要素内において、それぞれを別のオブジェクトとして捉える。そのため内部の各オブジェクトはその入れた順番によってのみ区別される。

 

一方、ハッシュはそれ自体が一つのオブジェクトとして捉える。一つのオブジェクトの中身に順位付けはない。

 

例えば一人の人間をオブジェクトとすれば

 

年齢、血液型、身長、これらの要素がキーとなる。

 

各キーに順番はないのである。もちろん配列のように入れた順番で管理することも可能であろうが、ハッシュはそれぞれが、そのハッシュそのものを表す個々の要素であると考えるのが妥当であろうし、そのようにハッシュを使うことによって、一つのオブジェクトとして取り扱うことが可能になるように思える。

 

逆に配列は、それぞれを別なオブジェクトとして取り扱うからこそ、その中身はどんなオブジェクトであれ入れることが可能なのだろう。

 

もちろんバラバラなタイプのオブジェクトを一つの配列に詰め込んだとして、どう扱うんだという問題は残るだろうが^^;

 

 

しかし、なんだかんだでまだわからないことが多い・・・

 

勉強します。

【Ruby】"x = 1" は "x に 1 を代入する" ではない!

変数とはそもそも何なのか

 

という疑問から表題に行き着き、さらには

 

puts "Hello World" は "Hello World" つまり右に書いてあることを出力せよ!というものではないというところにまで行き着きました。

 

まぁ、わかりやすい話、puts は、右に書いてあるものを単に出力せよ!ということであるなら。適当な英数字を入れればそれら全て出力されるということである。

 

だが、実際に出力されるのは、数字ないしは文字列のみであり、変数は宣言されていない限り出力されない。

 

つまり、puts 〜 は、〜というオブジェクトを出力せよという命令文であり、オブジェクト以外はエラーとなる。

 

Ruby では全てオブジェクトであり、変数もオブジェクトである!

 

なんてなのは真っ赤な嘘だ!

 

ちなみに puts の右側に書けば、その時点でオブジェクトは生成されるっぽいので "Hello World" と書けば、その時点である id を持ったオブジェクトが生成され、出力される。

 

という仕組みのようである。

 

オブジェクトがその時点で生成されてなく、ただの英数字としての認識であるならば、宣言されていない変数も、出力されて然るべきなので、おそらく間違っていない。

 

ちなみに { } や [ ] もオブジェクトなので出力される。もちろん空なので表示自体は何もないのだが、エラーにはならない。

 

いちいち items  = { } や、names = [ ] としなくても作れることは作れる。

items や names は変数だ。

 

では変数とは何なのかという問いに戻る。

 

そもそもオブジェクトを作るのに変数は必要ない

 

puts でもオブジェクトは作成されたし、数字も"文字列"も入力されればオブジェクトとして生成される。(若干嘘あり。ある桁数までの数字は最初から id が割り振られている)

 

ただ、オブジェクトを扱うのに変数が必要なのである

 

a = "aaa" 

 

というのを見てみることにする。

 

この場合、生成されたオブジェクトは右辺の "aaa"である。

 

そして、変数 a はただの識別子である。それを見ていくためは、オブジェクトIDを調べてみれば良い。

 

a.object_id
=> 70187710432980

 

ここで

 

a = a + "aaa"

 

を見ていく。

仮に、 =が代入であるのであれば、変数 a のオブジェクトIDは変わらないはずである。変数は入れ物であるという説明を聞いたりもするが、中身が変わっただけで箱が変わらないというのであればIDが変わるのはおかしい。

 

a.object_id
=> 70187710384260

 

違いますね。

 

つまり、代入ではない。

 

=の右辺において、a + "aaa" という新しいオブジェクトが生成されたのである。

 

そのため、オブジェクトIDが変わった。変わったというより、違うものであるので違うIDが割り振られて当然なのである。

 

では変数とは何なのかという問いであるが

 

オブジェクトはバンバン作れる!が、作っただけではその場限りになってしまう。

 

そこで

 

オブジェクトを扱うために変数が存在している。

 

変数 = オブジェクト

 

は、あるオブジェクトをある一つの変数として扱い、いつでも使えるようにした。

 

ということである。

 

 

ようである。。。

 

まだまだ勉強浅いのでこの辺で。

 

 

余談ですが。数字にはもともとidが振られていると話しました。

0 は id = 1、1 は id = 3、2 は id = 5 ・・・

 

id =  2n + 1 のようです。

 

上限は

 

irb(main):008:0> 10000000000000.object_id
=> 20000000000001
irb(main):009:0> 100000000000000.object_id
=> 200000000000001
irb(main):010:0> 1000000000000000.object_id
=> 2000000000000001
irb(main):011:0> 10000000000000000.object_id
=> 20000000000000001
irb(main):012:0> 100000000000000000.object_id
=> 200000000000000001
irb(main):013:0> 1000000000000000000.object_id
=> 2000000000000000001
irb(main):014:0> 10000000000000000000.object_id
=> 70330865618720

 

このあたりのようです。

 

 

配列のインデックスはなぜ0から始まるのか

ruby を復習中に、配列のインデックスが0から始まることに疑問を持ってしまったため、調べてみることにしました。

 

結論から言うと、諸説あって正解があるというわけじゃないっぽいということ。

 

また、言語によっては1から始まるものであることから、おそらくそれぞれの言語の開発者が各々の理由によって0からなのか1からなのかを決めたであろうこと。

 

ということで、開発者に直接聞いてみないとわからん!

 

という部分はあるが、もう少し見てみる。

 

 

よくお見かけするのが、表現の問題ということ。

 

詳しく突っ込み出すと数学の世界に突入してしまうので軽くまとめるが、エドガー・ダイクストラによると、要素の数が0である場合を考慮すると、0から始まるとしておいた方が表現としてわかりやすいよね!っていうことらしい。

 

で、それがどう配列のインデックスに結びつくのかはわからないわけだが・・・

 

アタマのいい人の考えることはよくわかんね!

 

ってことはよくわかった!

 

 

 

ただ、よくわからないままにしておくのも気持ち悪いので、調べたり考えたり妄想してたり、色々してたわけですが、結局のところ色々の色にたどり着きました。

 

色を表現する際、16進数カラーコードがある

 

#000000 = rgb (0,0,0)

16 * 16 ないしは 0〜255 で表すあれだ。

 

位取り記数法のことを考えると、例えば16進数なら16番目は桁が一つ上がってしまう。

 

1〜10で表すより

 

0 〜 F で表した方がスッキリ!

 

 

ま、配列も似たような感じで受け止めてあげたらいいんじゃない?

 

という感じで、なんとなく自分を納得させてあげることができました。

 

 

結論を示せたわけではないですし、納得の仕方はそれぞれなので、気になった方はさらにググってみてください。

 

そしてどうしても納得いかない!

 

っていう人は、新しく言語作っちゃってください!!

 

GOOD LUCK !

 

 

SNS中毒の正体

Twitterを始めて1ヶ月ほど経ち、立派な中毒者の一員となってたのでその中毒性の正体についてお知らせしていこうという記事です。

 

1ヶ月くらいじゃまだまだだよ!

 

という声も聞こえてきそうですが・・・SNS自体はもっと前から利用しておりますので。その辺まとめて。

 

 

さて、早速正体を晒してしまおうじゃないかと思っているのですが、段階を踏みます。

 

まぁ、2段階目で正体が出てくるので、お気楽にお付き合いくださいませ。

 

 

では、まず最初の段階。

 

ある実験が存在した。

(たぶん猿を使った実験だったと思う汗)

 

檻に猿を入れ、その檻にはレバーを取り付けられており、そのレバーを引いたら餌が出てくるよう作られている。

 

猿はレバーを引くと餌が出てくるということを学習する。

 

そうすると猿はお腹が空いたらレバーを引き、餌を食べる。

 

猿頭いい!

 

という実験

 

ここまでなら猿の知能を調べるただの実験なのだが、この次の段階が存在する。

 

ここからが核心。

 

レバーを引いた時、餌がたまにしか出ないよう調整を加える。

 

 

さて、猿はどういう行動をとっただろう?

 

もちろん猿はレバーを引けば餌が出るということは学習する。つまり餌が出るまでレバーを引き続ける。

 

ここまでは予想の範疇だと思う。

 

つまり、お腹が空いたらレバーを引き、餌が出るまで続け、餌を手に入れる。

 

猿は満足する。

 

 

そして次に、お腹が空いた時に再びレバーを引き始め、また餌を手に入れる。

 

 

やっぱり、猿頭いい!!

 

 

・・・とは、ならなかった!

 

なんと、猿は餌を手に入れ空腹は満たされたにも関わらず、レバーを引き続けたのだ。

 

ただ、レバーを引いた時に餌が出るか出ないかがランダムになっただけなのにも関わらずだ。餌もちろん出るし、レバーを引き続けないと飢え死にしてしまうほど、餌が過小であったわけでもない。

 

餌は余った状態でもあったにも関わらず、レバーを引き続けたのだ。

 

 

そして、この実験は

 

やっぱり猿バカじゃん!!

 

という結論で終わらない。

 

 

人間も同様の行動を取るということである。

 

そう、競馬やパチンコ等の各種ギャンブル、ゲームでのガチャにもこれが当てはまる。

 

そして、SNSも然りということである。

 

 

つまり、人間もバカじゃん!!!

 

 

ということで、おそらく避けられない習性であろうことは推察がつくし、知っていたからといって避けられるものではないのだが・・・それでも知っていた方が多少なりとも行動を変えられるだろうと思ったので、記事にしました。

 

お気をつけて!