masatoの日記

やっていきます

安心してだらだらしたい

今日は午後から何かをすることを放棄して、ひたすらにだらだらしていた。
具体的には、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時間の読書程度ならスマホで便利に読むのはアリという気がする。

Perlワンライナー入門した

テキストファイルを扱っていて、ああ置換しないといかんやつがある…って発見してからのスクリプト書く気力がないことがよくあります。 そういうとき、全部手動でやったりして時間かかってました。そんなときにPerlワンライナー。 一回やってみると、かんたんにサクサク仕事が進むことがわかりました。これからどんどん使っていきたい。

たとえば、今日はこういうのを使いました。

カレントディレクトリのテキストファイルに含まれるhogeを消したい。

$perl -pne 's/hoge//g' -i.bak *.txt

-iオプションを付けると、上書きできる。
10秒くらいで片が付いて時間ができる。うれしい。

小飼弾さんのPerlワンライナー Advent calender。 一行野郎(one-liner)はperlにおまかせ

ミニマルパールというのもある。これは英語版の方が安く買えるようだ。

Amazon CAPTCHA

あるべき自分というのは思考の中にしかない

 禅では、過去も未来もなく、あるといえるのはこの瞬間だけ、といいます。

私は、快不快で判断して、これは良い、あれはダメとか決めています。

そして、気分が悪くなると、自分はこんな状態であるべきじゃない、これは不本意なことだとこころの中で不満を感じます。このとき一方で「こうあるべき」というイメージが浮かんでいて、今の不満とその理想とのギャップを感じています。

われわれ人間はリアルではないものに執着して、リアルなものをすっかり忘れてしまいます。それが実際、われわれが行っていることなのです。

「禅マインド ビギナーズ・マインド 」鈴木俊隆

現実が気に入らないとき、私はイメージを捕らわれながら現実がそうなっていないことに憤ったり、苦しんだり、悲しみさえ感じることがあります。そして、そういう有り方を自覚することなく、毎日繰り返しているようです。先ほどの引用はこのようにつづきます。

この点をはっきり認識するなら、完全な落ち着きが得られ、自分を信じることができます。自分に何が起ころうと、かまいません。あなたは自分を信じています。この信は、リアルでないものを信じている通常の信仰とは全く違います。

私に取って身近な「信仰」とは、リアルではないものに自分を近づけていくような努力といってよいかもしれません。その姿勢は、いまここにある自分というリアルなものを否定し、存在しないしないものを求めているようにみえます。きっと、いま自分が不満なのは、今の自分の不完全さが原因なのだという理解があるのです。だから自分を向上させることで、幸せになれると考えるのでしょう。

つい最近、「マインドフルネス」というワードが流行したとき買った上記の本をぱらぱら読んでいて、そんなことを思いました。

  

禅マインド ビギナーズ・マインド (サンガ新書)

禅マインド ビギナーズ・マインド (サンガ新書)