院長のメモ帖
2013年12月13日 金曜日
Nexus7 LTEを買った
ずーとWindowsにこだわってきましたが、ついにAndroid端末を買ってしまいました。買ったのは話題のNexus7 LTEです。
最近ちょっとしたアプリはIOSとAndroidばかり出るようになって一つはAndroid端末がないとだめだなというケースが増えてきました。
それでも、10インチWindowsタブレットだと、レガシーアプリも豊富だし、動物病院業務用に作った社内ソフトも動くしということで、アプリに関しては決定的な理由にならず何とか頑張ってきましたが、外出のたびにかばんに入れて出かけるがのちょっと手間でして、ちょこっと外出するとき上着のポケットに入るぐらいのSIMフリー端末があると便利だなぁという気がしてきたので7インチのタブレットの購入を決意しました。
ちなみにスマホは論外です。2年縛りで総額でみると高すぎるし、あんな小さい画面では一番やりたいこと=自炊ビューワーとしては決定的に魅力に欠けます。
Nexus7と最後まで迷ったDellから年末か年初に出る予定のWindows 8.1のSIMフリー端末もかなり魅力的でしたが、去年買ったWindowsの10インチArrowsTabがまだまだ使えるので、今回はAndroid端末にしました。
購入は美濃加茂市のケーズデンキにしました。通販でもほとんど横並びの値段ですし、本体こそ割り引いてくれませんでしたが、一緒に買ったアクセサリー類は10%引いてくれたのでまあいい値段で買えたかなと思います。
実物をちょっと触った感想は、音声認識の検索って少し気恥ずかしいけど結構便利ですね。標準の入力機能は極めて使いにくいので重宝してます。ただ、標準でファイルマネージャがないのはWinユーザーからするとちょっとびっくり。TIPsにしたがいESファイルエクスプローラーとPerfect Viewerをいれて自炊ビューワーとして機能するようになりました。
10インチのArrowsと比較すると、画面が小さくても解像度が上なので、持ちやすさも含めると、Nexus7のほうが自炊ビューワーとして断然上です。残念なのはSDカードスロットさえあれば全文庫を放り込んでおくんですが、これがないこと。Wifiストレージを購入するかせっかくのLTEを生かしてダウンロードできる体制を整えるか...悩むところです。
最近ちょっとしたアプリはIOSとAndroidばかり出るようになって一つはAndroid端末がないとだめだなというケースが増えてきました。
それでも、10インチWindowsタブレットだと、レガシーアプリも豊富だし、動物病院業務用に作った社内ソフトも動くしということで、アプリに関しては決定的な理由にならず何とか頑張ってきましたが、外出のたびにかばんに入れて出かけるがのちょっと手間でして、ちょこっと外出するとき上着のポケットに入るぐらいのSIMフリー端末があると便利だなぁという気がしてきたので7インチのタブレットの購入を決意しました。
ちなみにスマホは論外です。2年縛りで総額でみると高すぎるし、あんな小さい画面では一番やりたいこと=自炊ビューワーとしては決定的に魅力に欠けます。
Nexus7と最後まで迷ったDellから年末か年初に出る予定のWindows 8.1のSIMフリー端末もかなり魅力的でしたが、去年買ったWindowsの10インチArrowsTabがまだまだ使えるので、今回はAndroid端末にしました。
購入は美濃加茂市のケーズデンキにしました。通販でもほとんど横並びの値段ですし、本体こそ割り引いてくれませんでしたが、一緒に買ったアクセサリー類は10%引いてくれたのでまあいい値段で買えたかなと思います。
実物をちょっと触った感想は、音声認識の検索って少し気恥ずかしいけど結構便利ですね。標準の入力機能は極めて使いにくいので重宝してます。ただ、標準でファイルマネージャがないのはWinユーザーからするとちょっとびっくり。TIPsにしたがいESファイルエクスプローラーとPerfect Viewerをいれて自炊ビューワーとして機能するようになりました。
10インチのArrowsと比較すると、画面が小さくても解像度が上なので、持ちやすさも含めると、Nexus7のほうが自炊ビューワーとして断然上です。残念なのはSDカードスロットさえあれば全文庫を放り込んでおくんですが、これがないこと。Wifiストレージを購入するかせっかくのLTEを生かしてダウンロードできる体制を整えるか...悩むところです。
2013年11月17日 日曜日
なんとか残留...FC岐阜ホーム最終戦
今年も、FC岐阜のホーム最終戦を観てきました。
最下位争いをしている鳥取との勝ち点差が4ということで、鳥取と同じかそれ以上の試合結果で残留が決定する試合。去年となんだか同じような状況で、正直もう少し上の順位になれないものかと思います。
試合は...もう振り返りたくないぐらいのワンサイドゲーム。開始3分でセットプレーから失点し、2点目も結構早い時間帯にやられてしまい、あとはそれほど攻めてこない相手にいなされているような感じでした。そして後半に3点目を奪われてからは、もうみんなの関心は他会場結果...まわりの人たちも試合よりスマホが気になります。試合終了後数分して、鳥取が負けて残留が決定したとの場内コールにこの日唯一の喜びの声が沸きました。
試合後、元代表選手の服部の引退セレモニーもありました。遠目によくわからなかったのですが、少し泣いているようでした。僕は、コンサドーレサポーターの方々も結構残ってくれてエールを送ってくれたのを見て、なんだかジーンときてしまいました。日本サッカーに大きな足跡を残した名選手がキャリアの終点を迎えるシーンをこの目で見ることができるチャンスを作ってくれたチームが、来年もまたこの地で試合ができることを素直に喜ぼうと思います。
最下位争いをしている鳥取との勝ち点差が4ということで、鳥取と同じかそれ以上の試合結果で残留が決定する試合。去年となんだか同じような状況で、正直もう少し上の順位になれないものかと思います。
試合は...もう振り返りたくないぐらいのワンサイドゲーム。開始3分でセットプレーから失点し、2点目も結構早い時間帯にやられてしまい、あとはそれほど攻めてこない相手にいなされているような感じでした。そして後半に3点目を奪われてからは、もうみんなの関心は他会場結果...まわりの人たちも試合よりスマホが気になります。試合終了後数分して、鳥取が負けて残留が決定したとの場内コールにこの日唯一の喜びの声が沸きました。
試合後、元代表選手の服部の引退セレモニーもありました。遠目によくわからなかったのですが、少し泣いているようでした。僕は、コンサドーレサポーターの方々も結構残ってくれてエールを送ってくれたのを見て、なんだかジーンときてしまいました。日本サッカーに大きな足跡を残した名選手がキャリアの終点を迎えるシーンをこの目で見ることができるチャンスを作ってくれたチームが、来年もまたこの地で試合ができることを素直に喜ぼうと思います。
2013年11月 2日 土曜日
PowerShellとC#の連携
最近、PowerShellスクリプトにはまってます。
PowerShellが出始めた当初は、パイプラインの考え方がなかなかなじめず全然使いこなせてませんでした。それというのも最初に買った何冊かの解説本のせいでもあります。いま読み返すと、著者がPowerShellを全く使いこなせずに書いたことが明確に分かってしまうほど内容の薄い本でした。
C#でLINQを使いこなしてからPowerShellの世界に戻ってい見ると、パイプラインの動作も簡単に理解でき、また3.0以降のPowerShellはかなりコマンドも充実してきたこともあり結構な数のスクリプトにサーバー管理を任せるようになりました。
ただ、僕のホームグラウンドはC#でして、だいぶ使い勝手がよくなったとはいえPowerShell IDEとVisual Studioの使い勝手の違いがどうしても気に入りません。また、Powershellの実行結果をグラフィカルに処理しようと思うと、Excelとかを使ってデーターを処理して、それをコマンドに直して実行させたりするのが結構めんどくさいので、C#で直接Powershellをいじれないものかと思ってしらべてみたら、ちゃんとやり方があるんですね。
1) 次のdllをプロジェクトに参照設定する。
C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll
System.Management.Automation
2) コマンド内容を文字列Sourceとして、次のメソッドを使うと結果の列挙が得られる
public static IEnumerable<dynamic> RunCommands(string Source, object[] parameter)
{
using (var invoker = new RunspaceInvoke())
{
System.Collections.ObjectModel.Collection<PSObject> results = invoker.Invoke(Source, parameter);
return results.OfType<dynamic>();
}
}
Powershellの結果は、PSObjectという動的な型にくるまれて帰ってくるので、そのまま使ってもいいのですが、これをDynamicにキャストして置けば、このメソッドを使うソースでは1)のusingを省けるのでキャストしています。プロパティー名さえ分かっていれば、これで必要な結果を取り出すことはできます。
また、PSObject.BaseObjectに元の型のままのオブジェクトが入っているので、元の型情報をdllを参照して用意できるなら、以下のジェネリックメソッドが使えます。
public static IEnumerable<T> RunCommands<T>(string Source, object[] parameter) where T : class
{
using (var invoker = new RunspaceInvoke())
{
System.Collections.ObjectModel.Collection<PSObject> results = invoker.Invoke(Source, parameter);
return results.Select(r => r.BaseObject as T);
}
}
このジェネリック版を使えば、静的なC#の世界にすべてを持ち込めます。
この2つのメソッドで、PowershellでできることがC#から呼び出せるようになったので、グラフィカルな管理ツールを作成してみようかなと思ってます。
この記事は、以下のページを参考にさせていただきました。あわせてお読みください。
++C++;// 未確認飛行 C
PowerShellが出始めた当初は、パイプラインの考え方がなかなかなじめず全然使いこなせてませんでした。それというのも最初に買った何冊かの解説本のせいでもあります。いま読み返すと、著者がPowerShellを全く使いこなせずに書いたことが明確に分かってしまうほど内容の薄い本でした。
C#でLINQを使いこなしてからPowerShellの世界に戻ってい見ると、パイプラインの動作も簡単に理解でき、また3.0以降のPowerShellはかなりコマンドも充実してきたこともあり結構な数のスクリプトにサーバー管理を任せるようになりました。
ただ、僕のホームグラウンドはC#でして、だいぶ使い勝手がよくなったとはいえPowerShell IDEとVisual Studioの使い勝手の違いがどうしても気に入りません。また、Powershellの実行結果をグラフィカルに処理しようと思うと、Excelとかを使ってデーターを処理して、それをコマンドに直して実行させたりするのが結構めんどくさいので、C#で直接Powershellをいじれないものかと思ってしらべてみたら、ちゃんとやり方があるんですね。
1) 次のdllをプロジェクトに参照設定する。
C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll
System.Management.Automation
2) コマンド内容を文字列Sourceとして、次のメソッドを使うと結果の列挙が得られる
public static IEnumerable<dynamic> RunCommands(string Source, object[] parameter)
{
using (var invoker = new RunspaceInvoke())
{
System.Collections.ObjectModel.Collection<PSObject> results = invoker.Invoke(Source, parameter);
return results.OfType<dynamic>();
}
}
Powershellの結果は、PSObjectという動的な型にくるまれて帰ってくるので、そのまま使ってもいいのですが、これをDynamicにキャストして置けば、このメソッドを使うソースでは1)のusingを省けるのでキャストしています。プロパティー名さえ分かっていれば、これで必要な結果を取り出すことはできます。
また、PSObject.BaseObjectに元の型のままのオブジェクトが入っているので、元の型情報をdllを参照して用意できるなら、以下のジェネリックメソッドが使えます。
public static IEnumerable<T> RunCommands<T>(string Source, object[] parameter) where T : class
{
using (var invoker = new RunspaceInvoke())
{
System.Collections.ObjectModel.Collection<PSObject> results = invoker.Invoke(Source, parameter);
return results.Select(r => r.BaseObject as T);
}
}
このジェネリック版を使えば、静的なC#の世界にすべてを持ち込めます。
この2つのメソッドで、PowershellでできることがC#から呼び出せるようになったので、グラフィカルな管理ツールを作成してみようかなと思ってます。
この記事は、以下のページを参考にさせていただきました。あわせてお読みください。
++C++;// 未確認飛行 C
2013年10月17日 木曜日
キャノンのプリンタードライバーとPC管理者
先日、インクジェットのFAX複合機が紙詰まりを起こした後、印刷がかすれるようになって、メーカー修理対象になってしまったので、新品に買い換えました。新しい機種はキャノンのPixus MX923ですが、ドライバーインストールに少しはまりました。
インストールCDからセットアッププログラムの"\MSETUP4.EXE"をダブルクリックすると、UAC画面が出て管理者権限が要求されますが、OKを押すと以下のように
「ソフトウェアをインストールするためには、管理者のアカウントとしてログオンしている必要があります。」というエラーが出て目が点になりました。
この時ログインしていたアカウントはドメイン管理者で、その権限はローカルPCの管理者権限ももれなくついてきているわけで、UAC画面も経由しているのに何の権限が足りないんだ!と混乱してしまいました。
別のPCで試しても同じでどういうこと?と思いましたが、ふと、ローカルPCのAdministoratorグループにアカウントを登録してみたところすんなりセットアップできました。要するにメッセージの通り明示的にローカルPCの管理者なってるかどうか確認していたんですね。
この仕様は、はっきり言っておかしいですね。セキュリティに穴をあけることを要求していますよね。ログインはユーザー権限、必要な時だけAdministoratorに昇格することをマイクロソフトが推奨しているわけですから。この標準に合わせて、権限の確認だけにしてほしいものです。
2013年10月 7日 月曜日
WS2012R2の再起動時にVMがオフになる その2
前回報告した、Windows Server 2012R2のVMがホスト再起動・シャットダウン時に正常シャットダウンせず電源Off状態になる不具合は、MicrosoftのWinodws Server Forumでも報告されていて、現時点で解決策はなさそうです。しょうがないので、以下のようなpowershellスクリプトを作ってしのいでいます。
# HyperVホスト再起動スクリプト
# Arg1 再起動するホスト。指定しない場合はローカルPCを再起動する。
$WaiToKillTime = 180
if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
write-host "実行には管理者特権が必要です。"
exit
}
if ($args.Length -eq 0) {$comp = $env:COMPUTERNAME} else {$comp = $args}
$VmAll = Get-VM -ComputerName $comp
write-host Target:$comp
if ($VmAll.Count -eq 0)
{
Write-Host "VMが存在しないので処理をキャンセルします。"
}
else
{
#起動していないVMは、次回起動しない。
$VmAll | where state -NE Running | where AutomaticStartAction -NE Nothing | set-vm -AutomaticStartAction Nothing
$vms = $VmAll | where state -EQ Running #起動しているVM
$vms | Stop-VM -AsJob #非同期で停止
$vms | where AutomaticStartAction -NE Start | set-vm -AutomaticStartAction Start #次回起動するようマーク
#VMがすべてシャットダウンするかタイムアウトするまで待つ
for ($i = 1; $i -lt $WaiToKillTime; ++$i)
{
$vs = Get-VM -ComputerName $comp | where state -EQ Running
if ($vs.count -eq 0) { break}
$vs | select name | ft
start-sleep -s 1
}
Restart-Computer -ComputerName $comp -Force #ホストのリスタート開始
}
このスクリプトでは、現在実行中のVMの「自動開始アクション」を「常に開始に」、実行していないVMは「何もしない」に変更し、実行中のVMをシャットダウンします。
続いて、全VMがシャットダウンするかタイムアウト(180秒)するまで待ってから、ホストコンピューターを再起動させます。
とりあえず、Windows Updateを手動にしてこのスクリプトで再起動させてしのいでいますが、10/17の正式発売日には修正されているんでしょうか。今回Win8.1とWin2012R2のRTMがMSDN/TechNetにいったんは提供されないと発表されたのは、実はまだ開発中で本来のRTMの水準に達していなかったからではないかと疑ってしまいます。とにかく不振のWin8を立て直すためにWin8.1の発売を延期することは考えられなかったので、ぎりぎりまで修正を続けて、発売日には結構な数の修正プログラムがWindows Update経由で提供されるんじゃないでしょうか。
# HyperVホスト再起動スクリプト
# Arg1 再起動するホスト。指定しない場合はローカルPCを再起動する。
$WaiToKillTime = 180
if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
write-host "実行には管理者特権が必要です。"
exit
}
if ($args.Length -eq 0) {$comp = $env:COMPUTERNAME} else {$comp = $args}
$VmAll = Get-VM -ComputerName $comp
write-host Target:$comp
if ($VmAll.Count -eq 0)
{
Write-Host "VMが存在しないので処理をキャンセルします。"
}
else
{
#起動していないVMは、次回起動しない。
$VmAll | where state -NE Running | where AutomaticStartAction -NE Nothing | set-vm -AutomaticStartAction Nothing
$vms = $VmAll | where state -EQ Running #起動しているVM
$vms | Stop-VM -AsJob #非同期で停止
$vms | where AutomaticStartAction -NE Start | set-vm -AutomaticStartAction Start #次回起動するようマーク
#VMがすべてシャットダウンするかタイムアウトするまで待つ
for ($i = 1; $i -lt $WaiToKillTime; ++$i)
{
$vs = Get-VM -ComputerName $comp | where state -EQ Running
if ($vs.count -eq 0) { break}
$vs | select name | ft
start-sleep -s 1
}
Restart-Computer -ComputerName $comp -Force #ホストのリスタート開始
}
このスクリプトでは、現在実行中のVMの「自動開始アクション」を「常に開始に」、実行していないVMは「何もしない」に変更し、実行中のVMをシャットダウンします。
続いて、全VMがシャットダウンするかタイムアウト(180秒)するまで待ってから、ホストコンピューターを再起動させます。
とりあえず、Windows Updateを手動にしてこのスクリプトで再起動させてしのいでいますが、10/17の正式発売日には修正されているんでしょうか。今回Win8.1とWin2012R2のRTMがMSDN/TechNetにいったんは提供されないと発表されたのは、実はまだ開発中で本来のRTMの水準に達していなかったからではないかと疑ってしまいます。とにかく不振のWin8を立て直すためにWin8.1の発売を延期することは考えられなかったので、ぎりぎりまで修正を続けて、発売日には結構な数の修正プログラムがWindows Update経由で提供されるんじゃないでしょうか。