1인 개발자나 스스로 후원자 하면서 세월아 내월아 해도 상관없는 경우를 제외하고, 일감을 받아 업무를 수행하고 돈을 받아가는 형태로 업무를 진행하고 있다면 좀 고려해주었으면 하는 게 있다.


바로 신뢰도다. 
조금은 많이 뭉그뜨려서 표현한 부분이긴 한데, 자기 자신의 속도에 대한 이해도와 현재 업무에 대한 전체적인 파악 및 장악력 같은 내용을 의미한다.
예를 들면, 현재 프로젝트에서 특정 모듈을 개발하는 업무를 받았다고 치자. 여기서 PM 혹은 PL은 얼마나의 시간이 걸릴지를 묻곤 한다. 여기서 그 답을 줄 수 있느냐 없느냐는 부분이다. 물론 성격에 따라 정확한 수치가 아니면 제시할 수 없다고 하는 완벽주의(?)를 가진 분도 있긴 하지만, 그런 부분을 차치하고, 대략적인 수치를 떠올릴 수 있냐 없느냐다. 
이런 대략적인 수치를 뽑으려면 2가지가 요구된다. 


그 하나가 자신의 개발 속도다. 
특정 과제를 해결하는 데 걸리는데 보통 며칠이 걸리는지, 그 과제의 난이도는 어떤지 등에 대해서 기준점을 확실히 하는 것이다. 그래서 특정 과제, 유사 과제 등이 제시되었을 때 어느 정도의 기간 내에 개발할 수 있는지를 곱셈이든, 덧셈이든 해서 값을 도출할 수 있게 된다.

그리고 다른 하나가 주어진 과제에 대한 장악력이다. 
왜 내가 이 부분을 만들어야 하고 -오해하지 말아야 할 부분이 할지 말지를 알기 위한 게 아니다. 반드시 해야 한다. 다만 이렇게 만들어지는 게 어떻게 이용되고 활용되어야 하는지를 의미한다. - , 전체 프로젝트에 어느 부분에 해당하고 어느 정도의 영향력이 있는지 등을 이해하는 능력이다. 하지만 이런 능력은 해당 업무 도메인에 대한 경험치와 비례하기 때문에, 초보 개발자에게 요구하기엔 무리가 있긴 하다. 하지만 이 부분에 대한 대응 가능 여부에서  자신이 초급인지 중급인지 고급인지를 나누게 된다. 

이 업계에서 20여 년간 지내보면서 다양한 동료와 일을 해보면서 느낀 점은 저 부분에 대해서 고민하는지 안하고 피동적으로만 일하는지에 따라 다른 길로 나아간다. 때로는 상급자로, 때로는 금전적 보상으로, 때로는 인정으로 보상을 받으며 일하는지, 아니면 그저 잠깐 인력 지원 레벨에서 끝나 이곳 저곳을 전전하다 결국 적응 실패로 다른 직업으로 전환하거나, 마지못해 일하는 모습만으로 무시 혹은 평가절하 신세를 면치 못하는 모습에 실망하는 모습을 여럿 본 것 같다.

시킨 것만 하고, 미련하게 앞서 생각하다 깨지고 나댄다고 혼날 바엔 조용히 할 일만 하고 따박 따박 월급 받으면서 사는게 제일이야.. 라고 자신있게 말하는 분도 보지만, 결국 활동시기가 저무는 40대 즈음 자신이 해온 일을 쭉 돌아보고 나면 대개는 후회한다고 생각한다.

만일 아직 20대고 30대라면 저 부분에 대해서 고민해보자.
상급자가 겁나게 까칠하거나, 되먹지 않다면 굳이 나대가며 할 필요까지는 없지만, 스스로 계산해보고, 정말 그런지 안그런지를 조용하게 검증해보면서 기준을 잘 세워본다면 상급자로 올라가거나 다른 곳으로 이직하면서 새롭게 적용할 때, 준비된 개발자로 거듭나지 않을까 생각한다.

728x90

Jenkins를 이용해 자동으로 빌드하고, 빌드한 결과물은 Zip으로 압축하여 제공한다.
여기서 빌드 결과물 파일에는 BUILD_NUMBER 값을 이용해 파일명을 만들고 있다.

SET FILENAME=MYSELF_%BUILD_NUMBER%.zip

문제는 저 BUILD_NUMBER 부분인데, 이게 1부터 시작해서 빌드 될 때마다 자동으로 1씩 더해지는 값이다.

그러다보니, File Sort를 해보면, 아래 처럼 될 때가 있다.

MYSELF_1.zip
MYSELF_10.zip
MYSELF_11.zip
MYSELF_2.zip
MYSELF_3.zip
MYSELF_4.zip
MYSELF_5.zip
MYSELF_6.zip
MYSELF_7.zip
MYSELF_8.zip
MYSELF_9.zip

요즘은 운영체제가 좋아지기도 했고, 파일관리도구들도 지능적이여서, 저 숫자부분만 떼서 Sort를 해주기도 하지만, 기본적인 String Sort로 하게되면 저렇게 된다.

방법은 저 파일명의 숫자부분 앞에 "0"을 채우면 된다.

그러니까...

MYSELF_0001.zip
MYSELF_0002.zip
MYSELF_0003.zip
MYSELF_0004.zip
MYSELF_0005.zip
MYSELF_0006.zip
MYSELF_0007.zip
MYSELF_0008.zip
MYSELF_0009.zip
MYSELF_0010.zip
MYSELF_0011.zip

위와 같이 만들 수 있다.

이를 위해서는 Jenkins 빌드 후 파일명 만들 때 다음과 같이 만들면 된다.

SET PADDED_BUILD_NUMBER=000%BUILD_NUMBER%
SET PADDED_BUILD_NUMBER=%PADDED_BUILD_NUMBER:~-4%

SET FILENAME=MYSELF_%PADDED_BUILD_NUMBER%.zip

굳이 설명하자면,

1번째 줄에서는 BUILD_NUMBER라는 값 앞에 "000"을 붙인다.
1이면 0001이든, 951이면 000951 같이 된다.

2번째 줄에서는 뒤에서 4글자만 뽑는다.
0001 이면 0001, 000951 이면 0951 식으로 4글자만 뺀다.

그리고 나머지 줄에서는 그렇게 만든 4글자짜리 BUILD_NUMBER를 이용해, 파일명을 만든 것이다.

핵심은....

:~-4

이다.

%{환경변수 이름}:~{+ 앞에서부터, - 뒤에서 부터}{추출할 갯수}%

 

728x90

Windows 10 부터 미디어 작성도구를 제공해서, USB에 자신의 설치용 Windows을 쉽게 만들수 있다.
다만, 이렇게 만들 때, 다양한 버전이 이 안에 들어가다 보니, 설치 중 Profesional 버전을 설치하고 싶을 때 골라서 설치가 안된다. 특히 설치 대상 PC가 OEM PC이고, 바이오스 상에 Windows 라이선스가 박혀 있는데, 그것도 Home Edition인 경우 매우 곤란했다. 쭉 설치하다보면 Home Edition으로 설치되고 끝. 게다가, 요즘 Windows 11 Home의 경우 Microsoft 계정이 없으면 설치도 안되기 때문에, Profesional로 설치하고 싶은데 매번 아무런 질문도 없이 진행되니...

그러나 구글로 찾아보니.. 나오긴 한다.

1. 설치용 USB를 만든다.
그냥 만든다. Microsoft 사이트에 들어가 Media Creation Tool을 받아서 USB 꼽고 만들어 달라고 하면 자동으로 USB에 설치 미디어를 만들어 준다. 이를 설치할 PC에 연결한 뒤 설치하면 잘 진행된다.
물론 여기에 조금 더 작업을 가미해야 한다.

2. ei.cfg 파일을 {설치용 USB 드라이브명}:\sources 폴더에 만들기.
USB가 만들어지면 드라이브가 잡히는데, 아마도 E:\나 F:\ 정도인데,
E:\sources 혹은 F:\Sources 폴더 안에 Text 파일(노트패드 등으로 작성)을 하나 만든다.
만들 때 파일명을 ei.cfg로 하고 만든다.

3. ei.cfg 안에 다음 내용을 넣는다.

[EditionID]
Professional

[Channel]
Volume 

[VL]
1

자세한 설명은 아래 링크를 통해 내용을 확인하도록 한다.
https://learn.microsoft.com/ko-kr/windows-hardware/manufacture/desktop/windows-setup-edition-configuration-and-product-id-files--eicfg-and-pidtxt?view=windows-11

 

Windows 설치 프로그램 버전 구성 및 제품 ID 파일(EI.cfg 및 PID.txt)

Windows 설치 프로그램 버전 구성 및 제품 ID 파일(EI.cfg 및 PID.txt) 아티클 05/30/2023 기여자 5명 피드백 이 문서의 내용 --> 선택적으로 버전 구성(EI.cfg) 및 제품 ID(PID.txt) 파일을 사용하여 Windows 설치 중

learn.microsoft.com

 

저장이 끝나면 이제 이 USB를 이용해 Windows 11을 설치하면 된다.

 

728x90

2년전 (2021년 11월 경)에 레노버 노트북인 T14Gen2 라이젠 에디션을 구매했다.
잘 쓰고 있는데, 간혹 외부에 나갈 때, 회의 할 때 노트북을 들고 나가려면 매번 여러 포트들에 연결된 장비들을
해제하고 정리해야 했다.

전원으로 사용되는 USB-C 포트.
포트 확장으로 이용되는 또 다른 USB-C 포트.
4K 해상도의 큰 모니터 연결용 HDMI 포트.
키보드, 마우스 USB-A 포트,
유선랜을 위한 RJ-45 포트 ...등등.

한 두번이야 뺐다가 다시 끼면 된다고 하지만, 회의 2번 정도 하면,
자연스럽게 노트북 보다는 다이어리로 적고, 그것을 다시 PC로 옮겨 적곤 했다.

물론 USB-C 형태의 멀티 포트 지원하는 제품들을 사용해서
근래 유행하는 USB-C 기반의 Docking Station이 있고, 그것을 이용하면, 전원부터 모니터, 랜선까지
다양한 기기를 한번에 뺐다가 다시 낄 수 있긴 하다.
그런데, 개인적인 생각에는 Intel의 썬더볼트 기반의 구조가 아니면, 대역폭의 한계가
알게 모르게 보이게 됐고.. 더욱이 T14의 경우 다른 USB-C 포트는 주변이 이상하게 생긴 부분이 있다.

USB-C가 두개가 있는데, 하나는 전원단자를 거의 담당하고, 다른 하나는 뭔가 이상한 포트와 한셋트 처럼 되어 있었다.

뭔가.. 이용할 포인트가 없었을까? 해서... 레노버 공홈에서 Docking Station을 검색하는데 이젠 USB-C 기반의 Docking Station으로 밖에는 없었다. 예전 노트북들의 옵션과 같은 진짜 Docking Station이 아니라, USB-C 기반의 허브로 된 Docking Station이 전부였다. 불가능은 아니지만 대역폭 문제와 의문의 단자 부분의 활용이 아깝다는 생각에 고민에 빠졌다.

그러다가.. 우연히 E-Bay에서 아래와 같은 Docking Station을 발견했다.
https://www.ebay.com/sch/i.html?_from=R40&_trksid=p4432023.m570.l1311&_nkw=lenovo+40aj0135us&_sacat=0

 

lenovo 40aj0135us for sale | eBay

유효한 가격 범위를 입력해 주세요

www.ebay.com

다 좋은데.. 문제는 호환성.

T14Gen2가 지원되는지 안되는지에 대한 문구를 어디서 찾아보기 힘들었고, 과연 연결이 제대로 되는지 조차 알길이 없었다. 외국어를 잘하고, 뭔가 자신감 뿜뿜이면 Reddit 같은데 질문도 올려보고 고민을 다양하게 해보겠지만, 소심자로는 도무지 용기가 나지 않았다. 물론 가격이 3~40불이라고 적혀 있어 계산해보니 5~6만원 정도라... 질러 볼까 했는데, 배송비 등을 보니까(물론 무료도 있지만, 대개는 대행사가 있어야만 가능) 10만원 언저리.

고민하다가 Amazon에서 구매를 했다.
https://www.amazon.com/s?k=40AJ0135US&ref=nb_sb_noss

이베이가 저렵한 것 같지만, 배송비 장난이나, 국내 배송 불가가 은근히 많고, 제품이 중고인데, New라고 하는 곳도 있고..애매해서였다.

배송까지는 대략 1주걸린듯.

제품은 도킹스테이션과 아답터가 있는데, 이 아답터는 도킹스테이션과 연결되어 노트북에 전원을 공급한다.
그리고 도킹스테이션과 노트북이 연결하는게 좀 재미있는데, 왼쪽 슬라이드 부분이 노트북과 연결되지 않으면 꿈쩍도 하지 않는데, 처음에 그냥 밀어봤는데, 뭐가 잠긴듯 꿈쩍하지 않는 것이였다. 그래서 열쇠가 잠겨서 인가? 싶었는데, 그것도 아니였다. 처음에 연결이 잘 안되서 호환이 안되는줄 알아... 돈 날렸구나.. 했다.

노트북이 놓이는 자리 쪽에 눌리는 스위치 같은 부분이 여러개 있는데, 노트북이 잘 놓으면 그 부분이 모두 눌리면서 자연스럽게 슬라이드시켜 노트북과 연결하는 구조였다. 저 도킹판 위에 노트북을 이리저리(상하, 좌우)로 조금씩 이동시키다보면 아래로 조금 내려가면서 뭔가 체결되는 느낌이 있다. 그 시점에 왼쪽의 슬라이드를 밀어 노트북과 연결하면 된다.

모델명은 40AJ0135US 이여서, 대략 검색으로 충분히 찾을 수 있을 것이다.

다른 것 모르겠지만, 자신의 Lenovo 노트북 왼편의 포트 중 USB-C 포트가 두개이고, 다른 한쪽의 USB-C 포트가 이상하게 생긴 포트로 둘러싸인 구조라면 대부분 호환될 것 같다. (하지만 검색해서 나오지 않는다면 용기가 좀 필요할 듯)

지금은 매우 만족해서 쓰고 있고, 기능이나 성능 그 어떤 부분에서도 불만이 없다.

진즉 알았으면 좋았겠지만, 늦게 산만큼 가격은 저렴해진 부분도 있어 현재로는 불만 0 상태다.

728x90

현재 Synology NAS를 이용해서 이것 저것 활용하고 있다.
그 중에 하나가 Docker를 이용한 방법인데, 여기서 Bitwarden을 잘 쓰고 있다.

개인적으로 쓸때는 아무 문제가 없었는데, 사용자를 추가하려고 하니까,
접근이 안되는 것이다. 예전에는 URL 맨 뒤에, /admin 만 붙이면 들어가졌는데,
갑자기 사이트가 활성화 되지 않는 것이다.

잠깐 구글링을 했고 원인을 찾아 적용했다.

관리자 화면 띄위기

일단, 관리자 화면을 띄우려면, 해당 기능 활성화 전에, 관리자 접속을 위한 정보가 필요하다.
여러가지 방법이 있지만, 그 중 가장 간단한(물론 보안에는 그닥 권장은 못하지만) 방법을 적용했다.
바로 환경 변수에 ADMIN_TOKEN 이라는 값을 추가하는 것이다.
vaultwarden 컨테이너에 환경변수로 다음과 같은 값을 추가한다.
ADMIN_TOKEN
여기에 들어가는 값은 40개의 문자로 구성된 랜덤한 문자열이 필요하다.
여기서 Bitwarden을 띄워 40개 문자, 숫자, 대소문자, 특수문자까지 섞어서 만든다.
이렇게 만들어진 ADMIN_TOKEN을 환경변수로 추가하면 된다.


다만, 여기서 만들어진 토큰은 외부에 유출되지 않도록 한다.

이제 다시 vaultwarden 컨테이너를 다시 시작한 뒤, 자신의 bitwarden 사이트이 URL 맨 뒤에 /admin을 넣으면
관리자 페이지로 들어가는 관문이 나온다.

여기에 앞서 만든 토큰 값을 넣으면 드디어 관리자 페이지에 들어갈 수 있다.

 

728x90

전기 자전거를 구입하고 대략 1년 넘게 탔는데, 
현재 탑승시간 200시간을 넘기게 되었다. 
물론 중간 중간 갑자기 전원이 꺼지거나 무전원 상태로 굴리기도해서 100% 완전하게
탑승시간을 나타내는 것은 아니지만, 최소한 전기를 이용해 달린 시간만 따진다고
볼때 90% 이상은 맞는 시간...

다만, 전에 100시간 넘겼을때도 그랬는데, 시간 카운트가 99:59:59 에서 00:00:00 으로 넘어갈때
마치 초기화 되는 것처럼 누적거리도 없어지는데, 껏다가 다시켜면 거리가 원래대로 나온다.

199 시간 38 분에 찍고...
00시간 00분 초기화된 시점이 200시간.
다시 껏다가켜니, 200시간 현재 3752.6Km 달림

아마도 자전거로 어디를 놀러가거나 그냥 운동(?)삼아 탔다면 절대 못찍었을듯.
출퇴근이라는 명분이 있다보니 여기까지 온 것 같다.

728x90

Windows Command Line을 이용해서 스크립트를 종종 짤 때가 있는데, 

PID 값이 담긴 Text 파일을 읽어 안에 들어 있는 PID 값을 이용해 프로세스를 종료하려고 할 때 쓰려고 한다.

RUNNING_PID 라는 텍스트파일 여부를 가지고 하는데, 아래와 같이 짠다.

IF EXISTS RUNNING_PID (

SET /p PID=<RUNNING_PID

TASKKILL /PID %PID%

) else ( echo Not Running... )

 

 

728x90

이 작업은 이미 Obsidian에 잘 설명되어 있으며, N2O(Notion To Obsidian)라는 프로젝트의 설명이 잘되어 있었다.
https://help.obsidian.md/How+to/Import+data
https://github.com/visualcurrent/Notion-2-Obsidan

다만, 워낙 설명을 잘 읽지 않는 개인적인 문제로 약간의 작업의 오류가 있었고, 준비하는 과정이 좀 있어야 되서 그 내용에 대한 정리를 한다.

Notion에서 Export 하기.

먼저 Notion에서 현재 기록된 모든 내용을 다운 받도록 한다. 이걸 한번에 할 수 있는데, Notion에서 "설정과 멤버"에 들어가 "워크스페이스'의 "설정"으로 들어가면 맨 아래 쪽에 "콘텐츠 내보내기"라는 항목에 "워크스페이스의 모든 콘텐츠 내보내기" 버튼을 클릭한다.
그러면 내보내기를 위한 옵션들을 선택하게 나오는데, "내보내기 형식"에서 "Markdown & CSV"를 선택하고, "하위 페이지용 폴더 생성"에서 옵션을 켜주도록 한다.
그리고 내보내기 버튼을 누르면 페이지들을 내보내주기를 한다.
기다리면 최종적으로 다운로드 링크를 보여준다.
만일 페이지가 많으면 많을 수록 시간이 매우 오래 걸리므로 일단 내보내기 창을 닫고 기다리자. 완료되면 계정과 연결된 이메일로 결과를 보내준다.

실행 준비

Notion To Obsidian 이라는 프로그램이 Python으로 되어 있어, Python을 띄울 수 있어야 한다. 물론 Windows에서도 가능하지만, 필자는 아예 Linux가 있어서 그 안에서 했다. 단, GUI가 필요하므로 Linux는 Desktop 버전으로 사용하도록 한다.

이 프로그램은 git을 통해서 다운이 가능하다. git 없으면 git을 설치한 뒤, 다음과 같이 입력해서 Notion to Obsidian 프로그램을 다운 받자.

git clone https://github.com/visualcurrent/Notion-2-Obsidan.git

이 프로그램은 Python3 가 필요하다. 혹시 Python2 라면 Python3로 업그레이드하거나 교체해야 된다. 그리고 Python의 UI 관련된 기능을 추가로 설치해야 한다.

sudo apt install python3-tk

이 패키지는 Python관련 Window 기반 UI를 띄워준다. 꼭 이 패키지를 같이 설치한다.
마지막으로 PIP가 필요한데, 이 PIP가 있어야 추가적인 패키지를 설치할 수 있다. 보통 Python을 이용한 App을 돌리고 있다면 대개는 설치되어 있으나 혹시 설치가 안되어 있을 수 있으므로 다음 명령을 넣어 설치하도록 한다.

sudo apt install python3-pip

최종적으로 pip가 준비되었다면 다음 명령을 넣어 easygui를 구성한다.

pip install easygui

프로그램 다운로드

압축파일 확보

Notion을 통해서 다운 받은 파일은 보통 암호같인 긴 이름의 zip 파일이다. 이 압축파일의 압축을 해제한다. 압축을 해제하면, 다시 Export-xxxx....zip 파일이 더 생기는데, 이 파일을 앞서 git을 통해 다운 받은 폴더 위치에 넣는다. 확장자가 py가 있는 그 폴더에 넣으면 된다.

실행

다음 명령을 넣으면 프로그램이 실행된다.

python3 N2O.py

(만일 실행이 안된다면 위의 단계 중 누락되어 패키지 부족이나 버전 문제, 압축파일 위치나 N2O.py 파일들이 제 위치에 없어서 일 가능성이 높음)
그럼 다음 그림과 같이 UI 화면이 나오는데, 그곳에서 앞서 복사해넣은 Export-xxxx...zip 파일을 선택하도록 한다.

정상적으로 실행되었다면, 다음과 같이 표시된다.


최종적으로 만들어진 파일은 앞서 제시한 Export_xxxxx....zip 파일 맨 뒤 쪽에 Export_readyObsidian.zip 이라는 파일이 새로 생긴다. 이 파일을 가져온다. 그리고 이제 다운 받은 파일의 압축파일을 풀도록한다. Windows에서 기본적으로 제공하는 압축 프로그램으로는 압축해제가 잘 안될 수 있는데, 7-zip이나 반디집 같은 것으로 풀도록 한다.

보관소 열기 및 복사

Obsidian을 실행한다.
그리고 왼쪽 아래편 끝자락에 있는 "다른 보관소 열기"를 선택한다.

그리고 난 뒤, 맨 위의 보관소를 선택한 뒤, 메뉴 버튼을 클릭 후 "시스템 탐색기에서 보기"를 선택하도록 한다.

폴더가 열렸으면, 그 안에 새로운 폴더를 만들고 그 안에 앞서 압축을 해제한 내용을 복사해 넣는다.
Obsidian의 문서 구조와 폴더 안의 구조가 동일하니, 적당히 폴더를 구성해서 담아주면 된다. 

728x90

+ Recent posts

728x90