CRUD는 무엇인가?

 

CRUD란 용어는 Create, Read, Update, Delete 또는 Create, Retrieve, Update, Destroy를 묶어서 이야기 하는 용어로 대부분의 software가 가지는 기본적인 데이터 처리기능을 지칭한다.

Create(생성), Read/Retrieve(읽기/인출), update(갱신), Delete/Destroy(삭제/파괴)의 기능을 하지 못하는 소프트웨어는 완전하다고 할 수 없다는 말이 있을 정도로 기본적인 기능에 속하기 때문에 한묶음으로 이야기 되어진다. 이러한 기능을 하는 대표적인 프로그램들로는 주소록앱이나 달력앱 그리고 Mysql같은 DB관리 software등이 있다.

Posted by duehd88
,

  우리의 컴퓨터는 고유한 주소를 가지고 있습니다. 바로 internet protocol인데 ip라고 줄여말합니다. 그러니까 컴퓨터간의 고유한 주소라고 볼 수 있습니다. 즉, ip덕분에 네트워크상에서 통신하기를 원하는 컴퓨터를 찾아 통신할 수 있도록 routing 할 수 있게 되는 것이죠.

 

  이러한 ip는 전세계적으로 동일하게 컴퓨터마다 할당하여 관리되어 지는데 각 나라의 공인기관에서 ip를 할당하고 관리합니다. 우리나라의 경우 KISA(한국인터넷진흥원)에서 담당하고 있습니다. 그리고 여기서 ip를 ISP(Internet service provider; SK브로드밴드, olleh KT, LG U+)가 부여받아 우리에게 제공을 해줍니다. 우리는 이 곳에 가입을 하고 모뎀을 통해 각 컴퓨터에게 ip를 제공받고 인터넷을 이용하게 되는 거죠.

 

  일반적으로 IPv4(Internet Protocol Version 4)가 이용되고 있고 3자리 숫자가 4마디씩 있고 이 ip는 32bit 주소체계로 2^32개의 주소를 부여 가능합니다. 현재 ip가 거의 포화된 상태라 IPv6(Internet Protocol Version 6)가 나왔고 표현식은 128bit의 2진수를 16bit단위로 나누어 16진수 변환 후 콜론으로 구분을 하면된다고 합니다. 총 128bit 주소체계로 2^128개의 주소 부여가 가능합니다. 하지만 아직 IPv4가 여전히 대부분을 이루고 있습니다.

 

  IP는 유동IP와 고정IP의 개념이 있습니다. 고정IP는 IP가 고정되어 있어서 변경되지 않습니다. 이는 서버같은 무언가 서비스를 제공하기위한 용도일 경우 주소가 변하면 되지 않으므로 이용합니다. 보안성이 우수하고 유동IP에 비해 가격이 비쌉니다. 서비스를 제공하는 곳에서는 대부분 이 고정 ip를 이용합니다. 유동ip는 인터넷을 접속하면 사용자에게 그때 그때 사용되지 않는 ip를 할당해주는 방식으로 운영이 됩니다. 모든 사용자들이 동시에 인터넷을 접속하지 않기 때문에 가능한 방법입니다. ip주소 부여의 경우 대부분 모뎀에서 이루어지며 공유기를 쓰신다면 기본적으로 내부 사설ip도 유동ip 형식의 운영이 됩니다.

 

  공인IP는 각 사용자들이 ISP로 부터 부여받는 IP를 말합니다. 여기서 유동IP와 고정IP개념을 생각 할 수 있습니다. 가정에서의 경우엔 늘접속하는 경우가 없습니다. 그래서 일반적으로 유동IP를 부여받아 이용합니다. 하지만 기업같은 경우 서비스를 제공해야하기 때문에 고정IP를 부여받아 이용합니다. 사설IP는 공유기같은 장비를 통해 부여받는 IP를 말합니다. 이 또한 대부분의 장비들이 기본적으로 유동IP형식으로 할당합니다. 그리고 설정을 통해 특정 MAC주소나 사용자계정에 고정IP 할당을 해주는 옵션을 제공해줍니다.

 

내 공인 ip를 알고 싶다면 접속해보자 : http://ipconfig.kr/

Posted by duehd88
,

6월에 시작!

8월까진 안드로이드 블루투스 공부하며 세월아 네월아 보내다가 8월 말부터 본격적인시작!

 

주제는 LED_ID를 이용한 위치 인식 시스템이다.

글로 대충 설명하자면

MCU보드(Atmega 128)이 제어하는 LED들에 ID를 부여하고

모형 자동차가 움직이며 특정한 위치에 정지했을때 해당 LED_ID를 인식하여

클라이언트 모바일로 보내준다.

 

1. LEDID를 제어하는 MCU는 Atmega128 이다.

2. 모형자동차에서 LED를 인식하는 부분은 안드로이드 카메라이고

  모형 자동차의 모터는 안드로이드로 제어를 하는데 이를 가능하게 해주는게 ioio board이다.

3. 클라이언트에서는 모형자동차의 위치를 알수있는 맵을 그려주고 모형자동차의 위치를 제어한다.

4. 데이터는 블루투스를 통해 주고 받는다.

 

현재 내가 맡은 부분은 클라이언트 앱과 블루투스 통신 기능을 짜고 모형차의 앱 몸체를 짜기로 했다. 이번 졸업작품의 핵심인 LED_ID와는 좀 떨어져 있다. 하지만 내가 하는 부분이 서비스를 제공하는 측면에서 매우 중요하고 더군다나 다른 부분보다 혼자 해야할 것들이 엄청 많기 때문에 나쁘지 않다.

 

----------------------------------------------------------------------------------------------------------------------------------

2014.06.01 - 블루투스 공부 시작. 생각 보다 괜찮은 예제들이 없음

그래도 새로 짜진 않고 구글에서 제공해주는 예제 코드를 수정해서 작성

에러가 너무 많아 일단 manifest의 화면이 회전 할때 마다 onCreate를 다시 호출함을 방지

그 외에 블루투스 state관리, BlueTooth socket thread관리, Activity의 lifecycle관리, 최신 버전에서 쓰이지 않는 코드등 수정할게 많음

2014.06.15 - 시험이 남아 있지만 최신 버전에서 쓰이지 않는 코드를 수정하기로 했다. 별거 아니고 ActionBar부분 이다. 코드로 뭔가 custom하려는

흔적이 있다 생각해 보니 예전에 내가 수정하다 추가했던거 같기도... 안드로이드 UI는 마냥 코딩으로 처리하기 보다 res-xml파일쪽에서 처리를 최대한 해놓는 것이 좋은것 같다.

2014.07.02 - 본격적으로 졸작팀이 모이기 시작했다. 블루투스 뼈대 코드에서 버튼을 누르면 해당 커멘드 신호를 보내고 받는 에코서버 같은 기능을

집어넣어봄. 예전에 C소켓 서버도 짜보았고 자바 서버도 아주 간단하지만 짜본적이 있어서 별무리없이 쉽게 짯다. 안드로이드 블루투스 소켓 부분은 그냥 일반 소켓 코딩하는 것과 거의 같은 것 같다. 그런데 연결관리가 잘되지가 않는다. 6월 1일에 있던 문제를 아직 해결하지 않은 탓인것 같다.

2014.07.25 - lifecycle 관리 문제를 해결하고 state관리를 어느정도 해결함. 문제는 한앱에서 discovery와 scan부분을 같이 갖고 있는데 이 부분이

thread가 따로 돌아가게 되는데 이때 이 thread들이 꼬이는 문제를 보였다. 우린 mater(discovery)부분과 slave(scan)부분을 나누려 했기때문에 이 문제가 자연스럽게 해결됬다.

이 날 같이하시는 누나가 opencv를 어려워하셔서 같이 코드 분석 하는 식으로 진행해서 안드로이드 화면분할 코드, color detect 코드를 우리 필요에 맞게 수정했다. 또 LED제어를 맡으신 형이 Atmega를 제어하기 위한 AVR 코드와 LED cell을 구성할 기초 회로를 이용하여 짜고 계신다. 7월 동안 도움주신 두분이 정말 감사하다. 특히 회로부분은 정말 큰 도움이 되었던것 같다.

2014.08.XX - 이 한달간은 자재구매와 전시할 틀완성, 클라이언트 앱의 프로토 타입을 완성 했다. 아직 에코서버 처럼 짯다. 이는 값을 주고 받는 문제

가 없는지 확인하기 위해 계속 놔두었다. 이제 주고받을 데이터의 구성을 하면 된다. 그리고 모터를 맡으신 형과 함께 모터돌아가는 예제를 분석해 보았다. 그런데 무슨 문제인지 돌지를 않는다. 하드웨어의 문제라고 생각되어져서 구글링을 통해 모터드라이브 연결부를 빼서 다시 연결했다. 구글링만 하고 30분정도 자버렸는데 그 동안 형이 다 연결해놓으셨다. 한쪽 바퀴가 돌아감을 확인했다. 하나만 돌아간게 이상했다. 역시 다시와서 보니 안돌아감... 그래서 핀맵도 달리해보고 연결도 다시해보고 하는데 안돌아간다. 뭐가 문제인가...

2014.09.05 - 뷰에서 현재위치가 표시되고 다른 위치로 이동하기 위한 시나리오를 추가 했다. 원래 시나리오는 방향키로 차를 이동하는 것이고 추가

시나리오는 맵에서 도착지점을 클릭하면 거기까지 이동하는 시나리오이다. 이 부분을 slave가 되는 클라이언트 앱단에서 처리할지 master가 되는 앱에서 처리를 할지 정해야 하는데 아무래도 master는 카메라영상처리와 모터제어,블루투스 까지 굉장히 많은 일을하기 때문에 클라이언트단에서 처리하기로 결정. 무엇보다 처음 연결될때 뷰를 그리기 위한 맵정보를 받고 시작하기 때문에 이를 기반으로 길을 찾는 메서드를 짜면 문제가 없다. 그리고 방향키제어 command를 string으로 이어서 주고, 이를 가공해서 순차적으로 수행하는 식의 매커니즘으로 짜면 아무래도 길을 찾는 메서드 작성도 큰어려움은 없을 것 같다.

2014.09.12 - 12일인지 그 전인지는 잘 생각안나지만 차가 돌아가기 시작했다. 코드를 새로 열고 테스트하셨다는데 내가 해결한게 아니라서 뭐가 문제

인지 정확히는 모르지만 이 또한 thread관리 문제였던것 같다. 안드로이드가 앞으로 가라는 신호를 한번 보내주면 계속 그 커멘트에 해당하는 행동을 한다. 그리고 모형 자동차가 탱크같은 식의 바퀴라서 90도 회전을 위한 정교한 모터 움직임이 필요할거 같다.

2014.09.14 - 안드로이드 ioio보드를 제어하기 위한 test 코드를 라이브러리를 이용해 연결관리 메커니즘과 clean한 코드를 위해 바닥부터 짯다. 잘돌

아가야 할텐데... 15일에 test 해보아야겠다.

2014.09.15 - 테스트해보니 계속 죽는다. ioio board가 usb 악세사리라서 연결을 해야하기 때문에 Log값을 찍어볼 수 가 없다. 이를 대응할 만한 부

분을 넣기도 뭐하고 그래서 Create부분만 분석해보니 라이브러리에서 제공하는 인터페이스에서 할당이 안되었는데 쓰는 문제였다. NullPointerException 문제인데 라이브러리에서 제공하는 사용법에 맞게 사용하는데 에러가 나서 당황스럽다. 분명 이전에 다른 코드를 실행해야 하는것 같은데... 돌거같다.... 암튼 원인해결을 어떻게 하면 될지는 알겠지만 뭘로해결 할지를 아직 못찾았다.

2014.09.26 - 길찾기 코드를 완성했다. 기존에 나와있는 a*star같은 탐색알고리즘들은 너무 무겁다. 그리고 장애물도 없고, 탐색할 필요없이 가는 법

을 계산하기만 해서 알려주면 되기 때문에 그냥 맵에서 위치간의 x와y축의 차이를 이용해 이동경로를 string에 넣었다. 이제 보내주고 그에 맞춰 모터를 제어하는 것만 해결하면 된다.

Posted by duehd88
,

parameter(파라미터)argument(아규먼트)  차이가 있다.

 

뜻을 보자면
형식 매개변수가 parameter(파라미터)이고

실제 전달인자가 argument(아규먼트)이다.

예를 들자면

int sumFunc(int a,int b){ 

... 

} 

에서의 함수가 구현될때 int a와 int b는 매개변수로 parameter(파라미터)라 하고,

실제로 저 함수가 실제 동작할때 넣어주는 의미있는 값

sumFunc(5,9);

의 경우 5와 9를 argument(아규먼트)라 한다.

Posted by duehd88
,

컴퓨터 메모리에서 데이터 저장순서? - 빅엔디안과 리틀엔디안

 

  바이트 오더링을 아십니까? 이는 "바이트단위로 순서를 세운다"라고 생각하시면 되는데요. 바이트 오더(Byte Order)하면 가장 먼저 떠오르는 두 가지가 빅 엔디안과 리틀 엔디안일 것 입니다. 많이 헷갈릴 수 있는 부분입니다. 프로그래밍을 하는 사람이라면 빅 엔디안과 리틀 엔디안 방식의 개념은 당연히 알아야할 요소라고 생각됩니다.

 

  빅 엔디안(Big-Endian)과 리틀 엔디안(Little-Endian)이라는 말은 조나단 스위프트의 걸리버 여행기에서 유래했습니다. 삶은 달걀은 둥근 쪽과 뾰족한 쪽이 있습니다. 둥근 쪽은 면적이 상대적으로 큰끝(big end)이고 뾰족한쪽은 면적이 작은끝(little end)입니다. 그리하여 소인국에선 둥근 쪽을 깨서 먹는 사람(Big Endian)과 뾰족한 쪽을 깨서 먹는 사람(Little Endian)으로 나누어 어느 쪽을 먼저 깨먹어야 하느냐에 대하여 대립을 벌이는데서 비롯 되었다고 합니다.

 

빅 엔디안 (Big-Endian)

- unix를 사용하는 RISC processor 계열에서 사용하는 Byte Ordering입니다.

- network protocol에서 표준으로 사용하는 Byte Ordering이기도 합니다.

- 메모리 시작 주소에 상위 바이트부터 기록합니다.

 

리틀 엔디안 (Little-Endian)

- intel계열의 processor에서 사용하는 바이트 오더링 입니다.

- 메모리 시작주소에 하위 바이트부터 기록합니다.

-------------------------------------------------------------------------------------------

우선 쉽게 설명하자면 87453489라는 정수가 있다고 칩시다. 이를 int형 4byte의 메모리에 저장할 때

* Big-Endian 저장방식 : 87 45 34 89

* Little-Endian 저장방식 : 89 34 45 87

이런 식으로 저장합니다.

 

  이렇게 87 45 34 89가 총 4byte로 1byte씩 순서에 따라 저장되기 때문에 빅-리틀 엔디안을 byte ordering이라 합니다. 바이트단위로 순서에 따르기때문이죠.

 그런데 Big은 원래의 수를 1byte씩 나눠 순서대로 저장했지만, little은 원래의 수를 1byte 단위로 나눠 거꾸로 저장했네요? 하지만 1byt단위 내에서는 순서가 그대로입니다. 이 부분이 중요합니다.

 

-------------------------------------------------------------------------------------------

    MSB와 LSB로 이해해보자!!!

 

  MSB (Most Significant Bit), LSB (Least Significant Bit) 참 어려워 보이는 말입니다. 하지만 그리 어렵지않습니다.  용어만 생겻을 뿐이지 위의 쉬운 설명에서 크게 벗어나지 않습니다. 그리고 메모리주소 값의 개념만 있다면 용어에 상관없이 이해하실 수 있습니다.

* MSB - Most Significanct Bit (가장 큰 비트 자릿수, 최상위비트)

* LSB - Least Significant Bit (가장 작은 비트 자릿수, 최하위비트)

입니다.

 

  맨위에서 설명하기 앞서 Big-Endian은 메모리 시작 주소에 상위 바이트부터 기록하고, Little-Endian은 메모리 시작주소에 하위 바이트부터 기록한다고 했습니다. 아래 그림을 봅시다.

12345678 이라는 숫자가 있습니다. 이 숫자의 MSB(최상위 비트)가 포함된 숫자는 1입니다. 물론론 최상위 비트가 1인것을 아닙니다. 하지만 최상위 bit가 속한 수는 1이란것을 알수있습니다. 그리고 최상위 bit가 속한 byte단위의 수는 12 입니다. 그럼 최하위 bit인 LSB가 포함된 수는 8입니다. 물론 최하위 bit가 포함된 byte단위의 수는 78 입니다.

 

  왜 최상위bit가 포함된 byte단위수라고 할까요? 복잡하게시리... 그 해답은 bit에 있습니다.

 

12345678을 한글자씩 끊어서 bit로 표현해봅시다.

 

0001 0010 0011 0100 0101 0110 0111 1000

  1    2    3     4    5    6    7     8

여기서 0가  MSB, 0LSB인것입니다. 그리고 byte단위로 끊는다면 12/34/56/78 이기 때문에 MSB, LSB가 포함된 byte단위수라는 표현을 사용했던 것입니다.

 

  이제 나머지는 위의 설명들을 종합해서 자신의 머릿속에서 정리하는것에 달렷습니다.

--------------------------------

 가끔 byte ordering, bit ordering에 대한 말들이 bit ordering은 왜 빅엔디안방식만 따르는가? 에 대해 생각하는데 1번 힌트는 bit ordering은 bit단위로 순서를 세운다. 2번 힌트 bit단위(2진수)로 거꾸로 세워서 다시 10진수로 고쳐보자.

 

그리고 무엇보다 엔디안(endian)이라는 말은 byte ordering에 대해서만 쓰이는것이지 bit order로는 생각하면안된다고 생각됩니다.

 

출처 - http://blog.naver.com/duehd88/20163866392

'Programing > programing note' 카테고리의 다른 글

CRUD는 무엇인가?  (0) 2015.12.06
ip에 대해서  (0) 2015.02.17
졸업작품 뒤죽박죽 개발일지  (0) 2014.10.04
parameter(파라미터)와 argument(아규먼트)  (0) 2014.06.29
Posted by duehd88
,