Windows Dev. Site

[お知らせ]

このブログを始めて4年が経過しようとしています。
MicrosoftやWindows固有の情報を記事にしてきましたが、Microsoftがオープンソースと幅広く提携する方針を受け、MSテクノロジーに限って記事を書くことにあまり意味を感じなくなってきました。またBizSparkの期限が切れたことにより、材料に制約ができてきたのも要因です。
まだ継続はしていきますが、更新ペースはさらにゆるやかになると思います。

しかしまだまだAzureFunctionのような興味深いものもあり、まだこれから取り上げたいと思っています。(今回時間がないため先送り。他のブログがちょっと忙しいので・・)

em7s

BizSparkがきっかけではじめたこのブログですが、他の技術ブログを書くきっかけにもなり大変有意義でした。

Unity 5 / C#

マルチプラットホーム対応。プログラマを引き付けるある種のキーワードですが、私自身はそれぞれのプラットホームにあった言語を使えばいいと思う派です。なのでXamarinのようにC#でiOSのアプリを作れると聞いてもあまりそそられないのですが、ゲームの統合開発環境のUnityはちょっと違う感じを受けました。ゲームにかぎらず3Dオブジェクトの表現手段としても魅力に思えたからです。この環境がC#を一段と魅力的にしています。(Macにもインストールしました)

ということでUnity5ことはじめとして今回取り上げてみました。

unity01
球と立方体にマテリアルを適用して配置します。立方体の方をプログラムで回転させてみました。(使い方はネット上にたくさんありますので、他のサイトを参考にしてください。)
unity02
コードの編集は、スクリプトをダブルクリックするとすでにインストール済のVisualStudio2013が立ち上がりました。

以下実行画面(立方体が回転します)
unity03

このツール自体、使っているのが楽しいです。(3Dレンダリングツールを使うのは、LightWave以来で15,6年ぶりくらいかも?)
これを使ったAndroidアプリを作ってみたくなってきました。

Bash / Windows

BashがWindowsで走るようになる、というニュースはいろんな意味で衝撃的でした。
その発表からかなりたちましたが、ようやく導入してみました。

WindowsマシンでLinuxを走らせたいというときは、いままでVM、Cygwinなどで代用してきましたが、このBashはかなり使いやすく自然に感じます。(Macか好きなのもコンソールが使えるからです。)

インストールは以下を参考にさせていただきました。
「Bash on Ubuntu on Windowsをインストールしてみよう!」

http://qiita.com/Aruneko/items/c79810b0b015bebf30bb

Anniversary Updateの後、Windows機能の有効化、開発者モードにすることで使えるようになります。
基本はUbuntuです。
定番のApache2とPHP5を試してみました。

sudo apt-get install apache2 php5
sudo service apache2 start

bash01

http://locahost/index.phpでアクセス

bash02
JavaScriptを使ったWebアプリでちょっとしたテストするときに、ローカルにWebサーバを立てたいときがあります。このようなときXAMPPを使っていましたが、これでその必要がなくなります。

bashコマンドで、WindowsのコマンドプロンプトがBashに変身するわけですが、まだ慣れないせいかちょっと違和感があります。(Windowsの一部にまだなりきれていない感が・・)
しかしこれは慣れの問題で、利便性は文句ないですね。

Computer Vision API

OpenCVをちょっと本格的にやってみたくなり、いろいろと調べていたところ、Microsoftの画像の内容を解析するWeb APIがあることを知りました。

https://www.microsoft.com/cognitive-services/en-us/computer-vision-api

まずサイトにあるデモ画像を解析してみました。
cv01

Description { “type”: 0, “captions”: [ { "text": "a beautiful woman standing on a beach", "confidence": 0.679803189466983 } ] }

このように表示されました。写真の内容を解説しています。
次に、名古屋市街の写真をアップしてみました。

cv02
以下、上の画面で表示されていない部分
cv02b

{ “type”: 0, “captions”: [ { "text": "a view of a city street filled with lots of traffic", "confidence": 0.9142464427110745 } ] }

見事に説明されています。
RESTでリクエストするとJSONデータがレスポンスが得られますが、ここではWeb画面だけでテストしました。
すばらしいです!
しかしこんなのは序の口なのでしょうね。今後もっとすごいことになりそうな予感がします。

取得データ

Features:
Feature Name
Value
Description
{ “type”: 0, “captions”: [ { "text": "a view of a city street filled with lots of traffic", "confidence": 0.9146197984849257 } ] }
Tags
[ { "name": "outdoor", "confidence": 0.9992619156837463 }, { "name": "sky", "confidence": 0.9889569878578186 }, { "name": "road", "confidence": 0.9851759672164917 }, { "name": "traffic", "confidence": 0.95611971616745 }, { "name": "street", "confidence": 0.9378244280815124 }, { "name": "way", "confidence": 0.9301115274429321 }, { "name": "scene", "confidence": 0.9083418846130371 }, { "name": "city", "confidence": 0.8684317469596863 }, { "name": "highway", "confidence": 0.5730462670326233 }, { "name": "lined", "confidence": 0.5066318511962891 }, { "name": "long", "confidence": 0.4045528769493103 }, { "name": "busy", "confidence": 0.3945377469062805 } ]
Image Format
jpeg
Image Dimensions
1224 x 1632
Clip Art Type
0 Non-clipart
Line Drawing Type
0 Non-LineDrawing
Black & White Image
False
Is Adult Content
False
Adult Score
0.007880046032369136
Is Racy Content
False
Racy Score
0.013227200135588646
Categories
[ { "name": "outdoor_", "score": 0.00390625 }, { "name": "outdoor_city", "score": 0.21484375 }, { "name": "outdoor_street", "score": 0.24609375 } ]
Faces
[]
Dominant Color Background

Dominant Color Foreground

Dominant Colors

Accent Color

#BA9711

PowerShell / Linux

LinuxやMac用のPowerShellがマイクロソフトからリリースされました。
パイプ処理やリモート機能などLinuxでも使えたら便利と思っていたので、ずっと期待していました。
早速インストールして、試してみました。

環境: Ubuntu 16.04
下記よりUbuntu用をダウンロードして、dkpg -i でパッケージインストール。

https://github.com/PowerShell/PowerShell/releases/tag/v6.0.0-alpha.9

バージョン表示
linuxps01

リモート設定
linuxps02
まだ無理なのでしょうか・・

Apache2のプロセス表示
linuxps03
aliasを見てみると lsにはなにも割り当てられていません。
またおいおい試していきたいです。

PowerShell RunspacePool

パワーシェルコマンドを非同期で並列に実行するテストです。時間を表示して並行に実行していることを確認しました。

環境: PowerShell version 5 / Windows 10

$PSVersionTable
Set-ExecutionPolicy RemoteSigned

(ポリシー変更を管理者権限で実行)

実行画面
powershell_run01

runtest.ps1

$cmds = @(
 "sleep 1; get-date", 
 "sleep 2; get-date", 
 "sleep 3; get-date" 
 )

$len = $cmds.Length
$pool = [RunspaceFactory]::CreateRunspacePool(1, $len)
$pool.Open()
$arrPs  = New-Object System.Collections.ArrayList
$arrRes  = New-Object System.Collections.ArrayList
for ( $i = 0; $i -lt $len; $i++ ) {
	$cmd = $cmds[$i]
	$ps = [PowerShell]::Create()
	$ps.RunspacePool = $pool
	$ps.AddScript($cmd) | Out-Null
	# $ps.AddCommand("Out-String") 
	$res = $ps.BeginInvoke()
	$arrPs.Add($ps) | Out-Null
	$arrRes.Add($res) | Out-Null
}

while ( $arrPs.Count -gt 0 ){
	for ( $i = 0; $i -lt $arrPs.Count; $i++ ){
		$ps = $arrPs[$i]
		$res = $arrRes[$i]
		if($ps -ne $null){
			if($res.IsCompleted){
				$result = $ps.EndInvoke($res)
				Write-host $result
				$ps.Dispose()
				$arrPs.RemoveAt($i)
				$arrRes.RemoveAt($i) 	
			}
		}
	}
}
$pool.Close()

参考: https://www.gmo.jp/report/single/?art_id=195

Bot Framework

最近はやりのBot。マイクロソフトもちょっと前にフレームワークを出しましたが、このBotBuilderを使って、まずは標準入出力で簡単に動かせるものを作ってみました。
環境: node ver 4.4.5 / Windows 10

Nodeは下記からダウンロード

https://nodejs.org/en/download/

node-v4.4.5-x64.msi

インストール

npm init
npm install –save botbuilder
npm install –save restify

Botは入力に対して、何かを返すというのが基本ですが、予想していない入力に対しては’?'で返し、ユーザの名前が登録されていないときは名前を尋ね、以後その名前で語りかけるという仕組みをつくったつもりです。

var builder = require('botbuilder');

var dialog = new builder.CommandDialog();

dialog.matches(["Hi", "Hello"], function (session) {
  if (!session.userData.name) {
    session.beginDialog('/getname');
  }
  else{
    session.send("> Hello, " + session.userData.name + "!");
  }
});
dialog.matches("How are you", function (session) {
  session.send("> I'm fine.")
});
dialog.matches("bye", function(session){
  session.send("> See you.")
  session.endDialog();
});

dialog.onDefault(function (session) {
  if(session.userData.name != session.message.text){
    session.send("> " + session.message.text + "?");
  }
});

var bot = new builder.TextBot();
bot.add('/', dialog);
bot.add('/getname', [
  function(session) {
    builder.Prompts.text(session, "> What's your name?");
  },
  function(session, results) {
    session.userData.name = results.response;
    session.send('> Hi, ' + session.userData.name);
    //session.endDialog();
    session.beginDialog('/');
  }
]);

bot.listenStdin();

実行結果
bot01

/getnameセッションが終わると、/に戻るかと思いましたが、そうならないためまたセッションを再度開始しています。
まだ調査不足のところがありますが、とりあえずここまでメモしておきたいと思います。

参考:

http://qiita.com/o0h/items/1a51cd0bbd9c38027388

http://www.atmarkit.co.jp/ait/articles/1604/15/news032_3.html

Small Basic

プログラムの学習言語として50年以上の歴史を持つBasic言語。私も初めてプログラムを学んだのはこの言語でした。当時家庭で手軽に試せるプログラム言語といえば、Basicくらいしかありませんでしたが、現在は多数の言語があり、それゆえどれから学んだらいいかとても迷います。
しかし時代は進んでもプログラムを楽しんで学ぶという観点かから、まだBasicがよく使われているのを目にします。そのような中マイクロソフトの製品で”Visual Basic”ではなく、”Small Basic”なるものがあったので使ってみました。

ダウンロード: https://www.microsoft.com/ja-jp/download/details.aspx?id=46392
環境: Small Basic 1.2 / Windows 10
smallbasic01
Turtleというオブジェクトが最初からあり、図形を書いたりできます。
このあたりが”Basicらしい”ところで気にいりました。
Scratch等のブロックを並べてプログラムを記述する言語にもありますが、プログラム実行環境自体に、何かを動かす、といったわかりやすい目的があるのが特徴的です。
このプログラムはマウスポインタの位置にTurtleを移動させる簡単なものです。
smallbasic02
プログラムを発行して、Webで共有することも可能です。
smallbasic03
このあたりは今っぽいところてす。
smallbasic04
無料でここまで使えるのは、魅力的です。

Reactive Extensions

以前、「C# LINQのクエリ式」http://crossframe.iiv.jp/20130503247/ で少し触れたReactiveExtensionsについて、かなりたちましたがここでテストしてみたいと思います。

ReactiveExtensionsについて、多くの記事がある以下のサイトを参考にしました。

http://blog.okazuki.jp/entry/20120219/1329663635

特にここにある合成について興味があり、3つの値を監視して合成してみました。

環境 : Mono 4.2.0 / Mac OSX 10.10.5

https://www.nuget.org/でダウンロードしたnuget.exeで

mono nuget.exe install Rx-Main

を実行。インストールされる.dllファイルをプログラムファイルと同じパスにコピーして使用しました。

combine.cs

using System;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Reactive.Concurrency;

class Program {
    static void Main(string[] args) {

        var source1 = new Subject<string>();
        var source2 = new Subject<int>();
        var source3 = new Subject<int>();

        source1.CombineLatest(
            source2.Where(n => n % 2 == 0).Select(i => i * 10),
            (l, r) => string.Format("{0} | {1}", l, r))
        .CombineLatest(
            source3.Take(2),
            (l, r) => string.Format("{0} || {1}", l, r))
        .Subscribe(
            s => Console.WriteLine("* OnNext: {0}", s),
            () => Console.WriteLine("* OnCompleted"));

        Console.WriteLine("source1:'foo1'");
        source1.OnNext("foo1");
        Console.WriteLine("source1:'foo2'");
        source1.OnNext("foo2");

        Console.WriteLine("source2:22");
        source2.OnNext(22);

        Console.WriteLine("source3:311");
        source3.OnNext(311);
        Console.WriteLine("source3:312");
        source3.OnNext(312);
        Console.WriteLine("source3:313");
        source3.OnNext(313);

        Console.WriteLine("source1:'bar1'");
        source1.OnNext("bar1");
        Console.WriteLine("source2:23");
        source2.OnNext(23);
        Console.WriteLine("source2:24");
        source2.OnNext(24);

        Console.WriteLine("source1:Completed!");
        source1.OnCompleted();
        Console.WriteLine("source2:99");
        source2.OnNext(99);
        Console.WriteLine("source2: Completed!");
        source2.OnCompleted();

        Console.ReadLine();
    }
}

ビルドと実行

mcs combine.cs -r:System.Reactive.Core.dll,System.Reactive.Linq.dll,System.Reactive.Interfaces.dll
mono ./combine.exe

実行結果

source1:’foo1′
source1:’foo2′
source2:22
source3:311
* OnNext: foo2 | 220 || 311
source3:312
* OnNext: foo2 | 220 || 312
source3:313
source1:’bar1′
* OnNext: bar1 | 220 || 312
source2:23
source2:24
* OnNext: bar1 | 240 || 312
source1:Completed!
source2:99
source2: Completed!
* OnCompleted

リアクティブプログラムなのに、オブザーバという言葉がでてきませんが、SubjectクラスにはIObservableとIObserverの両方のインターフェースを実装されているようです。
監視対象の値が3つとも用意されたタイミングで、表示しています。最近のプログラムは非同期処理、関数型言語の文法の普及等により、プログラムの読み方が昔のように上から下に処理が流れていくような作りから、かなり変わってきたということをしみじみと感じます。

SQLite for Excel

一つのファイルでデータベースを扱える手軽さから、さまざまなプラットホームで使われているSQLite。Excelから直接扱えることを知り、テストしてみました。

http://sqliteforexcel.codeplex.com/

このサイトからダウンロードしたファイルだけで、特に何かインストールすることなくDBファイルに読み書きできました。
Distributionフォルダにある、SQLiteForExcel_64.xlsmを使用。
sqlite3.dllはx64フォルダのものに変更します。

環境 : Excel 2013 / Windows 10
このファイルには、SQlite3とSQlite3DemoというVBAモジュールがすでに組み込まれており、SQlite3Demoを参考に以下のプログラムを作成しました。
ボタン1でDBの作成、データ書き込み、ボタン2でDB読み込みセルに表示をしています。

Sub ボタン1_Click()
    Dim InitReturn As Long
    Dim testFile As String
    Dim RetVal As Long
    Dim myDbHandle As LongPtr
    Dim myStmtHandle As LongPtr
    
    InitReturn = SQLite3Initialize
    If InitReturn <> SQLITE_INIT_OK Then
        Debug.Print "Error Initializing SQLite. Error: " & Err.LastDllError
        Exit Sub
    End If
    
    testFile = "C:\temp\Test01.db3"
    RetVal = SQLite3Open(testFile, myDbHandle)
    Debug.Print "SQLite3Open returned " & RetVal

    RetVal = SQLite3PrepareV2(myDbHandle, "CREATE TABLE MySecondTable (TheId INTEGER, TheText TEXT, TheValue REAL)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (123, 'ABC', 42.1)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (456, 'DEF', 12.3)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (789, 'GHI', 45.6)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal
    
    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal

    RetVal = SQLite3Close(myDbHandle)


End Sub

Sub ボタン2_Click()
    Dim testFile As String
    Dim RetVal As Long
    Dim myDbHandle As LongPtr
    Dim myStmtHandle As LongPtr
    
    testFile = "C:\temp\Test01.db3"
    
    RetVal = SQLite3Open(testFile, myDbHandle)
    Debug.Print "SQLite3Open returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "SELECT * FROM MySecondTable", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    r = 1
    Do While RetVal <> SQLITE_DONE
        Cells(r, 1).Value = SQLite3ColumnText(myStmtHandle, 0)
        Cells(r, 2).Value = SQLite3ColumnText(myStmtHandle, 1)
        Cells(r, 3).Value = SQLite3ColumnText(myStmtHandle, 2)
        RetVal = SQLite3Step(myStmtHandle)
        r = r + 1
    Loop
    
    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal
    
    RetVal = SQLite3Close(myDbHandle)

End Sub

実行結果。
sqliteExcel

DB Browser for SQLiteでDBファイルの内容を確認。
sqliteExcel02

データベースのデフォルトデータを作成する用途に便利だと思いました。