miya’s blog

プログラミングの学習を通じて得た知識や感じたことをシェアするブログです。

Pythonことはじめ2

はじめに

Pythonスクリプトを書いていた日々の学びを整理📝

実装したもの

  • 運用業務の自動化というやつ

    • マクロを使った手操作をスクリプト化してイイ感じにする
    • 現行タスクは、機材にログイン & コマンド操作 & 出力内容をチェック
    • 新規もの
  • コマンドを垂れ流すだけならマクロでできてるはず

    • 操作失敗時のケア、コマンド間のデータ連携、チェックが肝になりそう
    • 無人操作になるので、ロギング、エラーハンドリング、運用整理がいる
    • 機材の数や種類は1つや2つではない、コマンドも同様

調べたこと

ヘルプ

  • CLIからは標準ライブラリ pydoc を使う。

pydoc pdb or python -m pydoc pdb

python -m pydoc -p 1234

  • replからは組み込み変数 help を使う。

>>> help("pdb")

デバッグ

  • 標準デバッガの pdb を使った。

python -m pdb script.py

  • 組み込み変数が便利。locals()vars() ほか

    • ローカル変数の値を確認 p locals()
    • プロパティやメソッドを確認 dir()
    • 辞書型オブジェクトの属性値を確認 vars(インスタンス等)
    • メソッドや特殊メソッドを確認 getattr()
  • スタックトレースtracebackでとる。

    • traceback.format_exc() を使った。
      • 開発中はexcept句に traceback.print_exc() を仕込んでた
      • **_tb はエラーメッセージなし。ライブラリを作る(スタックトレースを提供する)ときに使う?
    • ログファイルにはlogger.debug(traceback.format_exc()) みたく出した。
      • logging で exc_infro=True でも実装可
  • テストコードは unittestで書いた。

    • 検証環境でコマンドの結果をテストコードに貼ってチェック処理を実装した
    • デバッグを効率化できた。

コード構成

ログ

文字列

  • Docstringに関数の説明とかを書く。PEP 257

  • 正規表現re を使う。

    • キャプチャグループではパターンマッチ内の () 内を取得 Match.group()
    • ANSIエスケープコードのサニタイジングに使った re.sub()
    • 文字列内での位置(何文字目)とかがわかる、行位置の算出 re.finditer()
    • 改行コードを含む文字列で使う re.M

スクールで習ったRubyとの違い

  • 基礎レベルしかわからないのであしからず🐤

  • Pythonだと..

    • インデントでブロックを定義する(endがない、インデントずれるとエラー)
    • コード規約で戻り値で return の明示が推奨される
    • コード規約に1行あたりの文字数制約がある(長くてもわかりやすい命名というのと合わない)
    • 三項演算子の見た目がかなり違う
    • ダブルクオートとシングルクオートは同じ意味。
    • 自作モジュールを格納するフォルダ名は /src ?(/libは避けた方がよさそう)
    • プライベート変数が隠蔽されない
  • Pythonにないもの..後置きif、unless、flatten、シンボルとか。

余談

以上

SNMPによるネットワーク監視

SNMPによるネットワーク監視

はじめに

近いうちに使うことになりそうなSNMPについて調べてまとめておく📝

SNMP(Simple Network Management Protocol)とは

ネットワークを監視するために用いられる事実上の標準プロトコルである。

小規模なネットワークでは簡易的にpingを用いて死活監視(※)のみを行うこともある。 ※例: ExPing(フリーソフト): コンソールにインストール。死活状態を〇×で表示したりできる

SNMPで監視できる事項

  • 機器の稼働状況
    • 稼働時間、ポートごとのパケット数、CPU稼働率、メモリ使用状況、内部温度、製品名...etc
    • -> 大抵の情報を取得できる! 定義データベースをMIBという。

MIB(Management Information Base)とは

SNMPマネージャとエージェント間でやり取りされる命令と機能との対応表である

RFC1156(MIB1) RFC1213(MIB2)

MIBには標準MIBとプライベートMIBがある。

  • 標準MIBは、RFCで定義される標準的なもの。
  • プライベートMIBは、機器メーカーが独自に定義したものであり、異なるメーカー間や異なる機種間(※)での同一性は担保されない。iOSのアップデートでプライベートMIBが削除された事例とかはチョロチョロあるらしい

SNMP通信

UDP161ポート(snmp), 162(snmp-trap)

問合せを行い、情報を収集する側(管理する側) -> SNMPサーバ または SNMPマネージャ 問合せに対して応答する側(管理される側) -> SNMPエージェント

SNMP Trap

通常のSNMP通信は、マネージャが定期的にエージェントに対して問い合わせを行う。これをポーリング通信(polling)という。 それに対して、SNMPトラップは、エージェント側で設定した状況になった時(※)、エージェント側からマネージャに対して一方的に通知を行うための通信。 ※内部温度が35℃を超えた、CPU使用率が90%を超えた、メモリ残量が5%以下など

SNMPコミュニティ

SNMPコミュニティとは、一種のグループ名であり、SNMPの通信が行われる際は、エージェントで予め設定したコミュニティ名とマネージャが問い合わせる際のコミュニティ名が合致しないと応答されない。事実上のパスワードといえる。 またメーカーを問わず、大部分の製品ではデフォルトのコミュニティ名が "Public" となっているので必ずこれは変更しなくてはならない! (実際にこれを悪用して企業内の重要なルータなどの情報を第三者に取られてしまう事件があったらしい)

SNMPのバージョン

  • SNMP v1: RFC1157 コミュニティ名による平文認証、SNMPトラップの再送確認なし
  • SNMP v2: RFC1901 コミュニティ名による平文認証、SNMPトラップの再送確認あり
  • SNMP v3: RFC2273-2275 暗号化されたパスワード認証あり、SNMPトラップの再送確認あり

現状で推奨されるのは当然 v3 であるが、v2が広く使用されたり、v1が使われているかも

SNMPメッセージ

SNMPによってやり取りされる。通信の属性、命令

v1 は5種類

  1. Get Request (man -> agent) エージェントから得たい情報をOID(Object ID)を指定して要求する命令

  2. GetNext Request (man -> agent) 直前に指定して取得したOIDの次のデータを要求

  3. Set Request (man -> agent) エージェントの設定変更を行いたい場合、そのOIDを指定して要求する ★どのような項目をSNMPで変更できるのかはその装置の実装次第(マニュアル、仕様書の確認が必要になる)

  4. Get Response (agent -> man) マネージャから要求されたGet Request に対して値を返す

  5. TRAP (agent -> man) エージェントの状態変化があった場合、自発的に発信 ★どのような場合にTRAPを発信するかは設定(実装)次第

v2c は、v1 + 2種類

  1. Get Bulk Request (man -> agent) 一括参照要求。複数の情報をまとめて取得するコマンド

  2. Inform Request (agent -> man) 通知に対する確認応答を要求

v3 SNMPメッセージ自体はv2cと同じ7種類が使える そして、v3では、コミュニティ名ではなく USM(User-based Security Model)というユーザごとのパスワード認証と VACM(View-based Access Control Model)というユーザごとにアクセス可能なMIBの範囲を制限できる機能が追加されている。

USMのセキュリティレベル

  • noAuthNoPriv: ユーザ名を利用して認証、暗号化なし
  • AuthNoPriv: MD5 または SHA を使用して認証、暗号化なし
  • AuthPriv: MD5 または SHA を使用して認証、暗号化あり

メッセージダイジェスト(MD5 etc)

  • 「元データ」 短くても長くてもよい    ↓
  • ハッシュ関数」 一方向のみ計算できる演算    ↓
  • 「メッセージダイジェスト」 一定長のデータ(64バイトなど)

メッセージダイジェストを利用した同一性の保証の仕組み MDがわかっても、それと同じMDを作れる元データを作成することは不可能である したがって、MDが一致することをもって、互いが保持している元データの同一性が担保できる

MDによる同一性確認はネットワーク上での本人確認にも応用されている

SNMPの用語 「RMON」

RMONとは、Remote MONitoring MIBの略 これはMIBのうち、ネットワークの回線を監視するパラメータ群からなるMIBのこと。 例として、MRTG(Multi Router Traffic Grapher ※)などを用いてトラフィックの状況をグラフ化したりできる。

以上

Pythonことはじめ

はじめに

来月からPythonスクリプトを書く機会が増えそうなので、環境構築とか公式ドキュメントのリンクを自分用に整理しました📝

環境構築

Pythonのパッケージ管理については以下がわかりやすかったです

当時、Webで観測していた範囲だとバージョン管理はRyeがよさそうでした👒

追伸: uvも支持されているようです > uvが良いので今日から暫く使ってみます

pyenv は少なくとも学習中にはあまり必要ではないようです

因みにMSのドキュメントは pip + venv

  1. ターミナルを開き、HelloWorld プロジェクト フォルダー内で、次のコマンドを使用して .venv という名前の仮想環境を作成します: python3 -m venv .venv。
  2. 仮想環境をアクティブにするには、source .venv/bin/activate と入力 ~

ツール

最近だと↓ な感じ? 🐍

少し前の定番リンターは Flake8, Black だった?

VSCodeのマニュアルは、

公式情報

独学用

Pythonとは~みたいな話は、WEB+DB PRESS総集編[Vol.1~120]の書き下ろし記事を参考にしました。↓ の版が入手しやすいかも。

認定資格は公式ドキュメントのチュートリアルを教材にしているので、初心者の理解度チェックによいです。このブログの公開時点では模試3回分は無料公開されていました。

どんなライブラリがあるか~については、生成AIに「代表的なメソッド3つとサンプルコードをかいて~」って聞くのがとっつきやすいかと..

知っておけば身を助けるかも..

さいごに

あとは奨励されている資格があるので取得に向けて準備中。 プログラミングスクール(RoR、JS)はまた休会かなぁ..😑

以上

30代でプログラミングスクールに入会してWeb開発を学ぶ_12カ月目ふりかえり

目次

はじめに

2023年6月1日に入会したオンライン制のプログラミングスクール(フィヨルドブートキャンプ(FBC))で学んだことや思ったことを書き留めます

これから書くこと

  • FBC入会から12カ月経過(活動: 9か月、休会: 3か月)した時点でのふりかえり

フィヨルドブートキャンプでの活動状況

学習時間について

  • 2023年10月に職場環境が変わり活動時間は概ね半減。休会へ(12/02 - 02/29)
  • 復会直後は2週間くらい業務輻輳と体調不良で何もできず、それ以降は以下の通り
  • 9ヶ月間の合計:855.5H = 23年 6月~11月: 710.0H, 3月: 16.5H, 4月: 51.0H, 5月:78.0H

ラクティスについて

復会後3カ月で対応したのは

休会について

  • 公式HPに記載はありませんが最大3回まで休会可能でした。(当時)

休会をすることは可能ですか?
最大3ヶ月まで休会をすることが可能です。|フィヨルドブートキャンプ FAQ

  • 活動時間をとれないなら毎月約3万円が消えていくだけなので致し方なし💸
  • 覚えなおしを通じて、ちゃんと理解せず誤魔化してた分を見直す日々。知らなかった内容もチラホラ..💦
  • 未来の自分が困らないようにしたい

直近6か月の取り組みや雑感

  • 現場で小さなスクリプト(Python3とか)をコーディングするも苦戦

    • 色々と怪しい感じで書いている自覚はあれど、学習時間が足りない💩
    • gitをはじめ、ツールの使い方とかもイマイチ身についてない💦
  • PC1台で完結しない作業環境に苦戦(色々と忘れてる)

    • VSCodeを常に使えるとは限らない、ツールへのアクセス制約、穴ほり.. etc
  • 休会前の日報をサルベージ..せず

    • 時間効率を含めると、価値が薄そうでやる気でず..🗑️
    • ふりかえらず進むことにする🏃‍♂️
  • 職業訓練時代のことを思い出す

    • 宅内環境の整理中に、職業訓練やその後の備忘録などを発掘
    • 喉元をすぎて熱さを忘れてた👹
  • メインPCを変更(Windows11 ← MacBookPro)

    • 職場PCがWindowsで統一されたのを機に自宅PCも合わせる
    • Windows & Macの混在が解消されて、ショートカットの誤入力がすごく減る。
    • 慣れた操作環境でストレスが減る(ファイルマネージャ、CLIなど)
  • 開発環境を仮想環境化(Debian on WSL2)

    • 構築&破棄がお手軽(Mac初期化は手付かずも、WSLは数十回は作り直し済み)
    • MWのインストール手順のチェックとかやりやすい
  • 英語を頑張るのをやめる

    • 公式文書(英語)は躊躇わず Google翻訳 & DeepL(少し自力で読むとかしない。原文みるのは最終手段)
    • コミットログを日本語で書く。英作文の実態は生成AIにほぼ丸投げだったので..
    • 得意分野(日本語🎌)を活かす。苦手分野(英語🗽)を無闇に絡めない
  • 手元の生成AI事情(Claude3(Sonnet)も使い始めて、ChatGPTと併用。)

    • 手詰まったときのアドバイザー&公式文書を読みとくサポートとして使用中
    • いまだ非課金。
      • 自分の質問内容だと劇的に優れてる感触ないので(レス遅いのが気になる)
      • それでも自分の理解力&集中力がボトルネックになっている状態😵‍💫
    • 大体合っている回答でも、合ってない部分に(仕事なら)一発アウトなネタがあることを実感💀
      • なぜそれでいいのか/問題にならないかを理解しないと仕事で使えない

学んだこと

さいごに

直近はインフラ要素が多かったこともあり、とあるインフラエンジニアの方の技術ブログを拝見していたのですが..

とのこと。

インフラとアプリで違いはあれど一人前になるには~という意味では同じなのではと思うも、未だにスクールを卒業してスタートラインに立つメドはたっておらず..🤧

BtoCベンチャースタートアップ についての理解が足りていなかったことにも気づき、いろいろと現実が見えてきてしまった今日この頃です🙄

以上

腰痛にはトレーニングがいいかも

目次

はじめに

昨年に悩まされた腰の具合が今年はいまのところイイ感じです。 今年の1月からジム通い(近所の公営体育館、週一)を再開したのが功を奏している気がするので、実践中のトレーニングについて解説動画のリンクをまとめました🏋️‍♂️

なお当方は、昨年時点では整形外科でMRI検査をしたものの所見はありませんでした(その程度の腰痛です)。

そして腰痛やトレーニングについて専門的な知識をもたない素人なのであしからず🙏

腰痛対策になっていそうなトレーニン

ボディビルが目的ではないので、男性なら最低xxkgから! とか思わず、ムリなく10-15回こなせる負荷(重量)をこなすのがよさそうです。

さいごに

ジムに行くのが怠いと感じた時にみている動画リンクです。 なかやまきんに君の楽し気な取材をみているとモチベがあがります💪

お手入れしないと日常生活に支障が出る年齢に差し掛かってきたか~、と考えると少し切ないですが、1回300円 & 40~50Hの補強運動ならまだ大したメンテコストではないですね👛

最後までご覧いただきありがとうございました🙏

以上

Rubyでオブジェクト指向を学習したときに調べたこと

目次

はじめに

プログラミングスクールでボウリングのスコア計算プログラムをオブジェクト指向で書いたときのメモ書きです。休会明けで色々と忘れており、Rubyインスタンスやメソッドについて色々と調べたのでまとめました🎳

課題のポイントは👇になるかと思います。

  • ストライクは 'X' で表示される。それ以外は数字。
  • 各フレームは1投 or 2投。最終フレームは3投目があるかも。
  • ボーナス得点の算出はフレームをまたぐ。
# 入力: 投球結果  出力: 合計点。
$ ruby bowling.rb '0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,X,X,1,0'
68

オブジェクト指向プログラミングについて

考え方について

komagataのブログでは以下のように説明されています。

全てをクラス変数とクラスメソッドで処理するというのは手続き型プログラミングの世界です。

オブジェクト指向プログラミングでは、極力「インスタンス変数を使ってそのインスタンス自身に処理させる」というのが基本です

どれが良い悪いというのはないですが、オブジェクト指向プログラミングは極力、実体(インスタンス)が個別に持つ情報を利用してインスタンスメソッドを呼び出して処理する。そういう書き方が基本です。

また、メンターの方からは以下のようなコメントをいただきました。

オブジェクト指向プログラミングは擬人法プログラミングだと思ってください。

オブジェクトは人間です。自分のことは自分が一番よくわかっていて、一人で全部できる大人です。

クラスメソッドとインスタンスメソッドについて

【プログラミング初心者向け】クラスメソッドとインスタンスメソッドはどう使い分けるべき?で色々と説明されていますが、まずはインスタンスメソッドで実装することを目指せばよさそうです。

オブジェクト指向的に適切なクラス設計がされていれば、クラスメソッドが登場する回数はインスタンスメソッドに比べてずっと少ないはずです。

文法は、以下の公式リファレンスやブログが参考になりました。

インスタンス変数について

改訂版・(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方によると以下のようになりそうです。

  • インスタンスごとに保持する必然性がある(別々の値になる)データをセットする

    • 大きいスコープがほしいという理由でインスタンス変数を使わない
  • 変数のスコープ(変数の寿命)が不必要に大きくなると、クラスが大きくなるにつれて保守性がどんどん低下

    • 大きいスコープの変数がほしいならグローバル変数を使うべき(原則NGだけど)
    • 処理の過程で使う一時的なデータは、引数、戻り値、ローカル変数で受け渡す

「じゃあインスタンス変数はいつ使えばいいの?」

インスタンス変数はオブジェクト指向プログラミングの文脈で、クラスを定義するときに使います。

たとえば、Person(人間)クラスに名前と血液型を保持させたいときは、名前と血液型をインスタンス変数に保存します。

基本的な考え方として、インスタンス変数はインスタンスが作成されてから(newされてから)最後までほとんど変わらない値だと思ってください。

🤔🤔🤔

メソッドについて

参考にさせていただいた資料

オブジェクト指向設計実践ガイド

  • 説明に添えてあるサンプルコードがとてもわかりやすい書籍です。

プロを目指す人のためのRuby入門改訂2版

  • 第7章がとても参考になりました。スコープ、書き方、実装例 etc

Rubyセミナー『開発を支える自動テスト』

  • 複数のクラスを定義してレシートの集計を実装していきます。ライブコーディング動画。

感想

最後までお読んでいただきありがとうございました。

CI/CDわからないけどJenkinsでパイプラインをつくってみた

目次

はじめに

Jenkins(ver2.0系)のパイプラインで手作業をジョブ化した初心者のメモ書きです。

公式ユーザガイドは情報量が多くて、どこから読むべきかなのか少々わかりにくかったので、Declarative Pipelineでジョブを実装するまでに調べたことを整理しました。

想定する読者レベル

  • Jenkins、CI/CDがよくわからない。
  • Jenkinsでパイプラインを作って動かしてみたい。

Jenkinsについて

できることは大まかに👇な感じ

  • リポジトリGitHubなど)の資材をコントローラやエージェントに展開できる
  • コントローラからエージェントに対して任意のコマンドを実行できる

ver2.0のリリースが2016年なので、2017年前後に書かれた情報が多い印象です。

使い方について

環境構築

「親機/子機」を「コントローラ/エージェント」といいます。かつての「マスター/スレーブ」 > 用語集

インストール

コントローラに「Jenkins本体 & Java」、エージェントに「Java」をいれます。

  • 手っ取り早くコントローラを構築したいならこちら
    • Dockerのインストールが前提。
    • APIキーの取得方法の説明もあります。
  • 公式な手順はこちら
    • OSに直接インストールする方式
    • Javaインストールの説明もあります。

コントローラとエージェントを紐付け

お試しで動かすだけならスキップして、エージェントなしでもOKです。

開発ツールを用意

お試しで動かすだけならスキップしてOKです。

パイプラインの書き方

Pipelineについて

Declarative Pipelineについて

Groovyについて

  • バージョン確認方法はこちら
  • 基本構文はこちら
  • デバッグ手法はこちら
    • JenkinsDSLとはそこそこ違う(例: ×echo ⚪︎println)ので、Script{}の実装を関数に切り出すと使いやすいかも。

パイプラインをパラメータ付きビルドで動かす

コントローラからファイルを取得します。実行環境は Ubuntu 22.04.3 LTS🐧

  • 動かし方は以下の通り

    1. 新規ジョブの作成 > パイプラインを選択 > パイプラインの定義にサンプルコードをコピペして保存。
    2. ビルド実行する(エラー終了)。画面を再ロードすると"パラメータ付きビルド"を選べるようになる。
    3. パラメータ付きビルドを実行して成功すれば、ビルドの成果物(ip.txt, hosts) をダウンロードしたり、Console Outputから実行ログをみれたりできます。
  • 公式資料は → Getting started with Pipeline

// Jenkinsfile

pipeline {
    agent any

    parameters {
        string(name: 'user_id', defaultValue: '999', description: '998 か 999 なら動くよ)')
        booleanParam(name: 'require_confirmation', defaultValue: true, description: '実行確認したければオン')
    }

    stages {
        stage('precheck') {
            steps {
                sh "uname -n; id; pwd; ls -l"

                script {
                    checkPermission(params.user_id)
                }
            }
        }

        stage('confirmation') {
            when {
                expression { params.require_confirmation.toBoolean() }
            }
            steps {
                input message: "やっていいかい # ${env.BUILD_NUMBER}",
                    ok: 'いいとも'
            }
        }

        stage('execute') {
            steps {
                sh "ip a > ip.txt"
                sh "cat /etc/hosts > hosts"
            }
        }
    }

    post {
        always {
            echo currentBuild.result
        }
        success {
            archiveArtifacts artifacts: '*', onlyIfSuccessful: true
        }
        cleanup {
            cleanWs()
        }
    }
}

def checkPermission(String userId) {
    def allowedIds = ['998', '999']
    if (!(allowedIds.contains(userId))) {
        error "Permission denied: ID ${userId} is not allowed."
    }
}

そのほか

  • グローバル変数について

    • env: Jenkinsfile内ならenvironment{}、Jenkins全体ならダッシュボード >【Jenkinsの管理】でセット
    • params: パラメータ付きビルド時のWeb画面からの入力欄の値(parameters{})
  • 環境変数(env)の制約

    • 文字列 or 戻り値が文字列となる関数 しかセットできないっぽい。これか..?
    • the Global Variable Reference only contains documentation for variables

  • 使いやすそうな環境変数

    • WORKSPACE、BUILD_USER_ID、JOB_NAME、GIT_BRANCH、GIT_URL とか?
  • "${xxx}" という変数の書き方

    • Jenkins全体の環境変数を参照するときの書き方
    • 式展開の書き方
      • echo は文字列しかとれないので、配列やハッシュを出力したい時とかに使う
  • ヒアドキュメントの書き方

  • エージェントを動かしたい

    • agent {} で指定する。
  • ハマったときは

感想

ハンズオンしていけば段々と公式ユーザガイドを読むのが苦でなくなります(多分)📚

あとはやりたいことをキャッチアップしつつ頑張ってください(← 筆者がいまココ)☕

Jenkinsの主な用途はCI/CDだと思いますが、それ以外の自動化にも活用できますので自動化に取り組みたい人の第一歩の助けになれば幸いです。

最後までお読んでいただきありがとうございました。