일단 wii용 에뮬은 돌리는데에 문제가 좀 많군요. 그래픽카드나 pc사양이 좋아야 할 듯.
그리고 오픈소스로 진행중이다보니 개발중인 버전을 받아서 테스트를 해볼 수 있습니다.
안정적인 버전이 현재 R4771인 듯 한데, 이 버전을 받아서 해보니 마리오카트 등 게임이 잘 안되더라구요. 그래서 누가 R5017버전 올렸길래 한번 받아서 해봤더니 마리오카트는 잘 되더라구요(물론 구동만 잘 되고, 느리게 돌아갑니다-_-)
난 wii도 있는데, 이짓을 해본거지-_- 난 정말 할일이 없는 사람인 듯......-_-

암튼 wii에뮬 홈페이지입니다. 여기서 다운로드할 수 있습니다.
http://www.dolphin-emu.com/downloads.php?cat_id=7

최근 개발버전은 svn에서 확인할 수 있어요. 구글코드로군요.
http://code.google.com/p/dolphin-emu/

iso파일은 불법이니 알아서들 구하세요~

1. wii용 리모콘이 인식 됨.
일단 wii용 컨트롤러로 pc에서 게임을 할 수 있습니다. wii용 리모트 컨트롤러는 블루투스 방식이기 때문에 해당 pc나 노트북이 블루투스를 지원을 하게 되면 컨트롤러로 추가할 수 있습니다. 추가하고, 게임 구동하고 컨트롤러에 빨간 버튼 누르니 인식하네요.
단, 그 바는 어디다가 연결할 수가 없는데, 그래서 모션같은 건 컨트롤 할 수 없네요. 어떤 분이 촛불을 세워놓으면 된다곤 했는데, 그렇게 까지 리모콘으로 하고 싶진 않......-_-

가상 WII 리모콘으로 처음에 설정이 되어있는데요. 이건 마우스가 리모콘이 되버립니다. 조작해보면 알겠지만, 편할 것 같지만 서도 엄청 불편합니다-_-

2. 안돌아가는 게임이 좀 있음
메탈슬러그를 가지고 있는데, 그냥 오프닝 영상에서 클릭해버리면 다운되더니 끝나네요-_-
wii뮤직은 잘 되는 것 같고...... 최근에 나온 동물의 숲은 컨트롤러가 안 먹히는군요.
돌핀 r4771(안정버전이라고 공식홈페이지에 올려놓은...-_-)버전에선 마리오 카트도 안되고, 뭐 다 안되더라구요. 나중에 막 깨져요.
사용자 삽입 이미지

마리오카트는 느리지만, 잘 작동됨.

사용자 삽입 이미지

A버튼 누르는 순간 다운-_-

사용자 삽입 이미지

컨트롤러가 안 먹힘-_- 그래픽도 다 안나오는 듯.


3. 최악의 속도
제 노트북은 2.66GHz듀얼코어, 4g램에 geforce 9300mgs인데, 조낸 느립니다. 일단 노트북이고 그래픽카드가 쪼끔 안 좋은데, 고사양에서는 어떨지는 모르겠네요. 사양이 좋으면 돌리는데에는 무난할 듯. 쿼드코어에 조낸 비싼 그래픽 카드 정도?(이 장비를 사느니 wii본체를 사는게 더 싸게 먹....)

4. 구운 시디를 직접 구동 가능
iso파일 뿐만 아니라 iso파일을 구운 시디에서 구동도 가능합니다. 물론 로딩시간이 좀 더 길어지네요.

5. 구동영상

뭐 아직은 멀었다고 말하고 싶네요. 그나저나 nintendo계열의 게임기가 뚫리기 가장 쉬운가봅니다. ps나 xbox는 그런거 안뜨는 것 같은데. 더 간단하고 그래서 그런가....
ps2에뮬도 있는데, 이것도 컴 사양이 엄청 좋아야지 할 수 있죠^^
wii 게임이 하고 싶으시다면 고생하지 마시고, wii하나 사세요-_-
머드초보 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
앱엔진에 뭔가 제 사이트를 만들고 싶어서 이렇게 삽질을 하고 있는데, 망할 제한이 왜이렇게 많지-_-

암튼, "구글 앱 엔진"에서는 JPA를 지원합니다. 하지만, 이상하게도 잘 안됩니다-_- 굉장히 제한적으로 이것저것 막아둔 것 같습니다. 사실 구글 앱 엔진에서는 DataBase를 BigTable인지 뭐시기인지 그걸 사용하고, 직접적으로 접근을 못하기 때문에(전부 프로그래밍 또는 관리페이지(관리페이지도 매우 제한적인-_-)에서만 관리 가능), 이걸 이용하는 API에서도 엄청나게 뭔가 막아둔 것 같습니다.
뭐 좀 해보려고 하면 에러를 내뱉습니다. 검색해보면 구글앱엔진에서만 나는 에러입니다-_- 사실 아직 구글앱엔진이 프리뷰버전이기에 뭐라 따지지도 못하는 게 사실입니다^^ 정식버전(언제나오려나....Beta딱지 떼는데 10년넘게 걸리겠지-_-)나오면 매우 안정화가 되지 않을까 싶습니다^^

암튼, Spring3 + JPA의 조합으로 앱엔진에 올리는 건 성공했는데, 사실 스프링에서 제공하는 TransactionManager를 사용했어야 했는데, JPATemplate으로 뭔가 처리를 하면 잘 안되더군요-_- 일단 가져오고, persist하고, 이런건 잘 되는데, 왜 삭제가 안될까요-_- 삭제가 안되서 그냥JPATemplate빼고 했습니다-_-
JPATemplate사용해서 성공하신 분 트랙백좀 ㅠㅠ

0. 환경
Eclipse 3.5 + Google AppEngine Plugin + Spring 3.0.0
일단 스프링3다운로드 - http://www.springsource.org/download

1. 프로젝트 생성
New Project -> Google에 있는 Web Application Project 선택.
Project Name은 SosiSchedule. package는 com.mudchobo.
Use Google Web Toolkit은 체크해제. 사용안할꺼라....(이것도 언제한번 공부해야하는데-_-)
Finish.

2. 라이브러리 복사 및 build path추가
spring3에서는 spring.jar가 산산조각 났어요. 필요한 것만 넣으면 되는 듯.
일단 제가 사용한 것은....
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.orm-3.0.0.RELEASE.jar
org.springframework.web.servlet-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
그리고, jstl을 사용할 것이기에....
jstl.jar와 standard.jar
※이번버전에서는 lib폴더가 없습니다-_- 어디서 찾아야하는 거지-_- 암튼 그래서 2.5.6버전에서 가져왔습니다^^

앱엔진에서는 lib폴더 복사로 libpath가 잡히지 않네요. 그래서 각각 다 추가해줘야한다는...-_-
일단 war/WEB-INF/lib폴더에 복사 후에 복사한 파일 선택 후 오른쪽버튼 후, Build Path -> Add to Build Path 선택하면 됩니다^^

3. web.xml파일 수정
web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/sosischedule/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

일단 sosischedule/*요청은 spring이 받습니다.

4. dispacher-servlet.xml파일과 persistence.xml파일 생성
war/WEB-INF/폴더에 생성
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.mudchobo" />

<bean id="entityManager"
factory-bean="EMF"
factory-method="get" />

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
</beans>


src/META-INF/ 폴더에 생성
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
</properties>
</persistence-unit>
</persistence>


5. EMF클래스 생성.
이제 jpa접근할 수 있는 EntityManagerFactory클래스(EMF)를 생성해봅시다.
com.mudchobo.sosi.sosischedule.dao.EMF.java
package com.mudchobo.sosischedule.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.springframework.stereotype.Component;

@Component
public final class EMF {
private static final EntityManagerFactory emfInstance =
Persistence.createEntityManagerFactory("transactions-optional");

private EMF() {}

public EntityManager get() {
return emfInstance.createEntityManager();
}
}


6. Entity클래스 생성
일단 Sosi와 Schedule이라는 Entity를 생성할 건데요. 둘의 관계는 1:N관계입니다.
com.mudchobo.sosischedule.entity.Sosi.java
package com.mudchobo.sosischedule.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import com.google.appengine.api.datastore.Key;

@Entity
public class Sosi implements Serializable {
private static final long serialVersionUID = 5448408922872112420L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key key;

private String sosiName;

@OneToMany(mappedBy="sosi", cascade=CascadeType.ALL)
private List<Schedule> scheduleList = new ArrayList<Schedule>();

public Key getKey() {
return key;
}

public void setKey(Key key) {
this.key = key;
}

public List<Schedule> getScheduleList() {
return scheduleList;
}

public void setScheduleList(List<Schedule> scheduleList) {
this.scheduleList = scheduleList;
}

public String getSosiName() {
return sosiName;
}

public void setSosiName(String sosiName) {
this.sosiName = sosiName;
}

public Sosi() {

}

public Sosi(Key key, String sosiName) {
super();
this.key = key;
this.sosiName = sosiName;
}
}

com.mudchobo.sosischedule.entity.Schedule.java
package com.mudchobo.sosischedule.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

@Entity
public class Schedule implements Serializable{
private static final long serialVersionUID = -8676837674549793653L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

private String program;

@ManyToOne(fetch=FetchType.LAZY)
private Sosi sosi;

public Sosi getSosi() {
return sosi;
}

public void setSosi(Sosi sosi) {
this.sosi = sosi;
}

public Key getKey() {
return key;
}

public void setKey(Key key) {
this.key = key;
}


public String getKeyString() {
return KeyFactory.keyToString(key);
}

public String getProgram() {
return program;
}

public void setProgram(String program) {
this.program = program;
}

public Schedule() {
}

public Schedule(String program, Sosi sosi) {
this.program = program;
this.sosi = sosi;
}
}

일단 App Engine용 JPA에서는 ID 타입이 Long이면 관계형태를 사용할 수 없더라구요. 그래서 앱엔진에서 제공하는 Key타입이 있는데, 이걸 이용해야합니다.

7. Dao만들기
com.mudchobo.sosisochedule.SosiDao.java
package com.mudchobo.sosischedule.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.google.appengine.api.datastore.KeyFactory;
import com.mudchobo.sosischedule.entity.Schedule;
import com.mudchobo.sosischedule.entity.Sosi;

@Repository
public class SosiDao {
private EntityManager em;

@Autowired
public void setEntityManager(EntityManager em) {
this.em = em;

// 소시데이터 추가
addSosi(new Long(1), "효연");
addSosi(new Long(2), "윤아");
addSosi(new Long(3), "수영");
addSosi(new Long(4), "유리");
addSosi(new Long(5), "태연");
addSosi(new Long(6), "제시카");
addSosi(new Long(7), "티파니");
addSosi(new Long(8), "써니");
addSosi(new Long(9), "서현");
}

public void addSosi(Long id, String sosiName) {
em.getTransaction().begin();
em.persist(new Sosi(KeyFactory.createKey(Sosi.class.getSimpleName(), id), sosiName));
em.getTransaction().commit();
}

@SuppressWarnings("unchecked")
public List<Sosi> getSosiList() {
return em.createQuery("select s from Sosi s").getResultList();
}

public Sosi getSosi(Long sosiId) {
return em.find(Sosi.class, sosiId);
}

@SuppressWarnings("unchecked")
public List<Schedule> getScheduleList(final Long sosiId) {
Query q = em.createQuery("select s.scheduleList from Sosi s where s.key = :key");
q.setParameter("key", KeyFactory.createKey(Sosi.class.getSimpleName(), sosiId));
return (List<Schedule>) q.getSingleResult();
}

public void addSchedule(Long sosiId, String program) {
em.getTransaction().begin();
Sosi sosi = em.find(Sosi.class, sosiId);
sosi.getScheduleList().add(new Schedule(program, sosi));
em.getTransaction().commit();
}

public void deleteSchedule(String scheduleKey) {
em.getTransaction().begin();
Schedule schedule = em.find(Schedule.class, scheduleKey);
em.remove(schedule);
em.getTransaction().commit();
}
}

EntityManager받을 때 디폴트로 데이터를 넣어줘야 합니다(아까 위에서 말했듯이 프로그래밍적으로만 테이블을 생성할 수 있어서 이런 형태로 데이터를 넣어줘야합니다ㅠㅠ)

일단 실행해보고 데이터가 잘 생성되었는지 보려면 아래와 같은 주소로 접속해보면 됩니다.
http://localhost:8888/_ah/admin
일단 보고 삭제까지는 되는데, 테이블 생성같은 건 안되더라구요. 그리고 여기서 보여지는데에는 한글이 깨지는데 나중에 출력해보면 잘 나오니 걱정마시길-_-
사용자 삽입 이미지
8. Service 클래스 생성
com.mudchobo.sosischedule.service.SosiService.java
package com.mudchobo.sosischedule.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mudchobo.sosischedule.dao.SosiDao;
import com.mudchobo.sosischedule.entity.Schedule;
import com.mudchobo.sosischedule.entity.Sosi;

@Service
public class SosiService {

@Autowired
private SosiDao sosiDao;

public List<Sosi> getSosiList()
{
return sosiDao.getSosiList();
}

public Sosi getSosi(Long sosiId) {
return sosiDao.getSosi(sosiId);
}

public List<Schedule> getScheduleList(Long sosiId) {
return sosiDao.getScheduleList(sosiId);
}

public void deleteSchedule(String scheduleKey) {
sosiDao.deleteSchedule(scheduleKey);
}

public void addSchedule(Long sosiId, String program) {
sosiDao.addSchedule(sosiId, program);
}
}

Service에서 하는 역할은 뭐 없네요-_-

9. Controller생성
스프링3.0에서 새로 추가된 기능인 REST기능입니다.
com.mudchobo.sosischedule.controller.SosiController.java
package com.mudchobo.sosischedule.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.mudchobo.sosischedule.entity.Schedule;
import com.mudchobo.sosischedule.entity.Sosi;
import com.mudchobo.sosischedule.service.SosiService;

@Controller
public class SosiController {
private static String PREFIX = "/sosischedule";

@Autowired
private SosiService sosiService;

@RequestMapping(value="/", method=RequestMethod.GET)
public String index(Model model) {
List<Sosi> sosiList = sosiService.getSosiList();
model.addAttribute("sosiList", sosiList);

return "index";
}

@RequestMapping(value="/schedule/{sosiId}", method=RequestMethod.GET)
public String getSchedule(
@PathVariable("sosiId") Long sosiId,
Model model) {
Sosi sosi = sosiService.getSosi(sosiId);
List<Schedule> scheduleList = sosiService.getScheduleList(sosiId);
model.addAttribute("scheduleList", scheduleList)
.addAttribute("sosi", sosi);

return "sosi";
}

@RequestMapping(value="/schedule/{sosiId}/add", method=RequestMethod.POST)
public String addSchedule(
@PathVariable("sosiId") Long sosiId,
@RequestParam("program") String program,
Model model
) {
sosiService.addSchedule(sosiId, program);

return "redirect:" + PREFIX + "/schedule/" + sosiId;
}

@RequestMapping(value="/schedule/{sosiId}/{scheduleKey}", method=RequestMethod.GET)
public String removeSchedule(
@PathVariable("sosiId") Long sosiId,
@PathVariable("scheduleKey") String scheduleKey,
Model model) {
sosiService.deleteSchedule(scheduleKey);

return "redirect:" + PREFIX + "/schedule/" + sosiId;
}
}


10. View jsp파일 생성
소시 리스트를 보여주는 index파일 입니다.
war/WEB-INF/jsp/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>소녀시대 스케줄</title>
</head>
<body>
<div>
스케줄 확인하기
<ul>
<c:forEach var="sosi" items="${sosiList}">
<li><a href="/sosischedule/schedule/${sosi.key.id}">${sosi.key.id}. ${sosi.sosiName}</a></li>
</c:forEach>
</ul>
</div>
</body>
</html>


해당 소시의 스케줄을 보여주는 스케줄 파일입니다.
war/WEB-INF/jsp/sosi.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>소녀시대 스케줄</title>
</head>
<body>
<div>
스케줄 확인하기
<ul>
<c:forEach var="sosi" items="${sosiList}">
<li><a href="/sosischedule/schedule/${sosi.key.id}">${sosi.key.id}. ${sosi.sosiName}</a></li>
</c:forEach>
</ul>
</div>
</body>
</html>

리다이렉트를 위한 파일입니다. 기존 index.html파일 지우시고, index.jsp파일 생성
index.jsp
<% response.sendRedirect("/sosischedule/"); %>


앱엔진에 올려보았습니다.
http://2.latest.mudchobosample.appspot.com/sosischedule/

잘 되는 것 같네요.
머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/470
  2. 비밀방문자 2010/02/08 20:00  편집/삭제  댓글 작성  댓글 주소

    관리자만 볼 수 있는 댓글입니다.

[로그인][오픈아이디란?]
VMWare가 한건했네요-_-
저 같은 사용자를 위해 이런 것이 나와주다니 너무 고맙네요. VMWare에서도 OSX Snow Leopard를 거의 완벽하게 지원하게 만들어버렸습니다.
주 OS를 OSX를 사용하겠다는 사람들에게는 맥을 사거나 해킨토시를 이용해 설치하거나 하면 됩니다. 그리고, Windows는 vmware나 페럴러즈같은 가상머신으로 너무 잘 돌아가니 이렇게 설치를 하면 되는데, 주 OS가 Windows이고 가끔 아이폰개발을 위해 osx를 사용하고 싶은 사용자는 선택의 여지가 없었습니다-_- VMWare 6대 버전에서는 너무 느리게 돌아가고 제대로 지원이 안되었기 때문이죠.
하지만, VMWare7에서는 메인보드에서 가상화를 지원하면 아마 이걸 이용해서 속도개선을 한 듯 보여요.
이제 Windows에서 가상머신으로 vmware를 통해 osx snow leopard를 설치할 수 있습니다. 물론 공식적인 지원은 아닙니다. 근데, 속도는 정말 빠르군요. 일부러 노리고 만들었나-_-

사용자 삽입 이미지
업데이트도 잘됩니다. 그리고, 프로세서는 4.30ghz로 나오네요. 메모리는 2gb로 해야 부드럽게 잘 돌아가는 듯.
아....제 노트북 사양은 2.66GHz 듀얼, 4gb입니다. z36입니다. 설정시에는 메모리 2gb로 잡았죠.

설치 도움사이트.
OSX가상머신만들기 : http://blog.naver.com/baljern/140098696647
OSX설치하기: http://blog.naver.com/baljern/140098695323
OSX VMWare Tools 설치하기 : http://blog.naver.com/baljern/140098695308

여기서 해킨토시 h-sl106.iso 파일이 필요합니다. 알아서 구하셔야......-_-

그리고, 사운드와 그래픽이 조쿰 느린 것을 느끼게 되는데, 이건 드라이버를 설치해야합니다.
저 같은 경우 여기서 받은 드라이버를 설치하니 잘 되더라구요^^ 아래 요술램프 지니효과나 dock효과 등도 부드럽게 잘 나오더라구요. 사운드도 처음엔 안나왔는데 설치하니 잘 나옵니다.

http://vmsvga2.sourceforge.net/
Download VMsvga2 files 클릭 후, Video에는 Common용으로 받으면 되구, Audio오는 Snow Leopard랑 Leopard용이 구분해 있으니 알아서 받으시면 될 듯.

그리고, 잠자기 모드로 들어가는 것을 꺼줘야 합니다.
시스템 환경설정 -> 에너지 절약 메뉴에 있어요~ 거기서 그냥 둘 다 사용안함으로 해주시면 돼요.

아래는 구동영상을 한번 찍어봤어요.
캡쳐중이라서 그런지 조금 버벅이는 면이 있지만, 보시다시피 아이폰 개발하는데에는 전혀 지장을 주지 않을 정도로 부드럽습니다.

나도 아이폰개발해보자-_-
머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/468
  2. 이민철 2010/01/23 01:27  편집/삭제  댓글 작성  댓글 주소

    굉장하네요!!
    좋은 정보 공유 고맙습니다!

[로그인][오픈아이디란?]
« Prev : 1 : 2 : 3 : 4 : 5 : ... 153 : Next »