2011/12/18

れあつい ~Twitterフォローユーザーのレア発言を取得してみる~

(* この記事は PowerShell Advent Calendar 2011 18日目の参加記事です。)


raretwit.ps1というスクリプトを作りました。
コードは一番下に置いたので、すぐに使ってみたいひとはそちらをどぞ。

2011/09/09

長月3.プログラムの実行回数を出力させる仕組みをみてみる3

前回の続きです。

長月1.プログラムの実行回数を出力させる仕組みをみてみる
http://win-enikki.blogspot.com/2011/09/1.html
長月2.プログラムの実行回数を出力させる仕組みをみてみる2
http://win-enikki.blogspot.com/2011/09/1_05.html

前回、最後にスクリプト付け加えました。
これは最終実行時間と、できたデータをオブジェクトに入れる処理です。

#レジストリプロパティを入力、時間を出力
function convtime($x) {
    $LittleEndianTime=$x[60..67] | % { $_.tostring("x2") }
    $BigEndianTime=$null
    $($LittleEndianTime.count-1)..0 | % { $BigEndianTime += $LittleEndianTime[$_] }
 
    $filetime=[convert]::ToInt64("$BigEndianTime", 16)
    [datetime]::fromfiletime($filetime)
}
 
#オブジェクトに各データを入れデータ格納
$result = $iname | % {
    $count = $iProp.$_[4]
    if ($count -ne 0){
        $output = New-Object psobject
        $output | Add-Member noteproperty pcount $iProp.$_[4]
        $output | Add-Member noteproperty pname $(func $_)
        $output | Add-Member noteproperty ptime $(convtime $iprop.$_)
        $output      
    }
}
 
#お好みでオブジェクト整形
$result | sort-Object -Property ptime -Descending

この処理はだいたい以下のような動きをさせている

2011/09/05

長月2.プログラムの実行回数を出力させる仕組みをみてみる2

前回の続き

長月1.プログラムの実行回数を出力させる仕組みをみてみる
http://win-enikki.blogspot.com/2011/09/1.html

では、残りのスクリプトをみていきます。

$iName | %{
    $count = $iProp.$_[4]
   
    if ($count -ne 0){
        "{0}回 {1}" -f $count, (func $_)
    }
}

プログラム名が記述されている$iName、
そのプログラムの実行回数を含む各種データが格納されてある$ipropを利用して、回数を表示させる。

では、そもそも$ipropに書かれているデータ構造はどうなっているのだろう?
$iPropに格納されているのは、以下のレジストリキーをカスタムオブジェクトとして取得し、
データを各プロパティ値として取得している。
HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count

レジストリエディターでキーをみたところ

2011/09/01

長月1.プログラムの実行回数を出力させる仕組みをみてみる

とっても面白いPowerShellスクリプトが掲載されていたので ご紹介

のんべんだらりぃ~ プログラム実行回数
http://d.hatena.ne.jp/chiaki1220jp/20110831

Windowsのレジストリにはプログラムの実行回数が記録されているところがあるので、
それを利用してどのプログラムを何回実行したかというのを出力するというもの。
一時、Winny防止の為 本当に起動してないかどうかを確かめるためのソフトが話題になったけど
そのソフトもどうやらここのレジストリを見ているみたい。
とはいえ、プロファイルに記載されるレジストリ値であり、 ユーザーによっていくらでも書き換えができてしまうので、
どちらかといえば 使用頻度とかをリサーチする 統計的な目的で利用するのが正しいのかな。

実際に実行してみたところ。回数とプログラムが出力される
では、動作をひとつずつ見ていくことにする。

2011/08/30

葉月1.PowerShellのプロファイルとSyncToyを利用したバックアップ

僕が使っているのは、MSが出しているSyncToyというツール。
これを利用するとフォルダ間でファイル同期を行ってくれる。手軽に使えるのでなかなか良い

SyncToy

@IT SyncToyツールで手軽にバックアップを行う

コマンドプロンプトでも実行できるので、USBメモリをさした場合にプロファイルを読み込み、
その過程で上記ソフトを実行するよう設定する。

2011/06/28

水無月3.VDI環境をつくってみた

VDIのテスト環境を作ってみました。
・・・とはいえ、作ってみた感想としては利用する場面は特殊な状況の時だけかなぁと感じました。

作成は以下の@ITの記事を参考に。

Windows Server 2008 R2によるVDI実践入門
http://www.atmarkit.co.jp/fwin2k/operation/vdi01/vdi01_01.html

さて、VDI(Virtual Desktop Infrastructure)というのはそもそも何かというと、
hyper-v上に仮想クライアントOSをいくつか展開し、それらのOSへ利用者がhyper-v上にあることを特に意識せずリモートデスクトップ接続でつなぎに行く一連のシステムのことを指します。

結構 関連するサーバシステムとしては大掛かりなのですが、役割のうちいくつかは同一サーバでうけもつことができます。図にするとこんな感じ。

2011/06/27

水無月2.リモートデスクトップ接続のセッション確認2

前回、query sessionコマンドを利用した別サーバのセッション確認の記事を書きましたが、
山市さんのえぬなんとかわーるどで、PowerShellによるセッション確認についての記事がありました

リモート デスクトップ セッションの RDP バージョンを調べる方法 by PowerShell
http://yamanxworld.blogspot.com/2011/06/rdp-by-powershell.html

以下にあるモジュールをダウンロードし、モジュールを読み込むことで、
リモートデスクトップセッション確認、さらには接続ユーザーへメッセージを送ったりプロセスを停止させるコマンドレットを使うことができるようになります。

Terminal Services PowerShell Module 
http://psterminalservices.codeplex.com/

query sessionではせいぜいユーザー名や状態の出力くらいですが、
上記のモジュールを読みこむことで使用可能となる、Get-TSSessionはLoginした時間や接続したクライアントなど多岐にわたる情報が出力されます。

さらに、PowerShellであるため色々な応用が可能となります。
一定時間接続したユーザーに対してメッセージやログオフ処理を走らせたり、特定の端末が接続した場合のみ特殊な処理を実行させる、、ということもできそうです。
セッションの情報はRemoteAppで接続した場合でもきちんと出力されましたし、色々趣向をこらせそうですね。

では実際にやってみます。まず、モジュールを読み込み。


2011/06/18

水無月1.リモートデスクトップ接続のセッション確認

今、VDIの記事でも描こうかなぁと、検証中。
でも、その前にTipsなぞ。

まずはリモートデスクトップサービス(RDS)のおさらい
リモートデスクトップ機能概要
http://www.microsoft.com/japan/windowsserver2008/r2/technologies/rds.mspx

RDSは最近は、マルチメディアやプリンタのリダイレクトやAeroグラスのサポートなどもしています。
RDSの中でもいちばんスタンダードなリモートデスクトップ接続についてですが
遠隔からサーバを管理したり、PCに接続し動作させることなどができます。

@IT  リモート・デスクトップでコンソール・セッションに接続する
http://www.atmarkit.co.jp/fwin2k/win2ktips/519rdcons/rdcons.html

上記の記事にはこうあります。
リモート・デスクトップで接続すると、それぞれの「セッション」ごとに固有のユーザー環境が用意される。セッションとは、ユーザーごとに用意される画面やキーボード、プロセス空間などの環境へ接続した状態のことを指す。リモートからログオンしたユーザーに対しても仮想的なコンピュータ環境が用意され、実際の物理コンソールの状態には関係なく、独立してコンピュータを利用できる。実際の物理的なコンソールから利用しているセッションのことを特に「コンソール・セッション」といい、リモートから接続しているセッションのことを「リモート・セッション」という。
セッションは、Windows XP Professionalでは同時に1セッションのみが利用でき、Windows Server 2003/Windows Server 2008の「管理用リモート デスクトップ」モードでは、同時に最大3セッション(1コンソール・セッション+2リモート・セッション)まで利用できる。
本来、サーバに接続する場合にはライセンス(RDSCAL)が必要なのですが、3セッションまでは管理用として接続が許可されているわけです。
WindowsServer2008以降ではデフォルト設定では、アカウント1つに付き同時に1つのセッションだけの利用しかできないため、複数の管理者が同一アカウントで接続しようとした場合、作業中にいきなり画面が落ちてしまう(セッションがとられてしまう)場合があったりします。
さて、そんなことにならないよう、現在のセッションの状態を調べたい場合に "query session"コマンドがあります。

2011/05/29

皐月3.仮想化タイプと住居2

前回の続きです。
前回はタイプ2VMM、ハイブリッドVMMと見てみました。
今回は、タイプ1VMMとよばれる仮想化アーキテクチャをみてみましょう。
いわゆる、Hyper-VやXenなど 現在主流となっているハイパーバイザによる方式は
このタイプ1VMMの形式にあたります。

今度は、寮をイメージしてみてください。
各ハードウェアを管理する管理人さんがいて、寮生の部屋のわりあてます。
もちろん、寮長もその対象。寮長はそこに住んでいる寮生の生活やあらゆる面倒をみている、というイメージです。
ハイブリッドVMMと違い、管理人さんがハードウェアを管理しているので寮生の要望にすぐ答えられるようになっています。
管理人さんにとって扱いやすいハードウェアも流通し(仮想化支援機能 IntelVT, AMD-V)、寮生にとってはまるで自分の家のような快適さが実現されてきています。

さて、タイプ1VMMですが、管理人さんの管理の仕方で二つのタイプに分かれます。

モノリシック型の代表例として、VMWare ESX Server、KVMなどがあげられます。
対して、マイクロカーネル型はHyper-VやXenなどが例として上げることができます。
どちらもそれぞれ利点があるのですが、お絵かきWindowsなので(笑)
マイクロカーネル型であるHyper-Vについて今後色々と描いていきたいと思います。

なお、仮想化についてもっと詳しく知りたい、という人は以下の記事が参考になります。

エンジニアなら知っておきたい仮想化の仕組み

仮想化の歴史や、内部の動きなどが詳しく書かれています。

2011/05/23

皐月2.仮想化タイプと住居

仮想化によるアーキテクチャには主に3つ種類があります。
今回は、住居にたとえてみましょう。

まずはタイプ2VMM
タイプ2VMMは、仮想OSなどでは使われず、JAVAランタイムなどのアプリケーションでよく使われます。
イメージとしては、家主のみハードウェアを使い、住居人は仲介人によって、その人の環境にあった居住が与えられますが、直にハードウェアを扱うことはできません。
なお、JAVA仮想マシンや、.NETFrameworkの共通言語ランタイムなどがここでいう仲介人にあたります。

次にハイブリッドVMM

これは、不動産屋さん経由で指定のハードウェアを住居人にも扱えるようなイメージ。
とはいえ、不動産屋さんは間取りの割りあてとかはしてくれるものの、ハードウェアの管理は基本 大家さん主体。
住居人がもっとハードウェア使いたいッと言ってきたとしても、不動産屋さんは、いちいち大家さんにお伺いをたてないといけないため、住居人にとってはハードウェアを扱うには若干レスポンスが悪い。
また、不動産屋さんは誰でも使えるようにハードウェアで使うコンセントや蛇口などは大家さんと違った汎用性のある一般的なものに変換して各住居人に提供しています。
大家さんがあとから不動産屋さんと契約して(インストールして)住居人を入れることができるため、お手軽だけれども上述したようにレスポンスに難はあるのがポイントです。
ハイブリッドVMMにあてはまるのはVirtualPC2007,VMwareWorkstation,VirtualBoxなどがあげられます。


ちなみにWindows2008Serverで扱える Hyper-Vは、ハイパーバイザベースの仮想化テクノロジであり、タイプ1VMMによるアーキテクチャです。
次回は引き続き住居を例にして、タイプ1VMMと、さらにそこから分類されるモノリシック型とマイクロカーネル型について説明できればよいなと思います。

2011/05/18

皐月1.仮想化はカップラーメン

仮想環境に触れる機会が増えてきたので、自分なりに解釈したことを絵化していきたいと思います。
ちがう場合は指摘していただければありがたいです。


さて、コンピュータにおける仮想化とはそもそもどういうことなのでしょうか。
Wikipediaには以下のように書いてありました。
仮想化(英: Virtualization)とは、コンピュータにおいてリソースの抽象化を指す用語である。「リソースの物理的特性を、そのリソースと相互作用するシステム/アプリケーション/エンドユーザーから隠蔽する技法。単一の物理リソース(サーバ、OS、アプリケーション、補助記憶装置など)を複数の論理リソースに見せかけたり、複数の物理リソース(複数の補助記憶装置群やサーバ群)を単一の論理リソースに見せかけたりできる」という実用的定義がある[1]。また、単一の物理リソースを何らかの特性の異なる単一の論理リソースに見せかけることもできる。

わかるような、わからないような・・
リソースの抽象化とはどういうことでしょう?
抽象化とは何か、またまたWikipediaで見てみます。
抽象化(ちゅうしょうか)とは、思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は無視する方法である。抽象化において無視することについては捨象するという。従って、抽象と捨象は盾の両面といえる。

つまり、コンピュータのリソースを対象から注目すべき要素を重点的に抜き出して他は無視する方法を仮想化という。。
うーん、なんとなくわかるけれど利点が見えづらい。

というわけで、少し現実世界にあるもの一例にとってみます。
例としてあげるのは・・ ラーメンです。



僕はラーメンが好きです。
特に北海道に行った時に 有名ラーメン店「すみれ」で食べた味噌ラーメンは濃厚でとっても美味しかったー。
さてさて、このすみれの味噌ラーメンはもちろん北海道の「すみれ」に行かないと食べることは出来ません。また、北海道に行ったとしてもうどん屋や別のラーメン店に入ってしまうと 当然すみれのラーメンなんか出てこないです。
つまり、すみれのラーメンを食べるためには、
北海道の - 札幌にある - すみれに行って - 味噌ラーメンを注文し、 - ラーメンを食べる
という段階を踏む必要があります。

さて、これを仮想化・抽象化しようとすると・・。
「対象から注目すべき要素を重点的に抜き出して他は無視する方法」が抽象化ということなので、ここで注目すべき要素とは何か。そう、「すみれのラーメンを食べること」ですね。
別に北海道の札幌のすみれのお店に行かなくても、すみれのラーメンを食べることができれば良いのです。つまり、どういうことかというと・・。


カップラーメン化です。
仮想化=カップラーメン化

はい、これでわざわざ北海道にいかなくてもすみれのラーメンをすぐ食べることができるようになりました。つまり、「地理的(物理的)制約などは無視して、すみれにあるラーメンを重点的に抜き出した」ということでしょうか。
コンピュータの仮想化もいわゆる、カップラーメン化。
対象となる部分は、OSであったりアプリケーションであったり多岐にわたるけれども、要は重要なリソース部を抜き出して、それ以外の依存度を減らすこと。
JAVAやFLASHはプラグインを入れさえすれば、WindowsやMac、スマートフォンでも同じようにアプリケーションは動くし(アプリケーションの仮想化)、GoogleAppなどのクラウドはハードウェアごとまるまるカップラーメン化して、ネットさえつながれば非力なマシンですら同じようにサービスを受けることができるようになっています。


今現在 仮想化といえば、OSの仮想化を指すことが多いですけれど、
カップラーメンとして考えてみれば おのずとメリット・デメリットがみえてくるのではないでしょうか。

2011/03/27

東京電力電力供給状況APIを使ってPowerShellからデータ出力

久々の投稿です。しばらくPowerShellを扱ってなかったので、リハビリ。

関東では現在計画停電が行われていますが、
有志にて東京電力の電力使用状況APIを公開している方がいます。

東京電力の電気使用状況 API
http://denki.cuppat.net/

これを利用して二日分の電力データをPowerShellにて出力してみます。
Function Get-Data {
    Param($date)
    if ($WebClient -eq $null) {
        $Global:WebClient=new-object System.Net.WebClient
    }
    $results=$webClient.DownloadString("http://denki.cuppat.net/data/$($date).json")
    $Results -match """hours"":\[(?<hour>.*)].*""capability""\:(?<cap>.*)," > $null
    $matches
}

Function Check-Data {
    Param($getdata)

    $Ltime = $getdata.hour -split ","
    $cap=$getdata.cap
    write-host キャパシティ $cap

    0..$(($Ltime.length)-1)|% {

        $p=$ltime[$_]/$cap

        if ($p -ge 0.95) {
            $colorname="red"
        }elseif ($p -ge 0.90) {
           $colorname="darkyellow"
        }else {
            $colorname="black"
        }
       

        $a="{0:00}時:電力{1} {2:00}% {3}{4}|" -F $_,$ltime[$_],$($p*100),$("#"*$($p*50)),$(" "*(50-$($p*50)))
        write-host $a -ForegroundColor $colorname
        }
}

$tdata=Get-Data($(get-date -uformat "%Y%m%d"))
$ydata=Get-Data($(get-date -uformat "%Y%m%d")-1)

check-data($ydata)
check-data($tdata)

実行した結果はこちら。
90%以上の利用率で黄色、95%以上で赤字で出力します。

こうみると、やはり夕方は電力量が上がってますね。
僕も引き続き、節電していきたいと思います。