CentOS에서 PostgreSQL을 yum을 사용하여 설치하는 방법은 다음과 같습니다:

먼저, root 사용자로 로그인합니다.

PostgreSQL 패키지를 설치하기 위해 EPEL 저장소를 활성화합니다. 다음 명령을 실행합니다:

sudo yum install epel-release

PostgreSQL 패키지를 설치합니다. 다음 명령을 실행합니다:

sudo yum install postgresql-server

PostgreSQL 데이터베이스 클러스터를 초기화합니다. 다음 명령을 실행합니다:

sudo postgresql-setup initdb

 

PostgreSQL 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다. 다음 명령을 실행합니다:

sudo systemctl start postgresql
sudo systemctl enable postgresql

PostgreSQL 서버에 액세스하기 위해 PostgreSQL 사용자 계정의 암호를 설정합니다. 다음 명령을 실행합니다:

sudo passwd postgres

PostgreSQL 사용자로 전환합니다. 다음 명령을 실행합니다:

su - postgres

PostgreSQL 콘솔에 접속합니다. 다음 명령을 실행합니다:

psql

 

 

1. Program.cs에서 프로세스의 진입점을 분기한다.

internal static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        static void Main(string[] args)
        {
            if (Environment.UserInteractive)
            {
                Console.WriteLine("콘솔");

                Service1 service1 = new Service1();
                service1.TestStartupAndStop(args);
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }

2. Service1.cs (이름 다를 수 있음)에 디버깅용 함수를 추가한다.

internal void TestStartupAndStop(string[] args)
{
    Console.WriteLine($"Service starting...");
    this.OnStart(args);
    Console.WriteLine($"Service started. Press any key to stop.");
    Console.ReadKey();
    Console.WriteLine($"Service stopping...");
    this.OnStop();
    Console.WriteLine($"Service stopped. Closing in 5 seconds.");
    System.Threading.Thread.Sleep(5000);
}

3. 빌드 & 명령어로 서비스 생성

서비스 생성

1) cmd를 관리자 권한으로 실행

2) InstallUtil.exe가 위치한 경로로 이동 : cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 

3) cmd에서 서비스 Install : InstallUtil.exe C:\\VisualStudio프로젝트경로\Service(서비스명).exe

 

4. 삭제

sc delete 서비스 명

 

추가로 서비스 명 설정 등 기본 프리셋은 ProjectInstaller.Designer.cs에서 아래와 같이 할 수있다.

private void InitializeComponent()
{
    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    // 
    // serviceProcessInstaller1
    // 
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    this.serviceProcessInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_AfterInstall);
    // 
    // serviceInstaller1
    // 
    this.serviceInstaller1.Description = "CNC Collector Installer";
    this.serviceInstaller1.DisplayName = "WinSvr.CNC.Collector";
    this.serviceInstaller1.ServiceName = "CNCCollector";
    // 
    // ProjectInstaller
    // 
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});

}

Flask로 웹서버를 임시로 기동하면

WARNING : This is a development server. Do not use it in a production deployment.

Use a production WSGI server instead.

라는 문구를 볼 수 있다.

 

개발환경과 같이 단 건의 요청을 처리하는데는 flask를 써도 상관없지만

상용과 같이 high load 환경에서 flask는 분산처리가 제대로 되지 않아 요청을 처리하는데 실패하거나, 처리가 지연돼서 read timeout이 발생하기 쉽다.

 

이러한 문제를 해결하기 위해 nginx와 WSGI 서버를 사용하는 것이 정석이다.

나의 경우 API 서버라서 nginx를 사용하지 않고 WSGI 서버만 사용하고싶었다.

 

다른 출처에서는 gunicorn으로 flask의 app.py를 한번 더 감싸는 방법을 소개하는데,

flask의 app.py를 gunicorn 모듈로 실행하는 방법도 있다.

명령어는 

gunicorn --workers=1 --threads=4 --bind 0:5000 --timeout=0 file_name:app

이고, 

nohup 명령어를 이용해서 백그라운드로 실행할 수도 있다.

 

Flask나 Locust와 같이 웹서버를 기동하는 경우 flask run 이나 locust 명령어 실행시 특정환경에서

Fatal error in launcher: Unable to create process using "실행경로"와 같이 나오는 경우가 있다.

 

이 경우 python -m 이라는 명령어 (모듈로 인식)를 쓰면 정상적으로 동작한다.

pip install pywin32를 설치하는 방법으로 해결이 안될때,

conda를 사용하는 경우 conda로 설치하면 해결이 될 수 있다.

 

conda install -c anaconda pywin32

로 설치하면 끝!

pip로 설치할때 네트워크에 따라 SSL: CERTIFICATE_VERIFY_FAILED가 발생하는 경우가 있다.

 

이런 경우 trusted host임을 명시해야되는데

 

pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install 패키지명

과 같이 입력하면 설치가 가능하다.

conda의 경우

conda config --set ssl_verify False

와 같이 SSL 인증을 안하도록 바꾸고

conda install -c anaconda 패키지명

으로 설치하면 된다.

 

 

 

 

 

약 2기가정도가 운영체제이고 남은 공간은 할당되지 않은 상태인데 그대로 라즈베리파이에 넣으면된다.

할당되지 않은 공간은 처음 부팅이 되면서 할당된다

첫 login은 ubuntu/ubuntu로 하면된다.

바로 비밀번호를 변경해준다.

 

 

우선 인터넷 연결을 위해 ip를 잡아준다.

1) 최상위 경로로 이동(cd .. 두번)

2) sudo nano etc/netplan/50-cloud-init.yaml

network:
  ethernets:
    enp0s3:
      addresses: [192.168.0.136/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4] #네임서버 설정이 안되면 apt upgrade가 안됨
  version: 2

3) sudo netplan apply : 설정 적용

[sklearn] cython 코드 수정하기

 

sklearn 패키지의 일부 알고리즘은 속도를 위해 c언어 기반의 python으로 작성되어있다.

일반적으로 이 수준의 알고리즘을 변경할 일이 거의 없어서 그런지 site-package에 있는 코드는 이미 컴파일이 된 상태라서 수정이 불가능했다. 환경은 ubuntu이고 python은 3.8에서 테스트하였다.

 

수정을 하기 위해서는

1. sklearn 의 깃 저장소에서 컴파일되지 않은 코드 _cd_fast.pyx 파일을 다운받는다.

2. 컴파일된 파일과 같은 경로에 추가한다.

3. _cd_fast.pyx 를 입맛대로 바꿔서 다시 컴파일한다.

 

3. 의 과정을 자세히 설명하자면,

우선, pyx 파일을 컴파일하기 위해 cython이 설치되어 있어야한다.

그리고 setup.py 파일을 만들어 pyx 파일을 컴파일하는 코드를 추가해야한다.

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

이 코드를 실행시키는 코드는 아래와 같으며, cython 문서를 참조하면 된다.

python setup.py build_ext --inplace

 

코드 수정 과정에서 발생한 에러와 해결방법은 아래와 같다.

 

not allowed without gil error

cython에서는 gil (global interpreter lock) 이라는 cpu processing 방식이 존재하는데 코드 중 with nogil 이 있는곳에 코드를 임의로 수정하는 경우 아래와 같은 에러가 발생할 수 있다. 이 경우 with nogil의 코드블럭을 주석처리하면 에러가 사라진다. 

 

gcc failed with exit status 1

컴파일 과정에서 꽤 자주 발생할 것 같은 에러이다. gcc가 설치 되어있다는 가정하에 아래와 같은 에러가 뜬다면 코드를 추가하여 해결할 수 있다.

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("_cd_fast.pyx")
)

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

include_dirs=[numpy.get_include()]를 추가하면 에러를 해결할 수 있다.

 

와사비 종류
혼와사비(일본 토착 와사비)

혼와사비 또는 일본 토종 와사비는 심는 방법에 따라 더욱 분류할 수 있다:하천에 심으면 사와사비, 밭에 심으면 하타케와사비라고 한다.


사와 와사비

일본 고유의 야생식물인 와사비는 브라시카과 또는 겨자과에 속하는 상록수 초본 다년생이다. 사와사비는 깊은 산지의 계곡과 고랑을 흐르는 차고 맑은 물에서 야생으로 자라며 비슷한 조건을 가진 곳에서 재배한다. 최적의 재배 장소는 여름철 16℃, 겨울에는 10℃의 온도를 유지하는 풍부한 샘물이 있는 곳으로 낙엽수 숲으로 둘러싸여 있고, 여름에는 나무 덮개로 그늘을 드리우고, 나무 사이를 통과하는 따뜻한 햇살을 받을 수 있을 것이다. 시즈오카 현 이즈 구에는 앞에서 언급한 혼와사비 재배에 최적의 조건을 제공하는 계곡과 협곡이 있다. 따라서 일본 최대의 혼와사비 생산지역은 이즈(李州)에 있다.

하타케와사비

단순히 흙에 씨앗을 뿌려서 자라는 와사비는 그래서 하타케와사비 "하타케"는 "밭"을 의미한다. 주로 줄기 수확을 목적으로 재배되며, 도쿄는 물론 시즈오카, 나가노, 시마네, 야마구치 현 등지의 강제 재배(온실을 사용)에 의해 재배된다. 또한 대만, 인도네시아, 캐나다와 같은 나라에서도 해외에서 재배되고 있다. 이 중 대다수는 와사비스케(채취한 와사비)와 와사비 페이스트 등 가공제품에 쓰인다.

세요와사비

세요와사비는 북유럽에서 재배되는 다년생 식물이다. 일본에서는 와사비다이콘(다이콘 = 일본백무)이라고도 한다. 영어로는 고추냉이, 프랑스어로는 라이포트라고 한다. 혼와사비와 비슷한 매운 맛을 내기 때문에 향신료로 많이 쓰인다. 뿌리부분도 얇게 썰어 고기요리의 고명으로 쓰거나 생선요리를 드레싱하기 위한 소스로 갈아서 사용한다. 중세 이후 유럽에서도 약용으로, 방부제로, 또는 식욕을 돋우기 위해 사용되어 왔다. 오늘날에는 말려서 가루와사비의 주재료로 쓰인다.

[Pandas] UnicodeDecode 에러 : utf-8 인코딩 문제

 

판다스로 read_csv를 사용해서 csv 파일을 읽을 때, 특정 문자열 때문에 에러가 발생하는 경우가 있다.

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 22: invalid start byte

이 에러를 해결하는 방법은 encoding='CP949'을 아래와 같이 추가해주는 것이다.

df = pd.read_csv("xxx.csv", encoding='CP949')

 

+ Recent posts