컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Monthly Archive
Sunday, December 31, 2006

XCOPY.EXE 프로그램/명령어 다운로드(Download) 받는 곳은? : 크로스 카피/엑스 카피

XCOPY 는 이미 도스나 윈도우에 있습니다. 따라서 별도로 다운받을 필요는 없습니다. GUI 프로그램이 아니라 "텍스트 모드" 프로그램/명령어입니다.

도스창(명령 프롬프트;CMD.EXE)을 연 후, 도스창 안에서 실행하면 됩니다. 예를 들어 xcopy /? 라고 하면 다음과 같은 도움말이 나옵니다:

D:\Z>xcopy /?
파일과 디렉터리 트리를 복사합니다.

XCOPY 원본 [대상] [/A | /M] [/D[:데이터]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                           [/EXCLUDE:파일1[+파일2][+파일3]...]

  원본         복사할 파일을 지정합니다.
  대상         새 파일의 디렉터리와 또는 파일 이름을 지정합니다.
  /A           보관 특성을 가진 파일을 복사하며, 보관 특성을 수정하지
               않습니다.
  /M           보관 특성을 가진 원본 파일을 복사하며, 보관 특성을
               지웁니다.
  /D:m-d-y     지정된 날짜 이후에 바뀐 파일만 복사합니다.
               날짜가 지정되지 않으면, 대상 파일보다 새로운 원본 파일만
               복사합니다.
  /EXCLUDE:파일1[+파일2][+파일3]...
               문자열을 포함하는 파일 목록을 지정합니다.
               일부 문자열이 복사할 파일의 절대 경로의 일부분과
               일치하면 복사할 파일에서 제외됩니다.
               예를 들면, \obj\ 또는 .obj에서는 obj 디렉터리 내의
               모든 파일을 제외하거나 .obj 확장자를 갖는 모든 파일을
               제외합니다.
  /P           각 대상 파일을 만들기 전에 물어봅니다.
  /S           비어 있지 않은 디렉터리와 하위 디렉터리를 복사합니다.
  /E           디렉터리와 하위 디렉터리를 (비어 있어도) 복사합니다.
               /S /E 스위치와 같으며, /T를 수정하는 데 사용될 수 있습니다.
  /V           각각의 새 파일을 확인합니다.
  /W           복사하기 전에, 아무 키나 누르라고 프롬프트합니다.
  /C           오류가 생겨도 복사를 계속합니다.
  /I           대상을 찾을 수 없고 두 파일 이상을 복사하면, 대상을 디렉터리로
               지정합니다.
  /Q           복사하는 동안 파일 이름을 표시하지 않습니다.
  /F           복사하는 동안 원본과 대상 파일의 전체 경로 를 표시합니다.
  /L           복사는 하지 않고, 복사할 파일을 표시만 합니다.
  /H           숨겨진 파일과 시스템 파일도 복사합니다.
  /R           읽기 전용 파일을 겹쳐 씁니다.
  /T           파일은 복사하지 않고 디렉터리 구조만 복사합니다. 빈 디렉터리와
               하위 디렉터리는 포함되지 않습니다. /T /E 스위치를 함께 사용하면
               빈 디렉터리와 하위 디렉터리를 포함합니다.
  /U           대상에 이미 있는 파일을 업데이트합니다.
  /K           특성을 복사합니다. 일반적으로 Xcopy는 읽기 전용 특성을 지웁니다.
  /N           만들어진 짧은 파일 이름을 사용하여 복사합니다.
  /O           파일 소유권과 ACL 정보를 복사합니다.
  /X           파일 감사 설정을 복사합니다(/O 의미).
  /Y           이미 있는 대상 파일을 덮어쓸지를 확인하기 위해
               묻는 것을 금합니다.
  /-Y          이미 있는 대상 파일을 덮어쓸지를 확인하기 위해
               묻습니다.
  /Z           다시 시작할 수 있는 모드에서 네트워크 파일을 복사합니다.

/Y 스위치가 COPYCMD 환경 변수에 나타날 수 있습니다.
명령줄에 있는 /-Y와 함께 무시될 수 있습니다.


D:\Z>



XCOPY 사용법은 여기에 있습니다: ▶▶ DOS/도스창/배치파일] 파일 복사 명령어 사용법: File Copy Command


XCOPY 란?


도스의 파일 복사 명령인 COPY 를 좀더 강력하게 만든 것이 XCOPY 입니다. 복사 속도도 빠르고, 숨김 파일이나 하위 디렉토리 등도 복사할 수 있습니다. 옛날 MS-DOS 나 최신 윈도우에도 XCOPY 가 있습니다.


XCOPY.EXE 파일 있는 곳 위치는?


C:\WINDOWS\system32 라는 폴더에 들어 있습니다.



☞ 윈도우(WINDOWS 2000/XP)

☞ BATCH(.BAT)/VBScript(.VBS)

풀다운 메뉴(Pull-down Menu)란? 엑셀/워드/포토샵 등의 프로그램에서

컴퓨터에서, "메뉴"라는 것은, "명령어 목록"을 사용하기 쉽게 모아 놓은 "도구 상자" 같은 곳입니다. 윈도우용의 프로그램에는 대부분 메뉴가 있습니다.

풀다운 메뉴라는 것은, 위에서 아래로 끌어 내려서 사용하는 메뉴란 뜻인데, 예를 들어, 아래 그림의 좌측 상단과 같은 것입니다:


맥스, 프리핸드 곡선 그리기 - 3dsmax Freehand MacroScript

풀 다운 메뉴 예제

위의 그림은 3dsmax 라는 프로그램을 실행한 후, "MAXScript" 라는 곳을 클릭하여 "풀다운 메뉴"를 아래로 펼친 상태입니다. 리스트가 나와 있는데 여기서 각 항목들을 마우스로 클릭하여 선택하면 됩니다. 엑셀 등의 다른 프로그램들도 마찬가지입니다.



말줄임표/말없음표(...)의 의미


끝에, 점 3개가 있는 메뉴 항목은, 그 항목을 클릭했을 때, "예/아니오" 등을 묻는 "대화상자"가 나온다는 뜻입니다.

점이 없는 항목은, 그 항목을 선택했을 때, 아무것도 묻지 않고, 그 항목에 해당되는 명령이 곧바로 실행되어 버린다는 뜻입니다.



마우스 없을 때, 풀다운 메뉴 꺼내기


키보드의 F10 키를 누른 후, 좌우 화살표 그리고 아래쪽 화살표 키를 누르면, 마우스 없이도 풀다운 메뉴를 사용할 수 있습니다.

Esc키를 누르면, 풀다운 메뉴가 다시 없어집니다.


☞ 윈도우(WINDOWS 2000/XP)

☞ 오피스/엑셀(Excel)/워드(Word)/VBA 매크로

C언어] 대소문자 구분 없이 문자열 배열 정렬/소트/소팅; Sort Ignore Case, String Array

영문이거나 영문이 섞인 문자열 배열을 qsort() 함수를 사용하여 ABC순으로 소트(Sort)할 때, 기본적으로 대소문자를 구분하여 소팅하기에 결과가 부자연스럽게 나옵니다. 대소문자 구분 없이 영문 문자열을 정렬하는 방법입니다.

영문 알파벳 대소문자 구분 없이, 문자 배열 소팅 예제


소스 파일명: 0.cpp
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
#include <stdio.h>
#include <stdlib.h> // qsort()
#include <string.h> // strcmp() stricmp()

int comparisonFunctionString(const void *a, const void *b);
int comparisonFunctionStringIgnoreCase(const void *a, const void *b);
int comparisonFunctionStringReverseIgnoreCase(const void *a, const void *b);


int main(void) {
  const int ELEMENTS = 5; // 요소 개수

  char array[ELEMENTS][3 + 1]
    = { "bbb", "AAA", "DDD", "CCC", "aaa" };




  // 대소문자 구분하여 정렬
  qsort((void *)array, ELEMENTS, sizeof(array[0]), comparisonFunctionString);

  for (int i = 0; i < ELEMENTS; i++)
    printf("%s\n", array[i]);

/*

AAA
CCC
DDD
aaa
bbb

*/



  puts(""); // 줄바꿈



  // 대소문자 구분 없이 정렬
  qsort((void *)array, ELEMENTS, sizeof(array[0]), comparisonFunctionStringIgnoreCase);

  for (int i = 0; i < ELEMENTS; i++)
    printf("%s\n", array[i]);

/*

aaa
AAA
bbb
CCC
DDD

*/



  puts(""); // 줄바꿈


  // 대소문자 구분 없이 내림차순 정렬
  qsort((void *)array, ELEMENTS, sizeof(array[0]), comparisonFunctionStringReverseIgnoreCase);

  for (int i = 0; i < ELEMENTS; i++)
    printf("%s\n", array[i]);

/*

DDD
CCC
bbb
AAA
aaa

*/

  return 0;
}




int comparisonFunctionString(const void *a, const void *b) {
  return( strcmp( (char *)a, (char *)b) );
}

int comparisonFunctionStringIgnoreCase(const void *a, const void *b) {
  return( stricmp( (char *)a, (char *)b) );
}

int comparisonFunctionStringReverseIgnoreCase(const void *a, const void *b) {
  return( stricmp( (char *)b, (char *)a) );
}



▶▶ C언어] 문자열 배열 정렬(소트;Sort)역순 소팅, qsort 함수 사용법

☞ C/C++ (VC++)

자바스크립트] 대소문자 구분 없이 문자열 배열 정렬/소트/소팅; JavaScript Sort Ignore Case, String Array

영문 문자열을 ABC순으로 정렬할 때, 기본적으로 대소문자를 구분하여 소팅하기에 결과가 부자연스럽게 나옵니다. 대소문자 구분 없이 영문 문자열을 정렬하는 방법입니다.

JavaScript: 영문 알파벳 대소문자 구분 없이 소팅 예제


<script type="text/javascript">

// 문자열 배열 선언과 초기화
var names = new Array( 'bbb', 'AAA', 'DDD', 'CCC', 'aaa' );



// 대소문자 구분하여 정렬
document.write(names.sort() + '<br />');
// 출력 결과: AAA,CCC,DDD,aaa,bbb



// 대소문자 구분 없이 정렬
document.write(names.sort(compStringIgnoreCase) + '<br />');
// 출력 결과: AAA,aaa,bbb,CCC,DDD



// 대소문자 구분 없이 내림차순 정렬
var s = names.sort(compStringIgnoreCase);
s.reverse();
document.write(s + '<br />');
// 출력 결과: DDD,CCC,bbb,aaa,AAA



// 대소문자 구분없이 정렬에, 내부적으로 필요한 비교 함수
function compStringIgnoreCase(a, b) {
  if (a.toLowerCase() < b.toLowerCase()) return -1;
  if (b.toLowerCase() < a.toLowerCase()) return 1;
  return 0;
}

</script>


비교 함수인 compStringIgnoreCase() 의 부등호를 반대로 하면, "대소문자 구분없이 역순 정렬"을 할 수 있긴 하지만, 그러면 aaa와 AAA 의 순서가 좀 이상하게 나오는 문제가 있기에, reverse() 로 뒤집어 주었습니다. reverse()를 사용하여 역순으로 만든다고 해도 속도가 느려지지는 않습니다.


▶▶ 자바스크립트] 문자열 배열, 가나다 순 정렬/내림차순 소팅; Sort String Array, JavaScript

☞ HTML/CSS/자바스크립트(JavaScript)

Java/자바] 문자열(String) 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, String Array

문자열(String) 배열을 Arrays.sort()를 사용하여 우선 오름차순으로 정렬한 후, reverseArrayString() 메소드(함수)로, 순서를 거꾸로 뒤집어 주면, 내림차순으로 정렬된 결과를 얻을 수 있습니다.

▶▶ Java/자바] 문자열 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, String Array <- 여기의 방법과 달리, 리스트로 변환하지 않고 직접 순서를 뒤집어 줍니다.


문자 배열 내림차순 정렬 예제


파일명: Foo.java
import java.util.*;

public class Foo {
  public static void main(String[] args) {

    String[] a = { "bbb", "AAA", "DDD", "똠방각하", "CCC", "aaa" };


    // 정렬
    Arrays.sort(a, String.CASE_INSENSITIVE_ORDER);


    // 배열 순서 거꾸로
    reverseArrayString(a);


    // 순서 뒤집어진 "문자열 배열"을 "문자열"로 변환 후 출력
    System.out.println(Arrays.toString(a));
    // 출력 결과: [똠방각하, DDD, CCC, bbb, aaa, AAA]
  }




  public static void reverseArrayString(String[] array) {
    String temp;

    for (int i = 0; i < array.length / 2; i++) {
      temp = array[i];
      array[i] = array[(array.length - 1) - i];
      array[(array.length - 1) - i] = temp;
    }
  }


}




☞ 자바(Java)

Java/자바] 숫자 정수(int) 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, int Array

int 배열을 Arrays.sort()를 사용하여 우선 오름차순으로 정렬한 후, reverseArrayInt() 메서드(함수)로, 순서를 거꾸로 뒤집어 주면, 내림차순으로 정렬된 결과를 얻을 수 있습니다.

정수 배열 내림차순 정렬 예제


파일명: Foo.java
import java.util.*;

public class Foo {
  public static void main(String[] args) {

    int[] i = { -1, 0, 299, 2, 956, 0, 9, -900 };

    // 정렬
    Arrays.sort(i);


    // 배열 순서 거꾸로
    reverseArrayInt(i);


    // 순서 뒤집어진 정수 배열을 문자열로 변환 후 출력
    System.out.println(Arrays.toString(i));
    // 출력 결과: [956, 299, 9, 2, 0, 0, -1, -900]
  }




  public static void reverseArrayInt(int[] array) {
    int temp;

    for (int i = 0; i < array.length / 2; i++) {
      temp = array[i];
      array[i] = array[(array.length - 1) - i];
      array[(array.length - 1) - i] = temp;
    }
  }


}



▶▶ 자바/Java] 문자열 숫자 배열, 정렬(소팅;소트) 예제; Sort

숫자 크기순 정렬 도구: ▶▶ 숫자 크기순 정렬 도구, 소트 소팅 툴; Numeric Sort Tool

Saturday, December 30, 2006

Java/자바] 문자열 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, String Array

자바로 소팅을 할 때에는 역순 즉 내림차순(Descending Order)으로 소팅하는 간단한 방법이, 제가 알아본 바로는 없었습니다.

물론, 오름차순으로 소팅한 후, 그 배열의 순서를 뒤집어주면 역순 정렬이 됩니다. 이 방법의 속도가 느린 줄 알았는데, 비교 함수를 사용하는 것보다 빠르다고 하더군요. 각 요소를 소트할 때마다 비교 함수를 호출하는 데에 시간이 많이 걸리지만, 배열 요소 순서를 단순히 뒤집어 주는 것에는 시간이 거의 걸리지 않기 때문일 것입니다.

그래서 뒤집어 주는 방법으로 예제를 만들었습니다.

문자 배열 내림차순 정렬(Sorting) 예제


파일명: Foo.java
import java.util.*;

public class Foo {
  public static void main(String[] args) {


    String[] a = { "bbb", "AAA", "DDD", "똠방각하", "CCC", "aaa" };

    Arrays.sort(a, String.CASE_INSENSITIVE_ORDER);


//////////////////////////////////////////////////
    // 배열을 리스트로 변환
    List<String> list = Arrays.asList(a);

    // 리스트 뒤집어 주기
    Collections.reverse(list);
//////////////////////////////////////////////////


    // 리스트를 배열로 다시 변환
    a = list.toArray(new String[list.size()]);


    // 순서 뒤집어진 배열을 문자열로 변환 후 출력
    String s = Arrays.toString(a);
    System.out.println(s);
    // 출력 결과: [똠방각하, DDD, CCC, bbb, aaa, AAA]

  }
}




리스트로 변환하지 않고 직접 뒤집기: ▶▶ Java/자바] 문자열(String) 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, String Array

▶▶ 자바/Java] 문자열 숫자 배열, 정렬(소팅;소트) 예제; Sort

☞ 자바(Java)

Java/자바] 대소문자 구분 없이 정렬, 문자열 배열 소팅; Sort Ignore Case, String Array

영문 문자열 배열을 소팅할 때에는 기본적으로 대소문자를 구분하기에, 부자연스러운 결과가 나오게 됩니다. 대소문자 구분없이 소팅하는 방법입니다.


영문 알파벳 문자 배열, 대소문자 구분 없이 소트 예제


파일명: Foo.java
import java.util.Arrays;

public class Foo {
  public static void main(String[] args) {


    String[] s = { "bbb", "AAA", "DDD", "CCC", "aaa" };


    // 대소문자 구분하여 정렬
    Arrays.sort(s);
    System.out.println(Arrays.toString(s));
    // 결과: [AAA, CCC, DDD, aaa, bbb]




    // 대소문자 구분 없이 정렬
    Arrays.sort(s, String.CASE_INSENSITIVE_ORDER);
    System.out.println(Arrays.toString(s));
    // 결과: [AAA, aaa, bbb, CCC, DDD]


  }
}


▶▶ 자바/Java] 문자열 숫자 배열, 정렬(소팅) 예제 - Sort

☞ 자바(Java)

Perl/펄] 대소문자 구분 없이 정렬, 문자열 배열 소팅; Sort Ignore Case, String Array

영문 문자열 배열을 소팅할 때에는 기본적으로 대소문자를 구분하기에, 부자연스러운 결과가 나오게 됩니다. 대소문자 구분없이 소팅하는 방법입니다.

문자열을 소문자로 바꾸는 lc() 함수를 사용하여 구현합니다.

영문 알파벳 문자 배열, 대소문자 구분 없이 소트 예제


#!/usr/bin/perl
use strict; use warnings;


my @a = ( "bbb", "AAA", "DDD", "CCC", "aaa" );


# 대소문자 구분하여 정렬
@a = sort @a;
print join(" ", @a);
# 배열 출력: AAA CCC DDD aaa bbb



print "\n"; # 줄바꿈



# 대소문자 구분 없이 정렬
@a = sort { lc($a) cmp lc($b) } @a;
print join(" ", @a);
# 배열 출력: AAA aaa bbb CCC DDD



print "\n"; # 줄바꿈



# 대소문자 구분 없이 내림차순(역순) 정렬
@a = reverse sort { lc($a) cmp lc($b) } @a;
print join(" ", @a);
# 배열 출력: DDD CCC bbb aaa AAA



▶▶ 펄/Perl] 문자열 배열 정렬(소팅), sort 함수 사용법: Sort String Array

☞ Perl(펄)

Python/파이썬] 대소문자 구분 없이 정렬; 문자열 리스트(List;배열;Array) 소팅(Sort; 소트)

영문 문자열 리스트를 정렬할 때에는 기본적으로, 대소문자를 구분하며 소팅합니다. 이러면 자연스럽게 소팅이 되지 않는데,

소트 메소드(함수)에 key=str.lower 라는 파라미터를 넣으면, 대소문자 구분 없이 자연스럽게 정렬할 수 있습니다. Python 2.4 버전부터 지원됩니다.


문자 리스트 영문 알파벳 대소문자 구분 없이 정렬 예제
파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-


a = [ "bbb", "AAA", "DDD", "CCC", "aaa" ]




# 대소문자 구분하여 소팅
a.sort()

print " ".join(a)
# 출력 결과: AAA CCC DDD aaa bbb




# 대소문자 구분 없이 소팅
a.sort(key=str.lower)

print " ".join(a)
# 출력 결과: AAA aaa bbb CCC DDD




▶▶ Python/파이썬] 문자열/숫자 리스트(List;배열;Array) 소팅(Sort; 소트,정렬)

☞ Python (파이썬)

Python/파이썬] 문자열/숫자 리스트(List;배열;Array) 소팅(Sort; 소트,정렬)

sort() 메소드(함수)로, 리스트를 정렬할 수 있습니다. 문자 리스트이든 숫자 리스트이든 같습니다.

문자열/숫자 리스트, 오름차순/내림차순 정렬 예제
파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-


####################################
# 문자열 리스트 정렬

who = [    "맹구",
         "배용준",
         "땡칠이",
         "장동건",
         "강수정",
         "송창식",
         "황당해",
         "고은아" ]


# 소팅하기 전
print "/".join(who)
# 출력 결과: 맹구/배용준/땡칠이/장동건/강수정/송창식/황당해/고은아


who.sort()


# 소팅한 후 (오름차순)
print "/".join(who)
# 출력 결과: 강수정/고은아/땡칠이/맹구/배용준/송창식/장동건/황당해



# 내림차순으로 소팅
who.sort(reverse=True)
print "/".join(who)
# 출력 결과: 황당해/장동건/송창식/배용준/맹구/땡칠이/고은아/강수정




####################################
# 숫자 리스트 정렬

num = [ 123, 2000, 999, -8, 0, 9, 12, -1000, 0 ]

# 소팅하기 전
print num
# 출력 결과: [123, 2000, 999, -8, 0, 9, 12, -1000, 0]


num.sort()


# 소팅한 후 (오름차순)
print num
# 출력 결과: [-1000, -8, 0, 0, 9, 12, 123, 999, 2000]



# 내림차순으로 소팅
num.sort(reverse=True)
print num
# 출력 결과: [2000, 999, 123, 12, 9, 0, 0, -8, -1000]




▶▶ Python/파이썬] 대소문자 구분 없이 정렬; 문자열 리스트(List;배열;Array) 소팅(Sort; 소트)

☞ Python (파이썬)

Java/자바] 35mm 카메라 렌즈 화각(FOV) 구하기, 초점 거리(Focal Length)계산[광학/물리/사진

35mm 필름을 사용하는 카메라의, 렌즈의 초점 거리를 지정해 주면, 그 렌즈의 대각선 화각(畵角; Field of View)을 구하고,

역으로, 대각선 화각을 넣어주면, 초점 거리를 계산하는 소스 코드입니다.

광각 렌즈인 경우에는 촬영 범위가 넓기에 당연히 화각이 크고, 망원 렌즈로 갈수록 화각이 좁습니다.

35mm 카메라의 표준 렌즈는 50mm 렌즈인데, 이 표준 렌즈의 화각은 46도 입니다. 즉 전방 46도 각도의 모든 것을 촬영하는 것입니다. 단, 대각선 방향으로 46도입니다.


사진 Lens 화각(FOV) 계산, 초점 거리 계산법 예제


파일명: Foo.java
public class Foo {
  public static void main(String[] args) {

    // 35mm 필름의 대각선 길이: 43.266615305567875
    double diagonalLength = Math.sqrt( Math.pow(36, 2) + Math.pow(24, 2) );

    // 렌즈 초점 거리 (표준 렌즈 : 50mm)
    double focalLength = 50;




    // 렌즈 화각 (FOV; Field of View = Angle of View) 구하기
    double fov = (2 * Math.atan(diagonalLength / (2 * focalLength))) * 180 / Math.PI;
    System.out.format("%.2f mm 렌즈의 대각선 화각은 %.2f 도입니다%n", focalLength, fov);


    // 화각으로 렌즈 초점 거리 구하기
    double focal = diagonalLength / (2 * Math.tan(Math.PI * fov / 360));
    System.out.format("대각선 화각이 %.2f 도인 렌즈의 초점 거리는 %.2f mm 입니다%n", fov, focal);


  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
50.00 mm 렌즈의 대각선 화각은 46.79 도입니다
대각선 화각이 46.79 도인 렌즈의 초점 거리는 50.00 mm 입니다

D:\Z>


double focalLength = 50;
소스의 이 부분을

double focalLength = 24;
이렇게 바꾸면,

D:\Z>javac Foo.java && java Foo
24.00 mm 렌즈의 대각선 화각은 84.06 도입니다
대각선 화각이 84.06 도인 렌즈의 초점 거리는 24.00 mm 입니다

D:\Z>

이런 결과가 나옵니다. 24mm 렌즈는 초광각에 가까운 매우 넓은 광각 렌즈입니다. (광각 렌즈 매니아들은 24mm 렌즈를 자신만의 표준 렌즈로 삼는 사람도 있더군요. 그렇지만 24mm 렌즈는 원근의 왜곡이 좀 심합니다.)



그리고 다음 방법으로, 필름이나 CMOS/CCD 의 대각선 길이를 구할 수 있습니다: ▶▶ Java/자바/수학] 사각형 대각선 길이 구하기, 직사각형/정사각형; Diagonal Length Rectangle



▶▶ 매스매티카 Mathematica, 렌즈 화각 FOV 계산; 광학 Field of View





Friday, December 29, 2006

Python/파이썬] ks_c_5601-1987, euc-kr; 소스 파일의 한글 인코딩 지정하는 방법

파이썬에서 "ks_c_5601-1987" 이나, "euc-kr" 등으로 "한글 완성형" 인코딩을 지정할 수도 있지만, 이때에는 "똠방각하"의 "똠"자 등이 표현되지 않고, SyntaxError: 'euc_kr' codec can't decode bytes in position 17-18: illegal multibyte sequence 이런 에러가 나게 됩니다.


"cp949" 또는 "949" 라는 인코딩을 지정하면, "한글 확장 완성형"을 쓸 수 있기에, "똠방각하" 등도 표기가 가능합니다.

다음 예제와 같습니다.

#!/usr/bin/python
# -*- coding: cp949 -*-


s = "ABC abc Abc 똠방각하"

print s
# 출력 결과: ABC abc Abc 똠방각하




실행 결과 화면:
D:\Z>0.py
ABC abc Abc 똠방각하

D:\Z>



더 자세한 설명은 여기에 있습니다: ▶▶ Python/파이썬] 한글 인코딩, 소스의 한글 확장 완성형 글자 표현; Korean Hangul Encoding

☞ Python (파이썬)

Python/파이썬] 문자 대소문자 변환, 영문 알파벳 대문자로 소문자로 변경; Uppercase Lowercase Capitalize

문자열의 알파벳의 대소문자를 변경하는 방법입니다. 파이썬에는 문자열의 첫글자만 대문자로 변경하는 capitalize() 메소드(함수)도 있습니다.

문자열 대소문자 변경 예제
#!/usr/bin/python
# -*- coding: cp949 -*-


# 원본 문자열
s = "ABC abc Abc"



# 모든 알파벳을 대문자로 변환
result = s.upper()
print result
# 출력 결과: ABC ABC ABC



# 모든 알파벳을 소문자로 변환
result = s.lower()
print result
# 출력 결과: abc abc abc



# 문자열의 맨 첫글자만 대문자로 변환
result = s.capitalize()
print result
# 출력 결과: Abc abc abc



# 변환된 문자열만 반환할 뿐, 문자열 자체가 변환되지는 않음
print s
# 출력 결과: ABC abc Abc
# 원본 그대로임



# 이렇게 하면 문자열 자체가 변환됩니다.
s = s.upper()
print s
# 출력 결과: ABC ABC ABC



☞ Python (파이썬)

C언어] __int64 자리수, unsigned __int64 / long long 숫자(정수) 표현 범위

__int64 라는 자료형은 "64비트 정수"입니다. 따라서 메모리를 8 바이트 차지합니다.

__int64 를 "long long" 으로 표현할 수도 있습니다.



__int64 의 최소값은: -9223372036854775808
(마이너스 구백이십이경삼천삼백칠십이조삼백육십팔억오천사백칠십칠만오천팔백팔)
입니다.

__int64 의 최대값은: 9223372036854775807
(구백이십이경삼천삼백칠십이조삼백육십팔억오천사백칠십칠만오천팔백칠)
입니다.



unsigned __int64 의 최대값은: 18446744073709551615
(천팔백사십사경육천칠백사십사조칠백삼십칠억구백오십오만천육백십오)
입니다. unsigned 형은 마이너스 값이 없기에 최소값은 0입니다.


즉, int64 는 어떤 경우이든 "경(京)" 단위의 숫자를 표현할 수 있습니다. "10000조(兆)"가, 1경입니다.


64비트 정수를 출력하는 법: ▶▶ C언어] 64비트 정수 __int64 사용법: 변수 선언, printf()로 출력

C 자료형 도표: ▶▶ C언어] 정수 실수 종류(자료형;데이터형), 최소값 최대값; char int float, Data Type Ranges

☞ C/C++ (VC++)

곱셈 방법/나눗셈 하는 법, 나누기 곱하기 계산 방법; Computer Divide

산수책에서는 "÷" 이런 기호로 나눗셈을 하고, "X" 이런 기호로 곱셈을 하지만, 컴퓨터에서는

슬래시(/) 기호로 나눗셈을 하고, 별표(*) 기호로 곱셈을 합니다.


예를 들어, "100 나누기 3"의 값을 계산할 때에는

100 ÷ 3 = 33.33333333
이 아니라

100 / 3 = 33.33333333
이렇게 표현합니다.
즉, 슬래쉬(/) 기호로 나눗셈을 합니다.



그리고 "100 곱하기 3"을 하려면

100 X 3 = 300
이렇게 하지 않고

100 * 3 = 300
이렇게 합니다.
즉, "별표/백설표(애스터리스크 기호)"로 곱셈을 합니다.



더 자세한 설명은 여기에 있습니다:
▶▶ 엑셀] 곱하기/나누기(곱셈/나눗셈) 방법, 윈도우 계산기와 엑셀(Excel)에서 사칙연산, Multiply / Divide

☞ 학습

Python/파이썬] 리스트 List 를 하나의 변수로 합치기, 변환; 문자열 배열 요소 병합(Merge) 방법

리스트(배열)의 각 요소들을 하나로 합치는 것은 join() 함수로 할 수 있습니다. 그냥 하나로 합칠 수도 있고, 각 엘레멘트 사이에 구분자를 넣어서 합칠 수도 있습니다.

사실상 리스트가 변수로 "변환"되는 것입니다.

문자열 리스트(List)를, 변수로 변환, 하나로 합치는 예제
food 라는 리스트의 내용들이, s 라는 변수로 합쳐집니다.
#!/usr/bin/python
# -*- coding: cp949 -*-


# 리스트(배열) 정의
food = [ "123", "자장면", "짬뽕", "탕수육", "물만두", "팔보채" ]



# 그냥 하나로 합치기
s = "".join(food)
print s
# 출력 결과: 123자장면짬뽕탕수육물만두팔보채


# 요소들 사이에 쉼표 넣기 (구분자는 콤마와 공백 1개)
s = ", ".join(food)
print s
# 출력 결과: 123, 자장면, 짬뽕, 탕수육, 물만두, 팔보채



▶▶ Python/파이썬] 리스트(배열)를 문자열로 합치기, 변환; Join List (Array)

☞ Python (파이썬)

HTML] 일본 웹페이지 소스 보기, 일본어 중국어 사이트 HTM 코드 뷰어 프로그램; Source Code Viewer

인터넷 익스플로러(IE)에서, 웹페이지의 HTML 코드를 보기 위해, "소스 보기"를 선택하면 "메모장"이 실행되는데,

한글 사이트일 경우에는 그럭저럭 잘 보이지만, 일본어/중국어 사이트는 글자가 깨집니다.

이때는 EmEditor 같은 전문적인 에디터를 "소스 보기" 프로그램으로 지정하면 외국어 글자가 잘 보입니다. 다음 그림은 윈도우2000에서 "EmEditor 프로 버전"으로 일본어(Shift-JIS 인코딩) 사이트의 HTML 소스 코드를 본 것입니다.

EmEditor: Japanese HTML Source View


EmEditor는 일본인이 만든 에디터이기에 일본어는 완벽히 지원하고, 한글, 중국어, 아랍어 등 전세계의 모든 언어들 또한 잘 지원합니다.

EmEditor 프로 버전을 설치할 때

* View Source by EmEditor on Internet Explorer
(인터넷 익스플로러의 "소스 보기"에서, 이엠에디터를 사용)

* Add EmEditor to Internet Explorer HTML editor list
(인터넷 익스플로러의 "HTML 편집기" 목록에 이엠에디터 추가)

라는 항목에 체크하면 됩니다. 기본으로 체크되어 있습니다.


그런 후 IE 브라우저를 실행하고

인터넷 익스플로러 메뉴: 도구 > 인터넷 옵션 > 프로그램 > HTML 편집기

에서 EmEditor 를 지정합니다. (이것은 소스 보기용이 아닌, "소스 편집 아이콘"을 눌렀을 때 실행할 에디터 지정입니다.)



이러면 이제, 일어/중문 웹페이지에서 마우스 우측 버튼을 눌러 "소스 보기"를 선택하면 이엠 에디터가 실행되며 외국어 글자가 잘 보입니다.

일본어의 경우 폰트를 'MS Mincho' 로
중문일 경우에는 MingLiU 로 지정하면 더 깨끗이 보입니다.



다른 종류의 에디터를 "소스 보기 프로그램"으로 지정하는 법: ▶▶ UltraEdit와 Vim을, IE용 '소스 보기' 프로그램으로 [레지스트리 편집] (울트라에디트)

☞ HTML/CSS/자바스크립트(JavaScript)

☞ 텍스트 에디터/문서 편집기 (Text Editor)

Thursday, December 28, 2006

자바스크립트] 문자열 치환, 문자 바꾸기 (대소문자 구분 없이); JavaScript String Replace

replace() 메소드(함수)를 사용하여, 문자열의 일부를 다른 문자열로 치환할 수 있습니다. 즉 "문자 바꾸기"를 할 수 있습니다.

펄 스타일의 정규식/정규표현식(Regular Expressions; Regex)을 지원합니다.

문자열 바꾸기 예제


<script type="text/javascript">

// 원본 문자열
var s = 'COOL COOL COOL';


// 첫번째 일치되는 문자열 OO 를 찾아서 ZZ 로 치환
var result = s.replace('OO', 'ZZ');
document.write(result + '<br />');
// 출력 결과: CZZL COOL COOL



// 대소문자 구분없이 (펄 스타일 정규식 사용)
var result = s.replace(/oo/i, 'ZZ');
document.write(result + '<br />');
// 출력 결과: CZZL COOL COOL



// 모든 문자열 치환 + 대소문자 구분없이 (펄 스타일 정규식 사용)
var result = s.replace(/oo/gi, 'ZZ');
document.write(result + '<br />');
// 출력 결과: CZZL CZZL CZZL

</script>



☞ HTML/CSS/자바스크립트(JavaScript)

☞ 정규식/정규표현식(Regex; Regular Expression)

Excel/엑셀 기초] 숫자, 나누기 곱하기 계산 함수는? 나눗셈 곱셈 구하기 방법; Divide Function

엑셀에서는 기본적으로, 슬래시(/) 기호로 나눗셈을 하고, 별표(*) 기호로 곱셈을 합니다. 엑셀뿐 아니라, 컴퓨터에서는 항상, 나누기 기호가 / 이고, 곱하기 기호가 * 입니다. 산수책과 달리 X 로 곱하기를 할 수는 없습니다.

예를 들어, "100 나누기 3"의 값을 계산하려면, 엑셀의 셀 안에

=100 / 3

이런 수식을 적고 엔터키를 치면, 답인 33.33333333 이 출력됩니다.


그리고 "100 곱하기 3"을 하려면

=100 * 3

이렇게 하면 답인 300 이 출력됩니다.



곱셈 함수


특정 범위의 숫자를 한꺼번에 곱할 때에는 PRODUCT 함수를 사용하여 곱셈을 합니다: ▶▶ Excel 엑셀] 지정 범위 곱하기 함수; PRODUCT 곱셈 방법


지정 구역 나누기


다음의 방법으로, 특정 범위의 숫자들을 모두 나눌 수 있습니다: ▶▶ Excel 엑셀] 지정 범위 나누기; 특정 범위 나눗셈 방법; Range Divide



포토샵] 바탕 레이어 투명으로 만들기; 백그라운드 레이어를 투명 레이어로 변환; Transparent Background Layer

레이어 팔레트 맨 밑의, Background 라는 이름의 이탤릭체로 된 레이어가 "바탕 레이어(기본 레이어/백그라운드 레이어)"입니다. JPG 파일 등을 포토샵으로 불러오면 항상 기본적으로 존재합니다.

"바탕 레이어(백그라운드 레이어)"를 투명으로 만들기 위해서는, 바탕 레이어의 "Background"라는 제목을 마우스로 더블클릭합니다.

그러면 "레이어 이름과 속성을 변경"할 수 있는 대화상자가 나옵니다. 기본값으로 Layer 0 이라고 새 이름이 정해져 있을 것입니다. "OK" 버튼을 누르면 바탕 레이어가 "Layer 0" 이라는 이름으로 변경됩니다. 물론 다른 이름을 지정해도 됩니다.

이제 키보드의 Ctrl+A키를 눌러, 바탕 레이어 전체를 선택합니다. (부분적으로 투명하게 하려면, 투명화시킬 부분을 올가미 툴로 선택합니다.) 그런 후 키보드의 Del 키를 눌러, 바탕 레이어를 지웁니다. 그런 후 Ctrl+D키를 눌러 셀렉션(개미 행진)을 삭제합니다.

또는 "지우개 툴"로 지울 수도 있습니다.

그러면 이제 바탕 레이어가 회색 체스판 같은 무늬로 변할 것입니다. 체스판 무늬가 "투명"의 표시입니다.


요약
기본 레이어인 백그라운드 레이어는 투명이 되지 않습니다. 그래서 백그라운드 레이어의 이름을 변경하여, 기본 레이어가 아닌 보통의 레이어(Regular Layer)로 변경해 주어야 투명화시킬 수 있습니다.



기본 레이어 순서 변경 방법 / 위쪽으로 위치 이동하기


바탕 레이어(기본 레이어)는 위치를 변경할 수 없습니다. 항상 맨 밑에 위치합니다. 그러나 앞서 설명한 방법대로, 바탕 레이어의 이름을 변경하여 "보통 레이어"로 만들어 주면, 마우스로 드래그하여 레이어의 위치를 상하로 옮길 수 있습니다.



▶▶ 포토샵으로 투명GIF, 투명PNG 만들기: 투명GIF/PNG란? : Transparent GIF

☞ 포토샵 (Adobe Photoshop)

윈도우용 wget.exe 사용법; 명령행 다운로드 프로그램; wget Command for MS-Windows

리눅스에는 wget 이라는 명령이 있습니다. 이것은 FlashGet 같은 "다운로드 전문 유틸리티"와 비슷한 것인데, 다만 GUI가 없고, 명령행 프로그램입니다. 즉, "텍스트 모드"입니다.

윈도우에서 wget 을 사용하려면 Cygwin(시그윈) 을 설치하면 됩니다. 그리고 시그윈 설치 화면의 패키지 선택에서 wget 이라는 항목에 체크해 주면 됩니다. (기본적으로는 wget이 설치되지 않더군요.)

그런 후 도스창(명령 프롬프트;CMD.EXE)에서

wget --help

라고 하면 도움말이 나옵니다. wget 뒤에, 다운로드받을 파일의 주소(URL)를 적어주면 됩니다.


윈도우에서 wget 명령 사용 예제


다음은
http://www.google.co.kr/intl/ko_kr/images/logo.gif
라는 주소에 있는 구글 로고 그래픽 파일을 wget 으로 다운로드받는 예제입니다.

D:\Z>wget http://www.google.co.kr/intl/ko_kr/images/logo.gif
--15:23:17--  http://www.google.co.kr/intl/ko_kr/images/logo.gif
           => `logo.gif'
Resolving www.google.co.kr... 66.102.7.147, 66.102.7.99, 66.102.7.104
Connecting to www.google.co.kr|66.102.7.147|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8,558 (8.4K) [image/gif]

100%[====================================>] 8,558         25.87K/s

15:23:19 (25.75 KB/s) - `logo.gif' saved [8558/8558]


D:\Z>wget -P 000 http://www.google.co.kr/intl/ko_kr/images/logo.gif
--15:23:46--  http://www.google.co.kr/intl/ko_kr/images/logo.gif
           => `000/logo.gif'
Resolving www.google.co.kr... 66.102.7.147, 66.102.7.99, 66.102.7.104
Connecting to www.google.co.kr|66.102.7.147|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8,558 (8.4K) [image/gif]

100%[====================================>] 8,558         24.65K/s

15:23:47 (24.59 KB/s) - `000/logo.gif' saved [8558/8558]


D:\Z>


2번 다운받았는데, 1번째는 logo.gif 란 파일을 그냥 "현재 디렉토리"에 저장했고, 2번째는 000 이라는 이름의 "하위 디렉토리"에 저장했습니다.

파일을 저장할 디렉토리(폴더)를 지정하려면

wget -P <저장할 디렉토리명> <파일 주소>

의 형식입니다. 소문자로 -p 라고 하면 안됩니다. 옵션은 대소문자 구분합니다.



wget 의 용도


어떤 파일들을 주기적으로 다운받아야 할 때가 있습니다. 반복 다운로드 작업은 "배치 파일(Batch File/.BAT)" 안에서 wget 을 사용하면 쉽게 자동화할 수 있습니다.


☞ 리눅스(Linux)/유닉스(Unix)/시그윈(Cygwin)

☞ BATCH(.BAT)/VBScript(.VBS)

C언어] return 0; return 1; return -1; 의 뜻 의미, 사용법 예제

return (리턴) 이라는 것은 함수가 아니라, C언어의 키워드(예약어)입니다. 현재의 함수를 종료시키고 그 함수를 호출했던 곳으로 되돌아가라는 뜻입니다. 단, 돌아가며 어떤 값을 가지고 갈 수 있습니다. 즉, 값을 반환하는 것입니다.

예를 들어 다음과 같은 소스가 있다고 할 때

파일명: 0.cpp
#include <stdio.h>

int foo(void);


int main(void) {

  printf("%d\n", foo());

  return 0;
}


int foo(void) {
  return 1234;
}


컴파일을 하고 실행하면
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
1234

D:\Z>

이렇게 1234 라는 값이 출력됩니다.

foo()라는 함수가, 자신을 호출한 printf() 함수에 1234 라는 값을 리턴했기 때문입니다. int foo... 라고 되어 있기에, 정수(int)만을 반환할 수 있습니다.

그리고 프로그램 본체인 main() 함수 역시 return 0; 를 사용하여 어딘가로 0 이라는 값을 돌려주고 있습니다. main() 함수의 return문은 "운영체제"로 값을 반환합니다. MS윈도우XP에서 위의 예제 프로그램을 실행했다면, 윈도우XP의 명령 프롬프트(cmd.exe)로 0이라는 값을 반환하는 것입니다.


왜 return 0; 이렇게 0 이라는 값을 반환했느냐 하면, "에러가 없이 정상적으로 프로그램이 종료되었다"는 뜻입니다.

만약 main() 에서 무슨 에러가 있었다면 0이 아닌 값, 예를 들어 1이나 2 또는 -1 등을 윈도우로 반환해야 합니다.

보통 함수에서는 그 함수가 하는 일에 따라서 리턴 값이 달라지지만, main() 함수에서는 되도록 위의 규칙에 맞게 반환값을 정해야 합니다.

그렇지 않으면, 그 프로그램을 배치 파일 (BATCH; .BAT) 등에서 사용할 때 문제가 생길 수 있습니다.

배치 파일 안에서는, 방금 실행한 프로그램이 성공적으로 종료되었는지 아닌지 판단하기 위해, 그 프로그램의 반환값을 사용합니다. 반환값이 0이면 그 프로그램이 성공적으로 종료되었다고 판단하고 그 다음 작업을 계속합니다. 0 이 아니면 에러가 있다는 뜻이니까, 에러에 대한 적절한 처리를 해야 합니다. (▶▶ [배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERRORLEVEL 참고)


여기에도 return문에 대한 설명이 있습니다: ▶▶ [C언어 기초] return 이란? 함수인가요? return 0; 의 의미는?



☞ C/C++ (VC++)

Java/자바/수학] 사각형 대각선 길이 구하기, 직사각형/정사각형; Diagonal Length Rectangle

"가로 길이 제곱 + 세로 길이 제곱"

의 제곱근을 구하면, 직사각형(Rectangle)의 대각선 길이가 구해집니다.


정사각형(Square)은, "한 변(Side)의 길이"에 "루트2"를 곱하면 됩니다.


직사각형, 정사각형 대각선 길이 계산 예제


파일명: Foo.java
public class Foo {
  public static void main(String[] args) {


    // 직사각형의 대각선 길이 구하기
    double width = 36;
    double height = 24;

    double diagonalLength = Math.sqrt( Math.pow(width, 2) + Math.pow(height, 2) );
    System.out.println(diagonalLength);
    // 출력 결과: 43.266615305567875




    // 정사각형의 대각선 길이 구하기
    double sideLength = 60;

    diagonalLength = sideLength * Math.sqrt(2);
    System.out.println(diagonalLength);
    // 출력 결과: 84.8528137423857


  }
}


width 는 가로 길이, height 는 세로 길이이고, diagonalLength 는 대각선 길이입니다.

Math.pow() 메소드(함수)로 제곱하고, Math.sqrt() 로 제곱근을 구합니다.

sideLength 는 정사각형 한 변의 길이입니다.


컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
43.266615305567875
84.8528137423857

D:\Z>



☞ 자바(Java)

☞ 학습

Wednesday, December 27, 2006

Linux/리눅스] 터미널 창 실행, 텍스트 모드 명령행 윈도우; Terminal, Text Mode

(우분투 리눅스 Ubuntu Linux 를 기준으로 설명)

그놈(Gnome) 데스크탑의 상단 메뉴에서

프로그램 > 보조 프로그램 > 터미널

을 선택하면, 다음과 같은 터미널 창이 뜹니다. 여기서 ls 등의 명령을 실행하면 됩니다.


리눅스: 우분투 그놈 터미널




터미널 창 종료/닫기 명령어는?


exit
이라는 명령으로 터미널 창을 닫을 수 있습니다.

참고: ▶▶ 리눅스] 시스템 종료/리부팅(다시 시작)/로그아웃 명령 - Linux Shutdown Log-out Command


☞ 리눅스(Linux)/유닉스(Unix)/시그윈(Cygwin)

VIM VI GVIM 일본어 지원, 빔 에디터 일어 인코딩 Shift-JIS 모드로 변경하는 방법; Japanese Encoding

한글 윈도우에 설치한 GVim 을, 일본어 Shift-JIS 모드로 변경하는 방법입니다.

현재 문서를 편집 중이라면, Esc키를 눌러, 명령어 모드로 빠져 나옵니다. 그런 후

:se enc=japan

위와 같이 입력하면 빔이 일본어 편집 모드가 됩니다. 그런데 이러면 일본식 한자들이 깨질 것입니다. 이때는

:se guifont=MS\ Mincho:h12

이렇게 해줍니다. 윈도우XP 등에는 "MS Mincho" 라는 일본어 명조체 폰트가 기본으로 설치되어 있는데, 그 폰트를 지정해 준 것입니다. 그리고 h12 라는 부분은 폰트 사이즈를 12 포인트로 지정한 것입니다. "\ " 라는 부분은, 폰트명의 공백(" ")을 표현한 것입니다. 이러면 빔에서 일본어가 잘 보입니다.


다음 화면과 같습니다:

Gvim 에디터: 일본어 인코딩

빔 에디터의 도움말까지도 모두 일본어 명조체 폰트로 나오고 있습니다. 원래 한글 '굴림체'와 'Fixedsys' 폰트로 나오던 것이었는데, 위의 명령으로 폰트와 인코딩이 변경되었습니다.


다시 한글 편집 모드, 즉 "한글 완성형" 인코딩으로 돌아오려면

:se enc=korea

위와 같은 명령을 주면 됩니다.


▶▶ VIM (GVim), UTF-8/한글완성형/일본어/영문 모드로 인코딩 전환하기




Q: GVIM 에디터에서, 클리어타입 글꼴인 '맑은 고딕' 지원은?


현재 윈도우용 GVIM 6.4에서, 맑은 고딕 같은 한글 클리어타입(ClearType) 폰트는 사용이 안되더군요-_-? 전통적인 트루타입 폰트와는 좀 다른 포맷이라서 그런 것 같기도 합니다.

☞ 텍스트 에디터/문서 편집기 (Text Editor)

도스(DOS)용 RAR 로 압축하기, 파일 압축 풀기; 텍스트 모드 압축

WinRAR 를 설치하면, 그 설치 폴더 안에 RAR.EXE 라는 도스용 RAR이 있습니다. 진짜 16비트 도스용이 아니라, 콘솔용입니다: ▶▶ RAR 도스 창(DOS)/명령프롬프트/텍스트 모드; WinRAR(윈라) 콘솔 버전; RAR.EXE

다음은, 도스창(명령 프롬프트;CMD.EXE)에서, 콘솔(텍스트 모드)용 RAR로 파일을 압축하고 푸는 방법입니다.


압축 하기


rar a test *.*
현재 디렉토리(폴더)의 모든 파일을, test.rar 이라는 파일로 압축하는 명령입니다.

그러면 다음과 같이 압축이 됩니다:
D:\Z>rar a test *.*

RAR 3.51   Copyright (c) 1993-2005 Alexander Roshal   7 Oct 2005
Shareware version         Type RAR -? for help

Evaluation copy. Please register.

Creating archive test.rar

Adding    0.bat                                                       OK
Adding    0.cpp                                                       OK
Adding    15698793.htm                                                OK
Adding    antivirus_v3_plus_neo_dos_freeware.png                      OK
Adding    Beatles, The - All My Loving.mp3                            OK
Adding    x.obj                                                       OK
Done

D:\Z>



rar a -r test *.*
하위 디렉토리의 파일들까지 모두 압축하기




압축 풀기


rar x test
test.rar 파일 속에 압축되어 있는 파일들을, 현재 디렉토리에 모두 푸는 명령입니다.

rar x test d:\y
현재 디렉토리가 아닌, D:\Y 라는 디렉토리에 푸는 방법입니다.





GUI 버전의 WinRAR 로 압축 풀기: ▶▶ [QnA] 윈라(WinRAR; 압축하기/압축 풀기 프로그램) 다운로드 받는 곳?

☞ 소프트웨어(Software)

Excel/엑셀] 숫자 천단위 쉼표(콤마) 넣기; Comma Number, Thousands Separator

엑셀의 셀에, 숫자를 기입하면, 쉼표 없이 그대로 표현됩니다. 천단위 즉 3자리마다 쉼표를 넣으려면 다음과 같이 합니다.

숫자가 들어 있는, 또는 숫자가 들어갈 셀을 선택합니다. 마우스로 시트를 긁어서 특정 영역을 선택할 수도 있고, Ctrl+A키를 누르면 시트 전체가 선택됩니다. A, B, C 등의 열을 클릭하면 특정 열에만 숫자 특성을 지정할 수 있습니다.

그런 후, 마우스 오른쪽 버튼을 눌러, 셀 서식이라는 항목을 선택합니다.


일반 숫자일 경우


"표시 형식"이라는 탭에서, 숫자를 선택합니다. 1000 단위 구분 기호(,) 사용 에 체크하고, "확인" 버튼을 누릅니다.


통화를 나타내는 숫자일 경우


그 숫자가 통화 즉 "돈"을 나타내는 숫자일 경우에는
"표시 형식"이라는 탭에서, 통화를 선택합니다. 그런 후 "확인" 버튼을 누릅니다.


그러면 이제 숫자에 콤마가 자동으로 찍힙니다.

예를 들어
-123456789
이런 숫자가

-123,456,789
또는
-\123,456,789
이런 식으로 표현됩니다.



☞ 오피스/엑셀(Excel)/워드(Word)/VBA 매크로

자바스크립트] 숫자 천단위 쉼표(콤마) 넣기; JavaScript Comma Number, Thousands Separator

자바스크립트에서, 숫자 천단위, 즉 3자리마다 쉼표를 찍는 방법입니다. 직접 숫자를 분해해서 콤마를 넣는 것은 복잡하기 때문에, 정규식을 사용했습니다. 자바스크립트에서도 펄 스타일의 정규식을 지원합니다.

소수점과, 플러스 마이너스 부호도 처리할 수 있습니다.

숫자 세 자리마다 콤마 찍기 함수 예제; Commify, Commafy


<script type="text/javascript">

var s = commify(-1234567890.123);
document.write(s + '<br />');
// 출력 결과: -1,234,567,890.123


function commify(n) {
  var reg = /(^[+-]?\d+)(\d{3})/;   // 정규식
  n += '';                          // 숫자를 문자열로 변환

  while (reg.test(n))
    n = n.replace(reg, '$1' + ',' + '$2');

  return n;
}

</script>


정규식 설명:

숫자의 끝부분부터 매치시키며, 루프 속에서 숫자의 좌측으로 즉 앞쪽으로 이동합니다.

이미 쉼표화가 된 부분이나, 소수부는 (^[+-]?\d+)(\d{3}) 이런 정규식으로 매치되지 않기에, 점점 앞쪽으로 이동하게 됩니다.

$1 은 앞쪽 소괄호가 매치되는 내용
$2 는 뒤쪽 소괄호가 매치되는 내용이기에 그 사이에 쉼표(,)를 넣어주고 치환합니다.


그리고
while (reg.test(n))
이 부분은 정규식이 매치되는 동안 계속 루프를 돌리라는 뜻입니다. test() 메소드(METHOD; 함수)는, 문자열 안에서 정규식(Pattern)이 매치되는지 아닌지 테스트합니다. 매치되면 true, 아니면 false 를 반환합니다.



자바스크립트로 숫자 천단위마다 쉼표를 넣는 소스는 많이 있는데, 소수점이나 플러스/마이너스 부호를 처리하지 못하는 문제가 있어서, 실제 사용에는 무리가 있었습니다. 그래서 위와 같은 함수를 만들어 보았습니다.


☞ HTML/CSS/자바스크립트(JavaScript)

☞ 정규식/정규표현식(Regex; Regular Expression)

Python/파이썬] 숫자 천단위 쉼표(콤마) 넣기; Thousands Separator, Comma Number

setlocale()로 로케일을 지정해 준 후, locale.format() 함수로 숫자에 3자리마다 쉼표를 찍을 수 있습니다.

소수점과, 플러스 마이너스 부호도 처리할 수 있습니다.

숫자 세 자리마다 콤마 찍기 예제; Commify/Commafy
파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import locale

locale.setlocale(locale.LC_ALL, '')  # 시스템 기본 로케일 사용




n = -1234567890.123

s = locale.format('%.3f', n, 1)

print s

# 출력 결과: -1,234,567,890.123


locale.format('%.3f', n, 1)

"%.3f" 이 부분은 C언어의 printf 함수의 그것과 같은 "포맷 지정자"입니다. 현재 소수점 3자리까지 나옵니다. 소수점 2자리까지 나오게 하려면 "%.2f" 이렇게 하면 됩니다.

끝에 반드시 숫자 1 을 넣어주어야 콤마가 찍힙니다. 1이라는 것은 참(true)이라는 뜻입니다. 여기서는 콤마를 찍는 것이 "참"입니다.


☞ Python (파이썬)

Tuesday, December 26, 2006

메모리 용량, 사용한 사용량, 남은 용량 보기; Free Memory Windows

윈도우2000/XP에서는 다음과 같은 "작업 관리자"로 메모리 사용량 등을 볼 수 있습니다.

윈도우 2000의 작업 관리자 (Task Manager)

작업 관리자(Task Manager)로 메모리 용량 보기 클릭하면 확대


작업 관리자로 메모리 용량을 보는 법은 여기에 있습니다: ▶▶ 윈도우(Windows)의, 메모리 사용량 보기 - Memory Usage Information


작업 관리자를 실행하는 법: ▶▶ [QnA] 윈도우 작업 관리자란? / 현재 실행되는 프로세스와 CPU 사용량 보기 - Task Manager


☞ 윈도우(WINDOWS 2000/XP)

도스(DOS, CMD)창, 영문 Code Page (코드 페이지)로 변경하는 명령어: CHCP

한글 윈도우의 도스창(명령 프롬프트;CMD.EXE)은 기본적으로 한글 코드 페이지로 나옵니다.

chcp 라는 명령을 사용하면, 영문 모드로 바꿀 수 있습니다.


* 영문 모드로 변경: chcp 437

* 한글 모드로 변경: chcp 949

위와 같이 하면, 아래 화면처럼, 도스의 도움말 등이 모두 영문으로 나옵니다.

D:\Z>rem /?
일괄 파일 또는 CONFIG.SYS에서 주석을 기록합니다.

REM [주석]

D:\Z>chcp 437

Active code page: 437

D:\Z>

D:\Z>rem /?
Records comments (remarks) in a batch file or CONFIG.SYS.

REM [comment]

D:\Z>

D:\Z>chcp 949

활성 코드 페이지: 949

D:\Z>




☞ BATCH(.BAT)/VBScript(.VBS)

☞ 윈도우(WINDOWS)

Linux/리눅스] 남은 메모리 용량, 사용량 보기 명령어; Free-Usage Memory Command

리눅스에서는 "free" 라는 명령으로, "현재 남은 메모리" "사용한 메모리"의 양을 볼 수 있습니다.

그냥 free 라고 하면 알아보기 힘들게 나오기 때문에, "-m" 옵션을 붙여서 "free -m" 이라고 하는 것이 좋습니다. 이러면 MB (메가 바이트) 단위로 출력됩니다.

리눅스 메모리 보기 명령: free 사용법


(우분투 리눅스 Ubuntu Linux 의 터미널에서)
captain@captain-desktop:~$ free -m
             total       used       free     shared    buffers     cached
Mem:           250        227         22          0         14         94
-/+ buffers/cache:        118        131
Swap:          368         18        350
captain@captain-desktop:~$

위의 화면에서는

전체 메모리(total)가 250 메가이고
사용한 메모리가(used) 227 메가이고
남은 메모리, 즉 사용 가능한 메모리(free)가 22 메가로 나오고 있습니다.


만약 free 라는 명령어가 없고 command not found (그런 명령어가 없습니다) 에러가 난다면, 대신 mem 이라는 명령을 입력해 보면 됩니다.

☞ 리눅스(Linux)/유닉스(Unix)/시그윈(Cygwin)

RAR 도스 창(DOS)/명령프롬프트/텍스트 모드; WinRAR(윈라) 콘솔 버전; RAR.EXE

GUI 버전인 WinRAR 를 설치하면, 그 안에, 도스용인 Rar.exe 도 같이 들어 있습니다. 진짜 16비트 MS-DOS 용 프로그램이 아니고, "32비트 윈도우 콘솔" 프로그램입니다.

예를 들어 WinRAR(윈라)를 "C:\Program Files\WinRAR" 이런 폴더에 설치했다면, 그 폴더 안에 Rar.exe 라는 파일이 들어 있습니다. ("확장자"를 보이게 해야 잘 찾을 수 있습니다: ▶▶ '확장자'란? 파일의 확장자를 보이게 하자 참고)

Rar.exe 라는 파일을, 패스(Path)가 걸린 폴더(디렉토리)에 복사해야 합니다.

도스창(명령 프롬프트;CMD.EXE)에서

path

라는 명령을 치면, 패스가 걸린 폴더들의 목록이 나옵니다.



이제 윈도우의 도스창(명령 프롬프트)에서 rar 이라고 치면 다음과 같이 도스용 RAR 이 실행됩니다. 도스용 RAR의 도움말 화면입니다:
D:\Z>rar

RAR 3.51   Copyright (c) 1993-2005 Alexander Roshal   7 Oct 2005
Shareware version         Type RAR -? for help

Usage:     rar <command> -<switch 1> -<switch N> <archive> <files...>
               <@listfiles...> <path_to_extract\>

<Commands>
  a             Add files to archive
  c             Add archive comment
  cf            Add files comment
  cw            Write archive comment to file
  d             Delete files from archive
  e             Extract files to current directory
  f             Freshen files in archive
  i[par]=<str>  Find string in archives
  k             Lock archive
  l[t,b]        List archive [technical, bare]
  m[f]          Move to archive [files only]
  p             Print file to stdout
  r             Repair archive
  rc            Reconstruct missing volumes
  rn            Rename archived files
  rr[N]         Add data recovery record
  rv[N]         Create recovery volumes
  s[name|-]     Convert archive to or from SFX
  t             Test archive files
  u             Update files in archive
  v[t,b]        Verbosely list archive [technical,bare]
  x             Extract files with full path

<Switches>
  -             Stop switches scanning
  ac            Clear Archive attribute after compression or extraction
  ad            Append archive name to destination path
  ag[format]    Generate archive name using the current date
  ao            Add files with Archive attribute set
  ap<path>      Set path inside archive
  as            Synchronize archive contents
  av            Put authenticity verification (registered versions only)
  av-           Disable authenticity verification check
  c-            Disable comments show
  cfg-          Disable read configuration
  cl            Convert names to lower case
  cu            Convert names to upper case
  df            Delete files after archiving
  dh            Open shared files
  ds            Disable name sort for solid archive
  e[+]<attr>    Set file exclude and include attributes
  ed            Do not add empty directories
  en            Do not put 'end of archive' block
  ep            Exclude paths from names
  ep1           Exclude base directory from names
  ep2           Expand paths to full
  ep3           Expand paths to full including the drive letter
  f             Freshen files
  hp[password]  Encrypt both file data and headers
  id[c,d,p,q]   Disable messages
  ieml[addr]    Send archive by email
  ierr          Send all messages to stderr
  ilog[name]    Log errors to file (registered versions only)
  inul          Disable all messages
  ioff          Turn PC off after completing an operation
  isnd          Enable sound
  k             Lock archive
  kb            Keep broken extracted files
  m<0..5>       Set compression level (0-store...3-default...5-maximal)
  mc<par>       Set advanced compression parameters
  md<size>      Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)
  ms[ext;ext]   Specify file types to store
  n<file>       Include only specified file
  n@            Read file names to include from stdin
  n@<list>      Include files in specified list file
  o+            Overwrite existing files
  o-            Do not overwrite existing files
  oc            Set NTFS Compressed attribute
  os            Save NTFS streams
  ow            Save or restore file owner and group
  p[password]   Set password
  p-            Do not query password
  r             Recurse subdirectories
  r0            Recurse subdirectories for wildcard names only
  ri<P>[:<S>]   Set priority (0-default,1-min..15-max) and sleep time in ms
  rr[N]         Add data recovery record
  rv[N]         Create recovery volumes
  s[<N>,v[-],e] Create solid archive
  s-            Disable solid archiving
  sfx[name]     Create SFX archive
  si[name]      Read data from standard input (stdin)
  t             Test files after archiving
  ta<date>      Process files modified after <date> in YYYYMMDDHHMMSS format
  tb<date>      Process files modified before <date> in YYYYMMDDHHMMSS format
  tk            Keep original archive time
  tl            Set archive time to latest file
  tn<time>      Process files newer than <time>
  to<time>      Process files older than <time>
  ts<m,c,a>[N]  Save or restore file time (modification, creation, access)
  u             Update files
  v             Create volumes with size autodetection or list all volumes
  v<size>[k,b]  Create volumes with size=<size>*1000 [*1024, *1]
  vd            Erase disk contents before creating volume
  ver[n]        File version control
  vn            Use the old style volume naming scheme
  vp            Pause before each volume
  w<path>       Assign work directory
  x<file>       Exclude specified file
  x@            Read file names to exclude from stdin
  x@<list>      Exclude files in specified list file
  y             Assume Yes on all queries
  z<file>       Read archive comment from file

D:\Z>


텍스트 모드용 RAR은 좀 전문적인 목적에서 사용됩니다. 배치 파일 안에서, 파일을 자동으로 압축/백업한다든지 하는 용도입니다.


도스용 RAR로 파일 압축/압축 푸는 명령어: ▶▶ 도스(DOS)용 RAR 로 압축하기, 파일 압축 풀기; 텍스트 모드 압축

▶▶ [QnA] 윈라(WinRAR; 압축하기/압축 풀기 프로그램) 다운로드 받는 곳?

도스에서 ZIP 압축하기: ▶▶ 도스용 ZIP 프로그램; DOS윈집 다운로드,사용법; WinZip Command Line Support Add-On


☞ 소프트웨어(Software)

RAR 파일 압축 풀기 열기, rar 푸는 프로그램, 윈라 파일 읽는 법; RAR Extract

".rar" 이라는 확장자를 가진 파일은, WinRAR (윈라) 라는 프로그램을 사용하여 압축한 파일입니다. 따라서 WinRAR 프로그램으로, 압축을 풀 수도 있습니다.


우선 WinRAR 프로그램을 다운받아서, 설치해야 합니다. 윈도우에 기본으로 설치되어 있지는 않습니다: ▶▶ [QnA] 윈라(WinRAR; 압축하기/압축 풀기 프로그램) 다운로드 받는 곳?


윈라는 윈도우 탐색기 (Windows Explorer)처럼 되어 있기에 사용법은 쉽습니다. ("한글판 윈라"도 있습니다.)


RAR 파일 열기 + 압축 풀기


윈라를 실행한 후, 윈라 안에서 ".rar" 파일을 클릭하면, 다음 그림처럼 ".rar" 파일 속에 압축되어 있는 파일들이 보입니다.

WinRAR (윈라)


maps.rar 이라는 어떤 압축 파일 속을 들여다 본 화면입니다.

위의 그림에서, 빨간 화살표가 가리키고 있는 Extract To (~폴더에 풀기) 아이콘을 클릭하면,

파란 화살표가 가리키고 있는 대화상자가 나옵니다.

예를 들어, "새 폴더"라는 이름의 폴더에, 파일들을 풀어 내려면, 그림 맨 우측 하단의 녹색 화살표가 가리키는 폴더를 클릭하여 지정해 주고, "확인" 버튼을 누르면 하드에 자동으로 풀립니다.


만약 모든 파일이 아닌, rar 파일 속의 특정 파일만 하드에 풀기 위해서는, 그 특정 파일들을 선택해 준 후, Extract To 아이콘을 클릭하면 됩니다. (Shift키를 누르면서, "상하 화살표 키"를 누르면 파일들이 선택됩니다. Ctrl+A키를 누르면 모든 파일이 선택됩니다.)

어떤 파일 하나를 클릭하여 선택했다면, 그 파일 1개만 풀리게 됩니다.

위의 그림의 경우에는, "*.TGA" 라는 그림 파일들이 선택되어 있는 상태입니다. 따라서 이 경우, TGA 라는 확장자를 가진 파일들만 풀리게 됩니다.



압축하기 방법: ▶▶ 윈라로 압축하기 방법; WinRAR 로 파일 압축하는 법; Add File

배치파일] 엔터 키/줄바꿈/개행문자 넣기; Batch File Enter Key

배치 파일에서는 echo문을 사용하여, 화면에 문자열을 출력합니다. 그리고 끝에는 줄바꿈 문자가 자동으로 붙어서 다음줄로 행갈이가 됩니다.

그렇지만 빈 줄을 넣을 수는 없을 것입니다. 즉 엔터키만 쳐지지는 않습니다.

이때는

echo.

이렇게 하면 "빈 줄"이 1줄 생깁니다. 즉, 문자열 출력 없이, 엔터키만 칠 수 있는 것입니다.

echo. 은, echo 바로 뒤에 마침표(.)를 하나 찍은 것입니다. echo와 점(.) 사이에 공백이 있으면 안됩니다.


자세한 설명은 여기에 있습니다: ▶▶ [배치 파일 팁] echo문 행갈이 / 빈 줄 넣기/ 한 줄 띄어쓰기: Batch File Tip

☞ BATCH(.BAT)/VBScript(.VBS)

개행 문자(줄바꿈 문자)의 아스키 코드; ASCII Code of Newline-CR-LF

개행문자는 여러 종류가 있습니다. 개행문자의 16진수 아스키 코드는 다음과 같습니다:

* 도스 텍스트 개행문자: 0D 0A (십진수로는 13 10)

* 유닉스 텍스트 개행문자: 0A (십진수로는 10)

* 맥(MAC) 텍스트 개행문자: 0D (십진수로는 13)


도스 텍스트의 개행문자는 2바이트입니다. 즉, 16진수로 "0D 0A" 라는 2글자의 코드로 줄바꿈이 됩니다.

16진수(헥사;Hex) 0D 를, CR (Carriage Return; 캐리지 리턴) 이라고 합니다.

16진수(헥사;Hex) 0A 를, LF(Line Feed; 라인 피드) 라고 합니다.



C계열의 언어에서는 "\n" 이라는 이스케이프 시퀀스로 개행문자(줄바꿈 문자)를 표현합니다: ▶▶ C언어 Perl 자바] 줄바꿈/개행문자/행갈이문자/Newline: \n 이란?

비주얼 베이직에서는 Chr(13) 이라는 함수로 개행문자를 표현합니다: ▶▶ VBScript/비베] MsgBox 줄바꿈(행갈이) 방법, 멀티라인 메시지: Visual Basic, VBA

엑셀에서는 핫키를 사용합니다: ▶▶ 엑셀 팁] 줄바꿈/개행문자/엔터(Enter)키 치기, 셀 안에서; MS Excel Newline



☞ 줄바꿈(개행 문자)

Monday, December 25, 2006

Perl/펄] perl -e 옵션 사용법; 펄 인라인 계산기 스위치; -e (One Line Program Option, Switch)

Perl 에 -e 라는 옵션(스위치)을 붙이면, 펄을 "즉석 계산기"로 사용할 수 있습니다. 즉 파일 속에 코드를 작성할 필요없이, 코맨드 라인에서 계산을 하든지 할 수 있습니다. "1줄짜리 프로그램"을 작성할 수 있는 것입니다.


윈도우용 펄에서


MS윈도우에 액티브펄(ActivePerl)을 설치한 경우입니다.

다음과 같이 코드에 큰따옴표(쌍따옴표)를 붙여주면 됩니다. 작은따옴표(홑따옴표)를 붙이면, Can't find string terminator "'" anywhere before EOF at -e line 1. 이런 에러가 납니다.
D:\Z>perl -e "print 1+1"
2
D:\Z>



우분투 리눅스의 펄에서


다음과 같이 작은따옴표(홑따옴표)로 수식을 둘러싸면 됩니다. 윈도우CMD와 달리, bash 셀이 자동으로 줄바꿈을 해주지 않습니다. 그래서 "\n" 이렇게 줄바꿈 코드를 넣었습니다. 바깥쪽의 작은따옴표와 중복되지 않도록 큰따옴표를 사용합니다.
captain@captain-desktop:~$ perl -e 'print 1+1, "\n"'
2
captain@captain-desktop:~$

펄은 작은따옴표 속의 구문은 "문자 그대로" 해석하기 때문에, '\n' 이렇게 작은따옴표를 사용하면 줄바꿈이 되지 않습니다.


아무튼, perl -e 옵션은, 운영체제의 종류에 따라서 다른 따옴표를 사용해야 합니다.


▶▶ [Perl/펄] 스크립트 언어인 펄(perl)을, 간단한 계산기로 사용하기

☞ Perl(펄)

☞ 리눅스(Linux)/유닉스(Unix)/시그윈(Cygwin)

포토샵] 사진 날카롭게; 흐릿하게; 초점 흐린 이미지 만들기 필터; Photoshop Sharpen Blur Filter

Sharpen 필터를 이용하여 사진의 초점을 날카롭게 즉 선명하게 만드는 방법입니다. 초점이 약간 빗나간 사진에만 해당되고 너무 많이 흐려진 사진을 선명하게 만들 수는 없습니다. ▶▶ 포토샵] 사진 선명하게 만드는 샤픈/샤펀 필터 사용법: Photoshop Sharpen Filter
스캐너로 스캔한 사진을 선명하게 리터치할 때도 적합합니다.



이미지의 초점 흐릿하게/부드럽게 만들기


포토샵의 블러 필터를 이용하여, 사진 초점을 흐리게 또는 부드럽게 만드는 방법입니다: ▶▶ 포토샵] 사진 초점 흐리게 만들기 - Gaussian Blur - Photoshop


사진의 바깥쪽 부분만 흐릿하게 만드는 방법입니다: ▶▶ 포토샵] 사진 바깥쪽 배경, 뿌옇게 흐리게 만들기; 안개 낀 듯한 효과 - Photoshop: Foggy Edge Effect


☞ 포토샵 (Adobe Photoshop)

HTML-CSS] 줄간격 지정, 줄 간격 조정(확대/축소) 하기; Line Height Attribute

줄 간격은 line-height 라는 CSS 속성을 사용하여 조정합니다. em 단위로 줄 간격을 지정해 주면 편리합니다. em 이라는 것은 글자 1개의 높이입니다. 또는 px 즉 픽셀 단위로 지정해 주어도 됩니다.


CSS로, HTML 웹페이지의 줄간격 늘이기 예제


<div style="line-height:2.3em">
버스 종점이 있을 비탈길을 나는 천천히 오르고 있다. 여기서 몇백 미터쯤 떨어진 곳에 유명한 관광지가 있고 그래서, 저 일상의 응달진 담벽에서조차도 관광지의 흥청거림이 어쩐지 암묵적으로 전해져 왔다. 그 흥청거림이란 예를 들어 전자기장과도 같아서, 눈에 보이지 않았지만 어디까지나 실재하고 있었다. 다만 이 부근에서는 그 관광지의 실체가 조금도 보이지 않았다.

<br /><br />

비탈이 드리우는 그늘 속의 길을 가파르게 올라가고 있지만 나는 추위도 더위도 느끼지 않고 있으며 아주 쾌적했다. 길가의 아파트 건물들이 하얀 가로수처럼 여겨지고 있다. 아파트 건물이 비탈길에 드리우는 차가운 그림자 속으로, 나는 걸어 올라가고 있다. 그림자의 차가움은 어쩐지 후각이나 미각의 차원으로 다가왔다. 즉 향미를 느꼈다. 이곳의 공기가 맑기 때문일지도 모르겠다. 또는 이곳이, 내가 사는 곳으로부터 최대한 멀리 떨어진 곳이고 그래서 나는 삶으로부터 조금 해방되었고 그 해방감이 향미의 형식으로서 다가왔는지도 모를 일이다.
</div>


줄 간격은 보통 1.1em 정도가 기본값입니다. 정수가 아닌 실수형 즉 소수점이 허용됩니다.




이것은 웹페이지 본문 전체에 줄간격을 지정하는 방법입니다:
<html>
<head>
<style type="text/css">

body { line-height:1.3em }

</style>
</head>


<body>

본문 내용...<br />
본문 내용...<br />
본문 내용...<br />

</body>
</html>



글자 간격 조정법:▶▶ HTML CSS 글자 간격 조정 방법, 문자 간격 확대 축소 태그? letter-spacing

C언어] 파일 타임 스탬프, 파일 날짜 시간 구하기 함수; File Time Stamp, Last Write Date

각 파일에는 "날짜/시간(Time of last modification of file)"이 있습니다. 타임 스탬프라고 하는데 그 날짜/시간을 구하는 방법입니다. 또한 타임 스탬프에는 다음과 같은 3종류가 있습니다:

* 만든 날짜 (Time of creation of file)

* 수정한 날짜 (Time of last modification of file)

* 액세스한 날짜 (Time of last access of file)


위의 3가지를 모두 구합니다.


VC++: '파일 처음 만든' '마지막 기록한' '마지막으로 접근한' 날짜/시간 구하기 예제


파일명: 0.cpp
#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
#include <errno.h>

char* timeToString(struct tm *t);


int main(void) {
  struct _stat buf;
  char* filename = "Beatles, The - All My Loving.mp3";


  if ( _stat(filename, &buf) != 0 ) {
    switch (errno) {
      case ENOENT:
        fprintf(stderr, "File %s not found.\n", filename); break;
      case EINVAL:
        fprintf(stderr, "Invalid parameter to _stat.\n"); break;
      default:
        fprintf(stderr, "Unexpected error in _stat.\n");
    }
  }
  else {
    printf("%s\n", filename);
    printf( "\tTime Creation     : %s\n", timeToString(localtime(&buf.st_ctime)) );
    printf( "\tTime Last Written : %s\n", timeToString(localtime(&buf.st_mtime)) );
    printf( "\tTime Last Access  : %s\n", timeToString(localtime(&buf.st_atime)) );
  }


}




char* timeToString(struct tm *t) {
  static char s[20];

  sprintf(s, "%04d-%02d-%02d %02d:%02d:%02d",
              t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
              t->tm_hour, t->tm_min, t->tm_sec
          );

  return s;
}



컴파일 및 실행 결과 화면:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
Beatles, The - All My Loving.mp3
        Time Creation     : 2006-11-15 15:02:55
        Time Last Written : 2006-12-24 12:12:42
        Time Last Access  : 2006-12-25 12:01:23

D:\Z>


위의 경우 "Beatles, The - All My Loving.mp3"라는 파일의 타임 스탬프를 출력했습니다.



파일 날짜가 아닌, 시스템 날짜 구하기: ▶▶ C언어] 현재 날짜 시간, 년월일 시분초 로 출력 함수; Time To String Function VC++


파일 속성: ▶▶ C언어-VC] 파일 속성(읽기전용/히든 속성 등) 출력; Print File Attributes: ARHS


DIR 명령 구현 소스: ▶▶ C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원

C언어] 현재 날짜 시간, 년월일 시분초 로 출력 함수; Time To String Function VC++

여기서 소개하는 char* timeToString(struct tm *t) 이라는 함수는, 현재 시각을
2006-12-25 11:11:41
이런 형식으로 간단히 출력하는 함수입니다. 가장 실용적인 날짜/시간 포맷입니다. 한국에서 통용되는 "한국식 날짜/시간 포맷"이기도 하고, 그리고 ISO 표준 시간 포맷이라고 알고 있습니다.


한국식 날짜 시간 출력 함수 예제


파일명: 0.cpp
#include <stdio.h>
#include <time.h>

char* timeToString(struct tm *t);


int main(void) {
  struct tm *t;
  time_t timer;

  timer = time(NULL);    // 현재 시각을 초 단위로 얻기
  t = localtime(&timer); // 초 단위의 시간을 분리하여 구조체에 넣기

  printf("%s\n", timeToString(t));

  return 0;
}




char* timeToString(struct tm *t) {
  static char s[20];

  sprintf(s, "%04d-%02d-%02d %02d:%02d:%02d",
              t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
              t->tm_hour, t->tm_min, t->tm_sec
          );

  return s;
}



컴파일 및 실행 결과 화면:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
2006-12-25 11:11:41

D:\Z>


비주얼C 2005 이상의 버전에 최적화된 소스: ▶▶ C언어] YYYY-MM-DD hh:mm:ss 현재 날짜 시간 타임 스탬프 출력; ISO Time Stamp




현재 년월일 시분초를 개별적으로 구하는 방법: ▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수(오늘 날짜 시간): Current Date, Time


시스템 날짜가 아닌, "파일 날짜" 구하기: ▶▶ C언어] 파일 타임 스탬프, 파일 날짜 시간 구하기 함수; File Time Stamp, Last Write Date

☞ C/C++ (VC++)

나누기/나눗셈 기능, 곱하기(곱셈) 버튼 있는 계산기는? Calc Divide Multiply

모든 계산기에는 "나누기" 기능이 있습니다.

다만 컴퓨터의 계산기에서는, 나눗셈 기호가 슬래시(/) 라는 기호로 되어 있습니다.

"100 나누기 3" 은

100 / 3

이렇게 표현합니다.


그리고 곱셈 기호는 X 가 아닌 별표(*)입니다.

"100 곱하기 3" 은

100 * 3

이렇게 표현합니다.

윈도우 계산기: 제곱근 계산

윈도우XP: "시작" 버튼 > 모든 프로그램 > 보조 프로그램 > 계산기



나누기, 몫, 나머지 값 계산기: ▶▶ 나누기 계산기; 나눗셈의 몫 나머지 값 구하기; Remainder Calc

▶▶ 윈도 계산기/구글 계산기 활용. 수식 입력을 편하게



Sunday, December 24, 2006

Python/파이썬] 정수 나누기 연산에서, 실수형으로 답 출력하기; Divide int

펄(Perl)과 달리, 파이썬은 스크립트 언어임에도, 숫자를 좀 융통성 없게 처리합니다.

"100 나누기 3" 즉 "100 / 3" 은
33.33333333333...
이지만

파이썬에서는 정수인 33 으로 출력됩니다.

실수로 출력하기 위해서는, 피제수(나눔을 당하는 수) 또는 제수(나누는 수) 어느 쪽에나,
.0
을 붙여서 실수화시키면 됩니다. float() 함수로 실수화시켜도 됩니다.

그러면 답이 실수형으로 출력됩니다.


정수 나눗셈 결과를 실수로 출력 예제
#!/usr/bin/python
# -*- coding: cp949 -*-


print 100 / 3
# 출력 결과: 33


print 100.0 / 3
# 출력 결과: 33.3333333333


print 100 / 3.0
# 출력 결과: 33.3333333333


print float(100) / 3
# 출력 결과: 33.3333333333


print 100 / float(3)
# 출력 결과: 33.3333333333


print float(100) / float(3)
# 출력 결과: 33.3333333333


위의 예제에서, 맨 처음의 경우를 제외하고는, 항상 33.3333333333 이런 실수형으로 출력됩니다.



파이썬의 대화 모드(Interactive Interpreter)에서도 마찬가지입니다:
D:\Z>python
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> 100/3
33
>>> 100.0/3
33.333333333333336
>>> 100/3.0
33.333333333333336
>>> 100.0/3.0
33.333333333333336
>>> float(100)/3
33.333333333333336
>>>



☞ Python (파이썬)

Python/파이썬] 수학 함수 사용; math 모듈, sqrt() log() log10()

파이썬에서 수학 함수를 사용하기 위해서는, import math 로, 수학 함수 모듈을 로딩해 주어야 합니다. 아래 예제와 같습니다.

수학 함수 사용 예제
#!/usr/bin/python
# -*- coding: cp949 -*-

import math


# 제곱근 함수
print math.sqrt(2)
print math.sqrt(2.0)


# 자연 로그 함수
print math.log(12)
print math.log(12.0)


# 상용 로그 함수
print math.log10(12)
print math.log10(12.0)



인수를, 정수로 주든 실수로 주든, 결과는 같습니다.
D:\Z>0.py
1.41421356237
1.41421356237
2.48490664979
2.48490664979
1.07918124605
1.07918124605

D:\Z>



그리고 파이썬의 "대화 모드"에서도 import math 를 해주어야 합니다. 그렇지 않으면 NameError: name 'sqrt' is not defined (함수가 정의되어 있지 않다) 이런 에러가 납니다.
D:\Z>python
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> print sqrt(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sqrt' is not defined
>>> print math.sqrt(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> import math
>>> print math.sqrt(2)
1.41421356237
>>>


☞ Python (파이썬)

C언어] 수학 함수 sqrt() log() log10() 헤더 파일: include math.h

수학 함수를 다룰 때에는 math.h 라는 헤더 파일을 인클루드해주어야 합니다. 아래 예제와 같습니다.

그리고 수학 함수들은 대부분, 정수(int)가 아닌 실수(double)로 입출력합니다.


수학 함수 다루기 예제


파일명: 0.cpp
#include <stdio.h>
#include <math.h>


int main(void) {


  // 제곱근 함수
  double d = 2.0;
  double result = sqrt(d);
  printf("%f\n", result);
  // 출력 결과: 1.414214



  // 자연 로그 (Natural Logarithm) 함수
  d = 333.0;
  result = log(d);
  printf("%f\n", result);
  // 출력 결과: 5.808142



  // 상용 로그(Common Logarithm; 밑(base)이 10인 로그)
  d = 333.0;
  result = log10(d);
  printf("%f\n", result);
  // 출력 결과: 2.522444

  return 0;
}



컴파일 및 실행 결과:
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:0.exe
0.obj
1.414214
5.808142
2.522444

D:\Z>


sqrt(2)
이렇게 정수를 직접 넣어주면, error C2668: 'sqrt' : ambiguous call to overloaded function 이런 에러가 납니다.

sqrt(2.0)
이렇게 실수형으로 적어주든지

sqrt( (double) 2 )
또는 이런 식으로 실수로 변환(캐스팅)시켜야 합니다.



▶▶ C언어] 실행시 오류(런타임 에러): runtime error R6002 - floating point not loaded

참고: ▶▶ C언어 VC++] 가우시안 랜덤 난수 발생; 가우스 분포 Gaussian Random Number

☞ C/C++ (VC++)

C언어] DIR 함수; 디렉토리 파일 검색; 와일드카드 지원; findfirst findnext

도스의 dir 명령에서처럼, 지정해준 디렉토리 속의 모든 파일들의 리스트를 얻기 위해서는, 비주얼C의 경우 io.h 헤더파일의

_findfirst() _findnext() 함수를 사용합니다. "*.*" 같은 와일드카드도 지원합니다.

_findfirst() 로 우선 첫번째 파일 하나를 찾은 후, 그 다음 파일부터는 _findnext() 로 계속 찾는 것입니다. 그리고 함수의 사용이 끝났으면 _findclose() 함수로, 반드시 메모리를 해제해 주어야 합니다.


그런데 _findfirst() / _findnext() 로는, 3GB가 넘는 거대한 파일을 다룰 수 없기에
현실적으로는 _findfirsti64() / _findnexti64() 함수를 사용해야 합니다.


VC++: 현재 디렉토리의, "모든 파일(*.*)" 목록 출력 예제


파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // exit()
#include <io.h>
#include <errno.h>


int main(void) {
  _finddatai64_t c_file;
  intptr_t hFile;
  char path[] = "*.*";


  if ( (hFile = _findfirsti64(path, &c_file)) == -1L ) {
    switch (errno) {
      case ENOENT:
        printf(":: 파일이 없음 ::\n"); break;
      case EINVAL:
        fprintf(stderr, "Invalid path name.\n"); exit(1); break;
      case ENOMEM:
        fprintf(stderr, "Not enough memory or file name too long.\n"); exit(1); break;
      default:
        fprintf(stderr, "Unknown error.\n"); exit(1); break;
    }
  } // end if
  else {
    printf("-- 파일 목록 --\n");
    do {
      printf("%s\n", c_file.name);
    } while(_findnexti64(hFile, &c_file) == 0);
    _findclose(hFile); // _findfirsti64(), _findnexti64()에 사용된 메모리를 반환
  } // end else


  return 0;
}



컴파일 및 실행 결과:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
-- 파일 목록 --
.
..
0.bat
0.cpp
0.exe
0.obj
15698793.htm
15698793_files
antivirus_v3_plus_neo_dos_freeware.png
d0.cpp
Foo.class
Foo.java
ggg.doc
ggg.txt
Jaso.class
Jaso.java
out.txt
test.txt
강병철과 삼태기 - 냉면.mp3
새 폴더

D:\Z>


char path[] = "*.*";
이렇게 하면 "현재 디렉토리"의 모든 파일이 출력됩니다.



char path[] = "D:/Y/*.*";
이렇게 하면 "D:\Y" 폴더의 모든 파일을 출력합니다. 모든 파일 출력시, 폴더에 파일이 하나도 없더라도

.
..

이렇게 "현재 디렉토리"를 나타내는 점 1개(.)와, 상위 디렉토리를 나타내는 점 2개(..)는 나옵니다.



char path[] = "D:/Y";
이렇게 지정하면
Y
이렇게 Y 라는 디렉토리 자체가 나옵니다.




에러가 날 경우
"Invalid path name (잘못된 파일/디렉토리명)"
"Not enough memory or file name too long (메모리 부족/너무 긴 패스명)"
"Unknown error (그밖의 알 수 없는 에러)"

등의 메시지가 출력됩니다.

ENOENT 등의 에러는 컴파일러 버전에 따라서 좀 다를 수 있습니다. 이 예제는 Visual C++ 2003 에서 만들어진 것입니다.




업데이트:

여기에 좀더 본격적인 DIR 소스가 있습니다: ▶▶ C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원

C언어 강좌와 각종 예제:

Java/자바/정규식] 대소문자 구분 없이 문자열 바꾸기/치환; Replace String Ignore Case Regex

replaceFirst() / replaceAll() 메소드(함수)로 문자열을 치환할 때, 대소문자 구분없이 바꾸려면

정규식의 앞 부분에 (?i) 라는 옵션을 넣어주면 됩니다. 물음표+소문자i(아이)입니다.


영문 알파벳 대소문자 구분없이 치환 예제


파일명: Foo.java
public class Foo {
  public static void main(String[] args) {

    String s  = "Abc abC ABC abc"; // 원본 문자열
    String s2;

    System.out.println("원본:    " + s);
    System.out.println(); // 줄바꿈


    s2 = s.replaceFirst("(?i)abc", "ZZZ");
    System.out.println("치환(1): " + s2);


    s2 = s.replaceAll("(?i)abc", "ZZZ");
    System.out.println("치환(2): " + s2);

  }
}



컴파일 및 실행 결과 화면:
D:\Z>javac Foo.java && java Foo
원본:    Abc abC ABC abc

치환(1): ZZZ abC ABC abc
치환(2): ZZZ ZZZ ZZZ ZZZ


만약 (?i) 라는 옵션이 없다면, 원본 문자열에서, 소문자로 된 "abc" 만 "ZZZ"로 변경됩니다.



▶▶ Java/자바] 문자열 치환, 바꾸기, 모두 바꾸기 - String Replace All

☞ 자바(Java)

☞ 정규식/정규표현식(Regex; Regular Expression)

Java/자바] 16진수 문자열을 정수로 변환 계산; 십육진수 헥사(Hex) 문자열을 숫자로

숫자인 16진수라면 0x 라는 접두사만 붙이면 계산이 되지만, 16진수 문자열이라면 약간 다듬어 주어야 합니다.

"FF" 이런 십육진수 문자열은 Integer.parseInt() 로 직접 숫자로 변환할 수 있습니다.

그런데 "0xFF" 이런 십육진수 문자열은, 앞의 "0x" 를 제거해 준 후, Integer.parseInt() 에 넣어야 합니다. 다음 예제와 같습니다.


십육진수 문자열을 정수 숫자로 변환 예제


파일명: Foo.java
public class Foo {
  public static void main(String[] args) {


    String h = "FF";
    int n = Integer.parseInt(h, 16);

    n++; // 이제 숫자가 되었으니 ++ 로, 더하기 1을 할 수 있음
    System.out.println(n);
    // 출력 결과: 256
    // 255+1=256



    String h2 = "0xFF";

    // 접두사 0x 제거 하기
    h2 = h2.replaceFirst("^0x", "");
    System.out.println(h2); // FF

    int n2 = Integer.parseInt(h2, 16);

    n2++;
    System.out.println(n2);
    // 출력 결과: 256

  }
}


Integer.parseInt()에서
"0xFF" 이렇게 "0x" 라는 접두사를 붙이면
Exception in thread "main" java.lang.NumberFormatException: For input string: "0xFF"
이런 에러가 납니다.

이때는
replaceFirst 메소드에서 ^0x 라는 정규식을 사용하여, "0xFF" 라는 문자열 앞쪽의 "0x" 를 삭제하면 됩니다.

정규식에서 캐럿 기호(^)는, "문자열의 시작"을 의미하기에, 문자열 맨 앞의 "0x" 부분을 가리키게 됩니다.




"0XFF" 이렇게 대문자 0X 로 접두사를 붙인 경우, 대소문자 구분 없이 치환하려면

h2 = h2.replaceFirst("(?i)^0x", "");

이렇게 (?i) 라는 옵션을 넣어주면 됩니다.



▶▶ Java/자바] 16진수 계산하는 법; 십육진수 헥사(Hex)값 계산

▶▶ 자바/Java] 문자열을, 숫자(정수/실수)로 변환; String to Number (int float double)

☞ 자바(Java)

☞ 정규식/정규표현식(Regex; Regular Expression)

Saturday, December 23, 2006

Q: 정규식과 정규표현식의 차이점/차이, 의미 - Regex; Regular Expression

"정규식"과 "정규표현식"은 같은 말입니다. "정규표현식"을 줄여서 "정규식"이라고 합니다.

영어로는 "Regular Expression (레귤러 익스프레션)"이라고 하는데, 이것이 너무 길기에,

Regexp

또는 더 줄여서

Regex

라고 간편히 기술합니다.


"정규표현식"이든 "Regular Expression"이든, 단어만 보고서는 무슨 뜻인지 알 수 없게 되어 있는데,

정규식이라는 것은 쉽게 말해서, "문자열을 다루는 공식"입니다. 수학에 숫자를 다루는 공식이 있듯이, 프로그래밍에서 "ABC" "가나다라" 등의 문자열을 처리할 때 사용하는 것입니다: ▶▶ 정규식 / 정규표현식 (Regular Expressions; Regex) 이란?

☞ 정규식/정규표현식(Regex; Regular Expression)

Java/자바] 16진수 계산하는 법; 십육진수 헥사(Hex)값 계산

자바는 물론이고, C언어나 Perl 등의 거의 모든 언어에서, 16진수를 계산할 때에는 0x 라는 접두사를 붙여주고 계산하면 됩니다. "숫자 제로+엑스"입니다.

예를 들어 십육진수 FF 를 0xFF 이렇게 표현하면, 컴파일러가 FF를 십육진수 상수라고 인식하게 됩니다. 그렇지 않으면 FF 를 변수명으로 착각하고 에러가 납니다.

자바 기초: 16진수 계산 예제


파일명: Foo.java
public class Foo {
  public static void main(String[] args) {

    int n = 0xFF;  // 십진수로 255
    int n2 = 0x20; // 십진수로 32

    n += n2;       // n = n + n2 와 동일


    System.out.println(n);
    // 출력 결과 (10진수): 287
    // 255+32=287


    // 답을 16진수로 출력하기
    System.out.format("%X%n", n);
    // 출력 결과 (16진수): 11F
    // 10진수 287 이, 16진수로는 11F 임

  }
}



▶▶ Java/자바] 16진수 상수 FF, 10 표현 방법; Hexadecimal Literal

▶▶ 자바/Java] 10진수, 16진수로 변환 출력 - 십진수 십육진수(헥사;Hex)


☞ 자바(Java)

도스(DOS)에서, Program Files 폴더 지정/입력하는 법은?

배치 파일 안에서나, 또는 도스창(명령 프롬프트;CMD.EXE)에서 작업할 때

C:\Program Files

이런 이름의 폴더에는 "공백(스페이스)"이 들어가 있기에, 그냥 타이핑하면 안됩니다.

만약
dir C:\Program Files
이런 명령을 주면 파일을 찾을 수 없습니다 등의 에러가 나게 됩니다.

이때에는

dir "C:\Program Files"

이렇게 경로명을 큰따옴표(쌍따옴표)로 둘러싸 주면 됩니다.



그리고 예를 들어, 도스창에서 직접 IE를 실행하려고 할 때

C:\Program Files\Internet Explorer\IEXPLORE.EXE http://www.google.co.kr/

이렇게 하면,

'C:\Program'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라는 에러가 납니다.

C:\Program 이라는 부분을 "파일명"으로 오인하고, 나머지 부분을 옵션으로 오인하기 때문입니다.

이때는 경로와 실행 파일명을 통째로 큰따옴표로 둘러싸 주고, 옵션이 있다면 옵션 부분은 제외하면 됩니다. 다음과 같습니다.

"C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://www.google.co.kr/


C:\Program Files\Internet Explorer
라는 폴더의

IEXPLORE.EXE
라는 실행 파일을 실행시키되

http://www.google.co.kr/
이라는 옵션을 준 것입니다.


☞ BATCH(.BAT)/VBScript(.VBS)

☞ 윈도우(WINDOWS)

Python/파이썬] 현재 유닉스 시간, 유닉스 타임 출력 함수; Get Unix Time, Epoch

유닉스 시간, 즉 "유닉스 타임"을 구하는 방법입니다. time 모듈의 time() 함수를 사용합니다.

유닉스 타임 출력 예제
파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-

from time import time


# 실수형으로 유닉스 타임 출력
print time()


# 정수형으로 유닉스 타임 출력
print int(time())



실행 결과 화면:
D:\Z>echo %date% %time% & 0.py
토 2006-12-23 11:44:31.86
1166841871.96
1166841871

현재 시각 "2006-12-23 11:44:31.86" 에 실행했을 때의 결과입니다. 위의 경우 "1166841871" 이라는 것이 "유닉스 시간"입니다.




유닉스 시간 (Unix Time) 이란?

세계 표준시 (UTC) 로
1970년 1월 1일 00시:00분:00초
를 기준으로 하여 지금 현재까지 흐른 모든 시간을 초(sec) 단위로 표현한 것입니다. 단, 윤초(Leap Second)는 반영하지 않습니다.

프로그래밍에서는 유닉스 타임을 이용하여, 현재 시각을 구합니다.

파이썬에서는 유닉스 타임을 정수가 아닌 실수로 반환합니다. 이것을 int() 함수로 정수화시킬 수 있습니다.


☞ Python (파이썬)

Python/파이썬] 아스키 문자열을 유니코드 문자열로 변환 함수; ASCII String to Unicode String

unicode() 라는 함수를 사용하면 아스키 문자열을 유니코드 문자열로 변환할 수 있습니다.

unicode(변환할 아스키 문자열, 아스키 문자열의 인코딩)

형식입니다. "똠방각하" 등을 표현할 수 있는 "한글 확장 완성형"의 인코딩은 949 입니다. 따라서 뒤쪽 인수를 "949" 라고 문자열로서 적어주면 됩니다. 또는 "cp949" 또는 "ms949" 라고 지정해도 됩니다.


아스키 문자열을, 유니코드 문자열로 변환 예제
#!/usr/bin/python
# -*- coding: 949 -*-


s = "안녕ABC"
print len(s)
# 글자 개수 출력 결과: 7
# 유니코드가 아닌 아스키 문자열이기에
# 한글은 2바이트로 간주




# 유니코드 문자열로 변환
s = unicode(s, "949")

print s
# 출력 결과: 안녕ABC

print len(s)
# 글자 개수 출력 결과: 5
# 유니코드 문자열이기에, 한글/영문 관계 없이 항상 1글자로 취급




문자열 상수, 즉 리터럴을 표현할 때에는

u"안녕ABC"

이렇게 앞에 u 라는 접두사를 붙이면 됩니다.


▶▶ Python/파이썬] 문자열 길이 구하기 함수/유니코드 문자열 글자 수; Get String Length, Unicode Size

☞ Python (파이썬)

Python/파이썬] 문자열 길이 구하기 함수/유니코드 문자열 글자 수; Get String Length, Unicode Size

파이썬에서는 len() 이라는 내장 함수로 문자열의 길이를 "바이트 단위"로 구할 수 있습니다.

영문이나 기호 등의 1바이트 문자 1개는 1바이트로,
한글 같은 2바이트 문자 1개는 2바이트로 나타납니다.

영문은 괜찮지만, 한글이나 한글이 섞인 문자열에서는 len 함수로 글자 개수를 구할 수 없는데, 바이트 수가 아닌, 글자수를 구하기 위해서는 그 문자열 앞에 u 라는 접두사를 붙여 유니코드로 표현하면 됩니다. 또는 다음과 같이 유니코드로 변환하면 됩니다: ▶▶ Python/파이썬] 아스키 문자열을 유니코드 문자열로 변환 함수; ASCII String to Unicode String

문자열 길이, 유니코드 글자 개수 구하기 예제
#!/usr/bin/python
# -*- coding: 949 -*-


s = "ABCD"

print len(s)
# 출력 결과: 4


s = "안녕하세요"

print len(s)
# 출력 결과: 10
# 한글 1자는 2바이트


s = "안녕ABC"

print len(s)
# 출력 결과: 7
# 영문 1자는 1바이트



s = u"안녕ABC"

print len(s)
# 출력 결과: 5
# 유니코드 문자열은, 한글/영문 관계 없이 항상 1글자로 취급




▶▶ Python/파이썬] 리스트(배열) 크기 사이즈 구하기; List (Array) Size, Length

☞ Python (파이썬)

Friday, December 22, 2006

CJK 란? CJK 글꼴(Font) 다운로드는? 한중일 삼국 글꼴이 하나로 된 폰트

CJK 라는 것은

Chinese (중국어)
Japanese (일본어)
Korean (한국어)

의 약자입니다. 즉 "한자 문화권"의 언어나 문자를 지칭하는 말입니다.

따라서 CJK 폰트가 따로 있는 것은 아닙니다. 한글 윈도우에서 사용되는 굴림체, 바탕체 등의 폰트도 CJK 폰트인 것입니다.

만약 한중일 삼국의 문자가 하나로 이루어진 폰트(글꼴)가 꼭 필요하다면

Arial Unicode MS (ARIALUNI.TTF)

같은 유니코드 폰트가 적합할 것입니다. ▶▶ [QnA] 한글 유니코드 폰트 (Unicode Font) 는?
다만 위의 폰트는 글꼴 모양이 그리 좋지 않습니다.



참고:

▶▶ 중국어 간체자 번체자 폰트(글꼴) 이름 / 다운로드 하는 곳은? - Chinese Simplified Traditional Fonts

▶▶ [QnA] 윈도우XP의 일본어 기본 폰트(글꼴)는? - Japanese Font

☞ 폰트(Font)

적외선 사진 (컬러, 흑백) 많은 곳, 갤러리; Color / BW Infrared Photo Gallery

사진 공유 사이트인 플리커에, 적외선 사진 (赤外線 寫眞; Infrared Photography)이 현재 2만장 정도 올라왔습니다. 진짜 적외선 사진도 있고, 일반 사진의 색조를 적외선 사진처럼 왜곡시킨 사진들도 섞여 있습니다.

< 적외선 사진 갤러리 >

위의 주소입니다.

요즘에는 적외선 사진을 찍을 수 있는 디카가 있는 것 같습니다. (업데이트: 디카는 적외선/자외선을 기본적으로 모두 차단하기에, 적외선 사진 촬영이 안될 줄 알았는데, 일반 디카에 적외선 필터를 붙여 저속 셔터로 촬영한 후, 후보정을 하면 된다고 하는군요.) 예전에는 사쿠라 필름이던가? 하는 곳에서 흑백 적외선 필림이 판매되었고, 컬러 적외선 필름은 코닥에서만 생산되었습니다. 촬영하지 않은 적외선 필름은 냉장고에 넣어서 보관해야 하는 등, 취급에도 어려움이 있었습니다. 그렇지만 디카로 찍는다면 간편할 것입니다.

제가 태어나서 맨 처음으로 본 컬러 적외선 사진은 굉장히 사이키델릭한 것이었습니다. 그런데 위의 플리커에 올라와 있는 컬러 적외선 사진은 그리 충격적인 색조를 가지고 있지는 않았습니다. 나뭇잎이 하얗게 보인다는 정도입니다.


포토샵을 이용하면 보통 사진도 적외선 사진처럼 만들 수 있습니다: ▶▶ 포토샵] 컬러 적외선 사진 효과 필터 사용법 예제: Pseudo Infrared Photoshop Filter Color

물론 진짜 적외선 사진처럼, 안개 너머의 먼 풍경을 선명히 보이게 한다든지 할 수는 없겠지요.


☞ 카메라 (Digital Camera)

롤라이플렉스(Rolleiflex) 디카 출시; 2안 렌즈 카메라; 미니 롤라이프렉스 Rollei

이안 렌즈 리플렉스 카메라 Twin Lens Reflex Camera 인, 롤라이플렉스의 디카 버전도 나왔더군요.

< Rolleiflex MiniDigi > 라는 이름입니다.

위의 주소에 보면 다음과 같은 앙증맞은 롤라이가 나옵니다. 처음에는 모형인 줄 알았습니다. "베이비 롤라이"의 최신판인 것 같습니다. 세계 최초의 "TLR 디카"라고 되어 있습니다.

롤라이플렉스: Rolleiflex MiniDigi Camera



2백만 화소이고, 스펙이 그리 좋지는 않고, 칼 짜이스 렌즈가 부착되었다는 말도 없었습니다. 값은 39,800円 이기에 그리 비싸지는 않았습니다. 샘플 사진들을 보니 롤라이의 명성과는 거리가 있는 화질이었습니다. 아무래도 장식품의 의미밖에는 없을 것 같습니다.

롤라이는 예술적/역사적 가치가 높은 카메라이기 때문에 뭐 디카 버전의 화질은 그리 중요하지 않을 수도 있습니다. 물론 "진짜 롤라이"의 화질은 경이롭습니다.



롤라이플렉스: Rolleiflex MiniDigi Camera

Limited Red-version of the Rolleiflex MiniDigi Camera (클릭하면 확대)
1500대 한정판으로 빨간 색의 미니 롤라이 디카도 만들었더군요. 이것은 위의 것보다 약간 더 비싼 가격이었습니다.


☞ 카메라 (Digital Camera)

일본 니콘, 캐논 디카 홈페이지; 렌즈 색감; NIKON CANON Japan

< Nikon Japan >
일본 니콘 카메라 공식 홈페이지입니다.


< Canon Japan >
일본 캐논 공식 사이트입니다.

니콘 렌즈는, 독일제 렌즈는 물론이고, 다른 일본제 렌즈에 비해서도 색감이 좀 무미건조한 것 같아서 캐논 쪽에 관심을 가졌습니다. 제가 색감 비교를 해 본 결과, 니콘 렌즈는 어딘지 모르게 화려함이 부족했습니다. 미학적으로 색표현에 접근하지 않고, 물리적으로 정확한 색을 추구하는 것 같았습니다. 과학 사진 분야에서 니콘이 선호되는 이유도 그런 것이 아닐까 합니다.

그런데 이제 캐논은 카메라 전문 업체라고 보기 힘들어서, 캐논도 좀 망설여지더군요.


위의 니콘 홈페이지에 가보니, 역시 니콘 렌즈에는 다른 회사의 그것과는 다른 '신뢰감' 같은 것이 느껴졌습니다.


물론 콘탁스가 아직도 살아 있었다면, 니콘이든 캐논이든 별로였을 것입니다: ▶▶ 콘탁스 카메라 생산 중지; CONTAX Camera; Carl Zeiss; 京セラ コンタックス

칼 짜이스의 T* (티 스타) 렌즈와 일제 렌즈와의 차이는, 포도주와 포도 주스의 차이만큼 큰 것이었습니다.





업데이트:

필카 시대에는 니콘과 캐논 렌즈의 색감 차이가 그리 크지 않았습니다. 렌즈 색감이 좀 나쁘다 하더라도, 코다크롬이나 엑타크롬 같이 색감이 좋은 리버셜 필름을 쓰면 커버가 되었습니다.

그런데 디카 니콘과 디카 캐논으로 찍은 사진에는 색감 차이가 상당히 컸습니다. 이것은 렌즈 때문이라기보다는, 촬상 소자 때문일 것입니다.

캐논 촬상 소자의 품질이 니콘보다 더 좋습니다. 니콘은 카메라 바디 제조에는 세계 최고지만 다른 분야, 특히 전자 계통에는 약합니다.

디카 캐논으로 찍은 사진은 색감이 아주 선명하고 화사한데, 니콘 디카 색감은, 좋게 말하면 "묵직하며 기품이 있고", 나쁘게 말하면 좀 칙칙하더군요.

니콘 렌즈의 색감 자체가 좀 무거운 편인데, 촬상소자 역시 색감이 무거우니, 사진이 칙칙하게 나올 수밖에 없겠지요.



(2007-04-12 수정 사항) 컴팩트 카메라의 촬상소자는 캐논 쪽이 확실히 우수하지만, DSLR 의 경우에는 니콘이 더 훌륭할 수도 있었습니다. 캐논 쪽은 색상이 화려하긴 한데 깊이가 부족했습니다. 반면 니콘 DSLR 에서는 깊이 있는 색감이 표현되었습니다.

캐논의 색감이 소녀처럼 마냥 낙천적이라면, 니콘 DSLR은 약간 우울하며 남성 취향의 사진을 만들어 내더군요,

컴퓨터 모니터로 볼 때는 우선 캐논의 색감이 눈에 잘 들어오지만 쉽게 싫증이 났습니다.

니콘 DSLR은 처음에는 좀 어둡게 보이지만, 보면 볼수록 깊은 맛이 우러나더군요.




<< Home

Categories
Some Recent Posts
Monthly Archives
Top