<   2011年 01月 ( 29 )   > この月の画像一覧

PowerShell を何に使うか

PowerShell を使うと、レジストリの管理や、プロセスの管理などなんでもできるようだが、アマチュアユーザにはちょっと縁がない。

単なるパソコンのユーザの立場から嬉しいのは、様々なフィルターを使ってファイルを検索する機能だろう。たとえばカレントディレクトリのファイルのリストは、

PS > Get-ChildItem

で取得できる。エイリアスがあるので、ls や dir も使うことができる。

このうち、拡張子が .exe のファイルだけを取り出したいときはフィルターをかけて、

PS > Get-ChildItem | where {$_.Extension -eq ".exe"}

でとりだせる。".exe" ファイル以外を取り出したいときは、

PS > Get-ChildItem | where {$_.Extension -ne ".exe"}

で、できる。キーワード whereは短縮形で、?が使える。また、サブディレクトリまで検索する場合は -Recurse オプションを指定する。

PS > Get-ChildItem -Recurse | ? {$_.Extension -eq ".exe" }

条件にマッチするアイテムを取り出すフイルターと共によく使われるのがソート・フィルタだ。アイテムのソートは、Sort-Object コマンドレットが使われる。

PS > Get-ChildItem | Sort-Object Length

逆順にしたいときは、

PS > Get-ChildItem | Sort-Object Length -Descending

条件マッチやソートに使われるオブジェクトのプロパティを知りたいときは、次のようにする。

PS > Get-Item .\ | Get-Member

これを見ると、最後のアクセスタイムが LastAccessTime プロパティに入っているので、最も最近アクセスしたファイルを知りたいときは、

PS > Get-ChildItem | Sort-Object LastAccessTime

で取得したリストの最後を見れば良い。

また、自前のフィルターは、filter キーワードで作成できるので調べてほしいが、上のやり方だけでも随分色々なことができる。パイプラインにオブジェクトを流すという方式は、まだまだ思いも掛けない用途が見つかるかもしれない。

PowerShell を使いたくて昨日購入した58000円のGatewayのパソコンは、既に、ruby, Haskell Platform, Racket(scheme), Xampp(Apache, php, perl), OpenOffice, java, csc(C#), rhino(javascript) などでてんこ盛りになってしまった。これらを全部 PowerShell からコントロールできる。Windowsでこれだけプログラムの道具が揃う時代になったのかと感慨深いが、PowerShell を何に使うかというイメージもできたので、本当にプログラムネタはしばらくお休みにします。
[PR]
by tnomura9 | 2011-01-31 12:32 | C# | Comments(0)

PowerShell が .NET 対応であることの意味

PowerShell は .NET 対応だが、それはどういうことを意味しているのだろうか。

PowerShell から .NET のオブジェクトを使うことができるのを体験するために、Get-Item で 適当なファイルのファイル情報を取得してみる。

PS C:\Users\*****\Documents\PowerShell\Functions> $item = Get-Item .\functions.ps1

取得した $item は .NET オブジェクトなので、プロパティやメソッドを持っている。それを、Get-Member コマンドレットで表示してみる。

PS C:\Users\*****\Documents\PowerShell\Functions> $item | Get-Member


TypeName: System.IO.FileInfo

Name MemberType Definition
---- ---------- ----------
Mode CodeProperty System.String Mode{get=Mode;}
AppendText Method System.IO.StreamWriter AppendText()
CopyTo Method System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(s...
Create Method System.IO.FileStream Create()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateText Method System.IO.StreamWriter CreateText()
Decrypt Method System.Void Decrypt()
Delete Method System.Void Delete()
Encrypt Method System.Void Encrypt()
Equals Method bool Equals(System.Object obj)
GetAccessControl Method System.Security.AccessControl.FileSecurity GetAccessControl(), System.Secur...
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetObjectData Method System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo in...
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
MoveTo Method System.Void MoveTo(string destFileName)

中略

Attributes Property System.IO.FileAttributes Attributes {get;set;}
CreationTime Property System.DateTime CreationTime {get;set;}
CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;}
Directory Property System.IO.DirectoryInfo Directory {get;}
DirectoryName Property System.String DirectoryName {get;}
Exists Property System.Boolean Exists {get;}
Extension Property System.String Extension {get;}
FullName Property System.String FullName {get;}
IsReadOnly Property System.Boolean IsReadOnly {get;set;}
LastAccessTime Property System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime Property System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;}
Length Property System.Int64 Length {get;}
Name Property System.String Name {get;}
BaseName ScriptProperty System.Object BaseName {get=if ($this.Extension.Length -gt 0){$this.Name.Re...
VersionInfo ScriptProperty System.Object VersionInfo {get=[System.Diagnostics.FileVersionInfo]::GetVer...

相当数あるが、いったい何個あるのだろうか。

PS C:\Users\*****\Documents\PowerShell\Functions> ($item | Get-Member).Length
48

48個もあることがわかる。プロパティのひとつ LastAccessTime を調べてみよう。

PS C:\Users\*****\Documents\PowerShell\Functions> $item.LastAccessTime

2011年1月30日 19:25:04

プロパティを使って、ディレクトリ内の .txt 拡張子を持ったファイルを検索することもできる。

PS C:\Users\*****\Documents\PowerShell\Functions> Get-ChildItem C:\Users\*****\Documents | where {$_.Extension -eq
".txt"}


ディレクトリ: C:\Users\*****\Documents


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2011/01/30 18:31 402 プログラム言語の学び方.txt

同じ発想で、Get-ChildItem のエイリアスにはどんなものがあるか調べてみる。

PS C:\Users\*****\Documents\PowerShell\Functions> Get-ChildItem Alias: | where {$_.Definition -eq "Get-ChildItem"}

CommandType Name Definition
----------- ---- ----------
Alias dir Get-ChildItem
Alias gci Get-ChildItem
Alias ls Get-ChildItem

Unix のシェルでは、ls | grep *.txt のように文字列処理でやっていたようなフィルタをオブジェクトのプロパティでできるので便利だ。

PowerShell が .NET 対応であることの意味は、Get-ChildItem のようなコマンドレットから返される戻り値がオブジェクトであるということと、そのオブジェクトのプロパティを使ったいろいろなフィルタ処理が簡単にできるということだ。これが、パイプにオブジェクトを流し込むことができるということの意味だ。
[PR]
by tnomura9 | 2011-01-31 08:14 | C# | Comments(0)

C# のインタラクティブ・シェル csharp

Linux の .Net 環境 Mono をインストールすると、C# のインタラクティブ・シェル csharp が付いてくる。Ubuntu で Mono をインストールするには、Ubuntu ソフトウェアセンター>開発ツール>Mono/CLI の検索で mono-complete を検索してインストールするとよいようだ。

Mono がインストールされていれば端末エミュレータで、csharp と入力するとインタラクティブシェルが起動する。

tomokiyo@tomokiyo-laptop:~$ csharp
Mono C# Shell, type "help;" for help

Enter statements below.
csharp> Console.Write("name: "); string name = Console.ReadLine(); Console.WriteLine("Hello, {0}", name);
name: Dolly
Hello, Dolly
csharp> "Hello, Dolly".Length;
12

上の例のように、コンパイルしないでも C# の機能を試すことができるのは非常にうれしい。メソッドなのかアトリビュートなのか迷うことは多いので、ちょっと入力するだけで確認できるのは学習の壁を低くしてくれる。

csharp> help;
"Static methods:
Describe(obj) - Describes the object's type
LoadPackage (pkg); - Loads the given Package (like -pkg:FILE)
LoadAssembly (ass) - Loads the given assembly (like -r:ASS)
ShowVars (); - Shows defined local variables.
ShowUsing (); - Show active using decltions.
Prompt - The prompt used by the C# shell
ContinuationPrompt - The prompt for partial input
Time(() -> { }) - Times the specified code
quit;
help;
TabAtStartCompletes - Whether tab will complete even on emtpy lines
"
いまのところは、コンパイルされたパッケージしか読み込むことができないようだが、将来的には、自分のプログラムを記述したソースファイルを読み込んでコンパイルして端末から使えるようになるかもしれない。まだ、開発途上のようだ。

PowerShell にしても、csharp にしても、インタラクティブ・シェルはプログラムの学習や開発を非常に楽にしてくれる。インタラクティブ・シェルで開発して、完成したらコンパイルして使うという作業の流れは、これから本流になっていくのかもしれない。
[PR]
by tnomura9 | 2011-01-30 10:54 | C# | Comments(0)

PowerShell で複数行のコマンドをプログラムする。

対話型のシェルで小さいプログラムをテストするとき、煩わしいのがプログラムをファイルに作成するという操作だ。ほんの数行のプログラムをテストしたいのに、いちいちエディタを立ち上げるのはかなり面倒に感じる。

PowerShell は原則として一行のコマンドレットしか実行できないが、Invoke-Expression とヒアドキュメントを組み合わせると、次の実行例のように、複数行にわたるスクリプトを実行することができる。

PS > Invoke-Expression @'
>> $total = 0
>> for ($i = 1; $i -le 10; $i++) {
>>     $total += $i
>> }
>> Write-Host "total = ", $total
>> '@
>>
total = 55

PowerShell では Add-Type コマンドレットを使うと、C#のソースも実行させることができるので、上のプログラムはC#を使って次のように実行することもできる。

PS > $source = @"
>> public class MyClass
>> {
>>    public static int Total()
>>     {
>>         int total = 0;
>>         for (int i = 1; i <= 10; i++)
>>             total += i;
>>         return total;
>>     }
>> }
>> "@
>>
PS > Add-Type -TypeDefinition $source
PS > [MyClass]::Total()
55
[PR]
by tnomura9 | 2011-01-30 00:00 | C# | Comments(0)

PowerShell でC#のコンパイル

PowerShell がすっかり気に入ったので、C#も PowerShell からコンパイルしたくなってきた。そこで、csc.exe のパス

C:\Windows\Microsoft.NET\Framework\v4.0.30319

を環境変数 PATH に追加し、Vim7.3をダウンロードしてきてインストールし、vim.exe のパス

C:\Program Files\Vim\vim73

を PATH に追加した。

それから、PowerShell を起動し、

> vim hello.cs

hello.cs の内容をつぎのように編集し、

namespace Hello {
  using System;

  class Hello {
    public static void Main() {
      Console.WriteLine("hello, world");
    }
  }
}

次のように、コンパイルして実行した。

> csc hello.cs

> .\hello.exe
hello, world

Windows 7 への愛しさが倍増した。(愛しさと、切なさと、心強さと... )
[PR]
by tnomura9 | 2011-01-26 19:09 | C# | Comments(0)

クロスプラットホームの時代

管理人はこのブログの記事を書くのに、FireFox を使ったり、Chrome を使ったりしている。それぞれが走る OS は、そのとき手元にあるパソコンを使うので、Windows だったり Linux だったりする。プログのクロスブラウザの機能のおかげで、記事の編集をするのに特定のパソコンを探す必要がない。

ブログの場合は、ツールはプロバイダーが開発した物で個人でどうこうすることはできないが、JavaScript を使った Web アプリケーションを作ると、同じことが、自分で作ったプログラムでも行う事ができる。クロスプラットホームはもう身近なものになっているのだ。

これは、情報をWebブラウザに発信しなければならないという、差し迫った必要性から自然発生的に生じてきた現象だが、Java や .NET など、ブラウザとは違うところにもクロスプラットホームの波は押し寄せてきている。このような中間言語を媒体とするクロスプラットホームの言語はブラウザに縛り付けられない。しかし、グラフィックやシステムの設定などの細かいところになると、完全互換とは言い難い。逆に、JavaScript はブラウザに縛り付けられているが故に、高い互換性が保たれているといえる。

この、中間言語による互換性のもう一つの利点は、その中間言語の上に自由に高級言語をデザインすることができるということだ。.NET で言えば、C#もC++もVBもPowerShellも同じCLIのコードを作成するので相互のライブラリを利用することができる。Java でも、JavaScript や Ruby をその中間言語の上に構築されている。そのうち、.NET や Java の中間言語を吐き出す Haskell コンパイラがでてくるかもしれない。そうしてそれらの言語は、.NET や Java の豊富なクラスライブラリを自由に使うことができる。

さらに、もう一つの流れも出てきている。それは、jQuery のような JavaScript のライブラリだ。これらは、単なるライブラリの域を越えて、JavaScript をアセンブラとする高級言語のような振る舞いをする。

正規表現もjQueryのように、言語内の言語という働きをしている。正規表現の文字列は内部的にはコンパイルされて文字列を解析するプログラムが作成される。独立した一つの言語なので、Perl や Ruby に限らずいろいろな言語で使用することができている。

中間言語による互換性が進むと、このようなモジュールをどのような高級言語からも呼び出せるようになるので、様々な用途の言語を使っていながら、統一的な記述を利用することができるようになる。

クロスプラットホームの流れはブラウザに対応させるために自然発生的に始まったが、それがこれからのコンピュータのプログラミングの流れを決定し、新しい、モジュール化された言語、特定の用途に特化した言語を迅速に作成できる言語などを生み出していくのではないだろうか。
[PR]
by tnomura9 | 2011-01-25 00:53 | JavaScript | Comments(0)

PowerShell

Windows のコマンドプロンプトに変わる新しいシェル PowerShell というのがあるのを知った。Windows 7 には標準でついている。

Uniix のパイプラインのデータフォーマットであるキャラクターストリームの代わりに、オブジェクトをパイプに流し込めると聞いて興味が湧いて調べてみた。Unixのシェルと操作感はかわりないが、.Net のオブジェクトを利用することができる。

パイプラインにオブジェクトを流し込めるというのは、将来的には、モジュール化したプログラムをつなぎあわせて高度の処理を迅速に行うことができるようになる可能性が考えられる。Unix のコマンドをパイプラインでつなぎあわせて使うのと次元の違う使い方ができるようになるかもしれない。

例えば、グラフ作成モジュールがあって、表計算のデータも、ワープロのデータも全てそのモジュールで処理できるようにすれば、表計算やワープロの重さを劇的に改善して操作性を上げることができるようになるだろう。

シェルとしての使い方の解説は、マイクロソフトのページWindows PowerShell でのスクリプティングに揃っている。

スクリプトとしての概要についてはPowerShell基礎文法最速マスターが便利だ。細工をすれば、ユーザ定義のクラスも作れるようだ。

書籍は『Windows PowerShell ポケットリファレンス』牟田口大介著が一押し。

使ってみた印象はなかなかいい。.NET に統合されているのも便利だ。Windowsマシンが、.NET を中心として、アマチュアプログラマにもプログラムできる魅力的な製品になってきた。.NET 関連の学習専用にノートパソコンが欲しくなってきた。
[PR]
by tnomura9 | 2011-01-22 12:52 | C# | Comments(0)

『道をひらく』を読んだ

松下幸之助著『道をひらく』を読んだ。パナソニックの創始者、松下幸之助氏のエッセイ集だ。一つ一つの随筆が見開きの2頁にまとめられていて読みやすい。どのページを開いても、そうだそうだと頷ける言葉ばかりで、松下幸之助氏が、素直で開かれた心の持ち主であったことを想像させる。

しかし、どの言葉ももっともな言葉ばかりだが、もうひとつ物足りない気がする。正論だが、はっと目を見開かされるような新奇性が感じられないのだ。どこかの古典にも現れていたような、すでにどこかで聞いていたような印象は拭えない。たとえば、聖書の「右の頬を打たれたら、左の頬も差し出しなさい。」というような、逆説や強烈な個性の力は感じられない。この本の著者が松下幸之助氏でなければはたしてこれほどのベストセラーになっていただろうかとも思える。

ところが、松下氏の言葉を自分が今直面している問題に照らして思い返して見ると、平凡だと思っていた言葉が、俄然、光を発しはじめる。現実の問題に直面したとき、平凡に振る舞うということがいかに大変で、かつ、実効性のあるものかが分かってくる。あたりまえのことをあたりまえに行うことこそ実は非常に非凡なことだったのだということが思い知らされる。

『道をひらく』に記されているあたりまえの言葉は、現実の経営においては、あたりまえであるからこそ力のある貴重な言葉だったのだ。
[PR]
by tnomura9 | 2011-01-21 07:16 | 話のネタ | Comments(0)

HTML文書とオブジェクト

Web アプリケーションでない普通のアプリケーションを構成する部品はなんだろうか。まず、ウインドウがあって、カーソルがある。ユーザはそこにキーボードから入力したり、ボタンをクリックしたり、カーソルをドラッグしたりして操作する。また、場合によっては、メインのウィンドウとは別にダイアログボックスを開く場合がある。また、ウィンドウもタブを使ったり、分割したりする。

これらの部品は全てオブジェクトでできている。そうして、オブジェクトは階層的に構成されたデータの塊だ。たとえば、ウインドウオブジェクトなら、表示位置や、大きさや、そこに表示しているデータなどいろいろなデータの情報を属性として持ち、また、プログラムからそれを管理することができる。このオブジェクトの本質が階層構造を持ったデータなのだ。

ところで、HTML文書の大きな特徴は、フラットなテキスト文書でこのような階層構造を表記できるということだ。しかも、タグによるこの階層構造の表記は、シンプルでかつ自由度が大きい。その上テキストエディタで簡単にいろいろな階層構造のデータを記述することができる、HTML文書のこの性質は、オブジェクト指向のプログラミング言語と非常に相性がいい。

つまり、言いたいことは、普通のプログラミング言語に現れるオブジェクトの基本骨格は、全てHTML文書で記述できるということだ。ウィンドウは別として、ボタンや、テキストフィールドや、複雑なダイアログに至まで、HTML文書とCSSとJavaScript で記述できないものはない。そうして、それをサクサクとテキストエディタで記述することができる。

Webアプリケーションを作ろうと思い立ったら、まず、divタグでいろいろなオブジェクトを作り、それから、それをどのように動かしていこうかと考えると良いようだ。

ということで、プログラムネタはしばらくお休みにします。Web アプリケーションは日曜プログラマにとっては魅力的なテーマだが、現状では管理人の CSS や jQuery などの基本的知識があまりに少ない。また、ノートがわりにブログを使うのは、他の人が読んでも分かるように表現しなくてはならないので少々つらい。パワーアップしたらまた記事がかけると思うが、ちょっと休みます。
[PR]
by tnomura9 | 2011-01-20 08:31 | JavaScript | Comments(0)

Web アプリケーションを作るのは大変 .... か?

Web アプリケーションを作るために知っておかないといけない知識は何だろうと考えてみた。

必須と思われる知識を羅列しても、HTML、CSS、JavaScript、DOM、jQuery、Ruby、RoR、PHP、SQL、Java、Apache、CGI、Ajax、XML .. と軽く10種類を越えてしまう。それぞれが、マスターするのに数冊の分厚い参考書を読破しないといけないとなると、まあやめとこうと思うのが自然だ。

それでも、Web のページを作っているうちに、なんとか簡単なWeb アプリケーションのようなものも作れるようになってくると、サーバーに置いた自分の作ったアプリケーションが、どこからでも、どのパソコンからでも利用できるのに驚きと喜びを感じたりする。おまけに、サーバーのプログラムをアップデートするだけで、どのパソコンのアプリケーションも何の操作もなしに一度にアップデートできる。

膨大な知識が必要と思われる割には、Web アプリが作れてしまうという背景には何があるのだろうか。考えるに、Web アプリを作るというのが、全ての知識をマスターしてからはじめて作れるようになるのではなく、つまみ食いしてあれこれやっているうちに、できる作品が少しずつ進化して、知識の方も深まっていくという性質があるからではないか。

なぜそうなのかというと。それは、ひとえにHTML文書が直観的で作りやすいからだと考えついた。

つまり、HTML文書のタグの性質を知っているだけで、他の知識は全くなくてもWebのページを作ることができるからだ。また、HTML文書のタグの性質は常に目に見える形で現れるから、納得しやすい。したがって、何も知らない状態から初めても、HTML文書のサンプルをそのまま写してタイプして文書を作成するだけで、タグの意味を理解できてしまう。

HTMLのタグの知識だけでWebのページが作れてしまうということは、実際に動くプロトタイプがそれだけの知識で作れてしまうということを意味する。他のいろいろな知識は、そのプロトタイプを改良するという仕方で使われるので、覚えたことをすぐにプロトタイプに試してみることができる。

すべての部品ができてから動く試作品が作れるのではなく、初めから動く試作品に手を入れていく方が数段開発しやすい。

Web アプリの開発は、HTML文書を作るということが、基本的に ajile な性質を持っているために、必要とされる知識が他の開発環境と比べて広範なのにも関わらず、やさしく感じられるのだろう。
[PR]
by tnomura9 | 2011-01-17 22:57 | JavaScript | Comments(2)