니름은 마이크로서비스를 위한 인터페이스 정의 언어(IDL) 컴파일러이자 원격 프로시저 호출(RPC) 프레임워크입니다. 스포카에서 서비스 지향 설계(SOA)를 적극적으로 도입하면서 쓰기에 적합하도록 구현되었습니다.
제품을 개선하기 위해서는 코드를 고쳐야 합니다. 그런데, 고친 코드가 행여 제품을 망가뜨리는 것이 아닐까 망설이고 고민할 때가 많습니다. 단위 테스트가 있다면 제품을 안전하고 빠르게 개선할 수 있습니다. 하지만 서비스 지향 설계로 제품을 만들다 보면 여러 개의 서비스들이 서로 통신하게 됩니다. 그리고 다른 서비스에 통신하는 기능도 단위 테스트를 작성해야 합니다.
서비스 간 단위 테스트는 까다로운 처리가 많이 필요합니다: 단위 테스트 안에서 요청을 흉내 내기, 실제 서비스를 띄워서 단위 테스트에서 테스트용 서비스에 요청하거나, 또는 요청과 응답을 흉내 내기, 요청한 내용을 역직렬화하고 응답할 내용을 직렬화 하기 등… 니름을 사용하여 서비스를 작성하면 서비스의 인터페이스와 구현을 분리할 수 있습니다.
요청이나 직렬화 등의 작업도 니름이 대신 처리하므로 추상화됩니다. 따라서 단위 테스트를 쉽게 작성할 수 있습니다. 서비스 지향 설계에서 니름을 사용하여 단위 테스트를 작성하면서 느낀 장점과 이것이 기존 방법들과 어떤 차이가 있는지 공유하고 싶습니다.
자바 개발자가 파이썬 개발을 배우면서 실무에 활용하고 집필을 하면서 겪었던 경험담 및 생각을 코드와 함께 풀어본다. 자바에 익숙한 사람이 파이썬을 배우고 있거나, 자바와 파이썬의 사이에서 고민을 했던 사람들에게 비교를 위한 기본 정보를 제공한다. 더 나아가 컴파일 언어와 스크립트 언어의 차이점, 개발 생산성을 측정할때 간과하는 컴파일 시간 및 순수 코딩 시간에 대한 통찰을 이끌 생각이다.
자바 개발자가 파이썬 개발을 배우면서 실무에 활용하고 집필을 하면서 겪었던 경험담 및 생각을 코드와 함께 풀어본다. 자바에 익숙한 사람이 파이썬을 배우고 있거나, 자바와 파이썬의 사이에서 고민을 했던 사람들에게 비교를 위한 기본 정보를 제공한다. 더 나아가 컴파일 언어와 스크립트 언어의 차이점, 개발 생산성을 측정할때 간과하는 컴파일 시간 및 순수 코딩 시간에 대한 통찰을 이끌 생각이다.
boost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
http://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
boost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
http://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용Susang Kim
도입
AI Chatbot 소개
Chatbot Ecosystem
Closed vs Open Domain
Rule Based vs AI
Chat IF Flow and Story Slot
AI기반의 학습을 위한 Data 구성 방법
Data를 구하는 법 / Train을 위한 Word Representation
Data의 구성 / Data Augmentation(Intent, NER)
자연어처리 위한 AI 적용 방안
Intent (Char-CNN) / QnA (Seq2Seq)
Named Entity Recognition (Bi-LSTM CRF) / Ontology (Graph DB)
Chatbot Service를 위한 Architecture 구성
Chatbot Architecture
NLP Architecture
Web Service Architecture
Bot builder / Chatbot API
Test Codes for Chatbot
실무에서 발생하는 문제와 해결 Tips
Ensemble and voting / Trigger / Synonym(N-Gram)
Tone Generator / Parallel processing / Response Speed
마무리
[설명 코드]
Text Augmentation / Slot Bot / QA Bot / Graph DB / Response Generator
nGrinder 소개 + 고급 사용법
- 아키텍쳐
- 자이선 / 그루비 스크립트 동작 방식
- DB 테스트
- 로그 레벨 조작 방법
- 리소스 처리 방법
- 라이브러리 처리 방법
- 대규모 응답 처리 방법
- 가중치 부여 방법
- 쓰레드별 다른 처리 방법
- XML / JSON 처리 방법
9. 함수를다른서비스로분리하기
payload = request.get_json()
if 'coord' not in payload:
raise ValueError()
if not isinstance(payload['coord'], dict):
raise ValueError()
...
응답에요청한값이존재하는지확인해야함
값이내가 원하는형식의값인지확인해야함
문자열, 정수, 시각(RFC 3339)
10. 역직렬화(Deserialize)
if 'lat' not in payload['coord']:
raise ValueError()
if not isinstance(payload['coord']['lat'], float):
raise ValueError()
if 'lng' not in payload['coord']:
raise ValueError()
if not isinstance(payload['coord']['lng'], float):
raise ValueError()
store_location(
Coord(lat=payload['coord']['lat'],
lng=payload['corordinate']['lng'])
)
17. 백엔드서비스
@app.route('/', methods=['GET'])
def store_location():
if 'lat' not in request.args:
raise BadRequest('`lat` is required.')
if 'lng' not in requst.args:
raise BadRequest('`lng` is required.')
try:
lat = float(request.args['lat'])
except ValueError:
raise BadRequest('`lat` expected to be `float`.')
...
역직렬화코드와알맞은형식이아닐때에러메시지를적어주는코드가 대부분임
18. 백엔드서비스(2)
...
rows = db.execute(
'''
SELECT name, lat, lng FROM store
WHERE earth_distance(
ll_to_earth(lat, lng),
ll_to_earth(:lat, :lng)
) <= 1.0
''',
lat=lat, lng=lng
)
return jsonify([
{'name': r[0], 'lat': r[1], 'lng': r[2]}
for r in rows
])
결과값을원하는형식으로맞추는작업이필요
20. 프론트엔드서비스(2)
if 'name' not in payload:
...
if 'closed' not in payload:
...
return render_template(
'stores.html',
name=payload['name'],
closed=payload['closed']
)
원하는형태로사용하기 위해형식검사
21. Back to the Slide 11
if 'lat' not in payload['coord']:
raise ValueError()
if not isinstance(payload['coord']['lat'], float):
raise ValueError()
...
역직렬화는지루하다
결국 class 없이프로그래밍하는것과 같음
22. Back to the Slide 11 (2)
서비스지향설계(SOA)에서는여러개의내부서비스가 통신하기 때문에, 다른외부서비스와통신하는
것과 다름없음
인터페이스정의언어(IDL)을사용하지않으면프로그램의절반은형식을검사하는코드
결국 class 없이프로그래밍하는것과 같음
서비스지향설계(SOA)에서는이렇게 코드를구현할수밖에없을까?
23. 니름RPC 사용하기
record store (
text name,
);
service store-service (
store location (coord coord),
);
서비스에필요한메서드의모양을정의함
컴파일하면서비스구현과 요청에필요한인터페이스가 만들어짐.