masatoの日記

やっていきます

墓地の写真を撮ったら

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

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

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

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

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

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

仕事を自動化したい人

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

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

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

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

安心してだらだらしたい

今日は午後から何かをすることを放棄して、ひたすらにだらだらしていた。
具体的には、1時から6時すぎまで、畳マットの上に横になっていた。
扇風機はつけていたが、クーラーは消えたままだったので、暑いことには変わりなかった。

そもそもなぜそうなったかといえば、目がずきずき痛んだからだ。
自分の場合、この症状はけっこうな疲れを意味しており、こうなったら優先して休むようにしている。
しかし、休むことは休むのだが、昼間にごろごろしているとなんとなく落ち着かない。
これは、変なことである、と思う。 ごろごろしているのだから、安心して休めばいいだけの話だ。

ここら辺の心情について、いま読んでいる『仕事なんか生きがいにするな』にヒントがありそうだ。

YAPC::Fukuokaに行ってきた

先週、7月1日(土)に福岡でYAPCというPerlのイベントがあり、参加してきました。今年3月にあったYAPC Kansaiにつづき、YAPCは2回目の参加です。 会場はLINE福岡。エントランスにはサリー、コニー、ブラウン(左から)。社内にカフェがあったり、おっしゃれなチェアー、ソファーがあったりして、ぴかぴかでした。

聞いたセッション抜粋

WEBセキュリティのお話(徳丸 浩さん) 

WEBシェルというのをサーバーに設置するとなんでもできてしまう、というのがよくわかった。

分散ユニークID採番機katsubushiとWebアプリケーションへの応用例(fujiwaraさん)

巨大サービスではID採番のシステムもでかい。

はてなブログ最近の開発テクニックと最新の開発風景のご紹介(hitode909さん)

チーム開発でコミュニケーションをよくするため工夫されているのが伝わってきた。

未来のプログラマー達へ ~Perl入学式卒業生から~ (tomcha_さん)

「一歩踏み出す小さな勇気」が必要という言葉が印象的だった。

全体の感想

第一線で活躍されているプログラマの方々のなか、かなり素人感のある自分がまじっていて、恐れ多い感じでありましたが、ハイレベルな雰囲気が伝わってきて刺激になりました。 来年のOkinawaも楽しみです。

福岡観光してきた

人生ではじめて福岡にいきました。 都会でありながら、人がゆったりしている様子で「住みたい街」として評判なのも納得という感じ。 ぜひまた行ってみたいです。

夕暮れの博多駅

博多駅に展示されていた巨大な山笠

大濠公園のカモ

VBAを使ってOfficeからコマンドプロンプトであれこれやる

VBAからコマンドプロンプトにコマンドを渡して実行できる。 これはつまり、WordとかExcelとかから外部プログラムを実行できるということだ。

ためしに、Excelのシートにある文字列をKakashiを使ってわかち書きするということをやってみる。

ネタとして、夏目漱石『坊ちゃん』の冒頭部分を青空文庫からひろってきた。 f:id:masatoz:20170706213159p:plain

坊ちゃんの文章を入れたとなりのセルにコマンドを実行するための関数をいれる。この関数は、ユーザー定義関数というやつで、ようは自分で書いた関数だ。

f:id:masatoz:20170706213149p:plain

組み込み関数みたいにワークシートから実行できる関数は↓のようにして書ける。

Public Function wakachi_gaki(Cell As Range)
    Dim pipe As String: pipe = Chr(124) ' パイプ(|). ハードコードしたら失敗した

    Dim WSH As Object
    Set WSH = CreateObject("WScript.Shell")
    
    Dim sCmd As String
    sCmd = "echo " & Cell.Value & " " & pipe & " kakasi -w" ' コマンドのあいだにスペース必要
    
    Dim wExec
    Set wExec = WSH.Exec("%ComSpec% /c " & sCmd)
    
    '処理が終わるまでまつ
    Do While wExec.Status = 0
        DoEvents
    Loop

    wakachi_gaki = wExec.StdOut.ReadAll
    
    Set wExec = Nothing
    Set WSH = Nothing
End Function

関数を入力してエンター。 一瞬、コマンドプロンプトがちらっと表示される。

分かち書きできている。

f:id:masatoz:20170706213407p:plain

コマンドプロンプトで実行できるということは、Perlもつかえるということだ。 ためしてみた。

かんたんに試すだけなので、Perlのバージョンを表示させてみた。

perl -vってやるだけ。

This is perl 5, version 24, subversion 0 (v5.24.0) built for MSWin32-x64-multi-thread

Copyright 1987-2016, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using ""man perl"" or ""perldoc perl"".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

ちゃんと返ってきた。

これはVBAと多言語のインターフェイスとしてつかえる。

コードはこれ。

Public Function perl(cmd As String)

    Dim WSH As Object
    Set WSH = CreateObject("WScript.Shell")
    
    Dim wExec
    Set wExec = WSH.Exec("%ComSpec% /c " & cmd)
    
    '処理が終わるまでまつ
    Do While wExec.Status = 0
        DoEvents
    Loop

    perl = wExec.StdOut.ReadAll
    
    Set wExec = Nothing
    Set WSH = Nothing
End Function

書きためたVBAマクロをだす その1 Word 箇条書き番号テキスト化

職場でWordとかExcelとかをよくつかっていて、それなりにマクロを書きためている。のだが、管理がずさんなため、いつか一度かいたはずのコードがいざというときに出てこなくてあたふたすることがよくある。このままだと、この状況は一向によくならない。そこで、ブログに出すと同時にGithubのレポに上げるようにすれば、記憶とコードの整理が一挙にできてよいのではないかと思いいたった。

第一回は、Wordの箇条書き記号(・とか1. 2. 3..とか)を素のテキストに変換するマクロを紹介したい。紹介するというか、たくさんのところで使われている処理ではある。しかしこのコードは、テキスト変換処理を複数のドキュメントに適用できるようにじゃっかんの拡張をほどこしてある。これは章ごとにファイルが別けられているケースなので便利だと思う。たとえば20ファイルあったときに、20回マクロを実行するのは、それなりに骨が折れるのだ。

コード

メインルーチンとサブルーチンにわける。メインでどのサブルーチンを実行させるかを、ユーザーインプットに応じて分岐させる。サブルーチンの種類というのは、処理範囲を単独ないしはすべてのドキュメントのどちらにするかという選択にもとづいておこなう。

メインルーチン

かんたんにinputboxに1とか2とかを入力することで、範囲を指定できるようにする。

Sub 箇条書き番号テキスト化()
    Dim f
    f = InputBox("箇条書き番号をテキスト化します。処理範囲を指定してください。1=現在の文書、2=すべての文書")
    If f = "" Then
        MsgBox "キャンセルしました", vbOKOnly + vbInformation
        Exit Sub
    End If
    
    Select Case f
        Case 1
            Call ConvertNumbersToTextSingleDocument
        Case 2
            Call ConvertNumbersToTextAllDocuments
    End Select
    
End Sub

サブルーチン

全ドキュメントを処理するばあいは、ドキュメントのオブジェクト変数をループさせる。それ以外は、どっちも同じで、単純にコピペしている。 Lst.ConvertNumbersToTextが箇条書き記号を素のテキストに変換するVBAの組み込みメソッドだ。

Private Sub ConvertNumbersToTextAllDocuments()
    Dim Lst As List
    Dim doc As Document
    
    For Each doc In Documents
        For Each Lst In doc.Lists
            Lst.ConvertNumbersToText
        Next Lst
    Next doc
    MsgBox "完了", vbOKOnly + vbInformation
End Sub

Private Sub ConvertNumbersToTextSingleDocument()
    Dim Lst As List
        
    For Each Lst In ActiveDocument.Lists
        Lst.ConvertNumbersToText
    Next Lst
    MsgBox "完了", vbOKOnly + vbInformation
End Sub

基本的に、これでだいたいうまくいくはず。 Githubへのアップはまた今度やる。

「シャチ泳ぎ」という演算子の使い方を試してみた

Effective Perl第2版をKindleで読んでいる。 今日読んでいて「シャチ泳ぎ」というおもしろい名前の記法が紹介されていた。
たとえば、こういう感じのやつ。

my $hoge //= 'fugaa!';

ここではDifined-or演算子(//)の直後に代入演算子(=)が使われている。
感覚的に$hogeがundefなら右辺の値が代入されるのだな、という察しがつく。

# difined-or演算子
# 左辺がundefであれば右辺を代入する
my $a = undef;
$a //= 'un-undef';
print $a; # 'un-undef'

この書き方は||を使ってもできる。

# 左辺が偽であれば右辺を代入する
# Perlで偽となるのは、'', 0, '0', undefの4つ
my @arr = ('', 0, '0', undef, 'True');
my @converted = map { $_ ||= 'hoge!' } @arr;
print join ' ', @converted;

以上がシャチ泳ぎの中身だった。
Effective Perlには、上記ふたつの演算子を正しく使うために理解しておかなければならない、Perlで偽となる値についてもはっきりと書かれていてとてもいい。

Effective Perl 第2版

Effective Perl 第2版

Kindleアプリ使える

ところでKindleアプリはよくできていて、スマホでもよみやすい。
ハイライトをタッチ操作できて、自動でインデックスが作成されるので、マークした箇所はあとからかんたんに見返すことができる。
コードブロックもマークできる。
紙の本ならふせんをつけるところだが、ふせんだとどれがどれだかわからなくなるので、検索性は電子本がすぐれていると実感した。 液晶で読むのが人によっては負担になる点はあるが、アプリで暖色にしたり色を反転できたりするうえ、フォントサイズ、行間、余白まで設定できるので、だいぶいい。   目に対するやさしさでは電子ペーパーに分があるが、応答性の良さではまだまだ液晶の圧勝なので、1時間の読書程度ならスマホで便利に読むのはアリという気がする。