안드로이드 Phonegap을 사용하기 위해서 폰갭 홈페이지의 가이드 문서를 그대로 따라하려는데,

create.. 즉 시작부터 막혔다.


에러메시지는 다음과 같다


...create.js(38, 5) Microsoft JScript 런타임 오류: 'length'은(는) null 이거나 개체가 아닙니다.

...create.js(38, 5) Microsoft JScript Runtime Error: 'length'is null or not an object.


create.js 파일을 열어보니 다음과 같은 내용이 있다.

function setTarget() {
    var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g);
    return targets[targets.length - 1].replace(/id: /, ""); // TODO: give users the option to set their target 
}

결국 targets 라는 객체에 length 속성이 없다는 얘긴데,

targets를 보면 android.bat list target 명령을 쉘에서 실행하여 아웃풋으로 출력되는 값 중

"id : 숫자"의 형식으로 된 문자열의 배열을 반환하도록 되어있다.

match는 일치하는 문자열이 없으면 null을 반환하므로 당연히 targets에 대해 length 속성도 없다.


그렇다면 android.bat list targets의 문제다.


콘솔에서 android.bat list targets를 실행해보니 다음과 같이 나타난다.



각종 환경을 설치할 때 C:\Program Files 아래에 둔 것은 JDK 밖에 없다.

오류 메시지에 보면 C:\Program Files 에서 Files가 끊어진 것으로보아 띄어쓰기는 인식을 못한다는 얘기고,

붙여주기만 하면 된다.


시스템 설정의 환경 변수 설정에서 JAVA_HOME의 경로 설정에

양 끝에 큰 따옴표(")만 붙여 주어 위 문제를 해결할 수 있었다.



'머리가 뛰다' 카테고리의 다른 글

Behavior-Driven-Development BDD?  (0) 2013.02.22
Redmine 설치기  (0) 2013.02.16
구글느님 다 해쳐드세영.. ㅠㅠ  (0) 2012.11.06
자바스크립트는 보면 볼수록 상콤하다.  (0) 2012.10.25
iBatis Result Mapping...  (0) 2012.09.13

못하는 게 머래냐..


웹페이지에서 구글 웹폰트 사용

https://developers.google.com/webfonts/


구글 웹폰트

http://www.google.com/webfonts


대략 5백 40여개의 영어 폰트가 지원된다.

한글 폰트가 없는게 어찌보면 당연하지만 아쉬운 대로 사용하기 좋은 듯하다

'머리가 뛰다' 카테고리의 다른 글

Redmine 설치기  (0) 2013.02.16
Phonegap create 오류  (0) 2012.11.25
자바스크립트는 보면 볼수록 상콤하다.  (0) 2012.10.25
iBatis Result Mapping...  (0) 2012.09.13
한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13

일단 자바스크립트를 배울 때 좋은 점이라면,

괜찮은 구성의 사이트에서 쉽게 소스코드를 볼 수 있고 크롬에서 바로 써볼 수도 있다는 것.


이 사이트 저 사이트 뒤적 뒤적거리면서 다니다가.

구글 애널리스틱스 코드 실행 부분 모양이 대충..

(function() {
      // 코드
})();


?? 함수를 바로 실행하는 코드를 저렇게 쓰는구나..싶었다.

음.. 그럼 익명 함수에 이름을 붙이면 재사용이 되는지, 괄호에 의한 지역성으로 삭제되는지 테스트를 해봤다.

(function test(){
      alert("hello?");
})();

test();

test는 정의되지 않았다고 에러메시지가 뜬다.



음.. 그럼 this를 리턴해서 따로 저장해야하나?


var f = (function test(){
      alert("hello?");
      return this;
})();

f();

/_-)/ 맹 안된다.

this가 DOMWindow로 되어있다.. 아아..

test.this는? 이건 오류난다.


그냥 함수 이름인 test를 반환해 보았다.


var f = (function test(){
      alert("hello?");
      return test;
})();

f();

오호.. 이건 된다. 그래서 f()()()()()();를 했더니 계속된다.

test 함수가 클로저가 된 셈인듯..?



결론은 함수 정의와 동시에 실행하면서 참조 할 수 있게 변수에 저장이 된다. 음 역시 쓰면 쓸수록 상큼해.

자바와는 또 다른 재미가 있다.



자바스크립트 공부 좀 제대로 해야겠다. 

'머리가 뛰다' 카테고리의 다른 글

Phonegap create 오류  (0) 2012.11.25
구글느님 다 해쳐드세영.. ㅠㅠ  (0) 2012.11.06
iBatis Result Mapping...  (0) 2012.09.13
한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
부분 집합 구하기  (0) 2012.05.16

아무래도 테이블 구조를 간단하게 하려다보니.. 결국 문제가 터졌다.


친구 관계 정보를 가진 테이블의 컬럼은


INT FRIEND_SEQ

VA(20) REQUEST_USER_ID

VA(20) TARGET_USER_ID

DATE REQUEST_DT

DATE APPROVE_DT

VA(1) APPROVED_YN


친구 관계는 내(로그인 사용자)가 친구 요청을 했을 수도 있고, 내게 온 친구 요청을 수락한 경우도 있다.

이걸 직관적으로 내 친구들만 모으려고 하니 SQL을 잘 모르는 상태에서 저기서 친구들만 꺼내오려고 하다가

골치 좀 썩인 것 같다.

WHERE 절에서 두개의 SELECT문.. 하나는 


SELECT f.target_user_id FROM tb_friend f WHERE f.request_user_id = #loginUserId#


또 다른 하나는


SELECT f.request_user_id FROM tb_friend f WHERE f.target_user_id = #loginUserId#



이 두개 결과를 OR로 하여 중복제거하고 친구 목록을 가져왔는데, 잘 몰라도 이건 아니다 싶어 조인으로 할 방법을 찾아서 바꿨다.


SELECT

   ...

FROM

   tb_friend f

   LEFT JOIN tb_user u ON u.user_id =

      CASE

         WHEN f.request_user_id = #loginUserId#

            THEN f.target_user_id

         ELSE f.request_user_id

      END

   ...

WHERE ...


이렇게 해결 할 수 있었다.

SQL을 겉핥기로 배우다보니.. 저게 퍼포먼스상에 문제가 있는지 어떤지는 더 공부해야지.




두번째 멘붕은 저렇게 만든 쿼리를 Oracle SQL Developer에서 날려서 테스트 했을 때는 정상적으로 잘 동작하고,

프로젝트 내에서도 ResultSet까지는 정상적으로 잘 만든다.


근데 NullPointerException이 계속 발생.. 문제는 iBatis를 이용해서 디버깅이 어렵다(내게는 ㅠ)


ResultSet과 ResultMap Class 사이에서 매핑을 하면서 발생하는 문제였는데.. 하도 안풀려서 멘토님께 여쭤봤더니.


"혹시 모델 클래스에 int 타입 있어? 결과값이 null일 때는 int로 변환할 수 없어서 그럴거야."


!

!!!


정확하셨다. 

해결. 으앙

근데 해결하자니 또 쿼리문이 지저분해져서 이대로 써도 될런지 모르겠다. 

쿼리문이 하드코딩이다.. -_-







+ 추가

어제 멘토님이 하신 말씀 중에 NVL을 못들어서... 아침에 듣곤 허탈하고 해탈한 웃음만 하하..

무식하면 몸이 고생이라더니, 딱 그짝이다.. ㅠㅠ

이랬던 쿼리가!

SELECT

f.friend_seq friend_seq,

f.request_user_id request_user_id,

f.target_user_id target_user_id,

f.request_dt request_dt,

f.approve_dt approve_dt,

u.user_id user_id,

u.user_name user_name,

u.email email,

u.mobile_no mobile_no,

u.nickname nickname,

u.profile_image_path profile_image_path,

p.play_type_code play_type_code,

c.user_id channel_user_id,

s.song_seq song_seq,

s.song_title song_title

FROM

tb_friend f

LEFT JOIN tb_user u ON u.user_id = 

CASE

WHEN f.request_user_id = #userId#

THEN f.target_user_id

ELSE f.request_user_id

  END

  LEFT JOIN tb_playing p ON p.user_id = u.user_id

LEFT JOIN tb_channel c ON c.channel_seq = 

CASE

WHEN p.channel_seq IS NULL

THEN 0

ELSE p.channel_seq

END

LEFT JOIN tb_song s ON s.song_seq =

CASE

WHEN p.song_seq IS NULL

THEN 0

ELSE p.song_seq

END

WHERE

(f.request_user_id = #userId# OR f.target_user_id = #userId#) AND f.approved_yn = 'Y'


이렇게 바뀌었다.

SELECT

f.friend_seq friend_seq,

f.request_user_id request_user_id,

f.target_user_id target_user_id,

f.request_dt request_dt,

f.approve_dt approve_dt,

u.user_id user_id,

u.user_name user_name,

u.email email,

u.mobile_no mobile_no,

u.nickname nickname,

u.profile_image_path profile_image_path,

p.play_type_code         play_type_code,

c.user_id channel_user_id,

NVL(s.song_seq, 0) song_seq,

s.song_title song_title

FROM

tb_friend f

LEFT JOIN tb_user u ON u.user_id = 

CASE

WHEN f.request_user_id = #userId#

THEN f.target_user_id

ELSE f.request_user_id

  END

  LEFT JOIN tb_playing p ON p.user_id = u.user_id

LEFT JOIN tb_channel c ON c.channel_seq = p.channel_seq

LEFT JOIN tb_song s ON s.song_seq = p.song_seq

WHERE

(f.request_user_id = #userId# OR f.target_user_id = #userId#) AND f.approved_yn = 'Y'



엉엉


간단하게 NVL함수에 대해 정리하자면

어떤 컬럼의 값이 널인 경우에 다른 값으로 대체하는 것을 말한다.


NVL(컬럼명, 대체할 값) 의 형식으로 사용하고 필요하다만 앨리어싱 하면 된다.


NVL은 오라클 DB에서 사용할 수 있고, MySql에서는 동일한 기능을 가진 ifnull 함수가 있다.


소프트웨어 프로젝트 결과보고서를 작성하는데 XML 이라는 문구가 들어가야 하는데,

사전에 XML이 등록되지 않은 모양인지 XML쓰고 공백을 주면 자꾸

''로 변환이 된다. 순간 혈압 상승.. ㄱ-


환경 설정에 들어가봐도 한영 전환에 대한 내용은 없다.

환경 설정이 아니라 [도구(K)] >> [글자판(K)] >> [한영 자동 전환 해제(A)] 를 눌러 체크를 해제하도록 하면된다.


한영 자동 전환 해제

[도구(K)] >> [글자판(K)] >> [한영 자동 전환 해제(A)]



'머리가 뛰다' 카테고리의 다른 글

자바스크립트는 보면 볼수록 상콤하다.  (0) 2012.10.25
iBatis Result Mapping...  (0) 2012.09.13
부분 집합 구하기  (0) 2012.05.16
무료 공공 택시 문제  (0) 2012.05.11
Array Copy.........  (0) 2012.05.08

문제 설명 파일

subset.hwp


샘플 파일

test.inp

test.out


'머리가 뛰다' 카테고리의 다른 글

iBatis Result Mapping...  (0) 2012.09.13
한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
무료 공공 택시 문제  (0) 2012.05.11
Array Copy.........  (0) 2012.05.08
프로그래밍을 위해 필요한 공부  (0) 2012.05.07

2학년 자료구조 수업 문제를 낼일이 있어서 우선순위 큐(힙)을 이용해서 내본 문제


문제 파일 :

ds_assignDoc8.hwp


샘플 입력, 출력 파일 :

test.inp

test.out


시뮬레이션 프로그램(Visual C# 2010 환경에서 작성, .Net 4.0 이상 필요)

FreeTaxi.exe


'머리가 뛰다' 카테고리의 다른 글

한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
부분 집합 구하기  (0) 2012.05.16
Array Copy.........  (0) 2012.05.08
프로그래밍을 위해 필요한 공부  (0) 2012.05.07
Let me google that for you  (1) 2012.05.01

같은 입력 데이터에 세가지의 처리를 해야할 일이 있어서,


처음에 입력 데이터를 입력받아서 배열로 만든 후,


아무런 생각없이 Arrays 클래스의 copyOf 메서드를 이용해서 나머지 두개의 카피 배열을 만들었다.


분명 로직은 샐 틈이 없는데, 알 수 없는 이유로 프로그램의 흐름이 이상해져서


몇시간 째 코드를 뚫어져라 보다가 정말 '아!' 하는 생각이 머릿속을 스치고 지나갔다.


배열 복사는 Shallow Copy..............

같은 레퍼런스를 쓰니 당연히 값이 틀어질 수 밖에..... 악!!


좋은 교훈을 얻었다. 덤으로 continue 단 한줄의 교훈도 


'머리가 뛰다' 카테고리의 다른 글

한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
부분 집합 구하기  (0) 2012.05.16
무료 공공 택시 문제  (0) 2012.05.11
프로그래밍을 위해 필요한 공부  (0) 2012.05.07
Let me google that for you  (1) 2012.05.01

개인적으로 컴퓨터 공학을 전공하면서, 프로그래밍을 위해 필요한 공부가 무엇인지 정리해 보았습니다.

아직 학생이고, 실무경험이 없다보니 현실과는 동떨어진 얘기를 할 수도 있습니다. 언제나 태클 환영입니다.


1. 수학

중학교 때부터 게임에 빠져서 공부는 저만치 뒷전이었습니다.

오죽하면 공부하라고 해줬던 빨간펜도 몇달이나 손도 한번 안대고 잔뜩 쌓여서는 부모님께 죽도록 맞았을까요.

심지어 게임만 한다고 인터넷을 끊거나 컴퓨터를 버린 적도 있습니다.

지금 생각하면 정말 사무칠 정도로 후회됩니다만, 되돌릴 수 없으니 그 후회를 되돌릴 만큼 지금 열심히 해야겠죠.

어쨌거나, 게임으로 인해 고2까지도 공부는 시험 당일치기 밖에 없었는데,

과학은 좋아해서 그나마 수업시간에도 따라갈 수 있었고, 다른 과목도 그럭저럭 해왔는데,

수학만큼은 한번 놓치고 나니 정신을 차렸을 땐 도무지 뒤쫓아 갈 수가 없더군요.

그나마 희한하게도 미분, 적분은 좋아해서 고거 하나는 찔끔 할 줄 알고,

나머진 그냥 경험에 의한 문제 풀이 정도가 다네요.

일단 지금까지 프로그래밍을 하면서 수학적인 개념이 없어도 크게 문제될 것은 없었지만,

탄탄한 수학 이론이 바탕이 된 프로그래밍은 프로그램에 날개를 달아준다고 생각합니다. 

논리적인 사고를 할 수 있게 해주고, 효율적인 알고리즘을 작성하게 해줄 수 있는게 수학 지식에서 비롯되죠.

즉, 본인도 적은 노력으로 프로그래밍을 할 수 있고, 프로그램도 효율적으로 동작할 수 있게하므로

경제성이 올라간다고 생각할 수 있겠네요.



2. 영어

영어공부요? 저도 싫어합니다. 좋은 우리말 두고 영어 공부하긴 정말 싫죠.

잘하고 싶은 욕심은 납니다. 하지는 않고서 말이죠.

객기일지도 모르겠지만 토익, 오픽 이런 스펙보단 제 적성, 제가 하고 싶은 일을 따라가자는 주의입니다.

그런 핑계로 영어 공부를 소홀히 하고 있었는데, 공부를 깊이 하면 할 수록 성적을 위한 영어가 아니라,

지식을 습득하기 위한 영어가 정말로 필요하다고 느껴집니다.

프로그래밍 언어가 한국에서 시작했으면 모를까, 컴퓨터도 그렇고 프로그래밍 언어도 그렇고

영어권 국가에서 시작한게 많다보니 퀄리티 높은 정보나 깊이 있는 정보들은 영어로 되어있는게 많습니다.

그렇다보니 자연스럽게 영어 실력이 절실해지더군요.

헌데 아직도 영어는 뒷전이네요. 말만 필요하다 필요하다. 언제부터 시작할까요? 


'머리가 뛰다' 카테고리의 다른 글

한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
부분 집합 구하기  (0) 2012.05.16
무료 공공 택시 문제  (0) 2012.05.11
Array Copy.........  (0) 2012.05.08
Let me google that for you  (1) 2012.05.01


얼마 전 검색을 하다가 어느 분이 질문에 대한 답변을 http://www.lmgtfy.com/?q=android 이런 식으로 해두셨다.


링크를 따라가면 뭔가 있으려니 했는데 구글링을 대신 해주는 사이트.


lmgtfyLet me google that for you의 줄임말로, 직역하면 "널 위해 구글링 해주마"이다.


네이버의 지식in의 프로그래밍 카테고리의 질문에 가끔씩 답변 해주곤 하는데,

검색만 해도 수없이 많은 자료가 나올 것을 굳이 질문으로 올리시는 분들이 많다.

그런 분들에게 검색이라도 한번 해보세요. 라고 말하고 싶은데,

그것에 부합하는게 lmgtfy이다.


"검색이나 좀 해보고 와" 라고 말하고 싶을 때는

http://www.lmgtfy.com/?q=쿼리 요렇게 한번 답변 해보자.


쿼리에 공백이 들어가는 경우에는 공백을 + 기호로 바꾸어 표시하면 된다.


즉 let me google that for you가 검색어인 경우에는

http://www.lmgtfy.com/?q=let+me+google+that+for+you 와 같이 하면 된다.




'머리가 뛰다' 카테고리의 다른 글

한글 2010 한영 자동 전환 해제하기  (0) 2012.06.13
부분 집합 구하기  (0) 2012.05.16
무료 공공 택시 문제  (0) 2012.05.11
Array Copy.........  (0) 2012.05.08
프로그래밍을 위해 필요한 공부  (0) 2012.05.07

+ Recent posts