読者です 読者をやめる 読者になる 読者になる

学習履歴

プログラミングなどの学習履歴

プロトコルスタックにメッセージ送受信依頼の仕組み

データ送受信の仕組みを本で読んだのでそのアウトプットです。

 

データの送受信の仕組みは以下の4つに分かれています。

①自分のPC側にソケットを作る

②サーバー側のソケットにつなぐ

③データを送受信する

④ソケットを削除する

 

タイトルにあるプロトコルスタックですが、

これはOSに組み込まれているネットワークを制御するための

ソフトのことです。

プロトコルスタックにデータを送受信してくれと

お願いするとデータをやり取りするための仕組みを作ってくれます。

その仕組みを作る段階が上記の4段階にあたります。

 

①にあるソケットとはデータをやり取りするための出入り口のことです。

サーバー側からとこちらがわのPC側にトンネルを作るための入り口を

作るようなものです。

ただし複数のデータをやり取りする場合が多々あります。

そんな時はトンネルは1本だけではなく送受信する分だけトンネルが

存在します。

ここでデータを乗せた列車が間違ったトンネルに入って間違った目的地に

着いてしまうわけにはいきません。だからPC側のトンネルの入り口に番号が

ふられるのでそれを目印にどのトンネルを通ればよいかを認識しています。

この振り分けられた番号をディスクリプタと言います。

 

次に②でプロトコルスタックに両側からトンネルを掘って行って

つなげてくれと依頼します。

ただしここで注意したいのはこちら側のPCで割り振られたディスクリプタ

サーバー側では分からないことです。

ディスクリプタはデータをのせた列車にこのトンネルを通れと指示するために

使われるためにあるのでサーバ側からはこちらで割り振った番号は一切見えません。

となると別の手段が必要になるのでこちら側のPCとサーバー側のお互いのトンネルを正しくつなげるためにIPアドレスとポート番号が使われます。

このIPアドレスとポート番号によってサーバー側にこちらのディスクリプタを知らせることができます。

そこでようやくお互いにつなげるべきトンネルが分かったので両方側から穴を掘っていき開通が完了します。

 

そして③へ移ります。

ここで列車は正しいルートを使ってデータを送り届けることができます。

列車が着くとサーバー側はデータのことを受け取って

中身を調べたりといった手続きをします。

ホームページを閲覧する場合だとサーバー側は必要なデータを受け取ったら

プロトコルスタックに閲覧したいホームページをこちら側のPCがそれを

受信してくれるように依頼します。そしてつなげられたトンネルを通って

荷物(ホームページ)が届いて中身を確認できます。

 

最後に④です。

現実のトンネルとは違って上記のトンネルはつなぎっぱなしに

しておくわけにはいきません。自分たち専用のトンネルに

部外者がそのトンネルを使うことは許されませんので、

そのトンネルを他の人が通れないように閉じておきます。

お互いの入り口を封鎖するようなイメージです。

 

以上ですが送受信の仕組みをあげておきます。

Exercise: rot13Reader

A Tour Of Goの

Exercise: rot13Reader

をやってみました。

正直今の自分のレベルでは難しかった。。

改めて自分の力不足に嘆きたくはなりますが、

どうにかこうにか書けた(書けたのか?)と思いますので、

メモとして残しておきます。

以下がコードです。

 

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

func (root *rot13Reader) Read(b []byte) (int, error) {
    num, err := root.r.Read(b)

    if err != nil {
        return num, err
    }

    for i := 0; i < num; i++ {
        if ('A' <= b[i] && b[i] <= 'M') || ('a' <= b[i] && b[i] <= 'm'){
            b[i] += 13
        } else if ('N' <= b[i] && b[i] <= 'Z') || ('n' <= b[i] && b[i] <= 'z') {
            b[i] -= 13
        }
    }
    return num, nil
}

func main() {
    s := strings.NewReader("Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

 

これで実行をすると以下の文がでました。

You cracked the code!

Methods and pointer indirection

タイトルはA Tour og Goにあるタイトルです。

https://go-tour-jp.appspot.com/methods/6

 

この章をやったことのメモです。

ページを開いたときは以下のようなコードです。

package main

import "fmt"

type Vertex struct {
  X, Y float64
}

func (v *Vertex) Scale(f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}

func ScaleFunc(v *Vertex, f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}

func main() {
  v := Vertex{3, 4}
  v.Scale(2)
  ScaleFunc(&v, 10)

  p := &Vertex{4, 3}
  p.Scale(3)
  ScaleFunc(p, 8)

  fmt.Println(v, p)
}

 

これを以下のように変えても同じ結果になりました。

package main

import "fmt"

type Vertex struct {
  X, Y float64
}

func (v *Vertex) Scale(f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}

func (v *Vertex) ScaleFunc(f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}

func main() {
  v := Vertex{3, 4}
  v.Scale(2)
  v.ScaleFunc(10)

  p := &Vertex{4, 3}
  p.Scale(3)
  p.ScaleFunc(8)

  fmt.Println(v, p)
}

 

単純にScalaFuncメソッドの引数を一つにして、

メソッドレシーバーを先頭に持ってきただけです。

結果的には二つのメソッドの書き方を同じようにしただけですが、

メソッドレシーバーをメソッドの引数の一員にしようがしまいが

結果的には同じ処理になることを確認したかっただけです。

ポインタやポインタを使ったメソッドはGO言語からが初めてなので、

使い方に慣れるまで少し時間が必要だなと思いました。

wxPythonで簡単なサンプルエディタを作ってみた

 まだ完成形ではありませんが、まずは簡単なテキストエディタ

作ってみました。

といってもメモ帳とかそんな形式ではなくSublimeTextのみたいな

新規ファイルタブを増やしていけるような張りぼてを作りました。

 

テキストエディタを作ってみてまず思ったことは

AtomとかSublimeTextなど高機能エディタを作った人は

まじですごいと思いました。

エディタの構成によってあらゆる機能を実装する方法が違うので

あんな高機能なエディタを作った人がこの世にいるんだと考えると

世の中広いなとつくづく感じました。

 

wxPython自体が日本語訳されている資料があるなしという話以前に

情報そのものが少ないので結構苦労しました。

時には単純な機能の実装に手間取ったりとてんやわんやなことも

ありました。

 

一旦GitHubにあげました

⇒ https://github.com/yyyuuuiii/Pynapple

 

名前は適当でとりあえずPyって文字に関連したものであればなんでもいいや

といった感覚でつけました。

 

今回あげた分に関しては新規ファイルを動的に作成できる機能のみで

本来のテキストエディタに必要な保存やファイルを開くなどはつけていません。

メモ帳のような形式のテキストエディタであれば簡単ですが、

SublimeTextのようなエディタを作ろうと思ったらかなり複雑なことに気づきました。

あと余談ですがwxPythonを使えばEclipseのような開発環境自体を作ることも可能ですが、今の自分には手に負えるレベルではないですね(泣)

 

知っている方は知っているとおもいますがテキストエディタは通常の画面でみると

一つにまとまった形で映っているように見えます。

どういう風にできているかというとまず一番下にフレームがきて、その上にパネルを必要な分重ねていき、そのパネルの上にテキストやディレクトリツリーを重ねられてできています。

世の中にある高機能のテキストエディタ統合開発環境はそのような構成でできています。だから本来は無理ですが横から見た場合何層にも重ねられて構成されていることに気づくでしょう。

難しいと思ったのはフレームやパネルはそれぞれが持っている機能が異なっていて必要な機能をどうやってつなげていくかです。

この時点では何を言っているか分からないと思いますが、自分で体験した方が早いです、パズルを解いていくような感覚になります。

 

簡単なテキストエディタを作りましたがまた別に今回の経験をもとに本格的なテキストエディタを作成中です。

時間を見つけては他のことを学習しつつ、同時に進行させているといった具合です。

Railsチュートリアルを2周目を終了して

久方ぶりの更新です。

つい先日Railsチュートリアルの2周目が終了致しました。

そこから私が気づいたことですが、

個人的にRailsチュートリアルだけでは習熟するのは無理ということでした。

最新のチュートリアルである5.0版は要所要所で演習が出題されるので、

基本的に演習が出現する前に必ずヒントが出されるので解きやすくなっています。

ただ最終のおまけにある「返信機能」の実装などに挑むと

覚えたはずのことやこのインスタンス変数はどこにあったっけ?となり

返信機能を実装するための設計図はできるが書き方がまるで分かりませんでした。

 

かといってチュートリアルにヒントは書かれているはずですが、

そのヒントを探すのに書籍ほどスムーズに探し出すことができません。

まあそれ以前に私にセンスがないので基礎を2周しただけでは足りないってことに

気づきました。

 

チュートリアルだけで十分だよという人はすごいなと思うので羨ましく感じますが、

何回かチュートリアルをやってみたけどそれでも分からんって人は

やり方を変えるか、今はRailsを一旦あきらめるかにした方がいいのかもしれませんね。

 

最新のRailsチュートリアルと以前のRailsチュートリアルを比べて

Rails 5.0版をRailsチュートリアル4.2を終了してから2周目としてやり始めました。

railstutorial.jp

railstutorial.jp

 

上側のリンクが4.2版で下側のリンクが5.0版のリンクです。

中身を見るとやることは同じですが、演習を出題してくるタイミングが

異なります。

4.2版はチュートリアルに沿っての作業を一通り終わってから演習に臨むというやり方で5.0版は途中途中でこまめに演習を出題するという方式です。

 

結論から言えば最新版の方が効率的にRailsのことを記憶に留めやすくできています。

 

演習を最後に一気に行う4.2版だと演習をする前に行っていたことを忘れてしまい混乱しやすい形式なので効率が悪いです。

逆にこまめに出題するやり方だとその演習の答えが出題演習より前にヒントがあるのでチュートリアルを初心者でもスムーズに進めやすくなっています。

それでも最低2周はした方がよいです。

それと開発環境ですが自分でローカルで作れるならばよいですが、Windows環境はおすすめできません。Rails自体がLinux環境またはMac環境のために作られている感じがするので、Windows環境の人はCloud9を使うことをお勧めします。

 

Railsチュートリアルをこれから学習しようとしている方に一つの参考になれば幸いです。

Windows環境下でVagrantで仮想環境を作って、AWSを設定してデプロイまで①

AWSRailsアプリをデプロイしようと思い、試していった時の手順をメモとして残します。

 

環境・・Windows8.1

Windowsなら10が望ましいと思います、というのは最近情報も増えてきているし8.1より設定の方法が簡単だと思います。

 

Vagrant

このサイトに載っていることを手順通りにしていけば大丈夫です。

【Windows7(64bit)】VirtualBox+VagrantでCentOSの仮想環境構築 - Qiita

 

あと同時にVirtualBoxもインストールする必要がありますが、最新版だと

うまく仮想環境が作れないので私は4.3.40をインストールしました。

 

あとvagrant upをしたときに「The LXC provider only works on Linux. Please try to use another provider.」と表示されたら

set VAGRANT_DEFAULT_PROVIDER=virtualbox」コマンドを走らせてから、

再度、vagrant upをしてください。

色々何か出ていきますが、終わったらvagrant statusをすると

vagrantの状態が分かるのでそこでrunningとでれば起動はOKです。

補足ですがvagrantを停止するときはvagrant suspendを使ってください。

停止コマンドにはもう一つvagrant haltというものがありますがこれは完全停止なので、

今まで設定したことなどが残らないので基本的には一時停止を意味するvagrant suspendを使って止めてください。

再開するときは改めてvagrant upを使えば大丈夫です。

 

②ターミナルツールを2つ

使ったのはTeratermPuttyです。Teratermはローカル開発環境用に使い、PuttyAWSにログイン、アクセスするために使いました。どちらも最新版でOKです。

 

AWSインスタンスとネットワークの設定

使うサービスはEC2です。インスタンスの作成というボタンをクリックして先に進むと下図になります。

f:id:ayshi:20161204194816p:plain

 

赤枠の箇所を選択して先に進みます。

次の画面

f:id:ayshi:20161204195019p:plain

こちらも赤枠のところを選んでいきます。

次の画面

f:id:ayshi:20161204195151p:plain

私はこの時うっかりしてデフォルトのサブネットを消してしまいましたので、警告がでています。消していなければデフォルトのサブネットが選ばれているはずですが、デフォルトで設定するより自分で設定した方が管理しやすくなると思います。

上図でまず新しいVPCの作成を選びます。

選ぶと下の画面に続き、VPCの作成ボタンを押すと以下のようなダイアログが出てきます。

f:id:ayshi:20161204195750p:plain

ネームタグには任意の名前を入力します。

CIDRブロックは自分のネットワークの範囲を決めるということで開始は10.0.0.0/16とデフォルトでは決められていてここに入力するのは範囲の最後を入力します。

10.0.0.0/24で大丈夫です。

最後に作成ボタンをクリックすると仮想ネットワークが作成されます。

すると「インスタンスの詳細」画面でネットワークをさっき作ったネットワークに設定します。

 

次にサブネットですが、インスタンスの詳細」画面で「新しいサブネットの作成」を選択します。下図の画面に移ったらサブネットの作成ボタンを押すとダイアログがでてきます。

f:id:ayshi:20161204200633p:plain

ネームタグにはVPC作成時に設定した名前と同じにしました。

アベイラビリティゾーンはap-northeast-1aを選択しました、これの意味はネットワークエリアを東京に限定するということです。aとbに分かれていますが基本的にaを選びます。

CIDRブロックもVPCと同じに設定します。

 

次に「インスタンスの詳細設定」画面に戻り、自動割り当てパブリックIPは有効化を選びます。

そして「次の手順ストレージの追加」ボタンをクリックして次に進みます。

残りは下記の記事と同じです。

Capistrano3 + Rails4 + Unicorn + Nginx + EC2でサーバー構築! - Qiita

 

次に続きます。