Local Service 예제

|

SnowService.java

package com.snowdeer.local_service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class SnowService extends Service {

  int num = 0;

  public int getNumber() {
    num++;
    return num;
  }

  public class LocalBinder extends Binder {
    SnowService getService() {
      return SnowService.this;
    }
  }

  final Binder binder = new LocalBinder();

  @Override
  public IBinder onBind(Intent intent) {
    Log.i("snowdeer", "[snowdeer] SnowService - onBind()");
    return binder;
  }

  @Override
  public boolean onUnbind(Intent intent) {
    Log.i("snowdeer", "[snowdeer] SnowService - onUnbind()");
    return super.onUnbind(intent);
  }
}


MainActivity.java

package com.snowdeer.local_service;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.snowdeer.local_service.SnowService.LocalBinder;

public class MainActivity extends AppCompatActivity {

  SnowService snowService = null;

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

    Log.i("snowdeer", "[snowdeer] onCreate");

    Intent i = new Intent(MainActivity.this, SnowService.class);
    startService(i);

    bindService(i, mConnection, BIND_AUTO_CREATE);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    unbindService(mConnection);
    Log.i("snowdeer", "[snowdeer] onDestroy");
  }

  ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      Log.i("snowdeer", "[snowdeer] onServiceConnected");

      snowService = ((LocalBinder)service).getService();

      Log.i("snowdeer", "[snowdeer] num: " + snowService.getNumber());
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      Log.i("snowdeer", "[snowdeer] onServiceDisconnected");
    }
  };
}

Pycharm CE 버전을 이용한 Django 개발하기

|

Pycharm 유료 버전은 Django를 정식으로 지원하지만, CE(Community Edition) 버전은 지원하지 않습니다. 하지만, 사용자 설정을 통해서 CE버전에서도 Django 빌드 및 디버깅을 할 수 있습니다.


프로젝트 생성

먼저 터미널에서 다음 명령어를 이용해서 Django 프로젝트를 생성합니다. (프로젝트 생성은 그냥 콘솔에서 하는게 더 편합니다.)

django-admin.py startproject sample


Pycharm에서 해당 프로젝트 열기

위에서 생성한 프로젝트 폴더를 Pycharm을 통해서 엽니다.


실행 환경 구성

바로 실행할 수 없기 때문에 아래 메뉴에 접근해서 실행 환경을 구성해야 합니다.

Run > Edit Configurations

실행 환경 창이 뜨면 좌측 상단의 + 버튼을 눌러서 새로운 항목을 추가합니다. Python 항목을 선택합니다.

  • Name: runserver(아무거나 원하는대로 정하면 된다.)
  • Script Path: /Users/snowdeer/Workspace/python/django/sample/manage.py
  • Parameters: runserver

Java Reflection 예제

|

Java 언어에서 제공하는 Reflection 기능을 이용해서 각 클래스의 생성자 정보 등을 출력하는 예제입니다.


Main.java

package snowdeer.reflection;

public class Main {

  public static void main(String[] args) {
    ReflectionTest test = new ReflectionTest();
    test.start();
  }
}


ReflectionTest.java

package snowdeer.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class ReflectionTest {

  public void start() {
    Class c = SampleClass.class;

    Log("1) Class Info");
    Log("   - " + c.toString());

    Log("2) Class Constructors & Parameters");
    Constructor[] cons = c.getDeclaredConstructors();
    for (int i = 0; i < cons.length; i++) {
      Log("   - " + cons[i].toString());

      Parameter[] params = cons[i].getParameters();
      for (int j = 0; j < params.length; j++) {
        Log("      > " + params[j].getType());
      }
    }
  }

  void Log(String text) {
    System.out.println(text);
  }
}


SampleClass.java

package snowdeer.reflection;

public class SampleClass {

  int id;
  String name;
  long startPos;
  float speed;

  public SampleClass(int id, String name, long startPos, float speed) {
    init(id, name, startPos, speed);
  }

  public SampleClass(int id, String name, long startPos) {
    init(id, name, startPos, 0);
  }

  public SampleClass(int id, String name) {
    init(id, name, 100, 0);
  }

  public SampleClass(int id) {
    init(id, "SampleClass", 100, 0);
  }

  public SampleClass() {
    init(1, "SampleClass", 100, 0);
  }

  void init(int id, String name, long startPos, float speed) {
    this.id = id;
    this.name = name;
    this.startPos = startPos;
    this.speed = speed;
  }
}


결과 화면

1) Class Info
   - class snowdeer.reflection.SampleClass
2) Class Constructors & Parameters
   - public snowdeer.reflection.SampleClass()
   - public snowdeer.reflection.SampleClass(int)
      > int
   - public snowdeer.reflection.SampleClass(int,java.lang.String)
      > int
      > class java.lang.String
   - public snowdeer.reflection.SampleClass(int,java.lang.String,long)
      > int
      > class java.lang.String
      > long
   - public snowdeer.reflection.SampleClass(int,java.lang.String,long,float)
      > int
      > class java.lang.String
      > long
      > float

ipTIME A3000UA 리눅스 드라이버 설치 방법

|

ipTIME A3000UA 리눅스 드라이버 설치 방법

ipTIME의 A3000UA는 USB 무선랜카드입니다. Windows에는 드라이버 설치 파일을 제공하는데, 리눅스용은 아쉽게도 지원하지 않기 때문에 수동으로 드라이버를 설치해야 합니다.

다행히 해당 제품 내부에는 Realtek의 8812BU 라는 칩셋을 사용하기 때문에 해당 칩셋의 드라이버를 설치하면 됩니다.


설치 명령어

sudo apt update

sudo apt install dkms bc git

git clone https://github.com/cilynx/rtl88x2BU_WiFi_linux_v5.3.1_27678.20180430_COEX20180427-5959

sudo dkms add ./rtl88x2BU_WiFi_linux_v5.3.1_27678.20180430_COEX20180427-5959

sudo dkms install -m rtl88x2bu -v 5.3.1

sudo modprobe 88x2bu

참고 : https://askubuntu.com/questions/1018375/how-do-i-install-driver-for-rtl88x2bu

Ubuntu 18.04에 npm 설치하는 방법(sudo apt install npm 명령어 오류 발생시)

|

Ubuntu 18.04에 npm 설치하는 방법

Node.js는 설치되어 있는데, npm이 설치되어 있지 않은 경우 대부분

sudo apt install npm

명령어로 npm 설치가 가능합니다.

하지만, 만약

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 npm : Depends: node-gyp (>= 0.10.9) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

오류가 발생할 경우

sudo apt-get install nodejs-dev node-gyp libssl1.0-dev

sudo apt install npm

명령어를 이용해서 설치할 수 있습니다.