京都の道路は変化に富んでいる
きのう京都へ車で出かけていったのだが、京都の道路は難易度が高い。
1.路線バスが走っている
2.道幅がやたらと狭い
3.変な方向に道が分岐している
4.原付が多い(と感じる)
1.
京都には渋い路面バスが走っている。
路面だけに、一般車道を横断しているので、うかうかしているとぶつかりそう。道路を横切るときは「ファーン!!」という警笛を鳴らしていた。
路面電車のない街からくると、どう対応していいのかよくわからず戸惑うが、とにかくぶつからないことを第一にして走るしかない。
進入していいのか迷う交差点。
2.
一見すると一方通行なのかと思うほど細い道が多い。標識が見当たらないので恐る恐る進んでみたら、一応すれ違える程度の道幅があったからラッキーだった。ただし、でかい車だったらムリ。
3. あちこちに分岐していて、どっちに進んだらいいのか考えなければならないので頭の体操になりそう。
4.
気のせいかもしれないが、原付が多い気がする。大学が多いというのが理由のひとつかもしれない。狭い道をぐいぐい走ってくるので接触しないかはらはらする。
このようにドライバーを試すかのような高難易度の道がある京都だが、運転はやさしい印象。車線変更するとき、ハザードランプをちかちかさせて「ありがとう」のサインをする。京都の人は、けっこうゆとりをもって車線変更するときもこれをやっていた。名古屋だったら割り込み気味のときとか、車線合流するときにやるイメージ。京都の人は運転が礼儀正しい。
一日の取り柄は何かしらある
一日ずっと仕事だけ、みたいな日でも何かしらいいことはある。たいせつなのは自分が何をよしとするかだ。
さて、今日のいいことは、夕食がおいしかったことだ。銀の皿で寿司をとった。会社で一人残業していて、出前を取った。300mくらいのところに店があるのだ。だから直ぐ来る。残業にちょうどいい。
残業は体力を消耗するので、気持ちが下がり気味だ。そんなときは、おいしいものを食べるようにしている。おいしい物を食べると、嫌なこととか忘れられる。食べ終わると、かなり気分がよくなって、前向きな気持ちになっていることが多い。
寝る前に一日を朝から振り返るとあたまにいいらしい
ある方のブログでそんなことを知った。わたしには、一日を思い出そうとすると、ぽっかりと空白になっている時間がある。たとえば、きょうは、家を出てから会社について仕事を始めたあたりからお昼までの時間と、昼食後、午後の仕事をはじめてから定時の6時くらいまでがあまり思い出せない。
何をしていたか、という概要は言葉にできるのだが。そのときの風景とか感触とか、ぜんぜん残ってない。主にモニタをみつめて事務仕事をしていたから、風景もなにもないのだろうか。あるいは、疲れてぼんやりしたあたまだったので、感じることが少なかったのかもしれない。
ほかにも、おとついの夕ご飯を思い出せないのは、ヤバいと聞いたことがある。これは、ずいぶん昔、テレビでいっていたような。おとついのご飯は、ほぼ思い出せない。だれかと食事したとか、記憶のくさびになるようなものがないと、まず思い出せない。一人ぐらしの普段のようにスーパーの惣菜を食べた日は、きのうとおとついの違いなんてわからない。そもそも、同じものを続けて食べることがぜんぜん苦ではなく、むしろいつもと同じお気に入りのメニューに満足をおぼえる具合であって、ますます日々の差が記憶にのこりにくい。
以前、この話をたまたま知り合った人としたことがある。その人は、友達とかと一緒に食事をした日なら大体おぼえているとのことだった。一人で食事をした日は、わたしと同じように思い出せないといっていた。ということは、なんとなく、孤食は知性を退化させる、のかなあとおもった。いきなり断定してはいけないかもしれない。が、少なくともネガティブな影響があることは想像できる。
話が逸れるが、結婚している人は、独身の人よりも健康である割合が高いという統計がある。タイトルは忘れたが、本で読んだ。独身の人はストレスに弱く、病気にかかりやすいということも書かれていた。そこで言われていたことをひと言で言えば、孤独は健康に悪いということだった。自分の経験を振り返ってみても、まあ、そうに違いないと同意できる。しかし、なんというか、そういわれると身も蓋もない、という感じもするが。
ブログを書くと日々の観察力が高まってくると聞くから、いまはぼやけた頭でもかき続けていればだんだんと冴えてくるのでは、と期待するのであった。
Perlスクリプトでふたつのドキュメントから重複行を探し出す
翻訳を必要とするふたつのドキュメントがあったとして、外注に出すべきか自分でやるか判断したいとする。一見するとこのふたつの間には重複した箇所がたくさんあるのだが、どの程度の割合でそうなのかは厳密にはわからない。ほとんど同じ文なら外注に出すのはもったいない気がする。外注先によるが、文字数によって課金されるので、文章のなかに重複が含まれていても安くなったりはしないからだ。ユニーク/重複率がわかれば判断できるだが、人力では無理だという話である。Diffをとればよい、という意見もあるが、重複する行がドキュメント内に散らばっていると判別できない。こういう場面で文字列処理に強いPerlが活躍するのではないか。ということで、二つのファイルを比較して、ユニークな行を吐き出すスクリプトをつくってみた。
比較するソーステキストはテキストファイルになっているものとする。
use strict; use warnings; my $file1 = 'file1.txt'; my $file2 = 'file2.txt'; my %hash_file1 = (); open my $fh1, '<', $file1 or die $!; while(<$fh1>) { chomp; ++$hash_file1{$_}; } close $fh1; my %hash_file2 = (); open my $fh2, '<', $file2 or die $!; while(<$fh2>) { chomp; ++$hash_file2{$_}; } close $fh2; my @uniq = (); for my $key ( keys %hash_file1 ) { if (! exists $hash_file2{$key} ) { push(@uniq, $key); } } open my $fh3, '>', 'dupe_lines.txt' or die $!; for (@uniq) { print $fh3 $_,"\n"; } close $fh3;
中身
愚直に順序を追って処理していくスクリプト。
はじめに変数を二つ用意して、比較するふたつのファイル名をベタ打ちする。
標準入力から受け取ってもいいとおもう。
つぎに、ファイルを開いて、1行ずつハッシュのキーに入れる。ハッシュの値はなんでもいいので、++$hashってしてインクリメントさせている。なので、もし知りたかったらハッシュをダンプすれば、どの行がいくつ含まれているのかが、わかる。ハッシュのキーが行そのもの、値がそのカウントというわけ。
ふたつめのファイルで同じことを繰り返す。
そうしたら、ハッシュ1をループさせて、そのキー(=行そのもの)がハッシュ2に含まれているかを確認していく。exists関数を使えば、これがチェックできる。ここでは、含まれていない場合に@uniqにキーを入れて、重複していない行のみをしらべている。逆に重複している行をしらべたいときは、if (exists $hash_files{$key}
と条件を逆にすればオーケーだ。うまくいけば、ユニークな(あるいは重複した)行のみをフィルターして配列に入れられる。
さいごに、フィルターした行が入っている配列をテキストファイルに書き出しておしまい。
感想
はじめ、なぜか上手くいかないと思ったら、ソースファイルの文字コードがそろっていなかった。
Wordからエディタにコピペしていると、これがよく起きる。で、うまくいかない理由がわからずに半ばパニックになるということを度々繰り返している。今回は20分くらいで気づけたので少しはましになってきた。
Perlの正規表現 s///でeオプションを使ってみる(evalオプション)
$seasonがautumnだと、it is cool!というサブルーチン。
autumn意外だと?になってしまう。
全然s///eする必然性がないけど、うまいサンプルが思いつかなかったので。
my $season = 'autumn'; my $say = temperature($season); print $say; # it is cool! sub temperature { my $arg = shift; my $line = 'it is #'; $line =~ s{#} { if ($arg eq 'autumn') { 'cool!'; } else { '?'; } }ge; return $line; }
感想
Tengのソースコードをみていたら、この書き方が使われていた。 今のところどうやって活用するのかわからないんだけど、便利そう。
VBAでExcelブックのショートカットをさくっとデスクトップにつくる
ファイルのショートカットをつくるのは、案外手間だ。
ワンクリックでさっくり片づけられる方法があったのでつくってみた。
といっても、モーグで紹介されていたサンプルコードをほんのちょっとアレンジしただけです。
コード
Sub MakeShortcut() Dim ShellObject Set ShellObject = CreateObject("WScript.Shell") Dim TempPath As String TempPath = ShellObject.SpecialFolders("Desktop") Dim ShortcutObject Set ShortcutObject = ShellObject.CreateShortcut(TempPath & "\" & ActiveWorkbook.Name & ".lnk") With ShortcutObject .TargetPath = ActiveWorkbook.FullName .Save End With End Sub
説明する
1. WshShellオブジェクトをつくる
ショートカットを作るには、WshShellオブジェクトのメソッドが必要みたい。このオブジェクトを作るには、Microsoft Script Host Obuject Modelを参照設定するか、CreateObjectでやる方法がある。ここでは後者の方法でやった。参照方法を使うのは、コードがシンプルになるのがよいとは思うけど、あとで参照設定が必要なことを忘れて、なんで動かないんだ?ってことに必ずなるので、個人的にちょっとめんどくさい。
2. デスクトップのパスを取得する
ここでは、ショートカットをデスクトップに置きたいので、パスを取得する必要がある。デスクトップのパスもWScriptオブジェクトから取れる。.SpecialFolders(“Desktop”)がその操作。
3. ショートカットを作る
WshShellオブジェクトでショートカットを作るには、.ShortcutObjectに次のプロパティに2つの引数を渡してやる必要がある。
.CreateShortcut
ショートカットを保存するフルパス。.TargetPath
ショートカットの参照先ブック。すなわち元Excelファイル。
これらを渡してから.Saveメソッドを実行すると、指定したとおりにショートカットが作成されるという具合。
感想
便利。こういう作業をワンクリックでできると、他の仕事がはかどる。
参考にしたサイト
社会人になってからの方が勉強している気がするのは、
むかしちゃんとできてなかったのがくやしいからだという気がする。いや、そのときはせいいっぱいのつもりだったのだろうが、そこになっとくがいかないという物わかりの悪さであがいている。