Великолепные фотографии из СССР 60х годов: Marc Riboud — RUSSIA, 1960-63.
© Марк Рибу
С удивлением обнаружил, что в Python декоратор нужно обязательно объявлять до его первого использования.
Выложил фотографии гей-парада, который проходил в минувшее воскресенье в Сан-Франциско. Ниже фликровское слайд-шоу (нужен флеш), а вот прямая ссылка на фотографии.
Там же был махонькая демонстрация пуританских гомофобов против геев, лесбиянок и прочей угрозы национальной безопасности США (я серьезно, на одном плакате так и написано). Прямая ссылка на фотографии, слайдшоу ниже:
(06-24) 13:20 PDT ЮЖНОЕ САН-ФРАНЦИСКО — Бездомный врезал скейтбоурдом по лицу другого бездомного в результате спора на тему квантовой физики и расщепления атомов. SFGate
Интересное случилось на работе. Началось всё с того, что некоторые тесты при своем падении начали тащить за собой весь фреймворк. Т. е. выполняется тест, в тестируемом файле вылезает какая-нибудь ошибка и, вместо того, чтобы записать её в лог и красиво закончить работу, вся тестинговая подсистема падает с сообщением AttributeError: 'NoneType' object has no attribute 'startswith'. Это проявлялось только у меня на компьютере, поэтому, вооружившись дебаггером, я начал ковырять один такой тест.
Сразу выяснилось, что traceback.extract_tb иногда возвращал None вместо содержимого строки, на котором произошла ошибка. Далее джанга пыталась безуспешно вызвать метод startswith у None в результате чего и падала .
Функция extract_tb возвращает None вместо содержимого строки только тогда, когда исходный текст модуля не доступен. Я начал дебаггить модули traceback и linecache, чтобы понять почему мы не можем прочитать прекрасно читаемый файл и обнаружил чудесное:
(Pdb) tb.tb_frame.f_code
<code object click at 0x10894e8, \
file "/home/anton/disqus/disqus/contrib/selenium.py", line 268>
Дело в том, что у меня ни то, что этого файла, у меня даже /home на компьютере нет (на OS X пользовательские директории находятся в /Users). Т. е. в какой-то момент исключение генерировалось из несуществующего файла (cправедливости ради, стоит отметить, что правильная мысль о причине AttributeError у меня была ещё в самом начале, но я её почему-то отбросил). Увидев это, я понял отчего несуществующие файлы у меня бросаются исключениями. Осталось только провести небольшой эксперимент: найти правильный selenium.py, изменить дату модификации и запустить тест заново.
Всё дело в том, что я какое-то время пользовался этой же инсталляцией с удаленной линукс машины, монтировав директорию через sshfs. Линуксовый питон создавал .pyc файлы а, поскольку файл с того момента не менялся, мой текущий питон файлы не пересобирал и соответственно модуль selenium думал, что он находится по старому адресу и этот адрес отдавал дальше по запросу. Модуль traceback, получив такой адрес, пытался прочитать исходный текст файла, не находил его и возвращал None.
Скопировал с фотоаппарата и выложил в сеть фотографии, которые я сделал в музее компьютерной истории, что в Маунтин-Вью.
Сегодня был в компании Slide на докладе о MongoDB. MongoDB это высоко-производительная, документо-ориентированная система без формальной схемы базы данных (если я правильно перевел high-performance, document-oriented schema-free database). Половину доклада можно было, в принципе, прочитать у них на сайте, а вот вторая половина — про автоматический шардинг — получилась весьма интересной.
Мы, на работе, тоже используем Монго, но пока только для нескольких небольших проектов. К примеру, все данные для нашего шортера адресов хранятся именно в этой базе данных.
Кстати, интересный факт: поскольку шелл для этой базы данных написан с использованием джаваскрипта, они используют джаваскрипт-интерпретатор. Так вот, раньше они пользовались V8, но недавно переключились на SpiderMonkey. Сегодня я спросил у авторов о причине и оказалось, что V8 очень трудно портировать на 64 битные системы. Вот и весь интересный факт.
В Сан-Франциско холодно и нет солнца и это не смотря на то, что сейчас лето. Последние два-три дня вообще постоянные тучи и туманы.
Нашел себя среди официальных фотографий с Google I/O.