요즘들어 소프트웨어 설계 업무에 많은 비중을 두다보니 관심이 좀 많아진 건 사실이다.
그러다보니 관련 검색어를 검색 엔진에 자주 입력하게 되는데, 몇년 전부터 포스트를 읽으면서 ‘아, 그렇구나’ 라고 고개를 끄덕이게 하는 좋은 글이 있어서 아래에 링크를 달아 놓는다. (2년쯤 전에 작성된 포스트)

소프트웨어 설계가 완벽할 수 없는 이유

그렇다고해서 이게 정답은 아니고…

설계는 굉장히 중요한 일임은 분명하고 완벽할 수 없지만 완벽에 가깝게 하는 것이 프로그래머, 소프트웨어 설계자로써의 기본 자질이 아닐까 한다.
그래서 본인은 ‘아직 프로그래머도 소프트웨어 설계자도 아닌가보다’라고 항상 생각한다.

일반적으로 프로그램을 구동할때마다 동적으로 설정해야 하는 환경 변수나, 기록을 남겨야 하는 데이터들에 대해서는 파일을 사용하여 저장하고 열람을 수행한다.

이때에 굳이 복잡한 데이터 조회 조건이 필요한 것이 아닌 시리얼한 데이터를 입출력하는 경우에는 SQLite 보다는 일반 파일 입출력이 더욱 월등한 성능을 보일 수 밖에 없다.
(SQLite는 쿼리에 의해 데이터 선택을 수행하고, 선택된 결과들을 다시 불러와서 자료형변환과 변수에 할당하는 작업이 필요하므로…)
따라서 이런 경우에는 파일 입출력을 사용하는 것이 바람직하다. ( 당연한 말을 반복한다. )

파일 입출력에도 일반 텍스트 형식의 저장 방식과 바이너리 형식의 저장 방식의 두가지 방법이 있다.
두 저장 방식의 차이는 그야말로 이름에 그대로 나와 있다.
일반 텍스트 형식의 저장 방식은 NotePad를 사용하여 텍스트를 편집하여 저장하였을 때 생성되는 내용과 같다.
즉, 사용자가 파일을 열람하여 직접 읽을 수 있는 글자 형태로 저장하는 것이다.
그렇기 때문에 기록된 문자들의 자료형(String, UTF or Char) 만큼의 메모리 공간을 할당한다.

반면 바이너리 형식의 저장방식은 기록하고자 하는 내용을 저장하기 위해 할당한 자료형의 공간 만큼만 할당하여 저장한다.
텍스트 형식의 저장 방식과의 차이를 쉽게 이해하기 위해서는 다음의 예가 적절할 것으로 사료된다.

예)
Integer32 형태로 자료형을 선언한 뒤 36745373이라는 임의의 값을 선언하였다.
이때 텍스트 형태로 저장을 할 경우 36745373의 길이인 8 * 1Byte(char) 만큼의 메모리가 할당되어 저장된다.
반면 바이너리 형태로 저장을 할 경우 Integer32의 크기인 4Byte(Integer32) 만큼의 메모리가 할당되어 저장된다.

두 형태의 파일 입출력 방식은 나름대로의 장단점이 존재하기 때문에 필요에 의해 적절한 방식을 사용하는 것이 좋다.
예를 들어 일반적인 로그등을 사용자가 특별한 도구 없이 조회를 해야 한다면 텍스트 형태로 저장하는 것이 바람직할 것이다.
(물론 보안이 필요한 내용이라면 바이너리 형태로 변환하여 암호화/복호화 과정을 추가하는 것이 바람직하다.)
반면 프로그램 구동에 필요한 대용량의 동적인 데이터들에 대해서는 바이너리로 저장하는 것이 입출력 속도 및 공간 절약 측면에서 훨씬 바람직한 선택이 될 것이다.

물론 위의 내용이 정답은 아니다. 그냥 그렇구나- 라고 기본 개념만 잡고 넘어가자.

이게 뭔 개소리야

아무튼, 서론이 너무나도 길었다.
이 포스트에서는 C#에서 바이너리로 파일을 읽고 쓰는 방법에 대해 기술한다.
굉장히 짧으니 놀라지 말지어다.

변수의 선언은 아래와 같다.

  1. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);     // 파일을 열고 닫기 위한 FileStream 초기화
  2. BinaryReader br = new BinaryReader(fs);   // 바이너리로 파일을 읽기 위한 BinaryReader
  3. BinaryWriter bw = new BinaryWriter(fs);   // 바이너리로 파일을 쓰기 위한 BinaryWriter

일반적으로 filePath의 경우는 OpenDialog를 사용하여 경로를 얻는 것이 바람직하나, 처음 사용할때에는 String 형태로 절대 경로를 넣어주는 것으로 쉽게 테스트 할 수 있다.

파일에 바이너리로 파일을 쓰는 방법은 아래와 같다.

  1. int dataInt = 1;
  2. double dataDouble = 0.01;
  3. String dataString = "Hello C Sharp File I/O";
  4. bw.Write(dataInt);
  5. bw.Write(dataDouble);
  6. bw.Write(dataString);

뭐 이렇게 단순하냐 라고 할 수 있으나, C#에서는 단순하다.

파일에서 바이너리로 읽어오는 방법은 아래와 같다.

  1. int readDataInt = br.ReadInt32();
  2. double readDataDouble = br.ReadDouble();
  3. String readDataString = br.ReadString();

정말 단순하다. 이 짧은 내용을 위해 저 긴 글을 읽었나보다.

실제로 저장된 데이터를 Hex Editor등을 사용하여 열어보면 String 형태의 자료를 위해서는 데이터 길이에 대한 태깅이 되어 있는 것을 볼 수 있다.
C#은 똑똑하게(?) 자료의 형태 및 길이등에 대해 파일에 태깅을 해두고 파일을 읽을 때에 태깅 정보를 사용하여 데이터를 불러온다.

고뤠?

오늘은 여기까지!

CC2530도 CC2540과 같이 8051을 코어로 사용하도록 설계되어 있다.
그래서 CC2540으로 작성한 코드를 좀 가져와서 쓰려고 하는데,
잉? 컴파일 에러 등장.

  1. "function has no prototype"

‘난 분명 헤더 파일에 프로토타입을 선언을 했는데 이거 뭔소리임?’ 하고 뚫어지게 쳐다봐도 답이 보이질 않네.
뭐 이래? 하고 주석 처리 하니 다른 놈들은 참 잘도 컴파일 되는데 이 놈만 왜 안되지? 하면서 탄식을 하던 중…

설마???? 하고 프로토타입을 수정하니 컴파일이 되더이다.
해당 내용은 아래와 같다.

보통 코드를 작성할 때 전달 파라미터가 없는 경우,

  1. void foo();

와 같이 코드를 선언한다.

그런데 이 IAR 컴파일러는 후져서, 아니 CC2530을 위한 IAR 컴파일러는 후져서 혹은 혹독하게 정확한 코드를 원하기 때문에 파라미터가 있는지 없는지를 확실하게 명시해주어야 한다.
CC2530의 샘플 프로젝트의 컴파일 옵션을 잘(?) 살펴보면 컴파일러의 버전과 프로토타입에 선언과 관련된 설정 항목이 있다.
따라서 해당 옵션을 수정하거나 위의 코드는 아래와 같이 선언하면 “function has no prototype” 에러를 해소할 수 있다.

  1. void foo(void);

자, 어때요? 차암~ 뭐같죠잉?

어제 유난히 서버가 느린 것 같아서 오래간만에 로그를 뒤져보니
’221.207.17.9′ 거점에서 엄청난 로그인 시도가 있었더이다.
조회를 해보니 중국 ISP.

시작 시간이 아침 6시 5분인데, 서버에서 발뺀 시간이 19:44분.
2초 간격으로 쏴댔더이다.

물론 프로그램을 돌렸겠지만, 참으로 집요한 놈이구나 라는 생각 뿐…

귀찮아서 안했는데 로그 체크해서 자동으로 블럭 시키는 스크립트를 추가해야겠다.

Seong-uk Choi liked this post

CC2530 프로젝트 파일을 열고 Hex 파일을 생성하기 위해서는 Linker 항목의 Extra Output 기능을 사용하여 hex 파일을 생성해주어야 한다.
그.런.데…

컴파일을 한 뒤 생성된 hex 파일을 SmartRF Flash Programmer를 사용하여 다운로드를 하려고 하면,
256KB를 넘어서 다운로드 할 수 없다고 나온다.

왜그러냐고 묻는다면, ‘글쎄?’ 라고 답해놔도 무방하나 그럴수는 없으므로 예상되는(?) 원인을 아래와 같이 추측해본다.

모든 MCU의 메모리 영역은 프로그램 메모리 영역과 데이터 메모리 영역, EEPROM 메모리 영역으로 구성되어 있을 것이다.
이 때 MCU를 구동하기 위해서는 프로그램 영역에 프로그램을 구성하여 다운로드 해야 하는데, 이때 필요한 것이 프로그램 영역의 시작주소일 것이다.
그렇다면 이 에러가 발생하는 이유는 시작 메모리 주소부터 프로그램 영역의 마지막 주소까지의 길이가 256KB를 넘어선 것으로 추측을 해볼 수 있다.
그러므로 프로그램 시작 주소를 설정하는 부분을 찾아서 수정을 해야 할 것이다.

… 맞나?
개소리로 이해하면 속이 편하다.

아무튼, 결론은 이러하다.
이 오류를 해소하려면 zstack\Tools\CC2530DB 디렉터리를 보면 f8w2530.xcl 파일이 있을 것이다.
파일을 열람하여 아래의 코드를 찾아서 코멘트를 해제하여 준다.

-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*\
_NR_OF_BANKS+_FIRST_BANK_ADDR=0×8000

짜잔!
잘된다.


GIVE ME FIVE!
AKB48
作曲:笹渕大介
作詞︰秋元康

桜の歌が街に流れ
あっと言う間だった別れの日
校舎の壁のその片隅
みんなでこっそり寄せ書きした
制服は
もう脱ぐんだ
春の風に吹かれながら
どんな花も
やがては散って
新しい夢を見る
友よ
思い出より
輝いてる
明日(あす)を信じよう
そう 卒業とは
出口じゃなく
入り口だろう
友よ
それぞれの道
進むだけだ
サヨナラを言うな
また すぐに会える
だから 今は
ハイタッチしよう
何枚 写真を撮ってみても
大事だったものは残せない
ケンカして口きいてなかった
あいつとなぜか肩を組んでた
まだ誰も
帰らなくて
教室が狭く見えるよ
名残惜しい
時間の先に
僕らの未来がある

堪(こら)えるより
生まれてから
一番 泣いてみよう
そう つらいことは
まだまだある
慣れておこうぜ

ぐしゃぐしゃの顔
見せ合ったら
何でも話せるね
一生の親友だ
忘れるなよ
ハイタッチしよう
友よ
思い出より
輝いてる
明日(あす)を信じよう
そう 卒業とは
出口じゃなく
入り口だろう
友よ
巡り逢えて
最高だった
青春の日々に
まだ 言えなかった
ありがとうを
ハイタッチで…

「GIVE ME FIVE!」歌唱メンバー
チームA:小嶋陽菜 / 指原莉乃 / 篠田麻里子 / 高城亜樹 / 高橋みなみ / 前田敦子
チームK:板野友美 / 大島優子 / 峯岸みなみ / 宮澤佐江 / 横山由依
チームB:河西智美 / 柏木由紀 / 北原里英 / 渡辺麻友
SKE48 チームS:松井珠理奈 / 松井玲奈
NMB48 チームN:山本 彩

Oo歌詞 http://www.littleoslo.com/lyj/home/2012/01/akb48-give-me-five/

요즘들어 서버가 오랜 기간 동안 다운되는 경우가 많습니다.
일단 찾아오시는 분들께 죄송하다는 말씀을 남겨드립니다.

서버 다운이 되는 이유는 다름이 아니고…

이놈 때문입니다.. -_-;

기숙사에 서버를 돌리고 있는데 랜선이 부족한 관계로 서버에 꽂힌 랜선을 뽑아서 노트북에….
헛!

그래서 결론은 서버는 켜 있으나 응답하지 않는다. -_-;;;;
오늘부터는 랜선을 하나 더 구비하여 착실하게 서버가 살아 있도록 하겠습니다.

아무튼 오늘도 방문해주셔서 감사합니다!

누군가 올린 글을 보게 되었지요. 공대생의 감성이라는…
원문은 http://cuttyshark.egloos.com/5091810 에 적혀 있으니 한번 읽어보고 오시는 것도…

가끔 공대생들은 외부에 노출되지 않는 은밀한 곳에 자신의 흔적을 남기는 걸 좋아합니다.
저 글은 그것과 관련된 내용인데요, 이미 좀 유명해진 내용이라 없어지지 않았을까 하면서 방문을 했는데…

아직 있었어…

22. 3월 2012 · Write a comment · Categories: Diary · Tags:

오프라 윈프리에게 필이라는 박사가 해보라고 준 테스트라네요.
뭐 잘 맞는다고들 합니다.

일단 필기구 준비하셔서 자기에게 해당하는 번호를 적어두세요.

1. 하루 중 제일 기분이 좋을 때는?
a) 아침
b) 오후나 이른 저녁
c) 늦은 밤

2. 나는 걸을 때, 보통
a) 보폭을 넓게, 빨리 걷는다.
b) 보폭을 좁게, 빨리 걷는다.
c) 머리를 들고, 세상을 정면으로 바라보며 덜 빠르게 걷는다.
d) 바닥을 보며 덜 빠르게 걷는다.
e) 아주 느리게 걷는다.

3. 사람들과 얘기할 때 나는
a) 내 팔짱을 끼고 서서
b) 두 손을 마주잡고
c) 한 손이나 양 손을 힙에 얹고
d) 얘기 나누는 상대방을 건드리거나 살짝 밀면서
e) 내 귀나 턱을 만지작거리거나 손가락으로 머리를 빗으면서

4. 편안히 쉴 때, 나는
a) 다리를 굽힌 채로 나란히 두고 앉는다 (여자들 얌전떠는 포즈죠)
b) 다리를 꼬고 앉는다
c) 다리를 쭉 펴고 앉는다
d) 한 쪽 다리를 접어 깔고 앉는다

5. 뭔가 아주 재미있는 일이 생겼을 때, 나는
a) 아주 큰 소리로 즐거움을 숨기지 않고 웃는다
b) 웃지만 그다지 크지 않은 소리로 웃는다.
c) 조용히 소리를 별로 내지 않으며 웃는다.
d) 오히려 쑥스러운 듯한 미소. (우훗;)

6. 파티나 사람들이 많이 모이는 장소에 나는
a) 사람들이 내 존재를 의식하도록 화려한 등장을 한다.
b) 아는 사람들을 찾을 수 있을까 해서 둘러보며 차분히 들어선다.
c) 시선을 끌지 않기 위해 할 수 있는 한 최대로 조용히 입장한다.

7. 완전히 일에 몰두한 채로 열심히 하다가 방해 받았을 때 나는
a) 휴식의 기회를 반갑게 맞이한다
b) 열라-_- 짜증이 훨훨 난다
c) 그 중간 어딘가 쯤.

8. 다음 중 제일 좋아하는 색은?
a) 빨강이나 오렌지
b) 까망
c) 노랑이나 연한 파랑
d) 녹색
e) 짙은 파랑이나 보라
f ) 하양
g) 갈색이나 회색

9. 잠자리에 들어서 잠들기 바로 직전에 나는
a) 몸을 똑바로 펴고 누운 포즈이다
b) 엎드린 채로 몸을 죽 편 포즈이다
c) 약간 몸을 둥글린 채로 옆으로 누운 포즈이다
d) 한 팔을 베고 있다
e) 머리를 이불 밑에 넣고 있다

10. 나는 이런 꿈을 자주 꾼다
a) 낙하하는 꿈
b) 싸우거나 애 쓰는 꿈
c) 무엇이나 누군가를 찾는 꿈
d) 날아오르거나 떠오르는 꿈
e) 꿈은 잘 꾸지 않는다
f) 항상 좋은 느낌의 꿈이다

점수배분
1. (a) 2 (b) 4 (c) 6
2. (a) 6 (b) 4 (c) 7 (d) 2 (e) 1
3. (a) 4 (b) 2 (c) 5 (d) 7 (e) 6
4. (a) 4 (b) 6 (c) 2 (d) 1
5. (a) 6 (b) 4 (c) 3 (d) 5 (e) 2
6. (a) 6 (b) 4 (c) 2
7. (a) 6 (b) 2 (c) 4
8. (a) 6 (b) 7 (c) 5 (d) 4 (e) 3 (f) 2 (g) 1
9. (a) 7 (b) 6 (c) 4 (d) 2 (e) 1
10. (a) 4 (b) 2 (c) 3 (d) 5 (e) 6 (f) 1

적어둔 내용을 기준으로 점수를 매겨서 더하세요.
그리고 아래의 해석을 읽어보시기 바랍니다.

60점 이상
주위 사람들은 당신을 “취급주의” 형 이라고 생각하고 있습니다. 당신은 허영심이 있고, 자기중심적이며 극히 지배적인 사람으로 비춰지고 있습니다. 당신을 부러워하고 우러러보며 당신처럼 되기를 바라는 사람들도 있지만, 당신과 너무 가까워질까 우려하며 당신을 신뢰하지는 않습니다.

51점에서 60점까지
주위 사람들은 당신이 잘 흥분하고, 상당히 변덕스러우며, 충동적이라고 생각합니다. 자연스러운 리더 타입으로, 빠른 (항상 옳은 것은 아니지만) 결정을 내릴 수 있습니다. 당신은 과감하고 모험성이 있으며 무엇이든 한 번쯤은 시도해 보는, 찬스에 강하고 모험을 즐기는 타입으로 보여집니다. 당신과 가까이 하는 사람들은 당신이 발하는 강렬함에 이끌립니다.

41점에서 50점까지
주위 사람들은 당신을 상큼하고, 발랄하고, 매력적이고, 재미있고, 현실적이면서 늘 즐거운 사람이라고 생각합니다. 어디서든지 주위의 이목을 사로잡는 사람이지만 적당한 주제 파악으로 교만해지지 않을 줄도 아는 사람이죠. 당신은 다정하고 친절하며 이해심 많은 사람으로 여겨지고 있으며, 처진 기분은 업시켜 주고 어려울 땐 도와주는 사람으로 알려져 있습니다.

31점에서 40점까지
다른 사람들이 보는 당신은 현명하고, 신중하며, 조심스럽고, 현실적입니다. 또 당신은 똑똑하고, 재능과 능력이 있으면서 한편 겸손한 사람으로도 여겨지고 있습니다. 당신은 친구를 사귈 때 너무 급하거나 가볍게 접근하지 않으며, 한번 사귄 친구에게는 상당히 극진하고 또 자신도 그렇게 대해주기를 기대합니다. 당신의 참모습을 알게 되는 사람들은, 당신의 친구에 대한 그 신뢰를 흔드는 것이 아주 어렵다는 것과, 한번 그 신뢰가 무너지면 그것을 극복하는 것도 마찬가지로 아주 오래 걸린다는 것을 깨닫게 될 것입니다.

21점에서 30점까지
친구들이 보는 당신은 집요하며 깐깐한 사람. 상당히 신중하고 대단히 조심스러우며, 느리고도 꾸준하게 전진하는 사람이지요. 당신이 무슨 일인가를 충동적으로 하는 모습을 본다면 친구들은 상당히 충격을 받을지도 모릅니다. 당신은 무슨 일이든 꼼꼼히 모든 각도에서 살펴본 다음 대부분 퇴짜를 놓는 사람으로 생각되어 지고 있으니까요. 친구들은 당신의 이런 모습은 주로 본인의 성격에 의한 것이라고 생각하고 있습니다.

21점 이하
친구들이 보는 당신은 부끄럼을 많이 타고, 소심하며, 우유부단하고, 누군가가 곁에서 돌봐줘야만 하며, 본인의 일도 누군가가 대신해서 결정해 줘야만 하고 타인이나 어떤 일에 연루되는 것을 피하는 사람입니다. 당신은 그야말로 돈키호테, 있지도 않은 문제점들을 발견해서 대응하려 드는 사람이라고 여겨집니다. 당신을 가까이서 잘 아는 사람들은 그게 사실이 아니라는 걸 알지만, 그 외 대부분의 사람들은 당신을 지루하다고 볼 것입니다.

저는 A, C, E, C, A, A, A, A, C, F
49점 이네요. 아슬아슬하게 걸려있네 ㅋㅋㅋ

어제 퇴근 이후부터 금연을 시작했다.

이야기를 들어보니 금연하면 담배가 땡겨서 미친다고 그러는데,

흠.. 난 그런게 아직 없다.
그냥 평소처럼 커피만 퍼마시고 있다.

가장 좋은 건 담배를 안 태움으로 인해서 나에게 더욱 많은 시간들이 생겼다는 점이다.

좋은데??