8ttyan’s blog

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

バッチファイルから別のバッチファイルを起動する方法

Windowsでバッチファイルから別のバッチファイルを起動する方法として、startとcallがあります。動作の違いは、

  • startで起動すると、別のプロセスで起動して、終了を待ちません

  • callで起動すると、同一のプロセスで起動して、終了を待ちます

となります。次の処理を待ちたい時は、callで起動することになりますが、同一プロセスのため、呼び出された側でsetした変数が呼び出し側に引き継がれてしまいます。Linuxでいうところのsourceに相当する動作となります。

異なるプロセスで起動しつつ終了を待つ(Linuxでいうところの./hoo.shという起動方法)をするには、

start/b/wait cmd /c foo.bat

とやると良いようです。

/bは同じウインドウで開くオプションです。

/waitはバッチファイルの終了を待ちます。

cmd /cをつけないと、ダブルクリックでバッチファイルを起動した時に、呼び出し側の処理が終了したときにコンソールが閉じません。

ちなみに、Windowsコマンドプロンプトでは、コマンド名とオプションの間のスペースは不要なため、start/b/waitと記述することができます。ただし、cmd /cのところはスペースを入れないとなぜか正しく動きません。

Windowsにおけるバッチファイルの起動方法をまとめると次のようになります。

Windows Linuxで相当する動作 プロセス 終了待ち ウインドウ
call foo.bat source bar.sh 同一 待つ 同一
start foo.bat - 異なる 待たない
start/b cmd /c foo.bat ./bar.sh & 異なる 待たない 同一
start/b/wait cmd /c foo.bat ./bar.sh 異なる 待つ 同一

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