Vine Linuxでタイル型ウィンドウマネージャ(ratpoisonとawesome)を私的パッケージ化

Vine Linuxでタイル型ウィンドウマネージャ(ratpoisonとawesome)を私的パッケージ化

経緯

Vine Linuxにはタイル型ウィンドウマネージャのパッケージが存在していません。

そこで全くの個人的な興味から、タイル型ウィンドウマネージャとして ratpoison (version 1.4.8)と awesome (version 3.5.6)をパッケージ化したのでrpmファイルをアップロードします。

ただし個人的には fluxbox (version 1.3.5)をカスタマイズして愛用しています。

インストール

ダウンロード先

このページ から適切なrpmファイルをダウンロードしてインストールして下さい。

  • Vine Linux6ならVine6
  • VineSeed(次期Vine Linux7)ならVine7

のページに進み、さらに

  • 32ビット環境であればi686
  • 64ビット環境であればx86_64

のページに進みます。

ratpoison

Vine Linux6とVineSeed(Vine Linux7)用のパッケージを用意しました。

  • ratpoison-1.4.8-***.rpm

をダウンロードしてインストールします。

awesome

VineSeed(Vine Linux7)用のパッケージだけを用意しました。 Vine Linux6では依存パッケージのバージョンが古いためビルドできませんでした。

  • lgi-0.9.0-1vl7.***.rpm
  • awesome-3.5.6-1vl7.***.rpm

の2つのパッケージをダウンロードします。先にlgi(awesomeの依存パッケージ)をインストールしてから awesomeをインストールします。

注意事項

使用方法

ここでは操作方法については書きませんが、他のページで十分調べてから使用するようにして下さい。特に「ログアウト」の方法を知らずにログインしてしまうと大変です(経験済みです)。

責任回避のようなもの

今回はあくまでも私的にパッケージ化したものであり、 Vine Linuxのオフィシャルなものではありません。ですのでパッケージの説明文は非常にいいかげんなものです。また、ライセンスの記載も正しくないものも含まれています。

また、使用した事によって生じた不具合などについては責任を取ることはできません。

カテゴリカルデータからダミー変数を作成するR関数を自作(複数列対応可)

追記(2017.1.3)

makedummiesパッケージがCRANに登録されました。ブログの このページ を参照して下さい。

追記(2015.12.26)

GitHubで関数を公開しました。ブログの このページ を参照して下さい。

経緯

Rのglm関数を用いて重回帰分析を行う際には、カテゴリカルデータを自動的にダミー変数に変換してくれるため、あまり苦労しません。

現在、個人的にRStanを勉強中であり、同じ解析を行うためには自分でダミー変数を作成する必要があります。さらにカテゴリカルデータと数値データが混在しているとそれだけで非常に大変です。

そこで群馬大学の青木先生が公開されているmake.dummy関数( http://aoki2.si.gunma-u.ac.jp/R/src/make.dummy.R )をもとにして関数を作成しました。

作成した関数

(2015.9.6追記)以下のプログラムを修正したものを記事の下に掲載しています。こちらを使用せずにそちらを参考にして下さい。

# http://aoki2.si.gunma-u.ac.jp/R/src/make.dummy.R
make.dummy <- function(dat, basal_level= FALSE, sep = "_") {
    name <- colnames(dat)
    level <- levels(dat[,1])
    if (!is.data.frame(dat))
        dat <- as.data.frame(dat)
    ncat <- ncol(dat)
    dat[, 1:ncat] <- lapply(dat, function(x) {
        if (is.factor(x)) {
            return(as.integer(x))
        } else {
            return(x)
        }
    })
    mx <- sapply(dat, max)
    start <- c(0, cumsum(mx)[1:(ncat-1)])
    nobe <- sum(mx)
    ## modified
    res <- t(apply(dat, 1, function(obs) 1:nobe %in% (start+obs))) + 0
    colnames(res) <- paste(name, level, sep = sep)
    if (basal_level == FALSE) res <- res[,-1]
    return(res)
}


make.dummys <- function(dat, ...) {
    n <- ncol(dat)
    res_list <- lapply(seq(n), function(i) {
        tmp <- as.data.frame(dat[,i])
        colnames(tmp) <- colnames(dat)[i]
        if (is.factor(dat[,i])) {       # factor or ordered
            make.dummy(tmp, ...)
        } else {
            tmp
        }
    })

    res <- NULL
    for (i in seq(n)) {
        res <- cbind(res, res_list[[i]])
    }
    return(res)
}

解説

make.dummy関数

青木先生が公開されているmake.dummy関数を少しだけ改変しました。データはデータフレーム形式で渡します。

変更点は以下の点です。

  1. 基準となるカテゴリーを削除できるように変更
    • basal_level引数が FALSE => 基準となるカテゴリーを削除する(デフォルト)
    • basal_level引数が TRUE => 基準となるカテゴリーを削除しない
  2. 列名を追加
    • sep引数で変数名とカテゴリー名を連結する文字列を設定(デフォルトは”_”)

(2015.9.6追記)新バージョンではこの関数は削除しました。ただし、引数の説明はこのまま使用できます。

make.dummys関数

元データが複数の列からなっている場合にも一度にダミー変数に変更するようにしました。

また、カテゴリカルデータ以外(主に数値データ)の場合にはそのまま出力するようにしました。

ですので make.dummys関数を使用すればOKです。引数sepとbasal_levelも使用可能です。

使用例

カテゴリカルデータの場合

基準となるカテゴリーを削除する場合

dat <- data.frame(x = factor(rep(c("a", "b", "c"), each = 3)))
dat$x
make.dummys(dat)
[1] a a a b b b c c c
Levels: a b c

      x_b x_c
 [1,]   0   0
 [2,]   0   0
 [3,]   0   0
 [4,]   1   0
 [5,]   1   0
 [6,]   1   0
 [7,]   0   1
 [8,]   0   1
 [9,]   0   1

基準となるカテゴリーを削除しない場合

make.dummys(dat, basal_level = TRUE)
     x_a x_b x_c
[1,]   1   0   0
[2,]   1   0   0
[3,]   1   0   0
[4,]   0   1   0
[5,]   0   1   0
[6,]   0   1   0
[7,]   0   0   1
[8,]   0   0   1
[9,]   0   0   1

変数名とカテゴリー名を連結する文字列を変更

make.dummys(dat, sep = ":")
     x:b x:c
[1,]   0   0
[2,]   0   0
[3,]   0   0
[4,]   1   0
[5,]   1   0
[6,]   1   0
[7,]   0   1
[8,]   0   1
[9,]   0   1

順序のあるカテゴリカルデータの場合

dat <- data.frame(x = factor(rep(c("a", "b", "c"), each = 3)))
dat$x <- ordered(dat$x, levels = c("a" ,"c" ,"b"))
dat$x
make.dummys(dat)
[1] a a a b b b c c c
Levels: a < c < b

      x_c x_b
 [1,]   0   0
 [2,]   0   0
 [3,]   0   0
 [4,]   0   1
 [5,]   0   1
 [6,]   0   1
 [7,]   1   0
 [8,]   1   0
 [9,]   1   0

カテゴリカル変数は意味のある語が使用されることが多いため、実際にはordered変数を使用して順序のあるカテゴリカルデータとして扱うことが多いと思います。

数値データの場合

dat <- data.frame(x = rep(1:3, each = 3))
dat$x
make.dummys(dat)
  x
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3

数値データはそのまま出力されます。

複数の列をもつ場合

2つのカテゴリカルデータ

dat <- data.frame(
    x = factor(rep(c("a", "b", "c"), each = 3)),
    y = factor(rep(1:3, each = 3))
)
make.dummys(dat)
     x_b x_c y_2 y_3
[1,]   0   0   0   0
[2,]   0   0   0   0
[3,]   0   0   0   0
[4,]   1   0   1   0
[5,]   1   0   1   0
[6,]   1   0   1   0
[7,]   0   1   0   1
[8,]   0   1   0   1
[9,]   0   1   0   1

それぞれダミー変数として出力されます。

カテゴリカルデータと数値データ

dat <- data.frame(
    x = factor(rep(c("a", "b", "c"), each = 3)),
    y = rep(1:3, each = 3)
)
make.dummys(dat)
  x_b x_c y
1   0   0 1
2   0   0 1
3   0   0 1
4   1   0 2
5   1   0 2
6   1   0 2
7   0   1 3
8   0   1 3
9   0   1 3

カテゴリカルデータと数値データが混在してもカテゴリカルデータのみがダミー変数に変換されます。

追記

2015.9.6

プログラムを修正しました。

  • make.dummys関数の1つだけで動作するように改変しました。
  • ダミー変数に変換するプログラムも簡潔にしました。
  • 得られる結果は同じです。
  • ただし、元データの行ラベルも再現するように変更しました。

2015.9.11

プログラムを少し修正しました。

統計学関連なんでもあり のNo. 21771から始まるスレッドの青木先生の書き込みをもとに変更しました。

こちらの方が行数は増えますが、処理の内容が明確でした。

make.dummys <- function(dat, basal_level = FALSE, sep = "_") {
    n_col <- ncol(dat)
    name_col <- colnames(dat)
    name_row <- rownames(dat)

    result <- NULL
    for (i in seq(n_col)) {
        ## process each column
        tmp <- dat[,name_col[i]]
        if (is.factor(tmp)) {
            ## factor or ordered => convert dummy variables
            level <- levels(droplevels(tmp))
            ## http://aoki2.si.gunma-u.ac.jp/taygeta/statistics.cgi
            ## No. 21773
            m <- length(tmp)
            n <- length(level)
            res <- matrix(0, m, n)
            res[cbind(seq(m), tmp)] <- 1
            ## res <- sapply(level, function(j) ifelse(tmp == j, 1, 0))
            colnames(res) <- paste(name_col[i], level, sep = sep)
            if (basal_level == FALSE) {
                res <- res[,-1]
            }
        } else {
            ## non-factor or non-ordered => as-is
            res <- as.matrix(tmp)
            colnames(res) <- name_col[i]
        }
        result <- cbind(result, res)
    }
    rownames(result) <- name_row
    return(result)
}

LuaTaTeXでギリシア文字のボールド体を出力する

経緯

普段はLuaLaTeXで講義資料を作成しています。フォントとして TeX Gyre Termis などを好んで使用しています。

texlive2015のパッケージのアップデートをしていたらいつの間にかギリシア文字のボールド体が出力されないようになっていました。解決したのでその時のメモを残しておきます。ただし、otfフォントを指定している場合の話です。

方法

これまでの方法

まず先にLaTeX文章を示します。

\documentclass[a4paper, 11pt]{ltjsarticle}

% mathematical font
\usepackage{amsmath}
\usepackage{fontspec}
\usepackage{unicode-math}
\unimathsetup{math-style=TeX,bold-style=TeX,vargreek-shape=TeX}
\setmathfont{texgyretermes-math}

% Serif, Sans, Monospace
\setmainfont[ItalicFont=texgyretermes-italic, Ligatures=TeX, Scale=0.95]{texgyretermes-regular}
\setsansfont[Ligatures=TeX, Scale=0.95]{texgyreheros-bold}
\setmonofont[BoldFont=Inconsolatazi4-Bold, Ligatures=TeX, Scale=1]{Inconsolatazi4-Regular}

% other setting
\renewcommand{\bfdefault}{bx}
\renewcommand{\bf}{\gtfamily\sffamily\bfseries}

\begin{document}

\begin{itemize}
 \item $\alpha_\text{1}$
 \item {\bf $\mathbf{\alpha_\text{1}}$}
\end{itemize}

\end{document}

これまではこのように \mathbf を使用してギリシア文字をボールド体にしていました。これが、ある時点からうまく行かなくなりました。

改善策

色々とネット上で調べていると、 unicode-mathパッケージの説明書(英語)や このページ\symbf を使う例が載っていました。

そこで

\begin{itemize}
 \item {\bf $\symbf{\alpha_\text{1}}$}
\end{itemize}

のように変更することでボールド体が出力されるようになりました。

その他

ちなみに \text{1}としているのは数式フォントではなく、通常のフォントを使用するためです(\usepackage{amsmath}が必要)。また、このようにすることで全体を{\bf }で囲ったときにボールド体になるようにするためです。

本来は\textbf{}で囲む方がいいのでしょうが、欧文フォントと日本語フォントの両方をゴシック体にするように設定しているためです(\section{}などと同じ挙動になるように)。

追記(2015/8/30)

ギリシア文字だけをボールド体にするのであれば

\begin{itemize}
 \item $\symbf{\alpha}$
\end{itemize}

で十分です。

また、 unicode-mathのバージョンが 0.7e(2014/06/30)から0.8(2015/07/29)に上った際にこのような現象が起きたようです。

Haskell環境およびpandocをVine Linux 6.3(64-bit)に導入する

追記(2016.2.21)

Vine Linux 6 およびVineSeedにrpmパッケージをアップロードしました。したがって以下の記事は過去の記録程度の意味となりました。

現時点では

  • ghc-7.10.3(現時点での最新版)
  • haskell-platform-2015.7.10.3(公式のバージョンは7.10.3)
    • alex, cabal-install, happy, hscolour
  • pandoc, pandoc-citeproc, pandoc-crossref

のパッケージをアップロードしています(ここに至るまでの試行錯誤が大変でした)。

経緯

個人的な興味から pandocをインストールした際のメモです。

pandocについてはこの スライド (73ページ以降)で知りました。

また、るびきち様のこのページ にもpandocを使用した例が載っています。

pandocはHaskell言語で書かれているためまずHaskell処理系のインストールから始めました。 Haskell処理系のインストールは こちらのページ を参考にしました。

インストール手順

今回はバージョンは古いですが、

をインストールしました(私の環境では最新版をインストールしようとすると失敗しました)。

ghcのインストール

tar xzf ghc-7.6.3-x86_64-unknown-linux.tar.bz2
cd ghc-7.6.3
./configure
sudo make install

で /usr/local 以下にインストールされます。 ghc-7.6.3では make は行なわず、いきなり sudo make install を行います。

haskell-platformのインストール

まずhaskell-platformのビルドに必要な gmp-devel、zlib-devel、freeglut-devel をインストールしておきます。

sudo apt-get install gmp-devel zlib-devel freeglut-devel

次に

tar xzf haskell-platform-2013.2.0.0.tar.gz
cd haskell-platform-2013.2.0.0

で展開および移動します。

このままではビルド時にエラーが出るため、 script/build.sh の69行目を

# GHC_PACKAGE_PATH="${ORIG_GHC_PACKAGE_PATH}" \

このようにコメントアウトします。

その後

./configure
make
sudo make install

でインストールします。

これでHaskell処理系がインストールされました。

cabalのアップグレード

次にcabal自体をアップグレードします。

システム全体で使用したいため、以下のようにオプションを付けてインストールします。

su
cabal update
cabal install cabal-install --global

これで現時点での最新版(1.22.6.0)が /usr/local 以下にインストールされます。

pandocのインストール

cabal-installと同様にシステム全体で使用したいため

su
cabal install pandoc --global

でインストールします。

以上です。

余談

pandoc vs. org-mode(Emacs)

ただし現時点でpandocを使用する機会はほとんどありません。 Emacsの org-mode で文章を作成し、(lualatexを使用して)直接PDFファイルに変換することが多いです。

xmonad vs. fluxbox

また、タイル型ウィンドウマネージャーの xmonad

su
cabal install xmonad --global
cabal install xmonad-contrib --global
cabal install xmobar --global

のようにしてインストールしてみました。評判はいいので少し使用してみましたが慣れません。個人的には fluxbox が好きなのでメニューなどをカスタマイズして常用しています。

uim-skkを導入するための設定

経緯

Emacs上で日本語を入力するためのシステムとして SKKを使用しています。

今回Emacs以外のアプリケーションでもSKKを使用するように設定したため、その際の設定をメモしておきます。

現在のVine Linux 6はuimのバージョンが1.6.1のため sticky-shiftが実現できないため、最新版(1.8.2)をインストールしました。

uimのインスール

uimの再ビルド

VineSeedからuim-1.8.6-2vl7.src.rpmをダウンロードし、 vbuilderでRPMパッケージを作成します。 vbuilderはあらかじめインストールしておきます。

sudo apt-get install vbootstrap
wget http://ftp.vinelinux.org/pub/Vine/apt/VineSeed/SRPMS.plus/uim-1.8.6-2vl7.src.rpm
sudo vbuilder --unionfs clean build build-rpm uim-1.8.6-2vl7.src.rpm

~/rpm/vbuilder/6/RPMS/以下のフォルダ(32bitと64bitで異なる)に rpmパッケージが作成されるため、必要なパッケージをインストールします。

自分でソースコードをダウンロードしてビルドしてもいいのですが、依存パッケージを自分の環境にインストールしなければならないことを考えると、 vbuilderを使用してビルドした方が良いと思います。

作成されたパッケージ

uim-1.8.6-2vl6.x86_64.rpm
uim-anthy-1.8.6-2vl6.x86_64.rpm
uim-devel-1.8.6-2vl6.x86_64.rpm
uim-el-1.8.6-2vl6.x86_64.rpm
uim-fep-1.8.6-2vl6.x86_64.rpm
uim-gtk-1.8.6-2vl6.x86_64.rpm
uim-gtk3-1.8.6-2vl6.x86_64.rpm
uim-kde-applet-1.8.6-2vl6.x86_64.rpm
uim-m17n-1.8.6-2vl6.x86_64.rpm
uim-mana-1.8.6-2vl6.x86_64.rpm
uim-qt-1.8.6-2vl6.x86_64.rpm
uim-qt4-1.8.6-2vl6.x86_64.rpm
uim-skk-1.8.6-2vl6.x86_64.rpm
uim-xim-1.8.6-2vl6.x86_64.rpm

作成されたパッケージのインストール

今回は

uim-1.8.6-2vl6.x86_64.rpm
uim-xim-1.8.6-2vl6.x86_64.rpm
uim-skk-1.8.6-2vl6.x86_64.rpm
uim-gtk-1.8.6-2vl6.x86_64.rpm  # uimの設定を行なうために必要
uim-gtk3-1.8.6-2vl6.x86_64.rpm # 同上(gtk3版)
uim-fep-1.8.6-2vl6.x86_64.rpm  # ターミナルなどで日本語入力するために必要

をapt-get installコマンドでインストールしました(必要に応じて依存パッケージが同時にインストールされます)。

uimの設定

uimの設定画面

uim-pref-gtk &

あるいは

uim-pref-gtk3 &

で設定画面を開き、各種設定を行います。

個人的な設定(主なもののみ)

  • 全体設定
    • 標準の入力方式:「直接入力」
    • 入力方式の一時切り換えキー:「”zenkaku-hankaku”」
  • SKK
    • 標準の入力モード:「ひらがな」
  • SKK辞書
    • 「辞書ファイルの代わりに辞書サーバを使用」:オン
      • (自分でパッケージ化しているので使用しないと)
    • 「個人辞書ファイル」:適度な場所を指定
  • SKKキー設定1
    • 「sticky」(sticky-shift):”Henkan_Mode”

uimをデフォルトの漢字変換システムにするための設定

GNOMEでは「システムメニュー」から、「設定」→「ユーザ向け」→「漢字変換システムの選択」を実行し、「uim」を選択します。ログアウトして再ログインすると使用できるようになります。

fluxboxでの設定方法は分かりませんでした。コマンドが分かれば可能なのですが。

【追記】 vutils-guiパッケージに含まれるコマンドを使用して

gsetime &

で設定画面が出ることが分かりました。

uimを自動起動するための設定

GNOMEの場合

自動起動するアプリケーションに

uim-toolbar-gtk-systray

あるいは

uim-toolbar-gtk3-systray

を追加します。

fluxboxの場合

~/.fluxbox/startup

uim-toolbar-gtk-systray &
uim-toolbar-gtk &

あるいは

uim-toolbar-gtk3-systray &
uim-toolbar-gtk3 &

を追加します。

z + spaceで全角スペースを入力するための設定

今回は http://makenowjust.hatenablog.com/entry/2014/08/10/233424 の内容を参考にしました。

以下の内容で ~/.uim を作成します。文字コードはEUC-JPです。

(define uim-pref-suppress-dot-uim-warning-dialog? #t)

(require-module "skk")

(define skk-ja-rk-rule
  (append '(
            ((("z" " ") . ()) (" " " " " "))
            )
          skk-ja-rk-rule))

Firefoxで入力ができない場合の設定

~/.bash_profile

export GTK_IM_MODULE=uim firefox

を追加します。

他の候補:fcitx-skk

現時点でのVineSeedではfcitxがインストールされているため fcitx-skkを自分でビルドして試しました。

しかし、

  • 漢字変換後に確定する場合にテンキーを使用しなければならない
  • sticky-shiftが使用できない

という欠点があったため uim-skkの方が良いと感じました。

Emacsでddskkパッケージを使用し、さらにcdb形式の辞書ファイルを自作するための設定

経緯

Emacsで日本語入力をする際にSKKを使用しています。最近、 package.elで導入するSKK でddskkがMELPAに登録されたことを知ったため、インストールしてみました。

従来の方法よりも楽になりました。

  • 辞書ファイルの統合
  • 辞書サーバの設定

も行なったので、その時の内容をメモ的に残しておきます。

ddskkパッケージ

dskkパッケージのインストール

MELPAを使用する方法は省略します。

M-x package-refresh-contents
M-x package-install ddskk

でインストールします。同時にcccとcdbの2つのパッケージもインストールされます。

init.elの設定

(require 'skk)

(global-set-key (kbd "C-x C-j") 'skk-mode)
;; (global-set-key "\C-xj" 'skk-auto-fill-mode) ;; 改行を自動入力する場合
;; (global-set-key "\C-xt" 'skk-tutorial)       ;; チュートリアル
(setq default-input-method "japanese-skk")

(setq skk-user-directory "~/Dropbox/emacs/SKK") ;; 設定ファイル、個人辞書ファイルの置き場
(setq skk-init-file "~/Dropbox/emacs/SKK/init") ;; 設定ファイルの指定

を追加します。

initの設定

使用する辞書ファイルをいくつか統合してさらにcdb化し、 SKK-JISYO.my.cdb というファイル名にしています。そこまで必要なければ SKK-JISYO.L でいいと思います。

;; -*-mode: emacs-lisp; -*-

;;; 使用する辞書の設定
;; large辞書
(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")
;; 個人辞書
(setq skk-jisyo "~/Dropbox/emacs/SKK/skk-jisyo")
(setq skk-backup-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.bak")

;; From DDSKK 14.2:
;;   メイン辞書(L 辞書、CDB 形式辞書、辞書サーバ)以外の辞書を指定する
(setq skk-extra-jisyo-file-list
      (list
       '("/usr/local/share/skk/SKK-JISYO.JIS3_4" . euc-jisx0213)
       ))

;; 変換記録を保存するファイル名
(setq skk-record-file "~/Dropbox/emacs/SKK/record")

;;; 外見の変更
;; モードラインに色をつける設定
(setq skk-use-color-cursor t)
(setq skk-indicator-use-cursor-color t)

;; 変換候補のハイライトの設定
(setq skk-henkan-face (skk-make-face 'gray80/gray25)) ;; お好みで

これで使用できるようになったため、今までのddskkをアンインストールしました(make uninstallは用意されていないため自力で削除)。

辞書ファイルの用意

辞書ファイルの統合

統合したい辞書ファイルを用意して同じフォルダに入れ、

skkdic-expr2 \
    SKK-JISYO.JIS2 + \
    SKK-JISYO.L + \
    SKK-JISYO.assoc + \
    SKK-JISYO.edict + \
    SKK-JISYO.geo + \
    SKK-JISYO.itaiji + \
    SKK-JISYO.jinmei + \
    SKK-JISYO.law + \
    SKK-JISYO.office.zipcode + \
    SKK-JISYO.propernoun + \
    SKK-JISYO.station + \
    SKK-JISYO.zipcode | skkdic-sort > SKK-JISYO.my

のようなスクリプトを実行すると SKK-JISYO.my が生成されるため、 /usr/local/share/skk にコピーします(今回のようにcdb形式の辞書ファイルを使用する場合には不要)。

skkdic-expr2

私が使用しているVine Linuxでは skktoolsをインストールしても skkdic-expr2 コマンドが導入されなかったため少しだけ大変でした。

結果だけ書くと、メーリングリストで許可を得た上でパッケージを更新することで対処しました。

SPECファイルに

BuildRequires: glib2-devel

の行を追加することで skkdic-expr2 がビルドされるようになりました。

cdb形式の辞書の作成

このためにはパッケージを自分でインストールする必要があります。

tinycdb

tinycdb は辞書サーバであるdbskkd-cdbをビルドするために必要なプログラムです。 cdb形式の辞書を作成するためには、この中に含まれる cdb が必要です。

wget http://www.corpit.ru/mjt/tinycdb/tinycdb-0.78.tar.gz
tar xzf tinycdb-0.78.tar.gz
cd tinycdb-0.78
make
sudo make install

dbskkd-cdb

dbskkd-cdb は辞書サーバの1つです。

この中に含まれるスクリプトを改変して使用します。

  • skktocdbm.sh
    #!/bin/sh
    # Converting SKK Dictionary to cdbmake-acceptable form
    # Originally by D. J. Bernstein's 12tocdbm.sh
    # modified by Kenji Rikitake
    # bugfix of truncated strings by Hideto Kihara
    # bugfix of locale by Tatsuya Kinoshita
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    '
    
  • makeskkcdb.sh
    #!/bin/sh
    ./skktocdbm.sh < /usr/local/share/skk/SKK-JISYO.L | \
      cdb -c -t - SKK-JISYO.L.cdb
    
  • skktocdb

    上の2つのスクリプトを組み合せて作成したのが以下のスクリプトです。

    #!/bin/sh
    
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    ' $1 | cdb -c -t - $1.cdb
    

    実行権限をつけて/usr/local/binにコピーしました。

    skktocdb SKK-JISYO.my
    

    のように使用すると同じフォルダに SKK-JISYO.my.cdb が作成されます。

    このファイルを/usr/local/share/skkにコピーします。これで自作の辞書ファイルを使用できるようになります。

辞書サーバを使用する場合

この場合には、initファイルの

(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")

の記述は必要ありません。

先日、Vine Linuxの dbskkd-cdb パッケージを更新しました。

EAGLE 雑記 の内容を参考にして任意の辞書ファイルを指定することができるように改変しました。

/etc/xinetd.d/dbskkd-cdbの例

# default: on
# description: dbskkd-cdb is a skkserv implementation, \
#              a Japanese dictionary server for the Simple Kana to \
#              Kanji conversion program.
service skkserv
{
    port = 1178
    socket_type = stream
    wait = no
    only_from = 127.0.0.1
    user = nobody
    server = /usr/sbin/dbskkd-cdb
    # specify dictionary path
    server_args = /usr/local/share/skk/SKK-JISYO.my.cdb
    log_on_failure += USERID
    disable = no
}

変更後は

sudo /etc/init.d/xinetd restart

でxinet.dを再起動すれば辞書サーバでSKKを使用できるようになります。

Emacsで使用するSKKの辞書の文字コードをutf-8にする(→ EUC-JPに戻しました)

経緯

始めてコメントを頂きました

前回、 SKKの辞書に機種依存文字(丸文字や全角ローマ字)を追加するために「Emacsで使用するSKKの辞書の文字コードをutf-8にする」方法を紹介しました。

すると、「SKK-JISYO.JIS3_4 には、あらかじめ丸文字や全角ローマ字などが登録されています。」とのコメントを頂きました。

SKK-JISYO.JIS3_4の中身

そこで辞書ファイルSKK-JISYO.JIS3_4の中身を調べてみると、文字コードはEUC-JPであり、その中には

(1) /①/❶/⓵/
(2) /②/❷/⓶/
(3) /③/❸/⓷/
(4) /④/❹/⓸/
(5) /⑤/❺/⓹/
(6) /⑥/❻/⓺/
(7) /⑦/❼/⓻/
(8) /⑧/❽/⓼/
(9) /⑨/❾/⓽/
(10) /⑩/❿/⓾/
(11) /⑪/⓫/
(中略)
(50) /㊿/

1 /①;(1)/❶;(1)/⓵;((1))/ⅰ;[ローマ数字]/Ⅰ;[ローマ数字]/¹;^1/
2 /②;(2)/❷;(2)/⓶;((2))/ⅱ;[ローマ数字]/Ⅱ;[ローマ数字]/²;^2/
3 /③;(3)/❸;(3)/⓷;((3))/ⅲ;[ローマ数字]/Ⅲ;[ローマ数字]/³;^3/弎/
4 /④;(4)/❹;(4)/⓸;((4))/ⅳ;[ローマ数字]/Ⅳ;[ローマ数字]/
5 /⑤;(5)/❺;(5)/⓹;((5))/ⅴ;[ローマ数字]/Ⅴ;[ローマ数字]/
6 /⑥;(6)/❻;(6)/⓺;((6))/ⅵ;[ローマ数字]/Ⅵ;[ローマ数字]/
7 /⑦;(7)/❼;(7)/⓻;((7))/ⅶ;[ローマ数字]/Ⅶ;[ローマ数字]/
8 /⑧;(8)/❽;(8)/⓼;((8))/ⅷ;[ローマ数字]/Ⅷ;[ローマ数字]/
9 /⑨;(9)/❾;(9)/⓽;((9))/ⅸ;[ローマ数字]/Ⅸ;[ローマ数字]/
10 /⑩;(10)/❿;(10)/⓾;(10)/ⅹ;[ローマ数字]/Ⅹ;[ローマ数字]/
11 /⑪;(11)/⓫;(11)/ⅺ;[ローマ数字]/Ⅺ;[ローマ数字]/
12 /⑫;(12)/⓬;(12)/ⅻ;[ローマ数字]/Ⅻ;[ローマ数字]/

のように目的とする文字が登録されていました(順序を変更しています)。

設定

そこで辞書ファイルの文字コードをデフォルトのEUC-JPに戻し、以下の設定を加えました。

SKK-JISYO.JIS3_4のダウンロード

http://openlab.ring.gr.jp/skk/skk/dic/SKK-JISYO.JIS3_4 からダウンロードしました。

wget http://openlab.ring.gr.jp/skk/skk/dic/SKK-JISYO.JIS3_4
sudo cp SKK-JISYO.JIS3_4 /usr/local/share/skk

で辞書ファイルを所定の場所にコピーしました。

.emacs.elの設定(こちらは前回と同じ)

職場および自宅で同じ環境になるようにするために、辞書 ~/Dropbox/emacs/SKK に置いています。

(require 'skk-autoloads)
(global-set-key "\C-x\C-j" 'skk-mode)
;; (global-set-key "\C-xj" 'skk-auto-fill-mode)
;; (global-set-key "\C-xt" 'skk-tutorial)

(defvar skk-user-directory)
(setq skk-user-directory "~/Dropbox/emacs/SKK")

(require 'sticky)
(use-sticky-key 'henkan sticky-alist:ja)

initファイルの設定

~/Dropbox/emacs/SKK/initファイルの設定です。

ここでは別の辞書ファイルSKK-JISYO.JIS2も追加しています。

;; 使用する辞書の設定
(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.L.cdb")
(setq skk-large-jisyo "/usr/local/share/skk/SKK-JISYO.L")

(setq skk-jisyo "~/Dropbox/emacs/SKK/skk-jisyo")
(setq skk-backup-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.bak")

;; From DDSKK 14.2:
;;   メイン辞書(L 辞書、CDB 形式辞書、辞書サーバ)以外の辞書を指定する
(setq skk-extra-jisyo-file-list
  (list
      "/usr/local/share/skk/SKK-JISYO.JIS2"
      '("/usr/local/share/skk/SKK-JISYO.JIS3_4" . euc-jisx0213)
))

実行

これでうまくいきました。

辞書ファイルについて教えて頂いたaさん。ありがとうございました。

Emacsで使用するSKKの辞書の文字コードをutf-8にする

経緯

Emacs上で日本語入力をする際に SKK(現時点ではddskk-15.2)を使用しています。ただし文字コードがEUC-JPのため機種依存性文字(丸文字や全角ローマ字など)を登録することができませんでした。

そこでSKKで使用する辞書をutf-8化したので、その際の内容をメモしておきます。

設定

.emacs.elの設定

職場および自宅で同じ環境になるようにするために、辞書 ~/Dropbox/emacs/SKK に置いています。

(require 'skk-autoloads)
(global-set-key "\C-x\C-j" 'skk-mode)
;; (global-set-key "\C-xj" 'skk-auto-fill-mode)
;; (global-set-key "\C-xt" 'skk-tutorial)

(defvar skk-user-directory)
(setq skk-user-directory "~/Dropbox/emacs/SKK")

(require 'sticky)
(use-sticky-key 'henkan sticky-alist:ja)

ちなみに下2行は「変換」キーをsticky keyに割り当てるための設定です。 stickyパッケージをあらかじめインストールしておく必要があります。

initファイルの設定

辞書フォルダの作成(移動)

~/Dropbox/emacs/SKKに辞書ファイルやinitファイル(設定ファイル)を移動させます(すでにその場所にフォルダがある場合には省略)。

cd ~/Dropbox/emacs/SKK
nkf -w -Lu /usr/local/share/skk/SKK-JISYO.L > SKK-JISYO.L.utf8
nkf -w -Lu .skk-jisyo > skk-jisyo.utf8

で文字コードをutf-8に変換して先程のフォルダに配置します。実際に使用する辞書ファイルすべてをこのように utf-8に変更します。

辞書ファイル名の設定

initファイルの内容を以下のように変更します。

(setq skk-jisyo-code 'utf-8)

;; 使用する辞書の設定
(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.L.cdb")
(setq skk-large-jisyo "~/Dropbox/emacs/SKK/SKK-JISYO.L.utf8")

(setq skk-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.utf8")
(setq skk-backup-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.utf8.bak")

cdb形式の辞書を使用していない場合には skk-cdb-large-jisyo の設定はコメントアウトします。

また今回は、隠しファイルにする必要がないため個人辞書のファイル名の先頭のピリオドを削除しています。

辞書ファイルの設定

辞書ファイルへの単語の追加

以下のように個人辞書ファイルに単語を追加します(途中省略)。

1 /①/1/Ⅰ/
2 /②/2/Ⅱ/
3 /③/3/Ⅲ/
4 /④/4/Ⅳ/
5 /⑤/5/Ⅴ/

この場合にはSKKを使用できないため、 mozc で変換して個人辞書ファイルにコピーしました。

参考にした内容

今回の内容は、 http://openlab.ring.gr.jp/skk/skk/main/etc/dot.skk

;; 個人辞書の文字コードを指定する
;; (setq skk-jisyo-code 'utf-8)
;; 注) この設定は気をつけないと辞書の検索ができなくなりますので十分理
;;   解してから行ってください。 `skk-jisyo-code' は個人辞書の読み書きの
;;   他、L 辞書などの読み込みコードも決めている影響力の強い変数です。
;;   この設定をした場合は、まず個人辞書を上記のコードに変換しなければ
;;   いけません。その上で、さらに以下のいずれかの対処をする必要があり
;;   ます。
;;
;; 方針 1) Emacs のバッファに読み込む辞書を全て `skk-jisyo-code' と同じ
;;         文字コードに変換する

の部分を参考にしました。

org-modeのBeamerクラスのフレームの縦位置を中間ではなく上に固定する

経緯

org-modeのBeamerクラスの欠点

先の記事 でorg-modeのBeamerクラスでスライドを作成するための設定を行いましたが、実は不満が残っていました。それは

  • フレームの縦位置が中央にきてしまう

ことでした。

サンプルファイルとして

#+TITLE: Sample
#+AUTHOR: Toshiaki Ara
#+OPTIONS: H:1 toc:nil
#+LATEX_CLASS: beamer
#+BEAMER_THEME: Madrid

* Frame
** block
+ contents 1
+ contents 2

を用意し、PDFファイルに変換するとこのような感じになります。

test_nul.png

これではスライドを進めていくたびにフレームの始まる位置が異なるため、見る方としては非常につらいです(個人の感想です)。

これを何とか上に固定したいと思い、 ox-beamer のソースコードを調べました。

結論

init.elに

(setq org-beamer-frame-default-options "t")

を追加することでフレームの縦位置が上に固定されるようになりました。

test_t.png

ただし、これでは各ファイルごとの設定ができません。 orgファイルのオプションで設定できる方法があればいいのですが。

それでも、 org-modeによる簡単な記述でこれほど見栄えのよいスライドが作成できるので、積極的に使用したいと思います。 org-modeは見出しレベルで折り畳みできるのが気に入ってます。

ox-beamer.elの解析

先に結論だけを書いたので、次にこの結論に至った経緯を簡単に書きます。

org-beamer–format-frame関数の発見

まずox-beamer.elの中でフレームを定義している関数を探しました。するとすぐにorg-beamer–format-frameが見つかりました。

少し長いですが、ox-beamer.elに書かれている org-beamer–format-frameの関数定義を下に示します。

見やすくするためにタブを空白に変換し、さらに C-M-q でコードを整形しています。

すると26行目に

(org-split-string org-beamer-frame-default-options ",")

という記述がありました。これは org-beamer-frame-default-options という変数に含まれているリストを,で区切った文字列として返す関数であると予想しました。

M-: org-beamer-frame-default-options

で変数の中身を調べると””でした(何も定義されていない)。

そこでフレームを上に固定するためのオプションである”t”を設定したところ希望通りの結果が得られました。

org-beamer–format-frameの関数定義

(defun org-beamer--format-frame (headline contents info)
  "Format HEADLINE as a frame.
CONTENTS holds the contents of the headline.  INFO is a plist
used as a communication channel."
  (let ((fragilep
         ;; FRAGILEP is non-nil when HEADLINE contains an element
         ;; among `org-beamer-verbatim-elements'.
         (org-element-map headline org-beamer-verbatim-elements 'identity
                          info 'first-match)))
    (concat "\\begin{frame}"
            ;; Overlay specification, if any. When surrounded by
            ;; square brackets, consider it as a default
            ;; specification.
            (let ((action (org-element-property :BEAMER_ACT headline)))
              (cond
               ((not action) "")
               ((string-match "\\`\\[.*\\]\\'" action )
                (org-beamer--normalize-argument action 'defaction))
               (t (org-beamer--normalize-argument action 'action))))
            ;; Options, if any.
            (let* ((beamer-opt (org-element-property :BEAMER_OPT headline))
                   (options
                    ;; Collect options from default value and headline's
                    ;; properties.  Also add a label for links.
                    (append
                     (org-split-string org-beamer-frame-default-options ",") ;; <= ココ
                     (and beamer-opt
                          (org-split-string
                           ;; Remove square brackets if user provided
                           ;; them.
                           (and (string-match "^\\[?\\(.*\\)\\]?$" beamer-opt)
                                (match-string 1 beamer-opt))
                           ","))
                     ;; Provide an automatic label for the frame
                     ;; unless the user specified one.
                     (unless (and beamer-opt
                                  (string-match "\\(^\\|,\\)label=" beamer-opt))
                       (list
                        (format "label=%s"
                                (org-beamer--get-label headline info)))))))
              ;; Change options list into a string.
              (org-beamer--normalize-argument
               (mapconcat
                'identity
                (if (or (not fragilep) (member "fragile" options)) options
                  (cons "fragile" options))
                ",")
               'option))
            ;; Title.
            (let ((env (org-element-property :BEAMER_ENV headline)))
              (format "{%s}"
                      (if (and env (equal (downcase env) "fullframe")) ""
                        (org-export-data
                         (org-element-property :title headline) info))))
            "\n"
            ;; The following workaround is required in fragile frames
            ;; as Beamer will append "\par" to the beginning of the
            ;; contents.  So we need to make sure the command is
            ;; separated from the contents by at least one space.  If
            ;; it isn't, it will create "\parfirst-word" command and
            ;; remove the first word from the contents in the PDF
            ;; output.
            (if (not fragilep) contents
              (replace-regexp-in-string "\\`\n*" "\\& " (or contents "")))
            "\\end{frame}")))

このコードはGNU Emacsの一部であるため GNU General Public Licenseが適用されています。

org-modeのBeamerクラスでlualatexを使用してPDFファイルを作成する

経緯

全てではありませんが、講義用のスライドをLaTeXのBeamerクラスで作成しています。

以前は platex -> dvipdfmx の順でPDFファイルを作成していましたが、現在は lualatex を使用して直接PDFファイルを作成しています。

  • 利点
    • PDF形式の図を直接挿入できる
    • フォントの扱いが楽(個人的な感想)

今までは使用していませんでしたが Emacsのorg-modeからBeamerクラスの形式で出力できるため、 lualatexを使用してPDFファイルを作成できるように設定しました。その時のメモです。

うまくいきそうなので今後はorg-modeで原稿を作成していきたいと思いました。

ちなみに Beamerクラスだけではなく通常のltjsarticleでも可能でした。

init.elに追加する設定

Beamer用

LaTeXで使用するクラスファイルおよびパッケージ

Beamerクラスを使用するための個人的設定です。デフォルトの設定ではもっと多くのパッケージを使用しているため個人的に必要だと思うものだけを含めています。

この中でlualatexを使用する上で必須なのは

です。これがないと日本語が使用できません。プロジェクトの皆様には感謝でいっぱいです。

%%Fontsは個人の好みです。

  • 数式フォント:TeX Gyre Termes(Times系)
  • セリフ体:TeX Gyre Termes
  • サンセリフ体:TeX Gyre Heros(Helvetica系)
  • 日本語:IPAexゴシック

を使用するように設定しています。

(require 'ox-beamer)

(add-to-list 'org-latex-classes
             '("beamer"
               "\\documentclass[presentation]{beamer}
[NO-DEFAULT-PACKAGES]
\\usepackage{luatexja}
\\usepackage{textcomp}
\\usepackage{graphicx}
% \\usepackage{booktabs}
\\usepackage{longtable}
\\usepackage{wrapfig}
\\usepackage{hyperref}
\\hypersetup{pdfencoding=auto, linkbordercolor={0 1 0}}
%% Fonts
% mathematical font
\\usepackage{fontspec}
\\usepackage{amsmath, amssymb}
\\usepackage{qtxmath}    % Times (Gyre Termes)
% English
\\setmainfont[BoldFont=TeXGyreHeros, Ligatures=TeX]{TeXGyreTermes}  %Times
\\setsansfont[Ligatures=TeX]{TeXGyreHeros}                          % Helvetica
% Japanese
\\usepackage{luacode}
\\usepackage{luatexja-otf}
\\usepackage[ipaex]{luatexja-preset}
\\renewcommand{\\kanjifamilydefault}{\\gtdefault}
%%
\\setbeamercovered{transparent}
\\setbeamertemplate{navigation symbols}{}"
  ("\\section{%s}" . "\\section*{%s}")
  ("\\subsection{%s}" . "\\subsection*{%s}")
  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
  ("\\paragraph{%s}" . "\\paragraph*{%s}")
  ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

変換エンジンとしてlualatexを使用するための設定

org-latex-で始まるコマンドを調べたところ org-latex-pdf-process が該当しました。

(setq org-latex-pdf-process
      '("lualatex --draftmode %f"
        "lualatex %f"))

と設定することで lualatexを使用するように変更できました。

lualatexを2回使用している理由は

  • 相互参照
  • ページ数および見出しの確定

です。 lualatexを1回しか使用しない場合には総ページ数が正しく表示されず、見出しも空欄のままでした。 **.tocなどの中間ファイルが必要なのに 自動的に削除するのがその理由のようです。

とりあえずこれで直接PDFファイルに変換できるようになりました。今後微調整が必要かもしれませんがこれで試したいと思います。

ltjsarticle用

スライドではなく通常の書類を作成する場合には ltjsarticleクラスを使用します(むしろこちらの方が頻度が高い)。

LaTeXで使用するクラスファイルおよびパッケージ

以下設定です。

(require 'ox-latex)

(add-to-list 'org-latex-classes
             '("ltjsarticle"
               "\\documentclass[12pt,a4paper]{ltjsarticle}
[NO-DEFAULT-PACKAGES]
\\usepackage{amsmath}
% \\usepackage{newtxtext,newtxmath}
\\usepackage{textcomp}
\\usepackage{graphicx}
\\usepackage{booktabs}
\\usepackage{longtable}
\\usepackage{wrapfig}
\\usepackage{hyperref}
\\hypersetup{pdfencoding=auto}"
  ("\\section{%s}" . "\\section*{%s}")
  ("\\subsection{%s}" . "\\subsection*{%s}")
  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
  ("\\paragraph{%s}" . "\\paragraph*{%s}")
  ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

デフォルトのドキュメントクラスとしてltjsarticleを使用するための設定

デフォルトではarticleクラスが選択されます。

そこで

(setq org-latex-default-class "ltjsarticle")

とするとltjsarticleがデフォルトで選択されるようになります。

先ほどのorg-latex-pdf-processの設定で lualatexが使用されるようになっています。