Hatena::ブログ(Diary)

猫とC#について書くmatarilloの雑記 Twitter

2015年03月21日

Mac大したことない

| Mac大したことないを含むブックマーク Mac大したことないのブックマークコメント

「開発環境はMac最強、Windowsとかw情弱乙w」みたいな勢いで言われることあるけども。

f:id:matarillo:20150321145108p:image

なーんだ大したことないじゃん。だったらLinux使おうぜ。

(追記)エッゾーエさんのask.fm(とtwitter)で触れられたのでちょとだけ補足すると、手で入れるなら最新が入るので、そこはウィンドーズとは比べ物にならない。(ウィンドーズでも、CygwinやMSYS2なら新しいGitが手に入るけどね)

Mac OS XでASP.NET MVC 5.2

| Mac OS XでASP.NET MVC 5.2を含むブックマーク Mac OS XでASP.NET MVC 5.2のブックマークコメント

MonoのサイトでMonoとXamarin Studioをダウンロード&インストールMonoはインストーラーがあれこれ処理するけど、Xamarin Studioのほうは例によってアプリケーションフォルダに放り込めばOK。(Xamarin社のブランディングによりアプリ名はXamarin Studioになってるけど中身はMonoDevelopだと思えばいい。モバイル開発のあれこれはインストールされない。)

Xamarin Studioを起動したらメニューから「アップデートをチェック」。今日やってみたときはバージョン5.7が5.8にアップデートされた。

無事更新が終わったら、スタート画面から「New Solution...」をクリックし、「ASP.NET MVC Razor Project with Unit Tests」を選ぶ。するとさっくりとひな形ができてる。

f:id:matarillo:20150321180523p:image

NuGetパッケージが更新されているようだけど、まずは気にせずにソリューションをビルドして、ビルドが通ったらデバッグ起動。

f:id:matarillo:20150321180524p:image

普通に動く。

vim化もできるようだし、VSが嫌いなIntelliJおじさんがどうしてもドトネトやらざるを得ないときはこっちにしてはいかがか。

トラックバック - http://d.hatena.ne.jp/matarillo/20150321

2015年03月12日

サロゲートペアとか

| サロゲートペアとかを含むブックマーク サロゲートペアとかのブックマークコメント

とあるJavaのコードをC#でリライトしてたのだが、UTF32(int)をUTF16(char)にカジュアルキャストしてるコードがあった。

もちろんバグなんだが、たまたまオーバーフローをチェックする設定のプロジェクトファイルだったから実行時にOverflowExceptionが出て気づいた。普段だったら気づかなかっただろうなあ。

ついかっとなって型を書いた。

struct Utf32
{
    public int CodePoint;
    public Utf32(int codePoint)
    {
        this.CodePoint = codePoint;
    }
}

C# にも(usingではない)型エイリアスがあれば不要かもしれないが、型検査で潜在バグを見つけたいという意図からすれば、intと暗黙に相互変換できてしまうとあまりうれしくない。(上の構造体にもキャスト演算子定義しなかった)

トラックバック - http://d.hatena.ne.jp/matarillo/20150312

2015年03月11日

WindowsのWeb PIでインストールされたPHPを消す方法

| WindowsのWeb PIでインストールされたPHPを消す方法を含むブックマーク WindowsのWeb PIでインストールされたPHPを消す方法のブックマークコメント

会社の後輩(Rubyist)とWindowsのえぐ味について話しながら「ほーらこんな感じでMySQLとPHPとECCubeが」とホイホイインストールしたのはいいが、PHPの消し方がわからん。コンパネのアンインストール一覧には出てないし、しかしphp.exeにはパスが通ってるし。

Uninstalling components : The Official Microsoft IIS Forumsに書いてあった。

  • %userprofile%\documents\iisexpress\config\applicationhost.config編集して、PHPを参照している<application>要素を消せ
  • 同じファイルFastCgiModuleを登録している<add>要素を消せ
  • %programfiles%\iis express\php\フォルダを消せ

これが終わったら、環境変数%PATH%からもPHPへのパスを消せばたぶんOK。

トラックバック - http://d.hatena.ne.jp/matarillo/20150311

2015年01月17日

GoAzure 2015 参加、そしてASP.NET 5 v1.0.0-beta2

| GoAzure 2015 参加、そしてASP.NET 5 v1.0.0-beta2を含むブックマーク GoAzure 2015 参加、そしてASP.NET 5 v1.0.0-beta2のブックマークコメント

金曜に【Japan Azure User Group】GoAzure 2015に参加してきました。

MSの中でOSSを推進しているScott Hanselmanが来日してセッションを持つということで、いろいろ聞いてきました。

そういえば以前、Scott Hanselmanのとある熱いブログ記事日本語に訳してました。

それはともかく。

いろいろ話を聞いてる間に ASP.NET 5のbeta2が出てたので、matarillo.comのASP.NET記事更新しておきました。

今のところの記事リストhttp://matarillo.com/aspnet/ にあります。

image

トラックバック - http://d.hatena.ne.jp/matarillo/20150117

2015年01月13日

新年の猫二匹

| 新年の猫二匹を含むブックマーク 新年の猫二匹のブックマークコメント

とにかく人間のベッドで丸くなる。

布団の上の二匹

image

トラックバック - http://d.hatena.ne.jp/matarillo/20150113

2014年12月16日

トラックバック - http://d.hatena.ne.jp/matarillo/20141216

2014年11月30日

初冬の猫の日向ぼっこ

| 初冬の猫の日向ぼっこを含むブックマーク 初冬の猫の日向ぼっこのブックマークコメント

テレビの横が具合いいらしい。

imageimage

トラックバック - http://d.hatena.ne.jp/matarillo/20141130

2014年11月17日

LinuxでASP.NET vNextを動かしたい…がまだ成功してない(追記)動いた

| LinuxでASP.NET vNextを動かしたい…がまだ成功してない(追記)動いたを含むブックマーク LinuxでASP.NET vNextを動かしたい…がまだ成功してない(追記)動いたのブックマークコメント

(2015-01-01追記)matarillo.com: 1 ASP.NET 5をLinuxにインストールする (手動) をご覧ください。libuvのインストールはもっとシンプルになりました。

(追記)MacOS Xのひとはこちらをご覧になるといいと思います。

(追記)何はともあれ最初Mono 3.4.1以降を入れること。ディストロのデフォルトパッケージで配布しているMonoはバージョンが古い可能性があるので(たとえばUbuntu14のMonoは3.2.8だ)、Xamarinのパッケージか、コミュニティパッケージを探すといい。

https://github.com/aspnet/home に書いてあるとおりに進めようとしているのだが、KVM*1を入れた後、kpm restoreでこけた。

Warning: FindPackagesById: Kestrel
  Error: SendFailure (Error writing headers)
  GET https://www.nuget.org/api/v2/FindPackagesById()?Id='Kestrel'.
(他にもいろいろ)

ぐぐってたらStackOverflowの回答が見つかった。理由はnuget経由でアセンブリをダウンロードする際に証明書がないから、とのこと。

$ sudo mozroots --import --machine --sync
$ sudo certmgr -ssl -m https://go.microsoft.com
$ sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
$ sudo certmgr -ssl -m https://nuget.org

で通るようになった。

続いて k kestrelを実行したら

$ k kestrel
System.DllNotFoundException: libdl
  at (wrapper managed-to-native) Microsoft.AspNet.Server.Kestrel.Networking.PlatformApis/LinuxApis:dlopen (string,int)
(以下略)

でこけた。

libdlはglibcの一部らしいが、それが見つからないというのはLinux Mint 17 Qiana Xfce (64-bit) 固有の状況かもしれない。

$ ldconfig -p | grep libdl
	libdl.so.2 (libc6,x86-64, OS ABI: Linux 2.6.24) => /lib/x86_64-linux-gnu/libdl.so.2
	libdl.so.2 (libc6, OS ABI: Linux 2.6.24) => /lib/i386-linux-gnu/libdl.so.2

うーむ。まだ解決してない。

(追記)

https://github.com/aspnet/Home/issues/172 を見て、Monoのデバッグ出力を設定。

$ export MONO_LOG_LEVEL=debug
$ export MONO_LOG_MASK="dll"

$ k kestrel

するといろいろ出力された。

(省略)
Mono: DllImport attempting to load: 'api-ms-win-core-file-l1-2-0.dll'.
Mono: DllImport error loading library '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll': '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
(省略)
Mono: DllImport error loading library 'libapi-ms-win-core-file-l1-2-0.dll': 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport attempting to load: '__Internal'.
Mono: DllImport loaded library '(null)'.
Mono: DllImport searching in: '__Internal' ('(null)').
Mono: Searching for 'ReadFile'.
Mono: DllImport attempting to load: 'api-ms-win-core-file-l1-2-0.dll'.
Mono: DllImport error loading library '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll': '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
(省略)
Mono: DllImport error loading library 'libapi-ms-win-core-file-l1-2-0.dll': 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport searching in: '__Internal' ('(null)').
Mono: Searching for 'ReadFile'.
Mono: DllImport attempting to load: 'libc.so.6'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6.so': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport loaded library 'libc.so.6'.
Mono: DllImport searching in: 'libc.so.6' ('libc.so.6').
Mono: Searching for 'uname'.
Mono: Probing 'uname'.
Mono: Found as 'uname'.
Mono: DllImport attempting to load: 'libdl'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl.so': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl': 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl.so': 'libdl.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl': 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport attempting to load: 'libdl'.
(省略)
Mono: DllImport unable to load library 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
System.DllNotFoundException: libdl
(省略)

ふむ、/lib の方を見に行ってないようだ。ldconfigでは見つかるのに。LD_LIBRARY_PATH必要なのか?と思って試しにexportしてみたが、やはりlibdlでこけた。うむー。

いやまて、上のデバッグ出力をよく見てみると、libcの方はKestrelの下を2回見に行ったあとで成功しているが、libdlは同じタイミングで「共有オブジェクトファイルを開けません」になってるな。/lib を見に行ってるけどうまく拾えていないとか?

(追記)issue 172にlibtoolとlibuvを入れたら通ったって言うのが出てるな。あとでやってみる。

(追記)issue 172のコメントを見て、libtoolを入れ、libuvのv1.0.0-rc2をビルドしてインストールし、libuv.dylibからlibuv.soにシンボリックリンクを貼ってみたが、やはりだめ。

$ k kestrel
System.NullReferenceException: Object reference not set to an instance of an object
  at Microsoft.AspNet.Server.Kestrel.Networking.Libuv.loop_size () [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.Server.Kestrel.Networking.UvLoopHandle.Init (Microsoft.AspNet.Server.Kestrel.Networking.Libuv uv) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.Server.Kestrel.KestrelThread.ThreadStart (System.Object parameter) [0x00000] in <filename unknown>:0 

コメントにあるように、Kestrelは1.0.0-alpha4じゃないとだめなのだろうか。違いはそこぐらいしかないのだが(自分環境は1.0.0-beta1だ)。

(追記)1.0.0-alpha4にしてみた。

$ cd ~/aspnet/Home
$ git checkout v1.0.0-alpha4
$ cd samples/HelloWeb
$ kpm restore

ってやって、

$ cd ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-alpha4/native/darwin/universal/
$ mv libuv.dylib libuv.dylib.org
$ ln -sf /usr/local/lib/libuv.so libuv.dylib

ってシンボリックリンクを貼って、

$ cd ~/aspnet/Home/samples/HelloWeb
$ k kestrel

ってやったら、動いた動いた。

f:id:matarillo:20141119222331p:image

(しかし、Ctrl-Cではkestrelを停止できずに、最後にはkill -9した→追記:libuvの1.0.0正式版だったら大丈夫になった)

(12/26追記)libuv.dylibからlibuv.soにシンボリックリンクを貼る以外の方法があるようだ。後で試して、記事自体を書きなおすか……→書いた。

*1:これホント名前がよくない。KVMといえばふつうはKernel-based Virtual Machineだ

トラックバック - http://d.hatena.ne.jp/matarillo/20141117

2014年10月15日

パーサーコンビネーターって書きたくなるよね、C#的なまとめ

| パーサーコンビネーターって書きたくなるよね、C#的なまとめを含むブックマーク パーサーコンビネーターって書きたくなるよね、C#的なまとめのブックマークコメント

パーサーコンビネーターっていうのはオブジェクトをぺこぺこ結合することで望みのパーサーを合成できるっていう、そういったたぐいのもの

「なんでLINQなんだ?」と疑問に思った方は、私のサイトのモナド解説記事でも呼んでいただければ幸い。

トラックバック - http://d.hatena.ne.jp/matarillo/20141015

2014年10月10日

Re: Scala の implicit parameter は型クラスの一種とはどういうことなのか

| Re: Scala の implicit parameter は型クラスの一種とはどういうことなのかを含むブックマーク Re: Scala の implicit parameter は型クラスの一種とはどういうことなのかのブックマークコメント

Scala の implicit parameter は型クラスの一種とはどういうことなのか - 猫型の蓄音機は 1 分間に 45 回にゃあと鳴くのブックマークコメント

(続く記事も読みました)C#/Java的に言うと、型クラスは型制約なんですよね。とある型をとある型クラスのインスタンスに「後から」できるかどうかは本質ではないという理解

matarilloのコメント

と書いたらば、

型制約というだけならば trait でいいじゃないかという話になってしまい、わざわざ型クラスを導入するメリットがないので、やはり既存の型に対する拡張が可能というのは型クラスの本質(の一部)ではないかなぁという理解をわたしはしています。実際型クラスの存在しない C#/Java でも、サブタイピングでの型制約は実現できているわけですし、「なぜわざわざ型クラスを導入する必要があるのか」という視点から見ると、サブタイピングでは実現できない柔軟さを実現する必要があるからかな、と思います。「そうじゃないんだ」「それはこういう理由で本質的には型制約と同等なのだ」という意見があれば是非参考にしたいので教えてください。

Scala の implicit parameter は型クラスの一種とはどういうことなのか - 猫型の蓄音機は 1 分間に 45 回にゃあと鳴く

という追記がついたので、すこし補足しておきます。

型クラスに対するわたしの理解は、Philip Wadler と Stephen Blottの論文 "How to make ad-hoc polymorphism less ad hoc(PDF)"をベースにした、「パラメトリック多相とアドホック多相の中間」です。

パラメトリック多相はC#/Javaでいうところのジェネリクスですね。一方、アドホック多相はC#/Javaではメソッド演算子オーバーロードがそれにあたります。この区分ML言語でもたぶん同じと理解してます(間違ってたら誰かコメントください)。Haskellにはオーバーロードがなく、アドホック多相を実現するには型クラスを使うことになるのですが、型クラスをパラメトリック多相の側から見れば、英語版Wikipediaのように Bounded parametric polymorphism(境界のあるパラメトリック多相) ととらえることもできると理解しています。

で、C#/Javaにとっては、境界のあるパラメトリック多相に該当するのはジェネリクスの型制約しかないわけです。なので、「型クラスは型制約(の仲間)」と言いたかったのですが、ブコメにはカッコの中を書かなかったので、なんだかおかしな主張をしているような感じになってしまいました。HaskellやScalaの型クラスが、C#/Javaの型制約と全くイコールだ、と言いたいわけじゃないんです。

C#/Javaの型制約は、継承をベースにしているので、インスタンスメソッドは呼べますが、静的メソッドは呼べません。C#のジェネリクスで、演算子が使えなくてイライラした人も多いのではないでしょうか?(C#のジェネリクスが値型も対象にできるのはいいことなんですが、算術演算に悩んだりとか、ありますよね。)型クラスは型に対して関数が定まる仕組みですから、C#/Javaから見ればむしろ全てが静的メソッドですね。さらに、ある型クラスがほかの型クラスを拡張するという仕組みもあり、そういうのをC#/Javaでシミュレートしようとすると、インスタンスメソッド群を定義したオブジェクトを追加のパラメータとして渡す、いわゆる「貧者の型クラス」にするしかないわけです。そこを暗黙のパラメータを使って、明示的に渡さなくても推論させることができるのがScalaの型クラスです。

と、ここまでなら暗黙の変換はいらないわけですが、「既存の型に対する拡張」ができた方が自由度が高くて便利だし、実際Haskellの型クラスだってinstance宣言を後付けできるわけです(こちらも間違ってたら誰かコメントください)。“Haskellの”型クラスと同じことをScalaでやるには、暗黙の変換を使うという風に理解していますが、それがもしできなかったとしても、継承をベースとした型制約にできないことが型クラスではできる、ということに違いはないのではないでしょうか。

トラックバック - http://d.hatena.ne.jp/matarillo/20141010

2014年10月06日

続々・C#のジェネリクスで型クラスを真似る

| 続々・C#のジェネリクスで型クラスを真似るを含むブックマーク 続々・C#のジェネリクスで型クラスを真似るのブックマークコメント

前回のエントリ

F# で高階型のエミュレーション - pocketberserkerの爆走」およびその記事で紹介されているhighjを参考にするとこんな感じになるだろうか。

GitHub Gist

前回のエントリだと、値クラスMaybe<T>抽象クラスMonad<T>を継承していたが、この実装だとメソッドを持たないマーカーインターフェース_<T, TValue>を実装するだけだからシンプルだと思う。ただし、型クラスもどきインスタンスを意識的に渡す必要はある。

また、これは前回のエントリと同じだけど、型クラスもどきのメソッドを呼び出すたびにMonad<Maybe.µ, T>Functor<Maybe.µ, T>にアップキャストされてしまうので明示的なダウンキャストでMaybe<T>に戻さないといけなくなる。

トラックバック - http://d.hatena.ne.jp/matarillo/20141006

2014年09月16日

Windowsのことですね、わかります

| Windowsのことですね、わかりますを含むブックマーク Windowsのことですね、わかりますのブックマークコメント

まあPowerShellについては、なんというか簡単じゃないよね……

ジャバにもとばっちりきてる

----

奥さんは「多様性は善」とかぬかす権利ないな。それはともかく。

まあ、このあたりのこともねえ、LLのインタプリタというよりはPOSIX互換レイヤ必要としないユーザーが多かったという文化からきてるよねえ。SUAもサポートされなくなったし。

トラックバック - http://d.hatena.ne.jp/matarillo/20140916

2014年09月14日

技術とコミュニティ

| 技術とコミュニティを含むブックマーク 技術とコミュニティのブックマークコメント

ここまででひとくぎり

https://pbs.twimg.com/media/BxZRW5tCEAADWvf.jpg

辰巳寿司 (たつみずし) - 月島/寿司 〔食べログ〕

追加

誰もがポジショントークするし、誰もがFUDするんだよね。。。

そういう話じゃないのなら、具体名をあげて殴り合いするのも楽しいですねー。

トラックバック - http://d.hatena.ne.jp/matarillo/20140914

2014年09月13日

マーシャリングとシリアライゼーション

| マーシャリングとシリアライゼーションを含むブックマーク マーシャリングとシリアライゼーションのブックマークコメント

聞かれてないけど。

f:id:matarillo:20140913044319p:image

マーシャリングはRPCで使われる言葉だけど、その中のMarshal By Valueがシリアライズの一部と一致する(Marshal By Referenceはシリアライズとは違う)。

逆に、シリアライゼーションから見れば、別にRPCに使われるとは限らない(永続化したいだけかもしれない)。

そんなイメージを持ってる。

トラックバック - http://d.hatena.ne.jp/matarillo/20140913

2014年09月08日

マイクロサービスとSOA

| マイクロサービスとSOAを含むブックマーク マイクロサービスとSOAのブックマークコメント

とりま本文からリンクされてるマーティンファウラー記事勝手に訳しました。

マイクロサービスとSOA (Microservices and SOA)

マイクロサービスについて語る時によく言われるのが「へぇー、この考え方って10年ぐらい前に流行ったただのサービス指向アーキテクチャ(SOA)だよね、10年前に見たわー」だ。……

https://gist.github.com/matarillo/a3fe1ba60e36e9e2827c

わたしの理解はこんなかんじ

この意見には納得する

けど、これにも共感する(乱暴だけども)

トラックバック - http://d.hatena.ne.jp/matarillo/20140908