토요일, 2월 27, 2021

[B급 프로그래머] 2월 4주 소식(빅데이터/인공지능, 읽을거리 부문)

(오늘의 짤방: Texas was 4 minutes and 37 seconds from a collapse of the power grid. via @mattlargey)
  1. 빅데이터/인공지능
  2. 읽을거리
EOB

화요일, 2월 23, 2021

[이벤트] 구독자 1,000명 돌파 기념 도서 증정(블록체인 기업으로 가는 길)

구독자 1,000명 돌파를 기념해서 이벤트를 준비했다. 유튜브 애청자 다섯 분을 추첨해 신간을 증정하는 이번 이벤트에 많은 참여 부탁드린다.

여느 때와 마찬가지로 이벤트 응모 방법은 정말 간단하다. 채널 박재호 유튜브 채널을 구독하고 나서 다음 영상에 응원의 댓글을 달면 끝!

  • 이벤트 선물: 블록체인 기업으로 가는 길
  • 이벤트 기간: 2021년 3월 1일(월) 오후 11시까지
    1. 단계 1. 채널 박재호를 구독한다(이미 구독하셨다면 단계 2로…)
    2. 단계 2. 이 방송에 ‘좋아요’를 누르고 응원의 댓글을 단다
  • 이벤트 당첨자(총 다섯 분) 발표는 3월 2일(수) 밤에 유튜브 생방송으로 공개할 예정이다.
EOB

월요일, 2월 22, 2021

[개발자 이야기] (2월 20일) '패배자같은 개발 직무' 탈출법

2021년 2월 20일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.

2021년 2월 20일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 오늘 방송 주요 내용 소개
  • 06:18 델파이 26년!
  • 09:14 ‘노 코드’는 거짓말이다
  • 12:48 '패배자같은 개발 직무' 탈출법
  • 19:24 프로그래밍 관련 자료 집대성한 URL
  • 22:43 현대적인 자바스크립트로 내 사이트를 얼마나 빠르게 만들 수 있을까?
  • 24:26 초급 개발자라면 리액트 역량이 중요하다
  • 28:51 윈도우 캡쳐 도구 ShareX
  • 30:35 개발자들은 코드를 얼마나 자주 되돌릴까?
EOB

토요일, 2월 20, 2021

[B급 프로그래머] 2월 3주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: 헛 아이폰 사파리 브라우저에서 텍스트 검색이 되는구나... 이걸 여태 몰랐는데 아이폰이 노티피케이션으로 팁을 알려줌. 이런게 도움이 될 때도 있군... via @d_ijk_stra)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
(보너스: 라인 개발자들이 직접 뽑은 인생 책은? | 라인개발실록)
EOB

화요일, 2월 16, 2021

[유튜브 방송] (즐겁게 배우는 SQL #50) 윈도우 함수 - 윈도우 함수(2)

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 50편을 공개해드리겠다. 50편은 몇 가지 윈도우 함수를 소개한다.

2021년 2월 16일자 [즐겁게 배우는 SQL #50] 윈도우 함수 - 윈도우 함수(2) 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 윈도우 함수 개괄
  • 01:02 (값) LAST VALUE(정해진 윈도우 프레임 내에서 마지막 행의 값을 반환)
  • 04:55 (값) LEAD(직후에 물리적으로 떨어진 오프셋 값을 가져오기)
  • 08:20 (값) NTH_VALUE(정해진 윈도우 프레임 내에서 N번째 행의 값을 반환)
  • 11:34 (순위) NTILE(순서가 있는 결과 집합을 정해진 버킷에 나눠서 넣기)
  • 14:51 (순위) PERCENT_RANK(순위를 퍼센트로 보여줌)
  • 17:13 (순위) RANK(순위를 보여줌, 중복 가능, 빈 순서 있음)
  • 20:51 (순위) ROW_NUMBER(연속적인 정수를 부여, 중복 불가능)

온라인 실습 사이트는 SQL Online IDE에서 진행하면 되고, 원본 학습자료는 SQLite Window Functions를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 윈도우 함수 개괄
    1. 윈도우 함수는 현재 행을 기준으로 일련의 행 집합에 대해 연산을 수행한다
    2. 집계 함수는 계산 결과를 한 행으로 합치는 특성이 있는 반면에 윈도우 함수는 원래 행을 그대로 유지하는 특성이 있다
    3. 값과 순위를 매기는 함수가 대표적이다.
  • 단계 2: (값) LAST VALUE(정해진 윈도우 프레임 내에서 마지막 행의 값을 반환)
    1. SQL> SELECT Name, printf ( '%.f minutes', Milliseconds / 1000 / 60 ) AS Length, LAST_VALUE ( Name ) OVER ( ORDER BY Milliseconds RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS LongestTrack FROM tracks WHERE AlbumId = 4;
    2. SQL> SELECT AlbumId, Name, printf ( '%.f minutes', Milliseconds / 1000 / 60 ) AS Length, LAST_VALUE ( Name ) OVER ( PARTITION BY AlbumId ORDER BY Milliseconds DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS ShortestTrack FROM tracks;
  • 단계 3: LEAD(직후에 물리적으로 떨어진 오프셋 값을 가져오기)
    1. SQL> CREATE VIEW CustomerInvoices AS SELECT CustomerId, strftime('%Y',InvoiceDate) Year, SUM( total ) Total FROM invoices GROUP BY CustomerId, strftime('%Y',InvoiceDate);
    2. SQL> SELECT * FROM CustomerInvoices ORDER BY CustomerId, Year, Total;
    3. SQL> SELECT CustomerId, Year, Total, LEAD ( Total,1,0 ) OVER ( ORDER BY Year ) NextYearTotal FROM CustomerInvoices WHERE CustomerId = 1;
    4. SQL> SELECT CustomerId, Year, Total, LEAD ( Total,1,0 ) OVER ( PARTITION BY CustomerId ORDER BY Year ) NextYearTotal FROM CustomerInvoices;
  • 단계 4: (값) NTH_VALUE(정해진 윈도우 프레임 내에서 N번째 행의 값을 반환)
    1. SQL> SELECT Name, Milliseconds Length, NTH_VALUE ( name,2 ) OVER ( ORDER BY Milliseconds DESC ) SecondLongestTrack FROM tracks;
    2. SQL> SELECT AlbumId, Name, Milliseconds Length, NTH_VALUE ( Name,2 ) OVER ( PARTITION BY AlbumId ORDER BY Milliseconds DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS SecondLongestTrack FROM tracks;
  • 단계 5: (순위) NTILE(순서가 있는 결과 집합을 정해진 버킷에 나눠서 넣기)
    1. SQL> SELECT Name, Milliseconds, NTILE ( 4 ) OVER ( ORDER BY Milliseconds ) LengthBucket FROM tracks WHERE AlbumId = 1;
    2. SQL> SELECT AlbumId, Name, Milliseconds, NTILE ( 3 ) OVER ( PARTITION BY AlbumId ORDER BY Bytes ) SizeBucket FROM tracks;
  • 단계 6: (순위) PERCENT_RANK(순위를 퍼센트로 보여줌)
    1. SQL> SELECT Name, Milliseconds, PERCENT_RANK() OVER( ORDER BY Milliseconds ) LengthPercentRank FROM tracks WHERE AlbumId = 1;
    2. SQL> SELECT Name, Milliseconds, printf('%.2f',PERCENT_RANK() OVER( ORDER BY Milliseconds )) LengthPercentRank FROM tracks WHERE AlbumId = 1;
    3. SQL> SELECT AlbumId, Name, Bytes, printf('%.2f',PERCENT_RANK() OVER( PARTITION BY AlbumId ORDER BY Bytes )) SizePercentRank FROM tracks;
  • 단계 7: (순위) RANK(순위를 보여줌, 중복 가능, 빈 순서 있음)
    1. SQL> CREATE TABLE RankDemo ( Val TEXT );
    2. SQL> INSERT INTO RankDemo(Val) VALUES('A'),('B'),('C'),('C'),('D'),('D'),('E');
    3. SQL> SELECT * FROM RankDemo;
    4. SQL> SELECT Val, RANK () OVER ( ORDER BY Val ) ValRank FROM RankDemo;
    5. SQL> SELECT Name, Milliseconds, RANK () OVER ( ORDER BY Milliseconds DESC ) LengthRank FROM tracks;
    6. SQL> SELECT Name, Milliseconds, AlbumId, RANK () OVER ( PARTITION BY AlbumId ORDER BY Milliseconds DESC ) LengthRank FROM tracks;
    7. SQL> SELECT * FROM ( SELECT Name, Milliseconds, AlbumId, RANK () OVER ( PARTITION BY AlbumId ORDER BY Milliseconds DESC ) LengthRank FROM tracks ) WHERE LengthRank = 2;
    8. SQL>
  • 단계 8: (순위) ROW_NUMBER(연속적인 정수를 부여, 중복 불가능)
    1. SQL> SELECT ROW_NUMBER () OVER ( ORDER BY Country ) RowNum, FirstName, LastName, country FROM customers;
    2. SQL> SELECT ROW_NUMBER () OVER ( PARTITION BY Country ORDER BY FirstName ) RowNum, FirstName, LastName, country FROM customers;
    3. SQL> SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY FirstName ) RowNum, FirstName, LastName, Country FROM customers ) WHERE RowNum > 20 AND RowNum <= 30
    4. SQL> CREATE VIEW Sales AS SELECT CustomerId, FirstName, LastName, Country, SUM( total ) Amount FROM invoices INNER JOIN customers USING (CustomerId) GROUP BY CustomerId;
    5. SQL> SELECT Country, FirstName, LastName, Amount FROM ( SELECT Country, FirstName, LastName, Amount, ROW_NUMBER() OVER ( PARTITION BY country ORDER BY Amount DESC ) RowNum FROM Sales ) WHERE RowNum = 1;
EOB

월요일, 2월 15, 2021

[유튜브 방송] (즐겁게 배우는 SQL #49) 윈도우 함수 - 윈도우 함수(1)

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 49편을 공개해드리겠다. 49편은 윈도우 함수를 개괄하고 몇 가지 윈도우 함수를 소개한다.

2021년 2월 15일자 [즐겁게 배우는 SQL #49] 윈도우 함수 - 윈도우 함수(1) 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 윈도우 함수 개괄
  • 06:40 (순위) CUME_DIST(누적 분포)
  • 11:41 (순위) DENSE_RANK(순서있는 행들의 집합에서 행의 순위 계산, 빈 순서 없음)
  • 17:00 (값) FIRST_VALUE(정해진 윈도우 프레임 내에서 첫 행의 값을 반환)
  • 22:12 (값) LAG(직전에 물리적으로 떨어진 오프셋 값을 가져오기)

온라인 실습 사이트는 SQL Online IDE에서 진행하면 되고, 원본 학습자료는 SQLite Window Functions를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 윈도우 함수 개괄
    1. 윈도우 함수는 현재 행을 기준으로 일련의 행 집합에 대해 연산을 수행한다
    2. 집계 함수는 계산 결과를 한 행으로 합치는 특성이 있는 반면에 윈도우 함수는 원래 행을 그대로 유지하는 특성이 있다
    3. 값과 순위를 매기는 함수가 대표적이다.
  • 단계 2: (순위) CUME_DIST(누적 분포)
    1. SQL> CREATE TABLE CumeDistDemo( Id INTEGER PRIMARY KEY, value INT );
    2. SQL> INSERT INTO CumeDistDemo(value) VALUES(1000),(1200),(1200),(1400),(2000);
    3. SQL> SELECT Id, Value FROM CumeDistDemo;
    4. SQL> SELECT Value, CUME_DIST() OVER ( ORDER BY value ) CumulativeDistribution FROM CumeDistDemo;
  • 단계 3: (순위) DENSE_RANK(순서있는 행들의 집합에서 행의 순위 계산, 빈 순서 없음)
    1. SQL> CREATE TABLE DenseRankDemo ( Val TEXT );
    2. SQL> INSERT INTO DenseRankDemo(Val) VALUES('A'),('B'),('C'),('C'),('D'),('D'),('E');
    3. SQL> SELECT Val, DENSE_RANK () OVER ( ORDER BY Val ) ValRank FROM DenseRankDemo;
    4. SQL> SELECT AlbumId, Name, Milliseconds, DENSE_RANK () OVER ( PARTITION BY AlbumId ORDER BY Milliseconds ) LengthRank FROM tracks;
  • 단계 4: (값) FIRST_VALUE(정해진 윈도우 프레임 내에서 첫 행의 값을 반환)
    1. SQL> SELECT Name, printf('%,d',Bytes) Size, FIRST_VALUE(Name) OVER ( ORDER BY Bytes ) AS SmallestTrack FROM tracks WHERE AlbumId = 1;
    2. SQL> SELECT AlbumId, Name, printf('%,d',Bytes) Size, FIRST_VALUE(Name) OVER ( PARTITION BY AlbumId ORDER BY Bytes DESC ) AS LargestTrack FROM tracks;
  • 단계 5: (값) LAG(직전에 물리적으로 떨어진 오프셋 값을 가져오기)
    1. SQL> SELECT * FROM CustomerInvoices ORDER BY CustomerId, Year, Total;
    2. SQL> SELECT CustomerId, Year, Total, LAG ( Total,1,0 ) OVER ( ORDER BY Year ) PreviousYearTotal FROM CustomerInvoices WHERE CustomerId = 4;
    3. SQL> SELECT CustomerId, Year, Total, LAG ( Total,1,0 ) OVER ( PARTITION BY CustomerId ORDER BY Year ) PreviousYearTotal FROM CustomerInvoices;
EOB

[개발자 이야기] (2월 13일) 라인개발자들이 직접 뽑은 인생 책은?

2021년 2월 13일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.

2021년 2월 13일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 오늘 방송 주요 내용 소개
  • 04:18 AWS 새로운 T4g 인스턴스 무료 사용하기
  • 07:21 MVP vs PoC
  • 10:10 라인개발자들이 직접 뽑은 인생 책은?
  • 11:55 코드로 배우는 스프링부트 프로젝트
  • 13:08 Dependency가 많은 프로젝트의 스케줄 관리 방법
  • 15:20 DGS: GraphQL for SpringBoot by 넷플릭스
  • 17:21 크롬에서 안 쓰는 탭을 쉬게 만들려면?
  • 18:49 sqlite를 상용 환경에서 사용하면 안 된다고?
EOB

토요일, 2월 13, 2021

[B급 프로그래머] 2월 2주 소식(빅데이터/인공지능, 읽을거리 부문)

(오늘의 짤방: 디자인 과정은 워터폴모델처럼 선형적으로 한 방향으로 나아가는게 아니라 문제 정의와 해결, 추상과 구체, 개발과 학습 상태를 왔다갔다 반복합니다. via @taekie)
  1. 빅데이터/인공지능
  2. 읽을거리
보너스: 코인마켓캡의 0순위가... via @jrogue
EOB

수요일, 2월 10, 2021

[유튜브 방송] (즐겁게 배우는 SQL #48) 트리거 - INSTEAD OF 트리거

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 48편을 공개해드리겠다. 48편은 INSTEAD OF 트리거를 소개한다.

2021년 2월 10일자 [즐겁게 배우는 SQL #48] 트리거 - INSTEAD OF 트리거 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 INSTEAD OF 트리거 기본 형식
  • 01:03 INSTEAD OF 트리거 예제

원본 학습자료는 SQLite INSTEAD OF Triggers를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: INSTEAD OF 트리거 기본 형식
    CREATE TRIGGER [IF NOT EXISTS] schema_ame.trigger_name
        INSTEAD OF [DELETE | INSERT | UPDATE OF column_name]
        ON table_name
    BEGIN
        -- insert code here
    END;
    
  • 단계 2: INSTEAD OF 트리거 예제
    1. SQL> CREATE VIEW AlbumArtists( AlbumTitle, ArtistName ) AS SELECT Title, Name FROM Albums INNER JOIN Artists USING (ArtistId);
    2. SQL> SELECT * FROM AlbumArtists;
    3. SQL> INSERT INTO AlbumArtists(AlbumTitle,ArtistName) VALUES('Who Do You Trust?','Papa Roach');
    4. SQL> CREATE TRIGGER insert_artist_album_trg INSTEAD OF INSERT ON AlbumArtists BEGIN INSERT INTO Artists(Name) VALUES(NEW.ArtistName); INSERT INTO Albums(Title, ArtistId) VALUES(NEW.AlbumTitle, last_insert_rowid()); END;
    5. SQL> INSERT INTO AlbumArtists(AlbumTitle,ArtistName) VALUES('Who Do You Trust?','Papa Roach');
    6. SQL> SELECT * FROM Artists ORDER BY ArtistId DESC;
    7. SQL> SELECT * FROM Albums ORDER BY AlbumId DESC;
EOB

화요일, 2월 09, 2021

[유튜브 방송] (즐겁게 배우는 SQL #47) 트리거 - 트리거

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 47편을 공개해드리겠다. 47편은 트리거를 소개한다.

2021년 2월 9일자 [즐겁게 배우는 SQL #47] 트리거 - 트리거 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 트리거 기본 형식
  • 07:13 BEFORE INSERT 트리거 예제
  • 13:03 AFTER UPDATE 트리거 예제
  • 17:47 트리거 제거 예제

원본 학습자료는 SQLite Trigger를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 트리거 기본 형식
    CREATE TRIGGER [IF NOT EXISTS] trigger_name 
       [BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE] 
       ON table_name
       [WHEN condition]
    BEGIN
     statements;
    END;
    
  • 단계 2: BEFORE INSERT 트리거 예제
    1. SQL> CREATE TABLE leads ( id integer PRIMARY KEY, first_name text NOT NULL, last_name text NOT NULL, phone text NOT NULL, email text NOT NULL, source text NOT NULL );
    2. SQL> CREATE TRIGGER validate_email_before_insert_leads BEFORE INSERT ON leads BEGIN SELECT CASE WHEN NEW.email NOT LIKE '%_@__%.__%' THEN RAISE (ABORT,'Invalid email address') END; END;
    3. SQL> INSERT INTO leads (first_name,last_name,email,phone) VALUES('John','Doe','jjj','4089009334');
    4. SQL> INSERT INTO leads (first_name, last_name, email, phone) VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');
    5. SQL> INSERT INTO leads (first_name, last_name, email, phone, source) VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334', 'company');
    6. SQL> SELECT * FROM leads;
  • 단계 3: AFTER UPDATE 트리거 예제
    1. SQL> CREATE TABLE lead_logs ( id INTEGER PRIMARY KEY, old_id int, new_id int, old_phone text, new_phone text, old_email text, new_email text, user_action text, created_at text );
    2. SQL> CREATE TRIGGER log_contact_after_update AFTER UPDATE ON leads WHEN old.phone <> new.phone OR old.email <> new.email BEGIN INSERT INTO lead_logs ( old_id, new_id, old_phone, new_phone, old_email, new_email, user_action, created_at ) VALUES ( old.id, new.id, old.phone, new.phone, old.email, new.email, 'UPDATE', DATETIME('NOW') ); END;
    3. SQL> UPDATE leads SET last_name = 'Smith' WHERE id = 1;
    4. SQL> UPDATE leads SET phone = '4089998888', email = 'john.smith@sqlitetutorial.net' WHERE id = 1;
    5. SQL> SELECT old_phone, new_phone, old_email, new_email, user_action FROM lead_logs;
  • 단계 4: 트리거 제거 예제
    1. SQL> DROP TRIGGER validate_email_before_insert_leads;
EOB

월요일, 2월 08, 2021

[유튜브 방송] (즐겁게 배우는 SQL #46) 색인 - 표현식 기반의 색인

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 46편을 공개해드리겠다. 46편은 표현식 기반의 색인을 소개한다.

2021년 2월 8일자 [즐겁게 배우는 SQL #46] 색인 - 표현식 기반의 색인 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 표현식 기반의 색인 예제
  • 03:21 표현식 기반의 색인 동작 원리
  • 05:29 표현식 기반의 색인 제약

원본 학습자료는 SQLite Expression-based Index를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 표현식 기반의 색인 예제
    1. SQL> SELECT customerid, company FROM customers WHERE length(company) > 10 ORDER BY length(company) DESC;
    2. SQL> EXPLAIN QUERY PLAN SELECT customerid, company FROM customers WHERE length(company) > 10 ORDER BY length(company) DESC;
    3. SQL> CREATE INDEX customers_length_company ON customers(LENGTH(company));
    4. SQL> EXPLAIN QUERY PLAN SELECT customerid, company FROM customers WHERE length(company) > 10 ORDER BY length(company) DESC;
  • 단계 2: 표현식 기반의 색인 동작 원리
    1. SQL> CREATE INDEX invoice_line_amount ON invoice_items(unitprice*quantity);
    2. SQL> EXPLAIN QUERY PLAN SELECT invoicelineid, invoiceid, unitprice*quantity FROM invoice_items WHERE quantity*unitprice > 10;
    3. SQL> EXPLAIN QUERY PLAN SELECT invoicelineid, invoiceid, unitprice*quantity FROM invoice_items WHERE unitprice*quantity > 10;
EOB

[개발자 이야기] (2월 6일) 7년 차 SI 개발자가 솔루션 회사 이직 후 2년 간 배운 것

2021년 2월 6일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.

2021년 2월 6일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 오늘 방송 주요 내용 소개
  • 06:06 리눅스 아재력 or 할배력 셀프 테스트
  • 10:55 구글 검색 없이 기초적인 웹 앱을 만들 수 있을까?
  • 14:24 크롬 89 베타에서 개선된 사항
  • 16:47 2021년도에 눈여겨볼 Top 10 VSCode 확장
  • 20:03 IT 업계 ‘아무말 대잔치’··· 오남용 심한 유행어 10선
  • 24:09 7년 차 SI 개발자가 솔루션 회사 이직 후 2년 간 배운 것
  • 32:47 2021년 미국 최고 직업은 자바 개발자
  • 34:55 내 서버를 어디에 둬야 가장 빠를까?
EOB

토요일, 2월 06, 2021

[B급 프로그래머] 2월 1주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: via @dabit3)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스 EOB

금요일, 2월 05, 2021

[유튜브 방송] (즐겁게 배우는 SQL #45) 색인 - 색인

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 45편을 공개해드리겠다. 45편은 색인을 거는 방법을 소개한다.

2021년 2월 5일자 [즐겁게 배우는 SQL #45] 색인 - 색인 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 색인 개념과 색인 생성 기본 형식
  • 04:13 단일 컬럼 색인 생성
  • 10:04 다중 컬럼 색인 생성
  • 14:05 색인 확인
  • 15:59 색인 제거

원본 학습자료는 SQLite Index를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 색인 개념과 색인 생성 기본 형식
    CREATE [UNIQUE] INDEX index_name 
    ON table_name(column_list);
    
  • 단계 2: 단일 컬럼 색인 생성
    1. SQL> CREATE TABLE contacts ( first_name text NOT NULL, last_name text NOT NULL, email text NOT NULL );
    2. SQL> CREATE UNIQUE INDEX idx_contacts_email ON contacts (email);
    3. SQL> INSERT INTO contacts (first_name, last_name, email) VALUES('John','Doe','john.doe@sqlitetutorial.net');
    4. SQL> INSERT INTO contacts (first_name, last_name, email) VALUES('Johny','Doe','john.doe@sqlitetutorial.net');
    5. SQL> INSERT INTO contacts (first_name, last_name, email) VALUES('David','Brown','david.brown@sqlitetutorial.net'), ('Lisa','Smith','lisa.smith@sqlitetutorial.net');
    6. SQL> SELECT first_name, last_name, email FROM contacts WHERE email = 'lisa.smith@sqlitetutorial.net';
    7. SQL> EXPLAIN QUERY PLAN SELECT first_name, last_name, email FROM contacts WHERE email = 'lisa.smith@sqlitetutorial.net';
  • 단계 3: 다중 컬럼 색인 생성
    1. SQL> CREATE INDEX idx_contacts_name ON contacts (first_name, last_name);
    2. SQL> EXPLAIN QUERY PLAN SELECT first_name, last_name, email FROM contacts WHERE first_name = 'John';
    3. SQL> EXPLAIN QUERY PLAN SELECT first_name, last_name, email FROM contacts WHERE first_name = 'John' AND last_name = 'Doe';
    4. SQL> EXPLAIN QUERY PLAN SELECT first_name, last_name, email FROM contacts WHERE last_name = 'Doe';
    5. SQL> EXPLAIN QUERY PLAN SELECT first_name, last_name, email FROM contacts last_name = 'Doe' OR first_name = 'John';
    6. SQL>
  • 단계 4: 색인 확인
    1. SQL> PRAGMA index_list('contacts');
    2. SQL> PRAGMA index_info('idx_contacts_name');
    3. SQL> SELECT type, name, tbl_name, sql FROM sqlite_master WHERE type= 'index';
  • 단계 5: 색인 제거
    1. SQL> DROP INDEX idx_contacts_name;
    2. SQL> PRAGMA index_list('contacts');
    3. SQL> PRAGMA index_info('idx_contacts_name');
    4. SQL> DROP INDEX idx_contacts_email;
    5. SQL> PRAGMA index_list('contacts');
    6. SQL> PRAGMA index_info('idx_contacts_email');
EOB

목요일, 2월 04, 2021

[유튜브 방송] (즐겁게 배우는 SQL #44) 뷰 - 뷰 제거

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 44편을 공개해드리겠다. 44편은 뷰 제거 방법을 소개한다.

2021년 2월 4일자 [즐겁게 배우는 SQL #44] 뷰 - 뷰 제거 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 뷰 제거 기본 형식
  • 01:19 뷰 제거 예제

원본 학습자료는 SQLite DROP VIEW를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 뷰 제거 기본 형식
    DROP VIEW [IF EXISTS] [schema_name.]view_name;
    
  • 단계 2: 뷰 제거 예제
    1. SQL> CREATE VIEW v_billings ( invoiceid, invoicedate, total ) AS SELECT invoiceid, invoicedate, sum(unitprice * quantity) FROM invoices INNER JOIN invoice_items USING ( invoiceid );
    2. SQL> SELECT * FROM v_billings;
    3. SQL> DROP VIEW v_billings;
EOB

화요일, 2월 02, 2021

[유튜브 방송] (즐겁게 배우는 SQL #43) 뷰 - 뷰 생성

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 43편을 공개해드리겠다. 43편은 뷰 생성 방법을 소개한다.

2021년 2월 2일자 [즐겁게 배우는 SQL #43] 뷰 - 뷰 생성 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 뷰 생성 기본 형식
  • 05:52 복잡한 질의를 단순화하기 위한 뷰 생성
  • 09:38 전용 컬럼 이름을 제공하기 위한 뷰 생성

원본 학습자료는 SQLite Create View를 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1:뷰 생성 기본 형식
    CREATE [TEMP] VIEW [IF NOT EXISTS] view_name[(column-name-list)]
    AS 
       select-statement;
    
  • 단계 2: 복잡한 질의를 단순화하기 위한 뷰 생성
    1. SQL> SELECT trackid, tracks.name, albums.Title AS album, media_types.Name AS media, genres.Name AS genres FROM tracks INNER JOIN albums ON Albums.AlbumId = tracks.AlbumId INNER JOIN media_types ON media_types.MediaTypeId = tracks.MediaTypeId INNER JOIN genres ON genres.GenreId = tracks.GenreId;
    2. SQL> CREATE VIEW v_tracks AS SELECT trackid, tracks.name, albums.Title AS album, media_types.Name AS media, genres.Name AS genres FROM tracks INNER JOIN albums ON Albums.AlbumId = tracks.AlbumId INNER JOIN media_types ON media_types.MediaTypeId = tracks.MediaTypeId INNER JOIN genres ON genres.GenreId = tracks.GenreId;
    3. SQL> SELECT * FROM v_tracks;
  • 단계 3: 전용 컬럼 이름을 제공하기 위한 뷰 생성
    1. SQL> CREATE VIEW v_albums ( AlbumTitle, Minutes ) AS SELECT albums.title, SUM(milliseconds) / 60000 FROM tracks INNER JOIN albums USING ( AlbumId ) GROUP BY albums.title;
    2. SQL> SELECT * FROM v_albums;
EOB

월요일, 2월 01, 2021

[개발자 이야기] (1월 30일) 정말로 당신에게 다른 동영상 강의가 필요할까?

2021년 1월 30일자 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 재미있는 개발 이야기(w/ 허광남-박재호)에서 확인할 수 있다.

2021년 1월 30일자 방송 스크립트는 전체 공개되어 있으며, 슬라이드셰어에서 보거나 다운로드 받을 수도 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 오늘 방송 주요 내용 소개
  • 06:59 timeflake - 어느 정도 정렬된 UUID
  • 10:07 정말로 당신에게 다른 동영상 강의가 필요할까?
  • 17:51 마이크로서비스를 써야할 때, 쓰지 말아야 할 때
  • 24:09 소프트웨어를 구매하기 위해 사용 가능한 네 가지 통화
  • 29:52 AWS 람다는 왜 그렇게 빠르게 구동될까?
  • 33:13 30살 비개발자가 3개월만에 풀스택 개발을 하기까지..
  • 35:49 맥에서 윈도우로 가져온 파일명이 자모 분리된 경우 해법
EOB