2018年10月4日木曜日

ミニマクロ


Sub 空白埋め()
'########################
'#  範囲を指定して空白を埋めます
'########################
Dim SCol As Variant, RCol As Variant, SRow As Variant
        SCol = InputBox("埋める【開始列】を" & vbCrLf & _
        "【数字】で入力")
  
        ECol = InputBox("埋める【終了列】を" & vbCrLf & _
        "【数字】で入力")
  
        SRow = InputBox("何行目から始めますか?" & vbCrLf & _
        "【開始行】【数字】で入力")
  
        'キャンセルを押されたらマクロを停止する
        If SCol = "" Or ECol = "" Or SRow = "" Then Exit Sub
  
        'エラーチェックをしたので数字にする
        SCol = Val(SCol)
        ECol = Val(ECol)
        SRow = Val(SRow)
 
 Dim Sh As Worksheet
 Dim rngTARGET As Range
 Dim BUF As Variant
 Dim r As Long
 Dim c As Long
 Dim MaxRow As Long
 Dim cRM As Range

        Set Sh = ActiveSheet
       
        '指定した列の中で一番行数が多い列の行数を変数に入れる【MaxRow】
        For Each cRM In Range(Cells(SRow, SCol), Cells(SRow, ECol))  '最初の行の開始終了列
                If Sh.Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
                        MaxRow = Sh.Cells(Rows.Count, cRM.Column).End(xlUp).Row
                End If
        Next

        '2行目以下の使用済みセル範囲の値を配列化【rngTARGET】
        Set rngTARGET = Sh.Range(Cells(SRow, SCol), Cells(MaxRow, ECol))
       
        BUF = rngTARGET.Value
       
        '空白を埋める
        For r = 1 To UBound(BUF)  '行方向
                For c = 1 To UBound(BUF, 2)
                        If IsEmpty(BUF(r, c)) Then
                                BUF(r, c) = BUF(r - 1, c)
                        End If
                Next c
        Next r
       
        'データ書き出し
        rngTARGET.Value = BUF
       
        '後始末
        Erase BUF
        Set rngTARGET = Nothing
        Set Sh = Nothing

 MsgBox "空白を埋めました"
 End Sub


 Sub 確認_複数シートを1シート()

'########################
'#  複数のシートを1つのシートにまとめます。
'#  見出しは最初のシートから作られます。
'#  1行目に見出し行がある同じ形式のシートを1枚にまとめたい時に使います。
'########################
選択 = MsgBox("見出しが同じ複数のシートを1つのシートにまとめます。" & vbCrLf & _
        "見出しは最初のシートから作られます。(見出しの複数行指定は不可)" & vbCrLf & _
        "実行しますか?", vbYesNo + vbExclamation, _
        "複数シートを1シートにまとめる")
       
        If 選択 = vbYes Then               '[はい]なら
                複数シートを1シート
        Else                                            '[いいえ]なら
                Exit Sub
        End If
End Sub
 Sub 複数シートを1シート()

'########################
'#  複数のシートを1つのシートにまとめます。
'#  見出しは最初のシートから作られます。
'#  1行目に見出し行がある同じ形式のシートを1枚にまとめたい時に使います。
'########################
Dim SCol As Variant, SRow As Variant
    SRow = InputBox("見出しは【何行目】にありますか?" & vbCrLf & _
        "【数字】で入力してください")
       
    SCol = InputBox("データは【何列目】から始まりますか?" & vbCrLf & _
        "【数字】で入力してください")
       
        'キャンセルが押されたらマクロを終了する
        If SRow = "" Or SCol = "" Then Exit Sub
       
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
    SCol = Val(SCol)
       
Dim i As Integer
Dim MaxRow As Long, MaxRow2 As Long, ECol As Long
Dim cRM As Range
Dim PSh As Worksheet
Dim CSh As Worksheet
        Application.ScreenUpdating = False
    '-----全データシートの有無をチェックします
    Call sh_check
    Set PSh = Worksheets("全データ")
    Set CSh = Worksheets(2)
    '------見出し行をたどって列数を決める
    ECol = CSh.Cells(SRow, Columns.Count).End(xlToLeft).Column
   
        '------列見出しをコピー
        CSh.Range(CSh.Cells(SRow, SCol), CSh.Cells(SRow, ECol)).Copy PSh.Range(PSh.Cells(1, 1), PSh.Cells(1, ECol))
       
            For i = 2 To Worksheets.Count
                With Worksheets(i)
                    Set CSh = Worksheets(i)
                   
                    '指定した列の中で一番行数が多い列の行数を変数に入れる
                    For Each cRM In Range(.Cells(SRow, SCol), .Cells(SRow, ECol))
                        If .Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
                            MaxRow = .Cells(Rows.Count, cRM.Column).End(xlUp).Row
                        End If
                    Next
                   
                    '-----シートのデータが2行以上の場合にコピー
                    If MaxRow >= 2 Then
                   
                        '指定した列の中で一番行数が多い列の行数を変数に入れる★貼付側
                        For Each cRM In Range(PSh.Cells(1, 1), PSh.Cells(1, ECol))
                            If PSh.Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow2 Then
                                MaxRow2 = PSh.Cells(Rows.Count, cRM.Column).End(xlUp).Row + 1
                            End If
                        Next
                       
                        .Activate
                        .Range(Cells(SRow + 1, SCol), Cells(MaxRow, ECol)).Copy PSh.Cells(MaxRow2, 1)
                    End If
                End With
               
            Next i
           
            PSh.Activate
            Range("A1").Select
            Application.ScreenUpdating = True
           
        MsgBox "シートをまとめました"
       
End Sub
Sub sh_check()
'########################
'#  シートの有無を判定
'########################
Dim newSh As String
Dim Sh As Worksheet, myFlag As Boolean
        newSh = "全データ"
        myFlag = False
       
            For Each Sh In ActiveWorkbook.Worksheets
                If Sh.Name = newSh Then
                    myFlag = True
                    '-----全データシートのデータをクリアし、先頭へ移動します
                    Worksheets(newSh).Cells.ClearContents
                    Worksheets(newSh).Move before:=Worksheets(1)
                End If
            Exit For
            Next Sh
            '-----全データシートを先頭へ追加します
            If myFlag = False Then
                ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
            End If
End Sub
Sub 確認_複数列の比較()
'########################
'#  4列までのデータを比較します。
'#  同じデータがあればOK、なければNGを出します。
'#  動きが重いので行数が多いと待たされます
'########################
選択 = MsgBox("上下に並んだ2つのデータを比較します。" & vbCrLf & _
"【!】必ずA列から開始します" & vbCrLf & _
"【!】双方のデータ間は2行以上開けてください" & vbCrLf & _
"比較できるのは4列までです" & vbCrLf & _
"実行しますか?", vbYesNo + vbExclamation, _
"複数列の比較")
        If 選択 = vbYes Then
            複数列の比較
        Else
            Exit Sub
        End If
End Sub
Sub 複数列の比較()
'########################
'#  4列までのデータを比較します。
'#  同じデータがあればOK、なければNGを出します。
'#  動きが重いので行数が多いと待たされます
'########################
Dim i As Integer, ii As Integer, res1 As Variant, res2 As Variant
res1 = InputBox("データ1の開始行番号を入力してください")
res2 = InputBox("データ2の開始行を入力してください")
       'キャンセルを押されたらマクロを停止する
        If res1 = "" Or res2 = "" Then Exit Sub
   
        'エラーチェックをしたので数字にする
        res1 = Val(res1)
        res2 = Val(res2)
   
        '画面更新を休止する
       ' Application.ScreenUpdating = False
       
            For i = res1 To Range("A" & res1).End(xlDown).Row
                For ii = res2 To Range("A" & res2).End(xlDown).Row
                    If Cells(ii, 1).Value = Cells(i, 1).Value And Cells(ii, 2).Value = _
                       Cells(i, 2).Value And Cells(ii, 3).Value = Cells(i, 3).Value Then
                            If Cells(ii, 4).Value <> Cells(i, 4).Value Then
                                If Cells(i, 6).Value = "" Then
                                    Cells(i, 6).Value = Rows(ii).Row
                                Else
                                    Cells(i, 6).Value = Cells(i, 6).Value & "," & Rows(ii).Row
                                End If
                            Else
                                If Cells(i, 6).Value = "" Then
                                    Cells(i, 6).Value = Rows(ii).Row & "-OK"
                                Else
                                    Cells(i, 6).Value = Cells(i, 6).Value & "," & Rows(ii).Row & "-OK"
                                End If
                            End If
                        End If
                    Next
            Next
        With Cells(res1, 5)
            .FormulaR1C1 = "=if(iserror(find(""OK"",rc[1],1))=false,""OK"",""NG"")"
            .Copy
        End With
       
        Range(Cells(res1, 5), Cells(Range("A" & res1).End(xlDown).Row, 5)).PasteSpecial Paste:=xlPasteFormulas
       
        Application.CutCopyMode = False
       
       ' Application.ScreenUpdating = True
       
    MsgBox "比較が完了しました"
End Sub
                      
 Sub ハイパーリンク削除()

'########################
'#  開いているシートのハイパーリンクを全部削除します。
'#
'#
'########################
選択 = MsgBox("今開いているシートのハイパーリンクを全部削除します。実行しますか?", vbYesNo + vbExclamation, _
"ハイパーリンクの削除")
        If 選択 = vbYes Then
            ActiveSheet.Hyperlinks.Delete
        Else
            Exit Sub
        End If
MsgBox "ハイパーリンクを削除しました"
End Sub
Sub 文字列を結合する()

'########################
'#  複数行に同じ文字列が連続するセルを結合します
'#
'#
'########################
Dim myCol As Integer
Dim SCol As Variant
Dim ECol As Variant
Dim SRow As Variant
Dim myRng As Range
Dim myRow As Long
Dim cRM As Range
Dim MaxRow As Long
        SCol = InputBox("縦方向に同じ文字があれば結合します。【何列目】から開始しますか?数字で列を指定してください")
ECol = InputBox("何列目まで作業しますか?数字で列を指定してください")
SRow = InputBox("何行目から開始しますか?数字で行を指定してください")
    'キャンセルを押されたらマクロを停止する
    If SCol = "" Or ECol = "" Or SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
    ECol = Val(ECol)
    SRow = Val(SRow)
   
    '指定した列の中で一番行数が多い列の行数を変数に入れる
    For Each cRM In Range(Cells(SRow, SCol), Cells(SRow, ECol))
        If Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
            MaxRow = Cells(Rows.Count, cRM.Column).End(xlUp).Row
        End If
    Next
   
    '画面更新を休止する
    Application.ScreenUpdating = False
   
    '列[myCol]==============================
   
        myCol = SCol  'SCol 列から
   
        Do While myCol <= ECol     'ECol列まで、以下を繰り返します
   
    '行[myRow]==============================
   
        '指定行から各列を場所指定
        Set myRng = Cells(SRow, myCol)
       
            '指定行、指定列の中で以下作業をする
            With Cells(myRow, myCol)
                '今いる行の上の一つ下と今の行の値が同じなら
                If .Value = .Offset(1, 0).Value Then
                    '下の行と今の行を範囲指定する
                    Set myRng = Union(myRng, .Offset(1, 0))
                '下の行が違う値なら
                Else
                    '指定範囲の結合を実行する
                    Application.DisplayAlerts = False
                    myRng.Merge
                    Application.DisplayAlerts = True
                   
                    '一つ下に進む
                    Set myRng = .Offset(1, 0)
                End If
            End With
        Next
    '列================
        '次の列に進む
        myCol = myCol + 1
        Loop
        '画面更新を再開する
        Application.ScreenUpdating = True
    MsgBox "結合しました"
End Sub
   
Sub オートフィルタ等解除()

'########################
'#  ウィンドウ分割とオートフィルタを解除
'# 解除したいしオートを開いてから実行する
'#
'########################
Dim xlApp As Excel.Application
選択 = MsgBox("今開いているシートのウィンドウ分割とオートフィルタを解除します。実行しますか?", vbYesNo + vbExclamation, _
"ウィンドウ分割とオートフィルタを解除")
    If 選択 = vbYes Then
        '画面更新を休止する
        Application.ScreenUpdating = False
       
        Cells.Select
        Selection.EntireColumn.Hidden = False
        ウィンドウ分割解除
        オートフィルタ解除
    Else
        Exit Sub        '実行中止
    End If
   
        '画面更新を再開する
        Application.ScreenUpdating = True
    MsgBox "ウィンドウ分割とオートフィルタを解除しました"
   
End Sub
Sub オートフィルタ解除()
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
End Sub
Sub ウィンドウ分割解除()
    ActiveWindow.FreezePanes = False
   
End Sub
   
Sub 指定行削除す()

'########################
'#  特定の文字列がある行を削除したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################
res1 = InputBox("指定したキーワードがある行を削除します。" & vbCrLf & _
    "【キーワード】を入力してください「*」使用可。")
SCol = InputBox("キーワードがある【列】は何列目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SCol = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
   
    'データ最終行
    MaxRow = Cells(Rows.Count, SCol).End(xlUp).Row
    Application.ScreenUpdating = False
    For i = MaxRow To 1 Step -1
        If Cells(i, SCol) Like res1 Then
            Range(i & ":" & i).Delete
        End If
       
        Next i
        Application.ScreenUpdating = True
       
        MsgBox "行を削除しました"
       
End Sub
Sub 指定行挿入()

'########################
'#  特定の文字列の上に行を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################

Dim res1 As String
Dim MaxRow As Long
Dim i As Long
Dim SCol As Variant
res1 = InputBox("指定したキーワードがある行の上に行を挿入します。" & vbCrLf & _
    "【キーワード】を入力してください「*」使用可。")
SCol = InputBox("キーワードがある【列】は何列目ですか?" & vbCrLf & _
"【数字】で指定してください")

    'キャンセルを押されたらマクロを停止する
    If SCol = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
   
    'データ最終行
    MaxRow = Cells(Rows.Count, SCol).End(xlUp).Row
    Application.ScreenUpdating = False
    For i = MaxRow To 1 Step -1
        If Cells(i, SCol) Like res1 Then
            Range(i & ":" & i).Insert
        End If
       
        Next i
        Application.ScreenUpdating = True
       
        MsgBox "行を挿入しました"
       
End Sub
Sub 指定列削除()
'########################
'#  特定の見出しの前に列を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'# 画面更新をoffにすると削除できない・・
'########################
Dim res1 As String
Dim SRow As Variant
Dim MaxCol As Long
Dim i As Long
res1 = InputBox("指定したキーワードがある列を削除します。" & vbCrLf & _
"【キーワード】を入力してください。「*」使用可")
SRow = InputBox("キーワードがある【行】は何行目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
   
    'データ最終列
    MaxCol = Cells(SRow, Columns.Count).End(xlToLeft).Column
   
    For i = MaxCol To 1 Step -1
        If Cells(SRow, i) Like res1 Then
            Columns(i).Delete
        End If
    Next i
MsgBox "列を削除しました"
End Sub

Sub 指定列挿入()
'########################
'#  特定の見出しの前に列を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################
Dim res1 As String
Dim SRow As Variant
Dim MaxCol As Long
Dim i As Long
res1 = InputBox("指定したキーワードがある列の前に列を挿入します。" & vbCrLf & _
"【キーワード】を入力してください。「*」使用可")
SRow = InputBox("キーワードがある【行】は何行目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
   
    'データ最終列
    MaxCol = Cells(SRow, Columns.Count).End(xlToLeft).Column
   
    Application.ScreenUpdating = False
   
    For i = MaxCol To 1 Step -1
        If Cells(SRow, i) Like res1 Then
            Columns(i).Insert
        End If
    Next i
   
    Application.ScreenUpdating = False
MsgBox "列を挿入しました"
End Sub
Sub 指定列を全角に()
'########################
'#  半角を全角に変換します
'#
'########################
Dim x As Long
Dim y1 As Long
Dim y2 As Long
Dim aa As valiant
Dim bb As Range
y1 = InputBox("全角にしたい開始列を数字で入力してください")
y2 = InputBox("全角にしたい終了列を数字で入力してください") + 1
x = InputBox("全角にしたい行のはじめを数字で入力してください")
        Do While y1 < y2
            Columns(y1).Select         '列を選択します
            Set bb = Intersect(Selection, ActiveSheet.UsedRange)   '選択されたシートが指定の基準(コード入り)と一致する場合
            aa = bb.Value
           
                For x = x To UBound(aa, y1)   '1列1行~データが入っている最後のaa行1列まで
                    aa(x, y1) = StrConv(aa(x, y1), vbWide) '文字列を数字にします
                Next x
               
            bb.Value = aa
           
            Set bb = Nothing
           
            y1 = y1 + 1
        Loop
End Sub

End Sub

2018年10月1日月曜日

アンインストーラ2

on error resume next
dim installPath
dim addInName
dim addInFileName
dim objExcel
dim objAddin
'アドイン情報を設定
addInName="○ミニマクロ"
addInFileName="MacroTools.xlam"
if Msgbox(addInName & "マクロをアンインストールしますか?", vbyesno + vbQuestion)=vbno then
 wscript.quit
end if
'Excelインスタンス化
set objExcel=createobject("Excel.application")
objExcel.workbooks.add
'アドイン登録解除
for i = 1 to objExcel.addins.count
 set objAddin = objExcel.addins.item(i)
 if objAddin.Name = addInFileName then
  objAddin.Installed = false
 end if
 next
 objExcel.Quit
set objAddin = nothing
set objExcel = nothing
set objWshShell = createobject("WScript.Shell")
set objFileSys = createobject("Scripting.FileSystemObject")
'インストール先パスの作成
installPath = objWshShell.SpecialFolders("Appdata") & "\Microsoft\Addins\" & addInFileName
'ファイル削除
if objFileSys.FileExists(installPath) = true then
 objFileSys.DeleteFile installPath , true
else
 msgbox "マクロファイルが存在しません", vbExclamation
end if
set objWshShell = nothing
set objFileSys = nothing
if Err.Number = 0 then
 msgbox "マクロのアンインストールが終了しました", vbInformation
else
 msgbox "エラーが発生しました。実行環境を確認してください"
end if

インストーラ

on error resume next
dim installPath
dim addInName
dim addInFileName
dim objExcel
dim objAddin
'アドイン情報を設定
addInName="○ミニマクロ"
addInFileName="MacroTools.xlam"
if Msgbox(addInName & "マクロをインストールしますか?", vbyesno + vbQuestion)=vbno then
 wscript.quit
end if
set objWshShell = createobject("WScript.Shell")
set objFileSys = createobject("Scripting.FileSystemObject")
'インストール先パスの作成
installPath = objWshShell.SpecialFolders("Appdata") & "\Microsoft\Addins\" & addInFileName
C:\Users\Dolphin\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\Microsoft\AddIns
'ファイルコピー(上書き)
objFileSys.CopyFile addInFileName, installPath, true
set objWshShell = nothing
set objFileSys = nothing

'Excelインスタンス化
set objExcel=createobject("Excel.application")
objExcel.workbooks.add
'マクロ登録
set objAddin = objExcel.AddIns.Add(installPath, true)
objAddin.Installed = true
'Excel終了
objExcel.Quit
set objAddin = nothing
set objExcel = nothing
if Err.Number = 0 then
 msgbox "マクロのインストールが終了しました", vbInformation
else
 msgbox "エラーが発生しました。実行環境を確認してください"
end if

2017年8月9日水曜日

イーサネット

イーサネット

OSI参照モデルの物理層・データリンク層相当で規定。
Ethernetの成り立ち
1970年代
ハワイ大学が、ALOHAnet(アロハネット)による無線パケット通信システムを構築
Xerox社のロバート・メトカーフがALOHAnetを参考に、Ethernetを発明(同社が開発したパソコン『Alto』をつなぐLANとして)
Ethernetを広く普及するLAN規格にするために、XeroxがDEC社・Intel社を開発に加え、3社の頭文字をとってDIX仕様を制定する。

1980年代
1980年 DIX仕様をEthernet1.0規格として、IEEE802 委員会に提出・公開。
1982年 DIX仕様のEthernetII(version 2.0) を公開。
1983年 DIX仕様のEthernetIIをベースとしたIEEE802.3 CSMA/CDを規格化。

IEEE:The Institute Of Electrical and Electronics Engineers, Inc.米国電気電子技術者協会

Ethernetの階層構造

OSI参照モデル ヘッダ情報 ネットワーク機器
第7層 アプリケーション層              
第6層 プレゼンテーション層              
第5層 セッション層              
第4層 トランスポート層           ポート番号
第3層 ネットワーク層           IPアドレス ルータ・L3スイッチ
第2層 データリンク層 LLC副層 IEEE802.2
LLC
      MACアドレス ブリッジ・L2スイッチ
MAC副層 IEEE802.3
Ethernet
IEEE802.4
Token Bus
IEEE802.5
Token Ring
IEEE802.11
無線LAN
第1層 物理層             リピータ

Ethernetは第2層と第1層にまたがっている。特に、第2層はLLC(Logical Link Control)副層とMAC(Media Access Control)副層に分離しており、LLC副層がEthernetとは関係ない独立した存在になっている。
DIXイーサネットとIEEE802.3イーサネットのフレームフォーマット
Ethernetでは、ケーブルを流れる信号を「フレーム」と呼ぶ。
機器間がこのフレームを送受信することで、Ethernetの通信が成り立っている。
Ethernetでは複数のフレームが存在する。
イーサネットの最小フレームサイズは64バイトで、1つのフレームは幾つかのフィールドで構成されている。




データリンク層では、イーサネットフレームにヘッダとトレーラを付加する。
また、フレーム外の先頭に「プリアンブル」と呼ばれる信号を付加する。「プリアンブル」は受信側にフレームの開始位置を知らせたり、同期を取るタイミングを与えたりするために使用される。
プリアンブルは0と1の繰り返しであり、「10101010..」のパターンで1と0が交互に続くことにより、コンピュータはフレームが送信されてきたことを認識してデータを受信するタイミングを計る。そして、プリアンブルの最後を示す「10101011」を検出すると、その次のビットから宛先MACアドレスが始まると解釈する。
  • 宛先MACアドレス・・・宛先のMACアドレス
  • 送信元MACアドレス・・送信元のMACアドレス
  • タイプ・・・・・・・・上位層のプロトコルを識別するための番号。

    IPv4:「0x0800」
    ARP:「0x0806」
    IPv6:「0x86DD」
  • 長さ/タイプ・・・・・データフィールドの長さを表す。「0x0600」未満

2016年5月5日木曜日

問題1

1.フロア内でLANを構成する時、ノード間を接続するケーブルとして正しいものを選択しなさい

  1. ストレートケーブル
  2. クロスケーブル
  3. ロールオーバーケーブル
  4. シリアルケーブル
  5. 光ファイバケーブル

2.電磁ノイズの影響を受けにくいケーブルを選択しなさい
  1. 同軸ケーブル
  2. ツイストペアケーブル
  3. 光ファイバケーブル
  4. 該当なし

3.OSI参照モデルによる階層化のメリットを説明した正しいものを選択しなさい(2つ)
  1. 標準インターフェイスを定義することにより、異なる機種間のデータ通信を実現する
  2. 新しい機能やプロトコルの開発及び変更が容易になる
  3. 階層ごとの機能を定義することにより、高速なデータ通信を実現する
  4. ある階層のプロトコルを変更し、即時に他の階層に反映させることができる

4.次のOSI参照モデルの階層1〜3に該当する説明を、選択肢から選びなさい
  1. データリンク層
  2. ネットワーク層
  3. トランスポート層

  1. 信頼性の高い通信を保証する
  2. MACアドレスなどの物理アドレスを基に通信相手を特定する
  3. デジタルデータを伝送メディアで扱う信号へ変換する
  4. プロセス同士の論理的な通信路の確立・維持・終了を定義する
  5. データのフォーマットを共通の形式に変換する
  6. ある宛先ネットワークへの最適経路を決定する
  7. 直接接続されたノード間の通信を実現する
  8. アプリケーションごとにネットワークサービスを提供する
  9. 論理アドレスを基に異なるネットワーク間の通信を実現する
  10. フロー制御や順序制御を行う

5.次の階層1〜3に該当するPDU名称を答えなさい
  1. トランスポート層
  2. ネットワーク層
  3. データリンク層

6.2進数「110011001」を10進数と16進数に正しく変換しているものを選択しなさい。(2つ)
  1. 185
  2. 0x89
  3. 201
  4. 0xC9
  5. 217
  6. 0xD9
  7. 249
  8. 0xF9

7.10進数1〜5を全て2進数に変換しなさい
  1. 41
  2. 111
  3. 128
  4. 231
  5. 255
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

答え
1.フロア内でLANを構成する時、ノード間を接続するケーブルとして正しいものを選択しなさい
1.A 2.B 3.A
ストレート・クロス・ストレート


2.電磁ノイズの影響を受けにくいケーブルを選択しなさい
1.C
光ケーブル


3.OSI参照モデルによる階層化のメリットを説明した正しいものを選択しなさい(2つ)
1.A 、B
標準インターフェイスを定義することにより、異なる機種間のデータ通信を実現する
新しい機能やプロトコルの開発及び変更が容易になる


4.次のOSI参照モデルの階層1〜3に該当する説明を、選択肢から選びなさい
1.BG 2.FI 3.AJ
MACアドレスなどの物理アドレスを基に通信相手を特定する
直接接続されたノード間の通信を実現する

ある宛先ネットワークへの最適経路を決定する
論理アドレスを基に異なるネットワーク間の通信を実現する

信頼性の高い通信を保証する
フロー制御や順序制御を行う


5.次の階層1〜3に該当するPDU名称を答えなさい
トランスポート層
ネットワーク層
データリンク層

セグメント
パケット
フレーム


6.2進数「110011001」を10進数と16進数に正しく変換しているものを選択しなさい。(2つ)
217 E
0xDF F


7.10進数1〜5を全て2進数に変換しなさい
41= 00101001
111=01101111
128=10000000
231=11100111
255=11111111






















2進数 10進数 16進数

2進数から10進数への変換

10進数

128

64

32

16

8

4

2

1

2進数

1

1

1

1

1

1

1

1
上図の通り2進数「11111111」の場合、10進数は128+64+32+16+8+4+2+1=「255」になる。


10進数

128

64

32

16

8

4

2

1

2進数

0

1

0

1

0

1

0

1
2進数「01010101」の場合、10進数は64+16+4+1=「85」になる。

10進数から2進数への変換
2進数から10進数への変換表を参考に、以下の通り計算する。
10進数1=2進数00000001
10進数2=2進数00000010
10進数3=上の表を参考に、2進数00000011


10進数192の場合・・
192から引けるだけ引いていく。引けたら1を立てる。

引く数

128

64

32

16

8

4

2

1

余り

64

0

0

0

0

0

0

0

2進数

1

1

0

0

0

0

0

0
10進数192 =2進数11000000

10進数170の場合・・
170 –

引く数

128

64

32

16

8

4

2

1

余り

42

0

10

0

2

0

0

0

2進数

1

0

1

0

1

0

1

0
10進数170 =2進数10101010

2進数から16進数への変換
  1. 2進数を4桁づつに分ける
  2. 10進数に変換する
  3. 16進数に変換する
16進数は10進数と区別するために値の先頭に「0x」をつけることがある。

2進数11111010の場合
2進数 1 1 1 1   1 0 1 0
10進数 8 4 2 1   8 4 2 1
16進数 F   A
2進数11111010 =10進数15・10 =16進数0xFA

2進数01100011の場合
2進数 0 1 1 0   0 0 1 1
10進数 8 4 2 1   8 4 2 1
16進数 6   3
2進数01100011 =10進数6・3 =16進数0x63

16進数から2進数への変換
  1. 16進数を1桁づつに分ける
  2. 10進数に変換する
  3. 2進数に変換する
16進数0x9cの場合
16進数 9   c
10進数 8 4 2 1   8 4 2 1
2進数 1 0 0 1   1 1 0 0
16進数9c =10進数9・12 =2進数10011100

16進数0x2Bの場合
16進数 2   B
10進数 8 4 2 1   8 4 2 1
2進数 0 0 1 0   1 0 1 1
16進数2B =10進数2・11 =2進数00101011

16進数から10進数への変換
  1. 16進数を1桁づつに分ける
  2. 10進数に変換する
  3. 2進数に変換する
  4. 10進数に変換する

16進数0xABの場合
16進数 A   B
10進数 8 4 2 1   8 4 2 1
2進数 1 0 1 0   1 0 1 1
10進数 128 64 32 16   8 4 2 1
16進数AB =10進数10・11 =2進数10101011 =10進数171

 

参考:指で数える2進数

10進数の31までなら片手の指で2進数に変換できます。
1. 10進数を右手の指に以下のように割り当てます。

 
2. 次の表のように折った指が2進数の1として数えます。折っていない指は0です。

1=00000001

2=00000010

3=00000011

4=00000100





5=00000101

6=00000110

7=00000111

8=00001000





9=0001001

10=0001010

11=0001011

12=0001100





13=0001101

14=0001110

15=0001111

16=00010000





17=00010001

18=00010010

19=00010011

20=00010100





21=00010101

22=00010110

23=00010111

24=00011000





25=00011001

26=00011010

27=00011011

28=00011100





29=00011101

30=00011110

31=00011111










2016年4月24日日曜日

OSI参照モデル

OSI参照モデル

プロトコル=約束事
約束事を7階層に分けて定義したもの=OSI参照モデル

OSI参照モデルを策定したところ=ISO (International Organization for Standardization : 国際標準化機構)

階層 名前 役割 キーワード
第7層 アプリケーション層 アプリ・ソフトのルールを決める ユーザインターフェース・メール・WEB
第6層 プレゼンテーション層 データの表現形式を決める(文字コードとか) 文字コード(ASCII・ABCDIC)
画像(JPEG・GIF
)
動画(MPEG)
第5層 セッション層 通信路の確立から終了までの管理 WEB閲覧開始から終了まで
メール受信開始から終了まで
第4層 トランスポート層 信頼性のある通信の提供(データが正しく届いたか) コネクション確立から終了
フロー制御
順序制御
確認応答
再送制御
第3層 ネットワーク層 最適経路を決定し、エンドツーエンドの通信を行う 経路選択(ルーティング)の方法
IPアドレス(論理アドレス)の割り当て方法
データ(パケット)の構造
選択した経路上にデータを送出する方法
第2層 データリンク層 隣接するノード(サブネット内)の通信を行う データ(フレーム)の構造
データ送出タイミング
送信元と宛先の識別(MACアドレス)方法
エラー検出と対処方法
第1層 物理層 電気信号や光信号を正しく伝送するための機器・電気信号のルールを決め、ビットを伝送する コネクタ形状・ピンの配置
ケーブルの種類や長さ
電圧レベル・電圧変化タイミング
通信速度・符号化形式

第7層 アプリケーション層


例えばメールを送る場合、送信元メールアドレス(From)、宛先メールアドレス(To・Cc・Bcc)、件名(Subject)、本文はメールソフトに必ず設けられるようルール化されています。これにより送信側と受信側が違うメールソフトを使用していても、正しくメールの送受信が行えるようになっています。また、WEBを閲覧する時はどのブラウザを使ってもURLの最初に”http:”や”https:”のような文字列が入りますが、これもアプリケーション層での決まり(WEBを見に行くと宣言する)です。このようにインターネットを利用するアプリケーションには、世界共通の規則があります。

第6層 プレゼンテーション層

現在は適切なメールソフトを利用すれば海外と日本でそれぞれの言葉を使い、メールをやり取りすることができますが、そうなる前の電子メールは英語しか使えませんでした。
英語以外の言語を使うための取り決めがなかったからです。その後各言語で独自の取り決めにより日本語(ISO-2022-JP)同士、その他の言語同士のやり取りを行うことができるようになりましたが、これはあくまでも同じ言語同士のやり取りに限られたものでした。ここまでのメールはテキスト・メールと呼ばれ、それを現在のように利用しやすく拡張した規格がMIME(Multipurpose Internet Mail Extension 多目的インターネットメール拡張)です。現在MIMEに対応したメールソフトでは、受信したメールのソースに次のような部分があります。
ーーーーーーーーーーーーーーーーーーーーーーーーーー
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
ーーーーーーーーーーーーーーーーーーーーーーーーーー
上記は全てMIMEで追加されたヘッダです。MIMEのバージョン、日本語のプレーンテキストメールであること、エンコードが7bitであることが宣言されています。
「Content-Type:」では、様々なデータタイプを表現するための符号化方式を指定することができ、続く「Content-Transfer-Encoding」でデータの変換形式が何であるかを指定しています。インターネットの中を流れる時は、このメールは標準の形式に直され、相手先で表示するときに上記の「日本語」「7bit」に従って異なる環境で読めるように変換されます。



第5層 セッション層

セッション層は、プログラム同士の論理的な通信路(セッション)の確立・維持・終了などを定義しています。
例えば、WEBページを参照するとき、WEBブラウザを起動しURLを入力して実行すると通信が開始され、ページがすべて表示されると通信が終了します。この一連の通信がセッッションに相当します。

第4層 トランスポート層



トランスポート層は、データを確実に届けるための信頼性を提供する役割を担います。
トランスポート層で定義されるものは主に以下です。
  • 仮想回線(コネクション)の確立・維持・終了
  • フロー制御(受信側の状態に合わせて送信量を調整する)
  • 順序制御(分割されたデータを受信側で元の順番に再構成する)
  • 確認応答(データが正しく相手に届いたかどうか確認する)
  • 再送制御(データが届かなかった場合に再送信する)

第3層 ネットワーク層

ネットワーク層では、異なるネットワークを相互接続し、エンドツーエンドで通信するための経路選択(ルーティング)を行います。
データの転送先を決定するための情報としてIPアドレスなどの論理アドレスを使用します。
ネットワーク層で定義されるものは主に以下です。
  • データの送信元及び宛先を識別するアドレスの割り当て方法
  • データ(パケット)の構造
  • 経路選択(ルーティング)の方法
  • 選択した経路上にデータを送出する方法

第2層 データリンク層

データリンク層は、直接接続された隣接機器と正しく通信する役割を担っています。通信相手を特定するための情報としてMACアドレスなどの物理アドレスを使用します。
データリンク層で定義されるものは主に以下です。
  • 通信媒体にデータを送り出すときのタイミング
  • 伝送中に発生したエラーの検出と対処方法
  • データ(フレーム)の構造
  • データの送信元及び宛先の識別方法

第1層 物理層

物理層では、電気的・機械的なハードウェアの物理仕様が定義されています。

  • コネクタの形状、ピンの数や配置
  • ケーブルの種類や長さ
  • 電圧レベル、電圧変化のタイミング
  • 通信速度、符号化の方式

カプセル化と非カプセル化



カプセル化:データの先頭にヘッダと呼ばれる制御情報を付加すること
送信側:カプセル化
受信側:非カプセル化
カプセル化されたデータは下位層のプロトコルに渡され、下位層でも同様にカプセル化を行い、さらに下位層に渡されます。
なおデータリンク層ではデータの後ろにもトレーラと呼ばれるエラーチェック用の情報を付加します。最終的に、データは信号としてケーブル上に創出されます。

PDU

PDU(Protocol Data Unit)・・データにヘッダが追加されて扱われるデータの単位

OSI参照モデルのPDU名称
トランスポート層・・・セグメント・・TCPから受け取った場合(UDPでカプセル化されたPDUはデータグラム)
ネットワーク層・・・・パケット
データリンク層・・・・フレーム