Windows Dev. Site

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

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

Data Interpolation / Excel

既知のデータ列に対して、その区間を補間してデータをなめらかにすることをExcelで実現しているとてもいい例を見つけましたので、試してみました。

参考: http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1091176980

data

上下の散布図は、AB列、DE列に対応しています。データ補間がされているのがよくわかります。
三つの関数を組み合わせて実現されています。

Match関数
MATCH(D1,A:A,1)
A列全体からD1の値以下で最大値を検索してその場所がA列の何行目か取得

Offset関数
OFFSET($A$1,MATCH(D1,A:A,1)-1,1,2,1)
OFFSET($A$1,MATCH(D1,A:A,1)-1,0,2,1)
Match関数で取得したセルの位置から演算対象範囲を取得(A1を基準に何番目か)
A列の2行、B列の2行を取得

Trend関数
=TREND(OFFSET($A$1,MATCH(D1,A:A,1)-1,1,2,1),OFFSET($A$1,MATCH(D1,A:A,1)-1,0,2,1),D1)
既知のB列とA列の値からD1に対する新しい値E1を演算
B列の2値の関係:A列の2値の関係 = D1 : E1

よく考えられていて、すばらしいと思いました。

FCell / Excel

.Net in Excel

http://fcell.io/

ExcelでC#やF#を使うとき、このブログでも紹介したことがありますが、VSTOなどの技術を使います。これにはVisual Studioが必要となりますが、このツールはExelだけで、プログラミングができます。まさにこんなプロダクトが欲しかった、と思っていたものです。

環境: Excel 2016 / Windows 10
インストールは、サイトよりダウンロードした、インストーラ
FCell31_32bit.msi
FCell31_64bit.msi
のどちらかを実行するだけです。

fcell01
(起動時読み込まれているところ・・)

上記サイトにとてもわかりやすいデモムービがあります。これをそのまま実行してみました。
fcell02
ユーザ定義関数を実行しているところですが、プログラムを変更すると(Buildボタン押下)セルに結果が反映されます。(リアクティブになっていること確認)
scaleArr関数は、配列数式になっているので、範囲指定した後CTRL+SHIFT+ENTERで決定する。
fcell03

とても素晴らしいです。
ライセンスが、Enterprise Licenceと、Site Licenceというものがありますが、Enterpriseは$1000とちょっと高めなのが残念です。

マイクロソフトのプロダクトで、Excel, PowerShell, F#が好きな私としては、このあたりもっと意欲的なものが出てきてほしいと思っています。こういったツールが純正品ででてくれるとうれしいのですが・・

Auto Generated Example-Driven Parsing

こんなことができるコマンドがPowerShellにあるとは知りませんでした。
任意のテキストをある規則性に基づいて自動的に整形してくれるものです。
規則については元のテキストの一部を利用してテンプレートをつくるだけです。

decodeブログ(http://decode.red/blog)のフィードを使ってテストをしてみました。

環境: PowerShell 5.0 / Windows 10
feed.txt

Geohash
2015年12月4日 23:51
ジオコード(地理座標)の一つで、緯度と経…
Entropy
2015年11月2日 23:04
エントロピーという熱力学で使われる概念は…
Haskell for Mac
2015年10月17日 16:08
関数型言語Haskellに、Xcodeの…
FPGA & GPU/OpenCL
2015年9月13日 13:22
インテルによるアルテラ買収のニュースは、…
Word Cloud / D3.js
2015年8月30日 19:36
前回のword2vecで利用したテキスト…
Word To Vector
2015年8月23日 18:05
以前から気になっていたword2vecを…
Signal Processing Toolkit
2015年7月8日 23:16
音声データをコマンドツールだけで処理でき…
Mathematica / Raspberry Pi 2
2015年6月27日 22:13
あのRaspberry Pi 2をようや…
Multi Layer Perceptron
2015年5月17日 22:13
ニューラルネットワークが簡単に実装できる…
Evaluate Code
2015年5月2日 13:24
コードを文字列データとして与え、プログラ…

これの一部を使って作ったのが下のテンプレートで、以下コマンドを実行します。

$templ=@’
{title*:Geohash}
{date:2015年12月4日} {time:23:51}
{description:ジオコード(地理座標)の一つで、緯度と経…}
{title*:Signal Processing Toolkit}
{date:2015年7月8日} {time:23:16}
{description:音声データをコマンドツールだけで処理でき…}
‘@

Get-Content .\feed.txt | ConvertFrom-String -TemplateContent $templ | Format-Table -AutoSize title, date, time, description

テンプレートの選び方によって結果も違ってくるので、いろいろと試す必要はあります。
実行結果
powershell01

なかなか面白いです。
ひさびさのPowerShellでした。やはりPowerShellいいですね。

参考:

http://www.powershellmagazine.com/2014/09/09/using-the-convertfrom-string-cmdlet-to-parse-structured-text/

Add-in / Office 2016

以前、以下の記事でJavaScriptによるExcelのデータ読み書きのテストをしましたが、VisualStudioを使ったものでした。

「Apps for Office」http://crossframe.iiv.jp/20131104603/

今回は、共有フォルダからアドインを読み込む方法でテストをしてみました。環境について下記を参照しました。

参考) 「Office 2016で進化したOffice アドイン」http://www.ka-net.org/blog/?p=6213

XMLファイル、JavaScriptプログラムは下記を参考にしました。

参考) https://github.com/OfficeDev/office-js-snippet-explorer

https://github.com/OfficeDev/office-js-snippet-explorer/tree/master/excel-snippets/setValueInRange.js

プグラムは、ボタンを押すとExcelのシートに値を書き込むシンプルなものです。
Office2016_01

sample.xml

<?xml version="1.0" encoding="utf-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:type="TaskPaneApp">
  <Id>6492a0e5-b158-47da-9145-6804c67ed8d9</Id>
  <Version>1.0</Version>
  <ProviderName>Microsoft</ProviderName>
  <DefaultLocale>EN-US</DefaultLocale>
  <DisplayName DefaultValue="excel-js-snippet-explorer"/>
  <Description DefaultValue="Contains snippets for ExcelJS."/>
  <Capabilities>
    <Capability Name="Workbook"/>
  </Capabilities>

  <DefaultSettings>
    <SourceLocation DefaultValue="http://192.168.11.111/sample.html"/>

  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

Idは、

Wscript.Echo LCase(Mid(CreateObject(“Scriptlet.TypeLib”).GUID, 2, 36))

で生成できます。
このファイルを共有フォルダに置きExcelから選択します。
共有フォルダは、Excelを使用するWindowsに、C:\Shareのように作成して、共有設定します。
ここをExcelオプション->セキュリティセンタ->信頼できるアドインカタログのアドレスに追加します。(「メニューに表示する」をチェック)
Excelを起動して、挿入->マイアドイン->共有フォルダで、アドインが現れクリックします。
すると上の画面が表示されます。シート右側に表示されたWeb画面のボタンを押すと、数値が表示されます。
画面ファイルは、xmlファイルに書かれたアクセス先であるWebサーバをどこかに立て、そこに下記ファイルを置きます。

sample.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script>
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script>
Office.initialize = function(reason){}
$(function(){
  $("#btn").click(function(){
    Excel.run(function (ctx) {
      ctx.workbook.worksheets.getItem("Sheet1").getRange("A1:C3").values = 7;
      return ctx.sync();
    }).catch(function (error) {
      console.log(error);
    });
  });
});
</script>
</head>
<body>
<h3>Excel Add-in Test</h3>
<input id="btn" type="button" value="OK">
</bo
</html>

以前もこの件の記事を書いたときに思いましたが、JavaScriptとExcelという組み合わせは、とても可能性を秘めていると感じます。しかしまだ使いにくいと思います。もっと簡単に連携できるしくみが欲しいところです。シート上にWebViewが表示できればベストですが・・

Microsoft Edge

Windows10 で登場した新しいWebブラウザ、Edge。Windows95以来、約20年使われ続けた歴史あるブラウザInternet Explorerがとうとう交代することになりました。IEに関しては、いろんなケースで長年付き合ってきたので、感慨深いものがあります。当時インターネットの対応に出遅れたMicrosoftが、先行するNetscapeをつぶすため、無料でIEを配布したときは、とても話題になりました。それ以来、その独自路線にいろんな批判を浴びながらも、バージョンアップを重ねてきました。互換性を保ったバージョンアップが限界となり、ついに新しいブラウザの登場となったわけです。新しいブラウザEdgeは、独自仕様を排除し、Web標準を意識しています。
EdgeとIEの比較をテストサイトを使って、見てみました。

Edge
win_ed_html5

win_ed_octane

IE11 / Windows 10
win_ie11_html5

win_ie11_octane

当然のことながら、Edgeの方が数値的には勝っています。
Google Chrome ver45が、html5 526, Octane 15891でさらに上のスコアですが、IEに比べてかなりChromeに近づいてきました。asm.jsはEdgeの方が優れているという話もありましたが、この数値では、Chromeよりわずかに劣っているようです。(Chromeは31149) (asm.jsの性能に興味があったので、プログラムを作って比較したのですが、思った値にならなかったので、このOctaneを使うことにしました。)
数値がすべてではありませんが、差異を見る上では参考になります。
また、ユーザエージェントも調べてみました。

IE11

Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; Touch; rv:11.0) like Gecko

Edge

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240

かなり長くなっています。これを見ると、IEを完全に捨てていることがわかります。Webサーバには、ChromeまたはSafariとして認識してほしい、ということですね。
IE標準で作られた業務用Webアプリケーションなどは多数あるので、それらのためにIEを残しているというのは賢明だと思います。
互換性という過去しがらみから解き放たれ、リスタートした新しいブラウザに、今後期待したいと思います。

F# WPF Application

F#のみで、WPFアプリケーションが開発できるということを知り、久しぶりにF#を使ってみました。

参考 : Pure F# WPF GUIアプリ開発に向けて

http://qiita.com/nida_001/items/6ea321aff7f664a0e7f3

環境 : VisualStudio 2013 / Windows 10

オンラインで検索して、F# Empty Windows App (WPF)を選択します。

F#wpf_01

ツールボックスから部品を選択します。
F#wpf_02

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ViewModels;assembly=FsEmptyWindowsApp1"
    xmlns:fsxaml="http://github.com/fsprojects/FsXaml"
    Title="MVVM and XAML Type provider" Height="264.706" Width="472.059">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid Margin="0,0,2,16">
        <Button Content="Button"  Command="{Binding Path=ButtonPress}" HorizontalAlignment="Left" Margin="164,132,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox Text="{Binding Text01}" HorizontalAlignment="Left" Height="23" Margin="69,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <TextBox Text="{Binding Text02}" HorizontalAlignment="Left" Height="23" Margin="262,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    </Grid>
</Window>

テキストボックスとボタンを関連づけます。

namespace ViewModels

open System
open System.Windows
open FSharp.ViewModule
open FSharp.ViewModule.Validation
open FsXaml

type MainView = XAML<"MainWindow.xaml", true>

type MainViewModel() as self = 
    inherit ViewModelBase() 
 
    let text01 = self.Factory.Backing(<@ self.Text01 @>, "")
    let text02 = self.Factory.Backing(<@ self.Text02 @>, "")
    member this.Text01 with get() = text01.Value and set(value) = text01.Value <- value
    member this.Text02 with get() = text02.Value and set(value) = text02.Value <- value
    member this.ButtonPress = self.Factory.CommandSync(fun () ->
        let str = text01.Value
        let len = String.length(str)
        if len = 0 then
            MessageBox.Show("Empty Value") |> ignore
        else if String.forall Char.IsDigit str then
            let x = str |> Double.Parse
            text02.Value <- (sqrt x) |> string
        else
            MessageBox.Show("Invalid Value") |> ignore
    )

関連づける部分が、馴染みがない方法なので、参考サイトがないとできませんでした。(ありがとうございます)

実行結果です。平方根を計算します。

F#wpf_03

簡単な入力チェックもしました。
F#wpf_04

なかなか使う機会がない言語は、とりかかりに時間がかかったりします。簡単な入力、出力を抑えておけば、次に必要になったとき、続きから作りやすくなるので、メモしておきたいと思います。


#
F#
Tags:

iOS, Android / VisualStudio 2015

前回に引き続き、iOS, Androidアプリのビルドを試してみました。
プロジェクトを作ろうとすると、Xamarinのインストールを要求されます。

vs2015_06

iOSのプロジェクトを選択します。
vs2015_ios01

おなじみのViewControllerのソースがC#で生成されました。
vs2015_ios02

実行しようとすると、Macが必要になるようです。
vs2015_ios03

iOSはここまでにして、次はAndroid。ユーザ登録をしておく必要があります。

Androidプロジェクトを選択します。
vs2015_and01

ソースが生成されました。
vs2015_and02

ビルドするとエミュレータが起動しました。

vs2015_and03

C#ですべて開発できる点は面白そうです。
しかし、iOSはやはりMacでしょうね。