외국 웹을 돌아다니다 보면 i18n이나 l10n 등의 표현을 종종 발견할 수 있다. leet체 같은건가 싶었는데 실제로는 조금 달랐다.

영단어를 보면 꽤 단어들이 몇몇 있다. 세상에서 제일 긴 단어 같은걸 언급하자는 건 아니고, 위의 것들도 긴 단어를 축약해서 표현한 것이다.


i18n은 internationalization(국제화), l10n은 localization(현지화)을 각각 첫 글자와 마지막 글자 사이의 글자수를 적어 표현한 것이다. 한국어로는 3글자로 끝나는데 영어로 표현하자니 아득하다. 저걸 몇번씩 타자로 치다 보면 키보드가 다 닳아버릴 것만 같다. 그래서 영어권 사람들은 더 간략하게 쓰기 위해 글자수 표현법을 만들어냈다.


이 두 단어는 번역 이야기에 자주 등장하는 단어들이다. 다른 나라에도 맞게 한다는, 얼핏 보면 비슷한 의미인 것 같다. 그 둘의 차이는 무엇일까?

전문적으로 배운 것은 아니지만 내가 이해한 바로는 이렇다.

i18n, 국제화는 한 언어를 여러 언어들에 대응시켜 다른 국가의 사람들에게도 읽힐 수 있게 만드는 작업이다.

반면 l10n, 현지화는 그것보다 좀 더 심화적으로, 단순히 내용이 읽히는 것에 더해서 지역명이나 인물을 바꾸거나, 숙어와 속담, 문화와 생활 양식 등을 대상 국가에 맞춰 치환해서 현지화라는 이름에 걸맞게 해당 문화권에 거부감 없게 다가갈 수 있도록 만드는 작업이라고 생각한다.


궁극적으로는 현지화를 하는 게 이상적이겠지만, 어찌 보면 당연하게도 인력, 지식, 시간, 예산 등 여러 한계가 있을 테니..

일반 스마트폰 앱이나 웹사이트 같은 경우는 i18n 번역 정도로도 충분히 접근성을 확보할 수 있다. 현지화는 게임이나 광고 등 사용자에게 더 감성적으로 다가가고자 하는 경우에 적합할 것이다.

블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.

AVR을 프로그래밍할 때 주로 C를 사용하지만, 다른 부품들과 시간을 맞추기 위해 어셈블리를 써서 최대한 성능을 뽑아내야 할 때가 있다.

그 과정 중 자주 사용하는 동작인, 레지스터 하나의 값을 0으로 만드는 방법 34개가 정리된 글을 발견했다. 특정 조건/값에서만 되는 경우도 있고, 할 수 있다는 것에 의의를 두고 굳이 이렇게 쓸 필요는 없겠다 싶은 방법도 있어서 이 글에서 34가지 전부는 아니고 중요한/쓸만한 방법 5개만 추려보았다.


우선 시작하기에 앞서 사실 첫번째 방법이 가장 많이 쓰인다. 나머지 방법들은 상태 레지스터 결과가 다르니 경우에 따라서는 유용할 수도 있다.


지우고자 하는 레지스터의 이름은 "reg"로 표현한다.


1. CLR / EOR

clr reg

r0~r31까지 모든 레지스터에 대해 사용할 수 있는 가장 단순하고 쉬운 방법이다. CLR 명령어는 기본적으로 아래의 EOR(배타적 논리합, XOR)과 동일하다.

eor reg, reg

위 두 가지 명령은 실행하면 상태 레지스터를 변화시킨다. S(부호), V(오버플로우), N(음수) 비트는 0으로 설정하고, Z(제로) 비트는 1이 된다. 나머지 H(절반 캐리), C(캐리) 비트는 전에 설정된 대로 유지된다.


2. LDI

ldi reg, 0

처음에 CLR과 LDI의 차이를 찾아보다가 이 글을 쓰는 계기가 되었다. reg에다가 0 값을 넣는 명령인데, LDI는 CLR과 달리 r16~r31까지 상위 16개의 레지스터에만 사용할 수 있다. 그리고 상태 레지스터는 변하지 않는다! 전에 설정된 상태 그대로 유지되므로 분기 명령 전 레지스터 초기화 상황에는 유용할 듯 하다.


3. SUB

sub reg, reg

자기 자신을 빼서 0으로 만드는 방법이다. 이 방법은 r0~r31까지 모든 레지스터에 대해 사용할 수 있다. 1번과 비슷한데, 결과로 설정되는 상태 레지스터가 살짝 다르다.

S, V, N, Z 비트는 1번과 동일하게 설정되는데, EOR에서는 설정되지 않았던 H, C 비트까지도 SUB을 사용하면 0으로 설정된다.


4. MOV

mov reg, r1

x86 어셈블리를 사용해봤다면 mov reg, 0의 형태에 친숙할 것이다. 그러나 AVR에서는 레지스터간 복사는 MOV, 즉시값은 LDI로 분리되어 있다.

이 방법은 MOV 명령을 이용해 값이 0인 레지스터를 복사해오는 것인데, r0~r31까지 모든 레지스터에 대해 사용할 수 있고, LDI와 마찬가지로 상태 레지스터를 변화시키지 않는다.


r1 레지스터를 사용한 점도 눈여겨볼 수 있다. 순수 어셈블리로만 프로그램을 작성했다면 모를까, avr-gcc를 사용해 C 프로그램을 작성하고 인라인 어셈블리를 사용한다면 r1은 항상 0으로 되어있기 때문이다.(참고) C 인라인 어셈블리에서 r0 레지스터는 아무렇게나 사용해도 되며, r1 레지스터는 사용한 후에 반드시 0으로 돌려놓아야 한다.

물론 어셈블리 코드 내에서는 자유롭게 r1을 사용해도 되고, 중간에 인터럽트가 발생해도 r1에 저장된 값을 유지해주므로 코드가 끝날 때 r1을 0으로 돌려둘 것만 기억하면 된다.(인라인 어셈블리 문법으로 r1을 사용한다고 표시하면 알아서 된다.) 단, 이 MOV 명령 사용 전 r1을 0이 아닌 값으로 바꿨다면 이 방법은 쓸 수 없을 것이다.


5. MUL ([F]MUL[S[U]])

mul r0, r1

여기서도 4번과 마찬가지로 값이 0인 r1 레지스터를 사용했다. 이 방법의 기본적인 원리는 레지스터의 값에 0을 곱해서 0으로 만드는 것이다. 그런데 reg 대신 r0으로 사용한 것을 볼 수 있는데, MUL 계열 명령어의 특성상 곱셈 결과가 r1:r0에 저장되기 때문이다. 따라서 r0을 초기화할 때에만(reg=r0) 사용할 수 있다.


그리고 곱셈 명령어는 2 사이클만큼 소요되고, 상태 레지스터의 H, S, V, N 비트는 전 상태 그대로 유지한다. Z, C 비트는 0으로 설정될 것이다.

'하드웨어 > AVR·Arduino' 카테고리의 다른 글

레지스터를 지우는 방법 5가지  (0) 2017.01.23
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.

회로에서 가장 기본적인 부품에는 저항이 있다.


사진 출처 위키피디아

생김새로는 이렇고, 회로도에서는 아래와 같이 그린다.

아래의 기호는 IEC(국제 전기 표준 회의)의 저항 기호라는데, 주로 그냥 위의 지그재그 기호를 사용한다.


저항의 겉에는 색띠로 저항값을 표시하는데 그걸 읽는 규칙은 이렇다.

비교적 멀찍히 띄워진 띠(주로 금색, 은색)를 오른쪽에 두고, 오른쪽 끝 2개의 띠를 빼고 아래 표의 색깔대로 읽는다.

 검정

 갈색

 빨강

 주황

 노랑

 초록

 파랑

 보라

 회색

 흰색

 0

 1

 2

 3

 4

 5

 6

 7

 8

 9


이걸 10진수로 차례대로 배열해서 숫자를 얻는다.

위의 사진의 저항의 경우 금색을 오른쪽으로 두어서, 왼쪽부터 읽으면 주황, 주황이므로 33이 나온다.


그 다음, 마지막에서 두번째 띠는 위 표의 숫자로 10의 n배 해서, 즉

 검정

 갈색

 빨강

 주황

 노랑

 초록

 파랑

 보라

 1

 10

 100

 1,000(1k)

 10k

 100k

 1,000k(1M)

 10M

를 먼저 구했던 숫자에 곱한다. 물론 위의 표에 더해서 회색, 흰색도 있고 검정 아래로 금색(0.1), 은색(0.01)도 있다. 아무튼 주로 쓰이는 색들은 이렇다.

아까 33을 구했고, 마지막에서 두번째 띠는 갈색이므로 10을 곱하면 330이 나오고, 이게 이 저항의 값이 된다. 즉, 위의 저항은 330옴이다.


마지막 띠는 이 저항의 오차값인데, 주로 쓰이는 색은 이렇다.

 없음

 은색

 금색

 갈색

 보라색

 20%

 10%

 5%

 1%

 0.1%

오차가 작을수록 가격은 비싸지는데, 5%정도면 충분하고 10% 이상 오차가 나는 저항도 거의 없으니 무난하게 5% 짜리면 적당하다.


대략적인 가격은 5% 저항 개당 10원, 1%는 20원 정도이고 더 큰 오차를 갖는 저항은 찾기도 힘들다. 보통 파는 데에서는 같은 저항값끼리 10개 단위로 판매한다.

'하드웨어 > 전자 기초' 카테고리의 다른 글

저항, 저항 읽는 법  (0) 2017.01.07
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.

약 1년 만에(?) 블로그 포스팅을 하는데... 전의 내용에 이어서 최종 결과까지 올리자면 이렇다.

우선 제작 사진으로,

 

이 것이 실제로 시연에 사용된 로봇의 모습이다. 전반적인 뼈대는 EV3를 사용했고, 그 위에 3개의 USB 마이크가 연결된 라즈베리 파이를 얹었다. 라즈베리 파이의 전원으로 EV3의 USB 포트를 사용했고, 서로 블루투스를 이용해 통신을 한다.


라즈베리 파이는 3으로, 내장된 블루투스가 있고 Raspbian Jessie를 사용했다. 프로그램은 systemd에 데몬으로 등록해두어 시스템 시작 시에 같이 시작되도록 했고, ALSA로 마이크로부터 값을 읽어서 계산해서 연결된 EV3로 값을 전송한다.


EV3는 통신으로 방향을 받아 모터를 제어하며, 정면에 설치된 초음파 센서를 이용해 앞 대상까지의 거리를 측정해서 정지 및 장애물 회피 기능도 수행한다. 앞의 물체와의 거리가 일정 이상 가까우면, 마이크로 인식한 주인의 방향이 정면이라면 (앞의 물체가 주인으로 인식해서) 정지하고, 아니라면 장애물이라고 인식해 크게 방향을 전환한다.


아래는 작동하는 모습을 촬영한 영상이다. 약 2미터 정도의 거리까지는 위치를 인식해서 방향을 찾아온다.



'완료된 프로젝트 > Homing Robot' 카테고리의 다른 글

완성품 & 작동 영상  (0) 2017.01.07
프로그램 제작기  (2) 2016.12.10
로봇 따라가기의 기본 원리  (3) 2016.12.09
프로젝트 개요  (5) 2016.12.08
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.