前の月 / 次の月 / 最新

hiChangeLog / 2007-02

2007-02
SMTWTFS
123
45678910
11121314151617
18192021222324
25262728

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

2007-02-19 Mon

BiBTeXのapsrevで重複文献の年にアルファベットが付加されるのを防ぐにはformat.date関数をいじる(その2) [TeX]

[2007-02-16-6]に記したやつだが、コメントアウトしすぎて年の前にもカンマが登場してしまった。以下のようにするとうまくいってるようだ(ちょい不安)

FUNCTION {format.date}
{ year "year" bibinfo.check duplicate$ empty$
    {
      "empty year in " cite$ * "; set to ????" * warning$
       pop$ "????"
    }
    'skip$
  if$
%  extra.label *
  before.all 'output.state :=
  " (" swap$ * ")" *
}

2007-02-17 Sat

コマンドプロンプトで簡単な条件分岐 [コマンド]

Visual Studio のビルドイベントであるディレクトリへのコピーを指定していたが、もしそのディレクトリが無かったらコマンドがエラーになるのでビルドに失敗することに気付いた(当り前だが)。

そこで以下のようなコマンドを追加した。「fugaディレクトリが無ければ作成」の意。mkdirは既に存在するディレクトリを指定するとエラーを返すみたいだ。

dir fuga || mkdir fuga

上のコマンドはエラーを返さないようだが、それは以下で確かめた。
(dir fuga || mkdir fuga) && echo OK

2007-02-16 Fri

BiBTeXのapsrevで重複文献の年にアルファベットが付加されるのを防ぐにはformat.date関数をいじる [TeX]

年の部分が(1999a)のようにアルファベットがつくのがうっとうしかったが、以下のように2行コメントアウトするとこれが消えると岡野真人君に教えてもらった。

FUNCTION {format.date}
{ year "year" bibinfo.check duplicate$ empty$
    {
      "empty year in " cite$ * "; set to ????" * warning$
       pop$ "????"
    }
    'skip$
  if$
%  extra.label *
%  before.all 'output.state :=
  " (" swap$ * ")" *
}

Referrer (Inside): [2007-02-19-1]

モジュールのインポートと変数のスコープ(名前空間)には色々ありそうだ [python]

題名の通り。さわりだけメモ。

import time
time.localtime() # OK
localtime() # error: not defined
だが
from time import *
localtime() # OK
である。つまり後者のがスコープ範囲がでかい。なぜそうなっているのかは、全く理解していない。

日時を整形するにはtimeモジュールのstrftimeを使う [python]

import time
tm = time.localtime()
time.sleep(1)
print time.strftime('%y%m%d_%H%M%S')     # 070216_021308 (current time)
print time.strftime('%y%m%d_%H%M%S', tm) # 070216_021307 (previously stored time)

コマンドを実行するにはosモジュールのsystem関数を使う [python]

import os
os.system('ls')

ファイル・ディレクトリの存在確認にはosモジュールのaccess関数を使う [python]

import os
os.access('.emacs', os.F_OK) # True
os.access('.eeeee', os.F_OK) # False

scratchバッファはlisp-interaction-modeであってlisp-modeではない [Emacs]

タイトル通り。C-jの挙動が異なる。(lisp-modeではC-jで評価がされない)

2007-02-15 Thu

シンボリックリンク作成時、実体はフルパスで指定するのが良い [コマンド]

題名の通り。こうするとリンクファイルの位置によらずリンクが生きるようだ

ln -s `pwd`/myfile_real myfile_link

キルリング(「クリップボード」)に文字列を設定するにはkill-newを用いる [Emacs]

Emacsでキルやコピーした文字列はキルリング(kill-ringというリスト)に格納される。ここに自分で文字列を設定したい場合はconsなどを駆使するのではなく、kill-newという関数を用いると良い。

(kill-new "hello")
あんまり「それっぽいくない」関数名である。

矩形のコピーのための関数は標準では用意されてないようだ [Emacs]

矩形の切取り(kill)はあるが、コピーは無い。read-onlyなバッファから矩形を持ってきたい場合などに欲しいなあと思ったので作ってみた。

(defun copy-rectangle ()
  (interactive)
  (setq killed-rectangle (extract-rectangle (region-beginning) (region-end)))
)
(global-set-key "\C-xrw" 'copy-rectangle)

Emacsで関数名を検索して探すにはapropos [Emacs]

M-x apropos
とすれば、与えた正規表現にマッチする関数を列挙できる。これが無ければEmacsをいじるのは苦行

レジスタを表すにはアルファベット1文字の前にクエスチョンを付ける [Emacs]

レジスタ関連の関数で、レジスタ変数はどうやって指定するのかわからなかったが、調べたところレジスタを表す1文字の前にクエスチョンをつけるようだ。以下みたいに。

(defun my-copy-to-register ()
  (interactive)
  (copy-to-register ?a (region-beginning) (region-end)))

リージョンを扱う際の変数はregion-beginningとか [Emacs]

region-beginningとregion-endはリージョンの始点と終点を表す。以下は指定したリージョンを消す関数。

(defun my-delete-region ()
  (interactive)
  (delete-region (region-beginning) (region-end)))

ちなみにバッファのポイントの最初と最後はpoint-minとpoint-max(ただしナローイングが無い場合)

Emacsでpythonのコンソールを出していじる [python][Emacs]

python-modeはなかなか便利。http://aki.issp.u-tokyo.ac.jp/itoh/PukiWiki/index.php?python

M-x py-shell
でpythonコンソールが現れる。普通のシェルでpythonを起動するとキーバインドの点で不満が大きいが、Emacs上ならそんな問題はない。色々と便利機能があるみたいだが、py-shellに限れば
M-n comint-next-input
M-p comint-previous-input
でヒストリが辿れればまあ満足。

tarやzipコマンドでディレクトリを圧縮する [コマンド]

いちいち記憶するのは面倒なのでメモ。てすと

tar jcvf mybackup.tar.bz2 ./mydir
zip -r mybackup.zip ./mydir

2007-02-14 Wed

ThinkPad T42の液晶が暗いため、インバータ及びバックライトの交換を試みた

[2007-1-26-1]で記したように、手持ちのノートPC(ThinkPad T42)の液晶がブッ壊れた。うっすら画面表示が見えるので、原因はケーブルでなくバックライト周りの不具合だろう。

で、インバータが原因かなと思った。もともとついてるインバータカードは26P8464なる型番だが、これは27K9972と名前が変わったそうだ。IBMに聞いたらば、液晶パネルは5万以上するがインバータは2500円程度のことで、まずは修理を試みる価値がある。秋葉原へ行ってみたが、若松通商CoCoNet液晶工房、その他ジャンク屋を回ったが、目当ての型番のものはなかった。ちょっと新しすぎたか。というわけでIBM部品センターに連絡してインバータを手配してもらい、換装してみた。

・・・が、症状は変わらず!原因はインバータではなかった。

よって、バックライトそのものが切れたのだと判断した。要は蛍光灯(CCFL: Cold Cathode Fluorescent Lamp、冷陰極管)なので、切れるのは不思議ではない。「DynaBookのバックライト交換」というページ「液晶のバックライト交換、成功例とバックライトの寸法について」というページを見るとこれを換装してキッチリ液晶モニタを復活させている。駄目元で、私もこれに挑戦しようと思った。

まずはThinkPadをバラして液晶パネルをむきだしにすることから初めたが、分解はやたらと面倒だった。保守マニュアルに従えば難しいわけではないが、ほとんどの部品を外す必要があるので「元に戻せるのだろうか」というドキドキ感と戦う必要があった。で液晶パネルに辿りついたが、パネルはSamsung製LTN141P4-L02なるものだった。このパネル用のバックライトは290mm長、2mm径のものだそうだ。CoCoNet液晶工房の在庫にこれを発見したので、買って(1500円)換装を試みる。

長い道程を経て取り出したバックライトはこんな外観。
長い道程を経て取り出したバックライト

コの字型の金属の中にスッポリ入ってた。
コの字型の金属の中にスッポリ入ってたバックライト

正しくは「コ」の字でなく、一辺が長いコの字である。長い辺がパネルの裏に来る配置である。白い円筒状のものは、パネルが倒れないように支えで用いたスプレーのり。
金属型(とバックライト)とパネルの位置関係
金属型(とバックライト)とパネルの位置関係

金属型とパネルのガワ(プラスチック)は両面テープでガッチリくっついていた。画像中、金属型が汚れているように見えるのは両面テープの跡。
金属型(とバックライト)とパネルの位置関係

むきだしのバックライトはこんな感じ。買ってきたバックライトも一緒に写っている。細い!すぐに割ってしまいそうであった。(実際、2回割った)
むきだしのバックライト

絶縁のためのゴムが被せられていた。ゴムを取った状態の長さは294mmであった。ギリギリの所にハンダ付けがしてある。
もともと入っていたバックライトの電極部分
もともと入っていたバックライトの電極部分

買ってきたバックライトはガラス管の部分だけで292mmあったため、長さ(短かさ)に余裕はない。ギリギリのハンダ付けを行ったが、それでも294mmより長くなってしまった。店で実測させてもらったが、全長には2mm以下程度のロット差があり、かつ短かくすることは不可能(長くすることは針金の配線などで容易)であるから、あらかじめ2mm程度短かめのものを買うのがいいだろう。
新たに半田付けしたバックライトの電極部分
新たに半田付けしたバックライトの電極部分

半田付けの後に、バックライトを金属の型に格納する。これが結構面倒で、割る恐怖と闘いながら結構グニグニして入れたため、型が歪んだ。これは、換装後に明るさのムラとなって現れた。
バックライト換装後の液晶の明るさのムラ

とにかく、換装に成功し、液晶も無事写るようになったので万万歳である。時間はかかったが、パネル代は浮いたし、何よりハンダゴテを握ってコンピュータを修理できたことで自信と満足感を得た。しかし、分解は面倒だったし、バックライトは割れやすくて交換が難しく、その上最取り付けと組み立てはさらに面倒で、「これからはバックライト交換し放題だぜ」とは思わなかった。メーカーや在野の修理センターでは2万円程度でバックライト交換サービスなどがあるが、(私がやったような稚拙なものではない)技術料込みでこの値段は「スゴイ!お得!」と感じた。理解はどうでもいいので、ただ直したいという人は間違いなく修理を依頼するのが良い。個人的には自分でやってよかったと思った。

オマケ。むきだしの液晶パネルはこんな外観を持っている。
むきだしの液晶パネル

液晶はガラス基板(だと思う)にくっついてるが、こんな風にパカッとなる(白いシールは剥がした)
液晶はガラス基板(だと思う)にくっついてるが、こんな風にパカッとなる(白いシールは剥がした)

液晶の下には拡散板らしきペラペラしたシートが2枚ある。脇のコの字型ピンを外すとペラっとなる。この下には2mm程度の厚みのアクリル板らしきものがあった。
液晶の下には拡散板らしきペラペラしたシートが2枚ある。

pythonでファイル名に連番を振る [python]

例えばデジカメ写真の一括リネームなど。

import glob, os

i = 1
for fname in glob.glob('*.JPG'):
    os.rename(fname, "070214_MyPhoto_%02d.JPG" % (i))
    i+=1
print "finished"

2007-02-09 Fri

バーコードに使い途はあるか

バーコードリーダやバーコード作成ソフトが手の届く値段にあった。
ラベル屋さん <= HOMEはフリーソフトみたい(いいのか?)
バーコードリーダーを使ってみよう <= 1万強

QRコードも作れるみたいだ。個人の情報整理にあたって出番はあるのだろうか?

TeXで行間を変えるには\baselineskipをいじり、それを部分的にやるなら環境を作る [TeX]

以下は「TEX: 部分的に行間を変える方法 @sarunoie」の内容の引用です:

\newenvironment{minilinespace}{
\baselineskip = 1mm
}

\begin{minilinespace}
hoge
\end{minilinespace}

2007-02-04 Sun

WikipediaのASCIIの表をpythonでchalow用に整形した [python]

WikipediaのHTMLを、chalowの表用にpythonで整形するスクリプトを書いた。大したコードじゃないが不慣れから結構時間を喰った。何回かこういうことをこなしていけばスラスラ書けるようになるのかな。

import sys

def split_elements(str, tag):
    tag_start = '<%s>' % (tag)
    tag_end = '</%s>' % (tag)
    if -1==str.find(tag_start):
        return []
    startpos = str.find(tag_start) + len(tag_start)
    str = str[startpos:] # discard the "header"
    records = []
    for record in str.split(tag_start):
        endpos = record.find(tag_end)
        if -1!=endpos: # non-closed tag will be ignored
            record = record[:endpos].strip() # end-tag and newlines are not needed
            records.append(record)
    return records

def format_printable(num):
    str = open('ascii_printable%d' % (num), 'r').read()
    str = str.replace(' ', ' ')
    str = str.replace('&', '&')
    str = str.replace('<', '<')
    str = str.replace('>', '>')
    records = split_elements(str, 'tr')
    for record in records:
        datas = split_elements(record, 'td')
        if 0==len(datas): # ignore <th> record
            continue

        for data in datas:
           print '||%s' % (data),
        print
    
def format_nonprintable():
    tdtag = '<td style="font-family: \'lucida sans unicode\',\'arial unicode ms\';">'
    str = open('ascii_nonprintable', 'r').read()
    str = str.replace(tdtag, '<td>')
    str = str.replace(' ', ' ')
    records = split_elements(str, 'tr')
    for record in records:
        datas = split_elements(record, 'td')
        if 0==len(datas): # ignore <th> record
            continue
        del datas[4] # figure
    
        for data in datas:
           print '||%s' % (data),
        print
    

format_nonprintable()
print
format_printable(1)
print
format_printable(2)
print
format_printable(3)

ASCII

ASCIIはデータについて考える上で欠かせない知識だ。Wikipediaに素晴らしい記事があった。以下はほぼ同一の内容を改めて記したものである(Wikipediaはサクサク表示できない場合もあるので)。

理解のためのヒント:
・大文字のASCII値に32を加える(6ビット目を1にセット)と小文字に変換出来る。
・数字に48を足したものがそのASCII値である。逆に、ASCII値の上位4ビットを無視する(48を引く)と対応する数字になる。
・制御文字は、ASCII値に64を足したもの(7ビット目を1にセット)で表す慣習がある。例えばCRなら、13+64=77のMを用いて"^M"、LFなら10+64=74のJを用いて"^J"とする。ハット"^"はCtrlキーを表す。もともとCtrlキーは7ビット目を無効にする役割を担っていたそうな。

制御文字:
2進 10進16進略語 名前/意味
0000 0000 0 00 NUL 空文字
0000 0001 1 01 SOH ヘッダ開始
0000 0010 2 02 STX テキスト開始
0000 0011 3 03 ETX テキスト終了
0000 0100 4 04 EOT 転送終了
0000 0101 5 05 ENQ 問い合わせ
0000 0110 6 06 ACK 肯定応答
0000 0111 7 07 BEL ベル
0000 1000 8 08 BS 1文字後退
0000 1001 9 09 HT 水平タブ
0000 1010 10 0A LF 改行
0000 1011 11 0B VT 垂直タブ
0000 1100 12 0C FF 改ページ
0000 1101 13 0D CR 復帰
0000 1110 14 0E SO シフトアウト
0000 1111 15 0F SI シフトイン
0001 0000 16 10 DLE データリンク拡張
0001 0001 17 11 DC1 装置制御1,XON
0001 0010 18 12 DC2 装置制御2
0001 0011 19 13 DC3 装置制御3,XOFF
0001 0100 20 14 DC4 装置制御4
0001 0101 21 15 NAK 否定応答
0001 0110 22 16 SYN 同期信号
0001 0111 23 17 ETB ブロック転送終了
0001 1000 24 18 CAN キャンセル
0001 1001 25 19 EM 媒体終端
0001 1010 26 1A SUB 置換
0001 1011 27 1B ESC エスケープ
0001 1100 28 1C FS ファイルセパレータ
0001 1101 29 1D GS グループセパレータ
0001 1110 30 1E RS レコードセパレータ
0001 1111 31 1F US ユニットセパレータ
0111 1111 127 7F DEL 削除

印字可能文字:
2進 10進16進 文字
0010 0000 32 20 空白
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25 %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~

stringオブジェクトの説明は、"Python Library Reference (2.4)"の2.3.6節、Built-In Objects => Built-In Types => Sequence Typesにあった [python]

これはタイトルのまんま

ファイル入力及び標準入力 [python]

ちょっとしたテキスト整形をpythonでやろうとしたが、ファイル入力あるいは標準入力のコードがとっさに全く思いつかず、ああまだ全然慣れてないのだなと思った。以下にメモる。

import sys

f = open('test.txt', 'r') # file
#f = sys.stdin # standard input

for line in f: # f.readlines() will do the same
    print line, # comma is to suppress newline characters

bashではシングルクォート内にシングルクォートを含めることはできないらしい

[2006-11-24-5]も参照。
シングルクォートの中の文字列でシングルクォートを表現することは無理らしい。今までシングルクォーテーションばかり使ってきたが、ダブルクォーテーションを中心に使う方が良いのか。参考:私のLinux活用記録-21

$ echo 'hello'
hello

$ echo 'he'llo'
>
(Ctrl+cを押した)

$ echo 'he\'llo'
>
(Ctrl+cを押した)

$ echo "he'llo"
he'llo

NTEmacs22とYaTeX1.73の組み合わせが問題なく動作しているようだ [Emacs][yatex]

「NTEmacs22 CVS + IME.patch のバイナリ」 から頂いたNTEmacs22(GNU Emacs 22.0.93.1 (i386-mingw-nt5.1.2600))にYaTeX1.73を導入し、TeXファイルのオープンとタイプセットが無事に行えることを確認した。

[2006-11-21-6]に、emacs22とyatexの組み合わせがうまくいかなかったとメモしていたが、これが何故解消されたかはわからない。まあemacsもyatexもバージョンが上がっているので、何かと改善された点があるのだろう。

当時のメモに「根が深そうだ」とか偉そうなことを書いてしまったが、emacsやyatexのバージョンも、エラーが出るタイミングなども記述し忘れ(当然覚えていない)たため、後の原因究明にちっとも役に立っていない。記録する能力というのは重要だなあと改めて認識した。

Emacsのインライン画像表示機能を活用してyatexやhowmを便利にしたい [Emacs][TeX][yatex][howm][画像ファイル]

画像ファイルを画像データたらしめているのは、ファイル名ではなく画像そのものである。つまり、画像に対していちいちファイル名を用意してそれを基に管理するのは面倒でナンセンスだと考える。(「横着プログラミング 第1回: Unixのメモ技術」を読んでこの考えに至った)

TeXによる文章で図を挿入する際には画像をファイル名で指定する。で、それに対してラベル文字列\label{...}を付し、これが後の参照に使われる(「図\ref{...}」が「図2.4」とかになる)。つまり画像(図)を管理するため2種類もの文字列が使われていることになるのだが、これは2重に面倒である。「ファイル名をラベル文字列とする」とルールを定めれば1重の面倒に改善されるが、それでもファイル名管理の煩わしさは残る。不精な私にとっては、アタマに思い描く画像とファイル名の対応をいちいち把握しておくことはとても面倒だ。

私はTeXの文章作成時には、YaTeXという便利なTeX文書作成補助パッケージを愛用している。これに参照コマンド\refの入力支援機能が備わっているが、そこではラベル文字列の代わりにキャプション文字列で図を管理する。通常キャプション文字列はファイル名などと同じになり得ないので、画像(図)を指定するための文字列を新たに増やしてしまっていることに相当する。これは別にyatexの設計が悪いわけではなく、平テキストで画像入り文章を扱っている以上仕方のないことなのだが、やっぱりこのテの把握と管理は面倒である。

画像のインライン表示によって、この面倒さを解決できないかなあと考えている。emacsは21から画像の表示がサポートされたようなので、例えばTeXのソース編集中に\includegraphics{...}付近に実際の画像の縮小版を表示させることも可能だと思う(画像表示の機構は知らないので、具体的な技術的課題なんかはわからん)。で、その図を\ref{...}する際にも、文書中の画像(図)をサムネイル表示させた上で参照先を選ばせるようにすれば、ラベル文字列との対応でいちいち悩む必要は無い。この時ラベル文字列はただの内部変数の様な役割なので、他と干渉さえしなければ何でもよいはず(ファイル名とか)。\ref{...}付近にも適宜画像を表示させれば、執筆中の文書の見通しも良くなりそうだ。

TeXとは関係ないが、メモツールhowmでも似た事情がある。ちょっとした画像をメモ代わりに残したくなることはあるが、いちいちそれっぽいファイル名を考えて後日アクセスできるようにするのが億劫で、結局残さないなんて本末転倒なこともある。日付+時間とかで必ずuniqueになるファイル名を適当に自動でつけ、メモ中にインライン表示できるようにすれば、気兼ねなく「メモ画像」を扱えるのではと思う。

とりあえず今日は思ったことをメモするだけ。実装したいが、どのくらいの手間暇がいるのだろうか?以下に画像表示のelisp例が記述されていた。
横着プログラミング 第1回: Unixのメモ技術
Poohのページ

大きくて頑丈で余計なものがない机

付加的な価値に目もくれず、本来の機能をひたすら突き詰めた道具が好き。
例えば机なら
・大きい
・頑丈
が私の求める条件で、他の機能は不要だ。
「ある意味ハードだろ(パソコンデスク編) Part4」スレの皆様の議論が大変参考になった。

例えば、こんなやつ。
http://item.rakuten.co.jp/gekiyasukaguya/widedesk_180/
http://garage.plus.co.jp/catalogue8-pdf/pdf/P095-096.pdf
http://garage.plus.co.jp/catalogue8-pdf/pdf/P103-104.pdf

infoモードのキーバインド [Emacs]

何をするにも、reference、ドキュメントの類の使い勝手の良さが仕事の効率を大幅に左右する。
というわけで、Emacsのinfoのinfoを改めて眺めてみた。で、重要なキーバインドをメモ。

SPC, BS 上下スクロール
n, p 次、前のnodeへ
u, t ひとつ上、トップのnodeへ
l 前に閲覧してた画面に戻る
RET リンクを辿る
TAB, Shift + TAB リンク文字間の移動
s 現在のinfoファイルを検索
M-n 現在の表示で新バッファ作成
d Info初期画面へ
? ヘルプ

2007-02-03 Sat

hexl-modeで現在のアドレスを知るための関数はhexl-current-address [Emacs]

コンピュータへの理解を深めるにはファイルのバイナリ(hex)表示が必須だが、Emacsのhexl-modeはこれを行ってくれる。アドレス関連の操作としては以下のキーバインドが設定されていた。

M-j hexl-goto-address
M-g hexl-goto-hex-address
で、キーバインドは設定されていないが、現在のアドレスを知るための関数としてhexl-current-addressなるものがある。以下のようにしてキーバインドを割り付けた。
(define-key hexl-mode-map "\M-c" 'hexl-current-address)

Illustratorにフォントの種類や大きさを指定した文字列オブジェクトを挿入する [Illustrator][COM][VBScript(WSH)]

[2007-02-02-01]の続き。

ちょっと試してみたが、PDF形式のデータをクリップボードに用意するのは難しそうだ。
一方でCOMインターフェースからはあっさりできてしまったので、そのVBScriptソースをメモする。嬉しいやら悲しいやら。

Dim appRef, docRef, txt

' 旧バージョンのIllustratorがある場合、以下のように末尾に数字を加えて
' バージョンを指定する。10が1、CSが2、CS2が3
' "Visual Basic Scripting Reference" (CS2) p.61見よ
Set appREf = CreateObject("Illustrator.Application.2")

Set docRef = appRef.ActiveDocument
'Set docRef = appRef.Documents.Add ' 新規作成の場合はこちら

Set txt = docRef.TextFrames.Add
txt.Position = Array(200, 200)
txt.Contents = "Itoh et al., Appl. Phys. Lett. 83, 2043 (2003)"

' フォントを見つける
Dim fontR, fontB, fontRname, fontBname
fontR = Null
fontB = Null
fontRname = "KozGoStd-Regular" ' 小塚ゴシックStd (R)
fontBname = "KozGoStd-Heavy"   ' 小塚ゴシックStd (H)
'fontRname = "ArialMT"      ' Arial (Regular)
'fontBname = "Arial-BoldMT" ' Arial (Bold)

For Each fontToTest In appRef.TextFonts
   If(fontToTest.Name = fontRname) Then
      Set fontR = fontToTest
   ElseIf(fontToTest.Name = fontBname) Then
      Set fontB = fontToTest
   End If

   If(IsNull(fontR) Or IsNull(fontB)) Then
      ' 何もしない(ループ続行)
   Else
      Exit For ' フォント見つかったのでもうループは不要
   End If
Next

If(IsNull(fontB) Or IsNull(fontR)) Then
  msgbox "fonts not found"
  WScript.Quit ' 見つからなかったらやめる
End If

txt.TextRange.CharacterAttributes.TextFont = fontR
txt.TextRange.CharacterAttributes.Size = 19

' 太字にする箇所は別途調べておくなり、それ用のルーチンを用意するなりしておく
txt.Characters(32).CharacterAttributes.TextFont = fontB
txt.Characters(33).CharacterAttributes.TextFont = fontB

上でフォントの名前を指定したが、これは以下のようなスクリプトで確かめた。正規表現はやっぱり便利だ。
Dim app, objRE
Set app = CreateObject("Illustrator.Application.2")
Set objRE = new RegExp
objRE.IgnoreCase = True
objRE.pattern = "kozgostd"
For Each font In app.TextFonts
  If objRE.Test(font.Name) Then
     msgbox font.Name
  End If
Next

2007-02-02 Fri

Illustratorにペーストを行うため、PDF形式のデータをクリップボードに用意する [PDF][Illustrator][Windowsプログラミング]

私はプレゼン用スライドなど諸書類はIllustratorで準備することが多い。
で、仕事柄以下の様な形式の論文参照テキストオブジェクトを頻繁に用いる。

Itoh et al., Appl. Phys. Lett. 83, 2043 (2003)

この文字列自体は別途作成した論文整理ソフトから容易にクリップボードにコピーしIllustratorにペーストできる。ペースト自体はすぐ終わるが、上で「83」となっているvolume番号は太字で表記したいので、ペーストの度に手作業でここを太字に直す作業が発生する。これが意外と面倒なので、何とかして一発で太字入りテキストオブジェクトを作成したいと思った。

こういうことはJavascript(参考:【Illustrator CS自動化作戦】)とかCOMインターフェースとかIllustrator SDKを用いるのが正攻法で、手間も小さいだろう。でもクリップボードに(ただの文字列ではなく)Illustratorが解釈できるデータを用意し、それをペーストするというアプローチも面白そうだなと思った。開発は面倒そうだが概念的には明瞭で既存のペーストコマンドから実現できるし、またIllustratorに頼らずIllustratorのオブジェクトが作れれば、今後何かと便利かもしれない。

古くはAICBという形式が使われていたようだが、現在はPDF形式がメインのようである。というわけでPDF形式が良さそうだが、勉強すべき事項は多く、しばらくはトライ&エラーの体当たりな開発が必要そうだ。そこでとりあえず、PDF形式でのペーストを行うためだけのプログラムを書いた。これはクリップボードにコピーしたテキスト形式のデータを、PDF形式として無理矢理解釈しているだけである。これを用いて、メモ帳相手にひたすら手書きPDFを作成しながらIllustratorペーストした際にどのようになるかを調べれば、だんだん形式への理解も深まるのではと思う。たぶん。

#include <windows.h>
#include <tchar.h>

static HGLOBAL PrepareClipboardTextData(char* buf){
   HGLOBAL hMem = GlobalAlloc(GHND | GMEM_SHARE, lstrlenA(buf));
   if(!hMem) return NULL;

   char* buf2 = (char*)GlobalLock(hMem);
   lstrcpyA(buf2, buf);
   GlobalUnlock(hMem);
   return hMem;
}

UINT ConvertClipboardTextIntoPDF(){
  try{
    if(!OpenClipboard(NULL)) return 1;

    const UINT cf_pdf = RegisterClipboardFormat(TEXT("Portable Document Format"));
    if(cf_pdf == 0) throw 2;

    char* buf = (char*)GetClipboardData(CF_TEXT);
    if(!buf) throw 3;
  
    HGLOBAL hMem = PrepareClipboardTextData(buf);
    if(!hMem) throw 4;

    if(!SetClipboardData(cf_pdf, hMem)) throw 5;
  } catch(UINT i) {
    CloseClipboard();
    return i;
  }
  CloseClipboard();
  return 0;
}

int WINAPI _tWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */,
		     LPSTR /* lpCmdLine */, int /* nCmdShow */){
  const UINT err = ConvertClipboardTextIntoPDF();
  if(err){
    MessageBox(NULL, TEXT("failed"), TEXT("hiConvertClipboardTextIntoPDF"), MB_ICONEXCLAMATION);
  }
  return 0;
}

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2010-03-08 22:21