참으로 좋은 언어 

구글이 선정한 언어

파이썬

21세기 플머들아 

꼭 배워야 하는 언어 3가지를 c/c++, java, 파이썬 그중

내가 지금 공부하고 있는 언어는 파이썬

공부라? 공부는 아니지 그냥 재미로 하는거니까...


아참 object-c도 짬짬히 하고 있는데 ㅋㅋ

역시 대박언어다...


아 이런 젠장

에그를 읽어 버린거 같군

바로 kt가서 취소해야겠따. 젠장


아 너무 주제가 길었다.

다름이 아니구 오늘은 기초적인 문법편

for 문 if문에 대해서

알아보장


for문 사용법은 어느언어와 마찬가지로...

너무쉽다.


for i in range(2,10):

for j in range(1, 10):

print i * j,

print '\n'


자 보아라

파이썬에 위대함을 단 4줄로 구구단을 짜는 센스!


나 이거보고 파이썬 짜기 시작했어 너무 좋아

헤헤

너무 웃지 마라

이런식으로 웃는거 별로 인게 말이다.


두번째로 if문에 대해서 알아보장

a = 200

if a<100:

print 'hello'

elif a==200:

print 'hello world'

else:

print 'kimyongyeon hello world'

참 쉽죠잉?


역시 간결함에 다시한번 감동이다.

이런 언어가 객체지향언어에 인스턴스도 생성이 되고 생성자가 존재한다는게

말이 되나...

다음 시간에는 클래스를 한번 만들어 보장


아 정리를 좀 할려고 블러그를 잡았는데

정리는 안하고 예제만 보여준다.

그래도 예제로 풀어가는게 제일 좋다.


백날 말하면 뭐하나 한번 보는게 짱


'객체지향언어' 카테고리의 다른 글

파이썬 1부  (0) 2013.06.09
삼성 애니프레임.  (0) 2013.05.31
클래스의 상속  (0) 2009.08.19
객체지향 - 유스케이스  (0) 2009.08.19

요즘 뭔가 깊이 빠지고 싶어서 파이썬을 공부하고 있다.


비록 시작은 허접해도 끝은 창대하느라...



얼마나 아름다운가...

배열을 선언해서 사용할수 있다.

이건 어떤 언어도 마찬가지다.

하지만 여기서 주목할 것은 구간 출력이다.


다른언어에서는 컬렉션을 이용하거나, 또한 리스트를 사용해야 하는데

파이썬은 배열에서 구간이 출력된다.


점점 놀래고 있다.


파이썬에는 튜플, 사전, 리스트가 존재한다.

이 모든 테이터타입은 값을 저장하고 출력하는데 유용하게 사용할 수 있는 변수인데...

써보면 진짜 환상이다.


왜 파이썬을 공부해야 하는지 깨달을 수 있다.


'객체지향언어' 카테고리의 다른 글

파이썬 2부  (0) 2013.06.10
삼성 애니프레임.  (0) 2013.05.31
클래스의 상속  (0) 2009.08.19
객체지향 - 유스케이스  (0) 2009.08.19

오늘은 본인이 회사에서 사용하는 AnyFrame에 대해서 간단히 적어본다.

본인은 현재 제1 금융권에서 회계업무를 하고 있다.

회계업무라는것을 첨으로 하기 시작했는데 본래 프리랜서는 금융업무를 하지 않으면 들어오기 힘든찬스 였지만 낙하산? 선배의 조언으로 시작하게 되었다.


일절 글이 너무 길어진것 같다. 본론부터 말하지만, anyframe 자체는 너무 쓰레기다. 버그도 많고, 에러도 많다. 이런 쓰레기 제품을 사용하는 삼성SDS가 너무 웃기다.


이건 어설픈 spring 기반도 mvc모델 방식도 아닌 뭐또 아닌꼴이다... 쩝

왜케 만든진 몰겠지만 너무 사람 피곤하게 만든다.


하루몇번씩 소스를 갈아치우는지 모르겠다. 생각 또 생각을 하고 만들어야 한다. 본디 내 생각은 회사에서는 예술보다 작품보다 상품을 찍어야 하는데 이건 뭐 생각을 하다보면 복사 + 붙여넣기 신공도 발휘하기 힘드니 참 거지같다.


구조는 대충

service, service impl, biz, dao, vo 구조로 되어 있는데 이건모...

dao에서 쿼리를 자동생성해 주는 기능은 있지만 자동생성까지는 매우 만족한다. 아니 신세계였다. 이런 기능이...

하지만 자동으로 생성하다 보니 똑같은 이름에 컬럼이나 변수가 여러개의 매소드에서 겹쳐서 나오면 이런 자바 파일 젠장 구분을 못하는 빙신이 된다. ㅠㅠ


또한, VO도 자동으로 생성이 된다. 여기서는 DVO라는 패키지에 담기게 되더군 이건 자동생성이 되는거라고 하더군.. 그러나 이것도 문제가 많다. 사람이 손이 아주 많이 간다. 본디 프레임을 쓰는 이유는 빠른 생산성과 자동화 인데 이건 손이 두배로 가는것 같다.


요즘은 화면을 거의 찍어내야 하는데 너무 지체 된다.

집중해서 하나를 찍을려 하면 여러가지를 생각하게 만드니 걱정이 이중삼중으로 든다.


화면은 우리쪽에서는 NCRM이라는 툴을 사용하는데 UI툴이라고 하는데 진짜 거지같이 버그가 많고 에러도 많아 심지어 파일도 저장이 잘 안되고, 가끔 꺼지기 까지 해 너무 짜증나! 이제까지 내가 만든거 돌리줘~


아참 NRCM은 자바스크립트와 html문서를 보다 편리하게 만들수 있도록 구성하는 툴인것 같아 다른쪽에서는 miflatform이나 xflatform으로 개발한다면 여긴 거지같은 ncrm으이라는 툴로 사용하는 것 같아! 너희들도 한번 써봐 욕나온다.


오늘은 여기까지 할래 너무 잠와 담에 와서 또 써줄게 아참

나 요즘 맥 공부하는데 너무 이해안돼 누가 나좀 도와줄사람 나 맥 개발하고 싶어 미치겠단 말이야 정확하게 아이폰, 아이패드 개발하고 싶어 그냥 단순한거라도 만들어보고 싶어 내손으로 말이야


난 원래 안드로이드는 혼자서 개발하는데 아이폰은 짬짬히 공부해서 해볼려고 했는데 무지 이해안돼 문법이 왜케 여긴 지랄같오!


아오

끝으로 술좀 끊어야 하는데 술어떻게하면 끊을수 있어? 바뻐야 해? 아님 그냥 기분이 안좋아야해?


알려줘~~~

슝슝


'객체지향언어' 카테고리의 다른 글

파이썬 2부  (0) 2013.06.10
파이썬 1부  (0) 2013.06.09
클래스의 상속  (0) 2009.08.19
객체지향 - 유스케이스  (0) 2009.08.19

안녕하세요 오늘은 사이트메쉬라는 프레임워크를 알아보도록하겠습니다.

새로운 임무를 부여받고 소스를 분석하는 중에 완전 기똥찬 프레임워크를 하나 발견해서 감동하고 눈물납니다.

어여 개발해 봅시다.


공통단을 빼기 위해 기존의 include로 삽질했던 것들을 이제는 sitemesh라는 프레임워크를 사용함으로써 너무 쉽게 처리 할 수 있었음을 알 수 있었습니다.


아래 내용을 보면서 설정 및 사용해 보자.




maven update

더보기



decorators.xml

더보기



sitemesh.xml

더보기



layout.jsp

더보기

팩토리 패턴에 가장 큰 장점은 앞으로 어떤 클래스가 추가될지 모르는 상태에서 팩토리 클래스에서 if만 추가하면 객체가 생성되고, 서브클래스만 구현하면 된다는 것이다. 얼마나 획기적인가...


예제를 통해 알아보자.

package AbstactFactory;


public abstract class Ethnic {

public void Create() {

}

}

package AbstactFactory;


public class EthnicFactory {

public String _ethnic;

public EthnicFactory(String _ethnic){

this._ethnic = _ethnic;

}

public Ethnic getInstance(){

if(_ethnic.equals("Human")){

return new Human();

}

else{

return new Elf();

}

}

}

package AbstactFactory;


public class Character extends Human {

private String ethnicName;

private Ethnic _ethnic;

public Character(){

this("Human");

}

public Character(String ethnicName){

this.ethnicName = ethnicName;

this.Create();

}

public void Create(){

EthnicFactory factory = new EthnicFactory(ethnicName);

Ethnic ethnic = factory.getInstance();

ethnic.Create();

_ethnic = ethnic;

}

}

package AbstactFactory;

public class Human extends Ethnic{
private String ethnicName;
public Human(){
ethnicName = "Human";
}
@Override
public void Create() {
// TODO Auto-generated method stub
super.Create();
System.out.println(ethnicName + " created.");
}
}


메인 구현 부분


Character Human = new Character("Human");
Character Elf = new Character("Elf");


'시스템분석 및 설계 > 디자인패턴' 카테고리의 다른 글

MVC 모델 정리  (0) 2009.08.21
팝업 윈도우를 사용하는 이유는 커스텀하게 배경을 넣을때 사용하면 유명함
또한 좌표위치도 조절이 가능하기 때문에 아래나 위로 붙일때 유효하게 사용가능함
아래는 리스트 뷰에서 클릭시에 팝업을 띄워 처리하는 방법을 제시해줌.

http://ememomo.tistory.com/3

[공식사이트]
android sdk
http://developer.android.com/sdk/index.html

아이콘 생성툴
http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

android library document
http://developer.android.com/reference/packages.html

android 블루투스 정보
http://docs.androidside.com/docs/guide/topics/wireless/bluetooth.html

android 블루투스 chat source
http://developer.android.com/resources/samples/BluetoothChat/index.html

 

[블로그]
android 개발 블로그
http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=2617&page=0

안드로이드 기반 오픈 소스 프로젝트 및 참고 사이트 모음
http://www.androidpub.com/89895


 

안드로이드 강좌 3 - 프로젝트 실행과 디버깅 그리고 단말 세팅
http://www.androidpub.com/764


Expat XML Parser
http://www.hpc.wm.edu/SciClone/documentation/software/misc/expat/reference.html#XML_SetStartElementHandler


sqlite 3 한글 문제 및 사용번 adb devices
http://underclub.tistory.com/260?srchid=BR1http%3A%2F%2Funderclub.tistory.com%2F260


안드로이드 데이트 타임 포멧 형식
http://developer.android.com/reference/android/text/format/DateFormat.html

http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=1521잘되어있음.

 

챠트 그래프 엔진
http://www.achartengine.org/

http://youngik.tistory.com/41?srchid=BR1http%3A%2F%2Fyoungik.tistory.com%2F41


바이오리듬예제
http://www.cocoadev.co.kr/205


안드로이드 디자인 ui 에디터 툴
http://www.androidside.com/page/help/droiddraw.php


안드로이드 버튼 롤오버
http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=11310&page=2


구글 검색
안드로이드 asset db


 sdcard db 쓰고 읽기
http://androcat.egloos.com/1799323


코너를 둥글게 하는 코드가 기재된 사이트를 소개합니다.

   http://stackoverflow.com/questions/1705239/how-should-i-give-images-rounded-corners-in-android
[출처] Android Side - http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=6954#c_7014

 

커스텀 버튼 만들기 (숫자표시???)
http://blog.cyworld.com/kenur/3865946

테이블레이아웃 TableLayout
http://tigerwoods.tistory.com/12


테이블 모서리 둥글게
http://lomohome.com/317


안드로이드 소켓통신

http://blog.naver.com/west372?Redirect=Log&logNo=80099128812
소켓통신!!!
http://pulsebeat.tistory.com/24
파일전송
http://blog.paran.com/du19s/38833337

C 와 java server 소켓
http://www.javanuri.com/devforum/boardView.jsp?Id=306222&gb=qna&menuId=9


c 와 java servlet
http://dont.pe.kr/tt/25


struts ajax 업로드
http://ant103.egloos.com/tag/%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/page/1


안드로이드 게시판
http://blog.naver.com/PostView.nhn?blogId=q1q3q5&logNo=10095649155

 

[아이폰 개발 sdk] http://developer.apple.com/devcenter/mac/index.action

 

WebView 화면 확대 축소

http://blog.outsider.ne.kr/462

 

3D openGL ES 소개

http://zorg.tistory.com/128

 

 

 

Android NDK 시작하기

http://blog.naver.com/ofking00/120119379228

 

 

Hello Android NDK example

http://micropilot.tistory.com/1522?srchid=BR1http://micropilot.tistory.com/1522

비동기 소켓이란.

 

동 기 : 소켓이 서로 통신할 때 데이터를 언제 보낼 것인가와 언제 받을 것인가를

알고 있는 경우의 통신. 만약 데이터를 보냈는데 받지 못하는 상황이 발생

하거나 데이터를 받을 준비를 했는데 아무것도 오지 않는 상황이 발생한다면

이로 인해 프로그램이 멈추게 된다. 언제 데이터가 오고 가는지 알고 있어야만

통신이 가능해진다.

비동기 : 서로 통신할 시기를 알지 못하는 경우를 생각해보면 언제 올지 모르는 데이터를

계속 기다리는 것은 비효율적인 작동방식이 된다. 이를 효율적으로 작동시키기 위

해서는 언제 데이터가 오는지는 알 필요 없이 데이터가 왔는지 안 왔는지만 확인해

서 다른 작업을 하다가 데이터가 왔다면 그 때 도착한 데이터를 받아 들인 후 처리

하면 된다.

 

블러킹모드와 넌블러킹모드

 

블러킹모드 : 소켓은 기본적으로 socket()함수를 써서 소켓을 생성하게 되면 블러킹모드로

만들어지게 된다. 블러킹모드에서 send()나 recv()함수를 호출하게 되면 데이

터가 가거나 오지 않는 이상 이 함수는 리턴을 하지 않고 계속 머무르게 되어

있다.

넌블러킹모드: fcntl()함수를 이용하여 소켓을 넌블러킹모드로 만들 수 있다. 이렇게 해서 만

들 경우 소켓은 데이터를 보내거나 받을 시 데이터가 있으면 바로 보내거나

받게 되고 없다면 errno변수(errno.h 헤더에 있다)에 상태를 기록하게 된다.

이 상태변수를 보고 무엇을 할지 결정하면 된다.

 

함수의 블록상태와 넌블럭상태

함수를 호출했을 때 리턴이 되지 않고 어떠한 상태가 될 때까지 무한히 기다리게 되는 경우가 있게되면 이것은 블록킹함수이고 이러한 상태가 없이 어떤 결과든 리턴해주게되는 경우가 넌블럭킹함수이다.

 

 

 

비동기의 방식

 

블록과 넌블록함수는 프로그램의 상태를 말해주는 의미이고 동기와 비동기는 읽기와 쓰기의 상태에 때라 구별되는 개념이다. 동기란 입력과 출력의 상호간에 약속에 의해 동시간에 이루어지는 것이다. 즉 A라는 상대가 1시에 파일을 보내기로 했다면 이것을 받는 B라는 상대도 1시에 정확히 파일을 받는 것을 의미한다. 만약 B가 1시 이전부터 파일을 받으려고 한다면 1시까지는 기다려야 함을 의미하며 B가 1시에 기다리고 있는데 A가 보내지 않는 다면 B는 A가 보낼 때까지 기다려야 함을 의미한다. 비동기는 언제 보내고 언제 받을지를 결정하지 않고 상대가 보낸다는 신호를 받으면 그 때 받는 행동을 하는 것이다. 비동기의 예를 들면 전화나 편지가 있다. 상대가 언제 보낼지 알 수 없고 전화벨이 울리면 그 때 받으면 된다. 전화벨이 울리기 전까지는 다른 일을 해도 된다.

 

비동기의 방식에는 여러가지가 있는데 윈도우와 유닉스의 방식에는 같이 쓸 수 있는 방법이

select()함수를 이용한 방법이 있다. 그리고 윈도우에서 지원해주는 여러가지 함수를 이용해서 다양한 방법을 쓸 수 있다. 리눅스에서는 select()나 poll()함수를 이용하여 만들 수 있는데 이 방법은 엄밀히 말하면 비동기가 아니다. 단지 운영체제가 언제 recv나 send함수를 호출해야 하는 지를 가르쳐주기 때문에 통신은 동기로 이루어 지지만 방식은 비동기에 가깝다. 진정한 비동기 방식은 운영체제에서 프로그램에 인터럽트를 걸고 데이터가 왔다고 알린 후 콜백함수를 등록하여 이를 호출하여 처리되는 식으로 동작할 것이다. 하지만 이런 방식은 구현이 까다롭고 OS에 대해 잘 알고 있어야 하며 select나 poll 방식에 비해 효율적이라고 할 수도 없어서 대부분 다른 방식을 사용한다고 한다.

이런 방식으로 SIGNAL 방식이 있다. 이것은 운영체제에 어떠한 신호를 등록해두고 자신은 다른 일을 하다가 신호가 오면 운영체제가 신호를 받아서 미리 등록해둔 방식으로 동작하도록 하는 것이다. 이 방식은 쓰레드를 써야하며 멀티플렉싱이 이루어 져야 할 때는 모든 소켓을 뒤져야 하므로 poll이나 select 방식에 비해 장점이 없다. 이러한 단점을 극복한 방법으로 REALTIME SIGNAL이라는 방법이 있지만 구현이 까다롭다고 한다.

 

 

 

다중 비동기 소켓 클래스

 

poll방식을 사용하여 비동기방식으로 다중 소켓을 처리할 수 있는 소켓클래스이다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/%BA%F1%B5%BF%B1%E2%BC%D2%C4%CF%BC%AD%B9%F6%C5%AC%B7%A1%BD%BA

이곳에서 구현해놓은 클래스와 예제가 있어서 분석해보았다.

 

파일 리스트를 보면

sock.h // sock클래스 구현 socket의 기본 기능을 구현

sock.cpp

asyncSocket.h // 다중 비동기 통신을 위하여 AsyncSocket클래스 구현

asyncSocket.cpp

log.h // 에러 보고를 위한 함수 선언 헤더

log.cpp

이렇게 있다.

 

Sock 클래스

 

소켓의 기본 기능인 connect나 bind, send등의 함수를 구현해 놓은 클래스이다.

특이점은 처음 connect를 할 때 블러킹되는 것을 방지하기 위하여 fcntl함수를 이용하여

소켓을 넌블러킹모드로 만들었다가 다시 블러킹으로 바꿔준다는 것이다.

그외에는 소켓의 기본 기능이 모두 들어가 있다.

 

AsyncSocket 클래스

 

다중접속을 위해 만들어진 소켓클래스이다. 소켓을 얼마나 열지는 클래스 생성자의 인자를 이용해 줄 수 있다. 언제나 0번 소켓은 서버용으로 사용되고 입력을 받는데 사용된다.

그외의 소켓은 accept함수에서 지정해주는 소켓을 받아서 통신에 사용하게 된다.

 

AsyncSocket클래스는 Sock클래스에서 상속을 받지 않고 다중소켓을 만들기 위하여 Sock개체를 포함하여 다수의 Sock객체를 가지고 있다. poll()함수를 사용하는 함수이기 때문에

apoll() 메소드가 가장 중요한 부분이 된다.

중요한 속성변수로

struct polldf* pFd;

ConInfo* conSock;

Sock * sock;

이 있다. pFd 는 poll함수에서 사용하기 위한 변수로 자세한 설명은

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Poll

이곳에서 참고하였다.

ConInfo* conSock; 이 변수는 socket의 상태를 저장하기 위한 변수이다. 이것을 보고 현재

소켓이 접속되었는지 아닌지를 판단하게 된다.

poll함수는 pollfd형 포인터로 여러 개의 pollfd구조체변수를 등록해서 이 중에 어떤 소켓에

입력이나 출력등의 신호가 왔는지를 판단해 주게 된다.

 

 

 

이 AsyncSocket클래스는 예제가 있어 사용하기에는 불편함이 없지만 TCP에 국한되어있고

사용하는데 불편한 점이 있어서 직접 클래스를 작성하기로 하였다.

 

select방식의 비동기 입출력

 

select 방식의 소켓의 방식을 알기 위해 www.sourceforge.net 에서 찾아보았다.

Asynchronous Socket Library로 검색하면 나오게 되는 예제소스가 있는데

Select의 동작방식은 알 수 있었지만 클래스단위로 구현되어 있지 않고 전역함수를 사용하는 등의 방식으로 이루어져 있어서 사용하기에 까다로워 보였다. 그래서 새로 하나 만들어보기로 했다.

우선 새로 만든 클래스는 소켓의 기본적인 역할을 하는 클래스와 이를 이용해서 비동기로 작동하게 하는 클래스를 만들었다.

 

기본 소켓 클래스

CSocket

이 클래스는 소켓이 할 수 있는 대부분의 동작을 메소드로 구현해 두었으며 이 클래스만 가지고 통신을 할 수 있게 만들었다.

생성자의 인자를 이용해 TCP나 UDP로 이용할 수 있게 만들어 두었다.

클래스 헤더는 다음과 같다.

 

#ifndef _CSOCKET_H_

#define _CSOCKET_H_

 

typedef int SOCKET;

 

class CSocket

{

private:

SOCKET m_sockfd;

short m_port;

uint m_ip;

int m_family ; //AF_INET

int m_type; //SOCK_STREAM or SOCK_DGRAM

int flag;

sockaddr_in m_addr;

static socklen_t m_addrlen;

sockaddr_in m_client_addr;

static socklen_t m_clientlen;

 

bool isNonBlock;

 

public:

 

CSocket();

CSocket(int family,int type,int protocol);

~CSocket();

int Send(char * buf,int length,int flag=0);

int Sendto(char * buf,int length,sockaddr* addr,socklen_t len);

int Recv(char * buf,int length,int flag=0);

int Recvfrom(char * buf,int length,sockaddr* addr,socklen_t* len);

int Bind(void);

int Connect(int retry);

int Listen(int backlog=5);

int Accept(int srvfd);

int Close();

int setToBroadcast();

int setSockOpt(int level, int optname, const void *optval, socklen_t optlen);

int setNonBlockSock();

int setaddr(const char* ip, int port);

int setsvraddr(const char* ip, int port);

int setSocket(int family, int type, int protocol);

int setSockfd(int fd);

int getfd();

 

};

 

#endif //_CSOCKET_H_

CAsyncSock

 

CSocket클래스 객체를 포함하는 클래스이다. 상속을 사용하지 않은 이유는 CAsyncSock클래스는 다중접속을 위한 클래스이고 CSocket클래스는 하나의 소켓만 고려한 클래스이기 때문에 상속을 받기에는 부적합하기 때문이다.

다음은 CAsyncSock의 클래스 선언부이다.

 

class CAsyncSock

{

private:

 

vector <int> fds;

vector<ConInfo> m_sockinfo;

int maxi;

int conNum;

fd_set read_fds, write_fds;

 

public:

CAsyncSock();

CAsyncSock(int maxNum

virtual ~CAsyncSock();

int Close(int i);

locker < vector <CSocket > > m_sockList; //socket array

void InitAsync();

int aListen(int domain, int type, int protocol, const char* ip, int port, int backlog);

int aConnect(int domain, int type, int protocol, const char* ip, int port, int retry, int t) ;

void AsyncNotificationLoop(bool noWrites=false);

unsigned int GetAvailBytes(int i);

int getconNum(void);

int getSockStatus(int i) ;

void increaseSock(int i, bool increase);

void Select(timeval *timeout, bool noWrites);

virtual int OnRead(int i);

virtual int OnWrite(int i);

virtual int OnClose(int i);

};

locker<> 클래스는 템플릿 인자를 상속받아서 만들어지는 클래스로 작업도중 뮤텍스락을 걸수 있도록 해서 못건드리도록 하는 작업을 하는 클래스이다.

 

Select함수를 이용했기 때문에 select메소드에서만 입력에 대해 확인하고 대응되는 동작은

OnRead나 OnClose함수를 재정의해서 사용하면 된다.

'기타 > 기술문서' 카테고리의 다른 글

visual assist 설정 및 단축키 설명서  (0) 2009.12.20
DB 연결샘플  (0) 2009.12.20
WCF 정리  (0) 2009.12.17
C# 패턴  (0) 2009.12.17
AVR_GCC 닷넷에서 사용하는 방법.  (0) 2009.12.17

+ Recent posts