- 빅데이터/인공지능
- RV64X: A Free, Open Source GPU for RISC-V
- Tesla is willing to license Autopilot and has already had ‘preliminary discussions’ about it with other automakers
- '열광 이면에는...' RPA의 10가지 그늘
- CPTR: FULL TRANSFORMER NETWORK FOR IMAGE CAPTIONING
- SimpleHTR - Handwritten Text Recognition with TensorFlow
- Uber AI Introduce Fiber, a New Library for Distributed Machine Learning
- A sky map of the Hubble Space Telescope's observations
- Paradox-Free Time Travel Is Theoretically Possible, Researchers Say
- AI and Efficiency
- Google Open-Sources New Higher Performance TensorFlow Runtime
- Recipes for building an open-domain chatbot
- Microsoft: Machine Learning Models Can Be Easily Reverse Engineered
- 쿠키 대체 효과 "양호"··· 구글, 프라이버시 보호하는 광고 테스트 결과 공개
- AI 옵스 업체 6곳이 답했다 "AI 옵스에서 AI는 어떤 역할 하나?"
- Claude Shannon Demonstrates Machine Learning
- Why your AI-based monitoring startup will fail
- [GCP] 머신러닝 파이프라인에서 데이터 변환
- 5나노 車 반도체도 삼성-테슬라 맞손
- Applications of Deep Neural Networks
- GutenSearch - Look inside the books of Project Gutenberg.
- Job Description AI - Create professional job descriptions in seconds using AI
- 시가총액 데이터셋(marcap) - 한국거래소(KRX)에서 일자별 시가총액 순위 데이터, 1995-05-02 ~ 2020-12-31 (26년간), 1천만건 이상
- Algpt2 Part 2 - How I (almost) replicated OpenAI's GPT-2 (124M version)
- PySC2 - StarCraft II Learning Environment
- 11 Life Lessons From History’s Most Underrated Genius
- 국내 최대 패션 이커머스 기업 ‘무신사’, 인공지능 활용으로 앱 매출 132배 확대
- Best-of Machine Learning with Python
- AMX, 애플 M1의 숨겨진 보조프로세서
- State of AI Report 2020
- 심심해서 실리콘 밸리 AI/ML research scientist 취업관련 질문 받는다
- Julia Update: Adoption Keeps Climbing; Is It a Python Challenger?
- Level up your career with skill badges by Google
- datacamp - Build data skills online - Data drives everything. Get the skills you need for the future of work.
- 읽을거리
- 블록체인 기반 혁신금융 생태계 연구보고서
- Siliconpr0n: High Resolution Chip Maps
- What I Really Think of Bitcoin by Ray Dalio
- Is the Covid vaccine safe?
- [웹툰] 흙수저를 위한 나라는 없다
- Why employers will have no choice but to embrace remote working
- ‘Weaponised’ options trading turbocharges GameStop’s dizzying rally
- 1인치 이야기
- 매일 바뀌는 멋진 PC 배경화면, 빙 월페이퍼 앱
- The great unbundling
- Yes, I did drop 90GB of my work to Public Domain
- 제품비교는 블로그말고 소비자원에서 확인해보세요
- First Atomic Clock Wristwatch
- 2020 샌드박스 유튜브 데이터 리포트
- 애플워치에 있는 타키미터(Tachymeter)란 기능을 아시나요?
- The People the Suburbs Were Built for Are Gone
- A 10B Pixel Scan of Vermeer’s Masterpiece
- The Neuroscience of Trust - Management behaviors that foster employee engagemenㅅ
- 이커머스 절대강자는 없다, 150조원 시장 피말리는 경쟁
- '블랙록'은 '금융 플랫폼' 회사다!
- What color was “Apple Beige”?
- FAA Files Reveal a Surprising Threat to Airline Safety: the U.S. Military's GPS Tests
- How Long Does a Bottle of Wine Last After It Is Opened?
- I bought 200+ Raspberry Pi Model B’s and I’m going to fix them! Part 1
- 모기 퇴치 비법, 고양이는 알고 있었다
- '소울'의 사랑스러운 TMI - 재택근무여도 고퀄리티엔 문제없지!
- Most surgeries are ineffective
- Why cats are crazy for catnip
- 2021 뉴스레터 트렌드 - 유료화, 브랜드화, 세분화
- The mathematical case against blaming people for their misfortune
- PRISM Live studio PC는 초보도 전문가처럼 스트리밍하도록 돕는, 라이브 방송용 데스크톱 애플리케이션입니다.
- 번아웃, 남 인정 없이 못 사는 ‘비대한 공적 자아’의 최후
- An Economic Analysis of Ethereum
- 체르노빌 RBMK 원자로 시뮬레이터
토요일, 1월 30, 2021
[B급 프로그래머] 1월 4주 소식(빅데이터/인공지능, 읽을거리 부문)
금요일, 1월 29, 2021
[유튜브 방송] (즐겁게 배우는 SQL #42) 제약 조건 - AUTOINCREMENT 제약
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 42편을 공개해드리겠다. 42편은 AUTOINCREMENT 제약 조건을 소개한다.
2021년 1월 29일자 [즐겁게 배우는 SQL #42] 제약 조건 - AUTOINCREMENT 제약 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 ROWID 소개
- 03:35 PK와 ROWID 연계 방안 소개
- 11:29 AUTOINCREMENT 제약 예제
원본 학습자료는 SQLite AUTOINCREMENT를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: ROWID 소개
- SQL> CREATE TABLE people ( first_name TEXT NOT NULL, last_name TEXT NOT NULL );
- SQL> INSERT INTO people (first_name, last_name) VALUES('John', 'Doe');
- SQL> INSERT INTO people (first_name, last_name) VALUES('Lily', 'Bush');
- SQL> SELECT rowid, _rowid_, oid, first_name, last_name FROM people;
- 단계 2: PK와 ROWID 연계 방안 소개
- SQL> DROP TABLE people;
- SQL> CREATE TABLE people ( person_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL );
- SQL> INSERT INTO people (person_id,first_name,last_name) VALUES( 9223372036854775807,'Johnathan','Smith');
- SQL> INSERT INTO people (first_name,last_name) VALUES('William','Gate');
- SQL> SELECT rowid, _rowid_, oid, first_name, last_name FROM people;
- SQL> CREATE TABLE t1(c text);
- SQL> INSERT INTO t1(c) VALUES('A');
- SQL> INSERT INTO t1(c) values('B');
- SQL> INSERT INTO t1(c) values('C');
- SQL> INSERT INTO t1(c) values('D');
- SQL> SELECT rowid, c FROM t1;
- SQL> DELETE FROM t1;
- SQL> INSERT INTO t1(c) values('E');
- SQL> INSERT INTO t1(c) values('F');
- SQL> INSERT INTO t1(c) values('G');
- SQL> SELECT rowid, c FROM t1;
- 단계 3: AUTOINCREMENT 제약 예제
- SQL> DROP TABLE people;
- SQL> CREATE TABLE people ( person_id INTEGER PRIMARY KEY AUTOINCREMENT, first_name text NOT NULL, last_name text NOT NULL );
- SQL> INSERT INTO people (person_id,first_name,last_name) VALUES(9223372036854775807,'Johnathan','Smith');
- SQL> INSERT INTO people (first_name,last_name) VALUES('John','Smith');
- SQL> SELECT rowid, _rowid_, oid, first_name, last_name FROM people;
목요일, 1월 28, 2021
[유튜브 방송] <마이크로서비스 도입, 이렇게 한다> 도서 증정 이벤트
[독서광] (신간 번역서) 마이크로서비스 도입, 이렇게 한다에서 이미 소개드린 샘 뉴먼의 신간 번역서 출간을 기념해 애독자와 애청자 여러분을 위한 이벤트를 준비했다. 유튜브 애청자 세 분을 추첨해 신간을 증정하는 이번 이벤트에 많은 참여 부탁드린다.
여느 때와 마찬가지로 이벤트 응모 방법은 정말 간단하다. 채널 박재호 유튜브 채널을 구독하고 나서 다음 영상에 응원의 댓글을 달면 끝!
슬라이드 셰어에 올린 방송 스크립트는 다음과 같다.
EOB수요일, 1월 27, 2021
[유튜브 방송] (즐겁게 배우는 SQL #41) 제약 조건 - CHECK 제약
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 41편을 공개해드리겠다. 41편은 CHECK 제약 조건을 소개한다.
2021년 1월 27일자 [즐겁게 배우는 SQL #41] 제약 조건 - CHECK 제약 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 CHECK 제약 기본 형식 소개
- 03:06 컬럼 CHECK 예제
- 06:02 테이블 CHECK 예제
- 08:04 기존 테이블에 CHECK 제약 걸기
원본 학습자료는 SQLite CHECK constraints를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: CHECK 제약 기본 형식
CREATE TABLE table_name( ..., column_name data_type CHECK(expression), ... ); CREATE TABLE table_name( ..., CHECK(expression) ); BEGIN; -- create a new table CREATE TABLE new_table ( [...], CHECK ([...]) ); -- copy data from old table to the new one INSERT INTO new_table SELECT * FROM old_table; -- drop the old table DROP TABLE old_table; -- rename new table to the old one ALTER TABLE new_table RENAME TO old_table; -- commit changes COMMIT;
- 단계 2: 컬럼 CHECK 예제
- SQL> CREATE TABLE contacts ( contact_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT, phone TEXT OT NULL CHECK (length(phone) >= 10) );
- SQL> INSERT INTO contacts(first_name, last_name, phone) VALUES('John','Doe','408123456');
- SQL> INSERT INTO contacts(first_name, last_name, phone) VALUES('John','Doe','(408)-123-456');
- 단계 3: 테이블 CHECK 예제
- SQL> CREATE TABLE products ( product_id INTEGER PRIMARY KEY, product_name TEXT NOT NULL, list_price DECIMAL (10, 2) NOT NULL, discount DECIMAL (10, 2) NOT NULL DEFAULT 0, CHECK (list_price >= discount AND discount >= 0 AND list_price >= 0) );
- SQL> INSERT INTO products(product_name, list_price, discount) VALUES('New Product #1',2000,1000);
- SQL> INSERT INTO products(product_name, list_price, discount) VALUES('New Product #2',900,1000);
- SQL> INSERT INTO products(product_name, list_price, discount) VALUES('New XFactor',1000,-10);
- 단계 4: 기존 테이블에 CHECK 제약 걸기
- SQL> CREATE TABLE contacts ( contact_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT, phone TEXT NOT NULL );
- SQL> INSERT INTO contacts(first_name, last_name, phone) VALUES('John','Doe','(408)-123-456');
- SQL> BEGIN;
- SQL> CREATE TABLE new_contacts ( contact_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT, phone TEXT NOT NULL CHECK (length(phone) >= 10) );
- SQL> INSERT INTO new_contacts SELECT * FROM contacts;
- SQL> DROP TABLE contacts;
- SQL> ALTER TABLE new_contacts RENAME TO contacts;
- SQL> COMMIT;
화요일, 1월 26, 2021
[유튜브 방송] (즐겁게 배우는 SQL #40) 제약 조건 - UNIQUE 제약
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 40편을 공개해드리겠다. 40은 UNIQUE 제약 조건을 소개한다.
2021년 1월 26일자 [즐겁게 배우는 SQL #40] 제약 조건 - UNIQUE 제약 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 UNIQUE 기본 형식 소개
- 02:11 UNIQUE 예제(하나)
- 04:43 UNIQUE 예제(여러 개)
- 06:55 UNIQUE와 NULL
원본 학습자료는 SQLite UNIQUE Constraint를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: UNIQUE 기본 형식 소개
CREATE TABLE table_name( ..., column_name type UNIQUE, ... ); CREATE TABLE table_name( ..., UNIQUE(column_name) ); CREATE TABLE table_name( ..., UNIQUE(column_name1,column_name2,...) );
- 단계 2: UNIQUE 예제(하나)
- SQL> CREATE TABLE contacts( contact_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, email TEXT NOT NULL UNIQUE );
- SQL> INSERT INTO contacts(first_name,last_name,email) VALUES ('John','Doe','john.doe@gmail.com');
- SQL> INSERT INTO contacts(first_name,last_name,email) VALUES ('Johnny','Doe','john.doe@gmail.com');
- 단계 3: UNIQUE 예제(여러 개)
- SQL> CREATE TABLE shapes( shape_id INTEGER PRIMARY KEY, background_color TEXT, foreground_color TEXT, UNIQUE(background_color,foreground_color) );
- SQL> INSERT INTO shapes(background_color,foreground_color) VALUES('red','green');
- SQL> INSERT INTO shapes(background_color,foreground_color) VALUES('red','blue');
- SQL> INSERT INTO shapes(background_color,foreground_color) VALUES('red','green');
- 단계 4: UNIQUE와 NULL
- SQL> CREATE TABLE lists( list_id INTEGER PRIMARY KEY, email TEXT UNIQUE );
- SQL> INSERT INTO lists(email) VALUES(NULL),(NULL);
- SQL> SELECT * FROM lists;
월요일, 1월 25, 2021
[개발자 이야기] (1월 23일) 프론트엔드 성능 점검 항목 – 2021 버전
2021년 1월 23일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.
2021년 1월 23일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 오늘 방송 주요 내용 소개
- 06:28 js;dr
- 08:35 풀 스택 vs 풀 사이클 개발자
- 13:07 GCP, AWS, Azure 누가 누가 잘하나
- 15:52 AWS 엘라스틱 라이선스 변경에 대한 대응 방안 발표
- 20:40 오라클에서 PostgreSQL로 마이그레이션할 때 주의 사항
- 22:45 클라우드플레어 waiting room
- 26:40 프론트엔드 성능 점검 항목 – 2021 버전
- 32:47 gradle의 문제점
토요일, 1월 23, 2021
[B급 프로그래머] 1월 3주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)
- 개발/관리도구
- 임베디드 시스템용 C# 코드 작성 쉽게··· ‘닷넷 나노프레임워크’란?
- Cgit, Nginx & Gitolite: A Personal Git Server
- 105,000 free open source icons
- CRTP Bomb - Nested Curiously Recurring Template Pattern
- Tales of F A V I C O N S and Caches: Persistent Tracking in Modern Browsers
- How We Ported Linux to the M1
- Rust for Windows
- Technical Writing Courses by Google
- Mastering Vim
is hardhas never been easier - Dumbdown - The dumb alternative to markdown
- Porting Firefox to Apple Silicon
- From Monolith to Event-Driven: Finding Seams in Your Future Architecture
- How We Build Micro Frontends
- Intel Problems
- User power, not power users: htop and its design philosophy
- Building Multi-Architecture Docker Images With Buildx
- Front-End Performance Checklist 2021
- Modernizing PHP Applications with Golang
- That XOR Trick
- MuseScore 3.6 is Out!
- Software effort estimation is mostly fake research
- ForwardProxy - 100 LOC Ruby forward proxy using only standard libraries.
- Rust 크로스 컴파일 방법
- Front-end Challenges - Listing some playful open-source's challenges of jobs to test your knowledge
- asdf-python - Python plugin for asdf version manager
- Full Stack vs Full Cycle developer
- js;dr = JavaScript required; Didn’t Read.
- Tracing the Python GIL
- State of JS 2020 [한국어]
- The Problem with Gradle
- context.vim - A Vim plugin that shows the context of the currently visible buffer contents.
- A new and innovative way for Google to kill your SaaS startup
- Computer System Engineering
- Big O Notation - explained as easily as possible
- REST Servers in Go: Part 1 - standard library
- Mithril is a modern client-side JavaScript framework for building Single Page Applications. It's small (< 10kb gzip), fast and provides routing and XHR utilities out of the box.
- 222 Favorite JavaScript Utilities - in single line of code! No more!
- JavaScript Turns 25
- Common anti-patterns in Python
- Have the tables turned on NoSQL?
- webrtc - A pure Rust implementation of WebRTC API. Rewrite Pion WebRTC stack (http://Pion.ly) in Rust
- 버스와 사람
- Deno in 2020
- Tips for Designing Grafana Dashboards
- dns.watch - Our DNS Servers since 2014.
- My preferred .NET console stack
- “A damn stupid thing to do”—the origins of C
- Kubernetes dropping Docker is not that big of a deal
- 9 things to do in your first 10 minutes on a Linux server
- A brief history of network connectivity: Connected mainframes
- JuiceFS - Redis와 S3를 이용한 분산 POSIX 파일시스템
- Apple M1 Assembly Language Hello World
- Hanword HWP document converter for Microsoft Word 2016(아래아 한글 변환기)
- '공공서식 한글' SW 무료 배포 안내
- Advanced Programming in the UNIX Environment CS631 - APUE
- Top JavaScript Frameworks and Tech Trends for 2021
- "몸값 오르는 소리 들린다" 기업이 가장 선호하는 소프트웨어 개발자 스킬
- Mass deleting files in Windows
- Foam is a personal knowledge management and sharing system inspired by Roam Research, built on Visual Studio Code and GitHub.
- Welcome to the LearnJavaOnline.org Interactive Java Tutorial.
- How Linksys’ most famous router, the WRT54G, tripped into legendary status because of an undocumented feature that slipped through during a merger.
- Move over, ARM: BeagleV is a $150 RISC-V computer designed to run Linux
- This is The Entire Computer Science Curriculum in 1000 YouTube Videos
- Dockerfile best practices
- Clang vs Other Open Source Compilers
- What do you want to learn today ?
- The MOnSter 6502
- PHP - The Wrong Way
- Huawei ExaGear: x86_64 apps on Arm64
- "deno compile" into executable
- LuLu is the free, open-source firewall that aims to block unknown outgoing connections, protecting your privacy and your Mac!
- All-in-one bookmark manager
- Rewatch - 팀/회사를 위한 비디오 공유
- Multiplication sign
- Go Language at 13 Years: Ecosystem, Evolution, and Future in Conversation with Steve Francia
- MS 닷넷 JSON 시리얼라이저, 'C# 소스 생성기' 도입 예정
- The many lies about reducing complexity part 2: Cloud
- Startpage - Don't be tracked online. Protect your personal data.
- Foundations of Embedded Systems
- Nix is a tool that takes a unique approach to package management and system configuration. Learn how to make reproducible, declarative and reliable systems
- The decentralized CDN and file sharing platform for devs. Skynet is the storage foundation for a Free Internet!
- 6 YAML Features most programmers don’t know
- Terms of Service; Didn’t Read
- GitHub이 구축한 온콜 문화
- An Invisible Tax on the Web: Video Codecs
- Why Is Apple’s M1 Chip So Fast?
- Next Gen Static Blogging
- What Does RISC and CISC Mean in 2020?
- codesandbox - Quickly prototype ideas with code(gitpod도 참고)
- REST with Spring Tutorial
- Akin's Laws of Spacecraft Design*
- 게임기들의 구조
- 서버측 웹어셈블리 런타임 ‘와스머’, GA 버전 공개
- “하나의 오픈소스, 많은 기여자” 프로메테우스가 작동하는 아름다운 방식
- A 27th IOCCC Winner: Best of show - abuse of libc
- Ruby 3, concurrency and the ecosystem
- Why don’t PCs use error correcting RAM? “Because Intel,” says Linus
- 구글 테크니컬라이터가 전하는 이야기
- Thonny - 초보자를 위한 Python IDE
- 고성능 서버/데이터베이스
- Cloudflare Waiting Room
- The Next Gen Database Servers Powering Let's Encrypt
- "코로나19로 국내 기업 클라우드 전환 가속화"
- Kafka is not a Database
- Amazon: NOT OK - why we had to change Elastic licensing
- edge-sql - A serverless edge worker embedding SQLite using Cloudflare Workers and WASM.
- Why are relational databases still popular when non-relational databases can give most benefits of relational DB with the flexibility of modifying needs of changing technologies?
- KrahoDB is an open-source database designed to support multi-master replication.
- Migrating From Oracle to PostgreSQL - What You Should Know
- How to delete lots of rows from a MySQL database without indefinite locking
- GCP Outpaces Azure, AWS in the 2021 Cloud Report
- Elasticsearch -> Manticore Search data migration tool
- License Changes for Confluent Platform
- How AWS and Other Cloud Providers Became the Internet’s Most Powerful Moderators
- What Can We Learn From SQL’s 50 Year Reign? A Story of 2 Turing Awards
- Elasticsearch is dead, long live Open Distro for Elasticsearch
- 오라클, 블록체인 원장지원 ‘DBMS 21c’ 출시
- A Byte of Python
- Elasticsearch and Kibana are now business risks
- Doubling down on open, Part II
- A Question of Timing (with cURL)
- Handling NULL Values in PostgreSQL
- How to Avoid Cascading Failures in Distributed Systems
- 10기가비트 홈 네트워크 구축하기
- Trigger Warning! Setting up Database Tracking with Triggers in Postgres
- Sysbench: Postgres vs MySQL and the impact of regressions
- Resources consumed by idle PostgreSQL connections
- DBLog: A Generic Change-Data-Capture Framework
금요일, 1월 22, 2021
[유튜브 방송] (즐겁게 배우는 SQL #39) 제약 조건 - NOT NULL 제약
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 39편을 공개해드리겠다. 39편은 NOT NULL 제약 조건을 소개한다.
2021년 1월 22일자 [즐겁게 배우는 SQL #39] 제약 조건 - NOT NULL 제약 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 NOT NULL 기본 형식 소개
- 03:14 NOT NULL 예제
원본 학습자료는 SQLite NOT NULL Constraint를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: NOT NULL 기본 형식 소개
CREATE TABLE table_name ( ..., column_name type_name NOT NULL, ... );
- 단계 2: NOT NULL 예제
- SQL> CREATE TABLE suppliers( supplier_id INTEGER PRIMARY KEY, name TEXT NOT NULL );
- SQL> INSERT INTO suppliers(name) VALUES(NULL);
목요일, 1월 21, 2021
[유튜브 방송] (즐겁게 배우는 SQL #38) 제약 조건 - 외래 키
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 38편을 공개해드리겠다. 38편은 외래 키 제약 조건을 소개한다.
2021년 1월 21일자 [즐겁게 배우는 SQL #38] 제약 조건 - 외래 키 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 외래 키 기능 확인
- 03:47 외래 키 예제
- 06:41 외래 키 제약 행위(SET NULL)
- 12:21 외래 키 제약 행위(RESTRICT)
- 15:00 외래 키 제약 행위(CASCADE)
원본 학습자료는 SQLite Foreign Key를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 외래 키 기능 확인
FOREIGN KEY (foreign_key_columns) REFERENCES parent_table(parent_key_columns) ON UPDATE action ON DELETE action;
- 참고: 3.6.19 버전 이후에 외래 키를 지원
- 주의: SQLite을 컴파일할 때 SQLITE_OMIT_FOREIGN_KEY나 SQLITE_OMIT_TRIGGER를 정의하면 외래 키 제약을 사용할 수 없다
- 외래 키를 보고, 끄고 켜는 방법:
- SQL> PRAGMA foreign_keys;
- SQL> PRAGMA foreign_keys = OFF;
- SQL> PRAGMA foreign_keys = ON;
- 단계 2: 외래 키 예제
- SQL> PRAGMA foreign_keys = ON;
- SQL> CREATE TABLE suppliers ( supplier_id integer PRIMARY KEY, supplier_name text NOT NULL, group_id integer NOT NULL );
- SQL> CREATE TABLE supplier_groups ( group_id integer PRIMARY KEY, group_name text NOT NULL );
- SQL> DROP TABLE suppliers;
- SQL> CREATE TABLE suppliers ( supplier_id INTEGER PRIMARY KEY, supplier_name TEXT NOT NULL, group_id INTEGER NOT NULL, FOREIGN KEY (group_id) REFERENCES supplier_groups (group_id) );
- SQL> INSERT INTO supplier_groups (group_name) VALUES ('Domestic'), ('Global'), ('One-Time');
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES ('HP', 2);
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('ABC Inc.', 4);
- 단계 3: 외래 키 제약 행위(SET NULL)
- SQL> PRAGMA foreign_keys = ON;
- SQL> DROP TABLE suppliers;
- SQL> CREATE TABLE suppliers ( supplier_id INTEGER PRIMARY KEY, supplier_name TEXT NOT NULL, group_id INTEGER, FOREIGN KEY (group_id) REFERENCES supplier_groups (group_id) ON UPDATE SET NULL ON DELETE SET NULL );
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('XYZ Corp', 3);
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('ABC Corp', 3);
- SQL> DELETE FROM supplier_groups WHERE group_id = 3;
- SQL> SELECT * FROM suppliers;
- 단계 4: 외래 키 제약 행위(RESTRICT)
- SQL> PRAGMA foreign_keys = ON;
- SQL> DROP TABLE suppliers;
- SQL> CREATE TABLE suppliers ( supplier_id INTEGER PRIMARY KEY, supplier_name TEXT NOT NULL, group_id INTEGER, FOREIGN KEY (group_id) REFERENCES supplier_groups (group_id) ON UPDATE RESTRICT ON DELETE RESTRICT );
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('XYZ Corp', 1);
- SQL> DELETE FROM supplier_groups WHERE group_id = 1;
- SQL> DELETE FROM suppliers WHERE group_id =1;
- SQL> DELETE FROM supplier_groups WHERE group_id = 1;
- 단계 5: 외래 키 제약 행위(CASCADE)
- SQL> PRAGMA foreign_keys = ON;
- SQL> DELETE FROM supplier_groups;
- SQL> DROP TABLE suppliers;
- SQL> CREATE TABLE suppliers ( supplier_id INTEGER PRIMARY KEY, supplier_name TEXT NOT NULL, group_id INTEGER, FOREIGN KEY (group_id) REFERENCES supplier_groups (group_id) ON UPDATE CASCADE ON DELETE CASCADE );
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('XYZ Corp', 1);
- SQL> INSERT INTO suppliers (supplier_name, group_id) VALUES('ABC Corp', 2);
- SQL> UPDATE supplier_groups SET group_id = 100 WHERE group_name = 'Domestic';
- SQL> SELECT * FROM suppliers;
- SQL> DELETE FROM supplier_groups WHERE group_id = 2;
- SQL> SELECT * FROM suppliers;
수요일, 1월 20, 2021
[유튜브 방송] (즐겁게 배우는 SQL #37) 제약 조건 - 기본 키
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 37편을 공개해드리겠다. 37편은 기본(주) 키 제약 조건을 소개한다.
2021년 1월 20일자 [즐겁게 배우는 SQL #37] 제약 조건 - 기본 키 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 기본 키 형식 소개
- 06:07 기본 키 예제
- 08:06 기본 키 추가하기
원본 학습자료는 SQLite Primary Key를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 기본 키 형식 소개
CREATE TABLE table_name( column_1 INTEGER NOT NULL PRIMARY KEY, ... ); CREATE TABLE table_name( column_1 INTEGER NOT NULL, column_2 INTEGER NOT NULL, ... PRIMARY KEY(column_1,column_2,...) ); PRAGMA foreign_keys=off; BEGIN TRANSACTION; ALTER TABLE table RENAME TO old_table; -- define the primary key constraint here CREATE TABLE table ( ... ); INSERT INTO table SELECT * FROM old_table; COMMIT; PRAGMA foreign_keys=on;
- 단계 2: 기본 키 예제
- SQL> CREATE TABLE countries ( country_id INTEGER PRIMARY KEY, name TEXT NOT NULL );
- SQL> CREATE TABLE languages ( language_id INTEGER, name TEXT NOT NULL, PRIMARY KEY (language_id) );
- SQL> CREATE TABLE country_languages ( country_id INTEGER NOT NULL, language_id INTEGER NOT NULL, PRIMARY KEY (country_id, language_id), FOREIGN KEY (country_id) REFERENCES countries (country_id) ON DELETE CASCADE ON UPDATE NO ACTION, FOREIGN KEY (language_id) REFERENCES languages (language_id) ON DELETE CASCADE ON UPDATE NO ACTION );
- SQL> INSERT INTO addresses ( house_no, street, city, postal_code, country ) VALUES ( '3960', 'North 1st Street', 'San Jose ', '95134', 'USA ' );
- SQL> INSERT INTO people ( first_name, last_name, address_id ) VALUES ('John', 'Doe', 1);
- SQL> DROP TABLE addresses;
- 단계 3: 기본 키 추가하기
- SQL> CREATE TABLE cities ( id INTEGER NOT NULL, name text NOT NULL );
- SQL> INSERT INTO cities (id, name) VALUES(1, 'San Jose');
- SQL> PRAGMA foreign_keys=off;
- SQL> BEGIN TRANSACTION;
- SQL> ALTER TABLE cities RENAME TO old_cities;
- SQL> CREATE TABLE cities ( id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL );
- SQL> INSERT INTO cities SELECT * FROM old_cities;
- SQL> DROP TABLE old_cities;
- SQL> COMMIT;
- SQL> PRAGMA foreign_keys=on;
화요일, 1월 19, 2021
[유튜브 방송] (즐겁게 배우는 SQL #36) 데이터를 정의하자 - 청소(Vacuum)
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 36편을 공개해드리겠다. 36편은 테이블 청소 방법을 소개한다.
2021년 1월 19일자 [즐겁게 배우는 SQL #36] 데이터를 정의하자 - 청소(Vacuum) 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 SQLite에서 청소(Vacuum)가 필요한 이유
- 04:55 VACUUM 명령과 pragma를 사용한 VACUUM 방식 지정
- 05:35 VACUUM INTO 살펴보기
원본 학습자료는 SQLite VACUUM을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: SQLite에서 청소(Vacuum)가 필요한 이유
- DROP이나 DELETE 등으로 자료를 삭제하더라도 데이터베이스 파일 크기는 그대로 --> 향후 사용을 위해 확보된 상태로 유지
- INSERT/DELETE 등으로 데이터를 삭제하면, 색인과 테이블이 조각화되는 상황이 발생
- 이런 문제점을 보완하기 위해 VACUUM을 도입(비고: PostgreSQL)
- 주의: VACUUM은 임시 데이터베이스 파일을 만들고 조각모음을 수행하고 다시 원본 데이터베이스 파일에 반영하므로 실시간성이 떨어짐
- 큰 테이블이나 색인을 데이터베이스에서 삭제하고 나면 수작업으로 VACUUM을 실행할 필요가 있음
- 주의: 3.9.2 버전에서 main 데이터베이스에만 VACUUM 명령을 실행할 수 있음
- 참고: SQLite는 자동으로 VACUUM 명령을 수행할 수 있지만, 제약으로 인해 수동으로 돌리는 편이 바람직함
- 단계 2: VACUUM 명령과 pragma를 사용한 VACUUM 방식 지정
- SQL> VACUUM; # 수동으로 VACUUM
- SQL> PRAGMA auto_vacuum = FULL; # 전체
- SQL> PRAGMA auto_vacuum = INCREMENTAL; # 증분
- SQL> PRAGMA auto_vacuum = NONE; # 하지 않음
- 단계 3: VACUUM INTO 살펴보기
- SQL> VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';
월요일, 1월 18, 2021
[유튜브 방송] (즐겁게 배우는 SQL #35) 데이터를 정의하자 - 테이블 제거
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 35편을 공개해드리겠다. 35편은 테이블 제거 방법을 소개한다.
2021년 1월 18일자 [즐겁게 배우는 SQL #35] 데이터를 정의하자 - 테이블 제거 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 테이블 제거 방법 소개
- 02:00 테이블 제거 예제
- 05:21 FK 문제 해결 방안
원본 학습자료는 SQLite Drop Table을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 테이블 제거 방법 소개
DROP TABLE [IF EXISTS] [schema_name.]table_name;
- 단계 2: 테이블 제거 예제
- SQL> PRAGMA foreign_keys = ON;
- SQL> CREATE TABLE IF NOT EXISTS people ( person_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, address_id INTEGER, FOREIGN KEY (address_id) REFERENCES addresses (address_id) );
- SQL> CREATE TABLE IF NOT EXISTS addresses ( address_id INTEGER PRIMARY KEY, house_no TEXT, street TEXT, city TEXT, postal_code TEXT, country TEXT );
- SQL> INSERT INTO addresses ( house_no, street, city, postal_code, country ) VALUES ( '3960', 'North 1st Street', 'San Jose ', '95134', 'USA ' );
- SQL> INSERT INTO people ( first_name, last_name, address_id ) VALUES ('John', 'Doe', 1);
- SQL> DROP TABLE addresses;
- 단계 3: FK 문제 해결 방안
- SQL> PRAGMA foreign_keys = OFF;
- SQL> DROP TABLE addresses;
- SQL> UPDATE people SET address_id = NULL;
- SQL> PRAGMA foreign_keys = ON;
[개발자 이야기] (1월 16일) 마이크로서비스 도입, 이렇게 한다
2021년 1월 16일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.
2021년 1월 16일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 오늘 방송 주요 내용 소개
- 06:54 (신간 소개) 마이크로서비스 도입, 이렇게 한다
- 16:18 PHP 잘못된 방식으로 배우기
- 21:33 클라우드플레어 레이더 2020년 리뷰
- 23:55 엘라스틱 라이선스 변경
- 28:07 Learn X by Doing Y – 프로젝트 기반 학습 검색 엔진
- 29:59 안전한 Dockerfile 만들기
- 33:07 오라클, 블록체인DB와 AutoML 지원
- 36:49 PostgreSQL vs MySQL 누가 누가 빠를까?
- 39:14 윈도우에서 엄청나게 많은 파일을 지우는 방법
토요일, 1월 16, 2021
[B급 프로그래머] 1월 2주 소식(빅데이터/인공지능, 읽을거리 부문)
- 빅데이터/인공지능
- Teardown: What You Need To Know on Data Discovery Platforms
- Welcome to Greylock - A simple and lightweight data visualization library
- DuckDuckGo Reaches 100M Daily Search Queries for the First Time
- Sudden amnesia showed me the self is a convenient fiction
- Smart Contracts On Bitcoin
- We Don't Need Data Scientists, We Need Data Engineers
- The Bitter Lesson 번역
- A day in the life of AI
- 인공지능 챗봇 서비스 '이루다' KISA 조사 진행 중... 2차 Q&A 형식으로 해명하고 거듭 사과
- How To Predict NFL Winners With Python
- Multiplication sign
- 수학공부 카테고리 목록
- Simple Anomaly Detection Using Plain SQL
- '수면 아래 백조의 다리'··· 인공지능의 어두운 비밀 12가지
- ALGORITHMS FOR DECISION MAKING
- Komito Analytics is an enhancement for the most popular analytics software. It unlocks power of digital analytics with additional insights about visitor’s behavior.
- Introducing Machine Learning for Developers Newsletter (ML4Devs, Issue 1)
- Doing symbolic math with SymPy
- Scipy Lecture Notes
- DALL-E in Pytorch
- Traffic Simulator
- Dissecting the Apple M1 GPU, part I
- The nuclear lighthouses built by the Soviets in the Arctic
- 없으면 만든다··· 오픈 AI, 진일보한 이미지 생성 AI '달·E' 선보여
- JupyterLab 3.0 is released!
- 15.ai Deep-learning text-to-speech tool for generating voices of various characters
- DALL·E: Creating Images from Text
- MMTracking is an open source video perception toolbox based on PyTorch.
- How To Become A Computer Vision Engineer In 2021
- AI 소프트웨어 시장이 예상보다 줄 거라 전망하는 이유
- My year in data
- When Big Brands Stopped Spending On Digital Ads, Nothing Happened. Why?
- Headlime - Say goodbye to manually creating landing pages and writing copy
- Handtrack.js is a library for prototyping realtime hand detection (bounding box), directly in the browser.
- How to Staff Your AI Team
- What's the difference between boosting and bagging?
- 자바 개발자를 위한 머신러닝 실전 가이드 - ITWorld How To
- The Pile - An 800GB Dataset of Diverse Text for Language Modeling
- Getting started in Robotics
- WEKA - The workbench for machine learning
- 읽을거리
- The Bit Short: Inside Crypto’s Doomsday Machine
- Immunological characteristics govern the transition of COVID-19 to endemicity
- [특파원 리포트] 흥분한 '서학개미'들에게
- Managing Stress and Emotions When Working Remotely
- 21년 디지털자산 전망과 7대 트렌드
- If it will matter after today, stop talking about it in a chat room
- 자동차의 마지막 아날로그 - 시계: 자동차 시계의 역사
- 테크노마트 회상-1; 부동산 가격은 아무도 어떻게 될지 모른다.
- Terms of Service; Didn’t Read
- ‘마이크로매니징’을 피하면서 직원들을 돕는 방법
- To the moon: defining and detecting cryptocurrency pump-and-dumps
- 투자 자료 모음
- Your Air Travel Experience Will Never Be the Same
- 마트서 파는 참치 캔에 참다랑어는 없지만...
- Feel Like You’re Falling Behind Your Peers?
- 美 통화감독청, 은행 결제 업무에 블록체인·스테이블코인 활용 공식 허용
- The Colonel Blotto Game: How Underdogs Can Win
- [에세이] 무조건 상위 10% 안에 드는 방법
- 우리 집 고양이가 보는 집사의 모습은 거대하고 예측 불가능한 영장류?
- No One Can Explain Why Planes Stay in the Air
- GPU Shortages Will Worsen Thanks to Coin Miners
- 음향 편집기사가 말하는 '한국영화에서 대사가 잘 안 들리는 이유'
- 투자 전략: 벤치마크의 기술
- 비트코인 3만달러 돌파, 발사지는 코인베이스?
- 고용 한파엔 서울대 졸업장도, 토익 900점도 안 통한다
- 「주요국의 상위 10% 논문 국제점유율 분석」 주요내용
- `직장인만 봉`…눈덩이 소득세 5년간 45% 늘었다
- David Fincher, the Unhappiest Auteur
금요일, 1월 15, 2021
[유튜브 방송] (즐겁게 배우는 SQL #34) 데이터를 정의하자 - 테이블 열 이름 변경
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 34편을 공개해드리겠다. 34편은 테이블 열 이름 변경 방법을 소개한다.
2021년 1월 15일자 [즐겁게 배우는 SQL #34] 데이터를 정의하자 - 테이블 열 이름 변경 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 테이블 열 이름 변경 방법 소개
- 01:14 테이블 열 이름 변경 예제
- 02:30 테이블 열 이름 변경 예제(2)
원본 학습자료는 SQLite Rename Column을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 테이블 열 이름 변경 방법 소개
ALTER TABLE table_name RENAME COLUMN current_name TO new_name;
- 단계 2: 테이블 열 이름 변경 예제
- SQL> CREATE TABLE Locations( LocationId INTEGER PRIMARY KEY, Address TEXT NOT NULL, City TEXT NOT NULL, State TEXT NOT NULL, Country TEXT NOT NULL );
- SQL> INSERT INTO Locations(Address,City,State,Country) VALUES('3960 North 1st Street','San Jose','CA','USA');
- SQL> ALTER TABLE Locations RENAME COLUMN Address TO Street;
- SQL> SELET * FROM Locations;
- 단계 3: 테이블 열 이름 변경 예제(2)
- 참고: 3.25.0 이전에 사용하는 옛날 방식
- SQL> DROP TABLE IF EXISTS Locations;
- SQL> CREATE TABLE Locations( LocationId INTEGER PRIMARY KEY, Address TEXT NOT NULL, State TEXT NOT NULL, City TEXT NOT NULL, Country TEXT NOT NULL );
- SQL> INSERT INTO Locations(Address,City,State,Country) VALUES('3960 North 1st Street','San Jose','CA','USA');
- SQL> BEGIN TRANSACTION;
- SQL> CREATE TABLE LocationsTemp( LocationId INTEGER PRIMARY KEY, Street TEXT NOT NULL, City TEXT NOT NULL, State TEXT NOT NULL, Country TEXT NOT NULL );
- SQL> INSERT INTO LocationsTemp(Street,City,State,Country)
- SQL> SELECT Address,City,State,Country FROM Locations;
- SQL> DROP TABLE Locations;
- SQL> ALTER TABLE LocationsTemp RENAME TO Locations;
- SQL> COMMIT;
- SQL> SELECT * FROM Locations;
목요일, 1월 14, 2021
[유튜브 방송] (즐겁게 배우는 SQL #33) 데이터를 정의하자 - 테이블 변경
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 33편을 공개해드리겠다. 33편은 테이블 변경 방법을 소개한다.
2021년 1월 14일자 [즐겁게 배우는 SQL #33] 데이터를 정의하자 - 테이블 변경 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 테이블 변경 방법 소개
- 03:28 테이블 이름 변경 예제
- 05:04 테이블 열 추가 예제
- 07:42 테이블 열 삭제 예제
원본 학습자료는 SQLite Rename Column을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 테이블 변경 방법 소개
ALTER TABLE existing_table RENAME TO new_table; ) [WITHOUT ROWID]; ALTER TABLE table_name ADD COLUMN column_definition; ALTER TABLE table_name RENAME COLUMN current_name TO new_name; -- disable foreign key constraint check PRAGMA foreign_keys=off; -- start a transaction BEGIN TRANSACTION; -- Here you can drop column CREATE TABLE IF NOT EXISTS new_table( column_definition, ... ); -- copy data from the table to the new_table INSERT INTO new_table(column_list) SELECT column_list FROM table; -- drop the table DROP TABLE table; -- rename the new_table to the table ALTER TABLE new_table RENAME TO table; -- commit the transaction COMMIT; -- enable foreign key constraint check PRAGMA foreign_keys=on;
- 단계 2: 테이블 이름 변경 예제
- SQL> CREATE TABLE devices ( name TEXT NOT NULL, model TEXT NOT NULL, Serial INTEGER NOT NULL UNIQUE );
- SQL> INSERT INTO devices (name, model, serial) VALUES('HP ZBook 17 G3 Mobile Workstation','ZBook','SN-2015');
- SQL> ALTER TABLE devices RENAME TO equipment;
- SQL> SELECT name, model, serial FROM equipment;
- 단계 3: 테이블 열 추가 예제
- SQL> ALTER TABLE equipment ADD COLUMN location text;
- 단계 4: 테이블 열 삭제 예제
- SQL> CREATE TABLE users( UserId INTEGER PRIMARY KEY, FirstName TEXT NOT NULL, LastName TEXT NOT NULL, Email TEXT NOT NULL, Phone TEXT NOT NULL );
- SQL> CREATE TABLE favorites( UserId INTEGER, PlaylistId INTEGER, FOREIGN KEY(UserId) REFERENCES users(UserId), FOREIGN KEY(PlaylistId) REFERENCES playlists(PlaylistId) );
- SQL> INSERT INTO users(FirstName, LastName, Email, Phone) VALUES('John','Doe','john.doe@example.com','408-234-3456');
- SQL> INSERT INTO favorites(UserId, PlaylistId) VALUES(1,1);
- SQL> SELECT * FROM users;
- SQL> SELECT * FROM favorites;
- SQL> PRAGMA foreign_keys=off;
- SQL> BEGIN TRANSACTION;
- SQL> CREATE TABLE IF NOT EXISTS persons ( UserId INTEGER PRIMARY KEY, FirstName TEXT NOT NULL, LastName TEXT NOT NULL, Email TEXT NOT NULL );
- SQL> INSERT INTO persons(UserId, FirstName, LastName, Email) SELECT UserId, FirstName, LastName, Email FROM users;
- SQL> DROP TABLE users;
- SQL> ALTER TABLE persons RENAME TO users;
- SQL> COMMIT;
- SQL> PRAGMA foreign_keys=on;
- SQL> SELECT * FROM users;
수요일, 1월 13, 2021
[독서광] (신간 번역서) 마이크로서비스 도입, 이렇게 한다
작년 10월 말에 출간된 게임 엔진 블랙 북: 울펜슈타인 3D에 이어 오늘은 신간 번역서 소식 하나 전해드리겠다. 오늘의 주인공은 마이크로서비스 아키텍처 구축: 대용량 시스템의 효율적인 분산 설계 기법으로 유명해진 샘 뉴먼이 집필한 Monolith To Microservices의 번역서인 마이크로서비스 도입, 이렇게 한다: 기업의 유연성과 확장성을 높이는 마이크로서비스 마이그레이션 패턴과 현장 사례다.
이 책은 마이크로서비스를 기업에서 도입하는 과정에서 겪게될 여러 가지 어려움을 미리 볼 수 있는 수정 구슬을 제공하며, 구체적으로 마이크로서비스를 도입해야 할지 말아야 할지, 도입한다면 어떤 과정을 거쳐 도입해야 할지, 도입하는 과정에서 따르면 좋을 패턴 23가지와 문제에 부딪혔을 때 도움이 되는 해법을 소개한다. 쿠버네티스와 클라우드 네이티브만 도입하면 저절로 마이크로서비스 아키텍처를 멋지게 달성할 수 있지 않을까라는 막연한 희망을 품고 있는 분들이게 성공 확률을 높이는 비법은 무엇일까?
2020년 7월 15일 오라일리 테크 레이더에서 발표한 Microservices Adoption in 2020에서 조사한 결과를 여기서 잠깐 정리해보겠다.
- 채택한 대다수 회사는 마이크로서비스로 성공을 거뒀다: 소수(10% 이하)만 '완벽한 성공'을 보고했지만, 명백히 대다수(54%)가 최소한 '거의 성공했으며', 92%의 응답자가 최소한 어느 정도 성공을 거뒀다고 보고했다. 전혀 성공을 거두지 못한 회사는 10%에 못미쳤다.
- 마이크로서비스 우수 사례는 놀랄만큼 성숙되었다: 응답자의 대략 28%가 조직이 최소한 3년 정도 마이크로서비스를 사용해왔다고 응답했으며, 2/3(61%)의 응답자는 1년 이상 마이크로서비스를 사용해왔다고 응답했다.
- 채택한 회사들은 마이크로서비스에 거액의 판돈을 걸었다: 거의 1/3에 해당하는(29%) 응답자들은 마이크로서비스를 사용해 대다수(50% 이상) 시스템을 구현하거나 이주했다고 말했다.
- 마이크로서비스 성공은 소프트웨어 생명주기의 소유를 의미한다: 대다수(74%) 응답자는 팀이 소프트웨어 생명주기의 빌드-테스트-배포-유지 단계를 소유하고 있다고 응답했다. 생명 주기를 소유한 팀은 그렇지 못한 팀과 비교해 18% 더 높은 비율로 성공했다.
- 컨테이너의 성공: 응답자 중에 마이크로서비스 배포에 컨테이너를 사용한 조직이 그렇지 않은 조직과 비교해 더 많은 성공을 거두었다. 응답자를 대상으로 컨테이너 사용은 마이크로서비스 성공을 판단하는 가장 강력한 예측 요인이었다.
- 마이크로서비스는 문화다: 마이크로서비스를 채택한 많은 조직은 채택 과정에서 문화와 마인드 장벽을 언급했다. 모놀리스 애플리케이션을 마이크로서비스로 분해하는 작업은 상당한 도전이지만, 복잡도는 그 중에서도 가장 큰 도전으로 다가온다.
이렇듯 마이크로서비스가 점차 퍼져나가고 있음에도 불구하고 주의 사항이 있다. 대다수 성공 사례는 백지에서 시작한 경우보다는 기존 사업 이해도가 높은 경우에 해당하고 비교적 조직 규모가 큰 경우에 해당한다는 사실이다. 따라서 처음부터 마이크로서비스 아키텍처를 구성하는 방식보다는 기존 모놀리스를 점진적으로 마이크로서비스 아키텍처로 이동하는 방식이 성공 확률을 높인다는 샘 뉴먼의 경험적인 교훈을 잘 새겨 들어야 한다. 다시 말해, 마이크로서비스를 도입하고 싶은 마음이 급할수록 돌아가야한다. 이 책을 읽으면서 마이크로서비스 아키텍처와 관련된 문제를 솔직하게 평가하고, 심지어 마이크로아키텍처로 향하는 여정의 시작이 각자에게 적합한지 이해하자. 이렇게 차근차근 전진하다보면 여러분도 마이크로서비스로 성공한 일원이 되어 있을 것이다. 아무쪼록 마이크로서비스 여정을 떠나는 독자 여러분의 행운을 빈다!
한국어판에만 있는 보너스: '부록 C 한국어판 특별 부록: 기술의 진화로 짚어보는 마이크로서비스 도입의 허와 실'를 한국어판 독자들을 위해 특별히 작성했다.
현재 절찬 예약 판매 중이며, 애독자 여러분들의 많은 성원 부탁드리겠다.
- ▶️ 교보문고 https://bit.ly/3q9C5P8
- ▶️ 예스24 https://bit.ly/2LBHakh
- ▶️ 알라딘 http://aladin.kr/p/ryuUD
- ▶️ 인터파크 https://bit.ly/2XxnhxG
[유튜브 방송] (즐겁게 배우는 SQL #32) 데이터를 정의하자 - 테이블 생성
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 32편을 공개해드리겠다. 32편은 테이블 생성 방법을 소개한다.
2021년 1월 13일자 [즐겁게 배우는 SQL #32] 데이터를 정의하자 - 테이블 생성 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 테이블 생성 방법 소개
- 05:17 테이블 생성 예제
원본 학습자료는 SQLite Create Table을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 테이블 생성 방법 소개
CREATE TABLE [IF NOT EXISTS] [schema_name].table_name ( column_1 data_type PRIMARY KEY, column_2 data_type NOT NULL, column_3 data_type DEFAULT 0, table_constraints ) [WITHOUT ROWID];
- 단계 2: 테이블 생성 예제
- SQL> CREATE TABLE contacts ( contact_id INTEGER PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, phone TEXT NOT NULL UNIQUE );
- SQL> CREATE TABLE groups ( group_id INTEGER PRIMARY KEY, name TEXT NOT NULL );
- SQL> CREATE TABLE contact_groups( contact_id INTEGER, group_id INTEGER, PRIMARY KEY (contact_id, group_id), FOREIGN KEY (contact_id) REFERENCES contacts (contact_id) ON DELETE CASCADE ON UPDATE NO ACTION, FOREIGN KEY (group_id) REFERENCES groups (group_id) ON DELETE CASCADE ON UPDATE NO ACTION );
화요일, 1월 12, 2021
[유튜브 방송] (즐겁게 배우는 SQL #31) 데이터를 정의하자 - SQL 데이터 타입
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 31편을 공개해드리겠다. 31편은 SQL 데이터 타입을 소개한다.
2021년 1월 12일자 [즐겁게 배우는 SQL #31] 데이터를 정의하자 - SQL 데이터 타입 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 데이터 타입 유형 소개
- 02:17 typeof() 함수 소개
- 03:12 데이터 타입 예제
- 05:47 데이터 타입 정렬 순서 확인
원본 학습자료는 SQLite Data Types을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 데이터 타입 유형 소개
- NULL: NULL
- INTEGER: 정수(1, 2, 4, 8 가변 바이트)
- REAL: 실수(8바이트)
- TEXT: 문자열(가변 바이트)
- BLOB(Binary Large OBject): 이진 데이터(x 로 시작하고 가변 바이트)
- 단계 2: typeof() 함수 소개
- SQL> SELECT typeof(100), typeof(10.0), typeof('100'), typeof(x'1000'), typeof(NULL);
- 단계 3: 데이터 타입 예제
- SQL> CREATE TABLE test_datatypes ( id INTEGER PRIMARY KEY, val );
- SQL> INSERT INTO test_datatypes (val) VALUES (1), (2), (10.1), (20.5), ('A'), ('B'), (NULL), (x'0010'), (x'0011');
- SQL> SELECT id, val, typeof(val) FROM test_datatypes;
- 단계 4: 데이터 타입 정렬 순서 확인
- 순서는: (가장 우선 순위가 낮은) NULL < INTEGER = REAL < TEXT < BLOB (가장 우선 순위가 높은)
- SQL> SELECT id, val, typeof(val) FROM test_datatypes ORDER BY val;
월요일, 1월 11, 2021
[유튜브 방송] (즐겁게 배우는 SQL #30) 트랜잭션이 뭐지?
[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 30편을 공개해드리겠다. 30편은 트랜잭션의 개념/기본 원리와 예를 소개한다.
2021년 1월 11일자 [즐겁게 배우는 SQL #30] 트랜잭션이 뭐지? 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 트랜잭션 기본 원리 소개
- 04:51 트랜잭션 예제(정상적인 경우)
- 11:07 트랜잭션 예제(롤백하는 경우)
원본 학습자료는 SQLite Transaction을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:
- 단계 1: 트랜잭션 기본 원리 소개 - ACID
- 원자성(Atomic): 트랜잭션 내에서는 모든 연산이 모두 완료되거나 모두 실패하거나 둘 중 한 가지 상태를 보증한다. 어떤 이유로든 시도하는 변경 내역이 실패하면 전체 연산은 중단되고 마치 아무런 변경사항도 없는 것처럼 보인다.
- 일관성(Consistent): 데이터베이스가 변경되면, 유효하며 일관된 상태로 유지된다.
- 격리(Isolation): 여러 트랜잭션이 간섭 없이 동시에 작동할 수 있다. 이는 어떤 트랜잭션 중에 이뤄진 모든 중간 상태 변경이 다른 트랜잭션에 보이지 않게 하는 방법으로 달성된다.
- 내구성(Durable): 일단 트랜잭션이 완료되고 나면 시스템 오류가 발생하는 상황에서도 데이터가 손실되지 않는다고 보장한다.
BEGIN TRANSACTION; COMMIT; ROLLBACK;
- 단계 2: 트랜잭션 예제(정상적인 경우)
- SQL> CREATE TABLE accounts ( account_no INTEGER NOT NULL, balance DECIMAL NOT NULL DEFAULT 0, PRIMARY KEY(account_no), CHECK(balance >= 0) );
- SQL> CREATE TABLE account_changes ( change_no INTEGER PRIMARY KEY AUTOINCREMENT, account_no INTEGER NOT NULL, flag TEXT NOT NULL, amount DECIMAL NOT NULL, changed_at TEXT NOT NULL );
- SQL> INSERT INTO accounts (account_no,balance) VALUES (100,20100);
- SQL> INSERT INTO accounts (account_no,balance) VALUES (200,10100);
- SQL> BEGIN TRANSACTION;
- SQL> UPDATE accounts SET balance = balance - 1000 WHERE account_no = 100;
- SQL> UPDATE accounts SET balance = balance + 1000 WHERE account_no = 200;
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',1000,datetime('now'));
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(200,'+',1000,datetime('now'));
- SQL> COMMIT;
- SQL> SELECT * FROM accounts;
- SQL> SELECT * FROM account_changes;
- 단계 3: 트랜잭션 예제(롤백하는 경우)
- SQL> BEGIN TRANSACTION;
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',20000,datetime('now'));
- SQL> UPDATE accounts SET balance = balance - 20000 WHERE account_no = 100;
- SQL> SELECT * FROM account_changes;
- SQL> ROLLBACK;
- SQL> SELECT * FROM account_changes;
[개발자 이야기] (1월 9일) 내가 소프트웨어 업계에서 45년 동안 배운 교훈
2021년 1월 9일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.
2021년 1월 9일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.
하이라이트를 요약 정리하면 다음과 같다:
- 00:00 오늘 방송 주요 내용 소개
- 04:00 서버쪽 웹어셈블리 와스머 GA 버전 공개!
- 07:46 우리가 클라우드를 싫어하는 11가지 이유
- 12:22 닛산, 깃 저장소 설정 오류로 코드 유출
- 13:47 내가 소프트웨어 업계에서 45년 동안 배운 교훈
- 18:45 (SQL) Correlated Subquery
- 20:45 페북이 앱에서 수집하는 정보 범위는?
- 22:22 아틀라시안 클라우드 사용 약관 중…
토요일, 1월 09, 2021
[B급 프로그래머] 1월 1주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)
- 개발/관리도구
- Dissecting the Apple M1 GPU, part I
- Nissan source code leaked online after Git repo misconfiguration
- The Journey from Monolith to Microservices at GitHub: QCon Plus Q&A
- Why is my ethernet interface called enp0s10 instead of eth0?
- ‘역설투성이'··· 우리가 클라우드를 싫어하는 11가지 이유
- How NAT traversal works
- What I’ve Learned in 45 Years in the Software Industry
- PeerJS simplifies WebRTC peer-to-peer data, video, and audio calls.
- Web Development for Beginners - A Curriculum (한국어판)
- 2020년과 이후 JavaScript의 동향 - 라이브러리와 프레임워크 1
- A Look At The CPU Security Mitigation Costs Three Years After Spectre/Meltdown
- https://bert.org/2021/01/04/t2-pin-cracking/
- How to set environment variable in systemd service?
- Explore the night sky with this open source astronomy app
- Show progress in your Python apps with tqdm
- 10 examples of using Python in 2020
- 루비(Ruby) 버전 3.0.0, 병렬실행 및 타입설명 지원
- https://repl.leaningtech.com/?nodejs
- Learn Go in ~5mins
- System Design Interview Book Review: Finally, a Book for Getting Better at Architecting Systems
- The Offline Cookbook
- Stimulus, the "JavaScript Framework for the HTML You Already Have", Releases 2.0
- MsQuic is a Microsoft implementation of the IETF QUIC protocol.
- Why Performance Matters, Part 2: Perception Management
- An Incomplete Guide to Rollups (Ethereum Scalability Solution)
- Unclack is the small but mighty Mac utility that mutes your microphone while you type.
- mint - The programming language for writing single page applications.
- Open source RGB lighting control that doesn't depend on manufacturer software. Supports Windows and Linux.
- WhatsApp Beaten By Apple’s New iMessage Privacy Update
- muzzleapp - a simple mac app to slience embarrassing notification while screensharing
- GTK4 for Graphical User Interfaces
- Ryzen 9 5000 series processor by Linus Torvalds
- How to open a file in Emacs
- URL shorteners set ad tracking cookies
- Which programs are fastest?
- CodeSwing - VSCode용 대화형 코딩 환경
- JSON Lines 포맷
- A half-hour to learn Zig
- New 2021 GPS Accuracy Issue Impacting Some Garmin, Suunto, other GPS Devices
- Speed up Docker build time with cache warming
- Seven Hard-Earned Lessons Learned Migrating a Monolith to Microservices
- A review of endianness bugs in Qt, and how they were fixed
- Virtual Environments Demystified
- A half-hour to learn Rust
- The Lasting Lessons of John Conway's Game of Life
- 순수하게 CSS로만 만든 디지털 시계
- The Great Software Stagnation
- Getting started in Robotics
- horrifying-pdf-experiments
- [Python] REST API 개발로 알아보는 WSGI, ASGI
- distcc: a fast, free distributed C/C++ compiler
- Lichee Nano Pi – Will it run Debian?
- Embed Flash SWF content without the Plugin
- State machines are wonderful tools
- An onlinejudge system based on Python and Vue. (온라인 코딩 테스트 플랫폼)
- TabFS is a browser extension that mounts your browser tabs as a filesystem on your computer.
- The Monaco Editor is the code editor that powers VS Code.
- 🌳🚀 CS Visualized: Useful Git Commands
- The Big Little Guide to Message Queues
- Uber’s Real-Time Push Platform
- bpytop – Awesome Linux, macOS and FreeBSD resource monitor
- How we built the GitHub globe
- '배시(Bash) 5.1' 출시, 업데이트 주요 내용
- In the Search of Code Quality (Code Review)
- A fork of Puppeteer running on Deno.
- How to Build Rest API with Node.js, Express.js and MongoDB
- CTL is a fast compiling, type safe, header only, template-like library for ISO C99/C11.
- SikuliX automates anything you see on the screen of your desktop computer running Windows, Mac or some Linux/Unix.
- 네이버 클라우드 플랫폼의 Live Station과 OBS로 온라인 행사 운영하기
- Archivy - 셀프호스팅 지식 저장소
- 쿠버네티스 클러스터 운영자를 위한 모니터링
- YAML cheatsheet
- NumPy Illustrated: The Visual Guide to NumPy
- Teaching the Unfortunate Parts
- How AWS Added Apple Mac Mini Nodes to EC2
- In-depth: Functional programming in C++
- Why the iPhone Timer App displays a Fake Time
- Deview 2020 (Day 2/Day 3)
- Raspberry Pi PCIe Devices - Raspberry Pi PCI Express device compatibility database
- 어느 위치에서 실행하든 경로를 유지하는 배치 파일 만들기
- cosmopolitan libc - build-once run-anywhere c without devops
- 기업 무료 라이선스 S/W
- bar jar is also known as fat jar i.e. jar with dependencies.
- Welcome to the learnshell.org interactive Shell Programming tutorial.
- JavaScript 에서 TypeScript 로
- Systems design explains the world: volume 1
- Upptime - GitHub-powered open-source uptime monitor and status page
- The Genius of RISC-V Microprocessors
- Tokio 1.0 발표 - Rust용 비동기 런타임
- Run More Stuff in Docker
- Fun with IP address parsing
- 리멤버 서버/웹 팀은 어떻게 일을 하는가? (Code Review 포함)
- How much math you need for programming
- How I REVERSE ENGINEERED GOOGLE DOCS
- A Complete Guide to LLVM for Programming Language Creators
- How an obscure British PC maker invented ARM and changed the world
- 고성능 서버/데이터베이스
- Linux /proc Filesystem for MySQL DBAs - Part I, Basics
- json-sql
- minikeyvalue is a ~1000 line distributed key value store, with support for replication, multiple machines, and multiple drives per machine.
- Understanding Connections & Pools
- MySQL Challenge: 100k Connections
- PostgreSQL Database Security: What You Need To Know
- SQL Correlated Subqueries
- Creating a Java off-heap in-memory database
- his is a simple graph database in SQLite, inspired by "SQLite as a document database".
- PostgreSQL to ClickHouse