プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

用語メモ【TCP/IP】

shop.ohmsha.co.jp

この本を一度読み終え、二度目の読み直しをするので、読みながら用語や覚えておいた方が良いことをまとめていきます。

バッチ処理
 処理するプログラムやデータなどをまとめて一括で処理する方式。
 昔はパンチカードが使われていた・・・?

・Multi Vendor マルチベンダ
 ベンダは機器メーカーやソフトウェアメーカーを指す単語。
 単一のメーカーの機器・ソフトウェアでネットワークを構成するのがシングルベンダ。マルチベンダは、いろいろなメーカーの機器やソフトウェアの組み合わせ、ネットワークを構成させる場合を指す。

・いろいろなプロトコル
 IP,TCP,HTTP,IPX,SPX
 様々なプロトコルを体系的(→系統的。統一的。ひっくるめて?)にまとめたものを「ネットワークアーキテクチャ」ということもある。
 TCP/IPもIP,TCP,HTTPなどのプロトコルの集合体。

・パケット交換
 大きなデータをパケット(Packet:意味は小包→大きなデータを小包に小分けにして相手に届ける)と呼ばれる単位に分割して送信する方法。
 ネットワークを流れるパケットは、プロトコルが利用する「ヘッダ」とそのプロトコルの上位層が利用する「データ」から構成されている。
 それぞれのヘッダには、少なくとも2種類の情報が入っている。(→「宛先と送信元のアドレス」と「上位層のプロトコルが何かを示す情報」)

プロトコルの階層化
 ISOは通信プロトコルを設計するときの指標として、OSI参照モデルを提唱した。
 
 OSI参照モデル⭐︎p20
 通信に必要な機能を7つの階層に分け、機能を分割することで、複雑になりがちなネットワークプロトコルを単純化するためのモデル
 各階層は、下位層から特定のサービスを受け、上位層に特定のサービスを提供。

・ノード(Node)
 ネットワーク接続されている終端のコンピュータなどの機器を示す。

・不揮発性メモリ
 電源を切っても記憶したデータが消えない記憶装置。

・プレゼンテーション層
 「ネットワーク全体で統一された表現形式」から「コンピュータやソフトウェアに適した表現形式」に相互に変化する。

物理層
 データの0や1を電圧や光のパルス(→ ごく短時間だけ流れる電流や電波)に変換して、物理的な通信媒体に流し込む。直接接続された機器間でもアドレスが利用されることがある。
 これはMACアドレス物理アドレス、ハードウェアアドレスと呼ばれる。
 このアドレスは、同じ通信媒体に接続された機器を識別するためのアドレス。

 MACアドレス(Media Access Control)
 媒体アクセス制御。

通信方法の種類
ネットワークや通信は、データの配送方法によって分類できる。

・データの配送方法:コネクション型
 通信をする前にコネクションというロープを張る。(データの送信を開始する前に、送信ホストと受信ホストの間で回線を接続する→通信の前後にコネクションの確率と切断の処理を行うので、相手が通信不可能な場合には無駄なデータを送らなくて済む)
 ATM,フレームリレー,TCPなどのプロトコルがコネクション型

・データの配送方法:コネクションレス
 コネクションの確立や切断処理がない。送信したいときにいつでも送信できるが、通信相手がいるかどうかの確認は行われない。
 イーサネット,IP,UDPなどのプロトコルコネクションレス

・アドレス
 コンピュータ通信では、プロトコルの各層で異なるアドレスが使われている。
 MACアドレスIPアドレス、ポート番号、電子メールアドレス等。

・ネットワークインターフェースカード
 コンピュータをネットワークに接続するときに使う部品。NICと呼ばれる。

ゲートウェイ(Gateway)
 プロトコルの変換をする装置。変換し、中継も行う。
 www(world wide web)を使用するときに、ネットワークトラフィックの軽減やセキュリティを意図して代理サーバー(Proxy Server)を設定する場合がある。

bps(Bits Per Second)
 データ通信をするとき、2つの機器間を流れるデータの物理的な速さを伝達速度と呼び、伝達速度を表す単位がbps

スループット
 実際にホスト間(ホスト→ネットワークに接続されたコンピュータ)でやり取りされる電達速度のこと。単位はbps

・データリンク
 直接接続された機器間で通信するためのプロトコルやネットワークを指す言葉。

・リピーター
 OSI参照モデルの第1層の物理層でネットワークを延長する機器。(ケーブル上を流れてきた電気や光の信号を受信し、増幅や波形の整形などをしたのちに別の側へ再生させる)

・フレーム
 パケットとほぼ同じ意味で使われる。データリンク層ではフレームと表現するのが一般的。

・ブリッジ
 OSI参照モデルの第2層、データリンク層でネットワーク同士を接続する装置。物理アドレスMACアドレス)で処理を行う。

ルーター
 OSI参照モデルの第3層、ネットワーク層の処理を行う。ネットワークとネットワークを接続して、パケットを中継する装置のこと。ルーターはネットワークそうのアドレス(IPアドレス)で処理を行う。

・レイヤ4-7スイッチ
 OSI参照モデルトランスポート層からアプリケーション層の情報に基づいて配送処理を行う。

ロードバランサー
 複数のサーバーに負荷を分散させるレイヤ4-7スイッチの一種

・ネットワークについて
 インターネット接続サービスを利用するとき、スイッチや無線LANルーターで集約された通信は、アクセスに接続され、必要な場合はさらにエッジやバックボーンを経て通信相手に接続される。

TCP/IPという言葉が持つ意味
 TCPとIPという2つのプロトコルだけではなく、IPを利用したり、IPで通信したりするときに必要となる多くのプロトコル群の総称。
 具体的には、IP,ICMP,TCP,UDP,TELNET,FTP,HTTP等。
 TCP/IPプロトコルは、IETF(Internet Engineering Task Force)で議論され標準化される。標準化しようとするプロトコルは、RFC(Request For Comments)と呼ばれるドキュメントになり、インターネット上で公開される。
 参考⭐︎P69:Index of /rfc
 教えてもらったRFCに関する小ネタ
 鳥類キャリアによるIP - Wikipedia

 また、TCP/IPはもともとインターネットを通信するために開発されたプロトコルである。

TCP/IPOSI参照モデル
 TCP/IPで登場する様々なプロトコルも、OSI参照モデルに当てはめることができる。

デバイスドライバ
 OSとハードウェアの橋渡しをするソフトウェア

・ICMP(Internet Control Message Protocol)
 IPパケットの配送中に何らかの異常が発生してパケットを転送できなくなったときに、パケットの送信元に異常を知らせるために使われるプロトコル

ARP(Address Resolution Protocol)
 パケットの送り先の物理的なアドレス(MACアドレス)をIPアドレスから取得するプロトコル

・WWW(world wide web)
 インターネットで情報をやり取りする仕組み(アプリケーション)。
 webブラウザとサーバーの間の通信で使われるプロトコルがHTTP。送信に使われる主なデータフォーマットがHTML。
 WWWでは、HTTPがOSI参照モデルのアプリケーション層のプロトコル、HTMLがプレゼンテーション層のプロトコルと言える。

SMTP(Simple Mail Transfer Protocol)
 電子メールの配送で使われるプロトコル

SNMP(Simple Network Management Protocol)
 ネットワーク管理に利用されるプロトコルSNMPで管理されるルーターやブリッジ、ホストなどはエージェントと呼ばれ、ネットワーク機器を管理するプログラムをマネージャと呼ぶ。
 SNMPは、エージェントとマネージャの通信に使われるプロトコル

※今回は90ページまで。来週の休みで最後まで読む。

サンプルプログラムを作成【Java】

参考ページ
Spring Bootで簡単なWebアプリケーションを書いてみる - ももいろテクノロジー

このページをそのまま使わせてもらうと、このような画面が作れました。
f:id:boa0203:20171015154337p:plain

このページを作るにあたり、以下を理解することができました。

アノテーション
注釈・注意書きを追加する機能。一部のbeanを定義することもできる。
@Autowired
DIコンテナの中からクラスまたはインターフェースの派生クラスになっているbeanを検索して値を設定。
他にも、@Contollerや@GetMappingなど、色々なアノテーションがある。

DIコンテナについて
DI・DIコンテナ、ちゃんと理解出来てる・・? - Qiita

O/Rマッピング
オブジェクトとリレーショナルデータベースを対応付けすること→橋渡し。
データベース操作にかかわす煩雑な作業を軽減できる。

理解しているようで、理解していないような・・・ともかくこれでなんとか、来月中には完成できればいいな・・・。

技術とは全く関係ないですが
f:id:boa0203:20171015162608p:plain
コンソールに表示される、このアスキーアートのようなものが好きです。

正規表現について【メモ】

金曜日にこんな入力制限処理を作成しました。

//キー入力チェック(電話番号)
//テキストボックスのKeyPressイベントに処理を作成
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
	try
	{
		//バックスペース、ハイフンは使用可能にする
		if(e.KeyChar == 0x08 || e.KeyChar == '-')
		{
			return;
		}

		//数字キー以外の入力をキャンセルする
		if(e.KeyChar < 0x30 || e.KeyChar > 0x39)
		{
			e.Handled = true;
		}
	}
	catch (Exception ex)
	{
		Console.Error.WriteLine(ex);
	}
}

上記に使用しているのは、正規表現です。

正規表現とは

文字列パターンマッチのための簡易言語。
正規表現は色々なプログラミング言語に共通で使える。
(C# .NET Perl Java)

上記の正規表現では、ASCIIの文字列を使用しています。

!ASCII コード
コンピュータは二進数で様々な処理を行うので、文字データも二進数で表される。
文字を表現する二進数のことを文字コードと呼ぶ。


//キー入力チェック(全角のみ)
// ^ $ [ ] - について
//これらの特殊文字を、正規表現ではメタ文字という(メタ文字は他にもある ? * とか)
// ^ と $ は行の先頭や最後のミニ存在する文字列を検索する
// が、[]の中で ^ を使用すると、以外の文字(否定)を表す
//[] は指定した文字のどれか、-はaからzまで、の”から”という意味
//¥ は後に続くものが何なのかをわかりやすくするために書いてある

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
	try
	{
		
	if (Regex.IsMatch(e.KeyChar.ToString(),@"[^a-zA-z0-9¥uFF61-¥FF9F!-/:-@¥[-`{-˜]+$]"))
		{
			return;
		}
	}
	catch (Exception ex)
	{
		Console.Error.WriteLine(ex);
	}
}

Regex.IsMatchメソッドは、正規表現と一致する対象が指定した入力文字列内で見つかったかどうかを示します。

Javaを個人的にはじめて、反省に至るまで【Java】

前回の記事から、随分経ってしまいました。

6月ごろから友人と二人で、少しずつ開発をしています。
その経過を書いていきます。

開発環境

macOS Sierra
Java 8
Eclipse(Neon)


参考にしたぺージ

初心者でもほぼ無料でJavaを勉強できるコンテンツ10選 - paiza開発日誌

Angular 2 画面遷移

mobile:初心者のためのSpring Framework入門


1.eclipseでダウンロードから、データベース接続に至るまで。

まず、eclipseで動的プロジェクトを作成し、サイトを参考にしながらデータベース接続画面を作成してみました。
そして実行してみますが・・・
f:id:boa0203:20170916180808p:plain

できない。
リソースが無いと言われてしまったので、何かが足りないのだと思い試行錯誤しました。
ですが原因がわからなかったので、経験者に質問。
助言と参考画面をもらいました。

助言
・contextかserverファイルの書き方が間違っているのでは。
JSPTOMCAT をビルドすると、変なファイルが作られるときもあるので、キャッシュのクリアをした方が良いかもしれない。
Tomcatapache連携する。
JSONでパラメータを与えて非同期にする。

!context.xml
アプリケーションの配置場所や呼び出し方などの情報を設定するファイル。

!server.xml
Tomcatサーバの動作を定義する設定するファイル。

参考画像を元に、自分のDB接続設定のコードを確認したところ書き方の違いを発見。
書き直したところ、接続ができました。

2.画面にデータベースから取得したデータを表示するまで。

接続はできたので、今度は取得したデータの表示に取り掛かりました。
1で取ってこれた接続設定と、servletを使用してデータを表示したかったのですが、データの表示がうまくいきませんでした。
このservletの書き方が理解できず、時間を費やしてしまい焦りだし、結局サンプルのjspに直書きするものでなんとか表示させました。

f:id:boa0203:20170916235837p:plain


Servlet
サーバー上で動く部品のようなもの。Java言語で記述される。
MVCではControlにあたる。

JSP
HTML上に直接記述できるJava言語。
MVCではViewにあたる。

servletjspの違い
servletは常にコンパイルが必要だが、jspサーブレットエンジンがjspファイルを自動的に変換してくれる。
なので、jspservletに変換される。

MVCについて
Model、View、Control と役割分担をしてプログラムを作成する方法。
役割の内容
Control ・・・ DB関連
View ・・・ 画面表示
Model ・・・ 処理結果をViewに返す(ModelとViewの仲介、制御)

JavaでのModelはJavaBeansになる。JavaBeans自体は、直接クライアントから呼び出されることはない。(仲介、制御なので)

3.表示したデータから1つのデータを選択して、それを別のページに持って行くまで。
次に1つのデータを選択して、次のページに表示する処理を作ろうと考えました。
が、何をすれば良いのかわからず、経験者にお聞きしました。

<%@page contentType="text/html"%> 

<%@page import="java.sql.*"%>

<%!

// サーブレットのinitメソッドに相当

public void jspInit() {

    try {

        // JDBCドライバをロード

        Class.forName("com.mysql.jdbc.Driver");

    } catch (Exception e) {

        e.printStackTrace();

    }

}

%>

<html> 

<body> 


<%=session.getAttribute("mysql")%> 

<%= request.getParameter("eid")%>

</body> 

</html> 


そしてメソッドを使用して、次画面に持って来ることができました。

・・・ここから、jspservletやプロジェクトの中身などについて調べて行ったり来たりしますが・・・理解が追いつかなくなりました。

4.フレームワークを使用する

理解が追いつかなくなってきたので、経験者が教えてくれたフレームワークを使用しようと試みます。

使ってみたのは、Angular 2です。

f:id:boa0203:20170917012222p:plain

参考ページそのままの画面を表示できました。
ですが、このAngular 2の使用はやめることにしました。
コンポーネント指向、開発言語(TypeScript)の理解が必要だからです。
JavaScriptコードもままならないのに、無謀でした。

このAngular 2を少しだけ動かし、Java自体をもう一度やり直そうと反省しました。

5.現在

反省して今度はSpringフレームワークを調べつつ、画面を作っています。
・・・この記事は戒めです・・・。

別クラスから、メソッドを操作する【VB.NET】

タイトル通りです。
どうすれば良いのか、思いつかなかったので先輩に教えてもらいました。

Private Sub frmTest_FormClosing(sender As System.Object, _
				e As System.Windows.Forms.FormClosingEventArgs) _
				Handles MyBase.FormClosing

	'呼び出したい画面
	Dim frm As frmTest = CType(Me.Owner,frmTest)

	'comboboxクリア
	frm.cmbテスト.DataSouce = Nothing
	'combobox設定
	frm.cmbテスト設定(frm.cmbテスト,"")
	'combobox選択名設定
	frm.cmbテスト.Text = Me.strTestNm

End Sub

frm.cmbテスト設定()が、メソッド名です。
呼び出したいメソッドは、スコープをPublicにします。
・・・これが思いつかなくて時間がかかりました。

DataGridのカラムを指定してデータを取得【VB.NET】

DataGridが苦手なので、少し復習します。


'カーソルを特定の1行まで移動させる
For Each dr As DataGridViewRow in grdテストグリッド.Rows
	
	'strIDには、システムIDのデータの1つが入っている
	If dr.Cells("テストID").Value = strID Then
		grdテストグリッド.Rows(dr.Index).Selected = True
	End If

Next
'カーソルの場所までデータグリッドをスクロール
grdテストグリッド.FirstDisplayedScrollingRowIndex =  _
			grdテストグリッド.SelectedCells(0).RowIndex

DataGridViewのColumnではなくRowを使って、データを取り出すというのが頭にしっくりきません。
忘れないように気をつけます。
似たようなコードをもう一つ。

For Each dtGrid_test As DataGridViewRow In grdテストグリッド.Rows
	'NullValueエラー回避
	If dtGrid_test.Cells("テストコード").Value = Nothing Then
		Exit For
	End If


	str_test = dtGrid_test.Cells("テストコード").Value.ToString().Trim()
	
	str_selectedvalには、インサートしようとしているデータが入っている。
	If str_test = str_selectedval
		blCheck = False
		Call MsgBox("重複しています",Me)
                Exit Sub
	End If

Next

日付について色々【VB.NET】

前回の記事から時間が経ってしまいました。
今回は、VB.NETでの日付変換についてです。

'和暦を日付変換することによって、正確な日付が入力されているのか確認する。
If Not DateTime.TryParse(cmb_年号.Text +
						 txt_年.Text + "年" +
						 txt_月.Text + "月" +
						 txt_日.Text + "日",chkDate) Then
	
	Call MsgBox("作成を入力してください",Me)
	cmb_年号.Focus()
	Return False

End If

chkDateの中には、多分こんなものの一部が入っています。
0730...chkDateは、何時何分何秒が入っているだけでした。このように和暦でも、TryParseはできるそうです。ただ、新しい和暦になるとエラーになってしまうかもしれないとのこと。(先輩談)

次は西暦から和暦の変換です。

Public Function chg_西和(ByVal str日付 As String,ByVal intフォーマット As Integer) As String

'基準日の年・月・日を取得
Dim BaseY As Integer
Dim BaseM As Integer
Dim BaseD As Integer

'ループに使う変数
Dim cnt As Integer
Dim 元号 As Integer = UBond(元号一覧) '元号一覧の中身も後で確認

'6桁なら(年月のみ)8桁にする
If str日付.Length = 6 Then
	str日付 = str日付 + "01"
ElseIf str日付 = "0" Then
	Return ""
End If

BaseY = Integer.Parse(Mid(str日付,1,4))
BaseM = Integer.Parse(Mid(str日付,5,2))
BaseD = Integer.Parse(Mid(str日付,7,2))

'戻り値初期化
 chg_西和 = ""

'元号の数だけループ
For cnt = 0 To 元号 Step 1

	With 元号一覧(Cnt)
	'取得した基準日と、DBにある元号開始日・終了日を比べる
	'開始日より基準日が大きい、かつ、基準日が終了日より小さい場合
	If(Integer.Parse(.getKaisi) <= Integer.Parse(str日付) And _
	   Integer.Parse(str日付) <= Integer.Parse(.getSyuryo)) Then

	   If intフォーマット = 0 Then
	   '平成xx年xx月xx日と返す
	   chg_西和 = .getGengoNm & _
	   			 String.Format("{0:D2}",BaseY - _
	   			 				(Integer.Parse(Mid(Trim(.getKaisi),1,4))-1)) &"年"& _
	   			 String.Format("{0:D2}",BaseM) &"月"& _
	   			 String.Format("{0:D2}",BaseD) &"日"&


	   Else If intフォーマット = 1 Then
	   '以下、戻す値の形が変更される処理が続く

	End If

Exit For

Else If (Integer.Parse(.getKaisi) > str日付 Or _
	   str日付 < Integer.Parse(str日付) >= Integer.Parse(.getSyuryo)) Then

	   MsgBox.Show("基準日が正しく設定されていません")
	   'For文を抜ける
	   Exit For
End If

End With
Next

End Function