랩실에서 와이파이만 쓸 땐 몰랐는데 끊기니 3G가 안잡혀서 찾아보니

외산 커스텀 롬을 쓴 경우에는 APN을 따로 잡아줘야 한다.

"롬업 후 APN 설정" 이라고 검색하니 금방 나온다.

다행히도 별 탈없이 APN만 등록해주니 3G가 잘 잡힌다  

'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
DHD LeeDroid 롬업, 커널업 완료  (0) 2011.08.22
왜 대체 NullPointerException이 뜨는거야!  (0) 2011.08.22
아빡치 에잇퉤퉤페 Apache Http Client  (0) 2011.08.18
미루고 미루다가 이제서야 롬과 커널업을 했다.
안드로이드 프로젝트가 NFC가 들어가다보니 진저브레드로 업그레이드를 해야했는데 이상하게도 내 옹이는 OTA로는 업그레이드가 안되더라. 순정으로 업그레이드 안되는 김에 겸사 겸사해서 2.3.3 버전의 LeeDroid 롬업을 했다.

EXT4 포맷이 필수사항인지라 풀 와이핑도 하고 A2SD+도 설정하고, 커널도 올리고-
하는 김에 Sense UI 3.0도 패치했다.

왠지 폰 처음 샀을 때 막 가지고 놀던 그 기분이 간만에 느껴졌달까.

여하튼 순정이 그냥 커피라면 커스텀 롬 업은 TOP다 +_ +! 



근데 다시 세팅할 생각하니 막막하다. 

'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
롬업 후 APN 설정  (0) 2011.08.23
왜 대체 NullPointerException이 뜨는거야!  (0) 2011.08.22
아빡치 에잇퉤퉤페 Apache Http Client  (0) 2011.08.18

Object to byte array and byte array to Object in Java

원출처 : http://scr4tchp4d.blogspot.com/2008/07/object-to-byte-array-and-byte-array-to.html

Here how to convert an Object to a byte array, and vice-versa.
요기에 객체를 바이트 배열로, 그 반대로 바꾸는 방법이 있습니다!
역시 구글링이랄까.
 
public byte[] toByteArray (Object obj)
{
  byte[] bytes = null;
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  try {
    ObjectOutputStream oos = new ObjectOutputStream(bos); 
    oos.writeObject(obj);
    oos.flush(); 
    oos.close(); 
    bos.close();
    bytes = bos.toByteArray ();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  return bytes;
}
    
public Object toObject (byte[] bytes)
{
  Object obj = null;
  try {
    ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
    ObjectInputStream ois = new ObjectInputStream (bis);
    obj = ois.readObject();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  catch (ClassNotFoundException ex) {
    //TODO: Handle the exception
  }
  return obj;
}

'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
Exceptions  (0) 2011.09.05
자바. 얼마나 알고 사용하고 계신가요?  (0) 2011.08.25
메서드 체인화 기법  (0) 2011.08.17
몸이 지친건지.. 이상한데서 실수를 많이 한다. 어쩌면 그냥 바보일지도 모르겠다.

지금 널 포인터 때문에 생긴 문제도 어이없는 실수지만, 이거 전에 DB 테이블 생성하는데
CREATE TABEL 이라고 써놓고 익셉션 떠서 한참 찾았더랬지.
사실 로그에 "저 부분이 문장이 틀렸다고!" 라고 알려주는데 알아채지 못했다.

LABEL을 하도 많이 써서 그런지 이상하게 요즘 LE로 끝나는 단어를 EL로 쓰거나 EL로 끝나는 걸 LE로 쓴다.

좋지 않은 습관이지만 디버깅 툴을 이용하기 보다는 클래식하게(?) 화면 출력으로 변수 값을 찍으면서 디버깅 하곤 했는데
널 포인터 예외가 뜨길래 대체 널 포인터 날 구석이 없어서 한참을 방황하다가
결국 이클립스의 디버깅 모드로 차근차근 실행해봤다. 한줄 한줄 따라가고 있는데.. 이게 뭐야!!!!

return null;
...
return null;
...
return null; 
 


리턴 널이라니!!! 안드로이드 그리드에 연결한 어댑터에서 getView 메서드에... 왜 저런게 들어가있지..??????????

이것 때문에 별 이상한 소스부분을 다 봐서 왠만한 예외처린 더 한 듯하다.
한동안은 예외 생기면 리턴쪽만 볼 것 같다. -_


추가. 하아......



'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
롬업 후 APN 설정  (0) 2011.08.23
DHD LeeDroid 롬업, 커널업 완료  (0) 2011.08.22
아빡치 에잇퉤퉤페 Apache Http Client  (0) 2011.08.18
자바 개발 환경 구축
SDK 설치
ADT 설치
Apache Commons HttpClient 라이브러리를 찾을 수가 없다!

자바 표준 라이브러리의 Http관련 클래스를 쓰려고 찾다보니 예제 소스가 아파치 프로젝트의 HttpClient를 사용하는게 대부분이었다.

패키지는 org.apache.commons. httpclient

그런데 아무리 찾아봐도 아파치 프로젝트 홈페이지에서는 저 패키지의 라이브러리를 찾을 수가 없다 -_ - 이곳저곳, 말도 안되는 라이브러리 받아서 내용 보고.. 한참을 돌아다니다가 HttpComponents 라이브러리 소개 내용을 보다가 눈에 걸리적 거리는게 있었는데...

HttpComponents Client is a successor of and replacement for Commons HttpClient 3.x. Users of Commons HttpClient are strongly encouraged to upgrade.


"HttpComponents Client는 Commons HttpClient 3.x 의 대체입니다. Commons HttpClient 유저들은 업그레이드 할 것을 강력히 추천합니다." 

네 그렇습니다. commons의 HttpClientHttpComponents
대체 되었습니다.

근데 왜 HttpComponents 홈페이지의 예제 코드는 아직도 commons를 사용하고 있냐고... 괜히 이것 때문이 더 헷갈렸다.


혹시나 HttpClient 라이브러리를 아파치 홈페이지에서 찾고 계신 분은
Http Components 라이브러리를 받으시면 되겠습니다.
그리고 commons를 찾고 계시는 분들을 위해 링크를 걸어둡니다.

'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
롬업 후 APN 설정  (0) 2011.08.23
DHD LeeDroid 롬업, 커널업 완료  (0) 2011.08.22
왜 대체 NullPointerException이 뜨는거야!  (0) 2011.08.22
안드로이드 NFC 예제를 보면서 괜찮은 기법이 있어서 소개할까합니다. (저만 몰랐던 걸 수도 있구요. :D ) 

제가 본 소스의 일부를 쓰자면

BiMap<Byte, String> URI_PREFIX = BiMap.<Byte, String>builder()
            .put((byte) 0x00, "")
            .put((byte) 0x01, "http://www.")
            .put((byte) 0x02, "https://www.")
            .put((byte) 0x03, "http://")
            .put((byte) 0x04, "https://")
            .put((byte) 0x05, "tel:")
            .build();



맵에 요소를 넣으면서 URI_PREFIX에 인스턴스를 할당하는 구문입니다. 

처음 봤을 때는 저게 원래 자바에서 지원하는 문법인가 싶어서  객체 안에 있는 메서드
위처럼 세미콜론 없이 닷만 찍어서 계속 해보려했는데 당연히도 에러가 나더군요. 

위 문장을 보고 저게 뭐? 라고 생각하셨다면 아래에 쓰는 체이닝 기법을 적용하지 않고 작성한 소스를 보고 비교해보세요.

BiMap<Byte, String> URI_PREFIX =
BiMap.<Byte, String>builder().build(); 
URI_PREFIX.put((byte) 0x00, "");
URI_PREFIX.put((byte) 0x01, "http://www.");
URI_PREFIX.put((byte) 0x02, "https://www.");
URI_PREFIX.put((byte) 0x03, "http://");
URI_PREFIX.put((byte) 0x04, "https://");
URI_PREFIX.put((byte) 0x05, "tel:"); 


개인적인 차이일지도 모르겠지만 저는 체이닝 기법을 적용한 소스가 더 깔끔하고 직관적으로 느껴지네요. 서론은 여기까지 하고 실제로 어떻게 체이닝 기법을 적용할 수 있는지 예제를 만들면서 알아봅시다.

만들 클래스는 간단한 학생 정보 클래스입니다. 체이닝 기법을 적용한다고 해서 그리 효율적인 클래스가 되진 않겠지만 간단한 예를 위해서 이 클래스를 씁니다.

/** 학생정보 클래스 */
class Student{
private String name; // 학생이름
private String number; // 학번
private int birthyear; // 생년
private String dept; // 학과 

public void setName(String name){
this.name = name;
}

public void setNumber(String number){
this.number = number;
}

public void setBirthyear(int birthyear){
this.age = age;
}

public void setDept(String dept){
this.dept = dept;
}

/* getter 생략 */ 
}



위 클래스에서 생성자를 두지 않는다고 가정하면 학생 인스턴스에 정보를 넣기위해서는 아래와 같이 코드를 작성하게 되겠죠

Student student = new Student();
student.setName("세종대왕");
student.setNumber("7284910");
student.setBirthyear(1397);
student.setDept("국어국문학과");



체이닝 기법을 적용하기 위해서 뮤테이터(세터) 메서드의 반환형을 void에서 오브젝트를 반환하도록 Student 타입으로 바꿔 줍니다.
그리고 메서드 구현부의 끝에 return this;를 써서 객체를 반환하도록 하구요.
DSL에서는 setName과 같은 메서드 이름도 더 직관적으로 바꾸지만 익숙함을 위해서 그대로 쓰도록 하겠습니다. 위의 Student 클래스를 체이닝 기법을 적용하기 위한 소스로 바꿔보면 아래와 같습니다. 빨간색 글씨가 수정된 부분입니다

/** 학생정보 클래스 */
class Student{
private String name; // 학생이름
private String number; // 학번
private int birthyear; // 생년
private String dept; // 학과 

public Student setName(String name){
this.name = name;
return this;
}

public Student setNumber(String number){
this.number = number;
return this;
}

public Student setBirthyear(int birthyear){
this.age = age;
return this;
}

public Student setDept(String dept){
this.dept = dept;
return this;
}

/* getter 생략 */ 
}



클래스를 바꿨으니 인스턴스를 할당할 때도 바로 적용해 봅시다.

Student student = new Student()
.setName("세종대왕")
.setNumber("7284910")
.setBirthyear(1397)
.setDept("국어국문학과");



네. 이상입니다.
원리는 간단합니다. 계속해서 객체를 반환하니 메서드를 다시 호출해서 쓸 수 있고. 역시 student 변수는 Student 클래스 타입이니 반환한 객체 그대로 받을 수 있게 됩니다.  

'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
Exceptions  (0) 2011.09.05
자바. 얼마나 알고 사용하고 계신가요?  (0) 2011.08.25
객체를 바이트 배열로, 바이트 배열을 객체로  (0) 2011.08.22
Forget Me Not project

Fields 7 6 5 4 3 2 1 0
Header MB ME CF SR IL Type Name Format
1 1 0 1 0 0x01
Type length 0 0 0 1 0 0 0 1
Payload length ?
Type 16 0 1 1 1 0 0 1 1
...
Type 0 0 1 0 0 0 1 0 0
Payload n
...
Payload 0

먼저 헤더 필드의 flag를 지정하면
- 태그에는 1개의 메시지, 1개의 레코드를 사용하므로 MB, ME flag 는 1이다.
- Chunk 되지 않았으므로 0의 값
- 짧은 타입의(Short Record) 레코드 이므로 SR = 1
- ID는 사용하지 않으므로 IL = 0
- TNF(Type Name Format) : NFC Forum well-known type = 0x01

NFC 포럼에서 사용하는 규격의 타입이 아니므로 외부타입으로 만들어줘야 한다.
NDEF 상세에 따라 타입 이름을 작성하면  dns-part:name-part 형식에 맞춰서

Type Name : smartmenu.com:RID

US-ASCII 캐릭터 셋으로하여 byte 배열을 얻으면 문자열 길이대로 17개의 바이트 배열이 나오고 결과는 아래의 값이다.

TYPE LENGTH : 0x11, 17(10)
TYPE : 0x73  0x6d  0x61  0x72  0x74  0x6d  0x65  0x6e  0x75  0x2e  0x63  0x6f  0x6d  0x3a  0x52  0x49  0x44

PAYLOAD 의 문자 인코딩은 UTF-8을 사용하고 PAYLOAD에 들어갈 내용은
식당을 식별할 수 있는 사업자 번호와 테이블을 식별할 수 있는 테이블 번호가 연속으로 들어간다.
이에따라 PAYLOAD의 LENGTH가 결정되고, PAYLOAD에 byte 값을 가지게 된다.




- 최종 작성일 : 11.08.17

[참고 사항(제약)]
1. The External Type MUST be formed by taking the domian name of the issuing organization, adding a colon, and then adding a type name, An External Type MUST include a colon and a non-zero length type name [NFC Record Type Definition 2.3]

2. Type Name ABNF format - 아래의 규칙을 따라서  Type Name 작성
external-type = dns-part “:” name-part
dns-part = 1*DNS-char
name-part = 1*WKT-char
WKT-char = upper / lower / number / other
DNS-char = upper / lower / number / “.” / “-”
upper = “A” / “B” / “C” / “D” / “E” / “F” / “G” / “H” / “I” / “J” / “K” / “L” / “M” / “N” / “O” / “P” / “Q” / “R” / “S” / “T” / “U” / “V” / “W” / “X” / “Y” / “Z”
lower = “a” / “b” / “c” / “d” / “e” / “f” / “g” / “h” / “i” / “j” / “k” / “l” / “m” / “n” / “o” / “p” / “q” / “r” / “s” / “t” / “u” / “v” / “w” / “x” / “y” / “z”
number = “0” / “1” / “2” / “3” / “4” / “5” / “6” / “7” / “8” / “9”
other = “(“ / “)” / “+” / “,” / “-” / “:” / “=“ / “@” / “;” / “$”
[RFC 2234]

'싹이 움트다 > Dianthus' 카테고리의 다른 글

Dianthus  (0) 2011.08.17
NDEF 레코드에서 Text 레코드 타입의 정의입니다. 즉 NDEF Record가 Text 일때의 포맷입니다.

NDEF Message에 관한 전반적인 내용은 아래 링크된 글에서 참조 하시기 바랍니다.
NFC Data Exchange Format

1. NDEF Text Record
PAYLOAD의 레이아웃입니다. 표에서의 각 한칸은 1bit를 의미합니다.
7 6 5 4 3 2 1 0
UTF RFU Language code length
Language code (US-ASCII)
Actual text body

1) UTF - Text encoding
UTF 필드는 실제 텍스트 정보의 인코딩입니다.
UTF 값이 0이면 UTF-8 인코딩, 1인 경우 UTF-16 입니다.

2) RFU
RFU 필드는 Reserver for Future Use의 준말로써 아직 사용하지 않는 필드이며 예약된 필드 영역입니다. 이 값은 현재는 무조건 0으로 주시면 됩니다.

3) Language Code Length
텍스트 정보의 언어 코드 정보를 표현하는 필드의 길이입니다.
이 필드의 값에 따라 2번째 바이트에 위치한 Language Code 필드의 바이트 수가 정해집니다. Language code length의 값이 3 (2진수 000011) 인 경우 아래쪽 Language code 의 바이트 수(비트가 아닙니다 - 표에서의 한줄이 1byte 입니다.)는 3개가 되겠죠. 아래쪽에서 예제로 다시 설명하겠습니다.

4) Language code
텍스트 정보의 언어 코드 정보입니다. RFC 3066에 IATA의 형식으로 표기하시면 되고 인코딩은 US-ASCII입니다.
RFC 3066의 정보를 깔끔하게 정리해놓은 사이트가 있어 링크 걸어둡니다.
Using Language Identifier

5) Actual text body
실제 텍스트 정보가 들어가는 부분입니다. 텍스트의 길이에 따라서 복수의 byte를 가질 수 있습니다.



2. 간단한 예제
"안녕하세요 NFC 텍스트 레코드입니다." 라는 정보를 담는 텍스트 레코드를 만들어보는 예제입니다. NDEF Message의 헤더부분은 따로 쓰지 않겠습니다.

UTF-8로 인코딩하고 IATA 언어 코드는 "ko-KR"입니다.
따라서 UTF 필드는 0

RFU필드는 자동적으로 0 (사용하지 않는 필드이므로)

언어 코드의 길이(Language code length)는 ko-KR 이므로 십진수로 5이고 이진수로는 여섯 비트에 걸쳐 0 0 0 1 0 1 입니다.

언어코드는 "ko-KR"(한글)을 사용하므로 이를 아스키값으로 표현하면
0x6b,  0x6f,  0x2d,  0x4b,  0x52 입니다. 즉 표에서보면 5줄로 표현되며 각 줄에 위의 값이 표시됩니다.

실제 텍스트 부분입니다. UTF-8로 인코딩하여 byte값을 얻어보면
0xec  0x95  0x88  0xeb  0x85 
0x95  0xed  0x95  0x98  0xec 
0x84  0xb8  0xec  0x9a  0x94 
0x20  0x4e  0x46  0x43  0x20 
0xed  0x85  0x8d  0xec  0x8a 
0xa4  0xed  0x8a  0xb8  0x20 
0xeb  0xa0  0x88  0xec  0xbd 
0x94  0xeb  0x93  0x9c  0xec 
0x9e  0x85  0xeb  0x8b  0x88 
0xeb  0x8b  0xa4  0x2e
네.. 좀 기네요 길이는 49입니다. 그럼 Actual text body는 총 49바이트 (표에서 49줄)의 정보를 가지게 되고 각 줄에 위의 바이트 값들을 가지게 되겠죠

여기서 혹시나 알아채신 분이 있다면 실제 텍스트의 길이는 어떻게 구하느냐 인데. 이 글에서 표현하는 정보는 Payload에 국한되어있습니다. Payload의 길이는 자기자신이 가진게 아니라 Message에서 가지고 있으므로 Message에서 가진 Payload의 길이에서 Actual text body 부분을 제외한 바이트 수를 빼면 Actual text body의 길이가 됩니다.

[결과]
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 1
Language code (US-ASCII encoding ) : "ko-KR" to bytes
0x6
0x6f
0x2d
0x4b
0x52
Actual text body contents : "안녕하세요 NFC 텍스트 레코드입니다." to bytes
0xec
0x95
0x88
0xeb
0x85
0x95
0xed
0x95
0x98
0xec
0x84
0xb8
0xec
0x9a
0x94
0x20
0x4e
0x46
0x43
0x20
0xed
0x85
0x8d
0xec
0x8a
0xa4
0xed
0x8a
0xb8
0x20
0xeb
0xa0
0x88
0xec
0xbd
0x94
0xeb
0x93
0x9c
0xec
0x9e
0x85
0xeb
0x8b
0x88
0xeb
0x8b
0xa4
0x2e



[참고자료]
NFC Forum Text Record Type Definition

+ Recent posts