취미/Technology | 2022. 1. 11. 11:58 | /40

#스타트업 #힙스터 #팀워크 #생산성

스타트업'스러움'이 하나의 문화컨텐츠로 떠오르면서 온갖 제품과 서비스들이 이러한 분위기에 맞추어지고 있다. 마치 Helvetica 폰트가 디자이너들에게 사랑받기 시작하면서 세계를 장악하는 현상을 보는 것만 같다. 실제 생산성을 높이기 위함이든, 본인의 '힙함'을 보여주기 위함이든 여러 제품을 구입하고, 서비스를 구독하기 시작하면 월 구독료로 나가는 돈은 적지 않을 것이다. 또한 개중에는 이러한 문화적 흐름에 편승해서 그럴듯하게 포장한 예쁜 쓰레기를 제공해주는 곳도 많아서 사용자로 하여금 더 많은 판단을 요구한다. 자칫 생각없이 모든 것을 수용하다가는 생산성 앱으로 도배된 생산적이지 않은 본인의 기기를 보게 될 것이다.

 

변화에 슬슬 더디게 반응하기 시작하는듯한 기분을 떨쳐내기 위해 오래전부터 이야기를 듣고 추천을 받아온 Notion을 쓰기 시작했다. 당장에 연구실 지식베이스와 소통을 위한 목적으로 어렵게 도입했던 Slack부터 스타트업에 잠시 참여했을 때 접했던 트렐로, 2011년 1월부터 사용중인 에버노트와 iOS 한글 지원문제로 갈아탔던 OneNote까지 온갖 유사 프로그램들 접했는데 각자 지향하는 바가 분명하게 다른 것 같다. 다른 앱과 함께 하루 Notion을 써본 소감을 간략히 적는다.

 

* 트렐로 : 협업용 TODO 리스트

* Keep : 동기화 되는 포스트잇 게시판

* Evernote : 동기화 되는 간단한 메모장

* OneNote : 화이트보드

* Slack : 조금은 DB의 형태를 갖춘 카카오톡

* Todoist / TickTick : 혼자쓰는 TODO 리스트

Notion : 잘 정리된 Blog 글 같은 Evernote

현재 각자 사용목적성이 뚜렷하고 열심히 쓰고 있는 두 앱이 OneNote와 Evernote여서 그런지 자꾸 이 둘과 비교를 하게 된다. Evernote의 경우 기사를 대충 스크랩해서 처박아두거나, 짧은 메모, 일기 등의 줄글 위주의 게시물, 혼자 보는 용도의 설명서를 담아둔다. '동기화가 되는 간단한 메모장'이 가장 확실한 설명인 것 같다. 노트를 예쁘고 깔끔하게 만들기 위해서는 추가적으로 서식을 변경하거나 하는 등의 노력이 많이 들어간다. 그런데 그럴 일은 없다. 대충 넣어두고 나중에 필요하면 찾으면 되고, 잘 정리된 문서가 필요하면 워드로 작성하면 된다. 첫 번째 책상서랍 같은 존재다. 때문인지 유료플랜을 결제할 때는 매번 망설인다. 해주는 기능도 얼마 없으면서 이 가격을 받아야 하나 싶다.

 

OneNote의 경우는 아이디어 상자이다. 화면 아무 곳이나 클릭하면 바로 글이 써지고 Indent 조절이 쉽게 되고 이리저리 컨텐츠 박스를 끌고 다닐 수 있다는 점이 매력이다. 화이트보드 같은 매력이 있다. 하지만 이러한 점은 화면이 작은 모바일 기기로 볼 때 확실히 단점으로 작용한다. 화면안을 이리저리 돌아다니면서 글을 읽는 것은 정말 불편하다. 그래도 Evernote에 비해서는 깔끔한 문서정리가 가능하기 때문에 자주 꺼내보아야 하는 자료의 경우는 OneNote에 정리해서 넣어둔다.

 

짧은 메모, 텍스트 위주의 정보, '대충 넣어두어도 나중에 필요하면 뒤지겠지...' 하는 수준의 정보는 Evernote.
빠른 아이디어 작성, 위계관계가 확실한 정보, 조금은 정리해서 넣어두어야 하는 정보는 OneNote.

 

 

Notion은 OneNote와 Evernote 어딘가에 어중간하게 있다. 많은 사람들이 마크업 기능을 장점 중 하나로 꼽는데 확실히 여타 다른 앱들에 비해서 월등히 편리하다. 그 외에 sorting이 지원되는 깔끔한 표 삽입 기능과 댓글기능, 페이지 간 링크 등은 앞서 언급한 많은 앱들의 필수 기능들을 하나로 통합해서 왜 이런 앱이 이제야 나왔는지 싶다. 하지만 '이렇게 참신하고 대단한게 나오다니!' 보다는 '이런게 왜 이제야?'에 가깝다. 다양한 템플릿을 지원한다는 점에서는 OneNote와 가깝고 심플하다는 것에 Evernote와 비슷한 느낌을 준다. 하지만 전반적인 감상은 OneNote보다는 Evernote에 가깝다고 할까. OneNote의 '화이트보드'스러움이 있었다면 Evernote와 OneNote를 통합해서 사용할 수 있었겠으나 아이디어를 이리저리 끌고다니는 기능은 없는듯 하다. 하긴 앞서 언급한 모바일환경에서의 불편함을 생각하면 좋지 않은 방법일 수도 있겠다. Notion에서는 확실히 '협업용'의 분위기가 물씬 풍긴다. 내 난잡한 Evernote 글을 동료에게 준다면 한소리 들을 것이 분명하고, 마크업이 제대로 되지 않고 외부자료를 넣기 힘든 OneNote는 장기적인 데이터 유지 관점에서는 분명 좋지 않은 선택이다. Notion은 원활한 정보전달에 필요한 만큼의 미적 요소를 가미해서 글 작성이 가능하다. 왜 이렇게 붐을 일으켰는지 알법하다.

 

하지만 Notion이 얼마나 내가 쓰는 기존 프로그램들을 대체할 수 있을지는 의문이 든다. '협업'의 필요성이 크지 않기에 기존 두 프로그램들로도 충분한 목적을 달성했다. 또한 마크업 기능도 미를 위해 할애하는 시간을 해치지 않을 만큼 쉽게 되어있기는 하지만 미가 필요할 수준의 내용이면 아에 문서로 작성을 하고, 그런 것이 아니라면 짤막한 메모로도 충분하다. 그나마 이번에 진행하는 프로젝트의 일원이 Notion을 쓰는 것 같던데 이 프로젝트를 위해서 사용하는 것이라면 Notion을 충분히 쓰겠으나 OneNote나 Evernote를 내려놓기에는 조금 힘들 것 같다. 다만 메모장 프로그램에 매달 돈을 지불해야하는 점이 괘씸하기에 Evernote는 Notion로 대체를 시도하려고 한다.

Posted by Knowblesse

3rd-generation Antihistamine

항히스타민제만큼 구하기 쉬우면서 부작용을 신경써야하는 약은 없을 것이다. 비염이나 알레르기 증상을 완화하려고 먹었다가 쏟아지는 졸음을 겪거나 나른해진 경험은 누구나 한번쯤 해봤을 것 같다. 아스피린의 최대의 부작용인 속쓰림을 개선해서 다양한 진통제가 나왔듯이 항히스타민제도 '세대'라는 말이 붙을 만큼 다양한 약들이 나오고 있다. 그렇게까지 알레르기 반응이 심하게 나와 본적이 없고, 가능하면 알러젠을 차단하거나 보호장구를 사용해서 대처를 하기에 항히스타민제에 관심이 없었으나 우연한 사건으로 관련 정보를 찾아보게 되었다.

 

나는 몸 상태에 따라 적절한 약을 먹을 수 있도록 단일제제의 약을 구비해두는 것을 좋아하는데, 3세대 항히스타민제 중 일반의약품으로 분류되어 판매가 되는 약은 펙소페나딘염산염인 '알레그라'가 거의 유일했다. 일부 커뮤니티에서는 카피약도 나와있다고 하고 실제 한미약품에서 펙소나딘정으로 제네릭 약품이 나와있기는 하다만 구하기 쉽지 않아 보였다.

 

왜 120mg만 일반일까? 약학계도 상품의 유통구조와 제약회사의 이익관계, 안정성 등이 복잡하게 엮긴 것 같다.

 

이전에 우루사를 구입하려고 했는데 200mg는 전문, 100mg는 일반 이라는 설명을 듣고 의야해 했는데 알레그라는 더욱 웃겼다. 30mg과 180mg는 전문, 120mg은 일반이라고 한다. 병원을 방문할 시간이 없었기에 일단 근처 약국 6개를 돌며 120mg 알레그라를 사기 위해 돌아다녔는데 전부 전문의약품 형태만 있다며 구입을 하지 못했다.

 

비염에 고통받는 사람들이 많은지 관련 커뮤니티에서도 약을 구하기 힘들다는 반응을 털어놓았는데, 한독약품에 문의를 한 결과 120mg은 일반의약품이 맞지만 판매형태가 조제용이라 처방을 받고 사야한다는 답변을 받았다. 조제용 포장을 소분해서 판매하는 행위는 불법이라는 점(처방 제외)은 아는데 조제용 포장을 그대로 파는 것도 불법인지는 모르겠다. 몇몇 사람들이 120mg 일반의약품을 30정이 든 조제용 포장으로 샀다는 글을 올렸는데 조제용 포장으로 판매하는지 여부는 약사 재량인가보다. 아니면 얼렁뚱땅 판매를 하셨거나.

 

한독약품 홈페이지에 관련 문의글은 많았으나 전부 비밀글로 올라와 있었는데 본인처럼 약을 구하시는 분들이 헛걸음하지 않도록 아래 답변 내용을 적어둔다.

 

한독 의약품은 (주)쥴릭 도매상을 통해 전국 유통되고 있으므로
쥴릭으로(전화: 080-2006-080) 연락하시어 거주지역에서 구입 가능한 약국을 문의해 주시기 바랍니다.

참고로, 현재 일반의약품으로 분류되는 알레그라정120mg은 처방조제용 포장(30정,100정)으로만
유통중인 관계로 일반 판매가 어려운 상황입니다.
번거로우시겠지만, 가까운 병원을 통해 처방 후 조제 받으시길 안내 드립니다.

22년 01월 10일 기준 답변

 

 

 

 

 

[1] Olasińska-Wiśniewska, Anna & Olasiński, Jerzy & Md, Phd. (2014). Cardiovascular safety of antihistamines. Postepy Dermatologii I Alergologii. 31. 182. 10.5114/pdia.2014.43191. 

Posted by Knowblesse
Mind Storage/Short Thoughts | 2021. 12. 12. 15:22 | /38

비로소 바닥이 보일 때야 관리 계획을 마련하게 된다.

 

지난 생각도 그렇고 오늘 생각도 시간 관리에 대한 이야기이다.

 

시간 관리와 관련된 가장 잘 알려진 방법 중 하나로 스티븐 코비의 시간관리 매트릭스를 꼽을 수 있을 것이다. 모든 일들을 중요함과 긴급함이라는 두 축을 가진 평면에 늘어놓고 급박하고 중요한 일, 급하지 않지만 중요한일, 급박하지만 중요하지 않은일, 그리고 급박하지도 중요하지도 않은 일 순으로 처리하라는 이야기이다. 고등학생 때인가 아버지의 권유로 프랭클린 플래너를 쓰면서 이 매트릭스를 사용해본 적이 있었는데 지금와서 봐도 전형적인 그것이다.

 

경영학의 Bullshit.

 

애시당초 중요하지 않은 일은 하지 않으면 된다. 해야할 일이었다면 중요한 일이었겠지. 그리고 급박함과 중요함은 양의 상관관계가 매우 커서 급박한데 중요하지 않은 일은 없다. 스티븐 코비의 매트릭스를 보아도 '급박하지만 중요한 일'로 SNS 메시지 따위를 예로 들고 있다. 이런 것은 안하면 되는 것이다. 또한 일의 중요함은 그렇게 쉽고 빠르게 평가되지 않는 것 같다. 아이디어 회의는 중요도가 떨어질 수 있겠지만 이 회의에서 미래 프로젝트 방향에 중요한 영향을 끼치는 아이디어가 나올 수도 있는 일이고, 무언가를 결정하는 회의는 내가 없어도 옳은 방향으로 결정되어 잘 돌아갈 수도 있다.

 

'공부법' 키워드로 검색을 하면 수 십만건의 책과 글들이 쏟아져 나오지만 정작 공부를 오래 해본 사람은 자기에게 딱 맞는 방법을 이미 형성시킨다고 믿는다. 시간 관리 또한 시행착오를 통해 내게 맞는 방법을 찾을 수 있으리라 생각한다. 하나의 시행착오 중 하나로 아래의 분류법을 만들어 보았다.

 

P0 : 지금 당장 착수해야하는 일 || 안했을 시 이를 되돌리기 위해 두 배 이상의 자원을 투자해야하는 일

P1 : 3일 이내에 해결해야하는 일 || 언젠가는 해야만 하는 일

P2 : 일주일 이내에 해결해야하는 일

P3 : 한달 이내에 해결해야하는 일

PX : 안해도 상관 없는 일

 

 

'Mind Storage > Short Thoughts' 카테고리의 다른 글

[키워드 에세이] 즐거움  (0) 2021.11.25
일요일을 혼자 보내는 방법.  (0) 2021.10.10
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse

  가깝게 지내는 작가 선생님께서 매일 하나의 키워드를 받아 짧은 에세이를 쓰는 작업을 하시고 있다는 이야기를 듣고 뱁새가 황새 따라가듯 같이 참여해보기로 하였다. 1년동안 쓴 글보다 쓴 코드가 더 긴 과학하는 사람에게 과연 얼마만큼의 글재주가 있겠냐 싶겠지만 자꾸 황새를 따라다녀야 몸은 뱁새더라도 정신만큼은 황새가 되지 않을까. 그리고 솔직히 뱁새가 외관은 더 귀엽다.

  삶에 영향력을 주고 있다고 생각하는 말과 실제로 영향력을 끼친 말 사이에는 큰 차이가 있을 것 같지만 확실히 이 둘 모두에 해당된다고 생각하는 문구가 있다. "아름다운 것을 봐야 아름다운 일을 해내고, 위대한 것을 느껴야 위대한 일을 해낸다." 때로는 분수에 맞지 않은 와인을 사거나, 과한 가격의 취미생활을 정당화 하는 변명으로 오용하지만 아름답다고 느끼는 것들의 범주가 넓고 다양해지는 것을 체감할 때면 이론(論)은 생각나지 않는다.

 

  즐거움은 내 삶의 가장 중심이 되는 키워드이다. 때문에 오랫동안 나에게 있어서 즐거움의 의미를 생각해왔었다. 마약이라는 아주 간단하고 확실한 즐거움이 있음에도 시작하지 않는 이유가 과연 두려움 때문인지, 위대함을 느끼기 위해 소비하는 것과 즐거움이 어떻게 연결되는지, 무언가를 만드는 일들이 내게 큰 즐거움을 주는 이유가 무엇인지 등 다양한 주제로 생각을 해서 내린 결론은 결국 확장성이었다.

 

  사람 수 만큼 다양하게 즐거움을 느끼는 방법들이 있으나, 일부는 일회성의 즐거움으로 끝이나고, 일부는 반드시 즐겁지 않음이 뒤따라오며, 거의 대부분의 경우는 반복할 경우 그 즐거움이 사라진다. Reward expectation과 Dopamine과의 상관관계를 보여준 Schultz의 연구를 보면(Schultz, 1997) 처음에는 과일 주스에 반응하던 원숭이의 VTA 뉴런이 과일 주스가 곧 나옴을 알려주는 소리에만 반응하기 시작하는 것을 볼 수 있다. 물론 VTA 뉴런과 즐거움이 완벽히 대응되지는 않겠지만, 이전에 좋아했던 일들에 대한 선호가 사라지는 만큼 그 즐거움과 연결된 다른 일들로 즐거움이 확장되지 않을까? 어쩌면 과일 주스만 좋아하던 원숭이가 소리에 대한 선호를 확립하고 나서부터는 '좋은' 소리와 '나쁜' 소리에 대한 뚜렷한 취향이 발현될지도 모르는 일이다. 나도 이처럼 즐거움이 또 다른 즐거움을 불러일으킬 때 비로소 진정한 즐거움을 느낀다고 생각한다.

 

  다소 대하기 어렵더라도 독특한 경험을 주는 이상한 사람을 만나는 것을 좋아하는 이유도, 홍차를 마시면서 다양한 맛과 향의 세계로 여행을 하는 이유도 결국 지금의 즐거움이 또 다른 새로운 즐거움으로 이어질 것이라는 확장성에 대한 기대 때문인것 같다. 더 자극적인 즐거움, 더 컬러풀한 즐거움에 대한 욕망은 항상 느끼고 있으나 이후에 다른 즐거움을 가져다 줄 것이라는 기대가 없으면 시도를 망설이게 된다. 이렇게 글을 쓰기 시작한 것도 당장은 강렬한 즐거움을 가져다 주지 않지만 글을 쓰면서 이후에 발견하지 못한 또 다른 즐거움을 주지 않을까 하는 기대 때문이지 않을까?

'Mind Storage > Short Thoughts' 카테고리의 다른 글

21DEC12  (0) 2021.12.12
일요일을 혼자 보내는 방법.  (0) 2021.10.10
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse
Mind Storage/Logs | 2021. 10. 28. 10:59 | /36

- 스케줄러 사용을 다시 시작해야겠다는 생각을 했다.

학부생 때는 스타벅스 다이어리를 애용했는데 언젠가부터 스타벅스 굿즈가 인기몰이를 시작한 후로 다이어리 구하기가 어려워지자 스케줄러 사용도 같이 그만둬 버렸다. 일정은 구글 캘린더를 사용해 관리를 하고 있지만, 실험 프로젝트를 짜거나 하루 생산성을 되돌아보는 용도로는 턱없이 부족하다. 일전에 프랭클린플래너를 사용해본 적이 있었지만 일정과 스케줄의 경계가 애매해지고 들고다니는 것이 불편해지자 효용이 사라졌다.

프랭클린플래너의 사용법도 회사원이 아닌 나에게는 전혀 맞지 않았고, 일정 관리 관련 자기개발서는 절대 읽고 싶지 않기에 나만의 계획법을 구상하다가 몇 가지 항목들을 생각해보았다.

 

더보기

* Daily

- 오늘 하려고 계획했던 일

- 실제로 오늘 한 일

- 실제로 오늘 했으면 좋았던 일 (우선순위 적으로)

- 계획대로 일을 하지 못한 원인

- 개선방안

 

* Monthly

- 다가오는 일

- 각각 준비에 걸리는 subgoal과 그 기간

 

* Yearly

 

- 취미의 다양성

TRPG에, 악기에, 소설에 너무 다양한 취미들을 누리려 하니 취미가 하나의 일처럼 뭉쳐진것 같다는 느낌을 받았다. 취미 계획(?)도 필요하지 않을까.

Posted by Knowblesse

일요일을 혼자 보내는 방법.

아침의 늑장은 대게 이유가 있는 법이다. 누군가는 원래 아침은 체질상 약하다고 이야기 할 수 있겠지만, 과연 그도 소풍 전날, 새벽 비행기 타기 전날 보통날처럼 늑장을 부릴까. 약속이 없으며, '쉬는' 일정조차 없는 일요일. 전날 11시에 누웠음에도 불구하고, 8시에 이미 깨어있었음에도 불구하고, 자동 조명 장치가 8시 45분에 맞춰 모든 불을 켰음에도 불구하고, 오후 2시가 되어서야 침대에서 기어 나올 수 있었다. 


창문을 너무 오래 닫고 있어서 산소 농도가 떨어졌나 하고 손목의 스마트 워치를 봤지만 디스플레이에는 높은 산소 포화도가 적혀있었고, 바디 배터리 값은 4시간 전부터 100%를 유지하고 있었다. 자취 초반에는 이러한 일이 익숙했다. 그 당시 연애를 하지 않아서도 있었겠다만 통학으로 버려진 시간만큼 하루가 길어져 주말에는 이렇다 할 일이 남아있지 않았다. 


세수를 하면서 냉장고 내용물을 기억해내며 아침을 결정, 감동란 두 알과 베이컨, 토마토 주스다. 이정도 메뉴면 평상시 아침에 비해 과하게 호화로운 편. 아 점심이니 딱히 그렇지도 않으려나. 전날에 설거지하다 남긴 식기를 정리하며 아침, 아니 점심을 같이 준비했다. 


'늑장의 이유는 역시 커피를 마시지 않았기 때문'이라는 핑계를 막기 위해 식사 후 커피부터 내렸다. 저 우악스러운 커피콩 가는 소리는 알람시계 대용으로 써도 되지 않을까 하는 생각을 하며 필터지와 드리퍼를 준비했다. 핸드드립 주전자는 팔을 끝까지 뻗어야 닫는 위치에 있으니 쓰지 말자. 팔을 반의 반만 뻗은 위치에 있던 전기포트의 물을 바로 담아 아침커피를 내렸다. 그래, 먹은 것은 점심이지만, 커피는 아침커피이다. 


어제부터 필터가 막혀 작동을 멈춘 수족관 여과기를 청소하고, 일주일치 옷들의 다림질을 마치고 화장실을 호텔처럼 바꿔두니 3시 50분을 넘어가고 있었다. 오늘을 위해 넣어둔 샴페인을 누구랑 마실까 생각을 하다가 불렀을 때 올 수 있는 사람이 없다는 생각에 미치자 책을 한권 가방에 우겨넣고 무작정 밖으로 나왔다.


일요일을 혼자 보내는 방법. 정말 어려운 주제이다. '일요일을 보내는 방법'과 '혼자 시간을 보내는 방법'의 두 가지가 겹쳐졌으니 말이다. 아이러니하게도 일요일이 아닌 날에는 일요일을 보내고 싶어하며, 약속과 연구 미팅이 잡힌 당일에는 막상 혼자있고 싶어하는데 이 두 가지가 합쳐지니 당혹스럽기 짝이 없다. 마치 민트초코마냥 둘이 섞이니 (사람에 따라 생각이 다르겠지만) 기어오는 혼돈이 탄생했다.


이럴 때에는 무언가 생산적인 일을 하러간다고 변명이 되는 서점이 최고다. 저녁 식사도 같이 외부에서 마칠 생각이었기 때문에 강남 교보문고를 선택했다. 역 근처 일본 스파게티 집에서 리조또를 먹고 서점으로 향했다. 요리에 나왔던 향신료를 찾아보고 싶어서 요리책 코너를 서성이다가 결국 미스테리/스릴러 서적 코너에 종착했다. 얼마 전 배송비를 아끼기 위해서 함께 구매했던 책이 매대 위에 올라와있는 것을 보고 스스로의 탁월한 선택에 실웃음을 짓고 산 책과 죽은 책의 비율을 잠시 생각한 뒤 빈손으로 카페를 찾았다. 


마음 같아선 최근 참여하게 된 TRPG모임 사람들과 게임도 하고 맥주도 같이 마시고 싶었는데 지금이 딱 시험기간이라 그런지 다들 여유롭지 않은가보다. 시험 전에 모임을 한번 잡아보려고 운을 띄웠으나 펌블이 나와버렸다. 다음에 시험 끝난 누군가가 방을 살릴 때까지 조용히 있어야겠다.


할일은 많지만 10월 10일 일요일을 다른 무언가를 하기 위한 날이 아니라 순전히 일요일 그 자체로 즐기고 싶었다. 결국 남은 것은 책 세 챕터를 읽은 것과 이 글 뿐이지만 IT 정보만 가득한 죽 같은 블로그에 감정 한 조각을 올렸다는 것으로 만족해야겠다.   

'Mind Storage > Short Thoughts' 카테고리의 다른 글

21DEC12  (0) 2021.12.12
[키워드 에세이] 즐거움  (0) 2021.11.25
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse

1. SimpleBlobDetector

parameter로 넣어준 조건에 따라 blob을 찾아줌.

알고리즘

  1. source image에 threshold를 적용.
    - parameter에 넣은 minThreshold 값(포함)과 maxThreshold 값(불포함) 사이를 thresholdStep으로 나누어 각각의 threshold를 사용해서 binary image로 바꾼다. 처음부터 binary를 넣어주려는 경우 기본 파라미터에서는 minThreshold=50, maxThreshold=220, thresholdStep=10 으로 설정이 되어있기에 이를 만져주어야 한다.
    binary image를 0과 255로 구성되도록 설정하고, minThreshold=253, maxThreshold=255, thresholdStep=1로 설정하면 최소한의 threshold 연산만 사용할 수 있다.
  2. 각각의 binary image에 대해서 findContours 함수를 적용해서 center를 계산.
  3. 각각의 binary image에서 찾은 contour들을 하나로 묶어줌.
    이때 minDistBetweenBlobs parameter를 사용한다.
  4. 찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정. 이를 keypoint로 return

예시코드

import cv2 as cv

parameter = cv.SimpleBlobDetector_Params()
parameter.filterByArea = True
parameter.filterByConvexity = True
parameter.filterByCircularity = True
parameter.filterByInertia = False
parameter.filterByColor = False
parameter.minArea = 500  # this value defines the minimum size of the blob
parameter.maxArea = 10000  # this value defines the maximum size of the blob
parameter.minDistBetweenBlobs = 1 # not used in binary image
parameter.minConvexity = 0.3
parameter.minCircularity = 0.3

detector = cv.SimpleBlobDetector_create(parameter)
detected_blob = detector.detect(denoised_mask)
print(len(detected_blob))

2. keypoint size

keypoint는 pt 값과 size 값을 가지고 있는데 (다른 값들도 있지만 이 연산에서는 무의미한 것으로 추정) pt는 blob center의 x, y 좌표를 의미하지만 도무지 size에 대한 이야기가 없다.

내가 원하는 정보는 찾아낸 blob의 크기 (이를 둘러쌀 수 있는 최소한의 원의 반지름 이라던가 실제 blob의 픽셀 수라던가...)인데 나오는 size 값은 blob의 모양에 따라서 제각각이다.

blob detection 을 한뒤 pt를 기준으로 size/2 만큼의 radius를 가지는 원을 그린 결과물

4번째 스텝인 "찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정." 에서 대체 무슨일이 일어나는 것이길래 이런 값이 출력되는지 모르겠다. 원 같은 경우는 그나마 비슷하긴 하지만 실제 위의 그림에서 볼 수 있듯이 지름 100px짜리 원의 blob 크기는 99.0151로 나온다. 여러 contour 들을 합치는 알고리즘을 들여다봐야 알겠지만 SimpleBlobDetector가 return하는 keypoint의 값만 사용해서 실제 blob의 크기를 알아낼 방법은 없는 것으로 보인다.

3. parameter의 minArea / maxArea

한 가지 주목할 점은 parameter로 사용하는 minArea / maxArea의 경우는 실제 blob으로 잡힌 object의 크기를 비교한다는 것이다. 한 변의 길이가 100px인 정사각형에 대한 keypoint의 size 값은 111.8034이지만 filterByArea 옵션을 켜고 minArea를 10000(100 * 100)으로 잡으면 정사각형을 찾지만, 10001을 사용하는 경우 정사각형을 찾지 못한다. circle의 경우는 사용한 radius를 사용해 수학적으로 계산한 넓이와 10 이하로 차이가 나는 것으로 보아 실제 pixel 수를 기준으로 filter 하는 것으로 보인다.

 

4. findContours 함수를 사용한 정확한 blob detection

때문에 내부에서 찾아낸 blob의 정확한 사이즈를 뽑아낼 수 있을 것이라고 기대했으나 실패했다.

사실 실제 4단계 step 중에서 사용하는 부분이 두 번째 step 뿐이기에 이쯤되면 그냥 findContous 함수를 써서 raw level에서 처리하는 것이 더 나을 것으로 보인다.

 

cnt = cv.findContours(binary_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]

# Some basic features of the contour object
(x,y), radius = cv.minEnclosingCircle(k)
rect = cv.minAreaRect(k) # ((center x, center y), (width, height), rotation)
size = cv.contourArea(k)

뽑아내야 하는 blob의 수를 알고 있다면 area, 둘러싸는 직사각형의 가로 세로 사이즈 등등의 값을 얻은 뒤 단계적으로 filter를 적용하는 방법도 사용할 수 있다.

 

 

Posted by Knowblesse

Google아 TF2.6이 나온지 언젠데 아직도 install 페이지에 TF2.4 설치방법이 있더라.

일 안하니?

 

 

망할 파이썬을 쓰다보면 인생의 교훈을 한가지 얻을 수 있다.

새로운 것 나왔다고 바로 쓰지말고 나온지 좀 된 것을 쓰자.

 

그런데 기왕 셋업하는 김에 좀 최신 것을 쓰려고 했다가 시간을 엄청 날렸다. TensorFlow 자체 documentation 은 금방금방 업데이트를 해주는데 설치방법은 왜 여전히 그대로인지... 내가 설치할 당시에는 2.5 기준으로 documentation이 나와있었는데 2.5는 CUDA 11.2 버전이 필요하고, 홈페이지에 나와있는 설치방법은 11.0을 기준으로 나와있어서 그대로 설치했다가는 'tf 2.5 에서는 cuda 11.2 버전이 필요합니다' 에러를 낸다.

 

문제는 이 cuda 11.2가 그당시 완성이 덜 되어있어서 몇몇 라이브러리가 없었는데 이 때문에 수동으로 라이브러리를 다운받아 이름을 변경하여 넣어야 돌아갔다. 세상에.

 

화난 개발자들이 올린 글들의 도움을 얻어 어찌저찌 설치를 했는데 왜 이 글을 쓰냐... apt-get autoclean과 apt-get autoremove 를 썼다가 수동으로 다운받아둔 라이브러리가 다 날아갔다. 이왕 다시 셋업 하는거 기록으로 남겨두자는 마음으로 글을 작성한다.

 

docker를 쓰는 쉬운 방법도 있다는 것 같지만 docker에 대한 필요성을 딱히 못 느끼기에 사용하지 않았다. 그래도 가상환경을 사용하지 않고 새로운 패키지를 까는 것을 죄악이니 꼭 conda는 사용하길 바란다.

 

0. tensorflow 2.6 설치

혹시 설치하지 않은 경우...

pip install tensorflow==2.6

1. NVIDIA GPU driver 설치

자기 그래픽 카드에 맞게 최신으로 설치.

https://www.nvidia.com/download/index.aspx?lang=en-us 

 

Download Drivers | NVIDIA

 

www.nvidia.com

 

2. CUDA Toolkit 11.4 Update 1 (11.4.1) 설치

https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

콘솔에서 커맨드 실행전에 sudo 명령어를 사용하는 다른 명령을 사용해두는 것이 좋다.

안그러면 첫줄만 돌아가고 root password를 묻는 통에 둘째 라인부터 실행이 되지 않는다.

 

Ubuntu 18.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

Ubuntu 20.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

3-1. cuDNN v8.2.2 for CUDA 11.4 다운

아래 사이트에서 cuDNN Library for Linux (x86_64)를 다운받으면 된다.

 

원래 Debian Package (dpkg)를 사용해서 설치하는 것이 제일 간단한데 이게 왜인지 실행이 제대로 되지 않는다.

 

혹시 시도를 해보려면 아래 링크에서 cuDNN Runtime Library for Ubuntu18.04 x86_64 (Deb)를 받으면 된다.

 

Ubuntu 20.04인 경우 해당 버전에 맞는 것을 받자. Developer 버전을 받지 않아도 된다.

 

아래 설치는 dpkg가 아닌 library를 통째로 받은 것을 전제로 진행할 것이다.

 

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

3-2. cuDNN v8.2.2 for CUDA 11.4 설치

https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

 

Installation Guide :: NVIDIA Deep Learning cuDNN Documentation

The NVIDIA® CUDA® Deep Neural Network library™ (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalizati

docs.nvidia.com

위 링크에서 자세한 설치 방법을 알 수 있으나, 아래에 간략히 요약하겠다.

 

받은 파일은  .tgz 확장자로 tar.gz 파일이다. 내장 파일탐색기 nautilus로도 압축을 풀 수 있고, 터미널에서 tar -xzvf 다운받은파일명 으로 풀 수 있다.

 

내장 파일탐색기로 푸는 것이 쉬우니 그 방법을 추천한다.

 

tar 명령어로 푸는 방법은 아래와 같다.

더보기
tar -xzvf cudnn-11.4-linux-x64-v8.2.2.26.tgz

참고로, xzvf는 extract, gzip, verbosely list files processed, file 의 약자다.

 

다음으로 라이브러리를 CUDA Toolkit이 찾을 수 있는 장소에 넣어주어야 한다.

 

일반적으로 이는 /usr/local/cuda 폴더이며, 앞서 CUDA Toolkit을 설치하면 자동으로 생성되었을 것이다.

 

일단 터미널을 열고 압축을 풀어서 나온 cuda 폴더가 보이는 위치까지 간 뒤 아래 명령을 실행한다. 두 번째 명령이 파일이 많아서 시간이 조금 걸린다.

 

sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64 
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

4. 설치 종합

tensorflow v2.6 : tensorflow

CUDA Toolkit v 11.4.1 : CUDA 그 자체이다.

cuDNN v8.2.2 : library로 tensorflow 사용시 dynamic library 문제가 발생했다고 하면 이 친구가 문제인 것.

 

꼭 CUDA Toolkit은 cuDNN보다 먼저 설치해야 한다.

5. 확인

python에서 아래 코드로 GPU 사용을 확인해보자.

 

import tensorflow as tf

if tf.config.list_physical_devices('GPU'):
    print('TF is using GPU')
else:
    print('TF is NOT using GPU')

 

실행시 Information, Warning, Error로 로그가 나오는데, E만 없어도 대체로 정상작동하더라.

 

꼭 GPU로 돌아가는지 확인을 해보고 실행을 하자!

 

 

 

감사는 댓글이나 커피로 표현해주시면 감사히 받겠습니다.

paypal.me/knowblesse

 

 

 

Posted by Knowblesse

어느 날부터 웹캠이 흑백으로 나온다면 아래의 방법을 시도해보자.

 

Microsoft 공식 홈페이지를 포함해서 대부분의 Solution들이 드라이버 업데이트/재설치, 윈도우 업데이트/재설치를 이야기 하는데 정말 간단한 문제일 수 있다.

 

1. 카메라 고급 옵션 접근

먼저 Skype를 실행한다. 언젠가부터 Microsoft가 Microsoft Teams랑 Skype를 쥐도 새도 모르게 깔아놓던데 아주 마음에 안든다. Skype가 깔려있지 않다면 찾아서 설치하자. 카메라 고급 옵션에 접근하는 다른 방법도 있을텐데 (video stream을 사용하는 다른 소프트웨어도 가능하지 않을까? OBS Studio 라던가) 이게 가장 간단하다.

 

추가 메뉴에서 설정.
오디오 및 비디오에서 웹캠 설정

 

2. 카메라 고급 옵션 기본값으로 초기화.

전부 기본값으로 변경

 

Skype 뿐만 아니라 Zoom, Kakao Talk 등 웹캠 스트리밍이 가능한 소프트웨어에서 사용자가 직접 옵션 변경을 했거나, 낮은 조도 때문에 임의로 채도 혹은 낮은 빛 보상 옵션이 변경이 되면 흑백으로 나타나는 현상이 발생한다.

 

문제는 대다수의 소프트웨어들이 이러한 옵션을 display 해주지 않으며, 심지어 기준이 되어 Microsoft 기본 카메라 앱에 이 옵션에 대한 접근이 불가능 하다. (이게 주 원인인것 같다. 마소 놈들....) 심지어 한번 설정한 옵션은 카메라 모듈 내부에 따로 저장이 되는지 OS 재설치를 진행해도 흑백으로 나오는 현상이 발생한다.

 

삼성 노트북 A/S 후기

기술 발전과 정체로 노트북 브랜드간 격차가 사라져서 큰 차이가 없으면 국산 브랜드를 애용하자는 마음으로 현 노트북으로 삼성을 골랐다. 16Gb RAM과 외장 그래픽이 같이 딸린 200만원이 넘는 노트북 9을 구입했었는데 이게 몇 시간 Unity 기반 2D 게임을 돌렸다가 블루스크린과 함께 GPU가 저세상으로 갔다. 적어도 CPU에는 온도가 너무 높아지면 성능을 임의로 저하시켜서 칩을 보호하는 기능이 있는 것으로 아는데 이 제품의 GPU에는 이것을 제대로 구현하지 않은 것인가. 강제로 오버클럭을 시키거나 Fan이 고장났거나, 온도관련 안전장치를 해제 했으면 모르겠는데 정상 사용중 GPU가 고온으로 손상되다니 이것은 명백한 설계 미스다. 심지어 사이즈를 줄이기 위해서 CPU, RAM, GPU를 한 보드 위에 몰아두어서 GPU가 나갔다고 GPU만 고칠 수 없다더라. 수리비 90만원.

 

그나마 삼성에서 리퍼 부품 교환 서비스를 운영하고 있어서 절반 가격인 40만원 정도에 수리를 받았으나 제품 블랙리스트를 고려할만큼 많은 실망을 안겨주었다. A/S 기사님도 되도록 새 제품을 사는 것을 권장하셨으나 구매가를 생각하면 나쁘지 않은 선택이었다고 생각한다.

 

센터에 간 김에 위의 웹캠이 흑백으로 나오는 문제를 같이 문의했었다. 나는 소프트웨어 문제라고 계속 주장을 했으나 A/S 기사님이 자체 카메라 검사 유틸리티를 실행해서 확인을 했는데 진단은 카메라 모듈 하드웨어 손상. 카메라가 아예 안나왔으면 안나왔지 이런 현상을 본적이 없다고 하시더라. 카메라 모듈 역시 디스플레이와 일체형이라 수리비 20만원. 얜 포기를 하고 GPU 만 수리를 받았는데 오늘에야 문제를 자체적으로 해결했다.

 

노트북 제품들간 차이가 줄어든 현재, 사용자 경험의 사소한 차이가 구매로 이어진다. 수리가 어려운 구조의 제품 디자인과 GPU 보조 장치/프로그램의 설계 미스, A/S 프로토콜이 짚어내지 못한 너무나도 단순한 문제 때문에 앞으로 다른 브랜드 노트북에 눈이 가게 될 것 같다.

Posted by Knowblesse
카테고리 없음 | 2021. 7. 16. 10:35 | /31

서론

20년 10월부터 vim을 쓰기 시작한 이후, 전에는 어떻게 살았나 싶을 정도로 유용하게 사용하고 있다. 모든 코딩 작업은 전부 vim으로 진행을 하고, IDE의 부가적인 기능이 필요한 경우 IDE와 함께 열어서 돌릴 때만 IDE를 쓰고 그 이외의 코드 편집 작업은 vim에서 하는 방식으로도 쓴다.

 

8개월 가량 vim을 쓰면서 숙련도도 머리보다 손이 먼저 나갈만큼 증가했지만 vimrc 파일에도 크고작은 변화가 있었다. 특히 문제가 되었던 것은 집, 학교 컴퓨터와 노트북에 동일한 vim 환경을 구축하는 것이었는데 vimrc를 쪼개고 batch script를 만들고, git을 사용해 동일한 환경을 구축할 수 있도록 설정했다. 이 글은 최근에 바꾼 vimrc 파일을 공유하기 위함이다.

 

vimrc

  • Plugin 관리는 Plug로 정착을 했다. 사용법이 쉽고, github 기반 plugin들은 README.md를 읽을 필요도 없이 쉽게 적용이 가능하다.
  • 여러 plugin들을 테스트 해보다가 마음에 들거나 필요한게 생기면 하나씩 추가/수정을 진행했다.
  • 이전 글에서 열심히 만들어두었던 python에서 선택영역을 실행하는 기능은 결국 잘 안쓰게 되더라. 이전 명령들을 보기 어려워서 그런지 편리한 IDE로 자꾸 손이 간다.
" vim runtime config file

" Written by Knowblesse 2020

" Adapted from miguelgrinberg/.vimrc



"""""""""""""""""""""""""""""""""""

"             Basics              "

"""""""""""""""""""""""""""""""""""

" sane text files

set fileformat=unix " uses line ending LF (not DOS-style CR LF)

set encoding=utf-8

set fileencoding=utf-8

set nu

set tabstop=4

set shiftwidth=4

set softtabstop=4

set colorcolumn=100

set expandtab

set hlsearch

if has('unix')

    echo "Unix option is applied"

    set guifont=Bitstream\ Vera\ Sans\ Mono\ 12

else

    echo "Consier as Window OS"

    set guifont=Bitstream\ Vera\ Sans\ Mono:h12

endif

" Key Bindings

imap jk <Esc>

nmap <Tab> >>

nmap <S-tab> <<



" color scheme

syntax on

colorscheme monokai

filetype on

filetype plugin indent on



"""""""""""""""""""""""""""""""""""

"             Plugin              "

"""""""""""""""""""""""""""""""""""

"monokai theme is manually installed

"ctag is manually installed



call plug#begin()

Plug 'yegappan/taglist'

Plug 'tpope/vim-sensible'

"Plug 'terryma/vim-multiple-cursors'

Plug 'mg979/vim-visual-multi'

"buffer lists instead of tab

Plug 'ap/vim-buftabline'



"NERD

Plug 'preservim/nerdtree'



"Git

Plug 'airblade/vim-gitgutter'

Plug 'Xuyuanp/nerdtree-git-plugin'

Plug 'tpope/vim-fugitive'



"Coding

Plug 'davidhalter/jedi-vim'

Plug 'ervandew/supertab'

Plug 'dense-analysis/ale'

Plug 'itchyny/lightline.vim'



"Color theme

Plug 'joshdick/onedark.vim'



"Table generataion

Plug 'dhruvasagar/vim-table-mode'



call plug#end()





"""""""""""""""""""""""""""""""""""

"       Start up Functions        "

"""""""""""""""""""""""""""""""""""

"autocmd VimEnter * call StartUp()

"function! StartUp()

"    if 0 == argc()

"        NERDTree

"    end

"endfunction

"

"""""""""""""""""""""""""""""""""""

"        Plugin Options           "

"""""""""""""""""""""""""""""""""""

" lightline

set noshowmode

let g:lightline = { 'colorscheme': 'onedark' }



"nerdtree

let g:nerdtree_open = 0

map <leader>t :call NERDTreeToggle()<CR>

function NERDTreeToggle()

    NERDTreeToggle

    if g:nerdtree_open == 1

        let g:nerdtree_open = 0

    else

        let g:nerdtree_open = 1

        wincmd p

    endif

endfunction



"""""""""""""""""""""""""""""""""""

"             Python              "

"""""""""""""""""""""""""""""""""""

"Python execute selected line script

autocmd FileType python setlocal completeopt-=preview

python3 << EOL

import vim



def ExecuteSelectedLine(l1, l2):

    for i in range(l1-1,l2):

        print(">>" + vim.current.buffer[i])

        exec(vim.current.buffer[i],globals())

def ExecuteExpression(exp):

    print(">>" + exp)

    exec(exp,globals())

EOL

command! -range Ev <line1>,<line2> python3 ExecuteSelectedLine(<line1>, <line2>)

 

https://github.com/knowblesse/vimrc

 

knowblesse/vimrc

Contribute to knowblesse/vimrc development by creating an account on GitHub.

github.com

 

git integration

  • 아래는 내가 git을 사용해서 vim 환경을 동일하게 유지한 방법이다.
  • 새 환경을 설정할 때는 먼저 knowblesse/vimrc를 clone해서 저장해둔다.
  • vim이 윈도우나 Ubuntu에서 home 경로에서 _vimrc 혹은 .vimrc을 읽기 때문에 레포에 _vimrc 파일을 만들어 두고 리눅스인경우 .vimrc, 윈도우인경우 _vimrc로 이름을 바꾸어 home 위치에 넣어주는 스크립트, 각각 setVim_linux.sh와 setVim_win.ps1을 만들어두었다.
  • 이 _vimrc에는 사실 별게 들어있지 않다. 쉽게 환경별로 업데이트를 할 수 있도록 git을 clone 해둔 경로만 수정해주면 git pull을 통해서 vimrc.vim 파일이 업데이트가 되고 _vimrc가 이 .vim 파일을 읽는 방식이다.
  • 그리고 왜인지 OS마다 폰트 설정 방식이 달라서 OS를 읽고 상황에 따라 다른 명령어를 적용하도록 만들어두기도 했다.
  •  

 

Posted by Knowblesse