How to Deal with Problems When Migrating from Kotlin Android Studio Project to AndroidX (2019)

좋습니다, 그래서 이것은 후속 비디오입니다 내 이전 비디오로 Android Studio 프로젝트를 Android X로 마이그레이션하십시오

이것은 코 틀린 스에게 특유한 것입니다 나는 몇몇 함정에 대해서 이야기 할 것이다 전환 할 때 발생할 수있는 문제 안드로이드 X에 Kotlin 안드로이드 스튜디오 프로젝트 먼저 첫 번째 비디오를 확인하십시오 내가 몇 가지 것들을 마이그레이션을 수행해야합니다

하지만 그걸 본 후에, 여기 와서 이걸 보렴 나머지 단계를 거치도록하겠습니다 희망을 갖고 Kotlin 프로젝트를 시작하도록 그것을 변환하고 나중에 Android X로 이전합니다 시작합시다 (낙관적 인 하우스 음악) 본 적이 없다면 이 시리즈의 이전 비디오 이걸보기 전에 할 수 있습니다

이 동영상에서 몇 가지 문제를 보여 드리겠습니다 Android X를 사용하도록 코드를 마이그레이션 할 때 발생할 수 있습니다 그러나, 나는 토론하지 않을 것이다 마이그레이션 프로세스 자체를 자세히 설명하고, 그것은 이전 비디오에 있습니다 이제 화면에 해당 동영상에 대한 링크가 있습니다

이 동영상에 대한 설명에도 나와 있습니다 그리고 계속해서 우리는 이주 할 Kotlin 프로젝트를 가지고 있습니다 그럼 언제 어떻게되는지 봅시다 Android X를 사용하도록 이전합니다 그래서 저는 리팩토링 메뉴에 올 것입니다

Android X로 이전을 선택하겠습니다 이걸 염두에두면 화면에 표시하고있다 Android Studio의 경우 실행중인 경우 Android Studio 33 이제 내가 할 일은 도구를 사용하여 백업 zip 파일을 만든 다음 더블 팩터를 클릭 할거야 위의 폴더에 그 파일을 넣을 것입니다

현재 프로젝트 그래서 아무 방법도 없다 이 프로젝트에 추가됩니다 나는 지금 내가 가진 것을 대체 할 것이다

그리고 실제로 사용법을 스캔하고 있음을 알 수 있습니다 무엇이 업데이트되어야하는지 리팩토링 프로세스를 수행합니다 나는 또한 마지막 비디오에서 언급했다 다음과 같은 대화 상자가 나타날 수 있습니다 변화가 감지되었음을 보여 주거나 말하기

이 대화를 듣는다면, 재방송 검색 버튼을 클릭하십시오 그래도 그 순간 이상하게 행동합니다 아마도 두 번째 리팩토링 검토 창, 미리보기 창 말하지만 리팩토링 버튼은 없습니다 그 경우에는 창을 클릭하고 리팩토링 버튼을, 원래의 창에서, 하지만 제 경우에는 그 중 아무 것도 나오지 않았습니다 알았어, 이제 리팩토링 도구를 클릭 할거야

그리고 끝내려면 시간이 걸릴거야 통과하고 알아 내기 때문에 무엇이 업데이트되어야하는지, 그리고 실제로 적절한 구성 요소를 다운로드하려고합니다 완료되면 우리는 실제로 바뀐 것을 확인하려고합니다 좋아, 이제 끝내자 그래서 제일 먼저 우리가 할거야, 우린 갈거야

모듈의 빌드 도트 그라디언트 파일을 확인하십시오 그래서 저는 Gradle 스크립트로갑니다 모듈 앱을 살펴보십시오 우리가 만든 gradle 파일 아래로 스크롤하여 살펴 본다면 여기에 꽤 오래된 버전이 있습니다

우리는이 모든 버전들이 이제 새로운 버전을 사용할 수있게되었습니다 기본적으로 Android X는 빠르게 변화하고 있습니다 그 순간에 우리는 각 라이브러리의 릴리스 버전 그때 나는 이것을 쏘고있다 전구 몇 개를 클릭하면됩니다 이 첫 번째 항목을 제외한 모든 항목이 실제로 변경됩니다

그리고 내가 이것을 처음으로하지 않을 이유는 이 버전 번호를 별도로 정의하기 때문에, Android Studio는이를 변경하는 옵션을 제공하지 않습니다 그러나 나는 다른 모든 것들을 모두 통과 할 수있다 그리고 지금 할거야 그래서 저는 이것들 각각을 선택할 것입니다 그리고 변화

그리고 분명히 이것을함으로써 프로젝트를 다시 동기화해야합니다 나는이 모든 것을 끝내고 다 할 것입니다 알았어 그래서 나는 그 모든 것을 바꾸었다 내가 언급했던 그 첫번째 입구 이외의

그리고 지금 다시 동기화해야합니다 또는 지금 동기화를 클릭하여 동기화 할 수 있습니다 그러면 프로젝트가 다시 동기화됩니다 끝나면 볼 수 있습니다 그것의 각종 파일을 지금 다운로드하는, 화면 하단의 상태 표시 줄에 완료되면 우리는 모양을 가지고 어떤 문제가 발생했는지 확인하십시오

그리고 일반적으로 당신이 이것을 할 때 그것은 좋은 것입니다 프로젝트의 모든 파일을 검토하는 아이디어, 문제를 확인하십시오 하지만 지금 내가 말할 두 가지 주요한 것들은, 이 작업이 아직 완료되면 현재 사용하지 않은 수입입니다 잘못된 재정의뿐만 아니라 이 작업을 마무리하고 우리는 다시 와서 그것을 통해 갈 것입니다 알았어, 이제는 그레고리를 볼 수있어

프로젝트 빌드, 빌드가 완료되었습니다 방금 경고를 받았습니다 우리가 떠날거야, 우리는 그걸 바꾸려하지 않을거야 우리가 원하는 경우 수동으로 입력 할 수 있습니다 사실, 내가 왜 그렇게하지 않겠습니까? 수명주기 버전을 검토하고 변경하십시오

210 대시 알파 21 대시 0 대시

알파 2 그냥 해보고 다시 동기화하겠습니다 그냥 우리는 다른 경고가 없다 우리의 빌드 gradle 파일 좋아, 이제 너에게 보여주고 싶어

소개 될 오류 중 그래서 첫 번째가 열릴거야 일부 Kotlin 코드 및이 프로젝트에서 첫 번째 것은 날짜 선택기 조각입니다 클래스에서 살펴 보겠습니다 그리고 우리가 여기에있는 오류를 살펴 본다면, 우리가 그 위에 마우스를 가져 가면 볼 수 있습니다 첨부는 아무것도 무시합니다

그리고 그 이유는 서명은 Android X 코드에서 변경되었습니다 그래서 여기 52 행에서 컨텍스트 매개 변수 이 nullable 컨텍스트를 선언하십시오 Java에는 null 허용되지 않는 유형이 없습니다 하지만 Google은 주석을 추가하고 있습니다 Kotlin이 알 수 있도록 Android 프레임 워크 코드 일부 기능은 null 인수로 불려 갔다

그리고 그것은 실제로 여기서 일어난 일입니다 그리고 컨트롤이나 명령으로 볼 수 있습니다 슈퍼 첨부 기능을 54 번 라인에서 클릭하십시오 그래서 그렇게 할거야 우리는 지금 소스 코드를보고 있습니다

그리고 310 행에서 볼 수 있습니다 컨텍스트 매개 변수가 표시됩니다 그 주석을 사용해 null가 아닌 경우, 그래서 그것을 고치는 것은 매우 쉽습니다 우리가 할 수있는 것은 돌아온 것뿐입니다 매개 변수 유형에서 물음표를 제거하십시오

사용 된 컨텍스트 인수 함수 내부 및 nullable 유형 마커, 내가 한 것처럼, 이제 우리에게 경고를 주었고 그것은 불필요한 것입니다 안전한 전화 교환 원, 여기 57 번 줄에 있습니다 Android X 라이브러리는 Google이 있기 때문에 Kotlin에서 사용 이러한 null이 아닌 주석을 추가합니다 안전 호출 연산자를 그렇게 많이 사용할 필요는 없습니다 지금 기능을 무시할 때

내가 할 일은 그 안전한 전화를 지우는 것이다 우리는 다음 문제가 무엇인지 알게 될 것입니다 이제 우리는 중복 된 것을 볼 수 있습니다 to 문자열을 호출하십시오 내가 보여줄 수있는 예제가 필요했다

Android X가 코드를 변경하는 방식 하지만 그 라인은 현재 일을 마쳤고 따라서 to 문자열 함수 호출을 삭제할 수 있습니다 그래서 나는 그것을 할거야, 난 그냥 갈거야 달러 문맥에서 벗어나이 코드의 나머지 부분을 삭제하십시오 권리 좋아, 그 수업을 고쳤어

내가 바라는 다음 일은 커서 리사이클 뷰 어댑터 클래스 이제 가져 오기 섹션에서 찾을 수 있습니다 사용하지 않은 가져 오기가 실제로 표시됩니다 내 경우에는 그다지 올랐지 만 그것은 당신을 위해 올지도 모릅니다 그러나 문제는 완전한 자격으로 인해서 온다

마이그레이션 프로세스가 실제로 채택한 이름 예를 들어 17 행에서 볼 수 있습니다 안드로이드 X dot recycler보기 도트 위젯 이것은 리사이틀 뷰의 정규화 된 이름입니다 그래서 나는 그것을 제거 할 것입니다 그리고 수입을 받아 들일 것입니다

알았어 그래서 내가 실제로 고쳤다 다시 돌아가서 그 코드를 그대로 되돌려 놓을 것입니다 이제 다시 이것은 특히 나쁜 문제는 아니었다 하지만 사용하지 않은 가져 오기가 표시되는 경우 아마 당신이 고치기를 원할지도 모르는 사소한 성가심, 내 경우에는 실제로는 그렇지 않지만 거기에서 보았 듯이 완전한 경로 이름을 사용하십시오

그래서 우리가 해낸 것은 우리가했습니다 그 정규화 된 이름을 제거했습니다 Android X를 검색 할 것입니다 그리고 나는 다른 것들도 제거 할 것입니다 41 번 줄에 하나 더 있습니다

보시다시피 나는 그것을 제거 할 것입니다 나는 기본적으로 수색을 할 것이다 이제 그게 전부입니다 알았어 그래서 나는 그 두 가지를 바로 잡았다

이제 다른 예제를 살펴보면, 우리는 우리 프로젝트로 돌아갈 것이다 우리의 기간 보고서를보십시오 이제 당신은 아마도 거기에서 잠깐 보았을 것입니다 사용되지 않은 수입이있었습니다 실제로 나타나지 않는 이유는 내 취향에 있기 때문에

일반적으로 자동 가져 오기입니다 즉시 최적화 된 가져 오기가 있습니다 따라서 실제로 사용되지 않는 수입품은 숨어 있습니다

하지만 기본적으로 여전히 같은 것을 사용하고 있습니다 또는 그것은 그 정규화 된 이름과 동일한 이슈입니다 그리고 나는 그것을 사용하지 않는 것이 더 좋다고 생각한다 그 정규화 된 이름 우리가 할 수있는 일은 Android X를 검색하면됩니다

거기에 또 하나가 있다는 것을 알 수 있습니다 우리는 이것을 리니어 매니저로 대체 할 수 있습니다 나는 지금 모든 것을 통과하지는 않을 것이다 좋아, 다른 것도있어 기본적으로 더 많이 같습니다

그래서 나는 그 이상을 고치지 않을 것입니다 하지만 몇 가지 다른 문제가 있습니다 그 앱이 현재 실행되는 것을 막을 것입니다 첫 번째 관심을 끌고 싶습니다 주요 활동 클래스입니다

여기에 오류가 있습니다 기본적으로 우리는 번들을 변경해야합니다 물음표를 null이 아닌 유형 번들에 추가 그래서 우리는 단지 물음표를 제거 할 것입니다 그리고 그 오류를 수정합니다 그리고 주요 활동 단편

같은 문제가 있습니다 기본적으로 이전에 본 컨텍스트와 함께, nullable이 아닌 유형을 다시 제거 할 것입니다 중복 문자열 호출을 수정하려고합니다

좋아, 그거 좋은데 따라서 이러한 문제를 볼 수 있습니다 찾기 쉽고 수정하기 쉽습니다 그리고 앱을 실행하기 전에 앱이 여전히 작동하는지 확인하기 전에 나는 경고로 끝낼거야 우리는 정규 자격을 변경했습니다

클래스 이름을 단순화합니다 그리고 꽤 많이 있습니다 다른 클래스의 일부에서는 논쟁의 여지가있는 단편 활동 확장 그 (것)들의 짐을 가지고있다, 그리고 그것은 분명히 위로 정리되는 것으로 할 수 있습니다 프로젝트를 진행할 때 쉽게 할 수 있습니다 이 이름을 자동으로 단순화하는 습관을 가지며, 하지만 한 가지만하면 안됩니다

레이아웃 리소스 파일에서 그래서 우리는 나의 작업 레이아웃 파일 중 하나를 열 것입니다, 리소스 레이아웃 폴더에 있습니다 그리고 이름은 우리의 임무가 기간을 강조한다는 것입니다 이제 그걸 열어 봐 그리고 내가 텍스트보기인지 확인하십시오

나는 우리 다 그리고 우리는 단지 전체 화면으로 갈 것이다 먼저 제약 레이아웃이 완전 자격을 얻었습니다 Android X 도트 제약 레이아웃 레이아웃 도트 위젯에서 가져옵니다 레이아웃을 제약하는 것을 시도하거나 단순화하지 마십시오

아니면 앱을 망칠거야 그리고이 파일의 마지막 위젯 if 우리는 아래쪽으로 스크롤 리사이클 러 뷰는 정규화 된 것입니다

당신이 볼 수 있듯이, 다시 한번 그것을 내버려 둡니다 삭제할 참조를 변경하면 패키지 이름, 앱이 다운됩니다 레이아웃을 팽창 시키려고 할 때 알았어 그걸로 끝내자

그리고 앱이 제대로 작동하는지 확인해 봅시다 그리고 실제로 우리는 하나를 볼 수 있습니다 내가 고칠 필요가있는 다른 것, 아무 것도하지 않는 on attach override 그래서 나는 그것을 두 번 클릭 할 것이다 우리가 이전에 보았던 것과 같은 거기의 거래, null 허용되지 않는 유형을 없애고, 그로 인해 문제가 해결됩니다

그리고 우리는 그것을 다시 시도 할 것입니다 좋아, 우리는 그 다른 경고들을 무시할 것이다 지금은 화면 하단에 그러나 당신은이 시점에서 볼 수 있습니다 메인 화면이로드되고, 눈 모양 아이콘, 도구 모음 또는 도구 모음에서 탭하면, 보고서 화면을 볼 수 있습니다 이제 앱에 데이터가 없으므로 보고서가 비어 있습니다

하지만 우리는 적어도 그것이로드되고 있음을 알고 있습니다 메인 화면으로 돌아갈 수 있습니다 그리고 나는 또한 about 대화를 클릭 할 수 있습니다 확장 메뉴에서 그래서 잘 작동합니다

이제 분명히이 앱을 넣어야합니다 완전한 테스트 사이클을 통해, 앱에서 사용하는 라이브러리 변경 주요 변경 사항이며 테스트해야합니다 이후 앱을 철저히 우리는 분명히이 비디오에서 그렇게하지 않았습니다 좋아, 그게 프로젝트 야 마이그레이션 및 철저한 테스트 준비 및 미래 발달

알았어, 지켜봐 줘서 고마워, 질문이 있으면 의견을 남기십시오 네가 다음에 준비가 되었다면 프로그래밍 관련 비디오, 클릭 왼쪽 상단 모서리에있는 여기 링크 비 코딩을 보는 화면 프로그래밍 관련 질문, 왼쪽 하단에있는 링크를 클릭하십시오 화면을 자유롭게 구독 할 수 있습니다 여기에있는 링크를 클릭하면 다른 비디오에서 보자

Connect to SQL Server from Windows, MacOS, iOS, and Android using UniDAC

Windows, MacOS, iOS 및 Android 용 SQL Server에 대한 플랫폼 간 데이터베이스 응용 프로그램을 만드는 데모를 고려할 것입니다 이제 SQL Server를위한 교차 플랫폼 데이터베이스 응용 프로그램을 만들겠습니다

폼에 UniConnection 및 SQL Server 데이터 공급자 삭제 UniConnection에서 데이터 공급자 이름을 선택하십시오 서버, 데이터베이스, 사용자 이름 및 암호를 지정하십시오 이제 SQL Server에 대한 연결을 열 수 있습니다 쿼리의 경우 폼에 UniQuery 구성 요소를 놓고 두 번 클릭하고 SQL 쿼리를 입력합니다 이제 폼에 BindSourceDB 구성 요소를 놓고 UniQuery에 연결할 수 있습니다

그런 다음 컨트롤을 추가 할 수 있습니다 : 네비게이터, TEdit, TMemo 및 TImage 라이브 바인딩을 사용하여 추가 된 컨트롤을 UniQuery와 링크하십시오 Windows 대상 플랫폼에 대한 우리의 응용 프로그램을 실행하고 모든 것이 잘 작동하는지 확인하십시오 이제 MacOS 대상 플랫폼을 선택하고 응용 프로그램을 실행하십시오 알 수 있듯이, 우리의 응용 프로그램은 성공적으로 실행되었으며 MacOS의 MS SQL Server에 연결되었습니다

iOS에서 애플리케이션을 실행 해 봅시다 응용 프로그램은 iOS 장치에서도 성공적으로 실행됩니다 마지막으로 애플리케이션을 Android 기기에서 실행할 수 있는지 알아 보겠습니다 우리가 볼 수 있듯이, 우리의 응용 프로그램은 실행되고 가능한 모든 대상 플랫폼에서 연결을 설정합니다 SQL Server 용으로 크로스 플랫폼 데이터베이스 응용 프로그램을 만드는 것이 얼마나 쉬운 지 알 수 있습니다

데이터 액세스 구성 요소를 사용하여, 다른 많은 데이터베이스와 동일한 방식으로 자신 만의 크로스 플랫폼 데이터베이스 응용 프로그램을 만들 수 있습니다 관심을 가져 주셔서 감사합니다 자세한 정보는 당사 웹 사이트를 방문하십시오

Getting the Most from the New Multi-Camera API (Android Dev Summit ’18)

안녕하세요, 모두들 새로운 멀티 카메라 API 세션에 오신 것을 환영합니다

내 이름은 Vinit Modi이고 저는 제품 관리자입니다 카메라 플랫폼에 이 잠시 후, 샌드 박스 영역 바깥으로 나 오세요 더 궁금한 점이 있으시면 새로운 API에 대해 이야기하기 전에, 카메라의 상태를 빠르게 업데이트하겠습니다 역사적으로 대부분의 카메라 앱은 기본 카메라 앱에 초점을 맞 춥니 다

장치와 함께 제공됩니다 그러나 금액의 두 배가 넘는 것으로 나타났습니다 카메라 사용량은 사용자가 구축 한 앱에서 발생합니다 그리고 당신이 새로운 기능을 지원합니다 새로운 Android API에서 사용할 수 있습니다

우리가 많은 개발자들과 이야기 할 때 우리가 찾은 것 가장 큰 문제는 카메라 2 API의 상태입니다 그리고 우리는 앞으로 나아갈 것입니다 우리는 열심히 노력해 왔습니다 Android P부터 시작하여 찾을 수있는 항목 거의 모든 새 장치가 camera2 및 HALv3을 지원합니다 이것이 의미하는 바는 카메라의 특성을 볼 때, 기기가 자체 광고를하는 것을 알게 될 것입니다

어느 한 점과 비슷한 camera2 LIMITED 촬영하고 카메라 2를 FULL로 설정하면 프레임 단위 제어와 같은 고급 기능, YUV 재 처리 및 RAW를 가능하게하는 LEVEL_3이 있습니다 또한 여러 OEM 업체와 협력 해 왔으며, 또는 제조업체가 출시 될 때 새로운 API를 열 수 있습니다 올해 Google Pixel 3 및 화웨이 메이트 20 시리즈 지원 새로운 멀티 카메라 API 자, 왜 물러서서 이유를 말해 줄까? 이 새로운 API는 매우 중요합니다 Android P 이전에는 개발자로서 물리적 센서 중 하나에 액세스 할 수 있습니다 네이티브 카메라 앱이 전체 하드웨어에 액세스합니다

능력 하지만 P로 시작하면 동일한 액세스 권한을 얻게됩니다 네이티브 카메라 앱으로 여기에는 모든 물리적 센서가 포함됩니다 논리적 인 카메라 더하기

논리적 인 카메라는 추상화입니다 당신이 쉽게 잡을 수있는 모든 물리적 센서들 하드웨어의 이점 몇 가지 새로운 사용 사례와 가능성이 있습니다 새로운 멀티 카메라 API로 오늘날 오스카 (Oscar)는 광학 줌 (optical zoom) 에밀리가 보케를 덮을거야 고맙습니다

오스카가 다음입니다 [박수 갈채] OSCAR WAHLTINEZ : 안녕하세요, 제 이름은 오스카입니다 저는 개발자 관계 팀에서 일하고 있습니다 라이브 데모에서 시작하겠습니다 무엇이 잘못 될 수 있습니까? [웃음] 그래서 여기에 메이트 20 전화가 있습니다

멀티 카메라 줌을 구현 중입니다 여기에서 우리가하고있는 일은 UI 레이어를 바꾸는 것입니다 두 카메라 스트림 나는 어떤 종류의 세부 확대 또는 자르기를하고 있지 않다 나는 단순히 시내를 교환하고있다

보시다시피, 거의 순간적입니다 내가 쓰러 뜨리면 찢어지지 않아 카메라 세션 그것은 단지 하나의 세션이고, 저는 두 대의 카메라를 교체하고 있습니다 스트림

아이디어는, 내가 말했듯이, 단일 카메라 세션입니다 – 두 개의 스트림 그리고 우리는 시내 사이에서 교환 할 것입니다, 이것이 어떻게 구축되었는지 보여 드리겠습니다 하지만 핵심 구성 요소는 동일한 코드를 사용한다는 것입니다 두 장치에서 실행 중입니다 많은 카메라 개발자들이 알고 있듯이, 그것은 아주 위업입니다 같은 다른 장치에서 동일한 코드를 실행하려면 특히 하드웨어에 묶여있는 것 그것이 멀티 카메라이기 때문에

먼저, 다중 카메라를 사용하는 방법에 대해 이야기 해 봅시다 동시에 스트림 프레임 워크가 제공하는 기본 보증 멀티 카메라 API에서 최소한 두 개의 실제 카메라를 사용할 수 있습니다 동시에 스트림 보증 된 스트림 구성을 생각해 내십시오

단일 카메라 장치 용 하드웨어 수준, 대상을 기반으로하는 일련의 규칙입니다 유형 및 대상 크기 멀티 카메라 API를 올바르게 사용한다면, 우리는이 규칙에 대한 예외를 얻을 수 있습니다 이것을 예제로 설명해 보겠습니다 YouTube에는 최대 크기의 단일 YUV 스트림이 있습니다

이전 표와 같이 하드웨어가 제한적인 장치 레벨은 단일 스트림을 사용할 수 있습니다 그 구성으로 멀티 카메라 API를 사용하면 실제로 동일한 구성의 두 스트림을 사용할 수 있습니다 기본 물리적 카메라에서 우리가해야 할 일을 따라 가자

이전에 데모 한 앱을 구현할 수 있습니다 우리는 5 단계로 나누었습니다 준비 되었나요? 1 단계 – 실제 카메라를 찾으십시오 물리적 카메라 쌍을 식별하여 시작합니다 동시에 열 수 있습니다

피사체로 카메라 문자를 사용하여, 우리는 [? 요청 기능] 논리적 인 멀티 카메라가 그들 중 하나라면, 우리는이 장치가 논리적 인 카메라라는 것을 압니다 논리적 인 카메라를 발견 했으므로 저장합니다 우리는 나중에 ID를 필요로 할 것입니다 그리고 우리는 그것과 관련된 물리적 인 카메라를 얻습니다 그런 다음 다음 단계로 넘어갈 수 있습니다

여기에 방금 설명한 내용을 시각화했습니다 우리는 논리적 인 카메라 ID를 가지고, 우리는 실제 카메라 ID를 가져오고 이제는 연관된 실제 카메라 검색 논리 카메라 그룹과 다음 단계로 논리 카메라를 엽니 다 두 번째 단계는 새로운 것이 아닙니다 우리는 카메라를 엽니 다

이전에 저장 한 논리적 카메라 ID를 상기하십시오 이것이 우리가 카메라 관리자에게 전달하는 유일한 방법입니다 다시 말하면 논리적 인 카메라 만 엽니 다 장치가 준비되면 단계 콜백이 트리거됩니다 논리적 인 카메라를 열었습니다

다음 단계에서는 출력 구성을 만듭니다 업데이트 카메라 세션을 만드는 데 사용됩니다 원하는 출력 목표마다 이전에 찾은 목록의 실제 카메라 ID가있을 수 있습니다 특정 하드웨어에서 프레임을 검색하려는 경우 카메라

자세한 내용을 살펴 보겠습니다 우리는 다음을 사용하여 출력 설정 객체를 생성합니다 우리가 원하는 출력 목표 그리고 만약 우리가 그 결과를 특정 실제 카메라를 사용하면 설정된 실제 카메라 ID API에서 ID를 전달하십시오 논리적 인 카메라를 사용하고 싶다면, 이 단계를 건너 뛸 수 있습니다

우리는 둘 다 조합 할 수도 있습니다 하루가 끝나면 목록이 있습니다 출력 구성 중 일부는 물리적 카메라와 관련이있을 수 있습니다 그 중 일부는 – 논리적 인 카메라 목표는 모든 구성을 넣는 것입니다

단일 세션 구성으로 방금 설명한대로 각 출력 구성 관련 출력 목표 및 선택적으로, 실제 카메라 ID 이제 캡처 세션을 만듭니다 새 세션을 사용하여 캡처 세션을 만드는 방법 구성 개체? 우리는 출력 구성 목록으로 시작합니다 우리가 방금 만든거야 이를 통해 세션 구성을 인스턴스화하고, 여기에는 캡처 세션 콜백이 포함됩니다 콜백에서 인스턴스를 가져옵니다

카메라 세션 만들기 우리는 그 세션 설정 객체 우리가 2 번에서 얻은 카메라 장치 논리적 인 카메라를 열었을 때 요청이있는 프레임을 보냅니다 원하는 구성으로 새 세션을 만듭니다 세션 구성 객체에서 제공되는 콜백 지금 방아쇠를 당길 것이다

그리고 나서 우리는 우리 카메라 세션을 사용할 준비가 될 것입니다 마지막 단계 요청을 캡처합니다 그런 일이 발생하면 프레임을 가져올 수 있습니다 카메라의 예를 들어 두 프레임에서 프레임을 캡처하려면 실제 카메라를 동시에 사용하면 우리가 전에 만든 세션을 가져 가라

한 쌍의 출력 대상 이 특별한 경우, 각 타겟 특정 카메라 ID와 연결됩니다 우리는 일반적으로 캡처 요청을 생성합니다 이 경우 템플릿 미리보기를 사용하십시오 우리는 평상시와 마찬가지로 출력 목표를 그것에 첨부합니다 이제 캡처 요청을 전달합니다

여기 다른 것은 없습니다 이 경우를 제외하고, 출력면 각각에서 이미지 데이터를 수신합니다 관련 실제 카메라의 캡처 요청 콜백은 한 번만 트리거됩니다 다시 한번, 캡처 요청과 같습니다 가장 큰 차이점은 완료 콜백 대신에 두 개의 시작 노출 타임 스탬프를 돌려 줄 것입니다

일반 캡처 요청에서 단 하나의 값만 가져옵니다 요점을 되짚어 보겠습니다 우리의 광학 줌 데모 우리는 물리적 카메라를 발견했습니다 우리는 그 그룹의 일부인 논리적 인 카메라를 열었습니다

출력 구성을 만들었습니다 우리 [? 인쇄?] 목록 캡처 세션을 만듭니다 그런 다음 캡처 요청을 보내 게됩니다 내가 만지고 싶었던 또 하나의 주제는 렌즈 왜곡이다

렌즈 왜곡의 고전적인 예는 어안 렌즈입니다 이것은 실제 사례가 아닙니다 설명의 목적으로 만 여기에 있습니다 모든 렌즈에는 약간의 왜곡이 있습니다 논리 카메라의 경우, 왜곡이 있다고 가정 할 수 있습니다

최소가 될 것입니다 대부분의 경우 드라이버에 의해 수정됩니다 그러나 실제 카메라의 경우 왜곡 꽤 중요 할 수 있습니다 실제 렌즈 왜곡이 설명됩니다 방사형 및 접선 계수 집합 계수는 렌즈 왜곡을 사용하여 쿼리 할 수 ​​있습니다

카메라 특성 키 관심이 있으시면 문서에 더 많은 세부 정보가 있습니다 좋은 소식은 왜곡을 수정하는 방법이 있다는 것입니다 수학을하지 않고 간단히 왜곡 보정 모드를 설정할 수 있습니다

캡처 요청에 OFF는 왜곡이 가해지지 않았 음을 의미합니다 우리가 원한다면 이것을 사용해야 할 수도 있습니다 [INAUDIBLE] 동기화와 같은 작업을 수행 할 수 있습니다 Emilie는 나중에 그것에 대해서 이야기 할 것입니다

FAST는 최선의 교정이 가능하다는 것을 의미합니다 광고 된 프레임 속도를 충족시키면서 적용됩니다 FAST 보정이 불가능할 경우, 이것은 OFF와 같을 수 있습니다 고화질은 왜곡을 의미합니다 렌즈가 허용하는만큼 수정 될 것이며 잠재적으로 프레임 속도의 비용으로

수정 모드를 지정하지 않은 경우, 그것은 FAST 또는 HIGH QUALITY 중 하나입니다 구현 세부 사항에 달려 있습니다 기본값입니다 당신은 개발자로서, 귀하의 캡처에 어느 것이 적용되었는지 확인하려면 쿼리 할 수 ​​있습니다 의뢰

시연하는 코드 스 니펫을 보자 이 렌즈 왜곡이 어떻게 고품질로 설정되었는지 우리가 정지 이미지 캡처를 원할 것입니다 우리가 이미 카메라 세션을 시작했다고 가정하면, 캡처 요청 빌더를 인스턴스화합니다 원하는 템플릿을 사용합니다이 경우, 내가 말했듯이, 이미지 캡처

그런 다음 카메라 특성을 사용합니다 고 품질 왜곡 보정을 결정하는 방법 모드를 사용할 수 있습니다 이제 우리는 우리가 높은 품질을 가지고 있음을 알게되었습니다 왜곡에 대한 수정, 우리는 캡처 요청에 그것을 설정, 그리고 우리는 항상 우리가하는 일을합니다 – 포획 요청을 파견하십시오 샘플 코드 및 기술 세부 사항은, 우리의 블로그 게시물을보십시오

우리는 이것과 그 이상을 다뤘습니다 우리는 이번 주 초에 그것을 출판했습니다 그리고 지금, 나는 Emilie에게 그것을 넘겨 줄 것이다 [박수 갈채] 고마워, 오스카 제 이름은 Emilie Roberts입니다

저는 파트너 개발자 옹호자입니다 멋진 데모를 보여 드리겠습니다 이 다중 카메라 API 중 일부를 사용합니다 픽셀 3에 보케 효과를 적용합니다 그래서 우리는 실제로 3 개의 – 잘, 2 개의 데모를 가지고 있습니다

25 데모 첫 번째는 하나의 캠 데모입니다 멀티 카메라가 전혀 없습니다 그러나 나는 그 메커니즘을 보여주기를 원했다

보케 효과를 만들기위한 것입니다 그런 다음 듀얼 캠 데모에 들어가면 정확히 볼 수 있습니다 – 멀티 카메라 측면에 집중할 수 있습니다 보케 효과 자체에 대해 그렇게 걱정하지 않아도됩니다 그리고 곧 출판 될 예정입니다 오픈 소스

너무 많은 코드를 낙서하는 것에 대해 걱정하지 마십시오 그럼이 전화에 갈 수 있을까요? 데모 실례합니다 오키 그래서 우리는 – 나는 이것을 올바르게 설정하지 않았다

좋아, 싱글 캠 보케 효과를 보자 셀카를 여기로 데려가 그리고 당신이 화면에서 볼 수 있다고 생각합니다 그것은 내 얼굴을 찾는 것입니다 그것은 그것을 절단하고 있습니다

최종 결과를 높이 보자 그리고 그것은 거기에 인물 사진 모드를 붙이는 것 이것은 거친 인물 사진 모드의 일종입니다 그리고 이것에 대한 최적화가 있습니다 그게 어떻게되는지 보자

여기서 출력 단계를 보여 드리겠습니다 그래서 전경을 찾는 더 나은 일을하려고합니다 이봐, 그렇게 나쁘지 않았어 전경 이미지, 배경, 그것은 단색이고 조금 흐려져 있습니다 어서, 애플 리케이션

우리를 실망시키지 마라 최종 결과에 붙여 넣기 한 대의 캠에 비해 그렇게 나쁘지 않습니다 듀얼 캠 데모를 사용해 봅시다 그리고이 무대 조명으로 저는 확신하지 못합니다

어서 이봐, 나쁘지 않아 우린 잘하고있어 따라서 왼쪽 하단에 깊이 맵이 생성 된 것을 볼 수 있습니다 전경에서 나를 감지하고있는 코너 너희 모두의 나머지는 조금 쭈그러 들었다

가까운 사람들이 회색임을 알 수 있습니다 그리고 나서 검은 색이 바로 뒤로갑니다 또한 혼란을 야기하는 빛을 볼 수 있습니다 마지막 결과를 보여 드리겠습니다 분명히 일어날 수있는 몇 가지 최적화가 있습니다

하지만 꽤 잘 작동합니다 다시 한번, 이는 Pixel 2에서 두 개의 전면 카메라를 사용하고 있습니다 한 번에 두 개의 스트림을 볼 수 있습니다 죄송합니다 이 연결이 다시 연결됩니까? 아니

어쨌든, 한 번에 두 스트림 광각 렌즈 및 법선 렌즈 같은 시간에 슬라이드로 돌아갈 수 있을까요? 그럼 우리가 어떻게하는지 이야기 해 봅시다 오, 우리가있다 어쨌든, 그래서 우리는 정상적인 카메라를 가졌습니다

광각 렌즈는 동시에 작동합니다 다시 말하지만, 우리는 이것을 아마도 GitHub에 게시 할 것입니다 오픈 소스이므로 소스 코드를 파헤쳐 최적화 할 수 있습니다 더 나아지게하십시오 첫 번째 경우는 단일 캠입니다

빨리 살펴 봅시다 떠 다니는 머리 보케 효과 나는 그것을 부릅니다 우리는 얼굴 탐지 장치로 사진을 찍을 것입니다 우리는 두 장을 만들 것입니다 그래서 배경, 전경이 있습니다

환상적인 배경 효과를 내기 그 플로팅 헤드를 속한 곳에 붙여 넣으십시오 Face2는 Camera2 API에 내장되어 있습니다 코드를 구현하는 것은 매우 쉽습니다 우리가하고 싶은 일은 카메라를 점검하는 것입니다 카메라 장치가 지원하는지 확인하기위한 특성 FaceDetect

그럴 경우 원하는 모드를 찾으십시오 떨어져 있고, 그 다음 간단하고, 가득하다, 카메라 장치에 따라 다릅니다 그런 다음 카메라 캡처 요청을 할 때, 우리는 요청에 그 것을 포함시킵니다 우리가 결과를 얻을 때, 당신은 모드가 설정된 경우 얼굴을 찾았습니까? 이 예에서는 검색 만합니다 그것이 찾은 첫 번째 얼굴은 제가 사용했던 얼굴입니다

우리는 이것을 확장하여 여러면을 가질 수 있다고 상상할 수 있습니다 그냥 메모 – FaceDetect 정말 얼굴을 잡아 그래서 나는 그 경계들을 조금씩 부딪쳤다 그래서 머리가 잘려나 간다 그것은 나쁘게 들린다

배경에 붙여 넣기되는 머리 재미있는 배경 효과에 대해 이야기 해 봅시다 그래서 여기서 원하는 것을 할 수 있습니다 나는 몇 가지 일을했다 먼저 RenderScript를 사용하여 배경에 흐리게했다

멀티 카메라 이야기이기 때문에, 일부 카메라에는 수동 줌이 있습니다 다중 캠으로 작업한다면, 당신은 다른 카메라로 배경을 할 수 있습니다 초점을 벗어나는 방식으로 확대 / 축소 할 수 있습니다 따라서 실제로 광학 흐림을 할 수 있습니다 멋지다

그리고 또한 멋지다 소프트웨어 단계를 저장하십시오 이 데모에서는 사용자 정의 소프트웨어 세피아 효과도 수행했습니다 RenderScript를 사용합니다 하지만 멀티캠을 다시 사용한다면 많은 카메라가 필요합니다

단색이나 세피아 같은 효과를 내장하고있다 캡처 요청에 쿼리하고 포함 할 수 있습니다 게다가 이전에 RenderScript를 사용하지 않았다면, 이런 식으로 보입니다 흐림 효과 때문에 우리는 가장 신경을 쓴다

중간 선 3 개 정도 그리고 내장 스크립트, 본질적인 흐림입니다 그것은 꽤 편리합니다 기본적으로 상자에서 작동합니다 이 경우 상자 외부에서 흐려집니다

상자가 흐릿하지 않기 때문에 세피아 효과를위한 사용자 지정 RenderScript 스크립트입니다 처음 세 줄에서 볼 수 있습니다 기본적으로 우리는 입력 빨강, 녹색, 및 파란 채널, 색깔을 음소거하는 종류, 그들을 조금 노랗게 만들고, 그들을 보내는 출력 채널에 연결합니다 오키

그래서 우리는 배경을 가지고 있습니다 이 멋진 보케 효과가 있습니다 포 그라운드로 무엇을할까요? FaceDetect에서 우리는 얼굴을 잘라 냈습니다 그리고 우리는 PorterDuff를 선형 그래디언트로 적용합니다 가장자리를 약간 부드럽게 만드십시오

그래서 우리가 그것을 붙여 넣을 때, 그것은 그 거친 라인이 아닙니다 그리고 타다 붙여 넣기하면 상황이 꽤 좋아 보입니다 몇 가지 최적화가 있습니다 하나는 GrabCut 알고리즘을 사용하여 본 것입니다

이것은 OpenCV, Open Computer Vision 라이브러리에 내장되어 있습니다 우리는 깊이 맵 데모를 위해 나중에 사용하고 있습니다 기본적으로 나는 얼굴을 발견했다 그리고 조금 더 큰 사각형을 선택했습니다 시체가 어디 있는지 추측하려고합니다

그리고 나서 그랩 컷이 최선을 다합니다 좋아하는 사진 편집기의 Magic Wand 도구처럼 – 전경을 실제 전경으로 축소시키는 것 범위 앞에서 언급했듯이 여러 얼굴을 추가 할 수도 있습니다 이제, 당신이 모두 기다리고있는 순간 깊이지도가있는 듀얼 캠 보케에 대해 이야기 해 봅시다

우리는 카메라에 동시에 사용할 것입니다 그리고 우리는 깊이를 만들 것입니다 지도, 어려운 부분입니다 나는 그것을 굵게 강조했다 그런 다음 동일한 메커니즘을 사용합니다

우리는 이미 이야기했다 오키 이게 어떻게 작동합니까? 우선, 이중 캡처 그래서, 왼쪽에, 나는 애완 동물과 어울리고있다 집에서

왼쪽은 Pixel 3 전면 카메라의 일반 카메라입니다 그리고 오른쪽은 광각 촬영입니다 그것을하기 위해서, 오스카가 걸었던 것처럼, 여러 출력 구성을 설정했습니다 그래서 각 렌즈에 대해 우리는 여기, 우리는 이전의 표면뿐만 아니라 이미지를 가지고있다 정상 렌즈 용 판독기

우리는 정상적인 렌즈에 설정된 실제 카메라 ID를 사용합니다 그리고 우리는 광각 렌즈에 대해서도 똑같은 작업을합니다 따라서 우리는 4 가지 출력 설정으로 끝납니다 우리의 구성에 투입 그때부터 – 또는 거기에서, 그것은 단지 캡처를위한 출력 목표를 선택해야합니다

이 경우, 우리는 그 사진들을 원한다 그래서 우리는 그들을 조작 할 수 있습니다 그래서 우리는 정상적인 렌즈에서 이미지 리더를 원한다고 말합니다 및 광각 렌즈를 포함한다 좋아, 그래서 우리는 우리의 이미지를 가지고있다

이제 수학과 마법을 다해야합니다 그 bokeh 효과가 일어나게하십시오 나는 스테레오 비전에 대해 간략히 소개하고자한다 우리가 모든 코드에 들어가기 전에 하지만 나는이 슬라이드를 보면서, 이 슬라이드를 작업하면서 조금 지루해졌습니다

나는 기하학을 좋아하지만, 그것은 많은 편지입니다 P는 어쨌든 무엇을 의미합니까? 분명히, 그것은 초콜릿 더미입니다 P는 초콜릿 더미를 나타냅니다 그리고 이것이 우리가 집중하게 될 것입니다 이 데모의 나머지 부분에 관해서

그리고 카메라 하나는 조금 지루한 카메라입니다 여기 S는 상어로 바꿀 것입니다 내 친구, Pepper the Shark입니다 그리고 H는 하마입니다 그래서 이들은 우리의 도우미입니다

우리가 스테레오 비전에 관해 이야기하는 것을 도울 것입니다 왼쪽 카메라, 보통 렌즈는 상어 후추입니다 광각 렌즈는 소파 하마 인 Susie Loo입니다 그리고 그들은 그 두꺼운 초콜릿 뭉치에 두 가지 모두 들어가고 있습니다 그리고 이미, 그것은 훨씬 더 재미 있습니다

나는 당신이 동의하기를 바랍니다 그래서 그곳에는 왜곡 된 직사각형들이 있습니다 그것은 2D 표면입니다 그것은 카메라가 포착 할 이미지와 같습니다 즉, 2D 표현 우리가 가진 실제 살아있는 3D 물체의 어떻게 생겼는지 살펴 보겠습니다

상어의 시선이 바로 거기에 있습니다 아몬드, 바다 소금, 다크 초콜릿, 하마 캠은 라스베리 크런치에 집중합니다 그래서 그들은 같은 3D 객체를보고 있습니다 그러나 그들은이 2D 표현을 가지고 있습니다 우리가 정말로하고 싶은 것은 별도의 견해를 취하는 것입니다

그들을 결합 할 수 있으니 조금만 더 그 2D보기보다 더 많은 정보 훌륭한 깊이 맵을 만들 수 있어야합니다 그래서 우리는 다시 정상적인 시야, 넓은 시야각을 갖습니다 이 경우에는 둘 다 정상입니다 그러나 왼쪽, 오른쪽 오버레이 서로에게 당신은 그런 종류의 3D 눈금자 효과를 얻습니다 내가 희망하는 초등학교에서

당신은 어린 시절 즐겁게 지내야합니다 그리고 거기에서 우리는 깊이 맵을 만들 수 있습니다 당신이 굉장한 bokeh와 같은 정말로 시원한 물건을하는 것을 허락하는 효과뿐만 아니라 초콜릿이 얼마나 멀리 있는지 알 수 있습니다 그래서 분명히 손을 뻗어 잡을 수 있습니다 오키

그 두 대의 카메라, 두 장의 사진, 서로 다른 방향에있다 그리고 그들은 공간에서 분리되어 있습니다 그래서 우리는 서로를 꼭대기에 올려야합니다 이것이 우리가 카메라 외재라고 부르는 것입니다 두 카메라가 서로 어떻게 관련되어 있는지

그래서 우리는 각각의 이미지들을 회전시키고 번역 할 필요가 있습니다 그래서 그들은 서로의 위에 나타납니다 일반적으로 우리는 일반적으로 회전 및 평행 이동 매개 변수를 제공합니다 세계와 관련된 카메라 카메라 1 대 세계 대신, 우리는 상어와 세계와 하마가있다

그러나 우리가 스테레오 비전을 수행 할 때 우리가 실제로 Shark to Hippo는 걱정할 필요가 있습니다 그렇다면이 두 카메라는 어떻게 서로 관련이 있습니까? 좋은 엔지니어처럼, 내가 아는 전부는 나는 하마를 World to Hippo로 전환해야합니다 그리고 이제 저는 상어에서부터 세계에 이르기까지 하피에 이르는 통로가 있습니다 그게 수학에 대한 재미있는 소개 였으면 좋겠어 위키피디아에 대한 모든 것을 읽을 수 있습니다

이런 모습 회전 행렬을 얻으려면 카메라 2의 회전 행렬을 역으로 변환하려고합니다 카메라 1과 교차 곱합니다 그리고 번역을 위해, 그것은 이와 같은 것입니다 내부 제품을 가지고 빼십시오

Wikipedia 또는 다른 출처에서이 모든 것을 읽을 수 있습니다 그래서 내가 지적하고 싶은 것은 이 일을 직접하고 있다면 번역이 있습니다 일반 카메라의 픽셀 3에 대한 행렬 와이드 카메라 이것은 내가 꺼낸 것입니다 그것에 대해 무엇을 눈치 챘 을까요? 카메라들 사이의 9 밀리미터 간격 약 오른쪽에 보인다

전화를 보면, 좋은 점이 있다는 것을 알 수 있습니다 미국인은 뭐니? 좋은 어쨌든 좋은 9 밀리미터가 있습니다

그 카메라들 사이에 그건 완벽하게 이해가됩니다 하지만 내가 눈치 채지 못한 것은 약 1 주일의 시간을 들여야합니다 그것이 y 좌표에있는 것입니다 그래서 카메라는 서로 위에 있습니다

그래서 저는이 전화로 일하는 동안, 서로 옆에있는 두 대의 카메라를보고, 나는 그들이 분명히 그들이라고 생각했다 수평으로 옮겨졌다 중요한 점은, 깊이 맵 기능 내가 사용하고있는 것은 그들이 서로 옆에있을거야 수평 이동을 가정합니다 그래서 당신은 – 왜냐하면

오, 나는 중요한 부분을 말하지 않았어 카메라 센서는 종종 풍경, 그것은 의미가 있습니다 잘못했을 경우 깊이지도가 작동하지 않습니다

너는 머리카락을 꺼내 내가 한 것처럼 위대한 주를 보내 셨습니다 어쨌든, 만약 당신이 이것을 구현한다면 단지 메모 그래서 우리는 카메라 외재를 가지고 있습니다 우리가 서로의 위에 카메라로부터 그림을 얻는 방법, 서로 어떻게 관련되어 있는지

카메라 내장 함수는 카메라 자체의 속성입니다 그래서 우리는 일반 렌즈와 광각 렌즈를 가지고 있다는 것을 알고 있습니다 그리고 그들은 다른 속성을 가지고 있습니다 그래서 두 가지가 있습니다 하나는 카메라의 특성입니다

이것은 초점 길이, 주축, 그리고 그 축이 어떤 이유로 왜곡 된 경우 이것은 종종 3 행 3 행렬에 나타납니다 그리고 왜곡 – 광각 렌즈와 광각 렌즈 – 특히 가장자리 근처에서 약간의 왜곡이 생길 것입니다 우리가 매핑 할 때 고려해야 할 사항이 있습니다 두 이미지는 서로에게

또 다른 메모 – 그래서 우리는 내장 된 왜곡을 사용할 것입니다 이미지를 왜곡되지 않게하기위한 렌즈의 특성 그러나 오스카가 우리에게 말했듯이, 기본적으로, 카메라가 이미지를 왜곡시킵니다 그래서 우리는 그것을 찌그러 뜨릴 것입니다 reundistort, 그것은 우리가 실제로 그것을 왜곡 할 것이라는 것을 의미합니다, 그것은 나쁜 소식입니다

따라서 실제로 왜곡 보정을 해제해야합니다 당신이 깊이지도를 원한다면 카메라 요청으로 충분히 쉽습니다 왜곡 모드가 해제되어 있는지 확인합니다 오키

여기 네 가지가 있습니다 회전, 평행 이동, 카메라 특성 행렬, 및 렌즈 왜곡 이 속성들을 어떻게 얻습니까? 꽤 쉽습니다 너는 오후 내내, 바둑판 용지를 인쇄해라 이 방에서 전에 이걸 했니? 카메라 라

– 응? 재미 있겠지? 카메라 교정 두 카메라 모두에서 일련의 사진을 찍으십시오 당신은 많은 알고리즘을 실행합니다 이 네 가지 카메라 특성을 알아 냈습니다

그리고 그때부터 깊이지도를 만들기 시작할 수 있습니다 카메라에서 당신은 내 쾌활한 얼굴에서 말할 수 있습니다 실제로 그 재미가 아닙니다 하지 마

별로 좋지 않다 다행히 카메라 2 멀티 카메라 API에서, 우리는이 위대한 들판을 가지고 있습니다 회전, 평행 이동, 교정 및 왜곡 따라서 API를 바로 사용할 수 있습니다 네가 간다면 몇 마디 만 말해 줄께

자신을 구현합니다 그래서 카메라의 특성, 초점 거리, 액세스 정보는 다섯 개의 매개 변수로 제공됩니다 이것은 Android 설명서에 있습니다 그러나 3×3 행렬을 생성하려면, 당신은 단지 문서를 따라야 만합니다 번호를 플러그인하십시오

너를 버릴지도 모르는 또 다른 일 왜곡 계수는 다시 5 가지 값입니다 그러나 OpenCV 라이브러리는 다른 순서로 사용합니다 API에서 얻은 값보다 따라서 0, 1, 3, 4, 2가되는지 알아야합니다 희소식은 당신이 0, 1, 2, 3, 4 주문, 당신이 이미지를 왜곡하지 않을 때, 그들은 마치 소용돌이에 빠져있는 것처럼 보입니다

따라서 여러분은 이러한 계수에 잘못된 것이 있다는 것을 확신합니다 어쨌든, 일단 우리가 모든 매개 변수를 갖게되면, 우리는 우리 이미지를 준비하기 시작할 수 있습니다 깊이 맵 비교를 할 수 있습니다 이건 내 부엌에있는 나야 그리고 네가 거기에서 볼 수 있는지 모르겠다

하지만 천장을 보시면 거기에 어떤 종류의 커브가 있음을 주목하십시오 우리는 재미있는 집에 살지 않습니다 우리가 말하고있는 왜곡 효과입니다 왜곡 보정 기능이 해제 된 광각 렌즈를 사용하십시오 두 이미지를 비교할 때도 마찬가지입니다

직선들 – 우물과 곡선 선들 – 각 이미지에 줄을서야합니다 당신이 깊이지도를 만들 때 우리는 그것을 정류라고 부릅니다 그리고 우리는 카메라 특성을 사용합니다 그것은 구부러진 지붕을 보여주는 것입니다

이 모든 기능은 OpenCV 라이브러리에 있습니다 Open 컴퓨터 비전 라이브러리 첫 번째는 Stereo Rectify입니다 이것은 우리에게 일련의 매개 변수를 가져옵니다 이 계산을 수행하는 데 사용할 수 있습니다

그래서 우리는 – 죄송합니다 API에서 얻은 값, 카메라 매트릭스, 왜곡 계수, 회전 및 평행 이동 우리가 전에 계산 한 것 우리는 이러한 매개 변수를 제거하고, 우리는 변형되지 않은 수정 맵을 호출합니다 우리에게 말하는 방법을 알려주는지도를 만든다 이 두 개의 서로 다른 카메라에서 두 개의 이미지를 가져올 수 있습니다

그들을 서로에 매핑하십시오 그리고 Remap 기능은 바로 이것을합니다 그럼 그게 우리에게주는 것을 보자 여기 왼쪽에서 다시 정상적인 캠, 앞쪽 캠, Pixel 3의 광각 렌즈 및 Pixel 3의 광각 렌즈 당신은 그들이 꽤 잘 어울리는 것을 볼 수 있습니다

상어 줄이 줄 지어 있습니다 작물에 대한 권리입니다 넓은 각도에는 더 많은 수확 지역이 있습니다 그게 전부 줄 지어있다 지붕 라인, 도어 라인은 직선입니다

엉뚱한 왜곡이 없습니다 그리고 실제로, 나는 당신이 앉아있는 곳에서, 당신은 아마 밀접하게보아야 만합니다 왼쪽 그림이 조금 더 가깝다는 것을 알기 위해 프레임의 왼쪽에 그래서 그들은 실제로 조금씩 상쇄됩니다 두 대의 카메라가 있다면 무엇을 기대할 것인가 9 밀리미터 간격

그래서 우리는 이미지를 얻었다 우리는 왜곡되지 않았습니다 우리는 그들을 바로 잡았습니다 우리는 깊이 맵을 작성하는 데 아주 가깝습니다 깊이 맵 기능을 호출하면됩니다

우리는 stereoBM 또는 stereoSGBM을 사용합니다 하나는 다른 것보다 몇 가지 매개 변수가 있습니다 오픈 소스 데모로 게임을 할 때, 이 매개 변수가 어떻게 작동 하는지를 볼 수 있고, 최적화, 변경 사항 커밋, 그 앱을 더 잘 만드는 데 도움이됩니다 그리고 우리는 계산을 호출하고이 깊이 맵을 만듭니다 그리고 그렇게하면 놀라운 사진을 얻을 수 있습니다

이렇게 실제로, 때로는 그것보다 훨씬 나아 보입니다 하지만 어쨌든 이것은 우리가 함께 일하기를 원하는 것이 아닙니다 우리가 정말로하고 싶은 것은 필터입니다

이 경우, 가중치 최소 제곱 필터를 사용하여 그것을 부드럽게하고 조금 더 유용한 깊이를줍니다 지도 따라서 우리가 데모에서 본 어두운 픽셀은, 더 먼 사람들입니다 흰색 픽셀이 가까운 픽셀입니다 그리고 아마도 조금보기가 어려울 것입니다

상어의 주둥이와 하마의 주둥이를 볼 수 있습니다 조금 회색으로 변했다 그래서 실제로 어느 정도 거기에서 일하고 있습니다 필터를 호출하는 방법입니다 OpenCV 라이브러리에도 포함되어 있습니다

기여 모듈에서 그것은 모두 오픈 소스입니다 그리고 정말 멋집니다 완벽한 깊이 맵을 얻으면 기분이 좋아집니다 좋아, 여기서 우리는 깊이 맵을 가지고있다

우리는 무엇을 할 것인가? 따라서이 깊이 맵을 마스크로 적용 할 수 있습니다 그리고 검은 영역, 우리는 페이드 아웃하고 싶습니다 전경을 강조하고 싶습니다 PorterDuff을 사용하면 꽤 쉽습니다 결과는 이와 같습니다

실제로 전경이 더 많이 존재합니다 그런 다음 배경이 희미합니다 개인적으로 나는 높은 기준을 가지고있다 반투명 플로팅처럼 보입니다 내 어깨 너머에 상어

내 얼굴이 조금 희미 해지고 내 안구가 없어 졌어 그래서 저는 이것을 통해 큰 또 하나의 붉은 색 X를 넣고 말할 것입니다 충분하지 않습니다 좋은 시작입니다 그러나 우리가 정말로 원하는 것은 이것과 같은 깊이 맵입니다

그래서 우리는 깊이 맵에 어려운 문턱을 놓을 것입니다 전경, 배경을 결정합니다 다른 앱에서는 비슷한 것을하고 싶을 수 있습니다 그러나 어쩌면 그렇게 가혹한 차이는 아닙니다 더 부드러운 곡선이 될 수 있습니다

이를 위해 OpenCV 함수 인 임계 값을 사용할 수 있습니다 우리는 그만한 가치를 부여합니다 앱의 경우 255 개에서 80 ~ 140 개 정도입니다 그리고 그것은 무엇인가가 고려되는 바로 그 한계입니다 전경 또는 배경

너를 위해 이것의 구현 내가 너에게 보여준 것처럼 마스크를 적용했을 때, 당신은 실제로 그 검은 픽셀을 돌릴 필요가 있습니다 투명 픽셀로 따라서이 함수는 모든 검은 색을 투명하게 변환합니다 우리가 간다

거의 다 왔어 그래서 저는이 슬라이드에서 한 가지만 기억하고 싶었습니다 중간 그림 – 내 눈이 조금 어둡다는 것을 알 수 있습니다 3 개의 슬라이드 이상을 기억하십시오 그래서 우리는 초기 그림을 가지고 깊이지도를 얻었습니다

우리는 그것에 대한이 어려운 문턱을합니다 그리고 배경을 다시 만들 수 있습니다 첫 번째 데모에서했던 것처럼, 그것을 흐리게하고 단색으로 그 전경을 잘라냅니다 붙여 넣기에 필요한 모든 조각이 있습니다 그리고 이것은 우리의 놀라운, 마지막, 인물 사진입니다, 그것은 꽤 좋다

나는 그것을 자랑스럽게 생각합니다 그럼 최적화에 대해 이야기 해 봅시다 내가 말하고있는 안구를 기억해? 그래서 어떤 종류의 반짝 반짝 빛나는 이 현재 반복에서 엉망이 될 수있다 응용 프로그램의 또는 밝은 빛이 깊이 맵 생성을 버릴 수 있습니다 그래서 최적화를 한 번했습니다

FaceDetect 영역이 있어야합니다 나는 전경에서 얼굴을 원한다고 확신한다 그래서 나는 그것을 사용하고 그것을 단호하게 잘라 말했습니다 얼굴에있는 모든 것이 전경에있게 될 것입니다 그래서 내 이빨과 내 눈처럼 보호 받았다

그 마스킹 아웃 효과에서 네가 알아 차렸는지 모르겠다 내가 돌아갈 수 있을까? 내 퍼지 붉은 머리카락과 빨간 소파 – 거기 우리는 간다 그들은 종류가 섞여있다 그리 블 컷을 사용할 수 있다고 생각합니다

정확하게 알아내는 것의 조금 더 나은 일을하는 것 전경에 뭐가 있는지 고마워 우리는 이것이 당신에게 깊은 잠수함을 준 것을 정말로 희망합니다 카메라 2와 멀티 카메라 API를 사용하여, 당신에게 흥미 진진한 창의적인 아이디어를 제공합니다

우리는 당신의 아이디어를 정말로 듣고 싶습니다 우리는 앱에서 그들을보고 싶습니다 그리고 우리는 또한 당신이 찾고있는 기능을 알고 싶습니다 우리는 그들이 위대하다고 생각합니다 카메라 생태계를 계속 추진하고 정말 생태계가 점점 더 커지고 있습니다

다시 한번 고마워 그리고 샌드 박스, 카메라 샌드 박스, 질문이 있으시면 후속 조치를 원할 경우이 앱을 사용해보고 싶습니다 작동하는지 확인하십시오 그리고 곧 오픈 소스를 찾으십시오 고마워

[박수 갈채] [음악 재생]

How To Send Sms From Your Pc Using Android Messages & How To Use Messages For Web Feature?

안녕하세요 내 채널에 오신 것을 환영합니다

"Teconz" 그래서 구글은 최근에 유용한 안드로이드 메시지 기능을 선보였다 웹을 통해 PC에서 문자 메시지를 보낼 수 있습니다 오늘 내가 할거야 이 안드로이드 메시지 웹 인터페이스를 사용하는 방법을 보여주고 SMS를 보낼 컴퓨터

이 방법은 안드로이드 메시지 응용 프로그램이 필요합니다 그래서 그것을 얻는 방법? 그냥 Google 플레이 스토어를 열고이 검색 창에 섹션에 안드로이드 메시지를 입력 할 수 있습니다 클릭하여 설치할 수 있으며 응용 프로그램 크기는 거의 23 메가 바이트이므로 언젠가는 기다려라 그런 다음 설치를 시작합니다 설치를 시작합니다

프로세스가 완료되면이 애플리케이션을 클릭하여 열 수 있습니다 그런 다음 지침을 클릭하면이 단계를 건너 뛰고 "다음"을 클릭 할 수 있습니다 또한 사용 권한을 요청하기 때문에이 응용 프로그램을 "허용"하려면 클릭 할 수 있습니다 이 응용 프로그램은 모든 연락처에 액세스합니다 마지막으로이 응용 프로그램을 사용할 준비가되었습니다

다음은이 앱을 데스크톱에서 사용하는 방법입니다 이제 Google 크롬을 엽니 다 또는 컴퓨터의 웹 브라우저를 클릭 한 다음 언급 한 항목에 액세스하려면 클릭하십시오 URL이고 URL은 "http://messagesandroid

com"입니다 이 섹션에서는 하나의 QR 코드를 보여줍니다 이제 안드로이드에서 안드로이드 메시지 응용 프로그램을 열 수 있습니다 모바일이 섹션에서 3 개의 점 아이콘을 클릭하면 4 개의 아이콘이 표시됩니다 여기에서 '웹용 메시지'를 선택하고 두 번째 메시지를 선택할 수 있습니다

"QR 코드 스캔"을 선택하고 "허용"을 클릭하면 마침내 내 모바일 카메라가 시작됩니다 QR 코드를 스캔합니다 이제 브라우저를 열고 해당 QR 코드를 android mobile,하지만이 방법을 사용하기 전에 먼저 이 옵션은 "이 컴퓨터 기억하기"를 사용하면 컴퓨터를 예방할 수 있기 때문에 이 컴퓨터에서 자동으로 로그 아웃합니다 이제 QR 코드를 스캔하려고합니다 마침내 여기에서 안드로이드 메시지 웹을 사용할 준비가 된 것을 볼 수 있습니다

이 웹에서 새 메시지를 보내면 "새 대화"를 선택할 수 있습니다 마지막으로 여기에서 볼 수 있습니다 내 연락처가 모두 표시되므로 연락처 번호는 PC 및이 방법으로 메시지를 보낼 수 있습니다 매우 원활하게 작동합니다 시간 소모로 인해, 나는 나의 튜토리얼을 마쳤다

따라서 PC에서 모든 장치로 메시지를 쉽게 보낼 수있는 방법입니다 더 많은 동영상을 보려면 내 채널 "Teconz"를 구독하고 시청 해 주셔서 감사합니다

Kotlin for Android O Development: From Beginner to Advanced | Course Preview

안녕하십니까, 코르시카에 입사하신 것을 축하드립니다 안녕하세요, 저는 조 피어스입니다

저는 조 피어스 아카데미의 설립자이자 창업자입니다 전 세계의 다른 분야에서 30 만 명이 넘는 학생들을 공부합니다 이제 Kotlen 어학 코스를 통해 추가 선생님 인 Attil과 함께 배우게됩니다 Java Developer 및 CutLine은 놀라운 응용 프로그램을 만드는 데 도움이되는 소프트웨어 작업에 수천 시간 이상을 투자했습니다 이 과정의 이점은 절대적으로 끝이 없습니다! 실제 세계로 번역 할 수있는 기술을 배우게 될 것이며 처음부터 전문적인 프로그램을 만드는 방법을 배울 것입니다

이러한 기술을 활용하여 수백 가지의 응용 프로그램을 만들 수 있습니다 천국이 한계 다! 우리는 당신과 함께하는 것을 매우 자랑스럽게 생각합니다 이제 나는 여분의 시간을 낭비하고 싶지 않습니다, Atel은 당신에게 코스의 다음 비디오에서 모든 것을 가르쳐 줄 것입니다 그리고 나서 시작합니다 우리는 배우는 가장 좋은 방법은 후속 조치와 실제 적용을 통한 학습이라는 것을 믿습니다

우리는 당신이 당신이 안드로이드 애플 리케이션을 만들 수있는 경험에 손을 댈 수있는 몇 가지 다른 예를 보여줄 것입니다 새로운 프로그래밍 언어 : Kotlin, 다시 한 번 감사드립니다 나는 곧 당신을 보려고 기다립니다!

How to Kotlin – from the Lead Kotlin Language Designer (Google I/O ’18)

[음악 재생] 제임스 라우 : 고마워요 오늘 아침 여기와 줘서 고마워

제 이름은 James입니다 저는 Google의 Kotlin 팀원입니다 오늘, 나는 매우 기쁜 소식을 전한다 JetBrains의 특별 게스트, 정말로 소개가 필요하지 않습니다 자, 여러분 모두는 코 틀린이 지금 가장 사랑받는 프로그램 중 하나 세계의 언어

Google I / O에서는 Google이 매우 드뭅니다 외부 스피커가 있어야합니다 하지만이 사람은 작년에 여기 있었는데, 우리는 아무도 생각할 수 없기 때문에 그를 초대했습니다 그렇지 않으면 코 틀린을 가르치는 것이 더 낫다 그것을 발명 한 사람들의 리드 언어 디자이너를 환영 해주십시오

코 틀린, 안드레이 브레 슬라브 [박수 갈채] 앤드류 브레 슬라브 : 고마워, 제임스 훌륭한 소개 주셔서 감사합니다 모두들 안녕 나는 너를 여기에서 만나서 매우 기쁩니다

오늘 나는 그것이 무엇이 될 수 있는지 이야기 할 것이다 코 틀린 그리고 저는 실제로 라이브 데모를 할 것입니다 제 데모를 가져 오십시오 슬라이드에이 끔찍한 코드가있는 이유는 우리 모두가 배우고 있고, 우리의 오래된 습관이 때로는 방해가되지

그래서 나는 오늘 어떻게 나가야하는지에 관한 주제를 발표 할 것입니다 귀하의 자바 습관을 배우고 귀하의 코 틀린 습관을 찾으십시오 그래서 우리 모두는 다른 배경에서 왔습니다 그리고 우리 중 많은 사람들이 자바 프로그래밍 언어로 시작했습니다 이를 통해 프로그래밍에 대한 지식을 축적했습니다

그래서 우리는 많은 것을 기억합니다 그리고 그 일은 코 틀린 (Kotlin)이 여러 언어에서 영감을 얻었으며, 자바 프로그래밍 언어도 포함됩니다 따라서 Kotlin에서 많은 Java 구조를 재현 할 수 있습니다 그리고 그것은 효과가있을 것입니다 이런 식으로 일을 할 수 있습니다

그러나 그것은 많은 경우에 극적으로 개선 될 수 있습니다 그래서이 특별한 예제는 클래스 선언에 관한 것입니다 그리고 여기서 내가 왼쪽에 코 틀린 (Kotlin) 수업이 있다는 것을 알 수 있습니다 오른쪽에 Java 클래스가 있습니다 그리고 그들은 매우 비슷해 보입니다

그러나 이것은 분명히 Kotlin 코드를 작성하는 방법이 아닙니다 그래서 당신이 실제로해야 할 일은 무엇입니까? 불필요한 것들을 모두 제거하십시오 여기서 제가 말해야 할 것은 두 가지 속성, 하나의 클래스입니다 그게 맞습니까? 그래서 저는 그것을 손으로 변형 시키려고 노력할 수 있습니다 하지만 실제로 좋은 도구를 과시하고 싶습니다

자바 측에서 코드를 복사하여 붙여 넣기 만하면됩니다 Kotlin 측에, 그래서 그것은 자바를 Kotlin에 사용할 것이다 IDE에 내장 된 변환기를 사용하면됩니다 그래서 붐, 거기있다 실제로 모든 단일 라인 하나의 클래스, 두 개의 속성을 선언하는 데 필요합니다

그게 전부 야 여기에있는 것은 기본 생성자가있는 클래스입니다 그래서 두 개의 매개 변수를 가지며 둘 다 속성입니다 그게 당신이 말하고 싶은 모든 것입니다 그래서 이것은 이것들 중 하나입니다

값싼 선언 클래스가 Kotlin에있는 방법을 보여줍니다 그리고 이것에 결과가 있습니다 이 코드를보십시오 여기서 코드를 작성하는 방법이 분명하지 않습니다 실제로 어떤 언어로든

나는 전체 이름을 이름으로 파싱하고 싶었다 와 성 그리고 그것이 제가 여기서하고있는 일입니다 하지만 결과를 함수에서 제외 시키려면 어떻게 팩하나요? 함수에서 두 가지를 반환하는 방법이 없습니다 나는 하나의 물건을 넣어야한다

그리고 나는 여기에 목록을 남용하고, 어색하게 하나를 꺼내고있다 다른 하나는 이름과 성을 만드는 것입니다 어떤 언어로도 이것을하지 마십시오 그러나 심리적 인 이유가 있습니다 이것을하기 위해서, 적어도 우리의 오래된 습관에서는, 선언 클래스가 비싸니까요, 그렇죠? 새 파일을 만들고 코드를 넣어야합니다

그것은 다소 어색합니다 그러나 Kotlin에서는 이것을 할 필요가 없습니다 말할 필요가있는 것, 수업 시간, 성명, 이름과 성을 속성으로 사용합니다 그리고 나서, 여기서해야 할 일은 단지 그것을 되 찾는 것입니다 그래서 내 이름

여기 간다 이제 지수 대신에 첫 번째와 마지막으로 말할 수 있습니다 이리 그래서 그것이 아이디어입니다 싸구려 클래스가 항상있는 것은 아닙니다

선언 사이트에서 시간을 절약 할 수 있습니다 정신적 노력을 덜어줍니다 여러 수익을 클래스로 나타낼 수 있습니다 그것은 당신에게 아무런 비용도 들지 않습니다 그래서 이걸 실행하면 내 평등이 그게 한 줄짜리 클래스이기 때문에 분명히 작동하지 않습니다

그리고 이제 저는 거기에 동등한 것을 선언하러 갈 것입니다 거기에 해시 코드 등이 있습니다 너무 장황하다 그러나 나는 Kotlin에서 이것을 할 필요가 없다 아마 거기 있다는 것을 알기 때문에 뭔가 데이터 클래스라고합니다

데이터 클래스를 아는 사람은 누구입니까? 많은 사람들, 좋아 그래서 당신은 내가이 키워드 하나를 거기에 넣었다는 것을 알고 있습니다 컴파일러는 나에게 많은 것들을 생성합니다 해시 코드, 문자열에 대한 것, 및 기타 많은 편리한 방법 그게 전부입니다

수업이 얼마나 비싸다는 생각을 바꾸십시오 모든 추상화에서 쉽게 사용할 수 있습니다 그래서 더 많거나 적게 워밍업으로 끝났습니다 다른 것을 보도록하겠습니다 속성

그래서 우리는 수업에 관해 이야기했습니다 속성을 살펴보고 함수로 넘어갑니다 그래서 여기에 당신이 그것을하지 말아야 할 방식으로 행해진 속성이 있습니다 다시 코 틀린에서 그래서 내가 전에 보여 줬던 문제들 게터와 세터 모두가 일종의 단 하나의 라이너였습니다

하찮은 맞춤 설정 도구를 원한다면 그 기능을 정의하지 마십시오 당신은 아마도 당신이 알고있는 것처럼 당신의 커스텀 세터 문법을 가지고 있습니다 데이터 클래스를 알고 있다면 알 수 있습니다 맞춤 설정 도구 안에는 다음과 같은 필드가 있습니다

제출되지 않았지만 현장 – 백엔드 스토리지에 쓸 수는 있지만 그게 전부입니다 다른 이름으로 추가 이름을 입력 할 필요는 없습니다 그래서 간단합니다, 맞죠? 그런 다음이 코드를 살펴보십시오 그래서 여기에 이미 합리적인 논리가 있습니다 두 가지 속성이 있습니다

그 중 하나는 비공개 및 null 가능입니다 및 변경할 수 있습니다 처음 액세스 할 때 그게 null인지 확인하고 있습니다 그런 다음 가치를 계산하고 그것에 글을 씁니다 그리고 출력하고, getter에서 반환합니다

그래서 무엇입니까? 게으른 재산이지, 그렇지? 나는 수십, 수천을 개인적으로 썼다 Java 및 다른 많은 언어의 사람들 중 그래서 나는 그것에 지루해합니다 그래서 Kotlin은 다음과 같은 추상화 메커니즘을 가지고 있습니다 속성 위임 위임 된 속성을 사용하면 이 게으른 논리의 모든 반복

우리가 신경 쓰는 것은이 표현입니다 그럼 그냥 해보 죠 이 모든 것을 단지 게으름으로 구현하십시오 이거 야 그래서 내가 지금하고있는 것, 나는 말하고있다

내 재산은 단순히 무언가에 의해 초기화되지 않습니다 이 게으른 일에 위임되었습니다 그리고 처음 액세스하면이 람다가 실행됩니다 그리고 나머지는 도서관에 보관 될 것입니다 그래서 게으른 것은 언어 구조가 아닙니다

그것은 단지 라이브러리 함수입니다 당신은 당신 자신을 정의 할 수 있습니다 그리고 도서관은 많은 다른 것들을 제공합니다 그래서 여기 테이크 아웃은 당신이 예를 들어 관찰 할 수있는 공통된 종류의 속성을 가지며, 무언가가 수정되었음을 통보 받아야 할 때, 라이브러리를 사용하거나 직접 작성하십시오 그래서 여기에서, delegates

observable이 일을합니다 표준 라이브러리에서 그러나 원한다면 이와 같은 코드를 작성하지 않아도됩니다 하나의 속성이 있고 다른 속성이 있으면, 다른 하나는 똑같은 일을 반복해서 반복합니다 실제로 당신이해야 할 일은 이것뿐입니다

캡슐화하는 단일 클래스를 선언하십시오 일반 getter와 같은 속성의 논리 및 일반 설정자 그리고 그게 다야 이제 여러 속성에서이 클래스를 참조 할 수 있습니다 비즈니스 로직 데이터베이스 액세스, 모든 종류의 유효성 검사

원하는 모든 것을 라이브러리로 추상화 할 수 있습니다 프로젝트 전체에서 다시 사용할 수 있습니다 그것은 의미가 있습니까? 누가 이것을 이미 사용합니까? 나는 모른다 너무 많은 사람들 당신은 실제로해야합니다

나는 당신이 이것으로부터 이익을 얻을 수 있다고 확신합니다 그래서 이것은 속성에 관한 것입니다 이제는 기능에 대해 알아 보겠습니다 기능은 매우 중요합니다 다시 한번 이것은 매우 끔찍한 코드입니다

Kotlin에서 이와 같은 코드를 작성하지 마십시오 이것은 우리의 습관에 매우 영감을 받았습니다 Java 프로그래밍 언어에서, 내가 가지고있을 때 모든 것을 수업에 넣기 그래서 StringUtil– 프로젝트에 자체 StringUtil이 있습니까? 수업? 오, 그렇지 않다면, 그냥 아주 새로운 프로젝트 일세, 그렇지? 그래서 내 프로젝트 중 하나가 있습니다 하지만 문제는 코 틀린에서 조금 다릅니다

수업을 사용할 필요가 없습니다 음, 우선, Kotlin 수업에는 정체감이 없습니다 따라서이 클래스에서 이러한 함수를 사용하려면, StringUtil, 괄호, 새로운 객체를 만듭니다 나는 매번 새로운 물건을 원하지 않는다 나는 이것을 이렇게 원한다

그래서 나는이 클래스를 객체로 만든다 내 정신 이상에 약간의 개선이 있습니다 권리? 그래서 저는 매번 객체를 만들고있었습니다 나는 함수를 호출하고 싶었다 그건 미친 짓이야

하지만 실제로, Kotlin에서, 나는 어떤 용기를 담을 필요가 없다 왜냐하면 나는 최상위 함수를 가지고 있기 때문이다 그래서 이것은 기능처럼 명백하게 보일 수 있습니다, 그것들은 무엇입니까? 그들은 단지 선언 일뿐입니다, 그렇죠? 그러나 일부 언어는 수업 시간과 수업 시간에만 많은 언어를 사용합니다 이것을 배우고 이것에 의지하십시오 그래서 이것은 Kotlin 방법의 훨씬 더 많은 것입니다, 그러나 그것은 측면에서 여전히 크지 않다

당신이 코 틀린과 함께 할 수있는 것의 두 가지 과부하가있다 그래서 getFirstWord는 문자열을 파싱하기로되어 있습니다 첫 번째 공간을 찾고 첫 번째 단어를 가져 와서 그것을 반환하십시오 하지만 구분 기호가 공백이 아닌 쉼표 인 경우에는 어떻게 될까요? 또는 뭔가? 그래서 여기에 더 많은 기능을 갖춘 버전이 있습니다 그리고 나서, 실제로 이것을 호출하는 방법입니다

대부분의 상황에서 그래서 여기에 표현하고자하는 것은 단지 기본값입니다 Java에서 우리는이 작업에 과부하를 사용하는 데 익숙합니다 일부 사용자는 nullable 매개 변수를 사용합니다 pass와 null을 여기에 넣으면 기본값을 줄 것입니다

Kotlin에서하지 마십시오 너는 필요 없어 실제로 필요한 것은 단순히 기본값을 지정하는 것입니다 내 기본값은 공간입니다 그게 전부 야

따라서 기본값을 에뮬레이트 할 필요가 없었습니다 그들은 둘 다 언어에 속합니다 그리고 당신이 많은, 많은 디폴트를 가질 때 매개 변수가 다른 값, 여러개의 부울 (boolean)을 좋아하는 등등 명명 된 매개 변수 구문을 사용하여 매개 변수 구문을 표현할 수 있습니다 당신은 실제로 필요합니다

나머지는 모두 기본적으로 사용됩니다 그래서 이것은 처음부터 기능을 줄였습니다 그리고 훨씬 더 표현력이 좋습니다 승인 기능면에서 좋지, 그렇지? 사실,이 함수는 중간 정도의 종류입니다

Kotlin 스타일과 Java 스타일 사이 실제로 문자열에서 작동하기 때문입니다 이것을 문자열 클래스에 넣는 것이 좋습니다 오, 잠깐, 그렇지 않아 문자열 클래스는 당신에 의해 제어되지 않기 때문에, 모든 것을 문자열 클래스에 넣을 수는 없습니다 그리고 문자열 API를 최소한으로 유지하려고합니다

그래서 내가 뭘하고 싶은지 나는 내 끈을 말할 수있는 이런 식으로, getFirstWord, 그게 전부입니다 그래서 그것은 방법처럼 보입니다 실제로 확장 기능이라고합니다 문자열 클래스에 앉아 있지 않습니다

나는 JDK에 가지 않고 제어 할 수있는 클래스를 변경하지 않았다 그러나 여전히, 그것은 이렇게 작동합니다 이것이 당신이 사용할 수있는 메커니즘입니다 어떻게 작동하는지 수동으로 설명하겠습니다 그래서 나는 string 타입의 리시버를 가지고있다

이제는이 매개 변수가 더 이상 필요하지 않습니다 여기에이 점을 말할 수 있으며 여기에서이 점을 사용하십시오 또는이 모든 것을 왼쪽에서 생략하십시오 이제는이 방법으로 사용할 수 있습니다 이해가 되니? 나는 재산으로도 똑같이 할 수있다

사실, 이렇게하는 것이 매우 좋을 것입니다 그냥 속성 이름으로 첫 단어가 있습니다 확장 속성을 가질 수 있습니다 물론 사용자 정의가 없습니다 구분 기호에 대한,하지만 그렇지 않으면 당신은 좋은거야

네, 여기에 공간을두기 만하면됩니다 그리고 그게 다야 따라서 확장 기능, 확장 속성 – 그것은 실제로 매우 중요한 아이디어입니다 그것은 단지 편리함이 아닙니다 수업을 실제로 최소한으로 유지할 수 있습니다

그러니 Kotlin의 문자열 클래스를보십시오 그것은 단지 5 가지 방법입니다 자바와 비교하면 스크린과 스크린이 될 것입니다 선언 따라서 API를 최소한으로 유지할 수 있습니다

그리고 모든 유틸리티 기능은 확장 기능 일 수 있습니다 다른 라이브러리에 앉아서 모듈화 할 수 있습니다 이는 API를 설계하는 데있어 매우 중요한 도구입니다 질문 있니? 승인 어쨌든 나는 그들을 데려 갈 수 없었다

좋아, 자, 이것 좀 보자 여기, 나는 아주 전형적인 것을하고 있습니다 나는 계층 구조를 가로 지르고있다 그래서 컨테이너와 리프 요소가 있습니다 컨테이너는 서로 중첩 될 수 있습니다

리프 요소가 거기에 있습니다 모든 잎 요소는 텍스트를 포함하고 I 이 계층 구조에서 모든 텍스트를 추출하려고합니다 꽤 직설적 인 그래서 수업은 세 줄의 코드입니다 별로

요소가 있습니다 아이들 목록이있는 컨테이너가 있습니다 텍스트가 있습니다 자, 나는 이것을 가로 지르고있다 그래서 확장 기능을 사용하고 있습니다

내가 말했듯이 나는 모든 최상위 함수를 사용하고 있습니다 그래서 괜찮아요하지만이 코드가 마음에 들지 않아요 왜 내가 그걸 좋아하지 않니? 여기에서 계층 구조를 탐색하려면 재귀가 필요합니다 그래서 문자열 빌더를 스택 아래로 전달해야합니다

내가 나무를 추락 할 때 그것에 덧붙여 라 그렇다면 최상위 함수로 끝납니다 여기 에선 이것 만 필요합니다 그래서이 곳은 어디에도 필요하지 않습니다 그러나이 함수 내부

그래서 제가 정말로하고 싶은 것은 그냥 안에 넣어 두는 것입니다 그냥 여기 가서 로컬 기능으로 만드십시오 다시 한번, 다른 사람이 필요로하지 않는다는 것을 표현하는 것입니다 더 이상 개인 도우미가 필요하지 않습니다 지역 조력자를 찾는다

그리고 이것은 조금 향상시킬 수 있습니다 실제로 클로저를 사용할 수 있습니다 그래서 여기서 문자열 제작자를 만들 수 있습니다 이 모든 것을 제거하십시오 따라서 여기서 매개 변수를 반환하거나 가져갈 필요가 없습니다

여기에 필요한 것은 위에서 선언 한 것을 사용하는 것입니다 그리고 나서 나는 e의 텍스트를 여기에서 추출한다 문자열 작성기를 toString으로 리턴합니다 ExtractText– 아, 죄송합니다 연장 기능이 맞죠? 아뇨, 미안 해요

그래, 그럼 어떻게되는지 알아 보자 무언가를 지역 기능으로 바꾸고 활용할 수 있습니다 폐쇄 그래서이 변수는 내 함수 밖에서 선언됩니다 바깥 바깥에있는 사람들은 접근 할 수 없습니다

그리고 저는 여기서 그것을 사용하고 있습니다 이제는 로컬 함수, 확장 함수, 최상위 함수, 기본 매개 변수를 사용하십시오 그들은 당신의 코드를 더 좋게 만들 것이다 이제는 아직 무엇이 있는지 살펴 보겠습니다 회색 코드가 보이십니까? 회색 코드는 쓸모가 없습니다

IDE와 컴파일러는 무언가가 아니라는 것을 보여줍니다 거기에 필요했고 실제로는 그렇지 않습니다 이 클래스는 여기에서 확인했기 때문에이 클래스는 중복되었습니다 그래서 이것을 제거 할 수 있습니다 그리고 네가 본다면 나는 모른다

오, 예, 당신은 – 텍스트 변수는 녹색으로 변했습니다 녹색 인 이유는 무엇입니까? 컴파일러가 당신을 위해 캐스트를 알아낼 수 있기 때문입니다 실제로는 훨씬 안전합니다 그것은 편리 할뿐만 아니라 나는 그 곳곳에서 내 캐스팅에 정말 화가났다

그래서 나는 그것이 텍스트임을 압니다 왜 몰라? 자, 이제 알았어 실제로이 변수가 필요하지 않습니다 유일한 용도이기 때문입니다 그리고 여기서도 마찬가지입니다

그리고, 제 컨테이너는 인라인이 될 수 있습니다 그래서 여기 있습니다 스마트 캐스트를 사용할 수 있습니다 코드를보다 안전하고 간결하게 만듭니다 그리고 실제로, 그것은 여전히 ​​모든 캐스트를 만듭니다

귀하의 프로그램에 의미가 있습니다 그래서 지금 Kotlin에서 as 연산자를 볼 때, 당신은 그것이 무엇인가를 의미한다는 것을 압니다 그것은 단지 쓸데없는 칭찬이 아닙니다 위의 체크 또한이 일은 내가하고있는 일 때문에 어리 석다

나는 모든 것에 동일한 기능을 적용하고 있습니다 그리고 그것은 하나의 기능입니다 그래서 제가하고 싶은 것은 이것과 같습니다 그것은 조금 더 좋게 보입니다 그리고 우리가 가지고있는 것을 보도록하겠습니다

우리는 계층 구조를 가로 지르고 있습니다 나는 내 나뭇잎이있다 나는 용기를 가지고있다 그게 제가 표현하고 싶은 것입니다, 그렇죠? 나는 다른 경우를 확인하고있다 그래서, when 문을 사용하는 것이 훨씬 더 좋다

유형을 바로 여기에서 전환 할 수 있습니다 그러나 그것에 대해 성가신 일이 있습니다 그리고 그것은 다시 옛날 습관에서 비롯된 것입니다 나는 가까운 계층 구조를 선언하고있다 컨테이너와 텍스트 만 있습니다

나는 다른 것을 가지고 있지 않다 하지만 지금은 여기이 귀찮은 사건이 있습니다 왜? 컴파일러는 아무 생각이 없기 때문에 컨테이너와 텍스트 이외에는 아무것도 없습니다 그것은 단지 추상적 인 클래스이고 거기에 어떤 경우가 있습니다

하지만 실제로 Kotlin에서 이것을 봉인으로 표현할 수 있습니다 봉인 된 클래스를 가질 수 있습니다 모든 하위 클래스가 알려져 있습니다 이 파일 밖에서 파일을 선언 할 수 있습니다 그리고 이렇게하면 IDE와 컴파일러가 이 다른 것이 쓸모 없다는 것을 알아라

그래서 우리는 거의 두 화면의 코드에서 출발했습니다 하나 이하로, 단순히 Kotlin의 숙어를 적용 이 코드에 질문 있니? 죄송 해요 괜찮아 자 이제이 연습을 계속하겠습니다

쓰여진 표현의 몇 가지 예를 살펴보십시오 마음에있는 오래된 습관과 같습니다 그리고 우리는 그것들을 더 나은 것으로 바꾸려고 노력할 것입니다 따라서 여기서 가장 눈에 띄는 것은 var입니다 나는 결코 var를 사용하지 않는다고 말할 수 없다

Vars가 유용합니다 가변 변수는 많은 좋은 것들에 사용될 수 있습니다 그러나 낙담 한 모양입니다 var가 필요한 경우 아주 좋은 이유가 필요합니다 여기 val을 사용하는 것은 당연한 이유가 아닙니다

그런 다음 여기에서이 세 가지를 살펴 보겠습니다 그것은 반복입니다 반복은 추악합니다 반복은 오류가 발생하기 쉽습니다 특히 이것이 하나의 이름은 아니지만 많은 것들이 쇠사슬에 묶여 있다면

그래서 나는이 반복을 없애고 싶다 제가 할 수있는 말은 전 (ex)입니다 누구는 파스칼을 기억합니까? 파스칼, 누구? 오 좋네 좋은 나는 거의 파스칼에서 시작했다

그래서 그것은 이상한 것이 었습니다 그것은 건물 구조였습니다 Kotlin에서 그것은 기능입니다 우리는 그것을 사용할 수 있습니다 그리고 여기, 우리는 모든 전 것들을 제거 할 수 있습니다

여기, 이렇게 그리고 지금은 더 바보처럼 보인다 나는 단지 같은 변수에 할당하고있다 그러지 마 좋아, 이제는 문자열에 뭔가 더한 프린트 라인이있다

문자열과 무언가, 문자열과 무언가 어색해 대부분의 언어는 이제 문자열 보간법을 사용합니다 Kotlin도 그렇게합니다 여기 실제로 필요한 것은 이것입니다

이걸로 끝났어 를 사용하여 범위로 항목을 가져옵니다 문자열 보간법을 사용하면 좋습니다 이제 여기, 나는 옛날 방식으로지도를 만들고 있습니다 이런 식으로 좀 더 좋게 만들 수 있어요

내 연산자를 사용하여,하지만 정말 더 좋네요 빌더 함수를 사용하면됩니다 그래서 제가 여기서 할 수있는 일은 모든지도 것들을 쌍으로 대체하는 것입니다 아, 쌍은 아니지만 쌍 죄송합니다

이야기 할 때 타이핑하기가 어렵습니다 네지도는 쌍으로 만들 수 있습니다 그렇죠? 지도는 키와 값의 쌍으로 이루어진 집합이었습니다 그러나 실제로, 쌍은 이것에서 일종의 중복입니다 그래서 우리는 보통 여기에 함수를 사용하고 있습니다

내장 연산자가 아니라 라이브러리 함수입니다 여기, 그래서 당신이지도를 만드는 방법입니다 그리고 당신이지도를 가로 질러 가고 싶을 때, 당신은 여기에 열쇠와 가치를 말할 수 있습니다 이 같은 변수를 사용하면 for 루프는 훨씬 간결합니다 이 코드 예제는 if 문을 사용하여, Java에서 코드를 정말 싫어하는 것입니다

이 과제는 여기에서 모두 다 떨어지기 때문에, 그래서 나는 Kotlin에서 이런 일을 정말로하고 싶습니다 그래서, 그리고 많은 다른 것들은 실제로 표현입니다 이것은 꽤 익숙하지 않은 무언가이다 C 언어 패밀리 우리는 코드를 문장으로 나눌 때 익숙하다

표현, 맞죠? 문장은 효과가있는 것입니다 표현은 가치가있는 것입니다 따라서 변수에 표현식을 지정하고 명령문을 작성합니다 사물에 물건을 할당하는 것 그래서 코 틀린은이 절차 적 전통의 중간에 있습니다

기능적 전통 너보다 표현이 더 많아 다른 언어로는 익숙하다 그래서 여기서 할 수 있습니다 물론 var를 사용할 필요는 없습니다

다른 라인을 만들 필요가 없습니다 그리고 즉시 할당 할 수 있습니다 그래서 표현이라면 더 좋게 만드십시오 그건 그렇고, 표현의 결과 블록의 마지막 것입니다 그 때도 마찬가지입니다

단순히 스테로이드로 케이스를 전환하지 않는 경우, 그것은 크게 중요하게 표현입니다 그럼 너도 그렇게 할 수 있지, 그렇지? 여기에 많은 반품은 없지만 여기로 돌아 오는 반품은 훨씬 좋네요 물론 자신을 반복하지 않아도됩니다 그리고 당신도 이것을 말할 수 있습니다 그건 그렇고, 뭔가 이상하고 평평한 지 확인하고 싶다면, 나처럼하지 마

데모 용입니다 집에서 이것을 시도하지 마십시오 상처받을거야 그래, 이렇게하면 더 간단해질 수있어 그래서 다시, 당신은 소음을 제거하려고합니다

이런 코드를 보았을 때, 그냥 소음을 없애려고 노력하십시오 소음은 뇌에 해로울 수 있습니다 마지막으로, 무엇에 대한 간단한 데모 null 허용 여부를 결정하십시오 그래서 이러한 물음표는 nullable 유형에 익숙합니다 코 틀린에요? 몇 명? 나는 정말로 빨리 갈 것이다

따라서 nullable 유형을 사용할 수 있습니다 그리고 컴파일러는 이런 일을합니다 그래서 지금 거기에 있습니다 문자열은 null입니다 당신은 역 참조 할 수 있습니다

이 작업을 수행 할 수 있습니다 나를 비유하다 그건 그렇고, 여기서 할 수 있어요 뿐만 아니라 주위에 if를 쓸 필요가 없습니다 그리고 실제로 이렇게 단순화 할 수 있습니다

또 다른 좋은 점은 이런 식으로 엘비스 연산자를 사용하면 if 문을 무언가에 넣습니다 그리고 이것은 분명히 호기심이 생깁니다 표현의 위치에, 맞지? 엘비스는 어떻게 일하는거야? 엘비스는 문자열의 왼쪽에 표현식을 취하고, 너는 정말로 널 멋지다 그리고 만약 그것이 null이라면, 그것은 오른쪽을 평가합니다 그러나 오른쪽은 표현이어야합니다

맞습니까? 기본적으로 기본 설정으로되어 있습니다 그래서 당신이 지금 왼쪽에 있다면, 오른쪽에 기본값을 사용하십시오 그러나 귀하의 불이행은 단지 반환 일 수 있습니다 이는 어떤 값도 계산하지 않는다는 것을 의미합니다 방금 함수에서 뛰어 내린다

그리고 그것은 타입 시스템에서 꽤 흥미로운 것입니다 관점,하지만 난 여기서 강의를하지 않을거야 나는 데모를하고있다 좋습니다, 우리는 표현에 능숙합니다 기능적 스타일을 살펴 보겠습니다

그래서 사람들은 매우 자주 코 틀린을 언급합니다 기능적 언어로서 나는 그것이 사실이라고 생각하지 않는다 나는 Kotlin이 다중 패러다임 언어라고 생각한다 기능 스타일을 지원합니다

당신은 Kotlin에서 기능을 쓸 필요가 없습니다 그러나 종종 그것을하는 것이 매우 좋다 그래서 이것에 대해 살펴 보겠습니다 그래서 자바를 염두에두고 옛날에는 이 코드를 작성했습니다이 코드는 숫자 목록을 처리합니다

16으로 나눌 수있는자를 선택합니다 다음 16 진수로 변환합니다 그럼 필터 맵이 실제로하는 일입니다 맞습니까? 지도는 이쪽, 필터는 이쪽입니다 그래서 내가 할 수있는 것은, 심지어 나의 IDE의 도움으로, 나는 이것을 할 수있다

모든 프로그래밍 언어의 새로운 버전 이런 게있어 확실히 활용할 수 있습니다 따라서이 필터는 함수입니다 이 람다는 함수 값입니다 그건 그렇고, 변수로 선언하지 않아도됩니다

너는 그걸 없애 버릴 수있어 이것이 λ 매개 변수입니다 Kotlin은 훌륭한 반 기능적 일을 가지고 있습니다 코드에서 어디에서나 말할 수있는 것처럼 말할 수 있습니다 너는이 가치를 가지고있다

나에게도 해줘 나를위한이 목록 그리고 나서 당신이하고 있던 일을 계속하십시오 결코 마음에 들지 않는 것처럼, 이것은 단지 디버그 출력이거나 어떤면이다 효과 나는 여기에 삽입하고 싶다

한편으로는 부작용이별로 작용하지 않습니다 반면에 이것은 디버깅에 매우 유용합니다 당신은 당신의 사슬을 분해 할 필요가 없습니다 등등 또한 let을 사용하고, run을 사용하고, 등등을 사용하십시오

기능적 추상화에 대한 한 가지 중요한 점이 있습니다 비 기능 언어로 이런 일을하면 반복 기능이 생깁니다 바로 여기, 그렇지? 그래서 그것이 무엇인지, 그것은 숫자를 필요로합니다 나는 무언가를 반복하고 싶다

그리고 이것은 무엇인가 기능입니다 그건 그렇고, 당신은 자신의 기능을 발명 할 필요가 없습니다 인터페이스를 사용할 때마다 여기에 함수 유형을 사용하십시오 그것은 int를 취하거나 하나의 단위를 취하는 함수입니다 단위 란 당신이 신경 쓰지 않는 어떤 것입니다

그런 다음 간단히 반복합니다 그래서 내가 반복을 말할 때, 나는 언제나 무엇에 대해 아주 많이 의식하고있다 그것은 저를 요하기 위하여려고하고있다 그래서 그것은 기능입니다 매개 변수로 람다를 사용합니다

그래서 실제로는 또 다른 매개 변수입니다 Kotlin 관례는 그것을 괄호 밖에서 쓰는 것입니다 이런 언어 구조와 더 비슷해 보입니다 그런데, OK, 나는 이것을 달리고있다 나는 람다 객체를 생성해야한다

매번 람다 객체를 생성해야한다 이런 식으로하세요 따라서이 추상화에는 비용이 듭니다 좋은 코드예요 나는 물건을 재사용 할 수있다

코드에서 추상화 수준을 높일 수 있습니다 그러나 그것에는 유료 도로가 있습니다 실제로 Kotlin에서, 당신은 매우 자주 제거 할 수 있습니다 녹색 람다의 통행량 중 – 람다 객체 – 인라인 함수 만 사용하면됩니다 내가 인라인이라고 말할 때, 내 코드는 변하지 않습니다

그래서 여기, 내가 볼 수있는 콜 사이트에서 아무 일도 없었습니다 그러나 내가 쇼 코 틀린 바이트 코드를 말하면, 이것을 자바로 디 컴파일하면됩니다 조금 겁 먹을 뿐이에요 지금까지 쉬운 이야기가 많이있었습니다 내가 이것을하면 – 여기에 그것은 간단합니다

내 람다는 어디 갔지? 글쎄, 컴파일러는 단순히 그것을 최적화했다 람다가 필요하지 않습니다 따라서 여기에 루프가 있고 모든 것을 인라인하면, 당신은 루프로 끝납니다 그게 전부 야 사고 방식의 큰 차이 자바 프로그래밍 언어 Kotlin 프로그래밍 언어에 아직도 람다를 사용하고 있지만, 람다 중 일부는 정말 무료입니다

그리고 그런데이 모든 것들도 무료입니다 표준 라이브러리에있는 수많은 람다 자유로운 추상화이다 당신은 그 (것)들을 부를 것을 지불 할 필요 없다 그것은 단지 당신을 위해 생성 된 코드 일뿐입니다 코 틀린에서 기능적 일뿐만 아니라 편리합니다

싼 말하자면 싸구려,이 예제를 살펴 보겠습니다 그래서 여기에서는 병렬 계산을하려고합니다 글쎄, 그건 바보 같은 표본이야 누구도 베어 스레드에서 병렬 계산을 수행하지 않으며, 등등

하지만 한 가지 요점을 설명하고자합니다 그래서 내가 여기서하고있는 것은, 다시, 내 오래된 습관을 염두에두고, 나는 100,000 개의 실을 만들고 있습니다 각각 10 만개의 스레드가 있습니다 사실, 1 초 동안 잠을 자면 숫자가 인쇄됩니다 그리고 나서이 모든 스레드에 참여해야합니다

내 주요 스레드 그럼 내가 이걸 실행하면 – 오, 오, 오, 그건 예외 였어 그게 뭐야? Java lang out of memory 오류입니다 기본적으로 나 한테 말하는거야, 이봐, 너 100,000 개의 스레드를 생성 할 수 없습니다 너 거기서 미치니? 100,000 스택입니다

그것은 기억에 맞지 않습니다 그냥 합리적 이군 그리고 그것은 공평합니다 OS 스레드는 저렴하지 않습니다 스레드에 대한 자원을 할당해야합니다

그래서 당신은 실로 그런 바보 같은 짓을하지 않습니다 그러나 나는이 예를 coroutines를 통해 가지고있다 코 틀린에서 코 루틴에 대해 누가 압니까? 오 좋네 프로덕션에서 누가 그들을 사용합니까? 좋아, 곧 너희 모두는 그것들을 사용할거야 그러니 여기서보세요

그것은 매우 동일한 코드입니다 그래서 여기에 나란히 놓을 것입니다 매우 많은 코드가 있지만 여기의 스레드 대신에, 코 루틴을 사용하는 비동기 작업을 만들고 있습니다 아래에 그래서 저는 여전히 1 초를 기다리고 있습니다

그리고 이걸 실행하면 기억이 없습니다 모든 숫자를 인쇄하고 있습니다 다시 코 틀린은 코 루틴을 도입했습니다 비동기로 만드는 수단으로 더 나은 계산 그게 효과가 있지만 그 비용은 얼마입니까? 그래서 그것의 비용은 적어도 더 싸다

각 계산마다 스레드가있는 것보다 물론, 아무도 그렇게하지 않습니다 그러나 여전히 코 루틴은 매우 싸다 당신은 100,000 개의 코 루틴, 100 만개처럼 스핀 할 수 있습니다 코 루틴 (coroutines)을 사용하면 비용이 거의 들지 않습니다 그 옛날 실처럼

코 루틴이 실제로 무엇인지 설명해 드리겠습니다 여기 좋네 여기에 레거시 인터페이스가 있습니다 나도 몰라 또는 [부적절한] 인터페이스 – 뭐든간에

그래서 우리는 비동기로 만들기 위해 종종해야만하는 일입니다 또는 우리의 의존성을 뒤집는 것과 같은 것을 만들거나, 등등은 콜백입니다 그래서 나에게 무언가를 해달라고 부탁하십시오 내가 너에게 해줄거야 그리고 내가 끝나면 알려주지

그래서 여기에 모의 서비스, 요청 및 콜백이 있습니다 함수가 전달됩니다 따라서 주석의 작업이 완료되면, 콜백을 호출하고 거기에 내 대답을 전달합니다 그래서 괜찮습니다 모두를 위해 일하고 있습니다

맞습니까? 그러나 이것은 코드가 다음과 같은 경우입니다 두 서비스간에 메시지를 교환하고 싶습니다 그래서 기본적으로 두 개의 메시지를 순서대로 보내고 싶습니다 그리고 여기에 내가해야 할 일이 있습니다 먼저 요청하십시오

그럼 콜백 이것은 요청의 결과입니다 나는 그것을 인쇄한다 그 콜백 내에서 다음 요청 그런 다음 안에 인쇄하십시오

그럼 여기 계단이 보이지, 그렇지? 한 걸음 오, 미안 한 단계, 두 단계, 세 단계

그리고 당신은 실제로 꽤 깊어 질 수 있습니다 이 계단을 내려 가면 좋지 않습니다 그래서 내가 정말로하고 싶어하는 것은 조금 더 간단합니다 하지만 이것은 일종의 용인입니다 하지만 만약에

그냥 상상해보십시오 n 통화와 같이해야합니까? 전화 번호를 정하는 것뿐입니다 이것이 제가 생각해 낸 코드입니다

전혀 좋지 않습니다 그래서 분명히 거기에 재귀가 필요합니다 콜백 내에서 콜백을 중첩해야하기 때문에 콜백 내에서, 맞지? 따라서 재귀가 필요합니다 이것은 내가 생각해 낼 수있는 가장 짧은 코드입니다 배열을 복사합니다

그러지 마 기억의 측면에서 낭비입니다 시간 낭비이다 그것은 2 차입니다 하지만 기본적으로, 당신은 올라와야합니다

이런 식으로 – 둥지 콜백처럼 콜백으로 콜백합니다 그래서 당신은 말할 수 없습니다, 좋아, 이것을 5 번 반복하라, 그렇지? 그래서 내가 정말로하고 싶어하는 것은 이 말처럼, 내가 방금 말한대로, OK, 하나의 요청 보내기, 결과를 기다리고 다른 요청을 보냅니다 그리고 내가 뭔가 반복하고 싶다면, for 루프로 반복하면됩니다 그래서이 코드는 실제로 같은 콜백을 사용하고 있습니다 코 루틴 추상화 만이 이것을 배포하고 있습니다

나에게서 따라서 실제로 콜백 기반 API를 사용할 수 있습니다 지금, 이것으로 바꾸세요 똑바로해라 몇 줄의 코드 만 있으면됩니다

내가 보여줄거야 그래서 이것은 동일한 서비스를 호출합니다 내가이 기능을 여기에 가지고 있기 때문에 그래서 내가하고있는 일은 요청을 돌리고 있습니다 이 단순한 구조를 통해 서스펜션 기능으로 내 콜백 서비스의 확장 기능입니다

내가 말하는 첫 번째 것은 내 coroutines를 중지합니다 그래서 나는 코 루틴에 있다고 가정하고 있습니다 나는 그것을 즉시 중단했다, 나는 나의 연속을 얻는다, 나는 나의 요구를한다 그게 전부 야 나는 정지 됐어

나는 요청을 기다리고있다 그래서 거기에 있습니다 그리고 요청이 완료되면, 나는 코 루틴으로 다시 시작한다고 말합니다 그게 전부 야 따라서이 간단한 코드를 사용하면 콜백 기반 API를 사용할 수 있습니다

coroutine API로 변환 할 수 있습니다 죄송합니다이 코드를이 코드로 만듭니다 제 감각으로는 훨씬 더 읽기 쉽습니다 당신이 그것을 좋아합니까 방법? 좋아, 관중석에 고개를 끄덕 거리다

고맙습니다 그래, 사실, 네가 원한다면 여기에 더 신중하게 – 그리고 네가 원한다고 확신 해 캐치 예외가 필요합니다 따라서 예외를 처리하는 것은 매우 중요합니다 그리고 이것만큼 쉽습니다

예외를 잡으십시오 무슨 일이 생기 든 오, 미안해

물론 여기가 아닙니다 귀하의 요청에 따라 어떤 일이 일어나든지, 그냥 잡으려고하고 resumeWithException 그래서 이것은 coroutines를 통해 예외를 전파 할 것입니다 아주 잘 그리고 여러분은 여기에 시도 잡기를 쓸 수 있습니다 – try catch와 함께 이것을 둘러 쌉니다

미안, 뭐든간에 예외를 잡아라 마치 순차적 코드처럼

그러나 밑에는 모두 비동기식입니다 이와 같은 asyncio 파일 시스템과 같은 HTTP 요청을 수행 할 수 있습니다 필요한 모든 것을 백그라운드 스레드로 처리 할 수 ​​있습니다 어떻게 좋지 않니? 그리고 나는 오늘 당신에게 보여줄 마지막 예를 생각합니다 이거 야

코 루틴이 어떻게 당신을 도울 수 있는지에 대한 또 다른 대변입니다 보세요 그래서 내가하고 싶은 것은 무한한 숫자의 흐름 무한한 숫자의 흐름을 좋아하는 사람은 누구입니까? 나는 그들을 아침 식사로 먹는다 그래서 나는 피보나치 시퀀스를 생성하기를 원합니다

그리고 나서, 나는 그들 중 20 명을 취할 수 있습니다 여기, 단지 20의 시퀀스 나는 200, 2,000 걸릴 수있어 필자는 필터링, 맵핑, 슬라이스 할 수 있습니다 이 buildSequence 함수는 라이브러리 함수입니다

Kotlin 표준 라이브러리에 있습니다 그리고 실제로 coroutine과 같은 메커니즘을 기반으로합니다 백그라운드 처리는하지 않습니다 그것은 모두 같은 스레드에 있어요 그것이 무엇인지, 그것은 여기에서 모든 산출량 진술을 취합니다, 그들을 순서대로 놓습니다

그래서 제가 여기서 무언가를 양보하고 싶다면, 그냥 할게요 나는 내 서열에 2를 삽입한다 내가 원한다면– 말하자면, tmp가 10보다 크면, 계속 – 나는 내 논리의 조각들을 건너 뛸 수있다 그래서 그것은 어떤 코 루틴처럼 간단합니다 그것은 당신에게 게으른 순서를 제공합니다

그래서 테이크 어웨이 수업은 저렴합니다 함수는 최상위 또는 로컬입니다 과부하가 없어서 기본값을 에뮬레이션합니다 속성 사용, 위임 된 속성 사용, 코 루틴 사용 좋은 Kotlin을 보내십시오 그리고 저는 오늘 좀 더 많은 활동을 광고하고 싶습니다

그래서 내가 아직 취할 수없는 질문이 있다면, 우리가 근무하는 12시 30 분까지 갈 수 있습니다 샌드 박스 영역으로 이동할 수 있습니다 우리가 코 틀린 부스에있는 C 적어도 하루는 그리고 내 이야기 ​​직후에 Jake Wharton의 Android KDX에 대한 이야기입니다 매우 흥미 롭습니다

2 단계에 있다고 믿습니다 그래서 거기에 오신 것을 환영합니다 주의 해 주셔서 대단히 감사합니다 [박수 갈채] [음악 재생]

WakeMeThere – GPS Alarm from MapFactor [Android] (2018)

목표를 넘지 마십시오! 돈을 절약하고 시간을 절약하며 관계를 저장하고 정시에 일하십시오! 통근하는 모든 사람들을위한 새로운 무료 안드로이드 앱 MapFactor에서 간단한 조작 GPS 알람을 설정하십시오

지도에서 목적지를 찾으십시오 지역을 들어가거나 나갈 때 경보를 선택하십시오 회로를 설정하십시오 이름 지정을 편집 할 수 있습니다 알람을 활성 또는 비활성으로 설정합니다

시간 알람 알람 시계를 설정하십시오 날짜와 시간을 설정하십시오 다시 걸기를 선택할 수도 있습니다 알람 이름을 편집 할 수 있습니다 Google Play 스토어에서 무료로 다운로드하십시오

Android Kotlin Tutorial: Converting Data types From One to Another

안녕 얘들 아 안드로이드 분기 별 튜토리얼에 오신 것을 환영합니다 이 비디오에서는 데이터를 변환하는 방법을 배우는 방법을 배우게 될 것입니다

하나에서 다른 유형으로 변환하므로 기본적으로 데이터 유형의 변환은 다음 중 하나입니다 가장 중요한 것은 당신이 알고있는 유용한 것입니다 때 기본적으로 무엇 때문에 안드로이드 개발에 관해서 무엇 데이터 유형 변환에 의해 문자열 데이터를 단순히 정수와 정수를 문자열로 변환하고 다른 것과 다른 것 float로 변환하는 정수 같은 다른 것들은 double로 떠있다 그래서 기본적으로 여기에서 사용하려고하는 것은 간단히 대답은 그것이 매우 유용 할 것이고 대부분 심지어 그것이옵니다 안드로이드에 대한 컵 내 응답은 in과 같은 입력 필드에서 사용할 것입니다

우리가 말할 수있는 Android는 편집 텍스트에서 텍스트를 편집하는 것입니다 알고있는 문자열의 정수 유형을 변환해야합니다 배열 목록이나 항목 목록 등에서 사용 가능하도록하겠습니다 우리가 그렇게 할 수있는 방법을 보았습니다 기본적으로 필요한 것은 모두 거기에 있습니다

우리는 단지 우리의 주요 기능인 기능을 시작해야합니다 모든 작품에 필요한 그래서 문자열 배열 괜찮아 이제 지금 지금 우리가 필요한 할 일은 먼저 문자열 인 변수를 요구할 것입니다 그냥 내 문자열 변수 변수와 그 유형은 봄이 될 것입니다 당신도 알다시피 1 2 3 그래서 당신도 알 것입니다 1 2 3은 실제로 숫자입니다 숫자 또는 정수형이지만이 과정을 두 배로 늘리면됩니다

문자열로 간주되지만 두 번째 문자열로 가져와야한다고 가정 해 봅시다 내 정수 변수 변수가 될 변수이며 이제 데이터를 내 문자열로 가져 오려고합니다 변수와 나는 그것을 실제로 정수인 두 번째 변수에 넣고 싶다 타입을 입력하면 두 번째에 처음 추가 할 때 볼 수 있습니다 행은 필수 정수 유형이지만 첫 번째 또는 my로 발견됩니다

string 변수를 하나의 문자열로 변환 할 수 있습니다 이 방법은 우리에게 당신을 가능하게하므로 단순히 두 문자열이라는 것을 사용하십시오 int를 표현하기 위해 단순히 문자열을 정수형으로 변환하라는 것을 알고 있어야합니다 이를 정수로 변환하면 두 개의 문자열이 무엇이든 문자열로 변환합니다 가자

시도해 보니 그 메시지를 인쇄하여 개인 변수 그래서 네가 번호를 얻으려고하는지 보자 아마도 이것은 동일한 결과를 얻을 것입니다 이것은 인쇄하는 것을 의미합니다 아무 의미가 없으므로 그냥 가서 내 이중 변수 인 또 다른 변수가있어 15

3에 대해 우리가 말하는 것은 15입니다 이제 저는 플로트 한 다음 플로트했습니다 변수는 float 유형이고 내 double에서 데이터를 가져 오려고합니다 변수를이 플롯에 넣으십시오 내 정수 변수 인 정수형이므로 내 정수 변수 우리가 실제로 플로트를 여기에 사용하기 때문에 단순히 float을위한 것입니다

그래서 우리는 그렇게해야합니다 그래서 두 번에 데이터를 얻으려고 노력합니다 그래서 제 두 배의 문이 접혀서 무엇이든 그렇게 간단하게 될 것입니다 flood에서 데이터를 가져 와서 홍수가 314 한 F 그래서 왜 플로트 선언을하고 마지막으로 F를 추가해야하는 값을 추가합니다

F는 플로트임을 나타냅니다 가치 그래서 우리는 float에서이 데이터를 가져 와서 간단하게 말할 수 있습니다 그 내 플로트 변수 괜찮아 그래서 그것은 그 일에 대해 검색 할 수 없습니다 그래서 내 플로트 반란군과 두 번 그래서 우리는 그냥 플로트로 변환 할 수있는 두 번 그래서 두 분은 두 분이 계시군요 만약 당신들이 어떤 종류의 질문을하거나, 너는 나에게서 다른 것으로 전환 할 때 문제를 안다 그러면 나에게 알린다

그래서 나는 또한 정수 문자열 변환 K로 문자열을 보여줄 것이다 희망적으로 이것은 괜찮을 수 있습니다 하나 하나 2 3 1 2 5 값을 주자 문자열에 데이터를 가져 와서 간단히 정수형 변수를 얻고 싶습니다 문자열 괜찮아요 두 문자열은 이제 그것을 정수로 변환됩니다 문자열 및 이것은이 층을 이중으로 변환하므로 매우 높습니다

당신이 알고 있기 때문에 안드로이드 개발에 관해서 유용합니다 예를 들어 편집 텍스트 값을 변환하는 측면에서 고도의 사용자 다른 것들 예를 들어 예를 들어 무엇을 말해야합니까? 예를 들면, Google 검색을 검색하는 경우 1986 년부터 영화를 알고 있다고 말하면 1986은 하나의 예가되도록 문자열로 간주되어야합니다 꽤 많은 일이있을 것이고 잘하면 우리는 그 안드로이드 개발에 그렇게 너희들이 아이디어를 구입 희망 데이터 유형을 하나에서 다른 유형으로 변환하여 내 다음 비디오 평화에서 너를 보아라

LG G2 Downgrade from Lollipop to KitKat tutorijal

안녕하세요 이 비디오에서는 LG G2를 Lollopop에서 KitKat으로 다운 그레이드하는 방법을 설명합니다

가장 먼저해야 할 일은 휴대 전화를 끄는 것입니다 그 후 볼륨 업 버튼을 길게 누른 다음 USB 케이블을 연결하고 화면이 켜지기를 기다립니다 이런 식으로! 그런 다음 버튼을 놓습니다 다음 단계는 LG 플래시 툴을 다운로드하는 단계입니다 링크는 설명에 있습니다 플래시 도구를 사용하기 전에 LG G2 드라이버와 Lg G2 Firmware를 설치해야합니다 LG G2 드라이버에 대한 직접 링크는 설명에 있습니다

절차가 쉽습니다 쉽게 찾을 수있는 Firmware "LG G2 firmeware"를 검색하여 여기와 같은 첫 번째 결과로 이동하십시오 그런 다음 NEU / EUROPE OPEN V20H를 찾아 다운로드해야합니다 V20은 KitKat firmeware V30입니다

Lollipop firmeware입니다 여기에서는 세르비아어 및 크로아티아어 펌웨어를 보여줍니다 countrie의 펌웨어를 찾아서 다운로드 할 수 있습니다 절차는 동일합니다 우리가 필요로하는 다운로드가 완료되었습니다

설치를위한 첫 단계는 LG G2 druvers 설치입니다 언어를 선택하고 다음을 누르면, 그리고 기다림과 발걸음을 기다린다 오른쪽 아래 모서리에서 드라이버가 올바르게 설치되었는지 확인할 수 있습니다 확인을 누릅니다 이것은 운전자를위한 모든 직업입니다

다음 단계는 LG 전자 플래시 도구입니다 비디오 에서처럼 할 수 있습니다 잠깐 열어 봐 이거 야 비디오를 클릭하고 firmeware를 선택하십시오

그런 다음 CSE 플래시를 클릭하십시오 그 후 START를 누릅니다 다음 창을 기다려 countont를 바꾸지 마라 코리아가 있어야합니다

언어는 영어로 선택하십시오 그리고 OK를 누릅니다 Instaling 소프트웨어가 시작되었습니다 아무 것도 만지지 말고 프로세스가 끝날 때까지 대기하십시오 설치 도중 화면이 보입니다

보시다시피, 설치에는 약 4 분이 걸렸습니다 이거 야 설치가 완료되었습니다 이제 다운로드받은 소프트웨어의 압축을 푸는 것과 같은 화면이 나타납니다 이제 USB 케이블을 제거 할 수 있습니다

포장 풀기에는 5-10 분이 걸립니다

All Android Easter Eggs – From Gingerbread to Oreo

긴 보도 긴 보도 5 번 가볍게 두드립니다 5 번 가볍게 두드립니다

그리고 긴 언론을 만드십시오 지체인들에게는 유감입니다 그것은 게임과 같은 flappy 새입니다 5 번 가볍게 두드립니다 그리고 긴 언론을 만드십시오 이전 게임처럼 멀티 플레이 게임처럼! 5 번 가볍게 두드립니다 그리고 긴 언론을 만드십시오 1 – 2 시간 동안 기다려보세요