반응형

Javascript를 활용하여 매 초마다 시간을 변경해서 웹페이지에 반영할 때 유용하게 쓸 수 있는 함수로 setInterval이 있다.

아래와 같이 실행할 함수 이름과 밀리초(ms) 단위의 시간을 파라미터로 활용할 수 있다. Chrome(구글 크롬) 브라우저에서 테스트한 결과, 실행할 함수는 "(쌍따옴표) 또는 '(따옴표)로 둘러싸야 정상적으로 실행이 되었다.

var timerID;

timerID = setInterval( "function_to_run()", 5000 );


setInterval은 한번 실행하고 멈추는 것이 아니고 파라미터로 입력한 주기마다 반복 실행하며, clearInterval 함수로 중지시킬 수 있다. 실행할 함수에 파라미터를 적용할 수는 없기 때문에, 파라미터가 있는 함수를 setInterval로 쓰고 싶다면 아래와 같이 쓸 수 있다. 원인을 파악하지 못했지만, 파라미터가 있는 함수를 파라미터로 쓸 때는 "(쌍따옴표)나 '(겹따옴표)를 쓰면 안된다.

var timerID;

timerID = setInterval( function(){ function_with_params(foo, bar); }, 5000 );


setInterval과 clearInterval을 활용하여 시계 형식으로 제한된 시간을 감소시키는 타이머 코드의 예제는 다음과 같다.

<script language="JavaScript">

var timerID; // 타이머를 핸들링하기 위한 전역 변수

var time = 119; // 타이머 시작시의 시간


/* 타이머를 시작하는 함수 */

function start_timer() { 

timerID = setInterval("decrementTime()", 1000);

}


/* 남은 시간을 감소시키는 함수 */

function decrementTime() { 

var x1 = document.getElementById("time1");

var x2 = document.getElementById("time2");

x1.innerHTML = toMinSec(time);

x2.innerHTML = toMinSec(time);


if(time > 0) time--;

else { 

// 시간이 0이 되었으므로 타이머를 중지함

clearInterval(timerID);


// 시간이 만료되고 나서 할 작업을 여기에 작성

document.form.submit(); // 예: 강제로 form 실행

}

}


/* 정수형 숫자(초 단위)를 "시:분:초" 형태로 표현하는 함수 */

function toHourMinSec(t) { 

var hour;

var min;

var sec;


// 정수로부터 남은 시, 분, 초 단위 계산

hour = Math.floor(t / 3600);

min = Math.floor( (t-(hour*3600)) / 60 );

sec = t - (hour*3600) - (min*60);


// hh:mm:ss 형태를 유지하기 위해 한자리 수일 때 0 추가

if(hour < 10) hour = "0" + hour;

if(min < 10) min = "0" + min;

if(sec < 10) sec = "0" + sec;


return(hour + ":" + min + ":" + sec);

}

</script>


반응형
블로그 이미지

Bryan_

,
반응형

콘솔창(Windows의 cmd 또는 리눅스의 terminal)에서 아래와 같이 입력한다.

전제조건: 안드로이드 폰에 대한 USB 드라이버 및 adb가 설치되어 있어야 함.


> adb shell

$ pm list packages -f




반응형
블로그 이미지

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_

,
반응형

파일(sql구문)로 DB 백업:
$ mysqldump -u[사용자] -p[암호] [백업할 데이터베이스 이름] > db091130.sql
참고로 -d 옵션을 주면 데이터 없이 스키마만 백업한다.

생성된 DB가 utf8을 사용하고 있고 데이터에 한글이 포함되었을 때는 가급적
구문을 추가해줄 것.


백업파일로부터 DB 복구:
$ mysql -u[사용자] -p[암호] [복구될 데이터베이스 이름] < db091130.sql

복구할 때 복구될 데이터베이스는 "create database [데이터베이스이름]"에 의해 미리 생성되어 있어야 한다.
반응형
블로그 이미지

Bryan_

,