新しいWindowsと開発環境が先月末リリースされました。
Windows 8 の迷走を収束させ、新しい方向性をうちだしているように見えます。
これまでWindowsストアアプリを開発していて感じたのは、タブレットという新しいデバイスを意識して、かなり大がかりな方向性の変化があったので、これまでのデスクトップアプリはなくなってしまうのではないか、と思うくらいでした。
今回、Windowsストアアプリ(もうこのようには呼ばないらしい..単にアプリ:ネーミングには毎回混乱させられます)はそのままに大きく振れた振り子を逆にもどすような動きをしているように見えます。
とりあえず気になるものから、試していきたいと思います。
環境 : Visual Studio Enterprise 2015 / Windows 10 Enterprise / Virtualbox 5.0.1
今回は、ユニバーサルアプリケーション UAP(Universal Applicatioon Platform)を試してみます。
これは、一つのプログラムでWindowsを実装するあらゆるデバイスで動作させるアプリケーションのようです。
自動で生成されるコードです。
実行画面です。
空白のアプリなので何も表示されてませんが、デバッグモードなのでフレームレートが表示されています。
シミュレータ実行すると以下のようになります。
画面はWindowsデスクトップですが、これが各種Windowsデバイスに相当するのでしょう。
AndroidやiOSについても今後テストする予定です。
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*
(* にドライブ番号)
flash.ffuが書かれたSDカードをRaspberry Pi2に挿入して、起動。
チュートリアルを実行してみました。
Raspberry Pi2本体のグリーンLEDが点滅します。
この続きは、Windows 10 が動く環境ができてからにしたいと思います。
最近は、すっかり使わなくなってしまいましたが、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;
}
実行結果
プロジェクトは「Visual C++ CLRコンソールアプリケーション」です。
実行結果に、コメントとその結果があるので、説明は省きます。
参考 : https://msdn.microsoft.com/ja-jp/library/f1dtts6s%28v=vs.90%29.aspx
最近一番注目している言語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
起動すると上のような画面がでます。Swift以外の言語も選択できます。
.NETコンソールアプリケーションを実行する予定でしたが、ランタイムエラーが出たので、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は動作したので、これのみにしました。
実行結果
参考までに、Cocoa, .NETのプロジェクトは以下のようになります。
Cocoaは
Cocoaは、CrossBoxというサーバに登録しないいけないようです。
あまり時間をかけてテストしていませんが、VisualStudioでSwiftが走っている様子は、期待感を持たせてくれます。
CygwinというWindows上でLinuxコマンドを実行できるとても便利なツールとして、これまでいろんなケースで使ってきました。
最近のマイブームによりSCSHというSchemeによるシェルを実行する環境を探していたとき、Ubuntuとかでチャレンジしたのですが、インストールがうまくいかず、結局このCygwinにいきつきました。さすがです!
SCSHは、一見Gaucheとも似ているように見えるのですが、Shellですので、実行コマンドを式に組み込めるところが面白いと思いました。
環境 : Windows 8.1
Cygwinは32bit版である必要があります。
以下の例は、実行プログラムをシェルの中から呼んだみました。
スラッシュが式に使えるのが、ポイントだと思っています。
scsh -c で式をパラメータに与えても実行できます。
また、PowerShellでも動きます。(コマンドレットは動作しません)
Cygwinのbinにパスを通しておく必要があります。
(上記、(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
すばらしいです。
Microsoft Azureで今ホットな機会学習ができるということで、試してみました。
「Hadoop : HDInsight」以来久しぶりのAzureになりますが、名前もWindows Azureから変わったのですね。(URLはそのまま)
Azure管理メニューに追加されたMachine Learningから、簡単に準備ができました。
「ML Studioにサインイン」をクリックすると、manage.windowsazure.comからstudio.azureml.netに移動します。
experimentsのSAMPLESから最初のSample1を編集して使ってみました。
サンプル自体は、編集できないので、Save Asでコピーします。
Sample1は、インターネット上のCSVファイルにRのプログラムでヘッダを追加し、平均等の要約しています。(Descriptive Statistics)
私の方でさわったのは、Elementary Statisticsを追加して、年齢の最大値を取得するようにしたところと、元データが3万件を超えて処理が重いため、100件まで削除して自サイトからダウンロードできるようにしました。
Launch Column Selectorをクリックします。
実行(RUNクリック)後、Elementary Statisticsのアウトプットを右クリックしてVisualizeします。
Descriptive StatisticsをVisualizeしたのが以下です。
100件になっています。
機械学習まではまだまだですが、ひとまずデータの流れだけを練習してみました。
ASP.NETでOData、データソースにAccessファイルとか、いろいろとやりたいことがあるのですが、環境がすぐに用意できなかったり、うまくいかなかったりしたため、とりあえず基本となるWCFの部分だけ、メモっておこうと思います。
といっても、デフォルトである程度動くと見込んだものの、ちょっと戸惑いました。
環境 : Visual Studio 2013 / Windows 8.1
WCFサービスアプリケーションで新規プロジェクトを作り、何も変更せずに実行しました。
WCFテストクライアントが立ち上がり、リクエスト、レスポンスのテストができます。
ブラウザから、GETリクエストでレスポンスを得るために、以下のようにGetData2メソッドを追加しました。
(この追加をすると、上記のWCFテストクライアントでのテストはできなくなりました。自動でたちあがらくなり、コマンドwcftestclient.exe直接実行でもエラーがでます)
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; }
}
}
}
まず以下のようにデフォルトの画面を確認して、
パラメータを追加してみます。
と表示するはずですが、以下のように設定を追加していないと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
最初、レスポンスが得られないとき、URLが違うのか、このやり方が違うのか迷いました。
結局、うまくいっているサンプルを探し、そのWeb.configファイルと比較したら、上のような違いをみつけました。
(Microsoftのプロダクトは、権限とか設定とかデフォルトで無効になっているものがよくあるように思います。
セキュリティを高めるためだとは思いますが、ちょっと動かしてみたいというときにできないと、次に進めなくてあきらめてしまいがちです。)
できたところまで、とりあえずメモでした。
今年最初の投稿は、新年早々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)
上の二つのプログラムをそれぞれ以下のように実行しました。
最初、srfiの指定方法がいけないのかどちらかわかりませんでしたが、リダイレクトの方法だとうまくいくので、とりあえずこのままにしました。
次に、下記サイトを参考に、VisualStduio 2013を使ってC#から呼び出してみました。
http://cryks.hateblo.jp/entry/20120417/1334660328
インストールは、NuGetを使いました。
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です。
特定の処理だけ組み込み言語的に使う用途にいいかもしれません。
.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では参照追加とビルド設定をします。
以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。
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で開き、適当なテーブルを作成します。
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()
32bit版のPowerShellをショートカットにして、起動したところです。
参考:
http://hidori.jp/blog/2013/04/03/610
https://gallery.technet.microsoft.com/office/a4a0ade2-e856-48ff-9e91-31b4b6356382