- Java ME
- MSA
- CLDC-HI
- NetBeans
- Python
- Web technology
- Firefox technologies: JavaScript, DOM, XML, XSLT and etc...
- Self paced projects
목요일, 10월 26, 2006
현재 나의 관심사들
화요일, 10월 24, 2006
월요일, 10월 23, 2006
목요일, 10월 19, 2006
TDD (Test Driven Development)
켄트 백이 집필한 테스트 주도 개발이란 책을 보았다.
예전 부터 XP나 TDD에 관심을 가지고는 있었지만 책도 제대로 본적이 없고 어렴풋하게 그게 뭐겠구나 생각만 하고 있었으므로 이 책이 좀더 탄탄한 지식을 쌓는데 도움이 되었다.
TDD를 단순히 코드 개발 시 검증을 쉽게 하기 위한 방편으로 생각하고 있었는데 책을 읽고 나니 소프트웨어 개발의 주기를 관리하기 위한 하나의 방법론처럼 느껴진다. (아직, TDD를 사용해본적도 없고 달랑 책 한권을 출퇴근시간에 살펴본 것이니 무리한 결론은 금물!)
어떤 책이든 달랑 읽기만하고 심사숙고 해보지 않거나 실 생활에 적용해보지 않으면 별 소용이 없듯이 TDD 역시 내 스스로 절차탁마해보지 않고는 이게 어떤 것인지 알 수 없을 것이다. TDD 관련 자료를 주변에 붙여놓고 개인 프로젝트 구현 시 TDD를 이용할 수 있도록 하자!
TDD의 개발 주기를 간단히 설명해보면:
- 테스트 작성 (하나의 기능에 대해)
- 일단 테스트가 성공할 수 있도록만 구현
- Refactoring : 테스트 코드나 구현 코드를 refactoring함
위 주기를 계속 반복하여 동작하는 깔끔한 코드를 작성하는 것을 목표로 한다.
이 책과 관련하여 앞으로 참고할 만한 서적 및 자료는 다음과 같다.
- Refactoring : Martin Fowler
- The Smalltalk Best Practice Patterns: Kent Beck
- Design Patterns: Gamma, Erich, Helm
- Extreme Programming Explaind: Kent Beck
- Code Complete: Steve McConnel
- www.artima.com/intv/contest.html
- www.mockobject.com
- www.sdmagazine.com
- martinfowler.com
수요일, 10월 18, 2006
Windows XP에서 부팅 시 시작하는 프로그램(프로세스) 찾기
얼마전부터 내 Windows XP 랩탑 컴퓨터를 다른 컴퓨터에서 ping도 안되고 네트워크 폴더에도 접근안되는 현상이 발생했다. 그냥 그러려니 하고 지내던 중 급기야 오늘 이놈의 문제를 해결해야겠다고 맘을 다잡고 한 2시간 고생을 했는데...
갖가지 Windows XP 설정을 변경해도 전혀 나아지지 않더라는 말씀 OTL
한가지 힌트를 얻은 것이 다른 시스템에서 ping -t로 계속 ping을 해보고 있으면 Windows XP가 부팅하고 로그온 화면이 나온 직후 약 5초 정도는 ping이 성공하더라는 것이다. 즉, 시작 프로그램에서 시작되는 어떤 프로세스에 의해 이러한 현상이 생기고 있다는 것을 알 수 있었다.
그리하야... Windows XP가 부팅 중 실행되는 프로세스들을 검토하기 위하여 sysinternals에서 매우 좋은 유틸리티 프로그램을 구하였다. 이 프로그램은 시작 프로그램, 디바이스 드라이버, 서비스 등 그야말로 부팅 시 실행되는 모든 프로세스를 총망라하여 보여줄 뿐만 아니라 다른 시스템의 내용과 비교 기능 등 문제 해결을 위한 모든 것을 제공하여 주었다.
이 툴을 사용하여 정상 시스템과 목록을 비교 이상한 프로세스들을 시작하지 못하도록 설정한 후 (당근 이 툴은 시작 프로세스들을 직접 지우거나 시작되지 않도록 설정할 수도 있다.) 문제를 해결하였다 우후!
갖가지 Windows XP 설정을 변경해도 전혀 나아지지 않더라는 말씀 OTL
한가지 힌트를 얻은 것이 다른 시스템에서 ping -t로 계속 ping을 해보고 있으면 Windows XP가 부팅하고 로그온 화면이 나온 직후 약 5초 정도는 ping이 성공하더라는 것이다. 즉, 시작 프로그램에서 시작되는 어떤 프로세스에 의해 이러한 현상이 생기고 있다는 것을 알 수 있었다.
그리하야... Windows XP가 부팅 중 실행되는 프로세스들을 검토하기 위하여 sysinternals에서 매우 좋은 유틸리티 프로그램을 구하였다. 이 프로그램은 시작 프로그램, 디바이스 드라이버, 서비스 등 그야말로 부팅 시 실행되는 모든 프로세스를 총망라하여 보여줄 뿐만 아니라 다른 시스템의 내용과 비교 기능 등 문제 해결을 위한 모든 것을 제공하여 주었다.
이 툴을 사용하여 정상 시스템과 목록을 비교 이상한 프로세스들을 시작하지 못하도록 설정한 후 (당근 이 툴은 시작 프로세스들을 직접 지우거나 시작되지 않도록 설정할 수도 있다.) 문제를 해결하였다 우후!
일요일, 10월 15, 2006
Java 개발자가 주의해야 할 Python
Java에 익숙한 개발자가 Python을 사용 시 주의해야 할 만한 것들을 정리해보도록 하자.
1) '==' 연산자
Java에서는 2개의 문자열(String)을 비교 시 문자열 값 자체가 같은지 확인하기 위해서는 equals() method를 사용하고 ==는 객체의 identity가 동일한지 확인한다.
그러나, Python에서는 어떤 객체이든 값이 동일한지 확인하기 위해 == 연산자를 사용한다. 객체의 identity가 동일한지는 A is B 로 확인할 수 있다.
2) static 멤버 변수의 위치
Java에서는 static 멤버나 일반 멤버 변수를 위치에 관계 없이 선언하여 사용한다. 그러나, Python의 경우는 class attribute(Java에서는 static 변수)는 class 정의 바로 다음에 작성하고 data attribute(Java에서 non-static 변수)는 __init__ method에 작성하여야 한다.
1) '==' 연산자
Java에서는 2개의 문자열(String)을 비교 시 문자열 값 자체가 같은지 확인하기 위해서는 equals() method를 사용하고 ==는 객체의 identity가 동일한지 확인한다.
그러나, Python에서는 어떤 객체이든 값이 동일한지 확인하기 위해 == 연산자를 사용한다. 객체의 identity가 동일한지는 A is B 로 확인할 수 있다.
2) static 멤버 변수의 위치
Java에서는 static 멤버나 일반 멤버 변수를 위치에 관계 없이 선언하여 사용한다. 그러나, Python의 경우는 class attribute(Java에서는 static 변수)는 class 정의 바로 다음에 작성하고 data attribute(Java에서 non-static 변수)는 __init__ method에 작성하여야 한다.
실용주의 프로그래머 (The Pragmatic Programmer : From Journeyman to Master)
초심자에서 중급 개발자로. 중급 개발자에서 이젠 좀 한다하는 수준의 S/W 엔지니어 살아가고 있지만 사실 소프트웨어 개발에 대한 열정은 반대로 줄어온것 같다는 생각이 든다.
누구나 그렇듯 초심자 시절에는 무엇이든 다 할 수 있고 또한 젊은의 열정도 있어 뭐든지 열심히 관심을 가지고 매사에 몰두한다.
경력이 쌓아가면 갈 수록 경험과 통빡(^^)은 늘어가지만 열정만은 어린시절보다 못해 왠지 갈수록 초라해지는 느낌이들고 약간의 불안감과 함께 인생의 방향 전환도 슬쩍 슬쩍 생각하게된다.
하지만, 잠시 마음을 가다듬고 생각해보면 내가 좋아서 하는 일로 돈도 벌고 계속 새로운 것을 배울 수 있으며 맘만 먹으면 내 손 끝에서 무엇이든 창조해 낼 수 있는 이런 직업이 또 어딨나하는 깨닮음을 얻게된다.
이 책은 다시 초심자 시절의 열정을 갇기로 맘 먹고 1주일 정도 후딱 해치워버린 책이다. 이미 잘 알고 있었던 내용도 있었고 새로운 내용도 있었지만 가장 중요한 것은 나의 일에 "애정"을 가진 사람이라면 충분히 공감하고 새겨볼 만한 내용이 많았다는 것이다.
도서관에서 1주일 대출로 빌려보았지만 기회가 되면 구매를 하여 옆에 두고 살짝 살짝 들쳐보고 싶은 책이다.
아래는 동 출판사에서 번역한 책 중 읽어 볼 만하다고 생각되는 목록이다.
누구나 그렇듯 초심자 시절에는 무엇이든 다 할 수 있고 또한 젊은의 열정도 있어 뭐든지 열심히 관심을 가지고 매사에 몰두한다.
경력이 쌓아가면 갈 수록 경험과 통빡(^^)은 늘어가지만 열정만은 어린시절보다 못해 왠지 갈수록 초라해지는 느낌이들고 약간의 불안감과 함께 인생의 방향 전환도 슬쩍 슬쩍 생각하게된다.
하지만, 잠시 마음을 가다듬고 생각해보면 내가 좋아서 하는 일로 돈도 벌고 계속 새로운 것을 배울 수 있으며 맘만 먹으면 내 손 끝에서 무엇이든 창조해 낼 수 있는 이런 직업이 또 어딨나하는 깨닮음을 얻게된다.
이 책은 다시 초심자 시절의 열정을 갇기로 맘 먹고 1주일 정도 후딱 해치워버린 책이다. 이미 잘 알고 있었던 내용도 있었고 새로운 내용도 있었지만 가장 중요한 것은 나의 일에 "애정"을 가진 사람이라면 충분히 공감하고 새겨볼 만한 내용이 많았다는 것이다.
도서관에서 1주일 대출로 빌려보았지만 기회가 되면 구매를 하여 옆에 두고 살짝 살짝 들쳐보고 싶은 책이다.
아래는 동 출판사에서 번역한 책 중 읽어 볼 만하다고 생각되는 목록이다.
- 대체 뭐가 문제야 : 문제 해결에 관한 창의적 사고를 길러주는 6가지 질문
- 테스트 주도 개발
- 익스트림 프로그래밍
- 생각하는 프로그래밍 : 프로그래밍 본질에 관한 15가지 에세이
- 실용주의 프로그래머를 위한 버전관리 using CVS
- 실용주의 프로그래머를 위한 프로젝트 자동화
- 리팩터링 워크북
화요일, 10월 10, 2006
나는 달린다 (Mein Langer Lauf zu mir selbst)
110kg이 나가는 뚱뚱보에서 75kg의 건장한 50대 남성이 되기까지 Joschka Fischer(전 독일 외무 장관)이 행한 일은 무엇일까?
'나는 달린다'가 그 해답이었다.
한때 인생의 시름을 잊기 위해 쉴세없이 먹어대고 그로인해 100kg이 넘는 거구가 될 수 밖에 없었던 그는 이혼 및 여러 인생의 위기를 겪으며 이대로는 안된다라는 절박한 심정으로 운동화를 신고 달리기 시작한다.
물론, 처음은 쉽지 않았다. 100kg이 넘는 거구로 달린다는 것은 쉽지않은 일일 것이다. 하지만, 한번 결정한 것은 포기하지 않는다는 신념과 자신의 인생을 개혁하겠다는 강한 의지로 그는 1주일, 1개월, 1년을 포기하지 않고 달려 이제는 마라톤도 뛸 수 있는 진정한 Runner로 변신한 것이다.
여기 그가 달리기 위해 세운 4가지 원칙이 있다.
오늘 5km 달리기의 1주차 처방에 따라 1분 뛰고 1분 걷기를 반복하여 운동장 6바퀴를 달렸다. 총 운동 시간은 25분정도를 지속하였다.
자 이제 부터 시작이다! 무리하지 말고 차근 차근 포기하지 않고 실천하도록 하자.
'나는 달린다'가 그 해답이었다.
한때 인생의 시름을 잊기 위해 쉴세없이 먹어대고 그로인해 100kg이 넘는 거구가 될 수 밖에 없었던 그는 이혼 및 여러 인생의 위기를 겪으며 이대로는 안된다라는 절박한 심정으로 운동화를 신고 달리기 시작한다.
물론, 처음은 쉽지 않았다. 100kg이 넘는 거구로 달린다는 것은 쉽지않은 일일 것이다. 하지만, 한번 결정한 것은 포기하지 않는다는 신념과 자신의 인생을 개혁하겠다는 강한 의지로 그는 1주일, 1개월, 1년을 포기하지 않고 달려 이제는 마라톤도 뛸 수 있는 진정한 Runner로 변신한 것이다.
여기 그가 달리기 위해 세운 4가지 원칙이 있다.
- 과감한 결단
- 끈기있게 지속
- 철저히 현실에 발을 딛고 실행할 것
- 인내
- 나 자신을 기만하지 말라
- 과도한 부담을 주는 일은 피하라
- 결코 포기하지 않는다
오늘 5km 달리기의 1주차 처방에 따라 1분 뛰고 1분 걷기를 반복하여 운동장 6바퀴를 달렸다. 총 운동 시간은 25분정도를 지속하였다.
자 이제 부터 시작이다! 무리하지 말고 차근 차근 포기하지 않고 실천하도록 하자.
일요일, 10월 08, 2006
Python의 Data Type 정리
1. Dictionary
d = {"key1":"a", "key2":"b", 3:"c", "key4":4}
키와 값으로 이루어지고 정해진 순서가 없음.
d.keys() => ["key1", "key2", 3, "key4]
d.values() => ["a", "b", "c", 4]
d.items() => [("key1", "a"), ("key2", "b"), (3, "c"), ("key4", 4)]
2. List
l = ["a", "b", "c", "d"]
정해진 순서대로 유지되며 Java의 배열과 비슷하나 더 확장된 기능을 제공함
3. Tuple
t = ("a", "b", "c", "d")
List와 동일하나 값이 불변임. 값을 수정할 수 있는 방법을 제공하지 않음.
상수 값을 사용할 때 속도가 더 빠르기 때문에 활용함.
Tuple을 List로 변환하기 위해서는 list(x) 메쏘드를 사용할 수 있다.
l = list(t)
# l => ['a', 'b', 'c', 'd', 'e']
4. Set
Set을 생성하기 위해서는 set(x) 메쏘드를 사용한다. Set은 중복된 값을 가지고 있지 않는다.
s = set(t)
# s => set(['a', 'c', 'b', 'e', 'd'])
관련 Tutorial은 이 페이지를 참고하기 바란다.
d = {"key1":"a", "key2":"b", 3:"c", "key4":4}
키와 값으로 이루어지고 정해진 순서가 없음.
d.keys() => ["key1", "key2", 3, "key4]
d.values() => ["a", "b", "c", 4]
d.items() => [("key1", "a"), ("key2", "b"), (3, "c"), ("key4", 4)]
2. List
l = ["a", "b", "c", "d"]
정해진 순서대로 유지되며 Java의 배열과 비슷하나 더 확장된 기능을 제공함
3. Tuple
t = ("a", "b", "c", "d")
List와 동일하나 값이 불변임. 값을 수정할 수 있는 방법을 제공하지 않음.
상수 값을 사용할 때 속도가 더 빠르기 때문에 활용함.
Tuple을 List로 변환하기 위해서는 list(x) 메쏘드를 사용할 수 있다.
l = list(t)
# l => ['a', 'b', 'c', 'd', 'e']
4. Set
Set을 생성하기 위해서는 set(x) 메쏘드를 사용한다. Set은 중복된 값을 가지고 있지 않는다.
s = set(t)
# s => set(['a', 'c', 'b', 'e', 'd'])
관련 Tutorial은 이 페이지를 참고하기 바란다.
피드 구독하기:
글 (Atom)