2010년 4월 30일 금요일

[jsp] 팝업창 띄우기



팝업창을 뜨게 하실려면 일단 javascript를 쓰셔야 겠네요~
<A href="javascript:window.open('admin.jsp')">관리자 창</A>
이렇게 하시면 창이 뜨겠죠...
그리고 admin.jsp 팝업 창에서

<script language="javascript">
<!--
function sendit()
{
if (document.frm.num.value == "") {
alert("관리자 번호를 입력하세요.");
document.frm.find.focus();
return false;
}
document.frm.submit();
}
//-->
</script>
<form name = "frm" action="admin_end.jsp">
관리자 번호 : <input type=text name = num>
<a href="javascript:sendit()">확인</a>
</form>

하시면 입력받은 값이 admin_end.jsp로 넘어가죠
admin_end.jsp에서는
String num = request.getParameter("num");
받으셔서 데이터베이스에서 비교하시고
하셔서 값이 있을때는 다음 페이지로(물론 값도 함께 넘겨 줘야죠~~) 없을때는
이전 페이지로 가면 되겠죠..
<%
String num = request.getParameter("num");
String query = "select num from admin where num = '"+num+"'";
rs = stmt.executeQuery(query);
if(rs.next()){
%>
<script language="javascript">
<!--
opener.location.href="main.jsp?value3=<%=rs.getString("num")%>";//다음 페이지에 관리번호를 넘긴다
window.close();//팝업창 닫기
//-->
</script>
<%
}else{
%>
<script language="javascript">
<!--
alert("관리자 번호 입력 오류");
window.location.href="admin.jsp";//관리자 번호가 없는 경우 이전 창으로 간다~
//-->
</script>
<%
}
%>

[jsp] jsp에서 자기가 만든 class import 하기[펌]

출처 : http://romanticdm.egloos.com/2508766

jsp에서 자기가 만든 class import 하기

jsp에서는 여러가지 java package들을 import 할 수 있는데,
흔히 많이 쓰고 있는.
java.sql.* 이라던가, java.util.*... 등등은 아주 쉽게
jsp 페이지 최상단에

<%@ page import="java.sql.*" %>

위와 같이 입력함으로써 import 할 수 있다.

하지만 본인이 직접 만든 클래스를 import 하는 것은 생각보다 쉽지 않은데,
은근히 여러가지 문제들이 도사리고 있기 때문이다.

여기에.. 그 쉬우면서도 어려운 문제들을 정리함으로써 한방에 깔끔하고 쉽게 jsp 에서 class import 를 완수해보자!!

1. import 하고자 하는 class 파일은 반드시 package화 되어있어야 한다.
   어떻게 하는가?.... 매우 쉽다. java 페이지 최상단에 패키지 선언만 해주면 된다. 요렇게!

package myPackage;

그리고 가볍게 compile 하여, class 파일을 생서하자!

2. import 하고자 하는 class 파일을 CLASSPATH에 위치시킨다. 이때, 기본적인 위치는.. 다음과 같다.
TOMCAT_HOME\WEB-INF\classes\myPackage\
여기에 본인이 작성한 MyClass.class 파일을 위치시킨다.

3. jsp 페이지에서 class 파일을 import 한다.
역시 jsp 페이지 최상단에 아래와 같은 내용을 추가한다.

<%@ page import="myPackage.MyClass" %>

이렇게 import 한 class 내의 메소드를 사용하기 위해서는,
java와 똑같다.
예를 들어, static method를 사용하기 위해서는
MyClass.myStaticMethod();
non-static method를 사용하기 위해서는
MyClass mc = new MyClass();
mc.myNonStaticMethod();

이렇게 하면 되는 것이다.

이렇게 해서 jsp 페이지 내에서 직접 만든 클래스 파일의 import 를 문제없이 성공시킬 수 있다.

그렇다면, 여기서 뽀나쓰!!!

조금 더 advantage하게..
본인이 직접 만든 class 내에서 어떤 파일을 읽는 작업을 한다고 해보자.

예를 들어, DB에서 무언가를 읽어오는 jsp 파일이라면,
최악의 경우는..

jsp 파일 내에 DB_IP, DB_NAME, USER_ID, USER_PASSWD 를 모두 지정하여 직접 connect 하는 경우이다.
이럴 경우, 서버를 옮길 때마다 존재하는 모든 jsp 파일의 DB 정보를 갱신해 주어야 하는 문제가 발생한다.

이보다 조금 나은 상황은 DBUtil.java 등의 파일을 만들어, 해당 java 파일 내에서, DB 정보를 입력해주어
jsp 파일 내에서는..
DBUtil.getConnection(); 을 하는 경우이다.
이 때에는.. 서버를 옮길 때마다 존재하는 모든 jsp 파일 내의 DB 정보를 갱신해야 하는 수고는 더는 대신,
이미 컴파일되어 버린 DBUtil.class 의 source 파일인 DBUtil.java 를 수정하여 다시 compile 해야 하는 수고를 거쳐야 한다.

그럼 가장 이상적인 방법은 무엇인가?
DBUtil.java 파일 내에는 어떤 DB 정보도 입력하지 말고,
DB_IP, USER_ID, USER_PASSWD 등의 정보를 담은 텍스트 파일을 DBUtil.java 에서 불러오는 것이다.

일반 java 프로그래밍을 할 때는.. 그냥 java(또는 class) 파일과 읽어서 사용하고자 하는 텍스트 파일을 같은 디렉토리에 넣고 사용하면 되지만, jsp 를 통한 웹프로그래밍을 할 때는 사정이 다르다.

tomcat은 class 파일은 CLASSPATH인... WEB-INF\classes 아래에서 읽어오지만, 해당 클래스 내에서 쓰거나 읽고자 하는 파일은 (상대 또는 절대 경로 없이 썼을 경우) TOMCAT_HOME에서 읽어오기 때문이다.
즉, 본인과 같은 경우에는.. 아래 주소가 되겠다.

C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0




본인의 경우를 정리해보면 다음과 같다.

1. jsp 파일은 tomcat의 webapps ROOT에.
ex) C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\webapps\ROOT

2. import하고자 하는 class 파일은 CLASSPATH에,
ex) C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\WEB-INF\classes\myPackage

3. class 파일이 또 다른 파일을 읽을 때, 그 파일은 TOMCAT_HOME에,
C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0


본인 기록용이라.. 내용이 너무 두서없고, 깔끔하지도 못하다..ㅠ

언젠가 예쁘게 정리하리라..

2010년 4월 23일 금요일

[java] rs 컬럼명 알아내기

import! java.sql.ResultSet;
import! java.sql.ResultSetMetaData;

 

   ResultSet rs = stmt.executeQuery(query.toString());
   ResultSetMetaData rsmd = rs.getMetaData();
   int colCount = rsmd.getColumnCount(); // 컬럼수

   while(rs.next()){
    HashMap map = new HashMap();
    for(int i=1 ; i<=colCount ; i++){

     // 컬럼명
     map.put(rsmd.getColumnName(i), (String)rs.getString(rsmd.getColumnName(i)));
    }
    result.add(map);
   }

[JSP] 변수값에 따라 행 배경색 바꾸기

http://www.okjsp.pe.kr/seq/137672


변수값에 따라 행 배경색 바꾸기

변수값에 따라 행 색을 바꾸는 소스입니다.

소스에서 한 부분만 올립니다

다음의 소스들은 한 와일문안에 같이 있습니다.

즉,셀렉트한 쿼리문을 돌리고 rs에 저장된 값을

하나씩 불러오면서 TR의 배경색을 정하도록 짜본것인데요

전부 #FFFFFF로 나오네요;;

f의 값은 A,B,C로 나옵니다

--------------------------------------------------------------

 String f=rs3.getString("Mo_level");

   %>

  <%if (f.equals("A") ) {
  out.println("<tr bgColor='#99CCFF'>");
  }else if(f.equals("B")){
  out.println("<tr bgColor='#99CC66'>");
  } else
  out.println("<tr bgColor='#FFFFFF'>");%>
     <td><%=a %></td>
     <td><%=b %></td>
     <td><%=c%></td>
     <td><%=d%></td>
     <td><%=e%></td>
     <td><%=g%></td>
     <td><%=f%></td></tr>
    


  • if타기 전에 f도 한번 찍어보시면 답이 보일것 같은데요.
  • 재롱이
  •  
  • 2009-05-14 09:23:08
  • x
  • f찍어보니까 A,B,C로 잘 찍히는데;
  • Lnnn
  •  
  • 2009-05-14 16:25:04
  • x

2010년 4월 22일 목요일

[java] DbUtil 사용하기

[View Article] Commons-DbUtils 설명 및 예제  자바(EJB,JSP,JAVA) 

2007/06/15 09:52

복사http://blog.naver.com/atonikkaz/10018521924

I. 어디서 다운을 받나요?

 

http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

http://jakarta.apache.org/commons/dbutils/apidocs/index.html

 

II. 설치는 어떻게 하나요?

다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다

 

III. DbUtils란 무엇인가요?

DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.

 

IV. 왜 DbUtils를 사용해야 하는가요?

① resource 누출에 대한 어떠한 가능성도 없습니다
  JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
  이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다


② 코드의 가독성이 높아집니다
  데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
  남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.


③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
  더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
  ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다

 

V. 어떻게 사용하나요?

  Connection, Statement, ResultSet 의 close를 간단하게!

    이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!

    이 클래스는 모두 static 메소드들로 구성되어있습니다

   

    사용예)

    DbUtils.close(conn);  
    DbUtils.close(stmt);
    DbUtils.close(rs);
    DbUtils.closeQuietly(conn);
    DbUtils.closeQuietly(stmt);
    DbUtils.closeQuietly(rs);
    DbUtils.closeQuietly(conn, stmt, rs);
    DbUtils.commitAndClose(conn);

    DbUtils.commitAndCloseQuietly(conn);
    DbUtils.loadDriver("com.mysql.jdbc.Driver");
    DbUtils.rollback(conn);

 

    closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,

    즉 자신을 call한곳으로 throw 하지 않습니다

    commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다

    loadDriver 는 JDBC 드라이버를 로딩 합니다

 

 파일로 저장된 SQL을 사용하자!

    이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다

    이 클래스는 SingleTone 패턴의 클래스입니다

    즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다

   

    사용예)

    QueryLoader queryloader = QueryLoader.getInstance();   //싱글톤
    HashMap hashmap = queryloader.load("sql");      

    queryloader.unload("sql");

 

    queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다

    load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어

    HashMap으로 저장하여 리턴하여 줍니다

    unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다

 

  Setter함수로 더이상 머리 아프지 말자!

   이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다

 

   사용예)

    ...  

    BoardVO boardVO = null;

    ArrayList arraylist = new ArrayList();

 

    resultset = statement.executeQuery("SELECT * FROM board_t");

    while (resultset.next()) {

        boardVO = new BoardVO();

        boardVO.setTitle("title");

        boardVO.setContent("content");

        boardVO.setWriter("writer");

        arraylist.add(boardVO);      

    }

    ..

   와 같은 코드는 다음과 같이 간략화 됩니다

 

   ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
   QueryRunner queryRunner = new QueryRunner();

   List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);

 

   정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..

   select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~

 

   QueryRunner는 다음과 같은 함수를 지원합니다

   사용예)

   QueryRunner queryrunner = new QueryRunner();
   QueryRunner queryrunner = new QueryRunner(DataSource ds);
//datasource를 바로 이용할 수 있다

   queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
   queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
   queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

 

   여기서 말하는 Object param은 파라미터 전달시 사용됩니다

   ArrayList params = new ArrayList();
   params.add("100");

   params.add("200");

   ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
   QueryRunner queryRunner = new QueryRunner();

   List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);

 

   select 뿐만 아니라 update, delete역시 가능합니다

   사용예)

   QueryRunner queryRunner = new QueryRunner();

   queryRunner.update(Connection conn, String sql)
   queryRunner.update(Connection conn, String sql, Object param)
   queryRunner.update(Connection conn, String sql, Object params[])

 

   ArrayList params = new ArrayList();
   params.add(boardId);
   queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());

   와 같이 사용할 수 있습니다

 

 

VI. 샘플코드

public class DbUtilsExample() {

   public static void main(String[] args) {

       HashMap map = QueryLoader.getInstance().load("sql");  // (주의) load함수는 실행할때마다 파일을 읽습니다

 

       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "");

 

           ArrayList params = new ArrayList();
           params.add(args[0]);

 

           ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

           QueryRunner qr = new QueryRunner();

           List list = (List)qr.query(conn, (String)map.get("select"), params.toArray(), rsh);

 

           for (int i = 0; i < list.size(); i++) {

               BoardVO board = (BoardVO)list.get(i);

               System.out.println(board.getTitle());

               System.out.println(board.getContent());

               System.out.println(board.getWriter());

          }

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }

   }

}

 

 

DbUtils 몇가지 예제

 

DBUtils 기본은 다음 링크를 참조하세요

http://www.jakartaproject.com/article/jakarta/1108193481660

 

설정방법

   DB유틸 설정 방법은 특별히 없습니다  그냥 다운받은 클래스 패스 잡으시면 됩니다

   Application에서 사용시에는 환경변수나 실행시 클래스 패스를 잡으면 되고요,

   웹에서 사용한다면 해당 어플리케이션의 /WEB-INF/lib/ 에 commons-beanutils.jar 를 복사하면 됩니다

 

   기본적인 문서는 http://www.jakartaproject.com/article/jakarta/1108193481660 를 보세요

 

   Download http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

   API http://jakarta.apache.org/commons/dbutils/apidocs/index.html

 

SELECT 예제 (여러건)

 

<%@ page contentType="text/html;charset=EUC_KR" %>
<%@ page import="com.jakartaproject.board.vo.*,org.apache.commons.dbutils.*,java.sql.*,java.util.*, org.apache.commons.dbutils.handlers.*" %>

<%
       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "1111");

 

           ArrayList params = new ArrayList();
           params.add("1%");

 

           ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

           QueryRunner qr = new QueryRunner();

           List list = (List)qr.query(conn, "SELECT boardTitle, boardContent, userNick FROM board_test_t WHERE userIp like ?", params.toArray(), rsh);

 

           for (int i = 0; i < list.size(); i++) {

               BoardVO board = (BoardVO)list.get(i);

               System.out.println(board.getBoardTitle());

               System.out.println(board.getBoardContent());

               System.out.println(board.getUserNick());

          }

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }
%>

 

SELECT 예제 (한건)

select 처리 건수가 1건일 경우에는 MapHandler를 사용하면 됩니다

<%@ page contentType="text/html;charset=EUC_KR" %>
<%@ page import="org.apache.commons.dbutils.*,java.sql.*,java.util.*, org.apache.commons.dbutils.handlers.*" %>

<%
       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "1111");

 

           ResultSetHandler rsh = new MapHandler();

           QueryRunner qr = new QueryRunner();

           Map map = (Map)qr.query(conn, "SELECT count(*) cnt FROM board_test_t", rsh);

           System.out.println(map.get("cnt"));

           

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }
%>

핸들러에는 아래와 같이 여러 종류의 핸들러 들이 있으며,

ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

그때그때 맞춰 사용하면 됩니다

 

 

UPDATE 예제

이 예제는 Unicorn 소스에 있는 예입니다

Unicorn 소스를 다운받아 /src/com/jakartaproject/admin/dao/AdminMySqlDAO.java 를 열어 보시면 Update, Insert 예제를 볼수 있습니다

 

public void setBoardCommonSecurity(ConnectionContext connectioncontext,

                                                  AdminForm adminForm) throws BaseException {


        String updateQuery = "UPDATE board_common_t SET badIp=?, badId=?, badNick=?, badContent=?, inputPerMin=?, tryLogin=?";

        try {
            ArrayList params = new ArrayList();
            params.add(encode(adminForm.getBadIp()));
            params.add(encode(adminForm.getBadId()));
            params.add(encode(adminForm.getBadNick()));
            params.add(encode(adminForm.getBadContent()));
            params.add(String.valueOf(adminForm.getInputPerMin()));
            params.add(String.valueOf(adminForm.getTryLogin()));

            QueryRunner queryRunner = new QueryRunner();
            queryRunner.update(connectioncontext.getConnection(), encode(updateQuery), params.toArray());

        } catch (Exception e) {
            logger.error("Error at AdminDAO.setBoardCommonSecurity",e);
            BaseException baseException = new BaseException("errors.sql.problem");
            throw baseException;
        }

        logger.info("AdminDAO.setBoardCommonSecurity was executed");
    }

 

 

 

 

 

 

=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

2010년 4월 10일 토요일

[아이폰] OS 4.0 설치후기

http://bassist.tistory.com/113

 

후후 벌써 설치하신분이 있네요...

멀티태스킹에, 폴더기능 지원.

이두개만으로 4.0이라고 까지 하긴 좀 그렇지 않을까요??

 

해킹때문에 주식못하는 저같은 사람에게는 꽤 괞찮을듯합니다.

대신 빨리 탈옥이 나와야^^

 

필요한 사양
1. OS : Mac OS X(10.5.8이상이면 쉽게 할수 있음), 해킨도 상관없는것으로 사료됨. 본인도 해킨에서 설치했음
2. 아이튠스 스토어 접속 가능해야함
   (Safari가 4버전 이상이어아 접속 가능, 10.5.7 이하에서는 설치 불가함, 10.5.7이하에서 설치방법 아래설명)
오늘 날 괴롭혔던 주범 사파리


간략한 작업 진행 방법
1. Hosts 파일을 수정.
2. 아이튠스에서 옵션+업데이트를 눌러 업데이트 진행.

진짜 간단하다!!!!! 근데 이걸한다고 아침부터 저녁 5시까지 대삽질을 하다니 -_-;



◇iPhone OS 4.0 깔기

○ iPhone OS 4.0 파일 다운로드
4.0 OS가 필요하다. 토렌트등에 떠돌고 있으니 각자 알아서 구하자. 용량은 370MB정도 였다.

○ Hosts 파일 수정.
1. 먼저 파인더를 띄우고 응용프로그램->유틸리티->터미널을 띄운다.
응용프로그램->유틸리티
유틸리티->터미널 선택

2. 터미널이 뜨면 터미널에 sudo vi /etc/hosts 라고 타이핑을 한다.


3. 호스트 파일의 내용 마지막에에 "127.0.0.1   albert.apple.com"을 추가한다.
  터미널에서 2번의 내용을 타이핑하면 유닉스의 텍스트파일 편집기인 vi가 hosts 파일의 내용을 뿌려주게된다.
  이상태에서 화살표키를 눌러 가장 아래쪽 라인으로 내려가서 Shift+A를 누르면 입력모드로 변하게 된다.
  그상태에서 엔터키를 한번 입력해 줄을 바꿔주고 127.0.0.1    albert.apple.com 을 입력하자.
  127.0.0.1과 albert.apple.com 사이는 Tab키를 눌러서 띄워주면 된다.
해당내용을 수정한 hosts 파일
초기화면에서 커서를 가장 오른쪽 하단부로 내리고 i를 타이핑해 입력모드로 들어가도 무방하다.

4. 입력을 마치면 ESC키를 누르자. ESC키를 누르면 입력모드가 종료된다. 그상태에서 :wq 를 타이핑후 엔터키를 입력한다.
저장하고 빠져나가는 :wq 명령어를 입력하자.(별 상관없는 이야기지만 write, quit 앞자 조합이 아닌가 싶다)


이렇게 저장하고 빠져나오면 hosts 파일 수정은 끝! 이제 아이폰에 OS 4.0만 심어주면 된다.


○ 아이튠스를 통해 iPhone OS 4.0 업데이트

1. 아이튠스를 실행하고 아이폰도 케이블을 연결해 컴퓨터에 연결한다.
2. 아이폰 항목을 선택하면 나오는 업데이트 확인 단추를 이용하여 업데이트할 것이다.
   옵션키를 누른채로 업데이트 확인 버튼을 누르자
옵션+복원으로는 하지말자 골치 아파진다.

3. 옵션+업데이트 확인을 눌러주면 아래처럼 ipsw파일을 지정할수 있는데 아까 받아둔 iPhone OS 4.0을 지정해주면 된다.



4. 시간이 지나고 아이폰에 사과모양이 몇번 뜨고나면 자동으로 초기화면이 뜰것이다.

업데이트 끝!!!!!!!!!!!!!





◇ 각종 에러 해결 방법

○ 옵션+복원을 눌러 4.0을 설치한 경우

아마 액티베이션이 안된다는 메세지를 띄우고 아이폰은 긴급전화만 할수있는 멍청이 상태가 되어있을 것이다.
그때는 어쩔수 없이 3.1.3으로 복원하는수밖에 없는데 그 상태에서는 아이튠스에 복원 버튼도 볼수 없기때문에 다음과 같은
방법을 쓰면 된다.

1. 복원 가능한 모드 만들기
아이폰의 전원 버튼과 홈버튼을 같이 계속 누르고 있는다. 그러면 빨간 화살표 모양의 전원끄는 화면이 뜨게되는데 그 상태에서도 누르고있는 버튼은 떼지 말고 계속 누르고 있다보면 어느순간 아이폰 화면 까맣게 변하게 된다.
그러면 전원버튼은 떼고 홈키만 계속 누르고 있으면 사과 로고가 떴다가 iTunes에 연결하라는 아이폰 화면이 나올것이다.
그리고 컴퓨터의 iTunes에서는 복원할 아이폰을 찾았다는 팝업창이 뜬다. (이게 DFU 모드가 맞는지는 모르겠다)

2. 1015 에러 해결
 - irecovery 다운 및 실행
이렇게 하고나면 복원이 가능한데 실컷 복원을 다해놓으면 1015라는 에러창이 하나 뜨게 될것이다.
그상태에서 승인을 누르고 첨부한 iRecovery 라는 프로그램을 다운받는다.
libusb-0.1.4.dylib 파일은 /usr/local/lib 폴더에 복사해주면 된다.
그리고 응용프로그램->유틸리티->터미널을 실행시켜준다.
irecovery 프로그램이 있는 디렉토리로 이동해서 iRecovery -s 라고 타이핑을하고 엔터를 친다.

※ 2010/04/10 추가 사항
  해킨 10.5.7버전과 리얼맥(유니맥)에서 확인한 결과 /usr/local 이라는 디렉토리가 존재하지 않았고
  이런 경우에는 /usr/lib 디렉토리에 libusb-0.1.4.dylib 파일을 넣어주면 됩니다.

 - irecovery를 통한 에러 해결
그러면 글들이 쭉 뜨고 마지막에 명령어를 입력할수 있도록 커서가 깜빡이는데 거기에서
setenv auto-boot 타이핑후 엔터
saveenv 타이핑후 엔터
reboot 타이핑후 엔터
를 하고나면 아이폰이 재부팅되면서 3.1.3 초기로 돌아가며 복원이 된다.

※ 2010/04/10 추가사항
  만약 이렇게 했는대도 아이폰에서 비상전화 화면만 띄우고 있다면
  수정했던 호스트 파일을 원상태로 복구시켜 주시면 순정 3.1.3으로 복원이 가능합니다.



○ MAC OS X의 버전이 낮아 사파리 4.0을 설치 못하는경우
개인적으로는 이부분때문에 거의 70%이상의 시간을 허비했다.
거의 윈도우만 쓰다보니 사파리 4.0이 깔리지 않으면 아이튠스 스토어에 접속을 못한다는걸 몰라서 -_-;;
나는 10.5.7 버전을 쓰고 있었는데 간단히 버전 정보만을 수정하는것으로 사파리 4를 설치할수 있었다.
10.5.7에서 사파리 4 설치 방법

1. 파인더를 실행한다.
2. Shift+Command+G 를 눌러 이동하는 창을 띄운뒤 /system 을 입력
3. system/library/coreservices 폴더로 이동한다.
4. SystemVersion.plist 파일을 찾아 데스크탑(바탕화면)에 드래그한다(복사)
5. 바탕화면의 SystemVersion.plist 파일을 열어 버전 항목에 10.5.7 부분을 10.5.8로 바꾸어준다(2개 바꿔줘야함)
이런식으로 아랫쪽에 버전 정보에 10.5.8이라고 바꿔주면 된다.

6. 데스크탑에있는 파일을 다시 system/library/coreservices로 드래그하여 덮어쓰기한다.
7. 이 매킨토시에 대해서 메뉴에서 MAC OS X 버전이 10.5.8로 바뀐지 확인한다.
8. http://apple.com/safari 에서 사파리 4 레오파드용을 다운받아 설치한다.

이렇게 하면 설치가 되고 아이튠스 스토어가 문제없이 동작할 것이다.
(만약 이렇게 하고 에러가 뜬다면 http://x86osx.com 에서 정보를 구하는것이 빠를것이다)

2010년 4월 6일 화요일

[아이폰] good reader document 경로

/private/var/mobile/Applications/3415098F-7300-44FD-8F27-683930A44399/Documents

 /private/var/mobile/Applications/C90CD922-804D-4E89-B49A-920913E5120D