Safariのオートコンプリート

ログインが必要なサイト内で、ログインフォームとは別の画面にtype="password"の入力フォームがある場合、ログイン時のユーザー名とパスワードが勝手に補完されるというケースがあった。

結果的に意図しないパスワードの更新が走ってしまうという、よろしくない不具合。


autocomplete="off"で補完を拒否できるらしい、というので設定してみたが効かない。

Safari: 一部の Web サイトでは AutoFill 機能がオフになります

Safari は、Web サイトの作成者が使用する AutoComplete="off" フラグを尊重します。

って書いてあるけど。バージョンが違うのか。。


ユーザー側では、Safariの設定で補完オフにすることができるが、公開サイトでユーザーが多数の場合などは、Safariの設定を強制できない。


以下のエントリで解決策が見つかってとりあえず凌げましたとさ。

Safariのオートコンプリートの不思議な挙動 - Qiita

Django Queryset AggregationでDBによって結果が異なるケース

DBがmysqlsqliteかによって、テストが落ちたり成功したりするケースがあったので原因をメモしておく


DateTimeFieldを持つモデル

from django.db import models


class Entry(models.Model):
    last_updated = models.DateTimeField(auto_now=True)


aggregateした結果、

        qs = Entry.objects.all().aggregate(Max('last_updated'),
                                         Min('last_updated'))
        print qs["last_updated__max"]
        print qs["last_updated__min"]


MySQLの場合

2014-09-23 04:34:32+00:00
2014-09-23 04:34:32+00:00

sqliteの場合

2014-09-23 04:33:54.706257+00:00
2014-09-23 04:33:54.706257+00:00


以上のようにMySQLの場合はmicrosecondが取得されていなかった


なので以下のサンプルのようなテストはsqliteでは通るがmysqlでは通らないことになる。

class EntryTest(TestCase):
    def test_save(self):
        entry = Entry.objects.create()

        qs = Entry.objects.all().aggregate(Max('last_updated'),
                                           Min('last_updated'))

        self.assertEquals(qs["last_updated__max"], entry.last_updated)
        self.assertEquals(qs["last_updated__min"], entry.last_updated)

本番で使用するDBで通るようにテストを書けばよいと思うけど、microsecondを0に合わせてやれば、mysqlでもsqliteでも通すことはできる。

class EntryTest(TestCase):
    def test_save(self):
        entry = Entry.objects.create()

        qs = Entry.objects.all().aggregate(Max('last_updated'),
                                           Min('last_updated'))

        expected = entry.last_updated.replace(microsecond=0)
        self.assertEquals(qs["last_updated__max"].replace(microsecond=0),
                          expected)
        self.assertEquals(qs["last_updated__min"].replace(microsecond=0),
                          expected)

Pythonで日本の祝日判定をするスクリプト

Pythonで日本の祝日判定をするスクリプトを見つけたので触ってみた。

参考:AddinBox(祝日マクロ-5)


何故かsysとmathのimport文がないので追加した。



使い方はholiday_name関数にdateオブジェクト、もしくは年月日をintで渡すだけ。

以下の使い方サンプルはdateオブジェクトを渡している

# coding=utf-8
import jholiday
import datetime


target_date = datetime.date(2013, 12, 31)

for i in range(0, 364):
    target_date += datetime.timedelta(days=1)

    holiday_name = jholiday.holiday_name(date=target_date)
    if holiday_name is not None:
        print target_date, holiday_name


実行結果

2014-01-01 元日
2014-01-13 成人の日
2014-02-11 建国記念の日
2014-03-21 春分の日
2014-04-29 昭和の日
2014-05-03 憲法記念日
2014-05-04 みどりの日
2014-05-05 こどもの日
2014-05-06 振替休日
2014-07-21 海の日
2014-09-15 敬老の日
2014-09-23 秋分の日
2014-10-13 体育の日
2014-11-03 文化の日
2014-11-23 勤労感謝の日
2014-11-24 振替休日
2014-12-23 天皇誕生日

Pythonでバージョンナンバーを比較する

2.6.4のようなバージョンを表す文字列を比較したい。

関連:MySQLでバージョンナンバーをソートする - brainstorm


pythonの場合はdistutils.verson.StrictVersionが使える。



ただしStrictVersionは"1"のように数字のみだとバージョンとして扱えず、ValueErrorになる。