1년만에 컴퓨터 프로그램 개발자인 Drew******* 가 한국에 놀러 왔다.


그는 영국 생활을 정리하고 고향인 호주로 가기 위해 잠시 한국에 들른 것이다.


그와 얘기를 하면서 나이들어 프로그램 개발자로 살아 남는다는 것은 한국이나 영국이나 호주나 쉽지 않다는걸 알게됐다. 그동안 막연하게 외국은 한국보다 좋은 환경일 것이라 짐작만 했는데 꼭 그렇지만은 않은것 같았다.



한국은 coding 조기 교육이 한참 유행이라는 얘기가 오고 가다가 아이에게 코딩 조기 교육을 시킬거냐고 물어 봤더니 조기 교육은 안 시킨단다.  그말에는 나도 전적으로 동감한다.  

나중에 흥미가 있어서 알려달라고 하면 가르쳐 주겠지만 하고 싶지도 않은 아이에게 강제하는건 안 좋은 것 같다.


마치 그 얘기를 나누던 곳이 집이라. 

Drew******가 요즘 자기가 가지고 놀고 있는걸 보여주겠다고 하더니 자기 가방에서 뭔가를 꺼낸다.




그것은 BBC에서 만든 MICRO:BIT (마이크로 비트) 다.


뭐에 쓰는 물건인고?
딱 봐도 아두이노 같은 마이크로 컨트롤러 인데. 


시연을 해주겠다고 해서 



내 맥북을 켜고 USB에 MICRO BIT 를 연결한다





불러주는 사이트(http://makecode.microbit.org)에 접속한다. 

앗 스크레치 프로그램 처럼 블럭으로 코딩을 할 수 있는 화면이다.


어 근데 이건 웹 페이지인데

웹에서 바로 프로그램밍을 할 수 있나?





간단히 예제를 불러와 micro bit 에 다운로드하니 뒷면 LED에 하트 모양이 출력된다.

(사실 이부분은 내가 직접 눌렀지만, 약간의 음주 후라서 어떤 메뉴을 어떤 순서대로 눌렀는지 잘 기억이 안난다)


Drew******는 이런 교육 프로그램을 만들어서 업로드하는 일종의 재능 기부 같은 것도 회사 업무로 인정해 준다고 했다. (내가 해석을 제대로 했는지 모르지만~)

진심 부러웠다. 누구는 없는 시간 쪼개서 취미나 학습으로 하는 것을 업무시간에 돈 받고 할 수 있다니.


그에 대한 답례로 나는 micro bit와 거의 비슷한 아두이노와 각종 모듈들을 보여주고 라즈베리파이3도 보여줬더니 무슨 용도로 사용하냐고 한다.  

Tomcat, MariaDB 깔아서 개발용 JAVA WAS 용도로 사용하고 있다고 했다.



한국에서 많이 쓰는 C++, C#, .net, java 외 듣도 보도 못한 각종 프로그램밍 언어를 섭렵한 Drew******에게는 이정도는 얘들 장난일지도...


어디가서 난 개발자라고 하지 말아야겠다. 

그냥 java spring, C#, ASP.net, php 조금 하는 전산 사무직이라고 하자. ㅠ.ㅠ




Micro bit(마이크로 비트) 는 icBanq 에서 팔고 있기는 한데 아직 한국에 많이 보급되지는 않은것 같다.

나중에 여건이 되면 자세히 소개해 보도록 하겠다.





  • 제목 : Clean Code 클린 코드 애자일 소프트웨어 장인 정신 (Program Programming Programmer)
  • 출판사 : 인사이트
  • 저자 : 로버트 C. 마틴
  • 옮김 : 박재호, 이해영




프로그램이 뭔지 코딩이란 어떻게 하는것이 좋은 건지 처음부터 다시보기 살펴보기 위해서 오늘(2019년 3월 31일) 펼쳐든 책인데 1장의 깨끗한 코드 내용이 너무 감명 깊어서 약 1페이지 반 분량을 인용해 본다.


내가 나쁜 코드들을 계속 생산하여 내 코드를 열어본 다른 개발자가 욕을 하고 있지는 않나 반성하며 책을 읽어나가고 있다!


요약 인용도 고려해봤으나 미천한 글 재주로 저자의 의도를 해칠 수 있어 원문을 그대로 인용한다. 

왜 이 책을 읽어야 되는지는 아주 잘 설명 하고 있으니 구입해서 읽어 보도록 하자




1장, 깨끗한 코드 중(p4 ~ p6)

...... (중략)



나쁜 코드로 치르는 대가


  2-3년 넘게 프로그램을 짰다면 남들이 저질러놓은 쓰레기 코드로 고생한 경험이 있으리라.  코드가 하도 엉망이라 프로젝트 진도가 안 나가는 경험도 있으리라.  나쁜 코드는 개발 속도를 크게 떨어뜨린다.  프로젝트 초반에는 번개처럼 나가다가 1-2년만에 굼뱅이처럼 기어가는 팀도 많다.  코드를 고칠 때마다 엉뚱한 곳에서 문제가 생긴다.  간단한 변경은 없다.   매번 얽히고설킨 코드를 '해독'해서 얽힌고설킨 코드를 더한다.  시간이 지나면서 쓰레기 더미는 점점 높아지고 깊어지고 커진다.  청소할 방법이 없다.  불가항력이다.


  나쁜 코드가 쌓일수록 팀 생산성은 떨어진다.  그러다가 마침내 0에 근접한다.  생산성이 떨어지면 관리층은 나름대로 복구를 시도한다.  어떻게?  생산성을 중가시키려는 희망을 품고 프로젝트에 인력을 추가로 투입한다.  하지만 새 인력은 시스템 설계에 대한 조예가 깊지 않다.  설계 의도에 맞는 변경과 설계 의도에 반하는 변경을 구분하지 못한다.  게다가 새 인력과 팀은 생산성을 눞여야 한다는 극심한 압력에 시달린다.  그래서 결국은 나쁜 코드를 더 많이 양산한다.  덕택에 생산성은 더더욱 떨어져 거의 0이 된다.



원대한 재설계의 꿈


  마침내 팀이 반기를 든다. 그들은 이처럼 협오스러운 코드로는 더 이상 일하지 못하겠다며 관리층에게 재설계를 요구한다.  관리층은 재설계에 자원을 쏟아붓기 싫지만 생산성이 바닥이라는 사실을 부인할 도리가 없다.  결국은 팀이 요구하는 대로 원대한 재설계를 허락한다.


  새로운 타이거 팀이 구성된다.  모두가 타이거 팀에 합류하고 싶어한다.  새로운 프로젝트니까.  처음부터 시작해 진정으로 아름다운 작품을 창조할 기회니까.  하지만 가장 유능하고 똑똑한 사람들만 타이거 팀으로 차출된다.   나머지는 계속해서 현재 시스템을 유지보수한다.


  이제 두 팀이 경주를 시작한다.  타이거 팀은 기존 시스템 기능을 모두 제공하는 새 시스템을 내놓아야 한다.  그뿐만이 아니다.  그동안 기존 시스템에 가해지는 변경도 모두 따라잡아야 한다.  새 시스템이 기존 시스템 기능을 100% 제공하지 않는 한 관리층은 기존 시스템을 대체하지 않을 테니까.


  때때로 경주는 아주 오랫동안 이어진다.  10년이 넘게 걸리는 경우도 보았다.  새 시스템이 기존 시스템을 따라잡을 즈음이면 초창기 타이거 팀원들은 모두 팀을 떠났고 새로운 팀원들이 새 시스템을 설계하자고 나선다.  왜? 현재 시스템이 너무 엉망이라서.


  방금 한 이야기를 일부라도 겪었다면 시간을 들여 깨끗한 코드를 만드는 노력이 비용을 절감하는 방법일 뿐만 아니라 전문가로서 살아남는 길이라는 사실을 인정하리라.


오픈소스 소스라고 무조건 무료로 사용할 수 있는것은 아닙니다.

그래서 라이선스 Open-source license 의 종류와 중요사항에 대해 간략히 알아 보도록 하겠습니다. 보다 상세한 내용은 해당 라이선스 정책을 확인하기 바랍니다

 License

내용 

 GPL 2.0

- 해당 라이선스의 소프트웨어를 일부 활용, 소스 수정, 소프트웨어 연결 한 경우 소프트웨어 소스 코드를 공개해야 함

- 배포 목적이 아닌 경우 소프트웨어 소스코드 공개 의무 없음

- 소프트웨어 배포의 경우 저작권 표시, 보증 책임이 없다는 표시, GPL 명시

- 특허를 구현한 프로그램은 특허 사용료를 받을 수 없음

- GPL소스코드 공개의무는 소프트웨어 배포시에만 해당하면 배포를 하지않고 서비스만 하는 경우는 GPL 의무사항이 발상하지 않습니다.

예) MySQL을 호스팅 업체에서 서버에 설치하고 호스팅 받는 업체가 사용하는 것은 GPL 위반 사항이 아닙니다.

- 대표적 SW : MySQL, MySQL Connector, MariaDB

 GPL 3.0

- 라이선스 제품을 특정 제품에 포함할 경우 설치 정보를 제공해야 함

 LGPL

- GPL라이선스를 완화한 형태

- LGPL 라이브러리에 응응프로그램을 링크시킬 경우 소프트웨어 소스 공개 의무 없음

- 대표적 SW : MariaDB Connector

 BSD

- 소스 수정 및 재배포를 할 수 있으며 상업적으로 이용해도 된다. 

- 2차 저작물 소스 코드 공개 의무 없음
단, 해당 오픈 소스나 라이브러리에 대한 저작권을 표시해야 한다.

 Apache

- 소스 수정 및 재배포를 할 수 있으며 상업적으로 이용해도 된다. 

- 2차 저작물 소스코드 공개 의무 없음
단, 해당 오픈 소스나 라이브러리에 대한 저작권을 표시해야 한다. (소스 변경 시 그에 대한 내용을 알려줘야 한다.)

 MIT

- 소스 수정 및 재배포를 할 수 있으며 상업적으로 이용해도 된다.
단, 해당 오픈 소스나 라이브러리에 대한 저작권을 표시해야 한다.



2016년 말 오라클의 Java SE 상용화 이슈가 있어서 조사한 것 정리 해봅니다.


토막 상식 : 오라클이란?

오라클(Oracle)은 DBMS 시장에서 부동의 1위 제품인 ‘오라클’을 만드는 회사로 데이터베이스 전문 기업입니다.


이게 뭐! 어쨌다고?

데이터베이스(Data Base) 시장은 이렇습니다.

대부분이 큰 회사에서 사용하는 대형 시장은 Oracle(오라클)이 시장을 장악하고 있습니다.

중, 대형 시장은 MS(마이크로 소프트) 사의 MsSQL(엠에스 에스큐엘 또는 SQL Server라고도 함)이 시장을 확대하고 있습니다.

그리고 중, 소형 시장은 무료인 MySQL(마이 에스큐엘)이 버티고 있습니다. 


MySQL은 현재 오라클 소유이니 전세계 데이터베이스 시장을 독점 장악하고 있다고 할 수 있습니다.

DBMS 시장에서 오라클의 경쟁 상대라고는 MsSQL 밖에 없을 정도로 오라클의 영향력은 막강합니다.



오라클과 선 마이크로 시스템 관계?

2009년 4월 21일 오라클은 서버와 Java로 유명한 선 마이크로 시스템(이하 '선')을 헐값이 74억 달러(당시 한화 약 9조 8000억원)에 부채를 제외하고 54억 달러를 지불하고 인수합니다.


선은 하드웨어인 서버와 스토리지에 강점을 가지고 있었지만 소프트웨어 시장에도 무시못할 여러가지 기술 라이선스를 가지고 있었습니다.  선이 가지고 있던 대표적인 것 몇 개만 들어 보도록 하겠습니다.

개발자가 아니라도 한번씩은 들어봤을 프로그램 언어 Java(자바), 통합 개발툴인 NetBeans (이클립스에 밀렸지만), OS인 솔라리스, 무료 DBMS인 MySQL,  MS 오피스에 대적하려는 OpenOffice 등이 있었습니다.


하지만 이중에 돈이 되는 서비스는 없는게 경영난으로 이어졌고 IBM과 M&A 협상을 하다가 갑자기 오라클에 팔리게 되었습니다.  아무래도 이미 H/W를 가지고 있던 IBM보다는 H/W를 탐내는 오라클이 시너지 효과가 더 좋았겠죠.


이렇게 선 마이크로 시스템이 가지고 있던 오프 소스 프로젝트들과 라이선스들이 고스란히 오라클로 넘어 가게 되고 오라클은 선이 가지고 있던 제품들을 그대로 유지하겠다고 발표합니다.  하지만 오라클화(기존 제품 개발 보다는 상업적 판매 및 이익 실현이 가능한 제품으로 변경)를 가속하는 과정에서 기존 개발자들과 트러블이 발생합니다.


오라클화 과정에서 유명했던 오픈 소스 프로젝트들이 어떻게 되었는지 끝이 안 좋은 예를 몇가지만 들도록 하겠습니다. 좋은 쪽이든 나쁜 쪽이든 현재 진행형인 프로젝트들이 어떻게 될지는 더 지켜 봐야 합니다.



1. 오라클과 선 마이크로 시스템의 OpenOffice

1) 선의 오픈 프로젝트였던 OpenOffice를 오라클이 관리 시작
2) 오라클 관리에 반기를 든 OpenOffice 개발자들 이탈하여 LibreOffice 출시
3) 이에 오라클은 공익성이란 명분으로 2011년 6월 OpenOffice를 아파치 재단에 양도
4) 개발자들 다 빠진 상태에서 프로그램 업데이트가 안되어 아파치 재단에서 2017년 프로젝트 종료 예정


2. 오라클과 선 마이크로 시스템의 MySQL


1) MySQL은 오픈 소스인 GPL 라이선스와 상용 MySQL 라이선스로 이중 라이선스 적용

2) GPL 라이선스 초과시는 상용 프로그램 구매하여 사용(저가의 프로그램 가격, 지원 서비스 별도 구매 가능)

3) 오라클과 개발지침 의견 차이로 MySQL 창업자이자 핵심 개발자가 이탈하여 MariaDB 출시

4) 오라클 인수 후 상용 버전 가격 인상(프로그램만 구매 불가)

5) 현재 MySQL 개발 답보 상태, MariaDB는 개발 지속 및 커뮤니티 활성화됨

6) 무료 버전인 MySQL CE 라이선스가 언제 바뀔지 알 수 없음



3. 오라클과 선 마이크로 시스템의 Java


1) 오라클과 구글은 안드로이드에 자바 API 사용료로 법정 분쟁 중 (2016년 5월 구글에 유리한 판결, 오라클 항소 예정)

2) 오라클이 2016년부터 Java SE Advenced Desktop과 Java SE Advenced & Suite 라이선스 위반 사용자 추적 및 과금 시작.

3) Java SE 버전은 현재까지는 무료이고 유료화가 쉽지 않겠지만 Oracle License의 불확실성이 여전히 존재함.


매년 오라클 디비의 유지보수 계약을 강제하고 가격을 올리는 오라클의 라이선스 정책 어디까지 믿고 사용해야 될까요?

글로벌 사물인터넷 표준인 oneM2M 기반으로 개발한 IoT 오픈소스 플랫폼 OCEAN 제2차 기술 세미나에 다녀왔습니다.

OCEAN는 서버용 모비우스(Mobius)와 클라이언트(IoT 기기들)용 &Cube로 구성되어 있습니다. 

한마디로 요약하면 IoT기기의 정보를 모비우스 서버로 전송하고 그걸 다시 가공해서 웹이나 앱으로 레포팅 해주는 것입니다.

OCEAN SITE : www.iotocean.org


기술 세미나 1차는 라즈베리 파이로 진행했다고 하던데 2차는 아두이노 우노로 진행합니다.

1차 세미나는 모르고 지나갔고 우연히 아두이노 스토리 카페 쪽지 보고 2차 세미나를 알게되었습니다.


OCEAN는 2016년 10월 13일 IoT 전시회에서 보기는 했는데 그게 IoT 플랫폼인지 몰랐습니다.


그러다가 11월 쯤 IoT 책을 보다가 '오픈소스 IoT 플랫폼은 왜 없는 것일까?'라는 의문에

검색을 하다가 전자부품연구원에 OCEAN을 알게되었습니다.

어~어~어~~~ 이건.

책꽂이를 뒤지니 IoT 전시회에서 받은 'OCEAN' 팜플렛이 떡하니 있네요 

써보고는 싶었지만 설치 과정이 너무 어려워 보여서 시작도 못하고 있었는데 기술 세미나 한다는 소식에 한달음에 달려갑니다.


▲ 장소는 삼성동 포스코 사거리 북쪽에 있는 잿팟 코워킹스페이스에서 이루어졌습니다.


지도 앱에 번지를 찍고 가니 이 건물쯤인데 …

건물벽에 작게 'ZAG POT'라고 적혀 있습니다.


▲ 지하라고 했는데.. 오른쪽을 보니 지하로 내려가는 곳에 Z.A.G. POT 라고 적혀 있네요.

꼭 다와서 약속 장소 앞에서 헤매는데 이번에는 한번에 찾기 성공 


▲ 넓은 홀…

잿팟이 보험 전문 카페였구나. 근데 카페면 카페지 보험전문 카페는 뭐하는 곳일까?


▲ 조금 일찍와서 앞쪽에 좋은 자리를 잡고 맥북을 컵니다.


▲ 한 동안 안쓴 아두이노 우노가 정상 동작하는지 확인합니다.

어제 밤에 했어야 하는데 IDE만 설치하고 밤 늦게 까지 리뷰 쓰느라고 미쳐 못했습니다.

예제 소스를 업로드 시키는데 어라~~ 업로드가 안됩니다.

급 검색질… 아두이노 통신용 com 포트를 지정 안 했군요. 

다행이 바로 해결하고 정상 동작 확인


▲ 세미나가 시작되고 전자부품연구원(KETI) 성낙명 전임이 자세히 설명해 줍니다.


▲ 아두이노 우노에 잠시 빌린 JSN270 와이파이 쉴드를 붙였습니다.


와이파이 쉴드 라이브러리를 가져오고 컴파일 합니다.

에러를 남발 합니다..

역시 한번에 되면 배우는게 없지요.

에러를 하나 하나 잡고 컴파일 후 아두이노로 업로드 성공


시리얼 모니터링을 해보는데 와이파이 접속을 못하는지 서버로 데이터 전송은 실패.


그렇다치고 서버용 모비우스(Mobius) 세팅도 해봅니다.

뭘 빼먹었는지 쉽지 않습니다.

성공 하지는 못해서 이번주도 주말 숙제가 하나 생겨버렸습니다.

이런 3주째 주말마다 밤 새가면서 다른 숙제를 하고 있네요.

같이 준 자료 보고 서버 세팅을 해봐야 겠습니다.


2주전 부터 주말마다 조금씩 만들던 안드로이드 앱을 오늘(2016년 12월 11일)  google play store 에 등록했습니다.


처음이라 쉬운걸로 간단한 '부가세 계산기' 하나 만들어 봤죠.

디자이너 없이 만들다 보니 화면이 별로지만 그래도 여러번에 걸쳐 수정해서 처음보다는 많이 개선된 디자인 입니다. 혹시, 디자인 재능기부 하실분 연락 주세요.


앱 개발에 도움 주신 분들 다시 한번 감사합니다.

최종 목표인 IOT 앱까지 함께 가 봅시다.


이라이더가 최초로 만든 앱 다운로드 하기


구글 play store 다운로드




 




데비안 계열(유부투, 라즈비안)의 기본 방화벽은 ufw 입니다. 

방화벽 설정은 포트 또는 아이피 단위로 허용, 거부를 설정 할 수 있습니다.


라즈베리 파이에 패키지 관리자 apt-get로 ufw 방화벽을 설치합니다.

sudo apt-get install ufw


설치 후 ufw는 비활성화인 상태이므로 활성화 시키도록 합니다.
sudo ufw enable


비활성화는 ufw disable 입니다.
sudo ufw disable



방화벽 설정 상태를 볼까요?
처음이면 아무것도 없어야 되는데 이라이더는 이미 설정한 값들이 보입니다.
sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
Anywhere                   ALLOW IN    아이피
21                         ALLOW IN    Anywhere
22                         ALLOW IN    Anywhere
3306/tcp                   ALLOW IN    Anywhere
21                         ALLOW IN    Anywhere (v6)
22                         ALLOW IN    Anywhere (v6)
3306/tcp                   ALLOW IN    Anywhere (v6)
ufw 의 기본룰은 들어오는 패킷은 전부 거부(inbound deny), 나가는 패킷은 전부 허용(outbound allow) 입니다. 기본 룰을 확인해 볼까요?
sudo ufw show raw

엄청 복잡하게 나옵니다.
알아보고 힘들고 간단하게 보고 싶으면 sudo ufw status verbose 명령으로 확인하세요


기본 정책의 inbound deny 정책이 맘에 안들 겁니다.
그래서 기본 정책을 차단 시킵니다.
sudo ufw default deny

반대로 기본 정책을 허용하려면 sudo ufw default allow 합니다.


어떤 포트를 열어야 될지 알아보고 위해 현재 열려 있는 포트를 확인해봅니다.
netstat -nap | grep LISTEN



방화벽 허용은 ufw allow 이고 거부는 ufw deny 입니다.

이제 방화벽에 특정 포트를 허용하는 명령입니다.
sudo ufw allow /

21번 포트를 허용해볼까요? (tcp/udp 모두 허용합니다)
sudo ufw allow 21



21번 포트의 tcp만 허용해볼까요?
sudo ufw allow 21/tcp


21번 포트의 udp만 허용해볼까요?
sudo ufw allow 21/udp



거부 명령은 allow 를 deny 로 바꾸면 됩니다.
sudo ufw deny 21/udp



서비스 포트 번호를 모르겠다면 서비스로 등록도 가능합니다.
sudo ufw

서비스 네임을 확인하는 명령입니다.
less /etc/services



특정 아이피(IP) 192.168.1.2를 허가하고 싶으면
sudo ufw allow from 192.168.1.2


특정 아이피(IP)의 tcp, 21 포트를 허가하고 싶으면
sudo ufw allow from 192.168.1.2 to any port 21 proto tcp


특정 아이피(IP)의 모든 프로토콜, 21 포트를 허가하고 싶으면
sudo ufw allow from 192.168.1.2 to any port 21



등록한 룰을 잘못 입력했다면 삭제합니다.
sudo ufw delete allow 21/tcp 



이외에도 파일을 직접 편집하는 방법도 있습니다.
vi 에디터로 적은 이유는 vi 사용법을 모르는 사람은 함부로 건들지 말라는 뜻입니다.
sudo vi /etc/ufw/before.rules 


이 포스팅을 끝으로 라즈베리파이 기본 설정을 마치도록 하겠습니다.

마지막으로 원격 그래픽 접속 방법인 VNC(Virtual Network Computing : 가상 네트워크 컴퓨팅)를 소개합니다.

 

라즈베리파이 데스크톱(GUI) 환경으로 접속하기 위해서는 VNC를 설치하고 접속해야 합니다.

당연히 파이 부팅시 데스크탑 환경이 실행되고 있어야 합니다.


앞의 raspi-config 설정 마지막 고급옵션에서 VNC 사용으로 설정해야 합니다.

아직 설정 안 했다면 이전 포스팅(raspi-config 편)을 참고하세요



▲ 이제 윈도우 pc 에서 VNC viewer 를 설치해볼까요


https://www.realvnc.com/ 페이지에서 접속하여 하단의 DOWNLOAD에 'VNC VIEWER'를 누릅니다.

기본 ‘Windows’가 선택되어 있고 64비트 실행파일을 받으려면  ‘EXE x64’ 눌러 다운로드합니다.





▲ 다운로드가 완료되면 실행합니다.

라이선스 내용을 잘 읽어 보고 동의합니다.


▲ 정보 제공할 거냐 하면 잘 생각해보고 제공하거나 안 하거나 선택한 후 다음을 누릅니다.


▲ 상단의 ‘Enter a VNC server address or search’에 접속할 파이의 아이피나 도메인을 입력합니다.



로그인 화면이 나오고 파이에 접속할 수 있는 아이디와 비밀번호를 입력합니다.

 그럼 파이의 화면을 VNC VIEWER를 통해 볼 수 있습니다.



만약 방화벽 설정에 문제가 없고 VNC에서 사용하는 5900 포트도 정상적으로 열려 있는데 접속이 안 된다면 파이 설정에서 VNC를 활성화 시켰지 않았거나 데스크톱이 실행이 안 되어 있을 수 있으니 그쪽을 확인해 보세요.



2016/11/15 - [Program/IoT (사물인터넷)] - 개발자들의 장난감 초소형 pc 라즈베리파이3 (Raspberry Pi 3) 소개

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/17 - [Program/IoT (사물인터넷)] - 라즈베리파이 3(raspberry pi 3) 라즈비안(RASPBIAN) OS 설치

2016/11/18 - [Program/IoT (사물인터넷)] - 라즈베리파이 3 구입하면 필수적인 raspi-config 세팅하기 (기본 설정)

2016/11/21 - [Program/IoT (사물인터넷)] - 라즈베리파이 3 한글 설정 및 한글폰트 설치

2016/11/22 - [Program/IoT (사물인터넷)] - 라즈베리파이 3 유선랜 고정아이피 세팅


라즈베리파이 3 유선랜은 기본적으로 DHCP 서버에서 자동으로 아이피를 가져오도록 설정되어 있습니다.

그래서 대부분 인터넷공유기를 사용하는 가정에서는 랜 선을 연결만 하면 바로 사용할 수 있습니다.


그런데 이를 고정 아이피로 설정하려면 두 가지 방법이 있습니다.

첫째, 파이에서 고정 아이피로 설정합니다.

두 번째, 공유기 DHCP Server에서 파이에 자동으로 할당한 아이피가 다음에 변경되지 않도록 설정하는 방법입니다.


두 번째 방법은 파이에서 별도의 설정이 필요하지 않고 공유기 설정만 변경하면 되니 좋습니다만, 개인 공유기가 아닌 환경에서는 사용할 수 없는 방법입니다.


그럼 첫 번째 방법을 알아봅니다.

인터넷을 통해 ‘라즈베리파이 고정 ip’로 검색해보면 한결같이 이런 답변을 받을 수 있습니다.
sudo nano /etc/network/interfaces 파일을 열어서 다음처럼 수정 합니다. (nano 또는 vi 에디터 아무거나 써도 됩니다)



auto eth0
allow-hotplug eth0
ifce eth0 inet static
address 192.168.0.101
netmask 255.255.255.0
gateway 192.168.0.1
저장하고 재부팅을 하면 됩니다.

▲ nano 에디터로 열어 봅니다.

이라이더도 vi 에디터를 아주 잘 다루지는 못하더라도 습관적으로 vi를 입력하지만 초보에게는 nano가 편합니다. 아무거나 자신이 편한 에디터 사용하면 됩니다.


 nano는 리눅스 에디터에 익숙하지 않아도 직관적으로 수정하고 저장할 수 있습니다.

저장은 control + x를 동시에 누르고 yes 선택하고 엔터 누르면 끝.


 vi 에디터로 열어봅니다.

실제 vi 에디터가 리눅스나 유닉스, MAC OS X에서 사라진 지 오래입니다. 

명령을 vi로 입력해도 실제로는 vim 에디터가 열립니다.


 수정하려고 커서를 이동하고 키보드를 아무리 눌러도 수정이 안될 겁니다.

막 누르다 보면 갑자기 수정되기 시작할 텐데요. 어떻게 사용하는지 난감하죠!

수정을 위해서는 'i'를 눌러 원하는 부분을 수정, 추가, 삭제하고 ESC 키  ':wq'를 순서대로 누르면 저장됩니다.

수정 없이 나가기는 ESC 키 ':q!' 입니다.

익숙해지면 편하지만 모르겠으면 그냥 nano 사용하세요


팁 : vi 에디터 키보드 입력 오류


vi 에디터에 하나의 문제가 있는데요.

vi로 파일을 열고 화살표 키를 누르면 커서가 이동해야 하는데 이동이 안 되고 'i'키도 동작 안 해서 글을 수정하거나 저장할 수 없는 문제입니다.

이는 미니 키보드를 사용하는 노트북에서 발생할 수 있습니다.

이를 해결하려면 키보드 호환성을 꺼버려야 합니다.


vi에서 :set nocompatible 명령을 사용하면 정상적으로 동작합니다.


매번 vi 접속해서 vi 열 때마다 하기 힘드니 본인 계정에 자동으로 동작하도록 해놓으세요


방법은 

cd ~ (접속한 계정의 홈 디렉터리로 이동합니다)

vi .vimrc  (숨김 파일인 .vimrc 파일을 만듭니다. vi로 입력이 불가하면 nano로 합니다.)

:set nocompatible  (문서 내용에 다음과 같이 입력하고 저장합니다. 저장은 Esc, ':wq')





이렇게 했을 때 동작했으면 e라이더가 이 글을 포스팅하지도 않았습니다.


자 무엇이 문제일까요?


열심히 구글링하다가 다음 페이지에서 하나의 댓글을 발견합니다.

http://raspberrypi.stackexchange.com/questions/37920/how-do-i-set-up-networking-wifi-static-ip


The Raspbian released in May 2015 changed the way networking (and particularly WiFi) works.

‘This applies to the current Foundation releases of Raspbian Jessie and the last Raspbian Wheezy 2015-05-05’


네. 답은 이거였습니다.


이제는 /etc/network/interfaces 파일이 아닌 /etc/dhcpcd.conf 파일을 수정해야 합니다.



 sudo vi /etc/dhcpcd.conf 명령을 통해 파일을 오픈합니다.


파일 끝부분에 다음처럼 추가합니다.

interface eth0
       static ip_address=192.168.1.101
       static routers=192.168.1.1
       static domain_name_servers=168.126.63.1
       static netmask=255.255.255.0

그리고 재부팅을 하면 이제 정상적으로 고정 아이피로 라즈베리 파이 3를 사용할 수 있습니다.



 vi 에디터 명령어 사용법을 잘 모르겠다고요.

그럼 좀 더 편한 nano 에디터를 사용해도 됩니다.


Nano 에디터로 열어보니 더 직관적이죠

 



2016/11/21 - [Program/IoT (respberry pi, Arduino)] - 라즈베리파이 3 한글 설정 및 한글폰트 설치

2016/11/18 - [Program/IoT (respberry pi, Arduino)] - 라즈베리파이 3 구입하면 필수적인 raspi-config 세팅하기 (기본 설정)

2016/11/17 - [Program/IoT (respberry pi, Arduino)] - 라즈베리파이 3(raspberry pi 3) 라즈비안(RASPBIAN) OS 설치

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/15 - [Program/IoT (respberry pi, Arduino)] - 개발자들의 장난감 초소형 pc 라즈베리파이3 (Raspberry Pi 3) 소개


이전 포스팅에서 라즈비안 OS까지 설치가 완료되었습니다.


그대로 따라 했다면 언어와 국가를 한글과 한국으로 설정했는데 한글이 안 나오는 문제를 경험했을 겁니다.


라즈베리파이에서 한글을 사용하기 위해서는 한글 폰트를 설치해야 합니다.

그럼 따라 해볼까요


터미널을 열고 다음 명령을 순서대로 입력합니다.

2019년 7월 8일 울트라초보님과 허참님의 댓글 조언으로 내용 추가합니다.


라즈비안 OS 버전에 따라 

sudo apt-get install ttf-unfonts-core

이 명령어에서 에러가 발생하면


다음 명령으로 변경해서 해보세요

sudo apt-get install fonts-unfonts-core


한줄로 할때는 다음과 같이 하세요 

sudo apt-get update ibus ibus-hangul fonts-unfonts-core

sudo apt-get update
sudo apt-get install ibus
sudo apt-get install ibus-hangul
sudo apt-get install ttf-unfonts-core


위처럼 각각 적어도 되고 다음과 같이 한 줄에 적어도 됩니다.

sudo apt-get update ibus ibus-hangul ttf-unfonts-core


▲ 참 쉽죠?



단, 라즈베리파이 3에 모니터와 키보드를 연결한 상태에서 기본 터미널 창에서는 한글이 깨져서 ‘ㅁㅁㅁ' 이런 식으로 보입니다.


한글이 제대로 보이는 환경은 데스크탑(startx)에서 콘솔 창을 열거나 외부에서 SSH로 접속했을 때 한글이 깨지지 않고 보입니다.



2016년 11월 22일(화) 내용 추가 합니다.


네이버 라즈베리파이 카페의 '매발톱'님이 터미널에서 한글 사용법을 알려주셨습니다.

'매발톱'님에게 다시 한번 감사드립니다.


원본은 링크를 같이 첨부합니다. 상세한것은 원글을 참조하세요

http://ders45.blogspot.kr/2015/09/blog-post.html


간략히 정리하면 한글을 보려면 fbterm 설치후 실행하면 됩니다.

sudo apt-get install fbterm



한글을 입력하려면 uim-fep, uim-byeoru를 설치하고 uim-fep를 실행하면 됩니다.

sudo apt-get install uim-fep, uim-byeoru 


한영 전환은 Shift + space bar 입니다.

한영 전환키 변경과 폰트 변경법은 원문을 참고 하세요


 또는 외부에서 SSH 쉘 프로그램으로 접속하면 정상적으로 보이는 걸 확인 할 수 있습니다.


데스크탑에서 한글과 영문 전환은 Shift + space bar입니다.

윈도우에서 putty 같은 쉘로 접속할 때는 윈도우 한글 전환키 설정에 따릅니다.

매킨토시(mac : 맥)에서 터미널로 접속할 때도 MAC OS X의 기본 설정에 따릅니다(Command + space bar)



2016/11/18 - [Program/Raspberry Pi] - 라즈베리파이 3 구입하면 필수적인 raspi-config 세팅하기 (기본 설정)

2016/11/17 - [Program/Raspberry Pi] - 라즈베리파이 3(raspberry pi 3) 라즈비안(RASPBIAN) OS 설치

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/15 - [Program/Raspberry Pi] - 개발자들의 장난감 초소형 pc 라즈베리파이3 (Raspberry Pi 3) 소개


앞 포스팅에서 라즈베리파이 3에 라즈비안 OS 설치까지 진행 했습니다.
못보신 분들은 이전 포스팅(http://www.erider.co.kr/138)을 참고 하세요.

 

 

이제 부팅을 하고 기본적인 언어와 국가 등의 세팅을 해보도록 하겠습니다.

 

라즈베리 파이 3를 부팅 후 로그인합니다.
기본 아이디 pi / 비밀번호 raspberry로 설정 되어 있습니다.

 

최소 설치 시 배포판 버전에 따라서 초기화면이 터미널(쉘, 콘솔, 커맨드 라인) 모드일 수도 있고 데스크탑(GUI: 그래픽 유저 인터페이스) 모드 일 수도 있습니다.

데스크탑 모드이면 마우스나 키보드를 이용해서 터미널을 실행 후 명령을 입력하면 됩니다.

 

 

커맨드 창에 다음을 입력하여 설정으로 들어갑니다.

sudo raspi-config

 

 

 

 

1. 초기 화면 설명

 

 

▲ 위와 같은 초기 화면이 뜹니다. (자세한 것은 밑에 별도로 설명)

1). 파일 시스템 확장 (4기가 이상의 SD 카드라면 필히 해줘야 합니다.
2). 비밀번호 변경 (최고 비밀번호는 대부분의 사람이 알고 있으니 꼭 변경 해야 합니다)
3). 부트 옵션 (상세 설명은 밑에)
4). 국제화 옵션 (국가, 키보드 설정 등)
5). 카메라 사용 (카메라를 연결 시 사용으로 변경)
6). 오버클럭
7). 고급 옵션
8). raspi-config 설명

 

명령의 이동은 키보드의 상, 하 화살표 키를 이용하고 선택은 ‘Enter 또는 Return’ 키를 이용합니다.
<Select>, <Finish> 등 메뉴간 이동은 키보드의 ‘Tab’ 키를 이용합니다.

 

 

 

2. 파일 시스템 확장 (Expand Filesystem)

라즈비안 OS 이미지는 4GByte 에 맞춰서 있고 그보다 SD 용량이 크더라도 활용을 하지 않습니다.

이것이 무슨 뜻인가 하면 32기가 SD 카드에 라즈비안 OS를 설치해도 4기가 밖에 사용할 수 없다는 얘기입니다.

 

이는 배포 시 용량을 줄이기 위한 목적도 있고 교육용으로 개발된 보드라 저렴한 4기가의 Micro SD 카드에서도 실행 할 수 있는 목적도 있는 것 같습니다. 하지만 요즘 SD 카드 가격이 싸서 4기가를 사용하는 사람은 거의 없을 겁니다.

 

그래서 SD카드의 나머지 용량을 쓸 수 있도록 확장을 해줘야 합니다.
Raspi-config 에서 첫번째로 있는 항목으로 Expand Filesystem 를 선택하고 엔터를 누룹니다.

 

▲ 화면과 같이 “Root partition has been resized. ……” 라고 나오고 다음 부팅 시부터 사용할 수 있다네요
밑의 ‘<확인>’ 이 선택되어 있으니 엔터를 누르면 파일 시스템을 확장하고 재부팅하면 이후로 SD카드의 모든 용량을 사용 할 수 있습니다.

 

여기서 잠깐.

이라이더는 이미 언어와 국가를 한글과 한국으로 선택하고 한글 폰트를 선택해서 한글로 나오는 것입니다.

아직 언어 선택과 한글 폰트가 설치되지 않았다면 영어로 나오는 것이 정상입니다.
한글 폰트 설치는 별도로 포스팅 합니다.

 

 

 

 

 

3. 비밀번호 변경 (Change User Password)

라즈베리파이의 초기 아이디와 비밀번호는 인터넷으로도 쉽게 검색해볼 수 있습니다.

이 포스팅에만 해도 위에 초기 비밀번호를 친절하게 적어 뒀습니다.
누군가가 파이의 아이피만 알고 있다면 언제든 로그인하여 맘대로 바꾸거나 시스템을 망가트릴 수 있습니다.

 

그래서 비밀번호는 꼭 변경 해야 합니다.

Change User Password 누릅니다.

 

▲ 다음과 같은 화면이 나오고 명령 프롬프트에서 새로운 비밀번호를 입력합니다.
꼭 여기서 안 바꾸고 비밀번호 변경 명령으로도 바꿀 수 있습니다.

 

 

 

 

4. 부트 옵션 (Boot Options)

Boot Options을 누릅니다.


다음과 같은 화면이 뜹니다. 여기서 설정해야 할 것은 대부분 B1 Desktop / CLI 하나 입니다.

B1 Desktop / CLI
B2 Wait for Network at Boot
B3 Splash Screen


 

▲ B1 Desktop / CLI 누릅니다.

 

 

▲ 그럼 부팅 시 보여질 화면 4개 중에 하나를 고르라고 합니다.


B1 Console : 명령 프롬프트 창이 나오고 로그인 하라고 합니다.
B2 Console Autologin : 명령 프롬프트 창이 나오지만 pi 아이디로 자동 로그인 된 상태 입니다.
B3 Desktop : 데스크탑(GUI) 창이지만 로그인 하라고 합니다.
B3 Desktop Autologin : 데스크탑(GUI) 창이 나오고 자동 로그인 된 상태 입니다.

 

 

뭘 선택해야 할까요?

주로 서버용으로 로컬에서 접속하는 일이 거의 없고 SSH를 통해 원격으로 접속한다면 ‘Console’ 또는 ‘Console Autologin’를 선택하면 됩니다.


데스크용으로 사용한다면 ‘Desktop Autologin’ 정도가 무난할 것 같습니다.

 

 

 

 

5. 국제화 옵션 (Internationalisation Options)

언어, 국가, 키보드 등을 설정하는 메뉴입니다.

라즈베리파이는 영국에서 만들었기에 기본적인 세팅이 전부 영국으로 되어 있습니다. 이를 한국에 맞게 설정해야 합니다.

 

 

▲ Internationalisation Options를 누르면 다음과 같은 메뉴가 나옵니다.

I1 Change Locale : 지역(언가, 국가) 선택
I2 Change Timezone : 시간대 선택
I3 Change Keyboard Layout : 키보드 선택
I4 Change Wi-Fi Countiry : 와이파이 국가 선택 (절대 건들지 마세요)

 

 

 

5. 1. 지역을 선택하기 위해서 Change Locale 누르면 다음과 같은 화면이 나옵니다.

 

▲ 이라이더는 한글이 이미 설치 되어서 설명이 한글로 나옵니다만 처음인 분은 영어로 출력될 것입니다.

키보드의 화살표키나 page up, page down 키를 이용해서 스크롤을 중간쯤에 있는 'ko_KR.UTF-8 UTF-8'을 선택하고 확인을 누릅니다. 
이라이더는 나중을 위해서 'ko_KR. EUC-KR EUC-KR'도 같이 선택했습니다.


'ko_KR' 의 앞의 'ko'는 언어로 한글이고 뒤의 'KR'은 국가로 한국을 나타냅니다.


그 위의 'UTF-8' 은 문자를 인코딩하는 방식으로 국제적인 호환성을 위해서 UTF-8을 선택합니다.

 

 

 

▲ 확인을 누르면 조금 전에 선택한 것 중 하나를 선택하면 됩니다.

여기서는 당연히 'ko_KR.UTF-8 UTF-8'를 선택해야 합니다.

 

 

 

5. 2. 시간대를 선택하기 위해 Change Timezone를 누릅니다.

 

▲ 한국은 'Asia' 에 있겠죠!

 

 

▲ 같은 나라도 도시별로 시간이 다를 수 있기 때문에 대부분 나라가 아닌 도시로 선택합니다.


'Seoul'을 선택하면 되겠죠.  혹시 시스템에 서울이 없으면 같은 시간을 사용하는 일본 도교를 선택해도 됩니다.

 

 

 

5. 3. 키보드를 선택합니다. Change Keyboard Layout

키보드는 화면을 별도로 캡쳐 하지 않았지만 한글이 지원되는 표준 103키보드나 기본으로 제시하는 값을 선택하면 됩니다.

 

 

 

5. 4. 와이파이 지역 설정합니다. Change Wi-Fi Countiry

라즈베리파이 3 부터 블루투스 4.1 (BLE: Bluetooth Low Energy)와 WiFi (802.11n)를 지원하면서 추가된 메뉴 같습니다.

그런데 와이파이는 국가마다 채널이 조금씩 다릅니다. 그래서 해당 국가에 맞게 설정할 수 있는 메뉴입니다만 기본 영국으로 되어있는 것을 한국으로 변경하면 wifi가 동작하지 않습니다.

그래서 절대로 이 부분을 한국으로 변경하면 안됩니다. (글을 쓰고 있는 2016년 11월 17일 현재배포판의 일시적인 버그일 수 있습니다.)

 

 

 

 

6. 카메라 사용(Enable Camera)

파이용 별도의 카메라를 연결 시 사용 유무를 선택 할 수 있습니다.
카메라가 없더라도 사용으로 선택해도 별 문제는 없습니다.

 

 

 

 

7. 오버클럭 (Overclock)
CPU 클럭이나 전압을 올리거나, 램 클럭을 강제로 올릴 수 있는 메뉴입니다.

 

▲ 파이 2에는 오버클럭을 설정할 수 있는데 파이 3에는 오버클럭 자체가 안되네요.

혹시 오버한 상태에서 재부팅이 안되면 shift 키를 누른 상태로 부팅하면 오버클럭이 안된 상태로부팅되니 설정에서 다시 하향 조정하면 됩니다.

 

 

 

 

8. 고급 옵션 (Advanced Option)
고급옵션에서 설정해야 할 것은 hostname, memory split, ssh, vnc을 설정하면 됩니다.

 

▲ 고급옵션 설정 화면

 

 

 

8. 1. 오버스캔 (Overscan)
화면 출력이 짤리거나 작게 나올 때 조정하는 옵션입니다.
HDMI로 연걸하면 자동으로 인삭하기에 아주 오래된 모니터가 아닌 이상 변경할 일이 없습니다.

 

 

 

8. 2. 호스트 네임 (Hostname)
네트워크에서 컴퓨터의 이름입니다.

▲ 윈도우 탐색기 검색경로에서 보통 IP인 '\\192.168.0.1' 이런식으로 찾기도 하지만 호스트 네임인 '\\erider_notebook' 이런식으로 찾기도 합니다. 이때 사용하는 것이 호스트 네임입니다.

 

윈도우와 리눅스는 파일 시스템이 달라서 윈도우 탐색기에서 직접 호스트네임으로 접근할 수 없습니다.

 

이때는 리눅스에 삼바(samba) 같은것을 설치하면 윈도우 탐색기에서 다른 윈도우 pc의 하드를 검색하는 방법과 동일하게 사용할 수 있습니다.

 

그런데 좀 느린게 단점이죠 

 

 

 

 

▲ 네트워크에서 중복되지 않는 이름으로 설정합니다.

 

 

 

 

8. 3. Memory Split

라즈베리파이 3는 메모리가 1기가 입니다.
와우~~ 요즘 회사 업무용 pc도 보통 4기가 또는 8기가를 기본으로 탑재하니까 상당히 작죠?

그 작은 메모리도 cpu 혼자 쓰는 것이 아니라 그래픽 카드(GPU)와 같이 사용합니다.

 

▲ 여기서는 그래픽 카드에 메모리를 얼마나 할당할지 입력 할 수 있습니다.

이라이더는 서버용도로 SSH 접속 위주로 사용하니 32메가를 할당했습니다.
GUI 환경인 데스크탑 모드를 사용한다면 256메가를 할당하는 것을 추천합니다.

 

 

 

8. 4. SSH
터미널(또는 쉘, 콘솔, 커맨드 라인 등으로 불립니다.)로 접속하려면 필히 활성화시켜야 합니다.

 

▲ 참고로 터미널에서는 데스트탑 모드 같은 GUI 환경을 실행하는 'startx' 명령을 내려도 실행되지 않습니다.  GUI 환경은 밑의 VNC를 이용해야 합니다.

 

 

 

8. 5. VNC
데스트탑 모드 같은 GUI 환경으로 보려면 VNC를 활성화 시키고 라즈베리파이에 서버 프로그램을 깔고 접속하려는 pc에는 클라이언트 프로그램을 설치해서 접속해야 합니다.

▲ VNC server 설정 화면

 

 

 

이상으로 기본적인 설정을 적어봤습니다.

이것과 별도로 한글 폰트 설치와 유선랜에서 고정 아이피 설정 등은 별도로 포스트 하도록 하겠습니다.

 

 

 

 

2016/11/15 - [Program/Raspberry Pi] - 개발자들의 장난감 초소형 pc 라즈베리파이3 (Raspberry Pi 3) 소개

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/17 - [Program/Raspberry Pi] - 라즈베리파이 3(raspberry pi 3) 라즈비안(RASPBIAN) OS 설치

라즈베리파이 3에 OS를 설치는 OS 이미지를 받고 micro sd 카드에 이미지를 구우면 끝납니다.

 

 

1. OS 다운로드


라즈베리 파이에 설치할 수 있는 OS 이미지를 아래 링크한 공식 사이트에 방문하여 맘에 드는 OS를 다운 받습니다.

https://www.raspberrypi.org/downloads/ 사이트 접속하면 NOOBS와 RASPBIAN 이 상단에 보일 것입니다.

 

▲ NOOBS는 설치과정 중 여러 OS를 선택하여 설치해볼 수 있는 것이고 특별한 일이 없으면 데비안 계열의 라즈비안(RASPBIAN)을 다운로드 합니다.


 

(데비안에 대해서는 패키지 관리툴인 apt 에 대해 포스팅하면서 같이 적은 글이 있으니 참고하세요.  http://www.erider.co.kr/137)

 

 

 

라즈비안을 받으려고 했더니 또 고민되게 2종류가 보이네요

RASPIAN JESSIE WITH PIXEL과 RASPIAN JESSIE LITE 버전입니다.
LITE 버전은 꼭 필요한 것만 넣어 가볍게 만든 버전입니다. 나중에 패키지 없다고 이것 저것 깔라고 하면 귀찮으니 처음부터 RASPIAN JESSIE WITH PIXEL 버전을 다운로드 합니다.

 

다운받은 파일을 압축을 풀면 4기가 정도 되는 *.img 파일이 보일 것입니다.

 

 

 

 

2. Micro SD 카드에 이미지 굽기

다운 받은 이미지를 Micro SD 카드에 굽기 위해서는 Win32 Disk Imager 라는 프로그램이 필요합니다.  https://sourceforge.net/projects/win32diskimager/  에서 다운로드해서 설치하세요.

 

 

그리고 데스크탑에서 작업한다면 Micro SD를 읽을 수 있는 카드 리더기나, USB 젠더 같은 것이 필요합니다.

노트북은 대부분 SD 카드를 지원할 테니 SD 아답터에 Micro SD를 넣고 연결하면 됩니다.

 

실행 화면입니다.

1) Micro SD 를 FAT32 로 포맷합니다.

   SD 카드는 특성상 읽고 쓰기를 반복하면 데이터가 깨질 수 있어서 주기적으로 포맷해주는 것이 좋습니다.

2) 폴더 아이콘을 눌러서 이미지 파일을 선택합니다.
3) 오른쪽의 드라이브를 선택해서 현재 Micro SD 카드의 드라이브 이름을 선택합니다.
   (잘못 선택하면 엉뚱한 하드나 SDD의 데이터가 지워지니 꼭 다시 확인하세요)
4) 'Write'를 누르고 끝날 때 까지 기다립니다.
   (4기가 정도를 기록해야 하기 때문에 시간이 좀 걸립니다)

 

 

 

팁1)

Win32 Disk Imager 는 이미지 굽기도 가능하지만 만들기도 가능합니다.

나중에 SD를 통채로 백업 할 때 유용하게 사용할 수 있습니다.
단, SD 카드에 사용 안하는 공간까지 이미지 파일로 만들어 진다는 문제입니다.
예를 들어 32기가 용량의 SD 카드 중 실제 사용한 용량이 10기가라고 해도 이미지를 만들면 32기가 짜리 이미지 파일이 생성 됩니다.  이를 배포 한다면 사용하지 않는 공간을 제거하고 배포 해야 합니다.

 

 

팁2)

맥킨토시나 리눅스에서도 약간 복잡하지만 설치가 가능합니다.

이라이더는 이에 대해서는 별도로 다루지 않으니 다른 블로그를 참고하세요.
한마디 더 해드리자면 맥이나 리눅스 쓸 정도면 윈도우가 가지고 있을 겁니다. 그냥 부트캠프 같은 것을 통해 윈도우로 부팅해서 작업하세요

 

 

 

3. 라즈베리파이 부팅

이미지 굽기가 끝난 SD 카드를 안전하게 제거하고 라즈베리 파이에 넣고 전원을 연결 하면 부팅이 됩니다.

라즈베리 파이 세팅은 다음 포스팅에 적도록 하겠습니다.

 

ps

'라즈베리파이', '라즈베리 파이', 'raspberry pi', 'raspberrypi' 로 띄어쓰기가 들린 부분은 오타가 아니며 검색에 용의하도록 의도적으로 혼용하였습니다.  다른 포스팅에서도 외래어는 맞는 표기법과 틀리지만 자주 쓰는 잘못된 표기법을 일부로 혼용하여 작성 하기도 합니다.

 

 

 

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/18 - [Program/Raspberry Pi] - 라즈베리파이 3 구입하면 필수적인 raspi-config 세팅하기 (기본 설정)

 

2016/11/15 - [Program/Raspberry Pi] - 개발자들의 장난감 초소형 pc 라즈베리파이3 (Raspberry Pi 3) 소개

 

리눅스의 장수한 배포판 중 하나인 데비안(Debian)에서 패키지 관리 툴로 사용하는 apt 사용법에 대해 알아봅시다.

참고로 ‘데비안(Debian)’ 이란 이름은 1993년 배포판을 만든 비운의 프로그래머 이안 머독(Ian Murdock: 2015년 42세로 사망)의 ‘ian’과 프로젝트 시작 당시 그의 여자친구인 데브라 린(Debra Lynn)의 ‘Deb’를 합쳐서 만들었답니다.

이안은 여자 친구와 1993년 결혼했고 2008년 이혼했다고 하니 여자친구 -> 前 여자친구(現 와이프) -> 前 와이프 순을 밟았네요

‘데비안’이란 이름이 헤르만 헤세(출판시 작가명 ‘에밀 싱클레어’)의 소설 데미안(Demian)과 간혹 헷갈리는데 전혀 상관없습니다.


리눅스 파일 캐릭터셋 포스팅(http://www.erider.co.kr/125)에서 잠시 언급했던 패키지 관리자중 apt 사용법에 대해 알아 보려고 합니다.

리눅스/유닉스의 주요 패키지 관리자를 다시 한번 소개하면 다음과 같습니다.

데비안 : apt-get (Advanced Packaging Tool)
페도라(redhat 계열, CentOS) : yum, rpm
아치 리눅스 : pacman
MAC OS : homebrew, MacPorts



apt는 Advanced Packaging Tool의 약자입니다.
이름만 들어도 패키지 매니저 툴이라는걸 알 수 있죠

apt의 패키지 목록은 인터넷에 있는 리포지토리(repository, 저장소)에 저장되어 있는데 여기서 파일을 가져오거나 검색할 수 있습니다.


 

 

 

패키지 리스트의 최신 정보를 내 pc로 가져오는 명령이 있습니다.

sudo apt-get update 

입니다.


 

 

 

대부분 패키지 파일을 설치하기 전에 그런 패키지가 있는지 검색을 해보는데
이때 사용하는 명령이 apt-cache 입니다.

Mysql 과 관련된 패키지를 검색해보고 싶으면

apt-cache search mysql

을 입력하면 됩니다.

 

 

 

 

원하는 패키지명을 찾았다면 다면 이제 설치를 해보도록 합시다.
‘mysql’ 이라는 패키지명을 찾았고 이를 설치하려면

sudo apt-get install mysql

을 입력하면 된다.

패키지의 설치는 슈퍼유저만 가능하기에 sudo 명령으로 슈퍼유저 권한으로 실행한다.
혹시 패키지 설치 중 종속성과 관련된 사항은 패키지 관리자가 알아서 설치해준다. 그래서 패키지 매니저를 사용하는 이유이기도 하다.

 


 

한번에 여러 패키지를 설치하고 싶을 때는 한칸 띄우고 계속 적으면 됩니다.

sudo apt-get install mysql php apache

이런 식으로 적으면 됩니다.



 

설치한 패키지를 삭제하고 싶을 때는 어떻게 할까요?

sudo apt-get remove mysql

이라고 하면 된다.


 

 

그런데 삭제와 관련 명령이 하나 더 있습니다.

sudo apt-get purge mysql

라는 것입니다.


 

remove와 purge의 차이설정 파일을 같이 제거할 것인가 안 할 것인가의 차이다.
Remove는 설정파일을 남겨두고 purge는 모든 것을 깨끗이 삭제한다.

 


 

필요없는 파일을 알아서 삭제해주는 명령도 있습니다.

sudo apt-get autoclean

을 하면 더 이상 필요없는 파일들을 삭제한다.

 


 

가끔 종속성이 바뀌어 더 이상 필요없는 패키지를 제거하는 명령도 있습니다.

sudo apt-get autoremove

명령이다.

 


 

이미 설치된 패키지들이 버전업이 되었을 때 이를 한번에 버전을 올리는 명령도 있습니다.

sudo apt-get upgrade

입니다.

 


 

그렇다면 나는 특정 패키지만 버전을 올리겠다 할 경우는 어떻게 할까요?

sudo apt-get install mysql

입니다.


 

처음 설치하는 명령과 동일하죠?
버전업이 되었으면 재설치하고 이미 최신 버전이면 업그레이드 할 필요가 없다고 하고 종료됩니다.



 

그리고 컴파일 설치 시 특정 파일이 필요한데 이 파일이 어떤 패키지에 들어 있는지 몰라 패키지를 설치할 수 없을 때 파일을 찾을 수 있는 있는 apt-file 명령도 있습니다.

 


Apt-file 을 사용하기 위해서 별도로 설치를 해야 한다.

sudo apt-get install apt-file

로 패키지를 설치한다.



 

sudo apt-file update

저장소를 업데이트 한다.



 

apt-file -l search evince

로 파일이 어느 패키지에 있는지 검색하여 설치하면 된다. (sudo 가 안 붙은 이유는 일반 검색은 슈퍼유저 권한이 필요없기 때문이다)



 

이중 내가 설치하지 않은 목록을 보고 싶으면

apt-file list evince

를 입력하면 된다.


 

리눅스, 유닉스에서는 명령어 사용법에 대해 모를 때는 ‘man 명령어’를 입력하면 아주 자세한 설명과 함께 사용법을 알 수 있습니다. 단, 영어로 너무 자세히 나와서 읽기 싫어지는 것이 문제죠.
이럴때는 ‘명령어 -h’ 또는 ‘명령어 -help’ 또는 ‘명령어 --help’ 정도 입력해보면 간단한 사용법과 옵션 설명을 볼 수 있습니다.


패키지 관리 그렇게 어렵지 않죠?
윈도우에서 클릭하는 것에 비하면 조금 어렵게 느껴지지만 몇 번 해보면 어렵지 않습니다.

라즈베리 파이(Raspberry Pi)는 영국에서 교육용으로 저가로 제작한 최소형 PC입니다. 한글로는  '산딸기'라고 부르죠

OS는 데비안 포크(계열)중의 하나인 라즈비안(raspbian)이라는 리눅스를 기본으로 사용하고 있으나 유분투(Ubuntu), 아치 리눅스, Windows 10 IoT CORE 등 여러 OS를 사용 할 수 있습니다.

OS 다운은 https://www.raspberrypi.org/downloads/ 에서 가능합니다.
설치 및 세팅은 따로 포스팅 하도록 하겠습니다.


라즈베리(산딸기) 파이 1 부터 봐왔는데 그때는 스펙도 별로고 전력도 많이 먹고(아두이노에 비해) 해서 별로 관심이 없었는데 라즈베리파이2 에서 사양이 올라가더니 3에서는 무선랜과 블루투스가 기본으로 포함되었습니다.

그래서 이제 써 볼만한 사양이 되어서 라즈베리 파이 3를 구입해봤습니다.
용도는 개발에 사용할 MariaDB와 Web server, WAS server용

 

▲ 사진을 찍다보니 박스 사진을 빼먹었네요.
다 같은 박스이니 생략하고 보드를 봅시다.

사진 하단 왼쪽부터 전원 포트로 스마트폰에서 사용하고 있는 마이크로 usb 5핀 단자로 스마트폰 충전기와 호환됩니다만 권장 전류가 2.5A입니다. (DC 5V/2.5A)

화면 출력이 HDMI 표준 단자와 스피커 단자가 그대로 있네요
그리고 구입시 참고로 방열판 2개를 기본적 제공하는 업체가 대부분입니다.

 

유선랜(이더넷 10/100M) 포트와 USB 2.0 포트가 4개 보이네요

 

메모리는 micro SD를 지원합니다.

그리고 파이2와 가장 다른 점은 블루투스 4.1 (BLE: Bluetooth Low Energy)와 WiFi (802.11n) 을 자체적으로 지원하다는 것입니다.

 

같이 구입한 공식 케이스를 씌워 보도록 하죠
케이스를 바닥에 놓아 봤습니다.  빨간 색이 산딸기 색상과 딱 맞네요

 

라즈베리파이 본체를 넣고 흰색의 양 옆판을 하나씩 붙이면 이런 모습입니다.
사진상으로는 위, 아래 판이라고 해야 할까요!

 

이제 마지막으로 뚜껑을 닫으면 흰색 뚜껑에 산딸기 마크가 선명하게 보이네요

 

뚜껑은 2개로 되어 있습니다.

모니터, 카메라나 확정 장치를 연결하여 선을 빼야 할 경우는 제일 윗판을 빼고 이런식으로 사용할 수 있습니다.

e라이더는 서버로 사용할것이라서 뚜껑을 다 닫고 사용합니다.

 

뒤집어 보면 micro SD를 넣을 수 있는 구멍이 보이죠.

 

▲ 같이 구입한 2.5A 전원을 연결한 모습입니다.

'라즈비안'이란 OS를 Win 32 Disk Image 프로그램을 통해 micro SD에 설치해서 파이 본체에 넣고 전원을 연결하면 부팅이 시작 됩니다.

설치와 관련해서 별도로 포스팅 하도록 하겠습니다.

 

 

이라이더 블로그는 SAMSUNG(삼성), LG(엘지), HYUNDAI(현대), APPLE(애플), SONY(소니), HP(에이치피), DELL(델), GM(지엠), XIAOMI(샤오미) 등 글로벌 회사로부터 자사제품 홍보 우수 블로거 선정되어 후원을 받고 글을 쓰고 싶어요. 회사당 1억만 주세요.


이 회사들이 미쳤다고 이라이더에 1억을 줄 리가 없으니 제 돈 주고 사서 써보고 제 맘대로 글 쓸겁니다. 

 

2016/11/16 - [Program/Linux] - 리눅스 데비안 패키지 매니저 apt 사용법 (apt_get, apt-cache, apt-file)

2016/11/17 - [Program/Raspberry Pi] - 라즈베리파이 3(raspberry pi 3) 라즈비안(RASPBIAN) OS 설치

2016/11/18 - [Program/Raspberry Pi] - 라즈베리파이 3 구입하면 필수적인 raspi-config 세팅하기 (기본 설정)

mysql, mariadb 에서 테이블 상세 정보를 확인해야 할 때 사용하는 명령어

 

간락한 테이블 정보를 보여준다.

desc 테이블명;

 

 MariaDB [dbname]> DESC account;
+-------------------+-------------+------+-----+---------+----------------+
| Field                 | Type         | Null   | Key | Default | Extra              |
+-------------------+-------------+------+-----+---------+----------------+
| account_no        | int(11)        | NO   | PRI | NULL    | auto_increment |
| year                 | int(11)        | NO   |        | 0        |                     |
| month              | tinyint(4)     | NO   |        | 0        |                     |
| code                | varchar(20)  | NO   | MUL | NULL    |                    |
| user_id             | varchar(20)  | NO   | MUL | NULL    |                    |
| reg_dt              | datetime     | NO   |        | NULL    |                   |
| status               | char(1)       | NO   |        | 0         |                    |
+-------------------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

쉘에서 실제 명령을 입력하면 위와 같이 텍스트로 나옵니다.

웹상에서는 공백 문제로 알아보기 힘드니 이미지로 다시 보면 밑과 같습니다.

 

 

desc 와 또 다른 명령으로 show columns 를 사용해도 결과는 동일합니다.

show columns from 테이블;

 

 

 

간단하게 보여주는것은 좋은데 컬럼에 대한 주석이나 캐릭터셋 정보가 빠져 있죠

좀더 자세히 보려고면 show full columns 를 사용합니다.

show full columns from 테이블;

 

 

 

이외에도 스카마를 이용하는 방법이 있는데 개발하면서 그정도 까지 볼일은 거의 없으니 생략합니다.

검색엔진에 'curl'을 입력했더니 '컬'에 대해서 많이 나옵니다만,

프로그램에서 말하는것은 'C URL(시 유알엘: Client Uniform Resource Locator)' 입니다.


한마디로 표현하면 '인터넷으로 접근 가능한 주소에서 데이터를 보내고 받는 것' 입니다.


특징으로

- open software이고 commad line tool 또는 libCURL을 이용 할 수 있습니다.

- LinuxWindow에서 사용 가능합니다.

- 모든 브라우저에서 사용 가능합니다.

- 다음 프로토콜을 지원합니다. 

   FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE

-  뿐만아니라 

   SSL, HTTP POST, HTTP PUT, FTP uploading, 

   HTTP form기반의 upload, proxies, cookies, user+password 인증도 제공합니다.


이라이더의 주 사용 용도는 웹페이지를 가져와서 가공하여 필요한 데이터만 추출하는 용도와 반대로 웹페이지에 GET/POST 방식의 데이터를 보내는 용도로 사용하고 있습니다.

그외 ftp로 파일도 전송할 수 있고 쿠키로 로그인도 처리할 수 있고 셀에서 못하는게 없습니다.


curl 옵션을 살펴 볼까요


curl -X POST -H "header..." -H "header..." -d "data..." http://www.example.com/curl/test 


옵션 설명

-X : 사용할 Method (Ex: GET, POST)

-H : 전송시 헤더 (EX: -H "Content-Type: application/json")
      여러개의 헤더가 필요 할때에는 헤더 하나당 -H 옵션 하나씩 붙여서 전송.

-d : body에 들어갈 데이터 추가하는 부분

마지막으로 보내야 할 곳의 url


ex) 실제 명령어

curl -X POST -H "header..." -H "header..." -d "{\"uid\"=\"test\"}" http://www.ttmart.co.kr/curl/test


HTTP 요청(GET)

curl http://ttmart.co.kr/


HTTP 요청(POST)

curl -X POST -d "<data>" http://ttmart.co.kr

curl -X POST -d "{\"uid\"=\"test\"}" http://www.ttmart.co.kr


한글일 때는 urlencode 하여 전송

curl -X POST -d "uid=%C6%BC%C6%BC%B8%B6%C6%AE&password=test"}" http://www.ttmart.co.kr


urlencode 하기 싫으면 --data-urlencode 옵션 사용

curl --data-urlencode "id=티티마트" http://ttmart.co.kr


HTTP authentication

curl -u <id>:<password> http://www.panlab.co.kr/


파일 전송(POST)

curl -X POST -d@<filename> http://www.panlab.co.kr/post


PUT

curl --upload-file uploadfile.zip http://www.panlab.co.kr/post


JSON 전송

curl -X POST http://www.panlab.co.kr/json/ -d@eridercokr.json -H "Content-Type: application/json"


모든 과정을 파일(eridercokr_dump.txt)로 저장하고 싶을 때

curl --trace-ascii eridercokr_dump.txt http://www.panlab.co.kr


여기에 올리는 글을 초보자를 위한 자세한 설명이 아니라 자주 사용하는 명령을 간략하게 적어 놓은 것이다.

별도의 설명이 없는 한 배포판은 CentOS를 기초로 하고 있다. 자세한 설명이나 사용법은 리눅스 책이나 다른 블로그 포스팅을 참조하기 바란다.


리눅스는 기본적으로 명령어 뒤에 각종 옵션들을 붙이다보니 긴 명령문이 되어 버린다.

그래서 윈도우즈나 맥OS 같은 GUI 환경에서 작업하는게 부러울 때는 리눅스에 그놈(GNOME: GNU Network Object Model Environment)을 사용하기도 한다.

그런데 그놈(욕이 아니라 이름이다)에 익숙하지 않아서 그런지 느리고 할 수 있는게 제한적이라 답답하다.

그래서 요즘은 처음부터 리눅스의 한 종류인 유분투(Ubuntu)를 설치하는 사용자가 많아 지고 있다.


'유분투'는 컴퓨터 OS의 이름이기도 하지만 

남아프리카 반투어에서 유래된 말로 '네가 있어 내가 있다' 또는 '함께 있어 내가 있다' 라는 뜻이지만

'사람들간의 관계와 헌신을 강조한 전통적 사상으로 평화운동의 사상적 뿌리'이기도 하다.

워낙 많은 의미가 함축되어 있는 말이라 딱 한마디로 정의하기가 힘든 심오한 뜻으로 '故 넬슨 만델라 대통령'이 자주 강조한 말이기도 하다.


다시 원점으로 돌아와서 리눅스에서 환경설정을 약간의 GUI(GUI라 부르기 민망하지만)로 할 수 있는 명령이 있다. 

system-config-securitylevel


그런데 리눅스는 어디까지나 명령어를 직접 치는 맛에 사용한다.


이제 방화벽(firewall)으로 많이 사용하는 iptables 사용법을 알아 보자.


설치

yum -y install iptables

chkconfig iptables on


시작

service iptables start


centos에 기본 설치 했을 때 설치 경로입니다.

/etc/sysconfig/iptables


당연한 얘기겠지만 실치 경로는 리눅스 배포판과 소스 설치 시 옵션과 rpm, yum 등 패키지 툴에 따라 다릅니다.

그런 변수는 설치한 분들이 더 잘 알테니 무시하고 기본 설치 시만 얘기하도록 하겠습니다.


설정은 두가지 방법이 있습니다.

1) iptables 명령으로 직접 설정하고 저장하는 방법과

2) 설정파일을 열어서 편집하는 방법입니다.


1) 설정 명령 후 저장

룰 추가

iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8020 -j ACCEPT


저장 및 적용

/etc/init.d/iptables save 

/etc/init.d/iptables restart


확인

/etc/init.d/iptables -L -n



2) 설정 파일을 열어서 편집하는 방법은 다음처럼 하면 됩니다.

파일 편집 후 저장

vi /etc/sysconfig/iptables-config


적용

/etc/init.d/iptables restart



힘들게 설정한 것을 백업해야 해둬야겠죠. 

백업 명령

iptables-save > 백업할파일명


설정을 백업 했으면 복구도 해야겠죠. 

복구 명령

iptables-restore < 백업한파일명


iptables 확인 옵션


iptables -L : 리스트 확인

iptables -n : PORT를 이름이 아닌 숫자로 표현

iptables -v : 자세한 출력(인터페이스 장비도 출력됨)


설정파일을 편집해서 방화벽의 특정 포트를 오픈해보도록 하겠습니다.

오픈할 포트는 개발 서버에서 많이 사용하는 21(FTP), 22(SSH), 80(WEB), 8080(WEB), 139(Netbios), 443(ssl), 445(smb), 3306(MySql), 3690(svn) 입니다.



vi /etc/sysconfig/iptables

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 139 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited


주의 : 방화벽 설정은 순서대로 적용 되니 꼭 reject 이전에 accept 가 와야 합니다.


설정 파일을 저장했으면 방화벽 다시 시작해야겠죠.

/etc/init.d/iptables restart 


우리는 이메일을 읽을 때 대부분 PC에 메일 클라이언트 프로그램을 설치해 이용한다.  이를 메일 사용자 에이전트 (MUA: Mail User Agent)라고 부른다.

이라이더는 회사 PC에서는 MS의 오피스에 같이 들어 있는 상용 프로그램인 '아웃룩 (outlook)' 을 이용한다.  무료 프로그램인 '아웃룩 익스프레스 (outlook Express)' 와는 다른 프로그램이다. 

개인적으로는 노트북인 맥북 프로에서 맥OS에 포함되어 있는 'mail' 프로그램을 이용하지만 발송인 부분에 한글 인코딩 버그가 좀 있어 적당히 무시하고 본다.


아웃룩은 이메일 읽기 뿐만 아니라 간단한 에디터를 통해 메일을 쉽게 써서 발송할 수 있고 메일 서버로 MS의 익스체인지 서버(Exchange server) 를 사용하면 일정 관리를 할 수 있을 뿐만 아니라 푸시 서비스(스마트폰에서는 실시간으로 푸시가 오기 때문에 강력하다)도 받을 수 있다.


이런 익스체인지 서버와 아웃룩을 구입하려면 비용이 많이 들기에 어느정도 규모가 있는 회사에서나 사용하지 개인이 사용하기에는 무리가 있다.

그래서 개인들은 주로 네이버나 다음(한메일) 같은 무료로 계정을 주면서 웹으로 접근하여 확인하는 웹메일 서비스를 사용할 것이다.  무료이지만 기능은 막강하다.


시대가 변하고 모바일 기기가 발전하면 간단한 이메일 읽기, 쓰기는 PC에서 스마트폰으로 넘어 가면서 스마트폰 OS에 기본 탑재되어 있는 '메일' 앱을 많이 사용한다.  그런데 메일 서버로 exchange server를 사용한다면 푸시(push) 기능을 제대로 지원해주는 MS의 'outlook' 앱을 사용할 것이다. (참고로 '아웃룩'은 PC 버전은 유료, 스마트폰 버전은 안드로이드, 아이폰 상관없이 무료이다)



이렇게 편한 프로그램들을 두고 개발자라면 가끔 서버에 접속해서 메일을 확인해야 할 때가 발생한다.

이럴때 메일을 확인하는 명령을 알아보도록 하자.

메일 접속 명령어

mail -u 메일계정


접속에 성공 했다면 프롬프트에서 다음 명령을 입력하여 원하는 작업을 진행하면 된다.


t 메일번호 : 메일 읽기


h : 메세지 리스트 출력

h : 메일박스 첫 리스트 출력

h 2 : 2번부터 출력


n : 다음 메일


e 메일번호 : ex명령 모드로 메일 편집


f 메일번호 : 지정된 리스트 출력

f 1-3


d 메일번호 : 메일 삭제

d 1-3


s 메일번호 : 지정된 메일을 파일로 저장

s 1 mail.txt


u 메일번호 : 삭제된 메일 복구

u 1 : (q를 실행하기 전까지 가능)


R 메일번호 : 해당 번호 메일 보낸 사람에게 담방 메일 보내기


r 메일번호 : 지정된 메일에 대해 모든 참조자를 포함하여 답변 보냄


pre 메일번호 : make messages go back to /usr/spool/mail


m 유저 리스트 : 원하는 유저에게 메일을 보냄


q : mail 모드에서 모든 상태를 저장후 종료

mail 모드에서 한번 읽었던 메일은 q명령으로 빠져나갈 경우 메일박스에서 삭제되고 mbox 파일로 저장됨


x : mail 초기 상태로 돌려 놓고 나감


! : 쉘 명령을 실행

!pwd : pwd 명령을 실행


cd 디렉토리 : 디렉토리 이동


 

리눅스에서 파일 캐릭터셋을 확인해야 할때가 있죠
file --mime-encoding 파일명

예)
file  --mime-encoding test_erider.co.kr.php
test_erider.co.kr.php: utf-8

 

파일의 character set 을 변경해야 할때가 있죠.
이렇때 iconv 를 사용합니다.

당연한 얘기지만 iconv 가 설치되어 있어야 실행이 되겠죠.
설치가 안되어 있다면 소스 설치도 좋지만 리눅스 배포판에 맞는 rpm, yum 등의 패키지 관리자를 사용하는게 편합니다.

배포판별 주요 패키지 매니저 (사용법은 조금씩 다르지만 기본 모토는 동일하다)


데비안 : apt-get (Advanced Packaging Tool)

페도라(redhat 계열, CentOS) : yum, rpm

아치 리눅스 : pacman

MAC OS : homebrew, MacPorts


유닉스를 사용하는 매킨토시는 MacPorts 를 쓰다가 요즘은 homebrew 패키지 관리자를 많이 사용합니다.

패키지 관리자 사용법은 간단하니 각자 자신에게 맞는 것을 익혀두기 바랍니다.


 

사용법
iconv [<옵션> ...] [<파일> ...]
옵션
-f 인코딩 이름, --from-code=<인코딩 이름> : 원 문서 인코딩 형식
-t 인코딩 이름, --to-code=<인코딩 이름> : 출력 인코딩 형식

-l, --list : 알려진 모든 문자셋 코드를 열거
-c : 출력에서 잘못된 문자를 제외합니다.
-o, --output=FILE : 출력 파일
-s, --silent : 경고를 표시하지 않음
 --verbose : 진행 정보를 상세히 표시
-?, --help : 도움말 리스트를 표시
--usage : 간락한 사용법을 표시
-V, --version : 프로그램 버전 표시

 

utf8 형식의 텍스트 파일을 euckr로 변경시
iconv -f UTF-8 -t eucKR test_utf8.php > test_euckr.php

 

파일의 charset 변환을 위해 iconv 를 사용한다고 했죠.
그런데 txt 파일이 한개가 아니고 여러개일때 일일이 파일명을 적을 수는 없겠죠
이럴때 다음과 같이 쉘스크립트로 처리하여 한번에 변경 합니다.

#!/bin/bash
for f in *.txt; do
  echo $f
  iconv -c -f cp949 -t utf-8 $f -o 1$f
done

 

iconv 가 캐릭터셋 변경에 만능이것 같지만, 간혹 iconv 버전에 따라 변환이 불가능한 문자를 무시하라고 해도 아무련 경고도 없이 변환 불가능한 문자 이전까지 변환되는 문제가 발생하기도 합니다.

그러니 특수한 문자가 많이 들어가 있다면 iconv 로 변환 후 꼭 이상이 없는지 확인을 해볼것을 권합니다.

리눅스의 명령어 자주 안쓰다보니 옵션을 까먹을 때가 많아서 적어 둡니다.


find 명령으로 특정 경로 하위 디렉토리에서 파일 찾기


find /경로 -type f -exec grep '찾을파일이름' {} /dev/null \;

예) find /home -type f -exec grep 'erider.co.kr.gzip' {} /dev/null \;


locate 명령으로 파일 찾기


find /경로 -type f -exec grep '찾을파일이름' {} /dev/null \;

예) find /home -type f -exec grep 'erider.co.kr.gzip' {} /dev/null \;


간단한 파일 용량과 디렉토리 개수와 파일 개수를 알아보는 명령어 입니다.

현재 경로부터 하위 디렉터리까지의 파일 용량을 표시

$ du -hs 


현재 디렉터리 내의 디렉터리 개수

$ ls -l | grep ^d | wc -l 


현재 디렉터리 내의 파일 개수

$ ls -l | grep ^- | wc -l 


참고로 하위 디렉터리를 포함하려면 ls -Rl 옵션을 이용하면 됩니다. 


요즘은 DB 캐릭터셋을 국내에서만 사용할 것이 아니라면 대부분 utf-8로 설정합니다.

그런데 간혹 윈도우에서 작업하거나 덤프한  쿼리문을 인서트 시켜야 할 때가 있습니다.

이때 서버의 캐릭터셋과 달라서 한글이 깨지는 경우가 있는데 캐릭터셋을 맞춰서 넣어줘야 겠죠!



파일 저장형식은 euc-kr (윈도우 텍스트 파일) 이고 DB 는 utf-8  일때  mysql 버전에 따라 인서트 안됨


아래 멍령어로 DB insert

mysql --default-character-set=euckr -u 아이디 -p 디비명 < 쿼리파일명
예) mysql --default-character-set=euckr -u test -p testDB < test_query.sql


간혹 mysql 버전에 따라  --default-character-set 옵션이 동작하지 않아 한글이 깨지는 경우가 있습니다.

이때는 다음 처럼 쿼리 파일을 수정합니다.

test_query.sql 파일 상단에 다음 처럼 서버 설정에 맞는 캐릭터셋 추가 후 insert


set names utf8;

set names euckr;



다른 캐릭터셋 명령도 볼까요!


set names utf8

set session character_set_connection=utf8

set session character_set_results=utf8

set session character_set_client=utf8


각 언어에서 character set 지정은 아래 처럼하면 되겠죠! (아래 예는 php)


mysql_query("set names utf8", $db);

mysql_query("set session character_set_connection=utf8", $db);

mysql_query("set session character_set_results=utf8", $db);

mysql_query("set session character_set_client=utf8", $db);


mysql innodb엔진은 4.x부터는 mysql설치시 기본적으로 탑재되어 있었으나
5.1.3x부터는 기존 configure 옵션되로 하면 기본적으로 innodb가 탑재가 안되며
configure옵션에 --with-plugins=innobase 또는 --with-plugins=max 옵션을 추가해줘야 한다.


 

innodb부분이 YES로 나와있어야함.
mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb   | YES   |
+---------------+-------+
1 row in set (0.00 sec)

 

myisam에서 innodb로 변경
ALTER TABLE 테이블명 ENGINE=INNODB
ALTER TABLE 테이블명 TYPE=INNODB

 

innodb테이블생성시
create table a(a int not null, b int) engine=innodb    (engine=inodb옵션이 붙어야함)

 

트랜잭션 사용

start transaction;
insert into test1 values (11);
insert into test2 values (21);
commit; 

웹에서 사용할수 있는 데이터 그리드, 차트, 트리를 구성할 수 있는 UI 툴입니다.

RIA(Rich Internet Application) 제품도 있고 jQuery plugin 제품도 있는데 유명하고 잘 사용한것 위주로 정리해봅니다.

순서는 이라이더 맘대로 좀 더 정이 가거나 유명한 것이 먼저 오도록 했지만 '랜덤'이라고 씁니다.

목록에 있는 정도면 국내에서 쓰는 대부분의 제품에 해당 할거라고 감히 추축해봅니다.


기능과 가격은 홈페이지 공개있는 자료를 바탕으로 작성했으나 잘못된 부분이 있으면 '이라이더 공지사항'에 있는 연락처로 자료를 보내주시면 수정하도록 하겠습니다.


 

1. 요구조건
  1). Flash와 ActiveX 를 사용하는 제품은 탈락
  2). javascript 를 사용해야함
  3). 자연스럽게 html 5, css 를 사용하는 제품만 남겠죠
  4). jQuery 선호

 

2. UI tool 또는 grid 비교

 번호

제품명 

사이트 

라이선스

기타 

1

nexacro platform

www.tobesoft.co.kr

유료
서버 core당 라이선스 (도메인 제한없음)

html5 지원, 고가, 기술지원 잘됨, 국내 SI 에서 많이 사용

- grid, tree 지원 / chart 없음

2

AXISJwww.axisj.com

무료 (LGPL v2)

- grid, tree, chart 지원

3

ExtJS

www.sencha.com

일부 무료,
유료

RIA 툴, 다 좋은데 배우기 좀 어렵고  버전별 차이 있음, 가격도 이 정도면 저렴

- grid, tree, chart 지원

4

realgrid

www.realgrid.com

유료

- grid, tree 지원 / chart 없음

5

rMate

www.riamore.net

유료

서버당 라이선스, 비교적 저렴

- grid, tree, map 별도로 판매

6

kendo UI

www.telerik.com/kendo-ui

유료

- grid, tree, chart, editor 지원

7

jqGrid

www.trirand.com/blog/

4.7까지 MIT,
4.7.1 부터 무료, 유료

 4.7.1 부터 비영리 무료, 
그 외 유료
- grid 지원 / tree, chart 없음

8

WebSquare

www.inswave.com

유료

- grid, tree, chart 지원

9

jQuery Table Sorter

www.tablesorter.com/docs/

무료 (MIT or GPL)


10

SlickGrid github.com/mleibman/SlickGrid/wiki 무료 (MIT)  

- jqGrid 가 재확인 중 무료에서 4.7.1버전 부터 상업용 유료로 변경되어 수정했습니다. (2016-9-28 수요일)

 


3. chart 비교

 번호

제품명 

사이트 

라이선스

기타 

1

rMate

www.riamore.net

유료

서버당 라이선스, 비교적 저렴

- grid, tree, map 별도로 판매

2

chart

www.chartjs.org

무료 (MIT)


3

JqPlot

www.jqplot.com

무료 (MIT or GPL v2) 

4

Morris

morrisjs.github.io/morris.js

무료 (BSD) 

5

xChart

tenxer.github.io/xcharts

무료 (MIT) 

6

sigmajs

sigmajs.org

무료 (MIT)

 

7

HighCharts

www.highcharts.com

유료

1 developer : USD 590
5 developer : USD 2,655
10 developer : USD 5,020

8

Fusion Charts

www.fusioncharts.com

유료

1 developer : USD 199
Team : USD 999
Enterprise : USD 1,999
Enterprise plus : USD 3,299

9

jscharts

www.jscharts.com

유료

1 domain, commercial : USD 79
2 domain, commercial : USD 119
5 domain, commercial : USD 169

10

google chartdevelopers.google.com/chart무료 (Apache 2)

11

canvasjs

canvasjs.com

유료

developer license, non support
1 developer : USD 399
Team (5 dev) : USD 999
unlimited : USD 1,999



그리고 차트부분은 잘 정리한 자료가 있어서 링크 겁니다.
http://codegeekz.com/best-jquery-chart-libraries-for-building-interactive-charts/

 

윈도우 부팅시 맥북 키보드, 트랙패드 사용법

 

부팅시 OS 선택 : 전원 ON 후 바로 ALT 키를 계속 누르고 있으면 OS 선택 화면(MAC OS, WINDOWS)에서 좌우 화살표키()로 선택후 엔터

기본 부팅 OS 변경은 윈도우 하단 시스템 트레이 시계 왼쪽에 부트캠프(bootcamp) 설정에서 기본 부팅을 윈도우나 맥OS 로 변경하면 됨 (OS 부팅시는 환경설정 > 부트캠프에서 변경)

 

윈도우 부팅시 맥북 키보드 맵핑  (USB에 윈도우용 키보드를 연결시 기존과 동일하게 사용할 수 있음)

윈도우 키보드

맥북 키보드

용도

Window 윈도우

Apple 또는 command 애플, 커맨드

 

Alt      알트

option   옵션

 

Ctrl     컨트롤

ctrl 또는 control   컨트롤

 

Enter    앤터

return    리턴

다음줄로 이동

/

오른쪽 Apple 또는 command

원래 오른쪽 option

한자

시스템 트레이에서 漢 클릭

원래 오른쪽 ctrl

Backspace 백스페이스

delete    딜리트

커서 왼쪽 문자 삭제

Delete 딜리트

Fn + delete  펑션 + 딜리트

커서 오른쪽 문자 삭제

PrtScn 프린트스크린

Fn + Shift + F11

화면 캡쳐 (전체)

Alt + PrtScn

option + Fn + Shift + F11

화면 캡쳐 (활성창: 선택창)

PgUp 페이지 업

Fn + 화살표 상

다음 페이지로 이동

PgDn 페이지 다운

Fn + 화살표 하

이전 페이지로 이동

Home

Fn + 화살표 왼쪽

커서 줄 왼쪽 끝으로 이동

End   엔드

Fn + → 화살표 오른쪽

커서 줄 오른쪽 끝으로 이동

Insert 인서트

Fn + enter

 

Scroll Lock 스크롤 락

Fn + Shift + F12

 

Pause

Fn + esc

일시 정지 / 멈춤

Num Lock 넘버 락

Fn + F6

숫자 키보드 잠금

 

 

 

 

윈도우 부팅시 맥북 트렉패드 사용법 (USB에 마우스를 연결시 기존과 동일하게 사용할 수 있음)

기존 마우스 기능

트랙패드 조작법

커서 이동

한 손가락으로 드래그

왼쪽 버튼

한 손가락으로 클릭 또는 트랙패드 밑의 버튼 클릭

오른쪽 버튼

두 손가락으로 클릭 (맥은 오른쪽 버튼이 없음)

상하 스크롤 (휠 상하 회전)

두 손가락으로 상하 드래그

좌우 스크롤

두 손가락으로 좌우 드래그

 

 

 

OS 부팅시 맥북 키보드, 트랙패드 사용법

 

부팅시 OS 선택 : 전원 ON 후 바로 ALT 키를 계속 누르고 있으면 OS 선택 화면(MAC OS, WINDOWS)에서 좌우 화살표키()로 선택후 엔터

기본 부팅 OS 변경은 윈도우 하단 시스템 트레이 시계 왼쪽에 부트캠프(bootcamp) 설정에서 기본 부팅을 윈도우나 맥OS 로 변경하면 됨 (OS 부팅시는 환경설정 > 부트캠프에서 변경)

 

OS 부팅시 맥북 키보드 기능

윈도우 기능

맥북 기능

용도

Alt      알트

option   옵션

 

Ctrl     컨트롤

Apple 또는 command 애플, 커맨드

 

Enter    앤터

return    리턴

다음줄로 이동

/

Apple 또는 command + space bar

 

한자

 

 

Backspace 백스페이스

delete    딜리트

커서 왼쪽 문자 삭제

Delete 딜리트

Fn + delete  펑션 + 딜리트

커서 오른쪽 문자 삭제

PrtScn 프린트스크린

Apple + Shift + 3

화면 캡쳐 파일저장 (전체 화면)

Alt + PrtScn

Apple + Shift + 4 + space

화면 캡쳐 파일저장 (윈도우 선택)

 

Apple + Shift + 4

화면 캡쳐 파일저장 (영역 선택)

 

Apple + Shift + control + 3

화면 캡쳐 클립보드저장 (전체 화면)

 

Apple + Shift + control + 4

화면 캡쳐 클립보드저장 (영역 선택)

PgUp 페이지 업

Fn + 화살표 상

다음 페이지로 이동

PgDn 페이지 다운

Fn + 화살표 하

이전 페이지로 이동

Home

Fn + 화살표 왼쪽

커서 줄 왼쪽 끝으로 이동

End   엔드

Fn + → 화살표 오른쪽

커서 줄 오른쪽 끝으로 이동

 

 

 

 

OS 부팅시 트렉패드 사용법 (USB에 마우스를 연결시 기존과 동일하게 사용할 수 있음)

기존 마우스 기능

트랙패드 조작법

커서 이동

한 손가락으로 드래그

왼쪽 버튼

한 손가락으로 클릭 또는 트랙패드 밑의 버튼 클릭

오른쪽 버튼

두 손가락으로 클릭 (맥은 오른쪽 버튼이 없음)

상하 스크롤 (휠 상하 회전)

두 손가락으로 상하 드래그

좌우 스크롤

두 손가락으로 좌우 드래그

 

linux + apache + php 에서 MsSql 에 접속하기 위해서는 freeTDS 를 사용하면 쉽게 연결 할 수 있다.

freeTDS 가 뭔지는 공식 사이트인 http://www.freetds.org/ 를 잘 읽어 보고

바로 설치 하겠다 하는 분은 여기서 파일을 다운로드 하면 된다.
ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

위 링크 주소가 의심스러우면 공식 사이트로 들어가서 링크를 타고 이동해도 된다.

freeTDS 설치
다운로드 했으면 설치를 해보자
configure --prefix=/usr/local/freetds --enable-msdblib --with-gnu-ld --enable-shared 
make 
make install 


모든 프로그램이 그렇듯 설치를 했으면 MsSql 서버에 대한 정보를 설정을 해야 한다.
설정 파일의 경로는 /usr/local/freetds/etc/freetds.conf 에 있다.

vi 에디터로 파일을 열어보자
vi /usr/local/freetds/etc/freetds.conf 


MsSql DB 정보가 다음과 같다고 했을 때
디비 접속 변수 이름 : mydatabase
디비 IP : 192.168.0.2
디비 포트 : 1433
캐릭터셋 : UTF-8

디비 계정: userid
디비 비번: userpwd
[mydatabase] 
host = 192.168.0.2 
port = 1433 tds 
version = 8.0 
client Charset = UTF-8 


설정이 끝났으면 php 에서 정상적으로 접근이 되는지 확인해보자
mssql_dbcon.php
[mydatabase]
        host = 192.168.0.2
        port = 1433
        tds version = 8.0
        client Charset = UTF-8


여기서 알수 있듯 hostname 부분만freeTDS 설정으로 변경되고 디비 계정과 비밀번호는 mssql_connect() 함수에 직접 넣어 줘야 한다.

웹서버 응답제한시간 초과에 대처하는 php 의 방안

모든 웹 언어는 아무리 늦어도 수초 안에 동적인 페이지지 생성을 끝내고 웹서버 혹은 WAS 에서 바로 웹 브라우저로 내보내기(flush)를 처리하지만

동보메일 처럼 여러 사람에게 수천통의 메일발송을 웹페이지로 구현해야 하는 경우
처리 시간이 길어저 웹서버에 설정된 응답 제한시간 초과하는 일이 발생한다.

이럴때는 웹서버 응답시간 이내에 브라우저로 뭔가를 지속적으로 보내주는 처리를 해야 한다.

이럴때 사용하는 명령이 flush() 입니다.

사용법은 아주 간단하다.

sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송)
echo "
====1===
"; flush(); sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송) echo "
====2===
"; flush(); sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송) echo "
====3===
"; flush();


뭥미?
이게 전부임?

뭘 바랬는지 모르지만 이게 전부다.
다른 언어도 이와 비슷한 함수들이 있으니 언어별로 조금만 바꾸면 모두 적용 할 수 있다.


여기서 끝내면 뭔가 찝찝하다. 마치 화장실 갔다가 휴지가 없어서 알아서(?) 뒷처리를 하고 나온 것 처럼...

실제로 딱 위 내용 까지만 적용했다가 고객 클레임 전화를 받고 이라이더에게 전화나 카톡, 이메일 (최신 연락처는 언제든 블로그 하단이나 공지사항에 공개 되어 있다)로 항의 할지도 모르다.

실제로 해보면 내가 테스트 할때는 퍼펙트하게 잘 되지만 서비스에 적용해 놓으면 여기 저기서 전화오고 난리가 날것이다.
여기에 하나 빠진것이 있는데 사용자의 브라우저 종류와 버전 이다.

여기서 기초적인 웹페이지를 가져오는 방식을 알아야 한다.
사용자는 브라우저가 웹서버에 웹페이지를 요청하고
웹서버는 요청한 페이지를 동적으로 생성해서 버퍼에 넣고 끝나면 자동으로 버퍼의 내용을 브라우저에 전송하고 웹페이지가 끝났다고 신호를 같이 보낸다

하지만 flush() 는 웹서버의 현재 버퍼에 있는 데이터(웹페이지)를 먼저 사용자의 브라우저에 보내지만 끝났다는 신호는 안 보낸다는것이 문제다.
(왜? 아직 페이지를 동적으로 생성중이니까!)

그래서 어떤 브라우저는 화면에 아무 출력도 없이 끝났다는 신호가 들어올때까지 마냥 기다리거나 아니면 응답없음으로 접속을 끊어 버린다.

그럼 flush() 는 처음 부터 쓸수 없는 것이였나?
결론만 얘기하면 아니다.

flush() 는 웹서버 입장에서 정상적으로 동작한것인데 문제는 웹브라우저에 있다.
크롬, 오페라 같은 브라우저는 flush() 로 내보낸 데이터를 바로 받아서 화면에 뿌려주지만(화면 출력을 이렇게도 표현한다)
FF(Fire Fox : 파이어폭스) 는 1024byte 가 다 찰때까지 기다리고
IE 10(Internet Explorer 10)은 4096byte 가 다 찰때까지 기다리는것이 문제다.

브라우저 별로 정리하면 다음과 같다. (IE11 이나 엣지, 사파리 같은 나머지 최신 브라우저는 알아서 조사해서 댓글로 좀 알려 주세요)
 * IE 10 : 4096 바이트
 * FF 21.0 : 1024 바이트 / 하위버젼 호환성을 위해 최초 제일 뒤에 "\n" 넣을것
 * 크롬 29.0 : 상관없음
 * Opera 16.0 : 상관없음


이렇다 보니 개발자가 크롬에서 개발할 때는 아주 잘 되다가
서비스에 올리면 사용자의 브라우저에 따라서 화면에 아무것도 출력이 안될 수 있다.

그럼 해결 방법은 아주 간단하다.
웹서버 버퍼에 강제로 4096 byte 이상을 넣은 후에 flush() 를 하면 된다.
sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송)
echo "
====1===
"; echo str_repeat(' ', 4096). "\n"; flush(); sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송) echo "
====2===
"; echo str_repeat(' ', 4096). "\n"; sleep(2); // 시간이 걸리는 업무 처리중 (예시: 메일 10건 발송) echo "
====3===
"; echo str_repeat(' ', 4096). "\n"; flush();

참 쉽죠?
오류, 오타, 건의 사항은 이메일, 카톡으로 연락 부탁드립니다. (글 하단이나 공지사항에 연락처 있음)

 



2016년 11월 15일 추가 :

str_repeat(' ', 4096)  중간에 ' ' 사이에 공백이 있습니다.

모든 웹 언어에서 그렇듯 php 에서도 브라우저의 버젼을 확인하기 위해서는 브라우저에서 보내온 사용자 에이전트(User Agent) 문자열을 분석해서 판별하게 됩니다.

다른 언어 request 에 해당하는것이 php 에서는 대부분 $_SERVER[] 에 있습니다.
자세한것은 php 메뉴얼 http://php.net/manual/en/reserved.variables.server.php 를 참고하세요

주로 많이 쓴는것만 적어보면
$_SERVER["REMOTE_ADDR"] // 사용자 IP
$_SERVER["HTTP_REFERER"] // 이전 페이지
$_SERVER["HTTP_USER_AGENT"] // 브라우저 정보


그럼 본격적으로 브라우저 버전을 확인하는 소스입니다.
$userAgent = $_SERVER["HTTP_USER_AGENT"]; 

if ( preg_match("/MSIE*/", $userAgent) ) { 
	// 익스플로러

	if ( preg_match("/MSIE 6.0[0-9]*/", $userAgent) ) {
		$browser = "Explorer 6"; 
	}elseif ( preg_match("/MSIE 7.0*/", $userAgent) ) {
		$browser = "Explorer 7";
	}elseif ( preg_match("/MSIE 8.0*/", $userAgent) ) {
		$browser = "Explorer 8"; 
	}elseif ( preg_match("/MSIE 9.0*/", $userAgent) ) {
		$browser = "Explorer 9"; 
	}elseif ( preg_match("/MSIE 10.0*/", $userAgent) ) {
		$browser = "Explorer 10"; 
	}else{
		// 익스플로러 기타
		$browser = "Explorer ETC"; 
	}

} elseif ( preg_match("/Trident*/", $userAgent &&  preg_match("/rv:11.0*/", $userAgent &&  preg_match("/Gecko*/", $userAgent) ) ) ) {
	$browser = "Explorer 11"; 

} elseif ( preg_match("/(Mozilla)*/", $userAgent) ) { 
	// 모질라 (파이어폭스)
	$browser = "mozilla";

} elseif ( preg_match("/(Nav|Gold|X11|Mozilla|Nav|Netscape)*/", $userAgent) ) { 
	// 네스케이프, 모질라(파이어폭스)
	$browser = "Netscape/mozilla";

} elseif ( preg_match("/Opera*/", $userAgent) ) { 
	// 오페라 
	$browser = "Opera";

} else {
	$browser = "Other"; 
}

echo $browser;


IE11 에서는 User Agent 에 "MSIE" 문구가 삭제 되었습니다.
이제 더이상 "MSIE" 만으로는 IE 유무를 판단할 수 없습니다.
("MS의 Internet Explorer 11 소개 및 업그레이드" 문서에도 User Agent String 변경이 자세히 실려 있습니다)
// IE11 의 User-Agent 입니다. (Windows 10 버전이라서 Windows NT 10.0 가 들어갑니다
// "MSIE"를 대체하는 "Trident"  가 들어가 있고 버전인 "rv:11.0" 그리고 "Gecko" 가 추가 되었습니다.

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; SMTE; rv:11.0) like Gecko
php 스위치 switch 문 사용법입니다.

어느 언어에서나 switch 문은 거의 동일한 문법이죠

switch (비교에 사용할 변수) 를 적고 case (조건): 을 만족하는것을 실행 합니다.
주의해야할 것은 php 는 case 조건에 맞는 부분과 함께 default: 부분도 실행됩니다.
디폴트를 실행 하기 싫다면 해당 case 조건 마지막에 꼭 break 를 넣어 주세요

다음 소스는 앞에 case 조건을 만족하면 default 부분이 실행 되지 않습니다.
switch ($my_status) {
case ($my_status == "W"):
	$print_status = "대기";
	break;
case ($my_status == "P" || ($my_status == "E")):
	$print_status = "진행중";
	break;
case "E":
	$print_status = "완료";
	break;
case "R":
	$print_status = "보류";
	break;
default:
	$print_status = "없음";
}


다음 소스는 앞에 case 조건을 만족하더라도 default 가 무조건 실행 됩니다.
switch ($my_status) {
case ($my_status == "W"):
	$print_status = "대기";
case ($my_status == "P" || ($my_status == "E")):
	$print_status = "진행중";
case "E":
	$print_status = "완료";
case "R":
	$print_status = "보류";
default:
	$print_status = "없음";
}

MySql 에서 날짜를 표현하고 변환하는 date_format() 에 대해서 알아봅시다.
워낙 기초적인것이고 초보자를 위해 상세하게 설명하는 글이 아니라 옵션 설명을 자꾸 까먹어서 기록용으로 남기는 거니 간단하게 설명하고 넘어 갑니다.

블로그 전체가 오른쪽 마우스 사용 제한이 걸려있으니 소스를 복사할 분은 검은 배경의 소스창 오른쪽 상단의 "source view" 를 눌러서 복사하면 됩니다.

date_format(date, format) 은 date를 새로운 날짜 format으로 반환하는 함수 입니다.

한국에서 가장 많이 사용하는 날짜 형식(년-월-일 시:분:초)은 다음과 같이 하면 된다.

mysql> SELECT date_format(now(),'%Y-%m-%d %I:%i:%s')



format 사용하는 인자를 아래를 적어 놓으니 참고 바랍니다
%M : 달의 이름 (January... December)
%W : 주의 이름(Sunday,..... Saturday)
%D : 1st, 2nd 등을 이용한 달을 표현함
%Y : 4개의 숫자를 이용한 연도 (예, 1999,2000,2001)
%y : 2개의 숫자를 이용한 연도 (예, 99,00,01)
%X : %V와 함께 쓰여 연도를 나타냄
%x : %v와 함께 쓰여 연도를 나타냄
%a : Sun, Sat과 같은 요일을 나타냄
%d : 00, 01......31등의 날짜를 표현함
%e : 0,1,2,.....31등의 날짜를 푠현함
%m : 01,02...12 등의 달을 표현함
%c : 1,2,....12등의 달을 표현함
%b : Jan, Dec 같은 방법으로 달을 표현함
%j : 001,002,003... 366 과 같이 날짜를 표현함(올해의 몇번째 날인가)
%H : 00,01,02...23 과 같이 시를 표현
%h : 01,02...12와 같이 시를 표현
%I(대문자 아이) : 01,02...12와 같이 시를 표현
%l(소문자 엘) : 1,2...12와 같이 시를 표현
%i : 00,01.....59 와 같이 분을 표현함
%r : 시간을 12시로 "hh:mm:ss AM|PM" 형식으로 표현
%T : 시간을 24시로 "hh:mm:ss"형식으로 표현
%S : 00,01,....59 형식으로 초를 표현
%s : 00,01,...59 형식으로 초를 표현
%p : AM 혹은 PM
%w : 0,1,......6 형식으로 요일을 표현 (0은 일요일, 1은 월요일 6은 토요일)
%U : 주를 0,1,...53 식으로 표현(일요일이 주의 시작인 경우)
%u : 주를 0,1,...53 식으로 표현(월요일이 주의 시작인 경우)
%V : 주를 0,1,...53 식으로 표현(일요일이 주의 시작인 경우), %X와 함께 쓰임
%v : 주를 0,1,...53 식으로 표현(월요일이 주의 시작인 경우), %x와 함께 쓰임
%% : %자체를 표현



Ex) 실제 쿼리에서 사용하는 방법이다.
//now()는 현재날짜와 시간을 반환하는 함수

mysql > SELECT date_format(now(), '%W %M %Y');

//결과는 다음과 같다
+-------------------------------+
| date_format(now(),'%W %M %Y') |
+-------------------------------+
| Sunday December 2001 |
+-------------------------------+
1 row in set (0.00 sec)



// 날짜 붙여서 가져오기
mysql > SELECT date_format(now(),'%Y%m%d%I%i%s')



테이블에 있는 컬럼명 reg_date 의 날짜를 가져와서 변환 할 수 도 있습니다.
SELECT FROM_UNIXTIME( reg_date, '%Y-%m-%d' ) FROM `테이블명`


php 에서 mysql 접속하는 방법입니다.


이렇게 기초적인 간단한걸 왜 포스팅 하냐고요?

요즘은 php 도 대부분 프레임워크를 사용하기 때문에 이렇게 직접 디비에 접속하고 쿼리문 작성하고 결과를 처리할 일이 없기 때문에 너무 안 써서 까먹으니까 기록으로 남겨 놓으려고 합니다.



php 에서 mysql 접속하는 방법입니다.

배열이 아닌 일반 변수로 처리해도 상관 없습니다.


$mysql["host"] = "localhost"; // 서버아이피 또는 도메인
$mysql["port"] = "3306";
$mysql["conn"] = "";
$mysql["user"] = "user_name"; // 디비계정
$mysql["pass"] = "password"; //	비밀번호
$mysql["database"] = "database_name"; // 디비이름

$mysql["conn"] = @mysql_connect($mysql["host"], $mysql["user"], $mysql["pass"]) or die('DATABASE CONNECT ERROR!');
mysql_select_db($mysql["database"], $mysql["conn"]) or die('DATABASE CONNECT ERROR!');



쿼리문을 작성하고 실행 합니다.

$query = "SELECT *  FROM 테이블 WHERE uid='아이디' ";

$result = mysql_query($query, $mysql["conn"]);



결과 row 개수의 가져옵니다.

$total_count = mysql_num_rows($result);



결과를 배열로 받아서 while 문으로 반복하면서 row 별로 처리해볼까요

while( $row = mysql_fetch_array($result) ){
	$uid = $row["uid"];
	$user_name = $row["user_name"];
	$user_tel = $row["user_tel"];
}



배열의 인텍스로 값을 가져올 수 있습니다.  이렇게요.

while($row = mysql_fetch_array($result)){
	$uid = $row[0];
	$user_name = $row[1];
	$user_tel = $row["user_tel"];
}




결과를 받아서 for 문으로 반복해볼까요

$query = "SELECT *  FROM 테이블 WHER uid='아이디' ";

$result = mysql_query($query, $mysql["conn"]);
$total_count = mysql_num_rows($result);

for($i = 0; $i <= $total_count; $i++) {
	$uid = mysql_result($result, $i, 0);
	$user_name = mysql_result($result, $i, 1);
	$user_tel = mysql_result($result, $i, 2);
}



list 를 이용하여 변수로 바로 받을 수도 있습니다.

while( list($uid, $user_name, $user_tel) = mysql_fetch_row($result) )  {

}



테이블에 insert 후 자동증가 값인 pk 값을 가져옵니다.

$query = "INSERT INTO (seq, name, tel) VALUES ('', '홍길동', '010-1234-5678') ";

$result = mysql_query($query, $mysql["conn"]);

$total_count = mysql_affected_rows();


+ Recent posts