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のほうが使いやすそうです。

OpenSDS Japan meetup #1に参加

 OpenStack DaysでOpenSDSを知って、9月3日に開かれたOpenSDS Japan meetup #1に参加してみました。

 ちなみに抽選会でスマートバンドのHuawei Band 2 Proが当たってしまいました。

 それはさておき、以下、メモほぼそのまま(敬称略)。

あいさつ 伊藤@bmark

  • こんなに来るとは思ってなかった
  • OpenSDSって知ってた人? → 多い

    • なら多くてもしかたない
  • OpenSDSとは何かから

  • いまOpenSDSがどうなっているかまで
  • 開発にコミットしている企業の声も

Steven Tan(OpenSDS chairman、Huawei)

  • OpenSDSは

    • オープンソースプロジェクト
    • GitHubに
  • ITの進化

    • モノリシックからマイクロサービスに
    • レガシーからハイブリッドクラウドに
  • modern data centerでは

    • アプリケーションはlegacyやパブリッククラウドやプライベートクラウドの上で
    • 物理マシン、仮想マシン、コンテナ
    • さまざまなツール
  • 必要なこと

    • オープンソースで複数のベンダーや開発者
    • オープンスダンダード
    • 公平のためのベンチマーク
  • まずコントロール/管理プレーンに集中

  • 組織

    • Technical Steering Committee(ロードマップを作る)
    • End-User Advisory Committee(要望を上げる)
  • ゴール

    • Open
    • Real
    • Ready(エコシステムができていること)
  • コアプロジェクト

    • SUSHI
      • ノースバウンドのプラグイン
      • Mesos、Docker、OpenStack、CloudFoundry、VMware、Oracle、SAP
    • HOTPOT
      • ストレージコントローラー
  • ポリシードリブン
    • プロビジョニング、スナップショット、レプリケーション……
  • 分散スケールアウトアーキテクチャ
    • Hotpot Controllerから各ノードのHotpot Dockと各ドライバーに接続
  • k8sでのアーキテクチャ

    • OpenSDS CSI Plugin→OpenSDS Hotpot→OpenSDS Dock→Storage
  • ダッシュボード画面

    • 佐藤さんのプレゼンでデモの予定
  • その先:Open Data Fabric

  • ビジネスサイドの要求とITサイドの必要とすること
  • ビジネスドライバー
    • モニタリング、レポート、分析、予兆、オーケストレーション、インテリジェンス
  • Data Fabricのkey design principle
    • data irrespective of where it is located
    • governance and compliance
    • all components interoperate
    • common tools and facilities
    • ability to choose
  • Open Data Fabric
    • automated policy-based storage and data services
    • data lifecycle and other data activities
    • seamless data mobility
    • heterogeneous storage platforms and clouds
  • 要素

    • Orchestration & automation
      • compute frameworkの要求に応じて
    • Multi-cloud data control
      • policy-based data mobility
    • data & storage Intelligence
      • automatically tune the storage infrastructure
  • 差別化

    • ODF unifies management of storage and data services
    • ODF integrates data management
    • ODF enables interoperability
    • ODF avoids vendor lock-in
  • ロードマップ

    • 2017H2 Zealand
      • k8s FlexVolume、Ceph、LVM…
    • 2018H1 Aruba
      • OpenStack、Dashboard…
    • 2018H2 Bali
      • S3 Object、Multi-Cloud Data Control
    • 2019H1 Capri
  • leverage OpenSDS community

    • 世界中のOpenSDS 2018イベント
    • 日本ではCloud Native、Open Source Summit…
    • CloudNativeCon Copenhagenでの様子
  • OpenSDSに参加しよう

Noriaki FUkuyasul(The Linux Foundation Japan)

  • (伊藤bmark前説:OpenSDSはLinux Foundationがホストしている)

  • The Linux Foundation(LF)

    • 近年はLinuxだけでなくいろいろな開発コミュニティをサポートしている
    • Let's Encryptもk8sもNode.jsも
  • LFのミッション

    • 持続可能なエコシステムの実現
    • オープンソースプロジェクトの中でも、影響力が大きくなるだろうと思われるプロジェクトをサポート
  • OpenSDSに対してLFは

    • Upstream FirstをOpenSDSで、日本でも充実させたい

NTT Communications 楠 慶

  • Hybrid Cloud TransformationのためのData Moblilityとクラウドストレージデザイン

  • ホスティングの歴史

  • 〜2010
    • 馬車の時代
    • マイグレするぐらいなら作り直し
  • 2011〜
    • 列車の時代
    • クラウド
    • お客様がモビリティを獲得しはじめる
    • だが乗り換えは大変
  • 2013〜

    • 車の時代
    • コンテナ
    • k8sで作っておけばモビリティ
  • が、データには「論理質量」がある

  • まだTBスケールなのでなんとかなる

    • IoT/ビッグデータ、AIでデータ量増加
  • data mobilityの2つのコスト

    • ネットワークコスト(データプレーン)
      • どうつなぐか
      • クラウドへの接続は高い
        • 専用線、ポート課金、転送量従量課金
    • マネジメントコスト(コントロールプレーン)
      • 複数のストレージシステムとIaaS基盤
      • いろいろなところで1ベンダーにロックインされる
  • NTTコムのEnterpriseCloud

  • ストレージネットワークはデータプレーンとストレージプレーンに分かれている
    • 普通のリーフ-スパイン構成
    • VXLANでSDN
  • ストレージがネットワークのマルチテナンシーを持つ
    • 異なるお客様が同じIPアドレス
    • タグVLANで
    • ストレージとVMの間をSDNコントローラーでVXLANトンネル作成
  • いったいいくつのコントローラーを開発?

    • ブロックストレージ、ファイルストレージ、オブジェクトストレージ……
    • 独自APIではお客様がk8sから叩けない
  • OpenSDSなら

    • Hotpotの部分でいろいろ対応
    • ストレージコントローラーとSDNコントローラーだけ書く
  • ノーモア車輪の再発明

  • オープンスタンダードなAPI

ヤフー株式会社 佐藤佑介 武井聖也

  • 2017年からOpenSDSコミュニティに参加
  • 2018年6月からArubaを絶賛PoC中

  • デモ

  • 基本動作

    • Webのダッシュボード
    • ボリュームを作る
      • プロファイルを指定できる:ストレージの種類
    • CLIからもosdsctlコマンドで
      • osdsctl pool list
      • osdsctl volume list
      • osdsctl volume create --az xxx --name yyy 1
  • Array-based Replication
    • 対応はいまのところHuawei Doradoのみ
    • ボリューム作成
    • レプリケーション作成
    • DoradoのWeb UIから確認
  • Host-based Replication
    • DRBDで
    • ここではLVMで
    • CLIから
      • osdsctl replication create xxx yyy
    • 相手で
      • drbdsetup status
      • 少し時間がかかる
  • Kubernetes連携
    • OpenSDS CSI pluginでパーシステントボリュームを払い出す
    • CSIのPodがすでにデプロイされている状態
    • kubectl get pvc
    • NginxのPodでドキュメントルートにマウント
  • OpenStack連携

    • single nodeのOpenStackでCinder APIをOpenSDSでおきかえ
  • Arba PoCの結果

    • バグはあるが基本機能の動作はおおむね問題なし
    • OpenSDS nativeのDriverが少ない
  • Q:OpenStack連携での性能は

    • A:コントロールプレンのみで、データプレーンはCinderそのものなので違わない

パネルディスカッション

  • 発表者に、サイバーエージェント長谷川と、GMOペパボ常松が加わる

  • 伊藤bmark:参加者の質問から。コードサイズは

  • A(楠):GitHub

    • 開発状況は議事録などもすべてGitHubに
  • 伊藤:参加したいといって会社が参加させてくれたか

  • 楠:上司は消極的に「参加してみたら」と
    • 参加してみると、会合のたびに同じ悩みを持つ人が多い
    • うちと同じ課題
  • 佐藤:LFの後ろ盾があるということで

    • エンドユーザー側の要望を聞いてくれる
    • Web UIなど
  • 伊藤:会社でやれそう?

  • 常松:うちは入ろうと思えば特に問題はない
  • 長谷川:たぶん問題なく入れるんじゃないかな

    • 上の人はあまり考えないので
    • 現場が考えて現場が責任をとる
  • 伊藤:いまのストレージ製品で解決できない問題があるから?

  • 長谷川:保守切れとか
    • ストレージがかわるとアクセスの仕方が変わる
    • 皮をかぶせておけば便利なんじゃないか
  • 常松:違いを吸収できる
    • k8sのpersistence volumeをCinderでの例
    • OpenStackをかまさないといけないので
    • デモのようにそこを吸収してくれると
  • 佐藤:管理を楽にしたいというモチベーションが一つ
    • 新しいストレージに移行したい。同じベンダーでないとレプリケーションできない
    • OpenSDSがベンターをまたがったレプリケーションを将来サポートしてくれば
  • 楠:うちは保守ぎれたくさんw

    • 高いextraサポートで
    • ロックイン
  • 伊藤:変わった?

  • 楠:まだArubaでテストフェーズ
    • データは絶対的な安定が求められる
  • 佐藤:とりあえず試して形になることがわかったフェーズ

    • 少し前は、この2人(楠氏と)ぐらいしか盛り上がってないんじゃないかとw
    • これから変化が起きるとうれしい
  • 伊藤:より期待すること

  • 長谷川:うちの会社はDCを地方に分けてリスク分散はしない方向w
    • レプリケーションよりは、ブロックストレージとかファイルストレージとか用途が増えるとうれしい
  • 常松:レプリケーション、バックアップ
    • うちはDRはやるように言われているのでw、遠隔地バックアップも
  • 佐藤:DBの連携が楽になると
    • ファイルストレージも
  • 楠:ハイブリッドクラウドでパブリックラウドとどんどん連携してくれると

    • テレコム屋さんはみな言っている
  • 楠:質問から「競合は? Scality Zenkoなど?」

    • Scality Zenkoはオブジェクトストレージ専門
    • OpenSDSはブロックストレージからいろいろ
    • コラボできるとうれしい
  • 佐藤:ストレージのオーケストレーションを標準化するプロジェクトはいくつかある

    • EMCとか
    • OpenSDSが違うのは、End-User Advisory Committeeがあること
    • k8s CSIなどとの連携
  • 伊藤:質問から。障害対応機能

  • 楠:まだない

    • まだ「A」なので
    • みなさん、OpenStackの「A」の頃を思い出していただければw
  • 常松:SUSHI。アクティブに開発。いつごろ実用的に?

  • 楠:なんともいえない

    • CSIとCinderは早い
    • それ以外は形にもなっていない
    • ノースバウンドはまだまだ
  • 楠:質問から「ステッカーありますか?」

    • あります
    • Tシャツもあります
  • 伊藤:ちなみにコードサイズは64万行とのこと

  • 会場:コントリビューションにagreementにサインしたりする必要は?

    • Steven:No
    • 誰でも参加できる
  • 会場:楠さんの話。マルチクラウドのインテグレーションがやりたいと

    • 今はクロスクラウドはできない?
  • 楠:次のBaliでS3で翔ばせるようにしようと言っているぐらい

    • いまのところローカルだけのオーケストレーション
    • Scality Zenkoと被るがw
  • 会場:End-User Advisory Committeeにどのように参加、貢献

  • 楠:ぼくと佐藤さんは
    • 2Wに一度電話会議に参加して要望を言う
    • リアルに会うのは半年に1回ぐらい、ビッグなイベントのついでに
    • そこでディープなディスカッション
    • 基本的にはワーワー言うだけ
  • 佐藤:基本的には触ってフィードバックするのがメイン

twitter-cldr-rbの日本語文字列照合順序をsort_kana_jisx4061と比較

 拙作sort_kana_jisx4061を仲間内で紹介したところ、ICU(International Components for Unicode)をRubyで実装したtwitter-cldr-rbというのがあると教えてもらいました。

 twitter-cldr-rbはCLDR(Common Locale Data Repository)にもとづいてデータをRubyで国際化処理するもので、さまざまな機能があります。ここではsort_kana_jisx4061と同様の日本語文字列照合順序の機能を比較してみます。

twitter-cldr-rbでできること

 twitter-cldr-rbのREADME.mdを見ると、さまざまな国際化の機能があります。数字の桁区切り(カンマかピリオドかなど)、重さや長さの単位、通貨の単位、数字を言葉で書く、日時の表記、月日の表記、列挙などに対応しています。

 その1つとして、対象ロケールでの文字列照合順序が実装されています。

 照合順序のデータは、ソースの「/resources/collation/tries/」ディレクトリに、マーシャルされたバイナリデータとして用意されています。ja.dumpは201KBのようです。

比較してみる

 twitter-cldr-rbは、RubyGemsからインストールできます。

$ gem install twitter-cldr-rb

 ここでは、元の文字列と読みをタブで区切った1行1項目のテキストから、日本語文字列照合順序でソートした元の文字列のリストを出力することにします。

 twitter-cldr-rbでは通常、照合順序にもとづいたソートには、ArrayからLocalizedArrayを作ってsortメソッドを呼び出します。が、そのままでは「元の文字列と読みからなるHashを、読みでソートする」ということができません。

 そこで、1つ下のレイヤーのメソッドを呼び出してソートします。

#!/usr/bin/env ruby

require 'twitter_cldr'

JACOL = TwitterCldr::Collation::Collator.new(:ja)

def sort_kana_cldr_by(enum)
  enum.sort_by {|x| JACOL.get_sort_key(yield(x)) }
end

alldat = []

ARGF.each_line do |line|
  word, yomi = line.chomp.split(/\t/)
  alldat << { word: word, yomi: yomi }
end

sort_kana_cldr_by(alldat) {|x| x[:yomi]}.each do |x|
  puts x[:word]
end

 比較対象として、sort_kana_jisx4061でも同じ働きをするものを作ります。

#!/usr/bin/env ruby

require 'sort_kana_jisx4061'

alldat = []

ARGF.each_line do |line|
  word, yomi = line.chomp.split(/\t/)
  alldat << { word: word, yomi: yomi }
end

sort_kana_jisx4061_by(alldat) {|x| x[:yomi]}.each do |x|
  puts x[:word]
end

 この両方に手持ちのデータをかけた結果、同じ出力になることを確認しました。

jpholidaypのローカルタイム依存をなくす問題

 「(日本で)今日が休日かどうか」を判定するjpholidaypというツールを公開しています。100行ぐらいのPythonスクリプトです。もともと、素に近いサーバーにスクリプトを1つ入れるだけでcronから使える、というコンセプトで作りました。

 jpholidaypのコードでは、「今日」の判定に、ローカルタイムがJST(日本時間)であることを前提にしています。しかし、ちょうどサマータイム論議もあるところだったりして、それってダサいよなーと思っています。

 ただまあ、Python 2/3両対応とか、(できるだけ)追加モジュール不要とかを考えるといろいろ面倒だなあと。

 今日を求めるコードは、現状ではこんな感じ。

from datetime import date

today = date.today()

 明示的にJSTを指定すると、Python 3ではこうなります。ただしPython 2では使えません。

from datetime import date, datetime, timedelta, timezone

JST = timezone(timedelta(hours=9), 'JST')

today = datetime.now(JST).date()

 Python 2でも使えるようにするには、こうなります。

from datetime import date, datetime, timedelta, tzinfo

class JST(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=9)

    def tzname(self, dt):
        return 'JST'

    def dst(self, dt):
        return timedelta(0)

today =  datetime.now(JST()).date()

 ただ、いずれにしても時差9時間固定で、サマータイムなどには対応していません。

 そこで、Python 2/3とも、pytzライブラリを使えば、タイムゾーンのデータベースを使えます。

from datetime import date, datetime
import pytz

JST = pytz.timezone('Asia/Tokyo')

today = datetime.now(JST).date()

 ただ、pytzライブラリを追加する必要があるのが、冒頭のコンセプトからすると、少しだけ考えてしまうところです。

 とりあえずpytzによる実装をpytzブランチに置いておきました。

XKBのキー配列でCtrlとCapsを入れかえ、変換と無変換をShiftにする

 最近のLinuxのデスクトップ環境では、キーをXKBという機構で管理しています。最近、新規でLinuxデスクトップ環境をセットアップしたので、ついでに自分のキーカスタマイズ方法をメモしておきます。カスタマイズ内容は、タイトルのとおり、CtrlキーとCapsキーを入れかえるのと、変換キーと無変換キーをShiftキーにすることです。

 まず設定ファイルのディレクトリを作ります。

$ mkdir -p ~/.xkb/{keymap,symbols}

 使っているキーコンポーネント名をファイルに保存します。

$ setxkbmap -print > ~/.xkb/keymap/mykbd

 symbolsディレクトリの下に新規ファイルを作ります。ここでは仮に「henkan」とします。

$ vi ~/.xkb/symbols/henkan

 無変換キーに左Shiftキーを、変換キーに右Shiftキーを割り当てるには、以下のような内容を書き込んで保存します。

partial modifier_keys
xkb_symbols "thumb_shift" {
    replace key <MUHE>  { [ Shift_L ] };
    replace key <HENK> { [ Shift_R ] };
};

 キーコンポーネント名を保存したファイルをテキストエディタで開きます。だいたい7行ぐらいだと思います。

$ vi ~/.xkb/keymap/mykbdf

 こんな感じで変更します。

        xkb_symbols   { include "pc+jp+inet(evdev)      };
                ↓
        xkb_symbols   { include "pc+jp+inet(evdev)+ctrl(swapcaps)+henkan(thumb_shift) };

 「henkan(thumb_shift)」は、symbolsディレクトリの下に作ったファイル名と、そのファイルでxkb_symbolsで定義した名前です。

 設定を読み込みます。

$ xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY

 「$HOME」と書いているのは、「-I」の直後の「~」はシェルが展開してくれないためです。

 なお、IMフレームワークにiBus使っていると、IMを切りかえたときに、カスタマイズされたキー配列がクリアされます。これは、iBusではIMがキー配列と結びついているための必然です。

 iBusではなくFcitxを使っていて、半角/全角キーによりIMをオン/オフしたときにも、キー配列がクリアされてしまう場合があります。これはGNOMEとiBusの統合機能が有効になっていて、iBus方式のキー配列管理がされているからです。Fcitxでこのようになる場合には、統合機能を無効にします。

$ gsettings set org.gnome.settings-daemon.plugins.keyboard active false

カナ英数字のJIS X 4061ソートをRubyGemsに

 仕事で使い回していた、Rubyでカナ英数字をJIS X 4061(日本語文字列照合順番)順にソートする単純なルーチンを、ライブラリに切り出してまとめました。ついでに自分が使いやすいよう、RubyGemsにリリースしました。

  •  実は初RubyGemsです。

     ユースケースとしては、たとえば書籍の索引データをソートするときに使います。JIS X 4061では、“カ”=“ガ”とか、“ヤ”=“ャ”とか、句読点 < 記号 < 数字 < 英字 < カナとかいった比較順序が決められています。ざっくりいうと、Excelのソート順です。

     なお、漢字から読みを生成して比較する機能はありません。あと、自分のユースケースをカバーできればいいので、JIS X 4061のフルセット対応は狙っていません。

    cpdfがpdftk代替として高機能だけど自分の用途には使えなかった

     PDFから一部のページを抜き出したり、反対に複数のPDFを1本にまとめたりするのに、コマンドラインツールのpdftkを便利に使っています。

     ただ、pdftkがGCJ(GNU Compiler for Java)で作られていて、そのGCJがメンテナンス終了になっていたりという状況です。最近のCentOSやmacOSでは、動かなかったり、動かすのに苦労したりするようです。

     調べてみると、cpdf(Coherent PDF)というツールがpdftkのようなことができて、高機能なようです。そこで、試してみました。

     先に結論をいうと、タイトルのとおりです。

    ライセンス

     「自分の用途には使えなかった」理由は、ライセンスです。cpdfは、無料で使えてソースも公開されていますが、フリーソフトウェアではありません。アカデミック目的での利用や、個人でのお試しはOKですが、仕事目的で使うのはNGとされています

     機能はよかったんですけどね。

    インストール

     cpdf-binariesリポジトリに、Linux用(64bit、32bit)、macOS用、Windows用のバイナリが用意されています。ダウンロードして実行権を付け、実行パス中のディレクトリに置くだけです。

     依存ライブラリは少ないようですね。

    $ ldd ~/bin/cpdf
            linux-vdso.so.1 =>  (0x00007ffe523db000)
            libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3f83be9000)
            libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3f839e5000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f8361b000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f3f83ef2000)

     そのほか、OCamlのopamでビルドしてインストールする方法もあるようです。

    使い方

     PDFファイルの結合はこんな感じ。

    $ cpdf a.pdf b.pdf -o out.pdf

     一部のページを抜き出すにはこんな感じ。

    $ cpdf a.pdf 1-5,8 -o out.pdf

     ページ指定にendとかoddとかevenとかallとか使えるのはpdftkっぽいですね。

     ページの回転も指定できます。

    $ cpdf a.pdf -rotateby 90 -o out.pdf

     PDFファイルの情報を表示する機能もあります。

    $ cpdf -info a.pdf

     使われているフォントも調べられます。

    $ cpdf -list-fonts a.pdf

     そのほかにも、ページサイズ操作とか暗号化とか、さまざまな機能があるようです。

     | HOME |  »

    Categories

    Recent Entries

    Recent Comments

    Recent Trackbacks

    Appendix

    emasaka

    emasaka

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

    Monthly


    FC2Ad