미니 키보드 중에 특정 자판(키)가 없는 경우가 있다. 키보드에서 자주 쓰는 키가 고장났을 때 안 쓰는 키를 자주 쓰는 키로 바꾸고 싶다. 하면 이 포스트를 읽기 바란다. 쉽다. 


1. "KeyTweak 프로그램"을 다운로드하고 설치한다. 설치법은 일반적인 프로그램 다운과 같다. 그냥 "Next" 누르면 된다.


url : http://software.naver.com/software/summary.nhn?softwareId=MFS_100843


설치가 끝나면 다음과 같이 프로그램이 실행된다. 처음 설치했다면 아래 사진에서 빨간색 부분에 아무 목록이 없다. 자판/키 배열을 변경하면 목록이 아래와 같이 추가된다. 필자의 경우 'Num Lock' 키를 'Insert'로 바꿨고 'Page Up' 키를 'Print Screen'을 바꿨다. 이 방법을 지금 살펴보자. 우리는 이번 포스트에서 "End" 키를 "A"키로 바꿔볼 것이다.




2. 바꾸고 싶은 키(고장난 키)를 선택한다. 우리는 "End"를 "A"로 바꿀 것이므로 "End"를 선택했다. 선택하면 아래 사진과 같이 Key Selected : "81" is currently mapped to : "End" 가 출력된다.




3. "Choose New Remapping" 오른쪽 박스를 누르면 아래와 같이 드롭박스가 나온다. 여기서 변경되기 원하는/ 바꾸기 원하는 키를 선택한다. 우리는 "End"를 "A"로 바꾸는 작업을 할 것이기에 "A"를 클릭했다. 선택 후 마지막으로 아래 사진에 표시되 있는 "Remap Key"를 클릭한다. 


4. "Remap Key" 버튼을 클릭하면 아래와 같이 "Pending Changes:" 목록에 변경할 사항이 추가된다. 그 다음 아래 사진의 "Apply" 버튼을 누르면 된다. 참고로 여러 개의 키를 한번에 변경하고 싶다면 1~3번 항목을 변경할 키마다 반복 후 "Apply" 버튼을 누르면 된다.

 


5. 아래와 같은 사진이 나온다. "예(Y)"를 눌러 컴퓨터 재부팅을 한다. 그러면 키가 바뀐다. 끝~~~ 추가로 KeyTweak 프로그램을 삭제해도 변경된 키는 그대로 유지된다.




※ 참고로 KeyTweak로 바꾼 키를 원상복구하고 싶을 수 있다. 이 때는 아래 사진에서 보이는 "Restore All Defults" 를 누르고 컴퓨터 재부팅하면 된다.


'기타' 카테고리의 다른 글

노트북 내장 키보드 잠그기/끄기/off하기  (28) 2017.07.28

※ 스케줄러(Schedulers)

: 안드로이드는 메인 스레드에서 네트워킹/파일 IO 등 복잡한 연산을 최소화해야 하므로 멀티스레딩은 필수이다. 스케줄러는 안드로이드에 쉽고 간단하게 멀티스레드를 적용해준다. 먼저 다음 예제를 보자. 안드로이드 스튜디오에서 실행했다. 아래 결과를 보면 Observable과 Observer가 메인 스레드에서 실행된 걸 알 수 있다. 

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

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                Integer arr[] = new Integer[]{1,2,3};
                for(Integer i : arr){
                    Log.d("thread", Thread.currentThread().getName()+" Observable"+i);
                    e.onNext(i);
                }
            }
        }).subscribe(new DefaultObserver<Integer>() {
            @Override
            public void onNext(@NonNull Integer integer) {
                Log.d("thread",Thread.currentThread().getName()+" Observer"+integer);
            }

            @Override
            public void onError(@NonNull Throwable e) {}

            @Override
            public void onComplete() {}
        });
    }
- 결과



- Schedulers.io()
: 비동기 I/O 작업을 위한 스케줄러이다. 스레드풀을 가진다. 아래 코드를 보면 subscribeOn(Schedulers.io()) 가 있다. subscribeOn은 Observable의 실행 스레드를 결정한다. 따라서 해당 Observable은 Schedulers.io 스레드에서 동작한다. 아래 결과를 보면 Observable과 Observer가 위 예제와 달리 main 스레드가 아닌 별도의 스레드에서 실행하는 걸 알 수 있다.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                Integer arr[] = new Integer[]{1,2,3};
                for(Integer i : arr){
                    Log.d("thread", Thread.currentThread().getName()+" Observable"+i);
                    e.onNext(i);
                }
            }
        }).subscribeOn(Schedulers.io())
                .subscribe(new DefaultObserver<Integer>() {
            @Override
            public void onNext(@NonNull Integer integer) {
                Log.d("thread",Thread.currentThread().getName()+" Observer"+integer);
            }

            @Override
            public void onError(@NonNull Throwable e) {}

            @Override
            public void onComplete() {}
        });
    }

 결과



- Schedulers.computation()
: I/O와 관련없는 연산이나 콜백 처리를 위해 사용한다. Schedulers.io()와 다른 점은 스레드 풀의 스레드 갯수가 CPU 갯수로 제한된다. 이전 코드에서 Schedulers.io()를 Schedulers.computation()으로 바꾸면 된다. 결과를 보면 Schedulers.io()의 스레드와 다른 걸 알 수 있다.
.subscribeOn(Schedulers.computation())

 결과



- Schedulers.newThread()
: 새로운 스레드에서 작업한다.

.subscribeOn(Schedulers.newThread())

 결과



- Schedulers.trampoline()
: 현재 해당 코드가 실행되는 스레드에서 해당 Observable을 실행한다. Schedulers.trampoline()을 통해 스레드 내에서 순차적으로 큐 처리 작업을 할 수 있다. 아래 결과를 보면 안드로이드 메인 스레드에서 실행했으므로 trampoline()을 통해 main 스레드에서 Observable이 실행된다.

.subscribeOn(Schedulers.trampoline())

 결과



- Schedulers.from(Executor)
: 매개변수로 전달한 Executor 상에서 Observable을 실행한다. 아래 결과를 보면 Observable이 실행된 스레드는 아래 코드에서 만든 es 인걸 알 수 있다.
        ExecutorService es = Executors.newSingleThreadExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(@android.support.annotation.NonNull Runnable runnable) {
                return new Thread(runnable,"RxJavaSchedulers.from()");
            }
        });

	......

	.subscribeOn(Schedulers.from(es))

 결과



- AndroidSchedulers.mainThread()

: 안드로이드에서 백그라운드 스레드에서 작업 후 UI 변경을 위해 메인 스레드에 접근할 때 사용된다. 아래 코드를 보면 .observeOn(AdnroidSchedulers.mainThread())를 호출한다. observeOn은 observeOn 호출 뒤의 Observer의 작업이 수행될 스레드를 지정하는 것이다. 따라서 subscribeOn 전 작업은 Schedulers.io()에 의해 생성된 스레드로 진행되고 observeOn 뒤 작업은 안드로이드 메인 스레드에 의해 작업이 진행된다. 아래 예에 대한 결과를 보면 이를 잘 알 수 있다. 

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

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                Integer arr[] = new Integer[]{1,2,3};
                for(Integer i : arr){
                    Log.d("thread", Thread.currentThread().getName()+" Observable"+i);
                    e.onNext(i);
                }
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new DefaultObserver<Integer>() {
            @Override
            public void onNext(@NonNull Integer integer) {
                Log.d("thread",Thread.currentThread().getName()+" Observer"+integer);
            }

            @Override
            public void onError(@NonNull Throwable e) {}

            @Override
            public void onComplete() {}
        });
    }

 결과


+ Recent posts