TIL

Today I Learned. 知ったこと、学んだことを書いていく

Cookieを使う - bottle

bottleでCookieを使う

  • Cookieの保存:response.set_cookie
  • Cookieの取得:request.get_cookie
  • 署名をする(secretを設定する)ことで少しはセキュアになる

Cookieの保存

response.set_cookie('userId', 'tamago', max_age=15552000)

max_ageを設定しないと、ブラウザを閉じてしまうと消えてしまう

Cookieの取得

request.get_cookie('userid')

Cookieの削除

response.delete_cookie('userid')

サンプルコード

以下のようなmain.pyを作成する

max_ageを設定しなかった場合、ブラウザを閉じてしまうとCookieは消えることを確認してみた

from bottle import route, run, response, request


@route('/test1')
def test1():
    # max_ageは設定しない
    response.set_cookie('userId', 'tamago')
    return 'クッキーに保存'

@route('/test2')
def test2():
    return f'クッキーから取得{request.get_cookie("userId")}'

run(host='localhost', port=3000, debug=True, reloader=True)
  1. localhost:3000/test1 にアクセス:Cookieに名前がuserIdで値がtamagoを保存

  2. localhost:3000/test2 にアクセス:「クッキーから取得tamago」が表示

一回、ブラウザを閉じて localhost:3000/test2 にアクセスすると、「クッキーから取得None」が表示される。これは、max_ageを設定していないため消えてしまった

Cookieの署名

Cookieはクライアント側で改変できてしまうため、サーバー側で設定したものかどうかを確認しないといけない。そのために、Cookieを保存、取得するときに署名キーを引数に渡すこと。署名キーが一致しなければ、Noneが返されるようになっている。

secretに署名キーを設定する

# 保存
response.set_cookie('name', 'tamago', secret='secret-key-abc')

# 取得
request.get_cookie('name', secret='secret-key-abc')

Tutorial — Bottle 0.13-dev documentation

参考文献

equal to 操作の "Japanese_CI_AS" と "Japanese_CS_AS_KS_WS" 間での照合順序の競合を解決できません。 ってエラー

英訳すると

Cannot resolve the collation conflict between %1 and %2 in the %3 operation

複数のテーブルで照会順序が合っていないときにおこる?

sql server - Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation - Stack Overflow

以下のSQLでテーブル内の照合順序を確認したが、一致しているか確認できる。

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

全てのテーブルの荘厳順序が一致していなかった!!

参考文献

DB接続のタイムアウト - VB.NET

タイムアウトには「コネクションタイムアウト」と「コマンドタイムアウト」の2つがあるらしい。

タイムアウト時間を設定するためのプロパティがある

タイムアウト時間の初期値

タイムアウトに0を設定すると、無期限になる。これは、ずっと待ってしまうため、危険かな?

サンプルコード

SqlConnectionにタイムアウト時間を設定

' タイムアウト時間を1分に設定
Dim SECONDS as Integer = 60
Dim TIMEOUT=MIN As Integer = 1
sqlCon = New SqlConnection("Data Source = " & SERVER_NAME &
                                        ";Initial Catalog = " & DATABASE_NAME &
                                        ";User ID = " & USER_ID &
                                        ";Password = " & PASSWORD &
                                        ";Connection Timeout = " & SECONDS * TIMEOUT_MIN)

タイムアウトの時間は初期値で、リトライする処理でもいいのかもって思った

SqlCommandにタイムアウト時間を設定

Dim sqlCmd As New SqlCommand With {
            .Connection = SqlCon,
            .CommandType = CommandType.Text,
            .Transaction = tran,
            .CommandTimeout = SECONDS * TIMEOUT_MIN
        }

参考文献

redirectする - bottle

bottleでリダイレクトをする方法

/abcにアクセスしたら、/defにリダイレクトしたい

from bottle import route, run
from bottle import redirect


@route('/abc')
def test1():
    redirect('/def')


@route('/def')
def test2():
    return 'defのページ'


run(host='localhost', port=3000, debug=True, reloader=True)
  • redirectをインポート
  • redirect(リダイレクト先のURL)でリダイレクトできる

/abcにアクセスすると、/defに飛ばされて、「defのページ」って表示された

/abc?name=fafie;afjiekafjdif;ejgnieaojfeとかのときに使えるかな?

参考文献

__init__.pyについて

Pythonでの__init__.pyについて調べてみた

__init__.pyの役割

  • __init__.pyがあるディレクトリをパッケージとして扱えるようになる(Python3からは__init__.pyが無くてもパッケージとして認識されるようになった)
  • 初期化処理を記述できる

パッケージとして扱えるようにする

以下のようなフォルダを作成する

.
├── pkg
│   ├── __init__.py
│   └── import_test.py
└── test.py
# ./pkg/import_test.py
print('import_test.py is imported!')

def print_name():
    print(__name__)
# ./test.py
from pkg import import_test

if __name__ == '__main__':
    import_test.print_name()

pkg内に__init__.pyを作成しておくだけで、pkgをパッケージとして扱えるようになる。パッケージ内のファイルにインポートするにはfrom パッケージ名 import ファイル名とする

test.pyの実行

$ python test.py
import_test.py is imported!
pkg.import_test

参考文献

Windows10でディスク使用料が高くなったときの対処

タスクマネージャー> リソースモニター で見てみると、以下のプロセスがディスク使用量が高かった。不要なものは停止して、様子を見てみた

  • CompatTelRunner.exe

CompatTelRunner.exe

CompatTelRunner.exeは「カスタマーエクスペリエンス向上プログラム」というものの一種らしい。プログラムの利用統計をMicrosoftに送るらしい。いらないこれ!!

停止する

タスクマネージャー > タスクスケジューラライブラリ > Microsoft > Windows > Applicasion Experience > Microsoft CompatTelRunner を選択し、「終了」と「無効」を行う。

Microsoft > Windows > Applicasion Experience > ProgramDataUploader も「無効」にしておいた。

参考文献