徹底理解ブロックチェーンを読む【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"]
vimよく使う操作まとめ
頭の整理のため、よく使うコマンドをメモ
出来ること | コマンド |
---|---|
単語一つ分戻る | b |
単語一つ分進む | w |
一つの行削除 | dd |
D | 行のカーソル右側部分を削除 |
\dj | \d行下へ |
u | 元に戻す |
ea | 単語の末尾でInsertMode |
A | 行末に移動し、InsertMode |
I | 行の先頭にテキストを挿入 |
R | 現在選択している文字を新しい文字で上書き |
x | 文字の削除 |
X | カーソル前の文字削除 |
zz | 画面の真ん中の位置にする |
i | 単語の前にInsertMode |
a | 単語の後にInsertMode |
\dG | d行目に移動 |
( | 文分を上に移動 |
) | 文分を下に移動 |
>> | 右にインデント |
<< | 左にインデント |
gt | 次のタブへ移動 |
gT | 前のタブへ移動 |
gg | 先頭行へ移動 |
G | 最下行へ移動 |
React Native State
React Native (State)
前回に続き、ReactNativeの説明を行います。 今回は、Stateに焦点を当てます。
Stateとは
component内で使用出来る値となります。 値が変更(setStateを用いる)されるとrenderが走り、該当のcomponentが 再描画されます。
コード
以下にコードを記述します。
class ChildrenState
で 親コンポーネント(ParentState)に
対して、propsを渡しています。
class ParentState
では、内部でカウンタを持ち、setStateで1秒ごとに
props(コンポーネント内部の変数)を変更しています。
propsが変更された際、renderメソッドが呼び出され、コンポーネントの再描画をしています。
class ParentState extends React.Component { constructor(props){ super(props); this.state = {isShowingText: true}; setInterval(() => { this.setState(previousState => { return { isShowingText: !previousState.isShowingText }; }); }, 1000); } render(){ let display = this.state.isShowingText ? this.props.text : ' '; return ( <Text>{display}</Text> ); } } export default class ChildrenState extends React.Component { render(){ return ( <View style={{alignItems: 'center', marginTop: 200}}> <ParentState text='state1' /> <ParentState text='state2' /> <ParentState text='state3' /> <ParentState text='state4' /> </View> ); } }
参考
React Native Props
React Native (Props)
前回に続き、ReactNativeの説明を行います。 今回は、Propsに焦点を当てます。
Props
Componentが作成された際に異なったパラメータが作成されます。
その際に親から渡されたパラメータを Props
と呼びます。
Props
以下では Helloというコンポーネントを定義しています。 メインで実行するclassはHelloChildremで、その際に Helloコンポーネントを呼び出した際に、props.nameを渡しています。
# App.js class Hello extends React.Component { render(){ return ( <Text>Hello {this.props.name}!</Text> ); } } export default class HelloChildren extends React.Component { render(){ return ( <View style={{alignItems: 'center', marginTop: 200}}> <Hello name='props1' /> <Hello name='props2' /> <Hello name='props3' /> </View> ); } }
実行画面