https://www.winsen-sensor.com/product/mp-3b.html?campaignid=21472985515&adgroupid=163472020486&feeditemid=&targetid=kwd-324378996163&device=c&creative=705851074211&keyword=alcohol%20sensor&gad_source=1&gclid=EAIaIQobChMIspnEhI3qhwMVtAl7Bx3xPwXDEAAYASAAEgJy8_D_BwE

 

MP-3B Flat Surfaced Alcohol Sensor

The sensor has been fully tested (not calibrated) before leaving the factory. However, after transportation and storage, the environment conditions change, and the surface of the sensor absorbs moisture, mixed gas, pollution matters, etc. It is recommended

www.winsen-sensor.com

 

최근 이 센서로 알콜 측정기를 개발하고 있는데.. 쉽게 접근했다가 된통 당하고 있는중.

 

log 와 power 함수를 쓰게 될줄이야 ㅎㅎㅎ

그나저나 센서 안정화를 검증하는 시간이 너무 길다....

 

오랜만에 mol 수 계산도 해보고 예전 화학 수업 기억을 떠올리고 있습니다.

대강 하는 거랑 측정기를 통해서 제대로 칼리브레이션하고 동작하는 거랑은 천지 차이이다.

게다가 메모리 32kb 에 때려박으려니 코드 사이즈가 아슬아슬하네요.

 

 

아래 그림이 핵심!

매일  여러 샘플들 측정하고 30분 쉬고 엑셀로 기록..진도가 안나갑니다 T.T

 

M0 코어에서 float 연산을 할 일이 생겨서 , 아무 생각없이 software floating point 연산을 하다보니 이게 제법 코드를 차지하여서 32kb 메모리에서 도저히 다른 일을 할 수가 없게 되었다.

 

혹시나 찾아보니 역시..

누군가 M0 에 최적화한  tiny 버전을 만들어 놓았다.

 

https://www.quinapalus.com/qfplib-m0-tiny.html

 

Qfplib-M0-tiny: a free ARM Cortex-M0 floating-point library in 1 kbyte

Qfplib-M0-tiny: a free ARM Cortex-M0 floating-point library in 1 kbyte See also: Qfplib-M0-full: a similar library more optimised for speed, including both single- and double-precision functions; and Qfplib-M3: a similar library optimised for speed and acc

www.quinapalus.com

 

 

qfp_fadd
qfp_fsub
qfp_fmul
qfp_fdiv
qfp_fcmp
qfp_float2int
qfp_float2fix
qfp_int2float
qfp_fix2float
qfp_float2uint
qfp_float2ufix
qfp_uint2float
qfp_ufix2float
qfp_fcos
qfp_fsin
qfp_ftan
qfp_fatan2
qfp_fexp
qfp_fln
qfp_fsqrt

 

풀로는 이렇게 지원하고, 코드 크기가 1k 안으로 만들수 있다. gcc 에서 제공하는 라이브러는 한 2-3k 차지한듯.

한바이트라도 아쉬웠는데 이제 겨우 남은 메모리로 코딩을 할 수 있을거 같다.

 

혹시 pow 가 없다고 고민하지말 것.

고등학교에서 고1 수학을 배웠다면  위 함수로 구현이 가능합니다.

a^b = e^(b*ln(a))

쓸모없는 삽질 이야기.
오늘 주일 설교 예화중에 인생에 있어서 100점짜리 단어에 대한 이야기가 있었다. a 는 1점 , b 는 2점 c는 3점 이런식으로 환산해보면 , 아래와 같다.
luck(운) = 47점
love(사랑) = 54점
leadership(리더쉽) = 89점
hardwork(열심) = 98점
attitude(태도) = 100점
예화는 예화일뿐 공학적으로 너무 심각한 의미를 부여하지는 말자.
하지만, 나는 이과 공대생!
옆에 계셨던 분이 100점 짜리 단어가 attitude 만 있을까? 하는 질문을 주셨고, 나도 갑자기 궁금해져서 파이썬으로 프로그램을 짜보게 되었다.
과연 100점 짜리는 단어는 얼마나 있을까?
(입력 모수는 1800단어 고교 단어)
[가설]
확률적으로 약 1% 정도 존재할 것이며 attitude 만 있지는 않을꺼야.
[질문]
1. attitude 외에 100점 짜리 단어는 ?
2. 있다면 단어별 전체 분포도는?
[결론]
1. 약 1%의 확율로 영어단어중 100점 단어가 여러개 있다.
2. 분포도에서 75점이 제일 많고 50-110점 사이가 1-2% 대역에 분포해 있다.
3. useless 도 100점 이라는 사실!
[코드 소스]
import matplotlib.pyplot as plt
def cal_word(word):
val = 0
for i in word:
if ord(i) != 10:
#print(i, ord(i)-96, end=' ',)
val += ord(i)-96
return val
f=open('word_list.txt');
lines = f.readlines();
#개행 제거
lines = list(map(lambda s: s.strip(), lines))
def stack_word(n , is_show):
cnt = 0;
for x in lines:
if cal_word(x) == n:
cnt += 1
if is_show:
print(x)
return cnt
print('Word Cnt 100')
stack_word(100,1)
ps = [0 for i in range(200)]
for n in range(1,200) :
ps[n-1] = stack_word(n,0)
ps[n-1] = 100 * ps[n-1]/ len(lines)
plt.plot(ps)
plt.ylabel('probability(%)')
plt.xlabel('Word cnt')
plt.grid(True)
plt.show()
 

안녕하세요.

 

저도 최근에 영어를 공부하면서 깨닫게 된 재미있는 정보가 있어서 공유해드립니다.

위 제목처럼

영어와 한국어 차이점을 컴퓨터 언어로 표현하자면,

이렇게 비유하고 싶습니다.

한국어 - Intel

영어 - Arm

더 정확히 비유한다면 아래와 같습니다.

한국어 - CISC

영어 - RISC

이유를 설명하자면

기본적으로 단어의 개수가 영어에 비해서 한국어가 월등히 많습니다.

한국어 약 115만개 / 영어 약 71만개

비슷한 것 같지만 실제 사용하는 단어 위주로 하면 아마 한국어 단어수가 훨씬 많을 겁니다.

(그렇다고 RISC 과 CISC 명령어 개수의 비율로 따지지 마시고 의미론적으로 그렇다 라는 의미입니다)

한국어는 어떤 상황을 한 단어로 표현이 가능하고, 영어는 단어를 만들어내면서 표현이 가능합니다.

미국 컨추리 노래 중 Dierks Bentley - Riser 가 있는데

(전형적인 미국 백인 남성의 사고 방식을 알 수 있는 노래입니다)

코러스 가사가 멋집니다.

I'm a riser

I'm a get up off the ground, don't run and hider

Pushing comes to shove

Hey, I'm a fighter

When darkness comes to town, I'm a lighter

A get out aliver of the fire

Survivor

-er 로 각운을 잡은 건데.

lighter 단어는 담배 불 붙이는 라이터가 아니라 T.T

빛을 내는 자 란 뜻입니다.

riser -> rise + er 일어서는 자

hider -> hide + er 숨는 자

aliver -> alive + er 살아난 자

lighter -> light + er 어둠을 밝히는 자

라이터 l i g h t e r 이라고 단어를 백날 외우고 엉뚱한 해석을 하는 거지요.

나는 라이터다! 뭐 그렇게 해석해도 의미는 통합니다 .불을 붙이는 거니깐요.

aliver 라는 단어는 없는데 .. 라고 하시면 안됩니다. 만들어 쓰는 겁니다.

(get-out-aliver) -> 이게 명사로 보입니다. 가사 쓰면서 만들어진 단어.

A get out aliver of the fire 가사 멋지지 않나요! 시련을 벗어나서 살아남은 자

만약, 미국 남부 지방에 출장가서, 될까 말까 까리한 프로젝트가 있을때

기회가 생겨서 그 사람들 앞에서 이 곡을 부른다면 프로젝트 딸 확률이 매우 높아 질껍니다.

예를 든다면,

미얀마에서 엔지니어가 출장와서 노래방에 한국 사람들하고 같이 왔는데

갑자기 강산에 의

흐르는 강물을 거꾸로 거슬러 오르는 연어들~~~

하며 반짝이는 눈으로 노래 부른다고 생각해보세요. 저 같으면 무조건 채용 또는 프로젝트 계약합니다. ㅎㅎ

아 이 사람은 한국의 정서를 알고 있구나! 한국 사람이네!

반대로

어 동양인인데 우리 아버지 정서를 아네! 미국놈이구먼!

예전에 타일러라는 외국인이 [한국어는 단어의 무게가 무겁다] 라는 글을 본적이 있습니다.

그말의 의미가 단어가 지니는 의미가 다양하다 라는 것이 아니라, 단어가 주는 의미가 더 명확하고 상세하다라고 생각됩니다.

어떤 상황을 두언어로 묘사하면 한국어는 한단어로 표현이 되는데 ,

영어에는 없는 표현이어서 단어들을 조합해야 되는 경우가 많지요.

한국어의 음식은 음식 그 자체이나 , 영어의 food 는 영혼의 양식도 가능한 의미가 있습니다.

[영혼의 음식]이라고 한국어에서는 말하지 않지요.

따라서, 한국어 단어는 포함하는 의미론적의 크기가 작은 편이고, (더 명확합니다)

비슷한 영어 단어는 한국어 단어의 의미크기를 공유하면서 덩어리가 더 크다 라고 생각됩니다.

갑자기 이 비유가 생각나서 까먹을 것 같아서 적어봅니다.

그래도 나름 프로그래머라 언어도 분석적으로 공부하게 되네요 T.T

학문적으로 저도 접근하지 실제 영어는 잘 못합니다. ㅎㅎㅎ

즐거운 하루 되세요~~

안녕하세요.

예전에 마이컴으로 HDLC 10Mbps 처리하는 프로젝트에 대해서 거의 성공했다고 말씀드린적이 있습니다.

나름 뿌듯해하고 있었는데, 다시 난관을 만났었습니다. 항상 지뢰밭이 연속

문제를 만났을 때 해결 방법에 대한 글로 읽어도 좋으므로 , 이쪽 관련 기술이 아니더라도

문제 해결 및 디버깅에 도움이 되실 거 같습니다.

신호 레벨은 RS-485 라 짧은 거리에서는 문제없이 잘 동작합니다.

그런데 테스트 조건이 10Mbps 로 무려 쉴드케이블 200M 24시간 동작 조건입니다.

저는 당연히 이 문제는 하드웨어에서만 해결하면 되겠지하고 테스트 했는데 웬걸

100ms 당 20-30번 이상 CRC 에러나 길이 에러가 발생하네요.

순간 무얼 수정해야 할지 멍해지면서 역시 FPGA 를 사용했었어햐 하는 생각이 막 들더군요.

그런데 돌아가기에는 너무 먼길을 왔지요.

저의 디버깅 순서는

1. HW 문제 일까 SW 문제일까?

- 확인 방법 : FPGA 로 동작하는 다른 회사 제품의 RS-485로직에서 점퍼를 띄워서 , 개발품에 입력시키면

485 HW 로직인지 SW 문제인지 판별이 될꺼야.

-결론 : HW 문제로 내심 기대했지만 동일한 에러가 발생하므로 SW 문제였습니다.

2. SW 문제라면 왜 놓치는 걸까?

- 확인 방법 : 놓치는 순간의 신호가 무언까 찌그러 질꺼야. 타이밍이 안 맞겠지

로직 아날라이저로 깨진 신호만 패턴 시간을 하나하나 읽어서 따라가봄.

역시 100ns 단위의 칼 같았던 신호가 , 80ns 90ns 뭉개져 있었음. 될때도 있고 안될때고 있고.

- 결론 : 데이터 파싱시 edge 떨어지마 마자 인식하도록 해놓았는데 노이즈로 데이터가 뭉게질때 놓치는 것 같음.

3. 위 가정을 설립하고 해결 방법 도출

- 고민 : 만약 펄스 중앙에서 읽는데 이런 현상은 DMA 타이밍이 흔들리는 것 밖에 없음.

아니면 펄스 중앙에서 읽지 않는 다는 것. 둘 중 하나임.

- 확인 방법 : DMA 읽어가는 속도가 흔들리는 거는 가능성이 낮고 , 2번째 가설이 확율이 높음.

그러나 언제 정확하게 DMA 가 읽어가는지 눈으로 타이밍 확인이 불가능 함.

정말 edge 근처인지 읽는건지 알수가 없음. 현재 정보로는 대략 edge 이후 60ns 근처로

거의 중앙에서 읽는 것으로 추정만 됨. -> 그렇다면 해당 문제는 없어야 함.

- 실행 : 읽는 타이밍을 카운터를 적당히 중간값으로 변경후 확인해보았으나 동일.

여기서 좌절. 해당 가설이 맞지가 않나..

이제 미궁속으로 빠짐. 어떻게 해야할지 머리가 하얗게 변함.

4. 해결 시도

- 23년의 해결 노하우 총동원 (별거 아닙니다. 불안한 마음을 잠재우고 심리 상태를 편하게 만들어

최대한 집중도를 높이는 방법이지요)

1) 편안한 배경음악 틀기

- 몇년마다 발생하는 이런 현상에 대비하기 위한 나만의 음악 플레이 리스트 재생

- 해당 플레이 리스트는 효과를 극대화 하기 위하여 평소에는 절대 재생하지 않으며

위와 같은 절체 절명의 순간에서만 재생. 23년간 한 6-7번만 사용함.

2) 혼잣말하며 주변 산책

3) 다시 처음부터 내 생각에 오류가 없는지 차근차근 되집어봄.

4) 아무나 붙잡고 내 생각의 설명함 (러버덕코딩 기법)

- > 최근 그 아무나에 대한 부작용이 심각( 그 사람은 매우 피곤해 하기 때문에) 하여 사용을 자제하고 있었음.

5. 해결

1) 2시간의 집중 처방 이후 아이디어 떠오름

2) 타이밍 카운터를 임의로 중간값만 해보았는데 , 그냥 한칸식 밀면서 하나씩 해보자. 250번만 해보면 되겠네.

3) 1씩 증가시켜가며 컴파일 테스트 반복.

4) 어라 특정 값 범위부터 동작함. 유레카!

5) 자 그럼 안되는 값 범위를 찾아. 다시 1씩 증가시켜가며 컴파일 테스트 반복.

6) 동작잘하는 범위 확보. 따라서 최종 값은 최소값과 최대값의 중간 값.

7) 나머지 속도도 마찬가지로 테스트.

-> 숫자 1 바꾸고 컴파일하고 해당 값 범위 찾고 수시간 소요.

8) 모든 속도에서 정확하다고 생각되는 지연값 검출.

6. 결론.

1) 노이즈에 따른 신호 타이밍 흔들림이 맞으며 소프트웨어로 중간에서 읽어가도록 변경하여 해결.

2) 24시간 동안 한번의 데이터 누락없이 파싱 성공.

7. 어려운 프로젝트의 보상 - 지식 부스러기들

1) 2.5Mbps 에서 부터 종단 저항없이는 200m 라인 사용이 어려움.

6-700kbps 아래는 종단 저항없이 쉴드케이블 200m 정도는 가뿐히 동작.

UART 신호라면 over sampling 되는 uart 나 아예 gpio로 만들면 해결될 것으로 보임.

2) DMA 타이머 동작은 믿을만 하다. 항상 그렇지만 내가 문제.

3) 역시 내 음악 플레이 리스트의 효과가 좋구나.

4) 예전에는 이런 문제는 한달이상 소요되었는데 하루안에 되는 걸 보면 나도 이제 고인물?

5) 최적화를 거급하다보니 10Mpbs 에서 읽어내기가 초기에는 매우 빠듯했는데 , 이제는 RX TX 사이에

딜레이를 걸고 동작시킴. 너무 최적화했나..여유가 있으니 중간에 로직 처리를 더 넣더라도 마음이 편안함.

6) 현재 MCU 에서 20Mbps 읽기도 가능할거 같으나 스펙이 아니므로 그냥 할수 있을거 같다 정도..

7) 현재 MCU 가 최소의 사양으로 생각되었으나, 더더욱 노력하면 더 저가의 MCU 및 클럭으로도 가능할 것 같은

생각이 드나, 나는 용역이므로 여기서 마무리. 근데 자꾸 원가를 절감하지 않으면 무언가 마음 한켠이

불편함. 예전에는 남이 안하는 거 오버해서 제공했으나 프로는 돈보다 10-20%만 더해주면 됨.

더 해주면 내 손해, 고객 이익이 아니라 . 나도 손해, 장기적으로 고객도 손해. 이 시장의 다른 분들에게도 손해.

8) MCU 풀로 동작키시니 10Mbps 에서는 꽤 열이 발생. 항온조 테스트시 염려할 정도는 아니나

차가운 FPGA 에 비하면 없어보이는 정도. 이거는 MCU 의 한계. 전류 소모가 많음.

처리 속도를 낮추면 기가막히게 온도가 내려감. 100ns가 나름 MCU 입장에서는 빡신가 봄.

이제 해당 제품은 공식 인증절차에 들어가게 되는데 남은 지뢰가 얼마나 될지..걱정이지만 잘 될거라 봅니다.

예전에 제가 마이컴으로 10MBps 신호를 잡아서

CRC 처리하고 다 파싱해서 4us 안에

응답패킷(CRC 포함)을 만들어서 처리하는 프로젝트에 대해서 질문드린적이 있습니다.

다들 FPGA를 권하셨지만

(당연히 FPGA 사용이 맞는 프로젝트지요)

하지만!

이론적으로 가능하다는 결론을 내고 과감히 MCU 로 도전하였고 2달 고생해서 성공한 것으로 보입니다.

아래 신호는 10Mbps 신호를 파싱해서 3.46us 만에 정상 응답하는 결과물입니다.

현재는 HSI 로 처리해서 데이터를 놓치는 경우가 많습니다. HSE 로 해보니 데이터 유실 비율이 확연히 줄어들어서, 노이즈 처리 잘하고 좋은 오실레이터를 사용해서 보드를 제작하면 될 것으로 생각됩니다.

물론 100% 패킷을 보장해야 된다던지 특수한 오류 처리를 해야 된다던지 하는 조건에는 미달하지만

현재 정도라면 이 프로토콜에서는 양호한 수준이라 생각됩니다.

그동안 검토한 내용은 아래와 같습니다.

1. 통신 주파수에 맞는 최고 클럭 MCU 를 찾자.

2. 개발보드 구매후 실제 패킷을 아날라이저로 보고 프로토콜 사양서를 참조하여 파싱 알고리즘 작성 및 검증

3. 제일 느린 통신 속도에서부터 하나씩 검증.

4. HSE 와 HSI 통신 파싱 에러율 검토

5. 응답 속도를 최대한 빠르게 하기위하여 CRC 알고리즘 재작성 및 파싱 알고리즘 최적화

6. 그냥 패킷을 전체 받고 나중에 계산하는 것이 아니라 한비트씩 받으면서 모든 연산 처리

7. 보낼때도 다 패킷을 만들고 보내는 것이 아니라 STX 부터 보내면서 데이터를 만들어 처리

8. 모든 보내고 받는 연산은 DMA 처리

9. HAL 라이브러리 거의 들어내고 레지스터 직접 연산 처리

남들이 가지 않는 길을 가서 굉장히 불안했었는데 나름 쾌감이 드는 프로젝트가 된거 같습니다.

무조건 STM32H7가 이 이정도 다 처리된다고 생각하시면 안되고

프로토콜의 여러가지 개구멍을 이용하여 처리하였으므로

일반적으로 다른 프로젝트에 적용하시면 안되니 주의바랍니다.

FPGA 쓰셔요~~~

 

안녕하세요.

 

 

최근에 엄청난 속도 최적화를 해야 될 일이 있어서 몇달간 고생을 조금 하였습니다.

 

STM32H7 하에서 이루어진 작업이므로 모든 프로젝트에 적용하기는 어렵습니다만,

거의 공통적인 부분이라 ARM 계열은 최소한 비슷하리라 생각됩니다.

 

너무 뻔한 내용일 수도 있으니 병아리들만 보셔도 좋습니다.

 

일단 어떤 기법보다 확인하는 툴이 중요하겠지요.

 

[Tool]

1. Diassembly 디버깅

  1) 컴파일러 툴을 이용하여 디어셈블하면서 내 코드가 어떻게 변환되는지 확인한다.

  2) 어셈블리 코드를 몰라도 되며 몇줄로 바뀌는지만 확인하면 충분하다.

 

2. CPU Counter 레지스터가 있으면 원하는 함수 시작부터 마칠때까지 CPU 카운트를 확인하여

    몇 카운트가 흘렀는지를 확인하여 수치로 정확하게 확인해본다.

 

도구가 준비되었으면 이제는 내 머리가 준비되면 됩니다.

[기본 지식]

1. 속도와 용량 둘다 잡을 수 없다. 싸고 좋은 물건은 없다.

   속도가 빠르면 용량이 크고 , 용량이 좋으면 속도가 느리다.

 

2. 위 1번 툴을 이용하여 C 코드가 어떻게 변경되는지 감을 조금 잡는다.

 

-아래부터는 STM32 쪽

3. 라이브러리는 끝까지 추적해서 직접 제어 하도록 한다.

    STM32 의 경우 HAL 라이브러리는 되도록 자제하고 직접 레지스터를 제어한다.

    그렇다고 무식하게 번지를 그냥 입력해서 가독성이 떨어지도록 할 필요는 없다.

 

4. 컴파일러 옵션은 speed 최대

 

5. 시스템의 캐쉬를 켤수 있다면 On ( 7-10배 증가)

 

6. DTCM 과 ITCM 이해

 

7. Bus 아키텍처를 보고 가장 짧은 라인으로 데이터가 움직이도록 처리

 

8. 되도록 DMA 처리

 

9. flash 보다는 ram 에서 실행하는게 더 빠르겠지요.

 

 

 

 

https://www.youtube.com/watch?v=jWqRqL4_mV0 

 

최근 17년전에 작성한 프로그램을 다시 추가 개발하고 있습니다.

 

당시 7년차일때 작성한 리눅스 프로그램으로 출장개발로 1년이 걸렸지요.

현재까지도 이 프로그램을 잘 운영되고 있고, 운영사에서 직접 유지보수하고 있지만

다른 개발자 5명 이상은 손을 거쳐간 프로그램이 되었습니다.

단순 테스트 검증시 1주일, 상세 검증은 한 달이 걸리는 나름 규모가 있는 프로그램입니다.

 

라인수 카운트를 해보니 6만5천줄 정도 되네요. 흥미로운 사실은 개발당시 리눅스 라이브러리에 대한 고정관념 같은게 있어서, C standard 라이브러리 이 외에는 전혀 다른걸 사용하지 않았다는 겁니다. 해당 줄 수가 실제 제가 코딩한 전부라는 거지요. xml parser, ftp 등등을 무슨 똥배짱인지 직접 다 코딩했었지죠. 이런 무식이! T.T

 

이 프로그램을 다시 개발하게 되었을 때 예전의 나를 보는 것 마냥 두근대고 부끄러워지더군요.

 

막상 소스를 열어보니 웬걸 제법 잘 짰는데..라고 생각되었습니다 (자화자찬 +.+)

main 문 안에 전부 task 처리하고, 변수는 struct 로 묶어서 전부 포인터 처리.

더 놀라운 사실은 17년동안 해당 전체 구조가 전혀 바뀌지 않은 상태로 유지되었다는 거고,

다른 개발자들도 제가 짠 구조 아래서 그 구조를 답습하여 프로그램을 개발해왔다는 사실입니다.

사실, 누구라도 외주 개발사 입장에서는 맘에 안들어도 전체를 뜯어 고치는 일은 전혀 다른 일이긴 합니다.

 

이번 수정은 추가 장비가 붙는 바람에 약 10% 정도 수정이 필요한 작업이었는데, 실제 집중 투여한 시간은 20일 정도입니다. 예전 7년차 개발 속도라면 2개월이 걸릴 일이 되겠군요. 17년만에 3배 이상 빨라진거 같습니다.

 

이번에 수정해야 할 부분 중  개발 당시 제일 애를 먹었던 알고리즘 수정 부분이 있었는데

도대체 왜 이렇게 구현했는지 소스를 따라가도 남의 소스를 보는 마냥 이해가 되지 않는 것이이었습니다.

그래서 해당 부분은 그 대로 남기고 , 오롯이 새로 코딩해보니 ,

결국 원래 부분과 똑같이 구현되는 것을 발견했습니다. 아, 그때 삽질한 게 아니었구나.. 하는 걸 알게 되었지요.

 

리눅스 시스템이나 쓰레드도 없는 함수 태스크 방식의 루프 프로그램이었지만

그 당시에 정말 예쁘게 짜려고 , 프로그램 경력에 오점을 남기지 않으려고 (다른 사람이 욕하는 프로그램을 짜면 안되니깐..) 나름 노력했었는데, 한참뒤에 제가 그걸 돌려받게 될 줄은 전혀 몰랐지요.

 

예전의 나의 모습을 거울로 다시 보는 듯한 경험.

그 당시의 고민의 흔적을 다시 되새기며, 그때 왜 그랬을까 한줄한줄 따라가다가

그 길이 최선이있다는 재발견.

 

흥미로운 경험이었습니다~~~

 

 

+ Recent posts