반응형

*테스트한 클라이언트 OS: Ubuntu 12.04 desktop (64bit)

*시너지 버전: synergyc 1.3.8, protocol version 1.3

*서버 OS: Windows 7 (64bit)


시너지를 이용해서 윈도우와 우분투 머신 연결에는 성공했으나, ~/.bashrc를 이용한 자동 실행만 가지고는 로그인 화면에서 원격 키보드로 입력할 수가 없어서 불편함이 있었다. 이를 해결하기 위해서 우분투가 로그인 화면을 띄울 때 시너지 서버나 클라이언트를 자동실행 시키는 방법이 아래 링크에 잘 설명되어 있다.

https://help.ubuntu.com/community/SynergyHowto


우분투 12.04의 경우 나중에 따로 설치하거나 설정을 바꾸지 않는다면 LightDM으로 로그인을 하는데,

이 경우에는 /etc/lightdm/lightdm.conf 파일을 열어서, 맨 마지막 줄에 아래 내용만 추가하면 된다.

greeter-setup-script=/usr/bin/synergyc --name [리눅스_클라이언트_이름] [synergy_server_IP]:[synergy_server_PORT]


물론 로그인 이후 시너지를 자동 실행시키는 스크립트는 그대로 유지해야 한다.

이렇게 하면 부팅중일 때를 제외하면 항상 원격 키보드/마우스 입력으로 접근할 수 있다.

반응형
블로그 이미지

Bryan_

,
반응형

~/.config/user-dirs.dirs 파일을 연다.


"XDG_"로 시작하는 줄에 적혀 있는 한국어 폴더 이름을 영어로 바꿔 준다. 예를 들어서,

XDG_DESKTOP_DIR="$HOME/Desktop"

XDG_DOWNLOAD_DIR="$HOME/Download"

XDG_TEMPLATES_DIR="$HOME/Templates"

XDG_PUBLICSHARE_DIR="$HOME/Public"

XDG_DOCUMENTS_DIR="$HOME/Documents"

XDG_MUSIC_DIR="$HOME/Music"

XDG_PICTURES_DIR="$HOME/Pictures"

XDG_VIDEOS_DIR="$HOME/Videos"


변경된 내용을 저장하고 나서, 홈 디렉토리에 있는 한국어 기본 디렉토리들의 이름을 위에 입력했던 영어 이름으로 바꿔 준다. (e.g. 바탕화면 --> Desktop)

재부팅하고 나면 영어 디렉토리로 적용된다.


참고로 본인은 Ubuntu 12.04를 쓰지만 Unity 대신 Gnome-session을 쓰고 있다.

이 때는 위와 같이 변경하고 나면 왼쪽 상단의 "위치" 메뉴에 있던 기본폴더 링크가 보이지 않게 된다.

다시 "위치" 메뉴에 있는 폴더들의 링크가 보이게 하려면 ~/.gtk-bookmarks 파일을 열고,

file:///home/[사용자 계정]/%EB%AC%B8%EC%84%9C

file:///home/[사용자 계정]/%EC%9D%8C%EC%95%85

file:///home/[사용자 계정]/%EC%82%AC%EC%A7%84

file:///home/[사용자 계정]/%EB%B9%84%EB%94%94%EC%98%A4

file:///home/[사용자 계정]/%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C


위와 같이 사용자 계정명 뒤에 적힌 글자를 앞서 바꾼 영어 이름으로 바꿔 준다. 예를 들어,

file:///home/usera/Download

file:///home/usera/Documents

file:///home/usera/Music

file:///home/usera/Pictures

file:///home/usera/VIdeos


위의 한국어 이름과 순서가 맞지는 않을 것 같고, 내가 임의로 지우고 썼다. -_-;

반응형
블로그 이미지

Bryan_

,
반응형
Nexus S (넥서스S)에서 카메라 모듈을 쓰려고 할 때 startPreview 에러가 발생할 때가 있는데, 이 때는 카메라의 preview size를 명시적으로 지정하되, 사이즈를 주의해서 지정해 주어야 하는 것 같다.

참고(reference): http://soledadpenades.com/2011/04/05/native-startpreview-failed-on-nexus-s-check-your-preview-size/

위의 사이트에서는 preview size를 8x16으로 해서 됐다고 하는데, 시스템에서 지원하는 size를 얻어 오는 것으로도 에러 없이 실행이 되는 것 같다.
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();

// get the first preview size supported by the device
Camera.Size s = parameters.getSupportedPreviewSizes().get(0);

parameters.setPreviewSize(s.width, s.height);
camera.setParameters(parameters);

삼성 안드로이드 기기의 문제인지 넥서스S만의 문제인지는 모르지만, 다른 기기들에서 정상적으로 돌아가는 코드가 가끔 실행이 안될 때가 있어서 간단히 기록해 두었다.

반응형
블로그 이미지

Bryan_

,
반응형
Java에서 사용자가 정의한 클래스(Class)를 가지고 서로 같은 것인지 비교해야 할 때가 있다.
Java의 모든 클래스는 Object 클래스를 상속하고, Object 클래스가 기본으로 가지고 있는 메쏘드 중에서 equals와 hashCode가 있다.
예를 들어, 학교의 수업관리 시스템에서 학생(Student) 클래스를 사용한다고 가정하고 Student 클래스를 정의하면:
public class Student {
    private int studentId;
    private String name;
    private String major;
   
    public int getStudentId() {
        return studentId;
    }
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }
}


위 클래스를 사용하여 아래와 같이 똑같은 학생을 두 개의 다른 인스턴스(instance)로 만들어 비교해 보면:
public static void main(String[] args){
        Student s1 = new Student();
        s1.setStudentId(20101234);
        s1.setName("Gildong Hong");
        s1.setMajor("Computer Science");

        Student s2 = new Student();
        s2.setStudentId(20101234);
        s2.setName("Gildong Hong");
        s2.setMajor("Computer Science");
       
        System.out.println(s1.equals(s2));    // false
}
실행 결과는 false가 나온다.

위 상황에서 두 학생이 학번이 같고 이름도 같고 전공도 같기 때문에 의미상 똑같은 객체라는 것을 Java가 인식할 수 있게 하기 위한 방법이 equals 메쏘드를 override하는 것이다. Student 클래스에 equals를 override하여 구현하면:
public class Student {
    private int studentId;
    private String name;
    private String major;
   
    public int getStudentId() {
        return studentId;
    }
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }
   
    @Override
    public boolean equals(Object o){
        Student s = (Student) o;
        if(studentId == s.getStudentId()
            && name.equals(s.getName())
            && major.equals(s.getMajor())){
            return true;
        } else {
            return false;
        }
    }
}


이 클래스를 가지고 다시 equals 메쏘드로 위의 s1과 s2를 비교하면 같은 것으로 인식할 수 있다.
하지만 equals만 가지고는 HashMap, HashSet과 같이 key, value의 쌍으로 구성되는 자료구조에서는 제대로 작동하지 않는다. 이 때에는 hashCode 메쏘드를 추가로 override하여 구현하면, Student 클래스의 예와 같이 같은 학번, 이름, 전공을 가진 객체의 경우에는 동일한 key로 간주하도록 할 수 있다.
public class Student {
    private int studentId;
    private String name;
    private String major;
   
    public int getStudentId() {
        return studentId;
    }
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMajor() {
        return major;
    }
    public void setMajor(String major) {
        this.major = major;
    }
   
    @Override
    public boolean equals(Object o){
        Student s = (Student) o;
        if(studentId == s.getStudentId()
            && name.equals(s.getName())
            && major.equals(s.getMajor())){
            return true;
        } else {
            return false;
        }
    }
   
    @Override
    public int hashCode(){
        String s = ""+studentId+name+major;
        return s.hashCode();
    }
}


public static void main(String[] args){
        Student s1 = new Student();
        s1.setStudentId(20101234);
        s1.setName("Gildong Hong");
        s1.setMajor("Computer Science");

        Student s2 = new Student();
        s2.setStudentId(20101234);
        s2.setName("Gildong Hong");
        s2.setMajor("Computer Science");
       
        HashMap<Student, String> advisors = new HashMap<Student, String>();
        advisors.put(s1, "prof. Kim");              // s1 클래스를 key로 사용
        System.out.println(advisors.get(s2));   // s2 클래스를 key로 사용
}

위 예제는 같은 멤버변수 값을 가질 경우 같은 hashCode를 리턴하도록 hashCode를 override함으로써 s2 인스턴스를 가지고 "prof. Kim"을 얻을 수 있다.


반응형
블로그 이미지

Bryan_

,
반응형
다른 버전 리눅스는 안써봐서 모르겠고,
일단 Ubuntu에는 bash, sh, csh 같은 여러 종류의 쉘이 있다.
사용자 계정을 만들고 로그인했을 때 나타나는 프롬프트의 모양이
사용중인 쉘을 어느정도 알려주는 것 같다.

*대표적인 예:
/bin/sh
$

/bin/bash
[사용자 계정이름]@[시스템 이름]:~$

/bin/csh
%


로그인 후에 다른 쉘을 사용하는 법은 간단하다.
일반적으로 bin 디렉토리가 $PATH에 있기 때문에 바로 쉘 이름으로 실행할 수 있다.
(예) sh를 쓰는 상황에서 bash를 쓰고 싶을 때,
$ bash
usera@superman:~$
usera@superman:~$ exit
$


하지만 리눅스에 로그인할 때마다 뜨는 쉘 대신, 다른 쉘을 쓰고 싶을 때는
매번 로그인 후에 쉘 이름을 다시 입력하는 것은 번거로우므로
(그리고 로그아웃할 때도 exit를 두번 쳐야 하므로-_-)
시작할 때 계정에 연결된 쉘 경로를 바꾸는 것이 편하다.

먼저 시스템에서 현재 사용할 수 있는 쉘의 목록을 보려면:
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen

Ubuntu 8.0.4 기준으로 목록이 위와 같고, 실제로 이 쉘들이 다 깔려있지는 않다.
원하는 쉘의 경로를 기억해 두었다가 "chsh" 명령으로 쉽게 바꿀 수 있다.
$ chsh
Password: [계정 암호 입력]
Changing the login shell for usera
Enter the new value, or press ENTER for the default
        Login Shell [/bin/sh]: /bin/bash
$

쉘을 바꿨다고 해서 현재 프롬프트에 바로 적용되지는 않는다.
로그아웃 후 다시 들어가 보면 바뀐 쉘로 로그인됨을 알 수 있다.


반응형
블로그 이미지

Bryan_

,