2015年簡易振り返り

書いておかないと忘れるけどもう時間がないので簡易版。

生活

  • F# MVPから.NET MVPになった
    • MVPらしい活動をしていたかどうかは微妙なところだが、なんかやってはいた気がする
  • 転職した
    • 転職の際にScalaMatsuriの情報を使わせてもらったお礼にと思ってインタビューを受けたが、インタビューを受けるのはこれが初だったのでわりと緊張した
    • やはり東京にいると便利だなと思うことが多い
    • しかし地元九州からさらに遠ざかってしまった…移動が面倒だったので今年は帰省していない
  • 生活時間が順調に狂った
    • ただし、転職以前に感じていた寝起きのつらさ的なストレスが消えたのでこれはこれで良かったのかもしれない
  • 年末になってようやく引っ越し貧乏から脱出しつつある
  • ゲームはコンスタントに買って消化していた気がする
    • 去年からの積みゲーがそのままになっている問題…
  • なんだかんだひと月一記事以上ブログ書いてたらしい

言語

  • F#: ほぼプライベートオンリーだけどなぜかわりと触ってた
  • Scala: ほぼプライベートオンリーだけど(ry
  • TypeScript: 諸事情で手を出した
  • Elixir: 諸事情で手を出した
  • Erlang: ちょっとだけ書いたけど思った以上に書かなかった
  • SML#: なぜか一時期書いてた
  • C++: 諸事情で書いた
  • Rust: nomを触るためにちょっと学んだ
  • Haskell: 読む力は上がったが一切書いた記憶がない

Rustを本腰入れてやりたい気もしつつ、Idrisに挑戦したい気もしつつ、Coqから目を背けないほうがいいのか…色々考えても結局なるようにしかならないので考えるのをやめよう。 来年のことは来年の私が頑張ってくれるはずだ。

ライブラリは産廃なものと形になったもので半々といったところ。 まぁ、使うことを目的としていないのでこんなものではないだろうか。

イベントとか

会社のセミナールームが使えることに味を占めて色々開催したりお手伝いしていた気がする。

  • Lens & Prism
  • F#談話室(これは一回会場手配しただけだけど
  • 関数型Scalaの集い
  • 関数プログラミング交流会
  • Testing Framework Meeting
  • 関数型ストリーム処理勉強会(これは相談を受けて開催したやつ)
  • Oleg勉強会

個人的には、知らないことが何か知れたという点で非常に満足度の高いものだった。

あと、なんだかんだで発表していたようだ。

ペースは落ちるかもしれないが、何回かは発表したいところだ。

.NET系の勉強会に顔を出したいと思いつつなかなか足を運べていないのでなんとかしたい。

締め

気の向くままに。

お前もnullにしてやろうか! #FsAdvent

この記事はF# Advent Calendar 2015の31日目の記事です。

ガス欠なので役に立たないネタでお茶を濁します。

Noneはnullと解釈できる

F#erの皆様はたいていprintf "%A" Noneを実行して<null>と表示されることに落胆したことがあるのではないでしょうか。 私は落胆しました。

同じようなことをやってみる

[<CompilationRepresentation(CompilationRepresentationFlags.UseNullAsTrueValue)>]
type A<'T> = B | C of 'T
with
  [<CompilationRepresentation(CompilationRepresentationFlags.Instance)>]
  member this.Value = match this with | C a -> a | B -> failwith "oops!

CompilationRepresentationFlags.UseNullAsTrueValueを指定することで、引数をとらない識別子をnullとして表現可能になります。 こいつを付けた状態でメンバーにCompilationRepresentationFlags.Instanceを付けなかったら、そのメンバーは静的にコンパイルされます。

使いどころは?

  1. .NETが絡む
  2. その判別共用体の中で引数をとらない識別子が一つのみ
  3. nullにしてもよいと思った場合

これがそろったら使うか…? くらいの認識です。 ぶっちゃけ使うことはないだろうと思っています。

気を付けるべきとき

自分は使わないとはいえ、どのライブラリも使わないということは言えないので、対処してあげる必要があったりします。

ぱっと思いつく罠にはまるパターンはPretty Printerですね。

あとは box したときにやらかしそうとかですかね。

結論

使うな。だが注意せよ。

追記

こうしてnullに表現可能になった識別子は、コンパイルしたらUnchecked.defaultofでnullではなく代わりにunion caseのほうが使われるみたいですね。 F# Interactiveではnullが返ってきたので、コンパイラが色々やっている模様。

GitBookを出力するためのFAKE拡張の試作品を作った #FsAdvent

この記事はF# Advent Calendar 2015の30日目の記事です。

最近はやりのあの子

最近GitBookが流行っぽいですね。

GitbookIO/gitbook · GitHub

そんでもって、Scala界隈では下記リポジトリのようにtut + GitBookでいい感じにコンパイルチェックもできるような感じのようです。

xuwei-k/gitbook-sample · GitHub

これ、F# でもやりたいですね?

そして F# 界隈には FAKE と FSharp.Formatting がありますね?

よろしい、ならば連携だ。

FAKE.GitBook

pocketberserker/FAKE.GitBook · GitHub

FSharp.FormattingにはMarkdown出力がない*1ので、GitBook用のMarkdownを出力するようにします……と言えればかっこよかったのですが、まだ試作品なのでそこまでちゃんと動きません。

あと、現時点で既にわりと力尽きかけているので、本格的に使い方がコントリビューションお願いします…。

使い方

GitBookとの連携が前提になっているので、package.jsonbook.jsonが必要です。

あとは FAKE と FAKE.GitBook をロードして以下のようにスクリプトを書きます。

open Fake

Target "GenerateBook" (fun _ ->
  GitBook id (fun p -> { p with SrcDir = currentDirectory @@ "doc" }) Html
)

RunTargetOrDefault "GenerateBook"

pdfやepubを出力したいなら、Htmlの部分をPdfやEPubにすればいいです。

終わりに

以上、年末恒例の進捗帳尻合わせ回でした。

*1:Markdown、方言すぎだからあっても困る

fsugjp/publicというGitter roomについて #FsAdvent

この記事はF# Advent Calendar 2015の28日目の記事です。

gitter.im

本日はfsugjp/publicというGitter roomについて書きます。 前にも書いたけど、もうちょっと詳しく。

どういう場所なのか

roomの説明部分には下記のように書かれています。

F#関連についてゆるふわ会話する場所です。初心者の質問も歓迎。

もうちょっと具体的(?)なことを書くと、

  • 誰かが疑問を書き、誰かが答える(ヒントを出す)か一緒に悩む
  • ライブラリやコンパイラ、VS拡張のissueを引っ張ってきて紹介する
  • 雑談

質問に対するレスポンスはわりと早いですし、様々なジャンルの方がいらっしゃるので勉強になります。

これを機会に、ぜひroomで F# のことを尋ねてみてください。

F# 4.0で入った地味だけど嬉しい機能紹介 #FsAdvent

この記事はF# Advent Calendar 2015の26日目の記事です。

通常のアドベントカレンダーは25日までですが、F# 界隈では英語版が31日まで続けているのにあわせて31日くらいまでやるっぽいです。

4.0の変更一覧

下記のページを見るのがてっとり早いです。

F# 4.0 Status · Microsoft/visualfsharp Wiki · GitHub

重めの機能でデザインとか背景とかを知りたい場合は以下。

fsharp/FSharpLangDesign · GitHub

こっちはvNextの草案も含めるみたいですね。

地味だけどうれしい機能紹介

F# 4.0はF# 3.0の時と比べると地味に見える変更が多い印象ですが、着実に改善されています。 というわけで、今回は私が地味にうれしいと思った機能を簡単に紹介していきます。

nthが非推奨になりitemが追加

ListやSeqモジュールにはnth関数がありましたが非推奨になり、代わりにitem関数が追加されました。

nthにはListとSeqで引数の順序が異なる(Listのほうがパイプライン演算子に優しくない引数順序だった)という問題がありましたが、無事統一できるようになった形です。

F# 4.0でnthを使うと警告がでます。 VS 2015を使っているとnthはインテリセンスで一覧に現れないので注意しましょう。

units of measureが型変換なしでprintfできるようになった

このページの例を見ればどういう挙動なのか一目でわかります。

クラスのオブジェクト生成を関数のように扱える

xs |> List.map Uri

こういうコードが書けるようになりました。

StructuredFormatDisplayAttributeで複数のプロパティを利用できる

以下のように書けるようになりました。

[<StructuredFormatDisplay("My name is {First} {Last}")>]
type Person = {
  First: string
  Last: string
}

今までであれば、別のプロパティをわざわざ(型よってはこれだけのために)追加しなければならなかったので、楽になりますね。

isNull関数の追加

.NETライブラリをラップするときになんだかんだお世話になりそうです。 あとstringでもお世話になってます。

終わりに

ところで、色々なライブラリはいつのタイミングで4.0に移行するのでしょうかね…?

TypeProviderでコンピュテーション式用の型を生成してみた #FsAdvent

この記事はF# Advent Calendar 2015の25日目の記事です。

TypeProviderを使う

今までチュートリアルくらいしかTypeProviderは作ったことはなかったのですが、ようやく重い腰をあげて使うことにしました。

型プロバイダー(TypeProvider)のちょっとしたアレコレ - Bug Catharsis

ぜくるお兄さんの記事、とても参考になるので何回も読み直してます。

コンピュテーション式とTypeProvider

コンピュテーション式のビルダーは単なる型なので、TypeProviderの対象にできますね?

というわけで今回は、以下のことをやってみようということに。

これ一年半くらい前の発言なのですね…。

結論

できなくはないけど、できることが限られていてつらいorz

https://github.com/pocketberserker/ComputationExpressions/tree/56f5f9dee7ecfaf77fd11cb79c6532727232427a

このリポジトリのコードを読んでいただけるとわかると思うのですが、Generic MethodがTypeProviderで生成できない関係で単一の型でしかbindできなかったり、その関係でdo!が使えなかったりと、少なくともMonadTypeProviderみたいな汎用的なものは厳しい印象です。

逆に考えると、ジェネリックさえからませなければわりとやりたい放題できるということがわかったので、なんか色々と模索したいところです。

当分はカスタムオペレータの方向で模索してみます。

最近使っているScalaのライブラリ

これは Scala Advent Calendar 2015(アドベンター版) の4日目です。

3日目は、xuweiさんの ScalaからScalaPBというsbt plugin使ってProtocol Bufferを使う方法についてのドキュメントを書いている でした。 Protocol Buffer使ってみようかな…。

言い訳フェーズ

scalajp/publicというGitterのチャンネルで参加者を募っていたので軽い気持ちで参加したものの、ついこの間ネタを放出したばかりだったので思いつかなかった。

苦し紛れ…。

紹介フェーズ

注意事項は以下となります。

  • この記事を書いた存在はScalaを普段使いしているわけではない
  • 自作ライブラリは除外

Scalaz

  • 前提
  • 特に猫に移行する理由がないのでこっちを使っている

Shapeless

  • 他のライブラリとともに勝手についてくることが多い
  • 最近ようやく使い方がわかってきた、かもしれない
  • Scala.jsをサポートしている

scalaprops

  • 便利

scalacheck

  • scalapropsがリリースされる以前に作ったものはこっちでチェックしているので現役
  • Scala.jsをサポートしている

scalatest

  • 最近はscalapropsで完結するものばかり書いているのでなんともいえない
  • DiagrammedAssertions(power assert)は使いどころによっては便利

httpz

  • べんきょーとか思って使っていたら慣れた
  • 慣れると便利…かもしれない?

http4s

  • 実装を読んでみるとなるほどなーという気分になる
  • 最近は破壊的変更が以前よりも減った気がする
  • 猫に移行するのか見守る
  • プロジェクト頓挫しないよね…?

blaze

  • http4sのついでに使っている
  • なんとなく使っているだけで特に理由があるわけでもない

構文解析

  • その時々で気になったものを使っている

Argonaut

  • httpzがこれに依存しているのでこっちを使っている

twirl

  • まぁ、こっちでいいかなって

doobie

  • 学ぶ目的

scodec-bits

  • バイナリ操作はこれ以外の方法はあまり知らなかったりする…

scodec

gatling系

  • 代替がない?

まとめ

  • 仕事でないなら好みで選べば良いと思います
  • 仕事なら周りにあわせそう
    • なおこの記事を書いている時点でScalaを仕事で使ったことはない