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

 
Monthly Archive
Thursday, May 31, 2007

PHP 예제] switch문, case문, break문, default문: 스위치-문

if...else문을 여러 개 사용해야 할 경우에는, switch문으로 대체하면 소스가 간결해집니다. C언어의 스위치문과 달리, PHP에서는 스위치문의 조건으로서 숫자(정수, 실수)와 문자열 모두 가능합니다.

각 실행문의 끝에 break문을 붙여 주지 않으면, 그 아래쪽의 실행문들까지 모두 실행되어 버립니다.

해당 조건이 없을 때에는 기본적으로 default문이 실행되는데, default문이 필요없다면 생략 가능합니다.

스위치문 사용 예제 소스


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

// 숫자형으로 조건 지정 (정수 실수 모두 가능)
$n = 3.14;

switch ($n) {
  case 3.14  : print "3.14 라는 실수입니다.<br />\n";
               break;
  case 365   : print "365 라는 정수입니다.<br />\n";
               break;
  case 1000  : print "1000 이라는 정수입니다.<br />\n";
               break;
  default    : print "해당 숫자가 없습니다.<br />\n";
               break;
}
// 출력 결과: 3.14 라는 실수입니다.



// 문자형으로 조건 지정
$c = '똠';

switch ($c) {
  case 'A'  : print "A 라는 문자입니다.<br />\n"; break;
  case '똠' : print "똠 이라는 문자입니다.<br />\n"; break;
  case '7'  : print "7 이라는 문자입니다.<br />\n"; break;
  default   : print "해당되는 문자가 없습니다.<br />\n"; break;
}
// 출력 결과: 똠 이라는 문자입니다.



// 문자열로 조건 지정
$camera = 'Canon PowerShot';

switch ($camera) {
  case 'Nikon D40'  : print "50만원대입니다.<br />\n"; break;
  case 'Nikon D40X' : print "80만원대의 디카입니다.<br />\n"; break;
  case 'Canon PowerShot' : print "40만원대의 컴팩트 카메라입니다.<br />\n"; break;
  default   : print "해당되는 카메라가 없습니다.<br />\n"; break;
}
// 출력 결과: 40만원대의 컴팩트 카메라입니다.


?>

</body>
</html>



PHP 예제] 문자열을 배열로 변환 저장 함수; String to Array

문자열을 배열로 분리하여 저장하는 방법입니다. explode 함수를 사용하는데, 펄의 split 함수와 같은 역할을 하는 함수입니다.

explode(구분자, 문자열);
의 형식으로 사용합니다. "구분자(delimiter)"는 어떤 글자를 기준으로 문자열을 나눌 것인지를 지정하는 것입니다.

문자열을 배열로 나누기: explode / split


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 테스트용 문자열 정의 (쉼표+공백으로 구분되어 있음)
  $s = "Apple, Google, Nikon, 123, Canon";

  // 쉼표+공백을 기준으로 문자열 분리
  $a = explode(", ", $s);
  print_r($a);
/* 배열 출력 결과:
Array
(
    [0] => Apple
    [1] => Google
    [2] => Nikon
    [3] => 123
    [4] => Canon
)
*/



  // 단어별로 문자열 나누기 (공백 기준)
  $s = "철수는 학교에 가서 영희와 만나 매점으로 갔습니다.";

  $a = explode(" ", $s);
  print_r($a);
/* 배열 출력 결과:
Array
(
    [0] => 철수는
    [1] => 학교에
    [2] => 가서
    [3] => 영희와
    [4] => 만나
    [5] => 매점으로
    [6] => 갔습니다.
)
*/


?>

</body>
</html>



위와는 반대로, 배열을 문자열로 합치기: ▶▶ PHP 예제] 배열을 문자열로 변환/연결/병합, 배열 합치기; Join Array

기름몰, 효리몰, 감기몰, 설탕몰 등 쇼핑몰 애칭 의미; GS-G-H-CJ-KT

각 쇼핑몰의 애칭 목록입니다. 정확하게 말하자면 애칭이 아니라 "은어"입니다. 쇼핑몰 이름을 직접적으로 거론하는 것을 금지하는 게시판에서 주로 사용하기 때문입니다. "가슴"을 "슴가"라고 하듯이 그런 식입니다..


기름몰: GS e숍
(GS칼텍스)

효리몰: G마켓
(이효리가 지마켓 모델)

감기몰: H몰
(에이취!)

설탕몰: CJ몰
(제일제당)

전화몰: KT몰
(KT)

공원몰: 인터파크
(이름 그대로)

안녕몰: 하이마트
(이름 그대로)

d&shop (다음쇼핑): ???
(디앤샵은 별명이 없는 듯)

필름국: 필름나라
(사진 주변용품만을 전문적으로 다루는 곳)




PHP 예제] 배열을 문자열로 변환/연결/병합, 배열 합치기; Join Array

PHP에서는 implode() 함수로, 배열 요소들을 합쳐서 하나의 문자열로 만들 수 있습니다. Perl의 join 함수와 같은 역할을 합니다.

사용법은
implode ("구분기호", $배열명)
이렇고, 합친 결과를 문자열로서 반환합니다.

배열을 문자열로 합치기 예제 소스


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 배열 정의
  $a = array("Apple", "Google", "Nikon", 123, "Canon");



  // 쉼표로 구분하여 배열을 문자열로 합치기
  print implode(", ", $a) . "<br />\n";
  // 출력: Apple, Google, Nikon, 123, Canon


  // 슬래시(/) 기호를 구분자로 사용하여 합치기
  print implode("/", $a) . "<br />\n";
  // 출력: Apple/Google/Nikon/123/Canon


  // 빈틈 없이 딱 붙이기
  print implode("", $a) . "<br />\n";
  // 출력: AppleGoogleNikon123Canon


  // 공백으로 구분하여 합치기
  print implode(" ", $a) . "<br />\n";
  // 출력: Apple Google Nikon 123 Canon


  // 합친 결과를 변수($s)에 저장하기
  $s = implode("ㅎㅎ", $a);
  print "$s<br />\n";
  // 출력: AppleㅎㅎGoogleㅎㅎNikonㅎㅎ123ㅎㅎCanon



  echo "<br /><br /><br />\n\n\n"; // 편의상 줄바꿈



  // 합친 결과를 여러줄로 출력
  $s = implode("<br />\n", $a);
  print "$s";
/* 출력 결과:

Apple<br />
Google<br />
Nikon<br />
123<br />
Canon
*/


?>

</body>
</html>



문자열을 배열로: ▶▶ PHP 예제] 문자열을 배열로 변환 저장 함수; String to Array

배치 파일에서, 숫자 계산하기, set 명령으로 더하기 빼기; Batch File Calc

오리지날 도스(MS-DOS)의 배치파일 문법에서는 안되지만, 윈도우2000/XP 이상의 윈도우 도스창(명령 프롬프트;cmd.exe)에서는, set 명령에 /a 옵션을 붙이면 간단한 계산기로 사용할 수 있습니다. 그리고 배치 파일 내에서 숫자 계산이 필요한 경우에 set 명령으로 계산을 할 수 있습니다. 배치 프로그래밍에 유용합니다.

set /a 변수명=수식

의 형식입니다. 그러나 아주 간단한 가감승제만 할 수 있을 뿐이지 좀 복잡한 계산은 불가능합니다.

배치 파일 계산기 예제


배치 파일명: example.bat
@echo off

rem 1 더하기 1 계산
set /a mytest=1+1
echo %mytest%
rem 출력 결과: 2


rem 2 곱하기 3 계산
set /a mytest=2*3
echo %mytest%
rem 출력 결과: 6


rem 100 나누기 3 계산
set /a mytest=100/3
echo %mytest%
rem 출력 결과: 33
rem 33.333...이 나와야 하지만 소수점 없이 정수로 출력됩니다.



rem 변수 지우고 종료
set mytest=


배치 파일 외부에서는, 변수에 대입할 필요 없이

set /a 1+1

이렇게만 해도 2라는 답이 나옵니다. 계산 결과가 그리 정밀하지 않기 때문에 일반 계산기 대용으로 쓰면 심한 오차가 발생하는 경우가 있습니다.


set 명령의 계산 기능을 사용하여, 루프문의 실행 회수를 제어하는 예제: ▶▶ 배치파일 무한루프 구현, 루프 탈출, 빠져 나오기 예제; Batch File Infinity Loop

배치파일 무한루프 구현, 루프 탈출, 빠져 나오기 예제; Batch File Infinity Loop

배치파일에서 goto문을 사용하면 무한루프를 쉽게 만들 수 있습니다. 루프를 빠져나올 때에도 역시 goto문을 사용합니다. 아래 예제에서는 ":LOOP" 와 "goto LOOP" 사이가 무한히 반복 실행됩니다.

영원한 무한 루프일 경우에는 키보드의 Ctrl+C키를 누르거나 Ctrl+Break키를 누르면 강제로 무한루프(x 무한루트)가 종료됩니다.

배치 파일로 무한 루프 만들기 예제


배치 파일명: example.bat
@echo off
setlocal


:LOOP
echo 무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...

::::::::::::::::::::::::::::::::::::::::
:: 이 부분이 없으면 영원한 무한루프가 됨
set /a myStopper+=1
if %myStopper% GEQ 10 goto QUIT
::::::::::::::::::::::::::::::::::::::::

goto LOOP




:QUIT



myStopper+=1
은 myStopper라는 변수에 1을 더하기 하여 증가시키라는 뜻입니다.


실행 결과 화면:
(편의상 루프를 10번만 돌립니다)
D:\Z>example.bat
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
무한 루프! Ctrl+C를 누르면 강제로 종료됩니다...
D:\Z>



Wednesday, May 30, 2007

무한대 기호 입력, 무한대 특수문자 특수기호 입력 방법; Infinity Sign Input

수학에서의 무한대 기호를 문서에 입력하려면, 한글 자모인 "디귿"을



이렇게 입력하고 즉시 키보드의 "한자 변환키"를 누릅니다. 그러면 윈도우 화면 맨 아래 우측에 "문자 입력창"이 나옵니다. 입력창 우측의 화살표를 클릭하면 ∞ 이런 무한대 기호가 나타납니다. 이 기호를 클릭하면 현재 편집 중인 문서에 무한대 기호가 삽입됩니다.

또는



이곳의 무한대 기호를 마우스로 긁어서 선택한 후, 키보드의 Ctrl+C키를 누르면 무한대 기호가 메모리(윈도우 클립보드) 속에 복사됩니다. 다른 문서에서 Ctrl+V키를 누르면 무한대 기호가 붙여 넣어집니다. Ctrl+C키란, Ctrl키를 누르면서 C키를 누르는 것입니다.



참고: ▶▶ 한글 특수문자 입력표 - Hangul Special Character Input Table

무한대 기호의 실제 사용 예제: ▶▶ 매스매티카] 무한급수의 합 구하기, 무한합; Mathematica Infinite Series

컴퓨터에서 분수 표현 법은? 컴퓨터로 분수 나타내기, 입력; Fraction Input

컴퓨터에서는 분수를 직접 표현하기 힘들기에, 슬래시 즉 빗금(/) 기호를 사용하여 입력합니다. 이것은 나눗셈 기호이기도 합니다.

분수 "2분의 1"은 "1/2" 로 표현합니다. "분자 나누기 분모"의 형식입니다. 컴퓨터에서는 대부분 이런 식으로 분수를 나타냅니다.


분수 기호 특수문자로 입력하기


한글 '굴림' 폰트 중에

½ ⅓ ⅔
¼ ¾
⅛ ⅜ ⅝ ⅞

이런 분수 특수문자들이 있는데 종류가 이것뿐이라서 별로 유용하지는 않습니다.

HTML 웹문서에서 분수를 입력하려면, 다음과 같이 분수를 3행으로 나누어서 표현하는 방법이 있습니다: ▶▶ HTML 웹페이지에 수학 공식 표현 방법; 시그마 기호 입력, Sigma 문자


워드 프로세서의 "수식 입력기"를 사용하면 가장 분수를 자연스럽게 입력할 수 있습니다.
▶▶ 수식입력기] 분수,루트 기호 입력 방법, 워드 Word 엑셀 Excel; MS Equation Input Fraction



분수를 직접 입출력/계산할 수 있는 프로그램은?


"매스매티카(Mathematica)"라는 수학 전문 소프트웨어에서는 분수를 있는 그대로 직접 표현하고 계산할 수 있습니다: ▶▶ Mathematica 매스매티카] 대분수를 가분수로 바꾸기, 입력 방법; To Improper Fraction
(위의 경우는 텍스트 모드 매스매티카인데, 그래픽 모드 매스매티카에서는 책에 인쇄한 것처럼 분수가 자연스럽게 잘 나옵니다.)

자바스크립트] 배열 합치기, 여러개의 배열을 연결, 하나로 병합 함수; JavaScript concat Merge Array

2개 또는 여러 개의 배열을 하나의 배열로 "합치는 방법"입니다.

concat() 이라는 메소드(함수)에, 합쳐야 할 배열명을 넣어주면, 합친 결과를 반환합니다. 다음 예제와 같습니다.

배열 연결, 병합, 합치기 예제 소스


소스 파일명: example.html
<script type="text/javascript">

////////////////////////////////////////////
// 2개의 배열을 1개의 배열로 연결하기
////////////////////////////////////////////
var who = new Array( '맹구', '배용준', '땡칠이', '장동건', '강수정', '뿡뿡이', '고은아' );
var food = new Array( '자장면', '탕수육', '짬뽕', '우동', '물만두' );

// 배열 연결 (인명 배열 + 음식명 배열)
var result = who.concat(food);

// 결과 출력
document.write(result , '<br /><br /><br />');
// 맹구,배용준,땡칠이,장동건,강수정,뿡뿡이,고은아,자장면,탕수육,짬뽕,우동,물만두




////////////////////////////////////////////
// 3개의 배열을 1개의 배열로 연결하기
////////////////////////////////////////////
who = new Array( '맹구', '배용준' );
food = new Array( '자장면', '탕수육' );
var camera = new Array( 'Nikon', 'Canon', 'PENTAX' );


// (인명 배열 + 음식명 배열 + 카메라명 배열)
var result = who.concat(food, camera);

document.write(result, '<br />');
// 맹구,배용준,자장면,탕수육,Nikon,Canon,PENTAX

</script>



▶▶ 자바스크립트] 배열 요소 추가, 새 요소 밀어넣기 함수; JavaScript unshift push Array

▶▶ 자바스크립트] 배열을 문자열로 변환, 요소 합치기; Join Array JavaScript

자바스크립트] 배열 요소 추가, 새 요소 밀어넣기 함수; JavaScript unshift push Array

기존의 배열에, 다른 새 요소를 추가하여 넣는 방법입니다.

unshift 메소드(함수)를 사용하면, 배열의 첫부분에 새 요소를 추가하고,

push 메서드를 사용하면, 배열의 맨 끝 부분에 새 요소를 추가합니다.

JavaScript: 배열 처음, 마지막 부분에 새 요소 삽입 예제


소스 파일명: example.html
<script type="text/javascript">

////////////////////////////////////////////
// 배열 맨 앞에 새 요소 추가; 밀어넣기
////////////////////////////////////////////
var who = new Array( '맹구', '배용준', '땡칠이', '장동건', '강수정', '뿡뿡이', '고은아' );

who.unshift('AAA');
document.write(who, '<br />');
// (이제 배열 맨 앞에, 'AAA'가 삽입되었습니다.
// 출력 결과: AAA,맹구,배용준,땡칠이,장동건,강수정,뿡뿡이,고은아




////////////////////////////////////////////
// 배열 맨 끝 마지막에 새 요소 추가
////////////////////////////////////////////

who.push('ㅋㅋ', 'ㅎㅎ');
document.write(who, '<br />');
// 'ㅋㅋ','ㅎㅎ' 라는 2개의 새 요소들이 추가되었습니다.
// 출력 결과: AAA,맹구,배용준,땡칠이,장동건,강수정,뿡뿡이,고은아,ㅋㅋ,ㅎㅎ


</script>



위와는 반대로, 요소 추출+삭제 함수: ▶▶ 자바스크립트] 배열 요소 삭제, 밖으로 추출 함수; JavaScript shift pop Array

자바스크립트] 배열 요소 삭제, 밖으로 추출 함수; JavaScript shift pop Array

배열의 첫번째 또는 맨 마지막 요소를 "추출+제거"하는 방법입니다.

shift() 메서드(함수)로 배열의 첫번째 요소를 밖으로 뽑아낼 수 있습니다. 뽑아내어진 첫번째 요소는 배열에서 없어집니다.

pop() 메서드로 배열의 마지막 요소를 밖으로 뽑아낼 수 있습니다. 뽑아내어진 마지막 요소는 배열에서 사라집니다.

JavaScript: 배열의 첫번째, 마지막 요소 뽑아내기 예제


소스 파일명: example.html
<script type="text/javascript">

////////////////////////////////////////////
// 배열 첫번째 요소 뽑아내기; 추출
////////////////////////////////////////////
var who = new Array( '맹구', '배용준', '땡칠이', '장동건', '강수정', '뿡뿡이', '고은아' );

var result = who.shift();
document.write(result , '<br />');
// 출력 결과: 맹구

// 이제 배열 맨 앞의, '맹구'가 없어졌습니다.
document.write(who , '<br /><br /><br />');
// 배용준,땡칠이,장동건,강수정,뿡뿡이,고은아




////////////////////////////////////////////
// 배열 마지막 요소 뽑아내기; 추출
////////////////////////////////////////////

result = who.pop();
document.write(result , '<br />');
// 출력 결과: 고은아

// 이제 배열 끝에서, '고은아'가 없습니다.
document.write(who , '<br />');
// 배용준,땡칠이,장동건,강수정,뿡뿡이

</script>



추출이 아닌 단순 삭제만 하려면 대입할 필요없이

who.shift();
또는
who.pop();

이렇게만 해주면 됩니다.




배열에 요소 추가 함수: ▶▶ 자바스크립트] 배열 요소 추가, 새 요소 밀어넣기 함수; JavaScript unshift push Array

배열 합치기: ▶▶ 자바스크립트] 배열 합치기, 여러개의 배열을 연결, 하나로 병합 함수; JavaScript concat Merge Array

매스매티카] 함수 정의 방법, 사용자 함수 만들기; Mathematica User Defined Function

매스매티카에 무수히 많은 함수들이 이미 내장되어 있지만, 사용자가 직접 함수를 정의하여 사용할 수도 있습니다. 일반 프로그래밍 언어에서와 마찬가지입니다.

예를 들어, 변수 x에 10을 더한 후 반환하는 단순한 함수를, f(x) 라는 이름으로 정의하려면

f[x_] := x + 10

이렇게 하면 됩니다. 함수 인수인 x 뒤에 밑줄(_)을 넣어서 x_ 이렇게 해야 합니다. 다만 우변의 x 에는 밑줄을 붙이면 안됩니다.

이제 매스매티카의 노트북(하얀 빈 종이)에
f[3]
이렇게 입력하고 Shift+Enter키를 치면 13 이 출력됩니다.


사용자 정의 함수명은 소문자로 시작


addTen[x_] := x + 10
이렇게 함수명을 여러 글자로 지정해도 됩니다.

다만 함수명의 첫글자는 소문자여야 합니다.

AddTen[x_] := x + 10

ADDTEN[x_] := x + 10

이렇게 대문자로 시작하는 함수명은 좋지 않습니다. 매스매티카의 기본 내장 함수와 상수들은 반드시 대문자로 시작하고, 사용자 정의 함수는 반드시 소문자로 시작하는 것이 관례입니다. 그래야 내장 함수인지 사용자 정의 함수인지 쉽게 구분할 수 있기 때문입니다.

그리고 매스매티카는 항상 대소문자를 엄격히 구분하기에, addTen[x_] 와 AddTen[x_] 는 서로 전혀 다른 함수입니다.


파라미터(매개변수) 여러 개 지정


x의 y제곱을 반환하는 함수를 정의하려면

f[x_, y_] := x^y

이렇게 합니다.

이전에
f[x_] := x + 10
이런 함수를 정의했다면,

f[x_, y_] 함수와 f[x_] 함수는 동시에 공존합니다.

f[3]
이렇게 변수 1개를 넣으면 f[x_] 함수가 실행되어 13이 나오고

f[2, 3]
이렇게 두 개를 넣으면, f[x_, y_] 함수가 실행되어 8이 출력됩니다. "함수 오버로딩 기능"인 듯한데, 매스매티카 매뉴얼에 여기에 대한 설명이 보이지 않았습니다.

?f
라고 하면, 함수 f 의 정의가 출력됩니다.




함수 삭제


Clear[f]
이렇게 하면 f 라는 함수가 삭제됩니다.



Tuesday, May 29, 2007

매스매티카] 극한 값 구하기, 리미트, 좌극한, 우극한; Mathematica lim Limit

매스매티카에서, 수열이나 함수의 극한값을 구하려면 Limit[] 함수를 사용합니다.

x가 0에 한없이 가까워지는 경우:
      1
lim  ---
x->0  x

위와 같은 수식은 다음과 같이 표현합니다.
Limit[1/x, x -> 0]
출력 결과: ∞
(1/x는, "x분의 1"이라는 의미임)


x가 무한대에 가까워지는 경우:
       1
lim   ---
x->∞  x

무한대 기호(∞) 대신 Infinity 라고 적으면 입력하기 쉽습니다. (매스매티카는 대소문자를 엄격히 구분합니다.)
Limit[1/x, x -> Infinity]
출력 결과: 0

무한대 기호를 다음과 같이 직접 적어주어도 됩니다.
Limit[1/x, x -> ∞]


무한대 기호 입력법


매스매티카 맨 우측 "기호 팔레트"에서 ∞ 기호를 직접 클릭해도 되고, 또는 매스매티카 노트북(하얀 빈 종이)에서

<Esc>inf<Esc>
라고 입력하면, 무한대 기호가 삽입됩니다. 즉, 키보드의 Esc키를 누르고 inf 라고 입력하고, 다시 Esc키를 누르면 되는 것입니다.



좌극한, 우극한


      1
lim  ---
x->0  x


* "우극한"은 "Direction -> -1"이라는 옵션(큰 값으로부터 시작하여 작은 값으로; from larger values)을 줍니다.
Limit[1/x, x -> 0, Direction -> -1]
출력 결과: ∞
(x 가 0보다 크면서 한없이 0에 가까워지면 1/x의 우극한 값은 무한대)


* "좌극한"은 "Direction -> 1"이라는 옵션(작은 값으로부터 시작하여 큰 값으로; from smaller values)을 줍니다.
Limit[1/x, x -> 0, Direction -> 1]
출력 결과: -∞
(x 가 0보다 작으면서 한없이 0에 가까워지면 1/x의 좌극한 값은 마이너스 무한대)



좌극한 값과 우극한 값이 다르거나 어느 한쪽이 없으면, 극한값은 존재하지 않으며, 발산합니다.



▶▶ 매스매티카] 무한급수의 합 구하기, 무한합; Mathematica Infinite Series



자바스크립트] 배열의 평균 값, 합계 구하기 함수; JavaScript Sum, Average, Mean Array

자바스크립트에서, 숫자가 들어 있는 배열의 평균 값과 총합계를 구하는 함수입니다.

아래 소스의 sum 함수로 합계를 구하고, average 함수로 평균을 구합니다.

JavaScript: 평균값, 숫자 배열의 합 계산 예제


소스 파일명: example.html
<script type="text/javascript">

var num = new Array( 22, 5, 46, 6, 0, 1, 55 );

document.write('합계: ' , sum(num), '<br />');
document.write('산술 평균: ' , average(num), '<br />');



// 배열 합계 구하기 함수
function sum(array) {
  var result = 0.0;

  for (var i = 0; i < array.length; i++)
    result += array[i];

  return result;
}


// 배열 평균 구하기 함수
function average(array) {
  var sum = 0.0;

  for (var i = 0; i < array.length; i++)
    sum += array[i];

  return sum / array.length;
}

</script>



위의 소스를 파일로 저장한 후 브라우저로 보면 다음과 같이 출력됩니다.

합계: 135
산술 평균: 19.285714285714284



▶▶ 자바스크립트] 중간값, 중앙값(메디안) 구하기 함수; JavaScript Median Function

자바스크립트] 중간값, 중앙값(메디안) 구하기 함수; JavaScript Median Function

자바스크립트에서, 다음의 getMedian() 함수를 사용하면, 배열의 중앙값(Median)을 구할 수 있습니다. 단, 숫자 크기 순으로 이미 정렬된 배열을 함수에 입력해야 합니다. 그렇지 않으면 틀린 값이 나오게 됩니다.

JavaScript: 중간값 구하기 예제 소스


소스 파일명: example.html
<script type="text/javascript">

var a;

a = new Array( 1, 2, 3 );
a.sort(); // 크기 순으로 정렬
document.write(getMedian(a), '<br />');
// 출력 결과: 2


a = new Array( 1, 2, 3, 4 );
a.sort();
document.write(getMedian(a), '<br />');
// 출력 결과: 2.5


a = new Array( 4, 3, 1, 2 );
a.sort();
document.write(getMedian(a), '<br />');
// 출력 결과: 2.5


a = new Array( 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 );
a.sort();
document.write(getMedian(a), '<br />');
// 출력 결과: 1320


a = new Array( 1, 2 );
a.sort();
document.write(getMedian(a), '<br />');
// 출력 결과: 1.5


// 요소 개수가 1개뿐인 배열은 이렇게 지정해야 합니다
// 다음은, 100 이라는 숫자 하나만 들어 있는 배열 정의
a = new Array();
a[0] = 100;
a.sort();
document.write(getMedian(a), '<br />');
// 출력 결과: 100




// 중앙값 계산 함수
// 크기 순으로 이미 정렬된 배열을 입력해야만 합니다
// 범용성을 위해서 이 함수 자체에는 정렬 기능 미포함
function getMedian(array) {
  if (array.length == 0) return NaN; // 빈 배열은 에러 반환(NaN은 숫자가 아니라는 의미임)
  var center = parseInt(array.length / 2); // 요소 개수의 절반값 구하기

  if (array.length % 2 == 1) { // 요소 개수가 홀수면
    return array[center]; // 홀수 개수인 배열에서는 중간 요소를 그대로 반환
  } else {
    return (array[center - 1] + array[center]) / 2.0; // 짝수 개 요소는, 중간 두 수의 평균 반환
  }
}

</script>




▶▶ 자바스크립트] 배열의 평균 값, 합계 구하기 함수; JavaScript Sum, Average, Mean Array

Python 파이썬] 중앙값, 중간값, 메디안 구하기 함수; Median Function

파이썬에 메디안 함수가 있는 줄 알았는데 찾아보니 없는 것 같았습니다. 아래 소스에 정의된 getMedian 함수를 사용하면 중앙값(메디안)을 구할 수 있습니다.

Python: 리스트(배열)의 중앙값 계산 예제


업데이트: 기존의 파이썬 2.X용 소스를 3.X용에 맞게 약간 수정하여 올립니다.
파일명: example3X.py
#!/usr/bin/python
# -*- coding: cp949 -*-


# 중앙값 구하기 함수 정의
# 크기 순으로 이미 정렬된 배열을 입력해야 함
# 범용성을 위해 이 함수 자체에는 정렬 기능이 없음
def getMedian(a):
  a_len = len(a)                # 배열 요소들의 전체 개수 구하기
  if (a_len == 0): return None  # 빈 배열은 에러 반환
  a_center = int(a_len / 2)     # 요소 개수의 절반값 구하기

  if (a_len % 2 == 1):   # 요소 개수가 홀수면
    return a[a_center]   # 홀수 개수인 배열에서는 중간 요소를 그대로 반환
  else:
    return (a[a_center - 1] + a[a_center]) / 2.0 # 짝수 개 요소는, 중간 두 수의 평균 반환



# 프로그램 본체 시작

a = [ 1, 2, 3 ]
a.sort()
print(getMedian(a))
# 출력 결과: 2


a = [ 1, 2, 3, 4 ]
a.sort()
print(getMedian(a))
# 출력 결과: 2.5


a = [ 4, 3, 1, 2 ]
a.sort()
print(getMedian(a))
# 출력 결과: 2.5


a = [ 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 ]
a.sort()
print(getMedian(a))
# 출력 결과: 1320.0


a = [ 1, 2 ]
a.sort()
print(getMedian(a))
# 출력 결과: 1.5


a = [ 100 ]
a.sort()
print(getMedian(a))
# 출력 결과: 100







아래 소스는 기존의 2.X용 소스입니다.


소스 파일명: example.py
#!/usr/bin/python
# -*- coding: cp949 -*-


# 중앙값 구하기 함수 정의
# 크기 순으로 이미 정렬된 배열을 입력해야 함
# 범용성을 위해 이 함수 자체에는 정렬 기능이 없음
def getMedian(a):
  a_len = len(a)                # 배열 요소들의 전체 개수 구하기
  if (a_len == 0): return None  # 빈 배열은 에러 반환
  a_center = a_len / 2          # 요소 개수의 절반값 구하기

  if (a_len % 2 == 1):   # 요소 개수가 홀수면
    return a[a_center]   # 홀수 개수인 배열에서는 중간 요소를 그대로 반환
  else:
    return (a[a_center - 1] + a[a_center]) / 2.0 # 짝수 개 요소는, 중간 두 수의 평균 반환



# 프로그램 본체 시작

a = [ 1, 2, 3 ]
a.sort()
print getMedian(a)
# 출력 결과: 2


a = [ 1, 2, 3, 4 ]
a.sort()
print getMedian(a)
# 출력 결과: 2.5


a = [ 4, 3, 1, 2 ]
a.sort()
print getMedian(a)
# 출력 결과: 2.5


a = [ 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 ]
a.sort()
print getMedian(a)
# 출력 결과: 1320.0


a = [ 1, 2 ]
a.sort()
print getMedian(a)
# 출력 결과: 1.5


a = [ 100 ]
a.sort()
print getMedian(a)
# 출력 결과: 100



▶▶ Python/파이썬] 리스트(배열) 합계, 산술 평균 구하기; List-Array Sum, Average (Mean)

매스매티카] 무한급수의 합 구하기, 무한합; Mathematica Infinite Series

Sum 함수로 무한급수를 계산하려면 최대값에 Infinity 를 넣어주면 됩니다. 다음 예제와 같습니다.

무한급수로 오일러 상수(자연로그의 밑 e) 구하기


∞   1
∑  ---
n=0  n!


Sum[1/n!, {n, 0, Infinity}]
정확히 e 가 출력되는데 근사값을 소수점 이하 30자리까지 구하려면 다음과 같이 합니다.

N[Sum[1/n!, {n, 0, Infinity}], 31]
출력 결과: 2.718281828459045235360287471353

다음과 같이 NSum 함수를 사용하면 근사값을 직접 구할 수 있습니다.
NSum[1/n!, {n, 0, Infinity}]
출력 결과: 2.71828


참고: ▶▶ 자연로그의 밑 e 값, 소수점 이하 1000자리까지 구하기; 매스매티카 Mathematica




무한급수로 원주율의 제곱 구하기


∞    1
∑ 6(---)
n=1  n^2

위의 수식으로 파이의 제곱을 구할 수 있습니다. Sqrt[] 함수로 제곱근을 구하면 파이값이 나옵니다.

Sqrt[Sum[6*(1/n^2), {n, 1, Infinity}]]
파이 기호가 출력되는데,

다음과 같이 하면 소수점 이하 30자리까지 구해집니다.
N[Sqrt[Sum[6*(1/n^2), {n, 1, Infinity}]], 31]
출력 결과: 3.141592653589793238462643383280

참고: ▶▶ 파이값, 원주율 Pi 소수점 이하 1000자리까지 구하기; 매스매티카 Mathematica


▶▶ 매스매티카 Mathematica, 합계;시그마;Sigma 함수, 1에서 100까지 더하기

▶▶ 매스매티카] 극한 값 구하기, 리미트, 좌극한, 우극한; Mathematica lim Limit



디카] 니콘 D40X, D40의 B셔터 사용법; 벌브 셔터(Bulb Shutter)

Nikon D40X 또는 D40 에서, 별매의 리모콘이 있어야 B셔터가 되는 줄 알았는데 어제 보니, 리모콘이 없어도 자체적으로 B셔터가 되더군요. 다만, T셔터는 적외선 리모콘인 "ML-L3"이 있어야 했습니다. (그렇지만 T셔터는 최대 30분까지만 가능하고 그 이상 지나면 자동으로 닫히도록 되어 있었습니다.)

보통 모드에서는 안되고, 수동 노출 모드에서만 B셔터가 됩니다. 카메라 우측 상단의 다이얼을 M 모드에 맞추어야 합니다. M 은 매뉴얼 노출 즉 "수동 노출 모드"입니다.

코맨드 다이얼(Command Dial)을 돌려서 셔터 속도를 느리게 만듭니다. 셔터 속도가 1초를 넘어가면 점이 2개 붙어서

1"

이런 식으로 됩니다. 30초 즉

30"

를 넘으면 비로소

bulb

라는 셔터 속도가 나옵니다. 이것이 벌브 셔터 즉 B셔터입니다.

M모드에서는, [+/-](노출보정) 버튼을 누르면서 커맨드 다이얼을 돌리면, 조리개값을 변경할 수 있습니다.

조리개를 적당한 값으로 설정하고 렌즈의 초점을 맞춘 후, 셔터 버튼을 계속 꾹 누르면, 누르고 있는 동안 셔터가 계속 열려 있습니다. 셔터 버튼에서 손을 떼면 셔터가 닫히고 사진이 완성됩니다.


그런데 D40X 또는 D40 의 B셔터는 별로 쓸모가 없었습니다. B셔터를 쓰려면 셔터 버튼에 릴리즈를 꽂아서 사용해야 카메라가 흔들리지 않는데, 저가형 카메라라서 셔터 버튼에 릴리즈를 삽입할 나사 구멍이 없습니다.

장시간 노출을 하려면, 리모콘인 "ML-L3"가 있어야 했습니다. 이 리모콘이 크기는 조그마한데 값은 2만4천원 정도로 상당히 비싸더군요. 물론 진짜 케이블 릴리즈는 리모콘보다 더 비쌀 것입니다.



▶▶ B셔터, T셔터 차이점; 벌브 셔터(Bulb Shutter), 타임 셔터(Time Shutter) 차이

Monday, May 28, 2007

Excel VBA 엑셀 비베] 무한 루프, 루프 탈출, 빠져 나오기 방법; Do Loop Exit Do

비베에서는 "Do ... Loop"문으로 간단히 무한루프를 구현할 수 있습니다. 루프에서 빠져나오려면 "Exit Do"문을 사용합니다. C언어의 break문에 해당합니다.

빠져나올 수 없는 영원한 무한루프에서는 키보드의 Ctrl+Break키를 누르면 프로그램 전체의 실행이 강제로 종료됩니다. (Ctrl키를 누르면서 Pause/Break키를 누르는 것입니다.)

아래 예제는 무한 루프 속에서 대화상자를 계속 출력하는 예제입니다. 편의상 3개까지만 나타내고 종료합니다.

비베에서 무한루프(Infinity Loop) 만들기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Infinity_Loop_Example()
  Dim Counter
  Counter = 0

  Do
    MsgBox "무한 루프: Ctrl+Break키로 강제 종료 가능"

    '''''''''''''''''''''''''''''''''''''''''
    ' 이 부분이 없으면 영원한 무한 루프
    '
    Counter = Counter + 1
    If Counter = 3 Then
      Exit Do
    End If
    '''''''''''''''''''''''''''''''''''''''''
  Loop

End Sub



Java 자바] double 배열 중앙값, 중간값, 메디안 구하기 메서드; Median Method

숫자가 들어 있는 배열에서, 중앙값(메디안)을 구하는 방법입니다. 아래의 getMedian 이라는 메소드(함수)를 사용하면 됩니다. 그런데 우선 배열을 크기순으로 소팅한 후에 getMedian 에 인수로 넘겨주어야 합니다. 소팅하지 않으면 틀린 값이 나옵니다.

중앙값 구하기, 출력 예제 소스


소스 파일명: Example.java
import java.util.Arrays;

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

    double[] a;


    a = new double[] { 1, 2, 3 };
    Arrays.sort(a); // 크기 순으로 정렬
    System.out.println(getMedian(a));
    // 출력 결과: 2.0

    a = new double[] { 1, 2, 3, 4 };
    Arrays.sort(a);
    System.out.println(getMedian(a));
    // 출력 결과: 2.5

    a = new double[] { 4, 3, 1, 2 };
    Arrays.sort(a);
    System.out.println(getMedian(a));
    // 출력 결과: 2.5

    a = new double[] { 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 };
    Arrays.sort(a);
    System.out.println(getMedian(a));
    // 출력 결과: 1320.0

    a = new double[] { 1, 2 };
    Arrays.sort(a);
    System.out.println(getMedian(a));
    // 출력 결과: 1.5

    a = new double[] { 100 };
    Arrays.sort(a);
    System.out.println(getMedian(a));
    // 출력 결과: 100.0


  }




  // 중앙값 구하기 메소드
  // 크기 순으로 이미 정렬된 배열을 입력해야만 함
  // 코드의 범용성을 위해서 이 함수 자체에는 정렬 기능이 없음
  public static double getMedian(double[] array) {
    if (array.length == 0) return Double.NaN; // 빈 배열은 에러 반환(NaN은 숫자가 아니라는 뜻)
    int center = array.length / 2;            // 요소 개수의 절반값 구하기

    if (array.length % 2 == 1) { // 요소 개수가 홀수면
      return array[center]; // 홀수 개수인 배열에서는 중간 요소를 그대로 반환
    } else {
      return (array[center - 1] + array[center]) / 2.0; // 짝수 개 요소는, 중간 두 수의 평균 반환
    }
  }


}



중앙값 계산기: ▶▶ 평균 계산기, 합계 구하기, 표준편차 계산기, 중앙값; Sum Average Stdev Median Calc

B셔터, T셔터 차이점; 벌브 셔터(Bulb Shutter), 타임 셔터(Time Shutter) 차이

B셔터는 "벌브 셔터(Bulb Shutter)"이고, T셔터는 "타임 셔터(Time Shutter)"를 의미합니다. 둘다, 야경이나 천문사진을 위한 "장시간 노출"에 사용됩니다.

일반적인 촬영에서의 셔터 속도는 보통 "250분의 1초"나, "128분의 1초" 정도입니다. 즉, 눈 깜짝할 사이에 사진이 찍힙니다. 그러나 야경을 촬영할 때에는 어둡기 때문에 수십 초 이상의 장시간 노출을 주어야 하고, 특히 천문사진에서는 별들의 움직임을 담기 위해 몇 시간의 노출을 주어야 할 때도 많습니다. 이때 B셔터나 T셔터를 사용합니다.

B셔터 : 셔터를 B셔터로 세팅하면, 셔터 버튼을 꾹 누르고 있는 동안 계속해서 셔터막이 열려 있습니다. 셔터 버튼에서 손을 떼면 그제서야 셔터막이 닫히고 노출이 완료됩니다. 셔터막이 열려 있다는 의미는 필름 또는 디카의 촬상소자(CCD/CMOS)가 외부의 빛에 노출된다는 뜻입니다.

T셔터 : 셔터를 T셔터로 세팅하면, 셔터 버튼을 한번 누르면 셔터막이 열리고, 다시 한번 더 누르면 셔터막이 닫힙니다.

B셔터보다, T셔터가 더 사용이 편리합니다. 그런데 전문가용 고급 카메라에는 일반적으로 T셔터와 B셔터가 다 있지만, 보통의 평범한 카메라에는 둘다 없거나 또는 B셔터만 있습니다.


장시간 노출은 반드시 삼각대를 필요로 합니다.

그리고 특히 B셔터로 촬영할 때 손가락으로 셔터 버튼을 누르면 카메라가 흔들려서 사진이 흐리게 찍힐 가능성이 높습니다.

그래서 "케이블 릴리즈(Cable Release)" 라는 것을 구입해서, 셔터 버튼 위의 나사구멍에 끼워 넣고, 릴리즈의 버튼을 대신 눌러야 합니다. 케이블 릴리즈라는 것은 내시경 비슷하게 생긴 것인데 카메라 상점에 가면 팝니다.

저가형 카메라의 셔터 버튼에는 나사구멍이 없기에 이때는 전용 무선 리모콘을 사용하여 셔터를 원격 조정하면 됩니다.




요즘 카메라는 비교적 저가형도, 셔터 속도를 30초 정도의 장시간으로 설정할 수 있는 것이 많습니다. 이때는 B셔터, T셔터가 그리 필요하지 않습니다. 야경 촬영은 대부분 5~30초 정도 노출이면 충분합니다.

예전 기계식 카메라에서는 셔터 속도가 최장 1초 정도밖에 안되었기에, 그 이상의 노출을 줄 때에는 B셔터, T셔터를 사용했습니다.


▶▶ 디카] 니콘 D40X, D40의 B셔터 사용법; 벌브 셔터(Bulb Shutter)

C언어] double 배열 중앙값, 중간값, 메디안 구하기 함수; Median Function

C언어에서 숫자가 들어 있는 배열의 중앙값(Median)을 구하는 예제 소스입니다. 아래의 getMedian 함수에, 배열명과 배열 요소 개수를 넣어주면 중앙값을 반환합니다. 다만 이미 크기순으로 소팅된 배열이어야 합니다. 그렇지 않으면 틀린 값을 반환합니다.

C에서 중앙값 계산 예제 소스


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

int comparisonFunctionDouble(const void *a, const void *b);
double getMedian(double* array, size_t arraySize);


int main(void) {

  double a1[] = { 1, 2, 3 };
  qsort((void *)a1, sizeof(a1) / sizeof(a1[0]), sizeof(a1[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a1, sizeof(a1) / sizeof(a1[0]))  );
  // 출력 결과: 2.00

  double a2[] = { 1, 2, 3, 4 };
  qsort((void *)a2, sizeof(a2) / sizeof(a2[0]), sizeof(a2[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a2, sizeof(a2) / sizeof(a2[0]))  );
  // 출력 결과: 2.50

  double a3[] = { 4, 3, 1, 2 };
  qsort((void *)a3, sizeof(a3) / sizeof(a3[0]), sizeof(a3[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a3, sizeof(a3) / sizeof(a3[0]))  );
  // 출력 결과: 2.50

  double a4[] = { 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 };
  qsort((void *)a4, sizeof(a4) / sizeof(a4[0]), sizeof(a4[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a4, sizeof(a4) / sizeof(a4[0]))  );
  // 출력 결과: 1320.00

  double a5[] = { 1, 2 };
  qsort((void *)a5, sizeof(a5) / sizeof(a5[0]), sizeof(a5[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a5, sizeof(a5) / sizeof(a5[0]))  );
  // 출력 결과: 1.50

  double a6[] = { 100 };
  qsort((void *)a6, sizeof(a6) / sizeof(a6[0]), sizeof(a6[0]), comparisonFunctionDouble);
  printf(  "%.2f\n", getMedian(a6, sizeof(a6) / sizeof(a6[0]))  );
  // 출력 결과: 100.00


  return 0;
}




// 중앙값 구하기 함수
// 주의! 크기 순으로 이미 정렬된 배열을 입력해야만 합니다.
// 코드의 효율성을 위해서 이 함수 자체에는
// 정렬 기능이 포함되어 있지 않습니다
double getMedian(double* array, size_t arraySize) {
  size_t center = arraySize / 2; // 요소 개수의 절반값 구하기
  if (arraySize % 2 == 1) { // 요소 개수가 홀수면
    return array[center]; // 홀수 개수인 배열에서는 중간 요소를 그대로 반환
  } else {
    return (array[center - 1] + array[center]) / 2.0; // 짝수 개 요소는, 중간 두 수의 평균 반환
  }
}


// qsort 내부에서 사용되는 비교 함수
int comparisonFunctionDouble(const void *a, const void *b) {
  if (*(double*)a <  *(double*)b) return -1;
  if (*(double*)a == *(double*)b) return  0;

  return 1;
}



Perl 펄] 중앙값, 중간값, 메디안 구하기 함수; Median Function

숫자가 들어 있는 배열에서, 중앙값(Median)을 구하는 방법입니다. 아래의 getMedian 함수를 사용하면 됩니다.

중앙값을 구하기 전에, 반드시 배열의 숫자들을 크기 순으로 소트해야 합니다.

배열의 중앙값 얻기 예제


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

  my @a;
  my @a_sorted;


  @a = ( 1, 2, 3 );
  @a_sorted = sortNumber(@a); # 배열 크기순으로 정렬
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 2

  @a = ( 1, 2, 3, 4 );
  @a_sorted = sortNumber(@a);
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 2.5

  @a = ( 4, 3, 1, 2 );
  @a_sorted = sortNumber(@a);
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 2.5

  @a = ( 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 );
  @a_sorted = sortNumber(@a);
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 1320

  @a = ( 1, 2 );
  @a_sorted = sortNumber(@a);
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 1.5

  @a = ( 100 );
  @a_sorted = sortNumber(@a);
  print getMedian(@a_sorted), "\n";
  # 출력 결과: 100




# 중앙값 구하기 함수
# 크기 순으로 이미 정렬된 배열을 입력해야 함
# 효율성을 위해 이 함수 자체에는 정렬 기능이 없음
sub getMedian {
  my @array = @_;              # 파라미터로 입력된 배열 받기
  my $len = $#array + 1;       # 배열 요소들의 전체 개수 구하기
  return undef if ($len == 0); # 빈 배열은 에러 반환
  my $center = $len / 2;       # 요소 개수의 절반값 구하기

  if ($len % 2 == 1) { # 요소 개수가 홀수면
    return $array[$center]; # 홀수 개수인 배열에서는 중간 요소를 그대로 반환
  } else {
    return ($array[$center - 1] + $array[$center]) / 2; # 짝수 개 요소는, 중간 두 수의 평균 반환
  }
}


sub sortNumber {
  return sort {$a <=> $b} @_;
}



중앙값이란? : ▶▶ 매스매티카] 중앙값, 중간값, 메디안 구하기 함수; Mathematica Median

중앙값 계산기: ▶▶ 평균 계산기, 합계 구하기, 표준편차 계산기, 중앙값; Sum Average Stdev Median Calc

광각 디카] 28미리 광각 렌즈 지원되는 똑딱이는? 28mm 컴팩트 디카

현재 "캐논 IXUS(익서스) 850 IS" 라는 똑딱이(컴팩트 카메라)가 28미리 광각까지 되는 줌 렌즈가 달려 있습니다. 물론 35미리판 환산 화각이 28mm 라는 뜻이고, 상당히 넓은 광각이어서 풍경 촬영이나 특히 실내 촬영에 좋습니다.

좁은 실내에서는 28미리 광각 정도가 되지 않으면, 방안의 전체 모습이 거의 찍히지 않고, 창문이나 문짝만 찍히게 됩니다.

그리고 "익서스 850 IS" 는 105미리(35미리 환산) 망원까지 사용할 수 있습니다.


광각렌즈 지원되는 똑딱이는 아마 "익서스 850 IS"가 최초일 것 같습니다. 비슷한 기종의 익서스와 파워샷에서는 35미리 정도가 최대 광각이었습니다. 35mm 의 준광각 렌즈는 원근감 과장이 적어서 풍경 촬영에는 적합하지만, 28mm 보다는 화각이 좁기 때문에 실내 촬영에는 좀 답답한 면이 있습니다.

저도 처음에는 "익서스 850 IS" 를 사려고 했는데, 요즘 똑딱이가 아무리 화질이 좋아도 DSLR보다는 훨씬 뒤떨어지기 때문에 니콘 D40X 를 구입했습니다.


물론, 앞으로 5~10년쯤 지나면 DSLR 만큼 화질 좋은 컴팩트 카메라도 나오겠지요.


Sunday, May 27, 2007

Python 파이썬] 무한 루프 만들기, 루프 탈출/빠져나오기 방법 'while' 'break'

파이썬에서 무한 루프를 구현하기 위해서는 "while True:" 또는 "while 1:" 을 사용하면 됩니다. while문은 조건이 참일 때에만 계속 실행되기에, True 또는 1(숫자 일)을 넣어 주면 무한 루프가 됩니다. 1은 참에 해당합니다.

루프에서 빠져나오기 위해서는 break문을 사용하는데 가장 가까운 루프를 탈출합니다.

Python: 무한루프 예제


소스 파일명: example.py
#!/usr/bin/python
# -*- coding: cp949 -*-


stopper = 0


while True:
  print "< 무한루프: while문으로 구현 >"

  #########################################
  ## 이 부분이 없으면, 영원한 무한루프가 됨
  stopper += 1
  if (stopper >= 10):
    break
  #########################################




C언어] 무한루프 만들기, 루프 탈출/빠져나오기 방법; 'while' 'for' 'break'

무한 루프를 while문으로 "while (1)" 이렇게 구현하면, 컴파일러 설정에 따라 warning C4127: conditional expression is constant (조건문이 상수로 되어 있음) 라는 경고가 나옵니다.

따라서 for문을 사용하여 무한 루프를 만드는 것이 무난합니다.

무한 루프에서 빠져 나오기 위해서는 'break' 라는 키워드를 사용합니다. 가장 가까운 루프문을 즉시 빠져나갑니다.

빠져 나올 수 없는 영원한 무한 루프일 경우에는, 키보드의 Ctrl+C키를 누르면 프로그램 전체가 종료됩니다.

'for문'으로 무한 루프 구현 예제


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

int main(void) {

  double stopper = 0.0;

  for (;;) {
    puts("< 무한루프: for문으로 구현 >");

    ////////////////////////////////////////
    // 이 부분이 없으면, 영원한 무한루프가 됨
    stopper++;
    if (stopper >= 10.0) {
      break;
    }
    ////////////////////////////////////////
  }

  return 0;
}


영원한 무한루프에서는 return 0; 이런 곳에서 unreachable code (도달할 수 없는 코드) 라는 경고가 나올 수 있습니다.


while문으로 무한 루프 돌리기 예제


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

int main(void) {

  double stopper = 0.0;

  while (1) { // warning C4127: conditional expression is constant
    puts("< 무한루프: while로 구현 >");

    ////////////////////////////////////////
    // 이 부분이 없으면, 영원한 무한루프가 됨
    stopper++;
    if (stopper >= 10.0)
      break;
    ////////////////////////////////////////
  }

  return 0;
}




Excel 엑셀] 분산 구하기 함수 (표본의 분산); Variance Function

엑셀 기본 내장 함수인 =VAR() 함수에 숫자 목록을 인수로 넣어주면 숫자 데이터의 분산을 구할 수 있습니다.

=VAR(1,2,3,4)
이렇게 하면 1,2,3,4의 분산(Variance)인 1.666666667 이 구해집니다.

분산의 제곱근이 표준편차이기에, 표준편차(STDEV)를 제곱해도
=STDEV(1,2,3,4)^2
이렇게 1.666666667 로 분산이 구해집니다.


그리고 A열에 다음과 같은 숫자들이 있을 때

1345
1301
1368
1322
1310
1370
1318
1350
1303
1299

다른 셀에
=VAR(A:A)
이렇게 입력하면, A열의 모든 숫자들의 분산이 754.2666667 로 구해집니다.




VAR 함수는 표본의 분산을 구하는 것인데, 모집단 전체의 분산을 구하는 경우는 VARP 함수를 사용합니다.


▶▶ Excel/엑셀] 표준편차 구하기 함수 (표본, 모집단 전체); Standard Deviation

Excel 엑셀] 중앙값, 중간값, 메디안 구하기 함수; Median Function

엑셀의 기본 내장 함수인 =MEDIAN() 함수를 사용하면, 숫자들의 중앙값(중간값, 메디안)을 구할 수 있습니다.

=MEDIAN(1,2,3)
이렇게 하면 중앙값인 2가 나오고

=MEDIAN(1,2,3,4)
이렇게 하면 중앙값인 2.5 가 나옵니다.

그리고 A열에 다음과 같은 숫자들이 있을 때

1345
1301
1368
1322
1310
1370
1318
1350
1303
1299

다른 셀에
=MEDIAN(A:A)
이렇게 입력하면, A열의 모든 숫자들의 메디안이 1320 으로 구해집니다.


[ 중앙값(메디안)이란 무엇인가요? ] ▶▶ 매스매티카] 중앙값, 중간값, 메디안 구하기 함수; Mathematica Median


매스매티카] 중앙값, 중간값, 메디안 구하기 함수; Mathematica Median

Median 은 여러 숫자로 이루어진 리스트(배열)에서 가장 중간에 해당하는 값을 하나만 콕 집어서 추출하는 함수입니다. 단, 리스트를 크기 순서대로 정렬(소트;소팅)한 후 중간값을 찾습니다. 즉, 순서의 중간이 아니고, 값의 중간입니다.

Median[{1, 2, 3}]
중앙값인 2가 나옵니다. 리스트 중에서 2가 가장 가운데 있기 때문입니다. 요소 개수가 홀수일 때는 쉽습니다.

Median[{1, 2, 3, 4}] // N
중앙값인 2.5가 나옵니다. 요소 개수가 짝수일 때는 정확한 중간 요소가 없기 때문에, 가장 중간의 양쪽 요소 2개의 산술 평균을 중간값으로 삼습니다. 여기서는 2와 3의 평균을 구한 것입니다.


Median[{4, 3, 1, 2}] // N
리스트 순서와 상관없이, 여전히 2.5가 나옵니다. 크기 순서대로 소팅하면 리스트가 {1, 2, 3, 4} 이렇게 되고, 2와 3의 평균인 2.5을 중앙값으로 출력합니다.



변수 x에 리스트를 대입한 후

x = {1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299};

Median[x] // N
이렇게 해도 중앙값이 1320 으로 구해집니다.





Median[{1, 2, 3, 4, 50000}]
이렇게 극단적으로 큰 값이 리스트에 들어가 있어도, 중앙값은 3이 나옵니다. 극단적인 값의 영향을 받지 않습니다. 이것이 메디안의 장점이 될 수도 있고 단점이 될 수도 있습니다.


▶▶ 매스매티카 Mathematica, 평균 값, 합계 구하기 함수; Mean Average Sum

매스매티카] 표준편차, 분산 구하기 함수; Mathematica Standard Deviation, Variance

매스매티카에서는 StandardDeviation 함수로 표준편차를, Variance 함수로 분산을 구할 수 있습니다. 숫자 목록을 중괄호{}로 둘러싼 후 인수로 입력해 주면 됩니다.

표준편차 구하기 함수


StandardDeviation[{1, 2, 3, 4}] // N
출력 결과: 1.29099

또는
x = {1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299};
이렇게 x 에 숫자 리스트를 대입한 후,

StandardDeviation[x] // N
이렇게 하면 리스트 x의 표준편차인 27.4639 가 출력됩니다.

또는
N[StandardDeviation[x], 30]
출력 결과: 27.4639157198434955193388966061
이렇게 정밀도를 지정할 수도 있습니다.



분산 구하기 함수


분산의 제곱근이 표준편차이기에, 표준편차를 제곱하면

StandardDeviation[x]^2 // N
리스트 x의 분산인 754.267 이 구해지지만, 분산을 구하는 Variance[] 함수를 사용하여

Variance[x] // N
이렇게 해도 분산이 754.267 로 구해집니다.


Sqrt[Variance[x]] // N
이렇게 분산의 제곱근을 구하면 표준편차인 27.4639 가 다시 출력됩니다.



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

▶▶ 매스매티카 Mathematica, 평균 값, 합계 구하기 함수; Mean Average Sum

Saturday, May 26, 2007

탐색기에서, 파일 복사/이동; 마우스 우측 버튼으로; File Copy Context Menu

윈도우 탐색기에서, 마우스 우측 버튼의 "컨텍스트 메뉴"를 사용하여, 파일이나 폴더(디렉토리)를 복사 또는 이동하는 방법입니다.

마우스 좌측 버튼으로 끌어다 놓는 방법보다 더 안전하고 편리합니다.

* 다른 폴더로 복사 또는 이동시킬, 파일 또는 폴더를 클릭하여 선택합니다. 이동할 파일이 여러 개라면 Shift키를 누른 채 "상하 화살표키"를 누르면 여러 개를 동시에 선택할 수 있습니다. 현재 폴더의 모든 파일들을 다 선택하려면 Ctrl+A키를 누릅니다. (Ctrl키를 누르면서 A키를 누름)

* 선택된 파일들을, 마우스 우측 버튼으로 클릭한 상태로, 다른 폴더에다 끌어다놓습니다. 우측 버튼을 계속 누르며 움직여야 합니다.

* 이제 마우스 우측 버튼에서 손을 떼면, 작은 메뉴가 나오고 그 안에서 "복사"와 "이동"을 선택할 수 있습니다. 선택하면 복사 또는 이동이 완료됩니다.

아래 그림은, 현재 폴더의 파일을, X 라는 폴더로 복사 또는 이동하는 장면입니다.

파일 복사



키보드 핫키를 사용하여 복사하는 방법: ▶▶ 윈도우 탐색기] 파일/폴더 복사 이동 핫키; Windows Explorer Hotkey File Folder Copy Move

키보드로 파일 복사, 폴더 카피 방법; File Copy Using Keyboard

키보드로 파일을 복사하는 법은 2가지가 있는데, 우선, 윈도우 탐색기에서 핫키(Hot-key)를 사용하는 방법입니다. 일반 문서 편집에서 Ctrl+C / Ctrl+V 키로 문장을 복사하고 붙여 넣듯이, 탐색기에서 파일 역시도 이런 핫키로 복사/이동할 수 있습니다. 자세한 설명은 여기에: ▶▶ 윈도우 탐색기] 파일/폴더 복사 이동 핫키; Windows Explorer Hotkey File Folder Copy Move

도스창에서 파일 복사 명령


도스창(명령 프롬프트;CMD.EXE)에서도, 명령어를 타이핑하여 파일을 복사할 수 있습니다. xcopy 라는 명령이 가장 강력합니다.

다음은, 현재 디렉토리(D:\Z)의 모든 exe 확장자의 파일들을, "D:\X" 라는 폴더(디렉토리)에 한꺼번에 카피하는 장면입니다.

xcopy /?
라고 하면 xcopy 명령에 대한 도움말이 나옵니다.
D:\Z>xcopy *.exe d:\x
D:localtime_s.exe
D:sprintf_s.exe
D:wt.exe
3개 파일이 복사되었습니다.

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

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

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

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


D:\Z>



참고: ▶▶ 도스 명령] 하위 디렉토리까지 복사, Copy 디렉토리: XCOPY, DOS 배치 파일

윈도우 탐색기] 파일/폴더 복사 이동 핫키; Windows Explorer Hotkey File Folder Copy Move

윈도우 탐색기에서, 마우스로 파일/폴더를 복사 또는 이동할 수도 있지만, 키보드 핫키를 사용하는 것이 더 안전합니다.

파일을 다른 폴더로 이동시키는 핫키
* 다른 폴더로 이동시킬 파일을 클릭하여 선택합니다. 이동할 파일이 여러 개라면 Shift키를 누른 채 "상하 화살표키"를 누르면 여러 개를 동시에 선택할 수 있습니다. 현재 폴더의 모든 파일들을 다 선택하려면 Ctrl+A키를 누릅니다. (Ctrl키를 누르면서 A키를 누름)

* 파일들이 선택된 상태에서, 키보드의 Ctrl+X 키를 누릅니다. (Ctrl키를 누르면서 X키를 누름)

* 탐색기에서, 파일을 이동할 다른 폴더를 클릭하여 선택합니다. 그 폴더에서 Ctrl+V키를 누릅니다. 그러면 파일들이 그 폴더로 이동됩니다.

* 파일이 아닌 폴더의 이동도 마찬가지입니다.



파일을 다른 폴더로 '복사'하는 법
* 복사할 파일을 선택한 후, Ctrl+C키를 누릅니다. 그 파일이 복사되어야 할 다른 폴더로 이동한 후, Ctrl+V키를 누르면 복사됩니다. 폴더 복사도 마찬가지입니다.




마우스 좌측 버튼으로 작업하면, 현재 드라이브에서와, 다른 드라이브에서의 복사/이동 방법이 좀 달라서 헷갈리는 문제가 있습니다.

반면 핫키를 사용하면, 다른 드라이브로 복사/이동할 때도 똑같은 핫키를 사용할 수 있어 편리합니다.



마우스 우측 버튼으로 파일 복사, 이동하기 (편리하고 직관적인 방법): ▶▶ 탐색기에서, 파일 복사/이동; 마우스 우측 버튼으로; File Copy Context Menu


마우스 좌측 버튼으로 파일 복사, 이동하기: ▶▶ 윈도우 탐색기] 파일 복사 이동, 폴더 카피 방법; Windows Explorer File Folder Copy Move

윈도우 탐색기] 파일 복사 이동, 폴더 카피 방법; Windows Explorer File Folder Copy Move

윈도우 탐색기에서, 마우스로 파일을 다른 폴더로 복사/이동하는 방법입니다.

업데이트: 마우스 우측 버튼으로 파일 복사/이동하기 (편리하고 직관적인 방법): ▶▶ 탐색기에서, 파일 복사/이동; 마우스 우측 버튼으로; File Copy Context Menu

이하는, 마우스 좌측 버튼으로 복사/이동하는 방법입니다.




파일을 다른 폴더로 이동하는 방법
* 다른 폴더로 이동시킬 파일을 클릭하여 선택합니다. 이동할 파일이 여러 개라면 Shift키를 누른 채 "상하 화살표키"를 누르면 여러 개를 동시에 선택할 수 있습니다. 현재 폴더의 모든 파일들을 다 선택하려면 Ctrl+A키를 누릅니다. (Ctrl키를 누르면서 A키를 누름)

* 선택된 파일들을 마우스로 드래그하여 다른 폴더에 갖다 놓으면 그 폴더로 이동됩니다. 마우스 좌측 버튼을 누르면서 끌어다가, 다른 폴더에서 버튼을 놓으면 됩니다. 아래 그림과 같습니다. 아래 화면은 윈도우2000의 탐색기에서 파일을 복사/이동하는 장면인데, 윈도우XP에서도 마찬가지입니다.

클릭또는옆으로스크롤가능
윈도우2000 파일 복사


위의 그림의 좌측 (1)번 탐색기는, "D:\Y\새 폴더" 라는 폴더의 JPG 파일들을 "WWW" 라는 폴더로 이동시키는 장면입니다. 파란 화살표가 가리키는 상단 막대를 클릭하면 파일들을 이름순이나 크기순으로 정렬할 수 있습니다. 정렬 후 파일을 선택하면 더 쉽습니다.


파일을 다른 폴더로 '복사'하는 법
* 위에서처럼 마우스로 파일을 끌어다 놓되, 키보드의 Ctrl키를 누르면서 마우스를 움직이면 복사가 됩니다.


폴더 이동/복사 방법
* 폴더(디렉토리)도 파일과 같은 방법으로 가능합니다.


다른 하드 드라이브로 이동과 복사


다른 드라이브로 파일이나 폴더를 끌어다 놓으면, 이동이 되지 않고 복사가 됩니다. 그러나 이때 Shift키를 누르면, 이동이 됩니다.


파일 복사/이동 취소하는 법


파일 작업이 잘못되어서 취소하고 싶은 경우에는, 탐색기 상단 메뉴의

편집 > 이동 취소

등의 메뉴를 선택하면, 탐색기 맨 아래에 어떤 파일들이 취소될 것인지 나타납니다.

위의 그림을 확대하여, 우측의 (2)번 탐색기를 보면 나와 있습니다. 보라색 화살표가 가리키는 곳입니다.


또한, Ctrl+Z키를 누르면, 방금 전에 했던 파일 작업을 단번에 취소할 수 있습니다. 그런데 Ctrl+Z키를 한번 더 누르면 그 전의 작업까지 무조건 취소되어 버리기에 상당히 위험합니다.



키보드 핫키로 파일 복사하는 법: ▶▶ 윈도우 탐색기] 파일/폴더 복사 이동 핫키; Windows Explorer Hotkey File Folder Copy Move

파이 기호 입력 방법; 원주율 기호(PI) 특수 문자 문서에 삽입 π

수학에서 원주율(3.14...)을 나타내는 그리스 문자인 파이 기호를 문서에 입력하는 방법입니다. 우선 메모장 등의 문서에서, 한글 자모인 "히읗"을



이렇게 입력하고, 즉시 키보드의 "한자 변환키"를 누릅니다. 그러면 화면 맨 아래 우측에 특수문자표가 나옵니다. 그 문자표의 우측 화살표 버튼을 4번쯤 누르면
π

이런 파이 기호가 나타납니다. 이 기호를 클릭하면 현재 문서에 파이 기호가 삽입됩니다.


또는 위의 파이 기호를 마우스로 긁어서 선택한 후, 키보드의 Ctrl+C 키를 누르면 메모리에 파이 기호가 복사됩니다. 다른 문서에서 Ctrl+V키를 누르면 파이 기호를 붙여 넣을 수 있습니다. Ctrl+C 키란, Ctrl키를 누르면서 C키를 누르는 것입니다.


그런데 윈도우 '돋움체'에서는 파이 기호가 이상하게 출력됩니다. '바탕체' 등의 폰트를 지정해야 합니다.

▶▶ 파이값, 원주율 Pi 소수점 이하 1000자리까지 구하기; 매스매티카 Mathematica

▶▶ 한글 특수문자 입력표 - Hangul Special Character Input Table


HTML-CSS] 제곱 지수 태그, 위첨자 아래첨자 태그, 로그의 밑; SUP SUB Tag

HTML 웹문서에서는, SUP 태그로 위첨자를 표현하고, SUB 태그로 아래첨자를 표현합니다.

거듭제곱을 표현하려면, 숫자의 오른쪽 상단 어깨에 작은 숫자를 쓰는데 SUP 태그로 가능합니다.

SUP SUB 태그는 XHTML 문법 규약에서도 여전히 유효합니다. 다만 일부 수학 상수를 이탤릭체로 표현할 때, <i></i> 태그보다는 font-style:italic 이라는 CSS스타일을 지정하는 것이 좋습니다.

작은 글씨로 제곱, 세제곱 등 표현 방법


파일명: example.html
3의 제곱 나타내기<br />
3<sup>2</sup>


<br /><br /><br /> <!-- 줄바꿈 -->


x의 세제곱 나타내기<br />
x<sup>3</sup>


<br /><br /><br />


5의 세제곱근 나타내기<br />
<sup>3</sup>√5 = 1.7099759466766968


<br /><br /><br />


오일러의 공식 나타내기<br />
<span style="font-style:italic">e</span><sup><span style="font-style:italic">i</span>π</sup> + 1 = 0


<br /><br /><br />


아래 첨자 나타내기<br />
x<sub>1</sub> + x<sub>2</sub>


<br /><br /><br />


로그의 밑 나타내기 (밑이 10인 상용로그)<br />
Log<sub>10</sub> 3 = 0.4771212547196624


위의 예제를 파일로 저장한 후 브라우저로 보면 아래와 같은 결과가 나옵니다:

3의 제곱 나타내기
32





x의 세제곱 나타내기
x3





5의 세제곱근 나타내기
3√5 = 1.7099759466766968





오일러의 공식 나타내기
eiπ + 1 = 0





아래 첨자 나타내기
x1 + x2





로그의 밑 나타내기 (밑이 10인 상용로그)
Log10 3 = 0.4771212547196624





자바스크립트] switch문 case문 default문, 스위치; JavaScript

C언어에서처럼 자바스크립트에도 switch문이 있습니다. 중첩된 if-else문 대신 사용하면 소스를 한층 간결하게 만들 수 있습니다. 문법적으로 유연하기에 조건으로서 문자열을 지정할 수도 있습니다.

break문을 반드시 넣어주어야 하며, 그렇지 않으면 아래쪽 조건들까지 모두 실행되어 버리기에 주의가 필요합니다.

default문은, 해당 사항이 없을 때 기본값으로서 실행할 내용인데, 필요 없다면 default문을 생략할 수도 있습니다.

JavaScript: if-else 대용 스위치-문 예제


소스 파일명: example.html
<script type="text/javascript">

// 숫자형으로 조건 지정
var i = 365;

switch (i) {
  case 66    : document.write('66 이라는 정수입니다.<br />');
               break;
  case 365   : document.write('365 라는 정수입니다.<br />');
               break;
  case 1000  : document.write('1000 이라는 정수입니다.<br />');
               break;
  default    : document.write('해당 숫자가 없습니다.<br />');
               break;
}
// 출력 결과: 365 라는 정수입니다.



// 문자형으로 조건 지정
var c = 'A';

switch (c) {
  case 'A'  : document.write('A 라는 문자입니다.<br />'); break;
  case '똠' : document.write('똠 이라는 문자입니다.<br />'); break;
  case '7'  : document.write('7 이라는 문자입니다.<br />'); break;
  default   : document.write('해당되는 문자가 없습니다.<br />'); break;
}
// 출력 결과: 'A' 라는 문자입니다.



// 문자열로 조건 지정
var camera = 'Nikon D40X';

switch (camera) {
  case 'Nikon D40'  : document.write('50만원대입니다.<br />'); break;
  case 'Nikon D40X' : document.write('80만원대의 디카입니다.<br />'); break;
  case 'Canon PowerShot' : document.write('40만원대의 컴팩트 카메라입니다.<br />'); break;
  default   : document.write('해당되는 카메라가 없습니다.<br />'); break;
}
// 출력 결과: 80만원대의 디카입니다.

</script>



Friday, May 25, 2007

PHP 문자열 배열 정렬/소트/소팅 함수, 대소문자 구분 없이; Sort Ignore Case, String Array

PHP 에서 배열 요소들을 순서대로 정렬하는 방법입니다. 영문 문자열 배열일 경우, 대소문자를 구분하지 않고 정렬하는 것이 자연스럽습니다.

C언어의 qsort() 함수처럼, PHP에서는 usort / sort 등의 함수를 사용할 수 있습니다.

usort 함수에 'strcasecmp' 라는 비교 함수 (Comparison Function) 를 넣으면 대소문자 구분 없이 소팅됩니다. 그런데 비교 함수 뒤에는 소괄호를 붙이면 안됩니다. strcasecmp() 이렇게 하면 PHP Warning: usort(): Invalid comparison function (잘못된 비교 함수) 이런 경고가 나오고 소팅도 되지 않습니다.

usort, sort, strcasecmp 함수 사용 예제


소스 파일명: example.php
<html>
<head>
<title>PHP Example</title>
</head>

<body>

<?php

  // 요소들이 순서 없이 섞여 있는 배열
  $a = array("bbb", "AA", "c", "ZZ", "ZZ2", "ZZ10", "CCC", "aa", "BBBB");


  // 대소문자 구분없이 소팅하기
  // 실용적임
  usort($a, 'strcasecmp');
  print_r($a);

/* 출력 결과:
Array
(
    [0] => aa
    [1] => AA
    [2] => bbb
    [3] => BBBB
    [4] => c
    [5] => CCC
    [6] => ZZ
    [7] => ZZ10
    [8] => ZZ2
)
*/



  // 대소문자 구분하여 소트
  sort($a);
  print_r($a);
/* 출력 결과
Array
(
    [0] => AA
    [1] => BBBB
    [2] => CCC
    [3] => ZZ
    [4] => ZZ10
    [5] => ZZ2
    [6] => aa
    [7] => bbb
    [8] => c
)
*/

?>

</body>
</html>




Tab키란 무엇인가요? 탭 키의 사용 용도; Tab Key

컴퓨터 키보드 맨 좌측에 Tab 이라는 키가 있습니다. "탭"이라고 읽습니다.

키보드 맨 아래의 가장 길쭉한 키인 "스페이스(Space)"키는 공백 문자를 넣는 키입니다. 즉, 띄어쓰기용입니다.

Tab키는 공백 문자 (스페이스 문자) 8개 분량을 한꺼번에 넣는 키입니다. 실제 공백이 8개 삽입되는 것은 아니고, 눈에 보이지 않는 "탭 문자" 1개가 삽입됩니다. 이 "탭 문자"는 길기 때문에 공백을 많이 삽입한 것처럼 보입니다.

실제 문서 작성에서는 탭 문자가 공백 8개가 아니라, 4개나 3개 또는 2개 분량의 공백으로, 고무줄처럼 늘었다 줄었다 할 수도 있습니다. 왜냐하면 탭 키는 단어들의 앞부분을 가지런하게 자동 정렬하는 기능이 있기 때문입니다. 표 작성에 편리합니다.


또한 공백 넣는 기능 외에도 다른 기능도 있습니다. 윈도우에서의 대화상자 등에서는 탭키를 누르면 대화상자의 다른 요소(버튼 등)로 이동합니다. Shift+Tab키, 즉 Shift(쉬프트)키를 누르면서 Tab키를 누르면 반대 방향으로 이동합니다. 버튼이나 입력창을 마우스로 클릭하지 않아도 되기에 편리한 경우가 있습니다.

그리고 Alt+Tab키를 누르면, 현재 실행 중인 다른 프로그램으로 쉽게 이동할 수 있습니다.




Java 자바] switch문, case문, default문; 스위치 문 사용 예제

판단해야 할 조건이 여러 개 있을 경우, if문을 중복하여 사용하면 소스가 산만해지기에 switch문을 사용합니다.

int 같은 숫자형이나, 또는 char 처럼 '숫자로 변환할 수 있는 자료형'을 조건으로 지정할 수 있습니다.

break문이 없으면, 아래의 조건들까지 모두 실행되어 버리기에 주의가 필요합니다.

어떤 조건에도 맞지 않는 경우에는 default 문이 기본값으로서 실행됩니다. default문이 필요 없다면 없어도 됩니다.

스위치-문 예제 소스


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


    // int형으로 조건 지정
    int i = 365;

    switch (i) {
      case 66    : System.out.println("66 이라는 정수입니다.");
                   break;
      case 365   : System.out.println("365 라는 정수입니다.");
                   break;
      case 1000  : System.out.println("1000 이라는 정수입니다.");
                   break;
      default    : System.out.println("해당 숫자가 없습니다");
                   break;
    }
    // 출력 결과: 365 라는 정수입니다.


    // char 형으로 조건 지정
    char c = 'A';

    switch (c) {
      case 'A'  : System.out.println("'A' 라는 문자입니다."); break;
      case '똠' : System.out.println("'똠' 이라는 문자입니다."); break;
      case '7'  : System.out.println("'7' 이라는 문자입니다."); break;
      default   : System.out.println("해당되는 문자가 없습니다"); break;
    }
    // 출력 결과: 'A' 라는 문자입니다.

  }
}



니콘 디카 화질 좋은 모델은? D200, D100, D80, D40, D40X ? Nikon DSLR

디카 즉 디지털 카메라는 최신형일수록 화질이 좋습니다. 고급형이라고 해서 화질이 좋은 것은 아닙니다. 고급 모델일수록 기계적 특성이 우수하고 전문적인 기능이 풍부할 뿐이지 화질이 좋다고는 말할 수 없습니다. 디카 화상 처리 기술이 하루가 다르게 발전하고 있기 때문입니다.

따라서 최신 모델이 어느 것인가를 살펴 보는 것이 좋습니다.

이 글을 쓰고 있는 현재(2007-05-25) 니콘의 가장 최신 DSLR은 D40X 입니다. D40 역시 최신형이긴 하지만 화소가 610만 화소로 적고, D40X 는 1020만 화소이기에 D40X 가 화질면에서 유리합니다.

일반적인 사용에서는 6백만 화소와 1000만 화소의 차이가 크지 않지만, 사진을 부분적으로 확대해야 하는 경우 즉 크롭(Crop) 작업에는 1000만 화소 이상의 고화소가 절대적으로 유리합니다.

지금 현재 D40... 시리즈의 화질이 가장 우수합니다. 그런데 D40... 시리즈는 화질은 좋지만 저가형 모델이기에 고급 기능이 부족한 단점이 있습니다. 자동 초점 모터가 내장되어 있지 않은 렌즈는 자동 초점이 안되는 제약도 있습니다. 물론 기본적으로 제공되는 번들렌즈들은 자동 초점이 잘 됩니다.


렌즈에 따른 화질 차이는?


유명 메이커의 렌즈라면 다 좋은 화질을 가지고 있기에 렌즈에 따른 화질 차이를 육안으로 식별하기는 어렵습니다. 화질을 우선시하는 경우에는 일반적인 줌렌즈보다는 단초점 렌즈(단렌즈)를 구입하면 됩니다.

다만 카메라 상점에 보면 이름 없는 회사의 "묻지마 렌즈" 같은 것이 좀 있는데 이런 것을 사면 사진이 흐리고 뿌옇게 나오게 됩니다.

여담이지만 칼 짜이스 Carl Zeiss 렌즈를 싸구려 렌즈로 착각하시는 분이 계시더군요. 이것은 독일제인데 세계 최고급 렌즈입니다. 너무 비싸서 보통 사람은 꿈속에서나 가져볼 수 있는 드림 렌즈이기 때문에 대중적으로 알려지지 않아서 무명 메이커로 오인되는 경우가 있습니다. 다만 니콘에 붙일 수 있는 칼 짜이스 렌즈는 일본에서 생산됩니다.

아무리 좋은 렌즈를 붙여도 카메라 본체의, 필름에 해당하는 CCD 또는 CMOS의 성능이 좋지 않으면, 나쁜 화질이 됩니다.


가장 고화질 똑딱이(컴팩트 카메라)는?


컴팩트 카메라는 "니콘 쿨픽스 Coolpix" 시리즈보다는, "캐논 파워샷 PowerShot" 시리즈가 좋습니다. 파워샷은 화질도 좋고 (그렇지만 DSLR보다는 못합니다.) 기능도 DSLR에 버금갈 만큼 풍부합니다. 수동 노출 같은 것도 됩니다.

(2007-12-28 업데이트: 하이엔드 똑딱이인 '니콘 쿨픽스 P5100'은 '캐논 G9'보다도 화질이 더 좋게 느껴졌습니다.)

▶▶ 니콘 D40과, D40X 차이점, Nikon 저가형 DSLR 가격/화질 차이

Thursday, May 24, 2007

포토샵] 니콘 소프트 포커스 필터 효과, 뽀샤시 효과; Nikon Soft-I, II, 1, 2 대체

소프트 필터 중에서 가장 품질이 좋고 널리 쓰이는 것은 "니콘 소프트1 (Nikon Soft-I)"이라는 필터입니다. 52mm 구경도 5만5천원 정도 하는 고가의 필터인데, 심지어 캐논 유저들도 소프트 필터는 대부분 니콘 소프트 필터를 사용합니다.

소프트 필터 즉 소프트 포커스 필터 Soft Focus Filter 는 크게 2가지의 목적으로 사용합니다.


(1) 피사체를 화려하게 꾸미기 위해서 웨딩사진 / 제품 사진 등에서 사용. 약한 소프트 필터가 사용됨.

(2) 피사체를 몽환적으로 만들기 위해 주로 작품 사진에서 사용. 강한 소프트 필터가 사용됨.


"니콘 소프트-1 필터" 는 (1)의 목적에 적합하고, "니콘 소프트-2 필터"는 (2)의 목적에 적합합니다.


그렇지만 진짜 필터를 구입하지 않아도 포토샵으로도 비슷한 효과를 줄 수 있습니다. 일반적으로, 레이어를 중첩시킨 후 아래쪽 레이어에 가우시안 블러를 적용하고, 위쪽 레이어의 불투명도를 낮추는 방법이 사용되는데 이것만으로는 진짜 필터처럼 아름다운 후광 효과가 나지 않습니다. 이 게시물에 있는 방법처럼 좀더 복잡한 작업을 추가해 주어야만 합니다: ▶▶ 포토샵] 소프트 필터 효과, 뽀샤시 효과; Photoshop Soft Focus Filter

그러면 이런 원본 사진이
도시


이렇게 몽환적으로 변환됩니다.
Virtual Nikon Soft-2 Filter
Virtual Nikon Soft-2 Filter

단, 이 사진은 크기가 작기 때문에, 포토샵에서 각종 치수를 절반 정도만 주었습니다.




포토샵] 소프트 필터 효과, 뽀샤시 효과; Photoshop Soft Focus Filter

포토샵으로 "소프트 포커스 필터" 효과를 만드는 방법입니다. 포토샵 7.0을 기준으로 설명합니다. 그리고 아래 예제에서 사용된 각종 치수는, 디카에서 뽑은 대형 원본이 아니고 웹용의 비교적 작은 사진일 경우입니다.

여기에 있는 사진을 원본 사진으로 삼아 소프트 효과를 줍니다:
클릭하면확대
원본 사진
▶▶ [포토샵] 각종 효과와 필터 테스트 / 모니터 색 보정용으로 좋은 사진: Photoshop Calibration Image

그러면 최종적으로 다음과 같은 사진이 만들어집니다. 진짜 유리로 된 소프트 필터만큼 효과가 좋은 방법입니다.
클릭하면확대
소프트 필터

소프트 포커스 필터, 후광 효과 만들기


* 사진 파일을 포토샵으로 불러온 후, 레이어 팔레트에서 "Background" 레이어를 "Create a new layer (새 레이어 만들기)" 아이콘으로 드래그하여 복사본을 만듭니다. "Background copy" 라는 이름의 복사본이 생성됩니다.

* 밑에 깔린 "Background" 레이어를 클릭하여 선택합니다.

* Filter (필터) > Other (기타) > Maximum (최대값) 을 선택. Radius (반지름) 를 5 픽셀 정도로 지정하고 OK 버튼 클릭. 위에 있는 "Background copy" 레이어의 "눈 아이콘"을 OFF 하면 방금 적용한 필터의 효과가 보입니다.

* "Background" 레이어가 선택되어 있는 상태에서, Filter > Blur > Gaussian Blur (가우시안 블러) 를 3 픽셀 정도 적용합니다. Filter > Blur > Motion Blur (모션 블러) 필터를 실행하여, Angle(각도)은 -45도, Distance(거리)는 10픽셀 정도로 적용합니다.

* 이제, 위쪽에 있던 "Background copy" 레이어를 클릭하고, Opacity (불투명도) 를 35% 정도로 지정합니다.

* "Background copy" 레이어를 "Create a new layer (새 레이어 만들기)" 아이콘으로 드래그하여 복사본을 만듭니다. 이제 맨 위에 "Background copy 2" 라는 새 레이어가 있고, 그 밑 중간에 "Background copy" 레이어가 있습니다.

* 중간의 "Background copy" 레이어를 선택하고, Gaussian Blur (가우시안 블러) 필터를 5픽셀 정도 줍니다. Ctrl+L키를 눌러 Level (레벨) 대화상자를 꺼낸 후, 사진을 밝고 콘트라스트가 강하게 조정합니다. 히스토그램 바로 밑의 하얀 삼각형을 좌측으로 당기면 됩니다. / 반면 너무 밝다면 어둡게 조정해야 합니다. 자신의 취향에 맞게...

* 이제 완성되었습니다. History 팔레트에서 "카메라 아이콘"을 눌러 현재 상태를 기억시킨 후, 원본 사진 아이콘과 서로 번갈아 클릭하면서 비교해 봅니다.

* 결과가 마음에 들지 않는다면, 각 레이어의 불투명도를 조정해 봅니다. 사진의 크기가 아주 크거나 아주 작은 경우에는 위의 각종 수치의 값에 2를 곱하거나 2를 나누거나 합니다. 가령 5픽셀은 10픽셀로... 그러나 "마이너스 45도"라는 각도와 불투명도는 그대로 유지해야 합니다.



원본 화질이 좋고, 맑은 날에 촬영되고, 명암차가 분명하고, 하얀 피사체가 직사광선을 받고 있는 부분이 많을수록 효과가 좋아집니다. 그렇지만 위의 예제 사진은 그늘진 장소인데도 효과가 비교적 좋았습니다.



소프트 필터의 다른 예제 사진: ▶▶ 포토샵] 니콘 소프트 포커스 필터 효과, 뽀샤시 효과; Nikon Soft-I, II, 1, 2 대체



니콘 애기번들 줌 렌즈 필터 사이즈, 아빠번들 휠터 구경 크기; Nikon 18-55mm Filter Size

애기번들 즉 "Nikon AF-S DX Zoom Nikkor ED 18-55mm F3.5-5.6G II" 줌 렌즈의 필터 사이즈는 52mm 입니다. 흔히 "52파이"라고 부릅니다.

니콘의 경우는, 렌즈들의 기본적인 필터 사이즈가 대부분 52mm 로 통일되어 있습니다. "50mm F1.4 표준 렌즈 (속칭 쩜사, 또는 50.4로 불림)"를 비롯하여, "28mm F2.8" 이나 "35mm F2" 심지어 "35mm F1.4" 같은 밝은 렌즈도 모두 52mm 입니다.

52mm 필터를 구입하면 여러 렌즈에 두루 사용할 수 있고, 필터 구경이 작기 때문에 필터 값도 상대적으로 저렴합니다.

그렇지만 망원 계열의 대구경 렌즈들은 필터 구경도 62mm, 72mm, 77mm 이렇게 큰 것을 사용해야 합니다.


아빠번들/할배번들 필터 크기


"Nikon AF-S DX Zoom Nikkor ED 18-70mm F3.5-4.5G (IF)" 즉 속칭 아빠번들 줌렌즈의 필터 사이즈는 67mm 입니다. 67파이 필터라면 값도 좀 비싼 편이고, 필터 종류에 따라 물건이 약간 귀한 경우도 있습니다.

"Nikon AF-S DX Zoom Nikkor ED 18-135mm F3.5-5.6G(IF)" 즉 속칭 할배번들도 필터 구경이 67파이입니다.

필터 사이즈로만 본다면 애기번들이 가장 경쟁력이 있습니다.



애기망원 렌즈 필터 구경


"Nikon AF-S DX Zoom Nikkor ED 55-200mm F4-5.6G" 즉 속칭 애기망원 줌 렌즈의 필터 사이즈는 52mm 입니다. VR 붙은 것이든 아니든 52mm 입니다.



아무 필터나 호환이 되나요? 다른 메이커 필터도?


렌즈와 달리, 필터는 직경만 같다면, 어느 회사 제품이든 다 붙일 수 있고 서로 호환성이 있습니다.

여기에 52파이 사이즈의 독일제 B+W 필터가 있는데, 애기번들에 붙이니 잘 장착되었습니다: ▶▶ 슈나이더 UV 필터; Schneider B+W 007 NEUTRAL MRC 52mm 구매기



캐논 렌즈의 일반적인 필터 크기


니콘은 필터 호환성을 높이기 위해서 필터 사이즈를 가급적 52mm 로 통일하려고 노력하지만, 캐논의 경우에는 그렇지 않습니다.

캐논 "50mm F1.4"의 필터 사이즈는 58mm 이고, "50mm F1.8 렌즈"의 필터 구경은 52mm이고, "50mm F1.2"는 72mm 더군요.

니콘의 경우는 "50mm F1.2" 렌즈도 필터 사이즈는 여전히 52mm 입니다.


Wednesday, May 23, 2007

C언어] YYYY-MM-DD hh:mm:ss 현재 날짜 시간 타임 스탬프 출력; ISO Time Stamp

현재 날짜와 시간을 "2007-05-22 15:45:50" 이렇게 세계 표준 형식으로 출력합니다. 예전에도 이런 소스를 올렸는데 그것은 비주얼C 2003용이고, 이것은 비주얼C 2005 와 그 이상에서 작동합니다.

YY-MM-DD hh:mm:ss 형식으로 시간 출력 함수 예제


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

void getISOTime(char* buffer, size_t bufferSize);


int main(void) {
  char buf[80];

  getISOTime(buf, sizeof(buf));
  printf("%s\n", buf);

  return 0;
}




void getISOTime(char* buffer, size_t bufferSize) {
  struct tm t;
  time_t timer;

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


  sprintf_s(buffer, bufferSize, "%04d-%02d-%02d %02d:%02d:%02d",
              t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
              t.tm_hour, t.tm_min, t.tm_sec
          );
}



위의 소스를 컴파일하면 현재 날짜와 시간이
2007-05-22 15:45:50
이런 형식으로 출력됩니다.


비주얼C 2003 과 그 이하에서 작동하는 소스: ▶▶ C언어] 현재 날짜 시간, 년월일 시분초 로 출력 함수; Time To String Function VC++

▶▶ C언어] 올해 연도(년도) 4자리, 2자리로 구하기/출력; Current Year Format; YYYY, YY

한글 수식 입력기 기초 사용법: 수학 공식 입력/편집기; 아래아한글 2005; HWP Equation Input

"아래아한글 2005" 즉, "HWP 워드프로세서"에서 수식 입력을 하는 방법입니다. 아래아한글 상단 메뉴에서

입력 > 개체 > 수식

을 선택하면, 아래 그림과 같이, 수식 입력기가 실행됩니다. "한글 수식 편집"이라는 제목의 창입니다. 별도로 설치해 주지 않아도 기본적으로 설치되어 있습니다.

클릭또는옆으로스크롤가능
수식 입력기


제곱(위 첨자) 입력: 보라색 화살표가 가리키는 아이콘을 누르면 나오는 작은 네모에 제곱의 지수를 써넣고 키보드의 Tab키 또는 "좌/우 화살표키"를 누릅니다.

루트 기호, 근호 (제곱근) 입력: 초록색 화살표가 가리키는 아이콘을 누릅니다.

분수 입력: 빨간 화살표가 가리키는 아이콘을 누릅니다. 상하의 작은 칸에 분자와 분모를 넣고, 키보드의 Tab키 또는 "좌/우 화살표키"를 누릅니다.

파이 기호 입력: 청록색 화살표가 가리키는 아이콘을 누르면 목록이 나오고, 그 속에서 소문자 파이 등의 그리스 문자를 선택하여 입력할 수 있습니다. 그리스 문자가 아닌 a, b, x, y, e 등의 로마자 알파벳은 키보드의 키를 누르면 됩니다.

크기 지정 : 위의 그림에서 10 이라고 된 창을 클릭하면 수식의 크기를 지정할 수 있습니다.



문서에 수식 삽입하기 : 노란색 화살표가 가리키는 아이콘을 누르면 한글문서에 수식이 삽입됩니다.

수식 다시 편집 : 문서에 삽입되어 있는 수식을, 마우스로 더블클릭하면 수식 입력기(수식 편집기)가 다시 실행되어 수식을 편집할 수 있습니다.




MS워드의 수식 입력기 사용법: ▶▶ 수식입력기] 분수,루트 기호 입력 방법, 워드 Word 엑셀 Excel; MS Equation Input Fraction



한영 키보드에서 가장 많이 쓰이는 키, 키보드 스킨의 '마모도'로서 측정(?) - SAMSUNG Keyboard

90년대 초부터 "세진 키보드"를 사용했습니다. 세진 키보드는 튼튼하고 좋았지만 자판 두드리는 소리가 너무 커서, 10년쯤 쓰다가, LG 키보드로 바꾸었는데 키 1~2개가 접점 불량이고 해서, 삼성 키보드를 다시 구입했습니다. 삼성 키보드는 접점 불량도 없고, 키보드 두드리는 소리도 작은 편이라 현재까지 계속 사용해 왔습니다. 한 7년쯤 쓴 것 같습니다.

며칠 전에 보니 키보드 스킨이 닳아서 구멍이 나 있었습니다. 가장 많이 쓴 키가 있는 곳에 구멍이 났겠지요.


랭킹 1위: 가장 많이 사용한 키는, "아래쪽 화살표 키"였습니다. 아래쪽 화살표키의 우측 하단 모서리 부분이 완전히 너덜너덜해져 있었습니다. 문서를 스크롤하면서 읽느라고 그랬던 것 같습니다.

랭킹 2위: "S키" 즉 "니은(ㄴ)키"였습니다. S키의 우측 변이 마모되어 가늘게 찢어져 있었습니다. 반면 다른 자모 키들은 멀쩡했습니다. 처음에는 왜 S키만 유독 닳아 있는지 이유를 몰랐는데, 한글에서 니은이 가장 많이 쓰이는 자모인가도 생각해 보았습니다. 결국 문서 저장 핫키인 "Ctrl+S키" 때문이라는 결론을 내렸습니다. 제가 한 문장 쓰고 나서 꼭 "Ctrl+S키"로 저장을 하기 때문에... 그러나 Ctrl 쪽 스킨은 이상이 없었습니다.

랭킹 3위: "Delete키"의 우측 하단 모서리가 닳아서 가늘게 찢어져 있었습니다.

랭킹 4위: "Alt키"의 하변이 약간 닳아서 구멍이 나기 몇 보 직전이었습니다.


구멍이 난 스킨에 스카치 테이프를 발라주었더니 계속 쓸 만했습니다. 키보드명은 "삼성키보드 SEM-DT35"입니다. 이것에 맞는 스킨을 따로 팔고 있긴 했는데, 귀찮아서, 키보드 자체가 다 망가질 때까지 계속 사용할 예정입니다.

▶▶ 키보드 스킨 별도 구입; 삼성 키보드 키스킨, SAMSUNG Keyboard Skin

Tuesday, May 22, 2007

C언어] sprintf_s 함수 사용법: 비주얼 Visual C 2005 이상에서

포맷 출력을 화면이 아닌 문자열로 저장할 때에는 sprintf() 함수를 사용합니다. 그런데 비주얼C 2005 버전에서는 보안이 강화된 sprintf_s() 함수를 사용하는 것이 좋습니다. 그렇지 않으면 컴파일러 설정에 따라, 다음과 같은 경고가 나올 수 있습니다.

sprintf_s.cpp(8) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. D:\Program Files\Microsoft Visual Studio\VC\include\stdio.h(345) : see declaration of 'sprintf'


sprintf_s 함수의 2번째 파라미터에 문자열 버퍼 크기를 지정해 주면 됩니다. 달라진 점은 그것뿐입니다. 다음 예제에서는 sizeof 연산자로 버퍼 크기를 자동으로 지정합니다.

보안 강화된 sprintf_s 함수 사용 예제


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


int main(void) {
  char buf[80]; // 문자열이 저장될 버퍼


  float num = 1.234f;
  sprintf_s(buf, sizeof(buf), "문자 = %0.3f\n", num);

  printf("%s\n", buf);
  // 출력 결과: 문자 = 1.234


  return 0;
}





정태영님께서 지적해 주신 대로, 이번에는 상수를 사용하여 버퍼 크기를 직접 지정하였습니다.

#include <stdio.h>

#define BUF_SIZE 80

int main(void) {
  char buf[BUF_SIZE]; // 문자열이 저장될 버퍼

  float num = 1.234f;
  sprintf_s(buf, BUF_SIZE, "문자 = %0.3f\n", num);

  printf("%s\n", buf);
  // 출력 결과: 문자 = 1.234


  return 0;
}



C언어] localtime_s 함수 사용법: 비주얼 Visual C 2005 이상에서

localtime 이라는 함수로 현재 시각을 구할 수 있지만, 비주얼C 2005 이상의 버전에서는 보안이 강화된 localtime_s 라는 함수를 사용합니다. 그렇지 않으면
localtime_s.cpp(11) : warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. D:\Program Files\Microsoft Visual Studio\VC\include\time.inl(114) : see declaration of 'localtime'


이런 워닝(경고)이 나올 수 있습니다. localtime_s 는 localtime 함수와 사용법이 좀 다른데 다음 예제처럼 하면 됩니다.

localtime_s 함수로 현재 날짜 시간 출력 예제 소스


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


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

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


  printf("유닉스 타임 (Unix Time): %d 초\n\n", timer); // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초

  printf("현재 년: %d\n",   t.tm_year + 1900);
  printf("현재 월: %d\n",   t.tm_mon + 1);
  printf("현재 일: %d\n\n", t.tm_mday);

  printf("현재 시: %d\n",   t.tm_hour);
  printf("현재 분: %d\n",   t.tm_min);
  printf("현재 초: %d\n\n", t.tm_sec);

  printf("현재 요일: %d\n", t.tm_wday); // 일요일=0, 월요일=1, 화요일=2, 수요일=3, 목요일=4, 금요일=5, 토요일=6
  printf("올해 몇 번째 날: %d\n", t.tm_yday); // 1월 1일은 0, 1월 2일은 1
  printf("서머타임 적용 여부: %d\n", t.tm_isdst); // 0 이면 서머타임 없음

  return 0;
}



비주얼C 2005의 cl.exe 로 컴파일한 화면:
D:\Z>cl localtime_s.cpp && localtime_s.exe
localtime_s.cpp
유닉스 타임 (Unix Time): 1179811989 초

현재 년: 2007
현재 월: 5
현재 일: 22

현재 시: 14
현재 분: 33
현재 초: 9

현재 요일: 2
올해 몇 번째 날: 141
서머타임 적용 여부: 0

D:\Z>


위의 소스는 비주얼C 2003 과 그 이하 버전에서는 컴파일되지 않습니다. 2003용 소스는 여기에: ▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수(오늘 날짜 시간): Current Date, Time

C언어] 세계 시간 시계, 타임존/시차 계산; World-Time Timezone

외국 도시의 현재 시각을 구하는 C소스입니다. 리얼타임 시계는 아니고, 실행할 때마다 갱신됩니다.

getWorldTime() 함수에 시차를 넣어주고, 결과가 저장될 문자열 버퍼 이름과 크기를 지정해 주면 됩니다.

한국과의 시차가 아니라, 세계표준시와의 시차입니다. 가령 미국 서부 LA는 겨울 빼고는 "태평양 표준시 PDT" 가 적용되는데, PDT는 세계표준시에서 즉 그리니치 천문대가 있는 곳에서 "마이너스 7시간"을 해주어야 합니다. 함수에 -7을 입력하면 됩니다.

다음 소스는 비주얼C 2005에서 만들어진 것이고, 비주얼C 2003 이하에서는 수정이 필요합니다.

외국 도시 시차 계산, 현재 시각 구하기 예제 소스


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

// 한국 시간은 UTC +9 이므로
#define CURRENT_TIMEZONE_OFFSET +9

void getWorldTime(int tzOffset, char* buffer, size_t bufferSize);


int main(void) {
  char buf[80];

  getWorldTime(+9, buf, sizeof(buf));
  printf("KST (한국 표준시)       : %s\n\n", buf);

  getWorldTime(-8, buf, sizeof(buf));
  printf("PST (태평양 표준시)     : %s\n",   buf);
  getWorldTime(-7, buf, sizeof(buf));
  printf("PDT (태평양 표준시 DST) : %s\n\n", buf);

  getWorldTime(-5, buf, sizeof(buf));
  printf("EST (뉴욕 시간)         : %s\n",   buf);
  getWorldTime(-4, buf, sizeof(buf));
  printf("EDT (뉴욕 시간 DST)     : %s\n\n", buf);

  getWorldTime(+1, buf, sizeof(buf));
  printf("CET (파리 시간)         : %s\n",   buf);
  getWorldTime(+2, buf, sizeof(buf));
  printf("CEST (파리 시간 DST)    : %s\n\n", buf);

  getWorldTime(+8, buf, sizeof(buf));
  printf("CST (중국 표준시)       : %s\n\n", buf);

  getWorldTime(0, buf, sizeof(buf));
  printf("UTC (세계 표준시)       : %s\n\n", buf);


  return 0;
}




// 비주얼 C++ 2005 에서 작동
void getWorldTime(int tzOffset, char* buffer, size_t bufferSize) {
  time_t timer;
  struct tm t;

  timer = time(NULL); // 현재 시각을 초 단위로 얻기
  timer -= CURRENT_TIMEZONE_OFFSET * 3600;
  timer += tzOffset * 3600;

  localtime_s(&t, &timer); // 초 단위의 시간을 분리하여 구조체에 넣기


  sprintf_s(buffer, bufferSize, "%04d-%02d-%02d %02d:%02d:%02d",
                                 t.tm_year + 1900,
                                 t.tm_mon + 1,
                                 t.tm_mday,
                                 t.tm_hour,
                                 t.tm_min,
                                 t.tm_sec);

}



실행 결과 화면:
D:\Z>cl wt.cpp && wt.exe
wt.cpp
KST (한국 표준시)       : 2007-05-22 13:53:28

PST (태평양 표준시)     : 2007-05-21 20:53:28
PDT (태평양 표준시 DST) : 2007-05-21 21:53:28

EST (뉴욕 시간)         : 2007-05-21 23:53:28
EDT (뉴욕 시간 DST)     : 2007-05-22 00:53:28

CET (파리 시간)         : 2007-05-22 05:53:28
CEST (파리 시간 DST)    : 2007-05-22 06:53:28

CST (중국 표준시)       : 2007-05-22 12:53:28

UTC (세계 표준시)       : 2007-05-22 04:53:28

D:\Z>



▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수(오늘 날짜 시간): Current Date, Time

Perl 펄] 세계 시간 시계, 타임존/시차 계산; World-Time Timezone

펄에서 외국 도시의 현재 시각을 구하는 방법입니다. CPAN 모듈이 있긴 하지만 사용법이 너무 복잡해서 간단한 것을 직접 만들었습니다. 펄에서 이런 함수를 기본적으로 제공하지 않기에, 시차를 직접 계산해야 합니다.

아래의 getWorldTime 함수에 시차를 넣어주면 됩니다. 외국도시와 한국의 시차가 아니라, "외국 도시의 시간과 세계표준시 사이의 시차"입니다.

미국 서부의 LA는 겨울에는 "태평양 표준시 PST"를 사용하고, 그 외의 계절에는 서머타임이 적용되어 "태평양 표준시 PDT"를 사용합니다. 이 글을 쓰고 있는 지금 현재(2007-05-22) 미국 서부는 PDT가 적용되고 있습니다.

PST 는 세계표준시에서 8시간을 마이너스해야 하고, PDT는 마이너스 7을 해야 합니다. 함수 안에 이 시차를 넣어주면 됩니다.

외국 현재 시각 구하기 예제 소스


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


  printf("KST (한국 표준시)       : %s\n\n", getWorldTime(+9));

  printf("PST (태평양 표준시)     : %s\n",   getWorldTime(-8));
  printf("PDT (태평양 표준시 DST) : %s\n\n", getWorldTime(-7));

  printf("EST (뉴욕 시간)         : %s\n",   getWorldTime(-5));
  printf("EDT (뉴욕 시간 DST)     : %s\n\n", getWorldTime(-4));

  printf("CET (파리 시간)         : %s\n",   getWorldTime(+1));
  printf("CEST (파리 시간 DST)    : %s\n\n", getWorldTime(+2));

  printf("CST (중국 표준시)       : %s\n\n", getWorldTime(+8));

  printf("UTC (세계 표준시)       : %s\n\n", getWorldTime(0));



sub getWorldTime { # 24시간제
  my $now = time + ($_[0] * 3600);

  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($now);

  sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec);
}



실행 결과 화면:
D:\Z>example.pl
KST (한국 표준시)       : 2007-05-22 11:45:43

PST (태평양 표준시)     : 2007-05-21 18:45:43
PDT (태평양 표준시 DST) : 2007-05-21 19:45:43

EST (뉴욕 시간)         : 2007-05-21 21:45:43
EDT (뉴욕 시간 DST)     : 2007-05-21 22:45:43

CET (파리 시간)         : 2007-05-22 03:45:43
CEST (파리 시간 DST)    : 2007-05-22 04:45:43

CST (중국 표준시)       : 2007-05-22 10:45:43

UTC (세계 표준시)       : 2007-05-22 02:45:43


D:\Z>



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

캐논 렌즈를 니콘 디카(DSLR) 마운트에 붙일 수 있나요? 렌즈 호환; Canon Nikon Lens

메이커가 다르면 렌즈들이 호환이 되지 않기에 불가능합니다. DSLR / SLR 카메라의 바디에서, 렌즈를 붙이는 마운트 부분의 모양이 각 회사마다 다르기에 서로 호환성이 없습니다. (아래의 업데이트 참고)

심지어 같은 회사의 렌즈라고 해도 호환이 안되어 붙일 수 없는 경우가 있습니다. 80년대에 생산된 캐논 구형 렌즈는 요즘의 캐논EOS 같은 카메라에 붙일 수 없습니다. 마운트 모양이 다르기 때문입니다.

니콘은 마운트 모양이 모두 똑같기에 이론적으로 모든 니콘 렌즈 (니코르 렌즈) 를 니콘 카메라에 붙일 수 있습니다. 그러나 DSLR 전용 렌즈 즉 "DX 포맷 렌즈 (가령 애기번들/아빠번들 같은 것)"를 일반 필카(필름 카메라)에 붙이면, 화면 주위가 어두워지기에 사용이 사실상 불가능합니다. 물론 필카용 니콘 렌즈를 최신 니콘 DSLR에 붙일 수는 있습니다. 다만 이 경우에는 자동 노출이나 자동 초점이 되지 않는 경우가 많을 것입니다.


시그마, 토키나, 탐론 같은 제삼사 렌즈도 호환성이 없나요?


가령 펜탁스용으로 만들어진 시그마 렌즈를 캐논에 붙인다든지 하는 것은 불가능합니다. 구입할 때 "캐논 마운트"라는 것을 확인해야 합니다. 니콘 바디에 붙일 렌즈면 "니콘 마운트"용을 구입해야 합니다.




업데이트: 캐논 카메라에 니콘 렌즈를 붙일 수 있는 어댑터는 있습니다.

"Kindai 렌즈변환어댑터 캐논EOS바디-니콘F렌즈"라는 것인데, 필름나라에서 팔고 있더군요. 가격은 148000 원으로 상당히 비쌌습니다. 제가 사용해 본 적이 없어서 성능이 어떨지 모르겠습니다.

니콘 카메라에 캐논 렌즈를 붙이는 어댑터는 없었고, 펜탁스645 렌즈를 붙이는 것은 있었는데, 펜탁스645 렌즈는 중형 카메라 렌즈입니다. 일반 펜탁스 렌즈를 안 될 것입니다.


Monday, May 21, 2007

자바스크립트] 세계 시간 구하기, 타임존 설정; JavaScript World-Time Timezone

자바스크립트로 전세계의 현재 시각을 구하는 소스입니다. 리얼타임은 아니고 F5키를 눌러야 갱신됩니다. 최소한의 간단한 소스입니다.

아래 소스에서 DST 는 서머타임 즉 일광절약 시간을 의미합니다.

JavaScript: 외국 현재 시각 구하기 예제 소스


파일명: example.html
<script type="text/javascript">

document.write('KST (한국 표준시):<br />',       getWorldTime(+9), '<br /><br />');

document.write('PST (태평양 표준시):<br />',     getWorldTime(-8), '<br /><br />');
document.write('PDT (태평양 표준시 DST):<br />', getWorldTime(-7), '<br /><br />');

document.write('EST (뉴욕 시간):<br />',         getWorldTime(-5), '<br /><br />');
document.write('EDT (뉴욕 시간 DST):<br />',     getWorldTime(-4), '<br /><br />');

document.write('CET (파리 시간):<br />',         getWorldTime(+1), '<br /><br />');
document.write('CEST (파리 시간 DST):<br />',    getWorldTime(+2), '<br /><br />');

document.write('CST (중국 표준시):<br />',       getWorldTime(+8), '<br /><br />');

document.write('UTC (세계 표준시):<br />',       getWorldTime(0),  '<br /><br />');




function getWorldTime(tzOffset) { // 24시간제
  var now = new Date();
  var tz = now.getTime() + (now.getTimezoneOffset() * 60000) + (tzOffset * 3600000);
  now.setTime(tz);


  var s =
    leadingZeros(now.getFullYear(), 4) + '-' +
    leadingZeros(now.getMonth() + 1, 2) + '-' +
    leadingZeros(now.getDate(), 2) + ' ' +

    leadingZeros(now.getHours(), 2) + ':' +
    leadingZeros(now.getMinutes(), 2) + ':' +
    leadingZeros(now.getSeconds(), 2);

  return s;
}


function leadingZeros(n, digits) {
  var zero = '';
  n = n.toString();

  if (n.length < digits) {
    for (i = 0; i < digits - n.length; i++)
      zero += '0';
  }
  return zero + n;
}

</script>


위의 소스를 파일로 저장한 후, 브라우저로 보면 현재 세계 시각이 다음과 같은 식으로 나옵니다.

KST (한국 표준시):
2007-05-21 16:15:27

PST (태평양 표준시):
2007-05-20 23:15:27

PDT (태평양 표준시 DST):
2007-05-21 00:15:27

EST (뉴욕 시간):
2007-05-21 02:15:27

EDT (뉴욕 시간 DST):
2007-05-21 03:15:27

CET (파리 시간):
2007-05-21 08:15:27

CEST (파리 시간 DST):
2007-05-21 09:15:27

CST (중국 표준시):
2007-05-21 15:15:27

UTC (세계 표준시):
2007-05-21 07:15:27



▶▶ 자바스크립트, 리얼타임 시계 만들기, 1초마다 자동 갱신; JavaScript Real-time Clock

자바스크립트, 리얼타임 시계 만들기, 1초마다 자동 갱신; JavaScript Real-time Clock

현재 날짜와 시각이 자동으로 1초 단위로 바뀌는 자바스크립트 시계입니다. 브라우저의 F5키를 눌러 웹페이지를 갱신하지 않아도 리얼타임(실시간;Real-time)으로 변경됩니다.

JavaScript: 실시간으로 업데이트되는 시계


소스 파일명: example.html
<html>
<head>
<title>자바스크립트: 리얼타임 시계</title>
<script type="text/javascript">

function realtimeClock() {
  document.rtcForm.rtcInput.value = getTimeStamp();
  setTimeout("realtimeClock()", 1000);
}


function getTimeStamp() { // 24시간제
  var d = new Date();

  var s =
    leadingZeros(d.getFullYear(), 4) + '-' +
    leadingZeros(d.getMonth() + 1, 2) + '-' +
    leadingZeros(d.getDate(), 2) + ' ' +

    leadingZeros(d.getHours(), 2) + ':' +
    leadingZeros(d.getMinutes(), 2) + ':' +
    leadingZeros(d.getSeconds(), 2);

  return s;
}


function leadingZeros(n, digits) {
  var zero = '';
  n = n.toString();

  if (n.length < digits) {
    for (i = 0; i < digits - n.length; i++)
      zero += '0';
  }
  return zero + n;
}

</script>
</head>


<body onload="realtimeClock()">

<form name="rtcForm">
<input type="text" name="rtcInput" size="20" readonly="readonly" />
</form>


</body>
</html>


위의 예제 소스를 example.html 이라는 파일로 저장한 후, 브라우저로 열어서 보면, 읽기전용 입력 상자 안에

2007-05-21 13:47:35

이런 식으로 현재 날짜/시간이 표시되고, 1초 단위로 저절로 갱신됩니다.


body 태그에 onload 속성을 지정해야 하기에, 블로그의 경우 특정 포스트에만 리얼타임 시계를 표시하는 것은 잘 안됩니다.


▶▶ 자바스크립트] 오늘 날짜 시간 구하기, 년월일/시분초 출력; Date Time Print JavaScript

니콘 DSLR] D40X, D40 미러업 촬영, CCD 클리닝 미러락업 기능 있나요? Mup, Mirror Lock-up

Nikon D40X 에는 CCD 클리닝용 미러락업(Mirror Lock-up) 기능은 있지만, 미러 쇼크를 방지하는 미러업(Mirror-up; M-up) 촬영 기능은 없습니다. 저가형이라서 그런 고급 기능이 있을 리가 없겠지요. Nikon D40 기종도 마찬가지일 것입니다.

미러업 촬영 기능이 있는 카메라는 제가 확인한 바로는 다음과 같습니다:

* Nikon D2XS
* Nikon D2HS
* Nikon D200
* Nikon D80

미러업도 종류가 있는데, 예전 기계식 카메라는 버튼으로 무조건 미러를 올릴 수 있었습니다. 요즘 고급형 DSLR은 셔터 버튼을 누르면 미러가 올라가고 0.4초 정도 시간이 지난 후, 미러 진동이 사라지면 셔터가 작동하는 촬영 모드나, 셔터를 한번 누르면 미러가 올라가고 한번 더 누르면 촬영되는 모드가 있습니다.

D70, D50 등에는 미러업 촬영 기능이 없었습니다.


야경 촬영에는 미러업 기능이 절실히 필요한데 안타까웠습니다.

장시간 노출시, 렌즈 앞을 검은 종이 같은 것으로 가리고, 30초 노출이나 B셔터로 셔터막을 연 후, 검은 종이를 떼어서 수동으로 노출을 주는 편법을 사용하면 어느 정도 미러업 효과가 가능할 것입니다.





D40 에는 청소용 미러락업 기능이 있고 D50에는 없습니다.

고급 기종이라도 청소용 미러락업 기능이 없거나, 별도의 장치가 있어야 하는 경우가 있습니다.

Perl 펄] 스와치 시계의 인터넷 타임(Swatch Internet Time) 구하기

스와치 인터넷 타임(Swatch Internet Time) 이라는 시간 체계가 있는데, 펄에서 현재의 인터넷 시간을 구하는 함수입니다.

날짜 부분 처리는 없고, 시간만 간단하게 나옵니다. 그냥 재미로 만들어 본 것입니다.

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


  print getSwatchTime(), "\n";
  # 한국시간으로 "2007-05-21 12:38 오후"는
  # 스와치 인터넷 시간으로 "@193" 입니다.




sub getSwatchTime {
  return sprintf("@%d",
                      ((time + 3600) % 86400) / 86.4
                 );
}


자세한 내용은 여기: ▶▶ PHP, 스와치 시계의 인터넷 타임(Swatch Internet Time) 구하기


<< Home

Categories
Some Recent Posts
Monthly Archives
Top