旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【Python】 PythonでC#のFileSystemWatcher相当のクラスを作成する

C#側がファイルを作成し、それをトリガとしてpythonが起動するようにしたいと思っています。そのため、C#のFileSystemWatcherに相当するようなクラスが欲しいと思ったのですが、以下のサイトに書かれていました。 qiita.com

import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class MyFileEventHandler(PatternMatchingEventHandler):
    def __init__(self, patterns):
        super(MyHandler, self).__init__(patterns=patterns)

    def on_moved(self, event):
        # ファイルが移動した時に実行されるメソッド
        print('file moved')

    def on_created(self, event):
        # ファイルが作成された時に実行されるメソッド
        print('file created')

    def on_deleted(self, event):
        # ファイルが削除された時に実行されるメソッド
        print('file deleted')

    def on_modified(self, event):
        # ファイルが更新された時に実行されるメソッド
        print('file modified')

# MyFileEventHandlerの使い方例
if __name__ == '__main__':
    # イベントを発生させるファイルパターン
    file_pattern_to_watch = '*.txt'
    # MyFileEventHandlerを生成して
    event_handler = MyFileEventHandler(file_pattern_to_watch)
    # Observerに登録する
    file_system_watcher = Observer()
    file_system_watcher.schedule(event_handler, directory_to_watch, recursive=False)
    # 監視を開始
    file_system_watcher.start()
    # 指定時間待つ
    time_out_sec = 30
    file_system_watcher.join(time_out_sec)
    # タイムアウトが起きたかどうか調べる
    if file_system_watcher.isAlive():
        # メモ:実際にタイムアウトが起きたらkillするしかない?
        print('timeout happened')

【WPF】 モニターの解像度を取得する

  • System.Windows.PrimaryScreenWidth
  • System.Windows.PrimaryScreenHeight

で取得できます。

以下のサイトがよくまとまった情報源になります。

mseeeen.msen.jp

【WPF】 透明なウインドウの作り方

XAMLのWindowタグに下記3つを加えるだけです。作ってみると完全に透明なウインドウが作成され、ウインドウ右上部の×ボタンも消えてしまいました。そのため、例えばEscボタンを押したらWindowをCloseするような処理が必要でした。

  • WindowStyle=“None”
  • AllowsTransparency=“True”
  • Background=“Transparent”


参考にしたサイトは以下です。

www.atmarkit.co.jp

【Python】 動的なデフォルト引数を指定するときにはNoneとドキュメンテーション文字列を使う

書籍”Effective Python”項目15のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

Pythonはデフォルト引数をモジュールロード時の一回しか評価しないので、動的な値をデフォルト引数にはしないように、という話でした。

from datetime import datetime
import time

# 動的な型をデフォルト引数にしてみる
def bad_example(when=datetime.now()):
    print(when)

# 時刻が表示される
bad_example()
# 一秒待つ
time.sleep(1)
# 上と同じ時刻が表示される
bad_example()

書籍ではこのような時はデフォルト引数にNoneを指定してドキュメンテーション文字列で振る舞いを書いておくことを勧めています。

def good_example(when=None):
    """
    when: datetime of when the function is called.
          Defaults to the present time.
    """

    when = datetime.now() if when is None else when
    print(when)

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 クロージャ内外で変数を共有する

書籍”Effective Python”項目15のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

Pythonにはnonlocalというキーワードがあり、これによりクロージャ内外でデータを共有できるようです。

def outer_func1():
    found = False
    def inner_func():
        # outer_func1のfoundとは別の変数
        found = True
    inner_func()
    print(found)
# Falseと表示される
outer_func1()

def outer_func2():
    found = False
    def inner_func():
        # 変数foundを外と共有
        nonlocal found
        found = True
    inner_func()
    print(found)
# Trueと表示される
outer_func2()

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

【Python】 サーバーの現在時刻を取得する

Raspberry PiからサーバーのMySQLデータベースにセンサデータを書き込む時に、センサデータ取得時刻も書き込んでいるのですが、Raspberry Pi側の現在時刻がやたらずれるため、サーバーの現在時刻を取得して補正しておくことにしました。サーバーの現在時刻を取得する方法は下記になります。

from datetime import datetime
import MySQLdb

# DBと接続
connection = MySQLdb.connect(ip_address, user, password, db_name)
cursor = connection.cursor()
# サーバーの現在時刻を取得
cursor.execute('SELECT NOW()')
date_time_on_server = cursor.fetchone()[0]

【Python】 enumerateのカウンタ初期値を設定する

書籍”Effective Python”項目10のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

enumerateは知っていたのですが、カウンタの初期値を第二引数で設定できることを知りませんでした。

numbers = [1, 2, 3]
# iは1から始まる
for i, number in enumerate(numbers, 1):
    print('%d: %d' % (i, number))

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目