리액트 네이티브로 날씨앱 만들기 #11 Working with Icons

이번에는 아이콘을 만들어보자 그전에 이 온도 텍스트를 크게 만들께

폰트 사이즈를 38 -> 48으로 변경 이 앱은 상태바(status bar)가 없으면 더 멋져보일꺼야 같이 보이니까 그닥 멋지지가 않아 다행히도 리액트 팀이 만든 api가 있어서 그것을 사용하면됨 status bar를 불러오도록 하자

이건 평범한 컴포넌트야 그래서 style을 사용할 수 있지 light 라고 작성하고 저장, 새로고침을 해서 확인해보자 안되는군! 구글에 검색해서 찾아보자 light-content 라고 작성해야함

수정하여 작성 저장, 새로고침 수정된 것이 보여? light, dark 에 따라 다르게 출력됨 그 말은, 이것도 해볼 수 있어 hidden을 작성! hidden = true 그러면 우리의 상태창이 보이지않게 가려줘 자, 이제 아이콘 작업을 해보자

다행히도 expo는 아이콘 관련된 멋진 패키지를 갖고있어 이름은 ion icon인데 정말 많은 종류의 아이콘을 보유하고 있지 오, 이름은 vector icon이야 쏘리 (-_-

) 이 패키지에는 아이콘 종류가 어마어마하게 많아

폰트어썸 아이콘을 포함해서 다양한 종류를 갖고있어 엑스포 덕분에 이렇게 편하게 아이콘을 사용할 수 있어 보다시피 entypo, foundation, 등등 다양한 종류 아이콘, 폰트어썸 이라는 단어가 낯설다면, 노마드 아카데미의 '카카오톡 클론' 을 공부하기를 바래

난 여기서 ion icon을 쓸꺼야 자, 이걸 불러오려면 다시 돌아가서 import ionicons 작성! 저장하고 오류 메세지 없는지 살펴보고 그리고 여기 텍스트를 아이콘으로 변경하자고 text를 ionicons로 변경 ion icons은 여러가지 props가 있는데, 그 중 하나가 색상이야 색상을 하얀색으로 지정

사이즈는144으로 한번 해보자 마지막은 아이콘의 이름이야 이 디렉토리에서 이름을 확인할 수 있어 이름이 뭔지 검색해보니까 ios-rainy 검색해서 다시 확인해보자

이름 확인 이게 내가 사용할 아이콘의 이름이야 이름 복사-붙여넣기 오류 발생!! (!?!?!?!) upper 컨테이너의 배경색상을 투명으로 지정! 이제 보이는구만! 아이콘의 부모인 upper 컨테이너 배경색을 투명으로 변경했어 자, 이제 아이콘이 잘 보이는 것을 확인했지? 그 외에 어떤 아이콘도 (ion icon 이라면) 사용할 수 있어

예를 들면 ios-closed-captioning 아이콘을 사용해보자 아이콘 이름 변경중 자, 변경된 것이 보이지? 이렇게 겁내 쉽게 아이콘을 붙여넣을 수 있어 기억해 expo에 이미 해당 패키지가 있기때문에 가능한거야 expo를 안쓰면 말짱황 우리가 expo를 쓰고있기때문에 이렇게 쉽게 활용이 가능한거야

이 경우가 아니라면 npm, yarn을 통해 설치해야해 허나 expo를 사용하면 이렇게 쉽게 불러올 수 있음 빠르게 복습해보자! ion icons을 불러오기 이 아이콘은 vector icons의 패밀리야 만약 원하면 font awesome을 불러올 수도 있어

ion icons을 불러온 후에, 3가지 종류의 props를 지정해줘 색상, 사이즈, 그리고 이름 해당 강의 영상 상단 혹은 하단에 아이콘 링크를 첨부할께 아이콘을 사용할때 정확한 이름을 복사-붙여넣기 하도록 해 만약 내가 이름에 오타를 내면, 아이콘이 정상으로 출력되지 않을꺼야 그리고 이렇게 우리가 선택할 수 있는 다른 아이콘 이름을 보여주지

여기까지야~ 참, 그리고 upper 컨테이너의 배경색을 투명으로 변경하는 것 잊지마! 내가 그걸 안해서 이렇게 하얀색으로 출력되었었지 배경색을 투명으로 변경해야 차일드인 아이콘이 정상으로 출력될거야 여기까지 디자인이 완료되었고- 이제 위치와 날씨 데이터를 불러오면 됨 씨유!

Android Meets TensorFlow: How to Accelerate Your App with AI (Google I/O ’17)

[음악 재생] KAZ SATO : 고맙습니다 우리 세션에 참석해 주셔서 감사합니다

"Android Meets TensorFlow " 저는 사토 카즈입니다 저는 Google Cloud Platform 팀의 개발자 대행사입니다 과– HAK MATSUDA : 안녕하세요 좋은 아침

아주 이른 아침에와 주셔서 감사합니다 나는 아침에 사람이 아니기 때문에 나는 조금 졸려있다 어쨌든, 제 이름은 마츠다 하쿠로입니다 나는 안드로이드 게임 개발자 옹호자이다 및 고유 기술

KAZ SATO : 그래서 오늘,이 세션에서, 우리는이 주제들에 대해 토론하고 싶습니다 그래서 이번 세션의 첫 번째 부분은, 나는 AI, 기계 학습, 신경 네트워크, 깊은 학습, Google이 이러한 종류의 기술을 어떻게 사용하고 있는지 우리의 서비스를 구현합니다 그리고 TensorFlow는 무엇입니까? 그것은 건물을위한 오픈 소스 라이브러리입니다 너 자신의 신경망 그리고 나는 Hak에 그 무대를 전달할 것이다

그는 당신이 안드로이드를 어떻게 구축 할 수 있는지 논의 할 것입니다 TensorFlow에서 제공하는 애플리케이션 최적화 방법 마지막으로 미리보기를하고 싶습니다 TensorFlow Lite 및 Android와 같은 새로운 기술 신경 네트워크 API 그렇다면 기계 학습과 신경망은 무엇입니까? 얼마나 많은 사람들이 실제로 신경 네트워크를 시도 했습니까? 몇 명? 오, 너무 많은 사람들! 20 %처럼? 실제로 얼마나 많은 사람들이 신경망을 실제로 사용 했습니까? 모바일 장치에서? 매우 감사합니다 나는 10 명의 사람들을 발견했다

오늘은 TensorFlow를 사용하는 방법을 배우고 싶습니다 기계 학습 모듈 실행 내부 모바일 애플리케이션 너무 많은 유행어가있었습니다 인공 지능, 기계 학습, 신경 네트워크, 또는 깊은 학습 우리는 그 유행어에 대해 들었습니다

지난 몇 년간 차이점이 뭐야? 인공 지능이나 인공 지능 – 당신은 건물과 같은 똑똑한 것을 만들기위한 과학입니다 자율 주행 차 또는 아름다운 그림을 그리거나 음악을 작곡하는 컴퓨터 AI의 비전을 실현하는 한 가지 방법 기계 학습에 있습니다 기계 학습은 당신은 컴퓨터가 스스로 훈련하는 것을 허용 할 수 있습니다 모든 단계를 지시하는 인간 프로그래머, 자체적으로 데이터를 처리합니다

그리고 기계 학습에서 많은 다른 알고리즘 중 하나 신경 네트워크입니다 그리고 2012 년 이래로 우리는 큰 돌파구를 보았습니다 신경 네트워크의 세계에서, 특히 이미지 인식, 음성 인식, 또는 자연어 처리 및 기타 여러 응용 프로그램에 사용할 수 있습니다 그리고 Google에서 우리는 몇 년 동안 신경 네트워크 기술을 개발했다 그렇다면 신경 네트워크 란 무엇입니까? 수학의 함수처럼 생각할 수 있습니다

또는 프로그래밍 언어의 함수 따라서 모든 종류의 데이터를 입력으로 넣을 수 있습니다 일부 행렬 연산 또는 계산 수행 신경 네트워크 내부 그런 다음, 결과적으로 출력 벡터를 얻을 수 있습니다 많은 레이블이나 추측 값을 가지고있다

예를 들어 이미지가 많은 경우, 당신은 분류하기 위해 신경 네트워크를 훈련시킬 수 있습니다 어느 것이 고양이의 이미지인지 또는 개 이미지인지 그리고 이것은 사용의 한 예일뿐입니다 신경 네트워크의 경우 기술을 적용하여 모든 종류의 비즈니스를 해결할 수 있습니다

문제가 있습니다 예를 들어, 게임 서버가 많은 경우, 다음 모든 사용자 활동을 변환 할 수 있습니다, 플레이어 활동, 숫자의 무리로 그들을 변환, 벡터와 같은 신경망을 학습하고 신경 네트워크를 훈련 시키십시오 게임 서버의 플레이어 유형을 분류합니다 예를 들어, 어떤 치욕적 인 플레이어를 찾고 싶다면 자동화 된 스크립트를 사용하여 귀하의 서버에서 속이려고하거나 프리미엄 플레이어를 찾기 위해 신경망을 사용할 수 있습니다 게임 서버에서 점점 더 많은 아이템을 구입할 수 있습니다

그래서 이것은 하나의 가능한 예일뿐입니다 가능한 수천 가지 응용 프로그램 중 Google은 심층 학습 기술을 사용해 왔습니다 100 개가 넘는 스마트 기능 구현을위한 Google 검색, Android, Play, 및 많은 다른 응용 프로그램 예를 들어 Google 검색을 매일 사용하는 경우, 즉, 깊은 학습 기술에 액세스하고 있음을 의미합니다 매일 Google에서 제공합니다

2015 년에 RankBrain을 도입 했으므로, 이는 깊은 학습 기반 랭킹 알고리즘 인 정의 및 순위 지정을위한 신호를 생성합니다 검색 결과 모바일 애플리케이션을 살펴 본다면 Google의 예를 들어 Google 포토는 하나입니다 가장 성공적인 모바일 애플리케이션의 분석과 이해를 위해 깊은 학습을 해왔다 스마트 폰이 찍은 각 이미지의 내용, 그래서 직접 태그 나 키워드를 넣을 필요가 없습니다 대신, 당신은 단지 강아지, 당신의 친구의 이름, 또는 결혼식 파티 가이 콘텐츠를 기반으로 이미지를 찾을 수 있습니다

스마트 회신은 회신 옵션을 표시하는 기능입니다 각 이메일 스레드로 그래서 자연 언어 처리를 사용합니다 신경망 모델에 의해 구동 됨 전자 메일 교환의 컨텍스트를 이해하려고 시도합니다 그리고 지금, 응답의 12 % 이상 스마트 회신 기능으로 생성됩니다

이제 컴퓨터로 이메일을 작성했다고 말할 수 있습니다 더 이상 인간이 아닙니다 Google 번역 앱이 최근에 소개되었습니다 새로운 신경 번역 모델 인 품질, 특히 유창함이 향상되었습니다 번역 된 텍스트의 따라서 가능한 많은 유스 케이스가 있습니다

기계 학습 간의 결합 모바일 애플리케이션, 시작 이미지 인식, OCR, 음성 텍스트 텍스트 음성 변환, 번역 및 NLP가 포함됩니다 특히 기계 학습을 적용 할 수 있습니다 모션 감지 또는 GPS와 같은 모바일 전용 애플리케이션 위치 추적 그리고 왜 당신은 당신의 기계를 운영하고 싶습니까? 학습 모델, 신경 네트워크 모바일 애플리케이션 내부의 모델? 기계 학습을 사용함으로써, 상당한 양의 트래픽을 줄일 수 있습니다 그리고 당신은 훨씬 더 빠른 응답을 얻을 수 있습니다

귀하의 클라우드 서비스에서 원시 데이터에서 의미를 추출 할 수 있기 때문입니다 그게 무슨 뜻이야? 예를 들어, 기계 학습을 사용하는 경우 이미지 인식, 가장 쉬운 방법 이를 구현하기 위해서는 모든 원시 이미지 데이터를 보내야합니다 카메라에 의해 서버로 전송됩니다 대신에 기계 학습 모델을 실행하게 할 수 있습니다

귀하의 모바일 응용 프로그램 내부에서 귀하의 모바일 응용 프로그램 각 이미지에 어떤 종류의 물체가 있는지를 인식 할 수 있고, 그래서 당신은 단지 꽃과 같은 라벨을 보낼 수 있습니다 또는 사람의 얼굴을 서버에 보냅니다 트래픽을 1/10 또는 1/100로 줄일 ​​수 있습니다 상당한 양의 트래픽 절감 효과가 있습니다 다른 예는 모션 디텍션 일 수 있습니다

여기서 모든 움직임, 감각 데이터를 수집합니다 – 원본 이미지를 서버로 직접 보내지 않고, 기계 학습 알고리즘을 사용하여 추출 할 수 있습니다 소위 특징 벡터 기능 벡터는 숫자의 무리 일뿐입니다 특성을 나타내는 100 개 또는 1,000 개의 숫자 또는 모션 센서로부터의 모션의 서명 따라서 100 또는 1,000 개의 숫자 만 보낼 수 있습니다

특징 벡터에서 서버로 그리고 빌드의 출발점은 무엇입니까? 기계 학습으로 구동되는 모바일 애플리케이션? 출발점은 TensorFlow, 머신의 오픈 소스 라이브러리 Google의 정보 TensorFlow는 최신 프레임 워크입니다 기계 학습 또는 인공 지능 기반 서비스 개발을위한 개발 Google에 2015 년 11 월에 오픈했습니다 이제 TensorFlow가 가장 인기있는 프레임 워크입니다

신경 네트워크 또는 세계에서 깊은 학습을 구축합니다 TensorFlow로 얻을 수있는 한 가지 이점 개발의 용이성이다 시작하기가 정말 쉽습니다 몇 줄의 파이썬 코드를 작성할 수 있습니다 또는 수십 줄의 파이썬 코드를 사용하여 신경망을 정의하십시오

혼자서 실제로이 기술은 사람들에게 매우 가치가 있습니다 나는 정교한 수학적 지식이 없기 때문에 나를 좋아한다 배경 그래서 신경망에 관한 교과서를 읽기 시작했을 때, 나는 교과서에 많은 수학 방정식을 발견했다

차별 증식, 역 전파, 및 그라디언트 디센트 그리고 저는 모든 것을 혼자서 구현하고 싶지 않았습니다 대신, 이제 TensorFlow를 다운로드 할 수 있습니다 여기서 한 줄의 파이썬 코드를 작성할 수 있습니다 GradientDescentOptimizer와 같습니다

그 한 줄의 코드는 캡슐화 할 수 있습니다 그래디언트 디센트, 역 전파, 또는 구현 된 기타 최신 알고리즘 Google 엔지니어가 그래서 너는 너 자신을 가질 필요가 없다 신경망을 구현하도록 설정된 기술 기술을 처음부터 또한 TensorFlow의 이점 이식성과 확장 성입니다 예를 들어, 기술로 시작한 TensorFlow를 다운로드 할 수 있습니다

Mac 또는 Windows에서만 사용할 수 있습니다 아주 간단한 샘플의 Hello World 종류로 재생할 수 있습니다 그러나 기술에 대해 진지하게 생각하고 있다면 예를 들어 모델을 처음부터 렌더링하려는 경우 고양이의 이미지를 인식하려면 다음을 사용하십시오 GPU 서버 – GPU는 10 배 또는 50 배이기 때문에 CPU 또는 Mac 또는 Windows보다 빠름 – 모델 훈련 하지만 Google 어스와 같은 많은 대기업 또는 다른 모든 기업에서 클라우드에서 수십 또는 수백 개의 GPU 실행 컴퓨팅 파워가 가장 크기 때문에 깊은 학습 기술에 대한 도전

하지만 여전히 큰 변화는 필요 없습니다 귀하의 TensorFlow 신경망에, TensorFlow는 확장 가능하도록 설계 되었기 때문에 따라서 일단 신경 네트워크를 정의하면, 너는 그것을 배우고, 훈련하고, 사용할 수있다 단일 CPU 또는 다중 GPU에서, 또는 수백 개의 GPU 또는 TPU 또는 Tensor 처리 장치, Google에서 설계 한 ASIC 또는 맞춤형 ADSI입니다 그리고 일단 모델 교육을 마치면, 당신은 모델을 복사 할 수 있습니다 예를 들어, 이미지 인식을 위해, 단일 모델은 100 메가 바이트 데이터, 매개 변수

이러한 매개 변수를 모바일 장치에 복사 할 수 있습니다 Android, iOS 또는 Raspberry Pi와 같은 그리고 TensorFloworg 웹 사이트에 가면, 당신은 임베디드 시스템을위한 샘플 코드를 찾을 수있다 및 휴대 전화 그런 다음 TensorFlow에서 얻을 수있는 이점 지역 사회와 생태계입니다

따라서 실용적인 제작 품질을 원한다면 솔루션을 제공한다면 TensorFlow는 그 최선의 대답 너무 많은 대기업과 개발자가 있기 때문에 심각한 개발을 위해 TensorFlow를 사용하는 사람들, ARM, 이베이, 인텔, 드롭 박스, 트위터 등이있다 그들은 모두 TensorFlow를 사용하고 있습니다 이제는 무대를 Hak에 전달하고 싶습니다 누가 당신이 안드로이드를 어떻게 구현할 수 있는지 이야기 할 것입니다

TensorFlow에서 제공하는 애플리케이션 [박수 갈채] 오 감사합니다 Hak MATSUDA : 고마워요, Kazu Android 부분으로 넘어 갑시다 Kazu가 말했듯이, 우리는 많은 것을 발견했습니다

TensorFlow를 실행하는 유용한 사용 사례 모바일 장치에 대한 추론 우리가 어떻게 통합 할 수 있는지 살펴 보겠습니다 모바일 장치의 TensorFlow 추론 우리가 어떻게 그것을 최적화 할 수 있는지에 대해 설명합니다 TensorFlow는 다음을 포함한 여러 모바일 플랫폼을 지원합니다 Android, iOS 및 Raspberry Pi와 호환됩니다

이 강의에서는 Android와 같은 휴대 기기에 중점을두고 및 IOS TensorFlow 공유 객체를 처음부터 빌드하기 조금 까다 롭습니다 여러 단계를 거치기 시작했습니다 GitHub의 [INAUDIBLE], Bazel 설치, 설치 안드로이드 스튜디오, 안드로이드 SDK 및 NDK, 마지막으로 설정 파일을 편집하는 등의 작업을 수행 할 수 있습니다 그러나 우리에게는 오늘 좋은 소식이 있습니다

이 IO를 발표하면서 방금 JSON 통합을 추가했습니다 그 단계가 훨씬 쉬워집니다 [박수 갈채] 고마워요, 고마워요 빌드 줄에 하나의 선을 추가하기 만하면됩니다 Gradle은 나머지 단계를 처리합니다

도서관 자료실에서 [INAUDIBLE] TensorFlow 공유 객체가 JCenter에서 다운로드되면, 응용 프로그램과 자동으로 연결됩니다 또한 미리 작성된 모델을 가져올 수 있습니다 파일 (예 : 시작, 스타일 화, 등등, 구름 에서뿐만 아니라 iOS에서도 쉽게 사용할 수 있습니다 우리는 Cocoapod 통합을 시작했습니다

지금은 아주 간단합니다 TensorFlow API를 사용하는 방법을 살펴 보겠습니다 Android 유추 라이브러리를 출시했습니다 Java 응용 프로그램 용 TensorFlow를 통합합니다 라이브러리는 Java의 [INAUDIBLE]입니다

네이티브 구현에 성능에 미치는 영향은 최소화됩니다 처음에는 TensorFlow 유추 인터페이스를 만들고, APK의 자산에서 모델 파일을 엽니 다 그런 다음 피드 API를 사용하여 입력 피드를 설정하십시오 모바일에서는 입력 피드가 카메라, 가속도계, 등등

그런 다음 추론을 실행하십시오 마지막으로 결과를 가져올 수 있습니다 거기에 fetch 메소드를 사용합니다 이 통화가 모두 통화를 차단하고 있음을 알 수 있습니다 따라서 작업자 스레드에서 실행하는 대신 작업 스레드에서 실행하려고합니다

API는 길고 오랜 시간이 걸릴 것이기 때문에 메인 스레드, 몇 초 이것은 Java API입니다 물론 일반 C ++ API도 사용할 수 있습니다 당신이 C ++을 사랑한다면 내가하는 것처럼 승인

데모로 넘어 갑시다 이것은 Android에서 실행되는 TensorFlow 샘플입니다 샘플에는 세 가지 모드가 있습니다 첫 번째는 Inception v3을 실행 중입니다 카메라 이미지를 분류합니다

또한 분류 된 얼굴과 양식화 된 사진이 있습니다 견본 이 사진은 카메라 미리보기에 예술적 필터를 적용하고 있습니다 [박수 갈채] 고맙습니다 그리고 데모에서 한 가지 특별한 점 GPU를 사용하여 데모를 약간 수정 한 것입니다

[INAUDIBLE] 계산 쉐이더를 사용하십시오 [INAUDIBLE] 샘플은 CPU를 지원합니다 새로운 최적화 하지만 GPU를 사용하여 그것을 조정했습니다 그리고 이것은 단지 실험을 위해서 였고 재미를 위해서였습니다

그것은 꽤 재미 있었다 그리고 저는 TensorFlow를 GPU에 맞게 최적화하는 방법을 많이 배웠습니다 기본적으로 Android 기기에서 성능 제한 요소 대부분 메모리 대역폭에서 발생합니다 컴퓨팅 자체가 아니라 메모리 대역폭 줄이기 많은 도움이되었습니다 예를 들어, 어떤 [INAUDIBLE] 커널에서, 그것은 32 32 x 32 32 x 4 샘플을 가져 오는 중입니다

하나의 출력 값을 생성하기 만하면됩니다 Compute의 관점에서 엄청난 양의 데이터입니다 셰이더 따라서 메모리 대역폭은 안드로이드에있어 결정적으로 중요합니다 및 모바일 장치 최적화

어쨌든, 모두 TensorFlow 코드를 조정할 수 있습니다 오픈 소스이기 때문입니다 오픈 소스의 아름다움입니다 맞죠? 이제 모바일에 TensorFlow 추론을 통합 할 수 있습니다 내가 아주 쉽게 설명했다

그러나 성능에는 아직 문제가 있습니다 심지어 모바일 장치 성능 상당히 증가했다 클라우드 나 데스크톱보다 컴퓨팅 성능이 떨어집니다 또한 제한된 RAM을 가지고 있습니다 모바일에 소중한 자료

응용 프로그램이 1 기가 바이트의 RAM을 사용한다면, 그때 응용 프로그램은 매우 가능성이 높습니다 시스템 자체에 의해 죽임을 당한다 응용 프로그램이 백그라운드로 이동하면 행복한 상황이 아니지, 그렇지? TensorFlow를 최적화 할 수있는 방법에 대해 살펴 보겠습니다 그래픽, 메모리 사용 공간 감소, 런타임 성능 향상 및로드 시간 개선 잘 이 모델은 Inception v3 모델의 모델입니다 이 모델은 약 91 메가 바이트의 저장 공간을 필요로하며, 2,500 만 가지 매개 변수가 있습니다

그리고 바이너리 크기는 12 메가 바이트 걸릴 것입니다 그것은 거대합니다 그리고 우리는 그래프를 최적화하는 여러 기법을 가지고 있습니다 Graph Transform (그래프 변환)을 사용하여 그래프 고정 도구, 양자화, 메모리 매핑 등 가자

그래프 정지는로드 중 하나입니다 시간 최적화, 변수 노드를 변환 상수 노드에 변수 노드 란 무엇입니까? TensorFlow에서 변수 노드는 다른 파일에서 시작됩니다 그러나 상수 노드가 포함되어 있습니다 그래프 def 자체에서

따라서 변수를 상수 노드로 이동하십시오 여러 개의 파일을 하나의 파일로 연결할 수 있으며, [INAUDIBLE]처럼 그것은 약간의 성능이 될 것입니다 모바일에서 이기고 다루기가 더 쉽다 그렇게하기 위해 우리는 동결 그래프 점 파이썬 스크립트를 준비합니다

그래프 변환 도구는 친구입니다 이 도구는 다양한 최적화 작업을 지원하며, 추측을 위해 사용되지 않는 노드를 스트립하는 것과 같은 하지만 그것은 학습 문구에서만 사용됩니다 추론 노드를 배울 때 필요하지 않습니다 나는 그것이 현재 약간의 작은 단계가 필요할 것이라고 생각한다

어떤 노드가 시작 노드인지 판단한다 어느 노드가 출력 노드인지를 결정한다 따라서이 도구는 시작과 출력이 모두 필요합니다 포인트는 수동으로 지정됩니다 양자화에 대해 이야기 해 봅시다

신경망 작업에는 무리가 필요합니다 매트릭스 특성의, 곱하기의 톤을 의미 추가 작업 현재 모바일 장치는 일부 기능을 수행 할 수 있습니다 전문 하드웨어 예를 들어, [INAUDIBLE] 명령 CPU, 범용 컴퓨팅 GPU, DSP 등에서

대략적으로 모바일 CPU에서는 총 10 ~ 20GB FLOPS GPU를 사용하면 300 ~ 500 기가 플롭스 이상을 달성 할 수 있습니다 큰 숫자처럼 들리지만 여전히 데스크톱 또는 서버 환경 기반 그래서 우리는 최적화를 수행하기를 원합니다 양자화는 기술 중 하나입니다 메모리 사용 공간과 컴퓨터 부하를 줄입니다 일반적으로 TensorFlow는 단 정밀도 부동 값을 사용합니다

입력 및 수학을 위해 또한뿐만 아니라 출력 아시다시피, 단 정밀도 부동 소수점 각각 32 비트 걸린다 그러나 우리는 정밀도를 16 비트, 8 비트로 줄일 수 있다는 것을 발견했습니다 비트 또는 심지어 더 적은 결과를 유지하면서, 우리의 학습 과정에는 자연에 의해 약간의 잡음 그리고 약간의 여분의 소음을 추가하는 것은별로 중요하지 않습니다

따라서 양자화 된 가중치가 최적화입니다 저장 공간의 크기를 줄이면 정밀도가 떨어집니다 그래프 파일의 상수 노드의 값 그러나 양자화 된 가중치 최적화와 함께, 값은 메모리에 확장됩니다 그래프가로드됩니다

그래서 우리에게는 또 다른 최적화가 있습니다 우리는 그것을 양자화 된 계산이라고 부를 수 있습니다 양자화 된 계산으로, 우리는 양자화 된 값을 사용하여 계산 정밀도를 줄일 수 있습니다 예배 규칙서 이것은 첫 번째 메모리 대역폭에 좋으며, 이는 모바일 장치의 제한 요소입니다

또한 하드웨어는 이러한 정밀도 값을 더 빨리 처리 할 수 ​​있습니다 단 정밀도 부동 값보다 그러나 우리는 여전히 열려있는 문제가 있습니다 양자화 된 계산을 수행하기 위해 최대 값과 최소값이 필요하다 양자화 된 값의 범위를 지정합니다 우리는 여전히 훌륭한 해결책이 없습니다

그것은 여전히 ​​수동입니다 그러나 활발한 연구가 진행되고 있으므로 희망적으로이 문제는 곧 해결 될 것입니다 이것은 양자화 된 특성화의 예입니다 최적화는 TensorFlow에서 작동합니다 TensorFlow에는 양자화를 지원하는 일부 연산이 있습니다 예를 들어, 행렬에 대한 컨볼 루션 [INAUDIBLE] 등을 곱하십시오

우리는 그것이 충분히 다루기에 충분하다고 생각합니다 대부분의 추론 시나리오 그러나 우리는 여전히 연산 순서를 양자화하지 않았습니다 아직 값을 양자화하고 값을 역 양자화해야하기 때문에 각 노드의 앞과 뒤 바로 출력 그리고 그래프 변환 도구는 부품을 분석합니다

각 그래프 노드의 때로는 불필요한 양자화 및 역 양자화 된 값 메모리 매핑은 로딩 시간에 대한 또 다른 최적화입니다 이 최적화를 통해 모델 파일 변환되어 직접 매핑 될 수 있습니다 약간있을 수있는 memmap API 사용 일부 Linux 기반 운영에서 성능 최적화 Android와 같은 시스템입니다 또 하나는 실행 파일 크기를 줄이는 것입니다

모바일에서 중요한 주제입니다 모바일 장치에서, 실행 가능한 패키지 크기는 특정 크기로 제한됩니다 Android의 경우 100 메가 바이트, 이진, 그래픽 및 기타 리소스를 포함하여 기본적으로 휴대 장치는 선택한 여러 개의 거의 충분하다 추론 작업을 커버하지만, ops는 학습 프로세스를 사용 누락 따라서 모바일 장치에서 학습을하고 싶다면, 추가 작업을 등록해야합니다

또한 그래프에 일부 사전 등록 된 작업, 또한 그 중 일부를 제거합니다 그렇게하기 위해 선택 등록을 할 수 있습니다 예를 들어, Inception v3의 경우, 선택 등록을함으로써, 원래의 바이너리 크기는 12 메가 바이트였습니다 최적화 후에는 15 메가 바이트로 줄일 수 있습니다

이 최적화를 위해서는 공유를 다시 빌드해야합니다 당신 지역의 물건 따라서 빌드 환경을 구축해야합니다 따라서 이러한 최적화를 통해 Inception v3 그래프 이제 23 메가 바이트와 15 메가 바이트가됩니다

현재 바이너리 크기는 75 % 작아집니다 카즈 돌아 가자 KAZ SATO : Hak 고맙습니다 하크 (Hak)가 언급했듯이, 너무 많습니다

[박수 갈채] 고맙습니다 Hak이 언급했듯이, 많은 팁과 트릭이 있습니다 TensorFlow 모델 최적화 안드로이드 모바일 응용 프로그램으로 짜내다 그리고 바로 지금 할 수있는 일입니다 이러한 기술은 현재 사용 가능합니다

하지만 지금은 조금 이야기하고 싶습니다 가까운 미래에 출시 될 새로운 기술에 대해, TensorFlow Lite 및 Android Neural Network API 등이 있습니다 NNAPI 란 무엇입니까? 신경망 처리를위한 새로운 API입니다 안드로이드 안쪽에, 그리고 안드로이드 프레임 워크에 추가됩니다 새로운 API 추가의 목적 캡슐화하고 추상화하는 것입니다

계층은 GPU, DSP, 및 ISP 최신 스마트 폰은 강력한 컴퓨팅 리소스를 갖추고 있습니다 GPU 또는 DSP와 같은 CPU 이외의 다른 장치 특히 DSP는 거대한 양의 행렬 및 벡터 계산, DSP 나 GPU를 사용하는 것이 훨씬 빠릅니다 신경 네트워크 추론,보다는 CPU를 사용하여

하지만 지금 당장 당신이 그렇게하고 싶다면, 도서관에 직접 가야합니다 하드웨어 공급 업체가 바이너리를 빌드합니다 혼자서 지루한 작업입니다 또한 휴대용이 아닙니다

대신 표준 API를 제공하여 개발자가 하드웨어 가속기를 인식 할 필요가 없다 각 개별 공급 업체로부터 Neural Network API 위에는, 우리는 TensorFlow Lite를 제공 ​​할 것입니다 그것은 새로운 TensorFlow 런타임이 될 것입니다 모바일 및 임베디드 애플리케이션에 최적화되어 있습니다

따라서 TensorFlow Lite는 스마트하고 컴팩트 한 모바일 용으로 설계되었습니다 또는 임베디드 응용 프로그램 또한 Android와 결합되도록 설계되었습니다 NNAPI 그래서 당신이해야 할 일은 TensorFlow Lite로 모델을 작성하면됩니다

결국 모든 이점을 얻게 될 것입니다 당신은 안드로이드 NNAPI에서 얻을 수 있습니다, 하드웨어 가속과 같은 가까운 장래에 오픈 소스로 등장하게 될 것입니다 그러니 계속 지켜봐주십시오 이러한 새로운 기술에 관심이 있다면, 이 QR 코드의 사진을 찍어주세요 Android 용 ML에 대한 설문 조사에 참여할 수 있습니다

의견이나 요청을 할 수있는 곳 새로운 제품을 위해 네, 고마워요 그래서 마지막으로, 아주 흥미롭고 재미있는 것을 보여주고 싶습니다 TensorFlow로 구축 된 실제 응용 프로그램 모바일 및 임베디드 시스템에서 첫 번째 응용 프로그램은 Raspberry Pi에서 실행 중이며 일본인 오이 농부에 의해 사실, 나는이 사진을 찍었다

나는 오이 농장에 가서이 사진을 찍었습니다 그리고 그들은, 당신은 볼 수 있습니다 – 오, 미안 포인터가 없습니다 [CHUCKLE] 그래서 당신은 한 사람을 중간에두고 있습니다 그는 [부적절하다]

그는 2 년 전에 오이 농업을 돕기 시작했습니다 그리고 그는 오이를 올바른 부류로 분류하는 것을 알았습니다 가장 지루한 작업입니다 그의 어머니는 하루 8 시간을 보냈다 길이, 또는 색깔에 기초하여 각 오이를 분류하고, 9 개의 다른 수업으로 그녀를 돕고 싶지 않았어

그래서 대신 그는 TensorFlow를 다운로드했습니다 그 자신의 오이 선별기를 만들었습니다 [박수 갈채] 그가 한 일은 9,000 장의 사진을 찍은 것입니다 다른 오이 중에서 그의 어머니에 의해 분류 된 레이블, TensorFlow 모델을 혼자서 교육했습니다 그리고 그는 $ 1,500을 지출함으로써 스스로로 분류기 로봇을 만들었습니다

그리고 TensorFlow 모델은 Raspberry Pi에서 실행됩니다 접시에 놓은 오이를 감지 할 수 있습니다 그리고 그것은 오이를 9 개의 다른 종류로 분류 할 수 있고, 모양과 색상을 기반으로합니다 그리고 이것은 시스템의 시스템 다이어그램입니다 그래서 세 부분으로 구성됩니다

Arduino Micro는 서버 제어에 사용됩니다 및 모델 그리고 라스베리 파이에는 오이의 사진을 찍을 카메라가 있습니다 접시에 그리고 아주 작은 TensorFlow 모델을 실행합니다

그리고 이것은 실제로 아주 훌륭한 예입니다 작업을 분할하는 방법, 작업 에지 장치 및 클라우드 파트로 기계 학습을위한로드 그는 TensorFlow 전체 세트를 실행했기 때문에 Raspberry Pi 내부의 모델이 너무 무겁습니다 그래서 그는 그것을 두 가지 과제로 나누기로 결정했습니다 따라서 TensorFlow 모델은 Raspberry Pi에서만 실행됩니다

접시에 오이가 있는지 여부를 감지합니다 그리고 접시에 오이가 있음을 감지했을 때만, 그것은 그림을 서버로 보냅니다 그는 더 강력한 TensorFlow를 가지고 있습니다 오이를 9 개로 분류 할 수있는 모델 다른 클래스 흥미로운 또 다른 응용 프로그램을 살펴 보겠습니다

Android 및 iOS에서 실행되는 체조 운동 득점자 그게 뭐야? 사실 모든 일본인은 운동을 잘 알고 있습니다 우리는 전국 라디오 방송을 가지고 있기 때문에 방송 네트워크 그들은 동시에 같은 운동 음악을 연주한다 매일 아침

그리고 수천만 명의 일본인 매일 아침 같은 운동을하고 있습니다 당신은 알고 계십니까? [웃음] 이 응용 프로그램은 – 우리는 그것을 득점자라고 부릅니다 당신은 음악으로 당신의 운동을 해왔습니다 그리고 모션 센서로 모션을 캡처하려면, 그들은 TensorFlow를 사용했습니다 그리고 그들은 TensorFlow 모델을 포착하도록 훈련시킬 수있었습니다

데이터에서 패턴 또는 피쳐 추출 모션 센서에서 인간의 손으로 만든 동작을 평가할 수 있습니다 또한 TensorFlow 컴파일러를 자체적으로 구축했습니다 그래서 그들은 기술을 적용 할 수있었습니다 양자화 또는 근사와 같은 그리고 그들은 TensorFlow를 줄일 수있었습니다

모델을 수십 메가 바이트에서 수 메가 바이트로 모델링합니다 따라서 이것이 생산 품질을 구축하는 핵심 기술이었습니다 TensorFlow 기능을 갖춘 Android 및 iOS 애플리케이션 운동 실황 시범을 보도록하겠습니다 득점자 그럼 내가 여기로 바꿀 수 있을까? 선택할 수있는 응용 프로그램입니다 다양한 종류의 운동

그리고 나는 가장 표준적인 것을 연주 할 것이다 [음악 재생] 그래서 이것은 음악입니다 [웃음] [일본 축구 연발 스코어] [박수 갈채] 나는 잘하고 있니? 그래서 그렇게 그러니 그만하자 [웃음꾼과 박수] [음악 스톱] 충분 해 충분 해 [웃음] 이제 TensorFlow 모델이 시도하고 있습니다 이 운동을 얼마나 잘 수행했는지 평가하십시오

그리고 당신은 막대 차트를 여기에서 볼 수 있습니다 그것이 TensorFlow의 변형입니다 이 애플리케이션 내부의 모델 그것은 진짜입니다 승인? 슬라이드로 돌아가십시오

그것이 우리가 보여주고 싶은 것입니다 이 세션에서는 다음을 포함한 많은 것을 배웠습니다 일본에서 또 다른 이상한 물건, 그런 다음 몇 가지 최적화 기술 TensorFlow 응용 프로그램 구축 용 양질의 안드로이드 및 iOS 애플리케이션을 제공합니다 관심이 있으시면 TensorFloworg로 이동하십시오

시작하기에 많은 자료를 얻을 수 있습니다 그리고 훌륭한 codelab이 있습니다 codelab 웹 사이트에서 정말 고맙습니다 Hak MATSUDA : 고마워

[박수 갈채]

Android Toast Tutorial With Example | Kotlin | FineStack |

안녕하세요, FineStack에 오신 것을 환영합니다 오늘, 나는 간단한 안드로이드 응용 프로그램을 만들 예정입니다

그러면 화면에 토스트 메시지가 표시됩니다 이제 응용 프로그램을 만듭니다 나는이 비디오에서 코 틀린을 사용할 것이다 이제 레이아웃을 빠르게 만들자 사용자가 무엇을 입력 하든지 그냥 인쇄 할 것입니다

그래서 우리는 일반 텍스트보기와 버튼이 필요합니다 두보기의 ID를 변경합니다 이제 응용 프로그램을 작성해 보겠습니다 나는 사용자가 버튼을 누를 때마다 사용자의 메시지를 출력 할 것이다 버튼의 클릭 리스너 기능을 설정해 보겠습니다

리스너에서 Toast를 만들어 변수에 저장해야합니다 왜냐하면 우리는 show 함수를 호출해야하기 때문입니다 ToastmakeText () 함수에서 세 개의 매개 변수를 전달해야합니다 먼저 컨텍스트

둘째, 화면에 나타날 문자열입니다 그리고 마지막으로, 기간 길이를 짧게 또는 길게 선택해야합니다 다른 기간은 설정할 수 없습니다 이제 우리는 우리의 토스트가 있습니다

show () 함수를 호출 해 봅시다 자, 코드가 실행되고있는 것을 볼 수 있습니다 그러나 사용자가 메시지를 제공하지 않고 버튼을 누르면 그런 다음 빈 토스트를 인쇄합니다 우리는 그것을 원하지 않는다 그래서 우리는 조건 연산자가 필요합니다

일반 텍스트보기에 텍스트가있는 경우 그런 다음 메시지를 인쇄합니다 그렇지 않으면 버튼이 아무 것도하지 않습니다 자, 볼 수 있듯이 버튼이 작동하지 않습니다 왜냐하면 우리는 텍스트를주지 않았기 때문입니다 텍스트를주고 나면 메시지를 인쇄합니다

끝까지이 비디오를 시청 해 주셔서 감사합니다 이 비디오가 마음에 들면, 같은 버튼을 클릭하십시오 질문이 있으면 주저하지 말고 아래에 의견을 남기십시오 그리고 우리 채널을 구독하면 더 많은 비디오를 얻을 수 있습니다 나는 다음 비디오에서 너를 볼거야

Setup Citra Android with Pokemon Ultra Sun │Pokemoner.com and Guidepokemon.com

오 오케이 안녕하세요, pokemonercom에 오신 것을 환영합니다

나는 티엔 덕씨입니다 오늘은 안드로이드 용 Citra Emulator에 대한 튜토리얼을 만들겠습니다 이제 Android 용 Citra Emulator를 얻고 싶습니다 Pokemonercom에 방문하십시오

모바일 용 UI Pokemonercom입니다! 이걸 볼 수 있고, 클릭하면 다음을 클릭합니다 : Emulator Android에 오면 Citra Android v051-Alpha-fb75040을 볼 수 있습니다 클릭하여 다운로드하십시오! (서버는 변경되었지만 정상적으로 다운로드 할 수 있음) 당신은 다운로드가 완료되기를 기다리고 있습니다! 좋아요

돈을 지불하면 해를 끼치 지요 괜찮아 지길 바래요 이제 괜찮아요 이, Citra 에뮬레이터 및 설치를 클릭하십시오! 나는 포켓몬 울트라 썬으로 테스트 할 것이다 좋아, 끝냈다! Pokemonercom 및 다운로드 게임으로 돌아 가세요! Roms> 3DS와 Pokemon Ultra Sun 다운로드! Citro 용 Pokemon Ultra Sun을 다운로드해야합니다 테스트

좋아, 다운로드하려면 이것을 클릭하십시오! Download Pokemon Ultra Sun for Citra (v10)를 클릭하십시오 그리고 암호 기억

괜찮아 나는 돌아와서 너에게 항상 나에게 물어볼 문제가 있음을 알았다 압축 파일에 암호가 필요한 경우 암호는 pokemoner

com입니다! 너는 기억한다 pokemonercom의 암호는 항상 "pokemonercom"입니다 다운로드하려면 "Red Button"을 클릭하십시오!

그냥 말하다 (이제 Google 드라이브 또는 Amazon 드라이브를 제공하지 않으므로 1fichier, MegaUp 또는 Openload를 사용해 볼 수 있습니다) (이제 Google 드라이브 또는 Amazon 드라이브를 제공하지 않으므로 1fichier, MegaUp 또는 Openload를 사용해 볼 수 있습니다) (이제 Google 드라이브 또는 Amazon 드라이브를 제공하지 않으므로 1fichier, MegaUp 또는 Openload를 사용해 볼 수 있습니다) (이제 Google 드라이브 또는 Amazon 드라이브를 제공하지 않으므로 1fichier, MegaUp 또는 Openload를 사용해 볼 수 있습니다) 5 초를 기다리고 광고를 건너 뜁니다

네, 그리고 이걸로 알았어 너 그것을 클릭하면, 너는 그것을 클릭하여 다운로드 할 수있다 좋아, 이제는 다운로드하고 싶지 않아 내가 그만 둘 것이다 그만 좋아 좋아 이제 돌아와

포켓몬 울트라 썬을 추출하는 법을 보여 드리겠습니다 다운로드하면 폴더 다운로드로 이동합니다 Citra Emulator 이 게임입니다! 그래서 이것을 클릭하고 추출 할 곳 / 아카이브 이름 / 그래, 이제 비밀 번호가 필요합니다 bla bla 암호를 입력 할 수 있습니다 pokemonercom 그리고 당신은 윙윙 거리고 있습니다

어쩌면 아마도 1 ~ 2 또는 3 ~ 5 분을 추출해서 크기가이 게임은 34 GB이며 압축을 풀려고하면 2 부분으로 구성됩니다 파트 1과 파트 2 예 삭제로 돌아 가야합니다 UScitraNOv1

rar 지금 기다리고있어 좋아, 좋아

좋아 이제 완료되고 기억이 파일은 매우 무겁고 (내) 너 내 전화기가 복원 할 공간이별로 없다는 것을 알고 이걸 클릭합니다 삭제하고 괜찮아요 그리고 저는이 부분에 와서 여러분은 2 부분을 가지고 있습니다 이걸 추출하면 추출물이 나오는데, 그 중 하나를 클릭하면됩니다

압축을 풀면 앱에서 부분 1과 부분 2를 추출합니다 괜찮아요 추출 할 부분 2를 클릭하십시오! bla bla 블라 블라 그것을 위해 와트! 나는 곧 너를 보여 줄 것이다

이제 완료되었습니다 삭제하려면이 버튼을 클릭해야합니다 삭제하려면 클릭하십시오 알았어요! 자,이 게임은 여기! 크기는 3

44GB입니다 집으로 돌아와서 시트라를여십시오! 이제 에뮬레이터에 대한 허가를 받아야합니다 그리고 너는 허락 해 그리고 지금, 나는 약간 조정을 놓을 것이다! (이전 버전이고 뭔가 잘못되었습니다 최신 비디오를 통해 알 수 있습니다) (이전 버전이고 뭔가 잘못되었습니다 최신 비디오를 통해 알 수 있습니다) (이전 버전이고 뭔가 잘못되었습니다 최신 비디오를 통해 알 수 있습니다) (이전 버전이고 뭔가 잘못되었습니다 최신 비디오를 통해 알 수 있습니다) "+"를 클릭하고이 게임에 포함 된 폴더로 이동하십시오

이,이 1 부, 좋아요 그리고 확인을 클릭하십시오! 이제 당신은 Pokemon Ultra Sun을 볼 수 있습니다! 그것을 클릭하고 기다려! 작동 원리 버튼 (컨트롤러)을 설정하는 방법을 보여 드리겠습니다 버튼을 설정합니다 위로 전환하고 "3 도트"를 볼 수 있습니다 이것을 클릭하고 컨트롤을 구성하려면 레이아웃 편집을 클릭하십시오

(이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) (이제 컨트롤러 설정) 완료되었습니다 — 완료 하지만 충돌이 있습니다 당신은 돌아와서 모든 것을 깨끗하게합니다! 다시 열어 라! 좋아, 열어! 그것은 작동합니다! 그러나 당신은 그것이 단지 10 fps를 넘는 것을 볼 수 있습니다! 그리고 난 소니 Z5에서 테스트하려고합니다

Sony Z5, 내가 보여줄거야 당신은 설명에 소니 z5의 사양을 볼 수 있습니다! 그것은 내가 시험하고 작별 인사를하려고 노력할 작품입니다!

LG G7 ThinQ Android Pie Beta update launches in South Korea with globally expected soon

LG 전자는 브랜드의 본토 지역에서 LG G7 thinQ 사용자를 대상으로 LG OS 미리보기를 열었습니다 전화 회사가 밀어 붙이기를 준비 중임을 알릴 수있는 한국의 앞으로 몇 주 안에 Android Pie 업데이트 이 업데이트는 배포 된 PI 업데이트와 다릅니다

그것의 don'ts 전화의 안드로이드 한 판은 LG 브랜드 소프트웨어 LG 주요 Android 출시에 대한 빠른 업데이트를 제공하는 데 최선의 방법이 아니 었습니다 오늘의 소식에 따르면 LG는 이전 버전을 조금 더 빨리 업데이트하고 있습니다 LG 전자는 작년 12 월 말까지 베타 버전이 출시되기 전에 LG g6 테스트 및 Oreo 업데이트 시작 한국 사용자가 빠른 도움말 앱으로 이동하여 미리보기에 가입 할 수 있습니다 LG OS 미리보기 배너가 새롭게 바뀌는 것을 발견하면 새로운 제스처 홈이 포함됩니다 버튼 새로운 배터리 절약 기능 새로운 적응 형 밝기는 원하는 밝기 설정을 사용하면 새로운 미리보기가 표시됩니다

스크린 샷을 누르고 전원 버튼을 길게 눌러 휴대 전화를 잠글 수 있습니다 LG 미국에서 이와 같은 베타 프로그램을 제공하지 않았으므로 파이가 표시되지 않습니다 마지막 펌웨어가 완성 될 때까지 g7이 LG가 갈 것으로 기대합니다 12 월 또는 내년 초에 마지막 Pie 업데이트를 언젠가 릴리스하십시오 잘만되면 우리는 그 전에 영어로 변경 로그를 볼 것입니다

3 Platforms in 5 Minutes with Kotlin (Android Dev Summit ’18)

[음악 재생] WOJTEK KALICINSKI : 안녕하세요 내 이름은 워텍입니다

그리고 나는 너에게 짧은 이야기를 나누고 싶었다 새로운 Kotlin 멀티 플랫폼 프로젝트 경험에 대해 Kotlin에서 13 그래서 우리가이 회의에 올 때, Android에 대해 이야기하고, Android에서 Kotlin을 실행하는 것에 대해 이야기하십시오 안드로이드 애플 리케이션을 만들기 위해, 우리가 정말로 의미하는 것은 Kotlin JVM입니다

그게 우리가 알고있는 코 틀린이야 Java 바이트 코드로 컴파일됩니다 그런 다음 dex 파일로 변환 할 수 있습니다 Android에서 실행하십시오

그러나 클라우드 서버, 데스크톱, 등등 이제 실제로 Kotlin의 두 가지 맛이 있습니다 또는 컴파일 타겟 첫 번째, Kotlin JS, 달리기 웹 브라우저 환경의 JavaScript 또는 클라우드 기능 또는 Nodejs와 같은 것입니다

그리고 나서 Kotlin native가 컴파일됩니다 네이티브 라이브러리의 코드를 처리하는 방법 다양한 플랫폼을 실행하거나 타겟팅 할 수 있으며, 심지어 IOS, 데스크톱 애플 리케이션, WebAssembly, 그리고 심지어 안드로이드와 같은 그러면 우리는 실제로 이것을 어떻게 시작해야할까요? 그래서 Kotlin 13은 새로운 프로젝트 구조를 도입했습니다 Kotlin 멀티 플랫폼이라고 불리는 새로운 플러그인입니다

그리고 만약 당신이 그것을 당신의 어떤 모듈에도 적용한다면, 그런 다음 프리셋 세트에서 선택할 수 있습니다 이러한 플랫폼을 타겟팅 할 수 있습니다 여기 예를 들어 Android 라이브러리를 타겟팅하고 있습니다 및 js 대상 이제 이것을 모듈에 추가하면, 자동으로 각 플랫폼에 대한 소스 세트를 생성합니다

특정 Kotlin 파일 따라서 Kotlin 파일을 js 메인 폴더에 넣으면, 그들은 컴파일되거나 자바 스크립트 파일로 변환됩니다 이제 Kotlin이 구체적으로 무엇을 의미합니까? 미안 해요 – 플랫폼 특유의 Kotlin? 이제 문서를 찾아보고 찾아 본다면 Kotlin 패키지 각각에 대한 페이지, 오른쪽 상단에있는 마우스로 마우스를 움직여보십시오 당신은이 다색 칩을 볼 수 있습니다 컴파일 대상을 알려줍니다

이 라이브러리를 사용할 수 있습니까? 그래서 여기, 예를 들어, Kotlin 브라우저 패키지 문서 및 창 인터페이스에 액세스 할 수있는 아마 웹 브라우저 환경에서만 js 대상에서 의미가 있습니다 그리고 그것이 그 방법입니다 이제 다행스럽게도 많은 핵심 요소가 라이브러리와 함수는 모두 사용할 수 있습니다 컴파일 대상 실제로, 네 번째를 볼 수 있습니다, Kotlin common, 이것은 순수한 코 틀린임을 의미합니다

플랫폼과 독립적으로 실행할 수있는 라이브러리 타겟팅 사실 멀티 플랫폼 플러그인을 추가하면 플랫폼 별 소스 세트와 함께 프로젝트에, 당신은 또한 공통 소스를 얻을 수있는 곳으로 설정합니다 플랫폼 독립적 인 코드를 넣으십시오 이제 플랫폼 독립적 인 코드에 관한 것은, 플랫폼 API를 호출 할 수 없습니다 그것은 특정 또는 안드로이드 특정 js를 호출 할 수 없습니다 아피스 물론 다른 방법은 효과가 있습니다

플랫폼 별 코드를 가질 수 있습니다 공유 라이브러리에 따라 달라집니다 또는 소스 세트 그래서 모든 것을 알고, 나는 단지 예제 애플 리케이션을 작성하기 시작했다 Kotlin 멀티 플랫폼에 대해 알아보십시오

그리고 나는 작은 스도쿠 게임을 만들기로 결정했다 이제 Kotlin 멀티 플랫폼에 대해 내가해야 할 한 가지는 앱을 한 번 작성하고 실행할 수있는 툴킷이 아닙니다 그것을 도처에 Android 앱을 만들 필요가 있습니다 안드로이드 특정 코드로, 평소처럼 그러면 JavaScript 코드가있는 웹 페이지가 나타납니다

항목을 초기화하기 만하면됩니다 내 애플 리케이션, 라이프 사이클 UI 등을 가리킨다 그런데, 내가하는 일은 나의 모든 공유 비즈니스 논리이다 제 경우에는 스도쿠 엔진입니다 나를 위해 Sudoku 보드를 해결하고 생성합니다

나는 그것을 꺼내서 공유에 넣는다 라이브러리는 Kotlin 공통을 사용합니다 사실,이 라이브러리에있는 유일한 소스 세트입니다 공통점이다 그래서 모든 코드를 거기에 넣었습니다

이는 모든 플랫폼에서 사용할 수 있음을 의미합니다 내가 목표로 정했던 승인 하지만 그때 나는 생각했다 좋아, 나는이 핵심 엔진을 가지고있다 내 Sudoku 코드를 해결하기 위해

그러나 나는 또한 보드를 스크린에 그려 넣고 싶다 그리고 왜 각 플랫폼에 대해 코드를 작성해야합니까? 개별적으로 동일하게 보일 경우 별도로? 그래서 나는 생각하지 않았다 화면에 그리기위한 API가 있다면 완전히 독립적 인 플랫폼, 뭔가 다중 플랫폼 캔버스가 될 수 있습니까? 하지만 내가하고 싶은 것은 실제로하고 싶다 각 플랫폼 구현에 위임하게하십시오 그래서 안드로이드 캔버스를 사용하고 싶습니다

HTML을 사용하는 동안 Android에서 그릴 수 있습니다 캔버스를 웹 사이트에서 그립니다 문제는, 방금 Kotlin 공통 코드가 모든 플랫폼 인터페이스를 호출하십시오 그래서 나는 이것들에 정말로 의지 할 수 없다 이 모듈에서 내보내십시오

그러면 Kotlin에서 어떻게 작동합니까? 음,이 기대와 실제 메커니즘이 있습니다 예상되는 클래스를 공통 코드로 선언 할 수있게 해줍니다 이것은 Java에서 인터페이스를 정의하는 것과 거의 흡사합니다 그리고 각 플랫폼 별 소스 세트에서, 나는 실제 구현을 제공한다 플랫폼 API를 사용하고 의존 할 수있는 Android 캔버스와 같은 이제, 내 공통 소스에서 그 의존성을 추가 할 때 다른 하나를 설정하면 다음과 같이 보입니다

하지만 사실, 특정 플랫폼 용으로 컴파일 할 때, 그러한 js, 이 종속성은 실제로 올바른 HTML5 캔버스를 사용합니다 [징] [킬킬 웃음] 좋아, 내가 프로젝트에 대한 링크 만 보여줄 수 있다면 모두가 그것을 볼 수 있도록, 그것은 좋을 것입니다 [웃음] 네 연설자 1 : [INAUDIBLE] [킬킬 웃음] [박수 갈채] WOJTEK KALICINSKI : 맞습니다 [음악 재생]

Re-stitching Plaid with Kotlin (Android Dev Summit ’18)

[음악 재생] FLORINA MUNTENESCU : 안녕하세요 내 이름은 Florina Muntenescu이고 나는 Google의 개발자 옹호자 그래서 지난 몇 달 동안 3 명과 함께 우리 동료들과 함께, 우리는 격자 무늬를 돌려 놓기 위해 노력해 왔습니다

유행에 그래서 더 정확하게, 격자 무늬는 응용 프로그램입니다 그것은 처음에 동료 인 Nick Butcher에 의해 개발되었습니다 재료 디자인을 보여주는 방법 그리고 여기서 보시는 것은 실제로 2016 년에 앱 상태가 꽤 좋았을 때, 격자 무늬의 영광의 날을 보자

그래서 Nick은 여기에 많은 API를 사용했습니다 애니메이션, 전환, 모든 메소드 벡터에서 drawables 그래서 이들 모두가 앱을 실제로 만들었습니다 그들은 실제로 사용자 경험을 향상 시켰습니다 그래서 Plaid [INAUDIBLE] 데이터는 세 가지 다른 출처에서 왔는데, 그리고 2016 년부터 지금까지의 이러한 자료들은, 음, 그 중 일부는 더 이상 사용되지 않습니다

그래서 그것은 세 가지 근원 중에서, 우리는 하나와 조금 남았습니다 그래서 우리가 가진 멋진 멋진 UI 기능들 모두에서, 우리는 거의 아무것도 남기지 않았습니다 우리는 꽤 지루한 응용 프로그램을 남겼습니다 그래서 우리는 우리가 이것을 좋아하지 않기를 결심했다 우리는이 깨진 기능을 수정하기로 결정했습니다

그러나 이것과 별개로 우리는 우리가 뭔가를 향해 가고 싶었던 아키텍처에서 모듈화되고 확장 가능합니다 관점 하지만 그 점은 Plaid가 UI 샘플로 개발되었지만 아키텍처 샘플로 그래서 당신은 모든 동점을보기 위해 놀랄 것입니다 코드의 종속성, 그리고 음, 실제로 조금 뒤떨어 진 코드입니다

왜냐하면 Nick 2014 년에이를 구축하기 시작했습니다 그 당시에는 앱 아키텍처에 대한 가이드가 없었습니다 우리가 작년에 발표 한 그리고 우리가 코 틀린을 가지고 있었지만, 우리는 실제로 그것을 사용하지 않았습니다 그래서 우리는 Plaid를 다시 만들고 싶다는 것을 알고있었습니다 그러나 우리는 그것을 올바른 방법으로 다시 만들고 싶었습니다

미래의 변화에 ​​대비하여 좋은 상태로 유지해야한다 우리가 만들고 싶었던 그래서이 이야기에서 우리가 배운 것을 말해주고 싶습니다 또한 우리 앱에서 Kotlin을 어떻게 활용할 수 있었는지를 보여줍니다 그래서 우리는이 독창적 인 가이드를 앱 아키텍처에 발표했습니다 그러나 당신이 그것을 읽으면, 당신은 그것이 또한다는 것을 볼 것입니다

여전히 매우 모호합니다 그래서 우리는이 주요 클래스들을 가지고 있습니다 우리는 우리의 응용 프로그램을 설계해야합니다 그러나 우리는 몇 가지 분명한 지침을 만들고 싶다고 결정했습니다 그래서 우리는 앱에서 몇 가지 주요 유형의 클래스를 정의했습니다

우리는 또한 일련의 규칙을 정의했다 각 클래스에 대해 그럼 이들이 어느 것이 었는지 봅시다 그래서 우리는 RemoteDataSource를 정의했습니다 실제로 요청 데이터를 구성하기 만하면됩니다 API 서비스에서 데이터를 가져와야합니다

정보 요청 만하면됩니다 응답이 수신되었습니다 다음으로 우리는 LocalDataSource를 가지며, LocalDataSource의 역할 디스크에 데이터를 저장하는 것입니다 따라서 공유 환경 설정에서이 작업을 수행 할 수도 있습니다 또는 데이터베이스에서

다음으로 저장소를 가지게 될 것이다 데이터를 가져오고 저장하는 것입니다 또한 선택적으로 인 메모리 캐시를 수행 할 수도 있습니다 따라서 저장소가 클래스가됩니다 이는 로컬 데이터 소스와 원격 데이터 소스를 중재합니다

비즈니스 로직이 매우 복잡했기 때문에, 우리는 다른 레이어를 추가하기로 결정했습니다 유스 케이스를 추가하기로 결정했습니다 따라서 유스 케이스의 역할은 데이터를 처리하는 것입니다 비즈니스 로직을 기반으로합니다 작고 가벼운 수업이 될 것입니다

그것도 재사용 될 수 있습니다 따라서 사용 사례는 리포지토리 및 / 또는 기타 용도에 따라 다릅니다 사례 다음에는 뷰 모델이 있습니다 따라서 ViewModel의 역할은 노출하는 것입니다

UI에 의해 표시 될 데이터 및 동작을 트리거하는 데이터 사용자의 작업에 따라 그리고 ViewModel은 유스 케이스에 의존한다 입력으로 ViewModel은 아마도 ID를 얻습니다 따라서 ID가 필요한 경우 예를 들어, 상세 화면 용 ViewModel입니다 그리고 물론, 그것은 사용자의 행동을 입력으로 받아 들일 것입니다 그리고 결과물로서 라이브 데이터를 반환합니다

다음으로, UI에서 우리는 활동과 XML로 작업 할 것입니다 따라서 이들의 역할은 데이터를 표시하는 것입니다 액션을 ViewModel에 전달할 수 있습니다 입력으로 그들은 선택적인 ID를 얻을 것입니다 및 사용자의 행동

그래서 우리는 우리의 애플리케이션이나 아키텍처를 살펴 보았습니다 우리는 이것을 세 개의 층으로 나누었습니다 데이터, 도메인 및 UI 레이어 우리는 한걸음 더 나아가서 좀 더 나아지기로 결정했습니다 우리가 사용하고있는 방식으로 비난 받았다 [? 데이터?] 또는 우리가 사용하고있는 도서관에서 그래서 우리는 LiveData가 실제로 그것이 활동이나 단편과 함께 사용될 때 빛난다

그래서 우리는 실제로 LiveData만을 유지하기로 결정했습니다 ViewModel과 UI 사이에 차이점이 있습니다 그리고 더 좋은 점은 좋은 통합 때문입니다 LiveData와 DataBinding 사이, 우리는 XML에서 DataBinding을 사용하기로 결정했습니다 그러나 다시, 이러한 모든 제약 조건들과 함께 우리가 설정 한 이러한 모든 지침은 우리가 실제로 구현할 수있는 많은 방법들이 있습니다

이런 종류의 건축 그리고 우리는 Kotlin과 Kotlin 언어 기능을 알고있었습니다 이 점을 개선하는 데 도움이 될 것입니다 그리고 더 정확하게, 우리가 특히 좋아할 것 Kotlin이 지원하는 기능적 구성 요소입니다 사실, 우리가 만들어야 할 첫 번째 결정 중 하나 비동기 작업을 처리하는 방법은 무엇입니까? 그리고 우리는 코 루틴으로 작업하기로 결정했습니다

우리 앱의 거의 백본으로 왜냐하면 코 루틴으로 시작하는 것이 쉽기 때문입니다 coroutines 및 응답을 처리합니다 그리고 더 정확하게, 우리가 좋아하는 것 코 루틴에 범위가 있다는 사실입니다 예를 들어, 활동을 시작한다고 가정 해 봅시다 네트워크 요청을 실행 중입니다

당신은 언제 당신이 그 활동을 뒤로 누르고 그 활동을 끝내고, 또한 해당 네트워크 요청을 취소합니다 그래서이 coroutines의 범위 지정 우리가 좋아했던 것이 었습니다 그래서 이것은 우리가 ViewModel에서 결정한 것을 의미합니다 우리가 시작하는 곳이 될거야 우리는 코 루틴을 취소하고 있습니다

coroutine과 LiveData 사이를 전환합니다 그러나 ViewModel 위의 다른 모든 레이어의 경우, 우리는 단지 서스펜션 기능을 사용합니다 그러나 이러한 중지 함수는 결과 클래스를 반환합니다 더 정확하게 말하자면이 결과에는 두 가지 유형이 있습니다 성공 또는 오류

우리가 확신하고 싶었 기 때문입니다 여기저기서 예외를 던지지 않을거야 오히려 이러한 예외, 오류, 국가를 대표한다 그래서 코 틀린에서 흥미로운 것은 클래스를 확장 할 수 있기를 원한다면, 그것을 오픈으로 표시해야합니다 따라서 이것은 기본적으로 클래스가 최종적이라는 것을 의미합니다

상속을 사용할 때는 고의적이어야합니다 그래서 이것은 Kotlin이 정말로이 아이디어를 지원한다는 것을 의미합니다 상속을 선호하는 구성 그러나 오픈 클래스를 사용하는 것보다 더 잘할 수 있습니다 봉인 된 클래스를 사용할 수 있습니다

봉인 된 클래스를 사용하면, 우리는 [INAUDIBLE] 클래스의 클래스를 제한 할 수 있습니다 이는이 파일 밖에서 클래스를 확장 할 수 없다는 것을 의미합니다 우리가이 결과 클래스를 사용할 때가 많았습니다 우리는 일반적으로 그것을 내부에서 사용할 것입니다 그래서, 우선 스마트 캐스트를 지원합니다

그래서 이것은 결과가 성공할 때 쉽게 할 수 있다는 것을 의미했습니다 뭔가해라 결과가 오류이면 다른 작업을 수행하십시오 그러나 우리가 그것을 사용할 때마다 우리가 항상 모든 사건을 다루고 있는지 확인하기를 원했습니다 우리는 실수로 알고 있다면, 우리는 무언가를 처리하지 않고, 컴파일러를 원했습니다

이봐, 너 뭔가 잊어 버렸어 오류 케이스를 처리하는 것을 잊었습니다 그래서 이것은 때가 철저해야한다는 것을 의미했습니다 그러나 식으로 사용할 때만 철저합니다 그래서 우리는 철저한 속성을 만들었습니다

그래서, 더 정확하게, 우리는 T에 확장 속성을 만들었습니다 여기서 우리는 단지 객체를 반환 할뿐입니다 우리가 가진 또 다른 문제가 있습니다 그래서 우리는 코멘트 클래스와 답글에 대한 코멘트를 가지고있었습니다 그래서이 둘의 차이점은 사실입니다

그 주석은 또한 사용자에 관한 정보를 보유하고있다 의견을 게시했습니다 그래서 그것은 표시 이름과 초상화 URL을 가지게 될 것이고, 답글을 사용하는 주석은 거의 트리 구조입니다 주석의 응답을 보유하고있는 그리고 답장의 응답 등등 하지만 우리가해야 할 일은 코멘트를 작성하는 것입니다 답글과 사용자 객체가있는 주석의 그래서 당신은 이렇게 말합니다

좋습니다 우리는 새로운 생성자를 만들 것입니다 우리에게 매개 변수, 사용자 및 답글에 대한 설명을 얻습니다 그리고 그게 다야 하지만 그 일은 우리가 실제로하지 않았기 때문입니다

클래스가 두 개의 서로 다른 레이어에 있기 때문에 이렇게합니다 그리고 코멘트가 답글에 대한 코멘트에 대해 알아야하는 이유는 무엇입니까? 왜 사용자에 대해 필연적으로 알아야합니까? 데이터가 어딘가에서 온 것일 수도 있습니다 이 API를 변경해야하는 이유는 무엇입니까? 그래서 우리가 사용하게 된 것은 확장 기능입니다 그래서, 더 정확하게, 우리는 확장 함수를 만들었습니다 사용자 개체를 기반으로 한 댓글에 대한 댓글에 그것은 주석을 작성합니다

따라서 확장 기능을 만들 때, 당신은 공개 필드에 액세스 할 수 있습니다 그래서 이것은 우리가 실수로, 개인 구현 데이터 액세스 또는 변경 그리고 그것은 우리가 수업에 집중할 수있게 해줍니다 그들이 그것을 연장하지 않고 무엇을하는지 집중했다 따라서 공용 API를 변경할 필요가 없다는 의미였습니다 개인 구현 세부 사항에 액세스하지 않아야합니다

그래서 데이터 클래스에 대해 좋아하는 것은 사실입니다 값 객체가 있다는 것을 테스트에서 사용하면 빛난다 그래서 예를 들어, 우리는 코멘트에 upvote 플래그를 가지고 있습니다 그래서 우리가 코멘트가 upvoted 여부를 확인하기 위해 테스트를 구축, upvoted 플래그를 false로 설정하여 주석을 작성합니다 어떤 의견이든간에, 우리는 예상 된 결과가 코멘트, 초기 코멘트, 하지만 그 upvoted 플래그와 함께 사실

그러나 그 일은 특히 우리의 경우에는 주석에 너무 많은 필드가 있기 때문에, 실수하기 쉽습니다 그리고 실제로 무엇이 빠졌는지 쉽게 알 수있었습니다 여기서 중요한 것은 upvoted 플래그가 변경되었다는 사실입니다 Kotlin을 사용하면 복사 방법을 사용할 수 있습니다 그리고 거기에서 우리는 객체의 복사본을 만들 것입니다

에 호출됩니다 그리고 우리는 깃발을 세우고 있습니다, 우리가 실제로 가지고있는 깃발 변화, 그리고 그게 전부 야 코드가 더 간결하고 읽기 쉽도록 끝나고, 더 이해하기 쉽다 그럼 다른 예를 들어 봅시다 우리의 응용 프로그램에서 우리는 원격 데이터 소스 의견을 게시 할 수 있습니다

그리고 여기서, 우리는 결과를 반환합니다 그리고이 방법 안에서, 우리는 새로운 코멘트 요청을 만들 것입니다 우리는 백 엔드에서 그 요청을 트리거 할 것입니다 우리는 그 반응을 기다릴 것이다 그리고 우리는 응답을 처리하고 결과 성공 또는 오류 결과, 필요한 것에 따라 그러나이 코드를 살펴보면 실제로 충분하지 않습니다

왜냐하면 당신의 장치가 오프라인 일 때, 이 코드는 충돌합니다 그래서 우리가 실제로해야 할 일은 모든 요청을 감싸는 것입니다 try-catch 내부 그리고 우리에게는 많은 요청이 있습니다 그래서 우리는 계속이 try-catch를 추가하고 추가하는 것을 보았습니다

사방에, 그리고 우리의 방법이로드되었습니다 그래서 우리는 무엇에 집중할 수 없었습니다 응답을 만드는 데 정말로 중요했습니다 요청을 트리거합니다 그래서 우리가 한 것은 최상위 함수를 만드는 것입니다

그래서 이것은 서스펜션 기능이 될 것입니다 그것은 우리에게 람다를 정지시키는 매개 변수와 오류를 줄 것입니다 메시지 그래서 여기에 전화가 걸립니다 try-catch 내부에 포장 한 다음 빌드합니다

예외의 경우, 결과 [INAUDIBLE]이 (가)있는 오류 메시지를 기반으로 오류가 발생했습니다 그래서 이것은 우리의 모드 데이터 소스에서, 안전한 API 호출을 만들 수 있습니다 실제로 우리에게 중요한 전화를하십시오 다른 함수 내부 이처럼 코드가 더 읽기 쉽고 더 쉬워졌습니다

이해하다 그래서이 안전한 API 호출은 말하고있었습니다 첫 번째 매개 변수로 호출이 있음 오류 메시지를 두 번째 오류 메시지로 보냅니다 그러나 Kotlin에서 메서드의 마지막 매개 변수 람다, 당신이 할 수 있다는 것을 의미합니다 이것을 후행 람다 (lambda)로 사용하십시오

그래서 이것은 당신이 이것을 부를 때, 이 두 매개 변수를 전달하는 대신, 우리는 단지 오류 메시지를 전달할 수 있습니다 함수의 매개 변수로 메서드를 호출하려면 후행 람다 구문을 사용하십시오 이와 같이 코드가보다 간결 해지고, 그러나 그것은 정말로 더 가독합니까? 그래서 우리가 이것을 보았을 때, 그것은 느꼈습니다 여기에서 가장 중요한 것은 오류 메시지입니다 정말로 그렇지 않습니다

우리에게 중요한 점은 이 게시물의 댓글입니다 그래서 우리는 코드가 더 간결하지만, 그것은 더 가독성을 의미하지는 않습니다 그래서 간결함이 반드시 좋은 것은 아닙니다 따라서 Kotlin이 이러한 모든 종류의 옵션을 제공하더라도 및 기능, 염두에두고 실제로 생각하는지 이 모든 것이 필요하거나 올바른 장소에서 사용하십시오 다른 예가 있습니다

그래서 우리가 코 틀린으로 전환하자마자, 특히 우리의 활동에서 우리가 한 첫 번째 일 우리의 모든 견해를 만들 [부적절] 왜냐하면 우리는이 null 가능성을 모두 처리하기를 원치 않았기 때문입니다 하지만 우리는 코드를 다시 살펴 봤습니다 우리는 이것을해서는 안된다는 것을 알았습니다 일부 견해, 예를 들면, 우리의 결과가없는 견해, 특정 조건이 충족 될 때만 팽창되었습니다 사실 null 허용은 좋았습니다

Nullability는 의미가 있습니다 무효 성은 우리에게 무언가가 빠져 있다는 것을 말해주었습니다 우리는 그것을 실제로 처리해야합니다 그래서 전반적으로, 우리는 코 틀린 (Kotlin) 코 루틴과 같은 불변성, 기능 시민, 우리의 응용 프로그램을 도울 수 있습니다 그리고 앱 아키텍처에 대한 가이드와 함께, 우리가 이것을 유지 보수 할 수 있도록 도와 줬다

신속한 개발 아키텍처 우리가 갖고 싶었던 것 고맙습니다 [박수 갈채] [음악 재생]

Downgrade Samsung Firmware Complete Tutorial With Odin

다운 그레이드 삼성 펌웨어 완료 자습서 삼성 Galaxy S8 SM-G950FD Android Oreo 80 이진 버전 U1 2018 년 2 월의 패치 복구 모드 Andorid 8

00 Oreo 다운로드 모드 USB 케이블로 연결 삼성 펌웨어 정보 삼성 펌웨어 바이너리 정보 삼성 펌웨어 다운 그레이드 정보 같은 이진 버전 가능 업데이트 신청

Taking Advantage of Kotlin in Your Android App with Sean McQuillan (GDD India ’17)

[음악 재생] 연사 : 시작하겠습니다 안녕하세요, 저는 Sean McQuillan입니다

저는 Android 개발자 옹호자입니다 그리고 오늘 저는 코 틀린에 관해 당신과 이야기 할 것입니다 그래, 우리는 강사 주도의 훈련을 할거야 오늘 그게 무슨 뜻이야? Kotlin에서 코드 연구소를 운영하기 위해 도움을 받으러 여기 올거야

그래서 나는 너를 도울거야 나는 약간의 지시를 걸어 갈거야 그리고 우리는 청중에 몇 가지 TA를 가지고 있습니다 그들은 당신이 가진 어떤 문제라도 당신을 도울 것입니다 오늘 내가 할 일은 우리가 우리의 다운로드를 설치함으로써 시작할 것입니다, Android Studio에서 프로젝트를 컴파일하는 중입니다

그 다음 약 10 분 강의를 드리겠습니다 그런 다음 코드 연구소의 일부에서 작업 할 것입니다 다시 이야기하겠습니다 우리는 코드 랩의 일부를 다시 사용할 것입니다 이 코드 랩에서 우리가 할 일은 Java 애플리케이션을 Kotlin으로 마이그레이션하는 것입니다

우리가 함께 만든 주소록 응용 프로그램입니다 그것은 Java로 작성되었습니다 그리고 우리는 Kotlin 변환기를 사용할 것입니다 우리는 Kotlin에 추상화를 작성하려고합니다 그리고 우리는 그것이 어떻게 가능한지를 볼 것입니다

우리의 상용구 코드를 줄이는 데 도움이됩니다 유지하기 쉽고 간결하고 읽기 쉬운 코드를 제공하십시오 그리고 우리는 몇 가지 일반적인 문제를 피할 것입니다 더 나은 코드를 작성하는 데 도움이되는 추상화를 작성합니다 그러니 계속 뛰어 들어 보자

가서 그 링크를 따라 가라 맨 위의 코드 랩을 다운로드하여 시작하십시오 1 단계와 2 단계를 수행하고 요점을 알려면됩니다 어디 안드로이드 스튜디오에서 그것을 컴파일거야 그렇게하면 우리 모두 다운로드 할 수 있습니다

모든 의존성 [음악 재생] 나는 대부분의 사람들이 그 지점에 있다는 것을 알았다 Android Studio에서 종속성을 다운로드하는 곳입니다 따라서 Wi-Fi 휴식이 효과적이었습니다 Kotlin과 함께 제공되는 정말 멋진 기능 중 하나입니다

코 틀린은 – 죄송합니다 Android Studio의 Java to Kotlin 변환기입니다 그것을 사용하려면 프로젝트에 Kotlin이 있어야합니다 로 시작하도록 구성되었습니다 그리고 자바 파일을 선택할 때마다, 코드 메뉴로 이동할 수 있습니다

Java 파일을 Kotlin으로 변환하십시오 이 변환기에 대한 정말 멋진 기능입니다 내가 제일 좋아하는 것들은 마술처럼 보인다 내가 그것을 사용할 때마다 – 붙여 넣을 때이다 클립 보드의 Java 코드를 Kotlin 파일로 변환하고, Java 코드를 자동으로 Kotlin으로 변환합니다

그것은 붙여 넣습니다 그래서 내가 지금 이야기하고 싶은 것은 단지 모든 Kotlin 구문 기본에 대한 개요 우리는 오늘 코드 랩에서 사용할 것입니다 따라서이 함수 선언을 살펴볼 수 있습니다 바로 여기, 우리는 단계적으로 그것을 거치게 될 것입니다 따라서 Kotlin에서 함수를 정의하고 싶을 때, 재미있는 핵심 단어로 정의됩니다

그래서 여기에 함수, 합, a와 b 두 개의 매개 변수가 있습니다 매개 변수에는 유형이 있습니다 a는 정수 유형이고 b는 정수 유형입니다 그리고 이것은 코 틀린 (Kotlin) 전체에 공통된 구문입니다 변수 선언 다음에 변수의 유형을 넣으십시오

따라서 이것은 자바 프로그래밍과는 다릅니다 언어, 분명히 다른 방법입니다 비슷하게, 함수의 리턴 타입 인수 뒤에 나열됩니다 따라서 두 개의 매개 변수가있는 함수 합계입니다 정수를 반환합니다

그리고 Kotlin에 대한 또 다른 멋진 기능 세미콜론은 선택 사항입니다 JavaScript와 마찬가지로 Kotlin의 디자이너 우리가 수 년 동안 우리가 코드에 세미콜론을 넣거나 세미콜론을 넣지 않아야합니다 아니요, Kotlin 코드에 세미콜론을 넣으면 안됩니다 가지고있는 반 패턴으로 간주됩니다 세미콜론은 Kotlin 코드에 있습니다

한 줄 구문으로 함수를 정의 할 수도 있습니다 당신이 여기에서 볼 수 있습니다 여기서는 함수 합을 정의합니다 다시 두 개의 매개 변수를 취하고 더하기 b를 반환합니다 그래서 그것은 바로 그 표현입니다 그리고 우리는 할당 연산자를 순서대로 사용합니다

이 방법으로 함수를 정의하십시오 언제든지 사용할 수 있습니다 당신은 함수를 정의하기를 원한다 이와 같은 단일 표현식으로 구성됩니다 여러 개의 표현식을 만들고 싶다면, 중괄호 구문을 사용해야합니다

우리가 잘 알고있는 Kotlin은 기본 인수도 제공합니다 예를 들어, 우리는 함수, 합, 대개 두 개는 정수 유형을가집니다 기본값은 2입니다 그래서 당신이 이것을 부를 때마다, 당신이 인수를 지정하지 않으면 기본적으로 2로 설정됩니다

다음은 변수 선언에 대해 설명하겠습니다 여기서는 두 변수를 정의하고 있습니다 이름이 불렀다 다른 하나는 참석자라고합니다 이름은 val이고 참석자는 var입니다

그래서이 이름은 JavaScript와 비슷합니다 그래서 나는 다른 문자열을 지명 할 수 없다 니키타가 영원 할거야 참석자는 변경할 수 있습니다 그래서 나는 그것을 인스턴스화하는 배열리스트에 할당한다

하지만 나중에 내 소스 코드에서 할 수있어 그것을 다른 배열 목록에 지정하십시오 그래서 가변 변수입니다 Kotlin은 실제로 Kotlin과 Java의 차이점이 있습니다 프로그래밍 언어가 Kotlin에 추가됨 val은 Kotlin에서 변수를 정의하는 데 선호되는 방법입니다

이 슬라이드에는 몇 가지 다른 구문이 있습니다 새로운 배열리스트를 만들 때 볼 수 있습니다 우리는 새로운 키워드를 부르지 않는다 사실, Kotlin에는 새로운 키워드가 없습니다 클래스를 생성하는 것은 함수를 호출하는 것처럼 보입니다

Kotlin에서, 그리고 이것처럼 보입니다 계속 진행중인 또 다른 일은 질문을 보게 될 것입니다 거기에 표시하십시오 이는 해당 문자열이 null이 될 수 있습니다 Kotlin은 null 가능 유형을 소개합니다

이는 기본적으로 String을 작성한 경우를 의미합니다 물음표 없이는 null이 아닌 문자열이됩니다 그리고 그 문자열은 항상 당신에게 보증 할 수 있습니다 내 코드에서 null이 아니며 널 포인터도 얻지 못한다 예외

그것이 nullable다는 것을 말함으로써, 나는 거기에 null을 저장할 수 있습니다 그리고 내가 역 참조 할 때, 나는 특별한 문법을 ​​사용해야합니다 또는 널 포인터 예외가 발생합니다 내가 이야기하고 싶은 다음 이야기 Kotlin의 데이터 클래스입니다 그것들은 많은 코드를 정의하는 간결한 방법입니다

여기서 내가 정의하는 것은 데이터 클래스 접촉입니다 3 개의 필드가 있습니다 이름, 성 및 이메일이 있습니다 Java 프로그래밍 언어에서 동일한 작업을 수행 할 수 있습니다 나는 String first name, String last name, 및 문자열 전자 메일

그리고 세명의 게터와 세터를 써야합니다 그리고 나서 equals 메서드를 작성해야합니다 그리고 toString 메서드를 작성해야합니다 모든 기능이 자동으로 생성됩니다 나를 위해 데이터 클래스를 사용할 때

이것에 관해 정말로 흥미있는 일부 나는 일반적으로 데이터를위한 클래스 몸체를 제공 할 필요가 없다 수업 내가하고있는 일이 평범한 자바 빈을 정의하는 것이라면 이런 식의 물건, 나 그냥 가면 돼 이름의 값을 선언하십시오 성을 의미하는 불변의 것을 의미합니다

또한 불변 인 것을 의미하고, 그 다음 이메일의 var 그리고 그것은 할당 가능한 필드라는 것을 의미합니다 당신이 바닥에서 보는 것처럼 이메일에 지정할 수 있습니다 이 결론에 대해 생각할 수도 있습니다

나는 현장에 직접 지정하고있다 나는 실제로 세터에게 전화하고있다 그리고 이것은 Kotlin에 대한 멋진 부분입니다 getter와 setter 모두에 대해 암시 적으로 호출되며, C #이나 Swift 같은 언어와 비슷합니다 에서이 구문을 보았습니다

Kotlin에서 흥미로운 한 가지 자바 프로그래밍에 관해서는, 종종 Java에서는 수명주기가 있습니다 Android 라이프 사이클과 관련이 있습니다 따라서 우리는 활동주기가 다릅니다 활동 개체보다 그래서 객체에는 분명히 생성자가 있습니다 그리고 나서 우리는 활동을 시작했습니다

이는 다른 방법입니다 Kotlin은 클래스의 모든 null이 아닌 변수가 필요합니다 constructor의 말미에 의해 초기화된다 예를 들어, 공유 할 때 문제가 될 수 있습니다 생성자가 끝난 후 환경 설정

여기서 우리는 SharedPreferences를 만들 수있는 예제를 볼 수 있습니다 variable null 가능 그리고 우리가 접근 할 때, 우리는 더블 뱅 (double bang)을 사용하거나 확인을 위해 if 체크를해야한다 우리가 액세스 할 때마다, 우리가 널 (null) 변수에 액세스합니다 코 틀린에서 이것을 쓰는 더 좋은 방법은 – 안드로이드에서 우리가 할 일이 많습니다

lateinit을 사용하는 것입니다 그래서 한 lateinit 말한다 – 조금 이상한 구조입니다 그러나 이것이 실제로 의미하는 것은,이 SharedPreferences 내가 액세스 할 때 null이 아니게 될 것입니다 그러나 나는 그것을 끝내겠다고 보장 할 수는 없다 생성자가 끝날 때까지 그래서이 변수에 접근하기 전에 어느 시점에서, 저는 컴파일러에게 약속하지 않을 것입니다

따라서 null 허용 여부 검사를 완화 할 수 있습니다 하지만 그것을 지정하도록 강요하지 않을거야 생성자가 완료되기 전에 해당 필드를 실제로 초기화하지 않은 경우 그것을 액세스하면 다른 런타임 예외가 발생합니다 그래서 그것은 실제로 null 포인터 예외를 만들지 않습니다

여기까지 완전히 가버 리지 만 분명히 문서화되어있다 당신이하려는 일 여기서는 구문에 대한 기본적인 내용을 다루었습니다 코드 랩으로 돌아갈 시간입니다 3 단계를 거치면 방금 전에 말한 몇 가지 단계를 수행하십시오

일부 언어 구문을 사용하십시오 [음악 재생] 그래서 나는 한 쌍의 사람들에게서 한 가지 질문을했다 사실, Kotlin은 실제로 Java로 컴파일하기 전에 바이트 코드로 컴파일합니까? 그리고 답은 Kotlin이 직접 바이트 코드로 컴파일합니다 JVM-6 호환 바이트 코드를 생성하고, 또한 약간의 추가 정보를 추가합니다 바이트 코드로 Kotlin 언어의 일부를 지원한다

구문에 실제로 저장되는 구문 바이트 코드 파일의 헤더에있는 버퍼 따라서 자바에 대한 Kotlin과 같은 바이트 코드는 없습니다 Bytecode에 Kotlin, 바이트 코드에 Java, 그런 다음이 둘을 연결합니다 지금 제가 이야기하고 싶은 것은 Kotlin 뷰 바인딩입니다 Android 확장 플러그인입니다

JetBrains에서 온 것입니다 또한 합성 속성을 사용하여 뷰에 액세스 할 수 있습니다 그래서 우리는 이미 자바에서 이것을하기위한 라이브러리를 가지고 있습니다 프로그래밍 언어 아마 우리 모두는 버터 나이프를 보았을 것입니다

여기서 ID로 찾아보기를 건너 뛸 수 있습니다 이것은 매우 유사한 아이디어입니다 ID로 찾기 창을 건너 뛸 수 있습니다 Kotlin 컴파일러는 컴파일 시간에이를 수행 할 것이며, lazy 할당 및 캐싱을 제공합니다 그래서 저는 앞으로 나아가서 걸어 갈 것입니다

여기 몇 가지 슬라이드에서 뷰 바인딩을 사용하는 방법을 설명합니다 그래서 앱 수준의 Gradle 파일에서 이것들은 4 단계의 단계들입니다 우리는 계속해서 플러그인을 적용합니다 kotlin-android-extensions 그리고 우리가 그것을 할 때, 그것은 가고 있습니다

kotlinx 네임 스페이스에 합성 게터를 생성합니다 그래서 kotlinxandroidsynthetic입니다 그리고 이제 우리는 코드를 작성합니다

mainactivity_contacts가 있습니다 이것이 우리가 정의한 레이아웃 파일입니다 그리고 거기에서 우리는 전망을 얻을 수 있습니다 예를 들어 activity_contacts

xml을 with로 선언 한 경우 플로팅 액션 버튼이 있으며 ID가 있습니다 이것은 꽤 전형적인 코드입니다 수업 시간에 이것을 사용하고 싶을 때, ID로 찾아보기를 사용하는 대신 또는 contacts_activity에 대한 속성을 정의 할 수도 있습니다 나는 그냥 가서 FAB 액세서리를 사용할 수 있습니다 그리고 그것은 종합적으로 추가되었습니다

정적 가져 오기를 수행하면됩니다 ID로 찾기보기를 캐싱 할 것입니다 그래서 내가 FAB에 처음 접근했을 때, 그것을 찾기 위해 뷰 ID를 찾을 것입니다 그리고 나서 나는 그것을 액세스 할 때마다, 같은 인스턴스를 사용합니다 그리고 그것을 해시 맵에 캐시합니다

어제 Kotlin 이야기에서 우리는 많이 이야기했습니다 확장 기능에 대해 그래서 당신이 그것을 보지 못했다면 그것은 YouTube에 올라와 있습니다 어서보세요 오늘, 우리는 우리 자신의 확장의 일부를 정의 할 것입니다

이 코드 랩의 기능 오늘 확장 기능을 활성화하겠습니다 이 고전적인 패턴을 자바에서 보아서 프로그래밍 언어 기본적으로 isTuesday라는 메소드를 추가 할 것입니다 Date 클래스에 추가합니다 그래서 자바에서는 이것을 DateUtils라고 씁니다

우리는 정적 인 방법을 사용합니다 부울을 반환합니다 그것은 화요일이며 유일한 인수로서 날짜를 취합니다 그리고 이것은 멤버 함수처럼 보입니다 당신이 그것에 대해 생각한다면

자바에서 이것을 호출하면 DateUtilsisTuesday, date라고 말하십시오 어색한 구조에 불과합니다 하지만 모든 코드베이스에서 수행 한 작업입니다 그리고 그것은 정말로 잘 작동합니다

따라서 Kotlin은 확장 기능과 확장 기능을 제공합니다 속성을 사용하여 더 나은 구문 지원을 제공합니다 확장 기능은 확장 기능입니다 기존 클래스의 다른 멤버 추가 이미 존재하는 클래스로 마찬가지로, 확장 속성은 getter와 setter를 추가 할 수 있습니다 이미 존재하는 클래스로 여기에서는 정의 및 호출 구문을 볼 수 있습니다

확장 기능 그래서 우리는 함수를 정의하고 있습니다, isTuesday, that Date 클래스의 메서드입니다 그런 다음 인라인 할당을 사용하고 있습니다 to say 하루에 두 번이나 true로 돌아갑니다 형식 유추 때문에 우리는 함수의 반환 유형을 지정해야합니다

그리고 우리가 그것을 부를 때, 우리는 데이트를 말한다 그래서 그것은 클래스의 멤버 메소드처럼 보입니다 그러나 실제로 Date 클래스를 수정하지는 않습니다 따라서 이것이 확장 기능을 이해하는 데 핵심입니다 코 틀린

우리가이 모든 마술을하고있는 것처럼 보입니다 우리는 수업을 열고 방법을 추가하고 있습니다 그러나 우리는 그렇게하지 않습니다 따라서 Date 클래스는 다시 컴파일되지 않습니다 우리는 그것에 방법을 추가하지 않습니다

방금 isTuesday라는 정적 메서드를 정의했습니다 이는 date 매개 변수 인 단일 인수를 취합니다 Kotlin은 약간의 추가 구문을 제공합니다 이런 식으로 부르기 위해서 그래서 우리 코드는 Kotlin에서 이렇게 보입니다

그러나 실제로 우리는 수업을 열지 않았습니다 그리고 그것은 또한 전화가 어떻게 이것에 대한 의미론이 작용합니다 다음으로 얘기하고자하는 것은 람다 표현식입니다 그래서 저는 방금 람다 식을 가지고 있습니다 여기에 화면에

그리고 우리는 구문을 살펴볼 것입니다 읽고 쓰는 법, 쓰는 법 그래서 첫 번째 줄 -이 첫 번째 줄 실제로 자체적으로 모든 것을 컴파일하지는 않지만, 그러나 이야기하는 것이 유용합니다 그것은 람다 식입니다 우리는 외부에 중괄호가 있기 때문에 말할 수 있습니다

가운데에있는 화살 그리고 왼쪽에는 두 개의 인수 a와 b가 있습니다 그리고 오른쪽에는 표현 a plus b가 있습니다 그래서 이것은 두 개의 인수를 취하는 함수입니다 함께 추가합니다

우리가 컴파일하지 않았기 때문에 컴파일되지 않습니다 a와 b에 대한 유형을 제공했습니다 그래서 우리는 다음 라인으로 넘어갈 것입니다 우리는 a를 정수로, b를 정수로 정의했습니다 그래서 우리가 이것에 대해 생각한다면, 우리는 이제 더하기 b라고 말할 수 있습니다

우리는 그 람다의 리턴 타입을 지정할 필요가 없다 Kotlin에서는 정수와 정수가 항상 정수입니다 그런 다음 합계에 할당하고 우리가 유형을 제공 할 필요가없는 것을보십시오, sum은 리터럴 표현식에서 유형을 추론 할 수 있기 때문에 그것은 오른쪽에 있습니다 다음 줄, 세 번째 줄에는 합이 있습니다 여기서 sum 변수 자체에 대한 유형을 정의했습니다

그것은 두 개의 정수를 취하는 모든 함수를 말합니다 정수를 생성합니다 그 문법이 있습니다 괄호 안에는 매개 변수의 유형, 당신은 화살을 넣은 다음 오른쪽에, 함수의 반환 형식을 나열합니다 그런 다음 그것을 객체 리터럴 인 우리의 람다에 할당합니다

우리가 첫 번째 줄에 가지고 있었던 이제 컴파일되는 것을 볼 수 있습니다 타입 유추를 사용할 수 있기 때문에 그 유형을 통해 오른쪽에 매개 변수를 정수 및 정수로 정의했습니다 그리고 이제 a는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다

그리고 b는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다 그리고 다시, 우리는 여전히 돌아갈 필요가 없습니다 – 람다의 반환 유형을 말할 필요가 없습니다 그리고 마지막 줄에서 조금 더 보여줍니다 실용적인 람다의 값 notEmpty

따라서 텍스트 뷰를 사용하고 Boolean을 반환합니다 그리고 이것은 흥미로운 부분을 보여줍니다 Kotlin에서 람다 구문의 그래서이 경우에는 실제로는 아니에요 화살표 구문을 제공하거나 매개 변수의 이름을 지정합니다

하나의 매개 변수 λ에 대한 값을이 매개 변수라고합니다 그건 기본적으로입니다 항상 이름을 바꿀 수 있습니다 하지만이 경우에는 그냥 그대로 두겠습니다 그래서, 우리는 it

textisNotEmpty라고 말합니다 그래서 우리가 시작할 때 정말 빛나는 곳입니다 익명의 내부 클래스를 수행합니다 그래서 우리는 자바 프로그래밍 언어로 항상 이것을합니다

우리는 setOnClickListener를합니다 그리고 그 모든 것을 읽으면 매우 길어질 것입니다 그러나 결국에는 onClick 메서드를 재정의합니다 그리고 여기에 쓰고있는 유일한 실제 코드 performAction입니다 그 밖의 모든 것은 실제로 코드가 아닙니다

그것은 나를 위해 생성하는 IDE를 가져야 만하는 물건입니다 그래서 내가 쓰려고하는 코드를 작성할 수 있습니다 Kotlin에서는 람다를 사용하여 말하려고했다 이것이 우리가 할 수있는 일입니다 우리는 fab

setOnClickLIstener, 그리고 나서 우리는 문자 그대로 우리가 말하려고했던 코드를 작성합니다 우리는 그 여분의 것들을 모두 제거 할 수 있습니다 그리고 주변에 머물러 있습니다 형식 유추를 계속 사용합니다 훨씬 더 간결하며 Java 8과 매우 비슷합니다

람다 구문 람다가 정말 강력 해지는 곳 우리가 그들을 더 높은 순서대로 사용하기 시작할 때입니다 우리는 이미 이것의 예를 보았습니다 하지만 다른 함수를 사용하는 함수입니다 그것의 논증으로

그리고 이것은 여러분이 할 수있는 것입니다 Kotlin을 사용하여 코드를 매우 멋지게 만드십시오 읽기 쉽고 매우 표현적입니다 따라서 고차 함수의 고전적인 예 1970 년부터는 필터 방법이 있습니다 따라서 필터 메서드는 목록에 대해 작동합니다

그래서 당신은 목록을 가지고 있습니다 당신은 술어를줍니다 그리고 술어가 사실 일 때마다, 값을 포함하는 새 목록을 생성합니다 필터가 참인 곳 이제이 선언문을 읽으십시오

Kotlin 구문이 많이 표시되기 때문입니다 그래서 그것은 기능입니다 그것은 일반적인 유형 T를 가지고 있으며, 그것은 T의 목록에 대한 확장입니다 그리고 이것은 흥미로운 일입니다 왜냐하면 당신이 정의 할 수 있기 때문입니다

제네릭 형식의 확장 이것은 정말로, 정말로 할 수있는 일입니다 영리한 물건 T 물음표로 정의 할 수도 있습니다 내가 T에 확장을 정의하고 싶다

또는 T의 널값 그런 다음 filter라는 함수를 정의 할 것입니다 하나의 술어를 취합니다 그리고 나서 우리는 그것이 T 형의 1 개의 인수를 취하는 함수 부울을 반환합니다 그리고 마지막으로, 물론, 우리의 기능 T의 목록을 반환합니다

그리고 함수 안에서, 새 배열 목록을 만듭니다 그리고 항목에 대한 술어를 호출합니다 술어가 참일 때마다 새 목록에 추가합니다 그런 다음 새 목록을 반환합니다 그래서 우리가 앞서 가서 이것을 사용하려고 시도한다면, we''d는 listOf를 말한다

그것은 Kotlin의 길이다 정적 목록, 애플, 오렌지, 셀러리, 당근을 선언합니다 그리고 나서 우리는 바구니에 넣을거야 여과기 다시 말하지만, 코드를 단축하는 데 사용합니다

첫 번째 문자가 C이면 우리는 그냥 셀러리와 당근 목록을 생성하려고합니다 특히 그렇게 강하지는 않습니다 우리 모두가 루프를 쓸 수 있다고 생각해 앞으로 나아가서 우리 스스로 할 수 있습니다 그러나 우리는 훨씬 더 표현적인 것을 쓸 수 있습니다

우리가 이와 같은 보편적 인 코드를 시작할 때 이것은 데이터베이스 트랜잭션을 수행하는 방법의 예입니다 [? 방 ?] 거래를 시작해야합니다 실제 데이터베이스를 호출해야합니다

당신이하고 싶은 기능, 그리고 당신 끝내야 해 거래 그리고 당신이 그것을 더 잘하고 싶다면, 당신은 beginTransaction, call을해야합니다 당신이하고 싶은 함수, setTransactionSuccessful, 그런 다음 거래를 끝내십시오 다시 한번, onClickListener와 마찬가지로, 실제로 여기에는 실제 코드가 한 줄만 있습니다

그 밖의 모든 것들은 내가 방금하는 물건입니다 타이핑 및 / 또는 다른 수단을 통한 생성 자바 프로그래밍 언어가 작동하는 방식 때문에, 이것을 단순화하고 그것을 돌리기는 어렵다 추상화 하지만 Kotlin에서 우리는 실제로 꽤 잘 갈 수 있습니다

꽤 멀리 그래서 Kotlin에서 우리는 SQLite 데이터베이스 endTransaction을 할 수 있습니다 그래서 우리는 확장 함수를 할 것입니다 우리 데이터베이스에 그리고 우리는 그 모든 보일러 판을 정확히 놓을 것입니다

같은 방식으로 그래서 beginTransaction, setTransactionSuccessful, 및 endTransaction 하지만 우리는 그 모든 것을 쓰지 않고 우리가 작성하려고하는 모든 코드 라인을 중심으로, 우리는 코드 줄을 지나갈 것입니다 함수 인수에서 람다 (lambda)로 따라서 함수 – 인자를 취하지 않는 함수 값을 반환하지 않습니다

그래서 우리가 그것을 사용할 때, 이것처럼 보입니다, 그렇죠? 그래서 우리는 dbinTransaction을 말하고 우리는 람다를 전달합니다 그리고 나서 우리는 실제로 우리가 작성한 코드만을 씁니다 쓰기를 시도합니다 자, 이건 좀 이상해

우리가 우리의 람다 내부에서 데이터베이스에 액세스 그리고 lambda는 함수 리터럴입니다 그래서 그것에 대해 생각한다면 그것은 의미합니다 나는 끝내기 위해 폐쇄를해야 할 것입니다 해당 데이터베이스 변수

우리가 할 수있는 또 다른 방법은 함수에 데이터베이스를 전달할 수 있습니다 이 경우 함수를 SQLite로 정의합니다 SQLite 데이터베이스를 사용하고 아무 것도 반환하지 않는 함수 그래서 우리가 그렇게한다면 그것은 이렇게 보일 것입니다 db

inTransaction, itdelete 괜찮아요하지만 그건 나는 아직도 조금 이상하다고 생각한다 우리는 더 잘 할 수 있습니다 함수를 정의하는 바로이 구문 우리가 확장 람다라고 부르는 것입니다 확장 기능으로 작동하는 부동 함수입니다 기능

이렇게하면 확장 기능을 호출 할 수 있습니다 SQLite 데이터베이스 유형의 모든 객체에서 이 경우 암시적인 this를 사용합니다 우리의 확장 함수에서 thisfunc를 호출하십시오

그런 다음 다른 코드에서 dbinTransaction이라고 말할 수 있습니다 이제 데이터베이스에서 함수를 호출 할 수 있습니다 나는 그것을 사용하고 싶었다 도메인 별 언어의 시작 부분이 생성됩니다

Kotlin에서는 매우 강력합니다 코드에 대해 언급하고 싶은 것이 있습니다 그래도 우리는 여기에있다 이 코드를 컴파일하면 어떻게 될까요? 그런 다음 디 컴파일하십시오 우리는 이것으로 끝난다

그리고 조금 더러워 보이지만, 정말 중요한 것은 inTransaction을 호출 할 때입니다 새로운 함수 객체를 생성하고, 왜냐하면 매번 인수를 포착해야하기 때문입니다 Kotlin에서 함수를 작성할 때 당신은 람다 (lambda)를 취하는 고성능이 될 것이라고 생각합니다 인라인 키워드를 사용해야합니다 따라서 인라인 키워드를 사용할 수 있습니다

지정시 수행 할 작업 인라인은 실제로 소스 코드를 수행합니다 당신이 그 기능을 부를 때마다 이렇게하면 인라인과는 많이 다른 것입니다 C ++와 같은 다른 언어에서 익숙하다 Kotlin에서 인라인 함수를 호출하면 보장됩니다 – 그것은 힌트와 같지 않다 문자 적 요구 사항입니다

당신은 당신의 기능이 보장됩니다 인라인 함수의 본문 전화 사이트에서 제자리에 떨어 뜨리다 해당 인라인 함수를 호출 할 때마다 자, 이제 코드 랩을 끝내자 그래서 당신이 남긴 모든 조치 그리고 나는 모두에게 물어보고 싶었다

전에 3-5 분 정도 걸릴거야 이 파란색 탭의 피드백 양식을 여기에 작성하십시오 우리는 여러분이 코 틀린에 대해 어떻게 생각하는지 알고 싶습니다 우리가 앞으로 나아갈 것을보고 싶은 곳 그리고 Kotlin 사례 연구에 관심이 있다면, 가서 나하고 말해

나는 걸어 다닐거야 고맙습니다 [박수 갈채] [음악 재생]