This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

*/

코로나 간이 검사

 코로나 간이 검사를 받았습니다. ㅜ.ㅜ

잠실운동장 건너편 아시아공원 입구에 있는 간이 검사소에서... 점심시간전에 방문했는데 대기자 6~7명 수준으로 대기시간 10분이내에 진행이 되네요.

코에서 검체를 체취하는데 고통스럽습니다. 

빨리 백신이 도입되어야 할 것 같네요.

의료진들 봉사자들 모두 힘내세요.. 

Linux에서 파일명 일괄 변경

 현재 디렉토리 하위에 있는 file명이 from으로 시작되는 모든 파일(fromxxx.xx)을 to로 시작하는 파일로 한번에 변경

 find ./ -name "from*" | sed -e 'p' -e "s/from/to/g" | xargs -n 2 mv


rename 명령어로 변경하기

형식 : rename 's/파일명/변경할파일명/' 대상파일필터

예) 

 rename 's/from/to/' ./*

Visual Studio Code에서 arduino 사용하기

Visual Studio Code에서 arduino를 위한 확장 설치

설치순서


1.확장탭을 누르고 2.검색창에 "arduino"를 입력하면 arduino관련된 확장모듈이 검색된다. 첫번째로 검색된 Microsoft에서 나온 Arduino 확장의 3. install버튼을 클릭한다.

전제조건

Arduino IDE 필요. (다운로드 에서 arduino IDE를 다운받아 설치)

Visual Studio Code 설정

VS Code에서  < Ctrl > + < , > 두키를 동시에 누르면 Search settings 메뉴가 표출된다 여기에서 Extensions > Arduino configuration 을 선택하고 

아래와 같이 Edit in settings.json를 편집한다.
{
    "arduino.path""C:/Program Files (x86)/Arduino",
    "arduino.commandPath""arduino_debug.exe",
    "arduino.logLevel""info",
    "arduino.allowPDEFiletype"false
    "arduino.enableUSBDetection"true,
    "arduino.disableTestingOpen"false,
    "arduino.skipHeaderProvider"false,
    "arduino.additionalUrls": [
        "https://raw.githubusercontent.com/VSChina/azureiotdevkit_tools/master/package_azureboard_index.json",
        "http://arduino.esp8266.com/stable/package_esp8266com_index.json"
    ],
    "arduino.defaultBaudRate"115200
}
"arduino.path" 는 위에서 arduino IDE를 설치한 디렉토리를 기재하여야 한다.

Commands

  • Arduino: Board Manager: Manage packages for boards. You can add 3rd party Arduino board by configuring Additional Board Manager URLs in the board manager.
  • Arduino: Change Baud Rate: Change the baud rate of the selected serial port.
  • Arduino: Change Board Type: Change board type or platform.
  • Arduino: Close Serial Monitor: Stop the serial monitor and release the serial port.
  • Arduino: Examples: Show list of examples.
  • Arduino: Initialize: Scaffold a VS Code project with an Arduino sketch.
  • Arduino: Library Manager: Explore and manage libraries.
  • Arduino: Open Serial Monitor: Open the serial monitor in the integrated output window.
  • Arduino: Select Serial Port: Change the current serial port.
  • Arduino: Send Text to Serial Port: Send a line of text via the current serial port.
  • Arduino: Upload: Build sketch and upload to Arduino board.
  • Arduino: Upload Using Programmer: Upload using an external programmer.
  • Arduino: Verify: Build sketch.

Reference

관련문서



Image buffer를 Bitmap file format으로 저장하기(RGB)

Image처리를 하다보면 memory buffer에 있는 image raw데이터를 BMP포멧으로 저장할 필요가 있다.
RGB Buffer(24bit)를 widows bitmap format으로 저장하는 함수

// _fname : 저장할 파일 명( xxx.bmp )
// _buf : RGB 순서로 구성된 Image buff
// _w, _h : image width, height
void saveBMPfile(char *_fnameuchar* _bufint _wint _h)
{
    int filesize = 54 + _w * _h * 3;
    unsigned char bmpfileheader[14] = {'B','M'0,0,0,00,00,054,0,0,0};
    unsigned char bmpinfoheader[40] = {40,0,0,00,0,0,00,0,0,01,08,0};
    unsigned char bmppad[3] = {0,0,0};

    bmpfileheader2] = (unsigned char)(filesize    );
    bmpfileheader3] = (unsigned char)(filesize>> 8);
    bmpfileheader4] = (unsigned char)(filesize>>16);
    bmpfileheader5] = (unsigned char)(filesize>>24);

    bmpinfoheader4] = (unsigned char)( _w    );
    bmpinfoheader5] = (unsigned char)( _w>> 8);
    bmpinfoheader6] = (unsigned char)( _w>>16);
    bmpinfoheader7] = (unsigned char)( _w>>24);
    bmpinfoheader8] = (unsigned char)( _h    );
    bmpinfoheader9] = (unsigned char)( _h>> 8);
    bmpinfoheader[10] = (unsigned char)( _h>>16);
    bmpinfoheader[11] = (unsigned char)( _h>>24);

    FILE* fp;
    fp =fopen(_fname, "wb");
    if(fp!=NULL) {
        fwrite(bmpfileheader, 114, fp);
        fwrite(bmpinfoheader, 140, fp);
        fwrite(_buf, _w*_h, 3, fp);
        fclose(fp);
    }
}


* Gray Bufferer 저장하기 : 링크

관련문서

Image buffer를 Bitmap file format으로 저장하기(Gray image)

 Image처리를 하다보면 memory buffer에 있는 image raw데이터를 BMP포멧으로 저장할 필요가 있다.

Gray Buffer(8bit)를 widows bitmap fotmat으로 저장하는 함수

// _fname : 저장할 파일 명( xxx.bmp )
// _buf : RGB 순서로 구성된 Image buff
// _w, _h : image width, height
void saveBMPfile(char *_fnameuchar* _bufint _wint _h)
{
    int filesize = 54 + 256*4 + _w*_h;
    unsigned char bmppalete[256*4];
    unsigned char bmpfileheader[14] = {'B','M'0,0,0,00,00,054+256*4,0,0,0};
    unsigned char bmpinfoheader[40] = {40,0,0,00,0,0,00,0,0,01,08,0};
    unsigned char bmppad[3] = {0,0,0};

// BMP File header의 내용을 채워넣는다
// File의 크기
    bmpfileheader2] = (unsigned char)(filesize    );
    bmpfileheader3] = (unsigned char)(filesize>> 8);
    bmpfileheader4] = (unsigned char)(filesize>>16);
    bmpfileheader5] = (unsigned char)(filesize>>24);

// Image buffer의 Width
    bmpinfoheader4] = (unsigned char)( _w    );
    bmpinfoheader5] = (unsigned char)( _w>> 8);
    bmpinfoheader6] = (unsigned char)( _w>>16);
    bmpinfoheader7] = (unsigned char)( _w>>24);
// Image buffer의 Height
    bmpinfoheader8] = (unsigned char)( _h    );
    bmpinfoheader9] = (unsigned char)( _h>> 8);
    bmpinfoheader[10] = (unsigned char)( _h>>16);
    bmpinfoheader[11] = (unsigned char)( _h>>24);

// Pallet 정보 Windows Format의 구성 : RGBx 4Byte
// 8bit Image의 경우 Pallet의 크기 2^8 = 256
// Gray Image의 경우 RGB 동일값
    for(int i=0; i<256;i++) {
        bmppalete[i*4] = bmppalete[i*4+1] = bmppalete[i*4+2] = i;
        bmppalete[i*4+3] = 0;
    }
    FILE* fp;
    fp = fopen(_fname, "wb");
    if(fp!=NULL) {
        fwrite(bmpfileheader, 114, fp);
        fwrite(bmpinfoheader, 140, fp);
        fwrite(bmppalete, 1256*4, fp);
        fwrite(_buf, _w*_h, 1, fp);
        fclose(fp);
    }
}

* Color Buffer(RGB) 저장 : https://amosground.blogspot.com/2020/10/image-buffer-bitmap-file-format-rgb.html

관련문서

PC에서 ARM용 크로스 컴파일 후 strip 시 오류 발생

 OpenCV를 ARM용으로 Cross Compile후 strip실행시 아래와 같은 오류 발생

strip -s *.so   
    strip: Unable to recognise the format of the input file 'libopencv_calib3d.so'

원인은 strip을 호스트용을 사용해서 발생한 것으로 ARM용으로 strip을 할수 있는 arm-linux-gnueabi-strip을 사용하면 정상적으로 strip이 되는것을 확인할 수 있다.

arm-linux-gnueabi-strip -s *.so



VisualStudio Code 에서 C++ 사용하기

Windows 10 OS에서 Visual Studio Code 환경에서 C++ 컴파일 환경을 구축해보자

Visual Studio Code 다운로드

우선 Visual Studio Code를 여기(code.visualstudio.com)서 다운로드 받아 설치합니다.

C++개발을 위한 VSC(Visual Studio Code) 설정

VSC를 다운받아 설치하고 실행하면 환영창이 나오고, 좌측에 파일탐색, 찾기,  Git, 실행/디버그, 확장(extension) 탭 5개가 있는것을 확인할 수 있다.

제일 아래쪽에 위치한 녹색으로 표시한 확장 탭을 누르고, 노란색으로 표기한 검색창에 "C++"을 입력하면 위의 사진과 같이 검색 결과 표시된다.
C++로 개발하기위해서는 2개의 extension을 설치해야 되는데 첫번째 확장은 결과리스트의 맨위에 있는 "C/C++"이다. 해당 항목(빨간색영역에 있는)의 Install을 눌러 설치한다. 이 확장은 VSC에서 C/C++언어을 지원하기 위한 추가하는 것이며, Compiler는 포함되어 있지 않다.
두번째 확장은 "easy c++"을 검색하여 설치한다.

Compiler 설치

C++ 컴파일러를 설치하는 방법은 아래와 같이 여러가지 방법이 있는데 여기서는 Windows Subsystem for Linux(WSL)을 설치한다.
  • Microsoft C++ compiler(MSVC) on Windows
  • GCC and Minggw-w64 on Windows
  • GCC and Windows Subsystem for Linux(WSL)
  • ...
WSL설치 후 Ubuntu 터미널에서 아래와 같이 build package들을 설치한다.
$ sudo apt install build-essential gdb

Code 작성하기

프로젝트생성을위해 폴더 열기(Ctrl+K Ctrl+O)하여 폴더를 선택한다.
F1키를 눌러 "easy"를 검색하여 Easy Cpp/C++: Create new C++ project를 선택
[WSL] Windows Subsystem for Linux를 선택 
비어 있던 프로젝트에 .vscode, bin, include, lib, src폴더와 main.cpp, Makefile등이 생성되며 좌하단에 Build 버튼과 Build&Run버튼이 생성된다.
아래쪽에 Build & Run버튼을 클릭하면 하단의 터미널창에 빌드 결과와 Hello Easy C++ project라고 실행 결과가 출력되는 것을 볼 수 있다.

Reference




 


Window Subsystem for Linux(WSL) 설치

요구사항

OS : Windows 10 ver. 16237.0이상

Architecture : x64, ARM64

Windows features

윈도우즈 제어판 -> 프로그램 및 기능 -> Windows 기능 켜기/끄기


Windows 기능 켜기/끄기에서 "Linux용 Windows 하위 시스템"을 체크하고 확인 버튼을 클릭하면 아래와 같이 필요한 파일들을 검색하고 세팅한후 재부팅 메세지가 출력된다.



재부팅후 Microsoft Store을 실행하고 ubuntu를 검색한다.
ubuntu  혹은 원하는 버전이 있으면 해당 버전을 선택하고 설치버튼을 클릭한다.

설치가 완료되면 시작메뉴에 ububtu항목이 추가된다.
시작메뉴에서 Ubuntu를 클릭하면 몇분간 초기화하고 새로운 사용자명과 패스워드를 설정하라는 메세지가 나온다.
사용자명과 패스워드를 정상적으로 등록하고 설치가 완료된 화면

참고사항

설치된 디렉토리는? 스토어를 통해 설치하는 각 배포는 해당 응용 프로그램의 appdata 디렉토리에 설치된다.
기존 Windows의 데이터 접근은? /mnt/c 에 mount되어 있음.  $ ls /mnt/ 로 기존 윈도우즈 파일들 확인 가능


OrangePi Lite 2 Swap 메모리 설정

 OrangePi Lite 2 Memory 1G를 사용중인데 약간 크기가 큰 것들을 컴파일 하면 시스템이 아주 아주 느려져 재부팅을 시키게 되는 일이 잦아 진다. 이때 swap 영역을 잡아 주면 시스템이 느려지는 현상을 상당히 완화 시킬 수 있다.

스왑(swap) 메모리

리눅스에서 swap메모리는 윈도우즈의 가상 메모리와 동일하며, 시스템의 램(RAM)이 부족한 경우 swap메모리를 이용하게 된다.

스왑메모리 영역을 설정하는 방법은 스왑 파티션이용방법과 스왑파일을 만들어 사용하는 방법이 있다. 스왑파일을 만들어 사용하는 방법을 간단히 정리한다.

스왑파일 생성

1GByte의 스왑메모리슬 설정한다. 크기를 늘리고자하면 필요한만큼 숫자를 올려주면 된다. 예를 들어 OpenCV를 build할 경우 2G정도 사용하는 것이 좋다.
sudo fallocate -l 1G /swapfile
권한 설정
sudo chmod 600 /swapfile

스왑메모리로 변경

sudo mkswap /swapfile

스왑메모리 활성화

sudo swapon /swapfile

스왑메모리 확인

free
swapon -s

부팅시 자동 설정

재부팅이후에도 스왑메모리가 자동으로 지정되게 하려면 /etc/fstab에 아래 내용 추가

sudo nano /etc/fstab
     /swapfile swap swap default 0 0

스왑메모리 제거

/etc/fstab에 저장된 스왑메모리의 마운트 내용 삭제 또는 주석처리

sudo nano /etc/fstab
     /swapfile swap swap default 0 0 제거 또는 주석처리
sudo swapoff -v /swapfile
sudo swapoff on /swapfile
sudo rm -r /swapfile

Link

OrangePi Lite 2 rootfs 확장

사용 Image : OrangePi_lite2_ubuntu_xenial_desktop_linux5.3.5_v2.0.1.img

발행일 : 2019년 12월 31일

OrangePi 이미지를 설치하고 나서 처음 부팅했을때 rootfs를 사용하고 있는 SD카드의 전체를 사용하도록 확장할 필요가 있다.

확장하기전 상태

$ df h


rootfs확장 스크립트 실행

$ resize_rootfs.sh


확장후 상태

$ df -h


* Raspberry Pi에서 root fs 확장 방법

라즈베리파이에서는 raspi-config 파일을 이용하면 된다
$ sudo raspi-config
7. Advanced Options 선택
A1. Expand Filesystem 선택
종료
리부팅

OrangePi Lite 2 VNC server 설치

OrangePi Lite 2에 VNC 서버 설치하기

X11vnc 패키지 설치

$ sudo apt install x11vnc

VNC 접속 패스워드 설정

$ x11vnc -storepasswd

VNC서버 시작

$ x11vnc -forever -shared -rfbauth ~/.vnc/passwd

자동실행하도록 설정

위에서 설정한 비밀번호를 복사

$ sudo cp ~/.vnc/passwd /etc/x11vnc.pass

자동실행 스크립트 작성

/etc/rc.local파일에서 exit 0위에 아래 내용 삽입

$ sudo nano /etc/rc.local

     x11vnc -display :0 -auth /var/run/lightdm/root/:0 -forever -bg -o /var/log/x11vnc.log -rfbauth /etc/x11vnc.pass -rfbport 5900
     

IP주소 확인

$ ifconfig

재부팅

OrangePi를 재부팅하고 로그인한다.

VNC연결

Chrome 브라우저에서 좌상단의 "앱"버튼을 누르고 VNC Viewer를 실행한다.

VNC Viewer에서 Address에 위에서 확인한 IP주소 값을 넣고 Connect버튼을 누른다.

위에서 설정한 패스워드 값을 입력한다.

Raspberry 4에서 tensorflow 2.2 설치

Tensorflow 2.2 package download

$ wget http://1.229.109.140:3562/tensorflow/tensorflow-2.2.0.armv7l/tensorflow-2.2.0-cp37-none-linux_armv7l.whl

--2020-09-03 16:45:10--  http://1.229.109.140:3562/tensorflow/tensorflow-2.2.0.armv7l/tensorflow-2.2.0-cp37-none-linux_armv7l.whl

Connecting to 1.229.109.140:3562... connected.

HTTP request sent, awaiting response... 200 

Length: 157689306 (150M)

Saving to: ‘tensorflow-2.2.0-cp37-none-linux_armv7l.whl’

tensorflow-2.2.0-cp 100%[===================>] 150.38M  2.03MB/s    in 82s     

2020-09-03 16:46:31 (1.84 MB/s) - ‘tensorflow-2.2.0-cp37-none-linux_armv7l.whl’ saved [157689306/157689306]

Install package

$ pip3 install tensorflow-2.2.0-cp37-none-linux_armv7l.whl



linux 카메라 콘트롤 - v4l2-ctl

 Linux머신에서 설치되어 있는 카메라의 정보 확인 및 제어할 수 있는 명령

v4l2-ctl 옵션확인

$ v4l2-ctl

설치된 카메라의 모든 정보 확인

$ v4l2-ctl --all
설명 추가

드라이버 정보 보기

$ v4l2-ctl -D

디바이스에서 제공될수 있는 포멧 리스트

$ v4l2-ctl --list-formats

프레임크기와 인터벌을 포함한 디바이스에서 제공될 수 있는 포멧 리스트

$ v4l2-ctl --list-formats-ext
$ lsusb


[OpenCV] Raspberry Pi 4에 opencv 3.4.9 설치

라즈베리파이 4에 OpenCV 3.2라이브러리 설치하기

기존에 OpenCV가 설치되어 있었을 경우 다음과 같이 삭제하고 진행한다.

$ sudo apt purge libopencv* python-opencv
$ sudo apt autoremove
$ sudo apt update
$ sudo apt upgrade

기존에 OpenCV가 설치되어 있지않았다면 위를 건너 뛰고 OpenCV라이브러리를 빌드하기 위한 필요 라이브러리들을 설치한다.

$ sudo apt install -y -y build-essential cmake
$ sudo apt install -y pkg-config
$ sudo apt install -y libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
$ sudo apt install -y libv4l-dev v4l-utils
$ sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev 
$ sudo apt install -y libqt4-dev libgtk2.0-dev
$ sudo apt install -y mesa-utils libgl1-mesa-dri libqt4-opengl-dev 
$ sudo apt install -y libatlas-base-dev gfortran libeigen3-dev
$ sudo apt install -y python2.7-dev python3-dev python-numpy python3-numpy

OpenCV Source Download

$ git clone https://github.com/opencv/opencv.git
$ cd opencv
$ git checkout tags/3.4.9
$ cd ..

$ git clone https://github.com/opencv/opencv_contrib.git
$ cd opencv_contrib
$ git checkout tags/3.4.9
$ cd ..

현재 4.4.0까지 릴리즈되어 있다. 3.4.9버전이 아니라 다른버전을 사용하고자 할때는 tags/3.4.9를 원하는 버전으로 바꾸어 사용하면 된다. tag를 보는 방법은 $ git tag

OpenCV 라이브러리 빌드

$ mkdir build
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_CUDA=OFF \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_OPENCV_PYTHON2=ON \
-D BUILD_OPENCV_PYTHON3=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
../

cmake를 수행했을때 위와 같이 config done이 출력되면 make파일이 성공적으로 만들어진 경우다 계속 진행하자

$ time make -j4
$ sudo make install
$ sudo sh -c 'echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
$ sudo apt upgrade

Raspberry Pi memory가 4GByte 이하일 경우 스왑메모리 설정

위에서 make하기 전에 스왑메모리를 늘려주어야 컴파일시 internal error가 발생하지 않는다.

$ sudo nano /etc/dphys-swapfile
               내용중 CONF_SWAPSIZE=100 을 CONF_SWAPSIZE=2000 으로 변경 하고 저장
$ sudo /etc/init.d/dphys-swapfile restart

Make가 끝난후에 다시 size를 100으로 변경한다.


관련문서

Ubuntu apt-get, apt-cache 명령

apt-get은 데비안 계열(ubuntu)의 리눅스에서 사용되는 패키지관리 명령어 도구

apt-get, apt-cache 대신 apt를 사용하세요. 진행사항을 프로그레스로 보여준다던가 업데이트해야할 갯수등 Option을 넣어야하는것들을 기본으로 사용하게 합니다.


Package Index정보를 업데이트 - /etc/apt/source.list에 있는 인텍스 정보를 최신 정보로 갱신

$  sudo apt update

Package 설치

$  sudo apt install 패키지이름
Package 재설치
$  sudo apt install 패키지이름
Package 삭제 - 설정파일은 지우지 않음
$  sudo apt remove 패키지이름
Package 삭제 - 설정까지 모두 지움
$  sudo apt --purge remove 패키지이름
Package 소스코드 다운로드
$  sudo apt source 패키지이름
다운로드 받은 소스를 의존성있게 빌드
$  sudo apt build-deb 패키지이름
설치된 Package Upgrade - 설치되어 있는 패키지를 새버전으로 Upgrade
$  sudo apt upgrade
설치된 Package의 의존성을 검사하며 Upgrade
$  sudo apt dist-upgrade
Package 검색
$  sudo apt search 패키지이름
Package 정보보기

$  sudo apt show 패키지이름


Protocol buffers ?

 프로토콜 버퍼란?

구글에서 만들어서 공개한 구조화된 데이터를 직렬화 하기 위한 언어중립적이고, 플랫폼 중립적인 확장 메카니즘이며, 저장을 목적으로 서로 통신할 프로그램을 개발할 때 유용하다.

지원 언어 : C++, Python, JAVA, GO


위키피디아 : 프로토콜버퍼

구글 개발자 싸이트

[OpenCV] OpenCV4에서 UVC Camera 사용시 capture 안되는 이슈

환경 :

- 라즈베리파이 4 with 라즈베리안

- OpenCV 4 


guvcview로는 video가 나오는데 테스트하려는 코드에서는 아래와 같은 오류 발생..


[ WARN:0] global /home/pi/work/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (933) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

[ WARN:0] global /home/pi/work/opencv/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (1184) setProperty OpenCV | GStreamer warning: GStreamer: unhandled property


Linux 설치된 특정 Library 버젼 확인하는 방법

 설치된 라이브러리의 버젼을 확인하고자 할 때 pkg-config 명령으로 아래와 같이 확인.

예를 들어  python의 버젼을 확인하고자 할때

$  pkg-config --modversion python


시스템에 설치된 모든 python버젼을 찾고 싶을때

$  pkg-config --list-all | grep python



팡팡은 싫은데

중앙일보 만평에 부동산 팡팡..

부동산 좀 안오르면 좋겠다.

정수기 필터 교환

정수기를 별도 설치하지않고 싱크대 벽면에 필터와 정수전용 수도꼭지를 달아서 사용하고 있다.
요즘 수도물에 벌레가 나온다는 뉴스에 오랜만에 정수 필터를 교체 했다.
필터 상태를 보니 2018년에 교체하고 2년간 교체를 하지않았네.. ㅡ,ㅡ
필터 순서는
세디먼트 필터-프리카본필터-UF엠브레인필터-포스트카본 필터 순으로 설치한다.
설치 전에 우선 필터 청소가 필요하다.
방법은 수도물에 필터를 연결하여 2양동이 정도 그냥 흘려 보내면된다.

세디먼트 필터를 연결하고 물흘리기 2양동이 정도 흘리면 그 뒤쪽에 프리카본 필터 연결하고 물흘리기 2양동이 ...
그렇게 4개 필터를 다 청소하면 원래 벽에 붙여 놓았던 필터를 제거 하고 그자리에 청소한 필터를 설치하고 정수된 물이 잘나오는지 확인하면 끝.


그리고 마지막으로 교체 날짜를 적어 준다..

맨 마지막필터는 교체를 못했네..
물맛이 좋아지는 필터라고 했는데..

석촌호수 롯데타워


석촌호수 서호에서 바라본 롯데타워 야경

자외선 살균기 만들기

코로나로 마스크 사용양이 늘어 매번 새것으로 사용하기에는 비용이 감당 안되 간단한 자외선(UVC) 살균기를 만들어 보았다.
마스크 뿐만아니라 휴대폰도 간혹 살균하고, 침대 매트리스나 화장실 청소할때 간혹 사욯한다.




Aliexpress에서 아래와 같은 UVC Lamp를 주문하고, 다이소에서 천원짜리 바구니를 구매했다.

추가적으로 조그만 나무조각, 스위치, 전선등을 이용해 아래와 같이 조립했다.