2014년 2월 12일 수요일

bash shell에 색 입히기

bash shell에 색 입히기

vmware를 설치하고 매번 *Nix계열의 OS를 설치하면 매번 하는 작업이 있는데 그 작업을 매번 하면서도 자주 잊어먹기에 글을 남긴다.

  1. 색이 입힌 .bashrc파일을 구한다.(root계정에 있다면 복사해준다.)
  2. .bash_profile을 홈폴더에 생성한다.
  3. .bash_profile의 내용을 아래와 같이 바꾸어 준다.

.bash_profile

source .bashrc

아주 간단하게 해결할 수 있다.

php + mysql(mariadb) + boost 진행


boost에 vs2012 64bit로 구성하였다.

네트워크 쪽을 검색하던 중 http://rhea.pe.kr/494 분의 블로그에서 금쪽같은 자료로 공부를 진행해보기로 했다.



1. 1.zip을 다운받아 vs2012용으로 만들고 boost 경로를 수정해주었다.



2. 강좌2번을 하던 중에 데이터베이스 얻어오는 부분을 살짝 넘어가셨더라... 그래서 집에 있는 mariaDB가 설치된 odroid를 써먹으려고 고민했었다.


3. mysql connector c++ 버전이 있더라..(http://dev.mysql.com/downloads/connector/cpp/)
이걸 설치하고 developer 가이드 대로 진행을 했는데 뭔가 잘 맞지 않는다. 실력부족인 탓인가..
http://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-complete-example-1.html
이걸로 해결하신 분은 어떻게 하는지좀 알려달라 ㅠㅠ 포함디렉토리 링크 디렉토리를 모두 잡고 해봐도 안되더라...
mysql connector로만은 불가능인것 같다.


4. 몇시간을 찾고 찾은 후에야 그냥 mysql db의 library를 설치하고 진행을 했었다.


5. 그런데 무슨 문제가 있는지 로그인이 안되더라...


6. 방화벽때문인가 하고 방화벽도 해제 해 주었다.

sudo ufw allow mysql
sudo ufw enable


7. 3306포트가 열렸는지 확인한다.
netstat -tln


8. 그래도 telnet으로 연결이 되지 않는다.


9. 찾다가 이 분의 블로그를 찾았다.

9-1. MySQL에 권한 설정 해주기

prompt> mysql -u root -p
prompt> use mysql;
prompt> GRANT ALL PRIVILEGES ON *.* to 'root'@'%' IDENTIFIED BY 'password';
prompt> flush privileges;

여기서 3번째 줄에 주목하자.
*.*             =>데이터베이스명.테이블명
root            => 계정명
password    => 계정의 패스워드

그리고 4번째 줄
flush privileges;    => 서버에 권한이 변경되었음을 알리고 즉시 반영되도록


9-2. MySQL 환경 설정 변경

prompt> vim /etc/mysql/my.cnf
bind-address = 127.0.0.1 을 찾아서 주석처리 (제일 앞에 # 붙이면 주석)


9-3. MySQL 다시 시작하기

prompt> /etc/init.d/mysql restart



10. mysql -h 자신의주소 -u root -p
를 해서 접속이 되나 확인해보자
비밀번호는 저 빨간글씨를 써야된다.


된다면 이미 끝난거나 다름없다.



11. 하지만 나는 아까 테스트에서 많이 암호를 틀렸기에...
Host '192.168.0.4' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

가 나온다.

이럴때는 mysql에 직접접속, 다른ip로 접속해서

flush hosts;

를 쳐주자



하루종일 삽질만 한것 같다. 내일부터는 진도를 나가봐야할듯하다.

2014년 1월 22일 수요일

프로젝트 1차적 완료


1차적으로 완료해서 친구들에게 뿌려준 뒤 1차적으로 버그를 잡았다.

UI는 기능을 구현하고 나서 새롭게 프로그램을 만들어야 할듯 ㅠ

일단은 여기서 기능을 추가해야 될듯하다.



Qt의 static build가 어려웠었다 ㅠㅠ








2014년 1월 14일 화요일

Qt 이미지 출력


Qt에서 이미지 출력하는 방법

보통 QLabel에 출력하는 방법을 많이 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QPixmap>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString img_path = "C:/AMD/SDC11388.JPG";
    QImage img(img_path);    
    QPixmap buf = QPixmap::fromImage(img);
 
    ui->label->setPixmap(buf);
    ui->label->resize(buf.width(), buf.height());
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 



QGraphicsView에 출력하는 방법도 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QPixmap>
#include <QGraphicsView>
#include <QGraphicsScene>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString img_path = "C:/AMD/SDC11388.JPG";
    QImage img(img_path);    
    QPixmap buf = QPixmap::fromImage(img);
    
    buf = buf.scaled(1024,1024);
 
 
    QGraphicsScene* scene = new QGraphicsScene;
    ui->graphicsView->setScene(scene);
 
    scene->addPixmap(buf);
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 


2014년 1월 10일 금요일

프로젝트의 시작 - Domino 이미지 이어붙이기


간단하게 이미지를 불러와서 이어붙이는 프로그램을 만들어 보고 있다.


예전에 나도 한번 이어붙이는 작업을 해봤는데 포토샵으로는 너무 힘들었던 기억이 있어서 좀더 쉽게 했으면 좋겠다는 조그마한 바람에서 프로그램을 만드는 계기가 되었다.


QT를 공부하고 있으니, QT로 만들어서 *nix, Window 두군데서 모두 사용할 수 있는 프로그램이 목적이다.


사실 이건 12월 중순부터 생각했었는데 QT에 대해 공부하느라 조금 늦어지고 있다.


대략적인 디자인을 아이튠즈같이 해서 꾸며놨는데...

아이튠즈 스타일..?

내가 구현하기에는 너무나 힘들었다 ㅠㅠ



그래서 방향을 조금 틀어...

기본적인 윈도우 탐색기처럼 구현하기로 했다.


그런데 기본적인 탐색기라고 생각했는데 구현중 고려할게 많았다.

간단하게

사용자가 TreeView에서 디렉토리를 선택한다 → 선택한 디렉토리의 파일들을 읽는다 → 이미지 파일을 확장자로 필터링하고 읽을 수 있는 이미지 리스트를 생성한다 → ListModel에  이미지를 읽어 파일이름과 Icon을 출력한다. → ListView에 ListModel을 적용시킨다.


1. 속도
2. 메모리

첫번째는 이미지가 크면 불러오는 시간이 길다. 그러므로 디렉토리를 선택하면 썸네일을 생성해야 되는게 아닐까??
하지만 썸네일도 이미지로부터 읽어오는 것인데, 캐싱하지 않는 이상은 속도가 똑같지 않을까? 
EXIF포맷에 썸네일이 있어요!!
EXIF포맷이 썸네일을 따로 저장하지만 모든 이미지 포맷이 썸네일을 꼭 저장하지는 않으므로...

당근을 조그맣게 만드려면 썰어야 하는수밖에..??
이미지 출처 http://season4.tistory.com/m/post/view/id/253




두번째는 메모리 관리다. 만약 이미지가 만장이 있다면 메모리를 어떻게 관리해야할까?
지금처럼 무작정 한다면 메모리가 넉넉한 PC에서도 죽게 될것이다.
이 문제는 스마트폰에서도 자주 접하게 되는데, 트위터나 페이스북같이 이미지+텍스트가 많을때는 사용자에게 보이는 부분만 읽어와서 그려주면 된다고 하더라...
이걸보고 ViewHolder패턴이라고 한다.



문제되는 점
지금은 이미지 리스트를 생성하고 Listitem을 하나하나 파일에서 읽어와서 ListModel 추가하고 마지막으로 View를 업데이트 하는 방식으로 되어있다.
지금 이 때의 문제는 고해상도 이미지 파일을 읽을 때이다. 만약 디렉토리에 100개 이상의 고해상도 이미지 파일이 있다면 ListModel에 모두 추가하기전까지는 View에 업데이트가 되지 않을 것이다.
지금 현재 이 문제를 겪고 있고, 해결해야 하는 제일 첫번째 문제점이다.
Model/View 프로그래밍을 다시 생각해 볼 시간인듯하다.

진행하다보니 쉽게 생각했던 프로젝트가 여러가지 고민거리를 안겨준다.



2013년 12월 31일 화요일

IT 주변기기 박람회


한마디로 표현하자면...

대실망

핸드폰 케이스와 스피커만이 가득했다.. -_-;

가장 볼만했던건 3D프린터와 의료기기를 스마트폰과 접목시킨 무슨 대학이었는데... 기억이 안난다.(가장 볼만했던걸 사진을 찍지 않았어 ㅠ)

캔고루에서 무료초정장으로 들어갔다.

조금은 관심이 갔던 무선충전

무선충전 비싸!!

카드형 USB

컴터를 제어하는 리모컨? 같은 기기

!?

코엑스에서 이런걸 보게될줄이야...!!


어찌되었건 실망만 가득한 주변기기 박람회




2013년 12월 29일 일요일

코딩호러의 이펙티브 프로그래밍 - 1



좋은 책을 읽으며 좋은문구가 많기에 시간을 들여 조금씩 옮겨보고자 한다.

실제로 개발을 하다보면 다른사람이 짠 코드나 오픈소스를 사용하게 된다.

이때의 문제점은 다른사람이 짠 코드는 못알아 보겠다는 것이고 , 오픈소스의 경우는 열어봤을 때 프로젝트의 크기가 너무나 커서 어디부터 봐야할지 막막하다는 점이다.

회사에서 개발을 한다고 해도 개발문서가 형편없을 때도 있으며(심지어는 존재하지 않을때도 있다.), 업데이트를 하면 할때마다 문서를 바꿔야 하는데 그걸 깜빡 잊는 개발자가 있다던가...

중견기업에 다니는 친구가 있는데 이 친구의 고민은 프로젝트의 크기가 너무나도 커서 모두 이해하려면 시간이 많이 걸린다는 것이다.


이런 사람들을 위해 이 책에선 "소스를 읽는 법을 배워야 한다" 라고 하고 있다.


좋은문구가 있길래 옮겨본다.


"루크 소스를 읽는 법을 배우게"


해커뉴스에서 블랜드 블룸이 쓴 글이다.


15살쯤에 나는 마이크로소프트 플랫폼을 기반으로 개발 경력을 시작했다.
마이크로소프트에서 비주얼 스튜디오로 각종 기능을 통합하는 소프트웨어 개발자로 근무하기 시작한 것이다. 그리하여 나는 비주얼 베이직 코드를 처음 작성한 이래로 10년 정도의 시간이 흐르자 내부를 들여다 볼 수 없도록 닫혀 있는 라이브러리는 더 이상 사용하고 싶지 않게 됐다.

소프트웨어를 사용하는 것은 소프트웨어를 만드는 것과 다르다. 어떤 소프트웨어를 그것이 담고 있는 핵심 기능을 위해 사용하는 경우에는 작업 자체가 잘 알려진 경로를 따른다. 그 경로를 따라가던 많은 사람들이 이미 이러저러한 문제에 봉착했을 것이며, 소프트웨어를 제작한 사람에게 그러한 문제를 해결해 달라고 요청했을 것이다. 하지만 소프트웨어를 만드는 경우에는 뭔가 새로운 경로를 밟게 된다. 그러한 경로는 너무나 많기 때문에 아무도 가지 않은 길을 걷게 되는 것이 드문 일이 아니며, 그래서 종종 낯선 구석이나 아직 충분히 검증되지 않은 코드의 경로를 밟게된다. 근본적인 문제를 해결하지 못하고 그저 우회해서 피해간 예외적인 상황도 경험하게 될 것이다.

문서는 때로 불완전하다. 심지어는 잘못된 정보를 담고 있는 경우도 있다. 하지만 소스코드는 거짓말하지 않는다.
숙련된 개발자라면 문서보다 소스코드를 읽는 편이 더 빠를때가 많다. 특히 그가 소프트웨어 패키지의 아키텍처에 이미 익숙한 경우라면 더욱 그렇다.
나는 지금 중간 정도 규모의 팀에서 일하고 있다. 이 팀은 여러 개의 스타트업 회사와 함께 프로젝트를 수행한다. 그런데 각 회사의 CTO나 엔지니어들이 우리 팀으로 찾아와서 조언을 구하는 일이 있다.
이 사람들이 자기가 이용하는 기술적 스택에 문제가 있다고 보고하면 나는 이렇게 대답한다.

"소스코드는 읽어보셨나요?"

나는 개발자들에게 자기 프로젝트에서 사용되는 소프트웨어 제품의 소스코드를 로컬 폴더에 복사해 두고 수시로 살펴보라고 권장한다. 많은 사람들이 처음에는 이렇게 하길 두려워한다.


"그 프로젝트는 너무 커요, 원하는 내용을 찾을 수 없다고요!"
"나는 그것을 이해할 만큼 똑똑하지 않답니다."
"그 코드는 정말 끔찍하군요! 도저히 살펴볼 엄두가 안 납니다."  

라고 말한다.

하지만 소스코드 전체를 살펴보라는 것이 아니다. 그저 필요한 경로를 따라가면서 부분적으로만 이해하면 된다. 자신의 소프트웨어가 기초로 삼고 있는 플랫폼을 이해하지 못하면서 어떻게 자기가 만든 소프트웨어를 이해할 수 있겠는가? 숙련되지 못한 개발자들이 아름답다고 말하는 것은 대개 표면적인 것에 그칠 때가 많다. 그리고 그들이 끔찍하다고 말하는 것은 최고의 해커가 작성한, 실전에서 단련되어 실제 제품으로 사용될 준비가 돼 있는 견고한 코드인 경우가 많다.
이러한 조언을 하고 나서 1,2년 뒤에, 나에게 찾아와서 자신을 다른 사람이 작성한 코드 속에서 허우적거리면서 헤엄치게 했던 것에 감사를 표하는 사람들이 있었다. 그들은 이제 전보다 나은 개발자가 돼 있다. 그리고 도대체 어떻게 예전에는 소스코드를 읽지도 않으면서 일을 했는지 알 수 없다는 식으로 말하기도 한다.

회사를 운영하는 경우를 생각해보자. 당신의 소프트웨어에서 버그가 발견됐다면 고객들은 그것이 당신의 잘못인지 아니면 리누스나 레일스 개발자의 잘못인지를 따지지 않는다. 그들에게는 당신의 소프트웨어에 버그가 있다는 사실이 중요하다. 다른 소프트웨어에서 발생하는 버그조차 모두 나의 것이 되기 때문에 그들의 소프트웨어도 나의 소프트웨어인 것과 마찬가지다. 뭔가가 잘못됐다면 무엇이 잘못됐는지 원인을 찾아 수정해야 한다. 위험, 유지보수 비용, 그리고 수정하는데 필요한 시간을 최소화하려면 정확한 지점에서 문제를 고쳐야 한다. 경우에 따라서는 재빨리 문제를 우회하는 편이 나을 때도 있다. 때로는 사용하던 컴파일러를 새로 컴파일해야 하는 경우도 있다. 어떤 경우에는 스택의 위쪽에 있는 다른 사람에게 문제를 수정해 달라고 부탁할 수 있을 때도 있지만 버그를 스스로 수정해야 하는 경우도 그만큼 자주 발생한다.


  • 내부를 공개하지 않는 소프트웨어 회사의 제품을 사용하는 경우에는 두가지 선택이 있다. 하나는 관용에 호소하는 것이고 다른 하나는 문제를 우회하는 것이다.



  • 실력이 부족한 개발자에게 의존하는 오픈소스 회사의 경우에는 위와같이 내부를 공개하지 않는 소프트웨어 회사와 동일한 방식으로 행동하는 경우가 많다.



  • 오래된 회사는 제품의 변종이나 패치 등을 유지보수하는데 필요한 근육을 아주 느리게 단련하는 경향이 있다.



진정한 해커는 이러한 사실을 받아들인다. 그것이 내 컴퓨터 위에서 작동하는 것이라면 그건 내 소프트웨어다. 그것에 대해 나는 모든 것을 책임진다. 나는 그 소프트웨어를 잘 이해해야 한다. 소스코드를 이용해 소프트웨어를 만드는 것은 당연한 일이지 예외적인 일이 아니다. 나는 내 환경을 전적으로 통제해야 하며, 내가 사용하는 다른 소프트웨어도 모두 통제해야 한다.