2018/11/30

[Python] datetime のコンストラクタでタイムゾーンは指定しない方がよい

以下を見てください。
日本のタイムゾーンが `+9:19` になってしまいました。

```python
>>> import datetime, pytz
>>> datetime.datetime(2018, 9, 1, tzinfo=pytz.timezone('Asia/Tokyo'))
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=)
```

調べてみると、pytz 2017.2 以降を使う場合、上記のような動作になるようです。

原因については、以下のコメント欄が参考になります。(以下の記事で触れているのは `replace` でタイムゾーン指定した場合ですが、コンストラクタで指定した場合も同様)

> 参考
>
> [pytzの仕様が変わっている - Qiita](https://qiita.com/higitune/items/0ca244373d380cf1c060)


簡単に言うと、「複数のタイムゾーン(UTC オフセット)を持つエリアでは、日付が決まらないとオフセットが決定できないので、
勝手にデフォルトのオフセットが採用される」ということのようです。

一般的に「複数のタイムゾーンを持つエリア」といえば、サマータイムがあるようなエリアで、日本は当てはまらない気がします。
ところが、日本は 1887年以前は今とは異なるタイムゾーン (`+09:18:59`9:19:00 ではない。pytz は秒まで持てないからね…) だったそうです。

> 参考
>
> [一行入魂 PostgreSQLのtime zoneについて](http://aoyagikouhei.blog8.fc2.com/blog-entry-61.html)

pytz 2017.2 以降はこれを厳密に守るようになったということみたいですねとはいえ、100年以上前のタイムゾーンがデフォルトってどうなのよ?と思いますが…。

というわけで、aware な datetime オブジェクトを作成するには、
一度 native で作成してから aware に変換するのが正しいやり方のようです。

```python
>>> import datetime, pytz
>>> dt = datetime.datetime(2018, 9, 1)
>>> pytz.timezone('Asia/Tokyo').localize(dt)
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=)
```

今回、たまたま日本のタイムゾーンで問題が起こって調べましたが、他のタイムゾーンサマータイムがあるなどでは同じ問題が前からあったということですね多分。確認はしていないけど。
2018/11/22

GNOME 3 でマウントドライブをデスクトップに表示しないようにする方法

@GNOME 3.28.2

gvfs でいろいろマウントしているとデスクトップがゴチャゴチャになってくるアイコンが被ったりする。バグだよなぁ…ので、アイコンを表示しないように出来ないか調べてみた。

結論から言うと、dconf の `/org/gnome/nautilus/desktop/volumes-visible` を OFF にすればよい。
2018/11/09

[Python] mmap.flush で OSError が出る場合、アラインメントが不適切な可能性あり

Python の [mmap](https://docs.python.jp/3/library/mmap.html) は `flush()` を実行することで変更をディスクに保存します。

この `flush([offset[, size]])` を引数つきで呼ぶときは 「`offset` が `mmap.ALLOCATIONGRANULARITY` の倍数でないといけない」という制約がありますエラーメッセージにその旨出して欲しい。

つまり、以下のように、`offset` の位置を調整しないといけません。

```python
aligned_offset = int(offset / mmap.ALLOCATIONGRANULARITY) * mmap.ALLOCATIONGRANULARITY
mm.flush(aligned_offset, offset - aligned_offset + size)
```

> 参考
>
> [Issue 32798: mmap.flush() on Linux does not accept the "offset" and "size" args - Python tracker](https://bugs.python.org/issue32798)


`offset` の調整をしないと、`OSError` が発生してしまいます。
```
OSError: [Errno 22] Invalid argument
```

最初、このエラーが発生した時、指定した範囲が不正なんじゃないか等、無駄に調べてしまいました…
2018/11/01

GSettings と dconf の関係

「GNOME 3 の設定は [dconf](https://wiki.gnome.org/Projects/dconf) という設定管理システムに保存されていて、[GSettings]([GSettings](https://developer.gnome.org/platform-overview/stable/tech-gsettings.html.en) はそのラッパー」という程度に理解していたのですが、
[Vino の設定をしたり](https://kokufu.blogspot.com/2018/10/ubuntu-1804-vino.html) するうちに、理解が深まってきたのでまとめておこうと思います。

> 参考
>
> [First steps with GSettings – GTK+ Development Blog](https://blog.gtk.org/2017/05/01/first-steps-with-gsettings/)

dconf の schema id と schema path の関係

dconf は設定値を一意に決定する際、`schema id` と `schema path` という2種類の文字列を使用します。

`schema id` は "."(ピリオド)区切りの文字列で、`gsettings` でキーを指定する際のデフォルトです。
これに対し、`schema path` は  "/"(スラッシュ)区切りの文字列で `dconf-editor` の上部に表示されています。