ChaichanPapa-World !

燈明日記(2009/04

◆ インデックス

◆ 2009年4月

2009-04-29 今日はイベント2つ

午後1時から、三男の中学バスケットで春の大会の試合があります。

本当はもうちょっと早い時期なのですが、シード校なのでちょっと遅いわけです。

前回は、多摩大会3位で、今回はどこまでいけるか、楽しみです。


午後7時からは、秋葉原駅前のドレスホールで長男のライブがあります。

今回は、練習もちゃんとして、気合いを入れて臨んでいるので、一味ちがう『小池啓仁』が見れそうです。

新曲の『For Me』もお披露目するとのことで、楽しみです。


◆小池啓仁のライブのお知らせです!

みなさん、ご都合がよろしければ、よろしくお願いします。

2009-04-29 LinuxでPerlスクリプトを実行するには

WindowsでのPerlスクリプトの実行は、スクリプトファイルの拡張子がPerl本体と関係付けられていて、スクリプトファイルをクリックしたり、コマンドプロンプトからスクリプトファイルを入力するとそれが実行されます。


しかし、Linuxでは同スクリプトファイルをLinuxサーバーへFTPし、テラターム等でログインし、そのスクリプトファイルを入力しても実行ができません。


実は、Linuxで実行するためには、以下の3つのハードルを越えないとならないのです。


◆スクリプトソースにシバンを付加

Linuxでは、シバンと云って、スクリプトソースの一行目の左端から『#!』で、そのあとPerl本体のパスを記述します。

#!/usr/bin/perl

これは、シバンが無い場合に、以下のようにプロンプトから入力したのと同じなのです。

プロンプト$ /usr/bin/perl Perlスクリプトファイル

尚、Perl本体のパスは以下のコマンドで求められます。

プロンプト$ which perl
/usr/bin/perl

◆スクリプトファイルに実行権を付加

Linuxでは、パーミッションと云って、実行権の許可を付加しないと実行ができないのです。

実行権の許可の付加は、以下の感じになります。

プロンプト$ chmod +x Perlスクリプトファイル

◆スクリプトファイル名にパスを付加

Linuxでは、セキュリティの関係で自ディレクトリが実行パス(PATH)に設定されていません。

なので、スクリプトファイル名にパスを付加しないと実行が出来ないのです。


Perlスクリプトファイル名(ddd.pl)だけでパスがない場合

プロンプト$ ddd.pl
bash: ddd.pl: command not found

Perlスクリプトファイル名(ddd.pl)にパス『./』を付加した場合

プロンプト$ ./ddd.pl

これでやっと、LinuxではPerlスクリプトが実行できるのです。

2009-04-28 ActivePerlでCPANからモジュールをゲットする

標準モジュール以外のCPANモジュールが必要なケースはあまりないのですが、それでもたまにありますね。

ActivePerlでは、CPANモジュールを簡単にインストールすることができるppmというコマンドがあります。

インストールとアンインストールは、コマンドプロンプトから以下のように入力します。


◆インストール
C:\>ppm install パッケージ名

◆アンインストール
C:\>ppm remove パッケージ名

上記で大体上手く行きますが、たまにサーバーに繋がらない場合があるようです。

その時は、時間をおいてから行うと上手く行く場合あります。

それでもダメな場合は、以下のサイトが参考になります。


尚、パッケージ名とは、たとえば、『use Win32::API;』の『Win32::API』です。

また、パッケージデリミタの『::』でも大丈夫ですが、ppmコマンドでは、これを『-』にした方がいいようです。

2009-04-26 祝・某教会三鷹教会50周年

えーと、今日は『某教会三鷹教会50周年』記念イベントがありました。

普段、あまり会えなかった人に沢山会うことができました。


みんな3〜5年ぶりで、中には超カワイイお子さんがいる方もいました。

ってことは、私も宿直以外は結構サボっている・・・。


そう言えば、法華経エッセイの某教会ネタでお世話になった前教会長さんにもお会いできて・・・なんと私のブログをたまに見てくれているとのことで・・・凄く嬉しくなりました。


イベントは順調に終わり、三鷹市と武蔵野市の両市長さんの挨拶もあり、地域に根ざしたボランティア活動を評価して頂き、某カルト系教団とは違い、某教会は宗教の仮面を被ったボランティア集団だと認められているんだなと嬉しくなりました。


ということで、宗教と言えば、すべて金儲けのカルトだという風潮がありますが、中には良い宗教もありますので、ひとつよろしくお願いいたしますね。

2009-04-26 Perlでのゼロパディング

たとえば、4桁固定で4桁に満たない場合はゼロを付加する(ゼロパディング)と言う場合が結構あります。

以下はそんな時に使えるサンプルです。

#!/usr/bin/perl
use strict;
use warnings;

my $aaa;

   # sprintfを使う
   $aaa = 1;
   $aaa = sprintf("%04d",$aaa);
   print $aaa, "\n";

   # 正規表現を使う
   $aaa = 1;
   $aaa = "0000" . $aaa;
   $aaa =~ s/^.*(....$)/$1/;
   print $aaa, "\n";

2009-04-26 続・論理和演算子『||』と『or』の違い

以下は、前回書いた『論理和演算子『||』と『or』の違い』です。

||演算子とor演算子は、共に論理和演算子なのですが、演算子の優先順位が違います。

ちなみに、論理和演算子とは、左側を評価して真であれば、右側を評価せずに結果を返します。

以下のように||演算子とor演算子の優先順位の間には『=』や『,』等があるわけです。

  • (高い)
  • ||
  • = += -= *= などの代入演算子
  • , =>
  • or xor
  • (低い)
http://d.hatena.ne.jp/chaichanPaPa/20090130/1233324342

しかし、しばらく経つと、またわからなくなったりするのです。


ちなみに、Perlでの真偽は以下のようになっています。

Perlでは、""と"0"は偽、これ以外のすべての文字列は真である。

数値は文字列に変換されて評価される。したがって、0が偽で、0以外は真である。

http://chaichan.lolipop.jp/perlnote/perlnote2007-06-12.htm

で、以下の場合、$aaaは『123』と表示され、$bbbは何も表示されないのです。

#!/usr/bin/perl
use strict;
use warnings;

my $aaa = '';
my $bbb = '';
my $ccc = '';
my $ddd = '123';

$aaa = $ccc || $ddd;
print '$aaa = ', $aaa, "\n";

$bbb = $ccc or $ddd;
print '$bbb = ', $bbb, "\n";

$aaaは、『$ccc || $ddd;』が優先順位の関係で先に評価され、$cccが空文字列で偽であるため右側の$dddを評価し、内容が'123'なのでこれを$aaaに代入します。

$bbbは、『$bbb = $ccc』が優先順位の関係で先に評価され、$bbbに空文字列が代入され、そしてそれが偽であるため$dddを評価しますが、すでに代入を評価しているので、なにも起こらないのです(たぶん)。

2009-04-25 少し反省、後は雑記・・・

ここのところ、仕事の方が忙しく、遅く帰ってきてもPCを立ち上げて、ママよりネットとか・・・。

子供達も大きくなって自分の事は自分で出来るはずなのにママに頼りきり・・・。

ちょっと、ママに任せきりだったので、少し反省。そして、ネットは置いといてママの話を聞かないと・・・。


草なぎ君、可哀相、トップアイドルでなければ、地方版のニュースにもならないネタなのに・・・。

しかし、某大臣の『最低人間発言』、おまえの方が最低人間だ・・・と言いたい、こんな人間が死刑の決定権があったなんて恐ろしい世の中ですね。


オラクルがサンを買収、pro*c/PL-SQLがJavaを飲み込んだのか・・・これで対MS戦が益々面白くなってきた。

しかし、サンがもつフリーのオープンオフィスやMySQLやJavaは、どうなるのだろうか・・・。

サンがMSに対して、フリーを武器に封じ込めるものだと思って期待していたのに、オラクルはどうでる?


なんか、ネット上の一流プログラマ達が『ごめんなさい、ごめんなさい』って謝っている。

それは、これが元なんだけど、机の上が整理できないのとプログラムのソースが整理できないは同じか?

ちなみに、私の会社の机は綺麗です。でもソースはスクランブルです。あっ洒落にならん・・・。


しかし、この作者のコンテンツを3つ(新人プログラマーが・・・。遅刻しない・・・。英語に圧倒・・・。)読んだのですが、人気があるだけに確かに少し面白です。

だた、3つとも第三者的に書いてあり、自分のことを第三者的に書いた感じで、あまりいい感じがしなかったですね。

でも、すごく頑張っているブログであることは確かで、目標にしたいブログの一つになりました。

2009-04-25 心がパンパン(T_T)

専業主婦のママは、一家を支えてくれるパパと三人の息子達の為、日夜奮闘しています。

以前の事を思えば、みんなのために何か出来る事が、嬉しくて有り難いと思っていたのに

今は、ちょっと苦しくて、誰かママを癒してよ(>_<)って叫びたい、そんな気持ちなんです・・・

誰かというか、一番癒して欲しいと思うのはパパなんです。

そう、癒して欲しいというか、頑張ってることを解かって欲しいのかな・・・

最近パパとゆっくり話す時間が持てなくて、ちょっと淋しいなぁ・・・

パパ、ママの話聞いてよ(;_;)

2009-04-24 標準モジュールコピー for VBA

ブックからブックへのシートコピーは、シートオブジェクトのcopyメソッドで、シート全体(内容データも制御データ)と、そしてシートモジュールまでもが一緒にコピーできます。


では、標準モジュール、クラスモジュール、フォーム、ThisWorkbookは、どうやってコピーするのでしょうか・・・。

これらは、VBProject.VBComponentsオブジェクトのExportメソッドで外に出し、同オブジェクトのImportメソッドで取り込み、コピーをします。

尚、ThisWorkbookに関しては、ソースコードを1行目から最終行まで指定してコピーします。


◆サンプルプログラム
Option Explicit
Sub TestCopyModule()

Dim Book1 As Workbook
Dim Book2 As Workbook

    Set Book1 = ThisWorkbook  '自ブックオブジェクト
    Set Book2 = Workbooks.Add '新規ブックオブジェクト

    If CopyModule(Book1, Book2) = -1 Then
       MsgBox "コピー失敗"
    End If
End Sub

Function CopyModule(ByVal orgBook As Workbook, ByVal cpyBook As Workbook) As Long
'引 数:orgBook コピー元ワークブックオブジェクト
'引 数:cpyBook コピー先ワークブックオブジェクト
'戻り値:成功 コピーしたモジュールの数(ThisWorkbookも含む)
Dim objVBC   As Object
Dim lngCount As Long
Dim strPath  As String
Dim strFile  As String
Dim strCode  As String

On Error GoTo COPY_ERROR

    strPath = orgBook.Path

    For Each objVBC In orgBook.VBProject.VBComponents
        Select Case objVBC.Type
            Case 1 To 3: '1:Module 2:Class 3:Form
                strFile = strPath & "\" & objVBC.Name
                'Export Module
                objVBC.Export Filename:=strFile
                'Import Module
                cpyBook.VBProject.VBComponents.Import Filename:=strFile
                lngCount = lngCount + 1
            Case 100: ' 100:Sheet or ThisWorkbook
                If objVBC.Name = "ThisWorkbook" Then
                    With orgBook.VBProject.VBComponents("ThisWorkbook").CodeModule
                         If .CountOfLines > 0 Then
                            strCode = .Lines(1, .CountOfLines)
                            With cpyBook.VBProject.VBComponents("ThisWorkbook").CodeModule
                                .InsertLines 1, strCode
                            End With
                         End If
                    End With
                    lngCount = lngCount + 1
                End If
        End Select
    Next
    CopyModule = lngCount
    Exit Function

COPY_ERROR:
    MsgBox Err.Description & " " & Err.Number
    CopyModule = -1
End Function

2009-04-23 tarで解凍するときの留意点

tarで固めたアーカイブファイルを解凍する時に、一般ユーザの場合とスーパーユーザの場合では以下のように振る舞いが違います。

尚、オプションでなんとか振る舞いを合わせることが出来るかな・・・と思って頑張りましたが無理でした。

2009-04-22 凄い勢いでPerlスクリプトを組んでいるよ!

Perlで数行のデータ加工スクリプトを、何本も凄い勢いで組んでいる。まぁその場凌ぎの捨てスクリプトですが・・・。

とにかく、PerlってC言語のようにメモリを壊して訳のわからない状態がなく、ピッタとした感じで、しかも簡単に思い通りに実現できる。そして楽しいし、時間が経つのが速い。

しかし、さすがに疲れた、肩が凝った。早く寝ないとダウンしそうだ・・・

2009-04-21 ブログ更新ペースを落とします。

えーと、5月の連休を挟んで3つのシステムのリリースあり、ぶっちゃけブログを書く余裕がありません。

ネタは、沢山あるのですが・・・腐らないうちになんとかしたいのですが・・・残念ですが・・・スローペースの更新になります。

2009-04-21 ブログ復活!

9ヶ月ぶりにブログを開いてみました。過去のブログを読んでみて、辛い日々を送っていたんだと思いました。

今も相変わらず体調は悪いものの、気持ちが前向きになれる日々があることに感謝しています。

時々ダウンしてしまう事もあるけれど、立ち直りが早くなったかな・・・成長したのかな(^_^;)

また少しずつ[ママのつぶやき]続けていきたいと思います(^^ゞ

2009-04-19 VBAの確認ダイアログを出さないようにするには

CGIからExcelを制御するとExcelのプロセスがロックすることがよくあります。

原因はいろいろ沢山あるのですが、その一つに確認ダイアログを出そうとしてロックしている場合があります。

その時は、以下で書いたように『DisplayAlertsプロパティ』を『false』すると大丈夫なのですが・・・、なぜかダメな場合もあるのです。

その時は、以下で書いたように、再計算をしない設定にすると回避ができました。

2009-04-19 2種類のボタン for VBA

ExcelVBAでは、マクロ(VBA)をいろいろな部品(オブジェクト)に関係付けることができます。

たとえば、クリックとかいろいろなイベントで簡単にそのマクロを起動することができるのです。


もちろん、ボタンにもマクロを関連付けることができますが・・・実はボタンそのものに2種類があるのです。

一つは、フォームツールバーでのボタンで、もう一つは、コントロールツールボックスのボタンです。


フォームツールバーのボタンは、ボタンの色が変更できませんが、扱いが簡単です。

コントロールツールボックスのボタンは、ボタンの色も変更できますが、扱いが少し難しいです。


マクロを単に起動するレベルでは、フォームツールバーでのボタンで十分です。

細かな制御が必要な場合は、コントロールツールボックスのボタンですかね。


ちなみに、両方ともメニュー『表示』のツールバーにあります。

尚、フォームツールバーのボタンは、ボタンの色は変更できませんが、フォントの色は変更できます。

2009-04-19 ブックオブジェクトを取得するには for VBA

自ブックオブジェクトを取得するには、『Set Book1 = ThisWorkbook』です。

新規ブックオブジェクトを取得するには、『Set Book2 = Workbooks.Add』です。

Sub MacroZ()
Dim Book1 As Workbook
Dim Book2 As Workbook

    Set Book1 = ThisWorkbook  '自ブックオブジェクト
    Set Book2 = Workbooks.Add '新規ブックオブジェクト
End Sub

すみません、単なるメモです。

2009-04-19 配列を動的に確保する for VBA

ExcelVBAで配列を動的に確保するには以下の感じです。

Sub MacroY()
Dim strA() As String
Dim int_i As Integer

    For int_i = 0 To 10 Step 1
        ReDim Preserve strA(int_i)
        strA(int_i) = "AAA" & int_i
    Next
    For int_i = 0 To UBound(strA) Step 1
        Debug.Print strA(int_i)
    Next
End Sub

まず、『Dim strA() As String』で配列として宣言して、『ReDim Preserve strA(int_i)』で配列を拡張してから、『strA(int_i) = "AAA" & int_i』で配列にデータを格納します。

尚、ReDimでPreserveを指定しないと拡張されるたびに、配列の中身がクリアされてしまいます。


また、配列の最大インデクスは『UBound(strA)』で求めることができます。

ちなみに、Debug.Printのプリント結果は、イミディエイトウインドウに表示されます。

2009-04-19 アクティブシートにするには for VBA

ExcelVBAでシートをアクティブにするには以下の感じです。

Sub getActivateSheet(sheetName As String)
   Dim sheet As Worksheet

   Set sheet = Worksheets(sheetName)
   sheet.Activate
End Sub

Sub MacroX()
   getActivateSheet ("シート名")
End Sub

『Worksheets(sheetName)』でシートオブジェクトを取得し、『sheet.Activate』でシートオブジェクトのActivateメソッドを起動する。

2009-04-18 int関数の意外な使い道

Perlの組み込み関数に、数値を整数化するint関数があります。

通常は、小数点以下切り捨ての場合に使用しますが、実はコレ、文字列にも有効なのです。


たとえば、文字列『"0010ABC222"』に対してint関数を行うと『10』が返ります。

また、文字列『"01"』や『"002"』なども、各々『1』『2』が返ります。

つまり、ゼロサプレスがされるわけです。

#!/usr/bin/perl
use strict;
#use warnings;

my $strWk = "0010ABC222";
print int($strWk) , "\n";

$strWk = "002";
print int($strWk) , "\n";

この特性を利用すると、ゼロサプレスしないとダメ系な、例えばcronとかの値を設定するときに有効なのです。

もうちょっと具体的に言うと、cronは日時を設定しますが、例えば『分』をブラウザから入力した場合、普通2桁(00〜59)になっています。こういう場合にint関数を使うとゼロサプレスされ有効なのです。


ちなみに、ゼロサプレスとは、先頭の「0」を削除することで、逆に付加することをゼロパディングと言います。

2009-04-17 ディレクトリ配下すべて削除するコマンド for Linux

VB-TIPSでLinuxコマンドのことを書くのもアレなのですが、とりあえず、メモしときます。


ディレクトリ削除コマンドの『rmdir』は、ファイルが存在しているディレクトリ配下、すべてを削除することが出来ません。

そのような、ファイルが存在しているディレクトリ配下をすべて削除するには、以下のように『rm』を使います。

rm -rf ディレクトリ名

ちなみに、オプションのrはrecursiveで再帰的、fはforceで強制的です。

尚、上記は、Cygwinでも同じなので、Linux全般に通用するかと思います。

2009-04-16 雑記(Perl、VBA、VBScript、JavaScript、C言語)

perlxs、perlxstut、perlcall、perlembed等のオンラインマニュアルをネットで読み漁って、なんとなく、PerlからC、CからPerlが分かってきました。

しかし、この辺は、簡単ではないですね。

そのうち、咀嚼してコンテンツにしたいと思います。


VBA、VBScript、JavaScriptも各々、統一的(本質が理解できる)な解説のページを作って、ネットに公開したいなぁと思っていますが・・・なかなか。


Perlをメインにやっていて、アレなんですが、VBScriptの優位性についても語りたいと思っています。


C言語のコンテンツも、家と会社でCコンパイラ環境が、偶然に両方が手に入ったので、C言語をリベンジしたいと思っています。


ということで、今日は、例の宿直の代打を頼まれたので、これから教会に行って参ります。取り急ぎ・・・。

2009-04-15 コンピュータ名の変更には気をつけろ!

配置転換や部署移動などでネットワークアドレスが変わったりする季節になりました。

すると、コンピュータ名も変更しないとならないケースに遭遇したりします。


大体、会社では共通のドメインに入っているPC(WINDOWS)で作業をしているので、ドメインの管理はWINDOWS系のドメインコントローラ(Active Directory)がしています。


で、コンピュータ名を変える時は、以下の手順で行います。

  1. いつものようにドメインユーザでPCにログインします。
  2. ドメインをWORKGROUPに変更します。(システムのプロパティで変更:WINキー+Pauseキー)。
  3. PCを再立ち上げて、今度はドメインユーザでなく、ローカルユーザでログインします。
  4. 古いコンピュータ名のドメインコントローラ登録情報を削除します。(会社によりいろいろ)。
  5. 新しいコンピュータ名のドメインコントローラ登録情報を追加します。(会社によりいろいろ)。
  6. コンピュータ名を新しいコンピュータ名に変更します。(システムのプロパティで変更:WINキー+Pauseキー)。
  7. PCを再立ち上げて、また、ローカルユーザでログインします。
  8. ドメインをWORKGROUPから該当ドメインに変更します。(システムのプロパティで変更:WINキー+Pauseキー)。
  9. PCを再立ち上げて、今度はローカルユーザでなく、ドメインユーザでログインします。

で、気をつけなければならないのは、3と7と9の「PCを再立ち上げ」を必ず行うことです。


たとえば、複数のPCのコンピュータ名を変更する場合、一台のPCでドメインコントローラ登録情報をPC分全部修正したとします。

2台目以降は、WORKGROUPにしなくともコンピュータ名だけ変えればいいような気がしますが・・・とんでもないNGです。


一台一台、上記の手順を行います。

ちゃんと、ドメインをWORKGROUPに変更したり、その都度PCを再立ち上げしたりして・・・そうしないとActive Directoryからアクセス拒否を喰らうのでした・・・(持戒)。


追記:

万が一、アクセス拒否を喰らったら、上記手順を2番から、すでにWORKGROUPなら、3番から行えば、たぶん大丈夫。

それでもNGだったら、ドメイン管理者へ連絡するしかないですね。

2009-04-15 フォルダ配下の一覧を取得する関数

Perlでフォルダ内の一覧は、組み込み関数のglobとかreaddirなどで取得することができますが、フォルダ配下を再帰的に一切合切取得することは出来ません。


なので、 標準モジュールFile::Findを利用して、フォルダ配下を再帰的に一切合切取得する『get_DirFiles』という関数を作ってみました。

引数は2つで、第一引数はフォルダパス、第二引数はモードで以下の通りです。


◆サンプルソース
use strict;
use warnings;

my @file = get_DirFiles('/ddd', 1);

for my $wk (@file) {
    print $wk, "\n";
}

sub get_DirFiles {
use File::Find;
    my $wkpath = $_[0];  # Search path
    my $wkopt  = $_[1];  # 0:All, 1:File, 2:Dir

    $wkopt = 0 if (!defined($wkopt));
    $wkopt = 0 if ($wkopt > 2);
    
    my (@files, @ansfiles);
    my @dir_search_path = ($wkpath);

    find(sub {push @files, $File::Find::name;}, @dir_search_path);

    if ($wkopt == 0) {
        @ansfiles = @files;
    }
    else {
        if ($wkopt == 2) {
            for my $wkfile (@files) {
                if (-d $wkfile) {
                    push @ansfiles, $wkfile;
                }
            }
        }
        else {
            for my $wkfile (@files) {
                if (-f $wkfile) {
                    push @ansfiles, $wkfile;
                }
            }
        }
    }
    return @ansfiles;
}
◆補足

findの第1引数は、関数リファレンスを指定します。

フォルダ内にファイルやフォルダが見つかるたびに関数リファレンスの関数が実行されます。

サンプルでは、見つけたファイルやフォルダをpushで@filesに押し込んでいます。

尚、第2引数は、検索したいパスをリストで複数の指定ができますが、サンプルでは単一の仕様にしています。

2009-04-14 バグはいつも素敵に意外に隠れている

えーと、Windows上のArchive::Tarモジュールで任意のフォルダ配下を固めてxx.tar.gzとし、それをNet::FTPモジュールでlinuxサーバーへ送り、サーバーのコマンド(tar -xzvf)で復元するとエラーになるのです。


原因は、複数のファイルやフォルダを一緒に固めるので、パス指定が怪しいと思って調べていました。

Archive::Zipは、addTreeというフォルダ配下は固める便利なメソッドがあるのですが、Archive::Tarは、なぜかないので、自力でFile::Findモジュールを使ってフォルダ配下のリストを求めてから、add_filesメソッドで固めます。

なので、この辺が怪しいとデバッグをしていたのですが、バグは意外にもFTPのモード指定でした。


FTPには、ご存知のようにアスキーモードとバイナリモードがあります。

通常のFTPコマンドでのバイナリモードでは、普通『bin』と指定します。

しかし、Net::FTPモジュールでは、フルスペルの『binary』と指定しないとNGなのです。

つまり、結果的にアスキーモードでFTPしていたのです。


tar.gzで固めたファイルは、もちろんバイナリファイルなので、アスキーモードでFTPしてデータが欠け、復元するとエラーになっていたのです。

バグはいつも素敵に意外に隠れていますね。


そうそう、なぜバグを見つけることが出来たかというと、Archive::Tarモジュールで任意のフォルダ配下を固めるロジックを外出しにして、テストした結果のxx.tar.gzを、Net::FTPモジュールでなく、手動のFFFTPでサーバーにアップして、気が付きました。

2009-04-13 「魔法がかけられたリファレンス」を作るblessとは

モダンPerl入門 (CodeZine BOOKS)

えーと最近、XS言語やC言語からのPerlコールなどに手を出しています。

ラクダ本やWEBでXS言語リファレンスを読んでいるのですが、イマイチしっくりこなくて、本屋に行って『モダンPerl入門』と云う本を買いました。

ちなみに、本の置いてあるスペースが6:4:2の割合でPython:Ruby:Perlになっていました。

今やPythonの天下ですね。Perlはオライリーの本と新刊Perl本が少しだけ置いてありました。結構大きな本屋です。

で、『モダンPerl入門』は、のっけからblessなのです(初心者無視か)。

blessの解説が素敵過ぎるので引用しちゃいます。

Perlにおけるオブジェクトとは、基本的に「魔法がかけられたリファレンス」のことを指します。この場合の魔法とは、特定のリファレンスがある名前空間に属してる、という状態を作り上げることと同等です。

説明しずらいblessですが、的を射てますね。


ちなみに、私が書いた『Perlでのオブジェクトとは? blessとは?』です。

まだ、ぱらぱらとしか見ていませんが、MooseとかCatalystなどの重厚モジュールの説明とか、コツコツ老プログラマ(謎)には無縁だな・・・などと思いながら眺めています。


◆追記(2009/04/14)

今日、8章の『知っておきたい C API と XSの書き方』をざーっと読みましたが、理解ができませんでした。

私に理解力がないのか、本の説明が良くないのか、本質が難解なのか・・・。

しかし、著者はPerlとCを結合させることを『相当楽であることを感じていただけたのではないでしょうか』と述べています。著者って何者?

2009-04-12 小池啓仁、Sunny4Rest ツーマンライブ!!

小池啓仁のライブのお知らせです!

みなさん、ご都合がよろしければ、よろしくお願いします。

ちなみに、ちゃいちゃんパパ一族も総動員が掛かりました(謎梨)。

この日は、小池啓仁(長男)の2作目CDも発売されるとのことです!


2009-04-12 PerlでWindowsAPIをコールする(DynaLoader編)

昨日、『Perl で Win32::API プログラミング入門』リンクメモでのお約束(暇な時にソース解析)の前半部だけをソース解析してみました。

今日は後半部のソース解析をしてみます。

しかし、実力不足で10%ぐらいしか分からなかったです。

#!/usr/bin/perl
use DynaLoader;
sub GetProcAddress {
 my ($DLL, $API) = @_;
 my $path = "$ENV{SystemRoot}\\system32\\$DLL";
 my $libref = DynaLoader::dl_load_file($path);
 pack "L", DynaLoader::dl_find_symbol($libref, $API);
}
my $x86 = ""
. "h\0\0\0\0"
. "h" . pack("P", "Message")
. "h" . pack("P", "Hello, World!\n")
. "h\0\0\0\0"
. "\xb8" . GetProcAddress("user32.dll", "MessageBoxA")
. "\xff\xd0" # call eax
. "\xc3"     # ret
;
DynaLoader::dl_install_xsub("X",unpack"L",pack"P",$x86);&X;
http://d.hatena.ne.jp/TAKESAKO/20090324/1237879559

なので、以下のソース解析のコメントには大部憶測で書いています。

しかし、以下の記述には悩まされました。

dl_install_xsub("X",unpack"L",pack"P",$x86);

普通、dl_install_xsubの引数は2つまたは3つなのですが、上記は4つあります。

しかし、実はよく見ると2つなのです。

第一引数は、"X"で外部サブルーチン名になります。

第二引数は、『unpack"L",pack"P",$x86』なのです。

そう、『"P",$x86』はpackの引数で、『"L",pack"P",$x86』はunpackの引数なのです。

ちなみに、処理は、文字列($x86)のポインタ指定でバイナリ構造体にして、これを符号なしlong値にしています。


えーと、分かったような説明をしていますが、私自身10%も分かっていませんのでご了承ください。

2009-04-11 PerlでWindowsAPIをコールする

前回、『Perl で Win32::API プログラミング入門』リンクメモでのお約束(暇な時にソース解析)、とりあえず前半部だけソース解析をしてみました。

#!/usr/bin/perl
use Win32::API;
my $MessageBox = Win32::API->new("user32", "MessageBoxA", "NPPN", "N");
   $MessageBox->Call(0, "Hello, World!\n", "Message", 0);
http://d.hatena.ne.jp/TAKESAKO/20090324/1237879559

コンストラクタ(new)の引数は以下のようです。

Callメソッドの引数は以下のようです。

ちなみに、Callメソッドは、WindowsAPI(今回はMessageBoxA)に対応してるようです。

つまり、CallメソッドをコールすることでWindowsAPIが実行されます。

2009-04-10 Excel2007とExcel2003の違い

最近、Excel2007を使い始めました。

Excel2003とUI(ユーザーインターフェイス)が全然違うし、2003のVBAが全然動かないし*1、動いてもメチャクチャ遅い。特にシートコピーは10倍以上遅い。


また、IIS経由でCGIからExcel2007にアクセスすると原因不明のロック状態になるし(Excel2003では問題ない設定)。

あと、Excelだけ2007にしようと思ってインストールしたら、ワードやパワーポイントまでも2007になってしまった。

Access までインストールされたのでちょっとラッキーかな・・・とか思ったけど。


Excel2003ユーザにとって、Excel2007は遅いし、使いにくいし、メリットがあるのだろうか・・・。

vistaとXPの関係と同じ運命になってくれないかな・・・なんて思っています。


追記:

上記の内容だけじゃ、検索して来てくれた人に申し訳ないので、「Excel2007とExcel2003の違い」の情報を付加しときます。


(3)行と列の数が大幅にアップ

ワークシートの行数と列数が大幅に増え、扱えるデータ量が大幅に増えました。

Excel2003 では、65,536 行×256 列のデータを扱うことができました。

Excel2007 では、1,048,576 行×16,384 列を扱えるようになりました。

顧客データや商品データなど、大量のデータを扱うことができます。

http://www.skillupseminar.com/topics/topics023_8.pdf

ということは、行計算にインテジャーの変数を使用しているとオーバーフローしますね。

上記の引用したPDFのページ、よく纏まっていますね。P18でサマリーだけど。

*1:全然は言い過ぎかも、ファイルの保存系がとにかくNGです。あとは、遅いけど大体動きます。

2009-04-09 PerlでFTP(ファイル転送)するには

PerlでFTPするには、いろいろあると思いますが、標準モジュールNet::FTPを使用するのが簡単です。


◆標準モジュールNet::FTP使用のサンプル
use strict;
use warnings;
use Net::FTP;

    open(STDERR, '>>err.log');
    my $ftp=Net::FTP->new('host.hatena.ne.jp', Passive => 1) or warn("Connected Error!\n");
    #my $ftp=Net::FTP->new('host.hatena.ne.jp') or warn("Connected Error!\n");
    $ftp->login('ID','Password') or warn("Login Error!\n");
    $ftp->cwd('/');
    $ftp->put('xx.htm') or warn("Ftp-put Error!\n");
    $ftp->quit();
    close(STDERR);
◆ソース解説

ちなみに、パッシブモードとは、サーバーから通知されたポートに対してクライアントからコネクトする。

通常のアクティブモードでは、サーバーからクライアントにコネクトするので、ファイアーウォールやNAT(IPマスカレード)が中間にあるとブロックされたり、ポート番号が変更されたり、上手くコネクトができない。


◆追記(2008/04/15)

FTPには、制御用とデータ転送用の2つの通信経路がはられ、制御用経路でのやりとりで、アクティブ or パッシブモードを判断する。

その後は、データ転送用経路でのやりとりで、上記の説明通り。


◆追記(2008/04/14)

FTP転送モードはデフォルトではアスキーモードです。

バイナリモードにするには、『$ftp->login・・・』の行の下に以下を追加します。

$ftp->binary;

ちなみに、省略形『$ftp->bin』ではNGです。


◆追記(2008/04/17)

FTP転送後、ファイルの属性を変更したい場合があります。たちえば、実行権を付けたいとか。

ファイルの属性を変更するには、『$ftp->put・・・』の行の下に、以下のようなsiteメソッドを追加します。

$ftp->site('chmod 666 xx.htm');

ちなみに、上記は、ファイルxx.htmに対して、オーナー、グループ、アザーの3者へリード権・ライト権を付与しています。

2009-04-08 シート全体を保護し、任意のセルだけ保護解除する for VBA

Excelのシートで入力項目のセル以外は、ユーザに変更されたくない・・・というケースは結構ありますね。

Excelには、「シートの保護」という機能があります。


普通の発想としては、ユーザに変更されたくないセルをロックするということになりますが・・・。

Excelでは、逆発想で、まずシート全体をロックし、ユーザに変更してもらいたいところだけロックを外すのです。


もう少し詳しく言うと、すべてのセルにはロックするかしないかのプロパティ『Locked』があり、Protectメソッドが実行されると、『Locked』の値がTrueのセルはロックされ、Falseだとロックされないのです。


◆サンプルソース
Private Sub Worksheet_Activate()
    If ActiveSheet.ProtectContents = False Then
        Cells.Locked = True
        ActiveSheet.Range("A1:B10").Locked = False
        ActiveSheet.Protect Password:="0708", UserInterfaceOnly:=True
    End If
End Sub

◆ソース解説

◆留意点

2009-04-07 ドラッグ&ドロップで引数を受け取る for VBScript

VBScript(例えばdandd.vbs)を引数付きで実行する時は、普通、コマンドプロンプトから以下のようにします。

C:\>dandd.vbs aaa.txt bbb.txt ccc.txt

しかし実は、CUIでなくGUIでaaa.txt bbb.txt ccc.txtをドラッグし、dandd.vbsへドロップしても同じ効果になるのです。

そう、ドラッグ&ドロップが出来るのです。って知っている人には常識なのかもしれませんが・・・。


とりあえず、引数をMsgBox表示するdandd.vbsのソースです。

Option Explicit
Dim args, arg

Set args = WScript.Arguments
For Each arg In args
    Call MsgBox(arg,,"引数に入力した文字列")
Next

とりあえず、ソース説明すると・・・

2009-04-06 丸9年

今日は4月6日、丸9年が経ちました。そう9回目の命日です。

ちゃいちゃんは、実は先日結婚発表があった絢香と同い年なのです。

去年が成人式で、今年はもう結婚する年になったのですね・・・。


夕方にまんなとモリンボが来てくれたとのことです。

あっちゃん母子も私が会社から帰ってから、しばらくして来てくれました。

毎年、忘れないでいて、ありがとうございます。

さすがに、もう9年が経つので今年は、もう誰も来ないのかな・・・と思っていましたが、本当にありごとうございます!


最近は、100年に一度の不況を生き抜くのに精一杯で、普段は、ちゃいちゃんのことをすっかり忘れています・・・。

でも、この不況下で親子5人がちゃんと生活をしていけるのは、ちゃいちゃんがお空で応援してくれているのかな・・・なんて思っています。


やっくん(次男)は、大学生になりました。

まちゃ(三男)は、中学3年になりました。

ヒロちゃん(長男)は、・・・とりあえず、生きては、いるようだ・・・。

ママは、体調に波があるけど、昔に比べれば大分いい。

私は、相変わらずのへぼプログラマですが、この年で現役プログラマってすごくない・・・とか(自慢かよ)。


これからも、みんなのことを見守ってくださいね。ちゃいちゃん!

2009-04-05 フォルダ内の子フォルダ削除(rmtree)の留意点

Perlでフォルダ内のファイルもフォルダもファイルが格納されているフォルダも問答無用で削除するにはFile::Pathモジュールのrmtreeを使います。

組み込み関数のrmdirもありますが、こちらは、削除しようとしているフォルダ内にファイルやフォルダがある場合は削除ができません。


以下のサンプルは、rmtreeでフォルダのみを削除するサンプルです。

◆rmtreeのサンプルソース
use strict;
use warnings;
use File::Path;

#chdir('./xxx'); # カレントフォルダを合わせる
opendir(DIR, './') or die "opendir失敗 $!";
my @list = grep(-d, readdir(DIR));
for my $wkdir (@list) {
    if (($wkdir ne '.') and ($wkdir ne '..')) {
        #print $wkdir, "\n";
        if (rmtree($wkdir)) {
            print "$wkdir Delete.\n";
        }
        else {
            print "$wkdir rmtree Error: $!\n";
        }
    }
}

留意点として3つ


尚、本スクリプトの実行には、ご自分の責任で細心の注意を払って行ってください。

間違ってフォルダを削除しても、当方では一切の責任は取りかねますのでご了承下さい。

2009-04-04 MsgBoxで改行するには

VB系のMsgBoxのメッセージを改行するにはvbCrを使います。


◆VBScriptでのサンプルソース
Option Explicit
Dim Ans

Ans = MsgBox("あなたは" & vbCr & "犯人ですか?", vbYesNo, "質問") '関数的呼び出し
If Ans = vbYes Then
   MsgBox "あなたは" & vbCr & "犯人です。",,"答え1" 'Callステートメントを省略した呼び出し
Else
   Call MsgBox("あなたは" & vbCr & "犯人でないです。",,"答え2") 'Callステートメントで呼び出し
End If

◆サンプルソース解説

◆「vbCr」のような文字列の定数
定数 内容
vbCr Chr(13) キャリッジ リターン文字。
VbCrLf Chr(13)、Chr(10) キャリッジ リターンとライン フィードの組み合わせ。
vbFormFeed Chr(12) フォーム フィード文字。Microsoft Windows では使用できません。
vbLf Chr(10) ライン フィード文字。
vbNewLine Chr(13)、Chr(10) または Chr(10) プラットフォームで指定した改行文字。現在のプラットフォームに適切ないずれかを使用します。
vbNullChar Chr(0) 値 0 を持つ文字列。
vbNullString 値 0 を持つ文字列 長さ 0 の文字列 ("") とは異なります。外部プロシージャを呼び出す場合に使用します。
vbTab Chr(9) タブ文字 (横)。
vbVerticalTab Chr(11) タブ文字 (縦)。Microsoft Windows では使用できません。
http://msdn.microsoft.com/ja-jp/library/cc392241.aspx

◆MsgBoxの第2引数で指定できる定数
定数 内容
vbOKOnly 0 [OK] ボタンのみを表示します。
vbOKCancel 1 [OK] ボタンと [キャンセル] ボタンを表示します。
vbAbortRetryIgnore 2 [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
vbYesNoCancel 3 [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
vbYesNo 4 [はい] ボタンと [いいえ] ボタンを表示します。
vbRetryCancel 5 [再試行] ボタンと [キャンセル] ボタンを表示します。
vbCritical 16 警告メッセージ アイコンを表示します。
vbQuestion 32 問い合わせメッセージ アイコンを表示します。
vbExclamation 48 注意メッセージ アイコンを表示します。
vbInformation 64 情報メッセージ アイコンを表示します。
vbDefaultButton1 0 第 1 ボタンを標準ボタンにします。
vbDefaultButton2 256 第 2 ボタンを標準ボタンにします。
vbDefaultButton3 512 第 3 ボタンを標準ボタンにします。
vbDefaultButton4 768 第 4 ボタンを標準ボタンにします。
vbApplicationModal 0 アプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
vbSystemModal 4096 システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
http://msdn.microsoft.com/ja-jp/library/cc410277.aspx

◆MsgBoxの戻り値
定数 選択されたボタン
vbOK 1 [OK]
vbCancel 2 [キャンセル]
vbAbort 3 [中止]
vbRetry 4 [再試行]
vbIgnore 5 [無視]
vbYes 6 [はい]
vbNo 7 [いいえ]
http://msdn.microsoft.com/ja-jp/library/cc410277.aspx

2009-04-03 雑記

とりあえず、調子悪いです。

土日に吐き気・下痢の風邪でダウンして、病み上がりのまま月火と、そして水は宿直をこなし、明日からの土日でやっと休めそうな今日この頃です。


とりあえず、この頃は、会社ではLinux、家ではCygwinで、Unix系を使う機会が増えています。

デフォルトでC言語が使える環境が増えて、C言語をリベンジしたいと思っている今日この頃です。


とりあえず、PerlとVBAを交互にコーディングすることが多く、Perlで if ($xxx = $yyy)のようにVBAのようにして、イコールが一つ足りなく、はまったりしている今日この頃です。


とりあえず、VBAでなくVBSもやっています。

VBSもいろいろやっていると、はじめのうちは、Perlと違ってつかえない言語だな・・・などといいながら、おもしろくなってきている。VBSを統一的に解説しているウェブページがないので、自分で作りたくなってきた今日この頃です。


すみません、調子が悪いので、ネタは沢山あるのですが、練る気力がありません。

しかし、何か書かないと眠れませんので、この雑記を書きました。これもある意味、病気かも・・・

・・・とりあえず、もう寝ます、お休みなさい!

2009-04-02 出会いが人生を変える

開祖さまに倣いて

昨日は、某教会にて月一度の「宿直の日」で、尚且つ、丁度4月1日ということで、そこで「夜間の集い」もありました。

「夜間の集い」では、佼成ニュースとスマイル(会員ドキュメント)を見ました。

両方とも今月号(佼成&躍進)の法話「出会いを楽しむ」がらみでした。

今月の法話「出会いを楽しむ」は、結構良い事が書いてありました。


たとえば、仕事で厳しいことを言ってくる人を「この人さえいなければ」と否定的に見るか、「苦言は、足りない私を向上させるため」と肯定的みるか、また「器を大きくさせていただける、ありがたいご縁」と感謝の心で見るかによって、出会いは大きく変化します。


つまり、「仕事で厳しいことを言ってくる人」という一つの現象に対して、以下の三つの見方があったわけです。

  1. 否定的「この人さえいなければ」
  2. 肯定的「苦言は、足りない私を向上させるため」
  3. 感謝的「器を大きくさせていただける、ありがたいご縁」

そして、否定的より肯定的、肯定的より感謝的に見ることにより、仕事スキルが上がり、精神的にも成長ができ、自分が変わり、自分が変われば世界が変わるのです。


また、「あいさつ」は人間関係を円滑にする基本の一つです。

私たちは、いま目の前の人やものごとを大事にして生きることが大切です。

いまを大切に生きることで、未来が拓くのですから、どんな人にも変わることなく、あいさつをする。

相手を否定的に見ないで、こちらが一つのことを貫いていけば、人間関係は必ず変化していくのです。


どんな出会いも感謝的に受け取り、どんな人にもあいさつを貫いていけば、出会いが人生を変えるのです。たぶん。