2013/11/13(水)【追記あり】そもそもかけ算ではありませんでした

2013/11/13 23:45

以下のエントリは全面的に取り下げます。このエントリにいくつかリンクが張られていることを確認しており、また、私がかつてこのような考えを持っていたことは否定しないので、エントリそのものは残しておきますが(ただし、頭が沸騰している状態で追記した攻撃的な文章は削除しました。申し訳ありませんでした)、現在の私がこのような主張をしているわけではないことをご承知の上でお読みください。

このエントリに関しまして、2点お願いがあります。

まず、前述のとおり、私がかつてこのような考えを持っていたことは否定しません。しかし、そのことをもって、私と関わってくださる方々や、私の関わったことのあるプロジェクトを侮辱するのはお控えいただきたく思います。なにとぞよろしくお願いいたします。

もう1つ、過去にこのような発信をしたのは事実ではありますが、現在進行形で発信の内容ではなく人格を攻撃されるのは辛いものがあります。勝手なお願いではありますが、そろそろ私の人格を攻撃するのはお許しいただき、エントリの内容に対するご批判やご指導にとどめていただけないでしょうか。ご検討のほど、よろしくお願いいたします。

以前のエントリの続きです。

ほかの方の意見をいろいろと拝見して、それはそれで納得したのですが(というか、そもそも私は「わかりづらい」以上の主張はしていません)、ただ、以前のエントリで書いたとおり、わかりづらいものはわかりづらい。かけ算の順序にこだわった教育を受けてきた記憶はないのですが。

あと、前回も書いたとおりこれはあくまでも例であり、もうちょっとややこしい式になっていることが多いです。さすがに数量と単価くらいならどちらの順番でもわかるので、あんまり無能扱いするのは勘弁してくださいw

閑話休題。

今日も今日とて現行プログラム解析をしていたのですが、同じ作業をしている隣の席の方がぼやいているのが耳に入りました。

「この式わっかりづれぇんだよ。なんで違う単位の値を返すんだよ」

ん? 返す?

……ということで、理由がわかったかもしれません。そして、謝らないといけません。私(たち)がわかりづらいと言っていたのは、あまり算数、数学と関係のない理由でした。

たとえば amout * unit_price という順番で書かれていた場合、こういう処理をすることを期待しています。

// amout * unit_price
price = amount.operator*(unit_price);

しかし、さすがにこれは違和感があります。個数クラスのインスタンスに金額クラスのインスタンスを引数で渡して演算メソッドを呼び出した場合、個数クラスのインスタンスを戻り値として期待するのは当然でしょう。

ですから、金額を計算するような場合は次のような順番で書かれていてほしい。(実際には、コンパイラが良きにはからってくれることが多いですが)

// unit_price * amount
price = unit_price.operator*(amount);

今回price(にあたるもの。以下同様)もunit_priceもamountもintのラッパークラスなので、どんな順番で書こうが変わらないのですが、どうやら我々は無意識のうちに単位をクラスと見立てて考えてしまっていたようです。

要するにプログラミング言語における*演算子は、厳密な意味での乗算じゃないんですね(もちろん言語によると思いますが)。数値同士の場合に乗算のように見えるだけで。これを算数に適用しようとしたのが間違いでした。申し訳ありませんでした。

もっと極端な例でいうと、(たとえばPythonの)配列や文字列における*演算子の使い方ですかね。

# 要素数が100ですべての要素の値が0の配列
arr = [0] * 100

# ABCABCABC
repeat_str = 'ABC' * 3

もちろん、これはあまりにも算数とは関係がありませんが。

というわけで、前回のエントリの内容につきましては、「あのプログラムが」わかりづらいということを除き、ほぼ全面的に取り下げます。ですから、私のことを数量と単価のかけ算も満足にできない人間扱いする意見も取り下げていただけると幸いです。

2013/11/12(火)南郷キャンプで入団テスト

2013/11/12 22:28
ライオンズの入団テスト絡みのニュースを二つ。 [【西武】モック、ロペスの2投手が合流 - プロ野球ニュース : nikkansports.com](http://www.nikkansports.com/baseball/news/f-bb-tp0-20131112-1217347.html) モックのアメリカ時代の成績を調べてみました。 [Garrett Mock Statistics and History - Baseball-Reference.com](http://www.baseball-reference.com/players/m/mockga01.shtml) メジャーにいたのは2008年から2010年からの3年間。そこではあまりパッとせず、その後はAAA暮らしで、しかもどんどん防御率、WHIPが悪くなっています。これはアレですかね。一言で言うと熱烈歓迎。 > ロペスは「1球目から真っすぐでストライクが取れる。93~94マイル(151キロ)は出たことがある」と話した。 > > [【西武】モック、ロペスの2投手が合流 - プロ野球ニュース : nikkansports.com](http://www.nikkansports.com/baseball/news/f-bb-tp0-20131112-1217347.html) 外国人選手のMAX151キロですから、5キロから10キロは割り引いて考えるべきでしょう。また、真っ直ぐでストライクが取れることをアピールするということは、変化球はからっきしの予感がします。これはアレですかね。一言で言うと熱烈歓迎。 [【DeNA】森本が西武Cで入団テスト - プロ野球ニュース : nikkansports.com](http://www.nikkansports.com/baseball/news/f-bb-tp0-20131112-1217344.html) 前監督と並べて見たかったところです。残念……というのはどうでも良くて。 ライオンズの来年の外野を考えてみると、ベストなオーダーは栗山、秋山、坂田と全員左です。右の外野手の層が薄いので、ここで右の外野手を補強するのは有りだと思います。チーム全体を見渡してみても、一番頼りになる右の代打が熊代という時点でかなり残念な構成ですし。 ただ、うーん。右の外野を獲りにいくなら谷だったんじゃないかなーと思うんですよね。どうやら谷はバファローズらしいという情報もあるのでもう手遅れっぽいですが。

2013/11/11(月)Thunder Claw

2013/11/11 23:07
昨日のWEBアプリコンテストの写真を見て、本気で白髪を染めようかと検討し始めたちぃといつです。こんばんは。 さて、今年から少しずつアプリをリリースし始めた私と[joeくん](http://uragami.hatenablog.jp/)ですが、[Tustle!](http://tustle.jp/)、[Tossy](http://tossy.herokuapp.com/)のころは特にチーム名も決めておらず、強いて言えば「Tustle実行委員会」と名乗っているような状況でした。 ただ、一つのサービスを追求するわけでもないのに特定のサービス名を掲げたチーム名というのもどうなんだろうということで、今回のコンテストには「Thunder Claw」という名前で応募しました(実際には流山百歌を作り始めるより前にはチーム名は決まっていたのですが)。 「Thunder Claw」の由来ですか? Python使い→へびつかい→へびつかい座→シャイナさん→サンダークロウ、です。 それ以外にも「シャイナ」というもっとストレートな名前も候補に挙がっていましたが、あれだけ素顔という機密情報を漏らしまくっている人の名前を冠すると、作るアプリにセキュリティホールがありそうな印象を受けるのでもう一捻りしてみました。 というわけで、今後ともThunder Clawをよろしくお願いいたします。

2013/11/10(日)流山市WEBアプリコンテストで最優秀賞を受賞しました

2013/11/10 22:28
[流山市WEBアプリコンテスト](http://www.city.nagareyama.chiba.jp/10763/018001.html)に参加してきました。 このコンテストは流山市のオープンデータ推進の一環として行われるもので、流山市のオープンデータを利用したアプリケーションのアイディア、プログラムの提案を競うものです。 流山市民の[joeくん](http://uragami.hatenablog.jp/)がこの企画を知り、せっかくの機会なので参加してみようかなということで応募してみました。応募した部門はプログラミング部門です。 で、結果。
最優秀賞をいただきました! 皆さまがしっかりとした発表をされる中、完全に笑いを取りにいったプレゼンではありましたが、目新しかったので評価が高くなったのかもしれませんw 今回作成したアプリですがは「流山百歌」というアプリです。そのうち流山市からも正式にリンクが張られるのではないかと期待しているのですが、こちらからもリンクを張っておきます。規約には「応募時から各賞の発表時までの期間中」未発表であることが求められているので、もう公表しても大丈夫でしょう。 [http://nagareyama100.herokuapp.com/](http://nagareyama100.herokuapp.com/) これは[流山100か所めぐり](http://www.city.nagareyama.chiba.jp/tourism/9285/003231.html)を舞台にした俳句を共有するアプリケーションです。URLを見てもわかるとおり、Heroku上で動かしています。Heroku上ではありますが、フレームワークはRailsではなく、Python + Djangoです。すみません、Pythonが大好きなもので。 機能的には特別目新しい要素は使っていません。Googleマップ、Twitterとの連携、一部でモーダルウィンドウ的な表現を使用、といったところ。むしろ苦労したのはデザイン面で、レスポンシブデザインを採用したはいいものの、あっちを立てればこっちが立たずという感じでかなり時間がかかりました。もっと具体的に言うとIE爆発しろ。 さて、今回このアプリがアピールしたかったのは以下の点です。 * 行政のデータだからといって必ずしもお堅いアプリを作る必要はない * オープンデータで完結せずに別のサービスと組み合わせると機能に広がりが出る * シニア層にもオープンデータの存在を知ってもらいたい そして、質疑応答でやりとりした印象でも、審査員の方々にはその狙いが上手く伝えられたのかなと思います。これはスピーカーのjoeくんが頑張った。俺は質疑応答以外はマウスをクリックしていただけなのでw さて、今回のコンテストでは我々が最優秀賞をいただきましたが、皆さんどれも趣向を凝らした素敵なアプリを作られていました。これがコンテストだけで終わるのでなく、こういった動きがもっと盛り上がっていけばいいなと思っています。また、アプリの利用者の方々も、アプリを通してオープンデータに興味を持っていただけるといいなと思います。

2013/11/09(土)【追記あり】かけ算の順序がどうでもいいわけがない

2013/11/09 19:54

以下のエントリは全面的に取り下げます。このエントリにいくつかリンクが張られていることを確認しており、また、私がかつてこのような考えを持っていたことは否定しないので、エントリそのものは残しておきますが(ただし、頭が沸騰している状態で追記した攻撃的な文章は削除しました。申し訳ありませんでした)、現在の私がこのような主張をしているわけではないことをご承知の上でお読みください。

このエントリに関しまして、2点お願いがあります。

まず、前述のとおり、私がかつてこのような考えを持っていたことは否定しません。しかし、そのことをもって、私と関わってくださる方々や、私の関わったことのあるプロジェクトを侮辱するのはお控えいただきたく思います。なにとぞよろしくお願いいたします。

もう1つ、過去にこのような発信をしたのは事実ではありますが、現在進行形で発信の内容ではなく人格を攻撃されるのは辛いものがあります。勝手なお願いではありますが、そろそろ私の人格を攻撃するのはお許しいただき、エントリの内容に対するご批判やご指導にとどめていただけないでしょうか。ご検討のほど、よろしくお願いいたします。

定期的に話題になりますよね、かけ算の順番の問題。

「学習指導要領に書いてある」の回答 - 石田のヲモツタコト

乗算では交換法則が成り立つので、順序が逆になろうと○にするべきだという主張は正しいですし、元ブログで引用されているとおり、学習指導要領でも「交換法則について児童が自ら調べるように指導する」ことが求められています。

お子さんの解答を見るに、問題によってまとまり一つあたりの個数と、まとまりの数の順序がまちまちになっており、あまりちゃんと理解してなさそう、という気はしますが、最初から完璧にできる人間なんていませんし、これは追々身につけていくことでしょう。

……と、ここまでが算数のお話。

急に私の個人的な話に飛びますが、今のプロジェクトでは既存プログラムのリファクタリングを行っており、設計書がメンテナンスされていないというよくあるパターンなのでプログラム自体を解析している最中です。

で、このプログラムなんですけど、非常に読みづらい。

読みづらい最大の要因は、関数途中でのreturnを使っていないため、ifのネストがどんどん深くなっていることなんですが、それを抜きにしてもわかりづらい。計算式がスッと頭に入ってこないんです。

なんでかなーと思ってよくよく見てみたら、乗算の順番が、私の考える普通の順番(被乗数と答えの単位が同じ)と逆になっていることが多いんです。

price = amount * unit_price

いや、さすがにこのくらいならすぐに理解できますが、実際にはこんな単純な式ではない上に、amount、unit_priceのようにわかりやすい変数名ではなく配列の要素だったりします。

プログラミング言語上でも、加算、乗算の交換法則は(浮動小数点演算の誤差を抜きにすれば)成立します。ですから、上記のような書き方をしたところで、演算結果が変わるわけではありません。

ただ、私にとっては非常にわかりづらい。そして、算数なら途中の計算式でしかない乗算が、プログラミングのソース上は最終成果物なのです。

私が小学生のころにはかけ算の順序はうるさく言われていなかったような記憶がありますし(もう30年近く前なのでだいぶあやふやですが)、そのくらい大らかな教え方でも問題がないとは思いますが、でも、最近では×にされてしまう式は、正解の式と比べるとわかりづらいと思います。

「かけ算の順序はどちらを先にしても答えは同じだ」という主張は正しいのですが、「かけ算の順序はどちらを先にしても同じだ」という主張には首をかしげざるを得ません。そして、首をかしげるだけでは気が済まない先生は×をつけるのでしょう。算数という観点ではやりすぎではありますが、気持ちはわからないでもありません。

もちろん、これを算数でやるべきか、というのは難しいところだと思います。どちらかというと「数式という言語でわかりやすい文章を書く方法」なので。かけ算の順序について議論するときは、正解不正解の採点云々だけではなく、もう少しこの観点での議論をしてもらいたいなと思っています。