2007年10月20日(土曜日)

改行コードで嵌まる [ プログラミング ]

みようみまねPHP初心者ながら、昔取った杵柄ではないが、なんとか WordPress 用の自作プラグインを作成中。目的は、WordPressの通常のテキスト整形ルーチンを使わず、普段使っているTeXと同じ感じで数式を含む文章を書くこと。そのために自作の整形フィルターを作る。

  • WordPressの標準フィルターである wpautop と wptexturize をオフにする。
  • テキストを段落に分割して、<p> ... </p> とパラグラフのタグで囲む。
  • $ ・・・ $の部分をテキスト数式、\[ ・・・ ]\ の部分を別組数式に変換する。
  • 変換は、PHPのPerl互換の正規表現関数 preg_match を使えば良い。
  • バックスラッシュを含む部分が難しいが、これは既に解決している。

という感じなのだが、テキストを段落に分割する部分でトラブル。事前に実験していて、ここはクリアーしているはずなのに、何故かサーバーにアップすると失敗。

つらつら考えるに、あ、もしかして改行コードが原因かも、と。
$para_list = preg_split('/\n\n/', $text);
と、連続する改行を段落の切れ目と判断していたのだが、 \n はLFのことで、確かにUNIXでは改行だが、マックとWinでは違っているのだった。マックではCRが改行、Winでは、CR+LFが改行という、なんだかわけわからない仕様になっているのだったが、是非もない。まず、CR+LFをLFに変換、次にCRをLFに変換する。これで、どのタイプでもUNIXの改行コードになるはずである。しかるのちに、連続するLFを区切りとしてテキスト全体を配列に分割すると、想定していた通りの出力となった。やれやれ、これで安眠できるというものだ。それにしても、PHPに限らず、初心者にとって、プログラム言語というものは大変である。身近に質問できるエキスパートが居ればなあ、などと嘆息するのであった。

投稿者 sukarabe : 22:05 | この記事の固定URI | コメント (0) | トラックバック (0)

2007年10月12日(金曜日)

PHPの正規表現とバックスラッシュ [ プログラミング ]

WordPress用のTeXプラグイン作成の為のメモ。

PHPにはPerl互換の正規表現があるが、メタ文字、特にバックスラッシュを含むパターンを検索しようとすると、なかなか厄介。既存のmimetexプラグインは [tex]数式[/tex]という記述をする仕様になっているが、これを、テキスト数式の $数式$ および、別組数式の \[数式\] にマッチさせるように拡張することが目的。

試行錯誤の結果、次で上手く行った。まず、$...$にマッチさせるには、 "#\\$(.*?)\\$#" とする。「$」もメタ文字なのでエスケープしないといけないが、「\$」では上手く行かない。次に、\[ ... \] にマッチさせるには、 "#\\\\\[(.*?)\\\\\]#" とすれば良い。どうも、PHPの正規表現に渡されるときに、一回バックスラッシュを剥ぎ取っている模様。だから、「\\$」は正規表現には「\$」と渡され、「$」もメタ文字なので、これはドル記号そのものと認識される、で良いのかな?

\[」のマッチングに関しては複雑怪奇。「[」もメタ文字なのでエスケープしないといけないが、上のダラーから類推すれば「\\[」となるはず。しかし、そうすると、残りのバックスラッシュは3個。何故に3個なのか?4個だと思ったのだが・・・。だって、正規表現に渡すときに「\\\\」が「\\」になり、これはバックスラッシュそのものと認識されるはずだから。うーむ、奇っ怪じゃ。

投稿者 sukarabe : 06:51 | この記事の固定URI | コメント (0) | トラックバック (0)

2007年10月07日(日曜日)

メタポスト・プレビュー用のシェルスクリプト [ MetaPost, UNIX, プログラミング ]

前回は tsch で叩き台を作ったが、これからはbashでスクリプトを書くことにした。基本的に、TeXShopから呼び出す使い方がほとんどなので、それを想定して作成。Pathは通っているので省略し、エラー処理ではないが、ちょっとだけ if ... then ... else ... fi 構文を使ってみた。if文はCに似ているが、if (条件式) ではなく、if (条件文) であることに注意! 条件文を実行したステータスで判断するらしい。[.....] で括った部分は条件式に見えるが、実は testコマンドで実行させた結果を返しているということらしいのである。

苦労(?)したのは、ファイル名から拡張子を取り除くとか言った、文字列処理の部分。こういう所は、言語によって書き方が様々。bashの場合は、${string%hoge} と書けば、後方から最短マッチで$stringからhogeの部分を除去する。あ!しまった。この書き方じゃまずいことに、たった今気付いた。これでは、ファイル名の途中に「.mp」が含まれていると、そこを除去してしまう。まあ、そんなファイル名(sample.mpost とか)は使わないだろうが、それでもバグには違いない。末尾の「.mp」に限って除去するにはどうすれば良いのだろうか。

#!/bin/bash
#
# 使い方(Usage)
# mp2pdf foo.mp
#
# 0) 拡張子が mp でなければ何もせずに終了する。
# 1) 拡張子が mp のときは、jmpost を起動する。
#    jmpost により foo.1, foo.2, etc. の画像(PostScript file)が作られる。
# 2) foo.0 が存在すれば、それをプレビューするために、
#    foo.ps に複製し、ps2pdfにより、foo.pdf を作る。

# 必要ならば、パスを通す。
# ファイル名の設定 # infile=foo.mp のとき、basename=foo, fig_zero=foo.0, fig_ps=foo.ps # infile="$1" basename=${infile%.mp} # infile の末尾に .mp があれば、それを除去した文字列になる(バグあり) fig_zero="$basename.0" fig_ps="$basename.ps" fig_pdf="$basename.pdf"
if [ $basename = $infile ] ## 一致するのは、ファイル名が .mp で終わらないとき then echo "拡張子が mp ではありません" exit fi
echo "MetaPost(日本語版) を起動します" jmpost $infile if [ -f $fig_zero ]; then ## foo.0 が存在する場合 echo "$fig_zero からプレビュー画像 $fig_pdf を作成します" cp $fig_zero $fig_ps pstopdf $fig_ps else echo "プレビュー画像はありません" fi

投稿者 sukarabe : 12:35 | この記事の固定URI | コメント (5) | トラックバック (0)

2007年09月30日(日曜日)

MetaPost難民、とりあえずの避難所 [ MetaPost, プログラミング ]

こういう時、普段からUNIXでEmacs生活をしていれば、こんな苦労はないだろうに、と思う。まあ、しかし、似非UNIX環境のMac OS Xではあるが、なんとかはなるようだった。

調べたところ、TeXShop (エディター付きの統合環境) から種々のUNIXコマンドやApple Scriptが実行できるようになっていた。メニューのマクロというところに、Claus Gerhardtさん作成のApplescriptがあり、これを参考にすれば、自分に必要なバッチ処理ができると思う。別な方法として、タイプセット(コンパイル)エンジンを追加するということもできるようだ。ヘルプファイルを読んで行くと、例として XeTeXとXeLaTeX (これらはTeXをマルチリンガル対応に拡張したもので、例えば日本語とアラビア語を混在させることが可能らしい・・・)という組版プログラムをTeXShopから使うための方法が書いてある。~/Library/TeXShop/Engines というディレクトリーに .engine という拡張子をもつ実行可能なファイルがあれば、それがタイプセットメニューに表示され、TeXShopから実行できる。実行可能なファイルって、要するにUNIXのシェル・スクリプト(あるいはPerlとかでも)で良いわけだ。shellのプログラムとか書いたことないから、皆目見当つかないのだが、見よう見まねで叩き台を作ってみた。

#!/bin/tcsh
set path= ($path /usr/local/teTeX/bin/powerpc-apple-darwin-current /usr/local/bin)
jmpost "$1"
cp "$1:r".0 "$1:r"
pstopdf "$1:r"

見本がtcshを使っていたし、うちは何故かbashじゃなくてtcshがデフォルトになっているので、そのままにしたが、調べたら、bashとcsh系ではいろいろ違うみたいだなあ。Pathは通っているので、書かなくても良いと思ったが、とりあえずサンプルからコピー。これを呼び出すときには、foo.mp というメタポスト・プログラムを書いているので、そのファイル名が渡される。それが $1 という変数になる。つまり、$1 = foo.mp ということね。これを日本語化したMetaPostで処理するために、jmpost を起動させる。出力として、foo.1, foo.2, ... などと画像ファイルが出来上がる。拡張子がないが、ポストスクリプトファイル。TeXShop での流儀に合わせて、番号0の画像をデバッグ用として表示させる。この為には、foo.0というPSファイルをfoo.pdfに変換する必要がある。$1 が foo.mp のとき、拡張子を取り去った foo という文字列を取り出すには、tcshでは "$1:r" とすれば良いらしい。こういうのを全然知らないから苦労するんだよなあ、初心者は。すると、foo.0 は "$1:r".0 となるから、これをfooという名前で複製してから、pstopdf でPSからPDFに変換する。結果として、画像番号0 のファイルが foo.pdf になる。このファイルがあると、TeXShopは自動的にこれを開くようだった。あとは、このスクリプトを jMetaPost.engine という名前で保存し、chmod 755 とかで実行可能にして、作業終了。

今日は、初めてのShell スクリプトということもあり、エラー処理とかは全然出来てないが、それは後日に。

投稿者 sukarabe : 02:50 | この記事の固定URI | コメント (2) | トラックバック (0)

2007年05月23日(水曜日)

大学生が翻訳したLISPの本 [ プログラミング ]

先日本屋で On Lisp なる本を見かけた。入門書ではないが、LISPの奥義というか真髄が満載という感じの本だった。奥付を見て、訳者の野田開さんのプロフィールに驚く。何と学生さんである。高校生のときから翻訳に取り組んできたらしい。(詳しくは次の記事を参照。)
「『On Lisp』の日本語訳を始めたのは高校のとき」 弱冠21歳の翻訳者が明かす舞台裏:ITpro

LISPは以前にほんのちょっとだけ勉強したことあるが、手軽に遊べる処理系がなかったので、それっきりになっている。というか、CONSとCDRしか覚えていませんがな(苦笑)。今はSchemeなどの方言も含めて、いろんな処理系があるみたいで羨ましい。興味はつねにあるのだけれど・・・。

投稿者 sukarabe : 08:23 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年11月03日(木曜日)

mt-mimetexの修正 [ MovableType, TeX, プログラミング ]

このところ自家製のmt-mimetex.plを使ってmimetexによる数式表示をやっている。案の定というかバグが露呈。別組数式の部分で,改行文字がマッチしないものだから複数行に渡って書いた数式が変換されない。オプションとして「s」を付けると任意の1文字が改行でもマッチするという説明を見つけたので,置換部分を
$_=~s/(\\\[.+\\\])/&latex2mimetex($&)/seg;
と変更してみた。すると何と最長マッチになってしまい大失敗。うーむ,困った。あれこれ調べて,
「.+?」とすれば1個以上の任意の文字でしかも最短マッチになるらしい。ということで,
$_=~s/(\\\[.+?\\\])/&latex2mimetex($&)/seg;
に修正。何とかうまく行っているみたい。しかし正規表現は難しい。

投稿者 sukarabe : 22:21 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年10月08日(土曜日)

MT用mimetexプラグイン [ MovableType, TeX, プログラミング ]

誰かが作ってくれているはずだとGoogleで検索したのだが,結局見つけることができなかった。mimetexのサイトには誰かプラグイン作ってくれ〜と書いてある始末(笑)。

ということで仕方なくMovableType用のmimetexプラグインを自作することにした。 しかし,本当に無いのかなあ・・・。PukiWiki用とかHatenaダイアリーとかWordPressとか主だったブログツールにはあるのだから,MovableType用が無いとはにわかには信じがたいのだが。

ともかくMovableTypeのプラグインの仕様を知らねばならぬ。ということで,itex2MMLのソースを読んでプラグインのインターフェースを学ぶ。肝心の変換部分だが,以前,LaTeX文書をHTMLに変換するPerlプログラムを自作したことがあるので,そのコードを流用することにした。

どうせ自作なのだから自分好みにしてみた。PukiWikiなどのプラグインでは,&mimetex(数式)と書けば数式が画像で表示されるようになっている。&記号がプラグインのトリガーになっているのかも知れないが,できれば普通のLaTeX文書と同じく, ドル記号ではさんで$\frac{1}{\sqrt2}$などとする方が好みだ。ということで,そのようにしてみた。ついでに,\[ と\]ではさめば別組数式になるようにした。その場合,できれば数式をセンタリングしたいのだが,どうすれば良いのか分からなかったので,とりあえず一定のマージンを左側にとることで妥協。

では実験。

mimetexは数式をその場で画像に変換するcgiである。美しさではLaTeXRenderに劣るが,サーバーにLaTeXやImageMagickなどがインストールされてなくとも,スタンドアローンで動作するのがメリットだ。簡単に\frac{1}{\sqrt{2}}とかx=\frac{-b\pm\sqrt{b^2-4ac}}{2a}などと数式が書ける。別組数式(display math)も
e^x=\lim_{n\to\infty}\left(1+\frac{x}{n}\right)^n
のように書ける。

投稿者 sukarabe : 08:16 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年09月11日(日曜日)

数式日記システムの改良 [ プログラミング ]

LaTeXの処理を1回で済むように改良した結果,変換にかかる時間が半減した。しかし,dvipsを数式の数だけ起動させているので,まだまだオーバーヘッドがかなりある。dvipsがページ毎に独立したEPSF(Encapsulated PostScript File)を一括して出力してくれると嬉しいのだが,どうもできないようだ。そこで,dvipsとconvertを使う代わりに dvipng を試してみた。これは dvi ファイルから直接 PNG を生成するもので,ページの数だけのPNGを作ってくれる。何が素晴らしいって,スピードの速いこと!dvipsとconvert で14秒ぐらいのところを2秒ほどで変換してしまった。スピードを考えるなら,dvipng に限る。ただ,日本語の出力には対応していないのが残念なところなのだが。

投稿者 sukarabe : 18:09 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年09月10日(土曜日)

数式日記システムの改良計画 [ プログラミング ]

nDiaryの日記にTeXの数式を画像として埋め込むFilterは一応動いているのだが,数式に出会うたびに,TeX, dvips, convert が順番に呼ばれるため,最終結果までかなりの時間がかかる。特に過去の日記全体を変換するときなど,ゆっくりお茶が飲めるほどだ(大昔のコンパイラーの時代に戻ったと思えば良いのだが)。

さすがに遅いので,速度改善のためにアルゴリズムを変更することにした。プロファイラーで調べたわけじゃないので確かなことは分からないが,おそらくは,毎回tmp.texというファイルを作り,それをlatexでdviにコンパイルする部分で時間がかかっていると思う。大体,latexのたびに,いろいろなスタイルファイルを読み込んでいるのだから,オーバーヘッドは相当なものだ。次のようにして,latexの処理を1回で済ませるようにプログラムを書き換えようと思う。

nDiaryから数式への変換Filterが呼ばれると,数式画像へのリンク情報(つまりURIというかPATH)と数式ソース(つまりlatexコード)をペアにして保存する。そして,日記本体の方は,今までと同じ要領で,数式部分を画像へのリンクで置き換えて作成する。日記が作成された後に数式を画像に変換する処理を一括して行う。例えば数式を30個作らなくてはならないとすると,数式のあとに \vfil\eject などと書くことにより,30ページからなるtex文書を作る。これを latex でコンパイルすると,30ページからなる dviファイルができる。dvips は,特定のページだけを取り出して処理することができるので,dvips と convert を30回呼び出せば良い。最後の部分も一括してできればその方が良いのは明らかなのだが,今のところどうしていいか分からないので,妥協した。

こんな感じだが,LaTeXが1回で済むというのは大きい。dvips と convert の処理は比較的軽いので,それほどの時間はかからない。

投稿者 sukarabe : 14:09 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年08月08日(月曜日)

Perlスクリプト作品番号1 [ プログラミング ]

とりあえずなんとか動作するPerlのプログラムを作った。もう少しモジュラー化して大域変数の使用を減らす方が良いと思うが,まあ初心者の第1作としては許されるだろう。プログラム名をどうするか悩んだが,Micheal Adamsを一蹴したChess Programにあやかって(?),hydra1 という名前にした(笑)。例えば, %hydra1 hogehoge とすると,hogehoge.mdiary というファイルを読み込む,数式部分を順次画像ファイル(hogehoge_00001.gif など)に変換し,hogehoge.html というHTML文書を生成する。その際,platex, dvigif(dvipng) を順に呼び出しているから,これらのプログラムがインストールされていることが前提となっている。また Image::Size というPerl モジュールを使用しているので,これをCPANなどから入手しておく必要がある。サイトにアップするときに注意すべきは画像ファイルの場所だ。前もってアップする場所を決めておき,そこへのURLを記述するように変更しなくてはならない。

ということで,MacPerlの本を貸してくれたN氏へのレポートとして,ソースを晒しておくか(笑)。

つたないものではありますが・・・。

#!/usr/local/bin/perl -w
## shellから起動するときは,1行目を上のようなコメントにする。
## shellはこれを読んでPerlのプログラムと判断するらしい。
## あとファイルのパミッションを実行可に変更しておくこと。

use strict;
use Image::Size 'html_imgsize'; #このモジュールをCPANからインストールする。
    # HTML生成のため'width="X" height="Y"'の形式で大きさを取得
    # $size = html_imgsize("globe.gif");
    # $size == 'width="60" height="40"'

my $html_pre = <<'EOT';
<html>
<title>mdiary文書</title>
<body>
EOT

my $html_post = <<'EOT';
</body>
</html>
EOT

my $tex_template = <<'EOT';
\documentclass[12pt]{jarticle}
\begin{document}
\pagestyle{empty}
_TeXMath_
\end{document}
EOT

my $filename;    #入力ファイルの指定。例えばhogehoge
my $infile;      #hogehoge.mdiary となる
my $outfile;     #hogehoge.html となる
my @paragraph; # 空白行で分けられたパラグラフが入る配列
my $main_text="";
my $math_filename;
my $math_count=0;
my $math_identifier;
my $math_basename;
my $TEMPNAME="hydra1temp";
my $tex2dvi="qx|platex -interaction=batchmode $TEMPNAME.tex|";
my $dvipng="qx|dvipng -T tight $TEMPNAME.dvi -o $TEMPNAME.png|";
my $dvigif="qx|dvigif -T tight $TEMPNAME.dvi -o $TEMPNAME.gif|";

sub math2pict {
    my $display="no";
    my $math=$_[0];
    if ($math=~m/\$/){$display="no";} else {$display="yes";}
    $math =~ s/(\$|\\\[\s*|\s*\\\])//g;
    my $alttext=$math;
    $math='$¥displaystyle '.$math.'$';
    my $textext = $tex_template;
    $textext =~ s/_TeXMath_/$math/e;
    open (TEMPTEX, "> $TEMPNAME.tex");
    print TEMPTEX "$textext";
    close(TEMPTEX);
    eval $tex2dvi;
    eval $dvigif;  #eval $dvipng;
    &rename_gif_file;
    my $size=html_imgsize("$math_filename");
    if ($display eq "yes"){
	return qq|<br />
<img src="$math_filename" title="$alttext" alt="$alttext" $size hspace="48" vspace="10" /><br />|;
    }else{
	return qq|<img src="$math_filename" title="$alttext" alt="$alttext" $size align="middle" />|;
    }
}

sub rename_gif_file {
    $math_count++;
    $math_identifier=sprintf("%05d", $math_count); # 数式の画像は5桁の数字で識別
    $math_filename=$math_basename."_".$math_identifier.'.gif';
    rename "$TEMPNAME.gif", "$math_filename";
}

# main routine start here

$filename=$ARGV[0];
$infile=$filename."\.mdiary";
$outfile=$filename."\.html";
$math_basename=$filename;
local $/=""; #空行を区切り記号に設定する。
open (INFILE, "<$infile") || die "File Not Found";
@paragraph=<INFILE>; #空の行を区切りとして文書をパラグラフに分割して配列に入れる。
close INFILE;

foreach (@paragraph) {
    chomp;
    if (m/^%%/) { # Blockの冒頭が%%の場合,文書情報のBlockと認識する
	#今のところ単に読み飛ばすだけ。
    } else {
        s/(\$[^\$]+\$|\\\[.+\\\])/&math2pict($&)/eg; # $...$, \[...\]なる部分を数式画像に変換。(option e : 評価した後に置換)
	$main_text=$main_text.'<p>'.$_.'</p>'."\n\n";
    }
}

open (OUTFILE, ">$outfile");
print OUTFILE $html_pre;
print OUTFILE $main_text;
print OUTFILE $html_post;
close(OUTFILE);

投稿者 sukarabe : 14:22 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年07月30日(土曜日)

Perl勉強中 [ プログラミング ]

初めてのPerl」というオライリーの本ならびにネットの情報で,Perlなるプログラム言語を学習中なのである。この歳で新しいことを学ぶのは非常に大変なのである。いや〜難しいなあ・・・。というか,Perlって変わっているよ,ホントに!

PascalやCといった古典的な言語しか知らない身としては,とまどう事が多かった。やっと少しだけ理解できたかな,と思うので,自分のための備忘録として記録。

Perlの特徴というか要点は次の2つだと思う。一つは,プログラム言語にしては,あまりにも文脈(コンテクスト)に依存したコードが書けるという点。これでは自然言語だよ。例えば,標準入力<STDIN>から入力する場合,次の2つは異なる。

$contents=<STDIN>;
@contents=<STDIN>;

スカラー変数$contentsには一行分の文字列が入るが,@contentsは配列(リスト)なので,そのコンテクストに合わせて,ファイル全体を行で分割し,配列にしてから全体を代入することになる。

二つ目は,デフォルトの変数 $_ が便利にというか,野放図に使われるという点。慣れれば便利なのかも知れないが,元Pascalプログラマーとしては,あまりにも杜撰な文法だな,と思う。

しかし,この2つの異文化に慣れれば便利な言語ではある。そろそろ実際に動く実用的なプログラムが書けそうなので,頑張ってみよう。

投稿者 sukarabe : 22:06 | この記事の固定URI | コメント (3) | トラックバック (0)

2005年06月12日(日曜日)

欧文等幅フォント [ プログラミング ]

TeXでコーディングするときは,それほどでもないが,基本的にプログラムを組むときは,monospace つまり固定幅のフォントでしょう。という訳で,偶然見つけたページを備忘録がわりに記録。
Monospace/Fixed Width Programmer's Fonts

Bitstream Vera Sans Mono というのがよさげだったので,ダウンロードして Mac にインストールしてみたが,うまく表示されない。うーむ。説明を読むと,local.confというのをどっかに入れろとある。え〜そのままじゃだめなのか〜。残念。

投稿者 sukarabe : 17:15 | この記事の固定URI | コメント (0) | トラックバック (0)

2005年04月27日(水曜日)

PHP正規表現の謎 [ プログラミング ]

まだWordPressを試行中なのだが,mimeTeXプラグインの改造を試みてみた。mimetexプラグインを使うと [tex] \int_{0}^{\infty} e^{-x^2}\,dx = \frac{\sqrt\pi}{2} [/tex] のように LaTeX に準拠した形で数式が書ける。しかし,それならば,いっそのこと LaTeXそのままに,数式を $... $ とダラーで囲む方がずっと便利だ。ということで,mimetex.php を読んでみた。

自慢じゃないが PHP というプログラム言語はまったく知らない(笑)。しかし,ソースを読むと,やっていることは意外と単純なように思える。まず,記事全体は $text という変数に入っている。これに対して,次のような操作を施している。

preg_match_all("#\[tex\](.*?)\[/tex\]#si",$text,$tex_matches);

PHPのマニュアルその他をネットで調べてみると,どうやら上のコードによって, [tex] 数式 [/tex] というパターンをすべて探し出して,数式の部分を $tex_matches という配列に代入しているらしい。そのあとを読むと,順に mimetex.cgi に数式を渡して,画像に変換させ,その画像を当該部分に差し込むという処理をしている。

上のコードを修正して,[tex]...[/tex] の代わりに $...$ というパターンを探し出すようにできれば,最初の目的は達成される。あくまでも最初の,ではあるが。

さて正規表現だが,この場合は簡単だ。上で # とあるのは,単なるデリミターにすぎない。[ と ] はメタ文字なので,バックスラッシュでエスケープしてあるのがわかる。$ もメタ文字だから,同様にエスケープすればよいだろう。こう考えて,次のように変更してみた。

preg_match_all("#\$(.*?)\$#si",$text,$tex_matches);

これが,まったく機能しない。しないどころか,PHPがエラーを吐く。うーむ・・・。あれこれ調べても分からない。試しに,@...@ではさむことにして,

preg_match_all("#@(.*?)@#si",$text,$tex_matches);

と変更すると,ちゃんと機能する。たしかに方針は間違っていない。ダラーがちゃんとエスケープされてないのが問題だ。

ふと,以前 Emacs LISP か何かで,バックスラッシュをエスケープするのに \\ では駄目で, \\\\ としなくてはならない,という話を思い出した。その理由も理解していないのだったが(苦笑),駄目もとで次のようにしてみた。たしか,バックスラッシュのエスケープを2段階行うということだったと思うので・・・

preg_match_all("#\\\$(.*?)\\\$#si",$text,$tex_matches);

これが,何故か動く(笑)。あはは。どうしてなの?どうして,これで機能するのか,誰か教えてくれないだろうか。


投稿者 sukarabe : 19:28 | この記事の固定URI | コメント (0) | トラックバック (2)

2005年02月07日(月曜日)

Emacs Lispで常きげん? [ お酒, プログラミング ]

Emacs Lispでの正規表現が分からない。xyzzyやMeadowで編集するときに、LaTeXでの別組数式 \[ ... \] に色を付けたいと思ったのだが、これができない。バックスラッシュもブラケットもメタ・キャラクターになっているのは分かるのだが、しかし単純に \\\[*\\\] みたいな感じではマッチしてくれないのだ。

調べてみると、かなり面倒なことになっているらしい。Emacs Lispでバックスラッシュを表すには、\\ ではなく、\\\\ となるらしい。うーん、分かんないよ~。

検索してたどりついたのは、山本和彦さんという方のEmacs Lispのページ。ここに、Emacs Lispでの正規表現についてのページがある。うーむ、難しいなあと、しかたなく(?)あちこち見ていると、なんと酒蔵巡りというページがあり、常きげんの蔵の訪問記がある!静岡の初亀や石川の宗玄も!きわめつけは、スコットランド蒸留所めぐりだ。なんとなんとSpringbankがあるじゃないか。スプリングバンクは一番好きなスコッチなのだ(最近飲んでないけど)。ああ、SpringbankのWest Highlandが飲みたくなってしまった。うーん、他人とは思えないぞ(笑)。あ、Emacs Lispの正規表現の話でしたね。今日はもう寝ます(苦笑)。

投稿者 sukarabe : 02:35 | この記事の固定URI | コメント (0) | トラックバック (0)

2004年09月14日(火曜日)

短縮形での曜日表示 [ MovableType, プログラミング ]

日付のフォーマットを調べてみた。例えば,2004年09月14日(火)のように出力させたいとする。年号は,%Y, 月は%m, 日は%dとすればよい。ところが,曜日の短縮形がうまくでない。%aで良いはずなのだが記号らしき変なものがでるだけだ。%Aとすれば一応火曜日ときちんと出るので用は足りるのだが,ちょっとしゃくだ(笑)。きっと同じように感じる人がいると思って検索してみた。きゃんころ:MovableType曜日問題に原因を含めて詳しく書いてある。解決策も書いてあるので,ありがたくちょうだいすることにした。うちのUtil.pmでは,112行目あたりに当該のコードが書いてあるので,指示された3行を追加した。おかげさまで,日本語でも曜日の短縮形が表示されるようになった。

(2004年9月15日に追記)
念のためW3CのValidation Serviceに行ってみたら,WARNINGを出されてしまった。reference not terminated by REFC delimiter とか書いてある。どうも,曜日の出力の部分で #&xxxxxx がいけないらしい。セミコロンで終わるべし,と。やれやれ,きびしいですね!(苦笑)。Util.pmを修正して,最後にセミコロンを出力させるようにすれば良いのだろうか。しかし,Perlの文法を知らない(汗)。

Perl, 文字列の結合,というキーワードで検索してみた。ふーん,Perlって文字列の結合はドットで表すのか。プラスじゃないんだ。文の終わりにセミコロンが必要なことも知らなかった(やれやれ・・・)。何度かコンパイルエラーを出したが(だって変数は宣言しなくてもいいって書いてあったのに・・・くすん),なんとかセミコロンと結合させて出力させることができた。良かった良かった。

(更に追記)
もう一度,きゃんころさんの記事を読んでみると,何のことはない。7バイト拾ってくるところを8バイトに変更すれば,ちゃんとセミコロンまで出力されるではないか!ということで,たった一文字変更するだけでよかった。


if ($lang eq 'jp') {
$f{a} = substr $L->[0][$f{w}] || '', 0, 8;
}

投稿者 sukarabe : 19:15 | この記事の固定URI | コメント (0) | トラックバック (0)

2004年09月08日(水曜日)

nDiaryからMovableTypeへの移行 [ Blogツール, プログラミング ]

最初,2ヶ月ほど日記をHTMLを直接がしがしと書いていたが,ほどなく飽きてきて(笑), nDiary を1年ぐらい使ってみた。これはこれで便利なのだが,画像をアップするときなどは,やはり手でHTMLを書くことになる。さらに,画像を縮小したり事前の作業がけっこう面倒だったりする。そこで,MovableTypeに移行することにしたのだが,いままでの日記をコンバートできないか考えてみた。以前に Ruby の入門書を買っていたので,良い機会だし,nDiaryの書式からMovableTypeの書式への変換プログラムを書くことにした。Rubyで書く最初のプログラムが文書変換ツールになるとは思わなかったが(苦笑)。参考にした本は,「たのしいRuby」と「Rubyレシピブック」である。まだオブジェクト指向言語らしくは書けず,まるでPascalかFortranで書くような伝統的な書式になってしまったような気もするが,まあいいか。一つ分かったことは,文字列の操作についてはRubyは非常に充実している,ということだ。このような変換プログラムを書くにはもってこいのようだった。

話は変わるが,上記の入門書であるが,どうも感心しない。妙に初心者寄りかと思えば,全然説明してない事柄を使った例とかがあり,きわめて非論理的な書き方だと思う。むろん公理主義的に書けと言っているのではない。Kerninghan-Richie の C言語の入門書や,Knuth の TeXbook のように,簡単な例から初めて,読み進むうちに徐々に文法に慣れていき,同時によく使うテクニックも身に付く,このような入門書を望んでいるのだが・・・。

投稿者 sukarabe : 09:57 | この記事の固定URI | コメント (0) | トラックバック (0)

2004年02月08日(日曜日)

パソコン教室 [ プログラミング ]

うちのマンションで,Tさんの発案でパソコン教室をやろうということになり,本日無事に行われた。僕は手伝いということで,結局午前,午後の2回,計4時間ほど,サポート隊の一員として(笑)初心者の人たちの面倒をみた。約40軒がMLに入っているのだが,その宣伝も兼ねてってところが少しよこしま(^^;)だったりするが。

僕もTさんも理事ではないが,下部組織の諮問委員会(おおげさだが)みたいな所に所属していて,主な仕事はネット,テレビなどに関するものだ。お年寄りも多く,いまさらパソコンやメールなんて,という方もいるだろうが,女性を中心として,多くの参加者を得て,けっこうな盛況ぶりだった。

何でもそうだが,最初が難しいと痛感する。とくにキーボードからの入力,日本語とアルファベットの切り替えなど,慣れるまでには時間がかかると思う。

投稿者 sukarabe : 12:00 | この記事の固定URI | コメント (0) | トラックバック (0)