'Etc' 카테고리의 다른 글
| Java Magazine 11/12 2011 (0) | 2011/11/16 |
|---|---|
| ansi color code and text format (0) | 2011/01/20 |
'java'에 해당되는 글 110건
2011년 11월과 12월 자바 매거진입니다..
'Etc' 카테고리의 다른 글
예전에 자바로 개발해본 업데이터/런처입니다..
jar 파일의 다운로드는 jnlp를 이용하고 있습니다.. 당근 파샬(partial) 업데이트 불가입니다.. ^^;; 설명은 없고, 코드만 있습니다.. ㅋㅋ 'Java' 카테고리의 다른 글
예전에 C#의 Dataset을 Java와 연동하는 이슈로 soap vs json 포맷의 성능을 비교했던 자료입니다.
'Data' 카테고리의 다른 글
Java Proactor PDF 문서입니다..
'Data' 카테고리의 다른 글
LRU는 Least Recently Used의 약자로, 간단하게 최근에 사용된 넘을 캐시에 유지한다는 것이 LRUCache 입니다..
간단하게 아래와 같이 만들 수 있습니다. 1. 코드 속에서 간단하게 만들기..
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) { // This method is called just after a new entry has been added public boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_ENTRIES; } }; 2. LinkedHashMap을 이용해서 만들기..
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
private int lruSize; public LRUCache(int size) { lruSize = size; } @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > lruSize; } } 보통 위에처럼 하게 되면 그냥 됩니다.. 그러다가 점점 메모리 릭이 납니다.. ^^;; 그래서 해결책을 찾아보니, https://code.google.com/p/reflection-dsl/source/browse/trunk/ReflectionDsl/src/br/com/bit/ideias/reflection/cache/LRUCache.java?spec=svn204&r=204 에서는 Value에 해당하는 객체를 SoftReference로 래핑해서 땜빵(?)하고 있네요.. ^^;; 그래서 저같은 경우에는 명시적으로 객체를 삭제하는 코드를 입력해서 사용하고 있습니다. 아래의 코드를 통해서 잠재적으로 발생할 수 있는 메모리릭을 없애 주세요.. ^^
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
boolean isRemove = size() > maxsize; if (isRemove) { Object obj = this.get(eldest.getKey()); if(obj instanceof BufferedWriter) { // V가 BufferedWriter 인스턴스임.. try { ((BufferedWriter)obj).close(); } catch (IOException e) { e.printStackTrace(); } } this.remove(eldest.getKey()); } return isRemove; } 'Java' 카테고리의 다른 글
자바도 nio 패키지 내에서 channel을 통한 buffer의 scatter/gater를 지원하고 있습니다.
현재, 프로젝트의 프로토콜이 header + body의 구조를 띄고 있고, 매번 single buffer에 put, send 하고 있고, 받을 때도 역시, 똑같이 하고 있습니다. 그걸 아래의 튜토리얼에 있는 scatter/gater 방식을 통해서 코드를 깔끔하게 만들 수 있습니다. * read
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(buffers); * write
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.write(buffers); 위 예제와, 좀 더 자세한 내용 아래의 주소를 통해서 보실 수 있습니다. ^^ http://tutorials.jenkov.com/java-nio/scatter-gather.html 'Java' 카테고리의 다른 글
웹에 데이타를 전송해 주기 위해서, 데이타를 캐시하고 있는 서버에서 데이타를 json 포맷으로 가지고 있습니다.
라이브러리는 google-gson을 사용합니다.. json simple이나 jacson json processor에 비해서 속도는 뒤 떨어지지만, library의 사용성(?), 편리함(?) 때문에 사용을 하고 있습니다.. 데이타 저장을 위해서 json 포맷이다 보니, character set에 따라 크기, 즉 메모리나 데이타의 전송량이 달라지기 때문에, utf-8로 인코딩을 하고 byte[]의 길이를 체크해 보니.. 사이즈가 똑 같네요.. ^^;; 흠.. 소스 뒤져보니, utf-8로 인코딩을 하네요.. ㅋㅋ http://code.google.com/p/google-gson/ http://google-gson.googlecode.com/svn/tags/1.5/docs/javadocs/index.html http://sites.google.com/site/gson/gson-user-guide 'Tools' 카테고리의 다른 글
SocketChannel의 read 메쏘드는 timeout이 존재하지 않습니다.
혹, SocketChannel 객체의 .socket() 메쏘드로 소켓객체의 타임아웃을 세팅해도 먹지 않죠.. ^^;; 그래서, non-blocking의 read 메쏘드에 대한 timeout은 busy waiting하는 형태로 타임아웃을 줄 수 있겠습니다..
// 20초
long timeout = 20 * 1000; long stime = new Date().getTime(); long rtime = 0L; int rvalue =0; int rvalues = 0; while (rtime < timeout ) { rtime = System.currentTimeMillis() - stime; rvalue = channel.read(rbuffer); if(rvalue == -1) throw new Exception("connection closed"); rvalues = rvalues + rvalue; if(rtime > timeout) throw new Exception("read timeout exception"); if(rvalues >= 4) break; } 'Java' 카테고리의 다른 글
non-blocking SocketChannel에서 끝까지 읽어오는 코드입니다.
개인적으로 헤더 8byte, 헤더의 앞의 4byte를 전체 패킷을 길이로 잡습니다. 그리고, 아래처럼 SocketChannel에서 packet handling variables와 같이 패킷을 끝까지 다 읽어 들입니다. 아래 내용은 non-block으로 대용량의 바이너리 데이타를 읽어들이기 위해서 꼭 필요한 내용일 듯 합니다. * read() 내용
//// packet handling variables
private int fullsize = 0; private int readedsize =0; private int minsize = 8; @Override public void read() { try { // 읽기 int rbytes = this.channel.read(rbuffer); // 연결종료 if (rbytes == -1) { ((ChannelListener)this.listener).disconnected(this); this.close(); return; } // 버퍼에 내용이 없는 경우 if (rbytes == 0) { this.channel.configureBlocking(false); this.handle(); return; } // 읽은 바이트 갯수를 증감시킨다. readedsize += rbytes; rbufferList.add(this.copy(this.rbuffer, rbytes)); // 최소 패킷의 길이에서 패킷을 전체 길이를 리턴한다. if(readedsize >= minsize && this.fullsize == 0) { this.fullsize = this.createResultBuffer().getInt(); for(int i=0; i< this.rbufferList.size(); i++) { this.rbufferList.get(i).position(0); } } // 패킷을 다 읽어 들였다. if(fullsize == readedsize) { ((ChannelListener)this.listener).arrived(this,this.createResultBuffer()); } this.channel.configureBlocking(false); this.handle(); } catch(Exception e) { // disconnected try { this.close(); } catch(IOException ie) { new CallbackExceptionHandler().handle(ie); } ((ChannelListener)this.listener).disconnected(this); } } 'Java' 카테고리의 다른 글
흠...
현재 개발된 프레임웍의 구조는 master, slave reactor가 있고.. slave reactor가 네트웍 이벤트를 디스패칭을 하고있는 구조이고, 또 socketchannel의 read 메쏘드를 통해서 bytebuffer를 worker 쓰레드에 넘기는 구조인데요.. 최근에 큰 사이즈의 이미지를 전송하다 보니.... worker 쓰레드에서 socketchannel의 read 메쏘드를 호출하는 것이 더 맞아보이기도 하고.. 흠.. socketchannel의 read 메쏘드를 호출하는 객체가 slave reactor가 되야 될까요?? 아님 worker 쓰레드가 되야 될까요?? 고민이네.. ㅜㅜ 'Thinks' 카테고리의 다른 글
2004년도에 작성한 자료네요.. 이런 테스트 결과가 논문으로 게제가 되는건지 살짝 의아함이 드네요.. 물론 저도 할말은 없지만.. ^^;;
* 출처 : http://blog.naver.com/an5asis/60022142872 'Java' 카테고리의 다른 글
2006년도에 SUN에서 나온 Java VM의 Memory Management에 대한 문서입니다.
'Data' 카테고리의 다른 글
문서를 정리하다가 전에 정리된 문서에서 아래와 같은 내용이 있어서 포스팅 합니다..
단, 출처는 생각이 안 나네요. ^^;; The following set of command line options are recommended for running high performance server applications: 'Java' 카테고리의 다른 글
java에서 처리할 수 있는 signal과 그 내용입니다.
아래의 reference를 통해서 java에서 signal을 어떻게 처리하고, 새로운 signal을 등록할 수 있는 예제를 확인하실 수 있습니다.. 좋네요.. ^^ 아래는 자바에서 지원되는 시그널과 내용입니다..
OS별 지원되는 signal에 대한 내용입니다.
reference * http://www.ibm.com/developerworks/ibm/library/i-signalhandling/ * http://twit88.com/blog/2008/02/06/java-signal-handling/ * http://mimul.com/pebble/default/2009/07/19/1248007080000.html 'Java' 카테고리의 다른 글
위키에 언어별 web framework에 대한 내용에 대한 정리가 잘 되어 있습니다.
위 링크의 내용에서, 자바로 개발된 framework들에 대한 내용은 아래와 같습니다. Apache 프로젝트의 프레임웍들이 많네요.. ^^ 그리고, 10 Best Java Web Development Framework에 대한 내용도 좋네요.. ^^ 'Tools' 카테고리의 다른 글
자바를 주로 하는 개발자로써 재직중인 회사가 망한다거나, 다른 회사에 넘어가는 거보다 훨 슬픈 느낌이네요..
펭귄이 위로해주는게 참 의미심장합니다. ^^;; http://blogs.sun.com/jag/entry/so_long_old_friend 'Thinks' 카테고리의 다른 글
JDBC 1,2,3,4의 타입별 드라이버의 동작 방식과 설명입니다.
개인적으로는 가능한 JDBC4 타입으로 사용하는 것이 좋을듯 합니다. 아래내용은 http://www.precisejava.com/javaperf/j2ee/JDBC.htm#JDBC102 에서 참고를 하였습니다.
'Java' 카테고리의 다른 글
외부 API들이 JDK에 많이 포함이 되어 있습니다.
http://java.sun.com/javase/6/docs/api/ 문서의 package들을 보시면, javax나 org로 시작하는 외부(?) API들을 보실 수가 있는데요.. JDK에서는 rt.jar에 포함되어 잇지만, 아래의 내용처럼, http://aploit.egloos.com/4806304 님의 블로그에 포스팅된 내용을 보시면, 최신의 외부 API를 사용하기 위해서 java.endorsed.dirs 옵션을 사용해서 해결하는 내용을 보실 수가 있습니다. java로 작업을 하다보면 가끔씩 endorsed라는 디렉토리 명이 보였다. 사전을 찾아보면 배서하다, 추천하다, 양도하다 정도의 뜻이고, 사전적 의미가 아닌 java쪽에서는 어떤 의미로 사용되는지 몰랐다. 'Java' 카테고리의 다른 글
C구문의 전처리 구문인 #ifdef나 #ifndef같은 넘을 자바에서 사용하는 기본적인 내용입니다.
아래처럼 println이 DEF가 정의되었냐 혹은 DEBUG모드냐에 따라 달라지는 형태로 되어 있는 구문인 경우
public class IFDef{
public IFDef(){ int i = 100; #ifdef DEF System.out.println("DEF"); #else System.out.println("not DEF"); #endif } } 아래처럼, 바꿔주면 됩니다.
private static final boolean def = false;
if (def) { System.out.println("DEF"); } else { System.out.println("not DEF"); } 'Java' 카테고리의 다른 글
유명한 Doug Lea 교수님의 멀티 쓰레드 프로그램의 평가기준에 대한 내용입니다.
"Java 언어로 배우는 디자인 패턴 입문 멀티 쓰레드편, Yuki Hiroshi" 의 Introduction 2 챕터에 나오는 내용입니다. 아래 내용의 출처는 http://ethdemor.springnote.com/pages/4349969 입니다. 아래의 기준들은 Doug Lea 분류를 기준으로 한 것이며, 이런 류의 평가 기준은 대개 상반(trade-off)되는 경우가 있습니다. 'Java' 카테고리의 다른 글
c/c++ 호출
기본적으로 JNI를 이용해서 호출합니다. JNI를 쉽게 사용하기 위한 Wrapper들이 여러 개 존재하고 있습니다. - HawtJNI(http://hawtjni.fusesource.org/documentation/index.html ) - JNIWrapper(http://www.teamdev.com/jniwrapper/) - JNIEasy(http://www.innowhere.com/webapp/index.jsp#st=products.jnieasy ) c# 호출 j-interop (Pure Java – Com Bridge) : http://j-interop.org/ , 라이센스 : LGPL 3.0[1] java <-> c# - Jni4net : http://jni4net.sourceforge.net/ , bridge between Java and .NET (interprocess, fast, object oriented, open-source), 라이선스: opensource, GPL tools and LGPL runtime using net.sf.jni4net;
public class Program { private static void Main() { Bridge.CreateJVM(new BridgeSetup()); java.lang.System.@out.println("Greetings from C# to Java world!"); } } import net.sf.jni4net.Bridge;
import java.io.IOException; import java.lang.String; public class Program { public static void main(String[] args) throws IOException { Bridge.init(); system.Console.WriteLine("Greetings from Java to .NET world!"); } } - ikvm.net : http://www.ikvm.net/, jar -> .dll, .dll -> .jar ![]() 'Tools' 카테고리의 다른 글
delegation(위임)에 대한 정의는 아래와 같다.
Delegation means that you use an object of another class as an instance variable, and forward messages to the instance. 아래 예제는 위키의 Delegation Pattern 페이지에 나와있는 Java 예제입니다. class RealPrinter { // the "delegate" void print() { System.out.print("something"); } } class Printer { // the "delegator" RealPrinter p = new RealPrinter(); // create the delegate void print() { p.print(); // delegation } } public class Main { // to the outside world it looks like Printer actually prints. public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } } 누군가 말씀하신, 이벤트 소스/이벤트 핸들러/이벤트 리스너 어쩌주 저쩌구 거창한 얘기가 필요없다.. 쉽게쉽게 가장.. ^^ 'Lectures' 카테고리의 다른 글
Circular Dependency의 해악은 개발을 하다보면 자연스럽게 알게 된다..
회사에서 개발하는 시스템중에 처음에는 그러하지 않았을 것인데, 아키텍처링을 할 수 없는 지금의 조직에서 자연스럽게 Circular Dependency를 걸어버렸다.. 일정이라는 최고의 명제 아래 말이다.. 결국, 의존과 버전에 묶여서 뗄레야 뗄루 없는 커플처럼 되어 버린 기존의 시스템은 또다시 거대한 레거시로의 한발한발 다가서고 있다.. 정말로 뗄 수 없을 정도로 말이다.. 누군가는 나서서 해결을 해야 겠지만, 누가 하겠는가.. 일정에 맞춰서 들어온 일 처리해야쥐.. 결국 시스템의 모습은 직책자들의 마인드와 의지가 만들어 내는 우리의 현실이며, 이 모습은 좋은 개발팀 혹은 좋은 개발실은 아니라는 느낌을 지울 수 없다.. 아래 Building속성에서의 Circular dependencies는 Warning이 아니라 Error 상황이 되어야 된다. 그래서, 위의 상황을 미연에 방지를 해야된다.. 단순한, 일정에 맞춰야 되서 Warning이 Default가 되어서는 안될 것이다.. ^^;; 'Java' 카테고리의 다른 글
eclipse에서 자바로 개발을 하다보면, 라이브러리나 API대상의 코드를 확인하기 위해서 f3키를 눌려서 확인을 합니다.
특히, java api source를 보기 위해서는 자바 소스를 간단하게 링크만 하면 됩니다. 아래의 이미지처럼, JRE System Library에서 rt.jar의 속성창에서 Java Source Attachment의 Location path에 src의 위치를 확인시켜 주면 소스가 잘 나오네요.. ^^ 'Tools' 카테고리의 다른 글
낭중에 아래의 형태로 추가를 해야겠습니다.
public boolean write(ArrayList<ConfigValue> list) throws Exception {
for(int i=0; i < list.size(); i++) { System.out.println(list.get(i).getService() +" - "+ list.get(i).getKey()+" - "+ list.get(i).getValues().toString()); } String fileName = "config-test.xml"; String empty =" "; try { XMLOutputFactory xmlFactory = XMLOutputFactory.newInstance(); XMLStreamWriter writer = xmlFactory.createXMLStreamWriter(new java.io.FileWriter(fileName)); writer.writeStartDocument("1.0"); writer.writeCharacters(System.getProperty("line.separator")); writer.writeStartElement("sjava-config"); writer.writeCharacters(System.getProperty("line.separator")); String serviceName = list.get(0).getService(); ArrayList<String> serviceList = new ArrayList<String>(); serviceList.add(serviceName); for(int i=0; i < list.size(); i++) { if(!serviceName.equals(list.get(i).getService()) ) { serviceName = list.get(i).getService(); serviceList.add(serviceName); } } for(int i=0; i < serviceList.size(); i++) { writer.writeCharacters(empty); writer.writeStartElement("sjava-service"); writer.writeAttribute("name", serviceList.get(i)); writer.writeCharacters(System.getProperty("line.separator")); for(int j=0; j < list.size(); j++) { if(serviceList.get(i).equals(list.get(j).getService()) ) { serviceName = list.get(j).getService(); writer.writeCharacters(empty + empty); writer.writeStartElement("key"); writer.writeAttribute("name", list.get(j).getKey()); String tmpValue = ""; for(int z =0; z < list.get(j).getValues().length; z++) { tmpValue += list.get(j).getValues()[z]; if(z != list.get(j).getValues().length-1) tmpValue +=","; } writer.writeAttribute("value", tmpValue); writer.writeEndElement(); writer.writeCharacters(System.getProperty("line.separator")); } } writer.writeCharacters(empty); writer.writeEndElement(); writer.writeCharacters(System.getProperty("line.separator")); } writer.writeEndElement(); writer.flush(); writer.close(); } catch(Exception e) { e.printStackTrace(); } return true; } 위 코드로 아래의 결과를 만들어 낼 수 있다. <?xml version="1.0"?>
<sjava-config> <sjava-service name="sjava-config"> <key name="watch" value="false"></key> <key name="period" value="60"></key> </sjava-service> <sjava-service name="sjava-logging-server"> <key name="host" value="111.111.111.111,222.222.222.222"></key> <key name="port" value="20003"></key> </sjava-service> </sjava-config> 'My Project' 카테고리의 다른 글
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||