型安全性とは結局何なのか

この記事は 第2のドワンゴ Advent Calendar 2016 の8日目です。
日付を跨いでいる? またまたご冗談を、DST(ドワンゴスタンダードタイム)ではまだ8日ですよ。

ちなみに前日は…なんと誰も参加登録をしていませんでした!
結構な勢いで埋まってたんですけど、唯一の空きですね。
前々日はdaneko0123さんでした。

一昨年のアドベントカレンダー記事が「関数型プログラミングとは結局何なのか」、去年の記事が「オブジェクト指向プログラミングとは結局なんなのか」ということで、3年目ともなると記事の方向性が固まりつつある雰囲気が漂いつつ、ネタ切れの空気も漂いつつあります。
そもそも去年の時点で既にドワンゴ社員ではないのにアドベントカレンダーには参加し続けている、というのもアレな話ですが。

なにを書くか考えたのですが、最近null安全に関する記事が話題になり、その中で「型」と「安全性」という2つのトピックについて知られていない部分が多そうだと思ったので、プログラムで扱われる「型」とは何か、型が保証する「安全性」とは何か、についてまとめてみたいと思います。

Continue reading

プログラマ向けの脱出ゲームを作った話

最近、リアル脱出ゲームにハマっています。
知らない人向けにSCRAPのリアル脱出ゲームサイトから引用すると、

ある部屋にあなたは突然閉じ込められる。周りには同じ境遇の人たちがたくさんいる。
部屋にはさまざまなアイテム、暗号、パズルが隠されているようだ。
暗号を解き、鍵を開き、箱を開け、制限時間内に最後の鍵を手に入れることができれば
あなたは脱出に成功する。

といったゲームです。
ただし、謎の難易度はすこぶる高く、脱出率は1桁パーセントというレベル。
SCRAPの公演でも、

ただし、子供だましの簡単な謎ではありません。名探偵気取りでお越し下さい。

と書かれるのがお約束になっています。
実際やってみるとわかるんですが、パズルだけではなくひらめきの必要な謎も多く、解けなかったときのはがゆさと、解けたときの達成感がやみつきになるゲームです。

さて、実はプログラマ向けの脱出ゲーム「コードルームからの脱出」が、SCRAPとCodeIQのコラボで以前に実施されていました。
自分はプレ問題だけプレイして本番には参加しそびれたのですが、解説を見ると脱出ゲームの雰囲気を感じてもらえるかと思います。

こういうゲーム、もっと色々あってもいいと思うんですが、ざっと探した限りではあまり数を見つけられませんでした。
個人的な印象ですが、こういうゲームが好きなプログラマは多そうな気がしますし、プログラマならではの謎みたいな面白いものも作れそうなので、もっと流行ってもいいんじゃないかなーと思います。

というわけで、作ってみました。

escape_from_the_repository

タイトルは、「あるリポジトリからの脱出」。
タイトルから想像がつくかもしれませんが、gitを使った脱出ゲームです。

Continue reading

オブジェクト指向プログラミングとは結局なんなのか

この記事は第2のドワンゴ Advent Calendar 2015の5日目です。
ちなみに前日は@deflisさんでした。
先日の記事で分かる通りドワンゴ社員()なのですが、まぁ@mesoさんが「厳格な管理とかめんどくさいので、元社員も参加すればいいんじゃないかな。」とか言ってるしお目こぼし頂きたく…

去年のアドベントカレンダー記事は「関数型プログラミングとは結局なんなのか」というタイトルで、関数型プログラミングという語が何を指していて何を指していないのか、みたいなことをなるべく平易にまとめました。
なので今年は「オブジェクト指向プログラミング(以下OOP)とは結局なんなのか」という記事にしてみた…のですが、なにぶん語の指す範囲が広く、また自分も理解しきっているわけではないので、多少不正確な点があるかもしれません。
「関数型は流行りだけど、今更OOPかよ」とか思われるかもしれませんが、お付き合いいただければと思います。

OOPという語の曖昧さ

さて、一口にOOPといっても、人によってイメージするものがバラバラである可能性があります。
「動物クラスを継承した犬クラスと猫クラスが」とか「グワッと鳴けばアヒル」といった話から、「イマドキのオブジェクト指向はドメイン駆動ヘキサゴナルアーキテクチャだ」みたいな話までいろんなイメージを持つ方がいると思いますが、今回はオブジェクト指向の本質的な思想の部分を中心にまとめる予定です。

ところが困ったことに、OOPという語は2つの異なる系譜があったりします。

  • アラン・ケイがSmalltalkで提唱したOOP
  • ストラウストラップがC++で提唱したOOP

現在は、後者濃い目でこれらが混ざり合ったものに加えて

  • プログラミングではなく設計・モデリングの話

までOOPの範疇で語られていることも見かけることがあります。
これらの区別をつけないと議論の土台から噛み合わなくなってしまう可能性があるため、以降これらを区別して「アラン・ケイのOOP」「ストラウストラップのOOP」「オブジェクト指向のモデリング・設計」と呼び分け、順に見ていくことにします。

Continue reading

ConoHaのオブジェクトストレージをPaperclipから使う

清楚かわいいConoHaちゃんが、APIのレビュー記事を書くとクーポンをくれるらしいので、全力で乗っかっていこうと思います。


(画像はこのは通信室より引用)

今回利用してみるのは、ConoHaのオブジェクトストレージです。
これは基本的にOpenStack Swiftを使って実現されており、API仕様OpenStack Swift APIとほぼ同じ内容になっています。

APIが互換であれば、OpenStack Swiftを扱えるシステムからConoHaのオブジェクトストレージも扱うことが出来るはずですね。
そんなわけで、試しにRuby on Railsで画像アップロードをお手軽にできるPaperclipのバックエンドをConoHaのオブジェクトストレージにしてみましょう。

Continue reading

strtotimeとtimestampの素敵な関係

基本的には関数型言語推しですが、業務では諸事情でPHPを使っています。
色々と罠の多い言語であることは知っていたんですが、先日「これはあんまりだろ…」という挙動を踏み抜きました。
軽くググった限りでは同様の事例紹介が見当たらなかったのと、あまりにも衝撃的だったため記事として残しておきます。

前置き:MySQL DATETIMEとstrtotime

PHPerな諸氏におかれましては、strtotimeが色々と頑張りすぎるせいでハマったことは1度や2度ではないのではないでしょう。
例えばMySQLのDATETIMEで未定義を表す 0000-00-00 00:00:00を32bit環境でstrtotimeに渡すとfalseになります。
ドキュメントを見ると

返り値 ¶
成功時はタイムスタンプ、そうでなければ FALSE を返します。 PHP 5.1.0 以前ではこの関数は失敗時に -1 を返します。

と書かれており、「そうか、日付として不正だから解釈に失敗してfalseを返したんだな。0月とか存在しないし」と思ってしまいそうになるんですが、同じコードを64bit環境で実行すると以下のようになります。

$ php -r 'var_dump(strtotime("0000-00-00 00:00:00"));'
int(-62170016400)

謎の数値が出てきました。
これが一体いつを表しているのか、さらにdate関数を掛けて確認してみます。

$ php -r 'var_dump(date("Y-m-d H:i:s", strtotime("0000-00-00 00:00:00")));'
string(20) "-0001-11-30 00:00:00"

つまり、PHPはMySQLのDATETIMEの未定義値を「マイナス1年11月30日の0時0分0秒」とみなしていることがわかります。
実はPHPでは0月が「前年の12月」を、0日が「前月の最終日」を、それぞれ表すと解釈されるので、0年の1ヶ月前の更に1日前で-1年11月30日という日付が導かれるんですね。
32bit環境でfalseが返っていたのは、日付として不正だからでも何でもなく、単に「表現できる整数値の範囲を超えていたから」という理由だったわけです。

この挙動の違いは公式ドキュメントのコメント欄にさんざん書かれているので知っている人も多いと思います。
一方、今回踏んだ挙動は発生条件がかなり限られていることと、そもそも普通はそんなことしないだろう、という辺りであまり知られていないだろう挙動です。
あ、ここまでが前振りです。長くてすみません。

Continue reading

すごいHaskell本の演習問題を公開しました(5章まで)

最近、会社で「すごいHaskellたのしく学ぼう!」の勉強会を主催しています。



内容としては週1回、1時間かけて本を読み進めつつ、例を実際に動かしたり、分かりづらい部分を自分が補足したり、気になる部分をお互い教え合ったり、といった形で進めています。
前回主催した型システム入門の勉強会はあっという間に参加者が減って頓挫したものの、今回は8回目時点で参加者がほとんど減っておらず、よい感じに続いています。

ところで、すごいHaskell本は説明順序も適切ですし、例も豊富にある良い本なのですが、勉強会を進めて不満に思うことが出てきました。
それは、自分で考えて手を動かすための演習問題が一切ないという点です。
例が豊富にあるとはいえ、プログラミングの醍醐味は「どうやって解くかを考えて、それをプログラムに落としこむ」ところにあると自分は思っています。
また、そうやって問題を解くことで記憶も定着しますし、必要な知識が身についているかの理解度チェックにもなります。

そういうわけで、社内勉強会では章が終わるごとに演習問題を解いて理解を確認してもらう、ということを行っています。(宿題というわけではなく、任意で解きたい人だけ解いてもらうような感じです)
この演習問題、もともとは社内Githubにまとめていたのですが、社外から見れないと不便であることと、特に社外秘の情報というわけでもないことから、Githubに公開することにしました。
現在勉強会が5章までしか進んでいないので、5章分までの公開です。

すごいHaskell楽しく演習!

すごいHaskell本を自習している方や勉強会をしている方、もしくは単にHaskellの問題を解いてみたい方など、ご自由に利用していただければと思います。
なお、問題作成にあたり自分で解けることは確認していますが、記述に間違いがあったり分かりづらい部分があるかもしれません。
そういった場合はメールかTwitterで@kokuyouwind宛てにリプライをいただければと思います。

問題を作るにあたり、なるべく作業的にならないよう、面白い題材を選んだつもりです。
以下では章ごとの問題について、どんな題材をテーマに何を狙って問題を作ったかの解説を書いていきたいと思います。

Continue reading

関数型プログラミングとは結局何なのか

この記事はドワンゴ Advent Calendar 2014の14日目です。
ちなみに前日は@erukitiさんでした。
他の方は「こんなもの作ってみた!」系の記事が多いのですが、技術系の話題であれば特に縛りはないようなので、今回はひたすら文章をつらつらと綴っていきたいと思います。

ここ数年、「マルチコア時代の主流は関数型だ」とか「Javaはもう古い! 時代は関数型!」といった記事をよく見かけるようになった気がします。
大学でOCamlを学んできた自分としては嬉しい限りなのですが、なんだか関数型という言葉がバズワード的な使われ方をしている気がして、まるで「現在起こっている全ての問題を解決する銀の矢だ!」といわんばかりの雰囲気を感じるのが気になっています。
最近うちの部署でもにわかに「関数型っぽく書こう」みたいな機運が高まってることもあるので、この機に関数型プログラミングとはなにか、どのような特徴があって何に向いているのか、みたいなことをまとめてみたいと思います。

Continue reading
Older posts Newer posts