Core CLR に切り替える

Core CLR は Side by side を dotnet framework ごとやるやつなので
dotnet framework アセンブリごとをWebに含めてdeployするようになる。
Webアプリごとにdotnet frameworkのバージョンを別にもてるようになる。


c:\oss\aspnet\Home>kvm upgrade -svrc50
c:\oss\aspnet\Home>kvm alias
Alias Name
----- ----
default KRE-svrc50-x86.0.1-alpha-build-0481

切り替わったようだ。


c:\oss\aspnet\Home>cd samples\HelloMvc
c:\oss\aspnet\Home\samples\HelloMvc>set KRE_TRACE=1
c:\oss\aspnet\Home\samples\HelloMvc>k web
Loaded Module: klr.core45.dll
Found DLL Export: CallApplicationMain
...

klr.net45.dll から klr.core45.dll に変わってもきちんと動いた。


>dir /S /B %USERPROFILE%\.kre\packages\KRE-svr50-x86.0.1-alpha-build-0481 | findstr .dll | wc -w
14
>dir /S /B %USERPROFILE%\.kre\packages\KRE-svrc50-x86.0.1-alpha-build-0481 | findstr .dll | wc -w
232

dllがものすごく増えるのでAzureへのdeployさらに遅くなりそうだな。。。
それともdeploy時にAzure側でdllをとってくるようになるのかな。。。

aspnet vnext でHello MVC


c:\oss\aspnet\Home\samples\HelloMvcWeb>kpm resore
c:\oss\aspnet\Home\samples\HelloMvcWeb>dir ..\..\packages /B
Common.1.0.0
K.Roslyn.0.1-alpha-build-0137
Microsoft.AspNet.Diagnostics.0.1-alpha-build-0682
Microsoft.AspNet.FeatureModel.0.1-alpha-build-0444
Microsoft.AspNet.FileSystems.0.1-alpha-build-0162
Microsoft.AspNet.Hosting.0.1-alpha-build-0572
Microsoft.AspNet.Http.0.1-alpha-build-0444
Microsoft.AspNet.HttpFeature.0.1-alpha-build-0444
Microsoft.AspNet.Mvc.0.1-alpha-build-1268
Microsoft.AspNet.Mvc.Core.0.1-alpha-build-1268
Microsoft.AspNet.Mvc.ModelBinding.0.1-alpha-build-1268
Microsoft.AspNet.Mvc.Razor.0.1-alpha-build-1268
Microsoft.AspNet.Mvc.Razor.Host.0.1-alpha-build-1268
Microsoft.AspNet.PipelineCore.0.1-alpha-build-0444
Microsoft.AspNet.Razor.0.1-alpha-build-0197
Microsoft.AspNet.RequestContainer.0.1-alpha-build-0572
Microsoft.AspNet.Routing.0.1-alpha-build-0577
Microsoft.AspNet.Security.0.1-alpha-build-0506
Microsoft.AspNet.Security.DataProtection.0.1-alpha-build-0153
Microsoft.AspNet.Server.WebListener.0.1-alpha-build-0520
Microsoft.Bcl.Immutable.1.1.20-beta
Microsoft.Bcl.Metadata.1.0.11-alpha
Microsoft.CodeAnalysis.Common.0.7.4051916-beta
Microsoft.CodeAnalysis.CSharp.0.7.4051916-beta
Microsoft.CSharp.4.0.0.0
Microsoft.DataAnnotations.0.1-alpha-build-0100
Microsoft.DataAnnotations.Core.0.1-alpha-build-0100
Microsoft.DataAnnotations.Supplemental.0.1-alpha-build-0100
Microsoft.Framework.ConfigurationModel.0.1-alpha-build-0233
Microsoft.Framework.DependencyInjection.0.1-alpha-build-0389
Microsoft.Framework.Logging.0.1-alpha-build-0172
Microsoft.Framework.Runtime.Interfaces.0.1-alpha-build-0446
Microsoft.Net.Server.0.1-alpha-build-0520
Microsoft.Win32.Primitives.4.0.0.0
Newtonsoft.Json.5.0.8
System.ApplicationContext.4.0.0.0
System.Collections.4.0.0.0
System.Collections.Concurrent.4.0.0.0
System.ComponentModel.4.0.0.0
System.Console.4.0.0.0
System.Diagnostics.Contracts.4.0.0.0
System.Diagnostics.Debug.4.0.10.0
System.Diagnostics.Tools.4.0.0.0
System.Dynamic.Runtime.4.0.0.0
System.Globalization.4.0.10.0
System.Globalization.Extensions.4.0.0.0
System.IO.4.0.0.0
System.IO.Compression.4.0.0.0
System.IO.FileSystem.4.0.10.0
System.IO.FileSystem.Primitives.4.0.20.0
System.Linq.4.0.0.0
System.Linq.Expressions.4.0.0.0
System.Net.Primitives.4.0.10.0
System.ObjectModel.4.0.0.0
System.Reflection.4.0.10.0
System.Reflection.Emit.ILGeneration.4.0.0.0
System.Reflection.Emit.Lightweight.4.0.0.0
System.Reflection.Extensions.4.0.0.0
System.Reflection.Primitives.4.0.0.0
System.Reflection.TypeExtensions.4.0.0.0
System.Resources.ResourceManager.4.0.0.0
System.Runtime.4.0.20.0
System.Runtime.Extensions.4.0.10.0
System.Runtime.Handles.4.0.0.0
System.Runtime.InteropServices.4.0.20.0
System.Runtime.Serialization.Primitives.4.0.0.0
System.Security.Claims.0.1-alpha-build-0286
System.Security.Cryptography.4.0.0.0
System.Security.Cryptography.Encoding.4.0.0.0
System.Security.Cryptography.HashAlgorithms.SHA2.4.0.0.0
System.Security.Cryptography.RandomNumberGenerator.4.0.0.0
System.Security.Cryptography.X509Certificates.4.0.0.0
System.Security.Principal.4.0.0.0
System.Security.SecureString.4.0.0.0
System.Text.Encoding.4.0.10.0
System.Text.Encoding.4.0.20.0
System.Text.Encoding.Extensions.4.0.10.0
System.Text.RegularExpressions.4.0.0.0
System.Threading.4.0.0.0
System.Threading.Overlapped.4.0.0.0
System.Threading.Tasks.4.0.0.0
System.Threading.Tasks.4.0.10.0
System.Threading.Thread.4.0.0.0
System.Threading.ThreadPool.4.0.10.0

大量だ。。。


c:\oss\aspnet\Home\samples\HelloMvcWeb>k run
'HelloMvc' does not contain a static 'Main' method suitable for an entry point

c:\oss\aspnet\Home\samples\HelloMvcWeb>k web
Started

http://localhost:5001/ でいつもの ASP.NET MVC のシンプルな奴が表示されるはずだがエラー。
バージョン番号はきちんとメンテされていないので最新を取ってくるように変更して


c:\oss\aspnet\Home\samples\HelloMvcWeb>git diff Project.json
diff --git a/samples/HelloMvc/project.json b/samples/HelloMvc/project.json
index ead5eca..23b0450 100644
--- a/samples/HelloMvc/project.json
+++ b/samples/HelloMvc/project.json
@@ -1,10 +1,10 @@
{
"version": "0.1-alpha-*",
"dependencies": {
- "Microsoft.AspNet.Diagnostics": "0.1-alpha-build-0682",
- "Microsoft.AspNet.Hosting": "0.1-alpha-build-0572",
- "Microsoft.AspNet.Mvc": "0.1-alpha-build-1268",
- "Microsoft.AspNet.Server.WebListener": "0.1-alpha-build-0520"
+ "Microsoft.AspNet.Diagnostics": "0.1-alpha-build-*",
+ "Microsoft.AspNet.Hosting": "0.1-alpha-build-*",
+ "Microsoft.AspNet.Mvc": "0.1-alpha-build-*",
+ "Microsoft.AspNet.Server.WebListener": "0.1-alpha-build-*"
},
"commands": {
"web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001"

c:\oss\aspnet\Home\samples\HelloMvcWeb>kpm restore
c:\oss\aspnet\Home\samples\HelloMvcWeb>k web
Started

http://localhost:5001/ でいつもの ASP.NET MVC のシンプルな奴が表示された。


c:\oss\aspnet\Home\samples\HelloMvc>dir /S /B /A-D
c:\oss\aspnet\Home\samples\HelloMvc\project.json
c:\oss\aspnet\Home\samples\HelloMvc\Startup.cs
c:\oss\aspnet\Home\samples\HelloMvc\Controllers\HomeController.cs
c:\oss\aspnet\Home\samples\HelloMvc\Models\User.cs
c:\oss\aspnet\Home\samples\HelloMvc\Views\Home\Index.cshtml
c:\oss\aspnet\Home\samples\HelloMvc\Views\Shared\_Layout.cshtml
c:\oss\aspnet\Home\samples\HelloMvc>type project.json
{
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.Diagnostics": "0.1-alpha-build-*",
"Microsoft.AspNet.Hosting": "0.1-alpha-build-*",
"Microsoft.AspNet.Mvc": "0.1-alpha-build-*",
"Microsoft.AspNet.Server.WebListener": "0.1-alpha-build-*"
},
"commands": {
"web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001"
},
"configurations": {
"net45": {
"dependencies": {
"System.Runtime": "",
"System.ComponentModel.DataAnnotations": ""
}
},
"k10": {}
}
}
c:\oss\aspnet\Home\samples\HelloMvc>type Startup.cs
using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;

namespace KWebStartup
{
public class Startup
{
public void Configure(IBuilder app)
{
app.UseErrorPage();

app.UseServices(services =>
{
services.AddMvc();
});

app.UseMvc();

app.UseWelcomePage();
}
}
}
c:\oss\aspnet\Home\samples\HelloMvc>type Controllers\HomeController.cs
using Microsoft.AspNet.Mvc;
using MvcSample.Web.Models;

namespace MvcSample.Web
{
public class HomeController : Controller
{
public IActionResult Index()
{
return View(User());
}

public User User()
{
User user = new User()
{
Name = "My name",
Address = "My address"
};

return user;
}
}
}

相変わらずファイルはBOMつきだな。。。。
Startup で DependencyInjection がいる。AddMvc でAsp.NET MVC で必要なクラスや Controller もコンテナに登録にいってる。
ActionResultからIActionResultに変更。
ViewBagは健在。Razor の構文はかわりなしな感じ。

Global.asax、Web.Conig がいない。
実際には https://github.com/aspnet/MusicStore/tree/dev/src/MusicStore をみると Web.Conig はいる。IISでうごかすためにもこれは残るのだろう。Razor も async/await している。。。

aspnet vnext でHello World

https://github.com/aspnet/Home にやり方がかいてあるので、その通りにやれば特にはまるところはなくきちんと動いてくれた。


c:\oss\aspnet>git clone https://github.com/aspnet/Home.git
c:\oss\aspnet>cd Home
c:\oss\aspnet\Home>kvmsetup.cmd
c:\oss\aspnet\Home>kvm install 0.1-alpha-build-0446 -p
c:\oss\aspnet\Home>kvm upgrade
c:\oss\aspnet\Home>kvm alias

Alias Name
----- ----
default KRE-svr50-x86.0.1-alpha-build-0481

ConsoleAppをビルド


c:\oss\aspnet\Home>cd samples\ConsoleApp
c:\oss\aspnet\Home\samples\ConsoleApp>dir /B
Program.cs
project.json
c:\oss\aspnet\Home\samples\ConsoleApp>type Program.cs
using System;

public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
}
}
c:\oss\aspnet\Home\samples\ConsoleApp>type project.json
{
"dependencies": {
"System.Console": "4.0.0.0"
},
"configurations": {
"net45": {},
"k10": {}
}
}
c:\oss\aspnet\Home\samples\ConsoleApp>kpm restore
c:\oss\aspnet\Home\samples\ConsoleApp>dir /B ..\..\packages
System.Console.4.0.0.0
System.IO.4.0.0.0
System.Runtime.4.0.20.0
System.Text.Encoding.4.0.10.0
System.Threading.Tasks.4.0.0.0
c:\oss\aspnet\Home\samples\ConsoleApp>k run
Hello World
c:\oss\aspnet\Home\samples\ConsoleApp>dir /B
Program.cs
project.json
c:\oss\aspnet\Home\samples\ConsoleApp>timeit k.cmd run
Hello World

Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:47 pm, Sunday, June 1 2014
Elapsed Time: 0:00:08.627
Process Time: 0:00:00.078
System Calls: 103159
Context Switches: 31389
Page Faults: 36450
Bytes Read: 724277
Bytes Written: 1996379
Bytes Other: 120388

c:\oss\aspnet\Home\samples\ConsoleApp>SET KRE_TRACE=1
c:\oss\aspnet\Home\samples\ConsoleApp>k run
Loaded Module: klr.net45.dll
Found DLL Export: CallApplicationMain
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.ApplicationHost
klr.exe Information: 0 : RootHost Assembly.LoadFile(Microsoft.Framework.ApplicationHost.dll)
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime
klr.exe Information: 0 : RootHost Assembly.LoadFile(Microsoft.Framework.Runtime.dll)
klr.exe Information: 0 : RootHost.Load name=Newtonsoft.Json
klr.exe Information: 0 : RootHost Assembly.LoadFile(Newtonsoft.Json.dll)
klr.exe Information: 0 : Project root is c:\oss\aspnet\Home\samples\ConsoleApp
klr.exe Information: 0 : Walking dependency graph for 'ConsoleApp .NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : [ProjectReferenceDependencyProvider]: ConsoleApp 1.0.0
klr.exe Information: 0 : [NuGetDependencyResolver]: System.Console 4.0.0.0
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime.resources
klr.exe Information: 0 : Loading Microsoft.Framework.Runtime.resources for '.NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime.Roslyn
klr.exe Information: 0 : RootHost Assembly.LoadFile(Microsoft.Framework.Runtime.Roslyn.dll)
klr.exe Information: 0 : RootHost.Load name=Microsoft.CodeAnalysis
klr.exe Information: 0 : RootHost Assembly.LoadFile(Microsoft.CodeAnalysis.dll)
klr.exe Information: 0 : RootHost.Load name=System.Collections.Immutable
klr.exe Information: 0 : RootHost Assembly.LoadFile(System.Collections.Immutable.dll)
klr.exe Information: 0 : RootHost.Load name=System.Reflection.Metadata
klr.exe Information: 0 : RootHost Assembly.LoadFile(System.Reflection.Metadata.dll)
klr.exe Information: 0 : RootHost.Load name=Microsoft.CodeAnalysis.CSharp
klr.exe Information: 0 : RootHost Assembly.LoadFile(Microsoft.CodeAnalysis.CSharp.dll)
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime.resources
klr.exe Information: 0 : Loading Microsoft.Framework.Runtime.resources for '.NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime.resources
klr.exe Information: 0 : Loading Microsoft.Framework.Runtime.resources for '.NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : RootHost.Load name=Microsoft.Framework.Runtime.resources
klr.exe Information: 0 : Loading Microsoft.Framework.Runtime.resources for '.NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : [ReferenceAssemblyDependencyResolver]: mscorlib 4.0.0.0, System 4.0.0.0, System.Core 4.0.0.0, Microsoft.CSharp 4.0.0.0
klr.exe Information: 0 : Resolved dependencies for ConsoleApp in 534ms
klr.exe Information: 0 : Loading entry point from ConsoleApp
klr.exe Information: 0 : RootHost.Load name=ConsoleApp
klr.exe Information: 0 : Loading ConsoleApp for '.NETFramework,Version=v4.5.1'.
klr.exe Information: 0 : [RoslynCompiler]: Found project 'ConsoleApp' framework=.NETFramework,Version=v4.5
klr.exe Information: 0 : [RoslynCompiler]: Loading dependencies for 'ConsoleApp'
klr.exe Information: 0 : [RoslynCompiler]: Completed loading dependencies for 'ConsoleApp' in 17ms
klr.exe Information: 0 : [RoslynCompiler]: Compiling 'ConsoleApp'
klr.exe Information: 0 : [RoslynCompiler]: Exported References 4
klr.exe Information: 0 : [RoslynAssemblyLoader]: Emitting assembly for ConsoleApp
klr.exe Information: 0 : [RoslynAssemblyLoader]: Emitted ConsoleApp in 4547ms
klr.exe Information: 0 : [LazyRoslynAssemblyLoader]: Finished loading ConsoleApp in 6884ms
klr.exe Information: 0 : Load took 7432ms
Hello World

kpm は npm のdotnet版みたいな感じだが nuget は健在だ。
会社のパソコンだと1秒以内で実行がおわるのでCPU性能に依存しているようだ。

visual C# ははやり早い。


c:\oss\aspnet\Home\samples\ConsoleApp>timeit csc.exe Program.cs
Microsoft (R) Visual C# Compiler version 12.0.30501.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.


Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:53 pm, Sunday, June 1 2014
Elapsed Time: 0:00:00.558
Process Time: 0:00:00.453
System Calls: 19638
Context Switches: 2780
Page Faults: 7390
Bytes Read: 79255
Bytes Written: 69232
Bytes Other: 45451

c:\oss\aspnet\Home\samples\ConsoleApp>timeit Program.exe
Hello World

Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:53 pm, Sunday, June 1 2014
Elapsed Time: 0:00:00.070
Process Time: 0:00:00.078
System Calls: 6569
Context Switches: 484
Page Faults: 4692
Bytes Read: 48117
Bytes Written: 55
Bytes Other: 19995

monoもそんなに遅くない。


c:\oss\aspnet\Home\samples\ConsoleApp>timeit mcs.bat Program.cs

Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:54 pm, Sunday, June 1 2014
Elapsed Time: 0:00:01.915
Process Time: 0:00:00.031
System Calls: 20138
Context Switches: 6622
Page Faults: 11302
Bytes Read: 3388369
Bytes Written: 62366
Bytes Other: 37410

c:\oss\aspnet\Home\samples\ConsoleApp>timeit Program
Hello World

Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:55 pm, Sunday, June 1 2014
Elapsed Time: 0:00:00.065
Process Time: 0:00:00.062
System Calls: 8621
Context Switches: 625
Page Faults: 4642
Bytes Read: 42125
Bytes Written: 445
Bytes Other: 17087

roslynの releases/build-preview ブランチでビルドしたrcscでやってみたが、一番おそいな。。。


c:\oss\aspnet\Home\samples\ConsoleApp>timeit rcsc.exe Program.cs
Microsoft (R) Visual C# Compiler version 0.6.0.0
Copyright (C) Microsoft Corporation. All rights reserved.


Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:56 pm, Sunday, June 1 2014
Elapsed Time: 0:00:17.027
Process Time: 0:00:16.343
System Calls: 192017
Context Switches: 84470
Page Faults: 80516
Bytes Read: 24627016
Bytes Written: 248767
Bytes Other: 144112

c:\oss\aspnet\Home\samples\ConsoleApp>timeit Program
Hello World

Version Number: Windows NT 6.2 (Build 9200)
Exit Time: 3:57 pm, Sunday, June 1 2014
Elapsed Time: 0:00:00.061
Process Time: 0:00:00.062
System Calls: 5437
Context Switches: 416
Page Faults: 4469
Bytes Read: 41693
Bytes Written: 13
Bytes Other: 16493

asp.net vnext とは?

Entity Framework が軽量になるやつを開発しているというので見に行ったら
asp.net vnext としてIIS依存をなくす?プロジェクトが動いていた。
なぜか codeplex じゃなくて github だ。


https://github.com/aspnet
DependencyInjection と Logging がちゃんとついて
ASP.NET MVC 6 + SingnalR 3 + EntityFramework 7
がmono上でもIISなしでうごくっていうのはものすごくいい感じ。
DataCommon.SQLite がはいっているのもよい。


さわりとしては以下を参照でいいのだろう。

ASP.NET vNext(MVC / Web API / Web Pages 6, Entity Framework 7, SignalR 3)が TechEd NA で発表された話
http://shiba-yan.hatenablog.jp/entry/20140514/1400074496

Introducing ASP.NET vNext
http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx

A 30 Minute Look At ASP.NET vNext
http://weblogs.asp.net/jgalloway/archive/2014/05/13/a-30-minute-look-at-asp-net-vnext.aspx

Java8から挙動が違う


> groovysh
Groovy Shell (2.1.0, JVM: 1.8.0_05)
Type 'help' or '\h' for help.

                                                                                    • -

groovy:000> " ".split("|").length
===> 1

>groovysh
Groovy Shell (2.1.0, JVM: 1.7.0_51)
Type 'help' or '\h' for help.

                                                                                              • -

groovy:000> " ".split("|").length
===> 2

仕変なのかバグなのか。。。Oracleのバグデータベース使いづらいので放置。

警告: Could not open/create prefs root node Software\JavaSoft\Prefs

groovysh を起動するとなぜか警告。

警告: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002.
Windows RegCreateKeyEx(...) returned error code 5.

コマンドプロンプトを管理者モードで起動して

reg ADD "HKLM\Software\JavaSoft\Prefs"

で登録したらなおった。

Eclipseを起動するJava8で起動しDeployするとGAEで実行時エラー

Google App Engine はまだJava8に対応していないので、EclipseをJava8で起動して、プロジェクトの設定をJava7にしてビルド。
ローカルでdebugしてうまくいったので Google Plugin for EclipseGoogle App Engine にdeployすると上記のエラーがでる。
Upload時にjspコンパイルをしているためだと思われる。
Java7でEclipseを起動しなおしてdeployした実行時エラーはでなくなった。