И так, наверно самое время подвести итоги уходящего года, ибо потом у меня уже времени на это в _этом_ году не будет
Что произошло первый раз в жизни:
- Получил по морде
- Потерял телефон
- Напился до такого состояния, что ничего не помнил
Этот год был довольно странным. Было много и положительного и отрицательного. Не могу сказать, что он был хорош или плох, но опыта я приобрел много.
Лишился хорошего друга.
Убедился, что IT в России — говно. Менеджмент в России — говно и его как таково нет, есть только “начальники”.
Люди — эгоисты. Все сплошь и рядом озлобленные.
Мне приелся Ragga-jungle и dancehall. Сейчас все еще прусь от dubstep’a/grime и minimal.
Я стал ходить в качалку и заниматься своим здоровьем (старею?).
Я почти вылечил свою мнительность.
Еще раз убедился в том, что все легче, чем кажется — главное действовать, а не сидеть на месте.
Стал играть в WoW. После почти 2 лет перерыва открыл для себя снова Quake3 (excessiveplus) — меня еще там не забыли
Это конечно далеко не все. Некоторые “достижения” так и останутся в моей голове до тех пор, пока не захочу написать мемуары (lol)
Posted in life | No Comments »
Posted on 29 December '09 by spoof, under life. No Comments.
Пожалуй тоже буду теперь постить в бложек фотки с фотосессий. Кросспост в твиттер и ЖЖ.
Фотки сделаны в Кузьминках на Конюшенном дворе

(more…)
Tags: flickr, photo
Posted in flickr | 1 Comment »
Posted on 29 July '09 by spoof, under flickr. 1 Comment.
Если django (да пожалуй и другие фреймфворки и не только на питоне) работает через fastcgi и проксируется nginx’ом по https, то последнему нужно добавить параметр:
fastcgi_param HTTPS on;
Tags: devel, django, fastcgi, nginx, unix
Posted in comp, devel, django, unix | No Comments »
Posted on 19 March '09 by spoof, under comp, devel, django, unix. No Comments.
Давеча переехал на flickr – теперь заливаю фотки только туда, ибо используемый из-за лени Вконтакте просто умер для меня в качестве галереи после того, как сравнил качество фото в нем и Flickr’e. Не знаю чего уж там делает Вконтакте в связке с php+gd+imagemagick, но фотки просто ужасно портятся.
Конечно хотелось бы немножко выпердриться, да создать свою галерею, но фотки пока недотягивают по уровню на хорошее портфолио в стиле персональной странички с работами как у известных фотографов. Да и времени нет. Хочется очень многого.
Posted in flickr, life, photo | No Comments »
Posted on 26 October '08 by spoof, under flickr, life, photo. No Comments.
И так, мы хотим, чтобы пользовал клацнув на кнопочку “Экспорт в Excel” получил это документ и был доволен. Что может проще скажете вы – взять положить файл в каталог и тупо его HTTP сервером отдавать. Но не все так просто в случае если вам необходимо, чтобы этот файл генерировался динамически (из-за меняющихся в нем данных), например django, на котором крутиться сайт.
Насколько мне удалось узнать, в мире существует один адеватный генератор Excel файлов – xlwt, который можно юзать на Unix системах. Это клон pyExcelator’a, но лучше подходит для django и сохранения не в файл. С документацией у него беда, но парочку линков все же нашел: обзор и пример.
Кроме того, примеры есть и в тарболе с pyexcelator’ом или в самом xlwt.
И так создаем во views.py приложения django функцию, которая будет возрвращать xls файл:
def export_xls(request):
wb = Workbook() # создаем основной документ
sheet = wb.add_sheet(’sheet1′) # добавляем лист (должен быть как минимум 1 лист)
# далее идут действия по добавлению данный на лист
# это нам не интересно в данном контексте
Но это еще не все. Далее нам нужно этот документ каким-то образом передать пользователю. Отсюда вытекают 2 проблемы или вопроса:
- Как же собственно преобразовать объект типа Workbook в строку (читай stream). По идее же должен быть какой-то метод save или что-то подобное. Да, есть, но в случае использования pyExcelator’a метод save предполагает сохранение в файл, но не в переменную как нам надо. В xlwt метод save() более гибкий. Ниже расскажу
- И как дать этому “файлу” человеческое имя, если у нас данные для генерации xls файла передаются через GET/POST параметры. При таком раскладе у нас файл будет называться последним “нодом” url’a, на который ведет ссылка. Например, если ссылка: http://bla.com/bla/export_xls?bla&bla=2, то файл будет называться export_xls, что не есть гуд
Начну пожалуй со второй проблемы, ибо она решается довольно просто. Если залезть в RFC 2183, то можно узнать про интересное поле в HTTP заголовке – Content-Disposition, которое то и позволит присвоить имя файлу через присвоение ему типа attachment с параметром filename. Для Django это будет выглядеть так:
response = HttpResponse(xls, mimetype=”application/vnd.ms-excel”)
response['Content-Disposition'] = ‘attachment; filename= %s’ % (filename)
return response
# здесь xls – фактически представляет собой переменную с содержимым Excel файла,
# filename – название файла, которое мы должны задать ранее
И так, для решения первой проблемы (в случае если используется pyExcelator) я порылся в коде pyExcelator’a и выкопал следующее. Оказывается метод save() класса Workbook делает следующее:
def save(self, filename):
import CompoundDoc
doc = CompoundDoc.XlsDoc()
doc.save(filename, self.get_biff_data())
CompoundDoc.XlsDoc() собственно и представляет собой обертку над бинарными данными, который сгенерировал Workbook (их получаем с помощью self.get_biff_data()). Как раз после save() класса CompoundDoc.XlsDoc() и получаем конечный Excel документ. Но смотрим далее в метод save() этого XlsDoc‘a:
def save(self, filename, stream):
# 1. Align stream on 0×1000 boundary (and therefore on sector boundary)
padding = ‘\x00′ * (0×1000 – (len(stream) % 0×1000))
self.book_stream_len = len(stream) + len(padding)
self.__build_directory()
self.__build_sat()
self.__build_header()
f = file(filename, ‘wb’)
f.write(self.header)
f.write(self.packed_MSAT_1st)
f.write(stream)
f.write(padding)
f.write(self.packed_MSAT_2nd)
f.write(self.packed_SAT)
f.write(self.dir_stream)
f.close()
Как видно, опять, тут идет работа с файлов. Слава богу это конечный пункт сохранения файла, поэтому смело овверайдим эти два класса для работы с Django:
class XlsDoc(CompoundDoc.XlsDoc):
def get(self, stream):
padding = ‘\x00′ * (0×1000 – (len(stream) % 0×1000))
self.book_stream_len = len(stream) + len(padding)
self.__build_directory()
self.__build_sat()
self.__build_header()
return ‘%s%s%s%s%s%s%s’ % (
self.header,
self.packed_MSAT_1st,
stream,
padding,
self.packed_MSAT_2nd,
self.packed_SAT,
self.dir_stream)
class Workbook(Workbook):
def get(self):
doc = XlsDoc()
return doc.get(self.get_biff_data())
Вставляем этот код в views.py нашего приложения и в коде нашей функции export_xls() после создания и генерации данных пишем:
xsl = wb.get()
Здесь wb – это WoorBook из первого листинга (но это не тот Workbook, что из pyExcelator’a, а наш, который мы переопределили).
Вот собственно и все. Небольшая компиляция собранных с краев интернета кусочков. Может и есть какой-то более прямой способ.
UPD В случае использования xlwt все проще. Юзаем:
import cStringIO
xls = cStringIO.StringIO()
..
wb.save(xls)
response = HttpResponse(xls.getvalue(), mimetype=”application/vnd.ms-excel”)
Posted in comp, devel, django, python | 1 Comment »
Posted on 23 October '08 by spoof, under comp, devel, django, python. 1 Comment.
Чтобы сплитнуть репозитарий или, например, вытащить какую-нибудь поддиректорию в корень нового репозитария в делаем:
-
hg init new_repo
В этой же директории где лежит и старый репозитарий old_repo, который требуется разделить.
- Создаем файл filemap.txt, в котором задаем те директории, которые надо включить в новый репозитарий:
exclude “*”
rename “subdir” “.”
include “subdir”
Т.е. игнорируем все файлы из old_repo, переименовываем subdir в “.”, чтобы эта директория стала корнем new_repo и включаем ее в копирование
- Выполняем команду:
hg convert –filemap filemap.txt old_repo/ new_repo/
-
cd new_repo && hg update
Собственна все, далее можно из old_repo удалять subdir:
cd old_repo && hg remove subdir
Tags: mercurial
Posted in devel | No Comments »
Posted on 11 July '08 by spoof, under devel. No Comments.
Импульсивно взял и купил себе canon 450d. Теперь творчеству нет предела
Мануал уже весь прочитал, теперь думаю… насколько мне китового объектива хватит…

Tags: покупки
Posted in life | 3 Comments »
Posted on 10 July '08 by spoof, under life. 3 Comments.
- Переезжаем с automake 0.9x на 1.10:
for file in $(find . -name “Makefile.am” -type f); do sed -e ’s/INCLUDES/AM_CPPFLAGS/g’ $file > $file-tmp; mv $file-tmp $file; done;
- Удаляем все каталоги .svn из сырцов:
find . -name “.svn” -type d -exec rm -rf {} \;
Posted in devel | No Comments »
Posted on 18 June '08 by spoof, under devel. No Comments.
Два дня минус почти просто так. Были потрачены они на поиск баги в моем питоньем скрипте, который р аботает с MySQL. Работа эта заключается в получении данных и распихивании их по словарикам (питоний). Так вот, было замечено, что для двух одинаковых значений ключа создается 2 записи в словаре (какого ху…дожника?!). При более внимательном рассмотрении было выяснено, что эти два якобы одинаковых ключа на самом деле разные, а разные они в регистре одной буквы. При запросе из MySQL возвращалось 2 значения вместо одного – отсюда возникали глюки. А все потому, что MySQL по-дефолту при сравнении строк не учитывает регистр, если не указаны collations для поля/таблицы в *_bin или *_cs. Век живи – век учись. Это конечно должно было известно быть – оно мне и было известно, но я об этом успешно давно забыл, ибо уже не помню когда последний раз с этим сталкивался. Взято отсюда
Posted in devel | No Comments »
Posted on 21 April '08 by spoof, under devel. No Comments.
Похакал немного текущую тему для блога. Прикрутил к ней сайдбар с виджетами и подогнал к общей стилистике. Вроде ничотак, а вы как думаете? Но немного жаль потраченного часа – слишком уж много заморочек с CSS. Благо Inspector в Safari сильно помогает в разборе.
Posted in blog, devel | No Comments »
Posted on 10 April '08 by spoof, under blog, devel. No Comments.