徹底理解ブロックチェーンを読む【ch03】
可能性を認識する
P2Pとは
定義
複数のノードで(個々のコンピュータ)で構成される分散システム
複数のノードは以下の役割計算リソースの提供を負う供給者であり、消費者でもある。
P2Pのアーキテクチャ
基本的には分散システムだが、一部、集中型の要素を利用するのもある。 集中型の要素を用いた代表的なP2Pはナップスター
完全な分散型は集中システムが介在する必要がないため、中抜きが必要なくなる。
音楽ダウンロードを例にすると、
集中システム: アーティスト(音源作成) → 集中システム(レコード会社) → (購入)ユーザー
に対して
分散システム: アーティスト → ユーザー
と、中抜きがなくなる。
徹底理解ブロックチェーンを読む【ch02】
全体像を把握する
分散システムの利点
- 計算能力の高さ
- 接続されたすべてのコンピューターの能力
- コスト削減
- コンピューターは毎年安く・高性能になっている。置き換えやすい分散SYSは安く抑えることができる
- 信頼性の高さ
- PCが壊れても、接続されたPC全体の運用は継続可能
- 自然に成長する能力
- ネットワーク全体が増えれば計算能力が増えていく
分散システムの欠点
- 協調のオーバーヘッド、通信のオーバーヘッド
- 接続されたコンピュータの協調性を保ったり、通信をおこなうため、作業量や計算量が要求される
- ネットワークへの依存性
- プログラムの複雑化
- セキュリティの不正
- ネットワーク経由での通信は何者かに不正にアクセスされるおそれがある。
分散型のP2Pシステム
徹底理解ブロックチェーンを読む【ch01】
はじめに
最近、ブロックチェーンの本を購入したので、読書メモがてらブログに投稿していきます!
これから、読む本は以下のものです。 徹底理解ブロックチェーン ゼロから着実にわかる次世代技術の原則(impress top gear) | Daniel Drescher, 株式会社クイープ |本 | 通販 | Amazon
ch01(レイヤと機能面)
今回の章は今後の説明のため、ソフトウェアに対しての考え方(レイヤ、完全性) を説明しています。
レイヤ
システムは以下の2つのレイヤに合わせる事ができる。
- アプリケーション層と実装層
アプリケーション層はユーザーのニーズに合わせて、実装層はそれらのニーズを満たすことに焦点をあわせる。
機能面(システムが行うこと)と非機能面(システムに行わせること)
完全性
- データ完全性
- 管理されるデータが完全かつ正確
- 振る舞い完全性
- システムが意図したとおりに動くこと
- セキュリティ
- 承認されたユーザーだけがシステムのデータや機能にアクセス出来る。
デリゲートパターン
最近、Swiftを勉強していて、デリゲートパターンが よく使われているのでブログにまとめておきます。
デリゲートパターンとは
Delegateとは日本語で 委譲 を意味します。 日本語の意味する通り、デリゲートパターンとは 他者(他クラス)に規定した処理(Swiftではプロトコルが使われる)を委譲することを意味します。
code例
コード例は以下の通りとなります。
// プロトコルを宣言 protocol HouseWorkDelegate { func startHouseWork() func cleanRoom() func makeDish() func finishHouseWork() } // class Employer { var Servant:HouseWorkDelegate? = nil func doWork() { if let sv = self.Servant { sv.startHouseWork() sv.cleanRoom() sv.makeDish() sv.finishHouseWork() } else { print("今日は使用人がいないので家事をはじめます") print("掃除をします") print("料理を作ります") print("家事、終わります。自分で作る料理はうまくない") } } } class Servant : HouseWorkDelegate { func startHouseWork() { print("使用人が家事をはじめます") } func cleanRoom() { print("掃除をします") } func makeDish() { print("料理を作ります") } func finishHouseWork() { print("家事、終わります。美味しい料理ができました!") } } var employer = Employer() var servant = Servant() // 主人が家事をする employer.doWork() // 使用人が家事をする employer.Servant = servant employer.doWork()
解説
今回は家事を行う設計を書いています。 プロトコルでは家事を以下のメソッドを規定しています。
- startHouseWork()
- cleanRoom()
- makeDish()
- finishHouseWork()
ここで重要なのはメソッドを規定するだけで実際に処理を 委譲するのはどのクラスでも問題ないということです。 今回のケースではServantが委譲先ですが、プロトコルに規定した 関数を実装すれば、どんなクラスでも、どんな実装でも構いません。
Swiftではボタンアクションなどを作成することが多いですが、その際にはデリゲートパターンが効力を発揮します。 例えば、ボタンを押したら音が鳴る、ボタンを押して画面遷移などなど。
参考
【swift】 配列のメソッド -remove-
最近、swiftを勉強しているので頭の整理のために継続的に書いていきます。
removeAll
公式ドキュメント
公式ドキュメントは こちら
ドキュメントから定義を抜粋すると以下の通りです。
# methodの内容 Removes all elements from the collection. コレクションから全ての要素を除く # mutatiting mutating func removeAll(keepingCapacity keepCapacity: Bool = default)
定義をざっくり解説すると以下の通りです。 - コレクション(配列、辞書、set)から全ての要素を除く - mutatingは自身の値を変更する際に用いられるキーワード - 戻り値は定義なし(当たり前ですが)
sample
var ary = [1, 2, 3] // [Int型] print(ary) # 型はArray型なので []となる。
解説でも触れましたが、コレクションで使える関数なので辞書型でも使えます
var dict = ["key": 1] dict.removeAll() print(dict) // []
remove(at:)
var ary2 = [1, 2, 3] // [Int型] ary2.remove(at: 1) print(ary2) // [1, 3]
removeFirst
var ary3 = [1, 2, 3] // [Int型] ary3.removeFirst() print(ary3) //[2, 3]
- removeFirst(n)
// 最初の要素からn番目の要素を削除 var ary4 = [1, 2, 3] // [Int型] ary4.removeFirst(2) print(ary4) // [3]
removeLast
var ary5 = ["first", "second", "last"] // [String型] ary5.removeLast() print(ary5) // ["first", "second"]
- removeLast(n)
// 最後の要素からn番目の要素を削除 var ary6 = ["first", "second", "last"] // [String型] ary6.removeLast(2) print(ary6) // ["first"]