2020년 2월 18일 화요일

파이썬 공부에 도움이 되는 책 3권을 소개합니다.

첫번째는 "Fluent Python 전문가를 위한 파이썬" (오렐리 번역서 루시아노 하말류 지음)입니다.
2018-10-23_8-38-22.png
이 책은 좀 어렵습니다. 기본적인 문법책을 보셨다면 좀 더 어려운 깊이 있는 내용이 필요할 때 참고할 책인데 한번에 정리가 안됩니다. 기본적인 파이썬의 내용들이 아닌 파이썬의 철학과 내부를 다루는 내용들이 상당히 많습니다. 두고 두고 곱씹어서 볼만한 내용들이 많습니다.
비동기와 다중 쓰레드, 클로저, 일급 함수를 다루는 내용들이 저는 상당히 좋았습니다. 조금 더 어려운 파이썬 책을 찾으신다면 딱입니다. ^^
1장 파이썬 데이터 모델
2장 데이터 구조체
3장 딕셔너리와 집합
4장 텍스트와 바이트
5장 일급 함수
6장 일급 함수 디자인 패턴
7장 함수 데커레이터와 클로저
8장 객체 참조, 가변성, 재활용
9장 파이썬스러운 객체
...
16장 코루틴
17장 Future를 이용한 동시성
18.asyncio를 이용한 동시성
등을 다룹니다.
두번째는 "파이썬 GUI 프로그래밍 쿸북 2/e"(에이콘출판사 번역, 부르크하르트 메이어)입니다. 이 책은 쉬운 책입니다. 파이썬 문법만 어느정도 알고 있으면 끝까지 보실 수 있는 책입니다. 저는 약 일주일정도 봤습니다. 조금 아쉬운 부분은 pyQt가 아닌 tkinter를 다루고 있는 부분인데 그럼에도 상당한 강력한 모듈임을 알 수 있습니다. 혹시 파이썬으로 GUI를 코딩하실 분들에게는 무척 도움이 되는 책입니다. 내년 과정을 기획하면서 참고하고 있는 책입니다.
개인적으로는 6장의 스레드와 네트워킹, 7장 GUI를 통한 MySQL데이터 저장하기가 재미있었습니다.^^
2018-10-23_8-42-36.png
1장 GUI 폼 만들기
2장 레아이웃 관리
3장 사용자 정의 룩앤필
4장 데이터와 클래스
5장 Matplotlib차트
6장 스레드와 네트워킹
7장 GUI를 통해 MySQL에 데이터 저장하기
8장 국제화
9장 wxPython라이브러리로 GUI확장하기
세번째는 "실전 스케일링 파이썬 프로그래밍"(인사이트출판사 번역, 줄리안 단주 지음)입니다. 최근에 보고 있는 책인데 책이 좀 불친절하고 어렵습니다. 그렇지만 약간씩 추가 설치를 하고 예제들을 돌려보면 저자의 내공에 감탄하게 되는 책입니다. 수억명이 사용하는 웹사이트의 많은 곳이 django기반 파이썬 기반인 것을 설명하면서 파이썬의 확장성에 대해 다루는 책입니다. 강추하는 책입니다. ^^ 개인적으로 스레드, 큐, 함수형 프로그래밍을 다루는 부분이 상당히 인상적이였습니다. 레디스와 연동하는 부분, REST API 다루는 부분이 재미있었습니다. 처음 들어보는 모듈, 라이브러리에 대한 설명들이 꽤 많이 나옵니다.
2018-10-23_8-54-33.png
1장 확장이란?
2장 CPU확장
3장 이벤트 루프
4장 함수형 프로그래밍
5장 큐를 사용한 분산
6장 예외처리
7장 잠금 관리
8장 그룹 멤버십
9장 REST API만들기
10장 PaaS에 배포하기
11장 분산 시스템 테스트
12장 캐싱
13장 성능

2020년 1월 20일 월요일

2019년 팟빵에 올라왔던 로봇시대? 어디까지 왔는가? 고태봉 센터장님의 방송 입니다.

출근과 퇴근을 할 때 매일 듣고 있는 팟빵 방송에 로봇 특집이 나와서 영상 링크를 걸어 봅니다. 기술이 하루가 다르게 발전하고 있는 것을 볼 수 있습니다.
https://www.youtube.com/watch?time_continue=4784&v=t4VoR1HQE-o&feature=emb_logo

7분과 8분, 13분 17분, 40분에 보시면 각각 상용화되고 있는 로봇 영상들이 나옵니다.
하루가 다르게 발전하고 있는 모습들을 멋진 설명과 함께 보실 수 있습니다.
2020년 1월에는 CES 정리한 동영상도 올라왔네요.
https://www.youtube.com/watch?v=1zQDNFM1zP8
스크린샷 2019-07-08 오후 8.20.01.png
스크린샷 2019-07-08 오후 8.20.21.png
스크린샷 2019-07-08 오후 8.19.14.png
포드사에서 만든 마더쉽에서 내려서 배송을 하를 로봇의 홍보 영상입니다.

2020년 1월 11일 토요일

iOS 13.*에 추가된 SwiftUI의 입력 처리하기 입니다.

세번째 데모는 입력 처리 추가하기 입니다.
아래의 링크에서 프로젝트를 다운로드 받아서 StartingPoing폴더에 있는 프로젝트를 오픈하면 됩니다.
사용자가 랜드마크를 보고 별표 표시를 하는 경우
스크린샷 2019-10-07 오후 4.18.52.png
StartingPoing폴더에 있는 시작 프로젝트를 오픈 합니다.
LandmarkRow파일에서 아래와 같이 수정합니다.
import SwiftUI
struct LandmarkRow: View {
var landmark: Landmark
var body: some View {
    HStack {
        landmark.image
            .resizable()
            .frame(width: 50, height: 50)
        Text(landmark.name)
        Spacer()
        
        if landmark.isFavorite {
            Image(systemName: "star.fill")
                .imageScale(.medium)
        }
    }
}
}
Section 2: List View를 필터링하기
사용자가 좋아하는 것만 필터링할 수 있습니다.
View에 상태를 추가하기 위해 @State속성을 사용할 수 있습니다.
LandmarkList를 아래와 같이 수정합니다.
import SwiftUI
struct LandmarkList: View {
@State var showFavoritesOnly = false

var body: some View {
    NavigationView {
        List(landmarkData) { landmark in
            if !self.showFavoritesOnly ||
                landmark.isFavorite {
                NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                    LandmarkRow(landmark: landmark)
                }
            }
        }
        .navigationBarTitle(Text("Landmarks"))
    }
}
}
Section 3: 상태를 토글하기 위해 컨트롤을 추가합니다.
유저가 리스트 필터링을 컨트롤하도록, 컨트롤을 추가합니다.
LandmarkList를 수정합니다.
import SwiftUI
struct LandmarkList: View {
@State var showFavoritesOnly = true

var body: some View {
    NavigationView {
        List {
            ForEach(landmarkData) { landmark in
                if !self.showFavoritesOnly ||
                    landmark.isFavorite {
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
        }
        .navigationBarTitle(Text("Landmarks"))
    }
}
}
다시 아래와 같이 추가합니다.
import SwiftUI
struct LandmarkList: View {
@State var showFavoritesOnly = true

var body: some View {
    NavigationView {
        List {
            Toggle(isOn: $showFavoritesOnly) {
                Text("Favorites only")
            }
            
            ForEach(landmarkData) { landmark in
                if !self.showFavoritesOnly ||
                    landmark.isFavorite {
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
        }
        .navigationBarTitle(Text("Landmarks"))
    }
}
}
스크린샷 2019-10-07 오후 4.11.38.png
Section 4: Storage를 위해 Observable Object를 사용한다.
좋아하는 랜드마크를 컨트롤하도록 준비하기 위해 먼저 observable object로
랜드마크 데이터를 저장해야 합니다.
observable object는 storage로 부터 SwiftUI환경으로 뷰를 바운드할 수 있습니다.
SwiftUI는 뷰에 영향을 주는 observable object에 대한 변경을 감시하고,
그리고 변경후에 뷰의 올바른 버전을 표시합니다.
Models폴더에 UserData.swift파일을 추가해서 아래와 같이 코딩 합니다.
import SwiftUI
import Combine
final class UserData : ObservableObject {
@Published var showFavoritesOnly = false
@Published var landmarks = landmarkData
}
Section 5: 뷰에 Model Object을 붙이기
UserData 오브젝트를 생성한 후에 앱의 데이터 저장으로 뷰를 적용하도록 업데이트합니다.
LandmarkList를 수정합니다.
import SwiftUI
struct LandmarkList: View {
//다음과 같이 수정한다.
@EnvironmentObject var userData: UserData

var body: some View {
    NavigationView {
        List {
            Toggle(isOn: $userData.showFavoritesOnly) {
                Text("Favorites only")
            }
            
            ForEach(userData.landmarkData) { landmark in
                if !self.userData.showFavoritesOnly ||
                    landmark.isFavorite {
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
        }
        .navigationBarTitle(Text("Landmarks"))
    }
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
LandmarkList()
.environmentObject(UserData())
}
}
SceneDelegate도 수정합니다.
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

    // Use a UIHostingController as window root view controller
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(
            rootView: LandmarkList()
                .environmentObject(UserData())
        )
        self.window = window
        window.makeKeyAndVisible()
    }
}
LandmarkDetail을 수정합니다.
import SwiftUI
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
var landmark: Landmark
var landmarkIndex: Int {
    userDAta.landmarks.firstIndex(
        where: { $0.id == landmark.id })!
}

var body: some View {
    VStack {
        MapView(coordinate: landmark.locationCoordinate)
            .frame(height: 300)

        CircleImage(image: landmark.image)
            .offset(x: 0, y: -130)
            .padding(.bottom, -130)

        VStack(alignment: .leading) {
            Text(landmark.name)
                .font(.title)

            HStack(alignment: .top) {
                Text(landmark.park)
                    .font(.subheadline)
                Spacer()
                Text(landmark.state)
                    .font(.subheadline)
            }
        }
        .padding()

        Spacer()
    }
    .navigationBarTitle(Text(verbatim: landmark.name), displayMode: .inline)
}
}
struct LandmarkDetail_Previews: PreviewProvider {
static var previews: some View {
LandmarkDetail(landmark: landmarkData[0])
.environmentObject(UserData())
}
}
Section 6: 각 랜드마크에 대한 Favorite 버튼을 생성합니다.
LandmarkDetail을 수정합니다.
import SwiftUI
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
var landmark: Landmark
var landmarkIndex: Int {
    userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}

var body: some View {
    VStack {
        MapView(coordinate: landmark.locationCoordinate)
            .edgesIgnoringSafeArea(.top)
            .frame(height: 300)
        
        CircleImage(image: landmark.image)
            .offset(x: 0, y: -130)
            .padding(.bottom, -130)
        
        VStack(alignment: .leading) {
            HStack {
                Text(verbatim: landmark.name)
                    .font(.title)
                
                Button(action: {
                    self.userData.landmarks[self.landmarkIndex]
                        .isFavorite.toggle()
                }) {
                    if self.userData.landmarks[self.landmarkIndex]
                        .isFavorite {
                        Image(systemName: "star.fill")
                            .foregroundColor(Color.yellow)
                    } else {
                        Image(systemName: "star")
                            .foregroundColor(Color.gray)
                    }
                }
            }
            
            HStack(alignment: .top) {
                Text(verbatim: landmark.park)
                    .font(.subheadline)
                Spacer()
                Text(verbatim: landmark.state)
                    .font(.subheadline)
            }
        }
        .padding()
        
        Spacer()
    }
}
}
struct LandmarkDetail_Preview: PreviewProvider {
static var previews: some View {
let userData = UserData()
return LandmarkDetail(landmark: userData.landmarks[0])
.environmentObject(userData)
}
}
실행하면 다음과 같습니다.

스크린샷 2019-10-07 오후 4.46.32.png
스크린샷 2019-10-07 오후 4.46.40.png

제 AI는 스스로 생각하고 학습한다.. 난리난 AI 에이전트 직접 확인해보니 - 영상정리해 봅니다.

  ChatGPT가 나온지 3년이 넘었습니다. ㅎㅎ 처음에는 생성형AI에서 LLM으로 시장이 변화되었습니다. 작년말부터는 에이전트의 시대라고 하고 있습니다. 저도 관련 강의를 하고 일을 하고 있지만 따라가기가 벅찰정도로 매주 새로운 소식들이 올라옵니다...