ノートの切れ端

その日やったことを書くだけ。

LaTeXでの、epsによる位置ずれ

概要

convertコマンドでeps2という画像形式?のepsの場合、LaTeXのincludegraphicsで表示しようとすると位置ズレが激しい場合がある。

解決策

convertするとき、eps2をつけない。データ量が3倍とかになっても我慢する。

追記

時代はpdfのようです。gnuplotとかもpdfで出力できるので、pdfで出力後、

extractbb file.pdf

で画像に関する情報を生成(?)すると、画像と同じように

\includegraphics{file.pdf}

取り込めます。

PNMという画像フォーマットが使いやすい

Intro

画像データを扱いたいがフォーマットとかが複雑そうで、勉強する気がわかなかったが、pnmという形式によって一気にはかどったのでその話を。

PNMとはなんぞや

画像フォーマットの一つ。(他の画像フォーマットは知らないが、)データをテキストでも扱えるため、計算結果を画像フォーマットに整形するために色々考える必要がない。以下のような種類がある。

バイナリ・ビットマップ
情報がバイナリ形式。また表せる色も、白or黒。
バイナリ・グレースケール
情報がバイナリ形式。表せる色は、白からグレー、黒。
バイナリ・RGB
情報がバイナリ形式。色はRGBを使える。
テキスト・ビットマップ
情報がテキスト形式。また表せる色も、白or黒。
テキスト・グレースケール←これを使用
情報がテキスト形式。表せる色は、白からグレー、黒。
テキスト・RGB
情報がテキスト形式。色はRGBを使える。

どう使う?

matlabとかで計算させたい画像を持ってくる。今回は、NxM画素、グレースケールの"test.png"とおく。

PNG to PNM

png2pnmというコマンドを準備する。自分はarchを使っているが、libpngというパッケージをインストールした(気がする)。

png2pnm -n test.png > test.pnm

で、pnm形式に変換してくれる。ただし書式ルールで、一行の文字数が決まってるらしく、各行M個のフィールドがあるわけではないので、整形に関して後述する。

PNM to PNG

pnm2pngというコマンドを準備する。これもlibpngに入ってたかな。

pnm2png test.pnm > test2.png

png形式に変換してくれる。

PNM形式 to 行列

NxM画素の画像データだから、NxM行列で扱いたいと思うのが一般だと思う。NxM行列としてoctaveやらに読み込めるように、以下の手順を踏む。

  1. PNM形式 to すべてのフィールドを一行にまとめた、test.tmp ( step1.awk
  2. test.tmp to 各行のフィールド数がM個にした、test.mat ( step2.awk )
  3. octaveでは、dlmread("test.mat")をNxM行列として読み込めるため、完了。

Step1

PNM形式の、今回使う、テキスト・グレースケールのフォーマットを簡単に説明する。

  • 一行目は、6種類のうち、どの形式で書かれているか。今回はテキスト・グレースケールのため、"P2"
  • 二行目は、画像の大きさ。NxM画素のため、 "N M"
  • 三行目は、グレースケールでの最大値。恐らくいくつでもいいと思うが、pngを変換した結果、"65535"
  • 四行目以下は、画像左上からの、各画素の値。区切り文字はスペース。

例はこんな感じ。実際はもっと長いが途中省略する。

P2
16 16
65535
32632 28557 31507 33464
33510 42367 46113 48265
49762 51108 51933 53282
42071 37332 36162 17002
30002 27844 30897 32782
...

四行目以降に注目して、(2,2)の値を見ると"42367"となっているが、実際にはこの値は(1,6)のものであることに注意する必要がある。これを、以下みたいな感じにするスクリプトを書く。

16 16
32632 28557 31507 33464 33510 42367 46113 48265 ...

実際に書いたスクリプトはこれ。

NR == 2 {
    print $0
}

NR > 3 {
    for(i=1; i<=NF; i++)
        printf("%d ", $i)
}

END {
    printf("\n")
}

これを"step1.awk"と名づけて以下のコマンドを実行すると、step1の結果が出てくる。

awk -f step1.awk test.pnm > step1.txt

Step2

以下のスクリプトで、各行にM個のフィールドがあるよう整形します。

NR == 1 {
    row = $1
    column = $2
}

NR > 1 {
    for(i=1; i<=NF; i++)
        printf("%d%s", $i, i%column==0 ? "\n" : " ")
}

これを"step2.awk"と名付け、以下のコマンドを実行します。

awk -f step2.awk step1.txt > test.mat

これで、PNM形式からNxM行列の形に整形できたので、octaveやらに読み込ませることができます。

mathematicaで数値計算結果の出力

最近mathematicaにハマっています。授業で引力を加味した天体の動き的なものを数値計算したのですが、単に数字を見てもどうなっているのかさっぱりわからないので、図にしたいと思って今回利用しました。

準備

環境

今回はmathematicaメインなので、数値計算結果は準備済みということで。入力データとして以下のようなものを準備します。

天体1のx座標 天体1のy座標
天体2のx座標 天体2のy座標
...

mathematicaで散布図作成

まず、上記のような入力データの散布図をmathematicaで描くためのコードを書きます。以下のようなコードで動くと思います。

(* Define Size *)
size = 0.3;

circle := {
       Disk[{x,y},size]
};

xylst =
ReadList["Path-To-File", {Number, Number}];

objlst = {Thickness[0.005]};
Do[
   x = xylst[[i,1]];
   y = xylst[[i,2]];
   AppendTo[objlst, circle],
   {i, 1, Length[xylst]}
    ];

Show[
     Graphics[objlst],
     Axes->True,
     PlotRange->{{0,100}, {0,100}},
     AspectRatio->1
    ]

mathematicaGIFアニメーション作成

自分の場合、計算回数Nステップ後の天体全体の様子を見るために、上記の散布図を利用しました。ここまでくると、時間経過で天体がどのように動くか気になりますね。ということで、時間経過で変化するようGIFアニメーションにします。

準備として、計算回数Nステップ後の出力データのファイル名を"tN.txt"とかにします。wolfram言語では数値変数Nに対して、『"t"<>ToString[N]<>".txt"』で文字列結合ができます。これで順次アクセスするファイルを変更します。

(* Define Size *)
size = 0.3;

circle := {
       Disk[{x,y},size]
};

anime=Table[
    filename = "t"<>ToString[k]<>".txt";
    xylst =
    ReadList["Path-To-Directory-with-Files"<>filename, {Number, Number}];
    objlst = {Thickness[0.005]};

    Do[
       x = xylst[[i,1]];
       y = xylst[[i,2]];
       AppendTo[objlst, circle],
       {i, 1, Length[xylst]}
    ];
    Graphics[objlst, PlotRange->{{0,100},{0,100}},Axes->True,AspectRatio->1],
    {k,0,300,1}
]
Export["Output-Filename",anime];
ListAnimate[anime]

終わり

mathematicaってすごく楽しいんですけど、エディタが使いづらい気がするんですよね。mathematica使うときって50行くらい一度に書くこともあるので、emacsとかで書きたいけどwolfram-modeとかなかったり、誰かが設定ファイル作ってくれてるんですけど合わなかったり。そんな感じでEmacsLispへの興味が湧き上がってきてます笑

下記のようなコードで下のGIFアニメができました。それでは、皆さんも楽しいmathematicaライフを!

f:id:nobuta05:20160207222542g:plain

CentOS6.7の環境構築メモ

VPSの環境構築のメモ。

各種必要なソフトのインストール

yum install openssl sqlite-devel zsh emacs
useradd -m -g wheel [username]
passwd [username]

セキュリティ的な対策

wheelグループに属するユーザがsudoできるように、

VISUAL=emacs visudo

以下の文のコメントアウトを外す。

%wheel ALL=(ALL) ALL

公開鍵認証を使う。

ローカルマシンで以下のコマンドを実行。

ssh-keygen -C "forCentOS"

これでできたid_rsa.pubをリモート側に送って、以下のコマンドを実行。

mkdir ~/.ssh
cat id_rsa.pub >> authorized_keys

あとは/etc/ssh/sshd_configの以下の文のコメントアウトを外す。

PubkeyAuthentication yes

これで完了。

gccのインストール

これがないとpythonも入らない。gcc-5.2.0を入れる。

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.gz
tar zxvf gcc-5.2.0.tar.gz
cd gcc-5.2.0
./contrib/download_prerequisites
./configure --prefix=/usr/local/gcc-5.2.0 --enable-languages=c,c++ --disable-multilib
export LD_LIBRARY_PATH=/usr/local/gcc-5.2.0/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
export CPLUS_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
make -j3
sudo make install

mv /usr/bin/gcc /usr/bin/gcc-4.4.7
mv /usr/bin/g++ /usr/bin/g++-4.4.7

ln -s /usr/local/gcc-5.2.0/bin/gcc /usr/local/bin/gcc
ln -s /usr/local/gcc-5.2.0/bin/g++ /usr/local/bin/g++

これで良い。

Pythonを入れる

Python3.5を落としてくる。あと前投稿で「これ入れればpipも一緒にインストールしてくれるよ。」って書いたけど、足りなかったっぽい。『参考サイト』。

./configure --enable-shared
make -j3
sudo make install
ln -s /usr/local/lib/libpython3.5m.so.1.0 /lib64/

あとsudo pip3できるように、

sudo VISUAL=emacs visudo

にて、以下のように書き加える。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

apacheのインストール

yum install httpd httpd-devel

mod_wsgiのインストール

前投稿と同じ。

Django1.8 + python3.5 + apache2.2 + mod_wsgi4.4.13 + CentOS6.7 で環境設定

Djangoを使ってwebサービスを作ったので、公開したいと思って環境構築を進めたが手間取ったのでメモ。気の向いたままに書いたので順番バラバラです。万が一参考にされる場合は最後まで見てからを推奨。

まずmod_wsgipythonのバージョンに依存するらしく

sudo yum install mod_wsgi

でインストールするとpython2系に依存するらしい。一方自分はpython3に依存してDjangoアプリとかDjangoの環境を構築したのでうまく動かないらしい。というわけで最新のソースコードgithubからもってきて、

./configure --with-python=/usr/local/bin/python3.5
make -j3
sudo make install

って感じでコンパイルするとうまくいった。

pythonインストール時のpipインストール

最初、LinuxMint環境でpython3.5をmake installしたら、

Ignoring ensurepip failure: pip 7.1.2 requires LLS/TLS

と出た。ググったところ、『libssl-dev, openssl』の二つをインストールした状態で新規pythonをインストールすれば、一緒にpipもインストールされた。参考は以下のサイト『参考サイト』。

djangoのsqlite3

何も考えずにpython3.5を入れて、

python3.5 manage.py runserver

を実行すると

No module _sqlite3

というエラーが出る。これはpython3.5にsqlite3モジュールが含まれていないことが原因らしい。pythonをインストールする前に

sudo yum install sqlite-devel

を入れておくことで解決した。

wsgi.pyのPermission denied解決について

mod_wsgi.soをapacheに取り入れて、djangoのプロジェクトを『mysite』、アプリを『polls』として/var/www/cgi-bin/mysiteに配置した。 /etc/httpd/conf.d/python.confにて

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /test_django /var/www/cgi-bin/mysite/mysite/wsgi.py

また/var/www/cgi-bin/mysite/mysite/urls.pyにて

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r"^", include("polls.urls", namespace="polls")),
]

として、apacheを起動した。webブラウザにて、『http://127.0.0.1/test_django』にアクセスすると、pollsアプリのindex.htmlが表示されるはずだが、『Internal Server Error』とでてきた。apacheのエラーログを見ると、

(13)Permission denied: mod_wsgi (pid=2927, process='', application='localhost.localdomain| /test_django'): Call to fopen() failed for '/var/www/cgi-bin/mysite/mysite/wsgi.py'.

って出てきた。ファイルまでのパーミッションも確認したけど、どれも問題なく頭を抱えていたら、次のサイトが参考になった『Python3とDjango1.8の構築メモ 』。

SELINUXなるものがセキュリティにブロックしているとのこと。これに関しては初見なので後々調べておく必要があるが、ひとまず以下のコマンドでアクセスできるようになることが確認できた。

sudo setenforce 0

最近の進捗 LANの構成とかネットワーク系の勉強

パケットの気持ちになってみる

この本でパケットの気持ちを体感中『ルータ自作でわかるパケットの流れ』。結構いい。

2台目パソコンのセッティング

以前記事を書いた内容でarch linuxをインストール中。過程で起こった問題をメモ。

xorgでのキー入力

/etc/vconsole.confに

KEYMAP=jp106

って書くと日本語キーボードレイアウトになるってどこかに書いてあったと思ったんだが、英語レイアウトのままだった。archlinuxのxorgのページを参考に、キーボードレイアウトの設定をした。

/etc/X11/xorg.conf.d/00-keyboard.conf に

Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "jp"
        Option "XkbModel" "thinkpad"
EndSection

とすると、日本語レイアウトに変更された。

fcitxの自動起動

ibusは相性が悪く、前回苦戦したので、fcitxを利用している。自動起動(仮)の方法をメモしておく。ただ自分が使ってるqtileにはstartupの方法があるっぽいので後で調べる必要あり。

~/.xinitrのexec qtileの前に

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
# export DefaultIMMODULE=fcitx <-なくてもよさそう
export XMODIFIERS="@im=fcitx"
fcitx

と記載する。

qtileでのバッテリーwidget

qtileにはバッテリー残量を表示するwidgetがある。

/usr/lib/python3.4/site-packagets/libqtile/widget/battery.pyにおいて、「BAT0」を「BAT1」に置換すれば正常に動作する。 またBAT1は/sys/class/power_suppy/ にて発見した。 参考URLは『参考1』と『参考2』である。

今日の進捗 gnuplotでgif出力できるようにする

gnuplotのインストール

最近アルゴリズムの性能比較とかが課題でよく出るので、グラフ出力でgnuplotが必要になる。gifで時間変化のグラフとか書いてもいいなと思い、その導入過程をメモ。

まずはgif用にライブラリが必要らしい。こちらを参考。『Terminal “png” missing when using Gnuplot』。ライブラリをインストールしたら後は

./configure --with-gd
make
sudo make install

でインストール完了。ちゃんとgif出力できるかは、gnuplotを立ち上げた後

> set terminal

で出力される一覧にgifが含まれているかでわかる。なお、configureで立てたフラグは、configureファイル適当に読んでとりあえず立ててみたらうまく行っただけなので、もしかしたら間違ってるかも…。