8ttyan’s blog

コンピュータ関係の小ネタ

gnuplotでLua tikz出力モード時のオプション

以前に,gnuplotできれいな図を出力する方法を紹介した.

8ttyan.hatenablog.com

これは,gnuplotからLaTeXコードを出力し,それをpdflatexで処理すると,埋め込み数式がlatexで処理され,きれいなvector画像が手に入るものである.

このLua tikz出力モードにはいくつかのオプションがあり,これをうまく使う必要がある場合がある.

latexのプリアンブルを設定

preambleの後に任意のプリアンブルコマンドを打つ. 特に数式を埋め込む場合は,以下のように'\usepackage{amsmath}'は必須.

set term tikz color standalone size 4cm,3cm preamble '\usepackage{amsmath}'
gparrows

set arrow 1 from 0,0 to 1,1 などとして,グラフに矢印を描く場合,tikzモードだと,tikzで用意された矢印を用いるので,gnuplotの矢印と異なってしまう.例えば白抜き矢印を描くset arrow emptyなどは使えない.この場合は,set term tikz gparrowsなどとしておく.

set term tikz color standalone size 4cm,3cm gparrows

詳しくは 91.38.1 Lua tikz を参照.

【Mathematica】下付きnotationの変数を使う方法

通常Mathematicaでは,変数名に下付きの文字を使うことができない.たとえば,以下のようにa_xという変数に一時的に1を代入して式を評価するようなことはできない.

Block[{Subscript[a, x] = 1}, (Subscript[a, x] + 1)^2]

f:id:y8ttyan:20160205123027p:plain

これは,a_xがシンボルではなく,オブジェクトとして定義されている.つまりa_x

Subscript[a,x]

という命令の略記になっている. どうしても変数名にa_xを使いたい場合は,Notationパッケージを読み込んで,Symbolizeすればよい.

Needs["Notation`"]
Symbolize[Subscript[a,x]]

f:id:y8ttyan:20160205123740p:plain

Notationを読み込むとパレットが表示されて,そこからSymbolizeを入力すると黄色い枠が出てくるので,その中に記述するらしい.

参考:How to create symbol whose name has subscript?

Symbolize—Wolfram言語ドキュメント

【Mathematica】PlotでPlotTheme->"Scientific"オプション使用時の色データ

mathematicaのPlotで色指定用のメモ.

ColorData[108, "ColorList"]

こうすると,PlotTheme->"Scientific"指定したときの色が出せる:

f:id:y8ttyan:20160201133944p:plain

Scientificのデザインを使いたいが,色は手動で割り当てたい場合は,

Plot[
    {Sin[x],Cos[x]},
    PlotTheme->"Scientific",
    PlotStyle->{ColorData[108,2],ColorData[108,1]}
]

という感じに色を指定すれば良い.

ちなみに,ColorDataは1から113まであり,

Table[
  {n,
   ColorData[n, "ColorList"]
   }
  , {n, 1, 113}
  ] // MatrixForm

みたいにすると,全色一覧を得られる.他のテーマのカラーも探すと良いかも.

C言語でディスク(HDD)の残り容量を測定してプログラムを自動停止する方法

数値計算でファイルにデータを大量に書き出すと,いっぱいになってマシンがフリーズすることがある. そこで,ディスクの残り容量を取得して,指定MB以下で自動停止させるサブルーチンを作成してみた.

ヘッダーファイル:

//
//  checkDiskSize.h
//  ディスクの容量をチェックして,空き容量が少ないときは終了させるルーチン.
//
//  Created by 8ttyan on 2016/01/31.
//
//

#ifndef ____checkDiskSize__
#define ____checkDiskSize__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

double checkDiskSize(int);
// checkDiskSize(空容量が何MB以下で停止させるかを指定);
// 戻り値は空き容量の割合(0.0-1.0)

#endif /* defined(____checkDiskSize__) */

プログラムファイル:

//
//  checkDiskSize.c
//  
//
//  Created by 8ttyan on 2016/01/31.
//
//

#include "checkDiskSize.h"

double checkDiskSize(int threthold) {
    
    FILE *pipe;         // パイプ用ストリーム
    char results[1024]; // コマンドの実行結果
    int vacant;        // 空き容量をMBで
    char command[1024]="/bin/df -m | /usr/bin/awk '{if($9 == \"/\"){print $4}}'";    // コマンド文字列作成.MB単位で残り容量を得る
    if((pipe = popen(command, "r")) == NULL) {      // コマンド実行
        pclose(pipe);                               // パイプを閉じる
        return -1.0;
    }
    while (fgets(results, 1024, pipe) != NULL);     // 実行結果取得
    
    pclose(pipe);                                   // パイプを閉じる
    sscanf(results, "%d\n", &vacant);               // 文字列を数値に変換
    if (vacant < threthold) {                       // 指定容量を下回った場合
        printf("checkDiskSize() : Less disk capacity! ディスク容量が足りません!\n");   // 標準出力に表示
        fflush(stdout);                             // フラッシュする
        exit(EXIT_FAILURE);                         // プログラムを終了する
    }
    
    return vacant;
    
}

メインファイル内での使用例:

#include <stdio.h>
#include "checkDiskSize.h"

int main() {

    printf("現在のディスク空きは%f%%です.\n", checkDiskSize(1024)*100);   // 空き容量が1024MBを下回る場合にはプログラム終了.下回らない場合には,空き容量の全体に占める割合を表示
    
    return 0;

}

何度もファイルを書き出すプログラムの場合,このような処理をファイル書き出しのたびに行うと,ディスクがパンパンになるのを防ぐ事が出来る.

LaTeXで数式にアンダーラインを引いて下にコメントを書く方法

アンダーラインを引くunderlineと,数式の下に文章を書くundersetを組み合わせる.

\begin{align}
   \underset{コメント}{\underline{abc}}
\end{align}

f:id:y8ttyan:20160126165946p:plain

lsコマンドでディレクトリだけ表示

-dオプションでディレクトリ内部を検索しないようにした上で,検索対象の末尾にスラッシュをつける:

ls -d */

スラッシュ(/)を消去する場合は

echo $(ls -d */) | sed 's/\///g'

※スラッシュ消去だけでなく,改行?が入ってしまうため,echoする必要がある.

最後に,シェルの変数に代入し,各ディレクトリに対するループ処理をしてみる.

myDIRs=$(echo $(ls -d */) | sed 's/\///g')
for aDIR in ${myDIRs}
do
  #何らかの処理
done

MathematicaでListをプロットしたらすべて同じ色になる現象の回避方法

Mathematicaでプロットする関数をリストで指定したり,Table関数を入れ子にして一つのグラフで描画すると,そのままだとすべての線が同一色になってしまう. これはEvaluate関数を使うと通常通り自動で色付けがされる. 例えば

Plot[
 Table[Sin[n*x], {n, 1, 3}]
 , {x, 0, 2 \[Pi]}
 ]

とか記述するとすべて同一色になる: f:id:y8ttyan:20160124202011p:plain

Evaluate関数で囲むと

Plot[
 Evaluate[Table[Sin[n*x], {n, 1, 3}]]
 , {x, 0, 2 \[Pi]}
 ]

f:id:y8ttyan:20160124202142p:plain

ちゃんとすべて違う色付けができる.