DHTML Color Picker
그래서 온라인에 DHTML기반의 괜찮은 Color Picker를 찾았습니다. 유용하게 사용하세요.

- 데모 사이트 : http://mimul.com/examples/DHTML_Color_Picker/
- 참고 사이트 : http://www.colorjack.com/software/dhtml+color+picker.html
패스워드 강도 체크하는 오픈 소스
1. Javascript/Java PasswordCheck Meter
문자열(대/소문자), 숫자, 특수문자를 가지고 패스워드 강도를 측정했습니다. Javascript외에 Java 소스도 제공하고 있습니다.

데모 사이트 : http://www.mimul.com/examples/password/passwdmeter.html
2. Password Strength Meter like Google
1번 예와 비슷하고 Javascript를 활용하여 패스워드의 강도를 측정하게 해줍니다. 그리고 측정 기준은 아래와 같습니다.

- 패스워드 길이 : 5 Points: Less than 4 characters, 10 Points: 5 to 7 characters, 25 Points: 8 or more
- 문자열 : 0 Points: No letters, 10 Points: Letters are all lower case, 20 Points: Letters are upper case and lower case
- 숫자 : 0 Points: No numbers, 10 Points: 1 number, 20 Points: 3 or more numbers
- 특수문자 : 0 Points: No characters, 10 Points: 1 character, 25 Points: More than 1 character
- 조합 : 2 Points: Letters and numbers, 3 Points: Letters, numbers, and characters, 5 Points: Mixed case letters, numbers, and characters
- 결과 값 : >= 90: Very Secure, >= 80: Secure, >= 70: Very Strong, >= 60: Strong, >= 50: Average, >= 25: Weak, >= 0: Very Weak
3. Password Meter
EXT JavaScript library기반으로 패스워드의 강도를 체크하는 오픈 소스입니다. 대/소문자 및 숫자, 심벌등을 조합하여 강도를 체크하는 기준으로 삼았습니다.

데모 사이트 : http://www.mimul.com/examples/password/passwd2.html
4. Password Strength Meter
자체 Javascript로 만든 패스워드 강도 체크 라이브러리입니다. 패스워드 강도 결과치 측정 기준은 아래 데모 사이트에 가면 상세히 알 수 있습니다.

데모 사이트 : http://www.mimul.com/examples/password/pwd_meter/
5. Prototype/Scriptaculous Password Strength Meter
Prototype/Scriptaculous를 활용한 패스워드 강도 체크.

데모 사이트 : http://www.mimul.com/examples/password/prototype_scriptaculous.html
6. JQuery Password Strength Meter
Jquery를 활용한 패스워드 강도 체크.

데모 사이트 : http://mimul.com/examples/password/jquery/jquerypwdcheck.html
[참고 사이트]
- http://justwild.us/examples/password/
- http://www.codeandcoffee.com/2007/07/16/how-to-make-a-password-strength-meter-like-google-v20/
- http://testcases.pagebakers.com/PasswordMeter/
- http://www.passwordmeter.com/
- http://ajaxorized.com/?p=14
- http://simplythebest.net/scripts/ajax/ajax_password_strength.html
- http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/
YOUTUBE 동영상을 플레이어
flv파일을 다운 받지 않고 자신의 사이트에서 구동이 가능하도록 만들어 놨군요.
여기에 가시면 전체 소스를 다운 받을 수 있습니다.
1. 필요한 파일
- ext-base.js
- ext-all-debug.js
- mediapanel.js
- YoutubePlayer.js
- YoutubePlayerControl.js
- YoutubePlayer.css
- ext-all.css
2. 수정할 부분
playerPanel.on('ready', function(panel, player) {
panel.cueVideoById('tPnGRGKPOdw', 0);
}, playerPanel);
- 데모 사이트 : http://www.mimul.com/examples/youtube/index.html
- 참고 사이트 : http://www.siteartwork.de/youtubeplayer/
웹 페이지로부터 RDF META-DATA 생성 방법
오픈소스인 WebCat을 사용하였습니다. 사용 방법은 아래와 같습니다.
1. WebCat 소스 다운로드
- http://webcat.sourceforge.net/
2. languages(언어) 파일 아래 디렉토리에 저장
- /k2/src/rdf/language-profiles
- WebCat라이브러의 압축을 풀면 있음
3.소스
import pt.tumba.parser.HTMLParser;4. 실행결과
import pt.tumba.parser.bib.BIB2HTML;
import pt.tumba.parser.doc.DOC2HTML;
import pt.tumba.parser.dvi.DVI2HTML;
import pt.tumba.parser.pdf.PDF2HTML;
import pt.tumba.parser.ppt.PPT2HTML;
import pt.tumba.parser.ps.PS2HTML;
import pt.tumba.parser.swf.SWF2HTML;
import pt.tumba.parser.tex.TEX2HTML;
import pt.tumba.parser.txt.TXT2HTML;
import pt.tumba.parser.unrtf.RTF2HTML;
import pt.tumba.parser.xls.XLS2HTML;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Iterator;
public class RDFExtractor
{
public static String encodeSGML(String input)
{
char replaceChar[] = {'"', '&', '<', '>', '\\'};
String replaceStr[] =
{""", "&", "<", ">", "'"};
String saux = "";
int len = input.length();
char inputArr[] = new char[len];
input.getChars(0, len, inputArr, 0);
int i, j;
boolean replace;
for (i = 0; i < len; i++) {
replace = false;
for (j = 0; j < replaceChar.length && !replace; j++)
if (inputArr[i] == replaceChar[j]) {
saux += replaceStr[j];
replace = true;
}
if (!replace) saux += inputArr[i];
}
return saux;
}
/**
*
* @param Meta-Data parser
* @return Meta-Data의 RDF문자열 리턴
*/
public static String getRDFData(HTMLParser parser)
{
StringBuffer sbuf = new StringBuffer();
int pos[];
int i;
Iterator it1;
Iterator it2;
URL u;
String s;
String s2;
sbuf.append("<?xml version='1.0' ?>\n");
sbuf.append("<r:RDF xmlns:r='http://www.w3.org/
1999/02/22-rdf-syntax-ns#'\n");
sbuf.append("xmlns:d='http://purl.org/dc/elements/1.1/'\n");
sbuf.append("xmlns:s='http://www.w3.org/2000/01/rdf-schema#'\n");
sbuf.append("xmlns:h='http://www.w3.org/1999/xx/http#'\n");
sbuf.append("xmlns:t='http://purl.org/dc/terms/'>\n");
sbuf.append("<r:Description r:about=\"" +
encodeSGML(parser.getName()) + "\">\n");
if (!parser.getMetaData().getTitle().equals("")) {
sbuf.append("<d:Title>" +
encodeSGML(parser.getMetaData().getTitle()) +
"</d:Title>\n");
}
if (!parser.getMetaData().getDescription().equals("") ||
!parser.getMetaData().getKeywords().equals("")) {
sbuf.append("<t:abstract>\n");
sbuf.append("<r:Alt>\n");
sbuf.append("<r:li r:ID='DocumentAbstract'>" +
encodeSGML(parser.getMetaData().getDescription()) +
"</r:li>\n");
sbuf.append("<r:li r:ID='DocumentKeywords'>" +
encodeSGML(parser.getMetaData().getKeywords()) +
"</r:li>\n");
sbuf.append("</r:Alt>\n");
sbuf.append("</t:abstract>\n");
}
if (!parser.getMetaData().getAuthor().equals("") ||
!parser.getMetaData().getCreator().equals("")) {
sbuf.append("<d:Creator>\n");
sbuf.append("<r:Alt>\n");
if (!parser.getMetaData().getAuthor().equals(""))
sbuf.append("<r:li>" +
encodeSGML(parser.getMetaData().getAuthor()) +
"</r:li>\n");
if (!parser.getMetaData().getCreator().equals(""))
sbuf.append("<r:li>" +
encodeSGML(parser.getMetaData().getCreator()) +
"</r:li>\n");
sbuf.append("</r:Alt>\n");
sbuf.append("</d:Creator>\n");
}
if (!parser.getMetaData().getCopyright().equals("")) {
sbuf.append("<d:Rights>" +
encodeSGML(parser.getMetaData().getCopyright()) +
"</d:Rights>\n");
}
if (!parser.getLanguage().equals("")) {
sbuf.append("<d:Language>" +
encodeSGML(parser.getLanguage()) + "</d:Language>\n");
}
if (!parser.getMetaData().getMIMEType().equals("")) {
sbuf.append("<d:Type>" +
encodeSGML(parser.getMetaData().getMIMEType()) +
"</d:Type>\n");
}
if (!parser.getMetaData().getFormat().equals("")) {
sbuf.append("<d:Format>" +
encodeSGML(parser.getMetaData().getFormat()) +
"</d:Format>\n");
}
if (!parser.getMetaData().getPublisher().equals("")) {
sbuf.append("<d:Publisher>" +
encodeSGML(parser.getMetaData().getPublisher()) +
"</d:Publisher>\n");
}
if (!parser.getMetaData().getContributor().equals("")) {
sbuf.append("<d:Contributor>" +
encodeSGML(parser.getMetaData().getContributor()) +
"</d:Contributor>\n");
}
if (!parser.getMetaData().getSource().equals("")) {
sbuf.append("<d:Source>" +
encodeSGML(parser.getMetaData().getSource()) +
"</d:Source>\n");
}
if (!parser.getMetaData().getDate().equals("")) {
sbuf.append("<d:Date>" +
encodeSGML(parser.getMetaData().getDate()) +
"</d:Date>\n");
}
if (!parser.getMetaData().getDateCreated().equals("")) {
sbuf.append("<t:created>" +
encodeSGML(parser.getMetaData().getDateCreated()) +
"</t:created>\n");
}
if (!parser.getMetaData().getDateAvailable().equals("")) {
sbuf.append("<t:available>" +
encodeSGML(parser.getMetaData().getDateAvailable()) +
"</t:available>\n");
}
sbuf.append("<d:Relation>\n");
sbuf.append("<r:Alt>\n");
if (!parser.getMetaData().getRelation().equals(""))
sbuf.append("<r:li>" +
encodeSGML(parser.getMetaData().getRelation()) +
"</r:li>\n");
if (!parser.getMetaData().getLinkRSS().equals(""))
sbuf.append("<r:li r:ID='LinkRSS'>" +
encodeSGML(parser.getMetaData().getLinkRSS()) + "</r:li>\n");
sbuf.append("</r:Alt>\n");
sbuf.append("</d:Relation>\n");
if (!parser.getMetaData().getRelationIsPartOf().equals("")) {
sbuf.append("<t:isPartOf>" +
encodeSGML(parser.getMetaData().getRelationIsPartOf()) +
"</t:isPartOf>\n");
}
if (!parser.getMetaData().getRelationIsFormatOf().equals("")) {
sbuf.append("<t:isFormatOf>" +
encodeSGML(parser.getMetaData().getRelationIsFormatOf()) +
"</t:isFormatOf>\n");
}
if (!parser.getMetaData().getRelationIsVersionOf().equals("")) {
sbuf.append("<t:isVersionOf>" +
encodeSGML(parser.getMetaData().getRelationIsVersionOf()) +
"</t:isVersionOf>\n");
}
if (!parser.getMetaData().getRelationIsBasedOn().equals("")) {
sbuf.append("<t:isBasedOn>" +
encodeSGML(parser.getMetaData().getRelationIsBasedOn()) +
"</t:isBasedOn>\n");
}
if (!parser.getMetaData().getRelationRequires().equals("")) {
sbuf.append("<t:requires>" +
encodeSGML(parser.getMetaData().getRelationRequires()) +
"</t:requires>\n");
}
sbuf.append("</r:Description>\n");
sbuf.append("</r:RDF>");
return sbuf.toString();
}
/**
*
* @param src 소스 문서의 InputStream
* @param t 소스문서의 MIME TYPE
* @param aux 초기화 파서
*/
public static HTMLParser initParser(InputStream src,
String t, HTMLParser aux)
throws Exception {
int type = 0;
if (t.endsWith("application/pdf")) {
type = 1;
} else if (t.endsWith("application/postscript")) {
type = 2;
} else if (t.endsWith("application/msword")) {
type = 3;
} else if (t.endsWith("application/vnd.ms-powerpoint") ||
t.endsWith("application/powerpoint") ||
t.endsWith("application/mspowerpoint")) {
type = 4;
} else if (t.endsWith("application/x-latex") ||
t.endsWith("application/x-tex")) {
type = 5;
} else if (t.endsWith("application/x-bibtex")) {
type = 6;
} else if (t.endsWith("application/x-dvi")) {
type = 7;
} else if (t.endsWith("text/rtf") ||
t.endsWith("application/rtf") ||
t.endsWith("text/richtext")) {
type = 8;
} else if (t.endsWith("text/tab-separated-values") ||
t.endsWith("text/plain")) {
type = 9;
} else if (t.endsWith("application/excel") ||
t.endsWith("application/vnd.ms-excel") ||
t.endsWith("application/x-excel")) {
type = 10;
} else if (t.endsWith("application/x-shockwave-flash")) {
type = 11;
}
String s = null;
switch (type) {
case 1:
PDF2HTML pdf2html = new PDF2HTML();
s = pdf2html.convertPDFToHTML(src);
break;
case 2:
PS2HTML ps2html = new PS2HTML();
s = ps2html.convertPSToHTML(src);
break;
case 3:
DOC2HTML doc2html = new DOC2HTML();
s = doc2html.convertDOCToHTML(src);
break;
case 4:
PPT2HTML ppt2html = new PPT2HTML();
s = ppt2html.convertPPTToHTML(src);
break;
case 5:
TEX2HTML tex2html = new TEX2HTML();
s = tex2html.convertTEXToHTML(src);
break;
case 6:
BIB2HTML bib2html = new BIB2HTML();
s = bib2html.convertBIBToHTML(src);
break;
case 7:
//DVI2HTML dvi2html = new DVI2HTML();
DVI2HTML dvi2html = null;
s = dvi2html.convertDVIToHTML(src);
break;
case 8:
RTF2HTML rtf2html = new RTF2HTML();
s = rtf2html.convertRTFToHTML(src);
break;
case 9:
TXT2HTML txt2html = new TXT2HTML();
s = txt2html.convertTXTToHTML(src);
break;
case 10:
XLS2HTML xls2html = new XLS2HTML();
s = xls2html.convertXLSToHTML(src);
break;
case 11:
SWF2HTML swf2html = new SWF2HTML();
s = swf2html.convertSWFToHTML(src);
break;
default:
}
if (s == null) {
aux.initTokenizer(src);
} else {
aux.initTokenizer(
new ByteArrayInputStream(s.getBytes()));
}
return aux;
}
/**
*
* @param src 소스 문서의 InputStream
* @param aux 초기화 파서
*/
public static HTMLParser initParser(String src,
HTMLParser aux) throws Exception {
int type = 0;
if (src.endsWith(".pdf")) {
type = 1;
} else if (src.endsWith(".ps")) {
type = 2;
} else if (src.endsWith(".doc")) {
type = 3;
} else if (src.endsWith(".ppt")
|| src.endsWith(".pps")) {
type = 4;
} else if (src.endsWith(".tex")) {
type = 5;
} else if (src.endsWith(".bib")) {
type = 6;
} else if (src.endsWith(".dvi")) {
type = 7;
} else if (src.endsWith(".rtf")) {
type = 8;
} else if (src.endsWith(".txt")) {
type = 9;
} else if (src.endsWith(".xls")) {
type = 10;
} else if (src.endsWith(".swf")) {
type = 11;
}
if (src.startsWith("file:")) {
String s = null;
switch (type) {
case 1:
PDF2HTML pdf2html = new PDF2HTML();
s = pdf2html.convertPDFToHTML(
new File(src.substring(5)));
break;
case 2:
PS2HTML ps2html = new PS2HTML();
s = ps2html.convertPSToHTML(
new File(src.substring(5)));
break;
case 3:
DOC2HTML doc2html = new DOC2HTML();
s = doc2html.convertDOCToHTML(
new File(src.substring(5)));
break;
case 4:
PPT2HTML ppt2html = new PPT2HTML();
s = ppt2html.convertPPTToHTML(
new File(src.substring(5)));
break;
case 5:
TEX2HTML tex2html = new TEX2HTML();
s = tex2html.convertTEXToHTML(
new File(src.substring(5)));
break;
case 6:
BIB2HTML bib2html = new BIB2HTML();
s = bib2html.convertBIBToHTML(
new File(src.substring(5)));
break;
case 7:
// DVI2HTML dvi2html = new DVI2HTML();
DVI2HTML dvi2html = null;
s = dvi2html.convertDVIToHTML(
new File(src.substring(5)));
break;
case 8:
RTF2HTML rtf2html = new RTF2HTML();
s = rtf2html.convertRTFToHTML(
new File(src.substring(5)));
break;
case 9:
TXT2HTML txt2html = new TXT2HTML();
s = txt2html.convertTXTToHTML(
new File(src.substring(5)));
break;
case 10:
XLS2HTML xls2html = new XLS2HTML();
s = xls2html.convertXLSToHTML(
new File(src.substring(5)));
break;
case 11:
SWF2HTML swf2html = new SWF2HTML();
s = swf2html.convertSWFToHTML(
new File(src.substring(5)));
break;
default:
}
if (s == null) {
aux.initTokenizer(
new File(src.substring(5)));
} else {
aux.initTokenizer(
new ByteArrayInputStream(s.getBytes()));
}
} else {
String s = null;
switch (type) {
case 1:
PDF2HTML pdf2html = new PDF2HTML();
s = pdf2html.convertPDFToHTML(
new URL(src));
break;
case 2:
PS2HTML ps2html = new PS2HTML();
s = ps2html.convertPSToHTML(
new URL(src));
break;
case 3:
DOC2HTML doc2html = new DOC2HTML();
s = doc2html.convertDOCToHTML(
new URL(src));
break;
case 4:
PPT2HTML ppt2html = new PPT2HTML();
s = ppt2html.convertPPTToHTML(
new URL(src));
break;
case 5:
TEX2HTML tex2html = new TEX2HTML();
s = tex2html.convertTEXToHTML(
new URL(src));
break;
case 6:
BIB2HTML bib2html = new BIB2HTML();
s = bib2html.convertBIBToHTML(
new URL(src));
break;
case 7:
DVI2HTML dvi2html = new DVI2HTML();
s = dvi2html.convertDVIToHTML(
new URL(src));
break;
case 8:
RTF2HTML rtf2html = new RTF2HTML();
s = rtf2html.convertRTFToHTML(
new URL(src));
break;
case 9:
TXT2HTML txt2html = new TXT2HTML();
s = txt2html.convertTXTToHTML(
new URL(src));
break;
case 10:
XLS2HTML xls2html = new XLS2HTML();
s = xls2html.convertXLSToHTML(
new URL(src));
break;
case 11:
SWF2HTML swf2html = new SWF2HTML();
s = swf2html.convertSWFToHTML(
new URL(src));
break;
default:
}
if (s == null) {
aux.initTokenizer(new URL(src));
} else {
aux.initTokenizer(
new ByteArrayInputStream(s.getBytes()));
}
}
return aux;
}
public static void main(String args[]) throws Exception
{
String src;
HTMLParser hp;
src = "http://mimul.com/pebble/default/";
hp = new HTMLParser("/k2/src/rdf/language-profiles");
initParser(src, hp);
hp.processData();
System.out.println(getRDFData(hp));
}
}
<?xml version='1.0' ?>
<r:RDF xmlns:r='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:d='http://purl.org/dc/elements/1.1/'
xmlns:s='http://www.w3.org/2000/01/rdf-schema#'
xmlns:h='http://www.w3.org/1999/xx/http#'
xmlns:t='http://purl.org/dc/terms/'>
<r:Description r:about="Mimul's Developer World">
<d:Title>Mimul's Developer World</d:Title>
<t:abstract>
<r:Alt>
<r:li r:ID='DocumentAbstract'></r:li>
<r:li r:ID='DocumentKeywords'>
ajax,apple,attention,blog,business,eclipse,enterprise2.0
,feedburner,google,iphone,javascript,kms,lean
,marketing,mindset,openid,oracle,pebble,pojo
,semantic,sns,spring,subversion,tomcat,wiki,youtube
</r:li>
</r:Alt>
</t:abstract>
<d:Language>korean</d:Language>
<d:Type>text/html</d:Type>
<d:Relation>
<r:Alt>
</r:Alt>
</d:Relation>
</r:Description>
</r:RDF>
Yahoo의 새로운 성능 best practices 발표
주요 내용은 아래와 같습니다.
1. Flush the buffer early
2. Use GET for AJAX requests
3. Post-load components
4. Preload components
5. Reduce the number of DOM elements
6. Split components across domains
7. Minimize the number of iframes
8. No 404s
9. Reduce cookie size
10. Use cookie-free domains for components
11. Minimize DOM access
12. Develop smart event handlers
13. Choose <link> over @import
14. Avoid filters
15. Optimize images
16. Optimize CSS sprites
17. Don’t scale images in HTML
18. Make favicon.ico small and cacheable
19. Keep components under 25K
Argos : 심플한 Java 검색 엔진 연동 API
1. 요구 사항
- JDK1.5이상
2. 특징
- 쉽게 사용할 수 있는 API로 되어 있음
- 확장이 쉽도록 class가 설계되어 있음
- 페이지 단위로 접근하기 때문에 네트워크나 메모리 자원의 사용을 줄일 수 있게 되어 있음
- 지원 엔진 : Blogdigger, Del.icio.us, Feedster, Google, Google Desktop Search, MSN Search, Technorati, Yahoo
- 오픈 소스임
3. 사용 샘플
SimultaneousSearcher searcher = null;잘 활용하여 응용해보세요. ^^
List<Searcher> searcherList = null;
try {
searcherList = new LinkedList<Searcher>();
searcherList.add(new MSNWebSearcher());
searcherList.add(new BlogdiggerWebSearcher());
searcher = new SimultaneousSearcher(searcherList);
Iterator<SearchResult> it = searcher.search("Web 2.0");
while (it.hasNext()) {
SearchResult result = it.next();
System.out.println(result.getTitle() + " Address: " + result.getAddress());
}
} catch (Exception e) {
System.out.println(e);
}
Oracle 10g로 업그레이드 시 고려사항
1. DB Object 구조 파악
- User, Segment type, size , object_type, privilege , column type
2. 사이징
- 마이 그레이션 데이터 사이징, OS 파일 사이즈 제한 있는지
3. 하드웨어 사양
- Distribute Database Option의 Operation이 가능한지, 네트워크 스피드는 충분히 보장되는지, DownTime을 얼마로 예상되는지
4. 기타
- 스토리지 운영 정책, 어플리케이션(배치 포함), 데이터 마이그레이션 정합성 체크, 방법들, 쿼리 튜닝 지침
- DB 장비 간의 연동 인터페이스 파악(DBLInk, JDBC, SQL*NET), 성능 테스트는 어떻게?
- DB장비 환경 설정(커널-Process, Open Files개수, 어라클 설정)
- 파티셔닝 고려, 통계 정보 운영 방법
[쿼리 튜닝 포인트]
1. group by절에 의한 Grouping Column순으로 Sorting 안되는 문제
- 기존에는 Sort알고리즘으로 Sort하였으나 10g R2부터는 Hash-based 방식으로 진행되어서 그런 현상 발생함
- 해결책 : init.ora "_gby_hash_aggregation_enabled"=FALSE (New 방식 사용 안함)
2. RULE 힌트 처리된 SQL의 문제
- 10g New Version에서는 기존버전에서/*+ RULE */ 로 힌트처리된 구문이 의도대로 처리되지 않고, CBO의플랜으로 풀릴 수 있음.
- 해결책 : 튜닝을 통해 최적화 필요함(주로 Cadinalty가 큰 인덱스일 경우 인덱스 힌트를 명시할 필요가 있음 - 통계 정보가 인덱스를 안타게 할 가능성이 많음)
3. Connect By 절의 실행 문제
- 10g New Version에서는 기존 버전(9i 이전버전) 에서 사용하는 connect by 절이 제대로 실행되지 않을 수 있음.
- 해결책 아래 참조
SQL> SELECT LPAD (' ', LEVEL * 2,'*'), E.EMPNO, E.MGR, E.DEPTNO, E.JOB, LEVEL,
SUM (E.SAL) OVER (PARTITION BY E.DEPTNO) SAL_OVER_DEPT
FROM EMP E
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR
ORDER SIBLINGS BY EMPNO
ORDER SIBLINGS BY EMPNO;
*
ERROR at line 11:
ORA-30929: ORDER SIBLINGS BY clause not allowed here
SQL> SELECT LPAD (' ', LV * 2,'*'), EMPNO, MGR, DEPTNO, JOB, LV, SUM ( SAL )
OVER ( PARTITION BY DEPTNO ) SAL_OVER_DEPT
FROM (
SELECT ROWNUM RN, LEVEL LV, E.* FROM EMP E
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR
ORDER SIBLINGS BY EMPNO
) ORDER BY RN
4. Toad Old version과의 문제
- Oracle 10g 로 업그레이드 후 Objects 가 이유없이 disable 되는 Toad 버전 문제
- 해결책 : Toad 버전을8.6.1
BCI에 대해서
자, 그럼 BCI를 활용하는 것들에는 무엇이 있는지 살펴볼까요?
첫째, Java 프로파일러나 모니터링 툴들이 대부분 BCI기능을 활용하고 있으며, BCI를 통해 모니터링 대상이 되는 어플리케이션의 수정을 가하지 않고 성능 측정에 필요한 요소들을 삽입할 수 있습니다.
제품으로는 Jennifer, Performizer, Lambda Probe for Apache Tomcat, JXInsight, infraRED가 있습니다.
둘째, AOP(Aspected Oriented Programming)를 구현하는 핵심 기술이 바로 BCI입니다. AOP 컴포넌트들이 컴파일 시간이나 로딩 시간, 런타임 시간에 Aspect와 Business Logic을 Weaving할 수 있는 이유가 바로 BCI, 즉 Java 바이트 코드를 직접 수정할 수있는 기술을 사용하기 때문입니다.
많은 오픈 소스 커뮤니티들이 Bytecode 조작을 가능하게 하는 라이브러리들을 제공하고 있습니다.
BCI를 지원하는 라이브러리들
- ASM : Object Web에서 제공, Eclipse사용자라면 Eclipse Plugin - AMS Bytecode Outline Plugin을 활용 가능
- BCEL : Apache 프로젝트에서 제공
- SERP : SF에서 제공
- Javassist : JBoss 프로젝트에서 제공
2008-03-12 일상
요즘 감기에 고생하고 있어서인지, 내 인생에서 중요하게 생각하는 가치가 뭐일까? 곰곰히 생각해 보았습니다. 아무리 생각해봐도 건강에 최고인 것 같습니다. 건강 건강 ^^
그 다음으로 가족이죠. 우리들의 영원한 마음의 안식처..
이런 우선순위를 생각하다고 인터넷에서기사 하나를 발견했네요.
우리나라 중산층은 인생에서 가장 중요한 가치 1위로 건강을 꼽았다고 합니다. 2위는 가족, 3위는 돈, 4위는 친구, 5위는 종교, 6위는 일, 7위는 여가 순이었습니다.
직장인인 나로서는 곰곰히 생각해 볼 필요가 있네요. 돈보다, 일보다 가족을 우선 중요하다는 것을 바로 볼 수 있습니다. 그렇지만 한국인은 가족을 일보다 등한시하는 경우가 대부분의 사람들일 것입니다.
우린(저만인가요?) 인생을 잘 못 사는 것 같습니다. 2-3일 휴가도 눈치보고 못내는 직장인들이여 떠나라 과감히...어디로? 당신이 원하는 곳으로...
어디 20여일 동안 일과 상관없이 어디론가 떠나서 내가 하고싶은 것들만 하면서 가족들과 단란하게 보내고 싶은 하루네요.
여러분 이번 감기는 장난아닙니다. 조심 하세요 ^^.
"-aaS" 약어 정의
1. AaaS - Architecture as a Service
- virtualization technology같은 기술들을 제공하는 서비스입니다.
2. BaaS - Business as a Service
- 비즈니스(경영, 마케팅, 제조, 인사, 프로세스, 재무) 전반에 걸친 기능들을 서비스로 제공합니다.
3. PaaS - Platform as a Service
- 개발, 테스트, 배포, 호스팅 플랫폼과 서비스를 제공합니다. 확장성, 안전성, 보안성, 사용자 경험, 데이터 베이스, 공동 프로젝트 진행 등의 다양한 플래폼 환경을 제공합니다. 예) Salesforce.com
4. DaaS - Data as a Service
- 전체 수명 주기에 걸쳐 고객 데이터를 관리할 수 있는 포괄적인 기능을 제공합니다. 이기종 시스템과 비즈니스 라인의 정보를 리파지토리에 통합하고, 데이터를 중앙에서 정제 및 개선하여 이를 어플레케이션을 통해 고객에게 서비스로서 데이터 관리 기능을 제공합니다.
5. SaaS - Software as a Service
- 서버의 컴퓨터상에 소프트웨어를 설치해 두고 사용자는 웹 브라우져를 통해 사용한 만큼 비용을 지불하고 소프트웨어를 서비스로 이용하는 방식입니다. 예) 구글의 메일/메신저/일정관리/온라인 워드/스프레드시트, MS Exchange/SharePoint/Project 등이 해당될 것입니다.
6. FaaS - Framework as a Service
- 서비스 개발에 필요한 프레임워크들을 사용법, 실체 등을 제공하여 서비스 구성에 도움을 줍니다.
7. HaaS - Hardware as a Service
-컴퓨팅 파워(EC2), 저장 장치(S3), 데이터 베이스(Simple DB) 등에서 볼 수 있듯이 신생 업체들이 온디멘드 컴퓨팅 서비스를 런칭할 수 있도록 제공하는하는 것입니다. Amazon Simple DB라는 서비스를 오픈하면서 Amazon도 이영역에 들어갔죠.
8. IaaS - Infrastructure as a Service
- 서버, 소프트웨어, 데이터 공간들을 온 디맨드 방식으로 어플리케이션을 구동하여 서비스를 제공합니다.
9. IDaaS - Identity as a Service
- Identity 관련 서비스 제공
10. MaaS - Mashups as a Service
- SOA나 OpenAPI를 쉽게 해줄 수 있는 서비스 제공
위를 살펴보니 이젠 불필요한 자원(유지보수, 인력 운영, 인프라 공유)을 낭비하지 않고 원하는 서비스들을 안정적으로 제공받을 수 있고 확장성, 유연한 사용자 인터페이스, 보안, 오프라인 접속 기능 제공 등이 고려되어 좋은 온디멘드 서비스로 활용될 수 있는 마켓 포션이 늘어날 것으로 보입니다.
2008-03-08 일상
서브 모기지론으로 시들어가는 미국 경제와 이에 동조하는 우리나라 증시, 스태그 동조화, 원자재(자원)의 가격 인상 등 악재가 많다고 합니다.
이런 악재에는 주식을 팔고 현금 확보가 우선인 듯 보이는데 수수료를 벌기 위해 증권사들은 고객들에게 추천주들을 읊어 주는군요.
삼성전기, 삼성물산, 한화, 삼성SDI, 대한화재, 현대건설, 한진 중공업, STX팬오션, 대한전선 등 9종목을 알려줬습니다. 여러분 건투를 빕니다. ^^
그 다음으로 종로5가 광장 시장을 갔습니다. 사람사는 느낌을 받아볼려고 갔었습니다. 역시나 복잡한 것이 사람 사는 냄새가 납니다. 평균 연령대가 50대는 넘어 보이네요.
저희는 2층 수입 구제옷들이 있는 곳을 방문했죠. 역사나 입다만 옷들이 빼곡이 가게를 채우고 조는 주인, 물건 판매에 열을 올리는 주인, 화투치는 주인들에 여기저거 마음에 드는 옷을 골라보는 젊은이들로 발 디딜틈이 안보이는 군요.
순간 여기가 화재가 나면 어떻게 될까? 하는 불안한 마음도 스치고 가는군요 ^^
그리곤 명동 갔다가 시청역 지하도에 줄서서 와플 하나 먹으면서 집에 왔습니다. 오랫만에 외출이었는지 몸이 무척이나 피곤하네요. 오늘은 일찍 자려나..했는데 역시나 컴퓨터 앞에서 블로그질이네요.
틈이 좀 나서 EBS 지식 E채널 VOD를 다운 받아서 mp4로 변환하는 중입니다. ^^ 시간날때 볼라구요.
구글맵 API 활용 방법
1. 구글 맵 API를 활용 방법
1.1 맵키를 받자
- http://code.google.com/apis/maps/signup.html
1.2 API 레퍼런스를 참조하여 페이지 구성
- Listener 함수는 ''openInfoWindowHtml''메서드를 이용해서 정보창을 출력하게 됨
- setMapType(G_SATELLITE_TYPE) : 위성모드
- setMapType(G_HYBRID_TYPE) : 합성모드
- openInfoWindowHtml() : 이용하면 원하는 지역에 메세지 출력 가능
- addOverlay() : 맵에 클릭을 할 경우 이벤트를 받아서 마킹함
2. 좌표 찾는 방법
- 가장 궁금한 부분일 것입니다.이벤트 리스너를 활용하여 여기에 만들어 놓았으니 위치 좌표를 활용하여 자신만의 맵 사이트를 꾸밀 수 있습니다. ^^
- 샘플(http://mimul.com/examples/Where.html)
3. 샘플 예제 사이트
- 샘플(http://mimul.com/examples/GoogleMap.htm)
Sharpcast 서비스 소개

캘리포니아주의 팔로 알토(Palo Alto)를 본거지로 하고 있는 Sharpcast(창업자이자 최고기술책임자(CTO)인 벤 스트롱(Ben Strong))가 설립한 회사입니다.
주 타겟은 카메라 내장 휴대폰으로 사진을 찍게 되면, 자동적으로 웹에 표시할 수 있도록 설계되어 사용자의 사진을 자동으로 동기화해 줄 수 있는 기술을 적용했습니다. 한번 회원가입한다음 어플리케이션을 다운받아서 사용해보세요.
- Google PicasaWeb와 유사한 그림 저장 서비스
- 5GB의 고용량 공간을 제공
- 사진, 파일, 주소록 관리
- 앨범 기능도 제공
이미지를 다른 앨범으로 카피도 가능하고 물론 파일은 하나고 여러 앨범에서 보여준다.
예전에는 피씨하나에서 모든 그림이나 멀티미디어 자료들을 관리했었는데 이젠 유입 수단들이 많아져서인지 모바일, PDA, 피씨, TV등의 디바이스에서 생산된 데이터들을 온라인 스토리지에 저장하여 관리하도록 되어 있는게 특징인거 같습니다.
이것 또한, Online Information Storage의 하나인 듯 보입니다.
아키텍처를 보더라도 다양한 디바이스에서 생산된 자원들(사진, 비디오, 음악, 문서, 주소록, 플리커나 ThirdParty에서 생산되어 있는 멀티미디어 데이터를 API, SDK를 통해 온라인 스토리지인 SharpCast에 저장하는 구조로 되어 있는거 같습니다.









