직장인에게 유용한 사이트 모음

<직장인에게 유용한 사이트 모음 - Ver2020>

직장내일 : https://www.facebook.com/jikjangnaeil (직장인 커뮤니티 - 유머, 이벤트, 할인 정보 등)
인생공부 : https://www.facebook.com/인생공부-1927599617465292 (고영성/신영준님이 운영하는 인생상담 채널)
연직모: http://www.salary-up.kr/ (직장인 커뮤니티 - 연봉 높여가는 직장인들 모임, 연봉UP/재테크/투잡 중심)
고민해우소 : https://cafe.naver.com/smartphonefamily (업무 외 고민 상담하기 좋은 분노해소 커뮤니티)
성남산업진흥원 : http://magazine.snventure.net/main.asp(전자잡지들을 무료로 볼 수 있음)
대한상공회의소 전자매거진 : http://magazine.korcham.net/main.asp(전자잡지들을 무료로 볼 수 있음)
직장인 탐구생활 : https://cafe.naver.com/workee(직장인 커뮤니티 - 네이버 최대 직장인 커뮤니티, 일상 중심)
월급쟁이 부자들 : https://cafe.naver.com/wecando7(재테크 커뮤니티 - 네이버 재테크 커뮤니티)
페이퍼슨 : https://cafe.naver.com/paperson(다양한 문서 서식을 구할 수 있는 네이버 카페)
네이버 아름다운 한글문서 서식 : https://hangeul.naver.com/2014/document (네이버가 제공하는 문서 서식 사이트)

픽사 베이 : https://pixabay.com/ko/ (무료 고화질 이미지를 구할 수 있는 사이트)
unsplash : https://unsplash.com/ (무료 고퀄리티 이미지를 구할 수 있는 곳)
아이콘 파인더 : https://www.iconfinder.com/ (무료 아이콘을 구할 수 있는 사이트. 검색 조건의 Free를 이용)
The Noun Project : https://thenounproject.com/ (무료 아이콘을 구할 수 있는 사이트. royalty–free)
눈누 : https://noonnu.cc/ (무료한글폰트를 구할 수 있는 사이트)
네이버 나눔고딕글꼴 : https://hangeul.naver.com/2017/nanum (네이버가 제공하는 나눔고딕 폰트)
이미지 파일 용량 : http://imgpresso.co.kr/ (웹 상에서 이미지 용량을 줄여주는 서비스를 제공함)
이미지 변환 : https://allinpdf.com/kr/convert/fileconvert/fileconvert-start-image (pdf, jpg, png, gif, tiff 간 변환 제공)
=> 이미지 변환은 구글에 xxx to xxx로 검색해보면 다 나옴.

픽슬러 : https://pixlr.com/pro/editor (웹 상의 이미지 편집기)
BackGround Burner : https://burner.bonanza.com/ (이미지의 배경을 투명하게 만들어 줌. png 파일 제작 유용)
imgur : https://imgur.com/vidgif (비디오를 이미지로 변환해 주는 사이트)

친절한 혜강씨 : http://leehyekang.com/ (PPT 만들기 강좌)
프레젠테이션 매거진 : http://www.presentationmagazine.com (PPT 서식을 구할 수 있는 곳)
슬라이드 쉐어 : http://www.slideshare.net (PPT 서식을 구할 수 있는 곳)
하늘지기 베가스 영상공방 : https://blog.naver.com/7andsoul (영상편집 관련 정보들이 많은 곳)

구글 번역 : http://translate.google.com/ (할 말이 없음. 그냥 필요.)
네이버 어학사전 : https://endic.naver.com/krenEntry.nhn?sLn=kr&entryId=21e6235c79ba4abbba46b23934c1f94f

<업무에 필요한 무료 소프트웨어(회사에서도 무료)>

알캡쳐 : https://www.altools.co.kr/download/alcapture.aspx
(알 시리즈를 그리 선호하진 않지만 네이버캡쳐 서비스가 중단되었기에 설치하여 사용. 무료 캡쳐 프로그램들은 큰 차이 없음)

Foxit PDF Reader : https://www.foxitsoftware.com/kr/downloads/
(PDF Printer. 문서를 PDF로 출력할 때 사용하는 프로그램)

Notepad++ : https://notepad-plus-plus.org/download
(텍스트 편집기. 기능이 굉장히 많음.)

반디집 : https://www.bandisoft.com/
7-Zip : https://www.7-zip.org/
(개인적으로는 빵집을 추천하지만 개발 중단되었으므로 두 개 도구 추천)

FileZilla : https://filezilla-project.org/
(FTP Client. 아마 대부분 이것을 사용하고 있지 않을까 싶다. FTP Server도 제공함)

SMemo : http://www.smemo.co.kr/
(윈도우용 포스트잇. 점점 광고가 늘어나고 있긴 하지만 기능도 같이 개발되는 중)

Photoscape : http://www.photoscape.org/ps/main/index.php
(무료 도구 중 강추하는 프로그램. 이미지 편집과 관련하여 다양한 기능을 제공한다)

Unlocker : https://unlocker.kr.uptodown.com/windows
(종료되지 않는 프로세스들을 찾아서 Kill 해주는 프로그램)

DaView : http://datools.kr/Down7_1.htm
(이미지 뷰어 + Hwp 뷰어를 포함하고 있다. HWPViewer를 따로 갈 필요가...)

Putty : https://www.putty.org/
(원격 Shell 접속 프로그램)

에버노트 : https://evernote.com/intl/ko/
(노트 필기용 프로그램. 요새는 조금 힘이 떨어져 가는 듯하지만...)

Slack : https://slack.com/
(업무 협업 도구. 팀 워크 올리기에 유용한 도구)

Virtual Box : https://www.virtualbox.org/
(가상 공간을 제공하여 별도 OS를 설치할 수 있도록 해주는 프로그램. 확장팩은 유료)

UltraVNC : https://www.uvnc.com/
(원격 제어 도구. VNC Server가 설치된 PC에 접속해서 화면을 미러링 한 상태에서 제어 가능)

UltraViewer : https://ultraviewer.net/en/
(원격 제어 도구. VNC Server와 비슷. Team Viewer에 비해 단점은 파일전송이 되지 않음)

WinMerge : http://winmerge.org/?lang=en
(Text 파일 병합기. 다른 점을 비교해주고 통합할 때 유용한 도구)

PDFSAM : https://pdfsam.org/
(PDF 파일을 쪼개거나 합칠 때 사용하는 도구)

Gimp : https://www.gimp.org/
(포토샵 무료 버전이라고 많이 소개 되지만 사실 많이 부족함. 간단한 이미지 편집은 다른 도구를 쓰는 듯)

Xmind : http://www.xmindkorea.net/download.asp?code=3
(무료 마인드맵 프로그램)

http://www.hantools.co.kr/sub_index.asp?dcode=d&pcode=o
(알툴즈와 비슷한 느낌의 무료 프로그램들을 제공하는 사이트)

<직장인에게 유용한 앱>
블라인드 : 익명 커뮤니티 제공. 분노발생 주의
리멤버 : 명함을 찍으면 알아서 내용을 저장해주는 앱
슬랙 : 위에 설명한 슬랙의 모바일 버전
에버노트 : 위에 설명한 에버노트의 모바일 버전
푸시불렛(PushBullet) : 스마트폰의 메시지들을 PC에서 확인가능 한 앱. 특히 SMS 문자를 받고 보내기에 매우 유용함.
무음무음 : 기본 카메라에 연동되어 카메라 셔터 소리를 없애줌.
깜박하지마 : 자꾸 깜박하는 분들을 위한 유용한 앱
금연시작 : 금연하면서 아낄 수 있는 돈, 몸의 변화 상태를 위젯으로 알려줌.

파이썬으로 배우는 알고리즘 트레이딩 정리

파이선 기초

설치

윈도우 7 기반, 파이썬은 아나콘다 배포판으로 설치, 아나콘다는 반드시 32비트용으로 설치해야 함. 국내 증권사 api 가 32비트 프로그램이기 때문인 것으로 사료됨. 책은 아나콘다 파이썬 3.6 32비트 버전임. 아나콘다 설치시 관리자 권한으로 설치.

파이썬 인터프리터 바탕화면에 바로가기 만들기.

C:\Anaconda3\Lib\idlelib\idle.bat 를 바탕화면에 바로가기 만듬. windows10에서는 c:\ProgramData\Anaconda3\Lib\idlelib\idle.bat 로 되어 있음.

변수

변수는 데이터의 주소를 담고 있음. 실제 데이터를 객체라고 함. 변수에 담긴 실제 데이터의 주소를 알고 싶으면 id(변수명).

>>> x = 100
>>> x
100
>>> id(x)
1845813952
>>> y = x
>>> y
100
>>> id(x), id(y)
(1845813952, 1845813952)

문자열

파이썬은 문자와 문자열을 구분하지 않음. 작은따옴표, 큰따옴표 모두 사용가능. 문자열은 리스트임. 리스트 사용문법과 같음.
len(문자열) : 문자 개수
문자변수명[시작위치:끝위치] : 문자열 일부만 자르기, 시작위치, 끝위치 중 하나는 생략가능. 시작위치 생략하면 0으로 간주, 끝위치 생략하면 마지막 위치로 간주.위치를 음수로 지정. 음수로 지정되면 맨마지막위치부터 오는쪽으로 가면서 -1, -2 ...

문자열 나누기

>>> my_jusik = "naver daum"
>>> my_jusik.split(' ')
['naver', 'daum']
>>> my_jusik.split(' ')[0]
'naver'
>>> split_jusik = my_jusik.split(' ')
>>> split_jusik
['naver', 'daum']
>>> split_jusik[0]
'naver'

문자열 합치기

>>> daum = "Daum"
>>> kakao = "Kakao"
>>> daum + ' ' + kakao
'Daum Kakao'

데이터 타입 확인하기

>>> type(x)
<class 'int'>
>>> type(id(x))
<class 'int'>
>>> type(4000)
<class 'int'>
>>> type(3.14159)
<class 'float'>
>>> type('안녕하새요')
<class 'str'>

리스트

>>> myList = [23,345,'sdfasd','fghfh',444]
>>> myList2 = []
>>> myList[3]
'fghfh'
>>> myList[-3]
'sdfasd'
>>> myList[1:3]
[345, 'sdfasd']

리스트 생성할 때 사용한 각괄호 와 인덱스의 곽괄호는 다른 개념임.

리스트의 인덱스 사용문법

각괄호내부의 숫자로 사용. [0], [3], [-2], [1:6], [3:-1]
양수 인덱스: 0 첫원소의 앞, 1 첫원소 뒤 둘째원소 앞, ...
음수 인덱스: -1 마지막원소 앞 마지막에서 둘째원소 뒤, ...

리스트에 데이터 삽입

리스트변수명.append('삽입될 데이터') : 리스트 마지막에 삽입됨
리스트변수명.insert(인덱스, '삽입될 데이터') : 인덱스 위치에 삽입됨

리스트데이터 삭제

del 리스트변수명[인덱스]

이차원리스트의 인덱싱

리스트변수명[2][4] 처럼 사용.

튜플

리스트는 각괄호사용, 튜플은 둥글괄호 사용.
리스트는 원소를 변경할 수 있지만, 튜플은 변경할 수 없다.
튜플은 대신 속도가 빠르다.
튜플원소에 접근하는 방법은 [인덱스]를 사용한다. 이를통해 [시작위치:끝위치]를 사용해 튜플원소 일부를 가져올 수 도 있음.

>>> a = (1,2,3,'하하하','호호호',4,5)
>>> a[2:4]
(3, '하하하')

딕셔너리

{키:값, 키:값 ...}
딕셔너리는 인덱스를 지원하지 않음. 인덱스가 아니라 키를 사용해야 함.

>>> aa = {1:10, 2:20, '삼':30}
>>> aa[1]
10
>>> aa['삼']
30
>>> aa[1:2]
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    aa[1:2]
TypeError: unhashable type: 'slice'

키값으로 숫자, 문자, 모두 사용가능.

딕셔너리 데이터 추가

딕셔너리변수명[키] = 데이터

딕셔너리 데이터 삭제

del 딕셔너리변수명[키]

딕셔너리 키 찾기, 값 찾기

>>> aa = {1:10, 0.3:30}
>>> aa[0.3]
30
>>> aa.keys()
dict_keys([1, 0.3])
>>> type(aa.keys())
<class 'dict_keys'>
>>> list(aa.keys())
[1, 0.3]
>>> aaKeys = list(aa.keys())
>>> aaKeys
[1, 0.3]
>>> aaValus = list(aa.values())
>>> aaValus
[10, 30]
>>> 0.3 in aa.keys()
True

파이썬 비교연산자

==, !=, >, <, <=, >=

if 문 사용문법

   if 조건식 :
        실행문
    elif:
        실행문
    else:
        실행문

for문 사용문법

for 변수명 in 리스트 :
    실행문

리스트 원소가 하나씩 변수명에 바인딩 되어 실행문을 반복함.

리스트 대신 range()이용 해도 됨

for 변수명 in range(1,10)
    실행문

여기서 range는 1 <= range(1,10) < 10 로 해석. 그러므로 변수명에는 1 부터 9까지 차레대로 바인딩 됨.

리스트 대신 튜플을 사용해도 됨.
for 변수명 in 튜플

for문에 딕셔너리 사용문법

for 키변수명,값변수명 in 딕셔너러변수명.ltems():
또는
for 키변수명 in 딕셔너리변수명.keys():
또는
for 값변수명 in 딕셔너리변수명.values():

while 문 사용법

while 조건문 :
    실행문

break 문 과 continue 문

루프 내부에 사용. break는 루프를 빠져 나가고, continue문은 그 다음 실행문을 실행하지 않고 계속 루프를 실행.

함수만들기

def 함수명(파라미터들):
    함수내 명령문
    return 반환값

모듈

모듈은 함수들과 데이터들을 모듈명.py 라는 파일로 만들어 놓은것.
이를 파이썬에서 임포트 하여 재사용 할 수 있음.
import 모듈명

임포트 된 모듈의 함수를 사용하고 싶으면
모듈명.함수명()

임포트 된 모듈의 변수를 사용하고 싶으면
모듈명.변수명

모듈을 제작하는 과정에서 모듈을 테스트 하기 위해 모듈 마지막에 다음과 같은 코드를 삽입한다.

...
if __name__ == "__main__"
    print(내부함수명(필요한파라미터))
    print(__name__)

이렇게 함으로써 모듈을 직접 실행 할 때는 위의 if문이 동작하여 함수가 제대로 작동하는지 볼 수 있고, import 할 때는 위의 if 문이 동작되지 않는다. 그 이유는 name 이라는 파이썬 내부변수가 이 모듈을 직접 실행한 경우 "main"으로 바인딩 되고 import 되었을 때는 파일명으로 바인딩 되기 때문이다.

Time 모듈

>>> import time
>>> current_time = time.ctime()
>>> print (current_time)
Thu May 30 22:02:02 2019
>>> dir(time)
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time', 'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname']
>>> time
<module 'time' (built-in)>
>>> import random
>>> random
<module 'random' from 'C:\\ProgramData\\Anaconda3\\lib\\random.py'>

dir(모듈명) 은 모듈에 적재된 데이터 및 함수들을 확인 할 수 있다.

import 후 모듈명을 적으면 모듈의 위치를 확인할 수 있다.

os모듈

디랙토리 에 관한 함수들 있다.
현재 디랙토리 구하기 os.getcwd()
디랙토리내 파일명 구하기 os.listdir(패스)
특정디랙토리내 실행파일 찾기

for x in os.listdir('c:\Anaconda3')
    if x.endswith('exe')
        print(x)

임포트하는 방법

import 모듈명
모듈명.변수명
import 모듈명 as 별명
별명.변수명
from 모듈명 import 함수명

함수명을 바로 사용할 수 있다. 다만 기존의 동일한 이름의 함수명을 중복되어 사라짐.

form 모듈명 import *

모듈내 모든 함수 및 데이터를 바로 사용할 수 있음. 다만 기존의 동일한 이름의 것들은 모두 중복되어 사라짐.

클래스

self : 클래스가 인스탄스화 될 때 그 인스탄스명 으로 바인딩 된다.
__init__ :생성자(매쏘드)
__del__ : 소멸자

정의

class 클래스명(상속받을_부모_클래스명):
    클래스변수명 = 0
    def __init__(self, 입력받는인스탄스변수명, ...):
        self.입력받는인스탄스변수명 = 입력받는인스탄스변수명
        self.다른인스탄스변수명 = "호호데이터"
        함수변수명 = "임의데이터"

    def 매쏘드명(self):
        print (self.인스탄스변수명)

   def __del__(self):

상속받을_부모_클래스명 은 생략가능. 상속 받는다면 부모 클래스에 존재하는 메소드를 그대로 사용할 수 있다.
클래스변수명은 인스탄스에서 호출할 수 있으며 모든 인스탄스가 공유한다. C에서 정적 변수랑 비슷
인스탄스변수는 매소드 안에서만 정의될 수 있음. 보통 생성자 안에서 정의함. 그러면 다른 매소드에서도 사용 가능. (단, self. 없이 그냥 변수명으로 정의되면 그 함수에서만 사용되고 소멸되는 로컬 변수임)
인스탄스변수는 인스탄스명.인스탄스변수명 처럼 호출되며, 인스탄스 마다 다른 값을 가진다.
메소드가 self 인자를 가지고 있으면 인스탄스로만 호출이 가능하고,
메소드가 self 인자가 없으면 클래스로만 호출이 가능
클래스명은 대문자로 시작이 관례

인스탄스란 ff = 클래스명() 처럼 클래스가 호출될 때
ff 를 인스탄스라 함.
메소드가 클래스로 호출된다는 것은 클래스명.메소드() 형식으로 호출하는 것을 말함.
메소드가 인스탄스로 호출된다는 것은 인스탄스명.메소드() 형식으로 호출하는 것을 말함.

class 에서 변수 사용 정리

클래스 내부에서 정의
: 클래스변수가 되고 인스탄스 되지 않고 클래스로 직접 호출 가능할 뿐만 아니라 인스탄스에서도 호출가능. java에서 정적변수처럼 동작

매소드 내부에서 self.변수명 처럼 정의
: 인스탄스 변수가 되고 인스탄스의 다른 메소드에서 호출 가능.

매소드 내부에서 self. 없이 변수명으로 정의
: 해당 메소드 내부에서만 호출가능.

PANDAS 사용

pasdas는 파이썬의 리스트와 딕셔너리의 개념을 혼합 짬뽕한 것. 매우 유용함.
임포트할 때 Series 와 DataFrame을 로컬네임스페이스 내로 직접 임포트 함.

from pandas import Series, DataFrame

시리즈는 리스트로 부터 변환된다.

kakao = Series([92600, 92400, 92100, 94300, 92300])
print(kakao)

이때 자동적으로 인덱스는 0을 포함한 정수형으로 생김

리스트로 부터 시리즈를 만들 때, 인덱스를 직접 지정할 수 있다.

시리즈변수명 = Series(데이터리스트, index=인덱스리스트)

예)

kakao2 = Series([92600, 92400, 92100, 94300, 92300], 
    index=['2016-02-19', '2016-02-18', '2016-02-17', '2016-02-16','2016-02-15'])

kakao2['2016-02-18'] 처럼 데이터에 접근할 수 있음.
인덱스 전체를 리스트로 얻으려면 kakao2.index
데이터 전체를 리스트로 얻으려면 kakao2.values

시리즈 + 시리즈 하면 같은 키값의 데이터 끼리만 더해짐.

DataFrame은 2차원 데이터 타입임.
딕셔너리로 DataFrame을 정의할 수 있다.

딕셔너리변수명 =    {'컬럼명' : 컬럼데이터리스트,
                    '컬럼명' : 컬럼데이터리스트,
                    '컬럼명' : 컬럼데이터리스트 ...}
데이터프레임변수명 = DataFrame(딕셔너러변수명)

예)

from pandas import Series, DataFrame
daeshin = {'open':  [11650, 11100, 11200, 11100, 11000],
           'high':  [12100, 11800, 11200, 11100, 11150],
           'low' :  [11600, 11050, 10900, 10950, 10900],
           'close': [11900, 11600, 11000, 11100, 11050]}
date = ['16.02.29', '16.02.26', '16.02.25', '16.02.24', '16.02.23']
daeshin_day = DataFrame(daeshin, columns=['open', 'high', 'low', 'close'], index=date)

DataFrame을 생성할 때 columes= 옵션을 써서 컬럼의 순서를 정의 할 수 있다. index= 옵션을 사용해서 인덱스를 지정할 수 있다.
컬럼을 얻어 올 땐, daeshin_day['close']
로우를 얻어 올 땐, daeshin_day.ix['16.02.29']
컬럼명을 리스트로 얻어 올 땐, daeshin_day.columes
인덱스를 리스트로 얻어 올 땐, daeshin_day.index

pyqt5

이벤트처리

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyStock")
        self.setGeometry(300, 300, 300, 400)

        btn1 = QPushButton("Click me", self)
        btn1.move(20, 20)
        btn1.clicked.connect(self.btn1_clicked) # clicked 라는 이벤트가 발생할 때 실행할 함수를 지정함.

    def btn1_clicked(self):
        QMessageBox.about(self, "message", "clicked")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()

pyqtDesign 으로 만든 ui 사용법

import sys 
from PyQt5.QtWidgets import * 
from PyQt5 import uic 
form_class = uic.loadUiType("main_window.ui")[0] 
class MyWindow(QMainWindow, form_class):  
    def __init__(self): 
        super().__init__() 
        self.setupUi(self) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    myWindow = MyWindow() 
    myWindow.show() 
    app.exec_()

SQLite

  1. sqlite3는 파이썬 표준 라이브러리 임. 별도의 설치과정 없이 바로 사용할 수 있음.
  2. 임포트 하기 import sqlite3
  3. 데이터베이스 커넥트
    • con = sqlite3.connect("파일경로및파일명")
    • 해당경로에 파일이 존재하지 않으면 새로 생성한다.
  4. Cusor 생성 cusor = con.cursor()
  5. sql명령어 실행 cusor.execute("sql명령어")
  6. 작업내용 db에 적용 con.commit()
  7. db 닫기 con.close()
  8. select 문을 execute 한 뒤 데이터 가져오기
    • 로우단위 가져오기 cursor.fetchone() : 리턴값은 튜플
    • 모든 데이터 가져오기 cursor.fetchall(): 리턴값은 리스트
  9. 판다스의 데이터프레임 df와 sqlite db 상호간 데이터 변환
    • 판다스에서 데이터프레임을 디비로 저장하고 읽을 수 있는 메소드 제공.
    • 판다스에서 db로 저장할 때 df.to_sql('테이블명', con)
    • db를 판다스로 읽을 때
      import pandas as pd
      from pandas import Series, DataFrame
      import sqlite3
      con = sqlite3.connect("sdfsdfs.db")
      df = pd.read_sql("select * from kakao", con, index_col='index')
      #db에 인덱스 컬럼이 있는 경우 해당 컬럼명을 쓴다. 없는 경우 none

키움증권 OpenAPI 사용법

OpenApi 연결, 키움이벤트 처리

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyStock")
        self.setGeometry(300, 300, 300, 150)

        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")  # OpenAPI kiwoom 객체 만들기
        self.kiwoom.dynamicCall("CommConnect()")              # API제공 함수 CommConnect() 호출하기

        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(10, 60, 280, 80)
        self.text_edit.setEnabled(False)

        self.kiwoom.OnEventConnect.connect(self.event_connect) #OnEventConnect 이벤트 와 슬롯함수를 연결

    def event_connect(self, err_code):                         #OnEventConnect 이벤트 발생실 실행할 슬롯함수 정의
        if err_code == 0:
            self.text_edit.append("로그인 성공")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()
  • self.API객체 = QAxWidget("OpenAPI_ProgID") : OpenAPI객체 만들기
  • API객체.dynamicCall("API함수명()") : API 너머 서버에게 주어진 함수를 통해 정보를 요구 응답이 return 값으로 올 수 있음.
  • 응답이 리턴값으로 바로 올 수도 있지만, 이벤트로 실행된 함수 (슬롯함수, 콜백함수)를 통해서 받아야만 되는 경우도 있다.
  • 이벤트 이름은 API에서 제공. 위 예에서는 OnEventConnect
  • 이벤트 발생시 실행할 함수를 구현할 때는 반드시 API에서 미리 정해 논 프로토콜을 지켜야 함. (따라서 API 매뉴얼 참조)

계좌정보 가져오기

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import  *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # Kiwoom Login
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        self.kiwoom.dynamicCall("CommConnect()")

        # OpenAPI+ Event
        self.kiwoom.OnEventConnect.connect(self.event_connect)

        self.setWindowTitle("계좌 정보")
        self.setGeometry(300, 300, 300, 150)

        btn1 = QPushButton("계좌 얻기", self)
        btn1.move(190, 20)
        btn1.clicked.connect(self.btn1_clicked)

        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(10, 60, 280, 80)

    def btn1_clicked(self):
        account_num = self.kiwoom.dynamicCall("GetLoginInfo(QString)", ["ACCNO"])
        self.text_edit.append("계좌번호: " + account_num.rstrip(';'))

    def event_connect(self, err_code):
        if err_code == 0:
            self.text_edit.append("로그인 성공")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()

종목 기본정보 가져오기

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import  *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # Kiwoom Login
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        self.kiwoom.dynamicCall("CommConnect()")

        # OpenAPI+ Event
        self.kiwoom.OnEventConnect.connect(self.event_connect)
        self.kiwoom.OnReceiveTrData.connect(self.receive_trdata)

        self.setWindowTitle("PyStock")
        self.setGeometry(300, 300, 300, 150)

        label = QLabel('종목코드: ', self)
        label.move(20, 20)

        self.code_edit = QLineEdit(self)
        self.code_edit.move(80, 20)
        self.code_edit.setText("039490")

        btn1 = QPushButton("조회", self)
        btn1.move(190, 20)
        btn1.clicked.connect(self.btn1_clicked)

        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(10, 60, 280, 80)
        self.text_edit.setEnabled(False)

    def event_connect(self, err_code):
        if err_code == 0:
            self.text_edit.append("로그인 성공")

    def btn1_clicked(self):
        code = self.code_edit.text()
        self.text_edit.append("종목코드: " + code)

        # SetInputValue
        self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", code)

        # CommRqData
        self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "opt10001_req", "opt10001", 0, "0101")

    def receive_trdata(self, screen_no, rqname, trcode, recordname, prev_next, data_len, err_code, msg1, msg2):
        if rqname == "opt10001_req":
            name = self.kiwoom.dynamicCall("CommGetData(QString, QString, QString, int, QString)", trcode, "", rqname, 0, "종목명")
            volume = self.kiwoom.dynamicCall("CommGetData(QString, QString, QString, int, QString)", trcode, "", rqname, 0, "거래량")

            self.text_edit.append("종목명: " + name.strip())
            self.text_edit.append("거래량: " + volume.strip())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()

종목코드 및 한글종목명

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import  *
from PyQt5.QAxContainer import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
        self.kiwoom.dynamicCall("CommConnect()")

        self.setWindowTitle("종목 코드")
        self.setGeometry(300, 300, 300, 150)

        btn1 = QPushButton("종목코드 얻기", self)
        btn1.move(190, 10)
        btn1.clicked.connect(self.btn1_clicked)

        self.listWidget = QListWidget(self)
        self.listWidget.setGeometry(10, 10, 170, 130)

    def btn1_clicked(self):
        ret = self.kiwoom.dynamicCall("GetCodeListByMarket(QString)", ["0"])
        kospi_code_list = ret.split(';')
        kospi_code_name_list = []

        for x in kospi_code_list:
            name = self.kiwoom.dynamicCall("GetMasterCodeName(QString)", [x])
            kospi_code_name_list.append(x + " : " + name)

        self.listWidget.addItems(kospi_code_name_list)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    sys.exit(app.exec_())

사회학 박사과정의 어느 일본인이 본 한일경제전쟁

지금의 일본사회에서는 보기 힘든 사람이다. 일본의 역사교육시스템에서 만 자란 뒤라도 외국에서 유학한 사람이라 역시 자국민 보다는 훨씬 현실적이고 객관적 시각을 갖는가 보다. 어느 일본언론에 실린 기고문의 번역한 글을 퍼옴.





의미 있는 서체 독립서체 안중근

GS칼텍스에서 서체를 개발하여 무료로 배포하는 칭찬 받을 만 한 일을 하였군요.

1차 캠페인을 통해 삼일절 100주년을 기념하여, 독립운동가 윤봉길 서체와 한용운 서체를 개발/무료 배포하였고, 독립서체 2차 캠페인에서는 대한민국 임시정부 수립 100주년을 기념하여 백범 김구 서체와 윤동주 서체(별 헤는 밤 & 서시 두 가지 버전)를 개발하여 무료 배포하였습니다.

이번 독립서체 3차 캠페인으로 광복절을 맞이하여, 동양 평화를 기원하며 순국한 영웅 안중근의 서체를 무료배포 합니다.

GS칼텍스가 지속적으로 독립서체 캠페인을 진행하는 이유는 독립운동가의 필체를 디지털로 복원하여 독립운동가분들의 정신과 독립운동의 위대함을 계승하고자 함입니다.
독립운동가분들의 정신과 마음이 담긴 글씨체를 다운받아 직접 사용해보며, 무엇보다도 나라를 위했던 숭고한 희생정신과 아름다운 마음을 다시 한 번 되새겨 보시길 바랍니다.

윈도우용 독립서체 안중근 다운받기
맥용 독립서체 안중근 다운받기
다른 독립군서체 다운로드

이미지서버 sm.ms 사용기

메인화면

웹페이지 작성할 때 페이지 내 이미지를 삽입하기 위해서는 로컬이미지를 서버 어딘가에 올려놓아야 한다. 네이버 카페나 블로그 같은 경우는 계정내 스토리지 공간이 넉넉하여 이미지 서버 문제를 생각할 필요도 없으나,  호스팅업체를 통해 제한된 스토리지 공간에서 웹서빙 하는 필자 같은 경우의 사람들은 이미지서버가 필요하다.

이에, 중국에서 운영중인 이미지서버 sm.ms 를 소개한다.

https://sm.ms

두장의 사진을 업로드 해 보았다.

사이트에 접속후 이미지를 업로드 해 보라. 너무나 간단한 유저 인터페이스를 갖추고 있어 사용하는데 아무런 어려운 점이 없다.

업로드 된 뒤 사이트는 그림과 같은 화면을 출력하였다.

최근 버전업되면서 유저등록이 가능한데, 등록된 유저를 위한 데시보드가 있어 자신이 올린 이미지를 관리할 수 있는 기능이 추가되었다. 등록된 유저의 경우 최대 5G 스토리지 공간이 주어진다.

스크래치 : Ball sumulation

만유인력의 법칙이 적용되는 지구상에서 공이 떨어지거나, 차거나, 던지거나 할 때 그 움직임을 적용한 공 시뮬레이션을 만들어 봅시다. 우리가 만들 빨간색 공이 화면에 나오면  왼쪽 화살표키 또는 오른쪽화살표키로 공을 좌우로 움직일 수 있으며 위쪽화살표키를 눌러 하늘쪽으로 던질 수 도 있게 할 것입니다.  또한 벽이나 바닥에 닿으면 튀겨지기도 할 것 입니다.

제일 먼저 스크래치를 열고 고양이 스프라이트를 지운 후 이라는 이름으로 스프라이트를 생성합니다. 그리고 모양창에서 벡터모드로 전환 한 후 1600%로 확대한 화면에서 작업합니다.

위의 그림처럼 빨간공을 그려줍니다. 가로로 4칸, 세로로 4칸 크기로 원을 그립니다. 이때 유의할 것은 반드시 공이 정 가운데 위치하도록 그려주어야 합니다. 모양중심설정하기를 이용하면 도움이 됩니다.
이것으로 공의 모양이 완성되었습니다.

이제 스크립트창으로 가서 가장먼저 데이터를 생성합니다. 모든스프라이트에서 사용 옵션을 체크합니다.  생성할 데이터는 다음과 같습니다.

  • 속도x
  •  속도y
  •  마찰계수
  •  중력가속도
  •  킥가속도x
  •  킥가속도y

생성한 데이터의 초기값을 설정합니다.  공이 움직일 때 가로방향 속도와 세로방향 속도를 따로 따로 고려할 것이므로, 속도x 와 속도y를 두어  공의 현재 속도값을 저장하도록 하겠습니다. 마찰계수는 공기저항을 의미하는 값으로  1 보다 작은 값으로 설정합니다. 중력가속도는 공중에 있는 공이 땅에 떨어지는 빠르기를 설정하는 값입니다. 값은 음수 이어야 하며 절대값이 클 수로 빠르게 떨어집니다. 킥가속도x는 좌우화살표키를 눌러 공을 움직일 때 추가되는 속도입니다. 킥가속도y는 위쪽화살표키를 눌러 위로 쏘아 올릴 때 공의 속도 입니다.

변수 초기값을 설정하고 위와 같이 코드블럭을 완성합니다. 무한 반복하기 안에 삽입될 코드 블럭은 아래와 같습니다.

첫번째 만약블럭은 공이 스크린 왼쪽과 오른쪽 벽에 부딛히면 튕겨지도록 하기 위함입니다.  두번째 만약블럭은 천장과 바닥 벽에 부딛히며 튕겨지도록 하기 위함입니다.

세번째 만약블럭은 공을 오른쪽으로 움직이게 하기 위한 코드이고 네번째 만약블럭은 왼쪽으로 움직이게 하기 위함 입니다.

그 밑의 두개의 블럭은 속도x 속도y가 공기중 마찰계수로 속도가 느려짐을 계산하는 블럭입니다.

마지막 두개의 블럭은 지금까지 계산된 속도로 공을 움직이는 코드입니다.  이렇게 완성된 코드블럭을 무한 반복하기 안에 삽입합니다.

여기까지 완성한 다음 깃발을 클릭하여 코드를 실행해 봅니다. 만약 제대로 되었다면 좌우화살표키를 이용하여 공을 움직일 수 있을 것입니다.  이제 공을 위로 던지기 위한 코드를 아래와 같이 완성합시다. 위 그림과 같이 완성한 후 추가되어짐을 유의하세요.

공이 파란색에 닿거나 바닥에 닿으면 튕겨져야 하고 그렇지 않으면 중력가속도의 영향을 받아 아래로 떨어져야합니다.  여기서 파란색은 배경안에 그려넣을 땅의 색입니다. (물론 파란색이 아니어도 됩니다.)

한편 공이 땅에 닿아 있는 상황에서만 위로 쏘아 올릴 수 있도록 하였습니다. (만약 위쪽 화살표 키가 눌려지면 속도y의 값을 킥가속도y로 정하기)

여기까지 작성한 후 깃발을 클릭하여 코드를 실행하면 이제 바닥에 공이 닿아 있을 때 위쪽화살표키를 눌러 위로 쏘아 올리 수 있습니다. 쏘아진 공의 최대 속도는 10 입니다.

이 코드를 작성할 때 정하기와 바꾸기를 혼돈하는 경우가 많습니다. 각별히 유의하여 작성하영여야 합니다.

스크래치 – 매직서클 만들기

[siteorigin_widget class="WP_Widget_Media_Image"][/siteorigin_widget]

매직서클을 아시나요?

문방구에서 구입한 이상한 자. 톱니바퀴 모양의 동그라미 안에 톱니바퀴 모양의 작은 동그라미를 넣어 연필로 콕 찍어 돌리면 와~~~ 신기하게 예쁜 그림이 만들어지던 기억이 있나요?

이렇게 생긴 자(도구)의 이름을 몰라 겨우겨우 검색해서 알아보니 매직서클모양자라고 합니다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
큰 동그라미 안에 넣을 수 있는 작은 동그라미는 여러개가 있습니다. 그리고 작은 동그라미에는 펜을 넣을 수 있는 작은 구멍이 여러개 있습니다. 선택에 따라 다양한 모양의 꽃들이 그려지는 것이 여간 신기하지 않습니다.

스크래치로 매직서클을 그려 봅시다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
가장먼저 무대 배경을 그려줍니다. 배경색은 비트맵모드에서 임의의 두개 색을 선택하고 상하그라데이션으로 채워 줍니다.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]

스프라이트를 드로잉펜 이라는 이름으로 생성합니다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
이 스프라이트는 모양이 없습니다. 가장 먼저, 스크립트에서 변수를 만듭니다. 변수의 이름은 각각, 각1, 각2, 반지름1, 반지름2 로 해주세요. 변수명이 화면에 나타나지 않도록 체크를 풀어주세요.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
그림과 같은 블럭을 조립하세요. 연산 블럭에 보면 함수블럭이 있습니다. 함수블럭은 제곱근( )처럼 보이는데 제곱근을 cos 로 바꾸어야 합니다.  그래서

반지름1 곱하기 cos(각1)

과 같은 수식을 만들어야 합니다. 스크래치에서 곱하기는 별모양기호(*)로 사용합니다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
만들어진 블럭의 * 부근을 오른클릭하여 복사해 주세요. 복사된 블럭의 반지름1을 반지름2로 바꾸고, 각1을 각2로 각각 바꾸어 줍니다.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]

만들어진 두개의 블럭을 덧셈으로 연결해 줍니다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
만들어진 블럭의 + 부근을 오른클릭하여 복사해 줍니다. 복사된 블럭의 cos을 모두 sin으로 바꾸어줍니다.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
x, y 로 이동하기 블럭을 가져와 만들어진 두개의 블럭과 조립합니다. cos 이 들어간 블럭은 x 좌표값으로 sin이 들어간 블럭은 y 좌표값으로 조립합니다. 블럭을 드래그 할 때 + 부근을 클릭하세요.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]

만들어진 블럭 상위에 그림과 같이 블럭들을 추가합니다. 추가되는 블럭들은 변수 반지름1, 반지름2, 각1, 각2 를 각각 초기화 하는 블럭입니다.

[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
펜 내리기 이전에 펜의 굵기와 색깔 등 속성을 정의합니다.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]
완성된 코딩 스크립트 블럭의 모습입니다. 펜 내리기 이하 무한 반복 부분이 실제 그림을 그리는 부분입니다. x, y 로 이동하기 블럭은 위에서 만든 것을 복사하여 사용합니다. 펜이 원을 그리며 회전하는데 각도의 증가량이 회전의 속도를 결정하게 됩니다.
[siteorigin_widget class="SiteOrigin_Widget_Image_Widget"][/siteorigin_widget]

실행된 화면입니다. 코드에서 두 개의 반지름 값을 변경하거나, 각1, 각2 의 증가량 값을 변형하면 다른 모양의 그림이 나타납니다.