2011年5月16日

こんにちわ、でいいのじゃ

「こんにちわ」という表記は“間違い”とまでは言えぬのではありませぬか。

1986年内閣告示の「現代仮名遣い」には、「こんにちは」が助詞「は」の表記例としてあげられていますが、46年の「現代かなづかい」は「こんにちは」の例をあげておりませぬ。

それどころか、86年に文部省が都道府県教育委員長などに通知した「学校教育における『現代仮名遣い』の取扱いについて」では、助詞「は」「へ」について、「現代かなづかい」では“「わ」「え」と書くことも許容すると解釈されてい”たことを(参考)にあげております。同通知全文はこちら

つまり、「現代仮名遣い」告示以前には、「コンニチワ」を一語ととらえる(「は」を助詞ととらえない)ならば、「現代かなづかい」の細則第四「ワに発音されるはは、わと書く」にしたがって「こんにちわ」と表記することもできたわけです。
戦後すぐに読み書きを習った少し年配の方が「こんにちわ」と書かれるのは自然なことかもしれませぬ。

もっとも、規定云々の前提として、「現代仮名遣い」は「個々人の表記にまで及ぼそうとするものではない」と適用範囲を限定しています(「常用漢字」も同様です)から、twitterやblogのように個人的な書き物について、“「こんにちわ」と書くのは間違いだ”と言うのは行き過ぎだと思うのであります。

2011年5月14日

EPUB ZIP コンテナの作り方

EPUBのファイル(コンテナ)は「.epub」という拡張子がついていますが、ファイルの構造としてはZIPアーカイブです。ですから、拡張子を「.zip」に書き換えれば、MacでもWindowsでも解凍(展開)して、本文などを普段使い慣れているテキストエディタで編集できます。

しかし、編集後、ZIPで圧縮(アーカイブ)して、拡張子を「.epub」に戻せばいいかというと、そうではないのです。mimetypeファイルの扱いが少し特別なのです。
  • 要件1: ZIPコンテナの先頭に置く
  • 要件2: 圧縮も暗号化もしない
  • 要件3:  ヘッダにはextra fieldをつけない
ことが求められているのです。

要件1を満たすには
→ 最初にmimetypeファイルを単独でZIPアーカイブし、次に残りのディレクトリ・ファイルをそのZIPコンテナに追加すればOK。なんか、簡単^^

要件2を満たすには
→ zipコマンドに「-0」(ゼロです。圧縮率0という意味)をつければOK。

要件3を満たすには
→ zipコマンドに「-X」(大文字です)をつければOK。

たとえば、「De_Suse」というフォルダにmimetypeもふくめ必要なデータを入れておいて、
$ cd De_Suse
$ zip -0 -X ../De_Suse.epub mimetype
$ zip -r ../De_Suse.epub * -x mimetype
$ cd ..

これで「De_Suse.epub」というEPUBファイルができます。なお、2行目の「-X」は大文字、3行目の「-x」(引数ファイルを除外するという意味のオプション)は小文字です。


なお、mimetypeの扱いについての詳細は「EPUB Open Container Format (OCF)」に規定されています。

EPUB 2.0.1
http://idpf.org/epub/20/spec/OCF_2.0.1_draft.doc
「4 ZIP Container」節の末尾
The first file in the ZIP Container MUST be a file by the ASCII name of ‘mimetype’ which holds the MIME type for the ZIP Container (i.e., “application/epub+zip” as an ASCII string; no padding, white-space or case change). The file MUST be neither compressed nor encrypted and there MUST NOT be an extra field in its ZIP header. If this is done, then the ZIP Container offers convenient “magic number” support as described in RFC 2048 and the following will hold true:
The bytes “PK” will be at the beginning of the file
The bytes “mimetype” will be at position 30
The actual MIME type (i.e., the ASCII string “application/epub+zip”) will begin at position 38

EPUB 3
http://idpf.org/epub/30/spec/epub30-ocf.htm
3.3 OCF ZIP Container Media Type Identification
OCF ZIP Containers must include a mimetype file as the first file in the Container, and the contents of this file must be the MIME type string application/epub+zip.
The contents of the mimetype file must not contain any leading padding or whitespace, must not begin with the Unicode signature (or Byte Order Mark), and the case of the MIME type string must be exactly as presented above. The mimetype file additionally must be neither compressed nor encrypted, and there must not be an extra field in its ZIP header.

ほんとうに3要件を満たしているかは、hexdumpしてみれば分かります。

moria:Desktop tac$ hexdump -C De_Suse.epub |head

00000000  50 4b 03 04 0a 00 00 00  00 00 52 bb ac 3e 6f 61  |PK........R..>oa|
00000010  ab 2c 14 00 00 00 14 00  00 00 08 00 00 00 6d 69  |.,............mi|
00000020  6d 65 74 79 70 65 61 70  70 6c 69 63 61 74 69 6f  |metypeapplicatio|
00000030  6e 2f 65 70 75 62 2b 7a  69 70 50 4b 03 04 0a 00  |n/epub+zipPK....|
00000040  00 00 00 00 7d bb ac 3e  00 00 00 00 00 00 00 00  |....}..>........|
00000050  00 00 00 00 09 00 00 00  4d 45 54 41 2d 49 4e 46  |........META-INF|
00000060  2f 50 4b 03 04 14 00 00  00 08 00 52 bb ac 3e c5  |/PK........R..>.|
00000070  06 1a 6f a3 00 00 00 f2  00 00 00 16 00 00 00 4d  |..o............M|
00000080  45 54 41 2d 49 4e 46 2f  63 6f 6e 74 61 69 6e 65  |ETA-INF/containe|
00000090  72 2e 78 6d 6c 55 8e c1  0e c2 20 10 44 ef fd 0a  |r.xmlU.... .D...|


いったん、unzipしたものをMacの普通の“圧縮”でZIPして、拡張子を付け替えたもの(De_Suseフォルダの中身だけをZIPしたもの)だと、

moria:Desktop tac$ hexdump -C De_Suse_MacZIP.epub |head
00000000  50 4b 03 04 0a 00 00 00  00 00 7d bb ac 3e 00 00  |PK........}..>..|
00000010  00 00 00 00 00 00 00 00  00 00 09 00 10 00 4d 45  |..............ME|
00000020  54 41 2d 49 4e 46 2f 55  58 0c 00 cd ef cb 4d 6e  |TA-INF/UX.....Mn|
00000030  ee cb 4d f6 01 f6 01 50  4b 03 04 14 00 08 00 08  |..M....PK.......|
00000040  00 52 bb ac 3e 00 00 00  00 00 00 00 00 00 00 00  |.R..>...........|
00000050  00 16 00 10 00 4d 45 54  41 2d 49 4e 46 2f 63 6f  |.....META-INF/co|
00000060  6e 74 61 69 6e 65 72 2e  78 6d 6c 55 58 0c 00 5e  |ntainer.xmlUX..^|
00000070  05 cc 4d 1c ee cb 4d f6  01 f6 01 55 8e c1 0e c2  |..M...M....U....|
00000080  20 10 44 ef fd 0a c2 d5  b4 e8 95 40 4d 4c 3c 6b  | .D........@ML<k|
00000090  e2 17 ac 74 ab 44 60 09  50 a3 7f 2f d6 a4 b1 7b  |...t.D`.P../...{|


ところが、場合によっては、Macの右クリックによる“圧縮”でつくったZIPファイルの拡張子を「.epub」に書き換えたものでも、Adobe Digital EditionsやSigilはEPUBとして読み出せますし、それをkindlegenで変換したMOBIファイルもKindleで普通に表示できます。
これは上のOCFによる3要件を一つも満たしていないのですが、なぜか大丈夫なのです。

2011年4月28日

今を抱くように生きている人

河津聖恵さんから新詩集『ハッキョへの坂』をいただきました。

この間、朝鮮学校が高校授業料無償化の対象から外されたことの理不尽さに抗い『朝鮮学校無償化除外反対アンソロジー』をまとめるなど、「カナリア」として奮闘してきた河津さんです。

この新しい詩集には朝鮮学校にかかわる詩ももちろん載っているのですが、「ひとは一つの詩とともに生まれてくる」の末尾;
ただ証すための一篇にいとおしく焼き尽くされるため
この今を抱くように生きている
そんな河津さんの生き方ってすてきだと思うのです。


2011年1月1日

ANNVM NOVVM FAVSTVM TIBI PRECOR!

Annum novum faustum tibi precor!

しあわせなあたらしい年をあなたに!



辛卯元旦




2010年11月4日

私は歌わない

最近、憲法集会などで『沖縄を返せ』(全司法福岡高裁支部作詞・荒木栄作曲、1956年)が歌われている。

もともとの創作者も、いま歌っている人たちも善意なんだろうけど、私は違和感を感じてとても歌えない。

我等と我等の祖先が血と汗もて 守り育てた」「我等のものだ沖縄は」などの「我等」とはいったい誰のことなのだろう。いわゆる「本土」(この言葉にもかなりの抵抗を感じる)の私たちのことなら、それは変だ。


江戸時代の島津藩による支配をはじめ「本土」は沖縄を支配してきた側だ。ただ、支配していたのは島津藩なり天皇制政府なのであり、私たちも沖縄の人々と同様、それらに支配・抑圧されていた同じ立場なのだけれど。


ついでに言えば「民族の怒りに燃える島」というのも、「日本は単一民族国家」という幻想の影響を受けているような気がしてならない。


以上、善意に対する言いがかりに過ぎない。(うたごえ運動の人たちは、いまだに「歌唱指導」といっている。うたは指導されて歌うものか?)

2010年11月1日

串刺しナンバリング:冗談なれど、王立協会は些かも疎かにせず

ワンライナー、私にも書けました!
MacOSXの道具箱(/usr/bin/)にひっそり隠れていたものたち。
ひとつひとつはちっちゃいけれど、力をあわせりゃ、このとおり。

No.1からNo.500までを串刺し8面付にするための連番を生成します。

jot - 1 500 1 | rs -t 0 8 | sed -e 's/ $/b/' | rs 0 1 | sed -e 's/b//' > num.txt


連番の個数がシート数の整数倍でなくて半端がでる場合、最後の何枚かのシートに連番が入らない欄が一つずつできます。そこのところの処理、ちょっと工夫しました。

  • jotで縦1列にならんだ連番を作ります。
  • 1回目のrsで面付された状態と同じように8列に連番が並びます。
  • 500より大きなところは空欄になってます。その行末の直前の空白は、ほんとは列のセパレータのはずですが、それと行末をセットにしてsedでマーク(b)を付けるのです。
  • 2回目のrsで縦1列にならびかえ。
  • 最後にsedでマークを外して、できあがり!


今回登場してくれたのは次のみなさん。sedさんには普段からいろいろお世話になってますけど、jotさんは、やもさんに教えてもらうまで知りませんでした。rsさんは、jotさんのmanpageで見つけました。これからもよろしく ^_^

jot -- print sequential or random data
rs -- reshape a data array
sed -- stream editor

2010年10月30日

串刺しナンバリング:改訂したけど、ウミスズメの黒焼きではありません

連番を任意の数字から始められるようにしてみました。ついでにスクリプト名や変数名を整理しました。(if...else構文も正しくしました:30日21時) ^_^


#  kszs.awk
#
#  使い方:
#  awk  -f  kszs.awk  >  num.txt

BEGIN {

#  連番開始・終了番号と面付数の入力を求める
    printf "開始番号=" > "/dev/stderr"
      getline sn_start < "/dev/stdin"
    printf "終了番号=" > "/dev/stderr"
      getline sn_end   < "/dev/stdin"
    printf "面付数="   > "/dev/stderr"
      getline n_men   < "/dev/stdin"

#  連番の個数を計算する
    n_sn = sn_end - sn_start + 1

#  総シート数(ページ数)を計算する # 以下6行訂正しました
    n = int ( n_sn / n_men )
    if ( n_sn % n_men == 0 ) {
        n_sheet = n
    } else {
        n_sheet = n + 1
    }
##    n_sheet = int ( 0.5 + n_sn / n_men )  # これは間違いでした

#  i は作業中のシート番号
    for ( i = 0; i < n_sheet; i++ ) {

#      j はシート内の面番号
        for ( j = 0; j < n_men; j++ ) {

#          シート番号と連番開始番号との和が
#          そのシート内最初の連番になる
#          また、総シート数の値が連番の増分となる 
            serialnum = i + sn_start + j * n_sheet

#          連番を標準出力に改行付きで書き出す
#          最大数を超えている場合は改行だけを書き出す
            if ( serialnum <= sn_end ) {
                print serialnum
            } else {
                print ""
            }
        }
    }
}


経緯については、前の記事をご参照ください。
    http://lamium.blogspot.com/2010/10/blog-post_30.html

それより、やもさんの新しい記事の方が、串刺しやこの間の経緯がよくわかります。
    Kushizashiはワールドワイドに

串刺しナンバリング:焼き鳥の一品ではござらぬ

串刺し印刷用の連番を生成するawkスクリプトを、私も遅ればせながら作ってみました。

串刺し印刷そのものをよく知らないので、なんか見当違いをしているような気もします。BEGINだけというのもawkスクリプトとしては変則的でしょうね。ご批評くだされ。

★ 総ページ数の計算と、if...else構文を正しくしました(30日21時)


# kusizasinum.awk
#
# 使い方:
#  awk  -f  kusizasinum.awk  >  num.txt


BEGIN {

#       連番最大数と面付数の入力を求める
        printf "最大数="        > "/dev/stderr"
                getline maxnum  < "/dev/stdin"

        printf "面付数="        > "/dev/stderr"
                getline mennum  < "/dev/stdin"

#       総シート数(ページ数)を計算する # 以下6行訂正しました
            n = int ( maxnum / mennum )
            if ( maxnum % mennum == 0 ) {
                    sheetnum = n
            } else {
                    sheetnum = n + 1
            }

#          sheetnum = int ( 0.5 + maxnum / mennum )  # これは間違いでした

#       i は作業中のシート番号
        for ( i = 1; i <= sheetnum; i++ ) {

#               j はシート内の面番号
                for ( j = 0; j < mennum; j++ ) {

#                       シート番号がそのシート内最初の連番になり
#                       総シート数の値が連番の増分となる 
                        serialnum = i + j * sheetnum

#                       連番を標準出力に改行付きで書き出す
#                       最大数を超えている場合は改行だけを書き出す
                        if ( serialnum <= maxnum ) {
                                print serialnum
                        } else {
                                print ""
                        }
                }
        }
}


連番を任意の番号から始められるようにした改訂版はこちら


なお、この経緯についてはスクリプトの達人のみなさんによる次のページを参照してください。

串刺し会長やまさん:These are the days of my life
  お話してきました。
  串刺し印刷について。

あさうすさん:実験ルーム
  串刺し面付けってなぁに?

やもさん:やもめも
  あえてScriptを使わずに串刺しナンバリングしてみる(小ネタ)
  Kushizashiはワールドワイドに

たけうちとおるさん:たけうちとおるのスクリプトノート
  僕もScriptを使わずに串刺しナンバリング
  僕もScriptを使って串刺しナンバリング

市川せうぞーさん:名もないテクノ手
  あえてScriptを使って串刺しナンバリングしてみる(小ネタ)

chalcedonyさん
  くしざし試作

2010年10月9日

フランス詩のリズム(書きかけ)

Arthur Rimbaud(アルチュール・ランボー)の「Le dormeur du val」という詩を河津聖恵さんが10月5日付blog『詩空間』で紹介ています。140年前の今月、プロシア・フランスの激戦に遭遇した16歳のランボー。死者の寒さに気づいたランボーの優しさと正義感に河津さんは感動したといいます(http://reliance.blog.eonet.jp/default/2010/10/post-9233.html)。


フランス語ではどんな響きがするのだろうかと、Wikipediaを起点に探してみると、『Litterature audio.com』に朗読がありました(http://www.litteratureaudio.com/livre-audio-gratuit-mp3/rimbaud-arthur-le-dormeur-du-val-version-2.html)。原文も見つけました(http://poesie.webnet.fr/lesgrandsclassiques/poemes/arthur_rimbaud/le_dormeur_du_val.html)。



私はフランス語はほとんどわからないのですが、ところどころにある英語やラテン語と似通った言葉を手がかりに読み・聴いています。「D'argent」(銀の)や「Dort」(眠っている)、「il a froid」(彼は寒い)、「Tranquille」(静かな)という語の前または後ろにおく休止が、その言葉を際立たせている、そんな朗読です。

原文の行かえと朗読での区切りが一致しないように思うのです。


さらに、フランスのSaphoという歌手が歌っているというので、探してみると、彼女の公式サイトで試聴ができました。http://www.fxproject.net/sapho/audio.html ;ここの49番めにあります。ロックだと思うのですが、こちらは行かえどおりの区切りで歌っています。


フランス詩では、いったい、行かえはどんな位置づけになっているのでしょうか。


Le dormeur du val
C'est un trou de verdure où chante une rivière,
Accrochant follement aux herbes des haillons
D'argent ; où le soleil, de la montagne fière,
Luit : c'est un petit val qui mousse de rayons.


Un soldat jeune, bouche ouverte, tête nue,
Et la nuque baignant dans le frais cresson bleu,
Dort ; il est étendu dans l'herbe, sous la nue,
Pâle dans son lit vert où la lumière pleut.


Les pieds dans les glaïeuls, il dort. Souriant comme
Sourirait un enfant malade, il fait un somme :
Nature, berce-le chaudement : il a froid.


Les parfums ne font pas frissonner sa narine ;
Il dort dans le soleil, la main sur sa poitrine,
Tranquille. Il a deux trous rouges au côté droit.

こちらでは中原中也による訳詞を引いておきましょう。『青空文庫』に収録されているものです(http://www.aozora.gr.jp/cards/001296/card47296.html)。



谷間の睡眠者
これは緑の窪、其処に小川は
銀のつづれを小草をぐさにひつかけ、
其処に陽は、(ほこ)りかな山の上から
顔を出す、泡立つ光の小さな谷間。


若い兵卒、口をき、頭はき出し
頸は露けき草に埋まり、
眠つてる、草ン中に倒れてゐるんだそらもと
蒼ざめて。陽光ひかりはそそぐ緑の寝床に。


両足を、水仙菖(すゐせんあやめ)に突つ込んで、眠つてる、微笑むで、
病児の如く微笑んで、夢に入つてる。
自然よ、彼をあつためろ、彼は寒い!


いかな香気も彼の鼻腔にひびきなく、
陽光ひかりの中にて彼眠る、片手を静かな胸に置き、
見れば二つの血のあなが、右脇腹にいてゐる。

2010年9月12日

awkメモ:HTMLのtableに1行おきの背景色をつける

これは自分用のメモです。sed & awk使いには「また、車輪を再発明しとってやがな〜」とそしられそうなものばかりでしょう。

先の記事でつくったような単純なtableの行やセルに体裁をつけます。まずは、1行おきに背景色を指定し、しかも左端の第1列には色をつけない...

BEGIN {
  RS="</tr>"
  FS="<td>"
}

NR % 2 == 1 {
  print $0 RS
}

NR % 2 == 0 {
  print $1\
  "<td>"$2\
  "<td style=\"background-color:#ccffff;\">"$3\
  "<td style=\"background-color:#ccffff;\">"$4\
  "<td style=\"background-color:#ccffff;\">"$5\
  "<td style=\"background-color:#ccffff;\">"$6\
  "<td style=\"background-color:#ccffff;\">"$7\
  "<td style=\"background-color:#ccffff;\">"$8\
  RS  
}

もとのHTMLのソースで、1レコード=複数行にしているので、レコードセパレータ(RS)とフィールドセパレータ(FS)でちょっと無理をさせてます。そのため、$1が「<tr>」に、表の1列めが$2、2列めが$3...と気持ち悪いことになってしまいました。

</td>と改行、インデントは$2〜$8の末尾にそれぞれ入ってます($8にはインデントは入っていませんが)。

1レコード=1行だったもとのタブ区切りテキストを直接、awkに喰わせる方が簡単かもしれません。

レコード番号(NR)の剰余(演算子%)で場合分けをしてますから、「n行おき」の指定も可能です。(↑これが、このスクリプトのミソですね)

なお、上の例では1列目以外は同じ背景色ですが、列毎に書式を指定できますね。

まあ、とりあえずの間に合わせスクリプです (^_^;;

-