Edited at

上司のターミナルに汽車を走らせよう!

More than 1 year has passed since last update.


この記事をご覧になっている、そこのあなた。

仕事中にこんなことはありませんか?



上司から無理な依頼をされた。ちくしょう。。。

わかります。その気持ち。ええ。








そんな上司の作業中のターミナル(端末)に汽車を走らせてやりましょう!!








まずは準備。



①上司が作業しているホストを探そう

何かしらの方法でげっとします。(鬼門)

私は上司のモニターを後ろからこっそり覗いてやりました。




のんびり開発してるわ。


馬鹿め。

上司が開発しているサーバ情報をげっと。

インフラエンジニアの私は上司のサーバにアクセス。


②汽車を流すプログラムを書く

https://github.com/mtoyoda/sl

ここを参考に。

$ cd /tmp

$ mkdir train
$ cd train

$ vim test.c

#include <signal.h>
#include <unistd.h>
/*こいつはカーソルを移動させたり、画面上の文字列を移動させたりする*/
#include <curses.h>
/*AAが書かれてるライブラリの読み込み*/
#include "test.h"

int add_FUGA(int x);

int mvfuga(int y, int x, char *str);
void add_man(int y, int x);
int mvfuga(int y, int x, char *str)
{
for ( ; x < 0; ++x, ++str)
if (*str == '\0') return ERR;
for ( ; *str != '\0'; ++str, ++x)
if (mvaddch(y, x, *str) == ERR) return ERR;
return OK;
}

int main()
{
int x;

/* 初期化*/
initscr();
/*対話的なシグナルの受け取り*/
signal(SIGINT, SIG_IGN);
/*カーソルキーの入力を受け取るが画面に表示しない*/
noecho();
/*カーソルを表示しない*/
curs_set(0);
nodelay(stdscr, TRUE);
leaveok(stdscr, TRUE);
scrollok(stdscr, FALSE);

/*横の動き*/
for (x = COLS - 1; ; --x) {
if (add_FUGA(x) == ERR) break;
/*キーボードから入力した文字を読み込むが画面には表示しない*/
getch();
/*画面再表示*/
refresh();
/*0.04秒待つ*/
usleep(40000);
}
/*前の位置から移動。mvcur(oldrow, oldcol, newrow, newcol)*/
mvcur(0, COLS - 1, LINES - 1, 0);
/*端末をリセットし、標準入出力が出来るように戻す*/
endwin();
}

int add_FUGA(int x)
{
static char *foo[FUGAPATTERNS][FUGAHIGHT + 1]
= {{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL11, FUGAWHL12, FUGAWHL13, FUGADEL},
{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL21, FUGAWHL22, FUGAWHL23, FUGADEL},
{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL31, FUGAWHL32, FUGAWHL33, FUGADEL},
{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL41, FUGAWHL42, FUGAWHL43, FUGADEL},
{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL51, FUGAWHL52, FUGAWHL53, FUGADEL},
{FUGABODY1, FUGABODY2, FUGABODY3, FUGABODY4, FUGABODY5, FUGABODY6, FUGABODY7,
FUGAWHL61, FUGAWHL62, FUGAWHL63, FUGADEL}};

int y, i = 0;

if (x < - FUGALENGTH) return ERR;
y = LINES / 2 - 5;

for (i = 0; i <= FUGAHIGHT; ++i) {
mvfuga(y + i, x, foo[(FUGALENGTH + x) % FUGAPATTERNS][i]);
}
add_man(y + 2, x + 43);
return OK;
}

void add_man(int y, int x)
{
/*あなたの上司の名前にしましょう*/
static char *man[2][2] = {{" Dear ", "(O)"}, {"TAKASHI!", "\\O/"}}; int i;

for (i = 0; i < 2; ++i) {
mvfuga(y + i, x+10, man[(LOGOLENGTH + x) / 12 % 2][i]);
}
}

$ vim test.h

#define FUGAHIGHT 10
#define FUGALENGTH 50
#define FUGAPATTERNS 6

#define LOGOLENGTH 84

#define FUGABODY1 " ==== ________ ___________ "
#define FUGABODY2 " _D _| |_______/ \\__I_I_____===__|_________| "
#define FUGABODY3 " |(_)--- | H\\________/ | | =|___ ___| "
#define FUGABODY4 " / | | H | | | | ||_| |_|| "
#define FUGABODY5 " | | | H |__--------------------| [___] | "
#define FUGABODY6 " | ________|___H__/__|_____/[][]~\\_______| | "
#define FUGABODY7 " |/ | |-----------I_____I [][] [] D |=======|__ "

#define FUGAWHL11 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ "
#define FUGAWHL12 " |/-=|___|= || || || |_____/~\\___/ "
#define FUGAWHL13 " \\_/ \\O=====O=====O=====O_/ \\_/ "

#define FUGAWHL21 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ "
#define FUGAWHL22 " |/-=|___|=O=====O=====O=====O |_____/~\\___/ "
#define FUGAWHL23 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "

#define FUGAWHL31 "__/ =| o |=-O=====O=====O=====O \\ ____Y___________|__ "
#define FUGAWHL32 " |/-=|___|= || || || |_____/~\\___/ "
#define FUGAWHL33 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "

#define FUGAWHL41 "__/ =| o |=-~O=====O=====O=====O\\ ____Y___________|__ "
#define FUGAWHL42 " |/-=|___|= || || || |_____/~\\___/ "
#define FUGAWHL43 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "

#define FUGAWHL51 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ "
#define FUGAWHL52 " |/-=|___|= O=====O=====O=====O|_____/~\\___/ "
#define FUGAWHL53 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "

#define FUGAWHL61 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ "
#define FUGAWHL62 " |/-=|___|= || || || |_____/~\\___/ "
#define FUGAWHL63 " \\_/ \\_O=====O=====O=====O/ \\_/ "

#define FUGADEL " "

$ vim Makefile

CC=gcc
CFLAGS=-O

test: test.c test.h
$(CC) $(CFLAGS) -o test test.c -lncurses


③テストで走らせてみよう

$ make

$ /tmp/train/test






よし。


④上司のターミナルで汽車を走らせよう!

$ w

私の上司、takashiが/dev/pts/○○ だと言う事が判明。

すかさずコマンド投入。

$ /tmp/train/test > /dev/pts/○○







ポッポー





Dear TAKASHI!


達成。本当にありがとうございました。


⑤最後に

障害時など、大事なときはダメ。絶対。

決して怒らない、ユーモアたっぷりで温厚で優しい上司にやってね!