とにかく書く

日々の雑感や知り得たことを、とにかく書いています

覆面算WWWDOT - GOOGLE = DOTCOMを解く

C言語でやってみた。やっつけのひどいコードだけども。

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

/* WWWDOT - GOOGLE = DOTCOM: EとMは互換 */
/* W > G */
/* WDOTGLECM */
/* 012345678 */

typedef enum {
	false, true
} bool;

enum {
	W, D, O, T, G, L, E, C, M
};

long word(a1, a2, a3, a4, a5, a6)
{
	return a1 * 100000L + a2 * 10000L + a3 * 1000L + a4 * 100L + a5 * 10L + a6;
}

bool calculate(int a[])
{
	long WWWDOT, GOOGLE, DOTCOM;

	if (a[W] <= a[G]) {
		return false;
	}

	WWWDOT = word(a[W], a[W], a[W], a[D], a[O], a[T]);
	GOOGLE = word(a[G], a[O], a[O], a[G], a[L], a[E]);
	DOTCOM = word(a[D], a[O], a[T], a[C], a[O], a[M]);

	if ((WWWDOT - GOOGLE) == DOTCOM) {
		printf("%ld - %ld = %ld\n", WWWDOT, GOOGLE, DOTCOM);
		return true;
	}
	return false;
}

bool candidate(int c[])
{
	int b[] = {0,1,2,3,4,5,6,7,8,9, 0};
	static int index = 9;

	if (index < 0) {
		return false;
	}
	if (1 <= index) {
		memcpy(c, b, index * sizeof(b[0]));
	}
	if (index <= 8) {
		memcpy(&c[index], &b[index + 1], (9 - index) * sizeof(b[0]));
	}
	index --;

	return true;
}

void concatinate(int a[], int c[], int index)
{
	static bool used[9] = {0};
	int i;

	for (i = 0; i < 9; i ++) {
		if (false == used[i]) {
			a[index] = c[i];
			if (8 == index) {
				calculate(a);
				return;
			}
			else {
				used[i] = true;
				concatinate(a, c, index + 1);
				used[i] = false;
			}
		}
	}
}

int main()
{
	int a[9], c[9];

	while (candidate(c)) {		/* 9個の数字を取り出す */
		concatinate(a, c, 0);	/* 並び替えて検証する */
	}

	return EXIT_SUCCESS;
}

シェルスクリプトで半角スペースを含むファイル名を扱う

Bashシェルスクリプトで半角スペースを含むファイル名を扱うには、環境変数 IFS (Internal Field Separator) を改行だけにすればよい。

#!/bin/sh

IFS_BACKUP=$IFS
IFS=$'\n'

# スクリプトをここに書く

IFS=$IFS_BACKUP

滅多に遭遇しないながらも、ずっと昔から困っていた。昔は Windows からリネームソフトを使ったり、Emacs の wdired でスペース無しに置換したりしていた。さっそく Emacs の sh ファイルのテンプレートに追加した。

Sambaでファイルサーバ

HDDの容量が余っていたので、パーティションを分けて妻の写真フォルダ用にSambaでファイルサーバにしてみた。
HDDはバックアップ用と2つあるので、1つ目をパーティションを区切ってファイルをコピー、2つ目も同様にパーティションを区切ってコピーした。備忘録に手順を記しておく。

gparted を使った。ずっとfdiskとか使っていたけど、やっぱりGUIの方が視覚的にイメージできて楽だね。
[2015/11/28 追記] ファイルシステムに btrfs を選択するには、core/btrfs-progs のインストールが必要。

ArchLinuxでごく簡単にsambaサーバーを立ち上げる - opamp_sando's blog
を参考にさせていただき、自身の環境に合わせて読み替えた。とくに /etc/samba/smb.conf での設定は、sample の最後に書いてあるグループフォルダの設定にした。

  • バックアップ

もともと fcron で rsync を毎朝4時に実行してバックアップをとっていたので、新しいパーティションについても追記した。あと、日曜日まではファイルを残しつつバックアップをとって、日曜日に完全同期するようにしている。

$ fcrontab -e
#min hour days month dayOfWeek command
0 4 * * * /usr/bin/rsync --times --update --archive --verbose /mnt/hoge/ /mnt/hoge2/ >> ~/log/rsync
0 5 * * 7 /usr/bin/rsync --times --update --archive --verbose --delete /mnt/hoge/ /mnt/hoge2/ >> ~/log/rsync

こんな感じで。

ArchLinux から EPSON の PX-401A で印刷する

FreeBSD の時と同様に
Kosei's FreeBSD Blog: CUPSでCanon iP 4200プリンター を参考にgutenprint をドライバにして CUPS で印刷した。

aur にある epson-inkjet-printer-px-402a をドライバとして使うと印刷できなかった。あと、Epson 公式の Mandriva Linux 用にある PIPS はビルドには成功したけど、CUPS でドライバとして選択できなかった。(というよりビルドしたのはプリンタ共通のツールで、PX-401A のドライバは別っぽい。)

ちなみに Epson 公式の PIPS は、libpng12 でビルドしないとコンパイルエラーが起きる。
./Core/pips-filter/Makefile 内の INCLUDES にあるlibxml2の次へ -I/usr/include/libpng12 を追加することでビルドは通った。

Google Test でC言語のプログラムをテストする

Google TestC言語のプログラムをテストするようにできたのでメモ書き。

C言語でプログラムを書いていて、CUnit でテストコードを書いていたのだけれど、CU_ASSERT_EQUAL などで failure になっても「どんな値で failure になったのか」が分からなかった。Google Test なら

  • failure 時に、どういう結果のためにfailure かがわかる
  • テストの追加が簡単にできる
  • テスト結果が見やすい

ためにやってみた。

続きを読む

ディスクの初期化

WindowsUSBメモリを含むディスクを初期化する方法。diskpart コマンドを使う。
diskpartコマンドについては、@IT の記事に詳しいけれど、ディスクがそもそも使用不可などになっている場合の対処が書いていなかったので。

続きを読む