CCNAのお勉強 - 1日目

概要

CCNAを勧められたのでXMLProの方の部室にあったCCNAの教科書を読みながら感想を交えてメモるだけです。 全部で15章あるので15個の記事書きます。気力があれば。 今回は第1章の記事です。

ネットワークの基礎

ネットワークって何

複数のコンピュータをケーブルや電波等の何らかの形で情報をやり取りできるようにした仕組みのことです。

LANとかWANとか

LANとかWANとかよく聞きますけど、これらはネットワークを大まかに分類したやつらしいです。 LANは限定されたエリアのネットワークとか建物や敷地内の中のネットワークとか分かるような分からないような説明が多いという偏見を持ってます。 ちなみに僕はルータより上の方がWANで、下の方がLANって適当に考えてます。 え?上層から見たらLANだけど下層から見たらWANの部分ができるって? まあつまりそのルータから見たら外部はWANなんだよ。 どっちが外か分からない? 自分がいる方と反対側が外よ。 なお異論は認める。

ノードとかリンクとか

ネットワークを構成する要素としてノードとリンクってのがあります。 ノードはルータやスイッチングハブ、PC等の機械。 リンクはノードの繋がっている部分です。 〇書いて線でつないだらネットワークって言い張れるらしいです。 知らんけど。

イントラネットとかエクストラネットとか

企業内部のインターネットをイントラネットというらしいです。 関連会社も含めるとエクストラネットっていうらしいです。 エクストラネットは聞いたことなかった。

ネットワークとアプリケーション

ネットワークを利用するユーザ向けのアプリケーションをネットワークユーザアプリケーションというらしいです。 まんまですね。 ネットワークのパフォーマンスとユーザアプリケーションは相互に影響を及ぼすみたいです。 どういうことか簡単な例を挙げると、niconicoYoutubeなどで動画のロードが遅い等ですかね。 詳しい説明は書くのめんどいので省きます。

通信の種類

  • ユニキャスト: 1対1通信
  • ブロードキャスト: 1対同一リンク内全員
  • マルチキャスト: 1対グループ内全員

トポロジ

ノードの接続形態のことらしいです。 リンクの形に名前がついているって感じですかね。 バス型とかスター型とかリング型とかメッシュ型とかいろいろあるみたいですね。 そういえばルータの中はバス型みたいになってるって話を授業か何かで聞いた気がしなくもないですね。 何の授業か忘れましたが。

フルメッシュトポロジのリンク数計算

n(n-1)/2 n:=ノード数で求められるらしいです。 ここテストに出そう。

ケーブルとコネクタの種類

  • ツイストペアケーブル
  • 光ファイバケーブル
    • コア径
      • 約9μm: シングルモードファイバ(SMF)
      • 約50μmあるいは約62.5μm: マルチモードファイバ(MMF)
    • コネクタ
      • SC プッシュプル型
      • ST バヨネット締結型
      • FC ねじ締結型
      • LC プッシュプル型
  • 同軸ケーブル
  • シリアルケーブル
    • EIA/TIA-232
    • EIA/TIA-449
    • V.35
    • X.21
    • EIA-530
    • DB-60
    • スマートシリアル

同軸ケーブルは最近ではTVぐらいしか見ないですね。 ツイストペアケーブルはコネクタタイプで分かれたりストレートケーブルクロスケーブルで使うところが違うのを初めて知りました。 LANケーブルなんて全部一緒だろって思っていた時期は消え去りましたね。新しい知識。 光ファイバケーブルは全く知らなかったので普通に勉強になりました。いや今勉強してる最中なんですけど。 というかこれ全部特徴まで覚えるの..? やばくね..?

OSI参照モデル

プロトコルの話ですね。概要は知ってるので後回しにします。

2進数、10進数、16進数の話

よく使ってるので後回しにします。

演習問題

ケーブルの選択は2問中1問正解 OSI参照モデルは4問中1問正解 2進数は全問正解でした。 OSI参照モデル飛ばしたら4問も出てくるとは思わなんだ(言い訳) 後で復習しておきます。はい。

参考文献

[1] 徹底攻略 Cisco CCENT/CCNA Routing & Switching教科書 ICND1編[100-105J][200-125J]V3.0対応 ISBN 978-4-8443-8152-5 https://www.amazon.com/%E3%82%B9%E3%83%9E%E3%83%9B%E5%95%8F%E9%A1%8C%E9%9B%86%E4%BB%98-Routing-Switching-100-105J-200-125J/dp/4844381520 [2] Ciscoルータのインタフェース CCNA実機で学ぶ | @network Cisco・アライド実機で学ぶ, 閲覧日:2020/12/13 http://atnetwork.info/ccna/ciscointerface.html

Trend Micro CTF 2020に出た話

時は9月中旬~

Trend MicroがCTFやってるよって友人に話しかけたところ、2日でチーム作ってたので参加。
そこからTry Hack Meや脆弱性調べたりしてなんやかんや。。。

予選(10/3~4)

結論から言うと爆死してチームメンバー全員一問も解けませんでした。
まあこれでも少しは頑張ってたので少なくとも僕がやったことは日記にします。はい。

Reversing II - 100

友人CがReversing I、友人GがIoT&MLの問題に挑戦し始めたので、自分はReversing IIの問題へ。
どうやらとあるゲームの壁抜けを行うGame Genie という8文字のチートコードを作成してほしいというお題。
DLしてきたときに出たファイルが「impossible_game.nes

f:id:Mikaner:20201006153534p:plain

... nesファイル is 何?

調べた

どうやら「Nintendo Entertainment System」というファイルらしい。
つまり、任天堂さんが扱っているファイルで、ファミコンとかで使われているらしい。
hmhm、なるほど。
で、どうしろと?

とりあえず

手を止めてても仕方ないのでghidraに入れて確認...しようとしたところでコンパイラのフォーマットを知らない。
どれだ?
f:id:Mikaner:20201006155039p:plain

ファミコン

ファミコンのファイルらしいしファミコンのCPUを調べたらいいかと考えWikipedia先輩へ。
ja.wikipedia.org

ふむ、リコー製RP2A03とかいうCPUと。
MOS 6502とかいうものが使われてると。
これか。
f:id:Mikaner:20201006155512p:plain

実行環境

ダラダラ中身見ててもようわからんかった。ふと実行環境ほしいなと思いましてファミコンエミュレータ探し。
ファミコンエミュレータで検索し、出てきたものを片っ端から入れて実行して確認とかした結果、FCEUXとかいうのが分かりやすかったので使用。
fceux.com

... これメモリの中身を見たりいじれたりバイナリ見れたり優秀じゃん。Game Genie Encoder/Decoderとかいうツールもついていたのでこいつだけで良くね?

ゲームをいじってみる。

実際の作業画面はこちら。(真ん中がゲーム画面)
f:id:Mikaner:20201006160905p:plain

確かにこれは壁抜けのチートコードが必要ですね。。。
f:id:Mikaner:20201006161400p:plain
これ以上右に行かんわ。

メモリをいじってみる

メモリの中身を見ていると、どうやら一番右に行くと-94を取る値がX軸の変化に応じて動いている気がする。
f:id:Mikaner:20201006161715p:plain

上からメモリ内の値を固定してゲーム画面にどんな影響があるか確認してみると、003Cの値をいじったところで壁抜けが成功。
f:id:Mikaner:20201006163058p:plain

あれ?僕何かやっちゃいました?

勝ったと思ったか?

意気揚々と8文字に合わせて$003C:A5と打ったらFaild。
どうやらGame Genie codeを入れないといけない模様。
というか、Game Genie codeって何?

Game Genie code

どうやらGame Genieというファミコンのチートを行うための周辺機器が米国カナダ辺りで売られていた様子。
任天堂の訴えで米国では差し止められたがカナダで売られ続けたとかいうサブ知識も得ることができたけど使いどころは不明。
Game Genie code自体は「6文字」と「8文字」のコードがある模様。
それぞれ仕組みがあるらしいけど、僕にとって問題だったのがメモリが8000番以上の場所しか扱えないところ。
...いや、003Cは8000とは程遠いんだが?

急遽Game Genieの勉強

Game Genieを調べていたらよさげなYoutube動画を見つけたのでこれを使ってお勉強。
分かったこととしては、8000以下の値を扱っている場所が8000番以降にあるらしいので、そこのコマンドを変更して値の更新を捻じ曲げたらいい感じになるとのこと。
www.youtube.com

また、メモリをいじっていたところ0040の値を16以上に変更すると大きく反発し、0以下に変更すると壁の部分で落ちながら透過することが判明。
もしかしてこいつが壁の当たり判定の値持っているのか?

アセンブリ読み

アセンブリ言語で003Cと0040の値を扱っている場所をリストアップし、逐一変更。
動画の内容を参考に、もともとあったコマンドから変更するべきと書いてあったコマンドのopcodeを調べ、変更をする...が、ダメ。

終了

アセンブリの変更で横着している間にタイムアップ。
nesファイルに大敗北を喫しました。

追記

Writeup上がってました。
変えるべきメモリは0031だったようです。
完璧ノーマーク。
github.com

Windows 10 home に Docker Desktop を入れた

はい、こんにちは。

リバースエンジニアリングやるとか言ってやってみたはいいものの全く分からんで死んだ人です。

先日DiscordでRythmを動かそうとしたところ、Voice Channelに入って出てを繰り返す害悪botになり果てていた(現在は修正済み)ので大昔に友人と作ったDiscort botを動かそうとしました。

このbotLinux環境で開発していたのですが、Dockerを導入したところWindows 10 homeで動かせなくて(正確にはレガシーのDocker toolboxを入れるのが嫌だった) やる気が死んでました。

しかし先日Docker DesktopがWindows 10 homeに対応していたことを知ったので喜んで導入しました。
せっかくなんで導入行程を日記にしようかと思いました。

導入

とりあえずインストールしようとDocker Desktopのページに飛びました。

インストーラ起動したらOSのバージョンが足りなくて失敗しました。


OSのバージョンを上げにWindows 10 の ISO ダウンロードページに飛びました。
下の赤矢印のところからダウンロードできます。

Windows 10 の ISO ダウンロードページの図

インストーラ起動して脳死で次々押して再起動して長時間待ったらOS buildのバージョンが上がりました。やったね!
Docker Desktopのインストールは正常に終了しました。



と思っていたのか?

再起動したらなんか出た。

WSL2 がないと警告を出している Docker Desktop の図

どうやらWSL 2のインストールをしてなかったみたいですね。
したはずだと思ってPowershell で `wsl -l -v`をしたところversionが1しかなかったんでしてなかったみたいですね。

ということでWSL 2の導入

とりあえず、Microsoft の WSL2 Install Guide のページに飛んで、書いてあるコマンドを脳死Powershellにぺたぺた。(有効になっているのをさらに有効にしても問題ないだろというお気持ち)

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

再起動。(もともと"LinuxWindows サブシステム" オプション機能有効になってるだろうし再起動二回するのめんどくさいなというお気持ち)

Docker Desktopが出してきた警告に書いてあったURLに飛び、そこから.msiファイルをダウンロード。

WSL 2 Linux カーネルの更新手順のページの図
WSL 2 Linux カーネルの更新手順のページ

起動してacceptしてNext Next Install Finish。

ついでにWSL 2 をデフォルトに設定。

wsl --set-default-version 2

再起動。

勝ち。

Kaggle事始め

概要

この記事は2019年度TUTアドベントカレンダーの23日目の記事です。

ええ、23日目です。 え?投稿日?許して....

はじめに

明日は今日はクリスマス・イブですね。

巷ではツリー飾ってお祭りをしているでしょうが、僕はNORADGoogleサンタ追跡でも見比べてゆっくりしてます。 でもNORADのページ重いんですよね

これ書いて寝ました。

ということで(?) ちょっと前から気になっていたKaggleに手を出してみたので記事にします。 と言っても、筆者はデータ分析なんぞさっぱりなのでいろいろな記事を見たりDiscassionを覗いたりして見様見真似でやってみるだけです。

Kaggleといったらまず始めにやるコンペがあるらしいので例にもれず Titanic: Machine Learning from Disaster をやっていきます。

ちなみにここ見ながらやったので普通にこっちのほうが詳しいです。

www.codexa.net

Kaggleってなに?

Kaggleを知らない人もいるかもしれないので軽く説明します。

Kaggleとはデータ分析コンペティションのプラットフォームの一つです。 簡単に言うとデータ分析競技の競技場です。 競技したり話し合ったり分析モデルを公開したり見たりできます。

ここで主催者から与えられたデータを用いて一個一個に紐付けられたラベルや値を予測する分析技術を競い合います。

ちなみにカグルって発音します。

コンペってなに

コンペティションのことです。 競技って意味です。

Kaggleには2つのコンペティションがあります。 通常のコンペとカーネルコンペです。

通常のコンペではデータを提出します。 カーネルコンペではデータ分析を行うコードを提出します。 競技プログラミングみたいな感じですね。

通常のコンペでもカーネルコンペでもルールが存在します。 このルールはコンペ毎に違うため、ある程度確認しておいたほうが良いです。

まあ普通に使っていれば引っかからないもんですけど。

以下はルールの例です。

  • 複数アカウント保持の禁止
  • 1日の提出回数制限
  • 外部データの使用について
  • チームについてのルール
  • チーム以外の人にKaggleのKernelやDiscussion以外の場でコード等の共有、交換の禁止
参考文献

Kaggleで勝つデータ分析の技術

Kaggleで勝つデータ分析の技術

Titanic (タイタニック)

Titanic: Machine Learning from Disaster はKaggleが主催者となって常時公開しているコンペティションです。

タイトルで予想つくかもしれませんが、機械学習でTitanicの乗客の生死について予測を行います。

Titanicって何

知ってる方は読み飛ばしてもらって構いません。

Titanicは船の名前です。 正式名称はロイヤルメールシップ・タイタニックとか言うらしいです。

旅客数が全部で2453人、乗組員が899人で合計3352人ほど乗っていたらしいです。

処女航海で氷山に接触し、大体1500人強ぐらいの犠牲者がでました。

ちなみにこの事故が映画化して結構有名になりました。

参考文献

ja.wikipedia.org

本題

さて、では早速Kaggleでデータ分析をしてみようと思います。 が、データ分析を始めるまでに以下のことが考えられます。

  1. まず分析を行うためにはデータが必要です。
  2. データを貰うためにはコンペに参加しなければいけません。
  3. コンペに参加するにはKaggleのアカウントが必要です。

アカウント取得

というわけでKaggleのアカウントを貰いに行きましょう。

Kaggleのページは以下です。 ここでなんやかんやしてアカウントを取得します。

www.kaggle.com

ちなみに筆者はGoogleアカウントでさくっと取得しました。

コンペに参加

アカウントを取得したら、ログインしたまま以下のTitanicのコンペに飛びます。

左上らへんのアイコンをクリックすることで出せるメニューの検索バーからTitanicと検索しても見つかります。

www.kaggle.com

ここのJoin Competitionとか書いてあるところをクリックすると規約・ルールの承認確認フォームが出ます。 同意して参加しましょう。

データの取得

参加したらデータを貰いましょう。

Dataと書いてある場所をクリックすることでデータに関するページに行けます。

Data Descriptionブロックではデータに関するお話が聞けます。

Dataブロックではデータのダウンロードやデータの中身を見ることができます。 右上あたりにあるDownload Allを押すとダウンロードができます。

ちなみにKaggle APIを使えば、APIと書いてあるところのコマンドを叩くことでダウンロードができます。 詳細は?ボタンからGithubに飛んでREADME.mdを見ると良いと思います。

やっと分析

データもらったので分析をしましょう。 今回はデータの前処理が比較的楽な部類の決定木を使って分析しましょう。

今回筆者はJupyterLabを使用しましたが、環境構築が面倒な方はgoogle colaboratoryがおすすめです。

今回は以下のmoduleを使います。

  • numpy
  • pandas
  • sklearn.tree

とりあえず全部importしましょう。

import numpy as np 
import pandas as pd 
from sklearn import tree 

決定木ってなに

今日が終わりそうで焦っているので参考文献だけ貼っておきます。\(^o^)/オワタ

qiita.com

データの読み込み

プログラムにもらったデータを読み込ませます。 pythonにはcsvという便利モジュールがありますが、pandasはそのcsvを使用して.csvファイルを読み込むことができます。

以下のコードで.csvファイルを読み込み表示させます。

train = pd.read_csv('データのパス/train.csv') 
test = pd.read_csv('データのパス/test.csv') 
train.head(3) 

pandasはread_csvメソッドcsvファイルを読み込み、DataFrame型のObjectにして返します。

DataFrame型のObjectはheadメソッドで始めから5つ目までのレコードを返します。 引数にレコードを返す数を指定できます。

データの確認

DataFrame型のObjectはdescribe関数を使うことでデータの各列ごとの要約統計量を取得することができます。 まあ、データの雰囲気を掴むのに便利な関数ってことですね。

train.describe() 
test.describe() 

そして、データのnullチェックを行います。 データは基本的に値を損失しているものが多いので、今回のデータがどのくらい値が損失しているかをチェックします。 目grepでもできるのですが、せっかくpythonを使っているのでnullを数えてくれる関数を作成しましょう。

def check_missing_values(dataframe):
    sum_null = dataframe.isnull().sum()
    per = sum_null/len(dataframe) * 100
    missing_values_table = pd.concat([sum_null, per], axis=1)
    missing_values_table = missing_values_table.rename(columns = {0: 'number of missing', 1: '%'})
    return missing_values_table

nullの数は、isnullメソッドによって各要素がbooleanに変換されたDataFrame型objectの合計を求めることで算出できます。 また、合計値を要素数で割って100をかけることで百分率を算出することができます。

数値が計算できたら、後はpandasのconcatメソッドを使用してDataFrame型のObjectを作成します。

作成できたらチェックしましょう。

check_missing_values(train)

trainでは年齢を示すAgeが177個、客室番号を示すCabinが687個、乗船港を示すEmbarkedが2個損失しているのがわかります。

check_missing_values(test)

testではAgeが86個、旅客運賃を示すFareが1個、Cabinが327個損失していますね。

データの前処理

データ分析で一番面倒くさい 手間のかかるやりどころを感じる場所です。がんばりましょう。

trainデータ埋め

先程のデータの確認でデータの損失が確認されました。データが損失している場合、分析ができないので適当に埋めます。

train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")

今回はCabinは使わない予定なので触りません。

損失したAgeの値はとりあえず全部平均を入れておきます。

また、Embarkedの値は一番多かったSを入れておきましょう。

その後はちゃんと入ったかチェックしましょう。

check_missing_values(train)

数値に変換

データはすべて入りましたが、数値以外のデータでは分析ができません。 なのでデータに数をあてて数値にしましょう。

train["Sex"] = train["Sex"].map({"male": 0, "female": 1}).astype(int)
train["Embarked"] = train["Embarked"].map({"S": 0, "C": 1, "Q": 2}).astype(int)

性別の値を男性を0, 女性を1に変換しました。 また、乗船港がSouthamptonの場合は0, Cherbourgの場合は1, Queenstownの場合は2に変換しました。

ちゃんと変換できたかチェックしましょう。

train.head()

testデータも同じく

testデータも同じく変換しましょう。

testデータではAgeとFare、Cabinの値が損失していました。 今回はCabinを使わないのでAgeとFareだけ埋めます。

test["Age"] = test["Age"].fillna(test["Age"].median())
test["Fare"] = test["Fare"].fillna(test["Fare"].median())

とりあえず両方共平均値を入れました。

次にSexとEmbarkedを数値に変換しましょう。

test["Sex"] = test["Sex"].map({"male": 0, "female": 1}).astype(int)
test["Embarked"] = test["Embarked"].map({"S": 0, "C": 1, "Q": 2}).astype(int)

変換できたらチェックしましょう。

test.head()

学習機を回す

データ処理が終わったらいよいよ学習機を回します。 決定木はsklearnモジュールのDecisionTreeClassifierを使います。

target = train["Survived"].values
train_feature_values = train[["Pclass", "Sex", "Age", "Fare"]].values

decision_tree = tree.DecisionTreeClassifier()
decision_tree = decision_tree.fit(train_feature_values, target)

test_feature_values = test[["Pclass", "Sex", "Age", "Fare"]].values

prediction_values = decision_tree.predict(test_feature_values)

目的値にtrainのSurvivedの値を、特徴量としてtrainのPclass, Sex, Age, Fareの値をそれぞれndarray型に変換して変数に格納します。

次に決定木インスタンスを作成し、変数に格納した特徴量と目的値を学習させます。

その後対応するtestの特徴量を変数に格納し、決定木で判別します。 判別した結果はprediction_valuesに格納します。

これでprediction_valuesに判別した結果が出力されました。 つまり、データ分析が完了しました。

あとは分析結果をPassengerIdに対応させ、csvファイルか何かに出力した後、提出すれば終わりです。

PassengerId = np.array(test["PassengerId"]).astype(int)
solution = pd.DataFrame(prediction_values, PassengerId, columns = ["Survived"])

solution.to_csv("結果ファイルを出力するパス/自由な名前.csv", index_label=["PassengerId"])

提出

無事csvファイルに書き出せたら提出をしましょう。

と言っても以下の3ステップで提出できます。簡単ですね。

  1. 右側の青いSubmit Predictionsボタンを押し
  2. Upload submission fileに出したcsvファイルを投げ込み
  3. 下の方にあるMake Submissionボタンをクリック

終わりに

本当は決定木の説明カキコとか他の分析方法(AdaBoostやSVC等),他のモジュールの使用(XGBoostやLightGBM等)もやりたかったんですけど、知識と時間とやる気の問題でできませんでした。原因はコード書いているときのやる気だと思っている。

そしてクリスマスにちなんだ話題にしたかったのにもかかわらず謎にタイタニックの乗客の生死を予測してました。どうしてこうなった。

そんな筆者の都合なんてどうでもいいですね。次はリバースエンジニアリングについてなんか書こうかと思います。

良いクリスマスを!