Ubuntu14.0.4でGoogleChromeが起動しない
問題
VMのUbuntuでChromeをアップデートしたあとで、 Google Chromeのアイコンを押しても起動しなくなってしまった
$ google-chrome [11644:11689:1103/213846.450610:FATAL:nss_util.cc(632)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required. Please upgrade to the latest NSS, and if you still get this error, contact your distribution maintainer. 中止 (コアダンプ)
解決方法
これらを参考にパッケージをアップグレード
sudo apt-get upgrade sudo apt-get update
これで開けるようになった
[shingo-virtual-machine ~/git/work] $ google-chrome ATTENTION: default value of option force_s3tc_enable overridden by environment. ATTENTION: default value of option force_s3tc_enable overridden by environment. [18255:18293:1103/215655.013441:ERROR:simple_version_upgrade.cc(164)] File structure does not match the disk cache backend. [18255:18293:1103/215655.014000:ERROR:simple_backend_impl.cc(659)] Simple Cache Backend: wrong file structure on disk: /home/shingo/.cache/google-chrome/Default/Cache [18255:18255:1103/215655.772279:ERROR:account_tracker.cc(328)] OnGetTokenFailure: Invalid credentials. [18255:18255:1103/215655.779440:ERROR:account_tracker.cc(328)] OnGetTokenFailure: Invalid credentials. Ubuntuのパスワードを求められたので入力したら解決
apt-get参考
VMのUbuntuにWebサーバを立てる
概要
- 色々苦戦したのでメモ
やったこと
- 2.VM内のブラウザで localhost:8181 → 当然見られる
- 3.ホストPCのWindowsのブラウザで、VMのプライベートIPアドレスを指定して192.168.19.137:8181を見る → これも見られる
- 4.しかしiphoneからはアクセスできない
- 5.ルータのネットワーク外からポート8181のアクセスが来た時に、VMのWebサーバに行くようにポートフォワード(ポート開放)する
- 6.ルータがポートフォワードできるIPアドレスの範囲がVMのIPアドレスと違うー
- 7.なので、VMのIPアドレスをポートフォワードできるものに変更
- 8.ファイアウォールの設定も変更しよう ⇒ ufwで8181のポートをallowに
- 9.まだつながらない → 面倒だから 自宅ルータから直接VMをブリッジで接続しよう
- 10.出来た iphoneやノートPCのブラウザからUbuntu内のファイルの情報が見られた
- 11.グローバルIPアドレスを設定して見られないか確認
ここまで2,3日
手順
1.VM上のubuntuで pythonで簡易的にweb serverを立ち上げる ポート8181
python3の入っている環境で以下の通り、Webサーバ立ち上げる
ポートは8181
$ python3 -m http.server --cgi 8181 Serving HTTP on 0.0.0.0 port 8181 (http://0.0.0.0:8181/) ...
2.VM内のブラウザで localhost:8181 → 当然見られる
3.ホストPCのWindowsのブラウザで、VMのプライベートIPアドレスを指定して192.168.19.137:8181を見る → これも見られる
Windows側のブラウザでは上のlocalhostの部分をVMのIPアドレスにしたものを表示 - VMのIPアドレスはifconfigで取得した(IPV4のもの)
4.しかしiphoneからはアクセスできない
みられない
会社PCからも見られない
pingもtracerouteもVMのアドレスに対してやってもtimeoutする(ホストPCであるWindowsのIPアドレスに対しては問題なし)
$ ping 192.168.19.137 PING 192.168.19.137 (192.168.19.137): 56 data bytes ping: sendto: Host is down ping: sendto: Host is down Request timeout for icmp_seq 0 ping: sendto: Host is down Request timeout for icmp_seq 1 ping: sendto: Host is down Request timeout for icmp_seq 2 $ traceroute -v 192.168.19.137 traceroute to 192.168.19.137 (192.168.19.137), 64 hops max, 52 byte packets 1 * *^C
なぜつながらないのか?
あとからもう少しわかることだったが、ここで繋がらなかった理由はこの時点のVMのネットワークの設定がNATになっていて、ホストPC側の設定が正しくなかったからかもしれない
5.ルータのネットワーク外からポート8181のアクセスが来た時に、VMのWebサーバに行くようにポートフォワード(ポート開放)する
家のルータはソフトバンク光の 光BBユニット(EWMTA2.3)だった
参考
ルータの設定
そうしたら以下のように言われた
転送先IPアドレスに誤りがあります。IPアドレスの範囲内で半角数字で入力してください
6.ルータがポートフォワードできるIPアドレスの範囲がVMのIPアドレスと違うー
以下によると、転送先のIPアドレスの範囲が限られているらしく、VMのアドレスと異なるので転送できない・・・
ルータの設定
7.なので、VMのIPアドレスをポートフォワードできるものに変更
以下の方法でVMのIPアドレスを、ポート開放できる範囲に変える
実践初級ITブログ VMwareのUbuntuを固定IPにする
もともとのUbuntu IPアドレス 192.168.19.137 ブロードキャストアドレス 192.168.19.255 サブネットマスク 255.255.255.0 デフォルトルート 192.168.19.2 第一DNS 192.168.19.2 VMのUbuntuのIPを以下に変更 192.168.3.11
変える前
変えた後
ifconfigなどでIPアドレスが変わっていることを確認 再度ポート転送を設定すると成功
8.ファイアウォールの設定も変更しよう ⇒ ufwで8181のポートをallowに
utfいじる
- ここでallowにしたポート以外はファイアウォールが有効なので、ホストOSからは接続できない
第76回 Ubuntuのソフトウェアファイアウォール:UFWの利用(1):Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
$ sudo ufw status 状態: 非アクティブ $ sudo ufw enable ファイアウォールはアクティブかつシステムの起動時に有効化されます。 $ sudo ufw status 状態: アクティブ $ $ sudo ufw default DENY デフォルトの incoming ポリシーは 'deny' に変更しました (適用したい内容に基づいて必ずルールを更新してください) $ sudo ufw allow 8181 ルールを追加しました ルールを追加しました (v6) $ sudo ufw status 状態: アクティブ To Action From -- ------ ---- 8181 ALLOW Anywhere 8181 (v6) ALLOW Anywhere (v6) $ sudo ufw allow http ルールを追加しました ルールを追加しました (v6)
9.まだつながらない → 面倒だから 自宅ルータから直接VMをブリッジで接続しよう
- ブリッジについて参考
以下の方法でブリッジに変更した - VMware上のLinux Webサーバに外部からアクセスできるようにする | あみだがみねのもろもろ備忘録
最初はNATに設定されていた
ブリッジに変更
よくよく考えると、VMのネットワークをブリッジ接続にしたので、ゲートウェイとDNS サーバーのIPアドレスはルータのIPアドレスが正しいはず なのに、それらがVMのIPアドレスを変える前のままになっている 以下は間違い
以下が正しい
10.出来た ! iphoneやノートPCのブラウザからUbuntu内のファイルの情報が見られた
11.グローバルIPアドレスを設定して見られないか確認
上の接続はあくまで同一ネットワーク内からVMのプライベートIPアドレス 192.168.3.11 に繋いだだけだった
自分のグローバルIPアドレスが何か? - ルータの設定が書かれた以下のWAN側IPアドレスでも見られる - http://172.16.255.254/settei.html
- 以下のサイトでも考えられる
LAN外のネットワークからルータのグローバルIPアドレスを設定して、 グローバルIP:8181で外からも接続できるか確認
- Ubuntu側でWebサーバを立てる
$python3 -m http.server --cgi 8181 (git)-[master] Serving HTTP on 0.0.0.0 port 8181 (http://0.0.0.0:8181/) ...
ネットワーク外からアクセスする
図で書くとこんな感じだと思う(間違っていないはず・・)
pythonメモ
準備
コード規約
pipインストール参考
pyenv
- システムへインストールされているバージョンとは異なるバージョンを使用したい、2系ではなく3系を使用したいなど、そういったケースではpyenvを利用する
インストール方法
- pyenvの使い方とインストール - Python入門から応用までの学習サイト
- 前提:OSはUbuntu 14.04
必要なライブラリインストール $ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils pyenvのインストール $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc パスの再読込 exec $SHELL
pyenvの確認
$ pyenv install -l Available versions: 2.1.3 2.2.3 2.3.7 2.4 2.4.1 2.4.2 多いので省略
- 3.5.4をインストール
$ 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/ユーザ名/.pyenv/versions/3.5.4
- バージョン確認
$ pyenv versions * system (set by /home/ユーザ名/.pyenv/version) 3.5.4
- バージョン切り替え
$ pyenv shell 3.5.4 $ pyenv versions system [ * 3.5.4 (set by PYENV_VERSION environment variable)
pyenv local 3.5.4で環境を切り替えても、その上のディレクトリには適用されていないようだった(要確認)
- pyenv環境の削除
$ pyenv uninstall 3.5.4 pyenv: remove /home/ludwig125/.pyenv/versions/3.5.4? yes $
環境変数
os.getenv
os.getenv(varname[, value])
os.environ
- 環境変数を追加
- http://tmlife.net/programming/python/python-environ.html
- env.rolesdef ← fabric
- 参考:http://a3no.hatenablog.com/entry/2014/01/24/232219
例 「host101, host201, host301, host401」 「host_role」というkeyのroleに上記のサーバを登録した場合、roleに登録されたサーバの確認方法は以下のようにする for role in env.roledefs.keys(): print env.roledefs[role] →実行結果 ['host101', 'host201', 'host301', 'host401']
文法
リスト(配列)
data = [] for i in range(1, 6): data.append(i * 2) print data
リスト内包表記
data2 = [i * 2 for i in range(1, 6)] print data2
map
mapは配列の各要素に対して関数を実行する
以下はmap(関数, 配列)
data3 = map(lambda x : x*2, range(1, 6)) print data3
実行結果
$ python list.py [2, 4, 6, 8, 10] [2, 4, 6, 8, 10] [2, 4, 6, 8, 10]
リスト内包表記
- 10以下の奇数を作成する
- リスト内包表記 のあとにif文でフィルタリングできる
>>> [ i for i in range(1, 11) if((i % 2) == 1)] [1, 3, 5, 7, 9]
python デコレータ
デコレータ例
- 関数が実行にかかった時間を表示するデコレータ
import time def time_log(func): def wrapper(*args, **kwargs): print("start: " + func.__name__) start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print("end: " + func.__name__ , " elapsed time:" + str(end_time - start_time)) return res return wrapper @time_log def func1(): print("Boys, be ambitious") time.sleep(3) print("Girls, be ambitious") func1()
実行結果
$ python deco_time.py start: func1 Boys, be ambitious Girls, be ambitious ('end: func1', ' elapsed time:3.00378608704')
serial
どんなタスクも serial を指定すると設定を無視してシリアルで実行します。 http://fabric-ja.readthedocs.org/ja/latest/usage/parallel.html
roles
- ホストリストを参照するために利用されるロール名のリストを定義するデコレーター
- http://fabric-ja.readthedocs.org/ja/latest/api/core/decorators.html
- http://www.ianlewis.org/jp/fabric-pythonic
正規表現
match
文字列のエスケープとmatch - http://python-doc-ja.readthedocs.org/en/latest/howto/regex.html
ホスト名からホスト番号を取り出す
- 参考:
例: ホスト名:host022101.co.jp → 022101を取り出す host = "adsearch022101.co.jp" pattern = r"([a-z]*)(\d*)" m = re.match(pattern, host) host_num = m.group(2) print host_num ⇒ 022101
辞書
- http://www.gesource.jp/programming/python/code/0018.html
- http://www.python-izm.com/contents/basis/dict.shtml
Tips
一つの長い行を途中で折り返す 方法1.バックスラッシュ「\」を使う test = '%s \ %s' % ("aaa", "bbb") ただしこれだと 折り返した後の行頭からの空白が出力されてしまう >>> test = '%s \ ... %s' % ("aaa", "bbb") >>> print test aaa bbb 方法2.括弧で囲う test2 = ('%s ' '%s' % ("aaa", "bbb")) これなら余計なスペースは入らない >>> test2 = ('%s ' ... '%s' % ("aaa", "bbb")) >>> print test2 aaa bbb これでも大丈夫 test2 = ('%s ' '%s' % ("aaa", "bbb")) >>> test2 = ('%s ' ... '%s' ... % ("aaa", "bbb")) >>> print test2 aaa bbb
GUI
参考:実践力を身につける Pythonの教科書 | マイナビブックス
Tkinter
import tkinter.messagebox as mb ans = mb.askyesno("question", "Do you like nooble")
実行
$ python3 dialog.py
最初失敗
$ python3 dialog.py Traceback (most recent call last): File "dialog.py", line 1, in <module> import tkinter.mesagebox as mb 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'
- matplotlibが描画されない - DISTRICT 37 を参考に以下を実行
$ sudo apt install python-tk tk-dev $ pyenv install 3.5.1
再度実行
$ python3 dialog.py
あとでまたできなくなったので、改めて確認
Webサーバを立てる
参考:実践力を身につける Pythonの教科書 | マイナビブックス
pythonでWebサーバを起動
8181ポートでWebサーバを起動してみる
python3 -m http.server --cgi 8181
詳細はこちらに記載
Webサーバとして、URLのパラメータの値を取得する
参考:実践力を身につける Pythonの教科書 | マイナビブックス
chap5/5-2/cgi-bin] $ cat show-params.py #!/usr/bin/env python3 import cgi # header print("Content-Type: text/html; charset=utf=8") print("") print("<pre>") # URLパラメータを取得する form = cgi.FieldStorage() # 特定のパラメータを取得して表示 mode = form.getvalue("mode", default="") print("mode=", mode) # すべてのパラメータを取得して表示 print("--- all params ---") for k in form.keys(): print(k, "=", form.getvalue(k))
cgi-binより上のパスでWebサーバ起動
chap5/5-2] $ python3 -m http.server --cgi 8181 Serving HTTP on 0.0.0.0 port 8181 (http://0.0.0.0:8181/) ... 192.168.3.2 - - [31/Oct/2017 23:51:32] "GET /cgi-bin/show-params.py?mode=test&n=30&q=500 HTTP/1.1" 200 -
インスタンス
クラスのオーバーロード
class Pos: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): x2 = self.x + other.x y2 = self.y + other.y return Pos(x2, y2) def add(self, other): # オーバーロードではなく関数呼び出しで同じ結果を得ることができるか・・? x2 = self.x + other.x y2 = self.y + other.y return Pos(x2, y2) def __str__(self): return "{0}, {1}".format(self.x, self.y) p1 = Pos(10, 20) p2 = Pos(100, 400) p3 = p1 + p2 # +演算子をオーバーロードした__add__を使う print(p3) p3 = p1.add(p2) # 上記のp1 + p2 はこれと同じこと print(p3)
結果
$ python3 pos-add2.py 110, 420 110, 420
テスト
unittest
- https://docs.python.jp/3/library/unittest.html
- http://docs.python.jp/2/library/unittest.html#unittest.TestCase.assertRaises
- http://www.yoheim.net/blog.php?q=20160902
pytest
- 参考:Python testing 勉強会(1) pytestを使ってみる
インストール flake8入れる flake8 sudo easy_install-2.7 flake8 pip入れる pip sudo easy_install-2.7 pip pytest入れる sudo pip install pytest
pytest実行
-v
pytestに「-v」を付けると差分が詳細表示される --caputure=no --caputure=no でテスト中のprint文などを出力する
monkeypatch
http://thinkami.hatenablog.com/entry/2017/03/07/065903 https://docs.pytest.org/en/latest/monkeypatch.html http://niwaringo.tumblr.com/post/66948561978/pytest%E3%81%AEmonkeypatch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6urllibrequest%E3%81%AE%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%81%99%E3%82%8B
トラブル対応
vimメモ
Ubuntuの環境にpythonをインストールする
以下のURLからdownload
https://www.python.org/downloads/
そのあと以下の手順でインストール
Linuxに好きなバージョンのPythonをインストールする方法 - AkicanBlog
$ ls$ cd (解凍したPythonのフォルダ名)$ sudo ./configure$ sudo make$ sudo make install
以下のようなエラーが出たので-Hを使う
The directory '/home/shingo/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/shingo/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already up-to-date: setuptools in /usr/local/lib/python3.6/site-packages
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages
できたみたい
$ which python3
/usr/local/bin/python3
なぜか2.7しか認識されていない
ただ、python3のパスはとっている
$ which python3
/usr/local/bin/python3