태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

롸이언의 인생이야기 @ Innovate yourself ™


멋진 신랑이 아름다운 신부를 맞이하게 되었습니다.
앞으로 하루하루를 행복한 날들로 채워나가도록 꼭 오셔서 축복해주세요~


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
분류없음 l 2009/10/16 14:35

RGB to YUV 색공간 변경 색보정

2008/12/19 18:21

복사 http://blog.naver.com/laizenti/40058994588

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과 같은 이상적인 화면을 얻을 수도 있을 겁니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/10/16 09:55
[YF Love 펌]  http://yflove.net/bbs/tb.php/2/62069
 
많은 분들이 루마나 3m만 고집하시는데 그냥 단순히 루마나 3m이 인지도가 높다고 무턱대고 하시는것 보단 실용성있는 제품들을 선택하시는게 좋아요~~
 
전면썬팅지 비교표만 일단 올립니다.
 
 
 

제조사

제품명

가시광선

반사율

자외선차단

열차단

가격

브이텍

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만원

 
글라스틴트가 가장 열차단이 좋네요.. 지하 주차장이 없으신분들은 글라스틴트가 좋습니다..
 
 이외에도 여러가지 썬팅지들이 많습니다..꼭 가격대비 성능을 비교하시고 구입하시면 좋습니다... 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
분류없음 l 2009/09/26 08:58

출처 : FALINUX  wav 파일로 녹음하기
장길석

이제 사운드 카드로 소리를 담아 내는 방법을 알게 되었으니 파일로 저장하는 방법에 대해 알아 보겠습니다. 가장 흔히 사용하는 wav 파일 형식을 이용하겠습니다. 사실 이 방법도 문서를 통하여 학습하기 보다는 Warren W. Gay라는 분이 만든 http://www.hitsquad.com/smm/programs/WavPlay/의 WavPlay 1.0을 분석하여 알게되었습니다.

그러다 보니 역시 부족한 부분과 잘못된 부분이 있을 것으로 생각됩니다. 혹 틀린 부분이나 부족한 부분이 있더라도 양해를 부탁드리며 그냥 지나치지 마시고 지적해주시고 알려 주시면 감사하겠습니다.

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;
}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/08/04 11:18

출처 : 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>

출처 : Tong - cookjava님의 셈틀 통통

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/07/14 10:42





크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
롸이언 이야기 l 2009/07/08 19:01

하꼬야 시푸드

최근 서울 종로에 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

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
롸이언 이야기 l 2009/05/07 11:56

신청서 포도  



신청서 만망
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
분류없음 l 2009/04/25 20:24

pancho <pan...@tee.com> wrote:
>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).

Below is a demo program that has been posted a few times previously.

/* 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;

}

int
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;

}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/01/19 18:54
iperf 설치

 -.리눅스 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명령어나 해당사이트참조바랍니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/11/28 20:31
1 2 3 4 5  ... 9 

카테고리

꼭대기 (82)
롸이언 이야기 (7)
가족 이야기 (0)
친구 이야기 (1)
공부 이야기 (51)
취미 이야기 (17)
노래 이야기 (1)

달력

«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Statistics Graph
tistory!get rss Tistory Tistory 가입하기! DNS Powered by DNSEver.com