コーランを猫英語で 2009-09-23 英語,個人的な好み,اللغة العربية
Blogger の機能を増設中 2009-03-10 Blogger,自然言語,اللغة العربية
الزِئْبَق 2009-01-12 インドネシア語,タイ語,自然言語,اللغة العربية


2009-09-23

コーランを猫英語で



前にもこのブログで取り上げたことがある猫英語(lolcat)。聖書を lolcat に「翻訳」しようという試みがあるのは知っていたが、イスラムの聖典コーランも「翻訳」されている。上の画像のページがそれだ。

コーラン第1章「開扉の章」は、次のように訳されている。

Chapter 1 teh Cat Door
1. Props to da Rewf Cat, OMG,
2. who iz purry n rubby;
3. an no do bad stufs,
4. wiff skerreh teefs and klawz.
5. U iz da boss uv us, srsly.
6. U herds us,
7. where yu has peed, not da naybor cats, or da strays.

「扉」は the Cat Door。「慈悲深く慈愛あまねき」は OMG (= Oh, my God!)。「アッラー」は the Roof Cat。 roof には屋根、屋上、てっぺん、最高、家庭などの意味がある。

この7行しかまだ見ていないのだが、出来がすばらしすぎるので、英語版コーランからの重訳ではなく、原文(アラビア語)から直接 lolcat に翻訳していると思われる。

いいなあ。分かる人がめちゃくちゃ限られそうだけど、何かに使えないかな。(笑)

---
19:07に追記: 以下のようなのを書いてみました。
orangkucing #twnovel 猫扉の章。かわいい屋根ぬこ様、あなたのおみ足の下で。全てのゴロゴロの主に讃えあれ、高貴な姿と振舞いの御方、恐ろしい歯と爪を持つ。私達は、あなたにのみ仕え、あなたのもの。私達の番をしてくださる。他の猫や野良ではなく、あなたが小用をなさった道に私達をお導きください。16:17 PM Sep 23th

2009-03-10

Blogger の機能を増設中

Blogger のテンプレートを玩んでいた。

---

まず、フィード関連。

気分屋なので「チェックしてないと気が済まない」という物事はこの世に存在しない。ニュースだってテレビだって全然見ないときは見ない。というわけで、フィード関連は、これからも自分では使わない。と思う。

しかし、もちろん自分の好みは関係がない。

他人が便利に見てこその blog なので、フィード関連を充実させてみた。ラベル毎の投稿フィードを自動的に作成する JavaScript がクリボウさんのところにあった。おお、これはすばらしい!ありがとうございます、使わせていただきます。

でも、せっかく JavaScript の関数 encodeURIComponent() を使うのだから、 Unicode で表せる言語は全てサポートしたい。つまり、左→右と左←右のように書字方向が異なる言語が混在していても大丈夫にしないと。そして、例えばアラビア語で blog をやってる人にも使えるようにしないと。

そのためには以下のように、 data:blog.languageDirection に関連する2ヶ所(本質的には1ヶ所)を変更するだけで良い。

<ul>
<b:loop values='data:labels' var='label'>
<li>
<b:if cond='data:blog.url == data:label.url'>
<span expr:dir='data:blog.languageDirection'>
<data:label.name/>
</span>
<b:else/>
<a expr:dir='data:blog.languageDirection' expr:href='data:label.url'>
<data:label.name/>
</a>
</b:if>
(<data:label.count/>)
<script type='text/javascript'>
var icon = &#39;src=&quot;http://sites.google.com/site/onecotravel/icons/icon_feed12.png&quot;&#39;;
document.write(&#39;&lt;a title=&quot;Posts feed on this category&quot; &#39;);
document.write(&#39;href=&quot;/feeds/posts/full/-/&#39; + encodeURIComponent(&#39;<data:label.name/>&#39;) + &#39;&quot;&#39;);
document.write(&#39; target=&quot;_blank&quot;&gt;&#39;);
document.write(&#39;&lt;img width=&quot;12&quot; height=&quot;12&quot; &#39; + icon + &#39;/&gt;&#39;);
document.write(&#39;&lt;/a&gt;&#39;);
</script>
</li>
</b:loop>
</ul>


この変更をしないとき、何が起こるかは次を見ればわかる。先に、blog のデフォルトの書字方向が ltr の場合の例をあげ、次に rtl の場合の例を掲げる。none は何も対処しないとき、 data:blog.languageDirection は対処したときの表示だ:
    none
  1. 日本語اللغة العربية (123)
  2. اللغة العربية日本語 (123)
    data:blog.languageDirection
  1. 日本語اللغة العربية (123)
  2. اللغة العربية日本語 (123)
    none
  1. 日本語اللغة العربية (123)
  2. اللغة العربية日本語 (123)
    data:blog.languageDirection
  1. 日本語اللغة العربية (123)
  2. اللغة العربية日本語 (123)
[ヒント: マウスで文字列をいろんな始点からいろんな方向へドラッグしてなぞってみると、どういう順に字が繋がっているかがわかるよ。それから、アラビア語でも数字は左→右に書く。]

実は、私の使っているテンプレートにはこの多国語対応は実装されていた。しかし、余計なところで書字方向を指定するというバグ入りだったからそれは除去してある。このバグは、「書字方向によって括弧のグリフは自動的に反対向きになる」という知識のない人の仕業だった。「なぜ同じ向きの括弧が2つ現れるのか」を、かわいそうに、悩んだに違いない。ほらほら、日本語だって、横書きと縦書きで、テキストデータそのものは同じなのに、括弧(や、句読点などの約物)のグリフだけは自動的に置き換わるようになってるでしょ?

(日本語ブログに於ける需要、少なからむ…。)

意味があるんだかないんだか。(笑)

---

次に。

テンプレートを読んでいたら、それぞれの投稿 post 毎に data:post.timestampISO8601 という属性が参照できることが分かった。

上と同じクリボウさんのところに、投稿とか更新の時期で絞ってフィードを受けるパラメータが書いてあった。なるほど、 Blogger は ISO8601 での時刻表記を検索キーにしていたんだね。(書いたあとでわかった:実は、世の中のフィードと言われるもの全般がそうみたい。なにせ RFC3339 がある。汗)

さて、Blogger にはコンテンツの表示方法が3通りある。簡単に説明しておこう。

(1) index 表示: 「ホーム」、あるいは、「ホーム」から「前の投稿」「後の投稿」だけを踏んで辿り着く表示。コメントとバックリンクの内容は表示されない。この状態で「前の投稿」「後の投稿」を踏むとオーナーの設定した記事数で機械的に index 表示される。 (注: Blogger 関連の古い文献では index ではなく main 表示という名で同じものを呼んでいる。)

(2) item 表示: 1つの投稿への permalink (別のサイト上に書かれたリンクなど)、または、記事の最後にある「Links to this Post」とかいうやつ、「アーカイブ」の特定の1つの投稿へのリンク(オーナーが HIERARCHY モードに設定している場合に限って存在)のいずれかを踏んだ直後の表示。1つの投稿だけが表示され、コメントとバックリンクの内容が表示される。この状態で「前の投稿」「後の投稿」を踏むと1つの投稿だけが item 表示される。

(3) archive 表示: 「アーカイブ」「ラベル」の中から投稿の集合(実際には要素が1つかもしれない)を表すリンクを踏んだ直後、あるいはそこから「前の投稿」「後の投稿」だけを踏んで辿り着く表示。コメントとバックリンクの内容は表示されない。この状態で「前の投稿」「後の投稿」を踏むと元の分類になるべく沿って archive 表示される。

以上により、大昔の投稿を index 表示させるには「ホーム」から延々と遡る以外に方法は存在しないことが分かる。多大な努力が必要だ(笑)。他の表示にはどの表示からも、より簡単に辿り着ける。つまり、index 表示は他の表示の上流にある

今日は、その上下関係も解消してみた。

具体的には、 item 表示のみに存在する部分(コメントとバックリンクの内容の部分)の直上にを追加した(この素敵なアイコンそのものはヒトミンさん作成の素材だ。ありがとうございます)。このボタンは、 現在の item 表示を index 表示に切り替える機能を持つ。パッと見にはコメントとバックリンクの部分が縮むだけ(この blog に限っては一番上にもちょっと変化がある)。しかし、縮んだ後で「前の投稿」「後の投稿」を踏むと、 item 表示と index 表示では挙動が違う。

試してみよう: 場合1: この記事の直後にが見えているとき。あなたは今 item 表示だ。ボタンを押してみよう。 index 表示になり、ボタンが消える。

場合2: 記事の直後にボタンが無いとき。あなたは今 index か archive 表示だ。記事の上下にある投稿時刻、あるいは、記事の下の 「Backlinkとコメントを見る」を叩いてみよう(これは Blogger にもともとある機能だ)。 item 表示になり、ボタンが出現。

場合 1, 2 のそれぞれで、「もっと古い記事へ」とか「もっと新しい記事へ」というリンクも踏んでみると、違いがもっとよく分かる。

以下、プログラミングの細かい話。

このボタンを実装する際には「±1秒で挟んで自分自身を検索する」という方法をとった。 JavaScript で ISO8601 の時刻の加減算ルーチンを書く必要があったのだが、ぶいてくさんのところが参考になりました。ありがとうございました。

Blogger では投稿時刻を「分」の単位までしか指定できない。それにもかかわらず、検索のキーは「秒」の精度をもつ。これはおそらく、複数の投稿が同一時分になることがあると考えた仕様だ。だから、この部分で手を抜いて max-results=1 とやってはいけない: index 表示に変更したときに自分自身が検索結果から抜け落ちる可能性があるからだ。というわけで、実際のコードは以下だ。

<b:if cond='data:blog.pageType == &quot;item&quot;'>
<div>
<script type='text/javascript'>
var msToISO8601 = function (m) {
var sprintf = function (s) {
return (&#39;0&#39; + s).replace(/.*(..)/, &#39;$1&#39;);
}
var d = new Date();
d.setTime(m);
return (&#39;000&#39; + d.getUTCFullYear()).replace(/.*(....)/, &#39;$1&#39;) + &#39;-&#39; + sprintf(d.getUTCMonth() + 1) + &#39;-&#39; + sprintf(d.getUTCDate()) + &#39;T&#39; + sprintf(d.getUTCHours()) + &#39;%3A&#39; + sprintf(d.getUTCMinutes()) + &#39;%3A&#39; + sprintf(d.getUTCSeconds()) + &#39;Z&#39;;
}
var newdate = Date.parse(&#39;<data:post.timestampISO8601/>&#39;.replace(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}:\d{2}):(\d{2}|\d{2}\.\d+)([+-Z])(.*)$/, &#39;$1/$2/$3 $4 UTC&#39;)) + 1000*RegExp.$5;
if (RegExp.$6 != &#39;Z&#39;)
newdate -= Date.parse(&#39;1970/01/01 &#39; + RegExp.$7 + &#39; UTC&#39;)*parseInt(RegExp.$6 + &#39;1&#39;, 2);
document.write(&#39;&lt;a href=&quot;/search?&#39;);
document.write(&#39;updated-max=&#39; + msToISO8601(newdate + 1000));
document.write(&#39;&amp;&#39;);
document.write(&#39;updated-min=&#39; + msToISO8601(newdate - 1000));
document.write(&#39;&quot;&gt;&#39;);
document.write(&#39;&lt;img src=&quot;http://sites.google.com/site/onecotravel/icons/shut_01.gif&quot;/&gt;&#39;);
document.write(&#39;&lt;/a&gt;&#39;);
</script>
<span style='font-size:x-small;color:#999999;'>この下を閉じる</span>
</div>
</b:if>


(ソースコードを HTML 化するにあたり、 Peter Palfrader さんの Code to HTML converterの出力を現代風(?)に加工して使いました。特記して謝意を示します。Special thanks to Peter!)

これをテンプレートの
<b:includable id='post' var='post'>
の閉じタグ
</b:includable>
の直前にコピペすればよいはず。

この機能も需要が少なそう。でも、どっかから大昔の記事に飛んで来た人を、それに近い日付の記事たちにも手早く誘導できるのは確かだ。

index, item, archive の表示の仕方の区分は、実は、この作業が終わるまでぼんやりとしか理解してなかった。でも、分かってしまうと、仕様がよく練られているなあと、感心。 Blog にカレンダー(と、関係ないが、トラックバック機能も)は要らない。創造性豊かな Blogger の開発者たちに大拍手!

---
2009年3月11日14:24デバッグ: IE の JavaScript では substr() の引数に負数が使用できないことが判明 (IE7でもダメ)。しょうがないので、たとえば substr(-2) と書きたいところを replace(/.*(..)/, '$1') にした。
2009年3月13日16:02デバッグ: Unicode の正しい対応に誤りがあった。記事中の解説もそれに合わせて変更した。
2009年3月15日22:22デバッグ: UTC の地域で Blogger は data:post.timestampISO8601 に +00:00 を表す Z を使っていることが判明。正規表現を手直しした。

2009-01-12

الزِئْبَق



『astronomy ではダメだが astrology なら食える』と言った人がいたらしい。私はいつも、天文学と占星術に相当する英単語は逆なんじゃないかと混乱する。日本語の「豆腐」と「納豆」という単語もそんな感じだが、混乱はしてないけどね。

今回の記事のネタは、タイ語の何曜とか何月とかいう単語が、天文学 (占星術?) と関係があるという話。

これだけではよく知られている話なのでわざわざ取り上げるほどの内容ではない。そこでおまけとして、インドネシア語(マレーシア語)の何曜という単語の由来も書いてしまうことにする。

必要なフォントがインストールされてない環境では、今回の記事はまったく読めない。でも、私には書けちゃったので気にしないことにする。

---

タイ語の曜名は、日本語などと同様、太陽系の星名に由来する。タイ語の星名の語源はサンスクリット語だ。

下は、タイ語 音写表記のサンスクリット語 日本語 という形のリストだ。

อาทิตย์ āditya 太陽
จันทร์ candra 月
อังคาร aṃgāra 火星
พุธ budha 水星
พฤหัส bṛhaspati 木星
ศุกร์ śukra 金星
เสาร์ saura 土星

天体としての太陽ではなく日曜日であることをはっきり示したいなら、「一日」を表す วัน の修飾語として วันอาทิตย์ のように用いる。他の曜日についても同様だ。

私にはタイ語の曜名を直接覚えるより、サンスクリット語で覚えてしまったほうが早いように思える。木星だけ 主 (人) を意味する語尾 -pati がカットされているが、あとはほぼ機械的に変換できる。もちろん、タイ語とサンスクリット語の綴り字の対応規則を知っているのが前提だ。

サンスクリット語では、それぞれの天体に「意味付け」があり、各単語はその意味でも用いられる。

太陽 太陽神 ya の子
月 光り輝くもの
火星 幸せ、繁栄、戦い、焼き尽くすもの
水星 賢い、理解力のある (仏陀 buddha と同根)
木星 祈祷の主、神々の師匠
金星 輝く、明るい、悪魔の師匠
土星 ゆっくり動くもの

なんだか占いじみてきた…でしょ。

でも、そもそも日本語(中国語)で惑星の名に火、水、木、金、土と付いているのはそれらのエレメントで世界がすべて成立しているとする五行思想の影響であり、それは占いみたいなものだ。

また、まだ日本に七曜の概念が無い大昔に1週間を7日とする方法が輸入されたのだが、そのときは7日周期で1日を太陽系の1星と結びつける占星術としてだった。そういうわけで、日本では曜名として星の日本名が流用され、日曜、月曜、火曜、水曜、木曜、金曜、土曜となっているのだ。(参考:Wikipedia 日本語版「曜日」の項)

占星術と五行思想のミックス…。占いって重要みたいだ。

ちなみに、 Wikipedia の上記ページによれば、曜の順「日月火水木金土」は、星を当時の定説 (プトレマイオス等が提唱) での『遠い』順に「土木火日金水月」に並べた上で1時間ごとに次の星に動く (最後の次は最初に戻る) と考えれば、「土」の24時間後が「日」、「日」の24時間後が「月」、…となるから、だそうだ。(汗)

---

タイ語で、何月、という月名は、占星術で出てくる黄道十二宮に由来する。語源は、やはりサンスクリット語。

下は、タイ語の月名 星座名 音写表記のサンスクリット語 日本語の月名 星座名 中国語(?)の星座名  という形のリストだ。

เมษา ราศีเมษ meṣa 4月 おひつじ座 白羊宮
พฤษภา ราศีพฤษภ vṛṣan 5月 おうし座 金牛宮
มิถุนา ราศีเมถุน mithuna 6月 ふたご座 双子宮
กรกฎา ราศีกรกฎ karkaṭa 7月 かに座 巨蟹宮
สิงหา ราศีสิงห์ siṃha 8月 しし座 獅子宮
กันยา ราศีกันย์ kanyā 9月 おとめ座 室女宮
ตุลา ราศีตุลย์ tulā 10月 てんびん座 天秤宮
พฤศจิกา ราศีพิจิก vṛścika 11月 さそり座 天蠍宮
ธันวา ราศีธนู dhanvin 12月 いて座 人馬宮
มกรา ราศีมังกร makara 1月 やぎ座 摩羯宮
กุมภา ราศีกุมภ์ kumbha 2月 みずがめ座 宝瓶宮
มีนา ราศีมีน mīna 3月 うお座 双魚宮

ราศี は星座という意味だ。

月名であることをはっきりさせたいのなら、その月の日数を30日と比べ 大きい / 等しい / 小さい に応じて語尾に คม / ยน / พันธ์ を付ければ良い。例えば1月なら มกราคม だ。また、例えば、占星術でいうおひつじ座の期間 (タイでは流派によって3月21日〜4月19日だったり4月14日〜5月14日だったりするらしい) と4月1日〜30日の期間とは完全には一致しないが、タイ語では4月を表すのにおひつじ座に由来する単語を使ってしまっている。混乱しないように注意しよう。(笑)

月名もタイ語でいきなり覚えるのは大変すぎる。サンスクリット語の綴り字とはほとんど対応しているので、やはり、サンスクリット語のほうから覚えた方がいいと思う。急がば回れ。でも、タイ語の単語が仮に正しく綴れても、一字再読とかルールがいろいろあるから、発音が出来るかどうかはまた別問題で難しいんだが。

中国語での「摩羯」 (まかつ) は makara の音写だ。もともと makara はヤギなんかじゃない怪しい想像上の動物なので、中国人はあえて訳さなかったらしい。うお座も占星術の絵を見ると必ず2匹が逆向きに並べてあるので「双魚」。いて座だってケンタウルスみたいなやつ(インドとギリシャとどっちが先かは知らない)だから普通名詞の射手では失礼だ、というわけで「人馬」なんじゃないのかな。

完全に占いになってしまった。(汗)

---

最後に、インドネシア語(マレーシア語)の曜名。語源はアラビア語。

下は、インドネシア語 日本語 アラビア語の意味 アラビア語の読み方(正確じゃないからね) アラビア語 という形のリストだ。

Ahad 日曜 1 わーひどぅん واحِدٌ
Senin 月曜 2 いすなーん اِثْنان
Selasa 火曜 3 さらーさ ثَلاث
Rabu 水曜 4 あるばっあ أرْبَع
Kamis 木曜 5 かむす غَمْسٌ
Jumat 金曜 (礼拝のために) 集まる じゅまっと جُمْعة
Sabtu 土曜 7 さぶっあとぅ سَبْعةُ

曜日であることをはっきり示したいなら、「一日」をあらわす hari の修飾語として用いればよいのは、タイ語と同じ。また、日曜日は hari Minggu という別の語の方が普通だが、これだけはアラビア語とは関係ない。

何人かのインドネシア人に訊いてみたけど、語源がアラビア語の数詞だなんて誰も知らなかった。Sabtu の語源のアラビア語 (たぶんヘブライ語も?) の単語 سَبْعةُ は、英語の sabbatical の語源でもある。どこかの世界を作った神様は7日目はサボったんじゃなかったっけ。

でも、インドネシア語の曜名を覚えるのにまずアラビア語からというのは、たぶん遠回りしすぎ。