敵のいない勉強部屋

日々学んだことや感じたことを書きます

Azurenのお勉強② (Zabbix)

社内勉強会の準備として、今日はZabbixサーバーを構築してみました。

久しぶりにCentOSを触りました。
dnfとか言う謎のコマンドが導入されてて少し手こずりました。

Zabbixの公式インストール手順も、MySQLがすでにインストールされているのが前提になっていたり、
手順通りに進めただけではzabbix-serverがうまく起動しなかったりと、ちょっと困るところがいくつかありました。
www.zabbix.com

VMの費用はできるだけ無料プラン内で済ませたかったので、
サーバーのスペックは基本CPU:1core, RAM:1GBで構成しました。

最初は1つのVM上にzabbix-serverとapacheMySQLを同居させようとしましたが、
メモリが足りずサーバーのレスポンスが遅すぎて諦めました。

結局VMを3つ用意して、それぞれのミドルウェアに1VMを割り当てることにしました。

それでもMySQLだけはメモリが足り無かったので、MySQLVMはCPU:2core, RAM:4GBにしました。
Azureが提供する費用計算ツールを使ったところ、1時間あたり7円らしいので、社内勉強会までの1週間だけなら大した出費になりません。
よかった、よかった。

以前からRaspeberryPiにZabbixを入れることを検討してましたが、
今持っている3Bではメモリが足りないことが分かったので、
他のミドルウェアにするか、4Bを入手するか検討することにします。

今日も頑張りました!

Azureのお勉強① (Azure VPN Gateway)

会社の勉強会で発表するために、Azureを触ってみました。

会社のPCでデモをするのに、仮想マシンに安全に接続する方法が必要だったので、
VPN Gatewayを使ってみることにしました。

公式ドキュメント通りに手順を進めれば結構簡単に設定できました!
docs.microsoft.com

手元のPCがクラウド上のネットワークと繋がったときはなんだか感動しました。
クラウド上のサーバーたちが本当に近くにあるような感じがしました。

公式ドキュメントがわかりやすいのは本当にありがたい!
おかげさまでネットの海をさまよわずに済みました。

そしてこれが無料期間の対象内であるのもありがたい。
(無料期間2ヶ月目以降は Bastionの代わりにVPN Gatewayを使っていこう!)

今日も頑張りました!

英語字幕DB作成への道_Selenium編④ (Cookie)

DisneyPlusのCookieを使い回せない問題。
これはDisneyPlusのクローリング対策なのでは...?と思い始めました。

結局今日もCookieの使い回しは実装できなかったのですが、
新しいことを1つ学びました。

それはpickle。
pythonのオブジェクトをバイナリファイルとして保存しておけるライブラリです。

機能まではjson.dumpで保存してましたが、json.dumpはdict型にしか対応していません。
今回はそれだけでも事足りたのですが、今後のためにどんな型でも使えるpickleを使っていくことにしました。

今日も新しいことを学べて良かった!!

英語字幕DB作成への道_Selenium編③ (Cookie)

Selenium最初の壁にぶち当たりました。

Cookieを使いまわしてログイン処理を省くことができない..

ログインするところまでは自動化できたのですが、
その時のCookieを保存しておいて、次回サイトにアクセスするときにそのCookieを使うことができません。

私が想像してた処理の流れはこんな感じ

・初回アクセス時: ログイン => get_cookies() でCookieを取得して、json.dump()でjsonファイルに保存しておく
・2回目以降: json.load() でjsonを読み込んで、add_cookie() でCookieにセットしてから、サイトにアクセス => ログインを省略

でもうまく行きませんでした。

これだと2回目以降のアクセス時にログイン画面にリダイレクトされてしまいます。
(Cookieをみても認証済みユーザーだと思ってもらえてない)

うーん、難しい。果たして何が原因なのだろうか。
でも今日も頑張りました!

英語字幕DB作成への道_Selenium編③ (XPATH)

要素を見つけるときにidもnameも使えない状況に陥りました。

そんなときに使えるのがXPATH
www.selenium.dev

今回は button要素の data-testid という属性を検索したかったので、こんな記述になります

//button[@data-testid='password-continue-login

XPATHには何度もお世話になりそうなのでこんな感じで実装してみました

def get_el_by_xpath(xpath: str):
    input = WebDriverWait(driver, timeout=120).until(
        lambda d: d.find_element(by=By.XPATH, value=xpath)
    )
    return input

button = get_el_by_xpath("//button[@data-testid='password-continue-login']")

ものすごい便利!!
どんな要素でも取れる気がしてきた!
今日も頑張りました。

TVサーバーのパフォーマンス問題③(ネットワーク帯域_RaspberryPi)

TVサーバーのライブ視聴時の画面のカクつきがひどいので、
ネットワークの帯域を調べてみました。

使用したのは iperf3
ノートPCとRaspberryPiの両方にインストールして、
ノートPC(Client)→RaspberryPi(Server)の方向で通信して帯域を測ってみました。

$ sudo apt install iperf3
$ iperf3 -c 192.168.0.100
Connecting to host 192.168.0.100, port 5201
[  5] local 192.168.0.161 port 60466 connected to 192.168.0.100 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  3.75 MBytes  31.4 Mbits/sec    0    215 KBytes       
[  5]   1.00-2.00   sec  4.72 MBytes  39.6 Mbits/sec    0    393 KBytes       
[  5]   2.00-3.00   sec  4.16 MBytes  34.9 Mbits/sec    0    536 KBytes       
[  5]   3.00-4.00   sec  4.74 MBytes  39.7 Mbits/sec    0    696 KBytes       
[  5]   4.00-5.00   sec  3.75 MBytes  31.5 Mbits/sec    0    875 KBytes       
[  5]   5.00-6.00   sec  3.75 MBytes  31.5 Mbits/sec    0    689 KBytes       
[  5]   6.00-7.00   sec  3.75 MBytes  31.5 Mbits/sec    0    742 KBytes       
[  5]   7.00-8.00   sec  3.75 MBytes  31.5 Mbits/sec    0    824 KBytes       
[  5]   8.00-9.00   sec  5.00 MBytes  42.0 Mbits/sec    0    867 KBytes       
[  5]   9.00-10.00  sec  3.75 MBytes  31.5 Mbits/sec    0    901 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  41.1 MBytes  34.5 Mbits/sec    0             sender
[  5]   0.00-10.04  sec  38.2 MBytes  31.9 Mbits/sec                  receiver

iperf Done.

実測値は約32〜35Mbpsでした。

問題はライブ視聴中にこの帯域をどのくらい使っているか、です。

ノートPC側のUbuntuのシステムモニターで見てみました。

ネットワーク使用量

全然使ってない...
これネットワークは余裕あるな...

じゃあどこがボトルネックなんだーーーー!?
..といいつつ、CPUが少し不思議な動きをしているのを見つけたので、今度はそれについて調べてみよう。

まあ今回はネットワーク帯域の調べ方が学べて良かった良かった!

英語字幕DB作成への道_Selenium編② (Explicit Wait)

Elementが作成されるのを待たずにElementを探しに行ってしまい、NoSuchElementExceptionが出てしまう問題を解決するために、ExplicitWaitの勉強をしました。

www.selenium.dev

他にもImplicitWaitとFluentWaitという方法がありますが、ExplicitWaitが使えれば事足りそうだったので、とりあえずこれだけ使えるようになろうと思いました。

from selenium.webdriver.support.ui import WebDriverWait

driver.navigate("file:///race_condition.html")
el = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element_by_tag_name("p"))
assert el.text == "Hello from JavaScript!"  

こんな感じで、WebDriverで呼び出したい関数を、無名関数でくるんでuntil関数に渡して上げれば良いようです。
時間はtimeoutのところで秒数を設定してあげると。

これだけで、timeoutに設定した秒数の間はNoSuchElementを無視して何度もリトライしてくれるみたいです。

成功すればWebDriverで呼び出した関数の返り値が帰ってきて、失敗するとTimeoutの例外になるそうです。

シンプルでわかりやすい!!

今日も頑張った! おやすみなさい!