アーカイブ

Archive for the ‘デスクトップ’ Category

ScanSnap付属のCardMinderに読み込んだ名刺をEvernoteに流し込む

2011年1月23日 3件のコメント

別にCardMinderが使い難いという事は無いのですが、今時モバイルで参照できないのはどうかと思ったので、Evernoteに流し込んで名刺用のタグでも打つ事にしました。
~/Documentsにファイルを作っている気配が無いので、~/Library/を探してみた所~/Library/Application Support/CardMinder/CardMinder DB.cmdbを見つけました。
これはバンドルで、中にCardMinder.sqldbとImagesディレクトリがあり、Imagesディレクトリの中には名刺のPDFファイルが沢山入っています。
PDFは1ファイルで裏表を収容しているのですが、ファイル名がUUIDあり、このままだと検索が面倒です。
そこでCardMinder.sqldbの方をsqlite3で開いてみた所、中に氏名などのデータが収まっていました。
とりあえず、スクリプトで氏名を抜いてPDFのファイル名にしてやり、最後に手動でEvernoteに流し込む事にしました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import datetime
import shutil
import sqlite3

source_directory = os.environ["HOME"] + "/Library/Application Support/CardMinder/CardMinder DB.cmdb/Images/"
destination_directory = os.environ["HOME"] + "/Desktop/CardMinderToEvernote/"

connection = sqlite3.connect(os.environ["HOME"] + "/Library/Application Support/CardMinder/CardMinder DB.cmdb/CardMinder.sqldb")
cursor = connection.execute("select ZFULL_NAME, ZFACE_IMAGE_FILE, ZREGISTER_DATE from ZCARD")
for row in cursor:
	print row[0], row[1], row[2]
	shutil.copyfile(source_directory + row[1], destination_directory + row[0] + ".pdf")
connection.close

デスクトップには、あらかじめCardMinderという名前でフォルダを作っておきます。
スクリプトが完了すると、氏名がファイル名になったPDFがフォルダ内にコピーされるので、これをEvernoteにドロップすれば完了です。

後日、差分追加する時がくると思います。
その時は登録日時で抽出するようにSQLを書き換える必要があるんですが、タイムスタンプらしい日付のデータフォーマットに見当が付かなくて、保留しています。
小数値なので、てっきりunixtimeだと思ったんですが……

広告
カテゴリー:デスクトップ, 開発 タグ:

ScanSnapで読み取ったPDFを無劣化で画像ファイルに変換する

僕は技術書をScanSnapで読み取り、PDFとして電子化しています。Mac上で閲覧する時はそのままで問題がありませんが、iPadに転送する場合などは、ページ単位の画像ファイルに変換してから、ePubなどに再構成しています。

この画像ファイルに変換する作業は、Automatorを使ってページ単位でJPEG画像にレンダリングを行っていたのですが、非常に時間がかかる上に再圧縮の過程で劣化します。

元々ScanSnapはビットマップ画像として読み込みを行っているので、PDFの中にはページ単位のビットマップ画像データが存在するはずです。これをそのまま切り出せば、短時間に無劣化で画像ファイルへの変換が可能になるはずです。

PDFからのビットマップ画像の取り出し
調べた所、Xpdfに含まれるpdfimagesコマンドで抽出可能な事が解りました。XpdfはMacPortsでインストールするか、ここで配布しているバイナリパッケージなどをインストールしてください。次のようなコマンドで抽出可能です。

pdfimages -j PDFファイルパス 出力プリフィックス

画像は、「出力プリフィックス-xxx.pbm」か「出力プリフィックス-xxx.jpg」として出力されます。ScanSnapの読み取り時にモノクロになった場合は1ビットのPBM形式に、カラーになった場合はJPEG形式です。つまりモノクロは可逆圧縮で、カラーはDCTとしてPDFに格納されているようです。

PBMからTIFF形式のG4 FAX圧縮に変換
カラーの方のJPEGはそのままePubに変換できますが、モノクロの方は別のファイル形式に変換する必要があります。最初はGIFを試してみましたが、画像の合計サイズが元のPDFの1.5倍程度まで大きくなりました。次にPNGを試した所、GIFよりはファイルサイズが小さくなりましたが、元のPDFと比較すると大きなサイズになりました。一瞬、「ちょ、PDFのモノクロ圧縮はすごすぎだろ」とか思いましたが、冷静に考えると1ビットのモノクロなので、TIFF形式のG4 FAX方式で圧縮してみたら、見事に元のPDFファイルとほぼ同じサイズになりました。PDFの画像部分は、TIFFが手本なのかもしれません。カラーにJPEGをサポートしているのも同様ですし。

変換作業自体は、ImageMagickを使うと簡単です。MacPortsを使うなり、バイナリパッケージをダウンロードするなりしてインストールしてください。次のコマンドでTIFF形式のG4 FAX圧縮に一括変換できます。

mogrify -format tiff -compress Group4 PBMファイルパス...

GIFやPNGは問題無いと思いますが、TIFFをサポートしていないePubリーダーもあるかもしれません、その時はファイルサイズを犠牲にして、PNGに変換する事になると思います。ファイルは大きくなりますが、無劣化には違いありません。

ScanSnapの型が新しい場合は、モノクロがグレイスケールになると聞いています。その場合、pdfimagesがどのようなファイルを吐くか判りません。恐らくJPEGだと思うのですが……

カテゴリー:デスクトップ

OS Xのアドレスブックのアイコンを最新のTwitterのアイコンで自動更新する

タイトル長いですが。

OS Xのアドレスブックのカードには、アイコンというか写真を設定できます。ここを設定しておくと、OS Xと同期しているiPhoneで着信あった時にアイコンが表示されたりするので、判りやすかったりします。

問題は知人各位の写真の調達なんですが、僕はmixiとかTwitterとかSkypeのアイコンを貼付けて使っています。ただみなさんアイコンを時々変更されるので、気が付くと懐かしいアイコンになっていたりします。

そこで、最新のTwitterアイコンで、アドレスブックを自動更新するスクリプトを書いてみました。

データ入力
まずは、知人各位のカードに、「URL」を追加してください。内容はTwitterのユーザページのURLである、「http://twitter.com/user_name」としてください。ラベルは「自宅」とか「勤務先」とか選べますが、何でも構いません。URLの内容がTwitterのユーザページになっている事が全てです。

スクリプトをインストール
今回作ったスクリプトはターミナルで動作するrubyスクリプトなのですが、動作させるために必要なパッケージをインストールする必要があります。ターミナルで下記のコマンドを入力してください。

gem install twitter4r

これはRubyGemsによってユーザ領域にインストールされるので、システムを壊す心配はありません。

次に、以下のスクリプトをAddressIconPaster.rbという名前のテキストファイルとして保存してください。

#!/usr/bin/ruby

require 'osx/cocoa'
OSX.require_framework 'AddressBook'
require 'rubygems'
require 'twitter'
require 'open-uri'

twitter = Twitter::Client.new(:login => ARGV[0], :password => ARGV[1])

address_book = OSX::ABAddressBook.sharedAddressBook
address_book.people.each do |person|
  urls = person.valueForProperty(OSX::KABURLsProperty)
  if urls
    for index in 0...urls.count
      url = urls.valueAtIndex(index)
      if /^http:\/\/twitter.com\/(.+)/ =~ url
         user = twitter.user($1)
         open(user.profile_image_url) do |file|
           person.setImageData(OSX::NSData.dataWithRubyString(file.read))
         end
      end
    end
  end
end
address_book.save

アイコンの自動更新を実行
ご自分のTwitterのユーザ名とパスワードを用意して、ターミナルで下記のコマンドを入力してください。

ruby AddressIconPaster.rb ユーザ名 パスワード

これで、カードにTwitterのURLを設定した全てのユーザのアイコンが最新の物に更新されます。

知人のカードにTwitterのURLを入力する事は、今回のアイコン設定が必要なくても自然な事だと思いますし、特別な設定が必要ないので良い感じではないかと思います。

せっかくだから、RubyCocoaでGUIを付ける所がまでやれよ自分……という気もしましたが、iPad弄りが楽しいのでここまでに致したく存じます。

カテゴリー:デスクトップ, 開発 タグ:

SambaでTime Machine

iSCSIを使ったネットワーク越しのTime Machineが安定しなかったので、次はSambaで共有しているネットワークドライブにTime Machineでバックアップを試す事にしました。

まずTime Machineの設定を弄って、未サポートドライブにバックアップできるようにします。

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

この状態で共有しているサーバのボリュームにバックアップを行った所、イメージファイルの作成に失敗してバックアップが始まりませんでした。

そこでディスクユーティリティを使い、あらかじめイメージファイルを作ってやるとうまくきました。
この時、イメージフォーマットはスパースバンドル・ディスクイメージを選びます。
またボリュームサイズは、適当に大きめのサイズを指定しました。
注意が必要なのはイメージファイル名で、[ホスト名]_[有線のMACアドレスから記号を抜いて小文字化].sparsebundleとする必要があります。

カテゴリー:サーバ, デスクトップ

さよならクラリスワークス

もう何年もメンテナンスモードに見えたので、いずれこんな日が来る事は判っていたのですが、実際に終了と聞くとショックです。

「アプール・ワークス死亡」

僕が職業プログラマになる事を決心したのは、学生時代にクラリスワークスを使って感動した事でした。いつかこんなアプリケーションを書いてみたいと、無謀な夢も見ました。今も遠い夢ですけど。

カテゴリー:デスクトップ, 開発

MHP-UW1を購入

ワイアレスヘッドフォン、MHP-UW1を買ってみました。
ケーブルの無いPC用ヘッドフォンが欲しくて色々調べていたのですが、

  • 赤外線は歩き回ると遮蔽物で音が切れやすい。
  • アナログ方式はホワイトノイズが乗る。
  • 音質は有線とは比較にならない。
  • バーチャルサラウンドに期待してはいけない。

などと言われているようです。

そこで、単純なステレオで無線を使ったデジタル方式の製品を探したのですが、あまり無いようです。
MHP-UW1はUSB接続の音源入りだったのですが、配線が楽なので悪く無いと考えました。

心配だったのは、

  • メーカーはOSX対応を謳っていない。恐らく、USB音源のクラスドライバで認識する。
  • 2.4GHz帯の無線が干渉するかもしれない。2.4GHzは無線LANとBluetoothに加えて、ロジクールの独自規格無線マウス(V500)でも使ってる。

あたりです。

結果的には、OSXで問題無く使えました。
ドングルを接続直後に無線LANの切断されて焦りましたが、MHP-UW1のバンド切り替えボタンを数回押したら解決しました。

唯一謎なのは、USB Audio入力としても認識されている事です。
音源チップが汎用品なのは判りますけど、このぐらい殺しておいてくださいよ(^_^;;

Delicious Libraryのレジスト

出先で見つけた書籍が欲しくなった時に、うっかり持っている本をもう一度買ってしまったり、既に持っていると勘違いして買い損なう事があります。
記憶力が足りないのはどうにもならないのて、Palmに蔵書リストを維持するようになりました。
でも入力が面倒で、失敗もありました。

最近日本語ローカライズが入ったので、Delicious Libraryを試してみました。
iSightでバーコードの読み込みを行って、アマゾンのデータを使って書籍やCDのリストを作成してくれます。
リストはiPodに入るので、出先で確認もできます。
読み込み作業は面倒どころか病み付きで、レジストする事にしました。

購入はソフトの中で行う事ができます。
ユーザ名入力の時に、一瞬アルファベットが無難なような気もしましたが、特に注意書きも無くダイアログもしっかり日本語化されていたので漢字で入力しました。
しかしすべての情報を入力後に、長時間の待ち時間の後でエラーになりました。
気を取り直してアルファベットで入力すると無事レジストできました。

ところがその後、レジストメールが2通届きました。
片方は本文が空で、ヘッダにも文字化けがあります。
直感的に、トランザクションの例外安全に穴がありそうな挙動です。
慌ててカードのショッピング履歴を調べたら、最初のエラーも課金されていました…orz

その後状況を辿々しい英語でメールしたところ、返金されました。
ユニコードの処理にバグがあったそうです。
プログラマ的には、ユニコードのバグは仕方無いと思いますが、トランザクションが甘いのは頂けないです。
自分も気をつけないと(^_^;;

カテゴリー:デスクトップ