Cisco スイッチコマンド備忘録
gwがスイッチの名前です。
Terminal(CUI関係)
terminal length 0
--More-- が出てくるときに。0にすれば全部一括で表示される。行数を指定できる。
DHCP関連
DHCPのリリース状況確認
show ip dhcp binding
固定IPの割り当て
configure ip dhcp pool pool_sample import all host 192.168.11.2 255.255.255.0 hardware-address 0123.4567.89AB dns-server 192.168.1.1 client-name pool_sample default-router 192.168.1.1 lease infinite end
hardware-addressは、DHCPのリリース状況確認で確認できる。
hardware-addressは、client-identifier となることもある。その時は、01+MACアドレス、のような値になっている。
自動割り当てされたIPの解除(MAC重複解除)
clear ip dhcp binding 192.168.11.2
よく使うのは、hardware-address を割り当てようとして、以下が出てきたときなど。
% A binding for this client already exists.
アクセスリスト関係
WAN側のInerfaceに設定すべきアクセスリスト
https://blog.redbox.ne.jp/cisco-acl-cbac.html
アクセスリストの設置場所、方向の話
アクセスリストを理解する
現在の設定のエクスポート(USBメモリを刺した状態で)
customer-config という名前のファイルでUSBメモリに保存される。
copy running-config usbflash0:customer-config
リモートアクセスVPN
Ciscoの資料。ステップ18 [ハッシュ アルゴリズム MD5 を使用してパスワードを暗号化する]のチェックを解除 をしないとつながらない。
https://community.cisco.com/t5/cisco-start-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9-ipsec-vpn-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/ta-p/3292247
リストの結合と、DBへの格納
長さが同じリストを、列が増える方向に連結して、DBに格納する検証コード。
Pandasを経由したほうが、SQLでのテーブル定義 をしなくてもよいから楽
プログラム
import pandas as pd import sqlite3 # 長さが同じListを、列が増える方向に連結 # Index は無しで、DBに入れる。 # ------------------------------------------- # 結合 x = [1, 2, 3, 4, 5] y = ['a', 'b', 'c', 'd', 'e'] z = [1.1, 2.2, 3.3, 4.4, 5.5] # name はDBの列名になる。 s_x = pd.Series(data=x, name="x") s_y = pd.Series(data=y) s_y.name = "y" s_z = pd.Series(data=z) # axis=0 行を増やす方向に連結 axis = 0 df1 = pd.concat([s_x, s_y], axis=axis) print(df1, type(df1)) # axis=1 列を増やす方向に連結 axis = 1 df1 = pd.concat([s_x, s_y], axis=axis) print(df1, type(df1)) df2 = pd.concat([s_x, s_y], axis=axis) print(df2, type(df2)) df3 = pd.concat([s_x, s_y, s_z], axis=axis) print(df3, type(df3)) # ------------------------------------------- # DB書き込み con = sqlite3.connect(":memory:") con.isolation_level = None # None で自動コミットモード cur = con.cursor() cur.execute('PRAGMA temp_store=MEMORY;') cur.execute('PRAGMA journal_mode=MEMORY;') # DBへの書き込み df3を書き込み。インデックスは無し。 table_name = 'test_table' df3.to_sql(name=table_name, con=con, index=False) # テーブル定義の確認 tmp = cur.execute("SELECT * FROM sqlite_master WHERE type='table'") print("# テーブル定義の確認") for row in tmp: print(row) # 書き込んだの内容の確認 tmp = cur.execute("SELECT * FROM {0}".format(table_name)) print("# テーブルの内容の確認") for row in tmp: print(row) con.close()
実行結果
(base) C:\>python C:\hello_pandas\hello_concat.py 0 1 1 2 2 3 3 4 4 5 0 a 1 b 2 c 3 d 4 e dtype: object <class 'pandas.core.series.Series'> x y 0 1 a 1 2 b 2 3 c 3 4 d 4 5 e <class 'pandas.core.frame.DataFrame'> x y 0 1 a 1 2 b 2 3 c 3 4 d 4 5 e <class 'pandas.core.frame.DataFrame'> x y 0 0 1 a 1.1 1 2 b 2.2 2 3 c 3.3 3 4 d 4.4 4 5 e 5.5 <class 'pandas.core.frame.DataFrame'> # テーブル定義の確認 ('table', 'test_table', 'test_table', 2, 'CREATE TABLE "test_table" (\n"x" INTEGER,\n "y" TEXT,\n "0" REAL\n)') # テーブルの内容の確認 (1, 'a', 1.1) (2, 'b', 2.2) (3, 'c', 3.3) (4, 'd', 4.4) (5, 'e', 5.5)
Visual Stuido Code & Anaconda環境構築(その2)
vscodeでanacondaを使うと出るエラーの対策。a以下のコマンドを実行すると、対処できるかも。
conda init
エラーの内容
PS C:\dev> C:/Users/<ユーザー名>/Anaconda3/Scripts/activate PS C:\dev> conda activate base conda : 用語 'conda' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。 名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 行:1 文字:1 + conda activate base + ~~~~~ + CategoryInfo : ObjectNotFound: (conda:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
移動平均(numpy.convolve利用)1次元
関連記事に乗せている2次元よりは1次元のほうが使い勝手がよさそうなので書き換え。
起点からwindowsizeの範囲で合計するだけではなくて、起点側を,ignoresize個を無視して合計するような形にしている。
np.convolveの2つ目の引数の割当たりかたが想像の逆なので、v=np.flip(v) で反転している。
ソースコード
import numpy as np def np_moving_sum(data_1d,windowsize=3,ignoresize=0): ''' 1次元のリスト or np.array ''' if data_1d is None: data_1d = [1,2,3,5,8,13,21,34,55,89] if type(data_1d) == np.ndarray: np_data_1d=data_1d elif type(data_1d) == list: np_data_1d=np.array(data_1d) # np_data_1d.shape は、(10,) answer = np.zeros(np_data_1d.shape) answer[:] = np.nan # vの長さが3の時 # v[0]=0 3番目にマッピングされる # v[1]=1 2番目にマッピングされる # v[2]=0 1番目にマッピングされる v = np.ones(windowsize) v[0:ignoresize]=0 v=np.flip(v) answer[: np_data_1d.shape[0] - windowsize + 1 ]=np.convolve(np_data_1d, v, mode = "valid") return answer def np_moving_average(data_1d,windowsize=3,ignoresize=0): return np_moving_sum(data_1d,windowsize,ignoresize)/(windowsize-ignoresize) if __name__ == "__main__": data_1d = [1,2,3,5,8,13,21,34,55,89] print(data_1d,'\n') print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=2)) print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=1)) print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=0)) print('\n') print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=3)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=2)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=1)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=0)) print('\n') print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=2)) print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=1)) print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=0)) print('\n') print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=3)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=2)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=1)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=0))
実行結果
(base) C:\>python lib_moving_calcs_np.py [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] [ 3. 5. 8. 13. 21. 34. 55. 89. nan nan] [ 5. 8. 13. 21. 34. 55. 89. 144. nan nan] [ 6. 10. 16. 26. 42. 68. 110. 178. nan nan] [ 5. 8. 13. 21. 34. 55. 89. nan nan nan] [ 8. 13. 21. 34. 55. 89. 144. nan nan nan] [ 10. 16. 26. 42. 68. 110. 178. nan nan nan] [ 11. 18. 29. 47. 76. 123. 199. nan nan nan] [ 3. 5. 8. 13. 21. 34. 55. 89. nan nan] [ 2.5 4. 6.5 10.5 17. 27.5 44.5 72. nan nan] [ 2. 3.33333333 5.33333333 8.66666667 14. 22.66666667 36.66666667 59.33333333 nan nan] [ 5. 8. 13. 21. 34. 55. 89. nan nan nan] [ 4. 6.5 10.5 17. 27.5 44.5 72. nan nan nan] [ 3.33333333 5.33333333 8.66666667 14. 22.66666667 36.66666667 59.33333333 nan nan nan] [ 2.75 4.5 7.25 11.75 19. 30.75 49.75 nan nan nan]
DBのテーブルから列データをリストで取得する
DBのテーブルから列データをリストで取得する。fetch()で取得すると、行ごとのタプルのリストになっていて、処理しづらいので、ほしい列の値だけをリストにする関数get_one_column_data_list()を作成。
リストのメモリ確保のため、件数確認のget_countも作成。
get_one_column_data_list()は、リスト化したときの順番をソート済みで取得することも可能。
プログラム
import sqlite3 import random from faker import Faker def get_count(database, table_name): cur = database.cursor() sql_count = "SELECT COUNT (*) FROM {0}".format(table_name) d = cur.execute(sql_count).fetchone() # dは、(100,)のような形になっている cur.close() return d[0] def get_one_column_data_list(database, table_name, column_name, target_column_index=0, column_orderby=None): data_size = get_count(database, "data") data_list = [None]*data_size if column_orderby == None: sql_select = "SELECT {0} FROM {1}".format(column_name, table_name) else: sql_select = "SELECT {0} FROM {1} ORDER BY {2} asc".format( column_name, table_name, column_orderby) cur = database.cursor() d = cur.execute(sql_select) for index, row in enumerate(d): data_list[index] = row[target_column_index] cur.close() return data_list if __name__ == "__main__": con = sqlite3.connect(":memory:") con.isolation_level = None # None で自動コミットモード cur = con.cursor() cur.execute('PRAGMA temp_store=MEMORY;') cur.execute('PRAGMA journal_mode=MEMORY;') sql_create_table = "CREATE TABLE data(number INTEGER UNIQUE, name TEXT, score REAL)" sql_instert_data = "INSERT INTO data VALUES(?,?,?)" fake = Faker() listsize = 8 list_data = [None] * listsize print("データ準備 開始") for i in range(listsize): list_data[i] = [i, fake.name(), random.random()] print(list_data[i]) print("データ準備 完了") cur.execute(sql_create_table) cur.executemany(sql_instert_data, list_data) table_name = "data" column_name = "score" column_orderby = "name" data_list = get_one_column_data_list( con, table_name, column_name, target_column_index=0, column_orderby=column_orderby) print(data_list)
実行結果
>python C:\dev\SampleCodes\hello_sqlite\select_one_col.py データ準備 開始 [0, 'Taylor Smith', 0.6560666934413109] [1, 'Jesse Carrillo', 0.9199740526758551] [2, 'Tina Gonzalez', 0.8344908595983038] [3, 'Richard Mckinney', 0.1240783472168423] [4, 'Victoria Pace', 0.25291942565400816] [5, 'Steven Craig', 0.0703249952634678] [6, 'Valerie Mitchell', 0.0015255246599048533] [7, 'Victoria Hill', 0.9645617001034171] データ準備 完了 [0.9199740526758551, 0.1240783472168423, 0.0703249952634678, 0.6560666934413109, 0.8344908595983038, 0.0015255246599048533, 0.9645617001034171, 0.25291942565400816]
分割してCSVに書く、分割されたCSVを読む
1年前のプログラムの一部改良。
複数ファイルを連続して読むプログラム - Cucco’s Compute Hack
ディレクトリのパスと、ファイル名(拡張子ナシ、連番ナシ)を与えて、
決まった行数を書いたファイルを保存する、それらのファイルを開いて読む、というプログラム。
読む場合は以前から継続で、イテレータを利用できるようにした。
読むファイルをすべてリストで指定していたが、pathlibで一覧を取得している。
プログラム
import csv from pathlib import Path import os from faker import Faker import random class split_csv_writer: ''' 渡された値をファイルに書き落としていく max_linesを超えたら、別のファイルに変更する。 ''' def __init__(self, dirctory_path, filename_wo_extension, header_data=None, max_lines=100000): self.max_lines = max_lines if header_data == None: self.max_lines = max_lines-1 self.currnet_lines = self.max_lines+1 # 初回にOpenを実行してもらうため。 self.currnet_file_post_index = 0 self.filename = filename_wo_extension self.f = None self.dirctory_path = dirctory_path self.header_data = header_data self.delete_existing_files() def close(self): # デストラクタでも呼んでいる self.currnet_file_post_index = self.currnet_file_post_index+1 if self.f != None: self.f.flush() # 実際には、ファイルに書き込みしてくれないことがあったので追加。 self.f.close() self.f = None def delete_existing_files(self): p = Path(self.dirctory_path) r = self.filename+"*.csv" for existing_file_path in p.glob(r): print("削除します ", existing_file_path) os.remove(existing_file_path) def __del__(self): self.close() def open(self): if self.f == None: pass else: self.close() real_filename = self.dirctory_path + self.filename + \ "_{0:08d}.csv".format(self.currnet_file_post_index) os.makedirs(self.dirctory_path, exist_ok=True) self.f = open(real_filename, 'w', encoding='utf-8') self.csv_writer = csv.writer( self.f, delimiter=',', quotechar='"', lineterminator='\n') self.currnet_lines = 0 print("新規作成 ", real_filename) def writerow(self, input_data): ''' input_dataには、リストかタプルでデータを与える。 ''' if self.currnet_lines > self.max_lines: self.open() if self.header_data != None: self.writerow(self.header_data) self.csv_writer.writerow(input_data) self.currnet_lines = self.currnet_lines+1 class split_csv_reader: def __init__(self, dirctory_path, readfilename_wo_extention, skipHeader=False): self.filename = readfilename_wo_extention self.currentFileIndex = -1 self.fp = None self.csv_reader = None self.skipHeader = skipHeader self.dirctory_path = dirctory_path self.set_readFileNames() def set_readFileNames(self): self.readFileNames = [] p = Path(self.dirctory_path) r = self.filename+"*.csv" for existing_file_path in p.glob(r): self.readFileNames.append(existing_file_path) # ⃣print(self.readFileNames) def __iter__(self): # next()はselfが実装してるのでそのままselfを返す return self def __next__(self): if self.csv_reader is None: # 1個目のファイルを開く self.nextfile() try: value = next(self.csv_reader) return value except StopIteration: # 終端まで来たら、このStopIterationが投げられる。 try: self.nextfile() value = next(self.csv_reader) return value except StopIteration: # 次のファイルがなかったので、例外を投げてイテレータを終わる。 # ファイルがロックされている場合もここに来るので、問題になる可能性あり。 raise (StopIteration) except: # ここには来ない。 raise (StopIteration) def nextfile(self): self.currentFileIndex = self.currentFileIndex + 1 if self.fp is not None: self.fp.close() if self.currentFileIndex > len(self.readFileNames)-1: # 次のファイルはないので例外を投げる raise(StopIteration) else: self.fp = open( self.readFileNames[self.currentFileIndex], mode='r', newline='\n') self.csv_reader = csv.reader(self.fp, delimiter=',', quotechar='"') if self.skipHeader is True: next(self.csv_reader) # ⃣print(value) # 動作確認用プログラム if __name__ == "__main__": dirname = r"C:/lib_split_test/" # 最後はos.sepで終わるように指定する filename = r"lib_split_test" print("#書き込みのテスト") headerdata = ("#", "Name", "score") writer = split_csv_writer( dirname, filename, header_data=headerdata, max_lines=3) fake = Faker() for i in range(1, 10+1): # 最後の値は実行されないrange(1,10+1)で、1~10 data = [i, fake.name(), random.random()] writer.writerow(data) print(data) writer.close() print("#読み込みのテスト") reader = split_csv_reader(dirname, filename, skipHeader=True) for item in reader: print(item)
実行結果
(base) C:\dev\ > python C:\dev\lib_sprit_csv_reader_writer.py #書き込みのテスト 削除します C:\lib_split_test\lib_split_test_00000000.csv 削除します C:\lib_split_test\lib_split_test_00000001.csv 削除します C:\lib_split_test\lib_split_test_00000002.csv 削除します C:\lib_split_test\lib_split_test_00000003.csv 新規作成 C:/lib_split_test/lib_split_test_00000000.csv [1, 'Carol Martinez', 0.2993282973465532] [2, 'Monica Skinner', 0.47771227744058886] [3, 'Stephanie Zimmerman', 0.30639552562401595] 新規作成 C:/lib_split_test/lib_split_test_00000001.csv [4, 'Terry Williams', 0.2800113471343493] [5, 'Scott Grant', 0.8271274374443526] [6, 'Jose Daniels', 0.4170927481515181] 新規作成 C:/lib_split_test/lib_split_test_00000002.csv [7, 'Adam Austin', 0.2850528257749132] [8, 'Krista Williams', 0.9258438865231986] [9, 'Jared Adkins', 0.6205699038539508] 新規作成 C:/lib_split_test/lib_split_test_00000003.csv [10, 'Ryan Morales', 0.9635161039757013] #読み込みのテスト ['1', 'Carol Martinez', '0.2993282973465532'] ['2', 'Monica Skinner', '0.47771227744058886'] ['3', 'Stephanie Zimmerman', '0.30639552562401595'] ['4', 'Terry Williams', '0.2800113471343493'] ['5', 'Scott Grant', '0.8271274374443526'] ['6', 'Jose Daniels', '0.4170927481515181'] ['7', 'Adam Austin', '0.2850528257749132'] ['8', 'Krista Williams', '0.9258438865231986'] ['9', 'Jared Adkins', '0.6205699038539508'] ['10', 'Ryan Morales', '0.9635161039757013']
pythonの引数ライブラリargparse
argparseのサンプルコード。-から始まる名前にしてOptional引数にして、
action="store_true"をつけておけば、フラグとして利用できそう。
プログラム
import argparse if __name__ == "__main__": parser = argparse.ArgumentParser() # 必須引数(=位置引数)を追加 # type=intがない場合は文字列 parser.add_argument( "square", help="display a square of a given number", type=int) parser.add_argument( "base", help="display a square of a given number", type=int) # Optional引数 # 引数に -v があれば、args.verbosityはTrueになる parser.add_argument("-v", "--verbosity", help="increase output verbosity", action="store_true") # Optional引数 # とれる値の指定のある引数 parser.add_argument("-c", "--choices", type=int, choices=[0, 1, 2], help="increase output verbosity") args = parser.parse_args() # 引数の参照方法/値確認 print(args.square**2) print(args.base) if args.verbosity: print("verbosity turned on ", args.verbosity) else: print("verbosity turned off ", args.verbosity) print("choices:", args.choices)
-h の結果
(base) c:\dev>python a00_main.py -h usage: a00_main.py [-h] [-v] [-c {0,1,2}] square base positional arguments: square display a square of a given number base display a square of a given number optional arguments: -h, --help show this help message and exit -v, --verbosity increase output verbosity -c {0,1,2}, --choices {0,1,2} increase output verbosity
実行結果
(base) c:\dev>python a00_main.py -v -c 2 5 6 25 6 verbosity turned on True choices: 2