Raspberry Pi 및 Python 드라이브 레코더 사용
11783 단어 RaspberryPiPython
활용단어참조
프로비저닝
특별한 점은 없고 라즈베리피에 카메라 모듈과 동영상 파일로 저장된 USB 메모리만 연결했다.(카메라는 먼저 테이프로 고정(^^;)이것만으로도 운전기록기가 될 수 있는 곳, 라즈베리피는 좋은 곳이다.
카메라 모듈
이번에 구입한 카메라 모듈은 여기 있습니다.
정현 스마트 라즈베리 파이용 카메라 모듈
전원 공급 장치
Raspberry Pi3의 요구에 대응하는 전원 공급 장치인 2.5A는 차량에 실린 시가 콘센트를 통해 5.5A까지 공급할 수 있고 다른 용도로도 사용할 수 있는 다음 USB 자동차 충전기를 사용했기 때문이다.
PISEN 차량 충전기 USB 커넥터×3(총 5.5A 출력)
USB 메모리
Raspberry Pi의 내장 디스크인 SD 카드의 크기는 여유가 없고 쓰기 횟수가 제한되어 있으며 애니메이션의 저장 목적지는 USB 메모리를 사용합니다.
USB 메모리는 라즈베리파이에서 사용 실적이 확인된 동지가 제조한 USB 메모리를 사용한다.
TOSHIBA16GB USB 플래시 메모리
USB 스토리지 설정
USB 메모리를 삽입하여 OS를 시작한 후 이번에도 다른 USB 장치를 삽입하지 않은 경우가/dev/sda에서 식별되었습니다.# lsusb
Bus 001 Device 005: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
# fdisk -l /dev/sda
Disk /dev/sda: 14.5 GiB, 15518924800 bytes, 30310400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ext4로 USB 스토리지를 포맷합니다.# mkfs -t ext4 /dev/sda
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in /dev/sda
Proceed anyway? (y,N) y
Creating filesystem with 3788800 4k blocks and 948416 inodes
Filesystem UUID: 5abc6e6d-bed2-4898-a263-13e07621deae
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
다음은 운영체제가 시작될 때 자동으로 불러오기 위해/etc/fstab로 설정하지만, 그 전에/dev/sda에 대응하는by-path 이름을 확인하십시오.(/dev/sda 등 장치 이름이 항상 USB 메모리만을 가리키는 것은 아니기 때문이다. USB 메모리에 삽입된 포트는 바뀌면by-path 이름이 바뀌어야 하기 때문에 쉽게 바뀌지 않도록 주의해야 한다.)# ls -l /dev/disk/by-path | grep sda
lrwxrwxrwx 1 root root 9 Mar 25 17:17 platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 -> ../../sda
상술한 값을 사용하여/etc/fstab로 설정합니다.USB 스토리지의 설치 대상은/data입니다.# cd /etc
# cp -p fstab fstab.YYYYMMDD
# vim fstab
/dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 /data ext4 defaults 0 0
마지막으로 OS 시작 시/data에 USB 스토리지가 설치되어 있는지 확인합니다.# mkdir /data
# reboot
# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sda 15G 41M 14G 1% /data
관련 비디오
몇 개의 촬영용 소프트웨어를 비교한 결과, 이번에는 Python용 카메라 라이브러리인 Picamera를 사용했다.(처음에 motion을 사용하려고 했지만 Raspbian Stretch Lite에서 필요한 라이브러리를 찾을 수 없음)
먼저 카메라를 사용합니다.
# raspi-config
[5 Interfacing Options Configure connections to peripherals]
[P1 Camera Enable/Disable connection to the Raspberry Pi Camera]
[Would you like the camera interface to be enabled?]→[Yes]
# reboot
그리고 pip로picamera를 설치합니다.
# pip3 install picamera
picamera를 사용하여 쓴 애니메이션 촬영용 코드는 다음과 같습니다.
movie.py#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import picamera
import time
import sys
FILEPATH = '/data/'
MOVIE_INTERVAL = 600
def main(now):
filename = FILEPATH + now + ".h264"
with picamera.PiCamera() as camera:
camera.hflip = True
camera.vflip = True
camera.resolution = (1024,768)
camera.brightness = 70
camera.start_recording(filename)
time.sleep(MOVIE_INTERVAL)
camera.stop_recording()
if __name__ == '__main__':
if len(sys.argv[1:]) != 1:
print("Invalid argument.")
sys.exit(1)
main(sys.argv[1])
코드 보충.
이번에 구입한 카메라 모듈은 여기 있습니다.
정현 스마트 라즈베리 파이용 카메라 모듈
전원 공급 장치
Raspberry Pi3의 요구에 대응하는 전원 공급 장치인 2.5A는 차량에 실린 시가 콘센트를 통해 5.5A까지 공급할 수 있고 다른 용도로도 사용할 수 있는 다음 USB 자동차 충전기를 사용했기 때문이다.
PISEN 차량 충전기 USB 커넥터×3(총 5.5A 출력)
USB 메모리
Raspberry Pi의 내장 디스크인 SD 카드의 크기는 여유가 없고 쓰기 횟수가 제한되어 있으며 애니메이션의 저장 목적지는 USB 메모리를 사용합니다.
USB 메모리는 라즈베리파이에서 사용 실적이 확인된 동지가 제조한 USB 메모리를 사용한다.
TOSHIBA16GB USB 플래시 메모리
USB 스토리지 설정
USB 메모리를 삽입하여 OS를 시작한 후 이번에도 다른 USB 장치를 삽입하지 않은 경우가/dev/sda에서 식별되었습니다.# lsusb
Bus 001 Device 005: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
# fdisk -l /dev/sda
Disk /dev/sda: 14.5 GiB, 15518924800 bytes, 30310400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ext4로 USB 스토리지를 포맷합니다.# mkfs -t ext4 /dev/sda
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in /dev/sda
Proceed anyway? (y,N) y
Creating filesystem with 3788800 4k blocks and 948416 inodes
Filesystem UUID: 5abc6e6d-bed2-4898-a263-13e07621deae
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
다음은 운영체제가 시작될 때 자동으로 불러오기 위해/etc/fstab로 설정하지만, 그 전에/dev/sda에 대응하는by-path 이름을 확인하십시오.(/dev/sda 등 장치 이름이 항상 USB 메모리만을 가리키는 것은 아니기 때문이다. USB 메모리에 삽입된 포트는 바뀌면by-path 이름이 바뀌어야 하기 때문에 쉽게 바뀌지 않도록 주의해야 한다.)# ls -l /dev/disk/by-path | grep sda
lrwxrwxrwx 1 root root 9 Mar 25 17:17 platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 -> ../../sda
상술한 값을 사용하여/etc/fstab로 설정합니다.USB 스토리지의 설치 대상은/data입니다.# cd /etc
# cp -p fstab fstab.YYYYMMDD
# vim fstab
/dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 /data ext4 defaults 0 0
마지막으로 OS 시작 시/data에 USB 스토리지가 설치되어 있는지 확인합니다.# mkdir /data
# reboot
# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sda 15G 41M 14G 1% /data
관련 비디오
몇 개의 촬영용 소프트웨어를 비교한 결과, 이번에는 Python용 카메라 라이브러리인 Picamera를 사용했다.(처음에 motion을 사용하려고 했지만 Raspbian Stretch Lite에서 필요한 라이브러리를 찾을 수 없음)
먼저 카메라를 사용합니다.
# raspi-config
[5 Interfacing Options Configure connections to peripherals]
[P1 Camera Enable/Disable connection to the Raspberry Pi Camera]
[Would you like the camera interface to be enabled?]→[Yes]
# reboot
그리고 pip로picamera를 설치합니다.
# pip3 install picamera
picamera를 사용하여 쓴 애니메이션 촬영용 코드는 다음과 같습니다.
movie.py#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import picamera
import time
import sys
FILEPATH = '/data/'
MOVIE_INTERVAL = 600
def main(now):
filename = FILEPATH + now + ".h264"
with picamera.PiCamera() as camera:
camera.hflip = True
camera.vflip = True
camera.resolution = (1024,768)
camera.brightness = 70
camera.start_recording(filename)
time.sleep(MOVIE_INTERVAL)
camera.stop_recording()
if __name__ == '__main__':
if len(sys.argv[1:]) != 1:
print("Invalid argument.")
sys.exit(1)
main(sys.argv[1])
코드 보충.
Raspberry Pi의 내장 디스크인 SD 카드의 크기는 여유가 없고 쓰기 횟수가 제한되어 있으며 애니메이션의 저장 목적지는 USB 메모리를 사용합니다.
USB 메모리는 라즈베리파이에서 사용 실적이 확인된 동지가 제조한 USB 메모리를 사용한다.
TOSHIBA16GB USB 플래시 메모리
USB 스토리지 설정
USB 메모리를 삽입하여 OS를 시작한 후 이번에도 다른 USB 장치를 삽입하지 않은 경우가/dev/sda에서 식별되었습니다.# lsusb
Bus 001 Device 005: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
# fdisk -l /dev/sda
Disk /dev/sda: 14.5 GiB, 15518924800 bytes, 30310400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ext4로 USB 스토리지를 포맷합니다.# mkfs -t ext4 /dev/sda
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in /dev/sda
Proceed anyway? (y,N) y
Creating filesystem with 3788800 4k blocks and 948416 inodes
Filesystem UUID: 5abc6e6d-bed2-4898-a263-13e07621deae
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
다음은 운영체제가 시작될 때 자동으로 불러오기 위해/etc/fstab로 설정하지만, 그 전에/dev/sda에 대응하는by-path 이름을 확인하십시오.(/dev/sda 등 장치 이름이 항상 USB 메모리만을 가리키는 것은 아니기 때문이다. USB 메모리에 삽입된 포트는 바뀌면by-path 이름이 바뀌어야 하기 때문에 쉽게 바뀌지 않도록 주의해야 한다.)# ls -l /dev/disk/by-path | grep sda
lrwxrwxrwx 1 root root 9 Mar 25 17:17 platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 -> ../../sda
상술한 값을 사용하여/etc/fstab로 설정합니다.USB 스토리지의 설치 대상은/data입니다.# cd /etc
# cp -p fstab fstab.YYYYMMDD
# vim fstab
/dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 /data ext4 defaults 0 0
마지막으로 OS 시작 시/data에 USB 스토리지가 설치되어 있는지 확인합니다.# mkdir /data
# reboot
# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sda 15G 41M 14G 1% /data
관련 비디오
몇 개의 촬영용 소프트웨어를 비교한 결과, 이번에는 Python용 카메라 라이브러리인 Picamera를 사용했다.(처음에 motion을 사용하려고 했지만 Raspbian Stretch Lite에서 필요한 라이브러리를 찾을 수 없음)
먼저 카메라를 사용합니다.
# raspi-config
[5 Interfacing Options Configure connections to peripherals]
[P1 Camera Enable/Disable connection to the Raspberry Pi Camera]
[Would you like the camera interface to be enabled?]→[Yes]
# reboot
그리고 pip로picamera를 설치합니다.
# pip3 install picamera
picamera를 사용하여 쓴 애니메이션 촬영용 코드는 다음과 같습니다.
movie.py#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import picamera
import time
import sys
FILEPATH = '/data/'
MOVIE_INTERVAL = 600
def main(now):
filename = FILEPATH + now + ".h264"
with picamera.PiCamera() as camera:
camera.hflip = True
camera.vflip = True
camera.resolution = (1024,768)
camera.brightness = 70
camera.start_recording(filename)
time.sleep(MOVIE_INTERVAL)
camera.stop_recording()
if __name__ == '__main__':
if len(sys.argv[1:]) != 1:
print("Invalid argument.")
sys.exit(1)
main(sys.argv[1])
코드 보충.
# lsusb
Bus 001 Device 005: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
# fdisk -l /dev/sda
Disk /dev/sda: 14.5 GiB, 15518924800 bytes, 30310400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# mkfs -t ext4 /dev/sda
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in /dev/sda
Proceed anyway? (y,N) y
Creating filesystem with 3788800 4k blocks and 948416 inodes
Filesystem UUID: 5abc6e6d-bed2-4898-a263-13e07621deae
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
# ls -l /dev/disk/by-path | grep sda
lrwxrwxrwx 1 root root 9 Mar 25 17:17 platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 -> ../../sda
# cd /etc
# cp -p fstab fstab.YYYYMMDD
# vim fstab
/dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 /data ext4 defaults 0 0
# mkdir /data
# reboot
# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sda 15G 41M 14G 1% /data
몇 개의 촬영용 소프트웨어를 비교한 결과, 이번에는 Python용 카메라 라이브러리인 Picamera를 사용했다.(처음에 motion을 사용하려고 했지만 Raspbian Stretch Lite에서 필요한 라이브러리를 찾을 수 없음)
먼저 카메라를 사용합니다.
# raspi-config
[5 Interfacing Options Configure connections to peripherals]
[P1 Camera Enable/Disable connection to the Raspberry Pi Camera]
[Would you like the camera interface to be enabled?]→[Yes]
# reboot
그리고 pip로picamera를 설치합니다.
# pip3 install picamera
picamera를 사용하여 쓴 애니메이션 촬영용 코드는 다음과 같습니다.movie.py
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import picamera
import time
import sys
FILEPATH = '/data/'
MOVIE_INTERVAL = 600
def main(now):
filename = FILEPATH + now + ".h264"
with picamera.PiCamera() as camera:
camera.hflip = True
camera.vflip = True
camera.resolution = (1024,768)
camera.brightness = 70
camera.start_recording(filename)
time.sleep(MOVIE_INTERVAL)
camera.stop_recording()
if __name__ == '__main__':
if len(sys.argv[1:]) != 1:
print("Invalid argument.")
sys.exit(1)
main(sys.argv[1])
코드 보충.driverecord.sh
#!/bin/zsh -x
DATE=""
while :
do
DATE=$(date "+%Y%m%d_%H%M%S")
/usr/local/bin/movie.py "${DATE}"
if [ $? -ne 0 ]; then
echo "Camera Recording Error."
exit 1
fi
done
비디오 촬영 스크립트 자동 시작
OS를 넣고 시작할 때 만든 애니메이션 촬영용 스크립트의 자동 시작 설정입니다.
이번 Raspbian Stretch Lite 사용에 시스템d가 적용되었기 때문에 이전의/etc/rc.로컬 대신 시스템의 단위 파일을 만듭니다.
/etc/systemd/system/driverecord.service[Unit]
Description=run drive record during boot
After=network.target
[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/zsh -c "/usr/local/bin/driverecord.sh >> /data/camera_$$(/bin/date +%%Y%%m%%d_%%H%%M%%S).log 2>&1"
[Install]
WantedBy=multi-user.target
나는 이 보도를 참고했다.정말 감사합니다.
시스템이 운영체제를 시작할 때 임의의 프로그램을 실행합니다
차에 싣다
사진처럼 탑재되어 있습니다.여기서도 라즈베리 파이 본체의 고정 테이프가 활발합니다 (^^;)
비디오 변환
USB 메모리에 저장된 비디오 파일(h264)이 mp4로 변환되었습니다.
변환 처리는 이번에 맥북에서 진행되었다.
변환 프로세스를 위한 MP4Box를 포함하는 GPAC를 Mac에 설치합니다.
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
Raspberry Pi에서 애니메이션 파일을 Mac의 적절한 디렉토리로 복사하여 요약하여 mp4로 변환합니다.# cd DriveRecord
# scp -r "username@hostname:/data/*" .
# ls -1 *264 | awk -F "." '{print $1}' | while read l; do MP4Box -fps 30 -add $l.h264 $l.mp4; done
관련 비디오
mp4에서 다시 변환·압축된gif이기 때문에 약간 거칠지만, 실제로는 조금 더 잘 찍을 수 있다.
도전하다
현재는 자동차 엔진이 멈추는 동시에 라즈베리피도 멈추기 때문에 OS와 디스크에 대한 불안과 다음 가동 시 OS의 시간이 혼란스러워지는 것이 과제다.
우선 전원이 꺼진 후에도 이동(한 번, USB 메모리의 파일 시스템이 고장 나거나), 시간도 집 와이파이와 스마트폰의 온라인 환경에서 NTP를 사용하면 원상태로 회복할 수 있지만, 꺼진 버튼의 설치와 GPS를 통해 해결할 수 있기 때문에 따라잡을 수 있다면 좋겠다고 생각합니다.
Reference
이 문제에 관하여(Raspberry Pi 및 Python 드라이브 레코더 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kutsurogi194/items/b21742b4063f4c3b6570
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[Unit]
Description=run drive record during boot
After=network.target
[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/zsh -c "/usr/local/bin/driverecord.sh >> /data/camera_$$(/bin/date +%%Y%%m%%d_%%H%%M%%S).log 2>&1"
[Install]
WantedBy=multi-user.target
사진처럼 탑재되어 있습니다.여기서도 라즈베리 파이 본체의 고정 테이프가 활발합니다 (^^;)
비디오 변환
USB 메모리에 저장된 비디오 파일(h264)이 mp4로 변환되었습니다.
변환 처리는 이번에 맥북에서 진행되었다.
변환 프로세스를 위한 MP4Box를 포함하는 GPAC를 Mac에 설치합니다.
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
Raspberry Pi에서 애니메이션 파일을 Mac의 적절한 디렉토리로 복사하여 요약하여 mp4로 변환합니다.# cd DriveRecord
# scp -r "username@hostname:/data/*" .
# ls -1 *264 | awk -F "." '{print $1}' | while read l; do MP4Box -fps 30 -add $l.h264 $l.mp4; done
관련 비디오
mp4에서 다시 변환·압축된gif이기 때문에 약간 거칠지만, 실제로는 조금 더 잘 찍을 수 있다.
도전하다
현재는 자동차 엔진이 멈추는 동시에 라즈베리피도 멈추기 때문에 OS와 디스크에 대한 불안과 다음 가동 시 OS의 시간이 혼란스러워지는 것이 과제다.
우선 전원이 꺼진 후에도 이동(한 번, USB 메모리의 파일 시스템이 고장 나거나), 시간도 집 와이파이와 스마트폰의 온라인 환경에서 NTP를 사용하면 원상태로 회복할 수 있지만, 꺼진 버튼의 설치와 GPS를 통해 해결할 수 있기 때문에 따라잡을 수 있다면 좋겠다고 생각합니다.
Reference
이 문제에 관하여(Raspberry Pi 및 Python 드라이브 레코더 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kutsurogi194/items/b21742b4063f4c3b6570
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# cd DriveRecord
# scp -r "username@hostname:/data/*" .
# ls -1 *264 | awk -F "." '{print $1}' | while read l; do MP4Box -fps 30 -add $l.h264 $l.mp4; done
mp4에서 다시 변환·압축된gif이기 때문에 약간 거칠지만, 실제로는 조금 더 잘 찍을 수 있다.
도전하다
현재는 자동차 엔진이 멈추는 동시에 라즈베리피도 멈추기 때문에 OS와 디스크에 대한 불안과 다음 가동 시 OS의 시간이 혼란스러워지는 것이 과제다.
우선 전원이 꺼진 후에도 이동(한 번, USB 메모리의 파일 시스템이 고장 나거나), 시간도 집 와이파이와 스마트폰의 온라인 환경에서 NTP를 사용하면 원상태로 회복할 수 있지만, 꺼진 버튼의 설치와 GPS를 통해 해결할 수 있기 때문에 따라잡을 수 있다면 좋겠다고 생각합니다.
Reference
이 문제에 관하여(Raspberry Pi 및 Python 드라이브 레코더 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kutsurogi194/items/b21742b4063f4c3b6570
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Raspberry Pi 및 Python 드라이브 레코더 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kutsurogi194/items/b21742b4063f4c3b6570텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)