개발의 정석23 [#android] 어플리케이션, 앱 apk 키 생성 및 서명하기 어플리케이션, 앱 apk 키 생성 및 서명하기 구글 스토어에 앱을 출시하기 위해선 키 생성 및 서명이 필수다. 첫 버전에 서명한 키로 이후 업데이트한 앱을 서명을 해줘야 업로드가 가능하므로 키 데이터는 꼭 백업을 해두자. 이제 안드로이드 어플리케이션 키 생성 및 서명 방법에 대해서 알아보자. 1. 어플리케이션 키 생성 안드로이드 스튜디오(Android Studio)에서 프로젝트 파일을 열고, Build - Generate Signed Bundle / APK... 를 누른다. 그러면 아래창이 나오는데 Create new... 를 눌러 키 스토어를 생성해주자. 키 스토어를 저장할 경로, 비밀번호, 별칭, 유효기간, 인증 정보... 등을 기입해서 OK를 누르면 지정한 위치에 키 스토어가 생성된다. 2-1. 그.. 2020. 4. 5. [#ionic] ionic 프로젝트에 firebase 세팅하기 ionic 프로젝트에 firebase를 세팅하는 방법 1. firebase console에서 프로젝트 및 웹 앱 생성하기 https://console.firebase.google.com/u/0/?hl=ko 로그인 - Google 계정 하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인 accounts.google.com firebase console에 들어가 프로젝트 및 웹 앱을 생성해준다. 그리고 설정 화면의 아래쪽에서 생성한 앱을 선택하고 Firebase SDK snippet을 CDN으로 선택해주면 앱 설정 소스코드가 표시된다. 이 소스코드를 복사해두자 2. ionic 프로젝트에 firebase 설치 및 세팅 ionic 프로젝트 디렉토리에서 아래 명령어로 firebase를 설치해준.. 2020. 4. 4. [#git] 파일은 그대로 두고 모든 커밋 초기화하기(commit init) 커밋 내역이 많을수록 git에서는 이 변경 내역을 프로젝트 내부의 .git 디렉토리에 모두 저장하기 때문에 용량이 커질 수 밖에 없다. 그리고 커밋이 너무 많아 파일은 그대로 두고 커밋만 깔끔하게 초기화, 정리하고 싶은 경우있다. 이때 파일은 그대로 두고 모든 커밋을 초기화 하는 방법에 대해 알아보자 1. 기존 .git 디렉토리 지우기 프로젝트 디렉토리 안에 있는 .git 디렉토리를 지워 git 히스토리 내역을 모두 지워준다. 이때 기존 프로젝트 파일에는 전혀 영향이 없으니 안심해도 좋다. rm -rf .git 2. git 초기화 및 추가, 커밋 .git 디렉토리를 지웠으므로 git과 관련된 정보가 모두 사라진 상태이다. git init으로 새로 git 을 초기화하고, 기존에 작업해둔 프로젝트 파일들을 .. 2020. 4. 3. [#golang] 스페이스(white space) 여러 개를 1개로 바꾸기 텍스트를 다듬다 보면 스페이스, 띄워쓰기(white space) 여러개를 1개로 바꾸고 싶을 때가 있다. 이 경우, 정규식으로 간단하게 해결할 수 있다. package main import ( "regexp" ) // RemoveMultiSpaces : 스페이스 삭제 func RemoveMultiSpaces(str string) string { reLeadcloseWhtsp := regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`) reInsideWhtsp := regexp.MustCompile(`[\s\p{Zs}]{2,}`) result := reLeadcloseWhtsp.ReplaceAllString(str, "") result = reInsideWhtsp.Replac.. 2020. 3. 30. [#golang] html 태그 제거(strip tags) golang으로 html 페이지를 크롤링하다보면 가끔 태그를 제거하고 텍스트만 받고 싶은 경우가 있다. 이럴때는 package main import ( "fmt" "github.com/grokify/html-strip-tags-go" ) func main() { text := "Hello World!this is in div element." stripped := strip.StripTags(text) fmt.Println(text) fmt.Println(stripped) } 를 사용하면 간단하게 해결할 수 있다. 2020. 3. 30. [#http] 0.1초만에 띄우는 초간단 웹 서버, http-server 직접 웹 서버에 띄워 보고 싶을 땐, 흔히 nginx, httpd 와 같은 세팅이 필요한 웹 서버를 이용하게 된다. 그러나 html, js, css, 이미지 파일과 같은 스태틱 파일들을 서빙할 때 굳이 세팅이 필요한 복잡한 웹 서버를 사용할 필요는 없다. 오늘은 정말 간단하게 웹 서버를 띄울 수 있는 http-server에 대해서 알아보자 http-server 1. 설치하기 npm install -g http-server 2. 구동하기 서빙하길 원하는 디렉토리로 들어가 아래 명령어를 쳐주면, http://127.0.0.1:8181 (또는 http://localhost:8181)로 확인할 수 있다. http-server -p 8181 2020. 3. 29. [#http] request 메세지를 raw 형태로 보고 분석하기 request message를 raw 형태로 보고 분석해야하는 경우가 있다. 예를 들면 Transfer-Encoding: chunked 가 어떻게 동작하는지, 업로드 시에 Contenty-Type: multipart-form 은 어떤 형식으로 요청이 날라가게 되는건지 서버는 이를 어떻게 처리해야하는지 등을 파악하려면 요청 메세지를 원본 그대로 보고 분석해야한다. 명령어 nc 터미널을 키고 아래의 nc 명령어만 치면 8080 포트로 웹 서버가 구동 된다. nc -l 8080 이제 테스트하길 원하는 어떤 명령이든 127.0.0.1:8080 (또는 localhost:8080) 으로 날려주면 된다. 예를 들어 파일 업로드 시 요청 메세지 원본을 보고 싶으면 아래 명령어를 치면 된다. (파일 위치/test.txt.. 2020. 3. 29. [#git] user 및 commit한 author 변경 git commit을 하다보면 원치않는 아이디로 커밋이 된 경우를 많이 볼 수 있다. 이번 포스팅에서 이전 커밋의 user, author을 바꾸는 방법에 대해서 알아보자 1. git user 설정 우선 git user 부터 다시 설정해주자. 아래 명령어는 추후 사용자를 변경하고 싶을 때도 그대로 사용할 수 있다. git config --global user.name "korband" git config --global user.email korband78@gmail.com 만약에 특정 repository 에만 user을 다르게 설정하고 싶다면 --global 플래그를 빼고 수행하면 된다. git config user.name "korband" git config user.email korband78@gm.. 2020. 3. 26. [#git] 여러 커밋(commit) 하나로 합치기 의식의 흐름(?)으로 개발을 하다보면 똑같은 커밋 메세지 또는 대충 쓴 커밋 메세지로 푸시하는 경우가 많다. 이런 경우 커밋 메세지를 하나로 합치거나 수정할 수 있으니 정신이 맑은 날에 한번 쭈욱 정리하는 것도 좋을 듯 하다. 아래처럼 대충쓴 커밋 메시지1~3을 합쳐서 하나의 커밋으로 만들어보자 1. rebase 사용하기 3개의 커밋 메세지를 합쳐줄거라 git rebase -i HEAD~3을 실행한다. 만약에 2개의 커밋만 바꾸고 싶으면 2 를 적으면 된다. git rebase -i HEAD~3 2. 합치거나 편집할 commit 선택 그러면 아래와 같은 vi 창이 뜨는데, 대충쓴 커밋 메시지 2, 3의 pick => s 로 바꾼다 위 처럼 화면이 뜨면 아래처럼 적어주고 :wq 를 눌러 저장,종료 해준다... 2020. 3. 26. [#git] 강제로 이전 커밋(commit) 상태로 되돌리기 git을 쓰다보면 자주 충돌이 일어난다. (보통 conflict 났다라고 표현한다) 이때 로컬 PC에 있는 작업 영역을 강제로 이전 커밋(commit)으로 되돌려서 conflict를 푸는 방법에 대해서 알아보자. github repository 에는 아무런 영향이 없으니 걱정안해도 된다. git reset --hard HEAD~5 git reset --hard HEAD~5 라고하면 현재 상태에서 강제로 5번째 전 커밋 상태로 되돌린다는 뜻이다. 이때 새로 생성했던 파일이나 수정한 내용들도 모두 이전 상태로 돌아간다. 그리고 git pull을 해주면 다시 최신 상태로 반영되어 conflict를 풀 수 있다. 2020. 3. 26. [#git] git, github를 쓰는 이유와 기본 명령어에 대해 알아보자 1. git이란? 하나의 프로젝트를 진행할 때, 보통 여러명의 개발자가 동시에 작업을 진행한다. 모두 작업을 끝마치고 서로의 소스코드를 붙이려고 할 때 어떻게 취합하는게 좋을까? USB? 메일로? 취합만 하는데도 머리가 지끈지끈 아파온다. (예전엔 정말 이렇게 했다.. 끔찍) 그래서 스마트하게 소스를 관리해보자! 라고해서 나온 개념이 형상 관리(Configuration Management)이다. 대표적으로 svn, git이 있는데, 대세는 역시 갓 git git을 간단히 설명해보면 작업의 base가 되는 master branch에서 여러명의 개발자가 각각 새로운 branch를 따면, 각각의 새로운 작업 영역이 생기게 된다. 여기서 branch는 하나의 작업 영역, 하나의 소스코드 버전이라고 이해하면 된다.. 2020. 3. 26. [#golang] 맵에 키가 존재하는지 체크하는 방법 맵 안에 특정 키가 존재하는지 확인하는 방법은 간단하지만 정말 잘 쓰인다. map[key] 은 value, key 존재 여부 가 리턴된다. 순서 햇갈리지 않게 value, exist 로 외워두자(나도 순서가 헷갈려서 두세번 같은 내용을 찾아본 것 같다ㅠ..) if value, exist := dict["foo"]; exist { // 존재하면 } 2020. 3. 26. [#golang] 소스코드에서 커맨드 실행하기 golang 안에서 git clone 또는 git pull을 하는 등 직접 커맨드를 실행해야 하는 경우가 많다. 이번 포스팅에선 golang 안에서 직접 커맨드를 실행하는 방법에 대해서 알아보자 예를들면 워킹 디렉토리(working directory) /test/workspace 안에서 ls -a 를 실행하는 커맨드를 입력한다고 하면 아래와 같은 방식으로 사용할 수 있다. import ( "os/exec" ) cmd := exec.Command("ls", "-a") cmd.Dir = "/test/workspace" output, err := cmd.Output() if err != nil { fmt.Println(err) } else { fmt.Println(string(output)) } 지원하지 않는.. 2020. 3. 26. [#golang] 디렉토리의 파일 리스트 찾기 golang으로 디렉토리 내 파일 리스트를 찾을 땐 ioutil.ReadDir("디렉토리명")를 사용할 수 있다. 예를들어 /test/dir 디렉토리의 파일 리스트를 출력한다고 하면, targetDir := "/test/dir" files, err := ioutil.ReadDir(targetDir) if err != nil { return err } for _, file := range files { // 파일명 fmt.Println(file.Name()) // 파일의 절대경로 fmt.Println(fmt.Sprintf("%v/%v", targetDir, file.Name())) } 처럼 코드를 작성해주면 된다. 나의 경우, 일자별 디렉토리에 이미지, 파일 또는 로그를 저장해두고, 어느정도 기간이 지나면.. 2020. 3. 26. [#github] 사이트에 커스텀 도메인 등록하기 이전 포스팅 https://korband.tistory.com/7 에서 github로 무료 스태틱 파일을 호스팅해 트래픽/용량 걱정없는 사이트를 올리는 방법에 대해서 알아봤었다. 기본적으로 github에서 사이트를 publish하는 경우, https://ID.github.io 가 되는데 내가 소유하고 있는 커스텀 도메인으로 바꿔줄 수 있다. 1. 도메인 DNS 설정에서 CNAME 레코드 설정 자신이 소유하고 있는 도메인 사이트 - DNS설정에서 CNAME 레코드를 설정해준다. 예를들면 k5959.github.io 대신 5959.kor.band 라는 커스텀 도메인을 사용하고 싶으면 아래와 같이 설정해준다. 2. github pages 설정 publish한 repo 설정 - github pages에 cust.. 2020. 3. 25. [#http] multipart/form raw 포맷 서버 업로드 구현 여러 파일을 한번에 업로드할 때 헤더 Content-Type: multipart/form-data 로 POST 요청을 하게 된다. 이때 request body에는 어떤 형식으로 데이터가 들어가는지 알아보자 예시로 test.txt this is first file. baljagae tistory test2.txt this is second file. Hello World:) 위 두 파일을 Content-Type: multipart/form-data 으로 보내면 request body에 아래와 같은 포맷으로 서버에 넘어가게 된다. \r\n으로 해당하는 파일의 헤더를 구분하고, 이 헤더에는 파일명, 타입 등이 기재되어 있다. 그리고 \r\n\r\n 다음에 직접 파일의 내용을 담고 있다. 서버에서는 \r\n\r.. 2020. 3. 24. [#python] 리스트 자유자재로 다루기 python 리스트(list) 잘 쓰면 개발 생산성이 급격히 올라갈 수 있다. 30초만 투자해서 간단하지만 익혀두면 정말 유용한 리스트 관련 메소드를 알아보자 1. 리스트 요소 추가 (list item insert) # 제일 뒤에 요소 추가 list.append(item) # 또는 list.insert(len(list) - 1, item) # 제일 앞에 요소 추가 list.insert(0, item) # 원하는 위치에 요소 추가 list.inset(n, item) 2. 리스트 요소 삭제 (list item delete/remove) # 제일 뒤에 요소 삭제 del list[len(list) - 1] # 제일 앞에 요소 삭제 list.pop(0) # 또는 del list[0] # 원하는 위치 요소 삭제 d.. 2020. 3. 24. [#golang] go modules로 쉽게 의존성 패키지 관리하기 module main go 1.13 require github.com/labstack/echo/v4 v4.1.15 // indirect golang에서 외부 패키지를 사용할때 보통 go get -u github.com/xxxxx 로 패키지를 다운받고 사용하고 싶은 .go 파일에서 import gitgub.com/xxxxx 로 임포트해서 사용한다. 근데 이런 경우, github.com/xxxxx 패키지가 업데이트된 후 go get -u github.com/xxxxx 을 하면 업데이트 이후 버전의 패키지를 다운받게되어 이전과 동작이 다르게 된다. 그래서 동일한, 혹은 특정한 패키지 버전을 보장할 수 있도록, 패키지 버저닝(Packaging Versionging) golang 11 버전에서 공식으로 도입된 G.. 2020. 3. 24. [#angular] scully로 SPA를 기존 방식의 여러 스태틱 파일로 쪼개기 Angular의 가장 큰 장점이자 단점이라고 볼 수 있는 SPA(Single Page Application) 특성에 대해서 사용자 입장에서 생각해보자.(개발 관점은 말할 것도 없이 기존 js, html, css 방식보다 생산성, 재사용성이 비교도 할 수 없을 정도로 좋아졌으니 논외) 장점은 로딩만 되면 이후부턴 네이티브 앱과 거의 비슷한 성능을 기대할 수 있다. 단점은 첫 로딩이 느리고, 검색에 노출되기 힘들다는 점이다. 첫 로딩이 느리다는 말은 처음에 전체 어플리케이션 동작에 필요한 js, css, html 덩어리를 한번에 받아와야하므로 초기 로딩에 시간이 많이 걸린다는 뜻이고, 검색에 노출되기 힘들다라는 말은 SEO(Search Engine Optimization) 이슈, 쉽게 말해 Agnular의 .. 2020. 3. 23. [#angular] 프로젝트 생성, 실행하기 1. Angular란? Angular는 구글에서 개발한 SPA(Single Page Application) 자바스크립트 프레임워크이다. 웹, 모바일 웹, 하이브리드 앱, 데스크탑까지 프론트 개발에 필요한 거의 모든 기능을 갖추고 있다. Angular에서는 typescript 언어로 컴포넌트 단위로 개발이 가능하며, 이를 통해 재사용성을 극대화 시킨 대규모 어플리케이션 개발에 최적화된 프레임워크이다. 참고로 브라우저에서 typescript를 직접 지원하진 않아 빌드 후 js, css, html 파일을 만들고 이를 서빙 하는 형태이다. 그리고 첫 로딩에는 웹/앱 구동에 필요한 웹팩으로 묶여진 js, css 파일을 받아야 하므로 속도가 느리지만 로딩이 된 이후부턴 속도가 빠른 특징을 가지고 있다. 자세한 Fe.. 2020. 3. 22. [#ionic] 프로젝트 설치, 생성 및 실행 방법 1. ionic 소개 ionic을 사용하면 Angular + Typescript로 웹, Android, iOS 하이브리드 앱을 모두 만들 수 있다. (참고로 내부적으로는 Apache Cordova 를 사용하고 있다.) 하나의 코드로 여러 플랫폼의 앱을 동시에 출시할 수 있어 비용 절감을 엄청나게 할 수 있으니 네이티브 기능이 필요하지 않은 대부분의 마이크로 서비스에서는 이를 적극적으로 활용하는 것이 유리하다. 자세한 소개는 https://ionicframework.com/docs/intro 에서 확인할 수 있다. What is Ionic Framework? - Ionic Documentation Ionic is the app platform for web developers. Build amazing m.. 2020. 3. 22. [#github] 트래픽/용량 걱정없는 무료 웹 호스팅하기 예전에 웹 호스팅에서 일 200MB에 월 500원짜리 호스팅 서버가 많이 보였었다. 월 500원 수준이면 거의 공짜나 다름없긴 했지만 트래픽 초과시 서비스가 불가능하거나 추가 트래픽 비용을 내는 경우가 많았었고, 요즘 성행하는 클라우드 서버의 경우, 최소 월 몇 천원은 내야 작은 서비스를 서비스할 수 있다. 근데 자세히 보면 마이크로 서비스의 트래픽은 스태틱 파일(js, html, css)이 90%이상 차지하는 경우가 많다. 곧 스태틱 파일을 공짜인데 안심할 수 있고, 속도도 빠른 = gitbub 에서 제공해준다면? 서버코드도 github로 관리하는 요즘, 스태틱 파일 repo를 분리하는 아주 조금의 귀찮음이 있을 지 몰라도 비용, 안정성 측면에서 안쓸이유가 전혀 없다. 개인적으로 개인 포트폴리오나 단순.. 2020. 3. 22. [#github] jsdelivr CDN 서버 무료로 사용하기 CDN 서버란? CDN(Content Delivery Network)의 약자. 어느 한 서버에 있는 파일들을 글로벌하게 서비스한다고 하면 여러 hop을 거쳐야해 전송 속도가 매우 느릴 수 밖에 없다. 그래서 서버 - 사용자 사이 어딘가에 캐시 서버를 두고 스태틱 파일(js, html, css, 이미지 등)들을 미리 서비스해 네트워크 hop을 줄여 트래픽 비용을 줄이고, 전송 속도를 높히는 서버를 CDN 서버라고 한다. 그런데 이 CDN 서버를 public github repository에 파일을 업로드만 하면 그대로 jsdelivr CDN 서버로 바로 사용할 수 있다. https://cdn.jsdelivr.net/gh/[사용자명]/[레포지토리명]/[파일경로] 예를들면 abcde 사용자가 myrepo 라는.. 2020. 3. 22. 이전 1 다음