VMのUbuntuに対して指定のポートが有効かどうか確認する
概要
- 以前こちらでも設定したが、ufwで特定のポートからのアクセスを許可する方法と、それが有効か確認する方法を記載する
ufwとは
第76回 Ubuntuのソフトウェアファイアウォール:UFWの利用(1):Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
ufw(Uncomplicated FireWall)は,Ubuntuで標準的に利用できる,「iptablesを簡単に設定するツール」です。ufwを利用することで,「外部からの接続は基本的に受け付けない」「sshだけは許す」などといった設定を,iptablesにくらべて格段に少ない操作で実現できます。
新たにポートを許可
- Ubuntuで以下を設定
[~] $sudo ufw allow 5000 ルールを追加しました [~] $
- ufw statusでポートを確認する
- ※もともと80は有効。8181は上の記事で有効にしたもの
[~] $sudo ufw status 状態: アクティブ To Action From -- ------ ---- 8181 ALLOW Anywhere 80 ALLOW Anywhere 5000 ALLOW Anywhere [~] $
ホストOSのWindowsから見られることを確認
- Ubuntuで先程追加した5000番のポートを指定してWebサーバを立ち上げる
[~] $python3 -m http.server --cgi 5000 Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) ...
- Windows側のブラウザで以下のアドレスを見てみる
http://192.168.3.11:5000
[~] $python3 -m http.server --cgi 5000 Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) ... 192.168.3.2 - - [31/Jan/2018 00:06:54] "GET / HTTP/1.1" 200 - 192.168.3.2 - - [31/Jan/2018 00:06:54] code 404, message File not found 192.168.3.2 - - [31/Jan/2018 00:06:54] "GET /favicon.ico HTTP/1.1" 404 - 192.168.3.2 - - [31/Jan/2018 00:07:02] "GET / HTTP/1.1" 200 -
telnetで確認
- WindowsのコマンドプロンプトからUbuntuのアドレスとポートを指定してtelnetする
- コマンドプロンプトは、スタートメニューから「cmd」で行ける
- Window7でtelnetコマンドを使うためには以下を有効にする必要がある
- ポートが開いているかどうかをtelnetで確認する方法 | Knowledge Base
Windows VistaとWindows 7の場合、まず、telnetを有効にしなければならないことがあります: [スタート]->[コントロール パネル]->[プログラム]へ移動してください; [プログラムと機能]のメニューの[Windowsの機能の有効化または無効化]をクリックしてください; [Telnetクライアント]と[Telnetサーバー]の両方にチェックマークを付けてください; [OK]をクリックしてください。
- ポートが開いているかどうかをtelnetで確認する方法 | Knowledge Base
C: >telnet 192.168.3.11 5000
- ポートへの接続が有効な場合は以下の真っ黒な画面が表示される
- この画面で適当に打ち込むとUbuntu側に返していることがわかる
- 以下はabcdeと打ったときの結果
[~] $python3 -m http.server --cgi 5000 Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) ... 192.168.3.2 - - [31/Jan/2018 00:06:54] "GET / HTTP/1.1" 200 - 192.168.3.2 - - [31/Jan/2018 00:06:54] code 404, message File not found 192.168.3.2 - - [31/Jan/2018 00:06:54] "GET /favicon.ico HTTP/1.1" 404 - 192.168.3.2 - - [31/Jan/2018 00:07:02] "GET / HTTP/1.1" 200 - 192.168.3.2 - - [31/Jan/2018 00:15:20] code 400, message Bad request syntax ('abcde') 192.168.3.2 - - [31/Jan/2018 00:15:20] "abcde" 400 -
5000が有効になったことを確認できた
zshを使う
ずーーっとbashだったけれど、別に信仰があるわけじゃないので、いいかげんzsh使ってみる
参考リンクだけまとめる(自分が書かなくても他の人がいっぱい書いているからこれでいいや)
.zshrcの設定例(設定内容の説明コメント付き) - Qiita
自分なりにカスタムした設定
異なるウィンドウで履歴を共有しない
履歴を共有すると、screenの異なるウィンドウで実行したコマンド履歴が混じってきてうっとうしいので以下を使わないようにコメントアウトする
#### 同時に起動したzshの間でヒストリを共有する #setopt share_history
Macのpbcopyと同じようにクリップボードにコピーする
参考: Macのpbcopyをubuntuでも使う - Qiita
$ sudo apt-get install xsel
~/.zshrcに以下を追加
alias pbcopy='xsel --clipboard --input'
反映
source ~/.zshrc
最初これを参考に追加したがなぜかうまく行かなかったので上の設定をした Mac でも Linux でも一発でクリップボードにコピーする zsh の alias - mollifier delta blog
トラブル
zshにしたらpyenvが使えなくなった
zshにしたらpyenvが使えなくなった
djangoでも以下のようなエラーが出て焦る
[~/git/django-tutorial/tutorial/mysite] $python manage.py runserver (git)-[master] File "manage.py", line 14 ) from exc ^ SyntaxError: invalid syntax [~/git/django-tutorial/tutorial/mysite] $
~/.bashrcの中身を~/.zshrcにコピーするのを忘れていた
[~/git] $which pyenv (git)-[master] pyenv not found [~/git] $sudo find / -name pyenv (git)-[master] [sudo] password for ludwig125: /home/ludwig125/.pyenv/libexec/pyenv /home/ludwig125/.pyenv/bin/pyenv [~/git] $ (git)-[master] [~/git] $ (git)-[master] [~/git] $ (git)-[master] [~/git] $ (git)-[master] [~/git] $ (git)-[master] [~/git] $ (git)-[master] [~/git] $export PYENV_ROOT="$HOME/.pyenv" (git)-[master] [~/git] $export PATH="$PYENV_ROOT/bin:$PATH" (git)-[master] [~/git] $eval "$(pyenv init -)" (git)-[master] [~/git] $pyenv (git)-[master] pyenv 1.1.5-8-g7b9d1a4 Usage: pyenv <command> [<args>] Some useful pyenv commands are: commands List all available pyenv commands local Set or show the local application-specific Python version global Set or show the global Python version shell Set or show the shell-specific Python version install Install a Python version using python-build uninstall Uninstall a specific Python version rehash Rehash pyenv shims (run this after installing executables) version Show the current Python version and its origin versions List all Python versions available to pyenv which Display the full path to an executable whence List all Python versions that contain the given executable See `pyenv help <command>' for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme [~/git] $which pyenv (git)-[master] pyenv () { local command command="$1" if [ "$#" -gt 0 ] then shift fi case "$command" in (rehash|shell) eval "$(pyenv "sh-$command" "$@")" ;; (*) command pyenv "$command" "$@" ;; esac } [~/git] $
ということでこれを~/.zshrcにコピーする
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"
pythonのpandasを使う
参考
Pandas でデータフレームを作ってみよう – Python でデータサイエンス
[Python] pandasの使い方まとめ - Qiita
Pandas の DataFrame の基本的な使い方 - akiyoko blog
Python Pandasでのデータ操作の初歩まとめ − 前半:データ作成&操作編 - Qiita
インストール
$ pip install pandas
csvファイルを出力
[~/git/work/src/python/memo/pandas] $ cat padas-test.py import pandas as pd df = pd.DataFrame([ ['a', 'b', 'c'], ['d', 'e', 'f'] ]) df.to_csv("./output.csv") [~/git/work/src/python/memo/pandas] $ python3 padas-test.py [~/git/work/src/python/memo/pandas] $ cat ./output.csv ,0,1,2 0,a,b,c 1,d,e,f [~/git/work/src/python/memo/pandas] $
Ubuntu14.0.4でホスト名とユーザ名を変更する
概要
VMのUbuntu14.0.4でホスト名とユーザ名を変更したのが意外と大変だったのでメモ
以下では、ホスト名も、ユーザ名も、gitアカウントと同じ「ludwig125」にすることを目指した
参考
ホスト名
ホスト名:hostnameコマンドの結果出力するUbuntuのホスト名を指す
ホスト名の変更は簡単だった
- 以下のホスト名を変更するだけ
sudo vim /etc/hostname sudo vim /etc/hosts
反映させるにはUbuntuの再起動が必要
確認
$ hostname ludwig125-virtual-machine
※「-virtual-machine」の部分をつけたほうがホスト名として分かり易いのでつけた
ユーザ名の変更
ユーザ名:whoコマンドで出力されるユーザの名前
ユーザ名の変更はusermodで行う
usermodをする上での問題
しかし、自分のユーザ名を変更しようとしても、自分自身のプロセスがあるので変えられないという問題がある
$ sudo usermod -l ludwig125 <今のユーザ名> usermod: user <今のユーザ名> is currently used by process 1495 $
別のユーザを作る
自分自身のプロセスが動いている状態で自分のユーザ名を変えられないので、別にユーザを作った (もっといい方法があるかもしれない・・・)
- adduserで「temp_user」ユーザを追加
$ sudo adduser temp_user ユーザー `temp_user' を追加しています... 新しいグループ `temp_user' (1001) を追加しています... 新しいユーザー `temp_user' (1001) をグループ `temp_user' に追加しています... ホームディレクトリ `/home/temp_user' を作成しています... `/etc/skel' からファイルをコピーしています... 新しい UNIX パスワードを入力してください: 新しい UNIX パスワードを再入力してください: passwd: パスワードは正しく更新されました temp_user のユーザ情報を変更中 新しい値を入力してください。標準設定値を使うならリターンを押してください フルネーム []: temp 部屋番号 []: 職場電話番号 []: 自宅電話番号 []: その他 []: 以上で正しいですか? [Y/n] y
temp_userにsudo権限を追加
作ったばかりのtemp_userにはsudo権限がないので temp_userでusermodをすると以下のエラーが出た
$ usermod コマンド 'usermod' は '/usr/sbin/usermod' で利用できます '/usr/sbin'がPATH環境変数に含まれていないためコマンドを特定できませんでした。 大抵の場合、お使いのユーザーアカウントに管理者特権がないことが原因です。 usermod: コマンドが見つかりません temp_user@ludwig125-virtual-machine:/home$ useradd コマンド 'useradd' は '/usr/sbin/useradd' で利用できます '/usr/sbin'がPATH環境変数に含まれていないためコマンドを特定できませんでした。 大抵の場合、お使いのユーザーアカウントに管理者特権がないことが原因です。 useradd: コマンドが見つかりません
temp_userでusermodをできるように、予めtemp_userにsudo権限を付けておく
sudoユーザーを追加する方法 - Linux入門 - Webkaru
以下はtemp_userではなく、もとのユーザ権限で実行
usermod -G sudo temp_user
temp_userでログインし直す
ubuntuのユーザをみて、temp_userに切り替える
temp_userでusermod実行
temp_user内で改めてusermodを実行
$ sudo usermod -l ludwig125 <今のユーザ名> usermod: user <今のユーザ名> is currently used by process 1495 $
もとのユーザのプロセスが動いているので、全部killする
sudo kill -9 プロセスID
再度usermodを実行したら、今度はうまくいった
ユーザディレクトリの名前を変更
$ ls /home $ cd /home $ sudo mv もとのユーザ ludwig125 $ ls /home ludwig125 temp_user
whoで確認
[~] $ who ludwig125 :0 2017-12-16 22:42 (:0) ludwig125 pts/5 2017-12-16 22:46 (:0:S.0) ludwig125 pts/13 2017-12-16 22:46 (:0:S.1) [~] $
更に/etc/passwdのユーザディレクトリを変える
$ sudo vim /etc/passwd で ludwig125:x:1000:1000:ludwig125:/home/ludwig125:/bin/bash ↑この/home以下のディレクトリ名をもとのユーザ名から変える
上記までの対応によって生じた問題
トラブル1.VMとホストOSとの間でコピペができない
名前変更後、VMのデータをコピーしてホストOSのWindowsにペーストできないという問題が生じた
ホスト名を変えてしまったのでvmwaretoolsが機能していない可能性がある
いったんVMもホストOSも再起動したらコピペができるようになった
- 参考 vmware toolsとは
VMware Tools の概要 VMware Tools は、仮想マシンのゲスト OS のパフォーマンスを強化し、仮想マシンの管理を改善するユーティリティのスイートです。ゲスト OS に VMware Tools をインストールしておかないと、ゲストで重要な機能を実行できません。VMware Tools をインストールすると、次のような問題が排除または改善されます。 ビデオの解像度が低い カラー深度が不十分 ネットワーク速度の表示が正しくない マウスの動きが制限される コピー アンド ペーストやファイルのドラッグ アンド ドロップができない 音声が出ない ゲスト OS の静止スナップショットを作成する機能が用意される ゲスト OS とホストの時刻が同期される
トラブル2. linuxのグループが変わっていない
グループ名が昔のまま変わっていなかったので変える
usermod -g グループ名 ユーザ名
[/home] $ sudo groupadd ludwig125 [/home] $ sudo usermod -g ludwig125 ludwig125 [/home] $
トラブル3. git に接続できない
名前変更後、gitに接続できない
git pullできない 「Permission denied (publickey).」が出た
[~/git/work] $ git pull Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. [~/git/work] $
以下を参考に調べて見る
githubで"Permission denied (publickey)."が出た時はssh -Tで繋ぎ直す - Qiita Error: Permission denied (publickey) - User Documentation Git - SSH 公開鍵の作成
[~/git/work] $ ssh -vT git@github.com OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to github.com [192.30.255.112] port 22. debug1: Connection established. debug1: identity file /home/ludwig125/.ssh/id_rsa type 1 debug1: identity file /home/ludwig125/.ssh/id_rsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_dsa type -1 debug1: identity file /home/ludwig125/.ssh/id_dsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_ecdsa type -1 debug1: identity file /home/ludwig125/.ssh/id_ecdsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_ed25519 type -1 debug1: identity file /home/ludwig125/.ssh/id_ed25519-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 debug1: Remote protocol version 2.0, remote software version libssh_0.7.0 debug1: no match: libssh_0.7.0 debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-sha1 none debug1: kex: client->server aes128-ctr hmac-sha1 none debug1: sending SSH2_MSG_KEX_ECDH_INIT debug1: expecting SSH2_MSG_KEX_ECDH_REPLY debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 debug1: Host 'github.com' is known and matches the RSA host key. debug1: Found key in /home/ludwig125/.ssh/known_hosts:1 debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /home/ludwig125/.ssh/id_rsa debug1: Authentications that can continue: publickey debug1: Trying private key: /home/ludwig125/.ssh/id_dsa debug1: Trying private key: /home/ludwig125/.ssh/id_ecdsa debug1: Trying private key: /home/ludwig125/.ssh/id_ed25519 debug1: No more authentication methods to try. Permission denie [~/git/work] $
ホスト名を変えたからなのか、なぜなのかわからないけれど、git にssh鍵が登録されていないみたい
以前書いた自分のブログを参考にssh鍵を作って登録し直す
登録後
[~/git/work] $ ssh -vT git@github.com OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to github.com [192.30.255.113] port 22. debug1: Connection established. debug1: identity file /home/ludwig125/.ssh/id_rsa type 1 debug1: identity file /home/ludwig125/.ssh/id_rsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_dsa type -1 debug1: identity file /home/ludwig125/.ssh/id_dsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_ecdsa type -1 debug1: identity file /home/ludwig125/.ssh/id_ecdsa-cert type -1 debug1: identity file /home/ludwig125/.ssh/id_ed25519 type -1 debug1: identity file /home/ludwig125/.ssh/id_ed25519-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 debug1: Remote protocol version 2.0, remote software version libssh_0.7.0 debug1: no match: libssh_0.7.0 debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-sha1 none debug1: kex: client->server aes128-ctr hmac-sha1 none debug1: sending SSH2_MSG_KEX_ECDH_INIT debug1: expecting SSH2_MSG_KEX_ECDH_REPLY debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 The authenticity of host 'github.com (192.30.255.113)' can't be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts. debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /home/ludwig125/.ssh/id_rsa debug1: Server accepts key: pkalg ssh-rsa blen 279 debug1: key_parse_private2: missing begin marker debug1: read PEM private key done: type RSA debug1: Authentication succeeded (publickey). Authenticated to github.com ([192.30.255.113]:22). debug1: channel 0: new [client-session] debug1: Entering interactive session. debug1: Sending environment. debug1: Sending env LANG = ja_JP.UTF-8 debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 Hi ludwig125! You've successfully authenticated, but GitHub does not provide shell access. debug1: channel 0: free: client-session, nchannels 1 Transferred: sent 3312, received 1872 bytes, in 0.2 seconds Bytes per second: sent 14182.2, received 8016.0 debug1: Exit status 1 [~/git/work] $
成功 git pullもgit pushもできるようになった! ブログ書いててよかったよ
トラブル4. pip3が使えなくなってた
誤ったインタプリタです: そのようなファイルやディレクトリはありません
pip3を使おうとしたらこんなエラーが
[~/git/work/src/python/memo/pandas] $ pip3 install pandas_ply /home/ludwig125/.pyenv/pyenv.d/exec/pip-rehash/pip: /home/ludwig125/.pyenv/versions/3.5.4/bin/pip3: /home/前のユーザ名/.pyenv/versions/3.5.4/bin/python3.5: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
前のユーザ名のパスを見ようとしている?
解決できないのでpyenvごと削除して作り直す
[~] $ pyenv versions * system (set by /home/ludwig125/.python-version) 3.5.4 [~] $ pyenv uninstall 3.5.4 pyenv: remove /home/ludwig125/.pyenv/versions/3.5.4? yes [~] $ [~] $ pyenv install 3.5.4 Downloading Python-3.5.4.tar.xz... -> https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz Installing Python-3.5.4... Installed Python-3.5.4 to /home/ludwig125/.pyenv/versions/3.5.4 $ pyenv local 3.5.4で移動
これでpip3を使えるようにになった
[~] $ [~] $ pip3 --version pip 9.0.1 from /home/ludwig125/.pyenv/versions/3.5.4/lib/python3.5/site-packages (python 3.5) [~] $
pythonでseleniumを使う
参考
とりあえず参考になったページを貼っておく
入門、Selenium - Seleniumの仕組み | CodeGrid
Selenium使ってみた(Python) - コンピュータサイエンス系勉強ノート
PythonでSeleniumを使ってスクレイピング (基礎) - Qiita
3秒でわかるSeleniumのつかいかた(Python・ちょっとDjango) - へっぽこびんぼう野郎のnewbie日記
Selenium使ってみた(Python) - コンピュータサイエンス系勉強ノート
準備
seleniumをインストール
$ pip3 install selenium
以下からchromedriverをダウンロード
- Downloads - ChromeDriver - WebDriver for Chrome
- → zipファイルを展開してとりあえず~/に置いた
以下のファイルを実行
$ cat selenium-test.py from selenium import webdriver browser = webdriver.Chrome(executable_path='/home/ludwig125/chromedriver') browser.get('https://www.yahoo.co.jp/')
実行
python3 selenium-test.py
Chromeが起動してyahooのページが表示される
トラブル対応
moduleが無いとかでうまく実行できなかったので、以下を確認し直す
$ sudo apt install python3-pip python3-dev $ pyenv install 3.5.4 $ pyenv local 3.5.4 $ pyenv versions system * 3.5.4 (set by /home/ludwig125/git/work/src/python/.python-version) $
python3のパスを確認
$ which python3 /home/ludwig125/.pyenv/shims/python3 $ /home/ludwig125/.pyenv/shims/python3 --version Python 3.5.4 $
pythonでグラフを描画(matplotlib)
グラフの例(sin関数)
【Python入門】ライブラリmatplotlibの基本的な使い方 - Qiita
[~/git/work/src/python] $ cat test.py import math import numpy as np from matplotlib import pyplot pi = math.pi x = np.linspace(0, 2*pi, 100) y = np.sin(x) pyplot.plot(x, y) pyplot.show() [~/git/work/src/python] $
実行
python3 test.py
以下、これを表示するまでのエラー
エラー対応
参考
matplotlibが描画されない - DISTRICT 37
python - python3 で _tkinter を import したい - スタック・オーバーフロー
ImportError: Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy. If you're working with a numpy git repo, try `git clean -xdf` (removes all files not under version control). Otherwise reinstall numpy. Original error was: /usr/local/lib/python2.7/dist-packages/numpy/core/multiarray.so: undefined symbo l: _Py_ZeroStruct [~/git/work/src/python/software-design/saikyu-kouka] $ pip3 install numpy Traceback (most recent call last): File "/usr/local/bin/pip3", line 7, in <module> from pip import main File "/usr/local/lib/python3.6/site-packages/pip/__init__.py", line 26, in <module> from pip.utils import get_installed_distributions, get_prog File "/usr/local/lib/python3.6/site-packages/pip/utils/__init__.py", line 16, in <module> import subprocess File "/usr/local/lib/python3.6/subprocess.py", line 136, in <module> import _posixsubprocess ImportError: /usr/local/lib/python2.7/dist-packages/_posixsubprocess.so: undefined symbol: Py_InitMo dule4_64 や Traceback (most recent call last): File "test.py", line 3, in <module> from matplotlib import pyplot File "/usr/local/lib/python3.6/site-packages/matplotlib/pyplot.py", line 113, in <module> _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup() File "/usr/local/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 60, in pylab_setup [backend_name], 0) File "/usr/local/lib/python3.6/site-packages/matplotlib/backends/backend_tkagg.py", line 6, in <module> from six.moves import tkinter as Tk File "/usr/local/lib/python2.7/dist-packages/six.py", line 92, in __get__ result = self._resolve() File "/usr/local/lib/python2.7/dist-packages/six.py", line 115, in _resolve return _import_module(self.mod) File "/usr/local/lib/python2.7/dist-packages/six.py", line 82, in _import_module __import__(name) File "/usr/local/lib/python3.6/tkinter/__init__.py", line 36, in <module> import _tkinter # If this fails your Python may not be configured for Tk ModuleNotFoundError: No module named '_tkinter'
などのエラーが出た
もう面倒になったので、pyenvをつくって、入れ直した
$ sudo apt install python3-pip python3-dev $ pyenv install 3.5.4 $ pyenv local 3.5.4 $ pyenv versions system * 3.5.4 (set by /home/ludwig125/git/work/src/python/.python-version) $
python3のパスを確認
$ which python3 /home/ludwig125/.pyenv/shims/python3 $ /home/ludwig125/.pyenv/shims/python3 --version Python 3.5.4 $
追加で必要なライブラリをインストール
$ python3 -m pip install numpy $ python3 -m pip install matplotlib
tkinterが使えることを確認
$ python3 -m tkinter
グラフの例(1次関数)
$ cat y-is-10x.py import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 99, 100) y = x * 10 plt.plot(x, y) plt.show()
実行結果
$ python3 y-is-10x.py
グラフの例(ノイズの入った1次関数)
$ cat noisy_y.py import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 99, 100) f_noisy = np.vectorize(lambda x: x * 10 + np.random.normal(0, 100)) d = f_noisy(x) plt.plot(x, d) plt.show()
実行結果
python3 noisy_y.py
グラフの例(放物線)
$ cat throw.py from math import sin, cos, radians from matplotlib import pyplot as plt def throw(x, y, v0, angle, repeatNum, dt): isSuccess = False xarray = []; yarray = [] vx = v0*cos( radians(angle) ) vy = v0*sin( radians(angle) ) ax = 0.0 ay = -9.8 for i in range(repeatNum): x = x + (vx + ax*dt/2)*dt y = y + (vy + ay*dt/2)*dt vx = vx + ax * dt vy = vy + ay * dt xarray.append(x) yarray.append(y) return (xarray, yarray, isSuccess) def prepareFigureArea(): plt.figure(figsize=(5, 5)) plt.xlim([0, 5]) plt.ylim([0, 5]) plt.xlabel('X - Axis (m)') plt.ylabel('Y - Axis (m)') return x1, y1, isSuccess = throw(0, 0, 6, 35, 500, 0.01) x2, y2, isSuccess2 = throw(0, 0, 6, 45, 500, 0.01) x3, y3, isSuccess3 = throw(0, 0, 6, 55, 500, 0.01) x4, y4, isSuccess3 = throw(0, 0, 6, 70, 500, 0.01) prepareFigureArea() plt.plot(x1, y1, 'bo-', x2, y2, 'ro-', x3, y3, 'ko-', x4, y4, 'yo-') plt.legend(['35 deg.', '45 deg.', '55 deg.', '70 deg.']) plt.show()
実行結果
python3 throw.py
以下が必要だったのでpip3 install
$ pip3 install six $ pip3 install pyparsing $ pip3 install cycler $ pip3 install python-dateutil --upgrade