日々是好日

プログラミングについてのあれこれ、ムダ知識など

PowerShellスクリプトでbuild.gradleをオレオレ記述化

Android Studioでプロジェクトを初期化したときに生成されるbuild.gradleをオレオレ記述化したのでメモ。

書き換える動機はこちらの記事が基です。

android.benigumo.com

今まで手動で直していましたが、あまりにもめんどうだったのでテンプレート化してみました。 なお筋肉で解決しているので、ps1ファイルに処理べた書きです。必要に応じ function に切り出し等行ってください。

続きを読む

Firebaseの初期化でハマった

Firebaseの初期化でめちゃくちゃハマったのでメモ。

ネット上をさまよったが、どうもFirebaseの新旧のバージョンで書き方が変わったため、かなり情報がごちゃごちゃになってるっぽい。

  • 環境
  • 何ができなかったのか
  • 何が原因だったか
  • どうやって解決したか
    • コード上でFirebaseを初期化する
  • 所感
続きを読む

CLIP STUDIO PAINTファイルからプレビュー画像を生成する

CLIP STUDIO PAINT ファイル(.clip)のプレビュー画像を node.js で出力したのでメモ。

なお、fs.readFileSync/writeFileSyncを使用しているが、 テスト用に記述してるだけなので、実装する場合はfs.readFile/writeFile推奨。

  • コード
  • 解説
    • clipファイルの読み込み
    • SQLiteのデータの位置を探索
    • SQLiteの展開とpngの書き出し
  • 感想
  • 参考
続きを読む

VSCode実践ガイドでWebアプリ開発環境を作ってみた

森下様の著書「Visual Studio Code 実践ガイド」をフラゲ()したので、 本書に従い初めてVue.js+TypeScriptで開発環境を作ってみました。

gihyo.jp

  • Vueでの開発環境構築なんてコマンドライン一発でしょ?
  • 環境構築
    • フォルダ構成
    • tscの導入
    • その他のパッケージのインストール
    • tsconfig.jsonの生成
    • tslint.jsonの生成
  • 感想
続きを読む

MVVM+DataBinding+RecyclerViewでカレンダーを作る - 1

2021年7月12日 追記

RecyclerView.AdapterのアイテムにDataBindingを用いるため、コンストラクタで LifecycleOwner (FragmentのviewLifecycleOwner) を渡すのは誤った実装でした。

stackoverflow.com

発見に至った経緯

まったく別のアプリ開発LifecycleRegistry.java内のObserverWithState.dispatchEventを確認していたところ、newState = event.getTargetStateにて、本来生きているはずの親FragmentのON_DESTROYが渡ってきていました。

static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = event.getTargetState();
        mState = min(mState, newState);
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

ハッと、binding.lifecycleOwner = parentLifecycleOwner (実体はviewLifecycleOwner)を渡していたことを思い出しググってみたところ、上記の記事を発見したところです。

RecyclerView+DataBindingはどうすればいいんでしょうかね……。

以下、ご参考まで。


RecyclerViewでカレンダー風の表示を作ったので、備忘録的なまとめその1。 MVVM+DataBinding でViewに表示させるまでです。

  • 発見に至った経緯
  • できるもの
  • 使用した技術的なモノ
  • 項目を sealed class で用意する
    • sealed class Content の定義
  • データバインディングレイアウトファイルの作成
  • CalendarActivity の定義
  • CalendarActivityViewModel の定義
  • CalendarAdapter の定義
  • RecyclerView の拡張関数の定義
  • CalendarFragment の定義
    • レイアウトファイルとバインド
    • Fragment の定義
  • GitHub
続きを読む

Firebase Hosting+Functionsのメモ

Firebase Hosting

プロジェクトを作成するフォルダに移動してinitコマンド

cd /project
firebase init

Hosting: Configure and deploy Firebase Hosting sitesを選択してポチポチ。 するとプロジェクトフォルダに(デフォルトなら)publicというフォルダとindex.html等のファイルが生成される。 publicフォルダ内にHtml, CSS等を配置していく。

Hostingへのデプロイ

deployコマンドでデプロイする。

firebase deploy 

# Hostingのみの場合
firebase deploy --only hosting

最後に下記の形式でURLが発行されるので、ブラウザで開くと作成したページが見られるはず。

projectID.firebaseapp.com

再デプロイしてもうまく反映されないとき

再デプロイをしてもブラウザで見たときに反映されない場合があるが、キャッシュを削除することで直る場合がある。 「chrome キャッシュクリア」あたりでググって見てください。 (Chrome前提ですみません)

Cookieの削除等は不要、「キャッシュされた画像とファイル」の削除だけでおk。

Firebase Functions との連携

あるページにリクエストが来たとき、Functionsで動的にコンテンツを生成して返す方法。

基本全部こちらに載っている。

今回はprojectID.firebaseapp.com/hogeにアクセスされたとき、Functionsにて生成したHtmlを返すような例。 index.tsにて関数を定義(ここではdynamicChange)し、ステータスコードと返すHtmlを書く。

なお、今んところFunctionsによる動的コンテンツ生成はus-central1リージョンでしか対応していないそうなのでご注意を。

import * as functions from 'firebase-functions'

exports.dynamicChange = functions
  .region('us-central1')
  .https.onRequest((request, response) => {
    response.status(200).send(
      // 公式の例では返すHtmlをハードコーディングしている。。。
    )
  })

次にfirebase.jsonにて、rewritesを次のように書き換える。

{
  ...
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [ {
      // トリガーとなるページと関数
      "source": "/hoge",
      "function": "dynamicChange"
    } ]
  }
}

これで再デプロイすると、hogeにアクセスしたときdynamicChange関数で生成されたページが返ってくる。