반응형
shorturl

Short URL API

긴 http 주소를 짧게 만들어 주는 방법

이 서비스를 제공하는 곳은 구글, 네이버, bitly 등이 있다. 하지만 최근 구글은 short url 서비스를 종료해서 다른 곳을 이용해야 한다. 여기서는 bitly를 API로 이용하는 방법을 설명한다.

  • 계정생성

  • 계정ID 및 apikey 확인

  • 단축 URL 생성을 API로…
    아래 데이터를 POST로 Web API 주소로 보내면 단축URL 결과를 받을 수 있다.

아래는 curl 커맨드로 전문을 보내어 longurl을 단축해 보았다.

curl -X POST http://api.bit.ly/v3/shorten -d "login=o_5*********" \
 -d "apiKey=R_5******************************3" \
  -d "longUrl=https://crazyj.tistory.com/173?category=753578"

결과

{"status_code":200,"status_txt":"OK","data":{"url":"http://bit.ly/34BRNHZ","hash":"34BRNHZ","global_hash":"34GlWWS","long_url":"https://crazyj.tistory.com/173?category=753578","new_hash":1}}

JSON 데이터를 파싱하면 data에 url 부분으로 단축된 것을 볼 수 있다.
만들어진 짧은 주소로 접속해보니 long url로 변환되어 들어가는 것을 볼 수 있다.
기존 긴 주소: https://crazyj.tistory.com/173?category=753578
변경된 짧은 주소: http://bit.ly/34BRNHZ

  • 요약
  • POST로 아래 데이터만 채워서 API URL로 보내면 된다.
  • API URL : http://api.bit.ly/v3/shorten
  • 파라미터 POST DATA (키명은 아래처럼 다 소문자로 해도 작동되는 것 같다.)
    • login=계정
    • apikey=키
    • longurl=긴URL주소
  • GET 방식도 지원한다.

Author: crazyj7@gmail.com

반응형

크롬 브라우저 현재 최신버전으로 업데이트하지 마세요.
한글 입력 버그 있음.
버전 78.0.3904.70(공식 빌드) (64비트)
크롬에 설정에서 현재 버전 확인을 하게 되면 자동(!)으로 강제업데이트됩니다.

문제는 이렇게 업데이트된 후에,
검색시에 한글누르고 스페이스 누르면 한글이 삭제되는 버그가 있고,
브라우저내에 채팅창같은곳에 스페이스를 누르면 스페이스가 안먹히고, 두 번 눌러야
스페이스 한 개가 들어갑니다....

나만 그런줄 알았는데 방금 업데이트 한 것을 보니 같은 증상이 나타났음.
패치 나올때 까지 기다리세요 ㅜ.ㅜ

이미 업데이트가 되어버렸는데, 이전으로 돌리려면????

 

크롬 옛날 버전으로 복구 방법. 패치가 나오기 전까지 옛날 버전을 사용하려면...
먼저 자동업데이트를 중지한다. 아래 경로에서 3번을 수행(서비스 중지)
https://www.webnots.com/7-ways-to-disable-automatic-chrome-update-in-windows-and-mac

간략히 요약하면 service.msc 실행해서 Google 업데이트 서비스로 나온것들 사용안함으로 중지하는 겁니다.

 

7 Ways to Disable Automatic Chrome Update in Windows and Mac » WebNots

Learn how to disable automatic Chrome update in Windows and Mac by renaming update folder, blocking update URL, from service manager, registry editor, system configuration and modifying plist file.

www.webnots.com

 

이제 크롬을 삭제(프로그램 추가/제거에서 크롬 삭제)하고 아래 경로에서 재설치. (바이러스 검사해본 결과 이상 없어서 저도 이렇게 복구했습니다.)  설치 후 한 번 더 위와 같이 구글 업데이트 서비스 사용 안함으로 해주세요. (크롬을 설치하니 자동으로 서비스 시작으로 되는 것 같더군요.)

https://www.slimjet.com/chrome/download-chrome.php?file=files%2F76.0.3809.100%2FChromeStandaloneSetup64.exe

'Develop > Windows' 카테고리의 다른 글

윈도우 리스닝포트 찾아 강제종료  (0) 2021.02.24
자모병합 / 한타영타 변환기  (2) 2020.11.10
커맨드(cmd)창 관리자권한 실행  (1) 2019.10.23
Windows10 IP Change command line  (0) 2019.10.23
DOS Batch Script  (0) 2019.10.06
반응형

 

cmd(콘솔)창 관리자권한으로 실행하기

cmd 창을 자주 사용하는데, 가끔 관리자 권한이 필요해서 다시 창을 띄우는데 띄우기가 번거롭다.
윈도우 기본 기능으로 빨리 cmd창을 관리자 권한으로 실행할 수 없을까?

  1. Ctrl+Shift+ESC 키를 누른다. (작업관리자 실행됨)
  2. Alt를 계속 누른 상태로 F, N을 차례로 누른다.
    image
  3. cmd를 입력 후, 키, 스페이스키, 엔터 순서로 입력한다. (관리자 권한을 체크하여 실행)

Author: crazyj7@gmail.com

추가로... 더 간단한 방법이 있다...

윈도우키+X 후에 A를 누른다.

 

 

'Develop > Windows' 카테고리의 다른 글

자모병합 / 한타영타 변환기  (2) 2020.11.10
크롬 한글 버그 수정  (1) 2019.10.28
Windows10 IP Change command line  (0) 2019.10.23
DOS Batch Script  (0) 2019.10.06
curl 사용법/HTTP 테스트  (0) 2019.10.01
반응형
windows_ipchange

Windows10 IP Change Command line

윈도우10에서 PC나 노트북 이동시 자주 사용하는 곳을 왔다갔다할 경우 자주 IP 변경해야 할 경우, 그 때마다 네트웍 설정을 해 주기가 너무 번거롭다.
이것을 커맨드 라인으로 자동화 할 수 있으면 편리하다.
이런 사용자들을 위한 팁.
윈도우 10 IP 변경 커맨드 라인

장소1

현재 네트웍 정보를 확인하고 화면캡쳐를 해둘것을 권장한다. 나중에 찾아볼때 편하다. 네트웍디바이스(NIC)명을 확인하고 ip address, network, gateway, dns 설정 등이다.

ip1
위에서 “이더넷 어댑터” 뒤에 나온 스트링을 잘 기억해야 한다. 보통은 “로컬 영역 연결” 이라고 나오는 것이 일반적이다. PC마다 다를 수 있어서 확인해 주어야 한다. 여기서는 “알수없음” 이라고 나와있어서 그렇게 작성하였다.

아래와 같이 배치 파일(network_pub.bat)을 만들어 준다. 이것은 장소1에서 현재의 네트웍 상태로 만들어주는 스크립트이다. 위에서 나오는 필드들을 잘 확인하여 자신에 맞는 형태로 바꾸어 주면 된다. (인터페이스명과 IP들만 바꿔준다.)

ip2

netsh int ip set address "알수없음" static 172.16.10.11 255.255.0.0 172.16.10.254 1
netsh int ip set dns "알수없음" static 172.16.10.1 primary  validate=no
netsh int ip add dns "알수없음" 168.126.63.1 index=2 validate=no

장소2

장소2에서도 마찬가지로 부여받은 고정IP로 네트웍을 설정한 후, 현재 상태를 확인한다. (이것도 별도로 화면캡쳐 해 두는 것이 좋다.)
이더넷 어탭터(NIC 인터페이스) 이름은 장소1에서 사용한 이름과 동일할 것이다. IP address, NetMask, Gateway, DNS IP를 확인한다.
ip3

이제 장소2의 네트웍 변경 커맨드를 아래와 같이 작성한다. (인터페이스명과 IP들만 바꿔준다.)
image

netsh int ip set address "알수없음" static 192.168.10.11 255.255.255.0 192.168.10.254 1
netsh int ip set dns "알수없음" static 8.8.8.8 primary validate=no

완료

주의!!! 위 배치 파일을 실행하기 위해서는!!!
cmd.exe 창을 열 때 반드시 관리자 권한으로 실행해야 한다.
(cmd 명령프로프트 아이콘에서 마우스 우클릭하여 관리자권한으로 실행)

이제 장소 1에서는 network_pub.bat를 실행하고, 장소2에서는 network_pri.bat를 실행하기만 하면 고정IP가 설정대로 변경될 것이다.
이제 더 이상 장소 이동시 귀찮은 네트웍 설정 변경 작업을 하지 않아도 된다!!!

Author: crazyj7@gmail.com

'Develop > Windows' 카테고리의 다른 글

크롬 한글 버그 수정  (1) 2019.10.28
커맨드(cmd)창 관리자권한 실행  (1) 2019.10.23
DOS Batch Script  (0) 2019.10.06
curl 사용법/HTTP 테스트  (0) 2019.10.01
화면/윈도우 동영상 녹화 (mp4, gif)  (0) 2019.09.23
반응형
DOSBatch

DOS Batch

윈도우 커맨드에서 실행하는 DOS 스크립트 작성 방법. 쉽지만 막상 필요한 것을 하고 싶을 때 쉽지만은 않다. 자료가 많이 부족하다.

주석

  • 주석 명령은 설명문으로 실행되지 않는다.
  • rem 으로 실행하고 뒤에 주석문(아무 스트링)을 입력하면 된다. 주석은 프로그래밍시에 간략한 설명을 위한 것이다.
  • @rem test message… : 앞에 @를 붙이면 배치파일 실행시 rem 커맨드 출력이 안되도록 한다. 물론 그 전에 @echo off을 해 두었다면 @을 붙일 필요없다.
  • 더 간단하게는 :: 으로 시작하면 주석이 된다. 이것은 커맨드 출력도 되지 않아 더 간편히 사용할 수 있다. rem과 다르게 아예 없는 것으로 취급된다.

변수와 출력

  • dos batch는 파일 확장자를 .bat 또는 .cmd로 하여 메모장으로 텍스트 파일로 작성하면 된다.
  • 기본 적인 출력은 “echo” 커맨드가 있다. 뒤에 출력할 내용을 적으면 된다.
  • 출력 내용에 변수명을 적어 변수값을 출력할 수 도 있다. 또한 변수중에는 미리 시스템에서 정의된 값들도 있어서 유용하다.
  • 변수 설정은 set으로 변수이름과 값을 =으로 할당한다.
  • 변수 사용시에는 변수 이름 앞뒤로 %를 붙인다. 변수 삭제는 빈 값을 할당한다. (빈 값이 있는 변수로 만드는 것이 아니라 변수 자체를 삭제한다는 의미!)

SET FOO=hello world
echo %FOO%
echo %FOO%xxx%FOO%
SET FOO=

  • for문의 변수 이름은 커맨드창에서 바로 실행할 때 영문자앞에 %를 붙인다. 그러나, Dos batch file(.bat)에서 for문의 변수 영문자 앞에 %% 이렇게 %를 두 개 붙인다!
c:\> copy con test1.bat
@echo off
@rem this is a test batch...
set aaa=hello
echo %aaa%
echo %1
^Z
c:\> test1 kim
hello
kim
  • @echo off는 이후에 echo 실행명령은 출력하지 않고, 결과만 출력하도록 한다.

  • batch 파일 실행시 뒤에 파라미터를 줄 수 있는데, 순서대로 %1, %2, … 이렇게 변수로 사용할 수 있다.

  • 줄바꿈. 엔터 입력. 빈 줄 출력

echo.

  • 공백으로 시작하는 문자열 출력

echo. aaa
echo aaa (이것도 이제는 가능함. 앞에 공백 두 개)

  • 특수 문자 출력시 앞에 ^를 사용

echo ^< 이것은 꺾은 괄호 ^>
echo ^| 파이프
echo ^^ 두 개 입력시 하나 출력

스트링 처리

  • 문자열 추출 mid / substr

FOO 변수의 값에서 인덱스 6부터 3글자를 추출. (인덱스는 0부터 시작) 뒤에 수를 생략하면 끝까지를 의미함. -1은 마지막 바로 한글자를 의미.
set BAR=%FOO:~6,3%
set BAR=%FOO:~5%
set BAR=%FOO:~-3% : FOO가 파일명일떄 마지막 세글자(확장자명)을 가져온다.

연산

  • 수 값을 할당하거나 연산하려면 SET /a를 사용한다.

set /a num=4*8+8/2+122
set /a num=1
set /a num+=2
if %num% GEQ 3 echo big

환경 변수

%CD% : 현재 작업 디렉터리
%DATE% : date 커맨드와 같은 포맷의 날짜
%TIME%
%RANDOM% : 0~32767 범위의 수
%ERRORLEVEL%
%CMDCMDLINE%

파라미터

  • 파라미터는 %1, %2, 등으로 받는다. (%0은 배치파일 이름 자체임. %9까지 가능)
  • %*은 모든 파라미터를 의미함.
  • 파리미터 내부에 공백이 있으면 커맨드상에서 파라미터를 "로 둘러싼다. 단, 스크립트에서 "를 제거하고 받으려면 %~1, %~2 로 받는다.
  • 파라미터가 없으면 종료

if “%1” == “” goto :eof
파라미터에 "를 추가해 주어야 한다.’

Redirect

  • stderr까지 파일로 기록

cmd /c “test.exe” > “output.txt” 2>&1

  • 실행만 하고 출력은 없앰 (no output)

dir > nul
nul 이라는 파일은 생성되지 않는다. (NUL 대소문자 상관없음. 주의! L이 한 개임.)

type nul > a
0바이트짜리 a라는 파일 생성

program 2>output.txt
stderr 출력을 파일로 기록

배치내에서 배치 실행하기

call b.bat param1 param2

  • 동시 실행

start /d “directory…” /b program.exe
start /d “directory…” /b program.exe

디렉터리 경로명 이동

cd /d e:\temp

반복문 for

  • integer 증가

for /L %%n in (1,1,100) do net user %%n /add
1부터 100까지 증가하고, 숫자로 계정명으로 사용자를 추가한다.
(for의 변수는 커맨드로 실행시에는 %하나 batch file인 경우는 %% 두개를 사용한다.)

  • 1부터 5까지 출력

for /L %n in (1,1,5) do echo %n

  • 1부터 5까지 출력. 2씩 건너뜀.

for /L %n in (1,2,5) do echo %n
1,3,5 각각 한 줄로 출력됨.

goto

  • 종료시

goto :eof 또는 goto:eof
eof 레이블은 만들필요없이 미리정의된 거라 그대로 사용 가능
또는 exit /b 0

  • 레이블 지정과 goto

레이블 지정시에는 앞에 :을 붙이고 goto 시에는 :를 빼야 한다.
:loop
echo infinite…
goto loop

Sleep

@rem 3sec sleep
@ping 1.2.3.4 -n 1 -w 3000 > NUL

IF

  • 조건 판단
  • 같은지 확인 == 앞 뒤에 공백은 없어도 됨.

if %var% == 1 goto done
echo a
:done
echo b

  • if else : 괄호, 공백 주의

if %var% == 0 (
echo a
) else (
echo b
)

  • /i 옵션 : 대소문자 구분 없이 비교. (case-insensitive)

사용자 입력/텍스트파일변수

  • yn 선택지 (or 스트링 입력)

set /p result=message (Y/N)?
echo %result%
빈 값을 검사하려면 아래 코드를 참고

@echo off
:: init var for empty string.
set "result="
set /p result=are you ok(y/n)?
if "%result%" == "" (
echo no input
goto :eof
)
if /i "%result%"=="y" goto YES
if /i "%result%"=="n" goto NO

echo your input is %result%

  • 텍스트 파일을 첫 행을 읽어 변수에 할당

set /p var=<%temp%\filename.txt

> copy con lines.txt
hello1
hello2
hello3
^Z
> set /p var=<lines.txt
> echo %var% %var%
hello1 hello1

디렉터리

  • 중간 디렉터리까지 모두 생성. mkdir 대신 md를 사용

md “a\b\c”

  • 하위 파일/디렉터리 모두 삭제. /s 옵션

rmdir /s “dirname”

기타

  • 종료 : exit

exit /b 0 : /b는 cmd창은 남겨둔다는 의미. 뒤의 숫자는 프로그램 종료 리턴값. (다른 배치에서는 이 값을 errorlevel 변수로 받아 사용할 수 있다.)

  • 파일 병합 / 붙이기 concate
  • 파일 세 개를 붙여서 하나의 파일로 만든다.

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

  • 배치 파일에서 다른 배치 파일 실행하기

call b.bat : call을 사용한다. 그냥 b.bat로 실행하면? b.bat가 종료시 나머지 스크립트로 돌아오지 않고 종료된다.

Author: crazyj7@gmail.com
Written with StackEdit.

'Develop > Windows' 카테고리의 다른 글

커맨드(cmd)창 관리자권한 실행  (1) 2019.10.23
Windows10 IP Change command line  (0) 2019.10.23
curl 사용법/HTTP 테스트  (0) 2019.10.01
화면/윈도우 동영상 녹화 (mp4, gif)  (0) 2019.09.23
windows 10 kernel structure  (0) 2015.08.28
반응형
curl

curl 사용법

패킷/메시지를 네트웍으로 전송하는 유용한 유틸리티입니다. HTTP/S로 GET/POST 등으로 데이터를 전송할 수 있습니다.

  • 설치

  • curl -h 를 하면 옵션이 다 나온다. 너무 많은 내용으로 읽어보기 어렵다. 필요할 때 마다 찾아서 사용하거나 아래 예제를 통해 옵션들을 배워보자.

사용 방법

많이 사용되는 옵션

  • v : 상세로그 보기
  • o : 출력 파일 지정
  • O : 출력 파일명을 자동으로 원격지 파일명과 동일
  • H : 헤더 추가
  • A : 에이전트 추가
  • d : 데이터 추가로 폼 데이터나 JSON 데이터 등을 POST로 보낸다. (단, -G 옵션이 있으면 GET으로 적용된다.)

HTML 받아오기(기본사용)

URL 주소만 뒤에 주면 알아서 받아온다. (GET방식) image

파일 받아오기

URL 주소가 image나 zip 등 바이너리 파일 주소인 경우 텍스트 출력이 아니라 파일로 받아오기. 단순하게 파일 받는 용도로 쓸 거면 wget 유틸리티가 더 편하다.
- URL 뒤에 --output 옵션으로 저장할 파일명을 지정한다. (–output 은 -o 와 같다. 대문자 -O로 하면 뒤에 파일명 지정할 필요가 없다. 원격지 파일명과 동일한 파일명으로 자동으로 생성한다.)

curl https://curl.haxx.se/windows/dl-7.66.0_2/curl-7.66.0_2-win64-mingw.zip -o a.zip
curl https://curl.haxx.se/windows/dl-7.66.0_2/curl-7.66.0_2-win64-mingw.zip -O

HTTP 헤더 보기

$ curl 주소 : 해당 주소의 html content만 출력
$ curl -i 주소 : 해당 주소의 html 헤더와 content를 모두 출력
$ cur -I 주소 : 해당 주소의 html 헤더만 출력 (-I는 --head와 같다)

GET에 추가 정보

헤더 추가
$ curl -H “Host: test.com” -H “name:jun” [주소] : 헤더 정보 추가하기. -H를 여러 번 사용할 수 있다.

User-Agent 추가
$ curl -A “Mozilla/5.0” [주소] : -A 뒤에 지정.
일반적으로 에이전트를 식별하거나 브라우져인척 가장하기 위해 사용한다.

URL 파라미터 추가
$ curl [주소]?key=value&key=value… : URL뒤에 파라미터를 지정.
$ curl -G [주소] -d “key=value&key=value” : -d 옵션은 POST DATA로 지정하는데, -G 옵션을 주면 GET방식 파라미터로 변한다.
$ curl -G [주소] -d “key=value” -d “key=value” : -d 옵션을 나눌 수도 있다.
즉, 위와 같이 입력하면 자동으로 [주소]?key=value&key=value 이런식으로 변환되어 GET으로 요청된다.

POST 사용하기

데이터추가
$ curl -X POST [주소] -d “데이터” : -X POST 옵션은 생략가능 (content-type 지정이 없으면 application/x-www-form-urlencoded 타입으로 보낸다.)

FORM 데이터 추가
HTML의 FORM에 name으로 지정된 부분에 값을 채워서 POST할 경우 사용한다. name을 key로 하여 아래처럼 값을 채워 보낸다.
$ curl -X POST [주소] -d “key=value&key=value&…” : (-X POST는 생략 가능. -d는 --data와 같다)
$ curl -X POST [주소] -d “key=value” -d “key=value” : (상동)
$ curl [주소] --data-urlencode ‘msg=한글’ --data-urlencode ‘name=kkk’ : url인코딩 변환 후 보낸다.

JSON으로 보내기
$ curl -H ‘Content-Type: application/json’ -X POST [주소] -d ‘{“id”:“abc”, “pwd”:“def”}’
$ curl -H “Content-Type: application/json” http://localhost:18899/sum -d “{\“a\”:10,\“b\”:20}”

DOS 커맨드에서는 데이터를 "로 감싸고 내부에 "가 있으면 \를 앞에 추가해 줘야 한다. Linux에서는 바깥을 '로 감싸면 된다. -d 옵션이면 POST로 가기 때문에 별도로 -X 옵션은 필요없다.

그 외 방법으로 사용하기

DELETE로 요청하기
$ curl -X DELETE -G [주소] -d key=value -d key=value
HTTP 인증
$ curl -v -u ID:PASSWORD [주소]

리눅스에서 웹서버 정상 체크 스크립트

#!/bin/bash

if [ "$#" -lt 1 ]; then
    echo "Usage: $0 [URL]"
    exit 1
fi

SVR=$1
RES=$(curl -L -s -o /dev/null -w "%{http_code}" ${SVR})

if [ ${RES} -ne 200 ];then
    echo "${SVR} fail: ${RES}"
    exit ${RES}
fi;

Author: crazyj7@gmail.com
Written with StackEdit.

반응형
screenvideocapture

Screen Capture (Video)

PC 화면의 일부를 캡쳐하는 방법은 많이 있는데…
PC 화면의 일부나 특정 윈도우를 간단하게 영상을 캡쳐하고 싶을 때는 어떻게 해야 할까? 무료 유틸리티를 사용하고 싶다.

먼저 Free License 유틸리티로 동영상 처리 관련된 강력한 프로그램인 ffmpeg를 권장한다.
물론 사용 방법은 커맨드 등을 익혀야 되서 복잡할 수 있지만, 여기서는 이것을 dos batch script로 만들어서 한 번만 만들어 두면 이후에 공짜로 편하게 사용할 수 있다.

  1. 프로그램 설치

구글에서 ffmpeg windows download 라고 검색해서 설치한다.
잘 모르겠으면 윈도우 패키지 링크 주소는
ffmpeg windows 64 bit binary download
다운 받은 파일을 열어 압축을 풀면 bin 폴더가 있다. bin 폴더의 파일들을 c:\windows에 복사하자. (별도 유틸리티 폴더를 만들고, 환경설정으로 PATH에 설정해 두는 것이 좋긴하지만 귀찮으면 위와 같이 한다.)
이제 DOS 커맨드 창에서 ffmpeg라고 실행해서 잘 되는지 확인한다.
image

  1. 스크립트 작성

스크립트1: 특정 윈도우 창만 캡쳐하기
ffmpeg_videocap.bat “윈도우제목” "파일명"
파일명.mp4로 파일이 생성됨.

@echo off
if "%1"=="" goto usage

:: by crazyj7@gmail.com
:: famerate ; 24, 30. 60 
:: 파일 확장자는 mp4, avi, mpg 등 
:: drawmouse : 마우스 커서를 보여줄지 여부 (1/0)

ffmpeg -y -rtbufsize 100M -f gdigrab -framerate 30 -probesize 10M -draw_mouse 0 -i title="%1" -c:v libx264 -r 30  -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" "%2.mp4"

goto:eof

:usage
echo Usage)
echo %0 "window title" "filename"
goto:eof

스크립트2: 전체 화면 동영상 캡쳐하기 (모니터가 2개면 둘 다 캡쳐된다.)
ffmpeg_videocap_fullscreen.bat "파일명"

파일명.mp4 파일 생성됨.

@echo off
if "%1"=="" goto usage
 
:: crazyj7@gmail.com 
:: famerate ; 24, 30. 60 
:: 파일 확장자는 mp4, avi, mpg 등 
:: drawmouse : 마우스 커서를 보여줄지 여부 (1/0)
 
ffmpeg -y -rtbufsize 100M -f gdigrab -framerate 30 -probesize 10M -draw_mouse 1 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p "%1.mp4"
 
goto:eof
  
:usage
echo Usage)
echo %0 "filename"
goto:eof

스크립트3: 전체 화면 동영상 캡쳐하기. (모니터2개인경우 모니터1만)
주의! 모니터1의 해상도 값으로 코드를 바꿔줘야 한다. (1280x1080 예이다.)
특정 영역 캡쳐하기도 된다. (offset과 크기 조정)
ffmpeg_videocap_full1280x1080.bat “파일명”

@echo off
if "%1"=="" goto usage

:: crazyj7@gmail.com
:: famerate ; 24, 30. 60 
:: 파일 확장자는 mp4, avi, mpg 등 
:: drawmouse : 마우스 커서를 보여줄지 여부 (1/0)

ffmpeg -y -rtbufsize 100M -f gdigrab -framerate 30 -probesize 10M -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p "%1.mp4"

goto:eof

:usage
echo Usage)
echo %0 "filename"
goto:eof

  1. 실행
  • 커맨드 실행 종료 (녹화 종료)는 q 또는 ^c(컨트롤c)

특정 윈도우만 동영상 캡쳐를 하려면 아래와 같이 한다.
윈도우 타이틀은 창의 상단에 타이틀바에 기록된 스트링이다. (없거나 못 찾을 경우는 화면 일부영역 캡쳐를 참고하기 바란다.)

c:\temp> ffmpeg_videocap “stackedit” “aaa”
"stackedit"란 제목의 창을 찾아 aaa.mp4 동영상 파일을 생성한다.
aaa

전체화면 동영상 캡쳐
c:\temp> ffmpeg_videofullscreen “full”
전체 화면을 녹화하여 full.mp4 파일이 생성된다. (모니터가 2개면 둘 다 나온다.)
full

모니터1만 캡쳐 또는 일부 영역만 캡쳐
(일부 영역을 지정하려면 스크립트를 수정하여 offset과 size를 조정하면 된다.)
c:\temp> ffmpeg_videofullscreen_1920_1080 “full2”
모니터1만 (1920x1080 해상도) 녹화하여 full2.mp4 동영상 파일을 생성한다.
full2

  1. 보너스 (동영상을 gif로)

생성한 동영상 파일을 움직이는 gif 파일로 변환하기
ffmpeg -i aaa.mp4 aaa.gif
브라우저에 aaa.gif 파일을 드래그드롭하면 움직이는 gif 파일이 재생된다. (웹에 올리기 편하다.)

image

Written with StackEdit.

'Develop > Windows' 카테고리의 다른 글

DOS Batch Script  (0) 2019.10.06
curl 사용법/HTTP 테스트  (0) 2019.10.01
windows 10 kernel structure  (0) 2015.08.28
윈도우8/8.1에서 visual studio 2008 설치실패시 / .net framework 설치  (0) 2015.08.20
64비트 프로그래밍  (2) 2015.06.05
반응형
Stopwatch

StopWatch

00:00:00.000
반응형
mysql query

MySQL Query

Select

두 개의 테이블(또는 Self Table)에서 다른 값 찾기

TABLEA 테이블에서 키가 COMPARE_ID이고, F98 필드에 대해서 같은 테이블의 같은 키, 같은 필드의 필드값이 다른 것을 찾는 쿼리
(두 개의 테이블로 할 경우는 테이블 명과 where 조건절만 수정하면 된다.)
비교할 대상의 테이블 두 개를 UNION해서 같은 키 에 대해 정렬하고 그룹별 카운팅을 하면 2개씩 나와야 정상인데, 1개인 것이 바로 다른 부분이다.

SELECT COMPARE_ID, F98
FROM (
SELECT T1.COMPARE_ID, T1.F98 FROM TABLEA T1 WHERE T1.AP_ID='A08v25'
 UNION ALL SELECT T2.COMPARE_ID, T2.F98  FROM TABLEA T2 WHERE T2.AP_ID='A10v25'
 ) t
 GROUP BY COMPARE_ID, F98
 HAVING COUNT(*) = 1
 ORDER BY COMPARE_ID
 

Written with StackEdit.

반응형
java_rsa_test

JAVA RSA Test

RSA 알고리즘으로 JAVA에서 키쌍(공개키, 개인키)를 생성해 보고,
암복호화 및 서명 검증 테스트를 해보자.

package test_tryexcept;

import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import org.apache.commons.codec.binary.Base64;

public class RSATest {

	public static void main(String[] args) throws IllegalBlockSizeException, BadPaddingException {

		// Create Key Pair . (public key, private key)
		System.out.println("1. create key pair -----------------------------");
		PublicKey publicKey1 = null;
		PrivateKey privateKey1 = null;

		SecureRandom secureRandom = new SecureRandom();
		KeyPairGenerator keyPairGenerator;
		try {
			keyPairGenerator = KeyPairGenerator.getInstance("RSA");
			keyPairGenerator.initialize(512, secureRandom);

			KeyPair keyPair = keyPairGenerator.genKeyPair();
			publicKey1 = keyPair.getPublic();
			privateKey1 = keyPair.getPrivate();

			KeyFactory keyFactory1 = KeyFactory.getInstance("RSA");
			RSAPublicKeySpec rsaPublicKeySpec = keyFactory1.getKeySpec(publicKey1, RSAPublicKeySpec.class);
			RSAPrivateKeySpec rsaPrivateKeySpec = keyFactory1.getKeySpec(privateKey1, RSAPrivateKeySpec.class);
			System.out.println("Public  key modulus : " + rsaPublicKeySpec.getModulus());
			System.out.println("Public  key exponent: " + rsaPublicKeySpec.getPublicExponent());
			System.out.println("Private key modulus : " + rsaPrivateKeySpec.getModulus());
			System.out.println("Private key exponent: " + rsaPrivateKeySpec.getPrivateExponent());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}

		// 2. key save to file. (base64 encoding)
		System.out.println("\n2. save key file -----------------------------");
		byte[] bPublicKey1 = publicKey1.getEncoded();
		String sPublicKey1 = Base64.encodeBase64String(bPublicKey1);
		byte[] bPrivateKey1 = privateKey1.getEncoded();
		String sPrivateKey1 = Base64.encodeBase64String(bPrivateKey1);

		try {
			BufferedWriter bw1 = new BufferedWriter(new FileWriter("PublicKey.txt"));
			bw1.write(sPublicKey1);
			bw1.newLine();
			bw1.close();
			BufferedWriter bw2 = new BufferedWriter(new FileWriter("PrivateKey.txt"));
			bw2.write(sPrivateKey1);
			bw2.newLine();
			bw2.close();
			System.out.println("PublicKey.txt, PrivateKey.txt file saved.") ;
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 3. load key file
		System.out.println("\n3. load key file -----------------------------");
		String sPublicKey2 = null;
		String sPrivateKey2 = null;

		BufferedReader brPublicKey = null;
		BufferedReader brPrivateKey = null;
		try {
			brPublicKey = new BufferedReader(new FileReader("PublicKey.txt"));
			sPublicKey2 = brPublicKey.readLine();
			brPrivateKey = new BufferedReader(new FileReader("PrivateKey.txt"));
			sPrivateKey2 = brPrivateKey.readLine();
			System.out.println("load PubilcKey.txt, PrivateKey.txt");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (brPublicKey != null)
					brPublicKey.close();
				if (brPrivateKey != null)
					brPrivateKey.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// key string to key data. 
		byte[] bPublicKey2 = Base64.decodeBase64(sPublicKey2.getBytes());
		PublicKey publicKey2 = null;
		byte[] bPrivateKey2 = Base64.decodeBase64(sPrivateKey2.getBytes());
		PrivateKey privateKey2 = null;
		try {
			KeyFactory keyFactory2 = KeyFactory.getInstance("RSA");
			X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(bPublicKey2);
			publicKey2 = keyFactory2.generatePublic(publicKeySpec);
			PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(bPrivateKey2);
			privateKey2 = keyFactory2.generatePrivate(privateKeySpec);
		} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
			e.printStackTrace();
		}

		// 4. encrypt test
		System.out.println("\n4. encrypt test -----------------------------");

		String sPlain1 = "This is an example.";
		String sPlain2 = null;
		try {
			Cipher cipher = Cipher.getInstance("RSA");
			System.out.println("input:"+ sPlain1);
			// 공개키 이용 암호화
			cipher.init(Cipher.ENCRYPT_MODE, publicKey2);
			byte[] bCipher1 = cipher.doFinal(sPlain1.getBytes());
			String sCipherBase64 = Base64.encodeBase64String(bCipher1);
			System.out.println("encrypt(pubkey):"+sCipherBase64);

			// 개인키 이용 복호화
			byte[] bCipher2 = Base64.decodeBase64(sCipherBase64.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, privateKey2);
			byte[] bPlain2 = cipher.doFinal(bCipher2);
			sPlain2 = new String(bPlain2);
			System.out.println("decrypt(prikey):"+sPlain2);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}

		///////////////////////////////////////////////////////////////////////
		// 5. digital sign test
		System.out.println("\n5. digital sign test -----------------------------");
		try {
			Cipher cipher = Cipher.getInstance("RSA");
			
			// sign
			Signature rsa = Signature.getInstance("SHA1withRSA"); 
			rsa.initSign(privateKey2);
			rsa.update(sPlain1.getBytes());
			byte[] ds = rsa.sign();
			
			String dsBase64 = Base64.encodeBase64String(ds) ;
			System.out.println("signature:"+dsBase64);
			
			// verify by pubkey
			rsa.initVerify(publicKey2);
			rsa.update(sPlain1.getBytes());
			boolean bret = rsa.verify(ds);
			System.out.println("verify:"+bret);
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (SignatureException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

결과

1. create key pair -----------------------------
Public  key modulus : 8248696551746632304090375750090525095455249159692340933778807179048823058050266268679997440009797868855529133651252439721233111988778274617606294142148157
Public  key exponent: 65537
Private key modulus : 8248696551746632304090375750090525095455249159692340933778807179048823058050266268679997440009797868855529133651252439721233111988778274617606294142148157
Private key exponent: 7921703957617548721899753716754620427893524678607141706686365641426276369846256193464100508658766225776306979668612467878281049443630080785215985430577793

2. save key file -----------------------------
PublicKey.txt, PrivateKey.txt file saved.

3. load key file -----------------------------
load PubilcKey.txt, PrivateKey.txt

4. encrypt test -----------------------------
input:This is an example.
encrypt(pubkey):NHeP0KvZpgqd/yE5HEbh5v/kuOP6jvKE8+y9wJb1p7Nt0SOlJrFrtkn+i+75h2d2EiSBZBxBAMErsG7wp6BN3A==
decrypt(prikey):This is an example.

5. digital sign test -----------------------------
signature:KSsmktqxCDjmy4mHMxT+aUb/y2m7b4B9zq1jxMixGs7J8dPTqyKD5LJkXgNwIm4pY6JIn9YotxwyWUP3hjzaXA==
verify:true

Written with StackEdit.

+ Recent posts