« 2009年10月 | トップページ | 2009年12月 »

2009年11月

Go言語のポリモーフィズム

Go言語のポリモーフィズムは、クラスの継承ではなく、インタフェースによって実現される。このことがGo言語のオブジェクト指向を特徴付けている。

また、そもそもGo言語にはクラスがない。変数を区別するのは「型」だ。そして、任意の変数の型にメソッドを持たせることができる。例えば、myType型にgetメソッドとsetメソッドを持たせるには、次のように記述する。

type myType struct { i int }
func(p *myType) get() int { return p.i }
func(p *myType) set(i int) { p.i = i }

メソッドは関数に似ているが、レシーバー(ここではmyType)を持っている点で関数と異なっている。

さて、インタフェースは次のように定義する。

type myInterface interface {
        get() int;
        set(i int);
}

myTypeはmyInterfaceを満足しているので、パラメータとしてmyInterfeceを持つ関数は、myType型の変数を受け付けることができる。

func getAndSet(x myInterface) int {
        x.set(10);
        return x.get();
}

func f1() {
        var p myType;
        var i = getAndSet(&p);

        fmt.Printf("%d\n", i)
}

関数getAndSetは、myType型の変数に限らず、ある変数がmyInterfaceで宣言したメソッドを実装しているならば、その変数を受け付けることができる。これはいわゆるDuckTypingである。

★WOZ★

//ソースコード ここから

package main

import "fmt"

type myType struct { i int }
func(p *myType) get() int { return p.i }
func(p *myType) set(i int) { p.i = i }

type myInterface interface {
        get() int;
        set(i int);
}

func getAndSet(x myInterface) int {
        x.set(10);
        return x.get();
}

func f1() {
        var p myType;
        var i = getAndSet(&p);

        fmt.Printf("%d\n", i)
}

func main() {
        f1();
}

//ここまで

| | コメント (0) | トラックバック (0)

Go言語をUbuntu9.10にインストールしてみる

VirtualBox3.0の仮想マシンにインストールしたUbuntu9.10に、Googleの新言語Goをインストールした。

手順はInstalling Goの通りで、
注意事項はUbuntu9.04の場合と同じだ。

Go言語はWindowsに対応していないため、WindowsでGoの開発環境をつくるには、CygwinやMinGWを使う方法もあるが、もし仮想マシンを動かすのに十分なリソースがあるのであれば、VirtualBoxやVmWareの仮想マシンにLinuxをインストールして、そこにGoの開発環境を作るのが、間違いのない良い方法だと思う。

★WOZ★

VirtualBox Book VirtualBox

著者:Dirk Becker
販売元:Galileo Press Gmbh
Amazon.co.jpで詳細を確認する

VMware徹底入門 VMware徹底入門

販売元:楽天ブックス
楽天市場で詳細を確認する

 Ubuntu9.10完全ガイド Ubuntu9.10完全ガイド
販売元:セブンアンドワイ
セブンアンドワイで詳細を確認する

| | コメント (0) | トラックバック (0)

Pythonでワード文書の統計量を取得する

Pythonからワード文書(.docx)の統計情報を取得できる。

まず、win32com.clientをインポートする。

 import win32com
 from win32com.client import *

次に、ワードを起動する。

 app = win32com.client.Dispatch("Word.Application")
 app.Visible = False

次に、ワード文書を開く。

 doc = app.Documents.Open("c://work//test.docx")

これでワード文書の統計量を取得する準備ができた。

統計量を取得するには、ワードドキュメントクラスのメンバ関数ComputeStatisticsを使う。

この関数の引数に次の値を渡すと、その統計量が戻り値になる。

  • ページ数:2
  • 段落:4
  • 行数:1
  • 単語数:0
  • 文字数:3
  • 文字数(スペースを含む):5
  • 文字数(日本語):6

 

つまり、こうだ。

 NumberOfWords = doc.ComputeStatistics(0)

 NumberOfLines = doc.ComputeStatistics(1)

 NumberOfPanges = doc.ComputeStatistics(2)

 NumberOfCharacters = doc.ComputeStatistics(3)

 NumberOfParagraphs = doc.ComputeStatistics(4)

 NumberOfCharactersWithSpaces = doc.ComputeStatistics(5)

 NumberOfFarEastCharacters = doc.ComputeStatistics(6)

統計量をとったらワード文書を閉じる。
 doc.Close()

最後に、ワードを終了する。
 app.Quit()

試しに11月25日のブログから抜粋して、
test.docxに保存した後、統計量を調べてみた。

/////
iotaをLongman English Dictionlaryで調べると、
not one/an iota
not even a small amount
とある。
用例は、
It won't make an iota of difference.
つまり、iotaほどの違いもない、という意味だ。
/////

統計量は、次の通りだ。

ページ数:1
段落:7
行数:7
単語数:55
文字数:130
文字数(スペースを含む):144
文字数(日本語):35

この方法を使えば、大量のワード文書の統計量を、
いちいちプロパティを開くことなく集計することができるので、
とても効率的だ。

★WOZ★

初めてのPython 第3版 Book 初めてのPython 第3版

著者:Mark Lutz

販売元:オライリージャパン
Amazon.co.jpで詳細を確認する

にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村

| | コメント (0) | トラックバック (0)

「入門!論理学」はソフトウェア設計者にもお薦めの一冊だ

最近、ちょっとしたことから論理学に入門したくなった。

そこでとりあえず読んでみたのが、この本だ。

論理学といえば、記号や式がたくさん出てくる、

という印象があるが、

中公新書「入門!論理学」は違う。

非常にわかりやすい文章と、

これまたわかりやすい例題で、

論理学の世界に誘ってくれる。

こんな例題が出てくる。

  • 手形は有価証券である
  • 小切手は手形ではない
  • だから、小切手は有価証券ではない

これは演繹的推論として正しいか?

(24頁から引用)

★WOZ★

入門!論理学 (中公新書)Book入門!論理学 (中公新書)

著者:野矢 茂樹
販売元:中央公論新社
Amazon.co.jpで詳細を確認する

| | コメント (0) | トラックバック (0)

世界征服も夢ではない! Googleを支える技術

久しく会っていなかった友人と、

久しぶりに話す機会があった。

話は自然とGoogleに移っていくのだが、

Googleのやっていることはとてもシンプルで、

世界の再定義だな、という話をした。

地図、電話、コミュニケーション、

図書館、OS、システム言語、パソコン、

という具合に、

Googleが再定義した、

あるいはこれからしようとしているものは多い。

この調子で行くと、

世界征服も夢ではないな。

西田圭介さんの著作「Googleを支える技術」は、

そんなGoogleの現在を支えている、

MapReduceに代表されるテクノロジーを、

わかりやすく説明している。

★WOZ★

Googleを支える技術 Googleを支える技術

販売元:楽天ブックス
楽天市場で詳細を確認する

| | コメント (0) | トラックバック (0)

Go言語のIota

Go言語にIotaという機能がある。
こんな使い方をする。

const (  // iota is reset to 0
c0 = iota;  // c0 == 0
c1 = iota;  // c1 == 1
c2 = iota   // c2 == 2
)

iotaは、';'の度に1インクリメントする。

iotaをLongman English Dictionlaryで調べると、
not one/an iota
not even a small amount
とある。
用例は、
It won't make an iota of difference.

つまり、iotaほどの違いもない、という意味だ。

ほんの少しの違い=1

iotaの語感が分かると、GoのIotaの機能もよく分かる。

日本人には、どうしても、
このあたりの語感の分からなさがあるので、
欧米生まれのプログラミング言語を、
心の底から分かるのは、難しいのかもしれない。

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonでエクセルシートをテストする!(4)

Pythonでエクセルシートをテストする!(2)
と、
 Pythonでエクセルシートをテストする!(3)
の方法を使うと、
エクセルシートをテストすることができる。

実は、エクセルシートのテストには2種類あり、
一つは(1)エクセルシートの機能テストで、
もう一つは(2)エクセルシートに記入されたデータのテストだ。

今仮に、ソフトウェア品質保証を担当する人が、
品質データを収集するためにエクセルシートを使う場合を想定する。
さらに、そのエクセルシートには自動計算機能がついていて、
あるセル(あるいは複数のセル)に入力された値を使って、
別のセルの値を計算して自動入力すると想定する。

(1)エクセルシートの機能テストは、例えば、

 機能:セルA1とセルA2の値を足してセルA3に代入する

という機能が正しく実装されていることを検証するテストだ。
この場合、Pythonからエクセルを操作して、

 A1に10を、
 A2に100を、

それぞれ代入した後で、A3の値を取り出して、
110になっていることを確認する。

エクセルシートの他の機能についても同様にテストした後で、
そのシートをソフトウェア開発部門に配布して、データを収集してもらう。

その後、ソフトウェア開発部門からデータ記録済みのエクセルシートを回収して、

データの記入漏れがないか、
異常なデータが記入されていないか、
を調べるのだが、
これが、
(2)エクセルシートに記入されたデータのテスト
だ。
ここでも同様にPythonからエクセルを操作して、例えば、
A1の値を取り出し、

データが空でないことや、値が想定した範囲内であることをを確認する。
このテストに通らない場合、ソフトウェア開発部門に再度データの収集を依頼する。

このように、Pythonとエクセルを組み合わせれば、
日常のデータ収集業務の効率をあげることができ、

さらに、
Pythonの豊富なライブラリ群を活用することにより、
収集したデータをデータベースに登録するとか、
データを加工して、グラフ化するといったことも、
簡単にできてしまう。

★WOZ★

| | コメント (0) | トラックバック (0)

Windows7+ViatualBox3.0+Ubuntu9.10で開発環境を構築する

新しく買ったWindows7マシンに、
Linux開発環境を構築しようと思い、
次の構成で、Windows上に仮想マシンをつくり、
そこにUbuntuをインストールした。

  • Windows7 Home Premium(64-bit)
  • VirtualBox3.0.12
  • VBoxGuestAdditions
  • Ubuntu9.10

以下は構築手順だ。

1.VirtualBoxのインストール

VirtualBoxのダウンロードサイトから、

Windows用のインストーラをダウンロードしてインストールする。

2.Ubuntuのダウンロード

Ubuntu日本語Remixのダウンロードサイトから、
日本語RemixCDイメージをダウンロードする。

3.仮想マシンの作成

ViatualBoxを起動して、Ubuntuをインストールする仮想マシンを作る。

仮想マシンのメインメモリは1024MBに、

ビデオメモリは128MBに、

それぞれ設定した。

なお、Windows7マシンのメインメモリは4GBだ。

4.ゲストOSのインストール

DVD-ROMをマウントして、Ubuntuのisoイメージからインストールする。

インストール後はDVD-ROMをアンマウントする。

5.VBoxGuestAdditionのインストール

VirtualBoxのメニューから「デバイス」ー「GuestAdditionsのインストール」を選択する。

DVD-ROMをマウントして、VBoxGuestAddition.isoを選択する。

その後、ターミナルを開いて、

$ cd /media/cdrom0
$ sh ./autorun.sh

その後、ターミナルを開いて、

$ cd /cdrom

$ sh ./autorun.sh

VBoxGuestAdditionsのインストールが終わったら、Ubuntuを再起動する。

6.解像度を設定する

デフォルトの解像度は800×600なので、好きな解像度に設定する。

これで構築は終わり。

ネットワーク、サスペンドともに問題なく動作している。

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonでエクセルシートをテストする!(3)

今回は、Pythonで次のエクセル操作をする方法だ。

(1)エクセルを起動して(表示なし)、

(2)ファイル"test.xlsx"を開いて、

(3)"Sheet1"を編集して、

(4)別のファイル"test2.xlsx"に保存して、

(5)エクセルを終了する、

Pythonでエクセルシートをテストする!(2)

とは、
(1)でエクセル画面を表示しないこと
(3)でシート名を指定していること
(4)で別のファイルに保存していること
が異なる。

では早速。

まず、win32com.clientをインポートする。

import win32com
from win32com.client import *

次に、エクセルを起動する。
app = win32com.client.Dispatch("Excel.Application")
app.Visible = False

次に、エクセルブックを開く。
book = app.Workbooks.Open("c:\\work\\test.xlsx")

さらに、シートを選ぶ。
ここでは"Sheet1"を指定している。
sheet = book.Worksheets("Sheet1")

ここから2行が編集だ。
sheet.Cells(1, 1).Value = 10
sheet.Cells(1, 2).Value = 100

その後、ファイルを保存し、
book.SaveAs("c:\\work\\test2.xlsx")

エクセルファイルを閉じる。
book.Close()

最後に、エクセルを終了する。
app.Quit()

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonでエクセルシートをテストする!(2)

Pythonでエクセルを操作する。

下記は、

(1)エクセルを起動して、

(2)既存のファイルを開いて、

(3)編集して、

(4)保存して、

(5)エクセルを終了する、

手順だ。

まず、win32com.clientをインポートする。

import win32com
from win32com.client import *

次に、エクセルを起動する。
app = win32com.client.Dispatch("Excel.Application")
app.Visible = True

ここで、
Trueを設定すると、
エクセルの画面が表示されるし、
Falseを設定すると、
エクセルの画面は表示されない。

次に、エクセルブックを開く。
book = app.Workbooks.Open("c:\\work\\test.xlsx")

さらに、シートを選ぶ。
ここでは一枚目を指定している。
sheet = book.Worksheets(1)

ここから2行が編集だ。
sheet.Cells(1, 1).Value = 10
sheet.Cells(1, 2).Value = 100

その後、ファイルを保存し、
book.Save()

エクセルファイルを閉じる。
book.Close()

最後に、エクセルを終了する。
app.Quit()

セルの値を取り出したいときは、
a = sheet.Cells(1, 1).Value

というようにする。

ここで、間違えやすいのは、

Workbooks、Sheets、Cells、というように、

複数形を使うことだ。

's'をつけ忘れると、エラーになる。

★WOZ★

| | コメント (0) | トラックバック (0)

エクセル2007のファイル形式は、xlsx

Pythonとwin32comでエクセルを操作していたところ、

エクセル2007のファイル形式(.xlsx)と、

それまでのエクセルのファイル形式(.xls)とが、

違っていることがわかった。

エクセル2007からXMLになっている。

それと、

win32comの保存関数は、

フルパスを指定しないと、MyDocumentsに保存されてしまうようだ。

★WOZ★

| | コメント (0) | トラックバック (0)

Pythonでエクセルシートをテストする!(1)

データの収集にエクセルシートを使うことは多い。

そして、あるセルに値を書き込むと、

その値を使って計算した値を別のセルに書き込む、

というようなエクセルシートもよく作る。

しかし、そのエクセルシート自体が、

正しく動くことをテストせずに、

データ収集のために、みんなに配ってしまい、

「動かないじゃないか!」と苦情を言われてしまうことも、

起こりがちである。

そんな事態に陥らないために、

少々めんどうでも、

エクセルシートをきちんとテストしたい。

と前置きが長くなったのだが、

Pythonでエクセルシートをテストする方法を、

考えてみた。

まず調べたのが、

Python+xlutils+xlrd+xlwtの組み合わせだが、

これは、エクセルシートに埋め込んだ数式がうまく扱えなかった。

次に調べたPython+win32comの組み合わせは、

その数式がうまく扱えた。

最後にIronPythonも同様に問題なかった。

というわけで、

今後、何回かにわけて、

Python+win32comと、

IronPythonを使って、

エクセルシートをテストする話を書いていこうと思う。

★WOZ★

| | コメント (0) | トラックバック (0)

Googleの新言語Goを、Ubuntu9.04にインストールしてみる(2)

GoをUbuntu9.04にインストールする時の注意事項は下記の通り。

なお、以下は32ビットのLinuxをx86マシンで動かしてる場合だ。

他の場合は、Installing Goを参照のこと。

1.環境変数の設定

次の4行を、.bashrcに追加する。

4行目を忘れずに設定すること。

export GOROOT=$HOME/go

export GOARCH=386

export GOOS=linux

export PATH=$PATH:$HOME/bin

2.リポジトリの準備

分散型バージョン管理システムmercurialを使っていない場合は、

Goより先にmercurialをインストールする。

1行目のコマンドを忘れずに実行すること。

$ sudo apt-get install python-setuptools python-dev
$ sudo easy_install mercurial
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
 3.Goコンパイラとリンカの選択
環境変数を次のように設定したので、 
export GOARCH=386
コンパイラは"8g"を、
リンカは"8l"を使う。
★WOZ★ 

| | コメント (0) | トラックバック (0)

Googleの新言語Goを、Ubuntu9.04にインストールしてみる

Googleの新言語Goを、

Ubuntu9.04で動かしてみた。

"Installing Go"を読みながら、

あっさりインストール完了。

まずはお約束の”hello world”だ。

Goのソースコードの拡張子は、".go"なので、

次のコードをhello.goに保存する。

package main

import "fmt"

func main() {
    fmt.Printf("hello world, こんにちは\n")

}

さぁ、コンパイル

$ 8g hello.go

リンク

$ 8l hello.8

実行

$ ./8.out

hello world, こんにちは

無事に動きました。

★WOZ★

| | コメント (0) | トラックバック (0)

モデル検査 調べ中。

「4日で学ぶモデル検査」だと、

この技術をどう使うのかが、

わからなかったので、

もう一冊「SPIN モデル検査」を買ってみた。

と同時に、

論理学の入門書「入門! 論理学」も、

合わせて買った。

入門書のほうは読み始めたが、

SPIN本はまだ積んである状態だ。

まだ、進展はない。

★WOZ★

| | コメント (0) | トラックバック (0)

SPINを使うモデル検査に思うこと。

SPINでは、

状態遷移モデルをPromelaで、

検査項目をLTLで、

それぞれ記述する。

Promelaは、シェルスクリプトに似た言語だ。

C言語にも似ている。

こんな風に書く(↓)。

active proctype hello()
{
  do
    if
    ...
    fi
  od
}

LTLは、"Linear Temporal Logic"の略で、

線形時相論理の論理式だ。

こんな風に書く(↓)。
[](p -> <>q)

で、Promelaで書いた状態遷移モデルの全パスを調べて、

LTLで書いた論理式が成立するかしないかを調べる。

成立しない場合は、反例を一つ提示する。

全パスを調べるので、

部分的な検証に過ぎないテストより確実に、

モデルの検証ができる。

要求分析をPromelaとLTLでするとして、

どうやって実装言語とつなげていくのかが、

やっぱり気になる。

★WOZ★

| | コメント (0) | トラックバック (0)

モデルを検査!

以前紹介した「4日で学ぶモデル検査」で扱っていた、

モデル検査ツールSPINを動かしてみました。

本では、

KNOPIXをCD-ROM起動して使うように、

書かれていますが、

Windowsに、

MinGWとActiveTclとSPIをインストールしても、

問題なく使えました。

明日は先輩が作ってくる例題を、

動かしてみようと思う。

★WOZ★

SPINモデル検査―検証モデリング技法BookSPINモデル検査―検証モデリング技法

著者:中島 震
販売元:近代科学社
Amazon.co.jpで詳細を確認する

| | コメント (0) | トラックバック (0)

4日で学ぶモデル検査

産総研が書いている「4日で学ぶモデル検査 初級編」を読んでみた。

・実機が稼働する前の設計段階から適用できるので、仕様書レベルの本質的なバグを検出するのに好都合

・数学や論理を使って厳密な検証を行うため、テストによる方法に比べて、検出できる不具合の範囲が大きい

という特徴があるそうだ(同書「はじめに」から引用)。

この本では、モデル検査を行うツールとして、

SPINとNuSMVという二つを紹介しているが、

どちらも専用の言語を使って、

モデルと検査項目を記述する必要がある。

10章の例題で、

C言語で書いたプログラムの検査についても書かれているが、

その例題では、

Cのコードを、専用言語に書き直している。

SPINの場合、専用言語はPromelaなのだが、

・Promelaのコードから実装言語のコードを自動生成

・実装言語のコードからPromelaのコードを自動生成

することができれば、

システム設計レベルでかなり使えるツールだと思う。

ただ、きちんと検証をするには、

システム設計レベルで、

モデルと検査項目の仕様を、

Promelaなどのプログラミング言語で書く必要があるので、

従来の、

ワードやエクセルで設計文書を作るという、

そういう設計スタイルに慣れている人には、

受け入れにくいだろうな、とも思う。

★WOZ★

4日で学ぶモデル検査 (初級編) (CVS教程 (1))Book4日で学ぶモデル検査 (初級編) (CVS教程 (1))

著者:産業技術総合研究所システム検証研究センター
販売元:エヌ・ティー・エス
Amazon.co.jpで詳細を確認する

| | コメント (0) | トラックバック (0)

« 2009年10月 | トップページ | 2009年12月 »