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

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

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

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

追記(2017.1.3)

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

内容

以前、 このページ でカテゴリカルデータからダミー変数を作成するR関数を紹介しました。

このブログ自体それほどアクセスがあるわけではありませんが、検索される際のキーワードとして「R ダミー変数」が最も多かったです。

そこでこの関数をGitHubで公開しました(https://github.com/toshi-ara/makedummies)。

Rからは

## install.packages("devtools") # パッケージをインストールしていない場合
library(devtools)
install_github("toshi-ara/makedummies")

でインストールできます。

使用方法はGitHubの例を参照して下さい。

久しぶりにウィルススキャンをしてみたら……

久しぶりにclamavで自宅コンピュータのウィルススキャンをしてみました。

clamscan -ri ~

すると1個だけウィルス感染ファイルが検出されました。

./(path)/LineInst.exe: Win.Trojan.Nimnul-22 FOUND

今はLINEをアカウントごと削除していることもあり、ファイルを速攻で削除しました。

CORESERVERにGitPrepをインストールするも失敗

経緯

現在契約しているCORESERVERに GitPrep (GitHubクローン)をインストールして使用しようとしましたが、結局うまくいかなかったという報告です。

インストール操作

Gitのインストール

CORESERVERにはgitがインストールされていないため、まずそこから始めました。

git-2.6.2(現時点での最新版)のソースコードをダウンロードし、以下のようにインストールしました。

tar xzf git-2.6.2.tar.gz
cd git-2.6.2
make configure
./configure --prefix=$HOME/local
make
make install

その後、.bashrcに

export PATH=$HOME/local/bin:$PATH

の行を追加してパスを通しました。

GitPrepのインストールおよび設定

以下の順にインストールおよび設定を行いました。

  1. ソースコード(当時の最新版であるバージョン1.10)をダウンロードし、ホームページの内容に従ってインストール
  2. gitprep.my.confを作成し、インストールされたgitの場所などを適切に指定
  3. http://arat.xyz/gitprep/gitprep.cgi にアクセスし、adminユーザーおよび一般ユーザーを作成

ここまでは正しく動作しました。

一般ユーザーでログインした後に、「Initialize this repository with a README」にチェックを入れて新規レポジトリを作成しようとすると、「Internal error」が表示されてしまいレポジトリの作成に失敗してしまいました。

原因の究明

経過をGitPrepの作者である木本さんに連絡するなどして原因を明らかにしようとしました。

現時点で分ったことは以下の通りです。

  1. 新規レポジトリ作成時にgit pushを行うが、 CGIプログラムとして動かした場合にエラーが出る。
    • サーバにSSH接続してコマンドラインから同じことを行ってもエラーは出ずに正しく動作する。
    • CGIプログラムではなく、localhost:10020でアクセスして使用する方法では何の問題もなく使用できる。
  2. かなりの試行錯誤の結果、簡単なシェルスクリプト(CGI)を書いて、 webから実行してエラーメッセージを表示させたところ、 git push時に以下のエラーが出ました(ちなみにCGIプログラムをコマンドラインから直接実行するとエラーは出ませんでした)。
error: cannot create thread: Cannot allocate memory
fatal: send-pack: unable to fork off sideband demultiplexer
error: cannot create thread: Cannot allocate memory
fatal: bad object 13f4ebbd6ef5a638511e543e16b0ebc544695403

つまり、 CGIプログラムでgit pushを実行させた際に新たなスレッドが作成されないのが原因のようです。 Apacheの設定が関係しているのかもしれません。

これ以上は自分での解決は無理と判断したので、これまでの内容をCORESERVERのサポートに伝えました。ただし、Apacheの設定を変更するなどの処置が必要になるかもしれないため解決は難しいかもしれません。

現在はさくらレンタルサーバのスタンダード(無料お試し)上で動かしているため、問題なく動作しています。 CORESERVERのサポートからの回答次第ではさくらレンタルサーバに完全移行することも考えています。

CORESERVERにEmacsをインストールする

経緯

CORESERVERにSSH接続してファイルの編集を行うことがあります。その時にサーバに用意されているエディタがvimでした。

vimに慣れる目的で少しだけ使用しましたが、コピー&ペーストのやり方も知らないためすぐに断念しました。

そこでいつも使用しているEmacs(最新版は24.5)をサーバにインストールしました。

Emacsのインストール

ソースコードのダウンロードおよびサーバへのアップロード

(省略)

インストール操作

tar xzf emacs-24.5.tar.gz
cd emacs-24.5/
./configure --prefix=$HOME/local --without-gnutls
make
make install

でインストールできました。

また、

--without-gnutls

のオプションですが、これをつけないとビルド時にエラーが出ました。

ターミナル上では画像を使用しないため、不必要なオプションをオフにした方がいいのでしょうが、今回はそこまでは行いませんでした。

とりあえずこれでサーバ上でのファイルの編集が楽になりそうです。その前にある程度、Emacsの設定もしなければなりませんが。

追記

2015.11.13

コンパイル時のオプションを追加しました。

./configure --prefix=$HOME/local --without-sound \
            --without-xml2 --without-gpm --without-xpm \
            --without-jpeg --without-tiff --without-png \
            --without-gif --without-imagemagick \
            --without-gnutls \
            --without-x
--without-xml2

がないとEmacsの起動時に警告が出ます。

ファイルを自動でバイトコンパイルさせないための設定

普段は auto-async-byte-compile.el を使用して Emacsの設定ファイルを保存時に自動コンパイルするように設定しています。

(require 'auto-async-byte-compile)
(add-hook 'emacs-lisp-mode-hook 'enable-auto-async-byte-compile-mode)

ただし、るびきちさんのTwitterか何かで「変数を設定しただけのファイルはバイトコンパイルしない」というコメントを見たような記憶があります(記憶が非常にあいまいのためもし違っていたら申し訳ありません)。

そこでどのように設定するのかを調べてみました。

検索方法が悪いのかなかなか見つかりませんでしたが、最終的に Emacsのマニュアル に載っているのを見つけました。

ファイルの先頭に

;; -*-no-byte-compile: t; -*-

のようにしてローカル変数を設定すればいいようです。

これで自動でバイトコンパイルさせることはなくなりました。

Emacsのパッケージ管理のレポジトリにMELPA-stableを追加する

経緯

Emacs-24.5を使用しており、パッケージ管理のレポジトリとして ELPA(gnu)の他に MELPAとMarmalade、orgを追加しています。

しかし、 MELPAに登録されているパッケージの中には亢進頻度が高いものもあり、時々アップグレードによって不具合が生じる場合もあります。

そのため、 MELPAに登録されているパッケージでも安定版で使用したい場合がありました。

そのような時に検索していると このページ にMELPA-stableのことが載っていました。

そこでMELPA-stableを導入したのでその時のメモを残しておきます。ただし、日本語の情報があまりなかったため少し大変でした。

MELPA-stableの導入

レポジトリの登録

このページ の内容に従って.emacs.elに

(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)

を追加します。 Emacs-24以降を使用する場合にはそれ以外の設定は不要です。

パッケージの移行

M-x package-list-packages

を実行し、下の方にある installed となっているパッケージを選択します。 (バージョン番号)(melpa-stable) という箇所を選択すると インストール画面に移行します。

この時、既にMELPAからインストールされているパッケージのフォルダは削除せずに別な場所に保存しておいた方がいいかもしれません。

また、場合によっては MELPA-stableではなくMarmaladeからインストールすることもあるため、どちらからインストールしたのかをメモしておいた方がいいです。

始めはメモしておかなかったため、後でもう一度調べ直すことになりました。結構大変でした。

package-pinned-packages変数の設定

この状態でパッケージのアップグレードを行うと、 MELPAのパッケージが候補に上がってきました。

これでは安定版をインストールした意味がないので、 MELPA-stable版の場合にはMELPA版をインストールしないようにするための設定を調べたところ、 このページ が見つかりました。

package-pinned-packages という変数に パッケージ名とレポジトリを登録すればいいようです。

少し長いですが、現時点での私の設定を載せておきます。

(setq package-pinned-packages
      '(
        (ac-R                  . "marmalade")
        (ace-isearch           . "melpa-stable")
        (ace-jump-buffer       . "melpa-stable")
        (ace-jump-mode         . "melpa-stable")
        (ace-link              . "melpa-stable")
        (ace-pinyin            . "melpa-stable")
        (ace-window            . "melpa-stable")
        (ag                    . "melpa-stable")
        (alert                 . "melpa-stable")
        (async                 . "melpa-stable")
        (auto-complete         . "melpa-stable")
        (avy                   . "melpa-stable")
        (bind-key              . "melpa-stable")
        (bm                    . "marmalade")
        (button-lock           . "melpa-stable")
        (calfw                 . "melpa-stable")
        (color-theme           . "marmalade")
        (ctable                . "melpa-stable")
        (dash                  . "melpa-stable")
        (deferred              . "melpa-stable")
        (descbinds-anything    . "marmalade")
        (diffview              . "melpa-stable")
        (diminish              . "melpa-stable")
        (dired-details         . "marmalade")
        (el-mock               . "melpa-stable")
        (el-x                  . "melpa-stable")
        (elscreen              . "melpa-stable")
        (elscreen-mew          . "melpa-stable")
        (epl                   . "melpa-stable")
        (ess                   . "melpa-stable")
        (ess-R-data-view       . "melpa-stable")
        (ess-R-object-popup    . "melpa-stable")
        (ess-smart-underscore  . "melpa-stable")
        (f                     . "melpa-stable")
        (flycheck              . "melpa-stable")
        (flyspell-lazy         . "melpa-stable")
        (fuzzy                 . "melpa-stable")
        (git-commit            . "melpa-stable")
        (gntp                  . "melpa-stable")
        (guide-key             . "melpa-stable")
        (helm                  . "melpa-stable")
        (helm-ag               . "melpa-stable")
        (helm-core             . "melpa-stable")
        (helm-swoop            . "melpa-stable")
        (highlight-defined     . "melpa-stable")
        (ht                    . "melpa-stable")
        (htmlize               . "marmalade")
        (hydra                 . "melpa-stable")
        (ibuffer-vc            . "melpa-stable")
        (ido-completing-read+  . "melpa-stable")
        (ido-vertical-mode     . "melpa-stable")
        (imenus                . "melpa-stable")
        (julia-mode            . "melpa-stable")
        (kill-or-bury-alive    . "melpa-stable")
        (letcheck              . "melpa-stable")
        (log4e                 . "melpa-stable")
        (m-buffer              . "melpa-stable")
        (magit                 . "melpa-stable")
        (magit-popup           . "melpa-stable")
        (metaweblog            . "melpa-stable")
        (mew                   . "melpa-stable")
        (migemo                . "melpa-stable")
        (morlock               . "melpa-stable")
        (mykie                 . "melpa-stable")
        (noflet                . "marmalade")
        (oauth                 . "marmalade")
        (org                   . "org")
        (org-gcal              . "melpa-stable")
        (org2blog              . "melpa-stable")
        (ox-pandoc             . "melpa-stable")
        (pandoc-mode           . "melpa-stable")
        (paredit               . "melpa-stable")
        (parsebib              . "melpa-stable")
        (passthword            . "melpa-stable")
        (pcre2el               . "marmalade")
        (pcsv                  . "melpa-stable")
        (php-mode              . "melpa-stable")
        (pkg-info              . "melpa-stable")
        (popup                 . "melpa-stable")
        (popwin                . "melpa-stable")
        (rainbow-delimiters    . "melpa-stable")
        (request               . "melpa-stable")
        (request-deferred      . "melpa-stable")
        (revive                . "marmalade")
        (s                     . "melpa-stable")
        (sexp-move             . "melpa-stable")
        (smartrep              . "melpa-stable")
        (smex                  . "melpa-stable")
        (stan-mode             . "melpa-stable")
        (stripe-buffer         . "melpa-stable")
        (unkillable-scratch    . "melpa-stable")
        (use-package           . "melpa-stable")
        (vline                 . "marmalade")
        (with-editor           . "melpa-stable")
        (ml-rpc                . "melpa-stable")
        (xml-rpc               . "marmalade")
        ))

これでMELPAではなく、MELPA-stableやMarmaladeを参照するようになりました。

Vine Linux 6.3でgitを私的rpmパッケージ化

経緯

Emacs-24.5でMELPAからmagitをインストールして使用しています。

しかし、いつの頃からか.gitフォルダが存在していても認識されなくなりした。

調べてみるとログには以下のように書かれていました。

Also note that starting with the ‘2.1.0’ release, Magit requires at least Emacs ‘24.4’ and Git ‘1.9.4’. You should make sure you have at least these releases installed before updating Magit. And if you connect to remote hosts using Tramp, then you should also make sure to install a recent enough Git version on these hosts.

そこで Vine Linux 6.3のgitのバージョンを調べてみると

$ rpm -qa | grep git
git-1.7.4.2-1vl6.x86_64

とやはり対応していませんでした。

gitのビルド

ソースコードからのビルド

そこでソースコードからビルドしました。今回インストールしたgitのバージョンは2.5.3です。

ソースコードは GitHub からダウンロードしました。

tar xzf git-2.5.3.tar.gz
cd git-2.5.3
make prefix=/usr/local all
sudo make prefix=/usr/local install

で/usr/local以下にインストールされます。

この状態でmagitをアップグレードすると動作するようになりました。

私的パッケージ化

せっかくなのでrpmパッケージ化しました。本来のパッケージと名前を区別するために my_git としています。

からダウンロードできます。

/usr/local以下にインストールされるため、本来のパッケージに含まれるファイルを上書きすることはありません。

org-modeで(require ‘ob-R)とするとエラーが出ていたのを解決(訂正)

経緯

Emacsのパッケージ管理をpackageで行っています。 2015.8.3より後のバージョンのorgをインストールした場合に、 org-bableでR-modeを使用するために

(require 'ob-R)

とすると

Debugger entered--Lisp error: (invalid-function org-babel-header-args-safe-fn)

のようにエラーが出ていました。

試行錯誤の結果、解決できたのでメモを残しておきます。

追記(2015.9.29)

以下の「方法」の内容は間違いの可能性があるため訂正します。従来のELPA(gnu)レポジトリでインストールできました。

org-modeのメーリングリストを見ていると同じエラーの投稿がありました( 質問 とそれに対する 回答 )。

回答には

When this error has been reported in the past, it has been due to
another version of Org being loaded during the update.  Please uninstall
and then reinstall before any version of Org is loaded.

と書かれていました。

つまり、

  1. 一度(新しいバージョンの)Orgをアンインストールする。
  2. Emacsを起動して古いバージョンのOrgがロードされる前に(新しいバージョンの)Orgをインストールする。

必要があるようです。

何回もインストールとアンインストールを繰り返して試行錯誤した結果、

  1. (念のため)Emacsをシャットダウンする。
  2. emacs -Q でまっさらな環境のEmacsを起動する(ここが重要)。
  3. M-x list-packages からorg(gnu版のみ表示される)をインストールする。
  4. Emacsを起動する。

でエラーが起こらなくなりました。

同じ症状で困っている方がいれば試してみて下さい。

方法(以下の内容は必要ありません)

このページ の内容を参考にしました。

.emacs.elに

;; (require 'package)   ;; 設定済のためコメントアウト
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)

を追加し、

M-x list-packages

とすると、

org                20150914      available  gnu        Outline-based notes management and organizer
org                20150914      available  org        Outline-based notes management and organizer

のようにorg版のorgも表示されるようになるので、こちらをインストールします。

これで

(require 'ob-R)

としてもエラーが出なくなりました。

補足

このページ によると、開発版ではstan-modeに対応しているようです(2015.9.20閲覧)。 2015.9.3のgitのログ に載っていました。

近いうちに取り込まれて使用できるようになるでしょう。楽しみです。