タグ:script ( 24 ) タグの人気記事

勉強会の予習を。

渋谷珈琲研究所

会社のブログにも書いたけど、2週間に一度の読書会をしていて、そのための予習をしなければ...と思いつつも、平行して違う勉強会の予習にとりかかってしまいました。

そっちの方はうちの会社から仕事していただいてる方に講師をつとめてもらってHey, Scripting Guy! ‐ 基本スクリプトを題材にしたこっちも読書会というか勉強会のようなもの。

前回テキスト ファイル内の文字数を数える方法はありますかというのをやったんだけど、本当は講師役の方にもっとスキルアップしてほしいという思惑があって次回までの宿題で

「文字数を数える時に大文字のみカウントする方法は?」

という無茶ぶりしてみました。自分でお題をふっといた手前ある程度サンプルを考えとかないと行けないよねーと思ったので、まずはキモになる大文字のみカウントする部分だけ考えました

var textline = "It's strange! It's amazing! It's wonderful! New!"
var RegEx = textline.match(/[A-Z]/g); // I,I,I,Nの文字がマッチする
WScript.Echo(RegEx.length); //配列RegExの長さを取得すればOK

Hey, Scripting Guy!はVBScriptがベースなんだけど、自分はずっとJavaScript(JScript)勉強しているのであえてこっちで書きました。
[PR]
by h5y1m141 | 2009-07-30 20:45

テスト駆動開発について勉強中

プログラミングの勉強した内容を別のブログで書こうと思って一時期チャレンジしていたんだけど、どうも別のブログに愛着が持てないというか、単純に使い分けすることが出来なくって、やっぱりこっちで書くことにしました。

ただソースコード自体をだらだら書いても面白くないから、

■どんな勉強をしたか?
■そこで感じ取ったことが何か?

ということだけ(なるべく)書くというルールを課すことにしました。

■どんな勉強をしたか?
プログラミングの勉強自体は、少しづつですが継続していて、現在はRubyスクリプティングを読みながら6章のテスト駆動の解説の所に入ってきました。
Rubyスクリプティングテクニック ―テスト駆動による日常業務処理術
Brian Marick
オライリー・ジャパン
売り上げランキング: 5539


■そこで感じ取ったことが何か?
テスト駆動開発の良さというのが、正直わかんなくって、色々本を読んでいてもその良さというのがわからなかったけど、実際にサンプルのソース見ながら、テストをまず最初に書いて、それに成功するような処理を実装してということで、なんていうか、こまめな達成感が得られるように思います。

プログラミング用語を使わずに強引に説明すると、公文式の算数ドリルをやっているような感じかなぁーって思いました。
どういうことかっていうと、先に6という答えがあって、その答えを満たすような、

6 = 5 + 1
6 = 4 + 2
6 = 3 x 2
6 = 7 - 1

というような数式を考える感覚に少し近いような感じがしました。

実際にプログラム書くときには、上記の右側はこんなシンプルな形というのはそう無いけれど、いづれにしても、先にやらないといけない答えがあって、それを解いて、目標達成して、また次に進めるということを繰り返すというテスト駆動というやり方の良さを知ったように思います。
[PR]
by h5y1m141 | 2008-04-20 20:31

ちょっとだけPerlの勉強しました -part4

a0033832_8413740.jpg

CPANモジュールを使う時に

use Number::Format qw /format_bytes/

のように、qw xxx としている部分の意味がイマイチわかんないけど、とりあえずそのままサンプルの通りにコードを書いていたのですが、続・初めてのPerl 改訂版を読み始めて、このモヤモヤした気分が解決しました。
モジュール名の後にインポートリストと呼ばれるサブルーチンリスト名リストを付ければ、インポートされるサブルーチンを制限できます。
use File::Basename ('basename','dirname');
(3.4 インポートする関数を選ぶにはより)
というのがあったのですが、

use File::Basename ('basename','dirname')

とある部分については
これは入力しづらいので、qw()リストを使った書き方の方が一般的です。(3.4 インポートする関数を選ぶにはより)
ということで、

use File::Basename qw(basename dirname)

という風に書くことが出来、読み込んだモジュールの中で必要とする関数を制限したい時にこういう指定をするということなのですね。

ちょっと1つ賢くなった気がします。
[PR]
by h5y1m141 | 2007-07-15 08:41

ちょっとだけPerlの勉強しました -part3

a0033832_19283859.jpgWEB+DB PRESS Vol.39の連載記事のRecent Perl Worldの記事を読みながらコマンドラインでサーバのCPU、メモリ情報を取得するスクリプトを本のソースを見ながらですが無事にできました。

--csv というオプションを付けて
./server-info-03.pl --csv 192.168.xxx.xxx
とやると
"192.168.231.128"," Genuine Intel(R) CPU T2400 @ 1.83GHz","1","248.6K"
という結果になりオプションをつけずに
./server-info-03.pl 192.168.xxx.xxx
とやると、以下のようにアスキーテーブルで出力されます

.---------------------------------------------------------------------.
| Title | Value |
+------------------+--------------------------------------------------+
| Host | 192.168.231.128 |
| CPU Model | Genuine Intel(R) CPU T2400 @ 1.83GHz |
| Number of CPU | 1 |
| Amout of Memmory | 248.6K |
'------------------+--------------------------------------------------'

で、ここまでは、連載記事でいうと、前置きというか、あまり良いコードとはいえないそうで、
一見して汚いだけでなく拡張性が乏しいのも問題です。
ということで、リファクタリングしていくことになるのですが、ちょっと意外だったのが
ところで今回わざとスクリプトを汚く書いているようにも見えますが、筆者は普段もこういう手順で書くことが多いです。まずはやりたいことを決めて、そのやりたいことが本当に実現できるか、ベタなスクリプトを書いてとりあえず試します。
と書かれていて、結構最初からある程度綺麗なコードを書かれているのかと思ったので、なんかうまく言えないけど励みになったのと、著者の方が汚いと言われているコードから綺麗なコードにちょっとづつ変えていくのを実際に読んでいくことで、オブジェクト指向っぽく書かれているPerlのソースをいきなり読むよりも最初汚く書かれているベタなやつから読み進めることで、個人的にはとっても理解しやすいなぁー


今日の勉強はとりあえずここまで。

余談
スクリプトと関係ないのですが、OS Xから、SSHするターミナルとして、iTermを使っているのですが、SSHした後に各種コマンドを実行した際にエラーメッセージが文字化けしていたのですが、ヘルプを読んで以下の手順で設定変更したらOKだった。
1.Infoアイコンをクリック
2.encodingの設定がDefaultが、Western(ASCII)になっているので、 Japanese(EUC)に変更
[PR]
by h5y1m141 | 2007-07-08 19:32

ちょっとだけPerlの勉強しました -part2

※ここん所、Perlの勉強が意外に続いているので、ちょっとタイトル変更しました
先日書いたちょっとだけPerlの勉強しましたというエントリで
sshできる環境はVMWare上のLinuxがあるので、OKなんだけど、公開鍵でログインできるようにしていないから、本の通りコーディングして実行しても

Permission denied (publickey,password).

という結果になるので、Net::SSHの処理の所を工夫するか、公開鍵でログインできるような設定に変更しないとダメだね....

と書きましたが、この続きをしようと思って、カフェで勉強していたのですが、インターネットに接続できない状況なのでこの部分どうにか調べようと思って、こういう時には、Net::SSHのドキュメントを見ればなんとかわかるかなぁーと思い、/Library/Perl/5.8.6/Net/cat SSH.pmの中身を見たところ、FAQが見つかり
Q: How do you supply a password to connect with ssh within a perl script
using the Net::SSH module?

A: You don't. Use RSA or DSA keys. See the ssh-keygen(1) manpage.

ということで、SSH公開鍵でログインできるようにしておかないとダメなんですね。これは家に帰ってからやらないと。ということで、OS X上のターミナルで
ssh-keygen -t rsa
として、公開鍵と秘密鍵のペアを作って、
scp .ssh/id_rsa.pub xxx.xxx.xxx.xxx:.ssh/authorized_keys
とすることで、見事、VMware上のLinuxにいちいちパスワード入力しなくてもsshできるようになったので、引き続きPerlの勉強していこうかと思います

前のエントリで、

あとコーディングしていて、いっつもPerlのソースでわかんない
my $cpuinfo = shift;
のshiftの部分の所と
と書いたけど、このshift の意味は、この前、続・初めてのPerl 改訂版
を読んでやっとわかった。shift、mapとかって、読んだ限りでは使い方を工夫すればとっても便利そうだけど、やっぱりこういうのは、体系だった本でしっかりと基礎を抑えた方が良いのかなぁと思ったので、amaoznで買うことにしました。
続・初めてのPerl 改訂版
Randal L. Schwartz brian d foy Tom Phoenix 吉川 英興 伊藤 直也 田中 慎司 株式会社ロングテール/長尾 高弘
オライリー・ジャパン (2006/10/21)
売り上げランキング: 13346

[PR]
by h5y1m141 | 2007-07-07 14:14

ちょっとだけPerlの勉強しました

一昨日、会社帰りにWEB+DB PRESS Vol.39を購入したのですが、連載記事のRecent Perl Worldで、綺麗なコード+ノウハウの関係という内容で、シェルスクリプトを最初はとりあえず動かせるレベルのものから徐々にリファクタリングして、綺麗なコードにしていくという内容で、実行するスクリプトも、コマンドラインでサーバ情報を取得するという面白そうな内容だったので、本を読みながら昨日はコーディングの勉強してました。

いくつか、つまづいた所をピックアップすると、Mac 上で開発しているので、Linux上だと
#!/usr/local/bin/perl
となる所は、OS Xだと
hoyamada-mac:~/bin hoyamada$ which perl
/usr/bin/perl
ということなので
#!/usr/bin/perlとしないといけないことに最初気づかなかったのでここを修正。

今回の連載記事で想定している環境は
簡単のために、サーバのOSはLinuxであると限定します。またサーバにはSSH公開鍵でログインできることを前提とします。
ということで、sshできる環境はVMWare上のLinuxがあるので、OKなんだけど、公開鍵でログインできるようにしていないから、本の通りコーディングして実行しても

Permission denied (publickey,password).

という結果になるので、Net::SSHの処理の所を工夫するか、公開鍵でログインできるような設定に変更しないとダメだね....

あとコーディングしていて、いっつもPerlのソースでわかんないのが
my $cpuinfo = shift;
というようなソースの場合のshiftの部分の所と

if ($line = ~ m/^model name\s+:(.*)/)

の$line以降の正規表現の所。
あとは、本筋とは離れるけど、CarbonEmacs上でコーディングしていたんだけど、バージョン管理のためのPCL-CVSというのをたまたま見つけて、試しに使ってみて、変更履歴も以下のように確認できました。

revision 1.6locked by: hoyamada;
date: 2007/06/24 07:52:28; author: hoyamada; state: Exp; lines: +2 -2
xxxxxxx

最近、ブログを書く時に、基本的にはCarbon Emacs上で書いたやつをコピペすることが多いんだけど、意味も無くこのCVSの機能使ってみようかなぁ。本当はSubversion使いこなしたいんだけど、元々こいうバージョンコントロールのツールの使いこなしに慣れていないから、このPCL-CVSから徐々に慣れていくというのもありかなぁと思いつつ、全くまとまりが無い文章になってしまった...
[PR]
by h5y1m141 | 2007-06-25 21:19 | メモ

JScriptメモ

会社の同じチームの人が最近、色々とやる気になっていて、この間買ったAjaxの本を見せてもらったら、結構いい感じの内容だったので、その本のサンプルにあったものをそのままJScript化(っていってもほとんど本のサンプルと変わらないんだけどね・・)

function Book(title, price, isbn){
this.title = title;
this.price = price;
this.isbn = isbn;
}

Book.prototype.tax = 1.05;
Book.prototype.amazonURL =
" http://www.amazon.co.jp/exec/obidos/ASIN/";
Book.prototype.withTax = function() {
return this.price * this.tax;
};
Book.prototype.makeAmazonURL = function(){
return "<a href=\"" + this.amazonURL + this.isbn + "\">"
+this.title + "<\/a>";
}

books = new Array();
books[0] = new Book("できるHTML入門",1580,"4844319302");
books[1] = new Book(" Web2.0入門",1800,"4844322265");

var enumItems = new Enumerator(books);
for (; !enumItems.atEnd(); enumItems.moveNext()) {
var objBook = enumItems.item();
WScript.Echo(objBook.makeAmazonURL ()+"金額" + objBook.withTax())
}

[PR]
by h5y1m141 | 2007-01-27 18:29

スクリプト少しだけ拡張しました

このエントリで、コマンドラインからHTMLコンテンツ取得するスクリプトについて書きましたが、wget.classに1つメソッドを追加してみました。注)正規表現のパターンのところがなぜかエキブロ投稿時にひっかかるために、タグの所は全角になってます。

Public Sub GetTitleElement()
Dim S1,S2
Set objRe = new RegExp
objRe.Pattern = "<title>Amazon.co.jp: (.+?)</title>
\n<link rel=""related"" type=""text/html"" href=""(.+?)"" />"
objRe.Global = True
objRe.ignoreCase = True
Set matches = objRe.Execute(my_htmlContents)
For Each match in matches
S1 = match.SubMatches(0)
S2 = match.SubMatches(1)
my_Title = S1 & S2 & vbCrLf
WScript.Echo my_Title
Next
End Sub

このクラスをつかったwsfファイルで
Dim objWget
Set objWget = New wget
objWget.CharCode = "UTF-8"
objWget.Fetch()
objWget.GetTitleElement()

として、コマンドラインで
cscript wget.wsf //nologo http://b.hatena.ne.jp/h5y1m141/atomfeed?tag=200701
と実行すると、私のはてブで[200701]という今月読んでいる(もしくは読んだ)本の情報が以下のように出力されます。

おまけより割引してほしい―値ごろ感の経済心理学: 本: 徳田 賢二http://www.amazon.co.jp/gp/product/448006334X

食糧テロリズム―多国籍企業はいかにして第三世界を飢えさせているか: 本: ヴァンダナシヴァ,Vandana Shiva,浦本 昌紀,金井塚 務,竹内 誠也http://www.amazon.co.jp/gp/product/475032454X

ヒューマン2.0: 本: 渡辺 千賀http://www.amazon.co.jp/gp/product/4022731222

マネーロンダリング入門―国際金融詐欺からテロ資金まで: 本: 橘 玲http://www.amazon.co.jp/gp/product/4344980093

カレーを作れる子は算数もできる: 本: 木幡 寛http://www.amazon.co.jp/gp/product/4061498630

脳を鍛える筋トレ PNFとはなにか: 本: 市川 繁之、鈴木 克憲、織田 淳太郎
http://www.amazon.co.jp/gp/product/4334033741

テレビはなぜ、つまらなくなったのか―スターで綴るメディア興亡史: 本: 金田 信一郎
http://www.amazon.co.jp/gp/product/4822201589

ユニクロvsしまむら—専門店2大巨頭圧勝の方程式: 本: 月泉 博http://www.amazon.co.jp/gp/product/4532313007

本当は、今回ついかしたメソッドは、wget.classに実装しないで、別途hatena.classのような奴をつくって、hatena.class はwget.class を継承するようなやり方にそのうちに変更していこうかと思います。

どうでもいいけど、このサイトをこの前知ったんだけど、VBScriptからSOAPClient オブジェクトつかうことで、SOAPをつかってアクセスするようなwebサービスも利用できるんだね。てっきりそういうのは、.NET じゃないとできないのかと思っていた・・
[PR]
by h5y1m141 | 2007-01-11 21:24

コマンドラインからHTMLコンテンツ取得するスクリプト

タイトルの通りなのですが、コマンドラインからHTMLコンテンツ取得するVBScript 作ったのですが、単につくるだけでは芸が無いのと、今後の拡張を考えて、wget というクラスを1つ作り、それを継承する形ではてなやアマゾンのwebサービス利用できるようなものを目指してにしていこうかと思っています。

で、作りかけだけど、wget クラスは以下のような感じに。
Class Wget
Private my_url
Private objHTTP
Private outputStream
Private html
Private ADTYPETEXT
Private ADTYPEBINARY
Private code
Private my_htmlContents 'HTMLのBody要素全体を格納
Private objRe

Private Sub Class_Initialize()
ADTYPETEXT = 2
ADTYPEBINARY = 1
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
Set outputStream = CreateObject("ADODB.Stream")
code = "Shift_JIS"
my_htmlContents = ""
End Sub

Property Let Url(address)
my_url = address
End Property

Property Let CharCode(str)
code = str
End Property

Public Sub Print()
WScript.Echo my_htmlContents
End Sub

Public Sub GetCommentElement()
Set objRe = new RegExp
objRe.Pattern = ""
objRe.Global = True
objRe.ignoreCase = True
Set matches = objRe.Execute(my_htmlContents)
End Sub

Public Sub Fetch()
' エキブロの仕様のため、下記のオープンは英語のOpenに置換して使ってください
Call objHTTP.オープン("GET",my_url,False)
objHTTP.Send()
html = objHTTP.responseBody

'ADODB.Streamを利用してHTMLコンテンツ取得
outputStream.Type = ADTYPEBINARY
outputStream.オープン()
outputStream.Write(html)
outputStream.Position = 0

outputStream.Type = ADTYPETEXT
outputStream.Charset = code
my_htmlContents = outputStream.ReadText()
outputStream.Close()
End Sub

End Class
で、このクラスをつかってwsfファイルを作成します。エキブロの仕様のため、一部のタグがつかえなかったりするので、必要と思われる所だけピックアップ

Dim objWget
Set objWget = New wget

Dim colArgs,tempData
Set colArgs = WScript.Arguments
If ChkArgs(colArgs) Then
objWget.url = colArgs(0)
Wscript.Echo "OK"
objWget.CharCode = "UTF-8"
objWget.Fetch()
objWget.Print
End if

Function ChkArgs(colArgs)
If colArgs.Count <>1 then
Wscript.StdErr.WriteLine("引数指定エラー")
ChkArgs = False
Wscript.Quit()
Else
ChkArgs = True
End if

End Function

Set objWget = Nothing
使うときには、コマンドラインで以下のように入力すれば、OK。
cscript wget.wsf //nologo http://b.hatena.ne.jp/h5y1m141/vbs/
[PR]
by h5y1m141 | 2007-01-07 20:11

JScript でExping もどき

未読になっていたネットワーク関連のブログを何気なくチェックしていて、ネットワークエンジニアに成るさんのネットワークのリモート監視と操作と現場マンというエントリーで
こういうときはツールに頼ればいい。
ネットワークやっている人なら必ず触ると思われる
Expingでpingを連続で打ち続けていた。
とあって、Expingに頼らないで、JScriptで、書けるかなぁと思ってちょっとチャレンジしてみて、作成約1時間ほどかかったけどできた!

こういう地道な作業に対しては、Windows系ならVBScript、Unix/Linux系ならPerlやRubyや最近だとPythonとかになるだろうけど、いづれにしても、1つ得意なのを知っておくと、いざっていうときに、色々と応用がきくかなぁと。

下記がサンプルコードです。(IPアドレス羅列してるから本当はこの部分はテキストファイルとかから読み込ませるようにしたほうが処理的には綺麗だと思うけど、とりあえずということで)

コマンドラインで実行するとこんな感じでループしつづける
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED

ここからソースコード

do {
var h;
h = checkHours();
var IP1="192.168.1.1";
var IP2="192.168.1.2";
exPing(IP1);
exPing(IP2);
/*
ループしつづけるとCPU使用率上がるので
待ってから処理を行う。1000だと1秒
*/

WScript.Sleep (1000);
} while(h<24);

function checkHours() {
var currentTime,currentHours;
currentTime = new Date();
currentHours = currentTime.getHours();
return(currentHours);
}

function exPing(IPAddress) {
var objShell = new ActiveXObject("WScript.Shell");
var objExecObject = objShell.Exec
("%comspec% /c ping -n 1 -w 1000 " + IPAddress);

do {
var strText = objExecObject.StdOut.ReadAll()
/*
search メソッドでPingの実行結果にReplyが含まれるかどうか
確認。一致する文字列が見つらない場合には-1が返るためその数値を
条件判定式で利用
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/js56jsmthsearch.asp
*/
var reg = /Reply/i;
if(strText.search(reg)>0) {
WScript.Echo(IPAddress + "-->REPLY RECEIVED");
} else {
WScript.Echo(IPAddress + "-->NO REPLY RECEIVED");
}
} while(!objExecObject.StdOut.AtEndOfStream);
return null;
}

[PR]
by h5y1m141 | 2006-11-14 22:41