2021년 1월 12일 화요일

Netty 사용하기

 

1. Netty 란?



2. Netty 성능

https://www.techempower.com/benchmarks/#section=data-r9&hw=i7&test=plaintext



2018년 2월 25일 일요일

코딩 인터뷰


1. 프로세스와 스레드의 차이

- Process :
부모프로세스(parent process)라는 상위계층과 자식프로세스(child process)라는 하위계층이 존재한다. 부모프로세스는 프로그램이나 명령어에 의해 시작되며, 자식프로세스는 부모프로세스에 의해 만들어지는 것을 말한다. 하나의 부모프로세스는 여러 개의 자식프로세스를 관리하는데, 여러 개의 자식프로세스가 하나의 CPU에서 동시에 처리되는 것처럼 보이는 것을 멀티태스킹(multitasking)이라고 한다.
[네이버 지식백과] 프로세스 [process] (두산백과)

멀티태스크의 환경에서의 각 프로세스는 서로 독립한 작업이나 자원을 가지고 있다. 그 프로세스가 어느 정해진 룰 하에서 프로세스 간의 정보를 주고 받는 것을 프로세스간 통신이라 한다. 그 기능으로서는 파이프, 큐, 세마포르(semaphor), 시그널, 공유 메모리를 들 수 있다.
[네이버 지식백과] 프로세스간 통신 [integrated process communication, -間通信] (전자용어사전, 1995. 3. 1., 성안당)

- Thread
컴퓨터 프로그램 수행 시 프로세스 내부에 존재하는 수행 경로, 즉 일련의 실행 코드. 프로세스는 단순한 껍데기일 뿐, 실제 작업은 스레드가 담당한다. 프로세스 생성 시 하나의 주 스레드가 생성되어 대부분의 작업을 처리하고 주 스레드가 종료되면 프로세스도 종료된다. 하나의 운영 체계에서 여러 개의 프로세스가 동시에 실행되는 환경이 멀티태스킹이고, 하나의 프로세스 내에서 다수의 스레드가 동시에 수행되는 것이 멀티스레딩이다. ②나무 데이터 구조(tree data structure)에서 상위 노드의 식별과 나무 내의 정보 탐색을 촉진하는 포인터. ③게시판이나 토론의 장에서 최초 메시지에 대한 댓글들의 연속. 스레드는 수없이 많은 각각의 토론들을 관련 있는 것끼리 찾아서 읽거나 참여하는 데 도움이 된다.
[네이버 지식백과] 스레드 [thread] (IT용어사전, 한국정보통신기술협회)

2. REST란..?

REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다. 이 용어는 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었다. 필딩은 HTTP의 주요 저자 중 한 사람이다. 이 개념은 네트워킹 문화에 널리 퍼졌다.
엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음이다. 여기서 '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다. 간단한 의미로는, 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스를 말한다. 이 두 가지의 의미는 겹치는 부분과 충돌되는 부분이 있다. 필딩의 REST 아키텍처 형식을 따르면 HTTPWWW이 아닌 아주 커다란 소프트웨어 시스템을 설계하는 것도 가능하다. 또한, 리모트 프로시저 콜 대신에 간단한 XMLHTTP 인터페이스를 이용해 설계하는 것도 가능하다.

3. HashMap과, TreeMap, LinkedHashMap의 차이.

1. 성능 Hashmap
2. 정렬 Treemap
3. 입력순서, 랜덤접근성능떨어짐. : LinkedHashMap

4. Overloading, Overriding

- Overriding 재정의
- Overloading : 함수 인자 다형성

5. Singletone Pattern?

- 싱글톤 패턴이 Thread Safe 되려면? getInstance() 부분에 synchronized를 사용한다.

6. Gabage Collection ?

- 힙메모리 영역에서 참조하는 Object가 없는 경우(null) 찾아냄.
- 리소스를 회수.

7. 동기, 비동기 장단점?

8. JVM 구조

- Method(Static) Area
- Stack Area
- Heap Area

9. 정렬, 재귀 알고리즘의 시간 복잡도

10. 검색(Search) 알고리즘 종류는?

- Linear search : 처음부터 하나씩.
- Binary search : 가운데값
- hash Search - 키, 값.

11. 소팅(Sorting) 알고리즘 종류는?

- Bubble Sorting -  O( n^2 ) 순서를 맞바꿈.
- Select Sorting - 가장 큰 값부터 리스트의 끝으로 옮겨서 뒤에서 부터 앞으로 정렬
- Insert Sorting - O(n^2) 크기를 살펴서 순서에 맞게 삽입하여 정렬.
- Shell Sorting - O(nlogn)
- Quick Sorting - 표준, O(n^2) ~ O(n ) 
- Merge Sorting - O(nlogn)
- Heap Sorting - O(n logn)
- Radix Sort(기수) - O(n)

- 소팅알고리즘을 구현할 수 있는가??


12. GCM 구현?

google Cloud Message. gym
firebase Cloude Message fcm

13. ANR (Android Not Response) 이란?

 - 5초이내 입력 이벤트에 대한 응답이 없음
 - BroadcastReceiver가 10초이내에 실행을 완료하지 못함.
어플리케이션이 일정한 시간내에 응답이 없는 경우 Dialog로 표시함.  

 앱이 잠재적으로 오랜 시간동안 작업을 수행하는 상황에서는 UI스레드에서 작업을 수행하지 말고 대신 작업자 스레드를 만들고, 거기에서 대부분의 작업을 수행해야 함.
 AsyncTask 클래스를 사용해서 작업자 스레드를 만들도록 한다.

14. Android 생명 주기?

onCreate()
onStart()
onResume()
onPause()
onStop()
onDestory()

15. Fragment 생명주기

onAttach()
onCreateView()
onDestroyView()
onDetach()

16. Lamda ?
"->"
Runnable r = () -> { System.out.println("hello"); };
Collections.sort(strings, (String a, String b) -> -(a.compareTo(b)));
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html


17. Message Handler 동작 설명 Looper 와 연관지어서.?
A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.




18. Class , Object 차이에 대해 설명?


100. Coding Test

-  pivotal 3x3, 4x4 뒤집는 로직?
- 10칸짜리 배열로 스레드 세이프한 queue 만들기
- 피보나치 수열 구현
- cat을 구현하기
- 날짜 변환하기.

 

2017년 12월 20일 수요일

[Android] 안드로이드 gradle로 Release하기 : usage gradle apk release solution by productflavors : gradle v3.0.1

Android Studio v3 에서 gradle을 사용해서 한번에 다양한 release를 만들고 싶어졌다.
release apk파일들은 각기 다른 변수를 사용해서 다르게 만들어져야 했다.

1. 소스코드에서 gradle의 변수에 접근가능한 방법이 필요했다.
일반적으로 BuildConfig를 이용하면 Gradle의 변수에 접근 가능하다.
BuildConfig.DefinedName 
DefinedName을 하기 위해서는 gradle에서 buildConfigField를 이용하면 된다.
다음과 같이 boolean 타입의 변수를 정의해서 소스에서 접근할 수 있다.

android {
   defaultConfig{
      buildConfigField "boolean", "DefinedName", "false"
   }
}

2. Release할 때, 다양한 타입의 릴리즈파일을 생성하려면, productFlavors를 이용한다.
다음과 같이 flavorDimensions를 설정하고 productFlavors에서 release타입에 맞는
변수와 dimension을 설정하면 한번의 release동작으로 여러가지 apk를 생성할 수 있다.
BuildConfigField에서 정의된 DefinedName이 변하므로 빌드될 때, 소스코드가 변경되어 전혀다른 종류의 APK를 생성할 수 있다.
android {
   flavorDimensions "myOut"

   productFlavors {
        product1 {
            dimension "myOut"
            buildConfigField "boolean", "DefinedName", "true"
        }
        product2 {
            dimension "myOut"
            buildConfigField "boolean", "DefinedName", "false"
        }
   }
}

3. Release파일이름의 변경.
 release파일이름은 보통 app이름 + release인 app_release.apk 기본 형태로 생성된다.
 이 부분을 flavorName으로 바꾸고 싶은 경우 다음과 같이 사용해보자.
 myApp_product1.apk, myApp_product2.apk 형태로 release 파일을 생성할 수 있다.

android{
    release {
      applicationVariants.all { variant ->
         variant.outputs.all {
            def flavorName = variant.productFlavors[0].name;
            outputFileName = "myApp_${flavorName}.apk"
         }
      }
    }
}


2017년 8월 27일 일요일

[Android] NumberPicker : text blinking problem ( 선택된 문자 깜박임 방지 )

기본 NumberPicker를 사용하는 경우에, 선택된 문자를 터치하는 경우
깜박임이 발생한다.

깜박임을 방지하기 위해 다음과 같이 처리할 수 있다.


private void setNpbgFixxer( NumberPicker np ){
        try {
            Method method = np.getClass().getDeclaredMethod("changeValueByOne", boolean.class);
            method.setAccessible(true);
            method.invoke(np, true);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        Field f = null;
        try {
            f =NumberPicker.class.getDeclaredField("mInputText");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        EditText inputText = null;
        try {
            inputText = (EditText)f.get(np);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        inputText.setFilters(new InputFilter[0]);
    }

2017년 6월 25일 일요일

[Android] ButterKnife : 안드로이드 리소스 라이브러리

퍼온곳 : https://lonelywolflee.blogspot.kr/2016/04/android-view-bind-butter-knife.html

공식 홈페이지

http://jakewharton.github.io/butterknife/


v 8.6.0 기준으로 소개 됩니다.

공식 페이지 : http://jakewharton.github.io/butterknife/
한줄 소개 : Field, Resource, Event Callback을 Android View 에 Bind 하기 위한 Annotation을 제공한다.
예제 코드 : http://github.com/LonelyWolfLee/lw-butterknife-example/
라이센스 : the Apache License, Version 2.0

Introduction

Simple example

TextView title에 R.id.title을 할당하기 위해서 기존에는 아래와 같이 하였다.
TextView title;
...
@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    title = (TextView)activity.findViewById(R.id.title);
    // TODO Use fields...
}

하지만 Butter Knife를 사용하면 아래와 같이 사용이 가능 하다.
@BindView(R.id.title) TextView title;
...
@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
}

Advantage

  • control 객체를 가져오거나 resource 등을 가져오는 방식을 일관된 방식으로 사용 할 수 있다
  • 불필요한 boilerplate를 제거 할 수 있다
  • 로직과 정의 및 선언부를 분리 할 수 있어서 로직 구현 및 분석에 용이하다.


Installation

참고 : http://jakewharton.github.io/butterknife/#download

Android의 개발 환경은 IntelliJ 기반의 Android Studio에 gradle 기반의 프로젝트 설정 방식을 사용 한다. 원하는 프로젝트의 gradle 파일로 가서 다음과 같은 dependency 항목을 추가 한다. (실제 버전 확인)
dependencies {
    ...
    compile 'com.jakewharton:butterknife:8.6.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
}
정상적으로 동작 하지 않을 경우 다음 설정이 되어있는지 확인한다.
File > Other Settings > Default Settings > Build, Execution, Deployment > Compiler > Annotation Processors 에서 "Enable annotation processing"를 체크해준다.


Usages with example

Basic usage (예제 코드)

Controls, resources, event callback 을 annotation을 사용하여 정의 하고, onCreate()에서 ButterKnife.bind(this); 를 호출한다.
public class BasicWithButterKnifeActivity extends AppCompatActivity {

    @BindView(R.id.text_change_view)
    TextView changeView;

    @BindString(R.string.str_basic)
    String strChanged;

    @BindColor(R.color.colorBasicChanged)
    int colorChanged;

    @OnClick(R.id.button_change_text)
    void changeText() {
        changeView.setText(strChanged);
    }

    @OnClick(R.id.button_change_color)
    void changeColor() {
        changeView.setBackgroundColor(colorChanged);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);

        ButterKnife.bind(this);
    }
}

Usage on ViewHolder (예제 코드)

Controls, resources, event callback 을 annotation을 사용하여 정의 하고, constructor에서 ButterKnife.bind(Object, View); 를 호출한다.
예제에서 @OnClick 함수 내부에 item을 가져오기 위해 getItem을 사용하였다. clickButton()은 보기에는 method 정의로 보이지만 실제로는 R.id.btn_item 로 선언 된 Button view에 setOnClickListener 를 사용하여 달아준 리스너 객체와 연결되어 있다. 그렇기 떄문에 내부에서 getItem이 아닌 this.item 식으로 사용하게 되면 처음 class 가 생성 될 때에 ButterKnife.bind() 가 호출 될 시점의 값인 null 이 계속 호출 된다. 그래서 getItem() 같이 함수로 연결하여 나중에 들어온 값을 가져 올수 있도록 해야한다.
class RecyclerWithButterKnifeViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.txt_item)
    TextView text;
    String item;

    RecyclerWithButterKnifeViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

    void bind(final String item) {
        this.item = item;
    }

    @OnClick(R.id.btn_item)
    void clickButton() {
        text.setText(getItem());
    }

    private String getItem() {
        return this.item;
    }
}

Usage on Fragment (예제 코드)

Controls, resources, event callback 을 annotation을 사용하여 정의 하고, constructor에서 ButterKnife.bind(Object, View); 를 호출한다.
Fragment는 실제로 사용되는 Activity와 lifecycle이 다르기 때문에 적절한 위치에서 bind 된 객체를 null로 만들어줄 필요가 있다. 이를 위해 bind 시점에 Unbinder 를 반환하여 handling 할수 있게 해준다. onCreateView 에서 bind 해고 onDestroyView에서 unbind 하는 것이 일반적이다.
public class FragmentB extends Fragment {

    @BindView(R.id.txt_description)
    TextView description;
    @BindView(R.id.img_view)
    ImageView image;
    @BindString(R.string.str_frag_b)
    String strDescription;
    @BindDrawable(android.R.drawable.star_big_on)
    Drawable drawable;

    private Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_fragment, container, false);

        unbinder = ButterKnife.bind(this, view);
        description.setText(strDescription);
        image.setImageDrawable(drawable);

        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

2017년 1월 17일 화요일

[Android] okHttp 사용하기

1. okHttp 사용하기


http://square.github.io/okhttp/

1-1. Get 방식.


OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

1-2. Post 방식.

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}



2. okHttp https 설정하기


http://stackoverflow.com/questions/33469218/okhttp-request-https-is-very-slow-on-android


2016년 11월 2일 수요일

[Android] 파일 타입을 잘못지정해서 만들었다면?


파일을 생성하다보면, 간혹 파일타입을 잘못 지정해서 만드는 경우가 있는데,
이때, 해당 파일명으로 만들면 무조건, 아이콘이 처음 지정한 아이콘으로 표시된다.
xml파일을 만들어야 하는데, java 파일타입으로 지정해버리면 xml 디자인을 할수가 없다.

> 해결
Settings - Editor - File Types 메뉴에서 실수로 지정된 타입을 찾아보면
아까 잘못 지정한 파일명이 보인다. 리스트에서 "오른쪽빨간색 - 누름" 삭제 해준다.




2016년 5월 25일 수요일

[Android] Cross Compile

# 안드로이드 크로스 컴파일에 관해서

안드로이드에서 사용하는 크로스 컴파일러는
arm-linux-androideabi-gcc

apt-get install androideabi 를 이용해서 받을 수 있다.

android 컴파일러의 경우, bionic C를 사용하며, linker를
리눅스의 ld-linux.so 를 사용하는 것이아니라, linker를 사용한다.
--> 그렇기때문에 x86리눅스에서 컴파일된 파일은 ld-linux.so 에러를 보이며,
수많은 인터넷에 떠돌아다니는 x86프로그램들을 안드로이드에서 실행불가한 이유다.

readelf명령어로 컴파일된 파일을 확인해보면 linker부분을 확인할 수 있다.

기본적으로 arm-linux-eabi-gcc와 arm-linux-androideabi-gcc의 차이는
이 linker가 자동으로 설정 되느냐 안되느냐이다.

""와 hf 컴파일러가 다른데, 안드로이드의 경우 보통 ""를 사용하는 것으로 보인다.
> soft float, hard float
> arm-linux-androideabi-gcc의 경우 soft-float가 기본으로 되는 것으로 보임


컴파일러 옵션을 살펴보면, 다음과 같다.
눈여겨 봐야할 부분은 --with-float=soft 부분.. soft는 ""란 이야기.. hard는 hard-float를 지원한다는 이야기이다.

# arm-linux-androideabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-androideabi-gcc
COLLECT_LTO_WRAPPER=/Prj/toolchain/bin/../libexec/gcc/arm-linux-androideabi/4.8/lto-wrapper
Target: arm-linux-androideabi
Configured with: /s/ndk-toolchain/src/build/../gcc/gcc-4.8/configure --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpfr=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-mpc=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-cloog=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-isl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --with-ppl=/tmp/ndk-andrewhsieh/build/toolchain/temp-install --disable-ppl-version-check --disable-cloog-version-check --disable-isl-version-check --enable-cloog-backend=isl --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/tmp/ndk-andrewhsieh/build/toolchain/prefix --with-sysroot=/tmp/ndk-andrewhsieh/build/toolchain/prefix/sysroot --with-binutils-version=2.25 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.8 --with-gdb-version=7.7 --with-python=/usr/local/google/home/andrewhsieh/mydroid/ndk/prebuilt/linux-x86_64/bin/python-config.sh --with-gxx-include-dir=/tmp/ndk-andrewhsieh/build/toolchain/prefix/include/c++/4.8 --with-bugurl=http://source.android.com/source/report-bugs.html --enable-languages=c,c++ --disable-bootstrap --enable-plugins --enable-libgomp --enable-gnu-indirect-function --disable-libsanitizer --enable-gold --enable-threads --enable-graphite=yes --with-cloog-version=0.18.0 --with-isl-version=0.11.1 --enable-eh-frame-hdr-for-static --with-arch=armv5te --program-transform-name='s&^&arm-linux-androideabi-&' --enable-gold=default
Thread model: posix
gcc version 4.8 (GCC)


# 안드로이드에서 사용하기위해 컴파일을 했으나 segmentation  fault가 나는 경우.
readelf로 파일을 확인하면, linker는 제대로 들어갔으나, segmentation fault가 나오는경우가 있다.






2016년 3월 16일 수요일

[Android] Android Studio에서 난독화 하기

Android Studio에서 난독화 하기 ( Proguard )



1. 설정하기.
 build.gradle에서 난독화 설정을 할 수 있다.


buildTypes {
    debug {
 signingConfig signingConfigs.debug
 minifyEnabled false     zipAlignEnabled true     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}

2016년 1월 21일 목요일

[Android] OpenPrinting.

1. Samsung Printer
 - SPL ( Samsung Printer Language ) 사용 .  최신 버전 Ver5.
 - 삼성 프린터 드라이버 홈페이지에서 uld 드라이버를 다운로드받게 되면,
   linux, armv5le 버전의 rastertospl filter를 사용할 수 있다.
 - but.. 안드로이드의 경우 armv7l + /usr/bin/linker를 사용해서 쓸 수가 없었다.
 - Linker를 변경하는 방법이 있나.?? 기본적으로 ld-linux.so.3를 사용했음.

1.1. SPL Open Printing.
- Splix Driver : Linux/ Other Arch에서 사용하기 위해서 반드시 필요한 드라이버다.
                         cups용 filter를 제공하고 있다.
                         raster2qpdl 을 사용하거나, ps2qpdl을 사용할 수 있다.
                         raster2qpdl을 사용하려면, cups raster로 변환과정이 필요하고, gs필요
                         ps2qpdl을 사용하려면.. ps2gs 또는 pdf2ps등이 필요하며 내부적으로
                         gs를 사용하고 있어서 gs ( ghostscript ) 가 필요하다.

2. ZJS ( HP 보급형 Emulation )
- HP는 기본적으로 PCL을 지원하는 것으로 알고있는데, 보급형은 ZJS를 지원한다.
- 보급형도 PCL을 지원하면 좋을텐데 왜 지원을 하지 않는지 모르겠다.

3. Canon 지원
- GutenPrinting 드라이버 사용하면 된다.



2016년 1월 12일 화요일

[Android/Java] 외부 실행파일 사용하기.


프로그램하다보면, 실행파일을 이용해야할 때가 있다..

이때, ProcessBuilder를 사용할 수 있는데, 다음과 같이 ArrayList로 각각의 인자를 add한다.
만약 -page A4 라는 옵션을 넣어야 한다면 "-page" 와 "A4"를 각각 add하도록 해야 동작함.

 List cmd = new ArrayList();
cmd.add("java");
cmd.add("-classpath");
cmd.add("\"d:/workspace/some project/lib/something.jar\"");
cmd.add("blah.blah.SomeClass");
cmd.add("arg1");
cmd.add("arg2");
ProcessBuilder bld = new ProcessBuilder(cmd);
bld.directory(new File("d:/workspace/some project"));
bld.start();

출처 : http://egloos.zum.com/lempel/v/10961361
 
관련 참고 : http://jh-note.blogspot.kr/2012/01/java-15-processbuilder.html
  https://bugs.launchpad.net/ubuntu/+source/udev/+bug/18979
http://developer.oesf.biz/em/developer/

2015년 12월 30일 수요일

ghostscript, postscript, pdf printer

1. 포스트 스크립트

미국 어도비 시스템스사에서 개발한 페이지 기술 언어(PDL). 매끄럽고 섬세한 고품질 폰트와 도형의 이미지를 인쇄기에 인쇄하거나 화면에 표시할 수 있게 한다. 1984년에 이 언어의 명세가 공표되고, 1985년에 이 언어의 인터프리터를 내장한 레이저 인쇄기애플 컴퓨터 회사에서 발매되어 큰 호평을 받았으며, 그 후에 많은 인쇄기에 탑재되어 포스트스크립트는 업계 표준이 되었다. 한글이나 일본어 등의 텍스트도 기술할 수 있도록 언어 명세의 확장이 이루어졌다. 포스트스크립트의 특징은 출력 장치해상도에 의존하지 않고 영어와 비슷한 명령어를 사용하여 페이지의 배열을 제어하고, 아우트라인 폰트를 불러내어 그 크기를 조절할 수 있다는 점이다. 당초에는 페이지 인쇄기용으로 개발되었으나 인쇄기와 모니터 양쪽에서 사용할 수 있도록 기능이 확장된 디스플레이 포스트스크립트(Display PostScript)도 발매되었다. 또 MS-DOS매킨토시 등의 환경에서 가동하는 응용 소프트웨어 간의 파일 전송 형식으로서 밀봉형 포스트스크립트(ESP)가 널리 이용되고 있다.
[네이버 지식백과] 포스트스크립트 [PostScript] (IT용어사전, 한국정보통신기술협회)

>> PDF는 포스트 스크립트로 되어 있는 것으로 보임.. 포스트 스크립트 인터프리터가 탑재된 프린터가 보편화된 것으로 봐서, PDF파일을 포스트 스크립트로 변환하면 될것으로 예상된다.

2. PDF를 포스트 스크립트 언어로 변환하기?
>> 인쇄기에서 지원하는 언어?는 RTF/PCL/Postscript가 있는 걸로 되어있다.

3. PCL은 뭐지?
PCL 이란 Printer Command Language의 약자로, 휴렛 패커드사가 주축이 된
프린터 기술의 일종으로 PCL은 휴렛 팩커드사가 1984년 레이저 프린터와 PC
본체간 통신을 제어하기 위한 특수언어로 개발한 것이 시초입니다. 1996년
확정된 PCL6는 객체지향형 프로그래밍 기법을 적용, 모듈식 아키텍쳐 설
계와 글꼴 합성기술 등이 추가되어 복잡한 그래픽을 신속하게 인쇄하며 네
트워크 성능을 향상시킨 것이 특징입니다.

4. GhostScript ( http://pages.cs.wisc.edu/~ghost/doc/intro.htm )
Ghostscript is an interpreter for the PostScript (TM) language. A PostScript interpreter usually takes as input a set of graphics commands. The output is usually a page bitmap which is then sent to an output device such as a printer or display. PostScript is embedded in many printers.
Ghostscript has several main uses:
  1. Display a PostScript file (avoid killing trees).
  2. Display a PostScript file to decide if you really need to print it (reduce the number of trees killed).
  3. Print a PostScript file to a non-PostScript printer (kill more trees).
An example of a very simple PostScript file is:


 

2015년 12월 16일 수요일

[Android] 네트워크 상태 가져오기.


네트워크 상태를 가져오려면, broadcastreceiver를 사용하는 것이 좋다.
네트워크 연결/ 연결 아닌 상태를 감지해서 자동으로 상태변경이 필요하다.
* 코드에서 registerreceiver를 등록하는 경우, Manifest에 등록할 필요는 없다.

Broadcast ACTION : ConnectivityManager.CONNECTIVITY_ACTION


  // 레지스터 등록.
  private void registerReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        getApplicationContext().registerReceiver(mSystemSettingsChangeReceiver, filter);
  }
   private BroadcastReceiver mSystemSettingsChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
                updateConnectionInformation();
            }
        }
    };

 // UI Update
 private void updateConnectionInformation() {
 }


2015년 12월 8일 화요일

[Android] 언어 설정 변경하기.

안드로이드 언어 설정을 변경하기 위한 방법


1. system 권한이 있는 경우.


https://gist.github.com/xalexchen/4274535

private void updateLanguage(Locale locale) {
  Log.d("ANDROID_LAB", locale.toString());
try {
Object objIActMag, objActMagNative;
Class clzIActMag = Class.forName("android.app.IActivityManager");
Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
Method getDefault = clzActMagNative.getDeclaredMethod("getDefault");
// IActivityManager iActMag = ActivityManagerNative.getDefault();
objIActMag = getDefault.invoke(clzActMagNative);
// Configuration config = iActMag.getConfiguration();
Method getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) getConfiguration.invoke(objIActMag);
config.locale = locale;
Class[] clzParams = { Configuration.class };
Method updateConfiguration = clzIActMag.getDeclaredMethod(
"updateConfiguration", clzParams);
updateConfiguration.invoke(objIActMag, config);
} catch (Exception e) {
e.printStackTrace();
}
}

android.app.IActivityManager와 android.app.ActivityManagerNative를 사용하는 방법으로,
앱에서 세팅설정 자체를 변경할 수 있다.


2. system 권한이 없는 경우.


시스템 권한이 없는 경우에는 설정의 언어설정과 별도의 설정으로 구성할 수 있는데
Acitivty가 생성될 때마다 언어설정을 해주면 해당 언어의 XML로 UI 가 구성된다.

http://stackoverflow.com/questions/10751571/android-setting-language-in-app


String languageToLoad = "en"; 
  Locale locale = new Locale(languageToLoad); 
  Locale.setDefault(locale); 
  Configuration config = new Configuration(); 
  config.locale = locale; 
  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 




2015년 10월 22일 목요일

[Android] SystemBar Disappeard


http://masashi-k.blogspot.kr/2013/09/hide-show-system-bar-of-android.html

시스템바를 없앨 수 있다.

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    RootTools.debugMode = true; // debug mode
   
    hideSystemBar();
  }
  private void showSystemBar() {
    String commandStr = "am startservice -n com.android.systemui/.SystemUIService";
    runAsRoot(commandStr);
  }
 
  private void hideSystemBar() {
    try {
      //REQUIRES ROOT
      Build.VERSION_CODES vc = new Build.VERSION_CODES();
      Build.VERSION vr = new Build.VERSION();
      String ProcID = "79"; //HONEYCOMB AND OLDER

      //v.RELEASE //4.0.3
      if (vr.SDK_INT >= vc.ICE_CREAM_SANDWICH) {
          ProcID = "42"; //ICS AND NEWER
      }
     
      String commandStr = "service call activity " + ProcID + " s16 com.android.systemui";
      runAsRoot(commandStr);
    } catch (Exception e) {
      // something went wrong, deal with it here
    }
  }
 

  private void runAsRoot(String commandStr) {
    try {
      CommandCapture command = new CommandCapture(0, commandStr);
      RootTools.getShell(true).add(command).waitForFinish();
    } catch (Exception e) {
      // something went wrong, deal with it here
    }
  }

}

2015년 10월 15일 목요일

Platform Key를 이용해서 App Signing

System App을 개발하기 위해서는, 권한이 필요하다.
AndroidManifest.xml에 다음과 같이 sharedUserId를 설정해주면 된다.
android:sharedUserId="android.uid.system"

이렇게 설정된 시스템앱은 해당 플래폼의 key로 Signing되어야 하는데,
이러한 과정을 적어보려고 한다.



1. Framework에서 키 생성하기.

안드로이드 프레임웍의 /build/target/product/security 디렉토리를 보면 다음과 같은 파일이 확인된다.


2. 명령어

$ openssl pkcs8 -inform DER -nocrypt  -in testkey.pk8 -out testkey.pem
$ openssl pkcs12 -export -in testkey.x509.pem -inkey testkey.pem -out testkey.p12 -password pass:android -name androiddebugkey
$ keytool -importkeystore -deststorepass android -destkeystore testkey.jks -srckeystore testkey.p12 -srcstoretype PKCS12 -srcstorepass android


3. SignKey for Emulator

http://www.xinotes.net/notes/note/1267/

Private key:
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCceAWSrA1dOBze
qmXsyKYAbjZIDG1yB7EgEb5Qhjqr4rVdAJrfcUbW8iAigMfNTXvbJiQ7ioBsJrNL
E3UjpJJoIkkE3AFJPnwKzxoFyHT2mwN7YDCdkHTSQoDha60qhzQ2GVHq9ypILQmy
BLGHXhKsmMGqdz1oALnq/eVtWL7Y6NoW+aNgCZw3qDSm3+23trRKBJ4Homn8zyxU
lvLPNtZN+Qo7jY80o7qrTPUzcasncZs7pYdUrQxT/BTh20XVHiNPu+k8m6Tt+c5U
JhNQ7FNWB79pov9KoH219+ogDQmmwbSeIUAvie0RkIk6q1qRgPFS6C+FpFdTz1/B
kHHF7sgnAgEDAoIBAGhQA7cdXj4laJRxmUiFxABJeYVdnkwFIMAL1DWu0cfseOir
EepLhI9MFWxV2ojeUpIZbX0HAEgZzNy3o20YYZrBhgM9VjDUUrHfZq6Fo08SAlJA
IGkK+IwsVeudHhxaIs67i/H6HDAeBnaty6+UDHMQgRxPfkVV0UdT7kjl1JCaMTTc
hXxr+oGsH5d5EHCPBfEU4v8BqOBSEgkUFJ1Y6Y5AQqbSe2nSZ6bKZpE8YY27Ipvq
BrZEN0j7SKcHKuJDm81DGfLrh3vOmW6U0ZWy7o9qv7INYXNDvtKUMQigXYYANKUp
KvveUSgKJ+ixfFP8Ye92j8mp+d/+16i4Wa7Wu5sCgYEAyCd3wu4wsRAu/8q1abL1
4/V8M95+dlfhJBl3H9VwUbsH+CP2VRQ9KYkaYdPwOb8hz1h8gqr74ASbEvz+ixMH
zI6zel07VDCew+6OUZOBiOxGc8p7SpZuCeDsL+GEZxkOMQ7PXUpDI/p8nx84eEJU
ZrHc2kv1VcpdAXLhtrpiicUCgYEAyCA3GDc282T3BXj061vqR2rpFaqhdlRy7S2B
tA3BJj2Qrh1bgQGq9agC+YWm3xO3F/lJ+phK2WHoFOpR+m6w7Q0jx/L/BYOlJD+4
h1zeZJKhLBQToodM1ZktcLGYFkSzNJeUImt5T1sErj5op9Ex97nZfYswCrl0GtGa
NIVKJPsCgYEAhW+lLJ7LILV0qocjm8yj7U5SzT7++Y/rbWZPao5K4SdapW1O42LT
cQYRlo1K0SoWijr9rHH9QAMSDKipsgyv3bR3pujSOCBp1/Re4Q0BBfLZoob83GRJ
W+tIH+utmhC0ILSKPjGCF/xTFL96+tbi7yE95t1OOTGTVkyWedGXBoMCgYEAhWrP
ZXokokNPWPtN8j1G2kdGDnHA+Y2h83OrzV6AxCkLHr49AKvHTnAB+65vP2J6D/uG
pxAx5kFFY0bhUZ8gngjChUyqA60YwtUlr5M+7bcWHWK3wa+IjmYeSyEQDth3eGUN
bEemNOdYdCmbGot2pSaQ/lzKsdD4EeEReFjcGKcCgYA+JeOt5WFENpv4LT+7P+j1
k3xvOZ9sJGuXRXk9HXzsJvRCnc5oScwqku6i5HjzG8gyNVZg1sQGbVbWWmcNtaS8
I3XalYAHYQyb8SGxlQP4ctKAN4j2Hbk1OHAMW84dfAQYQwFcBdaJTtMXQlbbX5Rh
x90wE4qFuIapx6IKOmDxRw==
-----END PRIVATE KEY-----

2.Certificate:
-----BEGIN CERTIFICATE-----
MIIEqDCCA5CgAwIBAgIJALOZgIbQVs/6MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
Fw0wODA0MTUyMjQwNTBaFw0zNTA5MDEyMjQwNTBaMIGUMQswCQYDVQQGEwJVUzET
MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
hvcNAQEBBQADggENADCCAQgCggEBAJx4BZKsDV04HN6qZezIpgBuNkgMbXIHsSAR
vlCGOqvitV0Amt9xRtbyICKAx81Ne9smJDuKgGwms0sTdSOkkmgiSQTcAUk+fArP
GgXIdPabA3tgMJ2QdNJCgOFrrSqHNDYZUer3KkgtCbIEsYdeEqyYwap3PWgAuer9
5W1Yvtjo2hb5o2AJnDeoNKbf7be2tEoEngeiafzPLFSW8s821k35CjuNjzSjuqtM
9TNxqydxmzulh1StDFP8FOHbRdUeI0+76TybpO35zlQmE1DsU1YHv2mi/0qgfbX3
6iANCabBtJ4hQC+J7RGQiTqrWpGA8VLoL4WkV1PPX8GQccXuyCcCAQOjgfwwgfkw
HQYDVR0OBBYEFE/koLPdnLop9x1yh8Tnw48ghsKZMIHJBgNVHSMEgcEwgb6AFE/k
oLPdnLop9x1yh8Tnw48ghsKZoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJALOZgIbQVs/6MAwGA1Ud
EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBAFclUbjZOh9z3g9tRp+G2tZwFAAp
PIigzXzXeLc9r8wZf6t25iEuVsHHYc/EL9cz3lLFCuCIFM78CjtaGkNGBU2Cnx2C
tCsgSL+ItdFJKe+F9g7dEtctVWV+IuPoXQTIMdYT0Zk4u4mCJH+jISVroS0dao+S
6h2xw3Mxe6DAN/DRr/ZFrvIkl5+6bnoUvAJccbmBOM7z3fwFlhfPJIRc97QNY4L3
J17XOElatuWTG5QhdlxJG3L7aOCA29tYwgKdNHyLMozkPvaosVUz7fvpib1qSN1L
IC7alMarjdW4OZID2q4u1EYjLk/pvZYTlMYwDlE448/Shebk5INTjLixs1c=
-----END CERTIFICATE-----
> Privatekey를 platform.pem, Certificate 를 platform.x509.pem 파일로 만든다.
    두개의 파일을 이용해서 jks를 만들었더니 에뮬레이터에서도 잘 동작함.


4. VirtualBox AndroidX86 에서 사용하기

>> AndroidX86 Platform키는 왜 안되는 걸까..
>> http://sourceforge.net/p/android-x86/build/ci/marshmallow-x86/tree/


5. apk 의 KeySign 바꾸기
http://itmir.tistory.com/39

2015년 10월 1일 목요일

VirtualBox 해상도 설정하기


VirtualBox에서 Custom한 해상도로 실행해야할 경우 다음과 같이 실행하면, 부팅시 해상도를 설정할 수 있다.

> 24비트로 설정하는 경우에는, 화면이 안나왔음.
> VboxManage는 VirtualBox 디렉토리에 있으며 Path설정을해서 사용하면 편할듯.


C:\Users>VboxManage setextradata "Android4.4" "CustomVideoMode1" "1280x800x16"

2015년 9월 21일 월요일

코딩 교육 이젠 교육이다.

코딩 교육에 대해서 관심이 생겼다.

3년내로 초중 교육과정에 코딩 교육이 추가될 예정이고
그에 따라 사교육 수요도 늘어날 전망.


교육업계는 노후가 보장되는 제2인생의 흐름이 아닌지?

2015년 9월 3일 목요일

[기타] DIY NAS 만들기




1. Win32DiskImager (부팅USB를 만드는데 필요한 프로그램입니다.)
2. Xpenology Boot Image (XPEnoboot - IMG or ISO file / XPEnoboot와 Nanoboot 두 가지 버전입니다. 저는 XPEnoboot를 사용했습니다.)
3. DSM file (PAT파일 입니다. 2번에 Boot Image와 같은 버전으로 받으시면 됩니다.)
4. SynologyAssistant (네트워크에서 NAS를 찾아 DSM을 설치하기 위해 필요한 프로그램입니다,)
5. VirtualBox (무료), VMware (유료), Hyper-V (Windows에 포함)