メインコンテンツまでスキップ

· 約3分
arasan01

macOSにはソースコードのNSLocalizedStringで定義されている文字列に対して抽出してLocalized.stringsを生成するコマンドがあります。これはAppleのドキュメントのManagin Strings Files yourselfのドキュメントで解説されています。

このコマンドはgenstringsというコマンドで定義されており使い方としてはファイル名をgenstringsにpipeから渡すことで使うようです。

$ find . -name \*.m | xargs genstrings -o .

· 約3分
arasan01

アプリケーションを作る上で誰にリソースを使わせるか、という観点は常に考える必要があります。ここではGit LFS Serverという一般的なアプリケーションを実装したとき、自分に関わる人間だけが利用できるアクセス制御という観点で考えます。

基本的にはアプリケーションの制御はトークンのやりとりによって信頼足り得るユーザであること(そのユーザしか知り得ない情報を認証しようとしているユーザは知っていることをベースに認証する)で認証します。また信頼足り得る場所からのアクセス(地理的にその場に存在していることをベースに認証する)であるをCloudflare Zero Trustでは行います。Xcode Cloudを例に取るとアクセス元のIP Rangeが公開されているため、このIP RangeからのアクセスをもとにXcodeからのアクセスであると解釈してZero TrustをBypassすることを考えます。

Xcode CloudではRequirements for using Xcode Cloudというページでcode Cloudからのアクセスが行われるIP Rangeの公開がされています。

これをCloudflare Zero TrustにBypass設定として登録することで認証を回避します。IP RangeによるAllow設定でも一見行けるように考えられますが、Allow設定ではトークンとリダイレクトを合わせて認証処理が行われます。Git LFSの処理に限って考えるとこれは要求を満たしません。APIにアクセスする場合には直接APIへの要求が通ることを求められます。そのためGit Clientからこれを実現する場合にはBypass設定を有効にする必要があります。

· 約4分
arasan01

Cloudflare Zero Trust

Cloudflareが提供している製品です、Cloudflareで管理するドメインに対してアクセス時にOAuth認証やService Accountでの認証を追加します。この製品を利用することで自分が管理するアプリケーションのアクセスに対して柔軟に認証機能を提供します。現在は50人まで無料で使えます。

https://www.cloudflare.com/ja-jp/zero-trust

Cloudflareは様々な用途に対応するためツールを作成しています。

· 約8分
arasan01

こんちは、あらさんです。ロックマンエグゼアドコレの発売日が近づいていてワクワクしている毎日です、発売日はお仕事をお休みしてネットバトラーになります。ぜひ一緒にやりましょう、Twitterで気軽なお誘いお待ちしております。

https://www.capcom-games.com/megaman/exe/ja-jp/

Firebase iOS SDK 10.8.0について

今回の話題にあげる内容は、ビルドをもっと高速化するためにバイナリターゲットとして配布してくれ、というIssueを解決した成果によるものです。当時SPMはまだ本格対応するには時期が早すぎる、必要な機能が揃っていないなどの理由で今まで見送られてきました。そして2023/04/11の週のリリースにより、ついにリリースされることになった待望の機能になります。

対象のIssue

https://github.com/firebase/firebase-ios-sdk/issues/6564

今回のリリースノート

https://firebase.google.com/support/release-notes/ios#cloud-firestore

· 約9分
arasan01

勉強メモ

参考資料は公式のドキュメント、特に新規の話はない

https://beta.reactjs.org/learn/passing-data-deeply-with-context

https://beta.reactjs.org/learn/scaling-up-with-reducer-and-context

Reducerとは

そもそもReducerを使うメリットを考えると状態と操作は同時に存在することが前提になることが多い。例えば(loading: Bool, fetchedData: [String])のような状態を考える。useStateだけを使った場合には[ids, setIds]のようなものとこれをよしなに処理する関数を複数用意することになる場合が多い。これをギュッと値を変えるという考えで作るとuseReducer("ギュッと値を変える処理をまとめたもの", "変えていく値の初期値")のようになる。使うときにはdispatch({type: "ギュッと値を変える処理をまとめたときに付けた処理のキー", p1: "何かしらの付随する値、パラメータとか", p2: "これ移行も付随する値とか", ...})のように書けば値を変更するパターンと変更に利用する値という入力の関係がまとまり出力はその処理のキーによって返却する値になる。Reducerはreduceの概念をベースに作っているのでデータ構造は処理として一貫しているとよい。つまりReducerに初期値として(Bool, [String])のようなデータ構造を入れたとしたらどのような処理をしてもreducerの中で返す値はこの構造は変えないようにする。

· 約15分
arasan01

この記事はarasan01 Advent Calendar 2022の2日目です。

https://qiita.com/advent-calendar/2022/arasan01

こんにちは、あらさん(@arasan01_me)です。ポケモンSVのシナリオがはちゃめちゃに良くてポケモントレーナーだったのでは,という思い込みが加速しています。

https://twitter.com/arasan01_me

iOSアプリのテスト概要

iOSアプリでは大きく分けて2つのテストの管理方法があります。Xcodeを使うこと,Swift CLIからtestコマンドを利用することです。これらのテストはXCTestというAppleが提供しているフレームワークのチカラにより実現されています。またXCUITestを利用することによりXcode上でテスト実行をするとアプリが自動で立ち上がりUIテストが起動します。

XCTestでは特定の処理をテストする用途に向いています。例えば関数単位として意図している処理になっているかを確認できます。

· 約14分
arasan01

この記事はarasan01 Advent Calendar 2022の1日目です。

https://qiita.com/advent-calendar/2022/arasan01

こんにちは、あらさん(@arasan01_me)です。10周年を迎えたドラゴンクエストXオンラインを今更始めてみました,めちゃめちゃ面白いです。ぜひ始めてみてください。

https://twitter.com/arasan01_me

iOSアプリの開発環境について

iOS開発の環境はここ数年で大きく変わりました。Swift Package Manager(SPM)と銘打たれたコード配布管理ツールは、想像以上の汎用性によりプロジェクト構築に大きく変化をもたらしました。Point-Freeのisowordsが発端となって広く知られるようになったプロジェクト構成に応用できる発見は,開発ツールとして必須となっていたXcodeGen, tuistなどのXcodeプロジェクト生成ツールの必要性を再考する機会を開発者に与えました。また,SPMによるパッケージ配布が一般化することにより今までCocoapdosやCarthageに依存していたことによるRubyへの強い依存からの脱却,Cocoapodsの依存を持つことによるプロジェクトの制約からの脱却,SPMによるマルチモジュールができることにより軽量なディレクトリ構成とビルド時間の短縮の実現などが挙げられます。これらの進化により今まで開発者にとって必須だったツールは必須ではなくなり非推奨となるものが増えてきました。

· 約2分
arasan01

SwiftUIでObservableObjectを作成すると@Publishedが付与されたメンバーが更新されるたびにwillChangedが発行されて観測しているViewがそれぞれ再描画されます。2つのViewがあった場合に,片方の再描画が重たいと画面が固まってしまいます。 そのため描画の分離を行いたいです。

解決策

一つの巨大なオブジェクトを作成してそのメンバにObservedObjectをもたせることで変更通知の分離ができました。また,Bindingを利用して依存関係を使うことで変更通知を飛ばさずに別のパラメータを更新できました。

· 約10分
arasan01

こんちには,@arasan01です。Twitterで流れてくるポケモンのマンガがどれも良すぎて毎日つらいです,早くポケモンと暮らしたい。

今回は関数に対する実装と抽象の分離について考察します。

実装と抽象の分離を考えます,以下のような対応を考えると関数も抽象を捉えられそうです。

実装抽象
構造体・クラスプロトコル
関数?

純粋関数の場合は明確に実装と抽象が分離できます。下記の通常の関数の定義では実装はビルド時に決定されますが,分離した場合には実行時まで実装の選択が遅延されます。そのため依存性の注入が実行時に可能です。

// 通常の関数の定義
func add(first: Int, second: Int) -> Int {
first + second
}

// 分離した場合の定義
let impl: (Int, Int) -> Int = { first, second in first + second }
func add(first: Int, second: Int) -> Int {
impl(first, second)
}

· 約17分
arasan01

自己紹介

こんにちは、あらさん(@arasan01_me)です。最近youtube始めようと思ってネタを考えてたらFlutter for windowsのプラグインを作成していました。何を言ってるかは分からねぇが俺も分からねぇ。

youtube始めるとなると色々準備しなきゃー、と思ってarasan01.devというドメインを取得したところ、pub.devでpublisherを登録するときにはドメインが必要とのことですごくちょうど良かったです。ウレシイですね。

Flutterは何年か前にiOS, Androidの開発で試しに触ってみた程度で離れていて、Windows開発ができると聞いて戻ってきました。なのでFlutter開発経験はほとんどゼロです。いつもはiOSアプリを開発しています(Swiftはいいぞ)。

何を作ったのか

preview image

https://pub.dev/packages/drag_and_drop_windows

Flutter for windowsはそのままだとドラッグ&ドロップでファイルを受け取ることができません。もちろんWidgetなどをドラッグアウトしてファイルの書き出しもできません。

今回は簡単にできそうなドラッグ&ドロップを実験的に実装してみることにしました。Flutterのネイティブにまたがるプラグインは初めてだったのですごく楽しかったです。

簡単とはいえ初めてのプラグイン作成、しかもFlutter for windowsのネイティブを呼び出すものは中々検索にも引っかからず調べる時間がかなりかかってしまいました。そこでこの記事では何も知らないFlutter初心者がプラグインを作った過程を紹介します。