아.. 빨리도 한다. 소스 백업..;;



Function.as

//datagrid 에 콤보박스 넣는 부분

private function AddColums(addCount:int):void
{
 var columns:Array = setInitColumn(true);
 
 for(var i:int = 0; i < addCount; i++)
 {
  g_AllColumnArray.push({headerText:"항목선택", dataField:"", xmlIndex:g_ChildIndexOnXml} as Object);
  var col:DataGridColumn = new DataGridColumn("col" + i + 3);
  var colRender:ClassFactory = new ClassFactory(RendererComboBox);
  colRender.properties = {xmlIndex:g_ChildIndexOnXml};
  col.headerRenderer = colRender;
  col.width = 130;
  columns.push(col);
  g_ChildIndexOnXml++;
 }

 dataGrid.columns = columns;
}

//컬럼이 바뀌었을 때

public function columChanged(item:Object):void
{
 if(item != null) g_AllColumnArray[item.xmlIndex] = item;
}


RendererComboBox.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox height="24" xmlns:mx="http://www.adobe.com/2006/mxml"
  horizontalAlign="center" verticalAlign="middle" horizontalScrollPolicy="off" creationComplete="initApp()">
 <mx:Script>
 <![CDATA[
   private var _xmlIndex:int;
 
  public function set xmlIndex(value:int):void
  {
   _xmlIndex = value;
  }
    
  public function get xmlIndex():int
  {
   return _xmlIndex;
  }

  private function Onchange():void
  {
   var item:Object = new Object();
     
   item.headerText = lvlLabel.selectedItem.label;
   item.dataField = lvlLabel.selectedItem.data;
   item.xmlIndex = _xmlIndex;
   parentDocument.columChanged(item);
  }
 
  private function initApp():void
  {
   lvlLabel.selectedIndex = 0;
  }
 ]]>
    </mx:Script>
 
    <mx:ComboBox width="100%" textAlign="left" id="lvlLabel" cornerRadius="0" height="100%" change="Onchange()">
     <mx:Object label="항목선택" data=""/>
     <mx:Object label="전자메일" data="emailId"/>
     <mx:Object label="회사" data="coNm"/>
     <mx:Object label="부서" data="coDept"/>
     <mx:Object label="직함" data="coHandle"/>
     <mx:Object label="우편번호(회사)" data="coZipCd"/>
     <mx:Object label="회사주소" data="coAddr1"/>
     <mx:Object label="회사전화" data="coTelNo"/>
     <mx:Object label="팩스" data="faxNo"/>
     <mx:Object label="우편번호(집)" data="homeZipCd"/>
     <mx:Object label="집주소" data="homeAddr1"/>
     <mx:Object label="집전화" data="homeTelNo"/>
     <mx:Object label="홈페이지" data="homepageUrl"/>
     <mx:Object label="메신저" data="messenger"/>
    </mx:ComboBox>
</mx:HBox>



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/09/21 14:29 2009/09/21 14:29
TAG
검색하다가 발견!!
잘 되려나??

일단 백업해둠



TUESDAY, JULY 22, 2008

MD5 hash on iPhone with cocoa and Objective-C

In beta 7 OpenSSL has been removed from the iPhone SDK. However, MD5 is still available.

Simply import CommonCrypto as follows:
#import < CommonCrypto/CommonDigest.h >

Then add this C function to your objective-c class between the @implementation and @end statements (if you like).

NSString* md5( NSString *str )
{
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), result );
return [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15]
];
}

I am sure you can just use NSData for this but this is the way an example was posted on apple forums. Please feel free to add an NSData based solution.

Read the post here "http://discussions.apple.com/thread.jspa?threadID=1509152&tstart=96"
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/06/24 11:08 2009/06/24 11:08

-- 백업 -- 백업 -- 백업 -- 백업 -- 백업 -- 백업 -- 백업 -- 백업 --


NSString *temp = @"test";


printf("%d\n",[temp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]);


결과는!!


8


-_-b


유니코드로 인코딩해서 strlen으로 변환 하는 뻘짓을 햇다가 안되길래


찾아보니 잇슴.. OTL..


결론은 lengthOfBytesUsingEncoding:

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/06/23 15:08 2009/06/23 15:08
어쩐지.. 책보고 할 때 exception 이 난무하더니... OTL..

출처 : http://milines.egloos.com/1811201

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/07 17:20 2009/04/07 17:20
TAG ,

** 까먹기 전에 정리하자.

프로젝트의 모든 내용을 까발릴 수는 없으니까 요약 정리함.
(Spring FrameWork + Flex 통신 중 사용)

1. 쓰기

/**
  * 참고 코드 : JAXB - 파일 읽기
  * @param input : xml 만들 리스트
  * @param pw: xml 쓸 곳 ( 여기서는 화면에 )
  * @return
  * @throws JAXBException
  */
 public void writeGroupXML(List input, PrintWriter pw) throws JAXBException, FileNotFoundException
 {
  ObjectFactory objFactory = new ObjectFactory();
  AddressBook ad = (AddressBook) objFactory.createAddressBook();
  AddressBook.Groups grps = objFactory.createAddressBookGroups();
 
  List grpList = grps.getGroup();

  for(int i=0; i<input.size(); i++)
  {
   GroupType grp = objFactory.createGroupType();
   GroupVO gv = new GroupVO();
   gv = (GroupVO)input.get(i);
   
   grp.setGroupNm(gv.getGroupNm());
   grp.setGroupSeqNo(gv.getGroupSeqNo());
   grpList.add(grp);
  }
 
  ad.setGroups(grps);
 
  JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
  Marshaller marshaller = jaxbContext.createMarshaller();
  marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
  marshaller.marshal(ad, pw);
 }




2. 읽기

/**
  * 참고 코드 : JAXB - 파일 읽기
  * @param strFile 파일 경로 + 이름까지
  * @return
  * @throws JAXBException
  */
 public List readXMLFile(String strFile) throws JAXBException
 {
  JAXBContext jaxbContext = JAXBContext.newInstance("com.evelyn.msg.xml");
  Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  AddressBook ad= (AddressBook)unmarshaller.unmarshal(new File(strFile));
   
  AddressBook.Buddies bds = ad.getBuddies();
  List bdt = bds.getBuddy();
 
  for(int i = 0; i < bdt.size(); i++)
  {
   BuddyType bt = (BuddyType)bdt.get(i);
  }
  return bdt;
 }



 /**
  * 참고 코드 : JAXB - XML 문자열 읽기
  * @param strXml XML 문자열
  * @return
  * @throws JAXBException
  */
 public List readXML(String strXml) throws JAXBException
 {
  if(strXml == "")
  {
   logger.info("null string");
   return null;
  }
 
  JAXBContext jaxbContext = JAXBContext.newInstance("com.evelyn.msg.xml");
  Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  StringBuffer xmlStr = new StringBuffer(strXml);
  AddressBook ad = (AddressBook)unmarshaller.unmarshal(new StreamSource(new StringReader( xmlStr.toString())));
  AddressBook.Buddies bds = ad.getBuddies();
  List bdt = bds.getBuddy();
  return bdt;
 }


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/10/28 11:51 2008/10/28 11:51

** 까먹기 전에 정리하자.

프로젝트의 모든 내용을 까발릴 수는 없으니까 요약 정리함.
(Spring FrameWork + Flex 통신 중 사용)

1. 주소록 xsd 를 만든다.

주소록 - 그룹 - 버디의 구조.

<?xml version="1.0" encoding="EUC-KR"?>
<xs:schema xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:version="1.0">
 <xs:element name="AddressBook">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="buddies" minOccurs="0">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="buddy" type="buddyType" maxOccurs="unbounded"/>
      </xs:sequence>
     </xs:complexType>
    </xs:element>
    <xs:element name="groups" minOccurs="0">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="group" type="groupType" maxOccurs="unbounded"/>
      </xs:sequence>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:complexType name="groupType">
  <xs:sequence>
   <xs:element name="groupSeqNo">
    <xs:simpleType>
     <xs:restriction base="xs:long"/>
    </xs:simpleType>
   </xs:element>
   <xs:element name="groupNm">
    <xs:simpleType>
     <xs:restriction base="xs:string"/>
    </xs:simpleType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="buddyType">
  <xs:sequence>
   <xs:element name="buddyNm">
    <xs:simpleType>
     <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
     </xs:restriction>
    </xs:simpleType>
   </xs:element>
   <xs:element name="hpNo">
    <xs:simpleType>
     <xs:restriction base="xs:string">
      <xs:pattern value="[0-9\-]*"/>
     </xs:restriction>
    </xs:simpleType>
   </xs:element>
   <xs:element name="emailId" minOccurs="0">
    <xs:simpleType>
     <xs:restriction base="xs:string"/>
    </xs:simpleType>
   </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:schema>


2. 컴파일 한다.

컴파일 방법 참고 -> http://www.evelyn.pe.kr/kor/122

3. 다음의 파일이 생긴다.

AddressBook.java
BuddyType.java
GroupType.java
ObjectFactory.java

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/10/28 11:44 2008/10/28 11:44

1. 여기에 가서 Installation 을 다운 받는다
https://jaxb.dev.java.net/jaxb20-fcs/

2. 다운 받은 jar를 실행한다.

java -jar JAXB2_20060426.jar

3. 압축이 풀린 곳을 보면 bin/xjc.bat 가 있다. 커맨드창에서 해당 경로로 간 다음 다음처럼 명령어를 친다.

xjc -p <패키지명> <xsd명> -d <파일을 생성할 폴더명>


예> xjc -p com.evelyn.msg.xml msg.xsd -d .

4> com/evelyn/msg/xml 에 java 파일들이 생성된다.


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2008/08/26 14:13 2008/08/26 14:13
TAG ,

출처 : http://internet512.chonbuk.ac.kr/datast ··· ist6.htm
(인코딩에 약간의 문제가 있어 그냥 퍼왔습니다.)

단일 연결 리스트에서는 리스트의 마지막 노드의 링크 값이 널(null:^)이었지만, 환형 연결 리스트(circular linked list)는 마지막 노드의 링크의 링크 값이 널(null:^)이 아닌 리스트의 첫 번째 원소의 주소를 가리키도록 하는 구조로 되어 있다.

square03_blue.gif 환형 연결 리스트의 구조 square03_blue.gif

환형 연결 리스트에서는 노드의 시작과 끝을 구별하지 않음으로써 마지막 노드와 처음 노드가 연결되어 있음으로 임의의 노드에서 다른 모든 노드로의 접근이 가능하여 임의 노드의 검색이 가능하게 된다. 단순 연결 리스트의 경우 정보가 끊어지면 그 다음은 찾을 수가 없는데 환형 연결 리스트는 그것을 극복할 수 있다.

삽입시에 어떠한 변화가 있는지 볼 수 있다.


삽입시에 어떠한 변화가 있는지 볼 수 있다. (다른 예제)

삭제시에 어떠한 변화가 있는지 볼 수 있다.


환상 연결 리스트 L에 새로운 노드 I를 삽입시키는 방법에는 연결 리스트 L 앞에 새로운 노드를 삽입하는 경우와 연결 리스트 L 뒤에 새로운 노드를 삽입하는 방법이 있다. 그림과 같이 구성된 환상 연결 리스트에서 위의 두 가지 방법을 적용해 보면 다음과 같다.


square03_blue.gif 연결 리스트 square03_blue.gif

           square03_blue.gif 리스트 앞에 (new)노드를 삽입한 상태 square03_blue.gif

리스트 앞에 노드를 삽입하는 알고리즘

Procedure INSERT_node_FRONT(L, I)
    if L = 0 then
        [L ←I; LINK(I) ←L;]
    else
        [LINK(I) ← LINK(L);
         LINK(L) ← I;]
end  INSERT_node_FRONT

현재 노드가 2개 이상 있으므로 else 쪽의 알고리즘이 동작하게 된다. 동작순서를 살펴보면

  • 연결리스트 L 의 링크값을 연결리스트 I 의 링크값에 넘겨준다.
  • 연결리스트 L은 I를 가르키도록 한다.

가 된다. I 가 추가됨으로서 기존에 L이 가르키고 있던 D0의 주소값을 I 가 물려받게 되고 L은 원래 D0을 가르키고 있었으나, 이제 새로 추가된 I 를 가르키게 되는 것이다.


square03_blue.gif 노드 D를 삭제하기 전의 리스트 상태 square03_blue.gif


square03_blue.gif 노드 D를 삭제한 후의 리스트 상태 square03_blue.gif

Procedure DELETE_node (D, X, Y)
      if  L = 0 then empty;
         LINK(X) ← LINK(D);
      if  L = D then L ← X;
         Y ← DATA(D);
      call RET(D)
end DELETE_node

장   점

단   점

  • 임의의 노드로부터 모든 노드로의 접근이 용이하다.
  • 리스트에 노드를 삽입하거나 삭제할 때 노드 수에 관계없이 거의 일정한 시간이 소요되므로, 노드의 삽입과 삭제 연산이 편리하다.
  • 리스트의 결합(combining), 분리(splitting) 작업을 효율적으로 수행할 수 있다.

리스트를 구성하는 특정 노드를 검색하고자 할 때 잘못하면 무한 루프(infinite loop)에 빠질 가능성이 있으므로, 검색을 끝낼 수 있는 노드가 존재하여야 하며 이런 목적으로 추가된 노드를 HEAD노드라고 한다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2007/06/04 10:10 2007/06/04 10:10
출처 : http://internet512.chonbuk.ac.kr/datast ··· ist5.htm
(인코딩에 약간의 문제가 있어 그냥 퍼왔습니다.)

선형리스트에서 발생하게 되는 원소들의 이동문제를 해결해주는 방법은 리스트를 구성하는 연속된 순서의 원소들이 기억장소내에서 어느곳에나 저장 가능하도록 원소들의 위치와 무관하게 원소들을 연결하여 표현하는 방법이다.

연결리스트에서는 원소들의 값이외에 포인터값이 포함되므로 리스트의 한원소의 노드(node)는 원소값을 저장하는 자료(data)부분과 다음 원소를 지적하는 포인터값을 저장 하는 링크(link) 부분으로 구성된다.
                   

단일 연결 리스트의 구조


입력, 출력시에 어떠한 변화가 있는지 볼 수 있다.





<예제 1.>

단일 연결 리스트에서 다음과 같은 "리스트의 삽입"이 이루어질 때 비연속적인 리스트로 표현 하시오.

풀이)

주소

1

2

3

4

5

6

7

8

9

10

데이터

김 (*2)

링크

3

10

4  (*1)

5  (*2)

9

1

2

마지막

(*1) - 노드의 삽입으로 인해 변경된 링크 필드값
(*2) - 새로 삽입된 노드

<노드 삽입 알고리즘>

Procedure INSERT_node (Head, Item, X)
   // Head : 연결 리스트의 첫 번째 노드를 가리키는 포인터 //
   // Item : 새로 삽입할 데이터 항목 //
   // X : 임의의 노드를 가리키는 포인터 //

call GETNODE(Y)
   DATA(Y) ← Item
   if (Head=Nil) then
     Head ← Y
     LINK(Y) ← Nil
   else
     LINK(Y) ← LINK(X)
     LINK(X) ← Y
   end INSERT_node

데이터 "항목 C와 F사이에 새로운 "데이터 항목 E"를 삽입하는 과정은 다음과 같다.  이 때, X는 포인터이며 X가 가리키는 노드의 다음 노드에 새로운 노드를 삽입하기 위해 사용된다.

  • 새로운 노드를 생성한 후, 생성된 노드의 주소를 포인터 변수 Y에 대입한다.
  • 생성된 노드에 데이터 항목 E를 대입한다.
  • X가 가리키는 노드의 링크 값을 생성된 노드의 링크 부분에 대입한다.
  • 생성된 노드의 주소를 가리키는 Y값을 X가 가리키는 노드의 링크 부분에 대입한다.

<예제 2.>

단일 연결 리스트에서 다음과 같은 리스트의 삭제가 이루어질 때 비연속적인 리스트로 표현하시오.


주소

1

2

3

4

5

6

7

8

9

10

데이터

삭제

링크

5  (*1)

10

삭제

5

9

1

2

마지막

(* 1) - 노드의 삭제로 인해 변경된 링크 필드값

Procedure DELETE_node (W, X Head)
   // W : 삭제할 노드의 앞 노드를 가리키는 포인터 //
   // X : 삭제할 노드를 가리키는 포인터//
   // Head : 연결 리스트의 첫 번째 노드를 가리키는 포인터//

   if (W=Nil) then  
     Head ← LINK(Head)
   else
     LINK(W) ← LINK(X);
   call RET(X)
end DELETE_node

X가 가리키는 노드를 삭제하는 과정은 다음과 같다.
  이 때, W는 삭제하고자 하는 노드의 앞 노드를 가리킨다.

① X가 가리키는 링크 값을 W가 가리키는 노드의 링크 부분에 대입한다.
      LINK(W)←LINK(X)

② X가 가리키고 있는 노드를 가용 기억공간으로 되돌린다.
      즉 X 노드는 단순 연결 리스트에서 삭제된다.
      call RET(X)


< 단일 연결 리스트의 장단잠>

장    점

단    점

연결리스트의 모든 장점을 가지고 있으며
가장 융통성이 좋다.

대단히 복잡하고 가장 많은 공간이 필요하다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2007/06/04 10:00 2007/06/04 10:00

출처 : http://internet512.chonbuk.ac.kr/datast ··· ist1.htm


1. 연결리스트의 정의

연결 리스트는 일정한 순서를 가지는 데이터 항목들을 표현하는  방법중의
하나이다. 배열과 같은 순차적 표현 방법과는 달리 데이터 항목들의 논리적인 순서만 유지되고 기억장소 내에서는 각 항목들의 임의의 위치를 가지도록 하는 자료구조이다.

2. 연결리스트의 구조

연결 리스트에서는 각 데이터 항목들이 기억장소내의 어떤 위치에 어떤 항목이 있는 지를 표시해 주어야 한다. 이를 위해 데이터 항목에는 값뿐만 아니라 다음 항목의 위치 정보도 함께 저장해둔다. 위치정보의 저장에는 포인터가 사용된다.


3. 연결리스트 에서의 포인터

결 리스트에서 포인터는 각 항목의 다음 순서인 항목이나 앞 순서인 항목의 위치를 가르키는 지시자이다. 연결 리스트의 마지막 노드에는 다음 순서인 항목이 없고, 첫번째 노드에는 이전 순서인 항목이 없으므로 이들 포인터는 null로 해주어야 한다.

포인터는 연결 리스트의 핵심이다. 연결 리스트에서 공통적인 사항은 데이터 항목 간의 결합이 데이터 항목 자체 내에 포함되어 있는 정보에 의해 포인터의 형식으로 정의된다는 것이다. 이런 사실은 데이터 항목 간의 결합이 배열의 배치와 저장을 기반으로 하는 배열과 링크드 리스트를 분명히 구분하는 기준이다.

위의 그림에서 입력자료는 4칸의 분량인데, 저장장치에 연속된 공간은 최고 3칸밖에 없다. 이럴 경우 배열로는 입력자료를 수용하지 못한다. 그러나 연결리스트를 이용하면 연속되지 않은 빈 공간들을 효율적으로 사용할 수 있다. 다음 그림을 보자.

링크를 통해 데이터의 연결성이 보장된다.

배열과 비교하여 또다른 장점도 있다.


항상 정렬 상태가 유지되어야만 할 어떠한 배열이 있다고 하자. 새 값이 중간에 들어가야 할 경우, 배열은 다음의 모든 데이터를 뒤로 한칸씩 밀어야만 한다. 막대한 낭비가 아닐 수 없다. 소규모의 정보를 다룰 때는 사실 별로 문제가 되지 않을 것이다. 하지만 대용량의 정보를 다룰 때는 문제가 매우 심각해진다. 정부에서 국민의 주민등록정보를 배열로 저장했다고 치자. 누군가가 태어나고 죽을 때마다 움직여야 할 배열의 수는 천문학적일 것이다. 하드는 쓸데없는 자료이동에 대부분의 시간을 소모할 것이고, 막상 데이터를 읽으려면 많은 시간을 기다려야 할 것이고 공무원의 흰머리만 늘어날 것이다.따라서 이러한 것은 연결리스트를 이용하는 것이 훨씬 낫다. (그러나 앞으로 배우게 될 더 나은 자료구조들이 실제로는 이 일에 더 적합하다.)

그러나 단점도 있다. 이러한 링크는 실제적으로 다음 번 저장장소의 주소값인데, 그 값을 저장하기 위해 추가로 저장장소가 필요하게 된다. 따라서 본연의 데이터 외에 추가로 Overhead가 발생한다.


4. 연결리스트의 효율 계산

각 노드는 사용자 데이터와 다음 노드를 가리키는 포인터로 이루어진다. 이 때 효율성을 따져 보아야 한다. 예를 들어 어떤 환경에서 이 포인터가 4 바이트를 차지한다면 데이터는 4보다 훨씬 큰 용량이어야 한다. 예를 들어 데이터의 크기가 2 바이트라면 하나의 노드에 필요한 공간은 최소 6 바이트가 될 것이고, 실제 10 바이트를 저장하기 위해서는 10 / 2 = 5 개의 노드가 필요할 것이며, 이는 메모리 공간을 최소 5 * (2 + 4) = 40 바이트를 필요로 한다. 생각해 볼 필요도 없이 10 바이트를 저장하기 위해 40 바이트를 쓴다는 것은 메모리의 낭비일 것이다. 낭비되는 공간을 퍼센트로 나타내면 30 / 40 * 100 = 75(%)가 된다. 따라서 한 노드에 더 많은 데이터를 저장하여 이러한 손실을 상대적으로 줄일 수 있다. 예를 들어 한 노드에 40 바이트 크기의 데이터를 저장한다면 80 바이트를 저장하기 위한 노드의 개수는 80 / 40 = 2가 될 것이고, 필요한 메모리 공간은 최소 2 * (40 + 4) = 88이 된다. 즉 80 바이트를 저장하기 위해 88 바이트가 필요한 셈이므로 낭비되는 공간은 8 / 88 * 100 = 9(%) 정도이다.

그러나 여기에서는 리스트 구현 방법에 중점을 두고 설명할 것이기 때문에 이러한 효율성은 무시할 것이다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2007/06/04 09:55 2007/06/04 09:55