www.bing.com

MS에서 새롭게 공개한 '빙' 이라는 검색 엔진이다
현재는 Beta 버젼으로 검색을 해본결과, 사용자가 검색한 조건에 맞는 웹페이지 또는 사이트, 국내사이트(한국 또는 국가 설정으로 자신의 국가에 등록된 사이트)를 검색 할 수 있다

메타 검색 을 포함해, 검색단어에 맞는 사용자가 원하는 답을 주기위해 Instant Answer 라는 MS에 목표에 맞게 검색단에에 관련된 검색을 표시해 주고 있지만. 구글에서 사용할수 있는 파일타입 검색 방법은 지원이 되지 않고있다.

또한 첫페이지 및 UI는 심플하다, 하지만 나라별로 대표해주는 사진을 제공해주었다면 좀더 호감형이 되지 않았나... 생각한다 (물론 호감/비호감은 개인적이다)



기존 MS를 대표해주던 LIVE SEARCH(라이브서치) 역시 Bing 으로 통합 되었다.

Bing의 검색 기능중에 XRank 라는 기능이 있다
가장 많이 검색된 인물과 항목을 볼 수 있다, 이는 사용자에 의해 검색이된 횟수를 카운터해 검색의 답을 준다.
국내의 네이버와 다음을 벤치마킹 했는지는 알수 없지만, 검색 순위의 변동까지 표시한다.

국내 '빙' 과 달리 미국판 '빙'은 조금더 낳은 기능을 제공한다. 



쇼핑과, 비디오, 맵 그리고 여행에 대한 정보를 제공한다.
특히 여행에 관한 정보는 아주 상세한 검색이 제공되며..
이는 마치 검색엔진(검색사이트) 라기보다는 광고와, 주요기사가 없는 
포털 사이트에 가까운 느낌이다, 또한 MS의 기술인 Silveright(실버라이트)를 이용하여
이미지를 제공 한다는게 좀더 MS답고 독특한 느낌이다
심플한 네이버! 심플한 다음! .. igoogle 에비해서 심플함에서는 는 조금 앞서는 느낌이다

정식오픈까지 국내 '빙' 에도 많은 카테고리와, 상세검색을 위한 기능등이 추가된다면 좋은 느낌의 검색 엔진이 될꺼같다. 

아래는 Twelo.com을 검색해본 결과이다. 마치 알타비스타 처럼 표시된다
twel.com의 링클 걸고있는 pmguda.com 까지 검색된다(뭐 당연한건가..)


여튼 새로운 검색엔진, 검색사이트 등이 개발되고 경쟁되고있다.
국내에서는 네이버라는 지식in 서비스를 제공해주는 포털사이트가 부동의 1위를 지킬터지만
IT에 관심이 많은 입장에서 아주 재밌는 게임이 될꺼같다 

구글은 MS를 견제하기 위해 '크롬'을 내놓았고
MS는 구글을 견제하기 위해 '빙'을 내놓았다

저작자 표시 비영리
Posted by 티엘로
 

 

Drag & Drop의 구현

스윙에서의 Drag & Drop 을 구현해 보자. 과정이 꽤 복잡하고 기능상에 약간의 제약은 있으나 한번 구현해 볼 만한 예제라고 생각을 한다. 소스코드는 자바소프트에서 발췌했음을 알아두길 바란다. 중간중간에 풍선도움말을 두겠으니 단풍잎에 마우스를 갖다대면 도움말이 뜨니 참고하길 바란다.

Drag & Drop step
Drag & Drop 을 구현하는 것은 비교적 쉽다. 그렇지만 가장 난해한 것은 모든 과정에 대해서 이해하는 것이다. 다음의 순서를 먼저 익혀두길 바란다.     [ DnD Source Download]

1. Drag source 에 대한 참조를 가진다. - DragSource.getDefaultSource() 나 new DragSource() 를 통해서.
2. Drag gesture recognizer 를 생성한다. - DragSource.createDafaultGestureRecognizer()
3. Drop target 를 생성한다. - 하나의 컴포넌트와 Drop target listener 를 명세한다.
4. Transferable 로 옮겨질 수 있는 데이타를 wrap 한다.
5. Drag 를 초기화한다. - DragSource.startDrag()
6. DropTargetLisenter, DragSource 인터페이스를 구현함으로써 Drop 를 핸들링한다.

Drag & Drop (이하 D&D) 는 하나의 datasource 와 여러개의 droptarget 에 - 흔히 콤포넌트와 연관되어져 있다 - 와 연관되어 이뤄진다. 다음에 나열된 클래스와 인터페이스는 D&D 에서 사용되는 것을 정리한 것이다. 대부분의 것들은 java.awt.dnd 패키지에 있고, 오직 하나 Transferable 은 java.awt.datatransfer 패키지에 있다.

DragGestureRecognizer : 컴포넌트에서 drag 를 수행할려고 할때 이벤트를 발사한다.
DragSource : Drag 와 DragGestureRecognizer 를 초기화한다.
DropTarget : 연관된 컴포넌트 상에서 Drop 이 일어난다.
Transferable ; D&D 를 통해서 전송되어지는 데이타를 위한 Wrapper 이다.
DragGestureListener : DragGestureRecognizer 에 의해 통보를 받고 drag 를 초기화한다.
DragSourceListener : DragSource 이벤트에 반응한다.
DropTargetListener : Drop 포함한 target 이벤트를 핸들링한다.

D&D 는 하나의 기미(Gesture) 즉, 마우스를 내려서 드래깅을 시도할때 초기화된다. 그러면 DragGestureRecognizer 는 이런 기미를 포착하고 이벤트를 발생하는 것이다.
DragSource 는 startDrag() 메소드로 초기화작업을 수행하고, createDragGestureRecognizer() 나 createDafaultDragGestureRecognizer() 를 이용하여 DragGestureRecognizer 를 생성하게 되는 것이다.
DropTarget 은 하나의 컴포넌트와 Listener 객체와 연관되어 있어서 drop target event 가 발생할때 listener 객체가 통보를 받게 된다.
DragGestureListener 는 recognizer 에 의해 drag gesture 를 통보받는데 전형적인 반응예는 DragSource.startDrag() 메소들르 호출하게 되었을 경우이다.
DragSourceListener 는 drag 가 초기화된 후 dragsource 에서 일어나게 된다.

다소 나열적인 설명이었지만 어느 정도 감을 잡기 위해서 중복 설명했다. D&D 하는 과정과 메소드호출, 클래스와 인터페이스의 API 를 꼼꼼하게 살펴보면 이해할 수 있으리라 생각한다. 가장 기본적인 D&D 를 하기 위해서는 반드시 DragSource, DropTarget, DragGestureRecognizer, Transferable 이 반드시 생성이 되어야 하고, Listener 가 구현되어야 한다는 것을 명심하길 바란다. 그러나 실제 구현은 몇가지 객체를 생성하고 데이타를 Wrapping 하고 핸들링하는 것을 빼면 나머지 동작은 프로그래머 재량에 상관없이 자체적으로 구현이 된다.
Adding D&D to Swing Component
여기서도 두가지 방법이 있을 수가 있는데 한가지 방법으로는 Swing Component 를 상속해 객체를 만들어 그것을 DragSource, DropTarget 으로 만들어 사용하는 방법과 제 3의 콤포넌트를 생성해 두가지를 수행하는 방법이 있다.
첫번째 방법으로 수행을 하면 반드시 객체만이 D&D 특성을 가질수가 있고, 표준 Component 는 그런 특성을 공유할 수 없음을 명심하길 바란다. 가령 JList 를 상속한 ListDragSource 객체를 만들어서 D&D 를 추가해 사용한다면 ListDragSource 만이 그런 동작을 할 수 있다는 것을 의미한다.

아래에 있는 그림은 이 프로그램을 실행시켰을때 볼 수 있는 화면이다. 왼쪽은 DragSource 로 JTree 를 이용해 구현했고, 오른쪽은 DropTarget 은 JTextPane 을 이용해 구현했음을 보길 바란다. 이것은 .txt 와 .java 로만 한정되어 있기 때문에 다른 확장자를 가진 파일을 D&D 했을 경우에는 에러창을 발견하게 될 것이다. 그리고 .txt 와 .java 파일은 그 내용을 JTextPane 에서 볼 수 있을 것이다.


오른쪽의 파일을 D&D 수행할 수가 있다


확장자가 .txt 와 .java 가 아닐 경우에 볼 수 있는 경고창이다.


위의 프로그램은 얼마든지 응용해서 확장할 수 있다고 생각한다. 다른 파일도 볼 수 있게끔 할 수 있고, image 도 가능하리라 생각한다.
다음 장에서는 소스코드 분석에 들어가도록 하겠다. 먼저 해당 API 를 꼼꼼히 살펴본 다음에 코드분석에 임하길 바란다.


 
  

이번 장에서는 소스분석과 함께 설명을 하겠다. 단풍잎 부분에 API 에 대한 설명을 첨가하겠다.

Source Analysis
DragTree.java 소스이다. 이전 장에서 본 JTree 부분의 DragSource 를 정의한 부분이다.
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.io.*;

class DragTree extends JTree implements DragGestureListener, DragSourceListener {

     public DragTree() {
       DragSource dragSource = DragSource.getDefaultDragSource();
         // static 메소드인 위 메소드로 DragSource 에 대한 참조를 얻는다.
            그리고, 위 참조객체를 이용해 DragGestureRecognizer 를 생성하게 되는 것이다.
  
       dragSource.createDefaultDragGestureRecognizer(
	 this, // component where drag originates
	 DnDConstants.ACTION_COPY_OR_MOVE, // actions
	 this); // drag gesture recognizer  
  public DragGestureRecognizer createDefaultDragGestureRecognizer(
                      Component c, int actions, DragGestureListener dgl)

       c - The Component target for the recognizer
       actions - The permitted source actions
       dgl - The DragGestureListener to notify
setModel(createTreeModel()); // Tree 에 관한 코딩부분으로 innerclass 로 구현돼 있다. addTreeExpansionListener(new TreeExpansionListener(){ public void treeCollapsed(TreeExpansionEvent e) {} public void treeExpanded(TreeExpansionEvent e) { TreePath path = e.getPath(); if(path != null) { FileNode node = (FileNode) path.getLastPathComponent(); if( ! node.isExplored()) { DefaultTreeModel model = (DefaultTreeModel)getModel(); node.explore(); model.nodeStructureChanged(node); } } } }); } DragGestureListener 인터페이스에서 구현해야 하는 메소드이다. public void dragGestureRecognized(DragGestureEvent e) { String s = getFilename(); // 확장자를 .txt 와 .TXT, .java 로 한정지은 부분이다. 다른 파일까지 읽고 싶으면 이 부분을 수정하면 된다. if(s.endsWith(".txt") || s.endsWith(".TXT") || s.endsWith(".java")) { e.startDrag(DragSource.DefaultCopyDrop, // cursor new StringSelection(s), // transferable
           public void startDrag(Cursor dragCursor,
                      Transferable transferable,
                      DragSourceListener dsl)  throws InvalidDnDOperationException
           여기서는 Transferable 로 StringSelection 클래스가 사용되었다.
           이 클래스는 간단한 java String 을 text 포맷으로 수송하는데 필요한 기능을 
           구현하는 클래스이다.
// startDrag() 메소드로 Tree 는 drag 를 초기화하고, draggesture 에 반응하게 된다. } else { // invokeLater 호출에 대해서 생각해 봐야 한다. 이 메소드는 application thread 가 GUI 를 갱신해야 될 필요가 있을때 사용되어지며 당면해 있는 AWT 이벤트가 수행된 이후에 수행되게 한다. 이 메소드의 사용으로 경고창이 뜨는 시간을 조절할 수가 있게 한다. SwingUtilities.invokeLater(new Runnable() { public void run() { JOptionPane.showMessageDialog( SwingUtilities.getRootPane(DragTree.this), "Only \".txt\" and \".java\" files " + "can be dragged", "Not Draggable", JOptionPane.ERROR_MESSAGE); } }); } } // 이 부분은 DragSourceListener 메소드 구현부분이다. public void dragDropEnd(DragSourceDropEvent e) {} public void dragEnter(DragSourceDragEvent e) {} public void dragExit(DragSourceEvent e) {} public void dragOver(DragSourceDragEvent e) {} public void dropActionChanged(DragSourceDragEvent e) {} public String getFilename() { TreePath path = getLeadSelectionPath(); FileNode node = (FileNode)path.getLastPathComponent(); return ((File)node.getUserObject()).getAbsolutePath(); } private DefaultTreeModel createTreeModel() { File root = new File("C:" + File.separator); FileNode rootNode = new FileNode(root); rootNode.explore(); return new DefaultTreeModel(rootNode); } } // 이 부분은 왼쪽 창의 JTree 인터페이스 설정부분으로 자세한 설명은 안하겠다. class FileNode extends DefaultMutableTreeNode { private boolean explored = false; public FileNode(File file) { setUserObject(file); } public boolean getAllowsChildren() { return isDirectory(); } public boolean isLeaf() { return !isDirectory(); } public File getFile() { return (File)getUserObject(); } public boolean isExplored() { return explored; } public boolean isDirectory() { File file = getFile(); return file.isDirectory(); } public String toString() { File file = (File)getUserObject(); String filename = file.toString(); int index = filename.lastIndexOf(File.separator); return (index != -1 && index != filename.length()-1) ? filename.substring(index+1) : filename; } public void explore() { if(!isDirectory()) return; if(!isExplored()) { File file = getFile(); File[] children = file.listFiles(); for(int i=0; i < children.length; ++i) add(new FileNode(children[i])); explored = true; } } }
이상으로 DragTree.java 소스를 살펴보았다. 설명이 조금 부족한 감이 있으니 자기나름대로 살펴보길 바란다. 다음에는 이 프로그램의 메인코드인 Test.java 에 대해서 살펴보겠다.


 
  
Source Analysis
Test.java 소스이다. main() 와 기본 인터페이스가 설정돼 있다. 아래의 코드를 살펴보면 알겠지만 Test 생성자는 drop target 을 생성해낸다. 즉 TextPane 을 drop target component 로 생성하는 것이다.
실제 drop 이 일어났을때 Test.drop() 메소드가 호출이 된다. drop 과 연관된 transferable 은 String 으로써 데이타를 제공해주며 drop 을 받아들인 후에 readFile() 메소드가 호출이 돼 file 의 내용을 TextPane 으로 로딩을 하게 된다. Drop 이 완료된 후 e.dropComplete(true) 가 호출이 돼 실제 drop 이 완료되게 된다.
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;

public class Test extends JFrame implements DropTargetListener {
	private JTextPane textPane = new JTextPane();

	public Test() {
                   super("Drag and Drop With Swing");
                   new DropTarget(textPane,DnDConstants.ACTION_COPY_OR_MOVE,this);
	   JSplitPane splitPane =
                      new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,createTreePanel(),createTextPanel());
	   splitPane.setDividerLocation(250);	
	   splitPane.setOneTouchExpandable(true);
	   getContentPane().add(splitPane, BorderLayout.CENTER);
	}
	public static void main(String args[]) {
	  Test test = new Test();
	  test.setBounds(300,300,850,350);
	  test.setVisible(true);
	  test.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	  test.addWindowListener(new WindowAdapter() {
	  public void windowClosed(WindowEvent e) {
                        System.exit(0);
	    }
	  });
	}
	private JPanel createTreePanel() {
	  JPanel treePanel = new JPanel();
	  DragTree tree = new DragTree();
	  treePanel.setLayout(new BorderLayout());
	  treePanel.add(new JScrollPane(tree), BorderLayout.CENTER); 
	  treePanel.setBorder(BorderFactory.createTitledBorder(
		"Drag source for filenames"));
        	return treePanel;
	}
	private JPanel createTextPanel() {
	  JPanel textPanel = new JPanel();
	  textPanel.setLayout(new BorderLayout());
	  textPanel.add(new JScrollPane(textPane),BorderLayout.CENTER);
	  textPanel.setMinimumSize(new Dimension(375,0));
	  textPanel.setBorder(BorderFactory.createTitledBorder(
	    "Drop target for filenames"));

	  return textPanel;
	}
	private void readFile(final String filename) {
	  EditorKit kit = textPane.getEditorKit();
	  Document document = textPane.getDocument();

          try {
	    document.remove(0,document.getLength());
	    kit.read(new FileReader(filename), document, 0); 
	  }
	  catch(Exception ex) {
	    ex.printStackTrace();
	  }
	}
        
	public void drop(DropTargetDropEvent e) {
	  try {
	   DataFlavor stringFlavor = DataFlavor.stringFlavor;
	   Transferable tr = e.getTransferable();
 public class DataFlavor extends Object implements Externalizable, Cloneable
 
 이 클래스는 D&D 수행할 때 클립보드에 들어가는 데이타의 형태를 제공해주는 클래스이다.
 여기서 사용된 StringFlavor 는 java Unicode String class 을 나타낸다.
 MimeType = "application/x-java-serialized-object" 을 나타내게 된다.
if(e.isDataFlavorSupported(stringFlavor)) { String filename = (String)tr.getTransferData(stringFlavor); e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); // 인자로 넘어온 액션으로 drop 을 받아들인다. readFile(filename); textPane.setCaretPosition(0); // Text 의 첫줄이 TextPane 의 첫줄에 오게끔 설정한다. e.dropComplete(true); } else { e.rejectDrop(); // Drop 을 거절한다. } } catch(IOException ioe) { ioe.printStackTrace(); } catch(UnsupportedFlavorException ufe) { ufe.printStackTrace(); } } // DropTargetListener 메소드를 구현한 부분이다. public void dragEnter(DropTargetDragEvent e) { } public void dragExit(DropTargetEvent e) { } public void dragOver(DropTargetDragEvent e) { } public void dropActionChanged(DropTargetDragEvent e) { } }
출처:http://www.javastudy.co.kr/docs/b612/swing/draganddrop.html

저작자 표시 비영리
Posted by 티엘로

謹弔

Twelo 2009/05/26 15:16

삼가 고인의 명복을 빕니다.
잊지 않겠습니다.
가장 아름다운 서민의 모습으로
임한 대통령 뿐만 아니라, 마지막 모습까지
절대로 잊지 않겠습니다.
무거운 짐 따위는 벗어버리시고 
영원히 행복하시길 바라겠습니다.
저작자 표시 비영리
Posted by 티엘로


JAVA를 이용하여 응용프로그램을 만들던 중 소스가 없을경우, 혹 잃어버린경우
이전에 컴파일 해놓은 .class 파일을 역컴파일 해서 소스를 볼수있다.
Jad 라는 JAVA Decompiler 라는 툴이며 이클립스 사용자들은 
플러그인 추가로 이클립스 에서 볼수있는 방법이다.

대표적인 자바 디컴파일러인 jad와 이클립스 플러그 jadclipse를 설치하자.

당연하게도 활용방법은
1. 잃어버린 .java 소스파일을 .class 파일로부터 복원
2. API에 대한 소스레벨 탑색이다.

특별한 설정은 필요치 않다.
두개의 압축파일을 다운받으면 된다.

1. jad 다운
사이트 : http://www.kpdus.com/jad.html
파일(window용 파일) : http://www.kpdus.com/jad/winnt/jadnt158.zip

2. jadclipse 다운
사이트 : http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download
파일(eclipse3.2.0) : http://prdownloads.sourceforge.net/jadclipse/jadclipse_3.2.0.jar?download
파일(eclipse3.2.4) : http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.2.4.jar?download

3. 설치방법
적당한 디렉토리에 압축을 푼다.
jad 파일을 eclipse 루트 디렉토리에 복사한다.
jadclipse 는 eclipse의 plugin 디렉토리에 통채로 복사한다.

4. 환경설정
이클립스 실행후
창/환경설정/일반/편집기/파일연관 으로 이동


JadClipse Class File Viewer를 선택하고 기본값을 클릭한다.

창/환경설정/Java/JadClipse 로 이동
Reuse code buffer 체크

창/환경설정/Java/JadClipse/Misc 로 이동
Convert Unicode string into ANSI strings 체크
=> 한글 깨짐 문제 해결

저작자 표시 비영리
Posted by 티엘로


   이 문서는 Oracle 9i의 new feature인 ORDER SIBLINGS BY 절을 
   Hierarchical query에 사용하는 예를 통하여 특정 컬럼을 기준으로 
   Ordering된 형태로 display하는 방법을 보여준다. 


Explanation & Example

   Hierarchical query를 구현할 때 ORDER BY 절을 사용하는 것은
   Oracle 7.1 버젼부터 가능한 것이었다.
   그러나, 순서대로 ordering되지 않고 특정 컬럼(emp table의 ename)을
   기준으로 ordering하기를 원한다면 <Bulletin:10373>처럼 procedure를
   작성하여야만 하였다.
   그러나, Oracle 9i 에서는 ORDER BY 절 대신에 ORDER SIBLINGS BY 절을
   사용할 수 있어 user-defined stored procedure를 만들 필요가 없게 되었다. 

1) Ordering 하기 전의 emp table의 Hierarchical query

SQL> @a


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
     KING                   7839        PRESIDENT
          JONES             7566   7839 MANAGER
               SCOTT        7788   7566 ANALYST
                    ADAMS   7876   7788 CLERK
               FORD         7902   7566 ANALYST
                    SMITH   7369   7902 CLERK
          BLAKE             7698   7839 MANAGER
               ALLEN        7499   7698 SALESMAN
               WARD         7521   7698 SALESMAN
               MARTIN       7654   7698 SALESMAN
               TURNER       7844   7698 SALESMAN


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
               JAMES        7900   7698 CLERK
          CLARK             7782   7839 MANAGER
               MILLER       7934   7782 CLERK

14 rows selected.


Ordering 하기 전의 a.sql 은 다음과 같다.

   col ename format a25
   col empno format 99999
   col mgr format 99999
   col job format a15
   select rpad(' ', LEVEL*5) || ename "ename", empno, mgr, job
   from emp
   start with job='PRESIDENT'
   connect by prior empno=mgr;

   /


2) 9i의 new feature인 Hierarchical query를 사용하여 Ordering한 경우

SQL> @new_a

ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
     KING                   7839        PRESIDENT
          BLAKE             7698   7839 MANAGER
               ALLEN        7499   7698 SALESMAN
               JAMES        7900   7698 CLERK
               MARTIN       7654   7698 SALESMAN
               TURNER       7844   7698 SALESMAN
               WARD         7521   7698 SALESMAN
          CLARK             7782   7839 MANAGER
               MILLER       7934   7782 CLERK
          JONES             7566   7839 MANAGER
               FORD         7902   7566 ANALYST


ename                      EMPNO    MGR JOB
------------------------- ------ ------ ---------------
                    SMITH   7369   7902 CLERK
               SCOTT        7788   7566 ANALYST
                    ADAMS   7876   7788 CLERK

14 rows selected.


Ordering하기 위해 사용한 new_a.sql 은 다음과 같다.

   col ename format a25
   col empno format 99999
   col mgr format 99999
   col job format a15
   select rpad(' ', LEVEL*5) || ename "ename", empno, mgr, job
   from emp
   start with job='PRESIDENT'
   connect by prior empno=mgr
   order siblings by ename;
   /

 


HIERARCHICAL QUERY DATA의 SORT와 ORDERING

ORACLE 6에서의 HIERARCHICAL QUERY에서는 SORT를 하기 위한 ORDER BY 절을 사용
할 수 없었다. 그러나, ORACLE 7.1이상 VERSION에서는 USER-DEFINED STORED
PROCEDURE를 이용하여 HIERARCHY 순서로 출력되면서 ORDERING할 수 있게 되었다.

세계의 지역에 관한 자료를 예로 보자.

 

      CREATE TABLE UNIVERSE
      ( PARENT VARCHAR2(30) REFERENCES UNIVERSE, 
      NAME  VARCHAR2(30) PRIMARY KEY );
     
     REM SOME TEST DATA
     INSERT INTO UNIVERSE VALUES ( NULL, 'WORLD' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'EUROPE' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'ENGLAND' ) ;
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'THE NETHERLANDS' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'GERMANY' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'ASIA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'ASIA', 'JAPAN' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'ASIA', 'CHINA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AMERICA' ) ;
     INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'UNITED STATES' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'MEXICO' ) ;
     INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AFRICA' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'EGYPT' ) ; 
     INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'MOROCCO' ) ;

 


위의 자료를 다음과 같이 보고자 하는 경우
WORLD
        AFRICA
                EGYPT
                MOROCCO
        AMERICA
                MEXICO
                UNITED STATES
        ASIA
                CHINA
                JAPAN
        EUROPE
                ENGLAND
                GERMANY
                THE NETHERLANDS

 

만약,ORDER BY절이 없이 QUERY하면


     SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE 
     CONNECT BY PRIOR NAME = PARENT START WITH PARENT IS NULL;

다음과 같은 결과를 얻게 된다.    
    WORLD
        EUROPE
                ENGLAND
                GERMANY
                THE NETHERLANDS
        ASIA
                JAPAN
                CHINA
        AMERICA
                UNITED STATES
                MEXICO
        AFRICA
                EGYPT
                MOROCCO

만약, 위 문장에 ORDER BY 절을 사용하면

 

      SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE
      CONNECT BY PRIOR NAME = PARENT START WITH PARENT IS NULL 
      ORDER BY NAME;

 

다음과 같은 원치 않는 결과를 얻게 된다.    
        AFRICA
        AMERICA
        ASIA
                CHINA
                EGYPT
                ENGLAND
        EUROPE
                GERMANY
                JAPAN
                 MEXICO
                MOROCCO
                THE NETHERLANDS
                UNITED STATES
     WORLD

 

7. 1이상 VERSION에서는 다음과 같이 USER DEFINED FUNCTION을  이용하여

원하는 자료를 얻을 수 있다.

 

CREATE OR REPLACE FUNCTION UNIVERSESORTORDER( PKEY UNIVERSE.NAME%TYPE ) 
     RETURN VARCHAR2 IS
        PATH VARCHAR2(2000);
     BEGIN
        PATH := PKEY;
        -- INSERT ALL PREVIOUS PARENT RECORDS LIKE A DIRECTORY STRUCTURE
        -- E.G. WORLD/EUROPE/...
        FOR CREC IN ( SELECT PARENT FROM UNIVERSE 
                      CONNECT BY PRIOR PARENT = NAME
                      START WITH NAME = PKEY ) LOOP
           PATH := CREC.PARENT || '/' || PATH;
        END LOOP;
        RETURN PATH;
     END;
     /
     
SELECT SUBSTR( RPAD( ' ', LEVEL * 5) || NAME, 1, 40) "THE UNIVERSE"
       FROM UNIVERSE
       CONNECT BY PRIOR NAME = PARENT
       START WITH PARENT IS NULL
       ORDER BY UNIVERSESORTORDER( NAME ) ;


저작자 표시 비영리
Posted by 티엘로

Good idea?

Twelo 2009/03/13 01:05

포스팅 전에 참고로
이사진은 www.kongda.co.kr 에서 불펌으로 가져온 자료입니다^-^
사진 주인님 저작권 문제가 된다면 바로 삭제 하겠습니다.
신고만 하지 말아주세요,,


여튼, 요즘 브레인스토밍, 특이한 발상, 
Gooooooooooods IDEA (이건 굳 --b 이 아니라 상품이 될만한 제품 이라는 저많의 Think' 입니다 ;;)
많은 관심을 가지고있는데요, 
웹 서핑중에 아주 신나는 물건을 발견했습니다.

참고로 말하자면 19금 이더군요, 아주 맛있을꺼 같은 '콩다님이 친절하게 일러 까지 삽입해주신' 왕가슴 푸딩 입니다,
 
단어들이 좀 야하죠?
('아따 달콤~한 비밀의 디저트여 ' '핥아 보고 싶으면 핥아봐도 되지롱')
사투리가 심하죠 오사카

조금만 생각을 바꾸면 음란하지만, 아주 좋은 상품이 될수 있습니다.
물론 시장가치는 생각을 해봐야겠죠?
요즘 가끔은 엉뚱한 생각들이 들면, 기록을 해놓곤 합니다.
다시봐도 아주 재밌는 제품이네요^-^
여러분도 한번 .. 사지는 못할테니 만들어 드셔보시길



저작자 표시 비영리
Posted by 티엘로

java.lang.OutOfMemoryError: Java heap space 
에러내용은 자바의힙 메모리 공간이 부족해서 생기는 에러로써 이를  해결하기 위해서는 
힙 사용 메모리 공간을 변경(확보)시켜 주어야 한다.

이클립스를 사용하고 있다면
아래와 같이 해결할 수 있다, 빈번히 생기는 에러는 아니지만 간혹 힙 메모리의 오류가 발생하니 참고하도록 하자

Properties - Run/Debug Settings - Arguments tab - VM arguments 로 이동하여 아래의 그림과 같이 설정한다 .

 

[-Xms256m, -Xmx1024m] 로 -Xms 는 최소, -Xmx 는 최대로 메모리로, 사용자의 편의에 맞게 적당히 지정한다

추가사항 (02/March/2009): 간혹 온라인 게임 프리서버를 돌리기 위해서 나타나는 java sql heap 스페이스 방법에는 사용되지 않습니다, 혹시 class 파일을 변경한다면 될지 모르겟네요.
위에 표기된 해결 방법은 이클립스에서 실행하는 어플에 적용된다고 알려드리고 싶습니다
..

저작자 표시 비영리
Posted by 티엘로


루비 온 레일즈 붉은색 서적 "Biginning Ruby on Rails 라는 책에 첫 튜토리얼중 Yes it's Working 을 Local 로 html로 올리는 부분에 오류가 납니다.

그래서 무시하고 다른부분부터 보기 시작했는데 마음에 걸려 삽질을 해본결과 책에 전혀 기술되지 않은 오류 정보더군요 ㅠㅠ
 
에러내용중" MissingSourceFile in AppController#greeting" 결국 sqlite3 라는DB 를 설치 하지 않아서 ...라더군요


sqlite를 일단 설치했습니다..

설치 방법은 루비가 설치된 콘솔 창에 "gem install sqlite3-ruby" 으로 설치하시면 됩니다.                         .

hello.app 를 실행합니다. 그결과 또다른 에러가 발생합니다..

에러내용은 sqlite3.dll 이 없다고 나오네요 http://sqlite.org/download.html 에 가셔서 dll 파일을 받아 Windows\system32 아래 넣어주시면 모든 에러가 해결됩니다.

정말 기본 비기닝 책이 이렇게 힘들줄은 몰랐습니다 ㅠ 이오류는 sqllite 라는 DB에 관한 오류지만 책에서는 Mysql 을 다룹니다 ㅠㅠ 흐악 과연 또다른 문제가 어떻게 발생할지 모르겠군요...



저작자 표시 비영리
Posted by 티엘로



아이팟 터치(1,2세대) APP중 아이팟에 키보드 또는 특수 기능키, 조합키를 등록하여 리모콘?! 으로 사용할 수 있도록 해주는 어플이다.

먼저 어플을 다운받았다면, 실행할경우 바로 접속 오류가 난다 그이유는 Receiver list 등록과, 등록된 PC에 iReceiver 라는 서버형태의 유틸을 설치를 해야 된다.

먼저 순서대로

1. 어플(wifiremote lite) 프리버젼을 다운받는다.
2. 아이팟에서 어플 실행 후 상단 오른쪽에 있는 edit 를 눌러 해당 PC의 아이피를 입력한다 (예: 192.168.10.1)
3. 리시버에 등록된 아이피의 PC 즉, 무선 조정을 원하는 PC에 ireceiver 유틸을 설치한다
4. (1,2,3)을 모두 만족하여 연결되면 아래와 같은 화면이 나타난다. 
(처음에는 무도 Undefined 로 설정되어있으며 아래의 화면 하단 오른쪽에 있는 Edit 버튼을 눌러 설정한다)


※ 저는 곰플레이어에 맞게 /방향키->/<-/위/아래/스페이스/ 등 사용하여 영화를 보는 내내 멈춤, 빨리감기, 되감기,볼륨 조정을 주로 합니다만,  Full  버젼이 아닌 lite 버젼을 사용중이라 아마 버튼 설정이 저장 되지 않는거 같습니다. 하지만 뭐 불편없이 (영화, 만화보기 프로그램 꿀뷰등) 사용하고 있습니다.







저작자 표시 비영리
Posted by 티엘로


1. Source 메뉴에는 재미있는 기능이 많습니다.

- source =>Generate Getter and Setter를 보시면

그동안 여러분을 괴롭혔던 mutator와 accessor를 편하게 구현하실 방법이 들어있습니다.

- source => Generate Constructors using Fields에서는

class variable만 선언하면 constructor가 자동으로 만들어지게 해줍니다.

 
2. 버그가 있으십니까? 디버깅을 해보세요. (고급, 그러나 유용한 기능)

Ctrl+Shift+B를 누르면 breakpoint가 걸리고,

F11을 누르면 디버그 모드로 실행이 됩니다.

디버그 모드에서는 breakpoint의 위치에서 어떤 변수가 어떤 값을 가지는지 볼 수 있고요,

한줄 한줄 실행해가며(보통 F6, 함수로 들어갈때 F5) 볼 수도 있고요.

디버깅에 대한 건 자세히 가면 책 한권정도 분량도 나오는데

기본적인 건 당연한 것들이 많아서 혼자 해보다 보면 스스로 많은 교훈을 얻으실 수 있습니다.

아. 디버깅을 하시다보면 perspective(창의 배치)가 달라집니다.

이때 디버깅을 마치고 돌아오시려면 오른쪽 위에 Debug / Java라고 쓰인 곳에 가셔서 Java를 눌러주세요.


3. 타자가 느리십니까? 자동완성 기능을 이용해보세요.

곧 나오겠지만, ActionPerformed 뭐 이런 긴 method의 이름은

Actio 정도만 치고 Ctrl+Space를 치면 적당한 후보를 내줍니다.

요것도 여러번 연습해서 습관이 되도록 하셔야겠지요.


for(int i = 0; i < array.length; i++)


이거 치기 참 힘드시죠?

for만 치시고 ctrl+space 누르시면

단번에 완성이 됩니다.

중간에 바꿔야 할건 tab키를 이용하면 바꿀 수 있고요.


4. 빨간 줄이 보이세요? 커서를 올려놓고 기다려보세요.

올려놓고 기다리시면 왜 빨간줄이 나왔는지 나옵니다.

도대체 어떻게 고쳐야할지 모르겠다 싶으시면

한번 Ctrl+1을 눌러보세요. 알아서 고쳐줄지도 모릅니다.

(안고쳐줄때도 많긴 합니다만...사용자 나름 편리할수도 있습니다)

 

영어 원문 ==================================================================

 

1. In the Source menu, there are lots of convenient functionality.

- if you go to Source =>Generate Getter and Setter,

You can implement mutators&accessors lot more easily.

- In the menu Source => Generate Constructors using Fields,

you can make constructor based on the previously defined class variables.

 

2. Any bug? use the debug. (advanced feature, but very useful)

If you press Ctrl+Shift+B, a breakpoint will be set on that line.

Then it goes the debug mode when you press f11 and if it stops at the breakpoint you set.

In the debug mode, you can see what values many variables have,

and you can walk around the code to see how they change

using f6 (step over) mainly and f5 (step into) somewhat infrequently.

It takes a book to explain the debugging thoroughly,

but the basic idea is very simple.

Once you try by yourself a lot, you will get much fun with it.

(For help, please email me or just ask other people )

When you debug your program in eclipse, the perspective(arrangement of sub-windows) is changed.

You should click "Java" among "Debug" and "Java" in the right upper corner to come back to the previous perspective.

 

3. Do you type slowly? Use the auto-completion.

Some methods with long name,such as ActionPerformed, can be shortened with auto-completion feature.

If you type "Actio" and press Ctrl+Space, eclipse will generate some candidates for your request.

You need to become familiar with it by practicing.


for(int i = 0; i < array.length; i++)


Isn't it hard to type or remember?

just type "for" and press ctrl+space,

and see what happens.

 
4. Do you see a red underline? wait for a while with your mouse pointer on it.

Eclipse will show you what the problem is.

If you don't know how to deal with it,

just press Ctrl+1, then eclipse might fix it.

(there are many times it doesn't, but anyway it works in many other times.)


저작자 표시 비영리
Posted by 티엘로