Entries for month: February 2010



Adobe Edge Newsletter - ColdFusion 9와 함께하는 빠른 RIA개발
Category : ColdFusion Comments : 댓글쓰기 Posted by 장창학 at 5:29 PM

Adobe Japan에서 받아보는 Edge뉴스레터에서 ColdFusion 9와 관련한 기사가 메일함에 왔길래 새로이 ColdFusion이 뭔지 궁금히 하시는 입문자를 위해 링크 걸어 둡니다. 기사가 일본어로 되어 있기 때문에 구글번역을 통해 링크를 겁니다만 이해하는데는 무리가 없으리라 봅니다. 혹 궁금하신 사항이 있거든 네이버의 Open ColdFusion Cafe로 문의바랍니다.

기사보기 :
http://translate.google.co.kr/translate?hl=ko&sl=ja&tl=ko&u=http%3A%2F%2Fwww.adobe.com%2Fjp%2Fnewsletters%2Fedge%2Ffebruary2010%2FFcontent%2Findex.html


ColdFusion Server Manager에서 수십대의 ColdFusion 서버를 보안업데이트 한다?
Category : ColdFusion Comments : 1 Comment Posted by 장창학 at 11:27 AM

Adobe ColdFusion 9에서 함께 배포되는 ColdFusion Server Manager(하지만 별도로 다운로드 받아 설치할 수 있는 무료 AIR기반 S/W)는 간단한 AIR기반 유틸리티지만 거의 ColdFusion Server Web 관리자 기능 대부분을 가지고 있습니다. Server의 중지와 시동은 물론이거니와 DSN의 생성/삭제/수정, 메일서버의 정의 등 대부분의 웹관리자 기능을 그대로 옮겨 놓았습니다. 이 유틸리티는 Adobe ColdFusion 9를 설치하면 웹관리자내에서 다운로드하거나 설치디렉토리 하위의 \wwwroot\CFIDE\ServerManager 디렉토리안에 ServerManager.air라는 파일로 있습니다.(여기서도 다운로드 받을 수 있습니다. http://www.nooree.com/blog/post.cfm/coldfusion-server-manager)

그런데 한국내에서는 그럴일이 거의 없겠지만 어떤 회사(대부분 웹호스팅회사 등)에서 수십대의 ColdFusion Server를 운영하고 있거나 또는 고객사의 서버를 원격을 관리하는 경우 이 AIR기반의 ColdFusion Server Manager를 이용하면 쉽게 관리가 가능해 지는데, 모든 서버에 대한 보안업데이트를 적용하는 경우 기존에는 일일 해당서버의 웹관리자로 로그인하여 패치해야 했습니다만, Server Manager를 이용하면, 한번에 적용하고자 하는 서버를 선택적으로 또는 전부를 적용할 수 있습니다.

먼저 Server의 목록에서 적용하고자 하는 서버를 선택한 다음 아래의 그림처럼 Server Tasks아래 Apply Hotfix 메뉴를 선택하면 패치파일을 선택하는 창이 뜨게 되는데 적용하고자 하는 Hotfix의 Jar파일을 선택해주면 적용하고자는 모든 서버에 패치가 적용됩니다. 간단하지만 매우 유용한 기능이 아닐까 싶네요. 혹, 2대이상의 서버를 관리하는 경우 사용해 보시길 바랍니다. 서비스를 목적으로하는 프로덕트서버 뿐만 아니라 개발목적의 로컬서버도 적용가능합니다.

ColdFusion Server Manager


Full HD on HTML5 - HTML5 비디오의 성능 과연 Flash에 밀리나?
Category : HTML5 Comments : 댓글쓰기 Posted by 장창학 at 4:27 AM

Ajaxian(I Can’t Believe It’s Not Flash-이게 플래시가 아니란 것을 믿을 수 없어요.)에서 재밌는 글을 보았습니다. Jilion.com에서 테스트 중인 HTML5 비디오 플레이어의 성능이 Flash보다 낫다는 것 인데요. Ajaxian 그림에서 보면 Full HD 영상의 CPU점유률이 HTML5는 10%대 Flash는 100%라고 되어 있는데 다소 공격적으로 한말 같지만 HTML5의 비디오 성능은 거의 브라우저에 의존적인데 어떻게 저런 평가가 나올 수 있나 했습니다. 하지만 코덱의 성능이 곧 영상재생의 성능이라고 봤을때 적절한 코덱의 선택으로 Flash보다 나은 퍼포먼스를 보일 수 도 있겠네요. 암튼 브라우저의 성능이나 Flash의 성능이나 다들 앞으로 많은 개선이 있겠지만 무엇보다 저야 OGV포맷을 아무래도 오픈소스라 미는 입장입니다만. Flash에서도 오픈소스 코덱을 지원했으면 하는데 제 바램이지만 뭐 지들 Flash Player 성능 개선이 우선이겠죠. 괜히 넣었다가 성능 꽝이면 바로 깨작이니..ㅋ

암튼 HTML5의 비디오는 앞으로 발전할 것은 자명한 사실이고, Flash가 98% 이하의 점유율이 내려가는 것이 너무나 안타까운 분들에게는 다소 실망스럽겠지만 일부 Flash의 비디오 영역을 잠식할 것으로 보는 것은 저만의 생각은 아닐 것으로 확신합니다. 하지만 Flash를 능가하는 점유율을 보이진 않겠네요.(이건 순전히 Flash, HTML5, Silverlight 등 많은 기술이 비슷한 점유율로 공존했으면 하는 제 바램하고는 다소 거리가 멀지만 일단 "Flash의 상대는 없다"는 완고한 생각을 가진 분들께 드리는 저만의 립서비스라고 해두죠.)

Ajaxian의 제목과 댓글만 봐도 알다시피 외국에서도 HTML5 vs. Flash가 이슈기는 한가 봅니다만, 사실 Flash는 끝났다는 식의 거북한 말을 서슴치 않게 했던 저로서도 이젠 그런 기분 상하는 식의 발언은 안하려고 합니다. 문제가 있음을 반성하고 있으니까요. 다만 Flash가 모든 웹기술의 명제라고만 보는 시각도 문제는 분명있다고 보는데.. 뭐.. 이건 우열을 가리자는 문제는 아닌거 같고, 일단 시장의 선두기업 입장에서 다른 기술의 관심몰이는 분명 귀찮은 존재이니 일단 한 번 까고보자일것이고.. 후발 기술입장에서는 어떻게서든 선두기술의 약점을 과대포장하여 까발리는 것이 뭐 이 바닥의 흔하디 흔한일이니 괜시리 서로 핏대 세우며 혈압 오를 필요는 없다고 봅니다.

본론으로 들어가서 문제는 HTML5의 비디오 기능이 브라우저에 전적으로 의존하다보니 브라우저의 벤더마다의 비디오 재생플레이어가 통일되어 있지 않아 인터페이스의 통일성을 중시하는 웹디자이너 입장에서는 선뜻 HTML5의 비디오를 선택하기 쉽지 않아보였습니다. 그런데 Jilion.com에서 현재 HTML5를 지원하는 브라우저인 Google의 Chrome과 FireFox, Apple의 Safari용(IE는 HTML5를 지원하지 않기 때문에 IE for Chrome Frame를 설치해야 함.) SublimeVideo이라는 HTML5용 비디오 플레이어(Javascript기반으로 추측됨)를 만들었다고 합니다. 모든 브라우저에서 동일한 모습을 보이도록 말이죠. PC의 브라우저 뿐만 아니라 iPhone/iPod/iPad의 Safari에서도 지원한다고 하니 테스트해봐야 겠네요. 성능에는 자신있어라 하는 것 같은데, 굳이 Flash랑 비교해서 혈압오르고 싶지는 않네요. ㅎㅎㅎ 아래의 비교 그림을 보시길 바랍니다. 아울러 곧 비상용 목적으로 사용할 시 무료로 사용할 수 있는 버전이 공개될 예정이라네요. 비슷한 오픈소스 프로젝트들이 많아 질 것 같습니다. Demo를 꼭 살펴보세요. Firefox나 Safari, Chrome의 경우 바로 접속하면 되고 IE의 경우 위에서 언급한 IE for Chrome Frame을 설치하시면 IE에서도 볼 수 있습니다. (추가 : 제게 설치된 Windows 7환경에서의 간단 비교로는 OGG포맷의 FireFox가 HD환경 Full Screen에서 가장 고화질의 버벅임이 없군요. Safari의 MP4나 IE에서의 Chrome모듈로의 재생은 그닥..)

SublimeVideo 


Image를 Resize할때 정사각형 비율로 Resizing하기
Category : ColdFusion , Railo Comments : 2 Comments Posted by 장창학 at 10:54 PM

Square Image ResizeColdFusion에서 이미지를 Resize하는 방법은 imageResize() 함수를 쓰게 되면 쉽게 가로사이즈를 변경할 수 있습니다. 물론 함수는 Adobe ColdFusion 8 또는 Railo 3이상의 환경에서 지원합니다. 그런데 이미지를 리사이징하다보면 가로가 더 길거나 세로가 더 긴 직사각형 이미지가 대부분입니다. 그리고, HTML이나 ColdFusion에서 사이즈를 줄 일 경우 대부분 Width값만 조절하면 Height값은 비율에 따라 자동으로 조절됩니다. 하지만 Design의 특성상 또는 Twitter에서의 Profile 사진처럼 정사각형으로 이미지를 보여야 하는 경우가 있습니다.

그런데 사용자가 업로드하는 이미지는 언제나 가로가 더 길던, 세로가 더 긴 직사각형 이미지이고, 업로드시 사용자가 Photoshop등에서 미리 정사각형으로 조절하여 업로드 할 수 있지만 매번 그러라고 할 수 도 없는 노릇입니다. 그리고 가로가 길던, 세로가 길던 정사각형으로 리사이즈 하는 경우 이미지의 비율을 찌그러뜨리지 않고(홀쭉이가 되거나 뚱댕이 되는 것이 아닌), 원본 비율대로 사이즈만 조절되어야만 한다면 어떻게 해야 할까요? LearnCF에서의 간단한 예제를 통해 가로세로 비율이 정사각형이 아닌 이미지를 어떻게 정사각형 이미지로 비율 맞추어 리사이즈하는지 알아 봅시다. 먼저 예제를 미리 보시길 바랍니다.

Demo View : http://www.nooree.com/samples/cfimage/square_thumnail.cfm

<cfimage>를 이용해서 특정 이미지의 정보를 읽어 온 다음, squareThumbnail()이라는 사용자 정의 함수(UDF)에 Arguments(여기서는 이미지정보와 리사이즈하고자 하는 목표 사이즈) 를 전달하면, 실행됩니다. 목표 사이즈값은 가로세로의 동일한 값이겠죠? 그리고 다음의 세가지 조건에 따라 프로세싱을 달리 합니다. 첫번째는 가로사이즈가 더 큰 이미지인 경우, 두번째는 세로사이즈가 더 큰 이미지인 경우, 마지막으로 정사각형이미지인 경우로 나누어 처리합니다. 모든 이미지의 정보에서 가로와 세로의 길의 절반값을 계산합니다. 가령 400px*300px 크기의 이미지라면 가로의 절반값은 200px이고, 세로의 경우 150px이 됩니다. 그렇다면 이 이미지의 중심점의 좌표는 X좌표는 200. Y좌표는 150이 됩니다.

그런다음 imageCrop()함수를 이용해서 이 중심좌표를 기준으로 원하는 목표 사이즈 만큼만 가로세로 잘라내면 되겠죠. imageCrop()함수의 기본 사용법은 ImageCrop(name, x, y, width, height) 이므로 X값과 Y값을 지정해 주고, width와 height는 목표 리사이즈 값이므로 동일한 값입니다. 다음의 코드를 보고 X, Y값을 구해보세요. 간단하게 imageResize()함수와 imageCrop()함수를 써서 정사각형 이미지 리사이즈를 구현해 보았습니다.

 

<cffunction name="squareThumbnail" access="private" returntype="void">
	<!--- 함수로 넘어온 Argument정의 --->
	<cfargument name="image" required="true" />
	<cfargument name="size" required="true" />
	<!--- 이미지의 사이즈의 절반을 구함. 전체 사이즈의 2분의 1--->
	<cfset var half = int(arguments.size / 2) />
	<!--- X, Y의 초기값 정의 --->
	<cfset var fromX = 0 />
	<cfset var fromY = 0 />
	<!--- 세로가 더 긴 경우 --->
	<cfif arguments.image.height gt arguments.image.width>
		<cfset imageResize(arguments.image, arguments.size, '') />
		<cfset fromX = arguments.image.Height / 2 - half />
		<cfset imageCrop(arguments.image, 0, fromX, arguments.size, arguments.size) />
	<!--- 가로가 더 긴 경우 --->
	<cfelseif image.width gt image.height>
		<cfset imageResize(arguments.image, '', arguments.size) />
		<cfset fromY = arguments.image.Width / 2 - half />
		<cfset imageCrop(arguments.image, fromY, 0, arguments.size, arguments.size) />
	<cfelse>
		<cfset imageResize(arguments.image, '', arguments.size)>
		<cfset imageCrop(arguments.image, 0, 0, arguments.size, arguments.size)>
	</cfif>
	<!---정사각형으로 리사이즈된 이미지 출력--->
	<cfimage action="writetobrowser" source="#arguments.image#" />
</cffunction>

<h2>김태희 - 정사각형 이미지 리사이즈</h2>

<!---이미지 정보를 읽어옴--->
<cfimage action="read" name="image" source="#expandPath('./kimtaehee.jpg')#" />
<!--- 읽어온 이미지를 화면상에 출력--->
<cfimage action="writetobrowser" source="#image#" />
<!--- squareThumbnail 사용자 함수에 이미지를 대입하여, 정사각형 이미지로 변환--->
<cfset squareThumbnail(image, 150) />

 


RemoteObject를 이용한 Railo와 Flex의 연동 - Blog의 제목을 DataGrid에 뿌려보기
Category : ColdFusion , Flash/RIA , Railo Comments : 댓글쓰기 Posted by 장창학 at 7:24 AM

아.. 정말이지 이 예제를 만들어 보면서 끙끙댔습니다. Flex에 대한 지식도 매우 얇거니와 그나마 안한지 3년이 넘어가서 간단한 것(?) 하나 만들기 정말 힘드네요.ㅋㅋ 집에 쳐박혀 있던 Flex책들을 다시 꺼네여 좀 읽어 본 후 한번 만들어 봤습니다. 사실 ColdFusion에서야 CFC(ColdFusion Component)를 만드는 것이야 일도 아닙니다만, 젠장.. Flex로 Client 꾸미는 것이 일이네요.(그래서 제가 Flex나 Flash와 같이 Actionscript에 흥미가 없나 봅니다. ㅠㅠ)

암튼 지난 Railo에서 Flex시작!! 이란 포스트에서 처음으로 Flex와 Railo를 연동해봤는데요. Adobe ColdFusion의 경우 이미 MX버전부터 Flash Remoting을 지원하고 있었고, 버전 8부터는 아예 LCDS를 내장해버려(물론 라이센스를 별도로 구매해야 쓸 수 있습니다) Flex와의 연동 뿐만 아니라 그냥 mxml컴파일까지 ColdFusion서버에서 처리하면 되었습니다. Railo의 경우 버전 3.1부터 BlazeDS를 내장해서 mxml컴파일까지 지원하길 바랬는데 그냥 Flash Remoting만 지원하고 있습니다. 물론 Railo 역시 이미 버전2부터 Flash Remoting을 지원했었고요. 다만 3.1부터 BlazeDS엔진이 일부 추가되었다는 이야기 입니다. 결론은 Railo나 Adobe ColdFusion이나 (성능상의 문제는 일단 노외로 하고..) Flex에서 모두 RemoteObject를 쓸 수 있었다 뭐~ 그런 이야기입니다. ㅋ(참고로 Open BlueDragon에서도 BlazeDS를 이용하려면 다음의 링크를 참조하세요. BlaseDS의 내부 jar파일과 OpenBDAdoptor를 이용하는 예제인데 Query Object를 리턴받을 수 없는 기능제한이 있군요. http://wiki.openbluedragon.org/wiki/index.php/OpenBD_and_BlazeDS)

쳐벅혀 있던 Flex책과 씨름해서 겨우 만든 것이지만 간만에 Flex해보니 재밌네요.ㅋ 예제는 아래의 URL에서 확인해 볼 수 있습니다. 간단하게 블로그의 DB에서 게시글의 테이블의 URL주소로 쓰이는 name이란 칼럼과 title이란 칼럼을 구해와서 Datagrid에 Binding하고 링크를 걸어주는 예제입니다. ColdFusion CFC를 이용해서 Database 쿼리결과를 Array로 반환하여(물론 ColdFusion에서는 쿼리결과를 배열뿐만 아니라, 목록, 구조 등으로도 반환받을 수 있습니다. 이 부분은 ColdFusion기술문서를 참조하세요.) 리턴해주면 Flex에서 데이터를 바인딩하는 초간단 예제이므로 그냥 그런가보다 해 주시길 바랍니다. ColdFusion이라면 모를까 Flex에 대해 여쭤보시면 저는 아마도 궁색한 변명을 늘어놀지도.. ㅎㅎㅎ

Demo View : http://www.nooree.com/samples/railoflexblog/nooreeBlogEntry.html

Sample File Download

blogRemoteService.cfc

<cfcomponent hint="My blog entries">
	<cffunction name="blogQuery" access="remote">
		<cfquery name="qGetEntry" datasource="DSN이름">
			SELECT name, title
			FROM blog테이블명
			ORDER BY last_modified DESC
			LIMIT 30
		</cfquery>
		<cfreturn qGetEntry />
	</cffunction>
</cfcomponent>

 

nooreeBlogEntry.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="myBlog.blogQuery()" >

	<mx:Style>
		Alert {
		titleStyleName: "alertTitle";
		messageStyleName: "alertMessage";
		}		  
		.alertTitle {
		fontSize: 12;
		}		  
		.alertMessage {
		fontSize: 12;
		}
	</mx:Style>
	
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;
			import mx.events.ListEvent;
			
			[Bindable]
			private var myArrayCollection:ArrayCollection;
			 
			private function queryResultHandler(evt:ResultEvent):void {
				myArrayCollection = evt.result as ArrayCollection;	
				myDataGrid.visible = true;
			}
			 
			private function faultHandler(evt:FaultEvent):void {
				mx.controls.Alert.show("오류발생:" + evt.fault.faultDetail)	
			}

			private function itemClickEvent(evt:ListEvent):void {				
			  if(evt.rowIndex >= 0) {
			     var url:URLRequest = new URLRequest("/blog/post.cfm/" + evt.currentTarget.selectedItem.name); 
 	             navigateToURL(url,'_blank');
			  }		
			}			
			
		]]>
	</mx:Script>

    <mx:RemoteObject id="myBlog" destination="ColdFusion" source="samples.railoflexblog.cfc.blogRemoteService" endpoint="http://www.nooree.com/flex2gateway" showBusyCursor="true">  
    	<mx:method name="blogQuery" result="queryResultHandler(event)" fault="faultHandler(event)"/>
    </mx:RemoteObject>

    <mx:DataGrid id="myDataGrid" dataProvider="{myArrayCollection}" visible="true" width="850" height="100%"  fontSize="12" itemClick="itemClickEvent(event)">
    	<mx:columns>
			<mx:DataGridColumn headerText="주소" dataField="name" width="300" />
			<mx:DataGridColumn headerText="제목" dataField="title" width="500" />
		</mx:columns>
    </mx:DataGrid>
	
</mx:Application>

 

source="samples.railoflexblog.cfc.blogRemoteService"의 부분은 CFC의 위치경로입니다. 위 예제에서 CFC의 위치는 웹루투/samples/railoflexblog/cfc/blogRemoteService.cfc 입니다.


About me

Categories

Monthly Archives

Links

Recent Posts

Recent Comments