-
Notifications
You must be signed in to change notification settings - Fork 10
/
search_plus_index.json
1 lines (1 loc) · 390 KB
/
search_plus_index.json
1
{"Test_TDD_BDD/Morning_tdd.html":{"url":"Test_TDD_BDD/Morning_tdd.html","title":"매일 아침 TDD 스터디 하면서 느낀 것","keywords":"","body":"개요 월-토 아침 08시에 행아웃으로 만나 30분동안 책 읽은 부분과 실습한 부분에 대해서 이야기하는 스터디 로그는 여기서 볼 수 있음: 프로젝트 리포지토리 실습하면서 유의미하게 느낀 것을 적음 TDD 관련해서는 TIL의 tdd_realization에 적음 Check 필요할때 배우는게 확 와닿는다 - c9 해야겠다 - 아침마다 노트북 키기 귀찮음. 아이패드로 코딩하고 싶음 (2019/01/09) 한번에 할 수 있을만큼 핵심부분을 구현하고 버전업 하는게 안정감도 느끼고 빠르게 만든다 Fact : 한 번에 주어진 레이싱카 게임 요구사항을 구현하는 것보다 여러 버전으로 나누어서 구현한게 더 빠르고 쉽게 구현 Feeling: 구현할때 좀 더 안정감 있었음 Finding: 김창준 애자일 코치 칼럼(당신이 제자리 걸음인 이유 : 지루하거나 불안하거나 - b1. 난이도 낮추기 부분 참고 / 지금 하는 일들을 절반의 시간 안에 해야 한다면?)에서 읽은 적이 있다. 처음 불확실성이 높을 때 일을 쪼개서 내가 쉽게 할 수 있는 버전 1을 만들고 버전 2에서는 조금 더 복잡한 기능을 덧붙여 만들면서 버전을 업그레이드 해가면서 만들면 한번에 어려운 걸 구현하는 것보다 같은 시간 안에 더 빨리 안정감을 느끼면서 만들게 된다. 이렇게 버전 1,2,3만든다의 중요성을 느끼고 있다. "},"Algorithm/study.html":{"url":"Algorithm/study.html","title":"알고리즘 스터디 기록","keywords":"","body":"알고리즘 스터디 진행사항 기록 스터디 github repository "},"Project/pro00er.html":{"url":"Project/pro00er.html","title":"프로00er","keywords":"","body":"Keyword side project pro00er 상황 / 궁금증 pro00er 프로젝트를 하면서 특이사항 및 느낀 점을 기록 Inbox DBMS 선택 왜 postgreSQL인가? reference 한눈에 살펴보는 PostgreSQL - d2 [PostgreSQL- wikipedia] (https://ko.wikipedia.org/wiki/PostgreSQL) MongoDB vs PostgreSQL 프로젝트 규모를 해카톤(48시간)으로 한정했기 때문에 러닝커브가 적어야함 - > RDBMS 사용 oracle 등 엔터프라이즈 DBMS의 기능을 제공 하고 있음 다양한 프로시져, 인터페이스 제공 실험적인 확장기능 존재 "},"SLiPP_TBD/TBD_SLiPP.html":{"url":"SLiPP_TBD/TBD_SLiPP.html","title":"TBD_SLiPP 14차 스터디","keywords":"","body":"Keyword 테스트기반 SLiPP Reference SLiPP - 테스트기반실습 내가 정리 - Test.md 내가 정리 - JUnit 상황/궁금증 SLiPP 14차 스터디 테스트기반 개발 내용 정리 진행 1주차 : 요구사항 정의 - 어떤걸 확인해야하나 1주차 - 환경 구성과 실습 코드 설명 중 특히 정독 SW 개발 업무 Cycle 이슈 트래킹 테스트 케이스 이름 Spring과 Mock 객체 추가 자료 필요 요구사항과 확인해야할 것 -> 테스트로 연결됨. 프로세스 코드리뷰를 팀문화로 감정상하지 않게 왜하는지 되짚어주기 자연스러운 팀의 컨벤션이 만들어짐 버그를 재현 -> 안하면 고쳤는지 어떻게 알앙ㅠ 코드리뷰할때 로직을 안봐도 등록된 문서(issue)로 알 수 있게 왜, 어떻게를 적는다 [적용] gitlab으로 이동 (로그 기록 안되는 문제 남음) / ~문서파싱 프로젝트 trac - svn issue tracking 연동하기~ 2주차 : 테스트케이스 구현 Mock 객체사용해서 메소드간 의존성을 줄였다 Test에서 Spring config를 불러왔음. [ ] Mock 에 대해 더 알아보자. [ ] spring config 에 대해서 좀 더 찾아보자. 실무프로젝트에도 적용할 수 있도록 xml 스타일 설정도 같이 테스트케이스 이름으로 먼저 적어두었어도 실제로 구현하려면 걸리는 부분이 생긴다. 4주차 : 버그 구현 고민 실제 프로덕트에 적용하려고 하니, issue 생성부터 막힌다. MainController처럼 파라미터에 따라 method를 호출하는 main method는 어떻게 테스트해야할까? 올바른 method를 호출하는지 확인하고 싶은데, Mock을 사용해야하나? 해당 method를 호출하는지 어떨게 test하지? 일단, 옳은 파라미터인지 확인하는 부분은 다른 테스트케이스로 나누고, method를 분리할꺼다 질문 기존 코드 테스트케이스 나중에 만들때 로직 중심으로 해야할까? TBD 스터디할때는 요구사항 분석부터 하는데 기존 코드를 보다보니 요구사항이 뭐였는지 알 수가 없음. 파악할 수 있는 로직, 시나리오 기반으로 만들어야할까? 요구사항인지 그냥 큰 요구사항을 구체적으로 구현하다가 만들어진 로직인지 어떻게 구분하지? 뒷풀이에서 문수님 이야기한거 - 티비디는 하나의 메소드에 하나의 로직 로직 테스트케이스로 만들고 있는데 / 1method 1role 이 아니다보니 테스트케이스를 하나당 여러개 만들면 되나? 확인해야할 로직이 여러개일때. 일단 리팩토링을 다 하기에는 너무 일이 크고 어떻게 접근해야할까? 인터페이스 테스트는 왜하지? (전체 카톡방 대화) 테스트의 목적은 로직테스트가 아닌건가? 테스트 케이스의 리소스 파일 위치를 왜 따로 하지? 각 테스트 케이스 메소드 별로 사용하는 별개의 파일을 따로 둔다. 그리고 그 위치는 테스트케이스 클래스 이름을 따서 TodoManagerTest_resources라고 폴더를 둔다. 정말로 정말로 여러개의 테스트 케이스 클래스가 공통으로 사용되는 것만 test/java/resources 밑에 둔다. 문서에서 정보 추출할때, 전체 문서 -> 해당 파트 단락 -> 단락에서 항목 추출 단계를 거침. 앞 과정이 완료되어야 가능함. 문서 정규화 -> 단락 파싱 - DB 저장 -> DB에서 단락 불러옴 - 항목 추출 input, 예상 output 이 정의될때 테스트 가능한거 아닌가. 요구사항 유효조건 실패조건 구현? 테스트는 시나리오인가? - 시나리오는 통합 테스트인뎅 self-shunt pattern(셀프션트) (From. TDD - 켄트벡 개정판 p.362) Say No to Self-Shunt test + Mock 두 역할하므로 Single responsibility principle 원칙을 위반. temporary 는 결국에 refactoring 해야하는데(몸집이 커지는 경우), 경험상 temporary는 영원히 그 자체로(;;;) 머물러 있을 가능성이 높음 (매우 동의함!) Self Shunt by Paul Pagel 이슈 단위는 어떻게 하지? task != issue 기능 != method issue tracking 도구로 내가 일했던 log남기는게 가능한가? 다른 도구 필요하지 않을까? issue 는 기능, 소스단위이다보니 적절하진 않을듯. refactoring할때도 이슈발행함? 필요없지 않나? 기능 구현 method 버그 알아가는 중 단위테스트의 목적 코드가 예상대로 동작하는가? 코드품질(의존성 줄이기, '테스트가능 설계'와 연관이 있는거 같은데 잘 모르겠다) 프로그램 기능에 대한 개발자용 메뉴얼?(도형오라버니 said \"오픈소스에서 testcase와 doc 제대로 되어있지 않으면 PR 무시해요.(...) 코드 리뷰할 때도 testcase로 로직와 기능을 파악힐 수 있어서, 소스코드를 훑가면서 로직을 파악하는 것보다 훨씬 부담이 덜해서 소스리뷰 정착에도 도움이 됩니다.(...)\") Effective Unit Testing 책에 '테스트가능 설계'라는 말이 나온다. 모듈간 불필요한 의존성이 없고, method의 롤이 파악하기 쉽다는게 아닐까?(1method, 1 role) 좋은 테스트 케이스는 테스트 케이스간 의존성을 줄이고(Mock, stub, self-shunt 사용), 하나의 test case 가 Single responsibility principle(하나의 role만 수행하고 그 의도를 명확히 전달)하는 특징을 가지는 거 같다. 좋은 테스트케이스를 작성하면, 뭔가 문제가 발생하면 알려줄꺼라는 믿음을 주는 거 같다. 아직 느껴보지는 못했지만, 여러 책에서 반복적으로 나온다. 코드 퀄리티 높이기 작게나마 TDD를 프로젝트에 적용해봤을 때, testcase = method 단위로 잘못 적용했지만, testcode가 커지지 않게 만들다보니 거의 one role 을 수행하게 되었고, 어쩌다 얻어걸려서 '하나의 method가 하는 일은 하나여야 한다'를 비교적 잘 지킬 수 있었다. 잘 쪼개놓으니 갑작스런 요구사항 추가에도 비교적 잘 대응할 수 있었다(testcase 후에 작성한 코드들은 퀄리티가 달랐다) Mock 사용 : 목 객체 안에서는 비즈니스 로직을 절대 구현하지 말라 깨달음 test는 method단위가 아님!! 충족시켜야하는 요건 단위! method 단위로 테스트만들때 뭔가 쎄했음. 리팩토링할때 method 나누면 testcase 도 다시 만들어야함. 여러 함수 사용해서 최종 결과가 나오는거면 중간중간 입력값을 다 따로 관리해야해서 귀찮음. 요구사항 요건 분석해서, 그 단위로 test 만들면 자연스럽게 필요한 method도 처음부터 작은 단위로 만드는게 가능하지 않을까? Effective Unittesting에서 나온 테스트하기 쉬운 설계가 이런 의미인가? 한글로 테스트목록쓰니 테스트 목표가 자동으로 정해지네! production code -> test 제외 어떻게 하지? gitlab flow 사용 중. master에서 test code 삭제하고 copy 하는 방법이 있나? 아, 처음에만 삭제하고 나중에 변경된 코드만 반영하니까 상관이 없네. 로직부터 TDD로 메모리 저장소 - 서가 예제 p.366 2주차 - 20180207 web static Mock simple config(Bean config,.. ) @Test(expected=) == try catch 추가 도형형님 자료 (https://www.slideshare.net/dhrim/ss-14990143) 발생과 인지간격이 멀수록삽질스러워 진다. 테스트 코드는테스트 케이스가 아니다.버그의 발생을 파악할 수 없다. 버그 발생 파악할 수 있어야 테스트 케이스 / 언제나 정상동작을 확인할 수 있어야내일도 모레도 1년뒤에도 재사용 가능해야테스트 케이스 자동화 가능해야테스트 케이스 와 이거! 개발자 스스로가 지금, 전부 실행시킬 수 있어야 한다. "},"SLiPP_TBD/week01.html":{"url":"SLiPP_TBD/week01.html","title":"week01","keywords":"","body":" 스터디하면서 적은 메모 create에서 id값 무조건 -1 로 함. store() 에 todo null 주면 안됨 validation 실패할때 IllegalArgumentException 예외메시지 상세내용 (\"\") 개발자 IAE(\"에러난필드.todo\", cause(있으면)) Todorepository에서 store() 호출했을떄 그쪽에서 error 던질때 어떻게함? 삭제하라고 했는데 없을경우 IAE 발생 다시 IAE던짐 like DB 다운됨 Repository Fail Exception runtime exception 으로 다시 던짐 RuntimeException -> RuntimeException(\"storage Failed\",cause) todo가 아닌 null 이 들어올 경우 IAE던짐 0 20개 이상? TestCase - 뭐를 확인해야하는지 리스트 field validation 확인 id가-1인지확인 title이null이면_IllegalArgumentException예외던짐확인 title이50byte이상이면_IllegalArgumentException예외던짐확인 파라미터content가null이면_content가_emptyString인지확인 content가500byte이상이면_IllegalArgumentException예외던짐확인 parameter가null인경우_IllegalArgumentException예외던짐확인 store()에서IlligalArgumentException던질때_IlligalArgumentException던짐확인 store()에서RepositoryFailException던질때_RuntimeException던짐확인 store()에서RuntimeException던질때_RuntimeException던짐확인 id가범위를넘을때_ testCase의 범위? testcase는 경계점에 대해서만 테스트함 "},"SLiPP_TBD/week04.html":{"url":"SLiPP_TBD/week04.html","title":"week04","keywords":"","body":" 스터디하면서 적은 메모 이전시간 Notimanager : SNS noti 같은거임 ST-3 \"SPAM\"이 들어간 제목인 경우 Todo가 생성되서는 안된다. : 무시함. 예외도 안던짐. Jira에서 호출된 Todo의 경우 noti하지 말아달라. : title이 \"[JIRA]\" 로 시작함 그런데 Jira에서 호출되더라도 급한건 noti해 달라 : 급한 건 -> title 안에 'URGENT'가 들어가면 (대문자일 경우만) ST-4 테스트케이스를 건드리지않고, 버그픽스를 테스트케이스를 가지고 함. 버그가 있을경우, fail 되는 케이스를 만들어야함. 버그재현을 테스트케이스로 함. 버그를 고치면 테스트케이스 통과하겠죠. ST-2 create 성공 후 NotiManager 호출 create(Todo) 성공 후 NotiManager.notify(title)을 호출 파일 src/main/java/net/slipp/todo_list NotiManager.java TodoManager.java src/test/java/net/slipp/todo_list TodoManagerTest.java 구현 내용 TodoManagerCreate정상수행시_notify호출시_RuntimeException을무시하는지확인 TodoManager_Create정상수행후notify호출이정상적으로호출되는지확인 TodoManagerCreate에서Exception발생시_NotiManager_notify가실행안되는지_확인 title에 \"SPAM\"이 들어가면,Todo가 생성되지 않는지 확인 title이 \"[JIRA]\" 로 시작하면NotiManager_notify가실행안되는지_확인 'JIRA' 일 경우 fail하는지 확인 title이 \"[JIRA]\" 로 시작하고,'URGENT'단어가 있으면 notify호출이정상적으로호출되는지_확인 "},"SLiPP_TBD/week05.html":{"url":"SLiPP_TBD/week05.html","title":"week05","keywords":"","body":" 스터디하면서 적은 메모 이전시간 review 예외 메시지 cause 를 적어야함 code review의 comment에 reply 해서 의견달기 새로운 이슈 callCount를 구할 수 있다 ST_5 Noti 수가 맞는 걸 확인 TodoManager - NotiManager -> CountableNotiManager Todo를생성할때마다_count가증가되는지_확인 "},"SLiPP_TBD/week07.html":{"url":"SLiPP_TBD/week07.html","title":"week07","keywords":"","body":" 스터디하면서 적은 메모 코드리뷰 보통 팀원들이 conversation에 자신이 코드리뷰했음을 코멘트함. merge에 대한 의견도 코멘트함. 리뷰된 코드에 반영했습니다 등올 다시 코멘트 다는 거 잊지말자! PR 명세 수준 : '설계서 + 새로 작성한 명세서' 를 보고 다음 작업자가 이해할 수 있을 정도 코딩테스트에서의 테스트코드 문제풀이플랫폼(hackerrank 등) 코딩문제에서는 사용자가 입력값 "},"SLiPP_TBD/week08.html":{"url":"SLiPP_TBD/week08.html","title":"week08","keywords":"","body":" 스터디하면서 적은 메모 version 20180503 요구사항 분석 주어진 요구사항 ST-6 TodoManager.delete 구현 delete(Todo) 메소드 구현. TodoRepository.store(todo, should_delete=True)를 호출한다. 요구사항 분석 조회는 id로 함 조회하는 todo가 없을때 IllegalArgumentException을 던짐 store(todo, true)의 return 값은 null로 함 조회하는 todo가 없을때 IllegalArgumentException을 던짐 테스트케이스 delete 호출시,store를 호출하는지 store가 true인지와 store가 todo를 받는지 조회하는 todo가 없을때 RuntimeException을 던짐 Mock의 store가 IllegalArgumentException 던지면 delete가 RuntimeException 던지는지 해야하나? - > Yes store Mock 구현 실제 todo가 사라지는지는 store(todo, true) 구현의 역할이므로 mock을 사용합시다 두번째 인자가 true일때 todo를 삭제 assert : 해당 todo 다시 조회하면 null 이어야함 두번째 인자가 false일때 무시하고 아무것도 하지 않음 [질문] 명세만 해놓고 아무 테스트 기능도 없는데 적어야할까? 조회하는 todo가 없을때 IllegalArgumentException 던짐 "},"SLiPP_JVM/week01.html":{"url":"SLiPP_JVM/week01.html","title":"week01","keywords":"","body":"Keyword complier moniotring tool Reference SLiPP wiki - Java Compiler SLiPP wiki - 모니터링 tools stackoverflow - How does the JVM decided to JIT-compile a method (categorize a method as “hot”)? 정리 핫스팟? 자주 실행되는 부분. loop 많이 돌거나 자주 쓰니까 컴파일하자,계속 쓰니까 - 인터프리터 대신 바로 컴파일하지 않아요, 두가지 이유로 첫째, 한번만 실행되는지 확인 둘쨰, 최적화 메모리의 부하를 덜어내자! 다 컴파일하지 않아요, 특정한 코드(핫스팟)만 컴파일 Q. 언제 어떤 컴파일러를 사용할지 어떻게 알지? 무조건 하나만 사용가능? host의 성능에 따라 권장옵션이 달라짐 티어드컴파일러 - 서버컴파일러의 옵션사항 - Java8 이상이면 default로 켜져있음 Q. 티어드 컴파일 - '초기에는 클라이언트 컴파일 사용하고, 많이 쓰이게 되면 서버컴파일러로 다시 컴파일됨' - 초기, 나중 기준은? 다시 컴파일됨 - 초기에 클라이언트로 코드 캐쉬를 해놓고, 나중에 최적화된 코드 캐쉬로 스위칭함 JVM 최적화 != 성능 최적화 그 외에 요인들이 많음 BigApp 비슷한 이유 - 추측 jar -> 메모리에 올림 부하생김 비슷비슷해짐 Q.최적화 의미 다시 컴파일 임계치 - 설정 ORS : 메모리상의 stack이 아니라 공간을 교체한다는 의미임 질문. 최적화된 코드로 스위칭 어떻게 함? 컴파일 큐의 이점 - 코드 실행 중에도 코드 컴파일을 진행할 수 있음. ORS로 코드체인징을 하게 됨 생산자 - 소비자 패턴 - 최적화는 언제 해 JIT compier가 소비자 -> 최적화 바이너리를 만듦 그림 그려보기 모니터링 툴 visualization tool은 애플리케이션의 성능에 영향을 미침 jmx로 서버 정보 get jconsole MBeans : 모니터링 빈 .JMX로 추가해서 모니터링 jvisualvm thread, heap dump 가능 jmc 라이센스 정책 있음 CPU 정보 등 하드웨어에 대한 추가정보도 보여줌 jstat jps 로 ps id get jmap 과 jhat 같이 쓰이겠는데영? [ ] 기본 command 정리 Tip 핀포 intellij에서 byte code 보기 - Build 후, cmd+shift+A show bytecode 실제 서비스에서 모니터링 - 메모리 따로 고려해서 붙이기 plus 성능 : 얼마나 많은 사람이 사용할 수 있나 예상질문 Machine Code == binary code / assembly code? 인터프리팅 횟수 1로 두고,.. 시도는 해 볼 수 있겠져 테스트 목적 외에는 비추천. 느리니까 "},"SLiPP_JVM/week02.html":{"url":"SLiPP_JVM/week02.html","title":"week02","keywords":"","body":"Reference https://www.slipp.net/wiki/pages/viewpage.action?pageId=30770252 JVM Heap과 GC 기본 동작 Point Eden영역이 가득차면 아동 S0,S1 둘 중 하나는 반드시 비어있어야함. S0,S1 둘다 채워져있을때 JVM이 오동작 했다고 판별 GC 방식 CMS , G1 : 무중단이 장점 G1 퍼즐의 스페이스가 바뀜(Eden일수도 다른 것일 수도). 모니터링하면 그래프 막대 크기가 바뀜. 다른 GC에도 블록크기를 다르게 할 수 있지만 튜닝이 잘못될 가능성이 있음 영역간(Eden,...)의 비율을 설정할 수 있음 GC 실험 [질문] Parallel GC는 aging을 사용해서 히스토그램이 없다? - visual GC공식문서 참고 "},"SLiPP_JVM/week03.html":{"url":"SLiPP_JVM/week03.html","title":"week03","keywords":"","body":" 발표자료 기본 GC 튜닝 GC의 성능은 기본 동작에 따라 좌우됨 사용하지 않는 미사용 객체 찾기 가용 메모리 생성 힙 압축 등등 가비지 컬렉터별 기본 동작에 대해 다른 접근 방식을 취함. 성능상의 특징이 달라지는 이유가 됨 일반적으로 애플리케이션 성능에 가장 큰 영향을 미치는 stop the world pause(가비지 컬렉션을 실행하기 위해, 모든 애플리케이션 스레드가 중지시키는 것)가 최소화되도록 고려해야함 가비지 컬렉터 고르기 - 뭐야 이게 저번 시간(링크)의 가비지컬렉터 G1이 가장 성능이 좋으나, 각 상황에 따라 트레이드오프를 고려하여야함. 개별적인 요청은 중지 시간, 특히 풀 GC에 의한 긴 중지 시간에 영향을 받을 것이다. 목표가 중지 시간이 응답 시간에 미치는 영향을 최소화시키는 것이라면 동시 병렬 컬렉터가 좀 더 적절할 것 이다. 평균 응답 시간이 특이 요소(예 응답 시간의 99%대)보다 더 중요하다면 보통 처리율 컬렉터가 더 나은 결과를 낼 것이다. 동시 병렬 컬렉터로 긴 중지 시간을 피하는 이점을 얻는 대신 CPU 사용률에 대한 추가 비용이 들어간다. 배치 애플리케이션의 경우 고려해야할 트레이드 오프 •CPU 제한되어 있을 경우 : 동시 병렬 컬렉터가 CPU를 추가적으로 소비하게 되어 배치 작업을 하는 데 더 많은 시간이 걸리게 됨 •단, CPU를 중분히 사용할 수 있다면, 동시 병렬 컬렉터를 사용하면 작업이 더 빨리 끝남(풀 GC 중지를 피함) GC 알고리즘 선택 선택 기준 : 애플리케이션의 상태 & 애플리케이션에 대한 성능 목표 대부분은 Parallel collector, CMS, G1 을 사용함 특히 G1은 여러 컬렉터의 단점을 개선한 것이기 때문에 상당한 성능상 이점이 있음 Serial Collector? 애플리케이션이 100MB 미만으로 사용하는 경우 애플리케이션이 Pararell collector, CMS, G1 의 컬렉션 대상이 안되는 작은 힙을 요청함 p.166 ~ 171 기본 GC 튜닝 많은 상황에서 기본 튜닝만으로도 충분함. GC 알고리즘의 공통 환경 설정 매개 변수(configuration parameter) 사용한 튜닝 힙 크기 정하기 애플리케이션이 실행되고 있는 플랫폼의 default 최대값보다 큰 힙을 필요로 하지 않을때 효과적 가용시스템 자원을 기반으로 힙에 대한 '합리적인' 디폴트 초기값을 찾고 합리적인 최대 값으로 힙의 크기를 올리는 것 힙 크기 조정 플래그 : -XmsN / -XmxN 힙에 대한 초기, 최대 크기가 지정되어 있으므로, '알맞은' GC의 수를 유지하거나 최대 크기가 될 때까지 힙을 지속적으로 늘림 주의. 명시적으로 최대 크기를 설정하더라도 힙의 크기는 자동 조정됨 때문에 필요로 하는 것보다 더 큰 힙을 명시해도 반드시 메모리상 불이익이 아님. GC 성능 목적을 만족시킬 정도만 늘어남 힙의 크기는 어떤게 적절할까? 만약, 힙이 너무 작다면? 일단, 애플리케이션 로직 수행시간이 오래걸림 GC 수행 시간이 많이 걸림 만약, 힙이 매우 크다면? GC 중단이 일어난 기간이 길어지면서 성능이 지연됨 풀 GC동안 시스템이서 스와핑이 발생할 경우 중단은 더 길어짐 (p.172) 머신 내의 물리적인 메모리 크기보다 더 큰 힙을 지정하지 말자 JVM이 여러 개 실행 되고 있다면 모든 힙의 총합을 넘지 않도록 함 OS 프로파일을 위해서 적어도 1GB의 공간이 필요 경험상 풀 GC 가 일어난 후에 30%로 설정하는 것 How? 정상 상태(steady-state, 캐시한 것이 로드되고, 클라이언트 연결이 최대치까지 생성되는 등의 시점)의 설정에 도달할 때까지 애플리케이션을 실행 그 다음 강제로 풀GC 일으키고 풀GC가 완료될 때 사용된 메모리 갯수 관찰 GC 로그 참조 애플리케이션에서 필요로 하는 힙의 크기를 정확하게 안다면, 힙의 초기와 최대 값을 설정 (-Xms4096m / -Xmx4096m) 힙 크기를 조정하면서 적절한 조정값을 알아낼 필요가 결코 없기 때문에 약간 더 효율적임 Q.실제 힙 크기 어떻게 할당하고 있나요? 경험적으로 할당 -XmsN / -XmxN 같게 할당하는 사례 힙 크기에 대한 전면적인 통제 (p.244) 제너레이션의 크기 정하기 영/올드 제너레이션에 힙 얼마나 할당할지 정하기 think. 영/올드 제터레이션 사이의 균형 찾기 영 제너레이션이 비교적 더 크다면 덜 자주 수집되고 더 적은 객 체가 올드 제너레이션으로 감. 올드 제너레이션이 비교적 더 작기 때문에 더 자주 가득 차고 풀GC가 자주 일어남. 튜닝 플래그는 영 제너레이션의 크기를 조정함. 올드 제너레이션은 그 나머지 공간. XX:NewRatio=N :올드 제너레이션과 영 제너레이션의 비율 설정 초기 영 제너레이션 크기 = 초기 힙 크기 / (1 + NewRatio) default : 초기 힙 크기 33% XX:NewSize=N : 영 제너레이션의 초기 크기 설정 NewRatio 계산 값보다 우선함 default값 없음 XX:MaxNewSize=N : 영 제너레이션의 최대 크기 설정 default : 최대 힙 크기 XmnN : NewSize와 MaxNewSize 양쪽에 동일한 값 힙크기 고정(-XmsN = -XmxN 같을때)일 때 사용. 퍼머넌트 제너레이션과 메타스페이스 크기 정하기 Permenant와 metaspace는 무엇인가? JVM 이 클래스 로드할때 특정 메타데이터에 대해서 계속 파악하고 있어야함 이 정보는 독립된 힙처럼 작동함. 자바 7에서 permgen(또는 퍼머넌트 제너레이션)이라고 불리고, 자바 8에서는 메타스페이스(Metaspace)라고 함 퍼머넌트 제너레이션/메타스페이스 내의 정보는 컴파일러와 런타임에만 사용됨. 이때 갖고 있는 데이터는 클래스 메타데이터 이 크기는 사용되는 클래스의 수에 비례함. 메타 스페이스는 필요한 만큼의 공간을 default로 사용함 플래그 퍼머넌트 제너레이션 : -XX:PermSize=N / -XX:MaxPermSize=N 메타스페이스 : XX:MetaspaceSize=N / -XX:MaxMetaspaceSize=N 초기 크기를 기반으로 동적으로 크기를 정하고 최대 크기에 필요한 만큼 늘어남 이 영역의 크기를 다시 정하려면 풀 GC가 일어남 (비용이 높음) 어떤 경우에 어떻게 사용하는가? (클래스가 로딩되면서) 프로그램이 스타트업하는 동안 풀 GC가 많이 일어나면 퍼머 넌트 제너레이션이나 메타스페이스의 크기가 변경됐기 때문임. 스타트업 속도를 개선하기 위해 초기 크기를 변경하는 편이 좋음. 애플리케이션 서버는 전형적으로 최대 퍼머넌트 제너레이션의 크기를 128MB, 192MB나 그 이상 으로 명시함 스타트업 직후에 클래스를 로드하지 않는 애플리케이션에서는 모든 클래스가 로드된 후의 사용량을 기반으로 초기값을 정함. 스타트업이 약간 빨라지게 됨 개발서버(클래스가 자주 재정의되는 환경)에서는 이 영역이 가득차고, 기존 클래스 메타데이터가 폐기될때 가끔 풀GC가 발생됨 Perm 영역의 크기는 OutOfMemoryError가 발생하고, 그 문제의 원인이 Perm 영역의 크기 때문일 때에만 -XX:PermSize 옵션과 -XX:MaxPermSize 옵션으로 지정해도 큰 문제는 없다. java reflection 예제 병렬성 제어하기 GC 알고리즘은 여러개의 스레드를 사용 (시리얼 컬렉터 제외) 플래그 스레드 개수 제어 -XX:ParaUelGCThreads=N 다음 동작 스레드 개수에 영향을 미침 -xx:+UseParallelGC 사용할 때 영 제너레이션의 컬렉션 -xx:+UseParallelOldGC 사용할 때 올드 제너레이션의 컬렉션 -xx:+UseParNewGC 사용할 때 영 제너레이션 컬렉션 -xx:+UseG1GC 사용할 때 영 제너레이션 컬렉션 CMS의 모든 애플리케이션 스레드 중단 단계 (stop-the-world) G1의 모든 애플리케이션 스레드 중단 단계 (stop-the-world) CMS, G1이 사용하는 백그라운드 스레드의 수를 설정하진 않음 모든 GC알고리즘에 사용하는 스레드의 기본개수는 머신 CPU개수를 기반으로함 단일 머신에 여러개의 JVM이 실행되고 있는 경우, 스레드 수가 너무 많다면 줄여야함 특이한 경우 - 매우 큰 객체의 할당 특이한 경우 - 짧게도 길게도 사용하지 않는 객체 알고리즘별 GC 튜닝 기본 튜닝으로 충분하지 않을때, 사용 중인 GC 특성 동작을 분석해 최적화된 튜닝을 해야함 G1 GC 튜닝과 연관된 특성 region 별로 generation을 지정해서 효율이 좋지만 튜닝하는게 까다로움 Old Generation GC를 꼭 필요할 때에만 실행한다. 보통 New Area와 Old Area 비율이 일정 값 이하로 떨어질 때 실행하게 된다. Young GC만 하다가 Old Area가 지속적으로 증가하여 New Area가 감소되면 Old Generation GC를 통해 어느 정도 회복을 한다. 물론 이 과정에서도 충분히 회복을 하지 못하면 결국엔 Full GC를 통해 회복을 하게 된다. 지금까지 알려진 문제 perm generation collection을 풀GC때만 함 (JDK 7) Hot Deploy를 많이 할 경우 perm Generation문제 발생 (http://openjdk.java.net/jeps/156) 자주 재배포 발생 코드가 있는 경우 문제가 생김 (class unloading을 풀GC때만 실행) 단, JDK 8u40 버전에서 permanent generation을 없애고 metaspace 방식으로 바꾼 후에 해결됨 class 영역이 클 경우 class unloading을 하는 gc 시간이 매우 길어질 수 있음 -XX:+UseLargePagesInMetaspace metaspace에 large page를 사용하여 접근하도록 함 (cf.TLB 관련 이슈) 메모리 사용량이 큰 객체(humongous object)에 대한 처리가 최적화되지 않음 큰 객체가 있을 경우, 다른 GC를 고려해아야함 어떻게 튜닝해야할 것인가? Tuning Java Garbage Collection for Apache Spark Applications 주요 포인트 사용하는 ConcGCThread 수를 늘림 InitiatingHeapOccupancyPercent옵션을 기본값보다 더 작게 설정 old heap region을 언제부터 mark하는지 지정 Parallel GC 고려해야할 포인트 영/올드 제너레이션 크기와 전체 힙 크기사이 균형 중단시간 참고해야할 트레이드 오프 힙의 크기 : 메모리 소비가 큰 대신, 애플리케이션 처리율이 높아짐 GC 수행하는데 걸리는 시간 : 힙 크기가 크면 풀GC 중단횟수가 줄어들지만 GC가 더 오래 걸려서 평균 응답 시간이 길어짐 풀 GC 중단 : 영 제너레이션에 더 많은 힙 할당하면 줄어들지만, 올드 GC컬렉션 빈도가 늘어남 p.194 그림 참고. https://logonjava.blogspot.com/2015/08/java-g1-gc-full-gc.html http://openjdk.java.net/jeps/156 JVM 구조 [그림] class 파일 JVM 으로 로딩 class 파일을 Execution Engine을 통해 해석 Runtime Data areas에서 동작 Tread 관리, Garbage collection 관리 작업 실행 Runtime data area (RDA) [그림] Java 프로그램 수행하기 위해 OS에서 할당받는 메모리 영역 WAS 사용할때 가장 빈번하게 성능문제가 발생함 PC Register, Java Virtual Machine Stacks, Native Method Stacks은 Thread 별로 생성 Method Area와 Heap은 모든 Thread에 공유된다. Java Virtual Machine Stacks, Native Method Stacks은 JVM 1.3 버전에서 통합 PC Register [그림] cf. PC counter : CPU에서 현재 실행 중인 명령어 다음에 실행될 명령어의 메모리 주소를 담고 있는 레지스터 PC register: stack base로 동작. Stack에서 operand를 뽑아내어 이를 별도의 메모리 공간에 저장 각 thread 마다 하나씩 존재. JVM은 연산을 위해 필요한 operand를 임시로 저장하기 위한 용도로 PC Register를 활용. PC Register는 현재 수행중인 JVM Instruction의 주소를 가지고 있게 된다. Java Virtual Machine Stacks [그림] Thread의 수행 정보를 기록하는 Frame을 저장하는 메모리 영역 JVM Stacks는 Thread별로 하나씩 존재하기 때문에 동기화 이슈가 발생하지 않음. Stack Frame Thread가 수행하고 있는 Application을 Method 단위로 기록하는 곳 Class의 메타 정보를 활용해 크기를 할당하는데 이 크기는 가변이 아니라 Compile Time에 이미 결정된다. Local Variable Section Local Variable Section은 0부터 시작하는 인덱스를 가지는 Array로 구성 인덱스를 통해 데이터에 접근 메모리 크기를 가변이 아니라 Compile Time에 결정할 수 있는 primitive type은 크기를 결정할 수 있으며, Object, Array, String과 같은 객체는 reference를 활용해 Heap 메모리를 참조하도록 할 수 있기 때문이다. primitive type가 reference보다 성능상 유리함 Reference는 Local Variable Section에서 Heap으로의 이동이 발생(CPU 연산) reference는 크기가 가변적이기 때문에, referece에 대한 주소가 저장이 됨 operand stack JVM이 프로그램을 수행하면서 연산을 위해 사용되는 데이터 및 결과를 처리하는 영역. JVM의 작업공간 OS에 종속적이지 않기 위해 따로 Operand 를 저장함 Stack이라는 말처럼 미리 공간을 할당하지 않고 push, pop 작업을 통해 필요할 때마다 공간을 할당한다. 각 Method별 StackFrame이 존재하는 영역이 이 영역이다. kill -3 pid로 Stack Trace 또는 Stack Dump를 얻어내어 분석하는 영역이 이 영역이다. "},"SLiPP_JVM/week04.html":{"url":"SLiPP_JVM/week04.html","title":"week04","keywords":"","body":"Spring에서 발생할 수 있는 여러 문제점 정리 중 JDBC에서 발생가능한 문제점들 애플리케이션의 응답속도를 지연시키는 상당수 원인은 DB쿼리수행시간과 결과를 처리하는 시간임. 실제로 성능 진단을 하면 8~90%의 시스템이 DB에서 많은 시간이 소요됨. DB쿼리 진단과 튜닝이 함께 진행되여야함 최근에는 mybatis처럼 SQL mapper가 가능하거나 ORM표준 JPA Framework를 많이 사용하므로 애플리케이션 환경에 맞는 튜닝 전략이 필요함 성능 튜닝시 고려해야할 것들 데이터베이스 관련 성능 측정 JDBC 튜닝 JPA 튜닝 SQL 튜닝 베스트 프랙티스 JDBC 와 JPA 설정을 적절하게 구성해서 가능한 한 많은 읽기와 쓰기 작업을 일괄 처리하자 애플리케이션의 SQL을 최적화 시키자. JPA 애플리케이션에서 L2캐시의 개입을 고려하자 가능하면 락을 최소화하자 반드시 prestatement pool을 사용하자 적절한 크기의 connection pool을 사용하자 적절한 트랜잭션 법위를 설정하자. 트랜잭션동안 락때문에 애플리케이션 확장성을 저해하지 않도록 가능한 크게 잡아야함 JDBC 고려사항 환경에 맞는 JDBC 드라이버를 선택 예를 들면,Oracle DB의 thin 드라이버는 데이터베이스 서버가 처리를 더 많이 하도록 하게 설정되어있고, thick 드라이버는 메모리를 더 사용해 Java client 에서 더 처리를 많이 해서 데이터베이스의 업무를 줄임. 대형 DB서버 + 작은 서버 라면 thin서버 사용하는 것 JDBC 드라이버 타입은 1~4까지 있음. 상황에 따라 맞는 드라이버를 선택 단, 타입 1 드라이버(다른 드라이버에 대한 JDBC 브리지 / ODBC와 JDBC 와 통신할 수 있게 해줄 수 있음)는 성능이 떨어지므로 특수한 상황을 제외하고 되도록 사용하지 말자 SQL 최적화 한번에 처리할 수 있는 작업을 여러 번 나눠서 하지말자 데이터베이스 서버의 작업을 최소화하고 동시에 자바 애플리케이션의 부담을 너무 늘리지 말자 JDBC통신에서 데이터베이스는 데이터를 처리하고 SQL명령을 받고, SQL지시에 따라 접근과 갱신작업을 처리하며 요구한 데이터를 돌려줌. 데이터베이스 서버가 해야하는 일이 많을 수록 서버 처리에 긴 시간이 소요됨 굳이 DB가 할 필요없는 일을 하게 만들지 말자 전송 데이터량의 최소화 - 꼭 필요한 데이터만 가져오자 예를 들면 SELECT * from foo 대신 필요한 데이터만 가져오자 JPA 성능 최적화 JPA 성능은 기본 JDBC 드라이버의 성능에 직접 영향을 받음 JPA는 entity클래스의 바이트 코드를 병경햇 성능을 개선함. Java EE 환경에서는 최적화 되어있음. Java SE환경에서도 바이트 코드 처리가 올바르게 설정되도록 하는 것이 중요함 compile 일부의 과정으로 이루어지며, 컴파일 후 바이트코드를 '개선'하는 postprocessor를 거쳐 최적화됨 에이전트는 classloading 중간에 끼어들어 class정의 전에 바이트를 변경함 에이전트는 애플리케이션의 커맨드 라인에 명시됨 트랜잭션 처리 Java EE에서는 JTA(Java Transaction API) 구현체 중 하나가 JPA 트랜잭션임 애플리케이션 서버는 CMT(Container Management Transaction)으로 범위를 다루거나 , UMT(User Management Transaction)으로 애플리케이션 내 트랜잭션 범위를 명시적으로 코딩할 수 있음 JAva SE 에서는 객체에 대한 트랜잭션 범위를 정해야함 트랜잭션 커밋 주기와 기본적인 트랜잭션 범위는 서로 트레이드 오프 관계임 JPA 쓰기 최적화 애플리케이션의 persistence.xml 파일 내 특정 속성을 설정해야함 Statement 재사용 설정 JDBC 드라이버가 statement pool을 제공할 수 있다면 JPA 설정에서는 이 속성을 빼고 드라이버 내에 statement 캐시 설정을 하는게 나음 자동 statement 배치 처리 JDBC드라이버는 자동으로 statement 배치 처리 할 수 없으므로 이 설정이 유용할 수 있음 persistence.xml 설정을 바꾸거나 flush() 메서드를 호출해서 바꿈 JPA 읽기 최적화 JPA는 데이터를 캐시하기떄문에 DB에서 데이터 읽는 시기와 방법을 최적화하는건 까다로움 JPA 가 데이터베이스를 읽는 경우 EntityManager의 find()메서드가 호출될때 JPA 쿼리가 실행될 때 코드에서 기존 엔터티 관계 이용해서 신규 엔터티를 탐색할때 기본 조회 - EntityManager의 find()메서드가 호출될때 최적화할 수 있는 요소: 조회할 데이터의 양 일부 컬럼만 가지고 오거나 조회할 컬럼에 관련됨 다른 엔터티를 prefetch(한 번 접속할때마다 여러 데이터를 미리 읽어들임) 데이터 덜 읽기 대상 필드가 지연로딩(lazy loading) 되도록 명시 - FetchType.LAZY 쿼리에 JOIN사용하기 Fetch Join 사용 단, JPA 캐시에 영향을 줄 수 있으므로 주의해야함 배치와 쿼리 JPA 구현체는 선택적으로 한 번에 모든 결과를 가져오거나, 애플리케이션이 반복될 때마다 결과를 가져오거나, 한번에 결과 몇 개만 가져옴 JPA에는 없지만 각 구현 프레임워크/벤더에는 페치 크기 설정 메커니즘이 있음 eclipselink : q.setHint(\"eclipselink.JDBC_FETCH_SIZE\", \"10000\") Hibernate : @BatchSize 연관된 엔티티를 조회할 때 지정한 size만큼 SQL의 IN 절을 사용해서 조회 JPA 구현체가 네임드 쿼리를 위해 거의 statemenct 캐시 풀을 사용해서 preparedStatement를 사용하므로, 네임드 쿼리를 통해 데이터를 읽으면 대개 일반적인 쿼리보다 더 빠름 위 내용이 복합적으로 연관된 것이 'N + 1 성능문제'임 JPA 캐시 Java내 자주 사용되는 데이터를 캐시하면 클라이언트의 응답 시간이 매우 빨라짐 JPA는 두 종류 캐시가 있음. 로컬캐시(L1) , 글로벌캐시(L2) Entity Manager instance 는 그자체로 캐시임 하나의 트랜잭션 동안 조회되거나/쓰인 데이터를 로컬에 캐시 트랜잭션이 커밋될떄만 데이터베이스로 전송 각각 다른 트랜잭션을 수행하고 자체 로컬캐시를 갖고 있음 엔터티 매니저가 트랜잭션을 커밋할 때 로컬 캐시(L1) 내 데이터는 전부 글로벌 캐시로 머지될 수 있음. 글로벌 캐시(L2)는 애플리케이션 내 모든 엔터티 매니저 사이에서 공유됨 하이버네이트는 L2 사용이 기본 설정이 아님. 사용하려면 고쳐줘야함 L2캐시를 사용하고 조율하는 방식이 성능에 많은 영향을 미침 JPA캐시는 기본 키 접속 entity(find() 메서드 호출, 연관 엔터티에 접속 또는 이른 로딩해서 조회한 아이템)에만 동작함. 쿼리를 통해 반환한 아이템은 L2캐시 내에 없음. 쿼리 캐시를 지원하더라도 엔터티 자체는 L2캐시 내에 저장되지 않으며 그 후 find()를 호출하더라도 사용할 수 없음 기본키나 ORM통해 객체 찾으려 할떄 L2캐시에서 찾아보고 있다면 객체 반환해서 데이터베이스까지 조회하는 시간 절약할 수 있음 JPA 캐시 크기 변경하기 캐시가 메모리를 너무 많이 소비하면 GC압박이 생기게 됨. 이럴 경우 캐시 크기를 조정해 튜닝하거나 엔터티가 캐시되는 모드를 제어해야함 배치 처리 수백만 건의 데이터를 배치를 한다고 하면, 일반적인 방식으로 엔티티를 계속 조회하면 영속성 컨텍스트에 아주 많은 엔티티가 쌓이면서 메모리 부족 오류가 발생. 이런 배치 처리는 적절한 단위로 영속성 컨텍스트를 초기화 L2 캐시에 엔티티를 보관하지 않도록 주의 일반적인 배치 처리 방법 페이징 처리: 데이터베이스 페이징 기능 사용 커서CURSOR: 데이터베이스가 지원하는 커서 기능 사용 JPA는JDBC 커서cursor를 지원하지 않음. 커서를 사용하기위해 하이버네이트 세션Session을 사용해야함 하이버네이트 scroll 사용 - JDBC 커서를 지원 하이버네이트 무상태 세션사용 JPA 읽기 전용 엔터티 읽기 전용 엔터티는 엔터티 상태 추적, 트랜잭션동안 락 잠그기 등의 작업을 할 필요가 없어 읽기-쓰기 엔터티보다 성능이 더 좋음 무엇보다 영속성 컨텍스트 관리에 드는 메모리 사용량을 최적화 할 수 있음 영속성 컨텍스트는 변경감지를 위한 스냅샷 인스턴스를 보관하면서 메모리를 많이 사용함 읽기 전용 쿼리 힌트 사용 하이버네이트의 경우, 'org.hibernate.readOnly' 사용TypedQuery 읽기 전용 트랜잭션 사용 스프링 프레임워크를 사용하면 트랜잭션을 읽기 전용 모드로 설정 @Transactional(reado nly = true) 하이버네이트 세션의 플러시 모드를 MANUAL로 설정해서 강제로 플러시를 호출하 지 않는 한 플러시가 일어나지 않는다.따라서 트랜잭션을 커밋해도 영속성 컨텍 스트를 플러시하지 않는다. 트랜잭션 밖에서 읽기 트랜잭션 없이 엔티티를 조회. 조회가 목적일때만 사용 트랜잭션을 사용하지 않으면 플러시가 일어나지 않으므로 조회 성능이 향상 스프링 프레임워크 설정 @Transactional(propagation = Propagation.NOT_SUPPORTED) J2EE 표준 컨테이너 설정 0TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 베스트 케이스 = 읽기 전용 트랜잭션(or 트랜잭션 밖에서 읽기) + 읽기 전용 쿼리 힌트 적용(or 스칼라 타입으로 조회) 읽기 전용 트랜잭션 사용:플러시를 작동하지 않도록 해서 성능 향상 읽기 전용 엔티티 사용:엔티티를 읽기 전용으로 조회해서 메모리 절약 N + 1 문제 처음 실행한 SQL의 결과 수만큼 추가로 SQL을 실행하는 것 하나의 비즈니스 로직에서 너무 많은 여러 개의 쿼리가 실행되는 문제 발생 즉시 로딩은 사용하지 말고 지연로딩을 되도록 사용하자. 성능 최적화가 필요한 곳에서는 JPQL의 페치 조인을 사용하자 즉시 로딩은 비즈니스 로직에 따라 필요하지 않은 엔티티를 로딩해야 하는 상황이 자주 발생. 가장 큰 문제는 성능 최적화가 어렵다는 점이다. 엔티티를 조회하다보면 즉시 로딩이 연속으로 발생해서 전혀 예상하지 못한 SQL이 실행될 수 있음 JPA의 글로벌 페치 전략 기본값은 다음과 같다. @OneToOne, @ManyToOne:기본 페치 전략은 즉시 로딩 @OneToMany, @ManyToMany:기본 페치 전략은 지연 로딩 생각해봅시다. 양방향 연결이 아니라면 N+1 문제가 발생하지 않나요? 때로 Database server에 부담을 주는(전송 데이터량 많거나, DB 서버 CPU 사용량 높이는 등) 하나의 쿼리보다 가벼운 쿼리를 여러 개 던지는 게 나을 수 있음. 배치 사이즈 조정과 연관이 있음. 예제 회원 @Entity public class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = \"member\", fetch = FetchType.EAGER); private List orders = new ArrayList(); ... } 회원의 주문정보 @Entity @Table(name = \"ORDERS”》 public class Order { @Id @GeneratedValue private Long id; @ManyToOne private Member member; ... } 1:N , N:1 양방향 연관관계 회원이 참조하는 주문정보인 Member .orders를 즉시 로딩으로 설정 즉시로딩 특정 회원 조회시, em.find (Member. class, id); 주문정보도 함께 조회 실행 SQL : Join 을 통해 회원과 주문정보 함께 조회SELECT M.*, 0.* FROM MEMBER M OUTER JOIN ORDERS 0 ON M.ID=O.MEMBER_ID 문제상황 - JPQL 사용할때 발생 -> JPA는 JPQL만 사용해서 즉시로딩 / 지연로딩 상관없이 SQL을 생성List members = em.createQuery(\"select m from Member m\", Member.class).getResultList(); 먼저 실행되는 SQLSELECT * FROM MEMBER 연관 주문 컬렉션이 즉시 로딩으로 설정되어있으므로 다음 SQL을 추가로 실행SELECT ★ FROM ORDERS WHERE MEMBER_ID=? 만약 조회된 회원이 5명 이라면SELECT * FROM MEMBER //1번 실행으로 회원 5명 조회 SELECT * FROM ORDERS WHERE MEMBER_ID=1 //회원파 연관된 주문 SELECT ★ FROM ORDERS WHERE MEMBER_ID=2 //회원과 연관된 주문 SELECT * FROM ORDERS WHERE MEMBER_ID=3 //회원과연관된주문 SELECT ★ FROM ORDERS WHERE MEMBER_ID=4 //회원과연관된주문 SELECT * FROM ORDERS WHERE MEMBER_ID=5 //회원과 연관된 주문 지연로딩을 한다면? FetchType.LAZY로 설정 데이터베이스에서 회원만 조회됨. SELECT * FROM MEMBER 비즈니스 로직에서 주문 컬렉션 실제 사용할떄 지연로딩 발생firstMember = members .get (0); firstMember.getOrders () .size (); / / 지연 로딩 초기화 실행 SQL은 아래와 같음SELECT * FROM ORDERS WHERE MEMBER_ID=? 하지만, 모든 회원에 대해 주문 컬렉션을 사용한다면?for (Member member : members) { //지연 로딩 초기화 System.out.printIn(\"member = \" + member.getOrders().size(); } SELECT * FROM ORDERS WHERE MEMBER_ID=1 //회원파 연관된 주문 SELECT ★ FROM ORDERS WHERE MEMBER_ID=2 //회원과 연관된 주문 SELECT * FROM ORDERS WHERE MEMBER_ID=3 //회원과연관된주문 SELECT ★ FROM ORDERS WHERE MEMBER_ID=4 //회원과연관된주문 SELECT * FROM ORDERS WHERE MEMBER_ID=5 //회원과 연관된 주문 페치조인 사용 조인 사용해서 연관 엔터티 함께 조회하므로 문제 해결됨. 실제 사용할땐 JPQL의 DISTINCT 사용해서 중복을 제거하자select m from Member m join fetch m.orders 실행 SQLSELECT M.*, 0.* FROM MEMBER M INNER JOIN ORDERS 0 ON M.ID=O.MEMBER_ID 트랜잭션을 지원하는 쓰기 지연과 성능 최적화 추가 예정 FrameWork 사용하지 않을때 / 애플리케이션과 데이터베이스 사이 계층이 없을때 잠깐 체크 .JDBC 관련 API는 interface이므로, 같은 interface라 하더라도 DB vendor에 따라 처리속도나 내부 처리방식이 다름. 사용하는 vendor를 더 살펴보아야함 DB connection시, 공통 유틸 사용 일반적으로 DB 관련처리 담당하는 DBManager 클래스를 사용함 WAS 에서 제공하는 DB conection Pool 또는 DataSource 사용 Why? DB에 쿼리날린다고 했을때, 가장 느린 부분은 DB와 WAS 사이 통신을 하는 Connection객체를 얻는 부분임. 사용자 증가시 Connection객체를 얻기 위해 시간 증가할 것임) Connection 객체 생성 부분에서 발생하는 대기시간을 줄이고, 네트워크 부담을 줄이기 위해 DB connection Pool을 사용함 Connection Pool을 사용하면, 시스템이 가동되면 지정된 개수만큼 연결하고,필요할 때 증가시키도록 되어있음(지정된 최대값까지만). 사용자가 증가해 더 이상 사용할 수 있는 연결이 없으면, 여유가 생길 때까지 대기. 그러다 어느정도 시간이 지나면 오류가 발생 검증되지 않은 Connection Pool은 성능저하를 일으킬 수 있음 (Q.정확한 정의가 뭐여 커넥션 풀 ) 각 모듈별 DataSource사용해서 리소스 부족현상 방지 Connection, Statement 관련객체, ResultSet들을 close 질문. GC될 때까지 기다리면 안되나? GC하기 전에 사용 후 바로 닫아서 DB와 JDBC 리소스를 해제해서 DB 서버의 부담을 줄이자 GC가 될 때까지 기다리면 Connection Pool이 부족해질 수 있음 Statement의 경우, GC대상이 되거나 close() 하는 두 가지 경우에만 닫힌다 try-catch-finally 를 사용해 close() 합시다 JDK 7 이상이면 AutoClosable 인터페이스로 구현되어있는 리소스 객체라면 try-with-resource를 사용하면 됨 Prepared Statement 사용 Statement대신 PreparedStatement를 사용하면, 이미 사용한 SQL에 대한 정보를 재사용 할 수 있어서 이점이 있음 같은 요청을 여러번하는 배치성 프로그램, 애플리케이션 서버는 PreparedStatement나 DB Framework를 사용하자. 캐싱 JDBC는 네트워크 통신, 데이터 변환, 서버측 처리의 부담을 안고 있음. 때문에 JDBC 데이터를 캐싱해야함. 그렇다면 '어떤 데이터를 어떻게 캐싱해야할 것인가' 어떤 데이터를? (캐싱 대상) : 읽기 전용의 작은 테이블과 자주 갱신되지 않는 테이블 어떻게 캐싱? ResultSet 레이어에서 캐싱 ResultSet에서 추출되고 객체 또는 객체 데이터로 변환된 뒤 캐싱 추가 팁 데이터베이스 서버의 위치? 트랜잭션 최적화 setAutoCommit() 메서드는 필요할 때만 사용 setAutoCommit()의 자동 커밋 여부를 지정은 반드시 필요할 때만 하자. 단순한 select 시 커밋 여부를 지정하게 될 경우, 여러 개의 쿼리를 동시에 작업할 때 성능에 영향을 주게 됨 일괄 갱신 배치성 작업은 executeBatch() 메서드 사용 배치성 작업올 할 때는 Statement 인터페이스에 정의되어 있는 addBatch() 메서드를사용하여 쿼리를 지정하고, executeBatch() 메서드를사용하여 쿼리를 수행. 여러 개의 쿼리를 한 번에 수행할 수 있기 때문에 JDBC 호출 횟수가 감소되어 성능이 좋아진다 행 페치 최적화를 위한 일괄 접근 setFetchSize()(Statement와 ResultSet 인터페이스) 메서드를 사용하여 데이터를 더 빠르게 가져오자 한 번에 가져오는 열의 개수는 JDBC의 종류마다 다름 가져오는 데이터의 수가 정해져 있을 경우에는 에 있는 setFetchSize() 메서드를 사용하여 원하는 개수를 정의 너무 많은 건수를 지정하면 서버에 많은 부하가 올 수 있으니, 적절하게 시용필요 한 건만 필요할 때는 한 건만가져오자. 게시판 페이징 처리 하기 위해 ResultSet객체.last() 메서드 사용금지 Java API - Interface ResultSet의 last method는 ResultSet객체가 갖고 있는 결과의 Cursor를 맨 끝으로 옮기는 메서드임. 메서드의 수행 시간은 데이터의 건수와 DB 통신 속도에 따라서 달라짐. 건수가 많으면 많을수록 대기 시간(Wait time)이 증가해서 rs.next()와 엄청나게 속도차이가 나게됨. 참고 blog.eomdev - Exception 처리에 대해서(자바7에 추가된 try-catch-resources 포함) 창천향로 - JPA N+1 문제 및 해결방안 stackoverflow - Hibernate batch size confusion 책 - 자바 ORM 표준 JPA 프로그래밍 (김영한) 책 - 자바 성능 튜닝(스캇 오크스) 책 - 자바 성능 튜닝 이야기 (이상민) 책 - 자바 퍼포먼스 튜닝 (잭 시라지) 서버 세팅 서버 세팅 문제 진단할때 기본은 성능 테스트를 통해 병목 지점 미리 파악하는 것 애플리케이션 위주 병목 보다 문제가 될 만한 세팅값을 먼저 진단하는 것이 효율적일 수 있음1. 아파치 웹 서버 세팅 정적인 부분 웹 서버에서 처리하도록 WAS 앞에 두어야함 상용서버의 경우, 벤더에서 설치와 설정을 해주니 제외함 아파치 웹 서버는 MPM(Multi-Processing Module)을 사용. 여러 개의 프로세싱 모듈 기반의 서비스를 제공함. 가장 손쉬운 설정 변경은 설치 폴더/conf 디렉토리의 'httpd.conf' 수정 ThreadsPerChild N(숫자값 설정을 뜻함) MaxRequestsPerChild N ㅌ2. WAS 서버 세팅 3. DB 서버 세팅 4. 장비 세팅 "},"SLiPP_JVM/week05.html":{"url":"SLiPP_JVM/week05.html","title":"week05","keywords":"","body":"Slipp 자바성능 스터디 5주차 스터디자료 정리 scouter 실행 실행안됨. 포트 겹치는지 확인 sudo lsof -i :\"포트 번호\" 로 확인 후 sudo kill -9 \"프로세스 번호\" cf.http://new93helloworld.tistory.com/138 "},"SLiPP_JVM/week07.html":{"url":"SLiPP_JVM/week07.html","title":"week07","keywords":"","body":"개요 현업에서 Java application 성능 개선 사례 공유 check 원인파악 - 디컴파일(jd compiler 사용)해서 해당 오류 상황 재현해봄 "},"Git_Github_Gitlab/awesomelist.html":{"url":"Git_Github_Gitlab/awesomelist.html","title":"Git/Github/Gitlab 학습","keywords":"","body":"Keyword awesome list github 상황 / 궁금증 콘텐츠를 스스로 찾아 학습하면서 삽질과 삽질을 거쳐 정리한 리스트로 현재는 입문에 초점이 맞추어져 있다. 사이드프로젝트를 함께 하는 사람들(github과 버전관리에 익숙하지 않음) 과 협업을 위해 정리해 둔 리스트 추가함 [ ] issue 관리, 코드리뷰, 오픈소스 컨트리뷰션 입문 등 어떻게 활용하는지 콘텐츠 추가 처음 학습을 시작할때만 해도 주위에 Github을 사용하는 사람이 없어서 스스로 찾아서 학습해야하는 상황이었다. 현업에서 사용하지 않았기 때문에 학습비용이 아깝지 않게 적용했을때 어떤 시너지가 나는지, 어떤 것이 강점인지를 찾는게 필요했다. 또 실제 현업에서는 어떤. 기능을 많이 쓰고 적용하는지와 함께 흥미를 잃지 않도록 적용 난이도를 낮출 수 있는 방법을 찾아야했다. 2018/04/30 내가 관리하는 모듈을 Gitlab으로 관리하도록 시스템을 잡아가고 있다. 최근에 현업 프로젝트에 적용하게 되면서 혼자 형상관리를 하기 위한 게 아니라 팀에서 어떻게 사용해야 효과적일지를 고민하고 있다. 정리 :+1:로 당장 git을 써서 협업해야하는 상황일때, 우선적으로 읽고 빠르게 적용하기 위한 콘텐츠를 구분해두었음 About Git/ Github 입문 책 - 인간다운 Git (Git For Humans) / 책소개한 블로그 : 누가 git이 뭐야? 써보고 싶어. 라고 나에게 물어본다면 이 책 추천. 전반적으로 git에서 많이 쓰이는 내용과 함께 git에 있는 미묘한 개념, 협업부분에 대해 설명. 문고판 크기로 80장 정도 되어 읽기 부담스럽지 않음. git add 한 다음에 git commit 해야하는 건 알겠는데 왜 바로 커밋안하고 staging(git add)하는지에 대한 걸 알고 싶다면, 바로 이 책이다. Github Guides :+1: : 짧게 짧게 읽으면서 감 잡기에 좋음. 아티클 읽는 시간은 10분 내외임 Git-flight-rules +1: 이런 상황에는 이런 git commad를 사용하면 된다를 짧게 try Git - exersise git - the simple guide :+1: git/github 기초강의- 코드스쿼드 누구나 쉽게 이해할 수 있는 git 입문 Git을 이용하여 텔레파시 통하는 팀 만들기 : commit message와 commit log - 해줌스토리 :+1: How to Write a Git Commit Message 만들면서 배우는 Git+GitHub 입문 / 도서:books: : 제목에 충실한 책. 모르는 게 너무 많아서 시도해볼 엄두가 안날때 두려움을 떨쳐내는데 도움이 많이 되었음 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서 / 도서:books: : 왜 Git을 사용해야하는가?에 대해 친절하게 나와있음. 나는 php개발자가 아닌데도 배움의 우선순위를 파악할 수 있어서 좋았다. 뭐가 중요한지 목차를 보면 됨. Action 배웠다면 일단 시도해봅시다! :+1: [GitHub] GitHub로 협업하는 방법[1] : 주위에 친구 몇 명만 모집해서 이 방식으로 프로젝트를 해보는 건 어떨까? 내용없이 git사용법만을 익히기 위한 프로젝트라도 괜찮을 거 같음. 난 처음엔 git이 궁금해서 일단 코드없이 프로젝트 기록이나 자료링크를 모아두는 마크다운으로만 이루어진 프로젝트를 만들었고, 부담없이 재밌게 배울 수 있었음 깃허브(GitHub)로 취업하기 by Sujin Lee : 구직목적이 아니더라도 Github 활동에 대해 깔끔하게 정리되어 있음 Code For Women 첫 세미나 - 일일커밋 후기 by Joeun Park first contribution FIRST TIMERS ONLY - Friendly Open Source projects should reserve specific issues for newbies 주요 레퍼런스 ebook - pro Git book / ebook - pro Git book(한국어) 내용이 너무 많아서 입문할때는 읽어볼 엄두가 안났었는데, 좀 두려움이 가시고 나니 이것만한 콘텐츠가. 없다. 내 경우, 자주 쓰이는 명령어를 익힌 상태라서, 이후 Git 학습은 '모르는 부분 검색 -> 관련 키워드 찾음 -> 위 아티클에서 찾아서 컨텐스트 파악'의 프로세스로 진행하고 있다. 영문판 한글판 두 개를 동시에 보고 있음. 개념을 빠르게 이해하기 위해 한글판을 먼저 보고, 구글링을 위해 한글화되지 않은 용어를 확인용으로 영문판을 봄. 가끔 어색한 한글번역이 있어서 1판도 참고함. git 명령어 단순암기를 넘어서 어떻게 동작하는지 궁금하다면 10.Git의 내부를 추천. 나는 읽은 내용을 Git 내부 에서 정리하고 있다. 틈틈이 읽으며 정리하고 있음 git- docs : git --version으로 사용하고 있는 version에 맞는 doc 확인 Github Help : github 사용하면서 발생하는 여러 상황에서 바로 적용할 수 있도록 Help 문서 제공 Gitlab Help : Git을 프로젝트에 어떻게 적용해볼 수 있을지 힌트가 되는 문서들이 있음. 현재 사용하고 있는 Gitlab 버전을 잘 확인해야함. 기능 제공되는줄 알고 설레었다가 회사 Gitlab 버전이 낮아서 시무룩해진 적이 몇 번 있음. 프로젝트 관리 관점 - 어떻게 적용할 것인가? 아래 레퍼런스를 참고하여, 다른 팀원들이 적용할 수 있도록 회사 프로젝트에서 Git 기본 사용 가이드를 작성하였다. 협업 SLiPP 테스트기반개발 스터디 wiki - SW 개발 업무 Cycle :+1: : 스터디를 하면서 현업에서는 어떻게 진행하고 있는지 감 잡는데 많은 도움이 되었다. / 여기서 배운 것과 온라인 코드리뷰 강의를 들으면서 정리한 내용은 코드리뷰에 업데이트하고 있다. GitHub Flow explain by Sung Kim :tv:/ 동영상 :+1: GitHub Flow demo :tv:/ 동영상 :+1: 협업flow 간단한 설명 (Git 익숙하지 않는 프로젝트 팀원용 초간단 tutorial) git을 사용한 프로젝트관리 flow에는 GitFlow, GithubFlow, GitlabFlow가 있음. 크게 Issue 등록 - Branch - commit - PR - codeReview - Merge 단계를 거침 작업단위 외에 고쳐야할 버그는 issue 먼저 작성 (Assignee, Milestone 지정) 해당하는 Milestone이 없을 경우, 팀멤버와 이야기 한 후 설정 각각 본 레포지토리 fork 후 로컬에서 작업단위로 Branch 나누어 commit 이후 pull Request codereview 후 merge Github로 프로젝트 관리하기 by cheese10yun : GitHub을 활용한 기본적인 프로젝트 관리방법을 익힐 수 있음. 처음 시작할때 놓치기 쉬운 부분을 짚어줌. 팀을 위한 Git - Git 워크플로우를 효율적으로 만드는 사용자 중심 접근법 / 도서 : 협업관점에서 어떻게 git을 사용할 것인지 고민되어서 읽는 중. 아웃사이더 - Book 팀을 위한 Git님의 서평 참고 Version 명세 유의적 버전 명세 codereview / contribution 텍스트와 이미지로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정 :+1: GITHUB와 함께 Social하게 코딩하기 by Young-Ho Cha Github를 기반으로 한 온라인 코드리뷰 방법 / 동영상 :tv: :+1: Naver 오픈소스 가이드 commit-together-with-co-authors Issue github guide - issue 내 집 관리도 github issue 관리로! Issue tracker for my house github - issue/PR template PR How to test Pull Request? Checkout github pull requests locally GitHub의 Merge, Squash and Merge, Rebase and Merge 정확히 이해하기 : PR을 반영할때 적절한 방식을 찾기. 내 사이드 프로젝트에서는 PR 단위를 먼저 정의하고 들어가기 때문에, log를 빨리 파악할 수 있도록 주로 sqash and Merge하는 편이다 Branch Branch명 : 영어,동사-(작업파일 또는 단위) stackoverflow-git-branch-naming-best-practices Git Branch - 릴리즈 플래닝 - 회사에서 하고 있는 걸 정리해본다 e.g. refactor-authentication, user-content-cache-key, make-retina-avatars 참고.Understanding the GitHub Flow commit Log : 영어로 목적어 + 동사 참고: How to Write a Git Commit Message Git Commit Good Practice 그외 팁 / 기타 sourcetree : 널리 쓰이는 git client tool. CLI 대신 GUI를 통해 git을 사용해보고 싶다면 추천. 널리 쓰이기 때문에 사용방법과 오류메시지를 인터넷에서 찾기 쉬움. Fork - 가벼운 git client tool : 많은 사람들이 사용하는 sourcetree보다 좀 더 가벼운 느낌. 해당 tool을 사용하면서 불편함은 없고 UI를 사용하기 편했지만 한국어 지원이 되지 않는다는 점을 참고. Git 팁 모음집 (https://github.com/git-tips/tips 한국어 버전) Removing sensitive data from a repository Squash your commits MarkDown cheetsheet Git - submodule Git: 서브모듈 이해하기 (git submodule)- by ohgyun sparse checkout git-commit-push-pull-with-sparse-checkout "},"DataVisualization/awesomelist.html":{"url":"DataVisualization/awesomelist.html","title":"DataVisualization for Beginner","keywords":"","body":"Keyword awesome list data visualization 상황 / 궁금증 컨트리뷰톤 음악분석 프로젝트에서 데이터시각화를 맡게 되면서 새롭게 시각화를 스터디했던 자료)를 정리 / NohYujeong님과 즐겁게 작업했다 이 프로젝트를 하면서 목표를 향해 팀과 함께 협업하는 재미와 사이드프로젝트의 짜릿함을 배울 수 있어서 즐겁게 작업했다. 같이 공부하는 재미를 깨달았고, 회사 끝나고 일주일에 세 번씩 만나면서도 즐겁게 프로젝트를 할 수 있었다. 프로젝트 진행 과정에서도 어떻게 조율하면서 구현해 낼 것인가(재미로 하는 프로젝트이다보니)를 고민하게 되었다. 이때 이후로 본격적으로 회사 외부에서도 스터디, 사이드프로젝트 작업 등 일을 벌리기 시작했다. 이때 github에 정리하면서 프로젝트와 학습을 어떻게 결합시키면서 같이 병행할지, 학습 콘텐츠를 어떻게 찾고 정리하는지 의식하면서 작업을 하는 계기가 되었다. 멘토분들이 비즈니스 관점에서 멘토링 해주고 부드럽게 큰 틀을 잡아주면서 가이드를 해주는 모습을 보고 많이 배웠다. 정리 This collection of links are D3.js Tutorial for Beginner(D3.js is JavaScript library for manipulating documents based on data). This will not cover any statistics or modelling, and this will not stray outside the JavaScript or SVG we need for the visualizations. Let's practice D3.js together! :sunglasses: What is data visualization + MOOC What Is Data Visualization? First of all, You can see this data visualization project. Just know what is data visualization. Explore Github Topic 'Data visualization'! :sunglasses: The beauty of data visualization - David McCandless (:tv:Video) The Art of Data Storytelling with Isaac Reyes (:tv:Video) Making data mean more through storytelling | Ben Wellington | TEDxBroadway (:tv:Video) Harvard i-lab | Data Visualization for Non-Programmers (:tv:Video) 데이터 시각화란 무엇인가 (What is data visualization)Sey Min at TEDxBusan (:tv:Video) 데이터 시각화(Data visualization) - blog.ab180 Designing Data Visualizations with Noah Iliinsky (:tv:Video) Introduction to Data Visualization (:tv:Video) / :closed_book:pdf MOOC Data Visualization-University of Illinois at Urbana-Champaign | Coursera Data Analysis and Visualization | Udacity Data Visualization | FreeCodeCamp D3 reference https://github.com/d3/d3/wiki https://github.com/d3/d3/wiki/API-Reference https://bost.ocks.org/mike/ D3.js Tutorial https://github.com/d3/d3/wiki/tutorials Getting Started with D3.js (:tv:Video)with livedemo / :closed_book: slide Data Visualization and D3 by David Chouinard (:tv:Video) https://square.github.io/intro-to-d3/ Introduction to D3 (:tv:Video) D3.js Tutorials: Part 1 - An Introduction to D3.js (Data Driven Documents) (:tv:Video) D3.js tutorial - 1 - Introduction (:tv:Video) d3-js-step-by-step by zeroviscosity (github) / Site workshop materials for introduction to d3.js(github) Data Visualization Course - D3.js Visualization | Udacity Based on / Using D3.js Redefined chart library built with React and D3 Create word clouds in JavaScript / Github Re-usable, easy interface JavaScript chart library based on D3 v4+ / Github Interactive Data Visualization with D3.js, DC.js, Python, and MongoDB (Blog post) / Source (Github) d3 tooltips Event drop by marmelab / Github : A time based / event series interactive visualization using d3.js A music frequency visualizer using D3.js - Live Demo / Github CodeFlower Source code visualization / Github ArchitectureTree / Github : Draw and share your software architecture without diagramming software. Uses d3.js and Angular.js. D3 Book Getting_started_with_D3 by Mike Dewar / Translationum-Kor 자바스크립트와 SVG로 쉽게 만드는 웹 기반 데이터 비주얼라이제이션 D3 d3.js - Interactive Data Visualization for the Web by Scott Murray / Translationum-Kor D3.js : 쉽고 빠른 인터랙티브 데이터 시각화 D3.js in Action / Translationum-Kor D3.js 인 액션 Data Visualization with d3.js by Swizec Teller / Translationum-Kor d3.js를 이용한 데이터 시각화 -자바스크립트로 눈에 띄는 차트 만들기 Visual Storytelling with D3: An Introduction to Data Visualization in JavaScript / Translationum-Kor D3를 이용한 시각적 스토리텔링 Data Visualization with D3.js Cookbook / Translationum-Kor 다양한 레시피로 보는 D3.js 쿡북 - 웹 기반 상호작용이 가능한 강력한 데이터 시각화 D3.js Gallery /Example https://github.com/d3/d3/wiki/Gallery http://christopheviau.com/d3list/index.html Portfolio Beatles schedule chart D3.js portfolio by hemanthnair Article government-data-applications-vizualisations best-data-visualization-projects-of-2016 10-best-data-visualization-projects-of-2015 16-creative-data-visualization-techniques-to-showcase-your-numbers interactive-infographics-a-new-view-of-statistics-visualization Example heatmatrix Tips Google search keyword : d3 + portfolio / datavisualization + best / data visualization + uk / Circular Infographics + d3.js 주피터(Jupyter) 노트북과 자바스크립트 환경 이해하기 - 주피터 위에서 D3.js를 활용한 시각화 Run D3 in a IJavascript notebook Data Sucks, Says Who? 16 Creative Data Visualization Techniques To Showcase Your Numbers For Fun Live Coding (Basic) \"The Future of Data Visualization\" - Jeffrey Heer (Strata + Hadoop 2015) (:tv:Video) Visualizing Data with D3.js-LIVE- by Siraj Raval (:tv:Video) Data Visualization with D3 by Michael Menz (:tv:Video) Data Visualization keynote with Alberto Cairo (:tv:Video) The Best Way to Visualize a Dataset Easily (:tv:Video) About Big data Analyzing and modeling complex and big data | Professor Maria Fasli | TEDxUniversityofEssex (:tv:Video) How Big Data Can Influence Decisions That Actually Matter | Prukalpa Sankar | TEDxGateway (:tv:Video) "},"Algorithm/awsomelist.html":{"url":"Algorithm/awsomelist.html","title":"Algotithm 기초 학습","keywords":"","body":"Keyword awesome list Algorithm 상황 / 궁금증 알고리즘이 도움이 될 꺼라는 생각이 들면서도, 참 자신이 없는데 공부를 위해 그동안 모은 자료 리스트를 다른 분들에게 공유한 적이 있었다. 정리된 자료가 휘발되지 않기 위해 기록해둔다. JahyeHa님이 취합해 공유해주신 글을 기반으로 콘텐츠와 링크, 설명을 덧붙여 적었음. 정리 이론과 개념 visualgo : visualising data structures and algorithms through animation Hello Coding 그림으로 개념을 이해하는 알고리즘 / 도서 :books: : 기초 지식이 없는 사람들이 부담없이 입문하기 좋음. 모두의 알고리즘 with 파이썬 / 도서 :books: : Python으로 기초 알고리즘을 소개한다. 역시 부담없이 접근. 알고리즘 도감, Moriteru Ishida : 모바일 애플리케이션 / 도서 유료 애플리케이션을 사면 모든 콘텐츠를 볼 수 있음. 데이터압축, 보안에 대한 기본내용도 있음. 단계별로 차근차근 설명이 되어있기때문에 이해를 돕는데 도움이 됨. 이동시간에 간편하게 볼 수 있어서. 재밌었음. 영리한 프로그래밍을 위한 알고리즘 강좌 / 동영상 :tv: : 많이 추천되는 부경대 권오흠 교수님 강좌. 직접 실습하면서 알려주시기 때문에 차근차근 볼 사람은 좋음. 강좌 평을 보면 다이나믹 프로그래밍이 특히 좋았다고 함. Jave,C Java로 배우는 자료구조 / 동영상:tv: : 부경대 권오흠 교수님 강좌. 실습강의로 기본 Java문법을 함께 학습할 수 있음 생활코딩 자료구조 강의 / 동영상 :tv: & 프로그래머스 강좌 / 동영상,실습 - 생활코딩 강좌를 기반으로 강의 + 실습예제 + 진도관리 할 수 있게 만듦. 알고리즘 문제해결전략(구종만 저) / 도서 :books: : a.k.a. 종만북. ACM-ICPC 대비하는 사람이 많이 보며, c++로 되어있음. 처음보기에는 수준이 높음 다양한 예제로 학습하는 데이터 구조와 알고리즘 for Java: 문제 해결법부터 개선법까지 / 도서 :books: : 예제가 많음. 알고리즘 문제 풀어볼 수 있는 곳 프로그래머스 : 한국어로 된 학습콘텐츠가 있음. 코딩테스트 플랫폼으로 활용되기도 함. 백준 온라인 저지: 알고리즘 문제풀로 유명. 알고리즘 대회를 준비하기 위한 수준높은 문제, 기출문제가 풍부함. goorm edu: 모의코딩테스트 제공. 프로그래밍 학습콘텐츠 같이 있음. 개발사인 코다임의 다른 서비스인 구름TEST는 코딩테스트 플랫폼이기도 함. Hacker Rank : 수준별 알고리즘 문제가 많음. 30일동안 1문제씩 푸는 30DaysOfCode 콘텐츠, 문제를 풀어 포인트를 쌓는 시스템 등 꾸준히 학습을 이어나가는데 도움이 되도록 설계해둠. LeetCode: 학습콘텐츠 함께 제공. 다양한 언어로 문제를 풀 수 있음. 해외 IT기업에서 코딩테스트 플랫폼으로 많이 활용함. Codility : 국내 Tech회사에서 이 플랫폼을 활용해 코딩테스트를 진행하기도 함. Pramp : 참여자들이 서로 면접관-면접자가 되어서 화상 모의 기술인터뷰를 진행할 수 있음.(수준별,시간별로 매칭함. 영어로 의사소통해야함. 기본 면접문제는 주어짐). 페이스북,구글,아마존 등 유명 Tech기업들의 개발자들도 만나볼 수 있다고 함. 최근에 친구끼리 Pramp할 수 있는 기능이 생김. The 10 Best Coding Challenge Websites for 2018 by Daniel Borowski Reference Awesome Algorithms quora - What-are-the-best-and-efficient-ways-to-learn-algorithms-for-beginners coding interview 관련 콘텐츠 모음 "},"CodingInterview/guide.html":{"url":"CodingInterview/guide.html","title":"coding interview Guide","keywords":"","body":"Reference How to make progress while studying for coding interviews 어떤 관점에서 기술면접을 하는가? 주니어 개발자를 위한 취업 정보 - 신입 개발자 구직 팁 개발자 채용시 기술검증 어떻게 할 것인가(김창준님) okky워크숍 \"개발자 채용시 기술검증 어떻게 할 것인가\" 워크샵 참석 후기 개발자 채용 시 기술검증 어떻게 할 것인가 [입 개발] 전문가는 계속 공부하는 사람이다. – 김창준님의 개발자 실력 평가 어떻게 할 것인가 후기 OKKY 취준생 MeetUP 201705301 / 동영상 :tv: 소프트웨어 개발자 인터뷰 에서 무엇을 보려고 하는가? [번역] 코딩 공부 후 3개월 간 구직하며 배운 점 개발: 개발자 채용시 기술 면접 보는 방법 / 동영상 :tv: 회사에서 원하는 프로그래머 by 김포프 / 동영상 :tv: #292 [면접팁] 좋은 면접자/지원자가 되는 방법 2016-11-28 훌륭한 개발 문화의 이면(1) – 코딩 테스트 인터뷰 제대로 하기 coding interview question Google tech devguide - coding-interview-question "},"Algorithm/BigO.html":{"url":"Algorithm/BigO.html","title":"Big O","keywords":"","body":"Big O 알고리즘은 실행시간이 얼마가 걸리는지가 아니라 '데이터의 크기에 따라 얼마나 실행시간이 증가하는지'가 중요 e.g. 전화번호를 각각 binary Search와 simple search 하는 경우의 실행시간을 생각해봅시다.(한번 실행시 1ms가 걸린다고 가정) 전화번호갯수 BinarySearch Simple Search 비고 1,000 약 10ms 1,000ms 이정도 차이야 뭐 견딜수있음 1,000,000,000 13ms 11days 아... simple search 못쓰겠다... 알고리즘의 속도는 시간이 아니라 연산 횟수가 어떻게 증가하는지로 측정함 -> 데이터 크기가 커질때 알고리즘의 실행속도가 얼마나 증가하는지 알 수 있음 알고리즘의 실행시간은 일반적으로 최악의 실행경우를 가정한 Big O 표기법을 사용함. O(n) , O(log n) , O(n*log n), O(n^2) "},"Algorithm/binarySearchTree.html":{"url":"Algorithm/binarySearchTree.html","title":"이진탐색트리 Binary Search Tree","keywords":"","body":" BinarySearch ADT sorting Heap : 운영체제 메모리 구조에서 쓰임 LinkedList 연결개념 데이터 로드(load) - exe - input putput 변수는 그릇 그릇의 모양 - 자료구조 적절한 그릇타입을 찾는일 - 접시에 물담아 마시면 화남(두루미 모습 - 여우 지금 니 나 멕이는거지?) -> 현실문제 - 검색어 치고 엔터딱 쳤는데 삼십분 후에 검색 결과 뜸( 아무도 그 서비스 사용안함) -> 자료구조에 대한 이해 비에스티 - 어떤 모양의 그릇? 어떤 경우에 이 그릇을 써야할까? - 많이 쓰이는 곳 서치(탐색) - 이진탐색 - 이진탐색트리 - 힙 - 운영체제와 연관시켜서 이해하기 위해서는 펜이 필요 - 문제 가져오기 데이터의 특성 - divide N qun - 저장문제 정복 -- 어떤 종류의 데이터만 담고 있어. 여기랑 여기는 섞이지 않아. small size 로 줄여나감. tree 구조에서도 재귀 많이 사용함 LinkedList 와 연관 값 저장 + 다음 노드 무엇인지 저장 level 에 따른 node 수 : 2^0 2^1 2^2 어떤 next로 가야할까? - tree 의 관리기법 용어 정리 - Terminologies of tree structure 발표용 : 예제로 문제내기 / 모양에 맞게 기본 용어 : root, edge, node 'root 에 대한 정보' 관계: Parents - Child / siblings / Descendants of A(올라가다보면 만남), Ancestors of E = A,B 위치에 따라 : Leaves[Terminal Nodes] , Internal Nodes 중요 Path to E Root에서 특정 노드(E)까지 최단거리 Depth and level of B = 1 (Root에서 B까지 Path의 길이) Height of Tree = 2 = Leaf까지의 path Degree of B = 4 = B 가 가지는 childe의 수 tree size = node 의 갯수 모양에 따라 Full tree 꽉 찬 삼각형! Leaf 꽉 차있음 complete tree 바로 직전 depth까지는 Full tree Filled from left 왼쪽에서 오른쪽으로 채워나가는 과정이면 complete tree 수식적인 특성 Characteristics of Tree 발표용 : pass. 이거 왜 필요하죠? edge갯수는 node 의 갯수만큼? -> reference 되는 node 갯수만큼 -> Root는 reference 안되는 node => num of nodes -1 Depth of root = 0 Height of root = height of tree Maximum num of nodes at level i with degree d = d^i Maximum num of leaves with height h and degree d = d^h Maximum size of a tree with height h and degree d = 1 + d + d^2+...+d^h = (d^h+1 - 1)/d-1 Height of a complete tree with size s and degree d h = r log d s(d-1)+1 ㄱ - 1s = (d^(h+1) -1) / (d-1) s(d-1) = d^(h+1) s(d-1) + 1 = d^(h+1) log d (s(d-1)+1) = h + 1 h = r log d s(d-1)+1 ㄱ - 1 #올림 s = 16 , d= 4 then h = 2 Binary Search Tree and Implementation How to perform a faster search? 빠른 검색! Implementation of tree node : 05:13 Root 에 대한 reference만 저장해 놓음 tree는 root에 대한 access만 가짐 Insert and Search Operation of Binary Search Tree 우리가 지켜야할 규칙 : parent 보다 작은 값은 왼쪽 node로 큰 값은 오른쪽 node로 insert 한다 recursion BST - 외부 자료 이진 탐색 트리에서는 자료를 보관할 때 부모보다 작은 값을 갖는 자료는 부모의 왼쪽 서브 트리에 매달고 큰 값을 갖는 자료는 부모의 오른쪽 서브 트리에 매다는 이진 트리입니다. 그리고 이진 탐색 트리에서는 같은 값을 갖는 자료는 보관하지 않습니다. 이처럼 매달면 서브 트리도 이진 탐색 트리인 특징을 갖습니다. 이진 탐색 http://ehpub.co.kr/6-3-이진-탐색binary-search/ 트리란? http://ehpub.co.kr/7-이진-탐색-트리/ 재귀적인 방식으로 http://ehpub.co.kr/7-2-이진-탐색-트리binary-search-tree-개요/ 이진 탐색 트리에서는 자료를 추가할 때 재귀적인 방법으로 부모 노드를 찾을 수 있습니다. 그리고 검색할 때나 삭제할 때도 원하는 자료를 보관한 노드를 재귀적인 방법으로 찾을 수 있습니다. 다음은 자료를 추가할 때 부모 노드를 찾거나 검색 및 삭제할 때 원하는 자료를 보관한 노드를 찾는 알고리즘입니다. 물론 검색과 삭제에서는 반환한 노드의 값이 원하는 자료인지 확인은 해야겠죠. 검색 (key:키, sroot: 서브 트리의 루트노드) 조건(sroot가 존재하지 않으면) 0 반환 rkey:= sroot.key gap: = rkey – key 조건(gap IsEqual 0) sroot 반환 조건(gap 0) 조건(sroot의 왼쪽 노드가 있다면) 검색(key, sroot의 왼쪽 노드) sroot 반환 이처럼 검색하면 높이가 h인 트리에서 각 계층(레벨, Level)마다 하나의 노드와 비교합니다. 따라서 이진 탐색 트리에서 검색 비용은 높이와 비례합니다. 만약 이진 탐색 트리의 각 계층의 노드가 꽉 차면 노드의 개수의 합은 2의 h승 -1개 입니다. S(h) = 2^0 + 2^1 + 2^2 + … + 2^(h-1) =2^h – 1 따라서 검색 비용은 노드의 개수가 n일 때 h 번이므로 h = logn이며 Θ(logn)이라 말할 수 있습니다. 하지만 편향 트리에서는 O(n)일 수 있습니다. 삽입, 삭제 , 검색 눈으로 보기 https://www.cs.usfca.edu/~galles/visualization/BST.html Algorithm complexities http://bigocheatsheet.com "},"Algorithm/DynamicProgramming.html":{"url":"Algorithm/DynamicProgramming.html","title":"Dynaminc Programming","keywords":"","body":"참고 알고리즘 강의 - 권오흠 교수님 책 컴퓨터과학이 여는 세계 - 이광근 정리 Richard Bellman이 만듦. 대표적인 두가지 유형으로 Dynamic Prgramming을 살펴보자(피보나치 수열, 이항계수) 문제를 순환함수로 정의하여 순환식을 사용하여 문제를 풀어나감. top-down방식의 Memoization과 bottom-up방식의 Dynamic programming 이 있음 Memoization 중간 계산 결과를 caching(배열 cache에 저장)해서 중복계산을 피함 pros. 실제로 필요한 subproblem만 사용함. cons. recursion 을 사용하기 때문에 overhead가 발생할 수 있음 Dynamic programming(bottom-up) 배열을 이용해서 순환식의 가장 단순한 항부터 계산하는 테크닉. bottom-up은 기본 bottom에서 시작해서 내가 원하는 값을 구하는 것이므로, 어디가 'bottom'인지 즉, 계산을 어느 방향에서부터 시작하는지 정의해야함 pros. recursion 을 사용하지 않아서 overhead가 발생하지 않음 cons. 실제로 필요한 값외에 subproblem만 사용함. 피보나치 수열 순환식으로 정의되기때문에 Recursion 으로도 구현 But 많은 계산이 중복됨 == 비효율적 e.g fib(7) = fib(6) + fib(5) = (fib(5) + fib(4)) + (fib(4)+fib(3)) = ...Memoization 사용 이미 계산된 fib(n) 값이 있다면, 그 값을 쓰자! 중간 계산 결과를 caching(배열 cache에 저장)해서 중복계산을 피함 계산값을 저장할 배열(cache라 부름)에 값을 저장 caching int fib(int n){ If(n == 1 || n ==2) return 1l else if (f[n] > -1) // 배열 f가 -1로 초기화되어있다고 가정 return f(n)l else{ f[n] = fib(n-2) + fib(n-1); // 중간 계산결과를 caching } } Bottom-up 방식 우리가 f(10) 을 계산하려고 할때, 차례대로 1,1,2,3,5,8,13,21,34,55,... 이렇게 계산할 것이다. f(8)을 계산하려는 시점에 이미 f(6)과 f[7] 의 값을 이미 가지고 있음 배열을 이용해서 순환식의 가장 단순한 항부터 계산하는 테크닉 int fib(int n){ f[1] = f[2] = 1; for (int i = 3; i 이항계수(Binomial Coefficient) nCk (n >= k) 이항계수 정의 : n 개 중 k를 선택하는 경우의 수 계산: nCk = (n!) / {(n-k)!k!} , 많은 계산이 중복됨. 또한 계산하면 매우 큰 수임. Overflow 발생하기 쉬움. 100! 계산을 생각하면 int형으로는 힘듦 접근 : n개 중에 k개를 고를 경우의 수 = 특정 원소 a를 골랐을때 경우의 수 + 특정원소 a를 고르지 않았을 때 경우의 수 = 특정원소 a를 제외한 n-1개에서 k-1 개를 고를 경우의 수(이미 특정원소 a는 모든 경우에 항상 들어가므로, a를 제외한 전체 n-1개에서 a를 제외한 k-1 개를 고르는 경우의 수) + 특정원소 a를 제외한 n-1개에서 k 개를 고를 경우의 수 (특정원소 a는 항상 포함되지 않으므로, 전체 수가 a를 제외한 n-1개가 되고, 그 중에서 k개를 골라야함)= n-1Ck-1 + n-1Ck int binomial (int n, int k){ if(n == k || k == 0 ) // base case return 1; else // general case return binomial(n-1,k) + binomial(n-1, k-1); // recursion 하다보면 , 첫 항은 n = k , 두번째 항은 k=0 에 도달하게 됨. } 잠깐! Recursion 설계 체크 base case recursion case(general case) 중요조건 : recursion이 무한루프에 빠지지 않으려면, general case 를 recursion 하다보면 base case에 도달해야함. Memoization n,k 두 가지 값으로 정의되기때문에 cache가 2차원 배열. n >=k 이므로 2차원 배열 절반만 사용 int binomial (int n, int k){ if(n == k || k ==0){ return 1; }else if (binom[n][k] > -1){ // 배열 binom 이 -1로 초기화되어 있다고 가정 return binom[n][k]; }else { binom[n][k] = bonomial(n-1,k) + binomial(n-1,k-1); return binom[n][k]; } } Bottom-up int binomial(int n , int k){ for(int i =0 ; i 피보나치 수열(1차원 배열 cache사용)과 다르게 2차원 배열을 cache로 사용하고 있으므로 어디가 'bottom'인지 즉, 계산을 어느 방향에서부터 시작하는지 정의해야함 bottom-up은 기본 bottom에서 시작해서 내가 원하는 값을 구한다. 순환식에서 오른쪽 항(binom[i-1][j-1] + binom[i-1][j])에서부터 왼쪽 항(binom[i][j] )을 구한다는 의미. 그러려면 오른쪽 항의 값이 미리 계산되어야함. 이 경우에는 위 그림의 dependency 같이 대각선 방향에 대한 값(binom[i-1][j-1] ), 바로 위 행에 대한 값(binom[i][j])을 알아야함. 만약 행 우선순위로 테이블 값을 계산한다면, 계산해야할 값의 윗 행의 값이 이미 구해져있으므로 bottom-up이 가능 check! 두번째 순환문 for(int j = 0; j j : nCk 는 언제나 k j : k까지의 계산값만 필요하고, 그 이후 값은 필요하지 않으므로 (대각선 아래 부분의 배열값만 계산하면 됨) "},"Algorithm/etc.html":{"url":"Algorithm/etc.html","title":"etc","keywords":"","body":"엄청난 시간이 걸리는 알고리즘 도시 외판원 문제 : 도시순회하는 외판원이 n개의 도시를 순회하는 방법은 어떻게 알 수 있을까? 첫번째 도시를 고르는 경우의 수 두번째 도시를 고르는 경우의 수 ... = n (n-1) (n-2) (n-3) ... O(n!) "},"Book/intersting_book.html":{"url":"Book/intersting_book.html","title":"읽은/읽었던/읽어야 할 책 목록","keywords":"","body":"개요 동시에 여러 책을 읽거나, 같은 내용을 다룬 여러 책의 필요한 부분만 발췌해서 읽음. 읽은 책이 너무 많아서 업데이트가 잘 안되고 있다... ing 읽게 된 계기 함께 적음 메이븐-자바세상의 빌드를 이끄는 (박재성 지음) : Build 제대로 모름. 회사 프로젝트에서 많이 쓰고 있는 maven부터 이해. Hello coding 그림으로 개념을 이해하는 알고리즘(아디티아 바르가자 저, 한빛출판사) : 마음의 짐인 알고리즘을 쉽게 접근하고 싶음. 파이썬으로 웹 크롤러 만들기 : 인천 python스터디 선정도서. python으로 뭐라도 프로젝트 해보고 싶은데 java webscraping 해본적 있으니, 만만해보여서. 처음 배우는 머신러닝 : 음악분석프로젝트 스터디 도서. Machine Learning 활용 들어가기 전에 기초 개론을 알고 싶어서. 그림 한장으로 보는 최신 IT트렌드 : 프로그래머로서 최소한의 교양 만들면서 배우는 Git+Github 입문 : 개인 프로젝트를 Git 으로 해서 쓸 일이 많음. progit 은 부담스럽고, 아 책은 바로 적용할 내용만 있어서 쉬워보여서 리눅스 바이블 : 개인 개발환경을 AWS EC2에 구축하면서 command 대충 복사 붙여넣기 하는 수준을 넘어서 리눅스에 대해서 알고 싶어졌음. 마침 AWSKSUG에서도 관련스터디를 한다고 해서 시작. 소프트웨어 장인 : 소프트웨어 스킬 책을 재미있게 읽어서 그 비슷한 책인줄 알고 구입함. 실용적 내용도 있지만 '소프트웨어 장인'이라는 철학을 소개. 그동안 프로그래밍하면서 적당한-민폐끼치지 않는 수준정도를 목표로 했지 최선을 추구하려는 노력은 해본적이 없는 거 같다. 익스트림 프로그래밍을 읽고서도 느낀 거지만, 적당한 수준에서 그치지 않고 더 나아가려는 용기, 최선을 추구하려는 용기가 필요하다. 도서 - JAVA 객체 지향 디자인 패턴 (정인상,채홍석 지음) : 클린코드 강의를 들으면서 객체지향에 대한 이해를 더 깊게 해보고 싶다는 생각이 들었다. 객체 지향의 사실과 오해와 함께 이 책을 같이 읽으려함. UML 설명파트에도 '해당 UML을 소스코드로 구현해보자' 같은 실습포인트가 있어서 좋다. 1장과 2장을 읽고 있는데 핵심개념에 대해 부담없이 핵심적인 부분을 짚고 넘어간다. 경험이 쌓이고나서 또 보면 다른 맛으로 읽힐 듯하다. delay 읽기 시작했지만, 완료하지 못한 책을 이유와 함께 적음 훌륭한 프로그래머 되는 법 : 기술도서 읽느라 우선순위가 낮아짐 Effective unittesting : 당장 testing 코드를 작성하지 않으니, 우선순위 낮아짐 골빈해커의 3분 딥러닝 : tensor, flow 개념 이해하려다가 흥미를 잃음 익스트림 프로그래밍 : 당장 닥친 기술도서 읽느라 우선순위 낮아짐 JUnit in Action : 당장 testing 코드를 작성하지 않으니, 우선순위 낮아짐. 코딩인터뷰 완전분석 : 혼자하기 너무 재미없다. 자바웹개발자 NextStep : 추천해주는 강의 다 읽으려고 시도해보다 길을 잃음. 읽기 좋은 코드가 좋은 코드다 : 당장 기술도서를 읽느라 기본 베이스 도서를 안 읽게됨. 지금 작성하고 있는 코드가 좋은 코드가 아니라서 책에 나오는 내용을 다 적용할 생각하면 마음이 먹먹해짐. 부담. (이게 뭔 말같잖은 소리일까...) 테스트 기반 개발 : 다른 책읽느라 우선 순위 떨어짐. 해커와 화가 : 사고를 바꾸는 책이라고 해서 읽기 시작함. 설날에 읽다가 열이 너무 올라서 그만 읽게됨. 음 저자가 나랑 좀 스타일 안맞는듯... TODO HTTP완벽가이드 : 웹프로그래머 기본소양 토비의 Spring : spring 설정 복붙말고 이해하면서 쓰고 싶다. 실용주의 프로그래머 : 오래 프로그래머 하려면 이왕이면 제대로. 소프트웨어 장인 : 오래 프로그래머 하려면 이왕이면 제대로. 소프트웨어 스킬 : 생존 꿀팁. 밑바닥부터 시작하는 데이터 과학 : 데이터 분석 기본부터 알고 싶음 코딩 트레이닝 : 문제 접근방법 연습 소트웍스 앤솔러지 : 객체지향체조 읽고 싶어서 폴리글랏 프로그래밍 : java, python, javascript 다 쓰는데 하나도 못하는데 여러개를 동시에 배우는게 과연 좋은 방법인가 의문이 들어서 클린 코드 : 민폐끼지는 코드 그만 작성하고 싶어서 클린 코더 : 클린 코드 아저씨가 쓴 책이라서 The Unix and Internet Fundamentals HOWTO : 교양. > 개인용 컴퓨터와 Unix 계열의 운영 체계, 인터넷의 동작 원리에 대해서 기술적으로 쉬운 문체로 서술하고 있다. The Practice of Programming(프로그래밍 수련법), KernighanBrian 그리고 PikeRob : 표지가 맘에 든다. 제대로 된 프로그래밍 배우는데 도움이 될듯. 탐험적 테스팅 : 배우고 통찰하며 개선하는 소프트웨어 테스트/엘리자베스 헨드릭슨 지음,오광신 번역 / 역자 블로그- 책 소개글 : 테스팅... 감질나게 프로그래밍할때 잠깐잠깐 하는거 말고 좀 더 알아보고 싶어서. SQL 코딩의 기술 : 추천받은 책. 실무에 관련된 내용이 많음. 온라인상으로 미리보기가 제공되어서 읽기 시작하기 좋음. 오라클 SQL과 PL/SQL을 다루는 기술 / 길벗 : 데이터적재 후, 데이터가 제대로 적재되었는제 테스트쿼리를 사용했다. 잠깐 변수만 써도 쿼리가 훨씬 깔끔해지더라. PL/SQL 이 궁금한데, 실무에서 많이 쓰이지 않아서 빠르게 어떤 정도인지 감을 잡는 게 필요하다. '핵심정리','self-check'장이 있어서, 빠르게 정리가 가능. 웹사이트에서 전체 책 내용을 볼 수 있음. 리눅스 서버를 다루는 기술 / 길벗 : 온라인으로 모든 책 내용이 공유되어있음. 입문용책으로 부담이 없음 리팩토링 - 마틴 파울러 : 지금 같은 방식으로 코딩하면 일회용 쓰레기 코드만 계속 만들어낼꺼다. 회사서가에 있어서 잠깐 읽었던 적이 있는데 지금 읽으면 또 느낌이 다르다. 읽기만 하고 적용을 안해서 슬프다. 이번에 다시 읽을 때는 '읽는다 --- 적용한다' 사이 갭을 줄여야함. 소프트웨어 악취를 제거하는 리팩토링 : 이 책도 많이 보더라. 근데 말이죠... 리팩토링 책을 여러권 본다고 해서 내 코드에 적용하지 않으면 좋아지지 않을텐데...? 적어도 내가 짜고 있는 코드가 쓰레기라는 거 왜 쓰레기인지 알게 되는 거부터 시작해야지 뭐. Refactoring Guru : Refactoring 관련 글과 DesignPattern에 대해 기술되어있는 사이트로 챕터별로 글이 짧기 때문에 빠르게 읽을 수 있음. 손으로 익히며 배우는 생활보완첫걸음(한빛미디어) : 보안을 잘 모르기때문에, 언제나 보안은 언젠가는 해결해야할 마음 한켠의 빚이었다. 책을 미리보기로 읽어보니 파이썬을 여행하는 히치하이커를 위한 안내서 : 평이 좋더라.추천해주는 사람도 많고. 은하수를 여행하는 히차하이커를 위한 안내서를 내가 좋아해. 파이썬 코딩의 기술 (Effective python) : Effective 시리즈니까. 번역이 평이 갈리던데 읽기 전엔 모르겠당. 코드리뷰를 시작하려는 그대에게 :tv: /slide RT:FM, 나는프로그래머다 컨퍼런스 2016 :tv: / slide DONE 책정보(책제목,저자,출판사)와 함께 간단한 감상평을 적는다. 블로그에 서평을 작성했을 경우, 함께 적음 BACK TO THE BASIC, JAVA 핵심 요약 노트 : 빠르게 훑어보는 자바 프로그래밍(김흥래,한빛미디어) 걸음마를 막 뗀 개발자를 위한 걸음마 보조기. 내일 당장 기술면접인데 java 기본 구조에 대해서 매끄럽게 설명할 자신이 없다면 이 책을. 서평 : 걸음마 보조기? 'Back to the Basic JAVA 핵심 요약 노트' 행복한 프로그래밍(임백준 저) : 프로그래밍에 흥미를 잃은 그대에게. 감상평 - 지름신 오게 하는 '행복한 프로그래밍(임백준 저)' "},"Book/Effective_unit_testing.html":{"url":"Book/Effective_unit_testing.html","title":"Effective_unit_testing","keywords":"","body":"작성 후, Test 정리문서와 통합해야함 Keyword Reference Effective Unit Testing - 클린 코드와 좋은 설계를 이끄는 단위 테스트, 한국어판 상황/ 궁금증 정리 Mock 사용 구현이 아니라 동작을 확인하라. (...) (p.78) Mock에는 정말 바라고 의도한 핵심동작만 설정하자. Mock에 테스트의 모든 것을 구현하면 산만해져서, 의도가 정확히 전달되지 않는다. 준비하고, 시작하고, 단언하라 (Arrange Act Assert) 단위 테스트 구조에 대한 규약 AAA = 필요한 객체를 준비하고, 실행하고 , 결과를 assert함. Arrange Act Assert [ ] 내용 정리 필요 Mark's Devblog - The fundamentals of unit testing : Arrange, Act, Assert [ ] 내용 정리 필요 "},"Book/the_essence_of_object_orientation.html":{"url":"Book/the_essence_of_object_orientation.html","title":"객체지향의 사실과 오해","keywords":"","body":"Keyword 객체지향 oop 객체지향의 사실과 오해 Reference 상황 / 감상 아 책 진짜 재밌다. 누가 어렵다고 해서 사두고 한동안 안읽었었는데 왜 그랬징. 나중에 경험이 쌓이고 다시 읽어도 보이는 내용이 달라서 또 재밌을 거 같다. 질문 정리 1장 책 읽은 후에 생각난대로 정리하기 객체는 협력,책임,역할 로 이루어져있다. [확인필요] 실생활처럼 하나의 객체는 여러 역할을 할 수 있던가..? 기능을 나누어 책임으로 이루어진 객체가 된다. 객체간 메시지 요청-응답하면서 객체는 서로 협력하며 이벤트를 수행한다. 각 객체는 책임이 있으며 이 책임은 메소드로 구현된다. 각 객체가 맡은 책임을 어떻게 구현할지는 각 객체에게 맡긴다. 내부구현을 어떻게 하는지는 객체가 알아서 한다. think! 당신이 카페에 가서 커피를 주문했다. 커피 주문이라는 기능에는 주문자(당신)가 커피주문을 하면, 캐셔가 주문을 받아서 바리스타에게 주문을 전달하고, 바리스타는 커피를 만들어 캐셔에게 커피를 전달한다. 캐셔는 바리스타에게서 받은 커피를 주문자에게 전달한다. so Coooool! 이걸 읽고나니 '객체는 클래스,상속'이라는 설명이 뭔가 된장없는 된장찌개같이 느껴진다. 본질이 빠져있는 설명으로 느껴진다. 클린코드 강의를 들을때, 객체간의 메시지를 주고받는 부분 코드리뷰를 많이 받았었다. 뭔가 중요한 것 같았는데 명확하지는 않았는데 객체간 협력때문에 그랬던거구나! 책 보고 다시 정리하기 책 핵심문장 & 질문 "},"conference/list.html":{"url":"conference/list.html","title":"list","keywords":"","body":"직접 기획한 컨퍼런스 업데이트 필요. 기획 세미나 중에 개발관련 컨퍼런스만 작성함. Pycon Kr 2018 2018년 격월 10월 튜토리얼 \"Hello Python World!\" - Pycon Korea 주최 이력서 방탈출 워크숍 참여한 컨퍼런스 너무 많아서 업데이트가 어려움. evernote 기록 가져올 예정 "},"conference/okkycon.html":{"url":"conference/okkycon.html","title":"okkycon 2018 - Test","keywords":"","body":"개요 2018 okkycon 에서 강의 들으면서 적은 내용 컨퍼런스 소개 페이지 깨졌을 경우, 아카이빙 페이지 이후 내용 보완할 예정 컨퍼런스 후 회고 with RudiaMoon 오전 세션 ohahohah: 저는 사실 앞 세션이 제가 좀 바로 실천으로 가자! 할 수 있었던 세션이었던거 같은데 못 들어서 아쉬웠어요. Rudia: 저도 앞 세션 좀 아쉬움 되게 많이 남아요. 뭔가 재성님 세션 들으면서 계속 코딩 하고 싶은 용기가 생겼어요. 근데 듣기만 하니까 아 빨리 집에 가서 코딩하고 싶다는 생각이 계속 들었어요. (인상적이었던 강의내용 보고 이야기하려고 했는데 ohahohah가 못하게 막음. ohahohah: 안보면 기억 안나는건 기억안나는 거죠!) R: 인상적이었던 부분은 코드를 15줄에서 10줄로 줄여보자. 내가 장난감 프로젝트로 계속 해봐야 나중에 현업에서 쓸 수 있을 정도로 할 수 있게 된다. 장난감 프로젝트를 많이 해 봐야 된다고 하더라고요. 이혜승 개발자 세션 R: 그리고 재성님 세션 다음으로 인상깊었던 거는 주니어 개발자분 얘기였어요. o: 저도요. 공감 많이 되었고요. 나도 그 부분 어려웠는데, 나도 그렇게 생각하는데, 맞아, 그 부분에서 테스트코드가 있어서 좋았어 하고 귀에 쏙쏙 들어오더라고요. R: 회사에서 세미나 간다고 이야기했는데, 회사에서 어? 그럼 발표해요? 라고 물어보더라고요. 저도 언젠간 발표를 하고 싶다고 생각했어요. 근데 그게 굉장히 먼 나중에 기술적으로 자신이 있을때 언젠가 나도 그런 날이 오겠지? 하고 생각했거든요. 근데 이 분 발표를 들으면서 지금 내가 느끼는 것들에 대해서 발표를 할 수 있구나 하고 느겼어요. o: 저는 이혜승 개발자의 자료를 본 적이 있어요. DDD 에 대해 정리해서 슬라이드쉐어에 올린 자료였는데요. 저는 솔직히 DDD가 제 수준에서 제대로 이해하기가 까다로운 개념이라고 생각했었는데요. 근데 그 분 슬라이드가 깔끔하게 정리되어있어서 인상깊었어요. 이번 컨퍼런스에서 그 분 발표 듣게 되어서 좋았어요. o: 그리고 한편으로는 그동안 내가 들었던 세미나 내용들이 너무 나한테 맞지 않게 어려웠나? 이 생각이 들었어요. 다른 세션을 들을 때에는 내용을 다시 소화해서 제 생각이나 경험,감상을 적기보다는 내용을 받아 적기가 바빴거든요. 내용을 이해하기 바빴었죠. 근데 이혜승 개발자 발표는 제가 느낀 것까지 같이 입체적으로 정리할 수 있었어요. 그래서 아, 좀 더 이해할 수 있는 정도의 거에만 집중해야할 시기가 아닌가 느꼈어요. 뭔가 듣고 나서도 머리 속에서 이렇게 빠져나가는 느낌. 컨퍼런스 내용을 다시 정리하면서 느끼는 내용도 있고 학습하는 것도 많고 자극이 되어서 컨퍼런스를 많이 가려고 하는데 음. 사실 나는 키워드 하나만 건져도 좋다. 내가 뭘 모르고 있었는지 아는게 중요하다 이렇게 생각하지만서도. TDD에서도 그렇고 모르는 게 있는 불확실한 상황이면 한번의 하나씩만 한번에 할 수 있는 단위로 해서 접근하잖아요. 너무 큰 걸 한번에 보려고 했었던 건 아닐까. 그 외 세션 o: 저는 '코드 품질을 위한 테스트 주도 개발' 세션 에서 재밌었던 부분이 하나 있었어요. 책들을 읽다보면 응집도, 결합도 이야기가 계속 나오잖아요. 근데 제가 막상 코드를 보거나 설계해도 어느정도가 응집도가 높은건지 결합도가 낮은건지 잘 모르겠거든요. 코드를 많이 보고 분석해본 경험의 문제도 있는 거 같은데요. 근데 품질에 대해 이야기 하면서 응집도,결합도를 어떤 요소로 평가하는지 이야기 했잖아요. 그게 절대적인 건 아니겠지만 아 저런 게 중요요소라서 저걸 평가지표로 삼는구나! 하고 그 요소들이 뭔지 알 수 있어서 좋았어요. 세션2. 박재성 연사 Q. 기존 테스트가 오히려 발목을 잡는 거 같다. 수정해서 배포해야하는데 시간이 없고. 개발 시간을 갉아먹거나 테스트코드를 빡빡하게 짜면 짤 수록 나중에 수정을 많이 해야해서 발목을 잡는 기분이다. A. 왜 그럴까? 를 생각해봄. 요구사항 변경보다 테스트코드 자체가 잘못 짜여있는 경우가 있다. 그럼 요구사항이 변경되었을때 테스트코드를 많이 변경해야한다면 설계가 제대로 되어있는지를 생각해보자. 설계를 개선하고 테스트코드를 새로 짜야한다. 시간이 없으면 뒤에 절대 시간은 나지 않는다. 전문가라면 싸워서라도 시간확보를 해서 고치자. 나중에는 오지 않는다. 세션3. 코드품질을 위한 테스트주도 개발 - 한상곤 코드레벨의 품질을 지표로 측정하고 현장에 적용하는 일을 하고 있음. 티디디,클린코드 관련 사내교육을 하면서 이 자리에 서게 됨 지금 당장 중요하지 않아보이는(동작하는데 필요없어보이는) 것들로 괴롭히는거 아니야? 할 수도 있음. 중요하다고 알고 있지만 우선순위에서 밀리는게 현실임 정량적인 코드품질 측정에 대해서 깊게 생각해본 적이 없는데 여러 코드품질 측정요소에 대해 보면서 어떤 걸 코드품질의 중점적인 요소로 생각하는지 알 수 있었음 TDD는? Red - 리팩터의 대상은 테스트코드도 포함이다. 스펙 정의 후 디자인 Design by example 스펙에 대한 구체적인 사례, 예제를 가지고 테스트코드를 만들고 적용 TDD의 세가지 룰 테스트의 장점 두가지 관점으로 나누어서 리팩토링(외부에 대한 기능 개선 없이 내부 개선)을 하는 도구 테스트코드 작성 자체에 대한 의미가 있음. 테스트 코드를 작성하면서 프로그램의 이해도가 높아짐 테스트를 하는 건 많은 노력과 공수가 필요함. 장기적인 관점에서는 개발생산성이 높아짐 빠른 피드백을 받을 수 있음 디버깅에 대한 수행시간이 거의 없어짐. 보통 오류 재현이 어려운데 테스트코드가 있으면 이걸하기 쉬워짐 KATA? 과정을 설계하고 테스트코드를 만듦. 테스트 커버리지 와 품질 관계 - sonarqube 예시 오픈소스를 대상으로 분석한 것이기 때문에 프로덕트 코드가 아니라는 거 참고 Think about more TDD 소프트웨어 품질이란? 보통 funtional qualiity 에 집중하는 경향이 있는데 external~ 과 함께 internal~도 중요하다 서비스의 규모가 커지고 사용자의 요구사항이 점점 늘어날수록 internal qualluty 도 중요하다 7가지 '적절한' . 코드로 커버가능한 건 주석말고. code quality Metrics 신기. 궁금했는데 특히 결합도와 응집도에 대해서 개념적으로만 이야기를 하고 실제로 어떤 기준이 있는지 확인할 수 있었음. 프레임워크를 사용하면 복잡도가 낮음 (복잡도 전가) 전설의 개발자 요구사항에 충실하게 작성하고, 주어진 요구사항이 변경되었을떄 그떄 변경하라 노트 jetbrain - MPS TDD 를 성공하기 위헤 하는 고민들 테알못 신입은 어떻게 테스트를 시작했을까? - 이혜승 테스트하기 쉬운 코드 어려운 코드를 구분하는 것부터 쉽지가 않음 - 동의, 목업 만들고 할때 엄청 헷갈렸음. 테스트하기 쉬운 코드로 먼저 시작하자 like 순수함수 유틸리티성 함수로 시작하는게 처음 접근하기 쉽다 기존 코드에 테스트 도입하기에 대한 내용 TDD 로 작성하거나 기능테스트 정도로 테스트를 작성했었음. 자연스럽게 원래 코드를 건드리지 않고 -> 테스트 코드를 만든다 -> 테스트코드를 건드리지 않고, 리팩토링한다 한번에 하나씩 이라는 내용이 반복적으로 나온다. 동사에 다 하지말고 단계별로 나눠서 설명한게 인상적이었다. 공감이 많이 됨 오픈소스나 보통 테스트코드를 보고 파악하는데, 스펙문서기능. 사내 스터디하면서도 어떻게 테스트코드를 활용하는가에 대해서 이야기를 나눴었는데, 기능파악(지금 회사에서는 테스트코드를 만들어져있는 경우가 거의 없다)할떄 테스트코드부터 만들고 시작한다는 이야기를 했었음. 테스트가 단언하고 있는 내용이 사용자에게 가치없을때 테스트 하지 않는다 노트 컨퍼런스나 세미나 가면 멍~하고 있는 경우도 많은데, 이번 세션은 들으면서 공감하는 부분도 많아서 편안하고 재밌게 들을 수 있었다. 그동안 내가 듣는 세미나 수준이 너무 높은게 아닌가 하는 생각이 들었음. 자바스크립트라서 알긴 아는데 현업에서 잘 테스트안하는 부분이라서 예사에 대한 흥미가 좀 떨어졌다. 검증력이 떨어지는 테스트의 경우를 나눠서 설명함. 예를 들면 테스트코드가 여러 가능성을 열어두고 있다라던가 어떤 부분에서 테스트 빈틈이 셍기는지 - 예. 테스트 제목과 검증의 불일치 공감포인트가 넘 많았음 테스트 데이터가 길어진다 이걸 어떻게 관리해야할까? 테스트를 돌보기 위한 매우 간단한 실천 방법들, 그리고 효과 - 양완수 테스트코드 귀찮다. 릴리즈 시간은 다가오는데 테스트코드 언제 만들고 있나, 비자발적인 테스트코드 만들기 등등 예전에 고민했엇던건데, 하나의 테스트코드 클래스에서 setup 메소드가 너무 길어지는 경우 - 주로 여러 인스턴스를 만들어내고 설정을 하기 때문에 응집력이 떨어지는 helper method를 변경함. 적절한 helper method 사용 마지막 세션. 당신들의 TDD가 실패하는 이유 - 이규원 연사 많은 경우 충분히 준비되지 않은 상태에서 시작한다 우리가 보호해야하는 것 비즈니스 핵심인 도메인우리가 제어할 수 없는 것 구현테스트 Mock 잘못 쓰면 이런 식(실제 코드는 동그라미 인데 테스트코드는 네모)의 테스트케이스가 많이 일어남 리팩토링할 설계 Information Hiding 단순히 getter,setter 라는게 아니다 테스트는 인터페이스만 가지고 설계를 한다 팀이 TDD 에 실패하는 이유 고민되는 부분임 가능한 이른 시점에서 실패하자 반복주기 계획,실행,평가 : 실행만 함 목표를 공유 도메인모델 - 플랫폼 기승전스프링? 도메인모델과 플랫폼을 분리하자. 예를 들면 카프카와 비즈니스 로직이랑 분리하자는거다 도구에 대한 디펜던시를 줄이자 노트 사용자에게 어떤 가치를 전달할 것인지에 대해 구체적인 목표, 가치가 유용할 것이라는 근거가 있어야함 지금 개인프로젝트 UI 스토리보드를 시연자료처럼 플로우를 그리는거를 적용해봐야겠다 (동일주제로 듣는 강의에서) 내 집중력은 몇 분이 한계일까? QnA 질문 답변 좋았음 페어링 요구사항 태스크 나누고 테스트하기 단위테스트만으로는 불안할 수 있다. functional test 등의 테스트도 추가로 함 패널토의 참고자료 정진우님 블로그 참고 참고도서 by 정진우 연사님 alter unit test xUnit Patterns 실제 테스트하면서 겪는 어려움 맞게 만들고 있나? 이런거를 확인하고 더 나은 방법을 찾을떄 도움이 되었다 Goo? 책 - 리팩토링(마틴 파울러 저) 책 - TDD(켄트 벡 저) youtube에 refactoring TDD + kata 검색 테스트는 종합적(디자인 패턴 등등)으로 파악해야 좋은 테스트가 가능. 애정과 열정을 가지고 정진하자 레거시에 대해 어떤 레거시를 처리할 것인가? 개발자들 일할때 ROI 를 생각하자. 비즈니스적으로 가치가 있는지를 판단해야함 사람들이 고쳐야한다는 걸 공감을 하느냐? 앞으로 지속적으로 혜택을 받을 수 있나? 를 기준으로 잡자 소마왕 대마왕 사례 "},"Cleancode_java_seminar/cleancode_week02.html":{"url":"Cleancode_java_seminar/cleancode_week02.html","title":"2주차","keywords":"","body":"클린코드 해당 주차 강의자료 나쁜 코드를 나중에 고쳐야지 -> 나중은 절대 오지 않는다. - 르블랑의 법칙 원대한 재설계의 꿈 - 레거시코드를 엎고 새로운 프로젝트를 만든다? 이제 힘든 프로젝트가 두 개가 되겠져... -> 재설계가 아닌 꾸준한 리팩토링 빨리 가는 유일한 방법은 언제나 코드를 최대한 깨끗하게 유지하는 습관이다. 무리한 요구는 용기있게 거절하자. 거절하려면 실력 YO 피드백 static final 둘 다 써야해요 -> 많아지면 enum 글쓰기처럼 문맥에 흐름에 맞게 적절한 공백라인과 space를 고려해라. 팀 내에서 컨벤션 맞추기 - 거슬리고, 시간쏟고 그러지말고 통일합시다 내 자식의 이름을 짓는 마음으로 이름짓기 - 주석보다 이름 잘 짓는 것에 시간을 쏟아라 자료구조를 이름에 넣는 것 비추 list, str 등의 자료형을 이름에 넣지 마라. java는 추적이 가능함. 애매한 숫자도 쓰지 마라 - i1,i2,... 변수의 역할을 드러내라 애매한 getter,setter 는 로직 객체의 상태와 행위 객체의 데이터를 꺼내지말고 해당 객체에 메시지를 보내서 행위를 변경하게 하라 나중에 중복로직이 일어남 코딩컨벤션은 따라가고, 더 중요한 걸 끊임없이 설득해라 치명적인게 아니잖아여 테스트코드, 리팩토링 me: 위키 Car Random 레거시일때 method인자 바꿀 수 없는 경우, 메소드를 분리해서 테스트함 테스트를 위해 새로운 클래스를 만듦 - 파일이 아니라 익명클래서 테스트를 하다보면 익명클래스를 많이 쓰게됨 익명클래스를 적극 이용하자 Car move Step01. 테스트 가능한 코드와 테스트하기 힘든 부분을 분리 Step02.interface 추출 인스턴스 변수를 최소화해라 많으면 중복이 많아진다 여러 곳에서 싱크를 맞추기 어려워진다 Dto 역할 구분 : CarDto - data를 언제든지 꺼내올 수 있는 것 / valueObject 가 아님 - 값이 고정되어있는 것임. 유효성 체크 도메인 로직에서 체크를 할때의 장점 코드가 복잡하면, java API를 사용할 생각을 해봐라 java string join : 우승자 문자열 출력 MVC MVC로 나눠라 domain이 핵심로직이 들어있음. MVC 를 잘 분리할수록 테스트하기 쉬워진다 인스턴스 변수와 클래스 메소드가 헷갈릴때 어떻게? 종속적이지 않으면 클래스 메소드로 원칙적으로 테스트케이스에는 하나의 테스트만 나와야한다. 가능한 하나만 쓰기. 여러개면 테스트케이스가 너무 크지 않은지 의심해봐라 로직을 담당하는 곳에는 setter()를 쓰지마! dto에서 쓰는거다 힌트. 테스트가능하다면 그만큼 유연한 코드라는 거다 연습할때는 확실히 극단적으로! Week02 먼저, TDD, 리팩토링이란? 목표: 객체를 작은 단위로 쪼개는 연습 규칙 8: 일급 콜렉션을 쓴다. 일급콜렉션? Cars { List cars; } TDD = TFD(Test First Development) + 리팩토링 리팩토링을 잊지 맙시다! - 점진적 설계 & 구현 요구사항 분석과 단위를 잘 나눠야함다 TDD로 자동차 경주게임 구현 TDD로 자동차 경주게임 구현 대략적인 도메인 객체 설계! 그동안 요구사항을 잘게 쪼개고, 테스트 목록을 적고 나서 하다보면 막막 이 단계가 빠져있었넹 도메인지식이 없다면,(도메인에 익숙하지 않을땐) Out -> In 방식으로 접근 초보일때 첫 접근방식으로 좋음 나중에 익숙해지면 In -> Out방식일때 더 쉬울 수 있음. 깔끔한 테스트코드로 시작. 리팩토링 믿고 일단 가즈아 라이브코딩 제일 먼저, 행위에 집중 - 이 메소드의 input과 output이 무엇인지를 판단하자- 최대한 단순하게 - 5회 이동횟수 빼고 그냥 b(\"car01,car02\") UI에 종속적이지 않은 값으로 - output으로 구현하면 되니까여 테스트가 가능한가 의 관점으로 바라봅시다 디펜던시 끊기 -> 인터페이스 //interface MoveStratgey @Test 가는 함수(){ rg.move(\"car01,car02\", new MoveStratgey(){ @Override public boolean canMove(){ return true } } ); } //요걸 람다로 car.move(() -> true) 클래스 메소드로 구현하다보면, input, output이 자연스럽게 쪼개진다 생성자 활용 ``` RacingGame(){ List cars; RacingGame(String carNames){ String[] cars = carNames.split(\",\"); creteCars(cars); } } - 클래스 메소드로 변환하려는 노력 List findWinner02 (List){ } //위에 꺼 파라미터있어서 마음에 안들면 아래처럼 날로 먹어도 됨 List findWinner01 (){ return findWinner02(this.cars) } - 함수형 스타일로 했을때 테스트하기 쉬운 구조가 만들어짐 - 개인적으로는 private 테스트가 안되니, package 접근하게 함 - 또는 utils클래스로 분리해서 public 하게 함 - 연습할떄 스텝바이스텝으로 차근차근 - 테스트코드 자체도 리팩토링 - 추상화 레벨을 맞추기 - composit pattern - split 도 따로 메소드로 나누네 - 일단 구현하고 메소드를 추출해보세여 (예측하면서 하면 다른 고민이 깊어져여) ------ # 실습 - 그렇게 많이 썼던 string matcher가 생각이 안났음;;; - 정규표현식 또 까먹 - TDD로 시작했는데 구현하다보면 습관대로 로직만 구현하고 나중에 테스트케이스 만듦. - 대신 작게 작게 바로 확인하기는 하지만, TDD 책에 나온대로 testFailed -> 빨리 테스트 통과 -> 리팩토링 의 단계로 가지않는다. - input.contains(문자열) 과 match(정규표현식):완전히 매치되어야함. 차이! static String getPlainInput(String input) { // if(!input.matches(\"^//(.*)\\n\")){ // return input; // } Matcher m = Pattern.compile(\"//(.*)\\n(.*)\").matcher(input); while(m.find()){ return m.group(2); } return null; } 주석처리부분 있을때 - 구분자정의 구문이 출력이 안됨와 없을때의 차이 - 테스트케이스 깨지는거 무시하지 말자! 나중에 더 꼬여서 안보인다. - 테스트케이스가 큰게 깨지니까 디버깅이 안된다. 작은 테스트케이스 깨지는지 보면서 디버깅 해보기 ## 질문 - 인터페이스 언제 만드는게 나을까? -split 인터페이스도 나누는게 맞았을까? //TODO interface?? // private String[] split(String text, String customDelim) { //// return text.split(customDelim); //// TODO customDelim만 하도록 수정 // String validateDelim = validateDelim(text,customDelim); // // return text.split(DEFAULT_DELIMITER_REGEX + \"|\" +validateDelim); // } ``` 예외처리 단위 - 기본예외 / 세부예외 - 구분자 예외 생성시 다른 음수 등도 레벨이 같게 커스텀익셉션으로 맞춰줘야하는지?익셉션 정의는 팀미다 다른건지 Parser parser = new Parser(); -> 클래스변수 - 정적이면 메모리에 많이 올라가잖아. 그래서 생성했는데 저러면 안되나. util은 static으로 하고 해당 클래스에만 사용하는 건 이렇게 하는데 맞아? \"나는문자열\" /* 프로그래밍 요구사항 indent(들여쓰기) depth를 2단계에서 1단계로 줄여라. depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다. 메소드의 크기가 최대 10라인을 넘지 않도록 구현한다. method가 한 가지 일만 하도록 최대한 작게 만들어라. else를 사용하지 마라. 요구사항 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환 (예: “” => 0, \"1,2\" => 3, \"1,2,3\" => 6, “1,2:3” => 6) 앞의 기본 구분자(쉼표, 콜론)외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 “//”와 “\\n” 사이에 위치하는 문자를 커스텀 구분자로 사용한다. 예를 들어 “//;\\n1;2;3”과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다. 문자열 계산기에 숫자 이외의 값 또는 음수를 전달하는 경우 RuntimeException 예외를 throw한다. 세부 요구사항 view 문자열을 입력받음 도메인 로직 [기능]입력받은 문자열을 파싱하여 덧셈 문자열 파싱 덧셈 입력문자열은 쉼표(,) 또는 콜론(:)을 구분자로 가짐 입력문자열은 커스텀 구분자를 가짐 (커스텀 구분자는 문자열 앞부분의 “//”와 “\\n” 사이에 위치하는 문자를 커스텀 구분자로 사용) 숫자 이외의 값 또는 음수를 전달하는 경우 RuntimeException 예외를 throw 확인 목록 정수형만 덧셈하니? 테스트 목록 [x] 문자열 입력했을때 쉼표 구분자로 구분하여 리턴하는지 확인 [x] 문자열 입력했을때 콜론 구분자로 구분하여 리턴하는지 확인 [x] 문자열 입력했을때 커스텀 구분자로 구분하여 리턴하는지 확인 [x] 숫자 이외의 값을 전달하면 RuntimeException 예외를 throw [x] 음수를 전달하는 경우 RuntimeException 예외를 throw [x] 빈 문자열일 경우 IllegalArgumentException를 던지는지 확인 문자열을 숫자로 변환하는지 확인 덧셈을 하는지 확인 */ /* 요구사항 1 - primitive type을 사용하지 마라 int와 같은 primitive type을 직접 사용하지 말고 자바 객체를 생성해 구현해 본다. 힌트 - int number와 같은 부분을 Positive와 같은 객체를 추가해 구현해 보고 이전 구현 방식과 비교해 본다. -> 리턴 타입이 달라져도 다 고칠 필요없음 -> 객체의 속성이 달라질때 고치기 편함 / 어떤 타입으로 넘겨도 객체 안에서 자기 관련된건 처리해줌 (String 으로 넘기던 int로 넘기던) -> void는 여러 메소드랑 같이 쓰기 뭔가 불편하다 -> 생성자 사용하면 뭔가 사전에 해줘야하는 로직들을 줄여준다 -> 이게 캡슐화가 더 잘되는거야?? 요구사항 2 - 문자열 split 규칙을 확장 가능하도록 구현한다. 문자열을 split하는 규칙이 현재는 기본 구분자와 custom 구분자 두 가지가 있다. 앞으로 문자열을 split하는 규칙이 계속해서 추가될 것으로 예상한다. 규칙이 추가되더라도 영향을 최소화하면서 확장 가능하도록 구현한다. 힌트 - 문자열을 split 규칙을 대표하는 interface를 생성하고, 각 규칙에 따른 구현체를 구현한다. 요구사항 3 - java 8의 람다를 활용해 구현한다. java 8에 추가된 람다를 활용해 위 요구사항을 구현해 본다. -> 뭔가 체인해서 쓸 수 있다. 책에서 읽은 내용으로는 모듈화가 깔끔해진다고 한다. 이너클래스가 더럽게 안된다. */ return validateLottoNums(inputs.stream().map(i -> String.valueOf(i)).toArray(String[]::new)); "},"Cleancode_java_seminar/cleancode_week03.html":{"url":"Cleancode_java_seminar/cleancode_week03.html","title":"3주차","keywords":"","body":"변화는 어떨게 만들어 갈 것인가? 변화에 실패한 경험이 - 패배의식을 만들 수 있다. 작은 성공 으로 성취감과 안정감을 가지고 더 큰 변화로 회고 - 우선순위가 높으면서, 작은 변화로도 영향력이 클만한 Practice 선택 -> 한가지에 집중 -> 작은 성공 -> 반복 팀이 같이 작은 성공을 맛보는 것! 점심먹고 십분동안 산책하면서 이야기해보자(회고). 내가 성공했었던 경험으로 나중에 팀에도 적용해보자. 현장에 TDD, 리팩토링 적용하기 토이프로젝트로 해보기 -> 현업코드에 적용해보기 -> 내 코드에 관심가지는 사람이 생기면 페어프로그래밍으로 동료와 같이해보기 -> 점차 전파해나가기 지금 하고 있는 코드스쿼드 미션 사용해서 한번 페어프로그래밍 시도해봐라 초심자들끼리 해도 서로 피드백하면서 나아가라 (완전 시니어가 없어도 괜찮다) 실패해도 괜찮아 변화를 만들다 실패해도 괜찮아. 시도하면서 자심감과 용기 근육을 키우자 업계에서의 리팩토링 역할 처음부터 새로 만드는 것보다 점차 시스템을 개선해나가는 경우가 많음 기존 코드를 개선해낼 수 있는 리팩토링 역량이 중요해진다! 로또 리뷰 먼저, 로직의 입력-출력이 뭔지 생각해보자. 객체 설계 고민은 어려우니까 이거 먼저. 테스트 포인트를 줄이기. 머리써야할 일이 많아지면 테스트케이스가 너무 큰 건 아닌지 생각해보자. ``` match(Lotto ){ } int matchCount(){ if(winnigLott.contains(lotto)){ return 1; } return 0; \"\" - 일급콜렉션 - 유효성 체크에 유효하네? 일급콜렉션이 아니라면, public 으로 변경해서 각각 메소드마다 파라미터의 유효성체크를 해야할까? - 파라미터 중에 객체로 바꿀 수 있는게 있을까? 고민해보자 - Lottto 객체 - 중복검사대신 (중복이 허용되지 않는)Set을 사용해보자 - **생성자가 두 개이상아라면, 팩토리 메소드를 사용해서 의도를 드러낼 수 있다.** - of { return new Lotto();} - 리팩토링 연습 - 중요! 기존 코드를 망가뜨리지 않으면서 리팩토링하는 연습하기! - Step by step - 잘 동작하는 코드를 복제본을 떠서 다른 이름을 부여함. - 데이터베이스 리팩토링도 이렇게 백업만들면서! - 안전한 배포가 가능해진다 - 무중단배포!(진정한 무중단배포는 클라우드 서비스 환경 구성만이 끝이 아니다!!!) - 이 코드를 쓰는 곳이 한군데도 없으니까 자유롭게 수정하기 시작함. - 테스트코드도 복제본을 따로 떠서 만들어도 됨 - 리팩토링을 하고 이제는 안쓰게된 예전 동작 코드를 지우자 - 신난다! - 객체가 데이터를 처리하면, 파라미터가 줄어드네 - 객체와 연관된 로직부분을 객체 안으로 끌어들인다 - 외부에서 get으로 사용할때는 중복로직이 발생해서 나중에 관리가 어려워짐 - [ ] 객체지향개념을 좀 더 알 수 있는 입문 콘텐츠로 학습해보자 - 잘게 쪼개다보면 인스턴스가 많아짐 -> 인스턴스 캐싱해서 재사용하자. - LottoNums 가 valueObject! 값을 변경할 수가 없다고! DTO가 아니라고! - Money로 객체를 만들어도 또 된당 - TDD로 하다보면, 객체의 구조 도출이 됨. - 외부에서 객체로 메시지를 전달하는 버릇이 되면 나중에 Spring의 DI의 필요성을 깨닫게 되는게 많다. - 테스트 가능한 코드를 만들다보면 객체지향적으로 사고하기 쉬워진다 - live-coding branch에 라이브코딩 기준 자료가 있음 - 상수값을 enum으로 관리해보자 - [ ] enum 배우기 --------- ## 함수형 프로그래밍 - sideeffect 를 줄인다. - 객체지향적으로 설계를 하고 메소드를 함수형 프로그래밍으로 설계해보면 어떨까? - input과 output을 같게 - hadoop의 mapReduce 도 함수형 프로그래밍의 map 과 reduce 에서 힌트를 얻어 나왔다고 하네요. ### 람다 - 콜백클래스가 람다로! - 인터페이스에 메소드가 하나여야 가능하다. 한 개 이상이면 어느 메소드를 찾아들어갈지 모르잖앙ㅠ - 람다 쓰기 좋은 코드 - 앞부분과 뒷부분을 - 람다함수 처음 써볼때 좋은 접근 방법 - 1. 중복부분을 interface 로 추출 - 2. interace를 익명클래스로 구현 - 3. 익명클래스를 람다로 바꿔보기 ### 기존 if 문 사용을 filter로 바꿔보자 ### Optional - null pointer를 막자 - 어느 부분에 Optional을 써야할까? 그러지 말아야할 경우는? ### Java 의 하위호환성 - 다른 언어와 달리 Java는 왜 `stream()`, `collect(Collectors.toList())` 해야할까? - Java는 하위호환성을 보장하면서 발전하기 때문에 이런 부분이 생겨남. public static List doubleNumbers(List numbers) { return numbers.stream().map(x -> 2 * x).collect(Collectors.toList()); } ``` 기존 작성 코드에 함수형프로그래밍 적용해보자 itelliJ shortcut iter : for문 생성 : for(String s : inputs){} 느낀 거 고민하던 '리팩토링의 기준이 무엇인가?' -> 보다 객체지향적으로 변경해나가는 것(객체지향체조 참고)으로 잡아보자. "},"Cleancode_java_seminar/cleancode_week03_ex.html":{"url":"Cleancode_java_seminar/cleancode_week03_ex.html","title":"3주차 실습","keywords":"","body":"Keyword TDD ex codesquard 상황 클린코드 실습하면서 메모해서 정리해야할 것들 자유롭게 메모해둠 Inbox map 의 새로운 활용 - Java8 https://stackoverflow.com/questions/4157972/how-to-update-a-value-given-a-key-in-a-java-hashmap ```java /*package lotttoOlder class Lottos ///TODO enum if else if 말고 순환해서 매핑할 수도 있지 않을까? for(Fruit f : Fruit.values()){ // System.out.println(f+\", \"+f.getColor()); // } // TODO 이거 왜 값 안더해지는지 정리 result.put(LottoInfo.SECOND.getMapKey(),result.getOrDefault(LottoInfo.SECOND.getMatchNum(), 0) + 1); // TODO 람다쓸때 더하기 왜 안되는지 정리 result.computeIfPresent(LottoInfo.SECOND.getMapKey(), (k, v) -> v + 1); //바꾼 코드 int sameNumCount = l.countSameNum(jackpot); for(LottoInfo li : LottoInfo.values()){ if(li.getMatchNum() == sameNumCount){ result.merge(li.getMapKey(),1,Integer::sum); } } // if (l.countSameNum(jackpot) == LottoInfo.FIRST.getMatchNum()) { // result.merge(LottoInfo.FIRST.getMapKey(), 1, Integer::sum); // } else if (l.countSameNum(jackpot) == LottoInfo.SECOND.getMatchNum()) { // result.merge(LottoInfo.SECOND.getMapKey(), 1, Integer::sum); // } else if (l.countSameNum(jackpot) == LottoInfo.THIRD.getMatchNum()) { // result.merge(LottoInfo.THIRD.getMapKey(), 1, Integer::sum); // } else if (l.countSameNum(jackpot) == LottoInfo.FOURTH.getMatchNum()) { // result.merge(LottoInfo.FOURTH.getMapKey(), 1, Integer::sum); // } - 뭐하냐 public class LottoResult { // int match3Count; // int match4Count; // int match5Count; // int match6Count; Map matchNumresult; public LottoResult(Map matchNumresult) { // TODO match3Count 애네들 무슨 의미야? -> map이 (\"3\",2) -> 3개 일치가 2개 있음-> 별루다 // this.match3Count = map.getOrDefault(LottoInfo.FOURTH.getMatchNum(), 0); // this.match4Count = map.getOrDefault(LottoInfo.THIRD.getMatchNum(), 0); // this.match5Count = map.getOrDefault(LottoInfo.SECOND.getMatchNum(), 0); // this.match6Count = map.getOrDefault(LottoInfo.FIRST.getMatchNum(), 0); this.matchNumresult = matchNumresult; } - Java 8 에서 string return //Lotto public String showNum(String delimiter) { return actualNums.stream().map(Object::toString) .collect(Collectors.joining(delimiter)); } ------- ## test 오류 - 유닛 테스트에서는 통과했는데 엉뚱한 결과가 나옴 구입금액을 입력해 주세요. 14000 14개를 구매했습니다. [9, 12, 23, 30, 37, 44] [1, 21, 25, 28, 30, 37] [4, 17, 20, 33, 40, 42] [5, 14, 30, 34, 38, 45] [11, 20, 30, 36, 40, 41] [4, 12, 28, 30, 37, 41] [3, 9, 12, 17, 23, 39] [2, 10, 12, 24, 31, 43] [8, 27, 32, 37, 38, 43] [22, 25, 26, 27, 36, 37] [5, 13, 16, 29, 35, 43] [17, 26, 29, 35, 41, 44] [9, 10, 13, 20, 34, 38] [2, 6, 12, 14, 36, 37] 지난 주 당첨 번호를 입력해 주세요. 9,12,23,30,37,44 당첨 통계 6개 일치 (2000000000원)- 2개 5개 일치 (1500000원)- 2개 4개 일치 (50000원)- 2개 3개 일치 (5000원)- 2개 총 수익률은 1.4285785714285715E7%입니다. Process finished with exit code 0 ``` 유닛테스트로 커버안되는 부분이 많음 TDD하다가 구현만 하는 파트 있었음 "},"Cleancode_java_seminar/cleancode_week04.html":{"url":"Cleancode_java_seminar/cleancode_week04.html","title":"4주차","keywords":"","body":" 오프라인 강의에 결석하여, 온라인 자료를 보고 정리함.정리 / 궁금한 것 / 더 공부해야할 것 이번 회차에서는 인수테스트 주도 개발(ATDD)이라는 개념이 나온다. 인수테스트란? 내가 기존에 생각하고 있던 것 : 사용자가 인수해서 프로그램이 제대로 만들어졌는지 테스트하는 것. 요구사항 중심으로 테스트함. 현재 회사 프로젝트에서 해당 단계가 있었으나, 고객사 및 내부 프로젝트팀에 QA관련 인원이 따로 없어서 내가 작성하여 진행함. 해당 테스트케이스는 통합테스트와 큰 차이가 없게 작성했음. 인수테스트 이 링크 설명과 비슷하게 파악해서 작성함. 인수테스트와 테스트를 하는 의미 테스트는 버그를 확인하기 위한 것이지 실행을 확인하기 위한 것이 아니니까 말이다. 이 부분은 좀 미묘하다. 지금까지 내가 경험한 것은 리팩토링할때 테스트케이스가 있으면 안심이 되고, 테스트를 하기 위해서 코드를 작성하다보면, 긴 코드 대신 짧게 로직단위로 나누기가 비교적 쉽다는 거다. 테스트를 만든다고 해서 버그를 완전히 잡을 수는 없다. 버그가 발생했을때 테스트케이스로 잡을 수는 있겠네. 근데 보통 QA까지 가기 전에 테스트케이스를 이용해서 개발자가 다 테스트하고 넘기지 않나?(테스트케이스 막대 초록색으로 다 되는것 보고 commit) 테스트케이스 빨간 막대 뜨는 것까지 버그라고 하나? (이거 하나도 모르니 모르는 게 줄줄이 나오네. 산넘어 산일세...) [궁금] 원하는 로직이 제대로 실행되는지를 확인하는게 단위테스트의 목적 아닌가...? 일반적으로 테스트란 인수테스트(사용자들이 정말로 원하는 기능,빼놓을 수 없는 기능)가 포함된 테스트가 진짜 알짜배기 테스트이기 때문에 사용자들이 요구하지 않았거나 다른방향의 테스트를 하기위한 목적이라면 그것은 가짜테스트가 될 수도 있다. 완전 동의! 분명한 것은 테스트란 고객이 정말로 원하는 기능 , 꼭 필요한 기능, 빈번도가 높은 기능을 위주로 하는 것이 테스트이고 실행확인이 아닌 버그를 확인하기 위한 테스트가 진짜 테스트란 점이다. check10000! 요즘 가장 많이 하는 삽질 중에 하나가 테스트케이스의 우선순위를 엉망으로 두어서, *기능에 대한 핵심 테스트대신, 내가 생각하기 쉬운 버그 상황에 대한 테스트케이스만 만드는 거 같다. 점진적 소프트웨어 개발 by 테스트 (비공개링크) 인수 테스트(Acceptance Test) : 시스템 내부 코드를 가능한 한 직접 호출하지 말고 시스템 전. 구간을 테스트해야 한다. 즉, end-to-end 테스트 [궁금] 구간 테스트? 어떻게? 인수, 통합, 단위테스트 각각 관점이 다름! 인수 테스트 : 전체 시스템 동작 통합 테스트 : 변경할 수 없는 코드를 대상으로 코드가 동작하는가? 단위 테스트 : 객체의 동작, 객체 이용하기 편한가? 더 생각해봐야할 것 지금까지 ATDD 이해한 것 : TDD는 단위테스트로 (각 부분의 로직테스트에 집중) 각 단위를 통합해서 기능 테스트를 할때 놓치는 부분이 생김. 이런 한계를 극복하기 위해서 ATDD는 사용자가 필요로 하는 '기능' 테스트를 구현해두고 이를 만족시키기 위해 TDD로 개발한다. TDD를 하면서 특히 헤매는 부분을 ATDD를 하면 어떤 부분에서 보완이 될까? 유효성 검사 먼저 실컷하다가 로직을 테스트하는 것을 대충함. (thㅔ상에 나 미쳤나봐...) 각 테스트케이스가 메소드 단위의 로직 테스트로 이루어지다보니 실제 원하는 기능 테스트케이스는 빼놓거나, 전체 기능 테스트를 어떻게 테스트케이스로 쓸지 모르겠음. 이렇게 써놓고 나니 그냥 넘어가고 있는 내가 좀 많이 이상한데... [궁금] 어떻게 해야 이상한 점을 고치지? '입력 -> 로직 -> 출력' 을 생각해서 입력값과 출력값을 정의해두고 테스트케이스를 만드는 게 잘 안된다. 엉뚱한 입력값을 넣고 출력값을 원하거나. 객체로 분석을 못하거나 만들어진 객체를 사용못하는 기분이 든다. 원래 리팩토링하면서 이런 쓸모없는 로직을 깔끔하게 다듬는 걸까? 켄트 벡 TDD 책은 한 번에 이런 거 잘해서 딱히 이런걸 리팩토링 하는 부분은 안나오던데. [궁금] 아, 이건 테스트케이스가 아니라 객체로 나누는게 엉망인걸까? 게다가 method나누면서 테스트케이스가 깨지는게 힘들다. 아래 코드처럼. [궁금] 테스트케이스도 리팩토링해야한다고 했는데 원래 이런 경우가 많이 발생하는게 당연한건가... 고치기 전 코드 void methodOld (List inputs) { for (String input : inputs){ validateInput(input) //do something } } 고친 후 코드 void methodBetter (List inputs){ for (String input : inputs){ methodA(validateInput(input)); } } int methodA (){ //do something } 테스트케이스 @Test public void do_something_하는지 확인(){ // methodOld 테스트 } 앞으로 볼 것(= 내용이 많거나 지금 내 수준으로는 어려워서 지금 다 이해할 수 없는 것) TDD 이야기, ATDD로 시작하기 by 최범균 테스트 주도 개발로 배우는 객체 지향 설계와 실천(인사이트) 좋다고 해서 사서 읽어봤다가 번역도 어렵고, 내용도 못 알아듣고 지금은 때가 아닌갑다하고 포기한 책. 객체지향도 제대로 모르고 테스트도 모르고 테스트주도개발도 몰라서ㅠㅠ 느낀 점 / 단상 근데, TDD 도 요구사항 분석이 제대로 되었으면 커버할 수 있지 않나? 훔, 그래도 프로그래머가 놓칠 수 있는 부분을 잡아주는 인수테스트가 있는게 낫겠지. 애초에 프로그래머가 실수 하나도 안하고 한 번에 잘 구현하고 버그도 바로 척척 잡아낸다는 가정 하에 TDD 하는게 아니니까. "},"Cleancode_java_seminar/cleancode_week04_ex.html":{"url":"Cleancode_java_seminar/cleancode_week04_ex.html","title":"4주차 실습","keywords":"","body":"코드 실습하면서 정리 - 사실 / 깨달은 것 / 느낀 것 SpringBoot, JPA 들어보기만 했지 실제로 코드로 보는 건 처음이라 당황했다. 진땀난다. springboot, JPA 공부하고 코드 작성할까 하다가 힌트를 참고해 일단 부딪혀보기로 했다. 당연히 코드를 읽을 수 있어야 가능하겠지만, 일단 목표인 인수테스트 먼저 경험해보자! 초초초친절한 힌트와 가이드가 있어서 시도해볼 수 있다. 처음 접하는 코드를 어떻게 이해하고 접근해나갈지 이번 기회에 좌충우돌하면서 과정을 정리해봐야겠다. Spring 스터디할때 정리했던 DI,AOP 자료를 봐도 머리가 새햐얗다 처음 접하는 것, 익숙하지 않은 것을 접할때 머리가 새햐얗게 될 정도로 많이 당황한다. 요즘 코딩테스트를 준비하면서 좌절하는 부분. 시험에 정말 정말 정말 약하다. 코드 처음 접할때 일단 익숙한 부분을 찾는다. 이 경우엔 구조를 아는 테스트코드 먼저 보기 테스트코드 안에서 다행히 RESTful API 개발했을때 썼던 함수와 비슷한 부분을 발견했다. 흠 이런 방식으로 테스트하는군 익숙한 부분이 없을때 멘탈깨질때 잠시 도망친다 혼자 시간들여서 조금씩 공부해서 익숙하게 된 것(git 사용처럼)을 해보면서 자신감을 얻는다 정신승리한다 - 삽잘하다보면 언젠간 되겠지 명상을 한다 잘하는 사람에게 SOS 친다 (여기선 자바지기에게 물어볼 수 있다. oh yeah!) 아는 부분까지 정리하고, 어디까지 아는지 모르면 어디서부터 모르는지 정리해서 물어본다 코드 실습 관련 LoginAcceptanceTest 처음에 로그인 성공/ 00한 경우에 로그인 실패 가 인수테스트인줄 알았음. 아님! 위 테스트케이스는 단위테스트임 [질문]사용자 입장으로 생각했을때, 로그인 했을때 제대로 된 페이지가 보이면 성공한건가? [답변] 사용자 관점에서 요청을 보냈을 때 어떤 응답이 오는지를 집중적으로 테스트. 로그인의 경우 성공과 실패 두가지로 나눠 테스트하면 됨. 사용자가 요청을 보냈을때(로그인 버튼을 클릭했을때) 응답의 결과인 새로 로딩된 사용자 페이지가. 정상인지 (HttpStatus.FOUND)로 설계하는것 JPA 잘 모르는데요? 미리 구현된 코드 중에 이해안가는 부분 찾아봄. ``` import org.springframework.data.jpa.repository.JpaRepository; ... public interface UserRepository extends JpaRepository { Optional findByUserId(String userId); } -> 스프링 데이터 JPA가 메소드이름 분석해서 JPQL 실행해줌. 세상에 충격이야. - JpaRepository 코드를 까봐도 모르겠어서 회사서가 책을 찾아봤다. 충격. 세상에 이런걸 지원해줌??? 직접 그동안 짰던 내가 원시인 같음. 현업에서 안쓰더라도 도움이 될 것같아서 JPA책 지원신청했는데 신청하길 잘했다. > 일반적인 CRUD 메소드는 JpaRepository 인터페이스가 공통으로 제공하므로 문제가 없다. 그런데 MemberRepository.findByUsername(...)처럼 공통으로 처리할 수 없는 메소드는 어떻게 해야 할까? 놀랍게도 스프링 데이터 JPA는 메소드 이름을 분석해서 다음 JPQL을 실행한다. > select m from Member m where username =:username ``` from. 자바 ORM 표준 JPA 프로그래밍(김영한 지음, 에이콘출판사) Optional 이해 구현되어있는 코드 이해를 돕기 위한 자료 자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪 자바8 Optional 2부: null을 대하는 새로운 방법 자바8 Optional 3부: Optional을 Optional답게 map : 함수형 프로그래밍의 핵심연산 중 하나로, 원래 컬렉션에 담긴 요소를 새로운 값으로 변환한 다음, 변환된 값들을 담고 있는 새로운 컬렉션을 생성한다. 원래 컬렉션과 새로운 컬렉션은 크기가 동일하다(from. Funtional Prgramming for Java Developers) "},"Cloud/aws_tutorial.html":{"url":"Cloud/aws_tutorial.html","title":"AWS tutorial","keywords":"","body":"Keyword aws aws tutorial Reference AWS 10분 자습서 (공식) 생활코딩 - aws 기초 SLiPP wiki - 2주차 - AWS 입문 datum.io - AWS EC2에 R SERVER 설치하기(1) hjpco - [AWS] R Studio Server 구축하기 궁금증 / TODO AWS에서 docker사용할때 이미지를 ec2에 저장하나? 저렴한 s3에 저장하고 끌어다쓰면 안되나? ECS는 배포가 아닌 그냥 사용할때도 적합한가? 프리티어로 사용할 수 있나? stopped 된 instance를 ssh로 접속하면 자동으로 running 상태로 바뀌나? ec2에 설치한 rstudio-server가 구동이 안된다. 프로세스는 실행되고 있다고 나오는데 왜지. pandas sprint 세팅 ec2에 올려서 할 수 있을까? aws c9 지금 만든 ec2로 쓸 수 있나? 새로 instance 만들어야하나? 정리 개념 VPC란? 아마존 웹 서비스를 다루는 기술 20장 가상 네트워크를 제공하는 VPC AWS 설명서 - Amazon VPC란 무엇인가? AWS 설명서 - Amazon Virtual Private Cloud - 시작 안내서 - 개요 VPC SecurityGroup란? EC2란? AWS 설명서 - Amazon EC2란 무엇입니까? Amazon Elastic Compute Cloud(Amazon EC2)는 Amazon Web Services(AWS) 클라우드에서 확장식 컴퓨팅을 제공합니다. EC2 Keypair란? Amazon EC2는 퍼블릭 키 암호화 기법을 사용하여 로그인 정보를 암호화 및 해독합니다. 공개 키 암호화 기법은 공개 키를 사용하여 암호 등의 데이터를 암호화하고, 수신자가 개인 키를 사용하여 해당 데이터를 해독하는 방식입니다. 퍼블릭 키와 프라이빗 키를 키 페어라고 합니다. 인스턴스에 로그인하려면 키 페어를 만들고, 인스턴스를 시작할 때 키 페어의 이름을 지정하고, 인스턴스에 연결할 때 프라이빗 키를 제공해야 합니다. Linux 인스턴스에서 퍼블릭 키 내용은 ~/.ssh/authorized_keys 내 항목에 있습니다. 이 과정은 부팅 시에 처리되므로 암호 대신 프라이빗 키를 사용하여 안전하게 인스턴스에 액세스할 수 있습니다. from. aws 자습서 EC2 keypair 바꾸기 EC2 인스턴스는 생성시에 keypair를 설정할 수 있으며, 그 이후에는 DashBoard에서 keypair를 변경할 수 없음 주의: 내가 한 실수. EC2 DashBoard에서 Key Pairs 에서 키 생성하면 해당 인스턴스에 접속할 수 있는 줄 알았음. key를 변경 또는 추가하고 싶을 겅우, 기존의 keypair를 사용해 해당 인스턴스에 접속하여, key설정을 바꾸어야함. EC2 keypair 확인 현재 해당 instance에 등록되어 있는 keypair 확인 인스턴스 생성시 설정해둔 publickey 확인 : EC2 접속 후, curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key INSTANCES - Instances - 해당 instance 의 Description gkdahrdml Key pair name 확인 : [주의] 인스턴스 메타데이터에 남아있는 정보를 가져오기때문에, EC2에 키를 업데이트하거나 추가했어도 해당 정보가 보이지 않을 수 있음 로컬에 있는 keypair 가 EC2에 등록된 keypair인지 확인 - key fingerprint 확인 로컬 터미널에서 확인할 $path_to_private_key$(예. /User/mac/.ssh/seoul_MyService.pem) 커맨드 입력 : openssl pkcs8 -in $path_to_private_key$ -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c 출력되는 fingerprint와 EC2 dashboard의 NETWORK & SECURITY - Key pairs 에서 실제 Fingerprint 확인 EC2 keypair 생성 EC2 dashboard - NETWORK & SECURITY - Key pairs 에서 'Create Key Pair'로 새로운 keypair 생성 헷갈리지 않기 위해 KeyPair name 은 '리전인스턴스명(옵션)식별글자'규칙으로 생성하는 것이 편함 덧붙여줌 keyname 을 적어주는 것이 좋음 (예. seoul_MyService_user01) 생성하면, 자동 다운로드되는 pem 키를 앞으로 사용할 디렉토리에 이동시킴 해당 키는 다시 다운로드 할 수 없으니 관리에 주의하도록 함 통상적으로 key는 ~/.ssh 아래에 둠 (예. ~/.ssh/seoul_MyService_user01.pem) 해당 파일의 권한관리 설정함 chmod 400 seoul_MyService_user01.pem 또는 chmod 600 seoul_MyService_user01.pem 다운받은 private Key의 publicKey를 확인하여 저장해둠. Linux/ mac의 경우 아래와 같이 확인 터미널에서 ssh-keygen -y 입력 'Enter file in which the key is (/keypath/keyname 예시):'와 같거나 비슷한 의미의 문구가 출력되면 public key 경로를 지정 (예. ~/.ssh/seoul_MyService_user01.pem) 반환되는 publicKey를 복사해둠 Windows의 경우, PuTTYgen 등을 사용하여 가져옴. PuTTYgen를 시작하고 [Load]를 선택한 후 .ppk 또는 .pem 파일을 선택. PuTTYgen에. 퍼블릭 키가 표시됨 (출처. AWS 자습서) EC2에서 생성한 keypair 추가 등록 keypair 생성 및 public key 확인은 하단 'EC2 keypair 생성' 참고 기존 키를 사용하여 instance 에 접속 ~/.ssh/authorized_keys 에 public Key를 덧붙임 키 관리를 위해, publickey 적은 후, 공백을 주고 key이름을 덧붙임(하단 예제는 'my-key-pair'가 key 이름임)ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE my-key-pair 기존 키를 사용하지 않을 경우, 앞서 적힌 키는 지운다. authorized_keys에서 삭제한 후에도 인스턴스 메타데이터에 남아있을 수 있음 데이터분석환경 EC2로 설정하기 프리티어를 사용해 무료 범위의 인스턴스를 사용함. R, Hadoop은 메모리 사용량이 많으므로, 메모리 특화된 인스턴스를 설치 AWS - Amazon EC2로 설정 참고해 아래의 작업 실행 AWS 가입 / IAM 사용자 생성 / 키 페어 생성 / Virtual Private Cloud(VPC) 생성 / 보안 그룹 생성 키 페어 저장경로 : /aws 로 따로 관리하거나 ssh 접속 편의를 위해 /.ssh 에 저장. 키 페어를 이용한 접속시, Mac-ssh-접속-편하게-만들기 참고해 ssh aws간단한 명령어로 접속가능하도록 설정함. sudo vim ~/.ssh/config 사용해 아래 내용 설정. instance 생성된 후 '3.[AWW - Linux 인스턴스에 연결]'항목을 참고해 내용 바꿔줌.Host aws HostName $호스트 주소$ User $사용자 계정$ IdentityFile $파일 경로/파일명.pem$ 보안그룹 생성시, 사전작업 내 로컬PC IP 확인 웹사이트 http://checkip.amazonaws.com R studio 구동을 위해, 8787 포트를 열어둠 (custom TCP / TCP / 8787 / ...) AWS - 시작 인스턴스 마법사를 사용하여 인스턴스 시작 Step 3: Configure Instance Details : Auto-assign Public IP : Enable 로 설정하기 1 항목에서 만들어 둔 key pair 와 security group을 사용함 AWS - Linux 인스턴스에 연결 위에서 만든 인스턴스가 lanch 되면(Instance-Instance 에서 runnint 상태확인) ssh 설정 : 위 1번 항목의 ssh aws 설정파일(~/.ssh/config)에 등록 HostName : Description 탭의 Public DNS (IPv4) User : ec2-user (선택한 AMI에 따라 다르므로 위 링크의 내용을 참고 Linux 인스턴스에 연결 - SSH를 사용하여 인스턴스에 연결하려면 - '5.~') docker 를 사용하여 기본 분석 패키지 install ec2 AMI에 설치되어있는 패키지 확인 AWS Doc - EC2 Linux 인스턴스의 소프트웨어 패키지 찾기 yum groupinfo $그룹 이름$ : 해당 그룹에 설치되어 있는 패키지 확인 / yum grouplist 시스템에 이미 설치된 그룹 및 설치가능 그룹 나열 기본으로 설치되어있는 패키지 확인 `` 중복설치는 불필요하지만 빠른 설치를 위해 일단, 기존에 만들어진 이미지를 사용함. 데이터사이언스스쿨 도커 이미지 "},"Cloud/aws_cloud9.html":{"url":"Cloud/aws_cloud9.html","title":"AWS c9","keywords":"","body":"Keyword cloud 9 cloud IDE Reference 정리 AWS cloud9 설정하기 설치 Instance cloud9은 한국에서는 가장 가까운 region이 singapore임 singapore에서 EC2를 생성하고 나중에 IDE 세팅을 Seoul로 바꾸어줌 [질문]서울로 region을 바꾸는게 가능한 이유는? shared 할 co-worker들을 초대 인터넷으로 접속이 가능하도록 VPC세팅 [질문]VPC 세팅 오류나서 다시 인스턴스 생성함 Java 환경설정 Java Sample for AWS Cloud9 참고해서 세팅 https://docs.aws.amazon.com/ko_kr/devicefarm/latest/developerguide/test-types-web-app-appium-java-junit.html jdk update Junit setup : change project to gradle for using JUNIT Python 설정 바로 python을 실행했더니 제대로 작동을 안함. 세팅이 필요함 https://docs.aws.amazon.com/ko_kr/cloud9/latest/user-guide/sample-python.html unittest 에서 ImportError: No module named ~ 에러가 발생함 "},"Code_Snippet/Java.html":{"url":"Code_Snippet/Java.html","title":"Java 코드조각","keywords":"","body":"개요 쓸만한 코드 조각 모아둠 Java의 경우 codota의 chrome plugin 를 사용해 저장함 codota 는 아래와 같은 소프트웨어임. 홈페이지 참고함 Codota's AI learns from existing Java code to help you build software faster and smarter. Codota uses learned code models to suggest relevant code. These suggestions save you time searching for references, and help prevent errors. short if public int getForwardCoord(int randomVal) { return randomVal >=4? 1:0; } split String str1 = \"phone;;name;id;pwd\"; String word1 = str1.split(\";\")[0]; //phone String word2 = str1.split(\";\")[1]; //공백 \"\" 출력 String word3 = str1.split(\";\")[3]; //pwd String[] words1 = str1.split(\";\", 0); // {\"phone\",\"name\",\"id\",\"pwd\"} String[] words2 = str1.split(\";\", 2); // {\"phone\",\"name\",\"id;pwd\"} List - initialze ```Java // JDK 7 List list = new ArrayList<>(); list.add(\"one\"); list.add(\"two\"); list.add(\"three\"); //JDK 8 List list = Stream.of(\"one\", \"two\", \"three\").collect(Collectors.toList()); // JDK 9 List list = List.of(\"one\", \"two\", \"three\"); - List - print element ```Java // JDK 8 list.forEach(System.out::println); //with comma String.join(\",\", list) list.stream().collect(Collectors.joining(\",\")) //change Upper-case with Comma list.stream().map(String::toUpperCase).collect(Collectors.joining(\",\")); // JDK 7 System.out.println(Arrays.toString(list.toArray())); List - clear() vs removeAll() vs new ArrayList() How to empty or clear ArrayList in Java (list.clear() vs list = new ArrayList(); Empty an ArrayList or just create a new one and let the old one be garbage collected? Better practice to re-instantiate a List or invoke clear() The main thing to be concerned about is what other code might have a reference to the list. If the existing list is visible elsewhere, do you want that code to see a cleared list, or keep the existing one? If nothing else can see the list, I'd probably just clear it - but not for performance reasons; just because the way you've described the operation sounds more like clearing than \"create a new list\". print How do you create a new line in Java programming? System.out.println(); [takes care of the newline implicitly] Using a combination of escape sequences: 2.1. System.out.print(\"\\n\"); 2.2. System.out.print(\"\\n\\r\"); Using System defined methods/ key- value pairs: 3.1. System.out.print(System.lineSeparator()); 3.2. System.out.print(System.getProperty(\"line.separator\")); "},"CodingInterview/book_cracking_the_coding_interview.html":{"url":"CodingInterview/book_cracking_the_coding_interview.html","title":"코딩인터뷰 완전분석 스터디 정리자료","keywords":"","body":"Keyword cracking the coding interview 코딩인터뷰 완전분석 coding interview Info SRWK codeinterview 스터디 진도표(개인용) self-paced : 각자 하고 싶은만큼 목표를 세우고 학습내용 정리 및 공유 슬랙채널에서 자유롭게 질의응답 + 온라인 화상미팅 (매주 수요일) 개인 스터디 방식 책에 언급된 개념을 토대로 확장. 아래 자료 참고 책 - 그림으로 배우는 알고리즘 책 - 알고리즘 문제해결 전략 Reference 상황 / 궁금증 정리 "},"Concept/OOP.html":{"url":"Concept/OOP.html","title":"OOP","keywords":"","body":"Keyword oop Reference 책 - 객체지향 사실과 오해 (조영호) 책(일부) - 소트웍스 앤솔로지 - 객체지향 생활체조 :+1: 객체-지향 프로그래밍 이란 무엇인가? : 다섯개의 기반 개념 by 소프트웨어 디자인- Design Software by vandbt :+1: 객체-지향 프로그래밍 이란 무엇인가? (OOP) Journal of Object-Oriented Programming - Designing Reusable Classes 도서 - JAVA 객체 지향 디자인 패턴 (정인상,채홍석 지음) 정리 다형성 Polymorphism "},"Concept/DDD.html":{"url":"Concept/DDD.html","title":"DDD","keywords":"","body":"개요 TDD 아침 스터디에서 실습하면서 도메인 설계에 관심가지게 됨 (요구사항에서 도메인 설계를 하니, 기존에 요구사항에서 바로 테스트케이스를 추출했을때와는 느낌이 다름. 테스트케이스로 커버하지 못하는 부분까지 까먹지 않고 확인되는 기분) 보통 정리되어있는 책을 먼저 읽고 블로그 글을 찾아 읽는데 (책은 한번 검증이 되었다고 생각함. 블로그 글은 검증과정이 없어서 맞는 내용인지 알 수 없음) DDD관련해서는 좋은 article이 많아보여서 이번에는 블로그 글 먼저 읽어봐야겠음. 참고 list 아래 리스트는 실제 검색 순서대로 적었다 객체 모델링 공부하게 책 하나 추천해주세요 - 글쓴이 안영회 -popit - 객체 모델링 그래서 무엇인가? '객체 모델링' 검색해서 찾음 Domain Driven Design - 조영호님 블로그 - 위 아티클에 나오는 DDD 가 뭐람? 'DDD'검색 결과. 게임을 예로 설명한 알기 쉬운 도메인 주도 설계 - 1.문제 영역에 대한 올바른 이해 - MORE AGILE 블로그 - 위에 글 지금 수준으로 이해하기 너무 어렵다. 이거 읽기 전에 더 쉽게 읽을 수 있는 거 있나? 검색. 이건 좀 더 쉽게 읽힌다 ZDnet - 안영회님의 DDD 칼럼 시리즈 책 - 도메인 주도 설계 - 에릭 에반스 저 - DDD도 처음 이 컨셉을 소개한 유명한 책이 있는 갑네. 찾아보자. 근데 처음보기에는 어려울 수 있다고? 뭐가 그럼 처음 보기에 좋은데? 책 - DDD Start! 책 서평 - 도메인 주도 설계 구현과 핵심 개념 익히기 - 입문할때 많이 보는 책이구나. 익숙한 기술stack 실습예제가 있어서 안심이 된다 책 소개 : DDD Start! - 도메인 주도 설계 구현과 핵심 개념 익히기 - heene 블로그 "},"Concept/polymorphism.html":{"url":"Concept/polymorphism.html","title":"다형성 polymorphism","keywords":"","body":"Keyword oop polymorphism Reference opentutorials - Java 다형성 정리 다형성(Polymorphism)이란? 하나의 메소드 또는 클래스가 다양한 방법으로 동작하는 것 (opentutorials - Java 다형성) 먼저 이해해야할 것 interface - 특정한 인터페이스를 구현하고 있는 클래스가 있을 때 이 클래스의 데이터 타입으로 인터페이스를 지정 할 수 있음 package org.opentutorials.javatutorials.polymorphism; interface I{} class C implements I{} public class PolymorphismDemo2 { public static void main(String[] args) { I obj = new C(); } } 상속 : 하위 클래스를 상위 클래스의 데이터 타입으로 인스턴스화 했을 때 어떤 일이 일어나는지 오늘의 코드 "},"Concept/regexp.html":{"url":"Concept/regexp.html","title":"정규표현식 Regexp","keywords":"","body":"Refrence programmers - RegExp 강의 hackerrank - RegExp tryHelloWorld Lecture Mindscale Lecture. regular-expressions : 정규표현식 최적화사키는 과정 참고 정리 모르는 내용만 골라서 정리함.Introduction Group : (.{3}\\.)(.{3}\\.)(.{3}\\.)(.{3}) vs (.{3}\\.){3}.{3} digit == \\d non-digit == \\D : (\\d{2}\\D){2}\\d{4} -> 06-11-2015 whitespace(\\s [\\r\\n\\t\\f]) non-whiteSpace \\S Word == \\w Non-Word Character == \\W 'non-' -> Upper Case start == ^ , End == $ : ^\\d\\w{4}.$ [ ] matches only one out of several characters placed inside the square brackets. not mathces Character Class, Repetitions, Grouping and Capturing character Range [A-Z][a-z][0-9][가-힣] [a-zA-Z] : lowercase & uppercase Repetitions : {1,3}: 1,2or3 time / {3,}: 3 or more time / {3}: 3time Grouping and Capturing word: word Boundary : \\bcat\\b -> My cat is () : boundary not capture (?: ) | : or Matching Same Text Again & Again \\group_number e.g.(\\d)\\1 -> 11,22,33,44 e.g.(\\w)(\\w)k\\1\\2 -> abkab , cdkcd e.g.^\\d{2}(-?)(\\d{2}\\1){2}\\d{2}$ -> 12-34-56-78 or 12345678, not 1234-56-78,... e.g. (\\2amigo|(go!))+ -> go!go!amigo Assertion Asserts regex_1 to be immediately followed by regex_2. The lookahead is excluded from the match. It does not return matches of regex_2. The lookahead only asserts whether a match is possible or not. Positive lookahead : regExp_1(?=regExp_2) Asserts regExp_1 to be immediately followed by regex_2 Negative lookahead : regExp_1(?!regExp_2) Asserts regExp_1 to be immediately followed by not regex_2 Positive Lookbehind : (? - Asserts regex_1 to be immediately preceded by regex_2 Check \\ba\\s\\b (O) \\b^a\\s$\\b (x) : '\\b \\b' is Range. [a-zA-Z] : lowercase & uppercase ,not [A-z] because of ASCII range cf. Difference between regex [A-z] and [a-zA-Z] Backreferences To Failed Groups (Think!) S consists of 8 digits. S may have \"-\" separator such that string gets divided in parts, with each part having exactly two digits.(Eg.12-34-56-78) \\d{2}((-?)\\d{2}\\1){2}\\d{2} (X) ^\\d{2}(-?)(\\d{2}\\1){2}\\d{2}$ (O) "},"Contribution/gitlab_handbook_translation.html":{"url":"Contribution/gitlab_handbook_translation.html","title":"gitlab handbook 한글번역","keywords":"","body":"Keyword translation contribution 번역 Reference gitlab handbok 번역 프로젝트 안내 상황 20180322 한 단락의 짧은 글을 번역하고, 리뷰요청해둠 관심있는 주제를 골라서 번역할 수 있어서 좋다 "},"Contribution/pandas_sprint.html":{"url":"Contribution/pandas_sprint.html","title":"Pandas sprint","keywords":"","body":"Keyword pandas contribution pandas sprint Reference python-sprints - pandasSprint dashboard: pandas doc contribution을 위한 단계별 안내사항이 자세히 나와있음. 다른 contribution할때도 참고할정도로 도움이 많이 되었음 상황 / 궁금증 2018/03/28 PR을 날린 후 1주도 지나지 않아서 Merge 되었다. 와우! review받은 걸 주말에 작업해야지 하고 있었는데 reviewer가 수정하고 merge함. review comment에 답하지 못했던게 마음에 걸렸다. contribution 매너 같은거 다음에 sprint열리면 물어봐야지. pandasSprint dashboard는 pandas doc contribution을 위한 단계별 안내사항이 자세히 나와있다. 다른 contribution할때도 참고할정도로 도움이 많이 되었다. pandas contribution으로 용기를 얻어서, gitlab handbook 한글번역 프로젝트에 발을 얹었다. 온라인상으로 시간날때 자유롭게 참가할 수 있다는 게 정말 좋다. pandas에 또 contribution 하고 싶어서, issue를 눈팅하고 있는데 good-first-issue를 찾아도 왠지 어려워보인다. 흠... 2018/03/13 개발자로 전향하면서 가장 쿨하다고 느꼈던 개발자 문화는 오픈소스 contribution이었다. 그동안은 실력을 높여서 contribtion해야지! 하고 마음 속 목표로만 가지고 있었다. 무지무지 잘해야만 contribution이 가능하다고 생각했었는데, 작년 공개개발자센터의 contributon을 하면서 초보자도 접근할 수 있는 contribution이 있다는 걸 깨달았고, 기본적인 PR process를 해보면서 좀 더 익숙해졌다. 보통 contribution진입으로 번역과 doc 작업을 많이 추천하는데, 마침 이번 WorldWide pandas sprint 에서 seoul이 있다는 정보를 얻고 참가! 사내 gitlab menual을 만들면서 pandas에는 초보자도 접근하기 쉽도록 꼼꼼한 contribution manual이 있다는 걸 알았기때문에 용기내서 신청할 수 있었다. 이번 sprint는 Worldwide Pandas Documentation Sprint로 전세계에서 동시에 주말동안 pandas doc contributing을 진행하는 것으로 한국에서는 서울지역에서 열렸다. 서울 Organizer인 Younggun Kim 님의 꼼꼼하고 친절한 리딩으로 첫 오픈소스 컨트리뷰팅에도 불구하고, 어려움보다 재미를 크게 느낄 수 있었다. pycon 격월 세미나를 준비때문에 스프린트를 계속 하지 못하고 왔다갔다해서 아쉬움이 많지만 그럼에도 불구하고 PR에 성공했다. 다음 sprint가 기대된다. PR후에 sprint day라서 그런지 리뷰 comment가 빨리 달려서 놀라웠다. 언제나 피드백이 고픈 나에게는 리뷰받는게 너무 행복. 정리 python-sprints - pandasSprint dashboard: pandas doc contribution을 위한 단계별 안내사항이 자세히 나와있음. 다른 contribution할때도 참고할정도로 도움이 많이 되었음 "},"Contribution/keras_traslate.html":{"url":"Contribution/keras_traslate.html","title":"Keras article 한글번역","keywords":"","body":"개요 2018 공개SW 컨트리뷰톤 2018/08/16 - 2018/10/31 (아카이빙페이지)에서 Keras 튜토리얼 번역 프로젝트 번역 : 케라스(Keras) 튜토리얼 - 텐서플로우의 간소화된 인터페이스로서 "},"Cowork/codereview.html":{"url":"Cowork/codereview.html","title":"코드리뷰","keywords":"","body":"Keyword code review Reference 상황/궁금 코드스쿼드의 '클린코드,리팩토링,TDD'강의에서 진행한 코드리뷰와 코드리뷰를 받는 입장이기때문에 어떤 부분을 리뷰하는지를 포인트로 정리 SLiPP의 테스트기반 개발 스터디에서 진행하는 코드리뷰에서 배운 것을 정리 매 스터디시간에 전시간 코드리뷰를 짧게 하면서, 현업에서 실제로 어떤 식으로 코드리뷰를 진행하고 있는지 도형형님이 틈틈이 코멘트를 하시는데, 기본 매너(리뷰된 내 작성코드에 응답 코멘트를 다는 것, 코드리뷰에서 감정을 건드리지 않도록 조심하자 등)와 현업에서의 적용(merging에 대한 의견)을 배울 수 있어서 유익하다 시니어가 진행하는 코드리뷰를 엿볼 수 있는 거의 유일한 기회라서 도움이 된다. 정리 / 느낀 점 코드리뷰 기본 코드리뷰에서 감정을 건드리지 않도록 조심하자 리뷰된 내 작성코드에 응답 코멘트를 달아서 피드백을 주자. 리뷰된 코드에 반영했습니다 등올 다시 코멘트 다는 거 잊지말자! (팀마다 방식다름) merging시에도 다른 팀원들도 'ohahohah merge 찬성합니다' 등의 피드백을 주고 이를 확인 후 merge함 보통 팀원들이 conversation에 자신이 코드리뷰했음을 코멘트함. merge에 대한 의견도 코멘트함. PR 명세 수준 : '설계서 + 새로 작성한 명세서' 를 보고 다음 작업자가 이해할 수 있을 정도 에러발생시 알려주기 저번 스터디시, 코드리뷰 후 master에 merge하였으나, 이번 주차 테스트코드 실행했는데 테스트케이스 깨짐. 해당상황 수정 후, 기록 남김 2018-05-02 테스트 실패 master 픽스 / 실제 픽스한 commit "},"Cowork/pairProgramming.html":{"url":"Cowork/pairProgramming.html","title":"짝 프로그래밍","keywords":"","body":"Keyword 애자일 키워드 김창준 페어프로그래밍 짝프로그래밍 몹프로그래밍 Reference 김창준 애자일 키워드 팟캐스트 - 짝프로그래밍 페어프로그래밍 첫 도전기 몹프로그래밍 페어프로그래밍으로 TDD하고 있는 스터디 리포지토리 상황 회사에서 버그가 생겼을때나 막혔을때 선임과 같은 컴퓨터에서 같이 보면서 이렇게 해보면 어떨까? 저렇게 해보면 어떨까? 하면서 같이 키보드를 번갈아 사용하면서 디버깅,버그를 해결해나감. 이렇게 하면서 옆에서 디버깅하는 습관을 보고 배울 수 있었음. 처음 버그에 부딪혔을때 굉장히 막막했는데 이렇게 같이 해나가면서 버그에 대한 두려움도 많이 줄어들음. 페어프로그래밍이 학습과 협력에 효과적이라는 것을 처음 익스트림프로그래밍 책에서 보게됨. 하지만 주위에 같이할 사람이 없음. 짝을 찾아헤메다가 드디어 실제로 페어프로그래밍을 꾸준히 할 수 있는 스터디(TDD 오예!)가 생김. 페어프로그래밍을 모르는 사람도 있어서 내가 알고 있는 부분을 간략하게 설명해주고 같이 팟캐스트와 자료를 찾으면서 서로 알고 있는 지식 수준이 같도록 먼저 작업함. TDD 스터디하면서 페어프로그래밍(3명이니 정확히는 mob-prgramming)하면서 느낀 것들 정리 애자일 키워드 팟캐스트 들으며 내용 정리 정리 실제 페어프로그래밍을 하면서 처음에는 분석없이 바로 각자 역할을 나누어서 들어갔음. 근데 같은 요구사항을 읽어도 각자가 생각하는 다른 경우가 많음. 간단한 요구사항이라 분석이 굳이 필요없을 것 같아서 나중에 이 부분의 간격을 좁히는데 시간이 더 많이 듦. 적절한 페어프로그래밍 턴 넘어가는 시간(5분마다 턴 교대? 10분마다?)를 직접 해보면서 우리에게 적절한 시간을 찾아나감 그 다음부터는 페어프로그래밍 들어가기 전에 요구사항 분석하면서 이야기함. 서로 다르게 생각하고 있는 부분이 미리 짚어봄. 테스트케이스리스트를 작성해봄. 위 과정을 거쳐도 하다보면 서로 다르게 생각했던 부분이 있음. 완전히 같은 생각을 할 순 없음. 일단 턴을 진행해보다가 너무 삽질한다 싶으면 (보통 2개의 턴(10분) 이상으로 삽질) 멈추고 다시 설계를 점검해봄. 스터디에서는 25분정도 실습을 하므로 긴 삽질은 하지 못함. 어차피 회고할때 이 부분 삽질이었음 이런게 자동으로 나옴. 몇 번 페어프로그래밍을 하다보면 점점 스타일이 맞아짐. 쿵짝이 맞게되는 순간이 많아짐. 좋은 쪽으로 쿵짝이 맞아가는 거면 좋겠음. 이건 우리 코드다! 그 사람이 드라이버였을때 버그가 나는 코드를 작성하더라도 그건 그사람의 책임이 아니라 우리가 작성한 코드의 책임임. 버그를 해결했을때는 함께 기뻐함. 페어프로그래밍 하면서 발생한 문제점과 개선사항은 페어프로그래밍이 끝나고 함께 회고하면서 발견해나감. 페어프로그래밍 작업 후에 어땠는지 짧게라도 회고를 하면 도움이 될 듯. 회고하세요 회고 꾸준히 하세요. 삽질을 두려워하지 않고, 어차피 회고하면서 개선해나갈테니까 빠르게 시도할 것을 결정하고 개선해나감 From 애자일 키워드 팟캐스트 - 짝 프로그래밍 팟캐스트 듣고 떠오르는 질문 짝 프로그래밍을 도입하기 좋은 지점은 ‘두렵거나 지겹거나’ 할때라고 합니다. 지금 프로젝트에서는 어떤 부분에 도입하면 좋을까요? 애자일에서는 프로젝트의 전체 그림(추상적인 것)과 작은 그림(구체적인 것)을 왔다갔다하면서 피드백을 자주 받으며 계획을 수정해나간다고 합니다. 페어프로그래밍도 네비게이터(한 발짝 벗어나서 전체 그림보기)와 드라이버(구현-구체적인 것)로 나누어서 작업합니다. 그러면 세명 이상의 페어 프로그래밍은 어떻게 작업해나가면 좋을까요? 프로그래밍을 할때는 머릿 속으로 생각한 것들을 실제 코드로 구현해나갑니다. 그럼 서로가 머릿 속으로 어떤 생각을 하고 있는지 어떻게 확인해나갈 수 있을까요? 내용 질문 페어프로그래밍이란? 모니터를 가운데 두고 번갈아가면서 5분씩 키보드를 움직이며 키워드를 입력 왜 모니터를 가운데 두나요? 앉은 자리위치에 따라 누가 주도하고 소셜파워가 강한지 역학관계가 달라짐(보통은 역학관계에 따라 앉은 자리가 달라짐.최대한 그런 걸 느끼지 않도록)- 모니터 가운데에 두면 누구 한 명이 주인인 느낌이 덜 듬. 공동주인인 느낌이 들도록 모니터를 가운데에 배치. 한 명은 내비게이터(옆에서 전체를 보는 역할. 길잡이), 한 명은 드라이버(직접 타이핑)으로 번갈아 역할을 수행함. 드라이버는 중얼중얼거리면서(설명이 아님) 타이핑함. 듣고 어떤 거 하고 있는지 알 수 있도록. 네비게이터, 드라이버 왜 나눌까? 애자일에서 계획은 수정해나가는것임. 피드백을 자주 받으면서. 전체 그림 보고 작은 그림보고 추상적인 것과 구체적인 것을 왔다갔다함. 네비게이터 장기 훈수둘 때 더 잘 보이는 경우가 있지 않나? 한 발짝 멀리서 떨어져서 보면 전체 상황이 잘 보이게 됨. 키보드에 손을 떼서 벗어나게 되면 장기 훈수두는 것처럼 멀리보게 됨. 계속 몰입되어있으면 잘 안보이는 경우가 많음 서로 역할을 번갈아가면서 전체를 봤다가(내비게이터) 구체적인 것을 보는 걸(드라이버) 계속 하게됨. 페어프로그래밍 텀을 왔다갔다 많이 하면 학습이 더 빨라짐 사람이 동시에 멀리보기 가까이보기 두 가지 하기 힘듦. 페어프로그래밍은 이렇게 볼 수 있도록 도와줌. 페어프로그래밍 효과 결함(bug) 줄어듬 (페어프로그래밍 찬반입장에 상관없이 모든 학자가 인정함) 팀웍을 경험할 수 있음. 단순히 시간을 같이 오래보낸다고 협력하는 근육이 늘어나지 않음. 일을 나눠서한다면 상대가 하는 일, 일스타일 등을 깊게 경험하지 않음. 통합시간이 줄어듦. 하나의 프로젝트를 나눠서 하면 각자 작업한 것을 통합하는 시간이 필요함. 처음부터 같이 작업하므로 이 시간이 줄어듦 갈등을 드러나게 함. 애자일에서는 갈등을 피하는 것보다 갈등이 드러나는 걸 더 긍정적으로 봄. 나중에 커질 문제를 미리 겪는 것임. 단 문제를 해결할 의지와 능력이 없을 경우 힘들어진다. 페어프로그래밍 도입 전 체크 인시(하나의 일을 하는데 시간당 투입되는 인력)가 늘어남 당장 기한이 급한 것은 힘듦. 페어프로그래밍 언제하는게 좋을까? 언제? 두렵거나 지겹거나 할 때 두렵다 == 불확실성 높고, 내가 못할 것 같다 - 옆에서 함께 봐주면 나아짐 지루함 == 같이 하면 재밌어짐. 예를 들면, 인형눈붙이기 같은 지루한 작업은 같이 하면 나아짐 도입할때 두렵거나 지겨운 포인트를 찾아서 그 부분부터 점진적으로 도입해보자 페어프로그래밍 하면서 주의해야할 점 강의하지마라 - 둘다 피곤해짐 전문가와 비전문가 페어는 어떻게 해야하나요? 협력의 기술 들어갑니다. 관계에서의 비대칭. 비전문가는 기여를 적게하고 학습을 적게하면서 아웃사이더가 됨 내 파워가 쎈 경우, 내 파워를 낮추고 상대를 높여줘야함. 상대에게 자꾸 물어보기. 물어보는 과정 속에서 상대가 적극적으로 될 수 있음. 이 부분은 해보실래요? 하고 건네줌. 내용을 몰라도 타이핑해야할껄 불러줌. 몰라도 할 수 있도록 그 사람이 직접 해보게 해야함. 페어프로그래밍을 넘어 페어웍(pair work) GoGo "},"DataScience/interview.html":{"url":"DataScience/interview.html","title":"데이터사이언티스트 인터뷰 목록 답변 정리","keywords":"","body":" Keyword Reference 상황 / 궁금 정리 웹 아키텍쳐 Keyword interview datascience Reference 데이터 사이언스 인터뷰 질문 모음집 상황 / 궁금 데이터 사이언스 인터뷰 질문 모음집을 보고 적을 수 있는 부분을 적음. 아직 공부하고 있는 분야는 그렇다 치더라도 웹 아키텍쳐, 분산처리, 시스템엔지니어링, 데이터시각화, 데이터베이스 정도는 적을 수 있지 않을까? 했는데 모르는게 많음. 연관 개념까지 꼼곰하게 정리해서 포스팅 할 예정. 정리 웹 아키텍쳐 트래픽이 몰리는 상황입니다. AWS의 ELB 세팅을 위해서 웹서버는 어떤 요건을 가져야 쉽게 autoscale가능할까요? 네...? 일반 로드밸랜스 세팅하고 다른가? 왜 Apache보다 Nginx가 성능이 좋을까요? node.js가 성능이 좋은 이유와 곁들여 설명할 수 있을까요? node.js처럼 single-thread기반 비동기IO처리 를 하기 때문에 성능이 더 좋음. 참고: http://blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220737182315 node.js의 장점 : 발췌(http://bcho.tistory.com/876) 하나의 쓰레드가 request를 받으면, 처리를 하고, File IO나Network 처리 (데이타 베이스 접근)등이 있을 경우에는 IO 요청을 보내 놓고, 작업을 처리하다가, IO 요청이 끝나면 이벤트를 받아서 처리하는 이벤트 방식을 사용한다. 이로 인해서, CPU가 IO 응답을 기다리는 시간이 필요 없고, 대부분의 연산 작업에 사용되기 때문에 높은 효용성을 가질 수 있으며, 특히 하나의 Thread로 여러개의 요청을 처리하는 구조로 되어 있기 때문에, C10K 문제를 처리할 수 있는데 아주 최적화 되어 있다. node.js는 일반적으로 빠르지만 어떤 경우에는 쓰면 안될까요? single thread 특성상, 하나의 작업이 오래 걸리면, 성능이 떨어짐. 또 멀티코어의 이점을 살리기 위해 부가적인 처리가 필요함. Node.js를 사용할 때 주의할 점 참고: http://bcho.tistory.com/876) 하나의 IP에서 여러 도메인의 HTTPS 서버를 운영할 수 있을까요? 안된다면 왜인가요? 또 이걸 해결하는 방법이 있는데 그건 뭘까요? 기본적으로 소켓(소켓:https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%EC%86%8C%EC%BC%93 참고)당 하나의 SSL Certificate를 사용하게 되어있기 때문에 별도 처리가 필요함. Server Name Indication (SNI) 를 사용하면 해결가능. 참고 : https://en.wikipedia.org/wiki/Server_Name_Indication#Support ) 추가 개념 wikipedia - Transport_Layer_Security wikipedia - Application_layer 개발이 한창 진행되는 와중에도 서비스는 계속 운영되어야 합니다. 이를 가능하게 하는 상용 deploy 환경은 어떻게 구현가능한가요? WEB/WAS/DB/Cluster 각각의 영역에서 중요한 변화가 수반되는 경우에도 동작 가능한, 가장 Cost가 적은 방식을 구상하고 시나리오를 만들어봅시다. '무중단배포(Zero Downtime Deployment)' "},"DB/tool.html":{"url":"DB/tool.html","title":"DB Tool","keywords":"","body":"Keyword db tool modeling Reference 개발자 단체카톡방 상황/궁금증 정리 DB vendor / 유무료 따라 oracle - sql developer postgresql - pgadmin DA# ERWing exERD DBMS tool : dbeaver (DB vendor 가리지 않음) aquerytool (web) : 타입사전, 단어사전, 용어사전 관리 제공 / SQL 자동생성 객체지향 JPA 사용할때도 DB모델링 필요한가? "},"DB/Tunning.html":{"url":"DB/Tunning.html","title":"Tunning","keywords":"","body":"Keyword Oracle Tuning , index, 'join' Reference oracle explain plan Oracle - Database Performance Tuning Guide- 13.4.2 Reading and Understanding Execution Plans 오라클 성능 고도화 원리와 해법 I(조시형 지음) - ch03. 오라클 성능 관리 -04.DBMS_XPLAN 패키지 구루비 지식창고 - EXPLAIN PLAN query optimization 쿼리 계획과 최적화를 이용한 더 효율적인 SQL SQL 고급 활용 및 튜닝 - 인덱스와 조인 김범의 데이터 모델링 - 2.1 옵티마이저(Optimizer)의 이해 SQL QUERY OPTIMIZING Check JOIN시 INDEX 사용 SQL Tuning Process (from 오라클 성능 고도화 원리와 해법 I) query executeion plan 확인 (1로 파악안될 경우) 2-1. autotrace 걸기 : 수행 시, 실제 일량 측정 2-2. SQL Trace 걸기 : 내부 수행 절차상 어느 단계에서 부하 일으키는지 눈으로 확인 (문제점 파악 후) query 수정 or optimizor hint 사용 상황 / 궁금증 20180104 오픈API 개발 프로젝트에서 결과 데이터 응답 조회시 사용하는 query 수정(응답데이터의 전체 데이터수 정보를 포함해서 응답) query 속도를 높이기 위해 join 구문에 pk_index 를 타도록 수정. [궁금] A.정말로 어떻게 빨라지는지 궁금해 -> query execution plan 결과 분석 [궁금] B.왜 index를 타면 query 속도가 빨라질까? -> index와 join에 대해서 찾아보기 [궁금] C.SQL Tuning 다른 방법은 뭐가 있지? (DB를 수정하는 권한이 없으므로, Query수정이 가장 현실적인 방법임) -> SQL tuning을 왜 하는지, 어떤 방법을 쓰는지 찾아보자 A.SQL excute plan [궁금] excution plan은 무엇인가? Oracle 9.2이후부터 사용된 dbms_xplan package를 사용함.(explain_plan보다 더 많은 정보를 담고 있다고 함) 실행방법 : 이미 DBA가 setting을 해놓았음. EXPLAIN PLAN SET STATEMENT_ID='SQL1' FOR 쿼리 로 실행함. 실행결과 : SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','SQL1','ALL')); 로 확인. 'ALL'대신 여러 다른 옵션을 줄 수 있음. 결과확인 : [궁금] 하... 결과 어떻게 확인하는지 모르겠어. 각각 항목의 의미가 뭐지??? pk_index 사용하는 것과 아닌 쿼리의 차이는 보임. cost 가 다르고, fullscan 과 index Scan의 차이 index를 타지 않음 Id Operation Name Rows Bytes Cost (%CPU) Time 0 SELECT STATEMENT 40 82320 12 (9) 00:00:01 * 1 VIEW 40 82320 12 (9) 00:00:01 * 2 COUNT STOPKEY 3 VIEW 41 83845 12 (9) 00:00:01 4 WINDOW SORT 41 9143 12 (9) 00:00:01 * 5 FILTER * 6 HASH JOIN 41 9143 12 (9) 00:00:01 7 TABLE ACCESS FULL TABLE_A 33 6798 3 (0) 00:00:01 8 TABLE ACCESS BY INDEX ROWID TABLE_B 71 1207 8 (0) 00:00:01 * 9 INDEX SKIP SCAN PK_B(index) 1 7 (0) 00:00:01 index를 탐 Id Operation Name Rows Bytes Cost (%CPU) Time 0 SELECT STATEMENT 17 34986 6 (17) 00:00:01 * 1 VIEW 17 34986 6 (17) 00:00:01 * 2 COUNT STOPKEY 3 VIEW 17 34765 6 (17) 00:00:01 4 WINDOW SORT 17 3791 6 (17) 00:00:01 * 5 FILTER * 6 HASH JOIN 17 3791 6 (17) 00:00:01 7 TABLE ACCESS BY INDEX ROWID TABLE_A 5 1030 2 (0) 00:00:01 * 8 INDEX RANGE SCAN PK_A(index) 5 1 (0) 00:00:01 9 TABLE ACCESS BY INDEX ROWID TABLE_B 16 272 3 (0) 00:00:01 * 10 INDEX RANGE SCAN PK_B(index) 11 2 (0) 00:00:01 B. index와 join의 상관관계 C. SQL Tuning "},"Design_Pattern/Ioc.html":{"url":"Design_Pattern/Ioc.html","title":"IoC - 제어역전","keywords":"","body":"Keyword ioc design pattern Reference 제어의 역전 IoC Inversion of Control 이란 무엇인가? InversionOfControl by Martin Fowler 정리 "},"Devenv/bash.html":{"url":"Devenv/bash.html","title":"Bash","keywords":"","body":"Keyword Reference summary 정리 Basic lesstif - bash shell kldp wiki - 고급 Bash 스크립팅 가이드 mug896 gitbook - bash-shell python bash etc 띄어쓰기 space -> backslash e.g. Program Files -> Program \\Files 해야 인식됨. 아니면 띄어쓰기가 command 종료로 인식됨 A non-quoted backslash () is the escape character. It preserves the literal value of the next character that follows, with the exception of . "},"Devenv/cloud9.html":{"url":"Devenv/cloud9.html","title":"cloud9","keywords":"","body":"Keyword Development Enviorement linux Refernce Ubuntu forum - Korean input is not working sublimetext - install in Linux 상황/ 궁금증 ipad + bluetooth_keyboard 로 cloud9 사용해서 작업 jupyter notebook을 구동할때 token을 사용하기 때문에 terminal 에 뜬 token을 복사해야하는데, ipad 환경에서는 terminal 에서 커서이동 안되어 복사가 안됨 -> ipad 에서 시작을 할 수 없음. 우회하는 방법을 자체 terminal에서 한글지원이 안됨. - terminal에서 vim을 사용할 수가 없다. [궁금] linux에서 한글 사용할 수 있게 설치하는 방법은? -> ibus-hangle 설치, 한글 setting 시도 중 [궁금] 다른 IDE or texteditor 쓸 수 있는 방법은? -> sublimetext install 시도 중 "},"Devenv/crontab.html":{"url":"Devenv/crontab.html","title":"crontab.md","keywords":"","body":"Keyword cygwin cron crontab Reference 상황/ 궁금증 정리 Basic 서버에서 자동 실행을 가능케 해주는 crontab(크론탭) 설정 방법 되도록 crontab -e 를 사용해 등록 리눅스 작업 스케줄러 Crontab(크론탭) 적용 및 오류 해결 방법 웹서버 자동 실행 crontab(크론탭) 적용 시 문제점과 해결 방안 lesstif - cron cron 은 보안 이슈때문에 사용자의 쉘 초기화 파일(.bashrc, .bash_profile)을 읽지 않는다. 그러므로 실행할 프로그램이 /usr/bin이나 /bin 같이 일반적인 경로에 있지 않는다면 초기화 파일에 PATH 나 LD_LIBRARY_PATH 등 개인적인 환경변수를 지정했어도 cron 이 실행할 수가 없다. 이런 개인적인 설정이 있다면 해당 내용을 cron 이 실행할 쉘 스크립트에도 똑같이 지정해 주어야 한다. cygwin crontab 사용 cygwin 'cron' plugin 설치 How do you run a crontab in Cygwin on Windows? "},"Devenv/cygwin.html":{"url":"Devenv/cygwin.html","title":"cygwin","keywords":"","body":" Keyword cygwin windows as linux Reference 상황/ 궁금증 command key 를 windows용으로 또 익히기 귀찮아서 linux 환경처럼 사용할 수 있는 cygwin설치 git SSH 사용해서 local pc와 server 연결해놓을 경우, 가상path 문제(로 짐작됨) 때문에 push가 안됨 [삽질중] SSH 제대로 읽어오기 위해 cygwin 기본 path windows와 같게 설정해보기 같게 설정하면 한글이 와장창 다 깨진다 인터넷에 나와있는 설정들은 왜 다 다르게 설명하지... 뭐가 맞는 건지 몰라서 이것저것 설정하다가 설정이 엉망이 되어서 밀어버림 정리 Installation 첫 install 후에도 setup~.exe (windows version에 따라 파일명 다름) 사용해 추가 plugin, package 설치 download 에러시에도 재시동해서 사용. pending tab에서 error난 package 들이 보임. retry시에도 package download때문에 에러가 날 경우, 다른 mirror 에서 시도. 환경변수 setting The CYGWIN environment variable ssh 사용 (cygwin 관리자모드로 실행해야함) ssh config under cygwin Oracle - Installing Cygwin and Starting the SSH Daemon install_cygwin_sshd.txt 주요 설치 plugin : gcc,g+, wget, patch, ruby,ruby-devel,rubygem, openssh, cron, vim, nano, tar, unzip 설정파일 변경시, terminal종료 후 재시작(Run as Administrator) / 재부팅해야하는 경우도 있음! package 설치시에 ~-devel 이 있음. 다른 package 관리하면서 compile해야할 경우가 많기때문에, 해당 package를 설치했더라도 오류가 나는 경우, devel package 핑요여부를 한번 더 체크해주는게 나음 stackoverflow - what-are-devel-packages Gem setting gem (RubyGem, 루비 표준화 패키징 및 설치 프레임워크 / Ruby Application 또는 lib 설치, packaging 관리) 사용하기 위한 setting ruby와 RVM 설치하여 gem 사용. what-is-a-gem rubygems-basics - installing-gems setting-up-rvm-with-cygwin rvm-fails-to-install-rubies rvm autolibs disable gem-install-failed-to-build-gem-native-extension-cant-find-header-files : ruby-devel 설치 open-ssl setting 확인 log 확인 후 googling 으로 고침 - 필요한 package가 제대로 설치되어 있지 않아 발생하는 문제가 많음 Error installing charlock_holmes v0.7.5 ``` $ gem install gollum Building native extensions. This could take a while... ERROR: Error installing gollum: ERROR: Failed to build gem native extension. current directory: /cygdrive/c/Users/ohahohah/cygwin/.rvm/gems/ruby-2.4.1/gems/charlock_holmes-0.7.5/ext/charlock_holmes /cygdrive/c/Users/ohahohah/cygwin/.rvm/rubies/ruby-2.4.1/bin/ruby.exe -r ./siteconf20180205-3616-14j5mhk.rb extconf.rb checking for -licui18n... no which: no brew in (/cygdrive/c/Users/ohahohah/cygwin/.rvm/gems/ruby-2.4.1/bin:/cygdrive/c/Users/ohahohah/cygwin/.rvm/gems/ruby-2.4.1@global/bin:/cygdrive/c/Users/ohahohah/cygwin/.rvm/rubies/ruby-2.4.1/bin:/usr/local/bin:/usr/bin:/cygdrive/c/ProgramData/Oracle/Java/javapath:(중략)) checking for -licui18n... no * icu required (brew install icu4c or apt-get install libicu-dev) * extconf.rb failed Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. (이해 생략) - [Gem install hangs indefinitely](https://stackoverflow.com/questions/15239859/gem-install-hangs-indefinitely) : `gem install -V package_you_install` : -V, --[no-]verbose - Set the verbose level of output [rubygems - command reference](http://guides.rubygems.org/command-reference/#gem-install) #### apt-cyg 설치 (optional) - apt-cyg : `apt-get` 처럼 cygwin에서 설치할 수 있음 - cygwin 공식 installGUI (setupx86_~.exe)로 설치하는게 원칙이나, 검색해서 없는 패키지의 경우에 사용함. - [apt-cyg github](https://github.com/transcode-open/apt-cyg) ### home directory 바꾸기 - [Cygwin Change Home Directory](https://ryanharrison.co.uk/2015/12/01/cygwin-change-home-directory.html) : Use /etc/nsswitch.conf db_home change - `bash: alias: ▒뱒how-control-chars▒▒: not found` 발생 : ls 등 linux commad 를 사용하지 못함. - ls 입력시 \\342\\200\\231ls 로 입력받았다고 메시지 뜸 [weird problem: changing directories with apostrophes in it](https://arstechnica.com/civis/viewtopic.php?f=19&t=170448) 참고해서 \"ls\" 로 실행했더니 실행됨. 하지만 \"ls -a\" 는 실행안됨 - [Cygwin에서 .bash_profile설정](http://egloos.zum.com/uuzazuk9/v/905921) 에서 힌트를 얻음 - cygwin 설정대신 windows 의 .bash_profile 설정을 불러와서 에러 발생 - [진행중]cygwin과 windows 의 .bash_profile 를 동일하게 하면 문제 생길듯하여, ssh 설정을 변경 (~/.ssh 를 불러오게 되어있으므로) - [change-cygwin-home-directory 2011 version](http://codeaweso.me/2011/07/change-cygwin-home-directory/) : Use mkpassword / doesn't work - cannot use ls (only can use unix command) - [How to get the Windows path to Cygwin home directory?](https://stackoverflow.com/questions/42841907/how-to-get-the-windows-path-to-cygwin-home-directory/42842354) : `cygpath -w ~` ### SSH 설정변경 ### Etc - [How do I change the default startup directory in Cygwin?](https://superuser.com/questions/388397/how-do-i-change-the-default-startup-directory-in-cygwin/388409) : Just add `cd /path/to/directory/you/care/about` to the bottom of your ~/.bashrc file(C:\\cygwin\\home\\%USERNAME%\\.bashrc). - [sudo-command-not-found-on-cygwin](https://stackoverflow.com/questions/22527668/sudo-command-not-found-on-cygwin) > Cygwin is not a full Linux distribution. (...) `Run as Administrator.`(...) ### git - [vim not working when calling git commit within cygwin](https://stackoverflow.com/questions/36742345/vim-not-working-when-calling-git-commit-within-cygwin) git commit Vim warning: output is not to a terminal Vim warning: input is not from a terminal ``` cygwin git commit Using vim git config core.editor \"C:\\cygwin64\\bin\\vim.exe\" git config core.editor \"vim\" doesn't work because I use 'Git for windows' not 'cygwin git' how-to-set-default-editor-when-using-git-in-cygwin How do I make Git use the editor of my choice for commits? GIT_EDITOR Git fails to launch Vim in Cygwin Vim Cygwin Vi 설정 vim 에디터 이쁘게 사용하기 - .vimrc 편집을 통해 vim 에디터의 모습을 바꿔봅시다 How to install vim plugin under cygwin? Are cygwin vim commands different than normal vim? : vim shortcut이 제대로 작동하지 않을때 참고. .vimrc 설정에 대한 내용 기술 memo http://zeany.net/29?category=678345 http://webnautes.tistory.com/778 http://mickymoon.tistory.com/3?category=586789c Table of Contents * [Keyword](#keyword) * [Reference](#reference) * [상황/ 궁금증](#상황-궁금증) * [정리](#정리) * [Installation](#installation) * [Gem setting](#gem-setting) * [apt-cyg 설치 (optional)](#apt-cyg-설치-optional) * [home directory 바꾸기](#home-directory-바꾸기) * [SSH 설정변경](#ssh-설정변경) * [Etc](#etc) * [git](#git) * [Vim](#vim) * [memo](#memo) Table of Contents Created by gh-md-toc "},"Devenv/cygwin_ssh.html":{"url":"Devenv/cygwin_ssh.html","title":"cygwin ssh 설정","keywords":"","body":" ssh “permissions are too open” error ssh config 설정 방법 Generating a new SSH key and adding it to the ssh-agent "},"Devenv/etc.html":{"url":"Devenv/etc.html","title":"기타 - 따로 글로 발행하기에 작은 주제들 모음","keywords":"","body":"Keyword Reference 정리 Why Chrome Uses So Much Freaking RAM "},"Devenv/Google_Colaboratory.html":{"url":"Devenv/Google_Colaboratory.html","title":"Google Colaboratory","keywords":"","body":"Keyword colaboratory cloud jupyter Summary Google Colaboratory : 구글 지원 Jupyter server / 구글드라이브처럼 협업이 가능. Reference Google Colaboratory를 아시나요? : 간략소개 궁금 github repository와 연동해서 사용하는 방법 있을까? colab이 저장되는 googledrive 에 github repository를 설치? "},"Devenv/homebrew.html":{"url":"Devenv/homebrew.html","title":"HomeBrew","keywords":"","body":"Keyword homebrew mac package Reference 공식 Homebrew - The missing package manager for macOS 개발자를 위한 맥(Mac) 정보 – 패키지관리자 Homebrew 정리 Starting and Stopping Background Services with Homebrew 에러 [문제] mac High Sierra 업데이트 후, brew link 정상적으로 처리 안됨 Could not symlink sbin/설치한패키지명 /usr/local/sbin is not writable. [해결] https://github.com/Homebrew/homebrew-php/issues/4527 So to solve the problem, simply create the directory with sudo mkdir /usr/local/sbin and then set the correct ownership on it with sudo chown -R `whoami`:admin /usr/local/sbin "},"Devenv/Intellij.html":{"url":"Devenv/Intellij.html","title":"Intellij","keywords":"","body":"Keyword intellij from_eclipse_to_intellij Reference jetbrains - Migrating From Eclipse to IntelliJ IDEA SLiPP wiki - IntelliJ IDEA jojoldu - IntelliJ 디버깅 해보기 상황/ 궁금증 2018/03/06 개인프로젝트, 회사프로젝트 모두 Intellij 로 옮겼다. 아직 완전히 단축키가 손에 익지 않았다. 'key promoto' plugin과 출력한 keymap reference 도움을 많이 받고 있다. 다음 목표는 내장기능에 익숙해지는 것! sequence Diagram 을 자체 기능으로 내장되어있어서 매우 인상깊었음. Intellij가 코딩 다해준다는 우스개소리를 들었었던 적이 있는데 Inspection 과 자동완성 기능을 사용하면 가능할지도 모른다! 두 기능 매우 놀랍다. 2018/01/25 Intellij가 그렇게 좋다는 소문을 들었다. 시퀀스 다이어그램이 자동 생성(기본 플러그인이었음 심지어)되는걸 경험하고, 귀찮아도 학습비용이 높아도 장기적으로 볼때 유용하겠다는 확신이 들어 eclipse에서 옮기기로 결정. 게다가 최근 eclipse 무거워서 쓸 수 없는 지경에 이르렀다. 프로그램을 켜는데도, 저장하는데도 오래걸린다. (coding convention이나 test에 관심이 가서 code quality check tool, UML, PMD 등 여러 plugin을 설치하고 설정을 여러개 해두었더니 메모리를 늘려놔도 견뎌내지 못한다 + 관리하는 프로젝트가 늘었음) 정리 Intellij 에 익숙해지기 방식에 익숙해지기 IntelliJ IDEA 기반 IDE의 Tips & Tricks by Hadi Hariri :+tv: Help(idea 2017.3) - Migrating From Eclipse to IntelliJ IDEA 단축키에 익숙해지기 Intellij menu의 Help -keymap reference / key proto X Plugin 설치 맨 처음 시작할때 기본 설정 File encoding 설정(Global encoding & Project encoding = UTF-8) / 참고 : [IntelliJ] 기본설정(font, theme, encoding, keymap), Plugin설치, Library 추가 방법 코드 창 줄수 보이기 : Settings/Preferences | Editor | General | Appearance | Show line numbers 기본 keymap 외 단축키 windows와 mac keymap 같게 두기 : mac keymap으로 변경했을 경우, meta key를 매핑해줘야함. 키보드에 따라 meta key가 없는 경우, 임의로 window key를 meta key로 매핑하는 방법 Help -> Edit Custom Properties... -> keymap.windows.as.meta=true Choose your Mac keymap under File -> Settings... -> Keymap. For example, \"Mac OS X 10.5+\". 출처 : How to make Windows key the IntelliJ IDEA Command/Meta key under Windows? windows와 mac 동시에 사용할떄 keymap이 다르기때문에 불편해서 찾아봄. Docmentation comment Creating Documentation Comments Create doc comment for class, method : (before the declation) typing /** + enter Creating or fixing doc comment : 'Find Action(ctrl+shift+a)' -> typing 'fix doc comment' code folding Expand cmd + + Expand the current collapsed fragment Collapse cmd + - Collapse the current folding region Expand All shift + cmd + + Collapse All shift +cmd + - Plugin key proto X : 단축키 대신 마우스를 사용하면 해당 기능의 단축키 안내해주는 알림창이 뜸 한영번역 플러그인 by jojoldu : 이름짓기 및 영문설명 작성시에 유용함 Rainbow Brackets : 괄호 색깔을 다르게 표기함. 괄호가 많은 람다쓸때 특히 좋다 error 잡기 Spring project 에서 dispatcher servlet 제대로 인식하지 못함. project 설정을 확인 bug 원인- project setting 제대로 안되어있음 Problem with Error: \"Cannot start process, the working directory does not exist.\" \"Edit Configurations\" 의 \"Working directory\"의 context 때문에 꼬이는 경우가 있음. 내 경우엔, 해당 프로젝트에 /.idea/module 이 없는데도 $MODULE_DIR$로 해당 context를 찾으려고 하기 때문에 에러가 발생함. 방법 1. .idea 하위 폴더에 /modules 라는 빈 폴더 만듦. / 참고 - Error: “Cannot start process, the working directory does not exist.” in IntelliJ 아래 방법2,3을 시도하다가 각각 테스트케이스 실행할때마다 Working directory 를 변경해줘야하는게 불편해서 이 방법을 선택함. [궁금] 프로젝트 전체의 Working directory를 한번에 변경할 수 있다면 방법2 를 쓰고 싶다. 빈 디렉토리만 있다고 되는게 이상함. Working directory 역할이 뭐지? [ ] https://www.jetbrains.com/help/idea/modules.html 이 문서 읽어보기 방법 1. Working directory 칸을 아무것도 없이 지운다 방법 2. Working directory를 %MODULE_WORKING_DIR% 로 변경한다. 미분류 [Intellij] lombok 사용하기 "},"Devenv/openvpn.html":{"url":"Devenv/openvpn.html","title":"OpenVPN","keywords":"","body":"Keyword openvpn Reference openvpn - howto :+1: Mac openVPN 서버 설치 정리 ip 확인 : https://tunnelblick.net/ipinfo Installation & Execution for mac Using brew 설치 후 기본 path: /usr/local/etc/openvpn 사전작업 zsh 를 쓰는 경우, path 가 제대로 잡혀있는지 미리 확인하자 ~/.zshrc 에 export PATH=\"/usr/local/sbin:$PATH\" 추가되어있는지 확인 참고. brew doctor 명령어를 입력하면 예상되는 문제해결 방법을 알려줌 stackoverflow - brew installation for zsh? 위 작업이 안되면 zsh: command not found: openvpn 이런식으로 제대로 실행하기가 어려운 경우가 생김 brew install openvpn 2018/09/18 현재 아래 문제 해결됨 [문제] mac os High Sierra 이상 버전 사용시, brew link 정상적으로 처리 안됨 Could not symlink sbin/설치한패키지명 /usr/local/sbin is not writable. [해결] https://github.com/Homebrew/homebrew-php/issues/4527 So to solve the problem, simply create the directory with sudo mkdir /usr/local/sbin and then set the correct ownership on it with sudo chown -R. `whoami`:admin /usr/local/sbin Install tuntap http://tuntaposx.sourceforge.net/ The TunTap project provides kernel extensions for Mac OS X that allow creation of virtual network interfaces. http://tuntaposx.sourceforge.net Because these are kernel extensions, there is no Homebrew formula for tuntap. From https://gist.github.com/btbytes/2855991 path 등록. Installed openvpn with brew but it doesn't appear to be installed correctly root 권한 설정 sudo cp -vf /usr/local/Cellar/openvpn/다운받은버전번호(like2.2.4)/homebrew.mxcl.openvpn.plist /Library/LaunchDaemons/ sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.openvpn.plist 4-2. root권한 설정해주지 않았을때 실행 sudo 로 실행하면 됨 : sudo openvpn ovpn파일패스/파일명.ovpn 그렇지 않을 경우 아래와 같은 메시지 출력될 수 있음Tue Sep 18 14:07:41 2018 Opening utun (connect(AF_SYS_CONTROL)): Operation not permitted (errno=1) Tue Sep 18 14:07:41 2018 Failed to open utun device. Falling back to /dev/tun device Tue Sep 18 14:07:41 2018 Cannot allocate TUN/TAP dev dynamically 참고. Using OpenVPN from Mac OSX Terminal, cannot load Tun/Tap (optional)service starts at login launchctl 설정 또는 Starting and Stopping Background Services with Homebrew 참고해 brew services 로 실행 launchctl plist 설정을 통한 autoload : how-to-auto-load-mysql-on-startup-on-os-x-yosemite-el-capitan command line 으로 vpn 실행 autoload 실행시 불필요cd /usr/local/etc/openvpn/ sudo /usr/local/opt/openvpn/sbin/openvpn --config /usr/local/etc/openvpn/[설정파일].conf 그 외 에러 vpn사용해서 특정 사이트에 접속할 경우, 브라우저를 바꿔서 확인해보자. 회사 gitlab의 경우 chrome 에서는 정상 접속되나 safari 브라우저에서는 'safari can't connect to ther server'라는 메시지를 출력함. 이유는 왜일까? ovpn 은 제대로 불러오는데 그 외에 ca ~.crt 등의 다른 설정을 불러오지 못할 경우 ovpn 파일을 편집해서 crt , key 에 절대경로를 적어줌. 일반적으로 같은 폴더에 있을 경우 자동으로 불러오지만 드물게 이런 경우가 생김 ovpn파일 내의 ca ca.crt 를 ca /실제 파일이 위치한 절대경로/ca.crt 로 변경 다른 vpn 제대로 삭제하지 않고 설치했을 경우 openvpn 홈페이지에서 tar.gz 파일을 직접 다운로드해서 make install 한 후 완전 삭제하지 않고 brew 로 openvpn 설치했을 경우 아래와 같은 메시지가 출력됨 기존 파일에 symlink 되어있기때문에 충돌이 생김. 아래 안내에 따라 brew link 원하는 옵션 openvpn 해주면 됨 Error: The `brew link` step did not complete successfully The formula built, but is not symlinked into /usr/local Could not symlink include/openvpn-msg.h Target /usr/local/include/openvpn-msg.h already exists. You may want to remove it: rm '/usr/local/include/openvpn-msg.h' To force the link and overwrite all conflicting files: brew link --overwrite openvpn To list all files that would be deleted: brew link --overwrite --dry-run openvpn Possible conflicting files are: /usr/local/include/openvpn-msg.h /usr/local/include/openvpn-plugin.h ==> Caveats To have launchd start openvpn now and restart at startup: sudo brew services start openvpn ==> Summary 🍺 /usr/local/Cellar/openvpn/2.4.6: 83 files, 1.4MB /usr/local/Cellar 32s ❯ brew link --overwrite openvpn Linking /usr/local/Cellar/openvpn/2.4.6... 6 symlinks created Using Tunnelblick 'Tunnelblick' is free software for OpenVPN on OS X OpenVPN - To connect to Access Server from a MacOSX client computer Tunnelblick - Document Tunnelblick - If OpenVPN is connected to the server but your IP address does not change 내 경우 .ovpn 수정해도 되지 않아서 If the IP Address Does Not Change에 나와 있는 Tunnelblick 내 option 사용했다 (ver 3.7.4b 기준) 하지만 서버에는 접속되지만 인터넷에 접속되지 않아서 CLI를 이용한 openvpn 연결로 갈아탐. "},"Devenv/powershell.html":{"url":"Devenv/powershell.html","title":"Powershell","keywords":"","body":"Keyword powershell Reference Using Powershell I want to Forcefully Copy Folder/files Without Erasing Extra Files in Existing Destination Folder: MS PowerShell Copy-Item 상황/ 궁금증 [x] 왜 powershell에서는 \"\"붙여야 할까? -> powershell 자체 parsing rule에 의해 command와 expression을 구분함. When to Quote in PowerShell : PowerShell’s help page - About_Quoting_Rules 정리 Overwirte copy directory Copy-Item -Force -Recurse ?Verbose $releaseDirectory -Destination $sitePath windows powershell 에서 vim 사용하기 "},"Devenv/vim.html":{"url":"Devenv/vim.html","title":"Vim","keywords":"","body":"KeyWord vim Reference Vim 편집기 한글화- 도움말 SLiPP 위키 - vim 연습 simple_vim_guide by johngrib blog.outsider - 자주 쓰이는 vim 단축키 놀부블로그 - vim에서 한글입출력 kldp- vim 한글 세팅 kldp- vim 파일인코딩 변경하기 상황/ 궁금증 정리 TIL - vim 단축키 - 내가 자주쓰는 vim 한글세팅 fence설정 : ~/.vimrc에 :set fencs=ucs-bom,utf-8,cp949 ~/.mswin.vm 에 추가set tabstop=4 set encoding=cp949 set fileencodings=utf-8,cp949 set langmenu=cp949 set guifont=Gulimche:h12:cHANGEUL set lines=60 columns=120 vim 파일인코딩 변경 :set fileencoding : 현재 file encoding 확인 :w ++enc=utf-8 (해당 파일 utf-8로 바꾸어 저장 / 확인 후 안될 경우, 하단 참고) :e ++enc=utf-8(임시로 fence 옵션 덮어써 문자인코딩 utf-8로 바꾸어 보여줌) :set fileencoding=utf-8 (fileencoding 변경) Plugin [vim-markdown-preview] "},"Devenv/vim_shortcut.html":{"url":"Devenv/vim_shortcut.html","title":"Vim 단축키 정리","keywords":"","body":"Vim shortcut 편집 esc + v : visual mode - 블록지정할때 사용 y : yank 해당 블록 복사 x : yank 해당 블록 잘라내기 p : 붙여넣기 Insert Mode 커서 단위 : i (현재 커서) / a (현재 커서 다음칸) 줄 단위 : I (현재 줄 맨 앞) / A (현재 줄 맨 뒤) 문서단위: O (맨 윗줄) / o (맨 아랫줄) 이동 단어 단위: w (단어 첫글자) / b (단어 첫글자) 되돌리기 u (undo the last modification) : How to go back (ctrl+z) in vi/vim Ctrl+R: redo it "},"Django/tdd_with_Django.html":{"url":"Django/tdd_with_Django.html","title":"tdd_with_Django","keywords":"","body":"개요 참고 인터넷 obeythetestinggoat 최신판(2판) - ebook 번역서 - 파이썬을 이용한 테스트주도개발(1판) lhy blog - 최신판과 번역서 차이 비교 Django 2.1 공식문서(한글) Django에 대해 학습한 것과 TDD 에 대해 학습한 것을 나누어서 적는다. 사전 준비 번역판 대신 인터넷 최신판에 있는 설정을 따름 https://www.obeythetestinggoat.com/book/pre-requisite-installations.html 최신판과 번역판의 명령어들이 조금씩 다를 수 있다. 떄로는 결과메시지도 다름. 책대로 설정된 virtualenv 가 활성화되어있는지 확인하고 작업할 것 여기서는 최신판과 다르게 python3.6, django(최신판), selenium 여기와 같이 django와 python 버전이 안맞는 문제가 있었기 때문이다> python3.6 -m venv virtualenv pip install \"django\" \"selenium $ source virtualenv/bin/activate # virtualenv 활성화 (virtualenv)$ (virtualenv)$ which python # 어떤 python 사용하고 있는지 확인 /home/myusername/python-tdd-book/virtualenv/bin/python (virtualenv)$ deactivate # virtualenv 비활성화 $ $ which python /usr/bin/python ch01 conda 환경에서 selenum install : https://anaconda.org/conda-forge/selenium selenium 실행 에러 - 마지막 줄- geckodriver 없음 : https://stackoverflow.com/questions/40208051/selenium-using-python-geckodriver-executable-needs-to-be-in-path ``` python3 functionaltest.py Traceback (most recent call last): File \"/Users/syo/anaconda3/lib/python3.6/site-packages/selenium/webdriver/common/service.py\", line 76, in start stdin=PIPE) File \"/Users/syo/anaconda3/lib/python3.6/subprocess.py\", line 709, in _init restore_signals, start_new_session) File \"/Users/syo/anaconda3/lib/python3.6/subprocess.py\", line 1344, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver': 'geckodriver' During handling of the above exception, another exception occurred: Traceback (most recent call last): File \"functionaltest.py\", line 4, in browser = webdriver.Firefox() File \"/Users/syo/anaconda3/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py\", line 164, in _init self.service.start() File \"/Users/syo/anaconda3/lib/python3.6/site-packages/selenium/webdriver/common/service.py\", line 83, in start os.path.basename(self.path), self.start_error_message) selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. - 1장 에러 메시지 - 'Unable to Connect'가 맞음 - selenium.common.exceptions.WebDriverException: Message: Reached error page: abo ut:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/[...] ### Django 구조 - [ ] `django-admin startproject superlists .` 과 `django-admin startproject superlists` 차이 : manage.py 의 위치가 다름. manage 범위가 다른 걸까? ```bash > `django-admin.py startproject superlists .` > tree ../../django/testinggoat/superlists ../../django/testinggoat/superlists ├── manage.py ├── functional_tests.py ├── geckodriver.log └── superlists ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py └── virtualenv ├── [...] superlist/superlist 폴더가 사이트 전역에 걸쳐서 적용됨 settings.py 가 사이트 전역에 걸쳐서 적용됨 manage.py : 맥가이버칼. 개발 서버를 가동시키는 역할도 함 python3 manage.py runserver "},"Docker/Inbox.html":{"url":"Docker/Inbox.html","title":"Inbox","keywords":"","body":"Keyword docker Reference subicura blog - 초보를 위한 도커 안내서 - 도커란 무엇인가? popit - 개발자가 처음 Docker 접할때 오는 멘붕 몇가지 Minimum hardware requirement to run Docker docker - Get started raccoony Blog - Docker (Compose) 활용법 - 개발 환경 구성하기 Docker 한글 문서 / 영상 모음집 pyrasis - 가장 빨리 만나는 도커(Docker) 정리 What is Hiper-V docker for windows 사용하기 위해서는 Windows의 Hiper-V 를 사용해야함. wikipedia - Hyper-V Error install image $ docker run hello-world Unable to find image 'hello-world:latest' locally C:\\Program Files\\Docker\\Docker\\Resources\\bin\\docker.exe: Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: unauthorized: incorrect username or password. See 'C:\\Program Files\\Docker\\Docker\\Resources\\bin\\docker.exe run --help'. 구글링하니 login 먼저 실행해야한다고 함. 내 경우에 이미 로그인 상태라서 해당되지 않음. 로그아웃 후, cygwin을 'Run as Admistration' 함(sudo와 같음) 정상 작동 [궁금] 부팅시, 아래 메시지 뜨는 것과 연관이 있나? Error Docker hv-sock proxy (vsudd) is not reachable - win 10 pro crash on start 내 경우, 종료하고 관리자권한으로 실행함. 권한문제 또는 윈도우즈 업그레이드 패치 문제 일 경우가 많음.Docker hv-sock proxy (vsudd) is not reachable 위치: Docker.Backend.ContainerEngine.Linux.ConnectToVsud(TaskCompletionSource`1 vmId) 파일 C:\\gopath\\src\\github.com\\docker\\pinata\\win\\src\\Docker.Backend\\ContainerEngine\\Linux.cs:줄 293 위치: Docker.Backend.ContainerEngine.Linux.DoStart(Settings settings, String daemonOptions) 파일 C:\\gopath\\src\\github.com\\docker\\pinata\\win\\src\\Docker.Backend\\ContainerEngine\\Linux.cs:줄 260 위치: Docker.Backend.ContainerEngine.Linux.Start(Settings settings, String daemonOptions) 파일 C:\\gopath\\src\\github.com\\docker\\pinata\\win\\src\\Docker.Backend\\ContainerEngine\\Linux.cs:줄 130 위치: Docker.Core.Pipe.NamedPipeServer.<>c__DisplayClass9_0.b__0(Object[] parameters) 파일 C:\\gopath\\src\\github.com\\docker\\pinata\\win\\src\\Docker.Core\\pipe\\NamedPipeServer.cs:줄 47 위치: Docker.Core.Pipe.NamedPipeServer.RunAction(String action, Object[] parameters) 파일 C:\\gopath\\src\\github.com\\docker\\pinata\\win\\src\\Docker.Core\\pipe\\NamedPipeServer.cs:줄 145 이 메시지 후 docker version실행하면 제대로 구동되지 않은 걸 확인할 수 있음. ``` $ docker version Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:05:22 2017 OS/Arch: windows/amd64 error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.35/version: o pen //./pipe/docker_engine: The system cannot find the file specified. In the de fault daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running. ``` "},"Docker/tutorial.html":{"url":"Docker/tutorial.html","title":"Docker 시작하기","keywords":"","body":"Keyword docker 상황 20180906 회사에서 윈도우즈 노트북을 사용하고 있는데, 개발은 맥북에서 작업할 예정이라 이중으로 서버환경을 구축하는 것보다 편할 것 같아서 도커를 사용해서 환경을 구축해보려고함 아직 docker에 대해서 알아가는 중이라 이중으로 설정하는 품보다 docker가 편할지, docker에서 개발하는게 나을지 확인해보아야함 나중에 개발자에게 프로젝트 인수인계 해줄때 해당 환경을 전달하는게 더 낫지 않을까 하는 생각도 있음 Reference subicura blog - 초보를 위한 도커 안내서 - 도커란 무엇인가? popit - 개발자가 처음 Docker 접할때 오는 멘붕 몇가지 Minimum hardware requirement to run Docker docker - Get started raccoony Blog - Docker (Compose) 활용법 - 개발 환경 구성하기 Docker 한글 문서 / 영상 모음집 pyrasis - 가장 빨리 만나는 도커(Docker) 정리 설치 전, 설치할 개발 환경 spec을 조사 해당 서버 환경 정보를 요청하고, 이번에 만든 사내 wiki에 업데이트함. 이번 프로젝트는 DB서버와 솔루션 설치 서버, 데이터 분석 서버 등 여러 서버에서 분리되어 있음 [ ] Docker환경에서도 다른 서버와 연동이 되는지 확인 [ ] 형상관리(svn) 어떻게 하지? [ ] ant로 deploy 하는데 가능한가? 설치 [ ] 외부 시스템 환경 cent os 6.10 / java 8 / tomcat 8.5 0) docker 설치 docker for mac 1) cent os cent os 설치 기본 설치 리눅스 디렉토리 구조 2) JDK 설치 "},"ElasticStack/logstash.html":{"url":"ElasticStack/logstash.html","title":"Logstash","keywords":"elastic stack logstash","body":"들어가기 전에 Elastic - Logstash에 대한 실용적인 소개 : Logstash가 뭔지 어디에 쓰이는지 빠르게 감잡고 싶다면 먼저 읽어보세욥 Log 를 이해하고 Logstash 사용하자 Logstash를 사용할때 왜 log를 이해하는 것이 필요할까? Logstash 의 collection(수집)과 centeral aggregation(집중식 취합) 의 강점을 활용하기 위해서 log 의 특성을 파악해야 로그 메시지 구조에 따라 어떤 데이터를 남겨서(filtering) 다음 분석도구(예. Elastic Search)에 넘길 것인지, 포맷 정규화는 어떻게 할 것인지 등 logstash의 plugin을 적절하게 사용할 수 있음 무엇을 logging 할지 제대로 정의되지 않아서 이상한 loggin만 했다면, 아무리 log를 많이 수집해도 원하는 분석을 실행할 수 없음. 단, Logstash는 단순히 log만 다루는 것이 아님. Elastic에서는 Logstash를 DataFlow Engine이라고 정의하며, log를 넘어서 Data를 수집,변환,적재하는 확장된 목적으로 사용이 가능. log 란? log message 는 컴퓨터 시스템, 장치, 소프트웨어 등에서 발생하는 특정한 sitimulation에 대응해 발생함 Informational 정보 / Debug / Warning / Error / Alert 다섯 가지 분류로 나눌 수 있음 log message 형태: Timestamp(로그 시간) + data(정보) 로 구성되어 있음 logging의 중요 단계는 아래와 같음 질의와 계획(무엇을 언제 logging할 것인가?) → 로그 메시지 생성(log 만들기) → 로그 메시지 필터링과 정규화(low,medium,high) → 로그 메시지 수집 → 로그 분석 → 로그 메시지 장기보관 Log 분석에서 주의해야하는 점은 아래와 같음 → logstash를 통해 해결 No common/consistent format → filtering해서 원하는 형태의 데이터로 만들자 Logs are decentralized → log를 모으자. logstash는 다양한 형태의 input을 모으기 쉬움 No consistent time format → data filter plugin으로 timestamp를 정규화하고, grok로 date를 뽑아냄 Data is unstructured → filtering 사용해 원하는 field를 뽑아내고, json plugin 등을 사용해 구조화함 왜 logstash를 사용할까? log 써먹으려고 - 서버 / 애플리케이션 모니터링(에러 리포트,..) 서버에서 바로 log 보면 안될까? grep \"Error\" 처럼 단일 서비스 - 단일 서버 : 응답시간 모니터링, 에러 리포트 등 무엇을 분석할지 정의되어있다면 CLI로 log분석 가능함 하지만 대다수의 서비스는 분석할 로그가 너무 많아서 어떤 걸 봐야할지 불가능한 상황이 발생. '단일 서비스 - 다수 서버' 혹은 '다수 서비스 - 다수 서버' 로 구성되어있기때문 이 말인즉슨, 로그 확인을 위해 여러 서버에 동일 명령을 사용 가능한 ssh 멀티플렉서를 사용한해서 각 개별 호스트에 접속하는 불편함을 줄인다고 하더라도, 호스트들에서 발생하는 수천 줄 로그에서 에러찾기, 에러 찾아도 한 서버가 오동작하는지 시스템 전체 문제인지 판별을 하고 호출 체인타고 들어가서 에러 추적하고 원인 찾기를 해야함 - 이건 아닌거 같습니다 쓰앵님 -> 현대 서비스 환경에서는 로그부터 가능한 한 많은 collection(수집)과 ceteral aggregation(집중식 취합)을 하는게 중요 함. 그럼 이렇게 취합한 많은 로그를 어떻게 써먹을까? 위처럼 직접 분석하는 방법은 매우 쓰기 힘들어보임 -> 로그 파일 포맷을 파싱하고 분석을 위한 추가 서비스(e.g. elastic stack)에 전송할 수 있는 파이프라인이 필요함. logstash 처럼 다양한 데이터 통합하고 정규화해서 필요한 부분의 데이터를 바로 쏙쏙 뽑아내려고(Filtering / streaming) logstash는 log수집뿐만 아니라 다양한 데이터 정리 및 변환이 가능하도록 여러 plugin을 지원. 기존에 보유하고 있었던 로그, DB data 뿐만 아니라 데이터 스트림, Http요청 이벤트 변환, HTTP 엔드포인트 폴링으로 이벤트 생성까지 가능함. 이건 나중에 여러 방향으로 확장이 가능. 예를 들면, Http요청을 이벤트로 변환해서 twitter 정보를 webservice firehoue(a steady stream of all available data from a source in realtime)활용이 가능해짐 -> 실시간 데이터가 중요한 socialTreand 분석이 유용해짐 결론. 그러니까, logstash를 사용해서 여러 형태의 Input을 받아 Filtering을 해서 다른 분석에 활용할 수 있도록 정해진 형식의 output으로 뽑아낼 수 있음, 실시간으로 다른 저장소에 넘기면서 ! 위 이야기를 멋있게 쓰면 아래와 같음. (elastic 공식 소개), 가이드라인) Logstash는 실시간 파이프라인 기능을 가진 오픈소스 데이터 수집 엔진(DataFlow Engine)입니다. Logstash는 서로 다른 소스의 데이터를 탄력적으로 통합하고 사용자가 선택한 목적지로 데이터를 정규화할 수 있습니다. 다양한 고급 다운스트림 분석 및 시각화 활용 사례를 위해 모든 데이터를 정리하고 대중화(democratization)합니다. 포맷이나 스키마에 관계 없이, 모든 데이터를 수집하고 강화 및 통합하기 위한 Elastic Stack의 중앙 데이터 플로우 엔진으로 Logstash의 실시간 데이터 처리는 Elasticsearch, Kibana, Beats와 연동될 때 더욱 강력해집니다. Elastic Webinar - Getting started logstash 데이터 흐름을 위한 오픈소스 중앙처리 엔진 dataflow 파이프라인 구축하여 이벤트 데이터의 변환 및 스트림 설정 다양한 데이터 자원 접근 원시 버퍼링을 통한 수평적인 스케일링 통합 처리를 위한 탄탄한 플러그인 환경 기본 개념 - 6가지 들어가기 전 서비스에 '어떤 데이터'가 필요한지 정의하고 여기에 따라 '어떤 플러그인'을 선택하여 데이터를 필터링할 것인가? 를 고민하는게 설계의 핵심임 Salesforce Engineering - Our Journey to a Near Perfect Log Pipeline Event : logstash용어. logstash의 기본 데이터 단위(primary unit of data), JSON과 유사하게 dl계층과 type 지원함 (arbitrary hierachies and types supported) (Job)Queue - worker 구조를 이해하자 Pipeline 주의. log data pipeline에서의 pipeline이 아닌 logstash instance에 있는 pipeline을 의미함. 데이터 처리를 위한 logstash 설정으로 하나의 logical data flow를 말함. 하나의 logstash instance에 여러 개의 pipeline이 존재할 수 있음 Input - Queue - Worker로 구성되어있으며, Input plugins,Filter plugins, Output plugins 세 가지 설정을 통해 순차적으로 실행됨 Input을 통해 data를 받고 Queue(kind of bufferd data)를 통해 worker(filer/ output section, scale in-out 단위가 됨)로 넘김. Pipeline Can Scale Conditionals & multiple pipeline + Secure transport with authentication & wire encryption Stitching Together Multiple Input and Output Plugins Multiple Input & Multiple Worker 하나의 process에서 작동하는 One Logstash, Many Pipeline Plugin 각 단계(Input, Filter, Output)는 여러 플러그인 조합으로 구성하며, Input -> Filter -> Output이 순차적으로 실행됨. 예를 들어, Input은 File Plugin으로, Filter는 JSON plugin 그리고 Output에는 ElasticSearch plugin으로 구성한다면, 파일로부터 데이터를 가져와서 ElasticSearch에 저장가능한 JSON형태로 변환한 후 ElasticSearch로 Indexing하게 됨. 각 단계를 조합하는 Plugin의 사용법은 비슷비슷해서 사용법의 학습비용은 크지 않음. 원하는 plugin도 만들어서 사용할 수 있음. 참고: Elastic - how to write a logstash output plugin Input 데이터가 유입되는 근원지. Input Plugins을 사용해 특정 소스의 이벤트(데이터)를 가져옴. logs & Files, Metrics, Wire Data, Web Apps, Data Stores, Data Streams 등의 수집을 지원함. Elastic Reference - input-plugins을 보면 많은 종류의 Input을 가져올 수 있도록 지원함. 사용법은 거의 비슷함. Beats와 결합해서 쓰는 것도 가능함 Filter log parsing, stricture, transform, 데이터 확장, 태그 추가 등 의 데이터 변형 작업을 함. Filtering 과정은 필수가 아님. 자주 쓰이는 Filter plugin 5가지는 아래와 같음 gork 문자열 데이터에서 필요한 데이터를 뽑아내려면 정규표현식으로 원하는 내용만 뽑아내야함. grok은 자주 쓰이는 정규표현식 패턴이 사전정의되어있어 패턴을 골라서 사용하면 됨. logstash-patterns-core를 보면 aws, maven, redis 등등의 로그 패턴을 볼 수 있음. mutate 데이터 필드 단위로 변형할 수 있음. 예를 들면, 필드를 변경하고 합치고(join), 이름을 변경할 수 있음. elastic search 에서 indexing된 data를 변경하는 것은 상대적으로 어려움. indexing 전에 필드를 변경해서 넘기는 것이 속도도 빠르고, 불필요한 indexing을 줄이면서 elasticsearch에 전송하는 데이터양도 줄일 수 있음. date : String을 Data타입으로 변환함. 날짜를 string타입으로 Elastic Search에서 indexing하면 Query나 Aggreagtion할때 문제가 발생할 수 있기 때문임. json : input의 JSON 데이터 구조를 유지 kv : 위 JSON처럼 Key-value 형태로 구문분석 유지 Elastic - filter plugins Output 데이터를 전송할 목적지. 가공된 데이터를 '어딘가의 저장소'에 적재함. Elastic Search, RDBMS 처럼 '어딘가'에 저장할 것인지는 Output plugin으로 결정됨. Elastic Reference - output-plugins Codec plugin 데이터 인코딩 & 디코딩. 메세지(들어오는 데이터)를 쉽게 구분하고 전송할 수 있도록 하는 input단계에서는 Deserialization, output 단계에서는 Serialization 위해 사용되는 stream filter. 많이 쓰이는 것으로는 json, msgpack, plain (text), multiline(여러 줄로 이루어진 로그를 하나의 메시지로 다룸) Elastic Reference - codec-plugins Execution Model pipeline은 Input(with codec) → Filter → Output(with codec) 세 단계의 plugin작업을 실행하며 순차적으로 동작함. Fliter작업은 Work Queue 에서 이루어지므로 Worker 를 늘려주면 빠르게 작업할 수 있음. → logstash Tunning 시에 중요포인트가 됨 기본적으로 Logstash 에 Data 를 집어넣을때 Batch형태로 넣으면서(Bulk API를 사용) Batcher가 Fliter에 보내는 형태로 작동함 Queuing and Delivery Guarantees In Memory Queue(default) 매우 빠름 모든 데이터를 메모리에 저장함 영속성 없음(Not durable) 비정상적인 종료(unclean shutdown)이 일어날 경우 Queue로 전송되던 data(in-flight data)를 잃을 수 있음 Persistent Queue (PQ) 빠름 worker에 전달할때까지 받은 데이터를 저장함(Stores received data on disk until delivered) 영속성 (durable) : 비정상적인 종료(event of unclean shutdown)시에도 데이터를 잃지 않음 At Least Once Delivery 모든 메시지는 딱 한번만 전송됨(delivered). 거의 모든 플러그인이 지원함 (지원되지 않는 플러그인도 있음) 멱등(Idempotent, 연산을 여러 번 하더라도 결과가 달라지지 않음) operation PQ(Persistent Queue)에서 비정상적인 종료가 되어서 Worker section(filter + output)에서 중복 메시지를 보내더라도 딱 한번만 연산됨 어떻게? Elastic blog - Little Logstash Lessons: Handling Duplicates Dead Letter Queue Logstash Lines: Grok debugger, Dead letter queuesIngest Data Immediate Insights with Modules (30:40) Data Transformation Serialized with Codec (37:48) Logstash Administration (47:00) Monitoring Monitoring UI Pipeline Viewer Monitoring API Pipeline Management Deploying and Scaling Logstash 그리고... 파이프라인 구성 : 복잡한 코딩 배제하고 먼저 ,파이프라인 구성 후에 첫 이벤트 빨리 구축 -> 주기적으로 수평적인 확장 Elastic - Logstash performance-troubleshooting Elastic - Tuning and Profiling Logstash PerformanceData resiliency Dead letter queue with ElasticSearch 활용 logstash monitoring logstash가 제대로 구동되고 있는지 상태를 모니터링하는게 중요함. cluster monitoring을 통해 logstash 상태를 실시간 조회하고 과거 성능 분석에 활용할 수 있음. 제공하는 API를 사용하거나, X-pack 을 통해 kibana에서 모니터링 가능함. 제공하는 정보는 아래와 같음. Logstash node info, like pipeline settings, OS info, and JVM info. Plugin info, including a list of installed plugins. Node stats, like JVM stats, process stats, event-related stats, and pipeline runtime stats. Hot threads. 질문 단일 server에 Elastic Search와 logstash 둘 다 동작시켜도 괜찮을까? 어떤 서비스를 하느냐에 따라 달라짐. 두 시스템이 충분히 동작할만한 RAM 용량을 확보해야하며, 모니터링하면서 적절한 파악해야함. logstash는 beats보다 resouce 를 많이 사용하므로 단일 서버에 설치하는 것을 권장함. 참고 : Elastic - Sizing Elasticsearch 참고 : Elastic - elasticsearch-in-production Beats 를 사용해야할까, logstash를 사용해야할까? 차이점은? Beats(참고 - Elastic - beats)는 logstash보다 경량화된 데이터를 수집 agent임. 하지만 입/출력 만 있고 filtering이 없음. apach weblog처럼 널리 쓰이는 로그를 간편하게 수집만 하고 싶다면 logstash보다 가볍게 사용 할 수 있음. 사용자 정의 beat도 libbeat 라이브러리를 사용하여 쉽게 빌드 할 수 있음. 아래 그림처럼 beats에서 수집한 데이터를 logstash로 보내서 필터링한 후에 사용하는 것도 가능함 Elastic Search의 IngestNode(문서 indexing 전 데이터 전처리하는 역할의 node)가 logstash의 역할을 대신해줄 수 있을까? Elastic - Logstash를 사용해야 하나요, Elasticsearch 수집 노드를 사용해야 하나요? IngestNode의 경우 단일 pipeline으로 구성되어 좀 더 간단할 수 있으나, 사용목적에 따라 적절하게 선택하세요 DZone - elasticsearch ingest-node VS logstash performance 비교 Elasticsearch 5.0 이전에는 색인을 생성하기 전에 문서를 사전 처리하려는 경우 Elasticsearch, 그 다음 유일한 방법은 Logstash를 사용하거나 사전 처리하는 것이었음. Elastic 6.X에 들어오면서 IngestNode가 추가됨 Elastic - New Way To Ingest UseCase - 실제 필드에서는 어떻게 사용되고 있나? kor webinar 40:36 Referece 인용은 본문에 링크 달아두었음 Elastic guide - logstash(Eng) - 2019.02.13 현재, 한글로 번역된 최신 가이드 버전은 5.4임 Elastic Webinar - Getting started logstas(Kor) Elastic Webinar - Getting started logstash discuss.elastic - logstash : elastic의 discussion 페이지 책 - Learning Elastic Stack 6.0 5 Logstash Filter Plugins You Need to Know About A Beginner’s Guide to Logstash Grok 기타 개념 책 - 실전 LOG 분석과 체계적인 관리 가이드 - log [책 - 마이크로서비스 아키텍처 구축: 대용량 시스템의 효율적인 분산 설계 기법 - 8장 모니터링] 책 - (웹 개발자를 위한) 대규모 서비스를 지탱하는 기술 - Job- Queue What is a Data Firehose API? "},"Git_Github_Gitlab/Error.html":{"url":"Git_Github_Gitlab/Error.html","title":"Error","keywords":"","body":"Keyword Reference stackoverflow - Github “Updates were rejected because the remote contains work that you do not have” 상황 / 궁금 [문제][해결] git 에서 https repository 연결시 SSL 인증서 오류 해결법 [문제]github에서 remote로 push할때 에러 발생 git rebase inactive error https://stackoverflow.com/questions/29902967/rebase-in-progress-can-not-commit-how-to-proceed-or-stop-abort ``` PS C:\\Users\\Daumsoft-N144\\Documents\\TIL> git push fatal: You are not currently on a branch. To push the history leading to the current (detached HEAD) state now, use git push origin HEAD: PS C:\\Users\\Daumsoft-N144\\Documents\\TIL> git status interactive rebase in progress; onto 26cbcd6 Last commands done (6 commands done): pick 15788bb Update 깨달은 점 edit 54dfa87 Update interesting content (see more in file .git/rebase-merge/done) Next commands to do (12 remaining commands): pick 07cafc9 Add booklist to read pick 2f5d687 Update 회사프로젝트에서 배운 점 (use \"git rebase --edit-todo\" to view and edit) You are currently editing a commit while rebasing branch 'master' on '26cbcd6'. (use \"git commit --amend\" to amend the current commit) (use \"git rebase --continue\" once you are satisfied with your changes) nothing to commit, working tree clean ``` "},"Git_Github_Gitlab/etc.html":{"url":"Git_Github_Gitlab/etc.html","title":"기타","keywords":"","body":"Keyword gitignore Reference gitignore - Create gitignore file Github Help- Ignoring files 상황 / 궁금 정리 gitignore repository에서 불필요한 파일,폴더 무시 : .gitignore (local) or .gitignore_global(global) / Github Help- Ignoring files gitignore 에서 제외할 환경검색. gitignore.io - command line 사용하면 편리함. 최상위디렉토리에서 .gitignore 생성 (echo 또는 touch(windows경우) 로 파일 생성) GitLab API 사용 https://docs.gitlab.com/ee/api/ GitLab API 회사 gitlab website 상에서 issue label 생성만 되고 편집, 삭제가 되지 않음. API 를 사용해 편집, 삭제 하려고 했으나 회사 server에서는 GET 만 허용하므로 조회만 가능 curl 사용시 -v 옵션 추가하여 상세 상태 알 수 있음. 회사 gitlab API 실행 결과 (...) 현재 Gitlab에 따라 사용할 수 있는 API version이 다름 / 현재 회사 Gitlab API v3 API 사용시, 사용자의 private token 과 project id 사용함. Profile - Account settings - Private token 확인가능: personal-access-tokens project id 조회 : curl -XGET --header \"PRIVATE-TOKEN: XXXX\" \"https://gitlab.com/api/v3/projects/owned\" gitlab url에 따라 위 url은 수정해주어야함 where do I find the project id for the gitlab api? closing github issue 처음 github 협업을 할때 놓치기 쉬운 것 시리즈 PR merge할때, 연관된 issue를 close 안하고 merge한 branch를 지우지 않았더니 나중에 해당 작업이 완료되었는데도 여러 branch와 관련 issue들이 close 되지 않았음. PR할때 issue, PR, Branch이 세 가지를 자연스럽게 연결하기 위해 주의해야하는 부분을 정리해본다 ] 그림 1. Github 실제 PR화면 개인 프로젝트를 진행할때의 기본 프로세스를 소개한다. issue 등록 작업할 브랜치를 생성 - issue id 를 prefix로 붙임. 작업이 완료되면 PR을 날린다. 해당 작업시에 특히 신경쓰는 부분은 아래와 같다 PR title 나중에 검색이 쉽도록 협의를 통해 특정 양식을 정한다 예. issue넘버_간략주제 tag 해당 PR의 성격에 따라 tag 를 지정한다 나중에 검색 등 관리에 유용하게 쓰이니 꼭 쓰는 습관을 들이도록 하자 assignee 해당 PR의 작업자를 지정 큰 오픈소스의 경우 이 부분을 지정하지 않는 경우가 있음 Reviewer 팀 작업의 경우, 리뷰를 완료 후 반영해야하는 상황이 생긴다. reviewer를 지정하면, github에서 해당 리뷰어에게 메일로 리뷰요청에 대한 noti가 간다 설정에서 메일 안내를 꺼두었을 경우도 있어서 slack 등 다른 협업채널로도 noti가 가도록 설정해두기도 함 review하기 / review 내용 확인 리뷰를 받고 피드백에 맞추어 작업내용을 수정한다 review하는 방법에 대해서는 다른 post에 기술할 예정 Merge / reject Delete Brach issue에 comment 남기기 / closing issue PR 을 등록할때는 description 또는 PR title에 관련 issue 적기 github issue에 등록해두었을 경우, #issue번호 를 등록하면 자동으로 해당 issue에 관련된 PR이 참조된다. 위 그림의 issue Merge 후 delete branch github에서는 delete branch 버튼이 생긴다. 더 이상 작업하지 않을 branch는 이 버튼을 사용해 삭제하자. PR은 기본적으로 branch단위로 작업된다. 해당 PR의 작업이 merge(또는 reject되서 완료)되었을 경우, branch를 지우고 다른 작업은 새롭게 branch를 생성해서 작업한다. 하지만 프로젝트마다 적용방법이 다르므로 프로젝트에서 정한 규칙을 따르자. 처음 PR을 할때 많이 하는 실수가 해당 branch가 merge되지 않았는데 이 branch에 다른 작업을 진행하는 것이다. 새롭게 작업한 commit이 해당 PR에 반영되어버린다. PR이 반영된 후에는 PR을 날렸던 branch에 작업하더라도 새로운 작업으로 인식해 새로운 PR로 반영된다. 다시 한번 강조하지만 PR은 기본적으로 bracn 단위 작업이다. 절대 PR을 날리는게 작업의 완료가 아니다. 해당 PR이 merge 혹은 reject 되고, issue 혹은 관리하는 ticket에 관련 내용을 반영하는 것(close issue 또는 해당 PR내용을 comment)까지가 해당 작업의 완료이다. 이것 역시 프로젝트마다 운영정책이 다르므로 정확한 구현은 프로젝트의 운영정책을 참고해야한다. revert를 사용해서 해당 branch는 되살릴 수 있으므로 잘못 눌렀다고 너무 놀라지 말자 "},"Git_Github_Gitlab/git_command.html":{"url":"Git_Github_Gitlab/git_command.html","title":"Git command","keywords":"git command git","body":" Reference 상황 / 궁금 정리 Branch commit Staging Area ( git index) Diff log git Statsh : branch 변경할때 commit 하지 않고 다시 돌아와서 작업하기 Removing sensitive data from a repository 민감한 데이터 제거하기 1. 작업 전 처리해야할 것 2-1. Using the BFG : 설치 필요하지만 간단함 2-2. git-filter-branch 사용해 파일 삭제 : Git 내장 command 사용 command 역할 Reference [GIT] 병합하고 Commit 재정렬하기: cherry-pick, rebase, merge Removing sensitive data from a repository / 이전 버전 문서 비공식번역본 - GitHub / Advanced Git / 민감한 데이터 제거하기 git- docs : git --version으로 사용하고 있는 version에 맞는 doc 확인 pro Git book / pro Git book(한국어) [git]작업의 취소 - by 에코지오 상황 / 궁금 정리 Branch git brach : 어떤 branch 있는지 확인, 현재 brach는 앞에 * 붙음. git branch 생성할 브랜치명 (브랜치 생성) git checkout 이동할 브랜치명 : 해당 브랜치로 이동 git checkout -b 생성하고_이동할_브랜치명 : 브랜치 생성하고 생성한 브랜치로 이동 git push (remote) (localbranch) : git push orgin localbranch01 = remote 브랜치에 로컬브랜치와 같은 이름의 브랜치를 만들고 해당 내용을 push 함 git push --set-upstream origin localbranch01 : 로컬브랜치와 같은 이름의 upstream(remote) 브랜치 tracking git branch -m : rename a branch while pointed to any branch / git branch -m : rename the current branch git branch -d localbranch01 : delete local branch named 'localbranch01' git push origin --delete remotebranch01 : delete remote branch ('remotebranch01') git fetch -p : The git manual says -p, --prune After fetching, remove any remote-tracking branches which no longer exist on the remote. Git: Delete a branch (local or remote) PR GitHub의 Pull Request를 로컬로 가져오기 Repository [번역]GitHub / Managing Remotes / 원격 저장소 URL 변경하기 commit git commit -m \"commit message\" : 한줄로 짧게 commit git commit : 길게 commit log 사용할때 사용 git config core.editor \"편집기(like vim)\" 또는 GIT_EDITOR 로 사용할 에디터 지정할 수 있음. cygwin의 경우 \"편집기\" 대신 \"c:/편집기경로/편집기.exe\" 로 명시해주는게 나을 수 있음. (cygwin git이 아니라 Git for Windows 등 외부 git 사용할 경우) git commit -a : Staging area 생략. Tracked 상태의 파일을 자동으로 Staging Area에 넣음 Remove files from Git commit git add * 2 -> git commit : added files 합쳐서 한번에 commit 됨 git commit --amend : 최신 commit 수정 commit 수정하고 싶을때 : Git-과거의-특정-커밋-수정하기 git-scm - Git 도구 - 히스토리 단장하기 해당 remote branch에서 다른 수정이 일어났을 경우, 완전히 꼬여버리므로 주의하자 git rebase --interative commit아이디 commit아이디 = 수정할 commit의 이전 아이디 git rebase --i HEAD~되돌릴commit숫자 안됨. command 확인필요 에디터창에서 pick -> edit 로 수정 git commit --amend 후 commit 수정 , 완료 후 계속 작업 git rebase --continue 완료 후, git push --force git reset : commit 취소시 사용. git reset HEAD^ / git reset HEAD~4 : 가장 최근 commit 취소/최근 4개의 commit 취소. push 아직 안했을때 사용. Staging Area ( git index) git add/rm filename01 filename02 git add -u : add all file git add -u foldername : To stage just under folder Multiple file staging git rm `git ls-files -d` or git ls-files -z -d | xargs -0 --no-run-if-empty git rm : rm all delete file How to add and commit removals made with “rm” instead of “git rm”? Diff git diff : 수정했지만 아직 staged 상태가 아닌 파일의 내용을 비교 git diff --staged : 저장소와 staging 된 파일 내용 비교 log git log : scm - git log에서 추가 command 확인가능 git log -p -2 : -p = 각 커밋의 diff -2 = 최근 두 개의 결과 git log -p --word-diff : 해당 파일의 단어 기준의 diff 출력 git log --pretty=oneline : --pretty = 예쁘게 보여줌 / oneline = 각 커밋을 한 줄로, 그 외 short, full, fuller 있음 특정 파일의 log 확인 : git log 조회 제한 --since=2018-02-13 --since=2.weeks , 2 years 1 day 3 minutes ago,... -(n) 최근 n 개의 커밋만 조회한다. --since, --after 명시한 날짜 이후의 커밋만 검색한다. --until, --before 명시한 날짜 이전의 커밋만 조회한다. --author 입력한 저자의 커밋만 보여준다. --committer 입력한 커미터의 커밋만 보여준다. 그 외 --stat : 커밋 통계정보 git log --pretty=format:\"%h %s\" --graph : 정해진 포맷(commit hash,subject) 과 함께 그래프 출력(source tree처럼 branch, merge history 보여줌) git Stash : branch 변경할때 commit 하지 않고 다시 돌아와서 작업하기 Pro git - 7.3 Git 도구 - Stashing과 Cleaning Git remote branch 가져오기 Git remote branch 가져오기 단일 브랜치만 클론하기 : git clone -b {가져올 브랜치이름} {git url} remote repository 특정 브랜치 가져오기 : git checkout -t {remote repository/브랜치명} (git checkout -t origin/ohahohah) git branch -r : 원격저장소 branch 리스트 보기 Removing sensitive data from a repository 민감한 데이터 제거하기 git 자체 command(git-filter-branch) 를 사용하는 방법과 - BFG Repo-Cleaner를 사용하는 두 가지 방법이 있음. 패스워드 키등 민감한 데이터 제거를 위해 리포지토리의 일부 파일/폴더를 삭제하려면, 해당 데이터뿐만 아니라 히스토리도 함께 삭제해야함. git-filter-branch 사용해서 히스토리 전체에서 필요한 것(해당 파일이 포함된 히스토리를 '필터링'해 제외한 모든 히스토리)만을 골라낸다. 단일 commit 수정으로 가능할 경우, 되도록 이 command를 사용하지 말 것! rewritten history는 모든 object는 다른 object name을 가지게 되어서, orginal branch를 cover하지 않으므로, rewritten branch 는 쉽게 original branch에 push, distribute 할 수 없음. 본 단락은 아래 reference 발췌,요약했음. GitHub - Removing sensitive data from a repository / 비공식번역본 - GitHub / Advanced Git / 민감한 데이터 제거하기 git Doc - filter-branch git scm - 7.6 Git Tools - Rewriting History / git scm - 7.6 Git 도구 - 히스토리 단장하기 최근 commit에서 단순 파일 제거시에는 Removing files from a repository's history 참고 처리된 후에도, GitHub cached view를 통해 clone이나 fork로 해당 commit에 접근될 수 있음. cached view 제거하고 싶을 경우, Github에 따로 요청. However, it's important to note that those commits may still be accessible in any clones or forks of your repository, directly via their SHA-1 hashes in cached views on GitHub, and through any pull requests that reference them. You can't do anything about existing clones or forks of your repository, but you can permanently remove all of your repository's cached views and pull requests on GitHub by contacting GitHub Support. (from article) 1. 작업 전 처리해야할 것 오픈 PR을 merge하거나, close 해야함. repository history를 rewrite하는 것이므로, SHA 변경이 됨. 관련 commit에 영향을 줄 수 있음. 삭제해야할 파일을 stashing 했을 경우, unstashing해야함. git stash show -p | git apply -R Pro git - 7.3 Git 도구 - Stashing과 Cleaning stash해두었을 경우 commit history 가 변경되었을때 해당 stash가 사라질 수 있음 2-1. Using the BFG : 설치 필요하지만 간단함 BFG Repo-Cleaner는 git-filter-branch 보다 간단함. 설치 후, bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA 로 YOUR-FILE-WITH-SENSITIVE-DATA 파일 삭제 2-2. git-filter-branch 사용해 파일 삭제 : Git 내장 command 사용 git-filter-branch 는 모든 branch,tag,commit을 정리하고 branch pointer를 다시 복원해줌 'YOUR-FILE-WITH-SENSITIVE-DATA' 파일이 포함된 commit을 변경하고, 이후 commit의 전체 history를 rewite. 나중에 empty commit은 완전히 제거('YOUR-FILE-WITH-SENSITIVE-DATA'만 변경되었으므로) testing brach에서 실험하고 나서 master branch에 적용하는 게 좋음(filter-branch 명령에 --all 옵션을 추가하면 모든 브랜치에 적용됨) 삭제해야할 파일을 필터링해 git-filter-branch git filter-branch --force --index-filter \\ 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \\ --prune-empty --tag-name-filter cat -- --all FileName이 아닌 path가 필요함. 삭제해야할 파일이 전에 path를 바꾼 적이 있을때, 이전 경로에 대해서 동일한 작업 실행해야함. command 역할 역할 Git이 모든 브랜치와 태그의 전체 히스토리를 처리하지만 체크아웃하지 않음. 지정된 파일뿐만 아니라 (해당 파일을 제거 필터링한)결과로 생성된 빈 커밋을 제거 기존 태그 덮어 쓰기 --force --index-filter : 강제로 인덱스를 재작성. tree filter와 비슷하지만 checkout하지 않아서 더 빠름. 'git rm --cached --ignore-unmatch YOUR-FILE-WITH-SENSITIVE-DATA' 각 스냅샷에 YOUR-FILE-WITH-SENSITIVE-DATA 이 있으면, 인덱스에서만 path를(--cached / Staging Area에서만 제거하고 워킹 디렉토리에 있는 파일은 지우지 않고) 삭제(rm)하고, 매치되는 파일이 없어도 zero status로 exit함(--ignore-unmatch) git doc - git-rm Pro Git - 2.2 Git Basics - Recording Changes to the Repository / Pro Git - 2.2 (한국어판) --prune-empty tree를 건드리지 않고, merge commit이 그대로 유지되도록 함. (하나 또는 가지치기되지 않은 부모(one or non-pruned parents)가 있는 커밋을 git-filter-branch에서 remove함.) --tag-name-filter cat 태그를 rewrite. 모든 tag ref가 rewritten object(or to a tag object which points to a rewritten object)를 point하게 됨. cat option을 사용했으므로, original tag가 삭제되지 않고, 덮어써짐(overwritten). 이때 새로 생성된 tag object의 message, author, and timestamp는 동일하게 생성되지만, signatures는 유지되지 않음. --all : 모든 branch에 적용 repository의 history에서 원하는 모든 것을 제거했는지, 모든 brach를 checkout했는지 다시 확인. git push origin master --force : 변경된 사항(local에 적용되어있음)을 remote에 적용(강제 push 실행) git push origin --force --tags : tagged release 에 파일 있을 경우, 적용 작업 후 처리해야할 것 다시 commit하는 실수를 하지 않도록 .gitignore에 추가 공동작업자에게 merge하지 않고 rebase 하도록 알려줌. (merge commit시, 이전 버전의 history가 적용되어버릴 수 있음.) 파일 삭제시 해당 데이터가 손상된 것으로 간주해야함. 암호 또는 키일 경우, 변경필요 (Git 1.8.5 이상일 경우)$ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin $ git reflog expire --expire=now --all $ git gc --prune=now git rebase PR하기 전에 upstream(fork해온 repository말고 원본 repository)에서 rebase 해오는데 아래와 같은 Merge conflict 메시지가 뜨는 경우가 있음. 하단 가이드대로 git am --show-current-patch : 현재 내용과 upstream의 commit과 어떤 부분이 충돌나는지 대략적으로 확인 충돌 해결 : 와 ======= 사이가 현재 파일에서 충돌난 내용. ======= 와 >>>>>>> 사이가 upstream의 충돌난 내용임. 두 부분을 적절히 선택해서 남기고 주석까지 지워줘야함. 대략 아래와 같은 구조>>>>>> upstream의 commit 메시지 git add/rm : 충돌 해결한 내용을 업데이트. 해당 파일을 지우거나 수정해서 업데이트 하거나. git rebase --continue : rebase 마저 진행하쇼 충돌난 commit 을 skip 하고 싶을 땐 git rebase --skip 이 rebase를 그만두고 rebase전 상태로 돌아갈 때 git rebase --abort 아래와 같이 충돌났을때 guide가 출력됨. ``` ❯ git rebase upstream/ohahohahFirst, rewinding head to replay your work on top of it... Applying: Add Tdd practice metting Using index info to reconstruct a base tree... M meeting_log.md .git/rebase-apply/patch:14: trailing whitespace. Falling back to patching base and 3-way merge... Auto-merging meeting_log.md CONFLICT (content): Merge conflict in meeting_log.md error: Failed to merge in the changes. Patch failed at 0001 Add Tdd practice metting Use 'git am --show-current-patch' to see the failed patch Resolve all conflicts manually, mark them as resolved with \"git add/rm \", then run \"git rebase --continue\". You can instead skip this commit: run \"git rebase --skip\". To abort and get back to the state before \"git rebase\", run \"git rebase --abort\". ``` "},"Git_Github_Gitlab/git_commit.html":{"url":"Git_Github_Gitlab/git_commit.html","title":"Git commit","keywords":"git log git commit git","body":"Reference 상황/궁금증 정리 git commit 후 바로 push 하지말자. 한 번 더 commit 내용 확인하고 올리자. 깔끔하게 되돌려지지 않는다 commit 은 나중에 내용 보기 편하도록 atomic하게 작성 단, 프로젝트 성격에 따라, squash commit 을 적극 활용하자. (open source PR,...) 기능구현시, 여러 commit으로 나뉠 경우, 앞에 [기능명 또는 issue 내용]을 붙여서 tracking 하기 편하게 한다. how-can-i-reference-a-commit-in-an-issue-comment-on-github : To reference a commit, simply write its SHA-hash, and it'll automatically get turned into a link. "},"Git_Github_Gitlab/git_concept.html":{"url":"Git_Github_Gitlab/git_concept.html","title":"Git 개념","keywords":"git concept git objects git refs git","body":" Reference 상황 / 궁금 정리 snap-shot check-summed States : committed, modified, and staged Branch Git Objects refs(reference) What is refs? Branch 와 refs? HEAD Tag Remote Refs 참고 Reference git- docs : git --version으로 사용하고 있는 version에 맞는 doc 확인 pro Git book / pro Git book(한국어) 상황 / 궁금 지금까지는 당장 사용할 수 있는 command와 특정시나리오(e.g. commit한 내용을 취소하고, 되돌리려면?) 중심으로 찾아서 봤음. 하지만 복잡한 시나리오나 command를 제대로 이해하기엔 git의 기초 개념이 부족한 것 같아 정리를 시작함. 용어는 영어기준으로 정리함. 정리 snap-shot https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88 - 차이가 아니라 스냅샷 check-summed https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88 - git의 무결성 States : committed, modified, and staged !Working tree, staging area, and Git directory https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88 - 세가지 상태 Branch Pro Git - 3.1 Git Branching - Branches in a Nutshell / Pro Git - 3.1 Git 브랜치 - 브랜치란 무엇인가 Git Objects Pro git - 10.2 Git의 내부 - Git 개체 / Pro git - 10.2 Git Internals - Git Objects refs(reference) Pro git ver.1- .3 Git의 내부 - Git 레퍼런스 와 Pro git ver.2- 10.3 Git의 내부 - Git Refs을 발췌,요약 편집함. What is refs? (commit의) SHA-1 값을 날로 사용하기보다 쉬운 이름으로 된 포인터가 있으면 그걸 사용하는게 더 좋다. 외우기 쉬운 이름으로 된 파일에 SHA-1 값을 저장한다. Git에서는 이런 것을 \"레퍼런스\" 또는 \"refs\"라고 부른다. SHA-1 값이 든 파일은 .git/refs 디렉토리에 있다. 확인 : master branch의 최신 commit의 SHA-1 값은 .git/refs/heads/master 에 저장되어있음. echo \"1a410efbd13591db07496601ebc7a059dd55cfe9\" > .git/refs/heads/master 와 같음. 직접 .git/refs/heads/master 를 수정하는 것 보다 안전하게 update-ref를 사용하는게 나음. 위 명령어는 다음의 명령어와 같음. git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9 그러므로 git log 1a410e == git log master Branch 와 refs? branch는 어떤 작업들 중 마지막 작업을 가리키는 포인터 또는 레퍼런스이다. git branch (branchname) 을 실행하면 Git은 내부적으로 update-ref 명령을 실행한다. 입력받은 branch 이름과 현재 branch의 마지막 커밋의 SHA-1 값을 가져다 update-ref 명령을 실행한다. git branch (branchname) == git update-ref refs/heads/current-branch 1a410e(latest commit SHA-1)HEAD 현재 branch 가 무엇인지에 대한 정보는 .git/HEAD 에 저장되어 있음. HEAD 파일은 현 브랜치를 가리키는 간접(symbolic) 레퍼런스다. 간접 레퍼런스이기 때문에 다른 레퍼런스와 다르다. 이 레퍼런스는 다른 레퍼런스를 가리키는 것이라서 SHA-1 값이 없다. 파일을 열어 보면 아래와 같이 생겼다 git symbolic-ref HEAD 로 값을 읽음(== cat .git/HEAD) 현재 branch가 master라면, .git/HEAD 의 내용은 ref: refs/heads/master 임. git checkout test 하면(test branch로 변경) .git/HEAD의 내용은 ref: refs/heads/test 임. HEAD값 변경이 가능함. test로 변경 : git symbolic-ref HEAD refs/heads/test 위 command 을 실행하고, git branch 로 현재 branch를 확인하면, test branch에 있다고 출력됨. Tag Tag object : 누가(tagger == author),언제(timestamp) tag를 만들었는지, tag message와 어떤 commit을 가리키는지 정보를 포함함 .git/refs/tags/v1.1 의 SHA-1을 사용해 tag object 를 확인 (git cat-file -p : 저장된 데이터를 불러오는 command. 파일내용 출력(-p)) ``` $git cat-file -p a3a5f7944b6a087429353f6b1dc1c15a05c69ffc object 4476d5a8e95d6a8189748af8d199822cc17b82d2 type commit tag v1.1 tagger ohahohah [email protected] 1519802958 +0000 test tag - tag message 는 'test tag' 임 - 가리키고 있는 commit : 'object 4476d5a8e95d6a8189748af8d199822cc17b82d2' - `git cat-file -p`로 commit object 를 확인할 수 있음. git cat-file -p 4476d5a8e95d6a8189748af8d199822cc17b82d2 tree 6d57a3e005b4446167c54272929e7a53ba5259f3 parent 28378846add4b86832e355e59ff1dddec84ead69 author ohahohah 1519724138 +0000 committer ohahohah 1519724138 +0000 Add branch command,reference / 20180227 TIL - Add managing Branch command - Add Reference about 'rebase,cherry-pick,merge' [ticket: ] ``` - tree 6d57~ : 해당하는 tree object의 SHA-1. UNIX의 directory 같음. [Pro Git - 10.2 Git의 내부 - Git 개체](https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Git-%EA%B0%9C%EC%B2%B4) 의 'Tree 개체' 참고 - parent 283788~ : 바로 직전 commit. commit log를 가계도라고 생각하면, 바로 위에 있는 commit이므로 parent 가 됨. Remote Refs push 한 마지막 commtit 의 SHA-1 값을 'refs/remotes'에 저장함. 현재 branch가 tracking 하고 있는 remote branch가 master 라면 '.git/refs/remotes/origin/master' 로 remote 서버에 반영된 최종 commit이 뭔지 확인 할 수 있음.$ cat .git/refs/remotes/origin/master ca82a6dff817ec66f44342007202690a93763949 읽기만 가능. checkout(수정)이 불가능한 일종의 북마크임. 참고 SHA-1의 이해 Git의 무결성Git은 데이터를 저장하기 전에 항상 check-summed을 구하고 그 check-summed으로 데이터를 관리한다. 그래서 check-summed을 이해하는 Git 없이는 어떠한 파일이나 디렉토리도 변경할 수 없다. check-summed은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학이다. Git 없이는 check-summed을 다룰 수 없어서 파일의 상태도 알 수 없고 심지어 데이터를 잃어버릴 수도 없다.Git은 SHA-1 해시를 사용하여 check-summed을 만든다. 만든 check-summed은 40자 길이의 16진수 문자열이다. 파일의 내용이나 디렉토리 구조를 이용하여 check-summed을 구한다. SHA-1은 아래처럼 생겼다.24b9da6552252987aa493b52f8696cd6d3b00373Git은 모든 것을 해시로 식별하기 때문에 이런 값은 여기저기서 보인다. 실제로 Git은 파일을 이름으로 저장하지 않고 해당 파일의 해시로 저장한다.from Pro Git - 1.3 시작하기 - Git 기초 - Git의 무결성 wikipedia - SHA-1 Git 에서의 object, pointer "},"Git_Github_Gitlab/git_config.html":{"url":"Git_Github_Gitlab/git_config.html","title":"Git 설정","keywords":"","body":"Keyword git git config Reference git 에서 https repository 연결시 SSL 인증서 오류 해결법 상황/궁금증 회사프로젝트 gitlab설정하면서, git global config 를 회사계정정보로 설정했더니, 하위 폴더의 개인repository 설정도 회사계정으로 덮어써짐. git ssl로 repository 가져오거나 GitlabAPI 사용시, curl: (60) SSL certificate problem: unable to get local issuer certificate 출력 정리 git-scm : 시작하기 - Git 최초 설정 global 설정 확인 git config --global --list git config global file - remove settings : git config --global --unset-all user.name or edit '~/.gitconfig' file Git httpsrepository 연결시, curl: (60) SSL certificate problem: unable to get local issuer certificate 메시지 출력 git 은 https repository 연결시 curl 을 사용하며 curl은 기본적으로 SSL 인증서 검증을 수행 lesstif - curl 에 신뢰하는 인증기관 인증서 추가하기 의 CA 인증서 파일 갱신 해도 안됨. askubuntu 참고해, 직접 gitlab의 crt 추가함. "},"Git_Github_Gitlab/git_local_to_remote.html":{"url":"Git_Github_Gitlab/git_local_to_remote.html","title":"Git repository 관리","keywords":"","body":"Keword Reference 2.5 Git의 기초 - remote 저장소 git scm - 3.5 Git 브랜치 - 리모트 브랜치궁금 svn local repository 정리 Local 저장소를 빈 원격 저장소에 연결 e.g. local에서 작업하던 내용을 원격저장소 생성해 옮길 필요가 있을때 README.md 자동생성 하지 않음. push에서 충돌이 생김. local repository git init 1-1. git global setup(--global) 또는 해당 repository에만 적용될 setup 설정 (난 여러계정을 사용하기때문에 repository 별로 설정함) git config user.name \"name\" git config user.email \"[email protected]\" git remote add [giturl's alias] [giturl] git push -u origin master 또는 git push origin -all (local의 모든 branch push) 3-1. local repository에 branch 가 없을 경우, 아래와 같은 error 발생할 수 있음. first commit 실행하면 해결됨. stackoverflow - git-error-failed-to-push-some-refs-to ``` $ git checkout fatal: You are on a branch yet to be born $ git push origin master error: src refspec master does not match any. error: failed to push some refs to 'giturl/something.git' ### branch 관리 #### What is remote branch - remote refs : remote repository 에 있는 pointer인 reference like branch, tag,... - `git ls-remote [remote]` : remote refs 조회 - remote tracking branch = romote brach를 tracking하는 branch.(이 문서에서는 remote branch 와 tracking하는 local branch임) > git.ourcompany.com 이라는 Git 서버가 있고 이 서버의 저장소를 하나 Clone 하면 Git은 자동으로 `origin`이라는 이름을 붙인다. `origin`으로부터 저장소 데이터를 모두 내려받고 master 브랜치를 가리키는 포인터를 만든다. 이 포인터는 origin/master 라고 부르고 멋대로 조종할 수 없다. 그리고 Git은 로컬의 master 브랜치가 origin/master를 가리키게 한다. 이제 이 master 브랜치에서 작업을 시작할 수 있다. - why 'orgin'? > ‘origin’의 의미 브랜치 이름으로 많이 사용하는 ‘master’라는 이름이 괜히 특별한 의미를 가지는 게 아닌 것처럼 ‘origin'도 특별한 의미가 있는 것은 아니다. git init 명령이 자동으로 만들기 때문에 사용하는 이름인 'master’와 마찬가지로 'origin'도 git clone 명령이 자동으로 만들어주는 리모트 이름이다. `git clone -o booyah` 라고 옵션을 주고 명령을 실행하면 booyah/master 라고 사용자가 정한 대로 리모트 이름을 생성해준다. #### Get Remote branch - [git-scm : 3.5 Git branch - remote branch](https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98) 1. `git fetch` : Get remote traching branch > Fetch 명령으로 remote tracking branch를 내려받는다고 해서 local 저장소에 수정할 수 있는 branch가 새로 생기는 것이 아니다. 다시 말해서 patch-04 라는 branch가 생기는 것이 아니라 그저 수정 못 하는 origin/patch-04 branch 포인터가 생기는 것이다. (from 'git-scm 3.5 Git branch - remote branch' 인용) $ git fetch From gitlab.com:someone/test [new branch] patch-04 -> origin/patch-04 - 확인 : remote branch 가 생성되었지만, 자동으로 local branch 가 생기지 않음 $ git branch --all master patch-01 patch-02 patch03 remotes/origin/master remotes/origin/patch-01 remotes/origin/patch-02 remotes/origin/patch-04 ``` git 1.65 이상 버전에서는 git checkout [remote branch name] 로 자동으로 remote branch 와 같은 이름으로 local branch 생성(자동으로 tracking 됨)$ git checkout patch-04 Switched to a new branch 'patch-04' Branch patch-04 set up to track remote branch patch-04 from origin. 또는 2-1. merge 하기 새로 받은 branch의 내용을 Merge 하려면 git merge origin/serverfix 명령을 사용한다. 2-2. Merge 하지 않고 remote tracking branch에서 시작하는 새 branch를 만들려면 (원론적으로는 이 명령어 사용) $ git checkout -b serverfix origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix' Tracking branch remote tracking branch를 local branch로 Checkout 하면 자동으로 'tracking(Tracking) branch'가 만들어짐 Upstream branch: tracking 하는 대상 branch / liek orgin/patch-04 tracking branch에서 git pull 명령을 내리면 remote 저장소로부터 데이터를 내려받아 연결된 remote branch와 자동으로 Merge 한다. patch-04 -> origin/patch-04 git remote show [remote repository name] remote 저장소 정보 보여줌. remote branch, tracking branch 정보 확인할 수 있어서 유용 remote repository name 생각나지 않을 땐 , git remote -v 사용해서 repository alias - giturl 정보 함께 볼 수 있음 Tracking 상태 확인 git branch -vv git fetch --all; git branch -vv : 최신 fetch내용을 가져 ``` $ git branch -vv master fbb9c4e [origin/master] Merge branch 'patch-01' into 'master' patch-01 bbb02a7 [origin/patch-01] 업데이트 상세내용 patch-02 11b13dd [origin/patch-02] Update brach patch-04 fbb9c4e [origin/patch-04] Merge branch 'patch-01' into 'master' patch03 525803a [origin/patch-03: ahead 2] Update branch test phase ``` Tracking branch 만들기 git checkout [remote branch name] : 자동으로 remote branch 와 같은 이름으로 local branch 생성 사실, 위 명령어는 git checkout --track origin/branchname 을 생략한 버전임. --track 옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성한 것임. 사용가능 조건: (a) 해당 local repository가 해당 이름의 branch를 가진 remote 가 딱 하나 있고 (내 경우엔, 한 repository에 여러 remote 저장소를 사용하지 않도록 해서 상관없음. 1:1 관계로 만들어놓음) (b) 해당 이름이 local에는 없으면 Git은 트래킹 브랜치를 만들어 준다. git checkout -b [branch] [remotename]/[branch] : 다른 이름으로 local branch 만들 수 있음.$ git checkout -b sf origin/serverfix Branch sf set up to track remote branch serverfix from origin. Switched to a new branch 'sf' 이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적 : -u(--set-upstream-to 짧은 표현) 옵션 사용 지금 속한 brach 가 origin/serverfix 를 tracking하도록 설정$ git branch -u origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. set multiple remote repository Pro Git - 3.2 Git 브랜치 - 브랜치와 Merge 의 기초 팀 작업시, 팀 repository을 fork해서 개인 repository 에서 작업 후, Pull Request(a.k.a. PR / gitlab : Merge Request(a.k.a. MR))함. PR 전, 그동안 다른 사람들이 팀 repository에 작업한 commit내용을 반영해야함 branch pointer가 fast-forward하므로(최신 버전의 팀 repository의 commit history를 가지고 있음), PR의 commit 내용이 팀 repository의 최신 commit에 새로운 commit(PR)을 추가한다. 팀 repository에 commit history의 분기없이(3-way merge), (다른 작업자가 같은 파일을 작업했을때 발생하는)Merge conflict없이 깔끔하게 Merge된다. 해당 작업을 하지 않음 팀 repository를 반영하기 위해(pull) remote 를 새로 지정함 git remote add upstream 팀_repository_url fatal: remote upstream already exists. 같은 메시지가 출력될 경우, 다시 upstream 지정 git remote set-url upstream 팀_repository_url 해당 과정 거친 후, git remote -v 또는 git remote show upstream 으로 확인 Syncing a fork help_github - Syncing a fork Syncing a forkgit fetch upstream git checkout master git merge upstream/master Before creating new branch : fetched the latest master version of the upstreamgit pull upstream master --ff-only Before PR(MR) 전git fetch upstream git merge upstream/master Merge / Rebase [상황] Merge와 rebase를 각각 어떤 경우에 사용해야하는지 헷갈려서 정리함. Git: Rebase는 언제 어떻게 해야 할까? Pro Git(v1) - .6 Git 브랜치 - Rebase하기 push pull fetch fetch git fetch [remote] : remote branch 정보 update $ git push fatal: The current branch patch-02 has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin patch-02 svn to gitlab GitLab Documentation - Migrating from SVN to GitLab svn 과 gitlab 모두 bidirectional 하게 설치. Install subgit "},"Git_Github_Gitlab/git_ssh.html":{"url":"Git_Github_Gitlab/git_ssh.html","title":"Git ssh","keywords":"git setting git ssh","body":"Reference 상황/궁금증 회사프로젝트 gitlab설정하면서, ssh 방식으로 설정하면서, 적용한 내용 정리 정리 What is SSH? SSH - git ? git - .3 Git 서버 - SSH 공개키 만들기 GitLab enterprise 에서는 Web페이지 profile setting 에서 사용자의 SSH public Key를 등록하여 접속할 수 있게 해놓았다 GitLab and SSH keys RSAAuthentication yes 옵션 제외함 "},"Git_Github_Gitlab/git_tip.html":{"url":"Git_Github_Gitlab/git_tip.html","title":"Git 사용 팁","keywords":"","body":"Keyword git tip git plugin git Reference 정리 git autocompletion script Using git + tab like autocompletion. It auto-complete for branches. 비슷한 기능 : git-flow-completion / homebrew로 제공 curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash add to ~/.bash_profileif [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi Give the script permission to run : chmod -X ~/.git-completion.bash gitignore plugin gitignore 에서 제외할 환경검색. gitignore.io - command line 사용하면 편리함. 예제 gi java,python >> .gitignore "},"Git_Github_Gitlab/github_wiki.html":{"url":"Git_Github_Gitlab/github_wiki.html","title":"Github wiki 자료","keywords":"","body":"Keyword gollum github wiki github Reference 상황 / 궁금증 정리 Github wiki는 gollum Searching wikis "},"Git_Github_Gitlab/git_workflow.html":{"url":"Git_Github_Gitlab/git_workflow.html","title":"Git 관련된 workflow","keywords":"","body":"Keyword gitlab gitlab workflow Reference gitlab doc 상황 / 궁금증 20180323 : 모여서 이야기하다가 새로운 프로젝트를 질렀다. 포트폴리오를 핑계로 하고 싶었던 기술스택을 적용해보는 프로젝트! 둘이 나란히 앉아서 벚꽃엔딩 들으면서 workflow를 세팅했다. 같이 하는 사람이 있어서 행복하다. 20180314 : 회사 프로젝트를 gitlab으로 옮기면서 만들었던 workflow를 정리 기본 협업환경(현재 코딩컨벤션 없음, 테스팅 환경없음, 테스트코드 부재)과 CI/CD를 위한 환경세팅(현재 수동으로 서버에 파일 복사-붙여넣기로 배포)하는 방식을 벗어나 모던한 개발환경 구축하고 싶음. 사내에서 CI / CD 에 대한 도움을 받을 수 없는 상황(의지없음, 개념이해없음 등의 이유로)이므로, 관련 시스템을 혼자 구축할때 위험성, 우선순위, 들이는 시간 대비 충분히 효과가 있는지 고민해봐야함. maven 빌드스크립트부터 시작하는게 낫지 않을까? 정리 요구사항 메뉴얼 작성 : 기존 svn프로젝트에서 gitlab으로 옮기는 것이므로, 초심자도 접근할 수 있도록 git 및 gitlab-flow 이해할 수 있는 메뉴얼 필요 업무관련툴을 위한 slack, trello, CI 테스팅 환경 구축 업무관련툴 세팅 요구사항 gitlab issue,merge,commit notify -> slack 알림 구현 slack (프로젝트별로 생성된 slack channel 사용) 추가 채널이 필요할 경우 '프로젝트명채널목적' 으로 채널 생성(e.g. #000프로젝트이슈관리) Incomming webhook 을 사용하여, slack에 gitlab notify를 세팅함 사내 gitlab 버전에 맞는 doc을 참고하여, setting webhook url 의 맨 마지막에 붙는 문자열이 token이 됨 trello gitlab API를 사용한 인증사용. API version4만 가능 - GitLab doc - Trello Power-Up Gitlab 버전에 따라 사용할 수 있는 API version이 다름 / 현재 회사 Gitlab API v3 API 사용시, 사용자의 private token 과 project id 사용함. Profile - Account settings - Private token 확인가능: personal-access-tokens zapier 사용해 자동 세팅 불가 특정 IP에서만 접근할 수 있으므로,gitlab url을 통한 사용자인증이 불가함. 현재 gitlab service에서는 zapier 지원하지 않음. "},"Git_Github_Gitlab/Markdown.html":{"url":"Git_Github_Gitlab/Markdown.html","title":"Markdown","keywords":"","body":"Keyword markdown Reference 상황 / 궁금 정리 Github markdown math equations O([\\log{2}n]) == O([\\log{10}n])? 에 대해 정리하던 중, 수식 markdown에 대해 찾아봄 Rendering math equations? - github markdown에서 수식 쓰는 흥미로운 방법들 Math in MarkDown - markdown 수식표현 방법에 대한 위키 Plug-in / Util Markdown TOC : TOC 자동생성(설치필요없음) / github-markdown-toc TOC creating for a local README.md : ./gh-md-toc ~/projects/Dockerfile.vim/README.md Remote files : ./gh-md-toc https://github.com/ekalinin/envirius/blob/master/README.md Table of Contents for GitHub "},"Git_Github_Gitlab/how_to_setup_project.html":{"url":"Git_Github_Gitlab/how_to_setup_project.html","title":"Project 관리 - Git 메뉴얼","keywords":"","body":"Keyword commit template Project 관리 Git 기본 이해 -Pro git v.2 한글판 Workflow Gitlab-flow (Github-flow with Pre-production and Production) 사용 GitLab Flow - official document 한글 번역(일부) issue 발행 후, assgine한 사항에 대해 개발 진행. Branch 흐름은 feature -> master -> Pre-production -> Production 임. Pre-production 개발계 테스트 진행 운영계 배포는 Production branch 코드 사용 merge 시, rebase 하여 불필요한 merge log가 남지 않도록 함. 프로젝트 관리 리포지토리를 관리하는 정원사 역할이 필요 프로젝트 관리를 위해 템플릿 설정을 통해 관리 opensource 프로젝트의 리포지토리 관리를 참고 issue template issue type 에 따른 template 설정 issue 작성 등과 관련된 체크리스트를 적어서 작성자가 해당 사항을 다시 검토하도록 유도하는 것이 좋음 예. - [ ] issue 제목은 약속한 형식을 따랐는가? PR template PR 관련된 체크사항을 함께 기술 test 여부,... PR만 보고도 어떤 작업내용인지 파악할 수 있어야함 Assignees , Reviewer, Labels 을 프로젝트 성격에 맞게 커스텀하여 사용 organization 프로젝트의 경우 Team설정을 이용하면 편함 Branch 명 feature branch 명명시, 최대한 atomic하게 작성. Documentation 을 통한 communication 프로젝트 설계의도 전달과 향후 유지보수를 위한 내용을 기술. 다음 개발자를 위해 인수인계가 가능한 수준으로 작성. 주석 내 commnet : JavaDoc 생성을 위한 comment 양식 및 tag 준수 How to Write Doc Comments for the Javadoc Tool Gitlab내 wiki 사용 기능 및 프로젝트 세팅 개발자 메뉴얼 수준으로 기록 페이지 추가 변경시, home에 목차 변경 참고 : gollum TOC 자동 생성 플러그인 기능 및 프로젝트 세팅 변경 시, 수정. 주기적으로 업데이트 필요. Commit feature branch 개발시 atomic 단위로 commit master branch merge시, squash commit 사용해 기능 및 이슈단위로 작성 필요에 따라 commit template 작성함. git-scm - commit.template log 한글로, tracking을 위해 issue number 포함 형식 ``` [issue 번호 또는 commit 분류코드] : 메시지 제목 커밋 내용 커밋 내용 ``` master branch에 merge시, squash commit(issue사항 중심으로 정리)하여 commit log 관리 issue 해결시, keyword 사용해 Automatic issue closing commit 분류코드 ENH: Enhancement, new functionality - BUG: Bug fix - DOC: Additions/updates to documentation - TST: Additions/updates to tests - BLD: Updates to the build process/scripts - PERF: Performance improvement - CLN: Code cleanup From pandas-docs : Committing your code Reference Git을 이용하여 텔레파시 통하는 팀 만들기 : commit message와 commit log 좋은 git 커밋 메시지를 작성하기 위한 7가지 약속 "},"Gradle/gradle.html":{"url":"Gradle/gradle.html","title":"Gradle","keywords":"","body":"Keyword gradle 상황 / 궁금증 2018/04/25 'TDD,리팩토링,클린코드' 강의 들으면서 새롭게 gradle을 써보게 됨. gradle 공부까지는 아직이고, 프로젝트하면서 걸리는 부분들 위주로 정리시작. 정리 Gradle 설치 : 메뉴얼이 친절하게 되어있으므로 이것만 따라고도 헤멜 걱정없음 How to define Gradle's home in IDEA? : homebrew 사용해 설치했을 경우, brew info gradle command 사용 intellij에서 'Gradle home' path를 잡지 못해서 수동으로 설정하기 위해 찾아봄. 결국, 수동설정은 하지 않고, PATH 설정을 확인하고 intellij를 재부팅하여 해결. "},"Java/code_convention.html":{"url":"Java/code_convention.html","title":"code_convention","keywords":"","body":"Keyword code convention Reference Kwangshin's Positive Blog - [번역] Java Code Conventions / 자바 코딩 규칙 - 2015년 업데이트 된 번역판. PDF로 다운로드할 경우, 소스코드 내에 한글 주석이 깨진다. Kwangshin's Positive Blog - 자바 코딩 규칙 / Java Code Convention : 2001년도 번역 링크 있음. Google Style Guides Intellij에 Google Style 적용하기 by jiyeonseo "},"Java/exception.html":{"url":"Java/exception.html","title":"exception 예외처리","keywords":"","body":"Keyword exception Reference Documenting Exceptions with @throws Tag 상황 / 궁금증 parameter가 null일때(null이면 안됨), IlligalArgument Excetion을 던저야하는지, guava의 checkNotNull을 써서 NullPointerException을 던져야하는지 헷갈린다. 매번! 그래서 매번 다르게 처리한다. 설계 엉망이여ㅠ 정리 [ ] 다시 읽고 정리하기 Automatically throwing IllegalArgumentException when null values are. passed to a method [stackoverflow - IllegalArgumentException or NullPointerException for a null parameter? closed 자매품 null체크할때 stackoverflow - Avoiding != null statements wikipedia - Null object pattern 마틴파울러의 리팩토링 책에서 null object pattern 파트에 대해서 읽었는데,일시적으로 사용할때나, 객체가 잘 설계되어있지않거나(역할에 맞게 잘 나누어져있지 않다면. 지금 작업하는 코드에는 부끄럽게도 그런 경우가 많다ㅠ 하... 기존 설계를 손대면 안되는거아닌가. 이것도 방법을 찾아야겠다.) 맞지 않는 방법같다. "},"Java/javadoc.html":{"url":"Java/javadoc.html","title":"javadoc","keywords":"","body":"Keyword javadoc Reference Documenting Exceptions with @throws Tag javapractices - Avoid @throws in javadoc 상황 / 궁금증 Intellij의 Inspection code를 실행하니, javadoc 체크 부분에서 'throws'tag description is missing메시지가 출력되었다. description을 어떻게 쓸지 전혀 감이 안와서 정리. [궁금] 지금 코드에는 예외처리를 할떄, 거의 대부분의 경우에 Exception 만을 사용한다. try-catch해서 log를 남기는걸 목적으로 하는데 과연 이걸 예외처리라고 할 수 있을까? description 이 안되는건, 너무 넓은 범위의 exception을 써서 그런듯. [궁금]관련 내용을 기술할때 @see tag 가 매우 유용해보인다. 1method 1role 을 지키기 위해서 method 를 분리할 경우, @see tag 써서 어디서 호출되는지 기술해두는게 나을까? 아녀, 그건 너무 sticky한거 같다. 코드를 바꾼다면 나중에 죽은 주석이 될 가능성이 높을 거 같다. 지금 생각나는 적절한 상황은 interface를 구현했을때 해당 클래스에 @see #구현한interface로 구현한 인터페이스 정보를 @see로 적어두는거? 정리 어떻게 써야할까? Examples of Doc Comments ``` Examples of Doc Comments /** Graphics is the abstract base class for all graphics contexts which allow an application to draw onto components realized on various devices or onto off-screen images. A Graphics object encapsulates the state information needed for the various rendering operations that Java supports. This state information includes: The Component to draw on A translation origin for rendering and clipping coordinates The current clip The current color The current font The current logical pixel operation function (XOR or Paint) The current XOR alternation color (see setXORMode) Coordinates are infinitely thin and lie between the pixels of the output device. Operations which draw the outline of a figure operate by traversing along the infinitely thin path with a pixel-sized pen that hangs down and to the right of the anchor point on the path. Operations which fill a figure operate by filling the interior of the infinitely thin path. Operations which render horizontal text render the ascending portion of the characters entirely above the baseline coordinate. Some important points to consider are that drawing a figure that covers a given rectangle will occupy one extra row of pixels on the right and bottom edges compared to filling a figure that is bounded by that same rectangle. Also, drawing a horizontal line along the same y coordinate as the baseline of a line of text will draw the line entirely below the text except for any descenders. Both of these properties are due to the pen hanging down and to the right from the path that it traverses. All coordinates which appear as arguments to the methods of this Graphics object are considered relative to the translation origin of this Graphics object prior to the invocation of the method. All rendering operations modify only pixels which lie within the area bounded by both the current clip of the graphics context and the extents of the Component used to create the Graphics object. @author Sami Shaio @author Arthur van Hoff @version %I%, %G% @since 1.0 */ public abstract class Graphics { /** Draws as much of the specified image as is currently available with its northwest corner at the specified coordinate (x, y). This method will return immediately in all cases, even if the entire image has not yet been scaled, dithered and converted for the current output device. If the current output representation is not yet complete then the method will return false and the indicated {@link ImageObserver} object will be notified as the conversion process progresses. * @param img the image to be drawn @param x the x-coordinate of the northwest corner of the destination rectangle in pixels @param y the y-coordinate of the northwest corner of the destination rectangle in pixels @param observer the image observer to be notified as more of the image is converted. May be null @return true if the image is completely loaded and was painted successfully; false otherwise. @see Image @see ImageObserver @since 1.0 */ public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer); /** * Dispose of the system resources used by this graphics context. * The Graphics context cannot be used after being disposed of. * While the finalization process of the garbage collector will * also dispose of the same system resources, due to the number * of Graphics objects that can be created in short time frames * it is preferable to manually free the associated resources * using this method rather than to rely on a finalization * process which may not happen for a long period of time. * * Graphics objects which are provided as arguments to the paint * and update methods of Components are automatically disposed * by the system when those methods return. Programmers should, * for efficiency, call the dispose method when finished using * a Graphics object only if it was created directly from a * Component or another Graphics object. * * @see #create(int, int, int, int) * @see #finalize() * @see Component#getGraphics() * @see Component#paint(Graphics) * @see Component#update(Graphics) * @since 1.0 */ public abstract void dispose(); /** * Disposes of this graphics context once it is no longer * referenced. * * @see #dispose() * @since 1.0 */ public void finalize() { dispose(); } } - sample from [javapractices](http://www.javapractices.com/topic/TopicAction.do?Id=44) import java.io.*; /** If a null object parameter is passed to any method, then a NullPointerException will be thrown. */ public final class WriteTextFile { //..other methods elided /** Change the contents of a text file in its entirety, overwriting any existing text. * @param aFile is an existing file (not a directory) which can be written. @param aContents is the text to be placed into aFile. * @exception FileNotFoundException if aFile does not exist. @exception IOException if stream to aFile cannot be written to or closed. * @exception IllegalArgumentException if aFile is a directory. @exception IllegalArgumentException if aFile cannot be written. @exception SecurityException if a SecurityManager exists and disallows read or write access to aFile. */ static public void setContents(File aFile, String aContents) throws FileNotFoundException, IOException { if (aFile == null) { throw new NullPointerException(\"File must not be null.\"); } if (aContents == null) { throw new NullPointerException(\"Contents must not be null.\"); } if (!aFile.exists()) { throw new FileNotFoundException (\"File does not exist: \" + aFile); } if (!aFile.isFile()) { throw new IllegalArgumentException(\"Must not be a directory: \" + aFile); } if (!aFile.canWrite()) { throw new IllegalArgumentException(\"File cannot be written: \" + aFile); } try (Writer output = new BufferedWriter(new FileWriter(aFile))) { output.write(aContents); } } public static void main (String... aArguments) throws IOException { File testFile = new File(\"C:\\Temp\\blah.txt\"); setContents(testFile, \"blah blah blah\"); } } ``` @thorws description Documenting Exceptions with @throws Tag javapractices - Avoid @throws in javadoc javapractices - Javadoc all exceptions "},"Java/lambda.html":{"url":"Java/lambda.html","title":"lambda","keywords":"","body":"Reference What is lambda? 책- 컴퓨터 과학이 여는 세계 - lambda caculation 책 - 함수형 사고 lambda in Java Java 8 람다 표현식 자세히 살펴보기 람다가 이끌어 갈 모던 Java [책 - 자바 개발자를 위한 함수형 프로그래밍] lambda in python 'lambda는 왜 쓰는가?' - 초보몽키의 개발공부로그 - 강의노트 03. 파이썬 lambda, map, filter, reduce, dic 점프투파이썬- lambda 'Examples of reduce() / Exercises'-Python3 Tutorial - Lambda, filter, reduce and map "},"Java/String.html":{"url":"Java/String.html","title":"문자열","keywords":"","body":"Keyword java string microbenchmarking Reference 상황 - 정리 - 궁금증/추가 정리 필요 Which String method: “contains” or “indexOf > -1”? [상황] Intellij Inspection 실행했을때, 다음 항목에서 warning 걸림 'indexOf()' expression is replaceable with 'contains()' Reports any String.indexOf() expressions which can be replaced with a call to the String.contains() method available in Java 5 and newer. This inspection only reports if the project or module is configured to use a language level of 5.0 or higher. [정리] java.lang.String을 살펴보면, contains()은 내부적으로 String.indexOf() 을 호출함. public boolean contains(CharSequence s) { return indexOf(s.toString()) > -1; } stackoverflow - Which String method: “contains” or “indexOf > -1”? 을 참고하면, 추가 method 호출이 성능에 영향을 끼치는지에 대한 논의를 하고 있음. 가장 vote를 많이 받은 답변(18/03/06 기준)은 성능에 유의미한 영향을 끼치지 않는다는 입장임. 좀 더 가독성이 좋은(readable)한 contains로 작성하는게 낫지 않을까? [궁금증/추가] 위 stackoverflow 답변에서 성능측정 부분이 궁금해서 더 찾아봄. benchmarking microbenchmarking stackoverflow - What is microbenchmarking? OpenJDK wiki - MicroBenchmarks Oracle hotspotFAQ - Benchmarking the Java HotSpot VM google/caliper wiki : Java microbenchmark tool 찾다보니, 추가 개념 Program optimization From Wikipedia Profiling (computer programming) From Wikipedia) Java performance From Wikipedia Dynamic program analysis From Wikipedia Static program analysis From Wikipedia 정적 분석 tool인 sonarQube는 세팅해두고 가끔 사용하기는 하는데 이것도 한 번 정리해보고 싶구나. "},"Java/system_properties.html":{"url":"Java/system_properties.html","title":"system_properties 사용","keywords":"","body":"Keyword java system properties Reference The Java™ Tutorials - System Properties 상황 / 궁금증 log4j properties의 Absolute Path를 Relative Path로 변경하면서 ,현재 project의 rootpath 를 기준으로 설정하고 싶었음. apache log4j - SystemProperties을 보면, All properties can be set using normal system property patterns로 되어있음. Java의 System Properties의 user.dir 을 사용하여 수정함. 정리 "},"Java/inbox.html":{"url":"Java/inbox.html","title":"미분류","keywords":"","body":"Keyword Redundant If Reference 상황 / 궁금증 정리 stackoverflow - redundant-if-statement-warning Intellij 에서 Inspection code 하다가 redundant-if-statement 이므로 simply 하라는 메시지가 뜸. 과연 가독성이 높은 건지 의문이 들었음. 성능에 큰 영향을 끼치는 걸까? 아니면 익숙해지지 않아서 그래보이는걸까? if-elseif-elseif 라서 아래 예제랑 좀 경우가 다른거 같은데. simply statement 가 유용해보임 if ( a > b) { return true; } return false; simply return a > b; 왠지 어색해보이는 경우 //Check parameter depend on Action code(args[1]) if (\"0\".equals(args[1]) && args.length == 2) { return true; } else if (\"1\".equals(args[1]) && args.length == 3 && args[2].length() == 8) { return true; } else if (\"2\".equals(args[1]) && args.length == 3 && args[2].length() == 4) { return true; } else return \"3\".equals(args[1]) && args.length == 4 && args[2].length() == 8 && args[3].length() == 4; "},"Java/grammar.html":{"url":"Java/grammar.html","title":"문법","keywords":"","body":"Keyword java basic 상황 / 궁금증 Java를 사용하면서 패러다임 외에도 모르는 문법들이 많아서 해당 부분을 정리 공개 리포지토리에 올려둔 코드의 경우, 해당 코드의 url을 함께 적음 java 내부 구현코드를 함께 적음(구현코드가 30줄을 넘어가지 않을 경우) 정리 instanceof Arrays.asList Arrays.equals(actual, expected) : array의 내용 비교 public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i actual.equals(expected) : hashcode? "},"Learning_by_doing/ing.html":{"url":"Learning_by_doing/ing.html","title":"실습 리스트","keywords":"","body":"Doing 4시간의 집중력 : 최근 코딩테스트를 봤는데 벼락치기는 통하지 않는다. 무엇보다 집중력을 꾸준히 유지하지 못한게 아쉽다. 준비 안하고 하프 마라톤 뛰는 느낌이었다. 꾸준히 준비해서 몸도 지력도 만들어놔야겠다는 생각이 들었다. 코딩 체력단련을 위해 매일 한 것을 로그로 남긴다. 장장 5개월만의 새로운 사이드 프로젝트 Pro Job Searcher - 프로이직러 구직공고 분석하고 복사하다가 그래도 내가 프로그래머인데 반복반복하고 있다니! 화나서 만든 프로젝트. 48시간 해카톤 규모로 version01 만들 예정. 창천향로 - 스프링부트로 웹 서비스 출시하기 시리즈 HackerRank - 30 Days of Code Challenges How do I learn Algorithm Hello coding 그림으로 개념을 이해하는 알고리즘(아디티아 바르가자 저, 한빛출판사) leetcode - top-interview-questions-easy Update 예정 음악분석프로젝트 : 컨트리뷰톤에서 팀을 짜서 하던 프로젝트로 시각화 부분 구현이 웹 상에 올려지지 않아서 비공개로 프로젝트 고치는 중. Interesting millky - SpringBoot로 블로그개발 Java-JSP-Spring 한글강의 - 초심자용 :tv: "},"Learning_by_doing/prepareForkeymove.html":{"url":"Learning_by_doing/prepareForkeymove.html","title":"4시간의 집중력","keywords":"","body":"Keyword 회고 왜 / 무엇을 TIL commit 에 날짜를 기록함 ~코딩 체력단련을 위해 매일 한 것을 로그로 남김~ 로그 2018/05/30 한동안 쉬고 있었던 일일회고 시작 / 회고양식 정리해 공개 2018/05/31 주중 아침 30분 기술도서 읽기 스터디 계획 (첫 책 : 테스트 주도 개발 - 켄트 벡 저) "},"Linux/linux.html":{"url":"Linux/linux.html","title":"linux 기초 정리","keywords":"","body":"Keyword linux Reference root가 편한 여러분들께 #1 root가 편한 여러분들께 #2 :+1: : 초심자를 위한 리눅스 권한 관리에 대해 차근차근 설명 launchctl plist 설정을 통한 autoload : how-to-auto-load-mysql-on-startup-on-os-x-yosemite-el-capitan Bash 입문자를 위한 핵심 요약 정리 (Shell Script) Linux Performance Analysis in 60,000 Milliseconds / 한글 일부 번역 정리 Linux 파일구조 Linux Directory Structure (File System Structure) Explained with Examples 리눅스 디렉토리 구조 "},"Linux/linux_command.html":{"url":"Linux/linux_command.html","title":"linux_command","keywords":"","body":"Keyword linux command Reference https://linuxjourney.com/ 정리 처음 sever setting시 참고 [ ] 외부접속 network 설정 [ ] user 설정 passwd 재설정 : root : sudo passwd / user : passwd / change other users : sudo passwd USERNAME [ ] 외부접속에서 접속시(ssh 사용) : 간편히 접속할 수있도록 ip,port,publickey등 ~/.ssh/config 에 설정 ssh -p port번호 user이름@ip [ ] Check the version of Ubuntu : lsb_release -a or cat /etc/*release [ ] Check installed package \" apt list --installed 기초 - For newbie - Don't panic! https://linuxjourney.com/ (2018/03/09 버전)를 발췌 정리함. 도움말 찾기 : command에 --help 붙여서 실행. e.g. less --help 메뉴얼 찾기 : command 앞에 man 붙여서 실행. e.g. man less option은 여러개 사용가능. e.g. cp -r -i 원본폴더 목적지폴더 자동완성 화살표 아래,위 키 입력시 이전에 입력했던 command가 자동완성됨. tab키 입력하면 path가 자동으로 완성됨. e.g. exercise/README.md 라는 path를 입력하고 싶을 경우, ex 입력 후, tab키 입력 -> exercise 자동완성 -> RE입력 후, tab키 입력 -> README.md 자동완성되어 exercise/README.md 출력됨. history (내가 실행한 명령어보기)를 입력하면, 입력했던 command log 볼 수 있음 !! : 최근 실행한 command 실행 ctrl+R(comamnd+R) : 실행한 명령어 검색해서 실행 가능 (history에서 검색함) 기본 탈출 command : ctrl+c(command+c) / 내부 실행시에는 esc + q (quit) pwd: print working directory cd : change directory ls : list Directories / -a : 숨김파일폴더까지 ls / -l : 상세 정보 touch : redirection / 새로운 파일 만들기 touch newfilename file README.md : 파일타입 알려줌. e.g. README.md: UTF-8 Unicode text, with CRLF line terminators cat Linux/linux.md Java/inbox.md Refactoring/reference.md : concatenate. 파일 내용 보기. 여러 파일을 결합해서 출력가능. less README.md : Text를 페이지로 나누어 출력 (Page Up/Down, 화살표 키로 이동가능). 내부 command는 아래 키워드 확인 h 도움말 q : 보기 종료 / g 문서 맨 처음으로 / G 문서 맨 마지막으로 / /keyword search 'keyword' clear : 화면 clear. copy (cp) cp *.jpg /home/pete/Pictures : (wildcard 사용) 현재 path에서 .jpg 확장자 가진 파일을 /home/pete/Pictures 으로 이동함. cp -r 원본폴더 목적지폴더 : 폴더 통째 복사됨. option '-r'(recursive)로 디렉토리 내의 파일과 폴더를 재귀적으로 복사하기 때문. 덮어쓰기에 주의 cp -i /home/pete/Pictures : option 'i'(interactive)은 대화형 옵션으로, 파일덮어쓰기 전에 물어보는 메시지 출력되어 덮어쓰기 여부를 선택할 수 있음. move (mv) : 파일이동, 이름 바꾸기 mv oldfilename newfilename : 파일이름을 oldfilename에서 newfilename으로 바꿈. 같은 방식으로 폴더명을 바꿀 수도 있음. mv file1 /home/pete/Documents / mv file1 file2 /home/pete/Documents : file2를 /home/pete/Documents 폴더로 이동 / 여러 파일 이동가능.file1, file2 이동 mv -i directory1 directory2 : 폴더 이동 + i option(-i)으로 덮어쓰기될 경우, 파일덮어쓰기 전에 물어보는 메시지 출력되어 덮어쓰기 여부를 선택할 수 있음. mv -b oldfile existfile : backup option(-b). 이미 existfile 이라는 이름의 파일이 있다고 가정. oldfile 이름을 existfile로 바꿈. 기존에 존재하던 existfile은 existfile~로 바뀌어 백업됨. 여러 추가옵션이 존재함. 몰랐던 것 cp -r 원본폴더 목적지폴더 폴더 통째 복사 option '-r' "},"Linux/book_linux_bible.html":{"url":"Linux/book_linux_bible.html","title":"책 linux bible 정리","keywords":"","body":"Keyword linux linux bible Reference 리눅스 바이블 상황 / 궁금증 AWSKSUG chicken_junior 리눅스 스터디 책. 03/19 부터 온라인 스터디로 시작할 예정 action! 매일 20페이지씩 읽고 정리함 최근에 테스트환경 구축을 위해 docker 사용을 시작했다. 근데 이미지 크기가 장난아니더라. SSD 노트북으로는 용량커버가 안됨. 외장하드는 들고다니기 귀찮고. 어차피 서버와 클라우드 환경도 좀 익혀야한다고 생각하던 중이라 AWS EC2 setting을 시작. 급할때마다 잠깐 잠깐 command 찾아서 하는 거보다 더 공부해보고 싶더라. 하지만 혼자는 잘 안하니까 데헷. 정리 "},"Linux/book_linux_server_handling.html":{"url":"Linux/book_linux_server_handling.html","title":"책 리눅스 서버를 다루는 기술(길벗) 정리","keywords":"","body":"Keyword linux 리눅스 서버를 다루는 기술 모두연 datalab 3반 Reference 리눅스 서버를 다루는 기술(길벗): 더북 도서열람 활용 개인 스터디 진도표 상황 / 궁금증 왜 이 책을 선택? 리눅스 바이블책 스터디 전에 가볍게 훑어볼 책 찾던 중, 인터넷으로 공개되어 있는 책 발견. 평도 괜찮아서 시작. 마침 새로 시작한(2018/03/09) 모두의 연구소 Datalab 3반에서도 이 책을 추천받음. 정리 "},"MachineLearning/hanbit_firstml_ch01.html":{"url":"MachineLearning/hanbit_firstml_ch01.html","title":"처음 배우는 머신러닝 1장 요약","keywords":"","body":"Keyword 머신러닝_정의 필요_배경지식 세 줄 요약 머신러닝이란,\"데이터를 이용해서 명시적으로 정의되지 않은 패턴을 컴퓨터로 학습하여 결과를 만들어내는 학문 분야\" (\"Field of study that gives computers the ability to learn without being explicitly programmed” Arthur Samuel (1959)) 머신러닝 기법 이해할때 The Three Cultures of Machine Learning By Jason Eisner (Insight 통찰력 , Fit 데이터 적합성, Analysis 이론적 엄정성) 떠올려보기 Reference 처음 배우는 머신러닝 - 1장 머신러닝 소개(김승연,정용주 지음, 한빛미디어) 모두를 위한 머신러닝 by 김성훈 교수 - 시즌 1 - 딥러닝의 기본 : '머신러닝의 기본과 용어' Udacity - Deep Learning by Google - Lesson 1: From Machine Learning to Deep Learning 1. 머신러닝이란 \"데이터를 이용해서 명시적으로 정의되지 않은 패턴을 컴퓨터로 학습하여 결과를 만들어내는 학문 분야\" Limitations of explicit programming \"Field of study that gives computers the ability to learn without being explicitly programmed” Arthur Samuel (1959) 데이터 데이터 학습을 통해 실행 동작이 바뀜. 고전적 인공지능(규칙 단순조합), 사용자가 어떻게 동작할지 완전히 정의하는 알고리즘과 주요한 차이점임. 패턴인식 데이터의 패턴을 유추하는 방법을 주축으로 함. 데이터 -> 패턴을 찾아냄 . (정해진 패턴으로 데이터 분석을 하는 것이 아님) 컴퓨터를 이용한 계산 실제 데이터에 대해 계산해서 결과를 만들어냄. 특히 딥러닝의 경우, 대용량 데이터가 필요하므로 분산 처리 등 Data Engineering 을 통해 계산 속도를 높이고, 더 많은 데이터를 효율적으로 다루려고 함. 통계학과 가까움. 닯은 점: 데이터를 기반으로 하고, 데이터에서 패턴을 찾아내는 공통점을 가짐. 차이 : 통계학은 수학적인 모델 구축이나 증명에서 그치지만 머신러닝은 실제 데이터 계산으로 결과를 만들어냄. 2. 머신러닝 3가지 관점 머신러닝 기법의 성격에 따른 관점. 머신러닝 기법이 잘 동작하는데 필요한 핵심 연구 방향이므로, 기법 분류시에 각 관점에 대해 생각해보자! 여러 논의 중 The Three Cultures of Machine Learning By Jason Eisner제이슨 아이스너 3 관점 살펴봄. Insight 통찰력 , Fit 데이터 적합성 Analysis 이론적 엄정성 3. 머신러닝 기법 분류 풀고자 하는 목표에 따라 supervised 지도학습 unsupervised비지도학습 Reinforcement 강화학습 supervised : learning with labeled examples Most common problem type in ML Image labeling: learning from tagged images like CS231n Convolutional Neural Networks for Visual Recognition Email spam filter: learning from labeled (spam or ham) email Predicting exam score: learning from previous exam score and time spent Unsupervised learning: un-labeled data i.e. Google news grouping / Word clustering Predicting final exam score based on time spent - regression Pass/non-pass based on time spent - binary classification Letter grade (A, B, C, E and F) based on time spent - multi-label classification 4. 머신러닝 발전사 현재 트렌드(2017) : 대량 데이터 바탕으로 하는 딥러닝 기법사용. 성격이 다른 데이터를 연관시켜 데이터 효율적으로 사용하는 딥러닝 구조 개발됨 (비디오의 자막+이미지 동시학습 / 영어,프랑스어,스페인어 동시학습) 통계학적 머신러닝 기법 조합해 데이터 더 효율적으로 사용(원샷, 제로샷 러닝) 거대 규모로 빠르게 연산할 수 있는 시스템 딥러닝 더 효율적인 학습 기술 (드롭아웃, 비동기 SGD 등) 발전 데이터 수집 기술 발전 (질적, 양적) 1950년 컴퓨터 가능성 가늠. 1950년 튜링테스트 제안됨. 1950년대 신경망시대 : 퍼셉트론 perceptron 이라는 기초 신경망 개발되었지만 쓸 수 있는 데이터가 적었고 기초 이론이 부족해 한정적인 패턴만 학습이 가능. 인공지능의 겨울 1990년대 통계학적 머신러닝 시대 빅데이터 시대: 웹 데이터, 대용량 저장장치, 분산 처리 기술로 시너지 딥러닝 시대: 신경망 이론 GPU 발전 5. 필요한 배경지식 수학 (선형대수, 미분, 통계, 확률) 행렬연산, 행렬곱, 역행렬 개념 (패턴인식 기법이 대부분 수치 연산 사용) 선형대수 , 행렬 분해 지식(특잇값 분해 등) 미분 (최소값, 최대값, 대학수준 미적분학, 최적화) 통계학 (통계학과 접근방법이 비슷하기 때문 / 대학수준 일반 통계학 이론) 분포, 정상분포, 가우스분포 상관관계 회귀 베이지안 통계 기본 (특히 딥러닝) 확률 지식 (머신러닝이 확률 모델 중심으로 구성되어 있음) 확률 정의, 조건부 확률 프로그래밍 머신러닝 라이브러리 사용 분산처리 python (padas, numpy,...) tensorflow, keras, pytorch "},"Maven/maven.html":{"url":"Maven/maven.html","title":"Maven","keywords":"","body":"Keyword maven build Reference 자바 세상의 빌드를 이끄는 메이븐 - 박재성 지음 Maven in 5 Minutes Introduction to the POM POM Reference Maven: The Definitive Guide 보는 중 2014 Spring Framework] 02 - 메이븐부터 알자 :+tv: 상황/ 궁금증 'Effectiv Unit Testing'책의 예제코드를 보니 submodule로 구성되어 각 디렉토리가 독립된 프로젝트로 구성되어있음. 이거 build 어떻게 하지 당황하다가, maven 그동안 설정이 꼬일 때마다 애써 외면해왔던 mvn build 에 드디어 입문해야할 시기임을 느껴... yark shaving 하는 기분이지만, build 와 debugging에 대한 이해가 매우 부족해 더이상 미뤄둘 수 없다는 생각이 들었음. 진행(2018/01/12 ~) 1. 책 예제 + 인터넷 자료 (2018/01/12 ~) Tutorial에서 확장 -> 모르는 개념 검색 보충 책에서 읽었는데도 이해하지 못한 내용은 tag 유지해둠. 다시 읽기. 2. 맡고 있는 프로젝트에 배운 내용 적용 local jar 포함 build 작성글 1. :+1: 왜 Maven을 사용하는거지? 개발환경 개선 : 핵심 비즈니스 로직에 집중하려고(복잡한 프로젝트 구조, 라이브러리 의존성 대신) 사례 : 개발계 / 운영계 서버간 환경이 다름. (표준을 준수하였으면)build 환경을 자유롭게 세팅가능 (개발계 - tomcat / 운영계 - weblogic) 의존관계 라이브러리 관리 (그동안 이것만 씀) 나는! 단위테스트 자동화 + report가 가능하다는 게 충격! 왜 그동안 build안에 단위테스트 자동실행은 생각못했지? maven은 기본적으로 build할때 단위테스트를 진행함! 게다가, 문서도 자동으로 만들어줌! mvn site 소스코드관리 릴리즈 배포 이건 아직 안와닿음. 개발환경 자동화(~CI) 왜 필요? 지금은 테스트자동화만 와닿음. 2. maven_in_5min 3. Maven 설정파일 POM / setting.xml Intro maven은 convention에 따라 Direcotry 구조 정해져있음 -> 기본 구조 어디서 관리하고 있지? 변경할 수 있나? maven 으로 만들어지지 않은 project를 maven으로 변경할 수 있을까? YES! pom.xml 수정해 프로젝트에 맞게 설정변경 POM(Project Object Model)? 프로젝트 설정파일 + 정보 >information about the project and configuration details used by Maven to build the project. pom으로 설정할 수 있는 것? pom 구조 Project Inheritance POM 상속을 통해 project Inheritance 함. 상속하고 있는 pom 확인 : in project path : mvn help:effective-pom project pom은 default로 Super POM(최상위 POM)을 상속 The Super POM is Maven's default POM. All POMs extend the Super POM unless explicitly set, meaning the configuration specified in the Super POM is inherited by the POMs you created for your projects. project 식별 groupId,artifactId,version : project deploy배포, 배포 project를 다른 project에서 참조할때 사용. :: = \"com.mycompany.app:my-app:1\" groupId + artifactId 은 유일값: maven의 center repository 에서 모든 lib 관리하기때문에, 각각 project는 고유값으로 식별되어야함. 프로젝트마다 설정다르므로, 중앙(MAVEN_HOME)에서 프로젝트에 따라 설정해주기 위해 식별 필요. if the configuration details are not specified, Maven will use their defaults. One of these default values is the packaging type. Every Maven project has a packaging type. If it is not specified in the POM, then the default value \"jar\" would be used. etc 다른 pom.xml 사용가능 : '-f','-file'option - mvn -f mypom.xml test Setting.xml Maven Build tool 설정파일 전체 setting(default) : MAVEN_HOME/conf/settings.xml user별(생성필요/default 복사하세여) : USER_HOME/.m2/settings.xml '메이븐'책 실습 [질문던지기 -> 실습] 지금 시점에 java source 와 web soruce 를 나눌 필요가 있을까? -> 합치자 webapp 디렉토리가 하위에 있으면 작업하기 불편 -> webapp 최상위 디렉토리로 변경. Maven Build [INFO] Scanning for projects... //WARNING 01 [WARNING] [WARNING] Some problems were encountered while building the effective model for net.ohah:wikibook:war:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-war-plugin is missing. @ line 21, column 15 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. [WARNING] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building wikibook Maven Webapp 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ wikibook --- //WARNING 02 [WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ wikibook --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ wikibook --- [WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\\Users\\Daumsoft-N144\\Documents\\project\\wikibook\\src\\test\\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ wikibook --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ wikibook --- [INFO] Surefire report directory: C:\\Users\\Daumsoft-N144\\Documents\\project\\wikibook\\target\\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.ohah.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.456 s [INFO] Finished at: 2018-01-16T14:04:33+09:00 [INFO] Final Memory: 6M/120M [INFO] ------------------------------------------------------------------------ WARNING 01 : Add version element(plugin) in pom.xml maven-war-plugin 2.3.2 webapp cf. maven-compiler-plugin - usage Note: Maven 3.0 will issue warnings if you do not specify the version of a plugin. Maven 3.x Compatibility Notes Plugin Metaversion Resolution Internally, Maven 2.x used the special version markers RELEASE and LATEST to support automatic plugin version resolution. These metaversions were also recognized in the element for a declaration. For the sake of reproducible builds, Maven 3.x no longer supports usage of these metaversions in the POM. As a result, users will need to replace occurrences of these metaversions with a concrete version. Maven 3 warnings about build.plugins.plugin.version WARNING 02 : Add encoding properties in pom.xml utf-8 utf-8 SLiPP - maven에서 encoding을 설정하는 방법 maven 프로젝트로 전환하기 googlesearch web convert to maven를 보면 : 주로 eclipse의 m2e plugin을 사용하여 'convert to maven project' 후, depedecy 를 추가해주는 방법이 안내되어 있음 Eclipse에서 Maven 웹 프로젝트 구성하기 [궁금] lib 의존성관리, build를 위해 maven으로 변환하는게 맞는가? side effect는? [궁금] lib pom.xml에 추가하지 않고 자동으로 detect되는 방법은 없나? 없을거같은데... lib자체가 maven repository에서 복사해온 것이라 maven lib 의 이름방식을 따르고 있는데 활용할 수 있는 방법은? [궁금] 애초에 왜 maven 을 사용하지 않았지? 이유가 뭘까? -> PL 에게 물어보기 How to convert a web application project to maven project? 참고 "},"Maven/maven_add_local_jar.html":{"url":"Maven/maven_add_local_jar.html","title":"Maven에서 local jar 추가하기","keywords":"","body":"Keyword maven local_jar Reference 3 ways to add local jar to maven project Can I add jars to maven 2 build classpath without installing them? - Problems of popular approaches Local jars are not included in class path (system) - system scope reference stackoverflow - Adding a jar in WEB-INF\\lib in POM - system scope 메이븐(Maven) WEB-INF/lib jar 파일 추가 - webcontent-dir properties 설정 stackoverflow - How to add local jar files to a Maven project? Maven Repository 가 없는 로컬 jar 파일 을 maven project 에 추가하는 방법 상황/ 궁금증 [발생] maven의 라이브러리 의존 기능만 사용했던 프로젝트를 build기능까지 사용하려고 보니 제대로 build 되지 않는 문제가 발생. [원인] maven central repository 외에 사용하고 있는 local jar(WEB-INF/lib)가 maven dependecies로 관리되지 않음. 기존에는 project classpath에 추가하여 사용. [궁금] local jar 사용하면서 maven build 기능을 온전히 사용할 수 있을까? [궁금] version 이 명시되지 않은 jar는 임의로 versioning 을 하면 되나? 정리 크게 세가지 방법 local Maven repository에 JAR 설치(Install manually the JAR into your local Maven repository) (적용) NEXUS로 자체 저장소 사용(Using Nexus repository manager)(다음 기회에) system scope로 설치없이 사용(Adding directly the dependency as system scope) (하지 말자) local Maven repository 사용 local jar 만 따로 maven repository 를 만듦. 과정 : local jar deploy -> 해당 jar 각각 dependecy 추가 local jar 는 하나의 폴더 밑에 모아져있어서 깔끔해보인다. [궁금] pom.xml 와 같은 위치 (project base dir) 외에 위치해있을때도 가능한가? local jar install 후, dependecy 추가 Nexus 사용 책 메이븐(박재성 지음) local로 관리하고 있는 lib 수가 적고, 프로젝트 차원이 아니라 나만 local에 nexus 사용한다면, System scope "},"Maven/maven_in5min.html":{"url":"Maven/maven_in5min.html","title":"Maven in 5min - 공식문서 실습","keywords":"","body":"Keyword maven build Reference 자바 세상의 빌드를 이끄는 메이븐(박재성지음) - 2장.메이븐 설치 및 템플릿 프로젝트 생성 Maven in 5 Minutes 상황/ 궁금증 [궁금] 서블릿 표준 스펙? 진행 2018/01/12 Tutorial(Maven in 5 Minutes)에서 확장 -> 모르는 개념 검색 보충 :heavy_check_mark: 프로젝트 구조 / pom.xml 어떻게 생겼나 1. Installation Install test mvn --version 2. Creating a Project Using Maven Template(편함.표준이 됨)! mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false or mvn archetype:generate -DarchetypeCatalog=internal : internal의 template 사용 Maven에는 다양한 archetype이 존재. 직접 설정할 수도 있음. [] 공식 - Maven Archetype 3. mvn command mvn [option] [] [] option : (특정 프로젝트 외)전체에서 사용가능. i.e. mvn - version / -D: mvn -Dmaven.test.skip=true test: 여러 goal , phase 실행가능. i.e. mvn clean test 4. Life Cycle phase 실행했을때, 그 이전단계 phase 실행 후에 실행하네? ``` Unlike the first command executed (archetype:generate) you may notice the second is simply a single word - package. Rather than a goal, this is a phase. A phase is a step in the build lifecycle, which is an ordered sequence of phases. When a phase is given, Maven will execute every phase in the sequence up to and including the one defined. For example, if we execute the compile phase, the phases that actually get executed are: 1.validate 2.generate-sources 3.process-sources 4.generate-resources 5.process-resources 6.compile (from.https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html) - 실습 - `//check part!` 는 주석임 - test 전에 컴파일까지 다해주네 PS C:\\Users\\ohah\\Documents\\project\\myfirst> mvn test [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myfirst 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] //check part! resources:resources [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myfirst --- [WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\\Users\\ohah\\Documents\\project\\myfirst\\src\\main\\resources [INFO] //check part! compiler:compile [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myfirst --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding MS949, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\\Users\\ohah\\Documents\\project\\myfirst\\target\\classes [INFO] //check part! resources:testResources [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myfirst --- [WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\\Users\\ohah\\Documents\\project\\myfirst\\src\\test\\resources [INFO] //check part! compiler:testCompile [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myfirst --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding MS949, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\\Users\\ohah\\Documents\\project\\myfirst\\target\\test-classes [INFO] //check part! surefire:test [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myfirst --- [INFO] Surefire report directory: C:\\Users\\ohah\\Documents\\project\\myfirst\\target\\surefire-reports Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 0.8 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-providers/2.12.4/surefire-providers-2.12.4.pom (3 KB at 5.5 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 27.4 KB/sec) //check part! T E S T S Running com.ohah.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.013 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 14.679 s [INFO] Finished at: 2018-01-12T16:38:11+09:00 [INFO] Final Memory: 10M/124M [INFO] ------------------------------------------------------------------------- ------------------ ## Error / 삽질파티 ### Creating Maven Project 1. 상황 - BUILD FAILURE 발생. PS C:\\Users\\ohah\\Documents\\project> mvn archetype:generate -DgroupId=com.ohah -DartifactId=myfirst -DarchetypeArtifactId=maven-archetype-quickstart -Dintera ctiveMode=false [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.136 s [INFO] Finished at: 2018-01-12T16:00:24+09:00 [INFO] Final Memory: 2M/120M [INFO] ------------------------------------------------------------------------ [ERROR] The goal you specified requires a project to execute but there is no POM in this directory (C:\\Users\\ohah\\Documents\\project). Please verify you invo ked Maven from the correct directory. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MissingProjectException > 처음 프로젝트 실행하려고 하는데 왜 안되죠? no POM이겠지. creating project 인데 2. 해결 - `powershell` 을 사용하고 있어서, 구문에 \"\"따옴표 붙인 command 로 문제해결 (참고.[TIL - powershell](Devenv/powershell.md)) mvn archetype:generate \"-DgroupId=com.ohah\" \"-DartifactId=myfirst\" \"-DarchetypeArtifactId=maven-archetype-quickstart\" \"-DinteractiveMode=false\" ``` stackoverflow - Error “The goal you specified requires a project to execute but there is no POM in this directory” after executing maven command "},"Python/exception.html":{"url":"Python/exception.html","title":"exception 예외처리","keywords":"","body":"Keyword exception python exception Reference 점프 투 파이썬 - 예외처리 파이썬 예외 계층도 예제로 배우는 Python jupyter doc Jupyter notebook 이해하기 by Yong Joon Moon 28 Jupyter 노트북 팁, 트릭 및 바로 가기 정리 예외처리에서 배운 것 try..else : else를 굳이 쓸 필요있나? 예외처리가 발생하지 않을때만 else를 실행함. 예외처리하고 싶은 예외만 처리한다. 코드의 의도를 전달하기 좋음. 1번 코드처럼 의도하지 않은 예외(another_operation_that_can_throw_ioerror())발생을 막을 수 있음 try - except try: operation_that_can_throw_ioerror() # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() finally: something_we_always_need_to_do() try - except - else try: operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() else: # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do() 오늘의 코드 try: a = [1,2] print(a[3]) 4/0 except (ZeroDivisionError, IndexError) as e: print(e) 사용자 정의 예외 통상적으로, Exception 을 상속받음. 하위 Exception도 상속이 가능함. ``` class MyError(ZeroDivisionError): def str(self):return \"0으로 나누기 불가함\" def say_divide(a,b): if b == 0:raise MyError() else:print(a/b) try: say_divide(4,2) say_divide(4,0) except MyError as e: print(e) ``` Juypter 단축키 / 매직 명령어 자주 쓰이는 기능 셀에서 command 실행 가능 Esc + h : 도움말 나옴 tab : 자동완성 shift + enter : 실행 shifr + tab : 함수/객체 정보 조회 / '' + ? : '?' 붙이면 내부 정보 '' + ?? : '??' 붙이면 example source 출력 python 예외처리 Juypter 단축키 / 매직 명령어 자주 쓰는 정리 [ ]정규표현식 [ ]파이썬으로 웹 크롤러 만들기 ch.03 "},"python/etc.html":{"url":"python/etc.html","title":"기타","keywords":"","body":" [궁금] 가상환경 A 에서 '가'라이브러리 사용, 가상환경 B 에서 '가'라이브러리 사용한다고 하면, 중복으로 '가'라>이브러리가 설치되는지, 중앙에서 한번 설치하고 참조해서 쓰는 개념인지? 컴퓨터 하드웨어 자원관리 차원에서 중복설치 는 좀... 파이썬에서의 접근자 오늘의 코드를 쓴 이유를 적자 [궁금 / 해결] random.seed() 왜 하죠? etc 참고 random.seed(datetime.datetime.now()) random.seed(3): python random.seed() 예제 : 같은 seed값을 넣으면 같은 난수를 생성함. Random 함수 난수 발생 - C언어 같은 seed 값을 입력하면 같은 값이 생성되므로, 언제나 다른 seed 값을 넣어줘야함. 현실적으로 매번 다른 값 입력하는 것이 불가능하므로 날짜시간같은 항상 변하는 값을 넣어주도록 함. python API : default로 언제나 변하는 값을 seed값으로 함. random.seed(a=None, version=2). Initialize the random number generator. If a is omitted or None, the current system time is used. If randomness sources are provided by the operating system, they are used instead of the system time (see the os.urandom() function for details on availability). Web scraping vs Web crawler wikipedia - Web scraping A Web crawler, sometimes called a spider, is an Internet bot that systematically browses the World Wide Web, typically for the purpose of Web indexing (web spidering). wikipedia - Web crawler Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites.[1] Web Crawling: Data Scraping vs. Data Crawling "},"Refactoring/reference.html":{"url":"Refactoring/reference.html","title":"refactoring 관련 레퍼런스 정리","keywords":"","body":"Reference Refactoring Guru : Refactoring 관련 글과 DesignPattern에 대해 기술되어있는 사이트로 챕터별로 글이 짧기 때문에 빠르게 읽을 수 있음. 리팩토링(책 / 마틴 파울러 저) : 리팩토링의 고전. 처음부터 끝까지 읽기보다 필요할때마다 찾아서 보고 있다. 프로그래밍 수련법 (책) : 좋은 코드가 무엇인가에 대해 생각해보게 함 "},"Retrospect/everyday5fs.html":{"url":"Retrospect/everyday5fs.html","title":"일일 회고 양식 - 5Fs","keywords":"","body":"매일매일 짧게 하루를 되돌아보는 회고 양식 로그 2018/05/30 일일회고를 하면서 내 삶의 방향키가 어디로 가 있는지 들여다볼 수 있었다. 그리고 매일매일 편안하게 마무리 할 수 있었다. 이 시간만큼은 천천히 스스로를 돌아보는 시간이 되었다. 좋아하는 일과 중요하게 생각하는 것들에 도전하는데 도움이 되었다. 더 시간을 쪼개내어 같은 시간에 많은 일을 하는 효율이나 다른 느낌이었다. 그 전에는 해야할 일을 관리하는 것에 집중했다면, 그 일을 왜 해야하는지, 해야할 일로 적어둔 action과 진짜 목적과 갭은 없는지 스스로에게 질문할 수 있었다. 한동안 쉬었던 일일회고를 다시 시작하면서 기록을 정리해 남겨둔다. 오늘을 다시 돌아봄. 그날의 사실 (Facts) : 느낌 (Feeling) : 배운점 (Findings) : 미래의 행동계획 (Future) : 피드백 (Feedback) : 아래를 참고함. From :http://no-smok.net/nsmk/FiveFs 관련 페이지 KeepAJournalToLiveBetter 발췌 당신은 일지를 쓰시나요? 일지를 써서 더 효과적인 사람이 될 수 있습니다. 일지는 단순히 자기 만족적 독백을 넘어서서 하나의 삶의 기술이 될 수 있습니다. (여기서 To Live Better는 AlfredNorthWhitehead가 이성의기능에서 말하는 것과 비슷한 맥락) 매일 호주머니에 작고 얇팍한 메모장과 펜 하나를 넣어다닙니다. 중간 중간 생각나는 것이 있을 때마다 간략히 기록을 합니다. (바쁜 사람은 하지 않아도 괜찮습니다) 하루 중 딱 5분만 투자해서 자신이 하루 동안 경험했던 사실, 그리고 이에 대한 자신의 느낌, 그리고 여기서 배운 것 세가지(ThreeFs)를 압축적으로 기록합니다. 딱 5분입니다. 완결된 문장을 쓸 필요도, 멋을 부릴 필요도 없습니다. 일주일에 한번 딱 30분만 투자해서 그 주에 하루 5분씩 기록했던 일지를 다큐먼트모드로 정리, 압축해서 주기를 씁니다. 한달에 딱 한시간만 투자해서 그 달의 주기를 정리, 월기를 씁니다. Five Fs 발췌 사용예 일기를 쓴다고 치자(see also KeepAJournalToLiveBetter). ThreeFs 대로, 그날의 사실, 느낌, 배운점을 적는다. 그리고 배운점으로부터 미래의 행동 계획을 세운다. 행동 계획은 추상적이면 안된다. 예를 들어 \"앞으로는 남들과 잘 어울리자\" 같은 내용은 행동 계획이 아니다. 구체적인 액션이 드러나지 않기 때문이다. FAP(Future Action Plan)는 구체적이고, 단순하며, 실제로 했는지 안했는지 여부를 객관적으로 쉽게 판단할 수 있는 것이 좋다. 그리고, 피드백이라고 제목만 써 놓는다. 이제 그 주가 끝날 때까지 약 일주일간 해당 행동 계획을 나날이 실험/실행해 간다. 일주일이 지나면 피드백 항목을 채워넣는다. 실제로 일주일 동안 이렇게 해보았더니 효과가 있더라, 어떤게 변하더라, 뭐는 안하는 게 낫더라 하는 내용을 적는다. PeterDrucker의 피드백 분석(Feedback Analysis)과 유사하다. 피드백 항목 아래에 재귀적으로 다시 FiveFs를 적을 수도 있다. FAP를 적을 때에는 그 주(週)의 FAP들을 한 자리에 같이 모아두는 것도 좋다. "},"REST/CLI.html":{"url":"REST/CLI.html","title":"커맨드라인 환경에서 REST API (HTTP) 요청 보내기","keywords":"","body":"Keyword rest rest cli curl Reference 커맨드라인 환경에서 REST API (HTTP) 요청 보내기 (cURL, resty, httpie, Vim REST Control) 상황 / 궁금 정리 "},"REST/postman.html":{"url":"REST/postman.html","title":"API 관련 툴 - post man","keywords":"","body":"Keyword rest rest cli curl Reference Postman doc : v6을 기준으로 함(2018/03/14) intro_to_scripts api-testing-tips-from-a-postman-professional TOAST meetup - Postman 개요 / 설치 / 사용법 / 활용 방법 상황 / 궁금 2017년 업무프로젝트로 HttpAPI 서비스를 제공하면서, API 테스트를 위해 postman을 사용했던 내용을 정리. 정리 Postman 소개 API 여러 파라미터 호출 편하게 하기 테스트를 하다보면, 여러 시나리오를 확인해야할 경우가 있다. test script 작성해 test에 통과하는지 확인 요구사항 : 여러 parameter를 입력하여, 응답결과 (actual result - response data)를 파일로 저장 테스트를 실행하지 않고 단순히 결과 파일만을 저장하는 거면, 간단한 스크립트를 짜는게 훨씬 빠름. (단순하고 빠르게 작업하기 위해서 postman을 실행했는데, 빙빙 돌아가는 느낌) 지금 하고 있는 일이 '기존 tool을 서칭 + 사용 익히는 시간' > '직접 프로그래밍 + 스크립트 작성시간' 인지 아닌지 확인해야한다. 결국 간단한 프로그래밍으로 해결(python3, 코드짜고 결과얻는데까지 15분 걸림.) process 여러 parameter를 입력 -> collection run 실행 입력할 여러 파라미터 입력해 파일 생성해둠 docs postman - working_with_data_files blog postman - using-csv-and-json-files-in-the-postman-collection-runner 착각했던 것 : 쿼리파라미터 znCd에 11, 26 값을 넣어주고 싶었음. url에 를 넣어줌. 아래와 같이 만들었다면 znCd= 로 적어야함.[{ \"path\": \"znCd\", \"value\": \"11\" }, { \"path\": \"znCd\", \"value\": \"26\" }] 를 쓰고 싶다면 json을 아래와 같이 만들어야함. [{ \"znCd\": \"11\" }, { \"znCd\": \"26 }] postman CLI tool인 newman 에서 실행 newman run postman_collection.json -d paramete.csv postman doc - newman-run-collection-file-source-options 참고 collection 파일은 postman에서 export함. GUI 에서 실행 Starting a collection run 미리 만들어둔 collection script 작성 stackoverflow - how-to-export-download-response-body-into-an-external-file-from-postman-collection 에서 힌트를 얻음 blog postman - Write to your local file system using a Postman Collection API response결과를 다시 local server 에 post로 넘겨서 결과를 출력하는 스크립트. Newman to run a collection and writing the file to your disk script 사용시, newman이 설치되었는데도 Error: Cannot find module 'newman' 가 출력됨. [새로운 접근방법] newman으로 collection실행 -> reponse data 를 console.log로 출력 -> 해당 출력값을 파일로 저장 -> 파싱해서 각각의 실행결과를 각각의 파일로 만듦. "},"REST/inbox.html":{"url":"REST/inbox.html","title":"미분류","keywords":"","body":"Keyword rest inbox Reference 상황 / 궁금 2017년 업무프로젝트로 HttpAPI 서비스를 제공하면서, REST API와 비록 당시에 정리해놓은 자료는 없지만, 주요 레퍼런스를 에버노트 클리핑해두어서, 해당 자료 중심으로 정리해보려고 한다. 처음으로 만들고 설계한 API라서 깊이있는 내용보다 레퍼런스들을 중심으로 정리할 예정. 초기 설계는 RESTful의 원칙을 지켜서 설계되었지만, 클라이언트의 사정으로 REST API 요건을 충족시키지 않는 방식으로 진행되어 엄밀히 말하자면 GET방식의 url호출API로 바뀌었음. 해당 API가 서비스할 플랫폼에서 제공하는 'REST API 규약'이 따로 공부한 책과 참고자료와 많이 달라서 혼란스러웠다. 혼란스러웠기때문에 RESTful이 무엇인가 에 대해서 더 고민할 수 있었다. 사족으로 좋은 메뉴얼이란 무엇인가도 더불어 고민할 수 있었음. TODO REST API의 조건 책 슬라이드쉐어 REST API test REST API test란 무엇인가 REST API test tool - postman "},"SCM_etc/CD_CI.html":{"url":"SCM_etc/CD_CI.html","title":"CD_CI","keywords":"","body":"Keyword Jenkins CI CD Reference 조대협의 블로그 - 배포 자동화 (Continuous Deployment) AWS - 지속적 통합이란 무엇입니까? jinTonic Bruch - CI(Continuous Integration? happystory Tistory - 지속적인 통합 (CI: Continuous Integration) [GIT] CI(continuous Integration)란 & travis 사용법 CI (Continuous Integration) 이란? 자바 세상의 빌드를 이끄는 메이븐 - 박재성 지음 - CI 툴을 활용한 자동화 p.26 Gitlab - A beginner's guide to continuous integration Jenkins 젠킨스(Jenkins)를 이용한 지속적 통합(CI:Continuous Integration) (2) - 젠킨스씨가 있는 개발풍경 젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해 젠킨스 파이프라인 사용하여 자동 배포환경 만들어보기! Docker를 Jenkins 슬레이브로 사용하자 상황 / 궁금 [궁금]기술스택에서 본 Chef 랑 Jenkins랑 docker가 CI, CD 랑 연관된 건 알겠는데, CI, CD가 정확히 뭐지? [궁금/해결중] 지금 시작하는 petProject에 적용할 수 있을까? '배우는 비용 자동화 주기적으로 빌드 실행해서 데이터베이스 초기화,단위 테스트 실행, 소소 코드에 대한 품질 리포트 생성 등의 작업을 자동화된 빌드 스크립트를 사용해서 자동화해줌! 상상해보자! 버전관리시스템에 commit하는 순간, 전체 단위 테스트 실행 -> 결과 report 피드백이 온다니! (from '메이븐(박재성지음)-1장. 내가 꿈꾸는 개발환경' 편집/발췌 ) "},"SCM_etc/gitlab.html":{"url":"SCM_etc/gitlab.html","title":"Gitlab","keywords":"","body":"Keyword gitlab git Reference 상황/ 궁금증 회사 프로젝트 중 개인 관리하는 프로젝트를 gitlab으로 옮김. 옮기기로 결심했던 큰 이유는 내가 가지고 있는 자료가 체계적으로 관리되지 않음, 공유가 불편함, text기반의 기록으로는 실제 코드 및 프로젝트 구조와 연관시키기 어렵다는 한계를 느꼈기 때문. 개인적으로 협업 프로젝트를 하면서, 사용했던 github-flow 를 쓰면서 자연스럽게 task 관리(한 번에 할 수 있을만큼 작은 단위로 나누는 연습, 누가 담당할지 assign), 쉬운 코드 리뷰 피드백, 나중에 재확인 가능(history) 이 인상적이었다. SLiPP에서 테스트기반 스터디를 들으면서, 개인차원의 관리에서 좀 더 나아가, 매끄럽게 공유될 수 있는 문화가 뭘까 생각하게 되었고, 개인노트를 share하기 위해서 wiki를, issue tracking 까지는 아니더라도 적어도 발생하는 issue 및 bug를 기록하는 것 자체로 의미가 있겠다는 확신이 들었다. 이 시스템?을 적용할 대상 모듈은 현재 혼자 관리하고 있고, 이번년도에 전체 담당팀이 바뀔 수도 있어서, 처음시작부터 끝까지(적어도 퇴사전) 내용을 아는 사람이 나 혼자임에도 잘 share가 잘 안되고 있다는 생각. 프로젝트 담당팀이 넘어가거나, 인수인계가 제대로 되지 않아서 계속 고생해왔던지라 최소한 다른 개발자가 볼 수 있는 문서는 만들어야 하지 않을까 고민에서 시작됨. 혼자 관리하는 프로젝트인데 issue tracking 까지 필요할까? 라는 의문이 들어서 다른 개발자 분들에게 물어봤었음. 다른 개발자 분들이 혼자 issue tracking 쓴다고 해도 history가 남는 이점, 일 관리(뭐했니? 이거했어요.) 등 도입했을때 괜찮은 여러 관점을 이야기해주셔서 막연하게 '썼을때 좋았었어' 에서 실제로 가치가 있겠구나 확신을 가지게 됨. 지금은 최대한 관리비용을 줄이면서(귀찮으면 오래 못씀) 효율적으로 관리할 수 있는 방법이 뭘까 고민 중. 진행 svn 에서 gitlab으로 옮기면서 주의해야할 점을 기술. 업무에서 issue 관리는 처음이다보니, 관리비용과 협업할 사람(인계받을 사람)이 명확하게 알아볼 수 있을 정도로 기술 하는 것 사이에서 균형찾기가 key가 되지 않을까? open source 급으로 잘 관리되면 좋겠지만, 다른 사람이 봤을때도 이어갈 수 있을정도로 귀찮지는 않게 정도의 간격은 뭘까 결국 소통에 대해서 깊게 고민하게 될 것 같다. "},"SCM_etc/svn.html":{"url":"SCM_etc/svn.html","title":"svn","keywords":"","body":"Keyword svn Reference Version Control with Subversion 1.7 - eBook svn 변경사항 확인 svn command로 확인svn diff -r (비교구간)revision시작번호:revision끝번호 --summarize svn log 확인 최근 10개의 로그 확인. local에서 commit했더라도 다시 서버에서 update 를 받지 않으면, local commit log가 뜨지 않음. revison 20 으로 local에서 commit함. 현재 프로젝트 상태가 revison 19에 있으면 19까지의 log만 보임 svn log -l 10 상황 / 궁금 오픈API프로젝트에서 개발내용을 운영서버에 반영하려면 수정된 소스파일 + 클래스파일 리스트를 정리하여 전달해야함 eclipse에서 svn history로 변경파일click -> 눈으로 path위치 찾기 -> 소스파일 properties -> path 복사 의 과정을 거침. 정말 오래걸리고 못할 짓임. 찾은 방법: PowerShell(window)를 사용해 command로 확인 해당 revison 번호를 eclipse의 매번 찾아야함. [궁금] A.svn command 상에서 log 확인 방법 [궁금] B.배포를 이 방식으로 해야만하는걸까? CI(지속가능한 통합)가 편리하다는 말은 들었는데 그게 뭐지? A. check svn log (in CLI) "},"SCM_etc/svn_modifiedFile_script.html":{"url":"SCM_etc/svn_modifiedFile_script.html","title":"SVN 변경파일리스트 작성 자동스크립트","keywords":"","body":"Keyword powershell script automation Reference TIL - svn The Java™ Tutorials - PATH and CLASSPATH [Java] CLASSPATH의 정의 및 설정 방법에 관한 기술 문서 stackoverflow - how-can-i-list-all-classes-loaded-in-a-specific-class-loader 클래스로더 1, 동적인 클래스 로딩과 클래스로더 google search classloader list class파일내에서 classpath에 존재하는 리소스 파일읽어오기 특정 package 목록에 포함된 class 목록 가져오기 powershell script Test-Path and If Powershell - Test-Path if a file exists within a folder // RegExp 참고 A better way to check if a path exists or not in PowerShell 상황/ 궁금증 openAPI 프로젝트 운영계 특성상, 외부와 deploy가 막혀있어서 classfile, sourcefile 수동으로 복사해서 서버에 반영해야함. 변경 source 파일이 한두개가 아닌지라, source, class 파일 txt로 리스트만드는 것도 일이라 자동화할 수 있는 powershell 스크립트 만듦. [궁금] java classLoader 사용하면 mapping된 class 파일 가져올 수 있지 않을까? [궁금] resource 파일은 정규표현식으로 검색해야하나? (path명 규칙에 따라 변경 - 확장자명 제외한 파일이름으로 검색) [궁금] classpath 매핑을 어떻게 되어있지? 진행 스크립트 단계 기술 -> 스크립트 작성 svn revison number 사용해 svn 변경사항 확인 내용을 'svnlog.txt'로 기록 svn diff -r (비교구간)revision시작번호:revision끝번호 --summarize 변경 파일과 매핑되는 class 파일 path 기록 변경종류에 따라 파일 패스만 남도록 정규화 'M','A' 는 변경, 신규 파일이므로, path만 남도록 정규화 'D' 는 삭제 파일이므로, '### 삭제 파일' 문구 뒤로 모아둠. ('삭제파일'이전 path만 해당) 해당 class 파일이 존재할때, 'svnlog.txt'에 덧붙여 기록 기록된 source 파일 path 이용하여 변경하여, 검색 If(Test-Path path/classname.class) { >> WEB-INF/class/ExcelView.class svnlog.txt } "},"SCM_etc/Trello.html":{"url":"SCM_etc/Trello.html","title":"Trello","keywords":"","body":"Keyword teamproject kanban trello Reference cardsync : 여러 보드간 동기화 플러그인 pomodone : trello card 단위로 pomodoro 하는 timer(기타 todoist 등 다른 프로그램과도 연동 지원) 절반시간으로 실행하기(김창준 애자일 블로그) 상황 / 궁금 '17년 세 개 프로젝트(맙소사...)를 맡게 되니 기존 방식인 에버노트 정리로는 프로젝트 진척사항, 과업들을 한 눈에 보기가 힘들었다. '프로젝트 = 보드' 로 만들어놓고 과업을 task로 세부 과업을 checklist로 관리함. kanban + pomodoro 형태를 합쳐서 시도. (흥미롭게 보던 소프트웨어스킬 책에서 pomodoro와 kanban을 추천해서 시도해보게 됨) 주간 단위로 내가 맡은 과업을 정리함. 프로젝트 과업 외에도 회사에서 해야하는 정기일정을 보드에 setting 해놓음 17년도 프로젝트 외 일정 : 일간/주간 계획세우기 주간보고, 일과 전 아침 공부, 일과 후 일일공부내용 정리, 나중에 보려고 둔 article(inbox) [시도] '주간할일' 보드가 따로 있어서 보드간 중복되는 card가 발생함 -> 'cardsync' + 'attachement - trello(related both card)' 사용 pomodoro 나에게 맞는 pomodoro시간단위를 찾게 됨 programming할때는 task를 50분 단위(2 pomodoro) , 일일 계획 15분(0.5 pomodoro),... 3pomodoro 하고 longbreak 15분 쉼. evernote에 적은 pomodoro 실행 기록 회고 Fact Feeling Find FutureAction FeedBack pomodoro를 할 때와 안할때 집중되는 기분이 달랐다 갑자기 마감이 생긴 작업(오늘 15시까지 00해주세요,당장 고쳐야하는 bug fix,...)이나 문서작업의 경우 pomodoro를 까먹고 쭉 두세시간 연속으로 작업함 3 pomodoro 를 온전히 집중해서하고 나면 탈진한 것 처럼 힘듦. 3pomodoro * 2회를 하는 날엔 와우 기분이 좋다. 일의 속도가 엄청나다! 주로 오후 16시 사이 longbreak를 하게 되는데 이후에 다시 pomodoro 시간단위에 맞게 task를 정리하는 것이 큰 진입장벽이었다. 하지만 task 정리하면서 모호했던 목표를 가시적으로 볼 수 있게 되는 연습이 됨. 절반시간으로 일하기로 중간중간 목표,일 내용 점검하고 task나누기가 합쳐지니 감동적이었다. 첫 오픈API 개발이라 뭐부터 시작해야할지 막막한 상황에서 도움을 정말 많이 받았다. 일과 전 후 계획세우기, 일과 전후 학습/내용정리 하니 습관적으로 보게 된다. 빼먹는 날도 많아서 아직 고정습관까지는 아니다. 3개월 정도 실행해보고 나니, 느낌적 느낌대신 객관적 지표를 찾고 싶어서 time Tracking, 기록 tool을 많이 찾아봄. tool 찾는 것에 너무 집중해서 주객이 뒤바뀜(tool사용하고 찾느라 일을 안함...) "},"Spark/spark_concept.html":{"url":"Spark/spark_concept.html","title":"Spark 레퍼런스정리","keywords":"","body":"Keyword spark spark concept Reference 상황 / 궁금 '모두의연구소 DataLab- 분산처리연구'에서 진행한 내용을 포함함 정리 "},"Spark/spark_sql.html":{"url":"Spark/spark_sql.html","title":"Spark SQL정리","keywords":"","body":"Reference spark doc - Spark SQL Mastering Spark SQL by jaceklaskowski Spark SQL RDD 장점 분산환경에서 메모리 기반으로 빠르고 안정적으로 동작하는 프로그램 작성 풍부한 데이터 처리 연산 but 아쉬운 점. metadata-schema 표현방법이 따로 없음 (Schema?) 이를 보안하기 위해, 다른 유형의 데이터 모델, API 제공하는 스파크 모듈 SQL 처리 + Dataset API SQL : ansi sql , hive-sql p.248 간단 실습 ds.printSchema Dataset 분산 오브젝트 컬렉션 프로그래밍 모델 Dataframe API - 풍부한 API + 옵티마이저 - 복잡한 데이터 처리 수월하나, 복잡한 코드, 예외처리 사용어려움 dataframe 대신(호환성 제공). 현재 Spark 2.3 Dataset API 지원하지 않음 - Python,R Spark SQL Guide 참조 값 + 스키마 정보 -> 데이터 처리 + 내부 성능최적화 제공 RDD + 기존 dataframe 대부분 기능 지원 Row 타입 데이터셋 트랜스포메이션, 액션 연산 transforamtion : 새로운 데이터셋 생성 연산. action 연산 호출될때까지 수행되지 않음 action : 데이터처리 수행, 결과 생성 연산 RDD와 차이점 typed operation / uptyped operation 으로 나뉨 uptyped operation : val ds = data.toDS val ds = ds.map(_+1) // 각 요소에 1을 더함 같은 의미 - table과 유사하게 처리 (col(\"~\")) - int가 아닌 ~.sql.Column 타입ds.select(col(\"value\")+1) -> table row, column 해당하는 타입 정의, 로우와 칼럼 타입으로 감싸서 처리 정리 org.apache.spark.sql.Row 타입 요소로 구성된 데이터셋 가리키는 용어 Dataframe 연산 - untyped operation 주요 구성요소 Spark SQL API Spark session : spark context -spark shell Dataset : 분산 데이터 모델. Since Spark 1.6 DataFrame : ~.sql.Row database Table,R dataframe / Row 타입 요소 구성된 데이터셋 DataFrameReader: 다양한 유형 데이터소스로부터 데이터프레임 생성 메서드 제공. read() 메서드 통해 접근 DataFrameWriter: 다양한 저장소에 저장할 때 사용할 수 있는 메서드 제공 Row, column : DataFrame 구성요서 표현 모델, API, 대부분의 method function : 집계함수, 통계 함수 제공. 많이 쓰임 StructType, StructField : 데이터에 대한 schema 정보 나타내는 API. 중첩구조 표현이 가능. spark-sql-StructType by jaceklaskowski GroupedData, GroupedDataSet : 그루핑,집계 연산 Spark SQL 코드 작성 스파크세션 생성 스파크세션으로부터 데이터셋 또는 데이터 프레임 생성 생성된 데이터셋 또는 데이터 프레임을 이용해 데이터 처리 처리된 결과 데이터를 외부 저장소에 저장 스파크세션 종료 실습코드 https://github.com/wikibook/spark/blob/master/Python/ch5/spark_session_sample.py appname, master 정보 설정 DataFrameReader instance 이용해 데이터로부터 데이터프레임 생성. DataFrame 연산 / untyped operation - Row, column "},"Spring/spring_in_action.html":{"url":"Spring/spring_in_action.html","title":"Spring in Action 책 정리","keywords":"","body":"Keyword in Action spring 상황 DI, AOP 등 핵심패러다임에 대해 정의를 다른 사람에게 설명할 수 없다. 먼저 해당 패러다임에 대해 정의 수준이라도 제대로 설명할 수 있는 수준까지 만드는게 목표 작년 사내주니어 스터디했던 Spring in Action 책을 기반으로 핵심개념에 대해 다시 정리한다. 배운 것 정리 Spring의 목적은 자바 개발 간소화 어떻게 자바 개발을 간소화 시킬 것인가? (4가지 측면에서) "},"Spring/springboot_in_action.html":{"url":"Spring/springboot_in_action.html","title":"스프링부트 코딩 공작소 책 정리","keywords":"","body":"Keyword in Action spring boot 상황 'TDD,리팩토링,클린코드' 자바지기 강의를 들으면서, ATDD 실습프로젝트에서 스프링부트가 나옴. JPA,spring boot, mock 모두 너무 낯설어서 자바지기에세 공부 우선순위를 물어봤는데 spring을 현업에서 사용하고 있으면 springboot 먼저 공부해보면 어떻겠냐는 답변을 들었다. 고른 책은 '스프링부트 코딩공작소(길벗)'으로 2016년 도서로 원제를 보니 in action 시리즈 중에 하나다. 스프링부트 2.0이 나온 시점에서 최신판을 다룬 책을 볼까 했는데 개념을 이해하기에는 이 책이 더 나을 꺼라는 판단이 들었다. 스프링부트 튜토리얼이 잘 되어있기때문에 튜토리얼과 함께 좀 더 개념적인 부분을 익혀서 써보려고 한다. 좋은 원서로 볼까 했는데, 영어,개념 두가지에 동시에 신경쓰는 것보다 처음 개념을 잡을때는 익숙한 말로 배우는게 낫다는 생각이 들었다. 영어를 원어민 수준으로 하는게 아니라면 새로운 걸 배우는 시점에서 먼저 한글로 된 책으로 빠르게 개념에 익숙해지는게 낫지 않을까? 배운 것 정리 1장. 스프링부트 소개 한 줄 요약: 스프링부트는 구성 및 설정작업을 간단하게 할 수 있어서 개발자가 비즈니스 로직에 집중하게 도와준다. 비즈니스 로직에 집중하게 해준다. 복잡한 설정과 반복되는 설정은 스프링부트가 처리한다. 스프링으로 웹 어플리케이션 개발시에 항상 해주어야하는 구성 작업은 개발자가 아닌 스프링부트가 한다! 두 가지 저항을 줄임 : 애플리케이션 로직 작성 외에 구성작업에 쓰이는 시간, 의존성 관리(의존 라이브러리 추가 등) 크게 네가지 특성이 있음 : 자동구성, 스타터 의존성, 명령줄인터페이스(cli), 액추에이터 04/26까지 이해한 것 액추에이터: 작동 중인 애플리케이션의 내부를 살펴볼 수 있는 기능 제공! / 7장에서 더 스타터 의존성 : 어떤 기능(예. JPA, security)를 사용하려면, 그에 맞는 라이브러리를 직접 추가할 필요없이 그저 스타터 의존성을 사용해서 해당기능을 끌어오면 된다.(스타터가 이미 라이브러리 호환성까지 체크해두어 버전을 고민할 필요도 없음) 자동구성 - 어떻게 클래스패스 참고해서 자동구성하는지? [추가]-이해가 더 필요함 예를 들어 스프링 부트가 애플리케이션 클래스패스에서 H2 데이터베이스 라이브러리를 발견한다면 내장 H2 데이터베이스를 자동으로 구성할 것이다. JdbcTemplate이 클래스패스에 있다면 JdbcTemplate빈도 구성할 것 이다. 이런 빈을 구성하는 작업은 하지 않아도 되는데 스프링 부트가 빈을 자동으로 구성하여 여러분이 작성한 빈에 주입(Inject)할 준비를 해준다. springboot cli 스프링 부트 CLI는 개발자가 코드 작성에만 집중할 수 있도록 스타터 의존성과 자동 구성을 활용한다. 스프링 부트 CLI가 어떤 타입을 사용했는지 발견하여 이 타입이 작동할 수 있게 클래스패스에 알맞은. 스타터 의존성을 추가하기 때문이다. 이 의존성이 클래스패스에 있으면 일련의 자동 구성이 일어나서. HTTP 요청에 컨트롤러가 응답할 수 있도록 DispatcherServlet과 스프링 MVC를 활성화한다. 이걸 사용하면 코드 컴파일할 필요조차 없음 스프링부트의 오해 스프링부트는 애플리케이션 서버가 아님 commandline으로 실행할 수 있는 jar파일로 웹 애플리케이션을 개발할 수 있어서 그렇게 보임. 스프링 부트는 톰켓과 같은 서블릿 컨테이너를 포함하고 있기 때문에 jar로 실행되는 것뿐임. 내장 서블릿 컨테이너가 애플리케이션 서버기능을 실행하는 것일뿐 스프링부트 자체가 제공하는 것은 아님. JPA나 JMS 같은 엔터프라이즈 자바 명세를 구현하지 않음. 스프링 부트가 엔터프라이즈 기능을 지원하는 빈들을 자동으로 스프링에 구성하기 때문에 엔터프라이즈 자바 명세를 몇 가지 지원하기는 한다. 예를 들어 스프링 부트는 JPA를 구현하지 않지만 하이버네이트(Hibernate) 같은 JPA 구현체에 대응하는 빈을 알맞게 자동 구성하여 JPA를 지원한다. 스프링 부트는 자동 구성을 하려고 어떤 형태의 코드도 생성하지 않는다. spring 4.0의 조건부 구성기능이나 maven, gradle 의 의존성해결기능을 활용해서 애플리케이션 컨텍스트에 자동으로 빈을 구성하는 것임 7장. 스프링부트 테스트하기 한 줄 요약: 테스트의 의미 애플리케이션이 예상대로 동작하는지 확인하는 것 테스트가 실패한다면 더 해야할 일이 남은 것이다. 테스트를 통과한다면 목표에 잘 도달한 것이다. 적어도 작성할 수 있는 테스트가 더 있다는 것을 알기 전까지는 말이다. 애플리케이션을 계속해서 발전시키는 과정에서 오류 발생을 잡아낼 수 있는 안전장치이다. [내가 추가] 잘 작성된 테스트케이스는 해당 애플리케이션 기능에 대한 이해를 돕는다. 오픈소스 분석에서 테스트케이스를 보면서 감을 잡듯이. 스프링에서의 테스트 스프링 특성인 느슨한 결합, 인터페이스 기반 설계, POJO 사용으로 unit test가 용이함 통합테스트를 위해서는 각 컴포넌트를 구성하고 연결하기 위해 (실제 애플리케이션에 스프링을 사용하듯이) 스프링의 설정과 구성을 사용해야함 [내가 추가] 처음 스프링 프로젝트에 테스트를 작성할때, 메소드 단위의 유닛테스트를 하다가 다른 컴포넌트를 불러와서 테스트를 할때 계속 에러가 나서 당황한 적이 있다. 그 떄를 잊지 말자... 스프링 프레임워크가 수행하는 가장 핵심적인 작업은 애플리케이션을 구성하는 컴포넌트를 모두 연결하는 것이다. 스프링은 컴포넌트 검색과 자동 연결(Auto wired) 등 부가적인 기능과 캐싱, 트랜잭션, 보안 등 선언적인 기능을 제공한다. 스프링이 하는 모든 일을 감안하면 복잡한 일은 (통합 테스트에서조차도) 스프링에 맡기는 것이 가장 좋다. 스프링 애플리케이션을 통합테스트할때는 출시환경에서 실행할 때와 동일한 방식으로 테스트 대상 빈을 연결하는 것이 가장 중요하다. SLiPP의 테스트기반 스터디(2018/04/04 6주차)에서 작성한 코드를 스프링 context를 불러올떄 테스트환경에서만 동작하도록 config를 설정한 부분을 고치도록 코드리뷰 받았었음. 통합테스트를 위한 구성 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ReadingListApplication.class) public class AddressServiceTest { @Autowired private AddressService addressService; //... } 스프링에서는 application context를 가져오기 위해 @ContextConfigutation사용하지만, 스프링부트의 기능을 사용하기 위해 @SpringApplicationConfiguration사용 @Autowired하여 애플리케이션 컨텍스트에서 테스트로 빈을 주입함. 테스트대상인 빈을 테스트에 autowired(자동연결)함 [ ] 이하 내용 정리 중 Mock이란? controller 처럼 동작하도록 해줌 웹 어플리케이션 테스트가 POJO 메소드와 다른 이유 두가지 방법 스프링 MVC mock사용 웹 서블릿 엔진 사용한 테스트 두번째 코드 분석 추가 태그 알기 : autowiring / controller DI 좀 이해해보자 나도 쫌! repository 가 뭔거지... 정적임포트 사용해서 코드 간결하게 만들기 - static하지 않으면 사용할 수 없음. static해서 메모리에 올리는게 비효율적으로 자원관리하는 것인가? 해보기 springboot cli 설치 : 참고 - 공식문서 10. Installing Spring Boot 먼저 brew tap pivotal/tap 해야함. 해당 리포지토리(pivotal/tap)를 가져와서 관련 fomulae가 있는 tab을 가져와야함. brew install springboot 정말 생맥주 tab따듯이 tap 이라는 명령어를 쓰는구나! 재미지다. "},"Python/basic.html":{"url":"Python/basic.html","title":"Basic","keywords":"","body":"개요 python 언어 자체를 다룬 강의나 책을 본 적이 없음. 데이터사이언스 책에서 나오는 python으로 봄. 기초 문법 강의로 python을 다시 공부하면서 몰랐던 부분을 정리 python3 기준 참고 Beginners Guide - Python for Programmers python Doc python tutorial standard input/ output input doc input() print doc - print() print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) separated by sep and followed by end print(9,8,7) : 9\\n8\\n7\\n print(9,8,7,sep='\\n'): 9\\n8\\n7 == print('9\\n8\\n7') ``` print(9,end='') print(8, end='') print(7)print 987 print(9,end=' ') print(8, end=' ') print(7) print 9 8 7 ``` Type Conversion print(str(2)+ str(5)) >> 25 print(int(3.8)) >> 3 print(float(3)) >> 3.0 print(int(\"2\")+ int(\"5\")) >> 7 단순 문법 print(2 ** 3) >> 8 / print(2 ** 3.0) >> 8.0 print(4 / 2) >> 2.0 : 나눗셈 연산 무조건 결과값 floating point print(\"Hello\" * 3) >> HelloHelloHello print(\"%d일 %s요일. %.2f\"\" % (day + 1, \"월\", (1.0 / 3))) >> 13일 월요일. 0.33 String word = \"qwer\" print(word[0]) # q 반복문 - for Using with range statment(range(start, stop[, step])) API/tutorial ```python for i in range(0,10): print(\"Say Num\", i)) # 0 ~ 9 for n in range(6,0,-1): print(n) # prints [6, 5, 4, 3, 2, 1] for fruit in ['사과', '딸기', '복숭아']: print(fruit) sample_str = 'Python' for letter in my_str: print(letter) for letter in 'python': print(letter) singers = ['Aretha Franklin', 'Ray Charles', 'John Lennon'] for i, singer in enumerate(singers): print('{}번: {}'.format(i + 1, singer)) - 입력받은 문자만큼(띄어쓰기 유지) 멍멍을 출력 (e.g. 우리 모두 춤춰요 -> 멍멍멍멍 멍멍멍멍 멍멍멍멍멍멍) ```python user_input = input().split(\" \") for word in user_input: for letter in word: # for i in range(len(user_input)): # for j in user_input[i]: print(\"멍멍\",end='') print(\"\",end = ' ') count 숫자 에서부터 1까지 하나씩 줄어들면서 출력 ```python count = 10 for i in range(10): print(\"count: \", count) count-=1 for i in range(0,count): print(\"count: \" , count - i) for i in range(count,0,-1): print(\"count: \",i) - 함수 객체 : 함수 정의로 생성된 값. 함수의 이름은 함수 객체를 참조하는 변수. ```python def do_twice(func, arg): func(arg) func(arg) # not print_twice()! 함수 객체를 참조하는 '변수'인 함수 이름을 적어야하므로 do_twice(print_twice, 'spam') "},"Python/etc.html":{"url":"Python/etc.html","title":"etc","keywords":"","body":" [궁금] 가상환경 A 에서 '가'라이브러리 사용, 가상환경 B 에서 '가'라이브러리 사용한다고 하면, 중복으로 '가'라>이브러리가 설치되는지, 중앙에서 한번 설치하고 참조해서 쓰는 개념인지? 컴퓨터 하드웨어 자원관리 차원에서 중복설치 는 좀... 파이썬에서의 접근자 오늘의 코드를 쓴 이유를 적자 [궁금 / 해결] random.seed() 왜 하죠? etc 참고 random.seed(datetime.datetime.now()) random.seed(3): python random.seed() 예제 : 같은 seed값을 넣으면 같은 난수를 생성함. Random 함수 난수 발생 - C언어 같은 seed 값을 입력하면 같은 값이 생성되므로, 언제나 다른 seed 값을 넣어줘야함. 현실적으로 매번 다른 값 입력하는 것이 불가능하므로 날짜시간같은 항상 변하는 값을 넣어주도록 함. python API : default로 언제나 변하는 값을 seed값으로 함. random.seed(a=None, version=2). Initialize the random number generator. If a is omitted or None, the current system time is used. If randomness sources are provided by the operating system, they are used instead of the system time (see the os.urandom() function for details on availability). Web scraping vs Web crawler wikipedia - Web scraping A Web crawler, sometimes called a spider, is an Internet bot that systematically browses the World Wide Web, typically for the purpose of Web indexing (web spidering). wikipedia - Web crawler Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites.[1] Web Crawling: Data Scraping vs. Data Crawling "},"Tensorflow/learning_tensorflow.html":{"url":"Tensorflow/learning_tensorflow.html","title":"learning_tensorflow","keywords":"","body":"Keyword Learning tensorflow tensorflow basic 상황 모두의 연구소 TF-Pattern Study 를 하면서 진행한 Learning Tensorflow 내용을 복습 정리 Reference 책 3분 딥러닝 텐서플로우 맛 책 Learing Tensorflow TF 공식 Doc 스터디 발표자료 2018/06/22/ 금 스터디진도에 해당하는 책도 이해가 잘 안되는 상황. 더 욕심내지 말고 책내용을 충실하게 따라가는 것으로 목표를 잡음 실제 프로젝트를 해본 경험이 전무하다보니 중요부분이 어떤 것인지 감이 오지 않는다. 1주차 학습목표 : 텐서플로우 코드가 갖춰야 할 기본 구조 이해하기 Learning Tensorflow Chapter 1~ 3 공부 : 환경 설치, github, 연산 그래프, 그래프, 세션, 페치, 텐서의 흐름 ,변수, 플레이스홀더, 간단한 최적화 2주차 학습목표 : training/ evaluation에 필요한 dataset 준비하기 , Model training loop 및 pipeline을 구현한다 전처리 효율적인 I/O (queue / Threading) 다양한 데이터 셋에 대한 범용성 디버깅 로그 관련 tf API: tf.data tf.gflie tf.python_io.TFrecord L.T. : Chapter 4, 8 공부 : 3주차 학습목표 : training/ evaluation에 필요한 dataset 준비하기 , Model training loop 및 pipeline을 구현한다 전처리 효율적인 I/O (queue / Threading) 다양한 데이터 셋에 대한 범용성 디버깅 로그 관련 tf API: tf.data tf.gflie tf.python_io.TFrecord Learning Tensorflow Chapter 7, 10 공부 (이 주는 책보다 API 문서등으로 주로 공부) 4주차 학습목표 : 텐서 보드 시각화와 시계열 데이터를 다뤄보자 관련 tf API: tf.nn tensorboard summary Learning Tensorflow Chapter 5, 6, 공부 "},"Tensorflow/tensorflow_gogo.html":{"url":"Tensorflow/tensorflow_gogo.html","title":"tensorflow 약간 정리","keywords":"","body":"tf.layees vs nn get_collection - variable 확인할때 유용 - http://eyeofneedle.tistory.com/24 무얼 선택해야할까? low level 설정, 얼마나 customize 할 수 있는가? 에 따라 tf.estimator reference : https://www.tensorflow.org/api_docs/python/tf/estimator tensorflow의 scikit-learn 느낌 wrapping! 모델 customize가 어렵 구글에서 관심을 가지고 미는 코드? 계속 업데이트가 되고 있음. 아직까지는 시기상조? tf.train ref https://www.tensorflow.org/api_docs/python/tf/train Optimizer, saver 를 많이 씀 발표자는 tf.train.exponential_decay 대신 조건문 걸어서 사용함. tf.test ref: https://www.tensorflow.org/api_docs/python/tf/test multi GPU controll시에 사용했음. 발표자는 그 외에는 잘 사용안함. TF Record comprepssion! 복잡하더라도 전처리를 해서 나중에 큰 데이터 쓰기 편하게. 빨라짐 단점 - 번거로워요 related : hdf5 tf 는 그정도로 편하지 않음 - session 열어서 접근해야하기때문에 단일 이미지가 어느 정도 크기 이상이면 에러가 남 - 고화질 3D 이미지같은 TF data ref : https://www.tensorflow.org/api_docs/python/tf/data repeat() Tip. repeat 횟수를 정하지 말고, 계속 돌리긔. 모니터링 하다가 더 이상 개선되지 않으면 그때 stop tf.py_func ref: https://www.tensorflow.org/api_docs/python/tf/py_func python type 을 사용할 수 있게 해줌 대신 또 wrapping한거라서 느려질 수 있음. 하지만 시간 차이 엄청나는 것도 아니고 편리하니까여 tf.data TensorFlow - Develop - Programmer's Guide - Importing Data tf.gfile glob 구현. 안에서 쓰기 편하도록. checkpoint 특정 layer의 weight 지점에서 save해서 나중에 load weight 만 불러오는게 왜 중요하죠? tf.keras 현재 tensorflow 안에 keras가 있으나 조금 느림 tf tf.slim 으로 학습된 모델을 그대로 쓸 수 있음 모델 자체의 slim이 아니라 코드가 slim with 구문의 argument 정의해서 Model exporting saver more. 가장 가까운 시점의 checkpoint get more. restore() MetaGraphDef Serving "},"Tensorflow/tf_dev_summit_modulabs.html":{"url":"Tensorflow/tf_dev_summit_modulabs.html","title":"tf_dev_summit_modulabs","keywords":"","body":"Keyword tensorflow.js tensorflow Reference 행사 페이지 발표자료 [Real-World Robot Learning / 최석원] (https://www.slideshare.net/modulabs/rearworld-robot-learning) - 2. TF.data & Eager Execution / 김보섭 - 3. Debugging with tensor board / 이준호 TF.data / 신성진 - 5. TensorFlow.js & Applied AI at the Coca-Cola Company / 민규식 - 6. Machine Learning on Your Hand - Introduction to Tensorflow Lite Preview / 강재욱 흥미로웠던 것들 모두의 연구소- Datalab3 분산처리 랩에서 다함께 들으러 감. TensorFlow Dev Summit 2018에서 발표된 내용을 정리하여 모두연 연구원들이 발표함. TensorFlow 는 까막눈이었는데도 재밌는 발표가 있었음. 더 내용을 알고 있었다면 재밌었겠다는 아쉬움이 깊이 남음. Real-World Robot Learning 로봇팔로 물체 집기 CNN으로 일부만 사용 로봇팔에 카메라 - 위치 2D정보 / 시뮬레이션 / 로봇 위치에 따라 잡을 확률 학습 PIXEL Level ~ : Generator - real-like 하게 시뮬레이션 Feature Level ~ : 도메인간 차이에서 나는 차이를 줄임 둘 다 기존에 존재했음. 합쳐보면 어떨까? 합쳐서 학습시킴 Result - sim-only(=시뮬레이션 only) tf.data, Eager Execution tf.data : 대용량 데이터를 처리하기 위해선 Input pipeline이 중요하져 placeholder써서 내 컴 메모리에 다 올릴 순 없잖아여ㅠㅠ 그러니까 tf.data 써서 올리세여 tf.data 어려운데여 tf.data 특성 ETL for tensorflow Code ex - Linear regression using tf.data : 함수형 프로그래밍처럼 구성 쓰는건 tf.placeholder랑 크게 다르지 않아요 Eager Execution : pytouch처럼 쓸 수 있게 해주겠다? 동적으로 numpy처럼 세션이 없어요 numpy와 좀 더 심리스해진 거 같아요 쓰세여! An intutive Interface,... python datastructure 처럼, numpy와 심리스하게 , 디버깅이 쉬우니까 하지만 단점도 있어여 - 이미 기존 방식에 정말 익숙하다면 안쓰셔도 뭐... 코드가 많이 바뀌어요 정적과 동적의 차이 - 대용량에서 실제 퍼포먼스는 어떨까...? summit 에서도 small data 프로토타입에서 쓰라고 함 multi GPU, multi CPU가 안돼여 하지만 이제 배우기 시작하셨다면 꼭 쓰세여 tf tutorial 보면 점점 두 API를 사용하는 방식으로 바뀌고 있어여 Debugging with TensorBoard TensorBoard 소개 TF.DATA 상용서비스를 염두에 두고 있다는 인상 필요할때만 데이터를 메모리에 올린다 주요 특징 실습 Tensorflow.js deeplearn.js + Tensorflow! conversion! js를 몰라도 tensorflow 를 js로 conversion 해줌 "},"Test_TDD_BDD/tdd_realization.html":{"url":"Test_TDD_BDD/tdd_realization.html","title":"TDD하면서 깨달은 것","keywords":"","body":"개요 아침 TDD 스터디(프로젝트 리포지토리)와 clean Code 강의때 쓰인 가이드 pdf 를 실습하면서 유의미하게 느낀 것을 적음 클린코드를 위한 TDD, 리팩토링 with Java Check 요구사항 분석을 통해 도메인 설계를 하라 (2019/01/09, 2019/01/10) 한계를 느꼈던 건, ‘TDD 할때 테스트 케이스로 커버 안되는 구현,설계들은 어떻게 할까’ TDD 할때 요구사항 분석에서 바로 테스트 케이스 추출로 넘어갔음. 객체 추출, 도메인 설계를 의식적으로 하지 않음. 클린코드 강의 실습 가이드를 보고 갑자기 확 깨달음 오늘 pdf 다시 보고 느낌 요구사항 분석을 통해 대략적인 설계 - 객체 추출 UI, DB 등과 의존관계를 가지지 않는 핵심 도메인 영역을 설계 (2019/01/10) 요구사항보고 객체 설계부터 함. 객체 설계와 도메인 설계의 차이가 뭘까? (from 위키백과)도메인 : 문제를 풀기위해 설계된 어떤 소프트웨어 프로그램에 대한 기능성을 정의하는 연구의 한 영역 도메인 설계는 그럼 문제를 풀기위해 모델링 하는 건가? 음... DDD에서 정의하는 Domain에 대해서 더 알아봐야겠다. [ ] DDD 참고 리스트 읽기 ../concept/DDD.md 이걸 의식적으로 하면 이 설계를 가지고 다중언어로 구현하는게 더 쉽지 않을까 하는 생각이 듦. python과 java를 오가면서 구현하면 언어특성에 대한 코드조각보다 설계를 더 보게 되는 것처럼(pythonic한 코드를 짜기에는 언어의 이해가 부족하니까...). 도메인 설계할때 '객체의 상태(속성)보다는 행위에 집중한다' 하는 이유가 뭘까? 가이드 PDF에서 아래 부분이 아직 와닿지 않음. 중요한 거 같은 감이 오는데 정확한 이유를 생각해서 말할 수가 없음 도메인 설계할때 사용할 기본적인 ClassDiagram 을 익혀야겠다. UML 책(UML 실전에서는 이것만 쓴다) 다시 읽어봐야겠다. UML툴을 따로 사용하지 않으니 오히려 UML이 '몇 가지 기호를 사용해 설계에 대해 모두가 알아볼 수 있도록 정한 약속'인 부분이 와 닿는다. 내가 UML을 알고 있어야 다음에도 내가, 다른 사람이 알아볼 수 있게 CD를 그릴 수 있잖아! 손으로 그리던지 마인드맵 어플을 사용하던지 상관없이 말이야. 기본 MVC Pattern 왜 이렇게 아직도 이해 못하는 기분이지. 설계할때 바로 MVC 가 그려지지 않는다. class 를 나눈다! 의 개념보다 어느 부분이 controller인지 파악하는 것이 좀 잘 안됨. 핵심이 되는 작은 부분부터 개발하면서 서서히 덧붙여나가는게 TDD 구현순서 정할때 좋다 Fact : 한 번에 주어진 레이싱카 게임 요구사항을 구현하는 것보다 여러 버전으로 나누어서 구현한게 더 빠르고 쉽게 구현. 구현할때 좀 더 안정감 있었음(Feeling). Finding: 김창준 애자일 코치 칼럼(당신이 제자리 걸음인 이유 : 지루하거나 불안하거나 - b1. 난이도 낮추기 부분 참고 / 지금 하는 일들을 절반의 시간 안에 해야 한다면? )에서 읽은 적이 있다. 처음 불확실성이 높을 때 일을 쪼개서 내가 쉽게 할 수 있는 버전 1을 만들고 버전 2에서는 조금 더 복잡한 기능을 덧붙여 만들면서 버전을 업그레이드 해가면서 만들면 한번에 어려운 걸 구현하는 것보다 같은 시간 안에 더 빨리 안정감을 느끼면서 만들게 된다. 지금 사용하고 있는 Junit 테스트 프레임워크의 best sample이 궁금해짐 전에 테스트를 접했을때 > 책을 읽다가 신나서 이것저것 적용해보고 결국엔 아, 내가 test가 아니라 JUnit을 하고 있구나를 깨달은 적이 있다. 아직 JUnit 설계를 보기보다 일단 tool로서 툴답게 사용하는 것에 집중하자. 때가 아니다. 참고 article Junit - basic template testing-debugging/junit-best-practices - javaworld junit-best-practices - kyleblaney "},"Test_TDD_BDD/Test.html":{"url":"Test_TDD_BDD/Test.html","title":"Test","keywords":"","body":"Keyword Reference 외부 JUnit In Action Effective Unit Testing - 클린 코드와 좋은 설계를 이끄는 단위 테스트, 한국어판 테스트 주도 개발 TDD 실천법과 도구 by 채수원 / 한빛미디어 테스트 주도 개발로 배우는 객체 지향 설계와 실천 by 스티브 프리먼, 냇 프라이스 / 인사이트 직접 정리자료 TIL - EffectiveUnitTesting TIL - JUnit TIL - TBD_SLiPP 읽는 중 [SpringCamp2013] Spring MVC TEST 어렵지 않아요! :+tv: SpringCamp2013 Spring MVC TEST TDD.JUnit.조금더.알기 목 오브젝트(Mock Object)의 이해 테스트와 스프릥 :+tv: Spring test mvc 발표자료 by KSUG 이수홍 D2 - Spring-Test-MVC 프로젝트 소개 스프링 MVC 단위 테스트! by the wave Mockito Features에 대한 한글 번역 상황/ 궁금증 In 오픈API 프로젝트 일부 모듈에서 어설프게나마 TDD를 적용시켜보면서 전혀 Unit단위로 test 되고 있지 않다는 것을 느낌. 프로젝트 테스트 단계에서 API 단위테스트 시나리오 작성을 상세하게 적은 덕분에 몇 가지 잘못 구현된 부분을 찾음. JUnit에서 SpringTest를 설정하다가, TDD가 아니라 JUnit을 하고 있음을 깨닫고, 테스트프레임워크를 익히는 게 아니라 test 설계에 대해 알고 싶다고 생각. 사족: mapper 로 쿼리 수행 테스트에서, 설정파일 setting을 불러와야했음을 장장 세시간에 걸친 삽질 후 깨달음. 진행 2018/01/10 ~ 일과 전 오전에 1pomodoro씩 Effective Unit Testing 챕터 읽기 [ ] 한 번 읽고 난뒤 어떻게 진행할지는 정해야함. 2018/02/09 SLiPP 스터디를 제대로 정리하고 지금 리팩토링하고 있는 현업 프로젝트에 적용해보는 걸 목표로 한다. 상세 개념이 필요할때마다, JUnit in Action , Effective Unit Testing 등을 참고. 테스트 원칙 격리된 테스트 (테스트를 믿고) 과감한 리팩토링을 가능하게 한다 비즈니스 로직과 관계되지 않는 객체는 모두 외부에서 생성해 넘겨주는 것이 효과적인 설계 전략이다. (JUnit in Action(2011)/인사이트 - p.138) 정리 DB test query 정상작동 검증 테스트 코드 외부 시스템을 호출 혹은 사용하는 경우, 시스템의 정상동작은 검증할 필요 없음. 하지만 정확하게 사용 혹은 호출했는지에 대한 검증은 필요 검증을 위한 기록 log / e.g 상대시스템에 data 넘겼다던가 log 기록 Mock 객체 테스트 JUnit in Action(인사이트, 2012) 발췌 메서드 레벨 단위 테스트에서 다른 메서드나 환경에 구애받지 않도록(...) 타 클래스의 메서드 호출도 격리할 수 있을까? 단위 테스트는 회귀에 대한 안전장치가 되어준다 리팩터링 과정에서 버그가 만들어졌을때 (...) 테스트 단위가 충분히 작다면, 더 적은 수의 테스트만이 버그의 영향을 받고, 문제의 원인이 어디인지 보다 정확하게 짚어주는 메시지를 제공해준다. Mock은 코드 로직의 일부를 나머지 코드와 격리시켜 테스트하려는 용도에 정확하게 부합된다. 목은 테스트 대산 메서드와 상호작용하는 객체즐을 대체하는 격리층으로 동작. 아무런 로직도 구현하지 않는 빈껍데기일 뿐이며, 대신 테스트가 더미 클래스(목 객체)의 모든 비즈니스 메소드의 행위를 조작할 수 있는 메서드를 제공한다. -- 이게 무슨 말일까... p.136 목 객체 안에서는 비즈니스 로직을 절대 구현하지 말라.(...) 목은 테스트가 시키는 대로만 수행하는 바보 객체(dumb object)여야 한다. (...) 첫째 목 객체 제작은 아주 쉽다. 둘째, 목 객체들은 빈껍대기일 뿐이므로, 문제가 발생할 만큼 복잡하지 않아 테스트도 필요 없다. 문제될 가능성이 있는 것만 테스트하라 (...) 이유는 단순 데이터 접근용 객체는 목이 필요 없기 때문이다. (p.137) "},"Test_TDD_BDD/JUnit.html":{"url":"Test_TDD_BDD/JUnit.html","title":"JUnit","keywords":"junit tdd","body":"Referece Create multiple parameter sets in one parameterized class (junit) 상황/ 궁금증 예전에 작성해둔 junit testcase를 보는데, parameterized test로 작성해두었지만, 파라미터 수와 타입이 달라서 코드가 복잡하고 가독성이 떨어진다 [궁금]더 좋은 방법은? 테스트케이스 분리는 어디까지? JUnitParams 써볼까? 정리 "},"Test_TDD_BDD/inbox.html":{"url":"Test_TDD_BDD/inbox.html","title":"Inbox","keywords":"","body":"TO READ / WATCH pycon 발표 - Python 테스트 시작하기 Why TDD 코드 커버리지 80% 넘긴 썰 - 테스팅을 잘 하기 위한 8퍼센트 개발팀의 삽질기 by 8퍼센트Ho Sung Lee "},"Tool/intellij.html":{"url":"Tool/intellij.html","title":"IntelliJ 오류 고치기","keywords":"intellij debugging","body":"TOC Intro Reference Intellij 기본 사용법 Code inspection Debugging 들어가기 전 - mac 기본 단어 이동 shortcut shortcut - 자주 쓰이는 단축키 중심 정리 (Mac 10.5 ) 최소한 이것만은 알아두자 Search / replace Selection Editing Line code info Live Template Refactoring 중복부분 Extraction - opt cmd V/P/M Rename / ReType plugin (내장기능 포함) Error 정리 Intro Jetbrain 사에서 만든 IDE Intellij에 관한 사용법 정리 나는 학부때 사용하던 eclipse를 쓰다가 Intellij를 쓰면 얘가 개발 다 해준다더라는 소문을 듣고 Intellij를 쓰기 시작했다. 확실히 인간이 굳이 하지 않아도 되는 잡일들을 확 줄여준다. 처음에 굳이 왜 Intellij를 쓰는지 실제로 사용하는 모습을 보고 관찰 한 다음 넘어가면 좋을 듯 하다(e.g. 주위에 잘 사용하고 있는 사람의 모습보기 or Intellij로 livecoding 하는 영상). 어디에 장점을 가지고 있는지 파악이 되었다면, 그 이후에 세부 사용법은 친절한 공식문서를 보면서 익히면 됨. Jetbrain 계열 IDE (pycharm,..)에도 단축키가 같아서 한번 배우면 여러 IDE에 적용할 수 있음 Reference IntelliJ IDEA 2018.3 Help : Intellij를 만든 Jetbrain의 공식 도움문서로 참으로 친절하다 IntelliJ IDEA 2018.3 Help - Migrating From Eclipse to IntelliJ IDEA : eclipse에서 Intellij로 넘어갈때 헷갈리는 개념에 대해 참고할만한 자료 IntelliJ를 시작하시는 분들을 위한
IntelliJ 가이드 - 이동욱님 인프런 강의: 처음 접근하는 사람도 무섭지 않게 차근차근 핵심기능을 알려줌. 어우 바꾸기 부담되고 어디서부터 시작할지 모르겠어 하는 사람들에게 추천. 내가 쓰던 단축키-기능을 Intellij에서는 어떻게 쓰는지 알려줌. Intellij 기본 사용법 기존에 알고 있던 내용은 제외하고 새로 알게된 내용이나 한번 더 리마인드가 필요한 내용만 정리함. 나만 알아볼 수 있게 정리해두었으므로 자세한 내용이 알고 싶으면 위 공식 문서와 이동욱님 인프런 강의를 참고할 것. Toolbox 에서 JVM 설정 라이브러리 관리를 위해 기본 Java 프로젝트도 Maven or Gradle 프로젝트로 생성 Maven,Gradle 사용시 라이브러리 Auto import 를 켜놓자. 자동으로 가져오게 되어서 편함 Code inspection IntelliJ IDEA 2018.3 Help - code-inspection Menu - Analyze - Inspect code 선택 IDE내에서 git commit 할 경우, Before Commit 옵션에 'Perform codeanalyze' 체크해서 사용하자 Debugging 다른 IDE 와 거의 유사. 기본 사용은 IntelliJ IDEA 2018.3 Help - Debugging / 기본 UI는 IntelliJ IDEA 2018.3 Help - Debug Tool Window 참고 Start Debugging (실행할 곳에 커서를 두고 ctrl + shift + D) Toggle Line Breakingpoint 는 마우스 클릭으로 왼쪽 창에 찍음(단축키도 있지만 굳이 외울 필요x) conditional breakepoint : 조건문으로 특정 조건을 설정. 조건 충족할때만 breake. Run Selected Debugging (ctrl + D) : 직전에 실행한 디버깅을 다시 실행 Debug view : 좌측 callstack / 우측 variable(현재 breakingpoint에서 볼 수 있는 var) Debug toolbar - resume(cmd + opt + R) : 다음 Breaking point로 넘어감 Stepping toolbar : breaking point 이동 관련 toolbar step over(F8) : Breaking point 다음 라인 실행, 다음 라인 실행,... step into(F7) / step out (shift + F8): 현재 breaking point의 내부 method, 생성자 안으로 들어감 / 들어갔다가 나감 Evaluate Expression(opt + F8) : Breake 상태에서 code 사용. 현재 breakpoint에서 한번만 확인해보면 되는 실행결과값을 바로 확인가능. IntelliJ IDEA 2018.3 Help - evaluating-expressions 참고. Watch : 현재 breake에서부터 다음 breake시점까지 실시간으로 값이 변하는 걸 볼 때 사용. 기타 참고 : IntelliJ 디버깅 해보기 - jojoldu blog 들어가기 전 - mac 기본 단어 이동 shortcut 단어별 이동 opt + left/right 줄 맨 앞 뒤로 fn + left/ right page up/down fn + up/down 단축키에 shift 추가하면 block 선택됨 shortcut - 자주 쓰이는 단축키 중심 정리 (Mac 10.5+) 최소한 이것만은 알아두 Find Action(cmd + shift + a) : 뜨는 창에 찾고 싶은 action 입력하면 창이 쭉 뜸. 단축키를 잘 모르는 초기에 가장 많이 사용. 단축키 모른다 -> 'Find Action'띄워놓고 검색하자 Preferece (cmd + ,) New(cmd + N) : 새로 생성할때 사용. 클래스내에서는 method생성으로, project창에서는 새로운 파일명 등등 각 위치에 따른 context에 맞게 무엇을 새로 생성할 것인지 선택하는 부분이 뜸. Directory 명 입력시 '/'입력하면 하위 디렉토리 생성. e.g. 'src/main/java' package 명 입력시도 비슷하게 '.'으로 하위 package생성. e.g com.ohahohah.intellij smart completion (shift + ctrl + space) 기본 자동 완성(ctrl + space) : static method 자동완성은 ctrl + space * 2 override(ctrl + I) Rename(shift + F6) Refactoring - 중복부분 Extraction(Variable,Parameter,Method) - opt + cmd + V/P/M Reformat code(cmd + opt + L) : 코드 자동정렬 프로젝트의 code convention에 따라 설정하려면 참고 - IntelliJ IDEA 2018.3 Help - configuring-code-style / Installing the google styleguide settings in intellij and eclipse Run(ctrl + shift + R) ; 실행환경 실행 selected Run (ctrl + R) : IDE 창 우측 상단에 select된 것 Run / 이전 실행했던거 다시 실행할때 유용 Recent File(cmd + E) : 모달으로 최근 접근한 파일 목록 보여줌. 파일 이동할때 편함 Recently changed File(cmd + shift + E) : 최근 수정 파일 목 Show Intetion Action (opt + Enter) : 즉각적으로 에러 수정할때 유용 Navigate -> Next Highlighted Error(F2) : 에러 난 곳으로 커서 이동 기본 설정으로 Optimize import 설정 협업을 위해 wildcard import (*)를 피해야할 경우 설정 참고 : Disable wildcard imports Optimize import(cmd + opt + O(alphabet)) : 해당 파일의 안 쓰는 import문 없애기 Git popup(ctrl + v + 팝업창 action숫자) commit(cmd + k) - Before commit option 활용하기 push (cmd + shift + k) Search / replace Find in Path 프로젝트 내 전체 찾기 (shift + cmd + F)/ Find(cmd + F) : Regex 사용가능 Replace in Path 프로젝트 내 전체 바꾸기 (shift + cmd + R) / Replace(cmd + R) : Regex 사용가능 File Name search (cmd + shift + O(alphabet)) : '/'사용해 계층 구조까지 검색 가능. e.g. helper/Member -> helper package안의 Memeber라는 파일명 검색 Symbol search (cmd + opt + O(alphabet)) : 메소드 검색에 유용. Selection Extend/shrink Selection (opt + up/down) : 계층구조 단위로 selection이 늘어나거나 줄어듦. Navigate -> back/forward (cmd + [ / ]) : 이전,이후에 있던 커서 위치로 이동 Clone Caret Above/Below (opt * 2 + up/down) : 해당 커서를 위 아래 줄로도 확장. e,x. 3 ~ 6라인의 같은 위치에 적혀있는 member라는 단어를 동시에 선택하기 : 3라인의 member 단어에 커서 위치시킴 -> opt*2 + down으로 6라인까지 커서 확장 -> opt + up으로 member 단어 selection Editing Line Duplacate line (cmd + d) : 복제 원하는 line에 커서 둔 후에 실행 Remove line (cmd + backspace) Join line (ctrl +_shift + j) : \"line01 \" + \"line02 \" + \"line03\" -> \"line01 line02 \" + \"line03\" -> \"\"line01 line02 line03\" Move line up/down opt + shift + up/down key : 컴파일 에러에 상관없이 라인단위로 아래 위로 이동 cmd + shift + up/down key : block(for문, method 단위)을 생각하면서 라인 이동 Move Element (opt + cmd + shift + left/right key) : 에서 name 에 커서를 두고 이동하면 해당 element 가 좌우로 이동 code info Parameter Info(cmd + p) : method, constructor등의 param info(e.g. Long id, String name)를 보여줌 Quick Definition(opt + space) : 모달창으로 커서가 위치한 해당 method,class,js,...에 대해 정의 보여줌. (주의. name에 커서를 두고 단축키 입력해야함. 괄호 부분은 안됨) Quick Documentation(F1) : 해당 부분에 커서를 두고 단축키를 누르면 모달창으로 짧은 정의 문서 보여줌 (Java 등의 공식문서) Live Template 참고 : IntelliJ IDEA 2018.3 Help - Using live templates 자주 쓰이는 코드 구문을 축약어를 타이핑하면 자동 생성됨. 직접 만들어 쓸 수 있음. cmd + J 입력하면 등록된 live template 목록 보 sout을 입력하면 System.out.println();이 자동 생성됨. psfs -> public static final String fori -> for (int i = 0; i ifn -> if (var == null) { } Refactoring 중복부분 Extraction - opt + cmd + V/P/M Extract - variable(opt + cmd + V) Extract - parameter (opt + cmd + P) : option을 통해 기존 method 유지하면서 overloading으로 parameter 뽑아내는 것 가 Extract - Method (opt + cmd + M) Class(F6) : class명에 커서를 두고 누르면 inner클래스를 Upperlevel로 바꾸거나 다른 package 로 변경 Rename / ReType Rename(shift + F6) ReType (shift + cmd + F6) : 타입 바꾸기 plugin (내장기능 포함) 평소에 플러그인을 많이 사용하지 않음. 가장 유용하게 쓰고 있는 몇 가지 플러그인을 소개. codota : AI code 자동완성을 표방하는 서비스 codota. 내가 작성하는 코드와 유사한 코드를 찾아서 추천해줌. Key promoter X : 마우스로 클릭한 기능이 단축'키'로 무엇인지 알려줌. 자주 쓰는 기능을 단축키로 익히는데 유용. UML : 기본 내장기능. class diagram으로 클래스간의 구조를 reverse engineering으로 파악함. 쓸데없이 복잡도가 높아지진 않았는지, 객체의 역할별로 제대로 클래스 분리가 되었는지 확인차원에서 사용. Rainbow Bracket : 짝이 되는 괄호끼리만 같은 색으로 표시해 괄호를 한눈에 볼 수 있음. chain을 쓸때 유용함. Translator : 한영 변환. naming할때 IDE 창을 벗어나지 않고 정보를 얻을 수 있음 Presentation assistant: 같은 기능의 단축키가 Mac/ Windows/ Linux 에서 어떤 단축키인지 확인가능. .ignore : VCS의 .ignore 파일 자동완성 지원 Bash support : bash파일 자동완성 등 지원 Error 정리 파일 인코딩 문제 Error:(1, 1) java: illegal character: '\\ufeff' : 파일을 다른 에디터로 오픈했을때 UTF-8을 제대로 못 읽어옴. 파일 앞에 보통 인코딩 정보가 있는데 그 정보가 제대로 읽어들이지 않음. 인코딩 깨짐 에러 나면 UTF-16 으로 바꾼 후 다시 UTF-8 로 바꾸면 해결 "},"Tool/trello.html":{"url":"Tool/trello.html","title":"Trello 편하게 쓰기","keywords":"","body":"Keyword trello 상황 현재 업무에서 issue tracking system이 없고, 업무가 구두로 주어져서 tracking 이 안되고 일감관리가 안됨. PM과 소통을 위해서 개인적으로 trello를 도입해서 사용. 개인task 관리에도 pomodoro를 연동해서 적기 시작함. project별 board와 backlog 등 전체적인 일의 흐름을 보는 board를 따로 관리하고, 협업을 하다보니 하나의 카드 내용을 여러 board에서 써야할 함. 수동으로 입력하기에는 너무 번거로워서 카드간 sync방법을 찾음. 정리 Card sync card sync 헤매기 그동안 유용하게 사용했던CardsSync (무료로 5개까지의 card간 sync)는 더 이상 신규 가입을 받지 않음 trello 에서 소개한 Mirroring Cards 에서 two-way sync 는 모두 유료임 https://github.com/bitzesty/cardsync 이런 식으로 token과 card id를 사용해서 mirroring 할 수도 있으나, 이미 3년전 데이터이고 업데이트가 이루어지지 않음. 직접 개발할까 고민했으나 시간이 없음 1차 결론 : 돈을 쓰자 card sync 플러그인 고르기 고려사항 내가 해주는 설정이 최대한 적어야함. 사용이 편리해야함. 가장 가성비가 높은 플러그인은?(부가기능없이 card sync만 있어도 됨) 후보 unito - 최종선택 14일 trial 이 있음 github 등 다른 서비스와도 연동 가능 sync수에 제한이 없음 후보 card sync 1개의 카드를 n개의 보드에 sync하는데 유리함. 이걸 group개념으로 봄. 최소 요금제는 5group/5$ 많은 수의 card를 sync해야하므로 나에겐 맞지 않음 후보 placket Pro 요금제부터 card-mirror 제공. (24.98$/월 (최소2인)부터 시작) trello관련 다른 부가기능 제공. 가격이 비쌈. "},"web_scraping_with_python/scraper_basic.html":{"url":"web_scraping_with_python/scraper_basic.html","title":"scraper 기초","keywords":"","body":"Keyword scraping scraper summary 세 줄 요약 Reference ko.wikipedia - 패킷 / wikipedia_Eng - netowrk packet How Browsers Work: Behind the scenes of modern web browsers / 번역: Naver-D2 브라우저는 어떻게 동작하는가? Beautiful Soup 4.4.0 documentation TODO 인천시는 정말 고담시티일까? - 다른 시도와 비교하여 범죄현황 분석 cf. 책 - 파이썬으로 데이터 주무르기 지음.민형기 어떤 항공사가 연착이 덜 될까? - 악명높은 00항공은 정말로 연착이 심할까? 경의중앙선은 정말로 연착될까? - 얼마나 연착되나 시각화 - 다들 연착이 심하다는 건 알고 있지만, 실제로 얼마나 심한지 시각화 / 용산역 연착 비율 시각화 집에 앉아가자 - 서울 버스 혼잡도 연관지어서, 날씨와 대중교통 혼잡도 상관관계 분석 jupyter 사용법 / python 예외처리 - 상속 정규표현식 PEP8 flask8 str init method 궁금 [궁금] virtualEnv 가상환경 구축 : 가상환경 A 에서 '가'라이브러리 사용, 가상환경 B 에서 '가'라이브러리 사용한다고 하면, 중복으로 '가'라이브러리가 설치되는지, 중앙에서 한번 설치하고 참조해서 쓰는 개념인지? 컴퓨터 하드웨어 자원관리 차원에서 중복설치는 좀... 정리 ch01. Your First Web Scraper study summary [Web] 웹 작동방식 What is networking packet : ko.wikipedia - 패킷 / wikipedia_Eng - netowrk packet 패킷(packet, 문화어: 파케트, 소포)은 정보 기술에서 패킷 방식의 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다. 패킷을 지원하지 않는 컴퓨터 통신 연결은 단순히 바이트, 문자열, 비트를 독립적으로 연속하여 데이터를 전송한다. 데이터가 패킷으로 형식이 바뀔 때, 네트워크는 장문 메시지를 더 효과적이고 신뢰성 있게 보낼 수 있다. 패킷은 데이터의 한 단위라고 할 수 있다. (ko.wikipedia - 패킷) How Browsers Work: Behind the scenes of modern web browsers / 번역: Naver-D2 브라우저는 어떻게 동작하는가? [python] virtualEnv 가상환경 구축 프로젝트별로 사용하는 라이브러리 따로 관리하여 가상환경을 구축 [lib] urllib [lib] Beautiful Soup는 html을 xml python 객체로 변환 잘못된 html을 xml(well-formed) 로 바꿈 python '객체'가 됨 ch03. 크롤링 시작하기 ch.03.1,2 핵심키워드 : 재귀 '웹스크래핑'과 '웹크롤링' 용어를 구분해서 작성하자 웹스크래핑 : 웹크롤링: 웹 크롤러를 사용할 때는 반드시 대역폭에 세심한 주의를 기울여야 하며, 타깃 서버의 부하를 줄일 방법을 강구해야합니다. (p.53) 위키백과의 서버 부하에 대한 대책은? (...)기부 하십시오. (p.54) python 1000번만 재귀호출됨 예외처리 중요하다! (책 샘플코드에는 예외처리가 없음) 웹사이트 전체 크롤링은 언제 유용하고, 언제 손해일까요? 사이트맵 생성 / 데이터 수집 같은 페이지를 두 번 크롤링하지 않으려면 발견되는 내부 링크가 모두 일정한 형식을 취하고,프로그램이 동작하는 동안 계속 유지되는 리스트에 보관하는 게 대단히 중요합니다. 새로운 링크만 탐색하고 거기서 다른 링크를 검색해야 합니다. 파이썬은 기본적으로 재귀 호출을 1,000회로 제한합니다.(...) 멈추는 일을 막으려면 재귀 카운터를 삽입하거나 다른 방법을 강구해야 합니다. 결국 필자는 URL이 너무 우스꽝스러워 보이지는 않는지, 무한 루프로 보이는 반복된 조각이 들어 있지는 않는지 체크하는 코드를 삽입해야 했습니다. 이렇게 하지 않고 밤새 돌아가도록 내버려뒀더라면 금새 정지했을 겁니다. 이런 일을 가장 잘하기 위해 첫 번째 할 일은 사이트의 페이지 몇 개를 살펴보며 패턴을 찾는 일입니다. ch.03.3 인터넷 크롤링 어떤 경우에 웹사이트 전체 크롤링이 유용할까? 크롤링을 하기 전에 물을 질문들 내가 수집하려 하는 데이터는 어떤 것이지? 크롤러가 특정 웹사이트에 도달하면, 즉시 새 웹사이트를 가리키는 링크를 따라가야 할까? 아니면 한동안 현재 웹사이트에 머물면서 파고들어야 할까? 특정 사이트를 스크랩에서 제외할 필요는 없나. 만약 크롤러가 방문한 사이트의 웹마스터가 크롤러의 방문을 알아차렸다면 나 자신을 법적으로 보호할 수 있을까? 프로그램 설계하기 전에, 순서도 작성해 로직 확인해보기 - p.82 그림 3-2 순서도 실제 코드를 작성하기 전에 그 코드가 무슨 일을 하는지 다이어그램을 그려보거나 메모해보는 습관을 들이는 게 좋습니다. 크롤러가 복잡해지면 이런 습관이 시간을 매우 많이 절약해주고,좌절하는 일도 훨씬 줄어들 겁니다. 크롤러에서의 재귀처리 이 크롤러가 방문한 사이트에 외부 링크가 하나도 없다면(흔치 않지만, 크롤러를 오래 실행한다면 언젠가 반드시 일어납니다), 이 프로그램은 파이썬의 재귀 제한에 걸릴 때까지 계속 실행됩니다. 크롤러에서의 페이지 리다이렉트 처리 파이썬 3.x에서 제공하는 urllib 라이브러리가 리다이렉트를 자동으로 처리해주니까요 scrapy : python3 에서도 사용가능 / 공식 문서 스크래파이Scrapy는 웹사이트의 링크를 찾아서 분석하고, 도메인이나 도메인 목록 크롤링작업을 쉽게 해주는 파이썬 라이브러리입니다. scrapy 로그수준 조절 오늘의 코드 : 페이지 링크 스크래핑 + 예외처리 위키피디아 페이지 내에 있는 모든 링크 출력 (잘못된 url 입력시, 에러메시지 출력) ```python from urllib.request import urlopen from bs4 import BeautifulSoup import datetime import random import re [궁금] random.seed() 왜 하죠? random.seed(datetime.datetime.now()) def getLinks(articleUrl): try: html = urlopen(\"https://en.wikipedia.org\"+articleUrl) except Exception as e: print(e) else: bsObj = BeautifulSoup(html, \"html.parser\") articleUrl = bsObj.find(\"div\", {\"id\":\"bodyContent\"}).findAll(\"a\", href=re.compile(\"^(/wiki/)((?!:).)*$\")) return articleUrl return list() links = getLinks(\"/wiki/Jessica_Chastain\") links = getLinks(\"/wiki/Main_page/wiki/Jessica_Chastain\") # wrong input url - error while len(links) > 0: #link 범위 내에서,무작위로 목록을 뿌려줌 / [궁금] 왜 random을 하는데 중복된 링크를 출력하지 않는지? newArticle = links[random.randint(0, len(links)-1)].attrs[\"href\"] print(newArticle) links = getLinks(newArticle) ``` "},"Windows/command.html":{"url":"Windows/command.html","title":"Command","keywords":"","body":"정리 파일 삭제 User 권한 주기 / 권한 확인 stackoverflow - Undeletable file in cygwin Open a cmd windows (run as Administrator)takeown /r /f DRIVE:\\PATH icacls DRIVE:\\PATH /grant USERNAME:F /T Windows Modules Installer Worker - high CPU usage In Windows 8 or 8.1 laptop, sometimes CPU fan run very fast and make noise because Windows Module Installer Worker occupies CPU more than 50%. In this case, you can solve the problem by changing windows update into manual mode. "},"Work/LearnigByDoing.html":{"url":"Work/LearnigByDoing.html","title":"LearnigByDoing - 어떻게 배울까?","keywords":"","body":"Keyword learningByDoing Reference 자바 세상의 빌드를 이끄는 메이븐 - 박재성 지음 진행방식 회사 프로젝트 진행하면서 깨달은 것 상황/ 궁금증 고수들은 처음에 어떻게 배우는지 궁금함. 난 다 처음 배우는거니까 처음 기술을 어떻게 배울까? How To 간단한 공식 Tutorial에서 시작 (공식페이지에서 Getting Started 를 찾아봄) 레퍼런스의 난이도를 맞춘다. 아직까지 메이븐을 사용한 경험이 없기 때문에 (...)(오픈소스 프로젝트의 잘만들어진 메이븐 빌드 스크립트를 처음부터 도입할 경우, 빌드 스크립트에 문제가 생길 경우, 해결책을 찾기가 쉽지 않다) 오히려 처음부터 빌드 스크립트를 만들어 가면서 메이븐 빌드 스크립트에 대한 이해도를 높인 다음, 일정 수준에 도달하면 잘 만들어진 빌드 스크립트를 참조할 계획이다. 기본 개념을 쓸 수 있을만큼 익히고 조금씩 조금씩 심화시킨다. i.e. ch.2: mvn command는 option,goal,phase로 구성되어 있다. mvn clean test도 가능 -> ch4. goals, phase 에 대해서 더 알아봄. 실습 중간중간 있어서 재밌다. 직접 해보기 좋아. 의사소통 회사사수의 의사소통에서 배울 점 예상되는 결과(목적)을 명확하게 전달. 업무를 줄때, 큰 단위일 경우 쪼개서 단개별로 차근차근 주면서 설명함. 전체 흐름에서 단계파악 , 상대의 일능력 파악(내가 한번에 소화할 수 있는 정도) 파악. 배경이 되는 내용부터 차근차근 설명. 맥락이 있음. "},"Work/WritingEmails.html":{"url":"Work/WritingEmails.html","title":"WritingEmails","keywords":"","body":"Keyword Reference 비즈니스 이메일 101 - 일잘러를 위한 이메일 가이드 상황/ 궁금증 '네가 쓴 이메일 무슨 말인지 모르겠어.' 원격근무가 많아서 다양한 내용을 이메일로 전달해야할 상황이 많았음. 가장 많이 받은 피드백(같이 일하는 사람)은 '네가 쓴 이메일 무슨 말인지 모르겠어.' 악순환 이메일에 자신이 없어짐 -> 안 쓰게되거나 미룸 -> 한 번에 전달해야할 내용이 많아짐 -> 상대가 무슨 말인지 더 못알아들음 그때 진단했던 문제는 전달해야할 내용을 명확하지 정리하지 않아서... 서면 전달 전에 구두/미팅으로 전달해야할 내용이 섞여 있었음. 서면으로 전달하면 오해가 생길 수 있거나 복잡한 내용이라서, 청자가 어느정도 이해하고 있는지 바로바로 확인하면서 추가 내용을 전달해야함. 지금은, 지금 회사에서는 같은 오피스에서 근무하기 때문에, 구두 설명이 필요할때, 이메일로 기록을 남겨야할 때를 어느정도 구분해서 사용함. 업무 특성상, 된다/안된다로 명확하게 나눠지는 내용을 전달할 경우가 많음. ~는 어떠신가요? 보다 000 요청 or 000까지 진행됨의 경우가 많아짐. [궁금] 잘 읽히는 이메일은 무엇인가 콘텐츠 뉴스레터 구독이 많아지면서, 눈에 띄는 이메일과 그렇지 않은 이메일이 있다는 걸 깨달음. 이메일로 정보를 받아보는걸 선호하기 때문에 한 번 눈에 띄지 않아 읽지 않으면, 다시 찾아서 읽을 가능성이 현저히 떨어짐. 읽고 나서 내 문제점 이메일 받은 상대의 예상 행동을 빼고 보냄(상대가 받고, '...? 뭘 어떻게 하라는거지?' 상황) 미팅할 내용을 이메일로 전달 아젠다가 모호해서 같이 대화하면서 발전시켜야하는 내용을 메일사용하면서, 소통이 지나치게 늘어짐. 스스로 이해가 부족해 모호하게 내용 전달이 됨. 모든 내용을 확인하고 보내는 것이 베스트지만,-> 중간중간 소통 필요 : '@@@ 까지 정리가 되었고, 000부분은 명확하지 않으니 확인하겠음' 까지라도.(스티브잡스 - 하퍼웰 출판사 이메일 사례 참고) Do It! 01/10 ~ 01/14 [ ] 이메일 자동분류 - 뉴스레터 이메일 주소 [email protected] 형태로 바꾸기 [ ] 이메일 자동분류 - 프로젝트 관련 이메일 '중요'태그로 분류 [ ] 이메일 자동분류 - 업무 이메일 프로젝트별 태그 분류 - 이메일 주소 분류 기능 "},"Inbox/question.html":{"url":"Inbox/question.html","title":"풀어야할 질문들","keywords":"","body":"풀어야할 질문들을 적음 TDD 테스트케이스 명세는 곧 기능명세가 되는 경우가 많음. 그럼 다음 테스트케이스는 합치지 말아야할까? 전진조건값에 따라 전진값이 맞게 주어지는지 확인` 보다 아래 두개의 메소드로 나누는게 명확해보인다. @Test public void 전진조건값이_4이상일때_전진값이_맞게_주어지는지_확인() { int randomNum = 4; int expectedGoCarVal = 1; RaceCar rc = new RaceCar(); assertEquals(expectedGoCarVal,rc.getForwardCoord(randomNum)); } @Test public void 전진조건값이_4미만일때_전진값이_맞게_주어지는지_확인() { int randomNum = 3; int expectedGoCarVal = 0; RaceCar rc = new RaceCar(); assertEquals(expectedGoCarVal,rc.getForwardCoord(randomNum)); } Unit Test에서 GWT(Give-When-Then) 장단점? TDD 실천법과 도구 라는 책으로 알려져있는 채수원 개발자의 예전 블로그를 보다가 이 글을 발견 http://blog.doortts.com/169 여기서 'Given - When - Then(GWT)' 이라는 걸 발견했는데요. 궁금해서 더 서핑하다가 이 두가지 article을 발견 https://www.slipp.net/questions/82#answer-488 https://martinfowler.com/bliki/GivenWhenThen.html 지금 내가 짜는 테스트케이스들이 명시적으로 give등의 구문이 써있지만 않을 뿐이지 이런 구조로 되어있는 것 같음. 이 구조를 사용하지 않은 테스트케이스가 뭐가 있지? 그동안 당연히 이 구조가 테스트케이스를 정의하는 방법이라고 생각했는데 음... 단점이 뭔지 이해가 잘 안됨. 어떤 객체를 생성하고 - Given / 어떤 상황에서 - When / 이런 값이 나올꺼야 - Then 하는걸 GWT라고 생각했음 "},"Inbox/blockchain.html":{"url":"Inbox/blockchain.html","title":"사내 블록체인 세미나 키워드 정리","keywords":"","body":"상황 사내 블록체인 세미나에서 나온 주요 키워드 Keyword sidechain pow(bitcoin,ether) -> pos?(not prove) smartcontract eos ico Dapp token economy medibloc quatum? wfp-ethereum -> public아닌 local에서 innovation.wfp.org/project/building-blocks amply.tech steemit gifto telegram ico : 이미 기반있는 곳이 일부를 ico 방식으로 변경 valu - cellebrarity tokenizor? CIVIL - decentrallized journalism ujo "}}