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()を消したの使う