2013년 12월 11일 수요일

JavaScript study 중 데이터 형, scope 관련 문법 중 특이사항 정리

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

[데이터 타입]

- undefined : 변수를 선언 후 아무 값도 지정하지 않은 상태
- null : 키워드, 객체가 아무것도 없음을 나타냄
- infinity, Nan : 숫자에서 무한한 수와 숫자가 아님을 나타냄, isFinite(), isNan() 함수로 비교 가능
- false를 나타내는 값들 : false, 0, null, undefined, Nan, ""
  : infinity인 경우 무한한 값을 나타내므로 true이다.

===, !==
 : 값을 비교하는 '==', '!='와는 달리 두 변수의 데이터 타입까지 비교한다. javascript의 변수는 대입되는 값에 따라서 데이터 형이 결정되므로 유용하게 쓰임.

&&, ||
 : || => 왼쪽 값이 참일때는 왼쪽 값을 리턴하고 거짓일 경우에는 오른쪽 값을 리턴한다.
   && => 왼쪽값이 거짓일때는 왼쪽 값을 리턴하고 참일 경우에는 오른쪽 값을 리턴한다.


var a = ("test one" || "test two"); // a is "test one"
var b = ("test one" || ""); // b is "test one"
var c = (0 || "test two"); // c is "Test two"
var d = (0 || false); // d is false
 var a = ("test one" && "test two"); // a is "test two"
var b = ("test one" && ""); // b is ""
var c = (0 && "test two") // c is 0

Advanced Javascript: Logical Operators and truthy / falsy
 데이터 타입 및 비교 관련 여러 case에 대해서 설명하고 있음.


[Scope]

- 변수를 함수내에서 var로 선언하지 않으면 전역 변수, var로 선언하면 지역변수
- Lexical 특성
 실행시, 각 문장이 참조하는 변수는 렉시컬 환경에서 정의한, 즉 "코드 그대로의 환경"을 기준으로 정의한 변수 스코프에서 검색한다.

var a = 0; 
console.log("1. a= " + a);                //==> 0

function test() {
console.log("2. a= " + a);    //==> undefined, 함수내 a가 정의되어 전역변수로 취급 안됨
var a = 1;
console.log("3. a= " + a);       //==> 1
}
console.log("4. a= " + a);               //==> 0
test();
console.log("5. a= " + a);               //==> 0

(출력)

- 변수가 저장되는 메모리 영역
 : 변수스코프(함수 내 var 변수), 프로토타입 객체(인스턴스가 상속), 공개변수영역, 인스턴스

- 프로토타입 관련

 . JavaScript에서 instantiate된 객체들이 함께 공통으로 참조하는 공간으로 모든 객체들의 속성을 변경하고자 할 경우 prototype을 수정해야 한다. 자세한 것은 아래 링크 참조

모든 Javascript 객체가 상속받는 Object 객체의 기본 속성은 다음과 같다.

Object.prototype.constructor
 : Specifies the function that creates an object's prototype.
Object.prototype.__proto__ 
 : Points to the object which was used as prototype when the object was instantiated.
Object.prototype.__noSuchMethod__ 
 : Allows a function to be defined that will be executed when an undefined object member is called as a method. 

 <!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">

function Person(name) {
this.name = name;
}

function Korean(name, city){
Person.apply(this, [name]);
this.city = city;
}

Korean.prototype = new Person();

Korean.prototype.constructor = Korean;
Korean.prototype.nationality = "korean";

var p1 = new Person("Hong");
var p2 = new Person("Kim");

p1.age = 23;
Person.prototype.species = "human";

console.log("[Person] p1");
for(var key in p1){
console.log("key=" + key + ", value=" + p1[key]);
}

console.log("\n[Person] p2");
for(var key in p2){
console.log("key=" + key + ", value=" + p2[key]);
}

console.log("\n[Korean] p3");

var p3 = new Korean("Lee", "seoul");

for(var key in p3){
console.log("key=" + key + ", value=" + p3[key]);
}

</script>
</head>
<body>

</body>
</html>

 [Person] p1
key=name, value=Hong 3_inheritance.html:32
key=age, value=23 3_inheritance.html:32
key=species, value=human 3_inheritance.html:32
key=name, value=Kim 3_inheritance.html:37
key=species, value=human 3_inheritance.html:37
key=name, value=Lee 3_inheritance.html:45
key=city, value=seoul 3_inheritance.html:45
key=constructor, value=function Korean(name, city){ Person.apply(this, [name]); this.city = city; } 3_inheritance.html:45
key=nationality, value=korean 3_inheritance.html:45
key=species, value=human 3_inheritance.html:45


Korean {name"Lee"city"seoul"nameundefinedconstructorfunctionnationality"korean"}
  1. city"seoul"
  2. name"Lee"
  3. __proto__Person
    1. constructorfunction Korean(name, city){
    2. nameundefined
    3. nationality"korean"
    4. __proto__Person
      1. constructorfunction Person(name) {
      2. species"human"
      3. __proto__Object
        1. __defineGetter__function __defineGetter__() { [native code] }
        2. __defineSetter__function __defineSetter__() { [native code] }
        3. __lookupGetter__function __lookupGetter__() { [native code] }
        4. __lookupSetter__function __lookupSetter__() { [native code] }
        5. constructorfunction Object() { [native code] }
        6. hasOwnPropertyfunction hasOwnProperty() { [native code] }
        7. isPrototypeOffunction isPrototypeOf() { [native code] }
        8. propertyIsEnumerablefunction propertyIsEnumerable() { [native code] }
        9. toLocaleStringfunction toLocaleString() { [native code] }
        10. toStringfunction toString() { [native code] }
        11. valueOffunction valueOf() { [native code] }
        12. get __proto__function __proto__() { [native code] }
        13. set __proto__function __proto__() { [native code] }

참고로 위에서 만들어진 p3 객체를 보면
name, nationality 속성을 가진 Person 객체를 prototype으로 참조하고 있고 이는
species 속성을 가지는 Person prototype을 참조하고 있고
결국은 Object 객체를 참조하고 있다.

나도 자세히는 모르겠으나 javascript prototype 검색이나 아래글 참고

[Introduction to Object-Oriented JavaScript]

[Details of the object model]

  

- 자바스크립트는 함수는 argument의 개수가 일치하지 않아도 된다.
  : Arguments 객체 => arguments.length, arguments.callee
  : 덕분에 JavaScript에서는 method overloading 불가

 <!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">
var add = function() {
var sum = 0;

//console.log(arguments.length);
for ( var name in arguments) {
sum = sum + arguments[name];
}
return sum;
}

console.log(add(1));
console.log(add(1, 2));
console.log(add(4, 6, 9, 2));

var fact = function(n) {
var self = arguments.callee;
if (n == 0) {
return 1;
} else {
return (n * self(n - 1));
}
};

console.log(fact(3));
console.log(fact(10));
</script>
</head>
<body>

</body>
</html>

[참고]

Javascript 기본 개념 설명

Javascript 특성을 잘 정리함.

렉시컬(lexical) 특성
황정식|조회 12|추천 0|2013.05.19. 19:15


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를 공부해 보고 싶은 생각이 든다..