2009년 06월 16일
영진출판사 흠집있는 도서 최대 70% 할인행사
# by | 2009/06/16 09:32 | 영화 책 | 트랙백 | 덧글(0)
# by | 2009/03/24 15:41 | 자바 | 트랙백
현재 하는 일: 프로그래머
로드맵에서 각 단계별로 보면 좋은 책: 책도 좋지만 블로그나, 메일링리스트등을 통해 다양하고 최신의 정보를 얻고 피드백을 주고받는게 중요하다고 생각됩니다.
로드맵에 대한 자신의 생각: 적다보니 안 봤던 책이나 다시 봐야할 책들이 많은 거 같습니다. 공부해야겠네요 ㅎ
회사생활 초창기에 이런 책들이 나왔으면 도움이 많이 되었을 거 같습니다.
회사에 들어가서 자바 웹 프로그래머가 되야 한다면.. 이라는 생각을 가지고 로드맵을 작성해보았습니다.
프로그래밍 입문: 먼저 다음서적들을 읽어보고, 어 내가 생각했던거랑 다르네 하면 진로를 다시 고민해보고,
어 좀 재밌겠는데 하는 생각이 든다면 프로그래머가 되기를 바랍니다.
프로그래머 간접체험과 가이드가 되어줄 책
|
|
취직전: 회사는 학원이 아니다 기본적인 것들은 배우고 들어가자.
웹 프로그래머가 된다면 HTML만들기와 DB작업을 위한 SQL은 필수다.
HTML은 메모장으로 정적인 HTML을 만들정도, SQL은 select insert delete,update정도면 충분
| |
예전엔 필요없었는데, 요새 소프트웨어 경력관리 등록하려면 하루라도 빨리 정보처리기사 따 두어야 한다. (국내에선 자격증이 무시되지만 일본은 자격증 많이 인정해준다.)
리눅스/유닉스는 학교에서 어느정도 접해보는게 좋다. 목적은 윈도우만 주로 쓰던 사람들이 리눅스/유닉스를 회사에서 접했을때의 문화적 충격을 견딜 수 있도록 두려움을 없애는 용도. 로그인해서 간단한 명령어를 직접 실행해보는 정도면 충분
알고리즘도 회사들어가면 시간내어 보기 힘들테니까 여기에 포함
한번에 붙자 !! |
| |
음 이제부터가 실질적인 자바 로드맵이 되겠네요.
이클립스 툴 자체에 대한 사용법(이건 인사이트책)을 먼저 익히고, 자바 언어를 학습해야겠죠. 초보개발자는 IDE부터 시작하는게 좋다고 생각합니다.
회사에서 개발을 한다면 소스코드에 대한 버전관리와 버그를 처리하는 시스템은 거의 필수일테고, 그런 시스템이 없다면 아래의 책과 같은 것을 읽으면 누구나 쉽게 시스템을 설치하실 수 있습니다.
웹 개발을 한다면 서블릿/JSP, JDBC에 대해 공부를 해야 하구요.


이정도 하면 기존 작성된 소스를 유지보수하는데는 지장이 없지만, 경력이 쌓여 이제 설계를 해야한다면 디자인패턴을 적용하고 객체지향 설계를 하거나 혹은 검증된 프레임웍을 사용하게 되겠지요. 프로젝트관리를 해야한다면 소프트웨어 개발 방법론도 알아둘 필요가 있습니다.

출시된 제품의 성능이 문제가 되어 튜닝을 해야한다면 IO쪽과 DB쪽에 대한 지식이 필요합니다.
PS) 한빛미디어에서 이클립스의 활요에 대한 책은 요새 많이 나왔는데 기본 사용법에 관련된 책은 찾기 힘드네요. 스프링 최신버전에 대한 책도 나와주었으면 좋겠습니다.
# by | 2009/03/18 00:58 | 자바 | 트랙백 | 덧글(3)
10회 JCO 컨퍼런스 후기
개회사: 이클립스가 태양을 점점 가리고 있다. 정통부폐쇄, 명텐도 ... 그럼에도 불구하고 노력하자.
참석하는 사람이 많이 줄은거 같다.
1. Session 1 : Kestrel 105 - Method Chain & Ajax Application
강의가 정상적으로 끝났다면 별4개는 줄 수 있었을텐데..
하지만 강의자료 18/36 밖에 소화하지 못 했다는것은 준비부족이라는 말밖에 ...
장황한 서론과 본인의 책소개
메소드체인에 대해 들은것이라곤 prototype이나 jquery에 비해 쓸데없는 객체생성이나 루프가 없다는 것으로 끝. (prototype은 document.getElementById해도 native하지 않은 뭔가 가공한 객체를 넘겨줌, jquery는 생성한 객체를 캐시를 위해 어떤 배열에 담는다. FireBug 를 통해 디버깅모드로 단계별로 진행해주는것을 보니, js프레임웍단에서 단순히 id로 객체가져오는데도 부수적인 로직을 많이 탐을 알 수 있었다.)
별: 2
2. Session 2 : Mustang 102 - Seam 에서 WebBeans가 되기까지
레드햇혹은 선의 스폰서 세션
전세계 프로젝트에서 1%밖에 쓰이지 않는 엔터티빈에 대한 반성으로 하이버네이트에서 유명한
Gavin King에게 수술을 시켜서 EJB3.0을 만들고,
요거랑 Persistence Layer랑 JSF를 손쉽게 엮어주는 SEAM 프레임웍을 만듬.
표준으로 만들자 하여 JSR-299 Web Beans로 제안됨.
이 기술이 거의 어노테이션 기반의 디펜던시 인젝션으로 되어 있는데, DI 라면 이 개념을 널리 퍼뜨리고 노력한 스프링쪽에서는 자기네가 아닌 Sun쪽에서 표준이 만들어진다는 점에서 자존심이 상했는지 JSR-299에 반대하며 투표를 거부
별: 4
3. Session 3 : Tiger 103 - 차세대 배치 시스템 구축 성공 전략
국내에서 spring-batch를 이용한 reference가 생겼다는 점에 의의
써보고 싶다.
별: 3
4. Session 4 : Merlin 104 - Practical MapReduce
MapReduce를 통해 구글의 페이지랭킹이 어떻게 이루어지는지 알게 된 좋은 기회였다.
알고리즘에 대해서도 간단하면서도 이해하기 쉽게 설명해주셨고,
말하는 속도도 딱 적당했다.
HeadFirst Hadoop도 같이 들었으면 좋았을껄...
별:5
시스템: 사전 강좌 예약제에 대해선 정말 너무 너무 만족한다. (처음 시행된 제도라 참석신청만 했다가
나중에 보니 강좌도 신청하는거라 원하는 강좌를 몇 개 신청못했었다.
참석신청한 후 바로 등록하라고 안내가 있었으면 더 좋았었을걸..)
별 5개
경품: 처음으로 이렇게 많은 경품을 타봤다.
미코노미, 이클립스 프로젝트 필수 유틸리티,
썬의 듀크 매달려있는 연필꽂이
Fire up your Passion Again 이라고 쓰인 썬의 파란색 티,
UnFakeable Linux라고 쓰인 레드햇의 빨간색 티,
마지막으로 마우스와 볼펜들
혹시나 아는 사람 있을까 둘러봤는데 한 사람도 못 만났다.
추신
이번 강의는 못들었지만 신상철님은 언제나 열정적이시다. 쉬는시간에도 선 부스 앞에서 JavaFX에 대해 열정적으로 설명하시고 계셨다.
마지막으로 준비하고 진행하느라 고생했던 분들에게 진심으로 감사드립니다.
# by | 2009/02/28 21:36 | 자바 | 트랙백(1) | 덧글(4)
신청 강의 목록
Session 1 : Kestrel 105 - Method Chain & Ajax Application
Session 2 : Mustang 102 - Seam 에서 WebBeans가 되기까지
Session 3 : Tiger 103 - 차세대 배치 시스템 구축 성공 전략
Session 4 : Merlin 104 - Practical MapReduce
# by | 2009/02/26 18:38 | 자바 | 트랙백 | 덧글(2)
The Java 1.4 family will reach its End of Service Life (EOSL) this year, in October 2008.
Similarly, Sun announced in April that the EOSL for Java 5.x will be in October of 2009.
If you are still using a Java 1.4x version, it might be time to cut the cord
jdk1.4 에 대한 서비스 라이센스가 2008년 10월 종료되었고, jdk1.5 에 대한 라이센스가 2009년 10월에 종료된다고 했으니 여러분이 jdk1.4버전을 쓰고 있다면 이제 독립을 해야할 시간이 되었다.
누군가의 보살핌이나 지원에서 벗어나 독립하라고 할 때에는 'cut the cord'라는 표현을 쓴다. 여기서 말하는 cord는 전기선이 아니라 아이가 태어날 때 엄마와 연결되어 있는 탯줄을 의미한다. 따라서 '탯줄을 끊고 독립하다'는 의미를 가지고 있다. (from http://e4u.ybmsisa.com/EngPlaza/hotWord.asp?idx=1514)
# by | 2009/01/27 00:33 | 영어 | 트랙백
http://weblogs.java.net/blog/aim/archive/2009/01/layout_primer_f.html
상위 노드를 기준으로 상대적으로 원점을 translateX, translateY만큼 이동
Example 1: Let's look further at these bounds variables using a concrete code example which creates a rectangle.
Note that x and y are variables specific to javafx.scene.shape.Rectangle and that they position the rectangle within its own coordinate space rather than moving the entire coordinate space of the node. I throw this out as the first example because it is often the first thing that trips up developers coming from traditional toolkits such as Swing, where changing x,y effectively performs a translation of the component's coordinate space. All of the javafx.scene.shape classes have variables for specifying appropriate shape geometry within their local coordinate space (e.g. Rectangle has x, y, width, height, Circle has centerX, centerY, radius, etc) and such position variables should not be confused with a translation on the coordinate space, as we'll look at in our next example.
Example 2: To translate the rectangle along with its coordinate space (rather than move the rectangle within it), we instead set translateX/translateY, which are variables on Node.
Now boundsInParent has changed to reflect the translated rectangle, however boundsInLocal and layoutBounds remain unchanged because they are relative to the rectangle's coordinate space, which was what was shifted.
inside design note: we debated endlessly on whether to rename translateX,translateY to "x","y" (as it's less typing and more familiar to traditional toolkit programming), however we decided that "translate" was more descriptive in the 2D sense and keeping it avoided renaming the x,y position variables in some shape classes.
# by | 2009/01/26 21:12 | 자바 | 트랙백
JavaFX Migration From Preview Release to 1.0
1. http://steveonjava.com/2008/12/07/migrating-from-the-javafx-preview-release/
2. http://kendrew88.blogspot.com/2008/12/migrating-from-preview-sdk-to-10-of.html
# by | 2009/01/20 09:19 | 트랙백
학습 곡선 일지 4편: 웹 서비스 액세스 from http://blog.sdnkorea.com/blog/652
예제 그대로 실행해보려 했더니 1.0 대의 API에 없어지거나 변경된 메소드들이 많아서
컴파일이 되는 정도로만 수정
레이아웃은 SequentialCluster등을 몰로 바꾸어야 할 지 몰라서 그냥 좌표로 하드코딩 -_-


Main.fx
/*
* Main.fx
*
* Created on 2009. 1. 17, 오후 8:46:14
*/package imagesearch;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.ext.swing.SwingLabel;
import javafx.ext.swing.SwingTextField;
import javafx.ext.swing.SwingList;
import javafx.ext.swing.SwingListItem;
import javafx.ext.swing.SwingIcon;
import javafx.ext.swing.SwingButton;
import javafx.scene.paint.Color;
import javax.swing.border.LineBorder;
import javafx.scene.Group ;import java.lang.System;
/**
* @author bumjin
*/
var searchLabel = SwingLabel {
text: "Search:"
translateX: 10
translateY: 0
};
var searchTextField = SwingTextField {
columns: 30
translateX: 150
translateY: 0};
var searchButton = SwingButton {
text: "Search"
font: Font {name: "Arial", size: 11}
translateX: 500
translateY: 0
width: 80
height: 22
}
var matchedImageLabel = SwingLabel {
text: "Progress"
translateX: 10
translateY: 40
};
var matchedImagePB = TempProgressBar {
width: 350
translateX: 150
translateY: 40
};class PhotoList extends SwingList {
public var onChange:function(photo:Photo);
public var selectedPhoto:SwingListItem = bind selectedItem on replace {
var photo = selectedPhoto.value as Photo;
if(onChange!= null) {
onChange(photo);
}
}}
var thumbnailList = PhotoList {
//hmax: Layout.UNLIMITED_SIZE
//vmax: Layout.UNLIMITED_SIZE
translateX: 10
translateY: 80
width: 300
height: 230
scrollable: true
};//var selectedImageLabel = SwingLabel {
// translateX: 10
// translateY: 320
// text: "Selected Image"
//};//var selectedImagePB = TempProgressBar {
// translateX: 150
// translateY: 320
//};var selectedImageDisplay = SwingLabel {
//hmax: Layout.UNLIMITED_SIZE
//vmax: Layout.UNLIMITED_SIZE
translateX: 320
translateY: 80
width: 300
height: 230
};// configure the search field
var searcher = ImageSearcher {
callback: function(photos:Photo[]):Void {
thumbnailList.items =
for(photo in photos) {
SwingListItem {
text: photo.title
value: photo
}
};matchedImagePB.indeterminate = false;
}
};var search = function():Void {
System.out.println("searching... {searchTextField.text}");
matchedImagePB.indeterminate = true;
searcher.search(searchTextField.text);
};searchTextField.action=search;
searchButton.action=search;
// configure the image loader
var imageLoader = function(photo:Photo):Void {
if(photo != null) {
matchedImagePB.indeterminate = true;
photo.loadFullImage(function():Void{
selectedImageDisplay.icon = SwingIcon {
image: photo.fullImage };
matchedImagePB.indeterminate = false;
});
}
};thumbnailList.onChange = imageLoader;
// WORK AROUNDS
selectedImageDisplay.getJComponent().setOpaque(true);
selectedImageDisplay.getJComponent().setBackground(Color.WHITE.getAWTColor());
selectedImageDisplay.getJComponent().setBorder(new LineBorder(Color.BLACK.getAWTColor(), 1, true));Stage {
title: "Application title"
width: 650
height: 400
scene: Scene {
fill: Color.WHITE
//width: 600
//height: 400
content :[
searchLabel
, searchTextField
, searchButton
, matchedImageLabel
, matchedImagePB
, thumbnailList
// , selectedImageLabel
// , selectedImagePB
, selectedImageDisplay]
}
}
Photo.fx
TempProgressBar.fx/*
* Photo.fx
*
* Created on 2009. 1. 17, 오후 8:50:38
*/package imagesearch;
/**
* @author bumjin
*/import javafx.scene.image.*;
import java.lang.*;
import javax.swing.SwingUtilities;
import javax.imageio.ImageIO;public class Photo {
public var id:String;
public var server:String;
public var farm:String;
public var title:String;
public var secret:String;var image:Image = null;
public var fullImage:Image = null;
public def fullImageURL = bind "http://static.flickr.com/{server}/{id}_{secret}.jpg";
public function loadFullImage(
callback:function():Void
):Void {if(image == null) {
var thread = new Thread(Runnable {
public override function run():Void {
var strImageUrl = "http://static.flickr.com/{server}/{id}_{secret}.jpg";
System.out.println("loading: {strImageUrl}");
var buffImg = ImageIO.read(new java.net.URL(strImageUrl));SwingUtilities.invokeLater(Runnable {
public override function run():Void {
image = Image.fromBufferedImage(buffImg);
fullImage = image;
if(callback != null) {
callback();
}
}
});}});
thread.start();
} else {
callback();
}}
}
ImageSearcher.fx/*
* TempProgressBar.fx
*
* Created on 2009. 1. 17, 오후 9:20:09
*/package imagesearch;
/**
* @author bumjin
*/import javafx.ext.swing.*;
public class TempProgressBar extends SwingComponent {
protected override function createJComponent():javax.swing.JComponent {
return new javax.swing.JProgressBar();
}
public var indeterminate:Boolean = false on replace {
var prog =
this.getJComponent() as javax.swing.JProgressBar;
prog.setIndeterminate(indeterminate);
}}
/*
* ImageSearcher.fx
*
* Created on 2009. 1. 17, 오후 8:48:41
*/package imagesearch;
/**
* @author bumjin
*/import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;
import java.lang.System;
import java.lang.Thread;
import java.lang.Runnable;
import javax.swing.SwingUtilities;public class ImageSearcher {
public var callback: function(photos:Photo[]):Void;public function search(search:String) {
var thread = new Thread(Runnable {
public override function run():Void {
var photos:Photo[];var handler = DefaultHandler {
public override function startDocument() { }
public override function startElement(
uri:String,
localName:String,
qName:String ,
attributes:org.xml.sax.Attributes ) {
if(qName == "photo") {
var photo = Photo {
id: attributes.getValue("id")
server: attributes.getValue("server")
farm: attributes.getValue("farm")
title: attributes.getValue("title")
secret: attributes.getValue("secret")
};
insert photo into photos;
}
}
public override function endElement(uri:String , localName:String , qName:String ) { }
public override function endDocument() { }};
var SEARCH_URL = "http://api.flickr.com/services/rest/?"
"method=flickr.photos.search";
var key = "a876089a0c597414e3f6136b68e957e1";
var MAX_IMAGES = 100;
var searchUrl = "{SEARCH_URL}&api_key={key}&per_page={MAX_IMAGES}&text={search}";
var url = new java.net.URL(searchUrl);
var is = url.openStream();
var factory = SAXParserFactory.newInstance();
var saxParser = factory.newSAXParser();
saxParser.parse(is, handler);SwingUtilities.invokeLater(Runnable {
public override function run():Void {if(callback != null) {
callback(photos);
}
}
});
}
});
thread.start();
}
}
# by | 2009/01/18 15:56 | 자바 | 트랙백
1. catalina.sh 에서 JDPA_ADDRESS설정
$vi catalina.sh
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
echo "Using JAVA_HOME: $JAVA_HOME"
if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="1818"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=n"
fi
CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
shift
fi
설명 : JPDA_ADDRESS 가 정의되지 않았으면 디버깅용포트를 1818로 설정
if [ -z "$JPDA_ADDRESS" ]; then (-z 문자열 : 문자열의 길이가 0이면 참)
JPDA_ADDRESS="1818"
2. 디버그 모드로 톰캣 실행
$ catalina.sh jpda start
3. eclipse에서 디버깅 설정
Run -> Debug Configurations
Remote Java Application 항목에 추가


4. 이제 원하는 WAS단 서블릿 같은 코드에 브레이크 포인트를 걸고 디버깅하면 된다.
# by | 2009/01/14 10:29 | 자바 | 트랙백
JavaScript 언어에서 어떻게 개체 지향 프로그래밍을 지원하는지 자세히 살펴보고 이러한 지원을 사용하여 JavaScript에서 효과적으로 개체 지향 개발을 수행하는 방법
http://msdn.microsoft.com/ko-kr/magazine/cc163419.aspx
prototype.js 분석 전 알아두어야 할 자바스크립트 특징
http://blog.naver.com/st1503/10021315233
# by | 2009/01/13 14:08 | 웹기술 HTML javascript | 트랙백
Location:
http://www.thinkui.com/sqlclient/index.html
ThinkUI Software Inc. is pleased to announce the availability of ThinkUI SQL Client 1.0.9.
(ThinkUI SQL Client 1.0.9 버전이 출시되었다.)
The ThinkUI SQL Client is a graphical program that allows Java developers to browse a database structure, edit data in the tables, issue SQL queries
, and generate code (e.g. Java Bean, DAO, SQL queries, JSP files, etc.) based on customizable Velocity templates.
(ThinkUI SQL Client 는 자바개발자들에게 데이타 구조를 살펴보고, 테이블안의 데이타를 수정하고 , SQL 쿼리를 생성하고,
Velocity 템플릿기반의 코드(Java Bean, DAO, SQL queries, JSP files, etc)를 생성할 수 있게 해주는 그래픽UI를 가지고 있는 프로그램이다.)
설치:
thinkui_sqlclient-1.0.9.zip 의 압축을 풀고
thinkui_sqlclient.bat 파일을 실행시키면 됩니다.
(주의: 오라클 사용시 thinkui_sqlclient.bat 에서 오라클 드라이버이름을 lib경로에 있는 ojdbc14-9.2.0.8.jar로 바꾸어 주세요.
set _ORACLE_JAR=lib\ojdbc14-9.2.0.8.jar)
라이센스신청
라이센스가 필요하므로
http://www.thinkui.com/ 에서 라이센스를 신청하시면 됩니다.
데모
http://www.thinkui.com/tutorials/intro_derby.html
스크린샷


# by | 2009/01/08 10:18 | 자바 | 트랙백
자바 헛 배웠군 -_-
클래스에 final 사용해놓고 변경안되는 줄 알고 있었는데.. 쩌비
변수에 쓸때만 값이 변경안되고 , 클래스에 쓸때는 확장을 막는 기능을 하네.
4.3 final - 마지막의, 변경될 수 없는
final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.
변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.
final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
[참고]대표적인 final클래스로는 String과 Math가 있다.
# by | 2009/01/07 09:45 | 자바 | 트랙백
| Answer : | Dear Sir/Madam, We did not get a reply from you for your country name. Should you have any further requests or questions please do not hesitate to contact us again. With kind regards, John Mazzilli Customer Support Representative | |
# by | 2008/11/27 09:42 | 컴퓨터 | 트랙백
◀ 이전 페이지 다음 페이지 ▶