Мультиаплоад файлов, версия N
Еще с давних времен, когда интернет был молодым и медленным, самым распространенным браузером был не IE, а Mosaic, в интернет не ходили, а дозванивались… меня часто мучал вопрос — почему в файловых диалогах можно выбрать всего один файл? Почему если в форме есть три файловых поля, то в каждое из них надо тыкать? Неужели нельзя удобнее?
Шло время, появился javascript, CGI, но файлополя были все также эгоистичны. Потом появился флеш, html5, ситуация начала меняться, но… Файловое поле имеет ту-же самую суть — файл, а не файл
ы! Хотя есть множество обходных методов…
Читать дальше →
Еще с давних времен, когда интернет был молодым и медленным, самым распространенным браузером был не IE, а Mosaic, в интернет не ходили, а дозванивались… меня часто мучал вопрос — почему в файловых диалогах можно выбрать всего один файл? Почему если в форме есть три файловых поля, то в каждое из них надо тыкать? Неужели нельзя удобнее?
Шло время, появился javascript, CGI, но файлополя были все также эгоистичны. Потом появился флеш, html5, ситуация начала меняться, но… Файловое поле имеет ту-же самую суть — файл, а не файл
ы! Хотя есть множество обходных методов…
Читать дальше →
[Из песочницы] Пишем модуль для авторизации в VK API
На днях возникла необходимость сохранить все фотографии из своего фотоальбома ВКонтакте на жесткий диск. Естественно, вариант, с сохранением фотографий по одной, меня не устроил. Тут вспомнилось, что у ВКонтакте есть
API. Пять минут чтения мануалов, и все нужные функции найдены. Единственная проблема – не существует нормального способа, для получения доступа к API. В
документации сказано следующее:
Процесс авторизации приложения состоит из 3-х шагов:
- Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
- Разрешение пользователем доступа к своим данным.
- Передача в приложение ключа access_token для доступа к API.
На первый взгляд, набросать простенький портабельный скрипт не получится. Хотя, что мешает нам притвориться браузером?
На днях возникла необходимость сохранить все фотографии из своего фотоальбома ВКонтакте на жесткий диск. Естественно, вариант, с сохранением фотографий по одной, меня не устроил. Тут вспомнилось, что у ВКонтакте есть
API. Пять минут чтения мануалов, и все нужные функции найдены. Единственная проблема – не существует нормального способа, для получения доступа к API. В
документации сказано следующее:
Процесс авторизации приложения состоит из 3-х шагов:
- Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
- Разрешение пользователем доступа к своим данным.
- Передача в приложение ключа access_token для доступа к API.
На первый взгляд, набросать простенький портабельный скрипт не получится. Хотя, что мешает нам притвориться браузером?
Читать дальше →
[Перевод] Я неправильно работаю с HTTP
Пару месяцев назад я пришел к выводу, что я неправильно работаю с HTTP. И я настолько глубоко в этой кроличьей норе, что уже практически невозможно что либо исправить.
Главная проблема в том, что я никогда не добавлял достаточно абстракций в свои HTTP-библиотеки.
Объекты запроса и ответа (request и response) практически не скрывают деталей HTTP. Я имею в виду, что вы не можете просто сериализовать эти объекты и ожидать что все будут работать. Сериализация возможно работает для response объектов в werkzeug (веб фреймворк автора) и других библиотеках и фреймворках. Если вы хорошо знаете внутренности своей библиотеки, то вы возможно сможете сериализовать и Request объект.
Но главное, что это не было предусмотрено при проектировании этих фреймворков — все они тонкие обертки над внешними ресурсами — над TCP соединением с браузером.
Читать дальше →
Пару месяцев назад я пришел к выводу, что я неправильно работаю с HTTP. И я настолько глубоко в этой кроличьей норе, что уже практически невозможно что либо исправить.
Главная проблема в том, что я никогда не добавлял достаточно абстракций в свои HTTP-библиотеки.
Объекты запроса и ответа (request и response) практически не скрывают деталей HTTP. Я имею в виду, что вы не можете просто сериализовать эти объекты и ожидать что все будут работать. Сериализация возможно работает для response объектов в werkzeug (веб фреймворк автора) и других библиотеках и фреймворках. Если вы хорошо знаете внутренности своей библиотеки, то вы возможно сможете сериализовать и Request объект.
Но главное, что это не было предусмотрено при проектировании этих фреймворков — все они тонкие обертки над внешними ресурсами — над TCP соединением с браузером.
Читать дальше →
Делаем бэкап музыкальной базы vkontakte с помощью Python
Год назад я захотел в машину флешку с винегретом из музыки, которая была у меня в плейлисте контакта. А там, к слову, почти 1400 треков.
Итак, первое, что я сделал — октрыл список расширений оперы и набрал в поиске «vkontakte». Но вот оказия, все приложения предлагали качать по одному треку, в основном добавляя рядом с ним кнопочку «скачать». В принципе, это удобно, если надо стянуть оттуда один-два трека, но вот если их 1400…
Следующий моим шагом было открытие страницы с музыкой и внимательная медитация над ней, с целью распарсить страницу, выдрав оттуда ссылки и названия. Слегка подумав, я решил, а почему бы снова не использовать вконтактовый API? Ведь опыт использования у меня уже есть (писал десктопный плеер на Qt). Но лепить полноценное приложение, тем более на плюсах или каком-либо другом языке, мне показалось слегка не умным решением. И тут я подумал — черт возьми, есть же python, наклепаю скрипт и стяну все. Итак, выбор сделан, начинаем кодить.
Год назад я захотел в машину флешку с винегретом из музыки, которая была у меня в плейлисте контакта. А там, к слову, почти 1400 треков.
Итак, первое, что я сделал — октрыл список расширений оперы и набрал в поиске «vkontakte». Но вот оказия, все приложения предлагали качать по одному треку, в основном добавляя рядом с ним кнопочку «скачать». В принципе, это удобно, если надо стянуть оттуда один-два трека, но вот если их 1400…
Следующий моим шагом было открытие страницы с музыкой и внимательная медитация над ней, с целью распарсить страницу, выдрав оттуда ссылки и названия. Слегка подумав, я решил, а почему бы снова не использовать вконтактовый API? Ведь опыт использования у меня уже есть (писал десктопный плеер на Qt). Но лепить полноценное приложение, тем более на плюсах или каком-либо другом языке, мне показалось слегка не умным решением. И тут я подумал — черт возьми, есть же python, наклепаю скрипт и стяну все. Итак, выбор сделан, начинаем кодить.
Открываем Geany и пишем первые строчки… И вот тут-то моя фантазия и желание лепить комбайны из ничего опять разыгрались. Дальше под катом.
Читать дальше →
Еще о кэшировании в Django
Все знают, что такое кэширование и зачем оно нужно. Посещаемость растет, нагрузка на базу данных увеличивается, и мы решаем отдавать данные из кэша. В идеальном мире, наверное, для этого будет достаточно добавить строчку
USE_CACHE = True в settings.py, но пока это время не пришло, понадобится немного больше телодвижений.
Когда мы собираемся использовать кэш в Django, нужно сделать выбор: взять
готовое решение, которое сделает сделает все «за кулисами», либо реализовать свое. В отличие от многих других ситуаций, тут этот выбор не так очевиден, так как в существующих на сегодня готовых решениях довольно много ограничений и потенциальных неудобств.
Сначала мы быстро рассмотрим готовые решения, а потом разберемся, как же лучше реализовать кэширование самостоятельно.
Читать дальше →
Все знают, что такое кэширование и зачем оно нужно. Посещаемость растет, нагрузка на базу данных увеличивается, и мы решаем отдавать данные из кэша. В идеальном мире, наверное, для этого будет достаточно добавить строчку
USE_CACHE = True в settings.py, но пока это время не пришло, понадобится немного больше телодвижений.
Когда мы собираемся использовать кэш в Django, нужно сделать выбор: взять
готовое решение, которое сделает сделает все «за кулисами», либо реализовать свое. В отличие от многих других ситуаций, тут этот выбор не так очевиден, так как в существующих на сегодня готовых решениях довольно много ограничений и потенциальных неудобств.
Сначала мы быстро рассмотрим готовые решения, а потом разберемся, как же лучше реализовать кэширование самостоятельно.
Читать дальше →
Опциональная типизация в динамических языках
12 мая я выступил на конференции ADD-3 с докладом об опциональной
типизации в динамических языках. Вот слайды доклада (HTML, требуется
нормальный браузер) и его аннотация:
Языки со статической и динамической типизацией сосуществуют уже очень долгое
время, поскольку у обоих подходов есть свои плюсы и минусы. Динамическая
типизация уступает статической по популярности, поскольку обладает рядом
известных недостатков. В таких языках больше ошибок происходит во время
выполнения, слабее поддержка со стороны IDE, хуже производительность программ.
В докладе рассматривается получающая распространение опциональная типизация,
которая поможет сгладить недостатки динамических языков. Описываются способы
введения опциональной типизации в динамические языки на примере языков Python,
Erlang, Dart. Рассматривается, как применяется опциональная
12 мая я выступил на конференции ADD-3 с докладом об опциональной
типизации в динамических языках. Вот слайды доклада (HTML, требуется
нормальный браузер) и его аннотация:
Языки со статической и динамической типизацией сосуществуют уже очень долгое
время, поскольку у обоих подходов есть свои плюсы и минусы. Динамическая
типизация уступает статической по популярности, поскольку обладает рядом
известных недостатков. В таких языках больше ошибок происходит во время
выполнения, слабее поддержка со стороны IDE, хуже производительность программ.
В докладе рассматривается получающая распространение опциональная типизация,
которая поможет сгладить недостатки динамических языков. Описываются способы
введения опциональной типизации в динамические языки на примере языков Python,
Erlang, Dart. Рассматривается, как применяется опциональная типизация в
статическом анализе кода для повышения его производительности и корректности.
Даётся обзор инструментов, использующих опциональную типизацию.