Microsoft MVP for .NET を受賞しました

2015年1月からC#, VB.NET, F#の枠が統合され「.NET」となっていたので、正確には再受賞です。

.NETに関してはこれからもF#に偏ったことしかしない可能性が高いですが、何かしら成果を残せたらいいな…と思っております。

あと、せっかく東京にきたのでF#で定期的にドンチャン騒ぎしたいです。

入社経緯など

先日記載した通り、株式会社ドワンゴに入社しました。 ただ、前記事では入社までの経緯を書いていなかったので、本記事にてまとめておきます。

きっかけとか

前職は誘われる形での転職だったので、今回はWebページからの応募でやってみようと考えました。 ただ、一から探すのは時間がかかるので、ひとまずScalaMatsuriのスポンサー求人情報から、以下の条件で探してみることにしました。

  • 東京勤務
  • Scala以外の言語も詳しそうな人がいそう
  • 出社が10時以降
  • 私の経歴で書類審査を通過できそう

スポンサー求人情報が公開されていて当日に話を聞けるイベント、イベント当日時点では転職するつもりがなかったとしても便利ですね。

あとはWebページから応募して色々あって今に至ります。

やること?

多くの方から「Scalaですかー」という反応をいただいたのですが…正解ではない、という感じでしょうか。 そう思っていた方々、なかなか言い出せずすみませんでした。 Scalaを使う可能性もありますが、「Scalaがやりたい!」と強く希望したわけではないのでどうなることやら。

これに関しては「Scalaも確かに仕事で使ってみたいけど、他の言語も面白そうだし…明らかに向いてなさそうな言語でなければ」とかそういう感じです。 あとはカオスっぷりを楽しみたいとか?

FSharpどうするの?

当分は趣味で触り続ける予定です。 というかPersimmonシリーズをなんとかしなければ…。

まとめ

ScalaMatsuriもきっかけの一つだったよ、というのが書きたかっただけだったり…。

あとは最後に例の文章でも書いておこうかと思いましたが、やっぱりやめておきます。

退職のご報告

3月31日に、某社を退職することになりました。 本日が最終出社日で、来週から有給消化期間です。

忙しい人のための3行まとめ

現職は良い環境だと思う

でも東京遠いから

移住する

お前誰よ?

2013年11月中旬から、愛知県のとある会社で C# や F# を使った開発に携わっていました。

そういえば社会人になってから今月で丸2年。

退職理由

現職が良い環境だという感想は今でも変わりません。 ではなぜ退職という行動に至ったのかというと、「東京が遠いと感じた」ためです。

昨年のとあるタイミングからわりと東京へ足を運ぶ機会が増えました。 その際、宿探し、電車の時間調整、時間を潰す場所確保etc...がそろそろつらくなってきたな、と。

あとは

  • 個人的に朝がつらい
  • スーツを毎日着たい性分ではない

という気持ちがないわけではなかったというやつです。

現職で得たもの?

色々ありますが、

  • F# を仕事で使った
  • コンピュテーション式のあれそれ
  • Persimmonシリーズ

などは間違いなく現職にいたからこそでしょう。

てきとーなQ&A

現職の不満とかは?

多少はあったはずですが、やめると決めた途端に忘れました。 オフラインで会話したら思い出せるかもしれないので、ご飯に誘ってください。

次どうするの?

4月1日から東京で働く予定です。 社名は現段階で言っていいのかわからないので、伏せておきます。

ちなみにフォークリフトとか重機系ではないです。

早くない?

新卒8か月半、現職1年4か月半が早いと思うなら、早いのでしょう。

愛知の思い出

第1回TDDBC名古屋が5年前弱という事実に驚きを隠せない…。

もみあげは?

次の職場ではもみあげマンとして活動したい…厳しいか?

ここから追記

次の会社はドワンゴです。 経緯に関しては別記事で書こうと思っています。

そして例のリストはこちら

HaskellのlogictをScalaに移植してみた

Haskell に logict というライブラリがあります。

logict: A backtracking logic-programming monad. | Hackage

MonadLogicやLogicTが何者なのかはそのうち解説記事を書くとして、今回はこのライブラリをScalaに移植してみました。

pocketberserker/scala-logic · GitHub

そのうちファーストリリースを出す予定です。

このライブラリを作ったのは、smallcheckをscalaで実装してみたいと思ってコードをみたらLogicTが必要だとわかったためです。

Haskellのlogictとの違い

若干ですが差異があります。

  • 型パラメータの順序
  • 引数の順序
  • logic関数は未実装(RankNTypesに阻まれた)
  • いくつか制約を緩めている

制約を緩めているというのは、例えばMonadPlusではなくApplicativePlusでよい、とかですね。

これに関しては私もpull requestをもらうまで気がついていなかったのですが、確かに緩められるものは緩めてもよいですね。

functional dependenciesについて

LogicTのMonadReaderインスタンス実装は@xuwei_kさん、@halcat0x15aさん、@gakuzzzzさんに手伝ってもらいました、ありがとうございます*1

functional dependenciesをScalaで実現できるのか自体知らなかったので、とても助かりました。 みなさんScala函数型なことでわからないことがあったら以下のgitter部屋に突撃するといいと思います。

scalajp/functional - Gitter

なぜScalaz?

某猫kitsの利用も考えたのですが、まだリリースされていなかったり今回の実装に必要そうな機能がなかったりしたので見送りました。 あとはまぁ、Scalazを長らく触っていなかったのでリハビリしたかったとか(某本もでることですし)。

Scalazは長い間開発が続いているだけあって機能が充実していて良いですね。 そういう意味では当分使われ続けるのではないでしょうか。

まとめ

小さいライブラリですがscalazの機能を色々と使っているので、ちょっとした勉強にはなるかもしれません。

*1:よく考えたら全員去年のScalaz勉強会の発表者だ

AppVeyorのSQL ServerにJDBC Driverで接続する

備忘録です。 簡単な経緯は以下の通り。

rpscala でそういう話題があったのに関連して、 AppVeyor で頑張れないかを xuwei さんのコードを引き継いで試してみました。

参考資料

だいたいこの辺りを情報を AppVeyor で実行できるようにしていきます。

設定やスクリプト

説明が面倒なので結論だけはります。 設定値やプロジェクト名もそのままになっているので、適宜読み替えてください。 また、今回の内容と直接関係のない部分は削っています。

あと、sbtはリポジトリに同梱しているパターンで試しているので、同梱したくない場合はsbtをダウンロードする必要もあります。

# appveyor.yml
services: mssql2014
build_script:
- netsh advfirewall firewall add rule name="jdbc driver for sql server udp" dir=in action=allow protocol=UDP localport=1434
- sc config sqlbrowser start= auto
- net start sqlbrowser
- ps: Set-ExecutionPolicy RemoteSigned
- ps: .\Setting-SqlServer.ps1
- net stop "SQL Server (SQL2014)"
- net start "SQL Server (SQL2014)"
- netsh advfirewall firewall add rule name="jdbc driver for sql server tcp" dir=in action=allow protocol=TCP localport=1433
- sqlcmd -S ".\SQL2014" -U sa -P Password12! -Q "create database scalikejdbc;"
- del scalikejdbc-core\src\test\resources\jdbc.properties
- move scalikejdbc-core\src\test\resources\jdbc_sqlserver.properties scalikejdbc-core\src\test\resources\jdbc.properties
- ps: wget http://download.microsoft.com/download/0/2/A/02AAE597-3865-456C-AE7F-613F99F850A8/sqljdbc_4.1.5605.100_enu.tar.gz -OutFile "sqljdbc.tar.gz"
- 7z x -y -oC:\projects\scalikejdbc\ sqljdbc.tar.gz
- 7z x -y -oC:\projects\scalikejdbc\ sqljdbc.tar
- ps: mkdir .\scalikejdbc-core\lib
- ps: cp .\sqljdbc_4.1\enu\sqljdbc41.jar .\scalikejdbc-core\lib\
// Setting-SqlServer.ps1

// バージョンに合わせて ComputerManagementの値を差し替える
// SQL Server 2008 -> ComputerManagement10
// SQL Server 2012 -> ComputerManagement11
Get-WmiObject -Namespace root\Microsoft\SqlServer\ComputerManagement12 -Class ServerNetworkProtocol |
  Where-Object {$_.InstanceName -eq 'SQL2014' -and $_.ProtocolName -eq 'Tcp'} |
  ForEach-Object {$_.SetEnable()}

$tcpProperties =
  Get-WmiObject -Namespace root\Microsoft\SqlServer\ComputerManagement12 -Class ServerNetworkProtocolProperty |
    Where-Object {$_.InstanceName -eq 'SQL2014' -and $_.ProtocolName -eq 'Tcp' -and $_.IPAddressName -eq 'IPAll'}

foreach( $tcpProperty in $tcpProperties ){
  $requestedValue = ""
  if($tcpProperty.PropertyName -eq "TcpPort"){
    $requestedValue = "1433"
  }
  $tcpProperty.SetStringValue($requestedValue)
}

SQL Server 2014 Espressで試していますが、たぶん SQL Server 2008あたりまでは普通に動きそうな気がします。

重要なところ?

SQLServer用のjarを同梱するのはライセンス的につらい感じがしたので、PowerShell 3.0から使える wget エイリアスコマンドを使ってダウンロードし、AppVeyor にインストールされている 7Zip で解凍するのがミソです。

あと、各種設定をして再起動する前にデータベースを作成してもログイン権限がなくてテーブルにアクセスできないかも?

まとめ

今回はsbtで作業しましたが、gradleでもできるのではないでしょうか。

懸念事項は、AppVeyorの実行速度が遅いことと、mysqlやpotgresql前提で書かれたSQLSQL Serverで通らないことがまれによくあることです。

scalacheckの内部構造をいじって遊んでみた

SPECIAL DAY Scala Hack-a-son 143th in KABUKIZA - Scala Meetup Group in Tokyo | Doorkeeper

たまにはハッカソンもいいかなと思って参加してみました(噂の rpscala に参加してみたかったというのもある)。

で、当日は scalacheck をいじっていたコードがようやくテストに通るようになったので書き残しておきます。

注意事項

この記事のコードは pull request を送るつもりはないので、そのことを認識して読んでください。

今のところ scalacheck を fork して別プロジェクトとして育てるつもりもないです。

やりたかったこと

基本方針は "いらないものを消す" です。

  1. scalajs の クロスコンパイル設定を有効にする
  2. Gen で Option[T] ではなく T を返すようにする
  3. 内部表現 R trait を削除する
  4. scalaz で置き換えられそうなコードを置き換える
  5. ランダムを rng か spire/random に差し替える

現時点でできたのは R を消すまでです。

ロスコンパイル設定

https://github.com/pocketberserker/scalacheck/commit/c7c47204c7245d1a9830aca79b8550b9e63052fc

2015/02/12 時点の scalacheck の master ブランチは Windows 上ではそのままだとビルドできません。 クロスコンパイルのためのコード共有を、Windows で認識できないシンボリックリンクで行っているためです*1

対処法は sbt-scalajs の要求にあわせてディレクトリ構成変えたり設定変更した程度です。

これに関してはハッカソンの数日前に作業してました。

Gen で T を返す & R trait を削除する

https://github.com/pocketberserker/scalacheck/commit/6d03207ceee9caf6a9e7ad2cb518c532372bd826

quickcheck 系でデータの生成に失敗することはそうそうないので、 Option を返さないようにしました。

…が、ここで suchThat メソッドの実装でスタックオーバーフローしたり無限ループに陥ったりして、全然進まず。 結局当日の進捗は駄目でした。

後日、よく考えたら一部実装の変更に伴い suchThat を呼び出すべきではない部分を発見したので、これを削除したら動くようになりました。

R trait は Gen 用のラベルや sieve を持っているのですが、これもいらないだろうということで削除。

リファクタリングみたいなこと

https://github.com/pocketberserker/scalacheck/commit/e923d97a2ddfeb9b158bcb9524ce4ca844b7eb32

scala.util.Random から別のものに差し替えたいな、と思って依存関係だけ設定したのですが、作業できずじまい…。

Arbitrary 削除断念

CoArbitrary を自前実装してしまったので、消すのも変だなと思い残してます。

その他

値が生成できるまでがんばってしまうので、多少実行速度が劣化したような感覚… filtersuchThat のご利用は計画的に。

まとめ

rpscala は懇親会も含め楽しかったです。

*1:Windows にもシンボリックリンク自体は存在した気がする

scalacheckのcommandsパッケージをPersimmon.Driedに移植

ちったーを眺めていたら

というつぶやきが見え、そういえば干し柿にはまだ移植してなかったなーと気が付いたので、休日を使って実装してみました。

参考資料

http://scalacheck.org/files/scaladays2014/#1

これ読めばわかるはず。

干し柿での実装

https://github.com/persimmon-projects/Persimmon.Dried/blob/6904f9bca60647ef26a51fe5d9b150be55f90e31/src/Persimmon.Dried/Commands.fs

他に方法が思いつかなかったので、クラスベースの実装になっています。

あと、Scala

trait Command {

  ...

  type Result

  ...

のような芸当はできないので、型パラメータで代用してます。 で、これと StructuredFormatDisplay 属性がオブジェクト式に対して働いてくれない(?)影響で BoxedCommad という残念な型が一つできたわけです…。

実行速度は今のところ遅いです。 一部さぼっているところ*1を修正したら少しはマシになるかもしれませんが、体感はそんなにかわないのではないでしょうか。

Redis のサンプルはそのうち移植したいところですね。

おわりに

機能は充実してきた干し柿さん、いったいどこへ向かうやら…まぁ、その前に Arbitrary インスタンスを増やさないといけないのですががが。

あと Persimmon 本体の進捗はありません、すみません…orz

*1:主にList.revして~してList.revする、というさぼり