염산하

@[email protected] · 16 following · 13 followers

A software engineer in Seoul, and a father of a kid.

염산하

@[email protected]

미성년 자녀 아이폰에서 자녀 앱스토어 계정으로 설치한 앱의 앱내 구매를 해주려는데 지불방법 확인이 나오고 시도하면 알 수 없는 오류로 진행이 안된다. 내가 가족 대표라서 일단 내 폰에서 지불방법 확인을 하려고 해도 뭔가 이상하게 안된다. 맥북의 사파리에서 애플아이디 사이트에 로그인하고 새 신용카드를 지불방법으로 등록했다. 내 핸드폰에서도 추가된 신용카드가 보이는 것을 확인. 자녀 핸드폰을 껐다 켬. 다시 앱내 결제 시도, 결제 방법 확인 하라고 떴는데 새로 추가한 신용카드이다. 핸드폰 번호로 본인 확인하고 성공! 대략 한 시간 정도 삽질.

Jaeyeol Lee's avatar
Jaeyeol Lee

@[email protected]

Javascript/Typescript 생태계에는 소스코드 간 의존관계를 유향그래프(Direct Graph)로 시각화하는 CLI 도구가 있다는 사실... 알고 계신가요? madge, 적극적으로 추천합니다.

그냥 JS/TS 프로젝트 뿐만이 아니라, jsx 파일이 들어간 경우도 의존관계를 아름답게 시각화해줍니다. fedify 소스코드 통독하면서 이걸 적극적으로 써볼까 합니다. 마치.... 탐정이 사건 추적하면서 지도에 X 표시하는 감성으로...

fedify 프로젝트를 그래프로 아름답게 시각화한 모습이다.
염산하

@[email protected]

요즘 트위터 보면 뭔 사건에 대한 말인지 모를 때가 많다. 그러면 그냥 트윗 복사해서 퍼플렉시티 리서치 시킨다. 아주 잘 알려주네...

염산하

@[email protected]

듀오링고 앱에는 소소한 변화가 진짜 자주 있다. 갑자기 라이브 액티비티까지 등장

듀오링고 잠금화면 공격
Deno's avatar
Deno

@[email protected]

Deno 2.4 is here:
⭐ deno bundle is back
⭐ bytes and text imports
⭐ stabilized OTel
⭐ modify environment with --preload flag
and much more 👇

deno.com/blog/v2.4

염산하

@[email protected]

요즘은 검색할 때 퍼플렉시티 리서치 기능만 쓴다. 폰에서든 브라우저에서든 질문하고 1분에서 3분 정도 지나면 알림이 오는데 중간에 나가도 상관 없어서 쳐다보고 있지 않아도 되어서 좋다.

Jaeyeol Lee's avatar
Jaeyeol Lee

@[email protected]

https://tidyfirst.substack.com/p/augmented-coding-beyond-the-vibes

오늘 줍줍한 키워드는 augmented coding

복설 뉴스's avatar
복설 뉴스

@[email protected]

'SPC 끼임 사망' 노동자, 이전에도 부상..."산재 계속" (영상) www.ytn.co.kr/_ln/0103_202... "산업재해로 인정된 경우만 따지더라도 한 달에 12건에서 14건꼴로 사고가 난 겁니다. [A 씨 / SPC삼립 시화공장 전 직원 : 다리가 찢어지거나 다친 분들도 많고, 머리 깨지신 분들도 많고, 항상 사건·사고는 늘 많았죠.] [B 씨 / SPC삼립 시화공장 전 직원 : 손가락 절단 같은 건 자주 일어났어요. 적재하는 그런 데에 발이 끼는 사고도 일어나고….]"

[단독] 'SPC 끼임 사망' 노동자, 이전에도 부상....

한겨레's avatar
한겨레

@[email protected]

노벨 문학상 수상자인 한강의 소설 ‘채식주의자’ 등을 유해매체물로 지정하고 교육청과 학교에 폐기를 압박해온 단체들도 리박스쿨과 함께 활동해온 것으로 나타났습니다.

[단독] “채식주의자 폐기하라” 교육청 압박한 단체들도...

Jaeyeol Lee's avatar
Jaeyeol Lee

@[email protected]

"오늘의 해커뉴스 요약"이라고 한국어로 매일마다 해커뉴스를 한국어로 요약해서 보내주는 헤임달 프로젝트가 있었습니다. 언제부턴가 다시 다른 이름으로 부활했는데요...... 바로 요겁니다. https://every.news 좀 더 범용적인? 느낌으로 다시 부활한 것 같아요.

Thanks to @anaclumos

매일마다 해커뉴스를 요약해서 보내주는 뉴스레터는 요깄습니다 https://every.news/alerts/8XYPTZZVV7ZJ

염산하

@[email protected]

어떻게 하면 커서를 버리고 클로드 코드 200달러짜리로 갈아탈 수 있는지 아직 감이 안잡힌다. 너무 소심한건가

염산하

@[email protected] · Reply to 염산하's post

"함께 발화하는 신경세포는 하나로 연결된다. 더 정확히 말해보겠다. 이 사고방식에 따르면 우리 뇌가 학습하는 이유는 한 신경세포의 출력이 다른 신경세포의 발화와 일관되게 연관될 때는 신경세 포 사이의 연결이 강해지고 그렇지 않을 때는 약해지기 때문이다. 이 과정을 헤브 학습 Hebbian learning이라고 부른다.

염산하

@[email protected] · Reply to 염산하's post

"기계처럼 들리는 낱말을 쓴 것은 로젠블랫이 지독히 후회하는 일 중 하나"였다. 로젠블랫이 염두에 둔 '퍼셉트론'의 진짜 의미는 지각과 인지를 위한 신경계 모형의 한 부류였다.

염산하

@[email protected] · Reply to 염산하's post

로젠블랫의 퍼셉트론이 장안의 화제가 된 것은 놀랄 일이 아니다. 데이터에서 가중치를 학습할 수 있었으니 말이다. 어떤 면에서 가중치는 데이 터에 들어 있는 패턴에 대한 (아무리 사소할지언정) 지식을 부호화하여 기억

염산하

@[email protected]

매컬러-피츠McCulloch-Pitts, MCP 모형을 단순화한 이 형태에서 x1과 x2는 0이거나 1이다. 형식 표기법으로 나타내면 아래와 같다.

누가 MCP 를 선점했었네 ㅋㅋ 기계는 왜 학습하는가

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@[email protected]

As the maintainer of , I'd be grateful for your support to help keep the project sustainable! :fedify:

https://hollo.social/@fedify/0194b112-b604-7d03-84e0-4faaf4ab46cd

:heart_nb: 호켓쿄's avatar
:heart_nb: 호켓쿄

@[email protected] · Reply to :heart_nb: 호켓쿄's post

새삼 느낀 국내 스트리머들이 자연스럽게 혐오발언을 하게 되는 이유에 대해 (2)

이게 결국엔 미디어 교육의 필요성을 굉장히 강하게 어필하는데, 성차별적인 표현을 피하자는 교육만해도 교사가 페미네 어쩌네 하면서 불링이 들어가는 실정이니 이부분을 좀 강하게 잡아줘야 그나마 유의미한 교육이 진행될거 같음.

솔직히... 향후 20년간 그게 될거란 기대가 안된다... 정치권 이야기도 해야하고 해서 더 말하면 입이 써..

복설 뉴스's avatar
복설 뉴스

@[email protected]

"좌파는 사람까지 죽인다"던 역사기관 이사장, 尹 계엄 불법·위헌성 묻자 "답 않겠다" www.hankookilbo.com/News/Read/A2... "김 이사장은 리박스쿨 사태의 핵심 인물로 꼽힌다. 2020~2021년 리박스쿨 교육 프로그램의 강연자로 나섰고, 리박스쿨이 주도한 '청소년 근현대사 교과서 편찬추진위원회'에도 참여했다. 리박스쿨의 '정치학교장'을 맡았다는 의혹도 제기됐다."

[단독] "좌파는 사람까지 죽인다"던 역사기관 이사장,...

김성일 Sung-il Kim's avatar
김성일 Sung-il Kim

@[email protected]

중요한 얘기다. 19세기까지는 이슬람 세계조차 성소수자에게 유럽보다 훨씬 관대했다. "원래부터 항상" 그런 건 정말 드물다.

RE: https://bsky.app/profile/did:plc:hneloew3za25iqabarp6m2ay/post/3lssxlpxxis2a

복설 뉴스's avatar
복설 뉴스

@[email protected]

차별금지법은 ‘종교의 자유’ 침해하지 않습니다 www.ildaro.com/10215 "비엘펠트 교수는 “종교의 자유, 신념의 자유가 인권이라면서 특정 집단의 인권을 유린하기 위해 (그러한 개념을) 사용해선 안 된다”고 재차 강조했다. 그런 일이 생기면 “인권이 파편화될 수밖에 없고, 결국 이는 인권을 보호하는 일 자체에 크나큰 위협이 될 수밖에 없다”고 경고했다."

≪일다≫ 차별금지법은 ‘종교의 자유’ 침해하지 않습니다

Jaeyeol Lee's avatar
Jaeyeol Lee

@[email protected]

마틴파울러 블로그에서도 Agentic Coding에 대한 글이 꾸준히 연재되고 있는듯. 정제도 되어있고 한번에 모여있어서 좋다. https://martinfowler.com/articles/exploring-gen-ai.html

염산하

@[email protected] · Reply to Pavian's post

@always.lynnpapa_pavy 퍼플렉시티 정도는 포함시켜보면 더 좋을 것 같은데 말이에요. 저는 거의 퍼플렉시티만 쓴지 오래 되어서요.

Jaeyeol Lee's avatar
Jaeyeol Lee

@[email protected]

카네기멜런 조교수가 권장하는 "모든 개발자들이 해보면 좋은 프로젝트"

https://austinhenley.com/blog/challengingprojects.html?&aid=rec3mWbHrTxWMN36P&_bhlid=818f4f9928e77979b19e926866a9fe3e537f5ee2

텍스트 에디터

  • 구현에 사용되는 자료구조 (gap buffer, piece table 등)
  • undo, redo 를 사용하는 메멘토 패턴

2d game

  • 상태머신 관리
  • 컴퓨터 주변기기를 제어하는 방법

컴파일러

  • lexical parsing
  • syntatic parsing
  • code generation

작은 운영체제

  • 스케쥴링
  • 부트로딩
  • 메모리관리 및 페이징
  • 파일시스템

스프레드시트

  • directed graph (주로 topological sort)
  • reactive programming paradigm

비디오게임 콘솔 에뮬레이터

  • 컴파일러, 운영체제, 게임엔진 등등의 챌린지를 한번에 짬뽕

그 외에도 데이터베이스 직접 만들기, 그림판 직접 만들기, 터미널 유틸리티 직접 만들기

염산하

@[email protected]

https://www.sisain.co.kr/news/articleView.html?idxno=55977

시사인 대선직후 설문 조사를 통한 분석. 이준석과 김문수 지지의 차이, 2030에 대한 분석.

김창환 미국 캔자스 대학 교수(사회학)는 이번 <시사IN>·한국리서치 설문문항으로 '극우'를 새로 정의했다. ①자유민주주의 위기 해결·상대 진영 법안 저지·페미니즘 저지·불평등 완화를 위해 폭력이나 무력을 사용할 수 있다는 데 하나라도 동의했거나, '강력한 정치 지도자는 업무를 완수하기 위해 때때로 규칙을 어겨야 할 때도 있다'는 데 동의하고, ②정부보다는 개인이 자신의 생계(복지)에 더 많은 책임을 져야 한다고 응답하며, ③ 이민자 유입이나 난민 수용 확대 중 하나라도 반대하고, ④ 대북 제재를 중심으로 한 압박 정책을 우선하며, ⑤중국의 보복으로 한국이 경제적 타격을 입더라도 한미 동맹을 강화해야 한다고 응답한 사람이다. 이 다섯 가지 항목에 모두 해당하면 '극우'라고 정의해 비율을 추출한 결과, 전체 평균으로 보면 6.3%가 극우인 데 비해, 20대 남성의 15.7%, 30대 남성의 16%가 극우로 추정되었다.

청년층 가운데 극우로 추정되는 집단의 월평균가구소득, 교육 수준, 주관적 계층 인식을 살펴보고 흥미로운 결과를 발견했다. '극우'청년층이 '비극우' 청년층에 비해 사회경제적 계층(인식)이 상대적으로 더 높게 나타난 것이다. 청년층에서 월평균 가구소득이 500만원 이상이면서 스스로를 중간층 이상으로 인식하는 비율이 비극우 추정 집단에서는 25.1%였으나 극우추정 집단 내에서는 57%였다. 이 같은 결과를 두고 김창환 교수는 "현재 한국의 청년층 극우화는 불평등이 심해져서 그에 대한 불만으로 하위 계층이 극우화된게 아니라, 청년층 내에서 상대적으로 기득권층에 해당하는 남성들이 자신의 기득권을 빼앗긴 것에 저항하는 극우화일 가능성이 있다"라고 주장했다(14~16쪽 인터뷰 기사 참조).

염산하

@[email protected]

엇 오늘부터 지하철 운임 올랐네. 1400원이었는데 갑자기 1550원 찍혀서 깜짝

Lee Dogeon's avatar
Lee Dogeon

@[email protected]

원글은 https://moreal.hashnode.dev/vitepress-localsearch-debugging 에 있습니다. 내용은 같지만 이미지 호스팅용으로 Hashnode를 사용한 꼴이 되었으므로 예의상(?) 남깁니다 🙏


어제는 Zenn이라는 일본 기술 블로그 서비스의 트렌드 글을 알려주는 봇을 계획하고 구현하려고 보고 있었습니다. ActivityPub 프로토콜을 대상으로 하는 봇이었기 때문에 BotKit을 살펴보았고 BotKit에서 제공하는 메소드가 무엇을 하는지 알기 위해 Fedify문서까지 찾아보게 되었습니다. 그러다 Fedify 문서에서 검색하는 데 검색 기능이 깨진 것이 보여서 이슈로 남겼고, VitePress에도 이슈로 남겨달라는 부탁(?)을 받아 이슈의 내용을 적기 위해 조사를 하다가 PR을 올리기 까지, 야크 쉐이빙을 했다는 것이 이 글의 내용입니다 🤣

버그 재현하기 (원인 변수 확인하기)

VitePress 저장소에 이슈를 적을 때 본문에 어떻게 재현하는지와 재현되는 상황 특정, 왜 발생하는지 적어야 하므로 여러가지 시도를 하면서 해당 문제가 발생하는 시도를 해봤습니다.

처음에는 Fedify 이슈에 올렸던 것처럼 코드 블록이 있는 지점부터 검색 결과에 나오지 않았으므로 코드 블록이 포함되어 있으면 검색 결과에 포함되지 않는 것 같다는 추정을 하였습니다.

Fedify 문서는 사용하는 플러그인이 많아 피드백을 얻는데 시간이 걸렸습니다. 임시 디렉터리(/tmp)에 프로젝트를 초기화 하고 Fedify에서 사용하는 [email protected] 패키지를 설치하였습니다. 그리고 yarn vitepress init 명령어를 실행하여 기본 템플릿으로 문서들을 생성하고 .vitepress/config.mts 에서 search.provider 값을 "local"로 설정하였습니다. 그리고 Fedify 문서에 있는 헤딩을 가져와 추가했지만 검색이 잘 되었습니다.

추가적으로 환경을 가져와 보기로 했습니다. 마크다운 관련 설정을 가져가면서 @shikijs/vitepress-twoslash 부터 적용해봤는데 버그가 발생하지 않았습니다. 이어 마크다운 문법 관련 플러그인들도 추가했습니다. 그랬더니 버그가 재현되었습니다. 그 다음에는 마크다운 플러그인을 하나하나 빼면서 어떤 플러그인이 영향을 주는지 확인했고 markdown-it-jsr-ref 플러그인을 사용할 때 버그가 재현됨을 확인했습니다.

markdown-it-jsr-ref 플러그인은 `Type` 같이 특정 타입이나 함수를 지칭하는 마크다운을 작성했을 때 JSR에 있는 문서로 연결해주는 플러그인 입니다. HTML 출력이 어떻게 변하는 지 생각해보면 <code> 태그로만 감싸져 있던 부분을 <a> 로 추가로 감싸게 되는 것인데 이에 맞춰 ## With <a>a tag</a> heading## With <code>code tag</code> heading 간단한 두 테스트 케이스를 만들었고 전자만 “With “ 까지만 검색 결과에 나오는 것을 확인했습니다.

버그가 재현되는 테스트 케이스를 정의하고 나니 VitePress의 버그임이 명확하다고 느껴졌습니다. CommonMark 스펙에 헤딩에 <a> 태그가 들어가면 안 된다 같은 부분은 찾지 못 했기 때문입니다.

버그 수정하기

VitePress의 코드 베이스를 이해하고 있는 상황이 아니므로 어떤 코드가 영향을 주는지부터 찾아야 했습니다. search.provider 설정의 값으로 ”local” 을 사용하고 있으므로 local이라는 키워드로 검색해봤습니다. 그랬을 때 localSearchPlugin.ts 이라는 파일이 눈에 들어왔습니다. 내용을 봤을 때 MiniSearch 라는 검색 라이브러리를 활용하고 있는 것을 보니 찾던 것이 맞아 보였습니다.

우선 clearHtmlTags 함수가 검색 결과로 보여줄 텍스트를 위해 HTML 태그들을 모두 지워주는 것 같아 여기에 breakpoint를 걸고 디버거를 타고 가면서 상위 splitPageIntoSections 함수를 이해했습니다.

headingContentRegex 라는 정규식을 활용하는 라인에서 두 테스트케이스의 처리 결과가 달랐습니다. headingContentRegex 정규식을 이해해보면 헤딩을 입력으로 받고 두 부분을 캡쳐하려고 하는데, 첫번째는 <a> 태그 앞의 내용이고 변수 명으로는 title, 검색 결과로 보이는 부분입니다. 두 번째는 <a> 태그의 속성 중 href 의 내용을 캡쳐하는데 그 값이 # 으로 시작해야 했습니다.

const headingContentRegex = /(.*?)<a.*? href="#(.*?)".*?>.*?<\/a>/i

# 으로 시작하는 것을 가져오는 것은 앵커를 추출하려는 것이고 VitePress는 헤딩의 끝에 임의로 앵커를 넣어주고 있었습니다. Fedify 문서 중 헤딩의 HTML 값을 인용하면 아래와 같습니다.

Implement the <a href="https://jsr.io/@fedify/[email protected]/doc/federation/~/KvStore"><code>KvStore</code></a> interface <a class="header-anchor" href="#implement-the-kvstore-interface" aria-label="Permalink to &quot;Implement the `KvStore` interface&quot;"></a>

위 정규식에 테스트 케이스를 대입하면 아래와 같이 결과를 반환합니다. 반환된 배열의 두 번째 값을 보면 With 까지만 반환 되었고 세 번째 값을 보면 앵커는 제대로 가져온 것을 확인할 수 있었습니다.

>>> /(.*?)<a.*? href="#(.*?)".*?>.*?<\/a>/i.exec('With <a href="https://example.com">a tag</a> heading <a href="#anchor"></a>')
Array(3) [ 'With <a href="https://example.com/">a tag</a> heading <a href="#anchor"></a>', "With ", "anchor" ]

상황을 정리하면 헤딩의 끝에 붙는 <a> 태그의 href 값과 그 <a> 태그의 앞부분을 가져오는 것이 본래 의도이나 제대로 동작하지 않는 것으로 이해할 수 있었습니다.

문제는 첫 번째 캡쳐 그룹인 (.*?)? 기호가 문제였습니다. MDN의 정규표현식 문서에 따르면 ? 기호는 *, +, ? 와 같은 기호 뒤에 사용되었을 때 해당 기호를 non-greedy 하게 만든다고 합니다.

If used immediately after any of the quantifiers *, +, ?, or {}, makes the quantifier non-greedy (matching the minimum number of times), as opposed to the default, which is greedy (matching the maximum number of times).

정규 표현식을 완전히 이해하고 있지 않았던지라 확실한 판단은 아니지만, 위 인용문과 함께 이해했을 때 non-greedy 하기 때문에 첫 번째 캡쳐 그룹이 가져갈 수 있는 최대치인 ”With <a href=”https://example.com”>a tag</a> heading “ 을 가져가지 않고 최소치인 ”With “ 만을 가져가서 이 문제가 발생했다고 이해했습니다. 나머지 부분은 뒷부분은 <a.*? 부분이 가져가게 됩니다. 소괄호로 감싸 캡쳐 그룹으로 만들어주어 테스트 해보면 아래처럼 나오니 맞는 것 같습니다.

>>> /(.*?)<a(.*?) href="#(.*?)".*?>.*?<\/a>/i.exec('With <a href="https://example.com">a tag</a> heading <a href="#anchor"></a>')
Array(4) [ 'With <a href="https://example.com">a tag</a> heading <a href="#anchor"></a>', "With ", ' href="https://example.com">a tag</a> heading <a', "anchor" ]

그래서 첫번째 캡쳐 그룹을 다시 greedy하게 만들어 줄 필요가 있었고 단순히 ? 기호를 하나를 지웠고 테스트 해보니 잘 동작하는 것으로 보였습니다. 와, 버그 수정 완료!

>>> /(.*)<a.*? href="#(.*?)".*?>.*?<\/a>/i.exec('With <a href="https://example.com">a tag</a> heading <a href="#anchor"></a>')
Array(3) [ 'With <a href="https://example.com">a tag</a> heading <a href="#anchor"></a>', 'With <a href="https://example.com">a tag</a> heading ', "anchor" ]

PR 만들기

PR을 올릴 시간입니다. PR을 열 때 메인테이너에게 무슨 버그인지 충분히 설명할 필요가 있습니다. 이를 위해 별도의 두 저장소를 만들어 GitHub Pages에 배포하는 방식으로 문서를 두 개 만들었습니다. 하나는 기존 1.6.3 버전에서 버그를 확인할 수 있도록 하였고, 나머지 하나는 ? 기호를 없애는 변경을 더해 이 PR의 변경사항으로 버그를 고칠 수 있음을 확인할 수 있도록 하였습니다.

스크린샷을 첨부하였으나 전체를 찍기 애매해서 전문은 이슈에서 확인 부탁드립니다 🙏

한 1시간 정도 준비해서 올렸는데 머지는 순식간에 되어서 빠른 확인에 감사하면서도 그냥 뭔가 머쓱했습니다 😅

회고

잘 된 점

  • 야크 쉐이빙이긴 하지만 즐거웠습니다.
  • 근래에 나온 Zed Debugger를 사용하여 디버깅 했는데 좋은 경험이었습니다.

잘 안 된 점 (아쉬운 점)

  • 이와 관련된 버그를 해결 중인 이슈나 PR이 이미 존재하는 지 알기 어려웠습니다.
  • PR 설명을 준비하는데 꽤나 많은 시간을 소모했습니다.
    • 재현 환경을 구성하는데 꽤나 많은 시간을 소모했습니다.
  • 이 회고글을 작성하는데도 2시간 정도가 걸렸습니다.
  • 정규표현식을 온전히 이해하지 못 하여 <a> 태그에서 정확히 파악하지 정확한 판단하지 못 했습니다.

개선할 점

  • 글로 적어보니 꽤나 절차적인데 Agent로 이 과정을 자동화 할 수 있을까?
  • 재현 환경의 구성과 배포, 수정된 환경의 배포를 쉽게 할 수 있을까?
  • 이미 누가 작업하고 있는 작업인지 여부를 쉽게 확인할 수 있을까?
  • 정규표현식을 온전히 이해하면 좋을 것 같습니다.
한겨레's avatar
한겨레

@[email protected]

윤석열 전 대통령 대선 출마 당시부터 3년 넘게 이어진 김건희 여사의 석·박사 학위 논란이 일단락됐습니다. 문제 제기에 나섰던 학교 구성원들은 ‘뒤늦은 결정’에 대한 사과가 필요하다는 입장을 전했습니다.

김건희 석사 논문 취소-박사 입학 취소…3년여 만에 학...

염산하

@[email protected]

천개의 파랑. 너무 오랜만에 소설을 읽은 느낌이다. 너무 좋았다.

염산하

@[email protected] · Reply to 염산하's post

@ysh 아주 예전 글이라 “컴퓨터의 등장으로 앞으로는 사람이...” 라는 이야기가 종종 나온다. 근데 그게 의외로 요즘의 AI와 묘하게 연결되어서 요즘은 맥락으로 생각하게 되는 측면이 재미있게 느껴졌다.

염산하

@[email protected]

생각의 도약 https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=356276093

Older →