2014년 12월 26일 금요일

Mendeley

Mendeley

Introduction

Home

  • https://www.mendeley.com/
    • 웹 기반 자료 접속
    • 다른 클라우드 서비스 이용하지 않더라도 2GB 까지 무료 제공하지만, 다소 느림.

Tutorial / Inspiration

  • 소개 블로그
    • 논문 관리 프로그램 Mendeley (Sept. 2014)
    • 논문 효율적으로 작성하는 방법 (Feb. 2015) 
      • 아이디어를 떠오르게 해주는 툴 (엄밀히 말해 아이디어를 정리 해주는 툴)
      • 레퍼런스를 정리하고 요약하는 툴 
      • 개요를 잡아주는 툴 
      • 글을 보다 쉽게 쓸 수 있게 해주는 툴 
      • Citation을 쉽게 달 수 있게 도와주는 툴

Synchronization between multiple machines

Examples

  • Using Mendeley and Dropbox to sync your pdf library across computers (Aug. 2012)
    • Dropbox를 이용하여 Mac 간의 PDF 파일 동기화 시키기
  • Mendeley in two computers (Nov. 2016 by Carlos Zuluaga)
    • 윈도우 머신간의 동기화를 위해서는 다음의 다섯 단계대로 수행.
      • 1) 두 머신의 클라우드 서비스 클라이언트 폴더 위치를 동일하게 맞추기. 예를 들어, 두 컴퓨터 모두 dropbox folder를 C:\Dropbox로 잡기.
      • 2) 상기 폴더에 멘들리 폴더를 만들어서 dataDirectory 파일 넣어놓기. (참고: dataDirectory can be found by opening Mendeley, hitting Crtl+Shift+D, Debug Tools tab, and clicking on Open Data Directory.)
      • 3) Mendeley 레지스트리(HKEY_CURRENT_USER\Software\Mendeley Ltd.\Mendeley Desktop)에 문자열 키("dataDirectory")를 생성하고 dataDitectory 폴더 위치를 값으로 지정.(예를 들면, "C:/Dropbox/Mendeley")
      • 4) Mendeley를 구동시켜 보기.
      • 5) 두번째 머신에서도 반드시 상기 1~3번 과정 확인하기. 이후 Mendeley 구동하기.  

Restore Backup

  • 3년 정도 사용하다보니(highlights와 note 등 annotation이 10만개를 훨씬 넘었다), database sqlite 파일이 26MB 정도 되었는데, 가끔씩 annotation synchronization이 빠릿빠릿 동작하지도 않고, 왠지 동기화가 꼬인듯 해서, 나름 최적화 한번 해보려고, database도 건드려보고 backup 기능도 이리저리 해보다가 모든 파일/폴더/노트를 초기화했다. 아예 이참에 새로 시작하는 마음으로 모든 논문을 백지상태에서 다시 정리할까도 생각했는데, 폴더를 새로 구성하면서 느껴지는 묵직한 두려움... 2천개가 넘는 논문 파일을 다시 열어서 줄을 긋기는 도저히 무리!라고 정신을 차리고, 미리 대비해서 갖춰둔 backup database가 잘 돌아가기를 기도하면서 실행했지만, 결과는 foreign key constraint failed key라면서 데이터 키값이 맞지 않는다는 둥 원상복구에 실패. 인터넷이나 mendeley support도 유사 답이 없는 것 같아서, database sqlite 테이블을 다 열어서 스스로 해결 했다. sqlite 및 sql에 대해서 얕게라도 알고 있다면 참고하시길. 나름 주말 시간 다 잡아먹은 노력의 산물이니 도움이 되시길.
  • 더불어 이번 기회에 느끼게 된 점.
    • Mendeley는 논문/보고서를 저장하는 공간이나 통로가 아니라, 해당 서지정보에 대한 요약 및 개략정보를 저장/조회하는 도구로서, 이러한 서지정보가 쌓이면서 역시 동기화 문제가 발생할 수 있음.
    • 주석 및 노트가 지속적으로 유지 관리되어야 하는 내용만 Mendeley에 넣어놓기.
    • 데이터의 분석결과는 체계적으로 정제된 다른 방식(예: 기술문서)으로 정리하기.
  • mendeley debug 모드 들어가기: 
    • CTRL+SHIFT+D
  • 논문 파일의 로컬 저장소 위치를 변경했을 때, PDF 파일 위치가 깨지면서 열리지 않게 되는 데, 이에 대응해서 파일 위치 일괄 수정하는 방법: database sqlite 파일을 열어서 다음 사항 적용한뒤, mendeley 구동.
    • UPDATE Files SET localUrl=REPLACE(localUrl, "/mendeleyDesktop/", "/mendeleyPapers/"); 
  • 로컬 database sqlite 파일을 이용해, 완전 복구하려면, 다음의 사항을 적용한 뒤, mendeley를 구동. 
    • UPDATE RemoteFileHighlights SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
    • UPDATE RemoteFileNotes SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
    • UPDATE RemoteFolders SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
    • UPDATE RemoteDocuments SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
    • UPDATE RemoteDocumentNotes SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
    • UPDATE DocumentFolders SET status=REPLACE(status, "ObjectUnchanged", "ObjectCreated"); 
  • Database constraint 경고가 발생할 때의 나름 대처 방법
    • 로그 파일을 찾아보면 대략 다음과 같은 내용이 적혀있을 것이다.
      • SqlQuery::handleError: SQL Error:  foreign key constraint failed / Query executed: DELETE FROM Documents WHERE id = :id
    • SQLite DB Browser를 이용해서, XXX@XXX@www.mendeley.com.sqlite 파일을 열고, Documents 테이블에서 해당 id에 대한 레코드를 삭제 한 후 변경사항을 저장하자.

2014년 12월 23일 화요일

리눅스 path 찾기 (basename, dirname, baselink)

링크: http://yolongyi.tistory.com/25

basename : full path에서 파일 이름만 추출

dirname : 파일이름을 제외한 path만 추출

baselink -f : 실제 절대 경로를 알려줌

크롬 확장 프로그램

관련 링크: http://www.itworld.co.kr/slideshow/91136

2014년 12월 19일 금요일

리눅스 디렉토리 구조를 출력하는 방법

참고 블로그:
http://www.dongwun.com/tc/3
http://webnautes.tistory.com/483
http://manpages.ubuntu.com/manpages/hardy/man1/tree.1.html


윈도우: tree /F > result.txt 

리눅스: tree /[디렉토리명]

디렉토리만 볼 때
$ tree -d ./dev
디렉토리와 파일
$ tree -a ./dev

디렉토리와 파일 (디렉토리명 뒤에 / 붙일때)
$ tree -aF ./dev

$ tree -aF ./v0.6

2014년 12월 16일 화요일

SCRUM, 스크럼

관련 글 링크: http://www.ciokorea.com/news/23378

스크럼의 배경, 역사

2014년 12월 9일 화요일

기계학습 오픈소스 도구

관련링크: http://www.itworld.co.kr/slideshow/90912

  • 스팸 필터링, 얼굴 인식, 추천 엔진을 비롯해 대규모 데이터를 기반으로 예측 분석이나 패턴 인식을 하고 싶다면, 기계 학습(Machine Learning) 적용 가능
  • 컴퓨터가 코드로 정의되지 않은 방식으로 데이터를 학습하고, 분석하고, 행동한다는 이론
  • 여기서는 각각의 앱이나 하둡과 같은 전체 프레임워크에 대한 기능을 제공하는 기계 학습 도구 11가지를 소개

싸이킷(Scikit)은 파이썬 전용의 기계 학습 라이브러리
사이킷-런(Scikit-learn)은 수학과 과학 분야에서 넘피(NumPy), 사이피(SciPy), matplotlib 등을 폭넓게 이용한다. 결과물인 라이브러리는 인터랙티브 '워크벤치' 애플리케이션에 이용하거나, 다른 소프트웨어에 탑재시켜 재사용할 수 있다. BSD 라이선스로 제공되는 오픈소스로 재사용이 가능하다.

쇼군(Shogun)은 범용 및 전용 언어에 대한 각종 인터페이스를 지원. 1999년 개발. C++에 기반
SWIG 라이브러리 덕분에 자바, 파이썬, C#, 루비, R Lua, Octave, Matlab에서도 이용할 수 있다. 쇼군에 비견할 수 있는 라이브러리로는 Mlpack이 있는데, C++ 기반으로 2011년 개발됐다. 그러나 Mlpack보다 더 많은 통합 API를 제공하는 쇼군이 쉽고 빠르게 다룰 수 있다는 평가

어코드(Accord) Framework/AForge.net
닷넷(.Net)용 단일 프로세싱 프레임워크 겸 기계 학습 라이브러리인 어코드(Accord)는 AForge.net의 확장판이다. 여기에서 '단일 프로세싱’은 이미지를 통합하거나 얼굴을 인식하는 등 이미지와 음성을 처리하는 여러 기계 학습 알고리즘을 일컫는다. 여기에는 동영상 등 이미지 스트림을 대상으로 하는 비전 프로세싱(vision processing) 알고리즘이 포함되며, 움직이는 물체를 추적하는 기능을 구현하는 데 사용되기도 한다. 어코드에는 신경망에서 의사결정 나무 시스템에 이르기까지 보다 전통적인 기계 학습 기능을 구현하는 라이브러리가 포함

Mahout
Mahout 프레임워크는 오랜 기간 하둡과 연관됐으나, 상당수는 하둡 이외에서도 작동된다. 해당 프레임워크는 하둡이나 자체적인 독립형 애플리케이션으로 분리될 수 있는 하둡 프로젝트와 통합할 독립형 애플리케이션에 유용하다.


MLlib
아피치의 스파크 및 하둡용 기계 학습 라이브러리인 MLlib은 속도와 확정이 뛰어난 알고리즘과 유용한 데이터 형식을 지원한다. 하둡 프로젝트이기 때문에 MLib의 주 언어는 자바다. 그러나 파이썬 또한 넘피 라이브러리를 이용해서 MLib을 연결할 수 있으며, 스칼라(Scala) 사용자들도 MLib에 코드를 쓸 수 있다. 하둡 클러스터가 실용적이지 못하다면, 하둡 없이 스파크에 배치할 수 있다. EC2와 Mesos도 마찬가지이다.
또 다른 프로젝트인 MLbase는 MLib에 기반을 두고 있는데, 결과 도출은 좀 더 쉬운 프로젝트다. 코드를 쓰는 대신 SQL을 이용해 쿼리를 처리할 수 있기 때문이다.


H2O
옥스데이터(Oxdata)의 H2O는 이미지 분석보다는 부정행위나 트렌드 분석 등 비즈니스 프로세스에 더 적합한 알고리즘이다. H2O는 HDFX에는 스탠드얼론, 맵리듀스에서는 YARN 기반, 아마존 EC 인스턴스에서는 직접 구현을 할 수 있다. 하둡 전문가라면 자바를 이용해 H2O를 연동할 수 있다. 또한, 파이썬, R, 스칼라를 지원하고, 이들 플랫폼의 라이브러리로 연동을 시킬 수 있다.


클라우데라 오릭스(Cloudera Oryx)
하둡을 대상으로 한 또 다른 기계 학습 프로젝트인 오릭스(Oryx)는 클라우데라 하둡 배포판이다. 클라우데라는 스파크 프로젝트를 이용한 스트리밍 데이터 분석을 강조하는데, 오릭스는 그 덕분에 실시간 스트림 데이터에 배치할 수 있는 기계 학습 알고리즘을 구현할 수 있다. 이는 실시간 스팸 필터나 추천 엔진에 사용된다.
최근에는 오릭스2라는 새로운 버전이 개발되고 있다. 성능을 높이기 위해 스파크 및 Kafka를 사용하며, 해당 구성요소를 한층 느슨한 형태로 작성해 향후 검증을 할 수 있다.


고런(GoLearn)
구글의 고(Go)는 5년밖에 되지 않은 언어이다. 그러나 라이브러리가 풍부해짐에 따라 폭넓게 사용되기 시작하고 있다. 고(Go)를 대상으로 하는 일체형 기계 학습 라이브러리가 없어 개발된 것이 고런(GoLearn)이다. 이를 개발한 스테판 위트워스에 따르면 고런은 ‘간결한 맞춤화’에 목표를 두는데, SciPY 및 R의 패턴을 채택해 라이브러리에 직접 불러와 처리할 수 있다는 점에서 간단하다. 맞춤화는 특정 애플리케이션에서 MIT의 라이선스를 받은 오픈소스, 데이터 구조를 쉽게 확장할 수 있다는 점에 근간하고 있다.
한편, 위트웍스는 쇼군(Shogun) 라이브러리에도 포함된 Vowpal Wabbit 라이브러리용 고 래퍼(Go Wrapper)도 개발했다.


Weka
뉴질랜드 와이카토 대학교(University of Waikato)가 개발한 Weka는 데이터 마이닝에 목적을 둔 자바 기계 학습 알고리즘을 집대성했다. 이 GNU GPLv3-라이선스 라이브러리에는 기능성을 확대할 수 있는 패키지 시스템과 공식, 비공식 패키지가 포함돼 있다. Weka에는 소프트웨어와 사용 기법을 설명한 책도 들어있다. 앞서 개념을 파악하고 싶은 사람들에게 도움이 되는 내용이다.
Weka는 하둡 사용자를 주 대상으로 하고 있지는 않지만, 최신 Weka 버전용 래퍼 덕분에 하둡에서도 이용할 수 있다. 스파크는 지원하지 않고, 맵리듀스만 지원한다. Clojure 사용자 또한 Clj-ml 라이브러리로 Weka를 이용할 수 있다.


CUDA-Convnet
현재 대다수는 GPU가 특정 기능 구현에서는 CPU보다 성능이 앞선다는 사실을 안다. 그렇지만 GPU 가속화 기능이라는 장점을 이용하도록 프로그래밍을 해야 애플리케이션이 해당 기능을 이점으로 활용할 수 있다. CUDA-Convnet는 신경망 애플리케이션을 대상으로 한 기계 학습 라이브러리다. C++에 기반을 두고 있으며, 엔비디아의 CUDA GPU 프로세싱 기술을 이용한다(CUDA 보드에는 Fermi가 있어야 한다). C++가 아닌 파이썬을 사용하고 있다면, 결과물인 신경망을 파이썬 객체로 저장하면 된다. 초기 버전은 더 이상 개발되지 않는데, CUDA-Convnet2 버전으로 다시 탄생했기 때문이다. 여러 GPU와 케플러 GPU의 지원을 받는 것이 특징이다. 유사한 프로젝트인 Vulpes는 F#로 개발됐으며, 통상적으로는 닷넷 프레임워크와 연동된다.


ConvNetJS
ConvNetJS는 이름이 암시하듯, 자바스크립트 기반의 신경망 기계 학습 라이브러리를 제공하는데, 브라우저를 데이터 워크벤치로 사용하게끔 도와준다. Node.js를 이용하는 사람들을 위한 NPM 버전도 있다. 라이브러리는 자바스크립트의 비동기성을 적절히 활용할 수 있도록 설계됐다. 예를 들어, 학습이 완료되면, 실행 콜백을 내보낼 수 있다. 이 라이브러리에는 다양한 데모 예제도 포함돼 있다.

2014년 12월 5일 금요일

유투브에서 음원 추출하기

http://www.itworld.co.kr/news/90777

페그고(Peggo.co)


크롬 - 비디오다운로더

파이어폭스 - 다운로드헬퍼

관심 - 기계 학습


인공지능(Artificial Intelligence)의 새로운 이름이라 해도 무방하다. 기계 학습의 잠재력이 단 시간 내로 구현될 것이라고 과신하지 않는 것이 중요하다. 하지만, 다른 한 편으로는 빅 데이터(Big Data) 분석에서 필수적이며, 머하웃(Mahout) 과 스파크/M립(Spark/MLlib) 같은 오픈소스 프로젝트가 점차 발달하고 있다. 올 해 초 제임스 코빌러스(James Kobielus)가 말했듯이 기계 학습이 상당히 보편화된 측면도 있어, 빅 데이터 부문에도 존재한다고 가정할 수 있다. IBM은 왓슨(Watson) API를 공개하여 이와 같은 아이디어를 주류에 편입시키고 있고, 안드레센(Andreessen)이 지원하는 아다타오(Adatao) 같은 스타트업들은 기존의 풍부한 연산 능력을 적용해 신경 회로망 알고리즘을 부활시키고 있다.

2014년 11월 26일 수요일

일회성 이메일 계정 만들기

10minute Mail : 10분이내만 사용 가능

YOPmail : 한글지원 안됨

Melt Mail : 사용시간을 정할 수 있음

maildrop.cc

guerrillamail 

maildrop 추천

mailinator 추천

[책] C 포인터의 이해와 활용, 리차드 리스, 제이펍, 2013

감상평

  • C 포인터와 관련된 입문/활용/개념 정리도서 끝판왕

Site

Note

  • XV. 함수가 호출되면, Stack frame이 생성되어 program stack에 입력된다.
  • p3. 포인터와 메모리: 전역, 정적, 자동(로컬), 동적
  • p6. 포인터 사용와 관련된 문제
    • - 배열이나 데이터 구조의 경계를 넘는 접근
    • - 소멸한 자동/로컬 변수의 참조
    • - 할당 해제된 힙 메모리의 참조
    • - 아직 할당되지 않은 포인터에 대한 역참조
  • * C 표준 문서 (http://bit.ly/173cDxJ)
  • p9. 포인터 선언은 뒤에서부터 읽음
    • - const int *pci; //상수 정수를 가리키는 포인터 변수 pci
  • * 이진수 0은 C에서 false
  • * size_t는 부호없는 정수 --> 출력시 %zu 지정자 권장 (대안으로는 %u, %lu 지정자 사용 권장)
  • p45. 할당할 바이트 수를 지정할 때 size_t 연산자를 사용하면 애플리케이션 이식성을 높일 수 있음
  • * 두 포인터가 같은 메모리 위치를 참조하는 것: 에일리어싱(aliasing)
  • p69. 댕글링 포인터 다루기: 메모리 해제 후 포인터를 NULL로 설정하라
  • p70. 메모리 누수 탐지 기능
    • - MS(Finding Memory Leaks Using the CRT Library)
    • - GCC Mudflap 라이브러리(bit.ly/YilPI1)
  • p72. 리소스 획득 즉시 초기화: RAIL_VARIABLE 매크로
  • p84. 포인터 반환하기
  • p92. 사용자 정의 free 함수 작성하기
  • p111. 포인터 표기법과 배열
  • p113. 배열과 포인터의 차이점
  • p143. 문자열 선언
    • - 문자열 상수(리터럴)
    • - 문자의 배열
    • - 문자에 대한 포인터
  • p151. 그림5-5. 선언 방식에 따른 문자열의 위치
  • p157. 문자열 연결하기
  • p183. malloc/free 오버헤드 회피하기
  • p211. 초기화되지 않은 포인터 처리하기: assert 함수 사용
  • p218. 유계포인터(Bounded pointers) = 유효한 영역 내에서만 사용이 가능한 포인터
    • - CMBC: Bounded Model Checking for ANSI-C
  • * strlcpy, strlcat는 일부 리눅스에서만 지원
  • * 오라일리, PThreads Programming

2014년 11월 23일 일요일

프로젝트 관리, Redmine

장점: 소프트웨어 개발 프로젝트에 있어,
개발자 및 관리자 모두가 이슈 관리 및 모니터링을
보다 편리하게 수행할 수 있는 기능을 제공한다.

장점2: 오픈 소스

장점3: 사용자 관리 및 이슈 관리 UI가 직관적

장점4: Git과 연동 쉬움

http://opentutorials.org/course/438/2397

[책] Think like a programmer, Anton Spraul, 에이콘, 2014

감상평


  • 만약 c++ 언어로 프로그래밍 입문하게 되는 분이라면 큰 도움이 될 듯

Note


  • p39. 문제의 한 부분에 제약사항이 많이 걸려 있다면, 바로 그 부분이 문제 해결을 시작하기에 가장 좋은 출발점이다.
  • p44.Dwight D. Eisenhower - "계획이 쓸모없다는 사실을 항상 깨닫는다. 하지만 계획은 필수 불가결하다"
  • p47. 문제를 나누면 문제의 난이도를 엄청나게 낮출 수 있다.
  • p135. 역참조(dereferencing) = 포인터가 가리키는 메모리에 접근하는 것
  • p264. 올바른 재사용과 잘못된 재사용: 다른 사람이 일반적인 개념에 대해 설명한 내용을 읽고 이를 기초로 스스로 코드를 작성하거나 스스로 작성할 수 있는 코드를 활용할  때 올바른 재사용..
    • - 잘못된 재사용: 다른 사람 작업을 복제; 본인 능력을 부풀림; 본인의 학습을 방해; 장기적으로 시간 더 많이 소요
  • p309. 규모가 크고 광범위하게 정의됐으며, 제약사항이 별로 없는 문제가 가장 해결하기 어려움
  • p334. 잘 작성된 코드를 연구하고, 이미 친숙한 언어에 관한 새로운 기술 익히기

[책] 프로그래머로 사는 법, 샘 라이트스톤, 2012, 한빛미디어

감상평


  • 책의 의도(프로그래머에 대한 여러 면모를 쉽게 설명해보겠다)에는 공감한다.
  • 그러나 프로그래머 대가와의 인터뷰 내용은 너무 딱딱하거나 생소하며, 책 내용에서 차지하는 비중이 너무 많다는 느낌 만 들게된다.
  • 차라리 편집자가 국내 프로그래머에게 글을 청해 작성된 내용이 오히려 생생한 공감을 불러 일으킨다. 특히, 유영창님의 "어떻게 프로그래머로 살까?" 부분은 적극 일독을 추천함!

Site


  • 책소개 링크: http://book.naver.com/bookdb/book_detail.nhn?bid=7010768

Note


  • p34. 망쳐버린 소프트웨어 프로젝트
    • - 소비자 요구를 제대로 파악하지 못함
    • - 아무도 그런 소프트웨어를 원하지 않음
    • - 수익을 창출하기까지 너무 오래 걸림
  • p35. 소프트웨어의 유용성은 그 소프트웨어를 쓰지 않을 때보다 얼마나 더 빠르고 쉽게 어떤 일을 할 수 있게 해 주는 가에 달려있음
  • p38. 개발자의 고객은 개발자 자신이 아니라는 것 <- '시장'을 고려해서, 일의 시급성 및 중요성을 판단해야 함
  • p67. 추천도서
    • - 영작 : Elements of Style
    • - 수학 : How to solve it
    • - 실제 문제: The Woolsey Papers
  • p275. 이미 일정이 늦어졌다면 어떻게 해야 하나
    • - 기능 줄이기
    • - 기능 쪼개기
    • - 재협상
  • p292. 일과 삶의 균형: 희망하는 상태로부터 거꾸로 따져보기
    • - 일, 잠, 여행, 가족/여가, 가사/위생
  • p479. 피터 드러커의 매지니먼트 : 매니저는 '조직의 성과에 책임을 지는 자'나 '상사'가 아니라 '한 분야의 전문가로서 조직에 공헌하는 사람'
  • p495. 유학생이 미국 SW 회사에 구직하는 사례
    • - 인터뷰코딩문제: careercup.com
    • - <프로그래밍 면접, 이렇게 준비한다>, 2007, 한빛미디어
  • p518. Redmine 활용사례
  • p527. 프로그래머의 공부
    • - Founders at Work
    • - Coders at Work
    • - Making things Happen
    • - Rework, 똑바로 일하라, 21세기북스, 2011
    • - Techmeme
    • - Hacker News
    • - Reddit programming
    • - 블로터닷넷
  • p578. 프로그래머 고수되는 법
    • - 하수: 그럴 리가 없는데요?
    • - 고수: 흠 일단 제 코드를 살펴보겠습니다. 제가 뭔가 잘못했나 봅니다.
  • p580. 프로젝트의 데모는 쇼다. : 데모 = 지금까지 진행된 과정의 결과물 + 고생한 과정
    • --> 파워포인트로 프로그램 내부가 동작하는 모습이나 아키텍처를 그럴듯하게 보이도록 애니메이션 기법을 동원하여 비주얼학 보여주고, 적당한 효과음이나 음악을 첨부하거나 동영상을 이용하여 표현할 필요가 있음
    • --> 프로그램의 소스 및 설계 문서들을 종이로 출력 / 바인더 작성
  • p583. 제 발 저린 프로그래머들
    • - 고객들에게 고해성사 좀 하지 말고, 자신의 제품에 자신감을 가지고 장점에 집중하여 어필하기. 자식자랑 하듯이.

IoT World Forum

관련 글: http://www.iotjournal.com/articles/view?12323/2

CISCO가 올해 2년차 개최하는 포럼
https://www.iotwf.com/

- 전세계의 주요 IoT 프로젝트를 지도 상에 표시한 interactive map이 있음
https://www.iotwf.com/iotwf2014/deployment_map

- 발표자료 pdf 공개되어 있음

2014년 11월 20일 목요일

[책] The Art of Readable Code (읽기 좋은 코드가 좋은 코드다), Dustin Boswell, 한빛미디어, 2012

Summary


  • 감상평1: 2012년까지 발간된 출판물 중에서 실용적인 코딩 가이드를 가장 이해하기 쉽게 설명했다고 생각함.
  • 감상평2: 특정 개발 언어에 종속적이지 않으면서도 구체적인 예시와, 실용적인 조언이 풍부함
  • 감상평3: 테스트 코드 작성에 대해서도 실용적인 방안이 제시되었음
  • 감상평4: 좋은 책의 소개
  • # 코드 관련 도서
    • - Code Complete, Steve McConnel, 2004
    • - Refactoring, Martin Fowler et al, 1999
    • - The Practice of Programming, Brian Kernighan, 1999
    • - The Pragmatic Programmer, Andrew Hunt, 1999
    • - Clean code, Robert C. Martin, 2008
  • # 다양한 프로그래밍 주제
    • - JavaScript, Douglas Crockford, 2008
    • - Effective Java, 2008
    • - Design Patterns, Erich Gamma, 1994
    • - Programming Pearls, Jon Bentley, 1999
    • - High Performance Web Sites, Steve Souders, 2007
  • # 역사적 사례
    • - Writing Solid Code, Steve Maguire, 1993
    • - Smalltalk Best Practice Patterns, Kent Beck, 1996
    • - The Elements of Programming Style, Brian Kernighan, 1978
    • - Literate Programming, Donald E. Knuth, 1992
  • 감상평5. 생생하면서도 재치있고 압축적인 삽화의 심오함

Note


  • p23. 코드는 다른 사람이 그것을 이해하는 데 들이는 시간을 최소화하는 방식으로 작성되어야 한다.
  • p48. 변수명에 중요한 세부 정보를 덧붙여라. 사용범위가 넓으면 긴 이름을 사용하라.
  • p73. 일관성 있는 스타일은 올바른 스타일보다 더 중요하다.
  • p179. 작성한 코드가 읽기 어렵다면, 일단 수행하는 작업을 모두 나열하라. 일부는 분리할 수 '도' 있다.
  • p192. 프로그래머가 배워야 하는 가장 중요한 기술은 언제 코딩을 해야 하는 지 아는 것이다.
  • p195. 코드베이스를 최대한 작고 가볍게 유지하는 것
    • - 일반적인 유틸리티를 많이 생성하여 중복된 코드를 제거
    • - 사용하지 않는 코드 혹은 필요 없는 기능을 제거
    • - 서로 분절된 하위 프로젝트로 구성
  • * 자기 주변에 있는 라이브러리에 친숙해지기
  • p216. 테스트함수명은 실질적으로 하나의 설명문으로 간주. 길어도 됨
  • p218. 테스트에 친숙한 개발
    • - 코드를 설계하다가 테스트가 어렵겠다는 생각이 들때는, 설계 자체를 전면적으로 다시 생각해 볼 필요가 있음
  • p220. 지나친 테스트에 대한 경고

cunit

우분투 설치 방법
$ sudo apt-get install libcunit1-dev libcunit1 libcunit1-doc


2014년 11월 16일 일요일

[책] 성공으로 이끄는 팀 개발 실천 기술, 이케다 타카후미, 제이펍, 2014

Site

  • 책 소개 링크: http://book.naver.com/bookdb/book_detail.nhn?bid=8199825

Note

  • 티켓 관리 시스템: Issue Tracking System / Bug Tracking System
    • Trac(파이썬 기반; 프로그래머 버그 관리 적합)
    • Redmine(Trac을 대체; UI 편리)
    • BugZilla(과거에 많이 활용됨)
    • JIRA(아틀라시안, 유료)
    • YouTRACK(유료; 10명까지 무료)
    • Backlog(10명까지 무료)
    • GitHub
  • 버전 관리 시스템: Version Control System
    • Git
  • CI: Continuous Integration
    • Jenkins, Travis
  • p38. 소프트웨어 공학에서 리팩토링은 주로 '결과의 변경없이 코드 구조를 재조정함'을 뜻함 -> 결과가 바뀌지 않는 것을 보장하는 테스트 코드를 만들어야 함
  • p45. 이상적인 개발 흐름 예
    • - 버전관리, 티켓관리, CI, 스테이징(통합테스트), 상용 환경
  • Git을 위한 GUI: tortoiseGit
  • 버전 관리 시스템에 맞는 텍스트 파일 작성 도구 
    • Markdown, Textile, reStructuredText
  • p79. git을 사용한 효율적인 병행 개발
    • Git 브랜치/태그 사용법 간단히 정리되어 있음
  • * 웹 애플리케이션 테스트 도구: Selenuim (p316)
    • - Web Browser automation (www.seleniumhq.org)
  • p205. Jenkins를 사용한 CI 실행
    • - 연동가능한 정적도구: Checkstyle, PMD, Findbugs
  • p310. 테스트 사분면

[책] Clean Code, 로버트 C. 마틴, 인사이트, 2013

Summary

  • 저자가 스스로 서술한 대로, '열심히 독파해야 하는 책'이라고 동의함

Site


Note

  • 서문: ... 스크럼과 애자일에 관심이 모아진 현재는 '제품'을 신속하게 시장에 출시하는 방법론을 강조한다. ... 스크럼은 이런 일본 자동차 제조업, 즉 생산 라인의 세계에서 많은 영향을 받았다. ... 하지만 심지어 자동차 업계도 대다수 활동은 제조가 아니라 유지보수다. ... 소프트웨어는 80% 이상이 소위 "유지보수"다.
  • 서문: TPM(Total Productive Management)에서의 5S 원칙 --> 이후 Lean의 토대가 됨
    • - 정리(Seiri) / 조직 / 정렬(Sort)
    • - 정돈(Seiton) / 단정함 / 체계화
    • - 청소(Seiso) / 정리 / 광내기
    • - 청결(Seiketsu) / 표준화
    • - 생활화(Shutsuke) / 규율
  • p4. Leblanc's Law - 나중은 결코 오지 않는다.
  • p7. 기한을 맞추는 유일한 방법은, 언제나 코드를 최대한 깨끗하게 유지하는 습관
  • p8. Literate Programming - 인간이 읽기 좋은 코드를 작성하라
  • p9. 깨끗한 코드 = '보기에 즐거운' 코드
  • p22. "의도가 분명하게 이름을 지으라" : 변수, 함수, 클래스 이름
  • p44. 함수는 한 가지를 해야하 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
  • p49. 서술적인 이름을 사용하라
  • p54. 부수 효과를 일으키지 마라. -> 함수는 하나의 작업만 하도록 구성할 것
  • p60. 반복하지 마라. -> 코드의 중복을 없애기
  • p61. 소프트웨어를 짜는 행위는 여느 글짓기와 비슷하다.
  • [KP78] Kernighan and Plaugher, The Elements of Programming Style, 2d. ed., 1978
  • p110. ... 선언문과 할당문을 별도로 정렬하지 않는다. 정렬하지 않으면 오히려 중대한 결합을 찾기 쉽다. (코드 내부의) 선언문 정렬이 필요할 정도로 목록이 길다면, 문제는 목록의 길이지 정렬 부족이 아니다.
  • p119. 자료 추상화 -> 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. ... 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.
  • p155. TDD 법칙 세가지
    • 1) 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
    • 2) 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
    • 3) 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
  • p157. 테스트는 유연성, 유지보수성, 재사용성을 제공한다.
  • p164. (가능하다면) 테스트 당 assert 하나
    • - given-when-then 관례를 사용하면 테스트 코드를 읽기는 쉽지만, 중복되는 테스트 코드가 많아짐
  • p166. 테스트 당 개념 하나씩 테스트하는 것이 바람직
  • p167. F.I.R.S.T
    • - Fast, Independent, Repeatable, Self-Validating, Timely
  • p221. 표현하라.
    • 1) 좋은 이름을 선택한다.
    • 2) 함수와 클래스 크기를 가능한 줄인다.
    • 3) 표준 명칭을 사용한다.
    • 4) 단위 테스트 케이스를 꼼꼼히 작성한다.
    • * 나중에 읽을 사람을 고려해 조금이라도 읽기 쉽게 만들려고 노력한다.
  • p321. 나쁜 일정은 다시 짜면 된다. 나쁜 요구사항은 다시 정의하면 된다. 나쁜 팀 역학은 복구하면 된다. ... 나쁜 코드도 개선할 수 있다. 단, 비용이 엄청나게 많이 든다.

2014년 11월 10일 월요일

몇가지 개발 언어 (Programming Languages)

링크: 프로그래밍 언어

Erlang: 실시간 시스템을 위한 함수형 프로그래밍
- Ericsson 연구실에서 개발

Go: 단순하고 역동적
- Google, 2009년
- malloc 호출을 다룰 필요가 없는 정적 형식 지정 언어

Groovy: 자바를 위한 스크립팅
- 자바와 긴밀하게 통합되는 자체적인 동적 언어
- 모든 요소가 JVM에서 실행됨

OCaml: 정교한 형식 계층. 대수학에 관한 처리

CoffeeScript: 깔끔하고 단순한 자바

Scala: JVM의 함수형 프로그래밍

Dart: 자바스크립트 없는 자바스크립트

하스켈: 순수하고 단순한 함수형 프로그래밍

Julia: 파이썬에 빠른 속도 부여


*NOTE (2018.11.04): 4년이 지난 2018년 시점에서는 Python, R, Java, Scala, Go 가 대세.

[책] 프로그래머 철학을 만나다, 유석문, 로드북, 2014

Reference


Note

  • 개인느낌: 전작인 <프로그래머로 산다는 것>에서 프로그래머라는 직업에 대해 동질감을 많이 느낄 수 있었던 반면, 본 저에서는 스스로 자존감/자신감을 얻기 위한 생각들을 만나볼 수 있음. 특히 화를 다스리는 철학은 현대를 살아가는 모두에게 필요함.
  • P.42 문제가 발생하면 그 문제를 책임질 사람을 찾는 것이 인간의 본성이며, 이 구조에서 소프트웨어 개발자는 최약자일 수밖에 없다.
  • P.43 모든 질책은 그것이 과녁에 적중하는 만큼만 피해를 줄 수 있다. 자신이 어떤 질책을 받을 사람이 아니라는 사실을 알고 있는 사람은 자신만만하게 그런 질책을 경멸할 수 있으며 또 실제로 그렇게 한다 - 쇼펜하우어
  • P.47 잘못된 선택을 하게 될까 두려워하면, 아무런 행동도 하지 않은 것을 후회하게 된다. 무엇인가 선택하고 행동하는 기쁨을 누리고 혹시라도 실패가 발생하면 직시하고 받아들이고 발전하면 된다.
  • P.64. 현재주의(Presentism): 사람은 과거를 회상할 때 과거 기억의 빈 공간을 현재의 경험을 이용해 채우는 경향성이 있어 과거의 사실을 이야기할 땐 모두가 뛰어난 예측가였던 것으로 착각하게 된다는 것이다.
  • P.67 창의성은 어느 순간 뛰어난 사람이 생각해 내는 묘수가 아니다. 여러 다양한 의견이 차별 받지 않고 논의되는 과정에서 합리성을 바탕으로 선택되는 것이다. ... 창의력과 문제 해결능력은 개발자의 중심 철학을 위해 필요한 기술일 뿐 개발자가 추구하는 궁극의 철학이 아니다.
  • P.70 소프트웨어 개발자가 추구해야 할 철학의 핵심은 '고객'이다. 고객의 만족을 추구한다는 점에서 소프트웨어 개발이 과학과 구별된다. ... 소프트웨어 개발은 개발자 모두가 싫어하는 형편없는 기술을 사용했더라도 고객이 만족하면 그것이 옳은 해답이다.
  • P.78 개인 코드리뷰시 확인할 항목
    • - 의미 있는 변수/함수 이름
    • - 하드코딩 데이터
    • - 함수의 통일성
    • - 통일된 데이터 형식 사용
    • - 복잡도
    • - 오류 처리 방식 통일
    • - 자원 해제 확인
    • - 코딩 컨벤션 준수 확인
  • P.95 레온 페스팅거 - "인간은 합리적인 존재가 아니라 합리화하는 존재". 인지부조화 이론: 인간은 양립 뷸가능한 생각으로 심리적 대립이 발생한 경우 자신의 믿음에 근거해 행동을 바꾸기보다 행동에 따라 믿음을 변경한다
  • P.221 프로세스가 문제 해결의 유일한 정답이 아님. 그럼에도 프로세스를 선호하는 이유는 그것이 제일 쉬운 해결책이라는 오해와 책임을 면하려는 의도가 결합된 결과임. ... 프로세스를 통해 원하는 효과를 얻으려면 운영자가 올바른 판단을 할 수 있어야 함
  • P.227 http://goo.gl/JcaUNb

2014년 11월 7일 금요일

[책] 프로그래머로 산다는 것, 유석문 외, 로드북, 2012

Summary

  • 저자: 유석문, 황상철, 하호진, 이상민, 김성박

Site


Note

  • p.17 소프트웨어 개발의 기초 = "자신이 작성한 코드가 동작함을 보장하는 능력"
  • p.30 요구사항과 테스트는 서로 분리할 수 없는 관계
  • p.45 적절한 휴식의 중요성: Slack, 톰 마르코
  • p.49 작은 단계부터 쌓아가는 신뢰가 중요
  • p.54 정답이 없는 세계에서 완벽을 추구하는 것은 신중한 것이 아니라 단지 느릴 뿐.
    • - 정답을 찾기보다는 현재 가용한 시간과 자원을 활용하여 선택할 수 있어야 함
  • p.63 케네스 토마스, 열정과 몰입의 방법
  • p.79 회의는 필요악이 아닌 그냥 악
    • - 의사 결정권자가 없는 회의는 소집하지 않기. 소집했더라도 바로 해산
    • - 관련성 없는 회의에 불려간 사람은 언제라도 나갈 수 있도록
  • p.85 스스로 안주하지 않게 자극 받고 정보 얻기
    • - 하고 싶은 일, 발전 가능성, 급여
  • p.140 실용주의 프로그래머 블로그 (황상철)
    • http://pragmaticstory.com/
  • p.160 미물 (하호진)
  • p.165 지식 채널의 다양화
    • - 관련 사이트 참고
  • p.178 기획자와 프로그래머의 생각 차이
    • - Gartner Mindset difference
  • p.181 행복한 프로그래머
    • - 생활 속의 코딩
  • p.188 온라인 재택 창업 시스템
  • p.190 작지만 강한 팀
  • p.265 스스로를 위한 프로그램 만들기

[책] 거꾸로 배우는 소프트웨어 개발, 이호종, 로드북, 2011

Site

Note

  • p.38 개발자를 위한 3종 세트 : 소스 코드 관리, 개발 프레임워크, 단위 테스트
  • p.90 개발 조직 관리 관련 도서 추천
    • - SI Project 전문가로 가는 길, 영진닷컴, 2010
    • - 익스트림 프로그래밍 2판, 인사이트, 2006
    • - 글로벌 소프트웨어를 꿈꾸다, 김익환, 한빛미디어, 2010
    • - 소프트웨어 개발의 모든 것, 김익환, 페가수스, 2010
  • p.98 이슈 트래커
  • p.113 SCRUM
    • - 스프린트 계획,
    • - 일일 스크럼(어제 한 일, 오늘 할 일, 장애요소),
    • - 스프린트 리뷰,
    • - 스프린트 회고
  • p.146 협업이 항상 좋은 건 아니다. Morten T. Hansen
    • - 이 프로젝트를 부서 간의 협업 프로젝트로 추진한다면 가치가 창출될 것인가, 아니면 파괴될 것인가
  • p.151 네이버의 Hudson CI 구축/설정 사례
  • p.215 프로그램 오류에 숨겨진 IT 조직 이야기, 최영석
    • - Faith Driven Development
    • - Test Driven Development

2014년 11월 4일 화요일

백색소음 링크 (Links for getting 'White Noises')

물(비) 내리는 소리 (Rainy)


카페 분위기 (Caffe)


백색소음 모음


명상

When you need PNG images and cliparts for web design

Reference: PNG imgages and cliparts for design

  • Many free PNG images
  • Categories: Vegetables, Cars, Animals, Fruit, Food, Nature, Flowers, Clothing, Objects, People, Fantasy, Technic, Sport, Insects, Tableware, Electronics, Transport, Weapons

2014년 11월 3일 월요일

GNU C 라이브러리


[책] Code Complete, 2nd Ed. Steve McConnell, 2005

Summary

  • 부제: 소프트웨어 구현에 대한 실무서
  • 주요내용: SW 구현 및 설계 전반에 대한 실용적인 생각들을 상세하고 쉽게 제시하고 있음

Reference

Note

  • - 2장. 소프트웨어 개발의 이해를 돕기 위한 비유: 실생활 및 이론적인 비유를 통한 모델 설명의 중요성
    •   . Thomas Kuhn, the structure of scientific revolutions, 3rd ed. 1996: 과학에서 비유와 모델, 그리고 패러다임이 뜨고 지는 예제들이 실려 있다고 함
  • - 3.3장: 문제 정의는 전체적인 프로그래밍 프로세스를 위한 기초 공사임.
    •   . 활을 쏘기 전에 무엇을 조준하고 있는 지 알아야 함
    •   . 요구사항은 물과 같아서, 얼었을 때 그 위에 만들기가 쉽다.
    •   . 만약 요구사항이 충분하지 않다면, 작업을 멈추고 백업한 다음, 요구사항을 먼저 올바르게 수정해야 한다. 서울에서 부산으로 차를 타고 이동할 때, 인천으로 향하는 표지판을 본다면, 잠시 멈춰서 지도를 살펴보는 것이 시간 낭비일까?
  • - 7.3장: 좋은 루틴 이름
  • - 7.4장: 루틴의 길이
    •   . 200줄 이상 긴 루틴에서는 이해하기 쉽지 않고, 오류 발생률 높다.
  • -10.3장: 변수의 초기화에 대한 지침
  • -10.4장: 범위
    •   . 변수에 대한 참조를 지역화하라
    •   . 변수의 수명을 가능한 한 짧게 유지하라.
  • -12.4장: 문자와 문자열
    •   . C 언어에서의 문자열: 문자열 포인터와 문자 배열의 차이점 이해
    •   . 문자 배열은 선언할 때 0으로 초기화 (예: char exam[MAX_LENGTH+10 = {0};
  • - 13.2장: 포인터 문제를 피하기 위한 커버(Cover) 루틴 작성 (예: SAFE_DELETE)
  • - 16.2장: 루프의 제어
    •   . 루프가 시작하기 바로 전에 초기화 코드를 입력
  • -19.1장: 불린 표현식
    •   . 숫자는 0에 명시적으로 비교하라
    •   . C 언어에서는 문자를 널 종결자('\0')에 명시적으로 비교하라
    •   . 포인터를 NULL에 비교하라
  • - 20장. 소프트웨어 품질
    •   . IEEE의 SW 관련 표준: 730, 1061, 1028, 1008, 829
  • -24.2장: 리팩토링
    •   . '팩토링' - 프로그램을 가능한 한 구성 요소들로 분해하는 것 (Yourdon, Constantine, 1979)
    •   . '리팩토링' - 소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부 구졸르 변경한 것 (Martin Fowler, 1999)
  • -32.5장: 주석
    •   . 단락 주석을 작성할 때, 방법보다는 그 이유를 집중적으로 다루어라
  • - 32.6장: IEEE 표준
    •   . 1016: Recommended Practice for Software Design Descriptions
    •   . 1063: Standard for Software User Documentation
    •   . 1061: Standard for a Software Quality Metrics Methodology
  • - 35.4장: 소프트웨어 개발자의 독서 계획

리눅스 Tip (with Linux Commands)

find

  • 파일 찾기 
    • $ find 파일찾을위치 -name 파일명
    • 예: $ find ./ -name aaa.txt

grep

  • 특정 문자열를 담고 있는 파일을 검색
    • $ grep -r 찾을문자열 대상위치
    • 예: $ grep -r "aaa" ./*
  • 해당 파일에서 특정 단어가 몇번 사용되었는 지 count
    • $ grep -c 단어 filename.csv
  • grep을 colorful하게 설정
    • $ alias grep="grep --color=auto"

nautilus

  • nautilus 설치
    • $ sudo apt-get install nautilus-open-terminal

iconv

  • 텍스트 파일의 인코딩 변경하기.
    • $ iconv -f ISO-8859-1 -t UTF-8 input.txt output.txt
  • 모든 인코딩 목록 조회
    • $ iconv -l
  • convert 할 수 없는 문자는 silent하게 discard
    • $ iconv -c

head

  • 기본 출력은 10줄
  • 3줄만 출력하고 싶다면
    • $ head -n 3 filename.txt
  • 특정 개수의 bytes만 출력하고 싶다면
    • $ head -c 4 filename.txt
  • 텍스트 일부분의 comma를 pipe로 변경하여 출력해보고 싶다면,
    • $ head mydata.csv | sed 's/,/|/g'

tr

  • 파일 내의 tab을 comma로 변환하기
    • $ cat tab_delimited.txt | tr "\\t" "," > comma_delimited.csv
  • 파일 내의 대문자를 소문자로 변환하기 (basic regex)
    • cat filename.csv | tr '[A-Z]' '[a-z]'
  • 파일 내의 특정 문자 클래스를 translate 하기
    • cat README.md | tr "[:punct:][:space:]" "\n" | tr "[:upper:]" "[:lower:]" | grep . | sort | uniq -c | sort -nr
    • [:alnum:] all letters and digits
    • [:alpha:] all letters
    • [:blank:] all horizontal whitespace
    • [:cntrl:] all control characters
    • [:digit:] all digits
    • [:graph:] all printable characters, not including space
    • [:lower:] all lower case letters
    • [:print:] all printable characters, including space
    • [:punct:] all punctuation characters
    • [:space:] all horizontal or vertical whitespace
    • [:upper:] all upper case letters
    • [:xdigit:] all hexadecimal digits

wc

  • word count
  • 파일의 라인수 세기
    • $ wc -l myfile.txt
  • 파일 내의 단어 개수
    • $ wc -w 
  • 파일 내의 문자 개수
    • $ wc -m

split

  • 파일을 일정 라인별로 자르기
    • $ split -l 500 filename.csv new_filename_
      • 더불어 특정 디렉토리 내의 모든 파일에 확장자 붙이기
        • $ find . -type f -exec mv '{}' '{}'.csv \;

sed

  • line-by-line으로 작동하는 스트림 에디터.
    • (파일 끝까지 변경) s/old/new/g
    • (파일에서 맨처음 발견된 한번만 변경) s/old/new

awk

  • 1977년 Brian Kernighan.
  • 텍스트 처리 및 수치 연산, 문자연산에 활용 가능.
  • 튜토리얼1

[책] 리눅스 시스템 프로그래밍, Robert Love

참고

Note

  • C 프로그래밍 도서 추천
    • K&R, The C Programming Language (2nd Ed), Prentice Hall, 1988
  • 주요내용
    • - 파일/버퍼 입출력
    • - 프로세스 관리
    • - 파일/디렉터리 관리
    • - 메모리 관리
    • - 시그널/시간
  • 리눅스 프로그래밍에 대한 입문서로 평가됨
    • - 각 이슈별 주요 함수에 대한 설명 및 간단한 예제를 잘 달아주었음
  • Table 1-2 에러 코드 일람표
    • 참조링크: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html#Error-Codes

2014년 10월 27일 월요일

Ubuntu 14.04 LTS 설정하기 (How to configure Ubuntu 14.04 LTS)

c 함수에서 2차원 배열을 매개변수로 받기 (How to take a two-dimensional array as a parameter in c)




주요 c 헤더파일 및 함수 목록

c언어 헤더파일 및 함수들을 정리해본다.

문자열변환

[non-standard]
itoa
형식 : char *itoa(int value, char *string, int radix)
설명 : 정수형 숫자를 문자열로 변환.
대안 1: sprintf(target_string,"%d",source_int)
대안 2: snprintf(target_string, size_of_target_string_in_bytes, "%d", source_int)

strtod
형식 : double strtod(char *string, char *endptr)
설명 : 문자열을 부동소수점 값(double)으로 변환. 실패한 경우 0을 반환. 변환할 수 없는 문자를 만난 경우, 읽기를 중단.

strtol
형식 : long strtol(char *string, char *endptr, int radix)
설명 : 문자열을 (long integer)형 숫자로 변환. 변환할 수 없는 문자열인 경우 0을 반환.

strtoul
형식 : unsigned long strtoul(char *string, char *endptr, int radix)
설명 : 문자열을 (unsigned long)형의 숫자로 변환. 변환할 수 없는 문자열인 경우 0을 반환.

atof
형식 : double atof(char *string)
설명 : 문자열을 부동소수점 값(double)으로 반환. 부동소수점으로 변환할 수 없는 문자열인 경우 0을 반환.

atoi
형식 : int atoi(char *string)
설명 : 문자열을 정수 값(int)으로 변환. 변환할 수 없는 경우에는 0을 반환.

atol
형식 : int atol(char *string)
설명 : 문자열을 (long integer)값으로 변환. 변환할 수 없는 경우에는 0을 반환.

abort : 프로세스 강제적 중단

abs : int형 데이터의 절대값

atexit : 프로그램 종료시점에서 함수 실행

bsearch : 바이너리 탐색

div : 나눗셈과 나머지 계산

exit : 처리종료

getenv : 환경 변수값 취득

labs : long형 데이터의 절대값

ldiv : long형 데이터의 나눗셈과 나머지를 계산

rand : 정수의 난수 발생(랜덤값 출력)

srand : 난수 발생의 계열을 변경함

qsort : 퀵 소트

system : OS 명령을 실행

메모리 조작

calloc
형식 : void *calloc(size_t num_elem, size_t elem_size)
설명 : 배열을 할당하고 모든 원소를 0으로 초기화하는 함수(배열을 위한 메모리 확보)

free
형식 : void free(void *mem_address)
설명 : 할당된 메모리 블록을 되돌려 줌(메모리 동적할당 해제)

malloc
형식 : void *malloc(size_t num_bytes)
설명 : 메모리 블록을 할당(메모리 동적할당선언)

realloc
형식 : 메모리 블록을 재 할당(메모리 블록 재확보)


디렉토리 조작

chdir
형식 : int chdir(char *path)
설명 : 현재 디렉토리를 주어진 경로로 바꿈

getcwd
형식 : char *getcwd(char *path, int numchars)
설명 : 현재의 작업 디렉토리의 이름을 반환

mkdir
형식 : int mkdir(char *path)
설명 ; 주어진 경로를 사용하여 디렉토리를 만드는 함수

rmdir
형식 : int rmdir(char *path)
설명 : 주어진 경로의 디렉토리를 삭제하는 함수


파일 조작 함수


#include<stdio.h>

chmod
형식 : int chmod(char *path, int pmode)
설명 : 파일의 permission을 바꾸는 함수

fstat
형식 : int fstat(int handle, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

remove
형식 : int remove(char *path)
설명 : 파일을 삭제하는 함수

rename
형식 : int rename(char *oldname, char *newname)
설명 : 파일의 이름을 바꾸는 함수

stat
형식 : int stat(char *path, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

umask
형식 : unsigned umask(unsigned pmode)
설명 : 파일의ㅣ permission을 mask시키는 함수

Stream 입출력 함수

#include <stdio.h>

clearerr
형식 : void clearerr(FILE *file_pointer)
설명 : stream의 에러 지시자를 지우는 함수(지정한 파일의 에러그룹과 EOF 그룹을 0으로 한다)

fclose
형식 : int fclose(FILE *file_pointer)
설명 : 파일을 닫는 함수, 정상적으로 수행되면 0을 에러가 발생되면 EOF을 반환한다.

feof
형식 : int feof(FILE *file_pointer)
설명 : 파일의 끝을 검사하는 함수, 지정된 파일이 EOF이면 0이외의 값을 반환한다.

ferror
형식 : int ferror(FILE *file_pointer)
설명 : 파일의 입출력 동안 에러가 발생되었는지를 검사하는 함수, 에러가 있으면 0이외의 값을 반환한다.
fflush
형식 : int fflush(FILE *file_pointer)
설명 : 버퍼의 내용을 파일에 쓰는 함수, 정상적으로 수행이 끝나면 0을 반환하고 그 이외에는 EOF를 반환한다.

fgetc
형식 : int fgetc(FILE *file_pointer)
설명 : stream으로부터 한 문자를 가져오는 함수, 에러 발생이나 파일의 끝인 경우에는 EOF를 반환한다.

fgetpos
형식 : int fgetpos(FILE *file_pointer, fpos_t current_pos)
설명 : stream에서 현재 위치를 가져오는 함수(파일 포인터의 위치정보를 가져옴)

fgets
형식 : char *fgets(char *string, int maxchar, FILE *file_pointer)
설명 : 파일에서 문자열을(입력) 읽는 함수, 읽어들이는 단위는 EOF나 \n을 만나거나 n-1개의 문자 길이 만큼이다. 실패한 경우 NULL을 반환한다.

fopen
형식 : FILE *fopen(char *filename, char *access_mode)
설명 : 파일을 열기 위한 함수, 에러가 발생되면 NULL을 반환한다.

fprintf
형식 : int fprintf(FILE *file_pointer, char *format_string, args)
설명 : 파일에 주어진 형식으로 데이터를 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다. 만약 에러가 발생되면 EOF를 반환한다.(파일에 서식을 사용하여 출력)

fputc
형식 : int fputc(int c, FILE *file_pointer)
설명 : 한문자를 stream에 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다.
       에러가 발생되면 EOF를 반환한다.
fputchar
형식 : int fputchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수

fputs
형식 : int fputs(char *string, FILE *file_pointer)
설명 : 파일에 문자열을 stream에 쓰기 위한 함수, 에러가 발생되면 EOF를 반환한다.

fread
형식 : size_t fread(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : stream으로부터 unformatted data를 buffer에 쓰기 위한 함수, 파일에서 읽어들인 블록의 수를 반환한다.

freopen
형식 : FILE *freopen(char *filename, char *access mode, FILE *file_pointer)
설명 : 파일 포인터를 다른 파일에 재 할당하기 위한 함수( 파일 다시 열기)

fscanf
형식 : int fscaf(FILE *file_pointer, char *format string, args)
설명 : stream으로부터 formatted input을 읽기 위한 함수, stream파일에서 형식대로 읽혀진 데이터 수를 반환한다. format의 형식은 scanf()와 같다.(파일에서 서식을 사용하여 입력)

fseek
형식 : int fseek(FILE *file_pointer, long offset, int origin)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수, 정상적으로 수행했을 경우 0을반환 (파일 포인터를 이동)

fsetpos
형식 : int fsetpos(FILE *file_pointer, fpos_t *current pos)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수(fsetpos 불러들인 정보로 포인터를 설정)

ftell
형식 : long ftell(FILE *file_pointer)
설명 : 파일에서의 현재 위치를 가져오는 함수 에러가 발생되면 -1을 반환한다.(현제 파일 포인터의 위치를 되돌림)

fwrite
형식 : size_t fwrite(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : 버퍼에 있는 unformatted data를 stream에 쓰기 위한 함수(파일에 블록 쓰기)

getc
형식 : int getc(FILE *file_pointer)
설명 : 문자를 stream으로부터 읽기 위한 함수(파일에 한문자 입력 매크로형식)

getchar
형식 : int getchar(void)
설명 : srdin으로부터 문자를 읽기 위한 함수(한 문자 입력)

gets
형식 : char *gets(char *buffer)
설명 : srdin으로부터 라인을 버퍼로 읽는 함수(문자열 입력)

printf
형식 : int printf(int c, FILE *file_pointer)
설명 : formatted output을 stdout에 쓰는 함수(서식을 사용하여 출력)

putc
형식 : int putc(int c, FILE *file_pointer)
설명 : 문자를 steam에 쓰기 위한 함수(파일에 한문자 출력 매크로정의)

putchar
형식 : int putchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수(한문자 출력)

puts
형식 : int puts(char *string)
설명 : 문자열을 stdout에 쓰기 위한 함수(문자열 출력)

rewind
형식 : void rewind(FILE *file_pointer)
설명 : 파일을 rewind하기 위한 함수(파일의 포인터를 처음으로 이동)

scanf
형식 : int scanf(char *format_string, args)
설명 : stdin으로부터 formatted input을 읽는 함수(서식을 사용한 입력)

setbuf
형식 : void setbuf(FILE *file_pointer, char *buffer)
설명 : stream을 위해 새로운 버퍼를 지정하는 함수 (버퍼링 제어)

setvbuf
형식 : int setvbuf(FILE *file_pointer, char *buffer, int buf_type, size_t buf_size)
설명 : 새로운 버퍼를 지정하고 제어하는 함수 (버퍼링 제어)

sprintf
형식 : int sprintf(char *string, char *format_string, args)
설명 : formatted output을 문자열로 쓰는 함수 (서식을 사용하여 데이터 문자열 변수에 쓴다)

sscanf
형식 : int sscanf(char *buffer, char *format_string, args)
설명 : 문자열로부터 formatted input을 읽는 함수 (서식을 사용하여 데이터 문자열 변수에 불러온다)

tmpfile
형식 : FILE *tmpfile(void)
설명 : temporary 파일의 이름을 가져오기 위한 함수(임시 파일 작성)

tmpnam
형식 : char *tmpnam(char *file_name)
설명 : temporary 파일의 이름을 가져오기 위한 함수(충돌하지 않는 파일명 생성)

ungetc
형식 : int ungetc(int c, FILE *file_pointer)
설명 : 문자를 stream의 버퍼에 되돌려 주는 함수( 파일에대한 문자 리텬)

Low level 입출력 함수

#include <io.h>

close
형식 : int close(int handle)
설명 : unbuffered I/O를 위해 열어 놓은 파일을 닫기 위한 파일, 정상적으로 수행되었을 경우 0을 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.

creat
형식 : int creat(char *filename, int pmode)
설명 : 주어진 permission을 갖는 새로운 파일을 생성하기 위한 파일, 에러가 발생되었을 경우에는 -1을 반환한다.

eof
형식 : int eof(int handle)
설명 : 파일의 끝을 검사하는 파일, 지정된 파일의 현재 위치가 파일의 끝이면 1을 반환하고 그렇지 않을 경우에는 0을 반환한다.

lseek
형식 : long lseek(int handle, long offset, int orgin)
설명 : 파일의 주어진 위치로 이동하는 함수

open
형식 : int open(char *filename, int oflag, unsigned pmode)
설명 : low-level I/O를 위해 파일을 여는 함수

read
형식 : int read(int handle, char *buffer, unsigned length)
설명 : 파일로부터 바이너리 데이터를 버퍼로 읽는 함수, 읽은 문자의 바이트 수를 반환한다. 파일의 끝일 경우에는 EOF를 반환한다. 에러가 발생되면 -1을 반환한다.

write
형식 : int write(int handle, char *buffer, unsigned count)
설명 : 버퍼에 있는 바이너리 데이터를 파일에 쓰는 함수, 정상적으로 수행되었을 경우에는 쓴 문자의 바이트 수를 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.


Mathematics 수학 처리

#intclude <math.h>

abs
형식 : int abs(int n)
설명 : 정수의 절대값을 구하는 함수

acos
형식 : double acos(double x)
설명 : x의 arc cosine을 계산하는 함수(아크 코사인)

asin
형식 : double asin(double x)
설명 : x의 arc sine을 계산하는 함수(아크사인)

atan
형식 : double atan(double x)
설명 : x의 arc tangent를 계산하는 함수(아크탄젠트)

atan2
형식 : double atan2(double y, double x)
설명 : y/x의 arc tangent를 계산하는 함수

ceil
형식 : double ceil(double x)
설명 : x를 초과하는 가장 작은 integral 값을 구하는 함수(최초정수)

cos
형식 : double cos(double x)
설명 : cosine을 계산하는 함수(코사인)

cosh
형식 : double cosh(double x)
설명 : x의 hyperbolic cosine을 계산하는 함수(하이퍼 볼릭코사인)

div
형식 : div_t div(int number, int denom)
설명 : nunber/denom을 계산하여 몫과 나머지로 이루어진 구조체 div_t를 반환한다.
div_t의 형식은 다음과 같다.
              type struct{
                   int quot;
                   int rem;
              } div_t;

exp
형식 : x의 exponential을 계산하는 함수(지수)

fabs
형식 : double fabs(double x)
설명 : x의 절대값을 구하는 함수(절대값)

floor
형식 : double floor(double x)
설명 : x보다 작은 가장 큰 integral값을 구하는 함수(최대정수)

fmod
형식 : double fmod(double x, double y)
설명 : x/y의 나머지를 반환하는 함수(부동 소수점의 나머지)

frexp
형식 : double frexp(double x, int *expptr)
설명 : x를 mantissa와 exponent로 분리하는 함수(부동소수점 계수 부분과 2의 거듭제곱 부분으로 분할)

labs
형식 : labs(long n)
설명 : long integer의 절대값을 찾는 함수

ldexp
형식 : double ldexp(double x, int exp)
설명 : mantissa와 exponent로 값을 계산하여 반환하는 함수(X*2n승 의 값을 계산)

ldiv
형식 : ldiv_t ldiv(long number, long denom)
설명 : long integer를 나눗셈하는 함수

log
형식 : double log(double x)
설명 : log(x)를 계산하는 함수(자연로그)

log10
형식 : double log10(double x)
설명 : base 10인 x의 log을 구하는 함수(상용로그)

modf
형식 : double modf(double x, double *inptr)
설명 : x를 fraction부분과 integer부분으로 분리하는 함수(정수 부분과 소수부분의 분할)

pow
형식 : double pow(double x, double y)
설명 : x의 y승을 구하는 함수(거듭제곱)

rand
형식 : int rand(void)
설명 : 0에서 32사이의 random 정수를 구하는 함수

random
형식 : int random(int max_num)
설명 : 0에서 max_num)사이의 random 정수를 구하는 함수

randomize
형식 : void randomize(void)
설명 : random 수를 발생시키기 위해 seed를 지정하는 함수

sin
형식 : double sin(double x)
설명 : sine을 계산하는 함수(사인)

sinh
형식 : double sinh(double x)
설명 : x의 hyperbolic sine을 계산하는 함수(하이퍼볼릭사인)

sqrt
형식 : double sqrt(double x)
설명 : x의 양의 제곱근을 계산하는 함수(평방근)

srand
형식 : void srand(unsigned seed)
설명 : random 수 발생을 위해 새로운 seed를 지정하는 함수

tan
형식 : double tan(double x)
설명 : x의 tangent를 계산하는 함수(탄젠트)

tanh
형식 : double tanh(double x)
설명 : x의 hyperbloic tangent를 계산하는 함수(하이퍼볼릭 탄젠트)

탐색과 정렬 함수

헤더 파일 : <stdlib.h>

bsearch
형식 : void *bsearch(void *key, void *base, size_t num, size_t width, int (*com pare)(void *elem1, void *elem2)
설명 : 이진 탐색을 수행하는 함수

qsort
형식 : void qsort(void *base, size_t num, size_t width, int (*compare)(void *elem1, void *elem2)
설명 : quick sort 알고리즘을 이용하여 정렬을 수행하는 함수

문자열 조작

#include <string.h>

memchr
형식 : void *memchr(void *s, int c, size_t n)
설명 : 버퍼에 문자를 찾는 함수(지정한 문자열에서 문자를 검색한다.)

memcmp
형식 : int memcmp(void *s1, void s2, size_t n)
설명 : 두 버퍼를 비교하는 함수 (법위를 지정할수있는 문자열 비교)

memcpy
형식 : void *memcpy(void *dest, void *src, size_t n)
설명 : 버퍼의 내용을 복사하는 함수 (지정한 수의 문자를 한버퍼에서 다른버퍼로 복사한다)

memmove
형식 : void *memmove(void *dest, void *src, size_t n)
설명 : 바이트 수만큼 src버퍼에서 dest버퍼로 이동시키는 함수(복사 영역이 중복되어도 복사하는 memcpy)

memset
형식 : void *memset(void *s, int c, size_t n)
설명 : 주어진 문자로 버퍼로 채우는 함수(주어진 문자열의 바이트수를 주어진 문자로 초기화)

memicmp : 대문자와 소문자를 구별하지 않는 memcmp
strcat

형식 : int strcat(char *string1, char *string2)
설명 : 두 문자열을 결합하여 하나의 문자열로 만드는 함수(문자열의 연결)

strcmp
형식 : int strcmp(char *string1, char *string2)
설명 : 문자열을 알파벳 순서로 비교하는 함수, 두 문자열이 같으면 0을 반환한다.
        만약 같지 않으면 다음과 같은 값을 반환한다.
          string1 < string2 이면 음수 값을 반환
          string1 > string2 이면 양수 값을 반환

strcpy
형식 : char *strcpy(char *string1, char *string2)
설명 : 문자열 string2를 string1으로 복사하는 함수(문자열의 복사)

strerror
형식 : char *strerror(int errnum)
설명 : 주어진 에러 번호에 해당되는 에러 메시지를 가져오는 함수

strlen
형식 : int strlen(char *string)
설명 : 문자열의 길이를 구하는 함수 이때 NULL문자는 제외하고 길이를 구한다.

strncat
형식 : char *strncat(char *string1, char *string2, size_t n)
설명 : string2의 문자를 string1 끝에 붙이는 함수(문자 수를 지정할수있는 strcat)
         strncat(a,b,n); 문자열 a의 뒤에 문자열 b의 값을 n만큼 연결한다.

strncmp
형식 : int strncmp(char *string1, char *string2, size_t n)
설명 : 두 문자열의 처음 n개의 문자를 비교하는 함수(문자 수를 지정할수 있는 strcmp)
          strncmp(a,b,n); 문자열 a와 문자열 b를 n만큼 비교한다.

strncpy
형식 : char *strncpy(char *string1, char *string2, size_t n)
설명 : string2의 처음 n개의 문자를 string1에 복사하는 함수(문자 수를 지정할수있는 strcpy)

          strncpy(a,b,n); 문자열 a에 문자열 b를 n만큼 복사한다.
strnset
형식 : char *strnset(char *string, int c, size_t n)
설명 : 문자열의 처음 n개 문자를 c로 만드는 함수

strrchr
형식 : char *strrchr(char *string, int c)
설명 : 문자열의 뒤부터 검색 지정문자를 찾는다, 문자가 발견되지 않은 경우에는 NULL을 반환한다.

strchr : 문자열의 처음부터 시작하여 지정도니 문자를 찾는다.

strcspn : 지정한 복수의 문자를 검색

strspn : 지정한 복수의 문자 , 이외의 문자를 검색

strpbrk : 지정한 문자열에 포함되는 어떤 문자가 나타나는 위치를 찾는다.

strstr : 문자열안에서 지정한 문자열을 검색

strtok : 문자열에서 토큰을 꺼낸다.

시간 함수

#include <time.h>

asctime
형식 : char *asctime(struct tm *time)
설명 : struct tm 형식의 시간정보를 문자열로 바꾸는 함수

clock
형식 : clock_t clock(void)
설명 : clock tick으로 실행개시부터 경과된 시간을 가져오는 함수

ctime
형식 : char *ctime(time_t *time)
설명 : 시스템 시계의 시간을 문자열로 바꾸는 함수

difftime
형식 : double difftime(time_t time1, time_t time2)
설명 : 두 시간 사이의 차를 초단위로 계산하는 함수

gmtime
형식 : struct_tm *gmtime(time_t *time)
설명 : Greenwich Meam Time(GMT)을 tm structuregudtlr으로 가져오는 함수(그리니치 표준시간)

localtime
형식 : struct tm *localtime(time_t *time)
설명 : local time을 tm structure형식으로 가져오는 함수(long 값의 초정보를 시간구조체로 변환)

time
형식 : time_t time(time_t *timeptr)
설명 : GMT 1970년1월 1일 00:00:00부터 경과된 현재 시간을 가져오는 함수

strftime : 날짜와 시간 정보를 서식화 한다.

문자 분류 및 변환 함수


#include <ctype.h>

isalnum
형식 : int isalnum(int c)
설명 : c가 alphanumeric이면 참값을 반환(알파벳과 숫자이면 참)

isalpha
형식 : int isalpha(int c)
설명 : c가 letter이면 참값을 반환(알파벳과 문자이면 참)

isascii
형식 : int isascii(int c)
설명 : c가 ASCII이면 참값을 반환

iscntrl
형식 : int iscntrl(int c)
설명 : c가 control 문자이면 참값을 반환(제어 문자라면 참)

isdigit
형식 : int isdigit(int c)
설명 : c가 decimal digit이면 참값을 반환(숫자라면 참)

isgraph
형식 : int isgraph(int c)
설명 : c가 graphic c문자이면 참값을 반환(공백을 제외한 인쇄가능한 문자라면 참)

islower
형식 : int islower(int c)
설명 : c가 소문자이면 참값을 반환

isprint
형식 : int isprint(int c)
설명 : c가 인쇄 가능한 문자이면 참값을 반환

ispunct
형식 : int ispunct(int c)
설명 : c가 punctuation 문자이면 참값을 반환(구분문자이면 참)

isspace
형식 : int isspace(int c)
설명 : c가 공백 문자이면 참값을 반환 (공백, 탭, 복귀, 개행, 수직탭, 개항이면 참)

isupper
형식 : int tsupper(int c)
설명 : c가 대문자이면 참값을 반환

isxdigit
형식 : int isxdigit(int c)
설명 : c가 hexadecimal digit이면 참값을 반환(16진수 문자이면 참)

toascii
형식 : int toascii(int c)
설명 : c를 ASCII로 변환하는 함수

tolower
형식 : tolower(int c)
설명 : c를 소문자로 변환하는 함수

toupper
형식 : int toupper(int c)
설명 : c를 대문자로 변환하는 함수


기타 함수

다음은 화면 제어에 관한 라이브러리 함수들이다.
헤더 파일 : <conio.h>

clreol
형식 : void clreol(void)
설명 : 커서의 현 위치 행을 지우는 함수

clrscr
형식 : void clrscr(void)
설명 : 현재 사용 중인 윈도우를 지우고 커서를 왼쪽 상단으로 이동시키는 함수

deline
형식 : void deline(void)
설명 : 커서가 있는 행을 삭제하는 함수

gettext
형식 : int gettext(int left, int top, int right, int bottom, void *dest)
설명 : 지정된 텍스트 화면의 내용을 dest로 읽어 들이는 함수

gettextinfo
형식 : void gettextinfo(struct text_info r)
설명 : 현재의 텍스트 모드의 정보를 구조체 r로 읽어 들이는 함수

참고

2014년 10월 13일 월요일

웹 개발을 위한 자바스크립트 도구 (JavaScript tools)



자바스크립트를 이용하여 웹 사이트 제작을 돕기 위한 도구를 소개하고 있음
  • Meteor
  • Epoch / D3.js - 시각화
  • 구글 Web Starter Kit
  • Reveal.js - HTML4 기반의 파워포인트
  • RxJS
  • NodeBB
  • GulpJS
  • Odyssey - 웹 사이트에 지도 추가
  • Deb.js - 자바스트립트 디버깅 도구 : FireBug, 크롬/오페라/사파리 연계


PC 시스템 분석 무료 도구 (Free tools for PC system analysis)



Three utilities (free) to get analytical information about your PC system.

1. Speccy

2. Belarc Advisor

3. CPUID HWMonitor

내 컴퓨터가 게임 요구사항을 만족하는가? (Does my computer meet the game requirements?)

System Requirements Lab에서는 사용자 컴퓨터를 온라인으로 '무료' 분석하여,
특정 게임을 수행할 수 있는 지 System Requirements를 판단하는 페이지를 제공한단다.

PC 게임을 할 일은 없지만, 혹시나 필요할 일이 있을까 싶어 메모 남겨둔다.