'전체'에 해당되는 글 82건
- 2009/10/16 결혼합니다~~~
- 2009/10/16 RGB to YUV 색공간 변경
- 2009/09/26 썬팅할시 참고하세요~~
- 2009/08/04 wav 파일로 녹음하기
- 2009/07/14 Javascript 팁
- 2009/07/08 2009 제 6회 자라섬 국제 재즈페스티벌
- 2009/05/07 시푸드 뷔페 ‘대장 메뉴’ 알고 가야 본전 뽑는다
- 2009/04/25 모악서예대전 신청서
- 2009/01/19 How do I get a list of network interfaces and their IP and MAC addresses?
- 2008/11/28 컴퓨터끼리 네트웍속도 측정툴 Iperf (1)
|
RGB to YUV 색공간 변경
2008/12/19 18:21
|
RGB에서 YUV로, YUV에서 RGB로 변환할 때 어떤 문제가 발생하는지 수식화 해봤습니다.
변환 공식은 아래 공식을 이용했고(ITU-R BT.601), 8bit 색 깊이로 계산하였습니다.
RGB to YUV Conversion
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
U(Cb) = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
V(Cr) = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
YUV to RGB Conversion
R = 1.164(Y - 16) + 1.596(V - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
B = 1.164(Y - 16) + 2.018(U - 128)
표1> 이론상 가장 이상적인 색 변환표입니다. RGB - YUV - RGB 변환이 완벽하게 이루어집니다.
|
R |
G |
B |
|
Y |
U |
V |
|
R |
G |
B | |
|
Black |
0 |
0 |
0 |
|
16 |
128 |
128 |
|
0 |
0 |
0 |
|
White |
255 |
255 |
255 |
|
235 |
128 |
128 |
|
255 |
255 |
255 |
|
Yellow |
255 |
255 |
0 |
|
210 |
16 |
146 |
|
255 |
255 |
0 |
|
Cyan |
0 |
255 |
255 |
|
170 |
166 |
16 |
|
0 |
255 |
255 |
|
Green |
0 |
255 |
0 |
|
145 |
54 |
34 |
|
0 |
255 |
0 |
|
Magenta |
255 |
0 |
255 |
|
107 |
202 |
222 |
|
255 |
0 |
255 |
|
Red |
255 |
0 |
0 |
|
82 |
90 |
240 |
|
255 |
0 |
0 |
|
Blue |
0 |
0 |
255 |
41 |
240 |
110 |
|
0 |
0 |
255 |
표2> 위의 이상적인 변환 표를 만들기 위해서는 아래와 같이 소숫점에 대한 정보를 계속 가지고 있어야 합니다.
|
R |
G |
B |
|
Y |
U |
V |
|
R |
G |
B | |
|
Black |
0 |
0 |
0 |
|
16 |
128 |
128 |
|
0 |
0 |
0 |
|
White |
255 |
255 |
255 |
|
235.045 |
128 |
128 |
|
254.968 |
254.968 |
254.968 |
|
Yellow |
255 |
255 |
0 |
|
210.055 |
16.055 |
146.105 |
|
254.776 |
254.931 |
-0.025 |
|
Cyan |
0 |
255 |
255 |
|
169.51 |
165.74 |
16.055 |
|
0.02142 |
254.941 |
254.845 |
|
Green |
0 |
255 |
0 |
|
144.52 |
53.795 |
34.16 |
|
-0.1714 |
254.903 |
-0.1484 |
|
Magenta |
255 |
0 |
255 |
|
106.525 |
202.21 |
221.84 |
|
255.14 |
0.06502 |
255.117 |
|
Red |
255 |
0 |
0 |
|
81.535 |
90.26 |
239.945 |
|
254.947 |
0.0278 |
0.12342 |
|
Blue |
0 |
0 |
255 |
|
40.99 |
239.95 |
109.895 |
|
0.19278 |
0.03723 |
254.993 |
표3> 다음 예는, 소숫점을 반올림 처리하고 그 결과로 다시 변환한 표입니다. 최종 RGB로 변환한 결과에서 +1씩 오차값이 발생합니다.
|
R |
G |
B |
|
Y |
U |
V |
|
R |
G |
B | |
|
Black |
0 |
0 |
0 |
|
16 |
128 |
128 |
|
0 |
0 |
0 |
|
White |
255 |
255 |
255 |
|
235 |
128 |
128 |
|
255 |
255 |
255 |
|
Yellow |
255 |
255 |
0 |
|
210 |
16 |
146 |
|
255 |
255 |
0 |
|
Cyan |
0 |
255 |
255 |
|
170 |
166 |
16 |
|
1 |
255 |
256 |
|
Green |
0 |
255 |
0 |
|
145 |
54 |
34 |
|
0 |
256 |
1 |
|
Magenta |
255 |
0 |
255 |
|
107 |
202 |
222 |
|
256 |
1 |
255 |
|
Red |
255 |
0 |
0 |
|
82 |
90 |
240 |
|
256 |
1 |
0 |
|
Blue |
0 |
0 |
255 |
|
41 |
240 |
110 |
|
0 |
0 |
255 |
표4> 아래 예는, 소숫점 없이 YUV에서 RGB로 변환하고, 다시 YUV로 변환한 결과입니다.
이것은 통상 캠코더(YUV)에서 NLE(RGB)를 거처 최종 동영상 파일을 인코딩(YUV) 했을때를 가상해본 시나리오입니다.
Magenta 변환시 최종 YUV에서 오차가 발생합니다.
|
Y |
U |
V |
|
R |
G |
B |
|
Y |
U |
V | |
|
Black |
16 |
128 |
128 |
|
0 |
0 |
0 |
|
16 |
128 |
128 |
|
White |
235 |
128 |
128 |
|
255 |
255 |
255 |
|
235 |
128 |
128 |
|
Yellow |
210 |
16 |
146 |
|
255 |
255 |
0 |
|
210 |
16 |
146 |
|
Cyan |
170 |
166 |
16 |
|
1 |
255 |
255 |
|
170 |
166 |
16 |
|
Green |
145 |
54 |
34 |
|
0 |
255 |
1 |
|
145 |
54 |
34 |
|
Magenta |
107 |
202 |
222 |
|
255 |
1 |
255 |
|
107 |
202 |
221 |
|
Red |
82 |
90 |
240 |
|
255 |
1 |
0 |
|
82 |
90 |
240 |
|
Blue |
41 |
240 |
110 |
|
0 |
0 |
255 |
|
41 |
240 |
110 |
결론
캠코더는 CCD/COMS에서 빛을 받아 전기적 신호로 변환할 때는 RGB 신호를 사용합니다. 쉬운 예로 3CCD 캠코더는 프리즘을 통해 RGB 3개의 CCD에 각각 신호를 분리해서 받습니다. 이 신호는 채널당 10~14bit 까지 처리합니다. 이후 DSP를 통해 감마와 화이트발란스 등을 잡고, 최종 테잎이나 메모리에 저장할 때는 YUV 신호로 저장합니다. 이렇게 저장할 때까지만 해도 색공간의 오차는 거의(?) 발생하지 않는다고 볼 수도 있습니다. 그러나, 이렇게 캠코더에서 저장된 YUV 동영상 파일(대부분의 동영상 파일들이 YUV를 사용하고 있음)을 YUV 색공간을 사용하는 편집 프로그램이 아닌, RGB 색공간을 사용하는 편집 프로그램 (예로, 애프터이팩트, 컴버스쳔 등)으로 작업하여 다시 YUV 코덱으로 저장하게 되면 바로 위와 같은 문제가 발생할 가능성이 있다는 것입니다.
이 쯤에서 고민해봐야 할 것은 RGB 색공간을 사용하는 NLE에서 색공간을 변환시킬 때, 소숫점 정보를 끝까지 가지고 가는지, 아니면 변환 후 버리게 되는지가 관건이 될겁니다. 소숫점 정보를 끝까지 가지고 간다면 맨 처음 보였던 표1과 같은 이상적인 화면을 얻을 수도 있을 겁니다.
[출처] RGB to YUV 색공간 변경|작성자 으랏차
'공부 이야기 > 컴퓨터 몽땅' 카테고리의 다른 글
| RGB to YUV 색공간 변경 (0) | 2009/10/16 |
|---|---|
| wav 파일로 녹음하기 (0) | 2009/08/04 |
| Javascript 팁 (0) | 2009/07/14 |
| How do I get a list of network interfaces and their IP and MAC addresses? (0) | 2009/01/19 |
| 컴퓨터끼리 네트웍속도 측정툴 Iperf (1) | 2008/11/28 |
| *윈도우 XP 정품인증 받기* (1) | 2008/10/20 |
|
제조사 |
제품명 |
가시광선 |
반사율 |
자외선차단 |
열차단 |
가격 |
|
브이텍 |
icool |
53 |
10 |
99 |
40 |
12만원 |
|
글라스 틴트 |
ST75MIST |
75 |
8 |
99 |
71 |
23만원 |
|
ST65MIST |
65 |
8 |
99 |
79 |
23만원 | |
|
3M |
CS50 |
51 |
41 |
99 |
33 |
17만원 |
|
WS50 |
50 |
40 |
99 |
38 |
22만원 | |
|
CM60 |
60 |
35 |
99 |
65 |
29만원 | |
|
루마 |
원쿨78 |
78 |
9 |
99 |
45 |
25만원 |
|
원쿨75 |
73 |
9 |
99 |
50 |
22만원 |
출처 : FALINUX wav 파일로 녹음하기
그러다 보니 역시 부족한 부분과 잘못된 부분이 있을 것으로 생각됩니다. 혹 틀린 부분이나 부족한 부분이 있더라도 양해를 부탁드리며 그냥 지나치지 마시고 지적해주시고 알려 주시면 감사하겠습니다.
Wave 파일로 저장하기 위해 다시 한번 Wave 파일의 포맷을 보시겠습니다.
| 필드 이름 | 필드 값 | 크기 (bytes) |
| Chunk ID | 'RIFF' | 4 |
| Chunk size | 4 | |
| Format | 'WAVE' | 4 |
| SubChunk 1 ID | 'fmt ' | 4 |
| SubChunk 1 Size | 4 | |
| Audio Format | 1 | 2 |
| Num Channels | 2 | |
| Sample Rate | 4 | |
| Byte Rate | 4 | |
| Block Align | 2 | |
| Bits Per Sample | 2 | |
| SubChunk 2 ID | 'data' | 4 |
| SubChunk 2 Size | 4 | |
| data | SubChunk 2 Size |
이전 Wave 파일을 출력할 때에는 분홍색 부분만 스트럭쳐를 구성해서 헤더 부분을 읽어 내었는데요, 저장하기 위해서는 모든 내용을 스트럭쳐로 구성하겠습니다. 역시 이부분은 http://www.hitsquad.com/smm/programs/WavPlay/에 올려진 WavPlay 1.0 의 소스 부분에서 이름만 조금 수정했습니다.
typedef struct
{
char RiffID [4] ;
u_long RiffSize ;
char WaveID [4] ;
char FmtID [4] ;
u_long FmtSize ;
u_short wFormatTag ;
u_short nChannels ;
u_long nSamplesPerSec ;
u_long nAvgBytesPerSec ;
u_short nBlockAlign ;
u_short wBitsPerSample ;
char DataID [4] ;
u_long nDataBytes ;
} wave_header_t;
static wave_header_t wave_header =
{ { 'R', 'I', 'F', 'F' },
0,
{ 'W', 'A', 'V', 'E' },
{ 'f', 'm', 't', ' ' },
16,
PCM_WAVE_FORMAT,
0,
0,
0,
0,
0,
{ 'd', 'a', 't', 'a' },
0
};
어차피 Wave 파일을 저장할 것이므로 Wave를 위한 초기값을 지정했습니다.
Wave 파일로 저장하기 위해서는 Wave 파일을 어떻게 만들었는지 wav의 속성을 담은 헤더 부분을 먼저 저장해야 겠습니다. 그래서 녹음 을 스테레오로 녹음했는지 모노로 녹음했는지에 대한 정보나 비트 레이트, 샘플링 비트 수 같은 정보를 담아서 헤더 정보로 먼저 저장합니다.
당연히 헤더 정보는 미리 사운드카드에 설정한 값이 되겠지요. 예제에서도 먼저 마이크로 녹음하는 방법을 모노에, 8000hz, 16비트 녹음으로 설정했습니다.
soundcard_set_stereo( 0); soundcard_set_data_bit_size( 16); soundcard_set_bit_rate( 8000);
그러므로 이와 같이 wave 파일의 헤더 정보를 저장합니다.
soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);
인수로 10 * 8000한 이유는 10초간의 녹음 파일임을 말합니다. 이제 sound_write_wav_header() 함수의 내용을 보겠습니다.
int soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{ u_long databytes ;
u_short blockalign ;
if ( _fd < 0 )
printx( "bad file descriptor?");
_sampbits = (_sampbits == 16) ? 16 : 8 ;
blockalign = ( (_sampbits == 16) ? 2 : 1) * _channels ;
databytes = _samples * (u_long) blockalign ;
wave_header.RiffSize = sizeof ( wave_header_t) + databytes - 8 ;
wave_header.wFormatTag = PCM_WAVE_FORMAT ;
wave_header.nChannels = _channels ;
wave_header.nSamplesPerSec = _samplerate ;
wave_header.nAvgBytesPerSec = _samplerate * (u_long) blockalign ;
wave_header.nBlockAlign = blockalign ;
wave_header.wBitsPerSample = _sampbits ;
wave_header.nDataBytes = databytes;
if ( sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
printx( "write header errror");
return 0 ;
};
대부분이 wave 파일의 헤더에 맞추어 스트럭쳐의 내용을 구성하고 스트럭쳐를 그대로 파일에 저장했습니다. 주의해서 보실 것은 인수로 받은 _samples는 녹음 시간(초)* 샘플링 비트 레이트로서 Hz 값입니다. 헤더 정보에는 사운드 부분의 바이트 개수가 들어 가기 때문에 _samples에 스테레오면 2배를 모노이면 _samples 값으로 사운드 데이터 부분의 바이크 개수를 계산하고 헤더에 저장합니다.
int soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{
_sampbits = (_sampbits == 16) ? 16 : 8 ;
blockalign = ( (_sampbits == 16) ? 2 : 1) * _channels ;
databytes = _samples * (u_long) blockalign ;
:
wave_header.nDataBytes = databytes;
if ( sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
:
};
헤더를 저장했으므로 이전 방법에 따라 마이크로 부터 사운드 값을 입력받아 그대로 파일로 저장하면 됩니다.
soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);
while( TRUE)
{
:
read_size = read( fd_soundcard, sound_buff, sound_buff_size);
write( fd_wavfile, sound_buff, read_size);
:
}
전체 소스를 올립니다. 컴파일하신 후에 실행하시면 test.wav 파일이 생성됩니다. 생성된 파일을 이전 시간의 wav_player 프로그램으로 재생해 보십시오. 예제라서 10초간 녹음하는 부분을 단순하게 처리했습니다. 이점 양해를 부탁드립니다. ^^
// 이 소스는 http://www.hitsquad.com/smm/programs/WavPlay/ 에서 구한
// WavPlay 1.0 by Warren W. Gay VE3WWG 의 소스를 참고하여 작성되었습니다.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>
#define SCERR_NO_PROC_DEVICE -1 // /proc/device 가 존재하지 않는다.
#define SCERR_DRIVER_NO_FIND -2 // /proc/device 에서 드라이버를 찾지 못함
#define SCERR_NO_SOUNDCARD -3 // 사운드 카드가 없음
#define SCERR_NO_MIXER -4 // 믹서가 없음
#define SCERR_OPEN_SOUNDCARD -5 // 사운드 카드를 여는데 실패 했다.
#define SCERR_OPEN_MIXER -6 // 사운드 카드를 여는데 실패 했다.
#define SCERR_PRIVILEGE_SOUNDCARD -7 // 사운드 카드를 사용할 권한이 없음
#define SCERR_PRIVILEGE_MIXER -8 // 미서를 사용할 권한이 없음
#define SCERR_NO_FILE -10 // 파일이 없음
#define SCERR_NOT_OPEN -11 // 파일이 열 수 없
#define SCERR_NOT_WAV_FILE -12 // WAV 파일이 아님
#define SCERR_NO_WAV_FORMAT -13 // WAV 포맷 정보가 없음
#define TRUE 1
#define DSP_DEVICE_NAME "/dev/dsp"
#define MIXER_DEVICE_NAME "/dev/mixer"
#define PCM_WAVE_FORMAT 1
typedef struct
{
char RiffID [4] ;
u_long RiffSize ;
char WaveID [4] ;
char FmtID [4] ;
u_long FmtSize ;
u_short wFormatTag ;
u_short nChannels ;
u_long nSamplesPerSec ;
u_long nAvgBytesPerSec ;
u_short nBlockAlign ;
u_short wBitsPerSample ;
char DataID [4] ;
u_long nDataBytes ;
} wave_header_t;
static wave_header_t wave_header =
{ { 'R', 'I', 'F', 'F' },
0,
{ 'W', 'A', 'V', 'E' },
{ 'f', 'm', 't', ' ' },
16,
PCM_WAVE_FORMAT,
0,
0,
0,
0,
0,
{ 'd', 'a', 't', 'a' },
0
};
static int fd_soundcard = -1;
static int fd_mixer = -1; // volume 제어용 파일 디스크립터
//------------------------------------------------------------------------------
// 설명 : 메시지를 출력하고 프로그램 종료
// 인수 : format : 출력할 문자열 형식 예) "%s%d"
// ... : 형식에 필요한 인수
//------------------------------------------------------------------------------
void printx( const char *_format, ...)
{
char *bar = "---------------------------------------------------------";
va_list parg;
int count;
printf( "%s:ERRORn", bar);
va_start( parg,_format);
count = vprintf(_format, parg);
va_end( parg);
printf( "n%sn", bar);
exit( -1);
}
//------------------------------------------------------------------------------
// 설명 : 파일에 Wave 파이의 헤더를 출력
// 인수 : _fd : Wave 파일의 디스크립터
// _channels : 1 = 모노
// 2 = 스테레오
// _samplerate: 비트 레이트
// _sampbits : 16 또는 8
// _samples : 녹음 tlrks(초) * _samplerate
// ... : 형식에 필요한 인수
//------------------------------------------------------------------------------
int soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{ u_long databytes ;
u_short blockalign ;
if ( _fd < 0 )
printx( "bad file descriptor?");
_sampbits = (_sampbits == 16) ? 16 : 8 ;
blockalign = ( (_sampbits == 16) ? 2 : 1) * _channels ;
databytes = _samples * (u_long) blockalign ;
wave_header.RiffSize = sizeof ( wave_header_t) + databytes - 8 ;
wave_header.wFormatTag = PCM_WAVE_FORMAT ;
wave_header.nChannels = _channels ;
wave_header.nSamplesPerSec = _samplerate ;
wave_header.nAvgBytesPerSec = _samplerate * (u_long) blockalign ;
wave_header.nBlockAlign = blockalign ;
wave_header.wBitsPerSample = _sampbits ;
wave_header.nDataBytes = databytes;
if ( sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
printx( "write header errror");
return 0 ;
};
//------------------------------------------------------------------------------
// 설명 : 사운드 출력을 위한 버퍼 크기를 구한다.
// 반환 : 사운드 출력 버퍼 크기
//------------------------------------------------------------------------------
int soundcard_get_buff_size( void)
{
int size = 1024;
if ( 0 <= fd_soundcard)
{
ioctl( fd_soundcard, SNDCTL_DSP_GETBLKSIZE, &size);
if ( size < 1024 )
size = 1024;
}
return size;
}
//------------------------------------------------------------------------------
// 설명 : 사운드 카드 출력을 스테레오로 설정
// 인수 : _enable - 1 : 스테레오
// 0 : 모노
//------------------------------------------------------------------------------
void soundcard_set_stereo( int _enable)
{
if ( 0 <= fd_soundcard) ioctl( fd_soundcard, SNDCTL_DSP_STEREO, &_enable);
}
//------------------------------------------------------------------------------
// 설명 : 사운드 카드 출력 비트 레이트를 지정
// 인수 : _rate - 설정할 비트 레이트
//------------------------------------------------------------------------------
void soundcard_set_bit_rate( int _rate)
{
if ( 0 <= fd_soundcard) ioctl( fd_soundcard, SNDCTL_DSP_SPEED, &_rate );
}
//------------------------------------------------------------------------------
// 설명 : 출력 사운드의 비트 크기 지정
// 인수 : _size - 사운드 데이터 비트 크기
//------------------------------------------------------------------------------
void soundcard_set_data_bit_size( int _size)
{
if ( 0 <= fd_soundcard) ioctl( fd_soundcard, SNDCTL_DSP_SAMPLESIZE, &_size);
}
//------------------------------------------------------------------------------
// 설명 : sound card 볼륨 지정
// 인수 : _channel - 변경할 채널 번호
// 헤드폰 볼륨 : SOUND_MIXER_WRITE_VOLUME
// PCM 볼륨 : SOUND_MIXER_WRITE_PCM
// 스피커 볼륨 : SOUND_MIXER_WRITE_SPEAKER
// 라인 볼륨 : SOUND_MIXER_WRITE_LINE
// 마이크 볼륨 : SOUND_MIXER_WRITE_MIC
// CD 볼륨 : SOUND_MIXER_WRITE_CD
// PCM2 볼륨 : SOUND_MIXER_WRITE_ALTPCM 주) ESP-MMI의 스피커 음량
// IGain 볼륨 : SOUND_MIXER_WRITE_IGAIN
// 라인 1 볼륨 : SOUND_MIXER_WRITE_LINE1
// _left : 볼륨의 좌측 값 또는 하위 값
// _right: 볼륨의 우측 값 또는 상위 값
//------------------------------------------------------------------------------
void soundcard_set_volume( int _channel, int _left, int _right )
{
int volume;
if ( 120 < _left ) _left = 120;
if ( 120 < _right ) _right = 120;
volume = 256 *_right +_left;
ioctl( fd_mixer, _channel, &volume );
}
//--------------------------------------------------------------------
// 설명: 사운드카드 사용을 종료하기 위해 닫기
//--------------------------------------------------------------------
void soundcard_close( void)
{
close( fd_soundcard);
close( fd_mixer );
}
//--------------------------------------------------------------------
// 설명: 사운드카드 사용을 위한 열기
// 인수: _mode - PLAYER : 재생 전용
// 인수: _mode - RECODER : 녹음 전용
// 인수: _mode - AUDIO : 재생과 녹음 모두 실행
// 반환: 사운드카드 파일 디스크립터
//--------------------------------------------------------------------
int soundcard_open(int _mode)
{
char *dsp_devname = DSP_DEVICE_NAME;
char *mixer_devname = MIXER_DEVICE_NAME;
// 사운드 카드 장치 열기
if ( 0 != access( dsp_devname, W_OK ) )
return SCERR_PRIVILEGE_SOUNDCARD;
fd_soundcard = open( dsp_devname,_mode);
if ( 0 > fd_soundcard)
return SCERR_OPEN_SOUNDCARD;
// MIXER 열기
if ( 0 != access( mixer_devname, W_OK ) )
return SCERR_PRIVILEGE_MIXER;
fd_mixer = open( mixer_devname, O_RDWR¦O_NDELAY );
if ( 0 > fd_soundcard)
return SCERR_OPEN_MIXER;
return fd_soundcard;
}
//--------------------------------------------------------------------
// 설명: 사운드 카드를 이용하여 10초간 녹음하여 test.wav로 저장한다.
//--------------------------------------------------------------------
int main( int argc, char **argv )
{
time_t tm_start;
time_t tm_check;
int fd_soundcard;
int fd_wavfile;
char *sound_buff; // 사운드 출력을 위한 버퍼
int sound_buff_size;
int read_size;
fd_soundcard = soundcard_open( O_RDONLY ¦ O_NONBLOCK);
switch( fd_soundcard)
{
case SCERR_NO_PROC_DEVICE : printx( "/proc/device가 없음");
case SCERR_NO_SOUNDCARD : printx( "사운드 카드가 없음");
case SCERR_NO_MIXER : printx( "믹서가 없음");
case SCERR_PRIVILEGE_SOUNDCARD : printx( "사운드 카드를 사용할 권한이 없음");
case SCERR_PRIVILEGE_MIXER : printx( "믹서 장치를 사용할 권한이 없음");
case SCERR_OPEN_SOUNDCARD : printx( "사운드 카드를 열 수 없음");
case SCERR_OPEN_MIXER : printx( "믹서 장치를 열수 없음");
}
soundcard_set_volume( SOUND_MIXER_WRITE_ALTPCM, 120, 120);
soundcard_set_volume( SOUND_MIXER_WRITE_MIC , 80, 80);
soundcard_set_volume( SOUND_MIXER_WRITE_IGAIN , 60, 60);
soundcard_set_stereo( 0);
soundcard_set_data_bit_size( 16);
soundcard_set_bit_rate( 8000);
sound_buff_size = soundcard_get_buff_size();
printf( "size=%dn", sound_buff_size);
sound_buff = ( char *)malloc( sound_buff_size);
fd_wavfile = open( "./test.wav", O_WRONLY ¦ O_CREAT ¦ O_TRUNC, 0644);
if ( 0 > fd_wavfile)
printx( "create wave file error");
soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);
time( &tm_start);
while( TRUE)
{
time( &tm_check);
if ( 10.0 <= difftime( tm_check, tm_start))
break;
read_size = read( fd_soundcard, sound_buff, sound_buff_size);
write( fd_wavfile, sound_buff, read_size);
}
close( fd_wavfile);
soundcard_close();
return 0;
}'공부 이야기 > 컴퓨터 몽땅' 카테고리의 다른 글
| RGB to YUV 색공간 변경 (0) | 2009/10/16 |
|---|---|
| wav 파일로 녹음하기 (0) | 2009/08/04 |
| Javascript 팁 (0) | 2009/07/14 |
| How do I get a list of network interfaces and their IP and MAC addresses? (0) | 2009/01/19 |
| 컴퓨터끼리 네트웍속도 측정툴 Iperf (1) | 2008/11/28 |
| *윈도우 XP 정품인증 받기* (1) | 2008/10/20 |
출처 : http://tong.nate.com/cookjava/49336451
마우스 오른쪽 버튼금지 2가지 방법
방법 1.
---------------------------------------------
<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">
완전히 오른쪽마우스가 안되게 하는 방법
<body bgcolor="#FFFFFF" text="#000000" oncontextmenu="return false">
드래그는 더되고 복사같은 기능 못쓰게 하는방법
<BODY onselectstart="return false" ondragstart="return false">
드래그만 안되고 복사 된는 기능
방법 2.
------------------------------------------------------------
<SCRIPT LANGUAGE=JAVASCRIPT>
/*
오른쪽 클릭 경고 박스 없이 못하게 하기(익스플로러/넷스케이프 모두)
*/
// 오른쪽 버튼 클릭을 못하게 하는 부분
if (window.Event) // 넷스케이프에서만 대문자 E.
document.captureEvents(Event.MOUSEUP); // mouse up 이벤트를 잡음
function nocontextmenu() // IE4에서만 적용, 다른 브라우저는 무시
{
event.cancelBubble = true
event.returnValue = false;
return false;
}
function norightclick(e) // 다른 모든 브라우저에서 작동
{
if (window.Event) // 다시, IE 또는 NAV ?
{
if (e.which == 2 || e.which == 3)
return false;
}
else
if (event.button == 2 || event.button == 3)
{
event.cancelBubble = true
event.returnValue = false;
return false;
}
}
document.oncontextmenu = nocontextmenu; // IE5+ 용
document.onmousedown = norightclick; // 다른 브라우저 용
</SCRIPT>
마우스 오른쪽 메뉴 맘대로 만들기
DHTM 을 이용한 마우스 오른쪽의 메뉴 만들기..
<script language="JavaScript1.2">
<!--
var isie=0;
if(window.navigator.appName=="Microsoft Internet Explorer"&&window.navigator.appVersion.substring(window.navigator.appVersion.indexOf("MSIE")+5,window.navigator.appVersion.indexOf("MSIE")+8)>=5.5) {
isie=1;
}
else {
isie=0;
}
if(isie) {
var html="";
html+='<TABLE STYLE="border="0" WIDTH="140" HEIGHT="180" CELLPADDING="0" CELLSPACING="0"background="HTTP://F2SKY.KOR1.NET/mrneuback.gif">';
html+='<ST'+'YLE TYPE="text/css">\n';
html+='a:link {text-decoration:none;font-family:Arial;font-size:8pt;}\n';
html+='a:visited {text-decoration:none;font-family:Arial;font-size:8pt;}\n';
html+='td {font-size:8pt;}\n';
html+='</ST'+'YLE>\n';
html+='<SC'+'RIPT LANGUAGE="JavaScript">\n';
html+='\n<'+'!--\n';
html+='window.onerror=null;\n';
html+='/'+' -'+'->\n';
html+='</'+'SCRIPT>\n';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i0" ONMOUSEOVER="document.all.i0.style.background=\'#FFFFFF\';document.all.i0.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i0.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.history.go(-1);"> <img SRC="HTTP://F2SKY.KOR1.NET/menuback.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 앞페이지로이동</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i1" ONMOUSEOVER="document.all.i1.style.background=\'#FFFFFF\';document.all.i1.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i1.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.history.go(1);"> <img SRC="HTTP://F2SKY.KOR1.NET/menuforward.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 뒷페이지로이동</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i4" ONMOUSEOVER="document.all.i4.style.background=\'#FFFFFF\';document.all.i4.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i4.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.parent.external.AddFavorite(window.top.location.href,window.top.document.title);"> <img SRC="HTTP://F2SKY.KOR1.NET/menufavorite.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 즐겨찾기에등록...</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i5" ONMOUSEOVER="document.all.i5.style.background=\'#FFFFFF\';document.all.i5.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i5.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.parent.location=\'view-source:\'+window.parent.location.href;"> <img SRC="HTTP://F2SKY.KOR1.NET/menusource.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 소스보기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i6" ONMOUSEOVER="document.all.i6.style.background=\'#FFFFFF\';document.all.i6.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i6.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.print();"> <img SRC="HTTP://F2SKY.KOR1.NET/menuprint.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 프린트하기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i7" ONMOUSEOVER="document.all.i7.style.background=\'#FFFFFF\';document.all.i7.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i7.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="window.parent.location.href=window.parent.location.href;"> <img SRC="HTTP://F2SKY.KOR1.NET/menurefresh.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 새로고침</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i8" ONMOUSEOVER="document.all.i8.style.background=\'#FFFFFF\';document.all.i8.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i8.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="if(window.parent.document.body.style.zoom!=0) window.parent.document.body.style.zoom*=1.6; else window.parent.document.body.style.zoom=1.6;"> <img SRC="HTTP://F2SKY.KOR1.NET/menuzoom.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 확대해서보기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i9" ONMOUSEOVER="document.all.i9.style.background=\'#FFFFFF\';document.all.i9.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i9.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';" ONCLICK="if(window.parent.document.body.style.zoom!=0) window.parent.document.body.style.zoom*=0.625; else window.parent.document.body.style.zoom=0.625;"> <img SRC="HTTP://F2SKY.KOR1.NET/menuzoom.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 축소해서보기</TD></TR>';
html+='</TABLE>';
var oPopup = window.createPopup();
}
function dopopup(x,y) {
if(isie) {
var oPopupBody = oPopup.document.body;
oPopupBody.innerHTML = html;
oPopup.show(x, y, 140, 180, document.body);
}
}
function click(e) {
if(isie) {
if(document.all) {
if(event.button==2||event.button==3) {
dopopup(event.x-1,event.y-1);
}
}
}
}
if(isie) {
document.oncontextmenu = function() { dopopup(event.x,event.y);return false; }
document.onmousedown = click;
}
// -->
</script>
마우스 오른쪽을 눌러보세염
배경을 고정하는 방법
배경화면을 고정시켜 사이즈에 따라 배경화면의 위치가 바뀌는 것을 막는 방법입니다.
<BODY bgProperties=fixed bgColor=#ffffff leftMargin=0 background="http://iloverflash.co.kr/bg.gif" topMargin=0 marginwidth="0" marginheight="0">
특정IP차단시키는 소스
<script language="javascript">
var ip = '<!--#echo var="REMOTE_ADDR"-->'
if (ip == '차단할IP주소') {
alert("STOP! You are viewing this page from an IP address that is not allowed!");
alert("Why can't you guys just leave me alone?");
if (confirm("Do you want to leave peacefully? Or will I have to help you?"))
{location.href="http://iloveflash.co.kr" } else { ("OK you choose I don't care! Bye bye! Don't come back!"); {location.href="http://iloveflash.co.kr" }} }
</script>
페이지가 용량이 많을때 읽는 중이라는 메시지보여주는 소스
로딩소스
<body onload="hide()">
<script language=javascript>
<!--
n = document.layers
ie = document.all
function hide() {
if (ie || n) {
if (n) document.Load.visibility = "hidden"
else Load.style.visibility = "hidden"
}
}
if(ie || n) document.write('<div id=Load style=position:absolute;width:100%;height:100%;top:0;left:0;background-color:#ffffff;z-index:5 align=center>')
document.write('<table border=0 height=100%>')
document.write('<tr>')
document.write('<td align=center><font size=4 color=gray face=굴림체>페이지를 읽고 있는 중입니다 ..... Loading...</font></td>')
document.write('</tr>')
document.write('</table>')
document.write('</div>')
//-->
</script>
화면가득 눈송이가 내리게 하는 소스
눈송이의 크기, 모양, 갯수, 위치도 설정할수 있습니다
<!-- [1단계] 아래의 코드를 <body> 와 </body> 태그 사이에 붙여 넣으세요 -->
<script>
// 눈송이의 갯수 (30 - 40 개 이상은 권하지 않습니다)
var snowmax=20
// 눈송이의 색상을 설정 하세요(더 추가하실수 있습니다)
var snowcolor=new Array("#aaaacc","#ddddFF","#ccccDD")
// 눈송이(사실은 글자)의 글꼴을 설정 하세요
var snowtype=new Array("Arial Black","Arial Narrow","Times","Comic Sans MS")
// 눈송이 모양
var snowletter="★"; // 눈송이모양은 (*) 가 좋습니다
// 떨어지는 속도 (0.3 에서 2 까지 권장)
var sinkspeed=0.6
// 눈송이의 최대크기
var snowmaxsize=30
// 눈송이의 최소크기
var snowminsize=8
// 눈이 내릴 구역을 설정 하세요
// 1 전체화면,
// 2 왼쪽화면
// 3 가운데 부분
// 4 오른쪽 화면
var snowingzone=1
var snow=new Array()
var marginbottom
var marginright
var timer
var i_snow=0
var x_mv=new Array();
var crds=new Array();
var lftrght=new Array();
var browserinfos=navigator.userAgent
var ie5=document.all&&document.getElementById&&!browserinfos.match(/Opera/)
var ns6=document.getElementById&&!document.all
var opera=browserinfos.match(/Opera/)
var browserok=ie5||ns6||opera
function randommaker(range) {
rand=Math.floor(range*Math.random())
return rand
}
function initsnow() {
if (ie5 || opera) {
marginbottom = document.body.clientHeight
marginright = document.body.clientWidth
}
else if (ns6) {
marginbottom = window.innerHeight
marginright = window.innerWidth
}
var snowsizerange=snowmaxsize-snowminsize
for (i=0;i<=snowmax;i++) {
crds[i] = 0;
lftrght[i] = Math.random()*15;
x_mv[i] = 0.03 + Math.random()/10;
snow[i]=document.getElementById("s"+i)
snow[i].style.fontFamily=snowtype[randommaker(snowtype.length)]
snow[i].size=randommaker(snowsizerange)+snowminsize
snow[i].style.fontSize=snow[i].size
snow[i].style.color=snowcolor[randommaker(snowcolor.length)]
snow[i].sink=sinkspeed*snow[i].size/5
if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
snow[i].posy=randommaker(2*marginbottom-marginbottom-2*snow[i].size)
snow[i].style.left=snow[i].posx
snow[i].style.top=snow[i].posy
}
movesnow()
}
function movesnow() {
for (i=0;i<=snowmax;i++) {
crds[i] += x_mv[i];
snow[i].posy+=snow[i].sink
snow[i].style.left=snow[i].posx+lftrght[i]*Math.sin(crds[i]);
snow[i].style.top=snow[i].posy
if (snow[i].posy>=marginbottom-2*snow[i].size || parseInt(snow[i].style.left)>(marginright-3*lftrght[i])){
if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
snow[i].posy=0
}
}
var timer=setTimeout("movesnow()",50)
}
for (i=0;i<=snowmax;i++) {
document.write("<span id='s"+i+"' style='position:absolute;top:-"+snowmaxsize+"'>"+snowletter+"</span>")
}
if (browserok) {
window.onload=initsnow
}
</script>
이미지 크기에 맞는 팝업창 띠우기
function popupImage(imageURL)
{
imageHandle=open("","popupForImage","toolbar=no,location=no,status=no,manubar=no,scrollbars=no,resizable=yes,width=100,height=100,top=100,left=50");
imageHandle.document.write("Image View");
imageHandle.document.write("");
imageHandle.document.write("*{margin:0;padding:0;border:0;}");
imageHandle.document.write("");
imageHandle.document.write("");
}
위의 스크립트를 <head>와 </head> 사이에 두고
<a href="javascript:popupImage('큰이미지')" onFocus="this.blur();"><img src="작은이미지"></a>
마우스 주위에 뱅글뱅글 도는 글 애니만들기
....
<SCRIPT LANGUAGE="xxJavaScript">
<!--
if (document.all) {
yourLogo = "라뷰해여~ 이쁜냔^-^!"; // 마우스 주위에 나타날 글자 를 써주세요.
logoFont = "돋움체"; // 글자체
logoColor = "#FDB7CE"; // 글자색
yourLogo = yourLogo.split('');
L = yourLogo.length;
TrigSplit = 360 / L;
Sz = new Array()
logoWidth = 30; // 장평 글자 간격입니다. 원의 크기 이겠죠!!
logoHeight = -30; // 글자의 크기 입니다. (여기서 - 는 반시계 반향 이고 지우면 시계방향으로 가요~)
ypos = 0;
xpos = 0;
step = 0.07; // 속도를 조절할 수 있습니다.
currStep = 0;
document.write('<div id="outer" style="position:absolute;top:0px;left:0px"><div style="position:relative">');
for (i = 0; i < L; i++) {
document.write('<div id="ie" style="position:absolute;top:0px;left:0px;'
+'width:10px;height:10px;font-family:'+logoFont+';font-size:12px;'
+'color:'+logoColor+';text-align:center">'+yourLogo[i]+'</div>'); }
document.write('</div></div>');
function Mouse()
{ ypos = event.y;
xpos = event.x - 5; }
document.xxonmousemove=Mouse;
function animateLogo() {
outer.style.pixelTop = document.body.scrollTop;
for (i = 0; i < L; i++) {
ie[i].style.top = ypos + logoHeight * Math.sin(currStep + i * TrigSplit * Math.PI / 180);
ie[i].style.left = xpos + logoWidth * Math.cos(currStep + i * TrigSplit * Math.PI / 180);
Sz[i] = ie[i].style.pixelTop - ypos;
if (Sz[i] < 5) Sz[i] = 5;
ie[i].style.fontSize = Sz[i] / 1.7; }
currStep -= step;
setTimeout('animateLogo()', 20); }
window.xxonload = animateLogo; }
//-->
</script>
페이지 오픈시 자동으로 시작페이지 설정하기
아래 소스를 사용하면 페이지를 오픈할 때 시작페이지를 자동으로 바꾸게 할 수 있습니다.
<html XMLNS:IE>
<head>
<script>
function MyStartHome()
{
if(!StartHomePage.isHomePage('http://www.filebest.com'))
StartHomePage.setHomePage('http://www.filebest.com');
}
</script>
<STYLE>
@media all { IE\:HOMEPAGE {behavior:url(#default#homepage)} }
</STYLE>
<IE:HOMEPAGE ID="StartHomePage" />
</head>
<body Onload="MyStartHome();" >
.....
</body>
</html>
홈페이지대문을 풀스크린 전체화면으로 뜨게 하기
첫화면을 풀스크린으로 뜨게하는 예제
아래 소스를 그냥 HTML 파일로 만들면 됩니다.
설명:
단, 아래 소스는 약간의 편법으로 만들어 진 것으로
먼저 기본 HTML에서 풀스크린으로 뛰울 HTML을 오픈하고 자기 자신은 창을 닫는 방식을 사용했습니다.
이 소스는 장점은 어떤 첫화면 풀스크린만들기 소스보다 소스가 간단합니다.
단점은 약간의 시간이 걸리고 또 중간에 다른창이 떳다가 사라지는 것 같은 화면이 잠시 나타납니다.
* 전체화면으로 뜬 창은 Alt+F4 키를 누르면 나갈 수 있습니다. 그러나
사용자들이 이것을 모르는 경우가 많기때문에 "닫기"버튼을 하나 만들어 주는 것이 좋습니다. 닫기 버튼은 이 게시판에서 "닫기"로 검색하면 찾을 수 있습니다.
예제:
<script>
popup=window.open("http://www.filebest.com","_blank","fullscreen,scrollbars")
</script>
<script>window.opener = window.location.href; self.close();</script>
공식
<script>
popup=window.open("연결할 URL경로","_blank","fullscreen,scrollbars")
</script>
<script>window.opener = window.location.href; self.close();</script>
위에서 하나 알 수 있느 것은 전체화면으로 뛰우기 위해서는 창옵션을 "fullscreen,scrollbars") 으로 하라는 것입니다.
마우스 따라다니는 정렬된 예쁜 글자들
[HTML ] 마우스 따라다니는 정렬된 예쁜 글자들
이름
: Uploader1 작성일 : 2004-01-17 10:43:15 조회 : 120
과정1)
헤드와 헤드사이에 삽입
<head>
............
............
<style type="text/css">
.spanstyle {position:absolute; visibility:visible; top:-50px; font-size:9pt; font-family:돋움; color:blue;}
</style>
<script>
/*
Cursor Trailor Text- By Peter Gehrig (http://www.24fun.ch/)
Permission given to Dynamicdrive.com to feature script in it's archive.
*/
var x,y
var step=20
var flag=0
// Your snappy message. Important: the space at the end of the sentence!!!
var message="여기에 원하는 글을 쓰세요~"
message=message.split("")
var xpos=new Array()
for (i=0;i<=message.length-1;i++) {
xpos[i]=-50
}
var ypos=new Array()
for (i=0;i<=message.length-1;i++) {
ypos[i]=-50
}
function handlerMM(e){
x = (document.layers) ? e.pageX : document.body.scrollLeft+event.clientX
y = (document.layers) ? e.pageY : document.body.scrollTop+event.clientY
flag=1
}
function makesnake() {
if (flag==1 && document.all) {
for (i=message.length-1; i>=1; i--) {
xpos[i]=xpos[i-1]+step
ypos[i]=ypos[i-1]
}
xpos[0]=x+step
ypos[0]=y
for (i=0; i<message.length-1; i++) {
var thisspan = eval("span"+(i)+".style")
thisspan.posLeft=xpos[i]
thisspan.posTop=ypos[i]
}
}
else if (flag==1 && document.layers) {
for (i=message.length-1; i>=1; i--) {
xpos[i]=xpos[i-1]+step
ypos[i]=ypos[i-1]
}
xpos[0]=x+step
ypos[0]=y
for (i=0; i<message.length-1; i++) {
var thisspan = eval("document.span"+i)
thisspan.left=xpos[i]
thisspan.top=ypos[i]
}
}
var timer=setTimeout("makesnake()",30)
}
</script>
............
............
</head>
과정2)
<Body> 태그를 아래와 같이 수정해주세요.
<body onload="makesnake()" style="width:100%; overflow-x:hidden; overflow-y:scroll">
과정3)
<Body> </Body> 사이에 아래를 넣어주세요.
<body>
..............
<script>
<!-- Beginning of JavaScript -
for (i=0;i<=message.length-1;i++) {
document.write("<span id='span"+i+"' class='spanstyle'>")
document.write(message[i])
document.write("</span>")
}
if (document.layers){
document.captureEvents(Event.MOUSEMOVE);
}
document.onmousemove = handlerMM;
// - End of JavaScript - -->
</script>
............
</body>
위에서 ............는 이것저것 다른 소스를 의미합니다.
링크 클릭시 사운드 효과
[HTML] 링크 클릭시 사운드 효과
이름
: Uploader1 작성일 : 2004-01-17 11:21:57 조회 : 60
과정1- 해드와 해드사이에 넣어주세요.
<head>
<bgsound id=music loop="1">
<script>
function bgsoundcall(str)
{
eval(str);
}
</script>
</head>
옵션- 위 소스에서 <bgsound id=music loop="1">에서 "1"은 사운드 연주 횟수입니다. 1이면 1회 지요...
과정2- 바디에 넣어주세요.
<body>
<a OnClick="bgsoundcall('music.src=사운드파일명'');">연결하기</a>
'공부 이야기 > 컴퓨터 몽땅' 카테고리의 다른 글
| RGB to YUV 색공간 변경 (0) | 2009/10/16 |
|---|---|
| wav 파일로 녹음하기 (0) | 2009/08/04 |
| Javascript 팁 (0) | 2009/07/14 |
| How do I get a list of network interfaces and their IP and MAC addresses? (0) | 2009/01/19 |
| 컴퓨터끼리 네트웍속도 측정툴 Iperf (1) | 2008/11/28 |
| *윈도우 XP 정품인증 받기* (1) | 2008/10/20 |
'롸이언 이야기' 카테고리의 다른 글
| 2009 제 6회 자라섬 국제 재즈페스티벌 (0) | 2009/07/08 |
|---|---|
| 시푸드 뷔페 ‘대장 메뉴’ 알고 가야 본전 뽑는다 (0) | 2009/05/07 |
| Innovate yourself~!! (0) | 2008/07/31 |
| 영화표 좀 나눠 쓰자구요~~~ㅋㅋ (0) | 2008/02/04 |
| 회사 A매치에서... (0) | 2007/06/06 |
| 스티브 잡스(Steve Jobs)의 연설문 (0) | 2007/04/08 |
| 하꼬야 시푸드 | |
최근 서울 종로에 2600㎡(약 800평)짜리 대규모 식당이 생겼다. 시푸드 레스토랑 ‘하꼬야’다. 근래엔 보기 드문 ‘도발적인’ 규모다. 요즘 같은 불황에 이렇게 규모로 치고 나올 수 있었던 건, 그 종목이 ‘시푸드 뷔페’였기 때문이다. 시푸드 뷔페는 최근 몇 년 새 업체 간의 전투에 가까운 영역 다툼으로 많은 업체가 들고 나는 부침을 겪었다. 그리고 이젠 나름의 시장질서를 잡으면서 외식 업계의 대세로 떠오르고 있다. 5월은 가족끼리 한 번은 외식하는 달. 점심시간 2만원대에 초밥부터 다른 요리와 디저트까지 먹을 수 있는 시푸드 레스토랑은 가족 외식 장소로 가장 많이 고려되는 곳이다. 간다면 알고 가는 게 이익이다. 시내의 유명 시푸드 레스토랑을 돌며 식당마다의 특징을 짚어봤다.
글=박지영 기자
사진=조용철 기자 youngcho@joongang.co.kr>
●하꼬야 시푸드 600석의 대규모 시푸드 뷔페다. 강남역의 마키노차야를 하는 LF푸드가 3월 서울 종로 르메이에르 빌딩에 열었다. 마키노차야가 싱싱한 생해산물로 인기를 끌었다면, 이 집에서 꼭 먹고 와야 하는 메뉴는 와규 스테이크, 하꼬야 라면, 아이스 홍시, 군산 횟집에서 직송하는 간장게장과 김치다. 이달엔 광어 이벤트를 한다. 시간 제약(2시간)이 있다. 저녁에만 나오는 크랩과 대게는 6시30분, 7시20분, 8시30분 등 시간이 정해져 있다. 이달엔 20% 할인 행사를 한다. 평일 점심 2만6000원, 저녁·주말·공휴일 3만9000원, www.hakoya.co.kr
오션스타
●무스쿠스 국내 시푸드 뷔페의 시초 격이다. 서울 반포동 센트럴시티 1호 점에 이어 5년 사이 역삼·삼성·잠실 등 서울 중심 상권에 9호 점까지 냈다. 철저히 일식 해산물 요리에 초점을 맞춰 매니어 층이 있다. 4명의 파티시에가 직접 구워내는 디저트도 이곳의 자랑이다. 평일 점심 2만원, 저녁 2만8000원, 주말 2만9500원, 02-6282-2970, www.muscus.co.kr
●토다이 뉴욕·홍콩·하와이 등에 매장이 있는 뷔페 레스토랑. 참치·연어·방어·문어 등 원하는 해산물을 그 자리에서 썰어 준다. 회를 즐기고 싶다면 이만 한 곳도 없다. 시간대를 잘 맞추면 1m는 족히 넘는 어마어마한 크기의 참치를 직접 손질하는 모습도 볼 수 있다. 회나 초밥 외에도 백합·소라·고둥을 쪄낸 찜요리나 석쇠구이, 철판구이, 샤브샤브 등 해산물 요리 종류가 많다. 평일 점심 2만3000원, 저녁·주말 3만4000원, 02-553-6886, www.todai.co.kr
●마리스코 다른 시푸드 뷔페에 비해 가격이 비교적 싼 게 장점이다. 왕십리역·대학로·사당동 등 3곳에 있고, 초밥과 예쁜 모양의 롤이 주 메뉴다. 회는 요리사가 앞에서 직접 썰어 준다. 요즘엔 광어·농어·방어·숭어 등이 주로 나온다. 태국 음식인 ‘푸팟퐁 커리’(게볶음요리)와 ‘톰양쿵’(수프)도 먹을 만하다. 소시지·닭꼬치· 자장면· 메밀국수 등도 있다. 평일 점심 1만7000원, 저녁 2만4000원, 주말 2만5000원. 02-3675-9990, www.mariscos.co.kr
보노보노
●보노보노 신세계푸드가 운영한다. 일본 초밥 전문기업 지요다스시와 기술제휴를 하고 요리법을 전수받아 본토의 맛을 가장 근접하게 재현한다. 30가지가 넘는 초밥과 롤을 즉석에서 선보인다. 초밥집이지만 이 집에서 가장 값 나가는 건 샐러드다. 유기농 채소만 내기 때문에 샐러드만 두 접시를 먹어도 본전은 뽑는다. 접시가 8인치로 다소 작다. 여러 음식을 섞지 말고 한 종류의 음식만 담아 먹는 게 맛있다는 나름의 미식철학에서 나온 것이다. 평일 점심 2만5000원, 저녁·주말 3만7000원, 02-3288-8080, www.bonobono.co.kr
●시푸드오션 CJ푸드빌에서 운영한다. 발산역 근처에 있어 인근 주택가에서 오는 가족 단위 손님이 많다. 뷔페식 시푸드 바와 20여 가지가 넘는 단품 메뉴를 판다. 비빔밥 코너에서는 해삼 창자(고노와다)와 갖가지 채소, 해산물을 넣어 비빔밥을 만들어 먹을 수 있다. 홍합탕과 직접 갈아주는 생과일 주스가 별미. 평일 점심 1만8000원, 저녁 2만3000원, 주말 2만5000원, 02-2668-2005, www.seafoodocean.co.kr
●오션스타 BBQ로 유명한 제너시스가 목동에 열었다. 즉석요리 코너가 눈에 특징. 철판·면 요리 외에도 파르메산 통치즈에 원하는 채소를 직접 버무려 주는 샐러드 서비스와 치킨 메뉴가 아이들에게 인기 만점이다. 이 업계에선 처음으로 생선용 뷔페 접시를 시원하게 보관해 냉동실에서 갓 꺼낸 듯한 접시에 스시를 담을 수 있다. 평일 점심 1만9900원, 저녁 2만7900원, 주말 점심 2만9900원, 02-2061-0609, www.ioceanstar.co.kr
출처 : 중앙일보
http://news.joins.com/article/aid/2009/05/07/3371978.html?cloc=nnc
'롸이언 이야기' 카테고리의 다른 글
| 2009 제 6회 자라섬 국제 재즈페스티벌 (0) | 2009/07/08 |
|---|---|
| 시푸드 뷔페 ‘대장 메뉴’ 알고 가야 본전 뽑는다 (0) | 2009/05/07 |
| Innovate yourself~!! (0) | 2008/07/31 |
| 영화표 좀 나눠 쓰자구요~~~ㅋㅋ (0) | 2008/02/04 |
| 회사 A매치에서... (0) | 2007/06/06 |
| 스티브 잡스(Steve Jobs)의 연설문 (0) | 2007/04/08 |
>Hello
>I would like to know if there is a way to know my ip address of each
>interface from a C program, if them are up or down...
>Of course, I can do it scanningf the output of "ifconfig", (more
>concretelly "ifconfig ppp0 | grep inetaddr"), but it would be great if
>exists the possibility of reading a structure with this information with a
>system call, just like sysinfo allows me to know how many free memory I
>have, for example.
>I have looked for such a function, but I havent found it. (I also have
>tried to look at the ifconfig code for a hint, but for me it is too
>complicated).
/* display info about network interfaces */
#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#define inaddrr(x) (*(struct in_addr *) &ifr->x[sizeof sa.sin_port])
#define IFRSIZE ((int)(size * sizeof (struct ifreq)))
static int
get_addr(int sock, char * ifname, struct sockaddr * ifaddr) {
struct ifreq *ifr;
struct ifreq ifrr;
struct sockaddr_in sa;
ifr = &ifrr;
ifrr.ifr_addr.sa_family = AF_INET;
strncpy(ifrr.ifr_name, ifname, sizeof(ifrr.ifr_name));
if (ioctl(sock, SIOCGIFADDR, ifr) < 0) {
printf("No %s interface.\n", ifname);
return -1;
}
*ifaddr = ifrr.ifr_addr;
printf("Address for %s: %s\n", ifname, inet_ntoa(inaddrr(ifr_addr.sa_data)));
return 0;
main(void)
{
unsigned char *u;
int sockfd, size = 1;
struct ifreq *ifr;
struct ifconf ifc;
struct sockaddr_in sa;
if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
fprintf(stderr, "Cannot open socket.\n");
exit(EXIT_FAILURE);
}
ifc.ifc_len = IFRSIZE;
ifc.ifc_req = NULL;
do {
++size;
/* realloc buffer size until no overflow occurs */
if (NULL == (ifc.ifc_req = realloc(ifc.ifc_req, IFRSIZE))) {
fprintf(stderr, "Out of memory.\n");
exit(EXIT_FAILURE);
}
ifc.ifc_len = IFRSIZE;
if (ioctl(sockfd, SIOCGIFCONF, &ifc)) {
perror("ioctl SIOCFIFCONF");
exit(EXIT_FAILURE);
}
} while (IFRSIZE <= ifc.ifc_len);
/* this is an alternate way to get info... */
{
struct sockaddr ifa;
get_addr(sockfd, "ppp0", &ifa);
}
ifr = ifc.ifc_req;
for (;(char *) ifr < (char *) ifc.ifc_req + ifc.ifc_len; ++ifr) {
if (ifr->ifr_addr.sa_data == (ifr+1)->ifr_addr.sa_data) {
continue; /* duplicate, skip it */
}
if (ioctl(sockfd, SIOCGIFFLAGS, ifr)) {
continue; /* failed to get flags, skip it */
}
printf("Interface: %s\n", ifr->ifr_name);
printf("IP Address: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
/*
This won't work on HP-UX 10.20 as there's no SIOCGIFHWADDR ioctl. You'll
need to use DLPI or the NETSTAT ioctl on /dev/lan0, etc (and you'll need
to be root to use the NETSTAT ioctl. Also this is deprecated and doesn't
work on 11.00).
On Digital Unix you can use the SIOCRPHYSADDR ioctl according to an old
utility I have. Also on SGI I think you need to use a raw socket, e.g. s
= socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP)
Dave
From: David Peter <dave.pe...@eu.citrix.com>
*/
if (0 == ioctl(sockfd, SIOCGIFHWADDR, ifr)) {
/* Select which hardware types to process.
*
* See list in system include file included from
* /usr/include/net/if_arp.h (For example, on
* Linux see file /usr/include/linux/if_arp.h to
* get the list.)
*/
switch (ifr->ifr_hwaddr.sa_family) {
default:
printf("\n");
continue;
case ARPHRD_NETROM: case ARPHRD_ETHER: case ARPHRD_PPP:
case ARPHRD_EETHER: case ARPHRD_IEEE802: break;
}
u = (unsigned char *) &ifr->ifr_addr.sa_data;
if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
printf("HW Address: %2.2x.%2.2x.%2.2x.%2.2x.%2.2x.%2.2x\n",
u[0], u[1], u[2], u[3], u[4], u[5]);
}
}
if (0 == ioctl(sockfd, SIOCGIFNETMASK, ifr) &&
strcmp("255.255.255.255", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
printf("Netmask: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
}
if (ifr->ifr_flags & IFF_BROADCAST) {
if (0 == ioctl(sockfd, SIOCGIFBRDADDR, ifr) &&
strcmp("0.0.0.0", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
printf("Broadcast: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
}
}
if (0 == ioctl(sockfd, SIOCGIFMTU, ifr)) {
printf("MTU: %u\n", ifr->ifr_mtu);
}
if (0 == ioctl(sockfd, SIOCGIFMETRIC, ifr)) {
printf("Metric: %u\n", ifr->ifr_metric);
}
printf("\n");
}
close(sockfd);
return EXIT_SUCCESS;
'공부 이야기 > 컴퓨터 몽땅' 카테고리의 다른 글
| wav 파일로 녹음하기 (0) | 2009/08/04 |
|---|---|
| Javascript 팁 (0) | 2009/07/14 |
| How do I get a list of network interfaces and their IP and MAC addresses? (0) | 2009/01/19 |
| 컴퓨터끼리 네트웍속도 측정툴 Iperf (1) | 2008/11/28 |
| *윈도우 XP 정품인증 받기* (1) | 2008/10/20 |
| AVI format (0) | 2008/09/28 |
-.리눅스 OS
iperf can be installed on Debian or ubuntu 로 세팅시
apt-get install iperf
and on CentOS 로 세팅시
yum install iperf
-.윈도우 OS
다운로드 받아서 알맞게 압축을 풀은후 시작-실행-cmd 창에서 압축풀어논 자리로 가서
iperf -s (서버모드)
iperf -c xxx.xxx.xxx.xxx (클라이언트모드)
이렇게 하시면 됩니다. 다음은 예제입니다.
예제) 리눅스컴퓨터(192.168.0.2)
윈도우컴퓨터(192.168.0.3)
리눅스를 서버모드로 윈도우를 클라이언트로 가정했을경우
리눅스 : iperf -s 엔터
윈도우 : iperf -c 192.168.0.2(리눅스아이피) 엔터
이렇게 하시면 리눅스와 윈도우 컴간의 속도가 나옵니다.
하지만 이렇게 하면 재미가 없겠죠? ^^
그래서 다음 옵션을 복사해서 붙여넣기를 하셔서 재미나게? 보시기 바랍니다.
리눅스 : iperf -s -P 0 -i 1 -p 5001 -l 8K -f m -t 10 엔터
윈도우 : iperf -c 192.168.0.2 -P 1 -i 1 -p 5001 -l 8K -f m -t 10 -L 5001 엔터
윗예제로 하시면 다양하게 속도가 측정이 되어서 나옵니다.^^; 자세한건 help명령어나 해당사이트참조바랍니다.
'공부 이야기 > 컴퓨터 몽땅' 카테고리의 다른 글
| Javascript 팁 (0) | 2009/07/14 |
|---|---|
| How do I get a list of network interfaces and their IP and MAC addresses? (0) | 2009/01/19 |
| 컴퓨터끼리 네트웍속도 측정툴 Iperf (1) | 2008/11/28 |
| *윈도우 XP 정품인증 받기* (1) | 2008/10/20 |
| AVI format (0) | 2008/09/28 |
| IP camera 산업의 전망 (0) | 2008/08/26 |


이올린에 북마크하기
7회모악서예대전출품원서_포토.hwp
iperf-2.0.4.tar.gz
jperf-2.0.0.zip

