[GN#92] 150줄의 파이썬 코드로 Full-Text 검색엔진 만들기

2021-04-05 ~ 2021-04-11 사이의 주요 뉴스들
요즘 서비스에서 검색은 정말 중요한 기능입니다. 핵심 기능이다 보니 Lucene, Elasticsearch 같은 다양한 오픈소스들이 만들어졌고, 클라우드 기반에서 편하게 사용할 수 있는 Amazon CloudSearch 나 Algolia 같은 SaaS 들도 나오고 있죠. 이런 검색엔진은 아주 처음엔 어떻게 만들어질까에 대한 기초를 설명한 "150줄의 파이썬 코드로 Full-Text 검색엔진 만들기"가 이번 주에 가장 큰 인기를 끌었습니다. 물론 한글 검색에서는 약간 달라집니다만 기초부터 알아두기에 좋은 글인 것 같아요. 추가로 이렇게 만들어진 검색 알고리즘들의 비교 및 평가는 어떻게 하는지를 설명한 Shopify의 "똘똘한 검색 알고리즘을 만들기 위한 평가 방법" 글도 같이 보시기 바랍니다.

Security & Privacy는 미래 기술을 얘기할 때 빠지지 않고 나오는 주제입니다. 네트워크상의 다양한 장비를 Secure한 네트워크로 묶어주는 다양한 솔루션이 있습니다만, 요즘은 개인이 사용하는 장비들까지도 쉽게 VPN으로 설정해주는 도구들도 인기를 끌고 있어요. tailscale 은 Zero Config VPN 이라는 설명에 걸맞게, 별도의 설정 할 필요 없이 클라이언트 설치만으로 집의 컴퓨터, 노트북, 모바일 기기, 내가 운영 & 접근하는 서버를 보안된 네트워크로 묶어 주는 도구입니다. 복잡한 방화벽 설정이나 NAT, Subnet 같은 것들은 전혀 신경 쓰지 않아도 되어서 정말 간편히 사용이 가능한데요. 개인에게는 100대의 기기까지 무료이고, 팀 단위 사용부터 유료인데 한번 써보면 그냥 팀내 또는 회사에 유료로 도입하고 싶을 만큼 편리합니다.


✓ 사내에서 슬랙을 쓰신다면 뉴스채널에 GeekNews SlackBot 을 추가하여 편하게 새 글을 받아보시고, 멤버들에게도 공유해주세요.
✓ 주위분들께 긱뉴스 위클리 - https://news.hada.io/weekly 를 추천해 주세요.
Twitter , Facebook 에서도 긱뉴스를 받아 보실 수 있습니다.

매주 월요일 아침, 지난 일주일간의 GeekNews 중 엄선한 뉴스들을 이메일로 보내드립니다.


150줄의 파이썬 코드로 Full-Text 검색엔진 만들기

영어 위키피디아 제목+요약 전체 데이터를 가지고, 특별한 기술이 아닌 검색엔진의 기초를 차근차근 설명한 글
1. Abstract 개체를 만들어서 데이터 준비
2. Index 생성 : Token화 및 필터링
ㅤ→ 소문자
ㅤ→ 어간 추출(Stemming)
ㅤ→ 영어에서 가장 많이 쓰이는 25개 단어 제외(the,be,to,of,a..)
3. 기본 검색 만들기
4. 연관도 기능 추가 : Term Frequency(요약문에서 해당 단어가 얼마나 많이 쓰였나)
5. Inverse Document Frequency 추가 : 이 문서에 연결된 다른 문서들의 수

코드 : https://github.com/bartdegoede/python-searchengine

한글 초성 검색도 지원하는 퍼지 문자열 검색 https://news.hada.io/topic?id=3631
이 글과 기술적 기반이나 구현은 전혀 다르지만, 기초적인 부분을 단계별로 자세히 설명한 글이라 재미나게 읽었습니다.

이런 전문검색/토픽 모델링/도큐먼트 인덱싱/유사도 관련한 기능을 좀 더 본격적으로 구현한 파이썬 라이브러리들은 여러 개 있습니다.
- Whoosh : https://pypi.org/project/Whoosh/
- GenSim : https://github.com/RaRe-Technologies/gensim

SQLite 는 Full-Text-Search 확장이 따로 있습니다.
- SQLite FTS5 Extension : https://www.sqlite.org/fts5.html

 
똘똘한 검색 알고리즘을 만들기 위한 평가 방법

- Shopify가 상품검색에 이용했던 알고리즘을 전환하면서 정말 검색 결과가 좋아졌는지를 평가한 방법
ㅤ→ 기존 Vanilla PageRank : 검색에 기반한 PV로 순위 계산
ㅤ→ 신규 Query-specific PageRank : 검색어에 대한 클릭 히스토리 기반으로 가중치 계산

- 3단계로 평가
ㅤ1. 데이터 수집 : Kafka 이벤트와 Annotated 데이터 셋
ㅤ2. 오프라인 지표 평가 : 기존 검색 쿼리를 가지고 새 알고리즘을 평가
ㅤㅤ→ Mean Average Precision(MAP) : 쿼리가 반환하는 상위 N개의 결과에 관련없는 문서들이 포함될 경우 페널티를 부여
ㅤㅤ→ Normalized Discounted Cumulative Gain(NDCG) : MAP 계산을 위한 컷오프 점수를 계산, 좋은 점수(Great/Good) 아이템의 순서가 낮을경우 페널티를 부여
ㅤ3. 온라인 지표 평가 : 서치 로그를 이용해서 실제 검색이 어떻게 동작하는지 평가
ㅤㅤ→ 성공을 결정하는 지표 : 사용자가 얼마나 자주 검색을 하고, 원하는 결과를 찾기위해 얼나마 스크롤하고, 문제 해결을 위해 지원팀에 연락하는지 등
ㅤㅤㅤ→ Click-through rate (CTR): 검색결과 클릭율. 높아야 좋음
ㅤㅤㅤ→ Average rank: 클릭한 결과의 평균 순위. 낮아야 좋음
ㅤㅤㅤ→ Abandonment: 원하는 결과를 찾지 못한 포기율, 물론 봇/스팸 등의 영향도 있긴 하지만, 적당히 낮으면 좋음
ㅤㅤ→ Kafka 를 이용해서 수집
ㅤㅤ→ 기존 방식과 A/B 테스트 진행
- 결과적으로 새 검색 알고리즘이 기존 방식을 상회해서 대체를 진행

- 키포인트
ㅤ→ 고품질의 신뢰할수 있는 레이블된 데이터셋이 평가의 핵심
ㅤ→ 온라인 지표들은 사용자 행동에 대한 훌륭한 인사이트를 제공
ㅤ→ 오프라인 지표들은 새로운 알고리즘을 빠르게 반복 테스트하고 위험을 줄이는 걸 도와줌

 
TailScale - 설정 필요없는 VPN 솔루션

- 사용중인 여러 디바이스에 설치하는 것만으로 Secure Network을 생성해주는 도구
ㅤ→ 클라우드,방화벽,서브넷 상관없이 알아서 동작
- 리눅스,맥,윈도우,iOS,Android,Raspberry Pi,ARM
- 개인은 무료 (100개의 기기까지)
- 구글,MS,Okta의 SSO/MFA를 이용
- 항상 같은 IP와 자동 지정된 도메인이 부여
- Role 기반 접근 제어 및 모니터링 대시보드, 로깅 API
- Friends & Family 공유기능 으로 다른 사용자에게 내 네트웍 접근 허용 가능(무료버전에도 포함)

자신만의 보안 네트웍 생성에는 TailScale이 지원하는 클라이언트가 많아서 가장 편리합니다.
클로즈드 소스지만 개인한테는 무료로 사용이 가능하구요.

오픈소스 에서는 tinc 를 사용하시면 됩니다.
- tinc - 오픈소스 P2P VPN 데몬 https://news.hada.io/topic?id=4013

tinc 소개 뉴스에도 댓글 달았지만,
저는 TailScale 을 잘 쓰고 있어요. 오픈소스는 아니지만 개인용으로는 무료라서. 윈/맥/아이폰/아이패드 잘 연결해서 쓰고 있습니다.
확실히 이런 솔루션이 google remote desktop 이나 jump desktop 같이 서버 경유해서 동작하는 것보다 빠르더라고요. 서버경유없이 바로 RDP 연결이 되는 식이라서요.
추가로, 자동 배정되는 IP 가 기기마다 항상 유지되기 때문에 개인 도메인 가지고 있으면 DNS 서버에 등록해서 써도 되어서 편합니다.

저는 https://www.zerotier.com/ 를 더 많이 썼는데 tailscale이 속도가 더 좋은거 같네요..

 
Cheetah-Grid - 초고속 데이터 테이블 오픈소스

- 백만개의 레코드 생성에 30ms 이하 (M1 맥북 기준)
- Vanilla JS / Vue.js 용 API 지원
- 멀티 헤더
- 컬럼 타입 : 숫자, 체크, 메뉴, 버튼, 이미지, 퍼센트바, 아이콘, 멀티라인, 브랜치 그래프, 라디오
- 컬럼 액션 : 버튼, 체크, 대화창 입력, 인라인 입력, 인라인 메뉴..
- 데이터 입력 : Array 또는 DataSource, Promise 지원, 데이터 필터링 가능
- 테마 지원

세계에서 가장 빠른 데이터 테이블 오픈소스라고 주장 하네요. 데모 보면 빨라보이긴 합니다.
- 데모 페이지 https://future-architect.github.io/cheetah-grid/#/

 
온라인 익명성을 위한 가이드

- 온라인에서의 트래킹 테크닉에 대한 정보들을 정리, 진정한 익명성을 추구할수 있도록 도와주는 가이드
- HTML 및 181 페이지 PDF로 제공
내용
- 공개되는 내 정보들 : IP, DNS요청, IMEI, MAC주소, 위치정보, RFID, 워터마크, Tor, 클라우드 계정, 핑거프린트..
- 익명을 보장하는 방법들 : 비용에 따른 다양한 방법들을 소개
ㅤ→ Zero Trust Security 구축하기
ㅤ→ 전용 랩탑을 이용해서 나만의 OS환경을 구축하거나, USB로 부팅하는 TAILS(The Amnesic Incognito Live System)를 이용
ㅤ→ 온라인 익명 ID 만드는 방법
- 트래킹 차단하기 : HDD에 기록 지우기, 검색엔진 기록 지우기..

TAILS 에 대한 설명은 아래 글을 참고 하세요
- HiddenVM - 흔적을 남기지 않고 데스크탑 OS 사용하기 https://news.hada.io/topic?id=1655

 
Python 패키지를 만드는 법 2021

- 간단한 파이썬 유틸리티를 만들어서 공유할 때 패키지로 만드는 법을 차근 차근 설명
1. 기능 작성
2. flit 을 이용해 기본 패키지 형태를 작성하고 TestPyPI 에 등록해서 테스트
3. flit 로 PyPI 에 실제 등록
4. README 와 CHANGELOG 추가
5. tox 로 포매팅(black), 테스트 커버리지(coverage), 코드 퀄리티(flake8, pylint, mccabe), 정적 분석(mypy), 등 적용하기
6. GitHub Actions 로 자동 빌드 설정하고, 커밋할 때 마다 Codecov로 커버리지 & Clode Climate 로 코드 품질 테스트
7. make 로 pylint, coverage 등만 빠르게 실행하게 만들기
8. GitHub Actions 에 flit 로 자동 publish 적용

https://news.ycombinator.com/item?id=26733423
HN에서는 더 간단히 하려면 setup.py 작성하고 twine 패키지 이용하라는 댓글이 1등이더군요.

 
C 프로그래밍 언어 (C언어의 문제점)

- 메모리 문제: GC, 정적 분석 등 어떤 도구의 도움을 받지 않음.

- 미정의 동작: 저수준 환경 위주로 쓰이게 되며 최적화의 요구가 많았고 최적화를 위해 미정의 동작이 늘어남. 저수준 성능과 이식성의 두마리 토끼를 잡지 못함.

- 대규모 프로그래밍에 부적합: 모듈, 패키지 관리자의 부재. #pragma once 등의 널리쓰이는 것도 표준이 없음.

 
구글 vs 오라클, 자바 SE API사용은 공정했다고 구글이 최종 승리

- 미국 연방 대법원 최종 판결문
- 6:2 로 구글이 승소
- 자바 API의 저작권은 인정하지만, 구글이 안드로이드에 자바 API를 사용한것은 '공정 이용(fair use)'에 해당
ㅤ→ 새 플랫폼을 만들면서 자바 API일부를 사용한 것은, 저작권 자체의 기본 목적인 '창의적인 진보(creative progress)'에 해당
- 2010년에 오라클의 제소로 시작된 세기의 저작권 소송이 10년만에 마무리

 
[동영상] 45분만에 보는 현대 CPU 아키텍쳐 정리

인텔에서 현대 CPU 아키텍쳐의 각종 요소와 개념에 대해 간략히 짚어주는 2부작 영상을 유튜브에 올렸습니다. (영어) 2부를 모두 합쳐 대략 45분 정도의 분량으로, 컴퓨터공학과 대학생이 듣는 전공 강의의 오리엔테이션 수준이 아닐까 합니다.

1부: https://www.youtube.com/watch?v=vgPFzblBh7w
1부에서는 다음과 같은 내용을 다룹니다.

* CPU란 무엇인가?
* 간략한 CPU의 역사(인텔 중심으로)
* 컴퓨터의 추상화 계층
* ISA(명령어 집합 아키텍쳐)의 개념

2부: https://www.youtube.com/watch?v=o_WXTRS2qTY
2부에서는 다음과 같은 내용을 다룹니다. ISA의 구현체인 마이크로아키텍쳐에 관한 내용으로, 1부보다 조금 더 심화된 내용이 나옵니다.

* 마이크로아키텍쳐의 개념
* [인출 ▶ 해독 ▶ 실행 ▶ 기록]의 4단계 명령 주기와 CPU에서의 프론트엔드/백엔드 구분
* 파이프라인 및 CPU 클럭 속도
* 분기 예측에 의한 추측 실행
* 메모리와의 속도 차이를 줄이기 위한 캐시
* CPU 내부에서 사용하는 μops(Micro-operations)의 개념
* 슈퍼스칼라(Superscalar)에 의한 ILP(명령어 수준 병렬성) 구현
* 비순차적 실행(Out-of-Order Execution)과 그 구현을 위한 여러 구성요소
* 이 모든 요소들의 결합에 의한 현대 CPU의 작동 과정

 
구글 Wuffs - 안전하게 파일포맷을 다루기 위한 개발언어

- 신뢰할수 없는 파일포맷등을 다룰때 사용하는 memory-safe한 프로그래밍 언어이면서 표준 라이브러리
- Wrangling Untrusted File Formats Safely
ㅤ→ Wrangling은 파싱, 디코딩, 인코딩등을 포함
- 이미지, 오디오, 비디오, 폰트 및 압축 파일 포맷 지원
- C만큼 빠르지만, Go/Rust 수준의 안전한 소프트웨어 라이브러리를 만드는 것이 목표
- C로 트랜스파일된 코드를 제공해서, 기존 C/C++ 프로젝트에 그대로 사용 가능
- 범용 프로그래밍 언어는 아니며, 프로그램이 아닌 라이브러리를 개발하기 위한 언어
ㅤ→ 즉 프로그램 전체 보다는 성능/보안이 중요한 부분만 Wuffs 로 작성
- GIF 디코딩 벤치마크에서 gitlib(C) 보다 2배, image/gif(Go) 보다 3배, gif(Rust) 보다 7배 빠름

 
OpenJDK의 Microsoft 빌드 발표

OpenJDK의 Microsoft 빌드 버전으로 무료로 사용가능

* LTS 배포판은 OpenJDK 11.0.10+9 기반의 Java 11로 macOS, Linux, Windows 지원
* early access버전은 OpenJDK 16+36 기반의 Java 16

Java 11 LTS는 MS에서 2024년까지 지원

올해 말에 Java 17 버전로 릴리스 할 예정

https://devblogs.microsoft.com/java/…

MS OpenJDK 페이지: https://www.microsoft.com/openjdk

 
Spearmint - 코드 작성 필요없는 UI 테스트 개발 툴

- React/Redux 및 Hook/Puppeteer/Endpoint/Accessibility 등의 테스트 작성
- UI를 이용해서 클릭만으로 테스트를 만들고 Jest/Supertest/Puppeteer/Ace-core 테스트로 저장
- 맥/윈도우용 실행파일 제공
- 쉬운 테스트 작성 지원 : 자동완성, 드롭다운, 툴팁

 
아이폰에서 갤럭시 경험하기 - iTest

- 아이폰에서 삼성 갤럭시의 UI를 경험할 수 있는 PWA 공개
- Safari에서 접속 후 홈 화면에 추가해서 사용
- 전화, 메시지, 카메라 등 기본 앱과 삼성 앱 체험 기능
- 네비게이션 바, 알림 센터, 알림음 등을 재현

 
GitHub 프라이빗 페이지 버그 바운티로 35,000달러 벌기

고3 학생이 Covid로 시간이 남자 버그 바운티 사냥을 해서 GitHub의 pirvate 페이지의 버그바운티로 35,000달러는 받은 이야기.

GitHub의 pirvate 페이지의 버그 바운티로 보고했고 두가지 CTF 보너스가 있었다.

* 10,000달러: 사용자 인터랙션 없이 `flag.private-org.github.io` 에서 플래그를 읽는다. `private-org` 조직 밖에 있는 계정에서 이 플래그를 읽을 수 있으면 5천 달러의 추가 버너스가 있다.
* 5,000달러: 사용자 인터랙션을 통해 `flag.private-org.github.io`에서 플래그를 읽는다.

# 인증 흐름
GitHub pages는 별도의 도메인 `github.io`으로 호스팅되므로 `github.com`의 인증 쿠키는 private pages 서버로 보내지지 않는다. 그러므로 private 페이지 인증은 `github.com`과 추가적인 통합 없이는 사용자의 신원을 알아낼 수 없다. 그러므로 GitHub은 커스텀 인증 흐름을 만들었다.

* private 페이지에 방문했을 때 서버는 `__Host-gh_pages_token` 쿠키의 존재를 검사한다.
* 쿠키가 없거나 올바르지 않으면 private page 서버는 `https://github.com/login`으로 리다이렉트 할 것이다.
* 이 다이렉트는 `__Host-gh_pages_session` 쿠키에 nonce도 설정한다.
* 이 쿠키는 __Host- 쿠키 접두사를 사용하므로 호스트 도메인이 아닌 곳에서 JavaScript로 설정하는 것을 막는다.
* `/login` 은 `/pages/auth?nonce=&page_id=&path=`로 리다이렉트한다.
* 여기서는 `token` 파라미터에서 `https://pages-auth.github.com/redirect`로 전달하는 임시 인증 쿠키를 생성한다.
* `/redirect`는 `https://repo.org.github.io/__/auth`로 포워드한다.
* 이 최종 엔드포인트는 `repo.org.github.io` 도메인에서 인증 쿠키인 `__Host-gh_pages_token`와 `__Host-gh_pages_id`를 설정한다.
* 여기서 이전에 설정한 `__Host-gh_pages_session`의 `nonce`도 검사한다.

오리지널 요청 경로와 페이지 ID는 쿼리 파라미터 `path`, `page_id`에 각각 저장되고 nonce도 `nonce` 파라미터에 저장된다.

# 악용

## CRLF 반환
* 첫 취약점은 `https://repo.org.github.io/__/auth`의 `page_id` 파라미터에서 CRLF 주입이었다.
* `page_id` 파싱이 공백문자를 무시하고 이 값이 `Set-Cookie` 헤더로 바로 설정된다는 것을 알게 되었다.
* 전통적인 CRLF 주입으로 파싱을 깨뜨릴 수는 있지만 다른 영향은 없다.
* `Location:` 헤더가 `Set-Cookie` 헤더 뒤에 붙기 때문에 302 리다이렉트 임에도 Location 헤더가 무시되고 본문이 렌더링된다.

## 공격
* GitHub 엔터프라이즈 코드를 보고 private page 서버가 openresty nginx로 구현되었다는 것을 알게 되었다.
* null 바이트를 추가해서 XSS를 성공했다. 이 null byte는 바디의 시작에 와야하므로 header 주입 공격은 할 수 없다.
* 여기서 private page 도메인에서 임의의 JavaScript 코드를 실행할 수 있게 되었다.
* 이제 남은건 nonce를 건너뛸 방법을 방법을 찾아야 한다.

## nonce 건너뛰기

* 관찰결과 같은 조직의 sibling private 페이지는 서로간에 쿠키를 설정할 수 있다는 것을 발견함.
* `private-org.github.io`에서 설정된 쿠키는 `private-page.private-org.github.io`로 전달된다.
* `__Host-` 접두사 보호를 피할 수 있으면 nonce를 쉽게 건너띌 수 있다.
* 모든 브라우저가 이를 지원하는 건 아니고 IE는 `__Host-` 접두사를 지원하지 않는다.
* 하지만 더 좋은 방법을 찾아보다가 재밌는 아이디어가 생각났다.
* 쿠키가 대소문자를 어떻게 처리하는지 확인해 본 결과 `__HOST`와 `__Host`를 다르게 다루는 것을 알게 되었고 GitHub private pages는 쿠키를 파싱할 때 대문자를 무시한다는 것을 알게 되었다.
* JavaScript로 nonce를 지정할 수 있게 되었다.
* 5천 달러의 보너스를 받게 되었다.

## 캐시 오염
* `/__/auth?` 엔드포인트의 응답은 피싱된 `page_id`의 정수 값으로 캐시된다.
* 이를 통해 XSS 페이로드를 통해서 캐시 오염에 성공하면 상호작용하지 않은 사용자도 영향을 받는다.
* 공격자가 `unprivileged.org.github.io`를 공격해서 인증을 오염시키면 XSS 페이로드가 캐시된다.
* 쿠키가 부모 도메인인 `org.github.io`에서 공유되므로 공격자는 `privileged.org.github.io`도 공격할 수 있다.

## 퍼블릭 private 페이지
* 15,000 달러의 보너스를 받고자 조직에 속하지 않는 사용자가 이 공격을 하도록 해야 했다.
* public 저장소에서 private 페이지를 설정하는 잘못된 설정으로 이 공격을 할 수 있었다.
* private 레포에서 페이지를 마든 뒤에 저장소를 public으로 바꾸는 것을 말한다.
* 이 잘못된 설정의 private 페이지는 모든 사용자에게 인증 흐름을 타게되고 조직 밖의 사용자가 읽기 권한을 갖게 한다.

 
Ory - 오픈소스 Identity 플랫폼

여러개의 오픈소스 프로젝트로 계정/권한/로그인 등을 통합 관리 가능
- Hydra : OAuth 2.0 과 OpenID Connect 서버
- Keto : 롤,권한,퍼미션 관리, 구글 글로벌 권한 시스템인 Zanzibar의 오픈소스 구현체
- Kratos : 클라우드 기반 사용자 관리 시스템. 사용자 등록/로그인/MFA 등을 몇줄의 코드로 구현
- Oathkeeper : BeyondCorp/Zero Trust Identity and Access Proxy(IAP), 모든 HTTP Request에 대한 인증/권한 관리

* 모두 Go 기반 오픈소스

Zanzibar - 구글의 Consistent 글로벌 권한 시스템 https://news.hada.io/topic?id=171

 
PM2 WebUI - PM2 Plus의 오픈소스 대체제

- Node.js 용 프로세스 매니저 PM2의 유료 Tier인 PM2 Plus를 오픈소스로 구현해서 웹 UI를 제공
ㅤ→ PM2 오픈소스는 웹 UI 없이 터미널 기반 모니터링만 제공
- Secure Login, App Management, Log Viewer 및 반응형 UI 제공

PM2 ( https://pm2.io/ ) 설명은 아래 글을 참고하세요
- PM2를 활용한 Node.js 무중단 서비스하기 https://engineering.linecorp.com/ko/blog/pm2-nodejs/

 
Kallithea - 오픈소스 GitHub 대체제

- Git 과 Mercurial 지원
- 사용자/관리자용 쉬운 웹 인터페이스 제공
- LDAP 및 JSON-RPC API 로 기존 시스템과 연동 가능
- 원클릭 Fork 및 코드 리뷰, PR 시스템 내장
- 웹 에디터로 온라인에서 코드 편집 및 커밋 가능
- DAG 그래프를 이용한 체인지로그 시각화 지원

 
MS, 서버를 냉각하기 위해 액체에 담그기 시작

- 특수한 비전도성 액체를 사용하여 욕조 같이 생긴 곳에 서버랙을 담그는 방식
ㅤ→ 불화 탄소(탄화 플루오르, fluorocarbon)
ㅤ→ 직접 닿아서 냉각하며, 끓는점이 섭씨 50도여서 끓어오른뒤 다시 비오듯이 욕조에 떨어지는 폐쇄루프 냉각 시스템
- 대부분의 데이터센터는 외부공기를 증발시켜서 사용하는 공냉식이지만, 그 과정에서 물을 많이 사용
ㅤ→ 물 사용량을 줄이기 위해 개발되었으며, 물 사용량을 제로화 하는 것이 목표 ㅤ→ 암호화폐 채굴자들한테 배웠다고..

 
Kara Swisher의 Tim Cook 인터뷰

- Sway 에서 진행한 35분 인터뷰 팟캐스트, 트랜스크립트 제공
팀 쿡의 주요 발언 요약 번역
- 프라이버시(Privacy)는 21세기의 주요 이슈 중 하나, 우리는 위기에 처해 있다고 생각함
- 몇년전에는 기업이 스스로를 규제하고 나아질거라고 생각했지만, 난 이제 더 이상 그걸 믿지 않음
- 내가 하는 모든 것들을 누군가 다 볼 수 있는, 그런 감시가 만연한 세상에서는 사람들은 점점 생각하고 표현하고 하는 것들을 줄일 수 밖에 없고, 난 그런 사회의 일부가 되고 싶지 않음.
- 프라이버시는 기본적인 인권이고, 다른 권리들이 그 권리위에 만들어 지게됨. 핵심(core) 이고 기반(bedrock)
- ATT(App Tracking Transparency)는 몇주 내에 출시 될 것
ㅤ→ "당신을 추적하는 것을 허용할까요?" 라는 팝업이 뜨고 그 대답에 따라 트래킹이 켜지고 꺼지게 됨
- 우리는 매년 프라이버시 기능을 추가해 왔고, 특정 회사를 겨냥한 것이 아님 원칙을 목표로 하는 것
ㅤ→ 원칙 : "데이터를 가진 개인이 추적 여부에 대한 통제권을 가져야 한다는 것"
- 이 추적 여부 선택권에 대해서 논쟁/반발(Pushback)이 있다는 것에 적잖이 놀랐음
ㅤ→ 추적되고 있다는 걸 모르는 사람들을 추적하지 않고도 디지털 광고를 하고, 그를 통해 수익을 올릴 수 있다고 생각함
ㅤ→ 시간이 그것을 증명할 것
- 앱스토어를 통한 결제 통제권을 가지는 이유는, 스토어에 대한 신뢰와 확신이 없으면 그곳에 와서 물건을 사지 않을것 이기 때문. 누군가는 큐레이팅을 해야함
ㅤ→ 사이드 로딩을 하면 프라이버시와 보안모델을 깨뜨리게 됨
- 미래에 대해 얘기하는 걸 금지하는 규칙이 있음. 하지만 AR 과 AI에 대해서는 매우 흥분됨(Excited)
ㅤ→ 휴대폰을 이용한 AR이 이미 확산되고 있고, 미래에는 더 커질 것
- Apple TV+에 대해서는 진지한 투자를 하고 있음
ㅤ→ (넷플릭스와 왜 경쟁하는 가 하는 질문에 대해) 제로섬 게임이라고 생각하지 않음
- 자율 주행 스타트업인 Drive AI를 인수하고, 자율 주행차를 테스트 하고 있냐는 질문에 대해
ㅤ→ 엘론 머스크와 얘기해본 적은 없지만 그가 만든 회사에 대한 존경심을 가지고 있음
ㅤ→ 테슬라는 선구자 로서 뿐만 아니라 전기차 분야에서 오랜시간 선두를 지키는 믿기 힘든 일을 해냈다고 생각
ㅤ→ 우리가 그 분야에서 하는 일들은 그에 비하면 약간 수줍은 수준
ㅤ→ 내 생각엔 자율성(Autonomy)이 핵심 기술임
ㅤ→ 한발뒤로 물러나서 보면, 자동차는 여러면에서 Robot이고, 자율주행차는 로봇임.
ㅤ→ 그러면 자율성으로 할수 있는 일이 많고, 여기서 애플이 하는 일을 보게 될 것.
ㅤ→ 내부에서 많은 것을 조사하고, 그들중 많은 것들은 빛을 보지 못하기도 함. 하지 않겠다 얘기하는 것은 아님.
ㅤ→ (자동차의 형태일까요? 아니면 자동차 내부의 기술일까요?) 라는 질문에는 답변하지 않음

"우리는 하드웨어,소프트웨어 및 서비스를 통합하고 그들의 교차점을 찾는 것을 좋아합니다. 그곳이 마법이 일어나는 곳이라고 생각하기 때문입니다. 이게 우리가 좋아하는 일이고, 우리는 그 주변의 주요 기술들을 소유하는 것을 좋아합니다."

돌려 말하긴 했지만, 자율 주행에 대해서 뭔가를 하고 있다는 건 확실하고..
하드웨어와 소프트웨어 통합해서 언젠가는 애플의 전기차를 볼수 있을 것 같네요.
아마도 처음으로 애플이 이에 대해서 의향을 내비친 인터뷰라고 봅니다.

AR 역시도, 올 6월 WWDC에서 애플 글라스 발표가 있지 않을까 기대해 보게 되네요.

 
MapLibre GL - MapboxGL JS의 오픈소스 포크

- 2.0버전부터 BSD 라이센스를 버린 mapbox-gl-js 을 무료/오픈소스로 사용할 수 있게 포크한 버전
- mapbox-gl 을 직접 사용중인 경우 package.json 에서 대체하는 것 만으로 바로 적용 가능
ㅤ→ React, Vue 등의 바인딩을 이용하는 경우, 쉬운 마이그레이션이 나올때까지 조금 기다려야 함
- 지속적으로 일관성,하위 호환성 유지 및 버그 수정/유지보수를 목표로 함
- mapbox-gl 을 사용중인 다른 오픈소스들에게도 참여를 독려

- mapbox-gl-js는 더이상 3조항 BSD 라이센스가 아닙니다 https://news.hada.io/topic?id=3377
- 오픈 소스 비즈니스 모델의 죽음 https://news.hada.io/topic?id=3378

 
Docker Without Docker

- Fly 서비스의 기반 기술 소개
ㅤ→ 앱서버를 사용자 근처의 피지컬 서버에 두어서 속도를 빠르게 하는 anti-클라우드 스타일의 서비스
ㅤ→ Docker 이미지를 가져와서 Firecracker micro-VM으로 변환(transmogrify) 해서 베어메탈에서 실행
ㅤ→ 도커이미지만 준비하면 사용자 근처의 Edge서버에서 실행해서 빠른 속도를 보장
- OCI 이미지(실제론 그냥 tarball)와 manifest를 직접 다운
- 자신들의 Docker Registry 를 호스팅 : 사용자가 OCI이미지를 업로드(flyctl)

Fly를 만든 두가지 아이디어
- Docker 이미지를 엣지서버에서 실행
- BGP4 Anycast 를 이용한 CDN (이 부분은 차후 공개한다고)

BGP는 안전한가요? https://news.hada.io/topic?id=1932

Fly.io 는 Y Combinator W20 배치 스타트업입니다.

https://www.ycombinator.com/companies/fly-io

 
AWS의 ARM칩 Graviton2 사용 1주년 회고

- Honeycomb이 도입하고 바로 가격-성능비 30% 증가
- Go 코드베이스여서 코드 변경 거의 없이 CI 파이프라인 변경만으로 가능했음
- m6g 와 c6g 인스턴스가 출시되면서 c5 대비 40% 이상 비용을 절감
- 현재 92%의 vCPU가 ARM64 기반
- 프로덕션이 ARM64로 배포되었기 때문에 개발팀 로컬테스트에 M1 맥으로 전환도 쉬웠음
- Graviton2를 꼭 써보길 추천

 
Have i been pwned? - 내 정보가 유출되었는지 확인해보기

- 현재까지 유출된 모든 사례들을 묶어서, 내 이메일 정보 및 암호가 유출에 포함되었는지 확인해 보는 서비스
ㅤ→ 521개 웹사이트, 106억개의 계정, 6억개의 암호, 2억개의 Pastes(Pastebin 같은 곳에 데이터가 게시되는 것)
- API로 이용 가능하며, 이메일 주소 등록해서 유출시 알림 받을수 있음
- 보안 전문가 Troy Hunt가 운영

최근에 유출된 페이스북 계정들도 포함 되었습니다.
- 페이스북 계정 5.3억개의 전화번호 및 개인정보 유출 https://news.hada.io/topic?id=4006
유출 내용은 5.3억개지만, 이메일 주소가 있는 계정은 250만개 밖에 없어서 그것만 등록 되었습니다.

 
카나리 테스트와 함께하는 안전한 서버 배포

- 타다를 운영하는 VCNC의 김태호님이 작성한 쿠버네티스 환경에서의 카나리 배포 경험담.

- 카나리 배포는 탄광에서 광부들이 가수 누출을 검출하기 위해 새장에 카나리를 넣어 가져가던 일에서 유래한 이름.

- Spring Boot의 메이저 버전을 올릴 때 의존하는 라이브러리의 버전도 강제로 바뀌게 되므로, 이로 일어나는 성능 문제나 테스트하지 못한 장애를 최소화 하기 위해 카나리 배포를 시도.

- 쿠버네티스에 Helm 패키지 매니저를 사용해서 배포하는데, Helm의 패키지 단위를 '차트'라 부르며, 차트를 쿠버네티스 클러스터에 설치하면 릴리스가 생성됨.

- 카나리에 대한 차트/릴리스를 작성하고 , Ingress 컨트롤러에 어노테이션을 추가하여 지정한 비율의 요청만 카나리 Ingress로 가도록 설정하였음.

향후 과제

- 카나리 릴리스에 문제가 발생했을 때, 원인이 카나리의 변경사항 때문인지, 원래 발생하던 문제인지 파악하는 것이 어려우므로, 동일 비율로 대조군을 띄워놓고 메트릭을 비교하는 방법이 필요.

- 사용자와 무관하게 요청의 일부를 카나리로 보내므로, 카나리에 문제가 있더라도 요청을 재시도하다 보면 기존 버전이 처리해서 성공하기도 하지만, 전체적으로 봤을 때 카나리의 문제점을 경험하는 사용자의 비율이 늘어날 수 있으므로, (LB에서 스티키 처리를 하듯) 사용자 그룹에 따라 카나리로 라우팅하면 통제가 가능해질 듯.

 
SpatiaLite - SQLite용 Spatial SQL 확장

- PostgresQL + PostGIS 수준의 공간 DB 기능을 SQlite 위 에서 구현 가능 (OGC-SFS* 호환)
ㅤ→ 데스크탑/Standalone GIS 기능 구현에 적합
- ESRI Shapefile, DBF Archive 등의 파일 지원
- Geometry Notation 지원 : WKT/WKB, PostGIT의 EWKT/EWKB, GML, KML(구글맵/구글어스), GeoJSON, SVG

OGC-SFS : Open Geospatial Consortium - Simple Features Interface Standard
- OGC SFS(단순 피처 모델) : https://docs.qgis.org/2.8/ko/…

비슷한 용도로 쓰이는 것들
- SQLite R*Tree Module - https://www.sqlite.org/rtree.html
- The Geopoly Interface - https://www.sqlite.org/geopoly.html

 
SQLean - SQLite에 정규식/통계/유니코드/가상테이블 함수 추가

- SQLite 에 부족한 여러 함수들을 추가해주는 동적 라이브러리
ㅤ→ 윈도우(DLL),리눅스(SO),맥(dylib)
- re (정규식) : REGEXP, regexp_like, regexp_substr, regexp_replace
- stats (통계) : median, stddev, stddev_pop, variance, percentile
- vsv (CSV를 가상 테이블로 로딩) : create virtual table temp.vsv using vsv(...); select * from vsv;
- unicode : upper(), lower(), title(), fold(), unaccent()..

SQLite 3.35 의 새 기능 https://news.hada.io/topic?id=3883
- Math 함수 : cos,sin,tan,log,ln,exp,floor,mod,pi,pow,power,radians,sqrt등

CG/SQL - SQLite용 Stored Procedure 코드 생성기 https://news.hada.io/topic?id=2998
SQLite를 도큐먼트DB로 사용하기 https://news.hada.io/topic?id=3271
simple-graph : SQLite를 Graph DB로 사용하기 https://news.hada.io/topic?id=3477

SQLite Plus 였다가 이름이 SQLean 으로 변경 되었네요. 그리고 위에 없는 두가지 추가
- json1 : 보통 SQLite에 추가해서 빌드 되지만, 없는 경우 확장으로 사용 가능하게 제공
- math : 3.35에 있는 math 를 그 이전버전 에서 사용가능하게 확장으로 추가