• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'Programming'에 해당되는 글 147건

  • 2021.09.13 linux 에서 file i/o (fcntl.h , unistd.h 사용)
  • 2021.08.06 pycharm 에서 인덱싱 제외 폴더를 설정하자
  • 2021.07.15 std::vector 에서 argmax, argmin 값을 계산하자.
  • 2021.07.02 string 앞에 0 또는 문자를 삽입하여 길이를 맞추자
  • 2021.06.18 설치된 라이브러리 리스트를 requirements.txt 로 만들자.
  • 2021.05.28 비주얼 스튜디오 버전 정리 (VS/VC)
  • 2021.05.06 문자열 인코딩 변경하기
  • 2021.04.29 폰트 변경이 가능한 putText를 사용하자
  • 2021.04.13 반올림은 반올림이 아니다? round의 처리 방법
  • 2021.04.13 float 값의 비교 (== 연산자는 위험하다!)
  • 2021.04.01 tqdm 과 enumerate
  • 2021.03.10 Call by Value? Call by Reference??
  • 2021.02.25 google drive web client 사용량 제한
  • 2021.02.04 특정주소가 폴더(디렉토리)인지 파일인지 확인하자
  • 2021.01.19 python2.X 에서 opencv-python을 설치하자
  • 2021.01.11 list에서 중복 내용을 제거하자
  • 2020.12.14 os에 따른 기본 파일 인코딩 형식
  • 2020.12.01 데이터와 인덱스를 알려주는 enumerate
  • 2020.11.10 MFC Dialog 에서 enter, esc 동작을 제어하자
  • 2020.11.10 하위폴더 포함, 폴더 전체를 복사하자

linux 에서 file i/o (fcntl.h , unistd.h 사용)

Programming/C, C++, MFC 2021. 9. 13. 13:49




fcntl 은 file control 관련 기능이

unistd 는 유닉스의 c 컴파일러 헤더파일로 윈도우에서는 사용되지 않는 파일이다.

 

std의 fopen 등등의 기능도 있지만 여기서는 fcntl.h / unistd.h 의 open, read, 등의 기능을 정리.

 


1. 파일 열고 닫기

#include <fcntl.h>

// int open(const char* pathname, int flags[, mode_t mode]);
// int close(int fd);

// 사용 예
fd = open("./dummy.dat", O_RDONLY);
close(fd)

 

2. 내용 읽고 쓰기

#include <unistd.h>

// ssize_t read(int fd, void* buf, size_t nbytes);
// ssize_t write(int fd, const void* buf, size_t nbytes);

// 사용 예
#define SIZE = 100
char buf[SIZE];

data = read(fd, buf, SIZE);
write(fdd, buf, SIZE);
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

pycharm 에서 인덱싱 제외 폴더를 설정하자

Programming/Python 2021. 8. 6. 11:07




pycharm 을 이용하다 보면 프로젝트 폴더에 있는 파일에 대해 인덱싱을 수행한다. 

파일 수가 얼마 없을때는 금방 끝나지만 프로젝트 폴더 안에 파일이 많거나 

수행 결과물이 대량으로 생성되는 경우에는 다시 인덱싱을 수행하느라 CPU도 엄청 잡아먹고

인덱싱 중에는 또 실행도 안되는 문제가 있다.

 

그래서 DB 폴더나 출력폴더와 같이 별도의 인덱싱이 필요하지 않은 폴더를 제외하는 방법을 기록


1. File - Settings - Project - Project Structure 

2. 프로젝트 폴더 중 제외 할 폴더를 선택

3. 상단의 Mark as: 항목 중 Excluded 를 선택.

 

위 과정을 거치면 제외될 폴더가 structure 에서 붉은색 아이콘으로 excluded 되고 

해당 폴더 내의 파일은 인덱싱에서 제외 된다.

저작자표시 (새창열림)

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

warning 을 on/off 하자  (0) 2022.01.20
python version에 따른 pickle 버전 정리  (0) 2021.10.06
string 앞에 0 또는 문자를 삽입하여 길이를 맞추자  (0) 2021.07.02
설치된 라이브러리 리스트를 requirements.txt 로 만들자.  (0) 2021.06.18
반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

std::vector 에서 argmax, argmin 값을 계산하자.

Programming/C, C++, MFC 2021. 7. 15. 15:44




데이터를 다루다 보면 min, max 값 뿐만 아니라 해당 값의 index, 즉, argmin-max 가 궁금할 때가 있다

파이썬에서는 argmin, argmax 함수가 있어 계산하기 간단하지만 C++에서는 해당 함수가 없다

 

대신 사용할 수 있는 방법이 있어서 기록


vector<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(9);
v.push_back(0);
v.push_back(5);


// max
int nMax = *max_element(v.begin(), b.end());
// 9

// min 
int nMin = *min_element(v.begin(), b.end());
// 0

// argmax
int nArgMax = max_element(v.begin(), b.end()) - v.begin();
// 2

// argmin 
int nArgMin = min_element(v.begin(), b.end()) - v.begin();
// 3
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

linux 에서 file i/o (fcntl.h , unistd.h 사용)  (0) 2021.09.13
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

string 앞에 0 또는 문자를 삽입하여 길이를 맞추자

Programming/Python 2021. 7. 2. 11:06




string을 사용하다 보면 내용 앞에 특정 값을 삽입하여 전체 문자열의 길이를 맞춰야 할 경우가 있다

 

그럴 경우 사용 가능한 함수 정리

 


1. zfill(width)

# zfill 은 자리수에 맞춰 0값으로 채워준다

> "123".zfill(5)
# "00123"

> "1".zfill(4)
# "0001"

 

2. rjust(width, fillchar)

# rjust 은 자리수에 맞춰 fillchar값으로 채워준다

> "123".rjust(5, '0')
# "00123"

> "1".rjust(4, '0')
# "0001"

> "123".rjust(5, 's')
# "ss123"

> "1".rjust(4, 's')
# "sss1"
저작자표시 (새창열림)

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

python version에 따른 pickle 버전 정리  (0) 2021.10.06
pycharm 에서 인덱싱 제외 폴더를 설정하자  (0) 2021.08.06
설치된 라이브러리 리스트를 requirements.txt 로 만들자.  (0) 2021.06.18
반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
tqdm 과 enumerate  (0) 2021.04.01
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

설치된 라이브러리 리스트를 requirements.txt 로 만들자.

Programming/Python 2021. 6. 18. 16:20




github 등 외부에서 작성된 코드들을 보다보면 requirements.txt 파일을 종종 보게 된다

이는 해당 코드 동작에 필요한라이브러리 목록을 적어 둔 것으로 

이 파일을 읽어 모든 라이브러리를 한번에 설치하는것이 가능하다. 

 

이러한 사용중인 설치된 라이브러리 목록을 requirements.txt로 만드는 방법 정리.

 


패기지 목록을 생성하기 위해서는 freeze 라는 명령어를 사용한다.

 

# > 는 결과물을 파일 등으로 출력할 때 사용.
>> pip freeze > requirements.txt

 

하지만 이렇게 출력하니 버전이 올바르게 출력된 패키지도 있는 반면

일부 패키지는 버전 정보가 올바르게 표현되지 않는 경우도 있었다.

# 예시
matplotlib @ file:///C:/ci/matplotlib-base_1597858387645/work
numpy==1.20.2

 

이러한 현상을 방지하기 위해서는 아래와 같이 list를 출력하여 사용하면 위와같은 문제가 발생하지 않는다.

>> pip list --format=freeze > requirements.txt

# 출력파일 예시
matplotlib==3.3.1
numpy==1.20.2

추가로 requirements.txt. 에 정의된 라이브러리를 일괄 설치하기 위해서는 아래와 같이 사용한다.

>> pip install -r requirements.txt
저작자표시 (새창열림)

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

pycharm 에서 인덱싱 제외 폴더를 설정하자  (0) 2021.08.06
string 앞에 0 또는 문자를 삽입하여 길이를 맞추자  (0) 2021.07.02
반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
tqdm 과 enumerate  (0) 2021.04.01
Call by Value? Call by Reference??  (0) 2021.03.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

비주얼 스튜디오 버전 정리 (VS/VC)

Programming/C, C++, MFC 2021. 5. 28. 14:26




 

Visual Studio version VC version
Visual Studio 6.0 VC 6.0
Visual Studio 2005 VC 8.0
Visual Studio 2008 VC 9.0
Visual Studio 2010 VC 10.0
Visual Studio 2012 VC 11.0
Visual Studio 2013 VC12.0
Visual Studio 2015 VC 14.0
Visual Studio 2017 VC 15.0
Visual Studio 2019 VC 16.0

 

저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

linux 에서 file i/o (fcntl.h , unistd.h 사용)  (0) 2021.09.13
std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

문자열 인코딩 변경하기

Programming/C, C++, MFC 2021. 5. 6. 09:55




문자열을 다루다 보면 인코딩을 변경해야 하는 일이 발생한다.

 

전통적인 방식의 ansi 와 멀티바이트 방식인 유니코드, utf-8 등등 다양한 인코딩 방식이 존재하지만

이들간 변환이 간단하지는 않다

(std::string이 아닌경우 C++ 에서 ansi 는 char*로, 유니코드는 wchar_t*로, utf-8은 char* 형으로 사용한다.)

 

또한 ansi에서 utf-8로는 다이렉트 변환도 안되서 유니코드로 변경했다 다시 바꿔주는 등 불편함이 많다.

 

그래서 MS에서 사용하기 편하게 정의해둔 기능을 사용하기로 하자.

 


우선 아래 기능을 사용하기 위해서는 atlstr.h 를 추가해 줘야 한다.

이 헤더를 추가하면 MFC 사용 안하고도 CString도 사용 가능하다.

 

대략적인 사용법은 아래와 같다.

 

wstring strUni = CA2W("멀티바이트를 유니코드로 변환");
string strMulti = CW2A(L"유니코드를 멀티바이트로 변환");
string strUTF8 = CW2A(L"유니코드를 UTF8로변환",CP_UTF8);

// string에서 포인터 얻어오는게 c_str()이듯.
// CA2W나 CW2A에서 포인터 얻어오는건 m_psz 이다..
// 그리고 CA2W CW2A는 기본적으로 CString 즉 (CAtlString)에 기반을 두고 고 있기때문에
// CString를 사용할때 가장 빠른다!!.
// 만약 멀티 플레폼을 기준으로 한다면 CA2W는 사용 못함!
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

폰트 변경이 가능한 putText를 사용하자

Programming/OpenCV 2021. 4. 29. 16:45




opencv 를 이용하여 이미지에 글씨를 써서 디스플레이를 하는 경우가 종종 있었다.

이 와중에 또 출력은 한글과 영어를 둘 다 써야해서 이전에 정리한 방법으로 꾸역꾸역 쓰고 있었다.

이전 방법 : [Function] IplImage 에 한글text 삽입하기 (https://jangjy.tistory.com/60 [살다보니..])

 

한글을 사용하려면 위 방법을 사용하는 것 말고는 방법을 찾지 못했다.

하지만 이 방식의 경우 구버전의 IplImage를 사용하면서 opencv 버전이 올라가면 점점 사용이 불가능해져

opencv 버전을 강제로 3.4.0 버전을 사용하게 만든 주범이었다.

 

반대로 putText를 사용하면 폰트 변경은 가능하나 한글 출력이 불가능했고..

DC에 draw 하는 방식 또한 맘에 들지 않았다..

 

그러다 freetype 이라는 녀석을 이용하여 출력이 가능함을 알고 이와 관련한 내용을 정리.

대부분의 내용은 황선규님의 블로그에 정리된 내용을 참고하였다. (kkokkal.tistory.com/1325)

 

주요 내용을 정리하자면

  • opencv3.2 부터 freetype 모듈을 contrib 프로젝트를 통해 지원했다는것
  • 이를 위해서는 freetype과 harfbuzz 라이브러리를 미리 컴파일 한 후 opencv에서 포함하여 재빌드 해야한다는 것. 

이 두가지가 주요 골자였다. 추후 재사용을 위해 주요 내용을 메모..


 

1. freetype 라이브러리 빌드.

freetype 은 폰트 렌더링 라이브러리 라고 한다. 이런 라이브러리도 오늘 처음 알았다..

https://download.savannah.gnu.org/releases/freetype/

 

Index of /releases/freetype/

 

download.savannah.gnu.org

여기서 다운로드 받은 후 빌드. 

 

다만 이때 WITH_ZLIB, WITH_BZip2, WITH_PNG 옵션을 Off로 설정하지 않으면 opencv 빌드 단계에서 에러가 발생한다고 한다.

CMake-GUI 로 열었더니 해당 항목이 안보여서 원글에서 사용한대로 명령어를 사용하여 generate 했다.

cmake -DWITH_ZLIB=OFF -DWITH_BZip2=OFF -DWITH_PNG=OFF -G "Visual Studio 14 2015 Win64" [source root path]

 

INSTALL 빌드 시 C:\Program Files\freetype 에 파일이 복사되므로 generate 된 솔루션은 관리자 권환으로 실행 후 ALL_BUILD와 INSTALL 을 모두 빌드 해준다.

이후 환경변수에 이름은 FREETYPE_DIR, 값은 C:\Program Files\freetype 로 추가

 

2. Harfbuzz 라이브러리 빌드

이녀석은 오픈타입 텍스트 쉐이핑 엔진이라 한다.. 마찬가지로 다운로드 후 빌드..

https://www.freedesktop.org/software/harfbuzz/release/

 

Index of /software/harfbuzz/release

 

www.freedesktop.org

이녀석은 CMake-GUI 를 통해 만들었고 HB_HAVE_FREETYPE 옵션만 체크하고 나머지는 기본값으로.

마찬가지로 관리자 권한으로 실행 후 ALL_BUILD와 INSTALL 을 모두 빌드.

INSTALL 결과는 C:\Program Files(x86)\harfbuzz 에 복사되었다.

이후 환경변수 이름은 HARFBUZZ_DIR, 값은 C:\Program Files(x86)\harfbuzz 로 추가

 

3. opencv 빌드.

opencv / opencv-contrib 를 모두 다운로드 받고 압축 해제

generate 하기 전에 contrib의 모듈 중 freetype 모듈의 CMakeList.txt 파일을 수정.

수정 방법은  https://gist.github.com/UnaNancyOwen/14c72a3f10a46d41c359ab6ea307a1d2 를 참고하여 수정 했다고 했는데 다운로드 받은 opencv 버전에 따라 코드가 조금 다를 수는 있을 것 같다. 

나같은 경우도 코드 구조가 약간 달라 맞춰서 수정할까 하다가 황선규님께서 수정하신 내용을 그대로 사

용했다.

CMakeLists.txt
0.00MB

EXTRA MODULE PATH 에 contrib\module 경로 추가 해주고.. BUILD_opencv_freetype 체크하고,

BUILD_opencv_world 체크.

 

generate 후 솔루션은 마찬가지로 ALL_BUILD와 INSTALL 을 모두 빌드

 

이후 기존의 opencv 와 마찬가지로 include lib 경로 잡고 사용하면 된다.

 

 

4. freetype 사용법

#include "opencv2/opencv.hpp"
// freetype 헤더를 추가로 include
#include "opencv2/freetype.hpp"
 
using namespace cv;
// namespace도 추가해주기
using namespace cv::freetype;
using namespace std;


// FreeType2 객체 선언
Ptr<Freetype2> ft2; 

// FreeType2 객체 초기화
ft2 = createFreeType2();

// ft2객체 폰트 불러오기 
// 참고 코드에서는 바탕체를 사용했는데 이상하게 정상 동작하지 않았음.
// 원하는 폰트 동작여부 확인하고 사용하자
ft2->loadFontData("c:\\windows\\fonts\\HMFMMUEX.TTC", 0);

// 문자 출력 방법.
// 한글을 사용할때는 u8을 앞에 써서 utf-8 인코딩을 명시해줘야한다.
// 변수에 담긴 한글은 어떻게 처리하는지 조금 더 찾아보고 수정 예정.
ft2->putText(tImg, "한글변환테스트", Point(1300, 400), 20, Scalar(0, 100, 255), -1, LINE_AA, false);
ft2->putText(tImg, u8"u8 한글테스트", Point(1300, 500), 20, Scalar(0, 100, 255), -1, LINE_AA, false);
string st = "English test";
ft2->putText(tImg, st, Point(1300, 600), 20, Scalar(0, 100, 255), -1, LINE_AA, false);

> 출력결과

인코딩 명시하지 않으면 한글은 출력이 제대로 되지 않았다.

또한 변수에 담긴 한글은 어떻게 처리하는지 아직 확인하지 못함..

(원문 댓글에 값을 바로 넣는것은 확인 되나 포맷팅을 사용할 경우 어떻게 쓰는지 테스트 필요. 이는 확인 후 수정 예정.)

 

21.05.06. 수정.  link : jangjy.tistory.com/400

 

문자열 인코딩 변경하기

문자열을 다루다 보면 인코딩을 변경해야 하는 일이 발생한다. 전통적인 방식의 ansi 와 멀티바이트 방식인 유니코드, utf-8 등등 다양한 인코딩 방식이 존재하지만 이들간 변환이 간단하지는 않

jangjy.tistory.com

CW2A 기능을 이용하여 간단하게 사용 가능.

한글도 잘 출력 되는것을 확인.

저작자표시 (새창열림)

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

OpenCV FileStorage를 이용하여 xml을 읽고 쓰자  (0) 2020.10.07
jpeg 파일 디코딩하기.  (1) 2015.11.11
unsigned char* 형 버퍼를 IplImage 또는 Mat 으로 변환하기.  (0) 2014.08.18
[Function] HoG Destriptor in OpenCV  (0) 2014.01.27
[Function] 영상을 회전 시키기  (0) 2014.01.23
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

반올림은 반올림이 아니다? round의 처리 방법

Programming/Python 2021. 4. 13. 13:31




일반적으로 round는 반올림을 하는 함수로 생각하고 있었다.

5미만은 버림, 5이상은 올림을 수행하는 통계적인 반올림..

 

그러나 파이썬에서 round는 이러한 통계적 반올림을 수행하는 것이 아니란것을 알게됨.

 

그렇다면? 파이썬의 round는 0 또는 짝수에 가깝게 만드는 방향으로 수행된다.

 

예를들어 0.5, 1.5, 2.5 의 값이 있을경우 각각의 반올림 결과는

0, 2, 2 가된다. ( 1, 2, 3 이 아니고?? )

 

왜냐하면 python의 수학적 반올림 기법에서는

0 < 0.5 << 1(홀수)

1(홀수) << 1.5 < 2 (짝수)

2(짝수) < 2.5 << 3 (홀수) 

로 처리되어 1.5와 2.5의 round 결과가 동일하게 처리됨을 알 수 있다.

 

정확한 통계적 반올림 결과가 필요하다면 직접 구현이 필요할 것이고,

아니라면 round의 특성을 알고 사용해야 나중에 멘붕에 빠지지 않을수 있겠네..

 

저작자표시 (새창열림)

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

string 앞에 0 또는 문자를 삽입하여 길이를 맞추자  (0) 2021.07.02
설치된 라이브러리 리스트를 requirements.txt 로 만들자.  (0) 2021.06.18
tqdm 과 enumerate  (0) 2021.04.01
Call by Value? Call by Reference??  (0) 2021.03.10
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

float 값의 비교 (== 연산자는 위험하다!)

Programming/기타 etc. 2021. 4. 13. 11:29




일반적으로 값의 같음을 비교할떄 == 비교연산자를 사용한다.

 

실수 값의 비교에서도 아무생각없이 사용하는 경우가 많은데

실수의 같음 비교에 == 를 사용하는것은 매우 위험할 수 있다.

 

이는 float, double 과 같은 실수형 자료는 부동소수점 형태로 구현되어있어 발생하는 문제이다.

 

상식적으로는 0.1 + 0.2 == 0.3 이 수식이 틀릴 리 없는 숫자이지만

프로그램 관점에서는 값이 다를수 있다.

저 소수점 한참 아래의 오차값이 발생하기 때문이다.

 

이러한 문제를 해결하기위한 실수 비교 방법은 두가지가 있다.

 

1. 두 값의 차이를 이용한 방법

단순 비교연산자로 비교하는 방법이 아닌 두 값의 차이가 특정값(입실론으로 표현함) 이하일 경우 같은수로 판단

부동 소수점 표현의 특성상 나타나는 오차는 매우 작은 값을 가지므로 두 값의 차이가 매우 작은 값 이하라면

두 값은 같은 값이라 판단할 수 있다. 

이러한 기준이 되는 입실론의 크기는 사용하는 언어에 따라 각각 정의되어 있다.

단, 값의 대소관계를 모르기 떄문에 절대값을 취한뒤 크기를 비교한다.

 

 

2. decimal 형변환을 통한 비교

실수값을 decimal 로 형변환을 수행하면 고정소수점 방식으로 계산되어 오차를 개선할 수 있다.

이는 사용하는 언어에 따라 다를 수 있다.

 

 

이 외에도 fsum, round 등의 방법을 이용하여 보완할 수는 있지만 이들은 이들 나름의 문제점을 가지고 있어서

사용시 주의해야 한다.

 

 

사람의 기준에서는 오류가 없는 방법이지만

언젠가 크게 뒤통수 맞을 수 있는 위험을 가지고 있으니 기억해 두고 습관화 하는게 좋을것 같다.

저작자표시 (새창열림)

'Programming > 기타 etc.' 카테고리의 다른 글

[Git] github -> gitlab / repository를 이사하자  (0) 2021.12.06
[ROS] Rosbag2Video  (0) 2021.11.30
google drive web client 사용량 제한  (0) 2021.02.25
pycharm 사용 및 환경설정 팁  (0) 2019.03.18
폴더 내의 파일목록을 다뤄보자. 폴더 내 파일 리스트 만들기  (0) 2015.12.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

tqdm 과 enumerate

Programming/Python 2021. 4. 1. 15:28




data loader 등을 사용하다 보면 자주 쓰이는 tqdm과 enumerate.

 

보통 코드에 기본적으로 enumerate를 사용하게 구현되어있고 

여기에 프로그레스 정보를 보고싶어 tqdm으로 감싸주면 정보가 제대로 표시되지 않는 문제가 발생한다.

 

이 문제는 생각보다 간단한 문제로

tqdm을 겉에 두르면 이녀석이 관찰하는 데이터는 enumerate의 정보이기 떄문에 제대로 표시가 안 된 것이다.

 

해결방법은 더 간단하게 enumerage와 tqdm의 순서를 바꿔주면 된다.

 

# tqdm progress 정보 제대로 출력 X
for ii, data in tqdm(enumerate(dataset)):

# tqdm progesss 정보 제대로 출력 O
for ii, data in enumerate(tqdm(dataset)):

 

저작자표시 (새창열림)

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

설치된 라이브러리 리스트를 requirements.txt 로 만들자.  (0) 2021.06.18
반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
Call by Value? Call by Reference??  (0) 2021.03.10
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Call by Value? Call by Reference??

Programming/Python 2021. 3. 10. 16:35




python을 사용하면서 막연히 파이썬의 함수 파라메터는 call by value 방식이라고 생각했다.

 

문득 내가 쓰는 코드를 보니 왜 그렇게 짰는지도 모르겠지만 call by reference 형태로 동작하는 

코드를 짜서 쓰고있는 부분을 발견.. 

 

그럼 파이썬은 call by value야? call by reference야?.. 궁금해서 찾아본 결과는

파이썬은 call by assignment 방식 또는 call by object reference 라고 표현하더라.

 

<파이썬 알고리즘 인터뷰>  p.107, 책만, 2020

어떤 의미냐 하면 우선 파이썬의 표준타입들을 보면 여러 타입이 있지만 그 중에서 

상수(숫자), 문자열, 바이트, 튜플 이 네가지 타입은 불변 타입이고 나머지 타입은 가변타입이다.

 

파라미터로 사용될때 불변타입은 값 변경이 불가능하여 새로운 객체로 복사전달되어 call by value 처럼 동작하고,

나머지 가변타입들은 값 변경이 가능하여 call by reference 방식으로 동작하게 된다.

 

막연히 사용하던 내용인데 이 부분도 참 편하다 파이썬..

저작자표시 (새창열림)

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

반올림은 반올림이 아니다? round의 처리 방법  (0) 2021.04.13
tqdm 과 enumerate  (0) 2021.04.01
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

google drive web client 사용량 제한

Programming/기타 etc. 2021. 2. 25. 11:08




구글 드라이브의 파일을 다운받기 위해 파이썬 등을 이용하는 경우가 있다.

파일의 크기가 크지않으면 별다른 문제가 안되는것 같지만 대용량 파일을 받는 경우 문제가 발생함.

 

찾다보니 "https://drive.google.com/uc?id=~~~~~" 형태로 사용하는 파일에 직접 접근하는 방식의 경우

시간당 제한량과 하루 제한량이 있어서 접근이 차단 된 상태였다.

(물론 이 상황에서도 웹브라우저를 통해 하나씩 다운로드 하는건 가능하다..)

 

일단 제한량이 있다는 것을 알게됐으니 기록기록

 


Limit per Hour per Day
Download via web client 750 MB 1250 MB
Upload via web client 300 MB 500 MB
저작자표시 (새창열림)

'Programming > 기타 etc.' 카테고리의 다른 글

[Git] github -> gitlab / repository를 이사하자  (0) 2021.12.06
[ROS] Rosbag2Video  (0) 2021.11.30
float 값의 비교 (== 연산자는 위험하다!)  (0) 2021.04.13
pycharm 사용 및 환경설정 팁  (0) 2019.03.18
폴더 내의 파일목록을 다뤄보자. 폴더 내 파일 리스트 만들기  (0) 2015.12.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

특정주소가 폴더(디렉토리)인지 파일인지 확인하자

Programming/C, C++, MFC 2021. 2. 4. 09:03




입력으로 주소를 받았을 경우 파일인지 폴더인지에 따라 처리가 달라진다.

 

파일여부만 확인하려면 확장자를 검사하는 방법도 있겠지만

범용적으로 사용할 수 있는 방법이 있다면 더 좋겠어서 기록.

 


WIN32_FIND_DATA wInfo;
// ADDRESS_FOR_CHECK 대신 확인 하고싶은 주소 입력
HANDLE hInfo = ::FindFirstFile(ADDRESS_FOR_CHECK, &wInfo);


if (hInfo != INVALID_HANDLE_VALUE)
{
  if (wInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  {
    AfxMessageBox(_T("이 주소는 폴더입니다."));
  }
  else
  {
    AfxMessageBox(_T("이 주소는 파일입니다."));
  }
}

::FindClose(hInfo);
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python2.X 에서 opencv-python을 설치하자

Programming/Python 2021. 1. 19. 08:00




 

요즘이야 python 3.x를 보통 사용하니 별 문제가 될일이 없지만

가끔 python2.x 버전을 사용해야 하는 경우가 있다.

 

이런 환경에서 opencv-python을 설치하려 하면 버전 문제로 설치가 안되는 경우가 발생한다.

이는 opencv-python 최신 버전에서 더이상 python2버전을 지원하지 않기 때문이다.

버전 history에 관한 자세한 내용은 아래 pypi 사이트에서 확인할 수 있다.

pypi.org/project/opencv-python/#history

 

opencv-python

Wrapper package for OpenCV python bindings.

pypi.org

 

그래서 아래와 같이 python2버전을 지원하는 버전으로 지정하여 설치하면 된다.

파이썬 2버전을 지원하는 마지막 opencv-python 은 4.2.0.32 버전이다.

 

$ pip2 install opencv-python==4.2.0.32

저작자표시 (새창열림)

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

tqdm 과 enumerate  (0) 2021.04.01
Call by Value? Call by Reference??  (0) 2021.03.10
list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

list에서 중복 내용을 제거하자

Programming/Python 2021. 1. 11. 06:31




리스트를 이용하여 데이터를 관리하다 보면 중복 데이터가 발생하는 경우가 있다.

 

중복 데이터 제거가 필요한 경우를 위하여 방법 기록.

 


1. for문을 이용한 중복 제거 (순서 유지)

반복문을 이용하여 새로운 리스트에 값을 append. 이 과정에서 새로운 리스트에 값이 있으면 skip.

old_list = [1, 2, 3, 1, 3, 4, 5, 6, 7]
new_list = []

for ii in old_list:
	if ii not in new_list:
    	new_list.append(ii)

return new_list
# new_list == [1, 2, 3, 4, 5, 6, 7]

 

2. set을 이용한 중복 제거 (순서 유지 안됨)

중복데이터를 허용하지 않는 set 자료형을 이용하여 형변환을 이용한 중복 제거. 이 과정에서 순서는 보장 X

old_list = [1, 2, 3, 1, 3, 4, 5, 6, 7]
temp_set = set(old_list)
new_list = list(temp_set)

return new_list
# new_list == [1, 2, 3, 4, 5, 6, 7]
# 단, 순서는 원 데이터에 따라 달라질 수 있음.
저작자표시 (새창열림)

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

Call by Value? Call by Reference??  (0) 2021.03.10
python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
CondaVerificationError를 해결하자  (0) 2020.10.28
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

os에 따른 기본 파일 인코딩 형식

Programming/Python 2020. 12. 14. 14:57




 

파이썬에서 파일을 저장할 때 인코딩 방식이 정해지면

다시 읽을때도 해당 방식으로 디코딩을 해야 정상적인 데이터를 읽을 수 있다.

 

나의 경우에는 보통 이런 문제는 windows <-> linux 환경에서 자주 겪었다.

 

매번 어떤 환경에서 어떤 방식을 썼는지 햇갈리니 일단 기록.

 


1. 인코딩 방식 확인하기

1.1 기본 시스템 인코딩 타입 확인하기

import sys

sys.stdin.encoding
# cp949

sys.stdout.encoding
# cp949

1.2 라이브러리를 이용하여 문자열 / 파일의 인코딩 타입 확인하기

# chardet 라이브러리를 이용
# pip install chardet


import chardet

# 문자열
str = "example text"
print(chardet.detect(str.encode))
# {'encoding': 'cp949', 'confidence': 0.99, 'language': ''}

# 파일
with open("./example_file.txt", 'r') as file:
	line = file.readline()
    
    print(chardet.detect(line.encode()))
    # # {'encoding': 'cp949', 'confidence': 0.99, 'language': ''}

 

2. encoding= 파라미터로 인코딩 방식 지정하기

with open("./example_file.txt", 'r', encoding="cp949") as file:
	line = file.readline()

 

3. (참고용) os에 따른 기본 인코딩 타입 (python 3.7 기준)

  • windows : cp949
  • linux : utf-8

파이썬 버전에 따른 인코딩 타입이 다른지는 모르겠다. (확인되면 수정하기)

euc-kr 도 종종 보이나 cp949가 euc-kr의 상위 버전이므로 가능하면 cp949를 사용하자.

저작자표시 (새창열림)

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

python2.X 에서 opencv-python을 설치하자  (0) 2021.01.19
list에서 중복 내용을 제거하자  (0) 2021.01.11
데이터와 인덱스를 알려주는 enumerate  (0) 2020.12.01
CondaVerificationError를 해결하자  (0) 2020.10.28
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

데이터와 인덱스를 알려주는 enumerate

Programming/Python 2020. 12. 1. 07:47




for문과 함께 많이 사용하는 기능 중 꽤나 유용한 enumerate.

 

일반적으로 순회할 데이터를 enumerate로 감싸서 데이터와 인덱스를 받아오는데 사용한다.

 

# data list
data = ["red", "blue", "green", "black", "white"]

# range를 이용한 인덱스와 데이터 출력
for ii in range(len(data)):
	output = "Idx : %d / Data : %s" % (ii, data[ii])
    print(output)

# enumerate를 이용한 인덱스와 데이터 출력
# range, len 함수를 하나로 줄이고 데이터에 인덱스로 접근하는 과정을 생략
for ii, color in enumerate(data):
	output = "Idx : %d / Data : %s" % (ii, color)
    print(output)
# Idx : 0 / Data : red
# Idx : 1 / Data : blue
# Idx : 2 / Data : green
# Idx : 3 / Data : black
# Idx : 4 / Data : white

 

일반적으로는 enumerate에 첫번째 파라미터만 채워서 사용했는데

두번쨰 파라미터로 시작인덱스값을 지정 가능하다는것을 알게되어 기록

# data list
data = ["red", "blue", "green", "black", "white"]

# enumerate를 이용한 인덱스와 데이터 출력
# 두번째 파라미터로 시작 인덱스를 지정할 수 있다.
for ii, color in enumerate(data, 100):
	output = "Idx : %d / Data : %s" % (ii, color)
    print(output)
# Idx : 100 / Data : red
# Idx : 101 / Data : blue
# Idx : 102 / Data : green
# Idx : 103 / Data : black
# Idx : 104 / Data : white
저작자표시 (새창열림)

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

list에서 중복 내용을 제거하자  (0) 2021.01.11
os에 따른 기본 파일 인코딩 형식  (0) 2020.12.14
CondaVerificationError를 해결하자  (0) 2020.10.28
폴더의 이름을 일괄 변경하자  (0) 2020.05.27
Python array에서 extended slices를 사용하자  (0) 2020.05.18
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

MFC Dialog 에서 enter, esc 동작을 제어하자

Programming/C, C++, MFC 2020. 11. 10. 09:57




MFC Dialog를 만들면 기본적으로 Enter 또는 ESC 키를 누르면 프로그램이 종료된다.

 

이는 Enter키 이벤트가 발생하면 자동으로 OnOK() 함수가 호출되고

ESC 키 이벤트가 발생하면 OnCancel() 함수가 호출되기 때문이다.

 

이러한 현상을 방지하기 위해서는 PreTranslateMessage 함수를 통해 제어가 가능하다.

 


// 클래스 마법사에서 PreTranslateMessage 가상함수를 추가.
BOOL CProjectDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == VK_ESCAPE)
        {
        	// ESC 키 이벤트에 대한 처리 추가
            return TRUE;
        }
        else if (pMsg->wParam == VK_RETURN)
        {
        	// Enter 키 이벤트에 대한 처리 추가
             return TRUE;
         }
     }
    return CDialogEx::PreTranslateMessage(pMsg);
}
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

하위폴더 포함, 폴더 전체를 복사하자

Programming/C, C++, MFC 2020. 11. 10. 09:55




하위폴더 및 파일들을 포함한 폴더를 다른 경로로 전체 복사하고 싶은 경우가 있다.

 

이럴 경우 SHFileOperation 를 이용하여 복사를 수행하자.


int CopyFolder(CString szFrom, CString szTo)
{
	SHFILEOPSTRUCT shfo;
	int nRet;
	char* pszFrom = new char[szFrom.GetLength() + 1];
	char* pszTo = new char[szTo.GetLength() + 1];

	strcpy(pszFrom, szFrom);
	strcpy(pszTo, szTo);

	ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT));
	shfo.hwnd = AfxGetMainWnd()->m_hWnd;
	shfo.wFunc = FO_COPY;
	shfo.pFrom = pszFrom;
	shfo.pTo = pszTo;
	shfo.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMMKDIR;
	shfo.lpszProgressTitle = NULL;

	nRet = SHFileOperation(&shfo);

	delete[] pszFrom;
	delete[] pszTo;

	return nRet;
}

 


이유는 아직 확인 못했지만 위 방법이 사용중 오류가 발생하는 경우가 있어서 아래 방법으로 대체하여 사용 중 (20.11.20. 기준)

int CopyFolder(CString szFrom, CString szTo)
{
	HANDLE hSrch;
	WIN32_FIND_DATA wfd;
	BOOL bResult = TRUE;
	TCHAR WildCard[MAX_PATH];
	TCHAR SrcFile[MAX_PATH];
	TCHAR DestFile[MAX_PATH];

	wsprintf(WildCard, "%s\\*.*", szFrom);
	CreateDirectory(szTo, NULL);
	hSrch = FindFirstFile(WildCard, &wfd);
	if (hSrch == INVALID_HANDLE_VALUE)
		return FALSE;
	while (bResult) {
		wsprintf(SrcFile, "%s\\%s", szFrom, wfd.cFileName);
		wsprintf(DestFile, "%s\\%s", szTo, wfd.cFileName);
		// 서브 디렉토리가 발견되면 서브 디렉토리를 복사한다.
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
			if (lstrcmp(wfd.cFileName, ".") && lstrcmp(wfd.cFileName, "..")) {
				CopyFolder(SrcFile, DestFile);
			}
		}
		else {
			CopyFile(SrcFile, DestFile, FALSE);
		}
		bResult = FindNextFile(hSrch, &wfd);
	}
	FindClose(hSrch);
	return TRUE;
}
저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • ···
  • 8
  • »

카테고리

  • 살다보니.. (449)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (118)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (58)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • Deep Learning
  • 크롬
  • 큐슈
  • 스마트체험단
  • 후쿠오카
  • 칼로리 대폭발
  • review
  • matlab
  • LIBSVM
  • 매트랩
  • matlab function
  • 포르투갈
  • 일본
  • 오봉자싸롱
  • ReadString
  • SVM
  • utility
  • Computer Tip
  • random variable
  • 매트랩 함수
  • function
  • 딥러닝
  • Convolutional Neural Networks
  • 갤럭시노트3
  • DeepLearning
  • CStdioFile
  • portugal
  • DSLR
  • 에누리닷컴
  • ColorMeRad

달력

«   2025/08   »
일 월 화 수 목 금 토
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
08-24 07:39

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바