rails等のTipsや入門記事書いてます2020-01-27SwiftUIのsomeキーワードについて調べてみるSwiftUIでViewを作る時、以下のようにsomeというキーワードが出てきます。今回はこのキーワードについて調べてみました。}}調査にあたって以下の記事を参考にさせて頂きました。Qiitasomeキーワードですが、実行時のパフォーマンス向上の為のキーワードになります。具体的には「戻り値の型をプロトコルとして宣言するとメモリ使用量が増える」という悩みを解消してくれるものになります。仮に下のようなクラスとプロトコルがあるとします。{}その時、下の2つのメソッドを比べるとMyProtocolを戻り値の型にしたほうがメモリ使用量が大きくなってしまいます。}それを解決するのがsomeキーワードです。someを付ける事で、メソッドの実装によって戻り値の型が最適なものになります。}実際に比較してみた結果は下のとおりです。1,000,000個のインスタンスを作って、メモリ使用量を比較してみました。MyProtocolはMyClassとほぼパフォーマンスを出していることがわかります。30.7mb100万回個のインスタンス生成の実装は以下の通りです。reportのHighの値を使用しました。以下のように実行速度についても調べたのですが、こちらは大きな差はありませんでした。d.timeIntervalSince1970)someキーワードはクラスにも使えるのですが、当然ながらsomeがあってもなくてもメモリ使用量に差は見えませんでした。requirementsというエラーになります。これはViewが、associatedtypeを使っているためです。}}someは引数には使うことができません。引数はジェネリクスで対処する必要があります。Extensionを使ったウィジェット作成を試してみました。プロジェクトを作成したらメニューからTargetの作成を行います。Extensionを選択します。Extension関連ファイルが作られます。worldが表示されます。Storyboardでテキストを変更する事で文字を変える事ができます。ラベルはUIViewControllerと紐付ける事で動的な変更もできます。}}ラベルだけでなくボタンも配置する事ができます。widgetLargestAvailableDisplayModeをセットする事でウィジェットのサイズを大きくできます。サイズはwidgetActiveDisplayModeDidChangeでセットする事が可能です。Groupsが必要になります。Groupsを作成します。この時はアプリのターゲットだけでなくExtension側にも追加が必要です。あとは作成したグループを使ってデータ作成すればデータ共有できるようになっています。Groupsを使います。Sourcesへの追加などが必要です。CocoaPodsを使う場合、Extension用の処理も必要があるので注意が必要です。Extensionでウィジェット作成Tweetもっと読むコメントを書く2019-12-02SwiftUIを触ってみるSwiftUIで簡単なUIを作ってみました。Xcode11で新規プロジェクトを作成します。App」を選びました。プロジェクト構成は以下のようになっています。Xcode11からはSceneDelegate.swiftというファイルが追加されています。これはiPadで画面に複数アプリ表示する際に使うクラスで、今までのAppDelegateの役割の一部を担っています。今回はSwiftUIを中心に見たいので深堀りしないことにします。アプリを立ち上げてみます。World!と表示されます。その下にラベルを1つ追加してみたいと思います。ContentViewクラスを以下のように修正します。2つ縦に並べるのはVStackというクラスを使っています。}}アプリを起動するとラベルが2つ表示されています。次にラベル間を少し空けてみます。VStackの初期化時にspacingを渡します。}}これで間隔を200pxにする事ができました。ラベルと色やフォントも変更してみます。}}少し見づらいですが黄色の大きめの文字に変わりました。次はボタンの追加とタップ時のアクション追加を行います。}}ボタンをタップするとデバッグエリアに10が表示されます。次はボタンタップ時にアラートも表示してみます。}}アラートを表示する事ができました。この.alert(isPresented:)はButtonに付いている必要はなく以下のようにTextに付いていても動きます。}}次はボタンを押した時にテキストの内容を変える処理をします。}}ボタンを押すとテキストを変更する事ができました。以下のようにViewModelを別途作る事もできます。}}データをTextFieldと紐付ける事もできます。TextFieldの引数はBinding<String>なので$viewModel.textとドルを付けてBindingオブジェクトに変えて上げる必要があります。}}画面遷移はNavigationViewを使うと実現できます。先日の記事でFirebaseのデータをBigQueryに追加しました。今度はBigQueryのデータをデータポータルというツールを使ってグラフ化してみようと思います。www.cl9.infoデータポータルとはデータポータルとはGoogleの提供しているデータをビジュアライズ化するツールです。今回はBigQueryのデータをグラフ化するのですが、BigQuery以外にGoogleアナリティクス・Googleスプレットシート・MySQLのデータなど色々なデータを取り込んで表示する事ができます。datastudio.google.com取り込んだデータは下のように様々な形で表示する事ができます。BigQueryで取り込んだデータを表示するデータポータルのページに移動してから、「空のレポート」を選んでレポート作成します。レポートを作ったら右下の「新しいデータソースを作成」ボタンからデータソースを作ります。ボタンを押すとデータ取得元を選ぶ画面に移動します。今回はBigQueryを選択します。選択と下のようにデータセット選択ページに飛ぶのでプロジェクトのAnalyticsのデータを選択します。events_intraday_YYYYMMDDは直近のデータのみなので、今回はevents_YYYYMMDDを選択しました。フィールドを選ぶ画面が出るんですがここは何も変更せず保存します。それが終わると画面にイベント数の入ったテーブルが表示されます。今回は新規ユーザー数を表示したいのでこれは削除します。削除してから「グラフを追加」で時系列グラフを追加します。デフォルトだと全イベントの数が入っているので、新規ユーザー数のみに絞ります。右側の「フィルタを追加」ボタンから、新規登録数を表示するためのフィルターを作成します。Nameがfirst_open(初めてアプリ立ち上げ)のイベントで絞り込みます。以上で設定は完了です。2日分しかデータ入れてないのですが、無事に新規ユーザー数を表示する事ができました。17:17Googleのデータポータル(旧DataStudio)でアプリの新規ユーザーをグラフ化Tweetもっと読むコメントを書く2019-11-27FirebaseのデータをBigQueryに入れて分析するFirebase単体だと見づらいデータが多いのでBigQueryに入れて分析してみました。今回はFirebaseとBigQueryを連携して新規ユーザー数を取得するところまでやります。ドキュメントは下URLになります。CloudBigQueryの料金FirebaseとBigQueryの連携をする場合、まずはFirebaseをBlaze(従量課金)プランに上げる必要があります。実際試したところSparkプランでもある程度動かす事ができました。動かした感じ、無料プランだと制限付きBigQuery(サンドボックス)が適用されるのだと思います。Firebaseの料金詳細は下URLの通りです。firebase.google.comBigQuery側の料金は下のとおりです。ストレージ容量、クエリの容量などに応じた従量課金で一定まで無料で使う事ができます。cloud.google.comFirebaseをBlazeプランに変更Blazeプランへの変更はFirebaseのプロジェクト画面左下の「アップグレード」ボタンから行う事ができます。連携はプロジェクト設定の「統合」から行う事ができます。連携が完了すると下のようにBigQueryにプロジェクト、データセット、テーブルが作られます。1日くらいかかる事があります。BigQueryで新規ユーザー数を見るまずは下のようなSQLでAnalyticsデータセットのテーブル一覧を取得します。analytics_xxxxxxは自分の環境に置き換えて下さい。analytics_xxxxxx.__TABLES__;実行すると下のようにテーブル一覧が表示されます。特定のテーブルのデータは下のようなSQLで取得する事ができます。analytics_xxxxxx.events_20191126;もし11月26日の新規ユーザー数を取りたい場合は下のようなSQLで取得する事ができます。"first_open";複数日のデータをまとめて取りたい場合はテーブル名にワイルドカードを入れる事で実現できます。event_date;データ容量ですがユーザーがほとんどいないプロジェクトでは1日20MB程でした。ユーザー数も多くてイベントを大量に送っているプロジェクトでは2GB程ありました。23:16FirebaseのデータをBigQueryに入れて分析するTweetもっと読むコメントを書く2019-01-15iOSでアプリ内課金したのに反映されないという問い合わせが来た時の対応策タイトルのような問題が起きたので、その原因と対策について調べてみました。起こったことiOSでアプリ内課金したのに反映されないもう一度購入しようとすると、「このアイテムは購入済みです。離脱するとこのような現象が発生します。具体的には、購入途中でクレカ情報入力するなどしてアプリ外で購入&アプリのプロセス終了した時に発生します。下のようなフローで再現する事ができます。そのままアプリ内課金を最後まで実施する上フローの後にトランザクションの状態を見ると、たしかに1件未終了のトランザクションが残っていました。購入画面のviewDidLoadに下処理を行う事で解決しました。未終了トランザクションが残っていたらトランザクションを終了します。}}最初はAppDelegateのdidFinishLaunchingWithOptionsでやろうと思ったのですが、「SKPaymentQueue.default().transactions」が常に0件になってしまったので、購入画面で実施しました。runで生成したコンテナの削除方法です。下コマンドでコンテナ一覧を表示します。-aオプションを付けることで起動中でないコンテナも表示する事ができます。-a下のようにコンテナ一覧が出てきます。最後にコンテナIDを指定してrmコマンドを打てば削除する事ができます。CONTAINER_ID下コマンドでコンテナを一括削除することもできます。Extensionでウィジェット作成SwiftUIを触ってみるGoogleのデータポータル(旧DataStudio)でアプリの新規ユーザーをグラフ化FirebaseのデータをBigQueryに入れて分析する月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。