25 Agustus 2021

Menampilkan Bendera Berkibar di Terminal Python

Masih dalam suasana Agustusan, iseng-iseng ngoprek Python supaya dapat menampilkan bendera merah putih yang berkibar pada layar barbasis text. Bisakah?

Jawabnya bisa! 

Untuk mewarnai huruf, dapat digunakan ANSI yang berupa Escape Control. Sedangkan untuk bendera digunakan fungsi sinus()

Tampilan Output



Source Code


<code>

    import math
    import time
    import random

    def sin_translate(x, **kwarg):
        xtrans=kwarg.get('xtrans', 1)
        ytrans=kwarg.get('ytrans', 1)
        x1 = x * xtrans
        sin = math.sin(math.radians(x1)) * ytrans
        return x1, sin

    def flag(x,w):
        grid = []
        ytrans = random.randint(10,20)/10
        for x in range(x, x+w):
            d, y = sin_translate(x, xtrans=10, ytrans=ytrans) #math.radians(x))
            #print(f'x={x}, d={d:0.2f}, y={y:0.2f}')
            y = round(y)
            grid.append((y-6, y, y+7))

        #print(grid)
        print('\033[2J')
        ymin = round(-ytrans-6)
        ymax = round(ytrans +7)

        for y in range(ymin, ymax
+1):

            for g in grid:
                a, m, b = g
                if a <= y <= m:
                    print('\033[31;41mM', end='')
                elif m < y <= b:
                    print('\033[37;47m:', end='')
                else:
                    print('\033[39;49m ', end='')
            print('\033[39;49m')


    x = 0
    while True:
        flag(x, 60)
        print('INDONESIA TANGGUH, INDONESIA TUMBUH')
        x += 1
        time.sleep(0.1)

</code>

12 Agustus 2021

Self Destroyed Application

Just for fun.

Bagaimana seandainya program/ script Python yang kita buat hanya dapat dieksekusi beberapa kali saja. Setelah itu programnya otomatis kehapus. Kalaupun dicopy lagi tetap ga bisa jalan.

Hmm... Kalau user yang ga ngerti Python sih bisa. Tapi kalau yang jago?

Iseng-iseng saya buat script lalu saya sisipkan ke program saya yang lain. Dan lumayan, dia kontak terus menanyakan programnya hilang sendiri. Setelah dicopy ulang kadang bisa jalan dan kadang ga. Tujuan saya jadi tercapai, karena 'dia' jadi ingat saya..

Langsung saja begini scriptnya:


import pickle
import os, sys
import random, time

class UnlinkMe:
'''
class UnlinkMe
Just for fun, limiting an application that can be executed
specified times by self-deleting the application file or 
by exiting randomly.
'''

pickn = '____.db'
finish= False

def __init__(self, lim = 10, **kwarg):
'''
1st argumen is limit: integer: how many trial 
alowed to be executed
verbose: boolean: set True to display message 
progress. default is False
'''
self.verbose = kwarg.get('verbose', False)
self.limit = int(lim)
self.selfn = sys.argv[0]
if os.path.isfile(self.pickn):
with open(self.pickn,'rb') as fd:
self.limit = pickle.load(fd)
self.verbose and print(f'Load limit {self.limit}')
else:
self.save()
self.test()

def save(self):
'''save limit'''
with open(self.pickn,'wb') as fd:
pickle.dump(self.limit,fd)
self.verbose and print(f'Dump limit {self.limit}')

def test(self):
'''evaluate execution times'''
if self.limit < 0 and not self.finish:
self.verbose and print('Warning!')
try:
self.verbose and print('Try to unlink ..')
os.unlink(self.selfn)
self.finish = True
self.verbose and print('Unlink finished')
except:
self.verbose and print('Error unlink')
if self.finish:
#exit on probability one of three for fun
random.randint(1,3)==1 and exit(1)
self.limit -= 1
self.save()
return self.finish
#end of class----

def dummy_process(n):
'''display random progress bar'''
t = random.randint(3, 20)
for i in range(t):
print(f'\r{n:02d} ', end='')
print('='*int((i+1)/t*50), end='')
time.sleep(0.1)
print()

# ----- main program ---------
if __name__ == '__main__':
limit = 10
dm = UnlinkMe(limit) #,verbose=True)
print(f'Demo by limiting about {limit}+random times')
print('Warning, script would be missing after that') 
print('\nPress Ctrl+C to break dummy process any time')
i = 0
while True:
i += 1
dummy_process(i)
dm.test()
time.sleep(2)


Pada baris bagian bawah ada contoh cara penggunaannya. Cukup UnlinkMe(10) misalnya, untuk membatasi aplikasi hanya dapat dieksekusi sekitar 10x. Kalau usernya sedang berutung bisa dieksekusi beberapa kali lagi.

Kalau suatu proses atau suatu fitur dalam aplikasi yang mau kita batasi, pakai method .test() setiap kali proses atau fitur diakses.