728x90

node.js를 사용한 웹서비스를 실행하려 할 때 다음과 같은 에러 메시지가 나타나며 진행되지 않는 경우가 있습니다.

본 필자는 다음과 같은 에러가 뜸
>> Error: listen EADDRINUSE: address already in use 127.0.0.1:1337

NodeJS address already in use 문제

이는 1337번 포트가 현재 다른 프로세스에서 사용 중이기 때문에 해당 포트를 사용하는 현재 서비스를 시작할 수 없다는 에러 메시지입니다. (에러의 포트 번호가 1337이 아닐 수도 있습니다.) 이는 정말로 다른 프로세스가 사용 중이거나, NodeJS 프로세스가 이전에 비정상적으로 종료된 경우 나타나는 흔한 증상인데요.

윈도우에서 포트를 사용하는 프로세스 찾기

윈도우는 명령 프롬프트(이하 cmd)를 열어 netstat 명령어를 통해 포트를 사용 중인 프로세스를 확인할 수 있습니다. 여기에 -a(모든 포트 표시) -n(IP:PORT 형식으로 표시), -o(PID 표시) 옵션을 붙인 명령어를 입력합니다: netstat -ano

위 사진에서처럼 1337번 포트를 사용하는 프로세스의 ID인 PID 값이 22072임을 확인할 수 있습니다.

이후 작업 관리자를 열고 세부 정보 탭(윈도우 10 기준)을 클릭한 뒤, PID를 정렬하여 22072번을 찾아보면 ‘node.exe’ 프로세스가 점유하고 있음을 알 수 있습니다. 이제 이 프로세스를 클릭한 후 하단의 ‘작업 끝내기’를 클릭하여 프로세스를 강제로 종료시킬 수 있습니다.

728x90
728x90

문제 설명

더보기

등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.

입출력 예

common                                                                                                                                    result

[1, 2, 3, 4] 5
[2, 4, 8] 16

 

 

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.

입출력 예 #2

  • [2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다.
def solution(common):
    num = common[1] - common[0]    
    if common[1] + num == common[2]:
        answer = common[len(common)-1] + num
    else:
        num = common[1] // common[0]    
        answer = common[len(common)-1] * num
    return answer

 

728x90
728x90

문제 설명

더보기

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

입출력 예

 babbling                                                                                                                                                                      result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

입출력 예 설명

입출력 예 #1

더보기

["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

더보기

["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다. 따라서 3을 return합니다.

풀이

def solution(babbling):
    count = 0
    babble = [ "aya", "ye", "woo", "ma" ]
    for utter in babbling:
        for text in babble:
            if text * 2 not in utter:
                utter = utter.replace(text, ' ')
        if utter.strip() == '':
            count += 1
    return count
def solution(babbling):
    c = 0
    for b in babbling:
        for w in [ "aya", "ye", "woo", "ma" ]:
            if w * 2 not in b:
                b = b.replace(w, ' ')
        if len(b.strip()) == 0:
            c += 1
    return c

풀이 설명

- 조카가 가능한 네 가지 발음이 담긴 배열 만들기 babble
- 함수의 입력값으로 들어온 babbling 배열을 for문을 돌리고 조카가 가능한 네 가지 발음이 담긴 babble배열과 비교
- 이 때 연속된 발음이 들어있지 않다면, 조카가 가능한 발음과 일치하는 부분을 모두 공백
- 전 단계 과정을 거친 단어가 공백을 제외하고 아무것도 없다면, 조카가 발음할 수 있는 단어이기에 count를 추가

 

관련 함수

1. replace()

  • 문자열을 변경하는 함수로서, 문자열 안에 특정 단어를 원하는 글자로 변경 가능하다.
  • replace(바꿀 단어, 원하는 단어, [count])
  • count : 변경할 횟수로서, 입력하지 않으면 모든 단어를 다 변경하게 된다.
  • default는 전체를 의미하는 count = -1로 지정되어 있다.
  • 즉, 문제에 적용하자면 들어온 리스트 'babbling'에 있는 단어들 중 w에 있는 단어가 있다면 이를 모두 ' ' 로 1회에 한하여 변경한다.
  • 만약, 똑같은 단어가 2개가 연결되어 있다 하더라도, 뒤에 단어는 변경되지 않는다. 예로, "ayaaya"가 있다면 ' aya'로 변경될 것이다.
  • 이는 문제에서 제시한 조건인 'babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장'을 지키고자 함이다.

2. strip()

  • strip([chars]) : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
  • lstrip([chars]) : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
  • rstrip([chars]) : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.
  • 즉, 문제 해결을 위해 단어에서 띄어쓰기를 모두 지우고, 글자들의 길이(len)이 0이면 answer에 1을 더하면 된다.
  •  

LV.0에서 제일 고난이도 문제..

728x90
728x90

라즈베리파이firebase 를 연동하기 위해 다음과 같은 코드를 실행하였다.

sudo pip3 install firebase_admin
suso pip install firebase_admin

하지만.. 다음과 같은 오류가 났고

ERROR: Failed building wheel for cryptography
Failed to build cryptography
ERROR: Could not build wheels for cryptography, which is required to install pyproject.toml-based projects

이 오류들은

아래와 같이 실행하면 오류 해결 가능하다.

# pip, pip3 와 python, python3는 본인의 pip와 python 버전에 맞게 설치바람

# pip 업그레이드
pip install --upgrade pip
pip3 install --upgrade pip

python -m pip install --upgrade pip
python3 -m pip install --upgrade pip

# 만약 오류가 난다면 —user 실행해서 설치해보기
python -m pip install --user --upgrade pip
python3 -m pip install --user --upgrade pip

# wheel 업그레이드 해주기
pip install --upgrade setuptools wheel
pip3 install --upgrade setuptools wheel
python3 -m pip install --upgrade setuptools wheel

# pip 업그레이드 됐다면 cryptography를 직접 설치해도 됨. 나는 이 과정은 생략.
pip install cryptography
pip3 install cryptography

python -m pip install cryptography
python3 -m pip install cryptography

# 위 과정을 안했다면 여기서부터 따라한다.
pip install minepy
pip3 install minepy 

# 최종 firebase_admin 설치 확인!
pip install firebase_admin

일단.. 나는 sudo pip install firebase_admin와 pip install firebase_admin을 해도 오류가 났음.

하지만 위 과정대로 pip을 업그레이드 시켜주고 sudo를 생략하고

pip install firebase_admin —-no-cache-dir

이렇게해서 설치가 완료됐음

728x90
728x90

앞서 opencv 설치에 대해서 포스팅을 했지만 여기에서는 pip을 통해 쉽게 바로 설치할 수 있는 방법을 사용하겠다.

이것을 모르고 나는 패키지 하나하나 설치를 하고... 하지만 이 방법으로 하면 5분안에 설치가 가능하다..!!!!!!

[따라하기]

pip install --upgrade pip setuptools wheel
pip install -U numpy
pip install -U opencv-python

위와 같이 코드를 차례대로 입력한다.
오류메시지 없이 설치가 잘 됐다면,

python
>> import cv2
>> cv2.__version__


1. 터미널에서 python을 치면
' >> '
가 나온다.
2. import cv2를 입력한다.
오류 메시지 없이 바로 ‘>>’ 가 나온다면 잘 설치된 것이다!!! (오류가 나오면 구글링으로 해결하고 다음 단계 진행)
3. 그 다음 cv2.__version__을 쳐서 설치된 opencv의 버전을 확인하자.!

4. 버전이 출력이 된다면 잘 설치가 된 것이다.





※참고※
이전에는 빌드로 설치를 진행했지만 여기에서는 pip로 설치하였다.

둘의 차이점은 빌드로 설치하는 것은 호환성때문이다.
그리고 라파 사양에서 opencv 설치시 메모리를 너무 먹기때문에 스왑 스페이스를 사용하는 것이다.

하지만 저번에 빌드로 설치했을 때 시간이 너무 오래걸리고 나와 같이 라즈베리파이 3 모델일 경우 진짜 오래걸린다.

(벗, 라파4모델일 경우 빌드해서 사용ㄱ 라파4는 그나마 빠름)

 
 



결국 pip로 설치하는 위와 같은 방법은
호환성이 떨어진다는 말이 있지만 확실히 빌드하는것보다 빨리 설치된다는 장점이 있다.
그리고 호환성에 대해서는 불편함 없이 잘만 실행된다.
하지만 종종 패키지 설치시 오류가 나지만 이건 구글링으로 충분히 해결 가능하기 때문에

빌드로 설치하는 것보다 pip 설치가 더 나아보인다.

결론 : 그냥 간단하게 pip로 설치하자ㅎㅎ!! 

728x90
728x90

- 라즈베리파이 셋팅

sudo pip3 install firebase_admin

- 파이어베이스 SDK 설치

sudo pip3 install schedule

추가로 schedule을 사용하기 위해 설치( 설치 자유 )
이 모듈은 정해진 시간마다 카메라를 이용해 사진을 찍고 이를 파이어베이스 스토리지에 업로드 하기 위한 모듈임

- 영상 촬영용 코드

from picamera import PiCamera
from time import sleep
import datetime
import sys
import os
import requests
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
from uuid import uuid4
import time

#자신의 project id
PROJECT_ID = "abc-1234" # 본인의 id 적기

#라즈베리파이에 다운받은 '비공개 키' 위치 설정 
cred = credentials.Certificate("/home/pi/key/AccountKey.json")
# 이 비공개 키의 주소는 본인에 맞게 설정

#스토리지 url 주소
default_app =
firebase_admin.initialize_app(cred, {
    'storageBucket': "fir-0a00b.appspot.com"
}) # “fri~” 이 부분은 본인의 주소로 바꿔야 함

#버킷은 Storage에서 데이터를 보관하는 기본 컨테이너.
bucket = storage.bucket() #기본 버킷 사용

#파일 업로드 함수 선언(def)
def fileUpload(file):
    blob = bucket.blob('Video/'+file)
    #new token and metadata 설정
    new_token = uuid4()
    metadata = {"firebaseStorageDownloadTokens": new_token} #access token이 필요하다.
    blob.metadata = metadata

    #upload file
    blob.upload_from_filename(filename='./Video/'+file, content_type='video/h264')
    print(blob.public_url)

#영상 촬영 함수 선언(def) 
# 라즈베리파이에서 영상 촬영 확장명은 .h264, .avi만 가능 mp4는 안됨

def recording_camera():
    basename = "noah"
    suffix = datetime.now().strftime("%Y%m%d_%H%M%S") + '.h264'
    filename = "_".join([basename, suffix])

    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.start_preview()
    
    #사진을 찍어서 저장한다. 파일의 중복되지 않도록 날짜시간을 넣어서 만들기
    camera.start_recording('/home/pi/senser_system/Video/' + filename) #자신의 주소에 맞게 설정
    camera.wait_recording(10)
    #sleep(10)
    camera.stop_recording()
    #사진 파일을 파이어베이스에 업로드 한다.
    fileUpload(filename)
    camera.stop_preview()
    camera.close()

def clearAll():
    #폴더안 파일 지우기
    path = 'Video'
    os.system('rm -rf %s/*' % path)

#10초마다 실행
schedule.every(10).seconds.do(recording_camera)

#10분마다 실행
#schedule.every(10).minutes.do(recording_camera)

 

728x90
728x90

pip install로 파이썬 패키지 다운로드할 때 -killed 라고 중지되는 경우가 있다.

이는

pip install <pakage> --no-cache-dir

이렇게 원하는 패키지 뒤에 —no-cache-dir 을 붙이면 오류 해결!!!

728x90
728x90

pip 설치 중 이런 오류가 뜬다.
이 오류는 루트 권한자로 실행하면 접근이 안된다는 오류이므로 루트 권한자릉 무시해주면 끄읕

pip install --root-user-action=ignore requests

원하는 패키지 뒤에 '--root-user-action=ignore requests' 만 써주면 된다!! 그럼 해결 완료!!!

728x90

+ Recent posts