Windows Dev. Site

VisualStudio 2015 / Windows 10

vs2015_01
新しいWindowsと開発環境が先月末リリースされました。
Windows 8 の迷走を収束させ、新しい方向性をうちだしているように見えます。
これまでWindowsストアアプリを開発していて感じたのは、タブレットという新しいデバイスを意識して、かなり大がかりな方向性の変化があったので、これまでのデスクトップアプリはなくなってしまうのではないか、と思うくらいでした。
今回、Windowsストアアプリ(もうこのようには呼ばないらしい..単にアプリ:ネーミングには毎回混乱させられます)はそのままに大きく振れた振り子を逆にもどすような動きをしているように見えます。

とりあえず気になるものから、試していきたいと思います。

環境 : Visual Studio Enterprise 2015 / Windows 10 Enterprise / Virtualbox 5.0.1
今回は、ユニバーサルアプリケーション UAP(Universal Applicatioon Platform)を試してみます。 
これは、一つのプログラムでWindowsを実装するあらゆるデバイスで動作させるアプリケーションのようです。
vs2015_02
自動で生成されるコードです。
vs2015_03
実行画面です。
vs2015_04
空白のアプリなので何も表示されてませんが、デバッグモードなのでフレームレートが表示されています。
シミュレータ実行すると以下のようになります。
vs2015_05
画面はWindowsデスクトップですが、これが各種Windowsデバイスに相当するのでしょう。

AndroidやiOSについても今後テストする予定です。

Windows 10 IoT

Raspberry Pi2でWindows IoT Coreを実行してみました。
開発するのに、Windows 10 Insider Preview も必要ということなので、インストールしようと思いましたが、私の環境ではできませんでした。
GPTディスクでないとインストールできないということですが、最近購入したPCでGPTなのにできませんでした。
しかしRaspberry Pi2で起動させるまでは、Windows 8.1でもできるようです。

環境: Windows 8.1

1) SDカードイメージとライティングツールの確認
IOT Core RPi.ISO (532,776,960 バイト)
をマウントすると、インストーラ(.msi)が入っているので、これを実行します。

インストールディレクトリ Program Files\Microsoft IoT

2) ディスク番号の確認
diskpart コマンド実行
>list disk

PhysicalDrive*
(* にドライブ番号)

Pi_dism

flash.ffuが書かれたSDカードをRaspberry Pi2に挿入して、起動。

Pi_tut01

チュートリアルを実行してみました。
Raspberry Pi2本体のグリーンLEDが点滅します。

この続きは、Windows 10 が動く環境ができてからにしたいと思います。

C++ Standard Template Library

最近は、すっかり使わなくなってしまいましたが、C++をちょっと見直す機会があり、再学習とこれから使うためのリファレンスの意味で、興味がある機能を並べてました。

環境 : VisualStudio 2010 / Windows 7

#include "stdafx.h"
#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;
typedef deque<int> INTDEQUE;

void p(int n)
{
	cout << n << " ";
}
int main(array<System::String ^> ^args)
{
	INTDEQUE  dq;

	dq.push_front(3);
	dq.push_front(2);
	dq.push_front(1);
	dq.insert(dq.begin(), 0);
	dq.push_back(9);

	cout << "start : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	INTDEQUE::reference reff = dq.front();
	INTDEQUE::reference ref2 = dq[2];
	INTDEQUE::reference refe = dq.back();

	reff = 10;
	ref2 = 12;
	refe = 19;

	cout << "refer : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.pop_front();
	dq.pop_front();

	cout << "pop   : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.push_back(21);
	dq.push_back(22);

	cout << "push  : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	random_shuffle(dq.begin(), dq.end());

	cout << "shuff : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	rotate(dq.begin(), dq.begin() + 1, dq.end());
    
	cout << "rotat : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	dq.erase(dq.end()-2,dq.end());
	
	cout << "erase : ";
	for_each(dq.begin(), dq.end(), p);
	cout << endl;

	getchar();

    return 0;
}

実行結果
cppstl01
プロジェクトは「Visual C++ CLRコンソールアプリケーション」です。
実行結果に、コメントとその結果があるので、説明は省きます。

参考 : https://msdn.microsoft.com/ja-jp/library/f1dtts6s%28v=vs.90%29.aspx

Swift / Visual Studio 2013

最近一番注目している言語Swift。今のところMacでしか動作しませんが、他のプラットホームでも動作することが期待されます。そこでいろいろと調べてみたところ、Windowsで動作するものがありました。

Silver

http://elementscompiler.com/elements/silver/

上記サイトから評価版がダウンロードできたので、試してみました。
OxgeneというPascal言語を開発している会社のプロジェクトのようです。

以下Wikipediaより

http://en.wikipedia.org/wiki/Oxygene_%28programming_language%29

Oxygene (formerly known as Chrome) is a programming language developed by RemObjects Software for Microsoft’s Common Language Infrastructure and the Java Platform. Oxygene is Object Pascal-based, but also has influences from C#, Eiffel, Java, F# and other languages.

環境: Windows 2013 / Windows 8.1
silver1

起動すると上のような画面がでます。Swift以外の言語も選択できます。
.NETコンソールアプリケーションを実行する予定でしたが、ランタイムエラーが出たので、Javaのコンソールアプリを選びました。

silver_java

import java.util

let names = ["Swift", "CSharp", "Java"]
for name in names {
    println("Hello, \(name)!")
}

func nilcheck(n:Int?)->(){
    if let nn = n{
        println(n)
    }
    else{
        println("This value is nil.")
    }
}

var n1:Int? = 12345
nilcheck(n1)

n1 = nil
nilcheck(n1)

for i in 1...100 {
    print("*")
}

もっとSwiftらしいプログラムにしたかったのですが、mapとかコンパイルエラーとなってしまいます。特徴的なOptionalは動作したので、これのみにしました。

実行結果
silver2

参考までに、Cocoa, .NETのプロジェクトは以下のようになります。
Cocoaは
silver_cocoa

silver_dnet

Cocoaは、CrossBoxというサーバに登録しないいけないようです。

silver_CrossBox

あまり時間をかけてテストしていませんが、VisualStudioでSwiftが走っている様子は、期待感を持たせてくれます。

Scheme Shell / Cygwin

CygwinというWindows上でLinuxコマンドを実行できるとても便利なツールとして、これまでいろんなケースで使ってきました。
最近のマイブームによりSCSHというSchemeによるシェルを実行する環境を探していたとき、Ubuntuとかでチャレンジしたのですが、インストールがうまくいかず、結局このCygwinにいきつきました。さすがです!
SCSHは、一見Gaucheとも似ているように見えるのですが、Shellですので、実行コマンドを式に組み込めるところが面白いと思いました。
環境 : Windows 8.1
scsh03
Cygwinは32bit版である必要があります。

以下の例は、実行プログラムをシェルの中から呼んだみました。
スラッシュが式に使えるのが、ポイントだと思っています。
scsh01
scsh -c で式をパラメータに与えても実行できます。

また、PowerShellでも動きます。(コマンドレットは動作しません)
Cygwinのbinにパスを通しておく必要があります。
scsh02
(上記、(run (| (echo 123 + 456) (bc) (cat)) (> tempfile)) という、書き方も可です。)

http://scsh.net/

本家サイトを見ると、
The latest version of scsh is 0.6.7, released May 16, 2006:
ということで、ちょっと残念です。
この時点で動作させられるという記録を残しておく意味でも、とりあげてみました。
(こういうのBlogの役割かも)

参考サイト:
http://wiki.call-cc.org/eggref/4/scsh-process (以前取り上げたChickenSchemeのサイトにもあります。)

http://www.drdobbs.com/systems-administration-with-scsh/199101322

すばらしいです。

Azure Machine Learning

Microsoft Azureで今ホットな機会学習ができるということで、試してみました。
「Hadoop : HDInsight」以来久しぶりのAzureになりますが、名前もWindows Azureから変わったのですね。(URLはそのまま)

Azure管理メニューに追加されたMachine Learningから、簡単に準備ができました。
「ML Studioにサインイン」をクリックすると、manage.windowsazure.comからstudio.azureml.netに移動します。
azml01

experimentsのSAMPLESから最初のSample1を編集して使ってみました。
サンプル自体は、編集できないので、Save Asでコピーします。
azml02
azml03
Sample1は、インターネット上のCSVファイルにRのプログラムでヘッダを追加し、平均等の要約しています。(Descriptive Statistics)
私の方でさわったのは、Elementary Statisticsを追加して、年齢の最大値を取得するようにしたところと、元データが3万件を超えて処理が重いため、100件まで削除して自サイトからダウンロードできるようにしました。
azml04a

Launch Column Selectorをクリックします。
azml04b

実行(RUNクリック)後、Elementary Statisticsのアウトプットを右クリックしてVisualizeします。
azml04c

Descriptive StatisticsをVisualizeしたのが以下です。
azml05
100件になっています。

azml06a

機械学習まではまだまだですが、ひとまずデータの流れだけを練習してみました。

WCF Service Application

ASP.NETでOData、データソースにAccessファイルとか、いろいろとやりたいことがあるのですが、環境がすぐに用意できなかったり、うまくいかなかったりしたため、とりあえず基本となるWCFの部分だけ、メモっておこうと思います。
といっても、デフォルトである程度動くと見込んだものの、ちょっと戸惑いました。

環境 : Visual Studio 2013 / Windows 8.1

wcf06
WCFサービスアプリケーションで新規プロジェクトを作り、何も変更せずに実行しました。
WCFテストクライアントが立ち上がり、リクエスト、レスポンスのテストができます。
wcf01

ブラウザから、GETリクエストでレスポンスを得るために、以下のようにGetData2メソッドを追加しました。
(この追加をすると、上記のWCFテストクライアントでのテストはできなくなりました。自動でたちあがらくなり、コマンドwcftestclient.exe直接実行でもエラーがでます)

wcf07

Service1.csv.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService01
{
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
        [WebGet(UriTemplate = "data/{value}")]
        public string GetData2(String value)
        {
            return string.Format("You entered: {0}", value);
        }
        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

IService1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService01
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
        [OperationContract]
        string GetData2(String value);
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";
        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }
        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}

まず以下のようにデフォルトの画面を確認して、
wcf05
パラメータを追加してみます。
wcf04
と表示するはずですが、以下のように設定を追加していないとBad Request となり白い画面になってしまいます。
Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>

    <!--追加 -->
    <services>
      <service name="WcfService01.Service1">
        <endpoint address=""
                  behaviorConfiguration="restBehavior"
                  binding="webHttpBinding"
                  contract="WcfService01.IService1" />
      </service>
    </services>
    
    <behaviors>
      <!-- 追加 -->
      <endpointBehaviors>
        <behavior name="restBehavior">
          <webHttp helpEnabled="true"/>
        </behavior>
      </endpointBehaviors>
      
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

これにより、XML POSTリクエストも可能になります。
環境 : Cygwin / Windows 8.1
wcf08
最初、レスポンスが得られないとき、URLが違うのか、このやり方が違うのか迷いました。
結局、うまくいっているサンプルを探し、そのWeb.configファイルと比較したら、上のような違いをみつけました。
(Microsoftのプロダクトは、権限とか設定とかデフォルトで無効になっているものがよくあるように思います。
セキュリティを高めるためだとは思いますが、ちょっと動かしてみたいというときにできないと、次に進めなくてあきらめてしまいがちです。)
できたところまで、とりあえずメモでした。

IronScheme

今年最初の投稿は、新年早々IronSchemeです。(^^;

前回、Clojureをまわりを調べているときに、この存在を知り試してみようと思いました。
.NETフレームワークのライブラリが使用できるSchemeということですが、IronPython, IronRubyと同じように位置づけなのでしょう。

Lisp (+ List Processor))

http://decode.red/blog/20141201244/

ここで使用した順列のプログラムをIronSchemeで動かしてみました。

環境 : Windows 8.1

https://ironscheme.codeplex.com/

IronScheme-109887.zip

perm.ss

(import (srfi :1 lists))

(define (perm ls a)
    (if (null? ls)
        (display (reverse a))
        (for-each
            (lambda (n)
                (perm (remove (lambda (a) (equal? a n)) ls)(cons n a)))
            ls)))

(perm '(1 2 3) '())
(newline)

冒頭のimportの記述や、コマンド実行時ファイル指定の方法にちょっと迷いました。

hello.ss

(import (rnrs))

(display "Hello")
(newline)

上の二つのプログラムをそれぞれ以下のように実行しました。

IronScheme02

最初、srfiの指定方法がいけないのかどちらかわかりませんでしたが、リダイレクトの方法だとうまくいくので、とりあえずこのままにしました。

次に、下記サイトを参考に、VisualStduio 2013を使ってC#から呼び出してみました。

http://cryks.hateblo.jp/entry/20120417/1334660328

インストールは、NuGetを使いました。
IronScheme01

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using IronScheme;
using IronScheme.Runtime;

namespace csConsScheme01
{
    class Program
    {
        static void Main(string[] args)
        {
             Console.WriteLine("(+ 1 2 3)".Eval());
             Console.ReadKey();

             "(define (add x y)(+ x y))".Eval();
             var add = "add".Eval<Callable>();
             Console.WriteLine(add.Call(1, 2));
        }
    }
}

出力は、6と3です。
特定の処理だけ組み込み言語的に使う用途にいいかもしれません。

calling Clojure from C#

.NETフレームワークがオープンソースになるということですが、C#のプログラムがJavaのようにクロスプラットホームで使われるようになるかもしれません。
Javaの資産は膨大なものがありますので、これをC#から呼び出す方法を試してみようと今回思いました。以前、JNIを使ってC++/CLIからJava(http://crossframe.iiv.jp/2013021475/)を呼び出すテストをしたことがありますが、これはちょっと面倒なので、もっと簡単な方法はないかと調べたら、いいのがありました。

http://jni4net.com/

bridge between Java and .NET (intraprocess, fast, object oriented, open-source)

Java と.NET相互に呼び出しが簡単にできそうです。今回は.NETからJava呼び出しのみテスト。
しかしあまりあっけなくできてしまったので、もう少し踏み込んで、Clojureの呼び出しをしてみました。
JavaからClojureの呼び出しは、こちら(http://bitlife.me/archives/297)でテストした、プログラムを使い、このJavaプログラム部分を変更して、C#から呼び出します。

環境 : jni4net 0.8.8, Java 1.8.0_25, Visual Studio 2013 Update3 / Windows 8.1
JavaMainCs.java

import clojuresub.core;

public class JavaMainCs{
	public static void sub(String str){
		core.sub(str);
	}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using net.sf.jni4net;

namespace CSharpMain
{
    class Program
    {
        static void Main(string[] args)
        {
            var bs = new BridgeSetup();

            bs.AddClassPath(@"C:\wk\", true);
            bs.AddAllJarsClassPath(@"C:\wk\");

            Bridge.CreateJVM(bs);

            java.lang.Class jclass = 
                java.lang.ClassLoader.getSystemClassLoader().loadClass("JavaMainCs");

            java.lang.Class[] cls = { java.lang.String._class };
            java.lang.Object[] obj = { new java.lang.String("C# String") };

            java.lang.reflect.Method method = jclass.getMethod("sub", cls);
            method.invoke(null, obj);

            Console.ReadKey();
        }
    }
}

C#のコードの中にJavaが書けてしまい、ちょっと不思議な感覚になります。

VisualStudioでは参照追加とビルド設定をします。
clojure_cs01

以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
clojure_cs02

最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。

Access .mdb / PowerShell

AccessのmdbファイルをPowerShellで読み込むテストをしてみました。
ファイルベースのDBで簡単にデータをプログラムで活用するために、とても便利です。

環境 : Access 2013, PowerShell 4.0 / Windows 8.1 64bit
まずからの空のmdbファイルをせっかくなので、PowerShellでつくりました。
ここで注意することは、32bit版のPowerShellを使う必要があることです。

$para = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\work\sample01.mdb'"
$obj = New-Object -ComObject "ADOX.Catalog"
$mdb = $obj.Create($para)
$mdb.Close()

これをAccessで開き、適当なテーブルを作成します。
access01

Accessは開いたまま下記コマンドを実行できます。
select01.ps1

$conn = New-Object -comobject ADODB.Connection  
$rset = New-Object -comobject ADODB.Recordset  
  
$conn.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\work\sample01.mdb")  
$rset.Open("Select * from table1", $conn)
$rset.MoveFirst()  
do {
	$rset.Fields.Item("item1").Value;
	$rset.MoveNext()
} until ($rset.EOF -eq $True)  
  
$rset.Close()  
$conn.Close() 

access02

32bit版のPowerShellをショートカットにして、起動したところです。

参考:

http://hidori.jp/blog/2013/04/03/610

https://gallery.technet.microsoft.com/office/a4a0ade2-e856-48ff-9e91-31b4b6356382