怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

C言語: 環境変数を取得する | getenv()

C言語で環境変数を取得するには getenv() を使う。

次のプログラムは環境変数 TEMP の内容を出力する。

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

int main() {
    char *env_value;

    env_value = getenv("TEMP");
    if (env_value == NULL) {
        printf("There are no environment variables.\n");
        return 1;
    } else {
        printf("value: %s\n", env_value);
        return 0;
    }
}

getenv()

getenv() は環境変数を取得する。

#include <stdlib.h>

char *getenv(const char *name);

引数 name には環境変数名を指定する。

戻り値として環境変数の値のポインターを返す。
該当する環境変数が存在しないときは NULL ポインターを返す。

Oracle - exp コマンドでデータをエクスポートする

exp コマンドで Oracle のデータをエクスポートできる。

exp のエクスポートモード

exp には次の4種類のエクスポートモードがある。

  • 全体: データベース全体をエクスポートする
  • 表領域: 指定した表領域をエクスポートする(使ったことがないので詳しいことはわからない)
  • ユーザー: 指定したユーザーが所有するすべてのオブジェクトをエクスポートする
  • : 指定した表をエクスポートする

exp の構文

exp の基本的な構文は次のとおり。

exp 〈ユーザー/パスワード〉 〈エクスポートモード〉 〈ダンプファイル〉 〈そのほかの引数〉

データベース全体をエクスポートする

データベース全体をエクスポートするには全体モードを使う。

exp のエクスポートモードには full=y を指定する。

exp scott/tiger full=y file=/path/to/dumpfile.dmp

表領域をエクスポートする

表領域をエクスポートするには表領域モードを使う。

exp のエクスポートモードには tablespaces=〈エクスポートする表領域名〉 を指定する。

exp scott/tiger tablespaces=tablespace file=/path/to/dumpfile.dmp

ユーザーをエクスポートする

ユーザーが所有するオブジェクトをすべてエクスポートするには、ユーザーモードを使う。

所有するオブジェクトとは、表・権限・索引・ストアドプロシージャ―などを指す。

exp のエクスポートモードには owner=〈エクスポートするユーザー名〉 を指定する。

exp scott/tiger owner=scott file=/path/to/dumpfile.dmp

表をエクスポートする

指定したテーブルをエクスポートするには表モードを使う。

exp のエクスポートモードには tables=〈テーブル名〉 を指定する。

複数のテーブルを指定する場合はカンマ区切りで指定する。また、テーブルのリストを括弧で囲む。

exp scott/tiger tables=\(TBL1, TBL2, TBL3\) file=/path/to/dumpfile.dmp

ファイルの出力先を指定する

ダンプファイルの出力先は file= に指定する。

余談

exp は『オリジナルのエクスポート・ユーティリティ」と呼ばれる。

exp は Oracle 11g からは原則としてサポートされなくなった。
Oracle 11g からは exp ではなくデータ・ポンプ・エクスポート(expdp)の使用が推奨されている。

とは言っても expdp はサーバー側で処理が実行され、ダンプファイルもサーバーに保存されるため、微妙に使いにくい(と思っている)。

C言語: 現在の日時を取得する(2) | time(), localtime()

ちょっと前に、gettimeofday()localtime() を使って現在の日時を取得する方法を書いた。


実はマイクロ秒が必要ないなら gettimeofday() ではなく time() を使ったほうがシンプルにできる。
sys/time.h ファイルのインクルードも不要になる。

ここに time() を使う方法も書いておく。


次の手順で現在の日時を取得できる。

  1. time() でUNIX時間を取得
  2. UNIX時間を localtime() で tm 構造体に変換

次のプログラムは現在の日時を yyyy/MM/dd HH:mm:ss 形式で出力する。

#include <stdio.h>
#include <time.h>

void main() {
    /* UNIX時間を取得 */
    time_t currentTime;
    time(&currentTime);

    /* UNIX時間を tm 構造体に変換 */
    struct tm *tmptr = localtime(&currentTime);
    if (tmptr == NULL) {
        printf("localtime failed\n");
        return;
    }

    /* tm 構造体の内容を出力(yyyy/MM/dd HH:mm:ss 形式) */
    printf("%04d/%02d/%02d %02d:%02d:%02d\n",
           tmptr->tm_year + 1900,
           tmptr->tm_mon + 1,
           tmptr->tm_mday,
           tmptr->tm_hour,
           tmptr->tm_min,
           tmptr->tm_sec);
}

time()

time() は、UNIX時間(1900年1月1日午前0時0分0秒(UTC)からの経過秒)を取得する。

#include <time.h>

time_t time(time_t *tloc);

UNIX時間は、引数のポインタが指す変数に格納されるほか、戻り値としても返される。
(引数には NULL の指定も可)

もし、時間が取得できなかった場合、((time_t) -1) が返される。

例)次のプログラムはUNIX時間を出力する。

#include <stdio.h>
#include <time.h>

int main() {
    time_t currentTime;
    if ( time(&currentTime) == -1 ) {
        printf("time failed");
        return 1;
    }

    printf("UNIX time: %ld\n", currentTime);

    return 0;
}

↓ 実行結果

UNIX time: 1711466460

C言語: 現在の日時を取得する(1) | gettimeofday(), localtime()

C言語で現在の日時を取得するには次のようにする。

  1. gettimeofday() でUNIX時間を取得
  2. UNIX時間を localtime() で tm 構造体に変換

次のプログラムは現在の日時を yyyy/MM/dd HH:mm:ss.fff 形式で出力する。

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

void main() {
    /* UNIX時間を取得 */
    struct timeval tv;
    if ( gettimeofday(&tv, NULL) != 0 ) {
        printf("gettimeofday failed\n");
        return;
    }

    /*
     * NOTE: MinGW 環境は tv_sec が long なので time_t にキャスト
     * struct tm *tmptr = localtime(&tv.tv_sec);
     */
    /* UNIX時間を tm 構造体に変換 */
    time_t currentTime = (time_t)tv.tv_sec;
    struct tm *tmptr = localtime(&currentTime);
    if (tmptr == NULL) {
        printf("localtime failed\n");
        return;
    }

    /* tm 構造体の内容を出力(yyyy/MM/dd HH:mm:ss.fff 形式) */
    printf("%04d/%02d/%02d %02d:%02d:%02d.%03d\n",
           tmptr->tm_year + 1900,
           tmptr->tm_mon + 1,
           tmptr->tm_mday,
           tmptr->tm_hour,
           tmptr->tm_min,
           tmptr->tm_sec,
           (int)(tv.tv_usec / 1000L));
}

gettimeofday()

gettimeofday() は、UNIX時間(1900年1月1日午前0時0分0秒(UTC))からの経過秒を取得する。

#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);

取得した時刻は、第1引数の timeval 構造体に格納される。

struct timeval {
    time_t      tv_sec;     /* 秒(UNIX時間) */
    suseconds_t tv_usec;    /* マイクロ秒 */
};

第2引数は廃止(obsolete)されている。
そのため timezone 構造体の代わりに NULL を指定する。

/* 第2引数はNULL */
struct timeval tv;
gettimeofday(&tv, NULL);

例)次のプログラムはUNIX時間を出力する。

#include <stdio.h>
#include <sys/time.h>

void main() {
    struct timeval tv;
    if ( gettimeofday(&tv, NULL) == 0 ) {
        /* 取得成功 */
        printf("seconds: %ld\n", tv.tv_sec);
        printf("microseconds: %ld\n", tv.tv_usec);
    } else {
        /* 取得失敗 */
        printf("gettimeofday failed\n");
    }
}

↓ 実行結果

seconds: 1696062600
microseconds: 435209

localtime()

UNIX時間を tm 構造体に変換する。

#include <time.h>

struct tm *localtime(const time_t *timep);

tm 構造体のメンバーは以下のとおり。

  • tm_sec 秒(0 - 59)
  • tm_min 分(0 - 59)
  • tm_hour 時(0 - 23)
  • tm_mday 日(1 - 31)
  • tm_mon 月(0 - 11、1月 = 0)
  • tm_year 年(実際の西暦から 1900 を引いた数)
  • tm_wday 曜日(0 - 6、日曜日 = 0)
  • tm_yday 年内の通算日(0 - 365、1月1日 = 0)
  • tm_isdst 夏時間が有効な場合は正の値。夏時間が有効でない場合は 0。夏時間の状態が不明な場合は負の値。

「写ルンです」値上げ、1980円→2860円へ

4月1日から「写ルンです」が値上げされた。

値上げ率は約44%で、価格にして880円アップ。
メーカー直販公式ショップのフジフイルムモールでは、販売価格が1980円から2860円になった。
それでも4月8日現在の在庫は、なしとなっている。

いま手に入れるには、Amazonで買うしかないってことかい?

値上げの原因は、部材・原材料価格、輸送コストが高騰しているから。

そうは言っても、これだけ値上げされてしまうと、もう趣味というより道楽の域である。
本体+現像+データ化で1本あたり5000円ってとこか。

もはや1ヶ月に1本使うのも厳しいかもしれない。

コストの内訳は↓

 ・写ルンです本体: 2860円
 ・カメラのキタムラのスマホ転送セット: 1830円

うーん、これ以上値上げされたら本当に使えなくなってしまう。

最後に一本使ってみるのもありかもしれないなぁ。

そういえば、写ルンですの撮影枚数はいつから27枚になったんだろうか。
40枚のイメージだったが(40枚じゃなくて39枚だっけ?)。

牛カルビに気づかされたこととは?

「あなたの胃は、もう昔のあなたの胃ではないのですよ」

そう気づかせてくれたのは、牛カルビだった。

……ちょっと待って!

なにこのエッセイ?!

すごい読みたいんですけど!

白央篤司・著
『はじめての胃もたれ』

VBScript に最適なシンタックスハイライト設定

はてなブログではコードブロックに色付けして表示ができる。

色付けする機能をシンタックスハイライトと言うんだが、ここでは VBScript に最適な設定を探してみたい。

ヘルプを見る限り、VBScript に使えそうな言語指定は「 aspvbs 」または「 vb 」の2つ。

同じソースコードに対して、それぞれを指定して結果を見てみる。

aspvbs

Dim conn
Set conn = CreateObject("ADODB.Connection")

'データベースに接続
conn.Open "Provider=OraOLEDB.Oracle; User ID=scott; Password=tiger; Data Source=ORCL;"

'~~~略~~~

'データベースとの接続を切断する
If conn.State <> 0 Then
    conn.Close
End If
Set conn = Nothing

vb

Dim conn
Set conn = CreateObject("ADODB.Connection")

'データベースに接続
conn.Open "Provider=OraOLEDB.Oracle; User ID=scott; Password=tiger; Data Source=ORCL;"

'~~~略~~~

'データベースとの接続を切断する
If conn.State <> 0 Then
    conn.Close
End If
Set conn = Nothing

結論

aspvbs はほとんど色付けされなかった。

vb はそれなりに色付けされた。

というわけで VBScript のコードブロックには vb の言語指定が最適だろう。