FC2ブログ

本を読む

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

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

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

    日経xTECHのRSSを生成するスクリプトを作った

     IT系ニュースサイト「日経ITpro」が「日経xTECH」にリニューアルされました。それにともない、RSSフィードが廃止されたようで、どこにも見当りません。これでは自分には不便すぎるので、指定した記事一覧ページから勝手にRSS(Atom)を生成するスクリプトを作りました。

     nokogiriとRSS::Makerをつないでいるだけの、30行ぐらいのRubyスクリプトです。

     たとえば、ITカテゴリーのニュースのRSSを生成するには以下のように実行します。

    $ ruby xtech2rss.rb http://tech.nikkeibp.co.jp/news/index_it.html > xtech_itnews.xml

    追記2018.2.25:その後、日経xTECHで公式にRSSフィードを公開したようです。

    Pocketの連続再生が便利

     以前書いたように、私はAndroid端末のPocketアプリで音声読み上げ(TTS)を愛用しています。

     ちょっと前になりますが、2017年10月のアップデートで、Pocketの音声読み上げのインターフェイスが一新されました。再生中はモーダルダイアログが表示されるものから、画面下にバーが表示されるものになり、記事表示と独立して再生されます。再生スピードや声の高さなども以前より柔軟になったようです。

     一番便利なのは、連続再生の機能が付いたことです。記事一覧の画面でツールバーのヘッドフォンのアイコンをタップすると、上の記事から順に連続で読み上げてくれます。また、記事を開いた状態で音声読み上げを呼び出すと、そこから下の記事を順に読み上げてくれます。私はたとえば台所で料理や皿洗いをしながら記事を聞くので、濡れた手で操作しなくてすむのが想像以上に便利でした。

     ただ、使っている限りでは、常に全記事での順序となるようです。私の場合、音声読み上げ向けの記事に「tts」タグを付けているので、タグの記事一覧を順に読み上げてくれる機能があればもっと便利なのにと思います。

    PocketのTTSの連続再生

    Ubuntu 17.10リリース記念オフラインミーティングで発表した

     「Ubuntu 17.10リリース記念&Ubuntu Weekly Recipe 500回記念オフラインミーティング17.12」に参加して、5分程度の発表をしてきました。

    ibus-skkをなんとかすっぺ会議 from emasaka

     「パッチを書いても送り先がないんですよね」というだけの話です、はい。

     | HOME |  »

    Categories

    Recent Entries

    Recent Comments

    Recent Trackbacks

    Appendix

    emasaka

    emasaka

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

    Monthly


    FC2Ad