2014/12/01
[v5] Auto-Generated Example-Driven Parsing について
はじめに
この記事はPowerShell Advent Calendar 2014の1日目の記事です。
次期バージョンのPowerShell 5.0について、そろそろ情報が出回ってきました。現在のところWindows Management Framework 5.0 Preview November 2014、もしくはWindows 10 Technical PreviewやWindows Server Technical Previewに同梱のもので試すことができます。
v5での新機能、改善点は多岐に上ります。OneGet / PowerShellGet / クラス定義 / DSC機能増強 / ODataエンドポイントのコマンドレット化 / zipファイル / シンボリックリンク 等々。詳しくは、リリースノートが一番充実しているかと思います。日本語だとぎたぱそ氏の記事がまとまっているかと思ます。
さて、ここまで挙げた新機能や改善点は、とても順当でまっとうな進化点なのですが、v5にはちょっと異彩を放つ新機能がしれっと追加されています。それが、Auto-Generated Example-Driven Parsing です。
Auto-Generated Example-Driven Parsing とは
CSV、JSON、XMLのような既知のフォーマットではないが、何らかの法則性のあるテキストデータがあるとします。そんなテキストデータは(不幸なことに)割と世の中にあふれていますが、そのままでは(人が読む以外には)利用できないので、データとして扱うには、解析し、レコード(プロパティ:プロパティ値)として再構築する必要があります。
しかしながらフォーマットが既知のものではないため、既存のパーサーを使って解析することはできません。
従来のアプローチだと、このようなデータに対しては、まずユーザー(人間)がデータの法則性を読み取り、その法則をコンピュータに分かる表現(コードや正規表現など)に変換してやる必要がありました。
Auto-Generated Example-Driven Parsing とは、事前にユーザーがテキストデータの一部分のみを取り出し、各項目に対してプロパティ名を指示したデータ(テンプレート)を用意しておくと、元のテキストデータとユーザーが用意したテンプレートから法則性を解析し、元のテキストデータ全体を自動的にテキストデータからオブジェクトに変換してくれる機能です。
Auto-Generated Example-Driven Parsing とはもともとMicrosoft Research で研究されているFlashExtract というデータ解析手法の PowerShell コマンドレット(ConvertFrom-String)による実装になります。ConvertFrom-StringData じゃないですよ。全然別物です。これうっかりしてるとスルーしてしまいそうです。
具体例
たとえば、こんなデータがあったとします。
山内 佳乃 (やまうち よしの) 生年月日...1982/1/27 (32歳)、女性 田畑 真帆 (たばた まほ) 生年月日...1966/4/14 (48歳)、女性 三好 一樹 (みよし かずき) 生年月日...1972/7/10 (42歳)、男性 酒井 幸平 (さかい こうへい) 生年月日...1954/3/1 (60歳)、男性 藤島 恵子 (ふじしま けいこ) 生年月日...1969/5/4 (45歳)、女性 加藤 美優 (かとう みゅう) 生年月日...1986/12/8 (27歳)、女性 金谷 康文 (かなや やすふみ) 生年月日...1983/10/7 (31歳)、男性 岸本 紗季 (きしもと さき) 生年月日...1984/5/16 (30歳)、女性 永野 ケンイチ (ながの けんいち) 生年月日...1961/7/8 (53歳)、男性 小関 三郎 (こぜき さぶろう) 生年月日...1975/1/22 (39歳)、男性 山岸 光 (やまぎし ひかる) 生年月日...1939/2/13 (75歳)、女性 黒谷 恵麻 (くろたに えま) 生年月日...1949/2/13 (65歳)、女性
名前や生年月日が書かれたデータで、一応、法則性はあるようです。が、これをまともにパースしようと思うと、2行ごとに切り出して、正規表現を書いて…と、ちょっと面倒ですね。
ちなみにこのダミーデータ作成にはなんちゃって個人情報を使わせていただきました。CSVで出力した後、以下のようなスクリプトでわざわざ醜く変形しました。
Import-Csv -Encoding Default -Path dummy.cgi|%{"$($_.名前) ($($_.ふりがな))`n生年月日...$($_.誕生日) ($($_.年齢)歳)、$($_.性別)性"}|set-content -Encoding UTF8 -Path dummy.txt
さて、このテキストデータに対し、Auto-Generated Example-Driven Parsingで用いるテンプレートを書いてやりましょう。たとえば、以下のように適当に3件(ここでは3〜5個目のレコード)抜き出して、プロパティ名をつけてやります。赤字が、手動で元データに付与した文字列です。
{Name*:三好 一樹} ({Furigana:みよし かずき}) 生年月日...{BirthDay:1972/7/10} ({Age:42}歳)、{Sexuality:男}性 {Name*:酒井 幸平} ({Furigana:さかい こうへい}) 生年月日...{BirthDay:1954/3/1} ({Age:60}歳)、{Sexuality:男}性 {Name*:藤島 恵子} ({Furigana:ふじしま けいこ}) 生年月日...{BirthDay:1969/5/4} ({Age:45}歳)、{Sexuality:女}性
みて頂ければ分かると思いますが、基本は、各データ項目に対して、{プロパティ名:データ}のように指定してやるだけです。主キーとなるデータ項目にはプロパティ名の後に「*」をつけてやります。こうやって作ったテンプレートをtemplate.txtと名前を付けて保存しましょう。
元データとテンプレートが揃ったので、あとは以下のようにしてConvertFrom-Stringコマンドレットを実行するだけです。
テンプレートを元に、元テキストに含まれるすべてのデータが、プロパティ値を持ったオブジェクトデータに変換されていることが分かるかと思います。これちょっとすごくないですか?
まとめ
Auto-Generated Example-Driven Parsingは個人的には、非常に面白い機能だと感じています。コンピュータに対して、「手本見せるよ、これはこう、これはこう。わかった? じゃ、あとは同じようにまとめといてね!」というのができるようになったわけで、ちょっと未来を感じました。
研究所レベルの研究成果を、製品として実装した初の例が、PowerShellだったというのも面白味を感じます。
ただ、CSVでもJSONでもXMLでもない、わけのわからない謎フォーマットで保存されたテキストデータを解析しなきゃならない事態というのは、そもそも不幸な状況であることも、また事実かと思います。
ConvertFrom-Stringは、そんな訳の分からないものを撲滅して、今度こそまともなフォーマットのデータに変換して保存するための、最終兵器のようなものかもしれません。
なお、Auto-Generated Example-Driven Parsingでは他にもプロパティに型を指定したり、部分的に正規表現を用いたり、階層構造を持つデータにも対応してたりと、かなり色々なことができるようになっています。ぜひ、v5環境を整えて、ConvertFrom-Stringを試してみてください。
さてさて、PowerShell Advent Calendar 2014、今年は参加者が少なく、完走はかなり危ぶまれますが、できるところまで行きたいですね! これをお読みのあなたの記事が読みたいです! ぜひ、ご参加いただけると幸いです。
2013/07/02
Microsoft MVP for PowerShellを再受賞しました(1年ぶり10回目)
というわけで、10年目に突入しました。これも私のアウトプットをインプットしてくださる皆様、私のインプットとなるアウトプットをしていただいている皆様のおかげです。いつもありがとうございます。
10周年なので軽く歴史を振り返ります。
2004年にWSH Lab.というサイトを中心としたWSH / VBScript関係の活動が評価されてfor Developer - Scriptingという分野でMSMVPを受賞したのがはじまりです。
実はWSH Lab.を始めたのが1999年のことで、それ以前も1997年頃からWindows系のニュースグループに出入りして、オンラインコミュニティではMVP受賞前も知る人ぞ知る存在ではあったように思います。(なんせ、WSHは相当ニッチな分野だったもので、まともに取り扱おうと思う人は当時はほとんどいなかったもので)
当時は私はまだ大学生(しかも分野は化学系でIT関係なし)でして、体調崩したり色々あって卒業後も就職せず迷走してた時期でした。なのでIT系の方々とも交流はなく、オンラインのみで何故かWSHというこれまたあんまり誰も手を付けないマイナー分野で突っ走ってる謎の存在だったんじゃないかなーと思います。
MVP受賞後はひょこひょこオフラインにも出没するようになり、謎めいた存在から確かに実在する存在として認識されていったのではないかと思います。2006年にはわんくま同盟に加入し、IT系の方々と交流し、また自らセッションをする機会にも恵まれました。
MSMVP受賞のおかげで2006年からは@ITさんの方でチェック式 WSH入門という連載をさせていただくことができ、商業デビュー(?)を果たしました。
だんだんWSHがフェードアウトしていくと同時にPowerShellというものが登場したのも2006年のことでした。当時は.NETのことは全然知らなかったのですが、このままでは取り残される!と思い、それなりに勉強を始めたものでした。受賞カテゴリも2007年からはfor Data Center Management- Admin Frameworksというよく分からない名前に代わり、開発系からサーバー系への移籍となりました。
もちろんWindows Serverなんてものもまともに触ったこともなく、今思えばあの頃は色々と憶えることがたくさんあったなーと思いますね。そんなこんなで2008年にはMVPカテゴリもfor Data Center Management- PowerShellとなり、PowerShell専門となりました。
2008年には技術評論社さんからWindows PowerShell ポケットリファレンスという書籍を書かせてもらうことができました。まさか自分が本を書くなんて思ってもいなかったですし、あれはいい経験になったと思っています。
それからも体調はずっとよくなくて迷走しまくりで随分多くの方々にご迷惑をかけ続けていましたが、なんとかMVPという繋がりを武器に社会と繋がっていようとあがいた感じです。書籍や記事執筆、スピーカー、そして密かにプログラマーとして会社に勤めたりしてた時期もありました。
私のあがきとは関係なく、PowerShellはどんどん重要性をましていって、特にWindows Server 2012とPowerShell 3.0がリリースされた2012年は全国各地で声がかかって(自分で志願したのもありますが)、計8回もセッションを担当しました。中でもMicrosoft Windows Developer DaysでMicrosoft社員さんに交じってセッションを担当したのは貴重な経験でした。そして今年はPowerShellポケットリファレンスの改訂版を世に出すことができました。
こうやって10年目にして振り返ると、確かにWindows Scripting / PowerShell周りで要所要所でいろいろやってきたなーという感じですね。今年もPowerShell 4.0 / Windows Server 2012 R2がリリースされる予定で、PowerShellは今後も着実に発展、浸透していくのだと思います。私も陰ながらと言わず割と表立って、そのお手伝いをしていければいいなーと思っています。
さて余談ですが、結局あがいた結果今はどうなん?という話なんですが、結果としてはITの世界では今まで通り、PowerShellの分野ではこういう感じの活動を続けてますが、メインのおしごとは全然ITとも化学とも違う別なことをやっていたりします。ちゃんとおしごとしてるのでそんな目で見ないでくださいね。あと、体調に関しては2年前くらいからほぼ完全に回復してるので、遠慮せず遊んでやってください。
こんなことを書いてると、なんか「お前…消えるのか…?」と思われてしまうかもしれませんがそんなことは全然ない(と思う)ので、これからも変わらず、お付き合いいただければと思います。
2013/03/29
Twitterの「全ツイート履歴」を分析してみよう
はじめに
Twitterブログ: 日本の皆さんにも「全ツイート履歴」が使えるようになりました の記事のとおり、自分の全ツイートデータをダウンロードする機能がTwitterで利用可能になっています。
ダウンロードされるzipファイルには、ツイートを表示するためのHTML、JavaScriptファイルのほか、CSV形式のデータ(tweets.csv)も含まれています。CSVファイルの処理といえばPowerShellが得意とするところです。このファイルを読み込んで、PowerShellで自分のツイートを分析してみましょう。
準備
具体的にダウンロードする方法は上記記事を参考にしていただいて、まずはダウンロードしたzipファイルからtweets.csvを解凍し、PowerShellのカレントディレクトリをtweets.csvのあるフォルダに移動させておいてください。
毎回CSVを読み込むと時間がかかるので、まず以下のようにしてImport-CsvコマンドレットによりCSVファイルを読み込み、変数にオブジェクトとして入れておきます。
$tweets = Import-Csv tweets.csv
なお私の総ツイート数は4万ほどで、tweets.csvは10MB程です。これくらいの容量だとそのままでもまずまずまともな速度で分析が可能ですが、何十万ツイートもしていらっしゃるTwitter廃人マニアの方は、適宜ファイルを分割するなどして対処願います。
CSVファイルのヘッダ行は
"tweet_id","in_reply_to_status_id","in_reply_to_user_id","retweeted_status_id","retweeted_status_user_id","timestamp","source","text","expanded_urls"
となっています。Import-Csvコマンドレットはデフォルトでは1行目を出力オブジェクトのプロパティ名とするので、データ行の1行がtweet_idプロパティ等を持つオブジェクトとして読み込まれ、$tweets変数にはそのオブジェクトの配列が格納されることになります。
ツイート抽出/検索
一番最初のツイートを表示
PS> $tweets | select -Last 1 tweet_id : 948090786 in_reply_to_status_id : in_reply_to_user_id : retweeted_status_id : retweeted_status_user_id : timestamp : 2008-10-06 10:54:10 +0000 source : web text : はぐれメタルがあらわれた! expanded_urls :
Select-Objectコマンドレット(エイリアスselect)はオブジェクトの絞り込みに使います。このCSVファイルではツイートの並び順がタイムスタンプの降順なので、最初のツイートは一番最後の行となります。
直近5ツイート表示
PS> $tweets | select -First 5 | fl timestamp,text timestamp : 2013-03-21 17:02:23 +0000 text : Need for Speedがなんか懐かしい。初めて買ったPCに体験版がバンドルさ れてた記憶がある。 timestamp : 2013-03-21 17:01:23 +0000 text : そいえばEAのシムシティ不具合お詫び無料DL特典、何選ぼうかなあ。シム シティ4あるけど英語版という噂だし2013やった後につらいもんがありそう 。 timestamp : 2013-03-21 16:45:09 +0000 text : というわけでシムシティ大好きなんで、私の街を返してください… ...
Format-Listコマンドレット(エイリアスfl)を使うと必要なプロパティ値のみ抽出してリスト形式で表示できます。
文字列で検索
PS> $tweets | where {$_.text -match "眠い"} | fl timestamp,text timestamp : 2013-03-05 10:46:39 +0000 text : 眠いのってもしかしてアレルギールの副作用かも。蕁麻疹がひどいときし か飲んでないんだけどねえ timestamp : 2013-03-05 05:42:18 +0000 text : なんでこんなに眠いのかな timestamp : 2013-03-04 07:44:18 +0000 text : 眠いなあ ...
Where-Objectコマンドレット(エイリアスwhere)を使うとオブジェクト配列のうち特定条件のもののみ抽出できます。ここではツイート本文(textプロパティ)に"眠い"という文字列が含まれているものを抽出しています。どんだけ眠いんですか私は…
2009年のツイートのみ表示
PS> $tweets | select @{L = "timestamp"; E = {Get-Date $_.timestamp}},text | where {$_.timestamp.Year -eq 2009} | sort timestamp | fl timestamp,text timestamp : 2009/01/01 0:01:08 text : あけおめ! timestamp : 2009/01/01 0:16:31 text : 2chとついったー強いなーmixiしんでた timestamp : 2009/01/01 13:37:50 text : 家族でおせちをたべた。おいしかった ...
もちろん本文に含まれる文字列以外にも、timestamp(ツイート時刻)で抽出するなどもできます。ここではtimestampがGMTで分かりづらく、かつ文字列のため扱いづらいので、Select-Objectに集計プロパティを指定してDateTime型に変換しています。Format-ListやSelect-Objectに指定する集計プロパティの書式は、@{L="ラベル";E={値を返すスクリプトブロック}}のように連想配列で指定します。LはLabel、EはExpressionのように省略せずに指定してもOKです。
集計プロパティはあんまり解説を見かけないですけども、オブジェクトを処理するコマンドレットの多くで利用可能できわめて重要なので覚えておくと良いと思います。
よるほ成功ツイート
PS> $tweets | where {(Get-Date $_.timestamp).ToString("HH:mm:ss") -eq "00:00:00"} | fl @{L = "timestamp"; E = {Get-Date $_.timestamp}},text
応用でこんなんもできます。0:00:00ちょうどのツイートを抽出します。私はかつてよるほ成功したことがないので結果は何も返ってきませんけど。
ツイート中のURLリストを作る
PS> $tweets | where {$_.expanded_urls} | select -expand expanded_urls http://ja.wikipedia.org/wiki/%E5%B2%A1%E7%B4%A0%E4%B8%96 http://htn.to/4oxXDN http://guitarrapc.wordpress.com ...
whereによる抽出を応用するとこういうこともできます。なお、expanded_urls列は本文中のURLが複数含まれているとそれらは,で区切られるため、可変長の行となります。Import-Csvコマンドレットはこのような可変長なCSVに対応していないので、複数URLがあっても最初の1つのみ取得します。それとexpanded_urlsが追加されたのはt.coによるURL短縮が始まってからなので、昔のツイートにこの値は含まれていません。
ツイート数統計
月別ツイート数表示
PS> $tweets | group @{E = {(Get-Date $_.timestamp).ToString("yyyy/MM")}} -NoElement Count Name ----- ---- 432 2013/03 413 2013/02 248 2013/01 741 2012/12 497 2012/11 791 2012/10 659 2012/09 ...
ツイート分析と言えばやはりツイート数統計を取ることから始まるでしょう。統計を取るにはGroup-Objectコマンドレット(エイリアスgroup)が使えます。ここでもグループ化キーとして集計プロパティを指定してやります。ツイートの「年/月」を文字列化し、それが同じツイートでグループ化することで、月別ツイート数の統計が表示できるわけです。
時間帯別ツイート数表示
PS> $tweets | group @{E = {Get-Date $_.timestamp | select -expand Hour}} -NoElement | sort @{E = {[int]$_.Name}} Count Name ----- ---- 2369 0 1630 1 1137 2 ... 2270 23
やり方としては先ほどのとほぼ同じです。Select-Object -ExpandPropertyはパイプライン入力でオブジェクトのプロパティ値を取得できるのでよく使います。ちなみにPowerShell 3.0だと「$obj|foreach プロパティ名」でも取れますね。
Sort-Objectコマンドレット(エイリアスsort)でもソートキーとして集計プロパティを指定できます。ここではNameプロパティ(グループ化キーの値)をintに変換したものをキーにソートしています。
曜日別ツイート数表示
PS> $tweets | group @{E = {Get-Date $_.timestamp | select -expand DayOfWeek}} -NoElement | sort @{E = {[DayOfWeek]$_.Name}} Count Name ----- ---- 4939 Sunday 5164 Monday 5463 Tuesday 5164 Wednesday 5563 Thursday 5992 Friday 6331 Saturday
これもやり方としてはほぼ同じ。ソートキーはDayOfWeek列挙体にキャストしてちゃんと曜日順に並ぶようにしてます。
ツイート数計測
総ツイート数
PS> $tweets | measure Count : 38616 Average : Sum : Maximum : Minimum : Property :
ここからはツイート数の計測をしていきます。単純にツイート総数を取るだけならMeasure-Objectコマンドレット(エイリアスmeasure)を使うだけでOKです。Averageなどは対応するスイッチパラメータ(-Averageなど)を指定すると計測されますが、この場合は元オブジェクトが数値ではないのでエラーになります。
ツイート文字数分析
PS> Add-Type -AssemblyName System.Web PS> $tweets | where {!$_.retweeted_status_id} | select @{L = "TextLength"; E = { [System.Web.HttpUtility]::HtmlDecode($_.text).Length}} | measure -Sum -Maximum -Minimum -Average -Property TextLength Count : 37718 Average : 48.7322233416406 Sum : 1838082 Maximum : 140 Minimum : 1 Property : TextLength
ツイート文字数を計測するとき、元のオブジェクトにはツイート文字数を返すプロパティはないので、Select-ObjectコマンドレットにTextLengthという集計プロパティを指定して新たに作ってしまいます。
Measure-Objectコマンドレットは-Propertyパラメータにより対象オブジェクトのどのプロパティ値を計測するか指定できます。そしてスイッチパラメータを全部有効にすることで、平均、合計、最大、最小値を計測しています。私の総ツイート文字数は183万です。
なお、リツイートの場合はretweeted_status_idにリツイート元のツイートIDが入るので、このIDがあるものはWhere-Objectで除外してます。またツイート本文の<や&などはHTMLエンコードされたものがtext列に格納されているので、HttpUtilityを使ってデコードしてから文字数をカウントしています。
通常ツイートとRTの比率
PS> $tweets | foreach { $TweetCount = 0; $RTCount = 0 } { if($_.retweeted_status_id){ $RTCount++ }else{ $TweetCount++ } } { New-Object psobject @{ AllCount = $tweets.Length; TweetCount = $TweetCount; RTCount = $RTCount; RTRatio = $RTCount/$tweets.Length } } Name Value ---- ----- RTCount 898 TweetCount 37718 AllCount 38616 RTRatio 0.023254609488295
Measure-Objectコマンドレットは計測方法を指定することはできないので、独自の計測を行う場合はこんな感じでコードめいたものを書く必要が出てくるかと思います。RT率たったの2%か…ゴミめ…
ForEach-Object(エイリアスforeach)は1個のスクリプトブロックをパラメータに指定するとprocessブロック相当の列挙部分を実行しますが、このように3個指定すると、それぞれbegin(初期化処理)、process、end(終了処理)ブロックに割り振られます。
ここではbeginブロックで変数初期化、processブロックで通常ツイートとリツイートを加算、endブロックで計測値をPSObjectに格納して出力してます。ちなみにPowerShell 3.0ではカスタムオブジェクトを作る場合は「[pscustomobject]@{連想配列}」で書くほうが楽です。
お前は今まで寒いと言った回数を覚えているのか
PS> $tweets | foreach {$count = 0} { $count += ($_.text -split "寒い").Length - 1} {$count} 137
覚えてないから数えます。137回か。
数値だけを出力するならこんな感じでシンプルに書けますね。
ランキング
クライアントランキング
PS> $tweets | group @{E = {$_.source -replace "<.+?>"}} -NoElement | sort Count -Descending Count Name ----- ---- 12927 Janetter 11333 web 5230 Azurea for Windows 3060 TweetDeck 1694 Hatena 866 twicca 667 twigadge ...
ここからはいろんなランキングを取得してみます。まずはツイートに使ったTwitterクライアントのランキング。ここでもGroup-Objectを使っています。クライアント名はクライアント配布URLがaタグで含まれているのでそれを-replace演算子で削ったものをグループ化キーとしています。ランキングなので最後はCountで降順ソート。
リプライしたユーザーランキング
PS> $tweets | where {$_.in_reply_to_user_id} | select @{L = "user"; E = {if($_.text -match "^(@[a-zA-Z0-9_]+)"){$matches[1]}}} | group user -NoElement | sort Count -Descending Count Name ----- ---- 807 @xxxxxxxxxx 417 @xxxxxxxxxx 333 @xxxxxxxxxx ...
ランキング系はどれもgroup→sort Countのパターンになるかと思います。リプライツイートはin_reply_to_user_id列にリプライしたユーザーIDが含まれるのでまずはそれでフィルタし、ユーザー名はツイート本文から取ります。ユーザー名は-match演算子を使って正規表現で抽出します。$matches自動変数は連想配列で、[0]にマッチ全体が、[1],[2],...にはサブ式のキャプチャが入ります。ちなみにサブ式に名前を付けてるとキー名が数値ではなくサブ式名となります。
ハッシュタグランキング
PS> $tweets | foreach {[regex]::Matches($_.text, "(#\S+)") | % {$_.Captures} |% {$_.Value}} | group -NoElement | where Count -gt 1 | sort Count -Descending Count Name ----- ---- 199 #zanmai 75 #nowplaying 68 #nhk 63 #techedj2009 ...
ハッシュタグも同様のアプローチで取れますが、ハッシュタグは1ツイートに複数あることがあり、-match演算子だと複数のマッチは取れないので[regex]を使って取得しています。
おわりに
PowerShellのオブジェクト処理用コマンドレットを用いると、CSVデータの分析ができます。普通はログファイル等を解析するのに使うわけですが、こういう身近なデータを扱ってみるのも面白いんじゃないでしょうか。きっとPowerShellの勉強にもなると思います。
2007/01/11
チェック式 WSH入門 第8回 公開
Functionプロシージャでユーザー独自の関数を定義する − @IT
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh08/cformwsh08_01.html
早いものでもう第8回ですね。ようやくVBScript編は終わりに近づいてきました。
基礎から押さえて一通り網羅してきたつもりですが、なんか抜けてないでしょうか?あ、Select Caseは次回やりますんでw ステートメントがばらばらに登場する変な講座になりましたが、これもありかなーと思っています。あとで見るとき分かりづらいかなという懸念はあります。ステートメント別目次なんぞ作ったらよいでしょうか。
今回の記事はもともと1回分と思って書いたのですが長すぎということで分割されたものです。
「複数の値を返すFunctionプロシージャ」とかやろうかなーと思ったんですが、それよりClassステートメントを覚えてもらった方がいいかと思って省略しました。Classは次回やります。あとオブジェクトつながりでErrオブジェクトを取り上げる予定です。正規表現はどうしましょうw まともにやったら1回分のネタにはなりますが、VBScriptから離れた別の言語(ではないかな?あくまで「表現」か。)ですしねー。
また何かありましたらフィードバックをお寄せください。質問などもお待ちしてます。(質問はWSH Lab.の掲示板でお願いします)。
で、関係ないですが明日はわんくま大阪勉強会ですね。PowerShellについて1時間20分みっちりしゃべってデモります。参加される方、お会いできるのを楽しみにしています。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/01/11/55708.aspxCopyright © 2005-2016 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp