Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
*If you see the screen is not good condition, downloading please.*
MariaDB Optimization
- 풀 테이블 스캔
- ORDER BY 처리(Using filesort)
- GROUP BY 처리
- DISTINCT 처리
- 임시 테이블(Using Tempoary)
- 인덱스 컨디션 푸시다운(Index Condition Pushdown, ICP)
- 멀티 레인지 리드(Multi Range Read)
- 인덱스 머지(Index merge)
- 테이블 조인
- 서브 쿼리
.NET을 처음 접한 프로그래머가 P2P 네트워킹 기능을 구현하면서 마주쳤던 문제와 해결 방법등 개발 경험 전반에 걸쳐서 이야기 해 보려 합니다. 또한 C# 8.0에 추가되는 비동기 스트림을 미리 써볼 수 있는 AsyncEnumerable과 비동기 잠금(lock) 등의 편리한 기능을 갖춘 AsyncEx등의 라이브러리들도 소개합니다.
[25]안드로이드에서 코루틴은 어떻게 적용할 수 있을까?: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?NAVER Engineering
안드로이드에서 코루틴은 어떻게 적용할 수 있을까?
: 코루틴 적용 및 ReactiveX(RxJava/RxKotlin)와 비교한다면?
권태환
요기요 / 안드로이드 개발
6년차 안드로이드 개발자 권태환입니다. 저는 꿈 많은 개발자가되자라는 블로그를 운영하고있고 GDG Seoul의 운영진을 하고 있습니다. 현재는 RGP Korea에서 요기요앱을 개발하고있으며, 안드로이드 개발 패턴과 코틀린에 흥미를 가지고 실무에도 적용하고 있습니다.
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
네이버 오픈소스 세미나 - Performance does matter
2019.07.11
<세션 요약>
네이버 서비스에서 사내 서버리스 플랫폼까지 흘러가는 트랜잭션을 추적하고 분석하기 위해 개발한 Pinpoint의 Apache Openwhisk 플러그인과 그 개발 과정을 소개합니다.
Apache Openwhisk는 서버리스 플랫폼을 구축할 수 있는 오픈소스 프로젝트로 스칼라 언어와 Akka 라이브러리를 사용한 Actor 모델에 기반하고 있습니다. 스칼라 언어로 작성된 애플리케이션을 위한 Pinpoint 플러그인을 만들면서 겪었던 문제들과 해결했던 과정들을 위주로 설명드릴 예정입니다.
<연사 소개>
네이버에서 Serverless 플랫폼을 개발하고 있으며, 다양한 오픈소스 프로젝트에 관심이 많습니다.
Apache Openwhisk contributor로 활동하면서, Openwhisk 기반 서버리스 플랫폼의 트레이싱을 위한 Pinpoint 플러그인을 개발하고 컨트리뷰션을 진행하고 있습니다.
This document provides a summary of MongoDB update operations:
1. The $set, $unset, $inc, $push, $addToSet, $pop, $pull and $rename operators allow modifying documents in the MongoDB database without replacing the entire document.
2. The $ operator allows modifying sub-documents or array elements within a document. For example, the $inc operator can increment a field within an embedded document.
3. The findAndModify command provides an atomic find-and-update or find-and-remove operation that is useful for tasks like queue processing.
The document describes different data structures and algorithms for representing and traversing linked data structures in memory. It discusses singly linked lists, doubly linked lists, trees, and graphs. It presents pseudocode for algorithms to traverse nodes by (1) recursively exploring all links, (2) using a stack to iteratively explore links in depth-first order, and (3) using a circular buffer and pointers to explore links in breadth-first order.
This document discusses tree data structures and binary trees. It contains the following information:
- Binary trees are a type of tree data structure where each node has at most two children, described as left and right. Nodes without children are called leaves and nodes with children are branch nodes.
- The level of a node is the number of edges from that node to the root node. For example, the root node is at level 0.
- Two binary trees are equal if they have the same structure and corresponding nodes contain the same data.
- Examples of binary trees are given to illustrate tree structure and traversal algorithms like depth-first and breadth-first search. Notation for representing trees with parentheses is also
1) This document discusses calculating Fibonacci numbers using a closed-form formula and taking the limit as n approaches infinity. It derives the formulas Fn = φn/√5 and ln(φ1000/5) = 1000lnφ - ln5/2.
2) It then calculates the value of φ to high precision and uses the formulas to find the limit of Fn as n approaches infinity, which is approximately 209.
3) Additional comments provide context that this relates to efficiently calculating Fibonacci numbers using memoization and discuss applications in computer science.
The document discusses the differences between object-oriented programming (OOP) patterns and Gang of Four (GoF) design patterns. It provides examples of GoF patterns like Observer, Strategy, and Decorator and explains that GoF patterns are commonly used design patterns for object-oriented software design. The document encourages learning about GoF patterns to improve one's object-oriented programming skills.
1. 11장 윈도우 스레드 풀
12장 파이버
아꿈사(http://cafe.naver.com/architect1)
김홍준(twitter.com/jun0683)
2. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
3. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
4. 윈도우 스레드 풀이란?
스레드 생성, 파괴, 관리작업을 좀 더 쉽게구
현 할 수 있도록 제공(책에서는 비스타 이상)
어렵지 않아요~
5. 비동기 함수 호출(스레드)를 뙇!
VOID NTAPI SimpleCallback(
PTP_CALLBACK_INSTANCE 사용자 정의
pInstance,
PVOID pvContext
);
BOOL TrySubmitThreadpoolCallback(
PTP_SIMPLE_CALLBACK pfnCallback,사용자 정의 함수
작업 요청(비동기적으로)
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe
);
7. 명시적 작업 항목 제어
TrySubmitThreadpoolCallback 실패시
(메모리 부족,메모리 할당제한등..)
8. 명시적 작업 항목 제어
스레드 풀에서 작업 항목이 들어 가지
않는다면?
내부적으로 작업 항목을 새로 생성 한 후
작업 항목을 스레드 풀 큐에 넣음
=> 작업 항목 큐를 이용하자!
9. 명시적으로 작업 항목을 제어 하려면
1.작업 항목 만들고
2.큐에 넣고
VOID CALLBACK WorkCallback( 0.작업 할 콜백함수 구현
PTP_CALLBACK_INSTANCE Instance,
PVOID Context,
PTP_WORK Work);
PTP_WORK CreateThreadpoolWork(
PTP_WORK_CALLBACK 1.콜백 함수 원형 넣고
pfnWorkHandler, 작업 항목 만듦
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
VOID SubmitThreadpoolWork(PTP_WORK 2. 큐에 넣기
pWork);
10. 명시적 작업 항목 제어
삽입한 장업항목을 취소하거나
처리될때까지 특정 스레드를 대기상태
VOID WaitForThreadpoolWorkCallbacks(
PTP_WORK pWork,
BOOL bCancelPendingCallbacks);
True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기
False면 완전히 처리 될떄까지 대기
11. 명시적 작업 항목 제어
VOID CloseThreadpoolWork(PTP_WORK pwk);
작업 항목이 더 이상 필요 없다면
작업 항목 제거
13. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
14. 시간 간격을 두고 함수 호출(타이머)를 뙇!
VOID CALLBACK TimeoutCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext, 타이머 함수 원형
PTP_TIMER pTimer);
PTP_TIMER CreateThreadpoolTimer(
타이머 생성
PTP_TIMER_CALLBACK
pfnTimerCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe)
VOID SetThreadpoolTimer(
PTP_TIMER pTimer,
PFILETIME pftDueTime, 타이머 스레드 풀에 등록
DWORD msPeriod,
DWORD msWindowLength);
15. 시간 간격을 두고 함수 호출
콜백 함수가 정확한 시간에 호출
해주는 것 보다 스레드를 깨웠다가
다시 대기 상태로 만드는 비용을
줄이는 것이 중요
타이머를 한번 만들고 SetThreadpoolTimer()
을 이용해서 시간 조작
16. 시간 간격을 두고 함수 호출
VOID SetThreadpoolTimer(
PTP_TIMER pTimer,
PFILETIME pftDueTime,
DWORD msPeriod,
DWORD msWindowLength);
pftDueTime 을 NULL로 넣으면
타이머 호출 X
타이머 오브젝트를 파괴 하지 않고
타이머 정지 가능
17. 시간 간격을 두고 함수 호출
삽입한 타이머을 취소하거나
처리될때까지 특정 스레드를 대기상태
VOID WaitForThreadpoolTimerCallbacks(
PTP_WORK pWork,
BOOL bCancelPendingCallbacks);
True면 취소,처리중이라면 취소하지 않고 처리될때 까지 대기
False면 완전히 처리 될떄까지 대기
18. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
19. 커널 오브젝트가 시그널 되면 함수 호출
(이벤트)를 뙇!
VOID CALLBACK WaitCallback(
PTP_CALLBACK_INSTANCE pInstance, 시그널 대기 함수 원형
PVOID Context,
PTP_WAIT Wait,
TP_WAIT_RESULT WaitResult);
PTP_WAIT CreateThreadpoolWait(
PTP_WAIT_CALLBACK pfnWaitCallback, 시그널 대기 함수 생성
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject, 스레드 풀에 등록
PFILETIME pftTimeout);
20. 커널 오브젝트가 시그널 되면 함수 호출
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,
PFILETIME pftTimeout);
핸들 오브젝트를 사용
시그널 상태가 됬을 때 콜백 함수를 호출
21. 커널 오브젝트가 시그널 되면 함수 호출
내부적으로 스레드 풀은
WaitForMultipleObjects을 이용하기 때문
64개만 대기 가능
동일한 커널 오브젝트를 동시에 여러 번
사용이 안되므로 DuplicateHandle을 이용
복사된 핸들을 각각 등록
22. 커널 오브젝트가 시그널 되면 함수 호출
프로세스 커널 오브젝트는 한번 시그널이면
영원히 시그널 상태
SetThreadpoolWait 호출할때 다른 오브젝트
또는 Null값을 전달해서 해당 핸들을 제거
23. 커널 오브젝트가 시그널 되면 함수 호출
콜백 함수 내에서 WaitForThreadpoolWork
호출 하면 데드락
SetThreadpoolWait 매개 변수로 전달한
커널 오브젝트는 삭제 하면 안됨!
24. 커널 오브젝트가 시그널 되면 함수 호출
대기중인 커널 오브젝트에 대해
PulseEvent 같은 시그널 함수 호출도 안됨!
해당 이벤트가 호출한 시점에 대기 하고
있음을 보장을 못함!
25. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
26. 비동기 I/O 요청 완료되면 함수 호출(IOCP)
뙇!
10장에 대략적으로 다룸
어떤 함수를 호출 할지를 지정하기만
하면 됨
27. 비동기 I/O 요청 완료되면 함수 호출(IOCP)
VOID CALLBACK
OverlappedCompletionRoutine(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PVOID pOverlapped, I/O 작업 완료시 호출되는 함수 원형
ULONG IoResult,
ULONG_PTR NumberOfBytesTransferred,
PTP_IO pIo);
스레드 풀 I/O 오브젝트 생성
PTP_IO CreateThreadpoolIo(
HANDLE hDevice, 파일/장치 핸들값을 넣어줌
PTP_WIN32_IO_CALLBACK
pfnIoCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
28. 비동기 I/O 요청 완료되면 함수 호출(IOCP)
VOID StartThreadpoolIo(PTP_IO pio); I/O 오브젝트와 스레드 풀 연동
단,풀에 넣고 나서 READ/WRITE 할것
VOID CancelThreadpoolIo(PTP_IO pio); I/O 작업이 실패 하면 반드시 호출
VOID CloseThreadpoolIo(PTP_IO pio); 사용을 마치려면 …
I/O 오브젝트 닫기
29. 비동기 I/O 요청 완료되면 함수 호출(IOCP)
VOID WaitForThreadpoolIoCallbacks(
PTP_IO pio,
BOOL bCancelPendingCallbacks);
I/O 작업이 완료 될때까지 다른 스레드가 대기 시킴
True 면 시작 되지 않은 모든 요청을 취소
완료 통지도 발생 X
30. +@ 콜백 종료 동작
콜백 함수가 종료 될때 쓰면 유용
LeaveCriticalSectionWhenCallbackReturns
ReleaseMutexWhenCallbackReturns
ReleaseSemaphoreWhenCallbackReturns
SetEventWhenCallbackReturns
FreeLibraryWhenCallbackReturns
스레드 풀이 종료시 자동적으로 호출
31. 스레드 풀 커스터마이징 뙇!
스레드 풀에서 동작하는
스레드의 최소 최대 개수를 설정
OR
스레드 풀을 각각 독립적으로 생성,파괴
32. 스레드 풀 커스터마이징
PTP_POOL CreateThreadpool(PVOID reserved);
BOOL SetThreadpoolThreadMinimum(PTP_POOL pThreadPool,
DWORD cthrdMin);
BOOL SetThreadpoolThreadMaximum(PTP_POOL pThreadPool,
DWORD cthrdMost);
VOID CloseThreadpool(PTP_POOL pThreadPool);
기본 스레드 풀은 최소 스레드 1개 최대 500개를 가짐
33. 11장 윈도우 스레드 풀
- 비동기 함수 호출(스레드)
- 시간 간격을 두고 함수 호출(타이머)
- 커널 오브젝트가 시그널 되면 함수 호출(이벤트)
- 비동기 I/O 요청 완료되면 함수 호출(IOCP)
12장 파이버
34. 파이버라 쓰고 코루틴이라 읽는다…
코루틴은 마치 예전 OS의
비선점형(non-preemptive) 쓰레드와
비슷하게 동작
프로그래머가 강제로 컨텍스트 스위칭
명령을 줘야 스위칭
35. 파이버
기존 UNIX 프로그램을 포팅하기 위해서…
윈도우는 그냥 스레드 쓰면 됨….
유저모드에서 돌아서 가볍다
스케줄링을 직접 해야 함
36. 파이버 함수 사용
ConvertThreadToFiber
PVOID ConvertThreadToFiberEx(
PVOID pvParam,
DWORD dwFlags);
기존 스레드를 파이버로 변경
파이버 단위에는 부동소수점 상태 정보를 포함하지 않으므로
플래그에 FIBER_FLAG_FLOAT_SWITCH를 넣어줌
37. 파이버 함수 사용
VOID WINAPI FiberFunc(PVOID pvParam); 파이버 함수 원형
PVOID CreateFiberEx(
SIZE_T dwStackCommitSize,
SIZE_T dwStackReserveSize,
DWORD dwFlags,
PFIBER_START_ROUTINE pStartAddress,
PVOID pvParam);
새로운 파이버를 생성
리턴 받은 컨텍스트 정보를 저장 해두고 사용
38. 파이버 함수 사용
VOID SwitchToFiber(PVOID pvFiberExecutionContext);
바이퍼 간 스위칭
컨텍스트 정보를 이용해서 스위칭을 함
PVOID GetCurrentFiber(); 현재 컨텍스트 주소를 얻어옴