[PYTHON] Exécutez la matrice sur le terminal de votre patron!

Le 12e jour de Livesense Advent Caelendar 2015 est @sion_cojp.

Regarder en arrière ...

J'avais l'habitude de travailler comme ingénieur d'infrastructure, et quand j'étais malade, je conduisais un train jusqu'au terminal de mon patron. Je passe maintenant à un autre département en tant qu'ingénieur d'application Web et développe des API.

Vous regardez cet article.

Avez-vous ce genre de choses au travail?


J'ai changé de département, mais après tout mon patron a fait une demande déraisonnable. Allons-y. .. .. </ b>

Je comprends. Ce sentiment. Ouais. ~~ J'ai tellement déménagé, alors j'aimerais pouvoir acheter des sushis chers. .. ~~ Mais je dois vous remercier de pouvoir bouger. La société est compliquée, n'est-ce pas?





Lançons la matrice vers le terminal où travaille le boss! !! </ b>







Tout d'abord, la préparation.


① Trouvez l'hôte sur lequel travaille votre patron

Je serai malade d'une certaine manière. (Kimon) Encore une fois, je me suis faufilé dans l'écran de mon patron par derrière.


Je suis décontracté et je lutte avec le code hérité de PHP.

Stupide. </ b>

Obtenez les informations sur le serveur que votre patron développe.

② Ecrivez un programme pour exécuter la matrice.

Faites-le correctement. Frappons MATRIX_ANGRY_CHARS avec colère. Comme vous pouvez le voir en exécutant le programme, soyez assuré que la partie en colère est de ne pas être chauve </ b>.
Remercions MATRIX_THANKS_CHARS.

matrix_curses.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals
import locale
import time
import curses
import sys, string
import random
import struct
locale.setlocale(locale.LC_ALL, '')
encoding = locale.getpreferredencoding()

########################################################################
# const

MIN_SPEED = 1
MAX_SPEED = 2
MATRIX_ANGRY_CHARS = "Je peux me contacter en retard, pas par e-mail, mais par chat. Je veux taper Hadoken. Je suis presque parti."
MATRIX_THANKS_CHARS = "THANKS DEAR TAKU !!!"
MATRIX_COLOR_WORD = 46
MATRIX_COLOR_BACK = 232

########################################################################

class FallingChar(object):
    matrixchr = list(MATRIX_ANGRY_CHARS)
    normal_attr = curses.A_NORMAL
    highlight_attr = curses.A_REVERSE

    def __init__(self, width, MIN_SPEED, MAX_SPEED):
        self.x = 0
        self.y = 0
        self.speed = 1
        self.char = ' '
        self.reset(width, MIN_SPEED, MAX_SPEED)

    def reset(self, width, MIN_SPEED, MAX_SPEED):
        self.char = random.choice(FallingChar.matrixchr).encode(encoding)
        self.x = random.randint(1, width - 1)
        self.y = 0
        self.speed = random.randint(MIN_SPEED, MAX_SPEED)

    def tick(self, scr):
        height, width = scr.getmaxyx()
        self.out_of_screen_reset(width, height)
        scr.addstr(self.y, self.x, self.char, curses.color_pair(1))
        self.char = random.choice(FallingChar.matrixchr).encode(encoding)
        self.y += 1
        if not self.out_of_screen_reset(width, height):
            scr.addstr(self.y, self.x, self.char, curses.A_REVERSE)

    def out_of_screen_reset(self, width, height):
        if self.x > width-2:
            self.reset(width, MIN_SPEED, MAX_SPEED)
            return True
        if self.y > height-2:
            self.reset(width, MIN_SPEED, MAX_SPEED)
            return True
        return False

def rand():
    a = 1
    while True:
        a ^= (a << 1);
        a ^= (a >> 135);
        a ^= (a << 104);
        yield a

r = rand()
def randint(_min, _max):
    n = r.next()
    return (n % (_max - _min)) + _min

def color():
    curses.start_color()
    curses.init_pair(1, MATRIX_COLOR_WORD, MATRIX_COLOR_BACK)
    curses.curs_set(0)
    curses.noecho()

def main():
    scr = curses.initscr()
    scr.nodelay(1)
    color()

    height, width = scr.getmaxyx()
    lines = []
    for i in range(8):
        l = FallingChar(width, MIN_SPEED, MAX_SPEED)
        lines.append(l)

    scr.refresh()
    while True:
        for line in lines:
            line.tick(scr)
        for i in range(30):
            x = randint(0, width-1)
            y = randint(0, height-1)
            scr.addstr(y, x, ' ')

        scr.refresh()
        time.sleep(0.04)

def last_main():
    curses.endwin()
    curses.curs_set(1)
    curses.reset_shell_mode()
    curses.echo()

    screen = curses.initscr()
    color()
    lastchr = string.join(list(MATRIX_THANKS_CHARS), " ")

    last_height, last_width = screen.getmaxyx()
    start_width = last_width/2 - len(lastchr)/2
    for i in range(last_height/2):
        screen.clear()
        screen.addstr(i, start_width, lastchr, curses.color_pair(1))
        screen.refresh()
        time.sleep(0.2)
    screen.getch()
    curses.endwin()

try:
    main()
except KeyboardInterrupt:
    try:
        last_main()
    except KeyboardInterrupt:
        curses.endwin()
        curses.curs_set(1)
        curses.reset_shell_mode()
        curses.echo()

Faisons le test

$ python /tmp/matrix_curses.py




Bien. </ b>

④ Lançons la matrice au terminal du boss!

$ w

Il s'avère que mon patron, taku, est / dev / pts / ○○. Entrée de commande immédiatement.

$ python /tmp/matrix_curses.py > /dev/pts/○○





mymovie1.gif

Appuyez ensuite sur ctrl + c lorsque vous êtes satisfait ou que la colère de votre patron est au maximum.

mymovie2.gif



THANKS DEAR TAKU!!!

Atteint. Je vous en suis vraiment reconnaissant. </ b>

⑤ Enfin

Ne l'utilisez pas lorsque c'est important, par exemple en cas de panne. Absolument. Donnez-le à votre patron humoristique, chaleureux et doux qui ne se fâche jamais!

Recommended Posts