2025
11
08
2013
08
21
apt-getのイースターエッグ
イースターエッグって知ってますか?
ソフトウェア開発者が遊び心でプログラムに入れる機能ですね。
特定のボタン同時押しすると、シグナルが飛んで行ったりして、
LEDを一定時間クリスマスツリーのようにチカチカさせるとかね。
(まぁ遊び機能を付け加えるほど、立派でないし、余裕もないし、その力を開発に入れるべきですね。。)
最近イースターエッグのあるプログラムを知ったので書いてみる。
apt-getに 「moo」をつけると、↓が出ます。
牛www
aptitudeコマンドにもあるみたいです、そっちは探すの苦戦するかもです笑
ヒントはaptitude -h!
終わり
2013/08/21 (Wed.) Comment(0) Linux
2013
08
21
会場の様子
1年放置してしまったので、再開していきたいと思います(葬式のようなテンションでこの文を書いています)
この1年はDDRばかり、ほんとうにDDRばっかりしていました。(これからも続ける所存です)
DDRのことはこちら→https://twitter.com/nex2t_ddr
とりあえず前回の記事からの続きとして会場の様子などupしてみます。
ちょっと斜めから全体を。
サーバ(デーモン)に接続して、現在ログイン中のユーザーをGUIでリスト表示し、
相手に対戦を申し込む画面。ネットワークにつながっていないので、ローカルホスト内で
サーバもクライアントも動いています。
電源がなかったため、マルチディスプレイとかもできず、印刷したものを置いてるww
正面 (ちゃっちいですね)
人が(珍しく)来たら、PCの画面上で実際に、対戦開始して、駒が勝手に更新して動いていくのを
ディスプレイしてました。
2013/08/21 (Wed.) Comment(0) コミケ82
2012
08
20
nex2t shogi のページ
8/20
C82でブースに来ていただいた方、ありがとうございました。
C82で領布させていただいたnex2t shogi(β版)ですが、
今日月曜日修正したものをアップする予定だったのですが、
本業のほうが少々忙しく進みが芳しくないので、
ちゃんとしたものをアップできるのは、9月半ばごろになりそうです。
(きちんと終わらせるってのは大変ですね。。)
とりあえず領布したものを公開したいと思います。
領布したもの(zip)
2012/08/20 (Mon.) Comment(0) nex2t shogi
2012
08
01
【コミケ専用ページ】Linuxネット対戦将棋ゲーム
コミケC82でゲームを出します。
参加日は8/11日(土)、場所は「西は09b」です。
サークル名はハンネと同じnex2tです。
出し物はネット対戦できる将棋ゲームです。
まだまだ機能を付けきれていないので、
β版としてCD-ROMを無料配布させていただきます。
(β版じゃなくてもずっと無料です)
将棋・Linux・GTK+・ネットワークプログラミング・C言語など
が好きな方興味がある方、ぜひもらっていってください!
将棋のゲーム作り中画面↓です。
以下ソフトウェア説明。
★は現在制限機能
ソフトウェア名:nex2t shogi
概要:普通の将棋に無いカオスフルなルールで対戦できる将棋ソフト
動作環境:Linux (現状Windowsでは動きません)
主な機能
・ネットワーク対戦可能 (世界中の人とできます)
・ユーザ情報登録可(戦歴や通信切れなどが記憶されます)(メアドなどわずらわしい登録は無いです。)
・CPU対戦モード有★
・チャット可★
・棋譜記録・再生・出力機能★
・対戦見学★
・カオスフルなルール★
ワープ (指定した駒を好きな場所へ移動できる)
地雷 (指定した場所を踏んだ駒を消滅させられる)
消滅 (指定した駒を消滅させられる)
合体 (駒と駒を合体できる) (駒の効きを単純に合体させるか、足し算にするかは検討中)
伏兵 (指定したタイミングであらかじめ配置しておいた駒を出現させることができる)
ランダムスタート (初期配置をランダムにできる)
場所入れ替え (盤上の2つの味方駒を入れ替えできる)
貫通 (1マスのみ壁を乗り越えさせて効かせられる)
裏切り (盤上の相手の歩・桂・香を味方に変更できる)
二歩あり (二歩で駒を置ける)
etc..
~カオスフルルールについて~
カオスフルなルールは、対戦開始時に使用したいカオス機能をカオスフルゲージの範囲
内で好きなように選択して対戦できるものです。
有益なカオス機能であればあるほどゲージを消費するためカオス機能によっては1つしか
カオス機能を選択できない
みたいなゲームです。
ということでして、上記制限事項のように配布する際はカオスなルールで将棋できないのですが、
普通に将棋はできるとこまでしていきたいと思います。(ロビーに入って対戦を始める部分がまだ未完成です。。)
よろしくお願いいたします。
2012/08/01 (Wed.) Comment(0) コミケ82
2012
06
30
strncpyを使った安全な文字列コピー(C言語)
コピー元の文字列の長さが不明な時用のメモリ破壊を起こさない 文字列コピーの方法について、strncpyの動作を見ながら確認したメモ 結論から言うと strncpy(dst, src, DST_BUFF_LEN); dst[DST_BUFF_LEN-1] = '\0'; すれば破壊は起きない、ただsrcをコピーしきれないことがある。 下記のソースを試したコンパイラバージョンは gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)です。
ソースコード
/* nex2t_strncpy.c */
#include <stdio.h>
#include <string.h>
#define EX_STR "0123456789abcdefghij"
#define EX_STR2 "01234"
#define BUF_LEN 16
#define DEBUG_LINE "---------------------------------------------------------\n"
int main(void)
{
int i;
char buf[BUF_LEN];
/* -------------------------------------------------------------- */
printf(DEBUG_LINE);
printf("use buffer buf[BUF_LEN] BUF_LEN=%d\n", BUF_LEN);
printf(DEBUG_LINE);
printf("EX_STR:%s [strlen(EX_STR):%ld, sizeof(EX_STR):%ld]\n", EX_STR,
strlen(EX_STR), sizeof(EX_STR));
printf(" (over buf[BUF_LEN] size!!)\n");
printf(DEBUG_LINE);
printf("EX_STR2:%s [strlen(EX_STR2):%ld, sizeof(EX_STR2):%ld]\n",
EX_STR2, strlen(EX_STR2), sizeof(EX_STR2));
printf(" (not over buf[BUF_LEN] size)\n");
printf(DEBUG_LINE "\n");
/* ---- Init after ----------------------------------------------- */
printf("Init after\n");
printf(DEBUG_LINE);
for (i = 0; i < BUF_LEN; i++) {
buf[i] = '\0';
}
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
/* ---- Normal_1 ------------------------------------------------ */
printf("Normal_1\n");
printf(DEBUG_LINE);
strncpy(buf, EX_STR, 5);
printf("strncpy(buf, EX_STR, 5);\n");
printf("result:string:%s [strlen(buf):%ld, sizeof(buf):%ld]\n", buf,
strlen(buf), sizeof(buf));
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
/* init */
for (i = 0; i < BUF_LEN; i++) {
buf[i] = '\0';
}
/* ---- Normal_2 ----------------------------------------------- */
printf("Normal_2\n");
printf(DEBUG_LINE);
strncpy(buf, EX_STR, BUF_LEN);
printf("strncpy(buf, EX_STR, BUF_LEN);\n");
printf("result:string:%s [strlen(buf):%ld, sizeof(buf):%ld]\n", buf,
strlen(buf), sizeof(buf));
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
printf("***Not write '\\0' automatically!! (buf[%d] = %d)\n",
BUF_LEN-1, buf[BUF_LEN-1]);
printf("***Not write buf[BUF_LEN] (buf[%d] = %d)\n\n",
BUF_LEN, buf[BUF_LEN]);
/* not init */
/*
for (i = 0; i < BUF_LEN; i++) {
buf[i] = '\0';
}
*/
/* ---- Normal_3 ----------------------------------------------- */
printf("Normal_3\n");
printf(DEBUG_LINE);
strncpy(buf, EX_STR2, BUF_LEN);
printf("strncpy(buf, EX_STR2, BUF_LEN);\n");
printf("result:string:%s [strlen(buf):%ld, sizeof(buf):%ld]\n", buf,
strlen(buf), sizeof(buf));
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
printf("***automatically write '\\0' to buf[15]\n");
/* ---- Extra ------------------------------------------------- */
printf("\nExtra\n");
printf(DEBUG_LINE);
strncpy(buf, EX_STR, 0);
printf("strncpy(buf, EX_STR, 0);\n");
printf("result:string:%s [strlen(buf):%ld, sizeof(buf):%ld]\n", buf,
strlen(buf), sizeof(buf));
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
printf("Not write any.\n\n");
/* ---- Right usage ------------------------------------------- */
printf("Right usage\n");
printf(DEBUG_LINE);
strncpy(buf, EX_STR, BUF_LEN);
buf[BUF_LEN-1] = '\0';
for (i = 0; i < BUF_LEN; i++) {
printf("buf[%d] = %d\n", i, buf[i]);
}
printf("buf[BUF_LEN] = %d (secretly watch.)\n\n", buf[BUF_LEN]);
printf("strncpy(buf, EX_STR, BUF_LEN); after buf[BUF_LEN-1] = '\\0';");
return 0;
}
コンパイル例
gcc -W -Wall -o nex2t_strncpy nex2t_strncpy.c
実行結果
./strncpy
---------------------------------------------------------
use buffer buf[BUF_LEN] BUF_LEN=16
---------------------------------------------------------
EX_STR:0123456789abcdefghij [strlen(EX_STR):20, sizeof(EX_STR):21]
(over buf[BUF_LEN] size!!)
---------------------------------------------------------
EX_STR2:01234 [strlen(EX_STR2):5, sizeof(EX_STR2):6]
(not over buf[BUF_LEN] size)
---------------------------------------------------------
Init after
---------------------------------------------------------
buf[0] = 0
buf[1] = 0
buf[2] = 0
buf[3] = 0
buf[4] = 0
buf[5] = 0
buf[6] = 0
buf[7] = 0
buf[8] = 0
buf[9] = 0
buf[10] = 0
buf[11] = 0
buf[12] = 0
buf[13] = 0
buf[14] = 0
buf[15] = 0
buf[BUF_LEN] = 0 (secretly watch.)
Normal_1
---------------------------------------------------------
strncpy(buf, EX_STR, 5);
result:string:01234 [strlen(buf):5, sizeof(buf):16]
buf[0] = 48
buf[1] = 49
buf[2] = 50
buf[3] = 51
buf[4] = 52
buf[5] = 0
buf[6] = 0
buf[7] = 0
buf[8] = 0
buf[9] = 0
buf[10] = 0
buf[11] = 0
buf[12] = 0
buf[13] = 0
buf[14] = 0
buf[15] = 0
buf[BUF_LEN] = 0 (secretly watch.)
Normal_2
---------------------------------------------------------
strncpy(buf, EX_STR, BUF_LEN);
result:string:0123456789abcdef [strlen(buf):16, sizeof(buf):16]
buf[0] = 48
buf[1] = 49
buf[2] = 50
buf[3] = 51
buf[4] = 52
buf[5] = 53
buf[6] = 54
buf[7] = 55
buf[8] = 56
buf[9] = 57
buf[10] = 97
buf[11] = 98
buf[12] = 99
buf[13] = 100
buf[14] = 101
buf[15] = 102
buf[BUF_LEN] = 0 (secretly watch.)
***Not write '\0' automatically!! (buf[15] = 102)
***Not write buf[BUF_LEN] (buf[16] = 0)
Normal_3
---------------------------------------------------------
strncpy(buf, EX_STR2, BUF_LEN);
result:string:01234 [strlen(buf):5, sizeof(buf):16]
buf[0] = 48
buf[1] = 49
buf[2] = 50
buf[3] = 51
buf[4] = 52
buf[5] = 0
buf[6] = 0
buf[7] = 0
buf[8] = 0
buf[9] = 0
buf[10] = 0
buf[11] = 0
buf[12] = 0
buf[13] = 0
buf[14] = 0
buf[15] = 0
buf[BUF_LEN] = 0 (secretly watch.)
***automatically write '\0' to buf[15]
Extra
---------------------------------------------------------
strncpy(buf, EX_STR, 0);
result:string:01234 [strlen(buf):5, sizeof(buf):16]
buf[0] = 48
buf[1] = 49
buf[2] = 50
buf[3] = 51
buf[4] = 52
buf[5] = 0
buf[6] = 0
buf[7] = 0
buf[8] = 0
buf[9] = 0
buf[10] = 0
buf[11] = 0
buf[12] = 0
buf[13] = 0
buf[14] = 0
buf[15] = 0
buf[BUF_LEN] = 0 (secretly watch.)
Not write any.
Right usage
---------------------------------------------------------
buf[0] = 48
buf[1] = 49
buf[2] = 50
buf[3] = 51
buf[4] = 52
buf[5] = 53
buf[6] = 54
buf[7] = 55
buf[8] = 56
buf[9] = 57
buf[10] = 97
buf[11] = 98
buf[12] = 99
buf[13] = 100
buf[14] = 101
buf[15] = 0
buf[BUF_LEN] = 0 (secretly watch.)
strncpy(buf, EX_STR, BUF_LEN); after buf[BUF_LEN-1] = '\0';
検索用タグ C言語 strncpy 安全
2012/06/30 (Sat.) Comment(0) C言語
