C Sharpens you up

http://qiita.com/yuba に移しつつあります

LINQで組み合わせを列挙する

先週から話題のこちらのプログラミング課題

アプローチの仕方はいろいろあると思うのですが、新宿Scala座主宰のid:numanuma08氏は「Scalaだったらリストからすべての組み合わせを生成するのもcombinationsメソッドで一発だよ」といつも通りScala全力押しです*1
ところがその紹介の最後で

C#Linqとか使えばいけそうな気がします。

#新宿Scala座 で新入女子社員を救ってきた

今煽られました。
完全に煽られました。
LINQとやらで組み合わせ列挙書いてみろよほら張り子の虎とか笑わないからさと煽られました。

書いてやろーじゃねーの。

*1:組み合わせ全列挙は商品数に対してO(n^2)の時間とメモリを使うので冒頭の問題の解き方としては不利です。片割れをまず列挙してそれぞれに最適な相手を二分探索するのならO(n log(n) )でいけます。だからこの記事では新人女子プログラマ問題からは離れて組み合わせ列挙のことだけ考えています。

続きを読む

EBeanでもユニットテストの導入はスマートです。そう、Lombokならね。

Play framework 2.x Java and 1.x Advent Calendar 2013*1の6日目です。

お題は、Lombokを使ってPlay2 Javaユニットテストを書きやすくできますよという話。

*1:Advent Calendarとはクリスマスまでのカウントダウン日めくりのことで、それになぞらえて12/1から12/25まで日替わりで参加者がブログ記事を寄稿するイベントです。

続きを読む

CodeIQ×はてなの賞品をいただきました

「CodeIQの問題・パズルを考えよう」
http://partner.hatena.ne.jp/codeiq_matsuri2013_2
に調子に乗って3問ほどパズルを出したところ、佳作にあたるんですかね、CodeIQ賞に選んでいただけました。
http://codeiq.hatenablog.com/entry/2013/09/06/150247

で、このたび賞品の葉っぱが届きました。
f:id:Sampo:20130916105542j:plain
ペアですね。

組み立ててみました。でかい。
f:id:Sampo:20130916105649j:plain

でかい葉っぱはいまベッドの頭に鎮座しております。
で、これがペアで届いちゃうあたりがまたいじり方はんぱないっすねはてなさん。
もう1枚の葉っぱは、先着でご希望の方にお裾分けします。コメントかtwitterでご連絡ください。

Play2.0 - secureクッキーは設定でオンにしておきたいけど開発機ではオフにしたい場合

secureクッキーは、HTTPSを使っていない場合にはブラウザからサーバに送り返されないフラグを付けたクッキーのことです。
秘密情報をクッキーに乗せて覚えさせたのに、うっかりさんユーザーがHTTPでアクセスしてきてクッキー内容がパケット盗聴で漏れるとかもうダメダメパターンですからね。

Play! frameworkでHTTPSを使うサイトなら、application.confに

session.secure=true

の一行を加えて、セッション情報を格納するクッキーには必ずsecureフラグが付くようにしてあげましょう。

ところが問題が。
この設定があると、HTTPではログインとかまったくできなくなります。開発機の開発サーバでも。デバッグできないじゃない。

続きを読む

SQLプログラミング課題・表示順変更の実現

CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな

タイトル見ただけで苦労の記憶がよみがえってきた方はその時点で合格ってことでいいかもしれません。

INT型の主キーを持ったテーブルがあり、1行を1アイテムとして表示できます。

CREATE TABLE items (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL);

このアイテムリストの表示順を、ユーザが自由に変更できるようにしてほしいのです。

もちろん、業務アプリならば「表示優先度」なんていう整数値をユーザが設定できるようにすれば要件は達成ですが、コンシューマ向けWebアプリではそうはいきません。

ケース1

UIでは、各アイテムに「上げる」「下げる」ボタンをつけました。
「上げる」「下げる」それぞれの操作を実現するためのテーブル変更と、操作時に発行するSQL文を書き下ろしてください。

操作のパラメータとして無効なIDが渡された場合や、一番上にいるのに「上げる」を指示された場合の動作は、エラーになるか何も起こらないかなど妥当なものを定義してください。

ケース2

UIでは各アイテムのドラッグ&ドロップを可能にしました。
ドロップ時の操作を実現するためのテーブル変更、ドロップ先領域にどんな識別値を与えておくか、操作時に発行するSQL文を書き下ろしてください。

無効な指示に対してはケース1と同様、妥当な動作を定義してください。

ポイント

表示優先度にあたるカラムを作ることになりますが、それはユニーク値を格納することになると思います。
それを変更するにあたって、UPDATE文が複数行を変更するときすべて変更し終わるまでUNIQUE制約はチェックされないという点がコツになります。だから例えば値の入れ替えも一文で書けば制約に引っかかることなく実行可能です。

C#/Javaで読む、HaskellがIOモナドで実現したいこと

モナドを理解した人がまだ理解していない人になんとか理解してもらおうと書く解説記事ばかり積み上がっていくのはもはやIT系ブログ界の伝統芸ですが、この記事で少しでも貢献になるでしょうか。

この記事ではHaskell関数型言語も出て来ません。読み慣れた手続き型言語でIOモナドがどういうものか読み解いていきます。

続きを読む

コーディング課題・貸しボート屋の問題

CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな

ある湖の貸しボート屋が古いボートを処分しようとしましたが何艘残せばいいかわかりません。
貸し出しリストから、ピークのときに何艘が貸し出されていたかを求めたいです。

貸し出しリストは

貸出日時, 返却日時, ボート番号

の組になっており、貸出日時の順に並んでいます。

このリストを一回だけスキャンして(ランダムアクセスすることなく)ピーク貸出数を算出してください。(2013-08-25 制約が曖昧だったので書き直しました)
このリストからピーク貸出数を算出してください。
リストは膨大なサイズなのでメモリに収まることは期待できません。1回のシーケンシャルアクセスで解決してください(ボートの数はたかが知れているので、ボートの数に比例する程度のメモリを使うことは問題ありません)。

ただし、同一時刻に返却と貸出があった場合、それらの貸出期間は重なっていないものとします。

例えば

('2013-08-22 08:00', '2013-08-22 09:00', 5)
('2013-08-22 08:30', '2013-08-22 09:30', 6)
('2013-08-22 09:00', '2013-08-22 09:30', 7)

という貸出記録だったら2が回答です。

応用問題

貸出リストは

CREATE TABLE rental (
  rental_id INT NOT NULL PRIMARY KEY,
  starts DATETIME NOT NULL,
  ends DATETIME NOT NULL,
  boat_id INT NOT NULL
);

というRDBテーブルになっています。

ピーク数をSELECT文一本で算出してください。