💻 Programming
-
[iOS Swift] SwiftUI란? UIkit vs SwiftUI 비교
SwiftUI란? 애플의 디자인 프레임워크의 변화는 빠르게 진행되었습니다. 애플은 2019년 WWDC에서 애플은 SwiftUI라는 새로운 디자인 프레임워크를 소개합니다. 더 빠르고 쉽게 개발을 할 수 있도록 하기 위해 개발된 SwiftUI는 실시간 테스트 기능과 선언적 구문 그리고 데이터주도 기반을 철학을 가지고 있습니다. SwiftUI의 특징적인 부분은 선언적 구문, 데이터 바인딩, 프리뷰 기능, 애니메이션 기능으로 압축해서 살펴볼 수 있습니다. 1. 선언적 구문(Declarative Syntax) SwiftUI는 선언적 구문을 사용합니다. 선언적 구문의 반대는 명령적(Imperative) 구문인데요, 둘의 차이점을 간단하게 비교하면 다음과 같습니다. 선언적 구문 명령적 구문 - 코딩을 할 때 무엇을 ..
2024.01.16
-
[iOS Swift] 스위프트에서 Error Handling 하는 방법
Swift Error Handling 안녕하세요. 개발자 AboutTech입니다. 이번 포스팅에서는 스위프트 언어를 사용한 아이폰 앱 개발에서 에러를 어떻게 처리할 수 있는지 알아보도록 하겠습니다. 모든게 완벽한 코딩이라면 에러가 발생할 일도 없을 것입니다. 하지만 현실에서는 앱을 사용하던 중에 네트워크가 꺼질 수도 있고, 사용자가 예상치 못한 지점에서 앱이 정상작동하지 않는 경우가 무수히 많습니다. 개발자도 사용자도 예상하지 못한 에러가 발생했을 때 예기치 못한 심각한 오류로 사용자 경험이 훼손되지 않게 하기 위해서는 적절한 그리고 우아한 에러 처리가 필수입니다. 아이폰 앱 개발에 사용되는 스위프트에서는 에러 핸들링 작업을 위해 guard, defer, do-catch, 그리고 throwing met..
2024.01.15
-
[iOS Swift5] 프로퍼티 래퍼 Property Wrapper?
안녕하세요. AboutTech입니다. 이번 포스팅에서는 Swift 5.1 버전부터 적용되기 시작한 Property Wrapper에 대해 알아보고자 합니다. 이전에 OOP를 알아보면서 연산 프로퍼티 사용을 조금 더 간단하게 도와주는 개념입니다. 만약 클래스나 구조체 내부에 선언된 연산 프로퍼티의 로직을 다른 클래스나 구조체에서도 동일하게 사용하기 위해서는 어떻게 해야 될까요? 해당 로직을 복사해서 붙여 넣는 방식으로는 한계점에 직면하게 됩니다. 이 문제를 해결해주는 것이 바로 프로퍼티 래퍼입니다. Property Wrapper 사용법 간단한 구조체를 선언했고, 인스턴스를 생성해서 name이라는 프로퍼티를 출력하고 있습니다. name 연산 프로퍼티는 구조체 내부의 value 값을 통해 새로운 값을 할당하고..
2024.01.13
-
[iOS Swift5] Collection, 배열과 딕셔너리, Set 기본
안녕하세요. AboutTech입니다. Swift에서 다양한 데이터와 객체들을 집합체로 묶어 관리할 수 있는 타입을 컬렉션이라고 합니다. 컬렉션 타입에는 대표적으로 배열과 딕셔너리가 있는데요 데이터들을 한 번에 담아서 관리할 수 있는 방법에 대해 알아보도록 하겠습니다. Swift Array, 배열 배열은 순서있는 컬렉션입니다. 따라서 배열은 다양한 타입의 데이터를 순서대로 저장할 수 있습니다. 먼저 배열을 선언하는 방법은 다음과 같습니다. var array = [타입]() String 타입의 값을 담고 있는 배열을 선언하려면 타입에 String을 적어주시면 됩니다. var array = [String]() 초기값을 N개 가진 배열을 만들기 위해서는 repeating, count 매개변수에 인자를 전달해 주..
2024.01.11
-
[iOS Swift5] 열거형 구조체 기본 기초
Swift에서 클래스만큼이나 자주 사용되는 타입이 바로 구조체입니다. 이번 포스팅에서는 클래스와 구조체를 비교하면서 SwiftUI를 활용한 iOS 앱 개발에 필요한 구조체와 열거형의 개념에 대해 간단히 알아보도록 하겠습니다. Value type VS Reference Type Swift에서 데이터를 다루는 방식은 크게 (값 타입)Value Type과 (참조 타입)Reference Type이 있습니다. 차이점을 간단하게 알아보면 값 타입은 값 자체가 복사되어 전달됩니다. 이를 pass by value라고 합니다. 반면 참조 타입은 참조가 전달되어 같은 인스턴스를 공유하게 됩니다. 이를 pass by reference라고 합니다. 즉 데이터의 값만을 전달하기 위해서는 값 타입을 사용하고, 참조를 전달해서 공..
2024.01.10
-
[iOS Swift5] 객체지향 프로그래밍 기초 클래스 프로토콜 익스텐션
Swift는 객체 지향 프로그래밍 언어(Object Oriented Programming)입니다. 그만큼 객체를 사용한 프로그래밍을 지원하고 있다는 말인데요, 객체는 재사용가능한 독립 기능 모듈로 클래스 구조체의 형태로 지원되고 있습니다. 이번 포스팅에서는 Swift에서 바로 사용가능한 클래스의 기본 개념에 대해 알아보고자 합니다. 클래스는 왜 사용하나요? 먼저 클래스를 사용하는 이유에 대해 알아보겠습니다. #1 캡슐화 OOP에서 클래스는 멤버를 하나로 묶어 캡슐화 할 수 있습니다. 이는 데이터를 보호하고 유지보수하는데 용이하다는 장점을 가지고 있습니다. 또한 접근제어자를 통해서 클래스 멤버에 접근할 수 있는 안전장치를 걸 수 있기 때문에 안전하게 데이터를 사용할 수 있습니다. #2 추상화 클래스를 사용..
2024.01.09
-
[iOS Swift5] 함수, 메서드 그리고 클로져 기본 개념
프로그래밍 영역에서 함수는 반복적인 작업을 대폭 줄여주는 장점이 있습니다. 애플의 스위프트 언어 또한 함수를 제공하고 있는데요, 이번 포스팅에서는 Swift의 함수에 대해 알아보도록 하겠습니다. Swift 함수와 메서드 기본 함수 Function은 특정 기능을 수행하기 위한 코드 블럭입니다. 특정 데이터를 매개변수로 받을 수도 있고, 함수의 결과물을 반환받을 수도 있습니다. 일반적으로 특정 기능을 수행하기 위한 코드 블럭을 함수라고 지칭합니다. 함수와 유사하게 사용되는 개념이 메서드인데요, 메서드는 특정 클래스나 구조체 내에서 사용하는 함수를 통상 메서드라고 지칭합니다. 함수와 메서드가 작동하는 방식은 동일하지만 사용방법에서 조금 다르다는 차이점이 있습니다. Swift에서 함수를 사용하는 기본 방법은 다..
2024.01.08
-
[iOS Swift5] if else, guard 제어 흐름 관리하기
Swift5 제어흐름 관리하기 안녕하세요 About Tech 입니다. 이번 포스팅에서는 Swfit 언어에서 제어흐름을 어떻게 관리할 수 있는지 알아보고자 합니다. 제어흐름은 조건식이라고도 불리는 if 문이나 guard 문을 말하는데요, 개발은 로직을 이용하는 것이기도 하고, 프로그램의흐름을 통제하는 것이기 때문에 제어흐름(Control Flow)로 불리고 있습니다. 제어흐름에는 크게 조건부 제어흐름(Conditional Control Flow)과 반복제어(Loopin Control Flow) 문으로 구분됩니다. 코드를 몇번 반복해서 실행할지를 결정하는 반복 제어흐름과 특정 조건에 따라 코드를 실행할지 뛰어넘을지를 결정하는 조건식으로 구분됩니다. Swift 조건부 제어흐름 조건부 제어흐름은 크게 두가지가 ..
2024.01.05
-
[iOS Swift5] 연산자와 표현식
Swift 연산자와 표현식 변수에 값을 할당하는 방법은 기본적으로 표현식을 따릅니다. 피연산자와 할당자 그리고 연산자를 통해 값을 생성하고 변수에 데이터를 저장할 수 있습니다. var number = 1 + 2 1. 할당 연산자 (=)를 사용해 변수에 값을 저장합니다. 2. 복합 할당 연산자 (+=) (-=) 처럼 산술연산자나 논리연산자를 할당연산자에 결합해서 사용하는 형태입니다. var num = 10 // Addition assignment operator (+=) num += 5 // Equivalent to: num = num + 5 print(num) // Output will be 15 // Subtraction assignment operator (-=) num -= 3 // Equivale..
2024.01.05
-
Xcode Playground 사용법 주석 라이브뷰 사용하는 방법
플레이그라운드란? 플레이그라운드는 xcode의 추가적인 기능으로 실시간으로 코드를 실행해볼 수 있는 개발환경입니다. 아이폰 앱을 개발하기 위해서 코딩부터 컴파일 그리고 디버깅의 일련의 과정을 거치게 되는데, 플레이그라운드에서는 코드를 바로 실행해보고 코드에 대한 주석 기능도 제공하고 있기 때문에 코드를 문서화 할 때도 좋은 툴이 될 수 있습니다. Swift 언어를 공개한 애플은 플레이그라운드를 함께 공개하면서 많은 개발자들에게 보다 편리한 환경을 제공하고 있습니다. 이번 포스팅에서는 플레이그라운드의 여러 기능들을 학습해보도록 하겠습니다. 먼저 플레이그라운드를 시작하기 위해서는 xcode를 실행해줍니다. 단축키는 ⌥[option] + ⇧[shift] + ⌘[command] + N입니다. 플레이그라운드를 처..
2024.01.04
-
[iOS Swift5] 상수와 변수 데이터 타입 옵셔널, 옵셔널 바인딩, 강제언래핑
Swift5 상수와 변수 프로그래밍 언어에서 데이터를 표현하는 방법은 다양합니다. iOS 8 이전까지는 Objective-C로 개발했지만 스위프트 언어가 등장하고 나서는 대부분 흐름이 스위프트로 새로운 기능들이 대체되고 있는 상황입니다. 스위프트 언어에서 가장 먼저 익혀야 되는 부분은 데이터타입입니다. 프로그램은 RAM에 올라가 CPU의 자원을 사용해 Bit라고 불리는 0 혹은 1의 데이터에서 시작합니다. 비트가 바이트가 되고, 우리가 원하는 2진수 혹은 문자열의 데이터를 저장할 수 있게 됩니다. 여기서 변수와 상수가 나뉘게 됩니다. 변수 Variables는 애플리케이션에서 사용되는 데이터를 저장하기 위해 생성하는 컴퓨터 메모리 내의 위치를 의미합니다. 개발자는 메모리 주소에 이름을 지정하고 값을 할당하..
2023.12.26
-
[iOS Swift5] Objective-C를 넘어선 Swift5 언어의 등장
Swift 5 언어의 출현 현재 애플의 기기에 들어가는 소프트웨어를 개발하기 위해서는 Swift언어를 사용합니다. 애플 에코시스템에서 개발자가 되기 위해서는 Swift 언어를 익혀야 하는데요, Swift 프로그래밍 언어는 2014년 WWDC에서 공개되면서 2023년 현재 Swift5까지 발전에 발전을 거듭하고 있습니다. 기존의 소프트웨어 개발에서는 전통적인 프로그래밍 언어인 C를 개량한 Objective-C를 사용했었는데요, 한계와 어려움을 극복하서 2010년 초반 Swift 프로젝트가 가동되었고, 2014년 새롭게 첫 선을 보이게 됩니다. 애플의 스위프트 언어 소개 스위프트가 공개되고 난 후 쉬운 언어 문법과 강력한 기능이 더해지면서 애플 생태계에서 개발을 하기 위한 필수 언어로 자리 잡았습니다. 물론..
2023.12.26
-
[티스토리 스킨 만들기 #1] 치환자 이해하기
[티스토리 스킨 만들기 #1] 치환자 이해하기 티스토리 스킨을 만들어 볼 작정입니다. 최근 티스토리에서 자체 광고를 신설하고 상단 혹은 하단의 광고 영역을 침범(?)한다고 공지한 이후 티스토리 블로거들의 거센 반발에 부딪혔는데요, 그럼에도 불구하고 티스토리 만큼 자유롭고 무료로 사용할 수 있는 블로그는 또 없기 때문에 애증을 담아 스킨을 한번 만들어 보려고 합니다. 티스토리에 적용할 스킨을 만들기 위해서는 치환자를 이해해야 하는데요, 스킨 제작이 처음이신 분들은 티스토리 스킨 가이드를 참고하셔야 합니다. 우리가 웹 애플리케이션을 만들 때 프론트랑 백엔드랑 2개를 만듭니다. 여기서 티스토리 스킨 가이드는 백엔드 영역을 담당해주고 있습니다. 프론트에서 get 요청을 보내지 않아도 HTML에 치환자를 심어주면..
2023.06.09
-
프로그래머스 자전거 공장 문제 Javascript
프로그래머스 자전거 공장 문제 Algorithm 프로그래머스 자전거 공장 문제는 스택을 이용해서 풀어낼 수 있다. 기간별로 다른 누진세가 적용되기 때문에 최대한 저렴한 가격으로 자전거를 생산하기 위해서는 최대한 앞쪽에 물량을 몰아서 생산기간 동안 최대한 적은 숫자의 자전거를 매월 생산하도록 하는 것이 관건이다. 총 3단계로 나누어 알고리즘을 설계할 수 있다. 1. 얼마까지 자전거를 생산해야 한다라는 개념을 향후 몇개월 동안 얼마만큼의 자전거를 생산해야 되는지 order 배열을 재배치한다. 2. 새롭게 정의된 주문서에서 월별 생산량을 비교해서 뒷쪽에 물량이 몰려있는 경우 앞으로 추가하면서 물량을 조절할 수 있다. 3. 생산해야 하는 물량과 기간을 고려해서 최종 생산비를 뽑아낸다. 프로그래머스 자전거 공장 ..
2023.04.06
-
Github CLI Install Ubuntu 22.04
1. 터미널 실행 아래 코드 입력. 터미널에 Github CLi install type -p curl >/dev/null || sudo apt install curl -y curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archi..
2023.02.09
🔗 Blockchain
-
2023년 블록체인에 집중해야 하는 이유
2022년은 crypto currency의 겨울이었습니다. CeFi 거래소들이 줄줄이 파산을 면치 못하면서 3조달러에 달하는 암호화폐시장이 8천억 달러까지 시총이 내려왔습니다. 루나 프로토콜, 셀시우스, 3AC, FTX 까지 빠른 외형 성장을 위해 거래소간 물고 물리는 도미노 시스템이 붕괴되기 시작한 것이다. 그럼에도 불구하고 2023년 암호화폐에 대한 관심은 끊이지 않고 있습니다. 중개인을 제외한 제3자 거래가 가능하게 하는 시스템은 많은 개발도상국들로 부터 러브콜을 받고 있습니다. 미국을 제외한 엘살바도르, 중앙아프리카공화국 등 GDP가 낮은 국가에서는 여전히 정부가 아닌 외부 경제 시스템을 선호합니다. 반복되는 역사 1929년 대공황 이후 예금보험제도가 도입되었고, 글래스-스티걸 법이 통과되었습니다..
2022.12.19
-
Solidity virtual function(가상 함수)란?
이더리움 기반 ERC20 토큰을 발행할 때 Interface Contract를 작성한 후 토큰 발행 컨트랙트를 작성하게 됩니다. 이 때 흔히 볼 수 있는 solidity keyword가 바로 virtual 입니다. virtual은 무슨 의미일까요? virtual override 예를 들어서 ERC20토큰을 발행하는 컨트랙트가 아래와 같이 있습니다. 먼저 실제 구현을 하지 않고 함수만 추상화 시켜 놓은 interface contract를 작성합니다. 💡 Interface Solidity에서 Interface는 추상 계약(Abstract Contract)와 유사하지만 모든 함수가 추상화 되어 있다는 특징이 있습니다. Interface 특징은 다음과 같습니다. 1) 다른 컨트랙트를 상속받을 수 없습니다. 2)..
2022.11.29
-
[Dex PJ] #1 프로젝트 시작
Dex Project 시작 블록체인을 공부하면서 막연하게 DeFi에 관심이 갔다. 대학교에서 금융공학을 전공한 이력 때문인지 블록체인을 활용할 수 있는 프로젝트 중 거래소, 스왑, 디파이, Dex에 관심이 가는건 어쩌면 당연한 이치라고 생각한다. Dex 프로젝트를 준비하면서 Klayswap 컨트랙트를 많이 참조하게 된다. Dex란 Decentralized Exchange를 의미하며 중앙화된 주체 없이 탈중앙화된 거래소라고 쉽게 이해할 수 있다. 이번 프로젝트에서는 크게 Front / Contract / Backend로 Role을 구분했고 나는 코인데몬 서버 1대와 API 서버 1대 해서 백엔드를 담당하게 되었다. Dex에서 API 콜을 보내는 경우가 많지 않고, 인증기능도 추가되지 않아 생각보다 간단해보..
2022.10.28
-
[블록체인 만들기 #6] P2P 네트워크
블록체인에 참여하는 노드들은 스스로 클라이언트이자 서버가 됩니다. 모든 노드들이 동일한 체인을 보유해야 하기 때문에 broadcasting을 하게 되는데, P2P 네트워크를 WS와 HTTP 프로토콜을 이용해 구현할 수 있습니다. HTTP 프로토콜은 블록데이터를 반환하는 용도 / WS는 P2P 네트워크를 담당합니다. HTTP/WS 환경 구성 터미널에서 필요한 모듈을 먼저 설치합니다. $ npm install express ws $ npm install -D @types/express @types/ws P2P 서버 구성 블록체인에서는 노드가 클라이언트가 되면서 동시에 서버가 됩니다. 즉, 서버 쪽 코드와 클라이언트 코드를 동시에 작성해줘야 합니다. ./src/server/p2p.ts 파일을 작성하고 아래 코..
2022.10.12
-
[블록체인 만들기 #5] PoW 합의 알고리즘
비트코인 블록체인에서는 PoW 합의 알고리즘을 통해 새로운 블록을 생성한 채굴노드에게 비트코인으로 보상을 지급하게 됩니다. PoW는 분산 합의 알고리즘의 한 종류로, 쉽게 말해 지정된 Nonce 값 보다 작은 값을 찾아내는 작업에 성공한 노드를 선정하는 일입니다. 블록체인에서 합의 알고리즘이 필요한 이유는 네트워크에 참여한 모든 노드들이 동일한 상태를 가질 수 있도록 올바른 블록만 연결해야 하기 때문입니다. 악의적인 노드가 올바르지 않은 블록을 추가하려고 할 때 이를 필터링 해줄 수 있어야 합니다. 또한 합의 알고리즘을 통해 동시에 2개의 블록이 생성되지 않도록 사전 예방하는 작업이기도 합니다. 비트코인에 사용되는 작업증명 합의 알고리즘은 Difficulty를 조정함으로써 10분에 1블록이 생성되도록 유..
2022.10.11
-
[블록체인 만들기 #4] Chain 만들기
이전 포스팅에서는 Block과 BlockHeader를 통해 블록체인을 구성하는 개별 블록을 생성했습니다. 이번 포스팅에서는 블록들을 연결하는 Chain을 생성합니다. 생성된 블록들을 배열에 담아 연결만 하면 됩니다. 앞서 생성한 블록들은 이미 Hash 값으로 체인을 구성하고 있으므로, 블록의 hash값이 변경되면 자연스레 chain이 끊어지게 됩니다. 이미 연결되어 있는 블록들을 담는 Chain 클래스를 구성하는 가장 큰 이유는 난이도 계산을 위해서입니다. 블록이 생성될 수록 nonce 값을 찾을 확률은 줄어들게 되고 difficulty는 올라가야 정상적인 크립토 이코노미를 구성할 수 있기 때문입니다. 체인 클래스 src/core/blockchain/chain.ts 파일을 생성합니다. import { B..
2022.10.10
-
Transpile VS Compile 차이점?
Babel, Typescript는 Javascript를 컴파일하는 도구입니다. 웹 브라우저가 이해할 수 있는 이전 버전의 Javascript로 트랜스컴파일러로 Babel을 사용합니다. 또한 Typescript는 정적 타입 기능을 추가해 Javascript로 트랜스파일 한다고 합니다. 사실 대부분의 개발자들이 Transpile과 Compile을 혼용해서 사용하고 있는데, 키워드가 2개인걸 보면 분명한 차이점이 있다는 겁니다. Compile이란? 컴파일이란 한개의 언어로 작성된 Code를 다른 언어로 변환하는 작업을 의미합니다. 대표적으로 Java로 작성된 파일을 컴파일하면 JVM이 이해할 수 있도록 bytecode로 구성된 class 파일이 생성됩니다. C 언어로 작성된 코드를 컴파일 하면 assembly..
2022.10.09
-
[블록체인 만들기 #3] Unit Test (Jest)
이전 포스팅에서는 블록과 블록헤더를 생성하고, GENESIS 블록까지 만드는 방법을 알아보았습니다. 이제 생성된 블록들이 정상적으로 연결되는지 확인해볼 필요가 있습니다. Typescript Unit Test는 Jest로 진행해보겠습니다. Node.js 환경에서 Unit Test 프레임워크로는 Mocha, Jest가 있지만 Typescript에서 사용하기 위해서는 추가적인 환경설정이 필요합니다. 이런 불편한 추가설정을 하면서 까지 Typescript를 이용하는 이유는 그만큼 TS가 제공하는 정적 타입의 프로그램이 파워풀하기 때문입니다. Jest, Unit Test 환경구성 Jest를 사용하기 위해서 필요한 모듈을 설치해줍니다. $ npm i -D ts-jest @types/jest babel-core @b..
2022.10.09
-
[블록체인 만들기 #2] Genesis Block 생성 (Typescript)
Typescript로 블록체인 만들기에서 기본적인 환경구성과 Block을 생성하는 방법에 대해 알아보았습니다. 하지만 Block , BlockHeader 클래스에서 이전 블록을 인자로 전달받고 있는 상황이었기 때문에 GENESIS 블록을 생성하지 못하는 문제가 남아있었습니다. 이번 포스팅에서는 GENESIS 블록을 생성합니다. 제네시스 블록 만들기 블록체인에서 제네시스 블록은 체인상 가장 앞에 있는 블록을 의미합니다. Genesis 블록은 하드코딩으로 생성합니다. 💡 하드코딩이란? 코드를 통해 생성되는 변수가 아니라, 직접 타이핑을 쳐서 생성하는 데이터를 의미합니다. src/core/config.ts 파일에서 제네시스 블록을 생성합니다. hash, previousHash, merkleRoot 는 32By..
2022.10.09
-
[블록체인 만들기 #1] Block 구성 (Typescript)
블록체인은 정보를 담은 여러개의 블록을 해시를 이용해 연결한 분산원장입니다. 네트워크에 참여한 노드들은 동일한 정보를 담은 블록들을 가지게 되고, 여러개의 블록들은 체인으로 연결되어 블록체인을 구성합니다. 이번 포스팅에서는 Typescript를 이용해 블록체인을 구성합니다. Typescript 환경설정 환경구성 Typescript는 동적타입을 지원하는 javascript을 개량한 언어입니다. 정적 타입을 지원하며 컴파일 시 변수의 타입을 결정하게 됩니다. Typescript로 블록체인을 구성하기 위해 환경설정을 해줍니다. $ npm i -D typescript ts-node @types/node typescript : typescript 언어를 사용합니다. -g 옵션으로 글로벌 설치를 할 수도 있지만 로..
2022.10.09
-
블록체인 개발자 기술 면접 준비 질문 정리
블록체인 개발자 면접 질문 📚️ 블록체인 기본 ❓️ 블록체인이 뭔지 정의해주세요 블록체인은 분산 원장 기술과 합의 알고리즘을 기반으로 이중 지불 문제를 해결하는 네트워크입니다. ❓️블록체인 트릴레마에 대해 설명해주세요 블록체인 기술 중 3대 요소인 확장성, 보안성, 탈중앙성 모두 만족할 수는 없다는 개념입니다. ❓️코인과 토큰의 차이점은 무엇인가요? 메인넷 유무에 따라 구분됩니다. 메인넷을 보유하고 있으면, 코인이라 불리고 없으면 토큰이라 불립니다. ❓️크립토 이코노미 VS 토큰 이코노미의 차이점을 설명해주세요 크립토 이코노미란 블록체인 서비스 내에서 암호화폐(코인)으로 작동하는 경제 시스템을 의미합니다. 이해관계를 조정해주는 거버넌스가 필요합니다. 블록체인 경제가 작동하기 위해서는 채굴하는 사람이 필요..
2022.10.06
-
[Node.js] 디지털 서명 SHA256 32Bytes 비대칭키 사용방법
디지털 서명은 비대칭키를 이용한 증명 방식 중 하나다. 공개키 방식의 비대칭키와는 다르게, 데이터 자체를 암호화 해서 보안을 중요시 여긴다기 보다 데이터를 전송한 사람의 진위를 증명하는데 초점이 맞춰져 있는 방식이다. 디지털 서명 방식에는 비밀키 비대칭키를 사용한다. 디지털 서명이란 아래 글에서는 디지털 서명에 대해 자세하게 다루고 있다. 혹시 개념이 안잡히시는 분들이라면 필독을 추천한다. 우선 디지털 서명을 하기 위해서는 비밀키/공개키 쌍이 필요하다. 원본 데이터를 해시 한 후 자신의 비밀키로 암호화를 진행해야 하기 때문이다. [Security] 디지털 서명(Digital Signature)이란? 검증 확인 원리 공개 키 방식(PKC, Public Key Cryptographym)은 전형적인 비대칭키 ..
2022.09.15
-
IPFS Web3.Storage 사용법
NFT를 발행하거나, 블록체인 컨트랙트를 작성할 때 저장소로 많이 사용하는 곳이 IPFS 혹은 FileCoin입니다. IPFS를 Node.js 환경에서 접속해서 파일을 바로 업로드하고 해시값으로 반환되는 CID를 사용할 수 있습니다. Web3.Storage 설치 IPFS에 접근할 수 있는 모듈이 많지만 일반 파일을 업로드 할 때는 Web3.Storage를 사용하고, NFT를 발행할 때 필요한 tokenURI는 NFT Storage를 많이 사용했습니다. Web3.Storage 설치법 $ npm install web3.storage Web3.Storage를 사용하기 위해서는 API Token을 발급받아야 합니다. Web3.Storage 홈페이지로 가셔서 이메일을 등록하시면 바로 회원가입이 됩니다. 회원가입 ..
2022.09.07
-
Truffle migrate Error You must specify a network id in your development configuration in order to use this network
Error Code Truffle에서 컨트랙트를 컴파일 + 배포하는 과정에서 에러가 발생한다. Truffle migrate Error You must specify a network id in your development configuration in order to use this network 에러의 내용은 Truffle에서 컴파일 후 배포할 네트워크를 지정해주지 않았다는 것이다. Solved truffle-config.js 파일에 들어가서 현재 배포할 네트워크 설정이 정상적으로 되어 있는지 확인한다. 만약 배포할 네트워크의 network_id를 모른다면 '' 빈 문자열이라도 입력해야 에러가 해결된다. 하지만 네트워크를 명시하지 않으면 컴파일 된 컨트랙트가 갈 방향이 안잡히기 때문에 해당 블록체인의..
2022.09.02
-
[Klaytn] Caver-js 사용법 설치 contract call send
Caver-js Klaytn 블록체인을 Javascript를 사용해 접근하기 위해서는 Caver-js를 사용한다. caver-js는 HTTPS, 웹 소켓 연결로 Klaytn 블록체인과 Javascript 간 상호작용을 가능하게 한다. Caver-js 사용법 Caver-js 설치 우선 caver-js 모듈을 설치해준다. npm install caver-js Klaytn Endpoint Node 접속 caver-js를 통해 Provider를 제공해준다. Klaytn의 EN 노드 엔드포인드 URL을 인자로 보내주면 된다. 예제에서는 Klaytn baobab 테스트넷으로 접속한다. const Caver = require('caver-js'); const caver = new Caver("https://api.b..
2022.09.01
🦾 Algorithm
-
프로그래머스 마법의 엘레베이터 JavaScript
프로그래머스 마법의 엘레베이터 Javascript 프로그래머스 마법의 엘레베이터는 재귀를 활용한 풀이를 요구하는 문제입니다. 특정 층에서 0층으로 이동하기 위해서는 주어진 선택의 숫자를 조합해서 최소의 수로 이동해야 합니다. 문제에서 주어진 -1, +1, -10, +10 ... 으로 이동하기 위해서는 숫자 별로 조합해보면서 최소의 수를 만드는 공식을 우선 작성해봐야 합니다. 예를 들어 0층에서 16층으로 이동하기 위해서는 간단하게 2가지 방법을 생각해볼 수 있습니다. 각각의 방법을 공식화 하면 다음과 같은 공식을 만들어낼 수 있습니다. solution 함수를 재귀로 돌리면서 몫과 나머지를 구한 다음 각 숫자들을 조합해서 최소의 수가 나오는 결과값을 반환하면 됩니다. 프로그래머스 마법의 엘레베이터 Java..
2023.04.10
-
프로그래머스 가장 큰 수 Javascript
프로그래머스 가장 큰 수 Javascript 프로그래머스 가장 큰 수 문제는 Level 2에 해당하는 문제로 문자열 Sorting 능력을 테스트하는 문제입니다. 문제의 핵심은 numbers 배열로 주어지는 숫자들을 어떤 규칙에 따라서 배치할 것인가 인데요, 이 문제만 해결하면 간단하게 sorting 함수를 작성해서 풀어볼 수 있습니다. 예를 들어 [41,40,4]로 구성된 배열이 주어졌을 때 각 원소들을 여러번 반복해서 4자리를 끊어서 반복된 숫자를 비교해 볼 수 있습니다. 41 vs 40 : 4141과 4040을 비교했을 때 4141이 더 크기 때문에 41이 앞에 와야 됨을 알 수 있습니다. 40 vs 4 : 4040과 4444를 비교했을 때 4444가 더 크기 때문에 4가 앞에 와야 됨을 알 수 있습..
2023.04.07
-
프로그래머스 체육복 Greedy 탐욕법 문제 Javascript
프로그래머스 체육복 문제 프로그래머스 체육복 문제는 탐욕법으로 풀어보는 것이다. 탐욕법 알고리즘은 각 단계에서 최적이라고 고려되는 것을 선택하는 것을 반복하는 방법이다. 현재 선택이 마지막까지 적용되는 경우 탐욕법으로 문제를 풀어볼 수 있다. 체육복 문제에서는 앞에있는 학생이 체육복을 빌려줄수도 있고, 뒤에 있는 학생이 빌려줄수도 있다. 따라서 가장 우선해서 옷을 빌려줄 순서를 정해야 한다. 먼저 옷을 잃어버린 학생과 빌려줄수 있는 학생 배열을 생성하고, 학생순서대로 스캔해나가면서 옷을 빌려줄 관계를 설정해주면 된다. 프로그래머스 체육복 자바스크립트 배열이 생성된 후로 옷을 잃어버린 학생들의 배열을 순회하면서 옷을 빌려줄 수 있는 경우(Math.abs(r-l) === 1) count를 증가하면서 최종적으..
2023.04.05
-
프로그래머스 완주하지 못한 선수 해시 맵 사용 풀이 파이썬
프로그래머스 완주하지 못한 선수 해시 맵 사용 파이썬 완주하지 못한 선수 문제는 인자로 participant와 completion이 주어집니다. 참가자 중 단 한명의 선수만 완주하지 못하는데요, 완주하지 못한 선수를 찾아내야 합니다. 문제 제약 조건은 다음과 같습니다. 참여선수는 1 ~ 10,000명 participant - competion = 1 참가자 이름은 알파벳 20자 이하 참가자 중 동명이인 존재할 수 있음 문제의 핵심은 동명이인이 있다는 점입니다. 단순하게 문자열만 비교해서 문제를 풀 수 없습니다. 해시 맵 사용 파이썬 이 문제가 요구하는 핵심 개념은 해시 맵입니다. key ~ value로 이루어진 자료구조를 통해서 선수들의 이름과 완주 여부를 체크해주어야 합니다. 문제에서 요구하는 hash..
2023.03.22
-
Queue 알고리즘 프린터 문제
문제 풀이 ① 그림 그려보기 ② Code function queuePrinter(bufferSize, capacities, documents){ // 변수 선언 let count = 0; let queue = Array(bufferSize).fill(0); let totalBufferVolume = 0; const calculateToalSize = (array) => array.reduce((acc, cur)=>{return acc+cur},0) // 최초 1번만 실행됨 let currentDocument = documents.shift(); queue.unshift(currentDocument); queue.pop(); totalBufferVolume = calculateToalSize(queue);..
2022.10.13
-
Queue 박스 포장 문제
문제 풀이 문제를 생각해보면 박스 포장 후 나가는 사람들의 자료구조는 Queue를 사용하고 있음을 알 수 있습니다. 첫번째 사람의 박스 갯수와 뒤의 사람 박스 갯수를 비교해서 Max값을 구하면 코드를 작성하는 건 쉽습니다. Javascript 코드 function paveBox(boxes) { let ans = []; while(boxes.length > 0){ let findIdx = boxes.findIndex(item=>boxes[0] < item); if(findIdx === -1){ ans.push(boxes.length); boxes.splice(0); }else{ ans.push(findIdx) boxes.splice(0, findIdx) } } return Math.max(...ans); ..
2022.10.12
-
[Stack] 웹 브라우저 뒤로가기 앞으로가기 문제
Stack 웹 브라우저 뒤로가기 앞으로가기 문제 Stack 웹 브라우저 뒤로가기 앞으로가기 풀이 function browserStack(actions, start) { if(typeof start !== 'string') return false; let prevStack = []; let nextStack = []; let current=start; actions.forEach(item=>{ // 뒤로가기(prevStack pop) // 현재 페이지 nextStack push if(item === -1 && prevStack.length !== 0){ nextStack.push(current); current = prevStack.pop() } // 앞으로 가기(nextStack pop) // 현재 페이..
2022.10.11
-
[Algorithm] 벨만-포드 알고리즘 (Bellman-Ford) Node.js
벨만-포드 알고리즘이란? 그래프 자료구조에서 최단 거리를 구하는 알고리즘입니다. 그래프 상에서 정점간 최단 거리를 구하는 알고리즘에는 다익스트라 알고리즘이 많이 사용되고, 속도도 빠르지만 굳이 벨만 포드 알고리즘을 사용하는 이유는 음의 가중치가 나왔을 때 다익스트라가 사용불가능하기 때문입니다. 벨만 포드 알고리즘은 한 노드에서 다른 노드로 향하는 최단 거리를 구한다. 간선이 음의 가중치를 가져도 최단거리를 구할 수 있다. 시간 복잡도는 O(V\*E)다. 벨만 포드 VS 다익스트라 알고리즘 다익스트라 알고리즘은 현재 정점에서 연결된 가장 작은 가중치를 가진 정점을 선택하게 됩니다. 예를 들어 아래 그림에서 1번에서 3번으로 가는 최단거리를 구할 때 2가지 경로가 존재합니다. (1 >>> 3)으로 가면 거리..
2022.08.05
-
플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) Node.js
플로이드 알고리즘이란? 플로이드 워셜 알고리즘은 그래프 상에서 가능한 모든 경로의 최단거리를 뽑아내는 문제입니다. 플로이드 워셜 알고리즘의 시간복잡도는 O(V^3)입니다. 그래프 상에서 경로의 최단거리를 구해내는 다익스트라 알고리즘과는 다르게 음의 가중치도 사용할 수 있습니다. 플로이드는 이 알고리즘을 개발하고 튜링상을 수상합니다. 플로이드 알고리즘 설명 플로이드 워셜 알고리즘을 적용하기에 가장 좋은 분야는 방향성 그래프가 주어지는 상황입니다. 예를 들어 vertex 4개가 다음과 같은 방향성을 가진 그래프가 있다고 가정합니다. 이 그래프에서 1에서 3으로 가기 위해서는 stopover가 있어야 합니다. 3에서 1로는 갈 수 있지만 1에서 3으로 가기 위해서는 1-2-3을 거쳐 가야 하고, 혹은 1-4-..
2022.08.04
-
[Algorithm] 조합 최적화 알고리즘 subsetSum Node.js
조합 최적화 알고리즘은 주어진 배열 내에서 특정 조건을 만족하는 최적의 조합을 찾아내는 문제입니다. 조합(Combination)이란? 조합은 서로 다른 n개의 원소중에서 순서에 상관없이 r개의 원소를 선택하는 것입니다. 순열(Permutation)은 순서를 가진 조합입니다. let output = subsetSum([1, 8, 3, 15], 10); console.log(output); // --> 9 (= 1 + 8) output = subsetSum([20, 80, 99, 27, 35], 100); console.log(output); // --> 100 (= 20 + 80) output = subsetSum([10, 20, 15, 25, 30], 5); console.log(output); // -..
2022.08.02
-
[Algorithm] TSP 알고리즘(해밀턴 경로 방문 판매원 문제) Node.js
그래프 이론상에서 해밀턴 경로란 모든 꼭짓점을 한번씩 지나는 경로를 의미합니다. 해밀턴 순환은 해밀턴 경로인 순환을 의미합니다. 해밀턴 경로를 가지는 그래프는 해밀턴 그래프 혹은 자취 존재 그래프(Traceable Graph)입니다. NP hard란 무엇인가? NP-hard는 Nondetermisitic Polynomial - Hard를 의미합니다. 비결정적 다항식으로 답을 도출해내기 난해한 문제를 의미합니다. 예를 들어 다음과 같은 문제가 주어지면 x 값은 12라는 것을 도출해낼 수 있습니다. 변수를 정의할 상수가 충분히 존재하기 때문입니다. x - 10 = 2 NP-hard의 대표적인 문제가 TSP(Traveling Saleman Problem)입니다. 어떤 출발점에서 해밀턴 경로를 충족하면서 최단거..
2022.07.31
-
[Algorithm] 병합 정렬(Merge Sort) 구현하기 Node.js
병합 정렬(Merge Sort)이란? 병합정렬(Merge Sort)는 합병 정렬이라고도 부르며 안정 정렬에 속하는 알고리즘입니다. 분할 정복(Divide and Conquer) 알고리즘의 하나로 1945년 존 폰 노이만이 개발하였습니다. 즉, 하나의 문제를 2개의 작은 문제로 분할한 다음 해당 결과를 모아 전체 문제의 답을 구해나가는 방식을 차용합니다. 병합 정렬은 안정 정렬로 데이터 분포에 영향을 거의 받지 않고, 입력 데이터에 상관없이 동일한 시간복잡도(O(N log N)을 가집니다. 분할 단계에서는 비교연산과 이동 연산을 수행하지 않지만, 분할된 데이터들을 특정 조건에 맞춰 병합하는 과정에서 호출의 깊이 Log N 번과 입력 데이터의 길이 N을 곱한 O(N log N) 시간복잡도가 소요됩니다. 병합..
2022.07.19
-
[Algorithm] 백준 2580 스도쿠 Node.js
스도쿠는 18세기 스위스의 수학자 레온하르트 오일러가 창안한 라틴방진(Latin Square)를 기초로 합니다. 미국의 건축가 하워드 간즈(Howard Garns)가 넘버플레이스라는 이름으로 1979년 소개했습니다. 대중화 된 계기는 1984년 일본 니코리사 에서 스도쿠라는 이름을 붙여 판매하면서 알려지기 시작했습니다. 스도쿠를 푸는 방법은 간단합니다. 3가지 규칙에 부합하는 숫자를 찾아 빈칸에 입력하면 됩니다. 가로줄 중 1~9가 중복없이 들어가야 합니다. 세로줄 중 1~9가 중복없이 들어가야 합니다. 3x3 칸 중 1~9가 중복없이 들어가야 합니다. 백준 2580 스도쿠 문제 문제 스도쿠 문제를 푼 최종 모습을 출력하세요 입/출력 입력 아홉줄에 걸쳐 한줄에 9개씩 숫자가 입력됩니다. 숫자가 채워져야 ..
2022.07.18
-
[Algorithm] Ugly Number 구하기 (Node.js)
문제 uglyNumber는 2,3,5로만 나누어 떨어지는 숫자입니다. 주어진 n번째 uglyNumber을 반환합니다. uglyNumber uglyNumber는 2,3,5로만 나누어 떨어지는 숫자입니다. 1번째 uglyNumber은 1입니다. uglyNumber = 1,2,3,4,5,6,8,9,10,12,15,16 ... 입/출력 입력 number >= 1 출력 number 타입을 반환합니다. 주의사항 uglyNumber을 배열에 저장할 때 n번째 uglyNumber은 n-1 인덱스를 가집니다. 풀이 uglyNumber은 소수(Prime Number)와 맥을 같이 합니다. 우선 소수를 구하는 로직은 다음과 같습니다. const checkPrime = (num) =>{ for(let i=2; i
2022.07.15
-
[Algorithm] 동적 프로그래밍 LIS 문제 (Memoization VS Tabulation)
LIS(Longest Increasing Subsequence)는 엄격하게 오름차순으로 정렬된 가장 긴 부분 배열을 반환합니다. 부분 배열(Subsequence)는 데이터의 순서가 유지되는 모든 부분 배열을 의미합니다. 반면 substring 혹은 subarray는 연속된 부분 배열을 의미합니다. 예를 들어 'abc' 문자열이 주어진 경우 substring과 subsequence는 다음과 같습니다. arr='abc'; substring = 'a','b','c','ab','bc', 'abc'; subsquence = 'a','b','c','ab','ac','bc','abc'; 주어진 배열에서 subsequnce를 구하기 위해서 동적 프로그래밍(Dynamic Programming) Memoization과 T..
2022.07.13