伊勢の昼ご飯(1) まんがいち食堂

2024年3月4日

リモートワーカーの昼ご飯日記

伊勢の飲食店を巡ります。

市役所に所用で出掛けた帰り道。

以前見かけて気になっていたお店の近くを通ったのでテイクインしました。

カウンターに並べられた惣菜をピックアップし、レジ前でご飯、汁物をオーダーするスタイル。

焼き魚などはその場で調理してくれます。

言わば、○丁目食堂スタイルですね。

レンジ、トースター完備で惣菜を温め直せます。

広々としたスペースで落ち着いて食べることができました。

1人掛け用のカウンターもあったの混んでても大丈夫そう。

肉じゃが。
茄子の煮浸し。
鯖の南蛮漬け。
ごはん大。
豚汁。
とピックアップして1090円。

美味しかったです。

米ぬか。
ご自由にどうぞ。

ごちそうさまでした。

お店情報

まんがいち食堂

営業時間:9:00~20:00

定休日:日曜日、祝日

住所:三重県伊勢市一之木1-3-1

ポリシー違反「GooglePlayアプリの無効化」を解決した話とファミリー向けアプリの実装方法の訂正について

2024年2月27日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「GooglePlayアプリの無効化」の警告メールが届きました。

対応から解決までの話。

ファミリー向けアプリのAdMob実装に潜む誤り

2月24日、GooglePlayから以下のメールが届きました。

位置情報共有アプリ「Watch Over Me」。

このアプリは親子の間で位置を共有することを意図したアプリとなっており、ユーザーの対象年齢は子供を含めた全年齢としています。

そこで必要となるのがファミリーポリシー対応です。

この点については抜かりなく実装し、以下のようなまとめ記事も作っていました。

ファミリーポリシー違反に対する指摘メールが届き、アプリが削除されてしまいました。

違反内容を詳しくみると「aaid」というAndroid特有のIDをアプリから送信してしまっているようです。

アプリの機能として「aaid」送信を実装していないのでAdMobが送信しているのは間違いありません。

子供向けのAdmob設定を行うと「aaid」の送信は抑制されるはずなのになぜ。。。

なんてことを思っていたら、Admobから広告配信中断予告が届きました。

AdMobコンソールから見た詳細が以下。

どうしたものか。。。

AdMob実装の誤りに気付く

ファミリーポリシー対応を実装していはずなのに「aaid」が送信されている。

ということは、子供向けのAdMob設定のコードに誤りがあるのか?

ネット検索してみたところ、UnityのAdMob設定に関するサイトで以下の記載が見つかりました。

ソースコードを修正する

initial処理前にこども向けのパラメータ設定を行う必要がありました。

ということでソースコードを修正します。

そして、アプリをリリース。

ポリシー違反解除

1日後、アプリがリリース審査が通り、アプリがストアに復帰しました。

そして、AdMobコンソールをチェックすると

ポリシー違反が解除されていました。

今回の修正に伴い、まとめ記事も修正しました。

明石焼きを巡る旅

2024年2月17日

近鉄、阪神電鉄、JRと乗り継ぎ、向かった先は明石駅。

未だ食べたことのない本場の明石焼きを食べに兵庫県明石市に行きました。

まずは駅前ロータリーすぐ近くの魚の棚商店街をぶらつきます。

魚の棚商店街のなかにも明石焼きの店が何店舗かありましたがまずは様子見。

とりあえず商店街を散策します。

商店街を抜け、少し歩いたところで落ち着いた雰囲気のお店を発見。

1件目に突入。

1件目 明石丁

カウンターと4人掛けテーブルが3卓。

メニューは、

・明石焼き

・あんかけ明石焼き

・ドリンク

シンプルです。

こちらが明石丁の明石焼き。

(15個、税込み700円)

お箸でつかめないほどふんわりとろとろ。

だし汁はあっさり。

なんとも上品な味です。

お店情報

明石丁(あかしてい)

営業時間:11:30~18:30

定休日:水曜日、木曜日

住所:兵庫県明石市鍛治屋町4-17

たこ焼きのソースを出汁に変えたのが明石焼きって認識だったんですが・・・

と衝撃を受けたところですぐ近くのお店へ直行。

2件目 きむらや

風格のある店構え。

店内は満席で少し待ちました。

こちらがきむらやの玉子焼。

(20個、税込み1000円)

明石焼きは玉子焼とも言うんですね。

きむらやのだし汁は濃いめです。

醤油のインパクトがありますね。

そして、目についたのがおでん。

スジ肉串と厚あげを注文。

甘めのだし汁がじゅわっときます。

お店情報

本家 きむらや

営業時間:10:00~17:00(仕込分がなくなり次第終了)

定休日:月曜日、月1回不定休で火曜日

住所:兵庫県明石市鍛冶屋町5-23

2件巡ったところでお腹がいっぱいに。

中休み

お腹がいっぱいになったところで海岸を散歩します。

商店街から10分ほど歩くと海岸です。

海岸沿いは公園として整備されていてのんびりできます。

遠く見えるのが明石海峡大橋。

そして、海岸沿いから駅に戻り、駅を抜けた先にあるのが明石城。

城跡から見る街並みがいい。

3件目 松竹

駅前まで戻ったところで駅前ビルにあるお店に入りました。

4人掛けテーブル4卓と2人掛けテーブル4卓。

メニュー

・玉子焼き

・特別玉子焼き

・ドリンク

こちらもシンプルなメニュー構成です。

出汁と三つ葉が提供されます。

配分を調整できるのがいいですね!

こちらが松竹の玉子焼き。

(15個、税込み750円)

ペロっといけます。

お店情報

松竹(しょうちく)

営業時間:11:00~19:00

定休日:水曜日

住所:兵庫県明石市大明石町1-6-1 パピオスあかし 1F

そして帰宅

今回巡った3件、どこが一番美味しかったか?

それぞれの良さがあるので完全に個人の好みによるものになりますが、

私は「明石丁」でした。

(きむらやのおでんも美味しかった。

帰りの際に神戸南京町に寄るつもりだったのですが、思った以上に居心地がよく1日過ごしてしまいました。

明石焼きと言っても店によって焼き加減や出汁が違って(特に出汁のバラエティがすごい)個性豊かなのは本場ならではでしょうか。

本場の明石焼きを満喫できた良き旅でした。

リモートワークできるのか?

明石駅周辺を散策して感じたのがのんびり過ごすのにいい環境だな、ということ。

お試しに短期滞在でリモートワークできるのだろうか?

滞在するならシェアハウス、ゲストハウス、ビジネスホテルあたりか。

ネットで検索してみると明石周辺ではシェアハウス、ゲストハウスがあまりヒットしないのに対し、ビジネスホテルは割と安めの価格帯(1泊2000円~4000円)でヒットしました。

この価格帯で泊まれるなら金銭面では問題なさそう。

あとは仕事の状況次第。

短期滞在のリモートワーク、実現してみたいです。

GDPRメッセージをAndroidアプリに組み込む

2024年2月13日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

AndroidアプリにGDPRメッセージを組み込みます。

AdMobに表示された警告

AdMobのコンソール画面を表示したところGDPRメッセージについて警告が表示されていました。

2024年1月14日からイギリス、または、欧州経済領域で広告を表示するには事前に広告表示に関する確認が必要になるようです。

GPDRメッセージとはその確認のための案内文であり、UMP SDKをアプリに組み込むとAdMobで作成したメッセージを表示してくるようです。

GDPRメッセージ作成の流れ

早速、実装していきます。

まずは、AdMobのコンソール画面に表示された「GPDRメッセージを作成」をタップします。

(メニュー「プライバシーとメッセージ」のGDPRから作成・編集することもできます。)

GDPRメッセージの作成フローが表示されます。

流れに沿って設定していけば滞りなく実装できます。

ステップ1.メッセージを作成する

まずはGDPRメッセージを作成します。

メッセージ自体はデフォルトのフォーマットがあるためそのまま使用します。

設定すべき項目としては、

「表示対象アプリ」、「言語」、「同意しないボタンの表示有無」ぐらいです。

私は、同意しないボタンを表示するパターンと表示しないパターンの2パターン作成し、

表示対象アプリをそれぞれのパターンに振り分けることにしました。

基本的には同意しないボタンを表示しないパターンを使用し、

こども向けゲームアプリだけ同意しないボタンを表示するパターンを使用することにしました。

ステップ2.UMP SDKを組み込む

メッセージの作成が終わったら、アプリにUMP SDKを組み込みます。

まずはbuilde.gradleの実装。

    implementation 'com.google.android.ump:user-messaging-platform:2.1.0'

次に必要なモジュールをインポートします。

import com.google.android.ump.ConsentForm
import com.google.android.ump.ConsentInformation
import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateFailureListener
import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateSuccessListener
import com.google.android.ump.ConsentRequestParameters
import com.google.android.ump.UserMessagingPlatform
import com.google.android.ump.ConsentDebugSettings
import java.util.concurrent.atomic.AtomicBoolean

あとは適当な場所にメッセージの呼び出し処理を追加します。

    private lateinit var consentInformation: ConsentInformation
    private var isMobileAdsInitializeCalled = AtomicBoolean(false)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val params = ConsentRequestParameters
            .Builder()
            .setTagForUnderAgeOfConsent(false)
            .build()

        consentInformation = UserMessagingPlatform.getConsentInformation(this)
        consentInformation.requestConsentInfoUpdate(
            this,
            params,
            OnConsentInfoUpdateSuccessListener {
                UserMessagingPlatform.loadAndShowConsentFormIfRequired(
                    this@MainActivity,
                    ConsentForm.OnConsentFormDismissedListener {
                        // Consent has been gathered.
                        if (consentInformation.canRequestAds()) {
                            initializeMobileAdsSdk()
                        }
                    }
                )
            },
            OnConsentInfoUpdateFailureListener {

            })

        if (consentInformation.canRequestAds()) {
            initializeMobileAdsSdk()
        }
    }

最後にメッセージロード後の処理を追加して完了です。

    private fun initializeMobileAdsSdk() {
        if (isMobileAdsInitializeCalled.get()) {
            return
        }
        isMobileAdsInitializeCalled.set(true)

        MobileAds.initialize(this)
    }

ステップ3.デバッグする

最後に動作確認をします。

まずはデバッグ用のパラメータを追加します。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val debugSettings = ConsentDebugSettings.Builder(this)
            .setDebugGeography(ConsentDebugSettings.DebugGeography.DEBUG_GEOGRAPHY_EEA)
            .addTestDeviceHashedId("46********************E1")←デバッグ機のデバイスID
            .build()

        val params = ConsentRequestParameters
            .Builder()
//            .setTagForUnderAgeOfConsent(false)
            .setConsentDebugSettings(debugSettings)
            .build()

        consentInformation = UserMessagingPlatform.getConsentInformation(this)
        consentInformation.requestConsentInfoUpdate(
            this,
            params,
     ~
    }

デバッグするには、デバッグ機のデバイスIDが必要になります。

アプリを起動するとログにデバイスIDが出力されます。

ログは「.addTestDeviceHash」で絞り込むと見やすいです。

アプリを起動させ、以下のような画面が表示されたら実装成功です。

もう1度確認したい場合は、

consentInformation.requestConsentInfoUpdateの前に以下を追加すると

同意を行った後もまた案内文が表示されるようになります。

        consentInformation.reset()

ここまで動作確認できれば、あとはリリースするだけです。

お疲れさまでした。

ポリシー違反「ユーザーの意図しないクリック:レイアウト」を解決した話

2024年2月12日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「ユーザーの意図しないクリック:レイアウト」の警告メールが届きました。

対応から解決までの話。

警告メールが届いてから2日で広告配信停止

ポリシー違反「ユーザーの意図しないクリック:レイアウト」の警告メールが届きました。

指摘を受けたアプリは「サムズアップ」です。

あとで対応すればいいかとしばらく放置していた2月11日(日)。

広告配信停止通知がきてしまいました。

はやくないですか!?

3連休中ののんびりモードも一転。

慌てて指摘内容を確認します。

バナー広告のすぐ上にカウントボタンを配置しているのですが、

どうやらそれを指摘されているようです。

対応する

指摘内容を踏まえ、バナー広告の配置を下から上に変更。

これでバナー広告周辺にクリックするものはなくなりました。

あとは修正版アプリをリリース。

リリースが反映されたのを確認し、審査をリクエストします。

ポリシー違反解除

審査リクエストを出した17時間後、ポリシー違反が解除されました。

ポリシー違反「サイトの仕様:ナビゲーション」を解決した(?)話

2024年2月12日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「サイトの仕様:ナビゲーション」の警告メールが届いたのですが

どうも腑に落ちません。

そんなときの対応から解決までの話。

意図した動作ではないものに対する指摘

ポリシー違反「サイトの仕様:ナビゲーション」の警告メールが届きました。

指摘を受けたアプリは「みてみて」です。

そして指摘内容が以下。

添付されていた画像は2枚。

2枚目の画像はアプリが反応していないエラー画面のようです。

そして、問題として挙げられた「サイトの仕様:ナビゲーション」について確認すると。

どうやらアプリの「START」をタップしたが、反応がなくエラーとなった。

コンテンツが存在しないのではないか。

そのような指摘に思われます。

ちょっと待て、と言ってみる

アプリの仕組みとしては、「START」をタップするとFirebaseから投稿データを取得し、

マップ画面を表示するのですが、ネットワークが悪いのか、Firebaseのアクセスが遅延したのか、

アプリがエラーとなったようです。

これは外部要因によるエラー。

アプリとしては対応いたしかねます。

そこで「審査をリクエスト」からアプリのコンテンツが用意されていることを訴え、異議申し立てをしてみました。

ポリシー違反解除

審査リクエストを出した9時間後、ポリシー違反が解除されました。

こういうこともあるんですね。

AI生成画像をモバイルアプリに取り込んでみる。(4)

2024年1月24日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は生成画像をアプリに取り込んでリリースします。

モバイルアプリに取り込む

まだまだプロンプトを試したかったが、スペック不足による生成失敗が続き、

これ以上の画像生成は断念。

とりあえず手持ちの画像からピックアップしてアプリに取り込むことにします。

まずは過去に生成した画像を見直します。

過去に生成した画像はoutputフォルダに格納されています。

生成画像を見直し、アイコン画像候補を決定!

個人的に1番印象が強かった画像をアイコン画像として使うことにしました。

そして、その画像をベースに生成した半身画像をアプリ内のキャラクター画像として使用することに。

全身を出力するのは難しい・・・

アプリリリース

そして、アプリリリース。

画のセンスがないのでそこを画像生成AIで補完できるのは魅力的ですね!

あとはプロンプトでどこまでできるか。

全身を出力する、同じキャラクターでポーズを変える、服装を変える、

まだまだ試したいことがいろいろあります、が。

その前にGPUをどうにかしないと・・・

(3)へ

AI生成画像をモバイルアプリに取り込んでみる。(3)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は自作画像をインプットにして自分のイメージに近い画像の生成を試みます。

モバイルアプリ用の画像を生成する

いよいよモバイルアプリ用の画像を生成します。

必要な画像はアニメ画像になるのでrun_anime.batで起動します。

Webブラウザが立ち上がったら「Input Image」と「Advanced」で生成要素をカスタマイズします。

「Input Image」にアプリ画像を投入します。

「Advanced」では

モデルをemiに切り替え、生成パフォーマンスを「Quality」にしました。

そして、出力した結果がこちら。

できれば全身画像が欲しい・・・

そこでプロンプトの調整や出力画像をインプットに再投入するなど試行錯誤します。

そしてついに全身画像の生成に成功。

あとはコスチュームやポーズ、顏の表情などを調整したい、

と思ってgenerateを繰り返していたら・・・

スペックの壁

画像の生成が完了する前に生成処理が落ちるようになってしまいました。

どうやらGPUのメモリ不足のようです。

マシンスペックを確認してみると

GPU3GBで頑張ってました・・・

むしろここまでよく動いたな。

まだまだプロンプトを変えて色々と試したかったがここまで。

生成した画像を元にアプリの改修をかけようと思います。

AI生成画像をモバイルアプリに取り込んでみる。(2)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は画像生成AI、Fooocusを実際に動かして画像をアウトプットしていきます。

動かしてみる

環境構築が完了したので早速動かしてみます。

バッチファイルをダブルクリックすると起動します。

手始めにrun.batをダブルクリックします。

コマンドプロンプトが立ち上がり、セットアップが実行され、最終的にWebブラウザが立ち上がります。

あとは「Generate」ボタンをクリックするとAI画像が生成されます。

プロンプトに「japanese girl」と入力し、generateした結果が以下です。

「Advanced」をチェックすることで生成要素をカスタマイズできます。

・生成パフォーマンス(速度重視か、質重視か)

・画像サイズ

・出力枚数(デフォルト2枚)

・シード

・スタイル

・モデル

などなど

気を付けること

AI生成画像をモバイルアプリに取り込んでみる。(1)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」。

キャラクター「ふぁい」がアプリの立ち上げをサポートしてくれる、というコンセプトで

キャラクター「ふぁい」を自作し、拙い画像ながらもプロトタイプ版をリリース。

さてどうブラッシュアップしていくか。

長考の末に行きついたのがAI生成画像。

ということでチャレンジしてみることに。

環境構築

まずはAI画像生成ソフトをインストールします。

インストールについては以下のサイトを参考に行いました。

https://ascii.jp/elem/000/004/159/4159726/

必要なもの、及び、インストール手順をピックアップすると以下。

必要なもの

・Windows、または、Linux

・GPU(NVIDIA GeForceがいいらしい)

・Githubアカウント

・Hugging Faceアカウント

インストール手順

・Githubからfooocusをダウンロードし、zipファイルを解凍する。

・HuggingFaceからemi_stable.safetensorsをインストールし、fooocusのモデルフォルダにコピーする

気を付けること

 GPUのメモリは最低4GBは欲しい、推奨は8GB~12GBのようです。

 HDDも画像を生成するごとにモデルデータを自動インストールするため数GBはあっというまに消費されていきます。

 Cドライブに100GB以上の空きが欲しいところ。

(2)へ