2013년 11월 30일 토요일

웹페이지에서 .js파일 비동기 방식으로 로드하기

참고 :  http://www.phpied.com/async-javascript-callbacks/ , http://stackoverflow.com/questions/1834077/which-browsers-support-script-async-async , https://developers.google.com/analytics/devguides/collection/gajs/asyncTracking

본 문서는 Google Analytics Tracking Code 삽입과 관련한 예제를 바탕으로 작성 되었습니다.

웹페이지 호출 시 일반적으로 .js 파일은 다운로드 되고 파싱되는 절차를 거치게 되며 이 작업이 완료되기까지 대기 상태를 거쳐 페이지 로드가 완료되게 됩니다. 이 경우 .js 파일의 용량이 클 경우 페이지 로딩 시간이 길어지는 문제가 발생하게 되고 HTML5에서는 이를 보완하여 non-blocking한 동작을 지원하기 위해 Script 태그에 Async 속성이 추가 되었습니다.

HTML5의 경우 아직 Draft단계이기 때문에 추후 변동사항이 발생할 가능성이 있습니다. 의존 관계를 갖지 않는 단일 파일의 비동기 방식 로딩에 대한 예제는 다음과 같습니다.

(function() {
    var foo = document.createElement('script'); foo.type = 'text/javascript'; foo.async = true;
    foo.src = 'foo.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(foo, s);
})();

위 코드를 이용해서 의존 관계를 갖는 .js 파일의 로딩이나 코드의 수행을 위해 다음과 같이 수정해 보았습니다.

(function() {
    var foo = document.createElement('script'); foo.type = 'text/javascript'; foo.async = true;
    foo.src = 'foo.js';
    foo.onload = foo.onreadystatechange = function() {
        //subsequent executions..

        foo.onload = foo.onreadystatechange = null;
    }
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore foo, s);
})();

만약 jQuery를 사용할 수 있는 환경이라면 $.getScript(url, successCallback)을 사용 할 수 있습니다.

위 코드는 레거시 코드를 혼용해서 작성한 코드이기 때문에 IE7 모드 부터 동작하는 것을 확인 하였지만(본 블로그의 SyntaxHighlighter에 적용되어 있습니다 xD) 제가 알지 못하는 최신 브라우저에서만 지원하는 튜닝요소가 존재할 수 있습니다. 해당 기능을 정식으로 지원하는 브라우저는 다음과 같다고 합니다.
  • IE10+ (Preview2 이상)
  • Chrome 12+
  • Safari 5.1+
  • Firefox 4+

2013년 11월 27일 수요일

MSI Star-USB3 Firmware & Driver Update

펌웨어와 드라이버를 업데이트할 대상이 되는 제품의 정보는 이곳에서..

전원 관리 기능의 버그로 종종 USB3 외장 드라이브가 사라지면서 인식이 안되는 문제 때문에 골머리 썩고 있던 중.. 펌웨어 릴리즈 노트를 확인 했더니 혹시나 했더니 역시나 드라이버와 펌웨어에 버그가 있었던 모양..

공식 사이트에서는 가장 최근 드라이버와 펌웨어를 지원하지 않기 때문에 이곳에서 펌웨어와 드라이버를 구해서 업데이트 하였다.


제품 정보는 위의 이미지와 같고 설치 된 OS가 Windows 7 64bit 버전이기 때문에 드라이버는 Version 2.1.39.0을 설치 하였고 펌웨어는 uPD720200의 마지막 버전인 3.0.3.4를 설치 하였다.

설치 후 드라이버와 펌웨어 정보를 확인한 결과는 다음과 같다.

  

혹시 업데이트를 하게 될 경우 펌웨어 업데이트는 본인이 리스크를 감수하고 진행해야 함을 잊지않길 바라며..

2013년 5월 28일 화요일

Ubuntu Server 13.04에서 SSH 활성화 하기

참조 : http://linuxg.net/how-to-enable-ssh-on-ubuntu-13-04/

openssh-server 패키지를 설치하게 되면 SSH기능이 기본설정 상태로 활성화 된다.
  • 설치 방법은 다음과 같다.
$ sudo apt-get install openssh-server
  • 서비스를 재시작 하는 방법은 다음과 같다.
$ sudo /etc/init.d/ssh restart
  • 서비스와 관련된 설정 값은 /etc/ssh/sshd_config 파일을 수정하면 된다.
$ sudo vi /etc/ssh/sshd_config

2013년 2월 3일 일요일

MIRC 7.x에서 한글이 깨지는 문제

MIRC 7.x 버전부터 codepage 지원을 중단하고 메시지 처리가 UTF-8 방식으로 바뀌면서 기존의 cp949인코딩 문자가 깨지는 문제가 있다(기타 다른 코드페이지를 참조하는 문자도 동일). 자세한 내용은 링크 참고.

irc.hanirc.org 서버의 경우 UTF-8으로 전환 하려는 움직임은 있는듯 한데 아직 cp949 인코딩을 사용하기 때문에 역시 문자가 깨져보이는 문제가 있다. 한글을 정상적으로 보기 위해서는 codepage를 지원하는 마지막 버전인 MIRC 6.35 버전을 사용해야 하고 다운로드 페이지의 다음 링크에서 구할 수 있다.


해당 옵션 체크는 다음과 같다.


물론 UTF-8 인코딩을 지원하는 서버에 접속할 경우 UTF-8 display를 체크하면 정상적으로 메시지를 볼 수 있다.

오랜시간 유용하게 사용했던 클라이언트라 IRC를 다시 사용하기로 하면서 $20에 구매하게 됐는데 이런 문제가 있을줄은-.- 여튼 사용자 라이선스는 하위 버전에도 호환이 되니 정식 라이선스 구매 유저는 6.35버전도 라이선스 문제없이 사용이 가능하다.

2012년 5월 23일 수요일

Spring framework의 싱글턴 인스턴스에 대한 동시다중액세스 상황과 관련하여 생각해 봄직한 의문..

참고 : http://stackoverflow.com/questions/4617437/when-multiple-access-spring-singleton-instance-at-same-time

Springframework의 bean 객체는 기본적으로 싱글턴 인스턴스를 갖습니다(물론 변경도 가능합니다!). 이 싱글턴 객체에 대해 액세스가 동시에 무한히 증가하는 상황이라면 어떻게 될까? 라는 의문을 갖게 된적이 있었는데 이런 상황에 대해 정리를 한번 해보고자 합니다.

생각해 보고자 한 상황을 정리해 보면 다음과 같습니다.
  • Spring framework에서 서비스 객체를 싱글턴 스콥으로 설정하고 컨트롤러에서 DI(Dependency Injection)를 통해 객체를 생성하였을 때 해당 싱글턴 객체에 동시에 다수의 사용자가 접근을 시도하면 충톨이 발생하거나 하는 염려는 없나? 그게 아니라면 IoC(Inversion of Control) 컨테이너가 좀더 나중에 호출 된 작업을 앞서 호출된 작업이 완료될 때 까지 기다렸다가 호출하는 것 인가? 만약 이게 맞다면 퍼포먼스에 심각한 영향을 주는것은 아닌가?
이에 대한 답변은 다음과 같습니다.
  • 싱글턴 객체는 동시에 수차례 액세스 될 수 있습니다. 그리고 이러한 상황에서 충돌을 피하기 위해 thread-safe 하게 만들어져야 합니다. 만약 해당 빈이 thread-safe 하지 않다고 판단되면 싱글턴 스콥이 아닌 다른 영역을 사용하는 것을 고려해야 할 것 입니다.
결론은 thread-safe하게 코드를 작성하는게 프로그램의 동시성(Concurrency)을 보장해준다는 것을 알게 되었는데 만약 이런 것이 여의치 않은 상황에서의 조치나 thread-safe한 프로그램의 요건들이 또 다른 연구 과제로 남게된 것 같습니다 :)

2012년 5월 17일 목요일

Java 7이 개발자를 위해 준비한것은?



자바가 오라클로 넘어간 후 첫 메이저 업데이트 버전인 자바 7에서 바뀐 점은 무엇일까? 그리고 앞으로 변하게 될 방향은 무엇인가?에 대해 생각해보는 글 입니다. Java SE 7 발표 후 심각한 버그 덩어리(?)를 안겨주었지만 개선되고 변화된 점들도 많고 앞으로 Java가 추구하게 될 방향에 대한 시발점이 될 것으로 보입니다. 물론 이 내용들이 국내에서 실무상에 일반적으로 논의 되는건 몇년 뒤의 이야기가 될 수도 있겠지만 우리나라에서만 평생 일하게 될지 어떨지 알수도 없고 개인적으로도 그건 바라지 않기에 :) 한번 짚고 넘어가 보도록 합시다!

자바 커뮤니티 내부의 정치적 문제와 연기된 다수의 신기능들

자바의 아버지 제임스 고슬링의 2010년 오라클 퇴사 그리고 아파치 재단과의 불화 및 각종 커뮤니티 내부의 갈등 등으로 별다른 진전없는 5년을 보낸후 마침내 Java SE 7이 발표 되었습니다. 어찌 되었건 오라클은 이런 문제들을 이제는 어느정도 정리하고 극복해 낸 것으로 보입니다.

5년의 노력에도 불구하고 Java SE 7은 처음 계획되었던 것과는 많이 다른 모습으로 발표되었습니다. 최초 JDK 7에서 계획 되었던 수많은 계획들은 2012년 발표 예정(?)인 JDK 8으로 연기되었으며 Java SE 7은 어쨌든 2파트로 나눈 릴리즈의 첫번째 제품이 되었습니다. 상황이 이렇다 보니 Java SE 7은 잠시 거쳐가는 버전으로 보이는건 어쩔 수 없는듯 합니다.

연기된 기능들 중에는 멀티코어 프로그래밍을 위한 자바의 람다표현식이나 클로저기능, 모듈러 프로그래밍을 위한 언어와 VM 지원 그리고 JDK의 모듈 시스템들이 있습니다. 많은 기능들이 빠진것에도 불구하고 Java SE 7은 유용한 새 기능들을 제공하고 있습니다.

다음에 언급할 내용은 Java SE 7에서 제공하는 새로운 주요 기능들 입니다.

동적 언어들의 지원

Java SE 7의 주요 기능으로는 JRuby와 Groovy 같은 언어의 출현으로 인해 최근 JVM에서 눈에 띄게 된 동적 언어에 대한 편의성 제공을 들 수 있습니다. 예를 들어 새로운 InvokeDynamic 기능은 동적인 형태로 정의된 객체 지향 언어들의 구현을 지원합니다. JSR-292에 따르면 InvokeDynamic 바이트코드는 정적인 형태의 정보 없이도 효율적이고 유연한 메소드 호출을 수행할 수 있다고합니다. 이러한 동적 언어의 지원은 Java 생태계를 확장하는데 있어 Java SE 7의 매우 중요한 기능으로 볼 수 있습니다.

향상된 멀티코어 그리고 병렬처리 지원

Fork/Join 프레임웍으로부터 시작된 멀티코어 대응의 API는 개발자들이 작업을 다중 프로세서 코어를 이용하여 병렬 수행하는데 있어 좀더 손쉽게 작업을 분배할 수 있도록 도와줄 것입니다. 이는 개발자들이 다중 코어 프로세서를 좀더 잘 활용할 수 있도록 도와줄 것입니다.

개발자 생산성을 위한 컴파일러 최적화

개발자의 생산성 향상에 대한 지원으로 Project Coin을 통한 일반적인 프로그래밍 작업의 단순화와 줄어든 코드와 같은 언어상의 변화가 제공됩니다. 이는 구문을 명확히 하고 코드의 가독성을 높여줄 것이라고 합니다.

Project Coin의 생성자 호출을 위한 다이아몬드 구문은 컴파일러가 타입변수를 명시적으로 기술하지 않더라도 추론을 통해 찾을 수 있도록 하며 try-with-resources 문(하나 이상의 자원을 선언하는 try 구문, 여기서 자원은 프로그램이 끝날때 반드시 닫혀야 하는 객체임)은 파일, 소켓 그리고 DB커넥션과 같은것을 닫는걸 잊더라도 컴파일러에서 자동으로 닫힌 안정적인 코드를 생성합니다.

* Project Coin과 관련하여 별도의 게시물을 작성할 생각입니다.

File I/O, 그래픽 그리고 사운드 향상

Java의 아버지 제임스 고슬링은 파일 시스템 기능중 하나인 NIO2를 특별히 좋아한다고 밝힌적이 있었습니다. 새로운 NIO2의 기능으로 파일 시스템상 좀더 다양한 파일 속성의 작업에 대한 인터페이스를 제공하고 에러와 관련해서도 좀더 많은 정보를 제공한다고 합니다.

네트워크 파일 I/O에 있어 Socket Direct Protocol(SDP) 기능을 중요하게 꼽고 있는데 iSCSI의 경쟁자인 Infiniband에 있어 가상화 환경에서의 진전을 위한 향상된 지원을 할 것이라고 합니다.

Java SE 7은 2D 그래픽 렌더링을 위한 XRender 파이프라인 기능을 제공하며 이는 XWindow 시스템 최상위에서 동작하며 최신 그래픽 프로세서에 접근할 수 있습니다.

Gervill이라 불리는 새로운 사운드 엔진은 리눅스 상에서 다중 어플리케이션이 Audio Synthesis Engine Project MIDI synthesizer를 이용하여 소리를 낼수 있도록 합니다.

마치며..

복잡한 환경속에서 새로운 기능들이 추가된 Java 7이 발표 되었지만 여전히 주변에는 많은 문제가 산재해 있는것 같습니다. 오라클과 구글의 소송에 대한 뭔가 명확하지 않은 상황, 아파치 재단과의 불화 그리고 래리 아저씨의 탐욕은 승리할 수 있을것인가? 이런 사실들은 분명 많은 사람들이 Java에 대해 긍정적일수 만은 없는 상황을 만들고 있는 것 같습니다.

2012년 5월 15일 화요일

차세대 메모리 Hybrid Memory Cube



DDR3 이후 메모리 시장은 어떻게 변할 것인가? 꽤 지리하게 이어져온 DDR 시장의 다음은 DDR4가 아닌 HMC가 될 가능성이 높아지는 국면으로 접어 들게 되었다. 인텔-마이크론, 삼성의 컨소시엄 참여 그리고 얼마전 MS도 참여했다는 소식도 들리는 것으로 봐서 램버스 라이센싱의 DDR 메모리 시대도 이제 저무는게 아닌가 싶다.(MS가 참여한건 HMC의 시스템 드라이버 개발이 필요해서가 아닐까 추측중.. 물론 XBOX에 채용하는 것도 염두에 뒀을듯..)

대규모 분산 네트웍 시스템과 차세대 HPC 시스템의 성능 향상을 위해 개발된 HMC이다보니 왠지 병렬성하면 GPU 또한 빼놓을 수 없고 시장에 도입되게 되면 PC를 비롯해서 VGA카드 등 기타 여러 기기에 사용될 것으로 예상된다.

HMC 공식 페이지에서 소개하는 특장점을 보자면 다음과 같다.
  • HMC는 메모리 다이를 TSV(through-silicon-via)로 묶어 쌓아올린것에 고속의 논리 처리 기술을 조합한 것이다.
  • 기존 메모리의 제약사항을 뛰어넘는 엄청난 성능과 대역폭 향상을 제공한다. 단일 HMC는 DDR3 모듈의 15배에 해당하는 성능을 제공함
  • 현재 사용되는 메모리 대비 엄청난 효율성을 제공함. DDR3 DRAM과 비교할 경우 비트당 에너지 소모가 70% 정도 줄어듬
  • HMC는 비트당 밀도가 증가해서 폼팩터(쉽게 말해 부품이 차지하는 공간)를 줄이고 이를 유지하는데 들어가는 총 비용을 감소시키는데 기여하게 된다. 오늘날 사용되는 RDIMM에 비해 90% 정도 사용 공간이 줄어들고 이로인해 더 많은 메모리를 탑제할 수 있게 됨.
HMC의 시장 도입이 언제쯤 될지 아직 모르겠지만 폼팩터 부분에 있어서 꽤 많은 변화가 있을것으로 예상된다. 마지막으로 Micron에서 제공하는 홍보영상으로 글을 마친다.