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のリカバリの手順を確認しておく。




Chromeのタブが応答不能になる問題★

Google Chrome 67.0.3396.99
Ubuntu 16.04LTS

追記: 気がついたら治っていました。
Google Chrome  71.0.3578.98 (Official Build) (64-bit)

症状


クロームで検索すると「This site can't reached」のエラーが出る
(特に、新しくタブを開いたとき)


特徴


タブを沢山(〜10)開いていることが多い。
メモリがそこまで足りていないわけではない
Ethernet Network->Wired Connection1をリセットすると直る


解決方法の案


リセットすると直るので放置していましたが、どうにも頻発するようになったので他の解決方法を探しています。


原因は違うが似たような症状はある

マカフィーが原因だった件
https://productforums.google.com/forum/#!msg/chrome-ja/O5Dbzcli9xY/C-WlXYemCgAJ

結局原因不明。
https://productforums.google.com/forum/#!topic/chrome/sv0YttC20cU

ログをクリアすると直ったという話
https://pc.casey.jp/archives/153904062


問題の切り分け

とりあえずエクステンションを全部OFFにして様子を見てみます(2018/08/18)

次にやること。DNSリセット、chrome://flags/クロームセッテイングのリセット、など


SQLITEのメリットデメリット

勉強がてらまとめます。

SQLiteのメリット


  • DBが1ファイルなのでバックアップしやすい
  • サーバ不要
  • 処理が早い
  • オープンソース、フリー

SQLiteデメリット


  • セキュリティ(パスワードがない)
  • 複数同時書き込みができない


が主なものでしょうか。メリットデメリットというより、ソフトの設計意図をどう解釈するか、という話な気もします。

セキュリティに関しては、.htaccessを使う、root以外へのアクセスにする、SQLインジェクション回避のためにsqlite_escape_string()を使う。などなどがあるようです。

パスワードがないというデメリットは→設定が楽というメリットにつながっていたりもします。
複数同時書き込みができない→1ファイルだから


参考
http://d.hatena.ne.jp/grgrjnjn/20110401/1301669692
http://animane.hatenablog.com/entry/2015/10/12/152533
http://iekasegu.work/column.php?no=30
http://dis.ne.jp/blog/infra/2718.html

https://blog.secureideas.com/2014/10/sqlite-good-bad-embedded-database.html

2018年8月17日金曜日

Ubuntuで画面をGIFでキャプチャ(peek)

peekというソフトでUbuntuの画面操作をGIFでキャプチャできるようにしました。

とにかくシンプルに記録するだけのソフトで、途中の編集などはできないようです。
sudo add-apt-repository ppa:peek-developers/stable
sudo apt update
sudo apt install peek
でインストール
peek
で起動します。あとは直感的に使えます。

2018年8月16日木曜日

matplotlibので軸目盛り・ラベルを操作する

matplotlibのグラフで、軸目盛りとラベル(数字)をいじります。

plt.tick_params()の中にパラメータを入れればよいです。


例:デフォルトはこちら

from matplotlib import pyplot as plt

plt.plot(range(10))
plt.show()



いじってみた例です。

from matplotlib import pyplot as plt

plt.plot(range(10))

plt.tick_params(direction='out',
                pad =20,
                length=10, 
                width=2, 
                labelcolor='pink', 
                color='g'
               )
plt.show()


  • 目盛りは外側
  • 目盛りとラベルを20離す
  • 目盛り長さ10
  • 目盛り幅2
  • ラベル色ピンク
  • 目盛りの色は緑
としています。


---
plt.tick_params()の中のパラメータ
(公式ページなどを参考)

パラメータ:{'A', 'B',...}
を使いたいとき
plt.tick_params(パラメータ='A')
などと書きます。

■変化させる部分の設定

axis : {'x', 'y', 'both'}
    変化させたい軸 デフォルトは'both'

reset : bool
    デフォルトは False
    Trueであればパラメータを全てデフォルトにする

■tick(目盛り)の操作

which : {'major', 'minor', 'both'}
    デフォルトは'major' 主目盛りか、副目盛りどちらの設定をするか

direction : {'in', 'out', 'inout'}
    tickの内向き、外向き、両向き

length : float
    tick長さ

width : float
    tick幅
 
color : color
    tick(のみ)色の設定。mtplotlibで使える色は全て対応
    https://matplotlib.org/users/colors.html

pad : float
    tickとラベルの距離

labelsize : float or str
    tickと不ラベルのフォントサイズ。サイズは'large'等でも

labelcolor : color
    ラベルの色。https://matplotlib.org/users/colors.html

color : color
    tickの色

colors : color
    tickとラベルの色を同時に変える

zorder : float
    tickとラベルのzorder(重なりの順番)

bottom, top, left, right : bool or  {'on', 'off'}
    上下左右のtickを操作をon/off

labelbottom, labeltop, labelleft, labelright : bool or  {'on', 'off'}
    上下左右のラベル操作をon/off

---

下側の目盛りを消して、左側の目盛り数字を消した例です。

from matplotlib import pyplot as plt

plt.plot(range(10))
plt.tick_params(
                bottom='off',
                labelleft='off',
               )
plt.show()

x軸だけに限定して、軸目盛りを赤色、数字サイズを15に(デフォルトは10)、数字色を青色に変えた例です。

from matplotlib import pyplot as plt

plt.plot(range(10))
plt.tick_params(
                axis='x',
                color='red',
                labelsize=15,
                labelcolor='blue'
               )
plt.show()

2018年8月13日月曜日

Jupyterのプログレスバーを使って進捗をアニメーション表示する

(python3.6, jupyter1.0.0)

Jupyterでループの進捗具合をメーターで可視化します。

Progress Bar
ipywidgetsモジュールを使います。
import ipywidgets as widgets
import time
end = 100
progress = widgets.IntProgress(
    min=0,
    max=end,
    step=1,
    description='Test:', # dummy
    bar_style='', # 'success', 'info', 'warning', 'danger' or ''
    orientation='horizontal'
)
display(progress)
for val in range(end+1):
    time.sleep(0.1)
    progress.description='Test:{}'.format(val)
    progress.value=val
min
カウントの最小

max
カウントの最大

step
カウントのステップ

description
バーの横にテキストを出す

bar_style
バーの色が変わります。
'' (デフォルト。指定なし): 青
success: 緑
info: 水色
warning: 黄色
danger:赤

orientation
バーの縦横

を変数で設定して、progressの中のmaxとforループの終了に与えています。
progress.description で毎回値を変えていますが、桁が変わると表示がずれることがあります。


公式のドキュメントから。種類はいろいろあります。
http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Basics.html
http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html

こちらも参考になりますが・・・少し古いかもしれません。
https://qiita.com/mix_dvd/items/e613c2714c7ea0e81be9

2018年8月11日土曜日

株式会社はてな業績修正




  • 検索エンジンからの来訪者が伸び悩んで広告売上が予想を下回った
  • 受託開発の一部の検収が当事業年度内に完了しない→開発が遅れているということ?
  • データセンター利用料が削減できた。AWS?
  • 採用活動や人員配置を慎重に進めたことで、・・・人員数が下回る・・・給与及び手当が予想費用より減少→人材が確保できなかった?
売上は落ちたがコストが削減できましたという、一方で開発は遅れましたという・・・。どこも人材確保は難しいのでしょうか。

PythonでPostgreSQL(テーブル作成〜)

PostgreSQLをPythonで操作するには、pycopg2が使えます。
ここではJupyterでの記述を想定していますが、コマンドラインでも同様です。

python 3.6
psql (PostgreSQL) 9.5.13
psycopg2                  2.7.5

Pycopg2接続

接続に関しては別ページに書いていますので下記を参照のこと。
Ubuntu:Python PostgreSQLをUbuntuで使う インストール〜psycopg接続
Windows:Python PostgreSQLをWindowsで使う。インストール〜接続


この例での設定はdb名:my_database、user名とpassはpostgresにしています。
juu#!/usr/bin/python
import psycopg2
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")
出力はこうなります。
 Connecting to database
 ->host='localhost' dbname='my_database' user='postgres' password='postgres'
Connected!

基本的には、cursor.execute('SQL command') を実行すればSQL操作ができます。

注意点など

・passwordは各自変更してください

・失敗したときは必ずロールバックする

失敗したあと、もう1度実行するとabortされているというエラーがでます
InternalError: current transaction is aborted, commands ignored until end of transaction block
ロールバック
conn.rollback()

保存するにはコミット。ロールバックすると、ここまで戻ります。
conn.commit()

・SQLコマンドは、cursor.execute()の中に書きます。
クォートはシングルクォートでもダブルでもOKです。
ただし、where=stringで文字列を与える場合、文字列は必ずシングルクォートにします。

・大文字小文字の区別はありません。SQLコマンドは大文字にするのが慣例になっていますが小文字でも動作します。大文字小文字の区別をつけるときはダブルクォートで囲みます。 テーブルの設計次第ですが、タイポが増えるので区別なしの方が楽ではないかと個人的に考えています。

・プレースホルダを使うときに"{0}"といったクォーテーションが増えるので、テーブル名は大文字を使わない方がよいと思います。

テーブルの作成、レコード挿入、検索、更新、削除、リセット


テーブル名: table1
項目:text1 文字列、time タイムスタンプ、num1,num2は整数とします
# timestamptz はタイムゾーン付きのタイムスタンプです。

cursor.execute('CREATE TABLE table1 (text1 text, time timestamptz, num1 integer, num2 integer)')

プレースホルダ%sを使ってレコードを入れます

cursor.execute('INSERT INTO table1 (text1 , time, num1, num2) VALUES(%s, %s, %s, %s)',('Taro','2000-08-01',42, 1000))
cursor.execute('INSERT INTO table1 (text1 , time, num1, num2) VALUES(%s, %s, %s, %s)',('Jiro','2010-08-01',90, 130))

SELECTで確認します。fetchしないとデータは出てこないので注意。
cursor.execute('SELECT * FROM table1')
cursor.fetchall()

[('Taro',
  datetime.datetime(2000, 8, 1, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=540, name=None)),
  42,
  1000),
 ('Jiro',
  datetime.datetime(2010, 8, 1, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=540, name=None)),
  90,
  130)]

WHERE で選択するときはプレースホルダ%sを使うとSQLインジェクション対策になります。(PHPとPosgreSQLの例ですが、こちらに詳しく書かれています
https://lets.postgresql.jp/documents/tutorial/with_php/against_sql_injection/placeholder/1)

プレースホルダが1つのときは、下の (42,) のように、タプルにします。

cursor.execute('SELECT * FROM table1 WHERE num1 = %s',(42,))
cursor.fetchall()

これは(42,)が(42)になっているのでエラーになります。
cursor.execute('SELECT * FROM table1 WHERE num1 = %s',(42))
cursor.fetchall()
TypeError: 'int' object does not support indexing

レコードを更新する
名前がTaroの行のnum1 を 50に更新する

cursor.execute('UPDATE table1 SET  num1 = %s WHERE text1 = %s', (50, 'Taro'))

レコードを削除する

cursor.execute('DELETE FROM table1 WHERE num1 = %s',(42,))
cursor.execute('SELECT * FROM table1')
cursor.fetchall()

プライマリキー

カラム(列)に同じ値が入らないようにするために主キー(PRIMARY KEY)を設定できます。主キーはテーブルに1つです。

cursor.execute('CREATE TABLE table1 (text1 text, time timestamptz PRIMARY KEY, num1 integer, num2 integer)')

Pandas データフレームにSQL結果を入れる

Pandas.DataFrame.read_sql_query(SQL, conn)

SQL: str SQL文
conn: このページでは conn=psycopg2.connect(conn_string)

import pandas as pd
df = pd.read_sql_query(
                        'SELECT * FROM table1',
                        conn
                        )
dfにSQLの結果が入ります。

その他のコマンド

存在するデータベースの名前を出力する
cursor.execute("SELECT datname FROM pg_database WHERE datistemplate=false")
cursor.fetchall()

テーブルの列名を見る。cursorが当たっていないとエラー
[desc[0] for desc in cursor.description]

Postgres DBに存在するテーブル名を全て出力
cursor.execute("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'")
cursor.fetchall()
これも同様にテーブル名を出力
cursor.execute("SELECT tablename as objectname FROM pg_tables WHERE schemaname = 'public'")
cursor.fetchall()

データベース名を調べる

cursor.execute("SELECT datid, datname FROM pg_stat_database;")
cursor.fetchall()

Postgresでは複数の接続(multiconnection)ができますが、その接続数を調べる方法。
cursor.execute('SELECT sum(numbackends) FROM pg_stat_database;')
print('number of conn', cursor.fetchall() )

2018年8月10日金曜日

ubuntu16.04にアンチウイルスソフトCalmAVを入れた

Linuxのウィルス対策ソフトは、メジャなものは8種類くらいあるそうですが、オープンソースだからということでClamAVを選びました。公式にも説明あり。名前がもうアダルトビデオレーベルとしか思えないんですけど・・・。まぁ仕方がありません。
https://help.ubuntu.com/community/Antivirus
https://help.ubuntu.com/community/ClamAV

参考

自分としては、-yコマンドをつけて全部イエスにはできないので(どのみちイエスなんですけど)

アップデートして
$ sudo apt update
calmAVをインストールします。
$ sudo apt install  clamav
ウィルスデータベースを更新します。
$ sudo freshclam
ウィルス判定されたら隔離するフォルダvirusを作ってから、スキャンします。
-r はディレクトリの再帰。
-iは検出ファイルのみを表示するオプフォンです。これがないと判定したファイルが延々と出てしまうわけですね。
$ mkdir ~/virus
$ clamscan -r -i --move=$HOME/virus .
実行すると何も表示されないまま放置することになります。
40分くらいで23万ファイル見終わりました。データベース上のウィルスは660万種類くらいだそうです。Total errors: 1となっていますけど、特に何も表示されていないんですけど・・・まぁ大丈夫なんでしょう。
----------- SCAN SUMMARY -----------
Known viruses: 6603884
Engine version: 0.100.1
Scanned directories: 27573
Scanned files: 232841
Infected files: 0
Total errors: 1
Data scanned: 12786.57 MB
Data read: 16588.08 MB (ratio 0.77:1)
Time: 2393.163 sec (39 m 53 s)

2018年8月5日日曜日

Pythonで地下鉄時刻表をスクレイピングする例

スクレイピングの例です。 

※自己流なので別にこういう手順と決まっていません
※追記: 時刻表がリニューアルされていて、htmlページは使えません※
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

大阪メトロ谷町線、天神橋筋六丁目駅の時刻表をスクレイピングします。時刻表の何時何分発という部分だけを抜き出します。

https://kensaku.osakametro.co.jp/subway/dia/jikoku/jikoku2606110201.html
ここを選んだのは特に理由がないのですが、日本一長い商店街があることで有名ですね。



こんな感じで、平日と土日祝で分かれていて、5時から23時までです。

モジュールをインポートします。
from bs4 import BeautifulSoup
import urllib.request

htmlから、BeautifulSoupでデータを取得

方法1 ブラウザからhtmlをダウンロードします。

右クリックで保存したら終了。htmlファイルを残したいときはこれで良いと思います。今回はtenjin6.htmlというファイル名にしました。

file = 'tenjin6.html'

with open(file, encoding='cp932') as f:
    contents = f.read()
    soup = BeautifulSoup(contents, 'lxml')

方法2 request.urllib でhtmlを取得します。

こちらの方が楽ではありますが、失敗することがあります。

・・・これは失敗します。
url = 'https://kensaku.osakametro.co.jp/subway/dia/jikoku/jikoku2606110201.html'
html = urllib.request.urlopen(url).read().decode('utf-8')  
soup= BeautifulSoup(html, "lxml")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 597: invalid start byte
ということで、文字エンコーディングが間違っていて、ソースファイルをよく見るとSHIFT-JISと書いてあります。日本語ならutf-8かshift-jisかEUC-JPのどれかがほとんどです。


url = 'https://kensaku.osakametro.co.jp/subway/dia/jikoku/jikoku2606110201.html'
html = urllib.request.urlopen(url).read().decode('shift-jis')  
soup= BeautifulSoup(html, "lxml")

これでsoupの準備ができました。次はfind_all()でタグで文字を抽出します。


ソースを読んでタグを確認する

抽出するときはその部分が含まれるタグを指定します。そのため、ソースから該当部分を探して、どういうタグで囲まれているかを確認します。


ソースを見ると、時刻は<TR>タグの中に入っているようです。soup.find_all('tr')と小文字で'tr'とします(大文字だとエラー)。

時刻は<th>の中、分表記は<div class="item"><div></div></div>の中にあるようです。
soup.find_all('th')
とすると、どのようにタグで抽出できるか分かります。

find_allの結果はリストになっているので、1つだけを指定するときは[0]が必要です。

tdタグの中に分、thタグの中に時間が入っていることが分かりました。
soup.find_all('td')[10:]
とすると全ての分のリスト、
soup.find_all('th')[6:]
とすると全ての時間のリストが得られます。

div内のクラス指定class="item"はこう書きます。
soup.find_all('div', {'class':'item'})
出力はタグも含めて抽出されるので .text とすると文字だけが得られます。

たとえば
soup.find_all('div', {'class':'item'})[0].text
とすると、スペースがユニコード変換されてしまって\u300014 になってしまいます。ちょっと面倒なので、もう1度、find_allを使います。

soup.find_all('div', {'class':'item'})[0].find_all('div', {'class':None})

最終的にはこうなりました。
hour = [i.text for i in soup.find_all('th')[6:]]
minute = []
for h_sche in soup.find_all('td')[10:]:
    minute.append([m_sche.text for m_sche in h_sche.find_all('div',{'class':None})])
for i,j in zip(hour, minute):
    print(i, j)
Out:
5 ['14', '24', '34', '44', '54']
5 ['14', '24', '34', '44', '54']
6 ['04', '14', '23', '32', '38', '44', '49', '54', '58']
6 ['04', '13', '24', '34', '44', '55']
7 ['01', '04', '08', '12', '16', '19', '23', '26', '29', '32', '35', '38', '41', '44', '47', '50', '53', '56', '58']
7 ['03', '07', '11', '16', '22', '28', '34', '40', '45', '52', '58']
8 ['01', '04', '07', '09', '12', '15', '17', '20', '22', '25', '27', '30', '32', '35', '38', '41', '44', '47', '50', '54', '58']
8 ['04', '09', '14', '19', '23', '29', '35', '41', '48', '54']
9 ['01', '05', '10', '15', '21', '27', '34', '41', '49', '56']
9 ['01', '08', '15', '22', '29', '35', '41', '49', '56']
10 ['04', '11', '19', '26', '34', '41', '49', '56']
10 ['04', '11', '19', '26', '34', '41', '49', '56']
11 ['04', '11', '19', '26', '34', '41', '49', '56']
11 ['04', '11', '19', '26', '34', '41', '49', '56']
12 ['04', '11', '19', '26', '34', '41', '49', '56']
12 ['04', '11', '19', '26', '34', '41', '49', '56']
13 ['04', '11', '19', '26', '34', '41', '49', '56']
13 ['04', '11', '19', '26', '34', '41', '49', '56']
14 ['04', '11', '19', '26', '34', '41', '49', '56']
14 ['04', '11', '19', '26', '34', '41', '49', '56']
////
これで時刻と分だけが抽出できました。
urlを変えていけば他の駅でも可能ですね。
かなり自己流ですが、参考まで。

2018年8月1日水曜日

日誌2018年8月

2018/08/01

Wineのインストールは諦めました。自分の手の届かないところがエラーになっている気がします。KindelがPC上で読めるのは便利なんですけど・・・それ以外の必要性はこれまでもなかったので、少し他の方法を考えたほうが良いですね。個人的には、本をめくってくれる腕ロボットが欲しいのですが。

2018/08/04

Gimalのインタフェースが変わったようです。体感ではかなり速くなっています。すごいなーとしか言えないのですが、よく考えたらもう10年くらい同じUIだったのでは。

Ubuntuがフリーズし始めたのでログアウトしました。おそらくマウスのUSBを抜き差ししたのが理由かと。常に動いているPythonスクリプトがあるのですが、nohupを使うようになったおかげで、ログアウトしても問題なくなりました。

loggingで.logファイルをTimeRotatesしているのですが、何故か日の切り替わりがJSTではなくグリニッジ標準時になっているような・・・20時40分くらいで切り替わっている気がします。あまり意味がないのですが。

2018/08/05

リーダブルコードを読んでもなかなか読みやすいコードは書けないものです。練習ですね。6時にスクリプトを起動するときに、

check_time = 6

と書いていたのですが、

check_hour = 6

の方がよいですね。timeだと回数、にもなりますし。

2018/08/05

久しぶりにTOEICを受けようと思うのですが、公式問題集を家で問いてみました。リスニングは後回しでリーディングだけ・・・75分で全問解けましたが、途中でバテてしまいました。100問中21問も間違ってしまいました。

2018/08/08

ソーシャルブックマークを作ろうかなと思っているのですが、いかんせんいろいろ壁がありますね。。

Google Cloud Platformの無料枠ってどれくらいあるんでしょう。こちらの方がサービスを立ち上げてサーバ代はGCP無料枠内だったと書いている。元DeNAの方なんですね。

bosyuというサービスを作って譲渡するまでの流れ

・商標出願:¥43,558・弁護士費用:¥128,000 (利用規約+譲渡契約チェック)・サーバーコスト(GCP):無料範囲内・ドメインやツール代とか:数万円・あとは大体人件費(役員報酬0円なので僕の稼働は0円計算)

初日で1300人リーチ、とかあってその後も伸びたようですが、それも含めて無料・・・?ドメイン、ツール代で数万円、とかでなかなか興味深いです。バイラルかー・・・。


2018/08/08

イラストやが嫌いです。Webページの図解で出てきたら概ね見る気を失ってしまうのですが・・・。今日はflaskを少々やりました。

2018/08/09

flaskのチュートリアルが分からない・・・エラーが出ても追えないのが辛い。サクサクできるかと思ったら手こずりそうです。

2018/08/10

久しぶりにCourseraをやっているのですが、字幕の和訳で貢献しよかな、とか思って少しだけはじめました。主に長さの問題で難しいですね、これは。
https://www.smartling.com/
Couseraではという翻訳補助サービスを使っているみたいです。まぁ気が利くソフトだなぁ。日本ではトラドスが主流なんでしたっけ・・・。

2018/08/12

何故か分かりませんが、今日は自宅のネット回線が早い気がします・・・お盆の日曜日だから?不思議です。

2018/08/15

flask tutorialは動きました。blog.pyの中身が抜けていたというオチ。テンプレートの理解が進みませんけど・・・。

メルカリが、バーコードを読んで出品するとポイントがもらえる、というキャンペーンをやっています。写真からの画像認識は精度が低いので、バーコードから正確な情報を取って学習データにしようとしているんでしょうね。1点のデータで30円分のコストということで、わりと気前が良いのかな、とも思えます。自分のスマートフォンでは、以前はバーコードが全く読めなかったのですが、読めるようになりました。

2018/08/17

flaskの中身を理解しようとしています。

HUAWEI P10を使っていて、タイマー表示がドラムロールしかできなくて嘆いていたのですが、システムアップデートによって、時計やカレンダーから選択できるようになりました。


2018/08/20

レンタルサーバかVPSを借りようかと思って調べていたものの、あまりにネットでの悪評が多すぎて少しゲンナリしています。→別記へ移動


2018/08/23

GitHubからのcloneがめちゃくちゃ遅い気がします。100kB/secとか。ネット回線がぶちぶち切れるのと関連しているんでしょうか。検索してみてもあまり根本的な解決策が出てきませんでした。

Ubuntu20.04でKindleと楽天koboを見る


KindleアプリはWindowsかMac用なのでそのままではUbuntuで使えません。
また、ブラウザ用のKindleクラウドリーダーでは読めない本が多いです。

Wineというソフトを入れてWin用のアプリ(.exe)を使えるようにします。

---
(2021年ごろからネットワークが繋がらなくなったのでwineとkindleの組合せをアップデートしました。)

(動作する組合せを探していたときに、どのKindleバージョンも動きませんでしたが、wineを入れ直したら上手くいきました。)

存在するバージョンを探して一番新しいものを使うことに。
$ apt policy winehq-stable

(以下で 6.0.1~focal-1を使っています)

wineをアップデート
$ sudo apt install --install-recommends winehq-stable=6.0.1~focal-1 wine-stable=6.0.1~focal-1 wine-stable-amd64=6.0.1~focal-1 wine-stable-i386:i386=6.0.1~focal-1

Kindleは1.32が動きました。
$ wine kindle-for-pc-1-32-61109.exe

wincfgのwindowsバージョンは10


なおKindleのアンインストールはこのように
$ wine uninstaller

参考
https://forum.winehq.org/viewtopic.php?f=2&t=34810


Wine本体の対応表がありますが、更新されていないので意味ないかも。
https://appdb.winehq.org/objectManager.php?sClass=application&iId=10597


1.31で入れている事例紹介
https://text.baldanders.info/remark/2019/05/kindle-for-wine/
http://pineplanter.moo.jp/non-it-salaryman/2020/03/15/post-8160/


直接ディレクトリにファイルを入れる


~/.wine/drive_c/users/<user>/My Documents/My Kindle Content

として、PC側のディレクトリに直接ファイルを入れて、Kindleアプリで表示することができます。

===

Wineインストール方法(古い)

https://wiki.winehq.org/Ubuntu
のとおりでインストールはできました。バージョンが変わっていて、古い版でないと合わなかったりするので注意。

環境:
ubuntu16.04
wine 4.0
winはWindows7を選択
kindle-for-pc-1-16-44025.exe


64bitマシンで32bitとして使えるようにする
sudo dpkg --add-architecture i386 
wineのレポジトリキーをダウンロード(2018年12月で変更されたとのこと)
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
Ubuntu16.04用のレポジトリ
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ xenial main'
18.10, 18.04用はcosmic, bionicと変える
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ cosmic main'
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'

アップデートしてからwinehq-stableをインストール
sudo apt update
sudo apt install --install-recommends winehq-stable
これでインストール完了。winecfgを起動して設定します。Win7にしています(深い意味はなし)
winecfg

kindleのダウンロード

kindle-for-pc-1-16-44025.exeをダウンロードしてきて、実行します。

(失敗したときのメモ)
kindle-for-pc-1-9-0-build-38364-en-win.exeだと無限ループになりました。




起動したものの、ログインできない・・・。下記を読むと、このバージョンだとループするので低いバージョンを使うようです。
https://www.write-ahead-log.net/entry/2018/12/15/130356
https://atsreport.blogspot.com/2018/02/kindle-wine-on-linux.html


KOBOのダウンロード

楽天のサイトからhttps://books.rakuten.co.jp/info/introduction/e-book/
Windows用のファイル、setupkobo.exeをダウンロードします。

右クリック→OpenWith→Wine で起動できました。日本語文字化けは解決できていません(2020/03/22)
参考:http://yu39n.blog.fc2.com/blog-entry-49.html

これもダメでした
LANG=ja_JP.UTF-8 wine './.wine/drive_c/Program Files/Kobo/Kobo.exe'
LANG=ja_JP.UTF-8 wine setupkobo.exe

./.wine/drive_c/Program Files/Kobo/fonts
にフォントファイルをコピーしたりしてもダメでした。

Wineconfig自体は
LANG=ja_JP.UTF-8 winecfg
とやると日本語になりますので、Wineではフォント自体は使えているようです。

 LANG=ja_JP.UTF-8 wine '.wine/drive_c/Program Files/Kobo/Kobo.exe'
これだとトーフフォントで起動するので正解に近そうです。
あとはフォントをKoboが認識できていないのが問題でしょうか。


ーー

文字化けの解決

本の中の日本語は何もしなくても大丈夫でしたが、メニューは文字化けするようです。
ここが参考なりました。
https://wiki.archlinux.jp/index.php/Wine

winetricksのエラー

You are using a 64-bit WINEPREFIX. If you encounter problems, please retest in a clean 32-bit WINEPREFIX before
というエラーが出るのは32-bitにしたらOK。
https://lubtech.geo.jp/2018-06-22/?p=6292

Takaoフォントを入れようとしてエラー


sha1sum mismatch!  Rename /home/<user>/.cache/winetricks/takao/takao-fonts-ttf-003.02.01.zip and try again.

これはwinetricksを入れ直すと解決。
https://askubuntu.com/questions/749549/winetricks-sha1sum-mismatch-rename-and-try-again

最終的に

$ winetricks corefonts
$ winetricks allfonts
でフォントがインストールされて、日本語フォントになりました。フォントを指定する方法は不明ですが・・・。




アップデートしたあとの表示

他のsoftもインストールせよとのこと。とりあえず大丈夫でしたが、kindleはアップデートしないで動かしています。