본 게시글은 Do it! 타입스크립트 프로그래밍을 공부한 내용입니다.

 

1. 타입 주석 / 타입 추론 (type annotation / type inference)

let n: number = 1	// type annotation
let m = 2	// type inference

 

2. 인터페이스 (interface)

// 'Person'이라는 인터페이스를 생성. Person은 name을 반드시 갖고, age는 옵션?? 확인 필요.
interface Person {
	name: string
    age?: number
}

// 'person'이라는 변수는 인터페이스에 의해 'Person'타입이다. name을 반드시 정의해야한다.
let person: Person = {name: "Jane"}

 

3. 튜플 (tuple)

let numberArray: number[] = [1, 2, 3]	// array (저장되는 데이터 타입이 모두 같다.)
let tuple: [boolean, number, string] = [true, 1, 'OK']	// tuple (저장되는 데이터 타입이 2가지 이상이다.)

 

4. 제네릭 타입 (generic)

하나의 클래스에 여러 데이터 타입을 사용할 수 있다.

class Container<T> {
	constructor(public value: T) { }
}
let numberContainer: Container<number> = new Container<number>(1)
let stringContainer: Container<string> = new Container<string>('Hello world')
let arrayContainer: Container<number[]> = new Container<number[]>(1, 2, 3)
let booleanContainer: Container<boolean> = new Container<boolean>(true)

 

5. 대수 타입 (ADT, abstract data tyep) : union(=sum type), intersection(=product type)

합집합 : union(=sum type) =>  '|' (OR 기호를 사용)

type NumberOrString = number | string	// 합집합. number or string

 

교집합 : intersection(=product type) => '&' (AND 기호를 사용)

type AnimalAndPerson = Animal & Person	//	합집합. animal and person

 

 

Tag. 타입주석, 타입추론, type annotation, type inference, interface, array, tuple, 제네릭타입, generic, generic type, 대수타입, abstract, abstract data, abstract data type, 합집합, union, sum type, 교집합, intersection, product type, adt, algebraic data type, algebraic

youtu.be/fO5fO-gelfA

한 번씩 보면 참 재밌는 니콜라스 유튜브다.

한 마디로 TypeScript는 JavaScript의 Superset이다.

이정도만 알아도 아하~! 할텐데 조금 더 자세히 설명하자면 자바스크립트는 현재 크게 3가지 종류로 나눌 수 있다.
(ES5까지 / ES6 이후 / TypeScript) 이유는... ES5에서 ES6로 넘어오면서 많이 바뀌었다고... 따라서 ES6부터 ESNext라고 부르기도 한다.

뭐... 사실 그냥 그림으로 보는게 가장 이해가 쉽고 빠르다. 관계를 설명하자면... 

자바스크립트의 공식 표준(ECMAScript)은 2015년부터 다음과 같이 명명한다. ECMAScript 2015, ECMAScript 2019... 또한 이를 줄여서
ECMAScript 2015 = ES2015 = ES6와 같이 부른다.

TypeScript는 마이크로소프트가 개발과 유지보수를 하고 있으며, 페이스북이 React, 구글이 Angular, 알리바바가 Vue를 지원하고 있다.

기존의 자바스크립트에서는 타입이 명시되지 않아 협업을 하거나 큰 프로젝트를 하기 어려웠기 때문에 타입스크립트를 사용하는 목적이 가장 크다고 한다.

 

하지만 코드가 돌아가는 것은 하위 호환을 위해서 ESNextBabel이라는 트랜스파일러(transpiler)를 거쳐 ES5 자바스크립트 코드로 변환되고, TypeScript도 마찬가지로 TSC(TypeScript compiler)라는 트랜스파일러를 통해 ES5 자바스크립트 코드로 변환된다.

 

타입스크립트는 ES6(ESNext)의 문법을 대부분 지원한다.
따라서 ES5까지의 자바스크립트와는 다른 문법적 특징을 갖는다.

1. 비구조화 할당(destructuring assignment)

2. 화살표 함수(arrow function)

3. 클래스(class)

4. 모듈(module)

5. 생성기(generator)

6. Promise와 async/await 구문

 

 

참고

트랜스파일러(transpiler) : 소스코드 -> 소스코드

컴파일러(compiler) : 소스코드 -> 바이너리 코드

 

Tag. babel, tsc, typescript compiler, es5, es6, es2015, es2019, typescript, promise, async, await, async/await, generator, iterator, arrow function, destructuring assignment

Synology Drive로 이주를 결심 한 이유...

 

우선 기존의 클라우드 드라이브를 비교하면...

 

1. 동기화 안정성

Dropbox > iCloud >> GoogleDrive >> OneDrive

드롭박스의 동기화 성능은... 정말 다른 클라우드와 비교를 할 수 없을 정도로 안정적이다.

아이클라우드 역시 구글이나 원드라이브보단 안정적이고, 해외 백본망만 받쳐준다면 속도도 드롭박스보다 더 높게 나온다. 하지만 가장 큰 문제는 애플 제품이 아니면 사용이 어렵다는 것... 애플 제품을 6~7개 사용중이긴 하지만... 안드로이드랑 윈도우도 가지고 있다 보니 여기서 젤 큰 걸림돌이 된다 ㅠㅠ 용량도 유료 플랜 사용중이라 많이 있는데...

구글드라이브는... 대용량 저장소로는 이만한게 없지만 일반적인 클라우드 드라이브로 마운트 사용하기는 동기화도 그렇고 마운트 시켜주는 앱들도 딱히 맘에 드는 것들이 없다.

원드라이브는... 절레절레... 파일이 조금만 많아져도 동기화가 자꾸 멈추고 심한 경우 파일이 깨진다;; 특히 맥에서는 더 심하고, 같이 수업을 듣던 동기는 윈도우만 사용중인데도 동기화가 안 되는 경험을 했다. 정말... 원드라이브는 도저히 클라우드 드라이브로 사용은 불가능한 수준이었다. 심지어 맥에서는 작년 봄부터 로그인 오류도 발생했지만 몇 달이 지나도록 고쳐지지 않았고, 클라우드 드라이브로써의 가치는 없다는 것을 확인했다.

 

2. 써드파티 앱과의 연동성

Dropbox >> GoogleDrive > iCloud > OneDrive

iOS에서야 거의 모든 써드파티 앱이 아이클라우드를 지원하지만... 그 외 환경에서는 구글드라이브의 써드파티 지원이 앞선다. 드롭박스야 뭐 워낙 광범위하고 나름 역사(?)도 있다 보니 가장 많은 써드파티 환경과 연동된다. 원드라이브는... 그냥 엑셀 저장 용도......

 

3. 그렇다면 왜 거의 완벽(?)한 드롭박스를 버리고 시놀로지를?

몇 년 전 드롭박스 무료 정책에 3기기 로그인 제한이 생겨버렸다... 문제는 가장 싼 요금제가 10달러다... 하지만 난 이미 애플에서 구독 서비스를 이용중이고, 대용량으로는 구글 또한 사용중이다. 이 둘을 포기할 수 없는 상황에 드롭박스 구독까지 추가하기에는... 게다가 별도로 연간 서비스로 패럴 같은 것도 구독중인데 드롭박스까지 추가 구독 하기에는... 연간 구독 서비스 지출금액이 너무 커진다.

그래서 드롭박스를 대체할 목적으로 선택한 것이 시놀로지다. 뭐 이미 사용중이라 추가 지출이 없는 이유도 있고, 지금까지 시놀로지 여러 서비스를 써본 경험을 비추어보면 구글드라이브와 연동을 수십TB 단위로 하고 있는데도 매우 안정적이다. 개인적으로 Rsync를 설치해서 쓰던 것보다 그냥 시놀로지 기본 앱이 더 안정적이었다 -_-;; 앱은 꽤 잘 만든듯...

 

4. Synology Drive를 사용할 때 선택해야 하는 것들

우선 시놀로지에 Cloud Station Drive와 Synology Drive 2개의 앱이 있다. 둘 중 어느 것을 택해야 하는가?를 고민중이라면 Synology Drive를 선택하면 된다.
(www.synology.com/ko-kr/knowledgebase/DSM/tutorial/Collaboration/Differences_between_Synology_Drive_and_Cloud_Station)

파인더 마운트도 따로 할 필요가 없다. 그냥 iOS, 안드로이드는 물론 맥, 윈도우, 우분투 까지도 클라이언트 앱이 제공된다. 그저 서버 접속을 QuickConnect만 사용하지 않으면 된다. QuickConnect의 속도가 느리니 아수스나 시놀로지 DDNS를 사용하면 된다. 앱으로 다 제공되니 따로 설치 설명 같은거는 할 필요가 없을 것 같다. 나스 구성할 정도면 이정도는 알아서 할 수 있을테니...

본인은 인터넷을 2회선 사용중이라 하나는 아수스 공유기를 통해 들어오고, 하나는 시놀로지로 바로 연결된다. 단, 이 때 주의해야 할 점은 SMB나 AFP를 이용하기 위해 추가로 할당한 포트가 아니고 시놀로지 웹 로그인에 할당한 HTTP 혹은 HTTPS 포트를 통해 접속해야한다. 파인더에서 직접 접근하려면 당연히 SMB나 AFP 포트 번호에 할당한 포트포워딩을 사용해야 하지만 앱을 통해 접속하는 경우는 무조건 포트 번호는 웹 HTTP/HTTPS로 접속을 해야한다.

 

즉, 2가지만 기억하면 된다.
1 ) Synology Drive를 선택한다.(Synology Cloud Station이 아니고...),
2 ) 웹 로그인 시 사용하는 HTTP/HTTPS로 접속을 한다.
추가로... 당연히 변경했겠지만... 포트는 기본 포트를 사용하면 안 된다.

1. 과거 방식

LBYL : Look before you leap.

Look before you leap. This coding style explicitly tests for pre-conditions before making calls or lookups. This style contrasts with the EAFP approach and is characterized by the presence of many if statements.

In a multi-threaded environment, the LBYL approach can risk introducing a race condition between “the looking” and “the leaping”. For example, the code, if key in mapping: return mapping[key] can fail if another thread removes key from mapping after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach.

let num1 = 3;
let num2 = 0;
let result;

result = (i, j) => {
    return (j != 0 ? i / j : '연산 불가');
};

console.log(result(num1, num2));


결과 :
'연산 불가'

원래 기존 문법상으로는 if ~ else 문을 사용해야하지만 여기서는 같은 로직이기 때문에 그냥 ternary operator를 사용했다.

 

2. 요즘 방식

EAFP : Easier to ask for forgiveness than permission.

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

let num1 = 3;
let num2 = 0;
let result;

result = (i, j) => {
    try {
        return i / j;
    } catch (e) {

    }
};

console.log(result(num1, num2));


결과 :
Infinity

 

 

LBYL(Java/C# : try ~ except, Python : try ~ except, Swift : do ~ catch) 방식은 많은 if문이 존재하고, 이 if를 이용해 거짓을 판별... 즉, "로직을 정상적으로 실행할 수 있는 조건이 되는가?" 를 검사한다. 이 방식은 C를 포함한 많은 언어에서 사용되는 방식이었고, 이 방식의 문제는 멀티 스레드 환경에서 여러개의 look, leap가 동시에 실행되면 특정 스레드의 실행으로 인해 예외 처리 로직이 실패할 수 있다고 한다.(C를 해본 적도, 저런 방식을 써본 적도 없어서 정확히는 모르겠다.)

아무튼, 그래서 새로 나온 EAFP 방식은 뭐든 다 try를 통해 실행시키고, 에러를 catch로 정상 로직과 분리시키는 것이다. 그리고 파이썬은 이 방식을 지향한다고 한다. ()

docs.python.org/3/glossary.html

 

Glossary — Python 3.9.1 documentation

The implicit conversion of an instance of one type to another during an operation which involves two arguments of the same type. For example, int(3.15) converts the floating point number to the integer 3, but in 3+4.5, each argument is of a different type

docs.python.org

 

 

참고 : Go에는 try ~ catch가 없다. Go는 아예 한 술 더 떠서 error를 항상 반환한다. 그리고 에러가 없다면 "nil"을 반환한다.
따라서 if ( 조건 != nil) { } 이런 로직을 사용할 수 있다. 하지만, Go에서 예외처리는 defer, panic, recover를 이용해 다룬다고 한다. Go는 해본적 없어서 자센한건 나중에...

'개발자 > 용어... 그 외의 것들...' 카테고리의 다른 글

맥 NVRAM(PRAM), SMC 재설정  (0) 2020.12.18
Logo (로고) 모음  (0) 2020.12.10
ODBC  (0) 2020.11.05
개발 문서 RFP, RFI, Project Charter, SRS, RTM, STD...  (0) 2020.11.05
BSC, MBO, KPI  (0) 2020.11.03

1. Shortcuts 진입하기

신기하게도... 설정이 아니라 툴 좌측 하단에 톱니 바퀴를 통해 진입한다.

JetBrains에서 IntelliJ나 PyCharm을 쓰는 것과 기본 단축키를 일치 시키려면 아래를 참고한다.

 

 참고 : JetBrains의 IntelliJ 단축키

 

 

 

Tag. visual studio code shortcut, visual studio code shortcuts, vs code shortcut, vs code shortcuts, vscode shortcut, vscode shortcuts, visual studio code keymap, visual studio code keymaps, vs code keymap, vs code keymaps, vscode keymap, vscode keymaps, visual studio code 단축키, vs code 단축키, vscode 단축키, visual studio code 단축키 변경, vs code 단축키 변경, vscode 단축키 변경

아.... ㅡㅡ

 

다시 워드프레스로 이사갈까...

DAX에 Grade = "A"라는 필터를 걸고

페이지 필터로 Grade = "A" OR Grade = "B"라는 필터를 걸었다 하자.

어떻게 될까?

 

DAX는 Grade = "A"에 대해 값을 계산한다. 그런데 모든 페이지나 이 페이지 필터에 Grade = "A" OR GRADE = "B"라는 필터를 걸게 되면 DAX에 적용되는 필터는 다음과 같아진다.

(DAX 필터, Grade = "A") AND (페이지 필터, Grade = "A" OR GRADE = "B")가 된다. 따라서 추가되는 페이지 필터에 의해 DAX는 Grade = "A"와 Grade = "B"를 모두 적용하게 된다.

 

따라서 DAX식에 적용되는 필터는 페이지 필터에는 사용을 하면 안 된다. 만약 사용하려면 '시각적 개체의 필터'를 사용해야한다.

1. 당월 첫 날 / 마지막 날

// 첫날
FORMAT(DATE(YEAR(TODAY()), MONTH(TODAY()), 1), "yyyymmdd")
// 마지막날
FORMAT(DATE(YEAR(TODAY()), MONTH(TODAY())+1, 1)-1, "yyyymmdd")

 

2. 올해 첫 날 / 마지막 날

// 첫 날
FORMAT(DATE(YEAR(TODAY()), 1, 1), "yyyymmdd")
// 마지막 날
FORMAT(DATE(YEAR(TODAY()), 12, 31), "yyyymmdd")

 

본문에서는 포맷팅을 하였지만 DATE 함수까지만 쓰면 Datetime 형식으로 나온다.

또한 FORMAT 함수의 return value는 String이다. 만약 이것을 Int 타입으로 만들고 싶다면 다음과 같이 CONVERT() 함수를 사용하면 된다.

CONVERT(FORMAT(DATE(YEAR(TODAY()), MONTH(TODAY()), 1), "yyyymmdd"), INTEGER)

 

위 1번과 2번을 이용하면 특정 시기의 첫 날과 마지막 날을 모두 구할 수 있다.

+ Recent posts