코틀린의 문자열에서 부분 문자열을 뽑아내려면 아래와 같이 slice라는 함수를 사용하면 됩니다.

 

var 문자열 = "안녕하세요"

var 범위 = IntRange(0, 3) // 0, 1, 2, 3 포함

println(문자열.slice(범위))

---

<출력 결과>

안녕하세

 

선언해놓고 사용하지 않은 변수가 있으면 원래는 컴파일러가 경고를 합니다. 그런데 변수 앞에


__attribute__((unused))


를 써 놓으면 컴파일러가 경고를 하지 않습니다.

[자바] 코드 실행 시간 측정하기 (System.currentTimeMillis())


프로그래밍을 하다 보면 코드 특정 부분의 실행 시간을 측정해야 하는 경우가 생깁니다.

그럴 때에 아래와 같이 System.currentTimeMillis() 함수를 사용하면 밀리초 단위로 시간을 잴 수 있습니다.

System.currentTimeMillis() 의 반환 변수 형식은 long 입니다.


long 시작시간 = System.currentTimeMillis();

// 여기서 원하는 작업을 해 줍니다.

long 끝시간 = System.currentTimeMillis();

long 걸린시간 = 끝시간 - 시작시간;

System.out.println("걸린 시간: " + 걸린시간 + " 밀리초");


아래 명령어로 리눅스 종류와 버전을 확인할 수 있습니다.


grep . /etc/*-release


제가 사용하는 서버에서는 아래와 같은 결과가 나오네요.


/etc/centos-release:CentOS Linux release 7.4.1708 (Core) 

/etc/os-release:NAME="CentOS Linux"

/etc/os-release:VERSION="7 (Core)"

/etc/os-release:ID="centos"

/etc/os-release:ID_LIKE="rhel fedora"

/etc/os-release:VERSION_ID="7"

/etc/os-release:PRETTY_NAME="CentOS Linux 7 (Core)"

/etc/os-release:ANSI_COLOR="0;31"

/etc/os-release:CPE_NAME="cpe:/o:centos:centos:7"

/etc/os-release:HOME_URL="https://www.centos.org/"

/etc/os-release:BUG_REPORT_URL="https://bugs.centos.org/"

/etc/os-release:CENTOS_MANTISBT_PROJECT="CentOS-7"

/etc/os-release:CENTOS_MANTISBT_PROJECT_VERSION="7"

/etc/os-release:REDHAT_SUPPORT_PRODUCT="centos"

/etc/os-release:REDHAT_SUPPORT_PRODUCT_VERSION="7"

/etc/redhat-release:CentOS Linux release 7.4.1708 (Core) 

/etc/system-release:CentOS Linux release 7.4.1708 (Core)

그래들 파일에 다음 코드를 추가한 뒤 실행해주면 build/libs 에 opencv-android.jar 파일이 생성됩니다.


task jar(type: Jar) {

    from 'build/intermediates/classes/release/'

    archiveName 'opencv-android.jar'

}

[자바] 제곱 속도 - 직접 만든 제곱 함수가 Math.pow() 보다 빠를 때도 있어요


* 1.0의 제곱을 20억 번 할 경우 Math.pow()가 직접 만든 제곱 함수보다 세 배 느렸습니다.


* 제곱 횟수를 훨씬 늘리면 시간 차이가 줄어들던데, 아마 JIT 컴파일 때문이 아닐까 추측만 해 보았습니다.


* 실험 결과와 코드는 아래와 같습니다.





걸린 시간 (Math.pow 함수, 20억 회): 6 ms

걸린 시간 (직접 만든 제곱, 20억 회): 2 ms




public class 제곱속도측정 {


  public static double 직접만든제곱(double 숫자) {

    return 숫자*숫자;

  }


  public static void main(String[] args) {

    long 시작시간1 = System.currentTimeMillis();

    for(int i=0; i<2000000000; ++i) {

      Math.pow(1.0, 2);

    }

    long 끝시간1 = System.currentTimeMillis();

    System.out.println("걸린 시간 (Math.pow 함수, 20억 회): " + (끝시간1-시작시간1) + " ms");


    long 시작시간2 = System.currentTimeMillis();

    for(int i=0; i<2000000000; ++i) {

      직접만든제곱(1.0);

    }

    long 끝시간2 = System.currentTimeMillis();

    System.out.println("걸린 시간 (직접 만든 제곱, 20억 회): " + (끝시간2-시작시간2) + " ms");

  }


}







리눅스에서 프로그램을 돌려 놓고 한참 뒤에 보면 화면에 Killed 라는 글만 떠 있고 프로세스가 죽어 있는 경우가 가끔 있습니다.

그럴 때에는

dmesg | grep -E -i -B100 'killed process'

라고 치면 프로세스가 강제 종료될 때의 상황을 자세히 볼 수 있습니다.

제 경우에는 대부분 Out of memory가 원인이었습니다.


(참고한 자료: https://stackoverflow.com/questions/726690/who-killed-my-process-and-why)

You may have to install OPENSSL in your system and/or pass OPENSSL_DIR or OPENSSL_INCDIR to the luarocks command.


이런 메시지가 뜨고 Luarocks 진행이 안 되면 (우분투 기준) sudo apt-get install libssl-dev 으로 libssl-dev를 설치해주시면 됩니다.


( 사진 출처: https://pixabay.com/photo-1050964/ )


걸리버 여행기를 보다 보면 달걀을 깨 먹을 때 크고 뭉툭한 쪽을 깨서 먹어야 한다고 주장하는 사람들과 작고 뾰족한 쪽을 깨서 먹어야 한다고 주장하는 사람들이 싸우는 장면이 나옵니다. 여기서 크고 뭉툭한 쪽을 깨서 먹어야 한다고 말하는 사람들이 빅 엔디안(big endian)이고, 작고 뾰족한 쪽을 깨서 먹어야 한다고 주장하는 사람들이 리틀 엔디안(little endian)입니다. 말 그대로 큰(big) 끝(end) 사람들(-ian)과 작은(little) 끝(end) 사람들(-ian)입니다.


컴퓨터가 값을 저장할 때에 높은 자리수부터 차례대로 저장하면 빅 엔디안, 낮은 자리수부터 저장하면 리틀 엔디안이라고 부릅니다. 예를 들어 4바이트 짜리 16진수 0x10111213 (10진수 269,554,195)을 메모리에 저장할 때에 메모리 앞에서부터 차례대로 0x10, 0x11, 0x12, 0x13 순서로 저장하면 빅 엔디안이고, 거꾸로 0x13, 0x12, 0x11, 0x10 순서로 저장하면 리틀 엔디안입니다. 빅 엔디안과 리틀 엔디안을 각각 한국어로 '큰 쪽부터'와 '작은 쪽부터'라고 번역하면 어떨까요?

딥 러닝 도구인 Caffe를 사용하면서 batch_size, max_iter, test_iter, epoch 등의 용어를 이해하는 것이 힘들었어서 이렇게 기록으로 남깁니다. 설명을 쉽게 하기 위해 사진을 Caffe로 처리하는 경우를 가정해 보도록 하겠습니다.

 

1. batch_size

배치(batch)는 한 번에 처리하는 사진의 장 수를 말합니다. Caffe에서 기본으로 제공되는 cifar10 예제의 cifar10_full_train_test.prototxt 파일을 열어보면 batch_size: 100 이라는 부분이 있습니다. 한 번에 100장의 사진을 처리한다는 의미입니다.

 

2. max_iter

반복(이터레이션, iteration)은 몇 개의 배치(batch)를 사용할 것인지를 의미합니다. max_iter는 기계 학습(머신 러닝)의 학습(training) 과정에서 반복을 몇 번 할 것인지를 정해줍니다. cifar10 예제의 cifar10_full_solver.prototxt 파일에 max_iter: 60000 이라고 되어 있는데, batch_size:100 이기 때문에 학습을 한 번에 사진 100장씩 60,000번 하겠다는 말이 됩니다. 총 사진 6,000,000장으로 학습이 이루어질 것입니다. 이 과정에서 사진이 중복될 수 있는데, 그에 대해서는 아래의 세대(이폭, epoch) 에서 설명하겠습니다.

 

3. test_iter

학습을 했으면 실전에 사용해 보아야 합니다. 예제에서 역시 batch_size:100 으로 되어 있습니다. test_iter:100 으로 설정되어 있는데, 그 말은 한 번에 사진 100장 씩 100번, 총 10,000장의 사진으로 학습 결과를 검사해 보겠다는 뜻입니다.

 

4. epoch

학습용 사진 전체를 딱 한 번 사용했을 때 한 세대(이폭, epoch)이 지나갔다고 말합니다. cifar10의 경우 사진 60,000장 중 50,000장이 학습용, 10,000장이 검사용으로 지정되어 있습니다. 그런데 max_iter에서 학습에 사진 6,000,000장을 사용하기로 했기 때문에 50,000장의 학습용 사진이 여러번 재사용되게 됩니다. 정확히 계산해보면 6,000,000 / 50,000 = 120 이니 한 사진이 120번 씩 재사용될 것입니다. 이 경우 120 세대(epoch)라고 말합니다. 검사용의 경우 사진 10,000장을 사용하기로 했는데 실제로도 사진이 10,000장 있으니 딱 한 세대만 있는 것입니다.

 

( 도움을 얻은 곳: https://groups.google.com/forum/#!topic/caffe-users/mUIi42aKWHQ )

 

+ Recent posts