구글에서 TCP Fast Open paper를 발표했다.

<광고 동영상>

 

Let's make TCP faster

http://googlecode.blogspot.com/2012/01/lets-make-tcp-faster.html 에 간단한 요약자료가 있다.

 

1. TCP initial congestion window 를 10으로 늘리자. TCP connection 처음에는 3패킷만 전달되게 되어 있는데. 이를 수정하면 10% 이상의 지연시간을 줄 일 수 있다.

2. 초기 timeout을 3에서 1로 줄이자.

3. TCP Fast Open를 사용하자. 기존의 33%의 HTTP 요청은 TCP 연결에 사용 된다. 이를 개선한 TCP Fast Open은 Page Load 시간을 평균 10%, 때로는  40%까지 줄일 수 있다.

4. Proportional Rate Reduction for TCP를 사용하자. 네트웍으로 전달되는 패킷 손실은 순서가 꼬이거나 충돌로 문제가 될 수 있다. 새로운 recovery 알고리즘이 필요하여 부드럽게 재전송을 하도록 해서 빠르게 할 필요가 있다. 현재 이 것은 리눅스 커널에 탑재되어 있고, TCP 표준에 추가될 예정이다.

 

TCP Fast Open paper 링크는 아래와 같다.

http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/ko//pubs/archive/37517.pdf

 

Proportional Rate Reduction for TCP 에 대한 paper 링크는 다음과 같다.

http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/ko//pubs/archive/37486.pdf

 

시간 될 때 봐야겠다.

Posted by '김용환'
,

 

온도는 쉽게 이해하지만, 습도는 약간 공부를 해야 한다.

위키(http://ko.wikipedia.org/wiki/%EC%8A%B5%EB%8F%84) 에 따르면 다음과 같이 상대습도를 설명하고 있다.

상대습도는, 특정한 온도대기 중에 포함되어 있는 수증기의 압력을 그 온도의 포화 수증기 압력으로 나눈 것을 말한다. 다시 말해, 특정한 온도의 대기 중에 포함되어 있는 수증기의 양(중량 절대습도)을 그 온도의 포화 수증기량(중량 절대습도)으로 나눈 것이다.

상대습도 100%로, 대기 중의 수증기량이 포화되어, 결로 현상을 일으킨다. 또 그때의 온도를 이슬점 온도라고 한다.

 RH = {p_{(H_2O)} \over p^*_{(H_2O)}} \times 100%

 

HIH-4030  센서는 상대습도를 체크하는 센서이기 때문이다. 따라서 수증기의 양과 온도를 가지고 측정하는 센서이다. 생긴 것은 아래와 같이 생겼다.

 

 

습도 센서 HIH-4030은 5V에서 최적화되어 동작한다. 
(http://www.sparkfun.com/datasheets/Sensors/Weather/SEN-09569-HIH-4030-datasheet.pdf)

특별히 저항을 넣지 않고 바로 쓸 수 있다.

image

(http://www.sparkfun.com/datasheets/Sensors/Weather/HIH-4030_Breakout-v10.pdf)

이 센서는 상대 습도 (Relative Humidity %RH)를 측정하고 analog output pin(위의 그림으로 OUT)으로 voltage 값을 던진다. 아두이노에서는 이 analog output pin의 값을 읽어 처리하면 된다.  오차는 +-3.5이다. -40~85 도에서 측정가능하다.

상대습도는 공기 중에 포함되어 있는 수증의 양 또는 비율을 나타낸다. (http://ko.wikipedia.org/wiki/%EC%8A%B5%EB%8F%84) 이 값을 측정하는 법이 hih 4030 datasheet에 잘 나와 있다. (http://www.sparkfun.com/datasheets/Sensors/Weather/SEN-09569-HIH-4030-datasheet.pdf)

 

image

표에 보면, 두가지 값이 나온다.

Voltage output 과 Temperature compensation 이다. 이 공식을 잘 봐둔다.

 

센서의 달인이 아닌 관계로 누군가의 글을 참조해야 했다.

일본사람의 블로그를 참조(http://www.eleki-jack.com/FC/2011/04/arduinohih4030.html) 하여 정리해본다.

 

(첫번째: Voltage output)

Vout =(Vsupply)0.0062(sensorRH) + 0.16)

sensorRH 값을  좌항으로 옮기는 식을 만드면 다음과 같다.

sensorRH =(Vout/Vsupply)×(1/0.0062)- 0.16 ×(1/0.0062)  ---- (1)

Vout/Vsupply (전원대비 출력전압) 에 대해서 1/0.0062 기울기를 가진다고 볼 수 있다.

 

(두번째 : Temperature compensation)

공식를 그대로 적어본다. T 는 섭씨 온도이다. 즉 온도가 필요한 것이다.

RH= sensorRH /(1.0546 - 0.00216 × T)  -- (2)

 

참고로 센서의 출력 전압은 다음 공식이다.

Vout = Vsupply × (아날로그 입력 값 /1024)

다음 식으로 치환이 된다.

Vout / Vsupply = (아날로그 입력 값 / 1024)

 

위의 식을 (1) 식에 적용해 본다.

sensorRH =(Vout/Vsupply)×(1/0.0062)- 0.16 ×(1/0.0062)

Vout / Vsupply = (아날로그 입력 값 / 1024)

 

SensorRH의 값은 다음의 값을 가지게 된다.

SensorRH = (아날로그 입력 값/1024)  X (1/0.0062) – 0.16 X (1/0.0062)

 

테스트를 시작해 본다. 

아래와 같이 셋팅한다.

image

 

코드를 업로드 한다.


float vdd = 5.0;
int indata;
float sRH;

void setup() {
  Serial.begin(9600);
}

void loop() {
  indata = analogRead(0);
  sRH = (indata/1024.0)/0.0062-0.16/0.0062;
  Serial.println(sRH);
  delay(1000);
}

 

Serial Monitor 창을 열어 sensor RH 값을 얻는다.

image

 

이제 진짜 RH를 구해야 할 차례이다.

 

이번에는 온도를 이용해서 다른 식을 구해야 한다. 이번에 습도 센서 공식 2를  다시 작성한다.

sensorRH 값과 T 온도 값을 넣어야 실제 습도를 체크할 수 있다.

RH= sensorRH /(1.0546 - 0.00216 × T) 

 

이미 sensor RH를 구했으니 T만 구하면 된다.

 

온도 센서는 TMP 36을 이용한다.

 

(이미지 : http://www.ladyada.net/learn/sensors/tmp36.html)

 

OUT를 analog port 1로 연결한다.

 

 

이것을 보드에 잘 연결한다.  (선이 개판이긴 하지만..)

image

 

온도 T를 구하기 위해서는 TMP 36 data sheet 과 TMP 36 튜터리얼 을 이용한다.

 

data sheet에 나와 있는 자료를 본다 .(http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf)

image

The TMP36 is specified from −40°C to +125°C, provides a 750 mV output at 25°C, and operates to 125°C from a single 2.7 V supply. The TMP36 is functionally compatible with the LM50. Both the TMP35 and TMP36 have an output scale factor of 10 mV/°C.

 

그 다음은 튜터리얼(http://www.ladyada.net/learn/sensors/tmp36.html)을 참조했다.

 

먼저 Voltage를 구하고, 섭씨 온도를 구한다.

Voltage at pin in milliVolts = (reading from ADC) * (5V/1024)  ----- (1)

Centigrade temperature = [(analog voltage in mV) – 0.5] / 10 –---- (2)

 

이제 온도 T를 구하는 공식은 다음과 같다.

 

T = ((input * 5 / 1024) – 0.5 ) / 10

 

그렇다면, 위의 T 값을 구하면 RH를 구할 수 있다.


RH= sensorRH /(1.0546 - 0.00216 × T) 

 

이를 코드로 하면 다음과 같다.

 

float vdd = 5.0;
int indata0, indata1;
float sRH;
float RH;
float voltage;
float temperatureC;

void setup() {
  Serial.begin(9600);
}

void loop() {
  indata0 = analogRead(0);
  sRH = (indata0/1024.0)/0.0062-0.16/0.0062;

  indata1 = analogRead(1);
  voltage = indata1*5.0/1024.0;
  temperatureC = (voltage - 0.5) * 100;
  Serial.print(temperatureC); Serial.println(" 'C");
 
  RH=sRH/(1.0546-0.00216*temperatureC);
  Serial.print(RH);
  Serial.println(" RH");
  Serial.println("----");
  delay(1000);
}


온도와 습도 값이 잘 나온다.

image

 

상대 습도이니. 만약 HIH-4030 센서에 입김을 불면 확실히 값이 달라지게 나와야 할 것이다.

지금 온도가 23.73 C 이고, 20.43 습도를 가지고 있는데, 입김을 부니, 온도와 습도의 값이 올라간다.

image

 

 

5초에 한번씩 테스트할 때, 온도 센서인 tmp 36의 상태를 보면, 조금씩 튀는 것이 보인다. 아마도 센서이다 보니 오차가 있을 수 있다. 온도가 바뀌면 자연스럽게 상대 습도에도 영향이 받는다. 그래서 빛&감열 센서를 이용하면 좀더 정확한 값을 얻을 수 있다고 튜터리얼에 적혀 있다. (http://www.ladyada.net/learn/sensors/tmp36.html)

 

아래 그림을 참조했다.

 

온도센서 근처에 빛&감열 센서 와 저항 10k를 달고 analog 3번 input으로 받도록 했다. 그리고, 전원을 aref input으로 넣게 했다. 이렇게  하면 정확한 volt 값을 알 수 있다고 한다. 해봤는데. 크게 차이가 나지 않는다.

 

image

 

상대 습도계는 기본적으로 오차가 거의 없는 좋은 온도 센서가 있어야 습도 값을 구할 수 있다. 그래서 온도계를 잘 만드는 회사가 습도계를 잘 만드는 것 같다. 선물용으로 주는 이름없는 브랜드를 까보니. 온도센서의 값이 100원짜리다.. 온도 센서의 값어치를 잘 알아야 할 것 같다는 생각을 하게 되었다.

 

마치며…

별 것은 없지만, 생각보다 많은 시간이 소요되었다. 센서에 대한 이해라든가, 수치에 대한 이해라든가.. 이 부분에 대해서 깊은 내공이 쌓여야 할 것 같다.

다음은 온도와 습도의 값을 읽어 자바 언어를 이용해서 MRTG로 만들려고 한다. 이를 통해서 내가 있는 곳의온도/습도의 추이를 보려고 하려고 한다.

Posted by '김용환'
,

 

Webwork를 MVC Framework로, BO, DAO를 Spring으로 쓰다가 Spring 2.X대의 MVC 의 xml bean 설정 때문에 귀찮아했는데.. 그러나 Spring 3.0부터는 annotation을 추가하면서 좋아졌다. (반면 점점 복잡해질 웹 프로젝트의경우는 xml 설정으로 가는 게 더 나을 수 있다. annotation을 쓰면 클래스 이름을 잘 맞춰야 할 것 같다. )

아래 링크를 토대로 Spring 3 MVC Annoataion 기초 내용을 바탕으로 한 자료를 가지고 아주 간단한 maven 프로젝트를 만들었다.

http://www.raistudies.com/spring-mvc-tutorial/
http://www.mkyong.com/spring-mvc/spring-mvc-form-handling-annotation-example/
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html
http://blog.springsource.org/2010/07/22/spring-mvc-3-showcase/
http://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/
http://blog.springsource.org/2009/12/21/mvc-simplifications-in-spring-3-0/

 

> > Spring MVC 3 맛보기 maven 프로젝트 다운

 

 

war 파일 없이 간단하게 mvn clean jetty:run을 이용해서 쉽게 테스트가 가능하다.

Posted by '김용환'
,

 


1. 톰캣 7 (tomcat 7)

http://repo2.maven.org/maven2/org/apache/tomcat/tomcat-catalina/

  <groupId>org.apache.tomcat</groupId>
  <artifactId>tomcat-catalina</artifactId>

이미지#1) nexus 정보

image

 

 

톰캣 6 (tomcat 6)

http://repo2.maven.org/maven2/org/apache/tomcat/catalina/

  <groupId>org.apache.tomcat</groupId>
  <artifactId>catalina</artifactId>

이미지#2) nexus 정보

image

 

특이할 점은 tomcat 6에는 sources.jar가 없다. tomcat 7부터 sources.jar를 하도록 했기 때문이다. 이것때문에 tomcat 개발자들 사이에 미묘한 긴장감이 있었다. 결국은 sources.jar도 들어가도록 일부 내용이 수정되었다. (spring 프로젝트라면 당연할 것 같지만, apache 프로젝트는 좀 보수적이라 쉽지 않다. 어서 좋게 바뀌길 바랄 뿐~ 톰캣에 대한 기대를 앞으로 더욱 기대할 수 있을 것 같다. )

Posted by '김용환'
,

 

Jetty는 Websocket를 지원하고 있는데, 톰캣은 지원하지 않고 있다. 그러나 톰캣도 조만간에 web socket을 지원할 것 같다. 아직 공지를 하지 않았지만, 리더인 Mark Tomas는 이메일을 통해서 속도보다는 기능 측면에서 구현한 코드를 내어놓았다. 구조를 크게 바꾸지 않은 상태로 진행하려는 Mark Tomas의 노력이 있어보인다. 

http://people.apache.org/~markt/patches/draft/2012-01-24-websocket.patch

코드를 완벽히 구현한 것은 아니고 간단하게 틀만 제공한 것으로서 톰캣 내부 개발자들이 잘 만들리라 생각된다. (참고로. 톰캣과 아파치 쪽은 상당히 보수적으로 운영되고 있어서 왠만하면 잘 구현 안해준다. 커미터들도 상당히 제한된 사람들로 이루어진 부분이 있다. 개인적으로 친해진다면 잘 구현해줄지도.. )

 

소스 내용을 잠깐 소개하면 다음과 같다. (내용은 언제든지 바뀔 수 있을 것이다.)

1. org.apache.catalina.websocket 패키지를 추가

2. 소켓에 Upgrade 개념을 추가함

SocketState 에 Upgrade를 추가

public abstract class AbstractEndpoint {

         public enum SocketState {
             // TODO Add a new state to the AsyncStateMachine and remove
             //      ASYNC_END (if possible)
-            OPEN, CLOSED, LONG, ASYNC_END, SENDFILE
+            OPEN, CLOSED, LONG, ASYNC_END, SENDFILE, UPGRADE
         }

 

3. 클래스 구조

image

 

 

image

 

image

 

image

 

4. 예제

클라이언트

+<script type="text/javascript">
+function echo() {
+  if ("WebSocket" in window) {
+    alert("WebSocket is supported by this browser.");
+
+    // TODO: Can we use relative URLs?
+    var ws = new WebSocket("ws://localhost:8080/examples/websocket/echo");
+    ws.onopen = function() {
+      ws.send("Connection opened");
+      alert("WebSocket connection opened.");
+    }
+    ws.onmessage = function(event) {
+      alert("Received: " + event.data);
+    }
+    ws.onclose = function() {
+      alert("WebSocket connection closed.");
+    }
+    // TODO: Extend with a text box for users to enter data
+  } else {
+    alert("WebSocket is not supported by this browser.");
+  }
+}
+</script>

 

자바 서블릿 코드

+public class Echo extends WebSocketServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected StreamListener createWebSocketConnection() {
+        return new EchoListener();
+    }
+
+    private static final class EchoListener extends StreamListener {
+
+        @Override
+        protected void onBinaryData(InputStream is) throws IOException {
+            // Simply echo the data to stdout
+            int i = is.read();
+            while (i != -1) {
+                System.out.write(i);
+                i = is.read();
+            }
+        }
+
+        @Override
+        protected void onTextData(Reader r) throws IOException {
+            char[] c = new char[1];
+            int i = r.read(c);
+            while (i != -1) {
+                System.out.println(c);
+                i = r.read(c);
+            }
+        }
+    }
+}

Posted by '김용환'
,

 

web.xml 에서 Dispatcher servlet 에 대한 url-pattern 에 오타를 냈더니. jsp로 redirect가 안된다. 하하~^^;;

org.springframework.web.servlet.DispatcherServlet noHandlerFound

 

오타내지 말아야지.

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

<servlet-mapping>
  <servlet-name>mvc-dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

Posted by '김용환'
,

 

톰캣 정보를 공유하는 tomcatexpert.com에서 2011년에 팁&테크로 올린 내용 중 인기있는 내용 10개를 추려 놓았다.  이 중 괜찮은 내용만 뽑아본다.

http://www.tomcatexpert.com/blog/2012/01/04/year-review-2011

 

1. Cross-site Scripting (XSS) Prevention in Apache Tomcat 7

http://www.tomcatexpert.com/blog/2011/01/26/cross-site-scripting-xss-prevention-tomcat-7

Setting useHttpOnly to true in the $CATALINA_BASE/conf/context.xml file will turn on cross-site script protection for all webapps.

 

2. Performance Tuning the JVM for Running Apache Tomcat

http://www.tomcatexpert.com/blog/2011/11/22/performance-tuning-jvm-running-tomcat

-server, –Xss, -XX:PermSize and -XX:MaxPermSize, -Xms and -Xmx

-XX:+UseParallelGC, -XX:+UseConcMarkSweepGC, -XX:+UseParallelOldGC, -XX:+CMSIncrementalMode

 

3. Setting Up Measurement of Garbage Collection in Apache Tomcat

http://www.tomcatexpert.com/blog/2011/11/16/setting-measurement-garbage-collection-apache-tomcat

  • -Xloggc:$CATALINA_HOME/logs/gc.log or   Xloggc:%CATALINA_HOME%/logs/gc.log
  • -XX:+PrintHeapAtGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -XX:-HeapDumpOnOutOfMemoryError

 

4. A Finer Point of Apache Tomcat Valves

http://www.tomcatexpert.com/blog/2011/11/11/finer-point-apache-tomcat-valves

Posted by '김용환'
,

 

Tomcat 클래스 로더에 대한 패치가 6.0.28에 이루어졌다. 클래스 로딩이 갑자기 많아져서, 중복된 클래스를 찾는 부분이 일어나 링크에러가 나는 경우이다. 이것 때문에 deadlock이 발생하는 케이스이다. (동기화 문제는 늘 어려운 문제이다. )

이 문제는 클래스로딩이 많은 웹 서비스에서 어쩌다 한번 나타날 수 있으며 그 파장은 deadlock이다. WebappClassLoader 클래스의 loadClass 메서드와 findClass 안에서 로딩한 클래스가 두 개가 되면서 나타나는 현상이다.

이에 대한 톰캣 패치 내역과 소스를 살펴본다.

http://tomcat.apache.org/tomcat-6.0-doc/changelog.html

44041: Fix threading issue in WebappClassLoader that can lead to duplicate class definition under high load. (markt/fhanik)

 

https://issues.apache.org/bugzilla/show_bug.cgi?id=44041

Class clazz = Thread.currentThread().getContextClassLoader().loadClass("<Class Name>"); java.lang.LinkageError: duplicate class definition: com/ubikingenierie/bug/ClassLoadedDynamically at java.lang.ClassLoader.defineClass1(Native Method)

 

 

http://svn.apache.org/viewvc?view=revision&revision=941868

기존 코드 상으로는 클래스 로딩시 클래스의 이름을 가지고 했다. 이는 쓰레드 경쟁 관계에서 똑같은 클래스를 읽으므로서,

 

1. jsp 클래스 로딩시 synchronized가 새로 추가되었다.

/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JasperLoader.java

+ public synchronized Class loadClass(final String name, boolean resolve) throws ClassNotFoundException {

 

2.  컴파일러가 로드된 클래스를 최적화되지 않도록 한다.

tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/ResourceEntry.java

+ public volatile Class loadedClass = null;

 

3. 톰캣 디폴트 클래스 로더인 WebappClassLoader 클래스에서 클래스 이름에 대한 synchronized가 아닌 메소드 단위의 synchronized로 처리함으로서, 속도보다는 안정성을 더 중점을 둘 수 있다.

 

tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java

public Class loadClass(String name, boolean resolve)  {

  synchronized (name.intern()) {

…..

}

 

=>

public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {

}

 

 

protected Class findClassInternal(String name) {

    synchronized (name.intern()) {

       clazz = entry.loadedClass;

        if (clazz != null)

                return clazz;

…..

}

 

protected Class findClassInternal(String name) {

    synchronized (this) {

       clazz = entry.loadedClass;

        if (clazz != null)

                return clazz;

…..

}

Posted by '김용환'
,

 

오픈 소스 삼성에 있는 방법을 그대로 했는데, 갤탭에 이미지를 굽는 것만 하고 그 이상이 되지 않는다.  결국 컴파일만 한 것 같다.

먼가 더 있는 것 같은데.. 찾기 어렵다.  하여튼 실패기도 넣는 것도 좋을 것 같아서 적어본다.

 

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

 

기존 정보는 오픈소스 삼성 싸이트(https://opensource.samsung.com)에 공개되어 있다.

갤럭시탭 소스는 두가지 버전이 있다. 해외버전인 gt-p1000과 국내버전인 SHW-M180 버전이 있다. 나는 국내버전의 LGT 용만 가지고 테스트하려고 한다.


https://opensource.samsung.com/reception/receptionSub.do?method=search&searchValue=gt-p1000
https://opensource.samsung.com/reception/receptionSub.do?method=search&searchValue=m180

 

<운영체제 확인>

$ dpkg -s libc6  | grep Archite
Architecture: i386

이러면  32 비트, amd64가 나오면 64비트이다.

진저브레드 이상 컴파일하려면 64비트에서 돌리는 것이 편하다.

다운로드 링크 –> http://www.ubuntu.com/download/ubuntu/download

 

* 참고 32비트에서 컴파일 하려면. 좀 귀찮은 작업을 해야 한다.

아래와 같은 에러 문구가 나와서 여기저기 손봐야 한다.

build/core/main.mk:76: ************************************************************
build/core/main.mk:77: You are attempting to build on a 32-bit system.
build/core/main.mk:78: Only 64-bit build environments are supported beyond froyo/2.2.
build/core/main.mk:79: ************************************************************
build/core/main.mk:80: *** stop.  Stop.

1. 32비트 운영체제일 때는  ./build/core/main.mk 파일을 아래와 같이 주석을 추가한다. .

73 ifeq ($(BUILD_OS),linux)
74 build_arch := $(shell uname -m)
75 ifneq (64,$(findstring 64,$(build_arch)))
76 $(warning ************************************************************)
77 $(warning You are attempting to build on a 32-bit system.)
78 $(warning Only 64-bit build environments are supported beyond froyo/2.2.)
79 $(warning ************************************************************)
80 $(error stop)
81 endif
82 endif

=>

73 #ifeq ($(BUILD_OS),linux)
74 #build_arch := $(shell uname -m)
75 #ifneq (64,$(findstring 64,$(build_arch)))
76 #$(warning ************************************************************)
77 #$(warning You are attempting to build on a 32-bit system.)
78 #$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
79 #$(warning ************************************************************)
80 #$(error stop)
81 #endif
82 #endif

 

2. 다음 mk 파일에서 m64->m32로 변경한다.

./external/clearsilver/cgi/Android.mk
./external/clearsilver/java-jni/Android.mk
./external/clearsilver/util/Android.mk
./external/clearsilver/cs/Android.mk

LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += –m64

->

LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += –m32

 

 

 

<갤탭 소스 다운로드>

LGT 의 갤럭시탭 소스를 다운받는다.

https://opensource.samsung.com/reception/receptionSub.do?method=search&searchValue=m180

image

 

최신버전은 update3을 다운받는다. 다운받아서 내용을 보면, 달랑 kernel과 readme.txt 파일밖에 없다.

image

 

readme.txt 파일에 따르면, update2.zip 파일에 있는 플랫폼 파일을 다운받으라고 한다. 다운받고 커널 파일과 플랫폼 파일을 합친다.

<NOTICE>

The Platform opensource code is the same as that of TF09 version.

Get TF09 version opensource code - filename: SHW-M180L_Opensource_Update2.zip
(download site: opensource.samsung.com)
Unzip it, then you will see the file SHW-M180L_Platform_Gingerbread.tar.gz

 

파일을 모아본다.

image

 

tar.gz으로 묶인 플랫폼 소스의 readme.txt 파일을 보면, build 설명 방법이 잘 나와 있다.

How to build


1. Get android open source.
    : version info - Android gingerbread 2.3.3
    ( Download site : http://source.android.com )

2. Overwrite modules that you want to build.
- \external\iproute2 : Write "ip \" into "build\core\user_tags.mk" so that add this module.
- \external\webkit  : Delete this source tree at Android gingerbread and then copy & execute "clean build".
- \external\alsa-lib : Write "libasound \" into "build\core\user_tags.mk" so that add this module.

3. Add the following lines at the end of build/target/board/generic/BoardConfig.mk

BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM_BTLA := true
BT_ALT_STACK := true
BRCM_BT_USE_BTL_IF := true
BRCM_BTL_INCLUDE_A2DP := true
BOARD_USES_ALSA_AUDIO := true

4. make
- ./build.sh user

 

ubuntu 11.10 amd64 비트를 기반으로 설명한다.


<소스 다운로드>

* 참고자료
http://source.android.com/source/downloading.html

* jdk 6 설치

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

 

* 필요 패키지 설치

$ sudo apt-get install git-core gnupg flex bison gperf build-essential  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev  lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc lib32readline-gplv2-dev

(원래 문서에서는 lib32z-dev를 설치하라고 되어 있지만, Ubuntu 11.10 64비트에서는 해당 모듈을 설치할 수 없다. 따라서 대안인 lib32readline-gplv2-dev을 설치한다.)

$ sudo apt-get install libx11-dev:i386

 

* repo 설치

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

 

* 안드로이드 2.3.3 소스 다운로드
$ mkdir android-2.3.3-galtab
$ cd android-2.3.3-galtab
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1
$ repo sync

 

* LGT 삼성 갤탭 소스 복사
vmware player에서 소스가 있는 곳을 공유(/mnt/hgfs/vmware-share)해서 복사한다.


$ tar zxvf /mnt/hgfs/vmware-share/SHW-M180L_Platform_Gingerbread.tar.gz –C .

$ tar zxvf /mnt/hgfs/vmware-share/SHW-M180L_Kernel_Gingerbread.tar.gz –C .

$ mv Platform/ android-2.3.3-galtab-platform

$ mv Kernel/ android-2.3.3-galtab-kernel

 


<커널 소스 빌드>

* 툴체인 (Tool Chain) 설치

$ cd /usr/local
$ wget http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

* build.sh 파일 수정

$ cd ~/android-2.3.3-galtab-kernel
$ vi build_kernel.sh

1. TOOLCHAIN과 TOOLCHAIN_PREFIX 변수를 수정한다.

TOOLCHAIN=~/opt/toolchains/arm-2009q3/bin/
TOOLCHAIN_PREFIX=arm-none-eabi-
=>
TOOLCHAIN=/usr/local/arm-2009q3/bin/  
TOOLCHAIN_PREFIX=arm-none-linux-gnueabi-        

2. 28번째 줄에 있는 ^M은 삭제한다. (빌드시 에러처럼 보일 수 있어서.)

output 디렉토리를 확인한다.

ANDROID_OUT_DIR=`pwd`/Android/out/target/product/SHW-M180L

* Kernel 빌드

$ cd ~/android-2.3.3-galtab-Kernel/Kernel

$ make menuconfig

General setup->Initramfs source file->exit->exit->Yes 하고 설정을 save 한다.

image

(initramfs 적용방법과 적용하지 않는 방법 둘 다 써도 문제임)

$ cd ..

$ ./build_kernel.sh

(sh 내부에 ARCH=arm, tool chain 확인)

빌드 결과는 zImage과 커널 모듈파일이다. 커널 이미지가 제대로 있는지 확인한다.

$ ls ~/android-2.3.3-galtab-kernel/Kernel/arch/arm/boot/zImage

커널 모듈 파일이 제대로 있는지 확인한다.

$ ls -al ~/android-2.3.3-galtab-kernel/Kernel/drivers/*/*

 

* 나중에 이 파일을 이용하면 성능 효과를 높일 수도 있을 수 있을 것 같아서 우선 기억해둔다.

arch/arm/configs/p1_kor_M180L_defconfig 

* Clean 하기

$ ./build_kernel.sh Clean

 

<커널 파일을 tar로 만들기>

$ cd ~

$ tar cvf SHW-M180L-kernel.tar android-2.3.3-galtab-kernel/Kernel/arch/arm/boot/zImage
android-2.3.3-galtab-kernel/Kernel/arch/arm/boot/zImage

기존 이미지를 풀어서 새로 컴파일한 zImage 파일만 replace  해 본다.

image

 

그리고, 윈도우에서 7zip으로 tar 파일로 만들면 upload failed 가 뜬다. ubuntu에서 tar로 묶는다.

image

tar로 묶은 후 Odin으로 굽는다.

image

image

 

갤탭 로고는 나오는데, 무한 부팅되면서 이미지 upload 실패했다.

zImage 크기가 순정과 컴파일 이후의 것이 800kb가 차이날 정도로 다르다. 먼가 더 있는 것 같은데. 잘 모르겠다.

 

 

<안드로이드 소스 빌드>

$ cd ~/android-2.3.3-galtab

ubuntu 11.10에서 에러가 발생할 수 있으니. 일부 make 파일을 수정해야 한다.

$ vi frameworks/base/libs/utils/Android.mk

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

=>

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive

-fpermissive에 대한 설명은 gcc 4.1 이슈로서, 자세한 내용은 링크(http://nineye.com/blog/archives/543)를 참조한다.

$ vi build/core/combo/HOST_linux-x86.mk

HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0   
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

FORTIFY_SOURCE에 대한 설명은 링크(http://studyfoss.egloos.com/5280245)를 참조한다.


$ source build/envsetup.sh

$ lunch full-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.3
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRI40
============================================

$ make

….
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
Installed file list: out/target/product/generic/installed-files.txt

 

 

<플랫폼 소스 수정 및 빌드>

$ cd ~/android-2.3.3-galtab-platform/

$ vi build/target/board/generic/BoardConfig.mk

다음을 추가한다.
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM_BTLA := true
BT_ALT_STACK := true
BRCM_BT_USE_BTL_IF := true
BRCM_BTL_INCLUDE_A2DP := true
BOARD_USES_ALSA_AUDIO := true

$ vi build.sh

안드로이드 컴파일했던 디렉토리를 PLATFORMPATH로 수정한다.

export PLATFORMPATH="/home/kimyonghwan/android-2.3.3-galtab"

$ cd ~/android-2.3.3-galtab-platform/

$ ./build.sh user

Posted by '김용환'
,





Amazon에서 Nosql 인 Dynamo DB를 출시했다.

http://aws.amazon.com/dynamodb/
http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/Introduction.html?r=5435



모든 데이터는 SSD에 저장하고 AZ 에 자동으로 복제가 되게 하여 HA가 되게 했다고 한다.

가격도 상당히 싸다.




Amazon의 CTO 분의 블로그(http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html) 에 자세힌 내용이 담겨있다. 내 눈에 눈의 띈 부분을 발췌하면 다음과 같다. (역시 관찰력이 Creative하게 하는 것 같다..)

2007년 21st ACM Symposium on Operating Systems Principles 에서 발표한 Dynamo: Amazon’s Highly Available Key-value Store에 대한 정체 ("http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf")를 발표했었는데. 드디어 그 결실을 맺었다. 

DynamoDB의 가장 중요한 요구사항은 Scale과 성능상 Predictable 이었다. SimpleDB를 운영하면서 고객들이 어디서 불편함을 느꼈는지 하나하나 잘 분석했다.

고객들이 Simple DB를 쉽게 사용할 수 있다는 점, 복잡한 쿼리나 TX를 쓰지 않는 부분을 많이 성공했는데, 고객들은 Scale 이슈나 용량 제한으로 인해서 많이 부담을 느꼈다고 한다. 또한 성능 예측성, Consistency, 가격의 합리성(Pricing Complexity) 관점에서 수정하려고 애를 썼다.

이렇게 해서 DynamoDB가 출시되었다. 



마치며..
DynamoDB 가 나오면서 기존 DB 사로부터의 강력한 라이벌이 되지 않을까 생각이 든다. 가격이 생각보다 Reasonable했고 그동안의 Amazon의 Simple DB가 거의 장애가 나지 않았음을 볼 때 시장에 엄청난 일이 벌어지지 않을까 생각이 된다.


Posted by '김용환'
,