'심오한 세상'에 해당되는 글 31건

  1. maven에서 ojdbc 라이브러리 추가
  2. VirtualBox에 우분투 설치 후에 내부 네트워크 접속 설정하기
  3. Windows Update 오류 80070003
  4. Bundle-NativeCode의 비밀
  5. JAVA Date 날짜 계산 CLASS
  6. HBase 테스트 소스 (3)
  7. Hadoop & Hbase 설치 (2)
  8. Tomcat에 SSL 설정을 한 후, Windows Services로 구동시킬경우 오류
  9. 구글 캘린더와 아이폰 연동하기..
  10. iOS 4.2 소프트웨어 업데이트
  11. IE에서 엑셀 다운로드 구현시 에러가 나는경우 (3)
  12. [Android] Android requires .class compatibility set to 5.0. Please fix project properties. (2)
  13. Empty package가 보이지 않는다면...
  14. Java Collections API에 대해 모르고 있던 5가지 사항, Part 1 (1)
  15. Android NDK r4 OVERVIEW.TXT 문서 번역 (5)
  16. 안드로이드에 대한 오해와 실패의 그림자 (4)
  17. 안드로이드 에뮬레이터 AVD Configuration Error (3)
  18. 바쁜 직장인을 위한 스터디 방법(분야가 다른 직장인들 끼리는 어떻게?) (4)
  19. IE8에서 session 문제 (1)
  20. 오래전 부터 찾았던 메모리가 4G 일 경우 RAMDISK 설정하는 방법
  21. 나도 모르게....DDoS 공격자가 될지도....
  22. BDATuner.MPEG2TuneRequest ActiveX Buffer Overflow 취약점
  23. 리눅스에 JDK 설치하기 (1)
  24. SQL은 관계형 데이터베이스에서 사용되는 언어입니다. 그럼 "관계형"의 의미가 무엇일까요? (3)
  25. vi 사용법
  26. crontab 사용법
  27. mysql 스키마 백업
  28. Forward Proxy와 Reverse Proxy (1)
  29. 자바에서interface와abstract에관해
  30. 클래스 이름을 이용하여 클래스를 생성하는 방법

maven에서 ojdbc 라이브러리 추가



pom.xml 파일에 Oracle JDBC 드라이브를 dependency를 추가하려고 하니 maven repository에서 "oracle"을 넣고  검색을 했습니다.


1
2
3
4
5
<dependency>
    <groupid>com.oracle</groupid>
    <artifactid>ojdbc14</artifactid>
    <version>10.2.0.4.0</version>
</dependency>

위와 같이 나오더군요.

그래서 넣고 빌드를 하려고 하는데, 아래와 같은 에러가 났습니다.


1
Missing artifact ojdbc:ojdbc:jar:14


뭐지? 하고 구글링을 또 했습니다.

음...역시 라이센스가 무섭습니다.

오라클과 메이븐의 라이선스 문제로 메이븐 중앙 저장소에서 받을 수 없다고하네요.


그래서 아래와 같이 repository를 추가해야 한다고 합니다.


1
2
3
4
5
6
<repositories>
    <repository>
        <id>mesir-repo</id>
        <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
    </repository>
</repositories>


그러니 에러가 사라지네요.


메이븐 중앙 저장소에 이런 설명이 잘 없으니 구글링을 할 수 밖에 없네요.

설명만 있었으면 딱이었는데..


저작자 표시 비영리 변경 금지
신고

VirtualBox에 우분투 설치 후에 내부 네트워크 접속 설정하기



오늘 하루 종일 virtual box 설치해서 우분투를 설치했습니다.

맥북에어와 virtual box 로 설치한 ubuntu 가 서로 통신이 안되는 것이었습니다.

이걸 성공해야 교육 받으러 갈수 있는데 말이죠.


하지만, 드뎌 해결책 발견(http://simples.kr/21200)

먼저 virtual box에서 아래와 같이 세팅해주면 됩니다.

호스트전용 어댑터로. 이렇게 해야 호스트머신(본인PC) -> 가상머신(설치한 우분투)로 접근가능 한 상태가 됩니다.



그리고 우분투로 넘어가서 네트워크 세팅을 아래와 같이 추가해주면 됩니다.


1. /etc/network/interfaces 파일을 연다.


2. 아래 auto eht1 부분 추가해준다.

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

# The loopback network interface

auto lo

iface lo inet loopback


# The primary network interface

auto eth0

iface eth0 inet dhcp


auto eth1

iface eth1 inet static

address 192.168.56.105

netmask 255.255.255.0

gateway 192.168.56.1

dns-nameservers 168.126.63.1

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


3. /etc/init.d/networking restart


이렇게 서비스 재시작을 해주고나면 네트워크가 설정이 완료됩니다.

저작자 표시 비영리 변경 금지
신고

Windows Update 오류 80070003



오늘 윈도우 업데이트 하던 중 에러가 발생하였습니다.

구글 검색을 하니 죄다 영어라서;;;

네이버 검색을 했는데...안나오네요..

다음을 검색했습니다.

바로 나오네요 ㅋㅋㅋ


http://windows.microsoft.com/ko-KR/windows-vista/Windows-Update-error-80070003

위 페이지는 관련자료 페이지 입니다.


그리고 아래는 위 페이지의 내용을 발췌했습니다.

업데이트를 확인하는 동안 Windows Update 오류 80070003이 발생하면 Windows 에서 컴퓨터에 대한 업데이트를 식별하는 데 사용하는 임시 업데이트 파일을 제거해야 합니다. 임시 파일을 제거하려면 Windows Update 서비스를 중지하고 임시 업데이트 파일을 삭제한 후 Windows Update 서비스를 재시작하여 Windows 업데이트를 다시 확인해 보십시오.


아래는 제가 행했던 방법입니다.

1. 제어판>관리도구>서비스 로 이동하여, "Windows Update" 서비스를 중지했습니다.

2. "C:\Windows\SoftwareDistribution\DataStore" 과 "C:\Windows\SoftwareDistribution\Download" 폴더 파일을 모두 삭제하였습니다.

3. "Windows Update" 서비스를 시작했습니다.


위와 같은 작업을 하니 정상적으로 패치가 진행중입니다.

저작자 표시 비영리 변경 금지
신고

Bundle-NativeCode의 비밀



Bundle-NativeCode는 OSGi를 사용할 때, MANIFEST.MF 에 등록하여 사용하는 옵션입니다.

단어 그대로 Java에 Native Code를 사용하기 위해 필요한 옵션입니다.

제가 사용한 곳은 cpu등 시스템 정보를 가져오기 위해 사용했습니다.


다른 옵션은 콤마(,)를 이용하여 구분이 됩니다.

예를 들면, Import-Package 옵션은 각 패키지마다 콤마(,)로 구분합니다.

Import-Package: org.osgi.framework

 ,org.osgi.service.framework


마찬가지로 Bundle-ClassPath 옵션도 콤마(,)로 구분합니다.

Bundle-ClassPath: .,lib/jna-3.0.9.jar,lib/sigar.jar


이렇듯 대부분의 옵션들이 콤마(,)로써 구분이 되고 있습니다.


Bundle-NativeCode 옵션은 세미콜론(;)으로 구분하고 있습니다.

Bundle-NativeCode: lib/amd64-winnt.dll

 ;lib/x86-winnt.dll

 ;lib/x86-winnt.lib

 ;lib/amd64-linux.so

 ;lib/x86-linux.so


하지만, 위의 방식이 잘못된 것은 아니지만 어딘지 불완전해 보입니다.

Bundle-NativeCode 옵션에는 osname, osversion, processor 라는 추가 옵션이 있습니다.

그렇습니다. 위 코드들은 os와 processor에 구분이 되어 있지 않습니다.

그리고 하나더 주의해야할 점은 같은 아키택처를 사용하는 native code들은 묶어서 정의해줘야합니다.


그럼 이쁘게 바꿔보겠습니다.

Bundle-NativeCode: lib/amd64-winnt.dll; osname=win32; processor=x86_64,

 lib/x86-winnt.dll; lib/x86-winnt.lib; osname=win32; processor=x86,

 lib/amd64-linux.so; osname=linux; processor=x86_64,

 lib/x86-linux.so; osname=linux; processor=x86


다른 방법도 존재합니다.

Bundle-NativeCode: /lib/x86/ntlmauth.dll;selection-filter="(&(osgi.arch=x86)(osgi.os=win32))",

 /lib/x64/ntlmauth.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))"


os aliases 들은 http://www.osgi.org/Specifications/Reference 에 있습니다. 참고하시기 바랍니다.

저작자 표시 비영리 변경 금지
신고

JAVA Date 날짜 계산 CLASS



http://magefister.blog.me/50096917826 
항상 자바 날짜 계산하는 방법을 기억하지 못해서 찾아다녔었는데.
여기에 잘 정리가 되어 있군요.
이제 고민않고 저기로 가면 되겠습니다. 
저작자 표시 비영리 변경 금지
신고

HBase 테스트 소스



hbase 구성을 한 후, shell 테스트를 진행해보고 java와 연결하는 테스트를 진행하였다.
필요한 jar 파일은 아래와 같습니다.

commons-configuration-1.6.jar

commons-lang-2.5.jar

commons-logging-1.1.1.jar
guava-r09.jar
hadoop-auth-0.23.1.jar
hadoop-core-1.0.1.jar
hbase-0.92.0.jar
log4j-1.2.16.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
zookeeper-3.4.2.jar  

위 jar 파일을 import 해준 후 테스트 하시기 바랍니다.
테스트 소스는 아래와 같습니다.

package hbase;


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.MasterNotRunningException;

import org.apache.hadoop.hbase.ZooKeeperConnectionException;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HBaseAdmin;

import org.apache.hadoop.hbase.client.HTable;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.util.Bytes;


public class HBaseExample2 {

/**

* @param args

*/

public static void main(String[] args) {

// connection

Configuration config = HBaseConfiguration.create();

config.set("hbase.master", "umx1"); // master info

config.set("hbase.zookeeper.quorum", "umx1");

try {

HBaseAdmin ha = new HBaseAdmin(config);

// test라는 table이 없으면 생성함

if (ha.isTableAvailable("test") == false) {

System.out.println("'test' not exist!");

System.out.println("create 'test'");

HTableDescriptor tableDs = new HTableDescriptor("test");

tableDs.addFamily(new HColumnDescriptor("cf"));

ha.createTable(tableDs);

} else { // test라는 table이 있으면 삭제함

System.out.println("'test' exist!");

System.out.println("disable 'test'");

ha.disableTable("test");

System.out.println("drop 'test'");

ha.deleteTable("test");

System.out.println("create 'test'");

HTableDescriptor tableDs = new HTableDescriptor("test");

tableDs.addFamily(new HColumnDescriptor("cf"));

ha.createTable(tableDs);

}

HTable table = new HTable(config, "test");

// table에 데이터 넣기

System.out.println('\n' + "put 'test', 'row1', 'cf:qf1', 'value1'");

Put p = new Put(Bytes.toBytes("row1"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf1"), Bytes.toBytes("value1"));

table.put(p);

System.out.println("put 'test', 'row2', 'cf:qf2', 'value2'");

p = new Put(Bytes.toBytes("row2"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf2"), Bytes.toBytes("value2"));

table.put(p);

System.out.println("put 'test', 'row3', 'cf:qf1', 'value3'");

p = new Put(Bytes.toBytes("row3"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf1"), Bytes.toBytes("value3"));

table.put(p);

// table의 모든 row 가져오기

Scan s = new Scan();

System.out.println('\n' + "scan 'test'");

//s.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qf1"));

//s.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qf2"));

ResultScanner scanner = table.getScanner(s);

try {

for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {

System.out.println("Found row: " + rr);

}

} finally {

scanner.close();

}

// table에 데이터 넣기

System.out.println('\n' + "put 'test', 'row4', 'cf:qf2', 'value4'");

p = new Put(Bytes.toBytes("row4"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf2"), Bytes.toBytes("value4"));

table.put(p);

// 특정 row의 value 가져오기

System.out.println('\n' + "get 'test', 'row4', 'cf:qf2'");

Get g = new Get(Bytes.toBytes("row4"));

Result r = table.get(g);

byte[] value = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("qf2"));

String valueStr = Bytes.toString(value);

System.out.println("GET: " + valueStr);

} catch (MasterNotRunningException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ZooKeeperConnectionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}


저작자 표시 비영리 변경 금지
신고

Hadoop & Hbase 설치




많은 사이트를 찾아서 설치를 해보려고 했으나, 충분한 설명이 부족하여 따로 정리하였습니다..
설치한 버전은
hadoop-1.0.1
hbase-0.92.0
입니다..
설치가 완료된 구성 형태는 

※ Cloudera 에서 발표한 문서에서 캡쳐한  내용 입니다. 

위와 조금 다르지만 거의 같다고 보면됩니다..
위와 다른 점은 DataNode가 하나 없습니다.

설치 방법은 아래와 같습니다.

# hadoop 그룹 생성
** groupadd hadoop
# hadoop 사용자 생성
** useradd hadoop -g hadoop
** passwd hadoop
# ssh 인증서를 사용하기 위한 sshd 설정 바꾸기
** 아래 부분 주석 제거
<pre>
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
</pre>
# ssh 인증서 생성
** ssh-keygen -t rsa
** cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
# install hadoop
** tar -zxvf hadoop-0.20.203.0rc1.tar.gz
** mv hadoop-0.20.203.0/ hadoop
** chown -R hadoop:hadoop hadoop/
# config hadoop
** hadoop-env.sh
*** JAVA_HOME 설정
**** export JAVA_HOME=/usr/local/jdk1.6.0_31
** core-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://master_hostname:9000</value>
        </property>
</configuration>
</pre>
** hdfs-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>dfs.name.dir</name>
                <value>/data/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>/data/hdfs/datanode</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.datanode.max.xcievers</name>
                <value>4096</value>
        </property>
</configuration>
</pre>
** mapred-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>master_hostname:9001</value>
        </property>
        <property>
                <name>mapred.system.dir</name>
                <value>/data/hdfs/mapreduce/system</value>
        </property>
        <property>
                <name>mapred.local.dir</name>
                <value>/data/hdfs/mapreduce/local</value>
        </property>
</configuration>
</pre>
** masters, slaves 설정
# hadoop namenode 포멧
** 관리자 권한 필요(hadoop 사용자 계정에 node를 생성할 경우 필요없음)
** bin/hadoop namenode -format
# slaves에서 hadoop 설정
** hbase-env.sh
*** JAVA_HOME 설정
**** export JAVA_HOME=/usr/local/jdk1.6.0_31
** core-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://master_hostname:9000</value>
        </property>
</configuration>
</pre>
** hdfs-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>dfs.datanode.max.xcievers</name>
                <value>4096</value>
        </property>
</configuration>
</pre>
** mapred-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>master_hostname:9001</value>
        </property>
</configuration>
</pre>
** masters, slaves 설정
** datanode의 경로가 있어야 실행가능하므로, 미리 디렉토리를 생성해야함.
# hadoop 실행
** bin/start-all.sh
# install hbase
** tar -zxvf hbase-0.92.0.tar.gz
** mv hbase-0.92.0/ hbase
** chown -R hadoop:hadoop hbase/
# hbase 설정
** hbase-env.sh
*** JAVA_HOME 설정
**** export JAVA_HOME=/usr/local/jdk1.6.0_31
*** HADOOP Config 연결
**** export HBASE_CLASSPATH=/usr/local/hadoop/conf
** hbase-site.xml
<pre class="xml">
<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://umx1:9000/hbase</value>
        </property>
        <property>
                <name>hbase.master</name>
                <value>umx1:60000</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>4</value>
        </property>
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>umx1,umx2,umx3,umx4</value>
        </property>
        <property>
                <name>hbase.zookeeper.property.dataDir</name>
                <value>/data/zookeeper</value>
        </property>
</configuration>
</pre>
** hbase와 hadoop의 버전 맞추기
*** hadoop-core-1.0.1.jar
*** 기존에 있던 hadoop core jar 파일 삭제
** /usr/local/hbase/conf/regionservers
*** master 서버에만 적용
# hbase 실행
** bin/start-hbase.sh


 ※ hadoop 0.20.203.0 버전과 hbase 0.92.0 버전을 같은 방식으로 설치를 해보았으나, 버전 문제인지 모르지만 설치가 되지 않았습니다.
저작자 표시 비영리 변경 금지
신고

Tomcat에 SSL 설정을 한 후, Windows Services로 구동시킬경우 오류



Tomcat에서 SSL 설정을 한 후, dos창에서 "catalina.bat run"으로 구동을 시켜줄 경우 잘 돌아간다.
그리고 메시지를 확인한 후, 종료시키고 Windows Services에서 구동을 시킨다.
하지만, 접속을 시도해보면 접속이 되지 않고 멍때리는 현상을 발견할 수 있다.
에러로그를 확인해보니 아래와 같다.

2011. 10. 5 오후 5:56:59 org.apache.coyote.http11.Http11AprProtocol init

심각: Error initializing endpoint

java.lang.Exception: No Certificate file specified or invalid file format

at org.apache.tomcat.jni.SSLContext.setCertificate(Native Method)

at org.apache.tomcat.util.net.AprEndpoint.init(AprEndpoint.java)

at org.apache.coyote.http11.Http11AprProtocol.init(Http11AprProtocol.java)

at org.apache.catalina.connector.Connector.initialize(Connector.java)

at org.apache.catalina.core.StandardService.initialize(StandardService.java)

at org.apache.catalina.core.StandardServer.initialize(StandardServer.java)

at org.apache.catalina.startup.Catalina.load(Catalina.java)

at org.apache.catalina.startup.Catalina.load(Catalina.java)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)

at java.lang.reflect.Method.invoke(Method.java)

at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java)

2011. 10. 5 오후 5:56:59 org.apache.catalina.core.StandardService initialize

심각: Failed to initialize connector [Connector[HTTP/1.1-443]]

LifecycleException:  Protocol handler initialization failed: java.lang.Exception: No Certificate file specified or invalid file format

at org.apache.catalina.connector.Connector.initialize(Connector.java)

at org.apache.catalina.core.StandardService.initialize(StandardService.java)

at org.apache.catalina.core.StandardServer.initialize(StandardServer.java)

at org.apache.catalina.startup.Catalina.load(Catalina.java)

at org.apache.catalina.startup.Catalina.load(Catalina.java)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)

at java.lang.reflect.Method.invoke(Method.java)

at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java)


이 에러는 무엇인 것인가;;;;
오늘 하루 반나절을 허비하여 겨우 알아냈다.
역시 무지한탓에 반나절 삽질을 했구나..

참고 URL은 http://www.mail-archive.com/users@tomcat.apache.org/msg75237.html 이곳이며
핵심내용은

The above is for the Java-based connector.  The easiest thing would be to 
disable the APR code by deleting or renaming tcnative-1.dll in Tomcat's bin 
directory.

%CATALINA_HOME%\bin에 있는 tcnative-1.dll 파일을 삭제하라는 내용이다.

APR을 이용한 SSL을 사용할 경우 위 dll 파일은 꼭 있어야 하지만, APR을 사용하지않을 경우는 없어야한다는 것이다.
그리고 참고 사항으로 APR을 이용한 SSL 통신은 일반보다 속도가 빠르다고 한다.
tomcat은 그럼 이런 버그를 알고 있을까?
아니면 버그가 아니라 사용상의 부주의 인가?
아무튼 해결되서 기쁘다.
 
저작자 표시 비영리 변경 금지
신고

구글 캘린더와 아이폰 연동하기..



아이폰을 산 기념으로 구글 캘린더와 연동해서 사용하려고 하는데..
기본 캘린더는 연동이 되는데..따로 생성한 캘린더가 연동이 안되더군요..
그래서 또 인터넷에서 열심히 찾았습니다.
그랬더니 아래와 같은 주소가 있더군요...

자...인제 인터넷에서 찾은 연동방식을 적용해보겠습니다.


1. 여러개의 구글 캘린더 아이폰과 연동하기  
아래 주소로 들어가면 아래와 같은 화면이 나타납니다.



간단히 싱크할 캘린더를 체크해주면 구글에서의 모든 셋팅은 끝납니다.
자 이제 이제 아이폰 설정만 해주면 됩니다.
아이폰설정에서 캘린더는 연동은 꼭! Gmail 로 연동해야합니다.
아이폰 - 설정 - Mail, 연락처, 캘린더 - 계정추가 를 선택한 후, Gmail 로 설정을 해줍니다.


이것을 하면서 아쉬운것은....
연락처 동기화나... 캘린더 동기화를 설정하는 과정이 동일하지 않아서 아쉬웠습니다.
연락처는 아이튠즈에서 가능하고...캘린더는 아이튠즈에서 할려면 따로 앱이 있어야 하는거 같더군요...
혹시나 이것보다 더 쉽게 연동하는 방법을 아시는 분은 댓글을 달아주세요..
저작자 표시 비영리 변경 금지
신고

iOS 4.2 소프트웨어 업데이트



iOS 4.2 소프트웨어 업데이트

이 업데이트는 다음의 개선사항을 포함합니다:

• AirPrint 
  - 로컬 무선 네트워크 상에서 AirPrint와 호환되는 프린터로 
    직접 메일, 사진, 웹 페이지 등을 프린트할 수 있음
• AirPlay 
  - 비디오, 음악, 사진을 Apple TV로 무선으로 스트림할 수 있음
  - AirPort Express를 포함하여, AirPlay와 호환되는 스피커 
    및 수신기로 음악을 무선으로 스트림할 수 있음
• FaceTime 개선사항
  - 음성 명령으로 전화걸기
  - SMS 대화에서 전화걸기
  - Bluetooth 액세서리 지원
• Safari 웹 페이지에서 텍스트 찾을 수 있음
• 메모에서 새로운 서체 설정 사용할 수 있음
• 새로운 SMS/MMS 텍스트 소리 사용 및 연락처별로 
  벨소리를 사용자화하여 설정 가능
• 추가적인 차단(유해 콘텐츠 차단) 사용할 수 있음:
  - 계정 설정
  - 응용 프로그램 삭제
  - Game Center 친구
  - 위치 설정
• 캘린더에 .ics 파일 가져올 수 있음
• 다음을 포함하는 버그 수정:
  - iPod touch(4세대)에서 녹음된 오디오에 때때로 발견되는 
    인공적인 잡음 제거
  - 자동차 스트레오에서의 USB를 통한 오디오 재생 개선

이 소프트웨어 업데이트와 호환 가능한 제품:
• iPhone 4
• iPhone 3GS
• iPhone 3G
• iPod touch(2세대 이상)

모든 개선사항이 전체 모델에 적용되는 것은 아닙니다. 
추가 정보를 보려면, 다음 웹 사이트를 방문하십시오:
  <http://www.apple.com/kr/ipodtouch/software-update/>
  <http://www.apple.com/kr/iphone/softwareupdate/>

기능 세부사항 및 전체 사용 방법을 보려면, 다음 웹 사이트에서 
iPhone 및 iPod touch 사용 설명서를 참조하십시오:
<http://support.apple.com/ko_KR/manuals/iphone>
<http://support.apple.com/ko_KR/manuals/ipodtouch>

iPhone 및 iPod touch에 관한 추가 정보를 보려면, 
다음 웹 사이트를 방문하십시오:
<http://www.apple.com/kr/iphone>
<http://www.apple.com/kr/ipodtouch>

iPhone 또는 iPod touch 문제 해결 및 추가 지원 정보를 보려면, 
다음 웹 사이트를 방문하십시오:
<http://www.apple.com/kr/support/iphone>
<http://www.apple.com/kr/support/ipodtouch>

이 업데이트의 보안 콘텐츠에 대한 정보를 보려면, 
다음 웹 사이트를 방문하십시오:
<http://support.apple.com/kb/HT1222?viewlocale=ko_KR>

제가 반기는 업데이트는 사용자별 벨소리 지정입니다.
뭐 그다지 큰 기능은 아니지만, 괜찮아졌다고 생각합니다.

그외로 괜찮은 기능추가는 AirPrint가 기대되는군요.
저작자 표시 비영리 변경 금지
신고

IE에서 엑셀 다운로드 구현시 에러가 나는경우



IE환경에서 page Context Type을 이용한 excel downloading 구현하였습니다. 그런데 다음과 같은 에러가 뜨더군요.


혹시나 싶어서 구글크롬에서 다운로드를 해봤습니다.
근데 다운로드가 잘되네요.
아~~이놈의 IE 정말;;; 세션 문제 이후 나를 계속 괴롭히네요.

그래서 기존에 사용하던 잘되던 소스를 뒤지고 뒤졌습니다.
일단 위 에러는 response.setHeader("Pragma", "public"); 와 같이 해서 처리했습니다.
하지만 읽기에도 아직 부자연스럽네요.

좀더 찾아봐야겠습니다.
현재까지 제가 적용해본 옵션은 아래와 같습니다.
빨간 글씨는 제가 변경해서 성공한(?) 부분입니다.
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setHeader("Content-Disposition", "attachment; filename=downloadExcelFile.xls");
response.setHeader("Content-Description", "JSP Generated Data");
response.setHeader("Cache-Control", "max-age=0");
인터넷 검색을 해보니, 이 같은 이슈가 많이 존재하는 것 같습니다.

아래는 제가 참고한 사이트에서 가져온 내용입니다.
죄송하지만..저도 살짝 참고 링크로 ^^

1.구글신 검색 참고사이트

2.html header에 대한 더 많은 정보를 원하시면 (그러나 영어의 압박 ;;;)
좀더 깔끔한 정리 : http://www.mnot.net/cache_docs/


저작자 표시 비영리 변경 금지
신고

[Android] Android requires .class compatibility set to 5.0. Please fix project properties.



올만에 안드로이드 공부를 하기 위해서 openintents 에서 소스를 받았습니다.
기분 좋은 마음으로 새로나온 eclipse Helios 버전을 받고 필요한 svn이랑 android sdk를 받아서 설치했습니다.

하지만 문제가 발생됐군요...
바로 위 제목과 마찬가지로 발생된 
Android requires .class compatibility set to 5.0. Please fix project properties.
바로 네이버 검색에 들어갔습니다.
검색 결과, 다른 사람들이 만들어 놓은 프로젝트를 가져올 경우 발생되는 문제라고 하는군요.
정확히 무엇이 문제되어 발생되는지는 아무도 적어놓지 않고 있습니다.
다만 해결책은 나와있네요.
추후 더 검색해 본 결과 내용을 찾으면 업데이트 하겠습니다.

이 때, Package Exploere의 프로젝트 루트에서 마우스 오른쪽 버튼을 클릭하여 나오는 메뉴 중 "Android Tools"의 "Fix Project Properties" 메뉴를 수행하면 해결됩니다.


아주 간단히 해결하였지만, 정확한 원인을 알지 못하고 해결한 꼴이 되어서 왠지 찝찝하네요.
혹시 원인을 아시는 분은 트래백이나 댓글 부탁드리겠습니다.
저작자 표시 비영리 변경 금지
신고

Empty package가 보이지 않는다면...



eclipse에서 package를 만들었는데 만든게 보이지 않더군요.
그래서 이것저것 찾아봤는데, 아래와 같은 것이 있더군요.


살포시 Empty packages의 앞에 체크박스의 체크를 없애면, empty package가 나타납니다.
자~~ 이제 package 만들고 사라졌따고 당황하지 말자고요.
저만 그랬나요 ㅡ,.ㅡ;;;

아래는 eclipse 처음 깔고 살펴본 형태입니다. 참고하세요.


저작자 표시 비영리 변경 금지
신고

Java Collections API에 대해 모르고 있던 5가지 사항, Part 1



부제 : Java Collections 사용자 정의 및 확장하기

http://www.ibm.com/developerworks/kr/library/j-5things2.html

IBM 기술문서에 올라온 자료입니다.
배열보다 유용한 Collections에 대한 내용입니다.

1. Collections 트럼프 배열
배열의 성능은 Java Collections 라이브러리의 성능에 미치지 못하고 있다고 합니다.
따라서, 배열을 Collections 클래스로 최대한 빨리 변환해서 사용하라고 권장하고 있습니다.
아래는 배열을 변환하는 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class ArrayToList {
    public static void main(String[] args){
        // This gives us nothing good
        System.out.println(args);
 
        // Convert args to a List of String
        List<string> argList = Arrays.asList(args);
 
        // Print them out
        System.out.println(argList);
    }
}

이것의 단점은 수정할 수 없다고 합니다. 새 요소를 추가할려고 하면 UnsupportedOperationException이 발생한다고 합니다.
2. 반복은 비효율적이다.
반복에는 단점이 여러가지가 있다고 합니다.
  • 각각의 추가 또는 제거 후 콜렉션의 크기를 조정해야 하므로 비효율적이다.
  • 잠금을 획득하고, 작업을 수행한 후 잠금을 다시 해제할 때마다 심각한 동시성 문제가 발생할 수 있다.
  • 추가 또는 제거가 발생하는 동안 해당 콜렉션 작업을 수행하려는 다른 스레드에 의해 경쟁 조건이 발생한다.
하지만, Collections에서 제공하는 함수(e.g. addAll 또는 removeAll)을 사용하여 쉽게 처리할 수 있다고 하고 있습니다.

3. For 루프로 Iterable 반복하기
이것은 저도 많이 활용하고 있는 방법입니다.
예전에는 Iterator를 가져온 후 next()를 사용하여 Iterator에 지정된 오브젝트를 가져온 다음 hasNext()를 통해 사용할 수 있는 추가 오브젝트가 있는지 확인하는 과정으로 수동으로 수행해야 했습니다. 하지만 Java 5부터는 이러한 모든 과정을 자동으로 처리하는 for 루프 변형을 자유롭게 사용할 수 있습니다.
Iterable 인터페이스를 구현한 모든 Collections에서 사용 가능합니다.
저 같은 경우는 ArrayList에서 객체를 가져올 때 주로 사용합니다.

1
2
3
4
5
6
7
ArrayList<string> list = new ArrayList<string>();
list.add("item1");
list.add("item2");
list.add("item3");
for (String item : list) {
    // ...
}

위와 같이 주로 사용합니다.

IBM 기술문서에 나온 내용을 이용하여 제가 좀 적어봤는데요.
제가 언급하지 않는 내용도 Collections를 사용하면 굉장히 유용할 것입니다.
나머지는 제가 아직 사용해보지 않아서 어떻게 말씀을 못드리겠습니다.
하지만 위에서 언급한 내용은 정말 유용합니다.

더 많은 내용을 원하시면 위에 링크를 걸어놓은 IBM 기술문서 페이지로 이동하시면 됩니다.


저작자 표시 비영리 변경 금지
신고

Android NDK r4 OVERVIEW.TXT 문서 번역



※ 먼저 말씀드리지만, 저라는 사람 영어 실력 정말 없는 사람입니다. 외국인에게 "앞으로 가세요"를 "쭉~ go" 이렇게 말합니다;;
감안하시고 보세요.

Android NDK Overview

Introduction:

안드로이드 NDK는 안드로이드 app 개발자에게 c/c++ 소스 파일을 컴파일한 native machine code를 그들의 app package에 추가할 수 있도록 제공하는 tool이다.

IMPORTANT:
  안드로이드 NDK는 단지 Cupcake(a.k.a 1.5)과 그 이상의 버전의 플랫폼이 구동되는 안드로이드 시스템에서 사용할 수 있다.

  1.0과 1.1 시스템은 1.5 release에서 발생된 ABI와 toolchain의 미묘한 변화 때문에 구체적으로 제공하지 않는다.


I. Android NDK Goals:
---------------------

안드로이드 VM은 native code에서 구현되어진 메소드를 호출하기 위한 당신의 app의 소스코드를 JNI를 통해서 허락한다. 간단하게, 이 의미는:

  - 당신의 app 소스 코드는 native code에 구현되어진 함수를 지시하기 위해 'native' 키워드와 함께 method를 정의할 것이다.
    E.g.:

      native byte[]  loadFile(String  filePath);

  - 당신은 함수를 구현을 포함하고 있는 native shared library를 제공하고, 당신의 app의 .apk에 포함될 것이다.
    이 library는 "lib<something>.so"처럼 표준 Unix 규약에 따라 명명되어져야하고, 표준 JNI entry point에 포함되어질 것이다.
    For example:

      libFileLoader.so

  - 당신의 app은 명시적으로 library를 load해야한다. 예를 들어 app의 시작위치에서 그것을 load하기 위해, 간단하게 아래의 소스코드에 따라서 추가해야한다.

static {
System.loadLibrary("FileLoader");
}

    여기에서 'lib' prefix 와 '.so' suffix를 사용하지 않는 것을 유의해야한다.


안드로이드 NDK는 당신을 돕는 안드로이드 SDK 보완물이다:

  - ARM CPU가 구동되고 있는 안드로이드 1.5플랫폼에서 구동할 수 있는 JNI와 호환되는 shared library들을 생성한다.

  - 생성된 shared library를 당신의 app 프로젝트 경로의 적절한 위치에 복사하고, 당신의 마지막 sign된 .apk 에 자동적으로 추가되어 질 것이다.

  - NDK의 마지막 revision에서, 우리는 remote gdb connection과 가능한 많은 소스와 symbol 정보를 통해서 당신의 native code를 디버그하는 것을 돕는 tool을 제공할 것이다.

게다가, 안드로이드 NDK는 제공한다:

  - cross-toolchain(compilers, linkers, etc..) : Linux, OS X와 Windows(with Cygwin)에서 native ARM binary를 생성할 수 있다.

  - system header : 안드로이드 플랫폼에 의해 제공되는 안정된 native API 목록
                    이것은 모든 플랫폼의 최근 release에서 제공되는 위해 보증되어지는 정의를 따른다.
                    이것은 "docs/STABLE-APIS.TXT" 파일에 기록되어져 있다.

    IMPORTANT:
안드로이드 시스템에서 대부분의 native system library는 마지막에 업데이트 되거나 release되는 플랫폼에서 멈추거나, 크게 변하거나, 심지어 지워지지 않는다.

  - 컴파일 되어기 위해 필요한 소스나 컴파일 하는 방법을 기록한 매우 짧은 build 파일을 작성하는 것을 개발자들에게 허용한다.
   build 시스템은 복잡한 toolchain/platform/CPU/ABI의 모든 스펙을 처리한다.
   게다가, NDK의 마지막 업데이트는 개발자의 build 파일에서 요구하는 변경없이 toolchain, playform, system interface를 제공할 수 있다.


II. Android NDK Non-Goals:
--------------------------

NDK는 안드로이드 device에서 구동시키는 generic native code를 쓰기 위한 좋은 방법이 없다.
특히, 당신의 앱은 여전히 자바로서 개발될 것이고, "Application Not Responding"을 피하기 위해 적절히 안드로이드 시스템 이벤트를 handle 하거나 안드로이드 앱 life-cycle을 처리할 것이다.

그러나, 적절히 start/stop을 사용한 작은 "application wrapper"와 함께 native code에서 복잡한 앱을 구현하는 것이 가능하다는 것을 기억하라.

이 환경에서 많은 작업은 전형적인 native code에서 필수적으로 흔하지 않는 행동을 개발자로부터 요구되어지기 때문에, JNI의 이해가 높은게 좋습니다.
These include:

  - direct native pointer를 통해서 VM객체의 content에 직접적으로 접근 할 수 없다. 예를 들어 당신은 String 객체의 16-bit 문자 배열에서 loop를 반복하기 위한  pointer를 안전하게 얻을 수 없다.

  - native code가 VM object와 JNI call 사이에서 handles를 유지하기를 원할 때, 명시적인 reference 관리가 요구된다.

NDK는 Android platform에 의해 제공되는 매우 제한된 native API들과 library를 위해 시스템 헤드를 제공한다.
전현적인 android system image는 많은 공유 library를 포함하고 있는데 반하여, 이것은 대폭 업데이트 및 플랫폼의 release 사이에 변경될 수 있는 구현 세부에서 주의해야만 한다.

만약 android system library는 NDK의 header에 의해 명시적으로 제공되어지지 않는 다면, application은 가능한 의존하지 않거나, 다양한 device에서 다음 공지에서 업데이트 하여 리스크를 막아야한다.

선택된 system library는 서서히 안정적인 NDK API를 추가할 것이다.


III. NDK development in practice:
---------------------------------

Android NDK와 함께 native code를 개발할 수 있는 방법에 대한 개략적인 overview 이다:

  1/ native 소스를 "$PROJECT/jni/"에 위치시킨다.

  2/ NDK build 시스템에서 소스를 설명하는 "$PROJECT/jni/Android.mk" 쓴다.
      
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sanangeles

LOCAL_CFLAGS := -DANDROID_NDK \
                            -DDISABLE_IMPORTGL

LOCAL_SRC_FILES := \
    importgl.c \
    demo.c \
    app-android.c \

LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog

include $(BUILD_SHARED_LIBRARY)

  3/ 옵션: build 시스템에서 project에 대해서 더 자세히 기입하기 위해서 "$PROJECT/jni/Application.mk" 를 쓴다.
      비록 시작하지 않아도, 하나 이상의 cpu에 target하거나, compiler/linker flag를 override 할 수 있다
      (자세한 내용은 "docs/APPLICATION-MK.TXT"을 참조하세요).

  4/ 프로젝트 디렉토리나 sub 디렉토리에서 "$NDK/ndk-build" 를 실행함으로써 native code를 build한다.

마지막 단계가 성공적일 경우에,  application의 root project directory에 필요한 stripped 공유 library를 복사할 것이다.
그런 다음 일반적인 수단을 통해서 ".apk"를 생성 해야한다.

이제, 몇 가지 더 자세한 사항을 알아보겠다:


III.1/ Configuring the NDK:
- - - - - - - - - - - - - -

이전 release는 NDK를 configure 하기 위해'build/host-setup.sh' script를 실행했어야했다.
이 단계은 release 4 (a.k.a. NDK r4)에서 제거되었다.


III.2/ Placing C and C++ sources:
- - - - - - - - - - - - - - - - -

native 소스를 "$PROJECT/jni/"에 넣는다.

'$PROJECT'는 android application project의 경로에 해당한다.

'jni'의 content를 구성하는 것은 매우 자유롭다.
디렉토리 이름과 구조는 최종 생성된 application 패키지에 영향을 주지 않을 것이다.
그래서 application 패키지 이름의 경우처럼 'com.<mycompany>.<myproject>'와 같이 mypseudo-unique names를 사용하지 않아도 된다.

C와 C++ 소스는 제공된다. NDK에 의해서 제공되는 기본 C++ 파일의 확장자는 '.cpp'이지만, 다른 확장자도 처리할 수 있다.
(자세한 내용은 'docs/ANDROID-MK.TXT'에서 확인할 수 있다).

'Android.mk' 파일을 적용하는 것은 다른 위치에 있는 소스를 저장하는 것을 가능하게 한다.


III.3/ Writing an Android.mk build script:
- - - - - - - - - - - - - - - - - - - - - -

Android.mk 파일은 NDK build system에서 소스를 설명하기 위해 사용하는 작은 build script이다.
문법은 'docs/ANDROID-MK.TXT' 파일에 자세히 설명되어 있다.

분명하게 말하면, NDK는 각각의 모듈을 다음 중 하나가 될 수 있는 곳으로 소스를 그룹화시킨다:

  - a static library
  - a shared library

하나의 'Android.mk' 안에 여러가지 모듈을 정의할 수 잇고, 각각 정의된 하나의 모듈에 여러가지 'Android.mk' 파일을 쓸 수 있다.

'Android.mk' 파일은 build system에 의해 여러번 parse된다. 따라서 안에 정의되지 않는 특정 변수는 할당되지 않는다.
기본적으로, NDK는 build 다음 script를 찾습니다:

   $PROJECT/jni/Android.mk

만약 서브 디렉토리에 'Android.mk'를 정의하기를 원한다면, 최상위 'Android.mk'에서 명시적으로 서브 디렉토리에서 정의한 것을 포함하고 있어야한다. 이것을 사용하기 위해서 helper 함수가 있다. 즉, include $(call all-subdir-makefiles)를 사용한다.

이 파일은 현재 build 파일 경로의 서브 디렉토리에서 모든 'Android.mk' 파일을 포함하고 있을 것이다.


III.4/ Writing an Application.mk build file (optional):
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

'Android.mk' 파일이 build system에서 모듈을 정의하고 있는 반면에, 'Application.mk' 파일은 application 자체를 표현하고 있다.
이 파일이 무엇인지 이해하기 위해서는 'docs/APPLICATION-MK.TXT' 문서를 확인하면 된다.
이것은 다른 것을 포함하고 있다:

   - application에서 용구되어 지는 정확한 모듈 목록

   - machine code를 생성하기 위한 CPU architecture(s)

  - release나 debug 빌드에 대한 옵션 처럼, 모든 모듈을 build하기 위한 적용하는 명확한 C나 C++ compiler flag와 기타 옵션 정보

이 파일은 선택 사항입니다: 기본적으로 NDK는 'Android.mk'에 있는 모든 모듈(포함된 모든 makefile과 함께)을 build하고 기본 CPU ABI(armeabi) 타겟팅하는 것을 제공할 것이다.

'Application.mk' 를 사용하는 두 가지 방법이 있다:

  - '$PROJECT/jni/' 아래에 놓으면, 'ndk-build' script에 의해 자동적으로 pick up될 것이다.

  -'$NDK/apps/<name>/' 아래에 놓으면된다. 여기서 $NDK는 NDK 설치 경로를 나타낸다. 이후에 NDK 디렉토리로부터 "make APP=<name>"를 실행시키면 된다.

    이 방법은 Android NDK r4 이전에 사용되던 방법이다.
    이것은 호환성의 이유로 아직까지 제공되고 있다.
    하지만 대신에 첫번째 방법을 사용하는 것을 권고한다.
    왜냐하면 그것이 더 간단하고ㅡ NDK 설치 트리의 변경이나 수정이 필요하지 않기 때문이다.

다시 말하면, 이것의 완벽한 설명은 'docs/APPLICATION-MK.TXT'를 확인하면된다.


III.5/ Invoke the NDK build system:
- - - - - - - - - - - - - - - - - -

NDK와 함께 machine code를 build하는 선호되는 방법은 Andoid NDK r4와 함께 소개되어진 'ndk-build'를 사용하는 것이다.
또한 '$NDK/apps' 서브 디렉토리를 만드는 전통적인 두번째 방법을 사용할 수 있다.

양쪽다, 성공적인 build는 application에서 요구하는 최종 stripped binary 모듈(i.e. 공유 library)을 application의 project 경로에 복사할 것이다(unstripped 버전은 디버깅 목적으로 보관하고, device에서는 unstripped binary를 복사할 필요가 없다).


  1: Using the 'ndk-build' command:
  ---------------------------------

  NDK 설치 경로의 최상위에 위치한 'ndk-build' script는 application project 디렉토리('AndroidManifest.xml'위치되어 있는
  곳)나 서브디렉토리로 부터 직접적으로 작동시킨다.
  For example:

    cd $PROJECT
    $NDK/ndk-build

   이것은 NDK build script를 실행시킬 것이고, 자동적으로 build해야할 development system과 application project file을
   결정하기위해 조사할 것이다.

  For example:

    ndk-build
    ndk-build  clean    --> 생성된 binary를 clean
    ndk-build  -B V=1   --> command를 보여주면서 완전하게 다시 build함.

   기본적으로, $PROJECT/jni/Application.mk 아래의 옵션 파일과 요구된 $PROJECT/jni/Application.mk를 기대하고 있다.

   성공하면, project tree에서 적절한 위치로 생성된 binary 모듈(i.e. shared libraries)을 복사할 것이다.
   나중에 안드로이드 application package를 'ant'나 ADT Eclipse 플러그인을 통해서 전부 다시 빌드할 수 있다.

   이 스크립트가 무엇을 하며, 추가적인 옵션이 무엇을 하는지에 대한 자세한 설명은 'docs/NDK-BUILD.TXT'을 살펴보면 된다.


  2: Using the $NDK/apps/<name>/Application.mk:
  ---------------------------------------------

   이 빌드 방법은 Android NDK r4 이전에 단 하나의 방법이었고, 단지 호환성의 이유로 제공되어졌었다.
   최종 NDK 릴리즈에서 legacy지원을 제거할 것이기 때문에, 가능하면 'ndk-build' 명령어를 사용하는 것을 강력하게 추천한다.

   이것은 다음과 같이 요구되어진다:

    1. NDK 설치 디렉토리(project 경로가 아님) 아래에 '$NDK/apps/<name>/' 이름으로 서브 디렉토리 만들기

       '<name>'은 NDK 빌드 시스템에서 application을 나타내기 위한 임의의 이름이다(공백허용 안함).

    2. application 프로젝트 디렉토리를 지시하는 'APP_PROJECT_PATH' 정의가 요구하는  '$NDK/apps/<name>/Application.mk' 쓰기

    3. NDK 설치 경로로 이동하여 최상위 GNUMakefile 실행, as in:

         cd $NDK
         make APP=<name>

   중간에 생성된 파일이 '$NDK/out/apps/<name>/' 아래에 위치하는 것을 제외하고, 첫 번째 방법과 동일한 결과가 될 것이다.

IV. Rebuild your application package:
- - - - - - - - - - - - - - - - - - -

NDK에 의해서 바이너리가 생성된 이후에, 'ant' 명령어를 사용하거나 ADT Eclipse plugin을 이용하여 안드로이드 application package files(.apk)을 다시 빌드해야한다.

안드로이드 SDK 문서를 더 자세히 보길 바란다. 새로운 .apk는 공유 라이브러리를 포함하고 있을 것이고, target device에 package를 설치할 때, 시스템에 의한 설치 시간에 자동으로 풀릴 것이다.


V. Debugging support:
- - - - - - - - - - -

NDK는 'ndk-gdb'라는 helper script를 제공한다. 이것은 application의 native 디버깅 세션에서 쉽게 실행할 수 있다.

Native 디버깅은 단지 안드로이드 2.2나 그 이상이 구동되고 있는 생산 기계에서 수행할 수 있다. 그리고 root 같은 특정 접근을 요구되지 않는다.

더 많은 정보는 'docs/NDK-GDB.TXT' 파일을 살펴보길 바란다.  간단하게 말해서, native 디버깅은 간단한 방법을 따른다:

   1. application을 디버깅할 수 있도록 한다.(e.g. 'AndroidManifest.xml'에서 android:debuggable을 "true"로 설정한다.)

   2. 'ndk-build'와 함께 application을 빌드하고, 'device/emulator'에 설치한다.

   3. application을 실행한다.

   4. application 프로젝트 디렉토리로 부터 'ndk-gdb'를 실행한다.

gdb prompt를 나타난다. 유용한 명령어 목록은 GDB User 메뉴얼을 살펴본다.


이상 Android NDK r4의 OVERVIEW에 대한 번역입니다.
이 문서를 번역하는 중간에 회사에서 안드로이드 개발이 다른분께 가게되어서 더이상 이 내용을 번역할 필요는 없었지만,
기왕 시작한거 마무리 짓고 싶었습니다.
행여 나중에라도 이 내용이 저에게 필요하게 될지도 모르기에..

이 번역에서 도와준 서동영군... 정말 고맙습니다.
저작자 표시 비영리 변경 금지
신고

안드로이드에 대한 오해와 실패의 그림자



KMUG에서 한번은 곱씹게 만드는 글이 올라왔네요..
안드로이드의 앞면만 보고 뒷면을 보지를 못했네요..
안드로이드는 야누스의 얼굴인건가???


이 글을 요약하면 메모리 문제와 버전간 호환성 문제군요.
안드로이드가 대세가 아니라는건가요...
아무튼 구글에서 이런 문제를 조금 신경을 쓰지 않으면....
대세는 다시 아이폰으로 가거나 아이폰 vs 윈도폰으로 전환된다는거네요...

가용메모리 부족으로 야기하는 문제에 대해서는 다음 링크에서도 확인할수 있습니다.
참고로 안드로이드에 있는 자바 가상머신은 가비지 컬렉터(GC)를 하지 않습니다.

호환성 문제에 대한 참고할만한 의견입니다. 

아뭇튼 개발자가 개고생을 하는건지...
개발자가 웃을지...
내년 제가 휴대폰을 바꿀때 나타나겠군요...

두고봅시다...
저작자 표시 비영리 변경 금지
신고

안드로이드 에뮬레이터 AVD Configuration Error




emulator: ERROR: no search paths found in this AVD's configuration.
Weird, the AVD's config.ini file is malformed. Try re-creating it.

위와 같은 오류로 안드로이드 에뮬레이터가 실행되지 않을 경우는 "C:\Users\무적조로"와 같이 사용자 이름이 한글인 경우 Error가 발생하게 됩니다.

그럼 위와 같은 에러를 어떻게 해결할지 알아봤습니다.
해결방법은 의외로 간단했습니다. 개발환경 기본 경로를 한글이 포함되지 않은 경로로 지정합니다. 즉, AVD 설정 파일을 한글이 없는 다른 경로로 이동하는 것입니다.

AVD 설정 파일의 이동은 "android move avd" 라는 명령을 콘솔창에서 입력하면 됩니다.
전 개발환경을 모두 F 드라이브에 있기때문에 그쪽으로 이동할려고 했습니다.

하지만, 또 다른 난관에 봉착했네요.


네 F 드라이브로 이동이 안되는 것이었습니다.


그래서 C 드라이브에 개발 경로를 만들고 옮겨보았습니다.
잘 이동하네요. 그리고 개발환경이 F 드라이버이면 구동이 안되는군요.
그래서 개발환경조차 C 드라이브로 이동시켰습니다.


이제 좀 제대로 구동이 되는군요.
안드로이드 개발 환경 좀 실망이긴 하네요. C 드라이브에서만 개발이 가능하고 구동조차 C드라이버에서 해야된다니..

이동에 관해서는 http://ehxm.tistory.com/67 이 블로그에 보시면 잘 나와있습니다.
하지만 여기도 C 드라이브로 옮겨야한다는 이야기는 없네요.
버그인 것인지, 아니면 일부러 그렇게 했는지는 모르겠지만. 아직은 안되네요.

개발에 참고하시기 바랍니다.
저작자 표시 비영리 변경 금지
신고

바쁜 직장인을 위한 스터디 방법(분야가 다른 직장인들 끼리는 어떻게?)



작은 스터디를 진행하기 위해서 준비를 하고 있습니다.
근데 대학생일 때 시간이 굉장히 많아서(정말 많아서) 그냥 문턱대고 스터디를 진행했죠.
그때는 그냥 책 한권 선정하거나, 수업 교재를 이용하여 스터디를 하였죠.

하지만, 지금은 현실이 그렇지가 못하네요.
친구들 대부분이 회사에 다니고, 제가 모을 수 있는 멤버는 전부다 회사원이네요.
그래서 바쁜 직장인을 위한 스터디 방법을 찾아봤습니다.

그중에 아래 사이트의 글이 눈에 띄네요.
위 방법은 삼색볼펜초학습법을 이용해 하나의 공통 주제에 대해서 서로 챕터를 나누고..
챕터를 나눠서 서로 읽고 토의하는 방식이네요.
미리 책을 읽어오지 않아도 되기 때문에 부담없으며, 짧은 시간 고도의 집중력으로 진행할 수 있습니다.
20분 정도 집중해서 책을 읽고, 그룹별 공유 시간 20분. 나머지는 전체 정리 및 회고하는 시간을 가지네요.
책을 읽는 시간은 연장이 가능하데, 1시간을 넘지 않도록 하네요.

하지만, 분야가 다른 직장인들 끼리는 어떻게 해야될까?
분명 이런 경우는 극히 드물 것입니다.
하지만, 현재 나의 경우는 분야가 다른 직장인들 끼리 모였습니다.
IT쪽 일을 한다는 것은 똑같지만 분야가 다 다르네요.
웹디자이너, 시스템 프로그래머, 소프트웨어 개발자 등등
정말 많은 분야가 모였네요..
현재 시스템 프로그래머와 소프트웨어 개발자들은 관심분야가 똑같아서 일치 시킬 수 있지만,
웹디자이너는 힘드네요.

그래서 생각했습니다. 위의 방법을 약간 변형해보면 어떨까 하고요.
방법은 똑같습니다. 삼색볼펜초학습법을 이용하여 정해진 시간에 책을 읽고,(직장인은 시간이 없습니다.)
각자 읽은 주제를 각자 발표하는 것입니다.
여기서 서로 같은 주제를 가지고 있는 사람은 그룹별 공유 시간을 가질 수 있겠죠.

그리고 전 여기서 하나 더 추가 할려고 합니다.
각자의 블로그에 각자가 공부한 내용을 올리는 것입니다.
가장 최고의 공부 방법은 복습이라고 생각합니다.
남에게 가르쳐주거나, 공부한 내용을 스스로 정리를 한다면 최고의 복습 효과를 누릴 수 있다고 생각합니다.

요약해서,
1. 매주 1번 특정장소에 모인다.
2. 서로 다른 주제든 같은 주제든 책을 분량을 읽는다.(지난 스터디때 미리 선정하면 더욱 좋다.)
3. 20분 간격으로 시간을 체크하되, 시간이 모지라면 5, 10, 15 방식으로 시간을 늘린다. 이때 주의할 것은 1시간을 넘기지 않도록 한다.
4. 서로 같은 주제를 가지고 있는 그룹은 토의도 진행한다.(약 20분) 이때 삼색볼펜초학습법에 따라서 진행한다.
5. 각자 공부한 분야에 대해서 발표한다.
6. 각자 공부한 내용을 블로그에 올린다.

실제 적용해보지는 않았지만, 현재 바쁜 일만 끝나면 적용해볼 생각입니다.
정말 바쁜일이 2월말에 끝나기때문에, 그 이후에 적용해볼 생각입니다.
실제로 해보고 다시 후기를 올리도록 하겠습니다.

ps. 위 페이지에서 가져온 내용이지만, 중요한 내용이라서 다시 한번더 여기에 쓰겠습니다.

혹시나 삼색볼펜법을 모르는 분을 위해 간략히 설명드리겠습니다. 최소 빨강, 파랑, 초록 세 가지 색깔이 있는 볼펜을 하나 들고 책을 읽습니다. 내가 읽는 부분에서 정말 핵심이라고 생각되는 부분에 빨간 색으로 밑줄을 긋습니다. 단, 빨간색은 한 페이지에 하나 이상 치지 않습니다(줄 칠 곳 없으면 건너 뛰어도 됩니다). 핵심은 아니지만 나름 중요하다고 생각들면 파란색 밑줄을 긋습니다. 중요하고 아니고를 떠나서 흥미롭다, 재미있다는 생각이 드는 부분에는 초록색을 긋습니다. 삼색볼펜법의 설명을 들으면 허접해 보입니다만, 절대 우습게 보면 안됩니다. 매우 강력한 공부법이자 독서법입니다. 

개인적으로 책을 읽을 때 두가지 방법이 있습니다.
1. 순서대로 읽으면서 빨, 파, 녹을 적절히 선택해 가면서 밑줄 칩니다. 기본적으로 전체를 한 번 읽는 걸 목표로 합니다.
2. 우선 빨간색을 다 치겠다는 마음으로 후르륵 속도를 높혀 읽습니다. 다시 처음으로 돌아와서 파란색만 치겠다는 생각으로 재독합니다. 마지막으로 삼독하면서 초록색을 씁니다. 전체를 세 번 읽는 걸 목표로 합니다.
사람에 따라 1번으로 읽어서 더 빠른 사람이 있고, 오히려 2번으로 읽어서 더 빠른 사람이 있습니다. 그 때 그 때 기분에 따라 선택해도 좋습니다.
 
그리고 어떤 방법을 쓰든지 읽는 줄 밑에 볼펜을 대고(볼펜촉은 집어넣은 상태로) 눈을 따라가면서(사실은 볼펜 끝을 눈이 따라가면서) 읽는 것이 좋습니다. 속독법을 따로 훈련받지 않아도 이 방법만 사용하면 독서속도와 집중도가 상당히 높아집니다. 그 외의 효과적인 속독법은 다음에 따로 소개를 드리겠습니다.
저작자 표시 비영리 변경 금지
신고

IE8에서 session 문제



로그인 테스트하던 중 이상한 현상을 발견하였습니다.
도저히 이러한 현상이 발생되지 않아야 한다는 저의 착각인지 모르겠지만...
IE8에서 세션을 공유하는 현상이 발견되었습니다.

이상하게 여긴 전 여러가지 테스트를 해봤죠...

user1이 접속했을 때의 session id
session.getId():18F5157B22F3D74E56779B0865487439

user2가 접속했을 때의 session id
session.getId():18F5157B22F3D74E56779B0865487439

헛 왜????? 세션ID가 같을 까요??????
그래서 또 네이버를 뒤지기 시작했습니다.
근데!!!!! 두둥!!!!!

IE8의 LCIE(Loosely-Coupled IE) Design에서의 Session 문제

File Menu에서 New window, New Tab 또는 Duplicate Tab을 Click하거나 Desktop Shortcut으로 new tab이나 window가 open이 된다면, 이는 원래의 Session을 공유하여 사용하게 된다고 합니다.

하지만, File Menu에 New session을 Click하면 예상하다시피 New browser windows가 열립니다. 이는 말 그대로 기존의 ieexplore.exe와 Session을 공유하지 않기 때문에 동일한 Site에 다른 user로 로그온하더라도 Browsing 을 할 수 있는 기능을 제공한다는 것입니다.


이런 현상이 IE8의 LCIE(Loosely-Coupled IE) Design로 인해서 기인된 현상으로 추측을 하고 있지만...
만약 그렇다면 마소는 왜 이렇게 개발자에게 불편하게 디자인 한건지....
그리고 session이 공유된다는 것이 과연 보안상으로 취약한 점이 없는지 궁금하네요.

아~ 이거 어떻게 처리해야할지 걱정입니다.
저작자 표시 비영리 변경 금지
신고

오래전 부터 찾았던 메모리가 4G 일 경우 RAMDISK 설정하는 방법



http://novrain.egloos.com/1754771

예전부터 이 내용을 찾아서 찾아서 나섰지만...
정확하게 콕 찝어서 이야기 해주는 블로그가 없었다...

하지만... 오늘 발견한 이 블로그....
나의 궁금증을 확 씻어 주었다...

기존에 사용하던 RAMDISK PLUS를 이용해서 잡으면 메모리에 RAMDISK가 잡은걸 볼 수 있었다...
그래서 이건 아닌거 같은데... 이러면서 나름 생각해보았지만... 역시나 궁금증 해결 실패...
오늘에서야 그 궁금증을 해결할 수 있었다...

정확하게는 무엇때문에 그렇게 됐는지 아직도 모른다 ㅋㅋ
하지만 위 주소처럼 하니 되네... 그래서 RAMDISK PLUS 지웠다.;;;;

인제 다른 운영체제로 안갈아타도 되는건가 ㅋㅋㅋ
그래서 7 나오면 갈아타야지 ㅋㅋ
저작자 표시 비영리 변경 금지
신고

나도 모르게....DDoS 공격자가 될지도....




2009년 7월 9일 현재 DDoS 공격이 주요 사이트를 대상으로 공격이 들어가고 있다.
나도 옥션의 한명의 매니아로서 8일 옥션 포인트를 모으기 위해 들어갔지만, 접속을 하지 못했다.
인터넷 뉴스에서 DDoS 공격에 의해서 발생된 서비스 불능 상태라고 한다.

이번 공격은 해커가 사람들이 많이 찾는 사이트에 악성코드를 심어놓았고...
그것을 다운 받은 일반 사용자가 이 사이트에 접속하면 악성코드는 자동으로 컴퓨터에 설치 된다고 한다.

그리고 이렇게 몰래 들어온 악성코드는 7월 7일 새벽부터 주요 사이트를 공격하기 시작했다.
벌써 2번에 걸쳐서 공격이 되었는데....
아직까지 해결책은 없는가 보다..

정부에서는 해커를 찾아서 엄중히 처벌할꺼라고 말하지만...
정확한 대책은 없는가 보다..
V3 백신이라든지 하우리에서 제공하는 백신을 홍보하여 원천을 막아야 한다고 생각되는데...

제 블로그에 들어오시는 분들은 위에 있는 백신파일을 다운받아 점검을 하시기 바랍니다.
혹시 자기 컴퓨터가 좀비 PC가 되었다면... 백신으로 치료한 후 포멧을 하기 바랍니다.
컴퓨터는 포멧이 가장 좋은 치료 방법일지도 모릅니다.

하지만 원천적인 차단은 이상한 사이트를 방문 하지 않는게 좋은 것 같군요.
인터넷이 잘 발달된 우리나라로써는 원천적인 방어가 힘든 관계로 개인 스스로 노력해야하겠습니다.
백신은 100% 설치하고, 방화벽도 항상 활성화 해놓고, 의심이 가는 메일은 무조건 삭제하며, 의심이 가는 사이트는 접속하지 않는게 좋습니다.

만약 인터넷이 느려졌고, 자신도 모르게 방화벽이 비활성화 되어 있으면 의심해보시기 바랍니다.
저작자 표시 비영리 변경 금지
신고

BDATuner.MPEG2TuneRequest ActiveX Buffer Overflow 취약점




최근 중국에서 BDATuner.MPEG2TuneRequest ActiveX Buffer Overflow 취약점을 이용한

0-day공격이 많이 이루어지고 있습니다.


[영향 받는 운영체제]
Windows XP Service Pack 2 and Windows XP Service Pack 3
Windows XP Professional x64 Edition Service Pack 2
Windows Server 2003 Service Pack 2
Windows Server 2003 x64 Edition Service Pack 2
Windows Server 2003 with SP2 for Itanium-based Systems

영향 받는 운영체제를 사용하시는 분은 첨부파일을 실행 하시면 긴급 업데이트가 설치 됩니다.

안전한 컴퓨터 보안을 위해서는 번거롭더라도 반드시 적용을 하시고 사용하시기 바랍니다.


<참고>
공격 방식은 악의적인 웹 사이트에 사용자가 접속 시 원격의 공격자가 심어놓은 코드 실행으로

인하여 긴 데이터(Data)를 포함한 파일을 읽는 과정에서 스트림 비디오(Streaming Video)를

위한 MSVidCtl.dll ActiveX Control(Microsoft Video ActiveX Control)의 Buffer Overflow를

야기시키는 행위를 한다고 알려져 있습니다

저작자 표시 비영리 변경 금지
신고

리눅스에 JDK 설치하기




http://java.sun.com/
에서 일단 리눅스용 bin파일을 다운 받는다.
rpm버전으로 되어 있는 버전도 있지만, 그것은 rpm을 구동시킬 수 있는 환경이 되어야하므로
bin을 실행하여 압축만 푸는 버전으로 하는 것이 좋을 것으로 본다.

압축을 풀고, 원하는 위치에 파일을 이동시킨다.
하지만, 이것으로는 java -version을 하면 이상한 에러만 발생된다.

# java -version
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object


위와 같은 에러만 나오고 실행은 되지 않는다.

이것을 해결하기 위해 구글을 통해서 많이 사이트를 찾았다.
하지만, 해결책이 있는 사이트는 하나뿐이었고, 한국어로 되어 있는 사이트는 아무곳에도 없었다.

대부분의 사이트에서는 "JAVA_HOME을 해줘야한다.", "PATH를 지정해줘야한다.", "CALSSPATH를 지정해줘야 한다." 이렇게 말하고 있었다.

하지만, 아무것도 이 에러를 잡아주지를 못했다.
위 내용도 맞을 수 있다. 다만 Object class 파일이 jre/lib에 있다는 것을 확신하고, 찾을 수만 있다면....
하지만, lib에는 jar 파일이 보이지 않았고, pack이라는 파일들이 보였다.
즉, rt.pack 파일은 보였으나 rt.jar 파일이 보이지 않았다.

따라서, pack 파일을 jar로 변환하는 스크립트를 공개하려 한다.
이 내용은 sun사가 운영하는 forum에서 가져온 내용이며, 굳이 스크립트에 대한 저작권을 바란다면, 그쪽 사이트에 있다고 하겠다.
JAVA_HOME을 정확하게 지정하고 실행시켜야 한다.

#!/bin/sh
JH=${JAVA_HOME:-"/usr/local/jdk1.6.0_13/jre"}
UNPACK_EXE=$JH/bin/unpack200
if [ -f $UNPACK_EXE ]; then
chmod +x $UNPACK_EXE

PACKED_JARS="lib/rt.jar lib/jsse.jar lib/charsets.jar lib/ext/localedata.jar lib/plugin.jar lib/javaws.jar lib/deploy.jar"
for i in $PACKED_JARS; do
srcFile=${JH}`dirname $i`/`basename $i .jar`.pack
dstFile=${JH}/$i
if [ ! -f $srcFile ]; then
printf "Error: Unable to find %s. Please, check out your installation.\n" $srcFile
exit 1
fi
$UNPACK_EXE $srcFile $dstFile
if [ ! -f $dstFile ]; then
printf "Error: unpack could not create %s. Please refer to the Troubleshooting\n" $dstFile
printf "Section of the Installation Instructions on the download page.\n"
exit 1
fi

rm -f $srcFile
done

else
printf "Error: unpack command could not be found. Please refer to the \n"
printf "TroubleShooting Section of the Installation Instructions on \n"
printf "the download page.\n"
printf "Please do not attempt to install this archive file.\n"
exit 2
fi


(출처) http://forums.sun.com/thread.jspa?threadID=598858
저작자 표시 비영리 변경 금지
신고

SQL은 관계형 데이터베이스에서 사용되는 언어입니다. 그럼 "관계형"의 의미가 무엇일까요?




SQL은 관계형 데이터베이스 관리 시스템인 RDBMS를 위한 언어입니다.

여기서 관계형이라는 단어에 대해 생각해 봅시다.

어떤 사람들은 관계형이 서로 관계된 여러 테이블을 의미한다고 하는데 그렇지 않습니다.

이 관계형이라는 말은 테이블을 잘 설계하려면 정보를 나타낼 때 여러 테이블 사이의 열들이 서로 어떠한 관계에 있는지를 고려해야 한다는 의미입니다.

적절한 열들을 사용해서 원하는 정보를 쉽게 찾을 수 있도록 정보를 표현하는 것이 쉽지는 않습니다.
테이블에서 필요한 정보가 무엇인가에 따라 다른긴 하지만 테이블을 생성할 때 대략 다음의 과정을 거칩니다.

1. 여러분의 테이블이 나타내는 것이 무엇입니까?
     - 여러분이 테이블로 표현하려는 것을 선택합니다.
2. 이 테이블을 어떻게 사용할 것입니까?
     - 그 테이블을 사용하여 얻어야 하는 정보들의 리스트를 작성합니다.
3. 어떻게 하면 이 테이블에 가장 쉽게 쿼리를 보낼 수 있을까요?
     - 리스트를 이용하여 테이블을 만들 정보들의 조각으로 나눕니다.

그리고 테이블을 만들땐 다음의 2가지 규칙을 지키는 것이 좋다.

1. 원자적 데이터로 구성된 열은 그 열에 같은 타입의 데이터를 여러 개 가질수 없다.
ex) 한 컬럼에 여러개의 값이 들어갈 수 없다.
      '흥미'라는 컬럼에 독서, 사진찍기, 운동 등의 데이터가 여러개 들어가면 안된다.

2. 원자적 데이터로 구성된 테이블은 같은 타입의 데이터를 여러 열에 가질 수 없다.
ex) 한 테이블에 같은 타입의 데이터를 가진 컬럼을 여러개 가질 수 없다.
      'teacher'라는 테이블에 student 컬럼이 여러개가 있으면 안된다.

2개는 서로 상반되는 의견이지만.. 2가지의 규칙을 어기지 않고 테이블을 만든다면...
초기 설계는 성공한 것으로 보입니다.
지금 자기가 만든 테이블을 드려다 보세요.
위 2개의 규칙을 지키고 있나요?
지키지 않고 있다고요?
그럼 위 3단계의 과정을 거쳐서 만드셨나요?

물론 힘듭니다. 저 역시 예전에 만든 테이블을 보니 저 규칙을 지키지 않고, 위 과정을 제대로 생각 안하고 만든 경우가 많네요..
저작자 표시 비영리 변경 금지
신고

vi 사용법




1. command mode

이 중에서 가장 먼저 vi를 시작하면 command mode로 시작이 되는데, 이 상태에서는 여러가지 명령을 할 수 있다. 명령어를 나열하면 다음과 같다.

  • cursor movement

    h : prompt를 좌측으로 한 칸 움직인다. 물론 아무런 내용이 없는 상태에서 는 prompt는 움직이지 않게 된다. ^^

    j : prompt를 한 행 아래로 내린다. 물론 다음 행에 아무런 내용이 없다면 움직이지 않게 된다.

    k : prompt를 한 행 위로 올린다.

    l : prompt를 우측으로 한 칸 움직인다.

    0 : 현재 prompt가 있는 행의 가장 처음으로 간다.

    $ : 현재 prompt사 있는 행의 가장 마지막으로 간다.

    G : 마지막 줄로 이동

    nG: n번째 줄로 이동

    b : 앞의 단어나 구두점까지 이동

    B : 구두점 무시하고 앞의 단어까지 이동

    ^f : 한 page 다음으로 넘긴다.

    ^b : 한 page 전으로 넘긴다.

    ^l : refresh ; 화면을 깨끗히 보고 싶을 때, 다시 화면을 정돈해서 보여준다.

    ( 여기 까지가 대충 커서를 움직이는 명령들입니다.)

  • insert command

    a : append ; 즉, 현재 prompt가 있는 곳의 다음에 덧붙이는 명령이다. 이 명령은 edit mode로 전환된다. (즉, 글을 편집할 수 있다.)

    i : insert ; 즉, 현재 prompt가 있는 곳부터 삽입하는 것이다. 이 역시 edit mode로 전환된다.

    o : open line ; 즉, 새로운 행을 여는 개행 명령이다. 현재 prompt가 있는 위치에서 바로 다음 행을 열고 edit mode로 바꿔 준다.

    O : 커서 윗줄로 이동하고 삽입 상태

    s : substitute ; 즉, 현재 prompt가 있는 위치에 문자와 교환한다. edit mode로 바꿔 준다.

    r : 한 문자를 바꿈

    R : 문자열을 지우고 그자리에 다시 씀

    cw : ? ; 위의 substitute에서 한 단어를 substitute하는 명령이다. 즉, 현재 prompt의 위치부터 한 단어를 교환할 수 있도록 한다. 이 역시 edit mode로 바꿔 준다.

    (여기까지를 보면 vi에서 edit mode로 갈 수 있는 기본 명령임을 알 수 있다.)

  • delete & etc.

    x : ? ^^; ; 한 char를 지우는 것이다. delete명령이라고 할 수 있다.

    dd : delete ; 한 line을 삭제하는 것이다. 위의 x 명령이 한 char임에 반해서 한 줄을 지운다.

    D : 커서가 위치하고 있는 행부터 마지막 행까지 지움.

    Y : yank ; yank는 당기다는 뜻인데, 잡아두는 것이다. 즉 copy해서 버퍼에 기억하고 있다. ( 나중에 paste하는데 사용할 수 있다.)

    p : paste ; 붙이는 것인데 buffer에 있는 내용을 현재 prompt가 있는 위치의 다음에 append하거나(buffer의 내용이 한 행의 일부분일 때) 또는 다음 행 에 붙인다.(buffer의 내용이 한 행 또는 그 이상일 때)

    p : Change buffer에 저장되어 있는 것을 아랫줄에 삽입

    J : 현재 커서가 위치한 줄과 다음줄을 연결

    # : 여기서 #은 실제 자판의 '#'이 아니고 숫자를 말한다. 이는 명령의 반복 회수를 나타낸다. 예를 들면 다음과 같다.

    5dd : 5행을 지운다.
    5x : 5개의 char를 지운다.
    3Y : 3행을 buffer에 저장한다.

2. edit mode

이 모드는 command mode에서 들어 와서는 txt를 편집할 수 있다. esc를 하면 이 모드를 빠져나올 수 있다. 나오면 command모드 이다.

3. last line command mode

command mode에서 last line command mode로 변경하려면 : 를 입력.

ZZ : file이 변경된 경우에는 변경된 내용을 저장한 후 종료하고 변경사항이 없을 경우 그냥 종료

w : 변경된 내용을 기록

w! : 쓰기가 금지된 경우 강제로 저장

w filename : buffer의 내용을 모두 file에 저장

e! : 수정한 것과 관계없이 다시 edit상태로 돌아감

q : 종료

q! : 저장을 묻지도 않고 그냥 종료

# : #th 행으로 prompt를 이동

4. extra skill

last line command에서 할 수 있는 몇 가지 명령들

  1. substitute
    예)

    :1,$s/acasia/영이/g

    위의 명령은 첫 번째 줄부터 마지막 줄까지 acasia를 '영이'로 바꾸는 것이다.

    s가 substitute 명령이구 g는 globally의 의미로 모든 acasia를 바꾸라는 의미 이다.

  2. delete
    예):.,$d

    현재 줄 부터 해서 마지막까지 지우라는 의미

    d가 delete 의 의미이다. .은 현재 줄의 의미

  3. undo
    예):u

    실행 취소

5. search

/[검색어] : /를 하면 마지막 line으로 가고 그 상태에서 검색어를 치면 원하는 검색어의 위치로 prompt가 바뀐다.

6. shell command

![command] : !을 하면 마지막 line으로 가고 그 상태에서 shell 명령을 하면 명령이 실행된다.
저작자 표시 비영리 변경 금지
신고

crontab 사용법



아래글은 " 리눅스 실무명령어 바이블 1" 중에서 일부를 발췌한 것입니다.

crontab 
  - 시스템의 주기적인  cron 작업의 설정, 수정등을 하는 명령어
  - 시스템에서 가장 중요한 데몬중의 하나인 crond 와 직접적인 관련이 있는 명령어
  - crond 데몬은  /etc/rc.d/init.d/crond 의 스크립트에 의해 시작, 종료, 재시작될수 있음
  - crond 데몬
     - /etc/crontab 파일
     - /etc/rc.d/init.d/crond 스크립트
     - /var/spool/cron 디렉토리내의 크론설정파일들

명령어 위치
: /usr/bin/crontab

사용형식
     : crontab [ -u 사용자id ] 파일
                   crontab [ -u 사용자id ] { -l | -r | -e }

cat /etc/crontab

매시 1회 자동실행하기 위한 시스템 크론 설정
01 * * * * root run-parts /etc/cron.hourly
  - 매일 매시 01분마다 /etc/cron.hourly 디렉토리내에 존재하는 파일들을 실행

매일 1회 자동실행하기 위한 시스템 크론설정
02 4 * * * root run-parts /etc/cron.daily
  - 매일 새벽 4시 02분마다 /etc/cron.daily  디렉토리내에 존재하는 파일들을 실행

매주 1회 자동실행하기 위한 시스템 크론설정
22 4 * * 0 root run-parts /etc/cron.weekly
  - 매주 일요일 새벽 4시 22분마다 /etc/cron.weekly 디렉토리내에 존재하는 파일들을 실행

매월 1회 자동실행하기 위한 시스템 크론설정
42 4 1 * * root run-parts /etc/cron.monthly
 ->매월 1일 새벽 4시 42분마다 /etc/cron.monthly 디렉토리내에 존재하는 파일들을 실행

* root 이외의 사용자에게 crontab 명령어를 이용할 수 있게 하는 방법
  - /etc/cron.allow 파일에 사용자의 id를 등록

* 일반사용자의 crontab 명령어사용을 제안하고자 한다면
  - /etc/cron.deny 파일에 사용자의 id 를 등록

* cron 설정하는 방법
 40 3 * * * root /home/mysql/mysql_backup.sh

 맨 앞의 40은 40분을 의미함 (분을 의미:0~59)
 그 뒤의 3은 03시를 의미함 (시를 의미:0~23)
 그 뒤의 * 은 매일을 의미함 (일을 의미:1~31)
 그 뒤의 * 은 매월을 의미함 (월을 의미:1~12)
 그 뒤의 * 은 매주를 의미함(요일을 의미 1:월요일~7:일요일)
 그 뒤의 root /home/mysql/mysql_backup.sh 는 root  계정으로 mysql_backup.sh을 실행하라는

 의미

 * 문자 : 각 필드에 해당하는 모든 숫자를 의미
 - 문자 : 각 필드자리에 하이픈 문자가 올수 있음
   ex) 일 필드자리에 11-15 (11,12,13,14,15일을 의미)
 ,문자 : 각 필드자리에 콤마문자가 올수 있음
   ex) 일 필드자리에 1,11,21 (1일,11일 21일을 의미)

신고

mysql 스키마 백업



1.특정 db의 특정 table에서 원하는 값만 덤프받기

>> edu라는 디비에 a,b,c라는 테이블이 있다. 여기서 a라는 테이블에서 no가 7번이상이고 10번
이하인 값만 덤프를 받고자 한다. 어떻게 하겠는가?
여기서 사용되는 옵션은 -w 이다.그럼 위 질문의 sql문은 아래와 같다

mysqldump -u mysql_admin -p edu a -w'no=>7 and no=<10' > edu_a_cond.sql

위와같이 하면 no가 7~10번까지가 덤프될것이다.
위에서 조건문은 -w 다음에 싱글쿼테이션으로 묶어준다. sql에서 사용하는 조건문이 다 될듯싶

다. 모두 테스트를 해보진 않았다.

2.디비 스키마(Schema)만 백업받기

>>초기에 작성해 놓은 테이블 스키마가 없을때 어떻게 하겠는가?
만약 하나의 테이블이라면 desc 해서 일일이 다 삽질을 하면 되것지만 만약 테이블이 100개라

면 ..크억...이럴때 사용하는 mysqldump옵션이 있습니다.
-d 입니다.

!.edu라는 디비의 모든 테이블 스키마를 백업받으려면

mysqldump -u mysql_admin -p -d edu > edu_db.sql

!.edu라는 디비의 a라는 테이블 스키마를 백업받으려면

mysqldump -u mysql_admin -p -d edu a> edu_a_table.sql 
신고

Forward Proxy와 Reverse Proxy



Forward Proxy
 
클라이언트가 타겟서버에 접근하고자 할때, 클라이언트는 타겟서버의 주소를 프락시에 전달하여, 프락시가 요청된 내용을 가져오는 방식
 
예) 타겟서버가 target.com 이고, proxy서버가 proxy.com 일때,
클라이언트의 Proxy 설정에 proxy.com을 설정하고, 주소창에는 target.com 을 입력하여 브라우징 하게됨.
 
Reverse Proxy
 
클라이언트는 Reverse Proxy 로 설정된 서버의 주소로 데이타를 요청하게 되며, Reverse Proxy는 이 요청을 받아서 "배후"의 서버에 데이타를
요청하여 받은 다음 클라이언트에 전달하게 됨.
 
여기서 Reverse 의 뜻은 "역전, 꺼꾸로"의 뜻이 아닌 "배후, 뒷쪽"의 뜻임. 즉, 배후에 있는 서버에 대한 Proxy라고 생각하면 됨.
 
예) 타겟서버가 target.com 이고, proxy서버가 proxy.com 일때,
클라이언트는 별도의 프락시 설정없이 proxy.com으로 접근하게 되면 proxy.com이 자동으로 매핑된 주소로 변환하여 target.com에서 컨텐츠를
가지고 온 후 이를 클라이언트에 전달하게됨.
신고

자바에서interface와abstract에관해



1. 공통점:
우선 아래 소스1을 보시면, 전형적인 interface,와 abstract 클래스를 나타내고 있습니다.
1) abstract와 interface는 그자체가 instance화 될수가 없습니다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘다 컴파일을 해보면, 에러를 발생시킵니다.

2) Prototye만 있고 Body가 없는 메소드를 멤버함수로 가집니다.
소스1에서 보시는 봐와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있습니다.

3) abstract,interface 클래스를 사용하려면, abstract,interface 위클래스를 상속받아서, 새로운 클래스를 생성시킨후, instance화 할수가 있습니다.
소스2 에서 보는봐아 같이 상속을 받은후, 사용해야 합니다.
즉, childclass c = new childclass(); 님 컴파일시 에러가 발생하지 않습니다.

[소스1]
public interface TestInterface {
     public static int num = 8;
     public void func1();
     public void func2();
}

public abstract class TestAbstract {
     public abstract void func1() ;
     public void func2() {
          System.out.println("func2");
     }
}

[소스2]
class childclass1 extends TestAbstract {
     // Abstrace Method을 오버라이딩했습니다.
     public void func1() {
          System.out.println("상속 받아서, Body를 채워줬습니다.");
     }
}

class childclass2 implements TestInterface {
     public void func1() {
          System.out.println("Class Test1");
     }
     public void func2() {
          System.out.println("Class Test2");
     }
}

차이점:
1) Prototye만 있고 Body가 없는 메소드 즉 abstract메소드라고 하는데, Abstract 클래스는 abstract메소드와 일반 메소드를 혼용해서, 가질수 있습니다. 즉, 일반메소드 + abstrace메소드 형태를 유지한다는 겁니다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 합니다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재합니다.

2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다릅니다.
abstract클래스는 소스2처럼, extends를 사용하고, interface클래스는 implements 을 사용합니다.

3) 다중상속 가능유무 입니다.
보통 자바에서는 일반 클래스에서는 다중상속을 지원하지 않습니다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있죠. 하지만, interface의 경우에는 다중상속이 가능합니다.

4) 클래스 시작 키워드가 다르죠.
abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작합니다.

결국 큰범주에서 보면, abstract method로만 이루어진 abstract class가 interface 인셈이죠.

신고

클래스 이름을 이용하여 클래스를 생성하는 방법



기존의 우리가 클래스는 생성하는 방법은
아래와 같이, new 연산자를 이용하여 생성자를 호출하는 방식으로 했었다..

ExampleClass name = new ExampleClass();

하지만, 내가 무지한 탓인지...
클래스 이름을 String 값으로 가지고 있어도 클래스를 생성할 수 있다는 사실을 알게되었다.
아래와 같이 클래스 이름만 가지고 있다면...

String name = "ExampleClass";

Class 클래스에 있는 forName() 메소드를 사용함으로써 ExampleClass라고 하는 클래스가 초기화가 된다.

Class t = Class.forName(name);

객체 t를 이용하여 새로운 객체를 생성하게 된다.

name = (ExampleClass) t.newInstance();

(Example)
HTTPServerSocket server = new HTTPServerSocket(port);
위의 것을 클래스 이름만 알고 있다면 아래와 같이 바꿔서 생성할 수 있다.

String serverClass = "context.arch.comm.protocol.HTTPServerSocket";
int serverPort = 6000;

Class[] classes = new Class[2];
classes[0] = Class.forName("context.arch.comm.CommunicationsObject");
classes[1] = Class.forName("java.lang.Integer");

Constructor constructor = Class.forName(serverClass).getConstructor(classes);

Object[] objects = new Object[2];
objects[0] = this;
objects[1] = new Integer(serverPort);

server = (CommunicationsServer)constructor.newInstance(objects);

p.s.
클래스 이름만 알고 있는 상태에서 저렇게 한다면 클래스를 쉽게 생성할 수 있다.
프로그래밍을 하다보면 클래스 이름을 이용해서 객체를 생성해야할 때 저렇게 사용해보는 것은 어떨까?

Chan이 준 사용 예이다. ㅋㅋ
이게 command 패턴이라고 한다.

String action = getAction();
IAction = null;
if ( action != null ) {
   IAction tempAction = ( IAction ) Class.forName(action).getConstructor().newInstance();
   tempAction.doAction();
}

신고