문제에서 double을 다뤄야 하면, 주의해야할 점들이 있어서 나열해 본다.

 

이 문제를 보자.

먼저, double을 int로 변환해야하는 경우 단순한 형변환으로는 부족할 수 있다.

예를 들어 다음코드를 돌려보면 1004가 아닌 1003이 찍힌다.

1
2
3
4
5
6
7
int32_t main()
{
    double a = 10.04 * 100;
    int b = a;
    printf("%d\n", b);
    return 0;
}
cs

이경우 다음처럼 뒤에 0.5를 곱해주고 변환해야 제대로 변환된다.

1
2
3
4
5
6
7
int32_t main()
{
    double a = 10.04 * 100 + 0.5;
    int b = a;
    printf("%d\n", b);
    return 0;
}
cs

 

아래처럼 rint를 쓰면 가까운 int로 변환해서 해당문제가 없어진다고 한다.

double a = 10.04 * 100;
int b = (int) rint(a);
printf("%d\n", b);

 

 

반응형

'Programming > Problem Solving' 카테고리의 다른 글

cph  (0) 2024.07.21
백준 4103 ATM  (0) 2020.05.05
백준 15481 그래프와 MST  (0) 2020.05.02
BST 트리 구현  (0) 2020.04.09
인접행렬, 인접리스트  (0) 2020.04.09

로그중에 u'\ucc98\ub9ac' 이런식의 시퀀스가 보이면, 그냥 긁어서 다음과 같이하면 보인다

>>print(u'\ucc98\ub9ac')

처리

 

hex와 euc-kr/utf-8 변환에는 다음 사이트가 좋다.

https://r12a.github.io/app-encodings/

 

Encoding converter

show all the characters in: Select... big5 euc-jp iso-2022-jp shift_jis euc-kr gb18030 (index only) gbk koi8-r koi8-u windows-1250 windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 windows-1256 windows-1257 windows-1258 macintosh ibm866 wind

r12a.github.io

 

로그중에 "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234" 이런형식의 시퀀스가 보이면 다음처럼 해보면 된다.
>>> a = "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234"
>>> print(a.encode('latin1').decode('utf-8'))
디어브레드
 
 
반응형

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

venv  (0) 2023.12.17
mypy / pytype  (1) 2023.10.07
Python GUI Programming(Tkinter)  (0) 2021.01.02
파이선환경 그리고 requirements.txt  (0) 2020.09.20
Google Colab(Colaboratory Lab) 팁  (0) 2019.03.07

3D 엔진을 내손으로 직접 만들어보는 프로젝트!

 

3D 드로잉은 좀 더 풀어서 설명하면, 3차원 공간을 2차원 평면에 표현하는 과정이고,

2D 드로잉은 2차원 공간을 2차원 평면에 표현하는 과정이다.

따라서 3D 드로잉이 2D보다 조금 어려운게 아니라 많이! 더 어렵다.

 

어려운점1 : 투사!

3D 드로잉은 3차원 공간을 2차원 평면에 표현하기 위해 아래처럼 투사라는 과정이 추가로 들어간다.

투사를 표현한 그림. canvas라는 평면에 투사되어 우리눈에 보인다.

투사는 개념은 이해하기 쉽지만 막상 코딩을 하려고 하면 어질어질 해진다.

 

어려운점2 : 4x4 행렬연산 이해하기!

거기에다 물체의 회전, 이동등의 움직임을 효율적으로 계산하기 위해서 보통 행렬이 쓰이는데, 이게 또 난이도를 올리는 원인이된다. 게다가 3차원이면 3x3행렬이 쓰일거 같은데, "이동변환" 때문에 4x4행렬이 쓰이는점도 이해하기 쉽지 않다.

 

어려운점3 : 수많은 수학적인 용어들과 싸우기!

게다가 좌표계와 변환에 대한 내용이다 보니, 수학적으로 한없이 현학적으로 들어갈 수 있어, 관련자료를 공부하는 과정에서 쉽게 지치고 포기하게 되는 포인트가 된다.

오일러회전, 쿼터니언, 선형변환, 아핀변환, 물체좌표, 월드좌표, 카메라좌표, 스크린좌표, 직교좌표계, 호모지니어스(동차) 좌표계, 로컬좌표계, 글로벌좌표계, 포인트, 벡터 등등 이름만 들어도 어질어질 해진다 ㅠ

 

언어와 라이브러리 고르기

언어는 내 취향대로 C++을 골랐고,

아직 C++에서 native로 drawing을 지원하지 않기 때문에 SFML 라이브러리를 사용하기로 했다.

OS 및 개발환경에 따른 SFML초기환경 세팅은 여기를 참고하자. (필자는 Windows 10 / Visual Studio 2019 환경)

 

SFML로 기본적인 2D 드로잉 해보기

아래 코드를 입력해서 기본 drawing canvas를 띄워보자

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		window.display();
	}
	return 0;
}

가장 간단한 기본 형태인데 왜 while문이 2개나 있는지 궁금하실 수 있는데, 아주 간단하게 언급하고 넘어가자면, while문 형태의 무한루프가 없으면 return 0;으로 프로그램이 바로 종료되어 버리기 때문이다, 그리고 움직임을 표현하려면 반복적으로 그려주는게 필요해서 기본적으로 while 무한루프형태가 필요하고, 창을 닫는등의 이벤트를 받기위해 간단한형태의 이벤트 루프가 필요하기 때문에  안쪽의 while루프 하나가 더 들어간다고 보면 된다. (이런 이벤트 루프가 없으면 창을 닫아도 c프로그램에서 알 방법이 없기 때문에 while문들을 다 벗어나서 return 0;으로 프로그램을 종료할 방법이 없다.)

실행결과

아래 코드를 입력해서, 랜덤색깔을 가진 점들을 랜덤위치에 표시해보자.

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	auto draw_dots = [&]()
	{
		for (int i = 0; i < 1000000; i++)
		{
			Vertex point(sf::Vector2f(rand()%800, rand()%600), Color(rand()%255, rand()%255, rand()%255));
			window.draw(&point, 1, Points);
		}
	};

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		draw_dots();
		window.display();
	}
	return 0;
}

랜덤 점찍기 실행결과

 

아래 코드를 입력해서, 랜덤색깔을 가진 선들을 랜덤위치에 표시해보자.

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	auto draw_lines = [&]()
	{
		for (int i = 0; i < 1000; i++)
		{
			Color c1 = Color(rand() % 255, rand() % 255, rand() % 255);
			Color c2 = Color(rand() % 255, rand() % 255, rand() % 255);
			sf::Vertex line[2] = { 
				{Vector2f(rand() % 800, rand() % 600), c1},
				{Vector2f(rand() % 800, rand() % 600), c2}, };
			window.draw(line, 2, Lines);

		}
	};

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		draw_lines();
		window.display();
	}
	return 0;
}

랜덤 선찍기 실행결과

 

반응형

vim -d a.cpp b.cpp 하면 기본적으로 diff모드로 두 파일을 열어준다.

 

]c 또는 [c로 다음, 이전 변경사항으로 커서를 이동한다.

 

zr로 묶인 부분을 풀어준다.

반응형

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

하둡(Hadoop)  (0) 2023.07.29
Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21

ssh를 통해서 tkinter 프로그램을 돌리느라 x11을 사용하게 되었는데, 

여러군데서 ssh를 접속하는 경우 DISPLAY문제로 원하는 호스트 쪽에서 제대로 app이 뜨지 않는 문제(hang)가 발견돼서 며칠고생했다.


해결한 방법은 결국 x11 커맨드라기 보다는,

w 명령어를 통해 다음과 같이 접속한 ssh세션을 나열하고, pkill -9 -t pts/0 이런 명령어를 통해 원치 않는 호스트쪽 세션을 정리하는 거였다.


여기참조함

반응형

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

Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
vimdiff  (0) 2021.04.07
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20

개인적으로 python으로 GUI프로그램을 하나 작성할일이 생겨서, 여기에 그 과정을 기록해본다.

 

여기를 참고해서 파이선에 기본적으로 딸려 나온다는 Tkinter를 사용해보기로 결정했다.

처음 tutorial은 여기를 참고했는데, 기본적으로 딸려 나오는 모듈이라그런지 사용도 무척 쉬웠다.

만약 리눅스에 ssh로 접속하고 있다면 x-server를 사용해야하는데,

나의 경우 라즈베리파이에 깔린 라즈비안에 윈도우에서 MobaXTerm으로 접속하는데, 메뉴에서 Start X-Server만 해주면 바로 동작했다.

(집과 회사등 여러군데에서 ssh로 접속하는 경우는 실행할때 충돌나면서 안되는 경우가 있었는데, 이때는 여기참조해서 터미널(?) 하나를 죽여주면 잘 동작함을 확인)

 

한글로 레이블을 만들면 텍스트가 깨져보이는데, 이게 생각보다 고치기 쉽지 않네 ㅠ 검색도 잘 안되고.. 일단 그냥 영어버전으로 만들기로 하고(...) 넘어감

String으로 된 radiobutton 컨트롤의 경우 위링크에서 추가적으로 여기를 참조해야 초기값 세팅이 가능했다.

위젯간 align을 위해서 grid()를 사용하거나 pack()을 사용하거나 place()를 사용하는거 같은데, 나는 단순하게 하기 위해서 grid()를 사용했다(위의 tutorial에서 소개한 방법이기도 하고).. 섞어 쓰기 보다는 하나만 선택해서 써야하는 것 같은 인상을 받았다.

그런데 grid()의 경우 columnspan을 사용하거나, Frame()으로 그룹핑해주지 않으면 가상의 테이블 때문에 내가 원하는대로 배치가 되지 않는 현상이 있었다. 위짓간 align을 위해서는 sticky라는 키워드를 사용해야했는데, 좀 거지 같은 설계인것 같다.

 

 

 

 

반응형

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

mypy / pytype  (1) 2023.10.07
python 한글 스트링 인코딩 핸들링  (0) 2021.11.30
파이선환경 그리고 requirements.txt  (0) 2020.09.20
Google Colab(Colaboratory Lab) 팁  (0) 2019.03.07
python array (indexing and slicing)  (0) 2019.02.28

여기 참조

 

왜사용?

하나의 서버에서 다른 서버들을 원격으로 관리하면서, 배포같은 작업을 수행하고자 할 때 편함

ansible 내부적으로 원격으로 다른 서버를 조작하는데는 ssh가 쓰임

ansible설치는 하나의 서버에만 하면됨. (조작을 당하는 서버에는 ansible설치 필요 없음)

python으로 만들어진듯

 

할수 있는 일

설치 yum, apt-get, ...

다운로드 git, get_url, ...

실행 shell, task, ...

 

 

설치

centos기준  $sudo yum install ansible

 

host설정

원격으로 관리할 서버들을 지정해준다.

sudo vi /etc/ansible/hosts를 열어서 열거해주면 된다. 그룹도 지원.

예를들면 다음과 같이 써준다.

1
2
3
[myhome]
127.0.0.1
 
cs

 

host별로 ssh-key복사해주기

여기보고 따라하면 된다.

$ ssh-keygen -t rsa -C "userid@127.0.0.1" 이걸로 ssh-key만들어주고

$ ssh-copy-id userid@127.0.0.1 이걸로 host마다 복사해주면됨

 

ping날려보기

host설정이 잘된지 확인하기 위해 다음 명령어를 날려볼 수 있다.

$ ansible myhome -m ping

전반적인 single line, adhoc command에 대해서는 여기 참조 < 강추.. 하나씩 따라해보자

 

playbook사용해서 여러줄 동시에 실행하기

여기, 여기, 여기 참조 < 이것도 두번째 링크 강추 

 

 

 

playbook은 yaml 문법을 사용하고, jinja문법으로 분기등 약간의 프로그래밍이 가능하다, 

 

로깅

/etc/ansible/ansible.cfg에 log_path를 정해준대로 로깅이 된다.

 

 

task만으로도 playbook을 돌릴 수 있는데, role이 별도로 필요한 이유는 뭘까?

jenkins와의 차이점은 뭐지?

 

 

Agentless automation tool?

Ansible does not add a database, and there will be no daemons to start or keep running.

 

play book을 yaml을 사용해서 기술

반응형

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

vimdiff  (0) 2021.04.07
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10

유용한 byobu 명령어

세로 split: Ctrl + F2

pane 전환: Shift + 화살표 

pane rotation: Ctrl + F3, Ctrl + F4

window탭이름수정: F8

 

유용한 tmux 명령어

(prefix가 Ctal + A라고 가정)

세로 split: ctrl + A, %

가로 split: Ctrl + A, |

pane 전환: Ctrl + A, 화살표

pane resize: Ctrl + A, Ctal + 화살표

window 순서를 Ctrl+좌우화살표로 바꾸기위해 다음 명령어 입력
Ctrl + A, :, bind-key -n C-Left swap-window -t -1
Ctrl + A, :, bind-key -n C-Right swap-window -t +1
 
만약 위의 키바인딩을 취소하고 싶으면, 다음과 같은 식으로 하면 된다. 
Ctal _ A, :, unbind-key -n C-Left 

그런데 C-[의 경우는 ESC키와 간섭이 있으므로 사용하지 말것!

반응형

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

X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22
vim  (0) 2020.09.20
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
NTP설정  (0) 2020.03.30

virtualenv 관련해서는여기 참조

파이선환경

The ecosystem consisting of your particular installed version of python

plus all the third-party packages (“libraries”) it can access (and their precise versions)


requirements.txt

필요한 이유: 배포하고 나서 필요한 package들을 명시하기 위함



프로젝트 만드는 입장에서 requirements.txt 생성하기

$ pip freeze 하면 가상환경에서 현재까지 pip install된 라이브러리 목록이 버전과 함께 나열된다.


$ pip freeze > requirements.txt 하면 requirements.txt가 생성된다.

가상환경을 사용한 경우 이게 첨에는 아무것도 없을 수 있다.

여기에 뭔가 설치하고 나서(예를 들면 pip install numpy) 다시 해보면 나타나게 된다.

라이브러라(타 프로젝트) 사용하는 입장에서 필요한 모듈(필요한 버전으로) 설치하기

requirements.txt가 있는 경우 pip install -r requirements.txt를 통해 필요 모듈 설치

없는 경우 pip install numpy와 같은 방법으로 하나씩 설치(numpy module을 설치하고 싶다고 했을 때)

이때 설치되는 모듈들은 해당 virtual environment 안에서만 깔린다.

반응형

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

python 한글 스트링 인코딩 핸들링  (0) 2021.11.30
Python GUI Programming(Tkinter)  (0) 2021.01.02
Google Colab(Colaboratory Lab) 팁  (0) 2019.03.07
python array (indexing and slicing)  (0) 2019.02.28
pudb  (0) 2018.11.15

초기세팅

~/.vimrc 파일을 아래와 같이 편집

" search
set hlsearch  " highlights all search patterns
set ignorecase
set smartcase  " if you type, '/Copyright' it will be case sensitive

" auto indent
set autoindent     " 새로운 줄 시작시 이전줄의 들여쓰기를 복사
set cindent
set smarttab       " tab누르면 공백들이 대신 들어감(들여쓰기할때만)
set smartindent    " 중괄호나 주석등에 반응하여 들여쓰기 조정
set showmatch      " 중괄호등 짝보여주고 이동 가능

" tab size
set tabstop=4      " how many columns vim will use to print tab
set shiftwidth=4   " vim use when you hit >> or vim does auto indenting
set softtabstop=4  " vim use when you hit tab in insert mode
set expandtab      " tab will be converted to spaces

" scroll
set scrolloff=5  " when page up/down(ctrl + F/B)


" etc
syntax on   " syntax coloring
set number  " line number
set backspace=indent,eol,start  " backspace key will delete everything
set visualbell
set showcmd  " when you type 'y2d', intermediate command will be shown
map <leader>b Oimport pudb; pudb.set_trace()
" set colorcolumn=80
set termguicolors

 

vim plugin manager

vim을 정말 visual studio 수준의 IDE로 쓰려면 plugin manager를 통해 여러 plugin을 설치해서 써야한다.

plugin manager 자체도 여러가지가 있는데, 국산이기도 하고 심플하고 강력한 vim-plug를 추천

texteditor 색깔에 대해서는 여기를 참조하는걸 추천(사용가능한 airline theme list는 여기 참조)

 

그 이후 초기 설치 방법은 여기를 참조

다양한 plugin들은 여기서 검색 가능

 

 

 

반응형

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

Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21
리눅스 퍼미션 개념(파일 권한 관련)  (0) 2020.04.10
NTP설정  (0) 2020.03.30
supervisor  (0) 2020.03.18

+ Recent posts