2021의 게시물 표시

자연

자연 ​ 자연은 항상 고통만 주지 않는다. ​ - 노재화, 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다 2』, 부크크(2021), 30 쪽. 카테고리: My Book Story

Android Set exact alarm on Android 12

이미지
사용 언어: Kotlin 1.6.10 사용 버전: Android Studio 2020.3.1 Patch 4 ​ 안드로이드 Set exact alarm on Android 12를 알아보겠습니다. ​ Android 12(API 31) 이상에서 정확한 알람 설정은 사용자의 권한이 필요합니다. ​ 여기서 말한 정확한 알람이란, setExactAndAllowWhileIdle() 같은 API를 말합니다. AndroidManifest.xml로 갑니다. 권한을 설정해 줍니다. <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> AlarmManager를 만듭니다. 코드 안에서 권한을 확인하는 부분을 만듭니다. canScheduleExactAlarms()가 참이면 권한이 설정된 상태입니다. 거짓이면 else로 가게 됩니다. else에 있는 코드는 권한 설정을 위한 설정 창으로 이동하는 코드입니다. ACTION_REQUEST_SCHEDULE_EXACT_ALARM 실행해 보겠습니다. ​ 설정할 수 있는 창이 나옵니다. 끝. 카테고리: Android

Android Use a MaterialAlertDialogBuilder

이미지
사용 언어: Kotlin 1.6.10 사용 버전: Android Studio 2020.3.1 Patch 4 ​ 안드로이드 Use a MaterialAlertDialogBuilder를 알아보겠습니다. ​ MaterialAlertDialogBuilder는 Material에서 제공해 주는 Dialog 기능을 사용할 수 있게 해줍니다. ​ Material을 사용할 수 있는 기본 설정을 해줍니다. https://shwoghk14.blogspot.com/2020/06/android-material-components.html MainActivity에서 사용해 보았습니다. MaterialAlertDialogBuilder를 불러옵니다. setTitle은 Dialog의 제목을 의미합니다. setPositiveButton은 긍정의 버튼을 의미합니다. () 안에는 버튼의 글자, {} 안에는 버튼을 눌렀을 때 작동되는 코드를 적어줍니다. setNegativeButton은 부정의 버튼을 의미합니다. () 안에는 버튼의 글자, {} 안에는 버튼을 눌렀을 때 작동되는 코드를 적어줍니다. setMessage는 Dialog의 본문 내용을 의미합니다. show는 Dialog를 보여줍니다. 한 번 실행해 보겠습니다. 끝. 카테고리: Android

Android NavDeepLinkBuilder use on Android 12

이미지
사용 언어: Kotlin 1.6.10 사용 버전: Android Studio 2020.3.1 Patch 4 ​ 안드로이드 NavDeepLinkBuilder use on Android 12를 알아보겠습니다. ​ NavDeepLinkBuilder를 Android 12(API 31)에서 사용해 봅시다. ​ Android에서 PendingIntent를 만들 때, Android 12(API 31)부터는 FLAG_IMMUTABLE 또는 FLAG_MUTABLE이 필요합니다. 아니면 오류가 발생합니다. ​ 아래는 NavDeepLinkBuilder로 PendingIntent를 만드는 코드입니다. FLAG를 적어주는 곳이 없죠? 그런데 실행하면 오류가 발생합니다. 그러면 이렇게 생각할 수 있습니다. NavDeepLinkBuilder는 Android 12에서는 못쓰는 거야? 아닙니다. 아래는 NavDeepLinkBuilder가 들어있는 Navigation Library입니다. ​ ​ https://developer.android.com/jetpack/androidx/releases/navigation 여기를 보면, Version 2.4.0-alpha04부터 FLAG_IMMUTABLE이 추가된 것을 볼 수 있습니다. ​ 그냥 Library를 2.4.0-alpha04 이상으로 올려주면 됩니다. ​ 현재 최신 버전은 2.4.0-rc01입니다. 뒤에 beta나 rc가 붙는 건 아직 실험 중인 단계이고 정식 버전이 아니라는 뜻입니다. app 용 build.gradle로 갑니다. Sync Now를 눌러줍니다. ​ ​ 끝.

해야 할까? 말아야 할까? 할 때에는

해야 할까? 말아야 할까? 할 때에는 ​ 해야 할까? 말아야 할까? 할 때는 미래의 나에게 미안하지 않게 결정하자고 생각하라. ​ - 노재화, 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다』, 부크크(2021), 12 쪽. 카테고리: My Book Story

Data Analysis 시작하기 7 (복습: 준비)

이미지
사용 언어: Python 3.7.9 운영 체제: Windows 11 Home 21H2 ​ 데이터 분석 시작하기 7 (복습: 준비) ​ 자 한 번 해봤으니 다시 처음부터 해봅시다. 이번에도 재미있는 데이터를 찾아봤습니다. https://www.kaggle.com/uciml/adult-census-income 수입이 많다 적다를 예측하면 될 것 같네요. 라이선스를 확인해 주고요. ​ ​ ​ 데이터 자료형도 한 번 봐줍니다. 끝. 카테고리: Data Analysis

Data Analysis 시작하기 6 (추정과 예측)

이미지
사용 언어: Python 3.7.9 운영 체제: Windows 11 Home 21H2 ​ 데이터 분석 시작하기 6 (추정과 예측) ​ 지금까지 기본적인 분석을 해보았는데요. 여기서 끝내면 아쉬우니 더 진행해 봅시다. 우리가 데이터를 분석하는 이유는 추정과 예측을 하기 위해서입니다. 저도 정확한 차이는 모르는데요. 추정은 기존의 데이터 범위에서 없는 자료를 분석해서 비어있는 공간을 채우는 것이고 예측은 기존 데이터의 범위를 벗어난 부분을 채우는 것이라고 저는 그냥 이해했는데요. 뭐 똑같은 거 아니냐 할 수 있는데 저도 모릅니다. 그냥 넘어가도록 하죠 헤헤. ​ LinearRegression을 쓰거나, RandomForest, XGBoost 등으로 예측을 할 수 있을 텐데요. 저는 뭐 모르니까 그냥 Tensorflow로 인공지능을 만들어서 예측해 보겠습니다. ​ ​ 그래프를 보면, 딱히 강수량과 온도와 큰 관계가 없어 보이기도 합니다. 강수량이 적을 때도 저렇게 치솟는 게 보이니까요. 흠. 그래서 이런 고민은 그냥 인공지능에게 맡기기로 하죠. 알아서 잘 찾아주겠죠. 후훗. ​ ​ 필요 없는 column은 drop()으로 제거할 수 있습니다. x에는 학습에 사용할 데이터를 모아놓고, y에는 x를 통해 예측할 값을 넣습니다. ​ 시계열의 경우 시간이 숫자가 아닌 주기성을 지닌 값으로 변환해 줘야 합니다. cosine과 sine을 사용하면 주기성을 지닌 데이터로 변환이 됩니다. x_data에서 date는 cosine, sine으로 변경했기 때문에 date를 제거합니다. x_data와 y_data는 아래와 같은 상태입니다. 사실 마음에 드는 데이터가 없네요. 예측이 잘 안될 거 같아요 저걸로 어떻게 예측이 되겠습니까...

가장 어두울 때

가장 어두울 때 ​ 가장 어두울 때는 눈을 감고 있을 때이다. 눈을 떠라. ​ - 노재화, 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다』, 부크크(2021), 4 쪽. 카테고리: My Book Story

따뜻함

따뜻함 ​ 그대의 따뜻한 말과 온기가 아직 나에게 남아, 이 얼음처럼 차가운 세상에 내가 당당히 설 수 있게 해줍니다. - 노재화, 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다』, 부크크(2021), 50 쪽. 카테고리: My Book Story

Data Analysis 시작하기 5 (데이터 관계 보기)

이미지
사용 언어: Python 3.7.9 운영 체제: Windows 11 Home 21H2 ​ 데이터 분석 시작하기 5 (데이터 관계 보기) ​ 이번 시간에는 데이터의 관계를 확인해 보는 시간을 가져보겠습니다. ​ 데이터 간의 상관관계를 보려면 corr()를 사용합니다. 1에 가까울수록 양의 상관관계, -1에 가까울수록 음의 상관관계를 가집니다. 이것을 시각화해서 보겠습니다. 우선 그래프를 그릴 수 있는 창을 만드는 matplotlib와 다양한 그래프를 지원해 주는 seaborn이 필요합니다. 설치는 cmd 창에 pip install로 해도 되고, jupyter-lab에서 설치해도 됩니다. 느낌표를 사용하면 명령어를 실행할 수 있습니다. !pip install matplotlib !pip install seaborn import를 해줍니다. 시각화를 위해 sns.heatmap()을 사용합니다. data에는 그릴 데이터를 넣고, annot는 숫자 표시를 나타냅니다. fmt는 숫자 표현 방식, linewidths는 각 칸 간의 간격, cmap은 사용할 색깔을 나타냅니다. 이 표만 봤을 때에는 기온과 모기 지수와의 관계가 0.7로 높아 보이네요. 그런데 생각해 보면, 여름에 모기가 나타나고 겨울에 모기가 없으니까 기온이 큰 이유라고 단정 지을 수가 있을지 모르겠네요. ​ ​ piar 그래프를 한 번 그려봅시다. sns.pairplot()을 사용합니다.

Android Make a Bluetooth Low Energy(BLE) GATT server 4

이미지
사용 언어: Kotlin 1.6.10 사용 버전: Android Studio 2020.3.1 Patch 4 ​ 안드로이드 Make a Bluetooth Low Energy(BLE) GATT server 4를 알아보겠습니다. ​ 저번 시간에는 characteristic에 읽기 쓰기 응답을 해보았습니다. 이번에는 Notification을 보내는 방법을 알아보겠습니다. ​ ​ notification 설정은 보통 descriptor 0x2902에서 처리합니다. descriptor 읽기 쓰기 응답을 준비합니다. Client에서 0x2902를 읽거나 쓰기 할 때 요청을 해줘야 하니까요. ​ ​ BluetoothGattServerCallback()에서 onDescriptorReadRequest와 onDescriptorWriteRequest를 override 합니다. notification을 전송할 장비들을 모아놓은 변수를 하나 만듭니다. 만약 notify에 있는 장비면 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE를 반환하고, 아니면 BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE를 반환합니다. onDescriptorWriteRequest에 이제 nofityDevice 등록을 위한 코드를 만듭니다. descriptor에 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE 값이면 NotifyDevices에 장비를 더합니다. 아니면 삭제합니다. 이제 Notification을 보내보겠습니다. 이전 시간에 만든 onCharacteristicWriteRequest에 갑니다. 아래처럼 있는데 notification을 보내는 행위를