2019년 10월 9일 수요일

Kotlin으로 구현한 AES128 암호화

이번 프로젝트를 진행 하면서 서버와 통신시에 전송할 데이터를 암호화 하여 전송하기로 결정하였다.
그에 따라서 기존 자바 소스로 구현되어 있는 암호화를 코틀린으로 구현 하였다.

아래가 그 코드이다.

import android.util.Base64
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec

class CipherUtil(){

    fun encryptAES128(plainText:String):String{

        val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
        val keySpec = SecretKeySpec(Common.CIPHER_KEY.toByteArray(), "AES")
        cipher.init(Cipher.ENCRYPT_MODE, keySpec)
        val crypted = cipher.doFinal(plainText.toByteArray())

        val encodedByte = Base64.encode(crypted, Base64.DEFAULT)
        return String(encodedByte)
    }

    fun decryptedAES128(crypted:String):String {
        var decodedByte:ByteArray = Base64.decode(crypted, Base64.DEFAULT)
        val keySpec = SecretKeySpec(Common.CIPHER_KEY.toByteArray(), "AES")
        val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
        cipher.init(Cipher.DECRYPT_MODE, keySpec)
        val output = cipher.doFinal(decodedByte)

        return String(output)
    }
}


2019년 7월 12일 금요일

android firebase cloud message

firebase 사이트에 내용을 따라하는데 의존성 문제로 반나절을 삽질했다 ㅠㅠ

새로운 프로젝트에서 푸쉬를 사용해야 해서
백만년만에 구글 firebase를 이용해 보고자 차근차근 따라 하는데

appcompat-v7 과 firebase-core 17.0.1이 충돌하는것이었다.

검색과 삽질을 계속 한 끝에 원인을 찾을 수 있었다.

firebase 17 버전 부터는 androidx를 사용해야 한다는것!
아래처럼 AndroidX로 migration 해주는것으로 해결 하였다.


한동안 안드로이드 개발을 안하고 있었더니 변화가 생긴 모양이다.
어찌되었건 이 문제 해결 하면서 테스트 푸쉬 메시지는 잘 전송 되었다.

AndroidX가 뭐하는 녀석인지 알아봐야 할듯 하다.

2019년 5월 22일 수요일

svn 사용자 설정도중...

실수로 passwd 파일을 날려 먹었다...;;;

나와 신입은 http://를 사용해서 문제가 없었는데
사내에서만 사용하던 선임은 svn://을 사용중이라 갑자기 인증 문제가 발생!

다들 왜안되지 왜안되지 하다가 확인해보니
dav_로 시작하는 파일은 http프로토콜을 위한 계정 정보가
passwd 파일은 svn 프로토콜 계정 정보가...
그런데 passwd를 날렸으니 안되지...ㅡㅡ;;;

2019년 5월 16일 목요일

SVN 사용자 추가

회사 개발서버...
릴리즈 업데이트 해야 하는데...

일단 진행중인 프로젝트 때문에 잠시 보류 상태에서
신입을 위해 계정하나 새로 만들어 주고 SVN사용자에도 추가 해 주려는데

...
100만년만은 아니지만 몇년만에 하려니 생각이 안났다...ㅠㅠ
검색과 시행착오 끝에

htpasswd 대상pw파일 계정

위 처럼 입력하면 비번을 물어보고 입력하면 암호화되어 추가 되었다.

조만간 서버를 새로 갈아 엎을까 고민중인데
그때 차근차근 설정들 정리를 좀 해놔야겠다.

이젠 나이가 들어가니 정말 보조기억 장치가 필요한듯 하다.

2019년 5월 9일 목요일

Raspberry pi와 연결(?)하는 방법

곧 현장에 설치하고 작업후에 테스트를 진행 해야 하는데...

예전에 구닥다리 무거운 모니터 들고 너무 고생했던 생각에
뭔가 나이스한 방법이 없을까 계속 고민을 하고 있다.

여러가지 검색을 해 보니 몇가지 방법이 있는데....

1. 모니터 연결
가장 많이 사용하면서 간편한 방법이다.
단점은 모니터를 사야 한다.

2. VNC 등을 이용
원격에서 가능하다는 장점이 있다.
아이패드로도 가능하다!
하지만 라즈에 아무래도 부하가 더해진다.
또 현장에서 돌아가는걸 보면서 해야 하기 때문에 원격에서 작업이 의미가 없다.

3. USB to serial 연결
시리얼 연결로 하는 방법인데....
케이블만 있으면 노트북이랑 연결해서 접속해서 사용가능하다.
단점이자 장점이 SSH접속이다.
보기엔 있어 보이지만 나도 겁나 번잡스러운 환경이란....

제대로 하려면 모니터 구매쪽으로 가야할거 같다는 생각이 든다.
뭐로 구매하지...

2019년 4월 25일 목요일

웹 크라울링(Web Crawling)

코드 원 제작자께서 허락해주셔서 올리게 되는 파이썬 웹 크라울링!

딴게 게시판에서 어느분이 기존 코드 웹 크라울링 코드를 수정해 달라고 글을 올리셨다.
쪽지와 메일이 오가면서 소스를 받고 필요하신 사항을 정리한 후에 수정을해서 드렸다

예전에 자바에서  html 태그 파싱해서 사용한적이 있는데
확실히 파이썬이 그 보다는 수월하게 구현되는것 같다.(파이썬 만세)

간략히 내용을 정리 하자면
먼저 태그 파싱을 위해서 BeautifulSoup  이라는 라이브러리를 사용한다.

아래와 같은 코드로 특정 url의 내용르 받아서 BeautifulSoup 객체로 받아낸다.
soup = BeautifulSoup(source_code_from_URL, 'html.parser', from_encoding='UTF-8')

특정 사이트의 게시판 같은 곳에서 검색한 결과에 대한 글 전체를 가지고 오도록 하는 내용인데 아래와 같이 구현해서 검색 결과에서 글 링크들을 전부 가져 오도록 하고 있다.
(이 부분은 원 제작자분이 구현해 놓으신 부분이다.)
for title in soup.find_all('div', 'table-row'):
    title_link = title.select('a')
    article_URL = title_link[0]['href']
    get_text(article_URL, output_file)

저렇게 가지고 온 링크들을 다시 get_text함수에 넘겨서 내용을 가지고 오도록 하고 있다.
아래가 get_text함수이다.(이것도 원 제작자분이 만드신걸 일부 수정했다.)
def get_text(URL, output_file):
    URL = "http://www.kindernews.net" + URL
    source_code_from_url = urllib.request.urlopen(URL)
    soup = BeautifulSoup(source_code_from_url, 'html.parser', from_encoding='UTF-8')

    title = soup.find('div', "article-head-title") 
    news_date = soup.find("meta", property="article:published_time") 

    content_of_article = soup.find_all('p') 

    output_file.write(str(title)+"\n") 
    output_file.write(str(news_date)+"\n") 
    for item in content_of_article:
        string_item = str(item)
        output_file.write(string_item+"\n")

    output_file.write("\n") 


soup.find나 soup.find_all부분이 흥미로웠다.
div tag나 meta tag나 어떤 형태든 가지고 올 수 있었다.
soup.find('p') 부분의 경우 가지고 와야 할 글이 모두 <p> 태그로 감싸져 있어서 저렇게 구현했다.

요즘 관리일 좀 소홀이 하면서 소소히 계속 개발을 들여다 보고 있는데, 역시 난 관리보다 개발이 적성이 더 맞는건가 싶기도 하고...
그런데 왜 C#은 그렇게 눈에 안들어 오는지...ㅠㅠ

2019년 4월 19일 금요일

PLC RS232통신

LS산전의 PLC장비와 RS232통신을 하여 데이터를 읽어 와야 하는 프로젝트를 진행 중이다.

현장에서 실제 통신할 장비는 라즈베리파이인데 일단 윈도우에서 테스트를 진행 하였다.
어차피 파이썬으로 코딩도 해야 하고... 초반에 PLC와 통신에서 살짝 삽질을 하였다.

메뉴얼에 헤더와 테일 그리고...이걸 명령어라고 해야 하나...하여튼 아래와 같은 설명을 친절히 해 주고 있는데...


232통신 테스트 프로그램으로 해도 안되길래 왜이럴까 했는데 요청시 헤더와 테일에 문자가 뭐 이런... 
거의 써볼일 없는 ASCII와 HEX 덕분에 잠깐 해메었다.
요구프레임의 헤더는 ' ', 테일은 ' ' 이다.


덕분에 고생은 했지만 테스트 프로그램에서도 확인하고 나서 파이썬으로도 잘 되는걸 확인했다.

요것이 파이썬 소스!
import serial


ser = serial.Serial()
ser.baudrate = 9600ser.port = 'COM3'ser.open()

print(ser.name)
ser.write(b' 00RSS0107%DW0400 ')
result = ser.read_until(b' ')
print("result = ", result)

print("decode=", result.decode("ascii"))

ser.close()
print("ser is open=", ser.is_open)
pySerial 설치하고서 간단하게 구현했다.

이제 이 기본소스로 열심히 노가다 하는 일만 남은...
아...계약부터 하고나서 시작해야 하겠구나...ㅠㅠ





2019년 3월 14일 목요일

Raspberry Pi 한글 설정

드디어...한번만에 성공했다.

순서는
1. 폰트 설치
apt-get install fonts-unfonts-core

2. ibus설치
apt-get install ibus

3. ibus 한글 설치
apt-get install ibus-hangul

4. 이후 설정에서 변경

대략 이 순서인듯 하다.

다만 다음번에도 성공한다는 보장을 할수가 없다.

2019년 3월 13일 수요일

라즈베리파이 기본 설정

일하다보니 어쩌다보니...
라즈베리파이로 이것저것 구현할 일이 많아 지고 있다.
잘 셋팅된 SD카드 하나 이미지 떠놓고 사용하려고 하긴 하지만
한글 설정같은 기본적인건 좀 기록을 해두어야 할거 같다.

먼저 폰트 설치
sudo apt-get install fonts-unfonts-core

iBUS 한글 설치
sudo apt-get install ibus-hangul

그 외 기타 설정사항들은 간단해서 생략!

이제 한글 입출력만 잘 되면 되는데...
잘 안된다...대부분 이거던데...

사실 지난번에 검색해서 했던게 잘 되었는데 그때 이후로 성공한적이 없다.
뭔가 빠진게 있거나 순서가 문제거나 한게 아닐까 싶다.

특히 대부분 ibus 데몬이 실행중이 아니라는 오류가 난다.
뭐가 문제일까....

2024년 첫번째 도서 리뷰 GPT-4를 활용한 인공지능 앱 개발

 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다." 24년 첫 도서 리뷰이다. 작년까지? 한참 핫 했던 인공지능 서비스 Chat GPT에 관한 책이다. 핑계지만 어쩌다보니 GPT에 대한 접근이...