Gradle

코로나바이러스가 한창이다. 영화 컨테이젼을 보다가 gradle의 뜻을 깨달았다. 영화 마지막에 U2 노래가 흐르더라. ... from the cradle to the grave~

디딤돌 대출에 집단대출 추가 신청

작년에 일을 몇달 쉰 덕에 다음달에 입주하는 새 집에 디딤돌 대출을 받을 수 있게 되었다. KB시세 의 70%가 대출한도라 필요자금의 나머지는 보금자리론보다 조건이 좋은 집단대출로 신청하였다. 함께 신청한 보금자리론은 취소하였다. 다음은 디딤돌 대출 신청 과정이다. 신청부터 심사완료까지 주택금융공사 경기남부지사에서 3주 가까이 소요되었다. [20181105 월요일] 오전에 주택금융공사 앱을 설치하고 디딤돌 대출과 보금자리론을 신청. [20181108 목요일] 회의 중에 콜센터에서 전화가 와 20여분간 통화하였다. 전화로 자동차보험 신청하는 것 같은 느낌. 통화가 끝나면 필요한 서류목록을 문자로 보내준다. [20181109 금요일] 필요서류를 준비하여 우체국에서 송부. [20181112 월요일] 앱의 신청단계가 '대출서류확인'으로 바뀌고 홈페이지로 배우자 로그인 후 개인정보조회 등의 동의 요청 문자가 와서 공인인증서 로그인 후 동의함. [20181122 목요일] 대출서류 보완 요청하는 전화가 와서 퇴근 후 건강보험료3개월납부확인서를 팩스 발송. [20181123 금요일] 중도금 대출 중인 하나은행의 대출상담사에게 전화해보니 디딤돌 대출 1순위 담보제공 후 2순위 추가대출은 불가하다고 함. 다른 집단대출 은행 중 하나인 우리은행의 대출상담사에게 문의해 보니 디딤돌 대출 후 70% 한도의 나머지 잔액도 2순위로 가능하다고 함. 주택금융공사에 전화하여 취급은행을 하나은행에서 우리은행으로 변경신청함. 오후에 디딤돌대출심사 잠정완료 문자가 옴. [20181129 목요일] 사용승인 후 심사 승인 확정문자가 옴. [20181130 금요일] 오전에 필요한 서류 발급 후 오후에 은행에 가서 대출 신청. 대출 실행일 1~2일 전에 추가 필요한 금액을 문자로 알려주니 그 금액만큼 입금하면 그 이후 프로세스는 알아서 다 처리해 주니 오후에 입주지원센터 가서 키 불출받으면 된다고 한다. 잔금은 물론 중도금대출 이자까지 알아서

JavaScript의 Math.random() 대체

막바지에 이른 프로젝트의 sparrow 분석 결과 검출된 보안상 취약점을 제거해야 하는데, JavaScript의 Math.random()이 문제였다. 보안 관련 이슈가 있어 보안 프로젝트에서 사용하는 것은 적절치 않아 보인다. 프로젝트에서 쓰이는 곳이 많아 예외 신청 하기도 쉽지 않아 대체 함수를 만들었다. Math.random() 함수는 [0, 1) 범위(0을 포함하면서 1 보다는 작은)의 의사랜덤(pseudo-random) 수를 부동소수점(floating-point)으로 반환한다. window.crypto.getRandomValues() 메소드를 이용하여 0 ~ 4,294,967,295의 난수를 발생시킨 후 [0, 1) 범위를 갖도록 4,294,967,296로 나누었다. window.crypto.getRandomValues(new Uint32Array(1))/4294967296 위의 함수로 대체한 후 sparrow 분석을 통과하였다.

쿠두 insert operation을 이용한 update operation object 생성

아파치 플룸(apache flume)의 기능을 확장시키는 플러그인을 개발하고 있다. kudu에 대량의 데이터를 insert해야 하는데 primary key가 중복된 데이터가 있다. 다행히 kudu에는 upsert가 있어 중복 데이터 여부 관계없이 데이터를 밀어넣을 수가 있다. 이런 경우에는 primary key가 같다면 마지막에 upsert한 데이터만 남을 것이다. 만약, upsert 대신 insert를 사용한다면 처음 insert한 데이터만 남을 것이다. 만약, primary key 중복 오류로 insert에 실패한 행의 수를 센 후 update해야 한다면 다음의 함수를 사용한다. 찾아봐도 없어서 만들었다. /** * 중복행 오류로 Insert에 실패한 Operation을 update시키기 위해 row copy * @param insertOperation the operation that failed insert * @return update operation * @throws FlumeException */ private Operation getUpdateOperationFrom(Operation insertOperation) throws FlumeException { try { PartialRow rowInsert = insertOperation.getRow(); Schema schema = table.getSchema(); int schemaColumnCount = schema.getColumnCount(); List columns = schema.getColumns(); Operation operation = table.newUpdate(); PartialRow rowUpdate = operation.getRow();

자바에서 쿠두 테이블에 레인지 파티션 추가하기

아파치 플룸(apache flume)의 기능을 확장시키는 플러그인을 개발하고 있다. 레디스(redis)에서 데이터를 가져와 플룸 채널(flume channel)에 데이터를 채우는 소스(source) 기능과 플룸 채널(flume channel)에서 데이터를 가져와 쿠두(kudu) 테이블에 저장하는 싱크(sink) 기능을 구현하는 중이다. 그런데 쿠두 테이블에 저장하려는 데이터에 해당하는 파티션이 생성되어 있지 않을 경우 익셉션이 발생한다. 이 문제를 해결하기 위해 필요한 경우 파티션을 코드에서 직접 추가하기로 하였다. 아래처럼 복수의 칼럼으로 레인지 파티션이 설정되어 있는 경우에는 PARTITION BY RANGE (year, month, day) ( PARTITION VALUE = (2018, 10, 25), PARTITION VALUE = (2018, 10, 26), PARTITION VALUE = (2018, 10, 27), PARTITION VALUE = (2018, 10, 28) ) 다음과 같이 필요한 파티션을 추가해 준다. private void addRangePartitionsOnDemand() { logger.info("Add range partition on kudu table."); Schema schema = table.getSchema(); PartialRow lower = schema.newPartialRow(); PartialRow upper = schema.newPartialRow(); lower.addInt("year", 2018); lower.addInt("month", 10); lower.addInt("day", 29); upper.addInt("year", 2018);

영문 필사

이미지
헤밍웨이의 단편소설을 필사한다. THE SNOWS OF KILIMANJARO부터 시작. 순서는 다음과 같다. 1. 보고 쓰기(필사) 적정 분량을 미리 정한다.(하루 한 페이지 등) 한 문장 단위로 암기한 후 필사한다.(모르는 단어도 찾아본다) 원문과 비교한 후 틀린 부분을 표시한다. 미리 정한 분량이 끝난 후 틀린 부분만 반복한다. 2. 받아 쓰기 보고 쓰기 1~2회 혹은 3회까지 해 보고 자신이 생기면 오디오북으로 받아 쓰기를 시작한다. 한 문장 단위로 듣고 난 후 받아 쓴다. 3. 따라 읽기 오디오북으로 듣고 따라 읽는다. 적정 길이로 따라 읽기 후 익숙해지면 오디오북과 거의 동시에 읽을 수 있을 때까지 반복한다. 몽땅연필로 이면지에

쌀쌀한 아침, 자전거 출근길

자전거 손잡이를 잡은 손이 시리다. 깊어가는 가을.