그동안 손을 대지 않았던 Mac book을 오래 간만에 손을 대었다.  집에 새로 설치한 3TB짜리 NAS를 이용하기 싶은데, 갑자기 어떻게 이용해야 할지 생각이 나지 않아서 또 이리저리 열어보고 만져보다가 겨우 찾아 내었다. 아니 이렇게 고민할 필요는 없었는데 필요 이상의 시간을 낭비했다.

이를 연결하는 것은 의외로 너무나 간단하다.
Finder를 열고, 아래 이미지의 왼쪽 중간에 보이는 "공유"라는 항목을 클릭을 하면 네트워크 상으로 연결되어져 있는 PC들이 보이게 된다. 나의 경우는 최근에 구매한 노트북 한대와 NAS가 보여지는데, 연결하고자 하는 기기를 선택하고, 사용자 인증을 거치면 공유 폴더들이 보여지게 된다.
사용하는 방법은 윈도의 공유 폴더의 이용 방법과 동일하다. 보안을 위해서 계정과 암호는 반드시 설정하는 것이 좋다.  

'Tip & Tips' 카테고리의 다른 글

Mac에서 Windows 공유 폴더 연결하기  (0) 2011.01.17
PNG File 에 대한 간략 정리  (0) 2009.09.07
Twitter API 사용하기  (1) 2009.07.18
INTEL 칩셋 패치 유틸리티 v9.0.0.1012  (0) 2009.01.29
Posted by 행복상자
내가 Virtual Box를 블로그를 통해서 소개한지 꽤 오랜 시간이 지났다.
가상화와 관련된 제품들이 많이 나오고, 또 앞으로도 유용하게 사용될 것이라는 점에 대해서는 크게 의심하지 않는 바이다.

내가 이 제품에 대해서 관심을 갖게 된 이유로는 무료로 사용할 수 있으면서도 기능과 버전이 빠르게 올라갈 만큼 사용자가 원하는 기능들을 지속적으로 개발해 나가고 있었기 때문이다. 더군다나 메뉴와 도움말을 한글로 지원하기까지 했다.

이 제품은 원래는 Sun에서 개발하던 제품이었는데, 오라클로 합병하면서 오라클에서 제공하던 오라클 VM 서버 제품군과 중복이 되어서, 추가 개발이 이루어 지지 않을지 걱정했었다. 선과 오라클과의 합병은 개인적으로는 별로 바람직한 방향이 아니고, 단지 비즈니스적으로 주도권을 유지하는 측면으로만 진행될거라 예상했고, 실제로 이러한 우려와 예측은 틀리지 않았다.

이러한 와중에서 며칠전, 지난 12월 22일자로 Virtual Box의 새로운 버전인 4.0 버전이 Release 된것은 굉장히 놀라운 소식이었다.

4.0 버전으로 릴리스 하면서, 추가된 기능과  변경되 몇가지 주요 Feature들은 다음과 같다.

1) File Location 
   - VirtualBox의 Configuration 파일들과 disk 이미지 파일들이 다른 위치(폴더)에서
      관리되었으  나, 4.0에서는 동일한 디렉토리에 저장된다.
   - 기본 Configuration 파일의 확장자가 XML로 관리되었는데, 4.0 에서는 vbox로 변경되었다.
      그러나 내용은 이전과 동일하다.
   - 기본 저장 위치도 이전에는 .VirtualBox 였으나, VirtualBox VMs로 바뀌게 되었다.
      (윈도우즈 계열 OS의 사용자 Profile 디렉토리 아래 저장)
2) User Interface 변경
   - Virtual Machine 설정 화면이 좀더 사용성 있게 바뀌었고 실행되고 있는 또는 저장되어 있는
     이미지에 대한 Preveiw 기능이 들어갔다.
3) 아이콘을 통한 VM 이미지 실행하기
   - 실행을 하기 원하는 OS의 이미지를 바탕화면에서 실행할 수 있도록 아이콘을 생성해 준다.
4) Virtua 이미지 쉽게 삭제하기
   - 이지미 삭제시, 이와 관련된 이미자와 Confituration 파일들을 클릭 한번에 모두 삭제해 준다.
5) 네크워크 Boot와 가상 H/W 칩셋 설정하기
   - 네트워크 Booting을 지원하며, H/W에 대한 칩셋 종류에 대해서 설정 가능하다.
6) 더 많은 Host OS의 메모리의 할 당이 가능하다.
   - 초기의 VirtualBox 버전들에서는 1.5Gbyte 이상의 메모리 할당이 어려웠으나, 4.0에서는
     그 이상의 할당이 가능하다. 만약 32bit OS의 윈도우 7에서 할당한다면, 3Gbyte까지 가능.
7) Open Virtualization Format Archive (OVA) 지원
   - OVA 파일 포맷으로 Import/Export 가 가능하다. VmWare에서 생성한 파일의 사용 가능함.

그리고, 아래는 이번에 Release 된 VirualBox 4.0의 릴리즈 로그이다. 더 많은 변경 사항들은 아래 로그를
확인할 수 있다.

VirtualBox 4.0.0 (released 2010-12-22)

This version is a major update. The following major new features were added:

  • Reorganization of VirtualBox into a base package and Extension Packs; see chapter 1.5, Installing VirtualBox and extension packs, see the manual for more information
  • New settings/disk file layout for VM portability; see chapter 10.1, Where VirtualBox stores its files, see the manual for more information
  • Major rework of the GUI (now called “VirtualBox Manager”):
    • Redesigned user interface with guest window preview (also for screenshots)
    • New “scale” display mode with scaled guest display; see chapter 1.8.5, Resizing the machine’s window, see the manual for more information
    • Support for creating and starting .vbox desktop shortcuts (bug #1889)
    • The VM list is now sortable
    • Machines can now be deleted easily without a trace including snapshots and saved states, and optionally including attached disk images (bug #5511; also, VBoxManage unregistervm --delete can do the same now)
    • Built-in creation of desktop file shortcuts to start VMs on double click (bug #2322)
  • VMM: support more than 1.5/2 GB guest RAM on 32-bit hosts
  • New virtual hardware:
    • Intel ICH9 chipset with three PCI buses, PCI Express and Message Signaled Interrupts (MSI); see chapter 3.4.1, “Motherboard” tab, see the manual for more information
    • Intel HD Audio, for better support of modern guest operating systems (e.g. 64-bit Windows; bug #2785)
  • Improvements to OVF support (see chapter 1.12, Importing and exporting virtual machines, see the manual for more information):
    • Open Virtualization Format Archive (OVA) support
    • Significant performance improvements during export and import
    • Creation of the manifest file on export is optional now
    • Imported disks can have formats other than VMDK
  • Resource control: added support for limiting a VM’s CPU time and IO bandwidth; see chapter 5.8, Limiting bandwidth for disk images, see the manual for more information
  • Storage: support asynchronous I/O for iSCSI, VMDK, VHD and Parallels images
  • Storage: support for resizing VDI and VHD images; see chapter 8.21, VBoxManage modifyhd, see the manual for more information.
  • Guest Additions: support for multiple virtual screens in Linux and Solaris guests using X.Org server 1.3 and later
  • Language bindings: uniform Java bindings for both local (COM/XPCOM) and remote (SOAP) invocation APIs

In addition, the following items were fixed and/or added:

  • VMM: Enable large page support by default on 64-bit hosts (applies to nested paging only)
  • VMM: fixed guru meditation when running Minix (VT-x only; bug #6557)
  • VMM: fixed crash under certain circumstances (Linux hosts only, non VT-x/AMD-V mode only; bugs #4529 and #7819)
  • GUI: add configuration dialog for port forwarding in NAT mode (bug #1657)
  • GUI: show the guest window content on save and restore
  • GUI: certain GUI warnings don’t stop the VM output anymore
  • GUI: fixed black fullscreen minitoolbar on KDE4 hosts (Linux hosts only; bug #5449)
  • BIOS: implemented multi-sector reading to speed up booting of certain guests (e.g. Solaris)
  • Bridged networking: improved throughput by filtering out outgoing packets intended for the host before they reach the physical network (Linux hosts only; bug #7792)
  • 3D support: allow use of CR_SYSTEM_GL_PATH again (bug #6864)
  • 3D support: fixed various clipping/visibility issues (bugs #5659, #5794, #5848, #6018, #6187, #6570)
  • 3D support: guest application stack corruption when using glGetVertexAttrib[ifd]v (bug #7395)
  • 3D support: fixed OpenGL support for libMesa 7.9
  • 3D support: fixed Unity/Compiz crashes on natty
  • 2D Video acceleration: multimonitor support
  • VRDP: fixed rare crash in multimonitor configuration
  • VRDP: support for upstream audio
  • Display: fixed occasional guest resize crash
  • NAT: port forwarding rules can be applied at runtime
  • SATA: allow to attach CD/DVD-ROM drives including passthrough (bug #7058)
  • Floppy: support readonly image files, taking this as the criteria for making the medium readonly (bug #5651)
  • Audio: fixed memory corruption during playback under rare circumstances
  • Audio: the DirectSound backend now allows VMs to be audible when another DirectSound application is active, including another VM (bug #5578)
  • EFI: support for SATA disks and CDROMs
  • BIOS: reduce the stack usage of the VESA BIOS function #4F01 (Quake fix)
  • OVF/OVA: fixed export of VMs with iSCSI disks
  • Storage: Apple DMG image support for the virtual CD/DVD (bug #6760)
  • Linux host USB support: introduced a less invasive way of accessing raw USB devices (bugs #1093, #5345, #7759)
  • Linux hosts: support recent Linux kernels with CONFIG_DEBUG_SET_MODULE_RONX set
  • Guest Additions: Shared Folders now can be marked as being auto-mounted on Windows, Linux and Solaris guests
  • Linux Additions: Shared Folders now support symbolic links (bug #818)
  • Linux Additions: combined 32-bit and 64-bit additions into one file
  • Windows Additions: automatic logon on Windows Vista/Windows 7 is now able to handle renamed user accounts; added various bugfixes

Posted by 행복상자

최근에 아는 지인과 이야기 하다가, PNG 파일의 변환 이야기가 나왔다. 하고 있는 일이 있는데, 몇가지 풀리지 않는 이미징 프로세싱상의 문제점이었는데, 나의 호기심을 자극하였다.

내가 그동안 알고 있는 PNG파일에 대한 내용은
1. 라이센스가 없다.
2. R,G,B 와 알파 채널을 제공한다.
이것이 전부이다. 그래서, 쉽게 쓰고, 편하게 쓰자 였다.

요즘 왠만한 웹사이트와 개발되는 프로그램들은 PNG파일들을 대부분 기본으로 지원하고 있다. 이는 개발툴과 Application 기본적으로 지원하고 있다는 말이다.  iPhone에서도 기본 이미지는 png 파일을 이용해서 메뉴 아이콘을 구성하고 있다.

관련 자료들은 내가 잘 이용하는 위키디피아에서 찾아 보았다.
PNG파일데 대한 다음 링크를 브라우져에서 열어보면, 아래와 같은 목차가 나타난다.


세부 사항들은 위에서 각 링크를 찾아 보면 되고, 간략하게 PNG파일에 대해서 요약하면,
PNG 는 Potalble Network Graphics의 약자로, 무손실 데이터 압축을 사용하는 비트맵 이미지 포맷이다. PNG는 GIF 포맷을 개선하고, 대체하기 위해 만들어진 포맷으로 파일 포맷에 대한 라이센스를 필요로 하지 않는다. PNG는 palette기반의 24bit RGB color와 greyscale RGB 그리고 RGBA (알파체널을 포함한 RGB) 이미지들을 지원한다.
그리고, 이 파일 포맷은 인터넷상에서 전송을 위한 목적으로 설계되었기 때문에, 전문 적인 디자인을 위한 CMYK와 같은 color space는 제공하지 않고 있다.

마지막으로 PNG 파일은 "PNG" 또는 "png" 확장자로 사용되고, 인터넷에서 주로 사용하고 있는 Mine media type으로는 "image/png" 로 정의해서 사용한다.

PNG file의 헤더는 8 byte로 되어 있다. (필드의 세부 내용은 아래 참조)
Bytes Purpose
89 Has the high bit set to detect transmission systems that do not support 8 bit data and to reduce the chance that a text file is mistakenly interpreted as a PNG, or vice versa.
50 4E 47 In ASCII, the letters "PNG", allowing a person to identify the format easily if it is viewed in a text editor.
0D 0A A DOS style line ending (CRLF) to detect DOS-UNIX line ending conversion of the data.
1A A byte that stops display of the file under DOS when the command type has been used—the end-of-file character
0A A UNIX style line ending (LF) to detect UNIX-DOS line ending conversion.



PNG 파일을 사용하는 .Net Framework의 예제는 아래와 같다.
(물론 여러 툴에서 각각 UI 에서 지원하기 위한 클래스와 API가 있지만, 단지 내가 좋아하는 VB를 좋아하기 때문에 예제도 MSDN에서 찾아 보았다.)

다음 링크를 따라 가면, 2개의 예제가 있다.

사용하는 예제는 무척 간단한다. Encode 또는 Decode 클래스를 이용하면되는데, 기본적인 사용법을 알아두면, GIF 나 JPEG 의 Encode 또는 Decode 클래스를 쉽게 이용할 수 있다.

[PNG Image를  Decodeing 하는 예제]
' Open a Stream and decode a PNG image
Dim imageStreamSource As New FileStream("smiley.png", FileMode.Open, FileAccess.Read, FileShare.Read)
Dim decoder As New PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim bitmapSource As BitmapSource = decoder.Frames(0)

' Draw the Image
Dim myImage As New Image()
myImage.Source = bitmapSource
myImage.Stretch = Stretch.None
myImage.Margin = New Thickness(20)

[PNG Image를  Encodeing 하는 예제]
Dim width As Integer = 128
Dim height As Integer = 128
Dim stride As Integer = width
Dim pixels(height * stride) As Byte
' Define the image palette
Dim myPalette As BitmapPalette = BitmapPalettes.Halftone256
' Creates a new empty image with the pre-defined palette
Dim image As BitmapSource = System.Windows.Media.Imaging.BitmapSource.Create( _
width, height, 96, 96, PixelFormats.Indexed8, myPalette, pixels, stride)
Dim stream As New FileStream("new.png", FileMode.Create)
Dim encoder As New PngBitmapEncoder()
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString()
encoder.Interlace = PngInterlaceOption.On
encoder.Frames.Add(BitmapFrame.Create(image))
encoder.Save(stream)


'Tip & Tips' 카테고리의 다른 글

Mac에서 Windows 공유 폴더 연결하기  (0) 2011.01.17
PNG File 에 대한 간략 정리  (0) 2009.09.07
Twitter API 사용하기  (1) 2009.07.18
INTEL 칩셋 패치 유틸리티 v9.0.0.1012  (0) 2009.01.29
Posted by 행복상자
아래 글을 사실 몇 주전에 Twitter API를 분석하기 위해서, 정리하던 자료로 Google Docs로 만들었던 자료의 일부이다. 실제로는 Twitter API 를 이용하여 개발을 할때는 자기가 원하는 언어와 툴을 사용하여 개발을 할 수 있도록, 문서들을 제공하고 있지만 자신이 자신있는 개발언어와 코드를 보면 더 쉽게 이해할 수 있을 것이다. 

개인적으로는 google app engine에 올릴 작은 서비스를 만들기 위해서 Java 라이브러리를 찾았는데, 그때 정리했던 자료인데, 별로 도움이 안 될거 같아서 그냥 지울까하다가 Blog에 올린다.

[간략히 정리한 자료]
Twitter API는 두개의 파트로 구성되어 있다. 이는 역사적이 이유때문인데, 회사의 사명이 바뀌고 Rebranding되었기 때문이다.
    - REST API, Search API => 향후에도 분리된 형태로 남을 것이다.
 
The Twitter REST API:
    - 개발자들이 Twitter core data로 접근이 가능하다.
        . update timelines, status data and user infomation
The Search API:
    - 개발자들이 Twitter Search와 Trands data의 기능의 사용할 수 있도록 해준다.
 
Rate limiting
    - Twitter API는 clients가 주어진 사간에서 제한된 수의 Calls을 만들수 있도록 허락하고
    - 이러한 정책은 두종류의 API들을 통해서 다른 방법으로 적용된다.
 
REST API Rate Limiting
    - REST API 는 시간당 100개의 requests의 기본적인 제한을 가지고 있다.
    - account and IP-based rate limitig을 가지고 있고
    - HTTP Post 를 이용하여 Twitter에게 데이터를 전송하는 경운는 제약이 없다. 
        . statuses/update 와 같을 경우에....
 
Twitter Access in Java
    - Java library
    - 모든 library를 설치해서 사용하기 보다는, 인터넷에 올라온 분석글들의 도움을 받아보니, 이중에서 Twitter4J 가 괜찮은 것 같다.

나중에 실제로 Twitter4J를 사용해보았는데 사용법이 어렵지 않아, Twitter를 사용해 본 경험이 있는 개발자라면, 쉽게 사용할 수 있다. 
사실, Twitter에서 제공하는 인터페이스를 랩핑한 코드들이기 때문에, 쉬워 보일지도 모른다.

테스트를 하면서, 갑자기 동작이 안하는 경우가 발생하는데, 이경우 API를 너무 많이 호출했는지를 먼저 의심해 보아야 한다. Twitter는 Open Platform이기는 하지만, 동일 IP주소를 사용하는 PC와 Device에 제약사항이 있는데, 시간당 100회와 하루 24시간동안 1000회를 이용 가능하도록 되어 있다. 

이러한 제약 사항을 기억하고 있다면, 원하는 서비스 모듈을 만들어 사용하는데 큰 어려움과 부족(?)함이 없을 것이다.


'Tip & Tips' 카테고리의 다른 글

Mac에서 Windows 공유 폴더 연결하기  (0) 2011.01.17
PNG File 에 대한 간략 정리  (0) 2009.09.07
Twitter API 사용하기  (1) 2009.07.18
INTEL 칩셋 패치 유틸리티 v9.0.0.1012  (0) 2009.01.29
Posted by 행복상자
Sun에서 GPL 라이센스로 개발하고 공개하고 있는 이전에 소개한 이후로 계속 버전을 업그레이드 하고 있다.
내가 개발에 필요할 때가 아니면, 자세하게 변경 내용을 들여다 보지 않는터라 얼마나 변경되었는지 알지 못하고 있다가, 이번에 싸이트를 방문하고 나서야 벌써 3.0으로 업그레이드 되었음을 알게 되었다.

이에 대한 설치 방법은 이전에 써 놓았던 아래의 Blog를 참조하면 된다.


사실 VirualBox 2.2가 지난 4월에 나오고 얼마되지 않아 VirtualBox 3가 지난 6월 30일 나온 것은 굉장히 빨리 버전이 올라가는 있다는 것인데, 그리고 나서 7월 10일 경에 3.0.2로 업그레이드한 버전을 Release하였다는 것은 기능적으로 빠르게 추가되고 있다는 의미이기도 하지만, 내부적으로 Defact가 많다는 의미이기도 하다. 

이에 대한 기존 VirtualBox2와 3의 다른 점은 Changelog에서 확인할 수 있다.

아는 사람들은 알겠지만, 몇개월 전에 Sun과 Oracle의 기업 합병이야기가 있었고, 두 회사는 다른듯하지만 내부적으로는 서버에 관련 소프트웨어 기술들은 많은 부분 유사하고 중복되어 있다. 그 중 하나가 가상화 기술은데, 합병의 여파로 VirtualBox가 중단되지 않나하는 우려도 있었는데, 지속적으로 버전업하고 있는 것은 상당한 의미를 내표하고 있다.

VirtualBox 3는 현재 Windows, Linux 그리고 Macintoch 와 OpenSolaris에서 호스트로 도작할 수 있으며, 다음과 같은 guest OS들을 사용할 수 있다. (아래 표 참조)
현재 나와 있는 OS중에서 많이 사용되고 있는 것들은 거의 모두 사용이 가능하다. 


eam. (Page last updated 2009-06-12)


Guest OS Status Remarks
Windows family
Windows 7 RC Works, with Additions
Windows Vista Works, with Additions
Windows 2000 Works, with Additions
Windows XP Works, with Additions
Windows Server 2003 Work, with Additions
Windows NT Works, with Additions Some issues with old service packs. Recommended to install service pack 6a.
* Windows 98 Works, no Additions available
Linux family
Generally, all 2.4 and 2.6 kernels work; however, we recommend 2.6.13 or above for better performance. Kernels 2.6.18 to 2.6.18.2 contain a race condition (which was unfortunately backported to the Ubuntu 6.06 Server and 6.10 kernels) that can cause boot crashes in virtual machines.
Ubuntu 5.10/6.06 Desktop/7.04/7.10/8.04/8.10/9.04 Work, with Additions
Ubuntu 6.06 Server/6.10 Works partially, with Additions The Ubuntu 6.06 Server and 6.10 kernels suffer from the race condition mentioned above.
Debian 3.1/4.0/5.0 Work, with Additions
SUSE 9/10.0 Work, with Additions
openSUSE 10.2 Works partially, with Additions The openSUSE 10.2 kernel suffers from the race condition mentioned above.
openSUSE 10.3 Works, with Additions
openSUSE 11.0/11.1 Work, with Additions
Mandriva 2008 Works, with Additions Mandriva 2008 has the guest additions for VirtualBox 1.5 installed by default. These should be updated after installation.
Mandriva 2009.0/Mandriva 2009.1 Work, with Additions
Mandrake 10.1 Works, with Additions
*Mandrake 9.2 Works, without Additions
Fedora Core 1/4/5/6 Work, with Additions
Fedora 7, 8, 9, 10, 11 Work, with Additions
Red Hat Enterprise Linux 3, 4 and 5 Work, with Additions
* Red Hat Linux 9 Works, with Additions
* Red Hat Linux 7 Works, without Additions
* Linspire 4.5 Works, with Additions
* Slackware 10.1 Works, with Additions
* Conectiva 10 Works, with Additions
* Xandros 3 Works, no Additions available
Xandros 4 Works, with Additions
ArchLinux Works, with Additions Installation has to be booted with the ide-legacy option.
Solaris
Solaris 10 5.08 and later Works, Guest Additions available No shared folder support yet.
OpenSolaris 2008.05 and later Works, Guest Additions available No shared folder support yet.
Unices
FreeBSD Works partially FreeBSD 6.2 is known to cause problems.
* PC-BSD 1.3 Doesn't work
OpenBSD Works, no Additions available
Others
DOS Works, no Additions available Only limited testing as part of system installation processes has been performed.
OS/2 Works, with Additions Requires VT-x hardware virtualization support. Only MCP2 is reported to work reliably so far.
QNX Neutrino 6.32 Doesn't work
* Novell Netware 6.5 Doesn't work
* BeOS 5 Doesn't work
Syllable Works, no Additions available
* Visopsys Doesn't work
ReactOS Works, no Additions available
* SkyOS Works, no Additions available




Posted by 행복상자

최근에 프로젝트에 ExtJS를 비록하여 몇가지 JavaScript 프레임워크를 검토한 적이 있다.
내부적으로 ExtJS를 사용하고 있지만, 결코 주변의 다른 프로젝트를 진행하고 있는 사람들에게는 적극적으로 권하지 않는다. 왜냐하면, 한국은 HTML, CCS 그리고 JavaScript를 웹 프로그램의 한 부분으로 생각하지 않고 있을 뿐더러, 그렇다고 디자이너의 역할 중의 하나라고도 생각하지 않는다. 그렇게 때문에 HTML, CSS 그리고 JavaScript의 전문가를 찾아 보기가 쉽지 않다.

ExtJS를 권하지 않는 이유는 처음 이를 사용할 때는 Windows에서나 제공할 수 있었던 많은 기능들이 컴포넌트화 되어 있어서, 사용하기 편할거라는 생각을 하는데, 이를 응용한 새로운 컴포넌트를 만들거나 제대로 기능을 사용하려면, 약 2달정도의 학습시간이 필요하기 때문이다. 개발 초기에 이를 감안한다면, 사용하는 것은 별 문제 없지만, 기존의 HTML과 CSS만을 이용할 때보다는 전체 개발시간이 늘어날 거라고 반드시 예상하고 개발 플랜을 잡아야 할 것이다.

최근에 기존에 개발되어 있던 기능을 살펴볼 일이 있었다.
개발자가 ExtJS의 코드를 그대로 가져다 써서 인지 사소한 버그가 있었다. ExtJS의 버그나 잘못은 아니라고 생각한다. Ajax와 ExtJS의 그리드 컴포넌트를 이용하였는데, 마지막 페이지에 있던 Rows를 모두 삭제하면 이전 페이지로 이동해야 하는데, 마지막 페이지 그대로를 표시하는 것이었다.

그래서, 몇가지 자료를 찾아보았더니, 관련된 예제는 아래와 같은 Link에 있었다.
그리드에 데이터 목록을 가져오고, 목록에 추가/수정/삭제에 대한 예제가 있다.

예제: Tutorial:Using Ext grid form dialog to achieve paging list, create, edit, delete function 

이중에서 delete에 대한 예제는 아래와 같았다. (아래 Delete Function 예제 참조)

 Delete function

Delete function will get the selected id(s) and create JSON data and send JSON data to Java server-side for handle.

/************************************************************
    * Action - delete
    *   start to handle delete function
    *   need confirm to delete
    ************************************************************/	
    function doDel(){
        var m = grid.getSelections();
        if(m.length > 0)
        {
        	Ext.MessageBox.confirm('Message', 'Do you really want to delete it?' , doDel2);	
        }
        else
        {
        	Ext.MessageBox.alert('Message', 'Please select at least one item to delete');
        }
    }     
 
    function doDel2(btn)
	{
       if(btn == 'yes')
       {	
			var m = grid.getSelections();
			var jsonData = "[";
	        for(var i = 0, len = m.length; i < len; i++){        		
				var ss = "{\"id\":\"" + m[i].get("id") + "\"}";
				//alert(ss);
				if(i==0)
	           		jsonData = jsonData + ss ;
			   	else
					jsonData = jsonData + "," + ss;	
				ds.remove(m[i]);								
	        }	
			jsonData = jsonData + "]";
			ds.load({params:{start:0, limit:myPageSize, delData:jsonData}});		
		}
	}

And delete parameter to server side with JSON data like this: delData=[{"id":"5"},{"id":"6"}]


위 예제를 보면, 서버로 데이터를 요청할 때, 파라메터로 start 값과 limit값을 보내줌을 알수 있다.
상기 예제 소수의 하단을 보면,    ds.load({params:{start:0, limit:myPageSize, delData:jsonData}});
라는 코드가 눈에 들어올 것이다. 이를 이용하여, 서버에서 DB에 쿼리를 수행해서 현재 페이지에서 필요로 하는 첫 번째 인텐스 값과 현재 페이지에서 표시할 수 있는 데이터의 갯수를 가져오는 것인데, 위 예제는 기본적으로 "0"번 인덱스를 서버로 보내서 매번 1페이지만 가져오는 것이다.

만약 이를 해결하려면, 두가지 방법이 있는데

첫번째는 위에서 사용했던 함수 ds.load({params:{start:0, limit:myPageSize, delData:jsonData}});
의 start 파라메터에 이전 페이지의 첫번째 인덱스를 넣어주는 것이다. 이를 위해서는 전체 Total Counter를 이용하여 총 페이지 수와 인덱스를 찾는 로직이 필요한데, 이미 많이 사용되는 코드라 쉽게 찾고, 만들수 있을 거라 생각된다.

두번째는 페이지 네이션을 모두 서버에서 담당하는 것이다. 이 경우는 동시에 사용자들이 수정 추가 삭제에 대해 부분도 충분히 고려되어 질 수 있다. 이에 필요한 계산 로직은 위의 첫번째 방법과 별로 다르지는 않고 단지 책임에 대한 부분만 책임을 지면된다. 이때는 서버에 현재 페이지의 첫번째 인덱스 번호를 서버로 보내주는 것이 바람직하다.
이를 이용하여 서버에서는 전제 개수와 페이지를 계산하고 마지막 페이지가 존재하지 않는 경우 이전 페이지의 목록을 보내주면 되기 때문이다.
 

Posted by 행복상자
Pro Javascript를 전체적으로 한번 흩어 보고나서는, Javascript에 대한 이해도가 무척 높아졌다. 물론 당연히 알아야 할 것들을 그동안 모르는 채 잘 지내왔을 뿐이다.
내가 알던 쉬운 자바스크립트는 지금의 것과는 너무도 많이 달랐다. 아니 자바스크립트의 가능성과 기능에 대해서 너무 간과해 왔는지도 모른다.

HTML의 DOM 구조는 개발자로 하여금 문서의 구조을 쉽게 이해할 수 있도록 도와주고, 이는 CSS와
Javascript를 통해서 쉽게 제어할 수 있어 매우 유용하다.

<html>
<head>
<title>Introduction to the DOM</title>
<script>
    // We can't manipulate the DOM until the document
    // is fully loaded
    window.onload = function(){
    // Find all the <li> elements, to attach the event handlers to them
    var li = document.getElementsByTagName("li");
    for ( var i = 0; i < li.length; i++ ) {
        // Attach a mouseover event handler to the <li> element,
        // which changes the <li>s background to blue.
        li[i].onmouseover = function() {
            this.style.backgroundColor = 'blue';
        };

        // Attach a mouseout event handler to the <li> element
        // which changes the <li>s background back to its default white
        li[i].onmouseout = function() {
            this.style.backgroundColor = 'white';
        };
    }
};
</script>
</head>
<body>
<h1>Introduction to the DOM</h1>
<p class="test">There are a number of reasons why the
DOM is awesome, here are some:</p>
<ul>
    <li id="everywhere">It can be found everywhere.</li>
    <li class="test">It's easy to use.</li>
    <li class="test">It can help you to find what you want, really quickly.</li>
</ul>
</body>
</html>

위의 코드는 "Pro Javascript"에 나오는 예제인데, HTML은 XML의 구조를 가지고 있지만, 가장 단순한 형태중에 하나로 문서를 구성하는 Object를 정의하고 있다. 이러한 구조는 "태그(Tag)"라는 형태로 정의되어지는데, 위 예제는 태그에 Event의 handler를 할당하는 코드이다.

코드에 대한 설명을 덧 붙이자면,
1. var li = document.getElementsByTagName("li");
    - 위 코드를 통해서 HTML 문서에 정의된 "li" 태그들의 리스트를 가져와서 var li에 저장한다.
    - document.getElementsByTagName 메소드는 태그 이름을 이용하여 Element를 가져오는
      함수이다.

2. li[i].onmouseover = function() {this.style.backgroundColor = 'blue'; );
   - 위 코드를 정의하기 전에, "li.length"를 통해서 리스트의 갯수를 알수 있고 이를 For 루프 문의
     통해서 반복을 시킨다.
   - 이는 동일한 이벤트를 "li"태그로 정의된 Object에 할당하기 위새서이다.
   - li[i].onmouserover 이벤트 메소드는 위와 같이 새로 정의된 메소드를 통해서 마우스가 "li"태그
     위에서 움직일 때 태그의 배경색을 "blue"로 바꾸어 준다.

3. li[i].onmouseout = function() {this.style.backgroundColor = 'white'; };
    - 이 코드는 "li" 태그의 onmouseout event 메소드를 정의하는 코드로, 마우스가 태그를 벗어날때
      태그의 배경색을 "white"로 바뀌게 만들어 준다.

위의 코드를 이해할 수 있으면, jQuery에서 얼마나 직관적으로 같은 코드를 간략하고 단순한 형태로 사용할 수 있는지 알게된다면, 깊은 인상을 받을 것이다.
Posted by 행복상자
원래는 책에서 Closure에 대한 설명에 대한 설명이 있는데, 나의 관심을 끈 것은 Anonymous함수의 사용에 대한 것이었다.

아래의 예제는 동일한 동작을 하는 메소드를 Event에 추가하는 예제인데, 중간 정도에 보면 난데 없이 "(function(){" 으로 시작하는 구문이 나온다. 이 부분이 Anonymoun function 이다.
이렇게 만들면 "Global"로 선언할 필요없이 임시적으로 함수 블럭의 사용이 가능하다.
구문을 닫을 경우는 "})();"를 이용하면 된다.

 // An element with an ID of main
var obj = document.getElementById("main");

// An array of items to bind to
var items = [ "click", "keypress" ];

// Iterate through each of the items
for ( var i = 0; i < items.length; i++ ) {
    // Use a self-executed anonymous function to induce scope
    (function(){
        // Remember the value within this scope
        var item = items[i];
        // Bind a function to the elment
        obj[ "on" + item ] = function() {
            // item refers to a parent variable that has been successfully
            // scoped within the context of this for loop
            alert( "Thanks for your " + item );
        };
    })();
}

사실 위의 코드는 불필요한 내용들이 많이 들어있다. 굳지 저렇게 써야하나 라는 생각이 들지도 모르지만, 이것은 단지 예제 정도록 사용하면 된다.
그래도 몇가지 건질 것이 있다면, 위의 코드에서 "id"를 이용하여 오브젝트를 가져오고, Event를 Bind하는 내용을 담고 있는데, Event명을 obj["on" + item]의 형태로 Event를 binding한다.
위의 코드는 "click" 과 "keypress"에 대한 이벤트가 발생하면 메시지를 발생시키는 예제이다.

Posted by 행복상자
지난 번에 VirtualBox를 설치하고, Window 7을 설치해서 사용하는 것에 대해, 알아보기로 했는데 이제서야 글을 올린다. 설치는 무척 간단하였다. 왜냐하면 기본적으로 설정을 변경하지 않고, VirtualBox의 기본 옵션들을 그대로 이용하였기 때문이다. Winodos 7을 설치하고 이를 테스트 하였는데, 일단 듀얼 CPU가 장착되어 있는 PC에서 사용하는 것이 유용하다. 물로 메모리는 2G 이상의 시스템에서 사용하는 것이 좋다. 윈도우즈 7을 설치하게 되면, 비디오의 메모리는 변경해 주는 것이 좋다. 너무 적게 잡으면 시스템이 느리고, 부자연 스럽다. 대락 200메가 내외이면 적당하다.

자 그럼 설치방법에 대해서 알아보도록 하겠다.
VirtualBox를 이용하여 설치시의 옵션들은 나중에 재 수정 가능하므로, 초기에는 기본으로 설정하는 것이 쉽고 빠를 거라 생각된다. (별다른 고민을 하지 않으므로 빠르다. ^^)

먼저 VirtualBox의 아이콘을 클릭하여 프로그램을 실행한후, 왼쪽 상단의 "새로 만들기" 버튼을 메뉴에서 클릭하면 아래와 같은 화면이 나타난다. 처음에 프로그램을 설치할 때는 영문으로 메뉴와 텍스트가 표시되었는데, 그래서 한글을 별로 기대하지 안했는데, 친절하게 한글로 메뉴와 기능들을 사용자에게 제공한다. (이쯤되면, 감동이 시작된다. 별로 기대하지 않했는데, 뭔가를 주게되면, 찡하게 느끼게 되니까.)


간단하게 다음 버튼을 클릭한다.
그러면 아래과 같이 "새 가상 머신 만들기" 창이 나타나고, 사용자는 여기서 자신이 설치할 OS를 고르면 된다. Windows, Linux, Unix등 설치하기를 원하는 것을 고프면 된다. 나는 Windows 7 Beta를 설치할 예정이므로 아래와 같이 "Microsort Wondows"를 선택하고 버전은 "Windows 7"을 선택했다.


"다음 > "을 클릭하면 은 가상 머신의 메모를를 할당해 주어야 한다. 아래와 같은 창이 나오면, 적절하게 잡아 주면 된다. 나의 경우는 총 사용가능한 메모리가 2GByte 이므로 1GByte를 할당하였다. 이는 나중에 조정이 가능하므로 적당히 넣어 주면 된다. (본인이 한번 정하면 절대 바꾸지 않는 완벽 주의자가 아니라면 말이다.)
 

자, 여기서 부터는 속도를 내자, 기본크기를 20GByte를 사용할 수 있도록 했다. 파일 명과 저장 위치는 "새로 만들기(N)..." 버튼을 클릭해서 정할 수 있다.


만약 위에서 "새로 만들기를 클릭하였다면" 아래와 같은 화면을 만날 수 있을 것이다.

위 화면에서 "다음 >" 버튼을 누르면 아래화면이 나타나는데, 옵션중에 "동적 확장 저장소"를 선택한다. (설명을 화면의 내용에 표시 되어 있다.) 




사용할 가상 하드디스크의 크기를 설정한다. 아까 이야기 한것처럼 최소 권장 크기가 20GB바이트이므로 그냥 20GByte를 선택한다.

위의 단계를 마지막으로, 윈도우즈 7을 설치를 위한 준비 단계는 모두 마쳤다.
아래 화명에서 "마침"버튼을 누르면 된다.


이제 생성한 이미지를 이용해서, Window 7을 설치하면 된다.
VirtualBox 프로그램을 실행하고, 상단의"시작" 버튼을 이용하여, 설치 CD 또는 DVD를 이용해서, 설치하면 된다.

아래는 윈도우 7의 설치 화면이다.

설치는 무척 XP보다도 간단하였다. 내가 가진 시스템은 듀얼코어가 아닌 원 코어의 Intel의 2.3Gbyte 포로세슬르 사용하는 시스템이다. 약 25~30분정도 걸렸다.

아래는 VirtualBox에서 Windows 7을 처음 실행시켰을 때, Windows 7이 실행을 준비하고 있는 화면이다. 약간의 시간이 걸렸다. 

마지막으로, 이 화면이 윈도우 7이 실행된 화면이다. 화면의 하단 오른쪽에 조그만하게 Windows 7 이라고 표시된 것이 보인다.

혼자 있는 물고기가 외로와 보인다.

윈도우즈 7을 설치하면, 네트워크는 기존 시스템의 IP를 Proxy해서 사용하게되는데, 네트워크 설정을 보면, IP6를 기본으로 지원하게 되어 있는 부분이 특이점이다.
이에 대한 사용기는 별도로 따로 올리거나 이야기하지는 않겠지만, 시스템을 가볍고, 사용자를 끌만한 매력을 가지고 있다. Vista의 실패만큼 앞으로 성공할 가능성이 많은 MS의 새로운 OS이고, 써볼만한 가치가 있다고 생각이 든다.

올해에는 정식 버전이 출시될거라는 예측이 여려 경로를 통해서 들려온다. 이는 Windows 7이 Beta버전이지만, 안정성에 큰 문제가 없다는 반증이기도 하지만, 지난 해의 Vista의 실패로 인한 MS의 매출이 많이 줄어든 탓이기도 하다.

 
Posted by 행복상자

어떤 사람들은 믿지 않겠지만, Javascript도 Object Oriented Programming을 지원하는 Language이다. 이전에 자바 스크립트가 출현하 지난 10년동안 언어적인 측면과 사용적인 측면에서 많은 변화가 있었지만, 실제로 개발자들은 굉장히 소극적으로 이를 사용했었다. 따라서 별도의 Javascript 함수들을 모은 ".js" 파일을 이용하기도 했지만, 이는 단지 함수들을 재 사용하는 측명에서 였다. 이유는 코드를 고치거나 수정하기 어렵다는 것인데, 자바 스크립트가 가지고 있는 기본적인 속성들을 몰라서 일지도 모른다.
많은 사람들이 Javascript를 다시 보기된 계기는 Google의 Application들이 이를 이용해서 사람들에 자신들의 Application을 제공하기 시작했기 때문이라 생각하는데, 이어서 나온 Yahoo의 YUI도 내게 많은 놀라움을 주었다. 그리고 다른 오픈 소스 라이브러리들 역시 놀라운 정도의 편리함과 쉬운 사용법을 내세우고 개발자들의 쉴 틈(?)을 만들어 주고 있다.

그러나, 남의 것을 사용할 때도, 기본적이고 기초적인 것은 알아야 덜 고생한다.
세상에는 날로 먹을 만한 것이 그리 많지 않다.

오늘은 내가 잘 이해하지 못했던 Javascript의 Scope에 대해 설명할 거다.

자바스크립트는 기본적으로 웹브라우져의 페이지별로 실행된다. 그래서 대부분이 함수를 만들어서 그안에서 지역 변수를 생성하거나, 전역으로 생성해서 사용한다.
일반적으로 사용할때는 별 문제가 없겠지만, Java, C#, C/C++과는 Scope의 영향범위가 다르므로 주의해야 한다.

아래는 셈플 코드인데, 전역으로 foo 변수를 생성했고, 이어서 if 문안에 생성했고, 마지막으로
 function 문 안에서 생성하였다.

위에 주석으로 설명이 다 되어있지만, 다시 설명을 하면
6번째 줄에서 foo변수를 전역으로 선언하고 "test"라는 문자열을 저장하였다. 그리고 나서 12번째 줄에 새로운 foo 변수를 정의하고 "new test"라는 문자열을 저장하였다. 그러나 이는 이전에 생성했던 전경 변수와 동일하다. 다시 말하면, 이는 전역 Scope의 영향 아래에 있다. Java나 C#, C/C++은 전혀 다르므로 혹시 이를 착각하고 사용할 가능성이 많다.
이의 확인은 15번째 줄에서 알수 있다. 이를 실행하면 동일함을 확인할 수 있다.

이어서, 17번째에 함수 test를 만들고 24번째 줄에서 실행하면, 이전에 function test에서 할당한 문자는 function Scope에서 이미 생명주기가 다했음을 알수있다.

그럼다면, 함수안에 if 문에서 변수 foo를 새로 정의한 경우는 어떻게 될까?

한번 실행보면 알겠지만, 역시 if구문 안에 정의한 변수는 주의해야 한다. 자신이 원치 않는 결과를 가져올수 있다.
Posted by 행복상자