a wandering wolf

Does a wandering wolf dreams of a wondering, sometimes programming sheep?

Actor ライブラリ Cricket のご紹介 #FsAdvent

この記事はF# Advent Calendar 2015の29日目の記事です。28日目は@pocketbersekerさんの「fsugjp/publicというGitter roomについて - pocketberserkerの爆走」でした。

この記事の目的

Actorライブラリ注目マンであるところの私が、F# のActorライブラリであるCricketについてご紹介します。

Cricketとは

CricketはF#製のActorライブラリです。

Cricket

F#で使えるActorライブラリはいくつかあり、標準ライブラリであるMailboxProcessor<’Msg>の他に、JVMの世界からやってきたAkka.NET、Microsoft Researchが新たに提供するOrleans などがあります。ここではそれらの比較はしませんが、それぞれに特徴のあるライブラリたちだと思います。

Cricketの特徴は、F#によるF#のためのライブラリなので、アクターをコンピュテーション式で書けるということと、あとはアクターの雰囲気がErlangの「プロセス」にように思われること、です。なお、現時点ではF# 3.0でのみ動作しているようです。

Read more...

Paketコトハジメ #FsAdvent

この記事はF# Advent Calendar 2015の14日目の記事です。13日目は@bleisさんの「あなたの知らないF#についての7つの事柄 - ぐるぐる~」でした。

この記事の目的

Paketというパッケージ依存性管理ツールで、.NET/monoのソリューションおよびプロジェクトのパッケージを管理する方法をご紹介します。

Paketとは

Paketは、F#製(ほぼF#、一部C#)のパッケージ依存性管理ツールです。

Paket

パッケージの依存性を管理する、というのは、JVM界におけるMavenをご存じの方ならすんなり入ってくるかもしれませんが、対象のソリューションやプロジェクトが、他にどのパッケージを必要とするかを管理して、インストールや更新などをよろしくやってあげる、ということです。

パッケージを取得する対象は、NugetやGitHubから引っ張ってくることはもちろん、HTTPのリソースを直接持ってくることもできます。

使い方は公式ドキュメントにも記載されているので、そちらも読んでみましょう。

Read more...

Practical Persimmon.Dried #FsAdvent

This article is the English translation of the 3rd day post from F# Advent Calendar Japan 2015. The article of the 2nd day is “使いたくない型を見えなくする #FsAdvent - 2つのアンコール (EN: Shadowing unfavorable types)” from @htid46.

I will introduce “Persimmon.Dried”, another random testing library in F#, and explain the practical way to use it.

What is Persimmon?

Persimmon is one of a testing framework written in F#; it named because the project began in Autumn and the name reminds many Japanese people the season. Persimmon has some related products to make it more useful.

Persimmon

Persimmon has some features which enables you to:

  • Write tests with computation expressions
  • Execute each tests to the end even if the test fails in any assertion
  • Write parameterized tests
  • etc
open Persimmon

let test1 = test "Sample test 1" {  // a test by the name of "Sample test 1"
    let x = 5
    do! assertPred (x * 2 = x + 2)        // fails but continue the test
    do! assertEquals (x * 3) (x + x + x)  // and assert this line
}

You can also make naming tests more simplified with opening UseTestNameByReflection module.

open Persimmon
open UseTestNameByReflection

let ``Sample test 2`` = test {  // a test by the name of "Sample test 2"
    do! assertEquals 33 4
}

Because of its usefulness, we use Persimmon with opening this module.

If you want to know more of the product, please read the official documents.

Read more...

実践 Persimmon.Dried #FsAdvent

この記事はF# Advent Calendar 2015の3日目の記事です。2日目は@htid46さんの「使いたくない型を見えなくする #FsAdvent - 2つのアンコール」でした。

冬の味覚、干し柿

秋も過ぎ去り、12月に入って冬の訪れを感じる今日このごろ、皆さまはどうお過ごしでしょうか。

冬と言えば、食べ物が美味しい季節だったりしますね。そこで本日は、先日ご紹介したランダムテスト・ライブラリである Persimmon.Dried の非公式ドキュメントと銘打って、もう少しだけ実践的な使い方を説明します。

柿とは

Persimmon (通称「柿」)というのは、F# 製のテスティング・フレームワーク、およびその周辺プロダクト群です。

Persimmon

Persimmon はコンピュテーション式でテストを書けること、アサーションが失敗してもテストを最後まで実行できること、などの特徴があります。

open Persimmon

let test1 = test "Sample test 1" {  // "Sample test 1"という名前のテストになる
    let x = 5
    do! assertPred (x * 2 = x + 2)        // 失敗するがテストは続行する
    do! assertEquals (x * 3) (x + x + x)  // このアサートも実行される
}

また、UseTestNameByReflection モジュールをオープンすることで、テスト名の書き方を簡略化できます。

open Persimmon
open UseTestNameByReflection

let ``Sample test 2`` = test {  // "Sample test 2"という名前のテストになる
    do! assertEquals 33 4
}

便利なので、基本的には UseTestNameByReflection した状態で使うことが多いです。

その他、パラメタライズド・テストや例外のテストもできます。テストの実行方法などを含め、公式ドキュメント(上記リンク)をご一読ください。

Read more...

Tinkerer を Windows / Python 3.5 環境にインストールする

故あって Tinkerer 1.5 を Python 3.5 の入った Windows 機にインストールしたんですが、めっちゃ苦労したんで備忘録代わりに残しておこうと思います。

環境

  • Windows 7 32bit SP1
  • Python 3.5.0
  • Tinkerer 1.5

lxml がインストール出来ない

pip で Tinkerer をインストールしようとして、いきなりこれにぶち当たりました。この時インストールしようとしていた Tinkerer 1.5 が pyquery 1.2.8 以上に依存していて、このパッケージが lxml 2.1 以上に依存していました。

Python 3.5 で有効な lxml は現状 3.5 という最新版があり、これを PyPI から引っ張ってくるんですが、pip はソースを落としてきます。pip がソースを落としてきた場合、プラットフォームに応じてコンパイラを探してビルドしようとするんですが、Windows だと結構うまく行きません。特定バージョンの VC++ に依存してたりして、大抵は悲しい出来事が待っています。

こことかこっちとか見たものの、どうにもビルドは成功せず、いろいろ調べた結果、lxml などの非公式 Windows 版パッケージ群があるということを知りました。

Python Extension Packages for Windows

このページの該当する .whl ファイルをダウンロードし、ローカルでインストールすることにより事なきを得ました。

追加プラグインが Python 3 で動かない

私のちんけらーブログ(ここのこと)では、Tinkerer 以外に幾つかの Sphinx 拡張が動いています。

このうち、最後の Amazon のリンクを埋め込む拡張が、どうやら Python 3.5 だと動かないようだったので、その部分だけ修正しました。

Gab-km/sphinx-amazonjp-embed - GitHub

これで tinker -b してちゃんと最後まで上手くいきました。

全然関係ないですが、私が入れてる Sphinx 拡張、@shomah4a さんの成果物めっちゃ使ってますね。足を向けて寝られません。

おわりに

この他、’html_add_permalinks’が None を返してくるとか、バージョンが上がったためと思われるワーニングが出てくるようになりましたが、とりあえずは動いているようです。

Persimmon.Dried で性質をチェックする

性質をチェックする

プログラムをテストするときに、アサーションで特定の値を使ってテストを書いていると、「このプログラムがある性質を満たしていることを確かめたいな」という思いを上手く表現できないことがあります。それは、「ある性質を満たす」というのを広範囲の入力に対して確かめたくなるからだったりします。(※当社調べ)

2、3の入力に対してであれば、直接そういうテストを書いたり、パラメタライズされたテストを使って書いたりできます。しかし、「x > 0 である int に対して」とかだとどうでしょう。同値分割とかを用いて効率的にテストを書く事はできると思いますが、そもそもそういうことを言いたいんじゃないよね、とか。「x > 0 である任意の int に対してテストしたい」はずなのです。

そういうシチュエーションに対して、いわゆる QuickCheck が効果を発揮します。(あえて「証明」と言わないところは察してください)

Read more...

Persimmon でテストを書く

さて、昨日の記事 でご紹介した Funcy は、そのテストにちょっと変わったフレームワークを使っています。

persimmon-projects/Persimmon - Github

こちらの Persimmon(通称「柿」)、以前記事にした F# 製テスティング・フレームワークです。

Read more...

Funcy というライブラリの話

こんにちは。あなたの localhost、ガブさんです。

ここ最近、こんなライブラリを書いていました。

Gab-km/Funcy - GitHub

どんなライブラリかと言いますと、.NET なクラス用に Maybe や Either 型を提供していたり、モノホンより劣りますがパターンマッチ的な制御フローをクラス群で提供していたりします。

対象ユーザー

私のような、 頭のおかしい 関数型チックなあれこれを使いたいけど、お仕事では C# や VB を使わないといけないのよん、という方が少しだけ幸せになれるかもしれないライブラリを目指しました。(少なくとも私は、自分の書いたギョーム系ツールで利用しています)

なお、ピュアな .NET 製ライブラリなので F# から利用することも可能ですが、正直 F# 自身の機能を使ったほうが何倍も便利です。

Why interface?

このライブラリですが、下記のような指摘を頂いていますように、インターフェイス重視の設計方針をとっております。

これ、もちろん意図的にそうしておりまして、例えば Maybe なら「コレコレこういうシグネチャのものを提供していれば、Maybe とみなすよ」ということをやっていて、何か Maybe っぽく動くけど別の性質も持ち合わせているものを定義することも許しています。

きっかけは、Maybe や Either が IDisposable を実装して、using (Java の方だと try-resource かな?)で便利にできないかな?というところから、普通の Maybe/Either とは別に DisposableMaybe/DisposableEither を実装していたことにあります。

これを書く過程で「Maybe/Either っぽく動け」という意図を表す必要があったため、インターフェイス志向なライブラリになっていきました。今はもう Disposable な何かは提供していませんが、過去のコミットの残骸が残っています。

実際、書いていっているうちに、インターフェイスをベースにして設計していった方がどんどん都合が良くなっていったため、このように推し進めた形になっていますね。

ご自由にどうぞ

ご利用いただくのはもちろんのこと、あれこれ議論の俎上にあげていただくのも面白いですし、またプルリクやら何やらも興味があったらどんどんやっていただきたい感じです。すでに、どこかのファンクショナルぺんぎんがコントリビューターに名を連ねている現状があります。

もし興味を持たれた方がいましたら、ご自由に遊んであげてください。

FsCheck と ScalaCheck とを見比べる

これは F# Advent Calendar 2014 31日目の記事です…えっ、アドベントカレンダーってクリs(ry

ちなみに前日は @zecl さんの『F# Build Tools for Unity(ゲームのやつ) - UniFSharpのご紹介』でした。

Read more...