PyCharm 2019.3ヘルプ

チュートリアル: Raspberry Pi上でのリモート開発

導入

ISPには、自分たちの接続を売り込みすぎる癖があることは誰もが知っていますが、その影響で自分たちの接続が自分たちが望むほど良くないこともあります。また、私たちの多くはRaspberry Piのクールなプロジェクトを待ち望んでいます。それでは、Piを使ってインターネット接続をチェックしてみましょう。

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

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

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

始める前に

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

  • PyCharmのプロフェッショナル版を持っています。

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

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

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

  • Libpq-devPsycopg2に必要です。

  • Python-devPsycopg2をコンパイルするのに必要でした。

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

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

Raspberry ping

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

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

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

Raspberry Piを準備する

後で結果を含む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

それからホストのリストからあなたのRaspberry Piを選んでください。そして接続されるべきです。

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

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の保存

pingをPostgreSQLに保存したいため、それらのテーブルを作成しましょう。まず、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 / 環境設定(macOSユーザーの場合)をポイントしてから、ページプロジェクト・インタープリターをクリックし、icons general add を使用してパッケージをインストールします。完全なスクリプトをご覧になりたい場合は、GitHub(英語)を参照してください。

Cron

実際に定期的に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をインストールするために、ターミナルで pip install を使うために)小さなFlaskアプリケーションを書き、最近のping時間のグラフを描くためにmatplotlibを使いましょう。

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

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

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

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

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

py render template breakpoint

次に、デバッグセッション icons actions startDebugger を開始し、ブラウザで結果を確認します。

/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(英語)関数は、begin , endおよび stepの3つの引数を取ります。この関数は、数値とタイムスタンプで機能するため、簡単に実行できます。ちょうどこれらの時間にpingが必要な場合は、これで完了です。ただし、2つのタイムスタンプの間には時間が必要です。もう1つの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(英語)を使用して、ビンごとの最小、平均、および最大ping時間の線を含む線グラフを生成します。Matplotlibでは、plot_date関数(英語)を使用して時間ベースのデータを簡単にプロットできます。

プロットの準備が整うと、.png ファイルとしてStringIOオブジェクトに「保存」され、これを使用してHTTPレスポンスが作成されます。 content_type ヘッダーを image/pngに設定することによって、すべてが配置されます。

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

py raspberry pi ping time graph

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

最終更新日: 2019年12月10日

関連ページ:

Python プロジェクトを作成します

純粋なPythonプロジェクトは純粋なPythonプログラミングを対象としています。プロジェクトを作成するには、次のいずれかを実行します。メインメニューから、を選択します。ようこそ画面で、新規プロジェクトの作成をクリックします。新規プロジェクトダイアログが開きます。新規プロジェクトダイアログで、プロ...

SSHを使用したリモートインタープリター

前提条件:PyCharmはsshセッションを介してリモートインタープリターを実行するため、sshサーバーはリモートホスト上で実行する必要があります。ソースをリモートコンピューターにコピーする場合は、リモートサーバー構成の作成の項で説明したように、デプロイ設定を作成します。SSH資格情報によるリモート...

プロジェクト・インタープリター

このページを使用して、同じウィンドウで開いた各プロジェクトの Pythonインタープリターを選択します。インタープリター:プロジェクト・インタープリタープロジェクトペインで選択されたプロジェクトに対して、リストからPythonインタープリターを選択します。リスト内のインタープリターは、使用可能なPy...

データベースツールウィンドウ

概要:データベースツールウィンドウでは、データベースとDDLデータソースを操作できます。データベースのデータ構造を表示および変更し、他の関連タスクを実行できます。使用可能なデータソースは、データソース、スキーマ、テーブル、および列のツリーとして表示されます。現在データソースが定義されていない場合は、...

Scientific モード

PyCharmのScientific モードは、インタラクティブな科学計算とデータの可視化をサポートします。次のパッケージが正しくインストールされている必要があります。Matplotlib、Numpy、PyCharmインタープリターにパッケージをインストールする方法については、パッケージのインストー...

チュートリアル: PyCharmでデプロイ

このチュートリアルでは、PyCharmを使用して、コードのデプロイをリモートホストに設定する手順を順を追って説明します。始める前に:以下を確認してください:PyCharmバージョン5.0以降を使用しています。このチュートリアルはPyCharm 2016.1で準備されています。コードをデプロイするリモ...