Language 122

[Design Pattern] Singleton 패턴

인스턴스가 하나 뿐인 객체를 만들 수 있게 해주는 패턴 특정 클래스에 대해 객체 인스턴스를 하나만 만들 수 있다. 사용 용도> 자원 관리 Pool, 특정 하드웨어를 Control하는 디바이스 드라이버 등 비슷한 역할을 하는 전역 변수와의 비교> 전역 변수는 애플리케이션 시작될 때 생성 불필요하게 자원을 잡아먹는 경우 발생 Singleton은 필요할 때 객체 생성 [Singleton 기본 구조] public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { if(uniqueInstance == null) uniqueInstance = new..

Language/Java 2020.11.26

Python - pywinauto, Microsoft Windows GUI 제어 자동화

pywinauto WebSite : http://pywinauto.github.io/ Github : https://github.com/pywinauto/pywinauto Doc : https://pywinauto.readthedocs.io/en/latest Microsoft Windows GUI 제어를 자동화할 수 있는 Python Module 설치 > pip3 install pywinauto (pywinauto 설치시 six, comtypes, pywin32 또한 의존성에 의해 자동 설치된다.) 사용의 예 1) "메모장" 실행 후 "Sample" 문자열을 입력하는 예제 from pywinauto.application import Application app = Application(backend="u..

Language/Python 2020.02.29

Python - PyInspect 설치 및 실행

1) https://github.com/pywinauto/py_inspect 에 접속하여 code 다운로드 2) python 3.5 이상, pywinauto, PyQt5 설치 3) "python py_inspect.py" 으로 실행 특이사항 1) 실행시 2회 실패 후 3회시 부터 정상 실행됨. 1회 실패시 에러 내용 D:\workspace\py_inspect-master>python py_inspect.py QWindowsContext: OleInitialize() failed: "COM error 0xffffffff80010106 RPC_E_CHANGED_MODE (Unknown error 0x080010106)" Traceback (most recent call last): File "py_inspe..

Language/Python 2020.02.28

Python - reduce(), 인자를 누적적으로 적용하여 결과를 반환

reduce >>> functools.reduce(function, iterable[, initializer]) iterable 한 data를 왼쪽에서 오른쪽으로 누적적으로 fuction 의 인자로 넣어 하나의 결과를 반환하는 함수 python2 에서는 builtin 함수로 바로 사용할 수 있었지만 python3 에서는 functools 모듈의 함수로 포함되어 있다. [Link : iterable 과 iterator, 그리고 반복문] functools.reduce(function, iterable[, initializer]) Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to r..

Language/Python 2020.02.23

[Node.js] libuv 의 Design overview

libuv Node.js 를 위해 작성된 cross-platform 을 지원하는 라이브러리 (Event-driven (이벤트 기반) asynchronous (비동기) I/O (입출력)을 지원하기 위해 설계) libuv 의 전반적인 Design overview I/O (혹은 Event) loop 는 libuv 의 핵심 부분으로 모든 I/O 동작에 대해 Single thread 에서 처리 될 수 있도록 한다. 그리고 loop 가 반복되는 동안 I/O waiting 을 하지 않으므로 별도로 들어온 I/O 작업에 대해 수행할 수 있다. Network I/O libuv의 모든 Network I/O 는 non-blocking socket 위에서 동작하도록 되어 있다. 이를 위해 각 platform 에서 지원하는 방..

Language/Node.js 2020.02.23

Python - filter(), iterable 변수 내 값 중 조건에 맞는 값만 반환

filter >>> filter(function, iterable) iterable 한 data를 function 의 인자로 넣어 False 가 아닌 결과를 반환하는 인자들만 iterator 형태로 반환해 주는 함수 [Link : iterable 과 iterator, 그리고 반복문] filter(function, iterable) Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity fu..

Language/Python 2020.02.22

[Node.js] 학습 관련 정보

[Javascript Event Loop 에 대한 이해] What the heck is the event loop anyway? | Philip Roberts | JSConf EU https://www.youtube.com/watch?v=8aGhZQkoFbQ [libuv 에 대한 이해] Node.js 에서 event-driven 비동기 I/O 모델을 지원 가능하게 하는 라이브러리의 Design Overview http://docs.libuv.org/en/v1.x/design.html[libuv 에 대한 이해] https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/ [Node.js 에 대한 이해] https://nodejs.dev/the-nod..

Language/Node.js 2020.02.22

Python - map(), 함수와 iterable 변수를 인자로 받아 iterator 결과를 반환

map >>> map(func, *iterables) iterable 한 data를 func 의 인자로 넣어 나온 결과들을 iterator 형태로 반환해 주는 함수 [Link : iterable 과 iterator, 그리고 반복문] map(function, iterable, ...) Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. With ..

Language/Python 2020.02.19

일급 객체 (first-class object)

일급 객체 (first-class object) 는 아래와 같이 불리기도 한다. first-class citizen first-class type first-class entity first-class value 일급 객체의 특징 함수의 인자로 전달 가능 함수의 결과로 반환 가능 Python 에서는 정수, 문자열, list 등과 더불어 함수 또한 일급 객체이다. 이에 따라 아래와 같이 하나의 함수를 다른 함수의 인자로 넘겨줄 수 있다. >>> def reverse(data): ... return data[::-1] ... >>> data = ['zbc', 'tde', 'dcd', 'xfg'] >>> sorted(data, key=reverse) ['zbc', 'dcd', 'tde', 'xfg'] 할당문의..

Language 2020.02.17

Python - iterable 과 iterator, 그리고 반복문

iterable 의 정의 및 이해 iterator 의 정의 및 이해 iterable 의 정의 및 이해 iterable : 한 번에 하나의 member를 반환할 수 있는 object (객체)를 의미. iterator 로 변환이 가능. list, str, tuple 와 같은 모든 Sequence type dict, file object 혹은 sequence semantic 을 가진 __iter__() method 나 __getitem__() method 가 구현된 object iterable 은 for loop 나 sequence 가 필요한 zip(), map() 등에 사용될 수 있다. 일반적으로 iterator 로 변환 후 사용된다. iter() 를 이용해 해당 object의 iterator를 생성하여 사..

Language/Python 2020.01.02

Python - 문자열(str)/바이트(bytes) 시퀀스와 인코딩(encoding)/디코딩(decoding)

문자열(str) : 사람이 인지 가능한 문자의 형태. Python에서는 유니코드 문자를 기반으로 문자열 표시. (유니코드 문자를 나타내는 하나하나의 문자의 단위 원소를 코드 포인트라고 함.) 바이트(bytes) 시퀀스 : 기계가 처리하는 문자의 형태. 문자를 표현하는 실제 바이트. 인코딩(encoding) : 유니코트 문자로 표현되는 문자열을 바이트 시퀀스로 변환 디코딩(decoding) : 바이트 시퀀스를 유니코드 문자로 변환

Language/Python 2019.11.28

Python - Sequence Type을 Slice 하기

Python 은 데이터에 순서를 붙여 나열한 Sequence Type 으로 리스트(list), 튜플(tuple), 범위(range), 문자열(string) 등 여러 가지 형태를 제공한다. Python 은 이렇게 나열된 데이터들을 쪼갤(Slice) 수 있는데, ":" 을 slice notation 으로 하여 아래와 같은 기능을 제공하고 있다. Python Sequence Type 의 Slice Notation 기본 문법 variable[start:stop:step] [slice() 함수를 이용한 sequence type 변수 나누기] start, stop 의 값이 양수 일 경우 인덱스 처음을 기준으로 시작하고, 음수 일 경우 인덱스 끝을 기준으로 시작한다. step 의 양수/음수에 따라 결과의 방향이 바뀌..

Language/Python 2019.11.25

Python - with, context manager에 대한 이해.

특정 구문을 시작 전후 반드시 실행해야 하는 구문이 있다면 Python에서는 어떻게 구현할 것인가. 일반적인 코드로 구현하자면 다음과 같다. print("->> Before routine") routine1() print(" Before routine") routine2() print(" Before routine") routine3() print("> Before routine") try: routine1() finally: print(" Before routine") try: routine2() finally: print(" Before routine") try: routine3() finally: print("> Before routine") def __exit__(self, type, value,..

Language/Python 2019.11.16

Python - configparser, 기본적인 설정파일을 다루는 모듈

configparser.ConfigParser() configparser 모듈은 ConfigParser class 를 제공하고, ConfigParser class 는 Microsoft Windows의 INI 와 같은 형식의 설정파일 구조를 다룰 수 있다. [sample.ini] [KeyList] # Set Key Value Key1 = 10 Key2 = 20 Key3 = 30 Key4 = 40 Key5 = 50 [NameList] # Set Name Value Name1 = abc Name2 = bcd Name3 = cde Name4 = def Name5 = efg 위와 같은 형태의 설정 파일을 읽기 위해서 다음과 같은 코드를 사용할 수 있다. from configparser import ConfigPa..

Language/Python 2019.10.11

Python - 지능형 리스트 (List Comprehension)/제너레이터 표현식 (Generator expression) 의 이해 및 비교

지능형 리스트 (List Comprehension) : Python 에서는 리스트 구성을 위해 항목을 하나하나 나열하는 방식외에 구문을 통해 sequence 형태의 데이터를 가공하여 리스트를 구성하는 방법을 제공하고 있다. 지능형 리스트를 사용하게 되면 코드가 간결해지고 상황에 따라서는 성능이 좋은 코드를 작성할 수 있다. 제너레이터 표현식 (Generator expression) : 지능형 리스트 (List Comprehension) 과 유사하지만 별도의 리스트는 생성하지 않고, iterator 를 생성하여 항목을 하나씩 처리할 수 있도록 한다. 지능형 리스트를 만든 후 하나씩 항목을 처리하여도 되지만 별도의 메모리 공간을 차지하지 않는다는 차이점이 있다. 지능형 리스트의 경우 대괄호 [] 를 사용하는..

Language/Python 2019.09.13

Signed / Unsigned 의 비교

signed 의 경우 양/음수를 표현할 수 있는 변수형으로 알고 있고, unsigned 의 경우 양수만 표현할 수 있는 것으로 막연히 알고 있었는데, 코드로 실제 비교해 보았다. #include int main() { signed char a = 0xFF; unsigned char b = 0xFF; printf("a = %d\n", a); printf("b = %d\n", b); } [결과] a = -1 b = 255 2진수 (16진수) 10진수 (signed char) 10진수 (unsigned char) 1111 1111 (0xFF) -1 255 signed char 의 경우 이진수 1111 1111 중 MSB (Most Significant Bit) 는 부호 표현을 위해 사용된다. 이에 2의 보수법..

Language/C 2019.08.24

Python - random(), 임의의 수(난수)를 구하는 함수

가장 흔히 사용되는 기능으로 random 값을 생성하는 random() 함수가 있다. 해당 함수를 사용하기 위해서는 별도의 random module을 import 하여 사용해야 한다. 직접 난수를 구하는 로직을 작성해 본 사람을 알겠지만 규칙이 없는 난수를 생성하기는 쉽지가 않다. 질 좋은 난수 생성기더라도 경우의 수를 늘려 생성하다 보면 어느 순간 규칙을 가지는 것을 확인하는 경우가 다수이기 때문이다. 이를 극복하기 위해 난수 생성하는 로직이 제안되고 존재하는데 Python 에서는 Mersenne Twister 라는 난수 생성기를 사용한다. 하지만 이 난수 생성 로직도 특정 상황에서 다음 난수를 예측할 수 있기 때문에 암호 관련 목적으로 random 모듈로 부터 생성된 난수 사용은 권장하지 않고 있다...

Language/Python 2019.03.20

Python - Python 2 에서 Python 3 으로의 전환

PYthon을 처음 접한지 몇년이 지났지만 Python 3에 대한 거부감(?), 두려움(?)은 상당했다. 우선 접하고 있던 Python code들은 모두 2.7을 기준으로 작성되어 있었고, 나 또한 그 틀에서 벗어났을 때 코드가 동작하지 않을 수도 있다는 점에서 상호 호환이 되지 않는 Python 3으로의 전환은 어려웠다. 하지만 수년내 python 2.7 의 지원이 종료될 예정임에 따라, 최근 신규로 작성하는 코드를 모두 Python 3로 작성을 시작해 보았다. 내부적으로는 많은 차이가 있겠지만 자체적으로 느꼈던 차이점은 다음과 같았다. 1. print 문 사용의 변화 기존 python 2에서는 print "ABC" 와 같이 사용이 가능하였으나 Python3 에서는 함수사용과 마찬가지로 중괄호를 넣어줘..

Language/Python 2019.03.19

Python - id(), object의 unique 값(memory address)를 보여주는 함수

Python은 C 언어와 달리 포인터라는 개념이 없다. 하지만 컴퓨터 상에서 돌아가는 언어이기 때문에 내부적으로는 메모리를 사용하고, 이에 대한 주소 정보를 가지고 있다. 그렇다면 포인터 개념을 사용하지 않는 Python에서 해당 메모리 주소는 어떤 용도로 사용되는 것일까? Python은 메모리 주소를 변수를 구별하기 위한 용도로 사용하고 있다. python의 built-in 함수 중 id() 를 이용하면 현재 확인하고자 하는 변수의 메모리 주소를 확인할 수 있다. (CPython의 경우 메모리 주소를 반환하지만, 다른 파이썬 인터프리터는 메모리 주소 이외의 다른 값을 반환할 수 있음) id(object)Return the “identity” of an object. This is an integer w..

Language/Python 2019.03.18

Python - if __name__ == __main__ 의 의미

[Python 스크립트 파일의 실행] python은 C언어나 Java 와 달리 main() 함수가 존재하지 않는다.이에 따라 스크립트 파일을 실행하게 되면 들여쓰기가 되지 않은 line들을 파일 상단 부터 순차적으로 읽어 수행하게 된다. [sample.py]a = 1b = 3c = a + b print(c) def temp(): print("abc") ~/python$ python sample.py4 위에서 보듯이 들여쓰여진 코드인 함수 부분은 수행되지 않았음을 볼 수 있다. [다른 Python 스크립트 파일을 모듈로서 실행] python 스크립트 파일은 또 다른 python 스크립트 파일을 하나의 모듈로써 읽어 들일 수 있다. [sample_call.py]import sample ~/python$ py..

Language/Python 2019.02.08

Webfont 의 적용 (Google Fonts)

웹페이지를 작성하다보면 자신이 원하는 형태의 폰트로 글자가 표시되기를 원할 때가 있다. 이 때 좀 더 쉽게 원하는 폰트를 적용시키는 방법은 웹폰트(webfont)를 적용하는 것이다. https://fonts.google.com/ 구글에서는 위 사이트를 통해 다양한 폰트를 제공하고 있고, 쉽게 적용할 수 있도록 가이드를 하고 있다. 크게 원하는 폰트를 고르고, 그 폰트를 자신의 사이트에 적용하는 것이 큰 골자이다. 사이트에 접속하면 2018년 10월 11일 기준으로 900여개의 font를 제공하고 있다. 화면 오른쪽에는 Languages 를 선택하여 해당 언어에 맞는 폰트를 필터링해서 보여준다. 아래 화면은 언어를 Korean으로 필터를 했을 때의 결과로 보여지는 한글 폰트들이다. 폰트를 보면 Senten..

Language/HTML 2018.10.11

Kotlin - Class와 Inheritance(상속)

ClassKotlin은 Java와 마찬가지로 class 를 가지고 있고, class keyword를 통해 선언한다. class Study { ... } class는 class name, header, body로 구성되어 있고, 중괄호 {} 로 둘러 쌓여있다. 단, 만약 optional인 header와 body 중 body가 없을 경우 중괄호 {} 를 다음과 같이 생략해도 된다. class Study 생성자(Constructors) Kotlin의 class는 primary constructor, secondary constructor를 가질 수 있고, primary constructor는 최대 하나, secondary constructor는 복수개로 가질 수 있다. Primary constructor 먼저..

Language/Kotlin 2018.07.25

Kotlin - for/while Loops

for Loops for loop은 iterator를 제공하는 매개체를 통해 반복적으로 무엇인가를 수행할 때 사용된다. C#의 foreach loop와 동일하다. 간단한 사용의 예를 다음과 같다. for (item in collection) print(item) for (item: Int in ints) { // ... } 앞서 말했듯이 일반적으로 iterator() funtion을 member/extension function으로 가지고 있고, next(), hasNext()를 지원하는 매개체를 통해서 반복하게 된다. 반면 iterator가 없어도 사용 가능한 경우가 있는데, range나 array/list를 사용할 때 가능하다. 숫자 범위내에서 반복할 때는 range expression을 아래와 같이..

Language/Kotlin 2018.07.24

Kotlin - when expression

when은 C언어에서의 switch와 완전히 동일하지는 않지만 상당히 유사하다. 기본적인 해당 구문의 사용 예는 다음과 같다. when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x is neither 1 nor 2") } } when 구문에서는 condition이 맞는 branch를 찾을 때 까지 순차적으로 확인한다. 만약 조건을 만족하는 branch가 없을 경우 else branch를 수행하게 된다. 각 조건이 하나하나씩 표현될 수도 있지만 아래와 같이 여러 종류의 조건이 comma(,)로 구분되어 표현될 수도 있다. when (x) { 0, 1 -> print("x == 0 or x == 1") else -> print("ot..

Language/Kotlin 2018.07.23

Kotlin - if expression

if expressionKotlin 에서 if는 expression이고, 즉 return 값을 가진다. 따라서 다른 언어에서 볼 수 있는 (condition?then:else)와 같은 ternary operator를 가지고 있지 않다. if 자체가 동일한 역할을 하기 때문이다. fun main(args: Array) { val a: Int = 1 val b: Int = 2 // Traditional usage var max1: Int = a if (a < b) max1 = b println("max1 : $max1") // With else var max2: Int if (a > b) { max2 = a } else { max2 = b } println("max2 : $max2") // As expres..

Language/Kotlin 2018.07.17

Kotlin - Kotlin on Android (Android Studio for Windows)

Kotlin에 관심을 가지게 된 이유는 Android를 위한 App build가 가능하다는 점 때문이었다. Kotlin을 개발한 IntelliJ에서 Android Studio 또한 개발하고 있다. 이 때문인지 Android Studio 상에서 Kotlin을 통해 쉽게 android app build가 가능하다. 먼저 Android Studio 3.0 이상에서 기본적으로 지원이 되고, 그 이하 버전에서는 별도로 kotlin plugin 을 설치해 주어야 한다고 한다. The Kotlin plugin is bundled with Android Studio starting from version 3.0. If you use an earlier version, you'll need to install the K..

Language/Kotlin 2018.07.16

Kotlin - Packages

Kotlin은 Java와 마찬가지로 Package 개념을 사용한다. Java에서 그러하듯이 Kotlin에서도 source 파일은 package 선언으로 시작한다. 이에 따라 source 파일 내 class나 function들과 같은 contents들은 package 를 통해 표현이 가능한데, 예를 들어 아래의 baz() 는 foo.bar.baz로, Goo 는 foo.bar.Goo 로 표현이 가능하다. package foo.bar fun baz() {} class Goo {} Package가 명시되지 않았다면 해당 파일의 content들은 이름이 없는 "default" package에 포함되었다고 보면 된다. Default Imports많은 수의 package들이 기본으로 모든 kotlin 파일에 impo..

Language/Kotlin 2018.07.16

Kotlin - Kotlin on JVM (the IntelliJ IDEA Community Edition for Windows)

Kotlin을 제일 쉽게 접할 수 있는 방법 중 하나로 Windows 상에서 IntelliJ IDEA Community Edition을 깔아 코딩해 보는 방법이 있다. 1) The IntelliJ IDEA Community Edition download page 접속. http://www.jetbrains.com/idea/download/index.html 상기 주소로 접속해서 Windows, mmacOS, Linux 중 Windows (기본값)을 선택하고 Community version을 다운로드 받는다. Ultimate version이 있지만 개인 개발자가 사용하기에는 Community version도 부족함이 없다. 2) 다운로드 받은 ideaIC-2018.1.5.exe 설치 다운로드 받은 파일을 ..

Language/Kotlin 2018.07.12

Kotlin - Strings (문자열)

문자열은 String type으로 표현된다. 한번 할당된 문자열은 변하지 않는다. 문자열 내 문자들은 index를 통해 배열을 접근하듯이 접근 가능하다. 아래와 같이 하면 문자열 내 문자를 하나씩 반복 접근 가능하다. for (c in str) { println(c) } String concatenationstring concatenation 은 + operator로 할 수 있다. 문자열로 시작할 경우 다른 type의 값들도 concatenate 가능하다. val s = "abc" + 1 println(s + "def") String literalsKotlin은 두 종류의 string literals를 가지고 있다. escaped stringraw stringescaped string은 escaped c..

Language/Kotlin 2018.07.11