평소 종이와 연필을 대체할만한 장비에 관심이 많았는데,

펀샵에서 와콤의 잉클링을 소개해 주는 바람에 또 한번 불이 붙어 버렸다.


초음파 방식의 전자펜은 이미 가지고 있지만, 1024레벨의 압력감지가 지원된다는 점이 끌렸다.

와콤의 제품답게 가격이 싼 편은 아니라 쉽게 지르지는 못하고,

차라리 갤 노트 10.1를 구매하는게 어떨까 싶어, 관련 제품을 알아봤다.


순위권에 들어온 제품은

아티브,

갤 노트 10.1,

ASUS Eee Note EA-800..


세 기기 모두 와콤 타블렛 기반의 기기라는 점!!


아티브는 가격이 비싼만큼, 가장 좋은 성능을 내는 것 같고, 

무엇보다 자주 쓰는 비지오를 직접 기기에서 사용할 수 있다는 점이 장점이다.

매장에서 만져본 바로는 아톰기반의 아티브도 꽤 쓸만한 듯 보였다.


갤 노트 10.1 은 아티브에 비해 저렴한 가격에 안드로이드 기반이라 여러 기능을 사용할 수 있다는 점이 장점이지만,

반대로 자주 쓰는 비지오와 호환되는 어플을 찾기 힘들다는게 문제!!


그러다 눈에 들어온 제품이 아수스의 Eee Note EA-800,

요즘 제품답지 않게 흑백 LCD(e-INK도 아니고!!)를 채용하고 있다.

백라이트 혹은 프론트 라이트가 없어서, 어두운곳에서는 사용 불가 이긴하지만, 

전자펜의 성능이 우수한 편이라는 평이 많다.

무엇보다 PC에 연결했을 경우 와콤 타블렛으로 인식이 가능하기 때문에 다양한 활용이 가능하다는 점이 큰 장점이다.

그리고 노트에 특화된 제품답게 노트용의 다양한 템플릿을 제공한다.

심지어 카메라까지 있어서 카메라로 찍은 사진을 바로 노트에 첨부가 가능하다.




결국, 가격대비 성능비가 좋다고 판단되어 아우스 EA-800을 중고로 구매하게 되었다.


관련 정보는


Jesse 라는 사람이 자신의 블로그에 리뷰를 아주 자세하게 해 놓았다.



Posted by mahnee

CentOS의 SELinux 덕에 여러가지 골치아픈 문제가 발생한다.


XE 설치 시, FTP 설정을 통해 "쉬운설치" 모드를 사용할 경우,

다음과 같은 설정이 필요하다.


setsebool -P httpd_can_network_connect=1


(웹서버가 네트웍 연결(FTP)을 가능하도록 하는 설정)


setsebool -P ftp_home_dir=1


(ftp로 접속시 사용자의 홈디렉토리로 접근을 못할경우)

(기본 홈디렉토리(/home)을 변경한 경우 발생)





[1] http://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1731&sca=1


Posted by mahnee

Altera Quartus 와 Modelsim을 이용하여 설계 및 시뮬레이션을 할 때,

Simulation Setting에 보면 "Use script to set up simulation" 이란 옵션이 있다.


Simulation을 할 때 TCL 스크립트를 이용하여 Modelsim의 Waveform 창에 보고 싶은 signal들을 추가하거나 하는 일들을 할 수 있다.

문제는 RTL Simulation할 때 추가했던 내부 블록의 signal들은 Synthesis 과정을 거치면서 신호의 계층구조나 이름이 엉망이 되기 때문에,

스크립트 실행 시 오류를 발생하면서 스크립트가 중단이 된다.

(※ 혹시 계층구조 및 신호 이름을 유지하면서 Synthesis가 되도록 하는 옵션을 아시면 댓글 부탁드립니다.)


이 글은 이런 문제를 막기 위해 RTL Simulation인지, GATE Simulation 인지 판별하여,

문제가 발생하는 스크립트 구문을 제외 시키기 위한 방법을 설명한다.


Altera Quartus의 시뮬레이션 옵션 중 "Use script to set up simulation"을 설정하면, 사용자가 추가로 실행 시킬 Script를 지정할 수 있다.


Altera Quartus는 modelsim 을 이용해 시뮬레이션 할 때 script 를 자동으로 생성하는데, 그 이름은 다음과 같다.


RTL Simulation : {$TopModuleName}_run_msim_rtl_verilog.do

GATE Simulation : {$TopModuleName}_run_msim_gate_verilog.do


만약 "test"라는 top module을 rtl simulation 할 때 test_run_msim_rtl_verilog.do 라는 파일이 생성되는 것이다.

따라서, 이 두 파일의 생성 혹은 변경 시간을 비교하여 simulation type 를 판별한다.


if {[file exists test_run_msim_rtl_verilog.do]} {

variable RTL_TIME [file mtime test_run_msim_rtl_verilog.do]

} else {

variable RTL_TIME 0

}


if {[file exists test_run_msim_gate_verilog.do]} {

variable GATE_TIME [file mtime test_run_msim_gate_verilog.do]

} else {

variable GATE_TIME 0

}


if {$RTL_TIME > $GATE_TIME} {variable SIM_TYPE RTL} else {variable SIM_TYPE GATE}


if {$SIM_TYPE == "RTL"} {

RTL Simulation 할 때 실행 되어야 하는 script들


if {$SIM_TYPE == "GATE"} {

Gate Simulation 할 때 실행 되어야 하는 script들


위 스크립트를 사용하면 simulation type 에 따라 SIM_TYPE 변수에 "RTL" 혹은 "GATE" 가 저장된다.



Posted by mahnee

자전거를 타면서 이동 경로를 기록하기 위해 BikeMate란 어플을 사용해왔다.

BikeMate는 무료인 Lite 버전과 유료인 GPS 버전이 있는데,


Lite 버전을 사용하다가 맘에 들어 GPS 버전을 구입하게 되었다.

그런데, Lite 버전에서 저장된 데이터를 GPS 버전으로 옮기고 싶은데,

공식적으로 이런 기능이 제공되질 않았다.

그래서 그동안 Lite 버전과 GPS 버전을 둘 다 설치해 두었었는데,

이번에 데이터 옮기는 방법을 알게 되어 공개한다.


필요한 툴:

iFunbox

SQLite Database Browser


자신의 환경에 맞는 버전을 준비한다.


iFunbox 를 통해 iPhone에 연결을 하고 앱 관리 화면에서 BikeMate GPS와 BikeMate Lite 를 찾는다.

어플을 열고 Documents 폴더 아래에 있는 내용을 PC로 각각 복사하고,

만약을 위해 백업을 해 둔다.(별도의 폴더에 복사하거나, 압축)


Documents 폴더의 파일 중

data.bikeapp 과 totaldata 두 파일이 데이터 저장에 사용된 듯 하다.

totaldata는 운동일지 화면에서 볼 수 있는 전체 운동 기록 내용이고,

data.bikeapp은 모든 데이터가 저장되어있다.


데이터는 SQLite라는 데이터 베이스를 사용하고 있다.


SQLite Database Browser를 이용하여 해당 파일들을 읽으면,

저장된 내용을 확인할 수 있다.


메뉴 중 Export를 사용하여 데이터 베이스를 sql 파일로 저장한다(Database to SQL file)

저장된 SQL파일은 텍스트 편집기를 사용하여 내용을 확인하고 편집할 수 있다.


totaldata는 다음과 같은 형태로 되어있다.

BEGIN TRANSACTION;

CREATE TABLE TotalData(id integer primary key, totaltime text, totaldistance integer, totalcalorie integer);

INSERT INTO TotalData VALUES(0,100076,229773.933594,6384);

COMMIT;

각 값은

100076 : 총 운동시간

229773.933594 : 총 이동거리

6384 : 전체 소모 칼로리

이다.


Lite 버전과 GPS 버전의 각 값을 합산해서 수정한 뒤 다른 이름으로 저장한다.

totaldata는 내용이 간단하므로 SQLite Database Browser 에서 직접 수정해도 무방하다.




data.bikeapp 은 모든 기록을 담고 있는 데이터 베이스 이므로 운동을 오래 했다면 양이 방대할 것이다. 

따라서 이를 편집하는데 많은 시간이 소모될 수 있다.


data.bikeapp은 다음과 같은 형태로 되어있다.

BEGIN TRANSACTION;

CREATE TABLE ContainMashupRoute(id integer primary key, contain bit, tempcontain bit);

INSERT INTO ContainMashupRoute VALUES(0,1,1);

INSERT INTO ContainMashupRoute VALUES(1,1,1);

INSERT INTO ContainMashupRoute VALUES(2,1,1);

.

.(생략)

.

CREATE TABLE FileInfo (id INTEGER primary key, filename text, starttime text, endtime text, avgspeed text,  maxspeed text, elapsedtime text, comment text, totaldistance text, author text, indexid integer, containcheck integer, calorie integer, completefile integer, unixtime integer);

INSERT INTO FileInfo VALUES(0,'제목','2012-04-08T00:51:24Z','2012-04-08T02:03:22Z',12.93,38.75,'01:10:31','',15.198,'작성자',1,0,433,1,4231);

INSERT INTO FileInfo VALUES(1,'제목','2012-04-08T02:23:19Z','2012-04-08T03:55:54Z',12.09,27.52,'01:32:14','',18.632,'작성자',1,0,534,1,5551);

INSERT INTO FileInfo VALUES(2,'제목','2012-04-14T08:03:49Z','2012-04-14T09:16:31Z',15.40,39.59,'01:12:22','',18.573,'작성자',1,0,531,1,4342);

.

.(생략)

.

CREATE TABLE PhotoInfoTemp (id integer primary key autoincrement, filename text, timestamp text, latitude text, longitude text, description text, imagefile blob, notgps integer, indexid integer, fileid integer);
INSERT INTO PhotoInfoTemp VALUES(1,'Photo0','2012/04/19 22:07:03',00.00,000.000,'인라인스케이트장',NULL,NULL,1,4);
INSERT INTO PhotoInfoTemp VALUES(2,'Photo1','2012/04/19 22:07:24',00.0000,000.000,'',NULL,NULL,1,4);

.

.(생략)

.

CREATE TABLE "GpsInfo0" (id INTEGER PRIMARY KEY AUTOINCREMENT, latitude TEXT, longitude TEXT, altitude TEXT, timestamp TEXT, file_id INTEGER, photoid integer, filename text, comment text, photodate text, photoindex integer, photoname text, calorie integer, speed text);
INSERT INTO GpsInfo0 VALUES(1,00.000000,000.000000,00.000000,'2012-04-08T00:51:52Z',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2.079368);
INSERT INTO GpsInfo0 VALUES(2,00.000000,000.000000,00.000000,'2012-04-08T00:51:53Z',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2.401604);
INSERT INTO GpsInfo0 VALUES(3,00.000000,000.000000,00.000000,'2012-04-08T00:51:54Z',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2.896223);
INSERT INTO GpsInfo0 VALUES(4,00.000000,000.000000,00.000000,'2012-04-08T00:51:55Z',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,3.490555);

.

.(생략)

.

CREATE TABLE sqlite_sequence(name,seq);
INSERT INTO sqlite_sequence VALUES('GpsInfo0',3589);
INSERT INTO sqlite_sequence VALUES('GpsInfo1',4700);
INSERT INTO sqlite_sequence VALUES('GpsInfo2',3654);

.

.(생략)

.

COMMIT;

데이터 수정이 필요한 테이블들만 정리를 했다.

ContainMashupRoute 테이블은 메쉬업으로 데이터 공유를 할 때 쓰는 정보인듯하고,

FileInfo 테이블은 앱의 이동경로 목록 창에서 보여지는 내용들이다.

PhotoInfoTemp 테이블은 앱을 이용해 찍은 사진과 관련된 내용들이고,

GpsInfo0 테이블은 이동경로 목록의 첫번째 경로에 해당하는 GPS 로그이다.

sqlite_sequence 는 각 이동경로에 로그가 얼마나 많이 저장되어있는지 기록해 놓은 듯 하다.


가장 먼저 할일은 FileInfo 테이블을 보고 날짜 순으로 정렬을 하는 것이다.

일반적으로 Lite 버전을 먼저 사용하고 GPS 버전을 나중에 사용하는 것일테니,

Lite 버전은 그대로 GPS 버전의 내용은 빨간색 ID번호를 순서에 맞게 변경해 주면 된다.


그 다음은 ContainMashupRoute 테이블과 sqlite_sequence 테이블을 위에서 수정한 것과 동일하게 통합 후 ID(빨간색 숫자)를 수정한다


사진의 경우는 Documents 폴더에 사진파일이 저장되고, 해당 파일의 이름이 PhotoInfoTemp 테이블의 두번째 필드에 기록되어있다.(Photo0, Photo1 등)

FileInfo 와 마찬가지로 날짜 순서대로 번호를 수정해 주면 될 듯 하다.

(이동경로 기록 중 찍은 사진의 경우 어떤 방식으로 저장되는지 확인 불가)

(아마도 사진의 ID(파란색 숫자)가 GpsInfox 테이블의 photoid에 기록될 것으로 예상)



GpsInfox 테이블의 경우 각 경로의 GPS 로그를 기록한 것이기 때문에 데이터 양이 상당히 많다.(x는 각 경로의 ID번호)

따라서 텍스트 편집기의 "찾아 바꾸기" 기능을 이용하는 것이 편하다.

팁이라면, GpsInfo0 테이블의 처음에 커서를 두고, 검색 방향을 아래로, 끝까지 찾은 후 처음으로 돌아가기 기능은 끄고,

단어단위로, 큰 번호 순으로 수정하면 된다.

(예, "GpsInfo10" -> "GpsInfo15")


다음은 SQLite Database Browser를 실행하고 sql 파일을 Import 하면 데이터 베이스가 생성된다.

내 경우에는 에러가 발생했는데, 데이터에는 문제가 없는 것으로 확인됐다.

저장 버튼이 활성화 되지 않는 경우 아무 데이터나 직접 수정 후 되돌려 놓고, 저장하면 된다.


수정된 data.bikeapp 파일과 totaldata 파일을 다시 iFunbox 를 이용해 BikeMate GPS의 Documents 폴더로 복사하면 된다.

※만약 Lite 버전에서 찍은 사진도 옮기는 경우 테이블을 변경한 것과 마찬가지로 파일명도 변경해야 하는 것을 잊지 말아야 한다.


다음은 데이터를 옮기기 전 스샷과 옮긴 후 스샷


    

<통합 전>                                                     <통합 후>


    

<통합 전 Lite 버전>                                       <통합 전 GPS 버전>



<통합 후 GPS 버전>


Posted by mahnee

for Kindle Touch

UART Port

78172-0003(Connector-Female, cable side)

http://www.icbanq.com/P000781050/S


78172-0410(Clamp)

http://www.icbanq.com/P001943127/S


78171-0003(Connector-Male, board side)

http://www.icbanq.com/P000775796/S


for 콤팩트 에그

78172-0002(Connector-Female, cable side)

http://www.icbanq.com/P000786595/S


78172-0410(Clamp)

http://www.icbanq.com/P001943127/S


78171-0002(Connector-Male, board side)

http://www.icbanq.com/P000620565/S



※ 2016. 7. 13. 링크 수정.

Posted by mahnee

Conglatulations!

BloggerPlus is ready for you.

This content was posted by BloggerPlus.

 

You can visit

  1. AppStore : http://itunes.apple.com/app/bloggerplus-2/id542109761?ls=1&mt=8
  2. Support : http://www.codediary.com/product/BlogNow

 

Posted by mahnee

구글 크롬을 사용하는데 최근 들어 빈번하게 발생하는 문제가

Flash 의 먹통 이었다.


flash가 들어간 페이지가 열리면, 크롬 자체가 먹통이 되어버리는 문제..


www.adobe.co.kr 에서 플러그인을 다시 설치해봐도 해결이 되지 않았는데,

다음과 같은 방법으로 해결을 했다.


구글 크롬에서 주소창에 chrome://plugins 를 치면,

크롬에 설치되어 있고 사용중인 플러그인들을 볼 수 있다.


오른쪽의 "+세부정보"를 클릭하면 상세 내용을 볼 수 있는데,

Flash 플러그인은 총 3개의 파일이 사용중이었다.


이 중 11.3.r300 버전이 새로 설치한 버전이며, 

파일의 위치를 보면 다른 두 개와 다른 위치인 것을 알 수 있다.


크롬 설치 폴더에 있는 플래시는 "사용 중지"를 하고

새로 설치된 플래시만 "사용"으로 하니 충돌현상이 사라졌다.




Posted by mahnee

K-Display(PCBANK, 3View Systems?) 의 3D 모니터를 사용중이다.

3D지원에 HDTV까지 되는 녀석이라 구매했는데,


3D를 사용하려면 iZ3D 드라이버를 설치해야 한다.

문제는 이 드라이버가 무료 버전이 아니라는 것이다.

예전에는 무료로 제공이 됐는데 유료로 전환 된것인지 모르겠는데,

어쨌든, 30일 평가 기간이 지나면 유료 결제를 해야 사용이 가능했다.


왠만하면 결제해서 사용할까 했는데, 또 다시 문제가 발생했다.

이 드라이버를 개발한 사람들이, 드라이버를 open source 로 전환하기 위해

Fund 모집을 했는데, 이게 잘 진행이 되지 않은 것인지.

open source 로 전환되지 않고 아예 지원을 끊어버렸다.


그래서 검색을 해보니, 이 드라이버의 평가 기간을 초기화 시키는 방법이 존재했다.


http://3d-vision.kr/186495


윗 글은 윈도우 7 환경을 기준으로 설명되어있다.

글의 요지는,

C:\ProgramData 폴더에 iZ3D 드라이버가 생성하는 폴더를 삭제한 후,

레지스트리에서 관련 정보를 제거하는 것!


문제는 생성되는 폴더 이름이 일정하지 않다는 것,

하지만 설치된 드라이버의 날짜나 버전에 따라 바뀌는 것이며,

한 번 설치된 후에는 항상 같은 이름으로 생성되는 것 같다.

레지스트리에 저장되는 키 이름도 마찬가지


따라서, 이 두 가지를 삭제하는 배치파일을 작성하여 부팅시마다 적용되도록 했다.


rmdir /s /q C:\ProgramData\폴더이름

reg delete HKEY_CURRENT_USER\Software\Microsoft\MSDAIPP\Provider\키이름 /f


주의할 점은 폴더를 삭제할 때 묻지 않고 강제 삭제해 버리기 때문에,

누군가 배치파일 내용을 바꿔치기 해버리면,

컴을 켜는 순간 하드가 순삭 될 수도 있다는 점! ^^;



Posted by mahnee
※ 글을 작성하고 확인해보니 앱스토어에서 검색이 안되고 있습니다. 왜 그런지 모르겠네요.

가끔 유닉스나 리눅스에서 작업을 하다 보면

언제 끝날지 모르는 명령을 실행해 놓고 하염없이 기다릴 때가 있다.


시간이 오래 걸리는 컴파일이라던가,

시뮬레이션이라던가....


컴퓨터 앞에 있다면 명령어 뒤에  ; echo -e "\a"  를 추가하면

명령이 종료될 경우 소리로 알려주기 때문에

어느정도 맘 놓고 다른 일을 할 수 있다.


하지만, 소리로 알려주는건 짧은 시간이고 

잠시 자리를 비운 사이 알람이 울리면 알 수가 없다.


요즘 아이폰을 쓰면서, "푸시 알림"으로 "작업이 끝났음을 알려주면 좋겠다"라고 생각했었는데,

방법이 있어서 소개하려 한다.


아이폰 어플 중에는 오직 푸시 알림을 보내기 위한 용도의 어플들이 있다.

그 중에 "pushme.to"(제작사 홈페이지)란 어플은,

어플 사용자가 아니더라도 웹 위젯을 통해 푸시 알림을 보낼 수도 있기 때문에,

잘 사용하면 아주 유용한 어플이 될 수 있을 것 같다.


pushme.to for iPhone [Free]


pushme.to for iPad [$?]


어플을 설치하고, 가입을 한 뒤

홈페이지에서 로그인을 하면


홈페이지 오른쪽 상단에 "export widget" 이란 메뉴가 있다.



이 메뉴는 자신의 홈페이지나 블로그에 자신에게 푸시 알림을 보낼 수 있는 위젯을 붙일 수 있는 소스를 만들어 준다.


위젯은 간단한 html 소스로 되어 있으므로, 쉽게 추가할 수 있다.


이것을 이용해 유닉스/리눅스에서 사용가능한 푸시 알림 보내기 쉘 스크립트를 작성했다.


위젯에서 사용하는 폼의 주요 변수는 다음과 같다.


form action : "http://pushme.to/자신의ID/"

_encoding : 문자인코딩(default : UTF-8)

message : 보낼 메세지

signature : 보내는 사람 이름


유닉스/리눅스에는 command line 에서 웹에 접근할 수 있는 명령어가 있기 때문에,

이 명령어를 이용해 스크립트를 작성했다.


#!/bin/sh


curl -s -o /dev/null -d "_encoding=UTF-8&signature=hostname&message=$1" http://pushme.to/ID/


curl 은 command line 에서 HTTP, FTP 등의 URL을 접근할 수 있는 명령어이다.

-s 와 -o /dev/null 옵션은 아무 출력도 안하도록 한 것이다.

-d 옵션은 POST 방식으로 전달될 데이터 들이다.


_encoding 은 리눅스의 경우 한글 문자셋을 UTF-8을 쓰기 때문에 기본값을 그대로 사용했다.

signature 는 서버의 호스트 이름으로 지정해 어느 서버에서 온 메세지 인지 확인 가능하도록 했다.

message 는 스크립트 명령의 인자로 받도록 했다.


이렇게 간단한 스크립트를 pushmeto 라는 이름으로 저장하고, 실행 퍼미션을 준 뒤

시간이 오래 걸리는 명령어를 실행할 때,

명령어 뒤에  ; pushmeto "메세지"  를 추가하면, 

작업이 끝난 뒤 아이폰으로 푸시 알림을 받을 수 있다.



Posted by mahnee
오랫만에 구석에 쳐박혀있던 MDR(Minidisc Recorder)을 꺼내 보았다.
구입한지는 거의 10년 정도 된듯..

옛날 생각도 나고 해서 MD를 다시 듣는데.. 
광녹음도 실패하고, 타이틀링도 힘들고 이래저래 해서...

리모콘을 분석해보기로 했다.
L7R의 리모콘은 다음과 같이 생겼다.

L7R의 리모콘 커넥터는 다음과 같이 생겼다.

리모콘을 분해해서 선을 떼어내어, 테스터기로 전압 및 전압 측정 후,
일부 입력 신호를 예상한 후 하나하나 붙여가며 동작시켜 다음과 같이 신호를 알아냈다.

오디오 신호
1. 파란색 - Audio Left
2. 주황색 - Audio Right
3. 검정색 - Audio Ground

리모콘 신호
4. 피복없는 빨간색 - Signal Ground
5. 노란색 - Control
6. 하얀색 - Power(2.3V)
7. 분홍색 - Display Data
8. 빨간색 - Backlight Power(2.7V)

5.노란색은 리모콘 버튼에 따른 저항값이 출력됨. 
초기 상태에서 212.9K
Off - 6.82K
Play mode - 72.5K
Sound - 35.6K
Display - 50.6K
<< - 10.11K
Hold - 0
다른 버튼들은 부정확함.

6. 하얀색 신호는 전원인듯, 2.3V출력됨.
7. 분홍색은 본체로 부터 오는 display data인 듯, 통신프로토콜은 추후 분석, uart일것으로 추측
   분홍색 선이 연결되지 않을 경우 아예 디스플레이가 되지 않음.
8. 빨간색은 백라이트 전원으로 백라이트 동작시 2.7V 정도임.
   빨간색 선이 연결되지 않을 경우 디스플레이는 되지만, 백라이트가 켜지지 않음.

타이틀링은 노란색 control 신호를 이용하여 각 버튼에 맞는 저항값을 컨트롤 해야 할 것 같다.
아니면 ADC로 입력을 받을테니, DAC를 사용하여 전압을 조절하던가..
아마도 타이틀링 모드로 들어가는 저항값이 있지 않을까 추측 중..


Posted by mahnee
이전버튼 1 2 3 4 5 6 7 이전버튼

블로그 이미지
온갖 자작과 공학 전반에 걸쳐 관심이 많은 ..
mahnee
Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함