목록2018/10 (20)
오늘도 공부
Flutter Youtube 화면 개발이 내용은 Google IO 2018 Busan 에서 조성윤님이 발표하신 내용을 기반으로 했습니다. 부산에서 진행된 flutter 2주차 스터디 내용입니다. 1주차 스터디 : TodoList 화면 개발전체 소스는 Github 에서 받으실수 있습니다.2주차 스터디는 Youtube Api를 활용해서 화면 구성을 공부해보는 시간을 가져봅니다. 이번시간에 배우는 부분은 아래와 같습니다. Youtube Api 조회Json decoding -> dart class 로 변환하는 방법FutureBuilder 로 비동기로 위젯 구성하기우선 프로젝트를 기본적으로 구성을 해봅니다. main.dartmaterial 테마를 가져옵니다. src/app.dart 를 import 해서 패키징 합..
adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png adb shell rm /sdcard/screen.png출처 : https://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html
Docker&Kubernetes 4주차 스터디 정리1주차 스터디Dockerfile을 이용한 서버 배포2주차 스터디Docker-compose 입문3주차 스터디github를 통해 aws ec2로 자동 배포 #1스터디 내용Github 배포Travis CI 환경설정 추가 및 구성ec2 elastic beantalk 구성 및 자동 배포개발 flow준비물Github 계정Travis CI 계정AWS Free tier 계정그럼 시작해보자. Github 설정깃헙 레포를 만든다. 현재 소스를 깃헙 레포와 연결한다. 깃헙에 푸시한다. git init git add . git commit -m "first commit" git remote add origin https://github.com/bear2u/docker-reac..
Flutter Simple TODO(할일관리) List첫번째 수업에서는 Dart와 Flutter를 살펴보고 ToDoList App 을 만들어보도록 할 것이다. 이 내용은 부산에서 진행된 Flutter 스터디 1주차를 정리한 내용입니다.소스는 여기에서 받을수 있습니다.Stateless 와 Stateful WidgetStateless 는 동적으로 변하지 않는 위젯Stateful 은 동적으로 변할수 있는 위젯Stateful 구현은 createStateState 상속된 클래스 구현모든 Widget은 build 함수를 필수import 'package:flutter/material.dart'; void main() => runApp(new TodoApp()); class TodoApp extends Stat..
도커 & 쿠버네이트 3주차 스터디 정리이번 시간에는 실제 운영되는 배포까지 실습해보겠다. 소스는 여기에서 확인가능하다. https://github.com/bear2u/docker3 기본적으로 프로세스는 다음과 같다. Development -> Testing -> Deployment -> Developm...개발자가 소스를 github feature 브랜치에 푸시그럼 마스터 브랜치에 PR을 요청하면그럼 Travis CI 에서 테스팅을 진행테스팅을 진행해서 문제가 없는 경우 마스터 브랜치에 머지aws에 정상적으로 배포그럼 실습을 진행해보자. 우선 노드와 React를 이용할 예정이다. 노드 버전을 체크 해보자. node -v v8.11.3만약 설치가 안된 경우 os에 맞는 노드를 설치하자. 그럼 리엑트 프..
배달앱 클론 3주차 내용메인화면에서 ListActivity 로 이동메인화면에 RecyclerView 를 등록 한 후에 GridLayoutManager 를 등록한 후 일것이다. 그럼 Adapter 에 클릭 이벤트를 등록해서 ListAcitivity 로 이동 처리 한다. fun T.listen(event: (position: Int, type: Int) -> Unit): T { itemView.setOnClickListener { event.invoke(adapterPosition, itemViewType) } return this }MainRecyclerViewAdapteroverride fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHold..
보통 이런 오류는 lazy 하게 네트워크 상태가 늦어지거나 할 경우 이미 위젯은 dispose가 된 상태인데 setState 를 호출 하는 경우로 보인다. 해결법은 간단하게 onDispose 함수에서 변수 하나 선언해서 true / false 로 해주면 된다. 라이프사이클에 대해서 궁금하면 여기 로 가서 한번 보고 오자. 우선 이렇게 변수를 지정 후에@override void dispose() { super.dispose(); isDisposed = true; } 변경하는 부분에서 if(!isDisposed) { setState(() {.... }); }이런식으로 하면 된다. 팁으로 시작시 setState 를 하는 경우에는 this.mounted 로 체크가 가능하다. 이상으로 늦은 setState 오류에..
Android 사용시 자주 사용되는 게 같은 Task 내에서 onActivityForResult 를 사용하는 편이죠. 물론 안드로이드내에서는 호출하는 쪽에서는 startActivityForResult 를 하고 다음 엑티비티에서 할일 하고 값을 다시 보낼때 onActivityResult 를 통해서 값을 받습니다. 관련 글은 http://liveonthekeyboard.tistory.com/150 보시면 됩니다. Flutter 내에서는 라우터를 이용을 할텐데요 그럴경우 주고 받는 걸 어떻게 하는 지 볼게요. 우선 A -> B -> A 라고 가정하면A 에서 라우팅을 Map results = await Navigator.of(context).push(new MaterialPageRoute( builder: (B..
Flutter로 작업시 Android Native 모듈과 통신할 일이 생길 수 있다. 그럴경우 android 폴더를 오른쪽 클릭 후 open Android module in Android Studio 로 열면 된다. 기존에 Flutter에 라이버러리들을 안 붙인 상태이면 정상적으로 작동이 될것으로 보인다. 하지만 다른 라이버러리들을 사용을 하고 있는 경우 하단의 오류 같은게 나올 수 있다. 이 부분을 해결하기 위해선 플러터 오픈 채팅방에서 고수 두부랩님이 알려주신 팁으로 gradle 폴더안에 gradle-wrapper.properties 파일을 열어서 gradle 버전을 수정해주면 된다. distributionUrl=https\://services.gradle.org/distributions/gradle..
Flutter BuildContext 알아보기https://flutterbyexample.com/build-context-class 보고 공부한 내용입니다.Flutter 에서 BuildContext는 위젯 트리에 있는 위젯 위치라고 보면 된다.각각의 위젯마다 고유의 BuildContext 가 존재한다.class _MyHomePageState extends State { _MyHomePageState() { print(context.hashCode); // prints 2011 } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body:..
Flutter 에서 내위치 가져오기모바일에서 내 위치를 가져오는 건 필수 기능 중 하나!!관련 플러그인은 https://pub.dartlang.org/packages/geolocator#-readme-tab- 에서 확인 가능하다.그럼 설정은?pubspec.yamlgeolocator: '^2.0.1'Geolocator 라는 메인 클래스를 통해서 위치를 가져 올 수 있다.Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high)리턴 값은 Future 비동기로 받는다. 그래서 then이나 await 로 사용이 가능하다.Future getCurrentUserLocation() async { return Geolocator() .getCurre..
2주차 배달앱 강의 스터디 수업 내용1주차 복습 내용http://javaexpert.tistory.com/971?category=7201022주차 클론 수업 내용Category 데이터 클래스 구현List 구현리사이클러뷰를 그리드 레이아웃 매니저로 구현 및 데이터 연결GPS 기능 켜져있는지 체크유저 위치 가져오기 위해 퍼미션 작업Presenter 함수 구현Address Object Data 클래스 구현퍼미션 승인 후 트래킹 진행좌표를 가져온 후 네이버 지오코딩 api 를 통해 자세한 동을 가져온다.Retrofit Api 구현converter-moshi 를 통해 JSON -> Address Class 로 변환RxJava Converter 구현RxJava Subscribe 를 통해 화면에 푸시최종적으로 화면에..
도커 2주차 수업복습http://javaexpert.tistory.com/967?category=719756docker-compose를 만드는 방법에 대해 진행1. package.json{ "dependencies": { "express": "*", "redis": "2.8.0" }, "scripts": { "start": "node index.js" } }2. index.jsDocker compose를 통해서 내부 네트워크 설정을 진행redis를 연결시 redis-server을 바로 호출 해서 연결함process를 강제로 죽는 오류를 발생시켜서 도커 컨테이너상에서 오류에 대한 여러가지 대처방법을 배움"no",always,on-failure등 여러가지 프로세스 오류에 대처할 수 있음const expres..
Stateful Widget Lifecyclehttps://flutterbyexample.com/stateful-widget-lifecycle/#6-didupdatewidget 을 공부해서 요약한 글입니다. 자세한 내용은 원문확인 부탁드립니다.StatefulWidget을 만들때 State 라는 오브젝트를 만든다. 이 오브젝트는 위젯이 동작하는 동안 mutable state를 뜻한다.state의 컨셉은 두가지로 정의되어 진다.위젯에 의해서 사용되어지는 데이터는 변할수 있다.위젯이 빌드 될때 데이터들을 동기적으로 읽을수 없다. 모든 State 들은 build 함수가 호출될 때까지 설정되어야 한다.StatefulWidget 와 State 는 클래스를 분리를 한 이유는?성능때문이다.1. createState()..
Transform 활용Stream 사용시 주어진 값들을 이용해서 가공할 일이 생길수 있다. 그럴경우 Transform 을 활용해서 가능하다.우선 예제를 보면서 살펴보자.이메일을 넣는 경우 유효성 체크 하는 validate stream 을 만든다고 가정하자.'@' 포함되는 경우 정상, 없는 경우 오류로 리턴하는 아주 간단한 예제우선 bloc 패턴을 이용할 예정이다.bloc 생성하자.StreamController 생성sink 정의transform 정의... final bloc = new Bloc(); ... class Bloc { final emailController = StreamController(); Function(String) get changeEmail => emailController.sink..
Android 에서 WebView사용시 정말 XX 한게 파일 업로드가 아닐수 없다. 이부분에서 괜찮은 소스가 보여서 공유 해본다. webView.setWebChromeClient(new WebChromeClient() { //The undocumented magic method override //Eclipse will swear at you if you try to put @Override here // For Android 3.0+ public void openFileChooser(ValueCallback uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Inten..
Android 배달앱 클론 스터디 부산에서 진행한 배달앱 클론을 진행하면서 공부한 내용을 정리 ( 1주차 )목표Android로 배달 앱을 클론 하면서 개발하는 방법과 패턴, RxJava등 사용법을 배우게 된다.MVP flow Base MVPView화면 단위를 뜻한다. Fragment, Adapter, ActivityModel데이터 연결 하는 부분을 담당한다. Sqlite, Retrofit등PresenterView Model 간의 연결을 도와주는 역할을 한다.Base 작성BaseMvpViewinterface BaseMvpView { fun getContext(): Context fun showError(error: String?) fun showError(@StringRes stringResId: Int)..
Relative Programming - BLoC 패턴아래 내용은 https://www.didierboelens.com/2018/08/reactive-programming---streams---bloc/ 을 공부하고 요약해놓은 글입니다.BLoC Pattern 은 구글 개발자 Paolo Soares 와 Cong Hui 에 의해서 디자인 되었다. 그리고 처음 발표된 건 2018년 DartConf 이다.관련 영상BLoC = Business Logic Component.하나 또는 여러개의 BLoC가 존재할수 있다.Presentation Layer(UI 부분)에서 가능하한 제거되며 로직부분만 분리해서 테스트가 용이함플랫폼 종속적이지 않다.환경에 종속적이지 않다.BLoC 패턴은 스트림을 이용해서 만들어진다.위젯은 ..
Reactive Programming part 1 - Stream스트림이란 무엇인가?스트림을 이해하기 위해선 파이프를 상상해야 한다.뭔가를 입력을 했다면 그것이 파이프 안에서 흘러서 다른 출구쪽으로 배출 되는 걸 뜻한다.그럼 Flutter 을 대입해보자면파이프는 Stream 이라고 부른다.Stream을 제어하기위해 우리는 자주 StreamController 를 이용한다.Stream 입력하기 하기 위해 StreamSink 를 사용한다.입력 할수 있는 것들은 어떤 것이든 가능하다.데이터, 오브젝트, map, 에러코드, 이벤트, 심지어 다른 스트림도 가능하다.배출은 어떻게 확인하나?일단 입력이 되면 Rx 처럼 subscribe 를 통해서 받을 수 있다. 이 과정을 flutter에서는 listen 한다고 말한다..
NodeJS 로 도커 시스템 구축package.json{ "dependencies": { "express": "*" }, "scripts": { "start": "node index.js" } }index.jsconst express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hi there'); }); app.listen(8080, () => { console.log('Listening on port 8080'); });Dockerfile# Specify a base image From node:alpine # install some depenendencies RUN npm install # De..