- 1. MVVM architecture for Frontend apps (Model-View-ViewModel)
- 2. 今更だけどGoogle Playのアカウント削除要件のリンク先について勘違いしていたかも。
- 3. Kotlinでビット単位のデータフォーマットをパースする
- 4. [Kotlin] なぜMutableListとListが分かれているのか
- 5. FlutterアプリでSQLインジェクションを試す
- 6. Android11以上で別パッケージにbindServiceしても接続できない場合の改善策
- 7. Flowと友だちになる~初対面編~
- 8. KotlinでAndroidのTODOアプリを作る Part1
- 9. Android TVの実機デバイスを安定してデバッグする
- 10. Baseline Profileの生成をBaseline Profile Gradleプラグインに置き換える
- 11. ComposeでMarkdownを表示するには
- 12. オレオレステータスボードを作ってみた
- 13. screenWidthDpをpxに変換すると値が小さくなります。
- 14. メモ:P20liteリカバリーなどの入り方
- 15. 【Android】Contextって何者なん?~Activity Context編~
- 16. ダークモード対応する際の見積もり手法
- 17. material3.ModalBottomSheetの使い方とTips・トラブルシューティング
- 18. Androidでメディア再生の問題を調べる
- 19. Next.js Native使ってみた
- 20. Androidエミュレーターの通信をBurp Suiteで取得する
MVVM architecture for Frontend apps (Model-View-ViewModel)
## Overview
MVVM stands for Model-View-ViewModel, which is a software architectural pattern used in application development, particularly in user interface (UI) development. MVVM is often associated with frameworks like Xamarin, Angular, and Vue.js for web and **mobile application development** (Android, iOS, Flutter).
![mvvm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636261/60be9885-0fdd-8700-105f-1a9b40202773.png)
:::note info
This image illustrates the MVVM architect
今更だけどGoogle Playのアカウント削除要件のリンク先について勘違いしていたかも。
こんにちは、個人でアプリ開発をしているYuKiOです。これまで最高にかっこいいメモアプリ「Hacker Memo」など 15本アプリをリリースしています。
この記事を書いているのは2023/12/6です。
Androidアプリに関して、2023/12/7までに「アカウントの削除に関する新しい質問」に回答しないと、アプリが削除対象になるかもしれないので対応必須なのですが、この対応方法について勘違いが発生している可能性があるため書いています。(延長申請をすれば期限は伸びます)
というのは、アプリ内でアカウントを作成している場合は、アプリストアにユーザーがアカウントと関連データの削除をリクエストする場合に使うリンクを指定する必要があります。
このリンクが曲者で対応をどうするか悩んでいる人も多いと思います。
## 削除フォームのセキュリティリスク
この対応についてGoogleフォームでアカウント削除依頼フォームを作ったら審査が通ったという記事を見かけました。行動力やアイデアは素晴らしいとは思ったのですが、セキュリティ的によろしくないと思ったわけです。というのは可能性は低くとも悪意
Kotlinでビット単位のデータフォーマットをパースする
# はじめに
少し前にKotlinで、ビット単位でデータフォーマットが決まっているデータをBLE経由でAndroidが受信し、フォーマットに従ってKotlinの`data class`で扱えるようにする実装をしました。
その時にビット単位での処理を実装した際に、細々としたことで苦労した記憶があったので、備忘録として書き出そうと思って、この記事を書きました。
何かの参考になれば幸いです。
また、記載しているコードの処理の中でより良くするアイデアがあれば、ご教授いただければと思います!# シナリオ
今回、以下のように環境センサーから定期的にセンサー値が通知されるものとします。“`
[Android] <- SensorData - [環境センサー] ``` Android側で以下のデータフォーマットを`ByteArray`で受信するとします。 ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
[Kotlin] なぜMutableListとListが分かれているのか
# はじめに
Kotlinでは`add`や`remove`などの変更ができる`MutableList`と、変更ができない`List`が分かれています。なぜこのように分ける必要があるのでしょうか?
このようなタイトルですが、本記事は`MutableList`と`List`の話に限定されません。
Kotlin(などの参照型中心の言語)には`MutableXXX`: ミュータブルクラスと`XXX`: イミュータブルクラスの二つのクラス(インターフェース)に分かれて設計されているケースが多くあります。なぜこれらを分ける必要があるのでしょうか?# valとvar
「`var`は変数だから変更ができて、`val`は定数だから変更できない」のように簡潔に説明されることが多いかなと思います。
“`kotlin
var a = 0
a += 1val b = 0
// b += 1 コンパイラエラー
“`この話には続きがあります。
# valは「参照」を定数にするだけ
valが定数(変更不可)にするのは
**クラスの「参照」だけであって、「実態」=クラスの中身は変更できます。
FlutterアプリでSQLインジェクションを試す
## はじめに
普段はWebアプリケーション脆弱性診断に関わる業務を行っています。
最近、Flutterアプリの脆弱性診断が増えてきているのでどのようなソースコードで脆弱性が入るのか体験してみました。
脆弱性を試すのが目的だったので、シンプルなアプリを作ってSQLインジェクションを入れてみました。
ここではSQLインジェクションを実装したところをメインに紹介します。## 動作確認環境
– macOS Ventura 13.6.2
– Flutter 3.13.3
– Dart 3.1.1
– sqflite 2.0.2## 該当のソースコード
Androidアプリで、タイトル検索時のクエリでインジェクションできるようにしています。
※データストアはSQLiteを利用していて、sqflite経由でアクセスしています。“`
static Future>> searchNotes(String title) async {
final db = await NoteViewModel.db();
r
Android11以上で別パッケージにbindServiceしても接続できない場合の改善策
### 概要
Android11から(api30+)自身のアプリ以外のパッケージとプロセス間通信するとき、AndroidManifestの追記をしないと通信できない。
### 解決した問題の症状
##### 前提
– Android11以上の端末またはエミュレータ
– プロセス間通信を行う2つのアプリ共に自作(Kotlin)##### 症状
呼び出し元から別アプリのサービスを指定してbindServiceしても返り値がずっとfalseになる(繋がらない)。
時系列順で症状に至るまでの経緯を列挙する。– targetSdkのバージョンがすべて28のまま二つのアプリを作成
– 接続先のアプリにバインドされるServiceを記載し、ビルドしてインストール
– 接続元から対象ServiceをbindSereviceするコードを書いて、こちらもビルドしてインストール
~~~ kotlin:
val intent = Intent(“testPackage.server.targetService”).setPackage(“testPackage.server”)
val re
Flowと友だちになる~初対面編~
:::note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) シリーズ8の6日目の記事です。
:::### 対象者
Flowが初めましての方。### この記事のゴール
Flowの値の流れが理解できる。
Flowの使い方がなんとなく理解できる。## Flowとは?
**・コルーチンの一種
・複数の値を順次出力できる。
・新しい値を非同期に生成して使用できるため、メインスレッドをブロックすることなく、安全にネットワークリクエストを行うことができる。
・Flowは大きく3つの役割を持っている。**⚪︎流す値を出力する
⚪︎ストリームに流れている値やストリームそのものを変更(加工)する
⚪︎流れてきた値を使用するイメージ図(桃太郎版)
![qiita_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617897/380163c5-d3
KotlinでAndroidのTODOアプリを作る Part1
# はじめに
本記事は[ジーズアカデミー 技術記事書いてみた編 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/gsacademy)の5日目の記事です。
僕はちょっとした作業のやり忘れが多く、例えば「洗濯機のスタートを押して洗濯を始める」「電気を切ってから仕事に行く」「自転車の鍵をかける」なんかを良くやり忘れてしまう。
ついに妻から軽いADHDなんじゃないかと言われてしまったが、自分でもそうだと思うくらい抜けていると思う。こういった時の対処法としては
1) 忘れ物をしないように意識する
2) TODOアプリを作る
の2択と相場は決まっているが、(1)は無理なので実質ToDoアプリを作るしか対処法はない。28年の我が人生を振り返って意識改で忘れ物がなくなるわけがないと胸を張って言える。
自分はandroidを使っているのでKotlinでTodoアプリを作る。
(Flutterも興味あるが、Kotlinがやりたい)# 想定読者
* Androidアプリ初心者
* Androidアプリ開発に興味があ
Android TVの実機デバイスを安定してデバッグする
# 概要
この記事はFire TV・Android TVなどのAndorid製テレビデバイスの実機デバッグ方法や注意点についてまとめたものです# デバッグ方法
デバッグにはPCに直接デバイスを繋げてデバッグする方法と、ネットワークを使用してデバッグする方法の2つあります。
理由は後述しますが、個人的にはネットワーク接続でのデバッグを推奨するので今回はその方法でやっていきます## Fire TV系の場合
### 使用する端末
Fire TV Stick 4K Max
### デバッグ方法
#### 1. 開発者オプションの有効化
設定→マイFire TV→バージョン情報→デバイス名(今回は Fire TV Stick 4K Max) を開発者オプションが有効になるまで複数回クリックします
#### 2. ADBデバッグの有効化
設定→マイFire TV→開発者オプション→ADBデバッグ をクリックしてADBデバッグを有効化します
#### 3. IPアドレスの確認(同じネットワークに繋がっている必要があります)
設定→マイFire TV→バージョン情報→ネットワーク から接続して
Baseline Profileの生成をBaseline Profile Gradleプラグインに置き換える
androidx.benchmark 1.2 以降で登場した Baseline Profile Gradleプラグインを使うことで Baseline Profile の生成がこれまでの実装より簡略できるので、置き換え手順を書いていきます。
これまで Baseline Profile の生成をしていなかったプロジェクトでは、Android Studio Iguana 以降で追加予定の Baseline Profile module のテンプレートで簡単にセットアップできるようになります。
https://developer.android.com/topic/performance/baselineprofiles/create-baselineprofile#create-new-profile
## 移行手順
### Gradle プラグインの追加Baseline Profile Gradleプラグインの依存を追加してプロジェクトで使えるように設定します。
“`libs.versions.toml
[plugins]
…
baselineProfilePlu
ComposeでMarkdownを表示するには
# 初めに
[ポート株式会社 サービス開発部 Advent Calendar 2023](https://adventar.org/calendars/9156) 5日目の記事です。
![スクリーンショット 2023-12-05 11.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179470/427216d2-62b6-76b6-24da-c30f9ded8b7a.png)
こんにちは。[ポート株式会社](https://www.theport.jp)でAndroid開発をしている[shxun6934](https://twitter.com/shxun6934)です。
自分が担当しているプロジェクトにJetpack Composeを入れて1年が経ちました。(早いw)
新規機能を作成する際に、Jetpack Composeを使用してガンガン開発を進めています。その新規機能を作成するタスクの中で、WebのAPIのデータからmarkdownの文字列を取得し、そのデータを表示する要件
オレオレステータスボードを作ってみた
# 前書き
研究室に置いてあった去年のカレンダーとその後ろに付いてあった「外出」「テレワーク」などのステータスボードを発見した僕。そのボードを活用していたが、「テレワークと決めても遠隔で操作できないと意味ないのでは?」と思い始め、Web上で操作できるステータスボードの作成を決意する。これが、この物語の始まりである。# 使用技術選定
## ステータスボードに使用するハードウェア
### ESP32(却下)
WiFi接続マイコンのド定番であるESP32。最初はこれを採用し、手作り感満載のステータスボードを作ろうとしたが、思いもよらぬ壁をぶつかる。なんと、大学のWiFi認証は単なるパスワード認証ではないため、普通にESP32だけでは接続が困難であることが発覚したのだ。
そのため、電子工作オタクである僕もこの案は諦めることにした。### Amazon Fire 7(採用)
そうなると次はやはり安物のAndroidタブレットを検討することとなる。WiFi認証も問題なく突破できる上、最近はコスパの良いモデルもたくさん登場している。しかし、ずっとつけっぱなしにしておくので、ある程度検証された
screenWidthDpをpxに変換すると値が小さくなります。
以下のスライドを記事に書き起こしたものです。
## 結論
画面幅をpxの単位で欲しいときは、Configuration.screenWidthDpをpxに変換すると正確な値が取れません。
BoxWithConstraintsScope.maxWidthにtoPxをかけたもの、またはResources.getSystem().displayMetrics.widthを使いましょう。## 前提知識
dp、px、dpiの知識がある方がより理解しやすいので、以下の記事などをみてみるといいかもしれません。
https://qiita.com/nein37/items/0a92556a80c6c14503b2## screenWidthDpについて
dp単位で表示可能な画面領域の幅のことです。(WindowInsetを除いた値)
取得方法は以下の二つです。Resources.getSystem().configuration.screenWidthDp
メモ:P20liteリカバリーなどの入り方
# 書き始めた理由
自分が操作方法を忘れるから。
普通に間違ってるかもしれないので完全にはあてにしないでください。
追記
こちらの記事のほうが1000倍詳しく、正しいです。
https://xdaforums.com/t/guide-emui9-p20-lite-basics.4341373/# 注意
この中のいくつかの方法はbootloader unock時に有効です。
BLUの方法はいろいろありますが、この機種の場合は[PotatoNV](https://github.com/mashed-potatoes/PotatoNV)がおすすめです。## fastboot
PCに接続した状態で電源ボタン+音量DOWN## eRecovery
PCに接続していない状態で電源を切り、PCに接続した後電源を付け、その後音量UPを3秒押し## カスタムリカバリ
PCに接続していない状態で電源ボタン+音量UP
【Android】Contextって何者なん?~Activity Context編~
これは、アドベントカレンダーの2日目の続きになります。
そちらがまだの方は、2日目を先に読んでいただけると幸いです。
https://qiita.com/minomusi/items/78693966e99f05af3e00それでは行きましょう!:writing_hand:
## Activity Context
これは、その名前の通り**Activity**に依存したContextになります。
よってActivityのライフサイクルにより発生、消滅します。
これが重要な観点になります。## Contextの誤用によるメモリリーク
contextの寿命と使用箇所の寿命を考えた時に、
context > 使用箇所の関係になっていると、メモリリークが発生してしまう可能性があります。具体的には、シングルトンなどのインスタンスでActivity Contextを渡した場合などが考えられます。
上記の場合などは、Application Contextを使用するようにしましょう。## Contextの使い分け関する私の考え
基本的に迷ったら、Application Context
ダークモード対応する際の見積もり手法
## 挨拶
こんにちは、ソーシャル経済メディア「NewsPicks」のモバイルアプリチームでAndroidを担当していますsefwgweoです。
この記事は NewsPicks アドベントカレンダー 2023 の4日目の記事です。
## 概要
今年、Android版Newspicksのダークモードを半年がかりでリリースした時にどのようにして見積もったかを実例をまじえて振り返ろうと思います
デザイナチームによるまとめは[こちら](https://note.com/akanyoshi/n/na18930c1808f)
iOSは本プロジェクトでモバイルチームとして陣頭指揮をとってくれた[@_asa08_](https://qiita.com/_asa08_)さんが後日記載予定ですのでお楽しみに!
## 前提
Android版Newspicksは10年以上サービスが続いているため、見積もる際以下な問題をはらんでいました
– 画面数が多い
– 機能数が多い
– 仕様が複雑## 見積もり方法
### 見積もる単位は1画面毎前提にあるように、そもそも対応が必要な画面数がとても多
material3.ModalBottomSheetの使い方とTips・トラブルシューティング
Android Advent Calendar 2023の4日目の記事です。
昨年は、`androidx.compose.material` の `ModalBottomSheetLayout` に関する記事を投稿したのですが、今年は `androidx.compose.material3` でも `ModalBottomSheet` が提供されるようになりました。Material3になり、コンポーネントの使い方自体が `ModalBottomSheetLayout` とは異なる形に変更されています。
昨年の記事: [ModalBottomSheetLayoutの使い方とTips・トラブルシューティング](https://qiita.com/ntsk/items/29d22763dd0234bc9150)
本記事では、昨年の記事の続きとして `material3.ModalBottomSheet` の使い方やTips・トラブルシューティングについて紹介します。
※ 本記事の内容は、`androidx.compose.material3:material3-*:1.2.0-alp
Androidでメディア再生の問題を調べる
xperia5v(Android 13)でYoutubeやYoutube music,Spotifyなど音楽・動画などアプリを問わずメディアの再生が突然一時停止する問題が起きたので状況を調べてみる
メモリ不足によるタスクキルという線も考えていたんですけど発生条件がランダムでフォアグラウンドやバックグラウンド関係なく、ロック中であろうがなかろうが状況を問わず発生するため少し違う感じ。
原因もわからずちまちま聞いてる音楽や動画を止められるのはストレスがたまるのでじっくり調べたところAndroidでは[音声フォーカス](https://source.android.com/docs/devices/automotive/audio/audio-focus)という仕組みで音声の操作を行っている様子。
今回はadbでコマンドでこの音声フォーカスの状況を調べてみて、原因となる情報を探る話です。
# 調査方法
USBデバッグなどで問題の端末にadbを実行できるようにして、以下のコマンドでオーディオ周りのダンプデータを取得します。
“`bash
adb shell dumpsys audio
Next.js Native使ってみた
# Next.js Nativeってなんぞや❓
[Capacitor](https://capacitorjs.jp/docs) と呼ばれるwebアプリをクロスプラットフォーム化するライブラリを使って、
Next.jsをネイティブアプリ化できるようにしたものみたい👀https://nextjs-native.com/
Githubにてスターターキットも用意されてたので、これを試す
https://github.com/RobSchilderr/nextjs-native-starterとりあえず、Githubからクローン
“`bash
$ git clone git@github.com:RobSchilderr/nextjs-native-starter.git
Cloning into ‘nextjs-native-starter’…
remote: Enumerating objects: 3127, done.
remote: Counting objects: 100% (747/747), done.
remote: Compressing objects
Androidエミュレーターの通信をBurp Suiteで取得する
エミュレーターの通信を Burp Suite で取りたかったので、手順を簡単にまとめます。
手順として下記2つの方法があります。
* [ポート転送を利用する方法](#ポート転送を利用する方法)
* [仮想ネットワークのIPを指定する方法](#仮想ネットワークのipを指定する方法)## 検証環境
* macOS Monterey 12.7.1
* Android 12.0 Google APIs (API 31) ※root が使用できるもの
* Burp Suite Professional v2023.10.3.6## ポート転送を利用する方法
複数起動している場合は、適宜 `adb -s [デバイスID]` を指定してください。
### 手順
1. Android エミュレーターを起動する
1. Burpを `Loopback Only (127.0.0.1)`、`8080` ポートで開始する
1. Androidエミュレーターのプロキシ設定をする ( iptables または Wi-Fi の Proxy 設定)
1. エミュレーターからホスト側へポート転送を