본문 바로가기

분류 전체보기465

아래아한글 업무자동화를 위한 파이썬 모듈, pyhwpx 업무자동화 관련한 교육을 몇 회 진행해보면서 강하게 느낀 부분 중 하나는, 일반 사용자 대부분이 "긴 코드"에 대해 불편함을 느낀다는 건데요. 정부부처, 공공기관이나 기관 연수원에서는 장기간의 교육은 잘 만들어지지 않고, 7~8시간 안에 파이썬 기초부터 업무자동화 중급까지 진행해야 하는 상황, 업무자동화에 유용하게 써먹었던 이런저런 함수들을 모아서 간단한 클래스로 구현해놓고, pypi에 업로드해 두려고 합니다. 문서화나 동영상 촬영도 틈틈이 해 보고 싶고요. 우선 사용법은 아래와 같습니다. 1. 터미널에서 pip install pyhwpx로 모듈을 설치한다. 2. 파이썬에서 from pyhwpx import Hwp로 클래스를 임포트한다. 3. hwp = Hwp()로 한/글을 연다. 4. 한/글에서 제공하.. 2023. 11. 7.
zsh에서 프로젝트 가상환경 자동활성화 feat. zsh-autoenv 터미널을 최근 bash에서 다시 zsh로 변경해보았습니다. 리눅스 터미널을 강력하게 사용하는 편은 아닌데, 강의 때 wsl을 활용하면서 너무 프롬프트 경로가 길어서 제가 입력하는 명령어가 자꾸 줄이 바뀌는 게 학생들 보기에 불편할 것 같았습니다. 마침 예전에 사용하던 oh-my-zsh 중에 powerlevel10k가 예뻤던 게 기억나서 오늘 테마 세팅까지 후다닥 마쳤습니다. 다만, 몇 가지 걸리는 게 있었는데 bash에서는 --rcfile 옵션을 줘서 간단히 가상환경을 설정할 수 있었는데 zsh에서는 이상하게 --rcs가 잘 먹지 않아서 스택오버플로, 스택익스체인지 등의 답변을 참고하면서 가상환경 자동 활성화를 시도해보다 결국 askdjango 이진석 님께서 추천해주신 autoenv를 사용하게 됐습니다... 2023. 10. 18.
투두리스트에서 특정 업무를 수정해보자. #Update # 끝! 지난 시간까지 CRUD 중 CRD를 완료했다. 이번 포스팅에서는 Update를 구현해볼 차례이다. 우리가 비록 리플렉스 문법은 다소 생소할지언정, 파이썬의 간단한 문법인, 리스트 메서드나 enumerate만 가지고도 투두리스트의 기본로직을 전부 구현해낸다는 점은 시사하는 바가 결코 작지 않다. 특히 react나 각종 관련 컴포넌트 라이브러리, 자바스크립트 및 html, css 등의 코드가 전혀 없었음을 감안해보면 충분히 리플렉스의 강점을 느끼고 계실 거라고 생각한다. 완성한 형태를 미리 보여드리면 아래와 같다. 참고로 Update를 담당하는 이벤트핸들러에서 쓰게 될 파이썬 문법은 (여러분 대부분이 예상하시는 바와 같이) `todo_list[idx] = val` 이라는 인덱스 명령어다. 그냥 전체 코드를 .. 2023. 10. 12.
투두리스트에서 완료한 업무를 제거해보자. # Delete[2/2] 지난 포스팅에서는 특정 할일의 정확한 삭제(pop)를 위해 State에서 enumerate를 통해 enum_list: list[tuple[int, str]] 라는 변수를 추가로 만들었다. (이 안에 index번호가 있는 덕분에, 정확하게 순서(인덱스)를 명시하여 특정 요소를 삭제할 수 있게 됐다.) 그래서 이번 포스팅에서는 페이지함수인 index를 완성해보기로 한다. 기존에 만든, "할 일 추가"만 가능한 페이지 함수 index는 아래와 같다. def index(): return rx.container( rx.foreach( State.todo_list, rx.text ), rx.form( rx.hstack( rx.input(value=State.new_item, on_change=State.set_ne.. 2023. 10. 12.
wsl에서 일반사용자로 mysql 실행시 Access Denied가 계속 뜬다? 데스크톱, 노트북 등 현재 사용중인 PC가 다섯 대 정도 있어서 여러 운영체제 조건하에서 코딩이나 테스트를 해 볼 수 있다. 재미있는 것은, 특정 PC의 wsl 환경에서만 데이터베이스 접속이 안되었는데, (정확히는 일반사용자로 mysql -u root -p 명령어로도 Access Denied가 뜨고, sudo mysql은 즉시 실행되는 문제가 있었다.) "설정파일을 만져보라", "재설치해보라" 등등 여러 가지 솔루션이 있었지만 차례대로 모두 실행해봐도 "Access Denied"가 해결되지 않다가 아래 링크를 통해 일반사용자 계정을 생성하고 previlege 설정을 주었더니 말끔히 해결되었다. 아직도 신기한 것은, 왜 다른 모든 컴퓨터에서는 mysql이 잘 돌고 있는데 주력으로 쓰고 있는 윈도우11 노트.. 2023. 10. 10.
rx에서 유튜브 allowFullScreen 활성화하는 방법 아래 방법은 전체화면 아이콘이 활성화되지 않는다. (잘못된 방법) import reflex as rx class State(rx.State): pass def index() -> rx.Component: return rx.box( element="iframe", src="https://www.youtube.com/embed/9bZkp7q19f0", allowFullScreen=True) # rx.Component: return rx.box( element="iframe", src="https://www.youtube.com/embed/9bZkp7q19f0", custom_attrs=dict(allowFullScreen=True)) # 2023. 10. 9.
[reflex팁] rx.input을 효과적으로 다루는 방법 reflex는 pynecone 시절부터 지금까지 (react나 js를 다루지 않고) input을 편하게 사용할 수 있는 실험적인 기능을 제공해 왔다. 그 과정에서 불필요한 몇 가지 코드가 개선되었는데, 2023년 10월 현재는 (공식문서에는 아직 올라오지 않았지만) rx.form과 rx.set_value를 사용하는 방법이 가장 효과적인 방법으로 보인다. 개인적으로 reflex에서 set_value를 제공해 주기 전까지는 뭔가 미묘하게 걸리적거리는 문제들이 있어 고민을 많이 했는데 이제 rx.input이나 rx.form은 어느 정도 리플렉스의 철학대로 최적화가 되었다고 생각한다. 이번엔 reflex의 rx.input 컴포넌트 변천사(?)를 간단히 알아보는 포스팅을 작성해 두려고 한다. (엄밀히는 시간적인 .. 2023. 10. 5.
투두리스트에서 완료한 업무를 제거해보자. # Delete[1/2] 지난 포스팅에서 투두리스트 앱의 CRUD 중 Create와 Read를 구현해보았다. 리플렉스 컴포넌트 사용법이 다소 생소할 수는 있지만, 실제로 로직 자체는 굉장히 간단한 파이썬 문법만 사용했다. append를 통해 할 일을 추가할 수 있다니! (CRUD를 구현하고 난 뒤에는 임의의 리스트가 아니라 실제 데이터베이스로도 구현해볼 예정이다.) 이번에는 Delete를 구현해 볼 차례다. 잠시 한 가지만 고민해보자. 할 일을 완료한 시점에서 마우스로 할일을 클릭했을 때 그냥 목록에서 없어져버리는 것이 나을지, 아니면 취소선만 적용하고, 완료한 업무를 그대로 보여주는 것이 나을지는 사용자경험 관점에서 우리가 충분히 고민해 봐야 할 부분이다. 참고로 (정말 잘 만들었다고 생각되는) 마이크로소프트의 To-do 앱은.. 2023. 10. 3.
투두리스트에 할 일을 추가해보자. #Create 공식문서의 투두리스트 앱은 로직의 간단함에 비해 다소 구현이 복잡하게 되어 있다. 이 포스팅 시리즈에서는 최소의 코드로 투두리스트를 만들어보면서 리플렉스에서 로직을 구현하는 방법에 익숙해지도록 하는 것을 1차목표로 한다. (이 포스팅을 읽고 나면 공식문서의 todo 앱도 한 번 연습해 볼 것을 추천한다.) 지난 포스팅에서는 리스트를 표현하는 방법으로 시작해서 우리가 구현할 투두리스트 앱의 CRUD 중 R을 완성했다. 이번에는 Create를 구현할 차례인데, 이 또한 너무너무 간단해서 헛웃음이 나올 정도다. 한 번 시작해보자. 지난 포스팅에서 완성한 코드는 아래와 같다. import reflex as rx class State(rx.State): todo_list = ["밥먹기", "잠자기", "공부하기".. 2023. 10. 3.