(08/02/01~)
08/02/23

・Unicode
 WindowsのUnicode(WideString)はWin9x(多分NT3x/4も)に於いてはUCS-2、2000/XP/VistaではUTF-16で表現される。

 UCS-2は「Unicodeって、完全2バイトだよね?」と言われるアレ。すべての文字は16bitで表わされる。よって使える文字数は論理的には65536文字。ちなみにUCSはUnicodeではない(後述)。

  UTF-16は基本エリア(BMP=Basic Multilingual Plane)はUCS-2と完全な互換性があり、加えてSHIFT-JISでの漢字表現やEMS(Expanded Memory Specification)のような方法でプレーンを拡張し、UCS-2が論理的に扱える文字数以上の文字を格納できる。BMPにある文字コード未割り 当て領域(プレーン拡張用に使われる)をサロゲートと呼び、この領域にあるコードを2つ(16bit×2)使って表わされる文字(或いは領域)をサロゲートペアと呼ぶ。

 つまり、UTF-16は
 で文字を表現する。

 SHFT-JIS等の漢字領域を「DBCS(Double Byte Character Set)/MBCS(Multi Byte Character Set)」と言うが、UTF-16のサロゲートペアははさしずめ「DWCS(Double Word Character Set)/MWCS(Multi Word Character Set)」と言ったトコロ。UCS-2はDBCSではなく、「SWCS(Single Word Character Set)」が正解なのだろう。

 勘違いしやすいが、Unicodeは最新の規格で21bitの範囲に ある。UCSはUnicodeと同列に扱われる文字集合の規格(Universal Coded-Character Set)。UCS-2は2byte(固定2byte=WORD)、UCS-4は4byte(固定4byte=DWORD)の範囲にある...つまり、母集 合としてはUCS-4はUnicodeよりも大きい。UTFは「Unicode/UCSで表わされる文字の文字コードを変形して扱い易くするための文字符号化方式(文字エンコーディング)の規格(Unicode/UCS Transformation Format)」であり、文字集合の規格ではない。すべてのUnicode/UCSをフラットに扱うにはUTF-32を使えばいいが、この際には、「1文字=DWORD」となってしまう。

・WindowsとUTF-16
 では、UTF-16を内部処理で使用しているWindowsではすべての文字を表示できるかと言えば、そうとも限らない。サロゲートペアはデフォルト状態ではVistaでしか表示できないからだ。2000/XPでサロゲートペアを表示するためには対応するフォントとレジストリの変更が必要となる。

 Windows9xに於いてはW系のAPIはほぼ実装されておらず、Microsoft Layer for Unicode (MSLU)でも使わない限りW系のAPIを呼び出すことはできない。例えMSLUを使ったとしても、W->A変換でロスしたり、内部UCS-2の制限を受けるため「完全Unicode対応」は限りなく不可能に近い。

・WindowsとUTF-8
 有名なUTF-8は、SHIFT-JISをさらに拡張したようなもので、ASCII部分は1バイトで表現でき、それ以外の文字は最大6バイト(最新の定義では4バイトが上限らしい)で表現する。これこそまさにMBCSと言える。

 これも勘違いしやすいが、「UTF-8にサロゲートペアは存在しないが、それ以上にややこしい構造になっている」と言うこと。それと、Windowsに於いてはUTF-16を内部処理で利用している関係で「間接的にサロゲートペアの影響を受けてしまう」という事。WindowsでUTF-8の話をしている時にサロゲートペアの事を持ち出されても、脊髄反射で「UTF-8には関係ねーよ、バーカ」とか罵ってはいけない。ちなみに、Delphi2007にもUTF-8とサロゲートペアに関する問題が存在する(QC#58386)。

08/02/24

・DelphiとUnicode
 昨日の続きで、ここからが本題。

 Delphiは次期バージョンの"Tiburón"でUnicode対応となっている。しかし、"現行のDelphiではUnicodeが全く扱えない"のかと言えばそうではない。混乱を避けるために先にDelphiの文字列の扱いから説明する。
 前回の「Delphi hour in TOKYO/FTミーティング」で「UncodeStringを新設します」と言われた時に、正直混乱してしまった。「Unicodeなら WideStringがあるじゃないか?何故別にUnicodeStringを新設する必要があるんだ」、と。...しかし、「WideStringがサ ロゲートをサポートしない」という前提なら辻褄が合う。そして、何故この時期に「Unicode対応」なのかも。

 昨日のトピックにもあったようにVistaのせいだ。今までは内部UTF-16とはいえ、サロゲートペアで表わされる文字を入力も表示もできなかった。 つまり、サロゲートペアは事実上使えなかったのだから"BMPのみ=UCS-2"さえ処理できればよかった...Win9xの事も考えると尚更都合がよ かった。しかし、Vistaの登場によりTiburónでは"Win9xの切り捨て"と"サロゲートへの対応(完全Unicode対応)"を迫られてしまっ た...という事なのだろう。

 それから、「今後はSizeOf(Char)は"1"ではない」という話があったので、Tiburónでは「長い文字列=UnicodeString」と なるのだろうと思われる。ShortStringはPascalの仕様を引き継ぐのなら、副作用で最大長が65535文字(正確には65535WORD) まで拡張されるかもしれない。Tiburónでは既存のDelphiソースをほぼそのまま移行できると思われるが、自前の文字コード変換やテキストの LoadFromFile/SaveToFile等はかなり影響を受けると思われる。これは、Win32ネイティブ->.NETでも同じ事ではある のだが。

・Delphiの使い分け?
 総合的に考えるに、
 ...と、Delphiを使い分ける必要があるように思える。Delphi2007で作成したアプリケーションは基本的にWin9xで動作するのだが、 VCLに一部NT依存のコードが含まれており、万全を期すのならば、Delphi7は要確保と言える。「今更Win9xはないだろ?」という方には不要か もしれないが。

 この辺をユーザにちゃんと説明した上であれば"Delphi7の再販はアリ"だと思っている...需要がないとは言い切れないのだから。加えて言えばDelphi2007の長期的なサポートも一考の価値はあると思う。
 として、別製品にするのもいいのでは?できるものなら32/64bitコンパイラは同一製品が望ましいけれど、VCLの関係もあってそううまくはいかないと思う。それこそ、libフォルダやパッケージをIDE上で動的に切り替えられる機構でもない限りは、ね。

・ちょっと擁護
 CodeGearがヘタレなのではない。ASCII圏の人間の作ったものは、どうしても非ASCII圏の事は後回しになる(或いはASCII圏の利便を図ろうとする)。

 例えばUTF-8。これは1バイトの範囲にある文字はASCIIと完全互換だ。ASCIIの範囲にある文字だけならば、ASCIIだろうがSHIFT- JISだろうが、EUCだろうがUTF-8だろうが同じ処理で済む。「俺らの文字は1バイト(或いは7bit)で済むんだよ、何でUnicode(UCS -2/UTF-16)で2バイトも使わなきゃならんのだ?」という理屈が見え隠れする。UTF-8はサイズの縮小という意味では非ASCII圏の人間にも 有効ではあるが、他の文字コードセットへの変換時に面倒を伴う...「しわ寄せは全部こっちかよ?」と言いたくなるのが人情ってもんだ。

 MSだって例外ではない。
 Unicodeの問題には「OSの制限」と「開発ツールの制限」の2つがあり、議論の内容によって"一緒に考えたり"、"分けて考えたり"する必要がある。ここを理解しないまま議論するのは非常に危険だ。



・コードページとロケール。
 さて、文字コードに関わるもう一つの話をしなくてはならない。コードページとロケールについてだ。

 コードページってのは断りがない限り、「Unicode対応でないアプリケーションに用いるANSI文字列の文字符号化方式(文字エンコーディング)」の事で、文字集合を指すのではない。日本語なANSI文字列はSHIFT-JISだけれども、Windowsの日本語ANSI文字列は厳密には「SHIFT-JISを拡張したCP932」が正しい。プログラミングするなら"GetACP()或いはGetOEMCP()"というAPIで取得できる。

 ロケールというのはお住まいの地域の事。国/地域番号とでも言えばいいか。日本のロケールIDは「0x0409」プログラミングするなら"GetUserDefaultLCID()"というAPIで取得できる。実はロケールには複数あるのだが(システム/ユーザ/スレッド...)、話がまたややこしくなるので一般に言う所の「現在のロケール」という前提にしておく。

 もう、お分かりかとは思うけど、ロケールとコードページは「関係はあるけど別物」。同じ国の中に異なる言語が存在する事だってあるのだから、ロケールからコードページは特定できない事 になる。ややこしいのはOEMコードページという奴。これはMicrosoftが管理していないコードページで、日本のCP932だって元々はOEMコードページ だった。MS-DOSの頃、PC/ATとPC-98で「同じSHIFT-JISなのに違う文字(機種依存)」だったのは、OEMコードページだったため。 Microsoftが管理していないコードページは、同じコードでもベンダによって表示される文字が違う事がある。それと、日本の場合GetOEMCP()では"CP932"が返らないかといえばそうではなく、ちゃんと"CP932"が返ってくる。

 さて、そろそろDelphiにまつわる話をしよう。"[Delphi-ML:90290] Delphi2007のTLabelの文字化け"でフォントのCharsetの話をしているけれど、中村さんも僕も「ロケールには言及していない」。先に書いたように、この話でロケールとコードページには因果関係はないからだ。それに、DEFAULT_CHARSETが正しく動作しないのは「ある意味仕方がない」のだ...別に日本語の事だけを考えている訳じゃない。

 最近のDelphiでオブジェクトインスペクタに列挙されるCharsetは「OEMコードページ」となっているので(<-これは勘違いであり嘘。実際のトコロは後述)は、例えば韓国なんかだと "HANGEUL_CHARSET(CP949)"と"JOHAB_CHARSET(CP1361)"という2つのコードページが使える事になる。

 特別な処理が無い場合にはコンポーネント等のFontの初期値は"Delphiのデフォルトフォント"を参考にしている(多分)。では、"Delphiのデフォルトフォント"はどうやって求められているか?

 普通の考え方なら、
  1. GetACP()/GetOEMCP()でコードページを取得。
  2. デフォルトフォントにはそのコードページを持つフォントとCharsetを指定する(コードページによって決め打ちで)。
 たったこれだけの事だが、実際には違う。
  1. デフォルトフォントの初期値を"MS Sans Serif"、"DEFAULT_CHARSET"とする。
  2. ロケールが"FarEast"以外なら抜ける。
    なお、ここではロケールの取得にGetSystemMetrics(SM_DBCSENABLED)を使っている。
  3. システムフォント情報をGetTextMetrics()で取得。
  4. フォント情報からCharsetを取得。これをデフォルトのCharsetとする。
  5. もし、Charsetが"SHIFTJIS_CHARSET"なら、デフォルトフォントを"MS Pゴシック"、"SHIFTJIS_CHARSET"に。
 これがDelphi7の場合。これだと、VCLが同一ソースの場合には中国や韓国、台湾ではデフォルトフォント名が設定されない事になってしまう。この 部分のローカライズがなかったのだとしたら、DEFAULT_CHARSETには、潜在的な問題があったという事になる。ではDelphi2007では?
  1. デフォルトフォントの初期値を"MS Sans Serif"、"DEFAULT_CHARSET"とする。
  2. "プラットフォームがWin32"で"システムフォント情報でCharsetがSHIFTJIS_CHARSET"ならばデフォルトフォント名を"Tahoma"に設定。
  3. [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]を参照、
     デフォルトフォント名を"MS Shell Dlg 2"で示されるフォント(XP日本語版等では"Tahoma")に設定。
 何故こういうロジックになってしまうのか...orz。これだと今度は、
 これでは、DEFAULT_CHARSETは意味をなさない気がする。中村さんとの話で違和感を感じたのは、恐らく手持ちのDelphiの違いによるものだろうと思う(不思議に思ってDelphi7/2007のSourceフォルダを確認したのはML投稿の後)。

 そして重要なのは、日本に於いては僕の示した"普通の考え方"でいいのだろうが、"一つの国で複数のコードページを持つ場合"にはそうとばかりも言えない、という事だ。現状では、「リポジトリを用いて回避しろ」としか言えない...もちろんこれは日本国内に限った話ではない。

 なお、この話題は"[delphi.japanese:TFont.CharsetのDEFAULT_CHARSETの扱いについて]"としてNGに問題提起してあるので、「実際のトコロどうすべきなのか?」というアイデアをお持ちの方には是非議論に加わって頂きたいと思っている。

08/02/26

・コードページとフォントのCharsetの関係。
 ちょっと訂正。
コードページ CP OEM xBCS Language TFont.Charset Value Charcter Set Char Encoding Note
CP437   SBCS 英語  
 
     
CP708   SBCS アラビア語          
CP709   SBCS アラビア語          
CP710   SBCS アラビア語          
CP720   SBCS アラビア語          
CP864   SBCS アラビア語  
       
CP1256  
SBCS アラビア語 ARABIC_CHARSET 178      
CP737   SBCS ギリシャ語          
CP869   SBCS 現代ギリシャ語          
CP1253   SBCS ギリシャ語 GREEK_CHARSET 161      
CP775   SBCS バルト語族          
CP1257   SBCS バルト語族 BALTIC_CHARSET 186      
CP850   SBCS ラテン I          
CP852   SBCS ラテン II          
CP858     SBCS ラテン I          
CP1252   SBCS ラテン I ANSI_CHARSET 0      
CP855   SBCS キリル文字
(ロシア)
         
CP866   SBCS ロシア語          
CP1251   SBCS キリル文字
(ロシア)
RUSSIAN_CHARSET 204      
CP857   SBCS トルコ語          
CP1254   SBCS トルコ語 TURKISH_CHARSET 162      
CP860   SBCS ポルトガル語          
CP861   SBCS アイスランド語          
CP862   SBCS ヘブライ語          
CP1255   SBCS ヘブライ語 HEBREW_CHARSET 177      
CP863   SBCS カナダ系フランス語          
CP865   SBCS 北欧語族          
CP874 SBCS タイ語 THAI_CHARSET 222      
CP932 MBCS 日本語 SHIFTJIS_CHARSET
128 JIS X 208 SHIFT-JIS シフトJISコード
CP936 MBCS 中国語-簡体字
(中国/シンガポール)
GB2312_CHARSET 134 GB 2312-80 GBK  
CP950 MBCS 中国語-繁体字
(台湾/香港)
CHINESEBIG5_CHARSET 136 Big5 Big5  
CP949 MBCS 韓国語 HANGEUL_CHARSET 129 KS X 1001 UHC
(Unified Hangul Code)
 
CP1361   MBCS 韓国語 JOHAB_CHARSET 130 KS X 1001 Johab  
CP1200   - Unicode(BMP)     Unicode UCS-2  
CP1250   SBCS 東欧 EASTEUROPE_CHARSET 238      
CP1258      SBCS ベトナム語 VIETNAMESE_CHARSET 163      
      - デフォルトCP? DEFAULT_CHARSET 1      
      - Mac用 MAC_CHARSET 77      
      - OEM-CP用 OEM_CHARSET 255      
      SBCS シンボルフォント用 SYMBOL_CHARSET 2      

 うは、TFont.CharsetはGetACP()/GetOEMCP()だけじゃ処理できないじゃん。
 なーるホド。オブジェクトインスペクタでVIETNAMESE_CHARSETが選択できないのもGetACP()/GetOEMCP()でコードページを取得できないからなのだろうな。

case GetACP of
  874
    begin
      DefFont.Name := '???';
      DefFont.Charset := THAI_CHARSET;
    end;  
  932
    begin
      DefFont.Name := 'MS Pゴシック';
      DefFont.Charset := SHIFTJIS_CHARSET;
    end;  
  936:
    begin
      DefFont.Name := '???';
      DefFont.Charset := GB2312_CHARSET;
    end;  
  949:
    begin
      DefFont.Name := '???';
      DefFont.Charset := HANGEUL_CHARSET;
    end;  
  950:
    begin
      DefFont.Name := '???';
      DefFont.Charset := CHINESEBIG5_CHARSET;
    end;  
  1250:
    begin
      DefFont.Name := '???';
      DefFont.Charset := EASTEUROPE_CHARSET;
    end;  
  1251:
    begin
      DefFont.Name := '???';
      DefFont.Charset := RUSSIAN_CHARSET;
    end;  
  // LATIN (Include ANSI)
  1252:
    begin
      DefFont.Name := '???';
      DefFont.Charset := 
ANSI_CHARSET;
    end;  
  1253:
    begin
      DefFont.Name := '???';
      DefFont.Charset := GREEK_CHARSET;
    end;  
  1254:
    begin
      DefFont.Name := '???';
      DefFont.Charset := TURKISH_CHARSET;
    end;  
  1255:
    begin
      DefFont.Name := '???';
      DefFont.Charset := HEBREW_CHARSET;
    end;  
  1256:
    begin
      DefFont.Name := '???';
      DefFont.Charset := ARABIC_CHARSET;
    end;  
  1257:
    begin
      DefFont.Name := '???';
      DefFont.Charset := BALTIC_CHARSET;
    end;  
else
  case GetOEMCP of
    // KOREA(JOHAB)
    1361:
      begin
        DefFont.Name := '???';
        DefFont.Charset := JOHAB_CHARSET;
      end;
  else
    case GetUserDefaultLCID of
      // VIETNAM
      $042A:
        begin
          DefFont.Name := 'Tahoma';
          DefFont.Charset := VIETNAMESE_CHARSET;
        end;
    else
      DefFont.Name := 'MS Sans Serif';
      DefFont.Charset := GetDefFontCharset;
    end;  
  end;
end;  

 それじゃ、こんな感じになるのかな?これで、ベトナムも(殆ど)OKだね...gặp sau nhè。

・ちなみに。
 Tiburónとかのóのように声調記号のある文字の入力には「UniKey」を使っています。以前、ベトナムへ出張した際には重宝しました。以下、実際の使い方です。
  1. UniKeyをインストール。
  2. ダブルクリックで起動して常駐させる。
  3. 「Mở rọng」ボタンを押す。
  4. 「Hệ thấng」にある「Vietnamese interface」のチェックを外すとインターフェイスが英語になる。
  5. 「Default」ボタンを押す(3~5は初回時のみの設定)。
 「Ctrl+Shift」でベトナム語入力モードになりますので、ここで「Tiburosn」とタイプすれば「Tiburón」と表示されます。記号とタイプ方法は以下の通りです。

記号 表記 タイピング
(TELTEX)
Aのサーカムフレックス記号 Â â aa
Aのブレーヴェ記号 Ă ă aw
Dのストローク記号 Đ đ dd
Eのサーカムフレックス記号 Ê ê
ee
Oのサーカムフレックス記号 Ô ô oo
Oのホーン記号 Ơ ơ ow
Uのホーン記号 Ư ư uw
Thanh sắc の声調記号
Á á s
Thanh huyền の声調記号 À à f
Thanh hỏi の声調記号 r
Thanh ngã の声調記号 Ã ã x
Thanh nặng の声調記号 j
記号取り消し     z

  ベトナム語の入力方式にはイロイロありますが、ここでは「TELTEX方式」を紹介しています。「ặ」なんて文字もある訳で、これは「awj」または「ajw」とタイプします。「Tiburónのóだけのために UniKeyをインストールするのは大袈裟すぎる」って方は"Online Keyboard for Vietnamese"で適当にキーを押してコピペして下さい...まぁ、このページからコピペするってのもアリなんですが(^^;A

 なお、正しくベトナム語と日本語を混在できるフォントは
 だけです。

 ... ですが、実際にやってみるとMSゴシック等でも表示できるように見えます。しかし(詳しい理由は述べませんが)一部の文字 だけがボールドになります。日本語とベトナム語を混在させる場合にはできるだけ「Arial」や「Tahoma」を使うようにし て下さい。または、ベトナム語の箇所だけフォントを変更するようにして下さい(WordやExcelの場合)。

08/02/28

・パンが無ければお菓子を(以下略)
 雑談にコメントできなきゃ、掲示板を(以下略)。専用スレッドを用意してみましたので、昨今の雑談にツッコミを入れたい方はどうぞ(メアドは必須ではありません)。目印としてフサを置いておきました。掲示板の注意書きにもありますが、REMOTE_HOSTが見えますので自演したい場合には充分注意を払ってからやって下さいね。

 荒れない程度にマターリやれれば、よろしいかと...。

08/02/29

・"デベロッパーキャンプ、ご参加ありがとうございました。"を検証する。
 私は先のデブキャンに参加する事が叶いませんでしたが、こうして資料の提示があるのは喜ばしい事です...地方に居ながらにして、重要な情報が得られるのですから。

 [String は UnicodeString にマップ]
 [文字のインデックス化と通常の文字列処理に変更はない]
 サマリーに関するツッコミは以上です。G2セッションの新しい資料が入手でき次第、追って検証を行いたいと思います。

・彼からのMail
 溜まってますねー。

こうさ、カウパーが乾燥して癒着した下着と尿道が剥がされる瞬間の切ない痛みを感じる時、いつも庵寿と厨子王のその後に想いを馳せる。

 織姫と彦星でもいいのではないでしょうか?

今便所なんだけどさ、座った瞬間の屁音が「ピキュン」っていうか「フィキュッ」っていうか、なんかその辺の萌えキャラの呻き声みたいだったんで、俺もだいぶ丸くなったもんだなっていう感慨を覚えた。

 エロゲのやり過ぎだ...もう、お互いいい歳なんだからさ。

カーマ来てんだけどさ、昨夜TV通販で6千ナンボで売ってたのと全く同じ大理石加工のフライパンが1980で置いてあったのでウンコ漏洩した。

 通販の奴は、「今ならもう2個」とか言ってなかったか?

なんか三ヶ月ぐらい点けっぱにしといたらパソ死んだ。とりあえずセーフモードで立ち上がる途中に電源ブツッてなってリセットかかるんでもう絶望的だと思う。
死ぬ前にデバイスマネージャ見た時はSCSI死んでたっぽいんだけど、それが判ったところで今更。
級長ちんげ生えすぎだっつーの。

 脈絡のない最後の一行に悪意しか感じない私は何かがおかしいのでしょうか、それとも単なる被害妄想でしょうか?

今レジ立ってんだけどさ、肛奥でニホンオオカミ飼ってるかのような唸り声がずっと聞こえてくるのに店員俺しかいねえ状況だし、今夜セブンイレブン全店舗営業停止のニュースを楽しみにしてていいと思う。

 オマイの苗字は"日本の苗字7000傑"でも最低ランクなのだから、自重せよ。

結局三国志10のPK付き14000円を買おうか買うまいか買おうか買うまいか買おうか買うまいかで閉店間際のエイデン柴田店で40分近く懊悩しまくった揚句の果てに買ったつもりになって帰って来て麻婆飯作って食った後にさーパパ三国志10最初っからパラメータ最強にしまくった新武将128人ぐらい作成しまくるぞーって思ってパソ部屋行ったら実際買ってない現実と向き合った時の寂寥感といったらなかった。心底自分にガッカリだ。

 "日清のラーメン屋さん"みたいだな。「行ったつもりで我が家で...」 ま、こっちは腹は膨れるのだがな。

日中ヒマだったんで一人で安宅家の人々ごっこしてみたんだけど、あまりにも人としてどうかと思ったのでこのネタ封印する事にした。

 何の事か解らなかったのでググったら、すげぇストーリーだな、オイ!

新しくうちに来た冷蔵庫、なんか勝手に氷作るわだだっ広いわで、野菜何買ってこようとか考えてたら便意に襲われた。

 夜中にガラガラッって音がするので(多分)、"かなり巨大なゴキブリが台所で這いずり回ってる"のだと妄想すると、夜も眠れなくなると思う。

よく級長が職場の会議でケツアナルって言うけどさ、ケツアナルって何か古代インカの太陽神って感じしねえ?

 "ケツァルコワトル"の事かー!って、ネタ元を説明しないと意味不明なネタって、ネタとしての存在意義を疑われても仕方がないと思う。

3800万のマンション買う気になって検討してたら超ウンコしたくなったもんで、亜音速でベビーカー押して最寄りのバロー便所に駆け込んだ。

 そういや、お子様が生まれたのだったな...おめでとう。願わくば、この子が親父或いは叔父(1)や叔父(2)のようなヲタに育ちませんように。

今日のトリビア

コンビニに男性客が支払いに来るゲームチェックは
大半が出会い系関係である。

 人生イロイロ...男もイロイロ...さ。

ファミ通の表紙見たらSCE池尻大作氏ってのが出てたんで、いつから世界のソニーはナンミョウの企業舎弟に成り下がったのかと早合点して愕然としたのだ!!!!!!!!!!!!!!!!!!!!!!!!!!!!@@;;;;;;;;;;
 
 "渡辺信一郎"と"ワタナベシンイチ"と"ナベシン"と"スパイク"と"ダンス☆マン"と"ダソヌ☆マソ"みたいなものか。ぶっちゃ毛、一見さんにはよくわからないけどね。


 BACK   古いのを読む     新しいのを読む