2013년 12월 7일 토요일

Secure RESTful web service (HTTPS, SSL를 사용하는) 접속 방법

이전 블로그에서 이전 함 (원본 글 2013/12/07 작성)

한줄로 말해 
HTTPS 프로토콜로 접속을 해야 하는 RESTful web service를 위한 접속 방법에 대한 설명 (jersey를 사용)

자세한 것은 아래 링크에서 읽어 보면 되며 ....

Calling / Invoking Secure RESTful Web Service over HTTPS with JAX-RS in Java without Keystore & Truststore Information
 Posted by MyBhavesh on Dec 25, 2012 in Technical Blog | 0 comments
 The article is written for/using J2SE 6, Jersey 1.1.4.1 and Eclipse IDE for Java EE Developers [Ganymede].

그냥 마지막 샘플 코드를 수정해서 사용하면 ok 일듯..

다른 예제들을 찾아보긴 했는데 여기 예제가 제일 깔끔한듯하다. (Stackoverflow에서 무슨 공격에 취약해 질 수 있다는 보안 관련 언급이 있었는데 찾지는 못해서 적지는 못했음.)
SecureRestClientTrustManager, SecureRestClient 를 머지하고 jersey client만 생성하는 helper class로 수정 함.

 public class SSLClientHelper {

public static ClientConfig configureClient() {
TrustManager[ ] certs = new TrustManager[ ] {
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
}
};
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(null, certs, new SecureRandom());
} catch (java.security.GeneralSecurityException ex) {
}
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

ClientConfig config = new DefaultClientConfig();
try {
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(
new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}, 
ctx
));
} catch(Exception e) {
}
return config;
}

public static Client createClient() {
return Client.create(SSLClientHelper.configureClient());
}
}

  Client client = null;
WebResource webResource = null;
JSONObject object = null;

try{
ServiceFind er.setIteratorProvider(new AndroidServiceIteratorProvider<Object>());

client = SSLClientHelper.createClient();
webResource = client.resource(wimple.getServicehost() + path);
ClientResponse response = webResource.type("application/x-www-form-urlencoded").post(ClientResponse.class, params);
String output = response.getEntity(String.class);
..... 생략....

 
* 참고로 Android에서 jersey를 사용하려면 아래의 글을 참고하여 추가 적인 helper class를 사용할 필요 있음.


2013년 12월 5일 목요일

테크니컬 리더 : 혁신, 동기부여, 조직화를 통한 문제 해결 리더십, #1

이전 블로그에서 이전 함 (원본 글 2013/12/05 작성)


 
테크니컬 리더 : 혁신, 동기부여, 조직화를 통한 문제 해결 리더십
제럴드 M. 와인버그 저/조승빈 역 | 인사이트(insight) | 원서 : Becoming a Technical Leader: An Organic Problem-Solving Approach


코딩 호러의 이펙티브 프로그래밍 책을 보고 읽기 시작한 책이다. (http://imhallower.blog.me/90178246899)

아직 다 읽지는 못했지만 
책에서는 제목과는 달리 테크니컬한 리더에 대한 설명 보다는 
리더의 정의에 대해서 다시 한번 생각 할 수 있게 해주고  "한달 만에 리더되기" 와 같은 방법이 아닌 리더가 되기 위한 기초를 다질 수 있는 방법이나 동기부여를 주기 위한 방법들이 있는 것 같다.
자세한 것은 더 읽어봐야 하겠지만 읽을 수록 흥미 있고 동기부여되는 책임은 틀림없음...

아래는 책에서 읽고 인상 깊은 조각들을 되새김 차원에서 내 의견들을 정리함.

---------------------------------------------------------------------------------

p.52, MOI 리더십 모델
M: 동기부여 motivation - 위협하거나 보상하거나, 밀거나 당겨서 관련 있는 사람을 움직이도록 만드는 일
O: 조직화 organization - 아이디어 실현이 가능하도록 만드는 구조
I: 아이디어 ideas 또는 혁신 innovation - 씨앗, 실현될 것의 이미지

=> 이 책에서 전반적인 챕터에서 설명하고 있는 항목들로 혁신을 위한 리더의 덕목이라 말하고 자기 사례를 드는데 reasonable 하고 나도 계속 기억하며 실천하는게 좋겠다.


p.54, 테크니컬 리더의 특징
- 문제를 이해하기
- 아이디어의 흐름을 관리하기
- 품질을 유지하기


p. 61, 명세서를 매우 주의 깊게 읽는다.
"문제 해결형 리더는 이 사실을 잘 알기 때문에 세부 사항에 주의를 기울인다. 이와 반대로, 해커는 괜찮은 해결책을 찾아내자마자 지루해 하며 바로 다른일을 하고 싶어 한다."

=> 나도 문제에 대해서 근본적인 원인 및 발생 원인을 찾기 보다는 무턱대고 회피책이나  간단한 fix만 생각 했었고 재발에 대해서는 별로 생각하지 않았었다. 책에서 말하는 내용과는 좀 다른 논점이지만 무엇을 하던 정확한 이해 위에서 모든 개발이 이뤄져야 한다고 생각한다..


p.84, 협곡에서 살아남아야 한다.

"이런 메타 학습을 이루려면 먼저 협곡에서 살아남아야 한다. .. 옛 친구들 중에는 첫 번째 고원으로 다시 돌아가서 끊임없이 자신의 어셈블리 언어 코딩 실력을 갈고닦아 나름대로 잘 지내는 사람도 있다...."

=> 챕터에서 위와 같은 그림을 보여 주며 성장에 있어서는 연습으로 인한 실력 축적, 협곡으로의 추락, 도약 과 같은 순환을 가직 된다고 하는데 맞는 말 인것 같다. 협곡을 피하면 성장이 없을 것이고 그것은 도태로 이어질 것이다.


p.89, 조직의 원동력과 리더쉽
운영체제의 성격을 잘못 이해하고 있는 소프트웨어 관리자는 별로 없겠지만, 사람이 포함된 시스템에 대해서는 오해하는 관리자는 많다. "팀의 생산성이 충분하지 못하면 관리자는 이렇게 판단한다. '리더쉽을 발휘하지 못하는 사람을 교체하면 돼. 그러면 팀은 더 빠른 속도로 일할 수 있을 거야.'"

=> 맞는 말... 강압적으로 향상시키더라도 얼마지나지 않아 반토막..


p.93, 나는 리더 유형이 아니다.
여러분은 스스로를 리더에 적합한 유형이 아니라고 생각할 수 있다. ... 나는 내가 이미 러더가 되어 있다는 사실을 알아 차리지 못했는데, ... 이것은 동기부여에 의한 리더십도 아니고, 조직화에 의한 리더십도 아니다. 그것은 혁신에 의한 리더십, 즉 조직이 일을 완수하는 방법에 새로운 기술을 더하는 것이다.

=> 나도 내가 리더가 될 수 없다고 생각하는데.. 장점과 단점을 곰곰히 다시 생각해볼 필요가 있겠다.


p.96, 성장에 대해서
문제 해결형 리더는 자신이 변화의 어떤 단계에 있더라도, 순수한 기술 혁신 리더를 영웅으로 생각하는 마음이 여전히 남아 있다. ... 기술력이 약해졌음을 인정한다는 것이 스스로에게 얼마나 고통스러운지 잘 알고 있다. ... 굉장히 힘들고 어려운 오르막을 만날 때에는, 불가피한 상황이 아니라면 결코 다시 변화를 추구하지 않겠다고 맹세하는 일도 있다. ... 달성하고자 하는 목표가 없다면 어떤 리더십 스타일이 더 좋다고 할 수 없다. ... 다시 한번 강조하지만, 리더가 되기 위해 꼭 책임자가 될 필요는 없다. 


p.109,


p.119, 혁신을 방해하는 세 가지 큰 장애물
1. 자신에 대한 무지 : 자신의 행동을 보지 못하고, 그 때문에 변화의 기회가 사라진다.
2. 문제 없어요 증후군 : 자신은 이미 모든 문제의 답을 알고 있다고 스스로 믿는다.

=> 3번도 있는데 난 잘 동의가 가지 않아서.. 1, 2번을 나에게서 쉽게 볼 수 있음. 

p.124, 동기부여 테스트
지금부터 시작해서 3개월간, 매일 5분씩 일기를 작성한다.

=> (TODO) 한번 써보자
  
p.137, 해결책에 관해
모든 문제에는 아직 아무도 찾아내지 못한 다른 해결책이 존재한다.

=> 진짤까?


p.139, 
훔치는 행위에는 한 사람의 아이디어를 훔치는 것(이것을 '표절'이라고 한다.)과 많은 사람들의 아이디어를 훔치는 것(이것은 '조사'라고 한다.)이 있다. ... 내가 좋아하는 또 한가지 요소는 오해하는 능력이다. 아이디어를 훔칠 때 잘못 가져오는 경우가 있는데, 때때로 그 오류가 가장 창조적이고 가치 있는 부분이 되기도 한다. 원래 아이디어를 낸 사람에게 훔친 아이디어를 변형해서 돌려주기도 하는데, 그 사람이 거기에서 대단한 가치를 찾아내는 경우도 있다.

=> 긍정적인 말이긴 하지만 공식적으로는 쉽게 피력할 수 없는 의견인듯. 개인적으로는 맞다고 보고 개인 개발 측면에서 나도 이렇게 하려고 한다. 

p.151, 중요한 것은 사건이 아니라, 사건에 대한 반응이다.
토니는 자신의 이력선에 '롤러코스터'라는 이름을 붙였다. ... 한 가지 재미있는 사실은 이력선에 있는 동일한 사건에 대해서 어떤 사람은 정점으로 생각하고 어떤 사람은 밑바닥으로 생각한다는 것이다. 

=> 가까이서 보면 비극이지만 멀리서 보면 희극이라는 말이 있듯이 저런 과정을 통해 사람이 성장하는 것 같다. 그때는 고통스럽겠지만


p.155, 성공한 테크니컬 리더는 모두 개인 비전이 있다는 점이다.
p.157, 비전이 없는 사람은 다른 사람들에게 큰 영향을 미치지 않는다. 

=> 맞는말 특히나 윗사람들이 비전을 제시하지 못하고 밑에서 제시하기를 바란다면 그건 암울한 조직인것 같다.

2013년 12월 4일 수요일

arduino IDE ubuntu 설치

이전 블로그에서 이전 함 (원본 글 2013/12/04 작성)

arduino 사이트


arduino IDE 및 기타 등등 설치 방법
1. Ubuntu 클릭
2. 맞는 버전에 맞춰 설치

난 12.04 이므로 아래 명령어만 실행 하면 OK

sudo apt-get update && sudo apt-get install arduino arduino-core   

3. 설치 완료 후 콘솔에서 arduino를 실행 하면 IDE가 뜬다.

~$ arduino 

* arduino board를 컴터에 연결 된 상태에서 IDE의 Tools > Serial port 에 연결이 표시 되지 않는다면 한번 컴터를 재부팅 해보길 


아니면 executable을 다운 받아 실행하는 방법도 있음.

아래에서 맞는 버전 다운 받고 압축 해제 해서 실행하면 OK

혹시나 Ubuntu 12.04 에서 arduino IDE 실행 시 아래 메시지가 나온다면

Exception in thread "main" java.lang.ExceptionInInitializerError
at processing.app.Preferences.save(Preferences.java:735)
at processing.app.Preferences.init(Preferences.java:249)
at processing.app.Base.main(Base.java:117)
Caused by: java.awt.HeadlessException
at sun.awt.HeadlessToolkit.getMenuShortcutKeyMask(HeadlessToolkit.java:234)
at processing.core.PApplet.<clinit>(Unknown Source)
... 3 more

=> defualt jre를 설치하시라 (sudo apt-get install default-jre)

http://forum.arduino.cc/index.php/topic,199316.0.html

2013년 12월 2일 월요일

C++ 컴파일 시 C++ mode 변경하기

이전 블로그에서 이전 함 (원본 글 2013/12/02 작성)

C++ 0x 문법 관련해서 아래와 같은 메세지가 나오며 컴파일이 되지 않을 때

XXXX are not allowed in C++98 mode

해결 방법은 의외로 간단하다.

: 아래와 같이 compile 옵션 추가 필요.

Use the -std=c++0x option.

gcc only supports range for loops since version 4.6, so your 4.6.1 should be all right. Your program works for me on linux with gcc 4.6.2.

2013년 12월 1일 일요일

코딩을 지탱하는 기술 : 원리로 깨우치는 프로그래밍 기법

이전 블로그에서 이전 함 (원본 글 2013/12/01 작성)


   

코딩을 지탱하는 기술 : 원리로 깨우치는 프로그래밍 기법
니시오 히로카즈 저/김완섭 역 | 비제이퍼블릭(BJ퍼블릭) | 원제 : コ-ディングを支える技術


책의 난해한 디자인과 20년전에 결정된듯 한 책 이름 때문에 고민을 하다가 다소 저렴한 가격 때문에 온라인에서 바로 구매 했었다.

책의 저자는 생각보다 젊은 일본인(http://www.nishiohirokazu.org/)이고 여러 언어에 익숙한 것으로 보인다. 책에서는 다양한 소재의 내용을 다루는데 컴퓨터 개론 책을 보는 듯한 생각이 들기도 한다. (데이터 형 부터 에러처리, 그리고 문자 encoding에 대해서 다룸.)  

책에서는 컴퓨터 관련 학문에서의 기본적인 개념들을 다루고 있고 이를 여러 언어들을 사용하여 설명해 주고 있다. 일반적으로 컴퓨터를 처음 접하거나 컴퓨터 관련 학문을 배우기 시작한 사람들을 대상으로 하는 책으로 보이며 이 책을 읽고 관심있는 부분(컴퓨터 언어, 데이터 구조, 알고리즘, 멀티 쓰레드 프로그래밍, 객체 지향 고급 등)에 대해서 가지를 치듯 선택하여 공부하는 것이 좋을 것으로 보인다. 다만 아쉬운 점은 원리를 강조하거자 한건지는 모르겠지만 원리에서 그칠뿐이라 관련 서적이나 분야를 소개해줘도 좋았을 것 같다.

단순히 학교나 책을 통해 컴퓨터 언어를 공부할 때는 문법을 외우고 특정 예제를 소개하며 "XXX 만드는 법", "XXX 만들어 보기" 같은 것을 만들어 보며 배우는 경우가 많은데 사실 왜 이런 문법을 사용해야 하는지, 왜 그런 현상이 발생하고 노하우를 사용해야 하는지에 대해서 궁금한 점이 많은데 이 책이 그런 부분에 대한 실마리를 주지 않을 까 생각해 본다.

이 책을 보며 생각해본 TODO 들은 없으나... LISP를 공부해 보고 싶은 생각이 든다..

2013년 11월 13일 수요일

Android Span, SpannableStringBuilder

이전 블로그에서 이전 함 (원본 글 2013/11/13 작성)

TextView에 입력되는 글자의 style을 바꾸거나 bitmap 등을 추가하고 싶을 경우
Style Span을 사용하여 해결 할 수 있음.

일단 Android developers site에서 확인하면 
CharSequence를 상속받은 Spanned interface가 있고 이것을 상속받는 놈들 중 대표적인 것은 markup 처리를 위한 Spannable interface, text 처리를 위한 Editable interface 가 있다. (사실 자세한 차이를 모르겠다. textview에 html을 입력할때와 일반 character sequence를 입력할 때를 내부적으로 구분해서 처리하는 것 같은데.. 뭐 app 개발자는 SpannableString만 사용하면 되니..)

[Spanned]
 : Spanned interface에 대한 설명, 그리고 Span 생성 시 사용되는 Constants 설명이 있음.

그리고 일반적으로 SpannableString을 만들기 위해서 SpannableStringBuilder가 있다.

[SpannableStringBuilder]

일단 StringBuilder로 text style을 설정하는 간단한 예제는 다음과 같음.

String dispStr = "I'm the first line\nI'm the second line";
        TextView tv = (TextView) findViewById(R.id.textView1);
        int startSpan = dispStr.indexOf("first");
        int endSpan = dispStr.indexOf("line");
        Spannable spanRange = new SpannableString(dispStr);
        TextAppearanceSpan tas = new TextAppearanceSpan(this, android.R.style.TextAppearance_Large);
        spanRange.setSpan(tas, startSpan, endSpan, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(spanRange);

아래는 bitmap 추가하는 예제
SpannableStringBuilder sp = new SpannableStringBuilder("strings, strings");
Bitmap bp = DrawableBitmapCache.getBitmap(url, 500, 500);
sp.setSpan(new ImageSpan(context, bp), 5, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


사용할 수 있는 style span들은 아래 링크에 나열 되어 있음.
모든 Span에 대해서 설명은 없지만 googling 해보면 다 나올 듯.


AbsoluteSizeSpan 
AlignmentSpan.Standard 
BackgroundColorSpan 
BulletSpan 
CharacterStyleThe classes that affect character-level text formatting extend this class. 
ClickableSpanIf an object of this type is attached to the text of a TextView with a movement method of LinkMovementMethod, the affected spans of text can be selected. 
DrawableMarginSpan 
DynamicDrawableSpan 
EasyEditSpanProvides an easy way to edit a portion of text. 
ForegroundColorSpan 
IconMarginSpan 
ImageSpan 
LeadingMarginSpan.StandardThe standard implementation of LeadingMarginSpan, which adjusts the margin but does not do any rendering. 
LocaleSpanChanges the Locale of the text to which the span is attached. 
MaskFilterSpan 
MetricAffectingSpanThe classes that affect character-level text formatting in a way that changes the width or height of characters extend this class. 
QuoteSpan 
RasterizerSpan 
RelativeSizeSpan 
ReplacementSpan 
ScaleXSpan 
StrikethroughSpan 
StyleSpanDescribes a style in a span. 
SubscriptSpan 
SuggestionSpanHolds suggestion candidates for the text enclosed in this span. 
SuperscriptSpan 
TabStopSpan.StandardThe default implementation of TabStopSpan. 
TextAppearanceSpanSets the text color, size, style, and typeface to match a TextAppearance resource. 
TypefaceSpanChanges the typeface family of the text to which the span is attached. 
UnderlineSpan 
URLSpan 

좀 더 자세한 실 예제는 아래를 참고하면 된다.

[TextView - SpannableStringBuilder 를 이용한 스타일 설정 |작성자 김동학]

[Introduction to Spans]

2013년 11월 2일 토요일

RD tabs - Ubuntu xrdp 원격접속 프로그램 추천

이전 블로그에서 이전 함 (원본 글 2013/11/02 작성)

Ubuntu를 Windows에서 원격 접속하고자
Ubuntu에 xrdp를 설치하고 윈도우즈 '원격 데스크탑 연결'을 사용하였으나 

원격 데스크탑 사용 후 윈도우즈 어플리케이션을 사용하려고 하다보면
윈도우즈키, alt, ctrl 키가 눌려있는 상태로 전환이 되는 경우가 있어
갑자기 화면이 사라지거나 윈도우즈 상태표시줄의 프로그램들이 실행되는 경우가 있음.

그래서 다시 RDP client를 찾던 중 

RD Tab이라는 것을 찾게 되어 사용하고 있는데 
원격 데스크탑 연결의 대부분의 기능을 지원하고 탭으로 여러 remote client를 관리할 수 있고
위에서 겪었던 현상이 없어서 사용하는데 꽤 괜찮음.

RD Tabs