1. MongoDB 설치

OS별 설치방법이 공식홈페이지에 잘 나와있습니다.
http://www.mongodb.org/display/DOCS/Quickstart

저는 Windows라서 다운로드 받고, 압축 푼 다음에 \data\db 폴더 만들고, mongod 실행하니까 바로 되더라구요. 이렇게 손쉽게 설치되는 DB라니.....ㅠㅠ


2. php에 MongoDB Driver 설치

이것도 공식홈페이지에 잘 나와있네요.
http://www.mongodb.org/display/DOCS/PHP+Language+Center

https://github.com/mongodb/mongo-php-driver/downloads 여기서 Driver를 다운로드 받아서 dll파일을 extension에 추가만 해주면 됩니다.
압축 풀면 vc6~9별로 나눠져있는데, apache 버전에 맞춰서 dll을 복사해야합니다. 안그러면 에러납니다.
extension=php_mongo.dll


3. CodeIgniter 설치

php쪽 프레임워크는 처음 써보는데, 코드이그나이터가 제일 괜춘한가보네요. 회사에서 쓰려고 알아보다 보니 여기까지 왔네요.

공식홈페이지에서 다운로드 받고, apache 경로에 압축풀어주면 됩니다. 저는 localhost/codeigniter에 풀었습니다.
http://codeigniter.com/downloads/

저는 config에서 base_url과 index_page를 수정했습니다.
/application/config/config.php
$config['base_url']    = 'http://localhost/codeigniter/';
$config['index_page'] = '';


그리고, localhost/codeigniter/index.php/~~~ 이런 형태가 되는데, index.php를 없애고 싶으면 이렇게 하면 되는 듯 합니다.
압축푼 폴더에 즉, codeigniter에 .htaccess 파일을 만들어서
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /codeigniter/index.php/$1 [L]

라고 쓰면 되는 듯.
여기 참고 -> http://codeigniter.com/user_guide/general/urls.html


4. MongoDB CodeIgniter용 library 다운로드 및 설치

Mongo클래스를 CodeIgniter에 맞게 잘 래핑한 클래스가 있습니다.
https://github.com/kyledye/MongoDB-CodeIgniter-Driver

여기서 다운로드 하면, Config폴더랑 libraries폴더에 mongo_db.php파일이 있습니다.
config폴더에 있는 것은 /application/config/ 폴더로, libraries폴더에 있는 것은 /application/libraries/ 폴더로 복사합니다.

config에 있는 mongo_db.php파일은 각자 설정에 맞게 고쳐줘야 합니다.


5. CodeIgniter Model 만들기

생성자에서 mongo_db library를 로드합니다. 그리고, 리스트를 가져오는 getList, 글쓰는 write, 삭제하는 delete함수를 만들었습니다.
이 라이브러리를 보니까, 가져오기전에 조건문(where, orderby 등등)을 미리 셋팅하고, get이나 delete 등을 호출하는 방식입니다. 아래 클래스를 보시면 매우 쉽습니다.

/application/models/board_model.php
<?php
class Board_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library("mongo_db");
    }
   
    public function getList()
    {
        $this->mongo_db->order_by(array("_id"=>-1));
        $data = $this->mongo_db->get("board");
        return $data;
    }
   
    public function write($name, $contents)
    {
        $this->mongo_db->insert("board", array("name"=>$name, "contents"=>$contents));
    }
   
    public function delete($id)
    {
        $this->mongo_db->where(array("_id"=>new MongoId($id)));
        $this->mongo_db->delete("board");
    }
}
?>


6. CodeIgniter Controller 만들기

리스트를 보여주는 index와 글쓰기 write, 글삭제 delete가 있습니다.

/application/controllers/board.php
class Board extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model("board_model");
        $this->load->helper('url');
    }
   
    public function index()
    {
        $data["list"] = $this->board_model->getList();
        $this->load->view("board", $data);
    }
   
    public function write()
    {
        $name = $this->input->post("name", true);
        $contents = $this->input->post("contents", true);
        $this->board_model->write($name, $contents);
        redirect("/board/index", "refresh");
    }
   
    public function delete()
    {
        $id = $this->input->post("id", true);
        $this->board_model->delete($id);
    }
}
?>

7. Condeigniter view 만들기

위에 Controller에서 index()함수를 보면 board라는 view를 호출하게 되어있습니다. board라는 view를 만듭니다.

/application/views/board.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
        <script>
            $(document).ready(function(){
                $(".btnDelete").click(function(){
                    var _id = $(this).attr("_id");
                    $.post("delete", {id:_id}, function(){
                        alert("삭제되었습니다.");
                        window.location.href = "index";
                    });
                });
            });
        </script>
    </head>
    <body>
        <form action="write" method="post">
            <input type="text" name="name" /><br />
            <textarea name="contents"></textarea>
            <input type="submit" value="글쓰기" />
        </form>
       
        <ul>
        <?php foreach ($list as $board):?>
            <li>
                <?php echo $board["name"];?> : <?php echo $board["contents"];?>
                <input class="btnDelete" type="button" _id="<?php echo $board["_id"]?>" value="삭제" />
            </li>
        <?php endforeach;?>
        </ul>
    </body>
</html>

지금 jquery ajax랑 form전송이 짬뽕이 되었는데, 그냥 그러려니 하세요-_-
어쨌든 글 작성 시에는 write를 호출하고, 삭제 시에는 delete를 호출하면 잘 작동합니다. MongoDB도 잘 작동을 해서 입력 삭제가 잘 되네요.



PS. 뭔가 작성하면서 빠뜨린 기분이네...
 
Posted by 머드초보
,
 

이클립스에서 앱엔진플러그인으로 설치한 다음에 프로젝트를 만들고 테스트서버를 가동하면 해당PC로컬에서 밖에 접속이 안됩니다. 제가 모바일페이지를 만들고 있어서 폰에서도 테스트해보려고 열었더니 접속이 되지 않았습니다.
netstat -an을 때려보면 127.0.0.1의 8888포트로 접속을 연것을 볼 수 있습니다. 그렇다는 건 로컬에서밖에 접속이 안된다는 것이죠.
그래서 테스트할 땐 로컬에서 밖에 안되나....라고 검색해보니 역시나 방법이 있네요.

AppEngine에서 The Java Development Server를 보면 실행 시 옵션을 제공하는데요.
http://code.google.com/intl/ko-KR/appengine/docs/java/tools/devserver.html

--address=...
The host address to use for the server. You may need to set this to be able to access the development server from another computer on your network. An address of 0.0.0.0 allows both localhost access and hostname access. Default is localhost.

--address를 0.0.0.0값으로 해서 실행하면 된다는군요.

이클립스에서 Debug As로 가서 실행할 때 Arguments를 수정합니다.
--address=0.0.0.0 --port=8888 D:\mudchobo\workspace36\appengine\Mudchobo\war

이렇게 하면 됩니다.

모바일에서 접속하고 싶은 경우에는 공유기를 써서 접속했다면 같은 공유기에 접속을 하고 PC에서 ipconfig로 나오는 ip로 접속하면 됩니다~
 
Posted by 머드초보
,
 

크롬의 광속버전업.....-_- 그닥 눈에 띄는 개선점은 안보이지만, 숫자를 미친듯이 올리네요. 일부러 그러는건가....IE도 이제 9나오니까 IE나오는 시점에 9를 내놓은건가....-_-

암튼, 구글크롬의 광속버전업을 통해 벌써 9.0이네요. 크롬이 제 기본브라우저인데, 역시나 빠른 속도 때문에 씁니다~ 뭐 잘 안되는 사이트가 있으면 다시 IE를 열어서 보면 되니깐요~ 제가 자주 가는 사이트들은 크롬에서 잘 돌아가서 뭐 그닥 무리 없이 잘 쓰고 있습니다.
11번가 같은경우도 쇼핑은 크롬에서 하다가 결제할 때에만 다시 IE로 들어가서 결제하죠~
이미지가 많은 쇼핑몰 같은 경우 확실히 크롬이 빨라요~

9.0에서 달라진 것은 다들 시험적으로 진행되던 것을 그냥 정식으로 넣은 것 같습니다.

1. WebGL지원

WebGL은 기존에 크롬 실행할 때 파라메터로 webglenable인지 뭐시기인지 넣어주면 되었던 걸로 기억하는데, 이제 디폴트로 들어간 것 같네요.

여기 아래사이트에서 webgl이 잘 돌아가는지 테스트해볼 수 있어요~ 좀 끊기지만, 잘 되네요~ http://www.chromeexperiments.com/webgl

2. 순간검색
구글 순간검색도 지원하네요. 이것도 8.0에서 된거 아니였나... 얘네들 블로그에 그냥 글을 쓴건가..ㅠㅠ 9.0이 아니라 그냥 이런게 된다고....ㅠㅠ
이건 옵션에서 기본설정에서 검색 부분에 있어요~ 체크해놓으니까 좋네요!

2. 크롬 웹 스토어
이것도 나 전에 8.0때부터 있었던 것 같은데ㅠㅠ 암튼, 새탭을 열면 응용프로그램에서 "웹 저장소"라는 아이콘이 하나 있을겁니다. 그거 선택하면 크롬 확정 프로그램 사이트로 가는데, 거기에 Chrome Web Stroe가 좌측에 보일겁니다.

여기서 한가지 의문점은..... 왜 "Web Store"를 "웹 저장소"라고 번역했을까요-_- 그냥 스토어가 더 맞는 것 같아서ㅠㅠ

웹스토어
웹스토어 앱을 둘러보면 3가지타입의 앱들이 존재를 합니다.
1. 사이트를 게시한 앱.
2. 크롬 확장기능 형태의 앱
3. 크롬 확장기능이긴 하나 독립적으로 돌아가는 앱

1번은 그냥 사이트를 게시한 앱들입니다.
그런 앱들 설치하게 되면 응용프로그램 목록에 아이콘이 추가되고, 선택하여 실행하면 그 사이트로 이동시키게 됩니다.
식물대좀비도 트라이얼버전으로 있어서 설치해보면 바로 사이트로 갑니다.
https://chrome.google.com/webstore/detail/mmcegpfdgcoclcdfkjahiimlikdpnina?hl=en-US#
대부분이 이런형태로 되어있는 앱이더라구요^^

2번은 크롬 확장기능입니다. 웹 스토어 메인에서도 Apps탭과 Extensions탭을 분리했습니다. 보면 구글 크롬의 확장기능을 추가하는 건데요.
제가 설치한 확장프로그램은 이렇습니다. 
Bubble Translate - 특정 문장만 셀렉트해서 번역하는 건데, 너무 좋아요~
Google Chrome to Phone Extension - 이건 크롬에서 보고 있는 웹사이트의 url을 안드로이드폰으로 전송하는 기능이죠~
Chrome Gestures - 이거 마우스로 뒤로가기 앞으로가기 하는 다아시는 그거~

3번은 크롬 확장기능이긴 한데, 거의 독립적인 그런 것입니다. 2번같은 경우는 웹브라우징할 때 합체(?)되어서 쓰이는 기능들인데, 얘는 독립적인 형태로 동작합니다.
대표적으로 TweetDeck, Chrome Player 등이 있네요.

웹스토어를 좀 둘러보니 역시나 제일 맘에 드는 앱은 역시나 TweetDeck이네요~ 데스크탑을 그대로 옮겨놓은 듯한 형태! 게다가 데스크탑에서만 될 것 같은 기능인 팝업 기능도 구현을 해놨더라구요.


게다가 데스크탑 버전에도 없는 한글화를 해놨네요 ㄷㄷ

그리고 크롬플레이어가 있는데요. 마치 데스크탑 플레이어처럼 데스크탑에 있는 음악을 플레이리스트에 추가하고 재생시킬 수 있습니다.

그 외에 잼난거 많으니까 둘러보세요~
 
Posted by 머드초보
,
 
아오...생각해보니까 안되는건데, 삽질하고 있었긔ㅠㅠ
안드로이드폰에서 서버를 구축하면 일단 3G에서는 외부에서 접속을 할 수 없어요. 안드로이드폰 웹브라우저에서만 접속할 수 있어요~
그래서 WI-FI모드에서만 가능하네요. WI-FI모드에서도 같은 망에 있어야지 가능하죠~
음....어차피 내가 만드려고 하는 것은 파일교환하는 거라서 뭐 WI-FI모드에서만 써도 될 듯...

일단 잡소리고-_-

Android에는 HttpClient와 HttpCore가 내장탑재되어있습니다. 이걸 이용하면 간단한 웹서버를 만들 수 있지요. 예제는 아래사이트에서...
확인할 수 있는데, 이상한 게 이거 그대로 쓰려고 하면 클래스가 몇 개 없어서 에러납니다.
이걸 보면 Android에 있는 HttpCore에 없는 클래스를 사용하더라구요. 그래서 Tutorial을 잘 보니까 이렇게 말고 다르게 써야하더라구요.
그래서 살짝 고쳐줘야합니다. 바뀐 부분만 보면-_-

RequestListenerThread 클래스의 생성자


public RequestListenerThread(int port, final String docroot) throws IOException {
        this.serversocket = new ServerSocket(port);
        
        this.params = new BasicHttpParams();
        this.params
            .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
            .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
            .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
            .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
            .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1");

        BasicHttpProcessor httpproc = new BasicHttpProcessor();
        httpproc.addInterceptor(new ResponseDate());
        httpproc.addInterceptor(new ResponseServer());
        httpproc.addInterceptor(new ResponseContent());
        httpproc.addInterceptor(new ResponseConnControl());
        
        // Set up request handlers
        HttpRequestHandlerRegistry reqistry = new HttpRequestHandlerRegistry();
        reqistry.register("*", new HttpFileHandler(docroot));
        
        this.httpService = new HttpService(httpproc, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory());
        this.httpService.setHandlerResolver(reqistry);
    }
생성자 부분이 요렇게 바뀌어야합니다. 생각해보니....이거말고 고친게 없네요-_-
아마 잘 될겁니다 으핫.....

이건 풀소스-_-
PS. 티스토리는 개당 10메가만 안넘으면 계속 올릴 수 있어서 좋아~

 
Posted by 머드초보
,
 
전에는 웹페이지에서 안드로이드마켓을 접속할 수 없었는데요. 이제는 접속도 하고 설치도 할 수 있네요.
게다가 해당 구글계정 아이디로 로그인 한 뒤, 설치까지 하면 자동으로 안드로이드폰에 설치까지 해줍니다. 이렇게 편하게 기능을 구현해놓다니!

주소는 여기


보시면 니드포스피드 광고가 메인에 있지만, 들어가서 설치하려고 하면 설치할 수 없는 폰이라면서 안되네요. 게임쪽은 빨리 쇼부를 봐야할 듯?

마켓앱에서만 보다가 더욱 넓은 화면에서 앱을 고를 수 있어서 더 좋네요.
게다가 여기서 설치를 하면 자동으로 안드로이드폰으로 설치까지 해줍니다.
설치 방법도 매우 쉽게 되어있네요. install만 누르면 팝업창이 하나 떠서 이 앱이 어떤 권한을 사용하는지 알려주고, 그냥 설치누르면 설치가 됩니다.


생각해보니, 3G일 때에도 그냥 막 받아버리는건가......
아.....몰랐는데, 마켓을 실행하면 받는군요!^^ 주의해야할 것 같습니다. 3G 경고 따윈 물어보지 않고, 그냥 받아버립니다~

암튼, 좁은 화면에서 앱을 고르는 게 힘들었지만, 이제 웹버전이 존재를 해서 매우 좋네요. 근데 뭐 보통 좋은 앱들은 입소문을 타고 설치되는 게 대부분이죠~^^ 그래도 마켓을 뒤지다가 좋은 앱을 발견하면 매우 기분이 좋죠~

 
Posted by 머드초보
,