네트워크 프로토콜 관련해서 시험해 보았습니다.

프로토콜의 맨 마지막 형식은 CRC로 패킷 일부에 대한 CRC를 계산하도록 되어 있고,  사용하는 형식은 "표준 CRC 16"이라고 되어 있었습니다.

CRC 16 관련 코드를 찾아서 구현하고 서버로 패킷을 전송했습니다.

그런데 response packet에서 CRC 16 error를 확인할 수 있었습니다.

코드를 다시 한번 확인해 보아도 이유를 알 수가 없었습니다.

다행시 response packet에서 CRC 필드를 확인할 수 있고, 제가 사용하는 코드에 넣어서 시험했더니 받은 CRC 값과 계산한 CRC 값이 틀린겁니다.

검색을 해 봐도 이유를 확인하기 어렵고 ㅠㅠ

그러다 만난 사이트입니다.

 

https://crccalc.com/

 

Online CRC-8 CRC-16 CRC-32 Calculator

Please enable JavaScript on this site or click one of the buttons above. Share your result: Cookies policies

crccalc.com

사이트에 접속하면 아래와 같은 화면을 볼 수 있습니다.

(1) 입력한 데이터를 Hex로 확인합니다. Byte align이 맞지 않는 경우는 (3)의 9를 표시하는 방법을 참고하면 되겠습니다.

(2) 맨 아래 Processed data 필드 (3)를 활성화합니다. 실제 계산에 사용하는 입력 데이터를 확인할 수 있습니다.

(3) 실제 계산에 사용하는 데이터입니다.

(4) CRC 계산 방법을 선택합니다.

 

CRC16을  선택했는데, 사용하는 Algorithm이 아래와 같이 매우 다양했습니다.

입력 packet의 CRC와 일치하는 algorithm을 확인해보니 CRC-16/MODBUS였습니다.

이를 검색해서 코드를 사용했더니 CRC 에러가 발생하지 않았습니다.

 

- End -

반응형

'프로그래밍 > Tips & sites' 카테고리의 다른 글

[Obsidian] Google drive와 연동하기  (0) 2022.04.03
[Tips] 파워포인트 매크로  (0) 2019.12.28
[Tips] VIM  (0) 2019.12.17
[Tips] Notepad++  (0) 2019.12.15

Python으로 프로그래밍을 하다 보면, 반복해서 수행하는 함수나 loop등에서 변수들의 상태를 모니터링하고 싶은 경우가 많습니다. 물론 print 함수를 이용해서 하나 하나 trace할 수도 있지만, Python이 제공하는 디버깅 기능을 이용하면 좋습니다.

기본적인 예제는 다음과 같습니다.

from IPython.core.debugger import set_trace

sum = 0

for i in range(10):
    sum += i
    set_trace()

set_trace()가 동작할 때는 jupyter notebook에 아래와 같은 입력창이 활성화됩니다.

입력창에 필요한 디버깅 command를 입력하거나, 확인하고자 하는 변수를 입력하고 enter를 눌러 결과를 확인할 수 있습니다.

디버깅 command와 관련해서는 입력창에 'help'를 입력하면 아래와 같이 사용가능한 command들이 나타납니다. 그리고 디버깅 command에 대해서 좀 더 확인하고 싶으면, 'help command명'을 입력하면 설명을 확인할 수 있습니다.

아래는 위의 예제를 실제 실행하면서, i와 sum 변수를 중간 중간 출력한 화면입니다. 출력 이후 다시 실행하기 위해서는 'c' 명령을 입력하였습니다. 마지막으로 디버깅을 멈추기 위해서는 'q'를 입력했습니다.

 

만약 'q'를 입력해서 프로그램을 종료하지 않은 상태로, jupyter notebook의 다른 명령을 실행시키는 경우 실행이 종료되지 않습니다. 이 경우 해당 notebook을 'Shutdown'후 다시 실행하면 됩니다.

- End -

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

일련의 규칙에 맞춰 폴더를 생성하는 예제와 tar 파일을 extract하는 예제입니다.

import tarfile
import os

# 폴더 생성 예제
# Linux의 경우 '/'로 시작해야 하며, '~'로 home page를 표시할 수는 없음
srcFolderName = os.path.join('/home','apple', 'Downloads')
for i in range(1, 14):
    # Documents 폴더에 'Output_01', 'Output_03', ... , 'Output_13'을 생성
    dstFolderName = os.path.join('/home','apple', 'Documents', 'Output_'+'%02d'%i)
    
    # 예외 처리
    try:
        if not(os.path.isdir(dstFolderName)):
            os.makedirs(os.path.join(dstFolderName))
    except OSError as e:
        if e.errno != errno.EEXIST:
            print("Failed to create directory!!!!!")
            raise

" srcFolder에 있는 summary.tar.bz2 파일을 dstFolder에 extract
tar = tarfile.open(os.path.join(srcFolderName, 'summary.tar.bz2'), "r:bz2")
tar.extractall(dstFolderName)
tar.close()
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 디버깅  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

Animation 예제입니다.

(참고링크)

import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib.animation as animation

def B(alpha, beta):
    return math.gamma(alpha) * math.gamma(beta) / math.gamma(alpha + beta)

def beta_pdf(x, alpha, beta):
# [0, 1] 구간 밖에서는 밀도가 없음
    if x < 0 or x > 1:
        return 0
    return x ** (alpha - 1) * (1 - x) ** (beta - 1) / B(alpha, beta)

x_data = []
y_data = []

fig, ax = plt.subplots()
ax.set_xlim(0, 1)
ax.set_ylim(0, 12)
line, = ax.plot(0, 0)

def animation_frame(i):
    xs = [x / 100.0 for x in range(0,100)]

    x_data = [x / 100.0 for x in range(0,100)]
    y_data = [beta_pdf(x, alpha=i,beta=i+10) for x in xs]

    line.set_xdata(x_data)
    line.set_ydata(y_data)

    return

anim = animation.FuncAnimation(fig, func=animation_frame, frames=np.arange(0.1, 80, 1), interval=50, repeat=False)
plt.show()

Jupyter notebook에서 예제를 시험할 때, animation이 동작하지 않을 수 있습니다.

이 경우에는 아래 코드를 먼저 실행한 후, 위 코드를 수행하면 animation 동작을 확인할 수 있습니다.

(참고링크)

%matplotlib notebook

 

 

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 디버깅  (0) 2020.05.03
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

가장 기본적인 matplotlib 예제입니다.

# 필요한 라이브러리 import
import numpy as np
import matplotlib.pyplot as plt

# x = in_array, -np.pi ~ np.pi 30단계
# y = out_array, sine
in_array = np.linspace(-np.pi, np.pi, 30)
out_array = np.sin(in_array)

# plot reset
plt.clf()

# x, y축 range 지정
plt.ylim([-1.2, 1.2])
plt.xlim([0.0, 30.0])

# plot에 좌표(15, -0.5)에 text 추가
plt.text(15, -0.5, "Insert text")

# plot에 가로선 그리기 (red, 모양, 굵기)
plt.axhline(out_array.max(), color='r', linestyle ='--', linewidth=1)
# plot에 세로선 그리기 (blue, 모양, 굵기)
plt.axvline(np.argmax(out_array), color='b', linestyle='--', linewidth=1)

# plot 그리기
plt.plot(out_array)

# plot 보이기
plt.show()

실제 그린 그림입니다.

- End -

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 디버깅  (0) 2020.05.03
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03

Ubuntu 14.04를 설치해서 사용 중입니다.
Ubuntu를 설치할 때 가장 먼저 설치하는 application은 Google Chrome입니다.
Windows에서도 Chrome을 사용하고, Firefox가 낯설다 보니 Chrome을 설치하게 됩니다.
Ubuntu에 Chrome을 설치하는 방법은 여러 가지가 있겠지만, Firefox 브라우저로 Chrome 설치 파일을 다운 받고, 아래 명령어로 이용합니다.

$ sudo dpkg -i google-chrome-stable_current_amd64.deb 

그런데, 가끔 Chrome가 실행되지 않을 때가 있습니다.
리눅스가 충분히 친숙하지 않고, Ubuntu 설치에는 시간이 얼마 걸리지 않아서, 이럴때는 다시 Ubuntu를 설치하고 했습니다.
이런 상황이 자꾸 반복되다보니 해결책을 찾아보았습니다.


1. Ubuntu에서 Chrome이 실행되지 않는 경우에 대한 Posting이 있긴 하지만, 여전히 문제가 발생합니다.

 

2. 참고 페이지를 따라서, gpu를 disable하고 실행해 보지만, 여전히 문제가 발생합니다.

 

3. Chrome에서 debug message  출력을 확인해 보고 싶어서  찾아보았습니다.
Google 지원 페이지에서 debug message option 을 확인할 수 있었습니다.

 --enable-logging=stderr --v=1

여러 줄의 메시지가 출력되는데, 아래 메시지가 출력되면서 멈춰 있습니다.

chrome Activated seccomp-bpf sandbox for process type: gpu-process.

무슨 의미인지 확인하기 어렵고, 화면에 출력되는 로그만으로는 문제를 확인하기 어려웠습니다.

설명에 있는 chrome_debug.log 파일을 찾아보기로 합니다.

$ find . -name "*.log"

chrome_debug.log는 보이지 않습니다.

 

그런데, .config/google-chrome 폴더가 보입니다.
이상할 때는 config를 지우는 것도 좋은 방법이니, config 폴더를 지워봅니다.

$ rm -rf .config/google-chrome

그리고,  command line에서 chrome을 실행해 봅니다.

$ google-chrome-stable

Chrome이 동작합니다.
정확한 이유는 모르겠지만, chrome이 업데이트 되면서 config 파일과 충돌이 있었거나, ubuntu를 사용하면서 설치한 패키지와 충돌이 있지 않았을까 생각해봅니다.

 
앞으로는 Ubuntu를 설치하는 일이 조금은 줄어 들것 같습니다.

-End-
 
 
 
 

반응형

파워포인트에 그림을 여러장 붙여서 정리해야 했습니다. 여러 가지 방법을 사용해 봤습니다.

선을 그려 놓고, 거기에 맞춰서 그림들을 마우스로 움직여 정렬합니다. 깔끔하지는 않지만 눈대중으로 하는 것보다는 볼만합니다.

그림이 움직일때도 눈에 보이지 않는 좌표에 따라 움직이지 않도록 설정을 변경해 보기도 합니다.

그런데, 그림을 6장씩(3x2) 10개 sheet 이상 정렬하려니, 손으로 작업하는 것은 아니다 싶었습니다.

파워포인트에도 매크로가 있지 않을까 싶어서 찾아보니, 역시나 있었습니다.

그런데, 다른 프로그램들과 달리 단축키 버튼도 없고, 자동 녹화 기능을 쉽게 찾을 수 없었습니다.

대신에 VBA 프로그래밍에 대한 내용들만 있더군요.

더 좋은 방법이 많겠지만, 간단하게 제가 사용한 방법을 정리해 보았습니다.

 

[목적]

1. 그림 파일을 읽는다.

2. 파워포인트에 붙인다.

3. 크기를 조정한다.

4. 위치를 조정한다.

5. 총 6장에 대해서 반복 작업한다.

 

[전체 코드]

Sub ChangeFigSize()

ActiveWindow.Selection.ShapeRange.LockAspectRatio = msoTrue
ActiveWindow.Selection.ShapeRange.Height = 190

picNum = InputBox("그림 위치?")

If IsNumeric(picNum) Then

    If picNum = 1 Then
        ActiveWindow.Selection.ShapeRange.Top = 90
        ActiveWindow.Selection.ShapeRange.Left = 85
    End If

    If picNum = 2 Then
        ActiveWindow.Selection.ShapeRange.Top = 300
        ActiveWindow.Selection.ShapeRange.Left = 85
    End If

    If picNum = 3 Then
        ActiveWindow.Selection.ShapeRange.Top = 90
        ActiveWindow.Selection.ShapeRange.Left = 370
    End If

    If picNum = 4 Then
        ActiveWindow.Selection.ShapeRange.Top = 300
        ActiveWindow.Selection.ShapeRange.Left = 370
    End If

    If picNum = 5 Then
        ActiveWindow.Selection.ShapeRange.Top = 90
        ActiveWindow.Selection.ShapeRange.Left = 655
    End If

    If picNum = 6 Then
        ActiveWindow.Selection.ShapeRange.Top = 300
        ActiveWindow.Selection.ShapeRange.Left = 655
    End If

End If

End Sub

 

[상세]

파워포인트에서 '매크로' 메뉴를 실행하고, 새로운 매크로를 하나 만들면, VBA 프로그램 화면이 새로 뜹니다.

위의 전체 코드를 입력하기 전에 그림들의 위치를 확인해 볼 필요가 있습니다.

우선 손으로 그림들을 배치시켜봅니다.

그리고, 아래 코드를 VBA에 넣습니다.

MsgBox 'ActiveWindow.Selection.ShapeRange.Height'
MsgBox 'ActiveWindow.Selection.ShapeRange.Top'
MsgBox 'ActiveWindow.Selection.ShapeRange.Left'

그림을 하나 선택한 후, 매크로를 실행합니다. 그러면 팝업창이 뜨면서 선택한 그림에 대한 Height, Top, Left에 대한 숫자가 표시됩니다.

이 숫자들이 선택한 그림의 크기와 좌표 정보입니다.

손으로 작업한 것이라, 그림마다 조금씩 틀릴 수 있습니다.

따라서 모든 그림에 대한 크기와 좌표를 확인한 후, 최종적으로 작업할 그림의 크기, 좌표를 정리해 둡니다.

예를 들면 그림 크기가 160.1, 159.8, 160.3등이면 160을 사용하자는 식으로 말입니다.

 

앞서 그림의 크기와 좌표를 확인하기 위한 코드를 지우고, [전체 코드]를 넣습니다.

이때 앞서 확인한 그림의 크기, 좌표등의 숫자는 정리해둔 값을 사용하세요.

 

매크로를 실행하면 팝업창이 뜨면서 몇번째 그림으로 사용할 것인지 묻습니다.

이때 1~6 중에서 원하는 숫자를 입력하면 해당 위치로 그림이 이동하게 됩니다.

 

 매크로 실행을 위한 단축키를 사용하면 좋겠지만, 인터넷에서 쉽게 찾을 수는 없었습니다.

그래서 다음과 같이 작업했습니다.

 

1. 그림 파일을 읽는다. (Ctrl+C 키보드를 입력)

2. 파워포인트에 붙인다. (Ctrl+V 키보드를 입력)

3. 매크로를 실행한다.

    3.1. 매크로 자체를 실행하기 위한 단축키 "Alt+F8" 입력
    3.2. 매크로 메뉴에서 실행 단축키 "Alt+R"키 입력
    3.3. 그림의 위치 선정을 위한 숫자 입력

 

그림이 크기가 변경된 후 원하는 위치로 자동 이동하게 되었습니다.

 

[End]

반응형

'프로그래밍 > Tips & sites' 카테고리의 다른 글

[Obsidian] Google drive와 연동하기  (0) 2022.04.03
[Sites] CRC  (0) 2020.09.12
[Tips] VIM  (0) 2019.12.17
[Tips] Notepad++  (0) 2019.12.15

Python으로 이것 저것을 시험해 보려고 virtualenv 환경을 사용하고 있습니다.

Command line으로도 사용하고, jupyter를 사용하기도 합니다.

윈도우 환경에서 그때 그때 명령어를 모두 입력하기 귀찮아서, bat 파일을 사용하고 있는데, 사용하는 batch 파일을 정리해 보았습니다.

기본적으로 윈도우용 batch 파일 관련 블로그(참고링크)를 참고했습니다.

 

전체코드는 아래와 같습니다.

set argc=0

for %%x in (%*) do Set /A argc+=1

if %argc% == 1 (
	if "%1"=="jupyter" (
		call venv\scripts\activate
		jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10
	)
) else (
	call venv\scripts\activate
)

:virtualenv venv
:virtualenv venv --python=python3
:pip freeze > requirements.txt
:pip install -r requirements.txt

 

[내용]

 

batch 파일의 argument로 'jupyter'를 입력하면, virtualenv 환경 activate하고, jupyter를 실행합니다. (Jupyter 실행 환경)

Jupyter를 실행할 때 파일 크기가 큰 이미지를 불러올 때 문제가 발생하는 경우가 있었습니다. 그래서 Jupyter를 실행할 때 iopub_data_rate_limit의 값을 변경해서 실행했습니다.(참고링크)

Argument 없이 batch 파일을 실행하면 virtualenv 환경만 activate합니다. (Command line 실행 환경)

if %argc% == 1 (
	if "%1"=="jupyter" (
		call venv\scripts\activate
		jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10
	)
) else (
	call venv\scripts\activate
)

 

그리고, 실행되지는 않지만, 주석으로 가끔 사용하는 명령어들을 적어 두었습니다.

최초 virtualenv 설치를 위한 명령입니다.

python2를 사용하는 경우와 python3를 사용하는 경우가 틀려서 따로 적어두었습니다.

:virtualenv venv
:virtualenv venv --python=python3


virtualenv 환경에서 설치한 package들을 백업하거나 재설치하기 위한 명령어들을 적어두었습니다.

:pip freeze > requirements.txt
:pip install -r requirements.txt

[End]

반응형

윈도우용 editor들을 주로 사용하고, VI는 가끔 읽기, 한두글자 고치기 정도로만 사용했습니다. 그러다 최근 plugin을 비롯해서 다양한 기능을 사용하면서 빠른 속도와 함께 매력을 느끼고 있습니다. 사용하면서 필요한 다양한 Tip들을 정리합니다.

 

  • Search history

사용한 명령어 history는 ESC mode에서 history 명령어를 이용하면 됩니다.

:history

Search history도 확인할 수 있는데 ESC mode에서 다음과 같은 명령어를 입력하면 됩니다.

:history /

혹은

:history search

 

  • Whole word search and etc.

일치하는 단어를 search할 때의 ESC 명령어는 다음과 같습니다.

/\<searching_word\>

'/'로 search를 시작하고, "\<"와 "\>"로 원하는 단어를 감싸면 일치하는 단어를 찾을 수 있습니다.

코드를 보다 보면 "variable =="는 제외하고 ""variable ="만을 찾고 싶을 때가 있었습니다. 그런데, 위의 명령어는 word만 찾기 때문에 space가 포함된 위 내용은 찾을 수 없었습니다. 다양한 방법을 찾아보다가 정규표현식을 조금만 이용해서 아래와 같은 명령어로 "=="가 아닌 "="까지만 찾을 수 있었습니다.

/searching_word =[^=]

정규표현식과 관련해서는 다양한 page들이 있지만 잘 정리된 링크를 소개합니다. (https://hamait.tistory.com/342)

 

  • 코드 indent 자동 정렬

코드의 indent를 자동으로 해주는 프로그램을 찾다가 vi에서도 아래의 ESC mode 명령어로 가능하다는 것을 알았습니다. (https://wookiist.tistory.com/1)

gg=G

Visual mode로 일부 코드를 선택한 후 "="를 입력하면 해당 block에서만 audo indent가 수행됩니다.

 

  • Block의 처음과 끝 이동하기

C언어는 block이 '{'로 시작해서 '}'로 끝나게 됩니다. VI는 똑똑하게도 그 시작과 끝을 알고 있습니다. 이때 Block의 처음과 끝을 이동하고 싶으며, 원하는 '{' 혹은 '}'에 커서를 위치시킨 후 '%'키를 누르면 '{'와 '}'사이를 왔다 갔다 할 수 있습니다.

반응형

'프로그래밍 > Tips & sites' 카테고리의 다른 글

[Obsidian] Google drive와 연동하기  (0) 2022.04.03
[Sites] CRC  (0) 2020.09.12
[Tips] 파워포인트 매크로  (0) 2019.12.28
[Tips] Notepad++  (0) 2019.12.15

문서에서 중복되는 라인을 삭제하는 방법으로 Notepad++을 사용할 수 있습니다만, 해당 링크에 있는 'uniq' 리눅스 명령어를 사용하는 방법도 인상적입니다.

$ cat yourfile | sort | uniq > file_to_save_results
반응형

'프로그래밍 > Linux_commands' 카테고리의 다른 글

[Linux] sed  (0) 2021.07.10
[Linux] find  (0) 2019.12.15
[Linux] grep  (0) 2019.04.24

+ Recent posts