a wandering wolf http://gab-km.bitbucket.org/blog/html/ Does a wandering wolf dreams of a wondering, sometimes programming sheep? en-us Wed, 02 May 2018 00:00:00 +0900 http://gab-km.bitbucket.org/blog/html/2018/05/02/assert_throws_for_mstest.html http://gab-km.bitbucket.org/blog/html/2018/05/02/assert_throws_for_mstest.html <![CDATA[MSTest のための Assert.Throws]]> MSTest のための Assert.Throws

まさか、1年以上投稿していなかったとは…。

さて、MSTest を使っていると、例外が発生したかのチェックには ExpectedExceptionAttribute ぐらいしか使えないの、不便ですよね?

不便でない方がいらっしゃいましたら、この記事は面白みがないので他の記事を探されるとよいかと思います。

Read more...

]]>
Wed, 02 May 2018 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/09/01/treat_option_value_with_idisposable.html http://gab-km.bitbucket.org/blog/html/2016/09/01/treat_option_value_with_idisposable.html <![CDATA[IDisposable な Option 値を扱う]]> IDisposable な Option 値を扱う

昨夜、こんな話題がありました。

それに対する反応がこちら。

このあたりをさらっと見ていこうと思ったのが、今回のトピックです。

Read more...

]]>
Thu, 01 Sep 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/08/23/avoid_null_of_propertychangedeventhandler.html http://gab-km.bitbucket.org/blog/html/2016/08/23/avoid_null_of_propertychangedeventhandler.html <![CDATA[PropertyChangedEventHandlerのnullを避ける]]> PropertyChangedEventHandlerのnullを避ける

最近はWPFアプリを書いているので、そのあたりの備忘録を書き残してみます。

Read more...

]]>
Tue, 23 Aug 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/06/15/convert_integer_endian_from_little_to_big_in_c.html http://gab-km.bitbucket.org/blog/html/2016/06/15/convert_integer_endian_from_little_to_big_in_c.html <![CDATA[整数をビッグエンディアンのバイト配列に変換する]]> 整数をビッグエンディアンのバイト配列に変換する

お仕事でC言語を触ることになりまして、日々あくせくしております。他の言語なら便利なライブラリがあるところ、C言語だと「さぁ、頑張ってみよう」みたいな感じで、自力でやらなくちゃいけないので、私のような温室育ちマンには大変ですね。

ちょうど本タイトルのようなことをやる場面に遭遇したので、備忘録がてら書き残します。

Read more...

]]>
Wed, 15 Jun 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/05/27/failed_with_exit_code_8_in_d_language.html http://gab-km.bitbucket.org/blog/html/2016/05/27/failed_with_exit_code_8_in_d_language.html <![CDATA[D言語のプログラムがリターンコード -8 で落ちる]]> D言語のプログラムがリターンコード -8 で落ちる

はじめに

3年ぶりくらいにD言語の記事を書きます。

最近、とあるD言語のプロダクトを書いております。昨夜、新しいコミットをGitHubにプッシュしたところ、連携させているTravis-CIがテストプログラムを実行しようとして、謎のエラーを吐いて落ちました。

Job #7.1 - Gab-km/darjeeling - Travis CI

手元の環境(Windows 7/32bit/DMD 2.071.0)で動かしたときは問題ありませんでした。 Program exited with code -8 などと言われましても、果たしてこれが意味するところはいったい何なんでしょうか?

Read more...

]]>
Fri, 27 May 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/05/06/handle_both_of_success_and_failure_in_persimmon_tests.html http://gab-km.bitbucket.org/blog/html/2016/05/06/handle_both_of_success_and_failure_in_persimmon_tests.html <![CDATA[Persimmon のテストで成功と失敗の両方を扱う]]> Persimmon のテストで成功と失敗の両方を扱う

前書き

Persimmon では普通のテストだけでなく、いわゆるパラメタライズド・テストを書くことも出来ます。パラメタライズド・テストは皆さんご存じの通り、パラメータをテストの外から渡すことにより、1つのテストで複数のテストケースに対応することが出来ます。

let ``your nice test`` =
    let parameterizedTest(input, expected) = test {
        let actual = fut input   (* fut はテスト対象の関数 *)
        assertEquals expected actual
    }
    parameterize {
        case ("F#!F#!", true)   (* ここのタプルが、下でrunしているテスト関数の引数になる *)
        case ("Fortlan", false)
        run parameterizedTest
    }

たいていのケースでは問題にならないんですが、あるパラメータでは例外が発生してほしい、というようなニーズ(そういう設計が良いかどうか、は今回議論しません)がある場合もあります。Persimmon では trap コンピュテーション式でテスト対象が投げた例外を取得することが出来ます。しかし、別のパラメータでは例外が発生しないようなテストケースを用意していた場合、テスト対象が例外を投げないとテスト失敗になってしまいます。

Read more...

]]>
Fri, 06 May 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/04/12/set_custom_credentials_for_using_powershell.html http://gab-km.bitbucket.org/blog/html/2016/04/12/set_custom_credentials_for_using_powershell.html <![CDATA[PowerShell で使う認証情報を設定する]]> PowerShell で使う認証情報を設定する

自由なインターネットを謳歌出来ない方向けの記事です。具体的には、認証付きプロキシの内側からインターネットの大海原に漕ぎ出さなければならない方(私を含む)用の記事となります。

PowerShell を使う上で、System.Net.WebClient などを使うことはよくあると思います。しかし、プロキシの壁があると、以前書いたこの記事のように、System.Net.WebProxy などを用意する必要があります。

毎回こんなことをやるのは手間ですし、第一 Invoke-Expression などで Web 上のスクリプトをダウンロードして実行しようとすると、スクリプト上の WebClient がプロキシを持ってなくて407が返ってくるというケースもよくあります。

じゃあどうするかというと、あらかじめデフォルトの認証情報を設定しておけば良いのです。

Read more...

]]>
Tue, 12 Apr 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/04/11/using_function_in_csharp.html http://gab-km.bitbucket.org/blog/html/2016/04/11/using_function_in_csharp.html <![CDATA[C# での Using 関数]]> C# での Using 関数

C# でファイルなどのリソースを上手く管理するには、皆さんもちろん using 句(VB であれば Using 句ですね)を使うことだろうと思います:

using (var sr = new System.IO.StreamReader("hoge.txt"))
{
    // StreamReaderインスタンスを使って何かする
    DoSomethingWith(sr);
}

同じ.NET言語で、F# でも同じようなことが出来て、例えば use 束縛があります:

use sr = new System.IO.StreamReader("hoge.txt")
// StreamReaderインスタンスを使って何かする
DoSomethingWith sr

一方、F# では using 関数というのもあって、こちらも同じような用途に使うことが出来ます:

using (System.IO.StreamReader("hoge.txt")) DoSomethingWith

ほとんどの C# ユーザーは現状で問題ないと思いますが、ごく一部の C#er (私を含む)には欲しい機能かもしれません。

Read more...

]]>
Mon, 11 Apr 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/04/07/define_my_assertseqequals.html http://gab-km.bitbucket.org/blog/html/2016/04/07/define_my_assertseqequals.html <![CDATA[自前で assertSeqEquals を定義する]]> 自前で assertSeqEquals を定義する

まえがき

全世界1,600(万…ではない)人の Persimmon ユーザの皆さん、こんばんは。

Persimmon 2.0に向けた開発が(僕以外の人で)進められています。そこにおそらく入るであろう機能に、 assertSeqEquals があります。何故これが必要かというと、今の Persimmon は seq<'T> 型の値同士をアサートすると上手くいかないという問題があります。seq<'T> 型の値を使うことは少なくないので、アサートできて欲しいです。

seq同士を比較したい · Issue #73 · persimmon-projects/Persimmon

assertSeqEquals が導入されるのを待つという選択肢もありますが、私はよくこの issue にぶち当たってしまうので、出来れば今すぐ解決したい。その場合はというと、自前で assertSeqEquals を実装する、という手段をとることになります。

Read more...

]]>
Thu, 07 Apr 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2016/03/14/persimmon_camp_in_2016_spring.html http://gab-km.bitbucket.org/blog/html/2016/03/14/persimmon_camp_in_2016_spring.html <![CDATA[Persimmon合宿に行ってきた]]> Persimmon合宿に行ってきた

3/12~13の2日間、神奈川県は湯河原にて、通称「柿」こと Persimmon のための開発合宿に行ってきました。

persimmon-projects/Persimmon

この開発合宿の目的は確か2点あって、

  • 次期 Persimmon (いわゆる Persimmon 2.0)に向けてモデルの再設計を行う
  • Persimmon 用のVS拡張を作る

というのを合宿で頑張ろうということになっていました。

なっていました、というのは、目的その2がほぼほぼ解決しつつあるためです。

kekyo/Persimmon

けきょー先輩がVSテストエクスプローラなど、VS拡張周りの重い部分に電撃戦を敢行してくれたおかげで、むしろ合宿でやることがなくなったのでした。(一部動作がアレしてるところがあったようですが、そこは某社内で情報展開がなされるはず…?)

なので、本開発合宿は目的その1にフォーカスして実施されました。

Read more...

]]>
Mon, 14 Mar 2016 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/12/29/cricket_yet_another_actor_library.html http://gab-km.bitbucket.org/blog/html/2015/12/29/cricket_yet_another_actor_library.html <![CDATA[Actor ライブラリ Cricket のご紹介 #FsAdvent]]> 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...

]]>
Tue, 29 Dec 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/12/14/getting_started_paket.html http://gab-km.bitbucket.org/blog/html/2015/12/14/getting_started_paket.html <![CDATA[Paketコトハジメ #FsAdvent]]> 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...

]]>
Mon, 14 Dec 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/12/10/practical_persimmon_dried_en.html http://gab-km.bitbucket.org/blog/html/2015/12/10/practical_persimmon_dried_en.html <![CDATA[Practical Persimmon.Dried #FsAdvent]]> 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...

]]>
Thu, 10 Dec 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/12/03/practical_persimmon_dried.html http://gab-km.bitbucket.org/blog/html/2015/12/03/practical_persimmon_dried.html <![CDATA[実践 Persimmon.Dried #FsAdvent]]> 実践 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...

]]>
Thu, 03 Dec 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/11/26/install_tinkerer_on_windows_with_python_3_5.html http://gab-km.bitbucket.org/blog/html/2015/11/26/install_tinkerer_on_windows_with_python_3_5.html <![CDATA[Tinkerer を Windows / Python 3.5 環境にインストールする]]> 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 を返してくるとか、バージョンが上がったためと思われるワーニングが出てくるようになりましたが、とりあえずは動いているようです。

]]>
Thu, 26 Nov 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/08/11/check_properties_with_persimmon_dried.html http://gab-km.bitbucket.org/blog/html/2015/08/11/check_properties_with_persimmon_dried.html <![CDATA[Persimmon.Dried で性質をチェックする]]> Persimmon.Dried で性質をチェックする

性質をチェックする

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

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

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

Read more...

]]>
Tue, 11 Aug 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/06/30/writing_tests_with_persimmon.html http://gab-km.bitbucket.org/blog/html/2015/06/30/writing_tests_with_persimmon.html <![CDATA[Persimmon でテストを書く]]> Persimmon でテストを書く

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

persimmon-projects/Persimmon - Github

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

Read more...

]]>
Tue, 30 Jun 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2015/06/29/release_funcy.html http://gab-km.bitbucket.org/blog/html/2015/06/29/release_funcy.html <![CDATA[Funcy というライブラリの話]]> 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 な何かは提供していませんが、過去のコミットの残骸が残っています。

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

ご自由にどうぞ

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

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

]]>
Mon, 29 Jun 2015 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/12/31/comparison_of_fscheck_with_scalacheck.html http://gab-km.bitbucket.org/blog/html/2014/12/31/comparison_of_fscheck_with_scalacheck.html <![CDATA[FsCheck と ScalaCheck とを見比べる]]> FsCheck と ScalaCheck とを見比べる

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

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

Read more...

]]>
Wed, 31 Dec 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/12/11/introduce_visual_fsharp_power_tools.html http://gab-km.bitbucket.org/blog/html/2014/12/11/introduce_visual_fsharp_power_tools.html <![CDATA[Visual F# Power Tools の紹介]]> Visual F# Power Tools の紹介

これは F# Advent Calendar 2014 11日目の記事です。前日は @zakky_dev さんの『コンピュテーション式の変形後を覗き見る』でした。

Read more...

]]>
Thu, 11 Dec 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/11/25/making_my_debut_in_pypi.html http://gab-km.bitbucket.org/blog/html/2014/11/25/making_my_debut_in_pypi.html <![CDATA[PyPI デビューしました]]> PyPI デビューしました

現在とあるライブラリを Python で書いておりまして、良い機会なので PyPI にアップしてみよう、ということでやってみました。

Read more...

]]>
Tue, 25 Nov 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/11/07/quickcheck_packages_for_python_from_all_ages_and_cultures.html http://gab-km.bitbucket.org/blog/html/2014/11/07/quickcheck_packages_for_python_from_all_ages_and_cultures.html <![CDATA[Python 版 QuickCheck を謳っているパッケージを調べてみた]]> Python 版 QuickCheck を謳っているパッケージを調べてみた

ちょっと思うところがあって、Python で使える QuickCheck 的なライブラリを調べてみました。

PyPI 上に6つほど該当するパッケージが見つかったので、短いコメントとともに紹介してみます。今も開発が続いているものもあれば、「ここは、墓場」みたいになっているものもあって、社会は厳しいなという感想を抱いています。

Read more...

]]>
Fri, 07 Nov 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/10/30/customize_a_tinkerer_theme.html http://gab-km.bitbucket.org/blog/html/2014/10/30/customize_a_tinkerer_theme.html <![CDATA[Tinkerer のテーマをカスタマイズする]]> Tinkerer のテーマをカスタマイズする

何となく思うところがあり、このブログで使っているテーマに手を入れてみました。

これまでは modern5 という標準で入っているテーマの1つを使っていました。これをベースにスタイルを調節した結果が、今ご覧になっているブログです。

立体感やグラデーションを取り除いているので、フラットデザインをかじったような感じになっていますが、グリッドスタイルではないので完全に紛い物です( ◜◡◝ )

やったこと

自分用のテーマにカスタマイズするためにやったことが3点あります:

  1. ベースとなるテーマを持ってくる
  2. テンプレートファイルを編集する
  3. ブログをビルドして、出来栄えを確認する

1. ベースとなるテーマを持ってくる

まずは、手を加えるテーマの関連ファイルを自分の Tinkerer ブログのディレクトリに持ってきます。私は virtualenv 上で作業しているので、例えば以下のようなパスが作業対象です:

流用元テーマ (virtualenv 仮想環境のルート)/Lib/site-packages/tinkerer/themes/modern5
自分用テーマ (Tinkerer ブログのルート)/_themes/(テーマの名前)

元テーマのディレクトリにあるファイルを、全て自分用のテーマのディレクトリにコピーします。なお、ここで _themes ディレクトリに突っ込んでいますが、これは conf.pyhtml_theme_path のリストにあるパスです。

2. テンプレートファイルを編集する

続いて、自分のテーマディレクトリに持ってきたファイル類に手を入れます。

変更しそうなのは以下のファイルでしょうか:

  • theme.conf: テーマについての設定を記述します
  • layout.html: テーマで使用する HTML のテンプレートファイルです
  • static/(テーマ名).css_t: テーマで使用する CSS のテンプレートファイルです

なお、 modern5 で使っているレイアウト用 HTML テンプレートが boilerplate/layout.html から継承しているという構造ですが、今回はこのファイルと元のレイアウトテンプレートをマージしたものを使っています。

主に手を加えたのは CSS テンプレートで、ここでスタイルの調節を行いました。ファイル名は特段変更しなくてもいいですが、せっかく自分用のテーマを作ろうとしているのに、ファイル名が modern5.css_t じゃカッコつかないなと思ったので、これも変更しています。CSS テンプレートファイル名を変更した場合、 theme.conf で指定している CSS ファイル名も変更してください。

3. ブログをビルドして、出来栄えを確認する

スタイルや構造を変更したら、 conf.pyhtml_theme を自分のテーマ名に変更します。そして、実際の出力を確認するために、 tinker --build を実行してブログをビルドします。

自分の思った通りのデザインになっているか確認し、気に入る出来に仕上がるまで手順 2. と 3.(のビルド) を繰り返します。

感想

エッチティーエムエルぢからとシーエスエスぢからが貧弱な私なので、既存テーマを弄っていく方法を取りました。 Jinja2 のテンプレートの仕組みや HTML/CSS の知識に覚えがある方は、1から思い思いのテーマを作っていった方が、さらに良いものが出来そうな感じです。

また、ここで作ったテーマを PyPI に上げておくと、他の人にも使ってもらえるようになって、他の人にもうれしみがあります。私がそれをやるかは未定ですが( ˘ω˘ )

]]>
Thu, 30 Oct 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/10/23/using_atom_in_windows_with_proxy_authentication.html http://gab-km.bitbucket.org/blog/html/2014/10/23/using_atom_in_windows_with_proxy_authentication.html <![CDATA[プロキシ認証のある Windows で Atom を使う]]> プロキシ認証のある Windows で Atom を使う

前振り

Atom というリッチなエディタがありますが、おそらく皆さんご存知のことと思います。

Atom - A hackable text editor for the 21st Century

GitHub の人たちが作ったエディタで、水牛が微笑むあのエディタアフリカの小国に関心を寄せるあのエディタのように、柔軟にカスタマイズが出来るのが売りの1つとのことです。

主に Unix ライクな OS ユーザーにターゲットを合わせていそうな雰囲気ですが、Windows でもアルファ版となっていますが利用可能です。

上述の公式ページからインストーラーをダウンロードできますが、私は Chocolatey ユーザーですので、choco install atom でサクッとインストールしました。

Read more...

]]>
Thu, 23 Oct 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/10/22/thinking_about_testing_dsl_in_fsharp.html http://gab-km.bitbucket.org/blog/html/2014/10/22/thinking_about_testing_dsl_in_fsharp.html <![CDATA[F# でのテスト用 DSL について考える]]> F# でのテスト用 DSL について考える

きっかけ

それは、何気ない私の思いつきからでした。

その発端となったのが、以下の記事です。

Test::Unitでテストを書く - Qiita

F# でも文字列ベースでテストが書けたり、もっと柔軟にテストが書けるようになるといいなぁと。F# に新しい構文を持ち込むなら、まずはコンピュテーション式だろうと。

そうした思いから、簡単なサンプルを書いてみました。

Gab-km / TestBuilder.fs - Gist

Read more...

]]>
Wed, 22 Oct 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/10/08/error_handling_in_mailboxprocessor.html http://gab-km.bitbucket.org/blog/html/2014/10/08/error_handling_in_mailboxprocessor.html <![CDATA[MailboxProcessor でのエラーハンドリング]]> MailboxProcessor でのエラーハンドリング

以前にもいくつか MailboxProcessor<'Msg> ネタで記事を書いているんですが、なにぶん情報が少ないため、ちょっとやり方を変えると途端に詰まってしまいます。

ということで、今回の話題も F# の非同期メッセージ処理エージェントであるところの MailboxProcessor<'Msg> です。本記事では、 MailboxProcessor<'Msg> が例外処理する方法について説明します。

Read more...

]]>
Wed, 08 Oct 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/08/28/convert_fscheck_japanese_docs_from_markdown_into_fsharp_formatting.html http://gab-km.bitbucket.org/blog/html/2014/08/28/convert_fscheck_japanese_docs_from_markdown_into_fsharp_formatting.html <![CDATA[FsCheck の日本語ドキュメントが Markdown 形式から FSharp.Formatting に対応しました]]> FsCheck の日本語ドキュメントが Markdown 形式から FSharp.Formatting に対応しました

みんなの街の l10n マン、ガブさんです( ◜◡◝ )

今回のお話

以前、こんな記事を書きました。

FsCheck のドキュメントを翻訳しました - a wandering wolf

このドキュメント、翻訳当初は原文に合わせて Markdown 形式で書いたんですが、公式が FSharp.Formatting 形式に対応しました。

そこで、日本語翻訳版も FSharp.Formatting に対応してくれないかと、FsCheck のパパであるカートたんこと Kurt Schelfthout 氏から依頼されたのです。

FSharp.Formatting は、存在は知っていたものの、当時は一度も使ったことがない、という状況でした。が、これは逆に FSharp.Formatting に触れるチャンスだと考えて、2つ返事でとりかかりました。

Read more...

]]>
Thu, 28 Aug 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/08/21/translate_the_update_monads_article.html http://gab-km.bitbucket.org/blog/html/2014/08/21/translate_the_update_monads_article.html <![CDATA[Update モナドの記事を翻訳しました]]> Update モナドの記事を翻訳しました

今年の5月、F# 界における「熱心者のとましゅぴー」こと Tomas Petricek 氏が、とても興味深い記事を投稿しました。

Stateful computations in F# with update monads - Tomas Petricek’s blog

ここで述べられている Update モナド がとても興味深かったので、以下のような流れもあり、翻訳してみることにしました。

Read more...

]]>
Thu, 21 Aug 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/08/01/let_s_make_10.html http://gab-km.bitbucket.org/blog/html/2014/08/01/let_s_make_10.html <![CDATA[Make 10 してみよう!]]> Make 10 してみよう!

Make 10 とは

皆さんは Make 10 というゲームをご存知でしょうか?

4桁の整数が与えられた時、各桁の数字を使って10になるよう計算する、というものです。

例として 1357 という数字が与えられたとしましょう。これは 1, 3, 5, 7 の数字の間に適当な四則演算を行うと

1 - 3 + 5 + 7 = 10

となりますね。

Read more...

]]>
Fri, 01 Aug 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/07/14/attended_at_japan_powershell_meetup_3rd_jpposh.html http://gab-km.bitbucket.org/blog/html/2014/07/14/attended_at_japan_powershell_meetup_3rd_jpposh.html <![CDATA[第3回 PowerShell 勉強会に行ってきました #jpposh]]> 第3回 PowerShell 勉強会に行ってきました #jpposh

先週の土曜日、7/12にこういうイベントに行ってきました。

第 3 回 PowerShell 勉強会 - Doorkeeper

私はやっている仕事とは裏腹に、あまり MS 系技術勉強会に参加することが多くないんですが、何の因果かセッションの時間を割り当てられてしまい、ギョーム・タボーの合間を縫って作ったのが以下の資料です。

PowerShellが苦手だった男がPowerShellを愛するようになるまで - SlideShare

40分時間を割り当ててもらったのに、15分ほどで終わっちゃったの、ネタのテーマ的にもうどうしようもなかったんや…!(だいぶゆっくり喋ったのにこれだよ!)

ただ、LLT(Long Lightening Talk)という感じにはなりましたが、まぁ初心者向けということもあり、案外サクッと終わったの良かったんじゃないかという気持ちも芽生えつつあります。あと、意外と資料をいろんな方に見て頂いているようで、恐縮しつつありがたいなぁとも思っております。

あ、会場の謎社こと 株式会社グラニ さん、めっちゃキレイでした!またお邪魔したいですね!!ヽ(‘ω’)ノ三ヽ(‘ω’)ノ

]]>
Mon, 14 Jul 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/07/11/reading_night_for_learn_you_a_haskell_for_great_good_1.html http://gab-km.bitbucket.org/blog/html/2014/07/11/reading_night_for_learn_you_a_haskell_for_great_good_1.html <![CDATA[「平日夜にすごいH本をちょびちょび読む会」に参加しました #Hちょびよみ]]> 「平日夜にすごいH本をちょびちょび読む会」に参加しました #Hちょびよみ

こういうイベントに参加してきました。

平日夜にすごいH本をちょびちょび読む会 - Partake

Read more...

]]>
Fri, 11 Jul 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/06/04/using_csharp_and_dotnet_mongodb_driver_in_powershell.html http://gab-km.bitbucket.org/blog/html/2014/06/04/using_csharp_and_dotnet_mongodb_driver_in_powershell.html <![CDATA[MongoDB の C# / .NET Driver を PowerShell から使う]]> MongoDB の C# / .NET Driver を PowerShell から使う

お疲れさまです。ガブです。表題の件につき、本記事を書いてみました。

最初は、PowerShell を介して MongoDB にアクセスしたかったから調べていたはずなんですが、いざ出来るところまで調べたら「あれ、何でこれやろうと思ったんだっけ…?」となった事案です。ご査収ください。

Read more...

]]>
Wed, 04 Jun 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/06/03/fparsec_tutorial_in_japanese.html http://gab-km.bitbucket.org/blog/html/2014/06/03/fparsec_tutorial_in_japanese.html <![CDATA[FParsec 日本語チュートリアル]]> FParsec 日本語チュートリアル

本記事は、F# 製のパーザライブラリ FParsec のチュートリアルを和訳したものです。

FParsec Documentation FParsec tutorial (English)

この和訳ドキュメントはチュートリアル本文のみを日本語に翻訳したものであり、その他のページは未翻訳です。 そのため、本文中に張られたリンクには原文に遷移するものがあります。

また、原文の意味を損なわない程度に訳文を砕いている箇所があります。 誤解がないように気をつけましたが、もしかしたら元の意味とずれてしまっているところがあるかもしれないことを予めご了承ください。

本記事は原文に則り Creative Commons Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) の下でライセンスしています。 原文の著作権はライブラリ作者である Stephan Tolksdorf 氏に帰属します。 日本語の内容についておかしな箇所がありましたら、私までご連絡いただけると助かります。 その他、本記事についてはコメントもしくはTwitter(@gab_km)宛にお気軽にどうぞ。

Read more...

]]>
Tue, 03 Jun 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/05/27/messagepack_for_fsharp_released.html http://gab-km.bitbucket.org/blog/html/2014/05/27/messagepack_for_fsharp_released.html <![CDATA[MessagePack for F# リリース!]]> MessagePack for F# リリース!

一部方面には大変お待たせいたしました。msgpack-fsharp、本日未明にリリースいたしました。

Gab-km / msgpack-fsharp - GitHub

一応、公式サイトの方にも crawler 経由でリストアップされております。

MessagePack: It’s like JSON. but fast and small.

背景

これを書き始めたのは、「F# から使いやすい MessagePack 実装がほしい!」と思ったから、というのが大きな理由です。…が、やりたかった事とできた事の間でせめぎ合った結果、まだ改善の余地を残したままのリリースとなってしまいました…。

それでも、これまで .NET 方面では C# による実装である msgpack-cli しかありませでした。それが今年は FSharp.Data.MsgPack もリリースされ、F# er が MessagePack を使う上での選択肢がぐっと増えたと思います。使い勝手や処理性能など様々なトレードオフはありますが、複数ある候補から「選ぶことが出来る」というのが何よりのメリットだと思っています。

最後に

本プロダクトは still growing ですので、皆さまからのバグ報告、要望、Pull Requestを心よりお待ちしております!

]]>
Tue, 27 May 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/05/22/which_is_faster_in_initialization_list_or_array.html http://gab-km.bitbucket.org/blog/html/2014/05/22/which_is_faster_in_initialization_list_or_array.html <![CDATA[list と array、生成はどちらが速い?]]> list と array、生成はどちらが速い?

TL;DR

性能が欲しけりゃ配列を使え。ただし、コレクションの使い方次第。あと、内包表記は安易に使うな。

はじめに

きっかけは、ふとした疑問からでした。

ちょうど速度的な性能についてあれこれ企てているところで、このツイートもそうした背景からのものでした。

Read more...

]]>
Thu, 22 May 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/04/25/access_modifiers_for_class_definition.html http://gab-km.bitbucket.org/blog/html/2014/04/25/access_modifiers_for_class_definition.html <![CDATA[クラス定義でのアクセス修飾子]]> クラス定義でのアクセス修飾子

基礎的なところがよく分かってなかったので、自分のためにメモ。

話の中身

// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
   [ class ]
     [ inherit base-type-name(base-constructor-args) ]
     [ let-bindings ]
     [ do-bindings ]
     member-list
      ...
   [ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...

(クラス (F#) - MSDN より)

これは F# におけるクラスの定義なんですが、”Class definition” のところをよーく見ると、 access-modifiertype キーワードの後と parameter-list の前にそれぞれあることに気づきます。

前者は

type internal AssemblyInnerClass(someCode: int) = ...

という定義で、このクラスに対するアクセシビリティを設定するものです。

後者は

type CannotInitializeDirectoryClass private(secretCode: int) = ...

ということになりますが、これが何をしているものかよく知りませんでした。

先述した MSDN Library の記述をよく読んでみると、どうやら後者の定義はプライマリ・コンストラクタに対するアクセシビリティの設定を行うようです。

type NonsenseClass private(caller: string) =
    let _caller = caller
    new() = NonsenseClass("from 0-args constructor")
    static member create() = NonsenseClass("from create method")
    member self.WhoCalled = _caller

こういう風にクラスを定義すると、

> let nc1 = NonsenseClass("from primary constructor");;

  let nc1 = NonsenseClass("from primary constractor");;
  ----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

stdin(6, 11): error FS0501: The member or object constructor 'NonsenseClass' takes 0 argument(s) but is here given 1. The required signature is 'new : unit -> NonsenseClass'.

> let nc2 = NonsenseClass();;

val nc2 : NonsenseClass

> let nc3 = NonsenseClass.create();;

val nc3 : NonsenseClass

> nc2.WhoCalled;;
val it : string = "from 0-args constructor"
> nc3.WhoCalled;;
val it : string = "from create method"
>

という具合に動作します。プライマリ・コンストラクタを使おうとすると、「1引数を取るコンストラクタが見つからないよ!」と言われますね。

という訳で

お勉強になったかな? > @自分

]]>
Fri, 25 Apr 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/04/22/add_an_element_into_a_sequence_en.html http://gab-km.bitbucket.org/blog/html/2014/04/22/add_an_element_into_a_sequence_en.html <![CDATA[Add an element into a sequence]]> Add an element into a sequence

I wanted to add a element into a sequence, seq<’T> in F# and IEnumerable<T> in .NET, but I didn’t find any functions in Microsoft.FSharp.Collections.Seq module. And then, a good advice was brought to me:

It seemed very nice, so I tried it right away.

// a sequence under test
let ns = seq [1 .. 10]

// a helper function to print a sequence
let printSeq xs = xs |> Seq.toList |> printfn "%A"

// prepend an element to the sequence
seq {
  yield 0
  yield! ns
} |> printSeq
//> [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// append an element to the sequence
seq {
  yield! ns
  yield 11
} |> printSeq
//> [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

Excellent! The code above is working well.

Because of no source evaluation, we can use it without the troubles of related to infinity sequences.

]]>
Tue, 22 Apr 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/04/22/add_an_element_into_a_sequence.html http://gab-km.bitbucket.org/blog/html/2014/04/22/add_an_element_into_a_sequence.html <![CDATA[シーケンスに要素を追加する]]> シーケンスに要素を追加する

F# におけるシーケンス、つまり seq<’T> (.NET 的には IEnumerable<T>) に要素を追加する関数が欲しかったんですが、それが Microsoft.FSharp.Collections.Seq モジュールにないなぁと思っていたところ、有用なアドバイスを頂きました。

早速実装してみます。

// 対象のシーケンス
let ns = seq [1 .. 10]

// シーケンス出力用のヘルパー関数。
let printSeq xs = xs |> Seq.toList |> printfn "%A"

// 先頭に追加する
seq {
  yield 0
  yield! ns
} |> printSeq
//> [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// 末尾に追加する
seq {
  yield! ns
  yield 11
} |> printSeq
//> [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11]

ステキ!思ったように動作しています。

このコード、無限シーケンスであってもシーケンス自体を評価していないので、問題なく使えていいですね。

]]>
Tue, 22 Apr 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/04/09/install_fsharp_3_0_without_web_platform_installer.html http://gab-km.bitbucket.org/blog/html/2014/04/09/install_fsharp_3_0_without_web_platform_installer.html <![CDATA[Web Platform Installer 無しで F# 3.0 をインストールする]]> Web Platform Installer 無しで F# 3.0 をインストールする

最近(と言っても数ヶ月前ですが…)ようやく F# 3.0 にシフトした F# 界の発展途上マンです。皆さん、F#!F#!していらっしゃいますでしょうか?

私は Visual Studio Express 2012 for Web + F# Tools for Visual Studio Express 2012 for Web という構成を使っています。Express 版で F# 3.0 やりたいならこれで問題ないわけなんですが、普通に F# Tools for Visual Studio Express 2012 for Web を入れようとすると、Web Platform Installer(以下、WebPI)を使うことになると思います。

問題点と試行錯誤

この WebPI、ネット経由でいろんなプロダクトをインストールできて便利なんですが、この「ネット経由で」というのが時に問題となることがあります。

…そう、認証プロキシ越しに WWW に漕ぎ出さなくちゃいけない環境ですね。プロキシ外に出られないため、WebPI は起動に失敗します。

私のエントリをお読みになっていてお気づきの方もいらっしゃるかもしれませんが、私の仕事環境がまさにこれなんです。ネット経由でいろんなことをする時に、あれこれ調べてどうにかプロキシの問題をクリアーしてきました。今回も、認証プロキシ越しに WebPI を起動したくて、いろいろ調べてやってみたんです。

Making WebPI work with proxy authentica​tion - Yet another developer blog

Acquiring Software via WebPi Through Web Proxy Requiring Authentication - Stack Overflow

この、IWebProxy を使うやり方が一番可能性高そう(と言うか、他の解決策が見つからなかった)だったので実践してみたんですが、WebPI はにべもなくエラーダイアログを突きつけてくるわけです。

困り果てていたんですが、調べたらちゃんとインストーラーが提供されていました。

F# Tools for Visual Studio Express 2012 for Web - Download Center

これを落として実行してみたら、暫く後にインストールは完了し、晴れて VSW2012 上で F# 3.0 が使えるようになりました。

結論

もっと情報出してくれよ!!!

]]>
Wed, 09 Apr 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/03/30/kyon_kao_wedding.html http://gab-km.bitbucket.org/blog/html/2014/03/30/kyon_kao_wedding.html <![CDATA[kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyo #kyon_kao_wedding に行ってきました]]> kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyo #kyon_kao_wedding に行ってきました

行ってきました。詳しくはこちらを参照。

kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyo #kyon_kao_wedding まとめ - togetter

まとめが長いですね、分かります。いろいろあったんだ察してくれ。

LT 資料

何故か「マサカリスト」に分類されてはいましたが、私も LT してきました。

F#のinlineと型推論(狩) - SlideShare

マサカリストの中ではライトな話題を選んだつもりだったんですが、あとで複数の方に否定されました。おかしい。

まとめ

きょん君、かおりさん、おめでとうございます!!

]]>
Sun, 30 Mar 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2014/02/04/git_clone_including_submodule_behind_proxy_server.html http://gab-km.bitbucket.org/blog/html/2014/02/04/git_clone_including_submodule_behind_proxy_server.html <![CDATA[プロキシ経由で submodule と一緒に git clone する]]> プロキシ経由で submodule と一緒に git clone する

結論

プロキシ経由で git プロトコルとおしゃべりする必要があるときは、

$ git config --global url.https://github.com/.insteadOf git://github.com/

https 経由にする設定をしておくと良さそう。

覚えておきたい設定

$ git config [--global] url.<使いたい URL>.insteadOf <読み替えたい URL>

または

; ~/.gitconfig
[url "<使いたい URL>"]
  insteadOf = <読み替えたい URL>

Read more...

]]>
Tue, 04 Feb 2014 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/12/18/interoperation_between_powershell_and_fsharp.html http://gab-km.bitbucket.org/blog/html/2013/12/18/interoperation_between_powershell_and_fsharp.html <![CDATA[PowerShell と F# の間でコードを実行しあう]]> PowerShell と F# の間でコードを実行しあう

はじめに

この記事は PowerShell Advent Calendar 2013 18日目の記事です。17日目は @guitarrapc_tech さんの PowerShell の ダイナミックパラメータを利用して動的にパラメータを組み立てる - tech.guitarrapc.com でした。

だいぶ前から PowerShell の存在自体は知っていたんですが、これまでのコマンドプロンプトと操作感が違って、長い間距離をおいていました…。一年ほど前に、一念発起して PowerShell やろう!と少しずつ触り始めて、ようやくコマンドプロンプト程度には扱えるようになってきたところです。昨日分担当のぎたぱそ先生をはじめ、いろんな方から勉強させてもらっていますヽ(‘ω’)ノ三ヽ(‘ω’)ノ

さて、私は「F# の方から来ました」系の人間ですので、このエントリでは PowerShell と F# の相互運用(という体の呼び出しコード)について書いてみようと思います。

From PowerShell To F#

PowerShell から F# など外部の .NET コードを実行するには、 Add-Type を使うと便利です。

これを実行してみましょう。

PS C:\home> powershell .\fsharp.ps1
../../../_images/hello_powershell.png

ちょっと残念な感じの WindowsForm が起動されましたが、ちゃんと動いてくれていますね!

From F# To PowerShell

さて、反対に F# から PowerShell のコードを実行してみましょう。

…という記事を考えていたんですが、10日目に @tanaka_733 さんが C# 版の 素晴らしい記事 を書いてくださっているんで、私はもう帰っていいでしょうか…。

い、一応コード片は置いていきますね!

これもまた実行してみます。

PS C:\home> fsi powershell.fsx
     .emacs.d   2013/12/10 10:37:22
     .ipython   2013/09/02 15:55:36
     .jenkins   2013/09/30 14:23:34
         .ssh   2013/09/04 11:23:22
         docs   2013/12/12 10:42:18
          pip   2013/09/25 15:23:36
          src   2013/12/17 22:50:00
.bash_history   2013/11/01 18:56:36
    .emacs.el   2013/12/10 10:20:46
   .emacs.elc   2013/11/29 16:09:41
   .gitconfig   2013/09/26 10:59:24
   .gitignore   2013/09/26 10:58:45
    .hgignore   2013/09/26 17:50:26
        .hgrc   2013/12/10 15:41:34
     .inputrc   2011/12/06 17:31:44
     .profile   2013/09/11 17:30:18
PS C:\home>

こちらもいい感じです。

最後に

簡単にですが、PowerShell から F# のコードを、そして F# から PowerShell のコードをそれぞれ動かしてみました。PowerShell は パイプラインの機能を持っているので、同じくパイプライン演算子を持つ F# と同じような使用感で操作ができますね。

]]>
Wed, 18 Dec 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/12/15/the_first_contact_with_mongodb.html http://gab-km.bitbucket.org/blog/html/2013/12/15/the_first_contact_with_mongodb.html <![CDATA[MongoDB とのファーストコンタクト]]> MongoDB とのファーストコンタクト

興味があって MongoDB をインストールしてみたんですが、操作方法をすぐに忘れてしまうので備忘録として書いておきます。

インストール

公式からでもパッケージマネージャからでも、お好きな方でどうぞ。ここは特に書くことがありません。

データベースサーバ起動

インストールが完了したら、 (インストールパス)/bin/mongod でフォアグラウンド起動します。

PS C:\mongodb> .\bin\mongod.exe
C:\mongodb\bin\mongod.exe --help for help and startup options
Sun Dec 15 10:27:11.671
Sun Dec 15 10:27:11.671 warning: 32-bit servers don't have journaling enabled by default. Please use --journal if you want durability.
Sun Dec 15 10:27:11.671
Sun Dec 15 10:27:11.703 [initandlisten] MongoDB starting : pid=2288 port=27017 dbpath=\data\db\ 32-bit host=JSS93122
Sun Dec 15 10:27:11.703 [initandlisten]
Sun Dec 15 10:27:11.703 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Sun Dec 15 10:27:11.703 [initandlisten] **       32 bit builds are limited to less than 2GB of data(or less with --journal).
Sun Dec 15 10:27:11.703 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.
Sun Dec 15 10:27:11.703 [initandlisten] **       See http://dochub.mongodb.org/core/32bit
Sun Dec 15 10:27:11.703 [initandlisten]
Sun Dec 15 10:27:11.703 [initandlisten] ** NOTE: your operating system version does not support the method that MongoDB
Sun Dec 15 10:27:11.703 [initandlisten] **       uses to detect impending page faults.
Sun Dec 15 10:27:11.703 [initandlisten] **       This may result in slower performance for certain use cases
Sun Dec 15 10:27:11.703 [initandlisten]
Sun Dec 15 10:27:11.703 [initandlisten] db version v2.4.6
Sun Dec 15 10:27:11.703 [initandlisten] git version: b9925db5eac369d77a3a5f5d98a145eaaacd9673
Sun Dec 15 10:27:11.703 [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=0, build=6002, platform=2, service_pack='Service Pack 2') BOOST_LIB_VERSION=1_49
Sun Dec 15 10:27:11.703 [initandlisten] allocator: system
Sun Dec 15 10:27:11.703 [initandlisten] options: {}
Sun Dec 15 10:27:11.765 [websvr] admin web console waiting for connections on port 28017
Sun Dec 15 10:27:11.765 [initandlisten] waiting for connections on port 27017

もし起動時に異常終了するようでしたら、エラーメッセージを読んで対応しましょう。私のところではよく "Unclean shutdown detected." が検出されるので、その時は ./bin/mongod --repair を実施しています。

起動に成功すれば、標準では /data/db にデータを書き込んでいきます。別の場所を指定したい場合は、オプション --dbpath に希望のディレクトリを指定します。

クライアント接続

クライアントもインストールパスの ./bin/mongo にあります。

PS C:\mongodb> .\bin\mongo.exe
MongoDB shell version: 2.4.6
connecting to: test
Server has startup warnings:
Sun Dec 15 10:27:11.703 [initandlisten]
Sun Dec 15 10:27:11.703 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Sun Dec 15 10:27:11.703 [initandlisten] **       32 bit builds are limited to less than 2GB of data(or less with --journal).
Sun Dec 15 10:27:11.703 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.
Sun Dec 15 10:27:11.703 [initandlisten] **       See http://dochub.mongodb.org/core/32bit
Sun Dec 15 10:27:11.703 [initandlisten]
Sun Dec 15 10:27:11.703 [initandlisten] ** NOTE: your operating system version does not support the method that MongoDB
Sun Dec 15 10:27:11.703 [initandlisten] **       uses to detect impending page faults.
Sun Dec 15 10:27:11.703 [initandlisten] **       This may result in slower performance for certain use cases
Sun Dec 15 10:27:11.703 [initandlisten]
>

こちらも標準では localhost の 27017 ポートの test データベースに接続します。別の MongoDB サーバに接続したい場合は --host オプションおよび --port オプションを使用します。

データベース作成

use (データベース名) というコマンドを実行すると、既にこの名前のデータベースが存在する場合はスイッチ(=このデータベースを使用)し、そうでない場合は指定したデータベース名で新たにデータベースを作成してスイッチします。

> use test
switched to db test
>

データベースの確認

現在使用中のデータベースは db を、サーバ上の全データベースは show dbs を実行することで確認できます。

> db
test
> show dbs
local   0.03125GB
test    0.0625GB
>

コレクションの確認

接続中のデータベースにあるテーブルを確認するには show tables を実行します。

> show tables
mytable
system.indexes
test
>

なお、MongoDB ではテーブルという表現は使われず、コレクションと呼ばれます。ですので、上のコマンドも show collections で同じ結果が得られます。

> show collections
mytable
system.indexes
test
>

長い入力が煩雑なので、私が対話的に入力するときは show tables を使います。以下、表現は「コレクション」の方を使用します。

ドキュメントの作成

レコードという表現も、MongoDB ではドキュメントと呼ばれます。ドキュメントを作成するには db.(対象のコレクション).insert({ "(キー)": "(値)" [, ...] }) というコマンドを実行します。

> db.sample.insert({"name": "gab_km", "age": 17})
>

なお、指定したコレクションが未作成の場合、ここで一緒に作成されます。

ドキュメントの参照

ドキュメントを参照するには db.(対象のコレクション).find([{ "(キー)": "(値)|(条件)" [, ...] }]) を実行します。

> db.sample.find()
{ "_id" : ObjectId("52ad166bf12d1eed4ea6541d"), "name" : "gab_km", "age" : 17 }
> db.sample.find({"name": "gab_km"})
{ "_id" : ObjectId("52ad166bf12d1eed4ea6541d"), "name" : "gab_km", "age" : 17 }
>

なお、条件式を使っての検索も可能です。

> db.sample.find({"age": {$lte: 20}})  // age が 20 以下のドキュメントを検索する
{ "_id" : ObjectId("52ad166bf12d1eed4ea6541d"), "name" : "gab_km", "age" : 17 }
>

詳しい条件演算子は公式の Operators を参照してください。

ドキュメントの更新

db.(対象のコレクション).update(<条件>, <設定内容>) でドキュメントを更新できます。

> db.sample.update({"name": "gab_km"}, {$set: {"age": 30}})  // 注意: $set を忘れないこと!
> db.sample.find()
{ "_id" : ObjectId("52ad166bf12d1eed4ea6541d"), "name" : "gab_km", "age" : 30 }
>

なお、update メソッドには upsert と multi というオプションがあります。upsert オプションは条件に一致するドキュメントがない場合にデータを挿入するかどうか、multi オプションは複数条件がヒットした場合に同じ設定内容で更新するかどうかを指定します。

upsert オプションはデフォルト値が false ですし、そんなもんかなと思いますが、multi オプションもデフォルトが false になっています。そのため、これを指定しないと最初に検索条件にヒットしたドキュメントだけしか更新されません。普通の RDBMS と同じ想定でいると、違う結果に混乱するかもしれません。

ドキュメントの削除

ドキュメントの削除は db.(対象のコレクション).remove([<条件>]) を実行します。

> db.sample.remove({"age": {$gt: 25}})
> db.sample.find()
>

なお、remove メソッドの第2引数に justOne というオプションがあり、これを true にして実行すると、検索条件にヒットした最初のドキュメントだけが削除されます。update メソッドの multi オプションと意味合いが逆なの、どうしてこうなった感強い…。

最後に

個人的なデータをちょちょっと管理するために MongoDB を入れてみましたが、そのくらいの用途なら使っていけそうな気がしてます。実運用はちょっと分からないですね…。

]]>
Sun, 15 Dec 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/12/13/let_mailboxprocessor_act_en.html http://gab-km.bitbucket.org/blog/html/2013/12/13/let_mailboxprocessor_act_en.html <![CDATA[Let MailboxProcessor Act]]> Let MailboxProcessor Act

Preface

This is the translated text of the topic I’ve written - Let MailboxProcessor Act (ja: MailboxProcessor に処理をさせよう), which is the post for F# Advent Calendar 2013.

About MailboxProcessor

MailboxProcessor is a class to execute asynchronous computations which is built in F# standard library(FSharp.Core). I wrote this topic in another post.

#102 Asynchronous programming with MailboxProcessor (ja: #102 MailboxProcessorで非同期プログラミング) - a wandering wolf

When you pass values as messages to MailboxProcessor(we call it “actor” below), the actor do certain computations. When you need the results of the computations, recieve them as messages. MailboxPRocessor is something like that.

We can get the result from the actor synchronously or asynchronously, whichever we want, so it is used a lot for asynchronous computations.

The purpose of this post

We let this MailboxProcessor act some simple computations asynchronously and in parallel. Also we will take each elapsed time of the computations (only for the comparison).

(* f: a function to exam *)
let timer (f: unit -> unit) =
  let sw = System.Diagnostics.Stopwatch()
  sw.Start()
  f()
  sw.Stop()
  printfn "elapsed time: %d[ms]" sw.ElapsedMilliseconds

Read more...

]]>
Fri, 13 Dec 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/12/04/let_mailboxprocessor_act.html http://gab-km.bitbucket.org/blog/html/2013/12/04/let_mailboxprocessor_act.html <![CDATA[MailboxProcessor に処理をさせよう]]> MailboxProcessor に処理をさせよう

はじめに

この記事は F# Advent Calendar 2013 4日目の記事です。(12/4 20時現在、3日目はまだ上がっていないので)2日目は @7shi さんの F#を教えるための環境構築 - 七誌の開発日記 でした。

MailboxProcessor について

MailboxProcessor は F# に標準でライブラリに組み込まれている非同期メッセージ処理用の機能です。以前、私のブログで取り扱ったことがあります。

#102 MailboxProcessorで非同期プログラミング - a wandering wolf

値をメッセージとして MailboxProcessor (以下、「アクター」と呼びます)に渡すと、それを受けて何らかの処理をする。結果が必要な場合もメッセージとして受け取る。そういう感じの動作をするのがこの MailboxProcessor です。

結果は同期的にも非同期的にも受け取ることが出来るため、非同期処理に使われることも多いです。

本記事の目的

この MailboxProcessor に単純な処理を非同期で並列に実行させてみましょう。簡単に処理時間も計測してみます。(あくまで比較するための参考値です)

(* f は計測対象 *)
let timer (f: unit -> unit) =
    let sw = System.Diagnostics.Stopwatch()
    sw.Start()
    f()
    sw.Stop()
    printfn "処理時間: %d[ms]" sw.ElapsedMilliseconds

私のブログでは、「困ったときは処理時間計測ネタ」をモットーにしております。ミヤモト・マサシもそうしろって言ってた。

Read more...

]]>
Wed, 04 Dec 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/11/28/link_error_due_to_static_member_variable.html http://gab-km.bitbucket.org/blog/html/2013/11/28/link_error_due_to_static_member_variable.html <![CDATA[static なメンバ変数のせいでリンクエラーになった話]]> static なメンバ変数のせいでリンクエラーになった話

C++ を書いていて、初心者なのでいろんなことにつまづきます。先日も、リンクエラーに2時間ほど苦しめられていました。

以下がサンプルコードです。コードはあくまでサンプルなので気になさらず。

Read more...

]]>
Thu, 28 Nov 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/11/21/typical_of_cplusplus_file_io.html http://gab-km.bitbucket.org/blog/html/2013/11/21/typical_of_cplusplus_file_io.html <![CDATA[C++ らしいファイル入出力]]> C++ らしいファイル入出力

最近、故あって C++ にどっぷり浸かる日々を過ごしております。C++ はほとんど触ったことがないので、日々勉強するしかない状況です。

そんな私が1から C++ を勉強するために読んでいるのが、以下の2冊です。

Accelerated C++ - 効率的なプログラミングのための新しい定跡

Exceptional C++ - 47のクイズ形式によるプログラム問題と解法

この2冊はどちらも大変素晴らしい書籍です。後者は「全人類が読むべき書籍」の堂々第1位 [1] ですし、全人類が読むべきです。

ファイル入出力

さて、そんなところで C++ らしいファイル入出力について調べていました。私は C 言語もほとんど触ったことがない情弱エンジニアですが、C だと fopen 関数とか使うんですよね…?

で、どうもストリームを利用するのが C++ らしいやり方のようです。

#include <iostream>
#include <fstream>
#include <string>

int main(int argc, char* argv[]) {
    // ファイル入力ストリームの初期化
    std::ifstream ifs("C:\\home\\himitsu.txt");

    std::string line;
    while (std::getline(ifs, line)) {
        // ファイルの中身を一行づつ表示
        std::cout << line << std::endl;
    }

    // ファイル出力ストリームの初期化
    std::ofstream ofs("C:\\home\\nazo.txt");

    // ファイルに1行ずつ書き込み
    ofs << "ham" << std::endl;
    ofs << "egg" << std::endl;
    ofs << "spam" << std::endl;

    return 0;
}

これ、ファイルストリームがスコープを抜けたらデストラクタが走って、適切に資源を開放してくれるから閉じる処理が要らないんですね(明示的に閉じてもいい)。楽ちんです。

ところで、これが C++ らしいファイル入出力のやり方だとは思うんですが、果たしてモダンなやり方でもあるんでしょうか?「今どきの C++er はこんなことしないよ!」ってなってたりするんでしょうか…。

[1]http://twitter.com/kinaba/status/7062808769 および http://twitter.com/kinaba/status/7063275788 を参照
]]>
Thu, 21 Nov 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/10/21/pyparsec_0_7_released.html http://gab-km.bitbucket.org/blog/html/2013/10/21/pyparsec_0_7_released.html <![CDATA[PyParsec 0.7 をリリースしてみました]]> PyParsec 0.7 をリリースしてみました

その昔、こんなライブラリを書いておりました。

PyParsec - Bitbucket

パーザオブジェクトを介して文字列をパースしていくというものです。出来についてはお察し。

さて、この俺俺パーザコンビネータですが、約2年半ぶりに更新してみました。放置していた issue (bug fix)に対応するためのバージョンアップです。このバグに対応するために、内部構造をかなり書き換えたので、API もかなり変更しました。

修正前は

>>> from pyparsec.primitives import symbol
>>> parser = symbol('a')
>>> parser.parse("abcde")
[('a', 'bcde')]
>>> parser.run("abcde")
'a'

という感じだったんですが、修正後は

>>> from pyparsec.primitives import symbol
>>> parser = symbol('a')
>>> parser.parse("abcde").result()
('a', 'bcde')

という感じになりましたね。どっちがいいかは分かりません。

なお、現在も既知のバグがあり、おそらく未知のバグも隠れているという状況です。内部の作りも大変にアレしているので、よろしければ Pythonista 諸氏にどしどし修正していただきたいです(自分でやれ

バージョニングについては、最初の方にちょっとした修正で 0.1 上げちゃっていたために、無駄に 0.7 まで来てしまっているのが最大の後悔ポイントですね。

以上、よろしくお願いいたします。

]]>
Mon, 21 Oct 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/08/30/review_on_github.html http://gab-km.bitbucket.org/blog/html/2013/08/30/review_on_github.html <![CDATA[GitHub 上でレビューしてみた]]> GitHub 上でレビューしてみた

昨日書いた記事「 FsCheck のドキュメントを翻訳しました 」で、FsCheck のドキュメントを数名で翻訳してレビューした、という話に触れました。この翻訳・レビューの作業は GitHub 上で行いました。

FsCheck翻訳プロジェクト - Gab-km/FsCheckDocsJP – GitHub

GitHub を使った理由で一番大きいのは、以前 こういう記事の翻訳をお手伝いした ことがあり、GitHub の pull request(PR) でレビューするのはどんな感じに機能するのかなぁ、というのに興味があった、ということです。

やってみての感想ですが、なかなか便利だなぁと思いました。

  • 目的の単位で PR を作って、その上でレビューする。
  • 指摘はファイルの行単位で付ける。
  • 何度か指摘と修正を繰り返して、その履歴を PR のページから確認する。
  • 完了したら PR をマージしてクローズする。

これだけで、それなりのレビューが出来たと感じています。以下にサンプルとして、ある PR におけるレビューの様子をご紹介します。

Update 2_properties_ja - Gab-km/FsCheckDocsJP – GitHub

それなんてフルボッコ…というのではなくて、レビュアーがしっかりレビューして、レビュイーがそれに応える。議論の履歴が残るので、お互いに後から確認がしやすい。PR のページだけで、これだけのことができてしまいます。GitHub の便利さに打ち震えるレベルです。

まぁ、私は Bitbucket も大好きなんですけどね!!!✌(‘ω’)

]]>
Fri, 30 Aug 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/08/29/translate_the_documentation_of_fscheck.html http://gab-km.bitbucket.org/blog/html/2013/08/29/translate_the_documentation_of_fscheck.html <![CDATA[FsCheck のドキュメントを翻訳しました]]> FsCheck のドキュメントを翻訳しました

ソフトウェアのテストを助けるためのツールが世の中には数多くあるかと思いますが、その中に QuickCheck というものがあります。

QuickCheck 勉強してみよう 最初の一歩の前段階 - いたわさににほんしゅ

掻い摘んで説明すると、QuickCheck は対象のプログラムがある性質を満たしているかをランダムに生成した入力を大量に食べさせて検査します。とっても便利なツールだと思いますが、F# 製の QuickCheck も開発されています。

fsharp/FsCheck - GitHub

まだまだ改善の余地はあるかと思いますが、現時点でもそれなりに使えますし、開発も比較的活発に行われているようです。

なかなか面白いプロダクトなので、もっと沢山の人に使ってほしいなぁと思い、ドキュメントを翻訳しようと思いました。

FsCheck / Docs / Documentation.md - GitHub

しかし、ちょっと分量がかなりのものなので、1人でやり切るには時間がかかりそう。そこで、有志を募って翻訳を進めることを考えました。

FsCheck コトハジメ - SlideShare (レイアウト崩れて読みにくくてごめんなさい…)

忙しい中、3名の F#er が手を上げてくださり、約1ヶ月の翻訳とレビューを経て、本日ようやく本家に取り込んでもらうことができました!

FsCheck / Docs / Documentation_ja.md - GitHub

この勝手翻訳プロジェクトに参加してくれた、 @kos39125@yukitos@pocketberserker (敬称略)の3名のおかげで、こうしてちゃんとしたものを送り出せたと思っています。改めて、この場を借りて彼らに感謝を表明します。

ということで、皆さん FsCheck 使いましょう!ヽ(‘ω’)ノ三ヽ(‘ω’)ノ

]]>
Thu, 29 Aug 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/08/09/using_webclient_via_proxy_with_authentication.html http://gab-km.bitbucket.org/blog/html/2013/08/09/using_webclient_via_proxy_with_authentication.html <![CDATA[認証付きプロキシ経由で WebClient を使う]]> 認証付きプロキシ経由で WebClient を使う

.NET 系の言語で System.Net.WebClient を使ってゴニョゴニョすること、よくあるかと思います。

namespace WebClientSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var wc = new System.Net.WebClient())
            {
                var result = wc.DownloadString("http://example.com/");
            }
        }
    }
}

多くの場合はこれで指定した URL からデータを取得できるんですが、場合によってはうまくいきません。例えば、私の業務環境では認証付きプロキシ経由でインターネットに接続する必要があり、上記のコードを社内で実行すると HTTP コード 407 が返ってきてしまいます。

こういう時に System.Net.WebProxySystem.Net.NetworkCredential を使います。

namespace WebClientSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var wc = new System.Net.WebClient())
            {
                // プロキシサーバの URL とポートを指定する
                var proxy = new System.Net.WebProxy("http://example.org:8080/");
                // 認証用のユーザ名とパスワードを設定する
                proxy.Credentials = new System.Net.NetworkCredential("user", "pass");
                wc.Proxy = proxy;
                var result = wc.DownloadString("http://example.com/");
            }
        }
    }
}

楽しい!!✌(‘ω’✌ )三✌(‘ω’)✌三( ✌’ω’)✌

]]>
Fri, 09 Aug 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/08/08/operating_files_in_python.html http://gab-km.bitbucket.org/blog/html/2013/08/08/operating_files_in_python.html <![CDATA[Python でのファイル操作]]> Python でのファイル操作

多くのプログラミング言語では、ファイルにアクセスする機構を持っていると思います。もちろん Python にもあります。

ただ、あまり公式ドキュメントに詳しく載ってない(チュートリアルと open 関数のところくらい?)なので、意外と馴染みが薄い場合もあるかもしれません。そこで、メモ書き程度にファイルオブジェクトの簡単な使い方を書き残してみます。

Read more...

]]>
Thu, 08 Aug 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/06/10/try_to_install_ipython_for_python_3_into_windows.html http://gab-km.bitbucket.org/blog/html/2013/06/10/try_to_install_ipython_for_python_3_into_windows.html <![CDATA[Windows に Python 3 の IPython を入れてみた]]> Windows に Python 3 の IPython を入れてみた

IPython ってありますよね。色がついて綺麗な Python のインタラクティブ環境です。昨年、私用の Windows 7 機にインストールしていたんですが、先日、会社で使っている Windows XP(!) 機にもインストールしてみました。

メイン使いが Python 3.3 なので、Python 3 on Windows 環境で動く IPython のインストール方法です。

Read more...

]]>
Mon, 10 Jun 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/06/06/some_powershell_tips.html http://gab-km.bitbucket.org/blog/html/2013/06/06/some_powershell_tips.html <![CDATA[PowerShell のよしなしごと]]> PowerShell のよしなしごと

ちょっと PowerShell を触る機会が増えまして、自分で忘れないために書き残していきます。

外部ファイルを実行する

カレントディレクトリにあるファイルなら Invoke-Item で、Path が通っているなら Start-Process で実行できます。 & (Invoke-Expression のエイリアス)も使えるみたいですね。

PS C:\Users\Gab_km> Invoke-Item .\EraseAdventureBook.exe
おきのどくですが
ぼうけんのしょ 1ばんは
きえてしまいました。

PS C:\Users\Gab_km> Start-Process fsi   # F# Interactive が立ち上がる
PS C:\Users\Gab_km> & python            # Python インタプリタが立ち上がる
Python 3.3.1 (v3.3.1:d9893d13c628, Apr  6 2013, 20:25:12) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Start-Process はオプション無しなら別プロセスとして実行し、 & は実行した PowerShell プロセスと同じプロセス上で実行するようです。

なお、 Start-Process では、パラメータを渡すこともできます。

PS C:\Users\Gab_km> Start-Process php-cgi -ArgumentList "-b 127.0.0.1:9000"

/dev/null 的なところにリダイレクトする

コマンドプロンプト当時も NUL にリダイレクトすることで、出力を捨てることが出来ました。PowerShell でも、リダイレクトを捨てることができます。

PS C:\Users\Gab_km> dir > $null
PS C:\Users\Gab_km> dir 2> Out-Null

2番目の 2> は、コマンドプロンプト時代にもあった、標準エラー出力のリダイレクトです。

errorlevel の代わりになる $?

コマンドプロンプトだと、直前のコマンドの失敗を if errorlevelecho %errorlevel% で確認することが出来ました。PowerShell だと $? 変数に bool 値が格納されるようです。

PS C:\Users\Gab_km> ? hoge
Where-Object : パラメーター 'FilterScript' をバインドできません。"hoge" の値を "System.String" 型から "System.Managemen
t.Automation.ScriptBlock" 型に変換できません。
発生場所 行:1 文字:2
+ ? <<<<  hoge
    + CategoryInfo          : InvalidArgument: (:) [Where-Object]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.WhereObjectCommand
PS C:\Users\Gab_km> $?
False
PS C:\Users\Gab_km> ping 127.0.0.1 -n 1

Pinging 127.0.0.1 with 32 bytes of data:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
PS C:\Users\Gab_km> $?
True

$? には、コマンドの成功時に True 、失敗時に False が格納されるようです。

]]>
Thu, 06 Jun 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/05/21/add_tweet_button.html http://gab-km.bitbucket.org/blog/html/2013/05/21/add_tweet_button.html <![CDATA[Tweet ボタンを追加してみた]]> Tweet ボタンを追加してみた

Tinkerer で書いておりますこのブログ、もうちょっとカスタマイズしてみたいと思って、Tweet ボタンを付けてみました。

追加は簡単で、 _templates/page.html に以下の様な記述を追加するだけです。

{% extends "!page.html" %}

{% set script_files = script_files + ["_static/google_analytics.js"] %}

{%- block body %}
    <div class="section_head">
    <div class="timestamp_layout">
      {{ timestamp(metadata.formatted_date) }}
    </div>
    {% block buttons %}
    <div class="buttons">
      <a href="https://twitter.com/share" class="twitter-share-button" data-lang="ja">ツイート</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
    </div>
    {% endblock %}
    </div>
    {{ link }}
    {{ body }}
    {{ post_meta(metadata) }}
    {{ comments }}
{% endblock %}

注意するところとしては、8行目の timestamp マクロが少し前(2012年12月頃?)に引数の変更があったようで、バージョンによっては2引数を求められるかもしれません。

なお、 a タグと script タグの中身は ここ から作ります。

ちなみに

この変更のためにブログのURL、と言うか Bitbucket のアカウント名(gab_km -> gab-km)を変更しました。それは、この素敵なエントリの中で警告されていた、あるポイントが問題になったからです。

BitBucketで無料ブログをつくる方法 -TinkererとMercurialでバージョン管理可能なブログをつくる- — うさぎ組

ここで注意が!!!! DISQUSはURLにアンダースコアを含んでいると動作しません。つまり、kyon_mm.bitbukcet.orgはダメで、kyon-mm.bitbucket.orgは問題ありません。僕のアカウントは本当はkyon_mmなのですが、このためだけにBitBucketのアカウント名をkyon-mmにするという決断をしました。非常に残念です。(RFC的にはアンダースコアもURLとして使えるので)

これ、Tweet に引用する URL の解決にも影響があることが分かりました…orz

やはり、下心があると、何事も上手くいかんもんですなぁ(´・ω・`)

]]>
Tue, 21 May 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/05/17/using_keyboard_macro_on_emacs.html http://gab-km.bitbucket.org/blog/html/2013/05/17/using_keyboard_macro_on_emacs.html <![CDATA[Emacs でキーボードマクロを使う]]> Emacs でキーボードマクロを使う

はじめに

いつも忘れちゃうので、メモ代わりに書き残します。

C-x (
キーボードマクロの定義を開始します。 このコマンドを実行したあとに行った操作を記録していきます。
C-x )
キーボードマクロの定義を終了します。 C-x ( を実行してからこのコマンドを実行するまでに行った操作が記録されます。
C-x e
記録したキーボードマクロを実行します。

Read more...

]]>
Fri, 17 May 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/05/10/csharp_programming_for_yutori_generations.html http://gab-km.bitbucket.org/blog/html/2013/05/10/csharp_programming_for_yutori_generations.html <![CDATA[ゆとり世代のための C# プログラミング #yutori_history]]> ゆとり世代のための C# プログラミング #yutori_history

はじめに

これは、 ゆとり Advent Calendar の10日目のエントリーです。

9日目は @y_uuk1 さんの ゆとりbotで学ぶ転職の極意 #yutori_history でした。

皆さんの記事を読んでいると、どうも技術系のエントリが少ないなぁと思いましたので、ここらで硬派な記事をゆとりさん(@megascus)に叩きつけたいと思います。

改めまして、ゆとりさん、転職おめでとうございます!ゆとりさんが次職でどのようなお仕事をされるのか期待が高まりますが、前職で一時期 C# を触られていたことを思い出します。

もしかしたら、また C# を触る可能性もあるので、「ゆとり世代のための C# プログラミング」というものをご提案しようと考えた次第です。

Read more...

]]>
Fri, 10 May 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/04/09/introduction_to_the_d_programming_language_from_local_time.html http://gab-km.bitbucket.org/blog/html/2013/04/09/introduction_to_the_d_programming_language_from_local_time.html <![CDATA[local time から始めるD言語入門]]> local time から始めるD言語入門

local time から始めるプログラミング言語入門 - secretbase.log に触発されて、ここに上がっていないD言語で書いてみることにしました。

import std.stdio;
import std.string;
import std.datetime;

void main()
{
  auto ct = Clock.currTime();
  auto localTimeString =
    format("%04d/%02d/%02d %02d:%02d:%02d",
            ct.year, ct.month, ct.day, ct.hour, ct.minute, ct.second);
  writeln(localTimeString);
}

実行してみます。

C:\home\Gab_km\localTime>rdmd localTime.d
2013/04/09 14:53:27

std.datetime の使い方がこれでいいのかはちょっと微妙。あと、 toString メソッドがフォーマット文字列を受けてくれると便利なんですけどねぇ。

]]>
Tue, 09 Apr 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/03/21/how_to_use_draft.html http://gab-km.bitbucket.org/blog/html/2013/03/21/how_to_use_draft.html <![CDATA[ドラフトの使い方]]> ドラフトの使い方

Tinkerer のコマンドに、 –draft オプションがあります。 –post オプションは分かりやすかったんですが、このオプションの使い方がよくわかっていませんでした。

…単純に、公式ドキュメントの読み込み不足でしたけどね。

Drafts - Tinkerer Reference

  1. 記事名を指定してドラフトを作成する
tinker --draft 'Hello World!'
  1. ドラフト上で記事を書き上げる
  2. 書いたドラフトを投稿用に変更する
tinker --post drafts/hello_world_.rst
  1. 問題無さそうならビルドする
tinker --build

こんな感じです。

その他、作成中のドラフトに対してプレビューが見たい場合、 –preview オプションを使います。

tinker --preview drafts/hello_world_.rst
]]>
Thu, 21 Mar 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/03/21/create_bitbucket_pages.html http://gab-km.bitbucket.org/blog/html/2013/03/21/create_bitbucket_pages.html <![CDATA[Bitbucket Pages を作ろう]]> Bitbucket Pages を作ろう

GitHub Pages ってあるけど、Bitbucket にも同じようなスペースが作れるみたい。

やったこと。

  1. Bitbucket 上に <username>.bitbucket.org というリポジトリを作る
  2. ローカルのコミットを 1. のリポジトリに push する
  3. みんなのツッコミを待つ

Bitbucket Pages も GitHub Pages と同じくらい簡単に作れますね。

]]>
Thu, 21 Mar 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/03/20/code_block_test.html http://gab-km.bitbucket.org/blog/html/2013/03/20/code_block_test.html <![CDATA[code block test]]> code block test
let fibonacci x =
    let rec fib = function
    | a when a > 1 -> (fib (a-1)) + (fib (a-2))
    | _            -> 1
    fib x
fibonacci 5

表示されたかな?

]]>
Wed, 20 Mar 2013 00:00:00 +0900
http://gab-km.bitbucket.org/blog/html/2013/03/20/first_post.html http://gab-km.bitbucket.org/blog/html/2013/03/20/first_post.html <![CDATA[first post]]> first post

Hello Tinkerer! ;-)

]]>
Wed, 20 Mar 2013 00:00:00 +0900