728x90
728x90
728x90
728x90

Zigbee 소개

지그비는 IEEE 802.15.4-2003을 기반으로 한 작고, 저전력의 디지털 라디오를 사용하는 하이레벨 통신 프로토콜

IEEE 802.15.4-2003는 단거리 라디오 주파수를 사용하는 램프, 전자계량기, 소비자용 전자제품과 같은 근거리 개인 무선통신망의 기준이다.

 

보통 IoT기기끼리 통신을 위해 사용한다.

 

Zigbee 특징

  1. 저전력 소모, 간단한 구현
  2. 한번의 배터리 충전으로 수 개월, 또는 수년간 사용 가능
  3. 활성 모드(수신, 송신), 슬립 모드를 가짐.
  4. 디바이스, 설치, 유지 등 모두 상대적으로 낮은 비용으로 가능
  5. 안전성(보안성)
  6. 신뢰성
  7. 유연성
  8. 매우 작은 프로토콜 스택
  9. 상호 호환가능 및 어느 곳에서나 사용 가능
  10. 네트워크당 높은 노트 밀집(지그비의 IEEE 802.15.4 사용은 네트워크에서 많은 디바이스를 다루는 것을 가능케 함. 이러한 특징으로 방대한 센서 배열과 네트워크의 통제가 가능)
  11. 간단한 프로토콜, 국제적으로 구현(지그비 프로토콜 스택 코드의 크기는 블루투스나 802.11의 사이즈에 비해 4분의 1 정도에 불과하다.)

 

통신 설정

CH : 통신 주파수 설정 - 통신하고 싶은 기기끼리 같아야 함 (범위 : B~1A)

ID : 통신하고 싶은 기기끼리 같아야 함 (범위  : 0000 ~ FFFF)

 

MY 값이 있는 경우

DH, DL은 각각 상대 zigbee의 MY 값과 같아야 한다.

 

MY 값이 없는 경우

DH와 SH, DL와 SL 값이 각각 상대 zigbee의 같아야한다

 

통신 거리 및 속도 실험

사용한 zigbee 모델은 digi사에서 만든 zbee (model : S2CTH / XB24CZPIT-004)

모든 테스트는 XCTU프로그램으로 테스트 함

통신 거리 테스트

실내 & 도심 : 3m ~ 5m

야외 : 70m ~ 80m

 

통신 속도 테스트

baud rate 9600으로 설정 시 (기본 설정인 듯) 3.61kbps

  Router Coordinator
ID 123 123
JV   Enabled [1]
NI Router Coordinator
AP
API Mode enabled with escapes[2]
API Mode enabled with escapes[2]
CE Disabled [0] Enabled [1]
NJ   FF
NW   14
DH 0 0
DL 0 0
MY 0 0

baud rate 230400으로 설정 시 7.33kbps

다른 설정들은 변경해도 유의미한 결과를 얻기 힘들었음

 

참고문헌

XBee Python Library

XBee-arduino

ZigBee 사용하기 - 코코아팹

지그비 무선 통신하기 - CreAmp

728x90
728x90
728x90
728x90

검색과 개발

“검색을 안하면 개발을 못하는 개발자”는 인터넷을 뒤져서 본인이 이해하지도 못한 코드를 복붙하는 개발자를 비판하려는 의도인 것 같습니다. 이런 비판 때문에 검색을 안하며 개발하는 개발자들이 있습니다.

 

하지만 반대로 “검색을 안하며 개발하는 개발자”도 위험할 수 있습니다. 검색은 내가 이미 알고 있는 방법보다 더 좋은 방법이 있는지 찾는 것 이기때문입니다. 경력이 많은 개발자 중, 10년~20년 전에 쓰이던 기술이나 방법만을 고집하는 분들을 종종 봅니다. 최신 기술이 항상 좋은 것은 아니지만 2020년에 새로운 사이트를 개발하면서 Python 2.7과 jQuery를 선택한다면 대체로 부적절한 판단일 가능성이 높습니다. 하지만 의외로 이런 경우가 제법 있습니다.

 

지금 풀려는 문제를 모르겠으면 검색을 해야 합니다. 지금 풀려는 문제가 너무 익숙해도 검색을 하면 좋습니다. 검색을 안 하면 개발을 못하는 개발자도 위험하지만, 검색을 안 하면서 개발하는 개발자도 위험합니다.


구글에서 검색하기

대체로 구글이 다른 검색 엔진에 비해 뛰어납니다.
심지어 네이버 API를 잉용하는 방법을 찾을 때에도 네이버보다 구글이 더 좋은 검색결과를 보여줍니다.


검색은 영어로

IT 관련 분야의 대부분의 정보는 영어로 생산되기 때문에 한국에 특화된 문제를 검색하는 경우를 제외하고는, 영문으로 검색할 때 더 좋은 결과를 얻을 수 있습니다.

심지어 모든 분야에서 영어로 검색하는 것이 좋다는 우스갯소리로 "한국사도 영어로 검색한다"는 말이 있습니다.

 

검색 엔진의 기능을 잘 쓰기

구글에서는 특정 단어를 큰따옴표에 넣어 검색하면 좀 더 정확한 검색을 할 수 있고 '-검색어'를 추가하여 특정 검색어를 제외한 결과를 얻을 수 있다. 더 많은 구글 검색엔진 기능

6) "키워드 검색"
키워드가 그대로 들어가 있는 검색을 하고 싶다면 해당 키워드를 " " 안에 포함해서 검색하면 된다.
eg)  python randint vs randrange 검색 시 관련 내용이 검색되고, python "randint vs randrange" 로 검색 시 ""안에 키워드가 무조건 포함된 게 검색된다.

7) +포함 , -제외
파이썬으로 엑셀자동화하는 방법을 검색할 때 openpyxl이 제외된 결과를 보고싶다면,

(python excel automation library -openpyxl)를 검색하면 된다.


검색 결과 중 클릭할 문서 잘 찾기

검색 결과, 적절한 문서가 나왔음에도 불구하고 엉뚱한 문서를 클릭해서 읽는 경우가 있습니다.
적절한 문서를 추려내 ctrl+click(맥은 ctrl+click 또는 휠 클릭)으로 여러개의 문서를 열어두고 하나씩 읽으면 편리합니다.

정보의 시의성

내가 찾고자 하는 문제의 맥락에 비추어 시의성이 적절한지 판단할 필요가 있습니다.
예를 들어 자바스크립트 Array와 관련된 검색을 했는데, 2010년 문서와 2019년 문서가 각각 나왔다면 2019년 문서를 보는 것을 추천합니다. 자바스크립트는 최근 10년 사이에 많이 변했기 때문입니다.
라이브러리, 프레임워크 (수개월)
각종 표준, 프로그래밍 언어, 운영체제 (수개월~수년)
각종 프로세스, 설계 방법론 등 소프트웨어 공학에서 다루는 주제들 (수년~수십년)
알고리즘, 자료구조, 프로그래밍 언어론, 운영체제론 등 주로 전산학에서 다루는 주제들 (수십년)

구글의 경우 검색창 아래에 Tools를 클릭하여 Any Time를 설정하여 최근 문서를 검색할 수 있습니다.

검색어 바꿔보기

검색 결과에 딱히 마음에 드는 문서가 없으면 페이지를 넘기기 보다 검색 키워드를 바꿔보길 추천합니다. 검색어만 제대로 입력하면 대체로 최상단에 원하는 결과가 나옵니다. 검색 결과 하단에 있는 “Searches related to…” 부분을 참고하여 관련 키워드를 찾아보는 것도 좋습니다.

버전 확인하기

프로그래밍 언어나 운영체제 등은 버전에 따라 적절한 정보가 다릅니다.
파이썬의 경우 특히 버전2와 버전3는 제법 큰 차이가 있으니 버전을 정확히 확인하는 것이 좋습니다.
[언어][필요시 버전][핵심 검색어][필요시 OS]으로 검색


원하는 결과가 잘 안나오면…

10분 이상 찾았는데도 모르겠으면 이 문제에 대해 지나치게 모르고 있기 떄문입니다. 그럴때면 공식 가이드라인, 공식 레퍼런스, 좋은 교과서, 논문, 위키백과 등을 찾아 읽으며 맥락 파악을 하는 편이 좋습니다.
사실은 어떤 라이브러리나 프레임워크를 이용하기 전에 반드시 공식 사이트에서 제공하는 기본적인 문서(레퍼런스 제외)를 꼼꼼하게 읽어두는 것이 좋습니다.

 

지식의 감가상각과 잔존가치

지식에도 감가상각이 있습니다. 어떤 지식은 잔존 가치가 더 빠르게 줄어들고 어떤 지식은 더 오래갑니다. 앞서 말씀드린 바와 같이, 최신성이 중요한 문제라면 더 자주 검색을 해보면 좋습니다. 오래가는 지식을 쌓아가려는 노력과 빠르게 변하는 지식을 갱신하려는 노력을 병행해야 합니다.


참고문헌

개발자를 위한 정보 검색 팁 :: -[|]- Box and Whisker

728x90
728x90
728x90
728x90

정규표현식이란

정규표현식이란 규칙을 가진 문자열을 표현하는데 사용하는 형식 언어입니다.
주로 문자열의 검색과 치환을 위해 사용하고 있습니다.
문자열이 특정한 조건을 만족하는지 분류가 필요한 경우 조건문을 사용하면 복잡하지만,
정규표현식을 이용하면 간단하게 분류 할 수있습니다.
하지만 간단한 만큼 가독성떨지는 단점이 있습니다.

 

표현식 의미
^x 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$ 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+ 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x? 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x* 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
x|y or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
(x) 그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
(x)(y) 그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
(x)(?:y) 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다.
x{n} 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
x{n,} 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
x{n,m} 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.
[xy] 문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy] not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
[x-z] range를 표현하며 x ~ z 사이의 문자를 의미한다. 
\^ escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\b word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\B non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\d digit 를 표현하며 숫자를 의미한다. 
\D non digit 를 표현하며 숫자가 아닌 것을 의미한다. 
\s space 를 표현하며 공백 문자를 의미한다. 
\S non space를 표현하며 공백 문자가 아닌 것을 의미한다.
\t tab 을 표현하며 탭 문자를 의미한다.
\v vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\w word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. 
\W non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. 

 

정규표현식을 사용할 때 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다.

Flag는 다음과 같은 것들이 존재한다.

 Flag 의미 
g Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. 
i Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
m Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. 

정규표현식 예시

핸드폰 번호 정규식

regex = /^\d{3}-\d{3,4}-\d{4}$/;

^ : 처음 (숫자 3개 앞에 아무것도 없어야 함)

\d{3} : (3자리 숫자)

- : 하이픈 존재

\d{3,4} : (3자리 또는 4자리 숫자)

\d{4} : (4자리 숫자)

$ : 끝

 

이메일 정규식

regex = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;

/^[0-9a-zA-Z] : 첫 문자는 숫자 또는 영문 대소문자로 시작

([-_.]?[0-9a-zA-Z])* : 

                        [-_.]? : - _ .  중 하나가 있어도 되고 없어도 되고

                        [0-9a-zA-Z] : 숫자 또는 영문 대소문자

                        * : 연속으로 몆개씩 있어도 됨

[a-zA-Z]{2,3} : 엉문 대소문자가 2개 또는 3개 존재

i : 대소문자 구분 x 근데 이럴거면 a-zA-Z할 필요 없는거 아닌가?


참고문헌

HAMA 블로그 - 정규표현식 정리

정규 표현식 테스트

728x90
728x90
728x90
728x90

난해한 프로그래밍 언어란

일부러 다른 프로그래밍 언어에 비해 사용하기 어렵게 만든 언어

 

제작 목적은 프로그래밍 언어의 한계 측정, 어떤 개념의 증명을 위해
혹은 단순한 장난으로 제작

 

그 중 아희라는 언어를 배워보자

 

아희로 코딩한 "Hello, world!"

밤밣따빠밣밟따뿌
빠맣파빨받밤뚜뭏
돋밬탕빠맣붏두붇
볻뫃박발뚷투뭏붖
뫃도뫃희멓뭏뭏붘
뫃봌토범더벌뿌뚜
뽑뽀멓멓더벓뻐뚠
뽀덩벐멓뻐덕더벅


아희

1. 자음

ㅇ, ㄱ, ㅋ: 아무 일도 하지 않는다.
ㅎ: 프로그램을 종료한다.
ㄷ, ㄸ, ㅌ, ㄴ, ㄹ: 각각 덧셈, 곱셈, 뺄셈, 나눗셈, 나머지 연산.
모두 공통적으로 저장공간에서 두 값을 뽑아낸 다음 둘을 연산한 값을 저장공간에 저장한다. 순서가 있는 연산자의 경우 나중에 꺼낸 값이 연산자의 왼쪽에 온다.
ㅁ: 출력. 받침이 ㅇ이면 숫자, ㅎ이면 문자 출력. 나머지 종성이면 출력값 없음
ㅂ: 입력. 받침이 ㅇ이면 숫자, ㅎ이면 문자 입력. 나머지 종성은 획수를 따짐
ㅃ: 중복. 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고

            큐라면 맨 앞의 값을 앞에 하나 더 덧붙인다.

            통로라면 아까 보낸 값을 한 번 더 보낸다.
ㅍ: 바꿔치기. 스택이라면 맨 위 값과 그 바로 아래 값을

                 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꾼다.

                 통로일 때의 동작은 미정.
ㅅ: 선택. 종성을 통해 자료구조에서 선택 가능.
ㅆ: 이동. 지금 저장공간에서 값 하나를 뽑아내서 받침이 나타내는 저장공간에 그 값을 집어넣는다.
ㅈ: 비교. 저장공간에서 값 두 개를 뽑아 내서 비교한다.

            나중에 뽑아낸 값이 더 크거나 같으면 1을, 아니면 0을 지금 저장공간에 집어넣는다.
ㅊ: 조건. 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 진행해야 할 방향대로, 0이면 그 반대 방향대로 간다.

 

2. 모음

모음의 방향이 커서의 방향이 된다
ㅏ: 오른쪽으로
ㅓ: 왼쪽으로
ㅜ : 아래로
ㅗ : 위로
ㅑ, ㅕ, ㅛ, ㅠ : 위와 같지만 2칸씩 이동
ㅣ: 커서가 세로로 들어오면 통과시키고, 가로로 들어오면 커서방향 반대로 뒤집는다.
ㅡ : 커서가 가로로 들어오면 통과시키고, 세로로 들어오면 커서방향 반대로 뒤집는다.
ㅢ : 어느방향으로 오던지 방향을 바꾼다.
이외의 모음은 아무런 기능을 하지 않습니다.

 

 

"Hello, world!"의 H 출력

밣밟따맣허

밣 : ㅀ의 획수 8을 입력

밟 : ㄼ의 획수 9을 입력

따 : 8과 9을 곱함 72

맣 : ㅁ은 출력 / 종성이 ㅎ이므로 아스키코드 72에 해당하는 H 출력

자바스크립트로 된 아희 실행기에서 한 단계씩 디버그(?) 가능

 

 

아희로 "Melon" 출력

밞북밙뚜맣뭏
붉더봀북토뭏
따빠뫃투볽뭏
북벋뻐더뽀후
타다빠밬토허


참고문헌

bloter - 들어보셨나요? 한글 프로그래밍 언어 3종

나무위키 - 난해한 프로그래밍 언어

아희 온라인 개발환경

나무위키 - 아희

728x90
728x90
728x90
728x90