글

C++로 프로그래밍할 때 인자 또는 리턴 값으로 std::vector 등 STL 데이터 타입 처리하는 좋은 방법

C++ 프로그래밍할 때 std::vector 등 STL 데이터 타입을 호출하는 함수로 넘겨주거나 받아야 할 경우가 있다. 이런 경우 메모리 문제 또는 속도 문제 때문에 고민을 많이 할 것 같은데, C++11 이상을 지원하는 컴파일러를 사용하는 분이라면 이 글에서 도움을 받아 가기 바란다. 함수 인자로 넘길 때 이 경우는 사용이 명확하다. Call by Reference으로 데이터를 넘기면 된다.  Call By Reference로 인자로 넘기는 방법은 pointer 를 사용해도 되지만, reference을 사용하는 것이 좋다. void foo1(std::vector & data) {   ... } void foo2(std::vector const& data) {   ... } void foo3(std::vector data) { } int main(int argc, char* argv[]) {   std::vector my_data {10, 20, 30};   foo1(my_data);   foo2(my_data); } 위 코드에서 foo1()과 foo2()는 Call by Reference로 값을 넘기는 반면에 foo3()는 Call by Value로 main()에서 my_data를 넘기게 된다.  foo1()의 data는 main()의 my_data를 참조(reference)하고 있어서 foo1()에서의 데이터 변경은 main()의 my_data에 영향을 주게 된다. 그리고 foo2()는 main()의 my_data를 참조는 하지만 수정을 할 수가 없는 것이라서 단순히 값만 참조할 수 있게 된다. 반면 foo3()에서의 data는 main()의 my_data를 넘기는 순간에 값을 복사하기 때문에 메모리가 증가하게 된다. 또한 foo3()에서 data를 ...

How to delete hidden files in subdirectories

When developer uses a samba server on macOS, the cache files like .DS_Store or ._.DS_Store are created. At that time, if you want to delete this files, you can do it using following bash shell: $ find . -name ".DS_Store" -exec rm -f {} \; $ find . -name "._.DS_Store" -exec rm -f {} \;

Linux 또는 macOS에서 Git 비밀번호 계속 물어보지 않게 하기

이 요약은 사용할 수 없습니다. 이 글을 보려면 여기를 클릭하세요.

macOS가 갑자기 부팅이 되지 않을 경우 데이터 복구 또는 백업 방법

이미지
어느날 갑작스럽게 Mac이 부팅 되지 않을 때, 그 안에 담겨진 소중한 자료들을 복구 할 수 있는 방법을 소개 합니다. 최악의 상황인 HW 문제가 있다면 소중한 자료들의 확보는 분명 어렵겠지만, OS적인 문제로 부팅이 되지 않을 경우는 다음과 같은 시도를 통해 확보가 가능할 수 있다. Mac 제품 특히 저장 장치가 SSD인 Mac은 저장장치가 메인 보드에 장착되기 때문에 일반 노트북처럼 2.5인치 내장 저장장치를 꺼내 다른 컴퓨터에 연결할 수 없다. 이런 경우 수리 센터에 맡길 수 있겠지만, 데이터 복구는 개인 정보 때문에 지원받지 못할 수 있다. 그렇다면 어떻게 하면 될까? 바로 '외장 저장장치'에 최신 macOS를 설치 후(시동 디스크 생성과 동일), 이 외장 저장장치로부터 macOS을 부팅하여 Mac 내부에 있는 저장장치에 접근이 가능할 수 있고, 데이터도 복구를 할 수 있다. 1. MacBook 또는 iMac 하드웨어 설정 초기화(NVRAM 초기화) 사용하다가 갑자기 어느날 macOS가 부팅이 안되면 우선 머리가 하얗게 되어 아무런 생각이 없을 것이다. 부팅을 여러번 시도할 것이고, 그래도 안된다면 수리 센터를 생각해 볼 것이다. 비용도 비용이지만 소중한 내 자료를 백업 가능할지 모르겠다. 일반 사용자가 하드웨어 설정(보통 이런 설정은 NVRAM에 저장됨)을 바꾸지는 않을 것이다. 하지만 설치한 하드웨어 또는 소프트웨어들에 의해 값들이 변경될 수 있다. NVRAM에 저장되는 정보의 예를 들면 무선랜에 연결되면 다음에 다시 연결될 수 있도록 연결된 무선랜의 이름과 암호를 저장한다. 이러한 하드웨어 설정들이 동작에 일부 영향을 줄 수 있다. 이 NVRAM을 초기화를 위해서는 전원 버튼을 누른 후 바로 'option' + 'command' + 'P' + 'R' 네 키를 동시에 누르면서  약 20초 동안 유지하면 된다. 애플 로고가 두 세번 보일 수도 ...

Jira를 사용한 Agile 개발 방법 #1 - 주요 용어 정리

이미지
Agile 개발 방법론을 사용하다보면 정말 내가 사용하는 방법이 맞을까? 라는 생각이 들 수 있다. 사용자 스토리, 작업, 버그, 에픽 등 용어들이 나오면 헷갈리기 시작한다. 여기서는 자주 사용하는 기능들에서 일반적인 용어들을 정리해서 Agile 개발 방법을 이해해 보자. 백로그(Backlog) 문제(Problem) Jira Software에서는 사용자 스토리(User Stories), 작업(Tasks) 및 버그(Bugs)를 "문제(Issues)"로 정의한다. 사용자 스토리(User Story) 의미 사용자 스토리는 가장 작은 작업 단위로 제품 소유자(PO, Product Owner)가 스케치하면 전체 제품 팀이 세부 요구 사항을 공통적으로 결정한다. 이 요구사항들은 스토리와 곧 나오는 스프린트을 위한 구현 항목을 정의하는데 도움이 되는 세분화 된 작업이다. 백 로그의 각 사용자 스토리에는 기능 코드와 자동화된 테스트 코드가 모두 필요하다. 테스트 팀이 자동화 테스트를 수행하는 동안 일부 팀이 개발자에게 기능 코드를 할당하지만 단일 엔지니어가 전체 세트를 제공하는 것이 더 효과적이라는 것을 알게되었습니다. 형식 As a {type of user}, I want {goal} so that I {receive benefit}. 예제 고객으로서 작년 예산을 돕기 위해 작년에 구매한 항목을 볼 수 있도록 계정을 만들 수 있기를 원합니다. Agile 추정(A gile Estimation ) 의미 첫 번째 스프린트를 시작하기 전에 백 로그의 스토리를 예측하여 작업 완료까지 걸리는 시간을 결정하는 것이 중요하다. 그렇다면 애자일 추정이란 무엇인가? 전통적인 소프트웨어 팀은 일, 주, 달 등의 시간 형식으로 작업 시간을 추정했다. 그러나 많은 Agile 팀은 Story Point로 전환했다. Story Point는 피보나치 수열(0, 0.5, 1, 2, 3, 5, 8, 13, 20, 40, 10...

CORS(Cross Origin Resource Sharing, 크로스 도메인) 이슈

최근 케이블 통신사와  클라우드 서버간 연동 과정에서 CORS(Cross Origin Resource Sharing, 크로스 도메인) 이슈가 발생했다. 케이블 통신사에서는 STB의 기능들이 브라우저에서 동작하기 때문에 우리가 구축한 서버에 연동을 위해서는 CORS가 우리 서버에서 허용이 필요하다는 의견을 줬다. 그래서 CORS가 무엇인지 확인하고, 보안 이슈가 없는지 등을 검토 해 봤다. CORS(Cross-Origin Resource Sharing)란 무엇인가? CORS는 한 도메인에서 로드되어 다른 도메인에 있는 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법을 정의한다 최신 웹 브라우저들이 보안상의 이유로 JavaScript나AJAX로 외부 Host로 접속하는 것을 차단하기 시작했다. 그래서 JavaScript는 보안 측면에서 Same Origin Policy 정책을 둬서 자신이 속한 동일 도메인내에서만 서버 요청을 허용하고, 다른 도메인의 서버 요청을 차단한다. 이 문제를 해결하기 위해 CORS가 제안 되었으며, AWS 등 많은 Public Cloud에서도 지원하기 시작했다. CORS 표준은 브라우저와 서버에 그들이 권한을 가진 원격 URL을 요청할 수 있는 방법을 제공하는 새로운 HTTP 헤더를 설명한다. 일부 유효성 검사 및 권한 부여는 서버에서 수행 할 수 있지만 일반적으로 이러한 헤더를 지원하고 부과하는 제한 사항을 준수하는 것은 브라우저의 책임이다.  CORS의 종류는 4가지가 있다. Simple Request Preflight Request Credential Request Non-Credential Request Simple Request Simple Request는 세 가지 조건이 있다. GET, HEAD, POST 중 한 가지 방식을 사용해야 함 POST일 경우 Context-type이 아래 셋 중 하나를 만족 applic...

AWS Cognito에 대해서 간단하게 알아 봅시다.

이미지
AWS Cognito는 User Pool과 Federated Identities 서비스를 제공한다. 이 글에서는 AWS Cognito의 개념을 이해하고, 어떻게 활용하는 것이 좋을지에 대해 간단하게 정리해 본다. 우선 AWS Cognito는 무엇을까? AWS Cognito는 모바일과 앱 앱에 사용자 가입 및 로그인 기능을 손쉽게 제공할 수 있는 기능을 제공한다. Cognito에서는 Facebook, Twitter 또는 Amazon과 같은 소셜 자격 증명 공급자, SAML 자격 증명 솔루션 또는 자체 자격 증명 시스템을 이용하여 사용자를 인증할 수 있는 옵션을 제공한다.  따라서 사용자 관리, 인증 및 디바이스 간 동기화를 처리하는 솔루션의 구축, 보안 및 확장을 AWS Cognito에서 제공 받음으로써 서비스 구현에 집중할 수 있게 된다. 우선 AWS Cognito에서 제공하는 두 가지 기능을 정리해보자.  User Pool Amazon Cognito의 User Pool은 개발자가 웹 및 모바일 애플리케이션에 등록 및 로그인 기능을 쉽게 추가 할 수 있게 한다. 또한 사용자 디렉토리를 유지 관리하는 고유 한 ID 공급자 역할을 한다. 사용자 로그인 및 로그인을 지원하고 로그인 한 사용자의 신원 토큰을 프로비저닝한다. Federated Identities(또는 Identity Pool, ID Pool) Cognito Federated Identities를 통해 개발자는 사용자에 대한 고유 ID를 만들고 연합 ID 공급자로 인증할 수 있다. 제휴 ID를 사용하면 임시, 제한된 권한의 AWS 자격증을 획득하여 Amazon DynamoDB, Amazon S3 및 Amazon API Gateway와 같은 다른 AWS 서비스에 안전하게 액세스 할 수 있다. 위에 정의들은 AWS Cognito  웹페이지에서 누구나 볼 수 있을 것 같은데, 문제는 뭔가 서비스를 만들려고 하면 명확하게...

macOS의 terminal에서 CMake 등 C/C++ 빌드가 안될 경우 해결 방법 - command line developer tools 설치

최근 macOS High Sierra를 설치 후 CMake를 사용한 C++ 프로그램 빌드가 되지 않았다. 'time.h'가 없다는 빌드 에러가 상당히 당황스러웠다. make [ 11%] Building CXX object CMakeFiles/SmartCamera.dir/src/EnvironmentInfo.cpp.o In file included from /Users/oz/Workspace/git/smurfhome/src/smartcamera/src/EnvironmentInfo.cpp:1: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ ctime:48:10: fatal error: 'time.h' file not found 원인을 찾아 보니, macOS High Sierra로 업그레이드 되면서 Xcode가 새로 설치 되었는데, 기존에 설치된 command line developer tools 가 삭제되어 발생했다. 따라서 이런 빌드가 오류가 나타나면 당황하지 말고 다음과 같이 command line developer tools 을 설치하면 문제가 해결 된다. 먼저 터미널창을 열고, 다음과 같이 입력한다. $xcode-select --install 설치 화면이 표시되면  '툴 설치'를 선택한다. 설치가 완료된 후 다시 빌드를 다시 하면 된다. 참고로 command line developer tools이 설치되지 않더라도, Xcode에서 C++ 프로그램은 개발이 가능하다.

How to build FFmpeg and OpenCV on Ubuntu MATE for Raspberry Pi 3

How to build FFmpeg and OpenCV on Ubuntu MATE for Raspberry Pi 3 OpenCV is often used to handle various computer vision, such as objects, faces, or motion recognition. In OpenCV, there are many ways to get images. Basically, you can easily get images by using the camera attached to the device, but sometimes you need to open the media file or receive the data streaming over the network. OpenCV does not directly support various video codecs or network protocols, so FFmpeg is used in this case. This article describes how to build OpenCV in Raspberry Pi 3 that requires FFmpeg. The build environment is as follows. Raspberry Pi 3 Ubuntu MATE for Raspberry Pi 3 cmake How to build The build order is as follows. FFmpeg OpenCV When you build FFmpeg you have to be careful. If your target board is 32 bits , you must add the --enable-pic option. Build FFmpeg cd ~/git git clone https://github.com/FFmpeg/FFmpeg.git cd FFmpeg ./configure --enable-libfreetype --enable-...

Ubuntu MATE for Raspberry Pi 3에서 FFmpeg와 OpenCV 빌드 방법

Ubuntu MATE for Raspberry Pi 3에서 FFmpeg과 OpenCV 빌드 방법  사물, 얼굴 또는 동작 인식 등 다양한 컴퓨터 비전을 처리하기 위해 OpenCV를 많이 사용한다. OpenCV에서는 영상을 얻는 방법이 다양하기 하다. 기본적으로 기기에 장착된 카메라를 이용해서 쉽게 영상을 얻을 수 있지만, 떄로는 미디어 파일을 열거나 네트워크 너머에서 스트리밍으로 데이터를 받을 필요가 있다.  OpenCV는 다양한 비디오 코덱 또는 네트워크 프로토콜은 직접 지원하지 않기 때문에 이런 경우에는 FFmpeg을 사용하게 된다.  이 글에서는 FFmpeg이 필요하는 OpenCV을 Raspberry Pi 3에서 빌드하는 방법을 설명한다. 빌드 환경은 다음과 같다. Raspberry Pi 3 Ubuntu MATE for Raspberry Pi 3 cmake 빌드 순서 빌드 순서는 다음과 같다. FFmpeg OpenCV 빌드시 주의할 점은 만일 타케 보드가 32비트일 경우는 반드시 --enable-pic 옵션을 추가해야 한다. FFmpeg 빌드 cd ~/git git clone https://github.com/FFmpeg/FFmpeg.git cd FFmpeg ./configure --enable-libfreetype --enable-gpl \ --enable-nonfree --enable-libx264 --enable-shared --enable-pic make sudo make install OpenCV 빌드 cd ~/git git clone https://github.com/opencv/opencv.git cd opencv mkdir build cd build cmake .. make sudo make install

IBM Watson을 이용한 이미지 학습 및 인식하기

이미지
IBM Watson을 이용하여 특정 이미지 학습 후 인식하기 IBM Watson을 이용하면 다양한 AI 기능들을 사용할 수 있다. 현재 Watson은 Conversation, Language Translator, Personality Insights, TTS(Text to Speech), STT(Speech to Text) 및 Visual Recognition 등이 제공된다.( IBM Watson 기능들 ) 이번 글에서는 이미지에서 의미를 찾을 수 있는 Visual Recognition 기능을 살펴보고, 특정 이미지들을 학습하여 인식하는 과정을 소개한다. Watson Visual Recognition의 자세한 소개는 아래 IBM Bluemix 사이트에서 참고한다. Visual Recognition Visual Recognition  IBM Bluemix에서 소개된 Visual Recognition 소개는 다음과 같다.  Visual Recognition 시각적 컨텐츠에서 의미를 찾습니다! 장면, 사물, 얼굴 및 기타 컨텐츠에 대한 이미지를 분석합니다. 제공되는 기본 모델을 선택하거나 사용자 고유의 사용자 정의 클래스류를 작성할 수 있습니다. 콜렉션 내에서 비슷한 이미지를 찾습니다. 특정 장면을 이해하기 위해 이미지나 동영상 프레임의 시각적 컨텐츠를 분석하는 스마트 애플리케이션을 개발합니다. 기능 일반 분류 이미지를 설명하는 클래스 키워드를 생성합니다. 고유의 이미지를 사용하거나 분석을 위해 공개적으로 액세스 가능한 웹 페이지에서 관련 이미지 URL을 추출합니다. 얼굴 감지 이미지에서 얼굴을 감지합니다. 또한 이 서비스에서는 얼굴의 나이 범위 및 성별에 대한 일반적인 표시도 제공합니다. 시각적 훈련 고유한 사용자 정의 시각적 클래스류를 작성합니다. 이 서비스를 사용하여 일반 분류에 사용할 수 없는 사용자 정의 시각적 개념을 인식합니다. 비슷한 이미지 검색(BETA)...