Python vs Java @ PyCon Korea 2017Insuk (Chris) Cho자바 개발자가 파이썬 개발을 배우면서 실무에 활용하고 집필을 하면서 겪었던 경험담 및 생각을 코드와 함께 풀어본다. 자바에 익숙한 사람이 파이썬을 배우고 있거나, 자바와 파이썬의 사이에서 고민을 했던 사람들에게 비교를 위한 기본 정보를 제공한다. 더 나아가 컴파일 언어와 스크립트 언어의 차이점, 개발 생산성을 측정할때 간과하는 컴파일 시간 및 순수 코딩 시간에 대한 통찰을 이끌 생각이다.
20150212 c++11 features used in crowJaeseung Hahttp://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
니름: 쉬운 SOA 단위 테스트효준 강니름은 마이크로서비스를 위한 인터페이스 정의 언어(IDL) 컴파일러이자 원격 프로시저 호출(RPC) 프레임워크입니다. 스포카에서 서비스 지향 설계(SOA)를 적극적으로 도입하면서 쓰기에 적합하도록 구현되었습니다.
제품을 개선하기 위해서는 코드를 고쳐야 합니다. 그런데, 고친 코드가 행여 제품을 망가뜨리는 것이 아닐까 망설이고 고민할 때가 많습니다. 단위 테스트가 있다면 제품을 안전하고 빠르게 개선할 수 있습니다. 하지만 서비스 지향 설계로 제품을 만들다 보면 여러 개의 서비스들이 서로 통신하게 됩니다. 그리고 다른 서비스에 통신하는 기능도 단위 테스트를 작성해야 합니다.
서비스 간 단위 테스트는 까다로운 처리가 많이 필요합니다: 단위 테스트 안에서 요청을 흉내 내기, 실제 서비스를 띄워서 단위 테스트에서 테스트용 서비스에 요청하거나, 또는 요청과 응답을 흉내 내기, 요청한 내용을 역직렬화하고 응답할 내용을 직렬화 하기 등… 니름을 사용하여 서비스를 작성하면 서비스의 인터페이스와 구현을 분리할 수 있습니다.
요청이나 직렬화 등의 작업도 니름이 대신 처리하므로 추상화됩니다. 따라서 단위 테스트를 쉽게 작성할 수 있습니다. 서비스 지향 설계에서 니름을 사용하여 단위 테스트를 작성하면서 느낀 장점과 이것이 기존 방법들과 어떤 차이가 있는지 공유하고 싶습니다.
Boost라이브러리의내부구조 20151111 서진택JinTaek Seoboost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee파이썬 데이터과학 - 기초 과정(1일차)
- 데이터분석, 데이터시각화
- jupyter notebook, numpy, pandas, matplotlib, seaborn
2차 과정은 따로 올리겠습니다.
문의 및 제안 : se2n@naver.com
데이터 소스 : https://github.com/sh2orc/datascience
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
- 파이썬 중고급 문법부터 실전 예제까지
- 국내 어떤 책에서도 다루지 않는 진짜 데이터분석 강의
- (귀차니즘에..) 소수 금융권/대기업/공기업에게만 강의된 자료
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee1. pyenv를 이용한 파이썬 2, 파이썬 3 설치
2. Jupyter notebook에서 파이썬 2, 파이썬3 동시 이용
3. Jupyter notebook 사용법
20150212 c++11 features used in crowJaeseung Hahttp://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
니름: 쉬운 SOA 단위 테스트효준 강니름은 마이크로서비스를 위한 인터페이스 정의 언어(IDL) 컴파일러이자 원격 프로시저 호출(RPC) 프레임워크입니다. 스포카에서 서비스 지향 설계(SOA)를 적극적으로 도입하면서 쓰기에 적합하도록 구현되었습니다.
제품을 개선하기 위해서는 코드를 고쳐야 합니다. 그런데, 고친 코드가 행여 제품을 망가뜨리는 것이 아닐까 망설이고 고민할 때가 많습니다. 단위 테스트가 있다면 제품을 안전하고 빠르게 개선할 수 있습니다. 하지만 서비스 지향 설계로 제품을 만들다 보면 여러 개의 서비스들이 서로 통신하게 됩니다. 그리고 다른 서비스에 통신하는 기능도 단위 테스트를 작성해야 합니다.
서비스 간 단위 테스트는 까다로운 처리가 많이 필요합니다: 단위 테스트 안에서 요청을 흉내 내기, 실제 서비스를 띄워서 단위 테스트에서 테스트용 서비스에 요청하거나, 또는 요청과 응답을 흉내 내기, 요청한 내용을 역직렬화하고 응답할 내용을 직렬화 하기 등… 니름을 사용하여 서비스를 작성하면 서비스의 인터페이스와 구현을 분리할 수 있습니다.
요청이나 직렬화 등의 작업도 니름이 대신 처리하므로 추상화됩니다. 따라서 단위 테스트를 쉽게 작성할 수 있습니다. 서비스 지향 설계에서 니름을 사용하여 단위 테스트를 작성하면서 느낀 장점과 이것이 기존 방법들과 어떤 차이가 있는지 공유하고 싶습니다.
Boost라이브러리의내부구조 20151111 서진택JinTaek Seoboost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee파이썬 데이터과학 - 기초 과정(1일차)
- 데이터분석, 데이터시각화
- jupyter notebook, numpy, pandas, matplotlib, seaborn
2차 과정은 따로 올리겠습니다.
문의 및 제안 : se2n@naver.com
데이터 소스 : https://github.com/sh2orc/datascience
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
- 파이썬 중고급 문법부터 실전 예제까지
- 국내 어떤 책에서도 다루지 않는 진짜 데이터분석 강의
- (귀차니즘에..) 소수 금융권/대기업/공기업에게만 강의된 자료
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee1. pyenv를 이용한 파이썬 2, 파이썬 3 설치
2. Jupyter notebook에서 파이썬 2, 파이썬3 동시 이용
3. Jupyter notebook 사용법
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris OhkC++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...Seok-joon Yun[C++ Korea] Effective Modern C++ Study (신촌) Item 14
Declare functions noexceptif they won’t emit exceptions.
예외를 발생하지 않는 함수인 경우 noexcept를 선언하자.
- 윤석준
10. if
• [Python]
if x > 0:
• [Go]
if x > 0 {
}
• initialization statement
if ok := check(); ok {
11. for
• [Python]
for value in value_list:
• [Go]
• for i, value := range array { // array, slice, map 순회
• for init; condition; post { // c style
for i := 0; i < 10; i++ {
• for condition { // while 문 처럼 사용
• for { // 무한 루프
18. 함수 선언
• [Python]
• def sum(x, y):
return x + y
• [Go]
• func sum(x, y int) int {
return x + y
}
• 매개변수, 리턴값 모두 type 명시 필요!
• func sum(x, y int) (int, err) { 와 같이 여러개의 리턴값도 리턴 가능!
19. 이쯤에서 생기는 궁금증...
• int 말고 다른 type을 더하고 싶으면 어떻게 해야 할까... ???
• method overloading을 하면 되려나???
• func sum(x, y int) int {
return x + y
}
func sum(x, y float64) float64 {
return x + y
}
• compile error .. - “sum redeclared in this block”
21. interface{}
• interface는 method의 집합 (단, 메서드 자체를 구현하
지는 않음.)
• method가 정의되지 않은 빈 인터페이스(interface{})는
어떠한 조건도 없기 때문에 모든 type의 값 대입이 가능.
• func sum (x, y interface{})
22. type switch
• switch x.(type) {
case int:
…
case float64:
…
• interface는 내부적으로 실제 값의 type에 관한 정보들을 저장
하고 있는 itable 에 대한 pointer를 가지고 있음.
• type switch를 사용하면 Go compiler가 itable 을 체크해서 원
하는 type이 맞는지 비교하는 코드를 생성해줌.
23. type assertion
• value := x.(int)
• type을 명시적으로 지정
• 맞지 않는 type으로 assertion을 하면 panic! (runtime error)
• 따라서 type switch와 같이 쓰는 것이 일반적
switch x.(type) {
case int:
value := x.(int)
…
case float64:
value := x.(float64)
…
24. reflect package
• run-time reflection 기능 제공
• reflect 패키지는 앞서 살펴본 type switch & type
assertion 에 해당하는 기능들과 여러가지 부가 기능을
가지고 있음.
• reflect 패키지의 기능들은 편리하기는 하지만, type
switch & type assertion에 비해 더 무거운 연산들이 동
반될 수 있으므로 고성능 어플리케이션 작성시에는 세심
하게 사용할 필요가 있음.
26. array
• var x [10]int // 길이가 10인 int형 배열 선언
• x := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// 생성과 동시에 초기화
• x := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// 배열 길이가 10으로 자동으로 설정됨
• y := x // 새로운 배열에 대입시 값 전체가 복사됨
27. slice
• Python의 list와 쓰임새가 유사함.
• var x []int // 선언
• x := make([]int, 5, 10) // 길이(length)는 6, 용량(capacity)은 10
• 길이 : index로 접근할 수 있는 범위 / 용량 : 실제 할당된 data array 공간
• x := make([]int, 5) // 용량은 생략 가능
• x := []int{0, 1, 2, 3, 4} // 생성과 동시에 초기화
• x = append(x, 1) // 새로운 값 추가
x = append(x, 1, 2, 3) // 여러 값을 동시에 추가도 가능
28. slice 내부 구현
• slice의 내부 구현에는 앞서 살펴본 array가 사용됨
• slice 생성시 지정된 용량만큼의 data array를 생성하고
해당 array에 대한 pointer를 가짐.
• 이 구현을 제대로 이해하는 것이 중요!
ptr
*Elem
len
int
cap
int
[]int
[5]int
29. slice 내부 구현 (2)
• x := []int{0, 1, 2, 3, 4} // 길이가 5인 slice 생성
• x = append(x, 1) // 해당 slice에 새로운 값을 추가하면?
• append는 slice 용량을 먼저 확인하고 용량이 넘치면 새로운 data array
allocation 후 값을 추가한다. (용량이 남아 있으면 바로 값만 대입.)
• 기존 slice 용량이 5 이므로 새로운 allocation이 발생!
• 다행히 append 할때마다 새로 allocation 하지는 않고 future growth
를 고려하여 필요한 용량의 2배를 할당.
• append를 매우 빈번하게 할 예정이라면 용량을 예측해서 미리 지정하
면 성능에 도움이 됨.
30. slice 내부 구현 (3)
• array는 새로운 변수에 대입시 값이 모두 복사되던데, slice도 혹시?
• slice는 앞서 살펴본 바와 같이 실제 data array에 대한 pointer 이다.
따라서 대입시 pointer만 복사된다.
• x := []int{0, 1, 2, 3, 4}
y := x // y와 x는 같은 data array를 참조. y의 데이터 조작시 x도 변
경됨.
ptr
*Elem
len
int
cap
int
[]int
[5]int
31. slice 내부 구현 (4)
• slice는 아래와 같이 부분 slice 생성이 가능하다. (slicing)
x = x[2:4]
이때는 내부적으로 어떻게 동작할까?
• slice는 앞서 살펴본 바와 같이 실제 데이터 array에 대한 pointer 이다.
slicing시에도 데이터 array는 그대로 존재하고 해당 데이터를 가리키는
pointer를 가진 slice가 생성된다.
ptr
*Elem
len
int
cap
int
[]int
[5]int
32. map
• Python의 dict와 쓰임새가 유사함.
• hash table 구현
• var x map[string]int // 선언 (key type : string / value type : int)
• x := make(map[string]int) // slice와 마찬가지로 make로 할당 가능
• x := map[string]int{“foo”: 1, “bar”: 2} // 할당과 동시에 초기화
• x[“new”] = 2 // 새로운 key로 값 대입
x[“foo”] = 4 // 기존 키의 key의 값 변경
• y := x // slice와 마찬가지로 데이터에 대한 pointer만 복사됨. 따라서 y
의 데이터 조작시 x도 변경됨.
33. map key 존재 여부 체크하기
• map에 존재하지 않는 key를 조회하게 되면 각 type의 zero value가
리턴됨. (int => 0, string => “”, bool => false 등)
x := map[string]int{“foo”: 1, “bar”: 2}
value := x[“hello”] // value = 0
• 또는, 아래와 같은 형태로 key 존재 여부 체크도 가능함.
value, ok := x[“hello”] // value = 0 (zero value) , ok = false
• if 문에서는 initialization statement를 key 존재 여부 체크 가능.
if value, ok := x[“hello”]; ok {
34. map 사용시 주의사항
• Concurrency
• map은 여러 goroutine에서 접근시 동시성을 보장하지 않
음.
• map을 여러 goroutine에서 접근할 때는 sync.RWMutex
사용 필요
• Iteration order
• for range loop로 데이터를 가져올때 순서를 보장하지 않
음.
36. struct
• Python의 class와 유사하게 사용 가능
• 선언
type Accounting struct {
Symbol string
Precision int
Thousand string
Decimal string
Format string
}
• 할당
accounting := Accounting{Symbol: "$", Precision: 2}
37. struct method
• class 가 없는 대신 struct에 method 연결 가능
type Accounting struct {
Symbol string
Precision int
Thousand string
Decimal string
Format string
}
func (accounting *Accounting) FormatMoney(value interface{}) string {
…
}
• method 호출
accounting := Accounting{Symbol: "$", Precision: 2}
accounting.FormatMoney(1234567)
39. panic
• run-time error
• Python의 Exception과 유사
• Python의 Exception 처럼 직접 발생시키는 것도 가능
panic(“unsupported type”)
• panic 발생시 적절하게 handling 하지 못하면 어플리케
이션이 중단됨.
40. recover
• defer - 함수 종료 직전에 실행. defer를 여러번 호출하면 LIFO로 실
행
• First Class Function => 익명 함수 호출 가능
• func handler() {
defer func() {
if err := recover(); err != nil {
// panic handling
}
}()
…
}
42. package
• 소스코드 첫줄에 package명 명시
package accounting
• Python의 module 과 다르게 파일명은 아무런 역할도 하지 않는다.
• 패키지 내부에 있는 함수, 변수, 상수들은 아래 규칙에 따라 역할이 결정됨.
• 첫 글자가 대문자이면 외부에서 import시 접근 가능
• 첫 글자가 소문자이면 package 내부에서만 접근 가능
• 심지어 struct의 경우에는 struct 이름 첫글자가 대문자여도 필드 이름이 소문자이
면 외부에서 접근 못함. 외부에서 접근이 필요한 필드들은 대문자를 사용해야 한다.
type Timedelta struct {
Days, Seconds, Microseconds, Milliseconds, Minutes, Hours, Weeks
time.Duration
}
43. package 공유
• github 에 repo 생성시 아래 명령어로 바로 패키지 다운로드
및 설치 가능 (bitbucket 등 다른 저장소도 지원)
go get github.com/leekchan/accounting
• 처음에는 좋아 보였으나, PyPI에 비해 단점이 많음.
• 무조건 master branch 최신 커밋 소스를 다운로드
• 기능 개발 및 테스트 후 원하는 시점에 versioning을 하고
릴리즈 할 수가 없음
• 해당 단점을 보완하는 다양한 오픈소스 라이브러가 생겨나
고 있는 중
45. gofmt
• formatting을 style guide에 맞춰서 알아서 해주는
gofmt 라는 기능을 bult-in 으로 제공
• 덕분에, 일단 코드를 쓰고 커밋하기 전에 gofmt을 한번
실행시켜 주면 style guide에 맞춰서 아름답게 formatting
이 됨.
• Python에서 PEP 8 준수를 위해 많은 linter들이 있지만
Go에서는 이미 built-in 기능인 gofmt가 끝판왕.