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

 
Monthly Archive
Tuesday, October 31, 2006

자바스크립트] 반올림, 실수를 정수로, JavaScript Round To Int

자바스크립트에서 실수를, 가장 가까운 정수로 반올림하는 방법입니다.

Math.round() 메소드를 사용하여 반올림을 합니다.

다음 예제의 결과는 반올림되어 4 입니다. 그러나 3.4999999999999999 여기서, 9가 1개라도 부족하면 반올림되지 않고 그냥 3이 됩니다.

JavaScript 반올림 예제


<script type="text/javascript">
  var f = 3.4999999999999999;

  result = Math.round(f);

  document.write(result);
</script>



실수를 실수로 반올림, 즉 소수점 이하 자리 지정하여 반올림 함수: ▶▶ 자바스크립트] 실수로 반올림, 소수점 자릿수 지정, Round To Float, JavaScript


반올림하지 않고, 무조건 소수점 이하 버리는 방법: ▶▶ 자바스크립트] 실수 소수점 이하 버리기, 정수로 만드는 함수; JavaScript float to int

☞ HTML/CSS/JavaScript

리눅스,Linux] 현재 날짜/시각 보기, 시간 맞추기 명령어; 유닉스 date Command

리눅스의 커맨드라인에서는, date 라는 명령으로, 현재 날짜와 시간을 볼 수 있습니다. 그리고 컴퓨터 시계가 맞지 않는다면, date 명령으로 시간을 고칠 수도 있습니다. 방법은 다음과 같습니다.


리눅스/유닉스: 현재 날짜/시간 화면에 출력


리눅스 커맨드라인에서, date 라는 명령을 치면
Mon Oct 30 18:52:19     2006
이렇게 출력됩니다.


위와 같은 미국식 시간이 불편하다면, 한국에서 통용되는 시간 포맷으로 출력할 수 있습니다.
date '+%F  %r'

위의 명령으로는
2006-10-30  06:43:21 PM
이렇게 출력됩니다.



리눅스/유닉스: 날짜/시간 맞추는 법


시간 바꾸기 (24시간제로 입력):
date -s 23:43:21
이런 명령으로 현재 시각을 23시 43분 21초로 변경할 수 있습니다.



날짜 바꾸기:

date -s '2006-10-20 23:43:21'
이렇게 날짜와 시간을 같이 적어 주어야 하더군요. (이 경우에는 공백이 들어가기에 작은따옴표를 붙여야 합니다.)

그렇지 않고
date -s 2006-10-20
이렇게 하면 날짜가 2006년 10월 20일로 바뀌긴 하지만, 현재 시각은 0시 0분 0초가 되어 버립니다.



date --help
라고 하면 date 명령에 대한 도움말이 나옵니다.





만약 시간대가 미국 태평양 표준시 (PST; PDT)로 나온다면 다음의 방법으로 한국 시간(KST)으로 바꿀 수 있습니다. ▶▶ 리눅스 시간대, 한국 시간(한국표준시;KST)으로 변경; Linux Timezone


▶▶ 리눅스 오늘 날짜 현재 시간 보기 스크립트; Linux Date Time Script

자바,Java] 파일 크기;파일 사이즈 구하는 함수(메소드); File Size

File 클래스의 length() 라는 메소드로, 파일의 용량을 바이트 단위로 구할 수 있습니다.


파일 사이즈 구하기 예제 소스; Get File Size Example


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

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

    File oFile = new File("0.exe");

    if (oFile.exists()) {
      long L = oFile.length();
      System.out.println(L + " bytes : " + oFile.getAbsoluteFile());
    }
    else System.err.println("파일이 없음...");

  }
}



위의 예제 컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
45056 bytes : D:\Z\0.exe

D:\Z>


지정한 이름의 파일이 없으면 에러가 나는 것이 아니라 0 바이트를 리턴하니 주의가 필요합니다. 더 정확히 말하자면, long형이기에 0이 아닌 0L 을 리턴합니다.

그래서 파일이 실제로 있는지 없는지를 exists() 메소드로 체크해 주는 것이 좋을 것입니다.


☞ 자바(Java)

리눅스 화면 지우기 명령, CLS에 해당하는; Linux Clear Screen

리눅스 텍스트 모드 화면 (터미널) 의 글자들을 깨끗이 지우는 명령어는
clear

입니다.

윈도우의 CLS 와 같은 명령인데, 리눅스에서는 대소문자를 엄격히 구분하기에, 이 경우에는 반드시 소문자로 clear 라고 해야 합니다.

clear 명령은 아주 간단한 명령이기에 아무 옵션도 없습니다. 다만
man clear
라고 하여 매뉴얼을 보면, clear 명령에 대한 짧은 설명이 나옵니다.





참고로, man 은 리눅스의 각종 명령어들에 대한 매뉴얼을 출력하는 명령입니다.

--help 옵션으로 나오는 도움말보다 더 자세히 나옵니다.


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

리눅스 시간대, 한국 시간(한국표준시;KST)으로 변경; Linux Timezone

(우분투 리눅스 Ubuntu Linux 서버 버전을 기준으로 설명)

리눅스를 설치할 때 시간대(타임존;Timezone)를 맞추지 않으면, 컴퓨터 시계가 미국 태평양 시간인 PST로 나옵니다. (서머타임 기간에는 PDT.) 즉 캘리포니아 시간으로 나옵니다. 이것을 한국 표준시인 KST 로 변경하는 방법입니다.


(1)
ls /usr/share/zoneinfo

zoneinfo 란 디렉토리의 내용을 ls 명령으로 보면 Asia 라는 디렉토리가 있을 것입니다. 그리고

ls /usr/share/zoneinfo/Asia

이제 이렇게 쳐보면, Seoul 즉 '서울'이라는 파일이 있을 것입니다. 우분투가 아닌 다른 배포본에서는 좀 다를 수도 있으니 정확한 위치를 파악해야 합니다.



(2)
이제 Seoul 이라는 파일에 대한 심볼릭 링크를 /etc/localtime 이라는 이름으로 만들어 주어야 합니다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

아무 메시지도 나오지 않아야 성공입니다. (위의 명령에서 ln 은, LN 을 소문자로 쓴 것임)



이제 date 명령을 쳐보면, 날짜 뒤에 PSTPDT대신에, 한국 시간인 KST가 나올 것입니다.





다시 미국 태평양 표준시 (PST; PDT) 로 바꾸려면 이렇게 합니다.
ln -sf /usr/share/zoneinfo/US/Pacific /etc/localtime


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

grep] 이진파일/NULL포함 TEXT찾기 옵션; Binary File Grep

리눅스/유닉스의 문자열 찾기 명령인 grep 은 텍스트 파일 속의 문자열을 찾습니다.

(1) 그런데 텍스트 파일인데도 그 안에 실수로 널문자(NULL) 즉 아스키 0x00번 코드가 들어간 경우가 있습니다. 파일의 어느곳에든 널문자가 하나라도 있으면, grep이 그 파일을 이진파일로 간주하기에 Binary file 0.txt matches 이런 메시지만 출력되고 찾기가 되지 않습니다.

(2) 또한 이진파일 속의 문자열을 찾아야 할 경우도 있습니다.


위의 1번 경우든 2번 경우든, 이진파일 즉 바이너리 파일 찾기 옵션을 주면 해결이 됩니다.

-a 옵션을 붙이면 바이너리 파일을 grep 할 수 있습니다.


grep -a '가슴' 0.txt

널문자가 포함된 0.txt 라는 텍스트 파일에서 가슴 이라는 문자열을 정상적으로 찾습니다.


grep -a 'DOS mode' 0.exe

이제 0.exe 라는 이진파일에서 DOS mode 라는 문자열을 정상적으로 찾습니다.



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

Monday, October 30, 2006

펄,Perl] 파일 삭제, 디렉토리(폴더) 지우기 함수; Delete File Directory

펄에서는 unlink 함수로 파일을 지웁니다. 성공적으로 지운 파일의 개수를 반환합니다.

디렉토리는 rmdir 함수로 지웁니다. 실패했을 때에는 false 논리값을 반환합니다. 아래 예제의 경우, 디렉토리 삭제에 실패했을 때 메시지를 출력하기 위해 !rmdir 이렇게 앞에 느낌표를 붙여 논리값을 반전시켜 주었습니다.


파일/디렉토리 지우기 예제


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

  # 0.obj 라는 파일 지우기
  unlink "0.obj";


  my $delCount = unlink <*.bak>;     # .bak 확장자를 가진 백업파일 모두 지우기
  print $delCount, "개 파일 삭제\n"; # 파일을 몇 개 지웠는지 출력


  # fooo 란 이름의 디렉토리 삭제 (실패하면 메시지 출력)
  print "삭제 실패\n" if !rmdir "fooo";


빈 디렉토리만 삭제할 수 있습니다. 안에 파일이 있는 디렉토리는 우선 그 파일들을
unlink <fooo/*>;
이런 식으로 지워야 합니다.




다음 명령어로, perldoc 에서 함수에 대한 도움말을 볼 수 있습니다:

perldoc -f unlink

perldoc -f rmdir

D:\Z>perldoc -f unlink
  unlink LIST
  unlink  Deletes a list of files. Returns the number of files
      successfully deleted.

          $cnt = unlink 'a', 'b', 'c';
          unlink @goners;
          unlink <*.bak>;

      Note: "unlink" will not attempt to delete directories unless you
      are superuser and the -U flag is supplied to Perl. Even if these
      conditions are met, be warned that unlinking a directory can
      inflict damage on your filesystem. Finally, using "unlink" on
      directories is not supported on many operating systems. Use
      "rmdir" instead.

      If LIST is omitted, uses $_.


D:\Z>perldoc -f rmdir
  rmdir FILENAME
  rmdir   Deletes the directory specified by FILENAME if that directory is
      empty. If it succeeds it returns true, otherwise it returns
      false and sets $! (errno). If FILENAME is omitted, uses $_.


D:\Z>



☞ Perl(펄)

배치파일, 도스(DOS)에서 파일 삭제, 디렉토리 지우기 명령어; Delete File

도스창(명령 프롬프트)이나, 배치 파일 (Batch File) 에서, 불필요한 파일을 지우기 위해서는 del 이라는 명령어를 사용합니다.


지정한 파일 하나만 삭제하는 명령


del 0.obj

예를 들어 0.obj 라는 파일을 지우려면 위와 같이 합니다.


지정한 확장자의 파일들만 지우기 명령


del *.bak

.bak 확장자를 가진 모든 파일을 한꺼번에 지웁니다.



읽기전용 파일 삭제


del /f 0.obj
이런 식으로 /f 옵션을 붙여야 합니다. 그렇지 않으면 액세스가 거부되었습니다.라고 나오며 지워지지 않습니다.


숨김 속성 파일 (히든파일) 삭제


del /a 0.obj
이렇게 /a 옵션을 붙입니다. 그렇지 않으면 D:\Y\0.obj을(를) 찾을 수 없습니다.라는 에러가 나고 지워지지 않습니다.


현재 디렉토리(폴더)의 모든 파일 한꺼번에 지우는 명령


del .

현재 디렉토리의 모든 파일을 지우려면 위와 같이 합니다. 위험한 작업이기에 도스가 우선 D:\Y\*, 계속하시겠습니까(Y/N)? 이렇게 물어봅니다. Y 키를 누르면 파일이 모두 지워집니다.

참고로 마침표(.)는 현재 디렉토리를 의미합니다.






하위 디렉토리(폴더) 지우기 명령


파일이 아닌 디렉토리를 지우려면 rmdir 이라는 명령어를 사용합니다.
rmdir 000

현재 디렉토리 밑의 "000" 이라는 이름의 디렉토리를 위와 같은 방법으로 지울 수 있습니다.

다만 그 디렉토리 안에 파일이 들어 있으면 디렉터리가 비어 있지 않습니다. 이런 에러가 나고 지워지지 않습니다.

이때는
rmdir /s 000
이렇게 /s 옵션을 붙이면, 디렉토리가 비어 있지 않더라도 지워집니다. 굉장히 위험한 옵션이니 주의가 필요합니다.





추가 사항:
윈도 탐색기와 달리, 명령프롬프트(도스창)에서 파일을 지우면, 휴지통으로 들어가지 않고 곧바로 지워지기에 복구가 힘들거나 불가능합니다.



▶▶ 배치파일로 디렉토리 생성 명령어, 폴더 만들기 방법; BAT Make Directory, Folder

자바,Java] 숫자를 문자열로 변환, 정수/실수 문자로; Number to String

예를 들어, 숫자 123 을 문자열 "123"으로 변환하는 방법입니다.

자바에서는 기본적으로, 플러스(+) 기호로 숫자에 어떤 문자열을 합쳐주면 그 숫자가 문자열화됩니다.

toString() 메소드를 사용하여 변환하는 더 명확한 방법도 있습니다.


숫자(int/double/long/float)를 문자열로 변환 예제


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

  String s;


  // 숫자를, 다른 문자열과 합쳐서, 문자열로 변환
  int i = 123;
  s = i + "";               // 숫자와 문자열을 합치면, 모두 문자열이 됨
  System.out.println(s);    // 문자열화된 "123"이 출력


  double d = 435.45;
  s = d + "123";            // 435.45 와 123 이 문자열화되어, 서로 합쳐져 버림
  System.out.println(s);    // 문자열화된 "435.45123"이 출력




  // 이번에는 toString() 메소드를 사용하여
  i = 666;
  s = Integer.toString(i);
  System.out.println(s);    // 문자열화된 "666"이 출력


  d = 0.111;
  s = Double.toString(d);  
  System.out.println(s);    // 문자열화된 "0.111"이 출력


  long L = 4324647480L;
  s = Long.toString(L);
  System.out.println(s);    // 문자열화된 "4324647480"이 출력


  float f = 54.4F;
  s = Float.toString(f);
  System.out.println(s);    // 문자열화된 "54.4"가 출력

  }
}


다음은 위와는 반대로, 문자로 된 숫자를 진짜 숫자로 바꾸는 방법입니다: ▶▶ 자바/Java] 문자열, 숫자(정수/실수)로 변환; String to Number (int float double)

☞ 자바(Java)

자바/Java] 현재 운영체제의 줄바꿈 문자 얻기; line.separator

현재 OS의 줄바꿈 문자가 어떤 것인지를, System.getProperty() 메소드로 알아내는 방법입니다.

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

  String s = System.getProperty("line.separator");

  for (int i = 0; i < s.length(); i++)
    System.out.format("%02X ", (int) s.charAt(i));

  // 출력 결과 (윈도우에서): 0D 0A
  // 출력 결과 (리눅스에서): 0A
  // 출력 결과 (맥MAC에서) : 0D

  System.out.println(); // 이건 단순한 줄바꿈

  }
}


System.getProperty("line.separator") 를 그냥 출력하면 화면에 아무 글자도 나오지 않습니다. 눈에 보이지 않는 줄바꿈 문자가 그대로 출력되어 버리기 때문입니다. 그래서 System.getProperty("line.separator")의 값을 16진수 헥사로 출력하게 했습니다.



▶▶ 자바/Java] System.out.format() 줄바꿈, 운영체제(OS) 종류에 맞게; line separator

☞ 자바(Java)

펄/Perl] Hash(해쉬) 정렬 Sort; 해시 숫자 key / value 소팅

펄의 Hash(해쉬) 자체는 정렬(소팅;Sorting)할 수 없습니다. 해쉬의 요소들에는 정해진 순서가 없기 때문입니다.

다만, 해쉬를 "정렬하여 출력"할 수만 있습니다.

그리고 숫자로 이루어진 해쉬는, 문자열로 이루어진 해쉬와는 다른 방법으로 정렬해야 합니다. 각각의 정렬 방법은 다음 예제와 같습니다:

Hash(해쉬) 소트 출력 예제


예를 들어, "한국"이 key 이고 "서울"이 value 입니다.
#!/usr/bin/perl
use strict; use warnings;

  my %cities = (
    "한국"   => "서울",
    "일본"   => "도쿄",
    "그리스" => "아테네",
    "미국"   => "워싱턴",
    "프랑스" => "파리",
  );

  print "\n<key를 가나다순으로 소팅>\n";
  foreach $_ (sort keys %cities) {
    print "$_ : $cities{$_}\n";
  }



  print "\n\n<value를 가나다순으로 소팅>\n";
  foreach $_ (sort { $cities{$a} cmp $cities{$b} } keys %cities) {
    print "$_ : $cities{$_}\n";
  }





  my %num = (
    4343   => 4,
    88     => 1215,
    0.1    => -12,
    1212.1 => 124.0,
    542.0  => 54,
    42.0   => 0,
    87     => 99,
  );

  print "\n\n<key를 숫자 크기순으로 소팅>\n";
  foreach $_ (sort {$a <=> $b} keys %num) {
    print "$_ : $num{$_}\n";
  }


  print "\n\n<value를 숫자 크기순으로 소팅>\n";
  foreach $_ (sort { $num{$a} <=> $num{$b} } keys %num) {
    print "$_ : $num{$_}\n";
  }




실행 결과:
D:\Z>0.pl

<key를 가나다순으로 소팅>
그리스 : 아테네
미국 : 워싱턴
일본 : 도쿄
프랑스 : 파리
한국 : 서울


<value를 가나다순으로 소팅>
일본 : 도쿄
한국 : 서울
그리스 : 아테네
미국 : 워싱턴
프랑스 : 파리


<key를 숫자 크기순으로 소팅>
0.1 : -12
42 : 0
87 : 99
88 : 1215
542 : 54
1212.1 : 124
4343 : 4


<value를 숫자 크기순으로 소팅>
0.1 : -12
42 : 0
4343 : 4
542 : 54
87 : 99
1212.1 : 124
88 : 1215

D:\Z>



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

▶▶ [펄/Perl] 디버깅용 해쉬 덤프 (Hash Dump)

☞ Perl(펄)

Sunday, October 29, 2006

울트라에디트 아스키 코드표 보기: UltraEdit ASCII Table 울트라 에디터

울트라에디트 메뉴에서

View > ASCII Table

항목을 선택하면 다음과 같은 아스키 문자표가 나옵니다.

울트라에디트 아스키 코드표: UltraEdit ASCII Table


Dec# 은 10진수 코드 번호이고

Hex# 는 16진수로 나타낸 코드 번호입니다.

위의 상자에서, 어떤 아스키 문자를 선택한 후, 마우스로 더블클릭하면 현재 문서에 그 문자가 찍힙니다.


또한 위의 상자를 닫지 않아도 문서 편집이 가능하기에, 아스키 코드표를 울트라에디터에 항상 띄워 놓고 사용할 수 있습니다.

즉 "Modal window"가 아닌 플로팅 윈도우인 것입니다.


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

엑셀/Excel] VBA로, 아스키 문자표 만들기: ASCII Table

엑셀 VBA 를 이용하여 아스키 코드표를 만드는 방법입니다. 그런데 아스키 코드에는 엑셀의 셀에 표현할 수 없는 제어 기호 등의 문자들이 많기 때문에, 실제 출력할 수 있는, 32~126번까지의 문자만 출력합니다. 원래 아스키 코드 (ASCII Code)는 0~255번까지 있습니다.


엑셀 아스키 코드표: Excel ASCII Table

엑셀로 만든 ASCII 문자표: 클릭하면 확대

괄호 속에 들어 있는 숫자는 16진수(Hex)입니다. 맨 좌측의 숫자는 10진수입니다.

32번 아스키 문자는 "공백 문자"입니다. 즉 스페이스 키의 아스키 코드입니다.


VBA: 아스키 코드표 출력 소스


Sub 아스키_표_만들기()
  Application.ScreenUpdating = False

  Dim I, R, C

  I = 32

  For C = 1 To 4
    For R = 1 To 30

      Cells(R, C).Value = Format(I, "000") & " (" & Hex(I) & ")" & " = " & Chr(I)
      Columns(C).ColumnWidth = 12 ' 셀의 너비 넓게

      I = I + 1
      If I > 126 Then Exit For

    Next R
  Next C

  Application.ScreenUpdating = True
End Sub



아스키 유니코드, 16진법 2진법 10진수 상호 변환기: ▶▶ 16진수 헥사, 2진수, 10진수, 8진법 변환 계산기; Hex Calc

영어 반대말/비슷한말(동의어) 사전 사이트; English Thesaurus

영어 반대말/비슷한말(유의어;동의어) 사전을, 시소러스(Thesaurus) 라고 합니다.

동의어/반대말(반의어) 사전 중에서는 <웹스터 사전>이 좋습니다.

위의 사이트에서 Merriam-Webster Online Thesaurus 라고 된 입력창에 영어 단어를 입력하고 Go 버튼을 누르면 됩니다.

가령 hot 이라는 단어를 입력하면


Synonyms (동의어): broiling, burning, fiery, piping hot, red-hot...

Related Words (관련 단어): blazing, glowing, molten, sizzling; heated, overheated...

Near Antonyms (반대말에 가까운 말): chilly, cool, frosty, nippy, snowy, subzero, wintry; cooled...

Antonyms (반대말): arctic, chill, chilled, cold, freezing, frigid, frozen, glacial, ice-cold, iced, icy...

이렇게 출력됩니다.



오프라인 영어 역순 사전: ▶▶ 영어/영한 역순 사전, 접미사 순서로 찾기 Reverse Dictionary: English-Korean

자바/Java] System.out.format() 줄바꿈, 운영체제(OS) 종류에 맞게; line separator

이 해결법을 오늘에야 겨우 발견했습니다ㅠㅠ

문제는 이렇습니다.
System.out.format("%s\n"...
이렇게 \n 으로 출력하면 유닉스 스타일로 줄바꿈이 되어 버립니다. 리눅스/유닉스에서는 괜찮겠지만, 윈도우에서는 문제가 생깁니다.

그렇다고 해서
System.out.format("%s\r\n"...
이렇게 하면, 윈도우에서는 괜찮지만 리눅스/유닉스에서는 또 문제가 생깁니다.

따라서 운영체제의 종류에 맞게 자동으로 줄바꿈 문자를 삽입하는 포맷 지정자가 있어야 하는데 그것이 바로

%n

이었습니다. 그렇지만 %n 에 어떤 값을 대입해 줄 필요는 없고, 그냥 포맷 속에 %n 이라고 적기만 하면 됩니다.


자동 판단 줄바꿈 예제


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

    System.out.format("%s\n", "가나다라 (유닉스 줄바꿈)");

    System.out.format("%s%n", "가나다라 (자동 줄바꿈)");

  }
}


즉 \n 이 아닌, %n 을 사용하면 됩니다.



▶▶ 자바/Java] 현재 운영체제의 줄바꿈 문자 얻기; line.separator

☞ 자바(Java)

자바,Java] 숫자 소수점에 줄맞추어 출력; 소수점 정렬; Number Justify

임의의 자릿수를 가진 숫자, 특히 소수점이 있는 실수를 출력할 때, System.out.println() 메서드로 출력하면, 숫자 앞에 공백도 없고 소수점 개수도 들쭉날쭉하여 산만하게 출력됩니다.

이때는 System.out.format() 메소드를 사용하면 줄을 맞추어서 출력이 가능합니다. 자바 버전 1.5부터 지원됩니다.


숫자 폭, 소수점에 정렬하여 출력 예제 소스


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

    double d[] = { 1255.45, 78678.0, 45.045, 0, 0.455433, 11, 125.197642 };

    System.out.println("<산만하게 실수 출력>");
    for (int i = 0; i < d.length; i++)
      System.out.println(d[i]);



    System.out.println(); System.out.println(); System.out.println(); // 3줄 줄바꿈



    System.out.println("<줄 맞추어 깔끔하게 실수 출력>");
    for (int i = 0; i < d.length; i++)
      System.out.format("%18.7f%n", d[i]);


  }
}



출력 결과:
D:\Z>javac Foo.java && java Foo
<산만하게 실수 출력>
1255.45
78678.0
45.045
0.0
0.455433
11.0
125.197642



<줄 맞추어 깔끔하게 실수 출력>
      1255.4500000
     78678.0000000
        45.0450000
         0.0000000
         0.4554330
        11.0000000
       125.1976420

D:\Z>




System.out.format("%18.7f%n", d[i]);

"%18.7f%n"
이 부분이 출력 형식을 지정하는 부분입니다.

% 라는 것은 형식 지정이 시작된다는 뜻입니다.

18 이라는 것은, 앞쪽의 공백과 소수점을 포함하여 숫자가 차지하는 총자리수를 18자리로 지정한 것입니다.

.7 은 소수점 7자리까지 출력하라는 뜻

%n 은 현재 운영체제의 종류에 알맞게 줄바꿈하라는 뜻입니다.



☞ 자바(Java)

Saturday, October 28, 2006

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

숫자 123 과 문자열 "123"은 다릅니다.

숫자 123에 1을 더하면 124 가 되지만, 문자열 "123"에 1을 더하면 "1231"이 되어 버립니다.

따라서 문자열로 된 숫자가 숫자 구실을 하도록 하려면, 그 문자열을 숫자로 변환해 주어야 합니다.


문자로 된 숫자를, 진짜 숫자로 변환 예제


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


    String s = "1000";                      // 문자열 정의



    int i = Integer.parseInt(s) + 1;        // 32비트 정수로 그리고 1을 더하기
    System.out.println(i);                  // 출력: 1001



    long L = Long.parseLong(s) + 1;         // 64비트 정수로 그리고 1을 더하기
    System.out.println(L);                  // 출력: 1001


    float f = Float.parseFloat(s) + 1.0F;   // 32비트 실수로 그리고 1을 더하기
    System.out.println(f);                  // 출력: 1001.0


    double d = Double.parseDouble(s) + 1.0; // 64비트 실수로 그리고 1을 더하기
    System.out.println(d);                  // 출력: 1001.0

  }
}


전화 번호나 주민등록번호 등도 실은 숫자가 아니라 문자열입니다. 왜냐하면 전화번호에 1을 더하거나 하는 사칙연산을 해 봐도 아무 의미가 없기 때문입니다. 물론 더해지지도 않겠지요.



에러 처리


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

    String s = "1000.0";                      // 문자열 정의


    try {
      int i = Integer.parseInt(s) + 1;        // 32비트 정수로 그리고 1을 더하기
      System.out.println(i);
    } catch (NumberFormatException nfe) {
      System.err.println(nfe);
      System.exit(1);
    }

    // 에러: java.lang.NumberFormatException: For input string: "1000.0"

  }
}


소수점이 있는 문자열 "1000.0" 을, 정수로 변환하려 했기에 에러가 났습니다. 숫자로 변환할 수 없는 경우에는 NumberFormatException 이 발생합니다.

"문자로 된 숫자"에, 소수점이 있을 수도 있고 없을 수도 있는 경우에는, 다음과 같은 방법으로 이 문제를 해결할 수 있습니다.

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

    String s = "1000.539";                    // 문자열 정의

    int i = (int) Double.parseDouble(s) + 1;  // 실수로 변환 후, 정수로 캐스팅, 그리고 1을 더하기
    System.out.println(i);

  }
}


소수점이 있든 없든 아무 숫자로 된 문자열을, 정수 숫자로 변환하기 위해서는 위의 방법을 쓰면 됩니다.
우선 가장 "통이 큰" 숫자형인 Double 로 변환한 후, 그것을 최종적으로 정수로 변환하려면 (int) 이렇게 정수로 캐스팅을 해 줍니다. 다만 정수의 표현 범위를 넘어서는 숫자라면, 최종적인 정수의 값은 -2147483648 이렇게 되어 버립니다.


즉, parseInt() 는 "1000.0" 이런 실수 형식의 문자열을 받지 못하지만

parseDouble() 은 아무 형식이든 받을 수 있습니다.



▶▶ 자바,Java] 숫자를 문자열로 변환, 정수/실수 문자로; Number to String

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

☞ 자바(Java)

HTML-CSS] 메타 태그 종류; META TAG 목록

<meta /> 태그의 내용은 브라우저 화면에 출력되지 않지만, 브라우저에게 사이트의 정보를 알려주는 기능을 가집니다.

<meta /> 태그는 <head> </head> 사이에 들어가 있어야 합니다.


한국어 완성형(euc-kr) 페이지의 메타 태그 예제


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>mwultong의 소설  / / 경장편소설 - 영원히 낯모를 사람의 일화 / /</title>
<meta name="Description" content="mwultong의 소설들" />
<link rel="stylesheet" type="text/css" href="common.css" />
<link rel="stylesheet" type="text/css" href="index.css" />
<script type="text/javascript" src="lib.js"></script>
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<meta http-equiv="imagetoolbar" content="no" />
</head>

<body>
...


이렇게
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
현재 페이지의 인코딩을 알려주는 메타 태그가 가장 중요한 메타 태그입니다. charset=euc-kr 은 현재 페이지가 "한글 완성형"이라는 뜻입니다.

인코딩 메타 태그는, 타이틀 태그인 <title></title> 보다 위에 있어야 합니다. 그렇지 않으면 IE에서 웹페이지가 보이지 않는 경우가 있습니다. (▶▶ 블로거(blogger.com)의 인코딩 버그 완벽 해결법 참고)


<title>mwultong의 소설  / / 경장편소설 - 영원히 낯모를 사람의 일화 / /</title>
타이틀 태그는 "페이지 제목"입니다.


<meta name="Description" content="mwultong의 소설들" />
이것은 사이트나 페이지에 대한 "설명문"입니다. 되도록 짧고 명쾌한 설명이 좋습니다. 그렇지 않으면 검색엔진의 검색 결과에서, 페이지 본문이 나오지 않고, 이 설명문만 나오는 경우가 생깁니다.


<link rel="stylesheet" type="text/css" href="common.css" />
외부 CSS 파일을 불러옵니다.


<script type="text/javascript" src="lib.js"></script>
외부 자바스크립트 파일을 불러옵니다.


<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
사이트에 아이콘을 지정하는 것입니다. 파이어폭스에서만 잘 됩니다.


<meta http-equiv="imagetoolbar" content="no" />
인터넷 익스플로러(IE)에서, 그림 위에 마우스를 가져가면 툴바가 나타나서 성가신데, 이 태그는 그 툴바를 나오지 않게 합니다.


<body>
부터는 웹페이지 본문입니다.



유니코드(UTF-8) 페이지의 메타 태그 예제


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="Blogger" />
<link rel="alternate" type="application/rss+xml" title="mwultong Blog ― 소설 / IT" href="http://feeds.feedburner.com/mwultong" />
<title>mwultong Blog ― 소설 / IT</title>
<meta name="Description" content="소설 / IT" />
<meta http-equiv="imagetoolbar" content="no" />
<link rel="icon" type="image/png" href="http://photos1.blogger.com/blogger/2921/1916/1600/favicon.png" />
</head>

<body>
...


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...
이것은 메타 태그는 아닙니다. 현재 웹문서가 "XHTML 1.0 Strict" 규약에 맞추어져 있다는 뜻입니다. HTML 문법에도 버전이 있습니다. 현재 많이 쓰이는 버전이 XHTML 1.0 입니다.


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
사용된 언어를 지정한 것입니다. 한국어로 작성할 때도 그냥 영문(en)으로 하는 것이 무난했습니다. 물론 이것도 메타 태그는 아닙니다. 그냥 태그일 뿐입니다.


<meta http-equiv="Content-Style-Type" content="text/css" />
스타일이 CSS 형식이라는 뜻입니다. 꼭 필요하지는 않습니다.


<meta name="generator" content="Blogger" />
웹 페이지를 만든 도구나, 최종적으로 출력한 프로그램 이름입니다. 없어도 상관없습니다.


<link rel="alternate" ... href="http://feeds.feedburner.com/mwultong" />
현재 사이트의 RSS 등의 피드를, 브라우저나 RSS리더기에게 알려주는 것입니다. (▶▶ [HTML/CSS] 사이트 피드 자동검출/자동인식(Autodiscovery) 태그 수정하기 참고)
피드를 제출하는 사이트일 경우에는 매우 중요한 태그입니다.




그밖의 메타 태그


<meta name="keywords" content="소설,문학,단편소설">
이렇게 검색엔진에게, 참고할 검색어를 알려주는 태그도 있는데 이제는 쓰이지 않습니다.

<meta name="Robots" content="noindex, nofollow" />
검색엔진에게, 현재 페이지를 검색 대상에서 제외하도록 지시하는 태그입니다.




▶▶ Favicon (파비콘;사이트 아이콘) 넣는 법, Site Icon HTML Tag(태그); favicon.ico

Perl] 숫자 한글 발음으로 읽기, 한글 변환; Number To Korean; Spell Out

예를 들어 아라비아 숫자 "12345"를, "일만이천삼백사십오"로 변환하는, num2ko.pl 이라는 이름의 펄 프로그램입니다. 무한에 가까운 엄청나게 큰 숫자까지도 셀 수 있습니다.

9가 무려 72개 있는 거대한 숫자를 한글로 읽는 예입니다:
D:\Z>num2ko.pl 99999999999999999999999999999999999999999999999999999999999999999
9999999
구천구백구십구無量大數구천구백구십구不可思議구천구백구십구那由他구천구백구십구阿
僧祇구천구백구십구恒河沙구천구백구십구極구천구백구십구載구천구백구십구正구천구백
구십구澗구천구백구십구溝구천구백구십구양구천구백구십구자구천구백구십구해구천구백
구십구경구천구백구십구조구천구백구십구억구천구백구십구만구천구백구십구


다만, 溝(구)는 9(구)와 혼동되기에, 한자로 표시했고, 溝(구)보다 더 큰 숫자도 한글로 표현하면 가독성이 떨어져서 한자로 나타내었습니다.

물론 현실 세계에서는 "京(경)"을 초과하는 단위, 즉 "해(垓)"부터는 사용되지 않습니다. 그리고 秭(자)라는 글자는 한국어 인코딩으로는 표현되지 않아서, 한글로 "자"라고 쓸 수밖에 없었습니다.


num2ko.pl 은, "Lingua::JA::Number" 라는 CPAN 모듈을, 한국어에 맞게 개조하여 만든 것입니다: ▶▶ 펄/Perl] 아라비아 숫자를, 일본어 숫자 읽기 발음으로 변환, Lingua-JA-Number



아라비아 숫자를 한글로 변환 프로그램


파일명: num2ko.pl
#!/usr/bin/perl
use strict; use warnings;


  &help if $#ARGV == -1;

  my %N2K = qw( 1 일 2 이 3 삼 4 사 5 오 6 육 7 칠 8 팔 9 구 10 십 100 백 1000 천 );
  my @N2K_BLOCK = ("", "만", "억", "조", "경", "해", "자", "양", "溝", "澗", "正", "載", "極", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大數");


  print &numberToKorean(@ARGV), "\n";




sub numberToKorean {
  my $n = join "", @_;               # 모든 파라미터 합치기 (공백 넣은 숫자 처리 위해)

  my @sign = $n =~ /(^[+-]?)/;       # +- 부호 있으면 저장

  my @fraction = $n =~ /(\.\d.*$)/;  # 소수점 이하 저장
  $n =~ s/(\.\d.*$)//;               # 소수점 이하 삭제



  $n =~ s/\D//g;                     # 숫자 속의 쉼표 등, 숫자가 아닌 문자는 모두 제거

  return ""   if $n eq "";           # 숫자가 없으면 빈 문자열 반환

  # 0 이면 "영"을 반환
  return join("", @sign, "영", @fraction) if $n == 0;


  $n =~ s/^0{1,}//g;                 # 앞쪽에 붙은 0 모두 제거

  # 999999999999999999999999999999999999999999999999999999999999999999999999 (구천구백구십구無量大數...) 초과할 때
  return join("", @sign, "[ ", length($n), " 자리 숫자 ]", @fraction) if length($n) > 72;




  my @result;

  $n      = reverse $n;
  my $bix = 0;

  while ($n =~ /(\d{1,4})/g) {
    my $b = scalar reverse($1);
    my @r = blockof4_to_string($b);

    push @r, $N2K_BLOCK[$bix] if ($bix && @r);

    unshift @result, @r;
    $bix++;
  }

  return join "", @sign, @result, @fraction;
}


sub blockof4_to_string {
  my $n = shift;

  return undef if $n > 9999 or $n < 0;
  return "" unless $n;

  my @result  = ();
  my @digits  = split //, sprintf("%04d", $n);
  my @weights = (1000, 100, 10, 1);

  for my $i (0..3) {
    next unless $digits[$i];
    my $v = $digits[$i] * $weights[$i];
    push @result, $N2K{$v} || ($N2K{$digits[$i]}, $N2K{$weights[$i]});
  }

  return @result;
}


sub help {
  die <<TEXT;

                 아라비아 숫자를 한글 발음으로 변환 출력 v1.0

             ( Original Source: "Lingua::JA::Number" from CPAN )



                       사용법 : num2ko.pl <number>



                                사용 예제
..............................................................................
num2ko.pl 12345                 num2ko.pl 1111111111111
num2ko.pl 12,345                num2ko.pl 1,111,111,111,111
num2ko.pl 12 345                num2ko.pl 1 111 111 111 111
num2ko.pl 1,2345                num2ko.pl 1,1111,1111,1111
num2ko.pl 1_2345                num2ko.pl 1_1111_1111_1111

일만이천삼백사십오              일조천백십일억천백십일만천백십일

..............................................................................
num2ko.pl 94653744647457537433652113614151363276249302490701430870312503074407
9053

구천사백육십오無量大數삼천칠백사십사不可思議육천사백칠십사那由他오천칠백오십삼
阿僧祇칠천사백삼십삼恒河沙육천오백이십일極천삼백육십일載사천백오십일正삼천육백
삼십이澗칠천육백이십사溝구천삼백이양사천구백칠자백사십삼해팔백칠십경삼천백이십
오조삼백칠억사천사백칠만구천오십삼
..............................................................................
구 간 정 재 극 항하사 아승기 나유타 불가사의 무량대수
溝 澗 正 載 極 恒河沙 阿僧祇 那由他 不可思議 無量大數
TEXT
}


사용법은 쉽습니다. num2ko.pl 뒤에 아라비아 숫자를 적어 주면 됩니다.


실행 결과:
D:\Z>num2ko.pl 0


D:\Z>num2ko.pl 1


D:\Z>num2ko.pl 2


D:\Z>num2ko.pl 10


D:\Z>num2ko.pl 11
십일

D:\Z>num2ko.pl 111
백십일

D:\Z>num2ko.pl 5479341634
오십사억칠천구백삼십사만천육백삼십사

D:\Z>num2ko.pl 999999999999
구천구백구십구억구천구백구십구만구천구백구십구

D:\Z>num2ko.pl 100000000000000
백조

D:\Z>num2ko.pl 1000000000000000000
백경

D:\Z>num2ko.pl 100000000000000000000
일해

D:\Z>num2ko.pl 1000000000000000000000000
일자

D:\Z>num2ko.pl 10000000000000000000000000
십자

D:\Z>num2ko.pl 55555555555555555555555
오백오십오해오천오백오십오경오천오백오십오조오천오백오십오억오천오백오십오만오천
오백오십오

D:\Z>num2ko.pl 5315813753750135731085631086539367311
오澗삼천백오십팔溝천삼백칠십오양삼천칠백오십자천삼백오십칠해삼천백팔경오천육백삼
십일조팔백육십오억삼천구백삼십육만칠천삼백십일

D:\Z>num2ko.pl 10000000000000000000000000000000000000000000000000000000000000000
0000000
천無量大數

D:\Z>num2ko.pl 11111111111111111111111111111111111111111111111111111111111111111
1111111
천백십일無量大數천백십일不可思議천백십일那由他천백십일阿僧祇천백십일恒河沙천백십
일極천백십일載천백십일正천백십일澗천백십일溝천백십일양천백십일자천백십일해천백십
일경천백십일조천백십일억천백십일만천백십일

D:\Z>num2ko.pl 99999999999999999999999999999999999999999999999999999999999999999
9999999
구천구백구십구無量大數구천구백구십구不可思議구천구백구십구那由他구천구백구십구阿
僧祇구천구백구십구恒河沙구천구백구십구極구천구백구십구載구천구백구십구正구천구백
구십구澗구천구백구십구溝구천구백구십구양구천구백구십구자구천구백구십구해구천구백
구십구경구천구백구십구조구천구백구십구억구천구백구십구만구천구백구십구

D:\Z>num2ko.pl 99999999999999999999999999999999999999999999999999999999999999999
99999999999999999999999999999999999999999999999999999999999999999999999999999999
99999999999
[ 156 자리 숫자 ]

윈도우용 펄인 액티브펄(ActivePerl)로 실행한 결과입니다.



숫자 읽기 프로그램을 만들기 위해 한달 가까이 고생을 좀 했습니다. 숫자 읽기라는 것이 "자연어 처리"에 가까운 것이라서 의외로 어려웠습니다.

다행히 CPAN의 "Lingua::JA::Number" 에서 좋은 알고리즘을 발견했습니다.

숫자 한글로 읽기 알고리즘들에는

* 너무 복잡

* 부자연스럽게 읽기 (1010 을 "천십"으로 읽지 않고, "일천일십"으로 읽는 등)

* 버그 (10000 단위 이상을 읽을 수 없는 등)

같은 문제들이 많이 있었습니다. 그렇지만 "Lingua::JA::Number" 알고리즘에서는 그런 문제가 없고 거의 완벽했습니다. 다만 "Lingua::KO::Number" 모듈이 없어서, "Lingua::JA::Number" 를 한글 환경에 맞게 개조를 했습니다.


제가 충분히 디버깅을 했지만 무슨 미묘한 버그가 있을지 모르겠습니다. 실무에 사용할 때에는 충분한 테스트가 필요합니다.



큰 숫자 단위표: ▶▶ 만,억,조,경,해,자,양,구,간,정,재,극,항하사,아승기,나유타,불가사의,무량대수;Large Number

▶▶ Perl/펄] 숫자를 영어 스펠링으로 변환; 영어식으로 읽기; Number to English

☞ Perl(펄)

☞ 오피스(Office)/엑셀(Excel)/워드(Word)

리눅스용 포토샵] 사진/그림 편집 프로그램; 김프(Gimp)

물론 진짜 포토샵(Adobe Photoshop)은 아니고, 리눅스에서 포토샵 대용으로 쓰는 그림 편집 프로그램이 바로 김프(Gimp)입니다.

포토샵과 달리 무료로 배포됩니다. 포토샵에 비하면 전문성과 퀄러티가 좀 부족하지만, MS윈도우의 "그림판"보다는 당연히 좋습니다.


김프(Gimp)
김프(Gimp): LINUX의 사진/그림 편집 소프트웨어 (클릭하면 확대)

우분투의 그놈(gnome) 환경에서 실행한 김프의 스크린샷입니다. 우분투 리눅스 Desktop 을 설치하면 김프도 같이 설치됩니다. (▶▶ [QnA] 우분투 리눅스 다운로드 하는 곳과 방법은? - Ubuntu Linux Download)

위의 그림 맨 좌측의 김프 라는 창이 바로 김프의 본체입니다. 우측의 다른 창들은 모두 본체에 부속된 창입니다.




다음 주소에서 별도로 김프를 다운로드받을 수도 있습니다.

리눅스용 김프 홈페이지: <GIMP(The GNU Image Manipulation Program)>

윈도우용 김프 다운로드: <GIMP for Windows>





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

☞ 포토샵 (Adobe Photoshop)

☞ 소프트웨어

펄/Perl 정규식] 문자열 추출; Regex String Extract Example

문자열에서, 정규식에 매치되는 특정 부분만 뽑아내어 배열에 저장하는 방법입니다.

my @array = $str =~ /어떤정규식/;

이것은 $str 이라는 문자열에서, 정규식에 매치되는 부분만, @array 라는 배열에 집어 넣는 것입니다.


기본 변수인 $_ 에 문자열이 들어 있다면

my @array = /어떤정규식/;

이렇게 해도 됩니다.


정규식으로 문자열 추출 예제 (숫자와 알파벳만 추출)


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

  # 문자열 정의
  my $str = "맹구는 35점을 받고, 철수는 Soju를 60병 마셨습니다. 동수는 456번 BUS를 타고 집에 갔습니다.";


  # 문자열에서 정규식으로 특정 문자열 추출하여 배열에 넣기
  my @array = $str =~ /\d+|[a-z|A-Z]+/g;



  print $_, "\n" foreach(@array); # 배열 출력

  # 출력 결과:
  ####################
  # 35
  # Soju
  # 60
  # 456
  # BUS
  ####################



단, 정규식에서 소괄호를 사용하면 Use of uninitialized value in print at D:\Z\0.pl line 13. (초기화되지 않은 값을 출력) 이런 워닝이 나올 수가 있습니다.





위의 예제는 특정 패턴의 데이터를 추출하는 것이고, 임의의 문자열을 추출하려면 여기에 있는 방법을 사용합니다: ▶▶ Perl/펄 정규식] HTML 태그 속의 텍스트, URL 링크 추출; Regex



Friday, October 27, 2006

엑셀] 헥사(16진수Hex)를 아스키(ASCII)문자로 변경; Excel Hex to ASCII Char

우선 10진수 숫자를 문자로 변환하는 방법부터 설명합니다.

아스키 코드에서, 알파벳 대문자 Z는, 10진수로 90번이기에

엑셀의 셀에,
=CHAR(90)
이런 수식을 적어 주면, 셀에 Z 라는 글자가 찍힙니다.

CHAR() 함수 는, 문자 번호에 해당하는 문자를 출력합니다.



16진수 헥사(Hex)를 아스키로 변환


알파벳 대문자 Z의 아스키 코드는 십육진수로 5A 인데, CHAR() 함수는 10진수만 입력받기에, 먼저 16진수를 10진수로 변환해 주어야 합니다.

16진수를 10진수로 변환하려면 HEX2DEC() 함수를 사용합니다. 그런데 이 함수를 사용하기 위해서는

엑셀 메뉴: 도구 > 추가 기능
에서 분석 도구라는 항목에 반드시 체크해야 합니다.


=CHAR(HEX2DEC("5A"))
이제 위와 같이 하면,

16진수 숫자 5A 가, 10진수 90으로 변환된 후
90이 결국 문자 Z로 변환됩니다.


그리고 HEX2DEC() 함수의 파라미터는
HEX2DEC("5A")
이렇게 쌍따옴표로 둘러싸 주어야 합니다. 그렇지 않으면 에러가 납니다.


☞ 오피스(Office)/엑셀(Excel)/워드(Word)

자바 Java] 배열을 문자열로 변환/합치기; Array to String

배열을 System.out.println() 으로 출력하려면, Arrays.toString() 메서드를 사용해 문자열로 변환해야 합니다. 배열 요소를 쉼표로 구분하여 보기 좋게 변환해 줍니다.


JAVA: 배열(Array)을 문자열(String)로 출력 예제 소스


파일명: Foo.java
import java.util.Arrays; // 필요

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

    int i[] = { 5, 25, 47, 8, 15, 8446, 666 };
    System.out.println(Arrays.toString(i));


    String s[] = { "자장면", "탕수육", "짬뽕", "우동", "군만두" };
    System.out.println(Arrays.toString(s));


    char c[] = { '똠', '방', '각', '하' };
    System.out.println(Arrays.toString(c));

    // 이번에는 변수에 넣어서
    String s3 = Arrays.toString(c);
    System.out.println(s3);

  }
}



화면 출력 결과:
D:\Z>javac Foo.java && java Foo
[5, 25, 47, 8, 15, 8446, 666]
[자장면, 탕수육, 짬뽕, 우동, 군만두]
[똠, 방, 각, 하]
[똠, 방, 각, 하]

D:\Z>



☞ 자바(Java)

자바 Java] 배열 요소 개수 구하기; Number of Array Elements

배열명에 length 를 붙여 주면, 배열 요소의 개수를 반환합니다.


JAVA: '배열 요소의 수' 출력 예제 소스


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

    ////////////////////////////////////////////////////////////////////
    int i[] = { 5, 25, 47, 8, 15, 8446, 666 };

    // 배열의 개수 출력
    System.out.println(i.length);        // 출력 결과: 7

    // 배열의 가장 마지막 요소 출력
    System.out.println(i[i.length - 1]); // 출력 결과: 666




    ////////////////////////////////////////////////////////////////////
    String s[] = { "자장면", "탕수육", "짬뽕", "우동", "군만두" };

    // 배열의 개수 출력
    System.out.println(s.length);        // 출력 결과: 5

    // 배열의 가장 마지막 요소 출력
    System.out.println(s[s.length - 1]); // 출력 결과: 군만두

    // 배열의 첫번째 요소 출력
    System.out.println(s[0]);            // 출력 결과: 자장면




    ////////////////////////////////////////////////////////////////////
    char c[] = { '똠', '방', '각', '하' };

    // 배열의 개수 출력
    System.out.println(c.length);        // 출력 결과: 4

    // 배열의 가장 마지막 요소 출력
    System.out.println(c[c.length - 1]); // 출력 결과: 하

    // 배열의 첫번째 요소 출력
    System.out.println(c[0]);            // 출력 결과: 똠

  }
}




▶▶ Java/자바] 배열 사이즈 구하기; 배열 크기 얻는 함수는? Array Size; sizeof

▶▶ Java/자바] 문자열 길이, 사이즈(글자 개수) 구하기; Get String Size

☞ 자바(Java)

엑셀 셀 병합: 여러 셀(Cell) 하나로 합치기; Excel Merge Cells

엑셀 메뉴: 도구 > 사용자 지정
을 선택하면 나오는 대화상자에서, 명령 탭을 클릭하고,

범주 / 서식 을 선택한 후, 우측 "명령" 창에서

병합하고 가운데 맞춤 이라는 항목을 선택합니다.

그런 후 병합하고 가운데 맞춤 항목을 마우스로 드래그하여, 엑셀 상단 툴바의 적당한 곳에 끌어다가 내려 놓습니다.

"닫기"를 누릅니다. 다음 그림과 같습니다. 즉 아이템을 마우스로 직접 이동시키는 것입니다.

엑셀 셀 병합: Excel Merge Cells

엑셀 셀 병합: 클릭하면 확대

이제 합칠 셀들을 선택하고, 빨간 화살표가 가리키는 "병합하고 가운데 맞춤" 아이콘을 클릭하면 셀들이 합쳐집니다.


다만, 셀을 합치면, 가장 왼쪽 상단 셀의 값만 온전히 남아 있고, 병합된 다른 셀의 값은 지워지고 또한 접근이 불가능하게 됩니다.


셀의 내용이 "가운데 정렬"이 되는데, "왼쪽 맞춤" 아이콘 등의 정렬 아이콘으로 조정할 수 있습니다.



합쳐진 셀의 주소는?


병합된 셀의 가장 좌측 상단의 주소가 사용됩니다.


합쳐진 셀 다시 나누기


병합된 셀을 선택한 후, 아까 합칠 때 사용한 그 아이콘을 다시 클릭하면 나누어집니다. 만약 실수로 나누어 버렸을 때에는 Ctrl+Z키를 누르면 나누기를 취소할 수 있습니다.




▶▶ Excel/엑셀] 셀 기본 테두리 없애는 법, 경계선 제거; Remove Cell Border

엑셀 셀 테두리: 굵게 변경, 점선, 빗금 넣기; Excel Cell Border Style

셀의 테두리를 변경할, 하나 또는 여러 개의 셀을 마우스로 선택합니다.

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

테두리 라는 탭을 클릭합니다.

그러면 다음과 같은 대화상자가 나옵니다:

엑셀: 셀 서식 대화상자 (테두리)
엑셀: 셀 서식 대화상자 (테두리)

위의 대화상자 우측의 선/스타일 이라는 곳에서, 테두리의 종류를 선택합니다. 예를 들어 가장 굵은 선을 선택합니다.

지금 선택한 선의 종류를 테두리의 어떤 곳에 지정할지 엑셀에게 알려주어야 합니다.

미리 설정/윤곽선 이라는 아이콘을 누릅니다.

확인 버튼을 누르면 현재 선택되어 있는 셀의 테두리가 굵게 될 것입니다.

만약 선의 종류를 "점선"으로 선택했다면 테두리가 점선으로 됩니다.


셀의 어느 한쪽 변만, 스타일을 지정하고 싶다면, 테두리 라는 항목 밑에 있는 작은 아이콘을 선택합니다. 여러 개 선택할 수 있고, 변마다 다른 스타일을 적용할 수도 있습니다. 약간만 연습해 보면 아주 쉽게 할 수 있습니다.





셀 안에 빗금 치기


테두리 항목 밑의 작은 아이콘들 중에, 사선으로 된 아이콘이 2개 있습니다. 그 중의 하나를 클릭하면 됩니다.





▶▶ Excel/엑셀] 셀 기본 테두리 없애는 법, 경계선 제거; Remove Cell Border

▶▶ 엑셀VBA매크로.예제: 셀 테두리에 색상 지정, 행운의 시트 만들기, Excel Sheet of Fortune

☞ 오피스(Office)/엑셀(Excel)/워드(Word)

Thursday, October 26, 2006

유닉스/리눅스 파일명 변경; Unix Linux File-Name Rename

리눅스에서는 mv 라는 명령을 사용하여, 파일명을 변경합니다. mv 는 move 즉 파일을 이동시키는 명령이지만, 파일명을 변경하는 기능도 있습니다.

mv a.out aa.out

이것은 a.out 이라는 파일의 이름을 aa.out 으로 변경하는 것입니다.



파일 이름, 여러 개 한꺼번에 일괄 변경하는 명령


우분투 리눅스에는 rename이라는, 펄 스크립트로 된 명령이 있는데, 이것은 정규식(Regex)을 사용하여, 여러개의 파일명을 한꺼번에 치환하는 것입니다. (☞ Perl(펄)이 설치되어 있어야 rename 명령이 실행됩니다.)

rename 's/.txt$/.doc/' *

.txt 확장자를 가진 파일들의 확장자를 .doc 으로 변경하라는 명령입니다.

README.txt
FOO.txt

등의 파일명이

README.doc
FOO.doc

이렇게 한꺼번에 변경됩니다.




우분투에 또한 gcc 를 설치해야 rename 명령을 사용할 수 있습니다. 개발도구 꾸러미 속에 들어 있더군요: ▶▶ 우분투.리눅스] gcc 설치하기/C컴파일러 설치법, Ubuntu Linux gcc Install


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

유니코드(Unicode), 아스키(ASCII; 한글완성형) 차이/차이점; Unicode ASCII Difference

유니코드(Unicode)이든 아스키(ASCII) 텍스트든, 모두 파일에 글자들을 표현하는 방식입니다.

아스키(ASCII) 텍스트 / 한글 KS완성형(euc-kr)


* 현재 사용되는 아스키(ASCII) 코드의 더 정확한 이름은 ANSI Code 입니다. (색깔을 나타내는 앤시 코드가 아니고 문자를 나타내는 규약입니다.)

* 영문/숫자 1글자는 1바이트, 한글/한자 1글자는 2바이트입니다.

* 하나의 인코딩당, 영문과 또다른 하나의 언어만 사용할 수 있습니다. 한국어 아스키 코드인 완성형(euc-kr) 인코딩에서는 영문과 한글 그리고 한국에서 사용되는 한자만 표현할 수 있습니다. 물론 일본어 가나도 섞여 있지만, 일본어 인코딩이 아니기에 일본인은 읽을 수 없습니다.

그래서 하나의 파일에 여러 언어를 동시에 표현하기 힘들거나 불가능합니다.

* 컴퓨터 초창기부터 사용되어 왔기에, 호환성이 아주 좋습니다.

* MS윈도우2000/XP이상의 운영체제에서는, 내부적으로 유니코드를 사용하지만, 사용자가 실제 읽고 쓰는 텍스트 문서는 대부분 아스키 코드입니다.



유니코드(Unicode / UTF-8) 텍스트


* 영문/숫자/한글/한자 등 모든 글자는 이론적으로 2바이트입니다. 그리고 파일에 저장될 때도 2바이트로 저장됩니다.

아주 희귀한 문자들은 2바이트를 초과할 수도 있습니다.

단, UTF-8 유니코드가 파일에 저장될 때, 영문/숫자는 아스키 코드와 똑같이 1바이트를 사용하고, 한글 등은 3바이트로 파일에 저장됩니다. UTF-8 유니코드는 아스키 코드와 영문 영역에서는 100% 호환됩니다. 만약 UTF-8 유니코드 문서에 한글 등이 전혀 없고, 영문과 숫자로만 이루어져 있다면, 그 파일은 아스키 코드와 동일합니다.

웹페이지를 유니코드로 만들 때에는 UTF-8 유니코드를 사용합니다.


* 전세계의 모든 언어를 하나의 파일에 쓸 수 있습니다. 물론 각 언어에 해당하는 폰트가 설치되어 있어야 합니다.

* 유니코드의 역사가 그리 오래되지 않아서, 아직도 유니코드를 잘 인식하지 못하는 컴퓨터가 있습니다. 특히 윈도우98이나 오래된 유닉스 시스템의 경우입니다. 그렇지만 유니코드로 작성된 인터넷 웹페이지는 대부분 잘 인식합니다.



참고로, 저의 이 블로그(http://mwultong.blogspot.com/)도, 유니코드(UTF-8)로 되어 있습니다.


▶▶ 일반 유니코드(Unicode)와 'UTF-8 유니코드'의 차이

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

☞ HTML/CSS/JavaScript

배치 파일] 변수에 현재 시간/날짜 넣기; 날짜/시간 출력, DATE TIME DOS BATCH

배치 파일에서는 %date% 와 %time% 이라는 기본 환경변수로 날짜와 시간을 얻을 수 있습니다. (단, 윈도98에서는 안되고, 윈도우2000 / 윈도우XP 이상이어야 합니다.)


배치파일 오늘 날짜 현재 시간 출력 예제


예제 배치 파일명: 0.bat
@echo off

echo %date% %time%

echo.

echo 현재 날짜는 "%date%" 이고 현재 시각은 "%time%" 입니다.

echo.


(참고로, echo. 이 줄은 빈줄을 넣는 것입니다.)



위의 배치 파일 실행 결과:
D:\Z>0.bat
목 2006-10-26 13:13:27.01

현재 날짜는 "목 2006-10-26" 이고 현재 시각은 "13:13:27.02" 입니다.

D:\Z>


날짜와 시간이 출력되었습니다.




▶▶ 배치파일] 요일 출력, 오늘 현재 요일만 구하기; Get DAY OF THE WEEK String

▶▶ 배치파일] 요일 삭제, 날짜 문자열에서 요일 지우기; Remove DAY OF THE WEEK from Date String

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

C언어] 파일 크기/사이즈; 파일 길이 함수 VC++ Get File Size Function

파일 길이, 즉 "파일 사이즈"를 바이트로 구하는 방법입니다. 비주얼C (VC++) 용입니다.

_stati64() 함수는 파일에 대한 각종 정보를 얻는 함수인데, 파일 용량도 포함되어 있습니다.

64비트 정수를 다룰 수 있도록 했기 때문에, "6.22GB (6,689,140,736 바이트)"의 거대한 파일 사이즈도 측정할 수 있습니다.
6689140736 bytes
이렇게 출력됩니다.


다음의 예제 소스는 현재 디렉토리의 test.jpg 라는 파일의 크기를 출력합니다. "test.jpg" 라는 부분을 현재 디렉토리의 아무 파일명으로 교체한 후 실행하면 됩니다.

파일 사이즈 얻기 예제 소스


파일명: 0.cpp
#include <stdio.h>
#include <sys/stat.h> // _stati64()

__int64 getFileSize(char *filename);


int main(void) {

  char s[] = "test.jpg";

  printf("%s : %I64d bytes\n", s, getFileSize(s));

  return 0;
}


__int64 getFileSize(char *filename) {
  struct _stati64 statbuf;

  if ( _stati64(filename, &statbuf) ) return -1; // 파일 정보 얻기: 에러 있으면 -1 을 반환

  return statbuf.st_size;                        // 파일 크기 반환
}




컴파일 및 실행 결과:
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
test.jpg : 14124 bytes

D:\Z>



☞ C/C++

울트라에디트 배경색 글자 색깔 변경; 검정 바탕, UltraEdit Color

울트라에디터 메뉴에서

View (보기) > Set Colors (컬러 지정)

를 선택하면, 다음과 같은 "컬러 지정 대화상자"가 나옵니다.


UltraEdit Color: 울트라에디트 색깔 지정

울트라에디트 색깔 지정 메뉴: 옆으로 스크롤 가능


Edit Window (편집창 색깔)


* 이 편집창 항목의 색이 가장 중요합니다.

Text : 글자색 (현재 검정)

Background : 바탕색 (현재 밝은 분홍)

Selected Text : 선택했을 때의 글자색 (현재 흰색)

Sel. Text Background : 선택했을 때의 배경색 (현재 밝은 커피색)




Active Line (현재 줄의 색상)


* 현재 커서가 위치한 라인의 색입니다.

Text : 글자색 (현재 검은색)

Background : 바탕색 (현재 밝은 파랑)

Enable Active Line Coloring: 이곳에 체크해야 현재 줄의 색을 바꿀 수 있음




원래의 기본값으로 돌리기


"Use Default" 버튼을 누르면 원래의 색상으로 돌아갑니다.




문법 강조 (구문 강조)


* 울트라에디터 편집창 자체의 색이 아닌, 프로그래밍 언어에서 키워드 등의 색깔을 달리 하고 싶을 때에는 "문법 강조"를 하면 됩니다.

C/C++ Java Perl HTML CSS 등의 널리 쓰이는 언어는 기본적으로 문법 강조를 해주지만, 다른 언어들은 wordfile.txt 를 편집해야 합니다.


▶▶ 문법 강조 (구문강조;Syntax Highlighting) 란? - 색깔로 프로그래밍 언어의 키워드/문자열/숫자 구분

▶▶ 울트라 에디트] 색깔로 문법 강조(구문 강조), 새 언어 추가 - UltraEdit, Syntax Highlighting 울트라 에디터

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

Wednesday, October 25, 2006

자바 Java] CRC32 구하기 소스, 파일 CRC 값 계산 출력

옵션으로 지정해준 파일의 CRC32 값을 구하는 자바 소스입니다. 자바에 내장되어 있는 java.util.zip.CRC32 클래스로 값을 얻습니다. ZIP 이나 RAR에서 사용되는 CRC32 값과 동일한 값을 얻을 수 있습니다.

이 자바 프로그램으로, 675MB 크기 파일의 CRC32 를 구하는 데, 16초 걸렸습니다.

순수한 C로 작성된 CRC32 프로그램으로는 15초 걸렸습니다. 약간 차이는 있지만, 속도는 아주 빠릅니다.


JAVA: 파일의 CRC32 값 얻기 소스 코드


소스 파일명: GetCRC32.java
import java.io.*;
import java.util.zip.*;


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

    // 파일명을 옵션으로 주지 않으면 에러 내고 종료
    if (args.length != 1) {
      System.err.println("Usage: java GetCRC32 <input filename>");
      System.exit(1);
    }

    // CRC32 값과 파일명 화면에 출력
    System.out.format(
                               "%08X : %s%n",
                      getCRC32Value(args[0]),
                                     args[0]
                      );

  }




  public static long getCRC32Value(String filename) {
    Checksum crc = new CRC32();

    try {
      ////////////////////////////////////////////////////////////////////////////////
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename));
      byte buffer[] = new byte[32768];
      int length = 0;

      while ((length = in.read(buffer)) >= 0)
        crc.update(buffer, 0, length);

      in.close();
      ////////////////////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e);
        System.exit(2);
    }
    return crc.getValue();
  }

}



컴파일 및 실행 결과:
D:\Z>javac GetCRC32.java

D:\Z>java GetCRC32 0.exe
FE4186B2 : 0.exe

D:\Z>

0.exe 라는 어떤 파일의 CRC32 값이 FE4186B2 라고 나오고 있습니다.


D:\Z>javac GetCRC32.java && java GetCRC32 "사본 - test.jpg"
6E17BBC0 : 사본 - test.jpg

D:\Z>

공백과 한글이 들어간 파일명도, 큰따옴표로 둘러싸 주면 잘 작동합니다.


☞ 자바(Java)

WinHex 사용법, WinHex(윈헥사) 실행법

(WinHex v13.4 버전을 기준으로 설명)

윈헥사를 처음 실행하면 나오는 대화상자에, Write protection by default (쓰기 방지) 이런 읽기 전용 옵션이 있는데, 이 옵션을 켜면 편집이 저장되지 않습니다. OFF 상태로 놔두는 것이 좋습니다.

좀 큰 파일을 편집하려고 불러오면 With this evaluation version you cannot save file that are larger than 200KB... 이런 메시지가 나옵니다. 무료로 다운받은 평가판은, 200KB 이상 크기의 파일을 저장할 수 없다는 내용입니다. 아주 작은 파일들만 헥사 편집을 할 수 있고 좀 큰 파일은 윈헥사에 유료로 등록을 해야 저장할 수 있습니다. 이것이 중요한 부분입니다.


윈헥사로 파일을 편집하는 방법은 다른 헥사에디터들과 같습니다. 헥사 에디터로 파일을 편집하는 방법은 여기에 있습니다: ▶▶ 헥사 코드 편집법 / 헥사 에디터(Hex Editor) 사용법 기초


파일을 편집하고, Ctrl+S키를 눌러 저장하려고 하면, 일일이 Are you sure you want to update ...? (파일을 정말 저장하시겠습니까?) 라고 물어봅니다. "Yes"를 클릭해야 편집한 내용이 파일에 저장됩니다.




WinHex 환경 설정


WinHex는 영문 폰트가 지정되어 있기에, 한글이 잘 나오지 않을 것입니다.

메뉴: Options (옵션) > General (일반)
로 환경설정창을 엽니다.

Font: Courier 라고 된 곳의 우측의 작은 버튼을 누르고, 폰트를 "돋움체"로 지정해 주고, 현재 파일을 닫고 다시 부르면, 한글이 잘 보일 것입니다.

그렇지만 이렇게 해도 한글과 궁합이 잘 맞지 않는 경우기 있더군요.


▶▶ [QnA] 헥사 에디터란? 좋은 헥사 에디터(Hex Editor)는? : WinHex

☞ 소프트웨어

엑셀/Excel] 시트에 현재 날짜와 시간 입력하는 핫키, Put Date Time

Ctrl + ;

키보드의 Ctrl키를 누르면서, 세미콜론(;)을 누릅니다. 그런 후, Enter키를 칩니다.
현재 날짜가 2006-10-25 이런 식으로 입력됩니다.

셀 서식을 변경하면
2006년 10월 25일 수요일
이런 식으로도 바꿀 수 있습니다.




Ctrl + Shift + ;

키보드의 Ctrl키와 Shift키를 동시에 누르면서, 세미콜론(;) 키를 누르는 것입니다.
현재 시각이 2:44 PM 이런 식으로 입력됩니다.

셀 서식을
h"시" mm"분"
이렇게 변경하면,
14시 44분
이렇게도 표현됩니다.




같은 셀에, 날짜와 시간 동시에 찍기


2006-10-25 2:44 PM
이렇게 날짜와 시간을 함께 표현하기 위해서는

Ctrl+; 을 눌러 우선 날짜 문자열을 찍은 후,
키보드의 스페이스 바를 눌러 한칸 띄어쓰기 한 후,
Ctrl+Shift+; 을 눌러 현재 시각을 찍으면 됩니다.





위의 방법으로 입력한 날짜와 숫자는, 갱신되지 않고 영원히 고정되어 있습니다.



▶▶ Excel 엑셀] 년월일 시분초 구하기 함수, 년 월 일 시 분 초 추출; Date Time Function

C언어] 정수를 문자로 변환 출력 예제 소스; print int to char

123 같은 숫자를 "123" 같은 문자열로 완전히 변환하여, 숫자로서의 기능을 없애려면, 여기에 방법이 있습니다: ▶▶ [C언어] 숫자(정수;int, long, unsigned long)를 문자열로 변환하는 함수 - itoa()

이것은 정수의 값에 해당되는 문자를 출력하는 방법입니다.

글자들에는 번호가 매겨져 있기에 당연히 숫자로 문자를 출력할 수 있습니다.


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

int main(void) {

  int i = 0x41; // 알파벳 대문자 A 의 아스키 코드는 16진수로 41
  int j = 66;   // 알파벳 대문자 B 의 아스키 코드는 10진수로 66

  printf("%c %c\n", i, (char)j);

  // 출력 결과: A B

  return 0;
}


printf 함수에, %c 라는 포맷을 사용하면, 숫자의 값에 해당하는 문자가 출력됩니다.

int 의 표현 범위 속에, char 도 들어가기에 굳이 캐스팅할 필요는 없지만,
(char) 이렇게 캐스팅을 해주어도 됩니다.


그런데 %c 는 문자 1개를 표현하는 것입니다.

문자열은 %s 이런 포맷을 사용합니다.


☞ C/C++

C언어] 영문 문자열 헥사(Hex) 덤프, 16진수로 변환 출력; String Dump

문자열의 정확한 구조를 알아야 할 때나, 문자열의 끝이 널문자(\0)로 정확히 끝나는지 궁금할 때, dumpString() 함수로 문자열을 아스키 코드로 출력해 볼 수 있습니다. 영문이나 숫자 등의 1바이트 문자용입니다.

한글 등의 2바이트 문자를 완성형 코드로 덤프하는 방법은 여기에 있습니다: ▶▶ 한글 확장 완성형 문자열 헥사 덤프, 16진수로 변환; Hangul Hex Dump


문자열을 헥사(Hex) 아스키 코드로 출력 예제 소스


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

void dumpString(char *s);


void main(void) {
  char s[] = "ABCDEFG 123";

  dumpString(s);
}


void dumpString(char *s) {
  size_t arraySize = strlen(s) + 1; // strlen 함수는 행끝의 null 문자는 세지 않기에, 플러스 1

  printf("문자열 배열: %s\n", s);
  printf("배열의 바이트 수: %d\n", arraySize);

  for (size_t i = 0; i < arraySize; i++)
    printf("[%2d] %c = 0x%02X\n", i, s[i], *(s+i));

}



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

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

/out:strdump_to_hex.exe
strdump_to_hex.obj
문자열 배열: ABCDEFG 123
배열의 바이트 수: 12
[ 0] A = 0x41
[ 1] B = 0x42
[ 2] C = 0x43
[ 3] D = 0x44
[ 4] E = 0x45
[ 5] F = 0x46
[ 6] G = 0x47
[ 7]   = 0x20
[ 8] 1 = 0x31
[ 9] 2 = 0x32
[10] 3 = 0x33
[11]   = 0x00


단, 출력 결과를 갈무리할 때, 좀 문제가 생깁니다.
[11]   = 0x00
이 부분이 잘 보이지 않을 것입니다. 왜냐하면 문자열의 끝을 의미하는 널문자 '\0' 가 들어 있기 때문입니다. (줄바꿈 문자와는 전혀 다른 것입니다.) 캡처해서 사용하려면, 보이지 않는 널문자를 공백 문자로 바꾸어 주어야 합니다.


☞ C/C++

한글 확장 완성형 문자열 헥사 덤프, 16진수로 변환; Hangul Hex Dump

한글 확장완성형(euc-kr; cp949; ks_c_5601-1987) 문자열을 헥사 즉 16진수 값으로 변환하는 예제입니다. 완성형 코드를 분석할 때 필요한 것입니다.

완성형에서 "가"는 B0 A1 이라는 2바이트로 파일에 기록됩니다. 그러나 메모리에서는 바이트 순서가 바뀌어 A1 B0 이렇게 됩니다. 즉 파일에서는 빅 엔디언(BE)으로 0xB0A1 이렇게 순서대로 기록되고, 메모리에서는 리틀 엔디언(LE)으로 0xA1B0 이렇게 기록됩니다.


한글 완성형을 Hex(헥사)로 변환 예제 소스


소스 파일명: strdump_to_word.cpp
#include <stdio.h>

unsigned short byteSwap(unsigned short n);
unsigned char getLeftByte(unsigned short n);
unsigned char getRightByte(unsigned short n);


// 한글 완성형 문자열 헥사 덤프.
// 영문 등의 1바이트 글자가 섞여 있으면 처리 못하는 한계 있음
void main(void) {
  char s[] = "가나다라똠방각하";
  size_t charCount = sizeof(s) / 2; // 한글 글자 개수 구하기
  unsigned short char16;

  printf("배열의 바이트 수: %d\n", sizeof(s));
  printf("배열의 한글 개수: %d\n", charCount);

  for (size_t i = 0; i < charCount; i++) {
    char16 = *((unsigned short *)s+i);
    printf("[%d] %c%c = (LE) 0x%04X, (BE) 0x%04X\n", i, getRightByte(char16), getLeftByte(char16), char16, byteSwap(char16));
  }

}




unsigned short byteSwap (unsigned short n) {
  return ((n >> 8) | (n << 8));
}


unsigned char getLeftByte(unsigned short n) {
  return (unsigned char) (n >> 8) ;
}


unsigned char getRightByte(unsigned short n) {
  return (unsigned char) (n & 0xFF);
}



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

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

/out:strdump_to_word.exe
strdump_to_word.obj
배열의 바이트 수: 17
배열의 한글 개수: 8
[0] 가 = (LE) 0xA1B0, (BE) 0xB0A1
[1] 나 = (LE) 0xAAB3, (BE) 0xB3AA
[2] 다 = (LE) 0xD9B4, (BE) 0xB4D9
[3] 라 = (LE) 0xF3B6, (BE) 0xB6F3
[4] 똠 = (LE) 0x638C, (BE) 0x8C63
[5] 방 = (LE) 0xE6B9, (BE) 0xB9E6
[6] 각 = (LE) 0xA2B0, (BE) 0xB0A2
[7] 하 = (LE) 0xCFC7, (BE) 0xC7CF

D:\Z>




▶▶ C언어] 영문 문자열 헥사(Hex) 덤프, 16진수로 변환 출력; String Dump

▶▶ C언어,비트연산] 바이트 순서 바꾸기 함수, short의 byte 위치를 Byte Swap

▶▶ C언어,비트연산] unsigned short의 좌측, 우측 바이트만 얻기 - Left Byte, Right Byte

▶▶ Perl, 한글 확장완성형 코드표 생성기 - Hangul Wansung Code Table Generator

☞ C/C++

엑셀/MS워드 VBA매크로] 현재 날짜, 시간 출력 함수; Excel Word Date Time

VBA를 이용하여, 엑셀이나 워드 문서에, 현재 날짜와 시간 즉 타임스탬프를 찍는 방법입니다. Date 와 Time 이라는 함수에 현재 날짜와 시간이 들어 있습니다.

Excel: 셀에 날짜 시간 입력


다음과 같은 VBA코드로 현재 날짜와 시간을 채워 넣을 수 있습니다.
Sub Foo()
  Cells(1, 1).Value = Date
  Cells(1, 2).Value = Time
End Sub


A1 셀과 B1 셀에
2006-10-25   10:12:25 AM
이렇게 나란히 날짜와 시간이 기록됩니다.

이 시간은 문서를 다시 열더라도 현재 시간으로 업데이트되지 않고, 영원히 고정됩니다. 물론 위의 VBA매크로를 다시 실행하면 현재 시각으로 갱신됩니다.

########
만약 이렇게 보인다면, 셀의 간격을 조금 넓게 하면 시간이 보입니다.



MS워드: 문서에 날짜 시간 입력


Sub Foo()
  Selection.TypeText Text:=Date & " " & Time
  Selection.TypeParagraph
End Sub

위의 VBA매크로를 실행하면 현재 문서에, 현재 시각이

2006-10-25 오전 10:15:19

이렇게 출력됩니다. 그런 후 다음줄로 줄바꿈이 됩니다. 줄바꿈이 필요 없을 경우에는 "Selection.TypeParagraph" 이 줄을 지우거나 주석화되면 됩니다.

엑셀의 경우와 마찬가지로, 이 시간은 문서를 다시 열더라도 현재 시간으로 업데이트되지 않습니다. 위의 VBA매크로를 다시 실행할 때에만 현재 시각으로 갱신됩니다.


▶▶ Excel/엑셀 VBA] 오늘이 올해 몇 번째 날? 구하기/출력; get DAY OF YEAR


년월일/시분초 별로 나누어서 구하기: ▶▶ Excel/엑셀 VBA] 날짜/시간 (년월일 시분초) 구하기; Date Time Leading Zero

Tuesday, October 24, 2006

C언어] 숫자 정수 int 배열 정렬(소트Sort소팅) 역순/내림차순 정렬

C언어에서, qsort() 함수를 사용하여 숫자(int)를 정렬하는 예제입니다.

문자열 배열을 정렬하는 방법과, qsort() 함수에 대한 설명은 여기에 있습니다: ▶▶ C언어] 문자열 배열 정렬(소트;Sort)역순 소팅, qsort 함수 사용법


숫자 정수 정렬 예제 소스 코드;Sort Example


소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // qsort()


int comparisonFunctionInt(const void *a, const void *b);


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

  int array[ELEMENTS] = {
                                 59,
                                 24,
                                  0,
                                  4,
                               -357,
                                 35,
                                161,
                                 -3,
                               5455,
                                464,
                               6645 };


  qsort((void *)array, ELEMENTS, sizeof(array[0]), comparisonFunctionInt);

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

  return 0;
}




int comparisonFunctionInt(const void *a, const void *b) {

  if (*(int*)a <  *(int*)b) return -1;
  if (*(int*)a == *(int*)b) return  0;

  return 1;
}



실행 결과:
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
-357
-3
0
4
24
35
59
161
464
5455
6645

D:\Z>





역순(Descending Order;내림차순) 정렬


다음 함수처럼 a 와 b 의 위치를 약간 바꾸어 주면 됩니다.
int comparisonFunctionInt(const void *a, const void *b) {

  if (*(int*)b <  *(int*)a) return -1;
  if (*(int*)a == *(int*)b) return  0;

  return 1;
}



내림차순 정렬 실행 결과:
6645
5455
464
161
59
35
24
4
0
-3
-357



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

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

문자열을 정렬, 즉 가나다 순으로 소팅하는 예제입니다. stdlib.h 헤더파일에 정의되어 있는 qsort() 함수로 쉽고 빠르게 정렬할 수 있습니다.

정수 배열을 소팅하는 법은 여기에 있습니다: ▶▶ C언어] 숫자 정수 int 배열 정렬(소트Sort소팅) 역순/내림차순 정렬


문자열 정렬 예제 소스 코드


파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // qsort()
#include <string.h> // strcmp()

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


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

  char array[ELEMENTS][6 + 1] = {
                                 "맹구",
                               "배용준",
                               "땡칠이",
                               "장동건",
                               "강수정",
                               "송창식",
                               "황당해",
                               "고은아" };


  qsort((void *)array, ELEMENTS, sizeof(array[0]), comparisonFunctionString);

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

  return 0;
}




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


  qsort() 함수의 파라미터:

    * 배열의 "0번째 요소" 포인터
    * 배열의 요소 개수
    * 각 요소 하나의 크기를 바이트로
    * 비교 함수


qsort() 는, 요소들을 실제로 어떻게 비교할지 정하는 "비교 함수"를 필요로 합니다. 여기서는 comparisonFunctionString() 함수가 비교 함수입니다. 문자열의 순서를 비교합니다.



실행 결과:
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
강수정
고은아
땡칠이
맹구
배용준
송창식
장동건
황당해

D:\Z>


qsort() 속의 comparisonFunctionString 함수에
comparisonFunctionString() 이렇게 괄호를 붙이면 error C2660: 'comparisonFunctionString' : function does not take 0 arguments 이런 에러가 납니다.


또한, 위의 소스 파일의 확장자가 .cpp 가 아닌, .c 라면 에러가 납니다.




역순(Descending Order;내림차순)으로 정렬


다음과 같이, (char *)b 와 (char *)a 의 위치를 바꾸어 주면, 문자열이 역순으로 정렬됩니다.

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



역순 정렬 결과:
황당해
장동건
송창식
배용준
맹구
땡칠이
고은아
강수정




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

☞ C/C++

한글주소(URL)인코딩(encode, Encoding), 자바스크립트(JavaScript)

http://www.google.co.kr/소설.html
HTML에서 이런 한글이 섞인 주소는 오작동할 수 있기에

http://www.google.co.kr/%EC%86%8C%EC%84%A4.html
이런 식으로 이스케이프 해주어야 합니다.


다음과 같은 3가지 함수 중 하나로 한글 주소를 인코딩할 수 있습니다.

* encodeURI() : decodeURI()
* encodeURIComponent() : decodeURIComponent()
* escape() : unescape()

encodeURI() 가 적당합니다. 다만, 주소 전체를 http://부터 모두 인코딩하기 위해서는 encodeURIComponent 를 사용합니다.

인코딩된 한글 주소를 다시 복원하기 위해서는 각각의 함수에 대응되는 디코딩 함수를 사용합니다.




▶▶ encodeURI, encodeURIComponent, escape 함수 차이점; 자바스크립트

▶▶ JavaScript Tools: Decode/Encode URI Strings

▶▶ 블로그 게시물에 '딜리셔스del.icio.us(delicious) 추가 링크' 만들기

☞ HTML/CSS/JavaScript

encodeURI, encodeURIComponent, escape 함수 차이점; 자바스크립트

자바스크립트(JavaScript)에서는 다음의 함수들로, HTML 페이지 주소를 인코딩/디코딩합니다.

encodeURI() / decodeURI()
최소한의 문자만 인코딩합니다.
; / ? : @ & = + $ , - _ . ! ~ * ' ( ) #
이런 문자는 인코딩하지 않습니다.
http:// ... 등은 그대로 나옵니다.


encodeURIComponent() / decodeURIComponent()
알파벳과 숫자 Alphanumeric Characters 외의, 대부분의 문자를 모두 인코딩합니다.
http:// ... 가 http%3A%2F%2F 로 됩니다.



escape() / unescape()
예전부터 있던 오래된 함수입니다. encodeURI() 와 encodeURIComponent() 의 중간 정도의 범위로 문자를 인코딩합니다.


encodeURI, encodeURIComponent, escape 함수 사용 예제


<html>

<body>

<script type="text/javascript">
  var s;

  s = encodeURI('http://www.google.co.kr/소 설.html');
  document.write('<p>' + s + '<p>');
  // 출력 결과: http://www.google.co.kr/%EC%86%8C%20%EC%84%A4.html


  s = encodeURIComponent('http://www.google.co.kr/소 설.html');
  document.write('<p>' + s + '<p>');
  // 출력 결과: http%3A%2F%2Fwww.google.co.kr%2F%EC%86%8C%20%EC%84%A4.html


  s = escape('http://www.google.co.kr/소 설.html');
  document.write('<p>' + s + '<p>');
  // 출력 결과: http%3A//www.google.co.kr/%uC18C%20%uC124.html
</script>

</body>
</html>




어떤 함수든 "공백 문자" 즉 스페이스는 %20 으로 치환합니다. 그러나 주소의 공백은 없어야 합니다.


▶▶ JavaScript Tools: Decode/Encode URI Strings

☞ HTML/CSS/JavaScript

Perl C언어 자바(Java), 문자열 바꾸기 Replace String

각 프로그래밍 언어에서, 문자열을 치환하는 방법을 모았습니다.

▶▶ REPLACE: Perl] 문자열 치환(바꾸기)/순서 변경/삭제
문자열 다루는 데 있어 최강인 Perl이기에, 당연히 문자열 Replace 도 아주 쉽습니다.


▶▶ REPLACE: C언어] 문자열 치환 함수, 문자열 모두 바꾸기 - String Replace All
C에서는 문자열 바꾸기 함수가 기본적으로 제공되지 않기에, 프로그래머가 문자열 바꾸기 함수를 만들어 주어야 합니다.


▶▶ REPLACE: Java/자바] 문자열 치환, 바꾸기, 모두 바꾸기 - String Replace All
Java에는 문자열 바꾸기 메소드가 기본적으로 제공됩니다.


☞ Perl(펄)

☞ C/C++

☞ 자바(Java)

리눅스 명령어 결과 저장; 실행 화면 텍스트 파일로; Linux Unix Output to File

리눅스/유닉스의 콘솔/터미널의 bash 쉘 등에서는 재지향(Redirection)이라는 방법으로, 각종 명령어 출력 결과를 파일로 저장할 수 있습니다.

예를 들어 ls 명령의 출력 결과를, 연필로 옮겨쓰는 대신에
ls > out.txt

라고 하면 out.txt 라는 파일로 ls 명령의 결과가 간단히 저장됩니다. ls뿐 아니라 다른 모든 명령들도 마찬가지입니다.

> 이런 기호는, 글자들의 출력 방향을 화면이 아닌, 파일 같은 다른 데로 전환시키는 것입니다.


에러 메시지까지 파일로 저장하는 방법


그런데 위의 재지향 방법으로는 에러 메시지 출력은 저장되지 않습니다. 에러 메세지까지 파일로 저장되어 버리면, 에러가 났는지 알 수 없기 때문입니다. 기술적으로 말하자면, 일반 문자열은 "표준 출력(Standard Output)"으로 출력되고, 에러는 "표준 에러 출력(Standard Error)"으로 출력되기에 재지향이 안되는 것입니다.

에러까지 재지향하여 파일로 저장하는 방법이 있습니다.

ls ewyrsyrwyy &> out.txt

이렇게 &> 기호로 재지향하면 됩니다. ewyrsyrwyy 라는 이름의 파일이 없을 것이기에, ls 에서 그런 파일을 찾을 수 없다(No such file or directory)고 에러가 납니다. 그 에러 메시지가 out.txt 라는 파일로 저장됩니다.





데스크탑의 그래픽 화면을 파일로 캡처하는 법은 여기에 있습니다: ▶▶ Linux/리눅스] 화면 캡처, 데스크탑 화면을 파일로 저장, 갈무리; Screen Capture

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

울트라에디트 함수 목록 보기 핫키, UltraEdit 울트라 에디터 팁; View Function List

울트라에디터에서 키보드의 F8 키를 누르면, 현재 편집중인 각종 프로그래밍 소스 파일의 함수들 목록이, 화면 우측에 알기 쉽게 출력됩니다.


함수로 이동하기


함수명을 더블클릭하면, 현재 소스에서 그 함수가 위치한 곳으로 자동 이동합니다.


함수 목록 복사


함수 목록창에서 마우스 우측 버튼을 누르면, Copy to Clipboard (클립보드로 복사) 라는 항목이 나오는데, 그것을 선택하면 현재 소스의 모든 함수 목록들이 예를 들어 다음과 같이 복사됩니다:

CommonHelp
DiamondOpen
DumpArgs
DumpString
GetArgs
GetCommonArgs
PauseOnError
PauseOnExit
random
randomize
strdel


함수 목록창 닫기


목록창 우측의 X 기호를 클릭합니다.


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

☞ C/C++

☞ 자바(Java)

☞ Perl(펄)

CSV 에디터; CSV 파일 읽기, 열기, 편집 프로그램은?, CSV Editor

CSV 파일은 평범한 텍스트 파일이기에, 윈도우 메모장으로도 열어서 읽고 편집할 수 있지만,

복잡한 CSV 파일이라면 엑셀(Excel) 같은 스프레드 시트 소프트웨어에서 편집해야 합니다.

CSV 파일의 대부분은, 엑셀(Microsoft Excel)에서 만들어진 것이기에, 엑셀에서 편집하면 가장 적당합니다. CSV 파일을 엑셀로 불러오면 일반 시트(.xls)처럼 가지런하게 잘 보입니다.



참고: ▶▶ 엑셀 시트를 아스키 파일/텍스트 파일로 저장: Excel xls save to ASCII file


CSV 란?


Comma-Separated Values 의 약자입니다. 셀의 각 값들이 콤마(,) 즉 쉼표로 구분되어 있는 파일이라는 뜻입니다.

엑셀 스프레드 시트에서 "표"를 작성하면, 이진파일로 저장되기에, 엑셀 이외의 다른 프로그램에서는 읽을 수 없거나 읽기 힘듭니다. 그렇지만 CSV 라는 텍스트 파일 즉 아스키 파일로 저장하면 다른 프로그램에서도 읽을 수 있게 됩니다.

따라서 엑셀로 저장된 도표나 데이터베이스를, 엑셀을 가지고 있지 않을 가능성이 높은 불특정 다수에게 배포할 때에는 대부분 CSV 파일로 변환하여 배포합니다. 확장자.csv 로 되어 있습니다.



☞ 오피스(Office)/엑셀(Excel)/워드(Word)

자바,Java] 유니코드(UTF-8)변환, KS완성형 파일을 유니코드로 바꾸기

"한글 확장 완성형 파일" 즉 euc-kr 또는 cp949 또는 ks_c_5601-1987 인코딩의 파일을, 유니코드로 변환하는 자바 프로그램입니다. 유니코드는 여러 종류가 있는데 여기서는 UTF-8 로 변환합니다. UTF-8 이 인터넷에서 사용되는 형식입니다. HTML 파일을 유니코드 인코딩으로 작성할 때에는 UTF-8 이어야 합니다. 다른 종류의 유니코드는 문제가 생깁니다.


JAVA 소스: 확장 완성형을 유니코드(UTF-8)로 변환


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

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

    if (args.length == 0) {                   // args.length 는 옵션 개수
      System.err.println("Input Filename...");
      System.exit(1);                         // 읽을 파일명을 주지 않았을 때는 종료
    }

    String outFilename = args[0] + ".uni";    // 출력 파일명 만들기, uni 라는 확장자를 붙여서


    try {
      ////////////////////////////////////////////////////////////////
      BufferedReader in = new BufferedReader(new FileReader(args[0]));

      BufferedWriter out = new BufferedWriter(
                                              new OutputStreamWriter(
                                                                     new FileOutputStream(outFilename),
                                                                     "UTF-8"
                                                                     )
                                              );

      String s;

      while ((s = in.readLine()) != null) {
        out.write(s); out.newLine();
      }

      in.close(); out.close();
      ////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e); // 에러가 있다면 메시지 출력
        System.exit(1);
    }

  }
}



예를 들어 "0.txt" 라는 한글 완성형 파일을 변환하기 위해서는

javac Foo.java
이렇게 컴파일한 후

java Foo 0.txt
이렇게 옵션을 주어 실행시키면

하드의 현재 디렉토리에 "0.txt.uni" 라는 유니코드(UTF-8) 파일이 생깁니다. 똑같은 내용이며 단지 인코딩이 다릅니다.


그런데 다만 BOM 이 없습니다. 물론 인터넷에 올릴 HTML 파일을 UTF-8로 인코딩할 때에는 BOM 이 없는 것이 정상입니다: ▶▶ [QnA] 유니코드 (Unicode) 의 BOM (Byte Order Mark) 이란?

▶▶ Java/자바] UTF-8 BOM 있는 유니코드 파일 출력/만들기 예제




입력 파일의 인코딩은 기본값으로 했기에, 한글 윈도우가 아닌 일본어판 윈도우에서 실행하면, 일본어 Shift-JIS 파일이 UTF-8로 변환될 것입니다.


운영체제의 언어에 상관없이 항상 한국어 파일을 대상으로 하는 코드: ▶▶ Java/자바] 한글 euc-kr (MS949) 파일을, 유니코드(UTF-8)로 변환 프로그램




텍스트 편집기를 사용하여 파일을 유니코드로 변환하는 방법: ▶▶ 한글 텍스트 문서를, 유니코드(Unicode / UTF-8) 로 변환하기


☞ 유니코드(Unicode)

☞ 자바(Java)

자바,Java] 줄바꿈 문자 Carriage Return(CR), Line Feed(LF)

업데이트:

만약 System.out.format() 메소드를 사용하여 출력하는 경우에는, 운영체제 종류에 맞게 자동으로 판단하여 줄바꿈 문자를 넣는 방법이 다음 게시물에 있습니다: ▶▶ 자바/Java] System.out.format() 줄바꿈, 운영체제(OS) 종류에 맞게; line separator





Carriage Return(CR), Line Feed(LF)에 대한 별도의 클래스는 없는 것 같았습니다. C나 펄과 달리, 자바는 줄바꿈 문자를 좀 융통성 없이 처리하더군요,

윈도우에서 자바를 사용할 때를 기준으로 설명합니다. 윈도우에서는 도스(DOS) 텍스트를 사용하기에, 줄바꿈이 "0D 0A"로 즉 "CR-LF"로 출력되어야 합니다. 리눅스/유닉스에서는 "0A" 즉 "LF"가 되어야 합니다.

윈도우에서의 줄바꿈의 경우


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

  System.out.println("줄바꿈 문자 자동 추가(도스)"); // 자동으로 행갈이 문자 종류 판단

  System.out.print("줄바꿈 문자 없음");
  System.out.println(); // 줄바꿈만 하기; 자동으로 행갈이 문자 종류 판단

  System.out.print("줄바꿈 문자 직접 넣기 (유닉스)\n");

  System.out.print("줄바꿈 문자 직접 넣기 (도스)\r\n");

  }
}


println 으로 출력하면, 현재 운영체제의 종류에 따라 줄바꿈이 자동으로 정해집니다. 윈도우에서 실행하면 도스형 줄바꿈이 나옵니다. 리눅스에서 실행하면 유닉스 스타일로 줄바꿈이 됩니다.

그런데 \n 이런 이스케이프 문자를 직접 사용하여 줄바꿈을 하면 문제가 생깁니다. C나 펄은 \n 을 운영체제에 맞게 변환하지만, 자바는 그렇지 않고 항상 LF만 출력하여 유닉스 텍스트가 됩니다. 그래서 텍스트 파일의 행끝의 종류가 뒤섞이는 문제가 있습니다. (물론 리눅스에서라면 괜찮을 것입니다. 윈도우는 도스 텍스트를 사용하기에 윈도우에서만 이런 문제가 생깁니다.)

이때는 \r\n 이런 식으로 해주면, 도스 텍스트로 출력됩니다. 그렇지만 \r\n 이런 식으로 줄바꿈하면 윈도우에서는 괜찮지만 리눅스에서는 또 문제가 생길 것입니다. (리눅스의 텍스트는 줄바꿈에 \r 즉 CR이 쓰이지 않기에...)


결론

따라서 \n 이런 문자로 줄바꿈할 수는 없고 System.out.println(); 이런 메소드로 줄바꿈해야 합니다.


파일에 직접 출력할 때에는, BufferedWriter 클래스의 newLine() 메소드로, 운영체제에 맞게 자동으로 줄바꿈할 수 있습니다: ▶▶ 자바,Java] 텍스트 파일 쓰기, 파일 저장 예제; Text File Write


☞ 자바(Java)

Monday, October 23, 2006

자바,Java] 텍스트 파일 쓰기, 생성, 파일 저장 예제; Text File Write

자바로, 텍스트 파일을 만들어서, 그 안에 문자열을 쓰고, 저장하는 예제입니다.


텍스트 파일 생성/만들기 예제 소스


소스 파일명: Foo.java
import java.io.*;

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

    try {
      ////////////////////////////////////////////////////////////////
      BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
      String s = "출력 파일에 저장될 이런 저런 문자열입니다.";

      out.write(s); out.newLine();
      out.write(s); out.newLine();

      out.close();
      ////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e); // 에러가 있다면 메시지 출력
        System.exit(1);
    }

  }
}


위의 자바 소스를 컴파일한 후 실행하면, 하드의 현재 디렉토리에 out.txt 라는 텍스트 파일이 생깁니다.

생성된 out.txt 파일의 내용:
출력 파일에 저장될 이런 저런 문자열입니다.
출력 파일에 저장될 이런 저런 문자열입니다.



참고로, newLine() 이라는 메소드는, 현재 운영체제의 종류를 자동으로 판단한 후, 적절한 개행문자를 출력하여 줄바꿈하는 것입니다.


▶▶ 자바,Java] 텍스트 파일 읽기, 한줄씩 읽어 화면에 출력; 자바 기초

☞ 자바(Java)

C언어] time.h 의, 시간 구조체; struct tm; Time Structure

time.h 헤더 파일(header file)에 시간 구조체가 다음과 같이 정의되어 있습니다.

struct tm {
  int tm_sec;   /* Seconds */
  int tm_min;   /* Minutes */
  int tm_hour;  /* Hour (0--23) */
  int tm_mday;  /* Day of month (1--31) */
  int tm_mon;   /* Month (0--11) */
  int tm_year;  /* Year (calendar year minus 1900) */
  int tm_wday;  /* Weekday (0--6; Sunday = 0) */
  int tm_yday;  /* Day of year (0--365) */
  int tm_isdst; /* 0 if daylight savings time is not in effect) */

};


한글화하면 다음과 같습니다.
struct tm {
  int tm_sec;   /* 초 */
  int tm_min;   /* 분 */
  int tm_hour;  /* 시 (0--23) */
  int tm_mday;  /* 일 (1--31) */
  int tm_mon;   /* 월 (0--11) */
  int tm_year;  /* 년 (+ 1900) */
  int tm_wday;  /* 요일 (0--6; 일요일 = 0) */
  int tm_yday;  /* 올해 몇번째 날 (0--365) */
  int tm_isdst; /* 서머타임 여부 */

};


time(NULL) 함수로 현재 시각을 얻어서, localtime() 함수로 분해하여, 시간 구조체에 넣게 됩니다.

전체적인 프로그래밍 방법은 여기에 있습니다: ▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수: Current Date, Time

☞ C/C++

펄,Perl] 유닉스 시간 구하기, 유닉스 타임(Unix Time; POSIX time)

time 함수를 print 로 출력하면 현재의 유닉스 시간이 간단히 출력됩니다.

유닉스 타임 얻기 예제
#!/usr/bin/perl
use strict; use warnings;

print time;


예를 들어, 현재 한국 시각이
2006-10-23 2:35오후
이럴 때, 위의 스크립트를 여러 번 반복 실행하면, 유닉스 타임이 다음과 같이 나옵니다:

D:\Z>0.pl
1161581704
D:\Z>0.pl
1161581704
D:\Z>0.pl
1161581705
D:\Z>0.pl
1161581706
D:\Z>0.pl
1161581706
D:\Z>0.pl
1161581707
D:\Z>0.pl
1161581707
D:\Z>

1161581706 등의 숫자가 유닉스 시간입니다. 1초마다 변경됩니다.


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


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

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


▶▶ Perl/펄] 오늘 날짜/현재 시간 구하기 함수, 년월일/시분초; Get Print Date Time Current

펄 강좌와 각종 예제

윈도우] VBS, VBScript 실행하는 법: 비베 스크립트 실행법

예를 들어,
MsgBox "비주얼 베이직"

이런 간단한 VBScript 가 있다고 할 때 위의 코드 박스의 내용을, 메모장을 사용하여

foo.vbs

등의 이름으로 하드에 저장합니다. 확장자가 .vbs 여야 실행이 됩니다.

그런 후 윈도 탐색기 (Windows Explorer)에서, foo.vbs 라는 파일을 클릭하면, VBScript 가 실행되어, 화면에 메시지 박스가 나옵니다. 확장자가 보이지 않게 탐색기가 설정되어 있다면 foo를 클릭합니다.



VBScript를 실행하려면, 비주얼 베이직을 설치해야 하나요?


VBS (VBScript)는, 비주얼 베이직이 없어도 실행됩니다. 단, 윈도우98에서는 VBScript 엔진을 수동으로 설치해 주어야 실행이 될 것입니다.


▶▶ 비주얼 베이직 스크립트 (VBS / VBScript) 의 기초: 간단한 메시지 박스 예제

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

엑셀 매크로 여러 문서에서 공유하기, Excel Macro PERSONAL.XLS

(엑셀 2003 기준)

MS워드는 매크로를 "모든 문서 (NORMAL.DOT)"에 저장하면, 현재 문서뿐 아니라 모든 문서에서 매크로를 쓸 수 있습니다.

엑셀은 "개인용 매크로 통합 문서"인 PERSONAL.XLS 라는 파일에 매크로를 저장하면, 모든 엑셀 문서에서 매크로가 공유됩니다.

엑셀 매크로를 만들 때 "매크로 저장 위치"를 "개인용 매크로 통합 문서"로 지정하면

"C:\Documents and Settings\Administrator\Application Data\Microsoft\Excel\XLSTART"

이런 폴더에

PERSONAL.XLS

이런 파일이 자동으로 만들어지고 이 파일에 매크로가 저장되어, 모든 엑셀 문서에서 사용 가능합니다.


일단 PERSONAL.XLS 파일이 만들어지면, VBA에디터(Alt+F11)에도 나타납니다.

VBA에디터 메뉴: 삽입 > 모듈
로, 수동으로 PERSONAL.XLS 파일에 VBA코드를 삽입할 수도 있습니다.


▶▶ Normal.dot 이란 파일은 무엇이며, 어디에 있나요 [MS오피스 / MS워드 QnA]

▶▶ 워드 매크로 내보내기/가져오기, 외부 텍스트 파일로 저장 - MS Word Macro Export Import

☞ 오피스(Office)/엑셀(Excel)/워드(Word)


<< Home

Categories
Some Recent Posts
Monthly Archives
Top