9월, 2018의 게시물 표시

Postgresql에서 5432 port가 열려있냐는 문제(Ubuntu 기준)

1. 에러 각종 서비스에서 5432 port가 열려있느냐를 묻는 에러가 발생한다. django는 이런 식. Is the server running on host XXX and accepting TCP/IP connections on port 5432? 어쨌든 connection이 안되면 서비스가 실행되는지, port가 열려있는지 확인해보는게 좋다. 2. 확인 1) htop 에서 postgresql이 있는지 본다. 혹은 ps -el. 2) netstat -ntl로 5432가 열려있는지 본다. 3) service postgresql status로 서비스가 active 상태인지 본다. 3. 해결방법 1) postgresql이 실행되어 있지 않다. sudo service postgresql start. 2) 5432 port가 열려있지 않다. - /etc/posgresql/VERSION/main/pg_hba.conf에서 # IPv4 local connections 아래   host    all             all             0.0.0.0/0           md5 를 추가(혹은 수정) - 외부에서 접속하는 경우 방화벽이 막혀있는 경우가 있다. 열어도 되는 서버라면   iptables -I INPUT 1 -p tcp --dport 5432 -j ACCEPT   iptables -I OUTPUT 1 -p tcp --dport 5432 -j ACCEPT AWS EC2는 EC2 콘솔에 가서 열어야 하는 것 같다. 3) 실행도 되어있고 port도 열려있다. 이전 실행에서 비정상적으로 종료된 경우가 가끔 있다. /var/lib/postgresql/VERSION/main/postmaster.pid를 삭제하고 다시 postgresql을 시작한다. 4. 기타 1) 로그 위치 : /var/log/postgresql/postgresql-VERSION-main.log

Pycharm에서 PEP8을 선택적으로 적용하는 방법

1. PEP8? Python code style guide. Pycharm을설치하면 기본적으로 지키게 되어있다. Warning level(회색 밑줄)이지만 안지키면 거슬리므로 지키게 된다. 자세한 내용은 이 페이지 참조 2. 선택적으로 적용하는 방법 (2017.2.3 버전) 1) File > Settings( ctrl + alt + s)을 연다. 2) 왼쪽 리스트에서 Editor > Inspections. 3) 나오는 리스트에서 Python 더블클릭. 4) 아래로 내려서 PEP 8 coding style violation을 선택. 5) 오른쪽 입력창 > Options > Ignore errors의 + 버튼 클릭. 6) 이 페이지 에서 무시하고 싶은 에러 코드를 찾아 입력. ex> E501

AWS lamda + api gateway + step function

1. 하고 싶은 것 - 클라이언트 요청 -> (1) 무조건 성공값을 반환 -> (2) 실제 계산, DB 입출력 등 - 이유 : 실제로 하고 싶은 연산이 꽤 오래 걸리고 사용자는 그 결과를 바로 볼 필요가 없음 2. 1차시도 : API gateway -> Lambda1 -> Lambda2   1) lambda2를 실행시키고 바로 "ok"를 반환하는 lambda1 함수를 만듦(둘 다 node.js 8.1) 2) API gateway를 만들고 method로 Post를 추가, CORS 설정, lambda1을 end point로 설정. -> CORS 설정했는데 테스트하니 안됨. -> lambda1에서 CORS 헤더를 설정해서 이런식으로 return해야 함 return {   "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*" } } 3) CORS 문제는 발생하지 않으나 lambda2에 진입하지 않음 -> handler에서 return 하는 순간 함수가 종료되고 실행중인 연산을 종료해서 발생하는 문제. -> callback() 사용. 4) lambda2에서 실제로는 10초 정도면 끝나는 연산을 lambda1에서 설정한 대기시간(30초였음)만큼 기다림 -> lambda1의 대기시간을 10초로 줄였더니 lambda2에서 10초 이상 걸리는 경우 마지막까지 수행하지 못함. (기나긴 삽질의 시간) 3. 2차시도 : API gateway -> Step function(Lambda1 -> Lambda2) 1) Step function(state machine과 비슷하다고 느꼈다)을 사용하면 될 것 같아서 API gateway가 step function을 호출, step function에서 시작 ->

jsp tag 라이브러리를 이용한 템플릿 작성

1. .tag 파일 1) 태그 정의 파일 최상단에 <%@tag pageEncoding="UTF-8" language="java" description="Base Template" %> 2) attribute, fragment 정의 태그 파일에서 각 부분을 불러올 때 사용할 attribute를 정의한다. - <%@attribute name="title" required="true" %> : 이런 식으로 작성하면 base 태그 안에 같이 쓰는 attribute를 정의할 수 있다. - <%@attribute name="js" fragment="true" required="false" %> : fragment="true"를 추가하면 invoke로 불러올 수 있다. 3) 템플릿 작성 모든 페이지에서 공통적인 부분을 작성한다. 예를 들면 이런 식. 굵은 글씨는 2)에서 정의한 attribute와 fragment. <head>   <title><%= title %></title>   <jsp:invoke fragment=" style "/> </head> <body>   <jsp:invoke fragment=" header "/>   <jsp:invoke fragment=" content "/>   <jsp:invoke fragment=" footer "/>   <jsp:invoke fragment=" script "/> </body> 그냥 attribute는 <% 이 안에서 사용할 수 있고 %> fragment

psycopg2 정리

1. 실행결과를 dict로 받고 싶다 import psycopg2, psycopg2.extras connection.cursor(psycopg2.extras.RealDictCursor) 2. insert가 안된다 connection.commit() 3. AWS lambda에서 사용하고 싶다(python 2.7) 1) 이 페이지 를 따라한다. 2) 바로 안되면 -> 이 페이지 로 가서 필요한 패키지를 다운받아 1) 처럼 구성해서 올린다. 4. insert 후 결과를 받아보고 싶다. 1) query에 RETURNING [fieldnames] 2) cursor.fetchone() / fetchall()

각종 datetime format 정리

1. Java - 2018-09-01 00:00:00 : yyyy-MM-dd HH:mm:SS 2. Python - 2018-09-01 00:00:00 : %Y-%m-%d %H:%M:%S - datetime -> javascript format : %Y-%m-%dT%H:%M:%S.%fZ 3. JQuery UI datepicker - 2018-09-01 : yy-MM-dd

Intellij 자주 쓰는 단축키/기능 정리

1. 아무데서나 - ctrl + shift + f, r : f로 모든 파일에서 검색, r로 모든 파일에서 바꾸기. - shift + shift : 전체 검색 빠른 버전. - ctrl + n : 파일 검색해서 열기. - ctrl + alt + s : 프로젝트 설정 열기. - alt + 5 : 디버거 열기 - alt + 3 : 검색결과 열기 2. 코드 대상 - alt + insert : generator 메뉴 열기. 주로 getter/setter 만들때나 interface 구현에서 사용. - ctrl + / (범위 지정하고) : 해당 범위 주석 - f2 : 다음 error, warning으로 커서 이동 - ctrl + alt + shift + v : 코드를 보이는 그대로 복붙. 그냥 ctrl + v는 자동 formatting이 기본값. - ctrl + alt + l : 코드 포맷 정리. 3. 파일/프로젝트 대상 - f4(프로젝트) : module setting 열기. - shift + f6 : 파일 이름 변경 - f5 : copy & paste 4. 매크로(마우스/키보드) 등록법 1) 상단 메뉴 > Edit > Macros > Start macro recording. 기록이 끝나면 오른쪽 아래 stop 버튼으로 중지. 매크로 이름 지정. 2) 프로젝트 설정(ctrl + alt + s) > Keymap > 목록에서 Macros > 위에서 저장한 매크로 우클릭 > Add Keyboard/Mouse shortcut 5. 서버 hot swap?(Tomcat) 1) 상단 메뉴 > Run > Edit Configurations 혹은 우상단 실행 메뉴 옆에 있는 드롭다운 2) 좌상단 + 버튼 > Tomcat server로 추가 혹은 이미 있는 서버 불러옴 3) Server 탭 > 중간 쯤에 On frame deactivation을 Do nothing 말고

Spring 4 + JSP + Maven + Hibernate 4 + Spring JPA 2 + SQLServer(MSSQL) 2017 + Intellij 하면서 정리

1 . JSP 1) <form:input> 계열 : path attribute를 꼭 지정하게 되어 있는데 이 path가 렌더링될 때 name이 되므로 name을 지정해도 무시된다. 2. Maven 1) java 파일 내에서 library를 못찾아오면 - (intellij에서는) pom.xml 우클릭 -> maven -> download sources, 다운로드 후 같은 메뉴에서 reimport 3. Hibernate + Spring JPA + SQLServer(MSSQL) 1) @Query (Query annotation) - nativeQuery 옵션 -- true : query도 native고 결과도 native. Entity가 아니라 List로 반환됨. -- false : query를 Entity 기준으로 작성해야 하고 반환되는 값도 해당 Entity - parameter를 지정하고 싶으면 -- 함수 내 인자에 "모두" @Param("NAME")을 붙이거나 -- 순서대로 ?1, ?2, ... 4. Intellij - DB를 바로 연결할 수 있어서 좋다. query를 날리거나 직접 데이터를 수정하는 것도 가능. 5. 기타 1) 전자정부 프레임워크를 쓰면서 발생한 현상. 오래 전이라 잘 기억은 안나지만 일단 기록. DB 정보를 jasypt로 암호화해서 .properties 파일로 저장 -> datasource를 설정하는 .xml 파일에서 참조해야 하는데 본서버에서 아무리해도 DB에 접속을 못하는 현상이 발생했다. 매우 많은 시간을 들여 디버깅해보니 datasource를 불러오기 전에 db에 접속하려고 하는 문제였던 것 같다. -> xml 파일을 불러오는 순서를 정할 수 있나 엄청 찾아보다가 결국 datasource만 .java 파일로 빼고, 이런 식으로 순서를 지정해주었다. @Order(value=1) @Configuration @

Dynamodb query 정리

0. 공통적으로 알아야 할 내용 1) "!=" 대신 "<>"를 써야하는 것 같다. 2) reserved keyword가 있다. ex> user,... 사용하고 싶으면 "ExpressionAttributeNames" 옵션을 써야 한다.  ( 이 페이지 참조) 3) 형식에 엄격한 편. 4) ExpressionAttributeValues, ExpressionAttributeNames 등에 설정한 값은 반드시 사용해야함. 1. Python 1) 코드 import boto3 dynamodb = boto3.resource("dynamodb", region_name=MY_REGION,     aws_access_key_id=MY_KEY_ID, aws_secret_access_key=MY_KEY) table = dynamodb.Table(TABLE_NAME) table.query(     IndexName=INDEX_NAME,     KeyConditionExpression='KEYNAME = :KEYVALUE and #ATTR1 = :ATTRVALUE',     FilterExpression='FILTERNAME = :FILTERVALUE',     ProjectionExpression='attr1, attr2'     ExpressionAttributeValues={         ':KEYVALUE': '...',         ':FILTERVALUE': '...',         ':ATTRVALUE': '...',     },     ExpressionAttributeNames={         '#ATTR1': 'user'     },     ScanIndexForwa

javascript Date를 python datetime으로 변환

1. 왜 하게 되었는가 프론트(vue.js)에서 firebase realtime database에 단순 Date()로 시간을 저장했는데 이 값을 백(django)에서 불러와서 비교해야 함. => 형식을 맞출 필요 2. 어떻게 하였는가 1) 구글 검색하여 형식을 맞춤. now = datetime.now() python_date = datetime.strptime(js_date, "%a %b %d %Y %H:%M:%S %Z%z (한국 표준시)") 2) timezone naive와 timezone aware 문제 now와 python_date를 비교하려니 timezone문제가 발생. -첫 번째 방법 : 기본 내장된 pytz를 사용하고 parsing을 now를 이용하여 해결. import pytz now = datetime.now(pytz.UTC) python_date = now.strptime(js_date, "%a %b %d %Y %H:%M:%S %Z%z (한국 표준시)") - 두 번째 방법 : django.utils.timezone을 사용 python_date = datetime.strptime(js_date, "%a %b %d %Y %H:%M:%S %Z%z (한국 표준시)").replace(tzinfo=timezone.utc) 3. 참조 - https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior - https://stackoverflow.com/questions/8153631/js-date-object-to-python-datetime 4. 좋은 글 - https://8percent.github.io/2017-05-31/django-timezone-problem/ 5. 여담 ISO format으로 저장을 추천. javascript라면 new Date()