RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'분류 전체보기'에 해당되는 글 379
HTML/Ajax  2008/01/04 17:53
Content-Type은 Internt Media 타입이다. 그러나 왜 알아야 하는 가는 웹 서버 로그의 Content-Type을 보고 어떤 어플리케이션이 사용되어 있는지를 파악할 때 도움이 된다. 또한 웹 포렌식 작업을 할 때 실제 공격차단의 룰셋인지 아니면 정상적인 서비스인지의 룰인지를 판단해야 할 때 많은 도움이 될 것이다. 최근에는 웹 이외의 어플리케이션들이 HTTP+XML 형태로 사용을 많이 하기 때문에 오탐여부를 판단할 때 많은 도움이 된다.

1) Multipart Related MIME 타입
  - Content-Type : Multipart/related(기본형태)
  - Content-Type : Application/X-FixedRecord
  - Content-Type: Text/x-Okie; charset=iso-8859-1;

2) XML Media의 타입
 - Content-Type : text/xml
 - Content-Type : Application/xml
 - Content-Type : Application/xml-external-parsed-entity
 - Content-Type : Application/xml-dtd
 - Content-Type : Application/mathtml+xml
 - Content-Type : Application/xslt+xml

3) Application의 타입
 - Content-Type : Application/EDI-X12:  Defined in RFC 1767
 - Content-Type : Application/EDIFACT:  Defined in RFC 1767 
 - Content-Type : Application/javascript: Defined in RFC 4329
 - Content-Type : Application/octet-stream: <-- 디폴트 미디어 타입은 운영체제 종종 실행파일, 다운로드를 의미
 - Content-Type : Application/ogg: Defined in RFC 3534
 - Content-Type : Application/x-shockwave-flash: Adobe Flash files
 - Content-Type : Application/json: JavaScript Object Notation JSON; Defined in RFC 4627
 - Content-Type : Application/x-www-form-urlencode <-- HTML Form 형태


* x-www-form-urlencode와 multipart/form-data은 둘다 폼 형태이지만 x-www-form-urlencode은 대용량 바이너리 테이터를 전송하기에 비능률적이기 때문에 대부분 첨부파일은 multipart/form-data를 사용하게 된다.

4) 오디오 타입
- Content-Type : Type audio: Audio
- Content-Type : audio/mpeg: MP3 or other MPEG audio
- Content-Type : audio/x-ms-wma: Windows Media Audio;
- Content-Type : audio/vnd.rn-realaudio: RealAudio;  등등
 

5) Multipart 타입(아카이브 또는 개체)
- Content-Type : multipart/mixed: MIME E-mail;
- Content-Type : multipart/alternative: MIME E-mail;
- Content-Type : multipart/related: MIME E-mail; Defined in RFC 2387 and used by MHTML(HTML mail)
- Content-Type : multipart/formed-data : <-- 파일 첨부

6) TEXT 타입
- Content-Type : text/css
- Content-Type : text/html:
- Content-Type : text/javascript 
- Content-Type : text/plain:
- Content-Type : text/xml:


7) 기타 MIMERPC 예제들
가) HTTP with x/www-form-urlencoded 일반요청
POST /some/resource HTTP/1.1
Content-type: application/x-www-form-urlencoded
0=example.getStateName&1=10023


[응답]
HTTP/1.1 200 OK
Content-type: text/plain
New York


나) HTTP x/www-form-urlencoded namedArgs getTeam
POST /some/resource HTTP/1.1
Content-type: application/x-www-form-urlencoded
0=example.getTeam&state=New York&sport=Baseball


[응답]
HTTP/1.1 200 OK
Content-type: multipart/mixed, boundary=B
--BYankees

--BMets

--B


다) HTTP x/www-form-urlencoded unicode addUser
POST /some/resource HTTP/1.1
Content-type: application/x-www-form-urlencoded
0=example.addUser&fname=Igna%ACio&lname=Sanchez


라) HTTP with multipart/form-data 요청
POST /some/resource HTTP/1.1
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"


Joe Blow


--AaB03x 
content-disposition: form-data; name="pics"; filename="file1.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
...contents of file1.gif...


--AaB03x--

[응답]
HTTP/1.0 200 OK
Content-type: text/plain
OK


마) Uploading multiple files with unicode

POST /foo HTTP/1.0
Content-type: multipart/form-data, boundary=AaB03x


--AaB03x
content-disposition: form-data; name="field1"
Joe Blow


--AaB03x  <-- 여러개의 파일을 첨부할 때
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y

--BbC04y  <-- 첫번째 첨부파일은 텍스트
Content-disposition: attachment; filename="file1.txt"
Content-Type: text/plain; charset=UNICODE-1-1
Content-Transfer-Encoding: binary
... contents of some unicode file.txt ...


--BbC04y <-- 두번째 첨부파일은 이미지
Content-disposition: attachment; filename="file2.gif"
Content-type: image/gifContent-Transfer-Encoding: binary
...contents of file2.gif...

--BbC04y


----AaB03x--


바) XML and EMail 요청
HTP Request
POST /x/foo/bar HTTP/1.0
reply-to-url: callback@domain.com
message-id: abc123
aynch: required0=getAuthorization&1="bobjones"


[응답]
HTTP/1.0 200 OK
delivered-to: callback@domain.com
Content-length: 0
Mail/SMTP Response
To: callback@domain.comFrom: mimeRPC@otherplace.com
in-reply-to: abc123
content-type: text/xml
<?xml version="1.0"?><this><is /><xml /></this>

또한 간혹 Content-Type외에 x-vermeer-content-type 형태가 추가로 나오는 경우가 있는데 이것은 RPC 통신을 사용하는 것을 의미하며, 마이크로소프트 제품중에 SharePoint 서버 제품군과 프론트페이지가 이 x-vermeer-Content-Type를 사용하기 때문에 기억해 두기 바란다.

2008/01/04 17:53 2008/01/04 17:53
이 글에는 트랙백을 보낼 수 없습니다
저 렴한 광랜의 등장과 대용량 하드디스크 가격의 하락, 그리고 Adobe 사의 플래시 플레이어(Flash Player), 플래시 비디오(Flash Video)의 등장으로 인터넷을 통한 비디오 공유가 정말 많이 보편화 되었습니다. 구글 비디오(http://video.google.com)와 YouTube(http://www.youtube.com)가 이미 이런 비디오 사업을 시작한지 오래됐지만, 여전히 공략할 수 있는 틈새 시장이 굉장히 많이 있다고 할 수 있는데, 그럼 우리도 한 번 틈새 시장을 공략해 보면 어떨까? PHP, 플래시, Adobe의 Flex를 이용해서 어떻게 하면 비디오 공유 사이트를 만들 수 있을까? 사실 알고보면 정말 쉽게 만들 수 있습니다.

여기서는 PHP를 이용해서 웹 사이트를 만드는 방법 그리고 Flex를 이용해서 Flash로 된 비디오 뷰어를 만드는 방법에 대해서 설명을 하겠습니다. 그럼 먼저 더 진행하기 전에 준비해야 하는 소프트웨어 몇 가지를 살펴보도록 하죠.

우선 서버쪽에서는 PHP와 MySQL이 필요합니다. MySQL은 비디오에 대한 정보(예를 들면, 비디오의 파일 이름, 미리보기 파일, 미리보기 파일의 너비와 높이, 제목, 그리고 기타 정보 등)를 저장하는데 사용되겠습니다. PHP는 전체적인 페이지를 구성하는데 사용되게 됩니다.

그리고 ffmpeg(http://ffmpeg.mplayerhq.hu/) 이라고 하는 유틸리티 프로그램도 필요한데요, 이 프로그램은 유저가 올리는 비디오 파일을 플래시 비디오 파일(FLV)로 변환하는 역할을 수행하게 됩니다. ffmpeg은 비디오의 변환외에도 비디오의 스냅샷을 찍어서 미리보기 파일을 만들어 낼 수도 있습니다. 이 ffmpeg을 이용하게 되면 사실상 어려운 작업을 손쉽게 처리할 수가 있어서 우리가 MyTube를 구현하는데 상당히 유용하게 활용이 됩니다.

클라이언트쪽에서는 두 가지 방법이 있는데요. 하나는 YouTube에서와 같이 HTML과 Flash를 같이 이용해서 인터페이스를 구성하는 방법이 있고, 두 번째로 플래시만으로 인터페이스를 구성하는 방법이 있습니다. 이 글에서는 Flex 프레임워크를 이용해서 비디오를 보고 등록된 비디오를 탐색하고 찾기 위해서 리스트를 생성하도록 할 예정입니다.

PHP로 서버쪽 코드 구성하기

서버쪽 코드 작성을 하기에 앞서, MySQL에 데이터 스키마를 생성해야 합니다. 우선 사용할 데이터베이스를 생성하기 위해서, 다음과 같이 mysqladmin 명령어를 사용합니다.
mysqladmin create movies 
스키마가 생성되었으면 데이터베이스를 로드합니다. 스키마 파일은 아래 [리스트 1]과 같습니다.

[리스트 1] movies.sql
DROP TABLE IF EXISTS movies; 
CREATE TABLE movies (
movieId INTEGER NOT NULL AUTO_INCREMENT,
title VARCHAR( 255 ),
source VARCHAR( 255 ),
thumb VARCHAR( 255 ),
width INTEGER,
height INTEGER,
PRIMARY KEY( movieId )
);
이제 위의 movies.sql 스키마 파일을 다음과 같은 명령어를 이용해서 데이터베이스에 테이블을 생성할 수 있습니다.
mysql movies < movies.sql 
데이터베이스에 무비 데이터를 넣기 위해서는 HTML을 이용해서 업로드 기능을 만들어야 합니다. 즉 비디오 파일을 받아서 플래시 비디오 파일로 변환하고 미리보기 파일을 만든후에 데이터베이스에 넣으면 되겠습니다.

업로드 페이지의 제작

비디오 파일을 업로드 하기 위한 HTML 파일은 다음 [리스트 2]에서 보는 것과 같이 아주 간단합니다.

[리스트 2] addmovie.html
<html>
<body>
<form enctype="multipart/form-data" method="post" action="upload.php">
<input type="hidden" name="MAX_FILE_SIZE" value="300000" />
<table>
<tr><td>Title</td><td><input type="text" name="title"></td></tr>
<tr><td>Movie</td><td><input type="file" name="movie"></td></tr>
</table>
<input type="submit" value="Upload" />
</form>
</body>
</html>
위 HTML은 입력받은 정보를 upload.php 페이지로 전송하게 되는데, 이 페이지에서 비디오를 변환하고 미리보기를 만들어 내고 데이터베이스에 저장하게 되는 것입니다. 다음의 upload.php 코드를 보도록 하겠습니다.

[리스트 3] upload.php
<html><body>
<?php
require "DB.php";

function converttoflv( $in, $out )
{
unlink( $out );
$cmd = "ffmpeg -v 0 -i $in -ar 11025 $out 2>&1";
$fh = popen( $cmd, "r" );
while( fgets( $fh ) ) { }
pclose( $fh );
}

function getthumbnail( $in, $out )
{
unlink( $out );
$cmd = "ffmpeg -i $in -pix_fmt rgb24 -vframes 1 -s 300x200 $out 2>&1";
$fh = popen( $cmd, "r" );
while( fgets( $fh ) ) { }
pclose( $fh );
}

function flv_import( $upfile, $fname, $title )
{
$fname = preg_replace( '/..*$/', '', basename( $fname ) );
$flvpath = "$fname.flv";
$thumbpath = "$fname.gif";

converttoflv( $upfile, "movies\$flvpath" );
getthumbnail( $upfile, "movies\$thumbpath" );

$dsn = 'mysql://root@localhost/movies';
$db =& DB::connect( $dsn );
if ( PEAR::isError( $db ) ) { die($db->getMessage()); }

$sth = $db->prepare( 'INSERT INTO movies VALUES ( 0, ?, ?, ?, ?, ? )' );
$db->execute( $sth, array( $title, $flvpath, $thumbpath, 300, 200 ) );
}

flv_import( $_FILES['movie']['tmp_name'], $_FILES['movie']['name'], $_POST['title'] );
?>
File sucessfully uploaded
</body></html>
위 코드에서 flv_import 함수를 중점적으로 봐야 합니다. flv_import 함수내에서 converttoflv 함수로 비디오 파일을 플래시 비디오 파일로 변경하고 있고, getthumbnail 함수로 미리보기 파일을 생성하고 있습니다. 그리고 다음으로 업로드가 완료된 무비에 대한 정보를 데이터베이스에 저장합니다. 위 리스트 3에 있는 FLV 플래시 비디오 파일과 미리보기 파일을 생성하는 함수는 ffmpeg 라는 명령어와 여러가지 명령어를 이용해서 변환을 수행하게 됩니다.

그럼 다음 [그림 1]처럼 addmovie.html 페이지를 브라우저로 한 번 보도록 하겠습니다.


[그림 1] 비디오를 업로드하는 페이지

여기서 비디오 파일을 지정하고 Upload 버튼을 눌러서 비디오 파일을 처리하기 위해 서버에 보낼 수가 있습니다.

사 실 upload.php 파일은 아주 기본적인 부분만 작성이 되어 있기때문에, 실제 서비스 용도로 사용하기 위해서는 에러 체크 루틴을 추가 적으로 작성해야 합니다. 그리고 그것보다도 더 큰 문제는 크기가 큰 비디오 파일을 업로드 하려고 할 때인데, 이런 경우에는 파일의 크기가 크기 때문에 비디오 변환 과정이 오래 걸리게 되고 유저의 대기시간이 상당히 길어지면서 더 큰 문제가 됩니다.

그럼 이런 문제를 해결하기 위한 방법은 뭐가 있을까요? 한 가지 방법으로 큰 크기의 비디오 파일이 업로드가 되면(10초 이상의 비디오 파일) 유저에게는 잠시 후에 비디오가 게시될 것이라고 말을 해 놓고 서버내의 다른 폴더에 비디오 파일을 저장한 후에 또 다른 스크립트를 이용해서 비디오를 변환하는 것입니다.

더 진행하기 전에 왜 꼭 플래시 비디오 파일로 변환을 해야 하는지에 대해서 생각을 해보도록 합시다. 그냥 원본 그대로 저장해도 되는데 왜 플래시 비디오로 변환을 하려고 하는 걸까요? 그건 원본 상태로 저장을 해 놓게 되면 각 비디오 파일의 타입 별로 비디오 플레이어를 찾아서 수행할 수 있는 코드를 작성을 해야만 하기 때문에, 굉장히 힘든 일이 될 것이라고 생각합니다.

이 과정을 플래시 파일로 변환하여 해결하게 되면 코드도 간단해지고 많은 OS에서 실행될 수 있도록 할 수도 있습니다.

그럼 이제 HTML과 플래시를 이용해서 유투브와 같은 입력양식을 간단하게 만들어 보겠습니다.

HTML과 플래시를 이용한 인터페이스 구성

입 력받은 URL을 가지고 플래시 비디오 파일을 재생하는 프로그램을 만들기 위해서는 Adobe Flex Builder 2를 이용해서 새로운 프로젝트를 만들어야 합니다. 새로운 프로젝트를 생성했다면 simplemovie.mxml 이라는 Flex 애플리케이션을 만들어야 합니다. 이 애플리케이션 파일의 내용은 다음 [리스트 4]와 같습니다.

[리스트 4] simplemovie.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:VBox backgroundColor="white" width="400" height="335">
<mx:VideoDisplay width="400" height="300" id="videoPlayer"
source="{Application.application.parameters.movie}" />
<mx:HBox width="100%" horizontalAlign="center">
<mx:Button label="Play" click="videoPlayer.play()" />
</mx:HBox>
</mx:VBox>
</mx:Application>
위 [리스트 4]에서 두가지 중요한 요소를 볼 수 있습니다 : VideoDisplay 요소는 비디오를 재생하는 역할을 하고 "Play"라는 이름을 가진 버튼은 비디오의 재생이 끝난 후에 유저가 클릭할 경우 비디오를 다시 재생하는 역할을 하게 됩니다.

VideoDisplay 요소는 "source"라는 속성을 가지게 되는데요, source 속성으로 재생해야 하는 플래시 비디오 파일의 URL을 지정하게 됩니다. 위 리스트에서 source 속성이 가지고 있는 값은 HTML 파일에 있는 <object>나 <embed> 태그에 있는 FlashVars 속성의 값이 되게 됩니다.

Flex Builder를 이용하게 되면 위 [리스트 4]의 simplemovie.mxml 프로그램을 simplemovie.swf 파일로 변환할 수가 있고, 변환된 swf 파일을 bin 디렉토리에서 PHP가 있는 곳의 디렉토리로 이동시켜야 합니다. 그리고 PHP 페이지를 하나 만들어서 비디오를 재생시킬 수가 있습니다. 다음 [리스트 5]를 보도록 하죠.

[리스트 5] simpletest.php
<?php
require "DB.php";

$moviebase = 'http://localhost:8080/movies/';

$dsn = 'mysql://root@localhost/movies';
$db =& DB::connect( $dsn );
if ( PEAR::isError( $db ) ) { die($db->getMessage()); }

$source = null;
$movieId = 1;
if ( array_key_exists( 'movie', $_GET ) )
$movieId = $_GET['movie'];

$movies = array();
$res = $db->query( 'SELECT movieId, source, title FROM movies' );
while( $row = $res->fetchrow( ) ) {
$movies []= $row;
if ( $row[0] == $movieId )
$source = $row[1];
}

if ( $source == null )
$source = $movies[0][1];
?>
<html>
<body>
<table>
<tr><td valign="top">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="400"
height="335"
codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
<param name="movie" value="simplemovie.swf" />
<param name="quality" value="high" />
<param name="flashVars" value="movie=<?php echo( $moviebase.$source ) ?>">
<embed src="simplemovie.swf" quality="high"
width="400" height="335" play="true"
loop="false"
quality="high"
flashVars="movie=<?php echo( $moviebase.$source ) ?>"
type="application/x-shockwave-flash"
pluginspage="http://www.adobe.com/go/getflashplayer">
</embed>
</object>
</td><td valign="top">
<?php
foreach( $movies as $movie ) {
?>
<a href="simptest.php?movie=<?php echo( $movie[0] )?>"><?php echo( $movie[2] )?></a><br/>
<?php
}
?>
</td></tr></table>
</body>
</html>
위 PHP 스크립트는 우선 데이터베이스에 접속한 후에 비디오 리스트를 받아오고 있습니다. 그리고 나서 URL을 통해서 넘어온 ID와 읽어온 비디오 리스트를 비교해서 동일한 ID를 가진 비디오가 있는지를 확인하게 됩니다. 동일한 ID를 찾을 경우 이 ID 값을 simplemovie.swf 파일로 넘기기 위해서 flashVars 속성에 지정하고 있습니다.

PHP 스크립트 다음 부분에서는 HTML 태그가 시작되고 simplemovie.swf 파일을 페이지에 표시하기 위한 태그인 <object>, <embed> 태그를 사용하고 있습니다. 물론 여기에 재생해야 하는 비디오에 대한 URL도 지정해 주고 있는 걸 볼 수 있습니다. 그리고 바로 아래에 현재 비디오외에 볼 수 있는 비디오에 대한 링크를 만들어 주고 있는 걸 볼 수 있습니다.

이제 웹 브라우저에서 [리스트 5]에 있는 페이지를 한 번 보도록 하겠습니다. 다음 [그림 2]와 같이 나오네요.


[그림 2] 간단한 비디오 플레이어와 함께 볼 수 있는 비디오에 대한 리스트가 출력되었다.

웹 브라우저를 열자마자 첫번째 비디오가 재생이 되게 되고, 오른쪽에 있는 비디오 리스트중에서 하나를 선택하면 페이지가 다시 로딩되면서 선택된 비디오가 재생되게 됩니다.

정말 간단하죠? Flex 파일 하나와 PHP 파일 하나, 그리고 데이터베이스만 가지고 위와 같이 비디오 공유 사이트를 만들었습니다.




Flex를 이용한 인터페이스 구성 파트 1


Flex 를 이용해서 원하는 비디오를 재생시키기 위해서는 Flex에게 재생시킬 수 있는 비디오의 리스트를 알려줘야만 합니다. 어떻게 해야하냐면 XML파일을 이용해서 Flex에게 비디오 리스트 정보를 넘겨줄 수가 있는데요, 여기서는 PHP로 다시 돌아가서 데이터베이스에서 비디오 리스트를 읽어들인 후에 XML로 출력하는 스크립트를 만들어 보도록 하겠습니다. 다음 [리스트 6]의 movies.php 파일을 보도록 하죠.

[리스트 6] movies.php
<?php
require "DB.php";

$moviebase = 'http://localhost:8080/movies/';

header( 'content-type: text/xml' );

$dsn = 'mysql://root@localhost/movies';
$db =& DB::connect( $dsn );
if ( PEAR::isError( $db ) ) { die($db->getMessage()); }
?>
<movies>
<?php
$res = $db->query( 'SELECT title, source, thumb, width, height FROM movies' );
while( $row = $res->fetchrow( ) ) {
?>
<movie title="<?php echo( $row[0] ) ?>" source="<?php echo( $moviebase.$row[1] ) ?>"
thumb="<?php echo( $moviebase.$row[2] ) ?>" width="<?php echo( $row[3] ) ?>"
height="<?php echo( $row[4] ) ?>" />
<?php
}
?>
</movies>
위 PHP 스크립트를 만든 후에 커맨드 라인에서 실행시키거나 브라우저에서 실행시키게 되면 다음 [그림 3]과 같은 XML 리스트를 볼 수가 있습니다.


[그림 3] XML로 표현된 비디오 리스트

이제 XML로 비디오 리스트 정보를 넘겨줄 수 있으니 전에 만들었던 simplemovie.mxml 파일을 좀 더 개선해 보도록 하겠습니다. 다음 [리스트 7]은 simplemovie.mxml의 업그레이드 된 버전입니다.

[리스트 7] mytube1.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" creationComplete="movieXmlData.send()">

<mx:HTTPService method="get" url="http://localhost:8080/movies.php"
id="movieXmlData" result="onGetMovies( event )" />

<mx:Script>
import mx.rpc.events.ResultEvent;
import mx.controls.VideoDisplay;
import mx.controls.List;
import mx.rpc.http.HTTPService;
import mx.collections.ArrayCollection;

[Bindable]
private var movies : ArrayCollection = new ArrayCollection();

public function onGetMovies( event : ResultEvent ) : void
{
var firstMovie : String = event.result.movies.movie[0].source.toString();
videoPlayer.source = firstMovie;

movies = event.result.movies.movie;
movieList.selectedIndex = 0;
}

public function onPrevious() : void
{
if ( movieList.selectedIndex == 0 )
movieList.selectedIndex = movies.length - 1;
else
movieList.selectedIndex -= 1;
videoPlayer.source = this.movieList.selectedItem.source.toString();
}

public function onPlay() : void
{
videoPlayer.source = this.movieList.selectedItem.source.toString();
videoPlayer.play();
}

public function onNext() : void
{
if ( movieList.selectedIndex >= ( movies.length - 1 ) )
movieList.selectedIndex = 0;
else
movieList.selectedIndex += 1;
videoPlayer.source = this.movieList.selectedItem.source.toString();
}

public function onChange() : void
{
videoPlayer.source = this.movieList.selectedItem.source.toString();
}
</mx:Script>

<mx:HBox width="100%" paddingLeft="10" paddingTop="10" paddingRight="10">
<mx:VBox>
<mx:VideoDisplay width="400" height="300" id="videoPlayer" complete="onNext()" />
<mx:HBox width="100%" horizontalAlign="center">
<mx:Button label="<<" click="onPrevious()" />
<mx:Button label="Play" click="onPlay()" />
<mx:Button label=">>" click="onNext()" />
</mx:HBox>
</mx:VBox>
<mx:List width="100%" height="340" id="movieList"
dataProvider="{movies}"
change="onChange()"
labelField="title"></mx:List>
</mx:HBox>

</mx:Application>
전과 비교해서 크게 바뀐 부분이 있다면 파일의 상단에 있는 액션 스크립트(ActionScript)인데요, 이 코드로 전체적인 인터페이스를 관리하게 됩니다. 이 액션 스크립트가 하는 일은 먼저 onGetMovies 함수에 있는 HTTPService를 이용해서 movies.php 파일로부터 XML 정보를 읽어들이는 것입니다. HTTPService 클래스는 XML 리스트를 찾게 되면 XML 문서 객체모델(Document Object Model)로 변경하게 되고, 우린 이 문서 객체 모델을 이용해서 첫번째 비디오에 대한 정보를 얻어서 재생할 수가 있습니다. 또 onGetMovies 함수는 movies 라는 변수를 이용해서 페이지에 있는 리스트 박스에 비디오의 이름을 출력하게 됩니다. 나머지 액션 스크립트는 유저가 리스트 박스에 있는 비디오를 선택하거나 "이전", "다음" 버튼을 선택했을 경우를 처리하기 위한 코드입니다.

위 리스트의 제일 아래를 보면 전체 유저 인터페이스를 구성하는 Flex 오브젝트를 볼 수 있습니다. 여기에 이전 비디오와 다음 비디오를 선택할 수 있는 버튼을 배치하고, 오른쪽에는 현재 비디오 리스트를 출력하는 리스트 박스가 배치되어 있습니다.

이제 Flex Builder를 이용해서 위 프로그램을 컴파일하고 실행시키게 되면 [그림 4]와 같은 화면을 볼 수 있습니다.


[그림 4] Flex를 이용해서 구성한 첫 번째 인터페이스

리스트 박스에서 비디오를 선택할 수도 있고, 이전, 다음 버튼을 이용해서 비디오를 선택할 수도 있습니다. 멋있죠? 이제 미리보기 이미지를 제공해 주면 더 멋있어질 것 같네요.

Flex를 이용한 인터페이스 구성 파트 2 – 미리보기 이미지

미 리보기 이미지를 비디오 리스트에 출력하려면 리스트 박스를 비디오의 제목과 미리보기 이미지를 같이 출력할 수 있도록 수정해야 합니다. 다행히도 Flex의 기능을 이용하면 아주 쉽게 수정이 가능합니다. 우선 <List> 태그에 itemRenderer를 추가하도록 하고, 다음 [리스트 8]을 보겠습니다.

[리스트 8] mytube2.mxml
...
<mx:List width="100%" height="340" id="movieList"
dataProvider="{movies}"
change="onChange()"
itemRenderer="MovieItem"></mx:List>
...
여기서 MovieItem이라는 item renderer MXML 컴포넌트를 만들었습니다. 이 컴포넌트를 만들려면 메뉴에서 "New > MXML Component"를 선택하고 [리스트 9]와 같이 컴포넌트를 코드에 넣으면 됩니다.

[리스트 9] MovieItem.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" height="80">
<mx:Image source="{data.thumb}" width="{data.width/3}"
height="{data.height/3}" rotation="5" left="10" top="0" />
<mx:Label text="{data.title}" fontWeight="bold" top="10" left="100" fontSize="18" />
</mx:Canvas>
여기서는 Canvas 라는 컨테이너를 이용했지만, 원한다면 마음에 드는 컨테이너를 선택해서 설정하셔도 괜찮습니다. 그리고 나서 미리보기 이미지 추가를 위해서 <mx:Image> 태그를 사용하고 비디오 제목을 출력하기 위해서 <mx:Label>을 이용하면 됩니다. 좀 더 재밌게 해보기 위해서 미리보기 이미지를 약간 회전시켜 봤습니다. [그림 5]를 보도록 하죠.


[그림 5] 미리보기 이미지를 추가한 리스트 박스

꽤 괜찮은 비디오 플레이어가 됐네요. 여기에 추가적으로 비디오 설명, 재생 시간, 링크, 추천 버튼과 같은 기능을 추가하면 더 좋을 것 같습니다.

저장소와 대역폭

데 이터베이스를 구성하고 비디오 공유 사이트 페이지를 만들어 내는것 자체는 지금까지 잘 해결했는데, 사실 이것말고 한가지 더 고려해야 할 것이 있습니다. 바로 대역폭을 고려해야 합니다. 플래시 비디오 파일 자체가 인코딩이 잘 된다고 해도 역시 비디오 파일이기 때문에 크기가 큰 편에 속하게 됩니다. 그렇기 때문에 중간에 끊김없이 비디오 재생을 얼마나 할 수 있는지 파악하는 것이 무엇보다 중요하게 됩니다.

확실한 방법중 하나는 인터넷 데이터 센타에서 서비스를 하는 것입니다. 다른 방법으로는 비디오 공유 사이트에서는 비디오 자체에 대한 데이터를 가지지 않고 링크만 저장하고 실제 비디오 데이터는 다른 곳에 저장하는 방법입니다. 아마존의 S3 서비스 같은 경우가 좋은예인데요, 저렴한 가격으로 좋은 저장소로 활용할 수가 있고, 어느정도 사이트가 커질때까지는 안정적으로 활용할 수 있습니다.

결론

플래시를 이용한 비디오의 등장과 광대역폭의 보편화로 인해서 이제 적은 예산으로 비디오 공유 사이트를 운영한다는 것이 현실로 다가왔습니다. 바라기는 이 글을 통해서 여러분이 좀 더 멋있는 비디오 공유사이트를 만들어냈으면 하는 것입니다.
2007/12/26 16:16 2007/12/26 16:16
이 글에는 트랙백을 보낼 수 없습니다

날로 웹 어플리케이션의 UI가 복잡해지고 JavaScript를 이용해서 사용자와 웹 어플리케이션 간의 상호작용에 따른 특정 객체에 대한 접근과 조작이 점점 더 유행을 타게 되면서, 웹 브라우저의 창 속에 존재하는 어떤 한 객체의 정확한 크기와 위치 좌표 값을 얻는 일은 무척이나 중요해졌다. 하지만, 객체의 위치를 재는 방법과 그 속성은 헷갈릴 만큼이나 다양하고, 불행히도 웹 브라우저들 마다 같은 속성도 서로 다른 크기를 돌려준다. 그래서 여기에 DOM에 존재하는 한 객체의 크기와 자신의 위치를 나타내는 여러 속성 값들을 정리하고, 그림으로 나타내 보았다.

- Window Properties:

screen.width, screen.height

스크린 영역의 픽셀(pixels) 단위 너비와 높이(읽기 전용). 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

innerHeight, innerWidth

브라우저 창 속 문서가 표시되는 영역의 픽셀 단위 너비와 높이(읽기 전용). 여기에는 메뉴 막대, 도구 막대, 스크롤 바 등이 포함되지 않으나, 예외적으로 Firefox와 Opera에서는 스크롤 바의 영역이 포함된 값을 돌려준다. 이 속성은 IE에서는 지원되지 않고, 버전과 Doctype 선언에 의한 표준 호환 모드냐 아니냐에 따라 document.documentElement 혹은 document.body에 있는 clientWidth와 clientHeight 값을 사용해야 한다.

outerHeight, outerWidth

브라우저 창 전체의 픽셀 단위 너비와 높이(읽기 전용). 여기에는 메뉴 막대, 도구 막대, 스크롤 바 등이 포함된 값이다. IE에서는 해당 값이 존재하지 않고, 대신 MS 전용 속성인 document.documentElement 혹은 document.body의 offsetHeight, offsetWidth를 써야 한다.

pageXOffset, pageYOffset, scrollX, scrollY

문서가 얼마 만큼 스크롤 되었는지를 알려주는 픽셀 단위의 값(읽기 전용). 이것도 역시나 Internet Explorer는 지원하지 않는다. 대신 document.documentElement 혹은 document.body의 비표준 scrollLeft와 scrollTop을 사용.

- Window and Mouse Event Properties:

screenLeft, screenTop, screenX, screenY

스크린 속 창의 왼쪽 위 구석에 있는 모서리의 위치를 나타내는 좌표 값(읽기 전용). IE, Safari, 그리고 Opera는 screenLeft와 screenTop을 지원하지만, Firefox와 Safari는 screenX와 screenY를 지원한다.

- HTML Element Properties:

offsetHeight, offsetWidth

한 객체의 픽셀 단위의 너비와 높이 값으로, margin을 제외한 스크롤 바와 padding, border 값을 포함하고 있다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

clientHeight, clientWidth

한 객체의 픽셀 단위의 너비와 높이 값으로 padding 값이 포함되나, 그 외의 스크롤 바와 border, margin 값은 포함되지 않는다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

offsetLeft, offsetTop

상위 offsetParent 객체를 기준으로 해서 한 객체의 왼쪽 위 모서리의 X, Y 좌표 값. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

offsetParent

어떤 특정 객체를 포함하고 있는 상위 객체로서 하위 객체의 offsetLeft 그리고 offsetTop의 기준 좌표 시스템 역할을 한다. 대부분의 경우, offsetParent는 하위 객체를 포함하고 있는 Document object가 되지만, 유동적으로 위치하는(absolute-positioned) 요소의 경우에는 또 이 요소를 포함하고 있는 유동적으로 위치한 상위 요소가 바로 offsetParent가 된다. 복잡한 것은 브라우저들 마다 offsetParent가 되는 요소를 다르게 가르켜서 주의가 요구된다. (예를 들어, Firefox에서는 root node를 가리키지만, Opera에서는 바로 위의 부모 요소를 가리킨다.) 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

scrollHeight, scrollWidth

한 객체의 픽셀 단위의 전체 너비와 높이 값. 이 객체가 스크롤바를 가지고 있을 경우(overflow: auto), 이 값은 객체의 보여지는 부분만의 크기를 나타내는 offsetHeight과 offsetWidth 값과는 다르게 된다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다. 하지만, 스크롤 바를 표시하는 구현 방법이 브라우저들 사이에 차이를 보이는 이유로 저 마다 돌려주는 값도 달라서, Firefox와 IE는 객체의 padding까지 포함한 값을 나타내나 Safari의 경우에는 content의 크기에다 한쪽 padding 값만을 더해서 돌려주며 Opera의 경우에도 content 크기에다 한쪽 padding 값과 함께 한쪽 border 값까지 포함하는 등 브라우저들 마다 심한 편차를 보여주고 있어서 사용에 신중을 기해야 한다.

scrollLeft, scrollTop

객체가 스크롤바를 가지고 있을 경우, 객체가 얼마 만큼 스크롤 되었는지 왼쪽 위 모서리를 기준으로 한 픽셀 단위의 값. 이 속성은 브라우저에 따라 문서의 <body> 혹은 <html> 태그에도 정의되어 있어서, 문서 전체가 얼마나 스크롤 되었는지를 나타낸다. 주의할 것은, <iframe> 태그에서 스크롤 된 값은 무시된다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

자, 그럼 위의 내용을 그림으로 정리하면,

HTML elements coordinates

결론적으로, 각 속성들에 대한 브라우저들 끼리의 합의가 이루어지지 않는 한 합리적이고 공통된 값을 얻기란 상당히 골치아파서 커다란 걸림돌로 작용한다. 그나마 UI 관련 JavaScript 라이브러리들이 존재하니 시름을 덜 수 있다. 이렇게 놓고 보니, 정리하려고 해도 현재로선 명확한 정리 자체가 될 수가 없다. :?

2007/12/13 17:18 2007/12/13 17:18
이 글에는 트랙백을 보낼 수 없습니다

각 이동통신사별 고객센터 전화번호 및 홈페이지 주소



1. SKT 고객센터


 
 
홈페이지 : http://www.e-station.com
전화번호 : 1599-0011, 1566-0011 (유료), 080-011-6000 (무료), 핸드폰에서 114(무료)
 
 
 

2. KTF 고객센터

 
홈페이지 : http://www.ktfmembers.com
전화번호 : 1588-0010 (유료), 080-080-1618(무료), 핸드폰에서 114(무료) ,집전화로 016-114
 
 


3. LGT 고객센터

 
 
홈페이지 : http://www.mylgt.co.kr
전화번호 : 1544-0019 (유료), 080-019-7000(무료), 핸드폰에서 114(무료)
 
 
알아두면 편한 번호들~
 
 
 
퍼가실땐 알아서 센스껏 (__*)

2007/12/10 11:44 2007/12/10 11:44
이 글에는 트랙백을 보낼 수 없습니다
정렬에 대한 여러 가지 알고리즘(insertion sort, selection sort, bubble sort, quick sort, two-way merge sort, heap sort, radix sort)이 있지만 여기서는 비교적 빠른 정렬에 속하는 퀵소트를 소개하고자 합니다. 퀵소트 알고리즘은 영역을 계속 분할하여 작은 값은 왼쪽으로 보내고, 큰 값은 오른쪽으로 모는 방식입니다. 그리고 더 이상 분할할 여지가 없다면 정렬은 완성된 것입니다. 그러나 퀵소트가 적합하지 않은 경우도 있습니다. 대표적으로 이미 정렬된 상태의 데이터를 정렬하는 것은 정렬되지 않은 상태의 경우와 비슷한 시간이 걸립니다.

구체적인 정렬방법 개요
정렬할 데이터가 배열에 있다고 했을때
  1. 정렬할 배열의 상한과 하한값을 구한다.
  2. 하한값이 상한값보다 작으면 배열을 나눈다. 
  3. 두 배열간 비교하여 교환하고 두 배열의 작업대상도 이동한다.
  4. 나누어진 각각의 배열에 대해 위의 단계를 반복한다.

이러한 절차를 다음과 같은 하나의 예를 통해 그림으로 표현하면 다음과 같습니다. 이번 예는 총 23단계에 걸쳐 소트가 진행되지만 편의상 원리만 설명하고자 7단계만 설명합니다. 참고로 이번 예와 퀵소트 코드는 제가 만든 것이 아니라 제가 가진 책을 참조했습니다. 즉 다른 말로 하면 베꼈습니다. 책은 Ken Getz와 Mike Gilbert가 공저한 VBA Developer's Handbook 입니다. 

014_1.gif(31441바이트)

014_2.gif(19707바이트)

원래의 데이터는 79,30,24,48,26,34,05,48,21,86(10개)입니다. 이걸 퀵소트로 정렬하여 보는 겁니다. 위의 그림에서 각 단계를 숫자로 표시하였으며 각 단계를 설명하겠습니다.

1단계:
배열의 하한위치(i)의 값이 상한위치(j)의 값보다 작으면 중간위치(값은 26)를 구합니다. 그리고 하한위치값(79)과 중간위치값(26)보다 작으면 하한위치(i)를 오른쪽으로 증가합니다. 마찬가지로 상한위치값(86)이 중간위치값(26)보다 크면 상한위치(j)를 왼쪽으로 옮긴다. 여기에선 86이 26보다 크므로 한 포인트 옮겨 21을 가리키도록 하였습니다.
i=0
j=9->8로 이동함.

2단계:
하한위치가 상한위치보다 작으면(i<j)이면 서로의 값을 교환합니다.

3단계:
교환후 하한값은 1증가하고(i=i+1) 상한값은 1 감소시킵니다(j=j-1)
i=0->1
j=8->7

4단계:
하한위치값(30)이 중간위치값(26)보다 작지 않으므로 그대로 하한위치는 그대로 두고, 상한위치값(48)이 중간위치값(26)보다 크므로 상한위치를 왼쪽으로 옮겨(j=j-1) 상한위치값이 05가 됩니다. 하한위치가 1이고 상한위치가 6입니다. 하한위치가 상한위치보다 적으므로 서로의 위치값을 교환합니다.

5단계:
3단계와 같이 하한값과 상한값의 위치를 증가/감소시킵니다.

6단계7단계 역시 위의 단계를 반복합니다. 이 예에서 정렬이 완료되려면 총23단계를 거칩니다. 사실 이러한 알고리즘을 훤히 알면 좋지만 저 역시 그런 분야를 보면 하품이 나는 처지라 퀵소트가 어떻게 이루어 지는가만 알아 보았습니다.


// 퀵소트

***************퀵소트소스*************

#include <stdio.h>

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SWAP(x, y, t) ( (t)=(x), (x)=(y), (y)=(t) )
#define MAX_SIZE 1000000 /* 최대 배열 크기 */
int list[MAX_SIZE];
int n;          /* 실제 레코드의 수 */
void quick_sort(int, int);  /* 퀵정렬 */
int main()
{
 int i;
 clock_t  a,b;
 printf("Enter the number of numbers to generate : ");
 scanf("%d", &n);
 srand((unsigned)time(NULL)); /* 난수 발생 함수 초기화 */
 for(i=0; i<n; i++) {       /* 난수 생성 및 출력 */
  list[i] = (rand()*rand())%1000000;/*난수 발생 범위 0~999999*/
  printf("%d ", list[i]);
 }
 a=clock();
 quick_sort(0,n-1);        /* 퀵정렬 호출 */
 b=clock();
 printf("\n\nSorted array :\n"); /* 정렬된 레코드 출력 */
 for(i=0; i<n; i++)
  printf("%d ", list[i]);
 printf("\n");   /* 실행시간 출력 */
 printf("Execution Duration=%f\n",(double)(b-a)/CLK_TCK);
}

void quick_sort(int left, int right)
{
 int pivot, i, j, temp;
 if(left<right) {    /* 리스트에 2개 이상의 레코드가 있을 경우 */
  i = left; j = right+1; pivot = list[left];  /* 피벗 설정 */
  do {
   do /* 왼쪽 리스트에서 피벗보다 큰 레코드 선택 */
    i++;
   while(list[i]<pivot);
   do  /* 오른쪽 리스트에서 피벗보다 작은 레코드 선택 */
    j--;
   while(list[j]>pivot);
   if(i<j) SWAP(list[i], list[j], temp); /* 레코드 i, j 교환 */
  } while(i<j);   /* 인덱스 i,j가 엇갈리지 않는 한 반복 */
  SWAP(list[left], list[j], temp); /* 레코드 j와 피벗 교환 */
  quick_sort(left, j-1);         /* 왼쪽 부분리스트를 퀵정렬 */
  quick_sort(j+1, right);       /* 오른쪽 부분리스트를 퀵정렬 */
 }
}



// 버블소트
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SWAP(x, y, t) ( (t)=(x), (x)=(y), (y)=(t) )
#define MAX_SIZE 1000000  /* 최대 배열 크기 */
int list[MAX_SIZE];
int n;                    /* 실제 레코드의 수 */
void bubble_sort();       /* 버블정렬 함수의 원형 */

int main()
{
 int i;
 clock_t a, b;
 printf("Enter the number of number to generate : ");
 scanf("%d", &n);
 srand((unsigned)time(NULL));      /* 난수 발생 함수 초기화 */
 for (i=0; i<n; i++) {             /* 난수 생성 및 출력 */
  list[i] = (rand()*rand())%1000000; /* 난수 발생 범위 0-999999 */
  printf("%d ", list[i]);
 }
 a = clock();
 bubble_sort();
 b = clock();
 printf("\n\nSorted array :\n");
 for (i=0; i<n; i++)
  printf("%d ", list[i]);
 printf("\n");
 printf("Execution Duration=%f\n", (double)(b - a)/CLK_TCK);
}

void bubble_sort()
{
 int i, j, temp;
 for (i=n-1; i>0; i--) {
  for (j=0; j<i; j++)
   if(list[j] > list[j+1])
    SWAP(list[j], list[j+1], temp);
 }
}

2007/12/07 10:24 2007/12/07 10:24
이 글에는 트랙백을 보낼 수 없습니다

JavaScript OOP, Prototype)

1. 객체에 속성이용

man.name="홍길동";

Man["name"] = "홍길동";




2. 함수 추가

1) 익명의 함수 이용

(함수의 이름이 없고 몸체만있는 함수) 

Man.getName = fuction(){

       return this.name;

}






2) 객체 외부 함수 이용

function printName()

{

       alert(this.name);

}

Man.getName = printName; // 괄호를 사용하지 않음




3. 객체 생성


1) new Object(); 방식

 new Object();

 var man = new Object();

 man.name = "홍길동";



2) 생성자이용

function ManObject(name, height){

       this.name = name;

       this.height = height;

}

Var man = new ManObject("홍길동", 170);

Alert(man.name + " / " + man.height);


3) 생성자를 이용한 방식에서 클래스에 메소드 추가

function ManObject(name, height){

 this.name = name;

 this.height = height;


this.getName = function(){

       return this.name

} // 생성자에 직접 함수 정의

}


Prototype 속성은 모든 자바스크립트 객체의 기본속성이다.

--어떤 객체의 prototype에 속성이나 함수를 정의 한다는 것은 앞으로 그 객체에 공통적으로 적용되는 속성이나 함수를 정의한다는 의미





4.Prototype 를 이용

function ManObject(name, height){

       this.name = name;

       this.height = height;      

} // 생성자를 만들고 함수는 생성자 안에 지정하지 않음


ManObject.prototype.getName = function(){

       return this.name;

} // prototype 속성에 새로운 함수를 붙임



생성자에 함수 정의

인스턴스를 여러 개 만들때 인스턴스는 메모리로 상주. 인스턴스마다 함수와 같이 생김

Prototype을 이용

함수가 단한번 만들어지고 모든 인스턴스는 이 프로로타입 함수를 공유한다.


객체안에 내장된 함수가 객체의 지역변수를 자신의 지역변수처럼 사용할 경우 이러한 함수를 클로저라 한다.





5.클로저

1-1) 클로저 발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = function(){

              var now = new Date();

              var elapsed = now - startTime;

              return elapsed;

       }

}      // 클로저 : startTime 이 함수 안에 없고, 클래스 변수         //startTime을 참조함

       //클로저발생 => 함수 안에서 사용하는 외부의 지역변수는

       //깨긋이 지워지지 않고 함수에 묶여있어 메모리 누수현상발생.

 





1-2) 참조할수 있는 startTime이 없어 오류발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = getElapsed;

}

function getElapsed(){

     var now = new Date();

     var elapsed = now + startTime();        return elapsed;

}




1-3) 클로저 발생안되게 사용하는 방법

function MyObject(){

       this.startTime = new Date();

}

MyObject.prototype.elapsedTime = function(){

      var now = new Date();

      var elapsed = now + this.startTime;     

      return elapsed;

}







6.Prototype 의 성질


1) Prototype 속성 변경 

그 이전에 만들 객체의 속성은 자동으로 변경

 프로토 타입 영역의 속성은 모든 인스턴스간에 공유

function MyObject(){ }


MyObject.prototype.color = "blue";

var obj1 = new MyObject();

alert(obj1.color); // blue

MyObject.prototype.color = "red";

car obj2 = new MyObject();

alert(obj1.color + " / " + obj2.color); // red / red





2) Prototype를 이용한 내장객체 확장


Object.prototype.log = function(){

document.write("this:" + this);

//최상위 객체인 Object의 프로토타입에 log함수 추가 => 모든 자바스크립트 객체, 변수에 대해서 log메소드 사용가능

}

var arr = new Array(0,1,2);

arr.log(); // this : 0, 1, 2

var name = "mike";

name.log(); // this : mike

var sum = 1 + 3;

sum.log();       //this : 4







7. 자바스크립트 객체의 상속

1-1) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 없는경우)

function ManObject(){ }


       ManObject.prototype.eyeCnt = 2;

       ManObject.prototype.getEyeCnt = function(){

              return this.eyeCnt;

}

function AsianMan(){

       this.eyeColor = "black";

}

AsianMan.prototype = new ManObject();//AsianMan 의 부모클래스는 ManObject



function WesternMan(){

       this.eyeColor = "blue";

}

WesternMan.prototype = new ManObject();//WesternMan 의 부모클래스는 ManObject



var HongGilDong = new AsianMan();

var smith = new WesternMan();


alert(HongGilDong.eyeCnt); // 2

alert(HongGilDong.eyeColor); // black

alert(HongGilDong.getEyeCnt()); // 2

alert(smith.eyeCnt); //2

alert(smith.eyeColor); // blue

alert(smith.getEyeCnt()); // 2








1-2) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 있는경우)

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;


       this.getName = function(){

              return this.name;

       }

}


var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

}


function Student(name, schoolName){      

       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

Student.prototype = new Person("홍길동"); //순서가 중요.제일 먼저Student.prototype을 지정해야함.


/**

 * prototype을 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}


var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3








2-1) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 없는경우)

function ManObject(){

       this.eyeCnt = 2;

       this.getEyeCnt = function(){

              return this.eyeCnt;

       }

}



// AsianMan 의 부모클래스는 ManObject;

function AsianMan(){

       this.base = ManObject;

       this.base();

       this.eyeColor = "black";

}





 2-2) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 있는경우)

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;


       this.getName = function(){

              return this.name;

       }

}


var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

}

function Student(name, schoolName){      

       this.base = Person;             //부모클래스 지정

       this.base(name);                //부모클래스 생성자호출


       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

 

/**

 * prototype을 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}



var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3

2007/12/04 13:25 2007/12/04 13:25
이 글에는 트랙백을 보낼 수 없습니다
Application_developing  2007/12/01 16:18
  • DivX 사이트
  • Unified Codecs Pack V3 동영상 재생을 위한 코덱 모음 "Unified Codecs Pack"
  • 통합코덱 다운로드(kscodecsv433.rar) | WinRAR 2.8 (rar 압축풀기)WinRAR 2.8 정식패치
    • Coder & decoder OpenDivX V4.0 Alpha 48 (Project Mayo).
    • Coder & decoder DivX V3.2 (3.11Alpha + Scene detect patch)
    • Coder & decoder DivX WMA Audio V4.2 (Standard)
    • Coder & decoder MPEG-Layer 3 Audio V4.2 (Professional), With control panel icon
    • Decoder for AC3 Audio V2.2
    • Coder & decoder KS MPEG-4 VKI (For ASF/DivX Conversion)
  • Windows Media Player 한글 자막 오버레이 (DivxG400.rar)
    setup.exe 실행, DivxG400.ax (한글지원) 파일을 윈도우98 사용자인 경우 C:\windows\system 디렉토리로 복사하세요.
  • Unified Codecs Pack V3 동영상 재생을 위한 코덱 모음 "Unified Codecs Pack"
    DivX MPEG-4 Video Codec 3.11 alpha (MS MPEG-4 Cracked)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : DIV1, DIV2, DIV3, WMA(DivXAudio)
    - Uninstall : regsvr32 /u /s divx_c32.ax
    - http://www.divx.com/
    DivX MPEG-4 Video Codec 4.01 (build 195)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : DIV3, DIVX
    - DivXG400, DivXAF 필터와 조합으로 동영상 재생시 사사미에서 자막 싱크가 맞지 않는 문제가 발생할 수 있습니다.
    - DivX 4.0 코덱 설치시, 'Do you want to use DivX 4.0 decoder to play all DivX 3.x content?'라는 질문에 "아니오(No)"로 대답하셔야, 윈도우 미디어 인코더에서 인코딩 에러가 발생하지 않습니다.
    - Uninstall : regsvr32 /u /s divxdec.ax
    - http://www.divx.com/
    DivX AntiFreeze Filter 0.4
    - FourCC 코드 : DIV1, DIV2, DIV3, MPG4, MP42, MP43 인 동영상의 Bad Frame을 건너뛰게 해주는 프로그램.
    - Bad Frame의 수가 많을 경우, 영상과 음성의 싱크가 맞지 않게 될 수 있습니다.
    - DivX 4.0 코덱과 맞지 않는 경우가 있습니다.
    - Uninstall : regsvr32 /u /s divxaf.ax
    - http://www.tac.ee/~prr/videoutils/

    DivXG400 2.33
    - Matrox G400/450/550과 nVIDIA GeForce256/MX/2/3 카드의 동영상 TV-Out시 다양한 기능 지원용 필터.
    - Matrox G400/450/550nVIDIA GeForce256/MX/2/3 이외의 그래픽 카드는 공식적으로 지원하지 않습니다.
    - 미디어플레이어 6.4/7.0/8.0 동영상 화면에 자막 오버레이 지원.
    - DivX 4.0 코덱과 맞지 않는 경우가 있습니다.
    - 부작용 : 동영상과 자막 싱크 어긋남.
    - 환경 설정은 미디어 플레이어 6.4의 경우, '파일' - '등록정보' - '고급' - 'DivXG400'을 선택하면 됩니다.
    - 지원하는 자막 형식 : .srt (SubRip), .sub (Sub Viewer 1.0 2.0), .sub+.ifo+.idx (VobSub 3.0 4.0), .sub (DVDSubtitle), .txt (MicroDVD), .txt (TMPlayer), .smi (Microsoft SAMI), .ssa (Sub Station Alpha 3.0 4.0), .js (JACOsub), .rt (RealText), .aqt (AqTitle)
    - 자막의 글꼴, 위치, 크기를 마음대로 조절할 수 있습니다.
    - 자막 색상, 속성 변경은 지원하지 않습니다.
    - 압축된 형식의 자막은 지원하지 않습니다.
    - Uninstall : regsvr32 /u /s divxg400.ax
    - http://www.tac.ee/~prr/videoutils/
    DirectVOBSub 1.27 / VOBSub 1.61 / Subresync 1.05 / Submux 1.00
    - 미디어 플레이어같은 프로그램에서 DVD의 Sub 자막을 화면에 출력할 수 있게 해주는 프로그램.
    - DivXG400 과 동시에 로딩될 경우 자막이 겹쳐서 나옴.
    - 지원하는 자막 형식 : .sub+.idx+.ifo, .sub+.srt, .smi
    - 다중, 다국어 자막 불러오기 가능.
    - 자막 디렉터리 지정 가능. (HKCU "Software\Gabest\DirectVobSub\DefTextPathes" "Path0" ~ "Path9")
    - .rar로 압축된 .sub자막 지원.
    - 자막 글꼴/색상/속성을 변경할 수 있습니다.
    - 자막 위치 변경 기능은 아직 지원하지 않습니다.
    - 화면이 뒤집어질 경우, '파일' - '등록정보' - '고급' - 'DirectVobSub (auto-loading version)'을 선택한 다음, '화면 위아래 뒤집기'를 선택하면 됩니다.
    - Uninstall : regsvr32 /u /s dvobsub.ax
    - http://members.tripod.com/vobsub/
    TFM Audio Filter-Compressor 1.0 beta 5 bis
    - 음성 출력을 실시간으로 제어할 수 있습니다.
    - DirectShow Filter Graph를 기반으로 하는 모든 재생기에서 사용가능하다.
    - 환경 설정은 미디어 플레이어 6.4의 경우, '파일' - '등록정보' - '고급' - 'TFM Audio Filter'를 선택하면 됩니다.
    - Windows XP 에서 작동하지 않는 경우가 있습니다.
    - SoundBlaster Live!와 충돌을 일으키는 경우가 있습니다.
    - Uninstall : regsvr32 /u /s tfmaudio.ax
    - http://www.tfm.ro/

    Windows Media Codec 8.0 Redistribution Pack
    - 재생가능한 확장자 : WMV, WMA, ASF, AVI
    - FourCC 코드 : MPG4, MP42, MP43
    - 윈도우즈 미디어 8.0 재배포용 코덱.
    - 윈도우즈98/Me/2000 사용자용. Windows XP 사용자는 설치할 필요 없습니다.
    - 미디어 플레이어 7.0/7.1을 설치하지 않았을 경우 설치하면 됩니다.
    - DMO 인코더와 디코더는 포함되지 않았습니다.
    - 마이크로소프트에서 배포하는 압축형태를 그대로 사용하여, 캐털로그 인증시스템에 문제가 없습니다.
    - 시스템에 이미 윈도우즈 미디어 관련 코덱이 설치되어 있을 경우 설치되지 않습니다.
    - http://www.microsoft.com/

    Ligos Indeo Video 5 Codec 5.11
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : IV30, IV31, IV32, IV41, IV42, IV50, YVU9, I263, I420, IMC, IAC2
    - http://www.ligos.com/
    Cinepak Codec by Radius 1.10.0.11
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : CVID

    InterVideo MPEG-1 AC3 Audio Decoder 2.3
    InterVideo MPEG-1 AC3 Audio Decoder 2.4
    InterVideo MPEG-1 AC3 Audio Decoder 2.6
    - 오디오 트랙이 AC3 형식으로 되어 있는 동영상에서 음성 재생을 가능하게 함.
    - AC3 오디오 사용 여부는 어떻게 알 수 있나? : 동영상과 같이 제공된 .nfo 파일에 기록되어 있습니다.
    - Uninstall : regsvr32 /u /s iviaudio.ax
    - http://www.intervideo.com/
    PowerDVD MPEG-2 DirectShow support Decoder 3.0.1230
    PowerDVD MPEG-2 DirectShow support Decoder 2.0.0930
    - 재생가능한 확장자 : AVI, VOB, M2V (암호화 되어 있지 않은 파일)
    - Uninstall : regsvr32 /u /s clvsd.ax
    - http://www.gocyberlink.com/
    InterVideo MPEG-2 Video Decoder 3.0.55.0
    InterVideo MPEG-2 Video Decoder 3.0.55.5
    InterVideo MPEG-2 Video Decoder 3.0.57.8
    - 재생가능한 확장자 : AVI, VOB, M2V (암호화 되어 있지 않은 파일)
    - WindowsMediaPlayer에서 정상 작동 합니다.
    - 사사미와 충돌하는 문제가 발생합니다. 화면이 깨져서 나옵니다.
    - Uninstall : regsvr32 /u /s ivivideo.ax
    - http://www.intervideo.com/

    Fraunhofer IIS MPEG-1 Layer III Codec for MSACM 1.2.0.063 (Radium Hacking Codec)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : L3ACM
    - http://www.fraunhofer.de/
    OGG Vorbis ACM Codec 0.0.3.1 (based on OGG Vorbis Referece Library 1.0 RC2)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : VORBIS
    - http://hp.vector.co.jp/authors/VA012897/
    - http://www.xiph.org/
    QDesign Realtime MPEG-1 Layer II Audio Codec 1.01
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : QMPEG
    - http://www.qdesign.com/
    - http://mvp.qdesign.com/
    LAME MP3 Encoder ACM Codec 0.9.0.5 (based on LAME 3.70 stable version)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : LAMEACM
    - Winamp에서 Shoutcast DSP를 사용할 경우, 이 코덱을 설치하면 안됩니다.
    - http://www.warlock-x.net/
    Fraunhofer IIS MPEG-1 Layer III DirectShow Decoder 1.9.0.311
    - 일반적으로 동영상의 오디오 트랙이 MP3일 경우, 이 디코더로 재생을 하게 됨.
    - 특별한 경우(?)에는 위의 ACM 코덱을 이용함.
    - DirectShow 코덱 대신 ACM 코덱을 사용할 경우, 동영상 재생시 프레임 수 저하가 발생합니다.
    - http://www.fraunhofer.de/
    LAME MP3 DirectShow Codec 3.88 (alpha 8, Jan 13 2001)
    - VirtualDub/NanDub/Graphedit 에서 LAME 인코더를 사용할 수 있게 해줍니다.
    - http://www.elecard.com/
    mpg123 MP3 DirectShow Decoder 1.00
    - 재생가능한 확장자 : AVI, MP3
    - 프라운호퍼 MP3 디코더 대신 사용할 수 있습니다.
    - 극히 일부의 동영상에서 재생 오류가 발생합니다.
    - Uninstall : regsvr32 /u /s l3mpg123.ax
    - http://www.warlock-x.net/
    Sharp G.726 ACM Audio Decoder
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : G726
    TrueMotion 2.0 Video Decompressor
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : TM20
    Voxware Compression Codec 1.0.0.12
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : VOXACM160

    Microsoft MPEG-4 Video Encoder 4.1.0.3920
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : MPG4, MP42, MP43
    AngelPotion Video Codec 1.00.702
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : AP41
    - MS MPEG-4 코덱을 해킹/크랙한 후, 재구성한 코덱입니다.
    Morgan Multimedia MJPEG Codec 2.0.7.0
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : MJPG, dmb1
    - http://www.morgan-multimedia.com/
    PICVIDEO MJPEG Compressor 2.10.0.25
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : MJPG, PIMJ, PVW2
    - http://www.jpg.com/

    Canopus DV Codec 1.0 - for DVRaptor,DVRex-M1,RexFX User only
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : CDVC
    Huffyuv lossless codec 2.1.1
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : HFYU
    GTRON Reference AVI Codec 1.19
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : RAVI, RAV_
    Matrox VFW Software Codecs 5.0.0.1149 - for Marble User only
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : DV25, DV50, DVSD, MJPG, MMES
    GPEG Video Codec 1.01
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : GPEG
    - http://members.tripod.com/vobsub/
    GLZW Video Codec 1.01
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : GLZW
    - http://members.tripod.com/vobsub/
    AVImszh Compressor and Decompressor
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : MSZH
    AVIzlib Compressor and Decompressor
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : ZLIB
    UB Video Stream MPEG-4 Video Decoder 2.0
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : UMP4
    - http://www.ubvideo.com/
    UB Video UB-Live DirectShow filters 1.0 (H.263+)
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : H263
    - http://www.ubvideo.com/
    On2 VP3 Video for Windows Codec 3.2.1.0
    - 재생가능한 확장자 : AVI
    - FourCC 코드 : VP30, VP31
    - http://www.vp3.com/
    Morgan Multimedia Stream Switcher 0.9.4.0
    - 재생가능한 확장자 : AVI
    - 하나의 동영상에 여러개의 오디오 트랙이 있을 경우, 선택해서 들을 수 있게 합니다.
    - 그러나, 대부분의 동영상 여러 개의 오디오 트랙을 가지고 있는 경우가 드물므로 굳이 설치할 필요는 없습니다.
  • 2007/12/01 16:18 2007/12/01 16:18
    이 글에는 트랙백을 보낼 수 없습니다

    Java 7 전망

    Dolphin은 2007년에는 릴리스 되지 않을 것이다. 내년에 릴리스 될 가망성은 있다. 작업은 진행 중이고, 일부 기능들은 일찌감치 표준 확장으로서 데뷔를 마쳤고, 적어도 베타 버전으로 릴리스 되었다.

    언어에 특성을 추가하는 것이 제거하는 것 보다 훨씬 더 쉽다는 것은 불행한 일이다. 시간이 흐를수록 언어가 점점 더 복잡해진다는 것은 피할 수 없는 일이다. 심지어 독립적인 상태로 좋은 기능들 조차도 서로서로 엮이면서 문제가 많은 기능이 되어버린다.

    불행히도, 자바 커뮤니티는 아직 이러한 교훈을 터득하지 못한 것 같다. 이것은 매우 일반적인 사실인데도 말이다. 어떤 실질적 문제도 해결해주지 못하는데도 불구하고, 언어 디자이너들에겐 감당하기 힘들만큼 참신하고 흥분되는 신텍스들이 있을 수 있다. 따라서 클로저(closure), 다중 상속, 연산자 오버로딩(operator overloading)을 포함한 Java 7의 새로운 기능들에 대해 언급하고 있는 듯 하다.

    실현 가능성이 반반 이겠지만, 올해 안에 Java 7 베타 버전에 클로저가 도입될 것이고, 연산자 오버로딩도 잘하면 볼 수 있을 것이다. 하지만 다중 상속은 불가능 할 것이다. 자바 대부분이 단일 상속 계층에 기반하고 있다. 다중 상속을 이 언어에 도입할 수 있는 그럴듯한 방법이 없다.

    현재, 많은 신택스들이 있고, 이중 일부는 합당하지만, 어떤 것은 그렇지 못하다. 많은 제안들이 getFoo() 같은 메소드를 -> 연산자로 대체하는데 초점을 맞추고 있다.

    List

    집합체에 접근하는 첫 번째 가능한 방법은 배열관련 신텍스를 사용하는 것이다. 예를 들어, 다음과 같이 작성하는 대신,

    List content = new LinkedList(10);
    content.add(0, "Fred");
    content.add(1, "Barney");
    String name = content.get(0);

    아래와 같이 작성한다:

    List content = new LinkedList(10);
    content[0] = "Fred";
    content[1] = "Barney";
    String name = content[0];

    또 다른 방법으론 리스트에 대한 배열 초기화 문법을 사용할 수 있다:

    LinkedList content = {"Fred", "Barney", "Wilma", "Betty"}
    

    이 두 가지 제안 모두 가상 머신(VM)을 수정하지 않고 작은 컴파일러 조작으로도 구현될 수 있었다. 기존의 어떤 소스 코드도 무효로 하지 않았으며 재정의 하지 않았고, 심지어는 새로운 신택스에 보다 중요한 이슈가 되었다.

    개발자의 생산성에서 차이를 만들어내는 한 가지 언어 특징은 XML과 SQL로 작업할 때 다루게 되는 테이블, 트리, 맵을 관리하는 내장된 원시타입이다. JavaScript의 E4X와 Microsoft의 Cω와 Linq 프로젝트는 내장된 원시타입을 이용한 개발 향상성에 기여하지만, 자바 플랫폼은 이러한 측면에 대구책이 아직은 없는 듯 하다.

    프로퍼티

    프로퍼티 액세스용 신택스를 보자. 한 가지 제안은 getFoo setFoo 를 호출할 때 간단히 ->를 사용하는 것이다. 따라서, 다음과 같이 쓰는 대신,

    Point p = new Point();
    p.setX(56);
    p.setY(87);
    int z = p.getX();

    아래와 같이 작성한다.

    Point p = new Point();
    p->X = 56;
    p->Y = 87;
    int z = p->X;

    .#을 포함한 기타 심볼 역시 ->의 대안으로 제시되었다.

    앞으로는, Point 클래스의 프로퍼티로서 관련 필드를 구분하거나, 구분하지 않을 수도 있다.

    public class Point {
    
      public int property x;
      public int property y;
    
    }

    개인적으로, 전혀 흥미롭지 않다. 나는 자바 플랫폼이 보다 퍼블릭 필드를 실제로 사용할 때 Eiffel 계열의 방식을 채택하기를 바란다. 하지만, getter와 setter는 필드와 같은 이름으로 정의되면, 필드의 읽기와 쓰기는 자동으로 이 메소드로 보내진다. 더 적은 신택스를 사용하고 더 유연하다.

    임의 정밀도 연산(Arbitrary precision arithmetic)

    연산자 오버로딩

    표준 수학 기호를 사용하는 것은 연산자 오버로딩과 같은 것이 아니다. 적어도 C++에서 문제를 일으키는 그러한 종류는 아닌 것이다. '+' 부호와 기타 연산자는 여전히 어떤 프로그램에서든 뚜렷한 의미를 갖고 있다. 이들은 의미를 프로그램마다 수정하지 않는다. 비슷한 연산에 같은 신택스를 사용한다면 코드는 더욱 읽기 쉬워진다. 따라서, 신택스 재정의는 다른 프로그램에서는 다른 것을 의미할 수 있기 때문에 코드 읽기가 더 어려워 질 수 있다.

    메소드를 연산자로 대체하는 또 다른 제안은 BigDecimalBigInteger에도 해당된다. 예를 들어, 현재 무한 정밀도 연산(unlimited precision arithmetic)을 코딩 해야 한다면,

    BigInteger low  = BigInteger.ONE;
    BigInteger high = BigInteger.ONE;
    for (int i = 0; i < 500; i++) {
      System.out.print(low);
      BigInteger temp = high;
      high = high.add(low);
      low = temp;
    };

    이것은 다음과 같이 명확히 작성될 수 있다.

    BigInteger low  = 1;
    BigInteger high = 1;
    for (int i = 0; i < 500; i++) {
      System.out.print(low);
      BigInteger temp = high;
      high = high + low;
      low = temp;
    };

    클래스들의 남용과 이에 따른 퍼포먼스 저하가 있을 수 있지만 이 제안은 그렇게 거슬리지 않는다.

    JAR에서 JAM 취하기

    Java 7은 오랫동안 자바 개발자들을 짜증나게 했던 다양한 클래스 로더들(class loader)과 클래스 패스와 관련된 문제를 해결했다. Sun은 Java Module System을 사용하여 이러한 문제를 해결하고 있다. .jar 파일 대신, 데이터는 .jam 파일로 저장된다. 이것은 모든 코드와 메타데이터를 포함하고 있는 일종의 "superjar"라고 할 수 있다. 가장 중요한 것은, Java Module System은 처음으로 버전 관리를 지원하기 때문에, 해당 프로그램은 Xerces 2.6이 아니라 2.7.1버전을 필요로 한다고 지정할 수 있게 된다. 또한 종속 관계를 지정할 수 있다. 예를 들어, JAM의 프로그램은 JDOM을 필요로 한다고 지정할 수 있다. 모듈 전체를 로딩하지 않고 하나의 모듈을 로딩할 수도 있다. 마지막으로, 다수의 서로 다른 JAM들에 대한 다양한 버전들을 제공하는 중앙 집중화된 레파지토리로의 역할을 제공해 줄 것이고, 애플리케이션은 여기에서 제공하는 것들 중 필요한 것들을 선별할 수 있다. JMS가 작동하면 jre/lib/ext로의 지정 해야할 일련의 과정은 과거로 사라질 것이다.

    패키지 액세스

    Java 7은 아마도 액세스 제한을 조금 완화할 것이다. 이는 하위 패키지가 상위패키지에 있는 클래스들의 패키지상 보호되어있던 필드들과 메소드들에 접근할 수 있게 해줄 것이다. 또한, 하위 패키지가 상위 패키지의 페키지상 보호되었던 멤버들 중 명시적으로 접근 가능하도록 정의된 멤버들을 접근 할 수 있도록 해줄 것이다. 두 방법 모두, 애플리케이션을 여러 패키지들로 나누어서 보다 단순하고 테스트 성능도 향상시킨다. 단위 테스트가 하위 패키지에 있다면, 이들을 테스트 할 수 있도록 메소드를 공개할 필요도 없다.

    파일시스템 액세스

    파일시스템 액세스는 1995년부터 자바 플랫폼의 주요한 문제였다. 10년이 넘었지만, 파일을 복사하거나 이동하는 것 같은 기본적인 작동을 수행하는 신뢰성 있는 크로스 플랫폼 방식이 없다. 이러한 문제를 해결하는 것이 지난 세 개의 JDK 버전들(1.4, 5, 6)의 공공연한 이슈였다. 슬프게도 파일을 옮기거나 복사하는 지루하지만 필요한 API들이 메모리 매핑 I/O 같은 덜 일반적이지만 매력적인 연산에 밀려났다. 아마도 JSR 203은 이 문제를 해결할 것이고 우리에게 실현 가능한 크로스 플랫폼 파일 시스템 API를 제공할 것이다. 작업 그룹은 진정한 비동기식 I/O 문제에 대해 많은 관심을 쏟을 것이다. 내년 이맘때쯤 결과가 나올 것이다.

    실험

    어떤 변화가 일어나든 오픈 소스 세계에서 가장 먼저 구현된다면 더욱 좋을 것이다. 그래야지만 우리가 얼마나 많은 또는 얼마나 적은 차이를 만들어 냈는지를 볼 수 있기 때문이다. Sun의 Peter Ahe는 java.net에서 Kitchen Sink Project를 시작했다. 목표는 javac 컴파일러를 반복적으로 분기하여 다른 많은 아이디어를 테스트 하는 것이다.




    위로


    클라이언트 GUI

    비록 많은 사람들이 알아채지는 못했지만, 자바 플랫폼은 4~5년 동안 데스크탑에 실제로 존재했다. RSSOwl, Limewire, Azureus, Eclipse, NetBeans, CyberDuck 등을 포함한 일부 양질의 데스크탑 애플리케이션들은 자바 코드로 작성되었다. 이러한 애플리케이션은 Swing, AWT, SWT 같은 거의 모든 GUI 툴킷과 심지어 Mac OS X의 Cocoa 같은 플랫폼 툴킷에 의해 작성된다. 이러한 툴킷 중에서 어떤 것이 더 낫다고 단정지을 수는 없지만, Swing은 원래의 느낌을 갖고 있는 애플리케이션을 생성하는데 다른 것 보다 더 나은 기능을 갖출 것이다.

    Swing은 여전히 개발하기에는 도전이 되지만, Swing Application Framework의 출현으로 내년에는 상황이 더 나아질 것으로 보인다. 이 프레임웍은 현재 Java Community Process에서 JSR 296으로 개발 중이다. 다음은 JSR에 대한 설명이다.

    잘 작성된 Swing 애플리케이션들은 시작시키고 종료시키는 작업과 리소스, 동작, 세션의 상태들을 관리하는데 있어 동일한 핵심요소들을 가지는 경향이 있다. 새로운 애플리케이션들은 이 모든 핵심 엘리먼트들을 처음부터 만들어낸다. Java SE는 어플리케이션들을 구성하는데 어떠한 지원도 제공해 주지 않고 있고, 바로 이것 때문에 개발자들은 SE 문서에서 설명하는 예제 그 이상으로 확장된 애플리케이션을 구현할 때 당황하게 된다.

    Swing 애플리케이션의 기본 구조를 정의함으로써 그러한 허점을 채우기 위하여 정의된 사양서를 제공할 것이다. 이는 대부분의 데스크탑 애플리케이션의 일반적인 인프라스트럭처를 정의하는 확장성 있는 클래스 세트나 "프레임웍"을 정의할 것이다.

    Swing Application Framework은 대부분의 전형적인 애플리케이션을 지원하면서, 개발자들로 하여금 시작과 종료와 같은 몇몇 커스터마이징 부분을 추가해 넣을 수 있도록 해줄 것이다. 이는 어플리케이션 시작과 종료 와중에 윈도우나 다른 부분들에 대한 저장과 복구를 다룰 수 있게 해줄 것이다. 마지막으로, 개발자들은 Swing 이벤트 디스패치 쓰레드 외부에서 실행되는 비동기식 액션을 작성할 수 있게 된다.

    JavaBeans와 Swing을 향상시키고자 하는 노력이 진행 중이다. JSR 295는 빈들을 바인딩 하는 표준 방식을 정의하여, 하나의 빈이 업데이트 되면 이것이 자동으로 다른 빈에 반영될 수 있도록 한다. 예를 들어, GUI 그리드 빈은 연관된 데이터베이스 빈이 변경되면 자동으로 업데이트 된다.

    마지막으로 JSR 303은 XML 기반 밸리데이션(validation) 언어 관련 작업을 진행하여 주어진 빈이 취할 값을 지정한다. int 프로퍼티는 1과 10 사이에 있어야 한다거나, String 프로퍼티에는 합법적인 이메일 주소가 포함되어야 한다는 등을 지정할 수 있다. 올해 말에는 베타 버전으로 이러한 기능을 사용할 수 있을 것이고 내년 이맘때쯤 Java 7에 대한 작업이 끝날 것이다.




    위로


    데스크탑 언어로서 자바 플랫폼

    일부 프로그래머들은 자신들이 선호하는 언어이기 때문에 자바 코드로 데스크탑 애플리케이션을 작성하지만, 대부분은 멀티 플랫폼을 수용하기 위해서이다. 데스크탑 언어로서 자바 플랫폼에 대한 관심은 비 Microsoft 계열 데스크탑의 수와 연관되어있다. 세 가지 주요 데스크탑에서의 자바 프로그래밍에 대해 알아보자.

    Windows

    Swing은 특히 오픈 소스 개발로의 전향과 아울러 여전히 내년까지도 Windows 룩앤필을 향상시킬 것이다. 결국, LimeWire 같은 순수 자바 프로그램들은 Windows 보다 자연스러운 모습을 보이게 될 것이다. 하지만, 원래의 Windows 애플리케이션 개발 언어는 C#(일부 C 와 C++ 포함)이다. 그리고 프레임웍은 .NET이 될 것이다. 자바 코드는 Windows 생태계에 깊이 관여하지는 않을 것이다.

    Macintosh

    Microsoft와 마찬가지로 Apple Inc.도 자바 코드를 거의 포기했다. Apple은 Objective C 와Cocoa를 선호하지만 그의 결과 또한 같다. Mac 전용 개발자들은 Apple의 주력 언어와 환경에서 자바 코드를 제거하려는 시도를 계속해서 하고 있다.

    긍정적인 측면은, Apple은 QuickTime과 Cocoa 같은 상용 API에 대해 자바 코드를 더 이상 지원하지 않지만 Apple VM은 그 어느 때보다도 훨씬 더 나아졌다. Apple의 Java 6 포트가 곧 릴리스 될 것이다. (Sun의 JDK와는 달리) 오픈 소스는 아니지만, 오픈 소스 프로그래머들이 버그를 픽스할 것이다.

    Linux

    GPL 라이센스로 자바 코드를 가장 순수한 오픈 소스 리눅스로 함께 묶을 수 있는데, 이로써 자바 플랫폼은 매력적인 리눅스 개발용 언어로서 한층 더 다가갈 수 있다. 이러한 상황이 5전 전에만 일어났다면, 리눅스 커뮤니티는 C 때문에 고생을 하지 않아도 되었을 것이고, Mono도 불필요했을 것이다.

    Gnome과 KDE용 자바 바인딩은 내년에는 더욱 많은 관심을 끌 것이다. C, C++, 또는 C#이 아닌 자바 코드를 사용하여 리눅스 GUI 프로그램을 개발하는 적어도 한 개 이상의 주요 프로젝트가 시작될 것으로 보인다.




    위로


    Ruby가 경쟁에서 이기다!

    Bloatware

    JavaScript는 이미 JDK 6에 번들되었다. 추가 언어는 JDK 7에 추가될 것이다. 너무 부풀려지는 느낌이다. Sun이를 멈출 수 있는 방법이 없다. BeanShell을 선택하면 Groovy쪽 사람들도 개입하고 싶어할 것이다. Groovy가 들어오면, Ruby 사용자들도 들어오려고 할 것이다. Ruby가 개입되면 Python은 가만히 있을까? 표준 JDK는 이미 너무 방대해졌다. 여러 스크립팅 언어를 지원하는 것도 큰 일인데, 번들링까지는 무리이다. 해결책으로 이들 모두를 지원은 하겠지만, 어떤 것도 번들하지는 않을 것이다.

    긍정적인 측면은, Sun은 초기의 다운로드 사이즈와 애플리케이션 시작 시간을 줄이는 방안을 모색하고 있다. 특히 애플릿과 Java Web Start 애플리케이션에 대해 그렇게 하고 있다. 거대한 클래스 라이브러리가 서버에 남겨지고, 필요한 부분만 다운로드 될 것이다.

    우리가 단 하나의 언어로만 대화한다면 이 세상은 매우 지루할 것이다. 자바 플랫폼은 애플리케이션 개발에 있어서 최상의 선택이지만, 작은 프로그램이나 매크로에는 절대로 맞지 않는다. Java 6은 이를 인식하고 BeanShell, Python, Perl, Ruby, ECMAScript, Groovy 같은 스크립팅 언어와 통합하기 위해 javax.script 패키지를 추가하고, invokedynamic 가상 머신 명령을 Java VM에 추가하여 Java VM이 직접 동적으로 기술된 언어들을 컴파일 할 수 있도록 했다.

    비록 내가 개인적으로 선호하는 것이 아니지만, 2007년에 나는 Ruby에 돈을 투자할 것이다. Python 코드는 훨씬 더 깨끗해진 것 같고, Ruby 코드보다 이해하기가 더 쉽다. 아마도 이 부분에 대해서는 대부분의 자바 프로그래머들도 동의할 것이다. Python은 시기를 잘못 타고 태어났다. 많은 개발자들은 Python을 배우는 것과 자바 코드를 배우는 것 중 선택해야 했고, 대부분이 자바 코드를 선택했다. 그들이 자바 신택스를 다 이해하고 다른 언어를 받아들일 준비가 되었을 때는 과거의 언어가 아닌 미래의 언어를 택하기 마련이고, 그것이 Ruby일 듯 하다. 가장 중요한 것은 Ruby는 Ruby on Rails의 절대적인 킬러 애플리케이션을 갖고 있다. 이것의 단순함은 현실적인 Java Enterprise Edition (JEE) 개발자들에게는 매우 매력적으로 비춰진다.

    Rails 이상으로, JRuby 프로젝트는 다른 스크립팅 언어들 보다 기존 자바 코드와 라이브러리와 더 나은 통합을 시도한다. 사실, JRuby는 표준 Ruby를 누르고 Ruby를 사용하는 자바 프로그래머들뿐만 아니라 Ruby 프로그래머들도 선호하는 플랫폼이 되었다. 좋은 일이다. Ruby는 막강하나 Python은 그렇지 못하다는 것은, 슬프지만 진실이다.

    다른 스크립팅 언어들은 점점 더 쇠락해 갈 것이다. Perl은 너무 구식이고 현대적인 애플리케이션과 잘 맞지 않는다. Groovy는 뚜렷한 비전이 없이 유용성이나 친숙성을 떠나 컴퓨터-과학 분야의 전문언어로 채택되는 경향이 있다. BeanShell, Jelly, 그리고 일부 언어들도 관리가 되고 있지 않다. Ruby가 자바 프로그래머의 스크립팅 언어가 될 것인지는 내년까지 승부가 갈릴 것이다.




    위로


    IDE가 점점 나아지고 있다.

    2006년은 IDE에게 있어서 최악이었다. 이클립스에 당황한 Sun은 그들의 에너지와 리소스를 NetBeans에 쏟아 부었고, 결국엔 막강한 경쟁자가 되었다. 어떤 면에서, NetBeans는 2006년 말에는 이클립스를 능가하는 것처럼 보였다. 훨씬 더 나은 룩앤필과 GUI를 디자인 하는 훨씬 더 나은 툴을 갖고 있었다. 반면, NetBeans가 갖지 못한 것은 이클립스와 같이 커뮤니티가 활성화 되지 못했다는 것이다. 훨씬 더 많은 플러그인과 서드 파티 제품들이 NetBeans 보다는 이클립스에 기반하고 있다. 이러한 추세는 점점 더 가속화 될 전망이다.

    이클립스는 3.3 버전을 위해 힘들게 작업 중이고, 2007년에는 릴리스 될 것이다. Sun은 올해 NetBeans 6를 출시할 것이다. 두 개 모두 메이저 릴리스가 될 것 같지는 않다. 단순히 여기 저기에 작은 기능들을 추가하고, 버그를 픽스하고, 사용자 인터페이스를 정리한 정도이다.

    NetBeans는 계속해서 Eclipse의 영역에서 시장 점유율을 높여갈 것이며, 그의 성장 가능성또한 아주 많다. Sun의 집요한 JDK 다운로드에 NetBeans 끼워 넣기는 무리 없어 보인다. 올해 말까지 두 개의 IDE는 시장을 양분할 것이다.

    한편, IntelliJ IDEA 사용자들은 이러한 모든 상황에 개의치 않고 자신들이 최상의 Java IDE를 사용하고 있다고 자부하고 있다. 하지만, 대부분의 사용자들은 $500이 넘는 가격을 부담스러워 할 것이고 시장 점유율은 5%에 그칠 것이다.




    위로


    Java Enterprise Edition

    자바 프로그래밍의 어떤 부분도 JEE 만큼 성공적이면서도 욕을 먹은 부분은 없다. 이것은 모든 사람들이 애증을 갖고 있는 기술이다. 복잡하고, 혼란스럽고, 무겁다. 자바 프로그래밍의 어떤 부분도 이를 대체하기 위해 그렇게 많은 노력을 들인 적이 없다. Spring, Hibernate, Restlet, aspects, Struts ...등 끝이 없다. 그럼에도 불구하고, 거의 모든 자바 프로그래머들은 JEE를 찾고 있기 때문에 Sun은 이 부분을 신경을 써야 할 것이다.

    엔터프라이즈 세계에서 내가 목격한 경향 중 하나는 단순함에 대한 열망이다. 많은 프레임웍들이 나와 있으며, 그 안에서 작고 단순함을 선호하는 추세다. 점점 더 많은 고객들은 JEE 스택의 큰 부분을 거부하고 있고 이러한 추세는 지속될 전망이다. 대신 고객들은 Spring 같은 단순한 프레임웍으로 전향하거나 Ruby on Rails를 사용하는 추세이다. 더 단순하고, 보다 이해하기 쉬운 시스템에 대한 열망은 서비스 지향 아키텍처(SOA)와 Representational State Transfer (REST)에 대한 관심을 증폭시키고 있다.

    2007년에도 단순함에 대한 추세는 지속될 것이다. Rails에 탄력을 받은 많은 사람들은 Python (Turbo Gears), Groovy (Grails), Java (Sails) 같은 다른 언어에서도 성공하기 바란다. 이들 중 하나는 성공하겠지만, 그렇지 않을 경우 더 이상의 새로운 것은 없다. 결국, 비즈니스는 그들이 이미 갖고 있는 SOA, REST, Rails를 계속 사용할 것이다.




    위로


    Java Micro Edition

    단순하고 작은 것에 대한 열망이 임베디드 분야에도 적용될 수 있을까? 지난해 동안 자바 플랫폼은 작은 장치에 있어서 큰 성공을 거두었고 2007년에도 그러한 동력을 계속 이어갈 전망이다. 우선, Mobile Information Device Profile (MIDP)의 버전 3이 기대된다. 특히, 여러 MIDlet을 하나의 VM에서 실행할 수 있게 될 것이고, 백그라운드 에서는 한 개 이상을 실행할 수 있다. 또한 암호화된 레코드 관리 시스템(RMS) 스토어와 IPv6 지원도 기대된다.

    현재 개발 중인 Java ME용 Scalable 2D Vector Graphics API 2.0은 많은 장치에서 사용할 수 있는 애니메이션 기능을 확대하고 있다. SVG 애니메이션 외에도 오디오 및 비디오 스트리밍도 실행한다. 모바일 네트워크가 열리면, 정말로 중요해진다. 셀폰의 YouTube를 생각해 보라. (물론, 네트워크가 연결되지 않으면, 이것은 어떤 누구도 보고 싶지 않은 2인치 짜리 기업 광고일 뿐이다. 미국에서 이것이 실현될지 의문이지만, 유럽에서는 가능하리라고 본다.)

    모바일 개발자들은 Java ME용 XML API를 지원하는 원년이 될 것이다. 이 API는 전화기의 제한된 메모리 환경에 맞도록 설계된 SAX, DOM, StAX, JAXP의 하위 세트이다. 많은 사람들은 순수한 XML은 전화기에는 맞지 않는다고 생각한다. 올해에는 이것이 옳은지, 그른지 판가름 날 것이다.

    모든 좋은 소식에도 불구하고 Apple의 iPhone은 여전히 모바일 폰 개발 플랫폼으로서 자바 플랫폼에 위협적인 존재가 될 것이다. iPhone은 출시된 지 여섯 달 만에 최고의 주목을 받고 있다. 문제는 폐쇄 플랫폼이라는 것이고, 셀폰 네트워크 표준에 의해서도 자바 코드를 실행할 것 같지 않다. 이는 모바일 폰, PDA, 개인용 커뮤니케이터용 서드 파티 애플리케이션을 판매하려는 사람들에게 끔찍한 소식이 아닐 수 없다.




    위로


    요약

    JDK의 오픈 소스 전향 덕택에, 2007년은 자바 프로그래밍 역사 이래 최고로 흥미로운 한 해가 될 것이다. 지금까지, 자바 플랫폼은 Sun의 목표나 투자로만 제한되었지만, 이러한 현상도 곧 바뀔 전망이다. 개발자 커뮤니티의 막강한 힘으로 자바 프로그래밍은 어디든 항해할 수 있다. 개발자들은 전보다 더 자바 코드로 더 많은 일들을 할 수 있다. 데스크탑, 서버, 임베디드 이 모든 것들이 가속화 될 것이다. 하지만 이러한 엔진들도 일시적으로 멈출 때가 있을 것이다. 좋은 것은 살아남고, 그렇지 않은 것은 사장될 것이다. 자바 플랫폼에서 좋아하지 않는 부분이나 여러분을 괴롭혔던 것이 있다면 여러분의 IDE를 띄워 해킹을 시작해 보는 것도 좋다.

    여러분이 갖고 있는 컴파일러를 지금 시작해 보기 바란다.

    소셜 북마크

    mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

    기사의 원문보기

    2007/11/29 11:43 2007/11/29 11:43
    이 글에는 트랙백을 보낼 수 없습니다
    기타  2007/11/25 21:50

    http://crack.ms/  -  가장 대표적인 crack 사이트

    http://astalavista.box.sk - 대표 크랙 사이트

    http://www.cerials.net
    http://www.gamecopyworld.com - 각종 crack 및 정보사이트
    http://www.astalavista.com
    http://lockinfo.ivyro.net/ =>히포님 홈페이지죠..게임락정보
    http://bestanime.co.kr/newAniData/list.php?viewType=title =>애니메이션 검색
    http://www.cracks.am/main.html =>크랙 사이트(접속시 야릇한 홈페이지가 뜨네요..)
    http://www.deluxserials.com/ =>시리얼 검색사이트(업데이트가 좀 늦은편..)
    http://gameguru.box.sk/ =>게임 트레이너 치트 검색사이트
    http://megagames.com/ =>게임 크랙.트레이너.치트 검색사이트
    http://www.serials.ws/ =>시리얼 검색사이트
    http://www.dll-files.com/ =>OS 에 필요한 DLL 파일 검색사이트
    http://gamefix.free.fr/ =>노시디 크랙,키젠,트레이너 같은 DOX전문
    http://www.gameburnworld.com/ =>마찬가지
    http://www.makeabackup.com/ =>크랙,락정보,레코딩플그램,BWA파일들
    http://www.keygen.us/ =>키젠전문(업뎃 구림)
    http://lockinfo.ivyro.net/ =>히포님 홈페이지죠..게임락정보
    http://bestanime.co.kr/newAniData/list.php?viewType=title =>애니메이션 검색
    http://www.cracks.am/main.html =>크랙 사이트
    http://www.deluxserials.com/ =>시리얼 검색사이트(업데이트가 좀 늦은편..)
    http://gameguru.box.sk/ =>게임 트레이너 치트 검색사이트
    http://megagames.com/ =>게임 크랙.트레이너.치트 검색사이트
    http://www.serials.ws/ =>시리얼 검색사이트
    http://www.dll-files.com/ =>OS 에 필요한 DLL 파일 검색사이트
    http://gamefix.free.fr/ =>크랙,키젠,트레이너 같은 DOX전문http://www.gameburnworld.co
    m/ =>마찬가지
    http://www.makeabackup.com/ =>크랙,락정보,레코딩플그램,BWA파일들
    http://www.keygen.us/ =>키젠전문(업뎃느림)
    http://www.gamezone.com/hints/hin1000.htm
    http://www.gamewinners.com/

    http://toptools.serwis.pl/

    http://www.bestcracks.com

    http://www.wtcracks.com/

    http://cracks.am

    http://www.thecrack.net:8080/


    이외에도 난 최고의 크랙사이트를 보유하고있지 !!!
    켜켜켜 최고의 해커 sim 및 그외 찌그러기들 ㅋㅋㅋㅋㅋ

    2007/11/25 21:50 2007/11/25 21:50
    이 글에는 트랙백을 보낼 수 없습니다

    환경설정파일받기, ImTOO MP4 Video Converter V 3.1.29.0419b받기, 바닥인코딩설정 파일받기

    3.1.10 키젠/ImTOO all keygen

    사용자 삽입 이미지

    등록번호


    K3G(W100)V3 - MPEG-4 Video.pf : 인코딩 환경설정 파일
    Korean.lang : 한글 언어 파일

    한글언어파일은 기본 경로를 기준으로 C:\Program Files\ImTOO\MP4 Video Converter\lang 에 넣으시면 됩니다.
    인코딩 환경설정 파일은 기본 경로를 기준으로 C:\Program Files\ImTOO\MP4 Video Converter\profile 에 넣으시면 됩니다.
     
    인코딩 설정 파일은 위 그림 오른쪽에 나온 값이 디폴트 값 입니다. 디폴트 값을 변경하고자 하시면 K3G(W100) - MPEG-4 Video.pf 을 텍스트 에디터로 여신후 아래 내용의 파란색으로 된 부분을 변경하고 저장하시면 됩니다.
     
    [Main]
    Name= 바닥(.avi) to EV-W100(k3g)
    SName=EV-W100
    Format=mp4
    ExtName=k3g
    IsSysProfile = yes
    [Parameter]
    t=0, "", ""
    ss=0, "", ""
    vcodec=READONLY, "", "mpeg4", {"mpeg4"}
    s = 0, 0, 320x240, { "320x240 (Qvga)", "176x144 (Qcif)", "128x96 (sqcif)"}
    b = 0, "", 300, { 40, 60, 80, 120, 192, 216, 250, 256, 300, 512, 768, 1000, 1200, 1500 }
    r=0, "", "15", {10, 15, 24, 30}
    acodec=READONLY, "", "mpeg4aac", {"mpeg4aac", "aac"}
    ab=0, "", "128", {"32", "48", "64", "96", "128", "160"}
    ar=0, "", "24000", {"8000", "9600", "11025", "16000", "22050", "24000", "32000", "38400", "44100", "48000"}
    ac=0, "", "2", {"1 (Mono)", "2 (Stereo)"}
    an=0, "", ""

    K3G 인코딩 설정은 EV-W100을 기준으로 설정되어 있습니다.

    인코딩 샘플 화면



    원본 화면 720 x 304 700MB


    바닥 인코딩 화면 (PDA용)

    바닥 인코딩 화면 320 x 240 328MB

    ImTOO 인코딩 화면 (K3G)

    ImTOO 인코딩 화면 320 x 240 176MB




    곰은 상단에 잠깐 나오는 광고가 싫고, 3GP는 퀵타임을 깔아야 되서 귀찮고 해서
    바닥은 자막을 입히기 위해 사용하고, 핵심작업은 ImTOO가 되겠습니다.
    EV-W100은 자체 .smi 자막을 지원합니다.

    2007/11/25 13:20 2007/11/25 13:20
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2024/11   »
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)