Development(71)
-
안드로이드 스튜디오 유용한 단축키
코드 자동정렬 블럭을 지정한 뒤, 'Ctrl + Alt + L' (mac : ⌘ + option(alt) + L)
2020.06.14 -
스프링 부트 : Restful API 서버 만들기 - 1 of ?
잘 알지는 못하지만 .. 스프링 부트를 공부해서 포스팅을 남겨본다.... 기본적인 셋팅 등이나 설계를 검색하느라 아까운 시간을 허비할 수 있으니.. 스프링 부트의 경우 스프링과 비교하여 아주 심플하게 API 서버 프로젝트를 만들 수 있다. 다만.. 당연한 이야기일 수 있으나 아래와 같은 상황에 따라 프로젝트의 양이나 복잡도가 달라진다고 할 수 있다. 1. 원천 데이터의 형태 : RDBMS, NoSQL, Hadoop 등 : 어떠한 곳에서 원천 데이터에서 정보를 가져와서 클라이언트에 보내줄지를 정해야 한다. 2. 캐시 데이터 사용 여부 : 클라이언트의 정보 요청을 받을때마다 계속 원천데이터를 새롭게 읽어들일 것인지, 그렇게 계속 Read하여 실시간으로 최신정보를 리턴할 필요가 없는지 (예를 들어 1시간 주기..
2020.05.15 -
인텔리제이(intelliJ) maven project / Gradle project jar 배포
인텔리J 2020.1월 버전 기준 인텔리j에서 jar를 배포하는 것은 프로젝트 구성 방식이 maven 인지 gradle 인지에 따라 달라진다. *. jar란? JAR는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷 - https://ko.wikipedia.org/wiki/JAR_(파일_포맷) (1) [ Maven Project 에서 jar 배포 ] [ 스프링 부트 maven Project 에서 jar 배포를 할때에는 아래 작업부터 선 진행함 ] 1) pom.xml 수정 1. properties 항목 확인하여 추가 수정 *. jar 실행시 실행되는 첫 클래스 지정 :..
2020.05.11 -
아파치 카프카(Kafka) : 스프링부트 환경 구축 - 3 of 3
스프링과 스프링부트의 큰 차이점 구분 스프링 스프링부트 bean xml로 관리 자바 클래스로 관리 목적 둘다 비슷 둘다 비슷 스프링 부트로 프로젝트를 구성하면 스프링에 비해 잡다한 구성이 사라지기도 하고 (심플해짐) 카프카의 경우 MVC 패턴등의 뷰가 꼭 필요한 프로젝트 구성이 아니기에 부트를 쓰는 것이 적합하다고 본다.. 특히 서버 시작도 스프링부트 매우빠르고 가볍다. 스프링 설정의 고통을 느껴본자는 스프링부트의 매력에 빠질수밖에 없다. 그래서 카프카 프로젝트의 큰 구성은 [구성] 1. 어플리케이션 클래스 2. 카프카 설정 클래스 (이걸 따로 설정파일로 빼고 하는 방식 (별도 yml 등이나 프로퍼티 파일로 분리)이 유동적으로 대응하기 편함..) 3. 프로듀서, 컨슈머 클래스 4. 각종 클래스를 auto..
2020.05.08 -
아파치 카프카(Kafka) : 설치 및 실행 - 2 of 3
아래도 역시 mac을 기준으로 작성하였으면 수많은 블로그들과 레퍼런스, 오픈 소스를 참조하여 실제 동작이 가능한 부분들로 작성하였다. 오늘의 순서는 다음과 같다. (1) 카프카, 주키퍼 설치 및 실행 (2) 토픽 생성 (3) 프로듀서, 컨슈머 클래스 생성 및 빌드(jar 만들기) (4) jar 실행 *. 본 구조는 1 broker, 1 topic 이라는 아주 기본적인 환경으로 구성되어 있음. (1) kafka & zookeeper 설치하기 1) 카프카 및 주키퍼 설치 $ brew install kafka $ brew install zookeeper 2) 주키퍼 실행 $ zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties To have lau..
2020.04.29 -
아파치 카프카(Kafka) : 설치 및 실행 - 1 of 3
아마도 카프카는 여러 용도(높은 처리량이 필요한 통계 집계&처리, 메세지 처리 등)가 있지만 플룸과 비교했을때 목적이 다소 다르다. (많이 다르다고 해야할수도) 어느쪽으로 전달하게 된다는 주 목적은 같지만 어느 정도의 용량을 어떻게 분산처리할까 말까에 대한 선택지에서의 대용량 분산처리와 메세지 처리라면 카프카쪽이, 단순히 로그파일의 적재에 따른 전달, 분류, 적재에만 포커스를 맞춘면 플룸쪽이 나을 것으로 판단된다. (말은 누가 못하리) 이벤트 버스, 이벤트 드리븐, 옵저버 패턴이 시조새 안드로이드 개발을 하다보면 정말 한번쯤은 들어볼수밖에 없는 라이브러리가 있는데 다름아닌, 바로 "이벤트 버스(event bus)"이다. 아주 간단히 설명하자면, 버스는 정해진 목적지(밤깊은 마포종점~)를 가지고 계속 한쪽..
2020.04.27 -
Flume 설치 및 기본 설정, sink 테스트 - mongoDB sink 2 of 2
몽고DB로 적재할 원천 데이터는 심플하게 키와 밸류로 이루어진 json이 들어있는 "로그파일"이며, (이 로그파일은 웹서버 등에서 자동으로 적재될 것을 가정하였기에 테스트 단계에서는 수동으로 파일을 생성하였다) 전체적인 동작은 flume-ng 가 로그파일들을 읽어서(spooldir이라는 방식사용) sink로 보내면 sink가 몽고DB로 보내는 모양이며, 공식 레퍼런스 그림을 토대로 재구성하여 주석을 달면 아래와 같다. (빨간색) 오늘의 조리법은 크게 다음과 같다. (1) 로컬 mongo db 셋팅 : flume database, admin 유저, json 컬렉션, 유저 권한 셋팅 (2) flume.conf 파일 셋팅 : spooldir 방식 (3) mongo db로 로그파일의 json을 insert하는 ..
2020.04.24 -
Flume 설치 및 기본 설정, sink 테스트 - mongoDB sink 1 of 2
플룸 설치 및 기본 설정을 통해 telnet 으로 logger 를 보는 sink를 지난 포스트에서 해보았다면 이번에는 sink 방식을 mongoDB와 연결하는 방식이다. 지난시간과 마찬가지로 나는 아직 나의 mac을 중고로운 평화나라에 팔지 않은 상태이므로 아래의 모든 내용은 mac을 기준으로 한다.. 오늘의 요리 순서는 다음과 같다. (1) flume.conf 파일 수정 : mongoDB sink 향으로 수정 (2) mongoDB sink 를 수행하는 java jar 만들기 (3) sink jar를 flume의 lib 디렉토리에 넣기 (4) flume 실행 [ 사전 준비 ] 미리 준비해야 할 사항은 로컬에 mongoDB client 가 설치되어 있는 편이 좋으며, 사전지식으로 java 패키지를 jar로..
2020.04.21 -
Flume 설치 및 기본 설정, sink 테스트 - logger sink
나중을 위해서라도 기본 환경에서 크게 벗어나지 않은 심플(하지 않지만..)버전의 플룸의 설치와 설정, sink를 기록해본다.. 아래 전부는 mac 환경을 기준으로 하고 있다. "1 소스 - 1채널 - 1싱크" 구조의 로컬 테스트를 위한 전체적인 셋팅 순서. (1) flume 설치 (2) 맥 환경변수 설정 / flume 실행 스크립트 내의 변수 설정 (3) flume의 기본 설정파일을 복사해서 수정 (4) flume 실행 (5) "데이터 소스 연결" : 로컬 환경에서 flume쪽으로 정보를 전송해서 수신하는지 확인 (1) flume 설치 - homebrew를 통해서 설치 1) 홈브류(HomeBrew) 레파지토리 최신화 $ ruby -e "$(curl -fsSL https://raw.githubusercon..
2020.04.20 -
모바일앱의 필수개념, 프로세스와 쓰레드
프로세스와 쓰레드 모바일 개발을 위해서 꼭 거쳐야 하는 작은 관문이 하나있다. 어려운 개념은 아니지만 이를 이해하지 못한 상태에서 앱을 개발하다보면 크래시 현상으로 원인을 찾지 못하는 경우도 있고 (물론 크래시가 날때 로그창에서 로그로 원인을 알려주지만) 하여 간단히 "프로세스"와 "쓰레드"의 개념을 잡고 가야한다. 프로세스 컴퓨터를 살때 CPU에 듀얼코어, 헥사코어라며 성능이 좋아요~ 따봉을 많이 받은 리뷰를 본적이 있을 것이다. 그 코어가 프로세스라고 생각하면 된다. 프로세스는 독립적으로 행동을 보장받는 "공간"이기때문에 보통은 앱들을 동시에 사용하는 멀티태스킹(스마트폰 초기에 아주 획기적인 기능이었다..)이 가능하게 되고, 멀티 태스킹이라는 말 자체가 멀티 프로세스로 여러개의 앱이 서로의 독립적인 ..
2020.04.16 -
Xcode의 유용한 단축키
Xcode의 유용한 단축키 파일 바로 찾기 ⌘ + ⇧ + O 클래스에서 특정 라인으로 이동 ⌘ + L 코드 자동정렬 원하는 코드를 블럭으로 씌운뒤 control + I (대문자 i)
2020.02.28 -
Android Realm 데이터베이스 사용하기
1. 안드로이드 스튜디오 프로젝트에서 프로젝트 레벨의 build.gradle 에 realm 레파지토리 추가 buildscript { repositories { jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:6.0.0" } } 2. 안드로이드 스튜디오 프로젝트에서 앱 레벨의 build.gradle 에 plugin 추가 apply plugin: 'realm-android' 3. realm 에서 사용할 오브젝트 클래스 (실제로 DB에 들어갈 기본 틀) 만들어 놓기 public class Dog extends RealmObject { private String name; private int age; // Getter, Setter 도 함..
2019.10.25 -
RxJava1 에서 map 반복문
Map bodyData = new LinkedHashMap(); bodyData.put("key1", "val1"); bodyData.put("key2", "val2"); bodyData.put("key3", "val3"); Observable entries = Observable.from(bodyData.entrySet()); //사이즈만큼 반복 entries.subscribe( value -> { String k = value.getKey(); //키값 String v = value.getValue(); //밸류 });
2019.08.28 -
안드로이드 백그라운드 정책 - 버전별 차이 및 WorkManager
안드로이드의 버전별 백그라운드 정책은 공식 문서에 아래와 같이 정의하고 있습니다. (https://developer.android.com/guide/background/#challenges_in_background_processing) Android 6.0 (API level 23) introduced Doze mode and app standby. Doze mode restricts app behavior when the screen is off and the device is stationary. App standby puts unused applications into a special state that restricts their network access, jobs, and syncs. And..
2019.08.23 -
자바스크립트 - GPS 정보 가져오기
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function(location){ //succ - 유저가 허용버튼을 클릭하여 값을 가져올 수 있는 상태 var lat = location.coords.latitude; var lon = location.coords.longitude; }, function(error){ //fail - 유저가 차단버튼을 클릭하여 값을 가져올 수 없는 상태 } ); } else { //fail - 애초에 GPS 정보를 사용할 수 없는 상태 }
2019.03.21 -
[안드로이드] 에뮬레이터 에러별 대처방법
1. 빌드는 되는데, 런타임시에 unexpected cpu variant for x86 using defaults : x86 JIT profile information will not be rocorded : profile file does not exits. 과 같은 오류 로그가 나오는 경우 아래와 같이 앱을 구동하는 에뮬레이터가 google play + x86 으로 셋팅된 에뮬레이터로 실행한다.
2018.12.18 -
FireBase 를 사용하기 위한 안드로이드 스튜디오 필수 설정
FireBase 를 사용하기 위한 안드로이드 스튜디오 필수 설정 FireBase를 사용하고자 할때 안드로이드 스튜디오의 필수 라이브러리들을 셋팅하는 과정에서 일명 빨간줄이 나타나서 빌드가 어려운 경우가 많습니다. 이때 확인하여야 할 기본적인 셋팅값은 다음 스샷들과 같습니다. (2018년 11월 말 기준) *firebase 의 채팅(실시간 DB), 얼굴 인식 등의 기능을 사용한다고 가정시 1. Project 수준의 build.gradle 파일 1) buildscript - dependencies 내용classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.google.gms:google-services:4.1.0'2) apply 문구 추가apply ..
2018.11.22 -
안드로이드 단말기 dpi와 디자인 가이드 적용방법
안드로이드 단말기 dpi 단위와 디자인 가이드 적용방법 [ 1인치당 픽셀수 표 ]ldpi : 120dpi mdpi : 160dpi (기본) *. 1dp 가 1px 로, 1:1 매칭이 됩니다.hdpi : 240dpi xhdpi : 320dpi (h + 80)xxhdpi : 480dpi (h + 240, x + 160) xxxhdpi : 640dpi (h + 400, xx + 160) *. px 값 얻기 = dp * 단말 DPI / 160*. dp 값 얻기 = px * 160 / 단말 DPI 보통 안드로이드 개발을 진행하면, 디자이너로 부터 "어떻게 가이드 잡아드릴까요?" 라는 질문을 받습니다. 안드로이드는 단말기의 파편화가 심각해서 (종류만 4천개가 훌쩍 넘습니다..) 디자인을 깔끔하게, 그리고 디자이너 ..
2018.08.17 -
머신러닝 기반의 글자 인식 개발 - swiftOCR
머신러닝 기반의 글자 인식 개발 - swiftOCR 소개 2018/07/31 - [공지사항] - [티스토리 초대장 배포] 2018년 8월 티스토리 초대장 6장 배포합니다. 우선 글을 포스팅하기에 앞서, 회사 업무간 필요한 QR Code 생성, 스캔에 대해 말씀을 드려야 겠군요. 회사에서 SDK 기능을 탑재한 샘플 앱을 애플 앱스토어에 런칭하기위해 기능을 개발하던 중, 텍스트를 폰에 넣는 것이 불편하여 ( 기존에는 이메일로 텍스트 문구를 보내고 그 이메일을 폰에서 열어서 복사하는 과정.. ) 웹에서 텍스트를 QRCode 로 생성하여 폰에서 바로 QR Code를 스캔하면 텍스트를 복사할 수 있기에 해당 기능을 구현을 하던 차, 요즘 핫하다는 카메라 번역 이 떠올랐습니다. 초창기에는 카메라로 사진을 촬영해서 ..
2018.07.31 -
Objective-C 프로젝트에서 image not found 에러가 날때
Objective-C 프로젝트에서 Swift로 구성된 라이브러리(framework)를 사용할 때, 빌드는 정상적으로 이루어지나 런타임때 image not found 와 같은 에러 메세지가 콘솔에 나올때는 Xcode에서 다음과 같이 Build Settings - [Always Embed Swift Standard Libraries] 설정을 Yes로 변경해야 합니다.
2018.07.05 -
[블록체인] 블록체인 관련 오픈소스, 예제, 샘플 사이트 소개합니다.
[블록체인] 블록체인 관련 심플한 오픈소스, 예제, 샘플 사이트 소개합니다. 블록체인 기술이 나온지는 좀 되었지만, 어디서 어떻게 구현되었는지 궁금하실 분들이 계실 것 같아 직접 오픈소스 형상관리 사이트인 GitHub를 돌아다니며 정리해보았습니다. 각각의 블록들이 서로 연관되어 있기때문에 어떠한 블록 뒤에 붙는 블록은 앞의 블록들의 정보들을 모두 포함하고 있고, 그것이 체이닝(쇠사슬처럼 연결)되어 점점 위변조가 어려워지는 기술이라고 이해하면 되실 것 같습니다. (일각에서는 자료구조의 링크드 리스트의 연장선상일뿐 특별한 것이 없다고도 합니다만 이 링크 정보를 분산해서 저장하기 시작하면 고도화 된 기술이라고 보는게 맞겠다는 생각도 합니다.) 1. [파이썬] - 심플하게 구성된 블록체인 기술 linked li..
2018.07.05