전체 글 (755)
[pyside6] QThreadPool을 이용해서 몇 개의 스레드가 활성화되어 있는지 확인하기 2022.02.25 20:08:56
반응형

pyside 앱에서 여러 개의 스레드를 사용하다보면 도대체 현재 몇 개의 스레드가 활성화되어 있는지 궁금할 때가 있다. QThreadPool을 활용하면 활성화되어 있는 스레드의 개수를 파악할 수 있다. 

 

QThreadPool은 스레드를 사용하는 프로그램에서 스레드 생성 비용을 줄이기 위해 개별 QThread 객체를 관리하고 재활용하기 위해 사용된다 [1]. 

 

예제를 위해 간단한 프로그램을 만들었다. 하나의 버튼이 있는 프로그램인데, 버튼을 클릭하면 하나의 스레드가 생성되면서 현재 활성화되어 있는 스레드의 개수를 알려준다. 참고로 time.sleep(5)를 줬기 때문에 각 스레드는 5초 후에 소멸된다. 

 

from PySide6.QtWidgets import QApplication, QPushButton, QHBoxLayout, QWidget
from PySide6.QtCore import QThread, QThreadPool, QRunnable

import sys
import time

class HelloWorldTask(QRunnable):
    def run(self):
        print("Hello world from thread", QThread.currentThread())
        time.sleep(5)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        QThreadPool.globalInstance().setMaxThreadCount(100)

        self.btn1 = QPushButton("btn1")
        self.btn1.clicked.connect(self.btn1_clicked)
        
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.btn1)

        self.setLayout(self.layout)
        self.show()
    
    def btn1_clicked(self):
        hello = HelloWorldTask()
        # QThreadPool takes ownership and deletes 'hello' automatically
        QThreadPool.globalInstance().start(hello)

        print("활성 쓰레드 개수:", QThreadPool.globalInstance().activeThreadCount())

    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec()
 

 

위 코드를 실행하면 다음과 같이 버튼이 하나 있는 프로그램 창이 열린다.

 

 

버튼을 연속해서 클릭하면 콘솔창에 다음과 같은 내용이 출력된다.

 

 

"활성 쓰레드 개수: 15"에서 "활성 쓰레드 개수: 1"이 된 이유는 버튼을 15번 클릭한 후에 잠시 쉬었다가 클릭을 했기 때문에 이전에 생성되었던 스레드가 소멸되었기 때문이다.

 

참고자료

[1] https://doc.qt.io/qtforpython-5/PySide2/QtCore/QThreadPool.html

[2] https://www.pythonguis.com/tutorials/multithreading-pyqt-applications-qthreadpool/, pythonguis, "Multithreading PyQt5 applications with QThreadPool"

반응형
secret
[jquery] 체크박스 체크 여부 확인하기 2022.02.22 20:40:12
반응형

id가 test인 체크박스가 있다고 가정하겠다.

 

이 체크박스가 체크되어 있는지 아닌지의 여부를 jquery를 이용해서 확인하려면 다음과 같이 하면 된다.

 

$('#test').prop(''checked");

 

만약 체크되어 있다면 true를 반환할 것이고, 체크되어 있지 안하면 false를 반환할 것이다.

 

한번 확인해보자. 

 

test1이란 아이디를 부여한 체크박스는 체크가 된 상태이고, test2란 아이디를 부여받은 체크박스는 체크되어 있지 않은 상태다.

 

 

콘솔에서 각각 어떠한 값을 반환하는지 확인해보자.

 

 

체크되어 있는 것은 true를 그렇지 않은 것은 false를 반환함을 확인할 수 있다.

반응형
secret
[javascript] 오늘 날짜를 yyyy-MM-dd 형식으로 나타내기 2022.02.21 19:14:05
반응형

javascript에서 오늘 날짜를 yyyy-MM-dd의 문자열로 나타내는 방법을 알아보자. 코드가 어렵지 않으니 전체 코드를 올려놓고 설명을 시작하겠다. 

 

var date = new Date();
console.log(date);

var year = date.getFullYear();

var month = date.getMonth();
month += 1;
if (month <= 9){
    month = "0" + month;
}

var day = date.getDate();
if (day <= 9){
    day = "0" + month;
}

var today = year + '-' + month + '-' + day;
console.log(today);

 

 

우선 자바스크립트에서 오늘의 날짜는 Date() 객체를 통해서 얻을 수 있다. 

 

먼저 여기서 연도 정보만 얻어내보자. getFullYear() 메서드를 사용하면 된다.

 

그 다음에는 월 정보를 얻어내자. getMonth() 메서드를 활용하면 된다. 그런데 주의할 점은 1월은 0으로, 12월은 11로 나타난다. 따라서 1을 더해줘야 한다. 또한 우리는 1월이면 01로 표현되기 원하고 10월이면 10으로 표현되기 원하기 때문에 조건문을 활용하여 9월 이하인 경우에는 0이 앞에 붙게 해줬다.

 

이번에는 일 정보를 얻어내자. getDate() 메서드를 사용하면 된다. 일은 월과 달리 1을 더하거나 할 필요가 없다. 다만 마찬가지로 7일이면 07로 표현되야 하기 떄문에 9일 이하인 경우에는 0이 앞에 붙게 했다.

 

이제 년, 월, 일 정보를 -로 이어주기만 하면 끝이다.

 

 

 

반응형
secret
[vim] vim에서 문서의 시작, 문서의 끝으로 바로 이동하려면? 2022.02.20 23:14:22
반응형

로그를 담고 있는 파일은 금방 몇 만줄, 몇 십만줄의 내용이 쌓인다. vim을 이용해서 이러한 문서를 열고 나서 한 줄씩 또는 한 페이지씩 넘겨서는 문서의 최하단으로 이동하기까지 너무 오랜 시간이 걸린다. 

 

vim에는 이러한 기능을 수행해주는 단축키가 물론 있다.

 

shift + g 문서의 끝으로 이동 

 

Bottom에 도달했다는 것을 vim UI의 우측하단에서 확인할 수 있을 것이다.

 

 

반대로 문서의 최상단으로 바로 이동시켜주는 단축키도 있다.

 

gg 문서의 시작으로 이동

 

이번에는 Top에 도달했다는 것을 확인할 수 있다.

 

 

vim의 단축키 세계는 매우 방대하지만 자주 쓰는 것만 익혀두면 된다. 

 

 

반응형
secret
[git] 브랜치 생성, 변경, 삭제하기 2022.02.10 20:19:08
반응형

git을 사용하다보면 언제까지나 master 브랜치에서만 작업을 할 순 없다. 불편함과 한계를 느끼는 순간이 있다. 그렇다면 바로 브랜치를 사용할 시점이다. 조금씩 다른 다양한 버전을 만들어야 할 때는 각각 브랜치를 생성해서 작업을 해주는 것이 좋다. 그래야 코드를 잘 보존할 수 있고, 버전별로 차별점을 줄 수 있다.  

 

브랜치 생성

새 브랜치를 생성하고자 할 때는 다음과 같은 명령을 주면 된다.

 

git branch [브랜치명]

 

으로 생성할 수 있다.  

 

브랜치 리스트 확인

그리고 현재 있는 브랜치의 리스트를 확인하고 싶을 때는 단순히 git branch라고 명령해주면 된다.

 

git branch

 

만약 원격 저장소의 브랜치 리스트를 확인하고 싶을 때는 -r 플래그를 붙여주면 된다. 

 

git branch -r

 

브랜치 변경

어떤 브랜치로 이동할 때는 switch를 사용하면 된다. 

 

git switch [브랜치명]

 

만약 git의 버전이 2.23 이전이라면 git switch [브랜치명] 대신에 git checkout [브랜치명]을 해주면 된다.

 

브랜치 삭제

마지막으로 브랜치를 삭제하고 싶을 때는 -d 를 추가해주면 된다.

 

git branch -d [브랜치명]

 

성공적으로 삭제되었으면 다음과 같은 메시지가 뜬다. 참고로 v1.8이라는 이름의 브랜치를 삭제했다. 

 

 

원격 저장소에 있는 브랜치를 삭제하고 싶을 때는 다음과 같은 명령어를 사용하면 된다.

 

git push origin --delete [브랜치명]

 

 

(이 글은 2022-04-21에 마지막으로 수정되었습니다)

 

관련 글

[1] [git] git checkout "브랜치명"이 git switch "브랜치명"으로 바뀌었습니다(git v2.23부터)

반응형
secret
[flask+jinja2] 서버에서 받은 html 요소가 html 문서에서 제대로 표현되게 하려면? 2022.02.06 10:40:06
반응형
@app.route("/index")
def index():
	data = "<p>안녕하세요.</p><p>반갑습니다.</p>"
	return render_template('index.html', data=data)

 

위와 같이 서버에서 html 요소를 전달한 것을 jinja2를 통해 html 문서에서 표현해야 하는 상황인 경우에는 다음과 같이 safe라는 필터를 걸어줘야 한다.

 

{{data|safe}}

 

안녕하세요.

반갑습니다.

 

safe 필터를 걸어주면 autoescape가 비활성된다. 그렇지 않고 {{data}}로 사용하면 p 태그를 인식하지 못하고 그냥 문자열로 받아들인다. 

 

{{data}}

 

<p>안녕하세요.</p><p>반갑습니다.</p>

 

주의할 것은 safe 필터는 개발자가 신뢰할 수 있는 데이터가 표출되는 곳에 대해서만 사용해야 한다는 점이다. 그렇지 않으면 XSS(cross-site scripting) 공격을 받을 수도 있다. 참고로 XSS란 웹 사이트의 입력 폼에 악성 스크립트를 삽입하여 공격하는 기법이다.

 

참고자료

[1] https://stackoverflow.com/questions/3206344/passing-html-to-template-using-flask-jinja2

반응형
secret
[flask+jinja2] break 사용하기 2022.02.05 21:53:53
반응형

jinja는 서버에서 보낸 데이터를 html 문서에서 나타낼 때 쓰이는 일종의 템플릿 언어다. 문법은 전반적으로 파이썬과 유사한 부분이 많기 때문에 사용법을 어렵지 않게 익힐 수 있다.

 

오늘은 for문을 사용하다가 break를 사용할 일이 생겨서 사용법을 정리해 본다. break는 보통 for문과 같은 반복문에서 중도 탈출할 때 사용되는 문법이다. 이 글을 읽는 분들은 break의 용도는 알고 계실 것이라 생각하기에 자세한 설명은 생략하겠습니다. 

 

우선 jinja에서 break를 사용하려면 extension을 추가해줘야 사용할 수 있다. flask 프레임워크를 사용하고 있다면 app = Flask(__name__)과 같은 코드가 파이썬 문서 상단에 있을 것이다. 그 코드 아래에 다음과 같은 코드를 추가해줘야 한다. 

 

app.jinja_env.add_extension('jinja2.ext.loopcontrols')

 

위 코드를 추가했다면 이제 html 문서에서 다음과 같은 방식으로 break를 사용할 수 있다.

 

{% for temp in data %}

{% if temp['nation'] == 'korea' %}

<p>{{ temp['nation'] }}</p>

{% break %}

{% endif %}

{% endfor %}

 

각자의 상황에 맞게 for문 내에 break를 넣어주면 된다. 

반응형
secret
[python] SyntaxError: Non-ASCII character '\xec' 에러 해결법 2022.01.14 20:47:00
반응형

파이썬 코드를 다루다보면 다음과 같은 에러를 만날 때가 있다.

 

SyntaxError: Non-ASCII character '\xec' in file myproject.py on line 112, but no encoding declared; 

 

이런 경우에는 파이썬 문서 최상단에 utf-8 인코딩 관련된 코드가 없을 때 발생한다. 따라서 다음과 같은 코드를 최상단에 삽입해주면 간단하게 해결된다.

 

# -*- coding: utf-8 -*-

 

 

파이썬 코드를 접했던 분들은 많이 봤던 친구일 것이다. 다만 '왜 저런 주석이 있지?' 하고 지우는 경우도 꽤 있었을 것이다. 필자도 그랬다. 

반응형
secret
[윈도우10] 메모장을 관리자 권한으로 열어야 할 때 2022.01.12 20:24:16
반응형

간혹 어떤 파일을 메모장으로 열어서 수정하고자 할 때 수정한 내용이 저장이 안 되는 경우가 있다. 관리자 권한으로 실행하라면서 말이다. 

 

 

이런 경우에는 메모장을 일단 관리자 권한으로 실행해야 한다.

 

윈도우 키를 누르고 메모장을 입력하면 다음과 같은 화면이 나올 것이다. 

 

 

여기서 메모장을 오른쪽 클릭하면 관리자 권한으로 실행이라는 항목이 나온다. 그것을 클릭하면 된다.

 

 

그 다음에는 열어서 수정하고자 하는 파일을 열면 된다. 이젠 아까와 달리 수정하고 저장했을 때 저장이 된다. 

반응형
secret
[우분투] 서비스 실행 상태 확인 명령어 2022.01.11 21:51:42
반응형

우분투에서 mysql과 같은 서비스가 잘 실행하고 있는지 확인하기 위한 명령어는 다음과 같다.

 

service --status-all

 

위 명령을 주면 다음과 같은 화면이 출력될 것이다. 

 

 

보다시피 현재 mysql은 중지되어 있는 상태다. +는 실행중인 상태, -는 중지된 상태를 뜻한다. 

 

service mysql start로 mysql 서비스를 실행한 후에 다시 service --status-all을 입력해주면 다음과 같은 화면이 나온다.

 

 

-가 +로 바뀐 것을 확인할 수 있다.

반응형
secret
-
+