徹底理解ブロックチェーンを読む【ch02】

全体像を把握する

分散システムの利点

  • 計算能力の高さ
    • 接続されたすべてのコンピューターの能力
  • コスト削減
    • コンピューターは毎年安く・高性能になっている。置き換えやすい分散SYSは安く抑えることができる
  • 信頼性の高さ
    • PCが壊れても、接続されたPC全体の運用は継続可能
  • 自然に成長する能力
    • ネットワーク全体が増えれば計算能力が増えていく

分散システムの欠点

  • 協調のオーバーヘッド、通信のオーバーヘッド
    • 接続されたコンピュータの協調性を保ったり、通信をおこなうため、作業量や計算量が要求される
  • ネットワークへの依存性
  • プログラムの複雑化
  • セキュリティの不正
    • ネットワーク経由での通信は何者かに不正にアクセスされるおそれがある。

分散型のP2Pシステム

  • P2P
    • P2Pネットワークは各コンピュータ(ノードとも呼ぶ)で構成され、 各ノードに計算リソースを提供する。 P2Pにはファイル共有、コンテンツ配信といったアプリケーションがある。

徹底理解ブロックチェーンを読む【ch01】

はじめに

最近、ブロックチェーンの本を購入したので、読書メモがてらブログに投稿していきます!

これから、読む本は以下のものです。 徹底理解ブロックチェーン ゼロから着実にわかる次世代技術の原則(impress top gear) | Daniel Drescher, 株式会社クイープ |本 | 通販 | Amazon

ch01(レイヤと機能面)

今回の章は今後の説明のため、ソフトウェアに対しての考え方(レイヤ、完全性) を説明しています。

レイヤ

システムは以下の2つのレイヤに合わせる事ができる。

  1. アプリケーション層と実装層
  2. アプリケーション層はユーザーのニーズに合わせて、実装層はそれらのニーズを満たすことに焦点をあわせる。

  3. 機能面(システムが行うこと)と非機能面(システムに行わせること)

完全性

  • データ完全性
    • 管理されるデータが完全かつ正確
  • 振る舞い完全性
    • システムが意図したとおりに動くこと
  • セキュリティ
    • 承認されたユーザーだけがシステムのデータや機能にアクセス出来る。

デリゲートパターン

最近、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ではボタンアクションなどを作成することが多いですが、その際にはデリゲートパターンが効力を発揮します。 例えば、ボタンを押したら音が鳴る、ボタンを押して画面遷移などなど。

参考

Delegateについてのまとめ - エムティーアイ エンジニアブログ

【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よく使う操作まとめ

AtomVimバインドで最近コードを書いている。

頭の整理のため、よく使うコマンドをメモ

出来ること コマンド
単語一つ分戻る 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勉強メモ 〜Componentの基礎編〜

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>
    );
  }
}

実行画面 f:id:jesushill:20180708202703p:plain

参考

React.js コンポーネント入門(props/state)

Props · React Native