반응형
작성일: 2025년 1월 13일

 

Golang으로 코드를 작성하다보면, 다른 개발자가 작성한 go package를 사용할 일이 생긴다.

분명 누군가 go package를 만들었을 것 같은데, 찾기가 쉽지 않다.

(안정성, 보안성 측면에서 믿을 만한 package를 찾기가 힘들다는 뜻)

 

아래의 웹 사이트를 이용해서 Go Package를 찾아보는 것을 추천!

Golang 표준 라이브러리 (표준 패키지)

https://pkg.go.dev/std

 

Standard library - Go Packages

Discover Packages Standard library Version: go1.23.4 Opens a new window with list of versions in this module. Published: Dec 3, 2024 License: BSD-3-Clause Opens a new window with license information. Jump to ... Directories Directories ¶ Show internal Exp

pkg.go.dev

 

"Awesome Go" 에서 많이 사용되는 패키지 모음

https://github.com/avelino/awesome-go

 

GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software

A curated list of awesome Go frameworks, libraries and software - avelino/awesome-go

github.com

 

반응형
작성일: 2025년 1월 12일

 

문서를 읽다보면, 한 화면씩 넘기면서 캡처한 내용을 PDF 파일로 만들어야 할 경우가 있다.

그리고 이 PDF 파일에서 문자열 검색이 가능하도록 OCR을 적용해야 할 경우도 발생한다.

그럴 때 아래와 같이 Python Script를 작성해서 실행하면 된다.

 

Step 1: 화면 캡처해서 PNG 파일로 저장하기

#!/opt/homebrew/bin/python3

import os
import time
import pyautogui

## 숫자 745를 2로 나눈 이유는 2 Page를 한 화면으로 캡처하기 위함.
maxPage = (745 // 2) + 1

time.sleep(5)

for idx in range(maxPage):
    ## 숫자 110,170,1785,1205는 캡처할 화면의 위치에 대한 X-Y 좌표 값이다.
    ## 캡처할 때마다 이 숫자를 조정해서 사용해야 한다.
    my_cmd = "screencapture -R110,170,1785,1205 p_%04d.png" % idx
    print("cmd:", my_cmd)
    os.system(my_cmd)

    ## 오른쪽 화살표 키를 누르면서 한 화면씩 캡처하기.
    pyautogui.press('right')
    time.sleep(1)

 

 

Step 2: 여러 개의 PNG 파일을 PDF 파일로 변환하기

#!/opt/homebrew/bin/python3

import os
import img2pdf

# Replace the directory path with the folder containing JPEG images to be converted
directory_path = "."

image_files = [idx for idx in sorted(os.listdir(directory_path)) if idx.endswith(".png")]

# Convert the list of JPEG images to a single PDF file
pdf_data = img2pdf.convert(image_files)

# Write the PDF content to a file (make sure you have write permissions for the specified file)
with open("my-book.pdf", "wb") as file:
    file.write(pdf_data)

 

참고: 위와 같이 PDF 파일로 변환하면, 글자가 그림으로 표현되기 때문에 "문자열" 검색이 되도록 하려면 OCR을 적용해야 한다.

 

Step 3: PDF 파일에 OCR 적용하기

OCR 관련 소프트웨어 패키지를 설치하기

$ brew install ocrmypdf

## 영어 이외에 언어(예: 한국어, 일본어, 중국어)를 사용하려면 아래와 같이 tesseract-lang 패키지를 설치
$ brew install tesseract-lang

기존 PDF 파일을 OCR 적용된 PDF 파일로 변환하기

## "eng+kor" 옵션을 설정하여 Image에 있는 영어, 한국어를 인식하도록 함.
$ ocrmypdf -l eng+kor my-book.pdf my-book-ocr.pdf

 

Apple m2 CPU를 사용했을 경우, 만약 500 Page 분량이면 ocymypdf 명령이 완료되기 까지 10분 정도 소요된다. 

그리고 8개의 CPU Core 사용률이 모두 95% 이상이 된다.

 

 

반응형
작성일: 2025년 1월 11일

 

집에서 혼자 끄적끄적 거리면서 개발할 때는 내가 어떤 라이브러리를 사용하는지 큰 관심이 없지만,

회사에서 상용 소프트웨어를 만들면서 오픈소스 라이브러리를 쓸때마다 라이센스(라이선스)를 확인하게 된다.

 

라이센스 유형이 다양한데, "한국저작권위원회"의 "오픈 소스 라이선스 가이드"가 설명이 가장 쉬운 것 같다.

아래 "오픈 소스 라이선스 가이드"가 다루는 내용은;

  • BSD 계열
    • BSD
    • Apache
  • GPL 계열
    • GPL 2.0
    • GPL 3.0
    • LGPL
    • Affero GPL
    • GPL Exceptions
  • MPL 계열
    • MPL
    • CDDL
    • CPL, EPL
  • Font License
    • GPL Font Exception
    • SIL Open Font License (OFL)
    • Ubuntu Font License

 

https://www.olis.or.kr/license/licenseGuide.do

 

라이선스 가이드

오픈 소스 라이선스 가이드 4.0은 오픈소스 개발 실무자들이 쉽게 오픈소스 라이선스의 내용을 참고할 수 있도록 제정된 것으로, 2019년 6월에 발표되었다. 목차 이 가이드는 다음과 같은 목차로

www.olis.or.kr

 

 

오픈 소스를 사용하다가 생기는 분쟁에 대한 대응 방안 가이드도 제공되고 있다.

 

https://www.olis.or.kr/license/conflictGuide.do

 

분쟁 대응방안 가이드

오픈소스SW 라이선스 분쟁 대응방안 가이드는 오픈소스를 활용하는 과정에서 발생할 수 있는 법적 리스크와 분쟁 사례들을 정리하고, 법적 리스크 관리에 관한 기업들의 사례를 제시함으로써,

www.olis.or.kr

 

 

반응형
작성일: 2025년 1월 10일

 

Linux kernel source code를 다운로드하는 방법

GitHub에서 Git Clone하기

$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

 

참고: github에서 clone하면, 다운로드 시간이 엄청 길다. 내 경우는 10분 소요되었다.

 

 

Tar 파일로 다운로드하기

아래 Linux Kernel 공식 Archive 홈페이지에서 원하는 Linux 버전의 소스 코드에 대한 Tar 파일을 다운로드.

https://www.kernel.org

 

 

반응형
작성일: 2025년 1월 8일

 

 

로그 함수를 사용하다보면, __FILE__, __LINE__ 같은 내용을 반복적으로 입력하게 된다.

타이핑치는 입장에서는 귀찮고, 코드를 읽는 입장에서는 사족 같은 느낌이 든다.

그렇다고 __FILE__, __LINE__ 같은 내용이 필요없는 내용은 아니다. 이런 정보가 디버깅할 때는 아주 중요한 단서를 제공한다.

 

가변 인자 매크로(__VA_ARGS__)를 이용하면, __FILE__, __LINE__ 같은 반복되는 내용을 줄일 수 있다.

아래 예시를 보면, 딱 느낌이 올 것이다.

 

#include <stdio.h>
#include <stdarg.h>

// __VA_ARGS__ 매크로 상수를 사용
#define MYLOG(...) mylog(__FILE__, __LINE__, __VA_ARGS__)

void mylog(char * file, int line, char * format, ...)
{
    fprintf(stdout, "(%s:%d) ", file, line);

    va_list args;
    va_start(args, format);
    vfprintf(stdout, format, args);
    va_end(args);

    return ;
}


int main()
{
    // 테스트 변수
    int num_a = 1;
    char str_a[16] = "AAA";

    // log 함수 사용 예시
    mylog(__FILE__, __LINE__, "This is first log.  num_a:%d  str_a:%s\n", num_a, str_a);

    // Log Macro 사용 예시
    // __FILE__, __LINE__ 을 사용하지 않았지만, MYLOG 매크로를 이용하여 file name과 line 정보를 출력함.
    MYLOG("This is second log.  num_a:%d  str_a:%s\n", num_a, str_a);
    return 0;
}

 

 

위 소스코드를 컴파일하고, 실행해보면 아래와 같이 동작한다.

$ gcc main.c

$ ./a.out

(main.c:26) This is first log.  num_a:1  str_a:AAA
(main.c:29) This is second log.  num_a:1  str_a:AAA

$

 

 

반응형
작성일: 2025년 1월 2일

 

대학생 때 까지는 종교에 관심이 없었는데, 사회 생활하고 결혼하고 아이를 키우고 늙어가면서 삶을 바라보는 관점이 조금이 바뀌더니

성인(예수, 부처, 공자, 맹자)의 말씀이 마음에 콕콕 박히는 경우가 늘어나고 있다.

나는 가톨릭 신자이고, 우리 가족과 친척, 처가의 모든 친척도 가톨릭 신자이다.

이런 이유 때문에 예수의 말씀 뿐만 아니라 가톨릭의 역사, 로마 가톨릭과 개신교와의 관계, 전세계에 있는 가톨릭 수도회 마다의 특징이나 활동(미션) 등에도 관심이 많다.

 

이렇게 관심을 가지고 공부를 하다보니, 다른 종교의 가르침은 어떠한지 호기심이 생겼다.

이런 호기심은 종교학을 전문적으로 연구하는 분들의 강연이나 글을 보면서 해소되고 있는데, 간혹 쉽고 재미있게 종교를 설명해주는 YouTube 영상이 있어서 일단 여기에 메모를 해본다.

 

 

[삼프로TV] 천주교의 공식적인 위계와 권위, 예수님의 뜻일까  |  성기헌 바오로 가톨릭대학교 신부 [The Religion]

https://youtu.be/is3DFe1YuZM?si=Qg_f10r0UAngKqz3

 

[삼프로 TV] 천주교에서 예수의 몸과 피를 먹는 이유  |  성기헌 바오로 가톨릭대학교 신부 [The Religion]

https://www.youtube.com/watch?v=9NhCOMH2tv0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
작성일: 2024년12월 29일

 

 

"산타는 JSun"님이 12곳의 설산을 추천해주었는데, 영상을 보고 있으면 꼭 가보고 싶을만큼 멋진 풍경이다.

나는 겨울 등산 장비가 없으니까, 난이도가 낮고 이동 거리가 짧은 것만 몇개 골라서 가야겠다.

아래 골라본 것이 그나마 만만한 산 목록이다.

  • 한라산 영실 ~ 윗새오름코스
  • 한탄강 물윗길 (강 트래킹, 고석정, 잔도, 주상절리, 순담계곡, 얼음폭포)
  • 태기산 (산 정상 근처 "양구두미재"까지 찻길이 있음)
  • 함백산 (산 정상 근처까지 찻길이 있음)

 

 

태백산 국립공원 CCTV 영상

http://www.knps.or.kr/common/cctv/cctv6.html

 

 

오대산 국립공원 CCTV 영상

http://www.knps.or.kr/common/cctv/cctv11.html

 

 

전국 국립공원 CCTV 영상 리스트

https://www.knps.or.kr/portal/main/contents.do?menuNo=8000168

 

반응형
작성일: 2024년 12월 24일

 

 

Karin Prater(강사)의 설명을 보고만 있어도 이해가 될 정도로 쉽게 설명한다.

(Karin Prater 강사는 아마도 독일 국적인 것 같다. 영어로 말하는데 독일어하는 것 같은 느낌 ^^.

또박또박 diction 하니까 듣는 것은 문제 없음) 

 

macOS 앱 개발을 실습할거라면, 동영상을 보면서 따라하면 된다.

 

 

https://www.youtube.com/watch?v=xEUAKd_PAMo&list=PLWHegwAgjOkqQM6dR97bsp2or2sll2ht-

 

 

위 동영상 강의(Tutorial)이 다루는 내용은 아래와 같다. 

  • Beyond Basics: Can SwiftUI Handle the Challenge of Complex macOS Apps?
  • How to build a macOS app for beginners
  • How to save and manage data with core data in Switft
  • Make a macOS app from start to finish with SwitfUI - "Screenshot App"
  • Make a macOS app: Keyboard shortcuts, settings window and menu bar extra - SwiftUI tutorial
  • WWDC24: Key updates for macOS development with SwiftUI
  • Reading and parsing CSV files in Swift

 

 

 

 

 

##
## 채용 관련 글
##

제가 일하고 있는 기업 부설연구소에서 저와 같이 연구/개발할 동료를 찾고 있습니다.
(이곳은 개인 블로그라서 기업 이름은 기재하지 않겠습니다. E-mail로 문의주시면 자세한 정보를 공유하겠습니다.)
 
근무지 위치:
  서울시 서초구 서초동, 3호선 남부터미널역 근처 (전철역 출구에서 회사 입구까지 도보로 328m)

macOS 앱 개발 부문
  - macOS 운영체제 자체에 대한 이해도가 있어야 함.
    + Swift 언어 외에도 OS Primitive 기능을 다루기 위해 다른 언어를 사용함 (예: Golang)
  - macOS 내에서 IP network traffic을 모니터링하는 정도의 배경 지식 필요.

Linux Server 앱 개발 부문 - 필요한 지식 (아래 내용 중에서 50% 정도를 미리 알고 있다면 빠르게 협업할 수 있음):
  - 운영체제 (학부 3~4학년 때, 컴퓨터공학 운영체제 과목에서 배운 지식 수준):
    예를 들어, Processor, Process 생성(Fork)/종료, Memory, 동시성, 병렬처리, OS kernel driver  
  - Algorithm(C언어, C++ 언어로 구현 가능해야 함)
    예를 들어, Hashtable, Linked list 자료 구조 정도를 C 또는 C++로 구현할 수 있으면 Good! 
  - Network 패킷 처리 지식(Network layer 2 ~ 4)
    예를 들어, DHCP Server/Client 기능(Discover, Offer 등) 구현할 정도의 능력이 있으면 됨.
  - 우리 연구소에서는 Netfilter(iptables)를 잘 사용하면 업무를 수행함에 있어서 편함. (Netfilter를 모르면 동료가 잘 알려줄 것임)
  - IETF RFC 문서를 잘 읽고 이해하는 능력 ^^
  # 위에 열거한 내용 외에도 제가 여기 블로그에 적은 내용들이 대부분 업무하면서 관련이 있는 주제를 기록한 것이라서
  # 이 블로그에 있는 내용들을 잘 알고 있다면, 저희 연구소에 와서 연구/개발 업무를 수행함에 있어서 어려움이 없을 겁니다.
  # 위 내용을 잘 모르지만, 이 분야에 대해 공부하면서 일하고 싶다면 저에게 문의 메일을 주세요~
  # 학습 잠재력이 높은 것이 보인다면, 협업할 동료로써 환영합니다 ^^

회사에서 사용하는 프로그래밍 언어:
  - 프로그래밍 언어: C, C++, Go, Rust
    (참고: 아직 연구소 동료들이 Rust를 사용하진 않습니다만, 새 언어로써 Rust를 사용하는 것을 고려하는 중)

근무 시간:
  - 출근: 8~10시 사이에서 자유롭게 선택
  - 퇴근: 8시간 근무 후 퇴근 (오후 5시 ~ 7시 사이)
  - 야근 여부: 거의 없음 (내 경우, 올해 상반기 6개월간 7시 이후에 퇴근한 경우가 2회 있었음)
  - 회식 여부: 자유 (1년에 2회 정도 회식하는데, 본인이 집에 가고 싶으면 회식에 안 감. 왜 참석 안 하는지 묻지도 않음)

외근 여부:
  - 신규 프로젝트 멤버 -> 외근 전혀 하지 않음 (나는 신규 프로젝트만 참여해서 지난 1년 동안 한번도 외근 없었음)
  - 상용 프로젝트 멤버 -> 1년에 5회 미만 정도로 외근

팀 워크샵 여부:
  - 팀 워크샵 자체를 진행하지 않음. (워크샵 참석하는 거 싫어하는 개발자 환영 ^^)

연락처:
  - "sejong.jeonjo@gmail.com"  # 궁금한 점은 이 연락처로 문의주세요.
  - 블로그 비밀 댓글 (제가 하루에 한번씩 댓글 확인하고 있음)

원하는 인재상:
  - 우리 부설연구소는 "긴 호흡으로 프로젝트를 진행"하기 때문에 최소 2년간 한 가지 주제를 꾸준하게 연구/개발할 수 있는 개발자를 원함.
  - 우리 부설연구소는 자주적으로 연구 주제를 찾아서 업무를 하기 때문에 능동적으로 생각하고 행동하는 동료를 원함.
  - 차분하게 연구 주제에 몰입하고, 해법을 찾는 것을 즐기는 사람.
내가 느끼는 우리 연구소의 장점:
  - 갑/을 관계가 없음. (제가 근무하고 있는 연구소는 SI업종이 아니라서 갑/을 회사 개념이 없음)
  - 연구소 자체적으로 연구 주제를 발굴하고 시스템을 개발하기 때문에 개발 일정에 대한 스트레스가 적음
  - 빌딩 전체를 우리 회사가 사용하므로 분위기가 산만하지 않음.
  - 근처에 예술의전당, 우면산 둘레길이 있어서 점심 시간에 산책하기 좋음 ^^
  - 연구소 동료들 매너가 Good (2년간 일하면서 한번도 감정에 스크레치 생기거나 얼굴 붉히며 싸운 적 없음 ^^)

 

+ Recent posts