2009-09-30

영문 글꼴에 없는 한글 글꼴 지정하기

http://dharana.egloos.com/3904416

내가 적용한 방식은 레지스트리 수정.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]
에 해당하는 영문 글꼴의 영문 이름(예를 들어 Consolas)을 다중 문자열 값으로 추가한 다음 다음과 같이 지정할 한글 글꼴을 지정한다. 일본어를 지정해도 된다.
SEGOEUI.TTF, Malgun Gothic
gulim.ttc,gulim
MSGOTHIC.TTC,MS UI Gothic
SimSun.TTC,SimSun
mingliu.ttc,PMingLiU
한글 글꼴 파일 이름, 글꼴명 순서로 쓴다. 적용되려면 재부팅 필요.

2009-09-29

Chrome Frame

http://www.sitepoint.com/blogs/2009/09/28/google-chrome-frame-technical-details/

요즘 RSS를 잘 안 읽다 보니 이런게 나왔는지도 몰랐네. 정말 구글답다. IE6를 끝까지 고집하는 사람들을 위해 이런걸 만들다니...

이 넘은 IE에 깔리는 Browser Helper Object인데, 이게 뭔지 모르면 그냥 ActiveX라고 생각하면 된다.

웹사이트가 이 기능을 이용하도록 하면 사용자가 IE7이나 IE8로 업그레이드 할 필요 없이 플래시처럼 이게 깔리면서 최신의 웹표준을 사용할 수 있도록 해준다. HTML5, CSS3, canvas and SVG features 머 이런 것들이란다.

2009-09-28

Trac 에서 권한이 있는데 볼 수 없을 때

이게 웬 버그인가 했는데, 역시 구글링 결과 다음 해답!

Account Manager에서 EmailVerificationModule 을 빼시오. 혹은 그 사용자더러 이메일을 확인하도록 하시오.

2009-09-24

TortoiseSvn 과 Trac 통합

TortoiseSvn에서 커밋시에 Trac의 티켓번호를 입력할 수 있도록 하려고 했더니 http://tracexplorer.devjavu.com/이 필요하고, 또 Trac에도
  • XML-RPC plugin and you need XML_RPC-permissions.
  • When you use AccountManagerPlugin together with form based authentication, you must also install the HttpAuthPlugin
해야 한다는... 에이 귀찮다.

Trac 실행 명령어

sudo trac-admin /path/to/trac/project initenv
sudo chown www-data:www-data -R /path/to/trac/project
sudo trac-admin /path/to/trac/project permission add admin TRAC_ADMIN
이제 svn 커밋할 때에, 티켓 번호와 연동해야 하는데...

Subversion의 mailer.py 스크립트에서 Gmail SMTP 사용하기

기본적으로 아래 링크를 참조
http://www.pyrasis.com/blog/entry/SubversionMailerPyScriptForGmailSMTP

sudo apt-get install subversion-tools

mailer.conf 에서는
# mail_command = /usr/sbin/sendmail
smtp_hostname = smtp.gmail.com:587
smtp_username = someuser@your.domain
smtp_password = yourpassword

from_addr = someuser@your.domain
to_addr = your@mailing.list
reply_to = your@mailing.list

from_addr세팅을 안했더니 안간다. 이것 때매 시간 좀 썼다. 그리고 위에서 mail_command 는 코멘트 처리 했다. 이게 있으면 SMTP로 직접 쏘는게 아니라 sendmail을 이용해서 보낸다는거다.

mailer.py 에서는 class SMTPOutput 의 finish() 에서

if self.cfg.is_set('general.smtp_username'):
  server.ehlo()
  server.starttls()
  server.ehlo()
  server.login(self.cfg.general.smtp_username,
                   self.cfg.general.smtp_password)

와 같이 수정한다.

2009-09-16

LazyInitializationException 처리

나도 당해보니 고민이 되는구먼... 내가 이해하는게 맞는지 잘 모르겠단 말야... 이건 이런 경우가 아닐까 해.
XXX x = aaaService.getXXX();
bbbService.doSomething(x);

bbbService.doSomething(XXX x) {
    x.getYYY();  <-- 여기서 LazyInitializationException
}
즉 XXX x 객체가 세션의 바운더리를 넘어서 이동할 경우 Detached 상태가 된다는 것이 문제의 원인일 것 같아.

그러므로 해결책은 1) detached된 객체를 re-attach하거나 2) 위 두 서비스의 호출을 하나의 Unit of Work로 묶어주거나.

2번이 애플리케이션 설계 측면에서 더 매력적일 듯.

인터넷에 있는 해결책들은 대부분 lazy=false 를 사용하라 되어 있던데 이것도 좀 그래. 왜냐하면 난 대부분의 경우 lazy=true 기능을 쓰고 싶단 말이지. 그리고 lazy=false로 하지 않아도 쿼리시에 eager fetch를 하면 되니까.

이상은 모두 추측. ㅎ (문서를 상세히 읽지 않았음)

2009-09-10

javascript로 다른 도메인 호출

<script>
document.domain = "example.net";
$(document).ready(function() {
    $('#call0').bind('click', function(event) {
        alert("loading...");
        // $('#a').load('http://no.example.net/a.php');
        try {
            $.get('http://no.example.net/a.php', function(data) {
                alert(data);
            });
        } catch (e) {
            alert(e);
        }
        alert("done...");
    });
});

var globalVar;
// This will be called by c.js
function assignGlobal(val) {
    globalVar = val;
    alert(globalVar);
}

$(document).ready(function() {
    $('#call1').bind('click', function(event) {
        $(document.createElement('script'))
        .attr('src', 'http://no.example.net/c.js').appendTo('head');
    });
});

$(document).ready(function() {
    $('#call2').bind('click', function(event) {
        frames['f'].func();
    });
});
</script>

<body>
<ul>
<li><a href="#" id="call0">Click: ajax loading. not work.</a>
<li><a href="#" id="call1">Click: script insert</a>
<li><a href="#" id="call2">Click: iframe(requires document.domain setting on both side)</a>
</ul>
<iframe name="f" id="f" src="a.php" width="100" height="50"></iframe>
a.php
<script>
document.domain = 'example.net';
function func() {
    alert('alert from func in a');
}
</script>
c.js
alert('alert from c.js');
assignGlobal('OOOOOOO');
AJAX로 하는 것은 동작하지 않는다. domain을 조절할 수 없다. 위에서 jquery로 script태그를 생성했는데, 이것을 plain javascript로 바꾸면 다음과 같다.
var h = document.getElementsByTagName('head').item(0);
var js = document.createElement('script');
js.setAttribute('src', 'http://no.example.net/c.js');
h.appendChild(js);

2009-09-09

신입사원 가이드

신입사원이 입사했을 때, 앞으로 어떤 것에 관심을 가지고 학습해야 할지 가이드 한 내용이다. Java 및 설계능력: Effective Java, Pattern, Refactoring. UML
DB: sql, ORM
Web: javascript + html + css

  • 네이버에서 신문 보는 것으로 시간 때우지 말 것.
  • IT뉴스 및 트렌드: dzone rss
  • RSS 볼 때, Open source에 특히 관심을 가질 것.
  • 타 운영체제에도 관심을: 리눅스, 솔라리스도 스스로 학습 할 것. (vmware, virtual box로 쉽게 접근할 수 있음)
  • 책을 가까이 할 것. 출퇴근 시간에 항상 책을 읽을 것. 업무시간에도 책을 읽을 것. 무의미하게 모니터를 바라보고 있지 말것.

2009-09-03

Ubuntu boot시 glassfish 자동 실행

/etc/init.d/glassfish라는 파일을 만들자. 이 디렉토리에 있는 파일을 하나 복사해서 만든다. 아래 내용으로.
#!/bin/sh -e

GLASSFISH_HOME=/home/glassfishv3-prelude

case $1 in
        start)
                ${GLASSFISH_HOME}/bin/asadmin start-domain --user admin $2
        ;;
        stop)
                ${GLASSFISH_HOME}/bin/asadmin stop-domain --user admin $2
        ;;
        restart)
                ${GLASSFISH_HOME}/bin/asadmin stop-domain --user admin $2
                ${GLASSFISH_HOME}/bin/asadmin start-domain --user admin $2
        ;;
        *)
                echo $"Usage: $0 {start|stop|restart} [domain]"
                exit 1
        ;;
esac
그런 다음 /etc/rc.local에 /etc/init.d/glassfish start domain1 한 줄 추가로 끝.

glassfish asadmin login

admin user를 만들고 password를 세팅하면 (admin realm에서) asadmin이 실패하게 된다. --user, --passwordfile 옵션 어쩌구 하면서 말이다. 이 경우 asadmin login [--port xxxx] 를 미리 실행하도록 한다. port는 admin port가 4848이 아닐 경우. 이러면 홈디렉토리에 .asadminpass 파일이 생성되고 이제 --passwordfile 옵션을 줄 필요가 없다.

apache reverse proxy

mods-enables에 아래와 같이 symbolic link생성

  • proxy.conf -> ../mods-available/proxy.conf
  • proxy_http.load -> ../mods-available/proxy_http.load
  • proxy.load -> ../mods-available/proxy.load

자신의 site 파일에 다음을 설정

ProxyRequests Off


Order deny,allow
Allow from all


ProxyPass /     http://localhost:8080/
ProxyPassReverse /      http://localhost:8080/

glassfish domain 생성

Glassfish에서 domain1외에 새로이 domain을 생성하는 화면.
root@buy-0448:/home/glassfishv3-prelude/bin# ./asadmin create-domain --portbase 9000 mydomain
Enter admin user name[Enter to accept default]>
Using port 9048 for Admin.
Using port 9080 for HTTP Instance.
Using port 9076 for JMS.
Using port 9037 for IIOP.
Using port 9081 for HTTP_SSL.
Using port 9038 for IIOP_SSL.
Using port 9039 for IIOP_MUTUALAUTH.
Using port 9086 for JMX_ADMIN.
Distinguished Name of the self-signed X.509 Server Certificate is:
[CN=mysite.example.com,OU=GlassFish,O=Sun Microsystems,L=Santa Clara,ST=California,C=US]
Domain jabberstory created.
Command create-domain executed successfully.
portbase 값에 따라 여러 port들이 정해진다.

Ubuntu에서 LAMP 한 방 설치

sudo tasksel install lamp-server

Ubuntu virtual host, site

Ubuntu에서 virtual host를 세팅하고 있다. site를 이용한다. /etc/apache2/sites-available/000-default 파일을 복사하여 newsite를 만든다. new site에 다음 내용을 넣는다.
<VirtualHost *:80>
    DocumentRoot /home/rnd/www
    ServerName rnd.example.net
    ErrorLog /var/log/apache2/rnd.example.net-error_log
    CustomLog /var/log/apache2/rnd.example.net-access_log combined
</VirtualHost>
sudo a2ensite newsite를 실행한다. a2dissite명령어도 있다.