サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
inon29.hateblo.jp
概要 SwiftUIのViewの書き方には今までのSwiftにはなかった特徴があります。 次のような、クロージャにViewを連続で渡すようなDSL記法です。 今までのSwiftを書いたことがある人は、「なぜこんな書き方ができるんだろう?」と疑問に思われた人もいるかもしれません。 struct ContentView: View { var body: some View { VStack { Text("1行目") Text("2行目") Text("3行目") } } } これには、@ViewBuilder という仕組みが使われているのですが、今回はこの @ViewBuilderとその元の拡張につかわれている @_functionBuilderについて調べてみました。 環境 Swift: 5.2 Xcode: 11.4 VStackのイニシャライザを確認 今回は、VStackという標準V
概要 FirebaseAuthの signInWithRedirect をそのまま使うと、Safariで動かないという問題があったので事象の理解と対応のメモ 問題のサマリー 問題のissueはhttps://github.com/firebase/firebase-js-sdk/issues/6716に上がっている。 要約すると、 リダイレクト先のデフォルトは <project>.firebaseapp.com というドメインになる FirebaseAuthのログイン処理にiframeを使っているが、クロスドメインになると一部のブラウザ(Safari, Firefox)でセキュリティエラーになるため使用できない 解決方法 issueにも書かれているが、Googleが正式にドメインを提示している。 https://firebase.google.com/docs/auth/web/redir
概要 inon29.hateblo.jp 前回は、WebRTCのAPIをつかったP2P接続の導入として、1台のPC上(1画面上)で擬似的にRTCPeerConnectionによる接続を試してみました。 今回は、同じローカルネットワークで、別々の端末でP2Pの接続ができるような実装を試してみます。 (STUNサーバを建てないため、NATトラバーサルは行いません) Peer同士の接続の開始には、WebSocketによるシグナリングサーバを建てることで2台の接続を確立します。 シグナリングの流れ RTCPeerConnection APIを使用したシグナリングの流れは、上記になります。 前回のサンプルでは、シグナリングサーバを実装していなかったため、1画面での擬似的な接続を試しました。(本来シグナリングサーバ経由で渡すSDPやICE Candidateを直接渡していた) 今回は、ローカルでシグナ
概要 inon29.hateblo.jp 前回は、WebRTCの導入してブラウザからPCのカメラとマイクを起動するサンプルを実装してみました。 今回は、1台のローカルPCでP2Pの通信をつなげるサンプルを実装してみます。 この記事の目標 1つの画面上で、P2Pのコネクションを繋げて片方のpeerから送信した動画と音声をもう片方のpeerで受け取り、htmlの <video> タグに表示する WebRTCにおけるシグナリング WebRTCで双方の端末をつなげるためには、RTCPeerConnection APIを使用します。 RTCPeerConnection APIは、簡単に記載すると双方の端末の接続の準備や管理を行うためのAPIです。 RTCPeerConnectionでは、双方の接続にSDP(Session Description Protocol)を使用します。これはお互いにやり取り
概要 SwiftUIでは、変数を参照型として扱うためのBindingという型があります。 Bindingを扱うためには、@Binding という PropertyWrapperを使うことが多いと思いますが、Binding型 というデータ型と@Bindingの扱いでたまに混乱してしまうことがあります。 そのため、整理のための @Binding と Binding型について自分なりにまとめてみました。 自分が混乱しがちなことでもあり、誤った解釈があるかもしれませんので、お気づきの方がいればご指摘いただければ幸いです。 環境 Swift: 5.2.2 Xcode: 11.4.1 @Binding @Bindingは、Binding型を扱うための PropertyWrapper です。 一般的な使い方としては、別のViewに対して参照型ではない値(Bool型など)を渡す場合に使われることが多いかと
概要 最近はSwiftUIでアプリを書いているんですが、色々と戸惑うところが多かったので備忘録的にまとめておきます。 環境 Swift version 5.1 onAppearが呼ばれるタイミング 画面再描画時の挙動 SwiftUIには、Viewが初めて描画されるタイミングで呼ばれるコールバックメソッドとして onAppear が用意されています。 (この逆のメソッドとしてViewが非表示になるタイミングで呼ばれる onDisappear もあります。) SwiftUIでは、Viewの状態の変更変更を検知し、画面の再描画をすることでリアクティブなプログラムを実現していますが、 onAppearは、この画面再描画とは関係なく初めてViewが表示される1回目に呼ばれます。 Viewが再描画される時は、Viewのstructは基本的に再度生成されます。(initメソッドが呼ばれます) しかし、V
Dockerでは、自分で独自のimageを作成することが可能です。 独自のdocker imageを作成する方法は主に2つあります。 ① docker container commitコマンドを使う ② Dockerfileからビルドする 今回は、①の起動中のDockerコンテナから新しいイメージを作成する方法を試してみます。 ※ 実行環境は、Docker for Macを使っています。 ※ 環境構築については過去記事のとおりです。 inon29.hateblo.jp docker container commitコマンドを使う ベースイメージの準備 今回はnginxのイメージを元に独自のイメージを作成してみます。 まずは、ベースとなるnginxのimageをDocker Hubからダウンロードします。 docker image pull nginx:latest docker image
はじめに この記事の内容は、実装方法に依存する話です。 実装によっては必要ない場合もありますのでその前提で読んでいただければと思います。 環境 XCode: 11.4 Swift: 5.2 概要 SwiftUIの画面描画は基本的には階層構造になっています。 struct FirstView: View { var body: some View { VStack { SecondView() } } } struct SecondView: View { var body: some View { VStack { ThirdView() } } } このように、親のViewから子Viewをbodyプロパティ内から呼び出す方式になっており親Viewのbodyプロパティが再計算されると、その子Viewも再度生成されます。 (「生成される=構造体が作り直される」のため、init()メソッドが呼
概要 SwiftUIにおける基本的な画面遷移の方法についてまとめてみました。 SwiftUIはぱっと1画面を試すのは非常にシンプルで便利なのですが、個人的にはまだ画面遷移の方法に慣れない部分もあり、整理してみました。 環境 XCode 11.4 Swift 5.2 ① NavigationLink https://developer.apple.com/documentation/swiftui/navigationlink はViewをスタック構造(push/pop)で管理して遷移する方法です。 UIKitにおけるUINavigationControllerによる遷移と同じ動きをするiOSの伝統的な画面遷移の方法になります。 NavigationLinkは、NavigationView の配下に設置したSubViewでのみ動作します。 実装例 struct RootView: View
概要 アップル独自の認証方法「Sign in with Apple」について、SwiftUIを使って実装してみます。 環境 XCode: Version 11.3.1 Swift: Version 5.1 Sign in with appleのボタンの作成 まず、はじめにボタンコンポーネントの作成から実装します。 Sign in with appleに使用するボタンについては、Apple側で ASAuthorizationAppleIDButton という標準のボタンコンポーネントを用意してくれています。 これを使うとわざわざデザインしなくても公式のボタンデザインが使用できるので通常はこのコンポーネントを使うのがいいのではないかと思います。 (認証機能自体は別実装ですので独自デザインも可能です) ただし、ASAuthorizationAppleIDButtonは、SwiftUIの標準コンポ
※ この記事時点のGoのバージョンは「1.10.2」です Goでは、特定の型に関連づけられた関数を「メソッド」と呼びます。 また、メソッドを呼び出される対象(型)のことを「レシーバ」と呼びます。 inon29.hateblo.jp ポインタレシーバと変数レシーバ(値レシーバ) メソッドを宣言した時のレシーバの型が「ポインタ」なのか「変数(値)」なのかによってメソッドの挙動が異なります。 レシーバがポインタのものを「ポインタレシーバ」変数(値)のものを「変数レシーバ(値レシーバ)」と呼びます。 package main import ( "fmt" ) type Direction struct { X, Y float64 } // 変数レシーバ(値レシーバ) func (d Direction) Display() { fmt.Printf("X: %f, Y: %f\n", d.X,
最近Goを勉強し始めました。 関数とメソッドの違い 基本的には次のように考えています。 関数は、一般的な関数(funcから始まる) メソッドは「型」に関連付けられた関数 関数 package main import "fmt" // これは関数 func Bark() { fmt.Println("Bow wow. Woof woof.") } func main() { // 関数呼び出し Bark() } 出力 Bow wow. Woof woof. メソッド package main import "fmt" // 型を一つ定義 type Animal struct{ name string } // これはメソッド func (animal Animal) Bark() { fmt.Printf("[%v] meow.", animal.name) } func main() {
gRPCについて興味があったため触ってみました。 記載内容については誤りがあるかもしれません。ご指摘ありましたらいただけると幸いです。 gRPCとは Googleによって開発されたRPCフレームワークです。 そもそもRPCとは(remote procedure call)の略で、なかなか上手く説明できないのですが、 例えばあるマシンからHTTPのプロトコルで決まった形式でのやり取りを行って、別のマシンのプログラム(関数)を実行する。ようなものを指します。 RPCには様々な種類が存在しますが今回は割愛します。(JSON-RPC、XML-RPCなど) gRPCもRPCの一種になります。 Protocol Buffers gRPCの特徴の一つとしてデータのシリアライズに「Protocol buffers」という技術が使われています。 これはメッセージデータの構造、手続きの構造を定義するためのイン
EC2インスタンスのセットアップ AMIが提供されているので対象のインスタンスのリンクをクリック クリックすると通常のEC2セットアップ画面に遷移するので環境に合わせた設定でインスタンスを作成する 一応上記リンクではt2.smallが最低として推奨されているようです AMIそのまま起動するとメモリ900M近くを使っているのでsmall以下だと厳しいようです セキュリティグループはhttp(80)とhttps(443)のインバウンドを許可します sshでアクセス ベースがubuntuディストリビューションなのでユーザー名はubuntuです ssh -i <key_path> ubuntu@<public_ip> とりあえず、パッケージをアップデートする sudo apt-get -u update sudo apt-get -u upgrade redashを最新バージョンにアップデート c
EthereumのContractにおいて、 Contract内部から他のContractの関数を呼び出したいケースがあります。 その時に考えられる方法としては主に以下の2つかと思います。 ①Contract内で別のContractをnewする ②既にデプロイされている外部のContractを使う 今回は、②の方法について検証してみました。 ①の場合は特に意識をする必要ないですが、②の場合は既にデプロイされているContractを使うため、外部から値を受け取る必要があり、今回はContractのaddressを受取るという方法をとっています。 デプロイ済みの(共通利用される)Contract pragma solidity ^0.4.11; contract MyToken { uint256 public totalSupply; mapping (address => uint256)
OpenZeppelinというフレームワークのソースコードを引き続き読んでいます。 過去はこちら inon29.hateblo.jp 今回は、DayLimitというContractのソースを読んでみました。 DayLimitコントラクトは、関数に日付の実行制限を付与するためのコントラクトです。 ソース https://github.com/OpenZeppelin/zeppelin-solidity/blob/v1.2.0/contracts/DayLimit.sol フィールド uint256 public dailyLimit; uint256 public spentToday; uint256 public lastDay; dailyLimit: 一日に動かせる制限値 spentToday: 一日に動かした量 lastDay: 最後に動かした日(int) コンストラクタ func
仕事の関係でブロックチェーンのプラットフォームであるEthereumを調べることになり、 簡単な動作確認を行うためにプライベートのEthereumのネットワークを作成してみました。 ※ 調べながらのものなのでところどころ間違っているかもしれません。 ※ ブロックチェーン、仮想コイン自体の知識も深くないためそちらも認識に齟齬があるかもしれません。 動作環境 OS: ubuntu:14.04 * ※ 僕の環境はMacOSなのですが、試行錯誤なので環境がよごれないようにDockerでubuntuをインストールして試しています。 * ※ Docker周辺の操作自体は割愛させていただきます。 Ethereumとは Ethereumは、ブロックチェーンを使ったアプリケーションのプラットフォームです。 (Ethereum、ブロックチェーンの技術詳細については、ここでは割愛します。) ブロックチェーンを使
引き続き、Ethereumを勉強中です。 前回はEthereumのプライベートネットワークを構築する方法について調べました。 inon29.hateblo.jp 今回は、Ethereumのコアな機能であるSmartContractについて実際に動かしてみたいと思います。 実行環境 Ubuntu14.04 on docker スマートコントラクトとは スマートコントラクトは、Ethereumを使う上で重要な機能の一つです。 スマートコントラクトとはその名のとおり契約を行う機能で、簡単にいうとブロックチェーンを利用して自動で契約の実行を行うことができるというものです。 例えば、初めに契約の一定の条件と契約時の実行内容を定義しておくと、その条件を満たした時に自動で契約内容が処理される。 といったことが実現できます。 イメージとしては、ブロックチェーン上で行われるやり取り(トランザクション)にブロ
Ethereumの勉強を引き続きしています。 Contractをネットワークへデプロイする場合、 今までは、Ethereum WalletやRemix経由で行っていたのですが、ソースをコンパイルしていデプロイする方法がよくわからなかったので調べてまとめてみました。 古いバージョンのgethでは、コンソール上でコンパイルができるようなのですが、最新のgethではできないようです。 なので今回は、javascriptのAPIであるweb3を使ってSollidityのソースをコンパイルします。 Solidityのインストール npm install solc SolidityのコンパイルをJavascript上で行うためにSolidityのパッケージをインストールします web3のインストール npm install web3@0.20.0 JavaScriptAPI環境であるweb3をインスト
Ethereumのトークンとは Ethereum上でトークンとよばれるコントラクトを作成することで独自の暗号通貨を作成することが可能です。 トークンを使うことで、コイン、ポイントなど様々な仮想的な価値をEthereumの仕組みの上で利用することができます。 トークンはEhereumのネットワーク上のアカウント間で自由にやりとりすることが可能です。 トークンコンストラクト トークンを定義するためのコンストラクトには、幾つかの標準APIが定義されています。 トークンAPIの議論についてはここでされています。 Ethereumのトークンのサンプル実装は、ここにあります。 pragma solidity ^0.4.8; contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address
前回は、Kerasのインストールを行い機械学習を行うための環境を構築しました。 inon29.hateblo.jp しかし、今の状態だと何をどうすればどう使えるのかも全く分からないため、とりあえずKerasのサンプルソースを読んで理解を深めていこうと思います。 その前にニューラルネットワークの前提知識が完全にゼロでソースを理解するのはおそらく難しいだろうなと思い、各所で紹介されている以下の書籍を読みました。 ただし、数学や計算処理については、完全に理解するのは大変そうだったため、難しそうな部分はサラッと流しています。 まずは、なんとなく理解したディープラーニングについて自分なりの解釈をまとめます。 www.oreilly.co.jp ※ これは自分の学習用のまとめになります。 ※ 上記のため単語やアルゴリズムの解釈が間違っている。齟齬がある。場合があるかとおもいます。 ※ 理解がない人が初
最近、今更ながら機械学習の勉強をしてみようと思い、色々調べていました。 僕は行列計算などの高校数学もほとんどわからないのですが、最近はPythonでのエコシステムがかなり充実してきているようで、頑張れば簡単なもの位は作れるようになるかなと思い、1から勉強しようと思っています。 まずは、Macに環境構築するところから始めます。 機械学習のライブラリとしては、Google製のTensorFlowが有名(僕が知らないだけですが..)ですが、色々みていると、Chainer、Kerasというのが最近の人気のようです。 Chainerは、日本製とのことで日本語の資料が充実しているらしいのですが、今回はKerasを使ってみます。 理由は、GoogleのTensorFlowをバックエンドに使えるということもあり、今後も成熟が期待できそうだからです。 環境構築の方法は、TensorFlowの公式ページなど色
swiftでクラスからプロパティ名のリストを取得する方法です。 static func propertyNames() -> Array<String> { var names: Array<String> = [] var count: UInt32 = 0 self.classForCoder() let properties:UnsafeMutablePointer<objc_property_t> = class_copyPropertyList(self.classForCoder(), &count) for var i: UInt32 = 0; i < count; i++ { let property = properties[Int(i)]; let cname = property_getName(property) let name = String.fromCStr
スタイルとはなに? レイアウト属性とその値のセットをいくつか組み合わせて, 1つのIDで使用できるように定義したもです。 何のために使用する? 複数のレイアウト属性を共通で使いまわすために使用します。 例えばテキストの”フォント”、”フォントサイズ”、”フォントカラー”などの スタイルのセットを共通で使いまわすことができます。 どうやって使う? res/values/の配下にxmlファイルを配置します。 idをソース上で使用する場合は、(R.style.*)として参照します。 <?xml version="1.0" encoding="utf-8"?> <resources> <style name=“[id名]”> <item name="android:textStyle">italic</item> <item name="android:textColor">#ffffff</it
バックグラウンドで動くプログラムServiceを使ってみました。 Serviceの使用方法 Serviceの起動方法には、 startService()を使用 bindService()を使用 の大きく分けて2種類があります。 Service起動方法の違い 起動方法による違いは、以下のとおりです。 startService Service起動中は、ActivityへIntentの発行が可能。 Service起動後は、ActivityからServiceを制御する経路がない。 Serviceの生存期間はActivityに依存しない。明示的にstopServiceが呼ばれるまで動き続ける。 bindService バインドを使うことでActivityからServiceを制御できる。 Serviceの生存期間はコネクションに依存。コネクションが切断されるとServiceは終了する。 startSe
コンテンツプロバイダは、Androidのアプリケーションが管理しているリソースを 他アプリケーションから参照するための仕組みです。 例えば、連絡先アプリなど他アプリケーションから活用できるデータを持つアプリケーションが、 その他アプリケーションへデータを提供する際に使用されます。 今回は、SQLiteデータベースの情報を取得するサンプルを作成しました。 SQLiteデータベースへアクセスするためのクラスを作成 コンテンツプロバイダのデータ提供元となるデータベースを作成します。 testdbという名前のDBにfruitというテーブルを作成しています。 public class ShareDbHelpler extends SQLiteOpenHelper { private static final String DB_NAME = "testdb"; private static fina
Androidのアプリの中には、 何かのアプリを起動中もずっと画面上に残り続けるアプリがあると思います。 今回は、上記のように他のアプリケーション上で、 自分のアプリケーションのViewを表示する方法について試して見ました。 Androidのviewは、複数のレイヤーによって構成されており、 通常のアプリケーションのレイヤーは、他のアプリケーションの画面上に乗せることができません。 常に画面上に自分のアプリケーションのViewを表示し、 他のアプリケーションが起動中も自分のアプリのViewを画面上に表示するためには、WindowManagerを使ってレイヤーを指定する必要があります。 通常のアプリケーションの上に載せられるレイヤーには、 幾つか種類がありますが、今回は、画面上のViewに対してタッチイベントを取得したかったので、WindowManager.LayoutParams.TYPE
Android 3.0から導入されたLoaderについて、 参考サイトをもとに勉強していましたがいまいちよくわからず。。 Loaderを継承した、AsyncTaskLoaderの方が使い方がわかりやすそうだったので、 まずはこちらを使用してみました。 Loaderの基本クラス Loader 非同期のデータロードを行う為の抽象クラス。 LoaderManager Loaderインスタンスを管理するためのクラス。 LoaderManagerインスタンスは、1つ以上のLoaderインスタンスを管理する。 Activityまたは、Fragmentごとに1つしか作られない。 LoaderManager.LoaderCallbacks Activityまたは、FragmentとLoaderManager間で、 双方向にやりとりするためのコールバックインターフェース。 AsyncTaskLoaderを使
Android 3.0 (API Level 11) から導入されたActionBarについて、 少しずつ勉強していきたいと思います。 ActionBarとは Android 3.0以降で提供されているアクティビティ用のウィジェットです。 ActionBarは、4つの領域に分かれており各領域からアプリへの操作を制御することが可能です。 1.App icon アプリのテーマアイコンを表示する領域です。 タップにより、画面ナビゲーション階層の制御を行います。 2.View control ドロップダウンメニューやタブコントロールなどビュー切り替えの機能を提供しています。 検索バーを表示して検索機能を実装することも可能です。 3.Action buttons アプリ操作のアクションボタンを配置する領域です。 ボタンを長押しすることで、アクションの名前を表示します。 4.Action overfl
次のページ
このページを最初にブックマークしてみませんか?
『inon29.hateblo.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く