'Enjoy'에 해당되는 글 177건
- 2008.12.24 아이팟터치 어플 참고 사이트 2
- 2008.12.13 A 3-state checkbox in a TreeItemRenderer
- 2008.11.28 [JSP&Servlet] web.xml
- 2008.11.27 [FLEX] css 스타일 테마 적용하기
- 2008.11.26 WoC 2008이 시작되었습니다~ 두둥
- 2008.11.21 [FLEX] Action Script <-> Java 변환 데이터 타입
- 2008.11.21 [FLEX] 커서 제어
- 2008.11.21 Flex Explorers
- 2008.11.18 이클립스를 사용해 아이폰 웹 애플리케이션 개발하기
- 2008.11.15 BEA WebLogic Server Tuning (Heap Size,JVM GC Parameter)
A 3-state checkbox in a TreeItemRenderer Enjoy/FLEX2008. 12. 13. 11:42
출처 : https://store1.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&postid=545&loc=en_US&productid=2
A 3-state checkbox in a TreeItemRenderer
Problem Summary
Trees are commonly used to represent file systems. Often the user needs to select several items within several folders and take an action (copy, delete, print, ...) on them, so, there needs to be some visual mechanism for indicating that a node is selected. A checkbox is typically used to represent selection. What we need is a tree of 3-state checkboxes.
Solution Summary
There are three main aspects to the solution: 1. A TreeItemRenderer is created to place a CheckBox control at each node in the tree. 2. An image of a tiny black box is painted on top of the CheckBox when the CheckBox is in the third state. 3. The underlying data model for the tree needs to contain an attribute representing the state of the CheckBox.
Explanation
Selection/de-selection of a parent node should cause children nodes to be selected/de-selected. In the case that a parent node has some children that are selected and some that are not selected, a simple 2-state check box won’t do - this third state (where some of the children of a node are selected and some are not) cannot be represented by the selected property of a check box, which is a Boolean.
The solution lies in the implementation of the TreeItemRenderer class. I have created an ActionScript class called CheckTreeRenderer for this purpose.
The first thing to do is override the createChildren method. This method is responsible for creating each node in the tree. Here we create a CheckBox and an Image.
override protected function createChildren():void { super.createChildren(); myCheckBox = new CheckBox(); myCheckBox.setStyle( "verticalAlign", "middle" ); myCheckBox.addEventListener( MouseEvent.CLICK, checkBoxToggleHandler ); addChild(myCheckBox); myImage = new Image(); myImage.source = inner; myImage.addEventListener( MouseEvent.CLICK, imageToggleHandler ); myImage.setStyle( "verticalAlign", "middle" ); addChild(myImage); }
Each child control, CheckBox and Image, needs to handle mouse clicks, so we create an EventListener for each:
private function checkBoxToggleHandler(event:MouseEvent):void { if (data) { var myListData:TreeListData = TreeListData(this.listData); var selectedNode:Object = myListData.item; var tree:Tree = Tree(myListData.owner); var toggle:Boolean = myCheckBox.selected; if (toggle) { toggleChildren(data, tree, STATE_CHECKED); } else { toggleChildren(data, tree, STATE_UNCHECKED); } var parent:Object = tree.getParentItem (data); toggleParents (parent, tree, getState (tree, parent)); } } private function imageToggleHandler(event:MouseEvent):void { myCheckBox.selected = !myCheckBox.selected; checkBoxToggleHandler(event); }
The handler for the Image control delegates handling most of the selection logic to the CheckBox handler. After all, the Image control is only for handling the third state.
For each node clicked, the CheckBox handler toggles the state of the node’s children and then it toggles the state of the node’s parent(s). The children can only be set to a CHECKED or UNCHECKED state whereas the parent(s) can be also set to the third state. This third state, called the SCHRODINGER state, occurs when some of the parent node’s children are CHECKED state, UNCHECKED state and/or in SCHRODINGER state.
The state that the parent will be set to is arrived at by looking at the state of its children. This is the job of the getState method:
private function getState(tree:Tree, parent:Object):String { var noChecks:int = 0; var noCats:int = 0; var noUnChecks:int = 0; if (parent != null) { var treeData:ITreeDataDescriptor = tree.dataDescriptor; var cursor:IViewCursor = treeData.getChildren(parent).createCursor(); while (!cursor.afterLast) { if (cursor.current.@state == STATE_CHECKED) { noChecks++; } else if (cursor.current.@state == STATE_UNCHECKED) { noUnChecks++ } else { noCats++; } cursor.moveNext(); } } if ((noChecks > 0 && noUnChecks > 0) || (noCats > 0)) { return STATE_SCHRODINGER; } else if (noChecks > 0) { return STATE_CHECKED; } else { return STATE_UNCHECKED; } }
The toggler code follows:
private function toggleParents (item:Object, tree:Tree, state:String):void { if (item == null) { return; } else { item.@state = state; toggleParents(tree.getParentItem(item), tree, getState (tree, tree.getParentItem(item))); } } private function toggleChildren (item:Object, tree:Tree, state:String):void { if (item == null) { return; } else { item.@state = state; var treeData:ITreeDataDescriptor = tree.dataDescriptor; if (treeData.hasChildren(item)) { var children:ICollectionView = treeData.getChildren (item); var cursor:IViewCursor = children.createCursor(); while (!cursor.afterLast) { toggleChildren(cursor.current, tree, state); cursor.moveNext(); } } } }
To actually set the state of a node, we override the property setter for data:
private function setCheckState (checkBox:CheckBox, value:Object, state:String):void { if (state == STATE_CHECKED) { checkBox.selected = true; } else if (state == STATE_UNCHECKED) { checkBox.selected = false; } else if (state == STATE_SCHRODINGER) { checkBox.selected = false; } } override public function set data(value:Object):void { super.data = value; var _tree:Tree = Tree(this.parent.parent); setCheckState (myCheckBox, value, value.@state); if(TreeListData(super.listData).item.@isBranch == 'true') { _tree.setStyle("defaultLeafIcon", null); } }
Finally, we paint the CheckBox and Image on the screen:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); if(super.data) { if (super.icon != null) { myCheckBox.x = super.icon.x; myCheckBox.y = 2; super.icon.x = myCheckBox.x + myCheckBox.width + 17; super.label.x = super.icon.x + super.icon.width + 3; } else { myCheckBox.x = super.label.x; myCheckBox.y = 2; super.label.x = myCheckBox.x + myCheckBox.width + 17; } if (data.@state == STATE_SCHRODINGER) { myImage.x = myCheckBox.x + 4; myImage.y = myCheckBox.y + 4; myImage.width = imageWidth; myImage.height = imageHeight; } else { myImage.x = 0; myImage.y = 0; myImage.width = 0; myImage.height = 0; } } }
I’ve included a sample application which makes use of the CheckTreeRenderer. Also, a PNG file is included for the Image. Hopefully, someone will make this code better. If so, please send me a copy. Thanks.
[JSP&Servlet] web.xml Enjoy/JSP2008. 11. 28. 11:12
[2008.08.04] XML 구성#
icon?
display-name?
description?
distributable?
context-param*
filter*
filter-mapping*
listener*
servlet*
servlet-mapping*
session-config?
mime-mapping*
welcome-file-list?
error-page*
taglib*
resource-env-ref*
resource-ref*
security-constraint*
login-config?
security-role*
env-entry*
ejb-ref*
ejb-local-ref*
<resource-ref>#
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mte</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<servlet>, <servlet-mapping>#
<servlet>
<servlet-name>pdmcis</servlet-name>
<servlet-class>com.mococo.trace.PDMCISServlet</servlet-class>
<init-param>
<param-name>properties</param-name>
<param-value>/WEB-INF/conf/velocity.properties</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>pdmcis</servlet-name>
<url-pattern>/pdmcis/*</url-pattern>
</servlet-mapping>
<error-page>#
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ErrorMsg.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/ErrorMsg.jsp</location>
</error-page>
<session-config>#
<session-config>
<session-timeout>20</session-timeout>
</session-config>
[FLEX] css 스타일 테마 적용하기 Enjoy/FLEX2008. 11. 27. 20:36
WoC 2008이 시작되었습니다~ 두둥 Enjoy/etc2008. 11. 26. 11:34
[FLEX] Action Script <-> Java 변환 데이터 타입 Enjoy/FLEX2008. 11. 21. 13:05
[FLEX] 커서 제어 Enjoy/FLEX2008. 11. 21. 11:42
출처 : http://www.adobe.com/kr/devnet/flex/quickstart/controlling_the_cursor/
Flex 빠른 시작 가이드: 간단한 유저 인터페이스 구축
목차
커서 제어
Adobe® Flex™ Cursor Manager를 사용하면 Flex 어플리케이션에서 커서 이미지를 제어할 수 있습니다. 예를 들어 프로세스 처리가 완료될 때까지 사용자가 기다려야 하는 프로세스를 수행하는 어플리케이션의 경우 대기 기간을 반영할 수 있도록 커서를 모래 시계와 같은 사용자 정의 커서 이미지로 변경할 수 있습니다.
또한 커서를 변경하여 사용자에게 피드백을 제공함으로써 사용자가 수행할 수 있는 동작을 나타낼 수 있습니다. 예를 들어 사용자가 입력할 수 있음을 나타내는 커서 이미지를 사용하거나 사용자가 입력할 수 없음을 나타내는 커서 이미지를 사용할 수 있습니다.
CursorManager 클래스는 커서의 우선 순위별 목록을 제어하는 데, 가장 높은 우선 순위를 갖는 커서가 보이게 됩니다. 커서 목록에 동일한 우선 순위를 갖는 하나 이상의 커서가 포함되어 있는 경우 Cursor Manager는 가장 최근에 생성된 커서를 표시합니다.
작업 수행 중인 기본 커서 사용
Flex는 어플리케이션이 처리 중인 상태를 나타내거나 어플리케이션이 사용자 입력에 응답하기 전에 처리 과정이 완료될 때까지 사용자가 기다려야 하는 상태를 나타내는 데 사용할 수 있는 작업 수행 중인 기본 커서를 정의합니다. 작업 수행 중인 기본 커서는 시계 모양의 애니메이션입니다.
다음과 같이 여러 가지 방법으로 작업 수행 중인 커서를 제어할 수 있습니다.
- CursorManager 메서드를 사용하면 작업 수행 중인 커서를 설정하거나 제거할 수 있습니다.
- SWFLoader, WebService, HttpService, RemoteObject 클래스의
showBusyCursor
속성을 사용하면 작업 수행 중인 커서를 자동으로 표시할 수 있습니다.
다음 예제에서는 CursorManager 클래스의 정적 setBusyCursor()
및 removeBusyCursor()
메서드를 사용하여 토글 버튼의 상태에 따라 작업 수행 중인 Flex 기본 커서를 표시하거나 숨깁니다.
예제
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="src/CursorDefaultBusy/index.html" width="400" height="160" > <mx:Script> <![CDATA[ import mx.controls.Button; import mx.managers.CursorManager; import flash.events.*; private const ON_MESSAGE:String = "Busy Cursor ON"; private const OFF_MESSAGE:String = "Busy Cursor OFF"; private function busyCursorButtonHandler(event:MouseEvent):void { var toggleButton:Button = event.target as Button; if (toggleButton.selected) { CursorManager.setBusyCursor(); toggleButton.label = ON_MESSAGE; } else { CursorManager.removeBusyCursor(); toggleButton.label = OFF_MESSAGE; } } ]]> </mx:Script> <mx:Panel paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10" horizontalAlign="center" verticalAlign="middle" title="Default busy cursor" > <!-- Toggle button turns default busy cursor on and off. --> <mx:Button label="{OFF_MESSAGE}" toggle="true" click="busyCursorButtonHandler(event);" /> <mx:Text text="Click the button to display or hide the busy cursor."/> </mx:Panel> </mx:Application>
결과
전체 소스를 보려면 Flex 어플리케이션을 마우스 오른쪽 버튼으로 클릭한 다음 컨텍스트 메뉴에서 View Source를 선택합니다.
사용자 정의 커서 사용
JPEG, GIF, PNG 또는 SVG 이미지, Sprite 객체 또는 SWF 파일을 커서 이미지로 사용할 수 있습니다.
Cursor Manager를 사용하려면 mx.managers.CursorManager
클래스를 어플리케이션으로 가져온 다음 해당 속성과 메서드를 참조합니다.
다음 예제에서는 Adobe Flash에서 만든 모래 시계 SWF 애니메이션을 임베드하여 사용자 정의 커서로 사용합니다. 예제에서 CursorManager 클래스의 setCursor()
정적 메서드를 호출한 다음 사용자 정의 커서로 사용할 임베드된 에셋의 클래스로 참조로 전달하여 사용자 정의 커서를 만듭니다. CursorManager 클래스의 removeCursor()
정적 메서드를 호출한 다음 CursorManager 클래스의 currentCursorID
정적 속성으로 전달하여 사용 중인 사용자 정의 커서를 제거할 수 있습니다.
예제
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="src/CursorCustom/index.html" width="400" height="160" > <mx:Script> <![CDATA[ import mx.controls.Button; import mx.managers.CursorManager; import flash.events.*; // Embed the SWF that will be used as // the custom cursor. [Embed(source="assets/hourglass.swf")] public var HourGlassAnimation:Class; private const ON_MESSAGE:String = "Custom Cursor ON"; private const OFF_MESSAGE:String = "Custom Cursor OFF"; private function busyCursorButtonHandler(event:MouseEvent):void { var toggleButton:Button = event.target as Button; if (toggleButton.selected) { // The setCursor() method returns a numeric ID for // the cursor being set. You can store and use this // ID later in a removeCursor() call, or, you can // use the static currentCursorID property of the // CursorManager class to achieve the same result. CursorManager.setCursor(HourGlassAnimation); toggleButton.label = ON_MESSAGE; } else { CursorManager.removeCursor(CursorManager.currentCursorID); toggleButton.label = OFF_MESSAGE; } } ]]> </mx:Script> <mx:Panel paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10" horizontalAlign="center" verticalAlign="middle" title="Custom cursor" > <!-- Toggle button turns the custom cursor on and off. --> <mx:Button label="{OFF_MESSAGE}" toggle="true" click="busyCursorButtonHandler(event);" /> <mx:Text text="Click the button to display or hide the custom cursor."/> </mx:Panel> </mx:Application>
결과
전체 소스를 보려면 Flex 어플리케이션을 마우스 오른쪽 버튼으로 클릭한 다음 컨텍스트 메뉴에서 View Source를 선택합니다.
추가 정보
툴팁에 대한 자세한 내용은 Flex 2 Developer's Guide*의 "Using the Cursor Manager"를 참조하십시오.
저자 소개
배우 겸 가수로도 활동하고 있는 Aral Balkan은 개발 팀을 이끌고 사용자 경험을 디자인하고 리치 인터넷 어플리케이션을 설계하며, 런던 Macromedia 사용자 그룹인 OSFlash.org와 자신의 회사인 Ariaware를 경영하고 있습니다. 디자인 패턴에 대한 의견을 교환하고 책 저술과 잡지에 기고하는 일을 즐기며, Flash Platform용 개방형 소스 RIA 프레임워크인 Arp를 만든 사람이기도 합니다. Aral은 대체로 자기 주장이 상당히 강한 편이며, 활기차고 열정적입니다. 웃는 것을 좋아하고 껌을 씹으며 길을 걷기도 합니다.
Flex Explorers Enjoy/FLEX2008. 11. 21. 10:43
이클립스를 사용해 아이폰 웹 애플리케이션 개발하기 Enjoy/사과2008. 11. 18. 19:34
출처 : http://www.ibm.com/developerworks/kr/library/os-eclipse-iphone/index.html
이클립스를 사용해 아이폰 웹 애플리케이션 개발하기 (한글)Aptana의 아이폰 개발 플러그인과 iUi 프레임워크를 사용해 아이폰 웹 애플리케이션 만들기 |
난이도 : 중급 Adam Houghton, 선임 소프트웨어 개발자, SAS Institute, Inc. 2008 년 3 월 04 일 이클립스, Aptana의 플러그인 그리고 iUi 프레임워크를 사용해 아이폰 웹 사이트를 만드는 방법을 배웁니다. 아이폰에서 사용할 수 있는 Javadoc 뷰어 개발 과정을 통해 사용자 인터페이스 디자인를 위한 팁을 살펴보고 아이폰 개발의 미래에 들어보겠습니다. 애플(Apple)의 아이폰(iPhone) 플랫폼은 개발자들에게 흥미로운 기회를 제공하고 있다. 소형 데스크톱과 터치스크린으로 아이폰과 아이팟 터치(iPod Touch)는 짧은 기간에 100만 명이 넘는 사용자들을 가지게 되었다. 하지만 이런 고품격 디자인과 사유화된(proprietary) 플랫폼은 애플리케이션 개발자들에게 새로운 종류의 도전을 만들어 내고 있다. 애플이 소프트웨어 개발 키트(SDK)를 배포할 때까지는, 아이폰 플랫폼을 목표로 하는 개발자들은 아이폰의 룩앤필(look and feel)을 따르는 웹 애플리케이션을 만들어야만 한다. 운이 좋게도 그 일을 쉽게 할 수 있는 새로운 오픈 소스 도구들을 사용할 수 있다. Aptana의 이클립스용 아이폰 개발 플러그인은 아이폰에 특화된 프로젝트를 생성하고 회전시켜 볼 수 있는 미리 보기 화면을 제공한다. Joe Hewitt의 iUi는 CSS와 자바스크립트 프레임워크인데 아이폰 스타일의 위젯과 페이지를 가지고 있다. 본 기사에서는, Apatana와 iUi를 사용해 새로운 애플리케이션을 만들 것이다. 바로 아이폰에서 사용할 수 있는 간단한 자바독(Javadoc) 뷰어다. 먼저 아이폰에서 자바독을 브라우징할 수 있는 사용자 인터페이스(UI)를 만들겠다. 그런 다음 소스 코드에서 자바독 페이지를 만들어 내는 커스텀 doclet을 만든다. 그 뒤를 이어 아이폰을 목표로 했을 때 생기는 UI 문제를 살펴보고 이 오픈 소스 도구들을 사용해 개발과 디버깅을 간단하게 할 수 있는지, 그리고 앞으로의 아이폰 개발 방향에 대해 설명하겠다. Aptana를 설치하고 iUi를 다운로드하는 것부터 시작한다.
모든 준비가 끝났다면, 이클립스를 사용해 그림 1에 보이는 것처럼 iDoc이라는 새로운 아이폰 프로젝트를 생성한다. 그림 1. 새로운 아이폰 프로젝트 만들기 그림 2는 간단한 아이폰 애플리케이션을 담고 있는 프로젝트를 보여준다. 그림 2. 이클립스에 생성된 아이폰 프로젝트 HTML, CSS, 그리고 자바스크립트를 지원하는 Aptana의 기본 편집기가 제공하는 문법 하이라이팅을 확인할 수 있다. 텍스트 편집기 아래 부분에 Source, iPhone Preview, 그리고 시스템에 설치된 각종 브라우저(예를 들어 Safari Preview, Firefox Preview) 탭들을 볼 수 있다. iPhone Preview를 클릭하여 아이폰에서 보이는 샘플 애플리케이션을 보자. 폰을 돌리려면 브라우저의 바깥을 클릭하고, 네비게이션 막대를 숨기려면 폰 제목을 클릭하라. 가로로 보는 아이폰 미리보기 모드는 아래와 같다. 그림 3. 아이폰 미리보기 모드에서 가로 보기 아이폰 미리보기 모드는 시간을 매우 많이 절약할 수 있게 하는 장치다. 새로운 디자인 아이디어를 빠르게 테스트할 수 있고 컴퓨터에서 벗어나지 않고도 점진적으로 개발할 수 있다. 애플리케이션을 실제 아이폰에서 테스트해야 할 때가 오면, Aptana에 내장된 애플리케이션 서버가 매우 유용할 것이다. 이클립스 툴바에 있는 Run 아이콘을 클릭하여 서버를 실행한다. 그림 4는 이클립스에서 동작하는 애플리케이션 서버를 보여준다. 그림 4. Aptana의 아이폰 애플리케이션 서버가 페이지를 호스트하고 그 URL을 가지고 있는 email을 생성한다. 만약 아이폰이 와이파이(WiFi) 연결을 통해 로컬 네트워크에 연결되어 있다면, 서버 창에 보이는 URL에 접속할 수 있다. E-mail this url을 클릭하여 한 단계를 생략하고 여러분 아이폰에 있는 이메일 계정으로 메시지를 보낼 수 있다. 이메일에 있는 링크를 탭(화면을 툭 치는 것)하면, 아이폰의 웹 브라우저에서 애플리케이션을 실행한다. Aptana의 기본 애플리케이션이 아이폰에 특화된 HTML과 CSS를 포함하고 있더라도 그 기능은 매우 제한적이다. 좀 더 나은 대안책은 iUi 프레임워크다. iUi는 다양한 아이폰 인터페이스 스타일의 커스텀 위젯과 자바스크립트 효과를 가지고 있다. 다운로드한 iUi 파일 iui-0.13.tar의 압축을 풀고, 파일을 이클립스에 있는 iDoc 프로젝트로 복사한다. 그림 5는 iUi를 가지고 있는 프로젝트를 보여준다. 그림 5. iUi 프레임워크와 예제 프로젝트가 들어 있는 iDoc 프로젝트 iUi를 사용한 데모 웹 애플리케이션은 위에서 펼쳐진 샘플 폴더에서 찾을 수 있다. 음악 브라우저, 극장 목록 그리고 Digg와 비슷한 사이트를 포함하고 있다. Aptana의 아이폰 미리보기 모드를 사용해 이클립스에서 그것들을 확인할 수 있다. 그림 6은 극장 목록 웹 애플리케이션(samples/theaters/index.html)의 검색 페이지를 보여준다. 그림 6. iUi의 예제 극장 목록 웹 애플리케이션 진짜 아이폰의 룩앤필과 얼마나 비슷한지 보기 바란다. 이렇게 미리 만들어둔 위젯은 아이폰 웹 애플리케이션을 빠르게 개발할 수 있도록 해준다.
이번 예제에서는 iDoc이라는 자바독 뷰어를 만들 것이다. 썬(Sun Microsystems)의 표준 자바독 생성기에 의해 만들어진 방대한 양의 HTML 문서들을 데스크톱에서는 잘 볼 수 있다. 하지만 아이폰에서 읽고 네비게이션하기에는 불편하다. iDoc은 아이폰에 적합한 자바독을 생성한다. — 지하철이나 짝 프로그래밍 팀에서 관찰자가 도움을 줄 수 있도록 하기에 완벽한 브라우징 애플리케이션 프로그램 인터페이스(API)를 제공할 것이다. iDoc에 필요한 UI를 디자인하기 전에 아이폰 개발과 일반적인 웹 애플리케이션의 다른 점을 이해하는 것이 중요하다. 애플의 iPhone Dev Center(참고자료 참조)에서 인용한 그림 7을 보면 이를 매우 멋지게 요약했다. 손가락은 마우스가 아니다. 데스크톱에서 볼 수 있는 픽셀 선택을 없애고 그 대신 탭(툭 치는 것), 플릭(화면을 가볍고 빠르게 휙 스치는 모션) 그리고 핀치(두 손가락으로 화면을 꼬집는 듯한 모션)와 같은 풍부한 사용자 상호작용 모델을 사용했다. 게다가 아이폰은 사용자가 들고 다니면서 시급한 상황에서 자주 쓰기 때문에 애플리케이션에서 원하는 정보를 빠르고 쉽게 제공할 필요가 있다. 그림 7. 손가락은 마우스가 아니다. 애플의 iPhone Human Interface Guidelines(참고자료 참조)는 아이폰 웹 컨텐츠의 세 가지 타입을 정의하고 있다.
표준 자바독 페이지는 첫 번째 범주에 해당된다. 아이폰에 있는 사파리와 호환되는 형태다. 정확하게 보이긴 하지만 관련된 정보를 찾으려면 핀칭과 플릭을 매우 잘 해야 한다. iDoc은 완전한 아이폰 애플리케이션을 목표로 하고 있다. 비록 다른 서비스와 연동할 일은 없지만 iDoc의 인터페이스는 마치 아이폰 애플리케이션처럼 느껴질 것이다. 아이폰을 목표로 할 때는 포커스를 유지하는 것이 중요하다. 애플리케이션은 특정 작업을 빠르게 수행해야 한다. 모든 가용한 기능을 포함시키려고 하면 안 된다. iDoc에서 사용자들은 클래스 이름, 메서드 이름, 메서드 시그너처 그리고 주석 등과 같은 자바 클래스에 대한 기본 정보를 찾아내야 한다. 이런 정보를 목적지인 구체적인 페이지로 안내하는 세 개로 나눈 네비게이션을 통해 제공할 것이다.
iDoc을 산만하지 않고 태스크에 집중된 상태로 유지하기 위해 기존의 자바독 기능을 몇 가지 제거했다. 예를 들어 패지키 설명 주석은 보여주지 않는다. 이것들은 대개 정보가 유익하지 않거나(예를 들어 acme.client에는 클라이언트 코드가 들어 있다.) 보통 존재하지 않으므로 그것들을 iDoc에서 빼고 인터페이스를 간단하게 만드는 것이 더 나은 선택이다. 세 부분으로 나눈 네비게이션을 위해 edge-to-edge 리스트를 사용한다. 이것은 전형적인 아이폰 애플리케이션에 익숙한 구조로 연락처, 이메일 그리고 음악을 브라우징할 때 사용된다. Edge-to-edge 리스트는 아이템을 44픽셀 높이의 같은 크기로 보여준다. 그리고 많은 양의 정보를 스크롤할 때 유용하다. 애플의 iPhone Human Interface Guidelines는 글꼴, 글자 크기 그리고 경계선 공간 수치를 제공한다. iUi 프레임워크는 CSS와 자바스크립트 언어로 이러한 수치에 맞게 구현해두었다. 따라서 아이폰 컴포넌트처럼 보이는 HTML 목록을 간단하게 만들 수 있다. Listing 1은 페이지 헤더와 java.applet과 java.rmi 패키지의 첫 번째 2단계 네비게이션을 보여준다. Listing 1. 페이지 헤더와 첫 번째 2단계 네비게이션 HTML 문서
그림 8은 edge-to-edge 리스트를 사용하여 패키지를 선택할 수 있는 최상위 레벨 네비게이션을 보여준다. 그림 8. 진짜 아이폰 애플리케이션처럼 자바독 패지키 네비게이션하기 그림 9는 아이폰 미리보기 모드로 java.rmi 패지키의 결과를 보여준다. 그림 9. Java.rmi 패키지에 있는 인터페이스, 클래스, 예외 네비게이션하기 iDoc의 세부 페이지에서는 아이폰의 또 다른 구조를 사용한다. 바로 둥근 사각형 리스트다. 이 리스트는 정보를 그룹핑할 때 유용한데 아이폰의 설정 창에서 볼 수 있다. 둥근 사각형 리스트를 사용해 메서드 시그너처와 매개변수 목록 그리고 예외를 구분할 것이다. V0.13에서 iUi는 둥근 사각형 리스트를 오직 폼 입력 용도로만 사용하도록 지원하고 있다. 따라서 정적인 텍스트를 출력할 때 이들 엘리먼트를 그냥 사용하면 틀에 맞지 않은 블록을 만들어 낸다. 그것들의 CSS를 확장하여 (Listing 2에 보이는) iDoc.css 파일을 만들고 정적인 텍스트를 둥근 사각형 리스트로 보여줄 Listing 2. 정적인 텍스트를 정확하게 보여주기 위한 커스텀 textRow CSS 확장
Listing 3은 Listing 3. textRow 엘리먼트를 사용한 세부 페이지 HTML
그림 10. java.math.BigDecimal의 생성자 자세히 보기 화면 3단계 네비게이션과 세부 페이지 UI를 모두 끝냈다. iDoc은 사용자들이 특정 작업에 집중할 수 있게 해준다. iUi 프레임워크의 도움과 약간의 커스텀 CSS를 사용해 마치 진짜 아이폰 애플리케이션처럼 보이게 만들었다.
자, UI 디자인을 만들었고 이제 HTML 파일을 생성하는 코드를 만들어야 한다. 썬의 iDoc은 간단하게 패키지와 클래스를 순회하며 위에서 만든 형식대로 정적인 HTML 페이지를 출력하기 위한 메서드를 호출한다. Listing 4는 최종 세부 페이지를 출력하기 위한 메서드다. Listing 4. 세부 페이지를 출력하기 위한 Doclet 코드
이 코드는 일반화된 메서드인데
Aptana의 아이폰 미리보기 모드는 결과 파일에 대한 디버깅에 도움을 준다. 각 주기마다 빠른 클릭을 통해 설계했던 인터페이스와의 불일치를 찾아낼 수 있다. 하지만 미리보기 모드를 사용하는 것은 성능 문제를 일으킬지도 모른다. 대부분의 컴퓨터들은 아이폰의 620MHz ARM 프로세서보다 세 배 내지 다섯 배 정도 빠르다. 또한 사용자들은 느린 휴대폰 네트워크를 통해 페이지를 다운로드할 것이다. 따라서 자신의 애플리케이션을 실제 아이폰에서 동작시켜 보는 것이 중요하다. 아이폰에서 iDoc을 시험해본 결과 매우 덩치 큰 HTML 파일을 출력할 때 흔들리는 듯한 화면과 성능 저하를 발견했다. 이것을 수정하기 위해 패키지와 클래스 이름을 네비게이션하는 메인 파일을 하나 만들고 별도의 파일로 각각의 클래스의 주석, 메서드에 대한 자세한 정보를 보여주는 페이지들을 만들었다(Listing 5). 비록 이런 과정을 통해 여러 개의 파일을 만들어 내게 되었지만, 각각의 파일 크기가 작기 때문에 애플리케이션이 매우 부드럽게 동작하게 되었다. Listing 5. 각각의 패키지를 순회하는 Doclet 코드와 각각의 클래스마다 별도의 파일 만들기
성능 향상을 통해 iDoc은 이제 출시될 준비가 끝났다. OpenJDK에 있는 java.*와 javax.*에 있는 51개 패키지와 1304개 클래스에 대한 자바독을 만들, 모든 것을 웹 서버로 업로드한다. 16MB가 넘는 크기의 파일이지만 주요 네비게이션 페이지는 단지 112KB에 불과하며 각각의 클래스 자세히 보기 페이지는 평균적으로 13KB다. EDGE 네트워크를 사용하더라도 애플리케이션은 매우 잘 응답한다. 아이폰이 있다면 iDoc 사이트(참고자료 참조)에 접속해 보거나 iDoc을 다운로드하여 아이폰을 위한 자바독을 생성할 수 있다. 그림 11은 최종 애플리케이션을 보여준다. 그림 11. 아이폰을 위해 준비된 51개의 패키지 자바독 iDoc의 잠재적인 확장기능으로는 자바 5 제네릭과 자바독 주석에 포함된 페이지 사이의 링크를 위한 태그를 더 잘 파악하는 것이다. iDoc의 기능 추가에 관심이 있다면 모든 소스 코드는 온라인에서 받을 수 있다(참고자료 참조).
2007년 10월 Steve Jobs는 애플이 아이폰 SDK를 2008년 2월에 공개할 것을 발표했다. 글을 쓰고 있는 시점이 2007년 12월이기 때문에 아직 구체적인 것은 미지수이지만 SDK를 통해 사파리의 도움 없이 아이폰 바로 위에서 동작하는 애플리케이션을 작성할 수 있게 될 것이다. 아이폰 아키텍처 기반을 얻는 것은 Mac OS X과 비슷하게 개발 플랫폼이 코코아(Cocoa)와 오브젝티브-C가 된다는 것이다. 최근 소식에 의하면 애플의 한 중역은 서드파티 애플리케이션이 몇 가지 인증 절차를 거치도록 하는 것을 제안하기도 했다. 발전된 애니메이션, 그래픽 그리고 네트워크 접속을 사용하는 애플리케이션이 네이티브로 동작할 수 있는 이점을 얻을 것이다. 하지만 SDK가 배포되더라도 아이폰을 위한 웹 개발은 여전히 매력적인 위치에 있을 것이다. 웹 애플리케이션은 쉽게 만들고 간단하게 배포할 수 있다. Aptana와 iUi 같은 도구는 개발을 간편하게 해주며 웹 애플리케이션을 빨리 만들 수 있도록 해준다. iDoc을 통해 보았듯이 SDK를 기다릴 필요도 없다. 오늘 배운 도구를 사용해 아이폰 기능을 완전히 사용하며 진짜 같은 룩앤필을 가진 웹 애플리케이션을 만들 수 있다. 교육
제품 및 기술 얻기
토론
|
BEA WebLogic Server Tuning (Heap Size,JVM GC Parameter) Enjoy/etc2008. 11. 15. 13:12
출처 : http://docs.sun.com/app/docs/doc/819-4673/gbpxu?l=ko&a=view
BEA WebLogic Server
Consider making the following changes:
JVM GC Parameter
For BEA WebLogic Server 8.1 SP4, to avoid the java.lang.OutofMemoryError reported by the WebLogic JVM 1.4.2_05, add the following JVM GC (garbage collection) parameter in the startWebLogic.sh JAVA_OPTIONS:
-XX:-CMSParallelRemarkEnabled
Set this parameter in addition to the other heap size and GC parameters that have been added for JVM 1.4.2 for Application Server 8.1 and Web Server 6.1.
For example, if Access Manager is installed in the default user_projects location (/usr/local/bea/user_projects/domains/mydomain/startWebLogic.sh):
JAVA_OPTIONS="-XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCTimeStamps -Xloggc:/usr/local/bea/user_projects/domains/mydomain/myserver/gc.log"
If you use WebLogic 9.x with Sun JVM 1.5 or later, then some of the GC algorithms can be safely removed. The following is a list of JVM options that can be used with Sun JVM 1.5 or later.
-XX:NewSize=336M -XX:MaxNewSize=336M -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintClassHistogram -XX:+PrintGCTimeStamps -Xloggc:/opt/WebSphere/AppServer/logs/server1/gc.log -XX:-CMSParallelRemarkEnabled
Heap Size
Modify the commonEnv.sh script in the /usr/local/bea/weblogic81/common/bin directory for heap size increases in the section where $PRODUCTION_MODE" = "true" (which should be set to true, before running Access Manager in /usr/local/bea/user_projects/domains/mydomain/startWebLogic.sh):
# Set up JVM options base on value of JAVA_VENDOR if [ "$PRODUCTION_MODE" = "true" ]; then case $JAVA_VENDOR in BEA) JAVA_VM=-jrockit MEM_ARGS="-Xms128m -Xmx256m" ;; HP) JAVA_VM=-server MEM_ARGS="-Xms32m -Xmx200m -XX:MaxPermSize=128m" ;; IBM) JAVA_VM= MEM_ARGS="-Xms32m -Xmx200m" ;; Sun) JAVA_VM=-server MEM_ARGS="-Xms2688M -Xmx2688M -XX:NewSize=336M -XX:MaxNewSize=336M" # MEM_ARGS="-Xms32m -Xmx200m -XX:MaxPermSize=128m"
Execute Queue Thread Count
Set the Execute Queue Thread count to be more than the number of CPUs. For example, consider using a value that is twice the number of CPUs. Set this value in either the console or in the /usr/local/bea/user_projects/domains/mydomain/config.xml file:
<ExecuteQueueName="MyExecute Queue" ThreadCount="8" ThreadsIncrease="4"/>
For more information, see “Modifying the Default Thread Count” in “WebLogic Server Performance and Tuning” at:
http://e-docs.bea.com/wls/docs81/perform/WLSTuning.html#1142218
Connection Backlog Buffering
A guideline for setting Connection Backlog Buffering is 8192 for a server with 4 Gbytes of physical memory (which is equivalent to the ConnectionQueue size tuning set in the Sun Java System Web Server 6.1 magnus.conf file).
For more information, see “Tuning Connection Backlog Buffering” in the “WebLogic Server Performance and Tuning” document at:
http://e-docs.bea.com/wls/docs81/perform/WLSTuning.html#1136287