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

 
Monthly Archive
Thursday, November 30, 2006

비베(VB, VBA, VBS)에서 엔터키(Enter Key) 표현; 줄바꿈 문자 넣기

비주얼 베이직 계열의 언어에서는, "엔터키(Enter)"를 표현할 때, 즉, 다음 줄로 "줄바꿈"을 할 때

Chr(13)

이라는 것을 사용합니다.

즉, 키보드의 엔터키가 Chr(13) 인 것입니다.



문자열 2개 사이에서 엔터키를 쳐서 줄바꿈하려면, 다음과 같이, 문자열 사이에 Chr(13) 을 넣고, 다른 문자열과 &(앰퍼샌드) 기호로 연결해 줍니다.

MsgBox "첫 번째 줄" & Chr(13) & "두 번째 줄"



자세한 설명은 여기에 있습니다: ▶▶ 비베/VBScript] Chr() / Asc() 함수. MsgBox 에서, Chr(13) 함수의 의미 - VBS



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

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

file 명령; 파일 명령 용도 사용법 예제; UNIX, LINUX 명령어

리눅스나 유닉스에는 file 이라는 애매한 이름의 명령이 있는데 이것은

"파일의 종류(형식)를 자동 판단"하는 명령입니다. 리눅스/유닉스의 파일들에는 대체로 확장자가 없기에, 파일명만 보고서는 파일 종류를 알기 힘듭니다.

이때 file 이라는 명령으로, 특정 파일의 종류를 간편하게 판단할 수 있습니다.



예를 들어, sortNum 이라는 파일이 있다고 할 때, sortNum 이라는 파일이 어떤 형식인지, 이름만으로는 쉽게 알 수가 없습니다.

이때
file sortNum

이렇게 하면, 그 sortNum 이라는 파일의 종류를 분석하여 알려 줍니다.


만약 sortNum 이라는 파일이 펄 스크립트라면

sortNum: perl script text executable

이렇게 출력됩니다.




file 명령에 대한 좀더 자세한 설명은 여기에 있습니다: ▶▶ 리눅스/Cygwin] file 명령의 용도/기능/사용법, Linux file Command


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

워드(MS-WORD)문서, 한글(HWP)파일 합치기, 수동으로 병합; DOC Merge

평범한 텍스트 파일(*.txt) 즉, "아스키 텍스트"인 경우는 도스창에서 자동으로 합칠 수 있습니다: ▶▶ 윈도우] 텍스트 파일 합치기 명령어; Text File (.TXT) 문서 병함 방법; TXT Merge DOS


그러나 워드프로세서(워드, 아래아한글) 등의 문서는 이진파일로 되어 있고, 또한 "구조화된 문서 형식"이기에, 위의 방법으로 합칠 수 없습니다.


좀 불편하지만, 문서들을 일일이 열어서, 다음과 같이 수동으로 합쳐야 합니다.




워드에서는

메뉴: 삽입 > 파일

을 선택하여, 여러 문서를 하나씩 현재 문서에 삽입하여 붙여 넣을 수 있습니다.




아래아 한글(HWP)에서는

메뉴: 입력 > 파일 끼워 넣기

이렇게 하면 됩니다.






또는 아래와 같이, 하나씩 복사하여 합칠 수도 있습니다.


* Ctrl+N 키를 눌러, "새 문서"를 하나 만듭니다. (Ctrl키를 누르면서 N키를 누름.) 모든 파일들을, 이 새 문서에 병합할 것입니다.
(HWP 즉 "아래아한글 워드프로세서"에서는 Alt+N 으로 새 문서를 만듭니다)


* 우선, 병합할 첫번째 문서 파일을 워드로 불러와서, Ctrl+A 키로 그 문서 전체를 선택합니다.


* Ctrl+C 키를 눌러 문서 전체를 메모리 속에 복사(Copy)합니다. 또는 Ctrl+Insert 키를 눌러도 복사가 됩니다.


* 이제 Alt+Tab키를 눌러, 아까 만든 "새 문서" 창으로 이동합니다.


* 새 문서에서 Ctrl+V키를 눌러, 문서 내용을 붙여 넣습니다. 또는 Shift+Insert 키를 누릅니다.



이런 식으로 모든 파일들을 차례로, "새 문서"에 복사하여 붙여 넣으면 됩니다.




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

윈도우] 텍스트 파일 합치기 명령어; Text File (.TXT) 문서 병합 방법; TXT Merge DOS

"문서 병합" 하는 도스(DOS) 명령 사용법입니다.

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

type *.txt > out.new

위와 같이 입력하고, Enter키를 치면, 현재 디렉토리(폴더)의 모든 .txt 확장자를 가진 파일들이 out.new 라는 이름의 새 파일로 합쳐집니다.

윈도우2000/윈도우XP나 그 이상의 운영체제에서만 위의 방법이 가능합니다.



copy 명령으로 파일 합치는 법


copy 명령을 사용하여 병합하는 방법도 있는데, 이것은 예전의 윈도우98에서도 가능합니다.

copy 1.txt + 2.txt + 3.txt out.new /b

1.txt
2.txt
3.txt
라는 텍스트 파일 3개를 out.new 라는 새로운 텍스트 파일로 합쳐서 저장하는 것입니다.
파일명을 플러스(+) 기호로 연결해 주면 됩니다.

맨 끝에 /b 라는 옵션을 붙였는데, 이것은 파일들을 이진파일로 간주하고 합치라는 뜻입니다. 텍스트 파일이든 이진파일이든 "이진 모드"로 합치면 무난하게 잘 합쳐집니다.

텍스트파일 모드로 합치면, 합쳐진 파일 끝에 "EOF(파일 끝) 문자"가 붙는 등, 별로 자연스럽게 합쳐지지 않습니다.


도스창에서
copy /?
라고 하면 copy 명령에 대한 도움말이 출력됩니다.






파일을 합친 후 out.new 라는 파일을

ren out.new out.txt

이렇게 out.txt 등의 이름으로 변경하면 메모장 등의 편집기에서 쉽게 읽을 수 있습니다.




수동으로 합치는 법: ▶▶ 워드(MS-WORD)문서, 한글(HWP)파일 합치기, 수동으로 병합; DOC Merge

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

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

포토샵] 사진 크기 조절; 이미지 사이즈 조정 변경; Image Size Photoshop

(포토샵 7.0을 기준으로 설명)

포토샵 상단 메뉴에서

Image (이미지) > Image Size (이미지 크기)

를 선택하면, "Image Size" 라는 대화상자가 나옵니다. 아래 그림과 같습니다.


Photoshop: Image Size
포토숍: 그림 사이즈 바꾸기 대화상자


"Pixel Dimensions" 항목에서, Width (가로 길이)Height (세로 길이) 를, 픽셀 단위로 지정해 줍니다.

또는 우측의 pixels 라는 목록을 클릭하면, "percent (퍼센트)" 라는 항목이 나오는데,

퍼센트로 지정해 놓고 50 을 입력하면 그림이 50% 축소되고, 200으로 입력하면 200% 확대되는 식입니다.



Constrain Proportions (가로 세로 비율 유지) 옵션이 기본적으로 켜져 있습니다. 이 옵션을 끄면(OFF) 가로 세로 비율이 일그러집니다.

Resample ImageBicubic 이 기본이고, 기본값인 Bicubic 이 가장 좋습니다.



주의! 사진 사이즈를 변경할 때에는 Bicubic 이어야 합니다.

"Nearest Neighbor" 는 사진이 아닌, 픽셀 단위의 단순한 그림의 사이즈를 변경할 때 사용하는 옵션입니다.

그리고 Bilinear 는 화질이 Bicubic 보다 떨어집니다.



팁: 편집 중인 이미지의 타이틀바(제목줄)를, 마우스 우측 버튼으로 클릭해도 "Image Size (이미지 크기 조정)" 라는 대화상자를 나오게 할 수 있습니다.

참고: 디카로 찍은 사진이나 스캐너로 스캔한 사진의 원본 크기는 너무 크기 때문에, 포토샵의 Image Size 로 축소시키는 작업을 해야 하는데,

축소 작업을 한 후, Sharpen 필터를 적용하여 사진을 선명하게 해주는 것이 좋습니다: ▶▶ 포토샵] 사진 선명하게 만드는 샤픈/샤펀 필터 사용법: Photoshop Sharpen Filter



HTML 태그 속성을 사용하여, 이미지 사이즈를 임시로 변경하는 방법: ▶▶ HTML] 웹 이미지(사진, 그림) 크기 변경/조정, 사진 사이즈 축소 태그 속성; Image Size

☞ 포토샵 (Adobe Photoshop)

VIM VI GVIM: 특수 문자 보기, 줄바꿈 문자(엔터키) 탭(Tab)문자 보이게 하는 명령

텍스트 파일에서, Enter키를 쳐서 줄바꿈한 곳이나, Tab 키를 누른 곳은 눈에 보이지 않습니다.

그렇지만 이런 특수문자를 보이게 하는 명령이, 빔(vim)에디터에는 있습니다. (물론 다른 에디터에도 이런 기능이 다 있습니다.)


Esc키를 한 번 누르고,

:se list

위와 같은 명령을 입력하면, 엔터(Enter)키가 쳐진 곳에, 즉, 행의 끝에 개행문자/줄바꿈 문자가 "달러($) 기호"로 나타납니다.

그리고 탭(Tab)문자는 ^I (캐럿 기호와 대문자 아이)로 나타납니다. (^I 는 Ctrl+I 라는 뜻)



특수 문자(특수 기호)를 다시 감추기 위해서는

:se nolist

이렇게 하면 됩니다.



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

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

Wednesday, November 29, 2006

배치파일] 윈도우 환경변수를 echo 로 출력 하는 법; PRINT Environment Variable DOS

윈도우(도스) 환경변수를 화면에 출력(프린트)하려면, 그 환경변수 이름의 앞뒤로 퍼센트 기호(%)를 붙이고 에코 명령으로 출력하면 됩니다.

예를 들어, TEMP 라는 환경변수를, 도스창 화면에 "echo (에코) 명령"으로 출력하려면 다음과 같습니다.

echo 문으로, 환경 변수 출력 예제


파일명: 0.bat
@echo off

echo %TEMP%



위의 코드를 0.bat 등의 이름으로 하드에 저장한 후, 도스창(명령 프롬프트;CMD.EXE)에서, 0.bat 이 있는 디렉토리로 이동한 후,

0 또는 0.bat 이라고 치면, TEMP 환경변수의 값이 화면으로 출력됩니다.


실행 결과:
D:\Z>set
ProgramFiles=C:\Program Files
SystemDrive=C:
SystemRoot=C:\WINNT
TEMP=D:\Temp
TMP=D:\Temp
windir=C:\WINNT

D:\Z>0.bat
D:\Temp
D:\Z>


저의 경우, TEMP 환경변수의 값이 D:\Temp 이기에

D:\Temp

이렇게 출력되었습니다.




▶▶ 도스(DOS)/윈도우의, 배치 파일에서 echo off 란?

▶▶ [배치파일:도스/윈도우] echo 명령 사용법 / echo (에코) 란?

▶▶ [배치 파일 팁] echo문 행갈이 / 빈 줄 넣기/ 한 줄 띄어쓰기: Batch File Tip

▶▶ [배치 파일] echo 명령에서, 쌍따옴표, 꺾은 괄호(부등호) 등 특수문자 표현하기

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

배치파일] %1 %2 %3 퍼센트 일,이,삼 기호의 의미; DOS BAT Argument

배치 파일 안에서 사용되는
%1 %2 %3
이런 "퍼센트 기호 + 숫자"는 매개 변수 즉, "실행시 옵션"입니다.

달리 말하자면 배치 파일의 "기본 변수"들입니다.


배치 파일을 실행할 때 어떤 옵션을 붙여서 실행할 수 있습니다.

%1 에 첫번째 옵션 문자열이 들어가고
%2 에 두번째 옵션 문자열이 들어가는 식입니다.

(단, %0 이라는 변수에는, 현재 배치파일명 자체가 들어있음. 즉 자기 자신의 이름이 들어 있음)



배치파일 매개 변수 사용법과 예제는 여기에 있습니다: ▶▶ 배치파일] 옵션 문자열 얻기, 실행시 매개변수 활용 DOS-NT Batch File Option


배치 파일 작성법 강좌: ☞ BATCH(.BAT)/VBScript(.VBS)

C언어] 0.0 ~ 1.0 범위 실수 난수; 실수형 랜덤 생성; Random Double

다른 언어들의 랜덤 함수들은 대체로 0.0 ~ 1.0 범위의 실수를 리턴하는데,

C언어의 rand() 함수는 0 ~ 32767 까지의 정수(int)를 반환합니다.

정확하게 말하자면 0 ~ RAND_MAX 까지인데

비주얼C++의 경우 stdlib.h 헤더 파일에

#define RAND_MAX 0x7fff

이렇게 정의되어 있습니다. 16진수 0x7fff 는 10진수로 32767 이고

그래서 rand() 는 0 ~ 32767 까지의 난수가 출력됩니다.



다른 언어들의 경우처럼 실수 값을 반환하게 만들려면, 다음 예제에 있는

double randomDouble(void)

라는 함수를 사용하면 됩니다. 0.0 ~ 1.0 까지의 실수를 반환합니다.


VC++: 실수 난수 생성 예제


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

double randomDouble(void);


int main(void) {

  // 난수 발생기 초기화, 비주얼C++용
  srand(GetTickCount());


  // 0 ~ 32767 까지의 정수 난수 생성
  for (int i = 1; i <= 20; i++)
    printf("%d\n", rand());

/* 실행 결과:

21149
29586
18653
28590
22933
18816
22220
9712
26847
3756
4708
9493
23532
20825
12074
30618
25615
19220
22471
22426
*/




  // 0.00000000000000000 ~ 1.00000000000000000
  // 범위의 실수 난수 생성
  for (int i = 1; i <= 20; i++)
    printf("%.17f\n", randomDouble());

/* 실행 결과:

0.78749961851863159
0.71807000946073796
0.09689626758629108
0.27829828791161837
0.79158909878841521
0.54560991241187784
0.50291451765495776
0.16968291268654440
0.46308786278878139
0.47267067476424451
0.96151615955076752
0.88122196111941897
0.64656514175847657
0.22769859920041505
0.00064088869899594
0.18887905514694661
0.43452253791924800
0.77205725272377701
0.52006591998046814
0.54249702444532610
*/


  return 0;
}




double randomDouble(void) {
  return (double) rand() / RAND_MAX;
}



그런데 rand() 함수의 한계 때문에, 실수들이 고작 32768 개의 해상도(?)를 가지더군요. 즉, 0과 1사이에 32768 종류의 실수만이 존재했습니다.

그래서 소팅을 해보면, 같은 값의 실수들이 몇 개씩 중복되어 발견되는 문제가 남아 있습니다.



▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수


0~1까지의 실수 난수 생성기: ▶▶ 0에서 1까지의 실수 난수 발생, 랜덤 생성; Float Random Maker

정규식] 대소문자 구분 없이 찾기, 매치 시키기; Regex Ignore Case Perl

정규식에서는 기본적으로 알파벳의 대소문자를 구분합니다.

"대소문자 구분 없이" 찾으려면
/정규식/i

이렇게 끝에 소문자 i (아이) 를 붙이면 됩니다. i 같은 것을 "Option Modifier" 또는 "Flag" 라고 합니다.

/정규식/gi

이렇게 옵션을 여러 개 이어서 붙일 수도 있습니다.


다음 예제는 펄(Perl)에서 i 옵션을 사용하는 간단한 예제입니다.

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

  my $s = "Linux";


  # 기본적으로는 대소문자 구분함
  print "$s 가 (대소문자 구분하여) 매치\n" if $s =~ (/Linux/);
  # 출력 결과: Linux 가 (대소문자 구분하여) 매치



  # i 옵션으로 대소문자 구분 없애기
  print "$s 가 (대소문자 구분 없이) 매치\n" if $s =~ (/LINUX/i);
  # 출력 결과: Linux 가 (대소문자 구분 없이) 매치



좀더 실용적인 예제는 여기에 있습니다. 파일 속의 문자열을 대소문자 구분없이 찾아서 개수를 세는 스크립트입니다:
▶▶ Perl/펄] 파일 속의 문자열, 단어 개수 세기; Count All (grep 확장 스크립트)



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

☞ Perl(펄)

Java/자바 에러] class Bar is public, should be declared in a file named Bar.java

만약 다음과 같은 자바 소스를 컴파일하면

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


  }
}


이런 에러가 납니다.
D:\Z>javac Foo.java
Foo.java:1: class Bar is public, should be declared in a file named Bar.java
public class Bar {
       ^
1 error

D:\Z>


class Bar is public, should be declared in a file named Bar.java

라는 것은, 소스 파일명을 Foo.java 가 아닌 Bar.java 로 해야 한다는 뜻인데
결국 Bar 라는 클래스 이름과 소스 파일명이 동일해야 한다는 뜻입니다.


따라서 위의 소스를 Bar.java 라는 이름으로 변경해 주거나
또는 클래스 이름을 "public class Foo" 이렇게 파일명과 동일하게 지정하면 해결이 됩니다.

그러나 클래스명을 foo 이렇게 하거나, 파일명을 bar.java 이렇게 하면 안됩니다.
클래스명과 파일명에서 대소문자를 구분하기 때문입니다. 리눅스뿐 아니라, 윈도우 환경에서도 마찬가지입니다.


결론


클래스 이름과 소스 파일명을, (대소문자까지) 동일하게 해주면 에러가 없어집니다.

☞ 자바(Java)

Perl/펄] 파일의 중복된 행 지우기; 같은 줄, 동일 값 제거, Remove Duplicate Lines Text File

텍스트 파일에서, 같은 내용의 줄이 여러 번 중복되어 있는 경우에, 그 중복된 줄을 모두 지우고 하나씩만 남기는 방법입니다.

즉 파일의 데이터를 정돈하는 스크립트입니다.

delDupLine.pl test.txt
이렇게 명령행 옵션으로 텍스트 파일을 지정해 주면, test.txt 에서 중복된 줄을 모두 지우고 유일한 줄만 화면에 출력합니다.


화면 출력을 다시 텍스트 파일로 저장하려면, 즉 "새 이름으로 저장(Save As)" 하려면
delDupLine.pl test.txt > out.txt
이렇게 재지향(Redirection)을 사용하면 됩니다.


텍스트 파일의, 중복 라인(데이터) 삭제 프로그램


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

  foreach (<>) {
    chomp;
    print "$_\n" unless $_{$_}++;
  }



테스트용으로 사용할 텍스트 파일: test.txt
foo
foo
foo
bar

0
0
0
1
1
1
0
0
0

맹구는 복숭아를 먹었습니다.
맹구는 복숭아를 먹었습니다.
맹구는 복숭아를 먹었습니다.

1twyw
2yeyeye
3tuteute
4646464
557575
6yeyt
7ryryre
8ytrwyrw
968486
065yrhdhd

2yeyeye
6yeyt
2yeyeye

AAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCCCCCC
EEEEEEEEEE
EEEEEEEEEE
FFFFFFFF
GGGGGG
HHHHHHH
IIII
JJJJJJ
KKKKKKK
LLLLLLL
MMMMMMM
NNNNNNN


AAAAAAAAAAAAAA
GGGGGG
HHHHHHH
IIII
JJJJJJ

자장면
자장면
자장면
탕수육
탕수육
자장면
탕수육
짬뽕
맹구는 복숭아를 먹었습니다.


GGGGGG
GGGGGG
GGGGGG
GGGGGG



실행 결과:
(윈도우에 액티브펄(ActivePerl)을 설치한 후, 실행한 결과임)
D:\Z>delDupLine.pl test.txt
foo
bar

0
1
맹구는 복숭아를 먹었습니다.
1twyw
2yeyeye
3tuteute
4646464
557575
6yeyt
7ryryre
8ytrwyrw
968486
065yrhdhd
AAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCCCCCC
EEEEEEEEEE
FFFFFFFF
GGGGGG
HHHHHHH
IIII
JJJJJJ
KKKKKKK
LLLLLLL
MMMMMMM
NNNNNNN
자장면
탕수육
짬뽕

D:\Z>


중복된 줄이 말끔히 지워지고, 유일한 줄만 남았습니다.



코드 설명


  foreach (<>) {
    chomp;
    print "$_\n" unless $_{$_}++;
  }


소스 자체는 어처구니 없을 정도로 짧고 간단한데, 알고리즘이랄까 내용은 좀 복잡합니다.

foreach (<>) {...
명령행 옵션으로 입력해 준, 텍스트 파일을 1행씩 읽어, 기본 변수인 $_에 차례로 담습니다.

chomp;
라는 것은, 라인 끝의 개행문자를 제거합니다. 개행문자(줄바꿈 문자)를 제거하지 않으면, 줄 끝의 개행문자의 유무에 따라, 같은 문자열도 다른 문자열로 간주되는 문제가 생깁니다. chomp 뒤에 아무것도 적어 주지 않으면, 기본 변수인 $_ 의 끝에서 개행문자를 지웁니다.


print "$_\n" unless $_{$_}++;

unless 라는 것은 if문의 반대입니다. 조건에 맞지 않으면 뭘 하라는 뜻인데, 여기서는 $_{$_}++ 라는 조건이 거짓(undef; 초기화되지 않은 값)이라면 print문을 실행하라는 뜻입니다. 플러스 플러스(++)로 1 이상이 되면, 아까 처리했던 줄이니 출력하지 말라는 것입니다.



더 자세한 설명은 다음과 같습니다:


기본 디폴트 해쉬인 %_ 의 변수적 표현인 $_{} 이곳에
$_{현재 행}
이렇게 현재 행을 통째로 키(key)로 삼아 집어 넣고, 해쉬의 그 요소의 값(value)을 +1 하여 증가시킵니다. (뭘 계산하기 위해서 증가시키는 것이 아니고, 참/거짓의 논리값을 얻기 위한 트릭입니다.)

만약 처음 마주친 줄이라면, 그 해쉬 요소의 값은 초기화되지 않은 undef 즉 null 이기에 논리값이 거짓(false)입니다. 거짓이면 그 줄이 print 됩니다. (unless 는 if의 정반대이기에)

만약 아까 보았던 줄이라면, 즉 "중복된 줄"이라면, 그 해쉬의 값이 ++ 에 의해 undef 에 1이 더해져서 1이나 1이상의 값이 되어 있을 것입니다.

해쉬의 값이 1이나 1 이상일 경우, 펄에서 0 은 거짓, 0이 아닌 숫자는 참이기에, 그 중복된 줄은 "참(true)"이 되어 print 되지 않습니다. (unless 는 if의 정반대이기에)

따라서, 결국 유일한 줄, 즉 유니크(Unique)한 줄만 프린트되고, 중복된(Duplicated) 줄은 자연스레 무시되는 것입니다.


자장면 : 현재 $_{자장면} 의 값은 undef
자장면 : 이제 $_{자장면} 값은 1. 앞의 자장면에서 +1 했기에
자장면 : $_{자장면} 의 값은 이제 2로 증가
탕수육 : $_{탕수육} 은 처음 나왔으니 undef


위의 경우, 맨 처음 나온 "자장면"이라는 줄만 출력되고, 다음 줄의 자장면들은 모두 무시됩니다. 왜냐하면 2번째 "$_{자장면}" 부터는 값이 undef 이 아니기 때문입니다.





파일에서, 중복된 빈 줄들만 삭제하는 방법: ▶▶ 펄/Perl] 여러 개의 빈줄 제거, 하나의 빈줄로 합치기, Collapse Multiple Blank Lines Into One

☞ Perl(펄)

Tuesday, November 28, 2006

grep 명령] 찾은 문자열/단어 개수 출력, 행의 개수 출력: Count of String, Linux Unix

grep 명령어에서, 찾은 문자열의 개수를 출력하려면 소문자로
-c
옵션을 붙이면 됩니다. 그런데 실은 문자열의 개수가 아니라 그 문자열이 포함된 행의 개수입니다.

(문자열이나, 정규식에 매치되는 모든 단어의 개수를 구하는 방법은 여기에 있습니다: ▶▶ Perl/펄] 파일 속의 문자열 개수 세기; Count All (grep 확장 스크립트))



grep: 특정 문자열이 있는 행의 개수 세기 예제


테스트용으로 사용할 텍스트 파일 2개:

0.txt 파일의 내용:
foo



test.txt 파일의 내용:
foo

foo bar foo foo foo FOO

Foofoo

122 22 11 1000000000

142

771



0.txt 라는 파일에는 foo 라는 문자열이 1개 있고
test.txt 라는 파일에는 foo 라는 문자열이 8개 있습니다.

그냥 실행하면 다음의 첫번째 실행 결과처럼, 찾은 행 자체가 출력됩니다.

-c 옵션을 붙이면 찾은 회수(행의 개수)를 숫자로 표시합니다.

D:\Z>grep 'foo' *.txt
0.txt:foo
test.txt:foo
test.txt:foo bar foo foo foo FOO
test.txt:Foofoo

D:\Z>grep -c 'foo' *.txt
0.txt:1
test.txt:3

D:\Z>


test.txt 파일에 foo 라는 단어가 8개 있지만, 3개로 나왔습니다. 3개의 행 속에서 foo 가 발견되었다는 뜻입니다.

정확한 foo 의 숫자를 세기 위해서는 역시 Perl 스크립트로 세어야 하더군요: ▶▶ Perl/펄] 파일 속의 문자열 개수 세기; Count All (grep 확장 스크립트)


단어 수, 200자 원고지 장수, 줄 수 계산기: ▶▶ 단어수 세기, 200자 원고지 매수 계산, 줄수 행 개수; Word Counter



Perl/펄] 파일 속의 문자열, 단어 개수 세기; Count All (grep 확장 스크립트)

울트라에디트의 Find(찾기) 대화상자에 보면 "Count All" 이라는 버튼이 있습니다. 현재 문서에서, 특정 문자열이 몇 개 있는지 모두 세는 것입니다.

그 기능을 펄로 구현해 보았습니다. 유닉스의 문자열 찾기 명령인 grep 에도 이런 기능이 있긴 한데, "문자열이 있는 행의 수"를 셀 수 있을 뿐, 문자열 자체의 개수는 세지 못했습니다. 그래서 직접 이런 스크립트를 만들었습니다.


String/Regex Counter: 문자열/정규식 매치 카운터; 찾은 개수 세기


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

  # 옵션 없거나 부족하면 도움말 출력하고 종료
  &help if ($#ARGV < 1);

  my $count = 0;
  my $search = $ARGV[0]; # 1번째 옵션은 찾을 문자열 또는 정규식


  # 2번째 옵션으로 지정해 준, 텍스트 파일 열기
  open IN, "<", "$ARGV[1]" or die "$ARGV[1] : $!\n";

  while (<IN>) { # 1행씩 읽기
    while (/$search/gi) { $count++; } # 현재 행 속에서 단어들 찾기
  }


  print "'$search' : $count Time(s) Matched";

  close IN; # 파일 닫기




sub help { # 도움말 출력 함수
  die <<TEXT;

    Count of matched Word or Regex  (v0.1)


      Usage:
        countAll.pl word <filename>
        countAll.pl regex <filename>

      Example:
        countAll.pl foo test.txt
        countAll.pl \\d+ test.txt

TEXT
}



while (<IN>) {...
이 줄은 실행시 옵션으로 입력해 준 텍스트 파일을 1행씩 읽어, 기본 변수인 $_ 에 넣습니다.


while (/$search/gi) { $count++; }...
이 줄은, 현재 읽은 행에서 $search 변수 속의 단어를 찾고, 만약 단어가 있으면 $count 를 1개 증가시킵니다. 찾는 문자열이 한 행에 여러 개 있으면 계속 카운터가 올라갑니다.




테스트용으로 사용할 test.txt 파일 내용:
foo

foo bar foo foo foo FOO

Foofoo

122 22 11 1000000000

142

771


countAll.pl <찾을 문자열 또는 정규식> <파일명>
순으로 옵션을 입력합니다.


실행 결과:

D:\Z>countAll.pl foo test.txt
'foo' : 8 Time(s) Matched
D:\Z>countAll.pl \d+ test.txt
'\d+' : 6 Time(s) Matched
D:\Z>



대소문자 구분 없이 찾고, Foofoo 이렇게 2개가 연결된 문자열도 2개로 판단합니다.

문자열 대신에 \d+ 이런 정규식으로 찾을 수도 있습니다. \d+ 는 숫자를 모두 찾으라는 것입니다.




현재 코드의 한계:

* 와일드카드는 되지 않고, 1개의 파일 속에서만 문자열을 찾습니다.

* 유니코드 파일을 처리하지 못합니다.




▶▶ grep 명령] 찾은 문자열/단어 개수 출력, 행의 개수 출력: Count of String, Linux Unix

단어 수, 200자 원고지 장수, 줄 수 계산기: ▶▶ 단어수 세기, 200자 원고지 매수 계산, 줄수 행 개수; Word Counter

리눅스/유닉스에서 파일 찾는 방법; 디렉토리 찾는 법; File Find Command LINUX UNIX

유닉스(UNIX)나 리눅스(LINUX)에서는

find

라는 명령으로, 파일이나 디렉토리를 찾을 수 있습니다. (반드시 소문자로 입력해야 합니다.) grep 과 달리, 파일 속의 문자열을 찾는 것이 아니라, 파일명을 대상으로 파일 자체를 찾습니다.


find 명령 사용법은 여기에 있습니다: ▶▶ 리눅스 파일 찾기 명령: find 사용법 예제, Linux File Find Command



find 명령으로 파일을 찾으면, 찾아진 파일들의 목록이 터미널(콘솔) 화면으로 출력됩니다. 그 출력 결과를 텍스트 파일로 저장하는 방법입니다: ▶▶ 유닉스 파일 찾기] find 명령어 출력 결과를, 텍스트 파일로 저장; UNIX File Find Command


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

HTML] 아랍어, 오른쪽에서 왼쪽 방향으로 쓰기, 언어 속성 지정; Arabic Direction LANG attribute

아랍어는 우측에서 좌측 방향으로 쓰기 때문에 웹페이지도 그렇게 방향을 조정해 주어야 합니다.

쓰기 방향을 바꿀 때 사용하는 "태그 속성"과 값은 dir="rtl" 입니다.


그리고 아랍어라는 언어를 브라우저에게 명시적으로 알려주기 위해서는 LANG 속성을 사용하는 것이 좋습니다.

아랍어의 언어 속성은 lang="ar" 입니다.


페이지의 특정 구역에만 아랍어가 있을 경우에는 그 특정 태그에

그리고 전체 페이지가 아랍어라면 다음과 같이 <html> 태그에 직접 삽입합니다.

<html dir="rtl" lang="ar">
...



예제는 이 게시물에 있습니다: ▶▶ HTML] 아랍어 인코딩; 아라비아어 웹페이지; Arabic Encoding charset


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

HTML] 아랍어 인코딩; 아라비아어 웹페이지; Arabic Encoding charset

아랍어에서는 windows-1256 이라는 인코딩을 사용합니다. "Windows Arabic codepage" 입니다. 아랍어 사이트들을 방문해서 분석해 보니 모두 windows-1256 을 사용하더군요.


아랍어 웹페이지 예제


<html dir="rtl" lang="ar">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256" />
<title>Welcome to Arabic Encoding Test Page</title>
</head>

<body>

الإمارات تنتج يوميا 2.6 مليون برميل (أسوشيتد برس-أرشيف)
أعلنت حكومة دبي أمس أنها ستدير موارد نفط دبي البحرية بعدما تنهي وحدة من شركة كونوكوفيلبس الأميركية دورها في الإدارة.

ويمثل ذلك نهاية أول امتياز نفطي بحري تمنحه حكومة دبي. ومن المقرر أن يسري هذا التغيير في أبريل/نيسان 2007.

وسيستمر التعامل في نفط دبي بشكل حر في سوق النفط الدولية بموجب التعاقدات التي أبرمتها الحكومة ومؤسسة بترول دبي، وهي شركة جديدة تملكها بالكامل حكومة دبي.

وستكون مؤسسة بترول دبي مسؤولة عن إدارة حقول النفط وكل الأنشطة المستقبلية المتصلة بإنتاج النفط والغاز في الإمارة.

يشار إلى أن الإمارات عضو منظمة الدول المنتجة للنفط (أوبك)، تنتج يوميا 2.6 مليون برميل من النفط.

</body>
</html>


(위의 예제는 ☞ EmEditor 같은 전문적인 다국어 에디터에서 아랍어로 설정한 후 저장해야 합니다.)


<meta http-equiv="Content-Type" content="text/html; charset=windows-1256" />

이라는 인코딩 정의 태그는, 다른 모든 메타 태그보다 위에 있어야 합니다. 특히 title 태그보다 위에 있어야 합니다. 그렇지 않으면 IE 에서 "인코딩 자동 선택"을 켜 놓았을 경우에, 웹페이지가 전혀 보이지 않고 그냥 하얗게 뻗어 버리는 경우가 생깁니다.



한국인이 아랍어 페이지를 만든다면, UTF-8 인코딩이 좋을 것입니다. 한글과 아랍어를 동시에 쓸 수 있기 때문입니다. (▶▶ [HTML-CSS] 한국어 웹문서 인코딩 charset 종류: euc-kr / UTF-8 / ks_c_5601-1987 참고)




▶▶ HTML] 아랍어, 오른쪽에서 왼쪽 방향으로 쓰기, 언어 속성 지정; Arabic Direction LANG attribute

▶▶ 아랍어 폰트 / 아라비아어 글꼴 다운로드 하는 곳은? - Arabic Fonts

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

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

자바에서 "배열 사이즈"를 얻는다는 것은, "배열 요소의 개수"를 구하는 것입니다. 여기에 배열 요소의 수를 구하는 법이 있습니다: ▶▶ 자바 Java] 배열 요소 개수 구하기; Number of Array Elements


sizeof 연산자로 구하는 법은?


C에는 sizeof 연산자가 있지만, 자바에는 없습니다. 자바에서는 배열의 진짜 크기를 알 필요가 없기 때문입니다. 자바 가상머신이 메모리 관리를 자동으로 알아서 해줍니다.

그렇지만 굳이 배열의 진짜 크기를 구해야 한다면 다음과 같은 방법이 있을 것입니다.


문자열 배열 크기 (글자 개수) 구하기 예제


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

    String[] songs = { "사랑에 속고 돈에 울고", "백만송이 장미", "애정이 꽃피던 시절", "Saddle The Wind", "밤배" };

    int size = 0;

    for (int i = 0; i < songs.length; i++) {
      size += songs[i].length(); // 각 배열 요소의 글자 수 합계 구하기
      System.out.println(songs[i].length() + " : " + songs[i]);
    }

    System.out.println(); // 줄바꿈
    System.out.println("Total Array Size: " + size);

  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
12 : 사랑에 속고 돈에 울고
7 : 백만송이 장미
10 : 애정이 꽃피던 시절
15 : Saddle The Wind
2 : 밤배

Total Array Size: 46

D:\Z>


글자 수는 (공백까지 포함하여) 총46개입니다. 자바에서 글자는 "16비트 유니코드 (UTF-16BE)"이기에, 한글이든 영문이든 공백이든 항상 2바이트입니다. 바이트 수로 따지면 곱하기 2 를 하여, 결국 songs 라는 문자열 배열의 크기는 92 바이트가 되는군요.

그렇지만 유니코드가 아닌 아스키 텍스트로 따진다면, 한글/한자 등은 2바이트, 영문/숫자/공백/기호 등은 1바이트로 계산해 주어야 합니다.




그리고 자바 자료형에서, int/float형 변수 1개는 4바이트, long/double형 변수 1개는 8바이트이기에
배열 요소 개수에, 4나 8 등의 바이트 수를 곱하면, 전체적인 배열 크기를 바이트 단위로 구할 수 있겠지요.

또한 책에 보면 자바의 불린(Boolean) 자료형은 "1비트" 크기라고 되어 있는데, 항상 1비트는 아니고 경우에 따라서 "1바이트"가 될 수도 있는 것 같습니다. 이것은 명확하게 규정이 되어 있지 않더군요.


☞ 자바(Java)

Monday, November 27, 2006

VIM (VI, GVIM) 텍스트 입력 시작, 편집(Edit) 명령어; 빔 에디터 기초 사용법

윈도우용 텍스트 편집기들과는 달리, 빔(VIM, VI, GVIM) 에디터를 실행하면, 즉시 글자를 입력할 수 없습니다.

반드시
i

이렇게 i 키 (알파벳 아이) 를 눌러 주어야, 입력이 가능한 "INSERT" 모드가 됩니다.

(만약 i 키가 먹히지 않는다면, 한글 입력 모드라서 i 대신 "ㅑ" 라는 글자가 입력되어서 그럴 것입니다. 영문 입력 모드로 전환한 후, 다시 i 키를 누르면 됩니다.)



다시 명령어 입력 모드로 돌아오기 위해서는, 키보드의 Esc키를 누릅니다.

예를 들어, 텍스트를 저장하려면, Esc키를 눌러 준 후

:w

라고 하면 저장(Save)됩니다.




파일 열기: ▶▶ [Vim / GVim 에디터] 파일 열기(오픈)/저장 명령은?


빔 에디터를 종료하는 법, 새 이름으로 저장하는 법: ▶▶ VIM (VI, GVIM) 빔 에디터, 종료 명령어, 빠져 나오는 법; Exit Quit





빔 에디터 강좌: ☞ Vim

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

C언어] 문자 대소문자 변환; 대문자로 소문자로; char, int to Uppercase Lowercase

문자열이 아닌, 문자(char) 1개의 대소문자를 변환하는 방법입니다.

참고로, 큰따옴표로 두른 "A" 는 문자열이지만, 작은따옴표로 두른 'A' 는 문자열이 아니라 char형 상수입니다.


ctype.h 의

toupper() 함수는 소문자를 대문자로

tolower() 함수는 대문자를 소문자로 바꾸는데,

두 함수 모두 char 가 아닌 int형으로 입출력합니다. 그렇지만 char는 int 속에 포함되므로, char나 int나 둘 다 사용 가능합니다. (int형으로도 글자를 표현할 수 있습니다. 아스키 코드 값으로.)


알파벳 문자(char, int): 대문자 <-> 소문자 바꾸기 예제


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

int main(void) {
  int i = 0x4D;   // 16진수 4D 는, 알파벳 대문자 M 입니다.
  char ch = 'X';


  // 문자(char)를 대문자로
  printf("%c\n", toupper('a'));
  // 출력 결과: A


  // 문자(char)를 소문자로
  printf("%c\n", tolower('A'));
  // 출력 결과: a


  // 정수(int)로 표현된 문자 M 을, 소문자로 변환
  printf("%c\n", tolower(i));
  // 출력 결과: m


  // char 타입을, 소문자로 변환
  printf("%c\n", tolower(ch));
  // 출력 결과: x


  return 0;
}



문자열의 대소문자 변환 방법: ▶▶ C언어] 문자열 대소문자 변환, 대문자로 소문자로; String to Uppercase Lowercase


대소문자 온라인 변환기: ▶▶ 대소문자 변환기, 알파벳 대문자로 소문자로 바꾸기; Case Converter

해왕성 천문 사진 (보이저 촬영): Neptune Photo NASA

해왕성(Neptune)

해왕성(Neptune) 사진




보이저 2호(Voyager 2)가 1989년에 해왕성 근처를 지나면서 찍은 사진입니다.

허블 우주 망원경(Hubble Space Telescope; HST)으로는 해왕성이 이렇게 선명하게 찍히지 않더군요. 너무 가까워서 그런 것인지 아니면 허블 망원경의 해상도가 그 정도인지는 모르겠습니다. (명왕성의 표면을 제대로 찍지 못하는 것으로 봐서는 해상도 문제인 것 같습니다.)


< NASA: Catalog Page for PIA00046 >
여기에 있는 것이 원본 사진인데, 원본이 너무 어두워서 조금 밝게 조정한 것이, 이 게시물의 사진입니다.


▶▶ SkyMap (스카이맵): 천문학 소프트웨어, 밤하늘 별자리 보기 / 가상 천문 관측 - PC Planetarium

C언어] 문자열 대소문자 변환, 대문자로 소문자로; String to Uppercase Lowercase

strupr() 함수는 문자열 속의 모든 알파벳 소문자를 모두 대문자로 만듭니다.
즉 문자열 전체를 대문자화시킵니다. 알파벳 외의 다른 글자 (구두점/숫자/한글/한자 등) 는 변환하지 않고 그대로 둡니다.

반대로, strlwr() 함수는 소문자화시킵니다.

두 함수 모두, 인수로 입력받은 문자열 자체를 변환해 버립니다.

string.h 헤더 파일을 인클루드해주어야 사용할 수 있습니다.


문자열 알파벳 대문자 <-> 소문자 바꾸기 예제


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

int main(void) {

  char s[] = "abc ABC 가나다라 foo Google";


  // 소문자를 모두 대문자로
  printf("%s\n", strupr(s));
  // 출력 결과: ABC ABC 가나다라 FOO GOOGLE


  // 대문자를 모두 소문자로
  strlwr(s);
  printf("%s\n", s);
  // 출력 결과: abc abc 가나다라 foo google


  return 0;
}



참고로, 영어에서,

대문자를 Upper-case
소문자를 Lower-case

"대소문자 구분"을 Case Sensitive

"대소문자 구분하지 않음"을 Ignore Case

라고 합니다.





문자열이 아닌, 문자 1개의 대소문자 변환: ▶▶ C언어] 문자 대소문자 변환; char, int to Uppercase Lowercase

☞ C/C++

PHP] HTML 본문 텍스트 추출, 태그 제거; HTML to TEXT; Strip Tags

원래는 정규식이나 Perl 로, HTML에서 텍스트 추출, 즉 "태그 삭제"를 해보려고 했는데, 아무리 해도 되지 않았습니다. 물론 간단하고 잘 정돈된 HTML 파일은 추출이 되는데, 좀 복잡하고 오류가 있거나 비표준이거나, 또는 태그 사이에 줄바꿈이 있다거나 하면 추출하지 못했습니다.


PHP 로 해보았더니 비교적 잘 되었습니다. 그렇지만 완벽하지는 않고, CSS 선언 부분을 제거하지 못하는 등의 문제는 여전히 있었습니다.

HTML 전문 언어인 PHP로도 어려운 걸 보니, 역시 본문 추출이라는 것이 보통 일이 아닌 것 같습니다.

HTML2TXT: HTML 웹문서의 TAG 지우고 본문만 남기기


파일명: strip_tags.php
<?php

  $s = strip_tags(join('',file($argv[1])));
  print $s;

?>


PHP를 설치한 후(여기서는 윈도우용을 설치했음), 도스창(명령 프롬프트;CMD.EXE)에서

php strip_tags.php test.html

이렇게 해주면, test.html 이라는 파일에서 본문만 추출되어 화면으로 출력됩니다.


추출 결과를 텍스트 파일로 저장하기 위해서는

php strip_tags.php test.html > out.txt

이렇게 하면 됩니다.




수동으로 태그 삭제 방법


웹 브라우저에서 HTML 파일을 부른 후, Ctrl+A 키를 누르면 전체 텍스트가 선택됩니다.

Ctrl+C 키를 눌러 복사한 후, 메모장 등의 편집기에서 Ctrl+V 키로 붙여 넣으면, 본문만 추출됩니다.

가장 원시적인 방법이지만, 가장 완벽하게 텍스트 추출을 할 수 있습니다.




또는 브라우저의,

메뉴: 파일 > 다른 이름으로 저장

에서, "모든 웹 페이지(*.htm;*.html)" 가 아닌
"텍스트 파일(*.txt)" 를 선택하면, 태그가 제거된 텍스트만 저장됩니다.





Sunday, November 26, 2006

Java/자바] Math.random() 사용법; 랜덤(난수) 정수(int) 구하기 예제 소스

java.util.Random 클래스를 사용하지 않고

Math.random() 으로 간단히 난수를 만드는 예제입니다.


Random 클래스 없이, 간단히 정수 난수 구하기 예제


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


    // 0.0 ~ 1.0 사이의 실수 난수 구하기
    for (int i = 1; i <= 20; i++)
      System.out.println(Math.random());

/* 출력 결과:
0.8835488755737285
0.7442235907969202
0.04143887519495115
0.7752670113987891
0.525644276817284
0.9810655979902362
0.9857864655525691
0.5176456441171947
0.9534154184106848
0.5711598917262706
0.9167881479510426
0.9683895991289863
0.5570482364156645
0.640266931881892
0.7521635329694171
0.37944742406283405
0.1930044225804538
0.6713601888567906
0.28656122448550325
0.9697966362643208
*/




    // 1 ~ 10 까지의 정수 난수 구하기
    for (int i = 1; i <= 20; i++) {
      int n = (int) (Math.random() * 10) + 1;
      System.out.println(n);
    }

/* 출력 결과:
8
4
2
2
7
1
3
7
10
3
7
2
10
8
3
5
4
10
4
1
*/


  }
}



Math.random() 메소드(함수)는, "0.0 이상에서 1.0 미만 (greater than or equal to 0.0 and less than 1.0)"의 double형 실수 값을 반환합니다. 즉, 0.0 은 나올 수 있지만 1.0 은 나올 수 없습니다.

"난수 발생기 초기화"는 자동으로 실행되기에, 직접 초기화할 필요는 없습니다. (반면 C언어에서는 srand() 함수로 난수 발생기를 초기화해 주어야 합니다)




java.util.Random 클래스로 난수를 만드는 법: ▶▶ [자바/Java] 랜덤(난수) 정수/실수/불린 출력 예제 - Random, nextInt() 메소드

지정한 범위 내에서만 난수 출력 방법: ▶▶ Java/자바] 특정 범위의 숫자(정수) 랜덤 출력: Random Range Min Max



자바가 아닌, 자바스크립트에서는 다음과 같이: ▶▶ 자바스크립트 랜덤(Random)/난수 만들기 예제, JavaScript

☞ 자바(Java)

가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random

각종 프로그래밍 언어에서, "가우스 분포(정규 분포; Normal Distribution)"의 난수 Gaussian Random 를 구하는 함수들입니다.


【 Gaussian Random Number Generator 】



정규분포 난수, 가우시안 랜덤 넘버 생성기: ▶▶ 정규분포 난수, 가우시안 랜덤 발생기; Normal Distribution Rand Generator

C/비주얼C++


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



자바(Java)


java.util.Random 클래스의 nextGaussian() 메소드로 가우스 난수 구하기: ▶▶ 자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제


자체적으로 구현: ▶▶ 자바/Java] 가우시안(가우스;Gaussian) 난수 자체 구현; Gauss Random Number



Perl(펄)


펄입니다: ▶▶ Perl/펄] 가우스 난수/가우시안 랜덤 발생 함수; Gaussian Random



VB: 엑셀(Excel) VBA 매크로


비베로 구하는 방법: ▶▶ Excel/엑셀] 가우스 난수/가우시안 랜덤 발생 함수; Gaussian Random VBA 매크로



Python (파이썬)


▶▶ Python/파이썬] 표준 정규분포 난수, 가우시안 랜덤 발생 함수; Gauss Random



자바스크립트(JavaScript)


▶▶ 자바스크립트] 정규분포(가우스 분포) 난수(랜덤) 발생 함수; JavaScript Gauss Random



매스매티카(Mathematica)


▶▶ 매스매티카 Mathematica, 정규분포, 가우스 분포 랜덤 난수 발생 함수; Normal Distribution



PHP


▶▶ PHP, 정규분포 난수 생성, 가우스 분포 랜덤 발생 함수; Normal Distribution

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

▶▶ C언어] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제 여기에 있는 가우스 함수를 좀 간단하게 만든 것이, 이 게시물입니다. 결과는 똑같습니다.


정규 분포 랜덤 난수 발생 함수; (Gaussian Random; Gauss)


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

double gaussianRandom(void);


int main(void) {
  srand(GetTickCount());

  for (int i = 1; i <= 50; i++)
    printf("%.17f\n", gaussianRandom());

  return 0;
}




double gaussianRandom(void) {
  double v1, v2, s;

  do {
    v1 =  2 * ((double) rand() / RAND_MAX) - 1;      // -1.0 ~ 1.0 까지의 값
    v2 =  2 * ((double) rand() / RAND_MAX) - 1;      // -1.0 ~ 1.0 까지의 값
    s = v1 * v1 + v2 * v2;
  } while (s >= 1 || s == 0);

  s = sqrt( (-2 * log(s)) / s );

  return v1 * s;
}



컴파일 및 실행 결과:
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
0.97245226306248322
0.24682554742988275
0.03399690543556370
-1.92099484722249510
0.02775523712314788
0.40535296910299418
1.24989706616340790
-0.03605704597324999
-1.46928951594857750
-0.69524409783095309
0.22335936128451783
-0.71284728214546456
-0.30582161643288203
0.82690960662654422
0.26541871437854253
2.53888204555763860
0.48826125405237963
1.63857615499787410
-1.23917152856907230
-0.74766075931809939
0.06904525622692098
-0.02590554346444064

... 이하 생략 ...





다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random


일반 난수 구하는 법: ▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수






업데이트:

이것은, 평균과 표준편차를 사용자 지정하여 난수를 구하도록 약간 수정한 소스입니다. 아래와 같습니다:

#include <stdio.h>
#include <math.h>
#include <Windows.h>

double gaussianRandom(double average, double stdev);


int main(void) {
  srand(GetTickCount());

  for (int i = 1; i <= 50; i++)
    // 평균은 -3.6 이고, 표준편차는 0.5 의 경우
    printf("%.17f\n", gaussianRandom(-3.6, 0.5));
  return 0;
}


double gaussianRandom(double average, double stdev) {
  double v1, v2, s, temp;

  do {
    v1 =  2 * ((double) rand() / RAND_MAX) - 1;      // -1.0 ~ 1.0 까지의 값
    v2 =  2 * ((double) rand() / RAND_MAX) - 1;      // -1.0 ~ 1.0 까지의 값
    s = v1 * v1 + v2 * v2;
  } while (s >= 1 || s == 0);

  s = sqrt( (-2 * log(s)) / s );

  temp = v1 * s;
  temp = (stdev * temp) + average;

  return temp;
}



자바/Java] 가우시안(가우스;Gaussian) 난수 자체 구현; Gauss Random Number

java.util.Random 클래스의 nextGaussian() 이라는 메서드(함수)로 가우스 난수를 구할 수 있지만,

여기서는 자체적으로 직접 구현하는 방법을 소개합니다.

정규 분포 랜덤 난수 발생 함수; (Gaussian Random; Gauss)


파일명: Foo.java
import java.util.*;                    // Arrays.sort()에 필요

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

    final int SIZE = 50;               // 배열 크기 정의
    double[] d = new double[SIZE];


    for (int i = 0; i < SIZE; i++)
      d[i] = gaussianRandom();         // 가우스 난수 만들어 배열에 넣기

    Arrays.sort(d);                    // 편의상 배열 정렬


    for (int i = 0; i < SIZE; i++)
      System.out.println(d[i]);        // 배열 출력

  }


  public static double gaussianRandom() {
    double v1, v2, s;

    do {
      v1 = 2 * Math.random() - 1;      // -1.0 ~ 1.0 까지의 값
      v2 = 2 * Math.random() - 1;      // -1.0 ~ 1.0 까지의 값
      s = v1 * v1 + v2 * v2;
    } while (s >= 1 || s == 0);

    s = Math.sqrt( (-2 * Math.log(s)) / s );

    return v1 * s;
  }


}


위의 소스 아래쪽의 gaussianRandom() 이라는 메소드가 "가우스 랜덤 넘버" 하나를 만들어 반환합니다.

출력 결과를 알아보기 쉽게 하기 위해서, 가우스 난수들을 크기순으로 소팅했습니다.



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
-2.132084165440264
-1.8797140083473551
-1.8783599881938347
-1.5777994537041908
-1.5373755768364852
-1.4411285894218837
-1.4341236220849631
-1.357940215562526
-1.2063247809542141
-1.1999377390349115
-1.180848609731194
-0.979635410009202
-0.874804796029493
-0.716332482602338
-0.6398680614815994
-0.6165767635651549
-0.5312493877959292
-0.49262259085108734
-0.48662907359084734
-0.3533616481982741
-0.24777202508635732
-0.23208552559376514
-0.1832688119350085
-0.04969234751561035
0.01447268507048514
0.12179669638268552
0.12242841272760417
0.1350055666896621
0.17629202319867104
0.23118057403642095
0.28879987828068193
0.28998535559117283
0.3881026372900624
0.3925536211327726
0.43621425353703214
0.45307780910998297
0.49100305116244924
0.5921390138122935
0.6433218261644735
0.6624223092018567
0.6646493269230213
0.7022253858257572
1.0436976988369973
1.127918453214893
1.1717282042764685
1.1901723943887463
1.5008490274789665
1.7758392898261126
1.9640375701715793
2.6692188711517018

D:\Z>


0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다. (반면 일반적인 랜덤 함수는 모든 숫자가 같은 확률로 나옵니다.)



java.util.Random 클래스의 nextGaussian() 메서드 사용 예제는 여기에 있습니다: ▶▶ 자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제

▶▶ Java/자바] 한국 남녀 키(신장)의 평균, 표준편차 랜덤 난수 생성; Human Stature Random Number


다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random

Perl/펄] 가우스 난수/가우시안 랜덤 발생 함수; Gaussian Random

가우스 분포 Gaussian (Normal) Distribution 의 무작위 난수(Random Number)를 발생시키는 함수를 만드는 방법입니다.

펄의 rand() 함수는 모든 숫자가 같은 확률로 나옵니다. 그렇지만 가우시안 분포의 난수들은 종 모양 즉 Bell Curve 를 가집니다.

평균(Mean)은 0
표준편차(Standard Deviation)는 1 입니다.


정규 분포 랜덤 함수; (Gaussian Random; Gauss)


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

  my @a;


  # 가우시안 난수 만들어, 배열에 넣기
  for (my $i = 1; $i <= 50; $i++) {
    push @a, &gaussianRandom;
  }


  @a = sort {$a <=> $b} @a;    # 숫자 크기순 정렬
  print $_, "\n" foreach (@a); # 배열 출력




sub gaussianRandom {
  my ($v1, $v2, $s);

  do {
    $v1 = 2 * rand() - 1;        # -1.0 ~ 1.0 까지의 값
    $v2 = 2 * rand() - 1;        # -1.0 ~ 1.0 까지의 값
    $s = $v1 * $v1 + $v2 * $v2;
  } while ($s >= 1 || $s == 0);

  $s = sqrt( (-2 * log($s)) / $s );

  return $v1 * $s;
}


gaussianRandom 이라는 함수(Function)가 가우스 난수를 발생시키는 본체입니다.


그런데 실행 결과를 쉽게 알아보기 위해서, 가우스 난수들을 크기 순으로 정렬하여 출력하였습니다. (▶▶ 펄/Perl] 숫자 배열 정렬(소팅), sort 함수 사용법: Sort Number Array 참고)


실행 결과:
(50개의 가우스 난수들이 크기 순으로 소팅되어 출력됩니다.)
-2.02342968236564
-2.01633266126133
-1.92046262081684
-1.88268227559408
-1.87234425636353
-1.7084184140151
-1.55708670410055
-1.40806593452702
-1.26982308262832
-1.20558537064328
-0.893057665444112
-0.841678446608124
-0.714984722829145
-0.68434655170491
-0.656702010516672
-0.580209670489763
-0.514854717366368
-0.513271130187537
-0.464387581603892
-0.399022963285861
-0.376596539266183
-0.310459549805852
-0.298734652357049
-0.289914098153749
-0.280792272265552
-0.271282165909082
-0.170171518058607
-0.150130296235735
-0.0888330149672835
-0.050405436892452
0.029519296099437
0.046417155572673
0.0477392620510434
0.12803999889267
0.177885547411445
0.194191891902784
0.262040174664585
0.26274333338753
0.366901456855656
0.54684412251242
0.793745666489606
0.863831701049744
0.948502638378713
0.978857255850438
1.14056397919119
1.29123177711295
1.40297677395333
1.43824583889233
1.62502462197163
3.18618764130342


0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다.


☞ Perl(펄)

Excel/엑셀] 가우스 난수/가우시안 랜덤 발생 함수; Gaussian Random VBA 매크로

가우스 분포 Gaussian (Normal) Distribution 의 무작위 난수(Random Number)를 발생시키는 함수를 만드는 방법입니다.

VBA 등의 VB(비베) 계열의 언어에서 사용되는 Rnd 함수는 모든 숫자가 같은 확률로 나옵니다. 그렇지만 가우시안 분포의 난수들은 종 모양 즉 Bell Curve 를 가집니다.

평균(Mean)은 0
표준편차(Standard Deviation)는 1 입니다.


정규 분포 랜덤 생성 함수; (Gaussian Random; Gauss)


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
Sub 가우시안_난수_테스트()

  Randomize

  Dim i


  For i = 1 To 100
    Cells(i, 1).Value = gaussianRandom()
  Next i


End Sub



Function gaussianRandom() As Double

  Dim v1 As Double, v2 As Double, s As Double


  Do
    v1 = 2# * Rnd - 1#
    v2 = 2# * Rnd - 1#
    s = v1 * v1 + v2 * v2
  Loop While s >= 1# Or s = 0#


  s = Sqr((-2# * Log(s)) / s)

  gaussianRandom = v1 * s

End Function


gaussianRandom() 이라는 함수(Function)가 가우스 난수를 발생시키는 본체입니다.

Sub 가우시안_난수_테스트() 는, gaussianRandom() 함수를 사용하여 엑셀의 셀에 가우스 난수들을 채워 넣는 작업을 합니다.


엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
엑셀 시트의 A열에 다음과 같은 가우시안 난수들이 자동으로 삽입됩니다.
-0.469287097
-0.343337066
-0.35287511
-1.301266745
-0.326555315
0.556893056
0.963412082
0.844206368
-1.321916181
-2.576545104
-0.891456547
-0.635364191
-1.416223156
1.741717729
-0.771012456
0.310829513
1.399024932
0.141894973
... 이하 생략...




엑셀의 셀에서 직접
=gaussianRandom()
이렇게 적어 주어도 됩니다.


정규분포 난수, 가우시안 랜덤 넘버 생성기: ▶▶ 정규분포 난수, 가우시안 랜덤 발생기; Normal Distribution Rand Generator

▶▶ Excel-엑셀-VBA] 남녀 키(신장)의 평균, 표준편차 랜덤 난수 발생; Human Stature Random Number

Saturday, November 25, 2006

CMD 란? CMD.EXE 실행하는 법; WINDOWS XP

CMD 라는 것은 도스창(명령 프롬프트) 입니다. 즉 "도스(DOS) 명령"을 실행하는 곳인데, 윈도우 안에도 도스창이 있습니다.

다음 그림에서, 검은색 창이 도스창입니다.

명령 프롬프트 [Command Processor]
윈도우 명령 프롬프트(CMD) 실행 장면 클릭하면 확대

위의 도스창을 실제로 생성하는 프로그램의 파일명이 바로 cmd.exe 입니다. 옛날 16비트 MS-DOS의 COMMAND.COM 이라는 "명령어 처리기"와 같은 역할을 하는 것인데, 다만 cmd.exe 는 32비트이고 기능이 더 많고 강력합니다.


CMD 파일의 위치


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

즉, "윈도우가 설치된 폴더" 밑의 system32 폴더(디렉토리)에 있습니다.


도스창(CMD.EXE)을 실행하는 법: ▶▶ 명령 프롬프트 [Command Processor] 란? [컴퓨터 초보자를 위한 강좌]


도스창에서 사용할 수 있는 각종 명령어 리스트: ▶▶ 모든 '도스 명령' 목록 보기, 윈도우2000 윈도우XP 에서

☞ 윈도우(WINDOWS)

가야금 연주 MIDI 파일 만들기 (미디; mid) お琴 - Koto, Okoto

미디(MIDI) 에는 표준적으로 128개의 악기가 포함되어 있습니다. 세계 각국의 민속악기도 많이 포함되어 있는데, 한국 악기는 없습니다.

그렇지만 MIDI로 가야금을 연주할 수 있습니다. 일본식 가야금인 "고토(Koto; 琴; こと)"라는 악기를 대신 사용하면 됩니다. 겸양어인 "" 를 앞에 붙여서 "오고토(お琴)"라고도 합니다.

한국식 가야금과 모양이나 소리가 거의 똑같습니다.


< '고토' 사진 보기 >



케이크워크(Cakewalk) 등의 미디 작곡 소프트웨어에서, 코토의 음으로 가야금 연주를 기록하든지 또는

피아노로 연주된 미디 파일을, SynthFont 같은 프로그램을 사용하여, 간단히 고토 연주로 변환할 수 있습니다: ▶▶ [MIDI] SynthFont: 사블 없이 사운드폰트로 미디 연주 (프리웨어)


진짜 한국식 가야금의 소리를 녹음하여, "사운드 폰트"를 만들어서 쓰는 방법이 가장 좋겠지만, 미디 전문가가 아니면 "사운드 폰트" 만드는 것은 어렵습니다.


▶▶ [QnA] 오르골(Orgel: Music Box) / 하프시코드(Harpsichord) / 밴조(Banjo) 로 연주된 미디(MIDI) 파일은?

▶▶ GM 미디 (General MIDI) 128개의 악기 목록

☞ 음악(Music)/MP3/MIDI

Java/자바] 한글 euc-kr (MS949) 파일을, 유니코드(UTF-8)로 변환 프로그램

현재 운영체제(OS)의 언어에 상관없이, "한글 확장완성형" 인코딩의 파일을 "유니코드(UTF-8)"로 변환하는 프로그램입니다.



한국어(EUC)를 유니코드(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 InputStreamReader(
                                                                   new FileInputStream(args[0]),
                                                                   "MS949"
                                                                   )
                                             );

      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);
    }

  }
}



컴파일 한 후,
euc-kr.txt 라는 이름의 한글 파일을 옵션으로 지정하고 실행한 장면:
D:\Z>javac Foo.java

D:\Z>java Foo euc-kr.txt

D:\Z>


이제 하드의 "현재 디렉토리"에 euc-kr.txt.uni 라는 유니코드(UTF-8)파일이 생성됩니다. 원본인 euc-kr.txt 와 내용은 똑같고, 인코딩만 다릅니다.




현재 운영체제 기본 인코딩의 텍스트 파일을 유니코드(UTF-8)로 변환: ▶▶ 자바,Java] 유니코드(UTF-8)변환, KS완성형 파일을 유니코드로 바꾸기


자바에서는 MS949 라는 인코딩을 사용해야만 "똠방각하" 등이 표현됩니다: ▶▶ Java/자바] 한글 확장 완성형; MS949 / cp949 인코딩(Encoding) 문제 해결; 차이 점


☞ 자바(Java)

Java/자바] 한글 확장 완성형; MS949 / cp949 인코딩(Encoding) 문제 해결; 차이, 차이점

자바에서는 MS949 와 cp949 가 약간 다른 인코딩이었습니다.


MS949 : 한글 확장 완성형 (똠방각하 표현 가능)

cp949 / euc-kr : 한글 완성형 (똠방각하 불가능)



소스 파일의 인코딩을 명시적으로 지정해 줄 때 "똠"자를 처리하지 못하고
warning: unmappable character for encoding cp949
이런 경고가 출력되었고, "똠"자가 "?c"라는 글자로 깨졌습니다.


예를 들어 다음과 같습니다:


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

    System.out.println("가나다라 똠방각하");

  }
}


이런 소스를 컴파일하고 실행하면:

1번째 실행 때는, 시스템 기본 인코딩을 사용했기에 문제가 없습니다.

2~4번째 실행 때는 cp949 등의 인코딩을 지정했기에 "똠"자가 깨졌습니다.

5번째 실행 때는 MS949 인코딩을 지정했기에 정상적으로 출력되었습니다.

D:\Z>javac Foo.java && java Foo
가나다라 똠방각하

D:\Z>javac -encoding cp949 Foo.java && java Foo
Foo.java:4: warning: unmappable character for encoding cp949
    System.out.println("가나다라 똠방각하");
                             ^
1 warning
가나다라 ?c방각하

D:\Z>javac -encoding 949 Foo.java && java Foo
Foo.java:4: warning: unmappable character for encoding 949
    System.out.println("가나다라 똠방각하");
                             ^
1 warning
가나다라 ?c방각하

D:\Z>javac -encoding euc-kr Foo.java && java Foo
Foo.java:4: warning: unmappable character for encoding euc-kr
    System.out.println("가나다라 똠방각하");
                             ^
1 warning
가나다라 ?c방각하

D:\Z>javac -encoding MS949 Foo.java && java Foo
가나다라 똠방각하

D:\Z>



결론


자바에서는 반드시 MS949 인코딩을 사용해야 했습니다. 소스 내부에서 인코딩을 사용할 때에도 마찬가지입니다.

물론 한글 윈도우에서 한글 텍스트 파일을 사용할 때에는, 인코딩을 지정할 필요는 없습니다.

리눅스에서 사용한다든지 하는 좀 복잡한 상황에서의 문제입니다.



▶▶ [자바/Java] 유니코드 소스 파일 인코딩 인식시키기 - UTF-8 UTF-16 Unicode

☞ 자바(Java)

Java/자바] 일본어 Shift-JIS 파일을, 유니코드(UTF-8)로 변환 프로그램

일본어 Shift-JIS 인코딩의 텍스트 파일을, "UTF-8 유니코드"로 변환하는 간단한 프로그램입니다.

명령행 옵션으로 일본어 파일명을 입력해 주면, 그 파일명의 끝에 .uni 라는 확장자를 덧붙여 유니코드 파일을 새로이 생성합니다.

즉, 유니코드(UTF-8)로 "Save As (새 이름으로 저장)"가 되는 것입니다.


Shift-JIS 인코딩(Encoding) 파일을, UTF-8로 변환(Conversion) 저장


소스 파일명: 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 InputStreamReader(
                                                                   new FileInputStream(args[0]),
                                                                   "Shift-JIS"
                                                                   )
                                             );

      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);
    }

  }
}



컴파일 및 실행하기:
D:\Z>javac Foo.java

D:\Z>java Foo Shift-JIS.txt

D:\Z>


Shift-JIS.txt 라는 샘플 파일을 명령행 옵션으로 붙여 실행하면, "Shift-JIS.txt.uni" 라는 새 이름의 유니코드(UTF-8) 파일이 "현재 디렉토리"에 만들어집니다. (▶▶ 일본어 Shift-JIS / EUC-JP 텍스트 파일 샘플; Japanese Text File Example 참고)



☞ 자바(Java)

일본어 Shift-JIS / EUC-JP 텍스트 파일 예제; Japanese Text File Example

프로그래밍 등에서 샘플 파일로 사용할 수 있는 간단한 일본어 텍스트입니다.

여담이지만, 인터넷이 없던 예전 도스 시절에는 진짜 일본어 텍스트 파일을 구하는 것도 참 어려웠습니다. 일본어 텍스트라고 해도 "혼모노"가 아니라, 한글 폰트 속의 일본어 문자 영역을 사용하여 만든 가짜 일본어 텍스트였습니다. 일본식 한자나 장음 기호 등은 표현되지 않았습니다.

그렇지만 이제는 일본어 텍스트를 쉽게 구할 수 있고, 표현도 쉽습니다. 물론 중국어 인코딩의 파일들도 마찬가지입니다.

일본어 인코딩 텍스트 파일 샘플


파일명: Shift-JIS.txt
또는
파일명: EUC-JP.txt
会社概要

Google の使命は、Google 独自の検索エンジンにより、世界中の情報を体系化し、アクセス可能で有益なものにすることです。

Google の創設者であるラリー ペイジとサーゲイ ブリンがその使命を達成する最初のステップとしてスタンフォード大学の寮の部屋で始めたオンライン検索への新しいアプローチは、世界中で情報を検索する人々の間に急速に広まりました。現在、Google は、簡単な操作で数分の一秒の間に関連性の高い検索結果が得られる世界最大の無料検索エンジンとして広く評価を受けています。

Google のホームページにアクセスすると、いろいろな言語で情報を探したり、ニュース記事を読めるだけでなく、10 億以上の画像を検索したり、1981 年までさかのぼる10 億以のメッセージを集めた世界最大の Usenet アーカイブを調べることもできます。

また、Google のホーム ページにアクセスしなくてもこれらの情報を検索できる、Google ツールバーも提供しています。Google ツールバーで、ウェブのどこからでも Google 検索ができます。また、Google は、PC から離れていても WAP や i モード携帯電話などのさまざまなワイヤレス プラットフォームからアクセスできます。

Google は、その便利さと使いやすさに満足している利用者の口コミを通じて、世界で最も知られたブランドの 1 つにまで発展しました。ビジネス面では、ウェブ ページに表示された情報と深く関連するオンライン広告を、予測可能な低いコストで広告主の皆様に提供することで収益を上げています。Google のオンライン広告は、ユーザーと広告主の両者にとって便利な広告形態です。Google では、ユーザーに対して表示されるメッセージが有料広告であるかどうかを明確にする必要があると考え、検索結果やページのコンテンツと広告とを必ず区別しています。検索結果への掲載を有償で提供することは行っていませんし、また、利用者にも金銭目的で掲載順位を上げたりするなどの操作は許可していません。

数千の広告主の皆様にご利用いただいているサービスに Google アドワーズ広告プログラムがあります。これは、ターゲットを絞った広告を掲載することで製品やサービスを宣伝するプログラムで、同種の広告プログラムの中で最大規模のものであると確信しています。さらに、数千のウェブ サイト運営者の皆様が Google AdSense プログラムを通じて、サイトのコンテンツと関連性の高い広告を掲載し収入を得る一方で、ユーザーに快適なウェブ環境を提供しています。



위의 내용을 복사한 후, EmEditor(이엠에디터) 등의 에디터를 사용하여,

* 일본어 (Shift-JIS)

또는

* 일본어 (EUC)

인코딩으로 하드에 저장하면 됩니다. (유니코드가 필요하다면 유니코드로 저장해도 됩니다.)

"일본어 (EUC)"가 "EUC-JP"입니다.




▶▶ HTML] 일본어 인코딩 종류

▶▶ 중문] 중국어 번체 텍스트 파일 예제; Big5 Chinese Text Example

▶▶ 중문] 중국어 간체 텍스트 파일 예제; GB2312 Chinese Text Example

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

Friday, November 24, 2006

도스용 V3.EXE 실행 배치파일; 도스창에서 백신III 실행 DOS BAT

도스용 백신 프로그램인 V3 Neo 는 사용자가 수동으로 설치해 주어야 합니다.

그리고 V3.EXE 파일이 있는 디렉토리를, 패스(PATH) 환경변수에 추가해야 하는데, V3 하나를 위해 패스를 추가하는 것보다는

다음과 같은 배치 파일을 작성하면 편리합니다. (단, 윈도우98에서는 다음의 배치파일이 실행되지 않습니다)


V3.EXE 실행 배치파일


파일명: V3.bat
@echo off
if "%*" == "" (
    "D:\WINDOWS_\V3\V3.EXE" . /S /A
) else (
    "D:\WINDOWS_\V3\V3.EXE" %*
)


위의 소스에서 V3.EXE 파일이 있는 곳의 위치를 반드시 수정해야 합니다.
만약 "C:\V3" 이런 폴더에 V3.EXE 가 있다면,

위의 코드에서
"D:\WINDOWS_\V3\V3.EXE"


"C:\V3\V3.EXE"
이렇게 수정합니다.


그리고 위의 V3.bat 이라는 배치파일을 패스(Path)가 걸린 아무 폴더에나 넣어두면 됩니다.



사용법


도스창(명령 프롬프트;cmd.exe)을 열고,

v3 라고 입력하고 Enter키를 치면, 먼저 V3.bat 이 실행되고,

V3.bat 안에서 V3.EXE 가 간접적으로 실행됩니다. V3.EXE 가, 현재 디렉토리(폴더)와 하위 디렉토리의 모든 종류의 파일들을 자동으로 검사합니다.



그리고
v3 /?
라고 하면, V3 도움말이 도스창 화면에 출력되고

v3 c:
라고 하면 C: 드라이브의 모든 프로그램 파일들을 검사합니다.




☞ 보안

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

euc-kr(한글 완성형)문서 파일을, UTF-8 유니코드로 변환 방법; ANSI to Unicode Text File

일반적으로 널리 사용되는 "한글 완성형" 인코딩 즉, euc-kr 텍스트를

"유니코드(UTF-8)" 또는 "유니코드(UTF-16LE)"로 변환하는 방법은 여러 가지가 있습니다. 가장 쉬운 방법은 텍스트 에디터로 직접 변환하는 것입니다. 여기에 각종 에디터로 파일 인코딩을 변환하는 방법이 있습니다: ▶▶ 한글 텍스트 문서를, 유니코드(Unicode / UTF-8) 로 변환하기



또한 다음과 같이 프로그래밍을 하여 변환할 수도 있습니다:

▶▶ 펄,Perl] 한글 완성형(euc-kr)파일, 유니코드(UTF-8)로 변환 저장, Convert Unicode


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






참고로, "유니코드(UTF-8)"은 HTML, 즉 웹문서 작성에 주로 쓰이고

"유니코드(UTF-16LE)"는, MS윈도우에서, 그냥 "유니코드(Unicode)" 라고 불리는 것입니다.



☞ 유니코드(Unicode)

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

Java/자바] 숫자(정수;int) 배열, 순서 거꾸로 뒤집기/역전시키기; Reverse int Array

int 정수 배열의 각 요소의 순서를 정반대로 바꾸는 방법입니다. 맨 뒤의 요소가 맨 앞으로 나오고, 맨 앞의 요소는 맨 뒤로 가는 식입니다.


정수 배열 요소 순서 반대로 바꾸기 예제


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

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

    int[] n = { 6246, 87, 0, -75, 3531 };


    // 원본 정수 배열 출력
    System.out.println(Arrays.toString(n));
    // 출력 결과: [6246, 87, 0, -75, 3531]


    // 뒤집어진 정수 배열 출력
    System.out.println(Arrays.toString(reverseArrayInt(n)));
    // 출력 결과: [3531, -75, 0, 87, 6246]

  }




  public static int[] reverseArrayInt(int[] n) {
    int left  = 0;             // 맨 좌측 요소의 첨자
    int right = n.length - 1;  // 맨 우측 요소의 첨자

    while (left < right) {
      int temp = n[left];
      n[left]  = n[right];     // 좌우 요소 교환
      n[right] = temp;

      left++; right--;         // 배열의 중간 부분으로 한칸씩 이동
    }

    return n;
  }


}


public static int[] reverseArrayInt(int[] n) 라는 메서드(함수)를 만들어서, 정수 배열 순서를 뒤집습니다.
reverseArrayInt() 는, < Java Reverse an array >
이 주소에 있는 것이 원본입니다.



(업데이트) 더 간결한 버전: ▶▶ Java/자바] 숫자 정수(int) 배열 내림차순(역순) 정렬(소팅/소트); Sort Descending Order, int Array


▶▶ Java/자바] 문자열 배열 요소 순서, 거꾸로(역순으로) 변환; Reverse String Array

▶▶ Java/자바] 문자열 거꾸로 뒤집기; 글자 순서 반대로 Reverse String

☞ 자바(Java)

Java/자바] 문자열 배열 요소 순서, 거꾸로(역순으로) 변환; Reverse String Array

자바에서, 문자열 배열 (String[]) 요소의, 순서를 정반대로 바꾸는 방법입니다. 맨 뒤의 요소가 맨 앞으로 나오고, 맨 앞의 요소는 맨 뒤로 가는 식입니다.

문자열 배열 순서 반전 예제


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

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


    String[] names = { "AAA~", "BBB~", "COOL", "똠방각하" };

    // 원본 배열 출력
    System.out.println(Arrays.toString(names));


//////////////////////////////////////////////////


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


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


//////////////////////////////////////////////////


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


    // 순서 뒤집어진 배열을 문자열로 변환 후 출력
    String s = Arrays.toString(names);
    System.out.println(s);


  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
[AAA~, BBB~, COOL, 똠방각하]
[똠방각하, COOL, BBB~, AAA~]

맨 뒤에 있던 "똠방각하"가 맨 앞으로 오는 등, 순서가 역전되었습니다.



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



문자열 배열 요소를 역순으로 하는 것이 아니라, 문자열의 문자들을 거꾸로 뒤집는 방법은 여기에 있습니다: ▶▶ Java/자바] 문자열 거꾸로 뒤집기; 글자 순서 반대로 Reverse String
즉, "똠방각하"를 "하각방똠" 으로 변환합니다.



▶▶ Java/자바] 숫자(정수;int) 배열, 순서 거꾸로 뒤집기/역전시키기; Reverse int Array

☞ 자바(Java)

Java/자바] 문자열 거꾸로 뒤집기; 글자 순서 반대로 Reverse String

문자열에서, 문자들의 순서를 정반대로, 즉 역순으로 바꾸는 방법입니다. StringBuffer 클래스의 reverse() 메소드(함수)를 사용하면 간단하게 구현할 수 있습니다.


문자열(String) 반대 순서로 변환 예제


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

    String s = "ABCD 가나다라 똠방각하";
    System.out.println(reverseString(s));

    // 출력 결과: 하각방똠 라다나가 DCBA

  }



  public static String reverseString(String s) {
    return ( new StringBuffer(s) ).reverse().toString();
  }


}


"소주 만병만 주소" 는 회문(回文; Palindrome)이기에 뒤집어도 "소주 만병만 주소" 입니다.





문자열의 글자 순서를 뒤집는 것이 아니라,

"문자열 배열(String[])" 요소 순서를 거꾸로 하는 방법: ▶▶ Java/자바] 문자열 배열 요소 순서, 거꾸로(역순으로) 변환; Reverse String Array



▶▶ Java/자바] 숫자(정수;int) 배열, 순서 거꾸로 뒤집기/역전시키기; Reverse int Array

☞ 자바(Java)

Thursday, November 23, 2006

VIM (VI, GVIM) 빔 에디터, 종료 명령어, 빠져 나오는 법; Exit Quit

빔(VIM, VI, GVIM) 에디터를 종료하거나, 다시 셀로 빠져 나오려면

Esc키를 한번 눌러준 후

:q

라고 하면 됩니다. 그러나 파일을 수정했다면
E37: No write since last change (add ! to override)
이런 에러가 납니다. 그럴 경우에는 다음과 같이 합니다:


파일 저장 후, 종료 명령어


:wq

라고 하면 저장(Save)과 동시에 빔 에디터가 종료됩니다.



새 이름으로 저장 후, 종료 명령어


파일명이 없는 새 파일을 편집 중이었다면
:w test.txt

이런 식으로 우선 파일명을 정해 주고 저장한 후, 다시 ":q" 명령으로 종료합니다.


만약 test.txt 라는 파일이 이미 존재한다면 E13: File exists (add ! to override) 이런 에러가 납니다. 이때는
:w! test.txt
이렇게 w 뒤에 느낌표를 붙이면 강제로 덮어쓸 수 있습니다.




텍스트를 저장하지 않고, 그냥 종료 명령어


텍스트를 수정했지만, 저장하지 않고 끝내려면
:q!

이렇게 합니다. 이러면 파일의 수정한 내용이 모두 사라지고 원본 그대로 남습니다.

주의! ":q!" 이런 명령으로 종료하면, 끝낼 때 아무것도 물어보지 않고 그냥 끝냅니다. 위험할 수도 있습니다.



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

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

Java/자바] 배열 요소 추가 / 배열 크기 늘리기; Array Resize; Dynamic Array

자바의 기본 배열은 크기를 조정할 수 없고, 만들 때 정해준 크기로 고정되어 있습니다.

따라서 배열에 요소를 더 추가하여 배열 크기를 증가시키려면,


String cool[] = new String[10];

String cool[] = new String[50];

배열을 만들 때, 위와 같이 메모리를 넉넉하게 할당하든지


또는 "동적 배열 (Dynamic Array)"을 사용해야 합니다. 동적 배열은 배열 크기를 고무줄처럼 자유롭게 늘이고, 요소를 마음대로 추가할 수 있어서 편리합니다.


여기에 동적배열의 쉬운 예제가 있습니다: ▶▶ 자바/Java] 동적 배열 크기 확장 조절 / 숫자 문자열 혼합 배열 만들기 - Perlish Array



☞ 자바(Java)

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

컴파일은 잘 되는데, 컴파일된 실행파일(exe)을 실행하면

runtime error R6002 - floating point not loaded

이런 "런타임 에러"가 나는 경우가 있습니다. 부동소수점 라이브러리 가 실행파일에 포함되지 않았기 때문입니다. 부동소수점 라이브러리는 용량이 크기 때문에 필요한 경우에만 포함시킵니다.


예를 들어 다음과 같은 경우 이런 에러가 납니다:

#include <stdio.h>

int main(void) {

  printf("%f\n", 2);

  return 0;
}



그리고 위의 경우, 런타임 에러 (floating point...) 와 무관하게, 0.000000 이라는 값이 출력되므로 역시 오류.


다음과 같이 하면 에러가 없습니다:

#include <stdio.h>

int main(void) {

  printf("%f\n", (double) 2);
  // 또는
  printf("%f\n", 2.0);

  return 0;
}

숫자 2 를 (double) 이렇게 실수로 캐스팅(변환)해 주든지, 2.0 이라고 뒤에 소수점을 붙이면 됩니다.


즉, 소스에서 실수 연산에 대한 무슨 코드가 있어야, 부동 소수점 라이브러리가 포함됩니다.





소스의 내용이 어떻든 강제로 부동 소수점 라이브러리를 포함시키려면 소스에
double dummy = 0.0;
이런 식으로 아무 실수형 변수 하나를 "지역 변수"로 정의해 주면 됩니다. 그러나 이 경우, 컴파일러 설정에 따라, "쓰지 않는 지역 변수가 있다"는 경고가 나올 수 있습니다: "warning C4189: 'dummy' : local variable is initialized but not referenced"

dummy 변수를 무의미한 작업에 한번 사용하면 경고가 없어집니다. 또는 pragma 를 사용하는 방법도 있습니다: ▶▶ C언어 VC++] 특정 경고(워닝)메시지 출력 일시 중지 프라그마; pragma warning Off


☞ C/C++

Perl/펄] 로마 숫자, 아라비아 숫자 상호 변환 프로그램; ROMAN NUMERAL Convert

아라비아 숫자 10 을, 로마 숫자로는 X 라고 합니다. 이런 식으로 상호 변환하는 펄 스크립트입니다. 다만 Math::Roman 이라는 CPAN 모듈을 별도로 다운받아서 설치해 주어야 실행이 됩니다. (물론 윈도우 등의 운영체제에 펄(Perl)도 설치되어 있어야겠지요.


로마 숫자 / 아라비아 숫자 변환


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

use Math::Roman qw(roman);


  ##############################################
  # 아라비아 숫자를 로마 숫자로 변환

  print roman(4), "\n";
  # 출력 결과: IV

  print roman(342), "\n";
  # 출력 결과: CCCXLII



  ##############################################
  # 로마 숫자를 아라비아 숫자로 변환

  print roman("IV")->as_number(), "\n";
  # 출력 결과: 4

  print roman("CCCXLII")->as_number(), "\n";
  # 출력 결과: 342



Math 디렉토리 밑에 Roman.pm 파일이 없으면 다음과 같은 에러가 납니다. "모듈을 찾지 못했다"는 뜻입니다.
D:\Z>r.pl
Can't locate Math/Roman.pm in @INC (@INC contains: D:\myhome\perl_\site\lib D:/P
erl/site/lib D:/Perl/lib .) at D:\Z\r.pl line 4.
BEGIN failed--compilation aborted at D:\Z\r.pl line 4.



다음의 방법으로 모듈을 설치해 주면 됩니다:

변환 모듈 다운로드


< Math::Roman >
위의 주소에서 Math-Roman-1.07.tar.gz 이런 파일을 다운받고,

그 파일 안에서, Roman.pm 이라는 파일을 하드에 푼 후,

<펄 라이브러리 디렉토리> 아래에 Math 라는 디렉토리를 만들고, 그 안에 Roman.pm 파일을 넣어 주면 됩니다. (자세한 설치법은 ▶▶ 펄/Perl] 아라비아 숫자를, 일본어 숫자 읽기 발음으로 변환, Lingua-JA-Number 를 참고)






여러 로마 숫자들을 미리 변환해둔 변환표: ▶▶ 로마 숫자 <―> 아라비아 숫자 변환표; ROMAN NUMERAL Table

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



악마의 숫자 666 이, 로마 숫자로는 DCLXVI 이군요

그리고 로마 숫자에는 0(제로)이 없습니다.



☞ Perl(펄)

HTML-CSS] CSS 글꼴; 스타일 시트로 폰트(FONT) 지정하는 법

CSS의 font-family 속성으로 "폰트명"을 지정할 수 있습니다. 한글이나, 또는 공백이 들어간 폰트명은 작은따옴표(')로 둘러싸 주는 것이 좋습니다.


그리고 font 속성으로는 다음과 같이, 각종 글꼴 스타일을 한꺼번에 지정할 수 있습니다. 좀 복잡한데 순서대로 지정해야 합니다.
font-style: normal, italic, oblique (이탤릭체 등 지정)
font-variant: normal, small-caps (작은 대문자 표현)
font-weight: normal, bold, bolder, lighter (굵기 지정)
font-size: 10pt 등등 (크기 지정)
font-family: 폰트명 지정


다음 예제를 보면 쉽게 알 수 있습니다.


CSS 스타일 시트: 폰트 종류, 크기 설정 예제


<html>
<head>
<style type="text/css">

body { font-family:'바탕'; }

.font-test { font:bold 24pt '바탕'; }

</style>
</head>


<body>


둥글고 하얀 어떤 <span style="font:24pt '궁서체'">거대한</span> 무엇이 자꾸만 떠올랐는데 마치 이 세상의 것이 아닌 것처럼 여겨졌다.

The quick <span style="font-family:'Comic Sans MS'">brown fox</span> jumps over the lazy dog.

Jackdaws <span class="font-test">love</span> my big sphinx of quartz.

<div class="font-test">Jackdaws love my big sphinx of quartz.</div>


</body>
</html>


예제의 HTML 출력 결과:
둥글고 하얀 어떤 거대한 무엇이 자꾸만 떠올랐는데 마치 이 세상의 것이 아닌 것처럼 여겨졌다.

The quick brown fox jumps over the lazy dog.

Jackdaws love my big sphinx of quartz.

Jackdaws love my big sphinx of quartz.




body { font-family:'바탕'; }
이것은 body 태그 전체에, 즉 페이지 전체를 '바탕'이라는 한글 명조체 글꼴로 지정하라는 뜻


.font-test { font:bold 24pt '바탕'; }
이번에는 클래스를 만들었습니다. 폰트를 굵게(bold), 폰트 크기는 24포인트, 폰트명은 '바탕'을 지정했습니다. 참고로, '바탕'은 '바탕체'와 달리, 간격이 일정하지 않습니다. 그래서 본문용으로는 좋지만, 프로그래밍 소스처럼 간격이 일정해야 하는 곳에는 적당하지 않습니다.
특정 글꼴을 지정해야 할 곳에
<span class="font-test">...
이렇게 사용하면 됩니다. (클래스명 앞에 붙은 마침표를 떼고)



클래스에 대해


자신이 즐겨 쓰는 폰트 스타일을 클래스로 만들어 두고 사용하면 편리합니다.

예를 들어

.us-italic { font-family:'Georgia', serif; font-style:italic }
이것은 영문 이탤릭체 클래스이고

.us-bold { font-family:Arial, sans-serif; font-weight:bold }
영문 볼드체(굵게 나오는 글씨)

.k-italic { font-style:italic; font-family:'Malgun Gothic'; }
이것은 한글 클리어타입 폰트인 '맑은 고딕'의 이탤릭체를 미리 정의해 놓은 것입니다.

꼭 이렇게 할 필요는 없고, 자신의 취향에 맞게 지정하면 됩니다.




글꼴 크기에 대해


본문용 글꼴 크기는 10pt 가 보통입니다. 9pt 이하는 고해상도 모니터에서는 잘 보이지 않습니다.

좀더 큰 본문용은 12pt 이고, 제목은 24pt 정도로 했을 때 보기 좋게 출력됩니다.
MS워드 등의 워드프로세서에서 다양한 폰트 크기와 스타일 등을 미리 테스트해 보는 것이 좋습니다.



▶▶ HTML-CSS] 글자 색깔 지정하기, 글자색 변경 - Color 컬러 지정

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

Wednesday, November 22, 2006

C언어 VC++] 특정 경고(워닝)메시지 출력 일시 중지 프라그마; pragma warning Off

심각한 에러가 있을 때에는 에러 메시지가 나오고 컴파일이 중단되지만, 작은 문제가 있을 때에는 경고(warning)만 나옵니다.

그런데 고칠 수 없거나 고칠 필요가 없는 경고일 경우에는, 그 경고에 한해서만 경고 출력을 잠시 중단하는 것이 좋습니다.

비주얼C(Visual C++)에서, 특정 경고 메시지를 잠시 중단시키는 방법입니다.



이런 경고 2개를 예로 듭니다.

0.cpp(9) : warning C4101: 'i' : unreferenced local variable
(사용하지 않는 지역변수)

0.cpp(10) : warning C4189: 'd' : local variable is initialized but not referenced
(초기화했으나 사용하지 않는 지역변수)


경고 번호는 4101 과 4189 입니다.


main 함수에서만 경고를 중지시키는 방법입니다.


특정 워닝 일시 중시 예제


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

void foo(void);


// 경고 번호를 나열해 주면 됨
#pragma warning( disable : 4101 4189 )
int main(void) {

  int i;
  double d = 0.0;

  return 0;
}
#pragma warning( default : 4101 4189 )
// 이제 원래대로 환원
// 만약 이 부분이 없다면, 이하 모든 함수에서 경고 메시지 출력이 중지됨



void foo(void) {

  int i2;
  double d2 = 0.0;

}
// 이 함수에서는 경고가 정상적으로 나옴




#pragma warning ... 이 없을 경우의 경고 상태
D:\Z>cl 0.cpp && 0.exe
0.cpp
0.cpp(10) : warning C4101: 'i' : unreferenced local variable
0.cpp(11) : warning C4189: 'd' : local variable is initialized but not reference
d
0.cpp(24) : warning C4189: 'd2' : local variable is initialized but not referenc
ed
0.cpp(23) : warning C4101: 'i2' : unreferenced local variable




#pragma warning ... 이 있을 때. 메인 함수 내의 경고는 사라짐
D:\Z>cl 0.cpp && 0.exe
0.cpp
0.cpp(24) : warning C4189: 'd2' : local variable is initialized but not referenc
ed
0.cpp(23) : warning C4101: 'i2' : unreferenced local variable







참고로, 위에서 예로 든 워닝들은 일반적인 상태에서는 나오지 않고, 환경 변수를

set CL=/W4

이렇게 최대한 경고가 많이 나오도록 설정한 상태에서만 나타나는 경고입니다.


☞ C/C++

C언어] 분수를 소수로 변환 출력 방법/예제; Fraction To Decimal

예를 들어, "2분의 1"이라는 분수를 표현하려면
1 / 2
또는
1/2
이렇게 합니다. 즉 "1 나누기 2"로 표현하는 것입니다. 분수 "2분의1"을 소수로 표현하면 "0.5" 가 됩니다.


분수 표현, 분수 -> 소수 변환 예제


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

int main(void) {

  // 3분의1
  double d = (double) 1 / 3;
  printf("%f\n", d);
  // 출력 결과: 0.333333



  // 2분의1
  printf("%f\n", (double) 1/2);
  // 출력 결과: 0.500000
  // 위의 소스에서 1/2 은
  // printf("%f\n", (double) 1 / 2);
  // 이것과 같습니다. 즉 나누기 입니다.


  printf("%f\n", 1.0 / 2.0);
  // 이렇게 실수형 상수를 사용하면 캐스팅하지 않아도 됩니다.
  // 출력 결과: 0.500000



  return 0;
}



1분의 1에서, 10분의 10까지의 분수를 소수로 만든 도표(?): ▶▶ C언어] 분수를 소수로 변환한 목록 만들기; Fraction to Decimal Table

▶▶ C언어] printf함수, 실수 소수점 자리, 너비 지정 출력 + 루트 계산 - Square Root

☞ C/C++




거꾸로, 소수를 분수로 만드는 법은 여기에 있습니다: ▶▶ [Perl/펄] 소수를 분수로 변환 / 분수를 소수로 바꾸기 - Math-Fraction
그런데 C언어가 아닌 펄(Perl)입니다.

C언어] 숫자 배열, 최대값 최소값 찾는 함수; Array Max Min Value

int getMaxInt(int* n, int size);
int getMinInt(int* n, int size);

위의 함수는, 지정해 준 숫자(정수) 배열에서, 가장 큰 값과 가장 작은 값을 찾아서 반환하는 함수입니다.

배열명과 그 배열의 사이즈(요소 개수)를 지정하면 됩니다.


배열에서 가장 큰 숫자, 가장 작은 숫자 찾아서 반환 예제


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

#define SIZE 8

int getMaxInt(int* n, int size);
int getMinInt(int* n, int size);




int main(void) {

  int i[] = { 124, 634, 7, 5021525, 77, 8765, -356, 0 };

  printf("최소값: %d\n", getMinInt(i, SIZE)); // -356

  printf("최대값: %d\n", getMaxInt(i, SIZE)); // 5021525

  return 0;
}


int getMaxInt(int* n, int size) {
  int max = n[0];

  for (int i = 1; i < size; i++)
    if (n[i] > max) max = n[i];

  return max;
}


int getMinInt(int* n, int size) {
  int min = n[0];

  for (int i = 1; i < size; i++)
    if (n[i] < min) min = n[i];

  return min;
}



☞ C/C++

Java/자바] 2차원 문자열 배열 선언, new 연산자로 초기화; 2 Dimensional Array

▶▶ Java/자바] 2차원 정수 배열 선언/초기화/출력 예제; 배열의 배열; Array of Array <- 이 게시물에서는 배열 요소를 직접 초기화해 주는 "단축 문법"을 사용했는데

여기서는 배열을 new 연산자로 초기화하고 메모리를 할당하는 방법입니다.

문자열 배열을 new 연산자로 초기화하면 모두 null 로 채워지고, int 배열의 경우는 0으로, 불린 배열의 경우는 false(거짓)로 초기화됩니다.



String[][] foo = new String[5][8];

[행의 수(rows)][한 행에 몇개(columns)]

형식으로 메모리가 할당됩니다. 엑셀 좌표와 비슷합니다.


new 연산자로 이차원 문자 열 배열 초기화 예제


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

    // 2차원 배열 foo 의 선언과 초기화
    String[][] foo = new String[5][8];



    // 2차원 문자열 배열의 요소들에 문자열 대입
    for (int i = 0; i < foo.length; i++) {
      for (int j = 0; j < foo[i].length; j++) {
        foo[i][j] = "ㅎㅎ";
      }
    }



    // 2차원 문자열 배열의 요소들 하나씩 출력
    for (int i = 0; i < foo.length; i++) {
      System.out.println();
      for (int j = 0; j < foo[i].length; j++) {
        System.out.print(foo[i][j] + " ");
      }
    }


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

  }
}


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

ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ
ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ
ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ
ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ
ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ ㅎㅎ

D:\Z>


new String[5][8] 이렇게 선언해 주었기에,

행의 수는 5줄,
줄 1개당 8개의 요소(ㅎㅎ)가 있습니다.



그런데 소스에서 "ㅎㅎ"로 초기화해 주지 않았다면, 다음과 같이 new 연산자가 초기화한 null 값이 출력됩니다:
D:\Z>javac Foo.java && java Foo

null null null null null null null null
null null null null null null null null
null null null null null null null null
null null null null null null null null
null null null null null null null null

D:\Z>




▶▶ Java/자바] 문자열 1차원 배열 선언, 초기화 예제; String Array

☞ 자바(Java)

Java/자바] 2차원 배열 선언/초기화/출력 예제; 배열의 배열; Array of Array

자바에서 2차원 배열은

자료형[][] 배열명

또는

자료형 배열명[][]

형식으로 정의합니다. 다음 예제는 foo 라는 이름의 2차원 숫자 배열을 초기화한 후, 화면에 출력하는 것입니다.



이차원 정수(int) 배열 선언, 초기화, 출력 예제


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

    int[][] foo = {

      // [0]  [1]  [2]  [3]
      { 662,   7,   4,  74 },    // foo[0]
      {   8, 396, 299,  95 },    // foo[1]
      {  66,  73,  86,   0 },    // foo[2]
      { 116,  26, 586,  42 },    // foo[3]
      {  84,   7,  41,  11 }     // foo[4]
    };


    // 2차원 배열의 요소들 하나씩 출력
    for (int i = 0; i < foo.length; i++) {
      System.out.println();
      for (int j = 0; j < foo[i].length; j++) {
        System.out.print(foo[i][j] + " ");
      }
    }

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

  }
}


위의 예제에서 예를 들어, foo[0][0] 의 값은 662 입니다.

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

662 7 4 74
8 396 299 95
66 73 86 0
116 26 586 42
84 7 41 11

D:\Z>



new 연산자로 초기화하는 방법: ▶▶ Java/자바] 2차원 문자열 배열 선언, new 연산자로 초기화; 2 Dimensional Array

☞ 자바(Java)


<< Home

Categories
Some Recent Posts
Monthly Archives
Top