emacs の init.el

Windows 10 上で利用している emacs が,TeX のソース編集をしていると頻繁に 

resource exhausted ! Save current buffer and restart emacs !

と表示されて作業の一時中断を余儀なくされることが頻発したため,~/.emacs.d/init.el をクリーンアップして,意味の分かるところだけを残すようにした(設定された機能の半分も使ってないのでは?)。以下がその minimum init.el

 

;; 日本語の設定 (UTF-8)
(set-language-environment 'Japanese)
(prefer-coding-system 'utf-8)

;; 各行横に行番号を表示
(global-linum-mode t)
(set-face-attribute 'linum nil
:foreground "#800"
:height 0.9)

;; 行番号・桁番号の表示
(line-number-mode t)
(column-number-mode t)

;; 対応するカッコをハイライト表示する
(show-paren-mode 1)

;; autosave on
(auto-save-mode t)

;; モードラインに現在時刻を表示
(display-time)

;; Font の設定
(set-face-attribute 'default nil :family "Inconsolata" :height 110)
;(set-face-attribute 'default nil :family "Consolas" :height 104)
(set-fontset-font nil 'japanese-jisx0208 (font-spec :family "MeiryoKe_Console"))
(setq face-font-rescale-alist '*1
(global-set-key (kbd "C-t") 'other-window-or-split)

;; YaTeX
(setq auto-mode-alist
(cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
(custom-set-variables

;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(ansi-color-faces-vector
[default default default italic underline success warning error])
'(ansi-color-names-vector
["black" "red3" "ForestGreen" "yellow3" "blue" "magenta3" "DeepSkyBlue" "gray50"])
'(custom-enabled-themes (quote (manoj-dark))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)

*1:"MeiryoKe_Console" . 1.08)))

;; 起動時のウィンドウサイズ、色などを設定
(if (boundp 'window-system)
(setq default-frame-alist
(append (list
;; '(foreground-color . "black") ; 文字色
;; '(background-color . "white") ; 背景色
;; '(border-color . "white") ; ボーダー色
;; '(mouse-color . "black") ; マウスカーソルの色
;; '(cursor-color . "black") ; カーソルの色
;; '(cursor-type . box) ; カーソルの形状
'(top . 60) ; ウィンドウの表示位置(Y座標)
'(left . 140) ; ウィンドウの表示位置(X座標)
'(width . 80) ; ウィンドウの幅(文字数)
'(height . 40) ; ウィンドウの高さ(文字数)
)
default-frame-alist)))
(setq initial-frame-alist default-frame-alist )

;; バッファの同一ファイル名を区別する
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

;;; 現在行を目立たせる
(global-hl-line-mode)

;; Window 分割を画面サイズに従って計算する
(defun split-window-vertically-n (num_wins)
(interactive "p")
(if (= num_wins 2)
(split-window-vertically)
(progn
(split-window-vertically
(- (window-height) (/ (window-height) num_wins)))
(split-window-vertically-n (- num_wins 1)))))
(defun split-window-horizontally-n (num_wins)
(interactive "p")
(if (= num_wins 2)
(split-window-horizontally)
(progn
(split-window-horizontally
(- (window-width) (/ (window-width) num_wins)))
(split-window-horizontally-n (- num_wins 1)))))

;; Window 分割・移動を C-t で
(defun other-window-or-split ()
(interactive)
(when (one-window-p)
(if (>= (window-body-width) 270)
(split-window-horizontally-n 3)
(split-window-horizontally)))
(other-window 1

msys2 gcc でスタックのサイズを増やしたい

某研究課題のために,ログも含めて結構な量のメモリ確保が必要なプログラムを書いた.Linux 上で gcc でビルドして動作させていた時には何の問題もなかったのだが,諸事情で msys か cygwin の上で同じことをやらないといけなくなり,コンパイルしたところ,コンパイルは何事もなくできるのだが,実行時に

segmentation fault (core dumped)

なる宣告が (T_T).配列かポインタか,いずれにしてもそこ周りの不具合であることはすぐに察するが,確認のため

gcc -g hoge.c -o hoge ...

としてデバッグシンボルを追加したバイナリを作り,gdb hoge として run すると

chkstk_ms() をした時点で SIGSEGV を受信してお亡くなりになったことが判明.

 

 この関数,memory allocation 関係のところで呼ばれるのだそうで,関数の名称からして stack に関するチェックをしていることは見え見え。

 msys にしても gnupack / cygwin にしても結局は bash 環境.bash から起動されるプロセスが使える stack のサイズ = bash に割り当てられた stack size ということで,

ulimit -s

でサイズチェックできる.早速試したら,2032 (byte) と出てきて「ンなもん足りる訳ねえじゃん」と思い,

ulimit -s 10485760

なんてバカでかい数字を設定してみようとすると,エラー無く実行でき,その後に ulimit -s するとちゃんと前回実行時の設定数値が返ってくるので「楽勝!」と思って先のプログラムを実行すると,segmentation fault AGAIN! 

 いくつかの方の HP で見たのだが,環境によっては ulimit -s 数値 は機能しないのだとか。そこで,コンパイラの方で

gcc -Wl,--stack,10485760 hoge.c -o hoge ...

として ld (linker) に渡す --stack オプションをコンパイル時に指定したら...,無事動きました!今回の新知識は gcc の -Wl, オプション.この後に,ld のためのオプションを上記のように指定できる.

 Trouble shooting 開始から完了まで,全く外れたことをやりながらも 90 分くらいで何とかできました。

TCP通信プログラム書きました

 某お題のため,TCPによるデータ通信プログラムをコーディング中。今後のため,今回得た経験と知恵・技量を要約しておく。

1.TCP通信プログラム手順

<サーバー側>

  1. sock_id = socket(AF_INET, SOCK_STREAM,0) としてソケット作成
  2. sockaddr_in 型構造体 (socket作成時に,AF_INETを指定した場合に,アドレスを指定する構造体らしい)の必要なパラメータにデータをセットし,ソケットを通信に使うための準備(bind関数の実行)をする。サーバーの場合,sin_addr.s_addr にはサーバー自身のIPアドレスを入れるらしいのだが,このフィールドを INADDR_ANY とすると,サーバーが有している全てのIPアドレスを指定したのと同じことになる!らしい。これにより,サーバーとネットワーク的につながっている任意のクライアントがサーバープログラムのソケットに接続可能となる。
  3. listen(sock_id, MAX_CONNECTIONS) して,クライアントからの接続要求到着を待つ。(MAX_CONNECTIONSはそのサーバープログラムが受け入れられる最大並列接続数)
  4. sock_child = accept(sock_id, ...) により接続要求受け入れ。このとき,要求してきたクライアントと接続するためのソケットが自動生成されるので,このクライアントとの通信には自動生成された方のソケット(sock_child)を利用
  5. sock_childを read したり write したりして,データ通信。read の返り値について
    0…相手のソケットがcloseされているものと思われる状況。こちらも対応するsocketをクローズして,後片付けなり再生なりの処理を行う。
    -1...エラー発生。このとき,errno にエラー番号が格納されているので,#include <errno.h> をインクルードし,strerror(errno)を printf (%s) すれば,エラーの正体が分かり,何が起こっているか理解するのにとても役立ちます!
  6. 全て終わったら,sock_child と sock_id を close して終了

<クライアント編>

  1. サーバー編1.と同様にして AF_INETでSOCK_STREAMタイプのソケットを作成。
  2. サーバー編2.と同様,sockaddr_in構造体のメンバーに必要なサーバーとの通信用パラメータをセットsin_addr.s_addr は接続相手のサーバーのIPアドレスとする。
  3. connect() 関数を利用して,手順1.で利用したソケットを利用してサーバーにコネクションをリクエスト。(許可が出なければ待ち状態になると思われ
  4. 無事許可が出たら,socket を read/write してデータをやり取りする。
  5. 終わったらソケットをクローズして終了。

TeX ソースの PDF に type 3 フォントが残るという話 & 対策

 某雑誌に投稿した論文について,editor in chief の先生より「upload されたファイルは,投稿時必須の PDF test はノーエラーでパスするけど文字化けしていて全く読めない。複数台のコンピュータでトライしてみたが状況が変わらないので,問題を修正して再提出しなさい」との連絡を頂く。

 実はこの論文原稿,投稿システムの PDF test では何の問題もないように表示されたのだが「念のため」と思ってダウンロードした投稿済み原稿が自分の手元でも文字化けしてしまって読めず「大丈夫かなぁ」と不安に思っていたもの。案の定、、、である(涙)。

 投稿時は結構疲労していたため PDF test の結果ログをちゃんとチェックしていなかったのだが,改めて調べてみると作成した PDF の中にいくつか含まれていると表示される type 3 フォントが原因であるらしいことがわかる。この PDF test システムも,UI画面ではコメントとして「initial submission では type 3 フォントが残っていても許容するけど,問題を引き起こす可能性があるよ」と書いている。

 さらに google と 

  • PPT で書いた図を eps 化したファイルにはtype 3 フォントが含まれることがある。

 という情報にも当たる。途中,「wmf2eps というソフトウェアで PPT 図を eps 化する場合は,truetype font の処理を適切なオプション設定で行わないと eps 化した図に type 3 フォントが含まれてしまう」という情報も発見(例えばこちらとか)するが,私は wmf2eps ではなく imagemagick で convert しているので,これでは問題を解決できない。

# 正確に言うと,wmf2eps で,上述の設定をした上で図を作り直せば対応できない

# わけではないのだが,出来ればそれは避けたい...

 

 しばらく情報を探したものの対策を発見できなかったので,wmf2eps のインストールやむなしと気持ちが傾きかけたところで,

  • TeX のソース中で \usepackage{lmodern} とすれば,最終的に出来上がるPDFファイルから Type3 フォントが消える!

という極めてありがたい情報に到達でき,解決できた。組み込まれるフォントが変わったためか組版のレイアウトが変化してしまったが,やむなしといったところか。しかし,PPTオリジンの図は数えるほどしかなく,従って Type3フォントも数少ないと思われるのに本文全体が文字化けするって,どうよ...

 

【要約】 PPT ソースの図を eps にして TeX に取り込むときは,preamble で \usepackage{lmodern} とすべし!

 

PPT → png/gif → convert (ImageMagick) で eps のトラブルシューティング

PPT でお絵かきしたものを「図として保存」し,convert で eps に変換して TeX に取り込もうとしたところ,背景がまっ黒になり,半日ほど作業停滞(汗。

結論は

convert -alpha Remove hoge.png eps2:hoge.eps

みたいな感じにするとよかったのだが。アルファ値は,"32bit png" と呼ばれるタイプのpngで付加できる,各ピクセルの透明度の情報(8ビット長)のことのようで、convert ではアルファ値がきちんと処理できないということ?

MATLAB plot コマンドで動画を作る

MATLAB plot 関係の忘備録。必ずしも動画に関係なく記載。

  1. gca と gcf の違い
    gca = Get Current Axes handle number (現在の座標軸(座標軸とプロット本体を合わせた部分)のハンドル番号を取得する関数)
    gcf = Get Current Figure handle number (現在の図全体(座標軸の外側も含むウィンドウ内部全部)のハンドル番号を取得する関数)

  2. Movie 出力 : 以下が典型例みたい(これなら64bit windows8.1 でもOK)
    writeObj = VideoWriter('test.avi','MPEG-4') ; %'MPEG-4' は圧縮したければ
    writeObj.FrameRate = 60 ;
    open(writeObj) ;

    % Animation Loop
    i = 1;
    while i<=kukan
        set(h1,'XData',t_k(i),'YData',suit_el_th_k(i));             
        set(h2,'XData',t_k(i),'YData',el_omega_k(i));                    
        drawnow;
        i = i+1;
        F = getframe(1);           %1は gcf の値
     writeVideo(writeObj,F); 
    end

    close(writeObj) ;
  3. plot の renderer
    MATLABがサポートしているのは,'zbuffer', 'Painters','OpenGL' の3つ。このうち履歴も残しながら動画を吐き出せるレンダラ-は OpenGLしかない(buntaの手元では)。
    ただし、OpenGLを指定すると,動画の背景が透明となって、後ろにあるものまでcaptureされちゃうので注意。Aeroのせい?それとも OpenGLがカラーマップを描画対象に埋め込まないから?

久しぶりにいぢった grub2

デュアルブート環境で,起動時のOSセレクタブートローダーである grub2 を ubuntu インストールの過程でセットアップすると,第1優先のOSが ubuntu となり意図と違ってしまったため,この順番を変える作業をしました。

 

 結論は,

  • /etc/default/grub にある
    GRUB_DEFAULT=0  (これが ubuntu インストール後の default で,0 はubuntu を指す)
    の数字のところを変えると,第1優先のOSを変えることが出来る,この数字はgrubがOSを検出した順番に0から割り当てられる。
  • 従ってOSの検出順については変える必要はなく「何番目にdetectされたか?」だけわかっていればよいが,/etc/grub.d/nn-***** (nn は数字)の数字を変えることで検出順が変わるので,例えば windows を上の方で検出させたい場合は
    30-os-prober → 07-os-prober などとするとうまくいきます

2項目目は怪我の功名というか,そんなことしたいとは思ってなくて,でもosのブート順を変えたいと思って調べた結果最初に行き当たった情報を試してみて,理解したものです。でも,結果として update-grub をした時に windowsが0番になり,その次に ubuntu が検出されたので,見栄え的にもとてもよくなりました(爆。