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



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

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

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


결과를 미리 말하면~

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





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

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


[ 감독 : 이계벽 ]


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


일단 필자는 컴퓨터공학 전공이다.

Hardware 관련된 과목을 배우지 않는 것은 아니지만, Software 중심으로 전공 수업을 받았고

또한 개인적으로도 Software에 치우쳐서 공부를 했다.

하지만, 항상 Hardware 부분에 대한 갈증은 갖고 있었고, 지금도 관심 많다 !!!


하고 싶은 말은...

Hardware 지식이 거의 없다.


아래 내용에 거짓말이 많을 수 있다.



지름병에 걸린 중증 환자로써 어느날 Aliexpress를 뒤지다가 발견한 저렴한 버전의 Arduino 제품 !!!




12달라도 안되는 가격에

Arduino 프로그램이 가능한 액정이 달려있는 손가락 사이즈의 예쁜 디바이스가 딱 !!!

거기에다가 배터리도 내장되어 있고, 6축 센서, IR 까지.... 아니... 이건 대박 !!!



그래서 무조건 질렀다.




[ ESP32 ]

    - 2008년 설립된 espressif 社 에서 만든 유명한 라인업 중 하나이다. (ESP8266, ESP32)

    - 중국 상하이에 있는 회사인데... ESP8266, ESP32 2개로 대박이다~~~~

        . https://www.espressif.com/

        . http://espressif.co.kr/ (국내 총판)

    - IoT 디바이스 개발을 해보려는 사람들이라면 누구나 알만한 Chip 이라고 한다.

        . ESP8266 → ESP32 전환 추세


 

 ESP8266

 ESP32

 MCU

 Xtensa Single-Core 32bit

 Xtensa Dual-Core 32bit

 802.11 b/g/n/ WiFi

 O, HT20

 O, HT40

 Bluetooth

 X

 4.2 and Classic

 Frequency

 80 MHz

 160 MHz

 SRAM

 160 kBytes

 512 kBytes

 Flash

 SPI Flash, up to 16 MBytes

 SPI Flash, up to 16 MBytes

 GPIO

 17

 36

 Hardware / Software PWM

 None / 8 채널

 1 / 16 채널

 SPI / I2C / I2S / UART

 2 / 1 / 2 / 2

 4 / 2 / 2 / 2

 ADC

 10 bit

 12 bit

 CAN

 X

 1

 Ethernet MAC Interface

 X

 1

 Touch Sensor

 X

 O

 Temperature Sensor

 X

 O

 Hall Sensor

 X

 O



[ M5StickC ]

    - M5StickC 디바이스는 아래 부품들의 조합으로 만즐어진 제품이다.


 ESP32-PICO-D4

 ESP32 기반 꼬꼬마 버전

 AXP192-PMIC

 Single Cell Li-Battery and Power System Management IC

 SH200Q-6Axis

 very small, 6 axis inertial sensor, consisting of: A digital, triaxial 16bit acceleration sensor and a digital, triaxial 16bit, ±2000°/s gyroscope. 

 ColorLCD-0.96" (ST7735S)

 80 x 160. 132RGB x 162dot 262K Color with Frame Memory Single-Chip TFT Controller/Driver

 80mAH BATTERY

 

 SPM1423-PDM MIC

 miniature, highperformance, low power, top port silicon digital microphone with a single bit PDM output


    - 기본적인 제품 정보는 위의 이미지를 보면 된다 !!!



[ Manual ]

    - M5StickC에 대한 모든 것이 너무 잘 작성되어 있다.

        . https://docs.m5stack.com/#/en/core/m5stickc


반응형


※ 아래 내용이 많은데.... 뭔가 해보려고 엎치락 뒷치락 하면서 작성한 내용이라 그렇다.

   비슷한 고민을, 공부를 해보시려는 분이면 조금 도움이 되지 않을까 해서 공개한다.



주말에 뭘할까 고민하다가 블로그를 뒤져봤는데... 뭔가 귀찮았다.

그래서 이걸 어떻게 하면 편하게 할 수 있을까 고민하다가... ^^


[ 목표 ]

1. 네이버 블로그에서 특정 키워드(동탄)를 검색해서

   맛집 포스팅인지 부동산 포스팅인지 구분하고

   동일한 식당이면 묶어서

   홍보 포스팅이면 제외시켜서

   GitHub 페이지로 결과를 보여주도록 하고 싶다.


2. 불량 포스팅이면 작성자를 기록해서

   다음부터는 해당 블로거 글은 무조건 걸러버리는 기능도 필요


3. 처리한 결과는 별도 로깅도 하고 레포팅도 한다.



[ 개발 환경 ]

    - GitHub에 repository를 생성해서 소스코드 관리

        . https://github.com/

    - Virtualbox를 이용해서 Ubuntu 18.04 LTS Server 설치

        . https://www.whatwant.com/entry/Ubuntu-Server-18042-LTS-64bit-Bionic-Beaver-Installation

    - Python

        . 일단 2.7 버전의 Python으로 해보고자 한다. "$ sudo apt-get install python"



[ 진행 #1 - Python module 설치 ]

    - 추가로 설치해야하는 Python module들을 설치하자

$$ sudo apt-get install python-beautifulsoup python-requests



[ 진행 #2 - Naver API 사용 준비 ]

    - Naver 블로그 검색을 API를 통해 해보고자 한다.

        . https://www.whatwant.com/entry/Naver-API-사용-준비하기

    - 기본적인 활용은 아래 링크에서 확인할 수 있다.

        . https://developers.naver.com/docs/search/blog/



[ 진행 #3 - 기본 코드 작성하기 ]

    - 이제 준비는 모두 끝났다. 뭔가 동작하도록 해보자!!!


#!/usr/bin/env python

# -*- coding: utf8 -*-


import urllib2

import requests



naver_client_id = "XXXX"

naver_client_secret = "XXXX"


search_blog_keyword = "동탄"

query = urllib2.quote(search_blog_keyword)


display = 10


start = 1


sort = "date"


url = "https://openapi.naver.com/v1/search/blog.json?query=%s&display=%s&start=%s&sort=%s" % (query, display, start, sort)



request = urllib2.Request(url)

request.add_header("X-Naver-Client-Id", naver_client_id)

request.add_header("X-Naver-Client-Secret", naver_client_secret)



response = urllib2.urlopen(request)

rescode = response.getcode()



if( rescode == 200 ):

    response_body = response.read().decode('utf-8')


    print response_body


exit()


    - 위와 같이 작성 후 실행하면, 뭔가 값을 가져온 것을 확인할 수 있을 것이다. 뭔가 다 된 것만 같은 착각이~~~ 든다.

    - 정말로 뭔가 가져온다~ ^^



[ 진행 #4 - NLP 사용하기 (KoNLPy) ]

    - 한국어 분석을 해보기 위해 알아보니, 가장 유명한 NLP 모듈이 KoNLPy 인 것 같다.

        . Reference: http://konlpy.org/ko/latest/


    - 필요한 패키지 미리 설치하기

        . 공식 홈피에는 openjdk-7-jdk로 되어있고, python3-dev도 기재되어 있지만,

          Ubuntu 18.04 환경에서 현재 openjdk-7-jdk는 사라졌고, 필자는 python2.7 환경에서만 사용할 것이기에 아래와 같이...


$ sudo apt-get install g++ openjdk-8-jdk python-dev


    - KoNLPy 설치하기


$ sudo apt-get install python-pip

$ sudo -H pip install konlpy


    - 샘플 코드는 다음과 같다.

    - 과거 Twitter가 이름을 Okt로 바꿨단다.


from konlpy.tag import Okt

from konlpy.utils import pprint



...

        blog_content = ... (위의 블로그 긁어오기 응용)

        okt = Okt()

        pprint( okt.nouns( blog_content ) )



[ 진행 #5 - 단어 카운트하기 ]

    - 블로그 본문 얻기 → 형태소 분석해서 noun 얻기 → 각 단어가 몇개인지 갯수를 얻어야겠다!!!!

    - 예전에는 for 구문 돌려서 하나씩 갯수를 더해가면서 분석을 했는데, 좀 더 편한 방법을 찾아봤다.


from collections import Counter


...


    ... (블로그 본문 얻기)


        okt = Okt()

        nouns = okt.nouns( blog_content )


        tags = Counter( nouns )


        pprint( tags )


    - Counter() 함수 하나로 해결?!



[ 진행 #6 - 한글 폰트 설치하기 ]

    - 단어 구하고 몇 개씩인지 카운트까지 했으면, 당연히 wordcloud 한 번 해봐야할 것 같아서 ... 미리 필요한 한글 폰트부터 설치해봤다.


$ sudo apt-get install fonts-nanum fonts-nanum-coding fonts-nanum-extra


    - 설치된 폰트를 확인해보자.


$ ll /usr/share/fonts/truetype/nanum/



[ 진행 #7 - wordcloud 설치하기 ]

    - 최근 Python을 통해서 이러한 분석작업을 하는 것이 엄청 유행을 하고 있는데,

      ML과 함께 하는 것이 유행하면서 Jupyter Notebook 환경에서 작업한 코드들이 대부분이다보니 필자가 원하는 내용을 찾기가 쉽지 않았다.

    - 뭐, 결국은 필자의 지식과 노력과 실력이 부족한 탓이겠지 ㅠㅠ


$ sudo -H pip install wordcloud

$ sudo -H pip install matplotlib

$ sudo apt-get install python-tk



[ 진행 #8 - wordcloud 만들어보기 ]

    - 앞에서 형태소 분석한 단어가 각 몇 개씩인지까지 분석했으니... 그걸 가지고 WordCloud를 만들어보자.


from wordcloud import WordCloud


... (블라블라)


        ... (블로그 본문 읽어와서)

        ... (KoNLPy 이용해서 형태소 쪼개고)

        tags = (Count 이용해서 단어별로 갯수 카운트하고)


        font_path = '/usr/share/fonts/truetype/nanum/NanumMyeongjoBold.ttf'

        wc = WordCloud(font_path=font_path, background_color='white', width=800, height=600)


        cloud = wc.generate_from_frequencies( tags )

        cloud.to_file( "wordcloud.png" )


    - 그러면 아래와 같은 그림이 만들어진다. (폰트는 바꿔서 만들었다 ^^)




[ 진행 #9 - GitHub Pages Theme 고르기 ]

    - 이미지 파일까지 만들었는데... 이걸 어떻게 보여줄까 고민하다가 생각한 GitHub Pages ...

    - 기본으로 주어진 테마 중에는 마음에 드는 것이 없어서 다른 테마들은 없을까 찾아보았다.

        . https://jekyllthemes.io/github-pages-themes



    - 유료도 있지만, 무료도 있으니 잘 찾아보길... ^^



[ 진행 #10 - GitHub Pages Theme 가져오기 ]

    - 필자가 고른 Theme는 "flexible-jekyll"

        . Repo: https://github.com/artemsheludko/flexible-jekyll

    - 해당 Theme를 다룰 다양할 방법이 있지만, 필자가 택한 방법은 "/docs" 디렉토리에 넣어서 사용하기!


    ① 내가 사용하는 Repo를 다운로드 받은 뒤, 내 Repo 디렉토리로 이동하자

    ② 위 Theme를 clone 받은 뒤, .git 디렉토리를 지우자.


$ git clone https://github.com/artemsheludko/flexible-jekyll.git ./docs

$ rm -rf ./docs/.git


    ③ 그렇게 하고 push 하자. /docs 디렉토리가 있어야 뒤에서 할 settings 설정을 진행할 수 있다.


    ④ GitHub에서 Pages 기능을 활성화 시키자. 해당 Repository의 settings 메뉴에서 GitHub Pages 항목을 살펴보자.



    ⑤ Source 선택 時 /docs folder로 골라주면 된다. (/docs 디렉토리가 있어야 해당 옵션을 선택할 수 있다)



[ 진행 #11 - GitHub Pages Theme 설정하기 ]

    - 간단한 config를 설정해야 한다.



    - 입맛에 맞게 수정한 후 commit 반영하자.



[ 진행 #12 - GitHub Pages Post 반영하기 ]

    - 검색 결과를 얻어와서 분석하고, 이미지까지 만든 것을 post로 만들어 보자.

    - 아래 코드는 필자가 테스트로 작성했던 것을 샘플로 기재한 것이다.


... (앞에서 작업한 것들)


    for content in CONTENTS:

        post_filepath = "docs/_posts/%s-%s.markdown" % ( datetime.now().strftime("%Y-%m-%d"), content['id'] )


        temps = [ "---", "layout: post" ]

        temps.append( "title: %s" % content['title'] )

        temps.append( "date: %s" % content['postdate'] )

        temps.append( "description: %s" % content['description'] )

        temps.append( "img: %s" % content['img'] )

        temps.append( "fig-caption: # Add figcaption (optional)" )

        temps.append( "tags: [ %s ]" % ','.join(content['nouns']) )

        temps.append( "---" )

        temps.append( "[%s](%s)" % (content['title'], content['link']) )


        with open( post_filepath, 'w') as outfile:

            outfile.write( "\n".join( temps ) )



여기까지 진행해서 얻게된 결과는 다음 이미지와 같다.




아직도 해볼만한 것이 엄청 많지만,

힘들어서 여기까지만 작성한 내용으로 한 번 선 긋고자 한다. 헥헥 ...



반응형


Ubuntu 18.04 Server 설치를 하고 부팅을 하는데

신경 거슬리게 하는 메시지가 자꾸 출력이 되었다.



▷ cloud-init

    - 클라우드 인스턴트를 초기화하기 위한 유틸리티들을 제공해주는 패키지


우쒸... 필요도 없는 것이 거슬리게 하네... 지워버려야겠다!!!


$ sudo apt-get purge cloud-init


이제 이상한 메시지가 안나온다.





반응형


클리앙(https://www.clien.net)을 보다가 알게된 소식

    - 샤오미 ‘미밴드’ 한국서 100만대 팔았다 (https://www.clien.net/service/board/news/13831567)


필자도 그 중 1대를 팔아준 사람으로써... ^^

갑작스레 든 생각 "우쒸~ 한글 패치는 언제 해주는 건데!!!"


그런데, 위 아티클의 원본 기사를 살펴보니, (https://m.news.naver.com/read.nhn?oid=011&aid=0003604031&sid1=105&mode=LSD)

2019년 8월 20일에 한국에 미밴드4를 정식 출시할 예정인데.......

    - "미밴드4를 한국어로 현지화했다" ?????!!!!!


그래서 부랴 부랴 검색을 했다.

그런데, 응!? 정식 패치가 아니라 우리 훌륭한 한국 사용자들이 직접 폰트 패치를 구현했단다!!!!

(한국 총판에서 판매량을 늘리기 위해 기존 미밴드4를 위한 정식 패치를 빨리 배포하지 않을 거라는 소문도 있다.....)


출처 : https://cafe.naver.com/xst/365503


저런 분들은 존경을 받아 마땅하다!!!!!



1. 폰트 펌웨어 다운로드 받기

- 게시글(https://cafe.naver.com/xst/365503)에서 첨부파일을 다운로드 받자

- "MB4_Font_K.zip"


2. 압축풀기

- zip 파일 그대로 펌웨어 업데이트를 할 수 없다. 압축을 해제하자.

- "MB4_Font_K_최종.ft"


3. 업로드

- 폰으로 전송하자


4. 앱 설치

    - 펌웨어 업데이트를 하기 위해 앱을 하나 설치해야 한다.

    - "Notify & Fitness for Mi Band"



5. 커스텀 펌웨어 업데이트

- "Notify & Fitness for Mi Band" 앱 실행 후

- 오른쪽 위 막대기-바 메뉴에서 '도구' 항목을 선택하면

- 펌웨어 업데이트 메뉴가 나오고 '커스텀 펌웨어'를 선택 후

- 앞에서 업로드한 펌웨어를 선택하면 된다.


6. 뒷정리

    - 끝이다.....

    - "Notify & Fitness for Mi Band" 앱은 삭제해도 된다.



※ 필자의 미밴드4는 Global version이다. 내수용이 안된다는 말은 없는데... 혹시 몰라서...



이제 미밴드4에서 한글이 나온다~~~~~!!!! 우와~~~~~~~!!!

반응형

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

갤럭시탭7 (SHW-M180S) 최적화 하기  (3) 2013.09.08
Sony - LiveView  (0) 2012.07.25
갤럭시 탭 7 재정비  (0) 2012.07.01
[투싼] 스트럿바, 후드 인슐레이터  (1) 2009.11.29
[투싼] 연료펌프 리콜  (1) 2009.11.26

+ Recent posts