Development(67)
-
아파치 카프카(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 -
Java(Android), Objective-C, Swift(iOS), Python 문법비교
Java(Android), Objective-C, Swift(iOS), Python 문법비교 구분 Java Objective-C Swift Python C# import import android.content.Context #import "AppDelegate.h"#import import Foundation import mathfrom math import ceil, floor using System; 콘솔출력 System.out.println("Hello World");Log.v("tag", "Hello World"); printf(@"Hello World");NSLog(@"Hello World");print("Hello World") Swift.print("Hello World") print("H..
2018.05.18 -
GitHub large 파일로 푸시가 안될때
100mb 등의 큰 파일로 인해 로컬 커밋은 되나 리모트 저장소로 푸시가 안되는 경우는 다음 2가지 정도의 방법으로 해결이 가능하다. 1. 용량이 큰파일을 커밋 캐시에서 삭제하여 커밋을 하지않도록 클린(?)하게 만들고 푸시한다. 2. 애초에 큰 파일을 .gitignore 파일에 명시하여 처음부터 로컬에서부터 커밋하지 않는다. (2번의 경우는 .gitignore 파일에 미리 명시하여 우선적으로 이 파일만 커밋, 리모트에 푸시합니다) [ 1번 상세 ]1번의 경우 gitignore 파일조차 푸시하여 리모트로 올릴 수가 없는 상태이기 때문에 파일 제외는 캐시에서 삭제 후 푸시하는 수밖에 없다. 따라서 해당 로컬 저장소의 .git 디렉토리가 있는 최상위로 이동하여 다음 명령어로 캐시를 클린한다 $ git filt..
2018.05.04 -
아이폰(Swift)과 안드로이드(Java) 개발 함수 비교
1. 문자열 (String) 의 길이 swift 3.1 swift 4.0 android (java)let a = "123" a.characters.count let a = "123" a.count String a = "123" a.length() //3 *. swift 4.0 Documentation https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID297 2. 콘솔 로그 출력 swift 3.1 swift 4.0 android (java) print("123123..
2017.06.12 -
xcode - tableview의 cell의 seletect만 활성화 하고 싶을때
테이블뷰의 cell 하위뷰에 UIButton 같은 컴포넌트가 있을 경우 이를 감싸고 있는 상위뷰인 cell의 select 이벤트가 먹지 않는 경우가 있다. 이때는 해당 cell의 하위뷰의 컴포넌트의 클릭이벤트를 비활성화 하면 cell의 select 기능을 활용할 수 있다. 클릭 이벤트를 꺼야하는 하위뷰를 클릭 후, View 섹션에서 Interaction 의 "User Interaction Enabled" 옵션을 "해제"한다
2017.05.31