20210911のiOSに関する記事は4件です。

EUC-JPでURLエンコーディングする

はじめに クエリを含むURLを作成したい時には、URLエンコーディングを行う必要があると思います。 EUC-JPでエンコードする記事はあまり見かけないのでまとめます。(今どき、EUC-JP使っているサーバーなんてほぼないと思いますが。。。) ご参考になればと思います! 実装してみる 今回は String の Extension で実装します。 import Foundation extension String { var encodedByEUCJP: String { // エンコーディングしない文字列をキャラクタセットとして定義 let allowedCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~") // エンコーディングを定義する let eucjpEncoding = String.Encoding(rawValue:CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.EUC_JP.rawValue))) // Data型にする let data = self.data(using: eucjpEncoding, allowLossyConversion: true) ?? Data() // URLエンコードしていく let urlEncoded = data.map { byte -> String in if allowedCharacters.contains(UnicodeScalar(byte)) { return String(UnicodeScalar(byte)) } else if byte == UInt8(ascii: " ") { return "+" } else { return String(format: "%%%02X", byte) } }.joined() return urlEncoded } } 試してみる 無事、EUC-JPでURLエンコーディングできました! print("テスト".encodedByEUCJP) // %A5%C6%A5%B9%A5%C8
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】EUC-JPでURLエンコーディングする

はじめに クエリを含むURLを作成したい時には、URLエンコーディングを行う必要があると思います。 EUC-JPでエンコードする記事はあまり見かけないのでまとめます。(今どき、EUC-JP使っているサーバーなんてほぼないと思いますが。。。) ご参考になればと思います! 実装してみる 今回は String の Extension で実装します。 import Foundation extension String { var encodedByEUCJP: String { // エンコーディングしない文字列をキャラクタセットとして定義 let allowedCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~") // エンコーディングを定義する let eucjpEncoding = String.Encoding(rawValue:CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.EUC_JP.rawValue))) // Data型にする let data = self.data(using: eucjpEncoding, allowLossyConversion: true) ?? Data() // URLエンコードしていく let urlEncoded = data.map { byte -> String in if allowedCharacters.contains(UnicodeScalar(byte)) { return String(UnicodeScalar(byte)) } else if byte == UInt8(ascii: " ") { return "+" } else { return String(format: "%%%02X", byte) } }.joined() return urlEncoded } } 試してみる 無事、EUC-JPでURLエンコーディングできました! print("テスト".encodedByEUCJP) // %A5%C6%A5%B9%A5%C8
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Flutter】社内向け入門講座の内容公開

インドネシアのPT.AQ Business Consulting IndonesiaでFlutterのエンジニア兼アドバイザーをしております菊池と申します。 Zennで本を出版しておりますflutter chips(30,000字程度) 本記事で伝えること Flutterを用いた簡単なアプリ開発デモ 開発効率をあげるTips デバッグ方法 おすすめパッケージ アーキテクチャ紹介 やっておいたほうが良いこと 知っておいて損しないこと 情報収集源 本記事を読む前に 本記事を読む前提として以下を実施済みですと、より内容が理解しやすいかと思います。 - Flutterの環境構築 以下の弊記事を参考にして環境構築を進めていただければと思います。 【Flutter】アプリ開発入門 Flutter環境構築 Hello Flutter!! 簡単なデモ webviewアプリ作成 ソースコード 開発効率あげる方法 AndroidStudio プラグイン 詳細な内容は弊記事【Flutter】モバイルアプリ高速開発プラットフォームをさらに爆速化するTipsを参照ください。 おすすめプラグイン FlutterSnippets Flutter Enhancement Suite Flutter Pub Version Checker flutter-img-sync FlutterJsonBeanFactory 静的解析 詳細な内容はこちらの記事Dart/Flutter の静的解析強化のススメを参照してください。 実装方法 インストール pedantic_monoパッケージをインストール。 pubspec.yaml dev_dependencies: pedantic_mono: any analysis_options.yamlの配置 https://github.com/mono0926/pedantic_mono/blob/master/example/analysis_options.yaml をプロジェクトのルートに置く。以上。 デバッグ方法 break point break pointを用いて、ソースコード実行中の途中で停止させることで、各変数に格納されている値を確認できます。デバッグ時に必須の手法になります。以下の記事などで詳しく紹介されています。 debug tool 詳細は弊記事【Flutter】インターフェース開発に強いFlutterで、さらにUI開発を加速させるテクニックを参照してください。 おすすめパッケージ flutter_svg SVG画像をFlutter内で扱う際に必須のパッケージ。 アイコンなどはPNG等のピクセル画像で入れると画像がボケたりしてしまうので、極力ベクター画像を使うようにしましょう。 auto_size_text テキストのサイズを動的に変更。端末の横幅によって収まらない場合や長いテキストの入力値に対しても、ほとんど意識せずに適応してくれる。 やっておいたほうが良いこと FVMでのFlutterのバージョン管理 Flutterはアップデートが頻繁に行われ、複数人でプロジェクトを進行する上では、Flutterのバージョンを合わせて開発する必要があります。 その上で、Flutterのバージョンをローカル上に複数共存させて、簡単に切り替えを行えるようにできるツールがFVMです。 ↓↓↓使用方法は弊記事を参考にしてください↓↓↓ 情報収集源 公式関連 monoさん Medium 知っておいても良いこと DartPad DartやFlutterのコードをブラウザ上で実行できるサイト。 ちょっとしたコードの確認などを行う際に便利です。 クローンアプリ系 TwitterやWhatsApp,Slackなどのクローンアプリを作成して公開してくれている方がいます。 参考にできる点も多いかと。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】Metal Best Practicesの解説(9) ロードと保存

Metal Best Practicesは、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。 本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。 読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。 また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。 他の記事の一覧は、初回記事よりご覧下さい。 Load and Store Actions(ロードと保存) ベストプラクティス:レンダーターゲット(レンダー先)に適切なロードおよびストアアクションを設定します。 レンダリングパスの開始時のロードアクションと、終了時のストアアクションは、不要なコストを回避するために、適切なアクションを選択しましょうという話。 ロードアクション、ストアアクションの指定というのは要するに、今回レンダリングする対象にレンダリング前に前回のフレームのコンテンツを読み込んだり、クリアするかどうか(ロードアクション)、レンダリング後にコンテンツを保存するかどうか(ストアアクション)を指定する、ということです。 具体的には、ロードアクションでは、レンダーターゲットにある以前のコンテンツを、気にしない(.dontCare)/クリアする(.clear)/以前のコンテンツをロードする(.load)、のどれかを選択します。 ストアアクションでは、レンダリングパスの処理が終わったあと、レンダーターゲットの内容を、保持しない(.dontCare)/保持する(.store)/マルチサンプルの解決をして保持する(. storeAndMultisampleResolve)/マルチサンプルの解決をして破棄する(.multisampleResolve)する、のどれかを選択します。 通常、ドローアブルにレンダリングするときの内容を保持する必要があるためストアアクションは通常.storeになります。depthやstencilのレンダーターゲットの場合は、レンダリング中は値が必要ですが、レンダリング後には不要になるので一般的には.dontCareを使います。 なお、複数のレンダリングパスで使用されるレンダーターゲットは、レンダリングパス間のストアアクション、ロードアクションの組み合わせを気にする必要があります。 コードで確認してみる コードで確認してみます。 こちらのサンプルコードを改変して、検証します。 ロードアクションに.clear、ストアアクションに.storeを指定した場合 この指定をした場合、レンダリング前に以前のコンテンツはクリアします。レンダリング後は内容を保持しします。 まず表示するパーティクル数は負荷をかけるために100万にしておきます。 ParticleMetalView.swift func draw(in view: MTKView) { // 略 // パーティクルの数を100万にする renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4, instanceCount: 1000000) // 略 } またレンダリングをしない領域も作りたいので、パーティクルは画面中央だけに表示するようにします。 RandomParticleShader.metal vertex ColorInOut randomParticleVertexShader( const device float4 *positions [[ buffer(0)]], const device float2 *texCoords [[ buffer(1) ]], constant Uniforms &uniforms [[buffer(2)]], uint vid [[ vertex_id ]], uint iid [[ instance_id ]] ) { ColorInOut out; float t = uniforms.time; float4 pos = positions[vid]; float4 converted = flowDownParticle(pos, iid, t); converted.x /= 2; // 追加 out.position = converted; out.texCoords = texCoords[vid]; out.instanceId = iid; return out; } そして今回のテーマである、loadActionを.clearに、storeActionを.storeにします。 ParticleMetalView.swift func draw(in view: MTKView) { guard let drawable = view.currentDrawable else {return} let commandBuffer = metalCommandQueue.makeCommandBuffer()! renderPassDescriptor.colorAttachments[0].texture = drawable.texture renderPassDescriptor.colorAttachments[0].loadAction = .clear // 指定する renderPassDescriptor.colorAttachments[0].storeAction = .store // 指定する renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.8, 0.7, 0.1, 1.0) // 略 // パーティクルの数を100万にする renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4, instanceCount: 1000000) 実行してみると、実機(iPhone 11)で、49〜50FPS出ていました。 実行イメージは次のようになります。レンダリングしていない領域は、clearColorに指定した色になっています。 ロードアクションに.dontCare、ストアアクションに.storeを指定した場合 この指定の場合、レンダリング前に以前のコンテンツをロードすることもクリアすることもありません。レンダリング後は内容を保持しします。 先程の部分を次のように書き換えます。 ParticleMetalView.swift renderPassDescriptor.colorAttachments[0].loadAction = .dontCare renderPassDescriptor.colorAttachments[0].storeAction = .store 実行してみると、50〜51FPS出ています。少し早くなりましたね。 実行イメージは、レンダリングしていないは領域が黒くなりました。なお、このシェーダーは100万パーティクルをレンダリングしたあと描画をやめますが、loadActionが.dontCareの場合、描画をやめた後は未定義になるため、途中からこんな感じに画面が崩れます。 ロードアクションに.dontCare、ストアアクションに.dontCareを指定した場合 この指定の場合、レンダリング前に以前のコンテンツをロードすることもクリアしないし、レンダリング後も内容を保持しません。 先程の部分を次のように書き換えます。 ParticleMetalView.swift renderPassDescriptor.colorAttachments[0].loadAction = .dontCare renderPassDescriptor.colorAttachments[0].storeAction = .store 実行すると52〜53FPSになりました。さらに早くなりましたね。 ただ、この指定だとレンダリング後にも内容が保持されないので、画面の状態が未定義になりこのようなちらつく画面になってしまいました。 ※チラつきが早いと目に悪いのでFPSを落とした動画にしています 結論 わずかな差でしたが、ロードアクション、ストアアクションで余計な処理をしないことで、パフォーマンスが上がることが確認できました。 最後に iOSを使った3D処理やAR、ML、音声処理などの作品やサンプル、技術情報を発信しています。 作品ができたらTwitterで発信していきますのでフォローをお願いします? Twitterは作品や記事のリンクを貼っています。 https://twitter.com/jugemjugemjugem Qiitaは、iOS開発、とくにARや機械学習、グラフィックス処理、音声処理について発信しています。 https://qiita.com/TokyoYoshida Noteでは、連載記事を書いています。 https://note.com/tokyoyoshida Zennは機械学習が多めです。 https://zenn.dev/tokyoyoshida
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む