Как я уже не раз говорил, libmapi нещадно течёт. Я сейчас работаю с версией из транка, 921-й комит, это довольно старая версия (текущий коммит — 1303), но утечки находят до сих пор и впереди их немало. Память течёт быстро и при получении больших объёмов данных утекает раньше, чем данные удаётся получить.
Поэтому я изолирую libmapi в отдельном процессе, получаю данные, пока могу и отдаю их «наверх» — родителю, потом делаю новый процесс и получаю следующую пачку. Для того, чтобы отдать данные родителю я использую os.pipe, а данные туда можно передавать только строкой. Так как данные у меня сложные, я их сериализую при помощи cPickle, а для сериализации нужна память.
Где взять память, если всё, что было доступно процессу, съела libmapi? Я пытался выделать память при помощи list(range(20 * 1024 * 1024)), а перед сериализацией удалять, но это не работало. Сегодня я узнал почему. Оказывается Python до версии 2.5 никогда не освобождает память. У меня как раз Python 2.4, приехали.
P.S. Чтобы предотвратить вопросы для чего я делаю list(range(…)), расскажу сразу: для совместимости с Python 3.0, на который мы все когда-нибудь перейдём. Там range возвращает итератор.
Добавлено позднее.
Я сейчас немного поисследовал, сделал замеры и выяснил, что если обращаться к аллокатору памяти Python напрямую (например, через ctypes), то память возвращается:
from ctypes import *
mem = pythonapi.PyMem_Malloc(c_size_t(100*1024*1024))
pythonapi.PyMem_Free(mem)
Моя жена обживает интернет просто семимильными шагами. Не в том смысле, что она его раньше не видела, а в том смысле, что в понимании сетевой культуры, которая её раньше не интересовала, она сильно продвинулась и уже начала переносить её понимание в реальную жизнь. В доказательство, диалог, который произошёл только что:
— Марин, я уже кушать хочу! — Солнце,… я кушать хочу больше тебя, (с угрозой) ты хочешь со мной об этом поспорить?
Цитирую целиком, ибо мне это кажется достаточно важным:
1. Шампунь по составу мало чем отличается от геля для душа, поэтому они легко заменимы.
2. Страна производитель – важный показатель качества. Fructis российского производства и французского – разные шампуни. Для развивающихся стран используются более дешевые ингредиенты в меньших количествах (все остальное – вода), производства EU находится под более строгим контролем (меньше риск, что в бадью с вашей любимой помадой упадет бидон с казеиновым клеем, что случается), в Европе строже стандарты качества. Другими словами, для EU делают более дорогой и густой шампунь, чем для российского рынка. Поэтому покупайте то, что сделано в Европе для европейской компании.
3. Читайте этикетки. Состав продукта перечисляется по убыванию массы ингредиентов. Например, если написано: «Состав: вода, сода, соль… какие-то непонятные слова….масло виноградных косточек точка», это значит, что на 99% ваш шампунь состоит из воды. Масло виноградных косточек туда тоже попало, но в виде трех капель на мегатонную бочку. Если описание состава вашего любимого крема для рук начинается со слов «вазелин, парафин», то выбросьте его в форточку и купите банку вазелина. Скорее всего, кроме этих двух ингредиентов и пары отдушек, закодированных в латинские названия, там ничего нет. Да, кстати, как это ни прискорбно, бомбочки для ванн LUSH на 99,9% состоят из соды, поэтому их себестоимость – порядка 30 центов (при цене 300 рублей). Там есть еще пару капель эфирных масел и отдушки, но проще сделать такие бомбочки самим.
4. Уважаемые родители, стиральные порошки «Аистенок» и «Ушастый нянь» сделаны в России (читайте второй пункт). «Ушастый нянь» сделан на фабрике «Невская косметика», что, вообще-то, уже лет 30 как не внушает доверия, «Аист» сделан на неизвестном российском производстве. По составу эти порошки ничем не отличаются от «взрослых порошков» - это все простой маркетинг. Покупайте для своих детей жидкие концентраты, сделанные в Европе.
5. Любой стиральный порошок на 80% состоит из балласта, чтобы радовать покупателя большой коробкой. И, кстати, вот эти синенькие и красненькие точечки в стиральном порошке – тоже балласт, а вовсе не какие-то мифические активные вещества. Покупайте жидкие концентраты – это экономичнее, они не так вредны для природы как порошки, которые попадают в водоемы и рушат экосистему.
6. Ополаскиватели для цветного и белого белья по химическому составу идентичны. Различаются только этикетками.
7. Самый большой обман в том, что стиральные машинки ломаются от накипи и поэтому надо покупать Calgon. Не верьте! Машинки от этого не ломаются, а стиральный порошок Calgon ничем не отличается от других.
8. Грустная новость для российских защитников животных: если на товаре написано, что он не тестировался на животных, это не значит, что в России не пострадал ни один кролик. Дело в том, что для выхода на российский рынок любой косметический продукт должен пройти миллионы СанПинов, которые были придуманы в 70-80х гг. в СССР, в том числе, пробы на животных. Их никто не отменял даже для Green Mama и Body Shop. Другое дело, что компания может не проводить эти тесты самостоятельно, а отдать свою тушь российскому подрядчику, который и будет закапывать эту тушь в глаза кролику, пока его сетчатка не покраснеет.
Они вбивают клинья между членами коллектива, часто из-за зависти, что ДеМарко (DeMarco) и Листер (Lister) называют непереводимым термином teamicide (team - команда, а teamicide - созвучно suicide - самоубийство): непреднамеренный развал ранее сплочённых команд
Ллео, +1, зачетно обосрал JS ))) Ненавижу javascript, а еще заточку на кроссбраузерность, где код JS вырастает раза в 3 из-за разных браузеров. Говно это. Кастрат Java. Долой JS!
Пишет у Каганова в блоге какой-то чудик об одном из самых гармоничных языков современности.
В 21-м веке есть люди, который до сих пор считают, что JavaScript «кастрат Java». Если кто до сих пор не знает — JavaScript и Java не родственники, название языка — маркетинговый ход, хотя первоначальное название языка («Mocha») было не лучше.
Ну и про «заточку на кроссбраузерность». Так уже давно никто не делает (если не считать каких-то узкоспециальных вещей), большинство использует фреймворки, где всё уже сделано за нас (я, например, неистово люблю jQuery), да и проблем совместимости остаётся всё меньше.
Вот чем я занимался сегодня большую часть рабочего дня: вручную декодировал события, на которых свалились тесты, побайтово. В отличие от машины, я способен распознавать данные по их внешнему виду, например, вижу границы nttimestamp или вижу где начались буквы. Машина без посторонней помощи это не умеет, а потратить времени на помощь ей можно очень много.
Вывод, кажется, такой: в документации от Microsoft поле ReminderSet имеет тип boolean и размер 8 бит, вот по данным кажется, что оно всё-таки должно иметь размер 32 бита. В таком случае, всё пока встаёт на место. Сейчас поправлю и буду ещё тесты гонять.
P.S. Пока тесты не падают. Значит размер поля ReminderSet в структуре ExceptionInfo действительно 32 бита (это структура внутри PidLidAppointmentRecur).
Наступил недавно на отличные питонячьи грабли. Хорошие такие, массивные, со специальными шипами на рукоятке.
Есть модуль, внутри него происходит fork — внутри потомка изолируется libmapi, у которой нещадно течёт память. Модуль используется внутри программы, которая перехватывает все exceptions (!). Знаю, что это неправильно, но она это делает в режиме отладки, для отладки и используется.
Загвоздка в том, что процесс-потомок выходил при помощи sys.exit. Если вы уже знаете в чём проблема, можете начинать хохотать. Я не знал и убил тестовую машину — кончилась память. Ваня Сагалаев тоже не знал.
sys.exit пораждает иключение и выходит с его помощью. Если где-то это исключение блокируется, то потомок, натурально, не может умереть. Решение простое — выходить надо по os._exit.
Ну, раз так, давайте я что-нибудь про Windows 7 расскажу, тем более повод есть: сегодня мой ноут вдруг резко вырубился, с ним такое бывает, а после включения «Винда» сказала, что загрузиться не может. После чего, немного почесала винтом и показала repair screen, там пару десятков минут что-то делала и запустилась. Один из экранов я сфоткал.
Кардинальное различие в том, что когда раньше Windows из NT-ветки (т. е. NT, 200x, XP, Vista) у меня падала, она, либо выводила диагностику («нет такого-то файла, ничего не поделаешь») и останавливалась, либо требовала установочного или восстановочного диска.
Видимо, сейчас (по крайней мере, если физически всё исправно и загрузочный сектор винта цел) ничего такого не надо. Ура.
P.S. Чтобы не гадали из-за чего вырубается у меня комп, я скажу сразу, так как причину знаю. Я случайно сломал USB-разъём (пластмастка выпала), но иногда, по привычке, туда что-то включаю, устройство работает, но иногда коротит питанием на корпус, у компа срабатывает защита.
Мне интересно, что бы мне потребовалось сделать, если бы у меня сломался (единственный) USB-порт на Mac Air? Тут я просто забил — у меня ещё четыре исправных есть, а там?
В отличие от Линукс-фанатов и яблочников, Windows пользователи не стараются сделать из использования своей системы культ и уж тем более не превращают факт потребления услуг, предоставляемых системой, в свой личный подвиг. Поведение же большинства линуксоидов иначе как аггресивным снобизмом назвать нельзя.
Яблочники — это вообще гламурные кисо в мире ИТ…
Говорит нам товарищ Yeah с «Хабабры» и я с ним совершенно согласен. Вот что меня смущало во всём этом поклонении яблочной продукции — её фанаты всё время рассказывают какая пусечка их любимый гаджет и чему он научился с прошлого апдейта.
Я, вот, до сих пор не знаю всех новых клавиатурных комбинаций в Windows 7 (хотя работаю на ней не первый месяц), да и весь объём нововведений не представляю. Но будьте уверены, как только у «Эппл» выйдет новое кошачье (тут я какбэ намекаю на названия Mac OS X, для тех кто не в курсе), они заучат все новые комбинации, в деталях разберут все новые возможности и расскажут всем про все няшные плюшечки.
А так, по отдельности, они нормальные ребята, ага.
Как известно, в вебе, в подавляющем большинстве случаев, для адресации ресурсов применяются HTTP или HTTPS протоколы. Как вы понимаете, я не Капитан Очевидность, так что за этим последует какая-то интрига.
Бывает так, что одна и так же страница должна быть видна по обоим протоколам (например, у нас в интранетах такое бывает часто). В зависимости от того как пользователь зайдёт.
То, что я скажу дальше NDA не является, например, об этом рассказывал Олег Оболенский на РИТ-2007: все сервисы состоят из кусочков, кусочки грузятся с какого-то сервера. На практике это означает, что часть CSS и картинок, которые используются в нашем интранет-хозяйстве лежат на другом сервере и их ковыряют совсем другие люди.
В итоге, когда человек заходит на страницу, ему грузится ещё и CSS с другого сайта, внутри которых могут быть абсолютные (с протоколом) пути, которые подгружают картинки. Если человек зашёл по HTTPS, то и всё остальное должно отдаться по HTTPS (иначе, например, Internet Explorer заругается), если он зашёл по HTTP, то всё должно отдаваться по HTTP (HTTPS нагружает сервер и вообще отдаётся по шифрованному протоколу всё заметно медленее).
Как это реализовать? Как менять протокол, в зависимости от протокола страницы, если CSS, который грузится статичен и менять пути внутри него не получится? Делать два отдельных CSS?
Есть способ проще.
Откуда я о нём узнал, я не помню. Что-то смутно вспоминаю, что, кажется, прочитал у Кукуца много лет назад, с тех пор и использую. Впрочем, память меня тут, вероятно, подводит, потому что до моего прихода в «Яндекс» способа там этого, похоже, не знали.
Способ заключается в том, чтобы не указывать протокол. Выглядит такой URL вот так: «//example.net/picture.jpg» и описан в RFC 1738 как «Common Internet Scheme Syntax»:
While the syntax for the rest of the URL may vary depending on the
particular scheme selected, URL schemes that involve the direct use
of an IP-based protocol to a specified host on the Internet use a
common syntax for the scheme-specific data:
//<user>:<password>@<host>:<port>/<url-path>
Смысл в том, что в таком указания без протокола должен использоваться текущий тип протокола. Таким образом, хорошее решение — просто всегда указывать полный URL в таком виде.
Тёма недавно как-то возмущался по поводу «лжефактов» — совершенно нелепых стереотипов, которых многие придерживаются. Не беда, что в качестве примера он привёл два таких же нелепых стереотипа, живущих в его голове (кстати, куда более удачную статью на этот счёт написал Лёня Каганов).
Один из лжефактов, которые раздражают меня — «сердце находится слева», потому что люди довольно часто, со словами «сердце болит», прикладывают руку куда-то в район левой подмышки.
Люди воспринимают слова врачей слишком буквально: как будто сердце находится сразу за левой сиськой. Я узнал, что это не так ещё в начальных классах, когда увидел собственный рентген сердца. Хочу открыть сейчас эту истину тем читателям, которое этого не знают (а так же прогуляли то занятие анатомии или никогда не задумывались почему на уроках по оказанию первой помощи руки, при массаже сердца, кладут на середину груди).
Сердце находится чуть слева от середины грудины и несколько ниже, чем то место, куда обычно кладут руку при болях. Я на фото нарисовал две примерные линии: вертикальная — позвоночник, горизонтальная — уровень подмышек, чтобы было легче найти сердце на себе.
Теперь вы знаете куда надо класть руку, когда «колит сердце».
P.S. Сподвигла меня на написание этого поста картинка на сайте студии Лебедева в разделе «Понос».
P.P.S. Уже после написания я подумал, что не все смогут найти сердце, если никогда не видели его рентгена. Сердце — белый мешочек, начинающийся с перекрестия, и «лежащий» на белом большом внизу фото.
Наверное, так же стоит упомянуть о том, что примерно у одного из десяти тысяч сердце располагается ближе к правой стороне (а печень у них слева). Это называется «транспозиция внутренних органов», декстрокардию писать не буду, если интересно, можно посмотреть в «Википедии».
Где-то под Новый год купил через «Амазон» жене жёсткий диск от iomega — eGo Helium. Внутри — какой-то «Самсунг», но корпус красивый и стильный, размер небольшой, внешнего питания не требует и скорость — честный USB 2.0.
Мы довольны. Хотя скрепка на фото с сайта производителя в несколько раз больше обычной канцелярской.
У меня в последние пару недель ощущение, что Тёма взял в соавторы своего дневника в ЖЖ умницу Анатолия Воробья. Потому что, кроме обычного тёминого стрёмного гонева и поливания гамном, стали появляться вежливые посты, оформленные совсем другим языком. А два предпоследних поста вообще про программирование и шахматы, что для Воробья более, чем характерно.
Позднее: Костя в комментариях сказал, что Воробей и Лебедев первого апреля поменялись журналами на день.
CSS sprites, data URI+mhtml, склейка CSS с JavaScript. Что ещё придумают веб-мастера, чтобы добиться от браузера простой вещи: грузить ресурсы единым куском? Производителям браузера давно пора обратить на это внимание, а не заниматься всякой ерундой, типа раскрашивания бордюров (камень в огород WebKit).
Например, в FireFox есть прекрасно подходящий для этого протокол «jar» (а в Internet Explorer немного похожие на него «mhtml» и «res»). Этот протокол стал известен массам в основном благодаря уязвимости, которая работала через него.
URL выглядит как «jar:http://sample.org/file.jar/folder/file.png», где «http://sample.org/file.jar» — путь до JAR-файла, «folder/file.png» — путь внутри JAR. JAR — это просто ZIP-архив. Внутри него, как в любом ZIP-архиве, могут быть папки и файлы. Хорошо было бы засунуть ресурсы в такой архив и подключать их по пути внутри архива.
К сожалению, FireFox сейчас сделать так не позволит, а жаль (так они залатали уязвимость).