忘れたときに備えた記録

トップ 最新 追記
2005|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|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2008-11-08(Saturday)

DOCTYPEとか、実体参照の文字コードとか

今までずっと、XHTMLにはDOCTYPEによる文書型宣言が必要だと思っていたのですが、最近、XMLについて色々調べ直していて、Validな XML文書(バリデータに通してチェックしたいとか)とするのでなければ、文書型宣言なしでも良いと知りました。その場合は(文書の記述に間違いがなければ)「整形式XML文書」と言うようです。

ところで拙作のMathMLライブラリでは、多くの記号を"α"という実体参照を使って出力しています。ライブラリの中には変換テーブルを持っているのですが、

"\alpha"=>nil

のように変換先がnilならそのまま "α"に直すだけ、という処理によってテーブルの大きさを少し節約しています。

XML文書においては、この実体参照はMathMLやXHTML+MathMLのDTD|]]で定義されているので、文書型宣言でそれらのDTDを参照するように指定しないと、Firefoxでは「未定義の実体参照です」とか言われてエラーになります。

じゃあどうしたら良いかというと、文字参照を使って文字コードを"&x3b1;"とか書いてやると、文書型宣言なしでもエラーが出なくなります。

ここで、「それじゃ本文をEUCで書いて数式をMathMLで書く場合はどうするんだ?例えばHiki+MathMLプラグインとか」という疑問がわいてくるわけです。αとかはEUCの文字表にもありそうですが、特殊な記号、例えば\ointなんかはEUCの文字表にはないようです。ていうかそもそも、MathMLのDTDを見てみると、UTF8の文字コードによる定義

<!ENTITY alpha            "&#x003B1;" ><!--/alpha small alpha, Greek -->

はあるけど、EUC版の定義はありません。あれ、でもHiki+MathMLプラグインでは問題なく「本文がEUC数式はMathML」で表示できています?????

実はここで、僕の勘違いその2が発覚したのですが、Extensible Markup Language (XML) 1.0 (Fifth Edition)辺りによると、文字参照で指定するのは常にUnicodeの文字コードでした。ずっと、XML文書のエンコーディングに応じて変える必要があると思っていましたが、間違いだったわけです。

というわけで、文書型宣言なし、記号は文字参照のXHTML文書を作ってみました。UTF-8版とEUC版です。どちらもFirefoxでは問題なく閲覧できます。

IE7+MathPlayerでは閲覧できませんでした。残念。試しに文書型宣言を入れてみると、IE+MathPlayerでも表示できました。ただし、EUC版は文字化けします。あ〜あ。

それでまぁ結局なにが言いたいのかというと、

  1. 現在のMathMLライブラリは記号の出力に実体参照を使っていて、記号の変換テーブルをすこし節約出来ている代わりに、XML文書に文書型宣言がないとエラーになる
  2. 変換テーブルが太るのに目をつぶって文字参照を使うようにすれば、文書型宣言なしのXML文書にMathMLを埋め込むのにも使えて、ライブラリの用途が増えそう。EUCなHikiでの利用も従来通り問題無し!
  3. なので、文字参照を使うようにMathMLライブラリを直します。近い内に

というわけです。どっとはらい

Tags: MathML

おまけ - 記号一覧表

Characters, Entities and Fontsの様な表を作ってみました。あなたのブラウザは全部見ることが出来ますか?なんちゃって

Tags: MathML

オレオレXMLで&sum;を使う

色々調べて、内部DTDサブセットで外部パラメータエンティティを使うことで(という言い方でいいのかすら、まだ自信がないのです)、自作のXMLで&sum;等のMathMLのDTDで定義されている実体参照を使えることがわかりました。

<?xml version="1.0"?>
<!DOCTYPE hiraku [
<!ENTITY % ent PUBLIC
 "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
 "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
%ent;
]>
<hiraku>
&sum;
</hiraku>

実際にこの内容で保存したファイルが xml_math.xml で、Firefoxではきちんとシグマが出ています。

ただ、色々と試してみたところ、例えば同様に &sum; を定義している http://www.w3.org/Math/DTD/mathml2/iso9573-13/isoamsb.ent を使って

<?xml version="1.0"?>
<!DOCTYPE hiraku [
<!ENTITY % ent-isoamsb
      PUBLIC "-//W3C//ENTITIES Added Math Symbols: Binary Operators for MathML 2.0//EN"
             "http://www.w3.org/Math/DTD/mathml2/iso9573-13/isoamsb.ent" >
%ent-isoamsb;
]>
<hiraku>
&sum;
</hiraku>

というファイルを作って(xml_ent_isoamsb.xml、Firefoxで表示させようとすると、「&sum;は定義されてません」エラーが出てしまいます。

うううむ。FirefoxだとXHTML+MathMLだけ特別扱いするような処理になっているのでしょうか。

Tags: XML

追記 - IEの場合

そして更に謎なことに、IE7だと1つ目のxml_math.xmlではエラーが出るのに、xml_ent_isoamsb.xmlだと問題なくXMLが表示されて、&sum;の部分がシグマになっているのです。

わけわから~ん

Tags: XML

さらに追記 - W3C Validatorの場合

The W3C Markup Validation Serviceにかけたら、どっちもエラーになりました。うううむ。

DOCTYPEの部分は http://web.resource.org/rss/1.0/spec のサンプル

<?xml version="1.0"?>

<!DOCTYPE rdf:RDF [
<!ENTITY % HTMLlat1 PUBLIC
 "-//W3C//ENTITIES Latin 1 for XHTML//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
]>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
>

...

を使ったんだけど、そもそもこれがダメなのかな。

Tags: XML

今日最後の追記

rss_test/xml

<?xml version="1.0"?>

<!DOCTYPE rdf:RDF [
<!ENTITY % HTMLlat1 PUBLIC
 "-//W3C//ENTITIES Latin 1 for XHTML//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
]>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
/>

とい内容で作ってValidatorにかけてみたら、やっぱりエラーになりました。ふ~む

Tags: XML

2008-11-18(Tuesday)

Ubuntuのメモでいくつか書き忘れていたものがあったので、まとめて書いてしまいます。

64bit版でAdobeReaderを使う

まず、301 Moved Permanentlyから、debパッケージ版のAdobeReaderをダウンロードします。

このパッケージは32bit版なので、64bit環境で普通にインストールしようとすると

パッケージアーキテクチャ (i386) がシステム (amd64) と一致しません

というエラーが出ます。それを無視させるために

~$ sudo dpkg --force-architecture -i AdobeReader_jpn-8.1.3-1.i386.deb

としてインストールします。取り合えずこれで、単独のAdobeReaderが使えるようになります。

Firefoxのプラグインとして使う場合には、もう一手間必要です。

まず、まだインストールしていなければ nspluginwrapper パッケージをインストールします。その上で、

~$ nspluginwrapper -i /opt/Adobe/Reader8/Browser/intellinux/nppdf.so

とします。これで、64bit環境でもFirefoxでPDFを見ることが出来るようになります。

参考資料

AMD64で コギゲン Ubuntu - 64ビットFirefoxにFlashプラグイン(32ビット)をインストール

nspluginwrapperはここで知りました。Flashなんかも同様の方法で見ることが出来ます。

Tags: Ubuntu

キーボード設定 - CapsLockの挙動とか

以前書いたShiftキーと同時押しした場合だけCapsLockでロックする方法ですが、Ubuntu8.10ではハードウェアの設定方法が変わって xorg.conf からキーボードの項目が無くなってしまいました。追記してもうまく反映されません。

それで調べたところ、console-setupパッケージをインストールあるいは dpkg-reconfigure で設定するときに、適切な設定を行うことでCapsLockの挙動が変わることが分かりました。この項目は、Ubuntu8.10をインストールするときにも出てくるのでその時点で設定するのも良いと思います。

具体的には、キーボードの種類を選ぶ所で、日本語106キーボードを選んだ後に、"OADG 109A"という種類のキーボードを選ぶことで、CapsLockのロック動作がShiftキーとの同時押しの場合だけ働くようになります。(今まではデフォルトで選択されている OADG109Aではない方を選んでいて、CapsLockが単独で働くようになっていたのです。自分が使っているキーボードも知らんかったのか〜)

参考資料

IntrepidReleaseNotes/ja - Ubuntu Wiki

リリースノートはちゃんと読みましょう、というオチです(汗

Tags: Ubuntu

タイトルバーが化ける

化けたタイトルバーのように、ウィンドウのタイトルバーが化ける問題が発生していました。3D効果を色々有効にすると再現します。

これを直すには、emerald パッケージを入れて、

~$ emerald --replace

とすると、ウィンドウのテーマが変わり、それと共にタイトルバーも化けなくなります。

ログインし直すと戻ってしまうはずなので、"Compiz Config 設定マネージャ"の"エフェクト"にある"Window Decolation"のCommandを

/usr/bin/compiz-decorator

から

/usr/bin/emerald

に直します。

参考資料

【初心者専用】 Ubuntu Linux 31

Tags: ubuntu

2008-11-29(Saturday)

自動起動と自動シャットダウン

VMware Server 2.0を使い始めて少し立つのですが、それについていくつかメモをしておきます。

1.xでは、ホストがシャットダウンするときにゲストがどうするか(電源OFFかシャットダウンか)とか、ホストが起動したときにゲストがどうするかは、ホスト毎に設定されていました。

2.0では、Webの設定画面の「ホスト(ホストマシン名)」のSummary画面に "Edit Virtual Machine Startup/Shutdown Settings"というのがあって、ここから設定するようになりました。

ゲスト毎の設定画面では、バーチャルマシンの電源ボタンを押したときにどうするか(強制OFFかシャットダウン)しか選べないので注意です。気がつくまでかな〜り探しました。

もう一点。

2.0になって、インストール時に「VMware Serverを管理するアカウントを入れなさい」的な項目が出てきます。で、これはUbuntuのポリシーとの合せ技だと思うのですが、rootではなく、普段使っているユーザーIDを入れてしまったのです。

これの何がマズいのかというと、ホストをシャットダウンしたときに、ゲストが(設定に関わらず)強制電源OFFになってしまうのです。

例えば

$ sudo service vmware-autostart stop

とすると、本来はゲストがシャットダウンするはずなのに、何も起きません(ホストのシャットダウン時にはそのまま電源OFFに進んでしまって、結局ゲスト側も強制電源OFFになってしまう)。

VMware Serverの管理アカウントをrootにしておくと、うまく動きます。

Tags: VMware ubuntu

システム起動・終了時に動くスクリプト

システムが起動する時には各種サーバーソフトウェアが起動し、システムが終了する時にはまず各種サーバーソフトが終了していきますが、これはどこで決まっているのかというお話しです。

多分Debianも同じ仕組みです。Redhat系など他のディストリビューションやFreeBSDなんかだとまた違った仕組みかもしれません。

各サーバーソフトウェアの起動・終了は /etc/init.d/ 以下に保存されているファイルに記述されています。Apacheなら /etc/init.d/apache2 だし、mysqlなら /etc/init.d/mysqlだし、vmwareなら /etc/init.d/vmware です。

これを使って手動で起動/終了するには

$sudo /etc/init.d/apache2 start  # 起動
$sudo /etc/init.d/apache2 stop   # 終了

とします。Ubuntu8.10では

$sudo servier apache2 start/stop

でも出来るようになりました。

/etc/rc0.d/ や/etc/rc2.d/などのディレクトリには/etc/init.d/ファイルへのリンクが作られていて、起動・終了時にはこれを使ってサーバーの起動・終了を行っています。

/etc/rc*.d/の数字の部分はrunlevelで、/etc/event.d/ 以下のファイルでその意味を知ることが出来ます。例えば

  • 0 : シャットダウン
  • 2 : マルチユーザーモード(通常の動作時のモード)
  • 6 : 再起動

です。

rc*.dに保存するファイル(/etc/init.d/ファイルへのリンク)については、名前に次のような規則が定められています。

  • Sと2桁の番号で始まる : そのrunlevelに変わったときに start を付けて実行する
  • Kと2桁の番号で始まる : そのrunlevelに変わったときに stop を付けて実行する

例えば次のようなファイルを作って

#!/bin/sh
LOG="/home/foo/log_in_out.log"
date >> $LOG
echo $0 $* >> $LOG

次の名前でリンクを張ります。

  • /etc/rc0.d/K01log_in_out
  • /etc/rc0.d/K99log_in_out
  • /etc/rc0.d/S01log_in_out
  • /etc/rc0.d/S99log_in_out
  • /etc/rc2.d/K01log_in_out
  • /etc/rc2.d/K99log_in_out
  • /etc/rc2.d/S01log_in_out
  • /etc/rc2.d/S99log_in_out
  • /etc/rc6.d/K01log_in_out
  • /etc/rc6.d/K99log_in_out
  • /etc/rc6.d/S01log_in_out
  • /etc/rc6.d/S99log_in_out

これで、システムの起動・終了時にどの順番で実行されているかを確かめることが出来ます。

vmwareのゲストにはrc0.d/K01、rc2.d/S99、rc6.d/K01を入れておくと、ホストをシャットダウンや再起動したときにゲストが正しくシャットダウンされているかを確認できたりして便利です。

…実はずっと、「rc2.dにS99とK99を入れておけば、runlevel2になったときにSが実行されて、2から別のに変わったときにKが実行される」と勘違いしていたのです。どっとはらい。

Tags: ubuntu
本日のツッコミ(全1件) [ツッコミを入れる]

_ いしやん [参考になりましたありがとうございます。 pcのon/offをsyslogで調べてましたが、こちらのやり方の方が簡単で..]