Git 저장소를 오래 운영하다보니

호스팅하고 있는 서버의 스토리지가 부족한 일이 종종 발생한다. (Gerrit 또는 GitHub Enterprise)


(대체 왜 자꾸 바이너리를 올리는 것인지... 우이쒸~!!)



스토리지를 팍팍 늘리면 좋겠지만... 우리는 가난하기에.. ^^



이럴 때 보통 "git gc"를 실행하곤 하는데...

이게 성능/효과가 얼마나 있는지 실험을 해보고 싶었다!!!



0. target


    - 실험할 repo가 필요해서 찾던 中 최근 유명한 tensorflow를 대상으로 정했다.


$ git clone --bare https://github.com/tensorflow/tensorflow.git


    - 저장공간을 줄이는 것에 대한 실험이니만큼 "--bare" 옵션으로 clone 하였다.


$ du -hs ./

455M    ./


    - 기본 저장 공간은 "455M"




1. [ git gc --aggressive ]


    - 가장 기본적으로 사용하는 옵션으로 해봤다. (오래걸렸다)


$ time git gc --aggressive

Counting objects: 769698, done.

Compressing objects: 100% (760700/760700), done.

Writing objects: 100% (769698/769698), done.

Total 769698 (delta 636704), reused 111483 (delta 0)

Checking connectivity: 769698, done.


real    41m45.048s

user    28m54.865s

sys     0m3.769s


$ du -hs ./

243M    ./







2. [ git gc --aggressive --prune=now ]


    - 구글링을 했더니, 안전하게 그리고 확실하게 gc를 하는 방법이라고 되어있는 2단계 실행법이다.

        . reflog는 "git rebase" 같은 작업을 하다가 발생하는 끈 떨어진(?) log들에 대한 정보이다.


$ git reflog expire --expire=now --all


$ time git gc --aggressive --prune=now

Counting objects: 769698, done.

Compressing objects: 100% (760700/760700), done.

Writing objects: 100% (769698/769698), done.

Total 769698 (delta 636704), reused 111483 (delta 0)

Checking connectivity: 769698, done.


real    41m17.315s

user    28m51.873s

sys     0m3.522s


$ du -hs ./

243M    ./






뭐 결론은 2번 방법으로 실행하면 되겠다~!!!

안전한게 짱이지~!!


조금은 실망~


반응형



최근 회사에서 Credential 내역이 노출되어 보안 위협이 된 사례가 발생을 하였다.


즉, 아이디/패스워드, AWS 토큰 값들을 소스파일 안에 적어놓고

그것을 그대로 commit 하여 push 까지 해버린 것이다.



그래서, 소스코드에 이러한 Credential 정보가 들어있는지 점검하는 것을 강화하였다.

자동으로 분석하도록 한 것이다.



문제는 이러한 Credential 정보가 들어있는 파일을 발견했을 때

개발자들이 어떻게 조치를 취해야하는지에 대한 가이드가 부재하고 있다는...





1. 기본 배경


    - 개발자들이 특정 API 사용을 위한 인증 정보를 파일에 적어놓고 무심코 commit을 했을 경우를 전제 해보자

    - 즉, 아래 그림과 같이 "commit D"에 token 값이 있다는 것을 발견한 것이다!!!



2. 최악의 해결 방법


    - Credential 정보가 발견되었다는 경고를 받은 개발자는 당황한 나머지 아래와 같이 작업을 할 수 있다.


    - 설마! 라고 하지만 정말로 저렇게 할 수 있다 !!!

    - 위와 같이 하면 "commit E"에서는 Credential 정보가 안보이지만, "commit D"로 checkout을 하면 볼 수 있게 되기에 해결책이 아니다 !!!!!




3. 기본적인 해결 방법


    - 실습을 위해 아래와 같이 실제 commit들을 만들어보았다.



    - 마지막 commit인 "2651682"에서 Credential 정보가 발견되었을 경우에 대한 대처법을 알아보자.


$ git clone git@github.com:whatwant/whatwant.git

Cloning into 'whatwant'...

remote: Enumerating objects: 8, done.

remote: Counting objects: 100% (8/8), done.

remote: Compressing objects: 100% (4/4), done.

Receiving objects: 100% (11/11), done.

Resolving deltas: 100% (2/2), done.

remote: Total 11 (delta 2), reused 8 (delta 2), pack-reused 3



$ cd whatwant/



$ git log --oneline

2651682 (HEAD -> master, origin/master, origin/HEAD) write token in no002.txt

a2004f0 add no002.txt

93afc28 add no001.txt

2b73c6e Initial commit



$ git reset --hard HEAD^

HEAD is now at a2004f0 add no002.txt



$ git log --oneline

a2004f0 (HEAD -> master) add no002.txt

93afc28 add no001.txt

2b73c6e Initial commit



$ git push origin master

To github.com:whatwant/whatwant.git

 ! [rejected]        master -> master (non-fast-forward)

error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'

hint: Updates were rejected because the tip of your current branch is behind

hint: its remote counterpart. Integrate the remote changes (e.g.

hint: 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.



$ git push -f origin master

Total 0 (delta 0), reused 0 (delta 0)

To github.com:whatwant/whatwant.git

 + 2651682...a2004f0 master -> master (forced update)


    - 위와 같이 진행하고 commit 현황을 보면 "2651682" commit이 사라진 것을 볼 수 있다.



    - 아래 그림과 같이 표현할 수 있을 것이다



    - "git reset"은 매우 위험한 명령이기에 그냥 push를 하고자 하면 reject을 당한다! 그래서 "-f" 옵션을 통해 force 실행해야 한다!!!



4. 특정 파일의 이력을 모두 삭제하는 방법


    - 이번 포스팅을 하게 된 이유이다 !!!



    - 위와 같이 commit들이 있다고 해보자. 그림으로 표현하면 아래와 같다.



    - 즉, 예전에 이미 Credential 정보를 넣었는데... 불행하게도 뒤늦게 (이미 commit들이 쌓이고 난 뒤에) Credential 정보를 발견하게 된것이다.

    - 문제가 된 파일과 관련된 모든 이력을 지워보자.


$ git clone git@github.com:whatwant/whatwant.git

Cloning into 'whatwant'...

remote: Enumerating objects: 9, done.

remote: Counting objects: 100% (9/9), done.

remote: Compressing objects: 100% (7/7), done.

Receiving objects: 100% (13/13), done.

Resolving deltas: 100% (3/3), done.

remote: Total 13 (delta 3), reused 7 (delta 1), pack-reused 4



$ cd whatwant/



$ git log --oneline

d81bb67 (HEAD -> master, origin/master, origin/HEAD) add no003.txt

df3c9e0 write token in no002.txt

ea11c2d add no002.txt

83bc6a8 add no001.txt

2b73c6e Initial commit


$ git filter-branch --tree-filter "rm -f no002.txt" HEAD

Rewrite d81bb67affec459cd3e25fa57b98cf64a1bf05be (3/5) (1 seconds passed, remaining 0 predicted)

Ref 'refs/heads/master' was rewritten



$ ls -al

total 9

drwxr-xr-x 1 chani 197121  0 11월  9 20:41 ./

drwxr-xr-x 1 chani 197121  0 11월  9 20:40 ../

drwxr-xr-x 1 chani 197121  0 11월  9 20:41 .git/

-rw-r--r-- 1 chani 197121  0 11월  9 20:40 no001.txt

-rw-r--r-- 1 chani 197121  0 11월  9 20:40 no003.txt

-rw-r--r-- 1 chani 197121 10 11월  9 20:40 README.md



$ git log --oneline

69c84e3 (HEAD -> master) add no003.txt

94413d9 write token in no002.txt

1a2d568 add no002.txt

83bc6a8 add no001.txt

2b73c6e Initial commit



$ git push origin master

To github.com:whatwant/whatwant.git

 ! [rejected]        master -> master (non-fast-forward)

error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'

hint: Updates were rejected because the tip of your current branch is behind

hint: its remote counterpart. Integrate the remote changes (e.g.

hint: 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.



$ git push -f origin master

Counting objects: 4, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (4/4), done.

Writing objects: 100% (4/4), 515 bytes | 515.00 KiB/s, done.

Total 4 (delta 1), reused 0 (delta 0)

remote: Resolving deltas: 100% (1/1), done.

To github.com:whatwant/whatwant.git

 + d81bb67...69c84e3 master -> master (forced update)


    - 실제 commit이 어떻게 되어있는지 확인해 보자.



    - 무엇이 바뀌었는지 그림으로 확인해 보자.



    - 위의 방법은 문제가 발생한 파일과 관련한 내용을 전체 히스토리에서 삭제를 하는 것이다.

      → 그렇기 때문에, 영향을 받은 commit을 보면 앞의 commit 까지 포함이 된다.





※ 주의사항


    - 문제가 발생한 정확한 위치를 찾기가 어렵기 때문에 문제가 발생한 파일을 전체 history에서 삭제를 해버리는 방식이다.

      → 해당 파일에 Credential 정보 외의 내역도 있고 이에 대한 내용도 중요하다고 하면 문제가 있을 수 있는 방법이라는 말이다.


    - 그리고, 기존 commit ID 값도 변경이 된다.

      → commit ID 이력을 관리하고 있는 상황인 경우 문제가 있을 수 있다는 말이다.




이러한 번거로움을 피하기 위해서는 애초에 Credential 정보를 파일안에 기재하는 일이 없어야 하겠다.



반응형


얼마전 할아버지 맥북-프로 중고를 구매했다.


내가 원하는 개발환경 구축에는 실패했지만,

이 할아버지를 현역으로 연명시켜주고 싶었다.


그러던 중 최근에 macOS 카탈리나 버전이 나왔다는 소식을 접하게 되었는데,

당연하게도 우리 할아버지 mid 2010 맥북프로는 지원을 하지 않았다.


그러던 중...

이러한 할아버지들을 위한 Patcher가 있다는 이야기를 듣게 되었다.


빙고!!!


필자의 맥북은... Mid 2010 맥북프로 이다.


0. USB 메모리 준비

    - Catalina 설치용 USB를 만들어야 하기에 메모리가 필요하다!!!


1. Patcher 다운로드

    - 우리 할아버지에서 아래 사이트를 통해 patcher 이미지를 다운로드 받자.

        . http://dosdude1.com/catalina/



2. Patcher 실행하기 #1

    - 다운로드 받은 Patcher를 실행하자


    - 권한이 필요할 수도 있다

3. Patcher 실행하기 #2

    - 이제 순탄히 진행하면 된다

    - 설치 이미지를 만들기 위해 Catalina 파일이 필요한데... 가지고 있으면 고르면 되고, 없으면 다운로드 받으면 된다. 시간 좀 걸린다.

4. Patcher 실행하기 #3

    - 다운로드 받은 Catalina 이미지 파일을 이용해서 설치용 USB 메모리를 만들면 된다

    - "Create a Bootable Installer" 메뉴를 선택하고,

    - USB 메모리 (필자는 뒤에 있는 "Untitled") 선택하면

    - USB 메모리 내용이 다 지워질 수도 있다는 내용 확인하면 된다

    - 시간이 좀 많이 소요된다 (필자의 USB 메모리가 느려서일지도?!)


5. 재부팅

    - 이제 재부팅을 하면 된다. Option키를 눌러서 부팅 옵션을 고르는 화면을 보면 된다.


6. 디스크 유틸리티

    - Catalina의 경우 APFS 파일시스템을 사용해야 한다고 한다. 그래서 "디스크 유틸리티"를 선택하면 된다.

    - 필자는 SSD + HDD 구성이기에 SSD 일부 공간을 APFS로 할당했다.

    - 반절만 할당해봤다.


7. Catalina 설치

    - 파티션 잡아줬으면, 빠져나와서 "macOS 다시 설치"를 선택하면 된다.

    - 그냥 고고씽~ 하면 된다.

    - 당연히 방금 만들어준 APFS를 설정한 디스크를 골라주면 된다.

    - 느린 USB 메모리 때문인지, 할아버지 맥북이라서인지.... 소요시간은 좀 걸렸다.

    - 1분 남았다고 거짓말 하는 우리 할아버지...

    - 대한민국 잘 골라주면 된다~

    - 개발자라면 다크 모드 !!!

    - Mid 2010 이지만... Catalina 이다~!!!


음... 솔직히 뭐가 좋아졌는지는 잘 모르겠다.

그냥 최신 macOS 사용할 수 있으니 좋을뿐~ ^^


개인적으로는 살짝 느린맛이 있기도 한데... 빨라졌다는 분들도 있는 것 보면... 뭐...


일단 여하튼 우리 할아버지 맥북프로님이 새로운 트렌드에 맞는 옷을 입었어요 !!!


반응형


M5StickC를 구매하고 나서, 뭘하고 놀아야할지 막막했다.

하드웨어적인 완성도도 괜찮고, 가격도 착한데 의외로 자료들이 많지 않았다.

(사실 자료가 많은데 필자가 멍청해서 잘 찾지 못하는 것일 수도 있다)


그러던 中 발견한 또 하나의 착한 아이템 등장 !!!



M5StickC에 붙일 수 있는 바퀴달린 아이템 !!!

거기에다가 가격도 나쁘지 않다.


알리익스프레스를 통해서 바로 구매 진행 ~~~ !!!



아래와 같이 예쁘게 플라스틱 상자에 담아서 배송되었다.



M5StickC를 꼽을 수 있는 핀이 보이고 예쁜 바퀴 4개도 볼 수 있다.

뒤에 보이는 것은 파워 온/오프 스위치이다.



밑면에는 일단 배터리가 가운데 자리 잡고 있고,

각 바퀴에는 모터가 4개 붙어있다.

흰색 네모난 것들은 LED이다.



옆에서 보면 앞바퀴는 왕 크고, 뒷바퀴는 왕 작은 것을 볼 수 있다.



뒤 에 있는 스위치 버튼을 볼 수 있다.



구매하고나서 처음에 당황스러운 것은 충전이었다.

배터리가 있는 전자 제품을 구매하면 제일 먼저 하는 것이 첫 완충인데,

BeetleC의 경우 80 mAH 배터리를 갖고 잇음에도 별도로 충전할 수 있는 포트가 보이지 않았다.

M5StickC도 마찬가지여서 당황스러웠는데...

디바이스 초보자에게는 이러한 부분이 좀 불친절하게 느껴져서 아쉽다.


하지만, 그럼에도 불구하고...

M5Stack에서는 친절하게(?) 아래 사이트를 통해 우리의 귀여운 BeetleC에 대해서 설명해주고 있다.

    - https://docs.m5stack.com/#/en/hat/hat-beetlec




[ 테스트 ]


① 위 사이트를 통해 EasyLoader를 다운로드 받자. (Windows 버전만 제공된다)


② M5StickC 연결한 뒤 EasyLoader에서 "Burn"을 하면 된다. (baud rate는 115200로 설정)


③ M5StickC를 BeetleC에 연결한 뒤에 M5StickC Power 스위치 껐다가 키고, BeetleC의 Power도 On으로 하자.


④ 정상적으로 잘 되었으면 LED들이 3번씩 켜지고, A 버튼을 누르면 앞 바퀴가 앞뒤로 움직인다.


※ 이 때 ④ 테스트가 정상적으로 되지 않으면, USB-C를 M5StickC에 꼽고 충전 과정을 가져보자.

   정답은 모르겠는데, 일단 BeetleC의 전원을 on으로 하고 M5StickC의 Power 버튼으로 껐다가 다시 켜보자.

   이 때, BeetleC의 LED들이 번쩍이면 일단 성공이다.

   A 버튼을 눌렀을 때 바퀴가 움직이지 않으면 조금 더 충전해보자.



⑤ 스마트폰에서 WiFi를 키고 AP를 찾아보면 "BeetleC:xxxx"로 시작하는 AP를 찾을 수 있다. 패스워드는 "12345678"



⑥ 스마트폰에서 "192.168.4.1/ctl" 주소로 접속하면 된다.



위와 같은 화면을 통해 BeetleC를 조종하면서 놀 수 있다.


이것만 가지고도 재미나게 놀 수 있지만,

파란크리스마스님이 올려주신 내용으로 가지고 놀면 보다 더 재미나게 놀 수 있다.


다음 포스팅을 통해 좀 더 알아보도록 하겠다~!!!


반응형


가볍게 한국 영화 한 편 보고 싶어서 선택한 영화



차승원이 코믹 주연을 하고 있고

포스터에도 대놓고 추석 대목을 노린다고 쓰여져 있다는 것은...

코믹한 가족 영화라는 뜻 !!!


결과를 미리 말하면~

코믹한 가족 영화 정답 !!!





네이버에서 찾은 사진인데.... 이거... 어릴 때(?) 찍은 사진인 것 같다.

요즘은 흰머리도 보이는 중년이신데....^^


[ 감독 : 이계벽 ]


1971년생 아저씨이고,

연출과 각본 활동을 주로 한다.


2003년 올드보이 영화의 조감독도 했었고...


류승범, 신민아 주연의

"야수와 미녀(2005)"로 감독 데뷔를 했고...


이번 영화 직전에는

700만 흥행을 한

유해진 주연 "럭키 (2016)" 영화

연출과 각색을 했었다.


나름 지명도 있는 영화를 많이 연출한 유명한 감독이다.


내가 본 영화들...

"야수와 미녀", "럭키", "힘을 내요, 미스터리" 

뭔가 비슷한 느낌이 든다. 아니 분명히 뭔가 비슷하다 ^^


스토리가 복잡하지 않고

착한 사람들이 복을 받는 코믹을 섞은

주인공의 성장을 그리고 있는 영화들이다.




[ 주연 - 차승원 ]


너무 유명하니 생략 !!!




※ 출처 : 엄채영 인스타그램



[ 주연 - 엄채영 ]


드라마에서 간간이 얼굴을 봤었고,

KBS2 TV소설 ‘꽃피어라 달순아(2017)’에서 아역 주인공까지 했었던

2007년생 귀여운 아역배우다.


※ 출처 : 엄채영 인스타그램


이 영화를 위해서 무려... 삭발을 했다 !!!

12살 소녀의 엄청난 용기 !!!


그런데,

삭발을 했는데 ...

예쁘고 귀엽다 !!!


영화 '럭키'에서 감독과 인연을 쌓은

전혜빈이 추천을 했다고 하는데,

추천이라고 해서 낙하산이 아니라

정식 오디션을 모두 거쳤고

오디션 때 아역으로써는 의외로

코미디 연기를 선보였던 것이

감독에게 인상 깊게 남았단다.


여하튼... 뒤에서 다시 말하겠지만...

이 영화를

고리타분하고 억지스러운 C급 영화로

만들지 않은 중요한 요소 중 하나가

바로 이 "엄채영"이라는 배우다!!!


전형적인 캐릭터일 수 밖에 없는 역할임에도 불구하고

아역 배우가

정말 깔끔하고 멋진 연기를 보여줬다.

예쁘고 귀여운 외모도 한 몫을 했지만

연기가 정말 자연스러웠다.


강추 !!!



[ 스토리 ]


잘생겼지만 모자란 차승원 ...

골수암에 걸린 딸 엄채영...

차승원은 딸의 존재를 몰랐다가 갑자기 알게 되고 ...

어쩌다가 둘이 같이 대구로 가출을 하게 되면서

온갖 에피소드들이 만들어지고 ...

알고 봤더니 2003년 대구지하철참사 사고로 인해서

차승원이 바보가 된 것이었고 ...

안타깝게도 차승원은 골수 기증이 안되었으나

차승원의 선행이 알려지면서

기증을 받게되어

엄채영의 골수암 치료가 잘되었다는 ...

그런 이야기



너무나 뻔한 스토리이지만,

억지스럽지 않았고

나름 깔끔하게 쉭~쉭~ 잘 진행을 시켜서

지루한 것은 없었다.


중간 중간 에피소드들도

별로 새로울 것 없는

그렇고 그런 에피소드들이었지만

배우들이 연기를 너무 잘해주었고

연출/편집도 질질 끌지 않고

가변게 잘 만들어 주었다.




[ 총 평 ]


너무나 흔한 스토리에 흔한 에피소드들의 조합이다.

차승원의 연기는 새로울 것이 없었다. 

그럼에도 불구하고 재미있게 봤다.


음... 과거 이런 류의 영화와 비교하면,

"힘을 내용, 미스터 리"는

"출발, 비디오여행"을 보는 느낌이었다.


질질 끌지도 않았고, 과도하게 감정을 쥐어짜지도 않았다.

흔한 에피소드들이었지만, 짧고 다양하게 배치했다.


특히, 신기한 부분은 나쁜 사람이 나오지 않았다.

조금 코믹하게 불쌍한 사람들이 나왔지,

미워해야하는 나쁜 사람들은 없었다.


그래서, 그냥 기분 좋게 재미있게 봤던 것 같다.


89억 제작비 밖에 들지 않았지만

현재 110만도 돌파한 상태로 보아 손익분기점은 돌파하기 힘들 것 같다.

200만은 넘겨야 한다는데...


전문가 평가는 당연히 낮은 점수이지만

관람객 평가는 비교적 높은 점수를 보이고 있음에도 불구하고

흥행은 잘 안되는 듯...



이승엽 선수도 까메오로 출연하고 있고

아역 배우들이 삭발까지 했는데...

거기에다가 700만 흥행을 한 "럭키"를 풍자하기도 하는 등...

이런걸 홍보에 잘 이용해먹지 못한듯...



뭐 여하튼... 간만에 국산 B급 영화로

즐겁게 킬링타임 용으로 잘 본 영화다.


아역 배우 엄채영 짱 !

스피디 한 편집 짱 !


5점 만점에 4점

머리 아프기 싫을 때 가볍게 킬링 타임용도로 강추 !!!


반응형


M5StickC 가지고 놀거리가 마땅치 않아서 그냥 Sample만 넣어서 가지고 놀다가...

바퀴 달린 장난감을 만들고 싶어졌다. (이건 나중에 BeetleC 소개하겠다)


그런데, 그냥 바퀴 가지고 노는게 아니라

핸드폰으로 조종하는 장난감을 만들고 싶어져서...


M5StickC ~ Android 間 연결 하는 것을 해보려고 한다.



일단 M5StickC 에서 지원하고 있는 Bluetooth Spec은 다음과 같다.

- Integrated dual mode Bluetooth (classic and BLE)


즉, BT / BLE 2가지 모두 되는데... 배터리를 아끼기 위해 BLE를 이용해서 연결해보겠다.



Android Studio를 가지고 앱을 만드는 것은 번거로우니,

가볍게 해보기 위해서 선택한 것은 "앱 인벤터"



이와 관련된 자료를 찾아보다가 찾은 정말 훌륭한 레퍼런스

조금 아쉬운건 M5Stack 기반으로 되어 있어서

M5StickC에서 바로 사용할 순 없고 조금의 수정이 필요했다. 작성해주신 분에게 무한의 감사를~~~~!!!

덕분에 M5StickC 구매한 것을 후회하지 않게 되었다는..... (가지고 놀 방법을 몰라서... 고생을... ㅋㅋㅋ)

    - https://bluexmas.tistory.com/972?category=818671




일단 Arduino IDE에서 M5StickC에 넣을 코드를 작성해보자.


#include <M5StickC.h>

#include <BLEDevice.h>

#include <BLEUtils.h>

#include <BLEServer.h>

#include <BLE2902.h>


#define SERVICE_UUID             "454f62bd-2b3e-43de-8cd5-e64f5bc15092"

#define CHARACTERISTIC_UUID "593744ae-3348-44f6-b00f-853e2b3b2b60"


BLEServer* pServer = NULL;

BLECharacteristic* pCharacteristic = NULL;

bool deviceConnected = false;


class MyServerCallbacks: public BLEServerCallbacks {

    void onConnect(BLEServer* pServer) {

      M5.Lcd.println("connected");

      deviceConnected = true;

    };

 

    void onDisconnect(BLEServer* pServer) {

      M5.Lcd.println("disconnected");

      deviceConnected = false;

    }

};


class MyCallbacks: public BLECharacteristicCallbacks {

  void onRead(BLECharacteristic *pCharacteristic) {

    M5.Lcd.println("read");

    pCharacteristic->setValue("Hello World!");

    std::string value = pCharacteristic->getValue();

    M5.Lcd.println(value.c_str());

  }

 

  void onWrite(BLECharacteristic *pCharacteristic) {

    M5.Lcd.println("write");

    std::string value = pCharacteristic->getValue();

    M5.Lcd.println(value.c_str());

  }

};

 

void setup() {

  Serial.begin(115200);

  M5.begin();

  M5.Lcd.println("BLE start");


 

  BLEDevice::init("M5StickC");

  BLEServer *pServer = BLEDevice::createServer();

  pServer->setCallbacks(new MyServerCallbacks());

  BLEService *pService = pServer->createService(SERVICE_UUID);


  

  pCharacteristic = pService->createCharacteristic(

                                         CHARACTERISTIC_UUID,

                                         BLECharacteristic::PROPERTY_READ |

                                         BLECharacteristic::PROPERTY_WRITE |

                                         BLECharacteristic::PROPERTY_NOTIFY |

                                         BLECharacteristic::PROPERTY_INDICATE

                                       );


  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->addDescriptor(new BLE2902());


  pService->start();

  BLEAdvertising *pAdvertising = pServer->getAdvertising();

  pAdvertising->start();

}


void loop() {


  if (deviceConnected) {

    if(M5.BtnA.wasPressed()) {

      M5.Lcd.println("Btn A press!");

      pCharacteristic->setValue("Btn A press!");

      pCharacteristic->notify();

    }else if(M5.BtnB.wasPressed()) {

      M5.Lcd.println("Btn B press!");

      pCharacteristic->setValue("Btn B press!");

      pCharacteristic->notify();

    }

  }

  M5.update();

}


레퍼런스로 삼았던 "파란크리스마스"의 포스팅 내용과 함께,

구글링을 통해 확인한 BLE Sample 코드들을 확인하고, M5StickC에서 돌아갈 수 있도록 수정해봤다.



그런데, 일단 시작하기에 앞서서 UUID를 생성해야 한다.


이걸 왜 생성해야하냐고!?

나도 잘 몰라서 찾아봤다.


UUID (Universally Unique IDentifier) 는 우리말로 바꿔보면 "범용 고유 식별자"라고 한다.

결국은 기기 間 통신을 할 때 각 개체를 구분하기 위한 고유값인데,

이러한 고유값은 보통 중앙 관리 시스템에 의해서 관리가 되지만,

여러 사정으로 개발 주체가 스스로 이름을 정하도록 하되 중복되지 않도록 기준을 잡아주고 운영하는 방식이 바로 UUID라고 한다.

완벽히 중복되지 않는다는 보장을 할 수는 없지만, 중복될 가능성이 거의 없기에 많이 사용된다고 한다.


UUID는 16진수 36개 문자로 표현되며 8-4-4-4-12 와 같은 형식으로 구성된다.

    - Sample: 454f62bd-2b3e-43de-8cd5-e64f5bc15092


UUID 버전 구성은 아래와 같다.

    - 버전 1 (MAC 주소)

    - 버전 2 (DCE 보안)

    - 버전 3 (MD5 해시)

    - 버전 4 (랜덤)

    - 버전 5 (SHA-1 해시)


그냥 막 만들려면 막연하니 아래 사이트에서 generate 하고 사용하자.

    - https://www.uuidgenerator.net/


버전4로 2개 생성해서 코드의 저 위에 넣어주면 된다.

귀찮으면 그대로 사용해도 되지만 그러면 필자의 디바이스와 혼선이 생길.......리가 없나!? 설마 이웃은 없을테니... ^^



그 다음으로 BLE를 사용하려다보니 뭘 알아야 할 것 같아서 살짝 공부 좀 해봤다.


[ GATT (Generic Attribute Profile) ]

    - GATT는 두 BLE 장치간에 Service, Characteristic 을 이용해서 데이터를 주고 받는 방법을 정의한 것입니다.


[ Attribute Protocol (ATT) ]

    - GATT는 ATT의 최상위 구현체이며 GATT/ATT로 참조되기도 합니다. 각각의 속성(Attribute)은 UUID를 가지며 128비트로 구성됩니다.

    - ATT에 의해 부여된 속성은 특성(characteristic)과 서비스(Service)를 결정합니다.


[ Service ]

    - 하나의 서비스는 특성들의 집합입니다.

      예를 들어 "Heart Rate Monitor"라고 불리는 서비스를 가지고 있다면 그 서비스는 "heart rate measurement"같은 특성을 포함합니다.


[ Characteristic ]

    - 하나의 특성(characteristic)은 하나의 값과 n개의 디스크립터를 포함합니다.


[ Descriptor ]

    - 디스크립터는 특성의 값을 기술합니다.



이제, 위의 코드에서 나오는 Service와 Characteristic을 이해할 수 있다 !!! (정말!?)





이제 Android 폰에 넣을 App을 만들어보자!!!


앱 인벤터 (App Inventor)

    - https://appinventor.mit.edu/



인벤터에서 BLE 기능을 사용하기 위해서는 Extension을 등록해야 한단다. (아직은 베타?!)

    - https://mit-cml.github.io/extensions/


BluetoothLE.aix 파일을 다운로드 받아놓자.


이제 인벤터를 실행해서 새로운 프로젝트를 만들어 보자.

앱 인벤터를 한 번도 사용하지 않았더라도 무서워할 것 없다.

그냥 크롬 브라우져로 접속해서 사용하면 된다.

다만, 눈치만 조금 있다고 하면 아래 그림 보고 잘 따라올 수 있다~^^ (눈치가 부족하신 분은 구글링을 조금.....^^)



그리고, 방금 다운로드 받은 BLE Extension을 등록하자.



그리고 이제 화면을 꾸미면 된다.

왼쪽 팔레트에서 원하는 것을 선택한 뒤에 드래그앤드롭 하면 된다.



이제 블록으로 넘어가서 ...



처음 해보시는 분들은 조금 고생할 수도 있지만

그래도 계속 해보면 된다!!!

필자도 했는데... 여러분은 못할리가 없다~~!!

(파란크리스마스님 다시 한 번 쌩유~~~!!!!)


빌드를 실행하면,



아래와 같이 다운로드 받을 수 있는 QR Code가 나오는데....

이상하게도 필자는 다운로드가 안되서, 그냥 아래 링크 주소 타이핑해서 다운로드 받았다.



이제 실행해보자.


M5StickC 켜져있는 상태 & App 실행상태이다.



앱에서 "조회" 버튼 누른 후, "BLE 기기 선택" 버턴을 눌러보자.



M5StickC 항목이 보일 것이다. 선택하자.



M5StickC에서 connected 되었다는 메시지도 보이고,

앱에서도 BLE 연결이라는 체크박스와 함께 밑에 연결된 디바이스 이름도 보인다.



M5StickC에서 A 버튼을 눌러보자.



B 버튼도 눌러보자.



앱에서 텍스트 입력 후 "보내기" 버튼을 누르면 M5StickC로도 날라가는 것을 볼 수 있다.



에고... 힘들었다.

모르는걸 하려다 보니 이것 저것 알아보고 공부하고 하느라 시간이 꽤 걸렸다.

그래도 뭐 여하튼 되긴 했으니~!!!


Sample Code는 아래 링크에서 다운로드 받을 수 있다.

    - https://github.com/what-want/BLEconnect




반응형


에휴 ... 이번 포스팅은 삽질에 대한 이야기이다.


어렸을적(?) 맥미니 하나 장만해서 가지고 놀다가

PowerPC 기반으로 리눅스 서버 하나 돌리고 싶어서 변신 시키고.... 그러다가 PowerPC는 역사의 뒤안길로 사라지고...

한동안 맥OS와 같이 어울릴 일이 없었는데...


최근 왠지 맥북 하나 갖고 싶어서 하나 중고로 장만을 했다.

뭐 오래된 저렴한 녀석이지만 그래도 아직 구동은 되는 녀석이기에... ^^

노인 학대 시키는 것 같아서 추가로 메모리도 사서 8GB로 늘려줬다.


할아버지 맥북으로 무엇을 할까 하다가...

역쉬 맥북 프로는 프로그래머 코스프레 용도야!!! 라며... M5StickC 개발환경을 여기에다가 꾸며보기로 마음 먹었다.


허세 충족을 위해 나중에 맥북 들고 M5StickC 들고 카페에 가서 커피 한 잔 마시며 폼을 잡아보려 했건만....



[ M5StickC 개발환경 ]

    - 앞 포스팅에서 볼 수 있는 이미지에도 쓰여져 있는데, M5StickC를 가지고 놀 수 있는 방법은 3가지가 있다고 한다.

        . UIFlow

            : 스크래치와 같은 방법을 통해 프로그래밍을 할 수 있는 개발환경이다. (WiFi를 통해 연결하고 웹을 통해 작업한다)

        . MicroPython

            : 이건 아직 필자도 잘 모르겠다. 어떻게 환경을 꾸밀 수 있는지 조차 ...

        . Arduino

            : 가장 일반적인 개발환경이다.



[ Arduino IDE ]

    - 가장 표준적인 방법인 Arduino IDE를 이용해서 M5StickC 개발환경을 꾸며보려고 했다.

        . https://docs.m5stack.com/#/en/quick_start/m5stickc/m5stickc_quick_start



[ Host Environment ]

    - 앞에서도 말했지만 필자는 맥북에 개발환경을 꾸미고자 했다!!!

    - 필자의 맥북 할아버지 스펙은 아래와 같다.

        . 기종       : MacBook Pro (13-inch, Mid 2010)

        . 운영체제 : macOS High Sierra (version 10.13.6)

        . 메모리    : 8GB

        . 디스크    : SSD


    - Arduino IDE 개발환경 구성 방법은 아래와 같다.

        . https://docs.m5stack.com/#/en/quick_start/m5stickc/m5stickc_quick_start_with_arduino_MacOS


        ① Arduino IDE 다운로드 받아서 설치하고

        ② ESP32 보드에 대한 기본 정보 등록을 위해 "File - Peferences - Settings" 메뉴를 통해 다음 URL 등록하고,

            . https://dl.espressif.com/dl/package_esp32_index.json

        ③ "Tools - Board - Boards Manager..." 메뉴에서 "ESP32" 검색 후 ESP32 보드 설치하고

        ④ "Sketch - Include Library - Manage Libraries..." 메뉴에서 "M5StickC" 라이브러리 검색해서 설치하면 된다.


    - M5StickC 연결을 위한 기본 설정

        . 아래 이미지와 같이 하면 된다고 한다!!!!



    - 그.런.데. ....


일반적으로는 이렇게 하면 이제 슉슉~ 잘 되어야 한다. 이렇게 하면...


이하 내용은 연결이 잘 안되는 경우에 대한 경험담 공유이다.

결론만 말하면 ... 맥북에서는 실패했다.


그런데, 똑같은 방법으로 똑같은 케이블과 똑같은 M5StickC를 가지고 윈도우즈PC에서 하면 잘된다.

다를게 하나도 없는데... ㅠㅠ


일단 맥북에서의 Arduino IDE 설치기로 작성했지만, 윈도우즈에서도 동일하니... 그걸로 대체~

필자는 어쩔 수 없이 윈도우즈 환경에서 개발하기로...



반응형

특이한 폰을 한 번 사보고 싶어서 샀었던 특이한 폰

- 방수 되는 폰
- 튼튼한 폰
- 키보드 자판이 있는 폰



샀을 때에는 포스팅을 하지 않고
이제서야 포스팅을 하고 있네...^^



사실 지금 갖고 있는 스마트폰이 15대 정도가 넘는다.
요즘 폰은 갖고 있지도 않는데...
그 말은 오래된 골동품만 잔뜩 갖고 있다는 ^^


그래서 오래된 할아버지 폰들을
지금도 쓸 수 있는지 한 번 부활 시켜보려고 한다.



그 당시에 필자가 샀던 상품이다.

[ebay] New NEC Terrain Black - AT&T (Unlocked) Rugged 4G Push To Talk Smartphone -  79.95$ / FS

10만원 안되는 가격으로 무료 배송~!!! 앗싸~!!!




"NEC Terrain"


많은 분들이 처음 들어보는 이름의 스마트폰일 것이다.
특히 우리나라에서는


유명하지 않은 제품은 반드시 이유가 있다 !!!

사실 좋은 폰은 아니다.
그리고 우리나라에서 사용하기에 불편함이 많다 ^^


그래서
처음 구매하면 좀 해줘야 할 작업들이 있다.




처음 샀을 때 작성한 내용이라서
지금이랑 안맞을 수도 있지만 일단 기록 차원에서 남겨보면...


[ 사용전 설정 ]

1.  3G 전용 네트워크 설정 : *#*#4636#*#*  후  WCDMA Prefferd
2. 물리키보드 지원 한글입력기 : 도돌키보드
3. 로케일(ko_KR) 프로그램 : Custom Locale 같은 것
4. 런처 : Holo Launcher HD
5. 파일 탐색기 : ES 파일탐색기




4G (LTE) 폰이라고는 하지만,
국내 전파와 맞지 않아서 3G 폰으로 사용해야 한다.
필자는 아직도 3G 무적칩을 사용하고 있기에 뭐 불만 없다 ^^

그리고, 한글을 지원하지 않기 때문에
키보드 어플과 함께 Locale 변경 어플도 필요하다.



아!! 가끔 WiFi가 잘 안되는 경우가 있는데,
무선 공유기의 채널에 영향을 받는다고 한다. (정말... Terrain 너는...)

무선 공유기의 2.4GHz 대역을 10번 이하 채널로 변경을 하고
1, 5, 9, 13번 채널을 추천한다고 한다~!!!

그리고, Wi-Fi 테더링도 잘 안된다고 하는데 (윽! 정말...)
이건 마땅히 해결방법이 없다고...


뭐, 여하튼 좀 우여곡절이 있지만 그래도 ^^
이 정도만 하면 그래도 뭐 그런대로 쓸만하다~~~








NEC Terrain 에 대한 정보는 나무위키에 너무 잘 정리되어 있다.
SPEC 정보는 물론이고, 주의 사항까지도 잘 정리되어 있다.
만세~









일단 이 스마트폰은 NEC와 AT&T에서 기업용 시장을 타겟으로 내놓은
방수, 방진 되는 스마트폰인데..
NEC가 스마트폰 사업을 그만둬 버리는 바람에 ㅜㅜ

그래서 Android version도 4.0.4 에서 끝인 것으로 보인다.

커스텀롬도 안보이고... ㅜㅜ





그렇기는 하지만

지금 기준으로 최소한의 사용할만한 수준은 될 것 같다.
하지만 말 그대로 최소한의 수준 ^^


네이버 앱도 실행이 된다.

뭐 아쉬운대로... ^^



구글 드라이브도 설치가 되고 파일 접근이 가능하다.
mp3 파일 재생까지는 잘 된다.

그런데, 구글드라이브에 있는 동영상을 보려고 하니
아래와 같은 메시지와 함께 재생이 안된다.


구글에서 스마트폰에 맞도록 재인코딩을 해주나?!

나중에 한 번 더 확인은 해봐야겠지만,

사실 동영상 재생까지는 힘들지 않을까 한다.


mp3 파일 재생이 잘되는 것만으로도 감지덕지~!!!!



NEC Terrain을 사용하면서 가장 감동적인 부분은 자판이다!!!



물리 자판

사용감이 안좋다고 하시는 분들도 많으시지만
개인적으로는 색다른 경험만으로도 정말 좋았다!!!

Naver에서 검색어를 입력하거나
문자 같은 것들을 입력할 때 행복하다!!!

한글 입력도
도돌키보드 앱 설치가 되어있으면 잘 된다!!!
한글 자판이 보이지 않는 점이 조금 아쉽지만
대부분 다 외워서 (습관적으로?) 잘 입력하지 않나?!





메모리가 1GB 밖에 안되고
Android 버전도 낮고
화면도 작아서
안되는 것도 많고 속도도 느리지만...

그냥 색다른 맛으로 잠깐 사용해보기에는
재미있는 스마트폰이다.

방수도 되고
물리 자판도 되고
튼튼한 스마트폰~!!!



반응형

'지름생활 > Phone' 카테고리의 다른 글

Galaxy Note 8 통신사 변경하기  (20) 2019.02.09
[Nexus S] 젤리빈 Jelly Bean 4.1.2  (2) 2013.05.13

+ Recent posts