2016アーカイブ

Vine LinuxのRでR commanderを使用できるように変更

VineSeedのRではR commanderを使用することができましたが、 Vine Linux 6では使用することができませんでした。

R commanderを使用するためには tcl-8.5/tk-8.5 が必要なのですが、 Vine Linux 6ではバージョンが8.4だったためです。

そこでtcl85/tk85パッケージを作成することで R commanderを使用することができるようになりました。

※ただし、現状の6.3ではproposed-updatesを適用する必要があります。 6.5βではそのままで使用できます。

sudo apt-get install apt-sourceslist-proposed-updates # 6.3の場合に必要
sudo apt-get update
sudo apt-get install R

これで使用者が少しでも増えるといいです(願望)。

anything-swoopを使用するための設定

経緯

Emacsでanythingを使用しています(helmをあまり使用したくないため)。

現在、ace-isearch を使用していますが、この設定では6文字以上の検索でhelm-swoopを使用してしまいます。

anything-swoopを公開している方を見つけたので、 ace-isearchからanything-swoopを使用するように設定しました。

手順

cmigemoの設定

;; cmigemo: https://github.com/kron/cmigemo

(require 'migemo)
(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs"))

;; Set your installed path
(setq migemo-dictionary (expand-file-name "/usr/share/migemo/utf-8/migemo-dict"))
;; 辞書の場所に合わせて適切に変更

(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
;; migemoを起動する
(load-library "migemo")
(migemo-init)

;; キャッシュの設定
(setq migemo-use-pattern-alist t)
(setq migemo-use-frequent-pattern-alist t)
(setq migemo-pattern-alist-length 1024)

anything-swoopのダウンロード

このページ からanything-swoop.elをダウンロードしてパスの通った場所に保存する。

ace-searchからanything-swoopを使用するための設定

(require 'ace-isearch)
(custom-set-variables '(ace-isearch-function-from-isearch 'anything-swoop-from-isearch))
(custom-set-variables '(ace-isearch-fallback-function 'anything-swoop-from-isearch))
(global-ace-isearch-mode 1)

以上の設定でanything-swoopを使用することができます。

ワード、エクセル、PDFなどのファイルをテキスト形式として書き出す

経緯

Microsoft Wordのファイル(doc/docx)やopendocument(odt)、 PDFファイルの内容を確認する際に、これらのアプリケーションを開かなくてもすむようにテキスト形式に変換してくれるアプリケーションがあります(antiword, pandoc, pdftotext)。

ただし、

  • doc形式のファイルはantiword
  • docx形式のファイルはpandoc
  • pdfファイルはpdftotext

のようにすべてアプリケーションが異なり、しかも使用オプションも異なります。

そこでこれらのコマンドを1つにまとめてみました。

同時にMicrosoft Excelのファイル(xls/xlsx)やopendocument(ods)もテキスト形式に変更できるようにしてみました。

内容

必要なアプリケーション

  • antiword (doc)
  • pandoc (docx, odt, html)
  • pdftotext (pdf)
  • gnumeric (xls, xlsx, ods => html)
  • w3m (xls, xlsx, ods)

上2つのアプリケーションについては Vine Linux用のrpmパッケージを自分自身で作成してアップロードしています。

シェルスクリプト

GitHub で公開しています。

基本的にファイルの拡張子で分岐し、標準出力に出力するようにしているだけです。

新たなファイルに保存するのは使い勝手が悪いと感じたため標準出力に表示するようにしています。

#!/bin/sh
# require pdftotext (pdf)
# require antiword (doc)
# require pandoc (docx/odt/html/tex)
# require gnumeric and w3m (xls/xlsx)

set -e

if [ $# -eq 0 ]; then
  echo "Need argument(s): pdf, doc(x), xls(x) or ... file(s)" 1>&2
  exit 1
fi

for i in $*
do
    if [ -f ${i} ]
    then
       ext="${i##*.}"
       case $ext in
           pdf) pdftotext -raw ${i} - ;;
           doc) LANG=ja_JP.utf8 antiword -w 0 ${i} ;;
           docx|odt|html|htm|tex) pandoc -t plain ${i} ;;
           xls|xlsx|ods) tmpfile=$(mktemp).html ;
                         ssconvert -T Gnumeric_html:xhtml ${i} ${tmpfile} 2> /dev/null ;
                         w3m -dump ${tmpfile} ;
                         rm -f ${tmpfile} ;;
           *)    ;;
       esac
    fi
done

doc

Emacs上で antiword を使用したときに”LANG=ja_JP.utf8″ をつけないと文字化けしたため、環境変数を一時的に設定しています。

docx/odt/html/htm/tex

pandoc の機能をそのまま使用しているだけなので、必要に応じて対応している形式を追加すればいいです。

xls/xlsx/ods

今回苦労したのがこれらのスプレッドシートです。

調べていると gnumeric に含まれる ssconvert というコマンドで html形式に変換できることが分かったため、それを使用しました。 html形式に変換した後に w3m の-dumpオプションでテキスト形式に変換しています。

pandocでhtmlをテキスト形式に変換すると表のレイアウトが崩れてしまったため、今回はw3mを使用しています。

使用法

実行権限をつけて

convertdoc file1 file2 ...

のようにすると、全てのファイルがつながって標準出力に表示されます。

存在しないファイルおよび対応していないファイルは無視されます。エラーも出ないようにしています。

応用

以下のようなelispスクリプトを書き、 M-x my-convertdoc の後に開きたいファイルを選択するとファイルの内容を確認することができます。

Emacs上でMewを使用しており、添付ファイルの内容を確認したかったというのがそもそもの始まりです。

添付ファイルを保存してから M-x my-convertdoc コマンドを実行しなければならないため手間はかかりますが、それでも楽になりました。

elispスクリプト

(defvar my-convertdoc-command "convertdoc")
(defvar my-convertdoc-defaultdir "~/ramdisk/") ;; デフォルトのフォルダ(任意の場所)

(require 'f)

(defun my-convertdoc (file)
  (interactive
   (list (read-file-name "Input file name: "
                         my-convertdoc-defaultdir nil t)))
  (my-convertdoc-file file))

(defun my-convertdoc-file (file)
  (let ((filename (shell-quote-argument (f-expand file)))
        (buf "*ConvertDoc*")
        (resize-mini-windows nil))
      (shell-command
       (format "%s %s" my-convertdoc-command filename) buf)
      (with-current-buffer buf
        (view-mode))))

カスタムメニューの内容をpecoで選択するためのスクリプトを作成

経緯

以前はfluxboxを使用しており、右クリックでメニューが出てきました。そのメニューはファイルを書き換えることでカスタマイズできました。

現在xmonadに移行しており、いくつかのキーにアプリケーションを割り当てています。

割り当てるアプリケーションが多くなると覚えるのが大変なので、カスタマイズできるメニューがないかと探していたのですが見つかりませんでした(探し方が悪いため?)。

そこで自分でスクリプトを書きました。慣れていないので多少時間はかかりました。

内容

Rubyスクリプト

GitHub で公開しています。

#!/usr/bin/env ruby
# coding: utf-8

# peco binary
PECO = File.expand_path "/usr/bin/peco"

# terminal emulator (xterm/urxvt/mlterm)
XTERM = "mlterm"

# menu list
menufile = File.expand_path "~/.mymenu"


require 'tempfile'

class MyMenu
  def initialize(menufile)
    @menufile = menufile
    @appfilepath = Tempfile.new("tmpnew").path
    @hash = Hash.new
  end

  protected

  def set_hash_and_list
    io1 = File.open(@menufile, "r")     # filelist
    io2 = File.open(@appfilepath, "w")  # list of application name

    io1.each {|line|
      line.strip!
      line.chomp!
      next if line == "" || (/^#/ =~ line)

      rows = line.split(/,/)
      rows[1] = rows[0] if rows[1].nil?
      @hash.store(rows[0], rows[1])
      io2.puts rows[0]
    }
    io1.close
    io2.close
  end

  def exec_peco
    out = Tempfile.new("peco-out")
    err = Tempfile.new("peco-err")
    system "#{XTERM} -e sh -c '#{PECO} #{@appfilepath} > #{out.path} 2> #{err.path}'"

    res = `cat #{out.path}`
    if res != ""
      app = @hash[res.chomp!]
      system("#{app} &")
    end
  end

  public

  def exec_MyMenu
    self.set_hash_and_list
    self.exec_peco
  end
end


mymenu = MyMenu.new(menufile)
mymenu.exec_MyMenu

このスクリプトの後半はるびきち様が公開している peco を参考にさせて頂きました。というよりもそのまま使用させて頂きました。

設定

mymenu.rb

XTERM に使用したいターミナルエミュレーターを指定します。

  • xterm/urxvt/mlterm であれば大丈夫でした。
  • gnome-terminal/lxterminal は失敗しました。

~/.mymenu

~/.mymenu を作成し、以下のように記載します。 このファイルが存在しないとエラーが出ます。

FD, gnome-terminal -e fd
R, lxterminal -e R
leafpad

メニューに表示したい内容と実行するコマンドをカンマで区切って記載するだけです。

  • カンマの左側に記載した内容がメニューに表示されます。
  • カンマの右側に記載した内容が実行されます。
    • 省略した場合には左側の内容がそのままコマンドとして実行されます。
    • ターミナルで実行したい場合には “(使用したいターミナル) -e (実行したいコマンド)” のように記載します。

使用法

mymenu.rbを好きなキーに割り当てます。

あとは好きなように絞り込みをするだけです。

Hit-a-Hint の設定をしておけば、「@」を押した後に候補の左端に表示されている文字を打ち込むことで即座に選択できるようになります。

xmonadでmagitを使用してコミット後に画面が固まったように見えたら

Emacsでmagitを使用しています。

ウィンドウマネージャとしてxmonadを使用し始めてからコミット時に画面が固まったようになりました。

このような場合には、ワークスペースを切り換えてから戻すと元のmagitの画面に戻ります。

(解決法が見つかったのですが偶然です)

xmobarのステータスバー上に新着メール数を表示する

経緯

これまではconkyで、自宅、職場、Gmailの新着メール数を表示させていました。

タイル型ウィンドウマネージャであるxmonadに移行する場合、 conkyの表示か隠されてしまうため使いにくいです。そこでステータスバーであるxmobar上に新着メール数を表示することができるようになったため、その方法をメモしておきます。

方法

xmobarにテキストを渡せばその通りに表示してくれるため、「新着メール数を含む文字列」を表示するスクリプトを作成しました。

checkmail.rbスクリプト

GitHub にスクリプトを置いています。

サーバ名、ユーザ名、パスワードを各個人の設定に合わせて変更します。この時、” “ではなく’ ‘で囲んだ方がいいです ” “で囲んだ場合、@があるとうまくいかないためです(\@とすればOK)。

使用方法は説明がなくても分かると思います。第4引数は、POP3であれば”pop3″、GmailなどのIMAPであれば”imap”を指定します。

最終行で文字列を表示させるので自由に変更します。

#!/usr/bin/env ruby
# coding: utf-8

require 'net/pop'
require 'net/imap'

$server1 = '******'
$name1 = '******'
$pass1 = '******'

$server2 = 'imap.gmail.com'
$name2 = '******@gmail.com'
$pass2 = '******'

########################################
# function
########################################

def get_n_mail (server, name, pass, connect)
  case connect
  when "pop3"
    pop = Net::POP3.new(server, 110)
    pop.start(name, pass)
    n = pop.n_mails
    pop.finish
    return n
  when "imap"
    imap = Net::IMAP.new(server, 993, true)
    imap.login(name, pass)
    imap.select('INBOX')
    search_criterias = ['UNSEEN']
    n = imap.search(search_criterias).length
    imap.logout
    imap.disconnect
    return n
  else
    # do nothing
  end
end


########################################
# get numbers of mail
########################################

n1 = get_n_mail($server1, $name1, $pass1, "pop3")
n2 = get_n_mail($server2, $name2, $pass2, "imap")


########################################
# Result
########################################

printf "mail1:%d/mail2:%d", n1, n2

なぜRubyでスクリプトを作成したのかというと、

require 'net/pop'
require 'net/imap'

でPOP3とIMAPの両方を扱えることが分かったからです。

※ただしVine Linux 6のRubyのバージョンが古く(1.8.7)このままではエラーが出るため、 ruby-opensshパッケージをインストールする必要がありました。

sudo apt-get install ruby-openssh

ただし、これとは別にRuby-2.2.0をインストールしているのですが、この場合は新たにパッケージをインストールしなくても動作しました。

.xmobarrcの設定

先程のcheckmail.rbを ~/.xmonad/ に置きます(場所は任意)。

commandsの所に

,Run Com ".xmonad/checkmail.rb" ["&"] "mail" 3000

を追加し、

template = " %StdinReader% }{ [<fc=#ff00ff>%mail%</fc>]",

などのように設定すれば完了です。

この場合は300秒(5分)ごとにサーバに確認し、新着メール数を返します。

感想

これでxmonadに移行することができそうです。

あとはステータスバーにアイコンを表示させることができればOKです。

Vine Linux用にghcおよびhaskell-platformのrpmパッケージを作成

久しぶりの記事です。

経緯

以前、 ghc-7.6.3およびhaskell-platform-2013.2.0.0をインストールしたという記事を書きました。その後、rpmパッケージを作成して公式レポジトリにアップロードしました。そもそもはHaskellで書かれた pandoc rpmパッケージ化したいという思いで始めたものです。

その時の思い出のような記事です。

パッケージ化

ghc-7.6.3およびhaskell-2013.2.0.0

野良ビルドに成功していることもあり、このバージョンは比較的楽にパッケージ化できました。前回はghcのバイナリパッケージをそのまま使用していましたが、今回はVine Linux上でビルドしたパッケージを作成する必要があります。そのため、まずghc-bootstrapパッケージを作成しました(バイナリパッケージをダウンロードして configure & make するだけのパッケージ)。

ところがghc-7.6.3はgmp4である必要があるため、 Vine6ではこのままで動作しますが、VineSeedでは動作しません(gmp5のため)。そのため、VineSeed用にgmp4を提供するghc-bootstrap-gmpパッケージを作成しました。ここまでくればghc自身とhaskell-platformのビルドは簡単でした。

しかし、思わぬ所で罠が待っていました。

自分自身でビルドして使用している時には問題はなかったのですが、 rpmパッケージとしてレポジトリにアップロードして数日経った頃に『「Provides: libffi.so.6」を外して頂けませんでしょうか?』との依頼がありました(当該Vine Linux MLアーカイブ)。

パッチを教えてもらったものの、パッチを当てただけではビルド時にエラーが出てしまいかなり思考錯誤しました。ただ、1回のビルドに40分位かかるためなかなか先に進みませんでした。ソースコードを確認したりで大変でした(今さらghc-7.6.3をビルドする人はいないでしょうから細かな内容は省略します)。

ビルド時に「libffiを外部ライブラリとして使用する」ように設定ファイルが作成されるはずが何故かされなかったため、外部ライブラリとして使用するように決め打ちしたパッチを作成することでとりあえず乗り切りました。

ghc-7.10.3およびhaskell-7.10.3

とはいうものの、バージョンが古いのが気にかかっていました。自分自身では使用する気がないのですが、 stack というシステムを使用するにはバージョンが新しい方がいいようでした。

以前からこのバージョンのビルドを試みていたのですが、 ghcはビルドできるのに対して、haskell-platformのビルド時に「ghcの”BINDIST”(バイナリパッケージ)が必要」なため先に進んでいませんでした。公式ホームページでghc-7.10.3のバイナリパッケージをダウンロードして指定しても、 glibcのバージョンが合わないためビルドに失敗しました。

このような時に色々調べていくうち、この ページ で”make binary-dist”コマンドを知り、これでVine Linux上でビルドしたバイナリパッケージを作成できるのではないかと思い試したところ正解でした。そこでghcパッケージの作成時に同時にghc-bindistパッケージを作成するようにして、これを使用してhaskell-platformをビルドしました。これでようやくバージョンアップをする事ができました。

感想

Haskellでプログラミングをするつもりは全くないのですが、 pandocをパッケージ化したいという事だけで ghcおよびhaskell-platformをrpmパッケージ化してしまいました。

Vine Linuxでghcおよびhaskell-platformを必要とする方がどれ位いるか分かりません。それでもお役に立てれば幸いです。ただし当分はバージョンアップする予定はありません。

ついでにHaskellで書かれたタイル型ウインドウマネージャである xmonad および関連パッケージをアップロードしました。 以前 はxmonadを「少し使用してみましたが慣れません。」と書きましたが、今はfluxboxからxmonadに移行しつつあります。

xmobar(メニューバー)で新着メール数(数だけ)を表示させる方法が分かったため完全に移行できそうです。余裕のある時に記事にする予定です。

Vine Linuxでlittlerをインストールする

追記(2016.2.21)

Vine Linux 6 およびVineSeedに R-littler パッケージをアップロードしました。

したがって以下の記事は過去の記録程度の意味となりました。

経緯

Rのコマンドラインのインタフェースとして littler を使用する場合があります。

Vine Linuxでもlittlerパッケージを作成して使用できるようにしていますが、バージョンが0.1.5と古いです(バージョンを上げるとビルド時にエラーが出てしまったため放置していました)。

最近、何かを調べていて(忘れてしまいました)、 CRANにlittlerパッケージが登録されているのを知りました。早速インストールしたのでその時のメモです。

littlerのインストール

Vine Linuxの場合にはまずlibicu-develをインストールします。

sudo apt-get install libicu-devel

これのパッケージがないとlittlerのインストール時にエラーが出ます。

次にスーパーユーザーでRを起動し、

install.packages("littler")

でlittlerをインストールします。

64-bit環境では /usr/lib64/R/library/littler/bin 以下に r がインストールされるため、 /usr/local/bin 以下にシンボリックリンクを貼ります。

sudo ln -s /usr/lib64/R/library/littler/bin/r /usr/local/bin

これで r を使用できるようになります。

$ r --version
r ('littler') version 0.3.0

using GNU R Version 3.2.3 (2015-12-10)

Copyright (C) 2006 - 2015  Jeffrey Horner and Dirk Eddelbuettel

r is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License.  For more information about
these matters, see http://www.gnu.org/copyleft/gpl.html.

プログラムの1行目は

#!/usr/bin/env r

としておくといいでしょう。