최근 코틀린이 아닌 자바를 사용하는 안드로이드 개발자가 iOS 개발을 하고 싶다고 하여 이야기 한 내용을 적어 둔다. 글은 2개로 쪼갠다.



1. MAC을 안 사도 된다.


이전에 포스팅 올렸다가 지워서 캡처 화면은 없지만 인터넷 뒤지니 자료가 많았다. 삼성 시리즈 9 노트북, VMWARE 위에 시에라 버전 올리고 XCode로 해 보았다. 전혀 문제없다. 맥의 커맨드 키는 컨트롤키 기능의 일부를 가져갔다고 생각하면 되고(cmd+C, cmd+V처럼) 맥의 옵션 키는 알트키(Alt, @)로 생각하면 금방 적응될 것이다. 맥이 있었지만 3개월가량 삼성 노트북으로 iOS 앱 개발했다.


2. 적응


맥의 프로그램 실행은 대부분 cmd+space bar를 눌러서 실행한다. 윈도에서 윈도키를 누르고 앱 이름을 실행하는 것과 같다. 윈도에서 Ctrl+Shift+ESC를 눌러 실행하는 프로세스 모니터는 Activity monitor란 이름이니 커맨드+스패이스 바를 통하여 실행하면 된다. 나머지는 우분투 리눅스 배포판과 창 모양, 창 닫기 위치, bash shell(맥에서는 terminal)이므로 사용하기 쉬울 것이다. 바꾸자. 맥으로. 오버워치 때문에 윈도우는 무조건 써야하니 하나 더 사자는 말


윈도우의 익스플로러는 finder 이며, 윈도우처럼 쉬프트 우클릭으로 쉘을 바로 열 수 있는게 아니라 몇가지 작업을 좀 해줘야 한다. 그리고 윈도에서 cmd 말고 powershell을 쓰듯이 맥은 기본 터미널 말고 iterm2를 쓴다. 거기에 zsh를 더해주면 더 좋다. 화면이 좁으니 모니터를 더 구입하는 것보다 bettersnap tool 같은 앱을 연결해서 창을 다룬다. 윈도 유저는 많은 모니터를, 맥 유저는 그냥 맥북 프로에 창 관리를 잘 하는 차이라고 보면 되겠다.



3. SWIFT


우선, ARM Firmware를 하는 내 입장에서는 JAVA나 C/C++, SWIFT가 모두 똑같은 언어로 보인다. PYTHON 은 perl이나 bash shell script 정도로 보이고 ^^;; 인터넷 서핑 공부법으로 편하게 공부하면 되지만 몇 가지 팁을 적어 본다.


(1) module, framework


module은 application 이나 framwork 을 말한다. Andoird에서 Project 와 같은(비슷하다는 말을 "같은"으로 표현하여 더욱 접근 장벽을 더 낮추겠다.) 개념이다. Eclipse에서 여러 Project를 하나의 workspace에 띄우는 것과 같다. Visual Studio 의 Project 개념. 더 큰 개념은 Solution이고 XCode에서는 그것을 workspace라고 부르니 결국 Eclipse의 workspace랑 같다. Android studio 에서는 gradle로 다양한 라이브러리를 import 한다. gradle의 그 한줄이 module, 또는 framework 이라고 보면 되겠다. 즉, framwork은 라이브러리다.



(2) cocoa Pods


cocoa는 STL이나 GLIBC처럼 표준 라이브러리 집합이다. swift 하는 분은 서버 개발자나 iOS 개발자, 특히 모바일 개발자가 많다고 생각된다. iOS는 UIKit을 쓴다. UI 프레임웍은 다음을 참고!


https://developer.apple.com/videos/frameworks/ui-frameworks

Frameworks - UI Frameworks - Videos - Apple Developer


developer.apple.com 



그리고 node.js에 npm이 있고, react에 yarn이 있고, fedora의 yum, ubuntu의 apt 가 있듯이 맥에는 brew 라는 패키지 관리자가 있다. brew를 이용해서 cocoapods를 설치할 수 있는데 pod은 라이브러리 관리 프로그램이다. pod 설치 후 pod init 하면 Podfile이 생성되고 해당 파일에 pod 'SwiftyJSON', '~> 4.0' 와 같이 패키지명을 적어주고 pod install 하면 라이브러리를 설치해 준다. 지우는 명령어는 따로 없고, Podfile에서 삭제하고 pod install 로 지운다. 현재 설치된 버전은 Podfile.lock에 저장된다. 설정파일 2개로만 관리하니 많이 편리하다. workspace 파일(각 project를 관리하는)이 없는 경우 자동 생성해 준다.




(3) 접근 제한자


2 때는 public, private, internal 만 있어서 비슷했는데 3버전 부터 open, fileprivate이 늘어났다. 자바에서의 public 은 swift의 open과 같다. 


https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html

Access Control — The Swift Programming Language (Swift 4.2)


docs.swift.org 




(4) 함수 선언



void 리턴값은 아예 적지 않는다.

func stringMetohd(source : [String]){

for a in source {

print(a)

}

}


var weekdays : [String] = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]


stringMetohd(source: weekdays)






모든 프로그래밍 언어에 y=f(x) 개념이 있듯이 스위프트도 함수가 기본이다.


func square(n:Int) -> Int {…}


로 함수 선언을 한다.


자바에서 public int square(int n) {...} 겠다.


C에서 함수포인터가 JAVA에서 인스턴스 변수로 편하게 객체를 대입하듯이


swift에서는 더 쉽게 할 수 있다.


let a=square


변수 선언은 var나 let을 쓸 수 있는데, let은 C에서 const, java에서 final과 같다.


물론, 자동 자료형 casting이 되지만 중급 이상 프로그래머는 알 것이다. 결국 자료형을 컨트롤해줘야 한다는 것을(뭐 frontUI만 짜면 별 상관 없겠지만 통신 기능만 들어가도 객체 직렬화 때문에 고려할 수 밖에)






믓튼, 이걸 더 쉽게 쓸 수 있다.


var b={(n:Int) -> Int in return n*n}


b(3) 하면 9가 나온다.






더 쉽게 쓸 수도 있다.


var c:(Int) -> Int


c={$0 * $0}


c(3)






bash shell programming을 많이 했던 사람에게는 별 이상할 게 없다.






Activity = ViewController


List View = Table View


Function Pointer, Instance = closer + new programming rules라고 보면 된다.


등 용어가 바뀌는 게 있지만 사실 안드로이드에게 바뀐 건 API 네임뿐.


애플이 삼성 베끼고, 삼성이 애플 베끼듯이 정책이 결국 requirement인데 requirements가 같아지다 보니 그걸 구성하는 system, architecture, module도 같아질 수밖에 없다. 즉, 메커니즘도 별반 차이 없다는 이야기. 애플이 파워칩을 계속 생산했으면 모르겠으나 어차피 Intel base고 각 회사 엔지니어들이 서로 이직을 하는 이상 바뀌는 것은 이름뿐일 거라는.






(5) Array


선언 방법은 다양하다.


var a = [Bool]()


var b : [Int] = []


a = [true, false, (3==3)]


var c = Array(repeating : true, count : 5)


var d : [Int ] = [1, 2, 3, 4]






이와 같이 선언을 먼저하고, 값을 넣는 방법도 있다.


개인적으로 변수가 nil을 포함한다는 개념인 Optional(?)이 있으니


C/C++과 비슷하게


var e : [Character]? = nil 을 선호한다.






배열을 JAVA의 ArrayList 처럼


var chart : [Character] = ["A", "�"]


chart.append("d")


chart += ["4", "5"]


chart.insert("h", at: 1)


chart.remove(at: 2)


편하게 넣었다 뺐다 할 수 있으니 자주 쓴다.






(6) for loop


()가 없는 점이 다르다. 


var weekdays : [String] = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]






for index in 0...6 { //for index in 0..< 7 { 요렇게 해도 된다.


print(weekdays[index])


}






for index in 0...(weekdays.count-1) { //이렇게도


print(weekdays[index])


}






for day in weekdays {


print(day)


}






이런 식으로 쓴다. JAVA에도 for(String a : Iteratores), C++에서 for each(String a in ...) 하고 쓰는 것과 같기 때문에 편하게 볼 수 있다. 다만 ... , ..< 문법이 좀 생소할테지만 쓰다보면 더 직관적라는 것을 알게 된다.






(7) enum


enum integers : Int {


case one


case two


case three


}






print(integers.one.rawValue)


0


보통 enum 은 rawValue를 뽑아내기 위해 쓰는 개념이 아니긴하지만 이렇게 값을 뽑아낼 수 있는 방법이 있다는 뜻.






(8) casting


자바에서는 (String)을 했지만 as를 쓴다.


value as! Int


같이.






4. 조금 더...


struct 는 메소드 없이 멤버변수만 있는 자료형, 


struct myStruct {


var a : String?


var b : Int?


}






var c = myStruct()


c.a = "hello"


print(c.a!)






class의 경우 메소드 포함. Swift 용어로는 프로퍼티, 펑션이 둘 다 있는 class, 프로퍼티만 있으면 struct . 이 정도 개념이면, 맥으로 개발하는데 별 무리 없이 금방 적응하리라 생각된다. JAVA 던, 코틀 린이던, Swift 던 base 코드는 어셈블리랑 C일 수밖에 없어서... 다만 그들이 쌓아 올린 개념이 거대한 프로그램(프레임웍)인 경우 안 무너지기를 바라지만. 내 경험상 칩 단까지 디버깅을 해야 하는 상황도 오기 때문에 결국 안 무너지지는 않는다.






그냥 프런트 UI에 집중하고, 아키텍처나 모듈 단위를 벗어나지 않는 범위에서 디자인 패턴으로 개발자들끼리 싸우게끔 해서 시스템을 못 보게 하는 게 공룡 기업이 하는 방식이다. 






끝으로 대부분의 상황에서 폴링 방식보다 인터럽트 방식이 좋듯. 함수 포인터로 콜백을 구현하듯이 인터페이스를 잘 뽑으면 된다. 그 콜백이 옵서버가 되고 그런 옵서버를 편하게 만들어 주는 API 라이브러리를 사용하면 그게 곧 반응형 프로그래밍이다.






내 책에서도 밝혔지만 사실 더 편한 건 그런 개발을 알아서 다 해주는 개발자 API를 쓰는 기업 사장이 최고의 프로그래머!




http://www.yes24.com/24/Goods/42800973?Acode=101


실무 프로그래밍 초급편에 문제 풀이를 해 달라는 요청이 있었기에 씁니다.


1. 다음은 실행 가능한 코드입니까? 

#include <stdio.h>

int main()

{

             printf("Hello   World\n");

             extern   int s;

             printf("%d\n",   s);

             return   0;

}

int s = 88;


실행 가능합니다. 많은 프로그래머가 전역 변수는 함수 밖에서 선언해야 한다는 규칙으로 알고 있고, 인터넷에도 관련해서 잘못된 포스팅이 수십 건은 되는 것 같아서 책에 싣게 되었습니다. 물론, 이 소스 하나로 절차지향 프로그래밍에 대한 개념 설명시 이용하기도 합니다. C는 사실 객체 지향 언어입니다.


2. 다음은 포인터 입니까? 배열 입니까? 

int (*s)[8];


포인터입니다. 8의 크기를 갖는 배열의 주소를 지칭하는 포인터입니다. 실무 프로그래밍을 위해 *, &를 알고 관련 개념 이해를 위해 만든 문제입니다. 

int sora[8] = {0, 1, 2, 3, 4, 5, 6, 7};

int(*s)[8];

s = &sora;

printf("%d", (*s)[2]);

하면 두번째 값이 출력됩니다.



3. 다음 두 코드의 차이점은 무엇입니까? 

int *s();

void (*s)();


전자는 포인터 함수, 후자는 함수 포인터입니다. 전자는 int* s(); 로 int형 포인터를 반환하는 함수의 선언입니다. main() 함수 뒤쪽에 함수 선언 후 printf("%d", *s()); 로 쓸 수 있습니다. s() 로 함수를 실행하면, 주소 값이 넘어 오는데 해당 주소값에 있는 실제값을 * 연산자를 이용해서 보여줄 수 있습니다.

int* s()

{

int soul = 4;

return &soul;

함수 포인터는 반환 값이 같고 인자 선언이 같은 void myFunc() { } 와 같은 함수를 ss = myFunc; 로 지정할 수 있는 포인터입니다. 함수의 주소를 가리키는 포인터입니다.



4. 결괏값은 무엇입니까? 

#include <stdio.h>

int main()

{

             float   s = 3.141592;

             float   *o;

             o   = &s;

             printf("%f\n",   *o);

             printf("%f",   o[0]);

             return   0;

}

같은 값이 나옵니다. 값을 표현하는 연산자인 *와 []의 동일성을 말하기 위한 문제입니다.


5. 결과값은 무엇 입니까? 

#include<stdio.h>

int main()

{

             int   s = 8;

             const   int *o;

             o   = &s;

             *o   = 88;

             printf("%d",   s);

             return   0;

}


실행되지 않습니다. const 는 해당 메모리 주소가 가리키는 곳을 read-only 영역으로 하라는 뜻입니다. read-only 이기에 *o로 8이라는 값을 가져올 수는 있으나 해당 주소에 쓸 수는 없습니다. const 예약어가 없다면 값이 바뀝니다.


6. 결과값은 무엇 입니까? 

#include <stdio.h>

int main() {

             int   s = 3;

             int   o = 4;

             printf("%d",   s^o);

             return   0;

}

OR 연산(011+100)에 의해 7(111)이 됩니다.


7. 결과값은 무엇 입니까? 

#include <stdio.h>

#include <stdlib.h>

int main()

{

             int   *p = (int*)malloc(88 * sizeof(int));

             printf("%d   ", sizeof(p));                           

             return   0;

}


4혹은 8입니다. 포인터 변수의 크기이므로 주소 크기 입니다. 32bit로 컴파일하면 4, 64bit 인 경우 8이 됩니다.


8. 다음에서 typedef 제외, 코드를 재 작성 하십시요. 

typedef struct _Customer {

             char   name[8];

             int   id;

} Customer;

#include <stdio.h>

#include <string.h>

int main() {

             Customer   s, o;

             strcpy_s(s.name,   "Soul");

             s.id   = 8888;

             strcpy_s(o.name,   "Sora");

             o.id   = 3333;

             printf("name   : %s %s\n", s.name, o.name);     

             printf("id   : %d %d", s.id, o.id);

             return   0;

}

typedef를 제외하면, Customer s, o가 아닌 struct _Customer s, o로 쓰면 됩니다. 보통 typedef struct { 로 바로 씁니다. struct 선언 문법을 헷갈리게 하려고 한 의도입니다. struct 를 잘쓰면 class 부럽지 않습니다. 물론, 메소드(멤버함수, 함수)는 함께 담을 수 없지만 말이죠.


9. 결과값은 무엇 입니까? 

#include<stdio.h>

void main()

{            

             int   i = 0;

             printf("%d   ", i++);

             main();

}

 네, 0이 나오는 무한 루프 입니다. 실무 프로그래밍 초급편에서 main 함수를 호출하는 함수 포인터를 만들고, 무한 루프를 탈출할 수 있는 방법을 연구해 보았습니다.


10. 결과값은 무엇 입니까? 

#include<stdio.h>

union {

             char   s[3];

             int   o;     

} _union;

struct {

             char   r[3];

             int   a;

} _struct;

int main() {        

             printf("%d   %d\n", sizeof _union.s, sizeof _struct.r);

             printf("%d   %d\n", sizeof _union.o, sizeof _struct.a);

             printf("%d   %d", sizeof _union, sizeof _struct);

}


3 3

4 4

4 8

입니다. struct는 메모리를 공유하지 않고 내부에 묶여진 자료형에 대해서 각각 공간을 할당합니다. union의 경우 가장 큰 타입의 메모리의 크기를 가진다고 알려져 있습니다. 메모리를 공유하는 것은 맞지만 가장 큰 메모리를 점유하는 것은 아닙니다. 가장 큰 자료형의 "배수"가 들어갈 공간을 확보합니다. 가령,

union {

char   s[11];

int   o;

} _union;

의 경우, s배열 크기 char*11을 담을 11이여야 할 것 같지만 12가 나옵니다. o가 double일 경우 16이 나옵니다. char s[11]이 가장 크지만 해당 크기만큼만 메모리를 할당하지 않습니다. double형의 2배만큼 할당합니다(. comm   _union,16,16).  struct도 마찬가지 결과입니다. 이론과 실무는 많이 다릅니다.


  • Transformer 아키텍처는 강력한 문맥 이해 능력과 병렬 처리를 통해 텍스트의 의미를 잘 파악할 수 있게 해줍니다.
  • 자기 회귀 언어 모델은 이전에 생성된 단어들을 바탕으로 다음 단어를 예측하여 텍스트를 생성하는 방식입니다.
  • GPT와 같은 모델은 Transformer 아키텍처를 활용한 자기 회귀 언어 모델로, Transformer로 문맥을 이해하고 자기 회귀 방식으로 텍스트를 생성합니다.
  • 이런 조합을 통해 효율적이면서도 자연스러운 텍스트 생성이 가능해집니다.

Transformer와 자기 회귀 언어 모델이 시너지를 내며 발전하고 있고, 앞으로도 자연어 처리 분야에 큰 영향을 미칠 것 같습니다. ChatGPT나 Claude 같은 대화형 AI들이 이런 기술들을 바탕으로 점점 더 사람과 자연스럽게 소통할 수 있게 될 거라 기대되네요.

이런 흐름에 맞춰 우리도 계속 공부하고 발전해 나가는 것이 중요할 것 같아요. 자연어 처리 기술의 동향을 놓치지 않고 꾸준히 따라가려 노력해야겠어요.

Transformer 아키텍처와 자기 회귀 언어 모델의 결합은 자연어 처리(NLP) 분야에서 혁신적인 발전을 이루었습니다. 이러한 기술들은 텍스트의 문맥을 더 깊이 이해하고, 자연스럽게 텍스트를 생성하는 데 중요한 역할을 합니다. GPT와 같은 모델들은 이 두 기술의 장점을 결합하여 텍스트 생성의 질을 크게 향상시켰고, ChatGPT나 Claude와 같은 대화형 AI 개발에 있어 중요한 기반 기술이 되었습니다.

이러한 모델들은 뛰어난 언어 이해 능력과 생성 능력을 통해 다양한 언어 기반 작업에서 놀라운 결과를 보여주고 있습니다. 예를 들어, 기계 번역, 요약, 질문 응답(Q&A), 창의적인 글쓰기 등 다양한 분야에서 활용되고 있습니다. 또한, 이 기술들은 사용자와의 자연스러운 대화를 가능하게 함으로써, 사용자 경험을 극대화하는 데에도 기여하고 있습니다.

미래 전망

  • 개인화와 맞춤형 서비스: Transformer와 자기 회귀 모델을 활용한 AI 시스템은 사용자의 언어 사용 스타일과 선호도를 학습하여, 더 개인화된 대화와 정보 제공이 가능해질 것입니다.
  • 다양한 언어와 방언의 지원 확대: 이 기술들의 발전은 다양한 언어와 방언에 대한 이해를 깊게 하여, 전 세계 많은 사람들에게 접근성을 높일 것입니다.
  • 보다 진보된 상호 작용: 대화형 AI가 사용자의 의도와 감정을 더 잘 이해하게 되면서, 기계와의 상호 작용이 더 자연스럽고 인간 같은 형태로 발전할 것입니다.

지속적인 학습의 중요성

이러한 발전을 따라가기 위해서는 기술의 최신 동향을 꾸준히 학습하고, 새로운 도전을 시도하는 것이 중요합니다. 온라인 코스, 학술 논문, 오픈 소스 프로젝트 참여 등을 통해 지식을 넓히고, 실제 프로젝트에 적용해보는 경험을 쌓는 것이 좋습니다.

또한, 이러한 기술들의 윤리적 사용과 개인 정보 보호에 대한 고민도 함께 이루어져야 합니다. AI 기술의 발전은 사회에 긍정적인 영향을 많이 미칠 수 있지만, 잘못된 사용으로 인한 부작용을 최소화하기 위한 지속적인 노력이 필요합니다.

자연어 처리 분야는 계속해서 발전하고 있으며, 이러한 기술의 발전은 우리가 상상하는 것 이상으로 빠르게 진행될 수 있습니다. 그러므로 지금 이 순간에도 새로운 지식을 탐구하고, 학습하는 자세가 중요합니다.

 

 

 

2019년 아마존 오로라 사용기 

RDS를 쓰는 회사에서 개발하는 제품에 물리 서버를 이용하지 않는다면 아마존이 최선이 선택일 것이다. 전력량, 온/습도, 하드디스크 수명 관리 등을 안해도 될거라 생각하니 좋았다. NoSQL이던 RDBMS던 CRUD(Create, Read, Update, Delete)가 전부인 DB 세상이고 로드벨런싱과 보안계획/실행, 스케일링은 혼자 하기 힘드니까 계속해서 서버 구축하지 말자는 판단. 서버실 공간도 없고, 추가 전기 공사에 회사 이전 계획까지 겹친 것도 한 몫. 우선 DB 서버 부터... 초창기에는 비용도 저렴한 클라우드로 가자고 생각했다. 다들 따져보면 결국, 선택은 AWS RDS. 애저와 구글 클라우드를 이용해 보았으나, 수년 뒤 2018년에 결국 아마존으로 가게 되어 있다고 생각한다. AWS EC2에 우분투가 아닌 아마존 리눅스 기반에 mysql 설치하고 서비스를 만들고 잘 사용했으나, DB 서버는 분리하는게 당연한 지라 AWS RDS로 갈 수 밖엔.

 

우선 RDS로 오로라를 쓰는 이유 MySQL로 하고 싶지만 아래 AWS RDS 소개글을 보면 Aurora를 쓸 수 밖에 없게 만든다. 물론, 앞으로도 자사 솔루션을 더욱 강화할 것임은 당연지사 MySQL & Aurora MySQL은 전 세계에서 가장 많이 사용되는 오픈 소스 데이터베이스입니다. RDS에서 MySQL은 데이터베이스의 컴퓨팅 리소스 또는 스토리지 용량을 쉽게 확장할 수 있는 유연성을 갖춘 MySQL 커뮤니티 에디션의 풍부한 기능을 제공합니다. 최대 16TiB 크기의 데이터베이스를 지원 Amazon Aurora Amazon Aurora는 MySQL 및 PostgreSQL 호환 엔터프라이즈급 데이터베이스입니다($1/일 미만부터 시작). MySQL의 최대 5배 처리량, PostgreSQL의 최대 3배 처리량

자세한 정보는

https://aws.amazon.com/ko/blogs/korea/databaseintroducing-the-aurora-storage-engine/

Amazon Aurora Storage 엔진 소개 | Amazon Web Services

Amazon Aurora는 re:Invent 2014에서 발표한 이후, 2015년 7월에 정식으로 출시 및 2016년 4월 1일 서울 리전에 출시함으로써 국내외 많은 고객들이 RDBMS가 필요한 워크로드에 이미 도입을 하였거나 현재 도입을 고려하고 있습니다. Amazon Aurora는 AWS 역사상 가장 빠른 성장세를 보이고 있는 서비스 입니다. Amazon Aurora의 빠른 성능과 안정성을 지원하는 핵심인 Aurora 스토리지 엔진에 대한 좋은 블로그

aws.amazon.com

Aurora에서 개발용으로 MySQL 5.6.10a와 호환 가능 으로 하여 t2.small로 맞추었다. 개발용으로 만든 EC2 t2.large 인스턴스가 한달에 30만원씩 나오는 것을 보면 AWS 계산기가 제대로 동작 안하는 것 같다.

https://calculator.s3.amazonaws.com/index.html

Amazon Web Services Simple Monthly Calculator


calculator.s3.amazonaws.com

Estimate of your Monthly Bill ($ 45.90)월별 추정 요금 인데 RDS 생성 메뉴에 나오는 가격은 DB 인스턴스 45.99 USD 합계

45.99 USD 이다. 다르다. 0.09라도 다른 것은 다르다. 네트웍 I/O던 내부 I/O 던 관련이 없어 보이는데 말이다.

게다가 Storage 를 20->10으로 바꾸면 비용이 줄어야 할 텐데 오히려 는다. Estimate of your Monthly Bill ($ 46.01) 40으로 늘이면 당연히 는다. Estimate of your Monthly Bill ($ 48.30) 삼성전자 재적시절 유럽시장 SEAndroid 텍스트 로그만 받는데 월 300 만원씩 나간 것을 보면, 추정은 추정일 뿐 일단 사용해 보는 것이 정답임을 이미 알고 있기에 비용 딴지는 그만. 믓튼, 월 5만원에 개발용 서버 사용이 가능하다. 역추척은 서비스는 켜야 한다. $ 4.42 USD/월 추가된다. 만들고 나서 mysql workbench로 접속해 본다.

https://dev.mysql.com/downloads/workbench/

MySQL :: Download MySQL Workbench



dev.mysql.com

 

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Aurora.html#CHAP_GettingStarted.Aurora.Connect

DB 클러스터 생성 후 Amazon Aurora DB 인스턴스의 데이터베이스에 연결하기 - Amazon Relational Database Service



docs.aws.amazon.com

 

카싼드라가 사용자 편의성을 위해 CQL로 추상화 했듯이,

 

AWS 오로라 DB도 그냥 mysql 이라고 생각하고 쓰면 되겠다.

 

 

 

2. 마이그레이션

 

기존 데이터를 가져오는 것도 자료가 많아 좋았다.

 

 

 

 

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.External.Repl.html

Replication with a MySQL or MariaDB Instance Running External to Amazon RDS - Amazon Relational Database Service


docs.aws.amazon.com

 

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.html

Restoring a Backup into an Amazon RDS MySQL DB Instance - Amazon Relational Database Service



docs.aws.amazon.com

 

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.External.Repl.html

Replication with a MySQL or MariaDB Instance Running External to Amazon RDS - Amazon Relational Database Service



docs.aws.amazon.com

 

물리서버가 아니라 마음이 참 편하다. 결론은 돈이 좋다고 해야 하는 건가.

 

사전 학습(Pre-training)과 미세 조정(Fine-tuning)은 트랜스포머 기반 언어 모델을 개발할 때 널리 사용되는 중요한 기법들입니다. 이 두 단계를 통해 모델은 방대한 양의 텍스트 데이터로부터 일반적인 언어 지식을 습득한 후, 특정 태스크에 맞게 조정되어 최적의 성능을 발휘할 수 있게 됩니다. 

사전 학습 단계에서는 대규모의 텍스트 데이터를 사용하여 모델이 언어의 기본 구조와 문맥을 배우게 합니다. 가령 위키피디아나 책, 웹 문서 등 다양한 도메인의 방대한 코퍼스를 활용하죠. 이 단계에서 모델은 텍스트의 통계적 패턴을 파악하고 단어 간의 관계를 이해하는 법을 스스로 학습합니다. 엄청난 양의 데이터를 사용하기 때문에 시간과 자원이 많이 소모되지만, 한 번 학습된 모델은 여러 하위 태스크에 공통적으로 활용될 수 있다는 장점이 있습니다.

충분히 사전 학습된 모델은 미세 조정을 통해 특정 태스크에 맞게 튜닝됩니다. 사전 학습 때보다는 적은 양의 태스크 특화 데이터를 사용하여, 기존에 학습된 가중치들을 조금씩 업데이트하는 거죠. 이를 통해 모델이 해당 태스크에서 최상의 성능을 낼 수 있도록 보정하는 것입니다. 이렇게 사전 학습된 언어 지식을 토대로 태스크에 맞게 모델을 미세 조정하는 전략은 매우 효과적인 것으로 알려져 있습니다.

사전 학습과 미세 조정이 중요한 이유는 이 방법론 덕분에 좋은 성능의 모델을 더 적은 시간과 비용으로 만들 수 있기 때문입니다. 처음부터 태스크 특화 데이터로만 학습을 하려면 많은 양의 레이블링된 데이터가 필요하고 오랜 학습 시간이 걸리겠지만, 사전 학습 모델을 활용하면 상대적으로 쉽고 빠르게 좋은 결과를 얻을 수 있습니다. 그래서 요즘에는 BERT나 GPT 같이 대규모 사전 학습 모델들이 많이 개발되고 있는 추세입니다. 

앞으로도 사전 학습과 미세 조정은 트랜스포머 기반 모델들의 성능을 극대화하는 핵심 기법으로 널리 활용될 것 같습니다. 더 크고 강력한 사전 학습 모델들이 계속해서 등장하고 있고, 이를 다양한 태스크에 적용하는 사례도 증가하는 추세니까요. 우리도 이런 흐름을 잘 이해하고 활용한다면 자연어 처리 분야에서 많은 성과를 낼 수 있을 것입니다.

 

사전 학습(Pre-training)과 미세 조정(Fine-tuning)은 딥러닝 모델, 특히 자연어 처리(NLP)와 컴퓨터 비전 분야에서 널리 사용되는 학습 방법론입니다. 이 방법론은 높은 성능의 모델을 효율적으로 개발하기 위해 설계되었습니다. 여기서 사전 학습과 미세 조정의 과정을 각각 살펴보겠습니다.

사전 학습(Pre-training)

사전 학습은 대규모 데이터셋에서 모델을 훈련시키는 초기 학습 단계입니다. 이 단계의 목적은 모델이 일반적인 지식을 습득하게 하는 것이며, 이러한 지식은 언어의 기본 구조, 문법, 단어 간의 관계, 이미지의 기본 패턴 등이 될 수 있습니다. 사전 학습을 통해 모델은 실제 작업과는 독립적인 광범위한 지식을 습득하게 되며, 이는 후속 작업에서의 성능 향상에 기여합니다.

  • NLP에서의 사전 학습: NLP 분야에서 사전 학습은 주로 대규모 텍스트 코퍼스(위키백과, 책, 웹 텍스트 등)를 사용하여 수행됩니다. 예를 들어, GPT나 BERT와 같은 모델은 다양한 언어 모델링 작업을 통해 사전 학습됩니다.
  • 컴퓨터 비전에서의 사전 학습: 컴퓨터 비전 분야에서는 ImageNet과 같은 대규모 이미지 데이터셋을 사용하여 모델이 기본적인 시각적 패턴과 객체를 인식하도록 합니다.

미세 조정(Fine-tuning)

미세 조정은 사전 학습된 모델을 특정 작업에 맞게 조정하는 과정입니다. 이 단계에서는 사전 학습된 모델의 가중치를 초기값으로 사용하고, 작업 관련 데이터셋을 사용하여 추가 학습을 수행합니다. 미세 조정을 통해 모델은 특정 작업에 필요한 지식을 습득하게 되며, 이는 작업의 성능을 크게 향상시킬 수 있습니다.

미세 조정의 주요 장점은 다음과 같습니다:

  • 효율성: 사전 학습된 모델을 사용함으로써, 작은 데이터셋으로도 높은 성능을 달성할 수 있습니다. 이는 모델이 이미 일반적인 지식을 습득했기 때문입니다.
  • 속도: 사전 학습된 가중치를 사용함으로써, 학습이 더 빠르게 수행됩니다. 모델은 무작위 가중치에서 시작하는 것이 아니라 이미 어느 정도 최적화된 상태에서 학습을 시작하기 때문입니다.
  • 융통성: 미세 조정을 통해 다양한 작업에 쉽게 적용할 수 있으며, 특정 작업에 대한 모델의 성능을 최적화할 수 있습니다.

사전 학습과 미세 조정의 조합은 현대 딥러닝 연구와 응용에서 중요한 전략이 되었습니다. 이 방법론을 통해 개발자와 연구자들은 제한된 리소스와 데이터로도 복잡한 문제를 해결할 수 있는 강력한 모델을 개발할 수 있습니다. 이러한 접근 방식은 특히 자연어 처리(NLP)와 컴퓨터 비전 분야에서 큰 성공을 거두었으며, 이제는 음성 인식, 의료 이미지 분석, 그리고 다양한 종류의 예측 모델링 작업에도 널리 적용되고 있습니다.

사전 학습된 모델을 미세 조정하는 과정은 특히 데이터가 부족한 상황에서 그 가치가 빛납니다. 작은 데이터셋만으로도 고성능의 모델을 개발할 수 있기 때문에, 데이터 수집의 어려움이나 비용 문제를 상당 부분 해결할 수 있습니다. 또한, 미세 조정을 통해 하나의 사전 학습된 모델을 다양한 작업에 재활용할 수 있으므로, 모델 개발 시간을 크게 단축시키고 효율성을 높일 수 있습니다.

사전 학습과 미세 조정의 구체적인 절차

  1. 사전 학습(Pre-training):
    • 대규모 데이터셋에서 모델을 학습시켜 일반적인 지식을 습득합니다.
    • NLP에서는 언어 모델링, 컴퓨터 비전에서는 이미지 분류 등의 일반적인 작업을 수행합니다.
  2. 미세 조정(Fine-tuning):
    • 사전 학습된 모델을 기반으로, 특정 작업을 위한 작은 데이터셋을 사용하여 추가 학습을 수행합니다.
    • 이 과정에서는 학습률을 낮추고, 특정 작업에 맞게 모델의 일부를 조정합니다.

사전 학습과 미세 조정의 성공 사례

  • NLP에서의 BERT와 GPT: 이 모델들은 다양한 NLP 작업에서 뛰어난 성능을 보여주며, 자연어 이해(NLU)와 생성(NLG) 분야에서 혁신을 이끌었습니다.
  • 컴퓨터 비전에서의 ResNet과 EfficientNet: 이러한 네트워크는 ImageNet 같은 대규모 이미지 데이터셋에서 사전 학습된 후, 다양한 이미지 관련 작업에 미세 조정되어 뛰어난 성능을 나타냈습니다.

사전 학습과 미세 조정 기법의 발전은 앞으로도 계속될 것이며, 더 많은 분야에서의 응용이 기대됩니다. 이러한 접근 방식은 머신 러닝 모델의 효율성과 범용성을 높이는 데 크게 기여하며, 딥러닝 기술의 발전을 가속화할 것입니다. 따라서 이러한 기법을 이해하고 활용할 수 있는 능력은 머신 러닝과 인공 지능 분야에서 매우 중요합니다.

 

 

 

 

 

 

 

 

 10월 26일

결국 새로산 맥북프로 2개월 만에 수리하러 간다. 키보드 누르는 중에 끈적임 발생해 버렸따.

 

대규모 언어 모델(Large Language Model) 기반으로 만들어진 대화형 AI

알고리즘의 핵심은 Transformer 아키텍처와 자기 회귀 언어 모델(Autoregressive Language Model)

 

Transformer 아키텍처와 자기 회귀 언어 모델(Autoregressive Language Model)은 자연어 처리(Natural Language Processing, NLP) 분야에서 중요한 역할을 합니다. 각각의 개념을 하나씩 자세히 설명해 보겠습니다.

Transformer 아키텍처

Transformer는 2017년 Google의 연구원들에 의해 소개된 모델 아키텍처로, "Attention Is All You Need"라는 논문에서 처음 등장했습니다. Transformer 모델은 이전의 순환 신경망(RNN)이나 컨볼루션 신경망(CNN) 기반 모델들과 달리, 전체 시퀀스를 한 번에 처리할 수 있는 '어텐션 메커니즘'을 사용합니다. 이로 인해 모델의 병렬 처리 능력이 향상되고, 긴 시퀀스의 데이터에서 발생하는 의존성 문제(예: 장거리 의존성 문제)를 효과적으로 다룰 수 있게 되었습니다.

Transformer 아키텍처의 주요 구성 요소는 다음과 같습니다:

  • Self-Attention: 입력 시퀀스 내의 모든 단어들이 서로 '어떻게 연관되어 있는지'를 학습할 수 있게 해주는 메커니즘입니다. 이를 통해 모델은 각 단어의 문맥을 더 잘 이해할 수 있습니다.
  • Positional Encoding: Transformer 모델은 기본적으로 시퀀스의 순서에 대한 정보를 갖고 있지 않습니다. 따라서 위치 정보를 입력에 추가함으로써 모델이 단어의 순서를 인식할 수 있게 합니다.
  • Multi-Head Attention: 다양한 '어텐션 헤드'를 사용하여 다양한 시점에서 입력 데이터를 병렬로 처리함으로써, 모델이 다양한 관점에서 정보를 학습할 수 있게 합니다.
  • Feed-Forward Neural Networks: 각 어텐션 단계 후, 모델은 추가적인 처리를 위해 피드포워드 신경망을 사용합니다.

자기 회귀 언어 모델 (Autoregressive Language Model)

자기 회귀 언어 모델은 과거의 단어들을 기반으로 다음 단어를 예측하는 모델입니다. 이 모델은 시퀀스의 현재 단어를 예측하기 위해 이전에 등장한 단어들만을 사용합니다. 자기 회귀 모델은 문장이나 문서에서 단어의 순서와 문맥을 학습하여 자연스러운 언어 생성을 가능하게 합니다.

자기 회귀 언어 모델의 주요 특징은 다음과 같습니다:

  • 순차적 예측: 모델은 이전 단어들의 시퀀스를 조건으로 하여 다음 단어를 순차적으로 예측합니다.
  • 장기 의존성 학습: 모델은 긴 문장이나 문단에서도 이전에 나타난 단어들 사이의 관계를 학습할 수 있습니다.
  • 언어 생성: 자기 회귀 모델은 텍스트 생성에 자주 사용됩니다. 이전 단어들을 기반으로 문장을 계속해서 확장해 나가는 방식으로 작동합니다.

 

http://thegear.co.kr/16164
 

교사 강요(Teacher Forcing)는 순환 신경망(RNN)이나 자기 회귀 모델 등 시퀀스를 생성하는 모델을 훈련시킬 때 사용되는 기법입니다. 이 방법은 모델이 시퀀스의 다음 단어를 예측할 때, 이전 단계에서 모델이 실제로 예측한 단어가 아니라 실제 정답 시퀀스에서의 이전 단어를 입력으로 사용합니다. 즉, 모델이 단어를 잘못 예측하더라도, 항상 정확한 이전 단어를 기반으로 다음 단어를 예측하게 만드는 방식입니다.

교사 강요의 목적

교사 강요의 주요 목적은 모델의 학습 속도와 안정성을 향상시키는 것입니다. 초기 훈련 단계에서 모델의 예측이 부정확할 가능성이 높기 때문에, 정답 시퀀스를 제공함으로써 모델이 올바른 방향으로 더 빠르게 학습할 수 있도록 돕습니다.

교사 강요의 장점

  • 빠른 수렴: 모델이 정답 시퀀스를 직접적으로 학습함으로써, 학습 과정이 빨라집니다.
  • 학습 안정성: 초기 학습 단계에서 예측의 누적 오류가 학습 과정에 부정적인 영향을 미치는 것을 방지합니다.

교사 강요의 단점 및 한계

  • 노출 편향(Exposure Bias): 훈련 시에는 항상 정답을 보면서 학습하지만, 실제 사용 시에는 모델의 예측을 바탕으로 다음 단어를 생성해야 합니다. 이로 인해 훈련 시와 실제 사용 시의 차이가 발생할 수 있습니다.
  • 창의적인 텍스트 생성의 어려움: 모델이 정답 시퀀스에 지나치게 의존하게 되면, 새로운 혹은 창의적인 텍스트를 생성하는 능력이 제한될 수 있습니다.

교사 강요를 보완하는 방법

  • 교사 강요 비율(Teacher Forcing Ratio): 모델이 자신의 예측을 입력으로 사용하는 비율과 정답 시퀀스를 사용하는 비율을 조정함으로써, 노출 편향 문제를 완화할 수 있습니다.
  • Scheduled Sampling: 훈련 과정에서 점차적으로 모델이 자신의 예측에 더 의존하도록 만드는 기법입니다. 초기에는 교사 강요를 많이 사용하다가 점진적으로 자신의 예측을 사용하는 비율을 높여갑니다.

교사 강요는 모델의 훈련 과정을 개선하기 위한 효과적인 방법이지만, 그 한계를 인식하고 적절히 조절하는 것이 중요합니다.

 

판교역 4번 출구에 나오면 좌측에 육교가 있다. 좌측 육교를 타고 중간지점에서 우측으로 꺽으면 지하에 일렉트로 마트가 있는 건물이 있다. 1층 마트로 들어가서 엘리베이터를 타도 된다. 일렉트로 마트에서 애플 제품이 많은 전시장을 찾으면 바로 옆에 UBASE가 있다. UBASE에서 번호표를 뽑으면 된다. 아이폰 고객과 기타 고객은 구분되어 있기에 기타 고객으로 하면 차례가 금방온다.(그래도 40분 이상) 나는 애플 전화 서비스를 이미 받은 상태라 가니, 바로 키보드 전체 수리로 대화 주제가 넘어갔다. 그런데 제품을 맡겨야 한다는 말은 못 들었었는데, 맡기지 않으면 애플에서 키보드를 안 보내줘서 수리가 안된다고 했다. 이건 뭔... 황당한 이야기인지 모르겠지만... 맡길 수 밖에 없었다. 비밀번호를 따로 요구 하지 않는다. 전원 켜진 상태에서 검사 프로그램을 돌리는 것 같다. 애플 고객센터에서도 file vault를 활성화 하라고 했는데 그렇게 했다. 하드 디스크를 복사해도 일단 file vault를 깨는 마스터 솔루션이 없는 이상 보안에는 문제 없어 보였다. 인터넷을 뒤져보니 미국의 경우가 나온 기사에 해당 내용이 있긴했다. 뭐든 겪어 봐야 한다는...

 

Transformer 어텐션 메커니즘을 활용하여 입력 시퀀스의 위치 간의 관계를 파악하고, 병렬 연산을 통해 빠른 학습을 가능케 합니다. 자기 회귀 언어 모델은 이전에 생성된 단어들을 입력으로 받아 다음 단어를 예측하는 방식으로 동작합니다.

Transformer의 핵심 특징

Transformer 모델은 '어텐션 메커니즘(Attention Mechanism)'을 핵심으로 사용하여, 입력 시퀀스의 각 위치 간의 관계를 파악합니다. 이는 다음과 같은 중요한 이점을 가집니다:

  • 문맥 이해: Transformer는 시퀀스 내의 모든 단어 간의 관계를 직접적으로 계산함으로써, 단어의 문맥적 의미를 더 잘 이해할 수 있습니다.
  • 병렬 처리: 전통적인 순환 신경망(RNN)과 달리, Transformer는 입력 시퀀스를 전체적으로 한 번에 처리할 수 있어, 학습 과정에서의 병렬 처리가 가능해집니다. 이는 모델 훈련 속도를 크게 향상시킵니다.
  • 장거리 의존성 학습: 어텐션 메커니즘 덕분에, Transformer는 긴 입력 시퀀스에서도 먼 거리에 있는 단어들 간의 의존성을 효과적으로 학습할 수 있습니다.

자기 회귀 언어 모델의 특징

자기 회귀 언어 모델은 이전에 생성된 단어들을 입력으로 받아 다음 단어를 예측하는 방식으로 동작합니다. 이 모델의 주요 특징은 다음과 같습니다:

  • 순차적 예측: 모델은 현재까지 생성된 시퀀스를 기반으로 다음에 올 단어를 하나씩 순차적으로 예측합니다. 이 과정은 자연스러운 언어 생성에 매우 유용합니다.
  • 언어 생성 능력: 자기 회귀 모델은 주어진 텍스트에 이어질 새로운 텍스트를 생성하는 데 사용될 수 있으며, 이를 통해 자연스러운 문장을 생성하는 능력을 가집니다.
  • 장기 의존성 학습: 모델은 이전 단계에서 생성된 단어들의 정보를 활용하여 다음 단어를 예측하기 때문에, 시퀀스 내의 장기 의존성을 파악하는 데 도움이 됩니다.

결합 사용

Transformer 아키텍처와 자기 회귀 언어 모델은 서로 다른 방식으로 텍스트를 처리하고 생성하지만, 두 기술을 결합하여 사용하는 경우가 많습니다. 예를 들어, GPT(Generative Pre-trained Transformer) 시리즈는 Transformer 아키텍처를 기반으로 한 자기 회귀 언어 모델입니다. 이러한 모델은 Transformer의 강력한 문맥 이해 능력과 병렬 처리 장점을 활용하여, 효율적이면서도 자연스러운 텍스트 생성을 가능하게 합니다.

 

다행이 서브 맥북 에어가 있어서(성능은 더 좋은 서브... ) 일주일을 기다릴 수 있겠다. 상당사에게 여러 질문을 했을 때 늦으면 목요일 저녁이 될 것 같은데, 빠를 수도 있다고 했다. 이에, 애플 맥북 프로 키보드 수리 기간은 일주일이라고 보는게 좋을 듯. 인터넷 검색해보니 수리 기간 끝나면 80만원 정도 자비로 고쳐야 하는 것 같다. 나 역시 처음에는 문제 없다가 하루 10시간 정도씩 한달 반 정도 쓰니 나왔던 문제였다. O 키의 키감이 갑자기 변하더니 찐덕하게 들어가서 잘 안나오는 현상이 나왔다. 수리 센터에서는 키보드 전체를 2018년도의 것으로 교체해 준다고 하니 다행이다. 그 전에 이런 결함을 모르고 고생하셨던 수많은 애플 유저에게 감사한다. 수리 후에 배터리 사이클이 1이 되었다. 키보드는 4년 수리 기간 동안 수리하면 된다. 중고로 팔기전에 키보드 수리해서 배터리 사이클 1로 팔면 될 듯하다. 물론, 난 귀찮은 걸 싫어해서 넋두리니 파는 사람/사는 사람 알아서 들으시길.

 

판교 유베이스 위에 노브랜드가 있고 그 위에 복국 집 있다.

수리... 그리고 복요리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


sudo /usr/libexec/locate.updatedb


updatedb는 linux랑 이름이 같다.


sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist


이렇게 로딩 후 

locate 가 동작한다.




  • java

MyClass c;

c = new MyClass();

c.member = 1;

c.method();


  • Objective-C

MyClass *c;

c = [[MyClass alloc] init];

c.member = 1;

[c method];


  • C

void myFunction(int);


void myFunction(int a) {

printf(“ HelloWorld \n”);

}


  • Objective-C

@interface MyClass: NSObject


-(void) myFunction: (int) a;


@end


@implementation MyClass

-(void) myFunction: (int) a

{

NSLog(@“HelloWorld \n”);

}

@end


  • Java

class XXX {

int a;

int b;

public static void main(String args[]) {}

}

  • Obj-C

@implementation XXX

{

int a;

int b;

}

@end

int main(int argh, char *argv[]) { return 0; }


  • Java

public int getNumer() { return number; }


  • Obj-C

-(int) getNumber { return number; }



#if DEBUG

        txtID.text = "itsme"

        txtPASSWD.text = "goodToSeeU#123"

#endif

+ 원리, 그래픽 소스까지 넣으면 복잡.

클로저는 간단하다.


import UIKit


func textT(_ first : ()-> (), _ second : ()-> ()) {

    first()

    second()

}


textT( { print("first") }, { print("second") })




보통 클로저는 하나만 쓰기 때문에 ()를 닫아 버리고 {} 로 대체 가능하다.


import UIKit


func textT(_ first : ()-> (), _ second : ()-> ()) {

    first()

    second()

}


textT( { print("first") }) { print("second") }


class ViewController: UIViewController {

    

    func textT(_ first : ()-> (), _ second : ()-> ()) {

        first()

        second()

    }

    

    override func viewDidLoad() {

        textT( { print("first") }) { print("second") }

    }

}

REST API를 쓴다면 필시 Alamofire를 이용하리라 생각된다.

클로저를 이용하면, DispatchQueue를 이용하지 않고 동기화를 할 수 있다.


make func getJSON() to func getJSON(_ whatUwant2execute : @escaping () -> () )


and use your function


getJSON { ... codes ... }


and choose the location you want to execute in Alamofire


getJSON(_ whatUwant2execute : @escaping () -> () ) { Alamofire.request(.GET, "http://announcement.vassy.net/api/AnnouncementAPI/Get/").responseJSON {

 (Response) -> Void in     // checking if result has value    

   if let value = Response.result.value {         

    let json = JSON(value)         

    whatUwant2execute()        

    .        

    .        

    .

then ... codes ... will be executed on that point.


결국 클로저는 함수 포인터고 함수를 실행할 때 쓰는 ()를 이용해서 트리거 시킨다가 요점.


내가 말하고 싶은 더블 클로저는 파라미터 2개인 클로저가 아니라 2차 포인터 처럼 클로저 안에 클로저를 말한다. 포인터를 C의 함수 포인터로 이해하면 쉽지만 이론 설명은 생략. 바로 코드로... 위 소스에서 두번째 클로저는 지웠다. 이름을 바꾸고 클로저 안에 클로저를 넣으면 된다. 흔적 따라오라며 다 바꾸진 않음


import UIKit


func progressBar(_ first : ((Int)->())-> ()) {

    first() { (s) in

        print(s, " %")

    }

}


progressBar() { (closure) -> () in

    print("hello msg")

    closure(10)

    print("checking new version of software")

    closure(20)

    print("connect to the updating server")

    closure(50)

    print("download loop")

    closure(100)

}


핵심은 progress를 담고 있는 var 를 없애는 함수형 프로그래밍을 한다는데 있다. 내가 생각하는 함수형 프로그래밍은 메모리를 삭제 과정 없이 계속 리니어하게 써서 속도를 향상 시키는데 있다고 믿지만, 어느 순간 변질 된 듯. 리눅스 커널 분석하며 어려운 함수 포인터를 typedef 로 무한적 래핑할 수 있는 제자들은 이해가 쉬울 듯.


트리블 클로저를 이용하면 updating 되고 있는 프로그레스바를 더욱 스무스하게 만들 수 있다.


하드웨어 발전 속도만 믿고 뱅글 뱅글 도는 기다림표로 점철되어진 안타까운 소프트웨어에 활력을!


그리고 팁...


FYI,

Plz remember () is used 2 ways "make something in memory" or "executing"

In swift world {} is the meaning of one of the (), executing.

This is the reason why you don't need to write like a below

getJSON ({ ... codes ... })

and {} is the meaning of the definition of functions body.

Both () and {} have two meanings we have to know.

망할 스택 오버플로우에 앞으로 답변하나 봐라. 대한민국 프로그래머 만세


interfacebuilder의 constraints는 무시하고 했는데 이제 같이 고려해야 한다. 

캘린더, 메세지 뷰 등 오픈소스 땡겨서 넣고 나니 충돌 에러가 많네.


에러가 다음과 같은 양상을 띤다면, IB constratins와 snapkit 의 제약 사항을 함께 따져봐야 한다.


Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

2018-12-12 09:18:49.725504+0900 Bridge2[12529:869661] [LayoutConstraints] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. 

Try this: 

(1) look at each constraint and try to figure out which you don't expect; 

(2) find the code that added the unwanted constraint or constraints and fix it. 

(

    "<SnapKit.LayoutConstraint:0x282946400@TendencyCalendarPopUP.swift#140 UIButton:0x1036cba20.top == UILabel:0x1036cb730.bottom + 3.0>",

    "<SnapKit.LayoutConstraint:0x282947180@TendencyCalendarPopUP.swift#166 UILabel:0x1036ccf40.top == UILabel:0x1036cb730.bottom + 10.0>",

    "<SnapKit.LayoutConstraint:0x282947240@TendencyCalendarPopUP.swift#168 UILabel:0x1036ccf40.top == UIButton:0x1036cba20.bottom + 10.0>"

)


Will attempt to recover by breaking constraint 

<SnapKit.LayoutConstraint:0x282947240@TendencyCalendarPopUP.swift#168 UILabel:0x1036ccf40.top == UIButton:0x1036cba20.bottom + 10.0>


Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.


'진행 프로젝트 > [진행] My tools.' 카테고리의 다른 글

kakao T crash  (2) 2019.01.18
ibk onebank crash  (0) 2019.01.18
하스스톤 크러시 로그  (0) 2019.01.18
그냥 테스트 코드  (0) 2019.01.17
오늘자 트러블 슈팅  (0) 2019.01.08


//  Copyright © 2018 hajunho.com All rights reserved.



import UIKit


//Where am I, exactly  ex) "".pwd(self)

//I recommend the codes below to a base view controller


extension String {

    func pwd(_ x: Any)  {

        debugPrint("🍭pwd_"String(describing: x.self))

    }

}


퀀트(Quant):

  • 퀀트는 "Quantitative Analyst"의 줄임말로, 금융 분야에서 수학, 통계학, 프로그래밍 등을 활용하여 금융 모델과 거래 전략을 개발하고 분석하는 전문가를 말합니다.
  • 퀀트는 주로 헤지펀드, 투자은행, 자산운용사 등에서 일하며, 복잡한 금융 상품의 가격 결정, 위험 관리, 포트폴리오 최적화 등의 업무를 수행합니다.
  • 퀀트는 데이터 분석, 알고리즘 트레이딩, 머신러닝 등의 기술을 활용하여 금융 시장을 분석하고 예측합니다.

금융모델(Financial Model):

  • 금융모델은 금융 상품, 투자 의사 결정, 기업 가치 평가 등을 분석하기 위해 구축된 수학적 모델을 말합니다.
  • 금융모델은 주로 엑셀(Excel)이나 기타 스프레드시트 도구를 사용하여 작성되며, 기업의 재무 데이터, 시장 데이터 등을 입력으로 사용합니다.
  • 금융모델은 미래 현금 흐름 예측, 자본 구조 최적화, 투자 수익률 계산, 위험 분석 등 다양한 목적으로 사용됩니다.
  • 금융모델은 투자 은행, 회계법인, 컨설팅 회사 등에서 널리 사용되며, 기업 인수합병(M&A), 기업공개(IPO), 자산 가치 평가 등의 업무에 활용됩니다.

요약하면, 퀀트는 금융 분석을 위한 전문가를 말하는 반면, 금융모델은 금융 분석을 위해 구축된 수학적 모델 자체를 의미합니다. 퀀트는 금융모델을 개발하고 활용하는 사람이며, 금융모델은 퀀트가 사용하는 도구 중 하나라고 볼 수 있습니다.

퀀트(Quant)

  • 정의: "퀀트"는 "Quantitative Analyst"의 줄임말로, 양적 분석가를 의미합니다. 퀀트는 수학, 통계학, 금융공학, 컴퓨터 과학 등의 전문 지식을 바탕으로 금융 시장의 가격 결정, 위험 관리, 투자 전략 개발 등에 관한 양적 모델을 개발하고 분석하는 전문가입니다.
  • 역할: 퀀트는 복잡한 수학적 및 통계적 모델을 사용하여 금융 상품의 가치를 평가하거나, 시장 위험을 측정하고, 투자 전략을 설계합니다. 예를 들어, 옵션 가격 책정, 포트폴리오 최적화, 고빈도 거래 알고리즘 개발 등 다양한 영역에서 활동합니다.

금융모델(Financial Model)

  • 정의: 금융모델은 금융 시장, 금융 상품, 투자 전략, 기업 재무 상태 등을 수학적으로 표현한 모델입니다. 이 모델은 주로 투자 의사 결정, 위험 평가, 가치 평가, 재무 계획 수립 등을 목적으로 사용됩니다.
  • 특징: 금융모델은 시장의 변동성, 금리, 주가 등 다양한 금융 변수들을 반영하여 금융 상품의 가치를 추정하거나, 특정 금융 전략의 수익성을 예측합니다. 대표적인 예로는 블랙-숄즈 모델(옵션 가격 결정), CAPM(자본 자산 가격 모델), MPT(현대 포트폴리오 이론) 등이 있습니다.

차이점

  • 퀀트 vs. 금융모델: "퀀트"는 금융 모델을 개발하고 분석하는 사람을 의미하는 반면, "금융모델"은 그러한 분석에 사용되는 수학적 혹은 통계적 도구입니다. 즉, 퀀트는 금융모델을 만들고 활용하는 전문가를 말하고, 금융모델은 그러한 전문가들이 사용하는 구체적인 수학적 표현이나 프레임워크를 지칭합니다.

이러한 관점에서 볼 때, 퀀트는 금융모델을 설계, 개발, 적용하는 역할을 수행하며, 금융모델은 금융 시장의 다양한 현상을 이해하고 예측하기 위한 도구로 사용됩니다.

 

 

+ Recent posts