PyCharm 2018.3ヘルプ

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

導入

皆、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アプリを使用して結果を視覚化します。

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

As we will want to be able to view the webpage with the results later, it’s important to give our Pi a fixed IP within our network. To do so, edit /etc/network/interfaces . See this tutorial(英語) for additional details.

静的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

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

Next, install additional software.

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のスクリプトをコピーして貼り付けてから、緑色の再生ボタンを使用して実行します。

Now that we’ve got this working, let’s expand our script to record the pings into the database. To connect to the database from Python we’ll need to install psycopg2 . To do it, point to ファイル | 設定 (for Windows and Linux) or PyCharm / Preferences (for macOS users), then click the page プロジェクト・インタープリター , and then use icons general add to install the package. If you’d like to see the full script, you can have a look on GitHub(英語).

クロン

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

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

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

The first */5 means that the script will be run every 5 minutes. If you’d like a different frequency, you can learn more about crontabs(英語). Now we also need to create the log file and make sure that the script can write to it:

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

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

py databse filled

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

It’s no good to just record pings, if we can’t see some statistics about them. So let’s write a small Flask application (to install Flask, use pip install in the Terminal), and use matplotlib to draw a graph of recent ping times.

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;

The generate_series(英語) function takes three arguments: begin , end , and step . The function works with numbers and with timestamps, so that makes it easy. If we wanted pings at exactly these times, we’d be done now. However, we need times between the two timestamps. So we can use another bit of SQL magic: window functions(英語) which allow us to do things with rows before or after the row that we’re currently on. So let’s add end_time to our query:

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);

データのグラフ化

After getting the data, matplotlib(英語) is used to generate a line graph with lines for the minimum, average, and maximum ping time per bin. Matplotlib makes it easy to plot time-based data using the plot_date function(英語).

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

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

py raspberry pi ping time graph

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

要約

このチュートリアルに合格したことをお祝いします! PyCharmの助けを借りて何をしてきたのかを繰り返しましょう。

最終更新日: 2018年12月13日