iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【RxSwift】ConnectableObservableってなんだっけ

久しぶりにRxSwiftを触ろうと記事を漁っていたら、ConnectableObservableというObservableが出てきて、これなんだっけ?となったので軽くメモ👷‍♀️

結論

ConnectableObservableはHotなObservableです!

完。

となるとちょっと短いので、ちょっと解説すると。

一般的によく使うObservableは、ColdなObservableと言われて、subscribeごとに新しいストリームが発行されます。つまり、subscriberが多ければ多いほど同じ処理が重複します。 一方ConnectableObservableは、HotなObservableと言われて、どれだけsubscriberがいようとも元となるストリームは一つになり、同じ処理が重複するのを防ぐことができます。subscriberごとにその大元となるストリームが枝分かれしていく感じでイメージしやすいと思います。

てな感じで本日も以上となります🍺

その他の記事

yamatooo.blog

yamatooo.blog

yamatooo.blog

【SQL】countを使う際に or null って入れるのはなんで?

結論

これを理解するためには、countがどのような振る舞いをするのかを理解する必要があります。

countは、取得した行に含まれる expr の非NULL値の数を返します。ちなみに、exprは整数や文字列などの数式を評価するコマンドのことを指していて、評価が真の場合は1が、偽の場合は0が出力されます。

つまり、下記のようにcountを使った場合は、nameカラムがyamatoではない場合exprによって0が出力されます。

count(name = 'yamato') 

0という値はnullではないので、nameに値が入っているものは全てカウントされてしまうということですね🤮

そこで登場するのが or nullです。

SQLorは、nullオペランドが含まれている場合、以外の値はnullになるという性質があります。

mysql> SELECT 1 || 1;
        -> 1
mysql> SELECT 1 || 0;
        -> 1
mysql> SELECT 0 || 0;
        -> 0
mysql> SELECT 0 || NULL;
        -> NULL
mysql> SELECT 1 || NULL;
        -> 1

参照: https://dev.mysql.com/doc/refman/5.6/ja/logical-operators.html#operator_or

ですので、name = 'yamato'で当てはまらない値は全てnullになります。countは、取得した行に含まれる expr の非NULL値の数を返すので、これで正しい結果が取得できるという仕組みですね✍️

count(name = 'yamato' or null) 

てな感じで本日も以上となります🍺

参考

その他の記事

yamatooo.blog

yamatooo.blog

yamatooo.blog

【HTML】target属性は_blank以外に何があるのか?

リンクを別タブで開きたい場合、target属性に_blankを指定することがあると思いますが、他に何があるんだっけと疑問に思ったのでメモ🔰

<a href="https://yamato8010.hatenablog.com/" target="_blank">俺のブログ</a>

結論

下記のようなものがあるらしい。ちなみに、デフォルトのtargetは、_selfです。

target 説明
_blank 新しいウィンドウを開いてリンクを表示します。
_self 現在のウィンドウでリンクを表示します。
_top ウィンドウがフレームに分割されている場合に、全ての分割を解除して最上に表示します。
_parent ウィンドウがフレームに分割されている場合に、一つ上位のフレームを分割し、その上に表示します。

ちなみに、_top_parentのサンプルページがあったので記載しておきます。

top: https://www.tagindex.net/html/frame/example_t01.html

parent: https://www.tagindex.net/html/frame/example_t03.html

てな感じで本日も以上となります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Firebase】CloudFunctionsでメンテナンス中画面にリダイレクトさせる

今回は、下記のようなCloudFunctionsdeNext.jsがホストされている状態を想定してメモしています👷‍♀️

const { join } = require('path')
const { https } = require('firebase-functions')
const { default: next } = require('next')

const nextjsDistDir = join('src', require('./src/next.config.js').distDir)

const nextjsServer = next({
  dev: false,
  conf: {
    distDir: nextjsDistDir,
  },
})
const nextjsHandle = nextjsServer.getRequestHandler()

exports.nextjsFunc = https.onRequest((req, res) => {
  return nextjsServer.prepare().then(() => nextjsHandle(req, res))
})

Ref: https://github.com/vercel/next.js/blob/canary/examples/with-firebase-hosting/firebaseFunctions.js

結論

https.onRequestのコールバックで渡される、Responseからリダイレクトをすることができます。

const { join } = require('path')
const { https } = require('firebase-functions')
const { default: next } = require('next')

const nextjsDistDir = join('src', require('./src/next.config.js').distDir)

const nextjsServer = next({
  dev: false,
  conf: {
    distDir: nextjsDistDir,
  },
})
const nextjsHandle = nextjsServer.getRequestHandler()

exports.nextjsFunc = https.onRequest((req, res) => {
  const maintenanceUrl = `${req.protocol}://${req.hostname}/maintenance`
  if (サービスを停止するための条件) {
    return res.redirect(maintenanceUrl)
  }
  return nextjsServer.prepare().then(() => nextjsHandle(req, res))
})

てな感じ本日も以上となります🍺

参考

expressjs.com

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Firebase】FirebaseDynamicLinksの動的生成が意外と楽だった

FirebaseDynamicLinksを動的に生成する方法が、予想と反して意外とシュッとできそうだったのでメモ👷‍♀️

【おさらい】そもそもFirebase Dynamic Linksとは?

以前にかる〜く触れたので、下記を参考にしてみてください。

yamato8010.hatenablog.com

要は、アプリがインストールされている場合やそうでない場合で、よしなに遷移先を変えようぜ!ってことです.

DynamicLinksを作る方法

今まで僕は下記の方法でしか、FirebaseDynamicLinksは生成できないと思っていました。

がしかし、手動でURLを構築することができるらしい。

firebase.google.com

具体的には、下記のサンプルのように、DynamicLinksを手動で構築するために必要なパラメータを付与していくと、Dynamic Link Builder APIREST APIを介さずにDynamicLinksを生成できるようになります.

https://[your_subdomain].page.link/?link=[your_deep_link]&apn=[package_name]

パラメータは、[公式ドキュメント]で詳しく載っているので省略しますが、iOS向けAndroid向けなどにパラメータがいくつか用意されている感じです。

他の生成方法と違う点は?

他の生成方法と違う点は大きく分けて下記の二つがあります。

  • URLが長い
  • 自動で記録されるログが少ない

先で紹介した生成方法(FirebaesコンソールやAPI経由)では、下記のような短いDynamicLinksが生成できますが、手動でURLを構築する場合はドキュメントで説明されている通り、長いDynamicLinksになります。

https://example.page.link/summer-sale

長いDynamicLinksの場合は、一般的に記録される、DynamicLinksごとのアプリインストール数などは記録されないっぽいので、別途アナリティクス用のパラメータをURLの構築の際に入れ込んでおく必要があるみたいです。ちなみに、ここで入れ込んだパラメータによる情報は、Firebaseに集計されるのではなく、それぞれのプラットフォームで確認することができるような感じです。(iOSならAppStoreConnectなど)

てな感じで本日も以上となります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【React】useCallbackとは?

useCallbackとは?

以前に紹介したuseMemoと同じ感じで、関数をメモ化します。

yamato8010.hatenablog.com

つまり、初回時のレンダリングまたは、依存する値が変わらない限りは、前回と同じ関数インスタンスを再利用するようになるので、パフォーマンスが向上します。

  const onClick = useCallback(() => {
    Router.push(`/rooms/${id}`)
  }, [id])

ちなみに、useMemouseEffectと同じように、第二引数で依存する値を設定します。

てな感じで本日も以上となります。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

iTunesConnectの解析パラメータメモ

FirebaseDynamicLinksのURLを手動で構築する際に付与できるiTunesConnectの解析パラメーターの意味がよくわからなかったので、メモ。

結論

意味は下記の通り。

parameter 意味
at Affiliate Tokenの略でアフィリエイト用のIDなどを付与する際に使用します。
ct Campaign Tokenの略で、どのキャンペーンでアプリがインストールされたのかなどを調べるために使用される。40文字以内で自由に文字列を設定できる。
mt Media Typeの略で、URLがなんのメディアのためのものかを表す。(値については後述)
pt Provider IDの略で、開発者ごとのIDなどを割り当てるらしい。(使い道がちょっと不明)

mtの値は下記のようになるそうです。

mt 意味
mt=1 音楽
mt=2 ポッドキャスト
mt=3 オーディオブック
mt=4 TV番組
mt=5 ミュージックビデオ
mt=6 映画
mt=7 iPodアプリ(見たことない)
mt=8 iOSアプリ
mt=9 着信音
mt=10 iTunes U
mt=11 電子書籍
mt=12 Macアプリ

参照: https://reliphone.jp/itunes-geo/

てな感じで本日も以上となります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com