2012년 2월 2일 목요일

워드프레스로 이전합니다.

http://jangnan.wordpress.com로 블로그 이전합니다.

구글 블로그가 가독성이 너무 떨어지네요.
새로나온 테마 적용하면 카테고리가 부실하고 워드프레스가 그나마 나은거 같아서 옮깁니다.

2012년 2월 3일 it 기술 동향

java


spring mvc restful
http://nurkiewicz.blogspot.com/2012/02/automatically-generating-wadl-in-spring.html

Neo4j 와 직관적인 그래프
http://maxdemarzi.com/2012/02/02/graph-visualization-and-neo4j-part-two/

각종 자바 서버와 애플리케이션의 메모리 사용율 비교
http://www.jvmhost.com/articles/memory-usage-comparison-of-java-application-servers-and-applications#.Tykao1hFKhc.hackernews

팩토리 메서드 패턴 적용하기
http://www.java-only.com/LoadTutorial.javaonly?id=20

복잡한 이클립스 플러그인 없이 톰캣 디버깅하기
http://andreas.haufler.info/2012/01/launching-and-debugging-tomcat-from.html

glassfish 다중 도메인에서 클러스터링 하기
http://alexandru-ersenie.com/2012/01/30/glassfish-vertical-clustering-with-multiple-domains/

하이버네이트 캐시 레벨 튜토리얼
http://www.javacodegeeks.com/2012/02/hibernate-cache-levels-tutorial.html

gwt를 이용한 mvp 패턴 만들기
http://joergviola.blogspot.com/2011/07/gwt-mvp-made-simple.html

android

안드로이드 로그캣 로그를 실시간으로 푸쉬해줌
https://github.com/koush/logpush

Cloud computing

bigdata 가이드
https://plus.google.com/114723964985237592593/posts/a1p5LiURPW8

모바일 클라우드 보안
http://www.ibm.com/developerworks/kr/cloud/library/cl-mobilecloudsecurity/index.html

dart

심플한 게임만들기
http://phylotic.blogspot.com/2012/02/reactive-dart-series-part-3-of-n.html

마술상자 만들기
http://dzenanr.github.com/2012/02/02/from-s02-to-s03.html

javascript

backbone.js 예제
http://www.javageneration.com/?p=839

예제를 만들어보며 배우는 backbone.js
http://coenraets.org/blog/2012/01/backbone-js-lessons-learned-and-improved-sample-app

json 소개
http://www.w3resource.com/JSON/introduction.php

jquery

jpg디코더 js
https://github.com/notmasteryet/jpgjs

사진 크기를 늘렸다가 줄엿다가 할수있는 플러그인
http://www.dimin.net/software/panojs/

방향키로 스크롤링을 하는데 슬라이드 넘기는 거 같음
http://johnpolacek.github.com/scrolldeck.js/

프롬프트 메뉴를 구현하기 좋음
http://natrixnatrix89.github.com/promptu-menu/

사이드 패널
http://codebomber.com/jquery/slidepanel/

홈페이지 전면의 플래쉬급 배너제작가능한 애니메이션 플러그인
http://visitmix.com/labs/glimmer/

트위터 위젯
http://tweet.seaofclouds.com/

페이스북 타임라인 모방하기(좀틀림)
http://demos.9lessons.info/timeline/index.html

linux

조냉 많이 쓰는 리눅스 명령어 50개
http://www.thegeekstuff.com/2010/11/50-linux-commands/


etc.

Restful 한 개발이란 무엇인가?
http://stackoverflow.com/questions/671118/what-exactly-is-restful-programming

이메일 서버 설정 시나리오들
http://cloudtech.biz/email-server-configuration-scenarios/

나만의 로고 만드는법
http://www.netmagazine.com/tutorials/create-custom-lettered-logo-illustrator


2012년 2월 1일 수요일

2012년 2월 2일 it 기술 동향

JAVA

vaadin과 jsf중에 어느것을 선택해야할까
http://www.hildeberto.com/2012/01/choosing-between-vaadin-and-jsf.html

http://www.softwaretestingmagazine.com/videos/cucumber-with-jvm-improvements/

varnish 를 이용한 속도개선
http://blog.mgm-tp.com/2012/01/varnish-web-cache/

oracle의 java 앞으로 2년간의 로드맵
http://www.infoworld.com/slideshow/28552/java-roadmap-oracles-two-year-plan-185238

jax-rs를 이용해서 만든 rest api를 이용해 spring android를 이용한 앱만들기
http://www.ibm.com/developerworks/kr/library/x-springandroid/index.html

java ee6 의 샘플들 구성
http://blogs.oracle.com/arungupta/entry/java_ee_6_samples_in

http://blog.eisele.net/2012/01/sneak-peak-at-java-ee-7-multitenant.html

웹소켓 을 통한 브라우저에게 CDI이벤트 보내기
http://wesleyhales.com/blog/2012/01/20/Sending-CDI-events-to-the-browser-with-websockets/

java 7 에서의 파일 복사와 이동
http://codingjunkie.net/java-7-copy-move/


python

파워풀한 테스트를 위한 mock 오브젝트의 주입
http://blueprintforge.com/blog/2012/01/08/python-injecting-mock-objects-for-powerful-testing/

android

rapmobile
http://rapmobile.eclipsesource.com/

html5

웹 메시징 소개
http://dev.opera.com/articles/view/window-postmessage-messagechannel/

Javascript

이미지를 쉽게 drawing하게 해주는 js
http://thinkpixellab.com/pxloader/#sample1

jsdev 메뉴얼
https://github.com/markandey/JSDev/wiki/User-Manual

Jquery

jquery 30일 완성 이메일로 받는 교육
http://learnjquery.tutsplus.com/

마우스 커서를 찍으면 물방울 번짐 이펙트 일어남
http://nejimaki-act.com/lab/pointer/

글씨가 상하로 페인드인아웃됨
http://medienfreunde.com/lab/innerfade/

Dart

Nio 라이브러리 추가
http://news.dartlang.org/2012/02/dart-io-libraries-for-files-and-network.html

dart에서 web audio api 활용하기
http://news.dartlang.org/2012/02/web-audio-api-and-dart.html


json 으로 이름만 넣으면 dom구조로 마크업으로 만들어줌
https://github.com/insin/DOMBuilder


Node.js

https://github.com/OptimalBits/navcodec

웹개발에 용의한 심플한 middleware
http://matthewmueller.github.com/thimble/

start-stop-daemon
https://github.com/jiem/start-stop-daemon

단순하게 node.js로 서버 구현하고 클라이언트 만들어서 이벤트 푸시
https://github.com/einaros/sse.js

tools

리눅에서 사용가능한 compare synchronize 툴
http://www.webupd8.org/2012/02/compare-and-synchronize-folders-with.html

etc.
Google Maps API plus Fusion Tables 를 이용해서 만든 엘더스크롤 스카이림 지도
http://www.tamrielma.ps/skyrim/


21세기 코드리뷰
http://dublintech.blogspot.com/2012/01/code-reviews-in-21st-century.html

2012년 1월 31일 화요일

2012년 2월 1일 it 기술 동향

java


spring 3,3.1에서의 비지니스 컴포넌트 아키텍쳐
http://blog.codecentric.de/en/2012/01/a-business-component-architecture-with-spring-3-03-1-part-1-structure/


java8 부터 unsinged integer 지원
http://lukaseder.wordpress.com/2012/01/21/java-8-will-have-some-support-for-unsigned-integers/


spring 에서 junit을 이용한 scope bean테스트하는거랑 jee bean에 aquillan이용해서 테스트
http://niklasschlimm.blogspot.com/2011/07/integration-testing-scoped-beans-in-cdi.html

jboss의 html5에 대한 전략
https://community.jboss.org/wiki/AeroGearServerSideResources
http://planet.jboss.org/post/the_aerogear_mobile_html5_project_is_alive


python


심플한 소켓 클라이언트 쓰레드 코드
http://eli.thegreenplace.net/2011/05/18/code-sample-socket-client-thread-in-python/


html5


web storage동영상
http://debugmode.net/2012/01/28/video-on-web-storage-in-html5/


javascript

stellar.js
http://markdalgleish.com/projects/stellar.js/


canvas를 쉽게 쓸수있게 해주는 EaselJS
https://github.com/gskinner/EaselJS


psd파일을 파싱해주는 psd.js
http://meltingice.github.com/psd.js/


dart 나선 꼬기
http://dzenanr.github.com/


http://blog.involver.com/2012/01/26/testing-backbone-js-best-practices-2/


jquery


흥미로운 플러그인 40개
http://www.admixweb.com/2012/01/30/40-handy-jquery-plugins-for-serious-web-developers/

비디오 플레이어 플러그인
http://www.jqueryrain.com/2012/01/40-best-jquery-players-tutorials-both-audio-player-and-video-player/


쓸만한 플러그인 3종세트
http://dailyjs.com/2012/01/31/jquery-roundup/


jquery 보일러플레이트
http://jqueryboilerplate.com/




cloud



구글앱엔진 1.6.2 업데이트
http://googleappengine.blogspot.com/2012/01/app-engine-162-released.html

map reduce

http://code.google.com/intl/ko-KR/appengine/docs/python/dataprocessing/overview.html


Prospective Search
http://code.google.com/appengine/docs/python/prospectivesearch/overview.html

big query
https://developers.google.com/bigquery/

etc.



웹브라우저 얼랭 콘솔 에뮬레이터
http://svahne.github.com/browserl/

2012년 1월 30일 월요일

2012년 1월 31일 it 기술 동향

Java

java에서의 foreach 루프의 이해
http://javabynataraj.blogspot.com/2012/01/understanding-foreach-loop-in-java.html

DI는 왜 써야되는가?
http://cspray.github.com/2012/01/24/why-you-should-use-DI.html
http://googledata.org/google-testing/clean-code-talks-dependency-injection/

클라우드 환경 속에서의 자바 어플리케이션의 보안
http://www.ibm.com/developerworks/java/library/j-javadev2-23/index.html?ca=drs-

osgi 모듈 소개
http://www.javacodegeeks.com/2012/01/introduction-to-osgi-modular-java.html

자바 웹호스팅에 선택에 따른 플로우 차트
http://www.streamhead.com/java-web-hosting-options-flowchart/

Python

csv모듈
http://slott-softwarearchitect.blogspot.com/2012/01/python-32-csv-module-very-very-nice.html

Javascript

dart와 기존과의 비교로 배워보는 문법
http://synonym.dartlang.org/


Jquery

횡스크롤 배너
http://www.gcmingati.net/wordpress/wp-content/lab/jquery/newsticker/jq-liscroll/scrollanimate.html

이미지를 잘라주는 js 블로그의 댓글 다는 것 방식도 재밌다.
http://www.useragentman.com/blog/2011/10/29/clipping-jpeg-images-into-non-rectangular-polygons-using-polyclip-js/

CSS3

네비게이터를 클릭하면 별도의 창같이 화면이 내려온다.
http://tympanus.net/codrops/2012/01/30/page-transitions-with-css3/

뷸렛 드롭다운 네비게이터 메뉴
http://azadcreative.com/2012/01/bulletproof-css3-dropdown-navigation-menu/

Node.js

node.js redis를 이용한 트위터 앱 만들기
https://github.com/mashery/iodocs

분산 처리 기반의 로드 밸런서
https://github.com/LearnBoost/up

tools.

클라우드 베이스 테스팅 툴들
http://www.toolsjournal.com/testing-lists/item/404-10-cloud-based-testing-tools

파폭 10,11 개발자 툴들
http://www.webdesignerdepot.com/2012/01/new-developer-tools-in-firefox-10-and-11/

chromium 코맨드 라인 명령어
http://peter.sh/experiments/chromium-command-line-switches/


etc.

jboss as에서 html5 개발하기
http://vimeo.com/33538130

foundry의 멀티 다 언어 멀티 프레임워크 지원
http://blog.cloudfoundry.com/post/13481010615/multi-language-multi-framework-what-about-multi-cloud

ssd에 db를 사용하면 빠를까?
http://www.cubrid.org/blog/dev-platform/will-the-use-of-ssd-increase-the-speed-of-dbms/

모질라 그룹의 새로운 프로젝트 팬케이크
http://mozillalabs.com/blog/2012/01/pancake-a-new-project-from-mozilla-labs/

제 12회 한국자바개발자 컨퍼런스


2012년 1월 29일 일요일

Apache 와 Tomcat Load Balancing


mod_jk tomcat Connector : 

mod_jk는 tomcat servlet container와 Apache같은 AJP프로토콜을 사용하는 웹서버를 연결해주는 connector 입니다.

웹서버는 client의 request로부터의 response를 관리합니다.
request 가 올때 웹서버는 다음과 같은 행동을 하게합니다.

- sevlet containner connector library를 로드하고 초기화합니다.
- connector에서 인증된 url 포함한 어떤 request를 sevlet에게 주게됩니다.

이렇게 Connector는 웹서버와 container의 중간 매개체 역활을 합니다.

아래의 준비물을 다운받습니다.

1. apache web server 2.2.21(http://httpd.apache.org/download.cgi.)

일단 톰캣을 인스톨합니다.

1. 압축을 풀고 임의의 위치(디렉토리)에 위치시키도록 합니다.
2. 일단 설치후 {tomcat_root}/bin 에서  ./startup.sh를 실행시켜서 tomcat을 구동시킵니다.
3. 웹브라우저를 열어서 http:localhost:8080 에 접속합니다.
4. 3번 bin으로 돌아가서 ./shutdown.sh로  tomcat을 끕니다.

로드 밸런싱을 할 예정이므로 두개의 서버를 띄워야합니다.

1. 첫번째 받은 tomcat을 디렉토리이름만 다르게 압축을 풉니다.
    여기서는 처음 녀석은 tomcat1, 두번째 녀석은 tomcat2라고 합니다.
2. tomcat2의 하위 디렉토리에 conf폴더로 접근해서 server.xml 을 열어 보도록합니다.
3. <Server port=”8005″ shutdown=”SHUTDOWN”>  를 <Server port=”7005″ shutdown=”SHUTDOWN”>로 변경합니다.
(앞서 포트는 tomcat1이 사용중이니)
4. Change <Connector port=”8080″ maxHttpHeaderSize=”8192″… 를 <Connector port=”7070″ maxHttpHeaderSize=”8192" 변경한다.(위와 같은이유)
5.  <Connector port=”8009″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ /> 를  <Connector port=”7009″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />로 변경합니다.
6. tomcat2/bin으로 가서 ./statup.sh를 실행합니다.
7. http://localhost:7070/을 확인합니다.
8. bin으로 가서 ./shutdown.sh를 해서 끕니다.

다음은 apache서버를 세팅합니다.
(mac은 기본적으로 깔려있죠. 경로 : /usr/libexec/apache2)

1. 압축을 풀고 ./configure을 합니다.
2. make를 입력하여 설치를 진행합니다.
3. 웹브라우저를 열고  http://localhost/로 가서 80포트로 잘작동하는지 확인합니다.
4. stop 합니다.

이제 mod_jk 차례입니다.

1. 압축을 풀고 {apache_directory}/module에 mod_jk.so 파일을 copy & paste합니다.
2. {apache_directory}/conf 안에서 httpd.conf 파일을 수정할수 있게 열고 끝에 아래 문장을 추가합니다.
LoadModule jk_module modules/mod_jk.so 
3.{apache_directory}/conf 에 workers.properties라는 파일을 만든고 아래의 문장을 넣고 저장합니다.
  worker.list=worker1,worker2
                                worker.worker1.port=8009
                                worker.worker1.host=localhost
                                worker.worker1.type=ajp13
                                worker.worker2.port=7009
                                worker.worker2.host=localhost #you can also specify other machine address or name
                                worker.worker2.type=ajp13

-  wokrer1이 tomcat1, worker2가 tomcat2이다.

4.  httpd.conf 에  workers.properties를 정의해줘야한다. 
아래 내용을 넣어준다.

# Path to workers.properties
JkWorkersFile c:/apache2.2/conf/workers.properties
# Path to jk logs
JkLogFile c:/apache2.2/mod_jk.log
# Jk log level [debug/error/info] JkLogLevel info
# Jk log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “
# JkOptions for forwarding
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat “%w %V %T”
JkMount /jsp-examples/* worker1
JkMount /tomcat-docs/* worker2

5. jsp-examples로  tomcat1이 worker1로 tomcat-docs에는 tomcat2가 worker2로 되어 있다.

6. tomcat 1,2의 server.xml 을 수정합니다.
tomcat1에는 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker1″>
tomcat 2에는 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker2″>를 추가합니다.
7. tomcat1,2를 statup하고 apache webserver도 start합니다.

여기서 브라우저는 http://localhost/jsp-examples/ 와 http://localhost/tomcat-docs.를 둘다 가리킵니다.
여기서 이것을 구분하기 쉬운방법은 두 톰캣의 index.jsp의 제목을 변경해서 확인하는것입니다.
결국 둘은 따로 각각 경로를 가리키고 있는것을 확인할수가 있습니다.
이 시점에서 아파치 의 서브로 톰캣 인스턴스의 경로에 요청을 넘길 준비가 된것입니다.
하지만 여기서 톰캣에 대한 로드밸런싱에 관한 설정을  해줘야합니다. 만약 톰캣 1이 크래싱이 발생시 아파치는 자동으로 tomcat2에 어플리케이션에 대한 접근을 넘겨야합니다.
로드밸런싱 설정은 단순합니다.
우선
workers.properties를 열어줍니다. 
아래의 굵은글씨를 수정,추가합니다.

#worker.list=worker1,worker2
 worker.list=balancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=7009
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
# specifies whether requests with SESSION ID’s should be routed back to the same #Tomcat worker.
worker.balancer. sticky_session =True


싱글 워커에  balance 를 call하고 worker type에 lb(load balance)를 정의했습니다.
이 워커(worker.balancer.balance_workers)들은 worker1과 worker2를 관리합니다.
그리고 method에 'B'를 정의했습니다.
마지막 sticky_session는 true로 해줘야합니다. 
Session ID를 기반으로 라우팅을 지원할지에 대한 설정입니다..

마지막으로 httpd.conf를 열고  JkMount 맨앞부분에

JkMount /tomcat-docs/* balancer
JkMount /jsp-examples/* balancer

이 부분을 추가합니다.
이제 확인작업으로 tomcats와 apache를 구동하고 http://localhost/jsp-examples에 접속합니다. tomcat1or tomcat2에 접속하게 될것입니다.  

tomcat1,2에 둘다 접속된다는것을 확인하기 위해 앞서 해당 index.jsp를 교체하였던걸 생각하고 새로고침을 하여 첫페이지의 제목이 바뀌는것을 확인합니다.

Java Garbage Collection에 대해서


1. GC란?

GC는 JVM에서 쓰지 않는 메모리를 자동으로 회수하는 녀석을 말한다.

2. GC의 동작 방법

JVM 메모리 영역 3가지

YOUNG/OLD/PERM

Perm은 Method Area라고도 한다. 객체나 억류된 문자열 정보를 저장하는 곳이다.
여기서 GC가 발생해도 Major GC 횟수에 포함된다.
Perm에서의 GC (http://tuning-java.com/455) String intern한 정보에 대해서 FullGC가 발생한다.



GC 알고리즘

(1) Minor GC

Young은 Eden/Survior로 나뉘게 된다. 그런데 Survivor구역이 두개다 그래서 총 3개의 영역을 Young의 영역으로 보개된다.

YOUNG - EDEN 
            -  SURVIVE1,2
OLD

EDEN : 처음 객체가 생성될시에 상주한다.

Minor Gc가 발생시 아래와 같이 위치를 이동한다.

[MINOR GC 1차 발생시]

EDEN에서 ALIVE하면 SURVIVE1으로 이동한다.
EDEN CLEAR

[MINOR GC 2차 발생시]

EDEN에서 [alive] - > Survivor 2
Survivor  1  [alive] - > Survivor 2
Eden    Clear
Survivor 2 Clear

[MINOR GC 3차 발생시]

객체 생성시간이 오래지나면 Eden과 survivor영역에 있는 오래된 객체들을 Old 영역으로 이동

이런방식의 GC알고리즘을 Copy & Scavenge라고 한다. 이방법은 속도가 빠르며 작은 크기의 메모를 Collection하는데 매우 효과적이다. Minor Gc는 자주 일어나기 때문에 GC에 소요되는 시간이 짧은 알고리즘에 적합.

(2) Full GC(Major GC)

Old영역에서의 GC를 Full GC라고 부르며, Full Gc에 사용되는 알고리즘은 Mark & Compact라는 알고리즘을 사용한다. 

Mark는 전체 객체들의 레퍼런스를 쭉 따라가면서 레퍼런스가 연결되지 않은 객체들을 Mark한다. 이 작업이 끝나면 사용되지 않은 객체들이 Mark되고 Mark된 객체를 삭제한다.

Compact는 mark된 객체로 생기는 부분을 unmark된 사용하는 객체로 매꾸어 버리는 방법이다. 덮어쓰기?!

Full Gc는 속도가 매우 느리다. Full GC가 일어나면 순간적으로 Java app이 STW하기 때문에 FullGc가 일어나는 정도와 Full GC에 소요되는 시간은 App의 성능과 안정성에 큰영향을 준다.


3. GC가 중요한 이유

Minor Gc는 보통 0.5초로 빠르지만 Full GC의 경우 느리다. 5~10초 GC로 인해서 만약 app이 멈췄다가 풀리면 WAS의 경우 요청이 큐에 저장됬다가 한번에 엄청나게 봇물 터지듯이 받게 된다면 DDOS공격같은 효과로 부하가 발생해서 뻗어 버릴수가 있다.



4. 다양한 Old영역에 대한 GC 알고리즘

JDK7기준으로 5가지의 GC방식이 있다.

- Serial GC (쓰지 말자 싱글쓰레드 방식의 GC)
- Parallel GC
- Parallel Old GC(Parallel Compaction GC)
- Concurrent Mark & Sweep GC (이하 CMS)
- G1(Gargage First) GC (아직 시기상조 JDK7이라서 불안)

(1) Serial GC ( -XX:+UseSerialGC)

young 영역은 앞서 설명한 방식을 사용한다. 
Old영역에서 mark - sweep - compact방식을 사용한다.

- 순서     

     1. Old영역에서 살아있는 객체를 mark한다. 
     2. heap의 앞부분부터 확인하여 살아 있는것만 남긴다.(이게 sweep) 
     3. 각 객체들이 연속되어 쌓이도록 힙의 가장 앞부분부터 채워서 객체가 
         존재하는 부분과 객체가 없는 부분으로 나눈다.(Compaction)

Serial은 싱글 cpu 고려 한 알고리즘이라 코어갯수가 적을때 적합하다.(쓰지말자)


(2) Parallel GC( -XX:+UseParallelGC)

기본 알고리즘은 비슷하다. 
다만 싱글쓰레드로 처리하던 Serial GC에 비해서 멀티쓰레드로 처리하기 때문에 Serial보다 빠르다.
Parallel GC는 메모리가 충분하고 코어 갯수가 많을수록 유리하다.
Parallel GC는 Throughtput GC 라고도 불린다.

(3) Parallel Old GC(-XX:+UseParallelOldGC)

Parallel Old Gc는 jdk5 update 6부터 제공하는 Gc 이다. 앞서 Parallel Gc와 비교시 Old영역 Gc알고리즘이 틀리다.

이 방식은 Mark - Summary - Compaction 단계를 거친다.

Summary단계는 앞서 GC를 수행한 영역에 대해서 별도로 살아 있는 객체를 식별한다는 점에서 Mark-Sweep-Compaction 알고리즘의 Sweep단계와 다르며, 
약간더 복잡한 단계를 거친다.

(4) CMS GC(-XX:+UseConcMarkSweepGC)



1. initial Mark단계에서는 클래스 로더에서 가장 가까운 객체중 살아 있는 객체만 찾는것으로 끝낸다. 
따라서 멈추는 시간이 매우 짧다. 
2. Concurrent Mark 단계에서는 방금 살아 있다고 확인한 객체에서 참조하고 있는 객체들만 따라가면서 확인한다. 
이단계의 특징은 다른 쓰레드가 실행중인 상태에서 동시에 진행된다는 것이다.
3. Remark 단계에서는 Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다. 
4.Concurrent Sweep 단계에서는 쓰레기를 정리하는 작업을 실행한다. 
이 작업도 다른 쓰레드가 실행되는 상황에서 진행된다.

장점 . 

이러하기 때문에 표를 봐도 알수 있듯이 Stop the world 가 짧다.
모든 애플리케이션의 응답속도가 매우 중요할때 Cms GC 를 사용하며 Low latency GC 라고도 불린다.

단점 . 

다른 GC보다 cpu와 메모리를 많이 쓴다.(자원먹는 괴물)
Compaction단계가 기본적으로 제공되지 않는다. (기본적으로는 없다.)

그리고 조각 난 메모리가 많아 Compaction작업을 실행하면 다른  GC 방식의 stw 보다 시간이 더 길기 때문에 Compaction작업이 얼마나 자주, 오랫동안 수행되는지 확인(테스트)해야한다.

(5) G1 GC

이 녀석은 young ,old 영역 구분이 없다.
바둑판으로 각 영역에 객체를 할당하고 GC 를 실행한다. 그러다가 해당영역이 꽉차면 다른 영역에 객체를 할당하고 GC를 실행한다.
즉, young의 세영역(eden,survivor1,2)영역에서 데이터가 old로 이동하던 단계가 없다.
G1 GC 는 장기적으로 말도 많고 탈도 많은 CMS GC를 대체하기 위해서 만들어 졌다.

G1 GC 의 장점은 성능이다. 
위의 녀석들중 최고다 하지만 나온지 얼마안되서 불안하다 시기상조이니 좀 시간이 흐른후 적용하도록하자.


- 출처 : 

http://helloworld.naver.com/helloworld/1329
http://jikime.tistory.com/313

두글을 제가 보기좋게 짬뽕했습니다.

2012년 01월 29일 it 기술 동향

JAVA

tomcat 로드밸런싱
http://nikunjp.wordpress.com/2012/01/28/load-balancing-with-tomcat/

jpa hibernate 프로파일링
http://blog.ej-technologies.com/2012/01/profiling-jpahibernate.html

GC 알아보기
http://worldmodscode.wordpress.com/2011/12/26/practical-garbage-collection-part-1-introduction/

hadoop

hadoop use case
http://www.slideshare.net/datasalt

HTML5

26가지 유용한 html5 튜토리얼
http://www.lava360.com/tutorials/roundup-of-26-truly-helpful-html-5-tutorials/

css3,html5 메뉴들
http://designmodo.com/css3-html5-mega-menus/

분야별 html5 튜토리얼
http://www.underworldmagazines.com/12-html5-tutorials-to-get-you-started/


http://joeycadle.com/blog/article/1/2012/22/01/html5-canvas-and-processing-js

Javascript 

어떻게 js 로부터 데이터를 다운로드 받을까?
http://blogs.adobe.com/cantrell/archives/2012/01/how-to-download-data-as-a-file-from-javascript.html

실시간 소스 수정 페이지
http://rocktronica.github.com/tmpltr/

dart puzzlers
http://www.dartlang.org/articles/puzzlers/chapter-1.html

dart svg logo
http://code.google.com/p/dart/source/browse/#svn%2Fbranches%2Fbleeding_edge%2Fdart%2Fclient%2Fsamples%2Flogo

jquery

jquery html5 base placeholder plugin
http://webcloud.se/code/jQuery-Placeholder/

jquery-ui componet demo
http://hanshillen.github.com/jqtest/#goto_slider

차트 그리기 좋은 raphael 기반 js
http://g.raphaeljs.com/

독특한 슬라이드를 보여주는 highslide.js
http://highslide.com/

CSS3

github리본 만들기
http://www.terrenceryan.com/blog/post.cfm/github-ribbons-in-css

http://www.noupe.com/css/useful-css-snippets-for-your-coding-arsenal.html

Node.js

node.js document
http://yand.info/


http://sourcecodebean.com/archives/callbacks-are-polluting-your-code/1488

android

초간단 앱만들기
http://android-meda.blogspot.com/2012/01/writing-your-first-android-app-body.html

좋은 무료 안드로이드 gui
http://www.bestfreewebresources.com/2012/01/15-fresh-and-free-download-gui-kits-for-android-developers.html

etc.

html5 비디오 지원의 현재
http://www.longtailvideo.com/html5/

자바스크립트의 부흥에 따른 현상 혹은 사건
http://www.2ality.com/2012/01/javascript-pervasiveness.html

jquery moblie과 sencha touch 간단한 설명
http://miamicoder.com/2011/sencha-touch-or-jquery-mobile-read-this-before-you-make-a-decision/

vaadin에 대한 요약 설명
http://blog.porotype.com/post/16575655597/compressing-all-the-vaadin-things

2012년 1월 27일 금요일

Chromium Extension을 통한 Web Intents 맛보기


1. 일단 기존의 chrome 브라우저가 아닌 chromium(http://download-chromium.appspot.com)을 다운받습니다.

2. 다운 받는 동안에 github에 가서 관련 extension(https://github.com/PaulKinlan/WebIntents/tree/master/tools/chrome/extensions/share-services) 을 다운 받습니다.

다운 받아야 할 디렉토리 목록입니다.

3. chromium을 구동합니다.

4. url에 chrome://settings/extensions 입력합니다. 그러면 [환경설정 - 확장 프로그램] 으로 이동하게 됩니다. 여기서 우측의 [개발자 모드] 체크박스를 클릭하여 체크하시면 하단에 [압축해제된 확장 프로그램 로드...] 이라는 버튼이 보이게 됩니다.
클릭하여 앞서 github에서 다운 받은 extenstion중 원하는 폴더(gmail,twitter..)를 선택합니다.
그러면 extension이 등록이 됩니다.



5. 이제 http://examples.webintents.org/intents/share/share.html로 이동하고 하단의 예제로 준비된 share a link 와 share an image를 통해 각각의 share버튼을 클릭하면 chromium 브라우저 url 창 입력란 좌측의 지구본에서 설치한 확장 프로그램을 선택하는 메뉴가 나옵니다. 클릭하면 해당 페이지로 입력란으로 앞서 share한 내용 삽입이 된 상태로 열리는것을 발견할수 있습니다.





JDK 5,7에서 파일속성을 hide로 바꿔보자.


일단 JDK5와 JDK7버전을 두개를 놓고 구현해 보겠다.
JDK7에서 NIO2가 새롭게 등장하면서 파일에 대한 접근 방법이 많이 추가되었다.

일단 JDK5에서는 파일을 숨기는 API 를 별도로 제공하지 않는다.
그러나 약간의 꼼수를 사용한다면 구현은 가능하다.
그리고 OS별로 환경변수 설정방법이 틀리듯이 디렉토리 의 구조적인 모습 또한 틀리다.
(Win,Unix,Linux별로 약간의 차이가 있다.)

Windows의 경우 Runtime.getRuntime.exec("command")를 이용하여 손쉽게 파일을 숨길수가 있다.
예를 들어 이렇게 말이다. 
다른 OS의 경우에도 이런식으로 명령어를 통한 파일에 대한 간섭을 하는것이 일반적이다.

Runtime.getRuntime().exec("attrib +H HiddenFileExample.java");

좀더 구체적으로 살펴 보자면 이런식이다.

void setHiddenProperty(File file) throws InterruptedException, IOException {
    Process p = Runtime.getRuntime().exec("attrib +H " + file.getPath());
    p.waitFor();
}

여기에서 p.waitFor()는 필수적인것은 아니다. 하지만 이 해당 명령어가 실행이 완료될동안 안정성을 보장받기 위해서 는 이 부분을 명시해야한다.
(명령어를 실행하고 나서는 os쪽으로 통제가 떠나기 때문에 안정성이 보장되지 않는다.)


 JDK7부터는 파일을 통제하기 쉽게 새로운 API들이 추가 되었다.

Path에 접근하고 위치를 파악할수 있는 일종의 선택자 같은 기능을 가진 API를 제공하게 되었다.

위의 내용을 JDK7의 새로운 API를 활용해서 바꿔보자.

Path path = FileSystems.getDefault().getPath("directory", "hidden.txt");
Boolean hidden = path.getAttribute("dos:hidden", LinkOption.NOFOLLOW_LINKS);
if (hidden != null && !hidden) {
    path.setAttribute("dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);
}

Runtime.exec()를 통한 기존의 방법이나 새로운 java.nio.file 패키지를 활용하거나 둘다 파일에 대한 컨트롤이 가능하다.

2012년 1월 26일 목요일

JVM이란 무엇인가?


Java Virtual machine 에 들어가기 앞서 : - 
이름에서도 알수있듯이 물리적인 기계와 소통을 할수있도록 자바프로세스를 실행시키는 가상 머신이다. 

JRE는 java 기반의 API 와 JVM를 포함하고 있다. 
  • 당신의 java code를  java byte code로 컴파일하여 물리적인 기계가 이해할수 있게한다.
  • 오브젝트의 생성이나 가비지컬렉션같은 오브젝트 관리를 핸들링한다.

JVM 의 각각 구성요소
  • Heap memory:-
  • 힙 메모리는 JVM 머신 의 한 부분으로 오브젝트를 저장한다.
  • 오브젝트의 종류로는 멤버(전역)변수, 생성자, 메소드들이다.
  • 힙메모리의 기본크기는 64mb로 -Xmx(최대 힙사이즈), -Xms(초기 힙사이즈) 옵션을 이용하여 변경할수가 있다.
  • 참조하는 객체의 생명주기는 개체가 참조가 해제 됬을경우로써,
  • 가비지 컬렉션이 몇몇 알고리즘을 이용하여 오브젝트를 제거한다.
  • Stack Memory:-
  • 로컬(지역) 변수들이 상주해있다. 로컬변수의 생명주기는 메서드가 실행되는 일시적인 순간이다. 함수나 메서드가 종료되는순간 값이 제거된다.
  • 이것은 후입선출의 방식을 사용한다.
  • Method section:-
  • 이 구역은 현재 실행중인 바이트 코드들이 존재한다.
  • 바이트 코드가 실행된후, 포인트는 다음 바이트 코드를 가리킨다.
  • registers:-
  • 어떤 스택의 변수에 의해 활용된다.
각기 벤더에 따라서 다양한 JRE가 제공된다.
  • 1.JRocket JVM  BEA Systems가 개발한 JVM이다. (현재 오라클)
  • 2. Java HotSpot VM Sun Microsystems가 개발한 JVM이다.(현재 오라클)

Java 8의 Project Lambda를 알아보자.


Java 8 - Project Lambda

project lambda란?: Project lambda 는 lambda표현식을  자바 문법에 맞춰서 사용가능하게 만드는 프로젝트입니다.
lambda 표현식은 Lisp같은 함수형 언어 문법을 사용하는것입니다.
대표적으로 Groovy는 closures로 대표되는 lambda표현식을 지원하게 해주는 java 계열의 언어입니다.

그렇다면 lambda 표현식이란 무엇인가?
그것은 코드 블록간에  값을 할당하거나 메서드에 인수로 할당하거나 다른 lambda 표현식으로 전달할수 있게 해주는것입니다.
해당 코드는 필요할때마다 불러올수가 있습니다.
이것의 주 모티브는 JAVA에서 API사용자로 하여금 코드에 필요한 특정 API사용하여 보일러 플레이트 코드를 제거하는것입니다.
그러나 그건 단지 자바 구문 요구사항을 내부 클래스를 사용하여 종료하는것에 불과한것입니다.
이런 대부분의 일반적인 API는 자바 쓰레딩 API로써, 우리가 새로운 쓰레드를 실행할때 필요한 API를 말하는것입니다.
그러나 결국 Runnable이 implementing(구현) 되야합니다.


이 규격은 아직도 아직도 지속적으로 발전하고 있다. 

함수형 인터페이스 : 자바 스펙 개발자들은 JVM 스펙을 좀처럼 수정할려 하지 않습니다. 마찬가지로 이 경우에도 그렇습니다.
lambda의 경우 이러한 JVM 스펙에 수정없이 구현할수 있도록 정의하고 있습니다. 
그러므로 당신은 1.8 버전의 소스 클래스 코드를 목표하는 1.5버전에 쉽게 컴파일 할수 있습니다.
그래서 lambda 코드는 하나의 메소드를 가진 인터페이스를 implementing한 익명클래스에 보관됩니다.


물론 그 인터페이스는  하나 이상의 메서드를 가질수는 있지만 그것은 하나의 메서드를 정의하는 클래스에 implementable 되야 합니다.

그러면 코드를 통해서 lambda에 대해서 살펴 보도록 합시다.

//단순한 경우로, 오직 하나의 메서드만을 가지고 있다.
//이것은 함수형 인터페이스이다.
public interface Test1{
    public void doSomething(int x);
}

//두개의 메서드를 가지고 있다 하지만 toString()의 경우는 기존에 있는것이다.
//어떤 오브젝트던지간에 java.lang.Object의 서브클래스이다.
//이것은 함수형 인터페이스이다.
public interface Test2{
    public void doSomething(int x);
    public String toString();
}

//이 메서드는 Test1의 메서드를 Test3에 오버라이드 한것이다. 
//그래서 아직은 함수형 인터페이스이다.
public interface Test3 extends Test1{
    public void doSomething(int x);
}

//이것은 함수형 인터페이스가 아니다. 
//이 경우, 명시적으로 두가지 메서드를 구현해야한다.
public interface Test4 extends Test1{ 
    public void doSomething(long x);
}


Lambda 표현식: 
자바8에서 지원되는것으로 lambda표현식은 단지 함수형 인터페이스들을 익명 클래스에 implement하는 문법과 구현 방법이 다릅니다.
lambda 구문을 구현하는 방법을 보도록합시다.

argumentList -> body 

저 argumentList는 단순히 자바 메서드 argument 리스트이다.
만약에 하나의 argument만 있다면 ()는 선택사항입니다. 또한 agument의 형에 대한 선언 부분도 선택사항입니다. 
이경우 형이 없습니다. 자동으로 추정합니다.
body의 경우 표현적 body와 코드 블락 body으로 두개의 타입이 있습니다.
표현적 body의 경우 단순히 자바 표현에 따라 값을 리턴해줍니다.
코드 블락 body의 경우 메서드 바디만을 포함하고 있습니다.
이 코드 블락 body는 필수적으로 중괄호 한쌍(]])을 포함해야 합니다.

하나 Thread에 lambda 구문을 구현한 예제를 봅시다.

//이 쓰레드는 Hello를 출력하게 됩니다.
new Thread(() -]]> { while(true){ System.out.println("Hello")}}).start();


위의 예제에 이어서 또 다른 예제를 보자면

public interface RandomLongs{
    public long randomLong();
}

RandomLongs randomLongs () -]]> ((long)(Math.random()*Long.MAX_VALUE));
System.out.println(randomLongs.randomLong());


Generic 과  lambda:  그러나 만약에 제네릭 메서드를 lambda에 implement한다면? 이에 표준 개발자들은 형 파라미터를  타입 인자전에 정의할수 있도록 멋진 구현식을 제공했습니다.

예를 보자면 이렇습니다.

public interface NCopies{
    public <extends Cloneable]]> List<T]]> getCopies(T seed, int num);
}

//제네릭 메서드의 인자에 타입 유추기능을 제공한다.
NCopies nCopies = <extends Cloneable]]> (seed, num) -]]> { 
                    List<T]]> list new ArrayList<]]>()
                    for(int i=0; i<num; i++) 
                        list.add(seed.clone())
                    return list;
                };


요점 요약 : 람다 표현식에 의해 구현된 실제 인터페이스 및 방법은 그것이 사용되는 시점에 따라 달라집니다.
컨텍스트도 할당 작업의 존재 또는 메서드 호출에서 매개 변수의 전달하여 설정하실 수 있습니다
컨텍스트 없이는  lambda 표현식은  의미가 없습니다. 단순히 lambda 표현식에 직접 하나의 메소드를 호출하는 목적이라면 맞지 않습니다. 

컴파일 에러를 내게되는 예를 들어보자면

public interface NCopies{
    public <extends Cloneable]]> List<T]]> getCopies(T seed, int num);
}

//이 코드는 컴파일 에러를 냅니다.
//lambda에 context가 없어서 그 의미가 없기 때문입니다.
(<extends Cloneable]]> (seed, num) -]]> { 
                    List<T]]> list new ArrayList<]]>()
                    for(int i=0; i<num; i++) 
                        list.add(seed.clone())
                    return list;
                }).getCopies(new CloneableClass(), 5);


그래서 옳게 쓰려면 아래와 같이 바꿔줘야합니다.

NCopies nCopies = <extends Cloneable]]> (seed, num) -]]> { 
                    List<T]]> list new ArrayList<]]>()
                    for(int i=0; i<num; i++) 
                        list.add(seed.clone())
                    return list;
                };
                
nCopies.getCopies(new CloneableClass(), 5);

JAVA의 기본적인 최적화 팁


1. 불필요한 캐스팅을 피하자.

신입 개발자의 경우 참조 데이터형을 변환하는 경우 캐스팅을 한다.
대부분의 캐스팅은 몇몇 기본 클래스 타입의 자식클래스로 모든 객체의 타입을 제네릭 형태의 프로그래밍을 할수있다.

그러나 신입 개발자들의 경우 항상 그들이 잘못 캐스팅했다는것을 모르고 VM으로 하여금 불필요한 부하를 만든다.

예를 들어 보자:

1
class MyCastingClass {
2
    public Object myMethod() {
3
        String myString = "Some data";
4
        Object myObj = (Object) myString;
5
        return myObj;
6
    }
7
}

좋다. Object myObj = (Object) myString;  구문을 보면 불필요한 캐스팅하고 있는것을알수있다. string 을 Object 형으로 변환하는것인데, String은 Object의 자식형으로 부모의 성향을 다 가지고 있는데 굳이 캐스팅을 할 필요는 없는것이다.
그리고 캐스팅은 자바 컴파일러의 안전검사를 무시하고 오류를 일으킬수도있다.

개선해 보자:

1
class MyCastingClass {
2
    public Object myMethod() {
3
        return "Some data";
4
    }
5
}

자 이제 깔끔하게 수정이 되었다. 무엇보다 코드가 줄어서 가독성도 향상되었고 컴파일 규칙으로부터 안정적이고 메모리의 오버헤드 발생또한 없앴다. 아주 좋다.

2. 일반적인 하위 표현식의 제거

이것은 일반적인 실수로 같은 하위표현식을 중복해서 사용하는경우가 있다. 

예를 들어보자 :

1
int someNumber = (someValue * number1 / number2) + otherValue;
2
int someNumber2 = (someValue * number1 / number2) + otherValue2;

이 경우 계산을 각각 객체마다 실행하기 때문에 부하가 두배로 들게된다. 그리고 이 경우는 그나마 두번 정의했기때문에 부하가 적을지 몰라도 만약에 점점 사용이 늘어 나게 된다면 더욱 더 부하 발생의 심각도 는 심해질것이다 그렇다면 이러한 것을 수정해 보자.

1
final int constantCalculation = (someValue * number1 / number2);
2
int someNumber = (constantCalculation) + otherValue;
3
int someNumber2 = (constantCalculation) + otherValue2;

아주 좋다. 중복되는 부분을 하나의 변수로 따로 선언하고 final을 선언하여 상수화 했다. 이로써 심플한 최적화가 완료되었다.

3. 상수가 아닌 string 대신에 StringBuffer나 StringBuilder를 이용하자.

String 변수는 immutable 변수이기 때문에 변화가 일어날시 오버헤드를 만들게 된다. 당신이 새로운 행동을 정의할때마다 컴파일러는 인터프리트에게 명령을 내려 변경을 해야하기 때문이다.
String 변수가 변경될때 변수 공간에 새로운 것을 만들어야한다. 그후에도 이러한 경우에도 마찬가지이다.
이 부하는 String 대신에 StringBuffer나 StringBuilder를 사용하여 해결할수 있다.
그럼 예를 들어보자:

1
class MyStringClass {
2
    public void myMethod() {
3
        String myString = "Some data";
4

5
        for (int i = 0; i < 20; i++) {
6
            myString += getMoreChars();
7
        }
8
    }
9
}  

이것은 StringBuffer 클래스를 존재하여야 하는 이유이다.
StringBuffer는 가변적인 객체로써 잦은 길이의 변경이나 추가 들에 용의한 객체를 제공해주는 클래스이다.
StringBuffer와 StringBuilder의 차이는 StringBuffer는 동기화시에 항상 안전성을 보장합니다. 그에 반해 StringBuilder는 동기화서 안정성이 보장되지 않습니다. 
다만 장점으로 보자면 로컬 변수로 사용시 더 좋은 성능을 보여줍니다.
위의 예를 변경시켜보자:

01
class MyCastingClass {
02
    public Object myMethod() {
03
        String myString = "Some data";
04
        StringBuffer myBuffer = new StringBuffer();
05

06
        for (int i = 0; i < 20; i++) {
07
            myBuffer.append(getMoreChars());
08
        }
09
        myString = myBuffer.toString();
10
    }
11
}

StringBuffer 사용하여  컴파일러로 하여금 변동시마다 부하를 걸리게하는것을 해소 할수있게 되었다. 그후, toString()을 이용하여 String으로 변동하여 myString에 삽입함으로써 원래 소스코드의 목적을 훼손하지 않고 처리할수 있게 되었다.

4. 단순한 Boolean 연산자를 사용하자.

만약에 하나의 연산에 두가지 조건을 정의했을경우 단락회로 검사시 첫번째 조건이 참일시 컴파일러는 두번째 조건은 확인하지 않기 때문에 평가하는 시간을 줄일수가 있다.
예를 들어 ||에 의한 or를 사용시에는 첫번째 조건이 참이면 두번째 조건은 연산하지 않기 때문에 속도가 빨라집니다. 그러나 | 를 사용한 or시에는 두가지 조건을 다 연산하기 때문에 || 경우에 반해 속도가 느려집니다. 그와 같이 && 경우도 앞의 문장이 false 인 경우 두번째 조건을 연산하지 않게 됩니다.

그럼 소스코드를 통해서 확인 해 봅시다.

1
class MyShortCircuitClass {
2
    public void myMethod() {
3
        if (someValue.equals("true") | someValue.equals("false")) {
4
            System.out.println("valid boolean");
5
        }
6
    }
7
}

단순하게 참과 거짓을 통해 결과를 출력하는 것이지만, 이 경우에는 두가지 조건을 다 연산을 하게된다. 그렇다면 이것을 수정해보자.

1
class MyCastingClass {
2
    public void myMethod() {
3
        if ("true".equals(someValue) ||"false".equals(someValue)) {
4
            System.out.println("valid boolean");
5
        }
6
    }
7
}

| 를 || 로 변환함으로써 우리가 목표한 바를 달성했다.

의미 
Short circuit?
&&
and
yes
&
and
no
||
or
yes
|
or
no
표를 통해서 앞서의 경우와 유사한 경우를 판단해서 부하를 줄여보자.

5. 단순한 empty확인시에는 equals() 대신에 length()를 사용하자.

몇몇 개발자들은 String의 문자열의 유무를 equals()를 통해서 확인하곤 한다.

이와같이 :
1
class MyStringClass {
2
    public boolean myTestMethod() {
3
        return myString.equals("");
4
    }
5
}
이것의 문제는 equals()를 사용시 높은 부하가 발생하게 된다. 
이 이슈는 equals()를 구현시 기본적으로 같은 객체 클래스를 두개의 객체가 참조하여 테스트를 하게 디자인 되있기 때문에 생기는 것이다.
결론적으로 length()또는 isEmpty()의 경우 단순히 같은 객체 타입으로 참조포인트를 놓고 테스트를 하게된다. 
이것은 단순히 빈값 테스트를 하기에는 효율적이다. 
자 위의 내용을 바꿔보자.

1
class MyCastingClass {
2
    public void myMethod() {
3
        public boolean myTestMethod() {
4
            
// which really does myString.length() == 0 behind the schenes
5
            return myString.isEmpty();
6
        }
7
    }
8
}

length()를 사용하여 컴파일러에게 객체 참조 부하를 주지 않고 string의 빈값을 테스트 할수 있는 효율적인 메서드를 제공하게 되었다.

기억해야한다. 코드의 최적화는 조잡한 트릭과 읽기 힘든 코드가 필요없는데서 발생한다.
종종 단순한 변화가 프로세싱 시간을 줄여주고 코드를 좋게 만들어준다.
위의 경우를 사용하여 코드의 최적화를 해보자.

2012년 1월 27일 it 기술 동향


JAVA

java sql date 변환 예제
http://www.techlabs4u.com/2011/12/javasqldate-with-example-convert.html

쓸데 없이 모든 코드에 unit - equal 을 넣지 말아라!
http://www.javacodegeeks.com/2012/01/effective-unit-testing-not-all-code-is.html

Cloud Computing

map reduce 성능에 관한 글
http://blog.dynatrace.com/2012/01/25/about-the-performance-of-map-reduce-jobs/

python

http://kencochrane.net/blog/2011/11/developers-guide-for-running-django-apps-on-heroku/

android

안드로이드 UI 디자인 툴들
http://www.androiduipatterns.com/2012/01/best-design-tools-for-android.html

JAVASCRIPT

클라이언트 사이드의 mvc 프레임워크 backbone.js
http://blog.carbonfive.com/2011/12/19/exploring-client-side-mvc-with-backbonejs/

자바스크립트 모듈에 대해서
http://blog.davidpadbury.com/2011/08/21/javascript-modules/


일반 js -> coffeescript -> clojuresrci
http://dosync.posterous.com/comparing-javascript-coffeescript-clojurescri

jquery

아무글이나 클릭하면 editable한 input box로 변경되고 수정가능
http://www.appelsiini.net/projects/jeditable/default.html

boostrap기반의 이미지 갤러리
http://blueimp.github.com/Bootstrap-Image-Gallery/

우측 하단에 노티피케이션 박스가 뜬다.
http://ghita.org/ux/kinotice/demo/demo.php?example=skin4

인풋창으로 할수있는 많은 내용이 있음
http://textextjs.com/manual/examples.html


HTML5

최근 html5 동향 따끈따끈한 근황 및 추가 기능들
http://tokyo.bleedinghtml5.appspot.com/
http://html5-demos.appspot.com/static/html5-therealbleedingedge/template/index.html#1
http://www.longtailvideo.com/html5/

CSS3

반응형 웹사이트 개발하기 - 파트2. 네비게이션 그리고 본문
http://www.developerdrive.com/2012/01/developing-a-responsive-website-part-2-navigation-and-content/

css3를 이용한 마우스 오버시 이미지 확대
http://www.script-tutorials.com/demos/225/index.html

Node.js

http://fennb.com/nodejs-a-giant-step-backwards

node 모듈에서 유의할점
http://dailyjs.com/2012/01/26/effective-node-modules/

DB

sql-developer툴을 이용하여 db2 sybase mysql 억세스하기
http://www.thatjeffsmith.com/archive/2012/01/sql-developer-supports-db2-sybase-mysql-access-and-teradata/

tools

이클립스로 개발하는 html5 앱
http://www.riaspace.com/2012/01/html5-for-app-developers-eclipse/

git 웹관리 툴
http://gitblit.com/

정부 프레임워크 설치 가이드
 http://www.egovframe.go.kr/cop/bbs/selectBoardArticle.do?bbsId=BBSMSTR_000000000002&nttId=389&menu=2&submenu=1

etc.

내맘대로 제목 : 주목해야할 오픈소스 프로젝트 10
http://www.cio.com/article/698485/10_New_Open_Source_Projects_You_May_Not_Know_About

it 스타트업 비지니스 가이드
http://bateru.com/news/2012/01/it-business-start-up-guide/

2012년 1월 25일 수요일

2012년 1월 26일 it 기술 동향

JAVA

concurrent한 자바 프로그램 테스팅
http://www.indicthreads.com/9209/testing-concurrent-java-programs/

jvm이란 무엇인가?
http://www.cloudhadoop.com/2011/12/what-is-java-virtual-machine.html

spring에서 mongo db 사용하기 위한 준비단계
http://aredko.blogspot.com/2011/07/mongodb-as-your-persistence-layer.html

spring에서 mongo db 사용하기 구현단계
http://aredko.blogspot.com/2011/08/exploiting-mongodb-together-with-spring.html

초 간단한 mybatis 셋팅
http://www.raistudies.com/mybatis/configuring-mybatis-3/

tomcat에서의 멀티코어 시스템 구축
http://www.tomcatexpert.com/ask-the-experts/tomcat-multi-core-system

Python

멀티 프로세싱을 활용한 병렬형 cpu bound tasks
http://eli.thegreenplace.net/2012/01/16/python-parallelizing-cpu-bound-tasks-with-multiprocessing/

nosql


shading 아키텍쳐
https://community.jboss.org/people/andy.song/blog/2012/01/21/several-things-you-may-need-know-about-sharding-system-architecture


hadoop

http://www.technology-mania.com/2011/03/hadoop-in-standalone-mode.html
http://www.technology-mania.com/2011/03/hadoop-in-pseudo-distributed-mode.html
http://www.technology-mania.com/2011/03/hadoop-in-distributed-mode.html

html5

canvas slideshow
http://www.script-tutorials.com/html5-canvas-slideshow/

javascript

n스크린 지원 ui 프레임워크 jo(데모 돌려보면 아직 느리다.)
http://joapp.com/

구글 캘린더 게스트 초대기능을 활용한 무료 노티피케이션  SMS 보내는 js
https://gist.github.com/1658408

coffee script기반의 여러 패턴을 적용가능한 js
http://batmanjs.org/

dart programming 시작해보자는 간단한 동영상
http://www.youtube.com/watch?v=y32f8AD9MBI

jsdev 활용하기
http://www.youtube.com/watch?v=uO7JbYnZFjc

http://code.google.com/intl/ko-KR/speed/

jquery

jquery mobile 10가지 기능
http://www.jquery4u.com/mobile/10-jquery-mobile-features/


android 

간단한 carmera api 활용하기
http://www.vogella.de/articles/AndroidCamera/article.html

etc.

node.js로 모바일 서비스를 구축한 이유
http://venturebeat.com/2012/01/24/why-walmart-is-using-node-js

우리나라 si의 막장현실에 대한 다이어그램
http://www.okjsp.pe.kr/seq/182745

프로젝트 용어정리
https://twitter.com/#!/jun0683/status/142527554056749056/photo/1