기본 콘텐츠로 건너뛰기

2011의 게시물 표시

JSONObject 전용 CustomView Adapter를 만들었다.

질보다 양이 우선하는 허접안드로이드 프로그램 의뢰를 처리해주고 있다.
어찌나 기능들이 다양한지 덕분에 스터디는 제대로 하네 ㅎㅎ
하다보니 리스트들이 엄청 많은데
SimpleAdapter 로 대충 하려고 했더니 요리조리 잘도 빠져들 나가서
커스텀 시리즈를 하나씩 종류별로 다 만들고 있다.
SimpleAdapter를 선호하는 편인데 Hash Map 에만 넣어주면 이미지건 뭐건 알아서 잘 해주니까 좋다.

myAdapter = new SimpleAdapter(this, groupData, R.layout.couponlist,

new String[] { "title", "desc" }, new int[] {

R.id.textViewListTitle, R.id.textViewListDesc });

mListView.setAdapter(myAdapter);


대략 이런식.

1.context 를 주고,

2.Map의 ArrayList 형을 받고,

3.리스트를 표현할 Layout을 정하고

4.리스트에 값을 가져올 Map의 키와

5. 그 키값에 대응하는 List안의 View들을 대응

이것만으로 오케이

물론 이것마저도 사실 지저분하고 더러운 코드로 보이지만 자바에선 이정도면 짧은 코드인편

그런데 이걸 Custom으로 구현하면 갑자기 일이 커진다.

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html

나는 짜증나서 이짓 못하겠다.

일단 서버나 array.xml 등등에서 JSON을 다루는 일이 대부분이라서

SQLite DatabaseAdapter (어라 이것도 만들었네)에서도 그냥 죄다 키발키발(key:val)해버렸다.

하나 만들고 리팩토링하면서 생각해봐야지 하고 촥 만들고 보니

Custom ListAdapter라고 해봤자. 결국 getView 만 외부에서 콜백으로 지정할 수 있으면 나머지는 매번 작성할 필요가 없다는 생각…

왜 object에 prototype을 쓰지 않나?

http://triin.net/2009/09/13/Why_exactly_is_Object.prototype_verboten
이유는 이렇다. prototype 에 method 를 정의하면 자기 자신도 해당 object 에 카운트가 된다.
무슨말이냐? object (array포함) 의 key와 value를 보기 위해 종종 아래와 같이 해본다. var ages = {  John: 10,  Mary: 28,  Alice: 16}; 일때 (function(obj){ for (idx in obj) { console.log(idx+':'+obj[idx]) }})(ages)  이렇게 떠 보면 John:30 Mary:30 Alice:30 뭐 이렇게 나오겠지.
그럼 아예 object 에 이걸 prototype 해서 그냥 method 로 만들지 싶어
Object.prototype.printObject=function(){ for (idx in this) { console.log(idx+':'+this[idx]) }}; 요따우로 해주면
ages.printObject() > John:10 > Mary:20 > Alice:30 > printObject:function (){ for (idx in this) { console.log(idx+':'+this[idx]) }}
망한다. 다시 이야기 하지만 자기 자신도 객체의 일부가 되니까. 그래서 쓰지말라는 것이다.
hasOwnProperty를 사용해서 피해가는 방법도 있겠지만 다른 문제가 있다. 자세한 설명은 생략한다. 왜 그런지 알고 싶으면 본문 봐라. (난 알고싶지 않아서 안봤다. 안쓸거니까 우왕ㅋ)
결론은 이거다. defineProperty 를 사용하자. ECMAScript 5 스펙이다. 하지만 망할 IE7 에선 안되겠지 http://ejohn.org/blog/ecmascript-5-objects-and-properties/ (꼼꼼히 읽어볼 필요가 있다) 사용법이 좀 뜨…

node.js 로 만드는 좀 더 본격적인 TCP Server

서로 에코만 하는게 부족하다면 유닉스의 wall 채팅을 구현해보자.
사실 이것만 되면
누가 접속했는지도 알고
누가 누구한테 무얼 보낼 수 있는지도 아는 셈이므로
채팅방을 하든지
온라인대전 격투게임 서버를 만들던지
바카라(어이쿠 위험한 단어) 서버를 만들던지
엠엠오알피지 서버를 만들던지
알아서 주무르면 된다.

자 그럼 이 대단한 서버의 코드를 보자

var clients = [];
require('net').createServer(function(socket) {

  socket.on("connect", function() {
    clients.push(socket);
  });

  socket.on("close", function() {
    clients.splice(clients.indexOf(socket), 1);
  });

  socket.on("data", function(data) {
    var sender = this;
    clients.forEach(function(client) {
      if (client !== sender) client.write(data);
    });
  });
}).listen(1337,"0.0.0.0");

네트워크 프로그래밍 좀 해본 사람이라면 다리에 힘이 턱 풀릴 정도로 허무한 코드라고 할 수 있겠다.
코드를 위에서부터 말로 쭉 설명하자면

1. 빈 접속자 배열을 만든다.
2. connect 할때마다 접속자 배열에 해당 소켓을 추가한다.
3. close 하면 socket 의 위치를 찾아(indexOf) 해서 떼어낸다(splice)
4. data 즉 접속자로 부터 입력을 받으면 자기 자신이 아닌 다른 모든 소켓에게 쓰기를 한다.
5. 이 모든 것을 1337번 포트에 연다.

정말 간단하다.

node.js server pattern

에코 서버 3줄이면 된다는 걸 증명하기 위해선

require('net').createServer(function(socket) {
  socket.pipe(socket);
}).listen(1337,"127.0.0.1");

요정도면 충분.
접속/서버메시지/접속종료 구현은

require('net').createServer(function(socket) {
  socket.on("connect", function() {
    socket.write("hello\n");
  });
  socket.on("close", function() {
    console.log("closed");
  });
  socket.on("data", function(data) {
    socket.write("usay:"+data);
  });
}).listen(1337,"127.0.0.1");

이정도면 충분하겠다.

DotCloud 에서 Redmine 수정 후 Push 하였을때 발생하는 오류에 대한 대처법

http://www.redmine.org/boards/2/topics/11085 구글링해보았다.

a key is required to write a cookie containg the session data

오류인데 당황하지 말고

$ dotcloud ssh redmine.redmine (redmine.redmine 은 나만 이렇게 쓰고 있으니 알아서 변경하시길)
로 들어가서

$ cd current
$ rake config/initializers/session_store.rb

해주면 끝.

redmine project 식별자(identifier) 변경

보통은 식별자를 Admin모드에서 바꿀 수 없다.
하지만 누구나 실수는 하는 법.
mysql 을 뒤져보니 간단하게 바꿀 수 있더라.

$ dotcloud ssh redmine.db
$ mysql -uroot -p<암호>
mysql> use redmine;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------------------------+
| Tables_in_redmine                   |
+-------------------------------------+
| attachments                         |
| auth_sources                        |
| boards                              |
| changes                             |
| changesets                          |
| changesets_issues                   |
| comments                            |
| custom_fields                       |
| custom_fields_projects              |
| custom_fields_trackers              |
| custom_values                       |
| documents                           |
| enabled_modules                     |
| enumerations                       …

dotcloud 에 redmine 등록 후 Domain 도 연결해보자

redmine 을 dotcloud.com 에 올렸습니다. 무료니까요.
이후 할것들이 몇가지가 있다.

하나는 Domain 연결이고
나머지 하나는 mail notification 인데 차근차근 보자

잘 등록했다면 list 를 보았을때

$ dotcloud list
redmine:
  - db      (type: mysql; instances: 1)
  - redmine (type: ruby; instances: 1)

라고 나올 것이다.

http://docs.dotcloud.com/guides/domains/ 가이드대로

$ dotcloud alias add ramen.www www.example.com 형식으로 써보자

어플리케이션명이 redmine 이고 모듈도 redmine 이니까

$ dotcloud alias add redmine.redmine www.<니가 쓰는 도메인> 형식이 되겠다.

아래와 같이 나오면 정상.

Ok. Now please add the following DNS record:
www.<니가 쓰는 도메인>. IN CNAME gateway.dotcloud.com.

내 경우엔 서브도메인으로 쓰고 싶어서

$ dotcloud alias add redmine.redmine redmine.<내 도메인> 형식으로 썼다.

브라우저에서  http://redmine.<내 도메인> 으로 접근했을때 CNAME Alias 를 줘서 호스팅 서비스쪽에서 gateway.dotcloud.com 을 바라보게 하고 gateway.dotcloud.com 에서 해당 어플리케이션으로 연결되게 하는 구조다.
netfirms.com 이란 곳에서 도메인 호스팅을 받고 있는데 관련 설정을 보면 이런 식이다.


CNAME (Alias)

A CNAME record (also known as an alias record) is a subdomain that points to a domain name (sales.yourdomain.com >> …

redmine 을 dotcloud.com 에 올렸습니다. 무료니까요.

PaaS(Platform as a Service)의 시대입니다.
지금 배타고 물들어올때 잽싸게 올라타자 하는 마음으로
http://www.dotcloud.com 에 계정을 하나 만들어놓았습니다.
소프트웨어(ex.ASP) 뿐만이 아니라 플랫폼마저도 빌려쓰는 세상이라니 좋은 세상입니다.

자 바로 본론입니다.
먼저 http://dotcloud.com 에 가입하시고 http://docs.dotcloud.com/firststeps/install 에서 cli 도 설치하고 기본 준비를 하세요.
이런건 패스합니다. 읽어보면 멸치라도 할 수 있어요. 봐도 모르시겠다고요. 그럼 Backspace : )
현재는 Free Plan 뿐입니다만 너무도 훌륭한 서비스입니다.

http://yanitime4u.fluxflex.com/56 를 보고 해보니까 쉽더군요.
근데 보실 필요는 없어요. 왜냐면 이 아래에 쓸 내용도 같은 내용이니까요 :)

https://www.dotcloud.com/settings/ 에서 유저명을 바꿔주세요.
API Key, Username,First name, Last name, E-mail address 순으로 있죠?
두번째 Username을 바꿔줍니다. 최종 우리가 사용할 URL은 http://redmine-<Username>.dotcloud.com 이 될테니까요.

일단 지금 홈디렉토리라고 가정하고 복사하고 붙여봅니다.
현재 최신버전인 redmine 1.2.1 을 사용합니다.

$ mkdir redmine
$ cd redmine
$ wget http://rubyforge.org/frs/download.php/75097/redmine-1.2.1.tar.gz
$ tar zxvf redmine-1.2.1.tar.gz

일단 압축을 풀으셨으면 디플로이할때 걸리적거리니까 redmine-1.2.1.tar.gz 일단 지워주고 dotcloud.yml 파일을 만듭니다.
우리는 redmine 을 쓰고 mysql을 db로 쓸테니 다음과 같은 파일을 만듭니다.

$ vi do…