염산하
@[email protected] · Reply to 푸른곰's post
@purengom 헛... 첨 듣는 엑스포 소식이네요...
@[email protected] · 20 following · 15 followers
A software engineer in Seoul, and a father of a kid.
@[email protected] · Reply to 푸른곰's post
@purengom 헛... 첨 듣는 엑스포 소식이네요...
헛 F1 차는 오토가 아니고 클러치도 패들 시프트였어!!??
@[email protected] · Reply to 염산하's post
와... 최근 읽은 비소설 중에 최고로 재미있었다. 네이트 실버가 유명하다는 건 알고 있었지만 책은 처음 읽었는데, 끊임없이 읽을 수 있는 책을 만드는 사람이었네. 두께가 어마어마한데도 지루하지가 않았다.
This is a wildly creative set of customizations for Claude Code, using the new plugin system they just released. There are SO many fascinating ideas in this! Strongly recommend reading it and then spending some time exploring the accompanying repo: https://github.com/obra/superpowers
TIL Claude's new code interpreter mode has a /mnt/skills/public/ folder full of prompt instructions and Python utilities for creating and manipulating pdf, docx, pptx, xlsx files - and you can ask Claude for a copy and learn a TON about working with those formats
[속보] 노벨 평화상에 베네수엘라 야권 지도자 ‘마리아 코리나 마차도’
n.news.naver.com/mnews/articl...
“커지는 어둠 속에서 민주주의를 지킨 여성”
[속보] 노벨 평화상에 베네수엘라 야권 지도자 ‘마리아...

오는 11月 8日 光云大學校에서 開催되는 FOSS for All 컨퍼런스 2025에서 제가 〈야크 셰이빙: 새로운 오픈 소스의 原動力〉이라는 主題로 基調演說을 하게 되었습니다!
올해 처음 열리는 FOSS for All 컨퍼런스는 “Free and Open Source Software for All”이라는 슬로건 아래, 모두를 爲한 오픈 소스 컨퍼런스를 目標로 하는 非營利 오픈 소스 커뮤니티 컨퍼런스입니다.
@[email protected] · Reply to 푸른곰's post
@purengom ㅜㅜ
기억의 구축(memory construction), 즉 ‘기억하는 것’은 사고의 가능성을 결정짓는 핵심적 과정이기 때문이다.
인공지능이 이러한 학습 과정을 대신 수행하게 되면, 인간의 예측–오류–수정의 순환, 즉 보완적 학습 체계의 핵심 메커니즘이 차단된다
비판적으로 사고한다는 것은 단편적인 사실을 받아들이는 것이 아니라, 여러 정보 사이의 ‘관계를 탐색하고 그 타당성을 따져 보는’ 일이다
정보를 ‘아는 것’과 그것을 ‘사고의 재료로 사용하는 것’은 전혀 다른 일이다. 정보 간의 인과적·조건적 관계를 스스로 탐색하거나 검증하지 않기 때문에, 학습자는 관계적 표상을 구축하지 못한다. 그 결과 표면적으로는 풍부한 지식을 갖고 있는 것처럼 보이지만, 실제로는 서로 이어지지 않은 정보의 파편들만 머릿속에 존재하게 된다.
인지적 외주화를 통해 지식을 피상적으로 습득한 사람은 문제를 스스로 해결할 힘을 잃고, 외부의 지시나 권위, 혹은 기술적 시스템에 의존하게 된다. 이때 문제 해결력이 저하된 개인은 타인의 논리를 검증하거나 외부의 주장을 비판적으로 판단할 능력을 잃는다. 이는 단순한 사고력의 약화가 아니라, 정당성을 분별할 수 있는 사유 능력의 상실이다.
결국 교사는 학습자가 사유의 지구력을 기르고, 기억의 구조 위에서 사고를 확장하도록 돕는 존재이다. AI가 사고를 대신할 수 있는 시대일수록, 교사는 인간이 스스로 사고하고 존재할 수 있도록 인지적 환경을 설계하는 사유의 불씨를 지키는 사람, 그리고 학습의 인간적 품위를 지탱하는 최후의 수호자가 되어야 할 것이다
와 한글날 기념 유튜브 로고인가
@[email protected] · Reply to Woojin Kim's post
@me 으어... 좀 있으신 분!!
@ 얼마 전에 한강 작가가 노벨문학상 받지 않았어요? 근데 내일 또 노벨문학상 발표를 한다고요?
한국 사람들 작년 12월의 다소 불미스러운 사건으로 1년 스킵돼서 시간감각 엉망된거봐...
I figured out a uv recipe for running the tests for the current project (any directory with a pyproject.toml or setup.py) using any version of Python:
uv run --python 3.14 --isolated --with-editable '.[test]' pytest
I've wrapped it as a script, uv-test, so I can do this instead:
uv-test -p 3.11
Details here: https://til.simonwillison.net/python/uv-tests
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/[email protected] from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
**A shortcut for your shortcuts**
In the latest Zen update we introduced some improvements to the command bar, which now understands when you're not looking for a website. Just press the tab key and your search narrows down to actions like pinning a tab, opening an extension, creating a split view and much much more.
Now available in 1.16.3b
— https://zen-browser.app/release-notes/#1.16.3b

機会が有ればHolloを一度大規模にリファクタリングしたいんだけど、時間が無い。リファクタリングするならやりたいことリスト:
세 시간짜리 조용필 콘서트 KBS에서 한다 캬 좋다... 엄마랑 같이 보는 중
claude.ai 의 프로젝트는 프로젝트 내의 다른 대화를 참조할 수 있는데 자동식이 아니라 수동식이다. 내가 과거 대화를 찾아보라던가 이전의 이런 대화를 어쩌고 하는 식으로 명시적 요청이 있을 때 검색해보고 사용하는 식. 제어 가능하고, 과거 대화가 새 대화에 미묘하게 영향을 주지 않아서 좋은 방식이라고 느꼈다.
워싱턴포스트에 한국 인터넷 성인만화광고 문제를 지적한 컬럼이 올라왔다. https://www.washingtonpost.com/world/2025/09/26/webtoon-online-ads-explicit-violence/
뉴스 기사 같은 일반 사이트에서도 '여성이 남성의 성폭행으로부터 도망치는 장면' 같은 성폭력적인 내용의 웹툰 광고가 버젓이 나오는데, 기사에서는 여러 회사나 단체가 언급되지만 누구에게 책임이 있는지는 잘 드러나지 않는다. 성인웹툰 회사들은 "개선하고 있다" 같은 원론적 답변만 내놨고.
#cosmoslide 작업 내역
https://github.com/cosmoslide/cosmoslide/pull/45 PDF 업로드 기능이라도 구축은 해야할 것 같아서 진행함. 보통은 express라던가 등등 JS 기반의 웹서버 프레임워크에서는 파일시스템/S3/GCS 등의 스토리지에 파일을 업로드할때, 스토리지에 접근하는 과정 자체를 추상화하는 flydrive라는걸 쓰는데, flydrive는 NestJS에서 사용이 되지 않는 ESM-only 모듈이어서, 어떻게 해야 하나 하다가 Claude Code한테 AWS S3에 접근하는 것만 적당히 추상화해서 야크쉐이빙 해달라고 했더니 그냥 순식간에 되었다. 문서를 뜯어보고 구현해야하는 수고는 줄었고, aws sdk를 어떻게 활용하는지는 가성비있게 학습할 수 있는 기회가 되었다.
https://github.com/cosmoslide/cosmoslide/pull/46 프로필 화면에 Presentation 탭을 넣었고, 프레젠테이션 파일을 업로드하면 Create(Note) 액티비티가 발생되도록 처리했다. react-pdf 이용해서 커스텀 PDF 뷰어 적당히 끼워넣었다.
@[email protected] · Reply to 염산하's post
아이폰에서 웹앱 형태로 설치했던 phanpy 는 로컬데이터 지우는 방법 찾기 귀찮아서 그냥 지우고 웹 브라우저 바로가기 형태로 변경했다.
@[email protected] · Reply to 푸른곰's post
@purengom 많이 쓰시네요 ㅎㅎㅎ 혹시 어디 쓰시나요? ^^
배외 감정에 대한 통계가 기억나지는 않지만 지난 대선에서 조사된 2030남성 보수 지지층이 대부분 고학력자들이라는 통계와는 충돌하는 주장이라고 생각됨.
https://x.com/stingraykite/status/1974155607822516566?s=46&t=3SSCMzU8n1YA4_S4Nc9Piw
hollo 0.6.12 로 업그레이드 성공! phanpy.social 은 수작업으로 로컬에 생긴 모든 데이터를 일일이 지워줘야 잘 되는 듯.
https://hollo.social/@hongminhee/0199aab3-d7c3-7e81-8ecb-e374ec6738a7

@[email protected] · Reply to 洪 民憙 (Hong Minhee) :nonbinary:'s post
#Hollo 쓰시는 분들은 可能한 限 빨리 0.6.12 버전으로 올리시기 바랍니다. DM이 公開 揭示物 페이지에서 露出되는 深刻한 保安 脆弱點이 패치되었습니다.
https://hollo.social/@hollo/0199aaaf-7979-7da3-9509-73c9e487de05

@[email protected] · Reply to 洪 民憙 (Hong Minhee) :nonbinary:'s post
#Hollo 쓰시는 분들은 可能한 限 빨리 0.6.12 버전으로 올리시기 바랍니다. DM이 公開 揭示物 페이지에서 露出되는 深刻한 保安 脆弱點이 패치되었습니다.
https://hollo.social/@hollo/0199aaaf-7979-7da3-9509-73c9e487de05

We've released #Hollo 0.6.12 to fix a critical privacy #vulnerability where direct messages were being exposed in the replies section of public posts. Please update your instances immediately to ensure your private conversations remain private.
@[email protected] · Reply to 洪 民憙 (Hong Minhee) :nonbinary:'s post
@hongminhee 호옥시 0.5 계열도 올려야할까요?
:terminal 커맨드를 사용하면서 알게 된 내용
:terminal excommand는 buftype이 'terminal'인 buffer를 연다
Terminal-Job 모드와
vim-keybinding을 사용할 수 있는 Terminal-Normal 모드를 지원한다.Terminal-Job모드에서 Terminal-Normal모드로 전환은 키를 이용한다. (:h terminal-typing)
<C-\><C-N><C-W>N(CTRL-W 입력 후 그냥 대문자 N을 입력):terminal로 진입하면 기본적으로 Terminal-Job모드로 설정된다.Terminal-Job모드에서 인터랙티브 셸을 종료하면 해당하는 terminal buffer가 닫힌다.Terminal-Job모드는 tmap을 이용하여 제어할 수 있다.
tmap jj <C-W>N은 imap jj <ESC> 만큼 유용하다
less 바인딩에서 네비게이팅하기 어려워 별도의 키바인딩을 사용하는게 좋다.
tnoremap <C-Q> <C-W>Ntnoremap <C-S-V> <C-W>"+를 이용하여 unnamedplus 레지스터의 내용을 붙여넣는다feedkeys 함수를 이용한다
call feedkeys("i\<C-u>")
i)<C-u>)
$ bind -p | grep unix-line-discard "\C-u": unix-line-discardterminal buffer에서는 terminal-api를 이용해 vimscript를 호출할 수 있다.(:h terminal-api)
Tapi_를 prefix로 가지는 함수만 실행 가능하다Tapi_ prefix는 term_sendapi 함수를 이용해 prefix를 바꿀 수 있다:source %로 등록한다function Tapi_Test(bufnum, arglist)
echomsg a:bufnum
echomsg a:arglist
endfunction
:terminal로 Terminal-Job모드에서 다음을 실행시킨다.$ printf '\e]51;["call","Tapi_Test","asdf"]\x07'
:messages에서, bufnum과 arglist가 제대로 출력되었는지 확인한다.terminal-api는 이렇게 사용 방법이 복잡하고 8.2 버전 이상부터 지원되었기 때문에 가장 접근성 및 인지도가 떨어지는 기능 중 하나라고 생각한다.
terminal-api는 사용하는 방법이 매우 복잡하고, help 문서에 실사용 예시 지원이 부족하다terminal-api는 존재를 모르거나 알아도 호환성 등의 이유로 사용하지 않을 가능성이 있다.다음은 terminal-api를 이용하여 terminal-job 모드에서 파일시스템을 네비게이팅하며 terminal-job 모드의 pwd를 vim의 pwd로 sync하는 예시이다
동작원리는 다음과 같다
setbufvar를 이용하여 osc7_dir를 설정하는 terminal-api 함수를 만든다function! Tapi_SetOsc7_Dir(bufnum, arglist)
call setbufvar(a:bufnum, 'osc7_dir', a:arglist)
endfunction
.bashrc에 등록한다_setosc7dir() {
printf '\e]51;["call","Tapi_SetOsc7_Dir","%s"]\x07' "$PWD" # for vim terminal api
}
alias setosc7dir="_setosc7dir"
$PROMPT_COMMAND를 설정한다export PROMPT_COMMAND='setosc7dir; '"$PROMPT_COMMAND"
$PROMPT_COMMAND는 모든 실행마다 추가적으로 실행되는 커맨드이므로, 무거운 작업을 등록하기 적절하지 않다.
__osc7_prev_pwd와 비교하는 로직을 추가한다__osc7_prev_pwd=""
_setosc7dir() {
if [[ "$PWD" != "$__osc7_prev_pwd" ]]; then
printf '\e]51;["call","Tapi_SetOsc7_Dir","%s"]\x07' "$PWD" # for vim terminal api
__osc7_prev_pwd="$PWD"
fi
}
osc7_dir 변수가 pwd로 갱신된다cd만 호출하면 된다. 이 작업은 vim에서만 이루어진다function! SyncTerminalPwd()
let term_bufnr = bufnr()
let osc7_dir = getbufvar(term_bufnr, 'osc7_dir')
if isdirectory(osc7_dir)
echo 'osc7_dir: ' .. osc7_dir
execute 'cd ' .. osc7_dir
endif
endfunction
TerminalOpen 이벤트 autocmd에 setlocal을 이용해 키맵을 설정하자function! SetupTerminalOpen() abort
" <leader>cd : osc7_dir으로 pwd 설정
execute 'nnoremap <buffer> <leader>cd :call SyncTerminalPwd()<CR>'
endfunction
" TermOpen 이벤트에 대한 자동 명령
augroup TerminalKeymaps
autocmd!
autocmd TerminalOpen * call SetupTerminalOpen()
augroup END
:sh를 이용하여 vim의 내장 shell을 매우 적극적으로 활용했는데, 기본 동작은 vim의 pwd를 기준으로 interactive shell을 열어준다.feedkeys를 이용하여 pwd로 cd하는 명령을 보내는 것이다
getcwd로 얻을 수 있고, 터미널 버퍼에 해당 path로 cd하는 명령만 추가적으로 보내주면 된다feedkeys를 활용한다
function! OpenTerminal()
for listed_buffer in filter(getbufinfo(), 'v:val.listed')
let bufnr = listed_buffer.bufnr
let buftype = getbufvar(bufnr, '&buftype')
let buftype = (buftype == '' ? 'normal' : buftype)
if buftype == 'terminal'
execute 'buffer! ' .. bufnr
let pwd = getcwd()
" sync vim pwd
call feedkeys("i\<C-u>cd " .. pwd .. "\<CR>")
return
endif
endfor
execute 'terminal!'
endfunction
물론 키바인딩도 추가한다
nnoremap <C-D> :sh<CR>를 이용하여 vim->내장 셸, 내장 셸 -> vim을 토글하는 키로 <C-D>키를 사용해 왔으므로, 터미널 버퍼로 같은 동작을 하는 키를 <C-D>로 하여 대체한다
nnoremap <C-D> :call OpenTerminal()<CR>문제는 다음과 같다
<C-D>키를 이용한 vim-셸 토글이 작동하지 않는다
Terminal-Job 모드에서 <C-D>를 입력하면 셸이 종료되며 이를 실행하던 버퍼도 같이 닫는 방식으로 동작하기 때문이다execute 'nnoremap <buffer> <C-D> :buffer! #<CR>'setlocal hiddensetlocal nonumbersetlocal nolistexecute buffer 부분에서 언제나 현재 열려있는 버퍼를 터미널 버퍼로 전환하므로, 터미널 버퍼를 다른 윈도우에 분할해서 사용하는 내 사용 방식에서는 불필요하게 두개의 윈도우가 하나의 터미널 버퍼를 연다.setbufvar로 winid를 지정해두고, 터미널 버퍼를 찾으면 먼저 해당 버퍼에 저장된 winid를 이용해 윈도우를 전환한 후 execute buffer를 실행하여 해결한다문제를 해결한 시점의 vimscript
~/.vim/autocmd/terminal.vim
function! SetupTerminalOpen() abort
let term_bufnr = bufnr()
setlocal hidden
setlocal nonumber
setlocal nolist
" <C-D> : 이전 버퍼로 전환
execute 'nnoremap <buffer> <C-D> :buffer! #<CR>'
" <leader>cd : osc7_dir으로 pwd 설정
execute 'nnoremap <buffer> <leader>cd :call SyncTerminalPwd()<CR>'
call setbufvar(term_bufnr, 'winid', bufwinid(term_bufnr)) " save winid
endfunction
" TermOpen 이벤트에 대한 자동 명령
augroup TerminalKeymaps
autocmd!
autocmd TerminalOpen * call SetupTerminalOpen()
augroup END
function! OpenTerminal()
for listed_buffer in filter(getbufinfo(), 'v:val.listed')
let bufnr = listed_buffer.bufnr
let buftype = getbufvar(bufnr, '&buftype')
let buftype = (buftype == '' ? 'normal' : buftype)
if buftype == 'terminal'
let term_winid = getbufvar(bufnr, 'winid')
if win_id2win(term_winid) != 0
" terminal buffer window is opened
" move cursor to the window
call win_gotoid(term_winid)
endif
execute 'buffer! ' .. bufnr
let pwd = getcwd()
" sync vim pwd
call feedkeys("i\<C-u>cd " .. pwd .. "\<CR>")
return
endif
endfor
execute 'terminal! ++curwin'
endfunction
이정도 설정으로 잘 활용하고 있었으나, 사용 중
psql이나 python등의 REPL 프로그램을 터미널 버퍼에 실행시키고 있는 경우 해당 버퍼로 전환 할 때 마다 cd path가 입력되는 것이 불편했다g:open_terminal_mode 글로별 변수와 모드를 전환하는 키맵을 이용해 해결한다
let g:open_terminal_mode = 0
nnoremap <space><space><space> :call ToggleOpenTerminalMode()<CR>
g:open_terminal_mode는 4가지 값을 가질 수 있다
:sh 사용:terminal 사용 (sync pwd):terminal 사용 (sync pwd 용 cd 명령을 보내지 않음, REPL 작업용):vsplit에서 :terminal 사용, 1회용으로 잠깐 command를 실행할 때모드 변경 및 동작방식 확인이 필요하므로 다음 help function을 추가한다
function! PrintOpenTerminalMode()
let terminal_modes = [':sh', ':terminal (cd pwd)', ':terminal', ':terminal (vs)']
let mode_repr_list = []
for idx in range(len(terminal_modes))
let t_mode = terminal_modes[idx]
if g:open_terminal_mode ==# idx
let t_mode = '< ' .. t_mode .. ' >'
endif
call add(mode_repr_list, t_mode)
endfor
echomsg join(mode_repr_list, ' | ')
endfunction
function! ToggleOpenTerminalMode()
let g:open_terminal_mode = (g:open_terminal_mode + 1) % 4
call PrintOpenTerminalMode()
endfunction
function! OpenTerminal()
call PrintOpenTerminalMode()
if g:open_terminal_mode == 0
execute ':sh'
return
endif
if g:open_terminal_mode > 0
for listed_buffer in filter(getbufinfo(), 'v:val.listed')
let bufnr = listed_buffer.bufnr
let buftype = getbufvar(bufnr, '&buftype')
let buftype = (buftype == '' ? 'normal' : buftype)
if buftype == 'terminal'
let term_winid = getbufvar(bufnr, 'winid')
if win_id2win(term_winid) != 0
" terminal buffer window is opened
" move cursor to the window
call win_gotoid(term_winid)
endif
if g:open_terminal_mode == 3 && len(getwininfo()) == 1
execute 'vsplit'
endif
execute 'buffer! ' .. bufnr
if g:open_terminal_mode == 1
let pwd = getcwd()
" sync vim pwd
call feedkeys("i\<C-u>cd " .. pwd .. "\<CR>")
endif
if g:open_terminal_mode == 3 && mode() == 'n'
call feedkeys("i\<C-u>")
endif
return
endif
endfor
if g:open_terminal_mode == 3
execute 'vsplit'
endif
execute 'terminal! ++curwin'
endif
endfunction
Introducing Claude Sonnet 4.5—the best coding model in the world.
It's the strongest model for building complex agents. It's the best model at using computers. And it shows substantial gains on tests of reasoning and math.
회사에서 딴 짓하고 싶다는 말에 터미널로 책을 읽으면 되는거 아니냐는 이야기가 나와서, 설마 Neovim 플러그인 중에 epub 플러그인이 있을까? 하고 알아봤다. 진짜 있다. vim 사용자들의 집념은 뭘까 진짜...
@[email protected] · Reply to Woojin Kim's post
@me 흠.. 이름이 어감이 좀...