2018年12月29日土曜日

numpy, pandasが使えなくなって入れ直した話

(windows7, py35 32bit)

32bitのpython35を入れたvenvでいろいろいじっていたとき、numpyがおかしくなりました。

numpyがimportできなくなり、import multiarray Errorが出る。
git clearnをやってみるように、と表示が出ています。

対策:
numpyのバージョンが古かったのが原因?アップグレードしたら直りました。
同時に使っているmklなども同時にアップグレードされ、直りました。

さらにpandasがおかしい


pandasがインポートできなくなりました

ImportError: C extension: No module named 'pandas._libs.tslib' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.

pnadas.__libs.tslib がないようです。

conda install -c anaconda pandas

とやってチャンネルをanacondaにしました。他のqt, freetype, zlib- などもそのときconda-forgeからanacondaで入れなおしているようでした。

・・・

envs\...\site-packages\pandas\_libs

にある tslib.cp35-win_amd64.pyd

を使っているようでしたが、amd64は32bitではNGです。これで64bitを入れていたのが問題だったと分かりました。

condaでwin32のbuildバージョンを調べて、

conda install pandas=0.23.4=py35XXXXX

とやってみましたが、_libsディレクトリの中身がamd64で使えませんでした。

結局、whlファイルを直接ダウンロードしました。
Unofficial Windows Binaries for Python Extension Packages
https://www.lfd.uci.edu/~gohlke/pythonlibs/
からwhlを落としてきて、whlファイルのあるディレクトリで
pip install pandas-0.23.4-c35-cp35m-win32.whl

とやってインストールできました。確認するには

venv\...\site-packages\pandas\_libs



tslib.cp35-win32.pyd

が入っていればOKです。

Juptyerをvenvで入れてエラーが出たので直した

Windows7, Python3.5

インストールしていないのにjupyterが起動する

venvでpy3.5 32bitの環境を作ってactivate
→jupyter notebookを入力すると起動してしまう
→別の環境でインストールしたものが起動している

set PATH .... \envs\py35;%PATH%
export PYTHONPATH="C:\.....\envs\py35"


Jupyter入れなおしでzmqのエラーが出る

pip uninstall pyzmq
pip install pyzmq
と入れなおしたら直った。
https://github.com/jupyter/notebook/issues/3435

Jupyterは立ち上がるがInternalError500が出る

jupyterのnbextensions, configuratorが入っていないようなので入れる

conda install -c conda-forge jupyter_nbextensions_configurator
conda install -c conda-forge jupyter_contrib_nbextensions
conda install psutil

venv環境でjupyterが起動しなくなる


症状:
起動はするが、notebookを実行するとカーネルが止まる

調べて分かったこと:
baseがpy3.6で、venvがpy3.5だとする。
venvに入るとコマンドプロンプトではpy3.5が起動するが、jupyterでは3.6が起動している
これが問題だったので直す

ipykernelを入れなおす(ただし、venv毎にやる必要がある?)

python -m ipykernel install --user

https://github.com/ipython/ipython/issues/10346

jupyterのconfigで共通のものを使っているのが問題かもしれません。

2018年12月25日火曜日

matplotlib の[Errno 13] Permission deniedエラー対処

matplotlibを使っているときに

[Errno 13] Permission denied
...
/.matplotlib/fontList.cache

というエラーが出ることがあります。

このときは、このfontListキャッシュを削除すればOKです。

.matplotlib ディレクトリを探しましょう。

2018年12月23日日曜日

historyコマンド履歴で何を使ったかPythonで調べる

ubuntu Linuxのhistoryコマンドで、直近1000回のコマンド履歴が見れます。ファイルに出力して、Pythonでカウントしてみました。

historyをlogファイルに出力

$ history > hist.log

カレントディレクトリにhist.logというファイルができてhistryの中身が書き込まれています。

$ python

でPythonに入ります。

import re
import collections
li = []
f = open('hist.log')
for i in f.readlines():
    li.append(re.split('\s+', i)[2])
c = collections.Counter(li)
c.most_common()

hisotryの行の中身は
(スペース)行数(スペース)コマンド(スペース)・・・

となっているので、re.splitでリストにして[2]がコマンドになります。

c.most_common()


[('cd', 103), ('ps', 97), ('find', 93), ('gvim', 80), ('ls', 76), ('sudo', 46), ('python', 27), ('nohup', 27), ('locate', 20),......

というように、コマンドと何回使ったかが分かります。

sudo はその次を見たほうがいいかもしれませんね。
>

2018年12月22日土曜日

anacondaをバックアップする前に容量を確認した

バックアップを取る前に少しanacondaをスリムにしてみる

容量軽減のため、conda clean をします。

まず、dry runでどれくらい削除することになるのか調べます。

$ conda clean --all --dry-run

....いろいろでできて、213MB空きますよ、と表示されました。ということで本番。

$ conda clean --all --yes

y/nを聞かれるので何度もyを押さないといけません。--yesをつけると全てyesということで飛ばします。

その後anacondaディレクトリの容量を見てみると、700MBくらい減りました。

anaconda で何の容量が大きいかを調べる

$ du -h -d2 ./anaconda3/ | sort -hr
-h : human readable
-d2 : ディレクトリを2階層 recursive
./anaconda3/ : ディレクトリ名
| sort -hr : human readableでソートする(h)、降順/逆順にする(r)

結果は・・・

3.6G ./anaconda3/ # 全体
2.2G ./anaconda3/pkgs # パッケージで2.2GB
459M ./anaconda3/pkgs/mkl-2017.0.1-0
167M ./anaconda3/pkgs/qt-5.6.2-3
157M ./anaconda3/lib
153M ./anaconda3/share
125M ./anaconda3/pkgs/scipy-0.18.1-np111py36_1
121M ./anaconda3/pkgs/pandoc-2.2.3.2-0
77M ./anaconda3/pkgs/pandas-0.19.2-np111py36_1
74M ./anaconda3/share/OpenCV
74M ./anaconda3/pkgs/opencv3-3.1.0-py36_0
74M ./anaconda3/lib/python3.6
67M ./anaconda3/pkgs/python-3.6.6-hc3d631a_0
65M ./anaconda3/pkgs/phantomjs-2.1.1-0
62M ./anaconda3/pkgs/scikit-image-0.12.3-np111py36_1
43M ./anaconda3/pkgs/django-2.0.5-py36hd476221_0
42M ./anaconda3/pkgs/scikit-learn-0.18.1-np111py36_1
40M ./anaconda3/pkgs/astropy-1.3-np111py36_0
36M ./anaconda3/pkgs/notebook-5.6.0-py36_0
35M ./anaconda3/pkgs/icu-54.1-0
33M ./anaconda3/pkgs/sympy-1.0-py36_0
33M ./anaconda3/pkgs/matplotlib-2.0.0-np111py36_0

ということでパッケージは重いので、使っていないものは削除したいですね。

Python Flask, bokehでレスポンシブなグラフをWebページに描く★

このページの焼き直しです。

Ubuntu


venvでやれば特に問題なく元のコードで全て再現できました

■いつものFlaskと違うところ
最初にページを開くとき、127.0.0.1:5000 ではエラーになるので
http://127.0.0.1:5000/100/
など、数字を付け足さないといけません。付け足す数字がバーの数になっています。



(後で更新する)

Windows

バージョンを合わせずにやったので少し修正が必要でした。

■bokeh.chart不要

ModuleNotFoundError: No module named 'bokeh.charts'
とエラーが出ますが、bokeh.chartsはdeeprecatedです。
Barは使っていないのでコメントアウトしました。
# from bokeh.charts import Bar


■X軸の値のエラー
ValueError: expected an element of either Seq(String), Seq(Tuple(String,
String)) or Seq(Tuple(String, String, String)), got [1]

というエラーが出ました。これはよくわからなくて、整数ではなくてStringを渡せということのようです。dataにappendするintをstr(int)の形にしたらできました。
■レスポンシブの設定
plot = figure(... の中で、 AttributeError: unexpected attribute 'responsive' to Figure,  というのが出てきたので、responsive=True は消しました。代わりに、 sizing_mode='scale_width' を入れました。
https://github.com/bokeh/bokeh/issues/4620

■htmlは表示されるが、Bokeh Error JSON object has wrong type stringというエラーが出る
chart.htmlのscriptの部分でsrcのbokehのバージョンが合っていませんでした。
    <script src="http://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.js">
の数字を自分の入れたバージョンに合わせたらOKでした。

■hoverのX軸が小数点以下の値も表示されてしまうので、整数にする。
<span class="hover-tooltip">$x</span>

の$xに{0}を追加して
<span class="hover-tooltip">$x{0}</span>

としたらOK

Powershellメモ

こちらの説明がとてもわかり易かったです。
http://suyamasoft.blue.coocan.jp/PowerShell/Tutorial/index.html

この解説が初心者に優しいです。
http://www.atmarkit.co.jp/ait/articles/0708/30/news137_4.html



★Powershell上では、大文字小文字は気にしなくて良い
全く気にしなくてよいようです

★コマンドはパイプ | でつなぐ

★コマンドを確認する
Get-Command

★lsはgci get-childitem

★コマンドのエイリアス(短縮形)がたくさんある
get-childitem は gci でもよいし、lsでもよい

エイリアスを上手に混ぜて打つことが大事
-Exclude --> -ex とか。Tabを打つと候補がでるので関係ないかもしれませんが。

■power shell からカレントディレクトリを開く invoke-items --> ii でできます。
ii .

■PowerShellではcondaのvenvが使えない
condaは使えますが、condaからvenvが使えませんでした。バグだそうです
これはけっこう面倒ですが、なんともできませんでした。

★CHT20* を含む(-include)ファイル探す。再帰的に(-recurse)。
get-childitem  -include "CTH20*" -recurse

*はワイルドカードです。-recurseは-recでも可能です。

■ディレクトリにあるサブディレクトリだけを探す。回帰的-recurce、*でワイルドカード
Get-ChildItem -Recurse * | ? { $_.PSIsContainer }

■Powershellの画面で範囲指定を左マウスドラッグでできるが、矩形になってしまうのが困っています。行の最後までドラッグしてほしいのですが。。→PowershellISEを使えば解決しました。

★エラーがあっても無視して続ける
gci -ErrorAction "SilentlyContinue"


■Length(ファイルサイズ)が10kb以下(-le)のものを出力

Get-ChildItem | Where-Object{$_.Length -le 10kB}

Where-Object{} 条件にあったものだけ出力
$_. whereへ渡す値
Length -le 10kB

■結果をソートするにはパイプで、

| Sort-Object Length

とか。 [-Property] Length とかなので、-Propertyは省略可能

■Powershellバージョンを知りたいとき
$PSVersionTable

■ディレクトリだけを再帰的に見つけたい
dir -Recurse | ?{$_.PSIsContainer}

ファイルにピリオドが入っているならば
dir -ex *.*
(dir -Exclude *.* )
でできる。

■ディレクトリを再帰的に探して、フルネームを出す
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

Select-Object FullName で対象の中でFullNameだけ抽出する

■CSVで保存する

gci . *.* -rec | where { ! $_.PSIsContainer } | where-object {$_.Length -gt 100kb}| Export-Csv -Path "data.csv"

get-child-item -recursive | ファイルだけ(! で否定。ディレクトリでないもの) | ファイルサイズが100kbより大きいものだけ | data.csvというパスでエクスポートする 

エンコーディングを指定するとき
Export-Csv -Encoding utf8 "data.csv"


★オブジェクトを名前でmatchして、CSV出力
gci -rec |? {$_.Name -match "\d\."} | Select-Object -Property Name, Length, Directory | Export-Csv -Encoding utf8 C:\Users\...data4.csv

★名前をワイルドカードで選択。r or v + 数字0文字以上+.
? {$_.Name -match "[rv]\d*\."}


gci . -rec | ? {$_.Name -match "[rv]\d+\."}| Select-Object -Property Name , Length, Directory | Export-Csv -Encoding utf8 C:\....\data5.csv

分割すると

gci . -rec
今のディレクトリ(.)で、再帰的(-rec)に中身を見る(get-childitem )

| ? {$_.Name -match "[rv]\d+\."}

出てきたファイルの名前($_.Name) について、 rまたはv+1文字以上の数字+ピリオドにマッチするか調べる。

| Select-Object -Property Name , Length, Directory
| Export-Csv -Encoding utf8 C:\....\data5.csv

■ディレクトリ中のファイルサイズの合計
(Get-ChildItem -Recurse -Force | Measure-Object -Sum Length).Sum

gci -rec -ErrorAction "SilentlyContinue"| ?{ $_.PSIsContainer } | ? {$_.Name -match ".*old.*"} |Select-Object -Property Name, FullName, LastWriteTime |Export-Csv -Encoding utf8 C:\...\old_name.csv


★検索結果をオブジェクトにして嵌った

$items = ( gci -rec| ?{ $_.PSIsContainer } | ? {$_.Name -match "^(?!.*folder)"}|? {$_.Name -match ".*old.*"}) |Select-Object

とかにするとき、その結果を
foreach ($i in $items)
{
$i.Substring()

とかやろうとすると全然動かなくなった。

[System.IO.DirectoryInfo] に 'substring' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
Fullnameとかも同様

・・・Select-Object をやめて、$i.Fullname とするとOKだった。()なしです。

★文字列に日本語を入れると文字化けしてエラーになる件

test.ps1

$a = 'テストです'

とかにすると、powershell上ではps1 が文字化けして動作しなくなる。
utf8のBOM付きにできていないからのようです。PowerShellIDEを使うと、自動でBOM付きになるらしく?使えた。

★時刻を表示する

Get-Date
(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")


★Powershellのディレクトリの中で、5MB以上のファイルを抽出して、Name, Length, Directory, LastWriteTimeをcsvに出力

'start: ' + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")

gci . -rec -ErrorAction "SilentlyContinue"|`
where-object {$_.Length -gt 5000kb}|`
Select-Object -Property Name , Length, Directory, LastWritetime |`
Export-Csv -Encoding utf8 C:\....\filename.csv

'end: ' + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") 

openpyxlで数字からエクセルの列名アルファベットを作る

エクセルでは1列目がA列、2列目がB列、・・、27列目がAA列、・・・となりますが、これを自動でやってくれるPythonモジュールです。

>>> from openpyxl import utils
>>> utils.cell.get_column_letter(1)
'A'
>>> utils.cell.get_column_letter(2)
'B'
>>> utils.cell.get_column_letter(27)
'AA'
>>> utils.cell.get_column_letter(1000)
'ALL'

1000番目がALLって少しおもしろいですね。
その逆の操作が(A→1)できるモジュールというのは無いようです。

2018年12月21日金曜日

ヨドバシドッドコムの返品対応してもらった

ヨドバシカメラの通販でマウスを買ったら、静音だと思ったら違うかった、という勘違いがありました・・・ので返品返金してもらいました。

11/10に購入、11/11に受け取り。間違ったことに気がついてその日(11/11)の夜にメールで連絡しました。

メールを送った日の深夜(11/12)に返信があり、伝票に必要事項を書いて返送してね、とのこと。
発送が11/13、到着連絡が11/16、返金処理が11/17でした。思った以上に早い!

クレジットカード明細には、このように表示されていました。(余談:リボ払いになっているのはそちらの方がカード年会費が安いからで毎月一括払いしています念のため)


返品の連絡について


ヨドバシドッドコムのページには
『(返品)ご要望のお客様は、必ず、事前にヨドバシ・ドット・コムお問い合わせ窓口まで、ご連絡をお願いいたします。』

と書いてあります。メールの場合は何を書けばいいのか分からないのですが・・・
注文番号:XXXXXXXX 返品理由:間違って注文したため 商品状態:未開封
を書いてみたら特に追加情報はなくてもOKでした。

自分が間違えて買ったので、普通に返品してもらえてよかったです。

Pythonでインポートしたモジュールのファイルのパスを知りたい

Pythonモジュールも実は.pyファイルなのですが、どこにあるのか?と思ったときに調べる方法です。

例えばreモジュールで調べてみます。

>>>import re
>>> print(re.__file__)
/home/.../anaconda3/lib/python3.6/re.py

ということで、__file__メソッドを使えばできます。

2018年12月20日木曜日

Pythonのコーディング規約pycodestyle

PEP8というPythonコーディングスタイルがあります。それに合っているか確認するpep8というモジュールがあったようですが、pycodestyleに変更になっています(モジュール名が変わっただけで、中身は以前のpep8と変わっていないそうです)。

anacondaでPythonを入れたら一緒に入っていました。

pycodestyle使い方


$ pycodestyle XXX.py
でXXX.pyを調べます。※指摘だけで、直してくれません

出力される行数が実際のコードと合っていないときがあります。コメントアウトを抜いていたりするようです。

オプション --first 同種のコーディング規約違反であれば1回目だけを表示


よく指摘されるもの(自分メモ)


行末にwhitespaceがある
W291 trailing whitespace

空行にスペースが入っている
W293 blank line contains whitespace
(・・・これはVIMの自動インデントでなってしまいます)

この2つ(W291, W293)をVIMで消すコマンド
# スペースが1つ以上末尾にあったら消す
%s/\s\{1,\}$//gc


defブロックの前後は2行あける。上にコメント#があるときはその上を2行あける

E303 too many blank lines (4)
行をあけすぎている(4)は4行空いてますという意味。

E303 too many blank lines (2)
class の中のdefは1行あけるだけで良い

行末にコメントを入れるときは、スペースを2つのあとに  #コメント。
E261 at least two spaces before inline comment
スペースを1つにしてしまいがち。

一行が長い
E501 (^) line too long (82 > 79 characters)
79文字を超えて82文字になっていますよ、という意味。制限値は変更できます。

インデントが揃っていない
E128 (^) continuation line under-indented for visual indent

たとえば
(ABC
 DEF
...
というときに、AとDが揃うこと

E124 (^) closing bracket does not match visual indentation

(ABC
 )

閉じ括弧でおわるときに、Aと)が揃うこと


コンマのあと、コロンのあとにスペースがない
cron_scraping_facewest_climbing_sale.py:96:28: E231 missing whitespace after ','
cron_scraping_facewest_climbing_sale.py:114:20: E231 missing whitespace after ':'


最終行に無駄な空白行がある
cron_scraping_facewest_climbing_sale.py:121:1: W391 blank line at end of file

Wordで参考文献番号[1][2]...をリストで作って文中にリンクさせる

Windows, Word2013

Latexのように自動で番号をふるのは難しいようです。

段落番号でリストを作る


[1] あああ
[2] いいい

というようなリストを作ります。文字の形式を[]と設定しています。


[1]を文章部分に入れる

「あああ」の部分をドラッグしてから「挿入」→「リンク」→「ブックマーク」。ブックマーク名を適当に決めて入力(aaaとか。数字でははじめられません)、決定ボタンを押す。
※タブを開いた直後にエンターを押してしまうと、確認なしに上書きされてしまうので注意。

番号を入れたい場所にカーソルを合わせてから、挿入→相互参照。「参照する項目」はブックマーク、相互参照の文字列は「段落番号(内容を含まない)」にして、先程保存したブックマークの参照先を選ぶ→挿入ボタンを押す。

--
これで番号が出るはずです。けっこう大変です・・・。

・番号の入れ替えは手動で行います。
リストの順番を入れ替えて番号を入れ替えます(ここは自動で変わる)。
「フィールドの更新」をして変更。

2018年12月19日水曜日

Pythonの__enter__、__exit__、__call__などのアンダースコア2つの使い方

アンダースコア2つのものはクラス属性を表しています。

基本的なことかもしれませんが、知らなかったので

__enter__、__exit__はwithに入ったとき、抜けるときに自動的にやることを記述できる



__call__は関数やクラスが呼び出されたときに自動でやることを記述できる


class A:
    def __init__(self):
        pass
    def __call__(self, a):
        print("A called")

とすると。

A(a)

とするとコールされたので

A called

とプリントされます。


__future__はPython2,3の互換性のためにある

おまじない的に。標準モジュールを絶対パス?でインポートする
from __future__ import absolute_import

__class__はクラスタイプを知るために使う

>>> a = 1
>>> a.__class__
<class 'int'>
>>>import re
>>>re.__class__
<class 'module'>

ということで、クラスの型を出力してくれます。__type__ではないのが少し不思議ですが、そういうものなのでしょう。

2018年12月18日火曜日

isortでPythonモジュールをPEP順に並べる

PEP8で決められているPythonモジュールを書く順番

import文 は次の順番でグループ化する。
  1. 標準ライブラリ
  2. サードパーティに関連するもの
  3. ローカルな アプリケーション/ライブラリ に特有のもの

isortはPythonモジュールをPEP8の名前順に整理してくれる


インストール


conda install isort か pip install isort で


使い方メモ

$ isort

と入力すると、そのディレクトリにあるpyファイル全てに対してチェックしてくれます。+と-となる部分が表示されるので、y/n/qを入力します。
$ isort <file.py>
とすると、file.pyに対して実行。

変更部分を確認したい場合は、
$ isort -df[-diff]
--

Jupyterで最後に確認する


jupyterでコードを書いているとき、順番を丁寧に並べるのが面倒なので、あとでまとめて直しています。import部分だけ切り出して適当なfile.pyに保存してisortで整理、jupyterに戻します。

ドラッグ部分をisortという機能はないと思われます。

日誌2018年12月

2018/12/18

明らかにさぼってしまいました。継続は力になっていません。

pyqtを使っていて、nttdll.dllが原因でpython.exeが止まりました。調べてみると、windows updateをすると解決するということでしたが・・・できなかったのでpyqtを再インストールしました。

--
profilerで、psutil.NoSuchProcessエラーが出るときは、2回目をやると通ります。

--
debug途中で値が消える話。
memory_profilerのデバッグをしていて、途中でWARNINGが出ました。デバッグ中にsys.settrace()を使うとダメなようです。

https://github.com/HypothesisWorks/hypothesis/issues/985

PYDEV DEBUGGER WARNING:
sys.settrace() should not be used when the debugger is being used.
This may cause the debugger to stop working correctly.
If this is needed, please check:
http://pydev.blogspot.com/2007/06/why-cant-pydev-debugger-work-with.html
to see how to restore the debug tracing back correctly.
2018/12/20

bloggerの記述で、途中で<pre>に入ったときに戻れないのですが、どうしたらよいんでしょうか。htmlモードに入って移るしかないでしょうか。

リアルフォースキーボードを使い始めて、なかなか良いなぁと思っています。これで効率が上がっていろいろ捗ると良いのですが・・・


2018/12/22
自宅PCのバックアップを適当にとっているのですが、1ヶ月に1回とかで決めた方がよいんでしょうね・・・。おおむね8.5GBくらいでそのうちanacondaが4.3GB、VirtualBOXが2.7GBでした。

こちらに書きました↓
バックアップを取る前に少しanacondaをスリムにしてみる


・・・ということで、Pythonのライブラリは特にバックアップとらなくてよいのでは、と思いました。むしろ、ディレクトリを最初から分けるようにすべきでしたね。

2018/12/25
会社でOSSの管理をしっかりやりたい、という風潮が出てきているようです。しかし入っているソフトのバージョンを管理するとか、どこまで詳しくやれば良いのかな、と思っている次第であります。

右手に謎のしびれが出てきています。腱鞘炎の一種なのか、マウスの親指クリックが原因なのか、不明なのですが・・・経過観察が必要でしょうか。

Googleの音声入力でメモを取ることを試してみると、けっこうできました。しかし、間違ったときの訂正や、特に変換ミスのやり直しを要求できないのが不便だな、と思います。

2018/12/28
bloggerの設定で、例えばグーグル検索で表示されたときに「ブログ名+記事タイトル」となってしまうのを変えました。テンプレートを変えたのですが、果たしてうまくいくでしょうか。
https://p--q.blogspot.com/2013/05/1_9.html

2018/12/29
右手が謎のしびれに苛まれているので(変な表現)、左手でマウスを握ることにしました。これで改善するなら、マウスのせいなんでしょう。糖尿病とかじゃなければいいけど・・・。

2018/12/30
フリマアプリのラクマでアンケートがあったのですが、それはインタビューをしたいので事前スクリーニングのようでした。Googleのフォームを使っている模様。けっこうGoogleフォームを使っているのを見るようになってきたような・・・。


Python3にstemmingをインストールしたらPy2になってしまった件

これは失敗談です


英語の語幹を調べるため、Windows7でstemmingを入れようとしたらうまくできず・・・

conda install -c nailik stemming

で入ったものの、同時にPython2.7になってしまった。

condaで戻そうとするが・・・


3.6と2.7でdependencyの関係で戻せなくなった。enumがどちらでも使っている?から。

最終的にはanacondaを入れ直した。

2018年12月15日土曜日

東プレR2TLSA-JP3-BKリアルフォースの感想

東プレのキーボードを買いました。

買ったもの


メインのubuntu用。特に問題なく使えています。

買ったのはR2TLSA-JP3-BK、テンキーレス静音APC30g昇華印刷ブラックです。買った理由
・テンキー・・・いらないし、マウスが近い方がよい
・静音・・・大事。とはいえ無音ではなく「カチャカチャ音がしない」というものです。
・APC・・・使うか不明ですけどなんとなく→結果として全然使っていません。
・30g押し・・・軽い方がよいかなと→軽すぎるかも?
・昇華印刷ブラック・・・好みの問題です

ECカレントのヤフーショッピングで23000円、ポイント2000くらいで実質2.1万円。

開封の儀


届いた箱。けっこう深さがあります。

中の箱も高級感あります。

白い梱包材を取った所。


予備のキー?とキーを外す器具、押し込み深さを変えるプレート。謎のダンボール枠もついています。



置いたらこんな感じになりました。

感想


・「ああああああああああ」って打ってしまう。
30グラムに慣れていないからでしょうか。左手小指をAの位置に置く癖があるのか、「ああああ」が反応してしまうようです。これは自分の癖ですね。

・思ったよりも手首が浮いてしまう。
これまではマイクロソフトのエルゴノミクスを使っていたのですが、そのパームレストに慣れていたからでしょうか。これは何かを用意した方が良さそうです。→手首にタオルを敷いています。

・打ちやすさはグッド
とてもよいと思います。耐久性はこれからテストしていくことになるかと。

・ダメなところ。
スペースキーが横方向に長すぎます。Amazonのレビューとかでも指摘されていますが、スペースキーの右側が長すぎて、変換キーが通常のキーボードより1キーくらい右にあります。これは最悪。自分は変換キーをエンターにして使っていたのですが、これが非常に使いにくいです。慣れれば大丈夫な気がしますが。→全然慣れないのでボタン配置を変更しました。

・APC機能、スペーサー機能。
(買って1ヶ月くらいして記入)正直使っていません。不要な機能だったかも?押し込み量を変更するほどかな、と思い始めました。デフォルトで充分という意見もあるので、あまりいじならないでよいのかと。

・2台目を買うか
職場用と自宅用に2台買うか、少し迷っています。とても使いやすいのは間違いないのですが、スペースキーが・・・。

2018年12月2日日曜日

flaskでhello worldからの続き①htmlファイルを表示する

hello worldからチュートリアルのミニブログまでが少し飛んでいる気がするので、勉強がてらまとめています。

hello.pyでreturn 'Hello World'を出したあとからスタートして、少しずつ変えて行きます。

最終的に作るサイト

『WEBページ上のフォームに数字を入力して送信すると、データベースに格納される』

FlaskでHTMLファイルを表示する

まず、index.htmlを表示するだけ、という簡単なサイトを作ります。ファイル構成はこうです。

simple
├── hello.py
├── instance
│   └── simple.sqlite
├── schema.sql
└── templates
    └── index.html

flaskでは、render_templateモジュールをインポートするとテンプレートを入れることができます。テンプレートとなるindex.htmlはhello.pyと同じ階層にtemplatesディレクトリを作ってその中に入れます。

hello.py
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def hello():
    return render_template('index.html')
 index.html
<!doctype html>
<title>index.html test</title>
<body>
this is test
</body>

  $ export FLASK_APP=hello.py
  $ flask run

で127.0.0.1:5000にアクセスすると、index.htmlが表示されることが確認できます。



FlaskでSQLiteに接続する

データベースはSQLiteを使います。チュートリアルではinit_dbというコマンドを使っていますが、今回は直接作ります。

先にテキストスキーマでテーブルの型を作ります。テーブルの列名は、通し番号のid、タイムスタンプ、入力値です。

schema.sql
DROP TABLE IF EXISTS post;
CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  value INTEGER NOT NULL
);
これを使ってinscanceディレクトリにsimple.sqliteというデータベースファイルを作ります。

$ sqlite3 instance/simple.sqlite < schema.sql



instanceのパス

instanceはdbファイルを入れるディレクトリです。

hello.pyの中では、

app = Flask(__name__, instance_relative_config=True)
とすると相対パス設定ができます。このときの app.instance_path のデフォルトがどこかというと
/home/user/anaconda3/var/hello-instance/
となっていました。

今回はシンプルにしたいので、simpleの直下にinstanceがあります。この設定は手動でできて、hello.pyの中で

相対パスにするとValueError: If an instance path is provided it must be absolute. A relative path was given instead. というエラーが出て、絶対パスにしなさいということです。

app = Flask(__name__, instance_path='/home/../../simple/instance')
とします。この部分は各自変える必要があります。


表示するindex.html

html画面を編集します。


<!doctype html>
<title>index.html test</title>
<body>
  <form method="post">
    <label for="value">Enter int</label>
    <input name="value" id="value" required>
    <input type="submit" value="Submit">
  </form>
</body>
hello.pyにdbアクセスの部分を追加します。チュートリアルからコードを流用しながら変えていきます。
import os
import sqlite3
from flask import Blueprint, Flask, current_app, g, render_template, request
app = Flask(__name__, instance_path='/home/../../simple/instance')
app.config.from_mapping(
    DATABASE=os.path.join(app.instance_path, 'simple.sqlite')
    )

def get_db():
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        g.db.row_factory = sqlite3.Row
    return g.db

def RepresentsInt(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

@app.route('/', methods=('GET', 'POST'))
def hello():
    if request.method == 'POST':
        enter_value = request.form['value']
        if RepresentsInt(enter_value):
            db = get_db()
            db.execute(
                      'INSERT INTO post (value) VALUES (?)', (enter_value,)
                      )
            db.commit()
    return render_template('index.html')

get_db()関数: Flaskのgモジュールを使ってDBとアクセスします
RepresentsInt()関数:入力値が整数であればTrue、そうでなければFalseを返します

RepresentIntがTrueのときだけ入力されますが、エラーのときはデータベースには書き込まれません。

SQLの結果を確認する

書き込まれた内容と確認するには、simpleディレクトリ上で
$ sqlite3 instance/simple.sqlite
sqlite> select * from post;
とすればOKです。
---

TODO:
flash()でerrorを入れる
db.close()を消したの使う

2018年11月28日水曜日

Pythonanywhereでタイムゾーンを変更★

コンソール上で変更します。
00:38 ~ $ date
Wed Nov 28 00:38:31 UTC 2018
00:38 ~ $ export TZ='Asia/Tokyo'
09:38 ~ $ date
Wed Nov 28 09:38:54 JST 2018
09:38 ~ $ 
errorlogでの時刻は変更されていません。何故でしょう・・・?

2018年11月27日火曜日

seleniumでMessage: newSessionというエラーが出るので直す

webdriver.Firefoxを使っていたら

WebDriverException: Message: newSession

というエラーが出て停止しました。少し放置していたのでgeckodriverがバージョンアップしているということでした。

https://stackoverflow.com/questions/46439714/selenium-common-exceptions-webdriverexception-message-session-not-created-exce


最新のgeckodriverをダウンロードして、

$ sudo mv geckodriver /usr/local/bin

で/usr/local/binに移動させると復活しました。


(ubuntu16.04, Python)


ハイパフォーマンスPython(オライリー)を読んだ

オライリー本をEbookで買って読み始めました。なかなか良いですね。あまり理解できていないのですが、写経しながら読み進めています。

コードの誤り、誤訳が多い気がするのですが。相川愛三さんという訳者は他の本(Pythonにやらせよう)では素晴らしい訳だったので期待していたのですが。結局のところ、校正などの力の入れようなんでしょうか。英語自体が難しい旨がブログには書かれていますが。

---

読み終えました。ちょうど勉強していた内容で、ためになった気がします。途中のコードは少しずつ端折ってしまいましたが・・・。

2018年11月17日土曜日

メルカリでヤマト誤配があって補償してもらった

メルカリで購入して、「配達済み」になっているものの手元に届かず。

ヤマトに連絡すると、メルカリに連絡するように言われる。

メルカリに連絡して調査してもらう。

(10日くらい待つ)

メルカリから「誤配と分かりました補償します」との連絡(出品者も購入者もどちらも補償)。メルカリからのキャンセル文を引用すると・・・

商品の誤配をおこなっており、誤配先へ回収に伺うも不在が続き、お荷物の回収が出来ておりません。
商品のお届けができず誠に恐れ入りますが、本件は事務局で補償いたします。
取引キャンセルを行い、本来取引完了時に反映される販売利益を出品者の売上へ反映いたしました。

ということでした。

ヤマトで誤配になったのは初めてですが、無事対応していただけました。マンションの別の部屋のポストに入っていて入れなおしてくれるかな〜とか少し期待していたのですが。


2018年11月16日金曜日

Pandasのitertuplesを使ってデータフレームから行の値を取り出す

dataframeの行の中身をイテレートして取り出すときにitertuplesが使えます。
import pandas as pd
df = pd.DataFrame({'col1':[1, 2], 'col2':[0.1, 0.2]}, index=['a', 'b'])
col1 col2
a 1 0.1
b 2 0.2
for row in df:
    print(row)
col1
col2
for row in df.itertuples():
    print(row)
Pandas(Index='a', col1=1, col2=0.10000000000000001)
Pandas(Index='b', col1=2, col2=0.20000000000000001)

これで行が別々にデータフレームとして出力されています。次にnameパラメータを入れてみます。

for row in df.itertuples(name=None):
    print(row)

('a', 1, 0.10000000000000001, nan)
('b', 2, 0.20000000000000001, nan)

name Noneにすることで、indexと値のタプルになっています。更にindexパラメータを入れます。

for row in df.itertuples(index=False, name=None):
    print(row)

(1, 0.10000000000000001)
(2, 0.20000000000000001)

index=Falseとすることで、値だけのタプルが出てきました。

2018年11月14日水曜日

Pandasで空白の列を追加する

Pandasデータフレームに新しく空白列を追加したいときがあります。そういうときは、np.nanを追加すればよいです。
import numpy as np
import pandas as pd

まずデータフレームdfを作ります。
df = pd.DataFrame({'col1':[1, 2], 'col2':[0.1, 0.2]}, index=['a', 'b'])

col1 col2
a 1 0.1
b 2 0.2

ここで新しい列を加えて値をnanにします(他の値でも可)。

df['add'] = np.nan

col1 col2 add
a 1 0.1 NaN
b 2 0.2 NaN
列'add'にNaNが追加されました。

2018年11月12日月曜日

Pythonで設定ファイルをiniで読み込む

スクリプトの設定を、別ファイルで管理したいときがあります。そのようなとき、iniファイルを別に作ってpython側で読み込むことができます。


setting.ini というファイルを作ってこの文字列を書き込みます。改行は自由にして大丈夫です。
iniファイルの中では、 
  • # または ; でコメントアウト
  • スペースは自由に使ってよい

[path]
a = 15
b = 20
[test.com]
user = testperson
money = True

[]に囲まれた部分はセクションと呼ばれます。
import configparser
config = configparser.ConfigParser()
config.read('setting.ini')
config.sections()

Out:
['path', 'test.com']
setting.ini の [path]セクションの a の値を呼び出すときは
config['path']['a']

Out:
['15']

とします。

イテレートする

[path]に何が入っているか分からないといは、
for key in config['path']:
    print(key)

とイテレートすることができます。
sectionsをイテレートすることもできます。
for section in config.sections():
    print(section)

ブール値

値は全て文字列になるので、ブール値はgetbooleanを使って読み出します。
config['test.com']['money']

'True' # 文字列
config['test.com'].getboolean('money')

True # Boolean
注意が必要です。

2018年11月10日土曜日

PostgreSQLでAutocomittをONOFFで比較する

Postgres公式ページにも書いてありますが、オートコミットを使うと遅くなります。どれくらいか、というのを調べました。


#!/usr/bin/python
import psycopg2
import sys
conn_string = "host='localhost' dbname='my_database' user='postgres' password = 'postgres'"
print("Connecting to database\n ->%s" % (conn_string))
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
print("Connected!\n")

これで接続したところからスタートします。適当にテーブルを作ります。列名はt0, time, v0, v1としています。テーブルが空の状態から1000回同じデータを入れてみます。

import time
import numpy as np
import pandas as pd
# init, drop if exists
cursor.execute('DROP TABLE IF EXISTS table1')
cursor.execute('CREATE TABLE table1 (t0 text, time timestamptz, v0 integer, v1 integer);')

Autocomitt OFF


conn.autocommit = False
start_time = time.time()
for i in range(1000):
    cursor.execute('''INSERT INTO table1 (t0, time, v0, v1)
                        VALUES (%s, %s, %s, %s)''',
                        ('test', '2017-10-10 09:10:15', 1, 0))
elapsed_time = time.time() - start_time
print("elapsed time: {}".format(elapsed_time) + "[sec]")
conn.commit()
elapsed time: 0.07536649703979492[sec]

Autocomitt ON

conn.autocommit = True
start_time = time.time()
for i in range(1000):
    cursor.execute('''INSERT INTO table1 (t0, time, v0, v1)
                        VALUES (%s, %s, %s, %s)''',
                        ('test', '2017-10-10 09:10:15', 1, 0))
elapsed_time = time.time() - start_time
print("elapsed time: {}".format(elapsed_time) + "[sec]")
elapsed time: 10.754042863845825[sec]

オートコミットON ・・・ 10.8秒
オートコミットOFF・・・  0.075秒

ということで、1000回挿入で10倍ほどの差が出ることが分かりました。

2018年11月9日金曜日

日誌2018年11月

2018/11/09

もう11月。地道にやっていきましょう。最近はCythonとかやろうとしています。あとは趣味のサークル(?)のホームページを管理することに。誰もやらないなら自分がやります、的な引き受け方なんですが、果たして機能するでしょうか?頑張ろう。

2018/11/11

Ubuntuがフリーズして再起動。直前にcompizがエラーを出していたから、それが原因でしょうか。いろいろやることがあるが手につかず・・・。Pythonanywhereでflaskのデプロイをやっていきましょう。flaskの動作がいまいち理解できていないのが原因。

最近、やたらと目が痛いのですが、これは老化による何かなのか、目を酷使し過ぎているのが原因なのか・・。もしかし糖尿病?とか思っているのですが。パソコンで仕事をしているとこんなものでしょうか。

2018/11/18

やりたいことが全然できないのだけど、あまりやりたくない時期なんでしょう、ということで。解らないことを放置しているとあとで困るので、ちょこちょこ解決していきたいところ。テスト駆動開発って難しいな〜。

2018/11/18

マウスを買い換えました。エレコム握りの極み静音Lサイズ無線です。ヨドバシカメラで3102円ナリ。静音だけど音はあって他の静音マウスよりも少し大きいです。カチカチ音じゃなくてグニグニ音ですかね〜。Lサイズで静音ってあまりないので選択の余地なしというのもありますが。握りの極みは持ちやすいかな、と思っています。最近は縦型のマウスが出ているんですね。マウスをずっと握っているならいいのかも。

2018/11/27

オライリーのパーフェクトPythonを読み始めました。EbookだとPDFがゲットできるという・・・。Kindleにもできるとか。やはり紙の本よりパソコンで表示できた方が楽ですね。8時間で100ページくらい読んで、残り200ページ。明日は休みですが、今週中に読みきれたらいいなと。

2018/11/28

放置していたPythonanywhereへのflaskチュートリアルデプロイができました。一行が足りないとかそういうところで解決できないエラーが出るという・・・。




2018年10月30日火曜日

Pythonanywhereにflaskrをデプロイ

Flaskのチュートリアルにflaskrというミニブログアプリの作り方があります。

これをpythonanywhereにデプロイしたのですが、けっこうハマってしまいました。ドキュメントをきちんと読むのが大事ですね。

https://help.pythonanywhere.com/pages/Flask/
デプロイ時のローカルとの違いが書いてあります。

https://www.pythonanywhere.com/forums/topic/12889/
デプロイ時のWSGI設定が書いてあります。

①WSGI... py の設定

sys.path に使いたいpathを追加。

project_home = u'/home/user/flaskr'
if project_home not in sys.path:
    sys.path = [project_home] + sys.path

②create_app()を追加

from flaskr import create_app
application = create_app()  # noqa
を同じWSGI...pyに入れる。

ということが嵌ったポイントでした。

create_appは__init__.pyの中にあります。

import os
from flask import Flask
app = Flask(__name__, instance_relative_config=True)
def create_app(test_config=None):
    """Create and configure an instance of the Flask application."""
    app.config.from_mapping(
        # a default secret that should be overridden by instance config
        SECRET_KEY='dev',
        # store the database in the instance folder
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )
    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.update(test_config)
    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass
    @app.route('/hello')
    def hello():
        return 'Hello, World!'
    # register the database commands
    from flaskr import db
    db.init_app(app)
    # apply the blueprints to the app
    from flaskr import auth, blog
    app.register_blueprint(auth.bp)
    app.register_blueprint(blog.bp)
    # make url_for('index') == url_for('blog.index')
    # in another app, you might define a separate main index here with
    # app.route, while giving the blog blueprint a url_prefix, but for
    # the tutorial the blog will be the main index
    app.add_url_rule('/', endpoint='index')
    return app
if __name__ == '__main__':
    app.run(debug=True)

Staticファイルの変更が反映されないとき

https://help.pythonanywhere.com/pages/DebuggingStaticFiles/
こちらにある通りで、キャッシュを消して再読み込みすると反映されます。ブラウザ側の問題なのに、アプリ側をあちこち調べてしまいました。

2018年10月26日金曜日

MongoDBで「コンピュータによって拒否されたため、接続できませんでした」エラー

初歩的な失敗なのですが、MongoDBで下記エラーが出ているとき、

ServerSelectionTimeoutError: localhost:27017: [WinErrno 10061]対象のコンピューターによって拒否されたため、接続できませんでした。

原因は「mongdが立ち上がっていないから」でした。

ターミナルを2つ使う必要があり、まず片方のターミナルで、

mongod --dbpath c:\MongoDB\Test

などと指定して立ち上げておく。

もう1つのターミナルで

mongo

と打てば開始できる。

2018年10月25日木曜日

C++でコード実行時間を測定する

#include <iostream>
#include <chrono>
#include <time.h>
using namespace std;
int N = 10000;
int arr[10000][10000];
void array(){
auto chrono_start = std::chrono::system_clock::now();
/*measure from*/
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
arr[i][j] = j;
}
}
/*measure to*/
auto chrono_end = std::chrono::system_clock::now();
cout << "Elapsed time:"<< (chrono_end-chrono_start).count() <<"[ms]"<< std::endl;
}

int main(void){
array();
} 

C++11 用です。

こういうエラーが出て、C++2011スタンダードが必要ですよとのこと。

In file included from /usr/include/c++/5/chrono:35:0,
                 from time_elapsed.cpp:2:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support \

オプションでstdを入れて取り急ぎ解決。

g++ -std=c++11 -o time_elapsed time_elapsed.cpp

2018年10月16日火曜日

Ubuntuで音が出なくなったので直す

Ubuntu16.04で音が聞こえなくなりました。

下記コマンドをやってから再起動します。
(そのまま再起動しても大丈夫なのかもしれませんが・・・)

$ sudo alsa force-reload

サウンドドライバをアップロードしていると出力されます。

Unloading ALSA sound driver modules: snd-hda-intel snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-seq-midi snd-seq-midi-event snd-rawmidi snd-seq snd-seq-device snd-timer.
Loading ALSA sound driver modules: snd-hda-intel snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-seq-midi snd-seq-midi-event snd-rawmidi snd-seq snd-seq-device snd-timer.

このあと、再起動したら直りました。Soundのpropertyを見ると再起動前はDummyしかありませんでしたが、"Headphone"が現れています。




参考
https://itsfoss.com/fix-sound-ubuntu-1304-quick-tip/


これをやってもダメだったとき

pulseaudioを削除して再インストールします。

$ sudo apt-get remove --purge alsa-base pulseaudio
$ sudo apt-get install alsa-base pulseaudio

けっこう時間がかかって再起動のとき画面が出なかったりして焦りました。再度再起動すれば直りました。
https://ubuntuforums.org/showthread.php?t=2376586


2018年10月12日金曜日

Ubuntuの外付けHDDへのバックアップ

毎月程度でバックアップを取ろうと思うのですが、重いファイルVagrantとかだけ除いて、7.8GB分を外付けHDDに移すことに。

転送速度は10MB/sec程度なので、1分で600MB、10数分で7.8GBは転送が終わるということですね。


たまたま10.0MB/secの瞬間のスナップショットがとれました。

バックアップをとってからUbuntuのマイナアップデートをして、再起動することにします。


その後メモ

途中から速度が出なくなって、転送速度は3MB/sec程度になり、結局1時間近くかかりました。

保存するファイルを選んで減らしました。

trelloにEleganttを入れると変なJSONが入る件

trelloでタスク管理をしていますが、ガントチャートをかけるアプリEleganttを入れました。あまり上手く使えていませんが・・・それよりも気になることがあります。

以前に作っていたカードのDescription部分に日付等を表すElegantt側の表記が入っていることです。


[](Elegantt_data:dont_delete{"ignored":false,"autoPlanned":false,"ownerId":false,"dependencies":[],"ped":"2018-09-03T12:00:00+09:00"})

trelloのキャプチャ。JSONが入っています。

自分が使っている範囲では記述が追加されていて気持ち悪い、というレベルですが、勝手に4行消える、という報告もあったり。
https://community.atlassian.com/t5/Trello-questions/Any-thing-beyond-4-lines-of-text-gets-deleted-when-I-edit-the/qaq-p/709239

ガントチャートはそこまで使っていないので、Eleganttは消しました。



日誌2018年10月

2018/10/12

うっかりしていると今年が終わってしまいそうです。最近はpythonanywhereを触り始めました。無料で使えるホスティング、かつPythonが使えるということで便利かなと。

vimをしばらく使っていなかったらコマンドをことごとく忘れていて焦りました。たかだか1ヶ月で忘れるものだなぁ、、ということでうっかり忘れたときのためのリストとか作っておくとよいのかもしれません。使用頻度順に並べるとか、検索が超しやすいとか。検索のしやすさって結局のところは速さとあいまい検索の成功率なのかなとこの場合は思います。

2018/10/25

いつの間にかクリックポストが値上がりしていました。164円から185円へ。昔(2008年ごろかな)はクロネコヤマトメール便が80円だった時代があったんだよな・・・。それを言うと昭和初期の郵便はどーだこーだ、とかになってしまいますね。

最近ちょっとC++とGoをやろうとしています。ちょっとだけつまみ食い的な感じです。


2018/10/27

家の回線がフレッツ光の100Mなのですが、遅くてもっと速くならないかな〜と思い、1Gのプランにしようと思ったら自分のマンションではNTTの1Gプランがないということでした。auの1Gはあるけど評判がいまいち・・・(ネガキャンか?)。しかし速度を測っていると109Mの下りスピードが出ているとのこと(本当?)。ちょっと信じがたいのですが、実際のところそこまで困っているわけではないので放置しますか。自分のToDoに入っていたのでこれで終了。

Chrome ExtensionのWater Notificationで少し困っているのですが・・・。使えているんですが、通知が入ってくる場所を右上じゃなくて左上にしたいのですが・・・どうやってやるか分からない・・・。少し調べた限りでは、できないようです。chrome extensionのページを見ても特に記述ありません。
https://productforums.google.com/forum/#!topic/chrome-ja/akgmzuIktec
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12179051632

何故困っているかというと、最近デュアルディスプレイにして、主モニタが左にあって、通知が右にある副モニタに出てしまって気が付かない・・・ということです。


2018/10/28

Flaskで少し困り気味。チュートリアルでローカル環境ではできるのですが、デプロイできない。。一気にやるから難しくて、デプロイ環境でチュートリアルをやれば良いのでしょうか。それでは意味がないのでは、と思うのですが最初はそういうものなのかと・・・。英語の解説は読めるつもりなのですが、まだまだですね。

2018年10月10日水曜日

NTTフレッツのCLUB WESTのポイント交換が微妙

NTT西日本でフレッツ光回線を契約しており、契約や更新によってもらえるポイントがあります。

新規契約で3000ポイント、16ヶ月利用で3000ポイント、などですが・・・。
https://flets-w.com/user/support/guide/16.html

交換できるポイントで、Huluの1ヶ月無料チケットというのがあり、それが

1007ポイント

・・・この端数は?EVILでしかないと思いますけど〜。そこまでしてポイント使わせたくないのかな?と思いました。auに乗り換えかな・・・。


Ubuntuログイン画面でSwitch to greeterとなる件

環境はUbuntu16.04です(18.04も同様)。


対応を先に書くと、
1. ubuntuアップデートする(しなくてもよい場合あり)
2. ubuntu再起動する
です。
追記:アップデート関係ないようです。

症状


・ロック画面からログインしようとしたら、Switch to greeter という表示がパスワード入力画面に出る。

・そのパスワード入力部分をクリックすると通常画面に戻るが、数秒間黒い画面に変わって一行だけ表示が出る(読めませんでした。hmdi...?とか出ていたような)。

こちらによると、リブートせずにgreeterに戻るには、Ctrl+Alt+F1らしいです。

greeterはログイン画面のUIを提供している仕組みだそうです

対策


とりあえずログインはできるので放置しても良いのですが、、、

・ubuntuをアップデートする
・デュアルモニタに変更して2週間後にこの症状が出たのですが、デュアルモニタが原因なのでは?デュアルモニタで、ログイン入力画面がどちらのモニタに表示されるかは決まっていない(マウスカーソルの位置しだいでどちらにもなり得る)ようなのですが、ここらへんの切り替えでUIがおかしなことになっているのでは、と推測しています。
→デュアルモニタは関係なさそうです

その後:直った


・ubuntuのアップデートをして
・再起動

したら直りました。アップデートをサボってはいけませんね。

その後:また発生


・アップデートしたら直るのでしょう、と楽観的

その後: 再起動するだけでOKでした。

その後も同じ症状が出て再起動しなくていい方法を探した

強制的にログアウトするので、アプリケーションは保存しておきましょう。
$ sudo apt install --reinstall lightdm
$ sudo service lightdm restart
https://askubuntu.com/questions/1040159/authentication-failure-switch-to-greeter

2018年10月2日火曜日

Pythonanywhere review

This is my own review for 1 hour use of free trial.

- slow switching pages for other files or... (than local PC). Really frustrated, I need to get used to this.

- command of ubuntu  is useless (ps), it might be from different linux family

- I couldn't deploy "flaskr" tutorial web-app I made before ( in 1 hour. So need more time...)


I have never used other hosting service before for flask or web-app, so I can't compare to any others.

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

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

2018年8月26日日曜日

GIMPを入れて画像処理:メモ

Ubuntuで画像処理ソフトのGIMPをインストールしました。

・Windowsのペイントみたいなのが欲しいけど、Pintaは上手く動かない・・・Imagemagicも上手く使えないので。
・GIMPはフリーのPhotoshop的な位置づけ。高機能過ぎてアクションを探すのが大変です。

インストール

公式 https://www.gimp.org/downloads/ 
の通りで、flatpakをインストールしました。
https://flatpak.org/setup/Ubuntu/

起動

flatpak run org.gimp.GIMP
でもいいのですが、普通にアイコンから起動できます。
ちなみに、使用メモリは200MBくらいでした。

https://askubuntu.com/questions/1017707/how-to-run-gimp-on-ubuntu-16-04-install-from-flatpak

使い方メモ

■画像を開く File -> Open 

■画像を変更して、pngやjpegで保存するには File -> Export (Ctrl + E)

■範囲を選択する

四角、自由形、など。選択すると点線が点滅する

■選択範囲を消したい(点線がずっとついている)とき

Ctrl + Shift + A 
または Select -> None 

■選択範囲に枠線を引く

Edit -> Stroke Selection
-> Storoke line -> Solid color(default)
-> Linewidth 5 px 
色はForeground Colorになる

■選択範囲を塗りつぶす

Edit -> Fill with BG color

(色はFore, Background Color 2つから選べる)

■選択範囲をモザイクにする

Filters -> Blur -> Pixelize

Blockwidth, heightでモザイクの大きさ設定 default 16

■文字を書く
テキストツールで入力。日本語は打てない(?)

■線を引く
Pencil, Air Brush, ...などがあって太さが違う。
Shiftを押すとまっすぐな線が引ける。
Shift + Ctrl を押すとまっすぐで角度を指定した分だけずらした線が引ける

■画像の大きさをを変える(Scale)

全体を選択して
Image -> Scale Image

■回転させる

全体を選択して
Image -> Transform -> Rotate

■画像をくり抜く

四角形の場合
選択してから
→Image→Fit Canvas to Selection


円形の場合
四隅が残るので、

Layer -> Transparency -> add Alpha Channel
をしておいて、

円を選択してから
→Image→Fit Canvas to Selection

(四隅が残る)

円を選択した状態で、Select -> Invert -> Delete 押す




■矢印にする

矢印を描く機能はデフォルトにはない。

https://www.gimp-forum.net/Thread-Arrow-Script
arrow.scm file が提供されているので使う。2021/7月版が最新だった@2022/01/20

ここに入れた。
~/.var/app/org.gimp.GIMP/config/GIMP/2.10/scripts$ 

Pathを2点選んでTools -> Arrowと選んで設定画面を出して描画する。

説明
https://www.maketecheasier.com/draw-arrows-in-gimp/












Pythonで変数が存在するかを調べる

Pythonで変数aが存在するかを調べます。
try:
    a
except NameError:
    print('not defined')
他のやりかた

globals(), locals()にはそのスクリプトのグローバル変数、ローカル変数が辞書で入っているので、
if a in globals():
    print('yes')
などとやっても確認できます。

https://stackoverflow.com/questions/843277/how-do-i-check-if-a-variable-exists

VPS選定中★

VPSを選定しようかなと思っていますが・・・。いろいろあるんだなーと。

数10件くらいずつ各社の評判が書き込まれているサイト。
http://www.rental-server.ws/

  • 遅い
  • Dosなどによって設定を無断で変えている
  • コントロールパネルが使いにくい
  • 解約するのが大変
  • サポートがつながらない、対応が無愛想、態度が悪い、知識がない

というのが解約に至った理由で、問題が起きる→サポートが不満→解約、となるようです。解約して移転した先があまり書いていないのですが・・・。

■他のサイトが何を使っているのか調べる

https://www.aguse.jp/

このサイトで調べられるようです。ただ、レンタルサーバなのかVPSなのか、という契約種別は分からないです。

まだ10くらいしか見ていませんが、さくらが多くて、AWS、ゲヒルン(これもさくら)、とかですかね。

■Conohaはどうなんでしょう

使用事例のサイトを見てみればよいんでしょうか。
1日ごとに課金されるそうですが、最低1日毎に契約したりしなかったりということができるようです。

各サービスの最低利用期間を教えてください。
追加IPアドレスのみ30日間の最低利用期間を設けています。その他のVPS等サービスに関しましては最低利用期間はございません。
https://www.conoha.jp/faq/overview/


2018年8月25日土曜日

Ubuntu16.04をブートするとinternal error

Ubuntu16.04LTSでログアウト→ログインとするとエラーが出るようになりました。

ubuntu 16.04 has experienced an internal error

と出て、

/usr/lib/unity-setting-daemon/unity-setting-daemon

がおかしいようです。

https://askubuntu.com/questions/790326/unity-settings-deamon-crash-in-16-04-every-time-after-boot

によると、

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install --reinstall unity-settings-daemon
sudo reboot
unitiy-settings-daemonを再インストールして再起動するのがよいみたいです。再起動前にバックアップとらないとな、、、、と思っています。

原因?


不明ですが、直前にdconfでキー配列をいじる設定をしていました。それが原因かも・・・。

2018年8月23日木曜日

Chrome ExtensionのWater Notificationを少し変更

ポモドーロテクニックと呼ばれている、集中して作業するためのテクニックがあります。25分作業+5分休憩を繰り返すというものです。
15分タイマーでやっているんですが、最近はそのタイマーをChrome ExtensionのWater Notificationを使っています。

タイマーでこういう通知がポップアップします。



リピートするときに、「Keep it Flowing」の部分を押すのですが、それを押してからも数秒間は画面に残り続けてしまします。

そこで、「Keep it Flowing」を押したらすぐに消えるようにclearを追加しました。

# background.js
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
chrome.alarms.onAlarm.addListener(function() {
  chrome.browserAction.setBadgeText({text: ''});
  chrome.notifications.create('id_1', {
      type:     'basic',
      iconUrl:  'stay_hydrated.png',
      title:    'Time to Hydrate',
      message:  'Everyday I\'m Guzzlin\'!',
      buttons: [
        {title: 'Keep it Flowing.'}
      ],
      priority: 0});
});
chrome.notifications.onButtonClicked.addListener(function() {
  chrome.storage.sync.get(['minutes'], function(item) {
    chrome.browserAction.setBadgeText({text: 'ON'});
    chrome.alarms.create({delayInMinutes: item.minutes});
  });
  chrome.notifications.clear('id_1');
});

2018年8月22日水曜日

DMCA申請でGoogleから記事を消された話

このブログではないのですが、このBloggerのサービスで作っているブログ記事があったりします。
そのブログで、記事に個人名を書いていたらDMCA申請があったらしく、記事が消えていました。特にGoogleから連絡があったわけではなく、後で気がついただけなのですが。ちょっとびっくりしました。

ちなみに、ライブドアブログでも似たようなことをしてしまったのですが、そのときはライブドア社からメールで警告が来ました。『一両日中に改善がなければブログを削除します』と書かれており、血の気が引いた記憶があります。その記事だけ消したらその後は特に問題ありませんでした。

気をつけたいものです。

2018年8月21日火曜日

PythonスクリプトがJupyter上で動いているかを調べる方法

get_ipython().__class__.__name__

の値を調べることで、Jupyter上でスクリプトが動いているかどうかを調べることができます。Jupyter上だけは特別な処理をしたいときに使えます。
if get_ipython().__class__.__name__ == 'ZMQInteractiveShell':
    print('on Jupyter')
else:
    print('other shell')
参考:
https://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook


プラットフォームを調べる

platformモジュールを使えばSystemがLinuxだとかの情報が分かります。
import platform
platform.uname()

2018年8月20日月曜日

ubuntuにeasystrokeを入れてマウスジェスチャ

ubuntuのマウスジェスチャ用にeasystrokeを使っています

Ubuntuでエレコムの5ボタンは普通に使える

エレコムでしか試していないのですが、Ubuntu16.04では何もしなくてもマウスの横ボタン(5ボタン)が使えています。(M-BL21DB、M-BL07UBBK)

右手親指側の手前ボタン→「戻る」奥ボタン→「進む」

easystroke


ボタンを変更するときは、こちらがとても詳しかったです。easystrokeというソフトを使いました。12MBくらいメモリ消費しますが、Gvimと同じくらいなので軽いものでしょう。

http://mimikakimemo.hatenablog.jp/entry/2012/11/24/022457
https://forums.ubuntulinux.jp/viewtopic.php?id=9940

親指の奥ボタンを「Ctrl+W」にしてウィンドウやタブを消せるようにしました。


設定画面のキャプチャ


自分の保存用

9、8->8 等はマウスのボタンに割り当てられた番号です。






個人情報の匿名化技術(KDDI)

目的: コピペするときに個人情報が出てきたら伏せ字にしたい


mecabで人名、地名を見分けるのは難しいという印象なのです。自分でやってみたこの例でも充分な結果とは言えませんでした。


ステップ1: 名前は全て伏せ字
ステップ2: 公共性があれば個人名を出してよい(←名誉毀損などの対象にはなるのでは?)

KDDIが伏せ字にするシステム作っていたみたいですが。(2014年2月)
http://www.itmedia.co.jp/mobile/articles/1402/04/news079.html
公式のプレスリリースは消えているようです。

ツールは月内にも販売を開始し、価格はカスタマイズ内容により応相談だが約80万円とのこと

とスラドのページには書いてあるのですが、その後どうなったんでしょうか。80万円はちょっと高いかもな・・と思ったりして。でも効率があがるのであればペイするでしょうか。

従来の目視確認で1件あたり約30秒かかっていた作業が3分の1の10秒まで短縮可能
とのことで、1件あたり20秒で1000件で20,000秒≒5-6時間。
専任者を雇っていたとして、コスト1時間3000円としても、1日で15,000円・・・。

・・・計算が粗すぎるかもしれませんが、もうちょとなんとかなりそうなものですけど。

2018年8月18日土曜日

独立開業、個人事業主になるならのメモ


10万円以上のパソコンなどは、開業後に途中から減価償却できる


半年以上を切り上げる。計算式がある。
ex.パソコンの償却年数は4年。
http://www.okada-blog.com/diversion-from-private-to-business/

個人事業主が賃貸を事務所にするときのトラブル。

-契約を確認すること
-交渉の余地はあるらしい
-貸主が嫌がるのは、事務所だと税金が変わるから
http://www.hibinonikki.club/entry/2015/07/18/221411

--


在宅で仕事をするとき、家賃を按分する


事務所の面積+共用部部の按分で計算する。
自宅兼事務所にするとき、自宅と事務所の面積を出して、共用部分を按分すればよい。実際のところ方法は税務署を納得させられればOK。
https://keiei.freee.co.jp/2017/12/01/setsuzei/

請負契約と準委任契約、どっちで契約すればいいの領収書について


必要な項目が決められているが、基本的には領収書はレシートで問題ない(企業で規定がある場合は別)

--

会社にはあって、事業主になるとなくなるものを想定しておく

・健康診断--健康診断の費用を調べておくこと。人間ドッグ1-2万円?

大阪市であれば、40才、45才、、は無料らしい


役立ちそうなリンク



https://www.sumoviva.jp/
スモールビジネス(個人事業主、中小企業、起業家)の
業務や経営にまつわる疑問や課題をみんなで解決していく場

http://takanawa-audit.com/
藤原公認会計士事務所。丁寧

http://tokyocity.co.jp/category-information/soho-tax/
東京シティ税理士事務所。細かく説明してある

https://biz-owner.net/
個人事業主メモ

https://biz.moneyforward.com/
マネーフォワード。お役立ちメモという項目が豊富

http://koyhogetech.hatenablog.com/entry/20150528/coedo-lawstudy
エンジニアのための法律相談

請負か準委任か

請負契約と準委任契約、どっちで契約すればいいの?〜請負契約・準委任契約・労働者派遣契約の違い〜
https://qiita.com/tetsuya-imamura/items/d291859ee57b96d4c502
情報サービス産業における適正な業務委託契約運用のためのガイドライン
https://www.jisa.or.jp/Portals/0/resource/legal/download/jisa_entrust_guideline.pdf

考えておくこと(BCP)

非常時には、通常時に戻すことを考えつつ、戻るまでの最適な手段を選択する

非常時対応(自然災害)
-->予測や事前対応は困難。回復や欠損がないかの判定。
ネット回線が切れたとき
-->代替となる回線をどこから取るか?ネットカフェ?
PCが壊れたとき、付属品(キーボード、マウス)が壊れたとき
-->代替機を用意しておく。PCのリカバリの手順を確認しておく。