깃 크라켄 계정 만드는 링크

 

You're Invited to Use GitKraken Client!

Use this link to sign up for a free GitKraken account. You will get access to the legendary GitKraken Client! And we'll both be entered to win a $100 Amazon Gift Card!

www.gitkraken.com

위의 링크로 들어간다. 

Sign up free로 들어간다.

깃허브로 가입하는 것을 추천한다.

빨간 박스 안쪽에 있는 서비스들로 가입을 했을 때 Pro 계정을 쓸 수 있다.

다른 이메일로 가입했던 경우라면 깃허브에 연결을 통해서 Pro로 전환 가능하다.

체크박스 눌러주고 Accept

위와 같은 화면이 나온다면 Pro 계정으로 전환이 된 것이다.

BOARDS 나 TIMELINES가 Pro에서 사용할 수 있는 칸들이다.

Pro계정이 아닌 경우에는 위처럼 될 것이다.

 

아, 그리고  Pro 계정을 쓰기 위해서는 깃허브에서 Pro 인증을 받아야 한다.

학생은 깃허브 Pro를 무료로 사용할 수 있기 때문에 학교 인증을 통해서 깃허브 Pro 인증을 받는 것을 추천한다.

파이프라인이란 무엇인가?
중앙처리장치(CPU)의 작동원리

컴퓨터 구조 분야에는 일곱가지의 위대한 아이디어가 있다. (Computer Organization and Design Mips Edition, David A. Patterson) 

설계를 단순화하는 추상화(abstraction)
자주 생기는 일을 빠르게(common case fast)
병렬성을 통한 성능 개선(parallelism)
파이프라이닝을 통한 성능 개선(pipelining)
예측을 통한 성능 개선(prediction)
메모리 계층구조(memory hierarchy)
여유분을 이용한 신용도 개선(dependability)

이 중에서 파이프라이닝은 컴퓨터 구조에서 많이 볼 수 있는 병렬성의 특별한 형태이다. 연탄나르기를 할때 모두가 서있고 연탄을 바로 옆사람에게 넘기는 구조라고 생각하면 된다. 

더 자세히 이야기하자면, 여러 명령어가 중첩되어 실행되는 구현 기술이다. 구체적인 예시로 세탁을 할 때를 들어보겠다. 빨래를 많이 안해본 사람들은 다음과 같이 파이프라이닝되지 않은(nonpipelined) 세탁 방법을 사용한다.

1. 세탁기에 한 뭉치의 더러운 옷을 넣는다.
2. 세탁기 작동이 끝나면 젖은 옷을 건조기에 넣는다.
3. 건조기 작동이 끝나면 건조된 옷을 탁자 위에 놓고 접는다.
4. 접는 일이 끝나면 같은 방 친구에게 옷을 옷장에 넣어달라고 부탁한다.
5. 이 사이클을 반복한다.

그렇다면 파이프라이닝된 세탁 방법은 무엇일까?

 

세탁기 작동이 끝나고 젖은 옷을 건조기에 넣을때, 다른 옷감을 세탁기에 넣어 세탁하는 것이다. 이런 식으로 병렬되게 세탁을 하면 전체 태스크의 시간이 줄어든다.

파이프라이닝되지 않은 세탁(위)과 파이프라이닝된 세탁(아래)

중요한 점은 파이프라이닝을 한다고 해서 각 단계에서 소요되는 시간이 줄어드는 것은 아니다. 파이프라이닝되기 전의 세탁기 작동시간이 1시간이었다면, 파이프라이닝되었을 때에도 1시간의 작동시간을 갖는다.

할 일이 충분히 많고, 위의 그림처럼 모든 단계가 거의 같은 시간이 걸린다면, 파이프라이닝에 의한 속도 향상은 파이프라이닝의 단계 수와 같다. 위의 경우에는 세탁, 건조, 개기, 넣기의 네 단계가 있으므로 단계 수는 4이다. 

프로세서에서는 단계가 다음처럼 나뉘어진다.

1. 메모리에서 명령어를 가져온다
2. 명령어를 해독하는 동시에 레지스터를 읽는다. MIPS 명령어는 형식이 규칙적이므로 읽기와 해독이 동시에 일어날 수 있다.
3. 연산을 수행하거나 주소를 계산한다.
4. 데이터 메모리에 있는 피연산자에 접근한다.
5. 결과값을 레지스터에 쓴다.

프로세서는 논리적으로 데이터패스와 제어 유닛의 두 부분으로 구성된다. 각각은 프로세서의 근육과 두뇌에 해당한다. 데이터패스는 연산을 수행하고, 제어 유닛은 명령어가 뜻하는 바에 따라 데이터패스, 메모리, 입출력장치가 할 일을 지시한다. 프로세서 내부에는 또 다른 종류의 메모리가 있는데 이것을 캐시메모리라고 한다. 캐시 메모리는 DRAM의 버퍼 역할을 하는 작고 빠른 메모리이다.

CPU 내부 구조

 

'스터디 관련' 카테고리의 다른 글

CS 스터디 04회차, ~ 7월 7일(목)  (0) 2022.07.07
CS 스터디 03회차, ~ 6월 30일(목)  (0) 2022.06.30
CS스터디 01회차, ~06월 02일(목)  (0) 2022.06.02
2/3(수) 과제  (0) 2021.02.03
1/6일 스터디 과제  (0) 2021.01.06
캐시(cache)란 무엇인가?
메모리의 구조는 어떻게 구성되어 있는가? (데이터, 스택 등의 단어를 사용하시오)

캐시는 프로세서가 단기간에 필요로 할 가능성이 높은 정보를 임시로 저장할 목적으로 사용한다. 시스템이 정보를 한 곳에서 다른 곳으로 이동시키는 일에 많은 시간을 보내기 때문에 여러개의 복사과정들을 가능한 한 빠르게 동작하도록 하기 위해서 만들어졌다.

일반적으로 캐시는 보다 크고 느린 디바이스에 저장된 데이터 객체를 위한 준비영역으로 사용하는 작고 빠른 저장장치다. 메모리 계층구조?

일반적으로 계층구조에서 낮은 곳에 위치한 디바이스들은 더 긴 접근시간을 가지며, 따라서 이러한 긴 접근시간을 줄이기 위해서 더 큰 블록을 사용하는 추세다. 

캐시의 장점은 다음 두가지이다.

시간지역성 활용하기. 동일한 데이터 객체는 시간 지역성 때문에 여러 번 재사용될 가능성이 있다. 일단 어떤 데이터 객체에 첫 미스가 발생했을 때 캐시로 복사되고 난 후에는 이 객체로 연속적인 다수의 적중을 기대할 수 있다. 캐시가 다음 아래단계에 있는 저장장치보다 더 빠르기 때문에 이와같은 차후의 적중이 처음의 미스보다 더 빨리 서비스될 수 있다.

공간 지역성 활용하기 블록들은 대개 여러개의 데이터 객체들을 포함한다. 공간지역성으로 인해 미스가 발생한 후에 하나의 블록을 복사하는 비용은 차후에 이 블록 내의 다른 객체들을 참조하기 때문에 줄어들게 된다.

메모리의 구조는 다음과 같다.

프로그램 코드와 데이터. 코드는 모든 프로세스들이 같은 고정 주소에서 시작하며, 다음에 C 전역변수에 대응되는 데이터 위치들이 따라온다. 코드와 데이터 영역은 실행가능 목적파일로부터 직접 초기화된다.

힙. 코드와 데이터 영역 다음으로는 런타임 힙이 따라온다. 크기가 고정되어있는 코드, 데이터 영역과 달리 힙은 프로세스가 실행되면서 C 표준함수인 malloc이나 free를 호출하면서 런타임에 동적으로 그 크기가 늘었다 줄었다 한다. 

공유 라이브러리. 주소공간의 중간 부근에 C 표준 라이브러리나 수학 라이브러리와 같은 공유 라이브러리의 코드와 데이터를 저장하는 영역이 있다. 공유 라이브러리 개념은 강력하지만 다소 어려운 개념이다. 

스택. 사용자 가상메모리 공간의 맨 위에 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치한다. 힙과 마찬가지로 사용자 스택은 프로그램이 실행되는 동안에 동적으로 늘어났다 줄어들었다 한다. 특히 함수를 호출할 때마다 스택이 커지며, 함수에서 리턴될 때는 줄어든다.

커널 가상메모리. 주소공간의 맨 윗부분은 커널을 위해 예약되어 있다. 응용프로그램들은 이 영역의 내용을 읽거나 쓰는 것이 금지되어 있으며, 마찬가지로 커널 코드 내에 정의된 함수를 직접 호출하는 것도 금지되어 있다. 대신, 이런 작업을 수행하기 위해서는 커널을 호출해야한다.

 

CS:APP 3rd Edition, Randal E. Bryant, Pearson

'스터디 관련' 카테고리의 다른 글

CS 스터디 03회차, ~ 6월 30일(목)  (0) 2022.06.30
CS스터디 02회차, ~06월 09일(목)  (0) 2022.06.09
2/3(수) 과제  (0) 2021.02.03
1/6일 스터디 과제  (0) 2021.01.06
이번 스터디 과제,,  (0) 2020.12.31

이전 게시물 : SwiftUI Views - Basic Concepts (뷰 기본 개념)

 

 

The View

struct BasicSyntax: View {
    var body: some View {
        Text("Hello World!") // 스크린에 text view를 추가합니다.
    }
}

SwiftUI에서 View들은 View Protocol을 따르는 구조체(Structures) 타입입니다. 구현하기 위해서 단 한가지의 Property만 있으면 되는데, 바로 body Property입니다.
참고) 만약 body가 Property라면, get과 return 요소는 어디로 갔을까요?

 

Property Getters

struct Person {
    // Computed read-only property (no set, value is not stored)
    // 읽기 전용 프로퍼티로 설계되었음 (set, value가 저장되지 않음)
    var personType: String {
        get {
            return "human"
	} 
    }
}

Property들은 getter와 setter를 가지고 있을 수 있습니다. 그런데 Property에 setter가 없을때, 그 Property는 read-only property라는 이름을 가집니다. 또한 Property가 value를 저장하지 않을때, computed property라고 부릅니다. Property가 읽힐때마다 값이 계산되거나 생성되기 때문입니다. 위의 예시에서는 personType이 computed read-only property입니다.

 

이 Property는 다음과 같은 두가지 방법으로 더 간단하게 만들 수 있습니다.

// 변경사항1: return 제거
struct Person {
    var personType: String {
	get { 
   	"human"
	}
    }
}

코드의 get 내부에 하나의 expression만 있다면, getter는 자동으로 return을 해줍니다. 따라서 return을 지워도 상관 없습니다.

// 변경사항2: get 제거
    var personType: String {
        "human"
    } 
}

Property가 read-only(setter가 없을 때)인 경우, get을 지울 수 있습니다. 

일단은 이러한 수정방법을 알고 취향껏 하면 됩니다.

 

SwiftUI With Property Getters

이러한 property의 변화는 선택적이기 때문에 이전 SwiftUI문법인 get과 return을 body property에 넣어 작성해도 됩니다. 다음 코드는 아마 당신에게 더 친숙할 것 입니다.

// SwiftUI with the get and return keywords
struct BasicSyntax: View {
    var body: some View {
        get {
            return Text("Hello World!")
        }
    }
}

코드를 다시 한번 들여다보면, some이라는 키워드를 발견할 수 있습니다. 보통, Property의 type을 정의할 때, 이러한 단어를 본적이 없ㅇ르 것입니다.

그렇다면 some 키워드가 하는 것은 어떤 역할일까요?

 

Opaque Types

struct BasicSyntax: View {
    var body: some View {
        Text("Hello World!")
    }
}

some이라는 키워드는 opaque type이 반환되는 것을 지정해줍니다. 위의 경우 opaque type은 View입니다. 그래서 왜 이러한 type을  opaque라고 부를까요? opaque라는 영단어의 정의를 보면, "이해하기에 어렵거나 불가능"하다는 뜻이 있습니다. 그리고 opaque type은 value의 type정보와 implementation detail들을 숨기기 때문에 문맥에 상통하는 부분이 있습니다. 이 타입은 확실히 "이해하기 어렵거나 불가능"하지만, 사용 가능함을 의미합니다.

iOS가 화면을 그리기 위해 BasicSyntax가 사용되는 경우, 이 예에서 텍스트 type이 return되는 것을 알 필요가 없습니다. some View가 return되고 있으며 화면을 그리는 데 사용할 수 있다는 것만 알면 됩니다. 그리고 이 body property에서는 View protocol을 따르는 모든 것이 return될 수 있습니다. Opaque Type들에 대해 더 잘 알아보고 싶다면 Swift Programming Language documentation을 참고하면 됩니다. 

Opaque type에 대한 중요한 정보가 더 남아있는데....

 

Opaque Types (some Keyword)

이미 이전 단계에서 body property에서 무엇을 리턴받는지에 대한 답이 View protocol을 따르는 어떠한 것이라고 알게 되었습니다. 그러나 (some 키워드를 사용하여) opaque type을 리턴할 때도 가능한 모든 유형이 동일한 유형이어야 합니다.

대부분의 경우 한 가지 type만 return 합니다. 하지만 다음과 같은 시나리오가 있을 수 있습니다.

struct UnderstandingTheSomeKeyword: View {
    var isYellow = true
    // some 키워드는 우리에게 무엇을 리턴받던, 다음과 같아야한다고 말해줍니다.
    // 1. View protocol을 따라야한다.
    // 2. Return받는 View의 type은 항상 같아야한다.
    var body: some View {
        // ERROR: 함수는 opaque return type으로 선언했지만, body의 return statements 안에는
        //일치하는 하위 type이 없습니다.
        if isYellow {
            return Color.yellow // Color type은 Text type과 매치되지 않습니다.
}
        return Text("No color yellow") // Text type은 color type과 매치되지 않습니다.
    }
}

body property 는 Color와 Text type을 return합니다. 이것은 some 키워드를 위반합니다.

 

Opaque Types Solution

해결 방법은 return된 view들을 모두 동일한 type으로 변경하는 것입니다. 이제 body는 동일한 type의 view(Color)를 반환합니다.

 struct UnderstandingTheSomeKeywordSolution: View {
 var isYellow = true
 // The keyword "some" tells us that whatever we return, it has to:
 // 1. Conform to the View protocol
 // 2. Has to ALWAYS be the same type of View that is returned.
var body: some View {
        return Color.clear
    }
}
이제 body property는 항상 색상 유형을 return합니다. 이것은 some 키워드를 만족시킨다.
 
 

View Containers 

struct Example: View {
    var body: some View {
        VStack {
            Text("Hello World!")
            Text("This Vertical Stack is using a function builder")
        } 
    }
}

지금까지 body는 computed read-only property이며 some View인 하나의 object만 반환할 수 있다는 것을 배웠습니다. 만약 여러 보기를 표시하고 싶다면 어떻게 해야 할까요?

앞에서 "containers" view의 개념에 대해 배웠습니다. 다른 view를 포함할 수 있는 view입니다. body property는 하나의 view만 return할 수 있습니다. body property에서 둘 이상의 view를 return하려고 하면 오류가 발생합니다.

위의 예에서 VStack(Vertical Stack)은 return되는 하나의 view입니다. 그리고 그 VStack은 내부에 두 개의 view가 더 있는 container입니다.

VStack은 "trailing closure"를 사용하는데, 이는 VStack이 실행시킬 initializer로 전달되는 코드 블록이라는 의미입니다. Swift에서 한번쯤 봤을법한 것입니다.

Swift에서 새로운 것은 constructor 내에서 여러 개의 새로운 view를 생성할 수 있는 기능입니다. 이 문제를 시작하기 전에 이 constructor의 작동 방식을 더 잘 이해하도록 합시다.

 

View Container Initialization

Swift에서는 일반적으로 초기화 중에 괄호를 사용하지만, trailing closure 되는 경우에는 괄호가 선택 사항입니다.
그것들을 추가해도 코드는 여전히 정상적으로 작동합니다.

코드 예제에서 "Change 1"을 참조하십시오.

이러한 변화는 여러분에게 더 친숙해 보이기 시작할지도 모릅니다. 자, 질문은 이것입니다.

VStack은 어떻게 이와 같은 여러개의 View들을 수용하는 방법을 알고 있습니까?

이 내용은 Swift에서 새로운 것입니다. 이를 더 잘 이해하려면 VStack의 initializer를공부해야합니다.

alignment와 spacing 파라미터는 선택 사항이기 때문에 위의 예제에서 볼 수 없습니다. 대신 content 파라미터 앞에 @ViewBuilder 구문이 있음을 유의하세요.

그것이 content 파라미터의 closure내에서 여러 개의 뷰들을 선언할 수 있도록 해주는 것입니다. 

struct Example: View {
       var body: some View {
           VStack {
               Text("Hello World!")
               Text("This Vertical Stack is using a function builder")
           } 
       }
   }
}
   // Change 1 - Add parentheses and parameter name
   struct Example: View {
       var body: some View {
           VStack(content: {
               Text("Hello World!")
               Text("This Vertical Stack is using a function builder")
           })
       }
    } 
}
   // VStack initializer
   init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
   @ViewBuilder content: () -> Content)

 

@ViewBuilder Parameter Attribute

@ViewBuilder 파라미터 속성을 통해 Swift는 closure 내에서 여러 child view들을 빌드할 수 있습니다.

Closure 내에서 몇 개의 child view를 빌드할 수 있을까요?

관련 기능은 이미 개수가 정해져 있습니다. 우리는 최대 10개의 view만 initialize할 수 있습니다. 여기 예제에서는 11번째 뷰 때문에 오류가 발생합니다.

Child view가 더 필요하면 어떻게 합니까?

사용자 인터페이스에 대해 더 많은 child view를 선언해야 하는 경우 다른 view container(다른 VStack 등)을 사용해야 합니다.

두 번째 예제에서는 텍스트 뷰 10과 텍스트 뷰 11을 포함하기 위해 다른 VStack을 사용합니다.

struct ViewBuilderExample: View {
    var body: some View {
        VStack {
            Text("View 1")
            Text("View 2")
            Text("View 3")
            Text("View 4")
            Text("View 5")
            Text("View 6")
            Text("View 7")
            Text("View 8")
            Text("View 9")
            Text("View 10")
            Text("View 11") // Will cause an error
        }
    }
}
struct ViewBuilderExample: View {
    var body: some View {
        VStack {
            ... // Text views 1 - 5
            Text("View 6")
            Text("View 7")
            Text("View 8")
            Text("View 9")
            VStack { // The VStack is now the 10th view
                Text("View 10")
                Text("View 11")
            }
        }
    }    
}

 

 

이 포스트는 밑의 페이지의 자료를 읽고 나서, 의역이 다소 존재하는 번역글입니다.

 

'IOS' 카테고리의 다른 글

CoreData 기술 공유  (1) 2022.07.05
SwiftUI Views - Basic Concepts  (0) 2022.04.29
SwiftUI Search Bar / 검색 기능 구현하기  (0) 2022.04.28
SwiftUI에서 리스트 동적으로 사용하기 (1)  (0) 2022.04.28
iOS 개인 프로젝트 시작  (0) 2022.04.28

Views And Modifiers 

SwiftUI에서는 View들을 통해 UI를 빌드할 수 있고, Modifier들을 통해 View들을 변경할 수 있습니다.

Containers - Vertical Layout Container 

View들은 container들로 구성될 수 있습니다. 일부 container들은 View들을 한 방향으로 조직화시키는데, 이것을 Stack이라고 합니다. 다음은 Vertical Stack의 예시입니다. SwiftUI에서는 VStack이라고 부릅니다. 이러한 Stack도 Modifier들을 가지고 있는 View입니다. 회색 사각형들은 VStack 내부에 있는 또다른 View입니다. 사각형을 조직화시킨, 눈에 보이지 않는 부분이 VStack입니다.

 

Horizontal Layout Container 

이것은 가로로 조직화시킬수 있는 또다른 Stack입니다. SwiftUI에서는 이러한 Horizon Stack을 HStack이라고 부릅니다.

 

Depth Layout Container 

또다른 Stack은 당신의 View를 다른 View들의 위로 조직화시킵니다. 이러한 Stack을 Depth Stack 혹은 ZStack이라고 부릅니다.

 

Grid Layout Container 

SwiftUI의 ver.2에서, grid container view가 소개되었습니다. VStack과 HStack을 하나로 합친 Stack입니다. 

 

 

Relationships - Parent & Child 

프로그래밍에서는 종종 object의 계층(hierachy)을 부모와 자식 관계로 표현합니다. 여기서도 비슷한 컨셉으로 표현이 될 것입니다. 예를 들어 위의 HStack 사진에서, HStack은 회색 rectangle View를 세 개 포함하고 있었습니다. 이 경우에는 HStack이 부모(parent)가, rectangle View가 자식(child)이 되는 것입니다. 

한가지 알면 좋은 상식이 있습니다. 자신의 자식이 없는 child View들을 애플은 "leaf views"라고 부르기로 했습니다.

Relationships - And Modifiers 

어떤 modifier들은 부모 View위에 설정되어 그 container 안의 자식 View에게도 영향을 주기도 합니다. 즉 VStack으로 쌓인 두개의 Rectangle을 생각해보면, VStack의 폰트 사이즈를 설정하면 Rectangle의 폰트도 같은 사이즈가 됩니다.만약 자식 View의 폰트 사이즈를 변경하고 싶다면 override를 통해 할 수 있습니다.

 

다음 게시물 : SwiftUI Views - Understanding the Syntax (뷰 문법 이해하기)

 

 

 

이 포스트는 밑의 페이지의 자료를 읽고 나서, 의역이 다소 존재하는 번역글입니다.

리스트에서 막히는 부분이 생겨서 빠르게 서치바부터 끝냈다.

https://www.appcoda.com/swiftui-search-bar/

 

Building a Search Bar in SwiftUI | Mastering SwiftUI

Unlike UIKit, SwiftUI doesn't come with a built-in control for search bar. In this tutorial, let's try to build a SwiftUI version of search bar.

www.appcoda.com

이 사이트를 참고했다. 

//
//  SearchBar.swift
//  SwiftDictionary
//
//  Created by Tempnixk on 2022/04/28.
//

import SwiftUI
 
struct SearchBar: View {
    @Binding var text: String
 
    @State private var isEditing = false
 
    var body: some View {
        HStack {
 
            TextField("Search ...", text: $text)
                .padding(7)
                .padding(.horizontal, 25)
                .background(Color(.systemGray6))
                .cornerRadius(8)
                .overlay(
                    HStack {
                        Image(systemName: "magnifyingglass")
                            .foregroundColor(.gray)
                            .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                            .padding(.leading, 8)
                 
                        if isEditing {
                            Button(action: {
                                self.text = ""
                            }) {
                                Image(systemName: "multiply.circle.fill")
                                    .foregroundColor(.gray)
                                    .padding(.trailing, 8)
                            }
                        }
                    }
                )
                .padding(.horizontal, 10)
                .onTapGesture {
                    self.isEditing = true
                }
 
            if isEditing {
                Button(action: {
                    self.isEditing = false
                    self.text = ""
 
                }) {
                    Text("Cancel")
                }
                .padding(.trailing, 10)
                .transition(.move(edge: .trailing))
                .animation(.default)
            }
        }
    }
}

struct SearchBar_Previews: PreviewProvider {
    static var previews: some View {
        SearchBar(text: .constant(""))
    }
}

우선 서치바의 틀만 만들어두었고, 나중에 컨텐츠가 생겼을때 단어 목록 추천, 혹은 검색 후 링크까지 구현해야 할 것 같다.

다시 리스트 만드러 가야겠다...

'IOS' 카테고리의 다른 글

SwiftUI Views - Understanding the Syntax  (0) 2022.04.30
SwiftUI Views - Basic Concepts  (0) 2022.04.29
SwiftUI에서 리스트 동적으로 사용하기 (1)  (0) 2022.04.28
iOS 개인 프로젝트 시작  (0) 2022.04.28
Xcode 화면 구성  (0) 2022.04.27

+ Recent posts