굿!~^^
[사진출처] Javascript Window size|작성자 유노아빠
브라우져 버전별 정리
| Browser | window. innerHeight | document. body. clientHeight | document. documentElement. clientHeight |
|---|---|---|---|
| Opera 9.5+ strict | window | document | window |
| Opera 9.5+ quirks | window | window | document |
| Opera 7-9.2 | window | window | document |
| Opera 6 | window | window | N/A |
| Mozilla strict | window | document | window |
| Mozilla quirks | window | window | document |
| Newer KHTML | window | document | window |
| Older KHTML | window | document | document |
| Chrome/Safari 4+ | window | document | window |
| Safari 3- | window | document | document |
| iCab 3 | window | document | document |
| iCab 2 | window | window | N/A |
| IE 9+ strict | window | document | window |
| IE 6-8 strict | N/A | document | window |
| IE 5+ quirks | N/A | window | 0 |
| IE 4 | N/A | window | N/A |
| ICEbrowser | window | window | document |
| Tkhtml Hv3 | window | window | document |
| Netscape 4 | window | N/A | N/A |
테스트!
function alertSize() {
var myWidth = 0, myHeight = 0;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
myWidth = window.innerWidth;
myHeight = window.innerHeight;
} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
myHeight = document.documentElement.clientHeight;
} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//IE 4 compatible
myWidth = document.body.clientWidth;
myHeight = document.body.clientHeight;
}
window.alert( 'Width = ' + myWidth );
window.alert( 'Height = ' + myHeight );
}
테스트2 - SCROLLER XY 구하기
function getScrollXY() {
var scrOfX = 0, scrOfY = 0;
if( typeof( window.pageYOffset ) == 'number' ) {
//Netscape compliant
scrOfY = window.pageYOffset;
scrOfX = window.pageXOffset;
} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
//DOM compliant
scrOfY = document.body.scrollTop;
scrOfX = document.body.scrollLeft;
} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
//IE6 standards compliant mode
scrOfY = document.documentElement.scrollTop;
scrOfX = document.documentElement.scrollLeft;
}
return [ scrOfX, scrOfY ];
}
그래서 그런지 최신버전하고 안맞다고 말씀을 하셨습니다.
다시 찾은 twitter4j 사이트...
2.2.5 버전이 최신버전으로 릴리즈가 되었더군요.
기존에 올렸던 내용으로 똑같이 만들어보니 ...역시나..안되는군요.
샘플코드를 보니..약간 변경이 되었습니다.
Oauth 2.0 으로 올려와서 그런지...
oauth_verifier 이란 넘이 생겼습니다.._-;;원래 있었나...기억이 가물가물...
예전에는 oauth_token 만 있었던거 같은데..
암튼..
기존소스와 비교해보면
[기존소스]
[트위터 호출 전]
Twitter twitter = new TwitterFactory().getInstance();
[트위터 콜백 호출]
String oauthToken = request.getParameter("oauth_token");
String secret = (String)request.getSession().getAttribute("Secret");
AccessToken accessToken = null;
[버전업소스]
[트위터 호출 전]
Twitter twitter = new TwitterFactory().getInstance();
[여기서 requestToken 를 session에 통으로 담아야 합니다. ]
[트위터 콜백 호출]
Twitter twitter = new TwitterFactory().getInstance();
[requestToken 를 통으로 가져옵니다.]
String oauth_verifier= request.getParameter("oauth_verifier");
accessToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);
twitter.setOAuthAccessToken(accessToken);
User statuses = twitter.getUserTimeline().get(0).getUser();
System.out.println(statuses );
차이점은 호출전 requestToken 항목을 통으로 session 에 담아서 콜백 호출 후 통으로 불러와서
반영을 한다는 것입니다.
그리고 oauth_verifier 파라미터를 사용된다는 점이구요.
requestToken 이 callback 항목을 부르기전에 uri 값을 저장하여,
callback 에서는 호출했던 uri 값을 비교하는거 같습니다. 아닌가__;;;;
많은 변화가 있었군요..
그럼 모두 즐프요~
저 역시 최근에 구글맵을 가지고 서비스를 오픈하였습니다.
어느 날 맵을 보면서 너무 밋밋한 느낌이 들었고, 좀 더 고급스럽게 꾸미고 싶었습니다.
저는 여태 javascript 로만 맵을 불러서 사용했는데
지도 위에 png 투명한 배경 이미지를 올려서 사용해보자는 생각으로
고급? 스러운 이미지를 위에 다가 올렸지만,,javascript로 구현시키는건 먼가...부드럽지 못 했습니다.
제가 잘 몰라서 그런지 어설픈 느낌이 들더라구요..
다시 찾은..code사이트..
code.google.com 에 보니 flash 기반으로도 map 을 사용할 수 있다는 걸 알았습니다.
바로 적용시켜봤습니다.
와우~ 쌈빡합니다....ㅋㅋ
휠감도라던지..아이콘 모양, 플래쉬기반이라..이미지 애니메이션을 다양하게 줄 수 있게다는 판단을 하였습니다.
굿~
개발 방법은 저의 블로그에 javascript 버전으로 올려놨는데
flash도 비슷합니다.
단지 actionscript로 개발된다는 점..
저는 Flex Builder 로 개발하였습니다.
구글맵에 나타나게 하는 방법은 너무나 쉽게 표현이 가능했고.
나머지는 actionscript 능력인데...일단 이미자만 올렸습니다.ㅋ
이미지는 자신이 원하는 배경을 사이즈에 맞게 포샵에서 편집해서
코딩으로 불러내면 되겠습니다.
[Embed(source="place_map.png")]
private var PlaceBg:Class;
addChild(placeBg);
저는 이렇게 sprite 에다가 bitmap 만 넣었습니다.
이제 다양한 모양의 구글맵을 만들어 보아요~
XCODE 4.2 또는 5 버전으로 업그레이드하고 빌드하고 Application Loader 에 올렸습니다.
근디.
iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6 (-19033) Unable to validate your application
이라는 메시지가 나옵니다. ㄷㄷ 머지하면서 구글링을 했죠.ㅋ
Build Settings 에 Architectures 에 아마 Standard (arm7) - ${ARCHS_STANDARD_32_BIT)
이라고 있을텐데 이걸 지우고 armv6 armv7 로 변경하시면 됩니다.
즐프하세요~
ffmpeg는 로컬로 돌아가는 프로그램이라서 java에서
해당 프로그램을 실행을 시켜야 합니다.
윈도우라면 exe파일을 실행을 시켜야 한다는 것인데
java에서는 ProcessBuilder 라는 놈이 사용되고 있습니다.
순서는 A폴더에 파일이 들어왔는지 실시간으로 체크하고
ffmpeg로 인코딩하고 완료가되면 B폴더로 옮기게 됩니다.
public String convert() {
String ffmpegPath = "ffmpeg 파일이 있는 경로"; 예) /work/ffmpeg
String fOriginal = "/work/upload.mp4"; //실시간으로 업로드되는 파일
String fResult = "/work/upload.flv"; // 인코딩하고 저장 할 파일위치
String[] cmdLine = new String[]{ffmpegPath,
"-i", // 변환시킬 파일위치
fOriginal,
"-ar",
"44100",
"-ab",
"32",
"-s",
"500x300", //화면 사이즈
"-b",
"768k", //비트레이트
"-r",
"24", //영상 프레임
"-y",
"-f",
"flv", // flv파일 형태로 출력
fResult}; // 저장하는 위치입니다.
// 프로세스 속성을 관리하는 ProcessBuilder 생성.
ProcessBuilder pb = new ProcessBuilder(cmdLine);
pb.redirectErrorStream(true);
Process p = null;
try {
// 프로세스 작업을 실행
p = pb.start();
} catch (Exception e) {
e.printStackTrace();
p.destroy();
return null;
}
try {
// p의 자식 프로세스의 작업이 완료될 동안 p를 대기시킴
p.waitFor();
} catch (InterruptedException e) {
p.destroy();
}
// 정상 종료가 되지 않았을 경우
if (p.exitValue() != 0) {
System.out.println("변환 중 에러 발생");
return null;
}
// 변환을 하는 중 에러가 발생하여 파일의 크기가 0일 경우
if (fResult.length() == 0) {
System.out.println("변환된 파일의 사이즈가 0임");
return null;
}
p.destroy();
}
private void exhaustInputStream(final InputStream is) {
// InputStream.read() 에서 블럭상태에 빠지기 때문에 따로 쓰레드를 구현하여 스트림을 소비한다
try {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String cmd = null;
while((cmd = br.readLine()) != null) { // 읽어들일 라인이 없을때까지 계속 반복
//System.out.println(cmd);
}
br.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
File f = new File("실시간으로 올라오는 파일위치");
if(f.exists()){
convert();
}
}
단일 프로세스보다는 스레드로 돌리면 더 좋겟죠?
인코딩을 하게되면 cpu를 많이 잡아 먹습니다. ffmpeg가 아니더라도 막 올라가더군요..
이제 이 파일을 window 에서는 service로 linux에서는 crontab에 들록되어
계속해서 돌려주면 되겠습니다.






