교육용으로 만든 자료를 정리한 것이다. IntelliJ Community Edition 은 무료지만, JAVA EE 지원이 되지 않습니다. 하지만, Smart Tomcat 이라는 플러그인을 설치하면 간단한 서블릿 웹 앱 프로젝트에 한해서 실행 및 디버깅을 진행할 수 있습니다. (1) Gradle 프로젝트 생성 Gradle 프로젝트로 새 프로젝트를 생성합니다. (2) Smart Tomcat 플러그인 설치 상단 메뉴 File => Settings 에 들어가서 좌측 탭의 Plugins 를 선택합니다. 그 뒤에 Smart Tomcat 을 검색하여 설치합니다. (3) build.gradle 편집 build.gradle 파일 상단에 (repositories 블럭 밑) 아래와 같이 입력해줍니다. sourceSets ..
(사진 출처: https://www.blueair.com/ 블루에어 공식 페이지) 내가 일하는 사무실에서 약 5년간 공기 청정을 담당하다가 얼마 전 집으로 오게 된 구형 공기청정기 블루에어 Pure211. 이 녀석을 구글 홈에 붙여서 음성으로 컨트롤하거나 원하는 시간에 꺼지거나 켜지게 할 수 있도록 인터넷을 연결해 보았다. 1. 기기 분석 - 개조 가능한지 살펴보기 첫 번째 할 일은 공기청정기를 분해해서 개조가 가능한지 살펴보는 것이다. 내가 생각했던 제일 좋은 개조 방법은 스위치 케이블을 ESP8266(아두이노를 탑재한) 에 연결하고, 다시 아두이노에서 공기청정기로 스위치 신호를 보내는 방법이다. 그렇게 되려면 구조가 간단해야 하는데... 기판을 분해해서 스위치 쪽 케이블 커넥터를 살펴보니 친절하게 설..
가끔씩 필요에 의해서 만드는 IOT 기기 프로젝트를 진행하면 제일 고민스럽고 귀찮은 것 중에 하나가 WiFi 연결과 서버 연결 설정을 만드는 부분이다. 이 프로젝트를 완성하기 전에는 소스코드 내에 하드코딩으로 무선 AP 의 SSID와 패스워드를 삽입해 버리거나 웹 서버를 동작시켜서 GET 파라미터 값으로 SSID 와 패스워드 그리고 mqtt 서버 주소를 입력하는 방법을 사용해왔다. 하지만, 최종 연결 상태를 확인하거나 추가 옵션을 붙이기가 만만치 않고, 중구난방으로 생겨나는 자작 IOT 기기들의 설정 방법들이 일관되지 않아서 유지 보수가 어렵다는 단점이 있었다. 그래서 일관된 방법으로 설정값을 넣기 위한 웹 설정 마법사 모듈을 단순하게 만들어봤다. 소스코드 및 사용방법: https://github.com..
참조 추가 => COM 에서 다음 항목들을 추가한다. 이후 아래의 코드를 사용하면 끝. 다만, 보안 문제가 있는 형식은 예외를 발생시키는데 이를 강제로 열 수 있는 방법을 찾아야한다. public static void WordToPDF(string docPath, string exportPath) { Microsoft.Office.Interop.Word.Document wordDocument; Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application(); // 경로, 파일 변환 대화상자 표시 안 함, 읽기 전용으로 열기 wordDocument = appWord.Documents.Open(..
예젠에 회사 블로그에 올렸던 글... 준비물 1. NodeMCU v2 WIFI 기능이 탑재된 가성비 좋은 마이크로 컨트롤러 보드입니다. 2. USB 와이어 LED 오픈마켓 등에서 'USB 와이어 LED' 로 검색하여 구입 가능합니다. 3. 브레드보드와 점퍼 케이블 납땜 없이 전자 회로를 구성하고 테스트 할 수 있습니다. 4. NPN 트렌지스터 - 2N2222 NodeMCU v2 소개 NodeMCU v2 에는 중국 에스프레시프 시스템사에서 개발된 wifi 기능이 탑재된 MCU, ESP8266-12E 모듈이 탑재되었습니다. 이 기기의 스펙을 간략하게 적어보면 다음과 같습니다. - 802.11 b/g/n 프로토콜 - Wi-Fi Direct (P2P), soft-AP - TCP/IP 프로토콜 - 80Mhz 클럭..
27인치 4K 해상도의 모니터로 이클립스를 열었을 때 조금 당황스러웠었다. 눈을 모니터에 가까이 가져가야 보일 정도의 작은 아이콘과 패키지 익스플로어의 깨알 같은 폰트들이 보였기 때문이다. 이런 경우 eclipse 디렉토리에 있는 eclipse.ini 파일을 열어서 가장 마지막 줄에 아래의 옵션을 추가해주면 된다. -Dswt.enable.autoScale=true -Dswt.autoScale=200 -Dswt.autoScale.method=nearest
JAVA 에서 특정 URL 경로로 데이터를 가져오기 위하여 URL Encoding 을 해야할 때 여간 귀찮은 것이 아니다.그래서 아래처럼 URLEncoder 클래스를 수정한 BorwerURLEncoder 를 만들었다. 사용법은 URLEncoder 와 동일하며, 마치 브라우저 창에서 URL 주소를 입력해 놓은 것처럼 출력되도록 하였다. BrowserURLEncoder.java import java.io.CharArrayWriter; import java.io.UnsupportedEncodingException; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; imp..
JAVA6 부터 자바 스크립트 엔진을 기본적으로 지원한다. (ps, 안드로이드에서는 자바 스크립트 엔진이 직접 포함되지 않는다. 그렇기 때문에 RhinoScriptEngine 프로젝트를 직접 적용해야 한다. https://github.com/mozilla/rhino) JAVA8 미만은 RhinoScriptEngine 을 사용하며, 8 버전에서는 NashornScriptEngine 을 사용한다. 하지만 사용방법은 동일하다. 물론 각 브라우저에서 사용할 수 있는 자바 스크립트 API 는 제공되지 않는다. 아래 예제는 콘솔을 통하여 두 수를 입력 받아 각각 함수와 객체를 이용하여 덧셈을 하고 그 결과 값을 출력해 주는 코드다. test.js : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ..
세 줄 요약. 1. JAVA 의 String 클래스는 유니코드로 처리되는 char 의 배열 이외에 어떠한 인코딩 정보를 갖고 있지 않는다. 2. String.getByte('인코딩명') 을 사용하여 인코딩 할 수 있으며, new String(byte[], "인코딩명") 을 사용하여 디코딩 할 수 있다/.3. EUC-KR 에서 UTF-8 으로 바꾸기 위해서는 EUC-KR ---> java.lang.String ----> UTF-8 과 같은 방식으로 변환 할 수 있다. 기본적으로 자바의 String 클래스는 2 byte 크기의 유니코드를 사용하여 문자열을 처리하는 Character 배열을 감싸고 있는 형태이다. https://docs.oracle.com/javase/8/docs/api/java/lang/Ch..
API 서버를 개발하다보면 아래와 같이 간단한 JSON 타입을 Response 값으로 반환해야 하는 경우가 종종 생긴다. { "success" : true, "id" : 1024, "items" : [0,7,9,12], "status": { "method" : "get", "code" : 202 } } 만약 위 값이 일회성이라고 가정할 때, GSON 같은 도구를 사용하기 위하여 객체로 만들거나 스트링을 사용해서 이어 붙이기에는 구현하기가 복잡하거나 귀찮아 지는 경우가 종종 발생한다. 그래서 이런 귀찮은 작업들을 간단하게 줄여주는 코드를 만들었고, 공유한다. JsonMaker.java 파일을 만들고 아래 주소에 있는 코드를 붙여넣기 하여 사용할 수 있다.https://gist.github.com/ice3x..
값비싼? FTDI 가 달려있는 아두이노나 짭두이노에 대한 설치 자료를 인터넷 검색을 통하여 쉽게 찾아볼 수 있지만, 최근 온라인 쇼핑몰에 심심치 않게 등장하는 초 저가형 짭두이노는 CH340 라는 USB 시리얼 변환 드라이브를 사용한다. (요즘 알리 익스프레스에 접속하면 자동으로 한글로 번역되어 나오는데, 차라리 영어가 낫다...) 특히 아두이노 나노와 호환되는 초 저렴한 짭두이노를 많이 찾아볼 수 있는데, 이 블로그 포스팅을 작성하고 있는 15.11.23 기준으로 가장 싼 녀석이 1.75 달러다. 현재 환율로 따져보면 초코파이 한박스보다 싼 가격으로 아두이노를 구입할 수 있다. 이렇게 다른 짭두이노보다 가격이 저렴한 이유는 FTDI 와 같은 비싼 드라이버 대신 CH340 (ch340g, ch341) 이..
이클립스로 작성된 다양한 프로젝트들을 의존하는 프로젝트를 생성하는 경우 인코딩 문제로 당황스러울 때가 종종 있다. 만약 여러개의 프로젝트내의 소스 파일들이 각각 다른 인코딩으로 저장되었을 경우 이 것을 한 번에 utf-8 로 바꾸는 방법에 대하여 알아볼 것이다. 1. 텍스트 파일 (혹은 java 파일) 의 인코딩 정보 가져오기 Text 파일 혹은 Java 소스 파일의 인코딩을 확인하는 방법은 여러가지가 있지만 가장 정확하면서 간단한 방법은 바로 juniversalchardet (https://code.google.com/p/juniversalchardet/) 라이브러리를 사용하는 것이다. (무식한? 방법으로는 파일을 읽어서 테스트 하려는 인코딩의 스트링으로 변환하고 character 배열을 받아 0xff..
프로젝트 코드 및 회로도는 아래 주소에서 확인하세요. https://github.com/ice3x2/Wifi_Humidifier 아두이노를 취미로 시작한지 1년이 지났다. 그 이후로 수집벽이 생겼는데, 센서나 부품을 쓰지도 않으면서 알리 익스프레스를 통하여 모으는 일이다 덕분에 책상 위에 온갖 센서들이 굴러다닌다. 초창기에 구입한 ESP8266 ESP-1 도 그 중에 하나인데, 사놓고 사용하지를 않아 아까워서 이번 프로젝트에 사용하게 되었다. 단, ESP8266은 80Mhz 와 메모리 32kbyte 의 뛰어난 성능을 갖고 있는데, 그 자체로 IOT 플랫폼으로 사용할 수 있다. 하지만 ESP-1은 최신 버전인 ESP-12 와 다르게 사용할 수 있는 GPIO 포트가 얼마 되지 않고 아날로그 입력을 받도록 처..
이전에 아두이노 IDE 1.0.x 버전 기준으로 Attiny85 부트로더 굽는 법과 삽질 경험에 대하여 포스팅(http://www.dev.re.kr/59) 했었는데, 아두이노 IDE 1.6.4 버전 이상과 그 안에 포함된 개개선된 ISP 코드 덕분에 이제는 부트로더 굽는 것이 더 쉬워졌다. 콘덴서나 저항을 reset 버튼 사이에 연결하거나 수정된 ISP 를 따로 구해서 사용할 필요가 없어졌다. 이번 시간에는 1.6.x 버전을 이용하여 간단하게 부트로더를 굽는 방법에 대하여 언급할까 한다. 이 포스팅은 Arduino UNO 기준으로 되어있다. 1. Attiny85 라이브러리 설치하기. 먼저 환경설정 메뉴에 들어가면 아래와 같은 화면이 나오는데, Additional Boards Manager URLs 의 텍..
1. DHT22 와 라이브러리 구하기 내가 자주 이용하는 알리 익스프레스에서 3달러 라는 저렴한 가격에 판매되고 있다. 국내 쇼핑몰에서도 많이 판매되고 있다. github 에 공개된 오픈소스 라이브러리를 다운 받아서 압축을 풀고 아두이노 프로젝트 폴더 내의 라이브러리 폴더에 붙여 넣는다. DHT22 라이브러리 : https://github.com/nethoncho/Arduino-DHT22 예제코드 : https://github.com/nethoncho/Arduino-DHT22/blob/master/examples/Serial/Serial.ino 예제코드를 보면 매우 간단한 사용법을 확인할 수 있다. 예제코드 실행 결과. 2초에 한 번씩 온도와 습도를 불러온다. 2. DHT22 를 활용한 인터넷 온도/습도..
이번 포스팅에서는 ENC28J60 를 이용하여 아두이노를 웹서버로 만들어 보겠다. 아두이노 모델중에 가장 많이 사용되는 UNO 에 탑재된 ATmega328의 2kbyte 라는 개미 코딱지 같은 메모리를 활용하여 그럴싸한 html 문서를 보여주는 웹 서버를 만드는 것은 쉽지 않은 일이다. 응용 소프트웨어 서버로 사용하기에는 조악한 성능을 갖고 있다. 그 때문에, 아두이노를 웹 서버로 사용하게 된다면 센서를 통하여 데이터를 수집하고 REST로 값을 전달해 주는 기능이나 물리적 장치 제어를 위한 컨트롤러 이상으로 확장하기는 어려울 것이다 . 하지만 이번 포스팅에서는 아두이노를 웹서버로 만들어 재미있는 것들을 만들어보고자 한다. (조만간 안 귀찮을 때 WIFI 사용도 같이 다뤄보고자 한다. ) 1. 이더넷 모듈..
// SDK 22 기준.view.setDrawingCacheEnabled(true);// 임의로 measure 와 layout 을 호출한다. //view.measure(View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY), // View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY)); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIF..
TDD 코드를 작성하는데, Private 메소드는 아주 귀찮은 존재입니다.잠시 public 으로 바꿔서 테스트 하거나 또는 리플렉션을 사용하여 실행 시키는 방법등이 있는데, 여러가지로 피곤함을 가중시켜요. 그러나 이런 문제를 해결하기 위한 PowerMock 과 같은 도구가 있습니다!! https://code.google.com/p/powermock/ 하지만, Android 테스트에서 Robolectric 과 Mockito 를 사용하는데, 여기다가 PowerMock 까지 붙이면 Exception 을 뿜으며 문제가 생기네요.(혹시 문제 해결책을 아시는 분 있으면 알려주십쇼..ㅠㅠ) 어쨌든 위와 같은 문제를 해결 하느라 약간의 삽질을 하다가, 허접하게 나마 아래와 같이 좀 더 편하게 private 메소드를 실..
이 슬라이드를 보고 암이 치료되었습니다... 위 슬라이드 내용을 아래와 같이 정리해 봤다. Base :: Objects.equal(), Objects.hashCode(), MoreObjectes.toStringHelper(), ComparisonChain.compare() public class Employee implements Comparable{ public String name; public Integer age; public Job job; @Override public boolean equals(Object o) { if(!(o instanceof Employee)) return false; Employee that = (Employee)o; return Objects.equal(name, t..
Application 클래스 내부 메소드인 registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) 를 이용해야 한다. 이 메소드의 인자값으로 ActivityLifecycleCallbacks 를 상속받아 구현한 클래스의 인스턴스를 넣어준다. 또는 다른 Activity 나 Service 내부에서 getApplication(). registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks { ... }) 와 같이 호출해 주는 방법도 있다. registerActivityLifecycleCallbacks 을 더이상 사용하지 않을때는 unregisterActivityLifecycleCallbacks(A..
사실 앱 위변조 방지는 프로가드만 잘 적용하면 어느정도 방지할 수 있다. 하지만, 클라이언트 앱을 역컴파일 한다면 서버 API 가 노출되는 것을 쉽게 막을수도 없는일이다. 사실 이 문제에 대하여 당장 떠오르는 해결책은 NDK 를 사용하여 서버와 통신하는 것이다. 하지만 서버의 모든 API 호출을 C/C++ 로 구현하기에는 시간적 인적 비용이 부족한 많은 프로젝트에서는 거의 불가능에 가깝지 않을까 생각한다. 그래서 시간이 없는 상황에서는 다음과 같이 간단한 방법을 이용할 것을 권장한다. 코드상에서 서명 값을 가져와서 서버와 첫 접속시 이 값을 보내준다. 서버에는 앱의 서명 값이 이미 저장되어 있으며 이 것을 클라이언트로부터 받은 서명값과 비교하여 위변조된 앱인지 검출하는 것이다. 즉, 앱 빌드시 다른 인증..
앱의 위변조를 방지하기 위하여 서명 값을 가져와서 서버에 미리 등록된 값과 비교하는 과정이 필요하다.하지만, 안드로이드 Java 코드상으로 제공되는 API 를 활용하는 것은 안전하지 못하다.(안드로이드 자바 코드상에서 서명 값 가져오기 : http://www.dev.re.kr/70) 그렇기 때문에 JNI 를 활용해야 한다. context 를 인자값으로 받아서 jni 에서 제공되는 리플렉션을 사용하여 SHA1 으로 변환된 서명 값을 가져오는 코드를 첨부한다. 주의할 점은 아래 코드는 C++ 로 작성되었기 때문에 C 에서 사용하려면 약간의 수정이 필요하다. 이를테면 env->GetObjectClass(context); 를 C로 표현 하려면 (*env)->GetObjectClass(env, context); ..
우선 안드로이드 APK 파일은 JAR 와 호환되는 형태로 되어있다. 즉, 코드를 빌드를 하여 나오는 APK 파일은 zip 포맷과 유사한 jar 와도 비슷하다. 특히 서명에 대한 방식은 JAR 와 APK 와 매우 비슷하다. 실제로 서명을 사용해 빌드된 APK 파일 확장명을 zip 으로 변경하고 압축을 풀어보면 META-INF 디렉토리 내부에 이와 관련한 파일이 생성된 것을 볼 수 있다. 이 파일은 MANIFEST.MF, CERT.SF, CERT.RSA 파일이다. MANIFEST.MF 파일은 텍스트로 되어있으며 META-INF 디렉토리 내부의 파일을 제외한 APK 패키지 내부 모든 파일(Entry)에 대한 리스트를 보여준다. 각 리스트의 항목에는 파일 경로와 각 파일의 SHA1 해쉬 값(파일을 읽어서 만든다..
APK 파일의 압축을 풀면 classes.dex 파일과 그리고 String 과 drawable 과 같은 리소스 맵핑 정보를 담고 있는 resources.arsc 파일등과 AndroidManifest.xml 파일 외에 res 폴더 내에 여러 XML 파일등이 존재한다. 하지만 이 XML 파일은 우리가 흔히 아는 형식으로 되어있지 않다. 왜 APK 파일 내부에 있는 AndroidManifast.xml 을 비롯한 XML 파일들은 우리가 알고 있는 XML 형식이 아닌걸까? 아마도 공간을 정약하고 런타임 환경에서 빨리 리소스 정보를 읽어들일 수 있도록 바이너리 타입으로 만들었을 것이다. 안드로이드에서 사용하는 바이너리 타입의 XML 포맷에 대하여 아래 사이트에서 자세하게 설명하고 있다. https://justana..
지난 포스팅 : - 안드로이드 스튜디오에서 NDK 로 C++ 빌드하기 (Hello World 예제) 이번시간에는 NDK 를 이용하여 HTTP 통신하는 법을 알아보겠다. C/C++ 에서 HTTP 를 통신하기 위한 가장 흔한(?) 방법은 curl 을 사용하는 것이다. 그러기 위해서 curl 라이브러리를 android 에서 동작 하도록 컴파일 해야 하는데, 이는 삽질을 동반한 작업들을 해야만 한다. 그래서 이미 빌드된 정적 라이브러리를 사용하는 효율적이고 빠른 방법에 대하여 알아보겠다. 우선 android 용으로 각각의 CPU 별로 깔끔하게 빌드된 정적 라이브러리(.a) 파일을 구해야 한다. 빌드된 curl 을 구하기 위하여 github 와 구글을 한참 검색해 보다가 문득 cocos2d-x 에서 curl 을 ..
아래 내용은 mac 기준으로 작성 되었습니다. 1. 안드로이드 개발자 사이트에서 NDK 를 받아야 하지만, STL 과 Boost 를 사용하기 위해서 별도의 작업을 더 해야한다. 하지만, CrystaX 를 사용하면 쉽게 적용할 수 있다. 아래 사이트에서 최신 버전의 CrystaX 를 다운받고 압축을 푼다. 용량이 큰 것으로 받는다. 압축을 풀면 5GB 가 넘는다... https://www.crystax.net/en/download 2. 프로젝트를 생성한다. 3. 프로젝트의 app/src/main 폴더 안에 jni 폴더를 생성한다. 4. 아래 과정은 최초 한 번만 진행하면 된다. (아래 내용은 http://blog.burt.pe.kr/ 에서 참고하였습니다.) - javah 설정하기. (1) AndroidSt..
FileObserver 안드로이드에서 제공하는 파일 모니터링을 위한 API 인 FileObserver 에 대하여 알아보겠다. FileObserver 는 안드로이드 내부에 접근할 수 있는 각각의 파일과 디렉토리의 접근이나 변경에 대한 이벤트를 비동기적으로 받아올 수 있다. 이 클래스는 리눅스 커널에서 제공하는 파일 감시 모듈인 inotify (클릭시 위키로 이동) 의 네이티브 API 들을 JNI 를 통해서 호출한다. FileObserver 를 사용하면 내부적으로 쓰레드 하나가 (static 으로)생성된다. 우선 기본 사용법에 대하여 알아보자. (참고 페이지 - 안드로이드 레퍼런스 : http://developer.android.com/reference/android/os/FileObserver.html) ..
아두이노 에서 사용하는 마이크로 컨트롤러는 작은 양의 RAM 공간을 갖고 있습니다. 아두이노 우노 에서 사용하는 ATmega328 계열은 고작2Kbyte 의 공간을 갖고 있으며 기본적으로 200에서 300byte 정도의 메모리가 소비되는 것을 볼 수 있었습니다. 스케치 코드를 짜면서 무분별한 변수 선언이나 지나친 메모리 할당은 아두이노 스케치가 오동작 할 수 있는 상황을 야기시킬 수 있기 때문에 코딩중 고심하게 만드는 부분중에 하나입니다. 심지어 메모리 누수(Memory leak) 버그가 발생하면 코딱지 만한 메모리 공간은 쓰레기로 가득 찰 것입니다. 다행히도 아두이노에 남아있는 메모리 사용량을 실시간으로 체크할 수 있는 방법이 존재합니다. 그리고 그것을 라이브러리로 쓰기 편하게 만들어 주신 분도 있습니..
우선 해외 사이트 중에 Attiny85 에 아두이노를 올리는 것에 대해 자세히 나와있는 아주 좋은 포스팅이 하나 있다.http://highlowtech.org/?p=1695 하지만, 이 포스팅을 보고 순서대로 따라해 보았지만 동작하지 않았다. 대략 원인은 위 포스팅에 나와있는 아두이노 우노 R2 에서는 잘 올라가지만 직접 테스트 해본 아두이노 우노 R3 에서는 문제가 발생하는 것으로 예상하고 있다. 물론 아두이노 (호환)나노, 아두이노 (호환)미니 에서도 동작하지 않았다. 위에 링크로 올린 http://highlowtech.org/?p=1695 에서는 아주 간단한 방법으로 부트로더도 올리고 Blink 예제도 올리고 있지만, 앞서 언급한대로 잘 되지 않으므로 정공법으로 부트로더를 올리고 스케치 프로그램을 ..
- Total
- Today
- Yesterday
- 침블락
- Iot
- 블루투스
- WS2812B
- 개발
- activity
- ESP8266
- NeoPixel
- noidemcu
- 안드로이드
- ATtiny85
- Cheapduino
- Java
- ENC28J60
- oled
- 칩두이노
- 부트로더
- 아두이노
- 병렬 프로그래밍
- 스마트 무드등
- 가습기
- Android
- arduino
- 안드로이드 개발
- bluetooth
- 이더넷
- 알리익스프레스
- ndk
- json
- HC-06
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |