gnuplot tab 補完を有効にする

私は,現在CentOS7を使用していますが,gnuplot で Tab 補完をする際の挙動が,CentOS6を使用していた頃のものと変わっており,不便だったのでソースファイルからビルドしてインストールを行った。

調べてみると,ライセンスの関係でreadlineのライブラリがデフォルトで利用できなくなっているのが原因であることが分かった。

実際に読み込まれるライブラリをCentOS6とCentOS7で見てみると(どちらもyumでインストールしたもの)

・CentOS6

$ which gnuplot
/usr/bin/gnuplot
$ ldd /usr/bin/gnuplot
        linux-gate.so.1 =>  (0x00f2e000)
        libreadline.so.6 => /lib/libreadline.so.6 (0x00122000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x008e8000)  
        libz.so.1 => /lib/libz.so.1 (0x0010c000)              
        libgd.so.2 => /usr/lib/libgd.so.2 (0x0015e000)        
        libXpm.so.4 => /usr/lib/libXpm.so.4 (0x042be000)      
        libX11.so.6 => /usr/lib/libX11.so.6 (0x00346000)      
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x056f2000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x0066a000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x005cf000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0x006a1000)
        libm.so.6 => /lib/libm.so.6 (0x00dd4000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x004e0000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00482000)
        libc.so.6 => /lib/libc.so.6 (0x00c16000)
        libtinfo.so.5 => /lib/libtinfo.so.5 (0x00a6c000)
        libdl.so.2 => /lib/libdl.so.2 (0x00dcd000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00322000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x004b6000)
        /lib/ld-linux.so.2 (0x00bf0000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0x0031d000)

・CentOS7

$ which gnuplot
/usr/bin/gnuplot
$ ldd /usr/bin/gnuplot
        linux-vdso.so.1 =>  (0x00007fff3b96b000)
        libncurses.so.5 => /lib64/libncurses.so.5 (0x00007fc31472e000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fc314503000)
        libedit.so.0 => /lib64/libedit.so.0 (0x00007fc3142c6000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fc3140b0000)
        libgd.so.2 => /lib64/libgd.so.2 (0x00007fc313e68000)
        libXpm.so.4 => /lib64/libXpm.so.4 (0x00007fc313c56000)
        libX11.so.6 => /lib64/libX11.so.6 (0x00007fc313918000)
        libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007fc3136c2000)
        libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007fc313486000)
        libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007fc3131e0000)
        libpng15.so.15 => /lib64/libpng15.so.15 (0x00007fc312fb4000)
        liblua-5.1.so => /lib64/liblua-5.1.so (0x00007fc312d86000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fc312a84000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fc31287f000)
        libpangocairo-1.0.so.0 => /lib64/libpangocairo-1.0.so.0 (0x00007fc312672000)
        libpango-1.0.so.0 => /lib64/libpango-1.0.so.0 (0x00007fc312427000)
        libcairo.so.2 => /lib64/libcairo.so.2 (0x00007fc3120ff000)
        libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007fc311eaf000)
        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fc311b78000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc31186f000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc311659000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fc311297000)
        libxcb.so.1 => /lib64/libxcb.so.1 (0x00007fc311074000)
        libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fc310e4a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc310c2e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc314973000)
        libpangoft2-1.0.so.0 => /lib64/libpangoft2-1.0.so.0 (0x00007fc310a18000)
        libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007fc310814000)
        libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007fc310612000)
        libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007fc3103b8000)
        libpixman-1.so.0 => /lib64/libpixman-1.so.0 (0x00007fc31010b000)
        libEGL.so.1 => /lib64/libEGL.so.1 (0x00007fc30feea000)
        libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007fc30fce5000)
        libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007fc30fadb000)
        libXrender.so.1 => /lib64/libXrender.so.1 (0x00007fc30f8d1000)
        libXext.so.6 => /lib64/libXext.so.6 (0x00007fc30f6be000)
        libGL.so.1 => /lib64/libGL.so.1 (0x00007fc30f427000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fc30f21f000)
        libffi.so.6 => /lib64/libffi.so.6 (0x00007fc30f016000)
        libXau.so.6 => /lib64/libXau.so.6 (0x00007fc30ee12000)
        libgraphite2.so.3 => /lib64/libgraphite2.so.3 (0x00007fc30ebe4000)
        libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007fc30e9e2000)
        libxcb-dri2.so.0 => /lib64/libxcb-dri2.so.0 (0x00007fc30e7dd000)
        libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007fc30e5d4000)
        libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007fc30e3d0000)
        libgbm.so.1 => /lib64/libgbm.so.1 (0x00007fc30e1c4000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc30df9e000)
        libdrm.so.2 => /lib64/libdrm.so.2 (0x00007fc30dd91000)
        libglapi.so.0 => /lib64/libglapi.so.0 (0x00007fc30db62000)
        libXdamage.so.1 => /lib64/libXdamage.so.1 (0x00007fc30d95f000)
        libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007fc30d759000)
        libxcb-glx.so.0 => /lib64/libxcb-glx.so.0 (0x00007fc30d53e000)
        libxcb-dri3.so.0 => /lib64/libxcb-dri3.so.0 (0x00007fc30d33b000)
        libxcb-present.so.0 => /lib64/libxcb-present.so.0 (0x00007fc30d138000)
        libxcb-randr.so.0 => /lib64/libxcb-randr.so.0 (0x00007fc30cf29000)
        libxcb-sync.so.1 => /lib64/libxcb-sync.so.1 (0x00007fc30cd22000)
        libxshmfence.so.1 => /lib64/libxshmfence.so.1 (0x00007fc30cb1f000)
        libXxf86vm.so.1 => /lib64/libXxf86vm.so.1 (0x00007fc30c918000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc30c6b7000)
        liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fc30c491000)

このように,CentOS6では読み込まれていたreadlineがCentOS7では読み込まれていなかった。

それでは,readlineを使用できるようにソースからビルドしていく。環境はCentOS7だが,他の環境でもパッケージを読み替えればできると思う。

  1. gnuplotの削除とリポジトリからインストールできないようにする
    # yum remove gnuplot
    /etc/yum.conf に以下の記述を追記
    exclude=gnuplot*
    excludeが存在していれば後ろにスペースを開けてgnuplot*を書く。このように設定するとリポジトリからgnuplotがインストールされなくなる。
  2. readline-develのインストール
    これが入っていないと,このあとの作業をおこなっても意味がないので入れておく。
    # yum install readline-devel
  3. gnuplot のソースファイルをダウンロード & 展開
    以下のコマンドでgnuplotの最新版(現在[2016/07/31]はver.5.0.4)がダウンロードできる。

    # wget "https://sourceforge.net/projects/gnuplot/files/latest/download?source=files" -O gnuplot-latest.tar.gz
    # tar zxvf gnuplot-latest.tar.gz
  4. gnuplot のビルド と インストール
    展開されたディレクトリの中に移動して
    # cd gnuplot-5.0.4
    readlineを利用するように設定する。
    # ./configure --with-readline=gnu
    そして,コンパイルとインストールを行う。
    # make && make install

これでインストール完了
最後にlddの結果を載せておく

ldd /usr/local/bin/gnuplot 
        linux-vdso.so.1 =>  (0x00007fffdf3cd000)
        libreadline.so.6 => /lib64/libreadline.so.6 (0x00007f38519f2000)
        libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f38517ca000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f38515a0000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f385138a000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f3851185000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f3850e7d000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f3850b7b000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f3850964000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f38505a2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3851c56000)

無事readlineが読み込まれるようになった。最初の結果と比べるとライブラリの読み込み量がすごく減っているけど大丈夫だろうか?設定の問題だろうが…,また問題が出てきたら考えることにする。

———- 追記 ———-
使用していて,PNGやJPEGに出力が出来なかった。
使用できるようにするためにはgd-develがインストールされている必要があり
# yum install gd-devel
でインストールできる。
この状態で

# ./configure --with-readline=gnu --with-gd
# make && make install

として,インストールすればPNG,JPEG出力ができるようになる。

「pulseaudio」ネットワーク越しに音を転送する

pulseaudio を用いてネットワーク越しに音を転送する方法をまとめておく

pulseaudio でのサーバとは、音を受け取り流す方で、
クライアントは、音を送る方である。

#サーバー側の設定
ホームディレクトリに .pulse というディレクトリが存在しなければ
$ mkdir ~/.pulse
で作成し、次のコマンドで /etc/pulse/default.pa ~/.pulse 以下にコピーする。
$ cp /etc/pulse/default.pa ~/.pulse/
コピーした ~/.pulse/default.pa を次のように編集する。

#load-module module-native-protocol-tcp

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24

192.168.0.0/24 の部分はクライアント側のPCのIPアドレスが含まれるネットワークを選択する。

#クライアント側の設定
クライアント側の設定は簡単で
PULSE_SERVER という変数に転送先(つまりサーバ)のIPアドレスを設定してあげれば良い。

私は、ある端末から起動したプログラムからの音声のみを転送したかったので
プログラムを起動する前に
$ export PULSE_SERVER=192.168.0.1
とサーバのIPアドレス(赤字の部分はそれぞれの環境に応じて変更)をPULSE_SERVERという環境変数に格納してあげて、
$ aplay (再生したいファイル名)
とするとサーバ側から音声を流すことができる。

もしも、すべての音声をサーバ側で流したいのであれば /etc/profile の中に
export PULSE_SERVER=192.168.0.1
と記述すればよいと思う。

参考にしたサイト:pulseaudio を使って Raspberry Pi [から|へ] 音を飛ばす

ghostscript 日本語フォントの設定

TeXで,tex -> dvi -> ps -> pdf の順でファイルを生成していく際に,日本語の文字化けの対処でつまずいたのでメモを残しておく。最後のPDFファイルで文字化けを起こす理由は,ghostscriptに日本語のフォントが設定されていないからである。

環境はlinuxのCentOSとUbuntuの2つについて。TeXは,リポジトリに登録されているものではなく,本家のtexlive(texlive2016)を利用する。

どちらの環境でも次のページ

TeX Live 2013 on Scientific Linux 6.4

を参考にしてtexliveをインストールした(texliveインストール後のパスの設定まで)。
この状態で platex -> dvips -> ps2pdf を実行すると文字化けしたPDFファイルが生成されるが,どちらのの環境のPSファイルのヘッダ?部分は次のようになっている。

%!PS-Adobe-2.0
%%Creator: dvips(k) 5.996 Copyright 2016 Radical Eye Software
%%Title: potts_model.dvi
%%CreationDate: Wed Dec 31 23:59:59 1969
%%Pages: 22
%%PageOrder: Ascend
%%BoundingBox: 0 0 596 842
%%DocumentFonts: IPAexMincho-H CMR12 CMBX10 IPAexGothic-H CMSS10 CMR10
%%+ CMSS17 CMSS12 CMR9 CMMI10 CMSY10 CMMI7 CMR7 CMMIB10 CMEX10 CMSY7
%%+ CMMIB7 CMR5 CMMI5 Helvetica CMMIB9 CMSY6 CMMI6 CMMI9 CMR6 CMSY5
%%+ CMBSY5 CMMIB5
%%DocumentPaperSizes: a4
%%EndComments
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips potts_model.dvi
%DVIPSParameters: dpi=600
%DVIPSSource:  TeX output 2016.07.05:1751
%%BeginProcSet: tex.pro 0 0
%!

ghostscriptの日本語フォントが昔のものと異なっており,また設定ファイルをどこに記述すればよいのかわからず,はまってしまった…
この文字化け解消のためにそれぞれの環境でつぎのように設定を行う。

  • CentOS(7.2)
    次のコマンドでシンボリックリンクを作成
    # ln -s /usr/local/texlive/2016/texmf-dist/fonts/truetype/public/ipaex /usr/share/fonts/ipaex
    /etc/ghostscript/cidfmap.ja に以下のものを記述

    /IPAexMincho     << /FileType /TrueType /Path (/usr/share/fonts/ipaex/ipaexm.ttf) /CSI [(Japan1) 6] >> ;
    /IPAexGothic     << /FileType /TrueType /Path (/usr/share/fonts/ipaex/ipaexg.ttf) /CSI [(Japan1) 6] >> ;
    
  • Ubuntu(16.04)
    次のコマンドでシンボリックリンクを作成
    # ln -s /usr/local/texlive/2016/texmf-dist/fonts/truetype/public/ipaex /usr/share/fonts/truetype/ipaex
    /usr/share/ghostscript/9.18/Resource/Init/cidfmapに以下のものを記述

    /IPAexMincho << /FileType /TrueType /Path (/usr/share/fonts/truetype/ipaex/ipaexm.ttf) /CSI [(Japan1) 6] >> ;
    /IPAexGothic << /FileType /TrueType /Path (/usr/share/fonts/truetype/ipaex/ipaexg.ttf) /CSI [(Japan1) 6] >> ;
    

このように設定することで日本語に対応することができた。
PSファイルのDocumentfontsと,ghostscriptの設定を記述する場所に気をつけなければならない。

参考にしたページ → Ubuntu 日本語LaTeX環境構築方法

—– 追記 —–
このあと,この設定で使用していたら文字が用紙からはみ出してしまうという現象が起こった。これは用紙サイズの設定が正しくPSファイルに書きだされていなかったためで,TeXファイルのプリアンブル部に\documentclass[12pt,a4paper,notitlepage,papersize]{jsbook}このようにpapersizeを付け加えることで解決した。