jsp:attribute must be the subelement of a standard or custom action 문제

이번 경우 <tag:base>   <c:set ......./>   <jsp:attribute><.jsp:attribute>   <jsp:attribute><.jsp:attribute>   <jsp:attribute><.jsp:attribute> </tag:base> 구조로 되어있어서 발생했다.(tag는 custom tag file) 아마 <jsp:attribute> 와 같은 레벨에 다른 태그가 있으면 안되는 듯 하다?   <c:set ......./>을 <jsp:attribute> 안으로 옮기니 해결되었다.

Linux screen 명령어 정리

1. screen -list : screen 목록 2. screen -S [name] : screen 생성. 중복된 이름도 가능하다. 그럴 경우 -list로 정확한 이름을 확인하고 접속 3. screen -x [name] : screen 접속(다중접속 가능). 다중 접속 중이면 보이는 크기가 작아진다. 이유는 모르겠음 4. screen -r [name] : screen 접속(다중접속 불가) 5. screen -X -S [name] quit : screen 삭제 6. (접속중) ctrl + a + d : 현재 screen 나오기 7. (접속중) ctrl + a, shift +f : 현재 screen 전체 화면으로 보기 8. (접속중) ctrl + a + [ : copy mode

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/pos...

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()