유용링크들

101가지 문제풀기 연습



random 관련


0이상 20미만의 int 10개 배열 만들기

> a = np.random.randint(20, size=10)

array([17, 12,  4, 18, 11, 15,  5, 19, 19, 18])



5행3열의 array를 만들고 그 값들을 5~10 사이의 랜덤한 숫자로 채우고 싶을때

np.random.uniform(5, 10, size=(5,3))

#> [[ 8.50061025  9.10531502  6.85867783]

#>  [ 9.76262069  9.87717411  7.13466701]

#>  [ 7.48966403  8.33409158  6.16808631]

#>  [ 7.75010551  9.94535696  5.27373226]

#>  [ 8.0850361   5.56165518  7.31244004]]


위를 소수점 3째자리 까지만 나오도록 하고 싶으면

> np.set_printoptions(precision=3) 하면됨(글로벌 적용이라 그 이후에 출력하는데는 다 공통적으로 적용됨)


e-04와 같은 scientific notation을 제거하고 싶으면?

> np.set_printoptions(suppress=True) 하면 된다.



array관련

> np.arange(10) 하면 array([0,1,2,3,4,5,6,7,8,9]) 가 만들어 진다.



> arr = np.arange(10) 한다음


> arr[arr%2 == 1] 하면 array([1,3,5,7,9])가 리턴된다. (조건문을 인덱스 부분에 넣을 수 있다는 것. 그냥 python list로는 안되는 부분)


> arr[arr%2 == 1] = -1 하면 arrary([0,-1,2,-1,4,-1,6,-1,8,-1]) 이 만들어진다. 조건문으로 인덱스 조회가 되는것 뿐 아니라 assign과 연결시킬수도 있다.


> arr *= -1 하면 array([0,-1,-2,-3,-4,-5,-6,-7,-8,-9])가 만들어진다. (element에 대한 연산을 저런식으로 할 수 있다는것.. python list로는 다른 의미가 되어버리니 주의할 것)



np.where 사용하기

> a = np.array([1,2,3,2,3,4,3,4,5,6])

> b = np.array([7,2,10,2,7,4,9,4,9,8])


값이 같은 인덱스만 추리고 싶으면?

> np.where(a == b) 하면된다.

> array([1,3,5,7])이 리턴된다.




반응형

'Programming > Python' 카테고리의 다른 글

pudb  (0) 2018.11.15
Anaconda & Jupyter  (0) 2018.03.23
python virtualenv 가상환경  (0) 2017.11.16
python에서 doxygen 사용해보기  (0) 2017.11.14
python import  (1) 2017.11.14

ocx 프로그래밍을 하다가, visual studio 버전을 올리다 보면, 

ocx가 포함된 dialog를 열다가 exception이 나는데 알고 보면 occcont.cpp의 925번째 라인 오류라고 나올 때가 있다.


나의 경우는 빈번하게 발생해서 여기에 적어둔다.


해결책은 command line으로 가서 해당 ocx를 

regsvr32 /u my_ocx.ocx 이런식으로 unregister해주고 나서 

regsvr32 my_ocx.ocx 이런식으로 다시 register해주면 된다.


관리자 권한이 아닐경우 친절하지 않게 이상한 오류가 발생할 수 있으니 반드시 comand 창을 관리자 권한으로 열자

반응형

'Programming > Visual studio' 카테고리의 다른 글

visual studio 단축키  (0) 2017.11.12

sudo su로 먼저 root권한을 얻는다.


firewall-cmd --permanent --zone=public --add-port=80/tcp  이걸로 원하는 리슨포트를 추가한다.
firewall-cmd --reload 이거 해주면 반영 된다.

설정된 값 확인은
vi /etc/firewalld/zones/public.xml 이걸로 할 수 있다.


CentOS 6는 아래 확인

https://blog.miyam.net/7



반응형

'Programming > Linux' 카테고리의 다른 글

crontab  (0) 2019.09.27
리눅스 계정 관리  (1) 2019.09.19
리눅스 port 확인  (0) 2017.12.04
sudo 관련  (1) 2017.11.07
디스크/폴더 사용량, 남은용량 확인  (0) 2017.11.07

서버의 특정 포트가 열려있는지 확인하려면 다음 명령어를 사용하면 된다 


nc

예전에는 nc -z가 유용했는데 -z옵션이 없어져버림

nc -z 대신에 nc --send-only </dev/null  {ip} {port} 하면 connect 여부를 확인할 수 있다.

바로 다음 커멘드라인 떨어지면 connect 성공한거고 connect가 안되면 hang이 걸린다.


nc -v {ip} {port} 이걸로 되는것 같기도 하다.


nmap

nmap -Pn -p80 naver.com


위처럼 하면 naver.com에서 80포트가 열려있는지 확인할 수 있다.

열려있다면 다음처럼 보인다.


$ nmap -Pn -p80 naver.com


Starting Nmap 7.01 ( https://nmap.org ) at 2017-12-04 13:26 KST

Nmap scan report for naver.com (125.209.222.142)

Host is up (0.0044s latency).

Other addresses for naver.com (not scanned): 202.179.177.21 202.179.177.22 125.209.222.141

PORT   STATE SERVICE

80/tcp open  http


Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds



위에서 open 또는 closed로 겁색되면 접근자체는 되는것인데 filtered로 검색되면 방화벽 등에서 접근을 차단한 것이다!


telnet


telnet naver.com 80

반응형

'Programming > Linux' 카테고리의 다른 글

crontab  (0) 2019.09.27
리눅스 계정 관리  (1) 2019.09.19
CentOS 7 방화벽  (0) 2017.12.04
sudo 관련  (1) 2017.11.07
디스크/폴더 사용량, 남은용량 확인  (0) 2017.11.07

다음의 문제를 생각해보자.

배열이 하나 주어진다.

{3, -2, 5, 7, -3, 1}


이 때 이 배열의 일부 원소를 더해서 0이 되는 경우가 있는지 알아내는 프로그램을 작성한다고 해보자.

위 배열에 대한 답은 True이다 {-2, 5, -3}을 부분집합으로 취해 더하면 0을 만드는 것이 가능하기 때문이다.


subset sum 문제는 NP-complete 문제중 가장 단순한 형태로서, brute-force 이외에 P솔루션이 존재하지 않는다.

brute-force의 시간 복잡도는 모든 부분집합을 구해서 더해보는 것이기 때문에 $O(2^n)$이 된다.

다만, dynamic-programming을 쓸 경우, 반복계산을 cache하는 방법으로 수행속도를 빠르게 할 수 있으나 바로 그 cache한다는 속성 때문에 n의 범위가 커지면 메모리 초과로 쓸 수 없다.



오늘은 subset sum문제를 푸는 세 가지 방법을 검토해보자.


첫번째 방법은 재귀를 이용해서 푸는 방법이다.

bool go(vector<int>&v, int ix, int cur_sum, int count)
{
    if(ix==(int)v.size())
    {
        if(cur_sum==0&&count>0) return true;
        return false;
    }
    bool r1 = go(v, ix+1, cur_sum+v[ix], count+1);
    bool r2 = go(v, ix+1, cur_sum, count);
    return r1 || r2;
}

bool recursive(vector<int>& v)
{
    return go(v, 0, 0, 0);
}



두번째 방법은 binary operation을 사용해 재귀없이 loop 로 푸는 방법이다.

bool naive(vector<int>& v)
{
    int n = (int)v.size();
    for(int i=1;i<(1<<n);i++)
    {
        int s = 0;
        for(int j=0;j<n;j++) if((1<<j)&i) s+=v[j];
        if(s==0) return true;
    }
    return false;
}


위 두 가지방법은 시간 복잡도가 $O(2^n)$이기 때문에 n이 20만 넘어도 너무 느려져서 쓸 수 없게 된다.


다음 세번째 방법은 dynamic programming(이하 dp)을 사용해서 푸는 방법이다.

bool dp(vector<int>& v)
{
    map<int, bool> m, m2;
    for(int i=0;i<(int)v.size();i++)
    {
        m2 = m;
        for(auto it=m.begin();it!=m.end();it++)
        {
            m2[it->first + v[i]] = true;
        }
        m2[v[i]] = true;
        m = m2;
    }
    if (m[0]) return true;
    return false;

}


위의 세번째 방법은 n의 범위가 너무 크지 않은 경우 상당히 빠른시간을 보장한다($O(n \times m)$)

m은 n의 범위(최대값)이 되겠다. 최대값이 작은 경우는 다항시간에 가까운 실행시간을 보장한다.


testcase를 포함한 전체 소스코드는 다음과 같다.


반응형

참고사항: python3.3부터는 venv를 공식지원하므로 가능하면 venv사용을 먼저 고려하는게 좋음

 

virtual environment가 필요한 이유

이거 없으면, 한 PC에서 여러프로젝트 운영할려고 할때 꼬임

프로젝트마다 python2, python3사용여부가 다르거나, 필요한 라이브러리 버전이 다르거나 할 때, 

여러개의 파이썬 프로젝트가 하나의 컴퓨터에서 충동을 일으키지 않고 존재할 수 있도록 도와줌

 

virtual environment 동작 원리

여기서 환경이란 파이썬 프로그램을 실행시키는데 필요한 모든것의 복사본을 가지고 있는 단순한 폴더입니다. 

전체 파이썬 스탠다드 라이브러리 복사본, pip 설치 프로그램 복사본, 그리고 site-packages 복사본 등을 포함. 

pip install을 사용하면, virtualenv 폴더 내부의 site-packages 폴더에 이를 설치합니다. 

 

virtualenv 설치하기

# sudo pip3 install virtualenv virtualenvwrapper

pip와 virtualenv는 일반적으로 글로벌 설치가 되어야하는 유일한 패키지입니다. 

이 두개를 설치하고 나면 나머지 패키지들은 가상 환경에 설치하면 되기 때문입니다.

virtualenvwrapper는 virtualenv를 사용하기 쉽게 만들어주는 추가 툴이라고 보면 됨

 

virtualenvwrapper를 위한 추가 설정

여기가 약간 골때림 1회성작업이긴 하지만, ~/.bashrc에 다음 5줄을 추가해주고 source ~/.bashrc해줘야 mkvirtualenv 커맨드가 먹음

virtualenvwrapper를 사용하지 않아도 가상환경사용은 가능하지만, 사용하기 직관적이지 않아 비추

 

export WORKON_HOME=~/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin

 

위 과정에서 no module named virtualenvwrapper 라는 오류가 나면 위의 sudo pip3 를 sudo pip로 해서 다시해본다.

혹은 sudo ln -sf /usr/bin/python3 /usr/bin/python 으로 기본 python 버전을 2에서 3으로 바꿔준다.

python3를 사용하는 virtual environment 만들기

프로젝트 루트 폴더(예를 들면 ~/workspace)로 이동후 아래처럼 하면 python3를 기본으로 하는 env라는 이름의 virtual environment가 만들어 진다.

# mkvirtualenv -p python3 env_name

이렇게 하면 ~/.virtualenv/env_name 여기에 환경이 만들어진다.

지울때는 rmvirtualenv env_name 하면 된다.

 

 

virtual environment에 진입하기

# workon env_name (coin) #

빠져 나올때는 deactivate 하면 된다.

 

requirements.txt관련해서는 여기참조

 

numpy에러나면 다음 명령어 수행(라즈베리파이의 경우)

sudo apt-get install libatlas-base-dev

 

반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python에서 doxygen 사용해보기  (0) 2017.11.14
python import  (1) 2017.11.14
python 시간관련 함수  (0) 2017.10.31

머릿말

doxygen을 사용하면, 프로젝트의 전반적인 내용을 파악할 수 있는 document가 자동 생성된다.

doxygen을 오랜만에 사용해보고, 게다가 c/c++ 프로젝트가 아닌 python project에 사용해보는건 처음이라 그 과정을 적어본다.

전체 과정은 https://www.stack.nl/~dimitri/doxygen/manual/starting.html 이곳을 참조했다


독시젠 설치

먼저 doxygen을 설치하자, 


CentOS면 sudo yum install doxygen

Ubuntu면 sudo apt-get install doxygen

macOS면 brew install doxygen

이런식으로 간단하게 설치가 가능하다.


독시젠 configuration

독세젠을 돌리려면 먼저 configuration file을 만들어야 한다.


doxygen -g 라고 하면 Doxyfile 이라는 configuration 파일이 만들어진다. (에디터로 열어서 수정 가능하다)


주의할점: Doxyfile을 열어서 EXTRACT_ALL = NO를 YES로 변경해야 결과가 제대로 나온다.

(If the EXTRACT_ALL option is set to NO in the configuration file (the default), then doxygen will only generate documentation for documentedentities.)


독시젠 돌리기

간단하게

doxygen 이라고만 하면 자동으로 결과가 생성된다.


독시젠 생성 결과물 보기

html/index.html을 열어보면 결과를 확인할 수 있다.


여기까지만 해도 좋지만, graphviz를 설치하여 call graph를 추가하고, 여러가지 추가 옵션을 줘보자.


결과에 call graph 추가




위와 같은 call graph를 결과물에 포함시키기 위해서는, 먼저 graphviz라는 툴을 설치해야한다.

macOS의 경우 brew install graphviz로 설치 가능하다.


그다음 Doxyfile을 다시 열어서 아래 내용을 수정해준다.


-그래프 설정
CALL_GRAPH             = YES
CALLER_GRAPH           = YES


- Graphviz 바이너리 위치 설정
DOT_PATH               = /usr/bin/graphml2gv
HAVE_DOT               = YES

(위 graphml2gv 경로설정은 which graphml2gv 명령어를 통해서 확인한 다음에 넣으면 된다.)

- 클래스 상속 구조 포함
CLASS_DIAGRAMS          = YES

- 그래프를 text가 아니라 그래픽 버전으로 보여줌
GRAPHICAL_HIERARCHY     = YES 


- 대상 폴더의 하위 폴더도 대상으로 지정
RECURSIVE              = YES

- 생성되는 doc 파일이 많아지므로 하위폴더 생성
CREATE_SUBDIRS         = YES

- 문서에 구현 소스도 포함
INLINE_SOURCES         = YES

- 문서에 소스파일 추가 (Files에서 조회 가능)
SOURCE_BROWSER         = YES


(위 내용은 http://heavensbus.blogspot.kr/2014/07/doxygen-call-caller.html 이곳을 참조했습니다.)


반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python virtualenv 가상환경  (0) 2017.11.16
python import  (1) 2017.11.14
python 시간관련 함수  (0) 2017.10.31


현재 위치가 ./ 이고 내가 정의한 클래스의 위치가 ./home/test.py에 있다고 해보자.

그리고 그 클래스의 이름이 다음과 같이 Foo로 정의되어 있다고 하자.

1
2
3
class Foo(object):
 
    pass

이때 ./위치에서 이 클래스를 가져다 쓰려면 다음과 같이 여러가지 방법이 있다.

(python2.x의 경우 주의할 점은 home 폴더 안에 __init__.py 파일이 dummy로 라도 생성되어 있어야 한다.)

방법1

1
2
3
import home.test
 
f = home.test.Foo()

 

방법2

1
2
3
from home.test import Foo
 
f = Foo()

 

방법3

1
2
3
from home import test
 
f = test.Foo()

 

방법4

1
2
3
import home.test as t
 
f = t.Foo()

 

 

일반적으로는 방법2가 가장 편리하다. 단 Foo말고 다른 것도 많을 경우 하나씩 지정해주기가 힘들다. 이때는 import Foo 대신 import *를 해주는 방법이 있다.


방법4도 편할 수 있다. 단 import를 import home.test.Foo as F 처럼 class단위까지 바로 할 수는 없다.



반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python virtualenv 가상환경  (0) 2017.11.16
python에서 doxygen 사용해보기  (0) 2017.11.14
python 시간관련 함수  (0) 2017.10.31

기본적인 fast forward merge와 3-way merge에 대해서는 http://devyongsik.tistory.com/624 여기를 보면 이해가 쉬웠다.


정리하자면, 둘 간의 차이점은 전자는 merge로 인한 추가 commit node가 발생하지 않는데, 후자는 발생한다는 점이고


이를 좀 더 쉬운말로 표현하면 fast forward merge가 발생할때에는 history를 볼때 branch 딴 것에 대해서 시각적으로 쉽게 확인이 안된다는 점이다.


https://i.stack.imgur.com/FMD5h.png


no-ff 옵션 자체에 대해서는 https://stackoverflow.com/a/21717431/208397 이 링크가 가장 이해하기 쉬웠다.




반응형

'Programming > Git' 카테고리의 다른 글

git 초기설정  (1) 2023.06.06
git log  (0) 2019.12.09
git 자주 쓰는 명령어 모음  (0) 2019.09.27
git branch 관련  (0) 2019.04.17
github  (0) 2018.11.07

ctrl+k, o : .cpp 파일에서 매칭되는 .h(header)파일로 이동

반응형

'Programming > Visual studio' 카테고리의 다른 글

occcont.cpp line 925 (ocx loading 오류)  (0) 2017.12.17

+ Recent posts