알고리즘을 구현하기 위한 소스 코드의 소요 시간(실행에 필요한 시간)은 어떻게 측정할 수 있을까?

 

출처: chatgpt

 

 

실행을 시켜서 완료될 때 까지 걸린 시간을 측정하면 될까?

 

실행하는 컴퓨터의 CPU가 무엇인지, HDD 또는 SSD를 사용하는 지와 같은 여러 상황에 따라서

똑같은 알고리즘도 시간이 다르게 나올 수 있을텐데...

 

그리고 작성하는 프로그래밍 언어에 따라서도 실행 시간은 천차만별일 수 있다.

 

즉, 실제 시간을 측정해서 알고리즘의 성능을 비교 평가하는 것은 어렵다.

 

 

그래서, 보통은 Pseudo code의 라인별 수행하는 횟수를 카운트 하는 방식으로 소요 시간을 측정한다.

 

 

Insertion sort의 pseudo code는 다음과 같다.

 

insertion pseudo code

 

한 줄씩 살펴보자.

 

line #1

 

입력값 A의 길이가 n이라고 해보자.

보통의 프로그래밍 언어에서 배열은 0부터 시작하지만 pseudo code에서는 1부터 시작한다.

그러면 1번 라인은 총 몇 번 수행이 될까?!

 

지금 대답을 하지 못하는 분은 개발자로서 조금 문제가 있는 상태이고 (^^)

"n - 1"번이라고 대답하신 분은 보통의 개발자 수준이고

"n"번이라고 대답하신 분은 정말 훌륭한 개발자 이거나 아니면 운으로 맞춘 분일 것이다 ^^

 

"j = 2"라고 되어 있기에 for문 자체는 "n - 1"번 수행한다고 말하는 것이 일반적이지만

실제 for문 자체는 마지막 조건 체크를 위해 한 번 더 수행을 하기 때문에 "n - 1 + 1"번 수행을 하게 된다.

하지만, 그냥 "n - 1"번 수행한다고 해도 무방하지 싶다.

 

line #2 ~ #4

 

2번 ~ 4번 라인은 각각 "n - 1"번 수행한다.

 

line #5 ~ #7

 

5번 ~ 7번 라인이 핵심인데...

처음 "j = 2" 상황에서는 1번 위치에 있는 값하고만 비교하면 되기에 1번만 실행이 될 것이고,

그다음 "j = 3" 상황에서는 2번 위치하고 비교하고 그 다음 1번 위치하고 비교를 하게 된다.

그렇게 해서 "j = A.length" 상황에 되면, 즉 "j = n" 상황이 되면 "n - 1"번 비교를 하게 된다.

이걸 그림으로 표현해보면 아래와 같다.

 

while문 상황

 

그래서, while문이 있는 5번 라인은 "1 + 2 + 3 + ... + n"번 실행을 하게 되고 (값 비교를 위해 한 번 더)

6번, 7번 라인은 "1 + 2 + 3 + ... + (n -1)"번 실행을 하게 된다.

 

line #8

 

8번 라인은 당연히 "n - 1"번 수행한다.

 

 

잘 이해가 되시나요?!

여기에서 "예"라고 대답을 하신 분은 .... No! No!! No!!!

 

중간에서 끝

 

8번째 값을 정렬할 차례가 와서

첫번째로 7번 위치랑 비교 =  pass, 6번 위치 비교 = pass

5번 위치랑 비교했더니 여기에서 break

 

8번째 값을 정렬할 때에는 7번의 비교가 필요한 줄 알았는데,

실제 입력값 상황에 따라 수행 횟수가 가변적이다.

 

그래서 이를 t변수를 이용해서 표현한다고 하면, 전체적으로 다음과 같이 정리해볼 수 있다.

 

running time

 

C 변수는 각 라인을 실행할 때 드는 비용(시간)을 의미한다.

그래서 위 내용을 정리해서 총 실행 시간은 다음과 같이 정리할 수 있다.

 

The sum of product of cost and times of each line

 

여기에서 뭔가 답답하게 만드는 것이 t 변수 값인데,

best/average/worst case에 따라서 값이 달라질 수가 있다.

 

best / worst cases

 

위 그림에서 왼쪽이 best case이고, 오른쪽은 worst case이다.

다시 말해 이미 정렬이 되어 있는 경우는 best case이고, 역으로 정렬된 경우가 worst case이다.

 

best case에 대해서 정리해보면 다음과 같다.

 

best case

 

결론적으로는 an + b 형식의 식으로 나오고 이는 선형적인 모습을 보인다.

 

이번에는 worst case를 살펴보자.

 

worst case

 

정리된 식을 살펴보면,

worst case는 an^2 + bn + c 와 같은 2차 함수 형태로 나타난다.

 

 

best case는 입력값 n의 크기가 커짐에 따라 선형적으로 실행 시간이 증가하게 되고

worst case는 입력값 n의 크기가 커짐에 따라 제곱으로 증가하게 된다는 것을 알 수 있다.

 

 

그런데, 모든 알고리즘들에 대해서 이렇게 분석하는 것은 너무 어렵다.

이와 같은 과정을 뭔가 단순하면서 명확하게 표현하는 것에 대해서 알아보도록 하자.

지금 말고 다음에.... ^^

반응형

Youtube를 보다가 갑작스레 보게 된 재미난 영상 하나가 있었다.

 

출처: https://www.youtube.com/watch?v=y-xopqwEe3I&t=13s&ab_channel=GoogleforDevelopers

 

으잉?! IT 뉴스를 이런 감성으로 전달한다고!?

위 영상의 출처는 다음과 같다.

  - https://www.youtube.com/@GoogleDevelopers

 

출처: https://www.youtube.com/@GoogleDevelopers

 

여기에서 특히 재미있는 것은 "Google Developer News tl;dr"인데,

Web, Mobile, AI, Cloud 관련 소식들을 정말 깔끔하고 재미있게 소개해주고 있다.

 

지루하고 어렵지 않냐고!?

영상에서는 정말 간략하고 핵심적인 내용만 소개하고 자세한 소식은 각자 찾아볼 수 있도록 링크로 제공해준다.

 

출처: https://www.youtube.com/watch?v=coZ6VVJZ2R0&ab_channel=GoogleforDevelopers

 

구글 관련된 소식만 알려주는 것 아니냐고!?

뭐 맞는 말이긴 한데.... 개발자 세상에서 Google이 관여 안된 것을 찾는 것이 더 어렵지 않을까!?

출처: https://www.youtube.com/watch?v=coZ6VVJZ2R0&ab_channel=GoogleforDevelopers

 

TensorFlow도 Google 거다. (이거 모르는 사람 많지 않나!? 나만 몰랐나?! ^^)

Chrome에서 3rd-party Cookie 지원을 24년 1분기부터 순차적으로 종료할건데, 웹 개발하는 사람 모두 알아야 하지 않나!?

AWS를 더 많이 쓰긴 하지만, GCP 기반으로 개발하는 사람들도 많지 않나!?

 

뭐, 구글 소식만 알아도 훌륭한 개발자이지 않을까 한다 ^^

 

그러니, 구독과 좋아요~..... ^^

(Google에서 따로 후원 받지 않았습니다!!!! 아! 애드센스..... 받은건가?????)

 

영어가 부담스러우면 자동 번역하면 되니까 부담 없이 구독해서 정보를 얻으면 좋을 것 같다.

 

한글 좋아하는 저같은 개발자들을 위해 추가적으로 공유하자면

한국 개발자를 위한 블로그도 별도로 운영되고 있다. 최신 업데이트도 꾸준히 되고 있다.

  - https://developers-kr.googleblog.com/

 

출처: https://developers-kr.googleblog.com/

 

한국 개발자를 위한 페이스북도 운영하고 있다.

  - https://www.facebook.com/googlefordevskr/

 

출처: https://www.facebook.com/googlefordevskr/

 

한국 개발자들을 위한 공식 사이트는 다음과 같다.

  - https://sites.google.com/view/gdeveloperskorea/홈

 

출처: https://sites.google.com/view/gdeveloperskorea/홈

 

국내에서는 공식적으로 14개 GDG(Google Developer Groups)가 굴러가고 있는데,

최근에는 GDG SongDo가 이벤트도 많이 하면서 활발한 것 같다.

 

Google for Developers Korea의 공식 유튜브 채널도 있긴한데, 최근 업데이트는 잘 안되고 있다.

  - https://www.youtube.com/channel/UCZU3wmgRuH9gc2E3jhvEE_g

 

출처: https://www.youtube.com/channel/UCZU3wmgRuH9gc2E3jhvEE_g

 

이 글을 포스팅하는 시점에서 유용한 정보 하나 더!

Devfest Cloud 2023이 23년 12월 9일에 있다.

  - https://festa.io/events/4385?fbclid=IwAR12BFTRSFTI9LUbLd8eclbtvm_jIAJ82reVs-8mbECKtWTdzbeuKRoVtnw

 

출처: https://festa.io/

 

개발자 여러분들에게 조금이나마 도움이 되기를 기원해보며 포스팅합니다!!!

반응형

이제와서 왠 알고리즘 !? ^^

나름의 이유로 알고리즘을 차분히 조금은 깊게 살펴볼 이유가 있어서 정리를 해보고자 한다.

 

우선 알고리즘에서 가장 대표적인 문제 유형은 바로 정렬(sort)이다.

크기가 다른 여러 개의 입력값이 있을 때, 이를 크기 순서대로 줄을 세워야 하는 문제이다.

 

<made by ChatGPT>

 

정렬 문제(Sorting Problem)를 해결할 수 있는 알고리즘(Algorithm)은 상당히 다양한데,

그 중에서 가장 첫번째로 언급되는 것이 바로 '삽입 정렬(Insertion Sort)'이다.

 

삽입 정렬을 한 번에 확인하기 위한 가장 좋은 예시는

위키피디아에서 보여주는 에니메이션이다.

<출처: https://en.wikipedia.org/wiki/Insertion_sort>

 

찬찬히 잘 살펴보면 어떻게 하겠다라는 것인지 충분히 이해할 수 있겠지만

그래도 좀 더 설명을 해보자면 다음과 같다.

 

<출처: https://www.whatwant.com>

 

6번째까지 정렬이 된 상태에서 (1, 3, 5, 6, 7, 8), 7번째 '2' 순서가 되었을 때를 설명해보려고 한다.

일단, 자기 자신의 앞에 있는 '8'과 비교했더니 나(2)보다 큰 값이기에 '8'을 한 칸 앞으로 옮긴다.

그 다음에는 하나 더 앞에 있는 '7'과 비교를 하고 옮기고 ... 그렇게 진행하다가

'1'을 만나게 되는데, 이번에는 '2'보다 작은 값이기에 자기 자신(2)이 '1' 뒤에 위치하면 된다.

 

'Pseudo Code'는 다음과 같다.

 
 for j = 2 to A.length
     key = A[j]
     i = j - 1
     while i > 0 and A[i] > key
         A[i+1] = A[i]
         i = i - 1
     A[i+1] = key
 

 

2번째 입력값부터 시작해서 마지막 입력까지 수행을 해야 하는 것이고

기준이 되는 값을 일단 'key'에 저장해놓고,

key랑 비교를 시작할 위치는 key보다 하나 앞선 값이다.

이제 앞에 있는 값들과 비교를 해보고 비교한 값이 크면 비교한 값을 뒤로 한 칸 옮기고

같거나 작으면 비교를 멈추고 거기에 key값을 넣어주면 된다.

 

Python으로 작성해본 코드는 다음과 같다.

Pseudo code와 거의 동일하다.

 
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
 
    return arr

numbers = [6, 5, 3, 1, 8, 7, 2, 4]
sorted_numbers = insertion_sort(numbers)
print(sorted_numbers)
 

 

뭐 당연히 결과는 잘 나온다.

 

 

자~ 이제 시작이다.

살펴봐야할 많은 것들이 있다.

 

과연 이 알고리즘은 얼마의 시간이 걸릴 것이며, 얼마의 메모리가 필요하고,

Best Case일 때와 Worst Case일 때 어떻게 되는지를 살펴봐야 한다.

거기에다가 하나 더 알아봐야 할 것은 입력값들의 순서가 유지되는지에 대해서도 알아봐야 한다.

 

하지만, 벌써부터 지칠 수 있으니

다음 기회로.... ^^ (절대 귀찮아서 미루는 것이 아니다! 절대로! 절대로?)

 

반응형

얼마전 회사에서 일을 하다가 우연히(?) 사용하게 된 "Base64"에 대해서 알아보고자 한다.

 

처음에는 암호화(encryption)를 한다고 생각했었다가 엄청 큰일 날뻔해서

더더욱 그 정체에 대해서 명확하게 파악해야겠다고 생각했었는데... 게으름에 이제서야 정리해본다.

 

 

▶ RFC 4648

base64는 base16, base32와 함께 2006년도에 'RFC 4648'에서 정의가 되어 있다.

https://datatracker.ietf.org/doc/html/rfc4648

RFC 4648

 

- RFC (Request for Comments)

   : 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등에 대한 문서

 

▶ base64

base16, base32도 있지만 여기에서는 base64에 대해서만 살펴보겠다.

그러면, base64에서 64는 무엇을 의미할까!?

 

하나의 코드로 encoding할 수 있는 문자가 64개라는 의미이다.

64 = 2^6 이므로 base64의 하나의 코드는 6비트의 데이터를 표현할 수 있는 것이다. (64진수로 생각하면 된다)

 

그러면 base64의 하나의 코드는 64종류를 어떤 기호로 구분할까!?

 

일단 base64는 ASCII 텍스트로 표현하는데, 아래와 같이 총 64종의 문자를 사용한다.

 - 문자 A-Z    = 26

 - 문자 a-z     = 26

 - 숫자 0-9     = 10

 - 기호 '+', '/'   = 2

 

▶ Sample

실제로 어떻게 되는지 돌려볼까!?

우리의 친구 python으로 한 번 해보자!

python

 

string(text)을 binary 형태로 변경 후 base64 encoding 하고,

base64 encoding 된 결과물이 binary 형태이므로 print하기 위해서 string 형태로 변환해서 출력한다.

 

binary 형태인 base64 encoding 된 결과물을 가지고 base64 decoding을 하고,

마찬가지로 print하기 위해 string 형태로 변환해서 출력한다.

 

실행결과는 다음과 같다.

result

 

▶ base64 encoding

base64 encoding 과정을 수작업으로 훑어보자.

일단 몇 가지 문자에 대해 ascii code 값을 알아보자.

 

symbol DEC HEX BIN
w 119 77 0111 0111
h 104 68 0110 1000
a 97 61 0110 0001
t 116 74 0111 0100

 

그러면 다음과 같이 나열이 된다.

 

w             h               a               t

01110111 01101000 01100001 01110100

 

base64이므로 6bit 단위로 그룹핑 하고, 이것을 다시 십진수로 변경하면 다음과 같다.

 

011101     110110    100001    100001    011101    00

29             54           33            33            29

 

이 값을 변환할 기준은 RFC 4648 문서에 있는 table을 참고해서 변환하면 된다.

The Base 64 Alphabet

 

그러면 다음과 같다.

 

29   54   33   33   29

d     2     h     h     d

 

Python으로 작업한 결과와 동일하게 나오는 것을 확인할 수 있다.

 

여기에서도 뒤에 6개로 떨어지지 않는 부분이 있는 것을 알 수 있는데,

이것은 padding 처리해서 '='로 표기하게 된다.

 

(그러면 실제로는 65개 문자를 사용하니 Base65라고 해야하는 것 아닌가?! ^^)

 

▶ Usage

서두에서도 말을 했지만 Base64를 encryption 용도로 착각하기 쉽다.

하지만, encoding 과정을 잘 살펴보면 느꼈을 수도 있을텐데

Base64의 주요 용도는 binary 형태의 파일을 text 형태로 표현하는데에 있다.

 

즉, HTML 페이지를 구성할 때 jpg와 같은 그림 파일을 링크 형태가 아니라

HTML 파일 안에 text 형태로 저장할 수도 있게 되는 것이다.

 

그리고, 자주 봤을 아주 유용한 사례를 보자면, URL에 데이터를 포함해서 던질 때이다.

 

- https://app.whatwant.com/push?data=xxxxxxx 

 

위와 같이 URL 형식으로 binay 파일 내용을 전달하고 싶은 경우

Base64 encoding을 통해 가능해진다 !!!

 

▶ Base64URL

여기에서 여러분은 질문을 해야 한다 !!!

 

Base64 encoding 결과물을 URL에 정말 사용해도 되나요?

특수문자 '+', '/'를 사용하는데, 문제가 없나요?

 

그렇다!!!

 

URL에서 '+'는 공백을 위해 사용되고, '/'는 폴더 구분 용도로 사용된다.

 

그래서 그 2개의 특수문자를 변경한 Base64URL encoding이 따로 있다.

- '+' → '-'

- '/' → '_'

 

나머지는 똑같다.

 

 

여기까지~~~~~!!!

 

반응형

받아보는 메일링 리스트를 통해 알게된 재미있는 Framework가 있어서 한 번 다뤄보려 한다.

https://oneoneone.kr/content/d9b579e3

 

나온지 꽤 된 것임에도 잘 몰랐는데,

'노마드 코더'의 극찬 영상으로 인해 호기심을 확 끌었다.

https://www.youtube.com/watch?v=DlyoFFOcPCg

 

 

이 framework의 분류를 정확히 뭐라해야할지 애매한데, 구글링을 통해 확인한 여러 별칭은 다음과 같다.

  - CMS

  - App Framework

  - App Backend

  - Backend Framework

  - Admin Panel

  - Library

 

음... 아직 명확한 naming은 안되어있는 분류인 것이다.

하지만, 뭘 말하고자 하는 것인지는 왠지 알 수 있을 것만 같은 느낌적인 느낌!?

 

 

일단, 이번에 다뤄보고자 하는 것은 "Keystone JS"라는 아이이다.

https://keystonejs.com/

 

재빨리 설치하고 웹을 띄워보자!!!

 

 

[ Environment ]

일단 개발 환경은 다음과 같다.

- 운영 체제: Ubuntu 20.04 LTS

 

❯ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal

 

 

[ Node ]

이 아이도 Node.JS 기반이고 npm을 이용하기 때문에 node부터 설치를 해야 한다.

 

버전 호환성으로 인한 어려움이 종종 발생하기 때문에

우리는 node의 다양한 버전을 다룰 수 있는 방법이 필요하다!

 

그래서, 나의 선택은 nvm !!!

아래 링크를 통해 nvm, node, npm 설치를 하자 !!!

- https://www.whatwant.com/entry/npm

 

❯ git clone https://github.com/nvm-sh/nvm.git ~/.nvm
'/home/chani22/.nvm'에 복제합니다...
remote: Enumerating objects: 9051, done.
remote: Counting objects: 100% (1830/1830), done.
remote: Compressing objects: 100% (111/111), done.
remote: Total 9051 (delta 1764), reused 1730 (delta 1719), pack-reused 7221
오브젝트를 받는 중: 100% (9051/9051), 3.28 MiB | 10.09 MiB/s, 완료.
델타를 알아내는 중: 100% (5790/5790), 완료.


❯ cd ~/.nvm


❯ git tag


❯ git switch -c v0.39.3 tags/v0.39.3
새로 만든 'v0.39.3' 브랜치로 전환합니다
 3.8.16  chani22@chani22-VBox  ~/.nvm   v0.39.3


❯ nano ~/.zshrc

 

...
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

 

- shell 재접속 후

 

❯ nvm --version
0.39.3


❯ nvm install node
Downloading and installing node v20.4.0...
Downloading https://nodejs.org/dist/v20.4.0/node-v20.4.0-linux-x64.tar.xz...
######################################################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v20.4.0 (npm v9.7.2)
Creating default alias: default -> node (-> v20.4.0)


❯ node --version  
v20.4.0


❯ npm --version 
9.7.2

 

 

[ Keystone JS ]

npm을 이용해서 keystone-app을 생성할 수 있다.

나의 app 이름을 지어주면 기본적인 boilerplate를 생성해준다.

 

❯ mkdir keystone


❯ cd keystone


❯ npm init keystone-app@latest
Need to install the following packages:
  create-keystone-app@9.0.1
Ok to proceed? (y) 

✨ You're about to generate a project using Keystone 6 packages.

✔ What directory should create-keystone-app generate your app into? · my-app

⠋ Installing dependencies with yarn. This may take a few minutes.
⚠ Failed to install with yarn.
✔ Installed dependencies with npm.


🎉  Keystone created a starter project in: my-app

  To launch your app, run:

  - cd my-app
  - npm run dev

  Next steps:

  - Read my-app/README.md for additional getting started details.
  - Edit my-app/keystone.ts to customize your app.
  - Open the Admin UI
  - Open the Graphql API
  - Read the docs
  - Star Keystone on GitHub


❯ cd my-app/


❯ ls -al
합계 484
drwxrwxr-x   4 chani22 chani22   4096  7월 12 16:28 .
drwxrwxr-x   3 chani22 chani22   4096  7월 12 16:26 ..
-rw-rw-r--   1 chani22 chani22     46  7월 12 16:26 .gitignore
drwxr-xr-x   2 chani22 chani22   4096  7월 12 16:28 .keystone
-rw-rw-r--   1 chani22 chani22   2874  7월 12 16:26 README.md
-rw-rw-r--   1 chani22 chani22   2710  7월 12 16:26 auth.ts
-rw-rw-r--   1 chani22 chani22   1014  7월 12 16:26 keystone.ts
drwxrwxr-x 570 chani22 chani22  20480  7월 12 16:28 node_modules
-rw-rw-r--   1 chani22 chani22 410056  7월 12 16:28 package-lock.json
-rw-rw-r--   1 chani22 chani22    397  7월 12 16:26 package.json
-rw-rw-r--   1 chani22 chani22   9506  7월 12 16:26 schema.graphql
-rw-rw-r--   1 chani22 chani22   1056  7월 12 16:26 schema.prisma
-rw-rw-r--   1 chani22 chani22   5178  7월 12 16:26 schema.ts
-rw-rw-r--   1 chani22 chani22    195  7월 12 16:26 tsconfig.json
 3.8.16  chani22@chani22-VBox  /srv/workspace/ks/my-app


❯ nano keystone.ts


❯ npm run dev

> keystone-app@1.0.2 dev
> keystone dev

✨ Starting Keystone
⭐️ Server listening on :3000 (http://localhost:3000/)
⭐️ GraphQL API available at /api/graphql
✨ Generating GraphQL and Prisma schemas
✨ sqlite database "keystone.db" created at file:./keystone.db
✨ Your database is now in sync with your schema
✨ Connecting to the database
✨ Creating server
✅ GraphQL API ready
✨ Generating Admin UI code
✨ Preparing Admin UI app
- warn You have enabled experimental feature (appDir) in next.config.js.
- warn Experimental features are not covered by semver, and may cause unexpected or broken application behavior. Use at your own risk.

- event compiled client and server successfully in 195 ms (18 modules)
✅ Admin UI ready
- wait compiling /_error (client and server)...
- event compiled client and server successfully in 6.5s (1706 modules)

 

'npm run dev'를 하면 웹앱을 띄워준다.

크롬으로 접속하면 된다.

http://localhost:3000/

 

첫 사용자를 생성해야 한다.

귀찮지만 8자 이상의 패스워드를 넣어줘야 한다.

Create user

 

예쁜 화면을 볼 수 있다.

Dashboard

 

User List를 확인해보면 다음과 같은 화면을 볼 수 있다.

Users

 

상세 정보도 확인할 수 있다.

User detail

 

Posts 화면을 살펴보자.

Posts

 

Create Post 버튼을 누르면 멋진 화면이 나온다.

Create Post

 

입력 인터페이스가 정말 산뜻하다. (직접 구현하려면 엄청 귀찮았을....)

Edit

 

 

[ GraphQL ]

API를 확인하기 위해서는 주소가 다르다.

 

http://localhost:3000/api/graphql

 

멋지지 않은가?!

 

 

하지만, 주의 사항은 있다.

관련된 공부를 하지 않고서는 이 편리함을 누릴 수 없다.

 

귀차니즘의 해결이지, No Study & Easy Use는 아니다 !!!

 

 

반응형

'Programming > Web' 카테고리의 다른 글

Vite로 React 앱 만들기  (0) 2024.11.07
npm, node 그리고 nvm  (0) 2023.01.04

나름의 이유로 시스템에서 메일을 보내야할 일이 있는데,

이왕이면 Gmail을 이용해보고 싶어서 살펴보기로 했다.

 

일단 Gmail을 통해 이메일을 보내기 위해서

미리 셋팅을 해줘야 할 것이 있다.

 

 

Gmail의 설정 화면으로 이동한 뒤에

 

 

IMAP 사용 설정을 해주면 된다.

 

 

그런데, Python 코드에서 Gmail 인증 부분을 구현해야 이메일 발송을 할 수 있을텐데,

2가지 방법 중 하나를 선택해야 한다.

 

1. 로그인 PASSWORD
2. 앱 PASSWORD

 

로그인 PASSWORD를 사용하기에는 왠지 찝찝한 느낌이 들기에

앱 PASSWORD를 사용하도록 해보겠다. (보안은 중요하다!!! ^^)

 

 

Google 계정 관리 화면에 일단 들어가보자.

 

 

어?! 그런데, 찾고자 하는 "앱 비밀번호" 부분이 안보인다.

 

 

2단계 인증을 사용한다고 해야 원하는 항목이 등장한다.

2단계 인증을 사용하게 되면 조금 불편할 수도 있지만, 보안을 위한 일이니 감수하자!!! ^____^

 

 

전화 및 인증 기기 등을 잘 확인하면서 진행하면 되는데,

 

 

개인적으로 OTP 앱까지 추가해주는 것을 추천한다.

 

자~ 이제, "앱 비밀번호" 항목을 볼 수 있다.

 

 

우리 입맛에 맞게 생성 진행하면 된다.

 

 

그러면 16 digit을 만들어 준다.

 

 

저 비밀번호는 다시 안알려준다. 미리 잘 기억/기록 해야 한다.

 

 

자~ 이제 Gmail에서 준비할 것은 모두 끝났다.

이제 Python 코딩을 시작해보자.

 

 
  #!/usr/bin/env python3
  """
  Send email via Gmail SMTP
  """

  __author__ = "whatwant"
  __version__ = "0.1.0"
  __license__ = "BEER-WARE"

  import smtplib
  from email.mime.text import MIMEText
  from email.mime.multipart import MIMEMultipart

  def send_email(sender_email, receiver_email, app_password, subject, text, html):
      message = MIMEMultipart("alternative")
      message["Subject"] = subject
      message["From"] = sender_email
      message["To"] = receiver_email

      part1 = MIMEText(text, "plain")
      part2 = MIMEText(html, "html")

      message.attach(part1)
      message.attach(part2)

      with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
          server.login(sender_email, app_password)
          server.sendmail(sender_email, receiver_email, message.as_string())

  if __name__ == "__main__":
      sender_email = "whatwant@whatwant.com"
      receiver_email = "whatwant@gmail.com"
      app_password = "xxx"
 
      subject = "This is a lucky email from Python"
      text = "whatwant is a good man."
      html = f"<html><body><p>{text}</p></body></html>"
 
      send_email(sender_email, receiver_email, app_password, subject, text, html)

 

여전히 예쁘지 않은 코드이지만, 그래도 동작한다!

실행하면 된다.

 

 

메일이 잘 도착했다!!!

 

첨부파일까지 보내는 것까지 하려고 했는데, 지금 당장은 필요하지 않기에...^^

나중에 필요로 할 때 해보겠다! ^^

 

반응형

업무를 하면서 간단한 Python 코드를 작성하고

코드 리뷰를 받을 때면 종종 왠지 모르게 부끄러움을 느낄 때가 있다.

 

남들이 작성한 코드를 보면 왠지 멋져보이는데

내 코드는 왠지 모르게 초라해보이는 자격지심이..... ^^

 

예를 들어서 "현재 디렉토리의 파일 이름과 사이즈를 출력"해주는 프로그램을 작성해보자.

 

 

실행 결과도 잘 나온다.

 

 

원하는 결과를 잘 뽑아내고,

나름 함수로 잘 구분해서 잘 작성한 것 같은데..... 왠지 뭔가 부족한 듯 한 느낌이...

 

속된 말로 뭔가 "와꾸"가 있었으면 좋겠는데...

 

 

https://www.python-boilerplate.com/

 

이런 고마운 사이트가 있다니!!!

 

Parameter들을 사용하고 싶거나, Logging을 하고 싶거나 하면 "Options"에서 고르면 된다.

Unit-Test를 하고 싶은 경우에 입맛에 맞는 프레임워크를 고를 수도 있다.

 

이걸 이용해서 코드를 다시 작성해보면 다음과 같다.

 

 

뭔가 조금 더 있어보이게 된 것 같은 느낌적인 느낌이다.

 

 

별 것 아니게 느낄 수도 있겠지만,

Python과 같은 자유도가 과도하게 높은 언어로 개발을 할 때에는

이런 boilerplate 코드를 이용하는 것이 많은 도움이 된다고 생각한다!

여러분은?

 

반응형

구글에서 "chatgpt"를 검색하고 뉴스 항목을 선택하면 아래와 같은 뉴스가 보인다. (2023-04-30)

  - https://www.google.com/search?q=chatgpt&tbm=nws 

 

 

많은 사람들, 특히 기업 입장에서는 기업 내부의 비밀들이 유출될 우려가 있기에 머리가 아플 것이다.

 

심지어 이탈리아에서는 국가차원에서 chatgpt를 차단하기도 했었다. 물론 지난 금요일(04/28)에 차단을 해지하기는 했지만 개인정보 유출이라던지 기밀사항에 대한 유출 우려에 대해서 모두들 심각하게 받아들이고 있음을 엿볼 수 있다.

 

그래서 openai에서 사용자들의 이력 사항들을 학습에 사용하지 않도록 할 수 있는 옵션을 추가해줬다.

 

 

옵션을 해제하면 이력을 관리하지 않는다고는 하는데.... 믿어야겠죠!? ^^

 

 

뭐 이런 심각한 이야기는 잠시 미뤄두고... ^^

 

 

youtube에서 "chatgpt 개발"이라는 키워드로 검색해보면 많은 동영상들을 볼 수 있다.

 

 

구글에 "chatgpt debugging", "Unit Test Generation with ChatGPT" 등의 키워드로 검색해보면

정말 유용하고 신기한 많은 사례들을 찾아볼 수 있다.

 

그리고 아래와 같이 kubeflow를 어떻게 설치해야하는지 등과 같은 질문에도 나름 대답을 하기도 하고,

 

 

카카오톡 메시지를 보내는 파이썬 코드를 보여달라고하면 아래와 같이 샘플 코드를 보여주기도 한다.

 

 

개발할 때 chatgpt를 이용하면 분명 많은 도움이 될 것 같다.

물론 GitHub Copilot보다 더 유용할지에 대해서는 여러 의견이 있을 수 있지만

사용하기에 따라서 다른 의미로 chatgpt가 유용할 수 있음은 분명한 사실일 것이다.

 

 

여기에서 다시 한 번 생각해보자.

회사와 같은 곳에서 chatgpt를 이용해서 개발을 하는 것에 문제가 될까? 안될까?

 

질문(chatgpt 세상에서는 prompt라고 불리우는!?)에 너무 많은 내부 정보를 담는 것은 무조건 문제가 될 것이다.

그러면, 질문을 할 때 보내는 정보만 조심하면 문제가 안될까!?

 

내가 생각해보았을 때 2가지 정도가 더 문제가 될 수 있다고 본다.

 

① 검색 결과 품질

② 검색 결과 출처

 

 

"chatgpt"는 질문에 대해서 나름의 대답을 한가지 해준다.

그것이 원하는 결과가 아니라고 하면 추가 질문을 통해서 다른 대답을 받아볼 수는 있지만

기본적으로 기존 검색엔진과 같이 여러가지를 보여주는 방식은 아니다.

 

그리고,

해당 결과의 출처가 무엇인지를 알 수 없기에 가져다 써도 무방한 것인지

혹시 compliance 이슈가 있을 수 있는 것인지도 확인이 어렵다.

 

더더욱 문제가 되는 것은

GPT3 및 GPT4 모두 데이터가 2021년 8월까지의 데이터로 학습되어있기에 최신 정보에 약하다.

물론 검색 결과를 다시 입력으로 넣는 등의 방법으로 우회할 수 있다고는 하지만

이는 변칙적인 우회 방법이지 제대로 된 chatgpt의 사용 방법은 아니다.

 

 

 

이런 부분들을 조금은 해소해 줄 수 있는, 개발자들을 위한 AI 검색엔진이 등장했다.

  - https://www.phind.com/

 

 

하단에 있는 문구가 아주 재미있다.

 

Made with ❤️ in San Francisco.

 

미국의 이런 문화가 좀 신기해보이면서도 재미있게 느껴지고, 왠지 멋져보이기까지 한다.

음... 나는 "Made with ❤️ in Dong Tan" 이렇게 해볼까!? ^^

 

검색 결과는 어떻게 나오는지 살펴볼까!?

 

 

chatgpt 화면과 비슷하면서도 좀 다르다.

가운데에 나름의 답변을 해주면서, 그 대답을 만들기 위한 출처 목록을 오른쪽에 보여주고 있다.

 

chatgpt 처럼 Session 개념이 있기에 추가적인 검색을 같은 맥락으로 이어가며 할 수 있다.

또한 현재 검색 결과를 반영하기 때문에 최신 정보들도 잘 가지고 온다.

 

왼쪽 하단에 있는 "Customize search" 버튼을 눌러보자.

 

 

내가 특정 개발 사이트를 좀 더 선호한다던지, 아니면 특정 사이트 결과를 좀 후순위로 하고 싶다던지 하면

그러한 옵션들을 반영할 수 있다.

 

 

전문가(Expert) 모드도 있고, 좀 더 간략히 본다거나, 좀 더 창의적인 결과를 나오게 할 수도 있다.

그냥 구글 검색하는 것 보다는 좀 더 효율적으로 활용할 수 있는 검색엔진이 아닐까 한다.

 

 

하지만, phind도 정보 유출 등의 우려에서 자유롭지는 않다.

 

 

anonymously 하게 저장되고, 3rd party에 정보를 공유하지 않는다고 하지만

여하튼 내가 입력한 질문을 가지고 자신들의 서비스를 향상시키는데 사용한단다.

 

 

그렇다면,

chatgpt를 대체하는 용도로서 사용하기 보다는 그냥 google을 사용하는 것을 대체하는 용도라고 생각해야 한다.

 

 

설마 회사에서 google까지 막지는 않을테니 ^^

google 대신 사용하는 개발자를 위한 검색엔진으로 phind를 사용해보자.

반응형

+ Recent posts