스테이블디퓨젼 이미지,메타 뷰어

플러터로 만들어진 스테이블디퓨전 이미지 뷰어이며, ExifTool을 사용하여 포함된 정보를 같이 보여줍니다.

클릭으로 프롬프트, 네거티브 프롬프트를 클립보드에 복사할 수 있으며 같은 디렉토리의 앞/뒤 파일로 이동할 수 있습니다.

여기 에서 빌드 파일을 찾을 수 있고, 한국어설명을 볼 수 있습니다.

현재(v0.3)는 A1111과 InvokeAI 로 생성된 이미지의 메타데이터만을 파싱해서 보여줍니다.

그림을 조각내어 섞는 코드

그림을 조각내어서 퍼즐처럼 섞어주는 프로그램, pillow 라이브러리가 필요하다.

puzzled_image.py sample.jpg 4 4 2
처럼 사용하면 된다.

# puzzled_image.py
# pip install pillow
import os
import sys
import random
from PIL import Image
from PIL import ImageOps
def puzzled_image(filepath, count_x, count_y,shuffle_count, invert=False):
filename = os.path.splitext(filepath)[0]
try:
srcim = Image.open(filepath)
cropX = int(srcim.size[0]/count_x)
cropY = int(srcim.size[1]/count_y)
srcBoxs = []
dstBoxs = []
for i in range(0, count_y):
for j in range(0, count_x):
x = j * cropX
y = i * cropY
bb = (x, y, x+cropX , y+cropY)
srcBoxs.append(bb)
dstBoxs.append(bb)
for i in range(shuffle_count):
random.shuffle(srcBoxs)
dstim = Image.new('RGB', srcim.size)
count = len(srcBoxs)
for i in range(0, count):
p = srcim.crop(srcBoxs[i])
if invert:
if i%2 == 0:
p = ImageOps.invert(p)
dstim.paste(p, dstBoxs[i])
# print(srcBoxs[i])
dstim.save(filename + "_puzzled.png", "PNG")
except e:
print(e)
return
if __name__ == '__main__':
argc = len(sys.argv)
if argc != 5:
print("Usage:\tpuzzled_image.py <image_file_path x y shuffle_count>\n\tx,y is number of pieces.")
else:
countX = int(sys.argv[2])
countY = int(sys.argv[3])
shuffle_count = int(sys.argv[4])
puzzled_image(sys.argv[1], countX, countY, shuffle_count, False)

python에서 paramiko 라이브러리를 사용하여 ssh 접속 및 명령 실행하기


서버를 관리할 일이 있었는데 Ansible을 쓰는 것이 좋은 방법이지만, 나는 간단한 기능을 원했고 마음대로 커스터마이즈 하고 싶어서 python으로 코드를 만들었다.

import paramiko
import re
import time
# reference sites
# * https://stackoverflow.com/questions/1911690/nested-ssh-session-with-paramiko
# * https://stackoverflow.com/questions/53707630/paramiko-how-to-detect-if-command-executed-using-invoke-shell-has-finished
# use paramiko library
class SSHConnect:
def __init__(self):
self.client = paramiko.SSHClient()
self.transport = None
def connectAndOpen(self, host, port, username, password):
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
self.client.connect( hostname = host, port = port, username = username, password = password, allow_agent = True )
print ("Connected to %s" % host)
self.transport = self.client.get_transport()
self.password = password
return
def runCommand(self, commandText):
print("> %s" % commandText)
self.session = self.transport.open_session()
self.session.set_combine_stderr(True)
self.session.get_pty()
self.session.setblocking(1)
self.session.exec_command(commandText)
loop = 1
while loop > 0:
loop = loop – 1
while self.session.exit_status_ready()==False:
stdout = self.session.recv(1024).decode("utf-8")
# When requesting password input, put the stored password.
if re.search('[Pp]assword', stdout):
self.session.send(self.password+'\n')
loop = loop + 1
else:
print(stdout, end='')
self.session.close()
return
def close(self):
self.transport.close()
self.transport = None
self.client.close()
self.client = None
Host = '127.0.0.1'
Port = 22
ID = ''
Password = ''
con = SSHConnect()
con.connectAndOpen(Host, Port, ID, Password)
print("Start")
con.runCommand("df -h")
time.sleep(1)
con.runCommand("sudo apt update && sudo apt upgrade -y")
print("End")
con.close()

위 코드는 패스워드를 사용해서 접속하고 sudo 등의 커맨드에서 password 를 자동으로 입력해주는 샘플 코드다. 실제로 쓰는 코드는 ssh키도 사용할 수 있고, 서버 설정 파일을 cryptography 라이브러리를 사용하여 암호화 시켜서 쓴다.

그리고,실행 중에 화면 입력을 필요로 할 때에는 무한 대기 상태에 빠져버리는 문제가 있다.