SharePointには以前から興味を持っていましたが、最近Excelの機能で使いたいことがあり、それに関連してREST APIのテストしてみました。
環境 : Excel 2010 / Windows 7, SharePoint 2013 / Windows 2012R2
まず上のようなB,C列のデータをグラフ表示する簡単なシートを作りました。(グラフの名前をGraph1とします)
A1の初期値を変えると、B,C列のデータも変化します。
これを普通にファイルを保存すると同じように、サーバに保存します。
普通に、といったのは、ファイル名のところに、下のURLを記入するからです。
http://[ShaerPointサーバ名]/sites/cata01/docApp/Book2.xlsx
何か違和感がありますが、これで認証ポップアップがでてきて、サーバに保存します。
URLはSharePointサーバであらかじめ設定したドキュメントを置く場所をさします。
SharePointのドキュメントリストをみると、保存されているのがわかります。
そして、これをブラウザ上で表示してみます。
次に、REST APIを使って、データを変更して、グラフを変えてみます。
http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.05
http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.8
URLでこのようにExcelシート内部のデータを操作できるのが、とても興味深いです。
Webということは、JavaScript連携も可能ということなので、またの機会にやってみたいと思います。
参考 : http://msdn.microsoft.com/ja-jp/library/ee556413.aspx
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秒ほど。(改行部分)
転送が始まって、少ししたら、サスペンド、そしてレジューム。
サスペンドするために、非同期で実行。
レンジが指定できないようなのが、ちょっと不便な気がします。自動的に調整しているみたい。
サスペンドして、Windows7を再起動後、レジュームしても途中からダウンロードしました。
巨大ファイルを何日かかけてダウンロードする用途があるときは、便利。
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
結果
冪等性から、何度設定しても同じ状態になる特徴がありますが(同じ状態だと何もしない)、
上のようにメッセージを引数で変えてやると、毎回設定にいくようです。
対象ノードは複数設定でき、いろいろと応用した使い方ができそうです。
このBlogのURLを http://xfra.me/ から http://crossframe.iiv.jp/ に変更しました。
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
更新対象のuser02のデータのみを確認してみます。
次に、属性の追加・更新。
$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}
user02にデータが更新されていることが確認できます。
LDAPデータをPowerShellオブジェクトとして扱えるのは便利。
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
なかなか実用的なテストになりました。
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)
}
結果が1行/1秒ごとに表示されるので、同時に走っていることが確認できます。
$threads数を絞ると、表示終了までにさらに時間がかかることも確認できます。
参考サイト : http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/
前回のF# Interactive / Monoの記事を書いたとき、C#では同様なことはできないと思いこんでいましたが、シェルスクリプトの形式で書けることがわかり、テストしてみました。
この二つ目までは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);
}
ということができる(標準入力が受け取れる)ということで、以下が結果です。
LinuxだとShellが強力なので、このような書き方ができるということは、とてもありがたく思えます。
これまで.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
以下サンプルプログラム
参考)http://fsharp.github.io/FSharp.Data/library/JsonProvider.html
コンパイルなしに利用できます。このあたりダイナミック言語ライクに使えるところがいいです。
ちょっと処理速度は遅いですが。。
ErlangつながりでRabitMQに興味をもち、別件でテストしていたとき、MSMQというWindows標準のメッセージキューシステムがWindowsにあることを知りました。(順序が逆か?)
そこでいろいろと調べてテストをしましたが、自分の思う形で動かすのに少し手こずりました。
環境 : Windows 7 & Windows 8.1
・ドメインモードとワークグループモードがあり、ワークグループモードでは、プライベートキューのみ
・リモート接続ではプライベートキューへの送信がサポートされていない(?)
といったことから、2台のPCで通信したかったのですが結局Windows7ローカルのみでテストすることにしました。
サーバ設定
送信側
受信側
PowerShellで簡単に実装できるので、いろんなケースで活用できそうです。
MSMQにかぎらず、MessageQueueはいろいろとホットなので、もう少し掘り下げてみたいです。