Linux
C言語
上司への愛情
汽車

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

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

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


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

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






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







まずは準備。


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

何かしらの方法でげっとします。(鬼門)
私は上司のモニターを後ろからこっそり覗いてやりました。



のんびり開発してるわ。

馬鹿め。

上司が開発しているサーバ情報をげっと。
インフラエンジニアの私は上司のサーバにアクセス。

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

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/○○






ポッポー
スクリーンショット 2014-12-04 17.54.44.png


Dear TAKASHI!

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

⑤最後に

障害時など、大事なときはダメ。絶対。
決して怒らない、ユーモアたっぷりで温厚で優しい上司にやってね!