$ fortune -a
xmake, compile_commands.json, flycheck
cmake/warp등을 써보면서 c/c++ 개발할 때에 빌드도구 갖고 놀다가, 이번에 마음을 열고 xmake을 익혀봄.
마음에 든다. 가볍고 빠르고 좋다.
ccache등도 바로 지원하고, lua으로 스크립팅도 그럭저럭 할만해 보이고, [build.zig](https://ziglang.org/learn/build-system/)스러워서 당연하게도 좋은거 같아.
계속 쓸거 같다.
emacs / flycheck + c/c++ 개발할 때에 단점이, 자동적으로 외부 3rd-party 라이브러리의 include-path을 설정해주지 않아서, [dirs-local](https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html) 같은걸 세팅해주길 기대한다는 점.
그래서 그냥 xmake project -vD -k compile_commands -m debug 같이 compile_commands.json 생성하고,
이걸 파싱해서 표준출력으로 include-paths https://github.…
공각기동대, 1995
가끔 다시 본다. 그리고 마지막 장면을 보면서 덕력이 폭발하면서 종종 그런 생각에 빠짐.
저런 시나리오를 쓴 사람은 어떤 기분이었을까 완전 쩐다.…
FreeBSD + Samba 4.16 + Symbolic Links 설정
freebsd에서 samba 파일서버 세팅은 프비핸드북 참고 https://docs.freebsd.org/en/books/handbook/network-servers/#network-samba
symlink을 samba에 노출하기 /usr/local/etc/smb4.conf 파일에 다음을 추가:
[global] ... allow insecure wide links = yes [share] ... follow symlinks = yes wide links = yes unix extensions = no mdns으로 samba 파일서버를 네트웍에 광고하기 보통은 avahi을 써왔는데, mdnsresponder이 더 가볍다고 해서 이렇게 세팅해봄.
pkg install mDNSResponder /etc/rc.conf 에 추가:
mdnsresponderposix_enable="YES" mdnsresponderposix_flags="-f /usr/local/etc/mdnsresponderposix.conf" 호스트이름은 freebsd-samsung 으로 smb서비스를 노출.
/usr/local/etc/mdnsresponderposix.conf 작성:
freebsd-samsung _smb._tcp 445 service mdnsresponderposix start …
Debian Bookworm(12.2), Chromium + Wayland에서 ibus 한글 입력 고치기
나도 x11에서 wayland 기반으로 옮겨가고 있는데, 다른 것들은 대부분 괜찮거나 포기.1
가볍고 좋은데, debian chromium에서 ibus으로 한글 입력이 안되어서 알아봤다.
1) 문제 원인 :: gtk3 backend으로 chromium이 동작해서, ibus연동이 안됨. 힌트 얻음: https://bugzilla.redhat.com/show_bug.cgi?id=2058976 2) 확인 :: 실행중인 chromium이 어떤 버젼의 gtk3/4와 연결되었는지? for pid in $(pgrep chromium); do #echo $pid grep -i gtk /proc/"$pid"/maps done ==> 기본 bookworm/chromium 상태에서는 gtk3임을 확인. ~~> ibus 연동안됨.
3) 실행커맨드/스크립트 확인 dpkg -L chromium-browser 으로 desktop launcher 확인 /usr/share/applications/chromium-browser.…
내 책상에서 유선랜 환경
개인환경을 조금 특이하게 사용하는데, 그 이유와 방식.
why: 유선랜? (무선랜 대신) 키보드/마우스 입력이 가장 부드럽게 전달되어서 유선으로 연결해서 사용한다.
x2x으로 연결하거나, ssh-x11-forwarding으로 다른 컴퓨터에서 실행하는 프로그램을 디스플레이와 입력장치만 현재 자리에서 그대로 사용할 때에 네트웍 연결속도가 딜레이가 적어야 쾌적해서. 1
why: x11? (wayland 대신) 요즘 리눅스/bsd 데스크탑 기본설치하면 wayland으로 세팅하는 경우도 많은데, 네트웍을 통해서 ssh-x11-forwarding 1 사용하거나 x2x 사용하기는 아직 부족한거 같아서, 나는 그냥 x11 사용함.
거기에 xdotool 같은 gui-automation/scripting이나 warpd 같은 키보드를 마우스으로 편안하게 쓰도록 해주는 xtest이나, qjoypad 처럼 2 게임패드/조이스틱을 편안하게 마우스/키보드으로 매핑해서 쓰는게 나는 많은데 모두 x11만 지원하거나, 아직은 x11에서만 쓸만한 수준으로 동작해서.…
News 08/03/2023 .02 : reactjs, rust, zig, hiring, nes
"리액트가 날 인질으로 잡고 있어요" "헛소리/bullshit 없이 엔지니어링 재능이 있는 사람을 고용하기" "NESFab is a new programming language for creating NES games" "zig이 rust보다 빠르고 안전할 수 있는 경우" "리액트가 날 인질으로 잡고 있어요" https://emnudge.dev/blog/react-hostage
…말해 뭘할까 싶은데. 🙈
포스팅 자체는 react, hooks 같은 것들의 complexity에 대한 이야기이지만.
오히려 흥미롭게 생각하는 것은, 과거 한국에서 '퍼블리셔'라고 하던 사람들이 어떻게 되었는가 생각해보며, 함께 지금의 '프론트엔드 개발자', 혹은 '앱 개발자', '리액트 개발자', '자바스크립트 개발자'들이 앞으로 어떻게 될지 상상해본다.…
Ping 08/03/2023 .01 : 전자책읽기
linux에서 전자책 편안하게 읽는 방법들 간단하게 몇가지 팁들만 나열, 별로 내용은 길게 늘여 쓰지 않으려고:
linux, 그중에서도 가벼운 하드웨어와 단순하게 잘 동작하는 배포판.
여러가지 불필요한 군더더기 없고, 패키지들이 조금 오래된 버젼이어도, 안정적으로만 동작하면 상관 없음. 그래서, debian stable -or- testing 쓰면 속이 편함. 하드웨어는 raspberry pi 3/4 둘 다 좋았다. 1 …특히 전력소모도 거의 없고, 딱 모니터 연결해 놓고 팬소음 거의 없이 쾌적하게 책을 읽기 좋다. calibre 책파일 관리, 읽기 모두 만족스러움…
`ncal -3` 직접 Perl으로 짜봤다
ncal -3 이 뭐냐하면:
https://man7.org/linux/man-pages/man1/cal.1.html
…뭐 이런건데, 개인적으로 저전력 글쓰기 전용머신에서 사용하는 스크립트에서 배포판이 달라서 패키지를 못찾겠어서 1, …그냥 직접 짜서 대체했다.
https://github.com/ageldama/configs/commit/66bd92b42ba5a5ee03b9336370c3a8f84293e488
그래서 스크린샷은:
재밌었던 부분은:
어차피 Perl으로 전부 짜서 쓰는 스크립트였는데, 아예 외부 커맨드라인 도구 의존성을 더 없애서 뿌듯하다. 매달 달력을 문자열으로 뽑았는데, 3달치를 뽑아서, 이걸 한 row에 표시하고 싶었는데, Text::Table으로 적절히 간단히 완료. Term::ANSIColor와 perlre을 써서 깔끔하게 원하는 일자에 highlighting 해서 편안했다. …더 해킹을 해서, calendar(..) 결과문자열을 적당히 파싱해서, 작은 Text::Table으로 만들어서, 그것들으로 조합하고 했었어도 될거 같아.…
C++: Golang-ish `defer`-macro
별거 없는데, 문득 심심해서 툭닥거려봤다.
원하는 것과 접근법 defer.inl : 사용예 제약사항과 생각해볼꺼리 Footnotes 원하는 것과 접근법 https://go.dev/blog/defer-panic-and-recover https://docs.rs/defer/latest/defer/fn.defer.html https://ziglang.org/documentation/master/#defer golang/zig에서처럼 defer 등록한 LIFO순서대로 호출되도록.
검색해보면, 대부분 RAII을 사용하거나 하는 것들이 보인다:
DDG: c++ golang defer https://stackoverflow.com/questions/33050620/golang-style-defer-in-c https://stackoverflow.com/questions/45617758/proper-way-to-release-resources-with-defer-in-a-loop https://codesire-deng.github.io/2022/02/06/One-Minute-to-C-defer/ …그냥 std::shared_ptr<void> 을 이용하는 방식이 마음에 들었다. 그리고 조금 더 간단하게 사용하려고 매크로로 만들어 봤다.
defer.inl : /* -*- mode: c++; -*- */ #ifndef defer_INL #define defer_INL 1 #include <memory> #define _Defer_CONCAT_IMPL( x, y ) x##y #define _Defer_CONCAT( x, y ) _Defer_CONCAT_IMPL( x, y ) #define Defer(blk) std::shared_ptr<void> _Defer_CONCAT(Defer_, __COUNTER__ )(nullptr, blk) #endif /*defer_INL*/ __COUNTER__ 이용해서 매크로가 생성한 std::shared_ptr<.…
Ping 26/02/2023 .01 : 디자인 css 가볍게 수정
아예 아무런 스타일도 주지 않고, 그냥 알아서 html/css만으로 잘 보이도록 고쳤다. 웹폰트니 그런것도 그냥 껐고.
불필요한 스타일이나 폰트로딩을 줄여서 가볍고, 어차피 웹브라우져의 'reader mode' 지원 같은걸로 내가 스타일 주는 것보다 훨씬 읽기 편안하게 볼 수 있을테니까.
lynx, w3m 같은 텍스트 웹브라우져에서 읽으나 그냥 무거운 웹브라우져으로 읽으나 사람마다 알아서 잘 읽히도록 하는데에만 집중해봤다.…
Ping 19/02/2023 .02 : 이름에 대한 추측 (2) HAL, IBM, JCL
(…지난번 C/C++/D/Zig 이름에 대한 추측 에 이어서, 그냥 떠올라서)
HAL 9000 –> IBM
ASCII방식, 혹은 그냥 알파벳에서 한글자씩 앞으로 땡기면, "IBM"이 된다. JCL
IBM의 "Job Control Language", 메인프레임 등에서 스크립팅을 위해 쓴다고 한다. "IBM"에서 다시 또 한글자씩 앞으로 땡기면, "JCL". ㅎㅎ뭐 그냥 그렇다고.…
Ping 19/02/2023 .01 : 어른이 되기
(최근 며칠 우울하고 내가 어른이기는 한가 싶은 자괴감에 빠졌었다. 그래서인지 자기합리화를 위해 이런 글을 쓰고 있는거 같기도 하다.)
나의 옛날 이야기 어른의 사정 그런데 어떤 어린이는 어른을 이해한다. 때로는 The Overfitting 아직은 어린 마음인, 그래야만 한다는 강박 짝사랑, 혹은 도착증과 그 반대로써인 쩌리의 자존심 신화적인 닌텐도와 그 빠 "괜찮아" Footnotes 나의 옛날 이야기 80년대의 기억에는, 참 자주도 불량식품 단속에 대한 이야기가 나오던 것 같아. 그리고 실제로도 만화, 애니메이션, 게임, 장난감 등등의 라이센스나 품질관리에 대한 관념이 희박했던거 같아.…
Ping 07/02/2023 .01 : C++, D, Zig의 이름에 대한 추측
문득 떠오른 생각이라서, 그냥 추측.
C : 로마숫자(roman numeral) 으로 100.
처음부터 의도한 숫자가 100이 아니었을거란건 나도 알거 같아. BCPL이나 그런 역사에 대해 나도 조금은 아니까. 그런데 그 이후에 따르는 언어들이 그런 패턴을 만든거 같아서 재미로 쓰는 글. C++ : 위의 로마숫자이란 생각과 C언어의 x++ 연산 으로 생각해보면,
즉시 평가할 때에는 C == 100, 그냥 C와 같아 보임. 그런데 저장된 값은 +1, == 101. …어쨌든 그냥 볼 때엔, 씨언어와 거의 같아 보이지만, 그래도 좀 더 성장했다고.…
Ping 04/02/2023 .01: 씨언어의 장자 zig, rust, golang, c++ ???
최근에 재미로 zig 을 정말 재밌게 '읽었다'. 공부해보고 실제로 뭔가 코딩을 많이 해보거나 한 것은 아니고, 대체 어떻게 동작하는 프로그램을 이걸로 만들라고 하는건지 이해하고 싶었기 때문에 해봤다.
zig으로 프로그램을 짜는게 궁금하던 부분은 haskell의 monad을 이용한 방식, 혹은 apl이나 prolog으로 실제프로그램을 어떻게 만들 수 있을지 패러다임부터 다른 언어를 공부하고 생각해보는 것과는 조금 다를수도 있겠다. 어쨌든 그냥 imperative언어이니까.
오히려, zig을 어떻게 써먹어야 할지 궁금하던 지점은, c++의 스마트포인터와 move semantics등을 이해하는 것이나, rust의 borrowing checker, rc/arc등을 이해하는 것과 마찬가지인 것 같다.…
나이브스아웃 1, 2편, 그리고 K드라마, K영화
“나이브스 아웃” 1편을 몇 년 묵혀 놓고 시청하지 않았었다.
최근에 넷플릭스에 2편인 “글래스 어니언"도 공개되어 연달아서 이틀 동안 시청, 정말 즐겁고 감동적이었다.
1, 2편 모두 출연배우들도 어이가 없게 화려한 영화이고, 그 배우의 그간의 쌓아놓은 내가 인식하는 통상적인 캐릭터를 잘 비트는 배역도 마음에 들었다.1
언제부터인가 아가사 크리스티 원작이거나 한 정통추리극이 많이 개봉하던거 같다. 최근에 다시 만드는 그런 영화들을 많이 시청하지는 못했다.
나는 추리극을 많이 본적이 없는거 같다. 아니면 내가 감상하는 방식이 추리물을 추리물으로 본 것이 아니라, 미스테리이거나 아니면 그냥 또다른 방식의 서사물이거나 블랙코미디처럼 봐왔기 때문인거 같다.…
Ping 03/02/2023 .01: 블로그 디자인 수정
블로그를 내려놓았다가, 다시 글을 쓰고 생각들을 어느 정도는 공개를 하고 지내고 싶어져서 다시 열었다.
사용하던 테마를 수정해서 쓰기로 하고, CSS을 여기저기서 복붙해서 적용해보고, 갈무리 웹폰트도 적용해서, 오히려 원본 테마보다 더 가볍게 적당히 만들어봤다.
색상도, 외양과 기능 디자인 모두 어느 정도 내 취향에 맞게 꾸며 봤다.…
Ping 02/02/2023 .01: xemacs, gemini, gemtext
1. “제미니 계획” 2. just like the good ol’ days 차라리 돈을 내고 글을 읽겠다…만 추억이 그리워지는 시대여서 그런거 같기도 하다. 그럼에도 어차피 그렇게 다시 사용하기엔 끔찍할텐데.
1. “제미니 계획” gemini protocol 을 기반으로 뭔가 새로운 것을 상상하면 즐겁지만,
정말 제한적이어서, 내 마음대로의 확장을 떠올리게 된다.
실은, gemtext와 gemini protocol은 마음에 드는 부분이 바로 그런점이지만: 오히려 제한적이고, 그냥 무시해도 되는 것들을 굳이 지원해줘야 할 것 같은 기분에 져서 우겨넣으면서 complexity만 무한대으로 보낼바엔, 이렇게 무시할 것은 잘 무시하는게 더 좋은거 같아.…
Ping 13/11/2022 .01
비가 많이 내렸다. 일년간 어떻게든 자라던 잎들이 낙엽이 되어 떨어졌다.
그런데 딱히 걱정스러울게 없었다.…
react.js, next.js, ssr, progressive hydration, 그리고 "Islands Architecture"와 fresh/deno
https://jasonformat.com/islands-architecture/
…이전에 몇번 언급한 hotwired 처럼. ㅎㅎ
지금의 reactjs, vuejs등은 다음과 같은 방식이 기본:
server: rest/gql등으로 요청을 받아서, json으로 응답. browser(client): 응답으로 받은 json을 받아서, html을 생성하여 렌더링. …이게 편하다고 생각해서 여기로 온거 같아. 나말고도 대부분의 사람들이 웹화면을 개발하던 시절에는 이렇게 만들고 싶었었던거 같아. 1 2
그리고 당연히 ui개발이기 때문에 ‘컴포넌트모델’이나 값바인딩 같은 것들을 원했었고, 현재의 리액트와 같은 형태에 이르른 것 같아.
물론, vdom이 복잡도를 많이 낮춰줬지만, 희안하게도 예상하지 못하던 문제를 몇가지 더 만들어낸 것 같아.…
linux/unix 팁 29/06/2022 .01
zoxide 으로 chdir 간단하게 ssh으로 키보드/마우스 안 붙이고 vconsole: conspy x11: x2x으로 여러 머신/스크린에 걸쳐서 마우스/키보드 공유 리눅스/유닉스/터미널/쉘은 아는만큼 편하게 쓰기 좋은거 같다.
그리고 어떻게 연결해서 활용해 쓰는가에 따라서, 정말 편리해지기도 해서.
zoxide 으로 chdir 간단하게 최근/디렉토리 이동한 히스토리에 따라서 (“frecent”) 이동하기:
fzf+zsh의 Control-R도 좋고1,
oh-my-zsh 내장인 plugins=(z)도 좋지만2
…나는 가능하면 zoxide이 가장 가볍고 좋은거 같다.
설치하고 나서, eval "$(zoxide init zsh)"
그리고, z SOME-DIR, zi 같이 으로 사용하면 되고, fzf연동도 잘되고 해서.…
The Grug Brained Developer
감동적인 글이다ㅋ:
https://grugbrain.dev/
문법도 완전 grug스럽게 작성해서 반가운 글이었다.
완전히 모두 내 생각과 같지는 않아도, 이야기하는 “FOLD” 때문에 일어나는 일들과 조금은 그래도 grug답게 그냥 해내려는 생각들이 유용.
그치, grug이 공룡과 구분되는 점은 그런거겠지. ㅎㅎ…
msa, reactjs, ejb, osgi. 공감하는 생각들.
… black think juice 맛있다.…
"Software disenchantment"
https://tonsky.me/blog/disenchantment/
재밌게 읽었다. 계속 생각해오던, 이전 포스팅에서도 이야기한 생각들.
“…의 진보도 항상 그때그때의 1보만이 진보이며 2보도 3보도 n+1보도 결코…”1
😉
…그치 ejb/xml을 쓰든, 뭔가 또 새로운 언어나 프레임웍으로 대단한것처럼, 진보한것처럼 쓰려고 해도, 현실적으로는 빌드도 오히려 apache ant 쓸때보다 더 엉망일지도. 성능이든 iteration의 가벼움이든.
정말 진보는 커녕 오히려 더 ㅎㅎ… 오히려, apache ant으로라면 명확하게 확실하게 동작하도록 만들기나 잘 하겠지만.
Walter Benjamin의 “Arcades Project"의 인용, “매달린 절벽에서 손을 뗄 수 있는가?” 강신주 저.…
Ping 17/06/2022 .01
“Code bloat has become astronomical” https://www.positech.co.uk/cliffsblog/2022/06/05/code-bloat-has-become-astronomical/
극공감. 그렇다고 의존성 포함하면 몇 기가나 되는 것들이, 하는 일을 보면 안습. …그렇다고 그런 방법들만을 고르는 안목이 엄청나게 힙한것도, 스스로에게 이익이 되는것도 아니고.
데스크탑에 작은 서브모니터 연결해놓은 rpi3b+이 rpi4보다 빠르지는 않을지 몰라도, micro-sd 버벅거림이랑 발열 때문에 버벅거리는건 훨씬 적다.
“rpi4은 빠르니까!“이라면서 나름대로 데탑/랩탑에서 쓰는 설정 그대로, openbox+lxpanel 정도 올려서 쓰고 있고, rpi3b+은 icewm 세팅하고 추가로 뭔가를 더 해놓지 않은 탓이 있을까 싶기도 하지만. …어차피 둘 다 엄청 가벼울거 같은데도.…
Ping 15/06/2022 .01
비 내리는 화요일. ☂️
jinja2 template include + cache? + file-time postgresql, as an api server? jinja2 template include + cache? + file-time 재밌는걸 찾았다.
jinja2을 사용하면서, 하위 include으로 내려갈수록, file을 생성해줘도, 그냥 touch을 해줘서 파일시간을 갱신해줘야 template cache을 무시하는거 같아.
그래서,
// gulpfile.js: const buildTask = series(cleanTask, esbuildTask, injectTask, touchInjectedTask); function watchTask() { watch("./js/**/*.js", buildTask); } exports.watch = watchTask; exports.build = buildTask; exports.clean = cleanTask; …대략 잘 동작하고, webpack보다 엄청나게 빠르다 ㅎㅎ.…
"모두를 위한 algebraic effects!" ...정말루?
뭐 대충 다음과 같은 글들:
https://www.eff-lang.org/handlers-tutorial.pdf
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/08/algeff-tr-2016-v2.pdf
…그리고 몇 개의 구현체, 포스팅들: (아직은 별루인거 같은데)
https://hackage.haskell.org/package/fused-effects
https://github.com/dry-rb/dry-effects
https://github.com/digital-fabric/affect
https://github.com/macabeus/js-proposal-algebraic-effects
https://github.com/nythrox/effects.js
https://www.janestreet.com/tech-talks/effective-programming/
https://github.com/ocaml-multicore/effects-examples
https://overreacted.io/algebraic-effects-for-the-rest-of-us/
…음… 분명히 한국말으로 번역도 해놓았고, 심지어 js버젼으로 설명/예시도 있는데 나는 전혀 모르겠다 싶었음.
오히려 dry-rb, affect이 더 명확하기는 한거 같아.
가장 실용적으로 접근한 예는, ocaml-multicore에서 활용한 것들 같아 보인다.
분명히 장점을 볼 수 있을거 같은 개념 같다.
왜냐하면,
지금의 monad을 이용한 효과와 사용처의 분리 방식을 생각해보면, 하나의 monad context에서는, 한가지 타입의 monad만을 표현가능.…
Ping 13/06/2022 .01
기운 없는 날… 쉬어야겠다.…
jq manpage와 code
https://stedolan.github.io/jq/
jq이 뭐하는 도구인지 소개는 한국어로 많은데, 그걸 갖고 조금 복잡한 패턴을 처리하는 자료는, 머리 나쁜 내가 이해하기에 적합한 자료는 찾지 못해서, 그냥 manpage을 읽고 시도.
이미 알고 있는 도구, 혹은 이미 대부분의 unix-like, linux 시스템에 깔려있는 도구들이 있는데, 막상 그 도구의 manpage을 차분히 읽어 보면, 내가 너무 게을렀었고 알려고 하지 않았기에 내 삶을 더 도움을 받을 수 있었을텐데, 그렇지 못했었던 도구들이 많은것 같아.
gnu coreutils, m4, awk, perl 만 해도 그랬었고, 조금이라도 알아가고 응용을 할수록 매일매일이 더 재밌고 강력해졌었던거 같아.…
"Some Engineering Tough Sells"
https://posco.dev/blog/2022-04-23_draft_some-engineering-tough-sells/
…공감이 가는 부분들은:
dynamic serialization isn’t worth it, use statically defined serialization untested code is virtually always somewhat wrong doing things right pays off sooner than we usually imagine an ounce of design is worth a pound of implementation in data engineering, the data very often violates your beliefs about the shape thinking about, and minimizing edges in your code’s dependency graph is a win a good (i.e. programmable, fast, reliable, reproducible) build system solves a lot of practical software engineering problems …많은것들을 경험하되, 숙고와 자기객관화는 중요.…
Ping 11/06/2022
Jekyll –> Hugo 생각 Jekyll –> Hugo …Jekyll에서, 결국 다시 가볍고 그냥 잘 동작하는 Hugo으로 블로그 변경.1
생각 남들이 뭐래도 별 관심 없이. 실은 그냥 포장지와 리본장식만 변해가는거고,
반면. 그 포장지, 리본장식과 그 의미와 가치를 제대로 분간해내지 못하니까.
도구를 도구로 보면 안되고, 도구가 나를 쓴다는것을 이해해야 하는데. 그래서 도구를 이용해 자유로워질거라 착각하면, 도구에 얽메여 끌려만 가면…, 그런데 도구에 이용당해 복종할수록 자유로워진다면 …이겠지.
끌려가며, 내가 생각치 않은곳에 끌려와 진짜 성장을 얻기도 하는 이도 있고, 끌려가며 원치 않는 방향으로 가며 그게 성장이라고 허울로 하기도 하는 이도 있고.…
pytest fixtures와 의존성관리, 그리고 복잡도관리
# ...tests/conftest.py import pytest @pytest.fixture def name(): return 'Pokemon' @pytest.fixture(scope='function') def monster(name): ... # ...tests/foo_test.py : def test_beast(monster): ... # <--- `def monster(..)`의 결과를 주입 받음. https://docs.pytest.org/en/6.2.x/fixture.html
…파이썬에 다른 의존성주입 컨테이너들도 있지만, 흥미롭고 실용적이어서 자주 쓰게됨. 내가 소프트웨어 프로젝트에서 가장 중요하다고 생각하는 부분을 잘 캐치해주고, 편안하게 해주는 방식 같아.
‘거창함’이나 뭔가 남들이 좋다고 쓴다니까, 별 생각 없이 시도하는것들을 보면… 글쎄. ㅎㅎ……
(HN) "asshole test"
Some years back I applied to join IBM’s grad scheme, there was a peculiar stage to the process I’ve not seen elsewhere. It was during the onsite day, where a batch of 20 or so applicants were put through various tests in an IBM office. They called it the “group test”; around 8 of us were led to a room and asked to solve a puzzle together. Each of us was given an information pack, there was a white board, and a timer ticking down from 60 minutes.…
Hotwired 재밌다.
Hotwired 재밌다.
Stimulus, Turbo + Rails 7 갖고 이것저것 패턴별로 생각해보고 만드는게 즐겁네.
딱, 이렇게 문제 그자체를 이해하고 설계해놓은 것들은 익히고 사용하는게 너무 즐겁다. rails도 그랬었고, …처음 볼때에는 뭐 이렇게 단순해? 싶을 정도로.
너무 거창하거나, 실제로는 그 문제를 깊이 생각해서 푼게 아니라, 너무 범용적이고 범우주적인 해법(예: 상태관리, 컴포넌트 모델)만으로 퉁치려는것보다는. …이제 그런것들에 혹하거나 끌리지 않게 되었다.
그리고 또 한편으로는, 모든 해법은 단순하고 우아해야만 한다고 믿고 싶어서 믿는 fanboy가 되고 싶지도 않고.…
Ping 19/Jun/2021
그간은 여러 수고를 줄이고 싶어서 블로그도 문을 닫아 놓고, github repositories도 대부분은 private으로 변경해놓고 지냈었다.
하지만 그래도 coding과 글쓰기는 계속 하고 있었었고, 글을 조금씩이라도 공개할까 싶어 다시 문을 연다.
그간 변한 것이 있다면, 적어도 공부와 코딩 그리고 컴퓨팅에 대해서만,
Rust을 하고 지낸다는 점, 그리고 새로운 네트웍 프로토콜에 관심을 갖고 살고 있는 것, 또 라즈베리파이4와 좋아하는 배포판들이 더 생겼다는 것 같다.
그리고 여전히 emacs을 즐겁게 잘 사용하고 있고, 오히려 더 vim을 간간히 쓰는 것은 덜 쓰게 된 것 같아.…
Ping 29/Nov/2020
2020년이 지나간다. 금새 또 봄이 올텐데 기대된다.…
Ping 23/Nov/2020
logitech k480 bluetooth keyboard https://www.logitech.com/ko-kr/product/multi-device-keyboard-k480
받아서 묵혀두던 키보드. 팬터그래프 방식을 쓰던 것과는 또 다르지만 그럭저럭 마음에 든다.
가장 마음에 드는 부분은, 키들끼리의 간격이 적당하고, 키보드 레이아웃에서 마우스 이동이 없도록 키패드 부분이 없는 방식인 점, 그리고 장난감스러운 키보드지만 그렇다고 오타가 넘치도록 너무 대충 만들어진 것은 아닌 것 같아서 그럭저럭 짜증을 유발하지 않으면서 적당히 쓸 수 있는 것 같아서.
책상에 공간을 너무 잡아먹지도 않아서 그럭저럭 괜찮다.
다만 블루투스 방식이어서, 건전지를 써서 내게는 조금은 감점.…
Ping 13/Nov/2020
금새 겨울이 오고 있구나. …
Python + Generator / LeetCode "1614. max nesting depth of the parentheses"
지난 번 작성한 Common Lisp / LOOP매크로을 이용한 구현 을 다른 언어에서였다면, 비슷한 조건으로 메모리 복잡도 O(1)으로 풀어보고 싶었다.
from itertools import accumulate def find_paren_count(s): gen_only_parens = (ch == '(' and 1 or -1 for ch in s if ch in ('(', ')',)) return max(accumulate(gen_only_parens)) 다른 언어에서도 lazy stream을 지원한다면 비슷하게 풀 수 있을 것 같다.…
Ping 10/Nov/2020
올해 초에는 Vue.js을 많이 쓸일이 있었었다.
아주 오래 전에, Adobe Flex에서 MXML, ActionScript3 같은 것을 써서 화면 컴포넌트를 만들던 이후로 거의 10여년 만에 화면에 필요한 컴포넌트를 만들고 개발을 해봤다.
그 중간 중간 jQuery을 이용해서 웹화면을 만들거나 하는 경험도 있기는 했었는데, 재밌게도 그 이전에 사용하던 MXML, AS3의 컴포넌트 중심 개발방식이 훨씬 앞선 것이었다는 생각을 했다.
실제로 2008년 정도에도, 현재의 ES6 같은 느낌의 AS3으로, Class based OO을 하고 코딩을 하고, 화면 컴포넌트들을 JSX와 유사한 모양의 MXML으로 조직하고, 또 바인딩을 이용해서 지금의 Vue, React에서 State을 이용하여 데이터를 이용하여 컴포넌트를 어떻게 그릴지 결정해서 개발을 했었었다.…
Ping 05/Nov/2020
책을 몇 권 주문했다. 관심이 생긴 새로운 분야에 대한 책들이었는데 흥미롭게도 그 중 두 권이 서로 완전히 다른 분야인데 역저자가 같았다. 아마도 역자 소개에 나온 자신의 업무, 맡은 영역에서 필요하거나 관심이 깊어서 번역한 것 같다. 재밌었다.
그리고 갖고 있는 한국어로는 아직 나오지 않은 책을 세 권 정도 읽고 싶어서 다시 펼쳤다. 예전에도 조금 읽었었던 책들인데 마음에 들었던 구절들, 생각들이 다시 읽혀져 즐거웠다.…
"org-more.el" released!
org-more.el: search .org files have certain tags (#+tags[]: or #+tags[]:)
개인 위키, KB처럼 org 파일 모음을 사용하고 있는데, 디렉토리 계층과 직접 링크 관계만이 아니라 같은 태그들으로 묶어서 각 파일들을 검색하고 리스팅 할 수 있도록 만들었다.…
Ping 02/Nov/2020
(functional) reactive 관련들을 다시 찾아 보고 있다.
예전에 webdev은 아니고 백엔드를 위해서 rxjs 을 쓸 일이 있었었고 꽤 재밌었다. node.js에서 async/await 이전에 동시성 처리를 하기에 유용하게 쓸 수 있었었고, 실은 그냥 monad이어서 조금만 이해를 하고 사용하면 여러모로 편리했었다.
https://github.com/stoeffel/awesome-frp-js 여기에 보면 rxjs이외에도 다른 js을 위한 FRP라이브러리들이 많이 생겼었다.
그 중에 흥미가 있어서 bacon.js 을 읽고 rxjs에서 만들어 본 작은 예제 프로젝트를 다시 작성해봤다. 깔끔했다.
rxjs으로 작성했었던 작은 예제는 다음과 같다.…
"asdf-subdir-finder" released!
지난번 포스팅한 "asdf 정의를 내 코드베이스의 하위디렉토리에서 자동으로 로딩하기"를 프로젝트으로 만들었다.
https://github.com/ageldama/asdf-subdir-finder
사람마다 커먼리습으로 작업하는 스타일에 따라 많이 다를 수 있어서 안 써도 되기도 하지만, 그냥 정리해서 공개는 해봤다.…
"커먼리습 ASDF 불러오기 편하게 하기" 대모험
ASDF와 system definition file 검색의 정석 이전에 ASDF을 이용하여 커먼리습 프로젝트의 의존성, 시스템을 로딩하기 에 대해서 설명한 적이 있었다.
이전에 다룬 내용은 정석적으로 $HOME/common-lisp 디렉토리에 .asd 파일을 심볼릭링크를 걸고, (asdf:load-system ..) 을 시도하는 내용이었었다.
Prototyping등 더 편안하게 혼자 코딩을 할 때는… 혼자 커먼리습 코딩을 하면서, 나는 더 간단하게 프로젝트를 시작하는 방법을 선호한다.
커먼리습이 파일 이름이나 경로에 대해서 의존하는 것이 아니고, 컴파일시점, 로딩시점에 순서에 따라 로딩해서 최종적으로 컴파일하여 적재한 결과 이미지를 더 중요하게 여기기 때문에, 그리고 그런 컴파일, 빌드, 로딩과 같은 모든 단계들 자체도 커먼리습 표현식 그자체로 동작하기 때문에 그냥 하나의 소스파일을 섹션별로 나눠서 작업하면 편리하다.…
CommonLisp (w/o LOOP-macro) / LeetCode "1614. max nesting depth of the parentheses"
어제 작성한 LOOP매크로을 이용한 구현 을 풀어서, 만약 LOOP매크로가 없었더라면 어떻게 짰을지 작성해봤다.
(defun max-nested-parentheses-raw (s) (declare (optimize (speed 3) (safety 0)) (type simple-string s)) (let ((n 0) (result 0)) (declare (type fixnum n result)) (dotimes (s--cur-idx (length s)) (let ((ch (elt s s--cur-idx))) (when (member ch '(#\( #\))) (incf n (if (eql #\( ch) 1 -1)) (setf result (max n result))))) result)) 여전히 타입을 지정해서 자동으로 타입추론, 최적화 하도록 했다.…
CommonLisp / LeetCode "1614. max nesting depth of the parentheses"
문제 https://leetcode.com/problems/maximum-nesting-depth-of-the-parentheses/
작성한 코드 (defun max-nested-parentheses (s) (declare (optimize (speed 3) (safety 0)) (type simple-string s)) (loop with n fixnum = 0 for ch across s when (member ch '(#\( #\))) do (incf n (if (eql #\( ch) 1 -1)) maximizing n)) 코드 의도 우아한 코드보다는 공간복잡도가 O(1) 이고 싶었다. Edit SBCL에 맞춰 코드에 타입을 지정해줘봤다.
결과 어셈블리 코드가 조금 짧아졌다. …
Ping 19/Oct/2020
가을 도르트문트 집은 꽤 평화로웠다. 날씨가 좋은 날도 많고 공기도 맑았다. 한가한 주말이 되면 창문을 열고 잔디가 깔린 정원을 보며 담배를 태우고 커피를 내려 마셨다.
그리고 지하세탁장에 빨래를 돌려놓고 핑크플로이드의 다크사이드 오브 더 문 앨범을 좋은 스피커로 틀어놓았다. 잘 어울렸다.
서울의 변두리에서 맞는 이번 가을은 그런 기분이다. 조용하고 가을 햇살과 공기가 맑아졌다.
그리고 핑크플로이드를 그렇게 여유롭게 들을 수 있었다.
오늘 읽으려는 글 http://www.mcs.vuw.ac.nz/comp/Publications/CS-TR-02-9.abs.html…
Ping (2nd) 17/Oct/2020
올해 초 cl-state-machine 라이브러리를 만들어 공개한 이후로 커먼리습을 쓰지는 않았다.
다른 직업상 쓰는 언어들만을 쓰고 오픈소스와 개인적으로 만들고 싶은 프로젝트를 위해서 쓰는 언어인 커먼리습은 미뤄두었었다.
다시 커먼리습을 해야겠다고 생각이 들었다. 개인적으로 만들고 싶은 프로젝트도 있고, 그 프로젝트를 위해서 프론트엔드를 만드는데 React와 Vue을 써보고 이해하고 있어도 쓰고 싶지는 않기 때문이다.
사실 커먼리습은 그렇게 문법이 예쁘지도, 멋진 React와 같은 멋진 프레임웍이나 최신의 유행하는 라이브러리들을 모두 갖고 있지도 않다.
HyperSpec을 읽다 보면 아주 쉽게 정의되어 있는 키워드들이 일관성이 있지도, 지금 시대의 관점에서 보기에 익숙한 현대적인 용어들을 사용해서 이름을 지어놓지도 않았다.…
Ping 17/Oct/2020
웹프론트엔드 개발을 조금씩 해보고 있다. 처음에는 예전 방식으로만 하려고 하다가 조금씩 겨우 써보던 webpack을 다시 가이드를 차근차근 공부하고 동작하는 방식을 이해하도록 뜯어보고 돌려봤다.
생각보다 단순하게, 그리고 확장성 있게 쓸만한 빌드도구였다.
다만 문제는 설정이 복잡하고 이해하기 힘든 점보다는 빌드 시간이 너무 느린 점이었다. (내게는)
그래서 parcel bundler을 시도 했는데, 설정도 거의 필요 없이 바로 동작하고 하는 점은 좋고, 성능도 정말 빨랐다.
다만 Vim/Emacs으로 파일을 편집하고 저장할 때, parcel watch 대상인 파일들을 종종 아예 dev-server을 재시작해야만 제대로 동작하는 상태로 빠지는게 조금 짜증났다.…
Ping 16/Oct/2020
ADT1만큼 만들어 쓰는 것은 아니지만, 그냥 Kotlin, Python의 dataclass 정도는 쓰고 싶어서 CommonLisp 매크로를 만들어봤다.2
equals 라이브러리를 써서 동치 비교와 CLOS의 print-object generic function을 구현해서 to-string 정도만 되도록 만들어 봤다.
macro body (defmacro define-data-class (class-name parent-classes slot-names &key (no-print-slot-names nil) (no-equals-slot-names nil)) (flet ((accessor-symbol (slot-name) (alexandria:format-symbol *package* "~a-~a" class-name slot-name))) (list 'progn ;; defclass (let ((slot-defs (loop for slot-name in slot-names collecting `(,slot-name :initarg ,(alexandria:make-keyword slot-name) :accessor ,(accessor-symbol slot-name))))) `(defclass ,class-name ,parent-classes ,slot-defs)) ;; defmethod print-object (let* ((print-slot-names (set-difference slot-names no-print-slot-names)) (fmt-ctrl (format nil "~{~a=~~a~^, ~}" print-slot-names))) `(defmethod print-object ((obj ,class-name) stream) (print-unreadable-object (obj stream :type t) (with-slots ,print-slot-names obj (format stream ,fmt-ctrl ,@print-slot-names))))) ;; defmethod equals:equals (let* ((equals-slot-names (set-difference slot-names no-equals-slot-names)) (equals-exprs (loop for equals-slot-name in equals-slot-names collecting `(equals:equals (slot-value lhs (quote ,equals-slot-name)) (slot-value rhs (quote ,equals-slot-name)))))) `(defmethod equals:equals ((lhs ,class-name) (rhs ,class-name) &rest args) (declare (ignore args)) (and t ,@equals-exprs))) ))) synopsis / usage (define-data-class animal () (name age)) (define-data-class bird (animal) ()) (equals:equals (make-instance 'animal :name "foo" :age 18) (make-instance 'animal :name "foo" :age 18)) 오랬만에 재밌었다.…
Ping (2nd) 15/Oct/2020
… '田大'이라고 적혀 있었다.
다른 한문으로 쓰여 있어 읽지 못하는 각각의 수 많은 바램들과 이름들 사이로 삐뚤빼뚤한 어색한 글씨로 그렇게 적혀 있었었다.
너무 단순한 이름, 그리고 설명이 붙어 있었듯이, 다른 사람들처럼 많은 이야기를 적고 싶었지만, 아이여서 그랬는지, 아니면 글을 몰라 그랬는지, 이름만이라도 적어놓은 그 못그린 그림 같은 두 글자를 읽었다.
누군가 아주 오래 전에 그 사람도 아마도 나와 별로 다를 것도 없는 고민들을 하며 매일을 살았었던 것을 느꼈다.
아주 오랜 세월이 흐른 후에야 그렇게 만났었던 모르는 어떤 사람이 떠올랐다.…