2018年7月27日金曜日

UbuntuにVLC Playerを入れたらerror:ES_OUT_RESET_PCRが出るけどとりあえず使える件

VLC Playerを入れるとき、おおむねこちらの通りですが、エラーが出て動きませんでした。

$ sudo apt-get install vlc

core input error: ES_OUT_RESET_PCR called
最初はリージョンがセットされていないので、regionsetをインストールしてから設定します。VLCはregion関係なく動くけど設定は必要とのこと。

regionsetをインストール
$ regionset
regionset version 0.1 -- reads/sets region code on DVD drives
Current Region Code settings:
RPC Phase: II
type: NONE
vendor resets available: 4
user controlled changes resets available: 5
drive plays discs from region(s):, mask=0xFF
Would you like to change the region setting of your drive? [y/n]:y
Enter the new region number for your drive [1..8]:2
New mask: 0xFFFFFFFD, correct? [y/n]:y
Region code set successfully!
最初はドライブのリージョンがmask=0xFFになっていると表示されますので、2に変更します。

使えるようにはなりましたが、まだエラーは残っています。libvdpauがないようですが・・・。とりあえず使えるので放置。
 core input error: ES_OUT_RESET_PCR called
Failed to open VDPAU backend libvdpau_va_gl.so: cannot open shared object file: No such file or directory
参考 http://d.hatena.ne.jp/tmatsuu/20071104/1194148737
https://askubuntu.com/questions/501277/cannot-play-dvds-on-ubuntu-14-04

その後、使えていますがやはり起動時にエラーメッセージが出ています。
QPixmap::grabWidget is deprecated, use QWidget::grab() instead
[00007efc780009b8] core input error: ES_OUT_RESET_PCR called

2018年7月24日火曜日

コンビニの店舗数の表示方法を比較してみる

コンビニの数ってどれくらいなのか、と気になって調べていたのですが・・・。


  • セブンイレブン 20,392(2018年6月末)
  • ファミリーマート16,868(2018年6月30日)
  • ローソン 13,992 (2018年2月末)


ということになりました。ローソンは更新が遅いということになります。

ホームページも個性が出ています。


セブンイレブン・・・地図で地域別の店舗数をインフォグラフィックで表示



ファミリーマート・・・店舗数の地域別の表



ローソン・・・売上高と店舗数の推移と店舗数の表





個性が現れますね。インフォグラフィックが圧倒的に分かりやすいです。


2018年7月22日日曜日

Pythonでprint()を一時的に使えなくする

Pythonのprintで出力してデバッグしているときなど、print機能を一時的に消したいと思うことがあります。そのやり方です。

https://stackoverflow.com/questions/8391411/suppress-calls-to-print-python#
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os
# Disable
def blockPrint():
    sys.stdout = open(os.devnull, 'w')
# Restore
def enablePrint():
    sys.stdout = sys.__stdout__
  
print ('This will print')
blockPrint()
print ("This won't")
enablePrint()
print ("This will too")
open(os.devnull, 'w')のos.devnullは、nullであるデバイス、という意味で、何もない所に出力する(=出力しない)、という設定です。

https://docs.python.org/3/library/os.html#os.devnull

その後、sys.__stdout__でデフォルト出力に戻しています。

Jupyterのときはデフォルトがipykernel.iostream.OutStreamとなっており、これに戻す方法が不明です。

なので、 
save_stdout =  sys.__stdout__
# Disable stdout
# ....
# return to default
sys.stdout = save_stdout
とやって戻しています。

ちなみに、logging機能でコンソールに出力にしておけば、loglevelの設定を変えて表示するしないを調節することができます。

2018年7月16日月曜日

loggingで出力されるファイルのサイズを概算する

Pythonのloggingで出力されるログファイルはどのくらいのサイズになるのか、を考えました。実際のところはutf-8の文字サイズだけなんですが。RotatingFileHandlerを使います。



ログ出力

import logging
logger = logging.getLogger('__name__')
logger.setLevel(logging.DEBUG)# root
# console, file handler
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
fh =logging.handlers.RotatingFileHandler(
                                        './log/log.log',
                                        mode='a',
                                        maxBytes=1000000,
                                        backupCount=100
                                        )
fh.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger ### DO ONLY ONCE
logger.addHandler(ch)
logger.addHandler(fh)
これで.pyと同じディレクトリにあるlog.logファイルにログ出力されるのですが、このファイルサイズを考えます。utf-8 で保存しているのでアルファベット(ASCII)は1文字1バイトになります。
logger.info('test')
とするとログはこうなります。49文字なので49バイトです。
2018-07-16 11:14:11,937 - __name__ - INFO - test 
__name__はどのファイルで起きたかということですが、省略してもよいのかも。時間の表記もミリ秒まで表示しなくていいときの方がほとんど(たまにあった方がよいですが)。

まとめ

ざっくり計算すると、1行のログでせいぜい100バイト程度と分かりました。

10回で1kB、1万回で1MBっていうところでしょうか。

例えば10分に1回動作させて1行ログが出るなら、1日では6*24=144回で、1MBに達するのは概算で600日とかになります。


参考

https://docs.python.jp/3/library/logging.handlers.html#logging.handlers.RotatingFileHandler

http://software.fujitsu.com/jp/manual/manualfiles/m140016/j2ul1734/05z200/j1734-i-03-04.html

https://ja.wikipedia.org/wiki/ASCII

2018年7月15日日曜日

ubuntuでログアウトしてもプロセスを継続する

ログアウトしてもプロセス継続

$ nohup <command>
とすれば、バックグラウンドで動作して、ログアウトしてもプロセスが生き残ります。(シャットダウンすると消えます。)


(あとで)確認して停止する

あとで確認するには
$ps x
でよく見ればpid(プロセスID)が分かりますから、
kill pid
としてプロセスを殺します。

テキスト出力 

$ nohup <command> > file.txt &
・ > file.txt とするとfile.txtに出力されます。設定ない場合はnohup.out
・ 末尾に&オペレータを入れると、PIDが出力されます。


foo.pyを用意して実行します
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
for i in range(5):
    print (i)
    time.sleep(3)
これで
 $ nohup python foo.py
nohup: ignoring input and appending output to 'nohup.out' 
入力を無視して出力をnohup.outに追加します。とコンソール上に出力されます。

--

std.outにprint出力していたので、バックグラウンド動作させつつもログアウトしない間はコンソールに同時に出力したいな〜と思ったのですが、無理みたいです。
https://serverfault.com/questions/414341/redirect-nohup-to-stdout

loggingで出力する方がよいですね。ちなみにloggingのコンソール出力はnohup.outに出力されます。

ヨドバシカメラのプライベート電池ブランド

ヨドバシカメラに行くと、プライベートブランドのアルカリ電池がやたらと売られていました。


 ハート電機サービスという会社が販売しているようで、 ここは2015年にできたベンチャー企業だということです。しかしこの会社のページには電池のOEM製造の話は書いていないようです。取引先にヨドバシカメラと書いてあるので間違いはないでしょうけど・・。


ミトクの記事で検証したりしているようです。ベンチマーク用にパナソニックのアルカリ(金パナ)が使われており、それよりも長寿命(0.9Vに達するまでの時間が長い)ということです。

容量って1500mAhくらいなんですね、知りませんでした。容量や容量あたりの価格を考えて使い分けでしょうかね〜。リモコンの電池とかなら安いやつで良いのでは、と思いますが。

交換のコスト
- いつ交換するか(容量)
- すぐ手に入るか、安定した供給、価格で手に入るか(店の立地、販売方法)
- 品質が安定しているか(製造側の安定性)

とかが気になるところでしょうか。

2018年7月14日土曜日

ubuntu マウスホイールの速度を上げる

Ubuntu16.04LTS , 20.04 
( 結局、副作用があるので使わなくなりました。)

imwheelをインストールしてマウスホイールを設定します。

$ sudo apt-get install imwheel
でインストール
$ vim ~/.imwheelrc
で編集。

デフォルトのスピード(行数)は1なのですが、これを3にしたいとき・・・
".*"
None,       Up,     Up,     3
None,       Down,   Down,   3
と書き込んで保存。
$ imwheel
で起動すると
INFO: imwheel started (pid=18001)
と出る。

終了するときはkillallします。2重に起動するとバグるらしいので、そういうときもkillall。
$ killall imwheel
あとは下記のリンクに詳しく書いてあります。

使ったあとの感想

  • 変更するときは、 .imwheelrc 起動したままファイルを書き換えればよいようです。
  • スピードを3にしていると早すぎるときがあるので2にしました。
  • Jupyterで使うと、入力、出力の枠を1つとカウントして飛ばすので、予想外の動きになります 
  • ターミナルで出力されたものがスクロールされたので戻したい、というときに戻れません。コマンドの履歴が表示されてしまいます。これは困りました。→ターミナルでは機能しないように設定すればよいのかもしれません。
  • 5ボタンマウスの戻るボタンが機能しなくなりました

参考
https://askubuntu.com/questions/285689/increase-mouse-wheel-scroll-speed

Bloggerのアクセスカウントが変

このブログの自分のビューを追跡しない

を設定してもCookieの設定がうまくできず、自分のアクセスがカウントされ続けるのですが。

http://nkurilog.blogspot.com/2017/11/blogger_28.html
このブログを参考にDeveloper Toolsから設定してみたのですが、、効果なし。しかも、あるページにアクセスするとその前後のページのアクセスもカウントされることがあることが判明しました。。prev、nextページのリンクを貼っているからでしょうか。意味がわからないが・・・自分のアクセスがカウントされたら意味不明なんですけどね・・・。

ちょっと様子見です・・・。

--

追記2019/10/13

最近はカウントされなくなってきたようです。何か変更があったのかもしれません。

2018年7月12日木曜日

gvim Ubuntuで右クリックでポップアップメニューを出せるように

 ubuntu16.04でgvimを使っていて、コピー、ペーストをするための右クリックのポップアップメニューが出ない・・・ので調べて直しました。
 :set mousemodel=popup
これでOKです。
:help popup-menu
の該当部分を読んでみると、なんだか別の設定なのですが・・・まぁ望み通りの動きをしているからよいことにしましょう。
 3.2 Selection with Mouse                *gui-mouse-select*
The mouse can be used to start a selection.  How depends on the 'mousemodel'
option:
'mousemodel' is "extend": use the right mouse button
'mousemodel' is "popup":  use the left mouse button, while keeping the Shift
key pressed.
参考
https://superuser.com/questions/646097/fixing-the-right-click-menu-in-gvim-in-ubuntu

2018年7月11日水曜日

gvimのGLib-GObject-WARNING



vim-gnomeを閉じるときに、こういうWARNINGが出ます。17699はプロセスIDなので任意。
(gvim:17699): GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type '<invalid>'
バグのようですが、気にしないでよいそうです。

https://askubuntu.com/questions/334219/gvim-produces-error-when-hitting-the-close-window

vim-gnomeをアンインストールして、vim-gktを使うように言っている回答もありますが・・・。

Python pd.DataFrame.whereの使い方メモ

データフレームの置き換えで使われるwhereですが、少し複雑なのでメモ


初期条件 df1, df2を作ります。
pd.DataFrame.where()
df1 = pd.DataFrame([[1,-1,-2], [15,25,-5]])
0 1 2
0 1 -1 -2
1 15 25 -5

df2 = pd.DataFrame([[10,20,30],[40,50,60]])
0 1 2
0 10 20 30
1 40 50 60

df1の中で、0以上のものを残す(マイナスを消す)ようにするには、
df1.where(df1>=0)

とします。
これは、引数の条件(df1>=0) のものだけを『残す』という書き方で、注意が必要です。
0 1 2
0 1 NaN NaN
1 15 25.0 NaN

0以上のものを残し、それに当てはまらない場合(NaNになる部分)には、df2の行列の要素を入れたいときは
df1.where(df1>=0, df2)
0 1 2
0 1 20 30
1 15 25 60

としてdf2をwhereに渡すことで置き換えることができます。
ちなみにdf1, df2の行列の行・列が揃っていないとできません。


インデックスが違うとき

行名が3,4になっているdf3を作ります。
df3 = pd.DataFrame([[10,20,30], [40,50,60]], index=[3,4])
0 1 2
3 10 20 30
4 40 50 60

このときは、

df1.where(df1>=0, df3)

とやってもdf1>=0 だけしか反映されません。

df1.where(df1>=0, df3, axis=1)

とaxis=1とすれば読んでくれます。行名ではなくて、行を順番に使うということになります。

2018年7月9日月曜日

Pythonでファイルを外部ディスクに定期保管する

小回りがきくように自分で作ってみました。
あるディレクトリにあるpy, inbpyファイルを定期的に保存します。

これを定期実行すればよいです。

2018年7月8日日曜日

Pythonでmemory_profilerを使うTips

インストール

conda install -c chroxvi memory_profiler

使い方

メモリ消費を見たい関数の上にデコレータ@profileを入れます。my_func()という関数を見たい場合、
@profile
def my_func():
    ....
とします。Jupyterではmemory_profilerは使えません。つまり


%mprun -f my_func my_func()

はエラーになります。

known bugで、対策はないようです。


正しいやり方: ターミナルで実行

pyrhont -m memory_profiler filename.py
と入力すればOKです。filename.pyの中に
from memory_profiler import profile
を入れてインポートすれば、
python filename.py
で同じことができます。

ファイルの中に日本語があって文字コードエラーが出る場合

utf-8 can't decode byte XXX in position XXX というエラーがでるとき。これはファイルが別のエンコードということです。
方法その①
無理やり変えるには、シェバンの次の行(2行め)で文字コードの宣言をします。
#!/usr/bin/env python
# -*- coding: cp932 -*-
# ・・・memory_profiler.pyの途中でもf.read()をしているのでそこでエラーが
# でるかもしれません。

方法その②
memory_profiler.pyを修正します。

920行目くらいで、
with open(filename, encoding='cp932') as f:
としてencodingを設定します。

2018年7月7日土曜日

日誌2018年7月分

2018/07/07

AnaocndaでPythonモジュールの管理をしていますが、pipも併用せざるを得ないからか、変になってしまいました。一度py3.5からpy2.7にしてしまったこともあり、戻せなくなり・・・仕方なくクリーンインストールしました。venvにしたら気軽に環境構築できるのですが、Powershellを使うとvenvに入れないんですよね・・・これはcondaのバグのようです。

memory_profilerを上手く使えなくて四苦八苦しているのですが、日本語が入っているときは文字コードエラーが起きるので、シェバンの次の行で文字エンコーディングを書いておけば良いようです。

#!/usr/bin/env python
# -*- coding: cp932 -*-
こんな感じで。

2018/07/10

memory_profile が上手く使えていない気がします。ずっと言っていますが。いろいろモジュールを組み込んでいて、扱いが難しいのかも・・・。

2018/07/11

vimを少し。使い方がよく分かっていないです。.vimrcファイルが上手く設定できていないのですが。

2018/07/13

本屋でZOZOの田端氏の著書をパラパラみました。書いてあることはわりと真っ当でした。煽りすぎな面もありますけど・・・。技術系のスーパーサラリーマンは少ないですね。

2018/07/16

Windows XPのノートPCを廃棄することにして、ファイルを消しましょう、と思ったらWindows付属のciphereというソフトがXP Proにしか入っていないとのこと。これをインストールしようと思ったけど面倒でやめて、別のソフトを使うことにしました。Super File Shredderというやつです。あとは引取の申し込みをしたら良いのかな。しかし、2005年に買ったレッツノートW4なんですが、バッテリ付近がめちゃくちゃ熱いです。温度は測っていないですけど・・・50℃くらいはあるのでは?80℃を超えると自己発熱で発火しますからね〜。自分で分解してみたい気もしますが、面倒なので廃棄します。

2018/07/21

レッツノートは無事データ削除できたようです。NTLDR is missingになって起動すらできませんが・・・。ブートローダーがない状態ということですね。これで安心して廃棄できるのでは。

漫画で中学高校が舞台のとき、人数が足りなくて廃部寸前からスタート、ということが少なくないような気がします。こういう事例をひたすら探すスクレイピングを作れないものか、と思うのですが。これに限らず思い描いたデータを素早く集められるようになりたいものです。


2018/07/22

スクレイピングでとあるサイトの情報を取得しつづけているのですが・・・。1秒間隔なら良いのかな、というところですが、実際のところ岡崎図書館事件もあるわけで、どうなんでしょうか。いろいろまとめはあるようですが、法的なところはケースバイケースななんでしょうね。1日は24時間、1440分、86400秒ということで、10万くらいなら丸一日かければ調べつくせますが、100万になると・・・10日間もやり続けるのか・・・と。これはアクセス的には微妙ですよね。

2018/07/25

東プレのキーボードを買いたいな、と思っているのですが・・・ヤフーショッピングでJoshinが安い、と思ったら納期は3-4ヶ月になっていて・・・目が飛び出るかと思いました。生産そんなに待つものなんでしょうか。東プレの売上の中で、キーボードは数%程度のようです。元々は自動車のプレスを専門とした会社みたいですね。なかなかの好業績。


2018/07/26

ubuntu16にVLC Playerを入れました。リージョン関係なしに動きますね。

2018/07/29

アリアナ・グランデの曲のバイオリンがやたら大きいな、、と思っていたら葉加瀬太郎だった件。しかしAmazon MusicにしろAmazon TVにしろ、やたらとアクセスが早くてびっくりします。YouTubuだと少なくともロードに数秒かかるんですけど・・・。曲ごとにサーバでも立ててるんでしょうか?

2018/07/29

Firefox geckodriver、selenium Pythonという 組み合わせで使っていたら、途中でプロセスが終わるとゾンビプロセスが出来てしまうようです。ログアウトしてもダメ。システムモニタからkillしました。 途中終了しても必ず消せるようなスクリプトにしておくのが良いみたいですが・・・。

2018/07/30

Kindleをubuntuで見ようとしたが、できませんでした。残念。


Python numpyでリストを分割、行列生成

numpyのreshapeを使って行列を作ります。


まず、0-5の整数を持ったarrayを作ります

import numpy as np
import pandas as pd
a = np.arange(6)
print(a)
Out:
[0 1 2 3 4 5]

reshapeを使って2要素のリスト3つ(2行3列)に分割します。

a.reshape(3,2)
Out:
array([[0, 1],
       [2, 3],
       [4, 5]])

3つに分けることが決まっていれば、要素数は-1としてもかまいません。

a.reshape(3,-1)
array([[0, 1],
       [2, 3],
       [4, 5]])

reshapeしてからpandas DataFrameに入れます。

pd.DataFrame(a.reshape(3,-1))

Out:
0 1
0 0 1
1 2 3
2 4 5
行指定したときと、列を指定したときには同じものが作れます。今の場合、reshape(3,-1)とreshape(-1,2)は同じです。

判定するとき、== で判定するとarrayの要素1つ1つを判定することになります。

a.reshape(-1,2) == a.reshape(3,-1)

Out:
array([[ True,  True],
       [ True,  True],
       [ True,  True]], dtype=bool)


arrayが同一かを調べるには numpy.array_equal() を使います。

np.array_equal(a.reshape(-1,2), a.reshape(3,-1))
Out:
True

2018年7月3日火曜日

スクレイピング参考情報リンク集

個人的メモ。2016年くらいまでの情報です。


入門、Selenium
https://app.codegrid.net/entry/selenium-1

良い記事→Webスクレイピングのノウハウを公開します
http://tech.respect-pal.jp/web-scraping/

Fill username and password using selenium in python
ウェブページでIDとパスワードを入力する
https://stackoverflow.com/questions/21186327/fill-username-and-password-using-selenium-in-python

Pythonでかんたんスクレイピング
https://qiita.com/_akisato/items/2daafdbc3de544cf6c92

クローラー/Webスクレイピング Advent Calendar 2015
https://qiita.com/advent-calendar/2015/crawler

seleniumの紹介
https://sites.google.com/a/chromium.org/chromedriver/getting-started