- 일부만 인코딩 하기
ffmpeg -i Schtraus.pcm -ss 00:00:15 -f mp3 -t 00:00:30 test.mp3
- ffmpeg Format 정보
ffmpeg -formats
- 1920x1080을 30 fps로 읽어서 mpeg2video 로 만들기 (Bitrate 19M)
ffmpeg -f rawvideo -s 1920x1080 -r 30 -i MW105H_YV12_990frames.yuv -r 30 -s 1920x1080 -f mpeg2video -b 19000 test_video.ps
ffmpeg
ffmpeg -f mpeg2video -i test_video.ps -i test.mp3 -f avi -vcodec copy -acodec copy test_full_HD.avi
ffmpeg YUV->mpeg2TS
ffmpeg -f rawvideo -s 1920x1080 -r 30 -i MW105H_YV12_990frames.yuv -r 30 -s 1920x1080 -i test.mp3 -b 19000 -acodec copy test_video.ts
-f
Mplayer MOV->YUV (YUV4mpeg) (H264 -> YUV4mpeg)
Mplayer -rawvideo w=1920 h=1080 -i AAA.mov (output file stream.yuv)
Mplayer -rawvideo w=1280 h=720 -i AAA.mov (output file stream.yuv)
Mplayer YUV(YUV4mpeg) -> YUV (YV12 : YVU)
Mplayer -dumpvideo stream.yuv (output file : test.stream -> ex) test_video.yuv)
Mplayer MOV->AAC
Mplayer -dumpaudio AAA.mov (output file : test.stream)
ffmpeg YUV+AAC -> MPEG-2 TS (1080P)
ffmpeg -f rawvideo -s 1920x1080 -r 24 -i test_video.yuv -i test.mp3 -b 19000 -acodec copy test_video.ts
ffmpeg YUV+AAC -> MPEG-2 TS (720P)
ffmpeg -f rawvideo -s 1280x720 -r 24 -i test_video.yuv -i test.mp3 -b 9500 -acodec copy test_video.ts
MOV에서 YUV4MPEG 뽑기
./mplayer -vo yuv4mpeg -ao null -rawvideo w=1280 h=720 /home/jinwuk/Work/Test_work/basic_instinct_2_h720p.mov
ffmpeg -s 1280x688 -i B_I_YV12.yuv -padtop 16 -padbottom 16 -t 00:00:7 B_I_1280x720.yuv
Padding의 경우
ffmpeg -s 1280x544 -r 23.97 -i happy_feet_h720p_1729f.yuv -padtop 88 -padbottom 88 happy_feet_h720p_1729F.yuv
동기 맞는 오디오 뽑기
./mplayer -vo null -fps 23.976 -af resample=48000 -ao pcm:file=test_B_I.wav /home/jinwuk/Work/Test_work/basic_instinct_2_h720p.mov
ffmpeg -i test_B_I_48KHz.wav -ar 48000 -ac 2 -ab 192 -f mp3 test_B_I_48KHz.mp3
-
동기 맞는 다중화
ffmpeg -r 23.976 -f h264 -i basic_instinct_2_h720p_3338f_202222_1SL.264 -r 23.976 -f mp3 -i test_B_I_48KHz.mp3 -vcodec copy -acodec copy -r 23.976 -f avi basic_instinct_2_h720p_3338f_202222_1SL.avi
ffmpeg을 make하기전에 xine을 make한다. (xine-lib)-i ri
dts.h 파일이 깔린다.
이 상태에서 ffmpeg을 make 한다.
./configure --enable-gpl --enable-pp --enable-faac --enable-faad --enable-dts --enable-xvid --enable-vorbis --enable-libogg --enable-mp3lame --enable-faadbin
MPEG4IP
./configure --enable-server --enable-player --enable-ffmpeg=/home/jinwuk/Program_Files/ffmpeg
Makefile 파일 133 line에
FFMPEG_INC = -I/home/jinwuk/Program_Files/ffmpeg/libavcodec
만 있어서 컴파일시 헤더파일 없는 에러 발생
다음과 같이 고쳐준다.
FFMPEG_INC = -I/home/jinwuk/Program_Files/ffmpeg/libavcodec
FFMPEG_INC += -I/home/jinwuk/Program_Files/ffmpeg/libavformat
FFMPEG_INC += -I/home/jinwuk/Program_Files/ffmpeg/libavutil
mpeg2 TS container
Intel Commnad Line
Prompt>nmake -f your_project.mak CPP=icl.exe LINK32=xilink.exe
D:\WORK-2006\Encoder\H264_Work\20060327>nmake /f "lencod.mak" CFG="lencod - Win32 Release" CPP=icl.exe LINK32=xilink.exe
Resize % MSmpeg4 AVI
ffmpeg -s 1280x720 -r 23.97 -i stream.yuv -vcodec msmpeg4 -f avi -s 320x180 -r 23.97 -b 1000 -ss 00:01:00 -t 00:00:09 happy_small.avi
ffmpeg configurat
[root@ecprt2 ffmpeg]# ./configure --enable-gpl --enable-pp --enable-faac --enable-dts
VLC 0.8.4a 버전의 ffmpeg은 ffmpeg-20051126 버전이다.
고로 ffmpeg 최신 CVS를 설치했을 경우 VLC 컴파일이 안되며 별도로 ffmpeg을 설치하여 사용해야 한다.
이때 Configure 옵션은 다음과 같다.
[root@ecprt2 vlc-0.8.4a]# ./configure --with-ffmpeg-tree=/home/jinwuk/Program_Files/Miscellious_program/ffmpeg-20051126
이것은 Local ffmpeg에서의 static library를 사용한 compile이므로 주의하여야 한다
동기화 다중화 문제
Mplayer, ffmpeg 버전에 따라 문제가 발생할 수 있다.
Mplayer는 가급적 최신 버전을
ffmpeg은 안정화 버전을 사용하는 것이 좋다.
encoder.cfg 에서 frame rate를 정확히 적어 주어야 한다.
디코더가 H.264 헤더 정보를 보고 그에 따라 다중화를 수행한다.
비디오 오디오 한번에 뽑기 (chapter 3만)
mplayer -vo yuv4mpeg -rawvideo w=720 -rawvideo h=480 -af resample=48000 -af volume=15 -ao pcm:file=kaeda_t02.wav dvd://1 -chapter 3-3
AVI 파일의 비디오 오디오 매핑 변환을 통해 오디오 전환
ffmpeg -i HD_H264_0001_480SD.avi -i HD_H264_0001_480SD.wav -map 0.0:0.0 -map 1.0:0.1 -vcodec copy -f avi HD_H264_0001_480SD_L.avi
MP4Creator
mp4creator -rate=29.970 -create=Kaeda_1.264 Kaeda_1.mp4 (First Video)
mp4creator -create=Kaeda_1.mp3 Kaeda_1.mp4 (Second Audio)
MP4Box -hint -mtu 1024 -fps %1 -add %2 %2.mp4
-create
"The reason why sometimes vlc doesn't work is that when muxing to TS it expects to find AVC in bytestream format (NALS prefixed by 0x000001 as mpeg1/2/4), that for is never the case when the original stream is contained in mp4/mov and sometimes in avi (when the fourcc is avcc). In cases like those AVC is in raw NAL format, that unfortunately can only be muxed in SL substreams when inserted in TS (that vlc doesn't even read)."
h264 PSM (type 0x1b?)
./configure --disable-mencoder --disable-x264 --disable-mad --disable-faac --with-livelibdir=/home/jinwuk/Program_Files/live/ > configure_result.txt
JPEG 파일 뽑기
mplayer -vo jpeg:outdir=./figure -fps 30 cv_st.264
[no]progressive Specify standard or progressive JPEG. [no]baseline Specify use of baseline or not. optimize=<value> Optimization factor [0-100] smooth=<value> Smooth factor [0-100] quality=<value> Quality factor [0-100] outdir=<value>
mplayer H.264 debugger 사용하기
mplayer -vo jpeg:outdir=./figure -lavdopts debug=0x4000:vismv=3:gray -fps 30 pr_rb.264
Windows에서 Telnet 사용
제어판->서비스 에서 Telnet 구동
제어판->컴퓨터관리->사용자 에서 Telnet 사용자 등록 그룹은 Administrator 혹은 TelnetClient 로 등록
Deinterlace & 시작점
mpalyer -vo yuv4mpeg -vf pp=fd -ss 33:00 mpeg.ts
ffmpeg Deinterlaced filter 사용 다른 필터의 경우는 man page
VISIO에서 EPS 만들때는 AI format check 할 것 Level 3.0 recommend
AAC 인코딩
faac -X -P -b 218 -C 2 -R 48000 -o take_the_lead_h720p.aac take_the_lead_h720p.wav
bitrate 는 192kbps 이어야 하나 여기에 26kbps 를 더해야 한다.
Paypal pw: sj1612!1
Rapid_share : pw 1612sofm
http://rapidshare.de/files/13413024/dmode_attackk_III_02.zip.html1612
login
1845018
pw
453751
Account arrived! Please write it down!
Login: 102692
Password: 750851
Valid until: Thu, 30. Nov 2006
PWs
祝喵大dMOdE生日快樂by MWZG and 不歸之森
VOID-SHARE_ON_MWZG_ONLY
winavi
http://www.winavi.com/video-converter.htm
./mono -f 1080i60 -asp 16 9 -o component_yuv_m2 http://129.254.189.204/take_the_lead_h720p_right_mp3_byela.ts
Mplayer 현재 컴파일 옵션
./configure --enable-live --with-livelibdir=/home/jinwuk/Program_Files/live --disable-mencoder --disable-mad --disable-faac
MP4Creator : 비디오/오디오 hinted mp4 다중화
mp4creator -hint -rate 23.97 -create=take_the_lead_h720p_f3553_qp202022_ffrf0.264 -create=take_the_lead_h720p.mp3 take_the_lead_h720p_mp4cr.mp4
Darwin Server에서는 hinted mp4만 먹는다. 아울러 mp4creator 에서 생성된 것만 가능
Mplayer는 RTP Payload 타입이 맞지 않아 잘 안된다. Live555를 수정해야 함
RFP3984 Type RTP Payload 는 H.264 용
VLC 에서 mp4 의 RTP Payload Type을 알아보자.
Intel Compiler와 SDK
1. Platform SDK 2003 SP 1 만 가능하다.
2. Typical로 설치해야만 한다.
3. DirectSDK 9.0 을 설치해야 한다, c:\dxsdk
4. Intel Compiler 설치시 OPtion으로 환경변수가 자동으로 들어가도록 하면 편하다.
5. Intel Compiler 는 Platform SDK가 설치되었을 경우 자동으로 경로를 인식한다. (실은 세팅되어 있다. 셋팅되어 있지 않을 경우 bin\icl.cfg 를 통해 셋팅할 수 있다.)
6. Intel Compiler 에서 Link시 문제가 되면 Link Option (LINK32_FLAGS= …) 를 통해 조정하면 된다. 예를들어 /machine:AMD64 같은 것 … AMD64 용 Pass라는 의미
7. SDK를 사용하여 다른 플랫폼용 (windows server 2003 EM64T 등 단 64bit는 OS가 지원하지 않으면 소용이 없다.) Application을 만들 수 있다.
8. SDK VC가 깔린 다음 인텔 컴파일러를 깔아야 한다.
9. icl \help > icl_help.txt 로 컴파일러 옵션을 알 수 있다. 대단히 많다.
10. 인텔 컴파일러의 라이센스는 C:\Program Files\Common 에 있다.
VLC컴파일에서는 ffmpeg 약간 예전 버전이 필요하다…
이를 고려하여 ffmpeg을 두벌 사용해야 한다. 신버전/구버전
VLC는 구버전 특히 pre 버전에서 안정하며 svn 버전에서는 컴파일이 잘 안된다.
LAME mp3 encoder Option
lame -s 48 -b 192 FileTest4.wav FileTest4.mp3
Deinterlace Option
Mplayer :
-vop lavcdeint
-vf pp=fd/ffmpegdeint
Ffmpeg을 사용한 편집 및 YUV 추출
: 파일 시스템을 전적으로 사용한다는 점에서 mplayer 보다 좋으며 편집이 용이하다.
ffmpeg –I data.mpg –deinterlace –ss start_time(sec) –t duration_time(sec) –f yuv4mpegpipe stream.yuv
ffmpeg –s 1920x1080 –r 29.97 –I stream.yuv –s 1920x1080 –r 29.97 I420data.yuv
mplayer 사용한 wave 뽑기
mplayer –vc null –vo null –af resample=48000 … -ao pcm:file=aaa.wav aaa.mp3
ffmpeg 사용한 mp3
ffmpeg –i data.wav –ar 48000 –ab 192 –ac 2 –f mp3 data.wav
Value STB 문제
- 1080P30 의 경우 1080P60으로 두배 높게 TV에 뿌려 줘야 정상적으로 화면이 보인다.
- 사이즈 문제의 경우 자동으로 사이즈를 맞추면 된다. 16:9로 맞출 경우 3% 가량 잘리는 현상이 발생한다.
- 1080P30의 경우 –f edid 일때 1080P를 720P로 오 인식하는 문제가 있다. 이것은 HDMI 초기 세팅이 잘못될 경우 발생하는 문제로서 GLOBALSET.ini 에서
-f edid -> -f HDMI_1080p60 으로 맞춘다음
-asp 16 9 를 –asp 0 0 으로 바꾸면 사이즈 및 1080P 문제가 해결된다.
한번 1080P로 맞추어 지면 그 다음에는 자동적으로 1080P로 맞추어진다.
-TS ㅡ Muxer Bug report
Bug code
void inherit_au(au_t *parent, au_t *child)
{
memcpy(child->sps + 0, parent->sps + __max(parent->no_sps - 1, 0), sizeof(sps_t));
memcpy(child->pps + 0, parent->sps + __max(parent->no_pps - 1, 0), sizeof(pps_t));
}
Right code
void inherit_au(au_t *parent, au_t *child)
{
memcpy(child->sps + 0, parent->sps + __max(parent->no_sps - 1, 0), sizeof(sps_t));
memcpy(child->pps + 0, parent->pps + __max(parent->no_pps - 1, 0), sizeof(pps_t));
}
VC++ 6.0 에서 ASM 컴파일 하는 법
1. Project 파일에 일단 ASM 파일 넣는다.
2. Project 안의 ASM 파일의 Project Setting (혹은 Setting)을 통해 Project Setting 한다.
3. Custom Build 선택하여 다음과 같이 세팅한다.
Commands
Description
Assembling $(InputPath)
Release :
nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj $(InputPath)
Debug :
nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj $(InputPath)
Output :
$(IntDir)\$(InputName).obj
Installation of a new version of ffmpeg for windows
http://ffmpeg.mplayerhq.hu/documentation.html
download the new version of ffmpeg from the above site
http://sourceware.org/pthreads-win32/
download the pthreadGC2.dll from the above site.
Copy the ffmpeg and pthreadGC2.dll to a particular folder.
Mplayer
To show the parameters of decoding process,
Edit ./mplayer/config as quite=yes to #quite=yes
PRN->EPS
Adobe Postscript Printer 선택
Eps 파일로 저장
%%BoundingBox: 0 0 510 390 부분 (좌측 하단 원점, 우측 상단이 좌표점) 수정
/mysetup [ 72 600 V 0 0 -72 600 V 0.0 583.00128 ] def 의 3번째 부분을 수정하여 맞춤
Paypal seokjeff@hitel.co.kr
Newpaypal passwd : 1612sofm
RapidShare
Login: 1393322
Password: 830587517
Valid until: Sun, 9. Sep 2007
PTS/DTS/PCR
PTS/DTS
PTS 는 DTS 보다 최소한 1 프레임 뒤에 나타나도록 만들어야 한다.
Time_scale : 29.97 이면 보통 30000 (frame_rate x 1000)
Num_unit_in_tick : time_scale/frame_rate = 30000/29.97=1001
PCR 문제
Ffmpeg 에서 fixel format
-pix_fmt 여기에서 yuv420, yuv422 등을 정할 수 있다.
지원 포맷 yuv420p, yuv422p, yuv444p, yuv411p, gray
Bgr24 로 raw 데이터가 되어 있는 경우 유용하다. Yuv4pegpipe를 쓰지 않아도 된다.
VC2005 로 인코딩된 Application 실행 문제
0xc050001 error 발생은 Microsift.VC80.CRT_XXXXXX.maniesto 관련 파일 및 디렉토리를
Windows\WinSxS 에서 찾는다.
해당 디렉토리의 Manifest, Profiles 디렉토리 밑의 파일들과 WinSxS 디렉토리들을 모두 카피하여
Windows\WinSxS 밑에 카피하면 해결된다.
해당 디렉토리는 Visual C++ 2005 즉, VC8.0 버전의 기계어 코드/ 어셈코드들을 담고 있는 system file 로서 해당 Microsift.VC80.CRT_XXXXXX.maniesto 파일에는 MSVCR80.dll, MSVCP80.DLL, MSVCM80.dll과 Application을 연결해 주는 매개 역할을 한다.
Conversion of 5.1 channel audio to 2 channel audio
There is no way without using mplayer
mplayer -vo null -noframedrop -ao pcm:file=HitachHD.wav -af channels=2 HitachHD_P10.avi
(HitachHD.wav inludes a PCM audio with 5.1 channel)
Registry Booster Serial Number
RB-0HRX57-NWYFR1-30KG32-VKY3WQ-X2X907
SpeedUpMyPC3
SP-00Y7MH-M5TY2T-3T6WVX-6MN88H
DVD Play
mplayer -vo yuv4mpeg -rawvideo w=720 -rawvideo h=480 -af channels=2 -afvolume=15 -ao pcm:file=aaa.wav -dvd-device e: dvd://1_1
mencoder -dvd-device e: dvd://1_1 -ovc copy -oac copy -o dvd_me.avi
Visual C++ 2005에서 LoadLibrary의 DLL이 놀라오지 않는 문제
if ((m_hdll = LoadLibrary("TSMux_DLL.dll")) == NULL)
{
printf("LoadLibrary(TSMux_DLL.dll) Error");
exit(0);
}
Project Properties 에서
General -> Character Set 에서
Use Unicode Character Set 를
Use Multi-Byte Character Set 로 바꾸어 준다. 그래야 특수 문자 혹은 일반 문자들이 제대로 인식됨
DLL에 있는 함수들이 제대로 인식되지 않는 문제
CPP로 만들어진 DLL의 경우에는 DLL의 함수 이름들이 암호화 되어서 나온다.
이 경우에는 Visual C++의 Tool인 Dumpbin 을 사용하여
(dumpbin은 Visual C++에 있는 Commandline 창을 사용하여야만 실행시킬 수 있다.)
Dumpbin /export aaa.dll
을 통해 암호화된 함수를 GetProcAddress 로 매핑 시켜주면 된다.
더 좋은 방법은 다음과 같이 하는 것이다.
이 문제는 CPP에 의해 발생한 것이므로 CPP 대신 c로 선언해준다. 즉
#define DLL_DECL __declspec(dllexport)
extern "C" DLL_DECL void TS_Initial_process (H264VideoParameter *h264param, pes_t *audio_pes, long *read_size, ETRIFile *v_src, ETRIFile *a_src, ATYPE atype);
c:\document and Settings\User\Local Settings\Temp\Temporary Internet Files 다 지우기.,..
TSMux dll 을 인텔컴파일러로 컴파일 할 경우 LIBMMD.DLL을 함께 카피해 주어야 한다. (인텔 컴파일러에 있는 것을 카피해 주어야 한다.)
TSMux VC 6.0 으로 컴파일시 에러 발생하면…
TSMux_EXE pchi 파일 때문에 발생하므로….
1. 먼저 rebuild all을 수행한다.
2. sys/stat.h 에서 에러가 발생하면 TSMux_EXE pchi 파일을 지우고 Build TSMux_EXE (F7) 을 수행한다.
3. 에러가 계속되면 다시 2번을 반복한다. 될때까지…
VC6.0에서 __int64형 printf 옵션 %I64d 다음과 같이 하면 된다.
%9I64d
s
* Pre-Proessing과 Bit-rate 관계
-움직임이 많으며 조명 변화가 심하다.
- 매우 높은 고주파 성분이 많은 부분이 여러 화면에서 나타난다.
HD_Unee_Processed
720x480
5852 frames
3,032,807,660 Bytes
1 :
Resize
Internal Deinterlaced
Smart Deblocking
Color Space : IYUV
5514.3 Kbps : 22, 20, 20
Wrong Test !!
2:
Internal Deinterlaced
Smart Deblocking
Resize
7482.9 Kbps
3:
Deinterlaced MAP (Default)
Smart Deblocking
Resize
8766.2 Kbps
4:
Smart Deblocking
Resize
8195.2Kbps
5:
Internal Deinterlaced
Resize
7721.5Kbps
6:
Deinterlaced MAP (Default)
Resize
9036Kbps
현재까지는 Internal Deinterlacing과 Smart De-interlacing이 좋은 방법이다.
7.
Resize (BiCubic A=0.75)
9175Kbps
Virtual-Dub 실행시Application Error 0xc0150002 발생 원인
Microsoft.VC80.DebugCRT 관련 파일들이 windows/winSxS 에 없기 때문이다.
복사해주고 컴을 다시 켜주면 된다.
만일 해당 프로그램이 없으면 Windows/WinSxS 아예 windows update를 통해 VS2005SP1 서비스팩 1을 받아 깐다.
그래도 안되면..
Virtual-Dub 컴 파일 오더
1. 전체 Rebuild
2. Riza build
3. Virtual-dub Rebuild
4. Aska build
Linux에서 파일 분할 방법
split -b 10000000K test.ts
->xa , xb, ....
cat xa? > test.ts
Intel Compiler 10.0 이상에서 E264_VFW 제대로 컴파일 되지 않던 문제
Intel Compiler에서는 DLL 내부 함수의 Export는 무조건 __declspec(dllexport) 를 붙여 주어야만 한다.
DriveProc.def 보면 함수 2개 즉,
DriverProc
Configure
가 export 되어야 한다. 그런데 이전 에는 다음과 같이 되어 있어, Link 에러가 발생했다.
LRESULT WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lParam1, LPARAM lParam2 )
다음과 같이 바꿔주고 컴파일 시 보통 클린 정도가 아닌 프로젝트 클린을 해준 다음, rebuild 한다.
LRESULT __declspec(dllexport) WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lParam1, LPARAM lParam2 )
파일 비교하는 콘솔 명령어 fc foo.exe와 foo2.exe 비교
fc /b foo.exe foo2.exe > out.txt
MPEG-2 트랜스 코딩
- 최신 ffmpeg, ffdshow는 에러 발생
- 2007년 2월 이전 버전의 경우 에러가 없다.
- ffmpeg 으로 MPEG2 PES 로 바꾸어야 하며 포맷은 "vob" 이다.
- 단, ffmpeg은 2007년 2월 이전 버전, 최소 7월 이전 버전을 사용하여야 에러가 발생하지 않는다.
- ffmpeg으로 2007년 2월 이전 버전으로 vob 포맷으로 바꾼 후, virtual-dub for MPEG-2 1.6.2 버전을 사용하여 인코딩등을 수행한다.
- virtual-dub도 최신 버전은 vob를 인식하지 못한다.
Vdub 사용
vdub /s .\200809\test_001.vcf /capture /capfile test_001.avi /capstart
VirtualDub CLI Video Processor Version 1.8.1 (build 29879/release) for 80x86
Copyright (C) Avery Lee 1998-2008. Licensed under GNU General Public License
Connected to capture device: Logitech QuickCam Pro 5000 (DirectShow)
Starting capture to: test_001.avi
Attempting to abort, please wait....
Capture was completed successfully.
간단한 VC2008 컴파일된 프로그램 실행법
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT 이 경로에 있는 모든파일을 다 복사해서 실행(exe)파일에 같이 넣어두면 돼요 ^^
Microsoft.VC90.CRT.manifest, msvcm90.dll, msvcp90.dll, msvcr90.dll 요고 4개만 복사하면 돼요 ^^
IEEE membership
User Name
jinwuk_seok
PW (is equal to member #)
41307554
suf5.0
password : 0000
시작프로그램으로 만드는 방법
HKEY_ LOCAL_MACHINE> Software> Microsoft> Windows> CurrentVersion> Run 에서
오른쪽 창의 빈 곳을 마우스의 오른쪽 버튼을 클맄-> “ 문자열 값 “ 을 고른다.
예를 들어.... 새로운 “ 문자열 값 “ 을 <탐색기>라고 하고 “ 값의 데이터 “ 란에
탐색기의 [실행파일 경로를 입력]하면 작업이 끝나고 재 부팅시 탐색기가 곧바로 실행된다
현재 인코더에는 ETRI_Full_HD_Encoder 라는 이름으로 BAT 파일의 내용이 시작 프로그램으로 등록되어 있음
윈도우 시작시 자동로그온방법
regedit-->HKEY_LOCAL_MACHINE>SOFTWARE>Microsoft>WindowsNT>CurrentVersion>Winlogon항목에서
오른쪽마우스 클릭하여 새문자열값으로 다음값을 등록한다
이름 값
AutoAdminLogon ---> 1
DefaultUserName ---> 유저명(사용하시는 유저명) : 이 항목은 보통 만들어져 있다
DefaultPassword --->패스워드(유저의 패스워드) : 지정없이 사용할때는 값을 공란으로 둔다
현재는
AutoAdminLogon ---> 1
DefaultUserName ---> sjw
DefaultPassword --->root00
시간, Time 함수
#include <windows.h>
__int64 freq, start, end;
if (QueryPerformanceFrequency((LARGE_INTEGER*)&freq));
{
QueryPerformanceCounter((LARGE_INTEGER*)&start);
// Job
QueryPerformanceCounter((LARGE_INTEGER*)&end);
a = (float)((double)(end - start)/freq * 1000));
}
d:\WORK-2009>shutdown /?
사용법: shutdown [-l | -s | -r | -a] [-f] [-m \\컴퓨터 이름] [-t xx] [-c "설명"] [-d up:xx:yy]
No args 이 메시지를 표시합니다.(-?와 동일)
-i GUI 인터페이스 표시합니다.(처음 옵션이어야 합니다.)로그오프합니다. (-m 옵션과 함께 사용될 수 없음)
-s 시스템을 종료합니다.
-r 시스템을 종료한 후 다시 시작합니다.
-a 시스템 종료를 중단합니다.
-m \\컴퓨터 이름 원격 컴퓨터를 종료/다시 시작/중단합니다.
-t xx 시스템 종료의 만료 시간을 xx초로 설정합니다.
-c "설명" 시스템 종료 설명을 지정합니다. (최대 127 문자)
-f 실행 중인 응용 프로그램을 경고 없이 강제로 종료합니다. 응용 프로그램 강제 종료하고 시스템 로그 오프
-d [u][p]:xx:yy 종료에 대한 이유코드를 지정합니다.
u: 사용자 코드
p: 계획된 종료 코드
xx: 주 이유 코드 (256 보다 작은 양수)
yy: 부 이유 코드 (65536 보다 작은 양수)
d:\WORK-2009>tasklist /?
TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
[/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]
설명:
이 명령줄 도구는 현재 로컬 또는 원격 시스템에서 실행되고 있는 응용 프로그램 및 관련 작업/프로세스 목록을 표시합니다.
매개 변수 목록:
/S 시스템 연결할 원격 시스템을 지정합니다.
/U [domain\]user 명령을 실행해야 하는 사용자 컨텍스트를 지정합니다.
/P [암호] 해당 사용자 컨텍스트의 암호를 지정합니다. 생략한 경우에는 물어봅니다.
/M [모듈] 해당 패턴 이름과 일치하며 DLL 모듈이 로드된 모든 작업을 나열합니다. 모듈 이름을 지정하지 않으면 각 작업에서 로드한 모든 모듈을 표시합니다.
/SVC 각 프로세스에 있는 서비스를 표시합니다.
/V 자세한 정보를 표시하도록 지정합니다.
/FI 필터 필터에서 지정한 조건과 일치하는 작업 집합을 표시합니다.
/FO 형식 출력 형식을 지정합니다. 사용할 수 있는 값: "TABLE", "LIST", "CSV".
/NH 출력에 표시하지 않을 "열 머리글"을 지정합니다. "TABLE"과 "CSV" 형식에서만 사용할 수 있습니다.
/? 이 도움말/사용법을 표시합니다.
필터:
필터 이름 유효한 연산자 유효한 값
----------- --------------- --------------
STATUS eq, ne RUNNING | NOT RESPONDING
IMAGENAME eq, ne 이미지 이름
PID eq, ne, gt, lt, ge, le PID 값
SESSION eq, ne, gt, lt, ge, le 세션 번호
SESSIONNAME eq, ne 세션 이름
CPUTIME eq, ne, gt, lt, ge, le CPU 시간
(hh:mm:ss 형식)
hh - 시간,
mm - 분, ss - 초
MEMUSAGE eq, ne, gt, lt, ge, le 메모리 사용(KB)
USERNAME eq, ne 사용자 이름([domain\]user
형식)
SERVICES eq, ne 서비스 이름
WINDOWTITLE eq, ne 창 제목
MODULES eq, ne DLL 이름
예:
TASKLIST
TASKLIST /M
TASKLIST /V
TASKLIST /SVC
TASKLIST /M wbem*
TASKLIST /S 시스템 /FO LIST
TASKLIST /S 시스템 /U domain\username /FO CSV /NH
TASKLIST /S 시스템 /U 사용자 이름 /P 암호 /FO TABLE /NH
TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
d:\WORK-2009>
Commandline에서 Application 죽이기
taskkill /F /FI "IMAGENAME eq vdub.exe" /T
vdub.exe와 관련된 모든 모듈이 죽는다.
taskkill /? 를 통해 각 옵션의 특성을 알아본다.
taskkill /F /IM vdub.exe /T
도 같은 의미임
Visual C++ 6.0 으로 진행되던 프로젝트를 Visual C++ 2005로 포팅하게 되면(Visual C++ 2005 툴을 이용한 Project 변환 이용) WINVER 가 정의 되지 않아 Default 값인 Windows Server 2003으로 설정된다는 메세지를 보게 된다.
(VC 2008 이상에서도 마찬가지다. 따라서 StdAfx.h 파일에 #include <afxwin.h> 위 부분에 #define WINVER 0x0501 (XP의 경우) 를 넣어 주면 된다.)
WINVER not defined. Deafaulting to 0x0502 (Windows Server 2003)
만들고 있는 프로젝트가 지원해야 할 최소 OS 를 설정하기 위해서는 WINVER를 설정해야 한다.
설정값은 다음과 같다.
|
Minimum system required |
Macros to define |
|
Windows Vista |
_WIN32_WINNT>=0x0600 WINVER>=0x0600 |
|
Windows Server 2003 |
_WIN32_WINNT>=0x0502 WINVER>=0x0502 |
|
Windows XP |
_WIN32_WINNT>=0x0501 WINVER>=0x0501 |
|
Windows 2000 |
_WIN32_WINNT>=0x0500 WINVER>=0x0500 |
|
Windows NT 4.0 |
_WIN32_WINNT>=0x0400 WINVER>=0x0400 |
|
Windows Me |
_WIN32_WINDOWS=0x0500 WINVER>=0x0500 |
|
Windows 98 |
_WIN32_WINDOWS>=0x0410 WINVER>=0x0410 |
|
Windows 95 |
_WIN32_WINDOWS>=0x0400 WINVER>=0x0400 |
netstat /?
프로토콜 통계 및 현재 TCP/IP 네트워크 연결을 표시합니다.
NETSTAT [-a] [-b] [-e] [-n] [-o] [-p 프로토콜] [-r] [-s] [-v] [시간]
-a 모든 연결 및 수신 대기 포트를 표시합니다.
-b 각 연결 또는 수신 대기 포트를 만드는 데 관련된 실행 프로그램을
표시합니다. 잘 알려진 실행 프로그램에서 여러 독립 구성 요소를
호스팅하는 경우에는 연결 또는 수신 대기 포트를 만드는 데
관련된 구성 요소의 시퀀스가 표시됩니다. 이런 경우에는
실행 프로그램 이름이 아래쪽 대괄호 안에 표시되어 있고 위에는
TCP/IP에 도달할 때까지 호출된 구성 요소가 표시되어 있습니다.
이 옵션은 시간이 오래 걸릴 수 있으며 사용 권한이 없으면
실패합니다.
-e 이더넷 통계를 표시합니다. 이 옵션은 -s 옵션과 같이 사용될
수 있습니다.
-n 주소 및 포트 번호를 숫자 형식으로 표시합니다.
-o 각 연결의 소유자 프로세스 ID를 표시합니다.
-p 프로토콜 지정한 프로토콜에 해당되는 연결을 표시합니다. 프로토콜은
TCP, UDP, TCPv6 또는 UDPv6 중 하나입니다. -s 옵션과 함께
사용하여 프로토콜별 통계를 표시할 경우 프로토콜은 IP, IPv6,
ICMP, ICMPv6, TCP, TCPv6, UDP 또는 UDPv6 중 하나입니다.
-r 라우팅 테이블을 표시합니다.
-s 프로토콜별로 통계를 표시합니다. 기본값으로 IP, IPv6, ICMP,
ICMPv6, TCP, TCPv6, UDP 및 UDPv6에 관한 통계를 표시합니다.
-p 옵션을 함께 사용하면 기본값의 일부 집합에 대한 통계만
표시할 수 있습니다.
-v -b 옵션과 함께 사용하면 모든 실행 프로그램에 대한 연결
또는 수신 대기 포트를 만드는 데 관련된 구성 요소의 시퀀스를
표시합니다.
시간 다음 화면으로 이동하기 전에 지정한 시간 동안 선택한 통계를
다시 표시합니다. 통계 표시를 중단하려면 CTRL+C를 누르십시오.
지정하지 않으면 현재 구성 정보를 한 번 표시합니다.
****모든 프로그램의 옵션에서 멀티바이트 코드를 사용하여야 정확하게 문자열이 표현된다.
msconfig 을 사용하여 서비스등 사용되고 있는 windows의 서비스등을 중지 시키거나 할 수 있다.
Apache 서버 동작 안하는 경우
1. IIS 서버와 충돌하는 경우 -> IIS 서버를 중지시킨다.
2. httpd.conf 를 정확하게 써준다.
예) Documnet Root 와 Document Directory는 항상 일치해야 한다.
3. 윈도우즈 방화벽 예외로 httpd.exe를 설정해 주어야 한다.
셋탑 ID
root
pw : etri
MSN
ID : sderoen@htmail.com
PW : sj1612
_mm_mpsadbw_epu8
Microsoft Specific
Emits the Streaming SIMD Extensions 4 (SSE4) instruction mpsadbw. This instruction computes multiple packed sums on the absolute value of the difference between two parameters.
A 128-bit result that contains eight 16-bit unsigned integers. The values of these integers can be computed as follows:
Copy Code
i = mask2 * 4
j = mask0-1 * 4
for (k = 0; k < 8; k = k + 1) {
t0 = abs(a[i + k + 0] - b[j + 0])
t1 = abs(a[i + k + 1] - b[j + 1])
t2 = abs(a[i + k + 2] - b[j + 2])
t3 = abs(a[i + k + 3] - b[j + 3])
r[k] = t0 + t1 + t2 + t3
}
Requirements
Intrinsic
Architecture
_mm_mpsadbw_epu8
x86, x64
Header file <smmintrin.h>
Remarks
a[n] and b[n] indicate the nth ordered unsigned 8-bit integer of parameters a and b where a[0] and b[0] are the lowest 8 bits. r[n] is the nth ordered unsigned 16-bit element of result r, where r[0] refers to the lowest 16 bits. mask0, mask1, and mask2 are the three least significant bits of parameter mask.
Before you use this intrinsic, software must ensure that the processor supports the instruction.
Example
Copy Code
#include <stdio.h>
#include <smmintrin.h>
int main ()
{
__m128i a, b;
// A mask value of 0101 (5) will add four to each index
const int mask = 5;
a.m128i_u8[0] = 15;
a.m128i_u8[1] = 60;
a.m128i_u8[2] = 55;
a.m128i_u8[3] = 31;
a.m128i_u8[4] = 0;
a.m128i_u8[5] = 1;
a.m128i_u8[6] = 2;
a.m128i_u8[7] = 4;
a.m128i_u8[8] = 8;
a.m128i_u8[9] = 16;
a.m128i_u8[10] = 32;
a.m128i_u8[11] = 64;
a.m128i_u8[12] = 128;
a.m128i_u8[13] = 255;
a.m128i_u8[14] = 1;
a.m128i_u8[15] = 17;
b.m128i_u8[0] = 2;
b.m128i_u8[1] = 4;
b.m128i_u8[2] = 8;
b.m128i_u8[3] = 64;
b.m128i_u8[4] = 255;
b.m128i_u8[5] = 0;
b.m128i_u8[6] = 1;
b.m128i_u8[7] = 16;
b.m128i_u8[8] = 32;
b.m128i_u8[9] = 64;
b.m128i_u8[10] = 128;
b.m128i_u8[11] = 255;
b.m128i_u8[12] = 75;
b.m128i_u8[13] = 31;
b.m128i_u8[14] = 42;
b.m128i_u8[15] = 11;
__m128i res = _mm_mpsadbw_epu8(a, b, mask);
__m128i final;
int temp1, temp2, temp3, temp4, index;
for (index = 0; index < 8; index++)
{
temp1 = abs(a.m128i_u8[4 + index] - b.m128i_u8[4]);
temp2 = abs(a.m128i_u8[4 + index + 1] - b.m128i_u8[4 + 1]);
temp3 = abs(a.m128i_u8[4 + index + 2] - b.m128i_u8[4 + 2]);
temp4 = abs(a.m128i_u8[4 + index + 3] - b.m128i_u8[4 + 3]);
final.m128i_u16[index] = temp1 + temp2 + temp3 + temp4;
}
printf_s("Res0 should be %d: %d\nRes1 should be %d: %d\n",
final.m128i_u16[0], res.m128i_u16[0],
final.m128i_u16[1], res.m128i_u16[1]);
printf_s("Res2 should be %d: %d\nRes3 should be %d: %d\n",
final.m128i_u16[2], res.m128i_u16[2],
final.m128i_u16[3], res.m128i_u16[3]);
printf_s("Res4 should be %d: %d\nRes5 should be %d: %d\n",
final.m128i_u16[4], res.m128i_u16[4],
final.m128i_u16[5], res.m128i_u16[5]);
printf_s("Res6 should be %d: %d\nRes7 should be %d: %d\n",
final.m128i_u16[6], res.m128i_u16[6],
final.m128i_u16[7], res.m128i_u16[7]);
return 0;
}
Copy Code
Res0 should be 269: 269
Res1 should be 267: 267
Res2 should be 264: 264
Res3 should be 290: 290
Res4 should be 342: 342
Res5 should be 446: 446
Res6 should be 653: 653
Res7 should be 588: 588
mask의 의미
_mm_mpsadbw_epu8(a, b, mask);
에서
a Destimation
b Source
mask bit 는 3비트로서 [1:0] 은 src의 4바이트로 된 하나의 그룹을 가리킨다. 즉,
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 의 16개 1 bute로 src가 구성되어 있다면
00 : 3 2 1 0
01 : 7 6 5 4
10 : 11 10 9 8
11 : 15 14 13 12
를 의미한다.
maskbit[2]는 DST의 11 바이트로 된 두개의 그룹중 하나를 가리킨다. 즉,
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 의 16개 1 bute로 DST가 구성되어 있다면
0 : 10 9 8 7 6 5 4 3 2 1 0 : 11 byte
1 : 14 13 12 11 10 9 8 7 6 5 4 : 11 byte
이것이 슬라이딩 하면서 4 byte 단위로 SAD 값을 한꺼번에 계산한다.
_mm_minpos_epu16
include <stdio.h>
#include <smmintrin.h>
int main ()
{
__m128i a;
a.m128i_u16[0] = 127;
a.m128i_u16[1] = 10000;
a.m128i_u16[2] = 65535;
a.m128i_u16[3] = 1;
a.m128i_u16[4] = 2;
a.m128i_u16[5] = 64;
a.m128i_u16[6] = 314;
a.m128i_u16[7] = 27;
__m128i res = _mm_minpos_epu16(a);
printf_s("Result res:\t%d\t%d\t%d\t%d\n\t\t%d\t%d\t%d\t%d\n",
res.m128i_u16[0], res.m128i_u16[1], res.m128i_u16[2],
res.m128i_u16[3], res.m128i_u16[4], res.m128i_u16[5],
res.m128i_u16[6], res.m128i_u16[7]);
return 0;
}
Result res: 1 3 0 0 0 0 0 0
res.m128i_u16[0]은 값, res.m128i_u16[1]은 Position
res = _mm_shuffle_epi32(s0, 0x44);
s0의 하위 64 bit 상위 64bit로 그대로 카피하는 명령어다.
ffmpeg 큰 파일 자르기
ffmpeg은 큰 파일은 쓰지 못한다. 4GB 이상은 못쓴다. 따라서 나누어야 한다.
win-command 의 파일 메뉴에 파일 자르기 메뉴가 있다. 이걸로 일단 적절히 나눈다. 4000 MB
TS 이므로 나누어진 파일은 전혀 문제가 없다.
즎 부팅 속도 향상
다음에 설명하는 방법은 MS에서 권장하는 방법이 아닌 ‘꽁수’에 해당한다(Prefetch 기술). Prefetch에 대해 설명하면 윈도우의 부팅 커널까지 포함하여 모든 프로그램 실행시 실행됐던 기계어와 실행하는 데 필요한 DLL 파일들의 주소를 파일에 저장해 놓고, 다음 번에 실행시 정보를 저장한 파일을 읽어 미리 하드디스크에서 RAM으로 로딩하게끔 하는 기술이다
짾 regedit 실행
짿 HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters로 이동
쨁 EnablePrefetcher를 더블클릭해 값을 0으로 해준다.
쨂 재부팅시에는 windowsprefetch에 파일이 저장되지 않는다. 참고로 1은 응용 프로그램 실행시, 2는 부팅시, 3은 언제나 사용하게끔 되어 있다. 기본 값은 3.
Sync 문제 없는 Virtual-Dub 용 입력 컨텐츠
ffmpeg -i "2008-12-29(월)오후103847-CADTV6-1-HD. 2008SBS가요대전(1부,15세).001" -vcodec copy -acodec copy -f dvd 2008-12-29-001.mpg
그 다음 500 msec Pre-load를 없애고 0~25msec 정도 Pre-load를 하면 문제가 없다.
IPSTB Monitoring
./value/bin 에서
./run-multi.sh 224.1.1.2:3003 -monitor
에서 일단 기본적인 버퍼 모니터링을 할 수 있다.
한장희 사장 말로는 TS 분석도 가능하다고 하는데, 현재 알 수 없다.
Mplayer Debug Option
|
−lavdopts <option1:option2:...> (DEBUG CODE) |
|
|
Specify libavcodec decoding parameters. Separate multiple options with a colon. EXAMPLE: |
|
|
−lavdopts gray:skiploopfilter=all:skipframe=nonref |
|
|
Available options are: |
|
|
bitexact |
|
|
Only use bit-exact algorithms in all decoding steps (for codec testing). |
|
|
bug=<value> |
|
|
Manually work around encoder bugs. |
|
|
0: nothing 1: autodetect bugs (default) 2 (msmpeg4v3): some old lavc generated msmpeg4v3 files (no autodetection) 4 (mpeg4): Xvid interlacing bug (autodetected if fourcc==XVIX) 8 (mpeg4): UMP4 (autodetected if fourcc==UMP4) 16 (mpeg4): padding bug (autodetected) 32 (mpeg4): illegal vlc bug (autodetected per fourcc) 64 (mpeg4): Xvid and DivX qpel bug (autodetected per fourcc/version) 128 (mpeg4): old standard qpel (autodetected per fourcc/version) 256 (mpeg4): another qpel bug (autodetected per fourcc/version) 512 (mpeg4): direct-qpel-blocksize bug (autodetected per fourcc/version) 1024 (mpeg4): edge padding bug (autodetected per fourcc/version) |
|
|
debug=<value> |
|
|
Display debugging information. |
|
|
0: disabled 1: picture info 2: rate control 4: bitstream 8: macroblock (MB) type 16: per-block quantization parameter (QP) 32: motion vector 0x0040: motion vector visualization (use −noslices) 0x0080: macroblock (MB) skip 0x0100: startcode 0x0200: PTS 0x0400: error resilience 0x0800: memory management control operations (H.264) 0x1000: bugs 0x2000: Visualize quantization parameter (QP), lower QP are tinted greener. 0x4000: Visualize block types. |
|
|
ec=<value> |
|
|
Set error concealment strategy. |
|
|
1: Use strong deblock filter for damaged MBs. 2: iterative motion vector (MV) search (slow) 3: all (default) |
|
|
er=<value> |
|
|
Set error resilience strategy. |
|
|
0: disabled 1: careful (Should work with broken encoders.) 2: normal (default) (Works with compliant encoders.) 3: aggressive (More checks, but might cause problems even for valid bitstreams.) 4: very aggressive |
|
|
fast (MPEG-2, MPEG-4, and H.264 only) |
|
|
Enable optimizations which do not comply to the specification and might potentially cause problems, like simpler dequantization, simpler motion compensation, assuming use of the default quantization matrix, assuming YUV 4:2:0 and skipping a few checks to detect damaged bitstreams. |
|
|
gray |
|
|
grayscale only decoding (a bit faster than with color) |
|
|
idct=<0−99> (see −lavcopts) |
|
|
For best decoding quality use the same IDCT algorithm for decoding and encoding. This may come at a price in accuracy, though. |
|
|
lowres=<number>[,<w>] |
|
|
Decode at lower resolutions. Low resolution decoding is not supported by all codecs, and it will often result in ugly artifacts. This is not a bug, but a side effect of not decoding at full resolution. |
|
|
0: disabled 1: 1/2 resolution 2: 1/4 resolution 3: 1/8 resolution |
|
|
If <w> is specified lowres decoding will be used only if the width of the video is major than or equal to <w>. |
|
|
o=<key>=<value>[,<key>=<value>[,...]] Pass AVOptions to libavcodec decoder. Note, a patch to make the o= unneeded and pass all unknown options through the AVOption system is welcome. A full list of AVOptions can be found in the FFmpeg manual. Note that some options may conflict with MEncoder options. |
|
|
EXAMPLE: |
|
|
o=debug=pict |
|
|
sb=<number> (MPEG-2 only) |
|
|
Skip the given number of macroblock rows at the bottom. |
|
|
st=<number> (MPEG-2 only) |
|
|
Skip the given number of macroblock rows at the top. |
|
|
skiploopfilter=<skipvalue> (H.264 only) |
|
|
Skips the loop filter (AKA deblocking) during H.264 decoding. Since the filtered frame is supposed to be used as reference for decoding dependent frames this has a worse effect on quality than not doing deblocking on e.g. MPEG-2 video. But at least for high bitrate HDTV this provides a big speedup with no visible quality loss. <skipvalue> can be either one of the following: |
|
|
none: Never skip. default: Skip useless processing steps (e.g. 0 size packets in AVI). nonref: Skip frames that are not referenced (i.e. not used for decoding other frames, the error cannot "build up"). bidir: Skip B-Frames. nonkey: Skip all frames except keyframes. all: Skip all frames. |
|
|
skipidct=<skipvalue> (MPEG-1/2 only) |
|
|
Skips the IDCT step. This degrades quality a lot of in almost all cases (see skiploopfilter for available skip values). |
|
|
skipframe=<skipvalue> |
|
|
Skips decoding of frames completely. Big speedup, but jerky motion and sometimes bad artifacts (see skiploopfilter for available skip values). |
|
|
threads=<1−8> (MPEG-1/2 and H.264 only) |
|
|
number of threads to use for decoding (default: 1) |
|
|
vismv=<value> |
|
|
Visualize motion vectors. |
|
|
0: disabled 1: Visualize forward predicted MVs of P-frames. 2: Visualize forward predicted MVs of B-frames. 4: Visualize backward predicted MVs of B-frames. |
|
|
vstats |
|
|
Prints some statistics and stores them in ./vstats_*.log. |
RC_Analysis 사용법
RC_Analysis.exe -v test.264 -o test.ts -bv 1000000 -cpb 19500000 -GOPL 30 > 20090808_rca.txt
mplayer -fs -aspect 4:3 -lavdopts vstats test.264
Platform SDK DirectShow Filter Visual C++ 셋팅
1. 최신 SDK를 다운 받는다. SDK는 6.1이 최신 버전이다.
제목 :
사이트 :
이것을 설치하고
MicroSoft Windows SDK 6.1 -> Visual Studio Registration -> Windows SDK Configuration Tool
을 사용하여 Registry에 등록한다.
그러면
HKCU (HKEY_CURRENT_USER) /Software/MicroSoft SDKs/Windows/CurrentInstallFolder
에 다음과 같이 경로가 잡힌다.
C:\Program Files\Microsoft SDKs\Windows\v6.1\
이것은 HKLM (HKEY_LOCAL_MACHINE)/Software/MicroSoft SDKs/Windows/CurrentInstallFolder
에서도 동일하다.
해당 키값은 동일한 값으로
HKCU (혹은 HKLM) /Software/MicroSoft SDKs/Windows/v6.1/InstallationFolder
를 살펴봐도 마찬가지다.
한편 이전 버전의 SDK가 깔려 있을 경우 다음을 살펴봐야 한다.
MicroSoftSDK/InstallationSDKs/....../InstallationFolder
여기에는 이전 버전의 SDK 경로가 잡혀 있다.
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\
그러므로 어느 SDK를 사용하는지 알아야 한다.
이것을 아는 방법은 Visual C++ 2008에서
c:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat
혹은
c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat
를 보고 알 수 있다.
여기를 보면 SDK의 경로가 어떻게 설정되어 있는지 볼 수 있다.
:GetWindowsSdkDir
@call :GetWindowsSdkDirHelper HKLM > nul 2>&1
@if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1
@if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\
@exit /B 0
:GetWindowsSdkDirHelper
@SET WindowsSdkDir=
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO (
if "%%i"=="CurrentInstallFolder" (
SET "WindowsSdkDir=%%k"
)
)
@if "%WindowsSdkDir%"=="" exit /B 1
@exit /B 0
그런데 경로를 잘 모를 수 있으므로 정확한 경로를 파악하는 방법은
시작->프로그램->MicroSoft Visual Studio 2008->VisualSudioTools->Visual Studio 2008 Command Prompt
에서 다음과 같이 환경변수를 나타나게 하면 알 수 있다.
echo %WindowsSdkDir%
이것의 실행 결과는 다음과 같다.
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>echo %WindowsSdkDir%
C:\Program Files\Microsoft SDKs\Windows\v6.1\
이렇게 SDK 경로가 정확하게 되어 있음을 확인되었음에도 제대로 컴파일이 안된다면 다음의 문제이다.
Visual Studio IDE 에서
도구->옵션 클릭한다.
플랫폼 Win32 , "다음파일의 디렉터리 표시"에서 "실행파일"로 되어 있고
$(WindowsSdkDir)\bin
이 등록되어야 한다.
만일 DirectX SDK도 설치 했다면,
C:\Program Files\Microsoft DirectX SDK (November 2008) 경로도 나타날 수 잇도록 해야 한다. 이 경우에는 환경변수 없이 경로를 직접 입력한다.
경로명은 다음과 같다.
C:\Program Files\Microsoft DirectX SDK (November 2008)\Developer Runtime\x86
해당 경로는 $(WindowsSdkDir)\bin 다음에 나타나야 한다.
다음 "다음파일의 디렉터리 표시"에서 "포함파일"에서 기존 SDK보다 먼저 Microsoft SDKs\Windows\v6.1\이 걸리도록 기존 SDK 위에
C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses
C:\Program Files\Microsoft SDKs\Windows\v6.1\Include
이 나타나도록 해야 한다.
DirectX SDK도 설치 했다면,
C:\Program Files\Microsoft DirectX SDK (November 2008)\Include
를 그 다음에 위치시킨다.
다음 "다음파일의 디렉터리 표시"에서 "라이브러리파일"에서 기존 SDK보다 먼저 Microsoft SDKs\Windows\v6.1\이 걸리도록 기존 SDK 위에
C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib
가 나타나도록 한다.
DirectX SDK도 설치 했다면,
C:\Program Files\Microsoft DirectX SDK (November 2008)\Lib\x86
를 그 다음에 위치시킨다.
이렇게 해주고 컴파일하면 문제없이 컴파일 된다.
참고 http://blog.tinywolf.com/167
Debug 폴더에는 strmbasd.lib 파일이 Release 폴더에는 strmbase.lib 파일이 생성되는데
|
|
|
|
이 파일들을 C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib 폴더에 복사한다.
ffmpeg 보다 mencoder가 VirtualDub에서 호환성이 더욱 좋다.
ffmpeg은 FourCC Copy 에서 문제를 일으킴 최신 mplayer가 기존 문제점을 거의 없앴음
mplayer input.tp -ovc copy -oac copy -noskip -ffourcc MPEG2 -of avi output.avi
mencoder input.tp -ovc copy -oac copy -noskip -ffourcc MPEG2 -of avi -o output.avi
ipod Video Contents
d:\Transfer\200912>mencoder "video[1].flv" -vf scale=640:-10 -ovc x264 -x264encopts bitrate=1500:bframes=0
-oac pcm -of avi -noskip -ofps 30 -o Tango_de_Roxane.avi
and..
d:\Transfer\200912>ffmpeg -i Tango_de_Roxane.avi -vcodec copy -acodec aac -ab 128000 -f mp4 Tango_de_Roxane_ipod.mp4
/******************************************************************************\
* Constants.
\******************************************************************************/
/* The representation of the value zero. */
#define JAS_FIX_ZERO(fix_t, fracbits) \
JAS_CAST(fix_t, 0)
/* The representation of the value one. */
#define JAS_FIX_ONE(fix_t, fracbits) \
(JAS_CAST(fix_t, 1) << (fracbits))
/* The representation of the value one half. */
#define JAS_FIX_HALF(fix_t, fracbits) \
(JAS_CAST(fix_t, 1) << ((fracbits) - 1))
/******************************************************************************\
* Conversion operations.
\******************************************************************************/
/* Convert an int to a fixed-point number. */
#define JAS_INTTOFIX(fix_t, fracbits, x) \
JAS_CAST(fix_t, (x) << (fracbits))
/* Convert a fixed-point number to an int. */
#define JAS_FIXTOINT(fix_t, fracbits, x) \
JAS_CAST(int, (x) >> (fracbits))
/* Convert a fixed-point number to a double. */
#define JAS_FIXTODBL(fix_t, fracbits, x) \
(JAS_CAST(double, x) / (JAS_CAST(fix_t, 1) << (fracbits)))
/* Convert a double to a fixed-point number. */
#define JAS_DBLTOFIX(fix_t, fracbits, x) \
JAS_CAST(fix_t, ((x) * JAS_CAST(double, JAS_CAST(fix_t, 1) << (fracbits))))
DLL 에서 각종 문제가 발생하면
Dependecy Walker 를 사용하여 DLL Dependency를 체크하면 된다.
e264vfw의 경우 매우 많은 DLL dEPENDENCY를 가지고 있다. (E264Core.dll은 Kernel32.dll/NTDLL.dll 두 개만 의존)
그러므로 많은 경우 여기에서 문제가 발생할 수 있으므로 문제 발생시 해당 컴퓨터에 Depemdency Walker를 사용하여 DLL Dependency를 Check 하면 문제를 해결할 수 있다.
mp4 에서 H.264 비디오 추출하는 법
mp4creator -extract=1 "videoplayback[1].mp4" test_720p.264
트랙 번호를 알아야 한다.
D:\zTemp_dir\HD_Files>mp4info "videoplayback[1].mp4"
mp4info version 1.6.1
videoplayback[1].mp4:
Track Type Info
1 video H264 High@3.1, 345.246 secs, 1997 kbps, 1280x720 @ 29.969934 fps
2 audio MPEG-4 AAC LC, 345.233 secs, 128 kbps, 44100 Hz
D:\zTemp_dir\HD_Files>mp4creator -extract=1 "videoplayback[1].mp4" test_720p.264
최신 VLC 에서 UDP 멀티캐스팅 플레이 하는 방법
udp://@224.1.1.2:3003
DXVA Option을 보면 뜻밖에도 Data들이 예상하지 못한 부분에서 gpu를 쓰고 있음을 알게된다.
DXVA 코덱 옵션 확인할 것.
Digital Cinema
1. Video 는 Image Magic의 Convert(IMConvert) 사용하여 8bit depth를 16bit depth로 전환하면 된다.
2. Audio 는 24 비트, 46 바이트 헤더, 48KHz 의 3가지를 반드시 지켜야 한다.
44.1 -> 48 KHz Resampling은 Golden Wave를 통해 쉽게 해결할 수 있으며 또는 만들어도 된다.
ffmpeg에서 mp4 (3gp등등 ...) 파일에서 h264 만 뽑기
ffmpeg -i VID_20110124_225812.3gp -vcodec copy -vbsf h264_mp4toannexb -an out.h264
Image Magic Option
sprintf_s(csParams, FileNameLength, "%s -depth 16 -colorspace XYZ %s", infile, outfile);
최신 VLC에서 UDP 멀티캐스팅 스트리밍
UDP Legacy 에서 224.1.1.2:3003
트랜스코딩은 (옵션은 선택하지 않는다 : MPEG VIdeo + MPEG Audio)
마지막 페이지에서 Element Stream 재생 체크 + SAP 어나운스 체크
이렇게 까지 해야 된다.
C Compile 할때 Project 혹은 Header File에 문제가 있는 것은 (예를 들어 에러가 100개 생기는 경우)
Header File의 순서에 문제가 있는 것이다.
높은 Priority를 갖는 헤더 파일을 위에 두면 컴파일은 문제 없이 된다.
NVIDIA GPU
1. 클라우드 컴퓨팅 지원
- NVIDIA GPU에 클라우드 컴퓨팅에 맞게 그래픽 가속 기능이 있음 VID (Virtual Desktop Infrastructure) Quadro가 되면 클라우드 컴퓨팅 환경에 맞는 그래픽 가속 기능으로 보다 빠르게 가상머신을 실행 시킬 수 있도록 함 (가장 강력한 기능이 가상 데스크톱임)
2. Maximus GPU = Teslar + Quadro
- e264 64bit OS에 설치하는 방법
32비트 이므로 Windows\SysWOW64\ 밑에 설치되어야 한다.
INF 파일을 잘 만들면 되고 현재 INF를 사용하면 된다.
ntamd64 부분을 통해 Registry도 WOW6432node 에 일단 등록되어야 한다.
64비트 OS 등록 부분을 잘 만든 다음에도 코덱이 보이지 않으면
DLL 종속성 문제로 이것이 제대로 올라오지 않아서 이다,
따라서 e264의 경우에는 libguide40.dll, libio5mp.dll, libmmd.dll 3개의 32비트 버전 파일을 SysWOW64 폴더에 카피하고 다시 설치하면 된다.
INF 파일의 설치와 제거는 64비트 버전에서는 Sys64WOW\RunDLL32.exe 를 사용하여 설치해해야 한다. 이 부분도 다 만들어져 있다.
DefaultInstall을 통하면 WIndows 버전을 보고 INF를 분석하여 적절하게 설치된다.
Setting of Daumpot player for 4K Monitor
1. Rebderer
VMR9 DirectX Renderer is an optimal choice.
2. Decoder
Choose DXVA decoder and in the left windows
Set the decoder of H.264/AVC to NVIDIA H.264 Decoder.
이랬을 때 가장 잘 된다.
Default는 Intel Quick Sync Decoder 이므로 이를 바꿔준다.
RedOne R3D 파일 읽어들이는 법
http://arenafilm.hu/alsog/vdr3d/
여기에서 VirtualDub 용 plugin 즉, R3D.vdplugins 를 32비트 virtualdub의 경우 plugins32 에 64비트의 경우 plugins64에 넣으면 된다. 만일, pluins32/64 폴더가 없으면 manually 만들면 된다. 그러면 filter 필요없이 Open AVI 에서 자동적으로 읽어들일 수 있으며 Open AVI 메뉴를 띄울 경우 좌측하단의 Ask for extended options after this dialog 를 체크하여 반드시 Full-resolution으로 만들어야 한다.
입력 plugin은 plugins 폴더에 넣으면 된다. virtualdub plugins 를 검색하여 여러가지 파일들 특히 mp4를 직접 불러들일 수 있다. 현재 1.9.9 에 세팅 되어 있다.
VirtualDub 관련 유용한 파일들은
http://www.videohelp.com/tools/Virtualdub
에서 다운 받을 수 있으며
VDubbatcher 를 통해 Vdub 작업을 Batch 파일로 할 수 있다.
ping 안될 때
- inbound ping 이 방화벽에 막혀 있어서임
제어판-관리도구-고급보안 Inbound Rule에서 Enable Rule 하면 된다.
배치파일을 사용하여 ImageMagic 의 Converter 를 통해 Post Processing
@echo off
SET CNT=1
FOR %%A IN (.\RED_test_01\*.tiff) do (CALL :CONVERTIMG)
GOTO :EOF
:CONVERTIMG
SET COUNTERSTR=00000%CNT%
SET INFILE=.\RED_test_01\RED_test_%COUNTERSTR:~-4%.tiff
SET OUTFILE=.\RED_test_01\out\OUT_%COUNTERSTR:~-4%.tiff
SET CMATRIX="1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525"
REM IMConvert %INFILE% -alpha Off -gamma 0.384615 -color-matrix "1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525" -gamma 1.25 -set colorspace sRGB -depth 8 %OUTFILE%
IMConvert %INFILE% -alpha Off -gamma 0.384615 -color-matrix %CMATRIX% -gamma 1.25 -set colorspace sRGB -depth 8 %OUTFILE%
echo %INFILE% %OUTFILE%
SET /A CNT=%CNT%+1
@echo off
GOTO :EOF
IMConvert RED_test_0001.tiff -alpha Off -gamma 0.384615 -colo
r-matrix "1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525" -gamma 1.25 -set colorspace sRGB
-depth 8 out.tiff
RGB<-> XYZ Matrix
http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
ffmpeg Image Conversion :
ffmpeg -i A012_C021_051607_001_rgb24_24fps_408.avi -f image2 -compression_algo raw .\RED_test_01\RED_test_%4d.tiff
ffmpeg -i .\RED_test_01\out\OUT_%4d.tiff -vcodec rawvideo -pix_fmt bgr24 -f avi -r 24.0 RED_test_01.avi
RED ONE (R3D 변환 방법)
1. VirtualDub 에서 24bit rgb888 color format으로 video 변환
2. ffmpeg : tiff 생성
ffmpeg -i A012_C021_051607_001_rgb24_24fps_408.avi -f image2 -compression_algo raw .\RED_test_01\RED_test_%4d.tiff
3. ColorCorrection.bat 수행
4. ffmpeg : Color 변환된 tiff에서 avi로 재 변환
ffmpeg -i .\RED_test_01\out\OUT_%4d.tiff -vcodec rawvideo -pix_fmt bgr24 -f avi -r 24.0 RED_test_01.avi
이떄, -pix_fmt는 yuyv422를 사용한다.
ffmpeg은 최신 버전이어야 함 2012년 5월 부터 가능함
AVI 에서 깨끗한 h264 bitstream 뽑는 방법
ffmpeg -i R3D_E264_30M_24fps.avi -vcodec copy -f h264 R3D_E264_30M_24fps.264
이렇게 뽑아야 TS가 된다.
wget -r -l1 --no-parent -A "*.exr" http://media.xiph.org/mango/linear-exr/04_5f/
열린 포트 찾는 법 (예 port 21)
netstat -an … 포트와 IP만 보인다.
netstat -ano … 포트와 IP 그리고 PID가 보인다.
-o option이 소켓사용 프로그램의 PID를 보여준다.
PID를 알면 Taskkill 을 사용하여
taskkill /F /PID xxxxx
이렇게 죽인다. /F 옵션은 강제 종료 옵션
포트스캔의 경우 nmap을 사용한다..... 컴퓨터 해킹이 가능하다.
Windows 7 이상에서 winsxs 에 DLL 모듈 추가 하기
그냥 복사해서는 안됨
Visual C++ 에서 New Project -> Other Project ->mergemodule 을 선택한다.
mergemodule 프로젝트에서 ADD 하면 개발자 PC에 설치된 winsxs 모듈들이 나타난다.
필요한 모듈을 ADD 한다.
컴파일 한다. 그러면 msm 파일이 생성된다.
해당 프로젝트에서 New Project로 Setup Project를 생성한다.
필요한 항목을 넣은 다음... 위에서 생성한 msm 모듈을 ADD 하여 포함시킨다.
컴파일 하면 setup.exe 와 setup.msi 가 생성된다.
이것을 해당 PC에서 수행시키면 winsxs에 필요 DLL이 설치된다.
Gimp 에서 투명 레이어 만들기
1. jpg등 투명함이 없는 이미지를 로드한다.
2. 먼저 레이어에서 알파채널을 더한다.
3. 선택에서 색상으로 선택한다.
4. 편집에서 선택된 부분을 지운다.
5. 이미지를 저장한다.
보통 이와 같은 프로세스면 웬만큼은 해결되나 보다 나은 품질을 위해서는 선택이아 레이어->투명도에서 알파채널을 조합하거나 해야 한다.
다수의 파일을 copy 하여 합치는 법
2개나 몇개의 파일의 경우
copy /b 1.avi+2.avi result.avi
폴더 속의 모든 파일의 경우
copy /b .\F0\*.avi result.avi
이렇게 하면 차례대로 result.avi에 copy된다.
위와 같이 된다...
mplayer 계열의 화면 출력은 yuy2 에 맞추어져 있는 관계로 yv12 보다 yuy2 를 플레이 하는데 더욱 적합하다.
같은 콘텐츠를 yv12 대신 yuy2로 했을 떄, 120GB -> 160GB 로 25% 증가했음에도 끊김 없이 사운드까지 잘 재생할 수 있었다.
커맨드창 없이 bat 파일 수행하기
만약, vbs 파일에 WScript 명령을 이용해서 한다면, 아래와 같은 방법으로 커맨드 창이 뜨지 않고 명령을 실행하도록 할 수 있다.
Set WshShell = WScript.CreateObject("WScript.Shell")
wshShell.run "explorer"
Set WshShell = nothing
위에서는, explorer 을 실행시키기 때문에, 별도로 옵션을 주지 않아도 커맨드 창이 뜨지는 않는다.
그러나, 만약, 이 파일에서 배치화일(bat)을 실행시킨다면 커맨드창이 뜨게 되는데, 이때는 뒤에 옵션을 붙여준다.
만약, 실행하려는 파일이 test.bat 라고 하자.
그러면, 아래와 같이 옵션을 주어서 명령을 실행시키면 커맨드 창이 뜨지 않는다.
wshShell.run "test.bat",0,True
ffmpeg : lossless h264 실험결과
c:\WORK\2012\EBU_TestSeq\4K test sequences\rain_fruits>ffmpeg -i 4k_rain_fruits_%4d.dpx -v
codec libx264 -g 1 -crf 0 -threads auto -pix_fmt yuv420p -f avi ..\4K_rain_fruits_lh264_yuv420p
.avi
GOP Size : -g 1 로 하면 전부 I-frame 이다.
crf or qp : 0 이면 lossless 이다.
- threads auto 이면 상태에 맞게 최대 Thread로 인코딩 된다.
I-frame Only가 2 fps 정도로 일반 lossless 보다 속도가 더 빠르다.
4K YUV420P의 경우 약 100Mbps 이다.
Lossless I-Frame Only의 경우 1Gbps, YUV420P는 2.50Gbps 약 2.5배 압축률이다.
속도는 YUV420P는 : 1.2~1.5 fps Lossless I_frame은 2 fps 이다.
편집 테스트 결과 Lossless I-Frame의 편집 속도는 충분히 만족할 만하다.
TSMuxer 2.1 GB 이상 대용량 데이터 지원 가능. _lseeki64 함수와 _telli64 함수를 사용하여 지원 가능... 관련 변수들을 추적하여 64bit로 전부 바꿔주면 됨 . 현재 문제 없음
즉, 저 수준 함수의 경우, 32bit/64bit 모두 지원 가능하며, 굳이 WINAPI 함수를 쓸 필요가 없음 , Multithread도 OpenMP 로 카버됨. 단, tell, lseek 와 같이 파일 내 위치를 알아야 하는 함수의 경우는 문제가 될 수 있음
대용량 h.264 파일의 경우 너무 많은 양의 Null packet이 문제를 일으킬 수 있음.
이 경우 bitio 의 temporal data의 크기가 너무 작아서 발생한 현상임. 이것을 크게 늘려줌으로서 해결 했음. 약 120M 까지는 카버할 수 있을 것으로 파악됨
문제는 이렇게 하니까 너무 Mux 속도가 너무 느려짐. 관련 데이터를 초기에 크게 잡아서 주는 방법론등을 생각하여야 할 것으로 보임
VirtualDub 대용량 데이터 처리 문제
1. 일반적인 경우, 멀티쓰레드를 사용하는 코덱으로 인코딩 하면, io Thread와 코덱 Thread간에 문제가 발생한다. 특히 Virtualdub의 경우는 32비트를 사용하면 32비트 한계 문제에 부딛혀 RGB444 포맷의 4K 영상의 경우 49 frame에서 진행이 되지 않는 문제가 발생한다.
2. 해결책 1. : 64 비트 버전을 사용한다. 그럴경우, VirtualDub 32비트에서 발생하는 문제점이 해결된다,. 그러나 64비트 코덱의 경우 사용할 수 있는 종류가 많지 않다. 특히, lossless H.264를 사용할 수 없기 때문에, Lossless JPEG으로 인코딩 하면 제대로 인코딩 되지 않는다. 64비트는 좋지 않은 해결책이다.
3. 해결책2 : VirtualDub에서 제공하는 AVI Parser를 windows system 디렉토리에 설치한다. VirtualDub 폴더에 있는 auxsetup.exe 에서 VirtualDub AVI Parser를 설치하면 된다. 이경우, 양상은 64비트의 경우와 비슷하지만, 32비트에서 해결이 되며, 따라서, 32비트 코덱을 사용할 수 있다.
4. 양상 : 48의 배수로 인코딩이 정지한다. 이유는 IO Thread와의 동기 문제이다. RGB444 4K의 경우 해당 프레임이 2.1 GB 이므로 여기까지는 Thread를 사용 고속으로 IO를 읽어 들여 메모리에 저장하지만, 그 다음에는 메모리 Management 의 이유로 처리가 이루어질 떄까지 혹은 다른 이유등으로 프로세스가 잠시 멈춘다. 즉, 약 30초간 멈춘다. 즉, VirtualDub Process Cycle이 LibLock 된다. .. Log 파일 정보를 통해 알 수 있다.
mp4creator 대용량 파일 처리 옵션
mp4creator -create=Edit02_avi.264 -rate=23.97 -use64bits -use64bitstime Edit02.mp4
mp4creator -create=Edit02_0110.mp3 Edit02.mp4
mp4 file에서 H.264 copy 형탤호 뽑기 :
ffmpeg -i Edit02_80B.mp4 -i Edit02_0110.ac3 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -map 0:0 -map 1:0 -f avi Edit02_80BnoN.avi
ffmpeg jpeg 2000 다중화
ffmpeg -i 4K_rain_fruits_yuv420p.avi -pix_fmt yuv420p -vcodec jpeg2000 -use_odml 1 -f avi 4K_rain_fruits_j2k.avi
simple 하게 Lossless로 인코딩 된다. FCC mjp2 현재 이것을 제대로 디코딩 할 수 있는 코덱은 Morgan codec 외에 없음 …. Mainconcept 코덱은 AVS를 통해 읽어도 잘 안된다.
snow 코덱 wavelet 기반 놀라운 압축 성능
ffmpeg -i test_yuv420p_31f.avi -pix_fmt yuv444p -vcodec snow -strict -2 -threads auto -f avi test_snow.avi
yuv444 만 현재 가능
Lossless encoding Option
ffmpeg -i test_yuv420p_31f.avi -pix_fmt yuv422p -vcodec huffyuv -q:v 0 -threads auto -f avi -an test_hyuv.avit
*** Sharpen 방법론
http://forum.doom9.org/showthread.php?s=&threadid=84196
보통은 이러한 방법을 사용 resize(x4)-XSharpen-resize(x1)
Visual C++ 2008 CommandLine Compile 방법
%comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat 에 VC 컴파일러를 위한 환경이 있다. 실제로는 각 플랫폼에 해당하는 env 변수를 세팅하도록 되어 있다.
시작위치는
"c:\Program Files\Microsoft Visual Studio 9.0\VC\" 이다..
변수 %comspec%
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
를 의미한다.
따라서...
D:\WORK-2013\HEVC_ETRI\HM10.0\bin\vc9\Win32\Debug>%comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86 수행하면... 오호
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
이런 메시지가 뜬다.
D:\WORK-2013\HEVC_ETRI\HM10.0\build>devenv HM_vc9.sln /build "Release|Win32"
어쨌든 , cmd Link 파일에 다음과 같이 한다.
이렇게 하면 Compile은 다음과 같이 한다.
devenv HM_vc9.sln /build "Release|Win32"
makefile 대신 sln 을 사용하여 컴파일이 된다.
devenv의 컴파일 옵션은 다음과 같다.
/Build Builds the solution or project with the specified solution
configuration. For example "Debug". If multiple platforms
are possible, the configuration name must be enclosed in quotes
and contain platform name. For example: "Debug|Win32".
/Clean Deletes build outputs.
/Command Starts the IDE and executes the command.
/Deploy Builds and then deploys the specified build configuration.
/Edit Opens the specified files in a running instance of this
application. If there are no running instances, it will
start a new instance with a simplified window layout.
/LCID Sets the default language in the IDE for the UI.
/Log Logs IDE activity to the specified file for troubleshooting.
/NoVSIP Disables the VSIP developer's license key for VSIP testing.
/Out Appends the build log to a specified file.
/Project Specifies the project to build, clean, or deploy.
Must be used with /Build, /Rebuild, /Clean, or /Deploy.
/ProjectConfig Overrides the project configuration specified in the solution
configuration. For example "Debug". If multiple platforms are
possible, the configuration name must be enclosed in quotes
and contain platform name. For example: "Debug|Win32".
Must be used with /Project.
/Rebuild Cleans and then builds the solution or project with the
specified configuration.
/ResetAddin Removes commands and command UI associated with the specified Add-in.
/ResetSettings Restores the IDE's default settings, optionally resets to
the specified VSSettings file.
/ResetSkipPkgs Clears all SkipLoading tags added to VSPackages.
/Run Compiles and runs the specified solution.
/RunExit Compiles and runs the specified solution then closes the IDE.
/SafeMode Launches the IDE in safe mode loading minimal windows.
/Upgrade Upgrades the project or the solution and all projects in it.
A backup of these files will be created as appropriate. Please
see Help on 'Visual Studio Conversion Wizard' for more
information on the backup process.
Product-specific switches:
/debugexe Open the specified executable to be debugged. The
remainder of the command line is passed to this
executable as its arguments.
/useenv Use PATH, INCLUDE, LIBPATH, and LIB environment variables
instead of IDE paths for VC++ builds.
To attach the debugger from the command line, use:
VsJITDebugger.exe -p <pid>
Source Insight Compiler Connection
Option -> Custom Commands 혹은 메누 중에서 빈 단추를 누르면 Edit 하겠냐는 창이 뜬다 거기에서 시작한다.
Run 안에 수행할 Compiler 명령이 있는 bat 파일을 써 넣는다. bat파일은 다음과 같이 이루어져 있다,.
echo off
REM For Everytime of compile, a cmd window is called newly.
cd ..\..\build
REM Set an environment of compile with visual c++
REM %comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
call "c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
REM Compile with VC
echo on
devenv HM_vc9.sln /build "Release|Win32"
위에서 Run을 써 넣어 준 다음 Menu 를 눌러서
여기에서 Insert -> OK 하면 된다.
스코프를 벗어난 객체 주시하기
디버깅을 하다 보면 스코프를 벗어난 객체를 계속 주시하고 싶을 때가 있습니다. 하지만 비쥬얼 스튜디오의 조사식 창(Watch Window)에서는 입력한 객체가 스코프를 벗어나면 비활성화가 되어 더이상 값을 확인 할수 없게 되어버리죠. 이 때, 조사식에 주시 하고픈 객체의 포인터를 입력하면, 해당 객체가 스코프를 벗어났더라도 (해당 객체가 살아 있다면) 지속적으로 값을 확인할 수 있습니다.
위 코드를 보면 mHyuna 객체는 이미 스코프를 벗어나 조사식 창에서 비활성화가 되었지만, (CHyuna*)0x0031fe2c 식으로 직접 객체의 주소를 참조하여 스코프를 벗어난 객체의 값을 확인할 수 있습니다
배열값 확인 (특정 영역 배열값 확인)
간혹 매우 큰 크기의 배열을 사용할때가 있습니다. 대략 1만개라고 해보죠. 이 배열 내부의 값을 확인하려면 어떨까요? 1만개의 배열을 일일히 확인하려면 엄청나게 스크롤링을 해야 할 것 입니다.
이럴때 범위식을 사용하여 특정 구간의 값만을 확인하는 방법이 있습니다. 배열명, 범위 식으로 조사식 창에 입력하여주면 그 범위 만큼의 배열만 보여주는 것이죠. 또한 포인터 연산을 통해서 특정 범위 부터의 값도 확인할 수 있습니다.
CRT 라이브러리를 활용한 메모리 누수 탐지
메모리 누수는 항상 골치 거리입니다. 수많은 코드들 중에서 어디서 메모리가 새는지 원인을 찾기도 힘들죠. CRT 라이브러리를 활용하여 메모리 누수 지점을 찾기 위한 방법이 있습니다. 먼저 아래와 같이 CRT 라이브러리를 사용하기 위한 헤더를 선언 해줍니다. 그리고 메모리 누수 체크를 위한 플래그를 선언 해줍니다( _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); ).
위 코드를 보시면 일부러 char[8] 만큼의 메모리를 할당 해주고, 해제를 안하고 있습니다. 이 코드를 실행시키면 아래와 같이 출력 창에서 메모리 누수가 탐지 되었다는 메시지가 나타납니다.
출력창 메시지에서 빨간 네모 박스의 숫자를 잘 기억해두세요. 이 것이 메모리가 누수되는 위치를 가리키고 있는 값입니다. 이제 이 값을 이용해 메모리 누수 위치를 찾아보도록 하겠습니다.
우선 프로그램 아무 곳에나 중단점을 걸고 디버깅 모드로 들어갑니다. 되도록 이면 프로그램의 시작 점에 거는 것이 좋습니다. 디버깅 모드에 들어갔으면 아래와 같이 조사식 창에 {,,msvcrXXXd.dll}_crtBreakAlloc 을 입력해줍니다. 여기서 XXX는 비쥬얼 스튜디오 버전을 적어줍니다. 2008일 경우 msvcr90d.dll, 2010일 경우 msvcr100d.dll, 2012 일 경우 msvcr110d.dll 입니다.
조사식 창에 위의 구문을 입력하면 처음에는 값이 -1로 나올 것입니다. 여기에 출력창에 나왔던 메모리 누수 위치값을 입력해줍니다. 위의 예제에서는 108 이죠. 그 다음 F5를 눌러 프로그램 실행을 재개합니다.
그러면 어디선가 중단점이 걸립니다. 이제 콜스택을 확인해봅니다.
중단점이 걸린 곳은 msvcr110d.dll 모듈입니다. 이 부분은 디버깅을 위한 곳이니 신경 쓰지 마시고, 밑으로 따라 내려가 보시면 실제 작업 영역 호출 부분이 있습니다. 이 곳으로 따라 가보면...
짜잔~ 메모리를 할당하고 해제 하지 않은 부분을 찾아냈습니다. 이렇게 CRT 라이브러리를 이용하여 메모리 누수 원인을 찾아 낼수 있습니다.
값이 변경 되는 위치 찾기
디버깅을 하다보면 특정 변수가 어디서 값이 변경 되는 지를 알고 싶을 때가 있습니다. 변수를 사용하는 곳을 전부 검색하여 중단점을 걸어서 볼수도 있지만 데이터 중단점 기능을 이용하면 값을 변경 하는 곳을 손쉽게 찾을 수 있습니다.
먼저 추적 하고 싶은 데이터의 주소를 파악합니다.
그 다음 비쥬얼 스튜디오의 디버그 -> 새 중단점 -> 새 데이터 중단점을 선택합니다. 여기에 위의 데이터 주소 값을 입력 해줍니다. 타입의 크기 값에 주의 합니다.
중단점을 추가 한 후, F5를 눌러 실행을 재개합니다. 그러면 어디선가 해당 데이터가 값이 변경 되면 아래와 같이 중단점이 작동하게 됩니다.
위의 예제에서는 SexyUp 함수에서 해당 데이터를 변경하는 것을 알아냈습니다.
DLL 컴파일 시 문제가 되는 경우
1. 보통 Static Library를 사용하여 DLL을 만들려고 하면 LINK error가 발생한다.
이것은 Satatic Library용 libxxx.lib 와 DLL용 msvcrxx.lib 와의 충돌때문인데, Link error 메시지를 보고 Satatic Library용 libxxx.lib 를 LINK할때 해제하면 된다.
LINK->Input 에서 Ignore Specific Library에서 libcmt.lib를 해제하였다.
1.1 Link2005 에러의 경우
2. Static Library가 Import 되지 않는 LINK 에러의 경우
DLL이 다수의 Static Library를 사용하여 Import 할 경우 …. “USE Libray Dependecy Inputs” yes 로 되어 있어야 한다.
3. VS2010 에서 DLL 만들기
VS 2008 보다 훨씬 어렵다. 링크 에러가 수시로 일어나며 이를 일일이 하니씩 추적하며 만들어야 한다.
3.1 기본 Concept
다중 Thread DLL은 기본적으로 MSVCRT.lib (C 라이브러리)와 MSVSPRT.lib (C++ 라이브러리)를 사용한다. 따라서, 이에 대응하는 정적 라이브러리인, LIBCMT.lib와 LIBCPMT.lib를 제외시켜야 한다.
그 다음, TDllEncoder에 종속되는 static 라이브러리들인, TLibCommon, TLibEncoder, TLibVideoIO (이것은 안해도 된다), TAppCommon 을 다중 Thread DLL로 맞추어야 한다.
VS2008에서는 이럴 필요가 없었으나, VS2010은 이렇게 해야 한다.
물론, TDllEncoder 에서는 VS2008에서와 마찬가지로 “USE Libray Dependecy Inputs” 이 Yes 로 되어 있어야 한다.
이럴때만 정상적으로 DLL이 나온다.
단, 종속 라이브러리들을 DLL 형식으로 만들경우, static library를 사용하는 TAppEncoder 는 링크에러가 난다. 따라서 TAppEncoder를 만들고자 할 경우에는 다시 4개의 종속 라이브러리들을 멀티쓰레드 static으로 바꾸어 주어야 한다.
다중 메모리 Allocation 할때 주의할 점
int ** em_tmm;
1. 첫번째 메모리 할당시
em_tmm = (UInt **)_aligned_malloc(ETRI_VER_nSAD * sizeof(Int *), 32);
Int * 의 사이즈로 메모리를 할당해야 한다. 그래야 안정적이다. 32비트에서는 Int *과 Int의 사이즈가 같지만 64비트에서는 size(int)=32 < size(int *)=64 이므로 이렇게 하지 않으면 위험하다.
2. 두번째 이하 메모리 할당시, 실제 두번째가 마지막이면 이렇게 하고 마지막이 아니면 위와 같이 size(int *)를 잡아야 한다.
em_tmm[0] = (UInt *) _aligned_malloc(ETRI_VER_nSAD * ETRI_HOR_nSAD* sizeof(Int), 32);
for (j=1; j<ETRI_VER_nSAD; j++)
em_tmm[j]= em_tmm[j-1] + ETRI_HOR_nSAD;
이렇게 잡아야 연속적으로 메모리가 잡힌다.
----- 자바 설치 문제
오래 되어서 ms java부터 설치했는지 oracle java부터 설치했는지는 기억이 나지 않지만,
현재 etriware 접속해서 쓰는 윈도우 컴퓨터에서 freemind, staruml 같은 java 응용 프로그램도 잘 쓰고 있습니다.
etriware는 브라우저 내에서 java를 씁니다.
정확히는 브라우저에서 쓰이는 java가 ms java이어야만 etriware가 제대로 동작을 하지요.
요즘의 oracle java jre(32bit)는 제어판 메뉴를 통해서 "브라우저의 java 콘텐츠 사용"을 끌 수 있습니다.
저 옵션 on/off와는 무관하게 os 상에서 .jar 확장자 파일은 oracle java jre에 의해서 정상적으로 실행이 됩니다.
따라서 브라우저에서 실행되는 oracle 자바 프로그램만 포기하시면,
ms java와 oracle java jre를 하나의 윈도우에 동시에 설치해서 사용하실 수 있습니다.
단, os가 64비트이더라도 oracle java jre는 32비트 버전으로 설치하시기 비랍니다.
1. Boost Library 설치법
1.1 설치 exe 파일을 실행한다.
보통 c:\local 에 설치된다.
1.2 bootstrap.bat 를 수행한다.
시간이 걸린 후 b2.exe 와 bjam.exe 가 생성된다.
1.3 b2를 사용하여 built 옵션을 주어 build 한다.
보면 MPI 관련 라이브러리가 있음을 알 수 있다.
그런데, 현재 옵션에서는 Skipping 되어 있다 관련 라이브러리의 Add-On은 해당 지침을 따른다.
보다 자세한 빌딩 옵션은
http://www.boost.org/libs/python/doc/building.html
을 참조한다.
64비트 설치
C:\local\boost_1_54_0>b2 toolset=msvc-9.0 variant=debug,release link=static threading=mult
i address-model=64 runtime-link=static
32비트 설치
C:\local\boost_1_54_0>b2 toolset=msvc-9.0 variant=debug,release link=static threading=mult
i address-model=32 runtime-link=static
Visual C++ 8.0 : msvc-9.0
Visual C++ 2010 : msvc-10.0
Visual C++ 2012 : msvc-11.0
무엇보다 c++ Standard Library 버전에 차이가 잇을 듯.
컴파일이 끝나면 다음과 같이 include 파일과 Linker Library Path를 알려준다.,
그 다음 CPP 프로젝트 에서
Include 파일과 링커를 맞춘다.
먼저 Include의 경우는
생성한 프로젝트 ->Properties->C/C++ ->General ->Additional Include Directories
에서
c:\local\boost_1_54_0 로 맞춤
Linker의 경우는
생성한 프로젝트 ->Properties->Linker ->General ->Additional Library Directories
에서
c:\local\boost_1_54_0\stage\lib 로 맞추어야 하나, Thread Library의 경우는 거기 있지 않고
c:\local\boost_1_54_0\lib32-msvc-9.0 에 있다. 여기에 맞추어 줘야 한다.
64비트의 경우는
c:\local\boost_1_54_0\lib64-msvc-9.0
그리고 threadpool package를 받아 해당 package의 boost 폴더를 boost_1_54_0 의 boost 로 카피한다. 그러면 boost 폴더에 threadpool.hpp 가 깔리고 추가로 threadpool 폴더가 생성된다.
여기에 task_adaptor.hpp 앞에
#include <boost/version.hpp>
#if BOOST_VERSION < 105000
#define TIME_UTC_ TIME_UTC
#endif
로 놓고 내부에서 TIME_UTC 를 TIME_UTC_ 로 고치거나 반대로 한다.
2013.10.25
1. 함수 포인터 in C++
C++에서의 함수 포인터는 C에서의 함수 포인터와는 달리, Class Scope, Static 함수 사용등에 따라 매우 주의 깊게 사용되어야 에러가 없다.
1. 1 Class 밖에서 함수 포인터를 정의하고 이 함수 포인터가 Class의 함수를 지정할 때, 다음과 같다.
class TestFunctions;
// for function pointer
typedef void (TestFunctions::*FpFunc)(int* );
typedef struct __ThreadData
{
int InputData;
int OutputData;
HANDLE mevent; //Event
bool bWork;
TestFunctions* m_pcTF;
FpFunc s_pf;
}ThreadData;
. . . . . . .
class TestFunctions
{
public:
ThreadPool m_sThreadPool;
ThreadData* m_psThreadData;
ThreadHandles* m_psThreadHandles;
MSGBlock m_sblock;
FpFunc m_fpFunc[MAX_THREAD];
1.2 이 경우 함수가 Class TestFunctions 의 멤버함수 일때, Class 멤버로 함수포인터를 지정할 때는 다음과 같다.
m_fpFunc[0] = &TestFunctions::TestSUMThread_1;
m_fpFunc[1] = &TestFunctions::TestSUMThread_2;
1.3 static 함수가 Class 멤버로 지정된 함수 포인터를 사용하려 할 때는 다음과 같이 해야 한다.
함수 포인터는 ThreadData 구조체의 멤버로서 정의되었다고 가정하자, 즉,
pParam->s_pf = m_fpFunc[0] … 이런 식으로.. 즉, pParam 구조체가 언제 데이터를 가지느냐에 따라, 함수포인터의 인자가 결정된다고 생각하자.
void TestFunctions::WorkerThreadFunction(ThreadData* pParam) //함수는 static 으로 정의 됨
{
bool WorkCondition = true;
int sValue, *iValue = &sValue;
TestFunctions* Lm_pcTF = pParam->m_pcTF;
while(WorkCondition)
{
Lm_pcTF->Synchro_Event(pParam);
WorkCondition = pParam->bWork;
sValue = pParam->InputData;
(Lm_pcTF->*pParam->s_pf)(iValue);
_tprintf(_T("InputData: %d \n"), sValue);
}; // while(WorkCondition)
Lm_pcTF->Set_Event(pParam);
}
즉, Class를 지정하는 어떠한 형식의 인자라도 정의되면
예를 들어
TestFunctions* Lm_pcTF
TestFunctions Lm_cTF
둘 중하나가 지정되어 있다면
함수 포인터는 다음과 같이 사용해야 한다. (예를들어 함수 포인터가 m_fpFunc[0] 이라면)
(Lm_pcTF->*m_fpFunc[0])();
(Lm_cTF::*m_fpFunc[0])();
즉, 함수포인터의 Scope를 Class 멤버라는 것으로 확실하게 지정해 주어야 static 함수 에서 문제 없이 컴파일 된다.
2. Threadpool
Threadpool은 Thread를 먼저 생성 시키고 Thread 내부는 while 문으로 무한하게 동작하지만, 조건에 따라 실제 함수를 동작하고 그 결과 값을 리턴하게 만드는 것이 목적이다.
이를 통해, Thread 생성에 따른 오버헤드를 줄이고 Thread의 생성과 소멸 없이 계속 재 사용할 수 있게 만드는 것이 목적이다.
Mutex와 Event를 통해, Thread간 데이터를 주고 받도록 하는 것이 목적이다.
Mutex는 메인 Thread와 Sub Thread와의 동기화를 위해서 (Main Thread에서 파생된 모든 Sub Thread가 동기화 된다.)
그리고 Event는 메인 Thread와 Sub Thread 간의 데이터를 주고 받는 것을 시그널링 하기 위해 사용된다.
int main()
{
TestFunctions m_cTF, *m_pcTF = &m_cTF;
m_cTF.InitialDataSetting(&m_cTF.m_sThreadPool);
m_cTF.InitThread();
// Data Setting
{
m_cTF.Synchro_Mutex(); //Mutex를 기다려서 모든 쓰레드를 동기화 시킨다.
m_cTF.SetThreadData(0, false, 10);
m_cTF.Set_Event(&m_cTF.m_sThreadPool.workerThreadData[0]);
m_cTF.SetThreadData(1, false, 20);
m_cTF.Set_Event(&m_cTF.m_sThreadPool.workerThreadData[1]);
m_cTF.Release_Mutex();
}
// Thread Working
// Data Acqusition
{
HANDLE hEVENT[MAX_THREAD];
m_cTF.Synchro_Mutex();
for(int k=0; k<MAX_THREAD; k++)
hEVENT[k] = m_cTF.m_sThreadPool.workerThreadData[k].mevent;
WaitForMultipleObjects(MAX_THREAD, hEVENT, true, INFINITE); 모든 이벤트를 기다린다. 끝내려고
_tprintf(_T("ThreadFunction[0] Output: %d \n"), m_cTF.m_sThreadPool.workerThreadData[0].OutputData);
_tprintf(_T("ThreadFunction[1] Output: %d \n"), m_cTF.m_sThreadPool.workerThreadData[1].OutputData);
m_cTF.Release_Mutex();
}
// Final
m_cTF.CloseThread();
printf("\n");
printf("Test is finished \n");
return 0;
}
이를 위한 데이터 구조체의 형식은 다음과 같다.
typedef struct __ThreadData
{
int InputData;
int OutputData;
HANDLE mevent; //Event
bool bWork;
TestFunctions* m_pcTF;
FpFunc s_pf;
}ThreadData; EVENT는 서로 Sub Thread간에 서로 달라야 한다.
typedef struct __ThreadHandles
{
HANDLE hThread;
DWORD idThread;
}ThreadHandles;
typedef struct __ThreadPool
{
ThreadHandles* workerThreadList;
ThreadData* workerThreadData;
}ThreadPool;
typedef struct __msg_block
{
HANDLE mutex; //mutex Mutex는 거의 전역으로 사용되어야 한다.
}MSGBlock;
class TestFunctions
{
public:
ThreadPool m_sThreadPool;
ThreadData* m_psThreadData;
ThreadHandles* m_psThreadHandles;
MSGBlock m_sblock;
FpFunc m_fpFunc[MAX_THREAD];
기존 Project 구조 유지하며 새 프로젝트 더하기
l. 일단 기존 솔루션에서 프로젝트를 만든다.
디렉토리를 맞추어 생성하면 대체로 다음과 같게 된다.
d:\WORK-2013\HEVC_ETRI\HM10.0\build\vc9\ 에 TAppMultiEncoder 를 생성하는 경우이다.
이 경우, 상위 Solution의 sln 은 그대로 변경 없이 존재하면서 하위 폴더인 d:\WORK-2013\HEVC_ETRI\HM10.0\build\vc9\ 에 TAppMultiEncoder 가 생성된다.
따라서, TAppMultiEncoder 를 충돌 없이 잘 없애 주는 것이 관건이다.
잘 정의된 솔루션인 TAppEncoder_vc9 솔루션의 프로젝트를 살펴 보면 다음 그림과 같다.
(Project Properties->General->Output Directory->Edit ->Macro 를 통해 살펴볼 수 있다)
이때 Input Directory를 보면
Output 디렉토리와 Project 디렉토리 를 살펴보면
이를 지금 만들어진 디렉토리와 비교해보면
Input Directiry, Input Path, IntDir 이 다르다. (그림은 TAppMultiEncoder 의 디렉토리이다.)
한편 Output과 Project Directory를 비교해 보면
OutDir/ ProjectDir/ProjectPath 가 다르다.
또한 TargetDirectory, Target Path 도 다르다.
실행 파일 이름등 잔잔한 다른 것들도 다른 것들이 있다. 그러나 전체적인 구조를 맞추기 위해서 가장 중요한 것은 Input File Name/Input Name/Project File Name 과 Safe File Name 이다.
즉, “ _vc9” 이 붙는 것이 중요하다.
Input 관련 세팅을 바꾸기 위해서는 먼저 헤더 파일과 CPP 파일을 덧 붙여 일단 프로젝트가 구동 가능하게 만들어야 한다.
*.sln (Solution 파일) 에서 다음과 같이 Path와 vcproj 이름을 변경한다.
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TAppMultiEncoder", "vc9\TAppMultiEncoder_vc9.vcproj", "{F8B7B6EF-3632-490E-99D6-3A3C8FF1678D}"
그리고 해당 폴더에 TAppMultiEncoder_vc9.vcproj 및 TAppMultiEncoder_vc9.vcproj.jinwuk-PC.jinwuk.user 를 넣어준다.
Inherit from parent or project defaults 가 체크 되어 있으므로 자동으로 해당 프로젝트들의 이름들이 바뀐다.
변경되는 디렉토리는 Input Directiry, Input Path, ProjectDir, ProjectPath 가 자동으로 변경되며 Input File Name, Input Name, Project File Name 과 Safe File Name 아 자동으로 변경된다.
한편 IntDir 은 Intermediate Directory 이기 때문에 Project Property 에서 매뉴얼하게 변경해야 한다.
TAppEncoder 프로젝트에서 복사해서 넣어준다.
(이전) $(ConfigurationName)
(변경) $(SolutionDir)\vc9\$(PlatformName)\$(ConfigurationName)\$(RootNamespace)
이렇게 되면
가 된다.
OutDir의 경우는 Configuration Properties->General 에서 찾아 보면 된다.
여기서 $(SolutionDir)$(ConfigurationName) 에서
$(SolutionDir)\..\bin\vc9\$(PlatformName)\$(ConfigurationName)
로 변경한다.
이것으로 Target Path의 까지 변경된다. Target Name은 Linker->General->Output File에서 변경한다.
추가로 C/C++ 에서
Additional Include Directory를
"$(SolutionDir)\..\source\Lib\";"$(SolutionDir)\..\compat\msvc"
로 해준다. 뒤의 것은 DLL 때문이다.
그런데 이렇게 하고 난 다음 파일이 없다고 컴파일이 안되는 경우가 있다. 이 경우에는 변경 전에 프로젝트에 파일을 넣어서 발생한 일이므로 해당 파일을 제거 했다가 다시 넣으면 된다.
Character Set의 경우 Use Multi-Bute Character Set 사용 여부를 체크한다.
Windows Server 2008 에서 ftp 방화벽 열기
1. 고급 보안이 포함된 Windows 방화벽 (시작->관리도구->고급 보안이 포함된 Windows 방화벽)
2. 우측 창에서 인바운드 규칙 -> 새규칙 ->새 인바운드 규칙 마법사 -> 프로그램 선택
3. 다음 프로그램 경로에서 찾아보기 -> windows\system32\ftp 선택
4. 작업 단계에서 연결 허용
5. 프로필에서 모든 규칙이 선택되어야 함
6. 이름에서 “ftp 연결” 이라 하고 마치면 다음과 같이 새로운 인바운드 규칙이 생성됨
SxS 에러 발생시 디버그 방법 (sxstrace 사용)
c:\Jinwuk>sxstrace
WinSxs 추적 유틸리티
사용법: SxsTrace [옵션]
옵션:
Trace -logfile:FileName [-nostop]
sxs에 대한 추적을 사용하도록 설정합니다.
추적 로그는 FileName에 저장됩니다.
-nostop이 지정된 경우 추적을 중지할지 여부를 묻지 않습니다.
Parse -logfile:FileName -outfile:ParsedFile [-filter:AppName]
원시 추적 파일을 사람이 읽을 수 있는 형식으로 변환한 다음 결과를 ParsedFile에 저장
합니다.
-filter 옵션을 사용하여 출력을 필터링합니다.
Stoptrace
아직 추적이 중지되어 있지 않은 경우 추적을 중지합니다.
예: SxsTrace Trace -logfile:SxsTrace.etl
SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt
1. cmd 를 하나 연다. SxsTrace 추적을 시작한다.
2. 어플리케이션을 실행한다.
어플리케이션이 command 창에서 수행되는 것이면, 또 다른 Command 창을 열어준다.
3. 에러가 발생할 때 까지 수행한다.
4. 에러가 발생하여 어플리케이션이 종료하면 SxsTrace 가 실행되는 창에서 Enter를 눌러 추적을 중지시킨다.
5. etl 로그 파일을 Parsing 하여 문제를 추적한다.
Side by SIde 구성이 잘못되어 응용 프로그램을 시작하지 못하는 오류 해결
이벤트 뷰어에 다음과 같은 에러가 뜰 떄
"..."에 대한 활성화 컨텍스트를 생성하지 못했습니다. 종속 어셈블리
Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50608.0"을
(를) 찾을 수 없습니다. 자세한 진단을 위해서는 sxstrace.exe를 사용하십시오.
혹은
이런 에러가 뜰 떄,
SxsTrace를 통해 살펴보면 다음 과 같은 에러가 있다.
활성화 컨텍스트 생성을 시작합니다.
입력 매개 변수:
Flags = 0
ProcessorArchitecture = AMD64
CultureFallBacks = ko-KR;ko;en-US;en
ManifestPath = c:\Jinwuk\HEVC_Encoder_0.dll
AssemblyDirectory = c:\Jinwuk\
Application Config File =
-----------------
정보: c:\Jinwuk\HEVC_Encoder_0.dll 매니페스트 파일을 구문 분석하는 중입니다.
정보: 매니페스트 정의 ID는 (null)입니다.
정보: 참조: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
정보: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" 참조를 확인하는 중입니다.
정보: ProcessorArchitecture amd64에 대한 참조를 확인하는 중입니다.
정보: culture Neutral에 대한 참조를 확인하는 중입니다.
정보: 바인딩 정책을 적용하는 중입니다.
정보: 게시자 정책이 없습니다.
정보: 바인딩 정책 리디렉션이 없습니다.
정보: 어셈블리 검색을 시작합니다.
정보: WinSxS에서 어셈블리를 찾지 못했습니다.
정보: C:\Windows\assembly\GAC_64\Microsoft.VC90.CRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.
정보: c:\Jinwuk\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.
정보: c:\Jinwuk\Microsoft.VC90.CRT.MANIFEST에서 매니페스트를 검색하려고 합니다.
정보: c:\Jinwuk\Microsoft.VC90.CRT\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.
정보: c:\Jinwuk\Microsoft.VC90.CRT\Microsoft.VC90.CRT.MANIFEST에서 매니페스트를 검색하려고 합니다.
정보: culture Neutral에 대한 매니페스트를 찾지 못했습니다.
정보: 어셈블리 검색을 끝냅니다.
오류: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" 참조를 확인할 수 없습니다.
정보: 활성화 컨텍스트를 생성하지 못했습니다.
활성화 컨텍스트 생성을 끝냅니다.
첫번쨰 활성화컨텍스트 내용은 HEVC_Encoder_0.dll dl x64 응용 프로그램이며 특별히 Path를 지정하지 않았기에 ManifestPath와 Assembly Path가 각각 ManifestPath = c:\Jinwuk\HEVC_Encoder_0.dll, AssemblyDirectory = c:\Jinwuk\ 로 되어 있다는 것이다.
하지만, 당연히 해당 디렉토리에는 Manifest와 어셈블리가 없다.
그래서 해당 DLL의 Manifest를 분석하면 일단, Manifest가 없으므로 DLL의 파일 정보를 분석하여 Manifest를 다음과 같이 참조한다.
Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
따라서,일단, OS는 무조건 WinSxS 에서 Microsoft.VC90.CRT 관련 라이브러리를 찾으려 한다.
정보: 어셈블리 검색을 시작합니다.
정보: WinSxS에서 어셈블리를 찾지 못했습니다.
현재 WinSxS에는 관련 라이브러리가 없으므로 당연히 찾지 못한다.
즉 SxsTrace를 보면, Microsoft.VC90.CRT 관련 Sxs 라이브러리가 없는 것이며 해당 라이브러리는 msvcr90.dll (디버그 모드는 msvcr90d.dll) 이다. VC90 에서 컴파일해서 그런 것이며 VC80이면 msvcr80.dll (디버그 모드는 msvcr80d.dll), VC100이면 msvcr100.dll (디버그 모드는 msvcr100d.dll) 이다.
해결책은 세가지가 있다.
일단 배포 패키지를 만들어야 한다는 점에서는 공통적이다.
Visual C++ Redist 패키지를 설치하면 해결이 된다.
하지만, install에서 자동으로 설치되는 것이 훨씬 깔끔하다.
따라서 TDllEncoder_HM101r_x86v09F135.dll 을 설치하는 배포 패키지를 만들어 해결하도록 한다.
Setup Program 만드는 법
1. 필요한 WInSxS 배포 배키지 만드는 법
1. 새 프로젝트를 만든다.
2. New Project->Other Project->Setup and Deployment 를 선택하고 Merge Module Project를 선택한다.
3. 이름을 써주고 프로젝트를 만들면 다음과 같은 프로젝트가 형성된다.
4. Solution explorer 에서 MergeModule 프로젝트 이름 ->Add->MergeModule Reference 를 선택한다.
5. 앞에서 살펴본 msvcr90.dll 을 설치하기 위해서 WInSxS 폴더를 배포 프로그램에 넣기 위해 MicroSoft_vc90_CRT_x86_x64를 선택한다. 이 패키지는 C:\Program Files\Common Files\Merge Modules 에서 제공되는 것으로서 Visual Studio 와 관련 SDK 등을 선택하게 되면 관련 시스템 라이브러리들을 포함하는 msm 패키지이다.
이는 Windows의 System 라이브러리 폴더인 c:\Windows\winsxs 과 관련이 있는데, c:\Windows\winsxs 폴더 안에 보면 다음과 같은 시스템 라이브러리들이 있다.
여기에서 Sxstrace 를 통해서 알고 있는 필요한 Sxs 정보는
Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
이므로
amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.210228 …. 을 찾아본다. 해당 Sxs는 본 예제에서는 하나 밖에 없다.
이 폴더는 msvcm90.dll, msvcp90.dll , msvcr90.dll 이 들어 있다.
따라서 앞에서 우리가 설치하고자 하는 시스템 dll 파일이 있음을 알 수 있다.
6. 배포 패키지를 빌드 한다. 필요하면 해당 프로젝트의 Properties->Output File name 에서 Browse 를 통해 출력 파일의 경로를 조절할 수 있다.
2. Setup Program 만드는 법
1. New Project->Other Project->Setup and Deployment 를 선택하고 Setup Project를 선택한다.
2. 이름을 써주고 프로젝트를 만들면 다음과 같은 프로젝트가 형성된다.
3. File System -> Application folder 에서 Add->FIle 을 선택한다.
설치하고자 하는 DLL TDllEncoder_HM101r_x86v09F135.dll 을 선택한다.
그리고 실행 파일인 TDllEncoder_HM101r_x86v09F135.exe도 선택한다.
마지막으로 앞에서 만들어진 시스템 라이브러리 배포 패키지를 Solution Exploere 에서 프로젝트 이름->ADD->MergeModule 을 통해 입력 받는다. 그러면 앞에서 만들어진 MergeModule_HEVC_DLL.msm 이 포함되면서 Detected Dependecy에 자동으로 필요 msm 이 들어가게 된다.
4.폴더는 주어진 폴더를 사용한다. 만약 폴더를 변경하고자 한다면 주의 깊게 변경해야 한다.
5. 해당 프로젝트의 Property를 통해 중요한 Parameter를 수정한다. (TargetPlatform : x86->x64 등)
6. 그 외 관련된 여러 정보들을 보려면 프로젝트 이름->View 를 통해 정보들을 볼 수 있다. 컴파일해서 깨끗하게 빌드 되면 성공이다.
7. Setup 프로그램이 완료된 후 설치시, Windows Server 2008 등에서 간혹 Dotnet Framework 3.5 등이 설치 되지 않은 경우가 있다. 이 경우에는 Windows update를 통해 설치하거나, (3.5/4.5) 혹은 프로젝트->Properties->Prerequissities 를 통해 이부분의 체크를 해제하여 만들 수도 있다. 혹은 필요한 라이브러리의 경우는 체크하여 포함 시킬 수도 있다
그러나 dotnetFramework 3.5는 윈도우 어플 설치를 위해서는 반드시 설치 되어 있어야 한다.
.NetFramework 3.5 를 Windows Server 2008에서 설치하는 법
시작->관리도구->서버관리자->기능->기능추가->.NetFramework 3.5 를 선택하면 설치 가능함
Pointer가 해제 되었는지 해제 되지 않았는지를 체크하는 방법
Windows API 중 IsBadReadPtr
4 out of 7 rated this helpful - Rate this topic
Verifies that the calling process has read access to the specified range of memory.
Important This function is obsolete and should not be used. Despite its name, it does not guarantee that the pointer is valid or that the memory pointed to is safe to use. For more information, see Remarks on this page.
C++
Copy
BOOL WINAPI IsBadReadPtr(
_In_ const
VOID *lp,
_In_ UINT_PTR ucb
);
Parameters
lp [in]
A pointer to the first byte of the memory block.
ucb [in]
The size of the memory block, in bytes. If this parameter is zero, the return value is zero.
If the calling process has read access to all bytes in the specified memory range, the return value is zero.
If the calling process does not have read access to all bytes in the specified memory range, the return value is nonzero.
If the application is compiled as a debugging version, and the process does not have read access to all bytes in the specified memory range, the function causes an assertion and breaks into the debugger. Leaving the debugger, the function continues as usual, and returns a nonzero value. This behavior is by design, as a debugging aid.
Bad Pointer이면 True 정상 포인터이면 false 나옴
예제
for (int k=0; k<2; k++){
bool badPtr = IsBadReadPtr(testOutput[k],(MAX_ANNEXB_BUFFER_SIZE * sizeof(char)));
if (!badPtr) _aligned_free(testOutput[k]);
testOutput[k] = NULL;
}
asdasdasㅁㄴㅇㅁㄴㅇ
Sony Raw MXF 보는 법
방법이 없다. 오직 Sony 에서 나오는 Raw Viwer 만 사용해야 한다.
version 2.1.1.0100 으로만 MXF를 변환 시킬 수 있다.
컬러의 경우는 Default Color를 사용하면 까맣게 나온다.
잘 볼 수 있는 방법은
Input Setting -> Color를 REC709 / Tone Curve를 REC709 로 맞추어야 한다.
(HDTV용 Color Space)
다른 더 좋은 컬러가 있을 수도 있다.
Redmine과 Tortoise Subversion 연동
일단, Redmine 내 Subversion과 Tortoise Subversion 이 모두 설치되어 있다고 가정하자.
기본적인 Tortoise Subversion 사용법은 다음을 참고하자.
http://hotcoffee.tistory.com/entry/Tortoise-SVN-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%82%AC%EC%9A%A9%EB%B2%95
Windows 에서 Redmine 사용에 관해서는 다음을 참고하자.
http://nieaunder.egloos.com/viewer/4627054
다음 링크에서 많은 것을 참조할 수 있었다.
http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=1Kqux&fldid=GMj7&datanum=10&openArticle=true&nil_openapi=search
먼저 Subversion Repository를 만든다.
C:/BitNami/Subversion_repo
이 디렉토리 안에서 Create Repository를 수행하면 C:/BitNami/Subversion_repo 가 Repository 가 된다. 하지만,
이때 저장소는
C:/BitNami/Subversion_repo/trunk 로 지정해야 한다. 그래야 연동된다.
그리고 이 trunk에 Tortoise Subversion 을 사용하여 Import 시켰다고 가정하자.
이때 계정을 만들어야 한다. 지금까지 이 과정이 없어서, 계정이 없어서 제대로 연동되지 않았다.
계정은
c:\BitNami\Subversion_repo\conf\passwd
[users]
# harry = harryssecret
# sally = sallyssecret
root = root00
이렇게 추가해 주어야 한다. 좌측이 ID 우측이 pw 이다.
c:\BitNami\Subversion_repo\conf\svnserve.conf
svn server의 conf를 수정해 주어야 한다.
anon-access = read
auth-access = write
password-db = passwd
이렇게 되어야 제대로 동작한다.
명령창에서 등록된 윈도우 서비스 중 redmineSubversion을 내립니다. ( 몰랐는데 sc 라는 명령어도 있네요)
\BitNami Redmine Stack\Subverion\scripts\serviceinstall.bat REMOVE
이렇게 해도 되고
여기서 Stop 시켜도 된다.
다음 Redmine 의 Subversion Config을 수정해 주어야 한다.
c:\BitNami\redmine-2.4.2-0\subversion\scripts\serviceinstall.bat
중간에 보면
"C:\BitNami\redmine-2.4.2-0/subversion\scripts\winserv.exe" install redmineSubversion -displayname "redmineSubversion" -start auto "C:\BitNami\redmine-2.4.2-0/subversion\bin\svnserve.exe" -d --root="c:\BitNami\Subversion_repo" --listen-port=3690
이렇게 만들어 주어야 한다. 이게 가장 중요하다.
다시 redmineSubverion 을 윈도우 서비스로 등록한다.
\BitNami Redmine Stack\Subverion\scripts\serviceinstall.bat INSTALL
혹은
여기서 Start 시켜도 된다.
그리고…
c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\config\configuration.yml
Redmine Config 이다.
이 부분은 별다르게 고칠 필요가 없는 것 같다.
단,
c:\BitNami\redmine-2.4.2-0\scripts\setenv.bat
를 수행하면 다음과 같이 기본 redmine Path가 설정된다.
set PATH=C:\BitNami\redmine-2.4.2-0/git\cmd;C:\BitNami\redmine-2.4.2-0/DevKit\bin;C:\BitNami\redmine-2.4.2-0/DevKit\mingw\bin;C:\BitNami\redmine-2.4.2-0/sqlite;C:\BitNami\redmine-2.4.2-0\imagemagick;C:\BitNami\redmine-2.4.2-0\ruby\bin;C:\BitNami\redmine-2.4.2-0/subversion\bin;C:/BitNami/redmine-2.4.2-0/php;C:\BitNami\redmine-2.4.2-0/mysql\bin;%PATH%
보면 subversion의 경우는 path가 설정되나. Git은 설정되지 않은 것을 알 수 있다.
rem ##### GIT ENV #####
에서 추가로 설정하는 것이 좋다.
Redmine에서 Tortoise Git 설정
1. Tortoise Git을 설치한다. Windows Git은 설치할 필요가 없다. Redmine을 연결하여 사용하면 된다.
2. Redmine 설정에서 Git 경로가 제대로 잡혀있지 않다. redmine의 c:\BitNami\redmine-2.4.2-0\scripts\setenv.bat 에 Path를 잡아주거나 설정에서 아예 Git.exe 경로를 잡아주던가 해야 한다.
3. 그 다음에는 정상적인 Git Repository를 만들어야 한다. Git 은 ServeVersion 과 달리 맨 처음에 GitHub 혹은 Google 등에서 Origin을 만들고 이것의 Clone 을 만들어서 저장소와 연결하는 방식을 사용한다.
4. Git 설치 방법은 다음 사이트를 참조한다.
http://dikafryo.kr/entry/github-사용법
http://dikafryo.kr/entry/github-사용법-24-TortoiseGit-설치
http://dikafryo.kr/entry/github-사용법-34-SSH접속을-위한-비밀Key-생성-및-공개키-등록
http://dikafryo.kr/entry/github-사용법-44-github-저장소-만들기-및-원격-저장소에-데이터-저장
비밀 키는 현재
c:\BitNami\Git_Repository\GitKey\mygitkey.ppk
에 저장되어 있다.
5. Git 은 Repository를 만든 다음 맨 먼저 GitHub에서 Pull을 수행해야 한다. 그래야 상호 연동이 준비되고 그 다음에 Push를 해야 정상적인 Push 가 된다.
6. 이상이 되고 나면 저장소를 Bare 저장소로 지정하면 Git을 저장소로 사용할 수 있다.
c:\BitNami\Git_Repository\General_Project\test_Git\.git
Bare 저장소는 .git 이다.
Redmine Plugin 설치
c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins\
에 설치한다.
만일 “redmine_code_review” 라는 plugin 이 있다면 해당 폴더를 plugins 에 복사한다.
1. MySQL Database 는 켜고 나머지 서버는 중지한다. (특히 Apache)
2. 다음을 선택한다 “Shift” 를 누르고 선택하여 가급적 관리자 권한으로 선택한다.
3. 다음 폴더로 이동한다.
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs
4. 이곳에서 다음 명령을 수행한다.
ruby bin\rake redmine:plugins:migrate RAILS_ENV=production
Linux 와는 다르게 ruby 는 전체 Redmine 폴더에서 수행 가능하나, rake의 경우는 전체에서 수행가능한 버전은 0.9.2 이며 plugin 설치를 위한 10.0.1 은
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\bin
밑에 있으므로 이렇게 수행시켜야 한다.
5. 다시 서버들을 켜고 redmine을 수행한다.
6. plugin을 지울 때는 다음과 같다.
Bitnami Redmine stack 사용 cmd를 수행시키고 마찬가지로 다음 폴더로 이동한다.
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs
7. 여기에서 다음 명령을 수행한다. (plug-in 이름이 redmine_code_review 일 경우)
ruby bin\rake redmine:plugins:migrate NAME=redmine_code_review VERSION=0 RAILS_ENV=production
ruby bin\rake redmine:plugins:migrate NAME=redmine_ckeditor-master VERSION=0 RAILS_ENV=production
8. 해당 플러그인을 지운다.
9. 다시 앞의 명령을 수행한다.
ruby bin\rake redmine:plugins:migrate RAILS_ENV=production
10. 서버를 켜고 레드마인을 재 수행한다.
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins>bundle install --without development test
1. MySQL 만 켜도 나머지 서버는 모두 중단한다.
2. 다음 폴더에서 작업한다.
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs
C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins\redmine_ckeditor>
bundle install --without development test
c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\vendor\bundle\ruby\1.9.1\gems\rake-10.1.0\bin\rake
c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\vendor\bundle\ruby\1.9.1\gems\rake-10.1.0\bin\rake
redmine:plugins:migrate
RAILS_ENV=production
CKeditor 설치 실패기
http://redmine.or.kr/boards/4/topics/225?r=226
Daum
Pot Player에서 WebDaV로 콘텐츠 보기
호스트에서 IP를 적어준다. 혹은 다음과 같이 http:// 없이 주소를 적어준다.
반드시 WebDav Port를 확인해야 한다.
그리고 로컬에서 방화벽을 열어줘야 한다.
UTF8의 경우 파일 명의 한글이 깨질 경우 check를 해제한다.
Local
컴퓨터에 Git Server 만들기
http://composite.tistory.com/40
http://www.codeproject.com/Articles/296398/Step-by-Step-Setup-Git-Server-on-Windows-with-CopS
다음의 3 프로그램을 설치한다.
- Msysgit (server and Client)
- CopSSH (server side)
- PuTTY (server and Client)
현재, MSysgit 과 CopSSH는 서버에 설치되어 있고
Client와 Server 에는 TortoiseGit 이 설치되어 있다고 가정한다. (PuTTY는 TortoiseGit 에 있다)
1. 서버 환경변수에서 다음을 설정해준다.
C:\Program
Files\Git\libexec\git-core
2. CopSSH를 설치한다. Service Account와 Password는 다음과 같다.
Service Account :
SvcCOPSSH
password : root0000
3. CopSSH의 Control Panel을 연다.
4. Users -> Add
5. 컴퓨터에 Access 가능한 User를 Windows 사용자 중 하나를 선택하도록 되어 있다.
나의 경우는 따라서 root를 선택한다.
6. 다음과 같이 세팅되도록 한다. (Linux
Shell은 Windows shell로 바꿀 수 있다)
Apply를
통해 Activation 시킨다. 시간이 걸린다. Activation 되면 다음의 User 창이 뜬다. Keys를 클릭한다.
Key wizard가 뜬다. 다음의 방식대로 수행한다.
Passphrase는 jnwseok21408을 사용한다.
File 이름은 직접 입력이다. Confirm 에서 Apply를
한다.
여기까지 완료하면 다음이 뜬다. c:\Users\root\jnwhome-root_2048.ppk 로 존재한다. Client로
나중에 복사한다.
root@ROOT-PC 는 중요하다.
Git bash 에서
ssh root@ROOT-PC -> root@root-PC pw : root00 -> git
하면 다음과 같이 실패한다.
이는 CopSSH에 제대로 된 Path를 설정하지 못했기 때문이다.
CopSSH의 Service를 Stop 시키고 c:\Program Files\ICW\etc\profile 을 연다.
Git이 위치하는 곳은 다음이므로
C:\Program
Files\Git\bin
C:\Program
Files\Git\libexec\git-core
다음과 같이 profile을 편집한다.
여기에서 export PATH="/bin:$syspath:$winpath:/cygdrive/c/Program Files/git/bin:/cygdrive/c/Program Files/git/libexec/git-core"
와 같이 편집해 준다.
중지된 copSSH를 다시 활성화 시킨다.
다시한번 똑같이 Bash에서 입력해 본다.
양상이 다르다. 정상적인 login 이 된다.
발견된 에러
1. Profile 편집 에러 : Profile 파일에 대한 접근 문제이다. 이 경우, 오직 notepad 만 편집이 가능하다. 그 외의 것으로 할 경우 $’\r’ 에러등이 발생한다. 즉, LF/R 문제가 발생한다.
2. 다음의 에러
서버를 교체하거나, 서버의 아이피 변경으로 인해 기존의 서버의 아이피와 겹칠경우
${HOME}/.ssh/known_hosts
파일에 이전의 정보가 남아있는 바람에 생기는 에러이다.
"에러" 라고 한이유는, 경고라고 해놓고 접속이 안되기 때문이다.
해결 방법은, 위의 파일을 삭제하거나(그러면 다음 접속시 키를 다 받아야 하는 귀차니즘이)
해당 서버의 아이피가 들어있는 줄을 지우면 된다.
|
$ ssh
USERID@SERVER_IP |
정상적이면 이렇게 된다.
TortoiseGit
폴더에서 PuttyGen을 실행한다.
User/root
<- 나의 경우는 root에 발생시켰으므로 … 에
있는 ppk 파일을 Load한다.
Passphrase를
요구하므로 이를 잘 기억하고 있어야 한다.
제대로 되면 이런 메시지가 뜬다.
Saveprivate
key를 수행한다.
다음 이전에 있었던 Git Repository를 Github에 만들던 방식을 차용하여 Git Repository를
만든다.
Github 는 이렇게 되어 있으므로…
https://github.com/Jinwuk/HEVC_Encoder.git
git@github.com:Jinwuk/HEVC_Encoder.git
https://jnwhome.iptime.org/root/ ETRI_HEVC_Git_Home.git
git@jnwhome.iptime.org:root/
ETRI_HEVC_Git_Home.git
README.md 는 그럼에도 잘 add 된다.
주소를 잘못쓰고 origin도 존재해서 발생한 에러다. TortoiseGit에서 origin을 삭제하고 다시 한다.
에러 없이 잘된다.
자꾸 실패한다.
여기서 실패하는 이유는 일단 commit이 안되었기 떄문이다.
Redmine
Subversion Repository에서 404 에러가 날 떄
c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\lib\redmine\scm\adapters\subversion_adapter.rb
공유기 문제 일 수도 있다.
SSH 서버 문제 일 수도 있다.
보통 그런 문제가 아니라, password 나 Config 파일에서 DOS Style의 LF/CR이 들어가기 때문이다.
따라서 편집기에서 DOS 스타일로 변경할 것인가를 결정할 때, 절대 DOS 스타일로 변경하지 않아야 한다.
또한, Config 에서 앞에 한칸을 띄게 되면, Subversion은 알아듣지 못하므로 맨 앞에 붙여서 편집이 되도록 해야 한다.
잘되는, password 파일과 Config 파일을 이용하는 것도 방법이다.
Redmine의
Config
c:\Bitnami\redmine-2.4.3-0\apps\redmine\htdocs\config\configuration.yml
Windows 의 사용자 계정 Profile
Doxygen 그림 안나오는 문제
Graphviz 최신 버전의 PATH 가 맞지 않아서 발생한 문제이거나, Graphviz에서 생성한 파일의 이름이 맞지 않아 발생한 문제이다.
1. PATH 문제 해결
Wizard->Expert->Dot
에서 DOT_PATH에
다음과 같이 Dot.exe 파일이
있는 폴더를 지정해 준다.
2. PNG 파일 이름 문제
Wizard->Expert->Project
에서
SHORT_NAMES 를 체크해 준다. Config 에서 YES 가 된다.
Bitnami
Redmine 애서 SQL 실행하기.
C:\Bitnami\redmine-2.4.2-0\mysql\bin 폴더에서 다음과 같이 수행하여야 한다. Path가 열려 있지 않다.
My SQL의 ID와 Password는 c:\Bitnami\redmine-2.4.2-0\apps\redmine\htdocs\config\database.yml 에 있다.
C:\Bitnami\redmine-2.4.2-0\mysql\bin>mysql -u bitnami -p bitnami_redmine
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.5.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like 'c%';
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Bitnami\REDMIN~1.2-0\mysql\share\charsets\ |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
+--------------------------+-----------------------------------------------+
14 rows in set (0.00 sec)
SSH Tunneling
http://wiki.dgoon.net/doku.php?id=misc:sshtunneling
여기에서 저쪽으로 터널을 뚫어보자. 예를 들어,
이런 상황에서, 나는 LinuxMachine에 ssh로 접속해서 내 WindowDesktop에 핑을 날려 살아있다는 것을 확인할 수 있다. 패킷을 보낼 수 있는 것이다. 공유기에서 연결하진 않았지만, 외부에서 WindowDesktop에 원격접속을 하고 싶다. 원격 접속 포트는 3389 번.
ssh -oport=2222 -L 1010:WindowDesktopIP:3389 LinuxMachineIP
ssh의 옵션 중 -L 이 여기 → 저기를 뜻한다. 콜론으로 구분된 세개의 옵션은 각각, LocalPort, ssh 접속한 머신에서 보이는 목적지 IP, 목적지 IP에 대한 port 이다. 저렇게 ssh 접속을 하고 나면 로컬 머신의 1010 번 포트가 LinuxMachine을 통해서 WindowDesktop의 3389 포트로 연결된다. 원격 데스크탑을 띄워서 localhost:1010 으로 접속해보라!
이것을 Putty
로 하려면
Putty 의 접속->SSH->터널링
여기에서 원포트를 1010 으로 하고 원격으로 쓰고 싶은 컴퓨터의 ip:3389 로 “대상” 에 적는다.
즉, 129.254.112.185:3389
그리고 추가를 눌러주면
L1010 129.254.112.185:3389 가 된다.
그 다음에 세션에서 Host Name 에 129.254.112.185 port 22 즉, SSH 접속을 체크하고 이를 저장한다.,
그리고 접속을 하면 SSH 접속이 된다. (SSH 서버 즉, SvcCOPSSH 의 사용자를 현재 jinwuk 으로 설정해 놓아야 한다. 즉 내컴퓨터의 사용자)
그렇게 하면 SSH telnet 접속이 된다. 윈도우 Telnet 서버는 꺼도 된다.
그 다음 원격데스크 탑에서
Localhost:1010 을 하면 포트포워딩이 되면서 원격데스크탑이 열린다.
jinwuk@JINWUK-PC-185 timestamp: 1396971867
Redmine
log file 의 제어 방법
1. .\apps\redmine\htdocs\config\Additional_environment.rb 파일을 다음과 같이 수정한다.
# Copy this file to additional_environment.rb and add any statements
# that need to be passed to the Rails::Initializer. `config` is
# available in this context.
#
# Example:
#
# config.log_level = :debug
# ...
#
# config.logger = Logger.new('./log/production.log', 5, 1024000)
# 1. Location of Lof file
# 2. Maximum number of log files
# 3. Maximum size of log file
#
# config.log_level = :debug
# Level of Log file :
# FATAL : minimum size
# ERROR :
# WARN :
# INFO : Default
# DEBUG : Maximum Size
config.action_controller.relative_url_root = '/redmine'
config.logger = Logger.new('./log/production.log', 5, 1024000)
config.log_level = :ERROR
BDrate
구하는 방법
VCEG-AE07_BJM.xla 파일을 Macro Excel 로 사용한다.
VCEG-AE07_BJM.xla 파일을 c:\Program Files\Microsoft Office\Office14\VCEG-AE07_BJM.xla 에 복사
엑셀의 파일->옵션->추가기능 에서 “이동” 선택
추가기능에서 -> 찾아보기 -> vceg-Ae07_Bjm.xla 선택하고 다음과 같이 되면 확인
ffmpeg
사용한 간단한 편집
ffmpeg -i 동영상.avi -ss 600 -t 120 -vcodec copy -acodec copy clip.avi
-ss 10분(600초)부터 부분파일을 시작
-t 2분간(120초) 해당하는 부분 선택
-vcodec copy 비디오codec을 원본과 동일하게 지정(변환없이 원본그대로 사용)
-acodec copy 오디오codec ........ ...
clip.avi 출력파일명
위에 -t 대신에 -fs를 대체하면 파일용량 상한선을 지정할 수 있다..
-> 시작옵션만 지정하면, 시작부터 파일끝까지..
-> 끝옵션만 지정하면, 시작부터 제한된 시간까지..
mp3를 비롯한 다른 오디오 파일을 잘라내는 방법 또한 위의 내용과 같다.
10분짜리 mp3파일을 반절로 나눌때
ffmpeg -i FILE.mp3 -acodec copy -t 300 전반부.mp3
-t 300 (초) 5분까지라는 뜻으로 시작점이 지정되지 않았기 때문에 처음부터 5분까지이다.
ffmpeg -i FILE.mp3 -acodec copy -ss 300 후반부.mp3
-ss 300 (초) 5분부터라는 뜻으로, 끝부분이 지정되지 않았기 때문에 5분부터 끝까지이다.
그 외에도 다른 오디오분할도 위와 같이 하면 된다.
단순한 분할이 목적이라면, 오디오편집프로그램보다 이것이 더 빠르다.
만약 안된다면, 해당프로그램버젼에서 지원이 안되는 codec이기 때문이다.
지원되는 형식과, codec 종류를 알고 싶을땐... 아래 명령을 사용
ffmpeg -formats
compile할대의 옵션의 차이에 의해서 codec지원이 되고, 안된다.
Avisynth
Frame Doubling 코드
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\mvtools2.dll") ## MVTools Version 2
##...............
Processing 1............... Frame Doubling
super = MSuper(Clip2, pel
= 2)
backward_vec =
MAnalyse(super, overlap=4, isb = true, search=3)
forward_vec = MAnalyse(super, overlap=4,
isb = false, search=3)
ClipE = MFlowFps(Clip2,
super, backward_vec, forward_vec, num=2*frameratenumerator(Clip2),
den=frameratedenominator(Clip2), mask=0, isse=true, planar=true)
|
Redmine 2.4.2 |
Date |
2014-11-09 |
|
|
Gantt 차트 PNG 내보내기 : |
|||
|
SubIssue-2 |
한글 출력 오류
수정 |
||
|
Contents |
Gantt를 PNG로 내보낼 때 한글이 표시되지 않는 오류 해결 Cd redmine/config/ Configuration.yml을 편집해야 한다. Line 175 – 196 사이에 다음과 같이 되어 있다. # Configuration of RMagcik font. # # Redmine uses RMagcik in order to
export gantt png. # You don't need this setting if you
don't install RMagcik. # # In CJK (Chinese, Japanese and
Korean), # in order to show CJK characters
correctly, # you need to set this configuration. # # Because there is no standard font
across platforms in CJK, # you need to set a font installed in
your server. # # This setting is not necessary in non
CJK. # # Examples for Japanese: # Windows: # rmagick_font_path:
C:\windows\fonts\msgothic.ttc # Linux: # rmagick_font_path:
/usr/share/fonts/ipa-mincho/ipam.ttf # rmagick_font_path:
C:\Windows\Fonts\malgun.ttf 이 부분을 이렇게 수정하면 된다. |
||
|
Main Issue |
Redmine 2.4.2 |
Date |
2014-11-09 |
||||
|
SubIssue |
Gantt 차트 요일이 아닌 날자 보이기 |
||||||
|
SubIssue-2 |
|
||||||
|
Contents |
Redmine 설치 디렉토리에서 아래의 명령을 이용하여
소스파일을 편집합니다.
기존의 소스코드에서 “<%
###### Days headers ####### %>” 부분을 검색한 후 아래의 마크된
라인과 같이 수정을 한 후 저장합니다. Redmine 서버를 재기동합니다. ./app/views/gantts/show.html.erb
Ruby
정상적으로 적용이 되면, 아래의 화면과
같이 해당 일정이 날짜로 표기되게 됩니다. |
||||||
|
Main Issue |
AVISynth |
Date |
2014-11-09 |
|
SubIssue |
VirtualDub 없이 AVS를 AVI로 만드는 법 |
||
|
SubIssue-2 |
|
||
|
Contents |
AvsPMode의 AVS2AVI 기능을 사용하면 된다. 이 기능은 AVSPMode에서 tools -> script Encoder(VFW) 에 해당한다 AVS2AVI를 수행하면 다음과 같은 창이 뜬다. 그대로 RUN을 수행하면 조금 있다가 코덱 선택 창이 뜬다. 살펴보면 다음과 같이 VFW 코덱이 보이게 된다. 다시 압축 안 함을 선택하면 AVS에서 사용되는 Color Space그대로 (보통은 YUV420P 8bit) 를 그대로 AVI 파일로 만들게 된다. 만일 Color space 변환 만으로 해당 부분은 해결 가능하다. “다시 압축 안함”을 선택하고 RUN을 선택하면 다음과 같이 된다. 정상적으로 인코딩 되는 것을 볼 수 있다. AVS2AVI는 불안하기 떄문에 Stop을 누른다고 프로그램이 정상 종료하지 않는다. 따라서, 반드시 TaskManager에서 해당 프로세스를 종료해야 한다. |
||
|
FFmpeg |
Date |
2014-11-09 |
|
|
SubIssue |
Adobe PRemire에서 받아들여지는 MOV 파일 포맷 |
||
|
SubIssue-2 |
|
||
|
Contents |
Adobe Premire에서 Uncompressed를 선택하면 기본으로 잡히는 코덱은 v210 코덱이다. 이 코덱은 ffmpeg Pix format에서 yuv422p10le 에 해당한다. 그러므로 다음과 같이 명령어를 주면 Adobe Premire에서 인식되는 mov 파일을 만들 수 있다, ffmpeg -i SkyTV_Demo_2.avi -vcodec v210 -f mov -use_odml 1 h:\SkyTV_Demo.mov |
||
|
Main Issue |
AVISynth |
Date |
2014-11-09 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
SubIssue |
Subtitle의 위치 |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
SubIssue-2 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contents |
Subtitle (clip, string text, int "x", int "y",
int "first_frame", int "last_frame",
string "font", float "size",
int "text_color", int "halo_color",
int "align", int "spc",
int "lsp", float "font_width",
float "font_angle", bool "interlaced") Subtitle (clip, string text) 자막을 넣는 subtitle의 위치는 다음과 같다. The align parameter allows you to set where the text is placed relative
to the (x,y) location and is based on the numeric keypad as follows:
Note: There
is no vertical center alignment setting. 그런데 보통 많이 사용되는 align=2 의 경우는 x, y위치에 대하여 다음과 같은 규칙으로 정해진다. Default
Values
Align=2
의 경우 이렇게 하고 y의 위치를 변경하여 원하는 위치에 Subtitle을 집어 넣는다. Example: ClipE1 = Subtitle(ClipE1, "SD (Standard Definition : 720x480)", x=-1, y=1420, first_frame=0, last_frame=ClipE1.framecount-1, font="Times New Roman", size=72, text_color=$FFFF00, halo_color=$000000, align=2, spc=0, font_width=0, font_angle=0.0, interlaced=False) 3840x2160 화면 가운데 SD 영상이 있고 그 하단에 subtitle을 넣는 예제이다. |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
Main Issue |
FFmpeg |
Date |
2014-11-12 |
|
SubIssue |
-map 옵션 사용법 |
||
|
SubIssue-2 |
|
||
|
Contents |
ffmpeg -i .\UHD_Audio\0623_KD_v210_12chAudio.mov -i .\UHD_Audio\KD\KD_all.wav -map 0:0 -map 0:2 -map
1:0 -c:v copy -c:a copy -c:d
copy -f mov .\UHD_Audio\0623_KD_v210_12chAudio_1.mov 이때, 첫번째 입력의 경우는 Stream 0:0 : Video Stream 0:1 : Audio Stream 0:2 : (Meta)Data 이다. 두번째 입력은 Stream 1:0 : Audio 이다. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\UHD_Audio\0623_KD_v210_12chAudio.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt creation_time : 2014-11-12 11:15:40 Duration: 00:01:51.11, start: 0.000000, bitrate: 1062234 kb/s Stream #0:0(eng): Video: v210 (v210 / 0x30313276), yuv422p10le, 1920x1080, 1060622 kb/ s, SAR 1920:1920 DAR 16:9, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc (default) Metadata: creation_time : 2014-11-12 11:15:40 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb /s (default) Metadata: creation_time : 2014-11-12 11:15:40 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2014-11-12 11:15:40 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Input #1, wav, from '.\UHD_Audio\KD\KD_all.wav': Duration: 00:01:51.13, bitrate: 9216 kb/s Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 12 channels, s16, 921 6 kb/s [mov @ 00000000042e17e0] You requested a copy of the original timecode track so timecode m etadata are now ignored Output #0, mov, to '.\UHD_Audio\0623_KD_v210_12chAudio_1.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt encoder : Lavf55.19.104 Stream #0:0(eng): Video: v210 (v210 / 0x30313276), yuv422p10le, 1920x1080 [SAR 1920:19 20 DAR 16:9], q=2-31, 1060622 kb/s, 23.98 fps, 24k tbn, 24k tbc (default) Metadata: creation_time : 2014-11-12 11:15:40 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:1(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2014-11-12 11:15:40 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:2: Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, 12 channels, 9216 kb/s Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:2 -> #0:1 (copy) Stream #1:0 -> #0:2 (copy) 즉, 순서대로 -map 0:0 -map 0:2 -map 1:0 이렇게 대핑 했기 때문에 Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:2 -> #0:1 (copy) Stream #1:0 -> #0:2 (copy) 이렇게 된다. 만일 -map 0:0 –map 1:0 –map 0:2 로 했으면 Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #1:0 -> #0:1 (copy) Stream #0:2 -> #0:2 (copy) 가 되었을 것이다. |
||
|
Main Issue |
IPTime NA |
Date |
2014-11-09 |
|
SubIssue |
IPTime NAS Application 이용법 |
||
|
SubIssue-2 |
|
||
|
Contents |
APM
사용하기. ·
1. phpMyAdmin을 통해 MYSQL 관리자 비밀번호 설정하기.
·
2.
MYSQL-front를 통해 MYSQL 관리자 비밀번호 설정하기.(윈도우 전용)
·
1. 제로보드XE 사용하기.
(v1.5.3.5 기준)
·
3. OwnCloud
사용하기. (v4.5.4 기준) ·
4.
Ajaxplorer 사용하기. (v4.3.0 기준) ·
5.
wordpress 사용하기. (v3.5 기준)
[처음으로] 3. OwnCloud 사용하기. (v4.5.4 기준) if(substr($prems,2,1)!='0') { |
||
|
Main Issue |
Git |
Date |
2014-11-29 |
|
SubIssue |
iptime nas 에 SVN-Git 연동 |
||
|
SubIssue-2 |
|
||
|
Contents |
1. NAS 에 SVN Repository 생성후 설정 - 주의 svnserve.conf 의 권환 설정을 아래와 같이 설정 해야 한다. anon-access = write auth-access = write 2. PC 에서 SVN 연동을 해서 초기 파일을 생성 하고 SVN 서버에 올린다. 3. git 파일을 다운 받고 설치 한다. http://code.google.com/p/msysgit/downloads/list?can=3 에서 Git-1.8.4-preview20130916.exe 4. totoisegit 을 다운받고 설치 한다. http://code.google.com/p/tortoisegit/ 5. totoisegit 에서 사용자 이름과 이메일을 등록 한다. 설정창에서 'TGit .gitconfig 편집하기' 버튼을 누른다. 아래 문장을 추가 한다. (ID 와 email 을 설정한다.) [user] name = abcdid email = abcdid@email.net è 이 부분이 Git 버전에 따라 조금씩 다른다. 어쨌든 편집하지 않아도 정상적인 동작에는 문제가 없다. 6. 사용할 디렉토리에서 SVN에서 GIT 으로 받아오기 위해서 "GIT 복제하기" 를 선택 한다. 7. 메뉴가 나오면 기본 설정 하고 확인을 누른다. - URL : SVN://192.168.0.1:3690/svnprj 처럼 SVN 저장소를 설정 한다. - 폴더 : PC에서 사용할 폴더를 지정한다. - SVN에서 가저오기 를 체크 한다. - Trunk , Tags , 브랜치 의 체크는 해제 한다. 8 Git commit 으로 일반적으로 사용할때는 PC에있는 GIT 저장소를 업테이트 한다. Daum Tistory 로그인 9. SVN 서버에서 받아와야 할 경우에는 Git-svn rebase 를 사용한다. 10. SVN 서버에 보내야 할 경우에는 Git-svn Decommit 를 선택 한다. (Normal SVN Commit 설정) |
||
|
Main Issue |
FFmpeg and Mp4Box |
Date |
2014-12-03 |
|
SubIssue |
HEVC
Bitstream을 Mp4와 AVI로
만드는 방법 |
||
|
SubIssue-2 |
|
||
|
Contents |
제대로 지원이 안된다. 그러나 Mp4box에서는 제대로 지원이 된다. Mp4box 프로젝트는 엄청나게 규모가 커져 하나의 Frame Work이 될 정도이다. 많은 tool들이 있다. Mp4box 최신 Package를 받은 후 설치한 다음 1. 기존 hevc binary의 파일 확장자를 변경한다. rename test2.bin
test2.hevc mp4box는 File 확장자를 통해서 파일의 성격을 알게된다. 2. 다음과 같이 MP4box를 사용하여 Mp4 파일을 생성한다. mp4box -add
"test2.hevc:fps=60" test4.mp4 - Fps는 60이므로 이렇게 입력되어야 한다. HEVC import - frame size 3840 x 2160 at
60.000 FPS HEVC Import results: 13568 samples -
Slices: 424 I 0 P 13144 B - 0 SEI - 424 IDR Stream uses forward prediction - stream
CTS offset: 3 frames Saving to test4.avi: 0.500 secs
Interleaving 3. 생성된 MP4파일을 사용하여 AVI를 만든다. ffmpeg -i test4.mp4 -c:v
copy -f avi test4.avi Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
'test4.mp4':
Metadata: major_brand : iso4 minor_version : 1 compatible_brands:
iso4hvc1 creation_time : 2014-12-02 04:39:58
Duration: 00:03:46.13, start: 0.000000, bitrate: 15913 kb/s Stream #0:0(und): Video:
hevc (Main) (hvc1 / 0x31637668), yuv420p(tv), 3840x2160, 15907 kb/s, 60 fps,
60 tbr, 60k tbn, 60k tbc (default) Metadata:
creation_time :
2014-12-02 04:39:58
handler_name :
hevc:fps=60@GPAC0.5.1-DEV-rev5542 Output #0, avi, to 'test4.avi':
Metadata: major_brand : iso4 minor_version : 1 compatible_brands:
iso4hvc1 ISFT
: Lavf55.25.101 Stream #0:0(und): Video: hevc
(hvc1 / 0x31637668), yuv420p, 3840x2160, q=2-31, 15907 kb/s, 60 fps, 120 tbn,
120 tbc (default) Metadata:
creation_time :
2014-12-02 04:39:58
handler_name :
hevc:fps=60@GPAC0.5.1-DEV-rev5542 Stream mapping:
Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help frame=13568 fps=0.0 q=-1.0 Lsize= 439772kB time=00:03:46.07
bitrate=15935.5kbits/s video:439124kB audio:0kB subtitle:0 global
headers:0kB muxing overhead 0.147635% 4. ffmpeg 에서 바로 AVI Muxing을 시도하면 다음 부분에 대한 정보가 없다고 하면서 제대로 Muxing이 되지 않는다. Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), Profile을 모르겠다고 하면서 제대로 되지 않는데 이는 Parsing 문제로 보여진다. 심지어는 bin 대신 hevc로 확장자를 변경하면 hevc를 제대로 인식하면서 제대로 avi 를 만드는 것 처럼 하면서도 avi 파일은 제대로 만들어지지 못한다. Input #0, hevc, from 'test2.hevc':
Duration: N/A, bitrate: N/A Stream #0:0: Video: hevc
(Main), yuv420p(tv), 3840x2160, 25 fps, 25 tbr, 1200k tbn, 25 tbc Output #0, avi, to 'test5.avi':
Metadata: ISFT
: Lavf55.25.101 Stream #0:0: Video: hevc,
yuv420p, 3840x2160, q=2-31, 25 fps, 60 tbn, 60 tbc Stream mapping:
Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help frame=13568 fps=3115 q=-1.0 Lsize= 439631kB time=00:03:46.13
bitrate=15926.3kbits/s video:439301kB audio:0kB subtitle:0 global
headers:0kB muxing overhead 0.075153% 5. 향후에는 VUI 관련 정보들을 넣을 경우 제대로 만들어지는지 체크해보아야 할 듯하다. |
||
|
Main Issue |
CMD Batch 파일 |
Date |
2015-03-18 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SubIssue |
batch파일 명령어 해설 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SubIssue-2 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contents |
1. 각 명령어의 구체적인 사용법 명령어 /? 를 사용하면된다. 2. 배치파일 명령어 일람
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Main Issue |
MingGW 설치와 문제해결 |
Date |
2015-03-18 |
|
SubIssue |
MingGW 설치 |
||
|
SubIssue-2 |
|
||
|
Contents |
1. MinGW MinGW는 ,
"Windows 용 Minimal GNU"의 줄임말로, 네이티브 Microsoft Windows 응용 프로그램을위한 최소한의 개발 환경이다.. MinGW는 기본 MS-Windows 응용 프로그램의 개발을 위한 C-런타임 DLL에 의존하지 않는 완전한 오픈 소스 프로그래밍 툴 세트를 제공한다. (MS-Windows 응용 프로그램의 개발을 위한 C-런타임 DLL은 많은 경우 MS 운영 체제의 구성 요소이거나, 마이크로 소프트 자체에서 제공하는 DLL 이다. 특히, MSVCRT.DLL은 Microsoft C 런타임 라이브러리 중 가장 주목할만한 것이다. 또한, 스레드 응용 프로그램을 지원하는기 위한 별도의 DLL들은 MSdptj 제공하는 특정한 배포 프로그램이나 규칙에 따라 제공되는데 MinGW는 자체적으로 제공된다. ) MinGW의 컴파일러는 Microsoft C 런타임 및 일부 특정 언어 런타임의 기능에 대한 액세스를 제공한다. 한편, MinGW은,
MS-Windows에서 POSIX 응용 프로그램 배포에 대한 POSIX 런타임 환경을 제공하지 않는다. 이 플랫폼에서 POSIX 응용 프로그램 배포를 원한다면, Cygwin을 고려해야 한다. . - 주로 기본 MS-Windows 플랫폼에서 작업하는 개발자가 사용하도록 만들어진 것이지만, 크로스 호스팅 사용도 가능하다. ( 참고 참조 더 읽고 ,) o
C, C
++, ADA 및 포트란 컴파일러를 포함하여 GNU 컴파일러 컬렉션 (GCC)의 포트; o
Windows
용 GNU Binutils의 (어셈블러, 링커, 아카이브 매니저) o
MS-Windows에서는 MinGW와 MSYS 배포 옵션 GUI 프론트 엔드 (와 Mingw-GET)와 명령 줄 설치, o
GUI를 처음 설치 도구 (와 Mingw-얻을-설치가)를 높이고와 Mingw-얻을 실행합니다. 2. 설치 순서 1.
MinGW 홈페이지로
이동. Go to MinGW Homepage
|
||
|
Main Issue |
MingGW 설치시 문제해결 |
Date |
2015-03-18 |
|
SubIssue |
각종 문제점 |
||
|
SubIssue-2 |
|
||
|
Contents |
1. MinGW 설치 후 Msys 가 제대로 동작하지 않는 문제 Msys-1.0.dll 의 메모리상의 위치가 잘못되어 나타나는 문제로서 rebase.exe 를 통해 DLL의 메모리상의 위치를 수정하여 해결한다. Cygwin Heapsize가 djqteksmns 메시지를 다음과 같이 출력하면서 Linux shell 명령어가 제대로 동작하지 않는다. C:\MinGW\msys\1.0\bin>rebase.exe 0 [main] us 0
init_cheap: VirtualAlloc pointer is null, Win32 error 487 AllocationBase 0x0, BaseAddress 0x60EA0000,
RegionSize 0x160000, State 0x10000 C:\MinGW\msys\1.0\bin\rebase.exe: *** Couldn't reserve space for
cygwin's heap, Win32 error 0 rebase.exe는 Visual
C++ 에 있는 것을 사용한다. 이를 사용하여 다음과 같이 해결한다. rebase.exe -b
0x50000000 msys-1.0.dll 그러면 Cygwin Heapsize가 확보되면서 정상적으로 msys가 동작하여 MinGW 컴파일 환경이 구축된다. 2. MinGW 컴파일시 나타나는 –ldl 옵션 문제 –ldl
옵션은 DLL Load가 필요할 시 이를 지원하기 위한 컴파일
옵션이다. 그러나, MinGW에서는 이것이 빠져있다. 이유는 알 수 없으나, MinGW 가 처음 개발 되었을 때부터 빠져있다. 아마도 Licesnse 관련 문제점이 있기 때문인 것으로 추측된다. 이것은 dlfcn 라이브러리 문제로서 MinGW에 dlfcn 관련 library가
깔려 있지 않아서 발생하는 문제이다.
이럴 경우 기존 include 에 있는
dlfcn.h 파일을 일단 이름을 바꾸도록 하고 Google 등에서 최신의
dlfcn for MinGW 를 받아 bin, lib, include에 복사하면 된다. dlfcn-win32-r19-x64-130315 를 받아 bin, include, lib 에
각각 관련 파일들을 복사해 넣음으로서 문제를 해결하였다. 이 두가지가 해결되면 정상적으로 MinGW 를 사용하여 Linux 명령어로 HM을 컴파일 할 수 있다. 일반적인 Command Line consile 에서 |
||
|
Main Issue |
Source Tree를 사용한 Git |
Date |
2015-03-28 |
|
SubIssue |
Git 과 SVN의 연동 |
||
|
SubIssue-2 |
MinGW
터미널에서 드라이브 이동 포함 |
||
|
Contents |
1. Source Tree 설치 다음 사이트에서 SourceTree를 다운로드
한다. http://www.sourcetreeapp.com/download/ 다운 받은 다음 라이선스 동의를 하고 다음 페이스로 넘어가면 다음과 같이 버전 관리 (Git) 이 다운로드 되고 설치된다. 시스템 다운로드가 끝나고 다음으로 넘어가기 전에 다음 창이 뜨는데 Yes 한다. 사용자 계정을 추가한다. 나의 경우 Git 계정은 GitHub에 있기 때문에
Jinwuk: 16****** 이다. Github의 초기 저장소가 나오는데 굳이 이를 이용할 핑요 없다 설절 건너뛰고 나중에 해도 된다. 역시 아니오 한다. GitHub에 SSH 키가 하나
있으므로 나중에 가져오면 된다. 다음과 같이 초기 화면이 나타난다. GitHub의 저장소를 불러와 보자. 저장소 복제 추가 설정에서 호스트 프로젝트 탐색을 클릭한다. 저장소 목제 추가 설정 창의
오른쪽 상단 탭이다. 제공된 저장소가 나타나고 이 중 HEVC_Encoder를 선택하고 확인 한다. 목적지 경로를 선택한 후 “클론” 을 만든다. 이것이 해당 저장소의 로컬클론이 된다. 클론 과정이 지나면 그림 처럼 “로그/히스토리”를 선택한 경우 이렇게 나타난다. 우측의 터미널을 사용하면 Git 관련 Bash 터미널이
나타나는데 MinGW 창으로도 아주 좋다. 2. 드라이브 변경 일단 MinGW 에서는 모든 HDD가 마운트 되어 있다. 따라서.. Cd / ……………. 현재 드라이브에서 최고 드라이브로 이동 Cd /c ………….. C 드라이브로 이동 3. 한글 깨져 보일 때 도구 -> 옵션 -> 기본 텍스트 인코딩에서
에서 EUC-KR 을 선택한다. 단, 이떄는 소스코드의 경우 한글이 보이지만, utf-8 로
된 버전 별 주석문은 잘 보이지 않는다. 또한 기본 텍스트 인코딩을 변화 시킨 후에는 반드시 컴을 껐다가 켜야 한다. 그렇지 않으면
후에 다시 텍스트 인코딩 옵션을 변경 시킬 경우 SourceTree 가 다운 되며 이는 SourceTree를 제거해도 계속 남든다. 이 경우에는 c:\User\…\AppData\Local 에 들어가서 SourceTree 관련 데이터들을 싹 다지우고 그리고 c:\User\…\AppData\Local\CrashDump 에서 SourceTree 다운될 떄의 관련 데이터를 다 지우고 C:\Program
Files(x86)\Atlanssis 폴더까지 다 지운후 새로 설치해야
한다. |
||
|
Main Issue |
Source Tree를 사용한 SVN-Git |
Date |
2015-03-28 |
|
SubIssue |
Remote는 SVN Local은 Git을 사용하여 버전 관리를 한다. |
||
|
SubIssue-2 |
|
||
|
Contents |
4. Git-SVN 만드는 법 SourceTree에서
Terminal을 연다.
일단 빈 폴더가 필요하다. 만일, 기존
프로젝트에서 만들려고 하면 기존 프로젝트에서 소스 부분은 백업 되어야 한다. 그리고 source 폴더를
만들었으면 그곳에 git svn clone 이 만들어지도록 해야한다. 다음과 같이 한다. User@JINWUK-PC-188 /c/Work/Work-2014/Temporal_Code $ git svn
clone svn://jnwhome.iptime.org/ETRIHEVCMAIN4K60P/source ./[DEV102_git_svn] 이러면 해당 폴더에 [.git] 이 생기면서 하위 폴더에 svn 정보가 들어가게 된다. 이렇게 만들면 정통적인 svn 폴더는 아니다.
(trunk 등이 없으므로) trunk 등이 있는 svn을
만들려면 해당 페이지 svn 해설 페이지르 ㄹ살펴본다. 이렇게 하면 현재 버전까지의
모든 정보를 svn 서버로부터 받으면서 Git 구조를 만든다. 다 만들어진 후 SourceTree 에서 작업 폴더를 열면 Git 구조를 볼 수 있다. 5. Local Branch를 만드는 법 SourceTree에서 Local Branch를 하나 만든다. 원격은 Subversion 이므로 Local에 만들어야 한다. Head Version에 보면 Origin은 git-svn 그리고 Master 가 있다. Local branch를 만드는 것은 해당 버전 설명 부분에 마우스를
대고 오른쪽 버튼을 눌러 나오는 메뉴에서 찾아 만들면 된다. 다음과 같이 창이 뜬다. 여기에 branch 이름을 쓰고 브랜치 생성을 한다. 편의상 branch 이름은 Local_Branch 라고 하자. 이때 이 Branch가 Subversion
Branch 인지, Git Branch 인지 묻는다. 우리는 Local에서는 Git을 사용하려고 하므로 Git
Branch를 선택한다. Origin: git-svn, Master 그리고
Local_Branch 라고 만들어 진다. 테스트를 위해 버전설명을
약간 수정하고 저장한다. 해당 폴더의 마우스 를 대고 오른쪽 메뉴에서
Tortoise Git이 있다면 이를 “Local Branch”에 커밋할 것이냐고 묻는다. 커밋한다고 하자. SourceTree 에서도 마찬가지로 할 수 있다. 커밋을 눌러주고 커밋할
대상을 선정한 후 (Local Branch에) 커밋을 수행하면 된다. 단, Local_Branch에 대한 ID가 없으므로
Tortoise Git 에서는 이에 대한 세팅을 요구한다. Yes 하면 다음 창이 뜬다. 여기에 이름과 이메일
주소를 써야 한다. Ssh key 등은 inherit 하면 된다.
(sourceTree에서 Git-svn 만들때 생성되었음) 그러면 다음과 같이 현재 Git 구조에 대한 설명 창이 뜬다 무시하고 OK 한다. 그러면 다음과 같이 Commit 창이 뜬다. Amend Last Commit을 체크해야 커밋할
대상이 아래 change mode창에 뜬다. OK 를 하여
Commit 한다,. 그러면 다음 그림과 같이 Mian
Subversion-Git 가지에서 Local Branch가 튀어나온 것을 볼 수 있다. (붉은 색) 6. Local 변경 사항을 Master -> Subversion 으로 Merge 하는 법 테스트를 위해 text파일을 한 번 더 변경하고 저장한다. 그러면 다음과 같이 커밋하지
않은 변경 사항이 나타난다. 일단 커밋을 위해서는
스테이지로 올려야 한다. 스테이지에 올라가지 않은 파일을 클릭하면 스테이지로 올라간다. 이 상태에서 커밋하면 계속 Local에 커밋된다. 커밋된 다음에는 이렇게 된다. 이때, Master에 오른쪽 마우스 클릭으 ㄹ하면 당므과 같이 메뉴가 뜬다. Master를 branch와 병합하고자 한다. 충돌이 나면 다음이 뜬다 파일 상태로 가서 스테이지에 올린 후 Commit을 선택한다. |
||
|
Main Issue |
Visual C++ 2010 |
Date |
2015-04-19 |
|
SubIssue |
Debug 시 “소스파일이 모듈을 빌드했을
떄와 다릅니다.” |
||
|
SubIssue-2 |
디버그 시 오류 수정 |
||
|
Contents |
상당히 자주 보는 내용이다. 1. 파일(F) -> 저장 고급 옵션(V) -> 유니코드(서명 있는 UTF-8) - 코드 페이지 65001 로 변경 3. Visual C++의 디버그->옵션 및 설정에서 해당 부분의 체크를 해제한다. 해당 에러는 MS의 폰트 때문이다., 즉, 파일->고급 저장 옵션에서 이것이 원래 Default 인데, 이럴 경우 어떠한 원인인지 알 수 없으나 Debug 포인트가 제대로 찍히지 않는 오류가 발생한다. 이 경우, 해당 인코딩을 위 1과 같이 유니코드 UTF-8로 변경하면 문제가 사라지나, 이럴 경우, 다른 편집기 예를 들어 Source Insight 등에서 한글 폰트가 꺠지는 현상이 일어나기도 한다. 따라서, UTF-8을 지원하도록 Source Insight를 세팅하거나, 아..이건 불가능함, Source Insightsms ANSI 만 지원한다. 따라서, 현재까지 내가 테스트 해 본 결과는 위 세가지 방법 중 3번쨰 방법으로 해결했다. |
||
|
Main Issue |
Redmine Apache 서버를 사용한 Git Server 설치 |
Date |
2015-06-03 |
|
SubIssue |
Apache 서버 설정, Git 설정등 |
||
|
SubIssue-2 |
WebDaV |
||
|
Contents |
1. 기본적인 사항은 다음 사이트를 참조한다. https://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C 혹은 다음 사이트를 참조한다. http://www.rasplay.org/?p=1325 이 사이트도 아주 좋다. http://blog.bobbyallen.me/2012/07/23/installing-a-git-server-using-apache-webdav-on-ubuntu-server-12-04/ 많은 경우, Windows의 Apache 서버 세팅
대신 Linux Apache 서버 세팅인 관계로 Windows에서
어떻게 Git 서버 세팅이 가능한지, 잘 나와 있지 않다. 그러나 생각보다 쉽다. 일단 서버의 경우 다음과 같이 bare Git Repository를 htdocs에 만든다. 이 두 명령어는 Windows Commander로 만들고 mkdir test_git.git cd test_git.git git 명령은 Windows용 Git Bash를 사용해야 한다. 디렉토리는 test_git.git 이다. git --bare
init git update-server-info 즉, Command 창과 Git Bash 창을 동시에 사용해야 한다. 다음 WebDav를 활성화 시켜야 한다. 2가지 방법이 있다. 1. Windows IIS 로 WebDav를 활성화 시키는 방법 (그런데 이방식으로 Apache 서버가 활성화 되는 것 같지 않다.) Windows 7 에서 Webdav 서버 설정하는 방법 제어판->Windows 기능 활성/비활성 -> IIS (Internet Information Service)기능 활성화 2. Apache의 WebDav 모듈을 Enable 시키는 방법 a2enmod dav_fs 그런데 보통은 a2enmod.exe 가 Redmine Apache 서버에 없다
그럼 다르ㅡㄴ 방법은?? 3. httpd.conf 에서 WebDav 활성화 시키기 일단, Apache 서버를 끄고 /conf/
httpd.conf 에서 다음을 찾아보자. Dynamic Shared
Object (DSO) Support 이 항목에서 다음의 Module 3개가 모두 Load 되도록 한다. LoadModule
dav_module modules/mod_dav.so LoadModule
dav_fs_module modules/mod_dav_fs.so LoadModule
dav_lock_module modules/mod_dav_lock.so 현재 httpd.conf 에 DocumentRoot
"C:/Bitnami/redmine-2.4.2-0/apache2/htdocs" 로 설정되어 있고 해당 Root의 형식이 그 밑에 설정되어 있다. 나중에 환경변수로 Git Repository 를 설정하고 비슷하게 만들어서 실험해 보자. 그 다음 Password File을 생성해야 한다. Bin 밑에 보면 htpasswd 가 있다. 이것을 사용하여 다음과 같이 만들자. $ htpasswd -c
passwd.git <user> 그러면 password 를 묻는다. Password를 입력하면 passwd.git 파일이 생성된다. passwd.git 파일을 /conf 밑에 복사한다. 사용자를 추가하기 위해서는
위에서 passwd.git 에 –c 옵션 없이 사용자를
추가하면 된다. 다시, httpd.conf 파일을 열어서 다음과 같이 편집한다. # WebDAV for
Git Server # First
Locking DAV Operation using DavLockDB # Second
Including the following Directory # DavLockDB
"c:\Bitnami\redmine-2.4.2-0\apache2\var\DavLock" <Location
/test_git.git> DAV on AuthType Basic AuthName Git AuthUserFile
conf/passwd.git Require valid-user </Location> DavLockDB 경로를 잘 적어 주어야 한다. User의 경우 valid-user로 해주어야 한다. Apache 서버를 다시 Enable 시킨다. 이 정도만 하면 http://jnwhome.iptime.org/test_git.git 하면 해당 페이지를 볼 수 있다 (ID와 PW 입력
후) 그리고 가장 중요한 점은… Test_git.git 폴더의 권한을 잡아 주어야 한다. Linux에서는
이 부분을 chmod 혹은 chown -R www.www 을 통해 수행하는데 Windows 에서는 전혀 다르다. Windows에서는 test_git.git 에 우측 마우스를
대고 속성->보안으로 들어가서 Authenticated
Users를 모든 권한으로 해 주어야 한다.
안 그러면 Git 에서 에러가 난다. 이로서 WebDav로 인증된 사용자가 Git Remote 서버를 인증하여
사용할 수 있게 된다. Client 에서는?? 만일 Git Bash가 있다면 다음과 같이 하면 된다. (경로는 Windows 경로가 되도록 한다) mkdir
~/Desktop/test-project cd
~/Desktop/test-project git init git remote add
origin http://<user>@<server name or IP address>/test-project.git touch README git add . git commit -a
-m “Initial import” git push
origin master 만일 TortoiseGit 이 설치되어 있다면 다음과 같이 한다. 일단, Git Repository here 를 수행하여 특정 폴더를 git
Repository 로 만든다. Bare로 만들면 안된다. TortoiseGit
-> Setting -> Git 에서 설정을
확인한 후 (사용자 정보와 이메일) Git->Remote를 설정한다. (매우 중요) <URL> http://jnwhome.iptime.org/test_git.git 이것만 넣어 주어도 자동적으로 origin 이 뜬다. 다음이 중요하다. <Push
URL> http://MyID:MyPW@jnwhome.iptime.org/test_git.git 꼭 ID와 PW를 http:// 앞에
같이 써주어야 한다. 그리고 PUSH를 해주면 Remote에
Push가 된다. – |
||
|
Main Issue |
SSH 를 사용한 방화벽 외부 연결 |
Date |
2015-06-13 |
|
SubIssue |
Bitvise SSH 서버와 MinGW msys SSH 사용 |
||
|
SubIssue-2 |
|
||
|
Contents |
1. Bitvise SSH 서버 설치 별 다른 변경 없이 Default로 설치 화면
된다. 단 계정의 경우, Linux Admin 계정으로 기본 계정을 만든 다음 Virtual 계정에서
sderoen : sj1612 로 각가 ID와 PW를 만들면 된다. 포트 번호는 22번이다. 외부 즉, 집에 있는 컴퓨터의 경우 Port forwading 을 할 것이므로 Local Network으로 만들어도 전혀 문제가 없다. 2. AP에서 포트포워드 설정
일단 외부 포트는 22로 할 경우 해킹에 노출될 수 있으므로 임의의 포트를 사용하도록 한다. 이번의 경우는 10022를 사용하였다. 그리고 ip의 경우는 Bitvise SSH 서버가 있는
ip를 설정한다. 그리고 동작 시킨다. 다음과 같이
설정한다. 외부 포트의 경우는 10022, 내부 포트의 경우는 22를
사용하였다. 이렇게 하면 외부에서 내부로 AP를 통해 ssh 서버에 연결이 가능하다. 3. MinGW SSH Client 사용 MinGW의 SSH Client를 사용한다. 해당 클라이언트는 오픈소스이므로 전혀 문제가 없다. MinGW의 SSH Client의 옵션은 다음과 같다. usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command] 이러한 상황에서 다음과 같이
명령어를 준다. ssh -R 10022:localhost:22
sderoen@jnwhome.iptime.org -p 10022 이렇게 하면 , 원내에서 집에 있는 컴퓨터에 연결이SSH 연결이 이루어진다. 오오오오 이대의 옵션을 잘 살펴보고 putty 혹은 이것을 사용한 ssh 터널링을 구현해 보자. |
||
|
Main Issue |
레드마인 |
Date |
2015-07-07 |
|
SubIssue |
Ruby bundle 및 Plug-in Update |
||
|
SubIssue-2 |
결국 경로 문제였음 |
||
|
Contents |
1. Ruby\bundle 그동안 Ruby bundle이 제대로 안되었던 이유는 순전히 경로
문제였음 Bundle, ruby, rake 의 경로만 잘 잡아 주면 ruby 관련 어떤 것도 정확하게 하 ㄹ수 있음 현재는 bundle.bat에
있는 ruby.exe의 경로를 절대 경로로 잡아 준 상태임 기본적으로 이렇게 해주면 된다 C:\Bitnami\redmine-2.6.5-0\apps\redmine\htdocs>c:\Bitnami\redmine-2.6.5-0\ruby\bin\bundle
exec c:\Bitnami\redmine-2.6.5-0\ruby\bin\rake redmine:plugins:migrate RAILS_ENV=production 수행이 필요한
경로에서 절대 경로로 bundle을 부르고 절대 경로로 rake를 부르면 된다. 예를 들어 database Migration 의 경우도 마찬가지이다. C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle
exec rake db:migrate RAILS_ENV=production 레드마인 업데이트 관련하여 여기를 참조한다. http://kalipso.tistory.com/153 아파치 서버의 Error log를 자세히 살펴보면 문제가 되는 부분을 알 수 있다. |
||
|
Main Issue |
레드마인 |
Date |
2015-06-13 |
|
SubIssue |
레드마인 업데이트 |
||
|
SubIssue-2 |
Sub
Issue로 다 포함 되지않는 내용을 여기에 적는다. |
||
|
Contents |
Bitnami Redmine 업그레이드기(V.2.0.3-1 ==> V.2.6.0-2) Programming/Tool & Util 2014/12/10 13:49 어느 날 Redmine이 버벅거리기 시작하더니 에러를 띄우며 죽어버리고 말았다. Apache를 재시작해도 되지 않고, mysql을 재시작해도 차도가 없었다. 어차피 한참 부하가 많이 걸리는 서버에서 돌아가고 있는게 걸리던 참이어서 다른 서버로 마이그레이션 하기로 마음먹었다. 1. DB백업 처음에 root 암호가 생각나지 않아서 애를 먹었다. root 암호를 찾은 다음(http://kalipso.tistory.com/152) 다음과 같이 mysqldump를 진행하였다. C:\Program Files\BitNami
Redmine Stack\mysql\bin>mysqldump -u bitnami -p bitnami_redmine >
bckup.bizen.redmine.20141209.sql 2. 파일 백업 C:\Program Files\BitNami Redmine Stack\apps\redmine\htdocs\files 에 있는 첨부파일들을 백업 3. 신규서버에 Bitnami Redmine 최신버전 설치 https://bitnami.com/stack/redmine/installer 에서 Window용 최신버전 다운로드하여 설치 후 정상동작 확인 ※ Bitnami 최신버전은 http port 외에도 https 프로토콜 정보를 필요로 한다. IIS 등 웹서버를 운영하고
있지 않다면 Installer가 자동으로 80 port와 443 port를 선택하며, 해당 port가 사용중이라면 port를 선택하라고 나온다. 물론 변경 가능하다. 4. 신규서버에서 Database Drop/Create C:\Bitnami\redmine-2.6.0-2\mysql\bin>mysql
-uroot -p Welcome to the MySQL
monitor. Commands end with ; or \g. mysql> drop database bitnami_redmine; mysql> create database bitnami_redmine; mysql> grant all privileges on bitnami_redmine.* to 'bitnami'@'localhost' identified by '패스워드'; 5. redmine app에서 사용하는 bitnami 계정의 비밀번호 변경 C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs\config\database.yml 파일에서 "패스워드"로 변경 6. Restore database & 첨부파일(htdocs/files) C:\Bitnami\redmine-2.6.0-2\mysql\bin>mysql -ubitnami -p bitnami_redmine < bckup.bizen.redmine.20141209.sql ※ 여기까지 했을 때, database 버전 문제 등으로 Internal Server Error를 보게 된다. 7번의 DB migration을 진행해야 한다. 7. rake Utility를 이용하여 DB Migration 및 plugin 업그레이드 우선 ruby rake Utility를 사용하려면 C:\Bitnami\redmine-2.6.0-2 의 use_redmine.bat 파일을 실행시켜야 한다. (사실 이것도 stackoverflow 를 뒤져야 했다.) redmine/htdocs 폴더에서 다음과 같이 rake를 실행시킨다. C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\rake
db:migrate RAILS_ENV=production 그러나 위와 같은 결과가 나왔다. C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>bundle update rake 위와 같이 진행하였더니 뭔가 update를 진행한다. 그러나 여전히 문제가 해결되지 않는다. 역시 stackoverflow를 뒤져댄 끝에 다음과 같은 방법으로 해결했다. C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle
exec rake db:migrate RAILS_ENV .... 별도의 플러그인을 깐 것은 아니지만 플러그인도 같은 방법으로 update를 했다. C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle exec rake redmine:plugins:migrate RAILS_ENV=production 위와 같은 방법을 통해 레드마인이 정상적으로 동작했다. |
||
|
Git Advanced 사용법 |
Date |
2015-08-29 |
|
|
SubIssue |
Git을 사용한 Clone, checkoput, commit,
push 정리 |
||
|
SubIssue-2 |
Notebook 과 pc188 간의 관계를 통해 관련 부분들을 Master |
||
1. Clonne
단순하게 clone 할 경우에는 언제나 remote/origin 의 Master를 Clone 받게 된다.
따라서 모든 것을 Master 위주로 수행하게 되는데, 이렇게
되면 서로가 힘들어진다. 따라서, Clone 전에 먼저 자기
자신의 Branch를 먼저 설정하고 Clone 받는 것이
좋다. 그렇게 되면 맨 처음에는 Master를 받지만 적어도 Local은 자기 자신의 Branch를 가지고 시작하게 된다.
1.1 예, VAIO Notebook 에 Master의 Branch “Jinwuk_VAIO” 를 만들 때
이렇게
하면 Origin Name이 지정되지 않았기 때문에
Jinwuk_VAIO 라는 Branch로 Master 가 Clone 된다.
ID를
써주고
Password를
입력한다.
만일 PC188 에서 VAIO의 복사본을 받고 싶다면 위에서 Origin Name을 Jinwuk_VAIO로 해주면 된다.
즉
다시말해, Clone 은 두 가지 방법이 있는데, Master로부터
나의 Branch 를 만들기 위한 Clone 과 특정 Branch 로부터 Clone 되는 방법이 있다.
2. PUSH
Commit의 경우는 subversion 과 비슷하므로 문제가 없으나, PUSH의 경우는 다르다. PUSH의 경우는 Git 서버가 Clone 된 Branch들을 일일이 관리해야 한다. 그러므로 가급적 Local Branch와 동일한 이름의 remote Branch가 존재하도록 만들어야 한다. 그렇게 하지 않고 Master로 PUSH를 시도하면, Git
Server는 맨 처음 Push
한 Local Branch의 PUSH가 아닐 경우 PUSH를 거부해 버린다. 따라서 서로 다른 사람들이 Commit을 시도함으로서 발생하는 버전 꼬임이Git에서는 발생할 수가 없다.
Git에서는 Master 한 사람에게 Merge 의 권한이 집중된다. 따라서 자연적인 버전 관리가 가능하다.
PUSH 할 때는 위에 있는대로 PUSH URL이 적시 되어야 한다.
3. CheckOut
Check out은 만일 Local Git Repository가 만들어진 상태라고 하면 다른 Branch를 가져오기 위한 것이다. Checkout 할때 아무것도 쓰지 않으면 Master의 내용이 Checkout 된다. 그러나, 특정 Branch 이름을 쓰게 되면, remote상의 특정 Branch의 내용이 들어오게 된다. 따라서 이 상태에서 Commit 과 PUSH를 하여 버전 관리를 하면 된다.
|
Main Issue |
테마 표 |
Date |
2015-06-13 |
|
SubIssue |
테마 표와 관련된 sub Issue를 여기에 적는다 |
||
|
SubIssue-2 |
Sub
Issue로 다 포함 되지않는 내용을 여기에 적는다. |
||
|
Contents |
관련 내용중 1. 대 제목에 해당하는 내용은 여기에 적는다. 본문 내용의 폰트는 맑은
고딕 10 이다. 2. 대제목 필요한 경우 그 다음 내용을 이렇게 적으면
된다. ssh -R
10022:localhost:22 sderoen@jnwhome.iptime.org -p 10022 필요한 내용중 강조할 부분이 있으면 이렇게
굵게 표현 하면 된다. |
||