Jupyter 에서 한글이 네모로 표시되면 Jupyter에 한글 글씨체가 설정이 되어 있지 않다는 의미다. 한글 글씨체를 설정해보자! 그래도 이왕 보는거 차트 볼때 예쁘게하기 위해서 배달의 민족 글씨체를 적용해보았다. 

글씨체 폰트는 아래에서 다운로드 받는다

http://font.woowahan.com/jua/

 

배달의민족 폰트 주아체 다운로드

배달의민족 주아체 다운로드 배달의민족 주아체는 붓으로 직접 그려서 만든 손글씨 간판을 모티브로 만들었습니다. 붓으로 그려 획의 굵기가 일정하지 않고 동글동글한 느낌을 주는 서체로 옛날 간판의 푸근함과 정겨움이 묻어나는 것이 특징입니다.

font.woowahan.com

아래 코드를 실행하고, 차트를 실행하면 글씨체가 적용된다.

from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="/Users/direcision/Library/Fonts/BMDOHYEON_otf.otf").get_name()
rc('font', family=font_name)

앞서 법정동코드에서 지역코드를 가져오는 방법에 대해서 설명을 했다. 이번에는 우리가 정말 필요한 지역의 지역코드를 가져오는게 필요하다. 지역코드의 단위는 행정동으로 구분이 되어있기 때문에 서울특별시의 모든 지역코드를 가져오기 위해서는 별도의 처리가 필요하다. 서울특별시의 행정구는 총 25개로 나누어져있다. 

https://ko.wikipedia.org/wiki/%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C%EC%9D%98_%ED%96%89%EC%A0%95_%EA%B5%AC%EC%97%AD

 

서울특별시의 행정 구역 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 서울특별시에는 2017년 기준으로 25개 자치구와 424개 행정동이 있다.[1] 서울특별시의 국회의원 선거구는 2016년 4월 13일 기준으로 49개 지역구로 나뉘어 있으며 거주 인구만을 기준으로 하여 상한 31만 2천 명, 하한 10만 4천 명으로 1개의 지역구를 나누었다. 행정 구역[편집] 행정구 세대 인구 면적 종로구 73,554 153,531 23.91 중구 61,075 125,941

ko.wikipedia.org

 

출처: 위키

위키를 보면 각각의 25개의 구에 대해서 인구, 세대, 면적을 표시하고 있다. 언제 수집을 했는지에 대해서는 나와있지 않다... 일단 25개의 행정구역으로 나누어져있기 때문에 우리는 위에 있는 지도로 봤을때 강서구, 양천구, 구로구,, ...., 강동구 등의 지역코드를 얻어야 한다. 

df[df['지역코드'].apply(lambda x: x[:2] == '11')][['법정동명','지역코드']]
pd.DataFrame(df[df['지역코드'].apply(lambda x: x[:2] == '11')]['지역코드'].unique()).to_csv("../data/seoul_code.csv", index=False)

위 코드를 통해서 우리는 아래와 같은 결과를 얻을 수 있다.

지역코드 '11'이 지역코드에 있고, 지역코드의 셋(set)을 얻으면 총 26개를 얻을 수 있는데 이 중에는 서울특별시 11000이 포함되어있기 때문에 11000을 제거하면 우리가 원하는 서울특별시의 지역코드 25개를 얻을 수 있다. 이제 지역코드를 이용해서 공공데이터 포털에서 서울특별시 실거래매매 데이터를 가져오기가 가능하다. 

서울 특별시 2019년 데이터를 가져오기 위해서는 12(1월~12월) x 25(행정구역) = 총 300번의 요청으로 가능하다. 공공데이터에서는 일일 트래픽이 1000이기 때문에 서울특별시 3년 데이터를 하루에 가져올 수 있다.

https://doubly12f.tistory.com/72

 

부동산 법정동코드 다운로드 및 인코딩 문제 해결 방법

부동산 아파트 매매 실거래 상세 자료를 갖고 오기 위해서는 지역코드와 기간을 이용하여 해당 기간에 해당지역의 아파트 매매 신고자료를 조회할 수 있다. 아래 URL을 보면 아파트매매 실거래 가져오기 위한 요청..

doubly12f.tistory.com

위 글에서 법정동코드를 다운로드 받고 인코딩 문제까지 알아보았다. 법정동코드와 행정동코드를 구분을 해야 공공데이터포털에서 원하는 지역의 데이터를 가져올 수 있다.

법정동코드에는 행정동코드가 포함되어 있다. ABC가 법정동코드라면 A는 행정동코드이다. 예를들어서 ABC가 서울특별시 종로구라고 한다면 A는 서울특별시의 행정동 코드이다. 그럼 법정동 코드에서 어떻게 행정동코드를 추출하는지 알아보자. 

pandas를 이용해서 위에서 얻은 파일을 읽으면, 법정동코드가 int64로 읽힌다. 법정동코드는 숫자의 의미가 아니기 때문에 문자열로 변환을 해준다. 변환이후에 [:5]의 slicing을 이용해서 최종 지역코드를 얻어낼 수 있다.

import pandas as pd
df.read_csv('../data/road_code.csv', index=False) 

df['폐지여부'].value_counts()

폐지    25565
존재    20542
Name: 폐지여부, dtype: int64

df = df[df['폐지여부'] == '존재']

df.dtypes
법정동코드     int64
법정동명     object
폐지여부     object
dtype: object

df['법정동코드'] = df['법정동코드'].astype(str)
df['지역코드'] = df['법정동코드'].apply(lambda x: x[:5])
df.head(5)

법정동코드	법정동명	폐지여부	지역코드
0	1100000000	서울특별시	존재	11000
1	1111000000	서울특별시 종로구	존재	11110
2	1111010100	서울특별시 종로구 청운동	존재	11110
3	1111010200	서울특별시 종로구 신교동	존재	11110
4	1111010300	서울특별시 종로구 궁정동	존재	11110

 

공공데이터포털에서 데이터 가져올때 SERVICE KEY IS NOT REGISTERED ERROR 가 발생한다면 두가지 이유다 첫번째는 포털사이트에서 미등록시 (1시간 정도 소요된다고 가이드를 준다.) 두번째는 인코딩 문제이다. 인코딩 문제를 해결하는 방법에 대해서 설명한다.

SERVICE_KEY를 받으면 unsafe characters인 %가 포함되어 있다. 우리는 항상 URL에서는 인코딩된 결과를 보기 때문에 자연스럽게 내가 파라미터에 넣어도 잘~ 동작하겠지 생각하지만 그렇게 넣으면 서비스키가 등록되어있지 않다고 나온다!

https://perishablepress.com/stop-using-unsafe-characters-in-urls/

 

(Please) Stop Using Unsafe Characters in URLs | Perishable Press

Just as there are specifications for designing with CSS, HTML, and JavaScript, there are specifications for working with URIs/URLs. The Internet Engineering Task Force (IETF) clearly defines these specifications in numerous documents, including the followi

perishablepress.com

 

현재 나의 SERVICE KEY에 %가 들어있다면 무조건 SERVICE KEY IS NOT REGISTERED ERROR 가 뜰것이다! 인증키가 이미 UTF-8로 제공되고 있기때문에 디코딩 작업이 필요하다. 왜 이렇게 제공을 했을까...

아래 코드는 python3를 기준으로 작성한 코드이다.

from urllib.parse import urlencode, quote_plus
import requests

requests.utils.unquote(SERVICE_KEY)

payload = {"pageNo":"1","startPage":"1","numOfRows":"99999","pageSize":"10","LAWD_CD":""+rcode+ "","DEAL_YMD":""+date+"","type":"json", "serviceKey": requests.utils.unquote(SERVICE_KEY)}
print (requests.utils.unquote(SERVICE_KEY)) 
 
headers = {
    'User-Agent': "PostmanRuntime/7.17.1",
    'Accept': "*/*",
    'Cache-Control': "no-cache",
    'Postman-Token': "95c151d9-9676-4069-a9b5-9bbd72bf5319,cd4efab7-c0c4-4714-a2a3-2a6e03677233",
    'Host': "openapi.molit.go.kr:8081",
    'Accept-Encoding': "gzip, deflate",
    'Cookie': "ROUTEID=.HTTP1",
    'Connection': "keep-alive",
    'cache-control': "no-cache"
    } 
response = requests.request("GET", url, headers=headers, params=payload)

이렇게 하면 결과가 아주 잘 나온다... 모두 삽질하지 마시길

부동산 아파트 매매 실거래 상세 자료를 갖고 오기 위해서는 지역코드와 기간을 이용하여 해당 기간에 해당지역의 아파트 매매 신고자료를 조회할 수 있다. 아래 URL을 보면 아파트매매 실거래 가져오기 위한 요청변수와, 출력결과에 대해서 문서화 되어 있다.

https://www.data.go.kr/subMain.jsp#/L3B1YnIvcG90L215cC9Jcm9zTXlQYWdlL29wZW5EZXZHdWlkZVBhZ2UkQF4wMTIkQF5wdWJsaWNEYXRhRGV0YWlsUGs9dWRkaTo1NDA0Nzg1ZS1lZDRjLTRiNzItODhmZS04YjI1Y2UwMGJiNmYkQF5tYWluRmxhZz10cnVl

여기서 지역코드를 가져와야하는데 지역코드에 대한 정보가 바로 없다.

행정표준코드관리시스템을 들어가면... 접속이 안된다.

공공데이터활용지원 센터에서 가이드를 보니 행정표준코드관리시스템에서 다운로드 하라고..

맥을 사용한다면 행정표준코드관리시스템 (https://www.code.go.kr/) 은 맥에서 접속이 안되고, 사파리에서 접속이 가능하다!

행정표준코드관리시스템에서 코드검색에 코드명 법정동을 입력하면 코드명 법정동이 나온다.

법정동 코드 전체자료를 다운로드하면 모든 법정동 코드 다운로드가 가능하다. 다운로드하고 파일을 열어보면 아래와 같이 깨져있는데,

인코딩 문제이다. 아마도 이 코드를 제공하는 제공자가 Window를 써서 이런 문제가 생긴게 아닌가 싶다. 우리는 utf8의 인코딩의 변환이 필요하기 때문에 다음과 같이 변환을 시도하면 원하는 결과를 얻을 수 있다.

df = pd.read_csv('/Users/direcision/Downloads/π˝¡§µøƒ⁄µÂ ¿¸√º¿⁄∑·.txt', encoding='cp949', sep='\t' )
df.to_csv('../data/rcode.csv', index=False) 

법정동 코드에 대한 전처리는 이후 포스팅에서 다루도록 한다.

1. ingress란

클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙들의 모음.
외부에서 접근가능한 url을 사용할 수 있게 하고,
트래픽 로드밸런싱도 해주고,
ssl 인증서 처리,
도메인 기반 가상 호스팅을 제공.
ingress 자체는 이런 규칙들을 정의해둔 자원.
실제 동작하게 해주는게 ingress controller.
클라우드서비스를 사용하는것이 아니라면
ingress와 ingress controller를 직접 연동해주어야함.

이때 가장 많이 사용되는게 kubernetes에서 제공하는 ingress-nginx.

2. ingress-nginx 설치, 사용.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

kubectl expose deploy nginx-ingress-controller --type=NodePort -n ingress-nginx

kubectl apply -f test.yaml

# 확인
kubectl describe ingress test

kubctl apply -f deployments-nginx.yaml

kubectl expose deploy nginx-deployment --name s1

 

  • test.yaml 내용

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: test
    annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
    rules:
     - host: xxx.xxx.xx
    paths:
     - path: /foos1
    backend:
    serviceName: s1
    servicePort: 80
     - path: /bars2
    backend:
    serviceName: s2
    servicePort: 80
     - host: xxx.xxx.xx
    http:
    paths:
     - backend:
    serviceName: s2
    servicePort: 80

     

  • deployments-nginx.yaml 내용.
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx
    ports:
    - containerPort: 80

 

3. 접근

kubectl get services --all-namespaces 에서 나온 port와 s1에 설정한 host, path를 이용하여
xxx.xxx.xxx:31536/foos1 로 접근 가능.

 

저는 소스관리를 위해 github을 사용중입니다.

ssh key 설정을 해두지 않으면 commit, push 할때 마다 로그인 정보를 입력해야하는 번거로움이 있습니다.

그런데 ssh key를 github deploy key에 등록해주면 그런 번거로움을 덜 수 있습니다.

 

1. git clone을 할때 http가 아닌 ssh 주소를 사용하세요

텍스트 추가

대표사진 삭제

사진 설명을 입력하세요.

텍스트 추가

 

2. 작업하는 서버에서 ssh key를 생성합니다.

ssh-keygen -t rsa -C “your_email@example.com”

 

3. 생성된 public key를 github settings > deploy keys에 push권한을 체크해서 등록해줍니다.

cat ~/.ssh/id_rsa.pub

 

텍스트 추가

대표사진 삭제

사진 설명을 입력하세요.

텍스트 추가

 

 

 

이제는 매번 로그인 하지 않아도 되네요 ^^

 

 

mysql8로 버전업이 됨에 따라 기존에 사용중이던 hibernate, mysql-connector-java등 version을 올리고 관련 conf수정하였다

수정 부분 요약.

  1. pom.xml
    hibernate.version=5.3.1.Final
    (hibernate-entitymanager 삭제, hibernate-validator 추가 )

  2. application.properties
    hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

  3. mysql8.0 user 권한부여

구체적인 내용.

  1. pom.xml 1.8 0.0.1
     <properties>
         <java.version>1.8</java.version>
         <twig-service.version>0.0.1</twig-service.version>
-        <hibernate.version>5.0.3.Final</hibernate.version>
+        <hibernate.version>5.3.1.Final</hibernate.version>
         <hibernate-javax-persistence.version>1.0.0.Final</hibernate-javax-persistence.version>
         <commons-configuration.version>1.10</commons-configuration.version>
-        <mariadb-java-client.version>1.3.0</mariadb-java-client.version>
+        <mariadb-java-client.version>2.4.1</mariadb-java-client.version>
         <querydsl.version>4.1.4</querydsl.version>
         <spring-data-mock.version>1.1.4</spring-data-mock.version>
+       <hibernate.validator.version>6.0.10.Final</hibernate.validator.version>
     </properties>

-       <dependency>
-            <groupId>org.hibernate</groupId>
-             <artifactId>hibernate-entitymanager</artifactId>
-             <version>${hibernate.version}</version>
-       </dependency>
+       <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+           <version>${hibernate.validator.version}</version>
+       </dependency>
        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
-            <version>5.1.37</version>
+            <version>8.0.16</version>
        </dependency>

 

  1. application.properties
    hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

  2. mysql설정

    - 아래와 같이 mysql conf수정
     default password plugin 설정 추가

    [mysqld]
    default-authentication-plugin=mysql_native_password

       - mysql 내 계정 생성시 문법 변경 및 인증 타입 명시  
         grant 에는 identified 삭제  
         create 시에 with mysql\_native\_password 추가

 create user 'mydb'@'%' IDENTIFIED WITH mysql_native_password BY 'YOURPASSWORD';
 GRANT ALL PRIVILEGES on mydb.* to 'myuser'@'%' WITH GRANT OPTION;

+ Recent posts