Hatena::ブログ(Diary)

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

2015年07月27日

ハイスピード通信的なやつ

| ハイスピード通信的なやつを含むブックマーク ハイスピード通信的なやつのブックマークコメント

Adventures in High Speed Networking on Azure | Age Of Ascent

以前、ハイパフォーマンスASP.NETについてちょっと書いた時にTechEmpowerのベンチマークに触れたけど、

今回紹介する記事ではプレーンテキストのレスポンスに特化してあれこれ考察してる。

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

2015年07月01日

Microsoft MVP for .NET 継続受賞しました

| Microsoft MVP for .NET 継続受賞しましたを含むブックマーク Microsoft MVP for .NET 継続受賞しましたのブックマークコメント

カテゴリは微妙に変わりつつ、おかげさまで8年目になります

今年はなんかコミュニティとか勉強会とか立ちあげられたらなと思ってます。

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

2015年05月26日

Synaptics Touch Padが動かない

| Synaptics Touch Padが動かないを含むブックマーク Synaptics Touch Padが動かないのブックマークコメント

f:id:matarillo:20150526211048p:image

コネクタからケーブルを引っこ抜いても、また接続してもこれが出るのは、やっぱりHWがどこかまずいのかしら。

ついこないだマザーボードもタッチパッドも交換してるんだけどなあ。ケーブルなのかな。

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

2015年04月28日

Build 2015の個人的に興味あるセッション

| Build 2015の個人的に興味あるセッションを含むブックマーク Build 2015の個人的に興味あるセッションのブックマークコメント

MS開発者向けイベントBuild 2015が目前に迫ってきたところでセッション概要が公開になりました

自分の関心はこのあたりに。

(追記)タグついてないセッションなどをいろいろ見逃してたので後で追加よてい

クロスプラットフォームWeb

Cross-Platform Web and Cloud Development (see online catalog after keynote for updated title)

キーノートの後でタイトルが変わります、とあるし、しかも話者がエリックガンマとJohn Papaだし、なんか面白いことやってくれるのかな。

タグには「.NET」「TypeScript」「Node.js」とある。

(追記)Visual Studio OnlineでのNode.js開発進化する感じ?

TypeScriptの未来

The Future of TypeScript: ECMAScript 6, Async/Await and Richer Libraries

Anders Hejlsbergと仲間たち(Brad Green、Miško Hevery)のセッション。

Microsoft Band

Microsoft Band: Developing for Microsoft Band and Microsoft Health

欲しいかと言われるとそんなでもないけど、変なデバイスは多い方が世の中が面白い。

Windows/iOS/Android向けアプリケーションをVSで

Strategies for Developing Cross-Platform Applications with Visual Studio 2015

CordovaにするのかXamarinにするのか、とかそういう選択肢の話っぽい。

Cordova

Getting Started with Cross-Platform Mobile Development with Apache Cordova

で、Cordovaの紹介。Level 200だし、深い話はなさそうなんだけど。

Xamarin

Go Mobile with C#, Visual Studio and Xamarin

こっちはXamarinからMiguelと大山さん(Montemagnoさん)。

Cortana

Cortana and Speech Platform In Depth

音声コマンド定義とかそういう話。オッケーグーグル。

生体認証とMicrosoft Passport

Microsoft Passport and Windows Hello: Moving Beyond Passwords and Credential Theft

パスポートってまだあったんだ……

WindowsのUIデザイン

Windows Design for Developers: An Executive Panel

Windows 10で崩壊するModern UIなんて記事を読んだとこだし、ネガティブ意味で興味ある

OSSを使ってUniversalアプリ

Windows + Open Source Software

FFMPEGとSQLiteを使ってアプリを書く、という内容だけなら大して面白くないけど、とまれMSがOSS推しなのは応援したい

SpartanのF12開発者ツール

What’s New in F12 for "Project Spartan"

Diagnostics Adapterの話もするのかな?

Spartanの概要

"Project Spartan": Introducing the New Browser and Web App Platform for Windows 10

Level 200だし、こっちも深い話はなさそう。

UniversalアプリのUXパターン

Design: UX Patterns and Responsive Techniques for Universal Windows Apps

Universalアプリ自体にはあまり興味ないんだけど、考え方として得るものがあればいいな

PythonとNode.js

Python and Node.js: Microsoft’s Best Kept Secrets

「without sacrificing ...」というあたりで「まだxxで消耗してるの?」というフレーズが浮かんだ。

Windows 10とSSO

Single Sign-On with Secure Authentication

Enterpriseタグがついてるので、おしごと的には一応押さえておくかな

Cordovaでストアアプリ

Hosted Web Apps and Web Platform Innovations

Cordova推しだなあ。Edgeレンダリングエンジンによってパフォーマンスが上がったとかそういう話なのかな。

Spartanのレンダリングエンジン

The "Project Spartan" Rendering Engine That Makes the Web Just Work

https://status.modern.ie/ で公開してる情報がBuildにあわせて更新されるのかな。

ECMAScript6とChakra

What’s New in JavaScript for Fast and Scalable Apps

どんどんおやりなさい。でもどうせならコンソールからももっと簡単に使えるとうれしいなあ。WSH……

.NET 2015のまとめ

A Lap Around .NET 2015

ランタイムだけじゃなくてWPFの話もするっぽい

LinuxやMacで.NET

Taking .NET Cross-Platform: Building .NET Applications on Linux and Mac

ASP.NET Core 5の話かな。デスクトップの話とかはさすがにないだろう。

Roslyn

.NET Compiler Platform ("Roslyn"): Analyzers and the Rise of Code-Aware Libraries

ufcppさんから聞く方が効率てk……なんでもないです。





(以下追加)





Azure Networking API

Building Network Aware Applications Using Azure Rapid Prototyping (RP)

インフラ大事

AzureでMicro ServicesのPaaS

The Next Generation of Azure Compute Platform with Mark Russinovich

マーク・ルシノビッチのセッション

Docker on Azure

Thinking in Containers: Building a Scalable, Next-Gen Application with Docker on Azure

Igniteでも同じセッションがある様子

Entity Framework 7

Entity Framework 7: Data for Web, Phone, Store, and Desktop

あまり好きではないが抑えとして

ASP.NET 5

Deep Dive into ASP.NET 5

Scott Hanselmanのセッション

Vision API

Vision APIs: Understanding Images in Your App

Vision APIとはこいつのことらしい画像処理ライブラリ。ImageMagick的なやつなのかな。

ANGLE(OpenGL ES 2.0のDirectX11による実装)

ANGLE: Running OpenGL ES 2.0 Graphics Code on Windows

Angleとはこいつのこと。Googlerが開発してる。

VS2015のWeb Tool

Modern Web Tooling in Visual Studio 2015

Mads Kristensenのセッション。GulpとかBowerとか。

クロスプラットフォームな継続的デリバリ

Cross-Platform Continuous Delivery with Release Management to Embrace DevOps

DSCとASP.NET coreの話らしい

Office Graph

Building Solutions with Office Graph

Office365のソーシャル機能とか。このあたりも

AngularとTypeScriptとOffice 365 API

Building a Single-Page App Using Angular and TypeScript Using Office 365 APIs

O365 APIを呼び出すSPAということらしい。

VS2015のコンパイラとか

Compiler and Runtime Technologies in Visual Studio 2015 (see online catalog after keynote for updated title)

タグがC++とiOSなので、例のAndroid NDKサポートに加えてiOSサポートもBuildで公開になるのかな。

基調講演後のお楽しみ

Keynote Announcement Deep Dive (see online catalog after keynote for updated title)

何かが発表になった後で、それの説明をやるっぽい。

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年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