Entries Tagged as Ubuntu/Linux

CFFTP태그는 손쉽게 ColdFusion 문서에서 외부의 FTP서버에 연결해서 해당 내용을 가져오거나 파일을 업로드하거나, 다운로드할 수 있는 아주 유용한 태그입니다. 마치 ColdFusion웹문서가 FTP클라이언트처럼 작동하게 해주는 강력한 기능을 제공합니다. 사용방법도 너무 쉬워서 몇줄의 코드로 간단하게 구현할 수 있습니다.

그런데 ASP와 같은 Windows계열의 웹개발언어에서는 CP949와 같은 운영체제의 인코딩과 EUC-KR과 같은 웹페이지 인코딩으로 기본적으로 한글을 사용하기에 매우 편리합니다만, 웹개발시 한글과 영문외의 문자 가령, 일본어 등과 같은 경우엔 별도의 조치를 취해주어야 합니다.

반면 대부분의 Linux환경에서는 UTF-8을 기본 지원하고 있어서 특별히 문자열에 대한 고민을 할 필요는 없습니다만, JVM에 기반한 웹언어를 사용시에는 유니코드를 사용할때 추가적인 조치를 해줘야 합니다.

사실 Windows나, Linux나 ASP나 PHP나 또는 JSP, ColdFusion과 같은 대부분의 것들이 영어권국가(미국)에서 만들어지고 개발되어진 탓에 그들의 언어에 태생적으로 얽여있다는 이유 등으로 그들은 특별한 조치없이 기본적으로 지원되는 ISO-8859-1과 같은 인코딩을 이용하여 편리하게 이용하는 반면, 한글과 같은 2Byte 문자권에서는 늘 무언가의 조치를 해줘야 하는 불편함이 있기는 매 한가지 입니다.

최근에 Ubuntu Linux에 구축된 외부의 VSFTP서버에서 디렉토리와 파일목록을 가져와야 하는 작업을해야 할 상황이 생겼습니다. 기본적으로 Ubuntu는 UTF-8환경이고, FTP의 디렉토리 및 파일명 역시 UTF-8 형식으로 만들어지고 저장된 파일이여서 큰 걱정을 안했는데 역시 불길한 예감은 틀린적이 없었습니다.

한글로 된 모든 디렉토리명 및 파일명이 깨져서 반환되는 것이었습니다. 실행되는 ColdFusion문서를 UTF-8로 처리하도록 해보았지만 역시나 동일한 결과. 그리하여 생각해낸게 Java로 아예 파일 및 디렉토리명의 문자열이 무슨 인코딩인지 알아보기로 했습니다. 

간단하게, 구글링을 통하여 Detecting Character Encoding In Coldfusion 글을 참고하여 테스트한 결과 Latin1 즉, ISO-8859-1인코딩으로 디렉토리명과 파일명이 반환됨을 알게되었죠. 아래 그림을 참고하시면 이해가 빠르실 겁니다.

Fixing broken character encoding for CFFTP

그림에서와 같이 어떤 FTP서버내에는 vod라는 디렉토리가 있는데 그 하위에 "스페셜"이란 한글로 명명된 디렉토리가 있습니다. 그리고 그 안에는 2개의 mp4파일이 존재하는데 각각 한자와 한글로 된 파일명을 가지고 있습니다.

일반적으로 CFFTP태그로 덤프(위 그림의 보라색 표 부분)를 해보거나 단순히 path와 같은 속성값을 출력해 보면 위 그림의 윗 부분처럼 한글(한자)로 된 부분이 깨져버립니다. 실행되는 ColdFusion문서자체가 UTF-8로 저장되고, 실행되고, 원격지의 FTP서버가 UTF-8로 운영되어도 말이죠. 아마도 추측컨데 JVM의 문제일듯합니다. 문자셋 문제는 대부분.

자, 그럼 위 그림의 UTF-8부분처럼 정상적으로 디렉토리명과 파일명을 가져오려면 어떻게 해야 할까요? 바로 파일을 가져올 디렉토리명의 한글을 ISO-8859-1로 그리고 반환되는 파일명을 UTF-8로 동적으로 변환해서 처리하면 됩니다. 

<cfprocessingdirective pageencoding="utf-8">
<cfcontent type="text/html; charset=utf-8">

<!--- ISO-8859-1(Latin1)을 UTF-8로 --->
<cffunction name="convertToUTF8" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("ISO-8859-1").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('ISO-8859-1'),'UTF-8').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!--- UTF-8을 ISO-8859-1(Latin1)로 --->
<cffunction name="convertToLatin1" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("UTF-8").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('UTF-8'),'ISO-8859-1').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!---FTP연결 시작--->
<cfftp action="open" connection="ftpQuery" username="demouser" password="demopasswd" server="someserver" stopOnError="yes"> 

<!--- 
FTP디렉토리에 한글이 있는 경우 해당 디렉토리를 불러오려면 convertToLatin1 함수를
해당 디렉토리 및 파일명이 한글인 경우 깨지는 것을 막기위해 convertToUTF8 함수를
--->

<!--- 디렉토리 및 파일리스팅 --->
<cfftp action="listdir" stopOnError="yes" name="getDirFiles" directory="#convertToLatin1('/vod/스페셜/')#" connection="ftpQuery">

<cfoutput query="getDirFiles">
	#convertToUTF8(path)# <br />
</cfoutput>

<hr />
<cfdump var="#getDirFiles#">

<!--- FTP연결 삭제 --->
<cfftp action="close" connection="ftpQuery" stopOnError="Yes"> 

위의 코드를 보죠. 위의 코드는 어떤 FTP에 연결과 "/vod/스페셜"이라는 디렉토리에서 파일들의 목록을 가져오는 코드입니다. 먼저 "/vod/스페셜"이라는 한글이 포함된 디렉토리명은 ISO-8859-1로 변환해서 ColdFusion서버에게 전달하고, ColdFusion서버에서 해당 FTP의 파일목록을 반환할때는 UTF-8로 반환되도록 함수를 2개 만들었습니다. 각각, convertToUTF8과 convertToLatin1라는 사용자정의함수(UDF : User Defined Function)입니다.

중간의 코드중에 directory="#convertToLatin1('/vod/스페셜/')#" 부분과 #convertToUTF8(path)# 부분에 각각 해당 함수가 쓰여 자동으로 문자열의 인코딩을 변경합니다. 

대부분 CdolFusion에서 로컬서버 및 원격서버와의 파일송수신, 파일목록의 반환, 압축(CFZIP) 등의 작업을 처리할때 한글파일명과 디렉토리명이 늘 깨져 말썽인데요. 이 함수를 적당히 응용하면 대부분의 문제는 해결되리라 봅니다. 

중요한 것은 ColdFusion서버가 Windows에서 구동되는 경우에는 이러한 문제가 거의 없다는 겁니다.(Windows가 좋다기보다 워낙 Windows는 모든 시스템의 문자셋을 해당 현지언어로 셋팅해버리기 때문에) 이 경우는 대부분 Linux에서 설치된 ColdFusion서버에서 발생하는 상황입니다. 혹시나  Linux나 Mac, Solaris와 같은 운영체제에서 ColdFusion을 구동하는 경우 한글처리에 도움되시길 바라는 마음에서 몇자 남깁니다. (물론, 중국어나 일본어도 동일하게 사용할 수 있겠죠?) 

 

Ubuntu(또는 타 Linux)이 설치된 원격 서버(서버호스팅처럼 물리적인 서버장비)에 VirtualBox를 설치하고 Windows이미지를 업로드하여 VM을 만들어 나름대로의 다중 OS 클라우드시스템을 꾸밀 수 있습니다.

Xen이나 KVM같은 가상화기술보다는 성능에서 뒤쳐진다고 하지만 개인적으로는 이만큼 쉬운 가상화도 없거니와 무료라는 것에 VirtualBox에 높은 점수를 주고 싶네요. 적어도 이용하기엔 편하니까요.

굳이 서버호스팅이 아니더라도 만약 본인의 PC중에 메모리가 4GB이상(이 경우 VM은 1개 정도만 생성하는 것이 유리)이라면 PC의 OS는 Ubuntu Server로 쓰고, 가끔 관리용 또는 업무용으로 Windows를 쓸 수 있도록 하여 원격으로 1대의 PC를 마치 2개의 서버로 이용할 수 있습니다.(경험상으로 보면 동일 머신에 Windows호스트와 Ubuntu의 게스트 조합보다는 Ubuntu 호스트와 Windows 게스트가 더 나은 성능을 보였습니다.)

Ubuntu Server버전이 깔린 PC에 VirtualBox를 설치했고, VM을 만들었다고 가정한 후 

VirtualBox Instance 조회

sudo VBoxManage list vms

VM Instance를 실행

(Windows XP라는 이름으로 만든 Instance라고 가정)

VBoxManage startvm "Windows XP" -type headless

위와 같이 간단하게 조회하고, 간단하게 실행할 수 있습니다. 간단하게 쉘 스크립트를 만들어 두고 시작-중지를 할 수 있도록 만들면 되겠죠? 

최근엔 아예 리눅스 시스템(주로 서버)에서 VirtualBox 이미지를 생성 및 관리할 수 있는 PHP로 만들어진 phpVirtualBox(https://code.google.com/p/phpvirtualbox)와 같은 웹어플리케이션도 오픈소스로 나와있습니다. SSH접속으로 직접 생성관리하기엔 아무래도 어려움이  좀 있으니까 편하겠네요. 

서버호스팅을 이용중이신 분이라면 한대의 서버로 여러 인스턴스를 만들어 나만의 클라우드 OS환경을 만들어 볼 수 있지 않을까요? 

Geany IDE작년 늦은 가을 리눅스환경(Ubuntu)에서 C개발 환경꾸미기를 소개하면서 Geany IDE(http://www.geany.org/Main/About)를 소개한 적 있습니다.(http://blog.nooree.com/post.cfm/ubuntu-c). 저의 경우 거의 Script와 관련된 웹개발이 대부분이라서 사실 Ubuntu에서는 한글입력의 불편함을 달고서도 SFTP직접연결을 지원하는 Sublime Text 2를 쓰고 있었습니다.

그런데 Ubuntu환경에서 Sublime Text 2는 한글 입력 뿐만 아니라 EUC-KR과 같은 인코딩으로 작성된 웹문서를 열지를 못하는 것 같습니다. 제가 만드는 웹프로그램은 거의 특별한 이유가 없다면 유니코드환경에서 개발하는데 가끔은 아주 오래전에 만들어진 웹사이트등을 수정할 때는 어쩔 수 없지요. 그래서 수동으로 FTP를 이용해 파일을 로컬에 받은 다음, Geany를 이용해서 수정 후 다시 업로드하는 방법으로 작업을 했지요.

그러다가 혹시 Geany에도 SFTP등을 지원하는 플러그인이 있나 봤더니 역시 있었습니다. gFTP(http://geany.ftp.notsh.it/)라는 플러그인입니다. Ubuntu와 같은 리눅스환경에서만 지원되는 것 같습니다. 

Geany 1.22이상의 버전을 요구 하므로 저의 전의 글을 참조(http://blog.nooree.com/post.cfm/ubuntu-c)하여 최신 버전인 Geany를 설치합니다. 설치 후 gFTP의 바이너리 파일(gFTP-122.so)를 다운로드 받아서 /usr/lib/geany(32-bit인 경우) /usr/lib/x86_64-linux-gnu/geany(64-bit인 경우)에 복사해 줍니다. libcurl3 패키지가 필요한 경우 sudo apt-get install libcurl3 설치하여 줍니다.  현재 Ubuntu 12.04 LTS 64bit에서는 설치되지 않습니다. 이미 설치되어 있으므로. Debian 패키지를 설치할 경우 시스템이 엉망진창되오니 gFTP에서 SFTP는 아직 사용하지 않는 것이 나을 듯 합니다.

설치 완료 후 Geany의 [도구]-[플러그인관리] 메뉴에서 gFTP를 활성화 해줍니다. 그런 다음 gFTP에서 각각의 SFTP/FTP정보를 추가 저장하면 됩니다. 

  • Name : 적당한 SFTP/FTP 사이트명 입력(여러개의 사이트를 구분하여 저장가능)
  • Host : 도메인 또는 IP주소
  • Login : SFTP/FTP 계정
  • Password : SFTP/FTP 패스워드
  • FTP/SFTP/TLSv1/SSLv3 : 프로토콜 선택
  • Remote : 원격 서버상의 경로
  • Local : 로컬 파일 저장경로
  • Web host : 사이트의 도메인입력
  • Prefix : Remote항목 경로의 웹 경로
    (예: 웹루트 경로가 /home/web/ 이라면 실제 웹사이트에서는 http://www.domain.com/ 이므로 /를 입력) 

Geany IDE gFTP plug-in

Powered by

© 2010-2018 NOOREE.COM