2016년 6월 16일 목요일

우분투 Proxy 네트워크 환경에서의 apt-get 환경 설정 방법

회사 네트워크에 물려서 사용하다 보니 우분투 세팅에, 특히 네트워크 관련 모든 설정들이 엉망이다.
apt-get은 특히나 많이 사용되는 명령어인데, proxy 환경에서 사용하기 위해서는 설정 파일을 별도로 생성하여 설정해주어야 한다.

우선, /etc/apt/apt.conf 파일을 nano에디터를 사용해서 신규로 생성해준다.
(기존에 설정 파일이 있는 경우에는 그냥 그 파일을 오픈)

>> sudo nano ./apt.conf


Acquire::http::Proxy "http://Username:Password@proxy.foo.bar.edu.au:8080";
Acquire::ftp::Proxy "ftp://Username:Password@proxy.foo.bar.edu.au:8080";
Acquire::https::Proxy "https://Username:Password@proxy.foo.bar.edu.au:8080";

위의 내용을 작성 후 저장하면 완료!!!

마지막 부분에 세미콜론 잊지말것.

우분투에서 Proxy 설정하기

 proxy 서버의 설정.. (사내의 경우 proxy 서버를 사용하기 때문에.. proxy서버 설정을 한다.)
1 Firefox 에서 proxy 서버의 설정
Firefox 실행 -> Edit -> Preference -> Advanced -> Settings -> Automatic proxy configuration URL
http://168.219.61.251:8088/samsungcs.pac 이라고 입력후 저장.

2 /root/.bashrc 파일 수정
/root.bashrc 파일에.. 
export http_proxy="http://168.219.61.250:8080"
export ftp_proxy="http://168.219.61.250:8080" 으로 입력 후 저장.. (적용시키려면.. source ./.bashrc 를 입력)

3. 시냅틱 꾸러미관리자에서 http, ftp proxy정보를 수정
    
4 (이건안해도 되는데..) /etc/apt/apt.conf 파일의 수정
만약 file이 없으면 새로 생성한다. 파일 생성후 아래와 같이 입력후 저장..
Accuire::http::Proxy "http://168.219.61.251:8080" 입력후 저장 또는
Accuire {
Retires "0";
HTTP {
};
}; 입력후 저장..




2016년 4월 29일 금요일

The Best Way to Learn Python - 파이썬 강좌를 통한 공부 방법

원문 : The Best Way to Learn Python - Tuts+ Code Article(참조를 위해 최소한으로 요약 번역하였으니 원문을 꼭 참조하세요!)
파이썬은 이전보다 더 인기있으며, 백엔드 웹서버에서 프론트엔드 게임 개발까지 어디서나 사용되고 있다. 파이썬은 정말 일반적인 목적의 언어이며 자존심있는 프로그래머의 무기 중 필수 툴이다.

임무 1: 기초에서 시작하라

두 가지 버전의 파이썬이 있다: 파이썬 2.7과 파이썬 3.4. 어느 것을 선택할지는 크게 중요하지 않다. 입문자에게는 특히, 차이점이 미미하다. 알아야 한다면, 파이썬 2는 서드파티 지원이 훨씬, 훨씬 더 많고, 파이썬 3는 언어를 설계하는 것이 개발자들의 주요 초점이다.

Wikibooks’ Non-Programmers Tutorial for Python

위키북스는 새로운 것을 배우는 훌륭한 소스이며, 파이썬도 예외는 아니다. 너무 기술적이지 않고 유용하고 보람있는 무언가를 바로 코딩할 수 있다.

The Official Python Tutorial

python.org의 공식 문서보다 더 나은 정보 소스를 찾을 수 없을 것이다. 그러나, 바로 뛰어들기를 원한다면, 시작하기에 베스트 장소는 아닐 것이다. 위키북스보다 더 기술적이며, 언어를 숙달해갈 때 나중에 도움이 된다.
초보자에게는 파이썬 2와 파이썬 3의 가장 큰 차이점은 파이썬 2는 괄호없이 print를 사용할 수 있고, 파이썬 3는 괄호가 있어야 한다. 그게 다다.

임무 2: 튜토리얼과 스크린 캐스트

TheNewBoston’s Python Programming Tutorials

강사가 재미와 듣기 쉬움을 균형있게 전달한다. 프로그래밍에 지식이 없어도 된다.

Nettuts+’s Python from Scratch

프로그래밍 경험없이도 장고를 이용한 다이내믹 웹사이트를 만들게 해준다.

ShowMeDo’s Python Screencasts

완전초보부터 중급까지의 파이썬 테크닉과 관련된 비디오 카탈로그가 아주 많다.

Build a Python Bot That Can Play Web Games

완전 초보에게 추천하지는 않지만, 언급할만한 가치는 있다. 간단한 게임을 하는 파이썬 봇을 만드는 법을 보여준다. 매일 반복적인 작업에 적용할 수 있다.

임무 3: 무료 e북들!

고퀄의 무료 e북이 넘치고 있고, 아래는 그 중 베스트 목록이다.

Learn Python the Hard Way

이름과 다르게 매우 쉽게 배울 수 있다.

Think Python: How to Think Like a Computer Scientist

부제와 같이 이론적인 면을 강조한다. 완전초보에게는 약간 어렵지만 알고리즘 이론과 고급 개념에 대해 읽을 수 있다.

Invent with Python

배워서 써먹고 싶다면, 게임을 만드는 것이 좋다! 파이썬을 몰랐더라도 이 책으로 게임을 만들 수 있다.

The Django Book

웹 개발을 위해 파이썬을 배우고 싶다면, 장고 프레임워크를 사용할 것이다. 파이썬에 능숙하고 프레임워크에 초보라면 이 책이 장고를 가르쳐 준다.

PythonBooks

난이도와 주제 따른 파이썬 책에 대한 공식 위키. 한글 책도 소개되어 있다.

임무 4: 스택오버플로우와 친해져라

스택오버플로우에 초보자 에러와 문제만 있는 것은 아니다. 예로 Hidden features of Python을 한번 봐라. 정식 튜토리얼에 없는 수많은 팁과 트릭을 볼 수 있으며, 중급에서 고급 파이썬 사용자에 매우 도움되는 것이다.

임무 5: 프로젝트 오일러

Project Euler(오일러로 발음한다)에서 400 문제를 풀 수 있다. 각 문제는 대략 50%의 수학과 50%의 프로그래밍이다.
새로운 문제를 해결하면 포럼 글타래를 볼 수 있다. 이 곳에서 많은 사람들이 서로 자신의 해결책과 아이디어를 토론하고 있다. 글타래의 후반 페이지에 있는 많은 해결책이 파이썬으로 되어 있을 것이다. 이것은 정말 여러분의 프로그래밍 능력을 키우는 열쇠가 될 것이다. 여러분보다 빠른 해결책이 있다면 시간을 내서 분석하라.
파이썬으로 된 프로젝트 오일러 문제에 대한 정말 훌륭한 블로그도 있다. 배우려고 한다면, 문제에 막혀서 다른 프로그래머의 작업을 살짝 엿보는 것을 부끄러워 하지마라.

임무 6: 게임 만들기

게임을 만드는 것보다 더 만족스러운 것이 거의 없다. 가파른 학습 곡선이 될 수 있지만, 할 가치가 있고 매우 보람있다. PyGame은 가장 알려진 파이썬 게임 라이브러리이며, 무료 투토리얼도 많이 발견할 수 있을 것이다. 여기 베스트 PyGame 튜토리얼이 몇 개 있다.

Pygame 공식 문서

오리지널 파이썬 튜토리얼과 같이 PyGame 개발자도 소개 문서가 가지고 있지만 너무 기술적이다. 그러나 개발자 문서는 항상 정보의 베스트 소스가 될 것이다.

Invent With Python (With PyGame)

TheNewBoston’s Computer Game Development Tutorial

위의 가이드와는 다르게 더 요점적이지만 완전한 게임을 만들게 하지는 않는다.

임무 7: 인기 라이브러리와 툴 알기

PyPy

CPU 집중적인 작업을 하려면, 파이썬 자체로는 병목이 생기는 것을 알게되어 아마 PyPy를 필요로 할 것이다. PyPy는 처리속도를 높여줄 수 있는 파이썬의 대체 컴파일러이다.

NumPy + SciPy

보통 이 두개는 나란히 간다(SciPy가 NumPy에 의존한다). 수학적이거나 과학적인 연구를 위한 진지한 계산 처리를 한다면 이 두 개의 라이브러리는 베스트 친구가 될 것이다. NumPy와 SciPy는 파이썬의 수학적인 함수와 능력을 확장해주고 작업들을 엄청나게 가속할 수 있다.

BeautifulSoup

BeautifulSoup은 정말 아름답다. 정보를 얻기위해 HTML 페이지를 긁어야 할 필요가 있다면 가져오는 것이 매우 좌절스럽고 머리를 쥐어뜯는 것이라는 잘 알게 될 것이다. BeautifulSoup이 모든 것을 하고 수명 몇 년을 벌어줄 것이다. 강추한다.

Python Imaging Library

Python Imaging Library (PIL)는 이미지를 다루는 모든 일에 훌륭하다.

Django

웹 개발이 목표라면 장고 프레임워크를 사용하게 될 것이다. 가장 널리 알려진 웹 프레임워크이며 학습 리소스도 가장 많다.

임무 8: 오픈소스 프로젝트에 관여하라

언어를 파악하고나면 다른 사람의 코드를 읽고 이해하는 것이 언제나 중요한 스킬이다 - 말할 것도 없이, 배우는 훌륭한 방법이기도 하다. 오픈소스 프로젝트들이 좋다. 다른 사람이 여러분의 코드를 판단하는 것을 걱정하지마라. 당장 공헌해야할 필요도 없다. 개선할 무언가를 봤다면, 훌륭하다! 개선사항을 제출하라. 오픈소스의 존재 이유이다.

참고 링크

2016년 4월 28일 목요일

[MFC] Thread(쓰레드)에서 Dialog의 UpdateData()사용하는 방법

다이얼로그 사용시특정동작을 실행하면 특정동작이 돌아가는 동안 다이얼로그가 먹통이 됩니다. 이를 해결하기 위해 쓰레드를 사용하게되는데 이때 쓰레드 안에서 바로 UpdateData함수를 사용하면 에러가 발생합니다. 이를 해결하기 위해 윈도우에 메세지로 UpdateData를보내서 다이얼로그의 변경값을 실시간으로 변경하게 할 수 있습니다.

-- 소스 -- 
header 부분에 추가
#define THREAD_UPDATE ( WM_USER +1 )  //메세지 값으로 WM_USER +1 이값이 아니어도 상관은 없습니다.

*Thread가 돌아가며 사용하는 UpdateData함수의 모든 Dlg 클래스에 추가해야 한다.
해당 Dlg의 h부분에 추가
class ThreadDlg 
{
...
afx_msg LRESULT OnThreadUpdate(WPARAM w, LPARAM l); //USER_MSG_TEST 메시지를 받아 실행하게되는 함수 정의이다. 함수형과 이름은 바꿔도 상관없지만 변수부분은 그대로 유지하도록 한다.
...
}

ThreadDlg 의 cpp 부분에 추가
BEGIN_MESSAGE_MAP(CCMDLLDlg , CDialog)
...
 ON_MESSAGE (THREAD_UPDATE , OnThreadUpdate)  //여기에 메시지 ID 값과 함수 이름을 넣는다. 해당 ID로 메시지가 오면 해당 함수을 실행하게 된다.
...
END_MESSAGE_MAP()
 
메시지로 실행될 함수부분 추가
//헤더파일에 정의된 함수를 작성한다.
LRESULT ThreadDlg::OnThreadUpdate(WPARAM w, LPARAM l)
{
  UpdateData(TRUE);  
//이 부분에서 다이얼로그를 업데이트한다.
  return 0;
}

실재 쓰레드 안에서는 해당 다이얼로그의 포인터를 이용하여
m_dlg->UpdateData(TRUE);
하던 것을
m_dlg->PostMessage(THREAD_UPDATE ,0,0); //뒤의 두값이 메시지로 넘어가는 변수 w와 l이다. 
또는
m_dlg->SendMessage(THREAD_UPDATE ,0,0);
위의 PostMessage와 SendMessage는 실행시간에 약간의 차이가 있어 PostMessage를 사용할 경우 정상동작이 이루어 지지 않을 수 있다. PostMessage() 의 경우 Message 처리 결과를 기다리지 않고 복귀하고, SendMessage() 의 경우 처리를 완료한 후에 다음 진행이 이루어 진다.

위의 함수를 멤버함수로 만들어 간편하게 사용이 가능하다.
void ThreadDlg::myUpdateData(BOOL enable)
{
  SendMessage(THREAD_UPDATE ,enable,0);

}
LRESULT ThreadDlg::OnThreadUpdate(WPARAM w, LPARAM l)
{
  UpdateData(w);  
//이 부분에서 다이얼로그를 업데이트한다.
  return 0;
}