アレクサに電車の時刻をしゃべらせる 4月12日, 2023


katakuri
御前山のカタクリ

これまで試用してきた「近くの駅の電車発車時刻をアレクサに尋ねる」マイプロジェクトもかなりこなれてきた。「○○(駅名)で次の(上り|下り)の電車は」と聞くと直近の時刻を応えてくれる。色々な時刻の電車を利用する場合には結構便利。

春のダイヤ改正も済んで、時刻表も更新した。アレクサに関連した具体的方法には記事も多いので、ここでは作業全体を見渡すためのポイントと思われる点と、AWS上に設置する短いpythonのコードの例に焦点を絞ってまとめてみた。自分でも、久しぶりにコードなどを更新しようとした時に、「あれれ、これどうするんだっけ?」とちょっととまどうことも多い。── 開発者コンソールにログインしたら英語表記で、日本語に変更するのは? とか。左下の「English(US)」を「Japanese(日本語)」にすればよいだけなのに──。それで、後日のメモになればという思いもあってのことだ。

アレクサに時刻表をしゃべらせるためには、大きく2つのことをしなければならない。

1. アレクサスキルを作成する
2. AWSにlambda関数を作成する

■ アレクサスキル

アレクサ・ディベロッパー・コンソール

設定方法の詳細はあちらこちらに記事も多いので省略するとして、ポイントと思われる点を箇条書きで書き出せば、以下の通り。

○スキルを作成する

  • ・「呼び出し>スキルの呼び出し名」を設定する ── 例: 「チャオの時刻表」
  • ・「対話モデル>インテント」を追加する ── 例: 「SelectTableIntent」
    • 「{St_Name}で次の{UpDown}の電車は」などを登録する。
    • インテントスロット ── この「スロット」の値がlambda関数に渡されて処理対象となる。
      • 例:{St_Name}
        • 「ダイアログ」タグ
        • 「このインテントを完了させるために、このスロットは必須です」を設定する。
        • Alexaの音声プロンプト例 ── 例:{St_Name}はどこですか
        • ユーザーの発話 ── 例:「{St_Name}」「{St_Name}です」「{St_Name}駅です」
        • 「検証」タグ
          • 「検証ルールを作成」 ── 「値セットのみを受け付ける」を選択する。
      • ※例:{UpDown}も同様に作成する

・アセット

  • 「スロットタイプ」 ── ここに「値セット」を作成する。
    • EkinoNamae 該当する駅名リスト
    • NoboriKudari 「上り」「下り」

・エンドポイント

  • スキルID ── こちら側のID(後の手順でlambda関数側に入力が必要なのでCopyしておく)
  • デフォルトの地域 ── あちら側のID(lambda関数側の接続個所。AWSからコピーしてくる)
    • 例: arn:aws:lambda:ap-northeast-….:function:NAME_OF_LAMBDA関数
  • ※ この両IDを設定することでスキルとlambda関数が接続され、問い合わせに対して声で応答がある。

■ AWSにlambda関数を用意する

AWSマネジメントコンソール にアカウントを作成する。(lambda関数を利用するための詳細は省略)

設定する関数の例は github に置いてある。並んでいる mkTimeTableData.py は時刻表データを取得しファイルするためのコード。

  • lambda関数の「関数の概要」に「トリガーを追加」ボタンがあり、ここにAlexaの「スキルID」を登録する。
  • lambda関数のARNが表示されている筈なので、これをアレクサスキルの「エンドポイント」にCopyする。

■ 「テスト」

アレクサスキルに戻ってテストする。

エンドポイントにAWS lambdaのARNを入力する。ここで、想定通りに応えが得られるか十分にテストする。設定に問題があると、スキルに対するlambda関数の応答をテストする手順が混乱するだろう。応答が想定外の場合、右欄「スキルの呼び出し」JSONに表示されるものがヒントになる場合が多く、この欄に何も表示されないタイプのNGは、対話モデルなどに問題があるだろう。また、「スキルが正しく応答できませんでした」という場合は、AWSのlambda関数に問題がある場合が多い。

AWSマネジメントコンソールで、「モニタリング」タブに「View CloudWatch logs」があって、応答のログを確認することができる。そこに「Error」となっている場合、解決のヒントになることがある。

■ 関連ファイルのupload方法

  • ・lambda_function.py
  • ・mg_timetable.txt
  • ・jpholiday folder
    これらをフォルダーに置き、zipに固める。
    • ※ jpholidayパッケージをこのフォルダーに用意するためには、(末尾のドットに注意)
      • $ pip install jpholiday —target .

$ zip -r function.zip .

AWSのコードソース編集画面の右上の「アップロード元」セレクターから「.zファイル」を選び、このファイルをアップロードする。

GPXのスリム化 3月31日, 2023


sannoto
三ノ塔より富士山 ─ 遠く南アルプスを望む

山のルートデータはGarminのForeAthlete230Jで残している。これをTrailNote上に反映して山行記録としているのだ。

ただこのところ例によって電池がか細くなってきた。夕方までもたないこともある。そこで保険にGNS3000というドイツ製のGPSレシーバーも持ち歩くようになった。毎秒プロットしている。Garminの腕時計は10秒毎なので、かなり細かいと言える。地図に表示するとギザギザが目立つ。

このデータを間引くことができるのか日本の販売サイトに質問のメールを書いてみたのだが、音沙汰無し。まあできないのだろうなあ、とあきらめつつ、ドイツのメーカーのサイトを見てみると、1Hzのデータ取得を(わが希望とは逆に)4Hzで取得するコードのupdate候補が置かれているのを発見した。これからすると、ソフト的な方法で頻度を調節できるようになっているのかもしれない。

まあ、とにかく、目下は毎秒位置データを取得するのを変更することはできない。そこで、せめてでき上がったgpxファイルを間引くくらいはしてみようと考えた。

遥か昔、当時ルート記録を保管していた「ルートラボ」にポイント数の上限があったため、それに合わせることを考えてperlでスクリプトを書いて遊んだことがあった。1分に1ポイントデータにしたと思う。今回は、古いものを手直しすることは捨てて、pythonで書いてみることにした。

pythonには、XMLでもGPXでも解析用のパッケージがあるのだけど、ここでは、以前のperlのやり方だけは踏襲して、正規表現でトラック・ポイント・ブロックを抜き出した上で、INTERVAL間隔(ここでは20秒にしてみている)毎にブロックを書き出している。

コードはgithubの ここ に置いてある。

Notionの2週間表示 12月15日, 2022


kintoki
雲ひとすじ

予定や行動の記録をNotionのカレンダーにまかせるようになってかなり経った。出先ではAndroidで見るわけだけど、カレンダー表示は役にたたない。画面が小さいので。テーブル表示するが、どうも使いづらい。まずは試しに、先週と今週の予定・記録だけ「2週間分表示」してみようと、isLast2Weeksというformulaを工夫してみた。リスト表示しているが、きれいにカレンダー表示するにはたぶんシステムのバージョンアップを待つしかなかろう。

オリジナルなものは何もない。(TKS hkob , Sのノート )

formatDate(prop(“日付”), “YYYY-WW”) == formatDate(now(), “YYYY-WW”)
or
formatDate(prop(“日付”), “YYYY-” + format(add(toNumber(formatDate(prop(“日付”), “WW”)), 1))) == formatDate(now(), “YYYY-WW”)

※「今週のもの」or「先週のもの」。週が月曜始まりの場合。日曜始まりなら”WW”を”ww”にするのだと思う。たぶん。

【追記】時がやってきて、年末年初の表示が想定外となることに気づいた。if文のかたまり以外にエレガントな解法を見つけられずにいるので放置している。どうしてもやるなら、次のようなものになるか。「今週」は、「直前の日曜日の後で、次の日曜日以前」なわけだ。(tks Jamie )

Current Week:

if(prop(“日付”) > dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”) and prop(“日付”) <= dateAdd(dateSubtract(dateSubtract(dateSubtract(now(), toNumber(formatDate(now(), “d”)), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”), 7, “days”), true, false)

Last Week:

if(prop(“日付”) <= dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))), “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”) and prop(“日付”) > dateSubtract(dateSubtract(dateSubtract(now(), if(formatDate(now(), “d”) == “0”,7,toNumber(formatDate(now(), “d”))) + 7, “days”), toNumber(formatDate(now(), “H”)), “hours”), toNumber(formatDate(now(), “m”)), “minutes”), true, false)


【再追記】2023-01-02 同じ方針でこんな方法もあるのに気づいた。これでも問題ないか。

My isCurrentWeek:

if(prop(“日付”) > dateSubtract(now(), if(day(now()) == 0, 7, day(now())), “days”) and prop(“日付”) <= dateAdd(now(), 7 – day(now()),“days”), true, false)

My isPrevWeek:

if(prop(“日付”) > dateSubtract(now(), 7 + if(day(now()) == 0, 7, day(now())), “days”) and prop(“日付”) <= dateSubtract(now(), if(day(now()) == 0, 7, day(now())), “days”), true, false)

My isNextWeek:

if(prop(“日付”) > dateAdd(now(), 7 – day(now()), “days”) and prop(“日付”) <= dateAdd(now(), 14 – day(now()), “days”), true, false)

Gmailに接続できなくなったら 6月8日, 2022


deer
大山の鹿

1 Googleの2段階認証をオンにする
2 アプリ パスワードを設定する
3 Mail.appのpopアカウントを作成し直す
4 smtpサーバーに認証を設定する

gmailが「突然」Mail.appで受けとれなくなった。「アカウント名またはパスワードを確認できません」と繰り返し言われて解決方法がわからない。そんな時、Mail.appにGoogleのアプリ パスワードでの接続を設定するとうまくいくかもしれない。

Googleアカウント>セキュリティ>Googleへのログイン>2段階認証プロセス
ここでまず、Googleの2段階認証を設定する。

続けて、同じ場所にある「アプリ パスワード」を選択して、「メール(Mac)」にアプリ パスワードを登録する。

そして、Mail.appのpopアカウントを与えられたアプリ パスワードを使用して作成する。なお、smtpサーバーにもこのパスワードでの認証を忘れずに設定する。

以上で解決することもある。私は解決した。

【追記】 6月14日, 2024 Googleのサービスは頻繁に変更が行なわれる。アプリ パスワードの変更も、目下は、上記方法ではなく、次のURLにアクセスすることで可能だ。 myaccount.google.com

ufw習熟運転中 11月30日, 2021


arimadam
有間ダム

1 日本に割り振られたIPアドレスを得る
2 利用し易いように変形する
3 ufwに渡すための拒否iPデータを作成する

長らくieserverのお世話になってきていたのだけど、乗り換えざるを得なくなりサイトのURLも変更となった。

これを機に、DebianもBullseyeにあげ、前URLからの転送も敢えてせずに心機一転始めることにした。さあいよいよufwを設定しなければ。これまではiptablesとfail2banでやってきていたので、なかなか慣れない。

そんなこんなで、あちらこちらから襲来する迷惑な「覗き魔」に対して、目下はufwの習熟運転中。

まず、使用する「日本に割り当てられているiPのリスト」(jp.txt)を最新のものに更新した。

https://ipv4.fetus.jp/jpからCIDRリストを入手し、
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18

自分で利用するのに便利な形にする(jpwork.txtはjp.txtの注釈行を削除したもの)。cidr2rangeとconvipはかなり昔作った小さなものだけどまだ充分便利。

$ xargs -L1 cidr2range < jpwork.txt | convip > jpiplist_new.txt
001.000.016.000-001.000.031.255
001.000.064.000-001.000.127.255
001.001.064.000-001.001.127.255

これまでは上記の表を勘案してiptablesに入力していたが、表から隙間をみつけるのが面倒なので、拒否したいiPを日本割り当てリストの隙間にみつけ、ついでに隙間をすべて拒否するためのデータをプログラムで挙げてもらうことにした。<下記「from_to」参照>

示されるデータ
$ from_to DENYIP
DENYIP
  CIDR1
  CIDR2
  …

ここに示されるCIDRsを適宜「# ufw insert N deny from CIDR to any」のように手動で入力することにしている。これもfrom_toに組み込めるけど、まあ目下は手動でいいだろう。慣れてきたらまた考えよう。

-

-

電車の時刻表を取得する 11月30日, 2021


仏果山にて

東急東横線渋谷駅の時刻表を取得する。

この駅では上り電車はないので、平日用と週末祝日用、下りの2種類の発車時刻表を得て、時間をキーとした辞書の形でファイルする。データは、Alexa-skillで利用するためのものとなっている。

requestモジュールとBeautifulSoapモジュールを使用した典型的な手順をとっていると思うので、特に内容の説明は不要だろう。Pickleモジュールは、辞書オブジェクトをファイルするためのもの。

写真の撮影日時と撮影場所を表示する 10月8日, 2021


馬頭刈尾根にて

写真ファイルに撮影日時と撮影場所が記録されていれば、それを表示する。

場所はマーカーを設置した地図を開くことで示していて、撮影日時をマーカーのラベルとしている。

処理対象の写真ファイルを指定するためと、マーカー付き地図の保存先を指定するためにダイアログを開いている。保存先指定で、保存が必要ない場合は「キャンセル」を選択すれば、地図を表示して終了する。

78行目の不思議に見えるかもしれない処理は、撮影日時を横書き1行にするためのもの。

Pyftp 1月31日, 2021


mycat_daopi
daopi

1 REMOTE_PATHは,リモートのルート(例えば'public_html/')
2 LOCAL_PATHは,ローカルのルート(例えば'/Users/_NAME_/sites/_HP_/')
3 PWの扱いには更に工夫が必要

FTPする時,遥か昔は初期の"Cyberduck"が好みだった。でもその有料版が併存し初めた頃からはNcFTPに乗り換え,便利に使用してきた。そして,去年,思いたってPythonのスクリプトで省力化した。

省力化の背景は,ホームページのデータはwebbyというRubyのプログラムを使用して組み上げていることにある。MacBook Proに用意したポスト記事を,メニューや画像とともにページに仕立ててサーバーに転送する。転送先がsshに対応していれば,転送までwebbyがやってくれるので造作もないが,そうでない場合は,webbyが更新したファイルのリストを吐くので,そのファイルをNcFTPに指定して手動で送る。この更新ファイルリストを読み取って,サーバーに転送する手順は自動化がそう難しくないと思ったのだ。

スクリプトでは,一応,転送先がより古いことを確認した上で更新ファイルを送っていて,ファイルが存在しない場合はそのまま転送する。実に速い。不要になるファイルがある場合に削除するのは,従来通りNcFTPによる。つまり手動。スクリプトにこの処理も加えることはできそうだけど,それならファイル更新というより,「フォルダーの同期」として広げた方がよいか。簡単そうだし,そのうち考えてみよう。それにそこまでやれば,ssh以外の手段としてwebbyに組み込むこともできそうに思える。

葉書に宛名書き 1月8日, 2021


narcissus

1 連絡先.appから書き出したvcfファイルや,所定フォーマットのcsvファイルを指定すると,
2 必要なデータをリストに組み立てて,
3 郵便番号は枠位置に合わせ,住所・氏名は横書きで,指定したプリンターに印刷する。

「葉書AB」が使えなくなってからは,あれこれ色々な方法で葉書の宛名を印刷してきた。でもどうもこれという決定版に出会えずにいた。自分用の宛名印字ソフトがないだろうか。住所・氏名の縦書きには全く拘りが無いので,なんとか気にいった宛名ソフトをみつけたい。できたらpythonでプリントする方法をみつけたい,と工夫してみた。やはり横書きが楽。

条件は,

  • ▶郵便番号は番号枠に納めたい
  • ▶全てをpythonでまとめたい
  • ▶入力はvcfでもcsvでもよい
  • ▶vcfはBig Surの連絡先.appの出力によっている
  • ▶csvのカラムは,姓・名・郵便番号・住所・連名の5つがこの順で並ぶこと
  • ▶住所・氏名は横書きする
  • ▶連名を1名許容する
  • ▶出力先のプリンターは使い慣れたカラーのもの

使用フォントは源真ゴシック。他のものでも勿論OKで,スクリプト冒頭にそのパス(PATH_TO_FONTS)を具体的に指定する。また,作業用ディレクトリを指定することでデバッグし易くなるので,それ(PATH_TO_WORK)も便利な場所を指定する。

全体の流れはスクリプトを見れば明瞭だが,一応要約しておくと,指定されたvcfファイル,csvファイルの中身を順にリストに書き出す(readvcf(), readcsv())。その1件をReportLabモジュールで葉書サイズのPDFページに配置し(mk1PDF()),それを繰り返して複数ページをまとめ(combine()),プリンターに出力する。過程で使用したファイルは見栄えよく,消去している。

工夫した点は,郵便番号枠に合わせるために,textobject.setCharSpace()の数値を0.2mm間隔で広げてみて適当そうな値を探したことだろうか。我が環境では,ピッタリ納まる。使用した葉書のフォーマットにより,もしズレるようなら,setTextOriginの数値などを変えて試してみることかな。ここではKOKUYO-KJ-A2630で設定している。数値は左下隅が原点。

なお,連絡先.appに登録する際,長くなりそうな住所には,改行したい場所1箇所に半角スペースを挿入しておく。出力例では「半蔵門マンション」の前にその処置がしてある。2箇所で改行するのは一応許されない仕様となっている(修整は簡単)。住所の改行箇所に自信が無い場合,スクリプトが「Printer 準備 OK?」と聞いてきた時に停止させればよい。PATH_TO_WORKに指定した場所に "combined.pdf" が出力されているので,それを確認する。ちょっと手工業的だけど充分役に立つ。

また,使用するプリンターは当然こことは異なるだろう。その場合,’lpstat -s’で表示される登録済みプリンターのリストを勘案して工夫すれば,多分うまくいくはず。

【update】 12月21日, 2023 久し振りに動かしたところ、
「〜 is deprecated and was removed in PyPDF2 3.0.0. Use 〜 instead.」とのこと。
関数"combine()"につき、下記4個所を修正。

- pdf_writer = PyPDF2.PdfFileWriter()
+ pdf_writer = PyPDF2.PdfWriter()
- pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj)
+ pdf_reader = PyPDF2.PdfReader(pdf_file_obj)
- page_obj = pdf_reader.getPage(0)
+ page_obj = pdf_reader.pages[0]
- pdf_writer.addPage(page_obj)
+ pdf_writer.add_page(page_obj)

Alexa!次の電車は? 11月25日, 2020


1 <speak><say-as interpret-as="time">2分??秒</say-as></speak>
2 <speak><say-as interpret-as="time">0 分??秒</say-as></speak>

このところAlexa-Skillで遊んでいる。最寄り駅の次の電車の発車時刻を応えるスキルを登録したのだけど,困ったことが2つ。

時刻表データを配列に用意して,近い時間の発車時刻を応えるだけの単純なpythonスクリプト。スピーチのタイプを"PlainText"にしたのだけど,これでは,"2分,5分,9分"のような1桁の時刻(分)を「にぶ,ごぶ,きゅうぶ」と読んでしまう。次の電車の発車時刻自体はまあわかるのだけど,ちょっと無念。修正には改めてawsの豊富な説明書きを読まねばならなかった。でも読めば収穫あり。"SSML"についてまとめられているのを読んで報われた。これで解決できた。"SSML"とは,"Speech Synthesis Markup Language"で,読み上げの細かな部分を調整する方法のようだ。その"<say-as>"に"time"というオプションがあり,これでOK。

<speak>次の電車は<say-as interpret-as="time">2分??秒</say-as>です</speak>
これで「次の電車はニフンです」と読まれる。"??秒"は読まれない。読まれないが,"time"のフォーマットの関係からだろう,秒の指定が欠かせない。

<speak>次の電車は<say-as interpret-as="time">0 分??秒</say-as>です</speak>
次に困ったのは,「レイフン」。時刻にあるのを「レイフン」と読んで欲しいがそのように読まれず,ただ「レイ」だけで終ってしまう。この挙動の理由は推測できるが,これは乗り越えるには相当難しい壁だった。何の掴み所もない。詳細な筈の説明書きにも触れられていない。Amazonだけではたりず,Microsoft・Googleその他にかなりの文書がある。"<say-as>"の源流の一つらしき"W3C"まで辿ってしまったが何も行き当たらず。こんな時はUSAの質問サイトをあさればヒントに行き当たるのが普通だけど,全くダメ。もう「試行錯誤」しかない。それで発見したのが,上記方法。わかりにくいかもしれないが,ゼロの後ろにスペースを挿入する方法だ。読み上げる文を変数で用意しているのだけど,"0分"にはこの処理を加える。これで期待通りに読まれる。

「Alexa,○○駅の次の電車は?」のように聞くと,「今日は休日なので,次の電車は○○です」のように応えてくれる。結構楽しめる。休日判断は「jpholydayモジュール」を組み込んでいる。

LilyPondのセグメンテーション・フォールト 8月1日, 2020


64bit用LilyPondがセグメンテーション・フォールトを吐くなら、libguile関連ライブラリーを入れ替えてみる

楽譜はSibeliusで清書している。ただ、ちょっと数小節必要な場合、簡単に印字してくれるLilyPondも大変好きだ。テキストファイルを用意すれば、TeXのように画像を生成する不思議さに引かれてもいた。そう、Catalinaになる前はね。そうです、64bit障壁ができてからは動かなくなって久しいわけです。

残念でしょうがなくて、あの膨大な依存ファイルを数日かけて集めてmakeしてみたこともあって、今でもmacには他で用いることがありそうもないあれこれの小さなプログラムやライブラリを貯めこんでいる。でも、次から次へと更なる依存関係を言われることに根負けしてコンパイルをあきらめ、もうこの際Homebrewだか、MacPortsだかを頼るよりしょうがないかなと思い始めていた。macOSに既存のファイルまで重ねてinstallして自分の環境を作るパッケージは好みではなく、また元来があれこれ試してconfigureやmakeなどで無事に動くプログラムが組み上がっていくプロセスが好きなことから、それらパッケージのお世話にはなっていないのだ。

さて、それで今日発見した。Marnenという人物がdarwin-64bit用バイナリーを公表していたのだ。本当に今頃になって発見した。しかもLilyPondの本家にリンクがあるのに気づかずにいたわけだ。 macOS 10.15用の非公式の64ビット アプリケーション バンドル

しかし残念にも、入手して立ち上げるとわが環境では「Segmentation fault」で止まってしまう。

$ lilypond --verbose desktop/test.ly

表示されるエラーを確認した。これで"Segmentation fault"が出てくる起動ログの一部が見える

解決方法を探して数時間、NetでのMarnenの発言を発見しそれを追うと、彼が他のユーザーのエラー状況を確認する言葉の中で、lib/guile18について述べているのを読んだ。 LilyPond.app/.../lib/guile18 の不具合の可能性を考えているように見えた。それに吐いているエラーからすると、ライブラリーコンパイルの問題にも思えると、勝手で根拠ない推測をし、試しに「大事そうなlibguile*(供給ファイルには18個ある)」を、自分でguile-1.8.8をコンパイルした時にできていた '/usr/local/lib/libguile*(24個あった)' に入れ替えてみた。

ライブラリの場所は、 LilyPond.app/contents/Resources/lib/libguile*
lib/guile18が関連するわけではないようだ。事情は不分明で、libguile18.dylibは、lib/guile18には置かれずlib/libguile18.dylibとなっている。とにかく単純なことに上記でOKだった。

desktop$ lilypond test.ly

test.pdfが無事に作成されたし、以前作成したファイルで試しても無事に出力される。OKだった。Marnenさんどうもありがとう。私と類似環境でこのエラーを経験している方は、試してみる価値があると思う。ご自分の責任で。

新版:連絡先.appのデータをとりだす 7月5日, 2020


昔、当時の「アドレスブック.app」のデータをExcelに読み込むためのスクリプトを利用していた。いや、必要があれば今でも使うのだけど。今回、csvファイルをvCardファイルを経由して「連絡先.app」に収納するpythonで遊んだ余勢をかって、逆にvCardからcsvファイルを作成するプログラムも書いてみた。ただし、初心者のことでもあり、macOSでの使用しか考えていないこともあって、汎用性はほとんどないし、かなり無骨で、エレガントな所など全くないものだ。

「連絡先.app」から"書き出す>vCardを書き出す…"でvcfファイルを用意する。プログラムを起動すると、vcfファイル読み取り用のダイアログが開くので用意したファイルを指定する。続けて変換したcsvファイル保存のダイアログが開くので保存先を指定する。

出力されるcsvファイルのカラム構成は、
[姓, 名, 敬称, 姓の読み, 電話, Email, 郵便番号, 住所[都道府県, 市区, 町村, 番地], 連名]
となっている。他の項目が必要な場合は工夫を要する。

■制約事項
・名の読みは移せない
・電話, email, 住所, 連名は各1件のみ
・保存先のcsvファイルは新規ファイルを指定のこと。既存ファイルを指定するとみっともなくエラー。

この制約の3点目のasksaveasfilenameの不具合にからむ問題は、例外処理ではない解決方法を見つけたいと思っている(が難しそう)。Linuxの場合なら stackoverflow にあるようにfiledialog.pyに手を入れることで乗り切れるらしいことを見つけたが、コメントが付いているようにmacOSでは解決しない。確かにfiledialog.pyの修正は無効だった。

【追記】asksaveasfilename 1月15日, 2021 ふと気づいた。Big Surに上げたからか,何かのupdateが効いてくれたのか,asksaveasfilenameのダイアログが普通に動作するようになっていた。vcf2csv,csv2vcf,ともに同じファイル名を指定してもきちんと動作する。よかった。

CSVからvCardを作成して連絡先.appに読みこむ 6月14日, 2020


必要があって受け取ったExcelファイルの宛名を官製ハガキに印刷しなければならなくなった。Catalinaになってから「葉書AB」は使えなくなった。64bitでビルドし直さなければならないのでね。それで、この手の作業は現在は「おまかせ宛名はがき」に頼りきり。そのためには、まず「連絡先.app」に読み込ませなければならない。直接読み込ませることができる筈だけど、どうもご機嫌斜め。何か約束があるようで、csvファイルを受け付けてくれない。この手の「無言の約束事」が結構の曲者なのだ。

試行錯誤の末になんとか読んではくれたのだけど、これってよくありそうな作業だ。私はあまりやらないけど。元来、vCard3が単純なフォーマットであるのを知っているので、目下中心に遊んでいるPythonでスクリプトを組んでみた。ただし、例によって我が環境でしか無事には動かないものだろうし、あれこれのチェック作業を省いているので、単なる自分の作業メモかもしれないのだけど。

csvファイルを用意する。その構造は、{姓、名、姓読み、名読み、携帯電話番号、自宅電話番号、自宅メールアドレス、自宅住所[ 郵便番号、都道府県名、市区町村以下 ]}となっているものとした。

住所については、もっと詳細に「連絡先.app」の欄に対応づけることもできるだろうが、葉書に印刷するという目的からすれば、これで充分。

起動すると、csvファイル読み取り用のダイアログが開くので、ソースを指定する。変換後にvcfファイルを保存するためのダイアログが開くので保存先を指定する。「連絡先.app」から、"ファイル>読み込む…"でこのvcfファイルを指定する。以上で終了。※csvソース2行目の「平将門」さんは、「姓読み」を省略しているため、「すべての連絡先」末尾の「読みなしグループ」になる例です。

csvソースの例:
服部, 半蔵, はっとり,, 011-1111-1111, 01-1111-1111, aaa@bbb.cc, 111-1111, , 大江戸区城内西1-1
平, 将門, , まさかど, 022-2222-2222, 02-2222-2222, ddd@eee.ff, 222-2222, , 大江戸区城内東2-2

出力されたvcfとカード@連絡先アプリ


【追記】tkinterのmac対応 7月4日, 2020 このpythonスクリプトでは,tkinterパッケージを利用している。しかしこのパッケージは私が思うにmacOSとの相性は最低だ。色々な箇所に実用上の不具合がある。たとえば、(ここでは関係ないが)ウィジェットに漢字を入力する場合、確定させるリータンキーを入力するまで文字が表示されないような例もある。上記でもasksaveasfilenameに支障があることに気づいた。それは、vcfファイルの保存先を指定するダイアログで、既存ファイルを指定するとエラーとなるのだ。これは、macOSでは(多分Windowsでも)filedialog.pyを使用せず、システムのファイルダイアログを用いることに起因するものらしく、解決方法を知らない。本来なら例外処理が必要だが、ここでは省いている。ちょっと格好悪い。

【追記】asksaveasfilename 1月15日, 2021 ふと気づいた。Big Surに上げたからか,何かのupdateが効いてくれたのか,asksaveasfilenameのダイアログが普通に動作するようになっていた。vcf2csv,csv2vcf,ともに同じファイル名を指定してもきちんと動作する。よかった。

Xcode-11.5とXVim2 6月1日, 2020


Xcode-11.5に上げてからVim起動時にエラーが出るようになった。表示は長いので省略するが、要するに「プラグインXVim2.xcpluginのロードエラー」などで、

$ xcodebuild -list> /dev/null

これでも同じエラーが表示される。対処方法がわからず、コールドブートの度に、つまり私の場合は毎朝、この何行ものエラー表示が繰り返され、わずらわしかった。これまで類似のエラーは、GithubのXVimProjectにある手順に従えば解決したように思うが、今回はNG。

調べてみてEugeneの これ を発見。2020-03-01の記事だけど、大変ありがたい。Thanks a lot. 要するに「xcodebuildも再署名しなさい」ということ。再署名することでTeamIdentifierが’not set’になる。これで前手順で’not set’にしてしまったXcodeのTeamIdentifierと連携をとるということだろうか。このあたりの事情を説明するものをまだ見てはいないのだけど。とにかく、これで悩まされていたエラー表示は出なくなる。

$ sudo codesign -v -s XCodesigner -f --timestamp=none /Applications/Xcode.app/ \ Contents/Developer/usr/bin/xcodebuild

この処理は、XVimProjectのREADMEに加えるべきだと思う。

心拍の光学式センサーと胸センサーの返す値を比較する 8月29日, 2019


普段,光学式センサーで心拍を計測している。今日は以前から気になっていた事を実測してみた。それは,「手首で測る光学式センサーが示す値は,胸ベルト式のセンサーと同じだろうか」ということ。

ちょっとみっともないかもしれないが,時計を両腕につけ,一方は手首で測り(Garmin-ForeAthlete225j),もう一方は胸で測って(Polar-M200)80分ほど走ってみた。ゆるい上り下りのある周回コースを4周ほどしている。

Garminの計測間隔は不定なので,1秒毎の計測値が残るPolarと対照させる工夫が必要となる。図の左下のような表で, Garminの計測秒数によりPolarのデータを串刺しにしている。まあ,Garmin計測値の表にPolarの計測値を抜き出して加えている,といったところか。

一応の結論は「両者に差はない」としておこう。青線が手首, 緑線が胸。赤線は"青マイナス緑"。差の平均は0.56となり, 全般的に見れば差はないとしてもよいだろう。グラフの中央付近などに不自然な谷はあるが(最大の差は,光学式:116bpm,胸ベルト式:154bpm),理由は不明。また,今回の計測では全体的に光学式の数値が不安定に思えるが,その理由も不明だ。今後,繰り返して測ってみれば,もっと具体的な差異がわかってくるかもしれない。

心拍数ドリフトのこと 8月13日, 2019


運動を続けると, 体温の上昇とともに心拍数が徐々に上がっていく。たとえ自覚的運動強度が同じであっても, 心拍数は自然に上昇していく。Cardiovascular drift(CV drift)と呼ぶのだそうだ。その様子を確かめてみたいと思い, Garmin connectのデータを表示してみた。ここではある日のジョギングデータをtcxファイルにエクスポートし, 簡単なperlスクリプトで処理している。同じペースで軽く80分間ほど走ったグラフだ。

シェルからGeekletをリフレッシュする 3月19日, 2019


GeekToolでデスクトップを飾って遊んでいる。ちょっと必要があって, bashのスクリプトからGeekletをリフレッシュしたくなった。設定する秒数を指定する方法ではなく, 自分の思うタイミングで励起したいのだ。

まず思いつく単純なやり方として情報が多いのは, AppleScriptを利用してリフレッシュするものだ。

tell application “GeekTool Helper”
  tell geeklet id “vvvvvvvv-wwww-xxxx-yyyy-zzzzzzzzzzzz”
    refresh
  end tell
end tell

こんなAppleScriptを用意して,それをスクリプトから呼ぶわけだ。しかし, 考慮中のものは,Launchctlに起動されたbashスクリプトからGeekletを呼んでデスクトップに表示するものだ。単純化すれば,

■よくありそうな手順
・Launchctlからbashスクリプトを起動する
      ↓
・スクリプト内でGeekletをリフレッシュするために, "AppleScriptファイルを呼ぶ"
   /usr/bin/osascript  /Users/me/Library/Scripts/sample.scpt
      ↓
・AppleScriptがGeekletをリフレッシュする

このようにAppleScriptを介するのがちょっと不愉快に思ったのだ。それで「bashからGeekletを直接リフレッシュする」方法があるだろうと思って調べたが,簡単にはヒットしなかった。ここに書き留めておく意味もあるかもしれない。結論は簡単なことで, AppleScriptのファイルは不要。"Geekletを直接リフレッシュする"。

例えばこんな風に,
$ /usr/bin/osascript -e ‘tell application “GeekTool Helper”
    to refresh geeklet id “vvvvvvvv-wwww-xxxx-yyyy-zzzzzzzzzzzz”’

単純なことだった。この効用は, ターミナルから入力すれば確認できる。まあ, ファイルは不要とは言え, AppleScriptを用いることには変わらないのだけど。

【追記】icalBuddyのCatalinaへの対応 10月23日, 2019 GeekTool自身は問題なく動くのだが, 併用しているicalBuddyがNGとなった。不安定。「これは困った」と思っていたら早速対応してくれた方があった。 ここ のicalBuddy64.gitを使わせてもらう。 THANKS!

気温の日変化 1月12日, 2019


"ほぼ日課"で昼前に5km走っているけど(去年は こんな風), このところ寒いので服装を迷う。半袖Tシャツの上にフリースのジャケットを着るか, ウインドブレーカーを着るか。一応, MacBookProのデスクトップにGeekToolで表示している外気温を参考に上着を決めることにしている。

それでふと思ったのだけど, アメダスのデータって簡単に記録することができるかな? 観測データをファイルするのって面倒だろうか?

やってみた。

■機能
・東京の気温データ(北の丸公園)を毎時読み取ってログする。
■実行は
・Geektoolの表示を夜間もログしようと思ったことが発端だが, MacBookProで動かしたのではやはり不便。止めることもあるし, スリープさせないのも面倒。読み取りスクリプトは, Debianのサーバー上に置いて, cronで起動することにした。
・読み取りの頻度は60分おきで十分。でも暇なサーバーだし,15分毎に起動して遊んでみることにした。
■利用例
・動かした結果をNumbersで開いてみると, 下記のようなグラフを書くこともできる。
・ここでは時間変化を確かめてみたが, 毎日午前6時のデータを1ケ月貯めてみるのも面白いかもしれない。

table

SeilとSierra 1月7日, 2017


AquaSKKを便利に使用して随分になる。読み入力に入るためのシフトキーをスペースバーに割り当てることで,親指シフトキーボードのようにできるのも実に具合が良い。当然ながら,スペースバーを単独で押した場合にはスペースを出力するようにする。これも含めたキー置換をSeilとkarabinerに頼ってきた。ところが,年末にSierraにあげ,この置換が不可能になってしまった。keyhacを使う方法もあるようだが,どうも勝手がよくない。

そこで,当面, wwwjfy を頼ってだましだましだった。ところが,Version-0.90.73で大きな変更があった。「standalone_keysに指定できるのは交換されていないキーに限る」となったのだ。どう設定したよいか。目標は,「spacebarを,修飾キーとしてはシフトキーとし,単独キーとしてはスペースキーとする」こと。

やってみたら単純だった(下記に示しているのは該当行のみ)。

$ vi ~/.config/karabiner/karabiner.json

  "simple_modifications": {
    "caps_lock": "left_control",
    "spacebar": "right_shift"
  },
  "standalone_keys": {
    "spacebar": "spacebar",
    "caps_lock": "escape"
  }

irbの日本語(再) 12月14日, 2016


Xcodeのバージョンがあがった。readline-7.0も出ていたし,久しぶりにlibeditをlibreadlineに入れ替えることにしよう。作業の時に参照している メモ が古くなり,不適切な箇所も気になっていたので,まとめ直すことにする。(El Capitan/10.11.6)

■まず、readlineを再compile。

$ curl -O http://www.ring.gr.jp/pub/GNU/readline/readline-7.0.tar.gz
$ tar xzvf readline-7.0.tar.gz; cd readline-7.0
$ ./configure; make; sudo make install

■ライブラリの指定を確認する

$ cd /System/Library/Frameworks/Ruby.framework/Versions/2.0\
    /usr/lib/ruby/2.0.0/universal-darwin15/
$ otool -L readline.bundle | grep libedit
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)

このlibedit.3.dylibを/usr/local/lib/libreadline.dylibに入れ替えればよい。

■ライブラリの指定を入れ替える

$ sudo cp -p readline.bundle readline.bundle.BK
$ sudo install_name_tool -change \
    /usr/lib/libedit.3.dylib /usr/local/lib/libreadline.dylib \
    readline.bundle

■結果を確認する

$ otool -L readline.bundle | grep libreadline
    /usr/local/lib/libreadline.dylib (compatibility version 2.0.0, current version 3.0.0)
$ irb
irb(main):001:0> name="あ"
=> "あ"
irb(main):002:0> 

よし、OK//

【追記】irbのCatalinaへの対応 10月23日, 2019

irbが使えなくなった。「…Catalinaへの対応」というより「既存irbの放棄」だね。システムのRubyはWebby用に限定し, 遊びで使用するのは最新安定版(ruby-2.6.5)にすることにした。ソースをもらってきてコンパイル。ただし, このサイトを組み上げるのに使用しているWebbyは古いものなのでruby-1.8が必要。これまでOSのバージョンアップがあってもそのために古いrubyを温存してきている。ページの維持管理にはそちらを使用する。ちょっと面倒だけど, 自分でWebbyをupdateするよりは楽だろう。

readlineについてはreadline-8.0が"/usr/local"にいれてあるので, configureに指定することでirbの日本語の扱いには問題がなくなり, 上記のreadline.bundle関連のあれこれは不要になる。これで"alias irb=/usr/local/bin/irb"とでもしておけば普通にirbが使える。

ruby-2.6.5$ ./configure --with-readline-dir=/usr/local

ガーミンのデータを抜き出す 8月13日, 2016


GarminのEdge500とForeAthlete225Jを使用してきている。暑くなって、ゆったりジョギングでの心拍がやはり20bpmは上がったなと思いつつ、ひらめいた。Garmin connectに貯めているデータをまとめてダウンロードできないかな。

確かめると、Garmin connectでは、個々のアクティビティーのデータを得ることはできるが全データを一括して得る方法は無さそうだ。今更GarminのSDKにあたるのも何だし…。ただ、古いアプリケーションのGarmin Training Center(GTC)からであれば、「すべてのデータをエクスポート」する機能がある。

試しにForeAthleteをGTCに同期し、データをXMLでエクスポートしてみた。「すべてのTraining Centerデータ.tcx」というファイルができる。中身を見ると単純なXMLファイルの構造が読みとれる。そこで簡単なperlのスクリプトを書いてみた。

■機能
Lap毎のデータから、ID・時間(秒数)・距離(メートル)・平均心拍数(bpm)・平均ペース(分:秒/km)・平均ステップ(spm)をSTDOUTにCSVデータとして書き出すこと。
IDは、例えば、"2016-03-20T00:18:31Z"のように、スタート日時をUTCで示す文字列にした(日本のローカルタイムでは2016-03-20T09:18:31)。
■実行するには
スクリプト名称をtcx2csv.pl、データファイル名称をData.tcxとすると、
$ tcx2csv.pl Data.tcx | sort > RunningData.csv
■利用例
得られたCSVファイルをNumbersで開くと、例えばこのようなグラフを書くことができる(勿論、Execelに読み込むことも可能)。アクティビティの平均心拍数と平均ステップ数を表示してみたもの。

[追記 2020-03-10] Garmin Training Centerは古いものなので、現在では入手することができない。それにもうCatalinaでは動かないでしょう。

irbの日本語 2月17日, 2014


Mavericksになって、久しぶりにirbを起動してみたら日本語文字列が使用できない。これはirbが使用するlibeditが日本語を理解できないためらしい。解消する手順はネット上にも記事が多くさまざまな方法があるようで、要するにlibeditをGNUreadlineに入れ替えればよいということのよう。HomebrewやMacPortsを好まないのは少数派のようだな。以下は特にユニークな内容ではない自分用メモ。

■まず、日本語を理解してくれるGNUreadlineをcompile

$ mkdir work; cd work
$ curl -O http://www.ring.gr.jp/pub/GNU/readline/readline-6.2.tar.gz
$ tar xzvf readline-6.2.tar.gz; cd readline-6.2
$ ./configure CFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64"
$ sed -i "" -e 's|-dynamic|-dynamiclib|' -e 's|-arch_only `/usr/bin/arch`||' shlib/Makefile
$ make; sudo make install
$ ls -F /usr/local/lib/libreadline*
/usr/local/lib/libreadline.6.2.dylib*
/usr/local/lib/libreadline.6.dylib@
/usr/local/lib/libreadline.dylib@
/usr/local/lib/libreadline.a

■次に、libedit.3.dylibをつないでいるreadline.bundleを探す

$ find / -type f -name readline.bundle -print 2>/dev/null
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/
    universal-darwin13.0/readline.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
    universal-darwin13/readline.bundle

この’1.8’の下は以前のバージョンのものなので、’2.0’の下が問題のもののはず。

■ライブラリの指定を確認する

$ cd /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
     universal-darwin13/
$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby
        .2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

この/usr/lib/libedit.3.dylilbを/usr/local/lib/libreadline.6.dylibに変更すればよいはず。

■ライブラリの指定を入れ替える

$ sudo cp -p readline.bundle readline.bundle.BK
$ sudo install_name_tool -change \
    /usr/lib/libedit.3.dylib /usr/local/lib/libreadline.6.dylib \
    readline.bundle

■結果を確認する

$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
      (compatibility version 2.0.0, current version 2.0.0)
    /usr/local/lib/libreadline.6.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

■irbの動作確認

$ irb
irb(main):001:0> name="あ"
=> "あ"
irb(main):002:0> 

よし、OK//

連絡先.appのデータをExcelに読み込む 12月21日, 2013


Mavericksの連絡先.app-8.0(1365)になって、vCard書き出しの書式がわかりにくくなった。以前のスクリプトにちょっとした変更を加えて、自分にとってはまあ支障ない動作にした。場当たり的だけどね。ただし、配偶者(1名、当然か)以外に兄弟・知人が登録されている場合には、手を加えなければ想定通りに動かないのは以前と同様だ。

以前の記事 ;

gprolog-1.4.4 11月28日, 2013


Mavericks, Xcode5でgprolog-1.4.4にupdate。

$ curl -OR "http://gprolog.univ-paris1.fr/gprolog-1.4.4.tar.gz"

compileしてみたが、コンパイラが変ったことで以前のスイッチ類は効かない。また、それらを省いてただconfigureしても"Fatal Error"となる。

Fatal Error: Segmentation Violation (bad address: 0x0)
compilation failed
make[1]: *** [fd2c.o] Error 1
make: *** [all] Error 1

これはちょっと手こずるぞ。情報を探すうち、作者のDaniel Diazの「修正したソースをGitに置いた」という発言を発見。[ Source作者のGitの情報 ]

$ mkdir work;cd work
$ git clone git://git.code.sf.net/p/gprolog/code
$ cd code/src;
$ ./configure;make;make check
$ sudo make install

得られるソースに含まれていないconfigureと一部のdocは配布パッケージからcpした。"All tests succeeded"で、これにてOKとなった。

Mavericksの不体裁:Login画面の入力メニュー 10月28日, 2013


OSのメジャーアップデートは、しばらく様子見することが多いのだが、"無料"にひかれて即座にOSを上げた。[Finder環境設定]>[タグ]の文字列"サイドバーに表示すタグ:"のような不体裁が残っていて、ローカライズのこととは言え、製品の最終点検確認の手順がどうなっているのかな。アマチュアが作ったみたいだ。

ログインウインドウで名前とパスワードを入力する設定にしているが、["ユーザーとグループ"環境設定]で、[ログインオプション]の"ログインウインドウに入力メニューを表示"のチェックボックスが機能しなくなった。チェックを外しても、"ことえり"の「英字・ひらがな・カタカナ」の入力メニューが表示される。(以下削除)

[追記 2014-02-28]: 誤った内容を削除した。ログインオプションの設定通りに起動しない場合、’/Library/Preferences/com.apple.HIToolbox.plist’が不適切なのだから、それを単純に削除すればいいことに気づいた。

Login画面&Webby再設定 3月1日, 2013


OSをあげて、あれこれ雑事で遊ぶ。その中からメモ2項目。

Login画面を’名前’と’パスワード’の入力にしているのだが、Mountain LionでIDを入力しようとするとFEPが動くようになった。「’ことえり’は切っているのに変だ。単純に英数字を入力したい。どこで設定しているのだろう」としばらく悩む。Netでもそれらしい記事を発見できず、そのうち、Appleの説明を読んでいて気づいた。方法は以下。

ログインオプションで’ログインウインドウに入力メニューを表示’を選んだ上でログアウト。表示された入力メニューで’このリソースを削除’する。

単純なことだった。でも、なんでこんな動作をdefaultにしたのだろう。「さまざまなユーザーの便宜を考慮して」かな。余計な手間に思える。

それと、クリーンインストールしたのを機会に、Webbyを再度インストールし直してみた。あれこれのゴミもたまっているのでね。ソースは ここ からもらう。このところの更新はやはりない。でも目下はOK、まだ動く。これがNGになったらサイトの構築手順をどうするか悩みそうだが当面はよしとしよう。

DBD-mysql-4.022のupdate 2月1日, 2013


ここにあるのは自分自身のメモです。MacPortsやHomebrewを好まず、むしろ手数がかかるのを楽しんでいます。基本は「今目の前で動けばよい」ということ。MacBook Proで遊んでいます。

Lion既存のものとは別に、最新版のDBIを/usr/localにインストールしたメモ。

OS X 10.7.5
Xcode 4.6(Command Line Tools)
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Applications/Xcode.app/
    Contents/Developer/usr/bin:/usr/local/mysql/bin
DYLD_LIBRARY_PATH=/usr/local/mysql/lib:/usr/local/lib

DBI-1.623
$ perl Makefile.PL; make; make test; sudo make install

DBD-mysql-4.022
$ perl Makefile.PL; make; make test;
t/80procs.tをfail。

t/80procs.t ................. 1/29 DBD::mysql::db do failed: Cannot load
from mysql.proc. The table is probably corrupted at t/80procs.t line 41.

テストスクリプトを見ると、"drop procedure if exist"の箇所だ。手で繋いでみると、DBのtestは空だし失敗などするはずがないのだけど…。あっ、最近MySQLを5.5.29にupdateしたけど、長いことテーブルをupgradeをしていなかった。 参照

$ sudo mysql_upgrade -p

これで再度"80procs.t"も含めて全テストにパス。OK。

MySQL-5.5.29をソースからコンパイル 1月31日, 2013


MySQL-5.1.44が古くなったのでupdate。バイナリーをインストールしてみたが、"Server characterset"が latin1でコンパイルされている。この先文字コードの扱いが面倒になりそうなので、ソースから。

Mysql-5.5.29.tar.gz(64bit版)を ここ からもらって展開すると…あれconfigureが無い。これは cmake なる道具を使うようになったためとのこと。バイナリーがあるので、それをインストール。

全データベースをダンプし、/usr/local/mysql-5.1.44/dataも一応バックアップして

$ cmake . -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_unicode_ci
$ make
$ make test
$ sudo make install

testもすべてok。

[追記 2013-03-03]: Mountain LionでMySQL-5.6.10に上げたところ、上記はNG。’Segmentation fault’を吐いて止まってしまう。環境が問題なのかもしれないがよくわからず面倒でもあり、バイナリーを入れた上で、my.cnfに’character-set-server=utf8’を加えることでよしとした。

単純な構造のXMLからエレメントを抜き出す 4月27日, 2012


GPXデータのtrkpt要素を抜き出し、time要素を読み取って処理することで遊ぶうち、その一部は幾分かでも汎用的なものにしておいて後日に備えようという気になった。XMLのうち、ごくシンプルな構造のものであればそれほど手もかからないという読みだ。

エレメントの名称と対象のXMLファイルを指定すると、そのエレメントの内容を表示する単純なperlのスクリプトだ。XMLでは、ツリー構造の各レベルに同一名称のエレメントが存在している場合がある。ここではそのレベルの違いを無視し、名称で全てを抜き出してくる。特徴は、XMLモジュールを用いず、正規表現でマッチさせている点にあるだろう。ただし、私の関心は身の回りにある ごく単純な構造のXMLファイル にあるので、それなりに複雑でサイズも大きい純然たるXMLには対応できないだろうと思う。また、XML宣言部分や全角のタグ名称についてはここでは考慮していない。

スクリプトでは、複数行マッチをさせる関係から予め全てを文字列に読み込んでしまう。サブルーチンでそこから該当エレメントを配列に抜き出させ、その配列を表示している。この表示部分を加工すれば、後日何かに適応できるのではないかという目算だ。でも何ができるかわからないけどね。サブルーチンで、マッチングをとるのにちょっと格好悪い’or’があるのは、<tag…/>を処理するためのもの。そこでは属性にデータがあり終了タグが省かれている。どうも私はXMLを充分に理解していないなあ。とにかくそれに対応している。見るからに効率も悪そうだしエレガントではないのだが、わが要求からすれば充分に機能を果たしてくれる(はず)。

$ ./extract_element.pl ElementName From.xml

ElementNameが抜き出すエレメント名、From.xmlが対象のXMLファイル名。

[追記 2014-02-13]: タイポが残っていた。訂正。まじめに動作確認もしなかったようだ。それと、’plist’をこれでいじっていたら、単純な構造であっても同名のエレメントが内部に存在すると処理できないこと、awkなら同名エレメント以外簡単に処理することに気づいた。

$ awk '/<ElementName>/,/\/ElementName>/ {print}' From.xml

今更だね。GPXのデータを見ている時、なぜこんな簡単なことに気づかなかったのだろう。執着すると離れて考えられなくなる典型だな。

GPXデータをスリムにする 4月23日, 2012


GPSロガーないしは、サイコンの話です。gpxデータのポイント数が多い場合、例えばルートラボなどにインポートしようとすると8,000ポイントの制限を越えてしまって、保存することができませんよね。以下は、それを削ることに関して、自分ではこうするということを簡単にまとめたものです。Lionのシステム既存のrubyで処理しています。環境が変ればこのままではうまくいかないかもしれません。例によって、自分の目の前で必要な処理ができればよい、というスタンスで考えたものですが、同じような環境の方なら多分同じ動きをするはずです。

今、試しにgpxのファイルをエディターで開いてみると、それが単純なXMLファイルであることがわかります。各ポイントデータは<trkpt>と</trkpt>のタグで囲まれ、その下位の<time>タグにUTCで表現された時間データが記録されています。試しにのぞいたものは、4秒毎にデータを取得していて毎分15ポイント。走行時間が10時間の遠出ではデータが9,000ポイントにもなります。ここはひとつ思い切って毎分1ポイントにスリム化してしまいましょう。

スクリプトではREXMLライブラリを使用して、分毎の重複するエレメントを削除しています。ごく短い純朴なもので、かなり遅いのですが、ちゃんと処理してくれます。手元のデータをスリム化した例では、10,000ポイントを少し越えるものを1,000ポイント以下まで削ってくれました。ここまで削る必要はありませんが、まあ今時スリムにこしたことはないでしょう。遅さは驚く程です。3〜4分はかかるのを覚悟して動かします。そう頻繁に使うものではないし、短時間で簡単に書けるスクリプトの方がありがたいといういつもの発想です。

point_reducer.rbのfile_nameに編集対象ファイル名を指定した上で、
$ ./point_reducer.rb | sed '/^ *$/d' > OUT.gpx

delete_elementした結果の空白行をsedを通して削っています。簡単なのがなにより。結果はOUT.gpxにリダイレクトしています。

上記をまとめたあと、思いたってperlでも挑戦してみた。XMLモジュールは用いずに、高校生のように素朴にパターンマッチで処理した。別にperlに慣れているわけでもないのでね。上記と同様に毎分1ポイントにスリム化し、Rubyの動作確認に使用したのと同一の10,000ポイントを越えるデータを処理してみたところ、処理に要した時間は驚きのもの。timeコマンドの出力で0m0.093s。あまりに速いので、気づかない手抜かりでもしているのではないかと心配で、Rubyでやったものと比較してみると、Byte数・行数は同一。これで安心と思いつつも、念押しのdiff。無論同一となるとの予想に反し行数と同じくらいの数のズレを指摘された。いやあ、ミスしたかなとソースと目で比べてみると意外や意外。RubyのREXMLライブラリーを使用したものは、属性の配列順序がソースと異なるのだ。何か指定しなければいけなかったかなあ、ライブラリー内部ではハッシュが返す値を用いて再構成しているのかな、複雑なことをやっているのだろうなあなどと思いつつ、中心としていたtrkpt要素については全く影響がないことなのでいいことにした。今後はperlの方を使おう。

$ ./reduce_point.pl GPX.gpx > REDUCED.gpx

GPX.gpxがソースファイル名、REDUCED.gpxが出力先ファイル名。

[追記 2012-08-14]: 上記perlスクリプトについて、timeタグのフォーマットが異なるロガーがあることに気づいたので、16行目の正規表現に手を加えた。

Xcode-4.3.2のCommand Line Tools 4月19日, 2012


Xcodeをupdateして4.3.2となった。gemに必要なので、Command Line ToolsをXcodeのPreferences>Downloads>Componentsからインストールしようとしても、Checksum Errorで失敗する。これは僕の環境で起こるだけなのだろうか。ここで得るファイルにミスがあるせいではないのか。このエラーは、discussionsjapan.apple.comには何の情報も無いが、discussions.apple.comにはかなりの情報があるのだけど。とにかくそれに従って上の方法を捨て、直接Developer ConnectionからLate March 2012を手動でダウンロード。このファイルはOKだった。いったいどういうことなのだろうか。不思議だ。

FlushとSafari 4月17日, 2012


Lion になって起動できなくなったClassic・PowerPCのアプリケーションやフレームワークなどを一掃した。これまでのメジャーアップデートの時、まっさらインストールをしてこなかったのでね。それもあり、動作確認のためにConsole.appを動かし"すべてのメッセージ"をながめることが多くなって気づいた点を2つ。

最も気になる点は、Flush Playerプラグインに関連してkernelが吐くエラー。

kernel [0] : IOSurface: buffer allocation size is zero

このプラグインを外せば出なくなることで因果関係は確かめられるが、かなりログを消費している。この件は ここ に最新のまとめがある。Safariと同じくWebkitを使用するChromeでも同様の警告が出るが、GeckoのFirefoxでは出ない。どうやらWebkitとFlushとの連動にそもそもの原因があるようだ。これを開発に当たっている人たちは充分承知しているだろうに、なぜ解決しないのだろうか、不思議だ。対処方法は、プラグインを外す以外にない(だろう、多分)。

実は、さらにログを浪費しているのは、32bitアプリケーションが動く際に出る警告。試しにConsole.appを32bitモードで起動すると、

Console: Warning – conversion from 64 bit to 32 bit integral value requested within NSPortCoder, but the 64 bit value 9223372036854775807 cannot be represented by a 32 bit value

これはわがMacBookProが初期のもので(MA609J/A)、64bitのcpuを載せていながら、EFIが32bitであるため中途半端な状態で動いているためかもしれない。しかし、愛用のCotEditorなど、毎秒20行以上もこれが出力されたりするのだからひどい。syslogのレベルを変更して出力を押さえたりもしてはいるものの、警告を発して無駄に動いていること自身はどうしようもなく気分が良くない。元々が速くはないマシンなので、何とかならないものか。困った。こちらの対処方法は、見なかったことにして無視するか、グチを言う以外に無い。

[追記 2012-04-19]: CotEditorやMacJournalなどの常用アプリケーションでconversionの警告が大量に出る原因を勘違いしていた。このwarningの原因は、AquaSKKにあるようだ。性に合うので気に入って長らく使ってきていて、他のwindowsなマシンやことえりなMacに向かった時でも、反射的にスペースキーやqキーを押してしまうほど。Lionに上げた後も、これが無事に動くので喜んでいたのも束の間、警告の固まりとなってしまった。途方に暮れてしまうよ。

Finderのプレビュー欄の日本語文字列 4月12日, 2012


遅まきながら Lion にした。ほとんどの主要なアプリケーションに問題はなかったが、楽譜清書の Sibelius4 はやはり古かった。Updateせずに満足して使っていたのに Lion には非対応。結構な出費と相当なダウンロード時間で(サウンドデータが30GB以上もある)、何とか Sibelius7 に生まれ変わった。よしよし。

あれこれいじっている中で気づいたことを1点だけ。それは、ファインダー/ Finder をカラム表示にした時のプレビュー欄に関して。ファイルを選択すると、ファイルの名前・種類・サイズ・作成日・その他の情報とともにアイコンが表示されるのだけど、 Lion では、テキストファイルについては内容そのものが読み易いサイズのフォントで、しかもスクロールバー付きで表示されるようになった。内容を手軽に見ることができ、クイックルック/ QuickLook する必要もない。ちょっと大きなファイルでは表示可能量に制限があるようだが、必要なら"ちょん"とスペースキーを押せばテキストの全体が表示されるのだし問題ない。

Desktop にメモを散らしているので、それらをざっと見渡す場合などにとても便利。ただ、必要があって ruby のソースを開こうとして気づいた。ファイルに書き込んである日本語文字列が化ける。



スクリプトの多くには、作成時の意図や使用法の要点などをメモしているのでこれが読めれば更に便利なのに。UTI(Uniform Type Identifier)のpublic.plain-text(Text.qlgenerator)ではOKなのに、その下位のpublic.source-codeで文字が化けるわけだから、SourceCode.qlgeneratorが使用するEncodingに関連するように思える。解決にはちょと時間が必要かな。当面の逃げは単純にソースコードの表示加工を止めてしまえばいいか。

/Developer/Applications/Xcode.app/Contents/Library/
     QuickLook/SourceCode.qlgenerator の名前を変更し、
$ qlmanage -r

〜SourceCode.qlgeneratorBK にしておく。プログラム用のソースコードに相応したカラーリングが行なわれなくなるし、logにエラーが残るが、得られるものの方が大きい。カラーリングだけならQLColorCode.qlgeneratorもあるのだけれど…。まあ当面これで充分としよう。Xcodeなどで色を付けたくなったら上の " BK "を削るだけだし。

なお、日本語表示に使用されるフォントの種類やサイズを変更する簡単な方法については、 こちら に説明されています(別サイトに飛びます)。

[追記 2012-04-16]: syslogに次のエラーが数多く記録されるようになる。

quicklookd:
Can’t get plugin bundle info at file://localhost/Developer/Applications/Xcode.app/Contents/
Library/QuickLook/SourceCode.qlgenerator

これが気になる場合は、

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/ LaunchServices.framework/Versions/A/Support/lsregister -f /Developer/ Applications/Xcode.app

まるでおまじないだね( Source )。

Ritchie氏の訃報を聞いて 10月14日, 2011


"カーニハン&リッチ"のリッチ氏が数日前に亡くなったとのこと。Source

新聞やTVのニュースで、どこかでは伝えているのかもしれないが、少くとも私の見ている時間には全く触れないのが大変意外に思える。最近の活躍ぶりについては門外漢ではあるが、今使っているMacもUNIXで動いているし、世界中のコンピュータのどれくらいがその恩恵を受けたのだろうか。私自身も本でもCそのものでも、大変楽しませてもらった。少々大袈裟かもしれないが、わが人生を豊かにしてくれたと思う。ご冥福をお祈りする。

Cyberduck-402不可視ファイルの表示 6月6日, 2011


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル, dotfile)を表示するように設定しても見えない場合の対処を以前まとめましたが、その後のupdateに伴ないプロパティー名が変更されたようなので再々度書きます。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.command.stat false
$defaults write ch.sudo.cyberduck ftp.command.mlsd false

と入力する。私が使用しているサーバーの中には、相性がよくないためかCyberduckのデフォルトの状態ではうまく機能しないものが混じっています。上記は、Cyberduckがサーバーからファイルリストを得るのに発行するコマンドの順序(STAT→MLSD→LIST -a→LIST)を修正して、"LIST -a"に固定するものです。 Source

Chromeとiframe & window.open with Hash(#) 1月22日, 2011


Safariを使っているので気づかなかったけど、Google Chromeを使うと起こる不思議な違いに出くわした。inline frame中からポップアップwindowを開くのに、

function test_open(url) {
  window.open(url, "popup", "width=300, height=30");  
}
-----
<a href="testData1.html#flg" target="popup"
 onclick="test_open(this);return false;">吾輩は猫であるN</a>

こんな形で呼ぶ時、Chromeでは、flg=flg1が普通に成功するように見えるのに、それ以外は探し損なう。これはSafariの動作とは異なる。

なぜだろう。理解できるまでは当面下記でしのぐか、2度開くのはちょっと無様だけど。

function test_open(url, position) {
  var win = window.open(url, "popup", "width=300, height=30");
  url += position;
  win.open(url, "popup");
}

[追記 2012-12-30]: 以前のバージョンでは2度開きでしのげていたので気づかずにいたが、久しぶりにチェックしたところ、Chrome-23.0.1271.101ではこの逃げもきかないようになっていた。同期に関連する問題だろう。Chromeは使っていないからいいことにしようと思いつつ、一応の手当はしておこう。親でハッシュタグをグローバル変数(下記ではshowme)に置いて、子からwindow.onloadで読むことにした。動作が不安定なのでsetTimeoutしている。

function init() {
    location.hash = ''; //何故か不可欠のこともあり不安定
    location.hash = opener.showme;
}
// window.onload = init; //何故かNGのこともあり不安定
window.onload = setTimeout(init, 100);

不安定だが、これが本来の手順に近いだろうししょうがない、ということでこんな風…

[再度追記 2013-01-05]: 「しょうがない」という中途半端な上の方法は止めた。ちょっと大きなページを読み込むと、ハッシュタグを探すのに成功したり失敗したりと動作が不安定になる。もうこの方法はあきらめ、タグ位置からの表示したいIDブロックを切り抜いてbodyと入れ替えよう。自分の環境では、Chromeへの対応としては、ポップアップを無くさない限りこれが最善のようだ。呼ばれる側で下記のように自分のbodyを書き換える。sliceしているのは、’#’がついてくる状況なので削っているもの。Safari, Chrome, Firefox, Operaで動作OKを確認した。

function init(){
      document.body.innerHTML =
           document.getElementById(opener.showme.slice(1)).innerHTML;
}
window.onload = init;



MTのデフォルト日付書式の変更 01月03日, 2011


このところ必要があって久しぶりにMovable Typeをいじらなければならなくなって困りました。以前のバージョンでは、システムの日付書式を設定する箇所があったように覚えているのですが、違ったかなあ。システムをアップデートしたら、ポスト日付等のフォーマットが使用言語によって自動で設定され、それが"2011年1月1日"のような形式となっていて、この書式はどうもNGなのです。変更するには個別のシステム・テンプレートを一つひとつ変更しなければならないようで、エレガントではないなあ。

バージョンは5.04です。探してみると、lib/MT/Util.pmに

line:1512-
"%Y年%b月%e日 %H:%M",
"%Y年%b月%e日",
"%Y年%b月",
"%b月%e日",

とあります。これを変えればいいのだ。

"%Y/%m/%d %H%M",
"%Y/%m/%d",
"%Y年%m月",
"%m月%d日",

これならまあよいか。再構築してみたところ、これでOKでした。ただ、今後のバージョンアップでは要注意かと。

魔方陣の枝刈りのこと 04月13日, 2010


ダン・ブラウン「ロスト・シンボル」に4x4の魔方陣の話がでてきます。まだ読んでいない方もあるでしょうが、謎解きに関わる事柄とは違うので、ネタバレでもないでしょうからかまわず書きますと、デューラーの版画に見えている魔方陣なのです。縱、横、ななめ、四隅、各隅4桝、中央4桝の合計が一致する魔方陣です。「不可能とも思える」魔方陣に驚嘆し興奮するラングドンとキャサリンの様子を読んだ時、これはそれほど難しい魔方陣なのだろうか、と思ったことが発端です。

別解を探してみることにしました。rubyやperlでも組めるでしょうが、こんな場合は、LISPのカッコだらけの記述は、どうも好みではないので、やはりprologに味があります。適当に述語を並べた時にパッと動き出す爽快感は、力技で多重ループをやっと抜け出すのとは全然違います。

最初は、permutationで探索するありふれた方法を試したのですが、残念なことに終了しません。チェックする枝が多すぎて、私のMacBookでは力が足りないのです。単純に計算すれば、20兆もあるので、力不足を嘆いても無理というもの。そこでNet上ではあまり見かけない枝刈りを工夫してみました。prologは、GNUのprolog-1.3.2を用い、ローカルな述語はほとんどありませんが、解を数えるのにglobal変数を利用しています。リスト中のsequentialは、自然数の並びを得る(1,2,3…)もので、16個の数字入力をさぼっただけです。deletesは、deleteを利用してリスト中の要素を別リストから削除します。これが枝刈りの根幹部分でしょう。permutationの代わりにcombinationで4桁ずつ題意に合うリストを発生させています。さて、「ロスト・シンボル」の主旨に従って下段の中2桝を(15,14)と指定した上で解を得ると、29秒後に解答は16個もあり、本に登場するのは12番目の解でした。以外に多い。満足、満足。

deletes(X, [], X).
deletes(L, [H|Ls], X) :-
    delete(L, H, X1),
    deletes(X1, Ls, X).

combination(0, _, []).
combination(N, [X | Xs], [X | Zs]) :-
    N > 0, N1 is N - 1, combination(N1, Xs, Zs).
combination(N, [_ | Xs], Zs) :- N > 0, combination(N, Xs, Zs).

sequential(I, N, []):- I > N.
sequential(I, N, [I|L1]):-
    I =< N, I1 is I + 1,
    sequential(I1, N, L1).

dan.pl

gprolog-1.3.2のconfigure 04月10日, 2010


Prologとしては、昔のProlog KABAが懐しく、MacBookにはB-Prologを入れていました。
ルービック・キューブの変形の2×3のキューブを解こうと思いたって、いじり始めて、GNUのprologがあることを知り、gprolog-1.3.1をconfigureしてみたのですが、foreign.wamでアセンブラからのエラーが止められません。

Netでこのエラーがソースのバグによるもので、2009年11月20日の開発途中バージョンでは修正されているとのコメントを読み(Source)、2010年3月の最新不安定版1.3.2をconfigureしました。OKでした。

$ wget http://gprolog.univ-paris1.fr/unstable/gprolog-20100322.tgz
$ CFLAGS="-arch i386 -DHAVE_CONFIG_H" \
    LDFLAGS="-dynamic -L/usr/lib -lm" ./configure
$ make; make check; sudo make install

tree.rb 03月25日, 2010


懐しのtree.cをRubyで組んでみたのですが、ちょっと長いなあ。ディレクトリツリーだけでは面白くないので、ディレクトリサイズ・ファイルサイズも表示し、サイズは`ls -l`の出力にならってバイト単位にしました。もっと短かくできるかと思ったのですが、長いスクリプトになってしまいました。ファイルのタイムスタンプやモードを表示したり、オプションスイッチも指定できるようにしたり、まだまだ遊ぶ余地はたくさんありますが、保留のまま。’- d’とすればディレクトリだけを表示するのもいいなあ。

$ tree contrib/
/Users/manontanto/contrib
|---   3681:---
|---   1586:htaccess
|---   1568:smokey.sample.conf
|---    425:README
|---    102:packaging
      |---     136:---
      |---     136:Quadra
            |---    6503:---
            |---    6276:xyzQdcba.spec
            |---     227:xyzQdcba.conf

こんな表示です。"3681:—-“など”—-"が続く数字は、ディレクトリ内ファイルサイズの合計です。

tree.rb

パッケージのuninstall 03月22日, 2010


パッケージがインストールしたファイルを全て削除したくなった時、あなたならどうします?
uninstallerが含まれていれば苦労も無いのですが。/usr/local/binから除くのはいいとしても、関連するライブラリやmanを中心としたドキュメント、フレームワーク等散っているあれこれをきれいに削除したい場合は途方にくれてしまいます。こんな場合のことを、ネットを探して見つけました。まず、再度インストーラ・パッケージを入手した上で、

$ xar -xf PACKAGE名.pkg
$ lsbom PACKAGE名.pkg/Bom > FILE_LIST

とすると、ファイルの一覧を得られます。後は手作業で削除していくなり、スクリプトを組んでザッと消すなりきれいさっぱり。爽やかな気分になれます。 Source
追記: スクリプトを組むまでもないのに気づきました。 "for x in `cat FILE_LIST`; do [ -f $x ] && rm $x;done" でいけますかね。手短かにパイプでも処理できますが、削除なのでね。また、sudoが必要な場合が多いでしょうから、直前にsudo lsとかしておいてsudo rmするかな。

MySQL-5.1.44のmysql_client_testにfailure 03月08日, 2010


しばらくMySQLを上げていなかったので、久しぶりにupdateしました。

CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer"  \
CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \
   -fno-exceptions-fno-rtti" \
   ./configure --prefix=/usr/local/mysql-5.1.44 --with-charset=utf8 \
   --with-collation=utf8_general_ci --enable-thread-safe-client \
   --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static \
   --localstatedir=/usr/local/mysql-5.1.44/data --enable-local-infile \
   --with-readline

ところが、 make test するとすぐに mysql_client_test でfailureになります。前回のコンパイル(5.0.51a)では難無く通過した所です。どうやら with-charset=utf8 がいけないようで with-extra-charsets=complex と入れ替えることで長時間(30分くらい)のtestすべてを無事通過しました。やれやれ。
Source

Webbyでページを組み立て直しました 02月11日, 2010


Textile, RedClothの記法が便利。発端は、 MacRuby » Home に寄った時に、そのページのできに感心したからです。installしてみると、見た目以上に魅力的な要素がたくさんありそうで、しばらくこれで遊べそうです。

AquaSKK-4.0の変換後文字列末尾の削除 09月27日, 2009


AquaSKKを大変便利に利用させてもらっています。単漢字を入力する機会が多く、例えば「苟」字が必要だと、「▽いやしくも」から「▼苟も」を得て「Ctrl+H」するような使い方をしてきたのですが、最近のversion upでこのControl+Hの挙動が変更になり、末尾1文字の削除ができなくなってしまいました。しばらくは「Fun Input Toy」で単漢字入力してしのいできたのですが、モードの移動がやや面倒。AquaSKKの新しい設定ファイルを見ているうちに、以下の方法で可能なことに気がつきました。

~/Library/Application\ Support/AquaSKK/keymap.conf を以下のように修正します。

-SKK_ENTER group::hex::0×03,0×0a,0×0dllctrl::m
-SKK_BACKSPACE hex::0×08llctrl::h
-PseudoHandled ctrl::lllhex::0×1b
+SKK_ENTER group::hex::0×03,0×0a,0×0dllgroup::ctrl::m,h
+SKK_BACKSPACE hex::0×08
+PseudoHandled group::ctrl::l,hllhex::0×1b

これは、「候補文字列を確定するキー」と「未処理としてアプリケーションに渡すキー」に「Ctrl+H」を追加し、「入力文字列に戻るキー」から「Ctrl+H」を除くものです。最善の方法とは思えませんが、一応これで以前とほぼ同じように使えます。以前の「skk-delete-implies-kakutei」のconfigへの設定に当る方法がわかればそちらがよりよいように思えるのですが、結びつく情報が見当たりません。

Cyberduck-3.3.b2 不可視ファイルの表示 09月22日, 2009


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル, dotfile)を表示するように設定しても見えない場合の対処を以前まとめましたが、その後のupdateに伴なう変更について再度書きます。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.sendStatListCommand false
$defaults write ch.sudo.cyberduck ftp.sendExtendedListCommand true
$defaults write ch.sudo.cyberduck ftp.sendMlsdCommand false

と入力する。どうも私の使用しているサーバーは、Cyberduckと相性がよくないようで、Cyberduckデフォルトの状態ではうまく機能しません。上記は、強制的にそのロジックを修正するものです。

追記:

Cyberduck-3.3.b4 が出ましたね。無事動いています。
Cyberduck-4.0.2 の動作については 別記 があります。

全角文字混在の正規表現を使った検索 05月12日, 2009


下に挙げた検索スクリプトで全角文字列を検索する場合、コマンド行からのargumentに全角文字混在の正規表現を指定したらどうなるかを試して遊んだところ、asciiが可能なのは当然としても、全角でもどうということなくパターンマッチしてくれることに感動。結構便利です。少し大き目の標準テキストの文書を検索する時など、エディターを起動せずに済みますし、正規表現で絞れる分快適です。ちょうどegrep -r の表示カスタマイズ版のようなものとして動きます。

検索語は、シェルの解釈がじゃまになるので、シングルクオートでくくります。結構おもしろい世界なので、さらに置換にも進めて遊ぼうかと思いつつ、マッチ部分の赤字処理と表示の桁数cut処理で泥まみれになりそうな予感がして未着手です。

$ myfind public/予定表/ '^\s+.*?\d月\d\d日'

ホームページ上の文字列検索・置換 05月03日, 2009


Net上には、Linuxの類似の記事やperlをめぐる一般論をよく見かけますし、魅力的なページも数多く、大変参考になります。しかし、OS X上に限定した記事は多くはないように思え、いざ何かで実際に利用しようとすると、他のOSの暗黙の前提となっている事項が理解できずに無駄に時間を過ごしてしまいます。ここでは、Leopardの perl-5.8.8 をターミナル.appから使う環境でスクリプトと遊んでいる身として、自分用メモの意味合いを中心にポツポツと書きとめていこうと思っています。

私は、ページのタグを手で素朴に入力しているので、メニューの表現変更などで全ページにわたって同一文字列を変更しなければならない際はかなり神経を使います。
$find ./ -type f -name \*.html -exec perl -ne ' if(/$word/) {$d="$ARGV$.\n$_";print $d}' {} \;
などで修正箇所を確認した上で、
$find ./ -type f -name \*.html -exec perl -i -pe 's/$SearchWord/$ReplaceWord/' {} \;
のようにして置換することが多いのですが、毎回この長いコマンドを手入力をしなくて済むように、しかも対話型で置換のスクリプトを用意しておきたいと思いたち、perlで遊んだものが下記です。File::Findを使って、findの場合と類似の処理をしています。バッファを使用して対話の中で元ファイルを書き直すことくらいは工夫したのですが、どうもperlらしくなく、Cのプログラムのようになってしまったのが幾分残念。でもまあ当面は使えそうです。

スクリプトには [検索開始ディレクトリ( default:./ )] 検索語、置換語を argumentに与えます。マッチ箇所を赤字で表示した後、置換の選択に入り、個々の候補について置換するか次に進むかを選びます。しばらくは、起動前にデータをbackupしておいた方が安心ですね。エンコードに関わる処置が万全ではないので、私の環境でないと動かないものと思われますが、Leopardでターミナル.appから呼ぶのならこのままで普通に動作するでしょう。

ついでに検索のみのものも挙げておきます。「原型」ではマッチ行が長い場合に不便なので、「別案」は表示をちょっとだけ工夫し、検索語直前の40カラム分(全角のみなら20文字)と直後40カラム分を切り取って表示するものです。ただ、検索語に正規表現を用いた場合でマッチ部分が長い場合や、そもそも検索語自身が長い場合については切り詰められずそのままが出力されます。要するに、マッチ部前方文字列($`)と後方文字列($’)を全角・半角を判断して左へ、あるいは右へ切り詰めているだけで、マッチ部そのもの($&)は操作していないためです。これを詰めると不便でしょう、たぶん。

Cyberduck-3.1.2 不可視ファイルの表示 04月22日, 2009


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル,dotfile)を表示するようにしても見えない場合の対処です。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.sendStatListCommand false

と入力する。

Cyberduckは、サーバーからファイルリストを得るのに[STAT | LIST -a | LIST]のコマンドをこの順で発行するのですが、サーバーによってはうまく機能しない場合があるようです。そこで、強制的にこのロジックを修正する方法の一つが上記のものです。 Source

追記 06月01日, 2009 :Cyberduck-3.2になって、上記sourceにある動作の優先順位が変更されたようですね。changelogに、"Support for directory listings using MLSD"とあるのを「使えるようになった」だけだと誤解していました。MLSDが最優先になったのですね。私の環境では、このままではNGなので、
"defaults write ch.sudo.cyberduck ftp.sendMlsdListCommand false" と止めてしまいました。

追記 :Cyberduck-4.0.2の動作については 別記 があります。

VMWare Fusionのデーモンを止める 04月22日, 2009


普段使わないのにVMWareのデーモンが、Macを起動する度に6個も起動されるのがいやで、調べました。psで見ると、このデーモンは単純にlaunchdが起動しているようです。そのplistをいじればよさそう。

/Library/LaunchDaemons/com.vmware.launchd.vmware.plistの"RunAtLoad" keyを “true” から “false” に変更する。

ただ、この方法では、VMWareを起動したい時には、このplistを再設定した上でOSを再起動しなければなりません。私自身はめったに使わないので、これで特に不自由はないのですが、ここを修正してあることを忘れてしまいそうで、「なぜVMWareが起動しないのだろう? 壊れたかな?」と悩みそうです。ここに書きとめておけば、多分忘れることはないでしょう。

アドレスブックのデータをExcelに読み込む 11月03日, 2008


アドレスブックがエクスポートできる形式は vCardに限られています。そのため、Windowsな仲間に住所をExcelの表にして渡したいことがあると、従来は、vCard2.0に書き出して宛名職人(ver.14以前)に渡し、そこからcsvでエクスポートしたものを読み込んでいました。しかし、宛名職人がver.15となり、これまでの手順では、メモ欄や配偶者欄が捨てられてしまいます。

また、Numbersには、アドレスブックから簡単に表を作る機能があるのですが、配偶者データを読み込みません。(名前、郵便番号、住所、メモその他多くの欄は実に簡単に読み込んでくれるのですが。)

そこで、アドレスブックから書き出したvCard.vcf(ver.3.0)ファイルからメモ欄・配偶者欄も含めて必要な欄をExcelに読み込むために簡単なperlスクリプトを組んでみました。

スクリプトは、vCard.vcfの姓よみ・姓・名・姓名・自宅郵便番号・自宅住所・配偶者・メモを切り出し、stdoutに書くだけの単純なものです。(vCardの書式が変更されれば手直しが必要となりますし、当然必要と思われるさまざまな確認やエラー処理などは省略されていて、今自分の目の前で動けばよいとしているものです。)

手順:
・アドレスブックからグループのデータをvCard(vCard.vcf)に書き出す。
・スクリプトをvCardのフォルダーに置き、ターミナルから $./vcf2csv.pl | nkf -s >out.csv とする。
・Excelからこのファイルをインポートする。

nkfを使用しない場合は ShiftJisしか読まないExcelに合わせるため、 miTextBatchConv , MultiTextConverter などを使います。住所は自宅住所を見ています。勤務先住所を見るには、スクリプトの"HOME"を"WORK"に直します。両方を見るようにすることもできますね。 スクリプトは骨格のみのごく純朴なものです。もっとも、自分ではこれで実行していますが。

[追記 2013-11-20]: 連絡先.app-8.0(1365)を使い始めて、書き出しの書式が変更されたようで、スクリプトにちょっと変更を加えました。