Linux에서는 below 1024(1024 아래) 밑의 포트들을 root가 아닌 권한인 유저들이 여는 것을 허용하지 않는다


이것 땜에 좀 문제가 있었는데, 2가지 해결 방법이 있다.


1. iptables에서 port fowarding을 해준다.

reroute를 통해서 8080을 80으로 포워딩해주는 방법이 있다.

(root 권한에서 실행)

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080


2. authbind를 설치한다.

 authbind는 debian 패키지에 있는 1024 이하의 포트들을 root가 아닌 유저들이 열 수 있게 하는 것. 사실 나도 1번이 하기 싫어서 찾아보다가 이번에 처음으로 알게 되었다.


원래대로 서비스에 설치해서 쓰는거면 /etc/init.d/tomcat* (해당버전)에 들어가서 authbind 를 YES인가 OK로 설정하면 되는데, 나는 서비스에 설치해서 안쓰니까..험난하다


우선 authbind를 설치한 다음에.. 80포트를 접근 가능하게 바꿔준다. 백형 블로그 참고했다

http://www.2ality.com/2010/07/running-tomcat-on-port-80-in-user.html


ㄱ. authbind를 설치

ㄴ. root 로 authbind 폴더에 쓸 포트(80)을 chown으로 쓸 계정에 줌. 이 백형은 glassfish를 쓰지만 난 촌스럽게 톰캣 쓰므로 톰캣으로 간다

* ipv6은 지원안한다는데, 음.. 아직 신경쓰지 않기로 했다. nginx경우에는 신경을 좀만 쓰면 되지만, 이 놈은 아닌 듯. 그렇다고 톰캣을 root로 올릴 순 없잖음...

ㄷ. setenv.sh 에 CATALINA_OPTS에 IP4stack   쓴다고 설정

ㄹ. startup.sh에 authbind를 통해 구동하게 강제로 바꿈


되나 확인해보면 됨

Posted by TY
,

개발환경

HW: Apple Macbook Pro 13" early 2011 (i7@2.7 / 4g / intel graphic)

OS: Mac OSX 10.8.2 (mountain lion)

IDE: Eclipse Juno

JDK: 1.6

 


이미지 몇 백장을 리사이즈하고 앞으로 이 일이 반복될 것 같은 끔찍한 느낌이 들어서 걍 만듬..


ImageIcon 으로 리사이징된 이미지를 리턴해줌... 소스코드는 메인이랑 함수 딸랑 하나 있는 클래스랑..  끝임.


원래 할라고 했던 것들은..


1. 처음에 구동하면 최대 width * height 적어줌 (width나 height중 원본 사이즈와 비교해서 원본대비 더 큰 것에 맞춰서 비율을 맞춰서 줄여줌..)

2. 다이얼로그 박스가 떠서 디렉토리를 선택

3. 프로그레스 바와 로그 텍스트가 나와서 얼마나 됐고 무슨 이미지들을 바꿨는지 찍어줌 


근데 귀찮아서

width*height는 그냥 함수 인자로 넣고 / 경로도 걍 소스에 string에 대입하고 / 어떤 파일 리사이징 됫는지 콘솔창에 찍힘 


근데 다시 고칠라나? 귀찮을듯.. 나중에 심심하면 할듯 --;


자바로 짠 이유는 노트북에 obj-c랑 java랑 python이 깔려있는데 마침 eclipse를 켜놨었음..


ImageResize.java


import java.awt.Graphics2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

import java.io.File;


import javax.imageio.ImageIO;

import javax.swing.ImageIcon;



public class ImageResize {

public static ImageIcon resizeImage(String fileName, int maxWidth, int maxHeight){

String data = fileName;

BufferedImage src, dest;

ImageIcon icon;

try{

src = ImageIO.read(new File(data));

int width = src.getWidth();

int height = src.getHeight();

if(width > maxWidth){

float widthRatio = maxWidth/(float)width;

width = (int)(width*widthRatio);

height = (int)(height*widthRatio);

}

if(height > maxHeight){

float heightRatio = maxHeight/(float)height;

width = (int)(width*heightRatio);

height = (int)(height*heightRatio);

}

dest = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D g = dest.createGraphics();

AffineTransform at = AffineTransform.getScaleInstance((double) width / src.getWidth(), (double)height / src.getHeight());

g.drawRenderedImage(src, at);

icon = new ImageIcon(dest);

return icon;

}catch(Exception e){

System.out.println("This image can not be resized. Please check the path and type of file.");

        return null;

}

}

}




Main.java


import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;

import javax.swing.ImageIcon;



public class Main {


/**

* @param args

* @throws IOException 

*/

public static void main(String[] args) throws IOException {

String path = "/Users/TY/Dropbox/사진/";

File dirFile = new File(path);

File [] fileList = dirFile.listFiles();

for(File t:fileList){

String tmpPath = t.getParent();

String tmpFileName = t.getName();

int extPosition = tmpFileName.indexOf("jpg");

if(extPosition != -1){

String fullPath = tmpPath+"/"+tmpFileName;

ImageIcon ic = ImageResize.resizeImage(fullPath, 1024, 1024);

Image i = ic.getImage();

BufferedImage bi = new BufferedImage(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = bi.createGraphics();

g2.drawImage(i, 0, 0, null);

g2.dispose();

String newFileName = tmpFileName.replaceFirst(".jpg", "_resize.jpg");

String newPath = tmpPath+"/"+newFileName;

ImageIO.write(bi, "jpg", new File(newPath));

System.out.println(newPath);

}

}

System.out.println("FIN");

}

}





Posted by TY
,

아.. 속상하다 진짜.ㅠㅠ 게을러서 망함 ㅠㅠ

코드 테이블에 관련된 부분을 보고 있는데 자꾸 iBatis에서 본 적도 없는 에러가 나는 것이었다.

 에러 내용인즉슨..

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   

--- The error occurred in sqlmap/dummy.xml.  

--- The error occurred while applying a result map.  

--- Check the code.CodeResult.  

--- The error happened while setting a property on the result object.  

--- Cause: net.sf.cglib.beans.BulkBeanException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   

--- The error occurred in sqlmap/dummy.xml.  

--- The error occurred while applying a result map.  

--- Check the code.CodeResult.  

--- The error happened while setting a property on the result object.  

--- Cause: net.sf.cglib.beans.BulkBeanException



였다.

인터넷에는

1. 아마 ResultMap에 property랑 매치가 안될 것이다
2. 네가 ResultMap 지정해 준 클래스에 getter, setter가 제대로 지정이 안 되있을 것이다
3. ResultMap에 쓸 class랑 ResultMap의 property수가 맞지 않을 것이다

였는데 다 안되는거였다.

찾아오는 멘붕.. 

알고보니까 INT형 값에 기본값이 들어있지 않으면 에러가 나는거였다. 

다른걸 하고 있다가 번뜩이며 생각나서 그냥 막 값을 넣어보았더니 갑자기 하나는 받아오는데 성공하고 다음꺼부터 실패하더라 ㅠㅠ

이제 웹/웹서버 개발 나름 만 3년 정도 채운 것 같은데..

스프링은 배운지 아직도 채 1년이 되지 않았기 때문에 삽질이 너무 많아서 작업 속도가 영 안나오는 것 같다.

대형 프레임웍을 수용할 수 있으려면 게임 서버를 만들건 뭘 만들건 스프링같은 프레임웍을 쓰는게 좋을 것 같은데...

php처럼 막 짤 수가 없는 부분이 답답하다. 그렇다고 Servlet을 쓰자니 php하는 만 못하는 것 같고... 언제쯤 능숙해질까? 걱정이다. 

spring에러는 ASP보다 해석하기가 더 어려운 것 같다 -_- ASP구버전도 에러 해석할 때 정말 힘들었는데..

어쨌든 오늘은 글자 하나 써주긱 귀찮아서 삽질을 좀 오래 했다.

오늘의 교훈: column에 default value 설정을 꼼꼼히 해주자 

 

Posted by TY
,
위 에러는 Jackson json 라이브러리와 java쪽을 연동했을 때 나오는 에러이다.

위 에러가 나는 이유는 흔한 인터넷 검색(stackoverflow  이나 springform 같은 사이트들)에서는 다음과 같이
이야기한다.

1. 네가 멤버 변수의 이름을 잘못 적었어(userIdx인데 usreIdx로 적었다던가, model이나 json보내는 쪽 둘다를
  확인하라 한다)
2.  Getter와 Setter가 제대로 있긴 한거야? 
3. 클래스의 이름이 틀린거 아냐? 대소문자를 제대로 구별하라고!

그러나 나는 위와 같은 사실들을 검색하기 정네 모두 확인을 하고 뻐킹 인터넷을 외칠 수 밖에 없었다.

그리고 오늘 하다가 아는 고수분께 질문을 했다.

위의 3가지 통과의례를 거치고, 내 json부분 처리랑 json data를 보여드렸더니 하시는 말씀이...

"Java 네이밍 규칙에 맞지 않아. Jackson json도 Java 네이밍 규칙을 따를테니 한 번 수정해봐." 라고 하셨다.

약간의 착오로  DB를 생성할 때 첫 글자를 모두 대문자로 해서 통일성을 위해 DB와 연동되는 Model부분도
모두 대문자로 작성하고 그와 연동되는 부분도 모두 대문자로 작성했다.

그랬다! 변수는 첫 글자를 대문자로 쓰지 말고 소문자로 써야했던 것이다.

이 부분을 수정했더니 잘 되더라.

어머 신기해라... 
Posted by TY
,