2018年9月28日金曜日

Python PEP257 docstringの書き方

docstringはモジュール、関数、クラス、に追加できる説明文です。
3重クォートをdefのすぐ下の行に入れます。3重クォートは、「""" 」でも 「'''」 でもどちらでも使えます。#でのコメントアウトは使えません。

定義後は、オブジェクト名.__doc__ でアクセスできます。

1行説明文を書く

def foo():
    """This is a test."""
    x = 1
    ....
拡張を見越して1行でも3重クォートで書くほうがよいとされています。
文は完全な文で書きます(大文字始まり、ピリオドあり)。コード本文は閉じる"""の次の行から空白行なしで書き始めます。


1行めの場所

"""
something...
"""
と書くと、一行目は上側の""" の右側(この例では空白)になり、__doc__の結果は\nから始まります。それで問題なければ大丈夫ですが\n始まりが嫌なときは

"""something...
"""
と書きます。


最初の一行のあと、1行スペースを入れる

def bar():
    """This is test.
    This test is for ....
    and ...
    ...
    """

パラメータを書くときは1行に1つ

def baz(a, b):
    """This is test.
    Parameters:
    a: test param1, text
    b: test param2, int
    ...
    """

docstring欄にコメントアウトも入れられる

def df_init():
    '''初期化 読み出し, index追加
  
    # df = pd.read_csv('./data/all_data.csv')
    # df['index'] = range(len(df))
    '''
    ....
と定義してから
df_init?
とやって確認すると、#がDocstring内にあることが確認できます。
Signature: df_data_all_init()
Docstring:
初期化 読み出し, index追加
# df = pd.read_csv('./data/all_data.csv')
# df['index'] = range(len(df))
File:      ~/anaconda3/...
Type:      function

2018年9月26日水曜日

Jupyterの下から上がってくるペイジャーを消す

Jupyterを使っていると下から出てくるウィンドウ(pagerというらしい)がありますが、これを消して、コンソール上のprintと同じように出力させます。ちなみに、復活のさせ方が分かりませんでした。

from __future__ import print_function # py2
from IPython.core import page
page.page = print

2018年9月25日火曜日

Python datetimeで年月日をゼロ埋めで出力する

年、月、日、時 を yyyy_mm_dd_hh と出力します。1月は01とします。

formatを使う

import datetime

now = datetime.datetime.now()
y = now.year
m = now.month
d = now.day
h = now.hour

'{0}_{1:02d}_{2:02d}_{3:02d}'.format(y, m, d, h)

strftimeを使う

こちらの方が簡単で、よく見ます。
import datetime

# ex. 2021_01_01_00
now = datetime.datetime.now()
now.strftime("%Y_%m_%d_%H")

# ex. 2021-01-01 00:00:00
now.strftime("%Y-%m-%d %H:%M:%S")

%Y 西暦 (4桁) の 10 進表記
%m 0埋めした月
%d  0埋めした日にち
%H  0埋めした時 (24時間表記)
%M 0埋めした分
%S 0埋めした秒

%表記は、大文字と小文字で違う意味になるので注意。
https://docs.python.org/ja/3/library/datetime.html#strftime-and-strptime-format-codes

ゼロ埋めしないなら例えば
import datetime

now = datetime.datetime.now()

# ex. 2021-1-1 0:0:0
f"{now.year}-{now.month}-{now.day} {now.hour}:{now.minute}:{now.second}"

formatで失敗したこと

ゼロ埋めを{0:04d}.format(x)の形で覚えていたので、全部を{0:02d}, {0:02d}としてしまい、エラーが出ていました。

ValueError: cannot switch from automatic field numbering to manual field specification これは以前のpythonの書き方(今も使える)で、現在ではフォーマット設定は左から順に{0} {1}, ... とするのが正しいです。

{}_{1:02d}_{2:02d}_{3:02d}'.format(y, m, d, h)

というように0:を省略することもできません。
(yearは必ず4桁だから0も省略しようとしたらエラー)

2018年9月23日日曜日

pipとcondaの使い分け雑感

個人的にはcondaが楽なのですがpipを使う必要がある場合も多く、たまに困っています。

問題点


condaとpipを混ぜて使っていると、バージョンが噛み合わなくなってバグります。QTを使ったりすると顕著でした。 とはいえ両方使うので、ほとんどcondaにして必要があればpipにしています。バグると1から入れなおす覚悟です。

condaのいいところ/悪いところ



pipのいいところ/悪いところ


  • pypiにあれば全て対応している
  • condaに対応していない場合があり、pipも使わざるを得ない
  • プロキシは手動で都度対応する必要あり


企業内のネットワーク回線を使用していて、
pip でエラーがでるときは、プロキシが原因のときがあります。

Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 11004] getaddrinfo failed',)': /simple/memory-pforiler/

プロキシを通すとダウンロード可能になります。

プロキシはhttp://proxy.AAA.co.jp:8080

などの形式ですが、各社の担当部門にたずねるのが無難かと思われます。例えばmemory_profilerをpipでインストールしたいときは

pip install memory_profiler --proxy=http://proxy.AAA.co.jp:8080

とやるとOKです。

condaのプロキシ設定


.condarcファイルに書きます。
$conda config とすると、homeディレクトリに.condarcファイルが作成されます。
proxy_servers:
    http://proxy.AAA.co.jp:8080
    https://proxy.AAA.co.jp:8080
こんな感じです。

2018年9月22日土曜日

Pythonでprint出力をテキストファイルに保存したい

import sys
old_stdout = sys.stdout # 保存しておく
sys.stdout = open('stdout.txt', 'w')
print("This will be save as a txet file.")
sys.stdout = old_stdout # 保存したものを戻す

BeautifulSoupとPhantomJSで得られるsoupはほぼ同じ

ふと気になって調べてみると同じでした == でidenticalかは分かります。ただし、ヘッダ部分が少し違うといえば違います。



2ちゃんねるのデータを取ったりしているのですが、そのときは読み込みの時間が記載されるのでそこが違ったりします。difflibで調べてみると分かりました。PhantomJSは更新停止ということでBSだけを使うことにします。

Python で2つの文字列の差分を見る

標準モジュールdifflib

まず、分割されたリストs1とs2の中身を比較してみます。 before.py、after.pyという名前は判別用ですが、適当につけてもよいかと。
import difflib
s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
sys.stdout.writelines(difflib.context_diff(s1, s2, fromfile='before.py', tofile='after.py'))
出力は
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido
となって、どちらにもあるguidoには!がついていませんが、どちらかにしかない項目には!がついています。


テキストでdiffを見る


テキストの文字列は、文字のリストにしてから同様の操作をします。
text1 = '''  1. Beautiful is better than ugly.
2. Explicit is better than implicit.
3. Simple is better than complex.
4. Complex is better than complicated.
'''.splitlines(keepends=True)
text2 = '''  1. Beautiful is better than ugly.
3. Simple is better than complex.
4. Complicated is better than complex.
5. Flat is better than nested.
'''.splitlines(keepends=True)
という例を使います。keepends=True は改行を残すかどうかどうかで、デフォルトではFalseになっています。
*** before.py
--- after.py
***************
*** 1,4 ****
    1. Beautiful is better than ugly.
-   2. Explicit is better than implicit.
    3. Simple is better than complex.
!   4. Complex is better than complicated.
--- 1,4 ----
    1. Beautiful is better than ugly.
    3. Simple is better than complex.
!   4. Complicated is better than complex.
!   5. Flat is better than nested.
-, + という記号は1つめあるいは2つめにしかない、という結果を表しています。

2018年9月21日金曜日

HUAWEI phone's "do not cover the top of the screen"

I'm using HUAWEI P10 lite and cover glass is broke again and again... webbing cracks on the phone.

do not cover the top of the screen

When this message appears, touch screen is disabled and can't go to home-page with swipe. To go to normal page, push power and volume up buttons. This is very annoying. As I searched, this do not cover "option" can not be disabled.

why "do not cover" appears?


Simple answer is that your phone top glass must be cleaned. In my case, I was using cover glass to protect and something was on the glass... even fragments of broken cover! Just swipe well, especially top of glass.


https://forums.androidcentral.com/honor-7/627247-can-you-disable-do-not-cover-top-your-phone-msg.html

2018年9月16日日曜日

soupから属性の値を抽出する

BeautifulSoupで得たhtml的なものから、<a>の中の属性hrefの中身(URL)を取り出したいとき。

soup = = BeautifulSoup(html_doc, 'html.parser')
Out:
<h3>hogehoge</h3>
<a href="http://aaa.html">AAA</a><br/>
<a href="http://bbb.html">BBB</a><br/>
...
ここからAAA、BBBのアドレスが欲しいときは、

soup.find_all('a')
for s in soup.find_all('a'):
    print(s.text) # AAA, BBB
    print(s.attrs['href']) # http://aaa.html, http://bbb.html
soup.find_all('a')リストの中身sの属性であることに注意です(forループで取り出している)

BeautifulSoupでhtmlを場所指定で渡そうとしたら警告

blogger.htmlというファイルをsoupに渡したいときに、
soup_blogger = BeautifulSoup('./blogger.html', 'html.parser')
とやろうとしたらエラー
...anaconda3/lib/python3.6/site-packages/bs4/__init__.py:219: UserWarning: "b'./blogger.html'" looks like a filename, not markup. You shouldprobably open this file and pass the filehandle intoBeautiful Soup.
  'Beautiful Soup.' % markup)
 
ファイル名で開かないでマークアップを渡すためにopen で開いてください、ということでした。
with open('./blogger.html') as f:
    soup_blogger = BeautifulSoup(f, 'html.parser')

2018年9月15日土曜日

Pythonでマウス挙動を操作するpyautogui

import pyautogui
# モニタのサイズを知る
pyautogui.size()
# マウスの座標を知る
pyautogui.position()
# 指定した座標にマウスを移動
pyautogui.moveTo(1750, 225)
# durationを指定すると、その時間[秒]かけて移動する
pyautogui.moveTo(1750, 225, duration=1)
# 指定した座標をクリック
pyautogui.click(1815,210)

2018年9月14日金曜日

Pandasでcsvをread_csvを使って読み込むときに列名にスペースが入るので注意

Pandasでcsvをread_csvを使って読み込むとき、何も設定しなければ1行めがheaderに設定できますが、注意が必要です、という話。
test.csvname, num
AAA, 10
BBB, 20
CCC, 30
だったとして、
import pandas as pd
df = pd.read_csv('test.csv')
とやってデータフレームを読み込みます
# In
df.columns
# Out
Index(['name', ' num'], dtype='object')
・・・何かおかしいのですが、カラム名のnum の前にスペースが入っています
ということで、
df['num']
とやると
KeyError: 'num'
が出てしまいますので注意。csv側で1行めはスペースを抜くか、names=['name', 'num']で指定するのがよいようです。

2018年9月11日火曜日

Python sys.stdout.writeを使ってリストの中身を目視+手動判定で振り分ける

Jupyterを使って、リストの中身を1つずつ自分で確認してTrue, Falseで振り分けるコードです。
Trueはy, t を打ってinputして、Falseはf, nでチェックします。


2018年9月9日日曜日

Jupyter notebookをアップデートしたら起動しなくなったのでいろいろ直した

(Ubuntu16.04, Python3.6)

Jupyter notebookをアップデートしたら起動しなくなったのですが・・・。

jupyter notebook
Traceback (most recent call last):
  File "/home/***/anaconda3/bin/jupyter-notebook", line 7, in <module>
    from notebook.notebookapp import main
  File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/notebookapp.py", line 46, in <module>
    from zmq.eventloop import ioloop
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/__init__.py", line 47, in <module>
    from zmq import backend
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/backend/__init__.py", line 40, in <module>
    reraise(*exc_info)
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/utils/sixcerpt.py", line 34, in reraise
    raise value
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/backend/__init__.py", line 27, in <module>
    _ns = select_backend(first)
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/backend/select.py", line 26, in select_backend
    mod = __import__(name, fromlist=public_api)
  File "/home/***/anaconda3/lib/python3.6/site-packages/zmq/backend/cython/__init__.py", line 6, in <module>
    from . import (constants, error, message, context,
ImportError: libsodium.so.23: cannot open shared object file: No such file or director

結局、libsodiumというモジュールがcondaに入っていない、または更新されていないのが問題だったようです。https://github.com/conda/conda/issues/7509

conda install -c conda-forge libsodium
とやると、このエラーは解決しました。


notebookは起動するようになっても、ipynbを開くと
500 : Internal Server Error
が出てしまい、、

[E 17:41:50.078 NotebookApp] Uncaught exception GET xxx/xxx.ipynb (127.0.0.1)
    HTTPServerRequest(protocol='http', host='localhost:8888', method='GET', uri='xxx/xxx.ipynb', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Host': 'localhost:8888', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate'

      File "/home/***/anaconda3/lib/python3.6/site-packages/tornado/web.py", line 1467, in _execute
        result = method(*self.path_args, **self.path_kwargs)
      File "/home/***/anaconda3/lib/python3.6/site-packages/tornado/web.py", line 2829, in wrapper
        return method(self, *args, **kwargs)
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/notebook/handlers.py", line 59, in get
        get_custom_frontend_exporters=get_custom_frontend_exporters
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/base/handlers.py", line 463, in render_template
        return template.render(**ns)
      File "/home/***/anaconda3/lib/python3.6/site-packages/jinja2/asyncsupport.py", line 76, in render
        return original_render(self, *args, **kwargs)
      File "/home/***/anaconda3/lib/python3.6/site-packages/jinja2/environment.py", line 1008, in render
        return self.environment.handle_exception(exc_info, True)
      File "/home/***/anaconda3/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
        reraise(exc_type, exc_value, tb)
      File "/home/***/anaconda3/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
        raise value.with_traceback(tb)
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/templates/notebook.html", line 1, in top-level template code
        {% extends "page.html" %}
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/templates/page.html", line 154, in top-level template code
        {% block header %}
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/templates/notebook.html", line 120, in block "header"
        {% for exporter in get_custom_frontend_exporters() %}
      File "/home/***/anaconda3/lib/python3.6/site-packages/notebook/notebook/handlers.py", line 19, in get_custom_frontend_exporters
        from nbconvert.exporters.base import get_export_names, get_exporter
    ModuleNotFoundError: No module named 'nbconvert.exporters.base'
[E 17:41:50.083 NotebookApp] {
      "Host": "localhost:8888",
      "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0",
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
      "Accept-Language": "en-US,en;q=0.5",
      "Accept-Encoding": "gzip, deflate",
      "Referer": "http://localhost:8888/tree/anaconda3/_python/2ch",
      "Connection": "keep-alive",
      "Upgrade-Insecure-Requests": "1"
    }

 from nbconvert.exporters.base import get_export_names, get_exporter
    ModuleNotFoundError: No module named 'nbconvert.exporters.base'
らへんからnbconvertが問題だということが分かり、

conda upgrade nbconvert

で同時にいろいろインストールされて解決しました。html周りのアップデートなんでしょうか。

ちなみに、Jupyterを長い間アップデートしていなかったのですが、ファイル選択画面で最終更新時間とサイズが追加されていて、使いやすくなりました。

GUオンラインで端数が割り引かれる

ジーユーで買い物をすると、「奉仕額」という項目があり、2473円の3円が引かれていました。端数を切るって居酒屋とかでは見かけますが、珍しい割引ですね〜という気がしてしまったのでメモ。




2018年9月8日土曜日

GoogleがGmailの中身を読んでいる件

グーグルはGmailの中身を読んでいるのか、という話題は海外でもあって、児童ポルノの画像を添付したら逮捕されたり、自分の孫の裸の写真を添付しても逮捕したりされているようです。
https://gigazine.net/news/20140805-google-cyber-tip/

こちらの場合も、『ファイルが添付されていないようです』『メッセージに「添付します」と書かれていますが、ファイルが添付されていません。このまま送信しますか?』という謎のメッセージが現れました。
引用文の中の文字列だったから、自分の意図した本文ではないんですよね。別にいいですけど・・・よく見ているんだな〜。
Gmailの警告メッセージ

2018年9月2日日曜日

日誌 2018年9月

2018/09/01

8月も終わり、今年の3分の2が終わったことになります。いろいろやろうとは思っていますがいまいち手が出せないです・・・分散しているのがよくないんでしょうか。使える時間をどう使うか、というマネジメントをしなければいけません。当面はTOEICですが・・・これも何度か受けることにはなる気がしていますが。

Pythonを使い始めてからずっとJupyter Notebookを愛用してきましたが、最近はvimで直接開いていることもあります。Jupyter Labという後継ソフトに切り替えることも考えないといけませんが・・・。

2018/09/15

先日久しぶりにTOEICを受けたのですが、新テストになって難化したように思います。自分が年を取って集中力が低下したのもあるのでしょうけど・・・。

2018/09/15

DELLのモニタがAmazonでやたらと安くなっています・・・。SE2416H 23.8インチが14,456円の4,500円引きクーポン・・・実質1万円を切るということです。今はBENQの24インチを使っていますが、もう少し大きいものが欲しいな〜というのと、モニタ2枚あった方がよいのかな、という考えもよぎっています。32インチを買って今の24インチを縦付けにすると良いのかな、とも思いますが、所詮モニタ上に沢山並べても意味ないな、と。

2018/09/19

DELLのモニタが安い件、まだ迷っていたりします。どうやら23.8インチで1万円というのはちょくちょくあるみたいです。DELL祭りとかそういう時期なのでしょう。モニタが増えるメリット
1. たまに今のシングルモニタでは狭いときがある。ターミナルを複数開いているときとか。チャット画面が開いているときも狭くなりますね。
2.モニタが壊れたときの冗長化として。
デメリット
1. 予算の問題--> 1万円ならお得では?
2. 邪魔-->これは仕方がない

安売り期間もそろそろ終わりそうなので、さっさと買おうかと思います。


2018/09/21

DELLモニタ買いました。時間指定ができないと困るのでこの瞬間だけAmazonプライムに登録してみたりしました。すぐに解約しても1ヶ月は使えるので、忘れることはありません。

PhantomJSの開発が終了していたようです。知らなかった。
https://github.com/ariya/phantomjs/issues/15344


2018/09/22

DELLのモニター届きました(1日で)。HDMIケーブルも買ったのですが、別送してもらって恐縮ですね・・・というか無駄。


2018年9月1日土曜日

TOEICメモ

■英国発音の特徴(?)として感覚的なメモ

with がほとんど発音されないように聞こえる
over  のvがfに聞こえる
schedule はシェジュールに聞こえる
four はフル(full)と同じように聞こえる
are we, at the でアの音は聞き取れないほど

■hatはcapを含む?

昔、capとhatを区別するような習い方をしたようだが、TOEIC公式問題によると、そうではない模様。

ubuntu historyコマンドで追加設定

historyコマンドで下記設定

・複数のターミナルで履歴を共有。
・同じコマンドの履歴は削除

~/.bashrc に下記を追記。
# share history in multipule terminals
export PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
shopt -u histappend
# history: erase same command
export HISTCONTROL=erasedups
.bashrcを再読み込みして反映するには
source ~/.bashrc
参考
http://yuzugosho.blog.fc2.com/blog-entry-8.html
http://www.itmedia.co.jp/help/tips/linux/l0450.html

追記: 同じコマンド履歴削除が反映されなくなりました