반응형
반응형

자동 증가 형식 (serial 등)

 

PosgtreSQL에서 사용할 수 있는 데이터 형에서 자동 증가 타입의 사용법에 대해 설명하겠다. 자동 증가 타입으로 설정한 컬럼은 자동으로 연속 값이 저장된다. 자동 증가 타입은 smallserial, serial, bigserial의 3 가지 유형의 데이터가 존재한다.

자동 증가 형식

연번 형은 취급 숫자의 범위가 다른 3 가지 데이터 유형이 있다.

형식크기범위별칭

smallserial 2 바이트 1~32767 serial2
serial 4 바이트 1~2147483647 serial4
bigserial 8 바이트 1~9223372036854775807 serial8

자동 증가 타입이 설정된 컬럼이 포함된 테이블에 데이터를 추가를 하면, 자동 증가 타입의 컬럼에 직접 값을 지정하는 것이 아니라 기본값이 포함되도록 한다. 그러면 자동으로 지금까지 등록된 값보다 큰 값(일반적으로 1 큰 값)이 자동으로 저장된다. (MySQL에서 말하는 컬럼에 AUTO_INCREMENT를 설정 한 것과 비슷하다)

※ 자동 증가 형식은 내부적으로 시퀀스를 이용하여 구현되어 있다.


자동 증가 타입이 설정된 컬럼에 값을 지정하여 데이터를 추가

자동 증가 타입이 설정된 컬럼에 따로 지정하지 않으면 디폴트 값으로 자동으로 연속적인 값이 저장되지만, 임의의 값을 지정하여 데이터를 추가 할 수도 있다.

현재 4개의 데이터를 추가한 상태에 다음 데이터를 추가하게 되면, 자동 증가 타입이 설정된 id 컬럼에 다음 디폴트 값인 5가 저장된다.

여기서 id 컬럼에 값을 지정하여 데이터를 추가 할 수 있다.

 

mydb=# insert into myfriends values (7, 'Yunjo', 'Paris');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
(5개 행)

-- 데이터를 추가한 후 테이블에서 데이터를 검색해 보면 지정한 값이 그대로 저장되어 있다. 
   이와 같이 자동 증가 타입이 설정된 컬럼에도 값을 지정하여 데이터를 추가 할 수 있다.
-- 여기에서 다시 id 컬럼에 지정하지 않고 디폴트값으로 데이터를 추가하면, 
   id 컬럼에 무슨 값이 들어가는지 확인하려고 한다.

mydb=# insert into myfriends (name, address) values ('Sueun', 'Yongin');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
(6개 행)

-- 데이터를 추가한 후에 테이블에서 데이터를 검색해 보면, 
   id 컬럼은 원래 다음으로 들어가려던 5가 저장된다.
-- 그럼, id 컬럼에 디폴트 값이 포함되도록 2개의 데이터를 더 추가해 보자.

mydb=# insert into myfriends (name, address) values ('Hansol', 'Seocho'), ('Yujin', 'Unknown');
INSERT 0 2
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
  6 | Hansol  | Seocho
  7 | Yujin   | Unknown
(8개 행)

-- id 컬럼에는 이전 저장된 값 5 다음으로 6과 7이 저장되어 있다. 
   이미 id 컬럼에 7이라는 값이 저장된 데이터를 수동으로 추가되었지만, 
   중복된 값이 있는지와는 상관없이 연속적인 값이 저장이 되었다.
-- 이와 같이 자동 증가 타입이 설정된 컬럼에 값을 지정하여 데이터를 추가 할 수도 있지만, 
   그 데이터는 자동으로 저장되는 값으로 반영되지 않는다는 점을 주의가 필요하다.


.

 

* http://www.devkuma.com/books/pages/1444 

반응형
반응형

⦿ 일(一) 1

⦿ 십(十) 10

⦿ 백(百) 100

⦿ 천(千) 1000

⦿ 만(萬) 10000    십만,백만,천만

⦿ 억(億) 10의 8제곱 (1만의 1만배)  십억,백억,천억

⦿ 조(兆) 10의 12제곱 (1억의 1만배)  십조,백조,천조

⦿ 경(京) 10의 16제곱 (1조의 1만배)  십경,백경,천경

⦿ 해(垓) 10의 20제곱 (1경의 1만배)  십해,백해,천해

⦿ 자      10의 24제곱 (1해의 1만배)  십자,백자,천자

⦿ 양(穰) 10의 28제곱 (1자의 1만배)  십양,백양,천양

⦿ 구(溝) 10의 32제곱 (1양의 1만배)  십구,백구,천구

⦿ 간(澗) 10의 36제곱 (1구의 1만배)  십간,백간,천간

⦿ 정(正) 10의 40제곱 (1간의 1만배)  십정,백정,천정

⦿ 재(載) 10의 44제곱 (1정의 1만배)  십재,백재,천재

⦿ 극(極) 10의 48제곱 (1재의 1만배)  십극,백극,천극

⦿ 항하사(恒河沙) 10의 56제곱 (1극의 1억배)  십항하사,백항하사,천항하사,

                                  만항하사,십만항하사,백만항하사,천만항하사

⦿ 아승지(阿僧祇) 10의 64제곱 (1항하사의 1억배) 십아승지,백아승지,천아승지,

                                    만아승지,십만아승지,백만아승지,천만아승지

⦿ 나유타(那由他) 10의 72제곱 (1아승기의 1억배) 십나유타,백나유타,천나유타,

                                    만나유타,십만나유타,백만나유타,천만나유타

⦿ 불가사의(不可思議) 10의 80제곱 (1나유타의 1억배) 십불가사의,백불가사의,

     천불가사의, 만불가사의,십만불가사의,백만불가사의,천만불가사의

⦿ 무량대수(無量大壽) 10의 88제곱 (1불가사의의1억배) 십무량대수,백무량대수,

          천무량대수,만무량대수,십만무량대수,백만무량대수,천만무량대수

      그러다가 세고 또  세고 하여 늙고 지쳐서 더 이상 못 세고, 셀 수 없다면

⦿ 무한대(無限大) 셀 수없는 많은수

반응형
반응형

Pizza As A Service 2.0 By Paul Kerrison

https://www.ami.com/tech-blog/pizza-as-a-service-20-by-paul-kerrison/

 

Pizza as a Service 2.0 by Paul Kerrison

Pizza as a Service 2.0 by Paul Kerrison Recently I was trying to describe the various types of cloud services available for modern IT deployment. Like

www.ami.com

Now for the justifications…

  • On-Premises – like a homemade pizza, made from scratch, you do everything yourself (no change so far). Example: Datacentre
  • Infrastructure as a Service – You share a kitchen with others. The utilities and oven are provided, but you make and cook the pizza yourself. Example: EC2
  • Containers as a Service – You bring the pizzas but someone else uses their facilities and cooks the pizza for you. Example: ECS
  • Platform as a Service – You order a pizza for collection, the pizzeria make and cook the pizza using their facilities. Example: App Engine
  • Function as a Service – You go to a pizzeria with some friends. You order and then eat pizza made by the restuarant. You order drinks from the bar and they’re made for you. Example: AWS Lambda
  • Software as a Service – You go to someone’s house for a party, they provide the pizza and invite others round for you to meet. Conversation with the guests is still your responsibility! Example: Gmail

For the more technically minded, I’ve added the levels of abstraction at the side so you can see what I was thinking from an actual implementation point of view. The one that’s probably slightly contentious is the scaling level. I was trying to use this to highlight the difference between PaaS and Faas ie with PaaS you still have to worry about how to manage scaling Eg how many dynos (Heroku) do you want to run.

반응형
반응형

KB4023057 - RDP Wrapper 10.0.19041.1202 #1509

https://github.com/stascorp/rdpwrap/issues/1509

 

KB4023057 - RDP Wrapper 10.0.19041.1202 · Issue #1509 · stascorp/rdpwrap

2021-08 Update for Windows 10 Version 21H1 for x64-based Systems (KB4023057) 10.0.19041.1081 and 10.0.19041.1202 use the same settings. Append these to your rdpwrapper.ini file. [10.0.19041.1081] L...

github.com

2021-08 Update for Windows 10 Version 21H1 for x64-based Systems (KB4023057)

10.0.19041.1081 and 10.0.19041.1202 use the same settings. Append these to your rdpwrapper.ini file.

[10.0.19041.1081]
LocalOnlyPatch.x64=1
LocalOnlyOffset.x64=89D81
LocalOnlyCode.x64=jmpshort
SingleUserPatch.x64=1
SingleUserOffset.x64=0CB26
SingleUserCode.x64=Zero
DefPolicyPatch.x64=1
DefPolicyOffset.x64=19105
DefPolicyCode.x64=CDefPolicy_Query_eax_rcx
SLInitHook.x64=1
SLInitOffset.x64=1E98C
SLInitFunc.x64=New_CSLQuery_Initialize

[10.0.19041.1081-SLInit]
bInitialized.x64 =107108
bServerSku.x64 =10710C
lMaxUserSessions.x64 =107110
bAppServerAllowed.x64 =107118
bRemoteConnAllowed.x64=107120
bMultimonAllowed.x64 =107124
ulMaxDebugSessions.x64=107128
bFUSEnabled.x64 =10712C

[10.0.19041.1202]
LocalOnlyPatch.x64=1
LocalOnlyOffset.x64=89D81
LocalOnlyCode.x64=jmpshort
SingleUserPatch.x64=1
SingleUserOffset.x64=0CB26
SingleUserCode.x64=Zero
DefPolicyPatch.x64=1
DefPolicyOffset.x64=19105
DefPolicyCode.x64=CDefPolicy_Query_eax_rcx
SLInitHook.x64=1
SLInitOffset.x64=1E98C
SLInitFunc.x64=New_CSLQuery_Initialize

[10.0.19041.1202-SLInit]
bInitialized.x64 =107108
bServerSku.x64 =10710C
lMaxUserSessions.x64 =107110
bAppServerAllowed.x64 =107118
bRemoteConnAllowed.x64=107120
bMultimonAllowed.x64 =107124
ulMaxDebugSessions.x64=107128
bFUSEnabled.x64 =10712C
반응형
반응형

proactive & Reactive

 

  1. Reactive
    1. 조건반사적 반응 행동을 말한다.
    2. 외부 자극으로부터 조건반사적이고 즉각적인 반응 행동
    3. ACTION without STOP, THINK & CHOICE  https://blog.naver.com/candlite/221090540845
  2. Proactive
    1. 주도적이라는 뜻
    2. 내면의 욕구로부터의 단계적인 반응 행동
    3. ACTION after STOP, THONK & CHOICE
  3. STC : Stop, Think & Choice

Reactice 

 - 클라이언트가 먼저 찾아오고, 우리는 이에 대한 대응을 하면, 이건 Reactive

 

Proactive

 - 클라이언트는 가만히 있는데 우리가 먼저 딜을 위해 다가가면, 이건 Proactive

 

https://www.gnapartners.com/resources/articles/benefits-of-proactive-versus-reactive-policies

 

반응형
반응형

https://golang.org/

 

The Go Programming Language

Download Go Binary distributions available for Linux, macOS, Windows, and more. // You can edit this code! // Click here and start typing. package main import "fmt" func main() { fmt.Println("Hello, 世界") } Hello, World! Conway's Game of Life Fibonacci

golang.org

https://www.s-core.co.kr/insight/view/%EB%AC%BC%EC%96%B4%EB%B3%B4%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%9D%B4-%EB%A7%8E%EC%95%84%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4-go%EC%96%B8%EC%96%B4/

 

에스코어

에스코어는 디지털 혁신을 위한 고급 프로페셔널 서비스를 제공합니다. 매니지먼트 컨설팅과 소프트웨어 테크놀로지 서비스 오퍼링을 살펴보세요.

www.s-core.co.kr

 

개발자가 배우고 싶어하는 프로그래밍 언어로 항상 높은 순위에 오르는 Go 언어, 주위 동료들로부터 어떤 장점이 있는지 궁금하다는 질문을 많이 받아서 정리해보았습니다.

Go 언어가 개발되기전 구글(Google)의 인프라 소프트웨어는 대부분 C++로 작성하고 있었습니다. 수천명의 프로그래머들이 개발에 참여하였고 매일 업데이트가 필요한 상황이었습니다. 분산 빌드 시스템이 잘 갖춰져 있었지만 서버 하나를 빌드 하는데 45분이나 걸렸습니다. 반복되는 긴 컴파일 시간에 지친 구글 엔지니어 세명이 웹 서버와 같은 대규모 프로그램을 개발하는데 적합한 언어를 만들어 보겠다고 나서면서 Go 언어의 첫 스케치가 시작되었습니다.

C++의 복잡함과 긴 컴파일 시간을 줄일 수 있는 간결한 언어, 또한 사용자가 배우기 쉬운 언어를 만들어보자는 취지로 2007년 첫 삽을 뜬 Go 언어는 2009년 11월에 리눅스와 맥OS 플랫폼을 대상으로 공식 발표됩니다. 2012년 3월에는 정식 버전(v1.0)을 선보였고 이후 개선을 거듭해 2020년 12월 현재 1.15 버전이 릴리즈 되어 있습니다. 세상에 나온 지 10년이 조금 넘은 지금, Go 언어는 컨테이너와 클라우드 환경 구축에 없어선 안될 도커(Docker) 및 쿠버네티스(Kubernetes)를 비롯해 이더리움(Ethereum) 블록체인의 메인 클라이언트 Geth의 개발에 사용되는 등 성능과 안정성을 인정받으며 시장 입지를 다지고 있습니다.

 

간결한 문법, 빠른 컴파일

Go 언어는 시스템 프로그래밍에 적합하도록 설계되었으며 C와 구문이 비슷합니다. 이는 대부분의 컴퓨터공학 전공자들이 C 언어를 배울뿐더러 기존 시스템 프로그래밍 영역에서 C와 C++이 많이 사용되었기 때문에 개발자들이 새로운 언어에서 빠르게 생산성을 발휘할 수 있도록 하기 위함입니다. Go 언어는 C 와 비슷하지만 키워드가 25개로 C(37개), C++ 11(84개)에 비해 간결합니다. C와 C++의 복잡한 요소를 최대한 줄이고 간결하게 만들어져 C 언어에 경험이 있는 개발자라면 쉽게 배울 수 있습니다.

Go 언어는 C와 구문은 비슷하지만 복잡도를 낮추고 컴파일 속도 향상을 위해 기존에 사용하던 헤더 파일을 정의하는 방식 대신 소스 자체를 패키지화하는 방식을 채택했습니다. 소스 코드 자체를 패키지화하여 변경된 부분만 컴파일 함으로써 컴파일 속도를 향상시켰습니다.

또한 Go 언어는 소스 내에 사용하지 않는 변수나 패키지가 있을 경우 컴파일 시 오류를 발생합니다. 불필요한 패키지 가져오기에 따른 지연 시간을 줄이고 사용하지 않는 변수 및 패키지 선언으로 인해 향후에 발생할 수 있는 버그를 줄이고자 함입니다.

 

풍부한 기능, 유틸리티 제공

Go 언어는 개발자의 생산성 향상에 초점을 두고 설계되어 기존 개발자들이 사용하던 IDE(Integrated Development Environment)에서 쉽게 환경을 구성할 수 있습니다. 공식 홈페이지(www.golang.org)에서 Go 언어로 작성된 파일을 컴파일·실행·관리할 수 있는 go 바이너리를 다운로드하고 소수의 환경변수 $GOROOT, $GOPATH($GOPATH를 $PATH에 추가)를 설정하는 것만으로 개발 환경을 구성할 수 있습니다. 다운로드 받은 유틸리티 go 파일은 Go 언어로 작성한 소스파일을 컴파일(build) 하여 실행 가능한 바이너리를 생성하는 것은 물론, 컴파일 후 바로 실행(run)하는 기능을 제공합니다.

Go 언어는 소스에 기술된 패키지 단위로 관리되며 Go 소스로 작성할 수도 있고 이미 정의되어 있는 패키지를 import 문으로 가져와서 사용할 수 있습니다. 필요한 외부 패키지가 있을 경우엔 get 커맨드로 패키지를 받아와 사용합니다.

그 외에도 Go 소스 파일의 형식을 맞춰주는 포맷팅(fmt), 사용되는 패키지 리스트업(list), 테스트 코드 수행 등 Go 언어로 패키지를 작성 및 사용하기 위한 여러 가지 기능을 제공합니다.

 

다양한 패키지

Go 언어는 기본 패키지 이외에도 여러 벤더에서 다양한 패키지를 제공하고 있습니다. 개발자는 이를 활용하여 쉽게 애플리케이션 개발할 수 있습니다. 시스템 프로그램에 자주 사용되는 http 패키지는 물론 통신에 필요한 암호화 모듈까지 기본 내장되어 있어 웹 서버를 쉽게 구축할 수 있습니다. 예를 들어 “hello GO”를 출력하는 웹 서버는 다음과 같이 단 몇 줄로 구현이 가능합니다.

또한 Go 소스 내에 cgo라는 별도 지시자(directives)를 설정함으로써 C 언어로 작성된 라이브러리를 직접 사용하는 것도 가능합니다. 이러한 강점 때문에 기존 인프라 소프트웨어를 대체할 수 있는 언어로 선택되며 대표적인 예로 SSH의 Go 언어 구현체인 텔레포트(Teleport)가 있습니다.

 

동시성(Concurrency)

Go 언어는 시스템 프로그램, 특히 서버 개발용으로 설계되었습니다. 기존에 서버 개발에 널리 사용되던 C, C++, Java는 멀티 코어, 네트워킹 및 웹 애플리케이션 개발이 활발히 이뤄지기 전에 만들어진 언어들이라 사용하기 어렵거나 기능이 제한적이었습니다. Go 언어는 이러한 클라이언트가 있는 웹 서버를 실행하는 멀티 코어 환경에 맞추어 쉽게 프로그래밍할 수 있도록 고루틴(goroutine)과 채널(channel)을 제공합니다. 고루틴은 Go 런타임에서 관리되는 일종의 경량 스레드이며 채널을 통해 고루틴 간에 메시지를 주고 받을 수 있는 매커니즘을 제공합니다. 고루틴과 채널을 활용해 멀티 코어 환경에서 병렬처리를 쉽게 구현할 수 있습니다.

고루틴은 자체 Go 런타임 스케줄러에 의해 관리되며 OS 스레드에 비해서도 경량입니다. OS 스레드를 생성하는데 필요한 메모리가 1MB인 반면, 고루틴은 2KB입니다. 또한 일반 스레드와 달리 메모리의 스택 영역을 사용하며 자체 스케줄러에 의해 관리하므로 컨텍스트 스위칭 비용을 줄입니다. 여기에 Go 런타임에서 사용하는 CPU 코어 수를 지정하는 환경 변수 GOMAXPROC를 지정함으로써 병렬적으로 고루틴을 실행할 수 있습니다. 하나의 프로세스에서 보통 1만개의 고루틴을 실행시킬 수 있으며 몇십만 단위의 고루틴도 실행 가능하도록 스케줄러가 구현되어 있습니다.(스택 메모리가 부족하면 힙영역까지 확장)

 

에러 처리, 함수 흐름 제어

Go 언어는 에러 처리에 있어서 기존의 try-catch-finally 형식이 코드가 복잡하고 읽기 어려워진다고 판단했습니다. 기존 C, C++은 반환되는 값 하나만으로 에러 케이스를 분석하고 그에 따른 조치를 취해야 했기에 흔히 발생하는 에러 케이스를 공통 모듈화 하는 과정에서 상세 정보가 누락되는 일도 많았습니다.

Go 언어에서 함수는 복수 개의 값을 반환할 수 있습니다. 이를 통해 에러가 발생했을 때 일반적인 리턴과 함께 오류 메시지를 반환할 수 있고 이 기능은 에러 처리를 쉽게 합니다. 예를 들어 Go 기본 패키지 os의 Write 함수는 다음과 같이 정의되며 write에 성공한 바이트 수와 에러 메시지를 함께 반환합니다.(Go 언어에서 함수 선언 시 반환 값은 제일 마지막에 변수명, 타입 순으로 정의합니다.)

Go 언어는 200바이트 데이터를 파일에 쓰게 했을 때 “100바이트는 성공적으로 쓰였지만 공간이 없어서 나머지는 실패했다”라는 상황을 감지할 수 있습니다.

복수 개의 반환을 통해 에러를 감지하더라도 어떤 에러는 발생할 경우 더 이상 프로세스가 실행되는 것이 의미가 없어질 수 있으며 이 때 Go 언어는 패닉(panic)을 발생시켜 에러 후 종료하는 것을 권고합니다. 프로그램이 패닉을 만나면 현재 함수의 실행을 즉시 중지하고 실행 중인 스택 상의 고루틴을 하나씩 종료합니다. 고루틴이 모두 종료되면 최종적으로 프로그램이 종료됩니다. 단, 고루틴 내에서 발생한 에러에 대해 조치 후 정상 복구가 가능한 경우에는 고루틴 종료 전에 호출되는 recover 함수에 조치 사항을 정의함으로써 프로그램 자체를 종료하지 않고 정상 재개할 수 있습니다.

recover문과 비슷하게 Go 언어의 defer문은 함수가 종료되기 직전에 수행되는 문장으로 함수 내에서 사용한 리소스 반환 처리와 같은 상황에 유용합니다. 사용되는 리소스를 생성하고 defer문으로 반환 처리를 예약하면 이후에 생길 에러 상황에서 프로그램이 종료되더라도 리소스 해제 누락을 막을 수 있습니다.

 

제약 사항

작고 이해하기 쉬울 뿐만 아니라 기존 인프라 소프트웨어를 대체할 수 있을 만큼 강력한 Go 언어지만 설계 철학에 어긋나는 제네릭(Generic) 같은 일부 기능은 의도적으로 빠졌습니다. 그 외에 C 구문을 따랐다고 하지만 포인터 연산을 없앤 점 등 C와 다른 부분이 분명 존재하기 때문에 커널이나 장치 드라이버, 임베디드 소프트웨어 같은 저수준 프로그램엔 적합하지 않습니다. 또한 상용 하드웨어 전용으로 설계되어 있어 하드웨어 가속을 사용할 수 없습니다.(그래픽스 분야에는 맞지 않음) 따라서 Go 언어는 유틸리티나 네트워크 서비스와 같은 프로그램을 만들 때 유용합니다.

 

마치며

기존의 프로그래밍 언어 연구의 성과와 절차를 무시했다는 혹평을 받기도 하는 Go 언어. 구글의 명성에 힘입어 입지를 굳혔다고 악평을 하는 이도 적지 않습니다. 하지만 순전히 개발자와 현장의 필요에 의해서 만들어진 혁신이 개발 생태계에 파란을 일으키면서 혁명으로 이어진 사례로 기록되며 프로그래밍 언어의 새로운 발전 방향을 제시한 것은 큰 성과라고 볼 수 있습니다.

인프라 시스템 재구축과 같이 코드가 방대해져 유지 관리가 힘들어지는 경우를 중심으로 Go 언어의 사용 빈도가 높아지고 있습니다. 쉽고 간편하게 확장성 있는 시스템 구축이 가능한 Go 언어의 특성 상 앞으로는 클라우드 환경에서 활용도가 높아질 것으로 예측됩니다.

배우기 쉽다는 것은 Go 언어의 가장 큰 장점입니다. 다운로드 받기 전에 먼저 Go 언어의 컨셉을 이해하는데 도움이 될 노래(https://www.youtube.com/watch?v=LJvEIjRBSDA, 겨울왕국 Let it Go를 패러디한 Write in Go)를 들어보시고 투어(https://tour.golang.org)도 다녀오시길 권해 드립니다.

반응형

+ Recent posts