글

iOS How to use Text To Speech(TTS)

이미지
운영 체제: macOS Ventura 13.2.1 사용 버전: Xcode 14.3, Swift, SwiftUI ​ iOS How to use Text To Speech(TTS)를 알아보겠습니다. ​ 오늘은 iOS에서 Text To Speech(TTS)를 사용하는 방법을 알아보겠습니다. ​ Text To Speech는 글자를 읽어주는 기능입니다. iOS 내부에는 Voice Over라는 기능이 있습니다. 이러한 기능을 사용하면 자동으로 글을 읽어주는데요. 오늘 다룰 내용은 이 Voice Over가 아닌 AVSpeechSynthesizer(), AVSpeechSynthesisVoice(), AVSpeechUtterance()를 사용할 겁니다. ​ ​ Speech Synthesis 문서는 아래에 있습니다. https://developer.apple.com/documentation/avfoundation/speech_synthesis 버튼을 누르면 말을 하게 만들 거라서 버튼을 하나 만듭니다. 9 번째 줄처럼 import AVFoundation을 적어줍니다. 16 번째 줄처럼 AVSpeechUtterance를 사용합니다. string에는 말하고 싶은 내용을 넣습니다. 저는 스타워즈의 포스가 함께 하길(May the Force be with you)를 적어봤습니다. AVSpeechUtterance에는 몇 가지 조정할 수 있는 설정들이 있습니다. 18 번째 줄의 rate는 말하는 속도. 19 번째 줄의 pitchMultiplier는 음 높낮이. 20 번째 줄의 postUtteranceDelay는 여러 음성이 실행되기를 기다릴 때, 그 사이의 간격. 21 번째 줄의 volume은 소리의 크기. 다음은 목소리를 설정합니다. AVSpeechS...

Android Testing android apps

사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2 ​ 안드로이드 Testing android apps를 알아보겠습니다. ​ ​ 안드로이드 테스트에 대해서 알아보겠습니다.  ​ 테스트 관련 문서는 아래에 있습니다. ​ https://developer.android.com/training/testing 테스트는 다음과 같은 장점이 있습니다. 실패에 대한 빠른 피드백. 빠른 오류 탐지. 안전하게 코드 리팩토링. 안정적인 속도로 개발. ​ ​ 안드로이드 앱을 테스팅 하는 기본적인 것들을 알아봅시다. https://developer.android.com/training/testing/fundamentals 개발자가 직접 테스트를 진행할 수 있습니다. 시스템 언어를 변경한다든지, 다른 디바이스로 실행해 본다든지 등입니다. 하지만, 이러한 테스트는 놓치는 부분도 많고 좋지 않습니다. 따라서, 자동화된 테스트를 만들게 되면, 빠르고 쉽게 테스트할 수 있습니다. ​ 테스트에는 목적과 범위에 따른 구분이 있습니다. 목적에 따라 기능적 테스트: 내 앱이 예상대로 작동하는지? 성능 테스트: 빠르고 효과적으로 시행되는지? 접근성 테스트: 접근성 기능들을 잘 제공하는지? 호환성 테스트: 모든 디바이스와 API level에서 잘 동작하는지? ​ 범위에 따라 Unit tests 또는 small tests: 함수와 클래스 범위에서 테스트. End-to-end tests 또는 big tests: 전체 화면 또는 user flow 테스트. Medium tests는 여러 units을 통합하여 테스트. ​ ​ 테스트 위치에 따라서 장치에서 또는 내부에서 테스트하는 것으로 구분할 수 있습니다. Instrumented tests는 실제 기기나 에뮬레이터를 실행하여 테스트하는 것을 말합니다. 보통 UI tests, 앱 실행, 상호작용을 테스트. Local tests는 개발하던 장치 또는 서버에서 테스트합니다. 따라서...

Android Nested navigation graphs

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2 ​ 안드로이드 Nested navigation graphs를 알아보겠습니다. ​ 네스티드 내비게이션 그래프는 여러 내비게이션 그래프를 하나로 묶어서 표현할 수 있습니다. 재사용성이 좋습니다. ​ Nested navigation graphs의 문서입니다. https://developer.android.com/guide/navigation/navigation-nested-graphs BottomNavigationView를 사용할 경우, Nested navigtion을 사용하지 않으면 하이라이트가 제대로 작동하지 않는 버그가 발생합니다. 아래를 보시면, History에서 Single을 눌렀음에도 하이라이트는 History에 고정되어 있습니다. 색깔이 잘 안 보이네요. 이러한 문제를 해결하려면 필요한 게 Nested navigation입니다. ​ ​ 아래와 같은 그래프가 있습니다. 여기서 settingsFragment의 경우 두 군데에서 호출되므로 Nested로 만들고, 그리고 titleFragment와 연결된 fragment는 bottomNavigation의 Single 탭에 넣어야 하므로 Nested로 만듭니다. 원하는 것들을 선택한 다음,  상단에 있는 Group into nested graph를 누릅니다. 그럼 그래프가 이렇게 변경됩니다. ...

Android Activity Lifecycle 2

안드로이드 Activity Lifecycle 2를 알아보겠습니다. ​ Activity Lifecycle 글은 아래에 있습니다. https://shwoghk14.blogspot.com/2020/05/android-activity-lifecycle.html ​ Activity의 Lifecycle에 대한 문서는 아래에 있습니다. https://developer.android.com/guide/components/activities/intro-activities onCreate() 시스템이 activity를 생성할 때, 실행됩니다. activity에 필요한 필수 요소들을 초기화해야 합니다. 예로 들면 뷰를 생성하거나 데이터를 리스트에 연결하는 등의 행위 등이 있습니다.  가장 중요한 것은 activity의 유저 인터페이스를 정의하기 위해 setContentView를 반드시 실행해야 합니다. ​ 전체 lifecycle 중에서 한 번만 실행됩니다. 리스트에 data를 bind 하거나 viewModel에 연결하거나, class-scope 변수들을 초기화합니다. onCreate()에서는 savedInstanceState 변수를 Bundle로 받습니다. activity가 이전에 존재하지 않았다면, savedInstanceState는 null 값을 가집니다.  ​ ​ onStart() onCreate()가 완료된 다음에 실행됩니다. Activity가 Started 상태에 들어가게 되고 비로소 사용자의 눈에 보이게 됩니다. onStart()에서는 activity가...

Algorithm Ford-Fulkerson and Edmonds-Karp algorithm

이미지
알고리듬 Ford-Fulkerson and Edmonds-Karp algorithm을 알아보겠습니다. 포드 풀커슨 알고리듬과 에드몬드 카프 알고리듬은 최대 유량을 구할 때 사용하는 알고리듬입니다. ​ ​ 아래와 같은 배관이 구성되어 있습니다. 0에서 4로 흐를 때, 최대로 많이 4로 흘러들어가는 값은 몇일까요? ​ ​ 이러한 문제를 풀기 위해서 고안된 게 포드 풀커슨 알고리듬입니다. ​ 이 알고리듬이 작동하기 위해서는 아래의 4 가지를 가정하고 진행합니다. 1. 허용량 이상으로 흐를 수 없다.     (0 -> 1은  3을 초과해서 흐를 수 없다.) 2. u에서 v로 흐르는 값은 v에서 u로 음수로 흐른다고 표현할 수 있다.     (0 -> 2로 2가 흐르면, 2 -> 0로 -2가 흐른다고 표현할 수 있다.) 3. u가 시작점과 끝점이 아니라면, 들어온 만큼 소비를 한다.     (0->2로 2 만큼 들어갔다면, 2에서 나가는 모든 방향의 흐름의 양은 2가 되어야 한다.) 4. 시작점에서 나온 흐름은 끝점으로 모두 들어가야 한다.     (0에서 5가 나온다면, 4에 5가 들어가야 한다.) ​ ​ 이 알고리듬의 핵심은 다음과 같습니다. 1. 모든 흐름을 0으로 만듭니다. 2. 시작점에서 끝점으로 가는 길을 찾습니다. 이때 길은 남은 용량이 0 보다 커야 합니다. 2-1. 찾은 길에서 가장 적은 용량을 찾습니다. 2-2. 찾은 길에 2-1에서 찾은 값을 흘려 더합니다. ​ 위의 2 번의 과정에서 DFS(...

Android Room database migration test

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2 ​ 안드로이드 Room database migration test를 알아보겠습니다. ​ 룸 데이터베이스는 version으로 관리됩니다. 이 Room database의 Table이나 Entity가 변경되게 되면, 버전이 다름을 감지하고 충돌을 일으키며 앱을 종료시킵니다. 따라서 이러한 변경을 적용하기 위해서 Migration이라는 기능을 제공해 주는데요. 이 Migration을 제대로 작성했는지 확인하기 위해 Test를 진행합니다. Room database 사용법은 아래 글을 참조해 주세요. https://shwoghk14.blogspot.com/2020/06/android-room-database-1.html 마이그레이션을 진행해 봅시다.​ https://developer.android.com/training/data-storage/room/migrating-db-versions#test 테스트를 위해서는 room-testing이라는 Maven을 사용합니다. 그리고 schema를 export 해야 합니다. ​ 이제 진행해 봅시다. CommandLineArgumentProvider를 정의합니다. ​ 앱 용 build.gradle로 갑니다. ​ 가장 밑에 RoomSchemaArgProvider class를 정의합니다. CommandLineArgumentProvider를 상속받습니다. RoomSchemaArgProvider 생성자를 만들고 asArguments를 Override 합니다. 위로 올라가서 ...