masatoの日記

やっていきます

オブジェクトをつくるのはblessだけじゃない。Class::Accessor::Fastをつかってみた

Perlオブジェクト指向プログラミングをするとき、よくblessを使っていました。で、blessを使ってオブジェクトをつくる場合、コンストラクタやアクセサを自分で書かないといけません。そういうもんだと思ってたところ、これらを自動で処理してくれる便利なモジュールが「モダンPerl入門」に紹介されてました。 自分で試してみたことを以下にメモしてみます。

商品番号、品名、価格からなる行から商品番号を取り出すという単機能モジュールを例にしてやってみました。

blessの場合

パッケージはこんなふう。
まずコンストラクタ。

package Extractor;

sub new {
    my $class = shift;
    my $src = shift;
    my self = bless {
        src => $src,
    }, $class;
    return $self;
}

アクセサは、オブジェクトがもってるプロパティへのインターフェイス
プロパティは、読み書きの両方ができるようにしたいです。 なので、引数の有無によって返り値が変わるようにしてます。 この分岐処理は、上記書籍からコピペさせてもらってます。

sub src {
    my $self = shift;
    my $src = shift;
    my $ret = $self->{$src}; # 引数がなければインスタンス生成のときに入れた値を返す
    if (@_) {
        self->{$src} = @_;
    }
    return $ret;
}

商品番号を返すメソッド。

sub id {
    my $self = shift;
    $self->{src} =~ /^\d+/;
    my $id = $&;
    return $id;
}

実行スクリプト

上記のモジュールを実行してみます。
アイスクリームの商品番号123、カレーライスの商品番号234がそれぞれ取り出せます。

use Extractor;

my $src = '123 ice cream 100 yen';

my $extractor = Extractor->new({ src => $src});
my $product_number = $extractor->id(); 
print $product_number,"\n"; # 123

# srcプロパティを上書きして、商品番号を取り出す
$extractor->{src} = '234 curry rice 800 yen';
$product_number = $extractor->id();
print $product_number,"\n"; # 234

blessのまとめ

コンストラクタ、アクセサを自分で書かないといけない。 プロパティがふえたら、その分アクセサを書く。数が多いと大変。

Class::Accessor::Fastの場合

こちらが本題です。 どうなふうに簡単になるのか。 とても短くなったので、先に上記パッケージ相当のコードをぜんぶ載せます。

package Extractor;
use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors( qw/src/ );

sub id {
    my $self = shift;
    $self->{src} =~ /^\d+/; # 123 ice cream 100 yen -> 123
    my $id = $&;
    return $id;
}

1;

こんだけ。

コンストラクタはモジュールが勝手につくってくれるので、書きません。 アクセサはmk_accessorsというものにプロパティ名を入れるだけです。

__PACKAGE__->mk_accessors( qw/src/ );

これでsrcプロパティの読み書きをやってくれます。 よって、自分で書く必要なし。

実行スクリプトはさっきと同じで同様の値が返ってきます。

まとめ

Class::Accessor::Fastを使うと、オブジェクトを作るときにコンストラクタやアクセサを自分で実装しなくてよいので、機能の実装に集中できそう。
使い方もむずかしくないので、手軽に利用できる。 また、このモジュールは動作が軽いらしいというのもいいと思いました。

モダンPerl入門

ローソンでヤッホーブルーイングのビールが買える

ここ最近、国産のクラフトビールが近所のスーパーでも買えるようになってきています。私は、長野県軽井沢のヤッホーブルーイングがだしているビールが好きでよく飲みます。 あるとき、東京のコンビニでいろんなヤッホーブルーイングが売っているのを見て、東京うらやま~、と思ってたところ、名古屋でもローソンで買えるようです。

やった!
f:id:masatoz:20170716233826j:image

全部ほしい。わたしは知らずに貪欲になっていたようだ。

ここ最近、隔月くらいの間隔でこの先3年間の自分の職業人生について考える、ということをやっております。きょうは、現状把握ということで、いまの自分をできるだけ客観的に振り返ってみる、ということに取り組みました。

職業人生は、あるいはキャリアプランともいいます。現在働いてまして、3年後となると、現職をつづけるとか、あるいは転職するとかいう可能性があります。私は、転職したいなあとずっと思っておりまして、それはどうしてかというと、ひと言でいって、会社が求めていることと自分がしたいこと、またはこう自分は貢献していきたいんだよなあと思っていることとが決定的にズレているということですね。そのことを最近はっきりと自覚するようになりました。これは私が一方的にそう思っているだけで、会社がこれと違うことを期待するというのはごくありふれた状況なのかもしれません。とはいえ、不本意なことをこの先ずっとやっていくのは、とっても不健康だとも思うのです。それがこの先の3年間だけであったとしても。

じゃあ、転職したら何が待ってるのか。隣の芝生はいつも青いわけです。 だから、自分が何を期待しているのか、そして実際に何が期待できそうなのか、ということを考えました。結果、私はあれもこれも欲していたようです。

こんなことを書きました。

1.楽しみながらはたらきたい
2.仕事から学びを得たい
3.おもしろい人からよい刺激をもらいたい
4.いいお給料を稼ぎたい

思いつく限りの仕事から得られそうなメリットをあげた感じで、欲張りですね。 これを人前で発表したところ、ある方から「どれを大切にしているのかがみえてこない」という意見をもらいました。 なるほど、確かに。 それがきっかけで、自分のその部分が客観的にみれて、あれもこれも全部ほしがっていた、ということに気がつけました。たしかに、全部取りしたいことはしたい。ただ、そのうちのどれが自分にとってたいせつなのか。それを見極めることは大切だと思いました。

「仲良し」になる努力はいらない

会社のコミュニケーションは表面的だという見方がある。 自分もそういうものだと長いあいだ思ってきてたのだけど、そうでもない気がしてきた。 仕事をしていると、本音と建て前を分けざるを得ない場合が普段よりも多くあるので、そこは上辺だけの対応になることはある。 だけど、そうだからといって、会社でのひととのやり取りが全体的にうすっぺらくなるというわけではない。

会社でのコミュニケーションの特徴として当然といえば当然なのだが、主な内容が仕事の話ということがある。仕事の内容の多くは、基本的に個人的な関心などから一定の距離がある。だから、そこに個人の私的な内容がはさまれることはない(だいたいそう思う)。そこには「深い」コミュニケーションに特徴的な「心の交流」がうまれるきっかけが欠けている。なぜならそのためには私的な情報のやり取りが欠かせないからだ、という感覚があった。

プライベートな場面では、ビジネスと比べて個人的な事柄を話すことがずっと多くなる。たとえば自分の趣味、生い立ち、家族、友達のことなど。でもしかし、これまでの経験からいえるのは、個人的な話をしたからといって、相手と親密になれるわけではないということだ。それでもなお、人と仲良くなるにはそういうプライベートな情報を交換しなければいけないという感覚は根強くあった。

順番が逆になっている。はじめに、こころを許せるようになってから、距離感の近いはなしができるようになる。よって、自分のことをたくさん話して、自己開示しまくれば人と仲良くなれるわけではない。あたりまえだ。

そうかんがえるようになって、無理に何かはなしをしようとすることが減った。朝、家を出るまえは「今日は何も話さないでいよう」とおもうこともある。しかし実際にそれでほんとうに一日中黙っていることはない。出社して、いつもの同僚と一緒にいると、なにかがこころに浮かぶので、それではなしをする。仕事の話を除けば、してもしなくてもいいようなはなしだ。とくに仲良くしようと頑張らなくてよいので、らくに話ができる。恐れずにいえば、仲良くなろうという努力は無駄だとおもう。だから、めんどうなときは全くだまっている。それで面倒なことになることはない。むしろ、周りの人にとってもそれで好都合だろう。こっちのほうがお互いハッピーだ。結果、無理っぽい人とも以外にうまくやれたりすることがあって、やはりそういった努力は捨ててよいのだという気になる。

話はそれるが、戦略的に自己開示をしてくる人がたまにいて、そのうちのいくらかはきっとプロ(それによって稼いでいるという意味で)なんだろうが、人為的に心理的距離を縮めようとしてくる。これがうまくいくのは、上に書いたような感覚につけこむと、錯覚する人がいるからだろう。 それは、ひとから親密な事柄をたくさん打ち明けられると、自分はその人と仲良しなのだと錯覚してしまう、ということだった。相手はそこを見込んであえてそうする。そんな場合はどことなくウソっぽい感じがするので、自分の感覚に忠実になるのがいいとおもう。かんたんに錯覚してしまう理性より、身体感覚はいつも正確だから。

Excelマクロでかんたんにファイルを操作する(開く、閉じる、保存する)

ファイル一個なら、開くのも閉じるのもすぐできます。
でも、10ファイルとかになると大変になります。

そんなときに、かんたんで便利、サクッとつかえるマクロを紹介します。

開く

開きます。どのファイルを開くのかを決めるために引数を二つ渡してます。

Files:ファイル名(だけ)が入ってる配列
path :ファイルのベースとなるパス(例. C:\document\ など)

Public Function OpenAllBooks(Files, path)

Dim f
For Each f In Files
    Dim FilePath
    FilePath = path & f
    Workbooks.Open (FilePath)
Next f

保存する

Application.DisplayAlerts = Falseにしておかないと、保存時に確認メッセージが出てきてしまいます。 一個ずつ確認していたのでは、だいぶめんどうなので、消しちゃいましょう。

Sub SaveAllBooks()

    Dim wkb As Workbook

    Application.DisplayAlerts = False
    For Each wkb In Workbooks
        wkb.Save
    Next wkb
    Application.DisplayAlerts = True
End Sub

閉じる

変更を棄却するのでない限り、実行する前に上のマクロで保存しておきましょう。

Sub CloseAllBooks()

    Dim wkb As Workbook

    Application.DisplayAlerts = False
    For Each wkb In Workbooks
        wkb.Close
    Next wkb

    Application.DisplayAlerts = True
End Sub

墓地の写真を撮ったら

帰宅途中、信号待ちをしているとき、右手の墓地に気づいた。たそがれどきで、非日常的な風情があったので写真を撮ってみた。 写真が液晶でみると意外なほどに陰鬱で、怖くなったのですぐに消した。 ここでなにかスイッチっぽいのが入った。
顔を上げると、風景がどことなくいつもより不気味に見える。 なんとなく視線を感じる。 スマホの電池が切れた。写真撮ってすぐだ。 霊を怒らせてしまったか。
やっぱり墓場は写真に撮ってはいけなかったんだ。

一気に幽霊に敏感なモードになって、風景が怪談の世界になった。 前のトラックは、荷台と席のあいだの窓から腕だけがみえていて、不気味だった。

いつも通っている国道沿いだったが、普段は気づいていない建物があることにも気付いた。
古い歯医者が、ガラス張りの広い玄関があるビルにあった。となりは交番だった。

会社のモードはあらかた消え去り、不思議な世界感だった。
そして、世界の見え方というのは意外なあっさりと切り替わるものだとおもった。

いつも「本当」とか、「リアル」だとか思ってる現実は、実は絶対的なものではないかもしれない。そうでなく、自分の傾向とか周囲の環境などの影響でそういう「見え方」をしているだけかもしれない。幽霊はどちらかといえば「リアル」ではない。でもスイッチが入ると、身近に感じられる。

日常のモードと、そのモードのなかから見える景色だけが唯一ではないということが感じられた出来事だった。

仕事を自動化したい人

仕事は、時にはやりたくないこともやらなければならない。
そんなときは、やりたくないそれをやる意味をでっち上げる。 肯定的な意味づけをしたいからだ。
たとえば、それ自体はおもしろくないけど、自動化して自分でやらなく済むようにする。これなら、その仕事をつうじて自動化のスキルが上がる、そして自動化できれば次からはほとんど何もせずに仕事が終わる!という思考をよくする。
やりたくないけど、やらなくてはならないとき、この思考は役に立ってきた。
目指すべきものがあるから、何はともあれ始めることができるし、うまくいけばちゃんと成果が出るのだ。
意味づけの力は大きい。

しかし、ここ最近にきて自動化が追いつかなくなってきている。
仕事の範囲が変化すると同時に多少量が増えたからだ。
自動化すること自体、かなり時間がかかるので、自動化にかまけていると本業がおぼつかなくなる。
さすがにそれはイケナイから、せっせと地道にそれをこなすしか残る道はなさそうだ。
ということは、やりたくないそれと面と向かって立ち向かわなくてはならなくなる。

さて、こういう状態にあって、自分はどうしてこの仕事をしているのか、という根本的な疑問を持ってしまった。
自動化なしで取り組むことに気が向かない仕事とは、何なのか。
さらに、これまでは仕事そのものより、その仕事をどうやってラクにするか、それはマクロを組んだり、スクリプトを書いたりして自動化するということなのだが、そっちばかりが楽しかった、ということが自分の中でぼんやりとだが見過ごしがたく意識されてきた。

ところで、ちょっと前にどこかの外国のプログラマが、自分の仕事をすべて自動化してしまい、その後の10年位を何もせずに年収1000万そこらもらって人生を過ごしていたという話があった。自分の場合、全部自動化するのはぜったいムリだが、そのプログラマとはどこか気が合うかもしれないな、と思う。