FC2ブログ

本を読む

読書やコンピュータなどに関するメモ

Rubyでカナのソート

 これは「ライティングや編集にまつわるあれこれ Advent Calendar 2018」の12月12日の記事です。いままでブログにちょろちょろ書いていたことを、アドベントカレンダー向けにまとめます。

 さて、専門書などの巻末には、多くの場合、索引が設けられています。TeXなど、本文中の指定した箇所から自動的に索引を作る機能があるツールもあります。そうした機能がない場合は、本文から単語とページ番号(ノンブル)を抜き出したデータを用意して索引を作ります。

 索引は、アルファベット順や読み(カナ)順にソートされます。このソート方法については出版社各社や編集者各自でそれぞれ対応していると思います。ここでは、私の方法について書きます。まあ地味なテーマです。

カナのソートは何が問題か

 カナのソートというと、一見、文字コード順にソートすればいいように思えます。たとえば、こんな場合です。

  • うみ
  • かわ
  • やま

 しかし、長音(音引き)が入る場合はどういう順序になるでしょうか。

  • あーてぃすと
  • あいでんてぃてぃ

 あるいは濁音や促音などが入ったら、どのような順序でしょうか。

  • いが
  • いかだ
  • たった
  • たつた
  • だった

実はJISの規格がある

 こうしたカナ(などを含む日本語文字列)のソート順には、JIS X 4061「日本語文字列照合順番」という規格が存在します。

 ルールをざっくりいうと、先頭から1文字ずつ比較していきます。文字の比較としては、まずその文字の文字クラスを比較します。文字クラスが同じなら基底文字列を比較します。そして、基底文字列で比較しても最後まで同じだったら、照合属性を含めて再び先頭から比較します。

 と言われても、独自の用語が並んでいてわかりませんね。この用語をそれぞれ説明します。

 文字クラスとは、文字の種類です。JIS X 4061では次表のように決められています。番号が少ないほうが順番が先です。

番号 文字クラス
1 スペース
2 記述記号
3 括弧記号
4 学術記号
5 一般記号
6 単位記号
7 アラビア数字
8 欧字記号
9 ラテンアルファベット
10 仮名
11 漢字
12 げた記号

 次に、基底文字とは、文字の余分な属性を除いた文字です。アルファベットなら、大文字小文字を揃えます。カナであれば、ひらがなかカタカナか、小書き文字(発音や拗音)、濁音・半濁音を揃えます。つまり、「a」と「A」、「あ」と「ア」、「つ」と「っ」、「は」と「ば」と「ぱ」が同じになります。

 この基底文字の扱いでは、長音の扱いも決まっていて、直前の母音として扱われます。つまり「カー」は「カア」と、「オー」は「オオ」として扱われます。「んー」は直前の母音がないので「んん」となります。「んー」は専門書の索引にはあまり出ないと思いますが。

 基底文字で最後の文字まで比較してまったく同じであれば、基底文字にするときに除いた属性を照合して再び先頭から比較します。濁音半濁音については「清音文字 < 濁音文字<半濁音文字」、小書き文字や大文字小文字であれば「長音記号 < 小文字 < 大文字」となります。まあだいたいUnicodeやJISの文字コード順です。

 これらを適用すると、次のような順序になります。これは単純に文字コードでソートした順序とは異なります。

  • あーてぃすと < あいでんてぃてぃ
  • いが < いかだ

RubyでCLDR

 たとえば、Excelでかな文字列をソートすると、JIS X 4061に従うようです。私も前職で10年ちょっと前は、索引のソートにExcelを使っていました。

 ここでは、Excelでなくテキストファイルとバッチ処理による例を、Rubyでやってみます。

 Unicodeコンソーシアムでは、CLDR(Common Locale Data Repository)プロジェクトで、ロケール固有の情報をまとめた、一種のデータベース(XML)を定めてています。CLDRには、数字の桁区切り(カンマかピリオドかなど)や、重さや長さの単位、通貨の単位、月日や日時の表記、数字を言葉で書く方法などが含まれます。

 このCLDRの中に文字列の照合順序も含まれています。

 CLDRをRubyから扱うには、twitter_cldrというライブラリがあります。twitter_cldrはRubyGemsにあるので、gemコマンドやbundleコマンドでインストールできます。

$ gem install twitter_cldr

 twitter_cldrはCLDRのさまざまな機能を備えています。日本語の文字列をJIS X 4061にしたがってソートするには、Array(配列)からLocalizedArrayを作ってソートし、またArrayに戻します。

require 'twitter_cldr'

["あいでんてぃてぃ", "あーてぃすと"].localize(:ja).sort.to_a
#=> ["あーてぃすと", "あいでんてぃてぃ"]

 ただし、表記と読みが組になったデータをソートする機能は、そのままではありません。たとえば、次のようにします。

words = [
  { original: '春', yomi: 'ハル' },
  { original: '夏', yomi: 'ナツ' },
  { original: '秋', yomi: 'アキ' },
  { original: '冬', yomi: 'フユ' },
]

def sort_kana_cldr_by(enum)
  enum.sort_by do |x|
    TwitterCldr::Collation::Collator.new(:ja).get_sort_key(yield(x))
  end
end

sort_kana_cldr_by(words) {|x| x[:yomi]}
# => [{:original=>"秋", :yomi=>"アキ"}, {:original=>"夏", :yomi=>"ナツ"},
#     {:original=>"春", :yomi=>"ハル"}, {:original=>"冬", :yomi=>"フユ"}]

 ただ、twitter-cldr-rbは多機能なぶん、サイズも比較的大きめですし、やはり比較的大きめのライブラリいくつかに依存しています。

sort_kana_jisx4061を作った

 カナのソートに特化したRubyライブラリとしては、sort_kana_jisx4061というのもあります。私が作りました。

 もともとtwitter_cldrを知らずに手元で作っていた索引作成補助スクリプトから、カナのソート機能を切り出してライブラリ化したものです。コードは80行ぐらいの簡単なものです。

 sort_kana_jisx4061も、gemコマンドやbundleコマンドでインストールできます。

$ gem install sort_kana_jisx4061

 使い方はこんな感じです。

require 'sort_kana_jisx4061'

words = [
  { original: '春', yomi: 'ハル' },
  { original: '夏', yomi: 'ナツ' },
  { original: '秋', yomi: 'アキ' },
  { original: '冬', yomi: 'フユ' },
]

sort_kana_jisx4061_by(words) {|x| x[:yomi] }
# => [{:original=>"秋", :yomi=>"アキ"}, {:original=>"夏", :yomi=>"ナツ"},
#     {:original=>"春", :yomi=>"ハル"}, {:original=>"冬", :yomi=>"フユ"}]

 もともと索引作成用なので、読み文字列を含むデータをソートできるようにしています。また、カナや英数字に特化していて、漢字などはソート対象に入ることを想定していません。

 JIS X 4061とちょっと挙動が違うところとしては、単位記号を特別扱いせず一般の記号として扱っている点があります。これは、たとえば“$”はコンピュータ関連では、Unix系OSのプロンプトや、PerlやPHPの変数記号、Haskellの演算子などに使われるので、特別扱いするのはどうかなと思ったからです。でも規格に合わせたほうがいいんですかねえ。

 試しに手持ちの本物の書籍索引データ(“$”などは含まない)を元に、sort_kana_jisx4061とtwitter_cldrとでソートをかけてみたところ、まったく同じ結果になりました。この範囲ではsort_kana_jisx4061に問題はないようです。

 ということで、私の用途にはtwitter_cldrよりsort_kana_jisx4061のほうが使いやすそうです。

「決戦! 設楽原」

 複数の作家が1作ずつ書く「決戦!」シリーズの新作は、長篠の戦い、つまり長篠城をめぐる設楽原の戦いがテーマ。かつての、騎馬軍団 vs. 鉄砲三段撃ちというイメージから、ひところは騎馬軍団も鉄砲三段撃ちも完全否定の方向があったけど、最近はその間をとって馬による乗り込みも鉄砲大量投入もあったということで落ちついているように思う。

 それはさておき、本書では徳川&織田方の4編と武田方の3編が配されている。馬場信春は、主人公にはならないけど、いくつかの話で大活躍する。

 中でも、真田昌輝を主人公とした赤神諒「表裏比興の者たち」が印象的だった。長男の真田信綱でなく同じく剛勇で知られる次男の昌輝をもってきたところがニクい。で、父の策略と兄の武勇を持つ放蕩キャラで、ちょっとヒネていて謀略と生き残りだけを考えながら、結局史実どおり散る様子を描く。あの武藤喜兵衛も出るよ。あと於北さまの娘って清音院さまかな。

取材への道

 これは「ライティングや編集にまつわるあれこれ Advent Calendar 2018」の12月2日の記事です。昨日はモーリさん「体験型の記事などでよく見る「顔写真付きで会話させる」ちょっと古い方法」でした。

 ここで扱うのは、取材記者の準備や心得といった比喩としての“道”ではありません。IT系の記者会見やイベントが開かれる会場に取材に行くための道(ルート)の話をします。テクニックの話というより、ゆるいライフハックとして読んでください。

目黒駅から目黒雅叙園アルコタワーへ

 目黒雅叙園アルコタワー(AWSは移転してしまいましたが)の正面入口は、目黒駅から行人坂を下った目黒川近くにあります。行人坂は急なので上り下りが大変です。

 アルコタワーのアネックス(別館)の入口は、駅にほど近い、行人坂の上にあります。ここからアネックスに入れば、エスカレーターを使って坂を通り、本館の連絡口から入れます。

 ただし、オフィスビルの中を通るので、ご利用は節度を持って。

 OpenStreetMapの地図で両ルートを示します。青い線が通常のルート、赤い線がご紹介するルートです(以下同じ)。線が下手なのはご容赦ください。

目黒駅から目黒雅叙園アルコタワーへ

有楽町線から京葉線に乗り継ぐ

 幕張メッセに都内方面から行く場合、京葉線を使うことが多いと思います。有楽町線から京葉線に乗り換える場合は、路線図的には、終点の新木場まで行くことになります。

 有楽町線の有楽町駅の銀座一丁目側の改札から、東京国際フォーラムをはさんで、京葉線の東京駅の改札があります。そのため、東京国際フォーラムの地下1階の通路を通って、乗り継げます。

 トータルの時間でどちらが早いかまでは計っていません。ただ、京葉線に始発駅から乗れるというメリットはあります。

 また、東京駅から海浜幕張駅であれば、500円を払って特急を使い、1駅30分で行くという手も使えます。特急だとテーブル付き席に座れるので、写真を整理するなどのちょっとした作業もできます。

有楽町線から京葉線に乗り継ぐ

海浜幕張駅から幕張メッセへ

 海浜幕張駅から幕張メッセに行くには、屋根のある通路を通るのが定石だと思います。ただし、イベントのときは人も多いし、屋根があるので少し閉塞感もあります。雨の日は助かりますが。

 そこで、遊歩道「メッセモール」を通るルートを使えば、緑と水に癒やされながら海浜幕張駅と幕張メッセを行き来できます。まあ、歩く距離は変わりませんが。

海浜幕張駅から幕張メッセへ

恵比寿駅からウェスティンホテルへ

 ウェスティンホテルから恵比寿駅へは、恵比寿スカイウォークの動く歩道から、恵比寿ガーデンプレイスを通っていきます。このとき、恵比寿スカイウォークの終点から正面に出ると、信号を渡り、恵比寿ガーデンプレイスを通ります。

 恵比寿スカイウォークの終点から正面に出るかわりに、向かって右に向かうと、地下に下りる階段とエスカレーターがあります。こちらから、恵比寿ガーデンプレイスの地下1階を通ると、ウェスティンホテルの地下1階入口に入れます。信号を避けられるほか、雨の日にも便利です。

恵比寿駅からウェスティンホテルへ

飯田橋サクラパークへ

 飯田橋サクラパークに行くとき、半蔵門線や都営新宿線からは、九段下駅で東西線あたりに乗り換えて飯田橋駅に行くことになります。ただし、飯田橋駅の東西線ホームから飯田橋サクラパークまでは、近いようで、300m以上あります。また、九段下で電車の待ち合わせが悪い場合もあります。

 場合によってですが、九段下駅から歩くという手もあります。1番出口を出て靖国神社方面に向かい、右折して早稲田通りを道なりに進むと、飯田橋サクラパークに着きます。700mぐらいのようです。

飯田橋サクラパークへ

赤羽橋駅からザ・プリンス パークタワー東京へ

 ザ・プリンス パークタワー東京には芝公園駅が近いと思います。ただし、大江戸線であれば赤羽橋駅を使うことになります。

 赤羽橋駅からは、5叉路の信号を越えて、ザ・プリンス パークタワーのホテル宿泊者入口(南)エントランスから入ります。ホテルのエントランスなので、タクシーやバスや送迎車が出入りしやすいようにロータリーになっていて、歩行者は少しだけ回り込むことになります。

 この垣根の1箇所に歩行者が出入りできる小さな口がついています。ここを通れば、ほんの少しですが歩く距離が短縮できます。

赤羽橋駅からザ・プリンス パークタワー東京へ

結び

 ぱっと思いつくネタをいくつかまとめてみました。このほかにも、取材記者それぞれにノウハウがあると思います。公共交通機関の乗り継ぎとか。

 同じルートを繰り返していると飽きるので、気晴らしに新しいルートを開拓してみましょう。

 「ライティングや編集にまつわるあれこれ Advent Calendar 2018」では、まだまだ参加者を募集しています。編集者さん、ライターさん、どしどしご参加ください。

「新仮面ライダーSPIRITS」19

 大首領との対決が迫る!? 結城の計画、谷さんの復活、カール・ロートリンゲンの秘密兵器、そして「オペレーション ライダーシンドローム」来た!。

俺は
その言葉を待ってたよ

 それにしても表紙にもなってるしずか姉さんは、実に小悪魔的で男心を惑わすなあ。

 巻末対談は、かつての村雨良役で、今もコワモテ役で活躍する菅田俊さん。今回はパート1ということで、次は「ZVP」の話なんかも聞きたいなあ(無理か)。

「風雲児たち 幕末編」31巻

 まずカラー口絵を開いて笑った。桂さんと高杉さん、なにやってんすか(笑)。

 30巻のヒキが生麦事件だったけど、この巻ではほぼ直接取り扱われず、でも途中でも言及はされて、再びヒキが生麦事件。

 いよいよ各勢力がそれぞれ動いてきた様子が群像劇として描かれている。あと、過去巻の参照が多い。

 福沢諭吉を含む文久遣欧使節は、ロシアと樺太国境交渉に臨む。

 長州は桂と高杉が倒幕に燃えつつ、長井雅楽追討の話に。辞世の話はクスリとした。

 幕府では、安政の大獄の大赦と名誉回復がなされ、参勤交代も廃止の方向へ。それらに関連して慶喜(ケーキ)様が謹慎を解かれ表舞台に。顔つきが少し変わったな。

 福井藩では松平春嶽が、横井小楠(や亡き橋本左内)をバックに押し出される。そして薩摩の圧力のもとで文久の改革が。

 会津中将こと松平容保も登場。若くてノーブルな顔立ちの“きれいなお殿様”。そういえば、このマンガでは初期に保科正之公を大きく取り上げ、さらに徳川への忠義を強調していたな。

 薩摩では、大久保一蔵と島津久光が策謀をめぐらす。最大の危機という薩摩藩邸放火事件も。そして生麦事件へ。俊斎先生の活躍にご期待ください。

 そうそう、巻末にはドラマ版についての対談も。

「日経Linux」2018年11月号

 発売から1か月ぐらいたってしまったけど、通読メモとして。

 特集1が「やりたいことがすぐできるワザ57」。Part 1がWindowsとの合わせ技で、GNOMEのオインラインアカウント、Thunderbird、Chromeの同期、Chromeアプリ版LINE、Skype、LibreOffice、文字コード変換、RLogin、SMBによる相互ファイル共有、相互のリモートデスクトップ、GNOME拡張機能のUser Themesでのテーマ変更、Wine&Winetricks、VirtualBox。

 Part 2が便利技で、Dockのお気に入り、GNOME Tweaks、デフォルトアプリ変更、フォント追加、画面ロックの設定、CapsLockとCtrlの入れ替え、自動起動するアプリケーション、SimpleScreenRecorder、ホームディレクトリのパーミッション変更、Gnome Encfs Manager、リカバリーモード、ファイルの関連付けの変更、FlatpakアプリのUbuntuソフトウェアからのインストール、GPUドライバのインストール、LXD。

 Part 3が集約技で、VLC、SMPlayer、Open JTalkによるTTS、convertで画像にテキストを重ねる、動画編集のShotcut、3DモデリングのBlender、スマホの着信をPCで確認するGNOME SHell拡張機能GSConnect、qrencode&zbarimgによるQRコード生成・解読、Simplenote、AndroidとのUSB接続、scrcpy。

 Part 4がコマンドを使う呪文技で、スクリーンショットのscrot、コマンドラインからクリップボードを操作するxclip、標準入力を対話的に手動フィルタリングするfzf、プロセスをバックグラウンドで動かすdtach、バナー表示のtoilet、ターミナルを映画風にするhollywood、端末で画像表示するtiv、sdicをコマンドから引くシェルスクリプト、ファイラーのranger。

 Part 5がファイルやストレージを操作する操り技で、エンコーダーのHandbrake、LibreOfficeの画像やPDFへの変換機能、tar、find、ファイル復活のPhotoRec、lessによるISOやMP3のメタ情報表示、ISOのループバックマウント、HDDを完全消去するscrub&srm、Dropbox、Déjà Dup、curlftpfs&sshfs。

 特集2が、「Google工作キット2種が日本上陸」。Raspberry Piにつなぐ、画像認識AIカメラの「Google AIY Vision Kit」と、新型AIスピーカーキットの「Google AIY Voice Kit V2」を紹介している。組み立て方の手順を写真で図解しているのが特徴。Google AIY Vision Kitのほうは、笑顔検出のデモアプリと画像分類のデモアプリを動かしたあと、食事自動記録アプリを作る。Google AIY Voice Kit V2はのほうは、同梱のOSイメージをアップデートしてドライバを登録し、サンプルプログラムを動かして、GPIOにつないだLEDを音声からLチカする。

 特集3が、クラウドサーバーで初期化を実行するcloud-initを、LXDで体験する。Hello Worldで始まり、公開鍵を登録してSSHログインを設定しsudoersに追加する例を解説。AWSでcloud-initのYAMLを登録する方法も解説している。

 特集4が、「ラズパイで楽しむLinuxライフ 綺麗なWebページを簡単に作れるWordPressを使いこなそう」。Raspberry PiにWorldPressをインストールし、初期設定や、バックアップ用プラグインAll-in-One WP Migration、テーマなどを紹介。WordPressの静的サイトジェネレーターであるSimply Staticも解説している。

 「ラズパイ電子工作 お手軽レシピ集」が最終回。ラズパイ用ではないLEDディスプレイについて、Windowsで制御するところをアナライザーでプロトコルを解析し、ラズパイから制御する。

 LinuC連載も最終回。101試験がブートマネージャーとパーティションで、102試験がアカウントやポートなどのセキュリティ。

 まつもとゆきひろ氏の「プログラマのこだわり」連載が、この夏に話題となったサマータイムについて。歴史的な事例や世界的な例、日本の例、デメリット、プログラムで対応するときの注意点を挙げている。これを書いている時点では、批判意見が多かったことや、寒くなってきたことから、棚上げになってるけど。

 「ラズパイで学ぶ画像認識超入門」連載が、画像をImageMagickで前処理しOpenCVでエッジ検出して漫画風の画像に変換する。「Linux 100%活用ガイド」連載が、coreutilsの各コマンドの紹介。「Linuxで旧型PCを復活! 改二」連載が、デジタルサイネージ用に発売された2014年のタッチパネル対応一体型PCに、Ubuntu Desktop 18.04を入れて、タッチパネルで操作しやすいようにし、Google Assistant SDKをインストールしてAIスピーカー化する。カーネル新機能連載が、CIFSファイルシステムのcompounding(1つのパケットで複数のコマンドを送受信する機能)対応。

 巻頭レポートは、Ubuntu 18.10(出版当時はリリース前)、独立会社になったSUSE社のPeter Lees氏インタビュー。世界のディストロ連載が商用ディストロのSUSE Linux Enterprise。フリーソフト連載が、Windowsゲームも動かせるようになったSteamプラットフォームのSteam Play。

 みんな大好き「#!シス管系女子Season6」が、エイリアスでgrepの出力に色をつける話。ボケに巻き込まれる大野先輩w

 別冊付録が、「Windows版Linuxのすべてがわかる本」。WSLに関する記事を再編集したもので、WSLの基礎や、WSLのターミナル画面で使えるLiuxアプリ18選、WSLを有効に使うコマンドラインやシェルスクリプトの技、XサーバーのVcXsrvを使ってGUIアプリを動かす方法、Windows環境とLinux環境を組み合わせた技、コマンド&シェル超入門、Linuxの基本コマンド。第4章ではWSLでないWindows&Linux共存大作戦も。

「Q.E.D. iff」11巻、「C.M.B.」39巻

 人気ミステリーコミックシリーズの最新刊が、今回も2冊同時発売された。以下、ネタバレに気をつけているつもりだけど、未読の方は念のためご注意を。

 「Q.E.D. iff」は、「信頼できない語り手」と「溺れる鳥」の2編を収録している。

 「信頼できない語り手」は、タイトルに叙述トリックの「信頼できない語り手」をもってきて、物語には逆に嘘をつけない正直者の容疑者をもってきて、さらに……という話だ。話が込みいっているわりには、最後に納得感があった。

 「溺れる鳥」は、C.M.B.に続いて未来編。AI裁判官の判決を、弁護士見習いの水原さんと天才富豪の燈馬想(初対面)が引っくり返す。ポイントは、情報が足りないシチュエーションをどう解釈するか。

 「C.M.B.」は、「想像の殺人」「パラオパラドキシア」「ミグラスの冒険」「空き地の幽霊」の4編を収録。いずれも訓話っぽい。

 「想像の殺人」は、自分の人生は本当はこんなじゃないと考える男が、元カノにしばらくぶりに会って、そのヒモっぽい夫から別れさせようという脳内の想像にとりつかれる話。

 「パラオパラドキシア」は、「勉強することになんの意味があるの?」と行き詰まった気分でいる高校生が、化石採掘する森羅君に出会って、人生の方向を見出す話。

 「ミグラスの冒険」は、マウもの。殺人事件の遺品である、なろう系のデキの悪いものみたいなファンタジー小説が盗まれた事件を追う。

 「空き地の幽霊」は、同級生もの。郵便ポストに現れる幽霊と、閉店したラーメン屋跡の問題が描かれる。最終ページのオチにクスッとした。

 | HOME |  »

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad