아래의 rownum과 같은 방법으로 update에서 variable을 사용하기. 이걸 사용하기 위해서 set 안에 variable 세팅을 넣었는데 안 되더니만 where에 넣으니깐 되네.

update table, (SELECT @a:=0) p SET val1=@a
where @a:=@a+1
Posted by 홍사마

Sometimes it needs to exactly mimic Oracle's ROWNUM where is no possibility to initiate a counter in previous statement by SET @rownum:=0;.
It is still possible in a single SQL.

SELECT @rownum:=@rownum+1 rownum, t.*
FROM (SELECT @rownum:=0) r, mytable t;

Posted by 홍사마

출처: http://widelake.net/208

언젠가부터 gmail에서 보낸 사람이 깨지길래 브라우저 문제인지(그 당시 ie에서 firefox로 바꿨던 상황이였음) 알았더니 gmail의 정책 문제였구만..
역시 이제는 UTF-8로 통일을 해야되는 것인가? 두둥..
앞으로의 개발은 UTF-8로 적응을 하는 연습을 해야겠다..

================================================


사용자 삽입 이미지
Gmail 을 이용하다보면 간혹 리스트와 본문에서 보낸 사람의 이름이 깨져보이는 경우가 많습니다. 그것도 불과 얼마전까지 그러지 않다가 그런 것처럼 보입니다. 제 리퍼러에 'Gmail 보낸 이 깨져'라는 검색 리퍼러가 들어와 있어서 한번 그 이유를 포스팅해봅니다.


이 문제는 Gmail의 문자 인코딩 정책이 갈짓자(之)를 그리고 있다는 얘기로 귀결됩니다. Gmail의 정책 변경 방향이 잘못되었다는 것이 아니라, 자꾸 바뀌고, 일관성이 없다는 얘기입니다.



우 선, 위의 목록에서 보시면 하나는 제대로 나오고, 하나는 깨져보이고 있습니다. 이 둘은 둘다 "한글"이며, 다른 메일 서비스에서 보면 둘다 정상적으로 표시되지만, 유독 Gmail에서만 깨져나옵니다. 그렇다면 둘의 차이는 뭘까요? (참고로 위의 À̴Ͻýº 글자는 "이니시스"라는 글자입니다) 그냥 보이는 메일 화면에서는 차이를 알 수 없습니다. 그렇다면 원문 보기를 해야죠. 보낸 사람 이름이 깨진 "이니시스"의 메일을 ①번, 아래 정상적으로 나오는 "한 민신"의 메일을 ②라고 하겠습니다.

①의 원문보기로 들어가서 헤더 부분 중 From을 찾아봅니다. Firefox에서 아래처럼 나옵니다.

후아, 무슨 글자인지 깨져서 도저히 알아볼 수가 없습니다. Firefox > 보기 > 문자 인코딩 > 한국어(EUC-KR)로 지정해봅니다.


이렇게 하면 저 깨진 글자가 제대로 나옵니다. 즉, 저 헤더의 보낸 사람 이름, 받는 사람 이름, 그리고 제목은 EUC-KR로 인코딩되어있다는 것을 알 수 있습니다.

그럼, 제대로 나오는 ②의 원문을 한번 보도록 하죠.

인코딩된 문자열로 되어있습니다.

둘간의 차이를 아실 수 있습니까? 네, 바로 제목과 보낸 사람 이름 필드에 문자 인코딩 셋이 지정되어있다면 글자가 깨지지 않습니다. ①의 메일에서는 "한글"로 제목과 이름을 기입했음에도 불구하고 문자 인코딩 셋을 지정하지 않았고, 유니코드(UTF-8) 기반인 Gmail에서 EUC-KR로 인코딩된 글자를 유니코드로 디코딩하려다보니 저렇게 깨져보이는 현상이 나타난 것입니다.

그 러나 ②의 메일에서는 제목과 이름에 들어있는 문자들이 KSC5601-1987로 인코딩한 문자열이라고 지정하였습니다(=?ks_c_5601-1987?B? ~ ?=). 이 문자 인코딩 셋의 지정 여부 때문에 글자가 깨지고, 깨지지 않는 차이를 나타내는 것입니다. 그렇기 때문에, 이 문제는 기본적으로 받는 사람이 잘못한 것이 아니라 보내는 쪽이 잘못한 문제라고 할 수 있습니다.1  보내는 쪽에서 반드시 수정을 해야하는 사항이며, 개인적으로는 헤더부분에 문자 인코딩 셋을 지정하지 않는 것 자체가 '내가 메일을 제대로 보내지 않겠소'라고 선언하는 꼴 밖에 되지 않는다고 봅니다.

그럼에도 불구하고 Gmail이 문자 인코딩 셋 문제에 있어 갈짓자(之) 행보를 보인다고 할 수 있는 것은 크게 세가지 이유가 있습니다.

첫번째, 이 문자 인코딩 셋이 지정되지 않은 문자열을 어떤 때는 자동으로 처리하여 제대로 보여주다가도, 갑자기 처리하지 않아 죄다 깨지게 하더니, 어느날 다시 제대로 처리를 해주다가 최근 들어 다시 처리를 해주고 있지 않습니다.

제가 작년 6월에 이 문제에 관련한 이삼구글님의 포스트에 남긴 댓글 중 일부입니다.

Gmail 처음 시작 당시에는 인코딩 셋을 자동으로 식별하여 처리해줬다가, 2004년말 즈음에 해당 처리과정 자체를 내렸었습니다. 그리고 2005년 봄부터 다시 처리가 되기 시작했었는데, 6월 15일 이후 다시 처리과정을 내린 것으로 보입니다(지금 제 gmail의 메일로 판단해볼 때). 결국 Google 쪽에서도 아직 인코딩 여부 판단에 대한 최종 결정을 내리지 못한 것으로 보입니다. 2년새 인코딩 정책이 3번이나 바뀐 셈이니까요.

2006년 6월 이후에도 계속해서 디코딩 정책이 바뀌었습니다. 이삼구님의 언급으로는 Gmail이 메일 원문 중 본문 문자 인코딩 셋(Content-Type: text/html; charset=euc-kr)을 참조하여 보여주나, 이것마저 제대로 되지 않을 경우 깨질 수 있다고 하셨지만, 제가 볼 때는 현재의 상태에서는 본문 문자 인코딩 셋이 지정되어있는 경우에조차 제목과 이름 부분의 문자 인코딩 셋이 존재하지 않는 경우 깨지고 있습니다.

두번째, 똑같이 제목과 이름에 문자 인코딩셋이 누락되었는데도 불구하고 제대로 출력되는 경우가 있습니다. 대표적인 케이스가 링크프라이스입니다.


위의 이미지를 보시면, "링크프라이스"라는 보낸 사람 이름과 제목이 모두 정상적으로 출력됩니다. 그러나 원문을 한번 보겠습니다.


제목과 이름 부분에 문자 인코딩 셋이 지정되어있지 않습니다. 똑같은 메일인데, 누군 제대로 나오고 누군 깨져나오는 불일치가 발생하는 것입니다.

세번째, 문자 인코딩 셋이 지정되어있지 않아 글자를 깨져나오도록 한다면 제목도 똑같이 깨져나와야합니다. 그런데 Gmail은 그렇게 처리하지 않습니다. 보낸 사람 이름은 깨져나오도록 하더라도 제목은 제대로 나옵니다.


위 의 예 ①번에 든 이니시스의 메일입니다. Gmail이 문자 인코딩 셋을 지정하지 않은 문자에 대해 별도 디코딩 처리를 하지 않고 그대로 출력하겠다고 정책을 정했다면 제목도 깨져나와야합니다. 이니시스의 메일은 제목도 문자 인코딩 셋을 지정하지 않았기 때문입니다.

만약 사용자의 불편함을 덜어주기 위해서 제목은 제대로 출력하기로 했다면 일관성이 없습니다. 그렇다면 보낸 사람의 이름도 제대로 출력해줘야할 것이고, 문자 인코딩 셋을 지정하지 않는 것에 대해 별도 처리를 해주지 않기로 했다면 제목도 깨져나와야합니다. 그러나 Gmail은 그렇게 하지 않았습니다. 일관성 측면으로 본다면 국내 포털 웹메일 모두와 Hotmail(Live Mail), Yahoo! Mail은 모두 제목과 보낸이를 공평하게 대합니다. 둘다 깨지던지, 둘다 깨지지 않습니다.

물론, 제목은 메일의 본문의 일부로 보니까 제대로 나오는 것 아니냐, 라고 할 수도 있겠습니다만, 엄연히 제목을 표시하는 subject 필드는 메일의 Header에 속하는 영역입니다(RFC2822). 똑같이 헤더에 속하는 필드가 어떤 것은 처리되고 어떤 것은 처리되지 않는 것 자체가 말이 안되는 겁니다.



별거 아닌데 왜 그러냐!

이 러실 수 있습니다. 보낸 사람 이름이 깨져나와도 불편할 것 없습니다. 하지만 Gmail이 한국어 버전을 지원하고 한국 서울 지사를 설립하는 와중임에도 불구하고 언어 리소스 문제에 대해 이렇게 갈짓자(之) 행보를 그리면서 어설프게 한다면 틀림없이 일반 사용자를 공략하는 데에는 실패할 겁니다(구글 한국어 리소스의 문제는 하루 이틀 일이 아닙니다만). 인터페이스의 어려움(뭐, 메일 바닥에서는 간편하면서도 기능적인 인터페이스로 여기는 성향이 있습니다만 일반 사용자의 관점에서 말입니다)은 차치하고라도 말입니다. 쓰는 사람 입장에서 불편하다면, 그것은 별거 아닌게 아닙니다.

특히 구글이라면 말이죠.
  1. 기 술적으로 본다면 외산 메일 솔루션을 도입해서 수정 혹은 그대로 사용하면서 인코딩 문제를 전혀 고려하지 않고, '국내 메일에서 잘 보이니까'라고 넘겨버리는 게 문제의 핵심입니다(외산 메일 솔루션이 개발단계에서 다국어 지원을 고려하는 일이 거의 없고, 또 그걸 한글화해서 판매하거나, 설령 자체적으로 개발한 국내 솔루션 업체도 이 문제를 심각하게 고려하지 않습니다. 대표적인 케이스가 넷퍼시의 대량 메일 솔루션입니다. 넷퍼시의 대량 메일 솔루션을 사용하는 업체의 DM은 100이면 100, Gmail에서 보낸 사람 이름이 깨져나옵니다). 그렇기 때문에 '원칙적으로' 처리하는 메일 수신단에서 깨지면 보낸 쪽의 잘못은 생각하지도 않고 '받는 쪽이 이상하다'라고 주장하는 촌극이 벌어지는 것이지요. 메일 쪽에서는 상상외로 이런 경우가 많습니다. [본문으로]

ty's

Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.


Posted by 홍사마

출처 : http://sodumarvin.tistory.com/29

밑에 소두마빈님의 댓글로 인하여 업데이트를 함.

소두마빈님..감사합니다..^^;

=============================================================

/* ************* 1번 스타일 ------------- */
try
{
    // Text File을 읽어올때 UTF-8 인지 EUC-KR 문자포멧인지 모를때
    // 두가지 형태로 읽은다음 라인바이라인으로 비교를 한다음에 처리한다.

    FileInputStream fis1 = new FileInputStream(pFilePath);
    FileInputStream fis2 = new FileInputStream(pFilePath);

    InputStreamReader isReaderUTF8 = new InputStreamReader(fis1, "utf-8");
    InputStreamReader isReaderEUCKR = new InputStreamReader(fis2, "euc-kr");

    BufferedReader bufReaderUTF8 = new BufferedReader(isReaderUTF8);
    BufferedReader bufReaderEUCKR = new BufferedReader(isReaderEUCKR);

    String utfLine = "";
    String euckrLine = "";

    ArrayList lineArray = new ArrayList();

    int tempI = 0;
    String tempBuffer = "";
    while (true)
    {

        utfLine = bufReaderUTF8.readLine();
        euckrLine = bufReaderEUCKR.readLine();


        if (euckrLine != null) {
        // 조금더.. 검증을 해볼 필요가 있음.
        if (utfLine.getBytes("utf-8").length == getEncodedLength(utfLine) &&     
            utfLine.getBytes("utf-8").length == euckrLine.getBytes("euc-kr").length)
        {
            lineArray.add(utfLine.trim());
        } else {
            lineArray.add(euckrLine.trim());
        }



        tempBuffer = (String) lineArray.get(lineArray.size() - 1);
        } else
        {
            if (utfLine == null)
                break;
            else {
                lineArray.add(utfLine.trim());
                tempBuffer = (String) lineArray.get(lineArray.size() - 1);
            }
        }
    }

    bufReaderEUCKR.close();
    bufReaderUTF8.close();
    isReaderUTF8.close();
    isReaderEUCKR.close();
    fis1.close();
    fis2.close();
}
catch (Exception ex) {
    ...
}

....

...
/* 2007-05-28 추가부분 */
public int getEncodedLength(String s) {
    if (s == null) {
        throw new IllegalArgumentException("Cannot calculate UTF-8 length of null string");
    }

    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            result++;
        } else if (c > 0x07FF) {
            result += 3;
        } else {
            result += 2;
        }
    }
    return result;
}
/*
    웹상에서 아무리 찾아봐도 없길래 ..
*/

/* ************* 2번 스타일 ------------- */
/* 링크를 클릭 후 2개의 java 파일을 받아서 테스트 하사면 됨 */
GuessEncoding :: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding


File file = new File(pFilePath);
Charset guessedCharset = com.glaforge.i18n.io.CharsetToolkit.guessEncoding(file, 4096);

FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, guessedCharset);
BufferedReader br = new BufferedReader(isr);

String line;
while ((line = br.readLine())!= null)
{
    System.out.println(line);
}










/* *************************************************************** */
/* 둘다 100% 한글 변환을 장담은 못하지만 사용하기에 무리가 없음 */

Posted by 홍사마

출처 : http://cafe.naver.com/momus.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=354199

요즘에 메신저에 보면 I'm이라는 이모티콘을 볼 수 있을텐데... 나는 이제 무슨 msn에서 지원하는 뭘 만들면 자동으로 달아주는 건지 알았다. 그래서 그냥 그런가 보다 했는데 사람들마다 I'm이 나오는 말이 다 다르고 그래서 뭔지 찾아 봤더니 아래와 같은 말이 나오는구만..
아래의 문구를 닉네임안에 넣으면 닉네임에 i'm안에 문구가 생긴다.

관심이 있는 분들은 아래와 같이 문구중에 하나를 넣어보세용~

===================================================

현재 MSN 메신저.. 즉, 엠에스엔 라이브 이상 부터 세계 난민 아동 지원 운동을 하고 있습니다.


엠에센 닉네임 란


*unicef - 국제 연합 아동 기금
*one
*help - 지구 온난화 방지 운동
*wwf - 세계 야생 생물 기금
*naf - National AIDS Fund
*sierra - 민간 환경 운동 단체
*bgca - 보이즈 앤 걸즈 클럽
*9mil - 난민 아동 지원 프로젝트
*hsus - 미국 인도 주의 협회
*komen - 수잔 G. 코먼 유방암재단
*mssoc - 국제 다발성 경화증 협회
*care - 미국 대외 구제 협회
*acs - 미국 식민 협회
*oxfam - 국제 빈민 구호 단체
*mod
*red+u - 미국 적십자사


(출처 : With My Life, Minkyo.NET - http://www.minkyo.net/52)


위의 단어를 넣으시면


아래처럼 엠에스엔 메신저 닉네임 앞에 I'm 이라는 아이콘이 생성되면서

 

MS(마이크로소프트사)가 난민 아동 지원 프로젝트에 기부를 하게 됩니다.


한번 동참해볼까요?


Posted by 홍사마

[펌]monit

DEVEL : 2007. 3. 21. 17:39
출처 : http://myruby.net/articles/category/development

아직 적용해 보지는 않았지만 앞으로 해놓을 것을 생각해서 미리 적어놓음.
내가 지금까지 해 왔던 것은 cront과 pid파일을 이용하여 했던 것인데 이런 툴을 이용해서 하는 방법도 괜찮은 것 같다. 그러나 이런 류의 프로그램의 문제는 항상 이 프로그램 자체가 문제가 있는 경우도 대처를 해야된다는 것이다.

이제 조만간에 서버도 준비를 해야되고 시스템도 구축해야되는데 할일이 넘 많네..ㅠ.ㅠ
역시 난 백수가 딱 맞는데 괜히 사서 고생을 하고 있나부다..ㅡ.ㅡ;;;
@취미로 일할 수 있게 돈 많은 여자 좀 소개시켜주삼...ㅡ.ㅡ;;;
@@wiki를 복사해서 그런지 제대로 안 나오네..

monit을 이용한 몽그렐 프로세스 모니터링 3

Posted by deepblue 17 days ago

지난 두 편의 글에서 mongrel을 재시작하는 방법과 Kill -9 이라는 극약 처방에 대해 적었다.

더 노하우가 쌓이면 어떤 상황에서 mongrel 프로세스가 먹통이 되는지에 대해 다루기로 하고, 이 글의 마지막은 monit을 소개하는 것으로 마치려 한다.

무슨 이유에서건 mongrel 프로세스가 서비스를 할 수 없는 상황에 이르게 된다. 현재는 심증만 있고, 물증이 없는 상태라 완벽한 처방은 하지 못하고 있다. 아무튼 서비스를 하려면 이런 프로세스를 최대한 빨리 발견하고 정상화해야 한다. 즉, 주기적인 모니터링과 자동 복구가 필요한 상황이다. 이를 위한 최적의 툴이 바로 monit이다.

monit은 유닉스 시스템에서 프로세스, 파일, 디렉터리를 감시하고 관리하는 유틸리티이다. monit은 자동 관리 및 복구를 가능하게 하므로, 오류가 발생했을 때 시기 적절한 처방을 내릴 수 있다.

설치 과정은 다른 유닉스 프로그램과 크게 다르지 않기 때문에 생략하자. 그 다음 우리가 할 일은 monit에게 mongrel 프로세스를 감시할 수 있는 방법과 처방전을 미리 알려주는 것이 전부이다. 어렵지 않다.

적당한 위치에 monitrc 파일을 만들고(필자는 ~/.monitrc), 다음처럼 적어준다.

check process mongrel_0 with pidfile <SOME-DIR>/shared/log/mongrel.4000.pid
start program = "mongrel_rake.sh start_0"
stop program = "mongrel_rake.sh stop_0"

if totalmem is greater than 100.0 MB for 5 cycles then restart # eating up memory?
if cpu is greater than 50% for 2 cycles then alert # s an email to admin
if cpu is greater than 80% for 3 cycles then restart # hung process?
if loadavg(5min) greater than 10 for 8 cycles then restart # bad, bad, bad
if 3 restarts within 5 cycles then timeout # something is wrong, call the sys-admin

if failed port 4000 protocol http # check for response
with timeout 10 seconds
then restart
group mongrel

mongrel.4000.pid라는 파일에는 4000번 포트를 이용하는 몽그렐 프로세스의 아이디가 저장된다. 그리고 자원을 너무 많이 사용하면 재시작해준다. 가장 중요한 부분은 맨 마지막에 4000번 포트를 감시하는 부분이다. 10초안에 접속이 되지 않는 경우 먹통이 된 것으로 판단하고 필요한 조치를 취한다. 여기서는 당연히 재시작이다. 재시작은 stop program과 start program을 하나씩 실행해주는 방법이다. 필자는 지난번에 소개한 우아한 재시작 프로그램을 따로 만들어두고, 이 스크립트를 실행하도록 하였다. 이 부분에 그냥 mongrel_rails를 실행하도록 두어도 된다.

이런 방법으로 클러스터링해둔 프로세스를 모두 감시하도록 monitrc 파일을 작성하면 된다. 반복되지만, 해결할 수 있는 방법은 찾지 못했다.

여기에 덧붙여 이런 내용을 monitrc에 추가한다.

set daemon 60
set logfile monit.log
set pidfile monit.pid
set statefile monit.state

set httpd port 9999
use address localhost
allow username:password

60초마다 감시를 하고 필요한 정보(log, pid, state)를 파일로 남기도록 지정한다. 그리고 9999번 포트로 관리툴을 띄운다. 물론 HTTP 인증을 거치도록 설정해둔다.

이 관리툴도 유용한데, 현재 서비스가 잘 이뤄지고 있는지 한 눈에 파악할 수 있는 모니터링 툴이다. 여기서 Stop, Start등 monit 명령어를 수행할 수도 있다.

마지막으로 주의할 점은, 모니터링을 켜두고 몽그렐 클러스터를 재시작하는 경우이다. 재시작은 프로세스를 죽이도 다시 시작한다. 그런데 다시 시작하는 동작이 2번 일어날 수 있다. 물론, 두 번째 프로세스는 이미 포트가 바인드된 상태이므로 큰 문제 없이 실패하겠지만, 그래도 불필요하게 두번 시작하는 것을 막기 위해서라면, 재시작 전에 모니터링을 끄는 것도 방법이다.

monit -g mongrel unmonitor all

-g mongrel을 이용하면 mongrel 그룹으로 지정된 것에 한번에 명령을 내릴 수 있다. 물론, 재시작할 때 mongrel_rails 대신 monit을 이용해도 된다.

monit -g mongrel restart all

이 외에도 monit을 이용해 여러 가지를 감시할 수 있으므로(httpd, ftpd 등), 함께 사용해보면 좋겠다. 더 좋은 설정이 있으면 함께 공유해도 좋을 것 같다.

서비스에 monit을 적용한 이후에, 일단 서비스가 멈추는 일은 없어져서 발 뻗고 잘 수 있게 되었다. 가끔 관리툴에 접속해보면 uptime이 혼자만 짧은 프로세스들이 보이는데, 이 때마다 monit을 설치해두기를 잘했다는 생각이 든다. 이제는 여유롭게 진짜 처방전을 찾아봐야겠다. 뭘까?

관련 링크

Mongrel이 말을 듣지 않으면 Kill -9

Posted by deepblue 22 days ago

Mongrel을 우아하게 재시작하는 법에서 이어서…

mongrel 프로세스를 종료하기 위해 보통 사용하는 명령은 다음과 같다

mongrel_rails  stop  [options]

문제는 온갖 문제로 특정 프로세스가 TERM 시그널을 받고도 죽지 않는 경우이다. TERM 시그널을 보내고 한참을 기다리면 스스로 사라지기도 하지만, 대부분의 경우 그리 느긋하게 기다릴 수만은 없다. 방법은 kill -9를 하는 것이다. 다행인지 mongrel_rails에는 강제 종료 옵션이 있다.

mongrel_rails -f -w 5

내가 사용하는 방법은 이렇다. TERM을 보내본다. pid 파일이 아직도 있으면(정상적으로 종료되지 않으면) 강제 종료한다.

 def stop(i)
pid = "#{APP_HOME}/shared/log/mongrel.400#{i}.pid"
system "mongrel_rails stop -P #{pid} -c #{APP_HOME}/current"

if File.exists?(pid)
system "mongrel_rails stop -P #{pid} -c #{APP_HOME}/current -w 5 -f"
system "rm #{pid}"
end
end

갑자기 ”When Your Mongrel Misbehaves, Kill -9“이라는 명곡이 생각난다. 킬 대시 나인~~.


Posted by 홍사마
역시 메모장...

출처 : http://javascript.about.com/library/blmodal.htm

보통 브라우저에서 새로운 창을 열 때 window.open을 이용한다. 그러나 이것을 시스템에 따라서 반응이 엄청 느릴때가 있다 이 때 modelDialog를 사용하면 빠르고 금방 뜨게 할 수 있다. 그러나 역시 이것은 브라우저마다 다른데 ie에서는 showModalDialog()를 지원하지만 firefox에서는 window.open의 property로 사용할 수 있다.

그래서 나중에 써먹기(지금 바로 적용하기도 하겠지만) 위해서 메모를 해야겠삼.

====================================================

Modal Windows

From Stephen Chapman,
Your Guide to Javascript.
FREE Newsletter. Sign Up Now!
Join the Discussion

Questions? Comments?

Related Resources

Modal Dialog Box

Creating a popup window is reasonably easy if you just want another browser window of a specified size and you don't care if your visitors swap back and forward between the various browser windows. Where it becomes difficult (if not impossible) is where you want the new window to stay in front of the original window and not allow your visitor to interact with the original window until the new window has closed. We call a window that insists on retaining the focus like this a modal window.

The difficulty is that Javascript does not have a standard way of creating a modal popup window the way it has a standard way to create an ordinary (modeless) window by using window.open().

A number of browsers (for example Netscape 4 or any version of Opera up to and including version 9) do not allow you to make a popup window modal at all. There is simply no command that you can use that will make a window modal in those browsers.

There are two groups of browsers that do allow you to create modal windows and each uses a different method to do so.

Internet Explorer adds an entirely new method to the window object to open a modal window - window.showModalDialog(). If you use that to try to open a modal window then if your visitor is running Internet Explorer then a modal window will be opened. If they are running some other browser then all they will get is a Javascript error.

The Mozilla based browsers (Netscape 6+, Firefox, etc) use a completely different method to declare that the window that is opened should stay in front . They use the normal window.open and just add an extra attribute modal=yes to the list of atributes that define the appearance of the window (unfortunately it still doesn't actually make it modal it just forces it to stay in front which is the best that you can do with these browsers). If you try to use this to try to open a modal window then the window will open in any browser (provided that it hasn't been blocked by a popup blocker) but it will only stay in front if the browser is one of the Mozilla based family. If your visitor is running Netscape 4, any version of Opera, or Internet Explorer etc. then the window will still open it just wont stay in front.

The best that we can do to set up a window that is as modal as we can make it is to combine these two together to create code that will open a modal window in Internet Explorer, keep the window in front in Mozilla based browsers, and which will just open a non-modal window in those browsers that don't support modal windows. Of course we don't want to test which browser that the browser itself claims to be since most Opera browsers are set to report that they are Internet Explorer. Instead we test for support for the showModalDialog method itself to identify those versions of Internet Explorer that support it. Combining the code together gives us the following (with the amendments from an ordinary non-modal window shown in bold).

function modalWin() {
if (window.showModalDialog) {
window.showModalDialog("xpopupex.htm","name",
"dialogWidth:255px;dialogHeight:250px");
} else {

window.open('xpopupex.htm','name',
'height=255,width=250,toolbar=no,directories=no,status=no,
continued from previous linemenubar=no,scrollbars=no,resizable=no ,modal=yes');
}
}

All that remains is to set up the code to call our modal window function (and of course to allow those without Javascript to have the window open in a separate non-modal browser window as well.

<a href="xpopupex.htm" target="name"
onclick="modalWin(); return false;">click here</a>

If you want to see what effect that using all of the above code has in your particular browser then click here and if your browser supports modal windows then that is what will open and you will have to select the close link to close that window before being able to return to this page. If your browser doesn't support modal windows then the window will still open but it will not be modal.


Posted by 홍사마

라디오에서 오래간만에 들었는데 다시 듣고 시퍼서리...여기에 남김..

그리고 밑에는 가사...

==========================================================

눈의 꽃 가사...


어느새 길어진 그림자를 따라서
땅거미진 어둠속을 그대와 걷고 있네요.

손을 마주 잡고 그 언제까지라도
함께 있는것만으로 눈물이 나는 걸요.

바람이 차가워지는만큼 겨울은 가까워 오네요
조금씩 이 거리 그 위로 그대를 보내야 했던
계절이 오네요.

지금 올해의 첫눈꽃을 바라보며
함께 있는 이 순간을 내 모든걸 당신께 주고 싶어
이런 가슴에 그댈 안아요.

약하기만한 내가 아니에요 이렇게 그댈 사랑하는데
그저 내맘이 이럴뿐인거죠.

-간주중-

그대곁이라면 또 어떤일이라도
할 수 있을 것만 같아 그런 기분이 드네요.

오늘이 지나고 또 언제까지라도
우리 사랑 영원하길 기도하고 있어요.

바람이 나의 창을 흔들고 어두운 밤마저 깨우면
그대 아픈 기억 마저도 내가 다 지워줄께요.
환한 그 미소로

끝없이 내리는 새하얀 눈꽃들로
우리 걷던 이 거리가 어느새 변한것도 모르는체
환한 빛으로 물들어 가요.

누군갈 위해 난 살아 갔나요.
무엇이든 다 해주고 싶은
이런게 사랑인줄 배웠어요.

혹시 그대 있는곳 어딘지 알았다면
겨울밤 별이 되 그대를 비췄을텐데.

웃던 날도 눈물에 젖었던 슬픈 밤에도
언제나 그 언제나 곁에 있을께요.

지금 올해의 첫눈꽃을 바라보며
함께 있는 이 순간을 내 모든걸 당신께 주고 싶어
이런 가슴에 그댈 안아요.

울지말아요 나를 바라봐요.
그저 그대의 곁에서 함께이고 싶은 맘 뿐이라고
다신 그댈 놓지 않을까요.

끝없이 내리며 우릴 감싸요
거리 가득한 눈꽃 속에서
그대와 내 가슴에 조금씩 작은 추억을 그리네요.
영원히 내 곁에 그대 있어요.


Posted by 홍사마

여기는 블로그가 아니라 메모장으로 쓰는군...ㅡ.ㅡ;;;
많은 사람들(나만 그런가?)이 paged list를 만들 때 전체 row수를 페이지에 나타나는 갯수로 나누어서 페이지를 나눠놓고 가져올 때는 limit로 가져올것이다. 그러면 페이지를 나타낼 때 전체수를 나누는 쿼리를 한번 더해야되는 수가 있고 그 쿼리도 만들어야 되는 경우가 발생한다. 물론 아래의 방법도 쿼리를 한번 더 해야되나 그 쿼리를 만들지 않아도 되고 그냥 found_rows()라는 것을 사용하면 된다.

문제는 이것이 subquery 안에서는 동작이 안된다. 가장 바깥에 있는 쿼리에서만 사용해야된다. 해보니 잘된다. 이걸로 totalcount를 가져오는 쿼리를 다 바꿔야겠다..흐극...


MySQL: Get total number of rows when using LIMIT August 11, 2006

Posted by Slobodan Kovacevic in : Programming , trackback

Every now and then you need to limit the number of rows MySQL returns, i.e. use the LIMIT clause. Result set pagination is by far the most often usage of LIMIT clause, since you usually want to select only rows you’ll be displaying on certain page.

The problem is that for pagination you also need total number of rows in a result set, so you know how many pages you’ll have. This usually means that you need to execute query two times. First query is for counting total number of rows without LIMIT. Second query is exactly the same as the first, just without LIMIT and it will actually retrieve required data. You would need two queries like these:

SELECT COUNT(*) FROM users WHERE name LIKE 'a%';

SELECT name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

Now, this is not such a big problem when you have small result sets and/or simple queries. But if you have a complex query that joins several tables and takes a while to execute - well, you probably wouldn’t want to execute it twice and waste server resources.

Luckily since MySQL 4.0.0 you can use SQL_CALC_FOUND_ROWS option in your query which will tell MySQL to count total number of rows disregarding LIMIT clause. You still need to execute a second query in order to retrieve row count, but it’s a simple query and not as complex as your query which retrieved the data.

Usage is pretty simple. In you main query you need to add SQL_CALC_FOUND_ROWS option just after SELECT and in second query you need to use FOUND_ROWS() function to get total number of rows. Queries would look like this:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

The only limitation is that you must call second query immediately after the first one because SQL_CALC_FOUND_ROWS does not save number of rows anywhere.

Although this solution also requires two queries it’s much more faster, as you execute the main query only once.

You can read more about SQL_CALC_FOUND_ROWS and FOUND_ROWS() in MySQL docs.

Posted by 홍사마
issue list를 처리하다가 발견한 것..

이런 것이 있었군..일단 ime가 나오는 것을 보니 ie에서만 될 확률이 높지만 그래도 적용시켜 놓아야겠네~

===========================



[STYLE] 한영/대소문자 입력을 마음대로


상기의 요소는 회원가입, 게시판 등에 유용하게 사용할 수 있다. 키보드에서 입력되는 한영전환 단계를 줄이고, UI를 향상시킬 수 있으므로, 여러모로 잘 활용하면 아주 유용하다. 특히 해외여행 분야와 같은 특정 분야에서는 대문자만으로 정보처리가 되므로 Caps Lock 키의 입력을 줄일 수 있으므로 알아두면 유용하게 사용할 수 있다. 뭐 새로울 것도 없지만 말 그대로 TIP이다.(Short but useful information)

1. 한영전환
-------------------------------------------------------------------------
<!-- 주변의 모든 폼요소를 한글로 초기화 -->
ⓐ <input type="text" style="ime-mode:active" />
(당연히 영어로 전환이 가능하다.)


<!-- 한글모드에서 다시 영문모드로 복뒤, 이후의 요소를 모두 영문으로 복귀시킴 -->
ⓑ <input type="text" style="ime-mode:inactive" />
<input type="text" /> <!-- 영문으로 입력됨 -->


한글문자 입력 금지 (원천봉쇄): 아예 한/영 키를 눌러도 한글이 입력되지 않는다.
ⓒ <input type="text" style="ime-mode:disabled" />


2. 영문자의 대소문자
------------------------------------------------------------------------
마찬가지로 id 등의 요소에는 영문자만 입력되게 할 수 있는데, Javascript를 이용한 방법보다 훨씬 쉽고, 직관적이다.


<p style="text-transform: capitalize">첫번째 영문자만 대문자 : This site is motifdn</p>
<p style="text-transform: uppercase">모두 대문자 : This sitem is motifdn</p>
<p style="text-transform: lowercase">모두 소문자 : This site is motifdn</p>
Posted by 홍사마