요즘 왠만한 웹 서비스를 만들어서 런칭을 하는 경우에도 https 를 감안해야 합니다. 아마존 웹 서비스(AWS) 에서 서비스 만들어서 런칭을 할 때도 마련해두면 편하게 작성할 수 있을거 같은 교과서적인 튜토리얼을 발견해서 첨부합니다. 비록 설명은 자바 기반이지만 웹서비스에 대해서 어느정도 관심 있는 분이라면 필히 자신이 쓰는 플랫폼으로 변경해서 적용할 수 있으리라 봅니다. 


  https://goo.gl/1guuCC



Android Studio를 OSX(내 경우에는 Yosemite 나 El Capitan 버젼) 에 설치하다 보면 발생하는 에러가 다음과 같다.



종종 발생하는데 해결하는 방법은 쉽다.

$ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.7.0_xx.jdk
$ open /Applications/Android\ Studio.app

위에서 xx 는 자신의 버젼에 맞게 쓰여져야 한다. 참고로 내꺼는 25 ("jdk1.7.0_25.jdk")이다. 안전하게 .bash_profile 에 STUDIO_JDK 값을 지정해주는 것이 좋다.


  너무 거창한 이야기라고 생각합니다. 하지만 16여년 가까이 CS (Computer Science) 쪽에 있었고 또 그런 환경하에서 보고 듣고 생각한 것을 기반으로 해서 조금이라도 후배들에게 도움이 되는 방향으로 설명하고자 합니다. 더구나 이제 어떤 걸 공부해 볼 지 방향을 못잡으실 때 도움이 되실꺼라고 생각합니다. 

  '어떤 프로그래밍 언어를 공부해야 하는가?' 라는 질문은 '어떤 프로그래밍 언어가 좋은 것인가?' 라는 질문과 일맥상통하는 바가 있습니다. 그러나 '좋은' 이라는 중의적인 표현 때문에 참으로 결정하기 어렵습니다. 

  세상에 널리 퍼져서 취직하기 좋은 언어가 '좋은' 것인가? 아는 사람이 거의 없어서 특수한 목적에 꼭 필요한 언어가 '좋은' 것인가? 내가 익숙하게 쓰니까 '좋은' 것인가? 즉 자바나 C/C++ 이 과연 '좋은' 것인가? 하는 것에 관한 물음 입니다. 

  더구나 프로그래밍 언어 (Programming Language) 라는 것은 개발자들에게 있어서는 '종교'와도 같은 것이라서 함부로 이 언어가 저 언어보다 좋다고 단정적으로 말하기가 힘듭니다. 위에서도 언급 했듯이 '중의적인' 표현인 '좋음' 이라는 것이 여러가지 의미를 포함하기 때문입니다. 단적으로 단지 텍스트 에디터일 뿐인 이맥스 와 vim 사용자들의 그간 계속되어 온 전쟁(?)을 보더라도 단순한 논쟁을 넘어서 종교적인 영역과도 맞물려 있습니다. 

  그럼에도 불구하고 이렇게 글을 남기는 것은 비단 나만의 의견이 아니기 때문입니다. 비록 유명한 사람 (지금 그 분이 누군지는 잊어먹었지만..)의 뒤에 숨어서 그 분의 의견이 마치 제 의견인 양 남기는 것은 용기 없는 태도이긴 하지만 저 또한 그 분의 의견에 동감하기 때문에 이렇게 글을 남깁니다. 

  CS (Computer Science) 을 공부하고 앞으로 그 분야를 공부하거나 일을 하게될 사람이라면 적어도 5가지 종류의 언어를 익힐 필요가 있다고 합니다. 

  1. C 언어 
     C 언어는 어셈블리(Assembly) 언어가 잘 안쓰이게 됨에 따라서 가장 기계어에 가까운 시스템 언어입니다. 아시다 시피 C 언어는 온갖 유닉스의 커널을 만든 언어 이기도 합니다. 요즘 환경하에서는 컴퓨터 OS 의 기본을 이루는 근본 언어 이기 때문에 익혀야 합니다. 

  2. C++ 언어 
     C++ 언어는 C 에 가장 가까운 언어이면서 (심지어 라이브러리도 호환되게 쓸 수가 있습니다) OOP (Object Oriented Programming) 언어 입니다. 즉 쉽게 말해서 OOP (Object Oriented Programming) 언어이면서 시스템 관련된 프로그래밍을 할 수가 있는 언어입니다. 참고로 구글에서 많이 쓰는 언어기 때문에 구글에 도전하려는 분들은 익혀두셔야 할 것입니다. 

  3. Java 언어
     Java 언어는 세상에서 가장 많이 쓰이는 언어중에 하나입니다. 사실 그 이유만으로도 공부해야만 하는 가치를 지니고 있습니다. IT 에서는 가장 많이 쓰이는 (범용성이 가장 높은) 것들이 문제가 발생하더라도 해결하기 편합니다. 실례로 현존하는 거의 모든 라이브러리의 자바 버젼은 존재한다고 볼 수가 있습니다. 뭔가 만들고 싶은게 있으면 Java 쪽에서 찾아보면 이미 존재해 있을 가능성이 높습니다. 

  4. Script 언어 
     1-3 번이 알골(Algol) 계열의 언어였다면 이제부터는 그 영역에서 조금 다른 언어를 공부해야 합니다. 스크립트 언어를 공부해야 하는 이유는 어찌 보면 당연합니다. 그 놀라운 생산성은 겪어본 사람만 알 수 있습니다. 아이디어를 가지고 구체화 하는데 이보다 더 탁월한 수단이 없습니다. 너무나 많은 스크립트 언어가 있겠지만 Javascript, Python , Ruby 등을 추천합니다. 특히 파이썬은 구글쪽에 도전하시려면 익혀두시는 게 좋을 것입니다. 

  5. Functional 언어 
     예전에 OOP(Object Oriented Programming) 개념이 처음 나왔을 때 개발자들은 왜 OOP 를 공부해야 하는지 모르겠다는 이야기를 했습니다. C 만으로 모든것이 충분했는데 말이죠. 하지만 GUI 가 나오고 OOP 가 기본인 세상이 됐습니다. 그리고 Java 가 세상을 지배했습니다. 왜 Functional 언어를 공부해야 하는지 모르겠다는 분들이 많습니다. 이해합니다!! 그러나 이제 CPU 만 보더라도 코어 클락수가 수직적으로 상승하던 시대는 잠깐 주춤대고 있으며 이제 병렬적으로 양이 늘어나는 시대가 다가오고 있습니다. 이런 환경하에서 병렬 시스템 설계에 최적의 언어가 함수형(Functional) 언어인건 확실합니다. 그래서 Java 에도 이러한 개념이 추가되고 있습니다. 이러한 언어를 공부하실려면 단연코 저의 의견으로는 리습(LISP) 입니다. 리습(Lisp)이 가장 함수형 (Functional) 언어의 전형을 보여주며 가장 공부할 만한 가치가 있습니다. 최근 JVM 위에 올라가는 언어들이 인기라 클로져(Clojure) 를 공부하신다면 두마리 토끼를 잡으실 수가 있습니다. 

  이상이 공부해 볼만한 5가지 언어 또는 계열입니다. CS (Computer Science) 출신이라면 단순 개발을 잘하는 것 이상의 신기술에 대한 적합도도 중요할 것입니다. 이런 공부 기반을 바탕으로 한다면 적어도 언어 분야에서는 새로운 개념이라 어렵다는 말은 잘 안나올 것입니다.이런 목적을 위해서라도 공부해 볼것을 추천합니다. 

저는 안드로이드를 Emacs 로 개발하고 있는 중인데요. 외부 jar 가 추가 될 때 자동으로 classpath 에 추가 하고 자동으로 import 기능을 활성화 시키는 방안을 찾는 중인데, 없더군요.. 

물론 Eclipse 를 사용하면서 Google AdMob SDK 같은 외부 jar를 사용하기는 쉽습니다. 외부 라이브러리로 추가해 주면 끝이기 때문입니다. 다만 CLI (Command Line Interface) 에서 Ant 를 이용해서 빌드를 할 때는 마구 마구 귀찮아집니다. 하지만 쉽게 하는 방법이 생겼더군요. 

$(ANDROID_PROJECT_ROOT) 밑에 /libs 라는 디렉토리를 만들고 그 안에다가 GoogleAdMobAdsSdk-6.0.1.jar android-support-v4.jar 두개의 파일을 복사해줍니다. 


$(ANDROID_PROJECT_ROOT) 밑의 ant.properties 파일을 열고 다음과 같이 추가해 줍니다. 

  jar.libs.dir=libs


이제 

$ ant clean && ant debug 



해 주시면 성공적으로 바인딩 되는 것을 확인하실 수 있습니다. 

다만 위와 같이 따로 libs 를 추가해 주면 JDE 환경에서 자동으로 classpath 뒤져서 Import 해주는 기능이 libs 에 추가된 jar 에 대해서는 동작하지 않습니다. 이럴 때를 위해서 따로 함수를 만들어 뒀습니다. (100% 제가 만든것입니다 쿨럭..) 



(defun android-mode-my-hook () 
  (progn
    (and (file-exists-p 
          (concat (android-root) "/libs"))
         (setq jde-global-classpath 
               (append jde-global-classpath 
                       (directory-files
                        (concat (android-root) "/libs")
                        t "jar"))))
    ))
(add-hook 'android-mode-hook 'android-mode-my-hook)


다음과 같이 만들어 주면 됩니다. 저는 java 설정만 따로 모아놓고 쓰지만 그렇지 않으신 분들은 .emacs 파일 구석에 적어두시면 될 것입니다. 물론 jdee 와 android-mode 설정 뒤에 적어주셔야 할 것입니다. jde-global-classpath 는 jdee 를 추가 해줘야 생기는 변수고 android-root 는 안드로이드 프로젝트의 루트를 찾아주는 편리한 함수인데 android-mode 를 추가해줘야만 쓸 수가 있습니다. 

점점 lisp 으로 코딩하는게 재밌어 지기 시작합니다. ㅎㅎ 
 


    - 초간단 요약 -
    기존의 자바 서비스하고 있던 부분의 일부를 node.js 로 포팅해서 두개를 벤치마크 해 봄. 자바는 멀티코어 환경에서 테스트하고 node.js 는 cluster 를 안쓰고 단일 코어에서 (아무것도 안하면 단일코어에서 도니 ㅎㅎ) 동작시켜봄 결과는 아래와 같음 



    씨피유와 메모리는 적게 쓰지만 (훨씬 적게..) 성능은 그리 낫지 않음. 이거저거 바꿔가며 테스트를 하던중 ORM 을 지원하는 Sequelizer 가 느리다는 것을 알아냄, node-mysql 로 바꾸고 나니 바뀐 내용입니다.



단일 코어를 씀에도 불구하고 자바와 비슷하게 성능이 나오고 있습니다. 같은 하드웨어라 가정하면 node.js 에 클러스터 (cluster)를 적용한다고 한다면 자바의 거의 5배에 해당하는 효율을 보일 것으로 예상됩니다. 

   글쓴이가 올린 다음 글을 보면 , node.js 는 성능이 워낙 뛰어나고, 여러사람들이 참여하기 때문에 무섭게 성장하는 개발환경이 될것이기 때문에 주의깊게 보고 있기는 하나, 기업용으로 쓰기에는 아직 치명적인 약점이 있다고 합니다. 바로 node.js 자체의 개발 주기가 너무 짧기 때문에 오랜 기간을 개발해야 하는 기업용 환경에서는 좋지 않다는 것입니다. (개발 하는 중간에 메인 언어가 업데이트 된다고 생각해 보세요 ㅎㅎ) 그렇기 때문에 1.xx 대로 올라가서 안정화가 된다면 그 때부터 기업용으로 쓰기에 무리 없지 않을까 라고 본답니다. 물론 저자는 아주 만족한 거 같다고 하더군요. 

  저도 글쓴이의 의견에 어느정도 동의합니다. 다만 지금 버젼으로도 정말 기업용 커다란 사이트가 아닌, 간단한 기능을 제공하는 사이트를 제작하는 데에는 (특히나 App 서버로) 최고의 효율을 보이지 않을까 싶습니다. 

우분투(Ubuntu) 에 자동으로 포함되어 있는 openjdk 와 sun 의 jdk 가 미묘하게 차이가 있는 것을 알고 있습니까? 실은 저도 못 느껴본 차이긴 하지만 있다고 합니다.

무엇인가를 개발할 때 특히나 오픈소스(Open Source)를 가져다 쓸 때는 환경 문제가 특히나 중요한데, 지금 할려는 작업이 sun-jdk 를 설치해야만 하는 일입니다. 저번 포스트에서는 무지 간단하게 썼지만 막상 sun-jdk 를 설치하는 일은 한줄로 되지는 않습니다. 다섯줄 입니다.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk sun-java6-plugin


패키지를 가져오는 소스 주소를 추가해 주고 레파지토리 (repository)를 업데이트 해줍니다. 그리고 가볍게 설치를 해 줍니다. 설치가 끝났다면 이미 설치되어 있는 자바를 관리해 줄 필요가 있습니다.

$ sudo update-alternatives --config java


  Selection    Path                                      Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      auto mode
  1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        manual mode

Press enter to keep the current choice[*], or type selection number: 2

기본으로 쓸 자바를 어떤것을 선택할 것인지 지정해 주는 작업입니다. java-6-sun 을 골라주시면 되겠지요.

$ java -version


으로 검사해 보면 됩니다.



$ apt-get install java


로 한방에 끝이 납니다. 그러나 게스트OS 에서 인터넷을 쓸 수 없는 지금은 모든것을 수동으로 깔아줘야 합니다.

다음으로 이동해서 라이센스에 동의 하시고

http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u31-download-1501634.html

jdk-6u31-linux-i586.bin 를 다운 받습니다.

$ sudo mkdir /usr/java
$ sudo cp jdk-6u31-linux-i586.bin /usr/java
$ sudo su -

루트 계정으로 변경합니다.

# cd /usr/java
# ./jdk-6u31-linux-i586.bin
# exit

다시 본래 계정으로 돌아와서

$ emacs $HOME/.bash_profile

아래와 같은 내용을 맨 아래에 추가해 줍니다. (제 경우에는 파일을 새로 만들었습니다)

export JAVA_HOME=/usr/java/jdk1.6.0_31
export PATH=$PATH:$JAVA_HOME/bin

저장하고 파일을 닫고

$ source $HOME/.bash_profile
$ java -version

결과 값이

java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing)

나오면 됩니다.

이상으로 쉬운일을 어렵게 풀어나가고 있는 광이랑입니다.


자바에서 Ant 를 이용해서 다중 컴파일 할때 큰 프로젝트의 경우에는 여지 없이 메모리 에러가 발생합니다. 그럴 때는 COMMAND 프롬프트 상에서 

  set ANT_OPTS=-Xmx1024m -Xms512m


와 같이 입력하면  깔끔하게 해결됩니다.


 

+ Recent posts