Windows Dev. Site

Excel Services REST API / SharePoint

SharePointには以前から興味を持っていましたが、最近Excelの機能で使いたいことがあり、それに関連してREST APIのテストしてみました。

環境 : Excel 2010 / Windows 7, SharePoint 2013 / Windows 2012R2
sp01
まず上のようなB,C列のデータをグラフ表示する簡単なシートを作りました。(グラフの名前をGraph1とします)
A1の初期値を変えると、B,C列のデータも変化します。
これを普通にファイルを保存すると同じように、サーバに保存します。
普通に、といったのは、ファイル名のところに、下のURLを記入するからです。

http://[ShaerPointサーバ名]/sites/cata01/docApp/Book2.xlsx

何か違和感がありますが、これで認証ポップアップがでてきて、サーバに保存します。
URLはSharePointサーバであらかじめ設定したドキュメントを置く場所をさします。

sp02
SharePointのドキュメントリストをみると、保存されているのがわかります。
そして、これをブラウザ上で表示してみます。
sp03

次に、REST APIを使って、データを変更して、グラフを変えてみます。

http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.05

sp04

http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.8

sp05

URLでこのようにExcelシート内部のデータを操作できるのが、とても興味深いです。
Webということは、JavaScript連携も可能ということなので、またの機会にやってみたいと思います。

参考 : http://msdn.microsoft.com/ja-jp/library/ee556413.aspx

Background Inteligent Transfer Service

BITSというPowerShellのファイルの分割ダウンロードをやってみました。
本当に分割リクエストをしているのか、また途中でサスペンドして、レジュームで継続してダウンロードするか、をApacheを使って確認しました。

環境 : PowerShell 2.0 / Windows 7 (192.168.11.10), apache2 / Ubuntu 14.04 (192.168.11.14)
Webサーバの準備。

dd if=/dev/zero of=dummy.zip bs=1M count=200

ダミーファイルを/var/www/htmlに作成。

LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Range}i\”" combined

レンジがわかるように/etc/apache2/apache2.confのLogFormatを変更。

tail -f /var/log/apache2/access.log

でログ確認。サスペンドは20秒ほど。(改行部分)

BTS02

転送が始まって、少ししたら、サスペンド、そしてレジューム。
サスペンドするために、非同期で実行。

BTS01

レンジが指定できないようなのが、ちょっと不便な気がします。自動的に調整しているみたい。
サスペンドして、Windows7を再起動後、レジュームしても途中からダウンロードしました。
巨大ファイルを何日かかけてダウンロードする用途があるときは、便利。

PowerShell DSC / Hyper-V

PowerShell 4.0の新しい機能である、Desired State Configurationを使ってみました。

参考:PowerShell DSCによるプッシュ型展開

http://www.atmarkit.co.jp/ait/articles/1407/24/news131.html

このDSCというのは、サーバの設定を自動的にするしくみで、リモートホストとPushおよびPull通信をします。

ここでは、Windows Server 2012R2のHyper-VにWindows 8.1を仮想化した環境で、2012R2から8.1へのPushをテストしました。
設定するものは、ファイルリソースを使って、メッセージを指定のフォルダに書き込み見ます。

8.1側は以下の設定を事前にします。

Enable-PSRemoting -Force
Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force
Set-ExecutionPolicy RemoteSigned

hello.ps1

Param([string]$msg)

Configuration DSCTest
{
    Node "192.168.11.11"
    {
        File dscFile
        {
            DestinationPath = "C:\work\hello.txt"
            Ensure = "Present"
            Type = "File"
            Contents = $msg
        }
    }
}
$outputPath = ".\DSCTest"
DSCTest -OutputPath $outputPath
Start-DscConfiguration -Path $outputPath -Wait -Verbose -Credential 192.168.11.11\user

結果
dsc01

冪等性から、何度設定しても同じ状態になる特徴がありますが(同じ状態だと何もしない)、
上のようにメッセージを引数で変えてやると、毎回設定にいくようです。

対象ノードは複数設定でき、いろいろと応用した使い方ができそうです。

PowerShellでLDAP

LDAPのデータ操作をPowerShellでやってみました。ActiveDirectoryでも同様にできると思いますが、汎用性と導入のしやすさを考えて、OpenLDAPを使いました。

環境 : PowerShell 2.0 / Windows 7 <-> OpenLDAP 2.4.31 / Ubuntu 14.04 LTS

OpenLDAPのインストールは以下のコマンドを実行しただけ。

apt-get install ldap-utils
apt-get install slapd

自動で起動し、使用可能となります。
認証は、cn=admin,dc=nodomain / password
ホスト名は設定していないので、nodomainのままですが、これで使えるようになるのはスゴイ!
テスト前に、データを適当に作成しておきます。(ldapmodifyでもいいですが、ApacheDirectoryStudioを使用)

まずデータの参照から。

$domain = "LDAP://192.168.11.11:389/dc=nodomain"
$auth = [System.DirectoryServices.AuthenticationTypes]::FastBind
$root = New-Object System.DirectoryServices.DirectoryEntry($domain,"cn=admin,dc=nodomain", "password", $auth)
$query = New-Object System.DirectoryServices.DirectorySearcher($root,"(objectclass=*)")
$entries = $query.FindAll()
$entries | %{$_.Properties}
$entries[5] | %{$_.Properties}
$entries[5] | %{$_.Properties["cn"]}
$entries[5] | %{$_.Properties}).PropertyNames

ldap01

更新対象のuser02のデータのみを確認してみます。
ldap02

次に、属性の追加・更新。

$query = New-Object System.DirectoryServices.DirectorySearcher($root,"(&(objectclass=*)(uid=user02))")
$entry = $query.FindOne().GetDirectoryEntry()
$entry.description.Value="Add Value by PS"
$entry.SetInfo()
$entry.givenname.Value="Edit Test"
$entry.SetInfo()

$query.FindOne() | %{$_.Properties}

ldap03

user02にデータが更新されていることが確認できます。

LDAPデータをPowerShellオブジェクトとして扱えるのは便利。

PowerShellでJSON

PowerShellには、PowerShellオブジェクトとJSONデータを相互に変換できる便利なコマンドレットがあります。

ConvertTo-Json
ConvertFrom-Json

今回のテストで使うJSONデータは、WebからPowerShellで取得します。
今日は台風ということもあって、天気情報を取得してみたいと思います。
情報元は、ライブドア天気情報の名古屋地区のものです。

環境: PowerShell ver3.0 / Windows 8

$wr = Invoke-WebRequest -uri http://weather.livedoor.com/forecast/webservice/json/v1?city=230010

($wr.Content | ConvertFrom-Json).description.text

wr01

wr02e

なかなか実用的なテストになりました。

Multithreading PowerShell

PowserShellを使ったマルチスレッドをテストしてみました。
1秒から10秒までスリープするスレッド10個を同時に走らせています。
AddScript, AddArgmentによるパラメータ渡し、結果取得をイメージするため、2乗する演算をいれています。(手抜き感・・)
ソースは下記サイトにあるものを簡略化しました。

環境 : PSVersion 2.0 / Windows 7


$threads = 10
 
$scriptBlock = {
   Param (
      [int]$num
   )
   Start-Sleep -Seconds $num
   $res = New-Object PSObject -Property @{num=$num;num2=$num*$num}
   Return $res
}
 
$runspacePool = [RunspaceFactory]::CreateRunspacePool(1, $threads)
$runspacePool.Open()
$jobs = @()

1..10 | % {
   $job = 1::Create().AddScript($scriptBlock).AddArgument($_)
   $job.runspacePool = $runspacePool
   
   $jobs += New-Object PSObject -Property @{
      num = $_
      pipe = $job
      result = $job.BeginInvoke()
   }
}
ForEach ($job in $jobs)
{   
     $job.pipe.EndInvoke($job.result)
}

multiPS
結果が1行/1秒ごとに表示されるので、同時に走っていることが確認できます。
$threads数を絞ると、表示終了までにさらに時間がかかることも確認できます。

参考サイト : http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/

C# Interactive / Mono

前回のF# Interactive / Monoの記事を書いたとき、C#では同様なことはできないと思いこんでいましたが、シェルスクリプトの形式で書けることがわかり、テストしてみました。

csi01

この二つ目まではC#でもできそうだとわかっていましたが、三つ目のような #!/usr/bin/csharpという書き方ができるとは知りませんでした。
(Perlなどと同様)

ということは、

#!/usr/bin/csharp

while(true){
	var str = Console.ReadLine();
	if(str == null){
		break;
	}
	Console.WriteLine("{0} : Length {1} ", str, str.Length);
}

ということができる(標準入力が受け取れる)ということで、以下が結果です。

csi02

LinuxだとShellが強力なので、このような書き方ができるということは、とてもありがたく思えます。


#
C#
Tags:

F# Interactive / Mono

これまで.NET環境はWindowsだけでしか使ったことがありませんでしたが、はじめてMono(Linuxの.NET環境)をUbuntu上でインストールしてみました。自宅の環境の都合で、F#をLinuxで使うと、いろいろと便利に思ったからです。

もともとLinux上でPowerShellが完全に動作してくれればそれでもよかったのですが、その実装のPash (http://pash.sourceforge.net/) がちょっと古めなので、追いかけるをやめて、F# Intaractive (fsharpi, fsi.exe)環境でやりたいことを実現することにしました。
ここでは、環境についてメモっておきたいと思います。
(PowerShellはオブジェクトのパイプライン処理、Linuxのシェルはテキストのパイプライン処理ですが、JSONファイルをオブジェクトと見立たててみると面白いかも・・ということで、FSharp.Dataを利用)

環境 : Ubuntu 14.04 LST(64bit) / VirtualBox 4.3.10 / Windows 7
[Mono,FSharpのインストール]

sudo apt-get update
sudo apt-get install mono-complete
sudo apt-get install fsharp

[FSharp.Dataのインストール]

https://github.com/fsharp/FSharp.Data

ここにあるソースでビルドを試みましたが、build.sh実行時に失敗。
fsharpi build.fsx のfsharpiを違うバージョンで試すとビルドを始めましたが、途中でエラー。
NuGetでインストールする方法に変更。

参考) http://monomvc.wordpress.com/2012/03/06/nuget-on-mono/

http://nuget.codeplex.com から NuGet.exeをダウンロード(なんと単一ファイル)
/optに配置して実行

mozroots –import –sync
mono NuGet.exe install FSharp.Data

以下サンプルプログラム

Ubuntu_fsx
参考)http://fsharp.github.io/FSharp.Data/library/JsonProvider.html

コンパイルなしに利用できます。このあたりダイナミック言語ライクに使えるところがいいです。
ちょっと処理速度は遅いですが。。


#
F#
Tags:

MSMQ / PowerShell

ErlangつながりでRabitMQに興味をもち、別件でテストしていたとき、MSMQというWindows標準のメッセージキューシステムがWindowsにあることを知りました。(順序が逆か?)
そこでいろいろと調べてテストをしましたが、自分の思う形で動かすのに少し手こずりました。

環境 : Windows 7 & Windows 8.1

・ドメインモードとワークグループモードがあり、ワークグループモードでは、プライベートキューのみ
・リモート接続ではプライベートキューへの送信がサポートされていない(?)

といったことから、2台のPCで通信したかったのですが結局Windows7ローカルのみでテストすることにしました。

サーバ設定
msmq_c

送信側
msmq_s

受信側
msmq_r

PowerShellで簡単に実装できるので、いろんなケースで活用できそうです。
MSMQにかぎらず、MessageQueueはいろいろとホットなので、もう少し掘り下げてみたいです。