PyCharm 2018.2ヘルプ

チュートリアル: ラズベリーパイのリモート開発

導入

皆、ISPが接続を過ぎ去らせる習慣を持っていることを知っています。そして、これは時には私たちのつながりが私たちが望むほど良くならないように導きます。また、多くは、ラズベリーパイがクールなプロジェクトを待っていることを知っています。私たちのインターネット接続をチェックするためにそのPiを使用しましょう!

インターネット接続の重要な指標の1つは、インターネット上の他のホストへのping時間です。定期的に別のホストにpingして結果を記録するプログラムを作成しましょう。

AWSインスタンスやDigitalOceanドロップレットのように、他のリモートコンピュータでリモートでコードを実行したい場合は、プロセスはまったく同じです。

このチュートリアルはWindows上で作成され、コードはLinuxコンピュータであるRPiで実行されました。サポートされている他のオペレーティングシステムでは、パスとワークフローの一部が若干異なる場合があります。

始める前に

このチュートリアルを実行するには、次の前提条件を満たしていることを確認してください。

  • PyCharmのProfessional Editionを持っています。

  • このコードはLinuxマシンで実行されます。ローカルVMも使用できます。

また、いくつかの追加ソフトウェアが必要になります:

  • PostgreSQLは、データベースの作成に使用されるためです。

  • Libpq-devPsycopg2に必要です。

  • Psycopg2をコンパイルするために必要なPython-dev

これらのすべてを一度にインストールするには、次のコマンドを実行します。

sudo apt-get update && sudo apt-get install -y postgresql libpq-dev python-dev

ラズベリーピン

構築するアプリケーションは、次の2つの部分で構成されています。

  • 第 1では、実際に測定を行います。結果を測定するために、すべてのLinuxマシン(Raspberry Piを含む)が同梱するpingコマンドラインツールを呼び出すことができます。結果をPostgreSQLデータベースに保存します。

  • 第 2では、Matplotlibを使用して最近の結果のグラフを描画するFlaskアプリを使用して結果を視覚化します。

ラズベリーパイを準備する

後で結果を表示するWebページを表示できるようにするためには、Piにネットワーク内の固定IPを与えることが重要です。これを行うには、 /etc/network/interfacesを編集します。詳細はこのチュートリアル(英語)を参照してください。

静的IPを使用するようにPiを設定したら、コマンドラインで raspi-config を使用します。 拡張オプションに行き、SSHを選び、はいを選んでください。これを済ませたら、PyCharmを使い始める準備が整いました。

プロジェクトの作成

純粋なPythonプロジェクトを作成します。これを行うには、ファイル | 新規プロジェクトを選択します。プロジェクト名を "raspberry.pi"とします。純粋なPythonプロジェクトを作成するを参照してください。

次に、SSH経由でのリモートインタープリタの設定で説明されているようにSSH リモートインタプリタを追加します。 SSHサーバーを設定するときは、Pi(ホスト)のIPアドレスを指定します(例:172.27.120.177)。また、デバイスにログインするための資格情報を指定します。

次に、PyCharmで Ctrl+Shift+Aを押して、 'Start SSH session'と入力します。

py start ssh session

次に、ホストのリストからあなたのラズベリーパイを選ぶと、接続する必要があります。

次に、追加のソフトウェアをインストールします

PostgreSQLでの権限の設定とデータベースの作成

これで、PostgreSQLで権限を設定する必要があります: これを行う最も簡単な方法は、SSH端末に戻って、次のコマンドを実行してPostgresユーザーとしてSQLプロンプトを得ることです:

sudo -u postgres psql

次に、プロセスを実行するユーザと同じ名前のユーザ(Postgresの用語では「ロール」)を作成しましょう。

CREATE ROLE pi WITH LOGIN PASSWORD ‘hunter2’;

重要な注意点! PostgreSQLの役割がLinuxユーザ名と同じ名前であることを確認してください。また、より良いパスワードに置き換えることもできます。セミコロン(;)でSQL文を終了させることは重要です。セミコロンで終了するまでは、複数行の文を記述していると仮定するためです。piユーザーのログイン権を与えています。これは単にユーザーがログインできることを意味します。ログイン権のない役割は、グループの作成に使用されます。

次に、データベースを作成します。

CREATE DATABASE pi WITH OWNER pi;

次に、 \qpsql を終了します。

pingのキャプチャ

インターネット接続の品質に関する情報を取得するには、システムの ping ユーティリティを使用してサーバーにpingを実行し、その結果を正規表現で読み取ってみましょう: pingの出力を見てみましょう:

PING jetbrains.com (54.217.236.18) 56(84) bytes of data. 64 bytes from ec2-54-217-236-18.eu-west-1.compute.amazonaws.com (54.217.236.18): icmp_seq=1 ttl=47 time=32.9 ms 64 bytes from ec2-54-217-236-18.eu-west-1.compute.amazonaws.com (54.217.236.18): icmp_seq=2 ttl=47 time=32.9 ms 64 bytes from ec2-54-217-236-18.eu-west-1.compute.amazonaws.com (54.217.236.18): icmp_seq=3 ttl=47 time=32.9 ms 64 bytes from ec2-54-217-236-18.eu-west-1.compute.amazonaws.com (54.217.236.18): icmp_seq=4 ttl=47 time=32.9 ms --- jetbrains.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 32.909/32.951/32.992/0.131 ms

個々のラウンドトリップ時間を持つすべての行は 64 bytes fromで始まります。ファイル ping.pyファイル | 新規 - Python ファイル)を作成し、コーディングを開始しましょう。

最初にpingの出力を取得してから、数字を先頭に 'bytes from'という文字が続くものをピックすることで、行全体を繰り返し処理できます。

host = 'jetbrains.com' ping_output = subprocess32.check_output(["ping", host, "-c 5"]) for line in ping_output.split('\n'): if re.match("\d+ bytes from", line): print(line)

この時点で、コード(Ctrl+Shift+F10)を実行すると、このコードがリモートでRaspberry Pi:

py raspberry pi run

デプロイの設定が正しく設定されているかどうかを確認するには、メインメニューのツール | デプロイをポイントします。チェックコマンド自動アップロードをチェックする必要があります。

pingの保存

PostgreSQLにpingを格納したかったので、テーブルを作成しましょう。まず、PostgreSQLデータベースを作成する必要があります。

py database postgresql

PostgreSQLが選択されると、データソースページが開きます:

py create postrgesql database general settings

このページで、必要なドライバをダウンロードし、必要な資格情報を入力して、接続のテストボタンをクリックして、接続されていることを確認します。

データベースはローカルホストにしか公開されていないため、SSHトンネルを使う必要があります:

py create postrgesql database ssh tunnel

次に、接続したら、setup_db.sql(英語)スクリプトを実行してテーブルを作成します。これを行うには、接続直後に開いたSQLコンソールにGitHubのスクリプトをコピーして貼り付けてから、緑色の再生ボタンを使用して実行します。

これで作業が完了しました。pingをデータベースに記録するスクリプトを展開しましょう。 Pythonからデータベースに接続するには、 psycopg2をインストールする必要があります。これを行うには、ファイル | 設定(WindowsおよびLinuxの場合)またはPyCharm / Preferences(macOSの場合)をポイントし、プロジェクト・インタープリターページをクリックして、 icons general add を使用してパッケージをインストールします。完全なスクリプトを表示したい場合は、GitHubを見てください(英語)を使用できます。

クロン

実際に定期的にpingを記録するには、このスクリプトを実行するようにスケジュールする必要があります。このために、 cronを使用します。データベースに対するピア認証を使用しているので、スクリプトが pi ユーザーとして実行されていることを確認する必要があります。SSHセッションを開き( piとしてログインしていることを確認して)、 crontab -e を実行してユーザーcrontabを編集しましょう。次に、ファイルの一番下に次の行を追加します。

*/5 * * * * /home/pi/raspberryping/ping.py jetbrains.com >> /var/log/raspberryping.log 2>&1

ファイルの最後に改行があることを確認してください!

最初の */5 は、スクリプトが5分ごとに実行されることを意味します。別の頻度を希望する場合は、crontabについてもっと学ぶ(英語)を使用できます。今度は、ログファイルを作成し、スクリプトがそのファイルに書き込めるようにする必要があります。

sudo touch /var/log/raspberryping.log sudo chown pi:pi /var/log/raspberryping.log

この時点で時間がかかります。後で戻ってくると、いくつかのping時間が記録されているはずです。確認するには、PyCharmのデータベースツールを調べてみましょう。画面の右側にあるデータベースツールウィンドウを開き、テーブルをダブルクリックします。値が含まれていることがわかります。

py databse filled

Flaskアプリケーションの作成

それらについてのいくつかの統計を見ることができないなら、単にpingを記録するのは良いことではありません。そこで、小さなFlaskアプリケーション(Flaskをインストールし、 pip install をターミナルに使用する)を作成し、matplotlibを使って最近のping時間のグラフを描きましょう。

Flaskアプリケーションでは、2つのルートを作成します。

  • /では、最後の1時間にpingした宛先を基本統計(最小、平均、最後の1時間の最大時間)とともに表示します。

  • /graphs/<destination> では、過去3時間のpingのグラフを描画します。

/ のルートはシンプルです。興味のあるデータを取得してテンプレートに渡すためのクエリを実行するだけです。 GitHubの全コードを見る(英語)

すべてが正しく機能することを確認するために、 render_templateへの呼び出しにブレークポイントを設定しましょう:

py render template breakpoint

その後、デバッグセッション(icons actions startDebugger svg)を開始し、ブラウザで結果を確認します。

/graphs/<destination> ルートはもっと複雑です。まず、合理的な大きさのビン(例えば、10分)で過去3時間の平均を取る必要があります。次に、グラフを描画する必要があります。

データのクエリ

したがって、探しているデータは次のとおりです。

  • 過去3時間の各10分間

  • 指定された宛先への最小、平均、および最大のping時間を取得する

最初の部分はこれをかなり複雑なクエリにします。 PostgreSQLは間隔、日付範囲、および一連の日付を生成する方法をサポートしていますが、一連の範囲を生成する方法はありません。この問題の解決策の1つは共通テーブル式(CTE)です。これは後で実際のテーブルであるかのように参照できるサブクエリを実行する方法です。

過去3時間の一連のタイムスタンプを10分間隔で取得するのは簡単です:

select begin_time from generate_series(now() - interval '3 hours', now(), interval '10 minutes') begin_time;

generate_series(英語)関数は、 beginend、および stepという3つの引数をとります。この関数は数字とタイムスタンプで動作するので、簡単に使えます。正確にこれらの時にpingをしたければ、今やります。しかし、2つのタイムスタンプの間に時間が必要です。SQLマジックの別のビットを使うことができます:ウィンドウ関数(英語)は、現在行っている行の前後に行を置くことを可能にします。 end_time をクエリに追加しましょう:

select begin_time, LEAD(begin_time) OVER (ORDER BY begin_time ASC) as end_time from generate_series(now() - interval '3 hours', now(), interval '10 minutes') begin_time;

LEAD は、結果の次の行の値を、 OVER 句で指定された方法で順序付けします。 LAG を使って同様の方法で前の行を取得することができます。これで、このクエリを WITH intervals as ( … query goes here … ) でラップしてCTEにすることができます。次に、pingテーブルに参加し、探している結果を得ることができます:

WITH intervals AS ( SELECT begin_time, LEAD(begin_time) OVER ( ORDER BY begin_time ) AS end_time FROM generate_series( now() - INTERVAL '3 hours', now(), INTERVAL '10 minutes' ) begin_time ) SELECT i.begin_time AT TIME ZONE 'Europe/Berlin' AS begin_time, i.end_time AT TIME ZONE 'Europe/Berlin' AS end_time, p.destination, count(p.pingtime), round(avg(p.pingtime),2) AS avg, max(p.pingtime), min(p.pingtime) FROM intervals i LEFT JOIN pings p ON p.recorded_at >= i.begin_time AND p.recorded_at < i.end_time WHERE i.end_time IS NOT NULL AND destination = %s GROUP BY i.begin_time, i.end_time, p.destination ORDER BY i.begin_time ASC;

次に、このクエリを実行しましょう。これを行うには、エディタの背景を右クリックし、コンテキストメニューで実行を選択します。

py execute sql from pycharm

実行が表示されない場合は、コンソールの接続を選択して、クエリを実行するデータベースをPyCharmに知らせてください)。

ところで、クエリを30倍高速にすることができます。この重要な高速化を達成するには、このインデックスをクエリに追加します。

CREATE INDEX pings_recorded_at ON pings(recorded_at);

データのグラフ化

データを取得した後、matplotlib(英語)を使用して、1ビンあたりの最小、平均、および最大のping時間のラインを持つ折れ線グラフを生成します。 Matplotlibは、plot_date関数(英語)を使用して時間ベースのデータを簡単にプロットすることができます。

プロットが準備完了すると、ZOpen1ファイルとしてStringIOオブジェクトに保存され、HTTPIレスポンスの作成に使用されます。 content_type ヘッダーを image/pngに設定すると、すべてが整理されます。

最終的な結果は次のとおりです。

py raspberry pi ping time graph

完全なコードを見たい場合は、GitHubのanalyze.py(英語)をチェックしてください。

最終変更日: 2018年9月24日