- 4 Layers
Signal + Component
GND
Power
Low speed signal
- 6 Layers
Signal + Component
GND
Power
Signal
GND
Signal
- 4 Layers
Signal + Component
GND
Power
Low speed signal
- 6 Layers
Signal + Component
GND
Power
Signal
GND
Signal
잘쓰던 freecad가 python3의 버전이 오롯이 3.12로 재편 되면서 기존의 3.11이 있음에도 불구하고 3.11이 제대로 돌아가지 못하게 되었다.
그래서 덩달아 freecad도 실행이 불가능한 상태가 되어 버렸다. 해결해 볼라구 찾아 보았다 크게 2개의 문제가 되더라 libpyside2와 libshiboken2, 이 둘이 freecad의 GUI를 담당하는데 찾고 있던 경로(/usr/lib/python3/dist-packages/)에 없었던 듯 하다.
데비안 패키지 저장소를 뒤졌으나 libshiboken2-py3-5.15_5.15.10-4_amd64.deb 밖에 없었다. 범위를 넓혀서 rpm도 찾아 보았다. 그래서 데비안 libpyside2 패키지를 대체할 수 있는 pyside2-core-5.15.12-2-omv2490.x86_64.rpm를 다운로드 받았다.
데비안 현시점(2024-07-22)의 testing 배포판의 python3의 주력이 3.12으로 넘어가 버려서 /usr/lib/python3/dist-packages에 3.11 버전의 패키지를 덮어 씌우는 것은 시스템을 망가트릴 수 있어 아래의 경로에 해당 라이브러리들(libpyside2*, libshiboken2*)을 복사해 두었다.
$ mv /home/daysleep/Downloads/libpyside2.cpython-311-x86_64-linux-gnu.so.5.15* /usr/lib/x86_64-linux-gnu/
$ mv /home/daysleep/Downloads/libshiboken2/libshiboken2-py3-5.15_5.15.10-4_amd64/usr/lib/x86_64-linux-gnu/libshiboken2.cpython-311-x86_64-linux-gnu.so.5.15* /usr/lib/x86_64-linux-gnu/
$ cp -r /home/daysleep/Downloads/libshiboken2/libshiboken2-py3-5.15_5.15.10-4_amd64/data/usr/lib/python3/dist-packages/shiboken2 /usr/local/lib/python3.11/dist-packages/
뭐 그래도 여전히 유독 /usr/lib/python3/dist-packages에서만 찾는 plugin 자원들은 문제가 생기더라 뭐 찝찝하지만 실행은 되니 우선 임시적으로 이렇게 써야 겠다.
* 주의 사항: symbolic link 생성시 반드시 작업 디레토리를 생성 경로로 설정해야 생성이 되더라 한참 애먹었다.
$ ln -s libpyside2.cpython-311-x86_64-linux-gnu.so.5.15.12 libpyside2.cpython-311-x86_64-linux-gnu.so.5.15
Python의 코딩 스타일이라는 것이 정해져 있진 않지만 C/C++ 기반으로 시작하여 여기까지 와버린 나로써는 JavaScript 언어의 매써드 붙여쓰기 / for 문 대신 apply() 메써드 붙여쓰기는 당황 스럽다. 어쩌겠나 적응해야지. 익숙해 질때까진 새것 발건한 것 마냥 기록 좀 남겨야 겠다.
md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(
lambda x: [i['name'] for i in x] if isinstance(x, list) else []
)
위의 코드는 pandas의 dataframe인 md를 조작하는 코드다; 결과적으로 'genres' 항목의 내용이 dict를 내부항목으로 하는 list로 되어 있는 것을 해체해서 'name'항목으로만 되어 있는 list로 만들어 버린다. 이를 위해서 코드가 좀 돌다리를 두드리면서 실행하도록 만들어 두었다. 안전한게 좋긴하지만 코드 보기가 눈아프긴 하다.
우선, fillna('[]')는 md['genres']인 Series의 내부항목중 Na 혹은 NaN 즉, 숫자가 아니거나 아무것도 없거나 한 곳은 '[]' 문자열(실제 내용은 빈 list)을 넣어 두고,
그 다음에 dict를 내부항목으로 갖는 list를 가지고 작업하려고 하는데 아쉽게도 해당 내용이 Series의 문자열 형태로 되어 있어서 이 부분을 해석해서 Python의 객체로 만들어 주어야 한다. 이 작업을 해주는 것이 .apply(literal_eval)이라는 것이다.
그리고 나서 본격적으로 Series의 내부항목 list의 내용을 구조가 복잡한 dict를 해체해서 'name'항목만 남겨 주는 혹은 내용이 없으면 빈 list로 재편한다. 이 작업을 .apply()메서드와 dict의 내용을 해체하고 빈곳은 빈 list로 대체하는 lambda 함수가 해주고 있다.
vote_counts = md[md['vote_count'].notnull()]['vote_count'].astype('int')
이것도 마찬가지다. dataframe인 md의 'vote_count' 컬럼의 내용중 내용이 있는 항목만 추려 혹시나 있을 누락된 항목으로 발생할 수 있는 에러를 방지 하도록 해놓았다.
그래서, 유효한(notnull)내용만 갖는 'vote_count' 컬럼의 내용을 마지막으로 정수형으로 변환하여 vote_count에 저장하도록 해놓았다.
원문: - New Value Terminology - Bjarne Stroustrup [https://www.stroustrup.com/terminology.pdf])
# C++ value terminology
## lvalue
- 역사적으로 lvalue은 대입 표현식(A = B)의 왼쪽에 위치하곤 하기 때문에 left-value의 의미 불립니다. lvalue는 객체나 함수를 지칭하도록 의도되었습니다. 예를 들면, E가 포인터 형태의 표현식일때, *E는 E가 가르키는 객체나 함수를 가르키는 lvalue 표현식입니다. 다른 예로, 반환값의 타입이 lvalue인 함수를 호출한 결과는 lvalue 입니다.
## xvalue
- eXpiring value(만료값)로써, 일반적으로 수명이 거의 끝나가는 객체를 참조하기도 하는데, 예를 들어 리소스를 이동할 수 있도록 수명이 다한 객체를 참조하기도 합니다. xvalue는 rvalue 참조와 관련된 특정 종류의 표현식의 결과입니다. 예를 들면, 반환 유형이 rvalue 참조인 함수를 호출한 결과는 xvalue입니다.
## glvalue
- generalized lvalue(일반 lvalue)로써, lvalue 또는 xvalue를 의미합니다.
## rvalue
- 역사적으로 대입표현식의 오른쪽에 나타날 수 있기 때문에 right value의 의미로 불립니다. rvalue는 xvalue이기도 하고, 임시 객체 혹은 그 하위 객체, 객체와 연관되지 않는 값을 의미합니다.
## prvalue
- pure rvalue(순수 rvalue)로써, xvalue가 아닌 rvalue를 의미합니다. 예를 들면, 반환 유형이 참조가 아닌 함수를 호출한 결과는 prvalue입니다.
## 모델
- i : 구분성이 있는 - 즉, 주소, 포인터, 사용자가 두 사본이 동일한지 여부를 확인할 수 있습니다.
- m : 이동되어질 수 있는 - 즉, 정해지지 않았지만 유효한 상태에서 "복사"의 원본으로 보내는 것이 허용됩니다.
- iM : 구분성이 있으며, 이동되어질 수 없습니다.
- im : 구분성이 있으며, 이동되어질 수 있습니다.(예: lvalue를 rvalue 참조로 타입변환한 결과)
- Im : 구분성이 없으며, 이동되어질 수 있습니다.
iM im Im
\ / \ /
i m
왼쪽의 두 점("iM"과 "i"로 표시된)은 형식을 구분하는 사람들이 "lvalue"이라고 부르는 것이고, 오른쪽의 두 점("m"과 "Im"으로 표시된)은 형식을 구분하는 사람들이 "rvalue"이라고 부르는 것입니다.
즉, W의 왼쪽 "다리"는 "lvalue"와 관련된 이름을 가져야 하고, W의 오른쪽 "다리"는 "rvalue"와 관련된 이름을 가져야 합니다.
저는 표준 라이브러리 문구에서 "rvalue"가 "m"(일반화)을 의미한다는 사실을 발견했고, 표준 라이브러리의 기대와 텍스트를 보존하려면 W의 오른쪽 하단 지점을 "rvalue"로 명명해야 한다고 생각했습니다.
lvalue xvalue prvalue
\ / \ /
iM \ / im \ / Im
\ / \ /
\ / i \ / m
\/ \/
glvalue rvalue
W의 왼쪽 위 점은 "lvalue"이고 오른쪽 아래 점은 "rvalue"입니다. 왼쪽 하단 점은 이동이 가능한 고전적인 lvalue의 일반화입니다. 따라서 "generalized lvalue"입니다. 우리는 이것을 "glvalue"라고 명명했습니다. W의 오른쪽 위 점은 오른쪽 아래 점보다 덜 일반적입니다(지금은 예전과 마찬가지로 "rvalue"라고 부릅니다). 이 지점은 (소멸자를 제외하고는) 다시 참조할 수 없기 때문에 이동할 수 있는 객체의 원래 순수한 개념을 나타냅니다. 저는 "generalized lvalue"와 대조되는 "specialized rvalue"라는 표현이 마음에 들었지만 "prvalue"로 축약된 "pure rvalue"를 사용하였습니다.(그리고 아마도 당연한 결과일 것입니다). 따라서 W의 왼쪽 다리는 "lvalue"와 "glvalue"이고 오른쪽 다리는 "prvalue"와 "rvalue"입니다. 덧붙여서, 모든 값은 glvalue 또는 prvalue 중 하나이지만 둘 다는 아닙니다.
[원본 : https://unix.stackexchange.com/questions/188741/install-newer-older-versions-of-python-on-debian]
대부분 우분투의 deadsnakes PPA를 이용하여 설치하는 방법을 설명하지만 아쉽게도 Debian에 이와 같이 설정하면 어디에선가 문제를 야기시킬수 있는 위험을 가지고 있다. 위의 원본 게시물에서도 알려주다시피 메뉴얼로다가 해당 버전을 다운로드 해서 수작업으로 설치하는 것을 추천한다.
현시점에서 python 3.11 버전으로 업데이트 되어 더이상 tensorflow를 설치할 수 없다. tensorflow가 지원하는 최신버전의 python이 3.10이다. 먼저 python 3.10 설치하고 그리고 Teledyne의 Spinnaker SDK의 python 버전이 python 3.8만 지원한다. 이것도 나중에 설치해야 겠다.
우선 급한데로 python 3.10 버전을 수작업으로 설치하는 방법을 기록해 둔다.
# 사전 준비물
```bash
$ apt install libssl-dev openssl libffi-dev
```
# python 3.10.11 버전 수동 설치
```bash
$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz
$ tar zxf Python-3.10.11.tgz
$ cd Python-3.10.11/
$ ./configure --prefix=/usr/local
$ make
$ make install
```
여기서, 시스템에서 관리되는 /usr/local에 설치하면 시스템 관리에 혼동을 초래할 수 있기 때문에 가능하면 /opt/python-3.10.11로 설정해서 컴파일하고 설치하도록 하자.
그리고, 시스템에서 접근할 수 있게 PATH에 추가하거나 /usr/local에 symbolic link를 만들어 두자.
```bash
$ ln -s /opt/python-3.10.11/bin/python3.10 /usr/local/bin/python3.10
$ ln -s /opt/python-3.10.11/bin/pip3.10 /usr/local/bin/pip3.10
```
# 작업 시스템
윈도우즈 11, 64bits
# 설치 소프트웨어
## Python 3.8.xx
64bit 버전으로 설치하고, 현 시점에 최신 버전은 3.10이지만, 인공지능을 위한 tensorflow가 지원하는 최신 버전인 3.9.13버전이고 Spinnaker라는 Camera 소프트웨어는 3.8.xx버전을 지원한다.
### pip(Python Install Package) 설치
설치하고 가장 먼저해야할 작은 pip(Python Install Package)를 업그레이드 하는 것이다.
PS D:\python -m pip install --upgrade pip
그럼 tensorflow를 설치할 수 있는 환경이 조성되었다.
### tensorflow 와 tensorflow-cpu 설치
PS D:\python -m pip install tensorflow
설치된 tensorflow를 확인해보자.
PS D:\> python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2022-07-27 11:53:34.911913: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
2022-07-27 11:53:34.912570: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
>>> quit()
CUDA 런타임 라이브러리가 없다고 에러를 발생시킨다. 그래서 cpu전용 구동할 수 있는 tensorflow-cpu를 추가 설치한다.
PS D:\> python -m pip install tensorflow-cpu
다시, 설치된 tensorflow의 버전을 확인해 보자.
PS D:\> python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__
'2.9.1'
>>> quit()
### PySide6 설치
PS D:\> python -m pip install PySide6
설치된 버전 확인한다.
PS D:\> python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide6
>>> PySide6.__version__
'6.3.1'
>>> quit()
### OpenCV 설치
PS D:\> python -m pip install opencv-python
설치된 버전 확인한다.
PS D:\> python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.6.0'
>>> quit()
## Visual Studio Code 설치
아래의 사이트를 방문해서 해당 시스템에 알맞은 설치파일을 다운로드 받는다.
https://code.visualstudio.com/download
설치 후 PySide6 예제를 코딩하고 실행해 본다.
과거의 Point Gray사의 카메라를 사용하기 위해서 현재는 FLIR로 합병된 Spinnaker SDK를 설치해야한다.
SpinnakerSDK_FULL_2.7.0.128.x64.exe 파일을 다운로드하고 설치한다.
그리고, Python 에서 카메라를 운용하기 위해서 spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.zip 파일도 다운로드하고, 다음의 명령어로 설치한다.
PS D:\> python -m pip install .\spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.whl
그리고 설치확인한다.
## Ocean Optics의 USB 4000을 위한 환경 설정
사전설치 사항으로 SpectraSuite가 설치되어 WinUSB 드라이버가 작동하고 있어야 한다.
그렇지 않다면, libusb-win32를 설치하고 수작업으로 드라이버를 설정하고 설치해야 한다.
아직은 seabreeze가 libusb-1.0을 지원하고 있지는 않는 것 같아. 위의 방법이 유일한 것 같다.
그럼 python에서 usb4000을 운용할 seabreeze를 설치한다.
PS D:\> python -m pip install seabreeze
설치된 버전을 확인한다.
PS D:\> python
Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import seabreeze
>>> seabreeze.use('cseabreeze')
>>> from seabreeze.spectrometers import list_devices, Spectrometer
>>> devices = list_devices()
File "<stdin>", line 1
devices = list_devices()
IndentationError: unexpected indent
>>> devices = list_devices()
>>> devices
[<SeaBreezeDevice USB4000:USB4U30285>]
설치는 잘 된 것 같다.
원본: https://www.instructables.com/RADIANT-FLOOR-HOT-WATER-HEATING-SYSTEM/
이 문서는 slab 바닥(철근 콘크리트 구조의 바닥판을 의미) 시스템에 물을 이용한 바닥 난방을 적용하는 방법을 다루고 있다.
새집을 지어지는 동안 나무 프레임 바닥위에 콘크리트 를 부어 바닥을 만들고 거기에 다시 바닥 난방을 적용할 수 있었다.
이 시스템은 pex 파이프, 작은 펌프, 온수기, 그리고 온도 조절기를 통해서 동작한다.
부품을 구입한 공급업체(PexSupply.com)에서 전체 시스템에 대한 디자인을 구했습니다. 그들은 당신이 난방시스템에 필요로 하는 사양에 따른 무료의 Layout과 부품의 리스트도 제공합니다. 나는 바닥, 벽 및 천장에 대해 원하는 단열값과 함께 평면도를 제공하라는 요청을 받았습니다.
여러분은 또한 Uponor에서 무료 프로그램을 다운로드하여 여기에 포함 된 것보다 더 많은 정보를 읽을 수 있습니다. 저는 980 평방 피트(feet^2)의 단층 주택을 위해 단일 펌프, 단일 구역 시스템을 선택했지만 각 방에 물 공급량을 낮춤으로써 제어 할 수있는 별도의 시스템 구역을 선택했습니다.
첫 번째 단계는 기초벽(옹벽) 내부에 자갈로 바닥을 깔고 그위에 수증기를 막아줄 장벽을 설치한다. 그런 다음 단열을 수행하였습니다. 나는 온기가 땅속으로 내려가지 않고 위쪽으로 올라가도록 돕기위해 추가의 (견고한)단열재 – R15 –를 사용했습니다.
유틸리트 코어의 pex 파이프의 각 길이는 설치할 공간에 회로 형태를 이루도록 되어 있고, 원래의 시작된 곳으로 되돌아 와서 closed-loop 열시스템을 통해서 물이 순환하도록 되어 있습니다. 나는 펙스 파이프를 묶기 위해 지퍼 타이를 사용했습니다. 도면/계획에서 보듯이 모든 파이프는 다이어그램 / 계획에 따라 모든 파이프는 유틸리티 코어에서 끝나고 내부의 복사 바닥 시스템에 연결됩니다.
나는 파이프가 벽을 세우는 데 필요한 3/4 "전기 도관 각도를 통해 파이프를 미끄러 뜨린 다음 3/4"PVC 파이프로 미끄러 져서 건축 과정에서 똑바로 유지하고 보호했습니다. 구역 (주방, 욕실, 거실 등)에 따라 PVC 파이프에 라벨을 붙였습니다.
우리는 모든 파이프가 떨어진 곳을 정확히 기억할 수 있도록 많은 레이아웃 사진을 찍었습니다. 벽장 용 접시에 못을 박고 난방 시스템에 구멍을 뚫고 싶지 않았습니다.