124
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LivesenseAdvent Calendar 2014

Day 4

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

Last updated at Posted at 2014-12-04

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

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


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

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






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






まずは準備。


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

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


のんびり開発してるわ。 #### 馬鹿め。

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

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

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!


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

⑤最後に

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

124
93
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
124
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?