이전 포스팅에는 가장 마지막에 있는 1개의 필드만 cut을 사용해서 가져오는 방법을 적었었다.

쓰다보니 완전히 반대로 마지막 1개 필드만 제외한 나머지 전체 필드가 필요한 상황이 생겼다.


PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330/1010312 에서 

/1010312를 제외한 나머지 정보를 가져와야 한다.


PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330


% echo "PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330/1010312" | rev | cut -d '/' -f2- | rev
PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330


사용한 명령어를 아래에 다시 풀어씀

% echo "PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330/1010312" \
? | rev | cut -d '/' -f2- | rev
PPAAPP_TrafficControl.c@@/main/PPP_X-CHECK_R330




..

반응형

전체 경로에서 가장 우측에 있는 파일 명만 가져오고 싶다.

방법을 잘 모르겠다.


cut을 사용해서 가져오는 방법이 있었다.


% echo "/home/byungwoo/c/src/util/request/request_test.c" | rev | cut -d '/' -f 1 | rev



이하 예제


# '/'로 시작하니까 아무 결과 없음
% echo "/home/byungwoo/c/src/util/request/request_test.c" \
? | cut -d '/' -f 1

# '1/2/3..
% echo "/home/byungwoo/c/src/util/request/request_test.c" \
? | cut -d '/' -f 2
home

# rev로 뒤집어서 하면 간편함  <--- rev
% echo "/home/byungwoo/c/src/util/request/request_test.c" \
? | rev | cut -d '/' -f 1 | rev
request_test.c






..

반응형


redis-cli

 -h : host ip address

 -p : port number

 -a : password


redis-cli -h 127.0.0.1 -p 6379 -a mysupersecretpassword


참고로 비밀번호에 $가 있으면 에러가 발생하므로 사용하지 않는다.

반응형

#######################################################

# 원본: http://highthroughput.org/wp/    (Hyeshik Chang 장혜식님) 

# 원본참고: http://pinkwink.kr/1005

#######################################################


2곳의 원본을 참고하여 대한민국 지도에

인구 분포도를 그려주는 코드를 한줄한줄 따라가면서 

numpy, pandas, matplotlib에 대한 사용법을 익혀보았다.

필요한 csv 파일과 소스코드는 핑크윙크에 가면 있다.


각 라인별로 주석을 달아두었다.

drawKorea 함수만 이해해도 왠만한건 할 수 있을것 같다.



#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


BORDER_LINES = [
    [(3, 2), (5, 2), (5, 3), (9, 3), (9, 1)],  # 인천
    [(2, 5), (3, 5), (3, 4), (8, 4), (8, 7), (7, 7), (7, 9), (4, 9), (4, 7), (1, 7)],  # 서울
    [(1, 6), (1, 9), (3, 9), (3, 10), (8, 10), (8, 9),
     (9, 9), (9, 8), (10, 8), (10, 5), (9, 5), (9, 3)],  # 경기도
    [(9, 12), (9, 10), (8, 10)],  # 강원도
    [(10, 5), (11, 5), (11, 4), (12, 4), (12, 5), (13, 5),
     (13, 4), (14, 4), (14, 2)],  # 충청남도
    [(11, 5), (12, 5), (12, 6), (15, 6), (15, 7), (13, 7),
     (13, 8), (11, 8), (11, 9), (10, 9), (10, 8)],  # 충청북도
    [(14, 4), (15, 4), (15, 6)],  # 대전시
    [(14, 7), (14, 9), (13, 9), (13, 11), (13, 13)],  # 경상북도
    [(14, 8), (16, 8), (16, 10), (15, 10),
     (15, 11), (14, 11), (14, 12), (13, 12)],  # 대구시
    [(15, 11), (16, 11), (16, 13)],  # 울산시
    [(17, 1), (17, 3), (18, 3), (18, 6), (15, 6)],  # 전라북도
    [(19, 2), (19, 4), (21, 4), (21, 3), (22, 3), (22, 2), (19, 2)],  # 광주시
    [(18, 5), (20, 5), (20, 6)],  # 전라남도
    [(16, 9), (18, 9), (18, 8), (19, 8), (19, 9), (20, 9), (20, 10)],  # 부산시
]
"""
# ziped BORDER_LINES 확인
>>>    for path in BORDER_LINES:
>>>        ys, xs = zip(*path)

(3, 5, 5, 9, 9) (2, 2, 3, 3, 1)
(2, 3, 3, 8, 8, 7, 7, 4, 4, 1) (5, 5, 4, 4, 7, 7, 9, 9, 7, 7)
(1, 1, 3, 3, 8, 8, 9, 9, 10, 10, 9, 9) (6, 9, 9, 10, 10, 9, 9, 8, 8, 5, 5, 3)
(9, 9, 8) (12, 10, 10)
(10, 11, 11, 12, 12, 13, 13, 14, 14) (5, 5, 4, 4, 5, 5, 4, 4, 2)
(11, 12, 12, 15, 15, 13, 13, 11, 11, 10, 10) (5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 8)
(14, 15, 15) (4, 4, 6)
(14, 14, 13, 13, 13) (7, 9, 9, 11, 13)
(14, 16, 16, 15, 15, 14, 14, 13) (8, 8, 10, 10, 11, 11, 12, 12)
(15, 16, 16) (11, 11, 13)
(17, 17, 18, 18, 15) (1, 3, 3, 6, 6)
(19, 19, 21, 21, 22, 22, 19) (2, 4, 4, 3, 3, 2, 2)
(18, 20, 20) (5, 5, 6)
(16, 18, 18, 19, 19, 20, 20) (9, 9, 8, 8, 9, 9, 10)

# 읽어들였던 data_draw_korea.csv 엑셀 파일의 일부
,인구수,shortName,x,y,면적,광역시도,행정구역
0,202520,강릉,11,4,1040.07,강원도,강릉시
1,25589,고성(강원),9,0,664.19,강원도,고성군
2,86747,동해,11,5,180.01,강원도,동해시
3,63986,삼척,11,8,1185.8,강원도,삼척시
4,76733,속초,9,1,105.25,강원도,속초시

... 후략...

"""


def drawKorea(target_data, blocked_map, d1, d2, cmapname):

    vmin = min(blocked_map[target_data])  # target_data의 최소값 (인구수가 가장 적은 값)
    vmax = max(blocked_map[target_data])  # target_data의 최대값 (인구수가 가장 많은 값)
    white_label_min = (vmax - vmin) * 0.25 + vmin

    # .csv에서 받아온 정보에서 사용하기 좋게 pivot
    map_data = blocked_map.pivot(index='y', columns='x', values=target_data)

    # np.isnan(map_data)는 Nan이면 True, 나머지는 False 리턴해주고
    # 이것을 바탕으로 마스킹 배열 생성
    masked_mapdata = np.ma.masked_where(condition=np.isnan(map_data), a=map_data, copy=True)  # numpy masked array

    plt.figure(figsize=(8, 13))  # width, height tuple in inches

    # create a pseudocolor plot of a 2-D array.
    # plt.pcolor 대신에 pcolormesh 사용함.
    plt.pcolormesh(masked_mapdata, vmin=vmin, vmax=vmax, cmap=cmapname, edgecolor='#aaaaaa', linewidth=0.5)

    for idx, row in blocked_map.iterrows():  # rows에 대한 반복 처리
        # 인구수: row[target_data]
        annocolor = 'white' if row[target_data] > white_label_min else 'black'

        # 광역시도: row[d1]
        # 행정구역: row[d2]

        # 광역시는 구 이름이 겹치는 경우가 많아서 시단위 이름도 같이 표시한다. (중구, 서구)
        # XX시로 끝나지만 세종시가 아닌 것들만 예외처리
        if row[d1].endswith('시') and not row[d1].startswith('세종'):
            # row[d1] : 서울특별시, 부산광역시...  row[d1][:2] : 서울, 부산...
            # row[d2] : 서대문구, 서초구, 중구 ... row[d2][:-1] : 서대문, 서초, 중 ...
            dispname = '{}\n{}'.format(row[d1][:2], row[d2][:-1])
            if len(row[d2]) <= 2:
                # 중, 서, ... -> 중구, 서구, ...
                dispname += row[d2][-1]
        else:
            # 제주특별자치도, 전라남도, 경상북도, ...
            dispname = row[d2][:-1]

        # 서대문구, 서귀포시 같이 이름이 3자 이상인 경우에 작은 글자로 표시한다.
        if len(dispname.splitlines()[-1]) >= 3:
            fontsize, linespacing = 9.5, 1.5
        else:
            fontsize, linespacing = 11, 1.2

        # dispname '서울/n강남'에 대한 annotating
        plt.annotate(s=dispname,
                     xy=(row['x'] + 0.5, row['y'] + 0.5),
                     fontweight='bold', fontsize=fontsize,
                     horizontalalignment='center',
                     verticalalignment='center',
                     color=annocolor,
                     linespacing=linespacing)

    for path in BORDER_LINES:
        ys, xs = zip(*path)
        # plot xs, ys
        plt.plot(xs, ys, color='black', linewidth=4)

    plt.gca().invert_yaxis()  # x, y 뒤집어야 함
    plt.gca().set_aspect(aspect='equal')

    plt.axis('off')

    # 우측에 컬러바를 통해서 색상에 따라 수치를 파악할 수 있음
    # shirink: 컬러바의 전반적인 크기 조절
    # aspect: 컬러바의 폭 조절
    cb = plt.colorbar(shrink=0.1, aspect=10)
    cb.set_label(label=target_data)

    plt.tight_layout()
    plt.show()

def main():
    plt.rcParams["font.family"] = "AppleGothic"  # font setting

    # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
    plt.rcParams['axes.unicode_minus'] = False  # use hypen '-' (True: use unicode minus)

    data_draw_korea = pd.read_csv('./data_draw_korea.csv', index_col=0, encoding='UTF-8')
    data_draw_korea.head()  # return first row

    drawKorea('인구수', data_draw_korea, '광역시도', '행정구역', 'Blues')


if __name__ == '__main__':
    main()

...












...

반응형

기존에 #ifdef로 이력을 남겼던 것을 찾아서

삭제하는 작업을 하고 있다.

해당 파일을 grep으로 찾아서 열어보고 처리해야 하는데 번거롭다.


파일명만 가져다가 한번에 사용하고 싶어서

문자열 자르기를 찾아보았다.


이하 예제는 범용적인 이름으로 다 변경함


1. grep 수행


% grep _UPGRADE_FRAMEWORK_ *.[ch]
TEST_Options.c:14:#ifndef _UPGRADE_FRAMEWORK_
TEST_SendResponse.c:14:#ifndef _UPGRADE_FRAMEWORK_
TEST_Session.c:16:#ifndef _UPGRADE_FRAMEWORK_
TEST_Stats.c:1:#ifndef _UPGRADE_FRAMEWORK_
TEST_Stats.c:23:#ifdef _UPGRADE_FRAMEWORK_
TEST_Stats.h:7:#ifndef _UPGRADE_FRAMEWORK_


2. grep, awk 수행


% grep _UPGRADE_FRAMEWORK_ *.[ch] | awk '{print $1}'
TEST_Options.c:14:#ifndef
TEST_SendResponse.c:14:#ifndef
TEST_Session.c:16:#ifndef
TEST_Stats.c:1:#ifndef
TEST_Stats.c:23:#ifdef
TEST_Stats.h:7:#ifndef


3. grep, awk, cut 수행



% grep _UPGRADE_FRAMEWORK_ *.[ch] | awk '{print $1}' | cut -d ':' -f1
TEST_Options.c
TEST_SendResponse.c
TEST_Session.c
TEST_Stats.c
TEST_Stats.c
TEST_Stats.h



4. grep, awk, cut, uniq 수행


% grep _UPGRADE_FRAMEWORK_ *.[ch] | awk '{print $1}' | cut -d ':' -f1 | uniq TEST_Options.c TEST_SendResponse.c TEST_Session.c TEST_Stats.c <-- 1개로 줄어듬 TEST_Stats.h








.

반응형

라즈베리파이3에 USB로 키보드 마우스를 연결해서

사용하다보니 너무 불편하다.


그래서 블루투스 키보드를 사용하기로 했다. 

사용하다보니 편리하다.


찾아보니 Ctrl+Alt+T는 기본 터미널을 여는 단축키라서

마우스는 구지 없어도 될것 같다.


그런데 부팅할때마다 블루투스 연결을 새로 해줘야한다.

아.. 불편하다.


역시 불편한건 찾아보면 해결방안이 있다.


1. 현재 연결된 블루투스 키보드의 MAC 주소를 확인한다.



pi@byungwoo:~ $ hcitool con
Connections:
  > ACL D0:13:1E:15:XX:YY handle 11 state 1 lm MASTER AUTH ENCRYPT

pi@byungwoo:~ $ hcitool name D0:13:1E:15:XX:YY
i-rocks Bluetooth Keyboard


2. /etc/rc.local 파일에 부팅할때 실행할 명령어를 등록한다.

사용하는 블루투스 키보드의 MAC주소를 등록한다.



$ sudo vi /etc/rc.local

echo -e "connect D0:13:1E:15:XX:YY \nquit" | bluetoothctl

:x



3. 라즈베리파이3를 껐다가 다시 부팅해보면

블루투스 키보드가 자동으로 연결되어 사용할 수 있다.


반응형
조도 센서로 데이터를 가져오기 시작했다.

이제 이 데이터를 모아서 의미있는 처리를 해야겠다.


우선은 redis를 사용해서 마이크로 SDcard 말고 메모리를 사용하도록 해야겠다.

redis는 lite 버전을 사용한다.





$ sudo pip install redislite
$ sudo pip install redis-collections

redis 사용을 위해서 redislite 설치하고

이를 파이썬의 리스트처럼 사용하기 위해서 redis-collections도 설치해서

편리하게 사용하고자 한다.












..

반응형

코드는 가져다가 잘 실행을 했는데

각각의 의미가 궁금해졌다.


사진 : https://pimylifeup.com/raspberry-pi-light-sensor/




소스코드 : https://github.com/pimylifeup/Light_Sensor



#!/usr/local/bin/python

import RPi.GPIO as GPIO 
import time . # sleep 용도

GPIO.setmode(GPIO.BOARD)
# GPIO.BOARD 보드 상의 핀 번호 사용
# GPIO.BCM .  핀번호가 아니라 Broadcom SOC channel을 사용 GPIOXX의 XX 번호를 사용

# 7번 핀을 사용함
pin_to_circuit = 7

def rc_time (pin_to_circuit):
    count = 0

    #Output on the pin for
    GPIO.setup(pin_to_circuit, GPIO.OUT)   # 7번 핀을 입력으로 설정
    GPIO.output(pin_to_circuit, GPIO.LOW)  # 7번 핀의 디지털 출력 설정
    # 셋중에 아무거나 골라서 사용
    # 1, GPIO.HIGH, True
    # 0, GPIO.LOW, False
                                                      
    time.sleep(0.1)  # 0.1 sec sleep

    # 7번 핀을 input으로 변경
    GPIO.setup(pin_to_circuit, GPIO.IN)

    # 7번 핀으로부터 읽은 값이 HIGH가 될 때까지 count 수행
    # 그래서 실행해보면 센서 주변이 어두울 수록 카운트 값이 크다. 
    while (GPIO.input(pin_to_circuit) == GPIO.LOW):
        count += 1

    return count


# 스크립트가 인터럽트 될때 catch하고, 올바르게 cleanp
try:
    # 메인 루프
    while True:
        print rc_time(pin_to_circuit) . # 조도 센서의 값 출력
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup() . # 사용했던 모든 포트에 대해서 정리


라즈베리파이3에 구성했던 회로를 연결하고

위의 스크립트를 실행시키면 ($ python light_sensor.py)

값을 가져온다.

실제 실행할때는 sleep을 0.1 -> 1초로 늦춰서 했다.


아직 점퍼를 구입하지 못해서

유선랜 케이블 조금 잘라서 임시로 사용했다.

GPIO에는 묶어서 연결했는데 쇼트날까봐 아슬아슬하다.

아무래도 MF (male, female)로 구성된 점퍼선을 사서 해야겠다.


아래는 정상동작하는 모습을 촬영한 화면이다.





반응형

+ Recent posts