tonocchoのメモ

軽い気持ちで

コメントのいらないプログラムについてちょっと考えた

www.hassy-blog.com

はっしーさんはクライストチャーチでプログラマをされている方で別にコメント書いたら殺すマンというよりは今の環境がコメントを書かない文化になっているようで、コメントを書かない文何か他のもので担保しているような気はするのだけど、コメントについてちょっと書いてみようかと思います。すいませんがリーダブルコードとか読んだことないです。

まずアジャイルにおいてコメントは、というかドキュメンテーションは

アジャイル宣言では「動かないドキュメントより動くコードが大事だよね」というのがあって、ドキュメントに割くコストとコーディングに割くコストを天秤にかければ後者ですよね、というのがポイントです。なので、一時期流行った「語るコード」とか、「コードが設計書」という流れができたような気がします。

とはいえ自分の立場としては「コメントは必要」という立場ですが、「不要なコメント書くくらいならコード書いたほうがいい」という点や「ときとともにコードと乖離していくならむしろコメントは害悪」という立場でもあります。また「書いたコードはたしかに語っているけどハナモゲラ語じゃワカンネーからコメント書いとけ、な?」という人でもあります。

コメントを書く場合はどういうときか

さて、以前Log4Jのソースを追っかけてたとき(どんだけ前だよ)に以下のコメントがありました。

// Make Windows Happy

コレをやらないとWindowsで痛い目見るということのようで、このような環境に依存することは「なんでわざわざやってんの」ということを書く必要があると思います。

で、コレについては別にいいというか書くべきコメントなのですが、もう一点あるのは「契約書としてのコメント」です。DbCですね。

コメントが契約とは?

JavaではJavaDocを書く、ということがあります。最近の他の言語でもだいたいこの仕組みあると思いますが、なんでこういう機能があるかというと「これから書くコードはxxを満たすよ」ということの契約書(仕様書)を書いているわけです。

ということはJavaDocに対してテストを書いたり実装を書くという感覚が実は正しい気がしますね。仕様に対してコードをかけ、というアレです。

なんでコードに対してテストを書くのがうーん、かというと、「実装に対してテストを書けば実装を通すテストを書いてしまう」からです。TDDの世界ではまずテストを書く、というのが大事だけど、それより前に「これから書くコードは何をするの?」を明確にしなくてはなりません。で、この「明確にした何か」というのが仕様(コメント)でしょう。

もうちょっというと、仕様(コメント)がないなら「ソースを書いてテストも書いてカバレッジ100%、全ケース正常終了」というシチュエーションができたとしても、「その作ったものがそもそも正しいかの担保」をどこでするか、という問題が出てくると思います。

契約としてコメントを書くと変わることがある

例えばですが

// 2つの変数を足して代入する int sum = x + y;

というコメントは無意味です、というかコメントなしでもコレはわかってほしいところです。ですが以下のコードの場合はどうでしょうか。

public int add(int x, int y){ if ( x < y ) { throw new IllegalArgumentException("x < y");

ここでアプローチは2つあると思います。1つめはコメントを書かない方でifブロックをわかりやすい名前のメソッドで置き換える、2つ目はJavaDocかソース内のコメントにしっかりと書いておく。

1つ目のアプローチを採用するときの事情としては

  • 内部の開発者はみんなコードを見ることができるし、なぜそうするかの理由は別のドキュメントにすでに書かれている
  • 外部の開発者にはなんでIAEを投げるのかは何らかの事情で知ってほしくない、または別に外部に公開するものではない

ということかと思います。コードがシンプルすぎて混乱するかもですがそのへんは置いとくとしよう。

2つ目のアプローチは、APIの仕様をきちんと公開してブラックボックスとして使ってほしい場合かと思います。いちいち実装見なくてもコメント見れば全部書いてあるよ、という立場を取る、ということですね。また、書いてあることはすべてテスト済みであるということにもなるし、もし書いてあることと挙動が違えば誰が見てもバグとしてレポートできます。

この辺は結構主観的に「こういうことかな」くらいで書いてありますが、そのコード自体に対するステークホルダーが誰、という点次第でコメントを書く是非や書く場所というのも変わってくると思います。

コメントとコードとテストのアレなアレ

ちょっとしたポイントとしてでなく、仕様としてコメントをソース内に書いてしまうと、コメントのメンテを誰がやるの、という問題が出てきます。仕様を書く人が必ずしもソースコードを編集するとは限りません。むしろWikiとかに書いておいて仕様の記述内容を変える副作用を抑えるという方策を取る場合もあるかもしれません。または、きちんとしたライターにコメントを書いてもらうところもあるかもしれません。

そう考えるとプログラマがコメントを書く、という作業が必須かどうかというポイントはありそうです。

例えば依存するライブラリやサーバーのバグに対するワークアラウンドなんかはソースに書いてあったほうが便利だなとは思いますが。

あとは、テスターがやるテスト(結合テスト)で出たバグがすべて、という環境でもまたコメントの扱いは変わりそうです。

そういうわけで、コメントは必須だろうという人も多いかと思いますが、「どういうコメントがどういう扱いをされるべきか」というのは議論があっても楽しそうですね。

日本ではブロックチェーンvs全銀システムが巻き起こるかもしれない

もしくは次期全銀システムがブロックチェーンに対応かもしれない?完全に妄想の垂れ流しです。

最近、少し興味本位でブロックチェーンについていろいろと読んでいるのだけど、トランザクションシステムが中央集権(メインフレームの勘定系に全部保存する)から、分散管理になるというようなことと理解しました。

これの効果としては、送金処理をはじめとしたトランザクションのリアルタイム性が向上するということのようです。ただ、日本では銀行間送金については全銀システムというのが稼働しており、これもまたリアルタイムをサポートしているような気がします。

www.zengin-net.jp

で、この技術は、かなりブロックチェーンとぶつかるのですが、もう半世紀以上アップデートしながら動いているので、結構寿命を超えてる感ある気がします。ちなみに、いまだに他行への送金が翌営業日になるとか、その時にカタカナしか指定できないのも全銀のせいです。

このシステム、何がいいかというと、金融庁が国内のお金の流れをすべて把握できるという点にあったりすると思います。最近は全銀に対応しない金融機関もあるようですが、日本の銀行はかなり金融庁に牛耳られている気がします。

ブロックチェーンは、低コスト、かつ高速に送金処理がおこなえるわけで、金融としてはかなり魅力的かと思いますし、仮想通貨というこれまでの政府主導のものではない通貨なので、国際送金もかなり柔軟に行えそうです。となると、日本のメガバンクが金余りで投資先がない、という問題もメガバンクが仮想通貨にしてブロックチェーンすれば、海外投資もかなり積極的に行えるということのような気もします。

www.sankei.com

現在メガバンクがお金が余って仕方ないというのは日銀の政策が行けていないこともあるような気がします(どんどん日本円を発行して国債を銀行に買わせているので)が、それ以上に現行の海外送金処理が非常に重たいので、国外に送金することがとにかくつらみしかないのだということもありそうです。

海外送金しようとしたときのつらみについてはそのうち書くかもしれませんが、それはまたの機会に・・・

そんなわけですので、投資をしたい人々にとってはある意味キラーコンテンツのブロックチェーンですが、お金をあまり海外に流してほしくない行政と利害が一致しないのではないかと思っているので、国内金融機関は全銀をとるかブロックチェーンをとるか(そして全銀が廃墟と化すか法整備でブロックチェーンを追い出すか位の争いになる)というようになっていくような気がします。

Rでよくわからないこと

こんにちは、最近課題でRを使っているんですが、どうしてもなんでそうなるのかわからないのがあるので書いてみます。

key <- c("A", "B")
val <- c("C", "D")

df <- data.frame(KEY=key, VAL=val)

df[df$KEY=="A", ]$VAL <- "A"
print(df)

これですが、結果は以下のようになります。

  KEY  VAL
1  A  <NA>
2   B    D

どうしてこうなるのかがさっぱりわかりません。

引用文献の管理できてる?Zoteroで楽々引用生活のススメ!

という感じでいきなりSEOを意識したようなタイトルにしたのはほんのご愛嬌です。確かこんな感じだよね。

今、英語でレポートを書いています。色々と不安があるんですが、その中で「いちいちリファレンス書くのかったるいしあんまり参照したくないなぁ」というのがあります。これ結構大きいと思います。引用をした後に、どこから引用したかを記載するんですが、その書き方にルールがあって、これがいちいち覚えるのめんどくさいんですよね。

手書きでやっていると

と言っても、何も参照しないレポートなんて、お前の魂のポエム以上の価値もないので、嫌々ながら引用をするんですけど、参考文献をPDFで保存するとどこの何番目の資料だっけな、とか、おんなじ資料何回も参照してたとか、そういうのが結構あります。自分もリファレンスを落ち着いてみたら、2ペアありました。フルハウス目前でした。

出会いは突然

リファレンスのあまりのめんどくささに学生センターにあるフリーセミナーで何かいいのないかなーという感じでぼーっとスケジュールを見ていたら、「Zoteroでリファレンス管理」というのが目に入りました。Zotero?と思ってググったら、リファレンス管理のツールでした。これは今の自分に刺さるツールだと思って、急遽インストールして使ってみました。

インストールは簡単

brew cask install Zotero

または、公式サイトから落としてください。そもそもbrewで入らないなら入れるのやめようと思ってたんですけどね。

インストール完了後に起動すると、各種オフィスツール(見た感じ、MS Office、Open Office、Libre Officeなんかの主要なものはサポートされてるぽいですね)へのアドオンがインストールされます。次に、ブラウザへのアドオンもインストールします。今回はSafarideやっています。

その辺をだーっと入れたらおしまいです。

資料収集

Zoteroを起動した状態でやります。

ブラウザへのプラグインがインストールされると、Zoteroのアイコンがアドレスバーの横に表示されます。

f:id:s-tonouchi:20170402181203p:plain

このアイコンがZの場合は何もできないんですが、例えば何か適当な論文を検索して見ます。

f:id:s-tonouchi:20170402181344p:plain

アドレスバーの横のzマークが何か変わりました。そしたらこのアイコンをクリックします、すると画面右下にこんなんが表示されます。

f:id:s-tonouchi:20170402181446p:plain

これでZoteroに論文の各種情報やPDFなんかが保存されます。Zoteroにもこんな風に表示されます。

f:id:s-tonouchi:20170402181623p:plain

これを好きなだけ繰り返します。ちなみに、PDFなんかは環境によってはダウンロードできませんのでご注意を。

引用の仕方

では、引用の仕方です。Ms Wordを使ってやって見ます。まず、Zoteroのツールはアドインにあります。

f:id:s-tonouchi:20170402182152p:plain

引用するときは、以下のアイコンを使います。

f:id:s-tonouchi:20170402182257p:plain

クリックすると、引用のスタイルを確認されます。これは後でも変更可能みたいです。とりあえずIEEEを洗濯しました。この引用のスタイルは、レポートごとに指定があると思いますので、それに応じて選択しましょう。

f:id:s-tonouchi:20170402182345p:plain

検索窓が出ますので、検索して、引用した文書を選択してEnter押します。クリックでもいいのかしら

f:id:s-tonouchi:20170402182531p:plain

すると、カーソル位置に引用番号が出ます。ちなみに検索が使いづらい場合はクラシック検索でもいいでしょう。検索窓のZをクリックするとメニューが出ます。

f:id:s-tonouchi:20170402182703p:plain

で、引用した論文の一覧を作るにはこのアイコン

f:id:s-tonouchi:20170402182912p:plain

クリックすると一発でこんなんが挿入されます。

f:id:s-tonouchi:20170402183020p:plain

Zoteroでリファレンスの悩みにさよなら!

そういうわけで、いかにZoteroを使うと参考文献の引用が楽になるかがお分かりいただけたかと思います。ただ、引用は適切な量にしましょうね!

あと、Zotero的にはなんでも管理できるという風に歌ってはいるものの、できないものもチラホラでした。多分メタ情報がきちんと管理できてないとかその辺かもしれませんね。おしまい。

英語レポートのルールで見出したテーマの決め方

とかそれっぽいこと書くんですけど、やっと英文レポートが本番をかける感じになったので、ここまで感じたことを共有します。ちなみに、学校でそういうことをやっているお歴々はそんなん当然だろ、とか、アラフォーのおっさんが今更何言ってんのwwwwwとかそういうのやめてください。ココロが折れるので。

続きを読む

下のチビと英語

我が家のチビが幼稚園に行くようになってから数ヶ月、相変わらずぐずりながら行きますが、当初のような大泣き、大暴れ、叫びっぱなし、という状況ではなく、幼稚園に行けばそれなりに楽しんでいる様子。

とはいえ、チビは日本語、幼稚園は英語、言葉の壁は以前厚いようです。

ですが、恐るべしなのは「全く意味はわからないままに聞き取っている」ということができているようで、たまに「リスナンってなに?」とか聞いてきて父を悩ませてくれますが、これはどうやら「listen up」と言っていたようです。

続きを読む

SDNをお勉強する

学校で、何これ面白そうで取ったSDN (Software Defined Network)の授業、そもそもネットワークのバックグラウンドもないのに取っているので、いまいちわかりにくい(昔小悪魔女子大生の本を読んだので用語が全く分からずというとこまでは置いてかれてないにせよ)。なんにしても理解したことをアウトプットしていきつつ勉強してみたい。

続きを読む