Magnolia Tech

いつもコードのことばかり考えている人のために。

『ITと数学』、その切っても切れない関係

初めてコンピュータサイエンスを学ぶとき、「コンピュータサイエンスは、つまりは統計だから」と言われた。今考えるとそれは必ずしも当たっている訳でもないけど、遠くもなかった。


コンピュータの原理の裏にはたくさんの数学の概念が潜んでいる。学校で習う高等数学、果たして何に役に立つのか?と疑問に思ったら、この過去のSoftware Design誌の数学に関する記事をまとめた『ITと数学』を読むのがお勧め。

そんなに分厚くもないし、値段もそこまで高くは無いので、自分が学ぼうとしていることがどんな意味があるのかわかることで、学習意欲も高くなるはず。

そういえば、つい先日もSEGAがゲーム制作に必要な数学の知識を解説するスライドを公開したばかりだ。

techblog.sega.jp

世界は数学に溢れている


個人的には、機械学習に普段あまり触れることはないけど、第3章の「数学プログラミング入門」がお気に入り。

あと、表紙がとにかく優勝

Scala 2.13対応の『Scala スケーラブルプログラミング 第4版』は、全Scala使いが買うべき一冊

Scalaの言語設計者であるMartin Odersky著『Scala スケーラブルプログラミング 第4版』が出版された。今回はScala 2.13対応ということで、全面的に書き直されたコレクションクラスに対応するための改版。

基本的な構成は前の版と変わらず、基本的な文法からオブジェクト指向関数型プログラミングまで一通り解説されていて、言語仕様を知るには必須の1冊。最初から最後までを読み切る、というよりは気になった言語仕様を知りたい時にまず開くと、だいたい答えが書いている、という期待で読む本(分厚いし)。

関数型プログラミング言語の解説書だけど、「モナド」のような概念的にちょっと理解が難しい要素は全然出てこないところも良い(モナドという用語も、全編を通してオマケ的に1回しか出てこない)。

あくまでプログラミング言語機能の解説書として、淡々と機能が解説されていく構成になっている。

ただ、言語解説書なので、この本で「Scalaに入門する」のはなかなかハードだし、テスティングフレームワークは一部触れられているが、sbtなどのツールチェーンの解説は無いし、WAFの解説もない(その代わり、なぜかデスクトップアプリケーションとしてのGUIプログラミングの解説は、ある)ので、その辺りを知りたい場合は物足りないかも。

入門者の方はまずは『Scala研修テキスト』や、『実践Scala入門』から入ると良いでしょう。

scala-text.github.io


また、原著の方はもうすぐScala3に対応した第5版が出版されます。こちらも翻訳されることを祈って、皆さんまずは第4版の日本語版を買いましょう!

オライリーから出ているScala本もScala3のリリースに合わせてアップデート、もうすぐ出版されます。こちらも期待。


初めてScalaを知って、『Programming in Scala』の初版の原著を買ったのは10年前だった気がする。Perlの次に覚える言語としてなぜScalaに興味をもったのか、そのきっかけはさっぱり覚えていないけど、Scala3のリリースなど、今でも活発に開発が続いているし、DDD界隈での評価も有る。当時思ったほどの普及はしていない気もするけど、所謂ギョームアプリケーションを書くには良い言語なのは変わらないんじゃないかと。

『[改訂新版]プログラマのための文字コード技術入門』...いつ役立つか分からないからとりあえず買っておいて損の無い一冊

”基礎技術”系の本には、いつ役立つか分からないからとりあえず買っておいて損の無い一冊、というのが有って、この『[改訂新版]プログラマのための文字コード技術入門』もそんな1冊。

文字コード周り、基礎を学んでいないと「文字集合」と「符号化方法」の区別できなかったり、「全角文字」とか「2バイト文字」のようなあやふや言い回しをして間違った設計をしてしまうことになる。

特に本書では基本的な文字コード周りの技術から、プログラミング言語での扱い方とか、ハマりやすい落とし穴(Unicodeの正規化とか)もしっかりフォローされているので、「とりあえず手元にあることの安心感」が半端ないです。

仕様と、実装、その間にあるもの

妙に時間をかけてしまって一つのPRを書いた。

Fixed Syntax Summary by magnolia-k · Pull Request #9666 · scala/scala · GitHub

Scalaの文法概要の記載が正確ではない(過去の修正で誤りが混入した)箇所を直すものだ。

他の誤りも無いかと確認する過程で、upper(大文字)の定義と、lower(小文字)の定義を読み取るのに非常に苦労した。

Syntax Summary | Scala 2.13

ただ、よく読むと分かるが、結局大文字も小文字もletter(文字)に集約されてしまい、構文上の区別は無い(大文字と小文字が使える箇所に差はない)。

また、実装上もJavaCharacter.isUnicodeIdentifierStartや、Character.isUnicodeIdentifierPartを使って判定されているが、結局どちらも大文字と小文字による分岐は存在しない。

つまり、仕様は複雑(大文字と、小文字を細かくパターン分け)な割りに、実装は非常にシンプルになっている。かと言って何か仕様に反した実装がされているわけでもない。仕様を満たすように正しく実装されている。

(UnicodeOther_Lowercaseというプロパティがどうのこうの...と出てくる割に、実装上はどこにも出てこないので不思議に思っていた)


このように、仕様は複雑だけど、パターンを読み切って実装は実にシンプルにまとまっている事例というのは案外いろんなところに存在する。だからといって、「仕様」を「実装」に合わせて描き直してはいけない。

仕様は仕様であり、実装は実装だからだ。

この仕様が拡張された時、やはりその複雑さに合わせてコードを書き直さないといけない時だってくるかもしれない。仕様はあくまで当初の意図がしっかり残っていなければいけないし、実装はそれを満たさなければいけないけど、完全に一致している必要もまたない。

それが将来に良い結果をもたらすかもしれないし、悪い結果をもたらすかもしれない。

技巧的に走りすぎたコードが良いとは限らないけど、それでも実装の効率性や、将来の拡張性を考えた時に、必ずしも仕様の字面通りのコードがベストであるとも限らない。

一方で確実に読み取りづらくなるのも事実で、そこに何らかの意図をコメント等で残しておかないと後世の人は混乱するだけかもしれない。

'仕様と、実装、その間にあるもの'…コードを書く人はその距離をコントロールしていかないといけないし、その距離が有るという事実を理解しないといけないのです。

そしてコードを書かない人が発するいつものセリフ...「こんな簡単な仕様を実装するのになんでそんなにかかるの?」という疑問に答えていかないといけないのです。


あ、仕様を満たしていない実装はとにかくダメですね、それはダメです。

ダメなんだけど、いつの間にか「バグも仕様」になってしまう時もあるので、話がさらにややこしくなるけどね!

Vimの正規表現でのUnicode周りのこと

  • ファイルがUTF-8で作成されていても、\uxxxx形式のコードポイントで検索できる(UTF-8のコードポイントではないのは何故だろう?)
  • [^\x00-\x7F]でもUTF-8の2バイト以上の文字にマッチさせられる
  • iskeywordの範囲じゃ無いのに、UTF-8の2バイト以上の文字がワード境界として認識される
  • Unicode Categoryに対する検索条件は設定できない

USB Type-Cケーブルは迷わず『⚡︎3』刻印入りのThunderbolt 3ケーブルを買おう

USB規格のケーブル、どれもコネクタ部分にサポートしてる規格を刻印してないから、後から何が何だか分からなくなっちゃうけど、Thunderbolt 3ケーブルは何故か規格を刻印してる製品が多いので(全部じゃないけど)、後から区別できるところが良いところ。

なので…

Thunderbolt3にしておけばUSB3.1にも対応してるし、ディスプレイ接続にも使えるし、USB PDの給電も100Wまでいけるし、迷う要素が無い。

たいていのソフトウェア開発の方法論や、機能は、「用法用量を守って正しくお使いください」に行き着くよね

ちゃんとわきまえてるけど、そこに関心量を向けたくないから機能や方法論で縛っておいてほしい話と、用法用量が守れないメンバーがいるので強制力を持たせたい人の会話がすれ違ってることが多い気がするんだよね…

そこにさらにもっと開発者を信頼すべきだ的な論調が混じると、まぁみんな自分が直面してる課題は違うので…という当たり障りのない結論になってしまったりして世界は難しいし、分断されてるんだ。