임베디드 리눅스 시스템 스터디

Posted by ironmask84
2017. 9. 26. 23:46 나는 프로그래머다!/Linux



HW를 동작시키는 SW 중에는


OS가 없는 펌웨어를 제외하고,


OS를 탑재시키는 경우에 리눅스를 많이 사용합니다.


C언어 기반이어서 HW 호환성(chip set)이 좋을 뿐아니라, 

오픈소스이기 때문에 로열티없이 사용도 가능하기 때문이죠 :)


하지만, 상용 OS가 아니기에 서비스 지원이 따로 없으므로...

개발자들에게 높은 수준의 개발능력을 요구합니다..

안좋게 말하면, 개발자들이 죽쑤게 된다는 것이죠 ㅜㅜ



저 또한 약 1년 전부터 실무에서 BSP 레벨 개발 업무를 맡게 될 것을 대비하여

리눅스에 대해서 공부를 하려고 했습니다.

http://ironmask.net/297 )


하지만, 개인적 사정으로 8개월 정도 텀이 생기게 되었고...

현재는 라즈베리파이로 개인 스터디를 해보려 하고 있습니다.. ㅋㅋ

http://ironmask.net/349 )


5년 전쯤에 Android Porting & Structure 이란 교육을 받은 적이 있습니다.

회사에서 Android 업무를 늦게나마 (2012년에 받았지만, 안드로이드는 2009년부터 이미 시작되어 왔기에..)

부랴부랴 받았을 때, 리눅스에 대해 잠깐 배운 기억이 있습니다.

Android 도 리눅스 커널을 OS를 사용하기 때문이죠 :)

이 때 교육은 5일짜리 였습니다.


5년 후인 이번주에 임베디드 리눅스 시스템이란 교육을 받고 있는데요.

이 교육도 5일짜리 입니다.

5일로는 방대한 내용의 교육입니다만, 

교육 받는 것도 감지덕지 하면서 최대한 배우려 애를 써봅니다. ㅋㅋ


짧은 지식이지만, 앞으로 계속 정리해가는 차원에서

글 몇개 씨리즈로 올려보겠습니다. ^^


임베디드 시스템 개념 정리 : http://ironmask.net/384







 

컴퓨터 시스템과 임베디드 시스템 개념

Posted by ironmask84
2017. 9. 25. 23:56 나는 프로그래머다!/기초 다지기




임베디드 시스템?

전자제품을 동작시키는 SW와 HW를 통틀어 임베디드 시스템이라고 합니다.

전자제품이란 여러분이 잘 아시는 것처럼, 

전기밥솥, 세탁기, 냉장고 와 같은 가전에서부터 휴대폰, 자동차, 비행기 등 

첨단 전자제품 까지 20세기부터 매우 빠르게 발전해오고 있습니다.

최근엔 아두이노, 라즈베리파이와 같이 간단하게 임베디드 시스템을 

Study 할 수 있는 HW가 보급화되고 있습니다.

저 또한, 요즘 4차산업혁명에 핵심 키워드 중 하나인 IoT관련 부서에서 

업무를 맡게되어 많은 관심을 가지고 있고, 

라즈베리파이 개인 Study도 해보려고 하고 있습니다. 

http://ironmask.net/349


컴퓨터 시스템?

컴퓨터 시스템이라고 하면, 말 그대로 컴퓨터를 이용한 시스템입니다.

일반적으로 기업이나 관공서에서 관리하는 전산실 서버에서부터

기상청과 같이 특수하게 대량의 데이터 분석이 필요한 경우 등 다양하게 구성될 수 있습니다.

그리고 임베디드 시스템 또한, 컴퓨터 시스템 중에 하나입니다.

임베디드 기준으로 컴퓨터 시스템에 포함되는 개념들은 이렇습니다.

* HW

-MicroProcessor (요즘 CPU)

A microprocessor is a computer processor that incorporates the functions of a computer's central processing unit (CPU) on a single integrated circuit (IC),[1] or at most a few integrated circuits.[2] The microprocessor is a multipurpose, programmable device that accepts digital data as input, processes it according to instructions stored in its memory, and provides results as output. Microprocessors contain both combinational logic and sequential digital logic. Microprocessors operate on numbers and symbols represented in the binary numeral system.

ex)STM32, atmega128


좀 더 상세한 내용은 아래를 참조 해주세요.

마이크로프로세서

- 작은 실리콘 칩 위에 트랜지스터를 수천 만 개 집적한 소자

- 마이크로는 매우 작은 크기, 프로세서는 처리기 혹은 CPU를 뜻하므로 마이크로프로세서는 “매우 작은 처리기”를 의미

- 인텔에서 intel 4004라는 최초의 마이크로프로세서 개발(1971년)

 

마이크로프로세서의 2가지 형태

CPU형 마이크로프로세서

- CPU 기능 대부분을 칩 하나에 집적하고, CPU형 마이크로프로세서를 중심으로 ROM, RAM, 입출력장치 등을 추가하여

마이크로컴퓨터를 구성할 수 있다.

단일 칩 마이크로컴퓨터

- 마이크로컴퓨터에 들어가는 모든 부품들을 하나의 반도체 칩에 집적한 것

연산용과 제어용으로 분류하며, 제어용 단일 칩 마이크로컴퓨터를 마이크로 컨트롤러 라고 하고 8051,AVR, PIC 등이 있다.

마이크로프로세서의 분류

​메모리 구성 에 따라

폰 노이만 구조

- 데이터 영역과 프로그램 영역의 물리적인 구분이 없고 버스 크기도 동일

- 데이터와 프로그램 코드를 동일하게 취급하므로 데이터도 프로그램 코드에 함께 들어감

ex) 일반 데스크톱 PC​

하버드 구조

- 프로그램 버스와 데이터 버스가 별도로 있는 것이 특징이며 동시에 액세스가 가능한 방식. 데이터 메모리가 레지스터 파일 형태로 통합 관리

- 레지스터와 메모리간에 상호전송이 필요 없게 되어 명령어 수를 줄이고, 속도를 빠르게 할 수 있음

- 데이터 영역과 프로그램 영역이 물리적으로 구분되어 있고 각 버스의 크기들이 서로 다를 수 있음

- 데이터와 명령어를 분리해서 처리

ex) 8051, PIC, AVR

CMOS 구조

- 소비전력이 매우 적으며, 전달 특성이 우수하고 동작 전압의 범위가 넓음

​명령어 구조 에 따라

CISC(Complex Instruction Set Computer) 구조

- 복합 명령어 셋 컴퓨터’라는 의미를 지니는 방식이며, 대표적으로 인텔의 x86계열 CPU와 펜티엄 4도 이 방식을 사용

- CPU가 처리할 수 있는 명령어를 모두 내장하므로 CPU의 구조가 매우 복잡

- CISC 방식의 장점은 뛰어난 호환성에 있음

- 개인용 컴퓨터인 PC에 많이 사용. 8051은 CISC 방식

RISC(Reduced Instruction Set Computer) 구조

- 축소 명령어 셋 컴퓨터’라는 의미를 지니는 방식이며, 주로 대형컴퓨터나 워크스테이션에 사용

- CPU에 내장된 명령어를 줄여 보다 빠른 처리속도가 특징

- CPU의 구조를 보다 단순화

- 컴파일러에게 많은 짐을(연산과정)을 넘김으로써 CPU 내부 구조를 단순하게 제작

- 복잡한 명령어는 단순한 명령어를 조합해서 사용

프로그램이나 알고리즘을 신속하게 실행하기 위한 목적의 마이크로프로세서는 다양한 입출력 장치를 이용하여 자원을 관리하고 운영하는 장치이다.

마이크로컴퓨터는 마이크로와 컴퓨터가 결합된 용어로 작은 컴퓨터 시스템을 말한다.

마이크로컴퓨터는 작은 휴대용 시스템부터 휴대용 노트북, 스마트폰등 성능에 따라 여러 가지 기기에 이용되고 있다.



-MircoController (CPU를 탑재한 단일칩 형태의 컴퓨터)

A microcontroller is a small computer (SoC) on a single integrated circuit containing a processor core, memory, and programmable input/output peripherals. Program memory in the form of Ferroelectric RAM, NOR flash or OTP ROM is also often included on chip, as well as a typically small amount of RAM. Microcontrollers are designed for embedded applications, in contrast to the microprocessors used in personal computers or other general purpose applications consisting of various discrete chips..

Microcontrollers are used in automatically controlled products and devices, such as automobile engine control systems, implantable medical devices, remote controls, office machines, appliances, power tools, toys and other embedded systems. By reducing the size and cost compared to a design that uses a separate microprocessor, memory, and input/output devices, microcontrollers make it economical to digitally control even more devices and processes. Mixed signal microcontrollers are common, integrating analog components needed to control non-digital electronic systems.

MCU를 통합시킨것 시킨 것, SOC(System On Chip)


-MicroComputer (일반적인 PC)

A microcomputer is a small, relatively inexpensive computer with a microprocessor as its central processing unit (CPU).[2] It includes a microprocessor, memory, and input/output (I/O) facilities. Microcomputers became popular in the 1970s and 80s with the advent of increasingly powerful microprocessors. The predecessors to these computers, mainframes and minicomputers, were comparatively much larger and more expensive (though indeed present-day mainframes such as the IBM System z machines use one or more custom microprocessors as their CPUs). Many microcomputers (when equipped with a keyboard and screen for input and output) are also personal computers (in the generic sense).[3]

기타 외부 장치( I/O핀 등)을 모듈화 시킨 것

ex)SBC(single Board Computer)


* SW

os를 사용 안한 하위제어

- 펌웨어 firmware

하드웨어와 소프트웨어 중간 http://blog.naver.com/kangusreport/220628959921

In electronic systems and computing, firmware[a] is a type of software that provides control, monitoring and data manipulation of engineered products and systems. Typical examples of devices containing firmware are embedded systems (such as traffic lights, consumer appliances, and digital watches), computers, computer peripherals, mobile phones, and digital cameras. The firmware contained in these devices provides the low-level control program for the device. As of 2013, most firmware can be updated.[2]


os를 사용한 상위제어
- platform 

Computing platform, a framework on which applications may be run

The term computing platform can refer to different abstraction levels, including a certain hardware architecture, an operating system (OS), and runtime libraries.[1] In total it can be said to be the stage on which computer programs can run.


-커널 Kernel(핵심) https://en.wikipedia.org/wiki/Kernel_(operating_system)
예)Linux, Ubuntu(Ubuntu (operating system), a Linux distribution)
Kernel (operating system), the central component of most operating systems(OS)


In computing, the kernel is a computer program that manages input/output requests from software, and translates them into data processing instructions for the central processing unit and other electronic components of a computer. The kernel is a fundamental part of a modern computer's operating system.[1]


To perform useful functions, processes need access to the peripherals connected to the computer, which are controlled by the kernel through device drivers. A device driver is a computer program that enables the operating system to interact with a hardware device.


리눅스는 커널이라는 말이 맞지만, 인터페이스(쉘), 어플리케이션이 있어야 사용가능 하므로 보통
리눅스 = "커널" + "인터페이스" + "어플리케이션"이라고 함
커널은 메모리를 관리하고 디스크를 관리하고, 그 밖으 모든 컴퓨터 자원을 관리하는 메인 프로세스입니다.
이 커널에 명령을 넣어줄 수 있는것이 인터페이스 입니다. 흔히들 쉘 이라고 불리웁니다. 즉 커널 자체만
으로는 입력이 없기 때문에 동작이 의미가 없고 사용자로부터 인터페이스를 통해 입력값을 주면 커널은
거기에대한 동작을 하거나 결과값을 내줍니다. 어플리케이션는 이러한 일련의 동작을 뭉터기로 모아서
커널에 명령을 전달하는 수단이 되겠습니다.

http://m.kin.naver.com/mobile/qna/detail.nhn?d1id=1&dirId=10302&docId=189452439&qb=7Jq07JiB7LK07KCc7JmAIOy7pOuEkCDssKjsnbTsoJA=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

Framework http://cafe.naver.com/openrt/6527

예)ROS로봇소프트웨어 개발하는데 필요한 것을 지원해주는 것
   GUI 기반의 소프트웨어 개발에 필요한 도구들을 제공 

Framework들은 복잡하게 구성이 되어 있는 로봇의 소프트웨어 요소들을 기반으로, 다른 어떠한 로봇 소프트웨어을 개발하고 연동시키는데 필요한 기능들을 제공합니다. 따라서, 본인이 로봇의 소프트웨어를 처음부터 끝까지 모두 만들 것이 아니라면, 이러한Framework들을 이용하는 것이 현명하며, 또한 Team-work을 통하여 로봇의 소프트웨어를 개발할때도, 상호연동의 편의성을 위하여 이러한 Framework를 사용하는 것이 좋습니다.

ROS 가 대표적인 예 입니다. ROS 는 ROS 의 각 요소(노드) 들이, 원활하게 데이터를 주고 받을 수 있는 메커니즘을 제공함과 동시에, 여러 명령어, 개발된 소프트웨어를 빌드할 수 있는 도구, 시뮬레이터와 같은 유용한 도구들을 제공하죠. 이렇게, 뭔가 통합적으로 제공되는것을 통틀어 프래임워크(Framework) 라고 합니다. 다음에는, 이러한 로봇 개발을 위한 프래임 워크에 대하여 살펴 보기로 하죠
좀 귀찮더라도, 로봇의 소프트웨어쪽을 하시고 싶으신 분들은, 반드시 framework기반으로 공부를 하시는 것을 권장 드립니다


Software framework, a reusable set of libraries or classes for a software system (or subsystem)
Application framework, used to implement the standard structure of an application for a specific operating system


- 미들웨어 Middleware 

소프트웨어의 중간 http://cafe.naver.com/openrt/6512 

운영체제와 응용프로그램 사이의 i/O나 통신

예) ROS


Middleware is computer software that provides services to software applications beyond those available from the operating system. It can be described as "software glue".[1] Middleware makes it easier for software developers to perform communication and input/output, so they can focus on the specific purpose of their application. Middleware is the software that connects software components or enterprise applications. Middleware is the software layer that lies between the operating system and the applications on each side of a distributed computer network. Typically, it supports complex, distributed business software applications.


- 프레임워크=미들웨어,런타임,빌드도구 등

-applications

Application software, computer software designed to help the user to perform specific tasks

An application program (app or application for short) is a computer program designed to perform a group of coordinated functions, tasks, or activities for the benefit of the user. Examples of an application include a word processor, a spreadsheet, an accounting application, a web browser, a media player, an aeronautical flight simulator, a console game or a photo editor. The collective noun application software refers to all applications collectively.[1] This contrasts with system software, which is mainly involved with running the computer.

OS중 핵심구성요소 Kernel - FrameWork 중 Middleware  - applications

이 전체를 플랫폼이라고 함!


출처
http://kangusreport.blog.me/220629130686
http://blog.naver.com/dustmd0815/220807532921


'나는 프로그래머다! > 기초 다지기' 카테고리의 다른 글

유니코드 이해 하기  (0) 2017.09.19
디자인패턴  (0) 2017.04.01
윈도우 환경에서의 gcc  (0) 2016.10.31
SW 프로그램과 개발환경(리눅스)  (0) 2016.10.31
 

유니코드 이해 하기

Posted by ironmask84
2017. 9. 19. 10:11 나는 프로그래머다!/기초 다지기


컴퓨터의 문자셋 (Character Set)

컴퓨터가 문자를 표현하는 방식은 0 과 1을 이용해서 입니다.

간단하게 풀어서 얘기하면, 전기적 신호가 차단되었는지 인가되었는지를 0 과 1로 구분하는 것입니다.

이러한 0 과 1의 연속된 패턴값이 가지고 2진수의 표현인 것이고,

이 2진수로 이루어진 연속된 패턴은 bit에 의해 자리수가 결정됩니다.

예를들어, 2bit면 00, 01, 10, 11  으로 4가지 표현이 가능하지요.

컴퓨터에서는 Byte단위로 문자를 표현합니다.

1Byte는 8bits 입니다. 


ASCII 코드 등장

그렇다면, 2의 8승인 256가지의 표현이 가능합니다.

이러한 문자표기 중 유명한 것으로 ASCII 코드가 있습니다.

ASCII 코드는 7bits만 사용하고, 영문자와 특수기호 등을 128가지 안에 표현한 것입니다.

참고로, 65인 0100 0001 이 대문자 알파벳 'A' 를 의미합니다.

하지만, 이 아스키 코드로는 한국어, 일본어, 중국어와 같은 문자 종류가 매우 많은 언어는 

8bits로는 표현이 불가능 합니다.

그리고 왜 영문 표현인 ASCII 코드가 먼저 만들어졌을까?

아는분들은 아시지만, 컴퓨터 보급화는 미국에서 시작되었고,

운영체제를 비롯한 여러 유명 SW들이 미국에서 대부분 시작되었습니다.


유니코드 등장

그리하여, 여러가지 문자셋 코드가 등장하다가,

국제 표준 문자셋 코드가 등장했으니,

이것이 유니코드 입니다. (UCS, Universal Character Set, 범용 문자 집합)

그 중에서도 현재 가장 많이 쓰이고 표준화 될 가능성이 높은 것이 UTF-8 입니다.

자세하게 잘 정리된 블로그가 있어서 아래에 링크 올립니당 ^^


http://maximer.tistory.com/100

http://yun4794.blog.me/220990159709

http://egloos.zum.com/chucky1/v/1185578


 

IoT 표준화 경쟁 및 동향

Posted by ironmask84
2017. 9. 19. 10:03 나는 프로그래머다!/Sensor


4차 산업혁명의 핵심키워드에는 인공지능, 빅데이터, 로봇, IoT 등이 있습니다.

그 중에 IoT 관련 업무를 회사에서 맡게 되면서 자연스레 관심을 가지게 되었는데요 ㅎㅎ

개인 스터디도 해볼까 하여 라즈베리 파이 프로젝트도 진행 중에 있습니다..
( http://ironmask.net/349 )

매우 더디긴 합니다만 ㅜㅜ

이번에 다룰려는 얘기는 IoT 표준화의 동향과 경쟁입니다.


IoT 표준화 경쟁

몰랐지만, 이미 몇 년전부터 IoT 표준화를 선점하기 위한 그룹들이 생겨났습니다.

그 중에 대표적인 것들이 아래 그룹입니다.

1. 오픈커넥티비티재단(The Open Connectivity Foundation)


   - 2016 2월 창립, 기존의 OIC(Open Interconnect Consortium) 승계
   - 회원수 185개
   - 주요회원사 : 삼성전자, 시스코, 아리스, 인텔, GE디지털, MS, 퀄컴 등
     (창립과 함께 올신라이언스 그룹에 있던  MS와 퀄컴이 합류)

2. 올신얼라이언스(AllSeen Alliance)


 - 2013.12월 창립, 리눅스 재단이 주도
 - 회원수 161개
 - 주요 회원사 : LG전자, MS, 필립스, 퀄컴, 소니, 샤프 등 

3. 스레드그룹(Thread Group)


 - 주요회원사 : 구글, 실리콘랩스, 퀄컴, ARM


IoT 동향

삼성전자는 오픈 커넥티비티 재단 OCF의 멤버로 스마트홈과 IoT 플랫폼 표준화를 진행 중입니다.

알렉사, 구글홈과 같이 다른 업체와 연동한 서비스를 제공하는 등 외부 협업도 강화

아마존 알렉사와 냉장고, 세탁기, 에어컨 로봇청소기 연계

구글홈과는 로봇청소기 연동


SK텔레콤은 '누구', KT '기가지니' 서비스로 삼성 가전을 음성으로 제어하는 서비스들도 나왔습니다.


삼성그룹인 삼성벤처투자는 싸이월드에 50억 투자하는 일이 있었습니다.

-> 싸이월드는 1999년에 시작해서 2003년에 SK커뮤니케이션즈가 인수 - 2014년 사원주주 회사로 독립 

   - 2016년 크라우드 펀딩 실패 - 2016년 에어라이브와 합병 한 회사이며,

   한 때, 우리 나라에서 가장 잘나가던 SNS였으나, 현재는 혁신 실패로 카카오스토리와 인스타그램에 발린 상태

   삼성에서 이를 다시 어떻게 활용해 나갈지는 지켜봐야 알 수 있겠네요. ㅎㅎ


관련 행사

올해 10월 10일 ~ 13일 동안 OCF(Open Connectivity Foundation) 주관으로 행사가 있습니다.

이 기간을 IoT Week Korea 라고 칭하는군요. 

매년 하반기에 개최하는 것 같습니다.

IoT에 대한 동향을 한눈에 볼 수 있는 좋은 기회가 되겠군요!

저도 참석을 고려해봐야 겠습니다. ㅎㅎ



올해는 10월 10일 ~ 10월 13일이  IoT Week Korea (사물인터넷 진흥주간) 이라고 합니다.

자세한 내용은 사이트를 참조해주세요 ㅎㅎ ( http://www.iotweek.kr/ )



 

IoT를 위한 통신 기술 NB-IoT

Posted by ironmask84
2017. 8. 9. 11:38 나는 프로그래머다!/Sensor


IoT를 활성화 시킬 새로운 통신 기술이 만들어지고 모습을 들어내기 시작했습니다.

기존 LTE망을 이용해 대역폭을 낮게 조정해서 최대 전송량은 적은 대신에 저전력이 가능하게 되어

IoT 산업의 핵심인 센서 데이터와 같은 수 많은 HW 모듈의 데이터 수집에 유용할 것으로 보입니다.


SKT에서는 이미 LoRA 라는 IoT용 통신망을 구축하여 서비스 중에 있습니다. 

이에 맞서는 KT와 LG U+가 NB-IoT 서비스를 시작하려는 중입니다. 


LoRA vs NB-IoT

LTE에서 서비스되는 IoT 기술로 아직 상용화 되지 않은NB-IoT는 KT와 LG U+가 협력해 2017년 1분기에 망구축 완료 예정입니다

LoRA와 NB-IoT는 느린 속도와 저렴한 모듈가격 약 10년미만의 배터리 사용시간으로 비슷한 부분이 많이 있습니다

로라의 경우 무선 마이크 주파수를 사용하여 서비스를 제공하여, 간섭 현상이 쉽게 생겨 문제가 생길거라는 예측이 있으며, 해당 주파수는 벽을 통과하기 어려워 야외에서만 사용이 가능하다고 합니다. 반면 NB-IoT는 연결되지 않았던 외진곳이나 지하등에 설치가 가능합니다


주파수 면허 vs 비면허

로라는 비면허 대역을 사용하지만, NB-IoT는 면허 대역을 사용합니다. NB-IoT는 LTE주파수를 사용하여 서비스하며, 국내에서는 해당 주파수를 이용 하려면 허가받은 사업자만 서비스를 제공할 수 있습니다


NB-IoT 기술의 강점
NB-IoT는 Resource Block(자원 할당의 최소 단위) 하나에 해당하는 대역폭인 180kHz만을 활용하여 IoT 기기가 데이터를 주고받을 수 있도록 합니다. 산업용 IoT의 경우 저용량 데이터만을 가끔씩 전송하니 이러한 특성에 맞춰 적은 대역폭을 이용하여 많은 단말을 효율적으로 수용할 수 있게 한 것입니다. 이와 같이 적은 대역폭 사용하기 때문에 단말의 칩셋 가격 또한 획기적으로 낮출 수 있습니다. NB-IoT의 주파수는 LTE 서비스를 위해 비용을 지급해 면허를 획득한 대역이고, LTE는 이미 국내에 서비스해 온 기간이 길기 때문에 장비, 통신 등 에코 시스템이 충분합니다. 따라서 품질 관리와 커버리지 측면에서 강점을 보입니다. 또한 NB-IoT는 무선 신호를 단순화하다 보니 도달 거리가 더 늘어나 기존에는 연결되지 않았던 외진 장소나 지하 깊은 곳에 사물이 설치될 수 있습니다. 마지막으로, NB-IoT는 LTE 통신망과 똑같은 주파수 내에서 라이트하게 만들어진 프로토콜을 쓰기 때문에 보안성을 보장할 수 있고 이는 건강, 의료 등 보안성이 중요시 되는 사업에 사용하기 유리하다는 장점을 가지고 있습니다.  




IoT가 각광받기 시작하면서 많은 IT 회사들이 IoT 경쟁력 확보를 위해 노력하고 있습니다. 가정에서는 IoT 기능을 탑재한 가전제품으로 사용자 편의성을 높이고 있으며, 산업 현장에서는 IoT 기술을 활용한 기존 프로세스 개선 및 신규 서비스 적용 사례들이 나오면서 IoT 시장을 확장해 가고 있습니다.




하지만 기대만큼 IoT 시장이 빠르게 확대되고 있는 것 같지는 않습니다. IT 사업에 큰 변화를 가져올 것으로 보였지만, 현재 IoT로 불리는 서비스 대부분은 기존 M2M(Machine To Machine) 서비스에서 크게 벗어나고 있지 않습니다. 다시 말해 기존 M2M의 적용 범위가 다양한 산업으로 확장되었을 뿐이며, IoT 그 진정한의 의미인 다양한 사물이 인터넷이 연결되어 다양한 데이터를 모아 분석하고 연계하여 부가 가치를 창출한다는 취지에 부합하는지는 의문입니다.



 ‘소물인터넷의 새로운 시작, NB-IoT’

IoT는 다양한 사물이 통신 가능하다는 전제로 시작합니다. 하지만 사물이 통신할 수 있게 만드는 데 드는 비용이 IoT 사업의 가장 큰 장애물이기도 합니다. 이 비용에는 통신 모듈, 통신료, 전기료, 유지 보수료 등이 포함되어 있으며, 수집할 데이터의 활용 가치가 이 비용 대비 얼마나 큰지가 IoT 사업성의 기준이 됩니다. 만약 이 통신 비용을 줄일 수만 있다면, 많은 IoT 서비스의 사업성이 확보될 것이고, 이는 곧 소물인터넷(Internet of Small Thing)의 활성화를 앞당길 것입니다.

소물인터넷은 IoT가 대두되었을 때부터 같이 파생된 개념으로 사물들이 데이터를 주고받을 때 굳이 초고속 네트워크나 고성능의 디바이스가 필요하지 않은 서비스도 많다는 사실에 기반하여, 작은 센서나 디바이스를 위한 소량 데이터 전송에 특화된 기술을 의미합니다. 



대표적인 사례로 프랑스의 시그폭스(Sigfox)사에서 비면허 주파수 대역에서 데이터 전용 서비스를 제공한 사례가 있으며, RFID, NFC 등의 근거리 무선 통신을 통한 IoT 서비스도 소물인터넷의 개념이 적용된 것으로 볼 수 있습니다. 특히 최근 국내 통신사에서 NB-IoT를 상용화시키면서 근거리 네트워크의 한계에서 벗어난 새로운 소물인터넷 시대가 열렸습니다. 이제부터 소물인터넷의 새로운 주체, 그리고 IoT 사업의 변화를 가져올 NB-IoT에 대해 자세히 알아보겠습니다. 


 LTE의 발전 방향

통신사들은 4G LTE에 이어 5G를 준비하고 있습니다. 4G에서도 동영상을 보기에 충분한 네트워크 속도가 지원되기 때문에 굳이 5G가 필요 없으리라 생각하시는 분들도 있겠지만, 3GPP의 Road Map을 보면 더 빠른 통신 속도를 지원하는 기술과 IoT를 위한 저전력 기반과 적은 대역폭을 사용하는 통신 방식으로 나누어 발전하고 있음을 알 수 있습니다. 다시 말해 NB-IoT와 같은 통신 방식도 5G의 일부이며, 지금도 계속 발전해 가고 있는 기술입니다.


l LTE 통신 방식 비교


대용량 데이터 송수신이 필요한 서비스의 경우 빠른 전송속도가 필수겠지만, 센서 수집이나 사용량 검침과 같이 작은 데이터를 빈번하지 않게 주고받는 서비스는 적은 대역폭을 사용하여 전력 사용량을 줄이는 통신 방식이 유리합니다. 이러한 통신 방식을 지원하기 위해 LTE Cat-0, LTE-M을 거처 NB-IoT 표준이 지난 2016년에 확정되었고 국내 일부 통신사들은 LTE-M을 확보 이후 이미 NB-IoT망을 통한 상용 서비스 준비를 마친 상태입니다.



 NB-IoT의 서비스 특징

NB-IoT망을 사용한 서비스는 아래와 같은 장점이 있습니다. 

첫째, 저렴한 통신 모듈 가격과 작은 모듈 크기
LTE 모듈이 3만 원~4만 원대인데 반해 LTE Cat 1은 1만 원 정도로 저렴했으며, 크기도 50% 수준이었습니다. NB-IoT의 경우 시장에서의 모듈 적정 가격을 USD 5 정도로 산정하고 있어, 기존 LTE 모듈을 탑재하는 경우보다 부담이 적으며, 디바이스 크기가 작아져 거치형 혹은 부착형 디바이스에 유리합니다.

둘째, 어느 곳에서든 통신이 가능
기존 근거리 네트워크를 이용한 서비스를 위해서는 Gateway나 AP와 같은 중계기가 필요한 경우가 많았습니다. 또한, 신호의 간섭 및 신호의 세기를 확인하여 적절한 위치를 선정해야 하였으며, Layout이 변하거나 디바이스의 위치가 조정되어야 할 경우 유지 관리가 어려운 단점이 존재하였습니다. 

NB-IoT는 통신사의 기지국을 사용하기에 기본적으로 어느 곳에서나 통신이 가능합니다. 특히 우리나라의 경우 LTE 기지국이 전국적으로 잘 분포되어 있기에 유리하며, 신호의 세기가 약하거나 음영 지역일 경우 통신사에 이야기하여 해결할 수도 있습니다. 

셋째, 저전력으로 배터리 오랜 기간 사용 
NB-IoT는 배터리 지속 기간을 10년 정도로 예상합니다. (이는 통신 모듈의 배터리 기준이며, 디바이스가 배터리를 같이 사용하면 달라질 수 있습니다.) 장기간 배터리 교체가 필요 없기 때문에 유지 보수 비용이 감소하며, 초기 디바이스 설치 시 상시 전원을 위한 전력 공사가 생략 가능할 수도 있습니다. 배터리 소모량이 적으므로 태양열을 통한 충전 등으로 배터리 교체 주기를 늘리는 방법도 고려해 볼 수 있습니다. 

넷째, 기존 LTE 대비 저렴한 통신료
아직 개인이나 일반 사업자를 위한 서비스가 제공되고 있지는 않지만, 기존 LTE 사용료보다 저렴하게 NB-IoT를 이용 가능할 것으로 예상하고 있습니다. 데이터 전송 횟수와 크기에 따라 통신료는 달라지겠지만, 이미 유사한 서비스를 제공하는 사업자의 경우 한 회선당 월 천원 정도의 가격을 산정하고 있으며, 각 통신사에서 현재 제공 중인 기존 IoT 등의 월 서비스 사용료 수준 이하일 것으로 예상합니다. 



위에서 언급한 장점 외에 아래와 같은 서비스 고려 사항도 있습니다.


첫째, 느린 통신 속도, 낮은 디바이스 사양
기존 LTE 기지국을 사용하지만, 대역폭을 조금만 할당하기 때문에 통신 속도가 느린 편입니다.
(Qualcomm의 MD9206 모델의 경우 최대 Download 20 kbps, Upload 60 kbps 지원)

데이터의 크기가 크거나 전송 주기가 짧은 서비스 등 NB-IoT 특성에 맞는 서비스가 아니라면 전송 속도의 문제로 품질 저하의 우려가 있습니다. 또한, 배터리 사용량을 줄이기 위해 디바이스나 모듈의 H/W 스펙이 낮은 경우가 많으므로, 실시간 이벤트 처리나 복잡한 처리가 필요한 서비스에는 적합하지 않을 수도 있습니다.

둘째, 통신 모듈의 수급과 설치 지역 확인 필요
NB-IoT는 통신사의 LTE 기지국을 사용하므로 각 통신사에서 인증된 모듈을 사용해야 하며 아직 개인이나 일반 기업을 위한 모듈 판매가 이루어지지는 않고 있습니다. 또한, NB-IoT가 상용화가 준비되긴 하였지만, LTE처럼 아직 전국적으로 설치된 것은 아닙니다. 시범 지역이나 서비스 지역 단위로 기지국 작업이 이루어질 것으로 보입니다. 


 NB-IoT에 적합한 프로토콜

NB-IoT 모듈은 말 그대로 통신 모듈이기 때문에 프로토콜 사용에 제약은 없습니다. 다만, 낮은 전송 속도와 저 사양의 디바이스의 경우를 고려하여 CoAP 프로토콜[각주:1]이 주목을 받고 있습니다. 이 프로토콜은 Restful 개념이나 응답 코드 등이 HTTP와 유사하게 동작하기 때문에 HTTP의 경량화 프로토콜로 알려져 있으며, 이름 그대로 저 사양의 제한적인 디바이스를 위한 통신 규격입니다. 

통신의 부하(Overhead)를 줄이기 위해 UDP 기반으로 동작하면서도 신뢰성(Reliability)을 보장하도록 설계된 것이 가장 큰 특징입니다. 예를 들어, 응답이 필요한 메시지와 아닌 메시지를 구분하고 응답이 필요한 메시지의 경우, ID와 Token을 사용하여 응답이 제한 시간 안에 왔는지 확인하며, 중복 메시지나 요청하지 않는 응답에 대한 처리까지 설계에 포함되어 있습니다. 

특히, NB-IoT와 같이 적은 대역폭을 사용하는 단말을 위해 메시지 크기를 나누어 전송할 수 있는 Block Transfer에 대한 설계가 포함된 점과 센서와 같이 주기적으로 데이터를 올리는 통신 방식의 효율성을 위해 Observer라는 기능이 설계되어 있다는 점에서 주목받고 있는 프로토콜입니다.


 CoAP 기반 IoT 표준, LWM2M

CoAP가 IoT 프로토콜로 주목을 받기 시작하면서 LWM2M, OCF, oneM2M 등 CoAP을 사용하는 IoT 국제 표준들도 많이 발표하고 있습니다. 그 중 CoAP 프로토콜의 특성과 기능을 가장 많이 활용하고 있는 LWM2M[각주:2]에 대해서 알아보겠습니다.

일반적인 IoT 국제 표준들은 표준 메시지 형태를 CoAP에서 어떻게 표현할 것인지에 대해 설명하는 데 반해, LWM2M은 CoAP의 기능 자체를 활용하여 표준을 규정한 것이 특징입니다. LWM2M의 주요 기능은 Bootstrap, Registration, Information Report, Device Management로 M2M 서비스에 필수적인 기능만 간결하게 강조하고 있습니다.


l LWM2M의 주요 기능


LWM2M 디바이스는 자신의 Data 구조를 Object나 Resource 형태로 구현하고 위 네 가지 기능을 사용하여 서버와 데이터를 주고받을 수 있습니다. 이 중에서 Information Reporting은 CoAP의 Observe 기능을 활용하도록 설계되어 있는데요. 센서의 값이 바뀔 때 주기적으로 Notification을 하도록 표준에 명시되어 있으며 추가적으로 전송 주기를 설정하는 기능도 포함하고 있습니다. 


Device management는 디바이스가 관리하는 Data를 읽거나 쓸 수 있는 기능이며, 명령•제어도 가능합니다. Firmware Update는 기존 OMA DM과 유사한 방식으로 표준이 정의되어 있으며, Firmware 파일 Download 시 CoAP을 사용한다면 Block Transfer를 사용해서 파일을 전달해야 합니다.



출처: http://blog.lgcns.com/1447 [Creative and Smart! LG CNS]


 

top 명령어 (실시간 CPU 사용률 체크)

Posted by ironmask84
2017. 8. 4. 16:52 나는 프로그래머다!/Linux



리눅스 명령어 중에 'top' 라는 것이 있습니다.

실시간으로 CPU 사용률 체크를 해주는 도구인데요.

리눅스를 사용하는 디바이스의 성능이나 리눅스 서버의 성능을 체크할 때 매우 유용합니다.

어떤 프로세스가 CPU를 과다하게 잡고 있는지 분석이 가능하지요 :)

기본적인 실행화면은 아래와 같습니다.


맨 윗줄부터

16:25:10 현재 서버의 시간

1user : 한명의 사용자가 접속

load average : 부하율


tasks 에서 259 total은 257개의 프로세스가 가동중

2 running 2개의 프로세스가 실행중

257 sleeping : 257개의 프로세스가 대기중

0 stopped : 0개의 프로세스가 멈춤

0 zombie : 0개의 프로세스가 좀비상태


-- CPU --

%us  : 유저 레벨에서 사용하고 있는 CPU의 비중

%sy : 시스템 레벨에서 사용하고 있는 CPU비중

%id : 유휴 상태의 CPU 비중

%wa : 시스템이 I/O 요청을 처리하지 못한 상태에서의 CPU idle 상태인 비중


-- 메모리 --

Mem:   32946200total,  25504432k used,   7441768k free,  53460k buffers 

전체 물리적인 메모리, 사용중인 메모리(used), 사용되지 않는 여유 메모리(free), 버퍼된 메모리(buffers)

Swap:  17101184k total,    11708k used,  17089476k free,  22014132k cached 

전체 스왑 메모리, 사용중인 스왑 메모리, 남아있는 스왑메모리, 캐싱메모리



-- 프로세스 상태 --

PID : 프로세스 ID (PID)
USER : 프로세스를 실행시킨 사용자 ID
PRI : 프로세스의 우선순위 (priority)
NI : NICE 값. 일의 nice value값이다. 마이너스를 가지는 nice value는 우선순위가 높음.
VIRT : 가상 메모리의 사용량(SWAP+RES)
RES : 현재 페이지가 상주하고 있는 크기(Resident Size)
SHR : 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합.
S : 프로세스의 상태 [ S(sleeping), R(running), W(swapped out process), Z(zombies) ]
%CPU : 프로세스가 사용하는 CPU의 사용율
%MEM : 프로세스가 사용하는 메모리의 사용율
COMMAND : 실행된 명령어


-- top 실행후 명령어 --

 shift + p

 CPU 사용률이 높은 프로세스 순서대로 표시

 shift + m

 메모리 사용률이 높은 프로세스 순서대로 표시

 shift + t

 프로세스가 돌아가고 있는 시간 순서대로 표시

 - k

 프로세스  kill  - k 입력 후 종료할 PID 입력 signal을 입력하라고 하면 kill signal인 9를 입력

 - a

 메모리 사용량에 따라 정렬

 - b

 Batch 모드 작동

 - c

 명령행/프로그램 이름 토글

 - d

 지연 시간 간격은 다음과 같다. -d ss. tt (seconds.tenths)

 - h 

 도움말 

 - H

 스레드 토글

 - i

 유휴 프로세스 토글

 - m

 VIRT/USED 토글

 - M

 메모리 유닛 탐지

 - n

 반복 횟수 제한 : -n number

 - p

 PID를 다음과 같이 모니터 : -pN1 -pN2 ... or -pN1, N2 [, ...] 

 - s

 보안 모드 작동

 - S

 누적 시간 모드 토글

 - u

 사용자별 모니터링 : -u somebody

 - U

 사용자별 모니터링 : -U somebody

 - v

 version

 space bar

 refresh

 - u

 입력한 유저의 프로세스만 표시 - which u

 숫자 1

 CPU Core별로 사용량을 보여준다.

 

 


 

유동IP 환경을 고정IP로~ DDNS 포트포워딩

Posted by ironmask84
2017. 8. 4. 13:46 나는 프로그래머다!/Sensor


1. 소개


집에 설치한 PC에 접근하는 방식은 보통 "팀뷰어" 같은 화면 공유 프로그램을 활용합니다.

그런데, 화면 공유 프로그램이 아닌 무엇인가 제어를 하고 싶을 때는 집에 설치한 장치가 인터넷에 연결이 되어있고, 
IP 주소를 가지고 있어야 합니다.

대부분의 가정에서는 대기업이 제공하는 인터넷을 쓰다보니 IP주소를 모르고 그냥 연결해서 사용하는 것이 다반사입니다.

사실 보통 사람들은 집에 설치된 공유기에 대기업에서 어떤 IP를 할당해주었는지 알필요가 없죠. 거의 집에 있는 장치에 
접근할 일이 없기 때문입니다.

대기업의 인터넷 서비스는 많은 사용자들이 쓰다보니 유동IP를 할당합니다.

다시말하면, 사용자에게 임의로 공인IP를 할당하고 수시로 그 IP가 바뀌기 때문에 외부에서 집에 있는 장치를 
직접 연결할 수가 없습니다.

마치 집전화 번호가 바뀌니 우리집에 전화걸 방법이 없다는 것이죠. 대신 집에서는 외부에 전화하는것이 문제가 없습니다.

그래서 몇몇 공유기 제조사에서 DDNS라는 기능을 넣은 제품을 판매합니다.

IP가 바뀌어도 그 바뀐 IP를 이름으로 기억하게 만드는 것이죠. 그것이 URL입니다.

 
       DDNS의 개념 : 인터넷과 DDNS의 개념을 설명합니다.
  • IP, Domain, URL에 대한 이해

       인터넷에서 어떤 컴퓨터에 접근하는 데는 IP 라고 하는 주소를 사용합니다.   IP 는 192.168.0.1 과 같은 형태를 하고 있으며 컴퓨터가 이해하기 쉽도록 숫자만으로 구성되어 있습니다.   그러나 실제로 인터넷을 사용하는 주체는 사람이며 사람이 수많은 IP 들을 모두 기억하는 것은 어려운 일입니다.   그래서 고안된 것이 Domain 이라는 것입니다.
       Domain 은 zonesoft.co.kr 과 같이 사람이 기억하기 좋은 형태로 되어 있는 주소이며 실제로 우리가 많이 사용하는 인터넷 주소도 바로 이 Domain 을 기초로 한 URL (http://www.zonesoft.co.kr/default.html 과 같은 형태) 이라는 것입니다.   즉, Domain 이란 특정 컴퓨터를 지정하는 것이며 URL 은 특정 컴퓨터 내의 특정 디렉토리 또는 파일까지 지정하는 것으로 보면 됩니다.
       그런데 문제는 Domain 이나 URL 만 가지고는 컴퓨터가 다른 어떤 컴퓨터를 찾아가지 못한다는 것입니다.   그래서 나온 것이 DNS 라는 것입니다.

  • DNS 의 개념




  •    DNS 는 Domain 을 숫자로 된 IP 로 바꾸어 주는 일을 하는 컴퓨터로서 인터넷 곳곳에 자리를 잡고 Domain 에 대한 질의를 기다리고 있습니다.   즉 인터넷을 사용하는 사람이 zonesoft.co.kr 이라는 Domain 만 알고 있더라도 211.169.248.107 이라는 실제 주소 (IP) 로 찾아갈 수 있도록 해주는 매개체 역할을 하는 것입니다.
       그런데 이 DNS 라는 것이 실상은 "zonesoft.co.kr : 211.169.248.107" 형식의 "Domain : IP" 쌍을 파일에 저장해 두었다가 zonesoft.co.kr 에 대한 질의가 오면 211.169.248.107 을 회답으로 보내주는 구조로 되어 있습니다.   즉 파일의 내용은 정적으로 구성되어 있고 그 내용에 대한 변경은 사람이 손으로 직접 해야 하는 구조로 되어 있는 것입니다.   이러한 방식은 전용선을 사용하는 사람들만 DNS 의 혜택을 누리는 것과 같은 것입니다.   물론 일반 네티즌들도 DNS 로부터 서비스를 받고 있지만 (웹브라우저로 yahoo.co.kr 을 찾아가는 정도) 독자적인 웹 서버를 구축하여 인터넷 서비스를 할 수는 없습니다.   왜냐하면 전세계 어느 DNS 에도 자신의 Domain : IP 쌍이 기억되어 있지 않기 때문입니다.
  • 고정 IP (Static IP) 와 유동 IP (Dynamic IP) 의 차이점

       위에서도 언급했지만 DNS 는 정적으로 고정된 IP 만 기억할 수 있으며 반면 요즘 보급되고 있는 염가의 초고속 인터넷 서비스들은 회원의 컴퓨터에 수시로 변경되는 유동 IP 만 부여하고 있습니다.   유동 IP 로는 인터넷 서비스를 할 수 없습니다.   그 이유로는 첫째, Domain 으로 해당 컴퓨터를 찾을 수 없습니다. (DNS 에서 기억하지 못하므로)   둘째, IP 가 수시로 변하므로 외부에서 IP 만으로 해당 컴퓨터에 접근하기가 어렵고 일반 대중을 대상으로 하는 것은 불가능합니다.

  • 고정 IP 를 사용하기 위한 방법들

       그래서 요즘 많이 보급되어 있는 것이 웹 호스팅입니다.   웹 호스팅이란 전용선을 사용하고 있는 서비스 제공자의 컴퓨터에 작은 공간을 할당받아 자신의 홈페이지를 운영하는 방법입니다.   일반적인 사용에는 별 불편함을 느낄 수 없지만 컴퓨터가 자신의 것이 아니므로 많은 제약을 가질 수 밖에 없습니다.   CGI, DB 등의 사용에 제약이 많고 어떤 새로운 프로그램을 설치할 수도 없습니다.   자신은 하나의 계정을 가지고 있는 사용자일 뿐 슈퍼 유저가 아니기 때문입니다.
       고정 IP 를 부여받는 가장 일반적인 방법은 전용선을 사용하는 것입니다.   물론 대형 시스템에서는 전용선을 사용하는 것이 가장 안정적이고 확실한 방법입니다.   그러나 전용선을 설치하고 운영하는데는 많은 비용이 소요됩니다.   또한 전용선이 안정적이지만 그 속도는 가격에 비해 떨어지는 것이 사실입니다.

  • Dynamic DNS (DDNS) 의 개념

       DDNS 시스템은 유동 IP 를 전용선에 부여되는 고정 IP 처럼 사용할 수 있도록 해주는 시스템입니다.   DDNS 가 하는 일은 일반 DNS 가 하는 일과 같습니다.   그러나 Domain : IP 쌍을 파일에 저장하지 않고 주메모리에 저장합니다.   왜냐하면 유동 IP 를 대상으로 하는 본 시스템의 특성상 IP 를 영구 저장할 필요가 없으며 또한 수시로 그 내용을 갱신하면서 관리하는데는 주메모리가 가장 적당하기 때문입니다.
       DDNS 시스템을 구성하는 또 하나의 요소에는 Noti 가 있습니다.   DDNS 는 각 회원의 컴퓨터에 설치되어 있는 Noti 로부터 그 컴퓨터에 현재 할당되어 있는 IP 를 통보받아서 그 IP 를 Domain : IP 쌍으로 기억합니다.    그러면 자신만의 Domain : IP 쌍을 기억하고 있는 DNS 가 인터넷 상에 있는 것이 되므로 자신의 컴퓨터로 인터넷상에서 모든 네트워크 서비스 (Web, FTP, Mail, Chatting 등 전용선에서만 가능한 모든 서비스) 를 제공할 수 있으며 자신이 슈퍼 유저이므로 CGI, DB 등을 최대한 활용할 수 있습니다.





2. 구성

보통 가정에 들어온 인터넷은 아래 그림같은 구성을 가지고 있습니다.




"서비스 제공자 모뎀"은 SKT 같은 회사가 인터넷 설치 시에 집에 놓아주는 기기입니다. 보통은 여기에 바로 PC 를 연결했었는데요. 

요즘은 인터넷 전화, 인터넷 TV도 같이 보다보니 무선공유기를 놔줍니다. 그 무선 공유기를 IPTIME으로 교체를 해야 됩니다.

그 방법은 각 통신사업자마다 내용이 달라 인터넷에서 찾아보셔야 됩니다.


보통은 모뎀까지만 연결해주니 모뎀에 연결한 IPTIME 공유기를 설정하면 됩니다.

IPtime의 DDNS설정은 아래에 정리하였습니다. 사실 보면 그렇게 어렵지는 않습니다.


IE, 크롬, 파폭 기타 여러 브라우저로 관리자 페이지에 http://본.인.I.P 쳐서 들어갑니다.

관리도구로 들어가면 메인 설정 페이지가 나옵니다.


DDNS 설정 페이지 – DDNS 설정

  • 서비스 공급자: ipTIME DDNS
  • 호스트이름: 원하는 도메인명.iptime.org (ex: abcd.iptime.org)
  • 사용자 ID: my@mail.com 본인 메일 계정
  • 사용자 암호: 원하시는 아무 암호

정상 등록이 나오면 끝났습니다.


원격포트를 열고 외부에서 DDNS 주소를 이용하여 접근하면 이렇게 외부에서도 공유기 관리도 가능합니다.


 발췌 : https://nas.moe/archives/75


3. 설정

DDNS 가 설정이 되었으면, 사실 집에 대표번호가 설정되었다고 보면됩니다.

대표번호는 내선번호가 있어야 하부에 연결된 장치들과 개별 연결이 가능한데 그것이 바로 포트포워딩 설정입니다.





예를들어, DDNS 주소를 tinyfarmer.iptimes.org 라고 설정을 했고, 외부에서 tinyfarmer.iptimes.org : 9000 을 치면 
집에 있는 PC 에 설치된 내 홈페이지가 뜨게 하고 싶을 때 다음과 같이 설정합니다.


DDNS주소 / 외부 포트 9000 ------ 내부IP    192.168.0.15  /  내부 포트  80


위와 같이 매핑 해 놓으면 무조건 설정된 내부 IP의 해당 포트로 찾아 들어가게 됩니다.

설정은 다음을 참고하세요.

                                                             
    ※ IPTIME의 기본 설정 페이지 접속 주소는 "192.168.0.1"입니다.

접속이 안되신다면 누군가는 수정한것이기 때문에, 

아래 링크를 참조해서 진행해 주세요.

→ 공유기 설정 페이지 접속 주소 확인 방법 바로가기


1) 인터넷 창을 열고 인터넷 주소창을 "192.168.0.1" 을 입력해 주세요.






2) IPTIME 설정 페이지 접속이 되셨으면 [관리도구]를 클릭 해 주세요






3) 좌측 매뉴의 [고급설정]→[NAT/라우터 관리]→[포트포워드 설정]을 차례대로 클릭 주세요.






4) 아래의 같은 창이 나오면 이제, 내가 포트포워딩 하려는 기기의 IP주소와 포트번호를 입력해 주시면 되요.

<예시 : IP주소가 "192.168.0.100 이고 포트번호가 3100"인 경우



규칙이름 : 임의지정

내부 IP주소 : 192.168.0.100

외부 포트 : 3100

내부 포트 : 3100 (포트번호는 전부 동일하게 입력해 주시면 됩니다.)

포로토콜 : 대부분 TCP 로 진행하시면 됩니다.


5) 이렇게 전부 입력 후 저장을 해주시면 포트포워딩 완료!!!



출처: http://brand-me.tistory.com/194 [Happy Day.]




4. 마무리

사실 공인 IP 서비스를 신청해도 됩니다.

하지만, 별도의 비용이 들어가므로 공유기가 제공하는 서비스를 이용해도 충분합니다. 단, 자신이 직접 설정해야된다는 수고가 필요하죠. 

인터넷 구성을 집적할 수 있는 수준이면, 외부에서 집에 있는 기기들을 제어하는데 이정도 설정이면 충분합니다.

한번 도전해보세요. ^^


 

라즈베리 파이 프로젝트 준비#1 - 스펙 리뷰

Posted by ironmask84
2017. 8. 3. 14:46 나는 프로그래머다!/Sensor



센서 연구개발에 뛰어들게 되어, 기본 도메인 지식이 부족한 저는 라즈베리 파이를 이용해서

기본 도메인 지식도 쌓고 재밌는 프로젝을 진행해보려고 합니다.

의욕이 앞선탓에.. 아직 주제도 선정하지는 않았지만.. 

우선은 프로젝에 적절한 보드와 자재 구입 그리고 개발 환경 구축을 먼저 해보죠!


이에 앞서 간단하게 라즈베리 파이 스펙과 '아두이노' 와의 차이 대해 조금 살펴봤습니다.

살짝 검색해본 결과 이미 3~4년 전부터 유행하기 시작한 것으로 보이네요. ㅎㅎ


그.래.서 인지 이미 아래와 같이 여러 몇가지 모델이 있고, 최신이 3세대 입니다.


(그림 출처 : http://blog.naver.com/kiyeonah/220761250972)



다음으로는 '아두이노' 와의 차이점 입니다.

아두이노는 입출력 단자들이 별로 없는 반면, 라즈베리파이는 입출력 단자들이 많습니다.

아두이노는 입출력 단자가 암,숫놈이 다 보이는데, 라즈베리 파이는 숫놈만 40개네요!

 


 

 


아래는 아두이노는 일반적으로 쓰이는 ATMega328을 쓰고있는 아두이노 우노입니다.

전압 : 5V, 램 : 2k, 플래시메모리 : 32k, 타이머와 Serial, I2C, SPI 등

  


 

 

아두이노는 HW 제어프로그램으로 유일한 Sketch라는 프로그램을 제공해서
인터프리터도 필요없고, 운영체제도, 펌웨어도 필요 없습니다. 

 


 



아래는 라즈베리 파이입니다. 

보드의 소형처리장치(Microprocessor)는 음향, 영상, USB, 이더넷 및 HDMI까지 지원합니다.
통상적인 입출력(GPIO, General Purpose Input/Output) 장치가 있습니다.

리눅스와 같은 운영체제를 설치해서 HW제어가 가능합니다.


 

아두이노는 소형 제어장치(MicroController)라고 하며, 라즈베리파이는 소형 처리장치(MicroProcessor)라고 함

두개 다 명령을 수행하는 중앙처리장치(CPU)가 있고, 타이머(Timer)와, 기억장치(Memory), 입출력 핀(I/O Pin)들이 들어있습니다.

하지만, 가장 큰 차이점이 있는 부분은 입출력 핀입니다.

소형제어장치는 입출력에 강점이 있어서, 외부의 기기를 직접적으로 제어합니다.

하지만, 소형처리장치는 입출력 부분이 약한 경향이 있습니다. 그래서, 트랜지스터가 외부의 기기를 다룹니다. 


위에 설명한 차이점은 여러 블로그에서 동일하게 언급하는 내용인데, 

특히, 연두색 박스로 친 부분에 보면,

소형 제어장치가 입출력에 강점이 있고, 소형처리장치는 입출력에 약하다는게 무슨 뜻인지 정확히 모르겠네요..

추측으로는 단순히, 아두이노는 sketch라는 플랫폼형 프로그램을 이용해서 쉽게 제어프로그램을 만들 수 있다라는
정도의 얘기로만 생각되네요.. (아직 지식이 짧아서.. ^^;)


사실 '아두이노' 도 사용해본적은 없습니다만 검색을 통해 여러 사람들의 후기를 리뷰해보면,

간단하게 IoT, 임베디드 맛만 보고자 하면 아두이노를 쓰지 않을까 조심스럽게 생각해봅니다.

왜냐면 아무래도 Sketch라는 프로그램으로만 제어를 하게되니, 이런저런 제한도 많을 것으로 생각되고,

대중화되어 여러 오픈소스 환경이 구축이 되지 않을 것 같이 생각이 됩니다.


라즈베리 파이의 경우는 OS를 설치하고, 좀 더 여러가지 다양한 SW 라이브러리를 사용 가능하므로

다양한 프로젝트를 구성하기에 적합하지 않을까 합니다.


물론 위의 생각은 어디까지나 저의 생각입니다.

틀린 내용이 있다면 언제나 태클 댓글 환영입니다. ^^

앞으로 프로젝트를 계속 잘 진행해 나가면서,

일부 잘못된 내용들은 수정하고 필요한 내용은 추가해 나가겠습니다. :)


참조 : http://nickoo.tistory.com/93


 

 라즈베리파이 프로젝트

라즈베리파이 프로젝트 실전#1 - LED 컨트롤
라즈베리파이 프로젝트 준비#4 - WIFI 설정
라즈베리파이 프로젝트 준비#3 - OS 설치 및 Putty SSH 접속
라즈베리파이 프로젝트 준비#2-1 - 구성품 리뷰

라즈베리파이 프로젝트 준비#2 - 구입 리뷰

라즈베리 파이 프로젝트 준비#1 - 스펙 리뷰
  





 

쓰레드 함수 (pthread) 알아 보기

Posted by ironmask84
2017. 8. 1. 09:46 나는 프로그래머다!/Linux



저는 쓰레드 프로그래밍을 JAVA언어로 먼저 배웠고, 사용해봤습니다.

흔히, 아래와 같은 예로 개념 이해를 시작하게 됩니다.
은행에 돈 인출을 한 계좌에서 2건이 거의 동시에 일어났을 때 순차적으로 거래가 이뤄지지 않고,
선 거래 건이 이뤄지기 전에 후 거래가 전산적으로 먼저 처리되는 꼬임 ㅋㅋ

아무튼 JAVA로 채팅 프로그램을 만들때 사용해보고,
실기시험을 통한 간단한 예시 정도로만 코딩을 해보고는
실무에서 직접 생성해서 적용하는 걸 거의 못해봤네요 ㅠㅠ
(거의 구현된 것을 디버깅 하는 경우가 많다보니..)

아무튼 그리하여, 이번 기회에 좀 더 이해하고 정리하는 기분으로 글 하나 작성합니다.

리눅스 환경이면 gcc가 있을테니 바로 사용가능하고,
윈도우의 경우 MinGW나 Cygwin을 설치하면 크로스 컴파일이 가능해집니다.

크로스 컴파일 --> http://ironmask.net/298


출처:

http://enst.tistory.com/95 [개발 이야기]



또한 1부터 num까지 세는 Thread는 하나씩 셀 때마다 1000마이크로 초(1ms)를 쉰다
쉬지 않으면 SumThread가 끝나기 전에 CountThread가 끝나버려서 Thread가 제대로 돌아갔는지 알 수 없기 때문이다.

PThread를 사용하려면 pthread.h를 인클루드 시켜줘야 한다.
또한 pthread_t 라는 자료형의 변수와 함수들을 사용해 thread를 제어한다.

pthread_t라는 변수형은 thread의 id를 저장한다.

이 프로그램에서 사용한 함수들은 이렇다.

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

이 함수는 thread를 생성하는 함수이다.
첫번째 인자는 생성할 thread의 id
두번째 인자는 thread의 특성인데, 보통 NULL을 집어넣는다.
세번째 인자는 thread를 실행할 함수가 온다. thread를 실행할 함수는 포인터 함수이므로 인자값으로 올 수 있다.
네번째 인자는 thread를 실행할 함수에 넣어줄 인자값이 온다. 인자값은 하나지만 여러개의 인자값을 넣어주는 꼼수도 존재한다.(이건 다음에 포스팅)

int pthread_join(pthread_t thread, void **rval_ptr);

이 함수는 main이나 부모 thread에서 자식 thread가 종료할 때까지 대기하는 함수이다. main이나 부모thread가 끝나버리면 자식 thread 또한 종료되기 때문이다.
첫번째 인자는 생성한 thread의 id
두번째 인자는 해당 thread가 종료되면 return받을 변수. 리턴받을 값이 없으면 NULL을 넣으면 된다.

void pthread_exit(void *rval_ptr);


이 함수는 thread를 종료할 때 사용한다.
첫번째 인자는 thread를 종료하고 pthread_join() 함수 두번째 인자에 리턴할 변수. 리턴할 값이 없으면 NULL을 넣으면 된다.

pthread_t pthread_self(void)

이 함수는 실행하고 있는 thread의 id를 리턴한다.


또한 gcc에서 PThread를 사용할 소스를 컴파일 할때 맨 뒤에 -lpthread 명령어를 붙여줘야 한다.





이런식으로
MinGW로 컴파일 할때도 마찬가지.

아래는 소스.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
 
void *CountThread(void *); 
void *SumThread(void *); 
 
int main(void
int num; 
int result[2]; 
int i, rc; 
pthread_t threads[2]; 
 
printf("input number : "); 
scanf("%d"&num); 
 
pthread_create(&threads[0], NULL&CountThread, (void *)&num); //Count를 할 Thread함수를 threads[0]에서 실행(인자값은 num) 
pthread_create(&threads[1], NULL&SumThread, (void *)&num); //Sum을 구할 Thread함수를 threads[1]에서 실행(인자값은 num) 
 
for(i = 0; i < 2; i++
rc = pthread_join(threads[i], (void **)&result[i]); 
 
if(rc != 0//rc가 0이 아니면 오류 발생 
printf("Error in thread[%d] : %d\n", i, rc); 
exit(1); 
 
printf("Result of CountThread : %d\n", result[0]); 
printf("Result of SumThread : %d\n", result[1]); 
 
return 0
 
void *CountThread(void *arg) 
int i; 
int num = *(int *)arg; //인자값을 사용해야할 때마다 일일이 void* 포인터에서 int* 포인터로 바꿔줘야 해서 귀찮아지므로 그냥 변수를 하나 만들어서 인자값을 넣어줌 
 
for(i = 1; i <= num; i++
printf("In CountThread(0x%lx) : %d\n", pthread_self(), i); 
usleep(1000); 
 
printf("CountThread End\n"); 
pthread_exit(NULL); //인자값을 return하고 Thread함수 종료 
 
void *SumThread(void *arg) 
int result, i; 
int num = *(int *)arg; 
 
for(result = 0, i = 1; i <= num; i++
result += i; 
 
printf("SumThread End\n"); 
pthread_exit((void *)result); //인자값을 return하고 Thread함수 종료(인자값이 void형 포인터로 들어가므로 void형 포인터로 형변환) 
 
 

cs


좀 더 간단한 예시

- 아규먼트를 사용하지 않는 함수의 경우

- arg에 NULL 을 삽입하여 생성

- 아규먼트를 받는 함수의 경우

-arg를 통해 아규먼트를 함께 넘겨주어야 함

void *

- pthread_create 함수 타입

- 아규먼트/반환 타입이 void * 인 함수를 실행

- void * 인 이유

- void * 는 주로 임의의 data type을 가리키는 용도로 사용

- 임의의 data type을 아규먼트/반환 값으로 넘겨줄 수 있음

단일 아규먼트 전달

- 아규먼트로 정수 n을 받고 0 ~ n-1 의 숫자를 출력하는 경우

- pthread_create의 마지막 아규먼트 사용(void * 로 integer 변수를 가리킴)

- main 스레드의 경우

- 아규먼트(n)를 가리키는 포인터 설정

- 포인터를 아규먼트로 넘김  

ex) Main 함수의 n 값을 아규먼트로 받아 Thread에서 0 ~ n 까지의 값을 출력

출처: http://ypangtrouble.tistory.com/70 [끄적끄적 소소한 일상]



참고:

http://underresearch.blogspot.kr/2013/05/pthread-thread.html

http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226

http://www.morenice.kr/75

http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread

http://m.blog.naver.com/cky5122/80198083088

http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226

https://kldp.org/node/93835

http://blog.naver.com/rbosc/90016327317





 

grep 명령어 - 문자열 패턴 검색

Posted by ironmask84
2017. 7. 7. 14:14 나는 프로그래머다!/Linux


Unix/Linux 문자열 패턴 검색 (grep)


  패턴 검색 [grep] 

grep 명령은 파일 내에서 지정한 패턴이나 문자열을 찾은 후에, 그 패턴을 포함하고 있는 모든 행을 표준 출력해 준다. 물론, 한 디렉토리 내에서 지정한 패턴을 포함하는 파일을 출력할 수도 있다. grep 명령은 하나 이상의 파일로부터 프로그램 수정 등을 위해 변수, 또는 함수명을 찾을때 많이 사용된다. 



  grep 명령의 기본 문법 

grep [-옵션] 패턴 파일명 


   옵션

-c : 패턴이 일치하는 행의 수를 출력 

-i : 비교시 대소문자를 구별 안함 

-v : 지정한 패턴과 일치하지 않는 행만 출력 

-n : 행의 번호를 함께 출력 

-l : 패턴이 포함된 파일의 이름을 출력 

-w : 패턴이 전체 단어와 일치하는 행만 출력 


   사용 예 

$ grep -n '삼성' token_dic

= token_dic 이라는 파일내에서 '삼성' 이라는 패턴이 들어간 문자열과 행번호를 출력 


$grep -l '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 파일의 이름을 출력 


$grep -v '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어가지 않은 행을 출력


$grep -r '삼성' * 

= 현재 디렉토리 및 서브디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 문자열 출력



  패턴의 정규 표현식(Regular Expression) 

패턴 지정에서 사용되는 정규 표현식은 작은 따옴표 (' ')로 묶어서 표현한다. 

$ grep '^a' 파일명 

= ^는 파일의 시작을 나타냄. 파일에서 a로 시작하는 행을 찾는다. 

$ grep 'apple$' 파일명

= $는 파일의 끝을 나타냄. 파일에서 e로 끝나는 행을 찾는다. 

grep 'app*' 파일명 

= 파일에서 app로 시작하는 모든 단어를 찾는다. 

$ grep 'a.....e' 파일명 

= 파일에서 a로 시작하고 e로 끝나는 7자리 단어를 찾는다. 

$ grep [a-d] 파일명 

= 파일에서 a,b,c,d 로 시작하는 단어를 모두 찾는다. 

$ grep [aA]pple 파일명 

= 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.

$ grep 'apple' d*

= d로 시작하는 모든 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep 'apple' 파일명1 파일명2 

= 지정된 두개의 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep '^[ab]' 파일명 

= 파일에서 a나 b로 시작되는 모든 행을 찾는다. 



출처: http://ra2kstar.tistory.com/100 [초보개발자 이야기.]

 

vi 편집기 기본 명령어

Posted by ironmask84
2017. 7. 7. 10:19 나는 프로그래머다!/Linux


vi 실행

  vi [파일명] : 기존 파일을 열거나 새로운 파일을 작성

  vi +<숫자> [파일명] : <숫자>행에 해당 파일 열기

  vi +/"검색어" [파일명] : 파일을 열어서 "검색어"의 처음 발견된 단어에서부터 

  vi -r [파일명] : 손상된 파일 복구

  view [파일명] : 읽기 전용으로 파일 열기


편집기 상태에서 커서의 이동 관련 단축키

  h(←) : 커서를 왼쪽으로 이동

  j(↓) : 커서를 아래쪽으로 이동

  k(↑) : 커서를 위로 이동

  l(→) : 커서를 오른쪽으로 이동

  w : 한 단어 오른쪽으로 커서 이동

  b : 한 단어 왼쪽으로 커서 이동

  ^ : 라인의 처음으로 이동

  $ : 라인의 마지막으로 이동

  H : 화면의 맨 위로 이동

  M : 화면의 중간으로 이동

  L : 화면의 맨 아래로 이동

  Ctrl + F : 한 화면 뒤로 이동

  Ctrl + D : 반 화면 뒤로 이동

  Ctrl + B : 한 화면 앞으로 이동

  Ctrl + U : 반 화면 앞으로 이동


편집기 상태에서 문자 삽입 관련 단축키

  a : 커서 오른쪽에 문자 삽입

  A : 커서 오른쪽 행의 끝에 문자 삽입

  i : 커서 왼쪽에 문자 삽입

  I : 커서 왼쪽 행의 처음에 문자 삽입

  o : 커서 아래에 행 삽입

  O : 커서 위에 행 삽입

  Esc키 : 입력 상태에서 편집기 상태로 전환


편집기 상태에서 텍스트 변경하는 단축키

  cw : 단어 바꾸기

  R ; 현재 커서 위치부터 바꾸기

  r : 커서 위치 문자를 다른 문자로 바꾸기

  ~ : 대,소문자 변경

  J ; 현재 행과 아래 행 결합

  u : 이전 명령 취소

  x : 커서 위치 문자 삭제

  dw : 커서 위치 단어 삭제

  dd ; 커서 위치 행 삭제

  D : 커서 오른쪽 행 삭제

  : 5, 10 d   : 5-10번째 삭제


편집기 상태에서 텍스트 복사 및 이동

  yy : 커서 위치 행 복사

  <숫자>y : 커서 위치로부텨 <숫자>행 복사

  p : 붙여넣기

  : 1,2 co 3  : 1-2행을 3행으로 복사

  : 4,5 m 6   : 4-5행을 6행으로 이동


편집기 상태에서 행 번호 설정

  :set nu   : 행 번호 표시

  :set nonu : 행 번호 숨기기


편집기 상태에서 행 찾기

  G : 파일의 마지막 행으로 가기

  21G : 파일의 21번째 행으로 가기

  :<숫자>  : <숫자> 라인으로 가기


편집기 상태에서 파일을 파일로 삽입

  :r [파일명]   : 커서 다음에 파일 삽입

  :34 r [파일명]  : 파일을 34번째 행 다음에 삽입


편집기 상태에서 저장 및 종료

  ;q  : 변경한 내용이 없을 경우 종료

  :q!  : 변경한 내용이 있더라도 저장 없이 강제 종료

  :w  : 변경한 내용 저장

  :w! : 읽기 전용 파일이라도 변경한 내용 강제 저장

  :wq   or  :x   : 저장 및 종료

  :wq!  : 강제 저장 및 종료




vi 설정 ($ vi ~/.vimrc) (출처: http://ra2kstar.tistory.com/100 [초보개발자 이야기.])

유저 홈 디렉토리에서 '.vimrc' 파일에서 설정 가능

자동 들여쓰기

set autoindent 


C 프로그래밍을 할때 자동으로 들여쓰기

set cindent  


검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않게 하기

set nowrapscan  


백업 파일을 만들지 않기

set nobackup 


키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 하기

set visualbell  


화면 우측 하단에 현재 커서의 위치보기

set ruler 


Tab을 눌렀을 때 8칸 대신 4칸 이동

set tabstop=4  


자동 들여쓰기를 할때 4칸 들여쓰기

set shiftwidth=4  


한글 처리를 하기위한 구문 

if $LANG[0] == `k' && $LANG[1] == `o'

set fileencoding=korea

endif


문법 강조 기능

if has("syntax")

syntax on " Default to no syntax highlightning 

endif



 

리눅스 기본 명령어 정리

Posted by ironmask84
2017. 7. 7. 10:08 나는 프로그래머다!/Linux


리눅스에서는 많은 명령어를 지원합니다.
저도 아직 배워가는 단계로 부족한게 많아요 ㅎㅎ
혹시 보시고 이상한게 있으면 댓글로 알려주세요~~


명령어 기초편

하위폴더 및 모든 파일을 복사하기
cp -rf ./../../mh.bae/VS950/vs950_ics_git/svlte_modem/ .  

하위폴더 및 모든 파일을 지우기
rm -rf svlte_modem

ls -l => 좀 더 구체적인 정보 제공(파일형태와 사용권한, 하드링크번호, 소유자, 그룹, 파일크기, 시간, 연도, 파일명)

file 파일명 => 파일의 정보 보여줌

경로명 쓰다가 Tab 2번 하면, 뒷경로 자동 완성

cd ../폴더명 => 상위로 갔다가 폴더명의 하위폴더로 이동

mkdir -p 경로명 =>  하위경로명으로 depth를 길게 해서 만들 경우, 없는 폴더가 있으면, 알아서 확인해준다.


자주 사용할만한 명령어

0. Screen 걸어놓기 (터미널 창 닫아도 됨)

-> screen -R 설정할이름

    screen 창 에서 실행할 명령어 수행시킴

    ctrl + A + D 로 screen 빠져나감

    screen -list 목록에서 확인

    list목록에서 숫자가 붙은 full name을 복사해서 screen -R 이름 으로 다시 들어갈 수 있음.

    exit 로 screen 빠져나가면 됨.

    

1. find 로 이름 기준 검색하기

ex) find . -name '*webidl*'


2. grep 으로 파일내 특정 단어로 검색하기

-> grep -wrns "검색어" *

(*는 모든 파일에서 찾겠다는 것임.  , 옵션은 하위폴더 등등 으로...)


3. repo forall -c git clean -xdf  클린


4. fuser -m 디렉토리 및 파일명 --> 해당 path에 rw시도중인 pid 알려줌

   위 명령어에서 검색된 pid를 가지고,

   ps | grep pid명  --> 해당 pid 정보


5. 압축하기 :   tar -cvzf 파일이름 압축할파일 혹은 /디렉토리

   압축풀기 :   tar -xvzf 파일이름  


많은 소스파일을 인덱싱해서 편리하게 파악하는 방법 (Source Insight 같은 기능)

ctags -R => 현재 폴더 하위까지 범위로 해서 tags 파일 생성

(리눅스코드는 ==>ctags -R --language-force=c++)

---> vim 으로 tags가 있는 폴더에서 해당 폴더나 하위폴더의 파일들을 vim으로 열면, 

        ctrl + ] : 정의 따라가기

        ctrl + T : 되돌아가기

        ctrl + W + F : 헤더파일 따라가기

        vim -t 함수명 : 함수명있는 곳으로 tag jump  (set cst, set tag+=/경로명/tags  를 .vimrc에 추가해야 가능)




========================================================================

명령어 응용편

df

하드 디스크의 용량이 얼마나 남아 있는지 확인하는 명령어

-a : 디폴트로 생략된 0 브록 크기의 파일 시스템도 보여줌

-i : 파일 크기를 블록 대신 inode 디스크 정보를 보여줌

-k : 파일 크기를 킬로바이트(kb) 보여줌

-T : 파일 시스템의 종류와 디스크 정보를 보여줌

-t : fstype 값을 가진 파일 시스템에 대한 디스크 정보

-h : 쉬운 용량 표시 단위로 표기( : 1G 250M 1K)

 

ps

작동중인 프로세스 상태 체크하기

-l : 포맷으로 출력

-u : 실행한 유저와 실행 시간을 표시

-j : "job"형식으로 표시

-s : 시그널(signal) 포맷으로 표시

-m : 메모리 정보 표시

-a : 다른 유저의 프로세스 현황 표시

-x : 터미널 제어없이 프로세스 현황을 표시

-ef : 가장 많이쓰는 옵션이죠 ^^

 

kill

실행중인 프로세스를 재활성화하거나 완전히 죽이고자 쓰이는 명령

-1, -HUP : 프로세스를 재활성화함

-9 : 프로세스를 강제로 죽임

 

로그인 화면 바꾸기

/etc/issue -> 콘솔접속시(로컬)

/etc/issue.net -> 원격접속시

/etc/motd -> 로그인 성공시

/etc/rc.d/rc.local -> 부팅시

 

RPM 패키지 설치 확인 설치 경로 확인하기

rpm -qa 패키지명 -> 설치 확인

rpm -ql 패키지명 -> 설치 경로 확인

 

시스템 사용자 보기

현재 시스템에 어떤 사용자가 접속되어 있는지 확인하려면  w, who, finger  명령을 실행하면 된다.

 

커널 메시지 보기

dmesg, cat /var/log/dmesg, cat /var/log/messages

 

사용중인 커널 버전 알아보기

uname -r , uname -a

 

최신 커널 버전 벙보 알아보기

finger @finger.kernel.org

 

시스템 하드웨어 정보 보기

cat /proc/cpuinfo -> CPU

cat /proc/meminfo -> Memory

cat /proc/interrupts -> interrupts

 

작동중인 커널 모듈 확인하기

/sbin/lsmod 명령을 실행

 

패킷 전달 과정 체크

traceroute

 

NTFS 모듈 설치하기

페도라 코어에서는 윈도우 NT 계열의 파일 시스템(NTFS) 지원하지 않으므로, 윈도우 엑스피 파티션을 마운트하려면 ntfs모듈을 설치해야 합니다.

yum install ntfs-3g

 

badblocks 이용한 하드 디스크 불량블럭 검사

badblocks -s /dev/sda

 

업데이트된 커널 소스 설치

yum install yum-utils

yumdownloader --source kernel --enablerepo updates-source


========================================================================

** adb shell 기준

1. cat /proc/kmsg > /persist-lg/kmsg.txt   <== kmsg를 /persist-lg/kmsg.txt 에 저장

2. logcat > /persist/log.txt       <== Android log를 /persist/log.txt에 저장

3. ps -aux | grep 프로세스명 <= 해당 프로세스의 정보를 보여줌

   pstree <= 현재 실행중인 프로세스를 tree로 보여줌 (부모-자식 관계)

4. adb 안될때, 

    adb devices

    adb kill-server

    adb start-server

    또 안되면 재부팅

5. kill -9 PID

    kill -l  <= signal 번호가 나온다??

6. logcat & => &을 옵션으로 두면, 해당 명령이 죽지않고, 백그라운드에서 돌게된다.

7. prop 파일 내용 수정해서 적용하기

단말에 존재하는 system/build.prop

Cmd> adb root

Cmd> adb remount

Cmd> adb pull system/build.prop

Cmd> 다음과 같이 수정함

ro.product.model=LG-F180L

ro.product.manufacturer=LGE

Cmd> adb push build.prop /system/

Cmd> adb reboot

 

디자인패턴

Posted by ironmask84
2017. 4. 1. 15:06 나는 프로그래머다!/기초 다지기


  • 생성 디자인 패턴
    • 싱글톤패턴
      • 어떤 클래스의 인스턴스 개수가 최대 한 개를 넘지 않도록 하는 패턴
      • 이 하나의 인스턴스는 공유자원에 대한 문지기 또는 중앙에 있는 소통의 중심 역할을 한다.
      • 애플리케이션에서 새 인스턴스를 만들 수 없으며, 모든 메소드는 싱글톤을 통해서만 액세스할 수 있다.
      • 애플리케이션에서는 클래스에 있는 정적 메소드를 호출하여 싱글톤을 가져온다.
      • 상속과 인터페이스(싱글톤은 객체다. 따라서 베이스 클래스로부터 상속을 받고 인터페이스를 구현할 수 있다.)
      • 다수 객체로 전환 가능(나중에 마음이 바뀌어 여러 객체를 만들고자 하는 경우에 코드를 많이 바꾸지 않고도 원하는 바를 이룰 수 있다.)
      • 동적 바인딩(싱글통을 생성하기 위해 실제로 사용하는 클래스를 컴파일시가 아닌 실행시에 결정할 수 있다.)
      • 싱글턴 패턴을 구현 할 때는 private 생성자와 정적 메소드, 정적 변수를 사용한다. 

 

 public class Singleton {

1
2
3
4
5
6
7
8
9
 private static Singleton uniqueInstance;
 
 private Singleton(){} //다른 클래스에서 new키워드를 사용할 수 없게 된다.
 public static Singleton getInstance(){  //그래서 getInstance()를 사용할 수 밖에 없다.
  if(uniqueInstance == null){
   uniqueInstance = new Singleton();
  }
  return uniqueInstance;
 }


 

  • 빌더패턴
    • 객체가 어떤 식으로 구축되는지에 대해 모르는 상황에서 단계별로 객체를 생성하는 패턴이다.
    • 객체를 직접 구축하는 대신 빌더의 인스턴스를 만들고 빌더에서 객체를 직접 구축하는 대신 빌더의 인스턴스를 만들고 빌더에서 객체를 대신 만들도록 하는 방식이다.
    • 객체를 초기화하는 데 여러 생성자 매개변수가 필요한 경우, 그 중에서도 특히 동일 또는 유사한 유형의 매개변수가 여럿 필요한 경우에 특히 이 빌더 패턴이 유용하다.
    • 빌더패턴 예시

 

 적용 전

 적용 후

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Window{
 
     public Window(bloolean visible,boolean modal,boolean diaog){
 
         this.visible=visible;
 
         this.modal=modal;
 
         this.dialog=dialog;
 
     }
 
 
 
    private boolean visible;
 
    private boolean modal;
 
    private boolean dialog;
 
}


  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class WindowBuilder{
 
 
 
   public WindowBuilder(){}
 
   
 
   public WindowBuilder setDialog(boolean flag){
 
  
 
        dialog=flag;
 
        return this;
 
    }
 
   public WindowBuilder setModal(boolean flag){
 
  
 
        modal=flag;
 
        return this;
 
    }
 
   public WindowBuilder setVisible(boolean flag){
 
  
 
        visible=flag;
 
        return this;
 
    }
 
   public Window build(){
 
         return new Window(visible,modal,dialog);
 
    }
 
    private boolean visible;
 
    private boolean modal;
 
    private boolean dialog;



 

Container_of 매크로

Posted by ironmask84
2016. 11. 9. 11:01 나는 프로그래머다!/Linux


Linux 소스 스터디 입문을 했습니다.

"리눅스 커널과 디바이스드라이버 실습2" 라는 책을 구입 후 보는 중인데,
리눅스에서 주로 사용하는 자료구조 쪽을 공부하다보니,
(기준 리눅스 커널 버젼은 2.6.31 이라고 합니다.)

소스 내에 container_of(ptr, type, member) 이라는 매크로를 소개하네요..
이름만 봐서는 argument들의 container.. 즉, C언어이니 구조체를 리턴해줄 것으로 보이는데,
container의 주소값을 얻는데 사용하는 것 같습니다.

첫 느낌은 뭔가 디게 복잡하게 주소값을 얻어오는 기분입니다만.. 이게 최선인가;;
매크로는 아래와 같습니다.

#define offsetof(TYPE, MEMBER) ((unsigned long) & ((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *_mptr = (ptr); \

(type *)( (char *)_mptr - offsetof(type, member) ); })

실제로 console로 결과값을 돌려보고, 머리를 굴려봐도 머리에 잘 안들어오네요 ㅜㅜ

검색하다가 리뷰가 잘되어있는 주소 링크합니다.
http://rootfriend.tistory.com/197
http://kldp.org/node/58409

주요내용은 아래에 따로 펌~

gcc C 언어 확장 기능으로, (즉, 표준이 아니며, 다른 컴파일러에서 지원하지 않는..) compound statement (중괄호로 둘러싼 여러 statement)를 expression으로 해석하는 기능이 있습니다. 예를 들면:

({ int y = foo(); int z;
if (y > 0) z = y;
else z = - y;
z; })


로 쓴 것처럼, foo() 리턴 값의 절대값을 얻는 코드를 위와 같이 작성할 수 있습니다. 이 것은 C99 표준에서 inline function이 나오기 전에 매우 유용하게 썼던 기능입니다. expression에서 switch, for 등의 statement를 쓸 수 있는 등의 장점을 얻을 수 있었습니다. 실제로 GNU C library에 포함되어 있는 obstack에 관계된 대부분의 함수가 이 compound-statement expression을 써서 macro로 구현되어 있습니다. 물론 맨 마지막 statement의 값이, 이 compound statement의 값이 됩니다.

그런데, 이 기능은 현재 C++에서 쓸 경우, 임시 변수의 destructor가 불리는 순서가 바뀌는 등의 단점이 있기 때문에, C++로 쓸 우려가 있는 코드에서는 이 compound statement expression을 쓰지 말라고 권하고 있습니다.

개인적으로 간단한 수식으로 나올 수 있는 것이 아니라면 do { ... } while (0)을 써서 macro로 만들고, 어떤 값을 리턴할 필요가 있는 macro라면 inline function을 쓰는 것이 좋다고 생각합니다.

 

윈도우 환경에서의 gcc

Posted by ironmask84
2016. 10. 31. 15:24 나는 프로그래머다!/기초 다지기


GCC (GNU Compiler Collection)는 다양한 프로그램 언어의 컴파일을 지원하는 컴파일러 시스템이며, 특히 C와 C++의 컴파일에 활용될 수 있습니다. 리눅스나 FreeBSD 등의 유닉스 계열 OS에서 매우 광범위하게 사용되어 오면서 뛰어난 성능을 검증받았습니다.

 

윈도의 경우, cygwin과 MinGW가 윈도로 포팅된 gcc의 양대산맥이라고 할 수 있는데, 둘의 성격은 꽤 다른 편입니다. cygwin의 경우 윈도에서 리눅스 환경을 느끼면서 코딩할 수 있도록 배려한 라이브러리가 포함되어 있으며, 주로 유닉스 계열에서 쓰이는 POSIX API 집합을 지원합니다. 따라서 cygwin으로 컴파일된 프로그램을 실행하기 위해서는 별도의 라이브러리(cygwin1.dll)가 필요합니다. (cygwin이 GPL 라이센스를 따르므로 라이브러리 사용시 일부 라이센스 문제가 있을 수 있습니다.)

 

한편 MinGW의 경우 MS에서 제공하는 C 런타임 라이브러리(msvcrt)를 기반으로 동작합니다. 따라서 cygwin과 달리 런타임 라이브러리는 필요하지 않으나, msvcrt가 C99의 기능들을 지원하지 않는 관계로 libmingwex라는 추가 라이브러리를 통해 해당 부분에 대한 지원을 시도하는 중입니다. (출처) 해당 문제점은 MinGW에서 갈라져 나온 새로운 가지인 MinGW-w64에서 해결되었는데, C99의 기능 뿐만 아니라 더 다양한 API, 64비트 윈도우 등에 대한 지원이 추가되었으며, 32비트용 컴파일 또한 지원합니다.

 

결론적으로, 기존에 리눅스 환경에서 실행되던 프로그램을 윈도로 포팅하는 경우에는 cygwin을 사용하고, 일반적인 윈도용 어플리케이션을 개발하기 위한 범용 컴파일러는 MinGW-w64를 사용하는 것이 좋을것 같습니다.


http://jscript.blog.me/220084163392 펌


MinGW은 이클립스 플러그인으로도 제공됩니다.

MinGW에 간단 사용기 : http://neuro.tistory.com/32