Кризис: насколько всё плохо?
Насколько всё плохо в стране в связи с кризисом можно увидеть на сайте «Сократили», простенький, но посещаемый стартап, где (наверняка
У меня оставались
Using MySQL as a filesystem
With MySQLfs you can store a filesystem inside a MySQL relational database. MySQLfs breaks up the byte content of files that you store in its filesystem into tuples in the database, which allows you to store large files in the filesystem without requiring the database to support extremely large BLOB fields. With MySQLfs you can throw a filesystem into a MySQL database and take advantage of whatever database backup, clustering, and replication setup you have to protect your MySQLfs filesystem.
Using MySQL as a filesystem! OMG, LOL!
JavaScript: баг с замыканием в FireFox
Какой alert должен показать следующий JavaScript в браузере?
<html>
<head>
<script>
/* When are functions defined? */
function really() { alert("Original"); }
if (0) {
alert("No");
function really() { alert("Yes, really"); }
}
really();
</script>
</head>
<body>Really</body>
</html>Поведение тут зависит от браузера, FF выведет «Original», а остальные браузеры — «Yes, really».
Рулить должен тот, кто отвечает
Консерваторы отечественного разлива, по моим наблюдениям, как и Чепмен, считают, что муж — глава семьи, но пишут все больше об обязанностях жены. В результате остается ощущение, что муж хоть и глава,
но какая-то декоративная: в чем состоит его лидерская функция — обрисовывается весьма смутно.Вроде как он зарабатывает деньги,
но вообще-то человек, который только дает деньги, называется не глава, и спонсор. Кроме того, у меня оставалось шизофреногенное такое впечатление, что хотя муж как бы глава, но реально за то, будет ли в семье все хорошо, отвечает жена. Все развалилось? А, так это жена была недостаточно мягкой и любящей. Денег нет? Жена не умеет экономить. Ссоры? Жена — стерва.Может быть, дело в том, что статьи эти рассчитаны на женскую аудиторию как больше интересующуюся семейными проблемами, но тогда неясно, как муж может быть лидером, если он вообще не парится вопросами семейного благополучия?
Мне
как-то сложно отойти от максимы о том, что рулить должен тот, кто отвечает, а отвечать — тот, кто рулит. То есть, если ты глава семьи и твоя семья развалиась, то ты самый первый в этом виноват. А если ты не виноват, значит, ты не был главой этой семьи.Как-то так. Кроме того, меня ставили в тупик советы жене дать мужу возможность быть главным, чуть ли не сделать его главой семьи собственными силами. Мне все казалось, что если тыиз кого-то что-то делаешь, то ты и есть главный, так? А токакое-то лицемерие получается.
Провокационный пост про то, что мужчина должен. А я и бизнесы такие знаю, это, видимо,
Вышла Opera 10.0 alpha1
Вышла Opera 10.0 alpha 1, из важных обновлений движка:
- полностью проходит тест ACID3
- новый движок регулярный выражений с улучшеной производительностью
- улучшена производительность CSS
- изменён вывод «голого» XML
- поддержка подгружаемых шрифтов (web fonts)
- поддержка RGBA и HSLA (цвет с указанием прозрачности)
- поддержа Selector API (который сейчас уже поддерживает Safari и IE8)
Из других интересных особенностей: встроенная проверка орфографии, автообновление билдов.
DJ сейшн в «Яндексе»
Проводим очередной
Адрес вещания — прежний, заходите. Если
Обновление: мы закончили
К iPhone 3G подходят не все SIM?

Как я уже писал, в Казани нам не удалось позвонить ни с одно из двух
Не распознал iPhone
JavaScript: два синтаксиса определения функции
A function statement is shorthand for a var statement with a function value.
The statement:
function foo() {}
means about the same thing as:
var foo = function () {}
Мне кажется, что поведение, описанное мною под заголовком «JavaScript: баг с замыканием в FireFox», является хаком браузеров, для того, чтобы все функции, описанные ниже, можно было вызывать из вышестоящих функций.
Дополнение. Надо было вчера дочитать главу, прежде чем спать ложиться. Ниже описывается отличие этих конструкций, упоминается то, что я назвал «хаком браузеров» и даже есть намёк на различное поведение function под if в разных браузерах:
function statement is hoisting. This means that regardless of where a function a placed, it is moved to the top of the scope in which it is defined. This relaxes the requirement that function should be declared before used, which I think leads to sloppiness. It also prohibits the use of function statement in if statement, but they vary in how that should be interpreted. That creates portability problems.
Камеры средней скорости
Я не в курсе как в Москве, а в Казани (где я прожил почти всю сознательную жизнь), сейчас стоят камеры, замеряющие скорость автомобиля. Проехал мимо неё быстро — штраф придёт тебе по почте. Камеры приходится втыкать очень частно, иначе как следить за скоростным режимом. А вот в Шотландии придумали более экономичное решение:
Особо циничны камеры контроля средней скорости. Их ставят в начале и в конце определенного отрезка. Камера запоминает номер автомобиля и ждет, когда этот автомобиль проедет отрезок. Если автомобиль сделает это слишком быстро, значит, он превысил скорость. Штраф придет по почте в конверте. Вот оно — идеальное полицейское государство.
Это цитата с сайта Артемия Лебедева. Кстати, Тёма здесь про полицейское государство малость преувеличивает — немного выше он описывает магазин самообслуживания в полном смысле этого слова: берёшь товар, сам сканируешь штрихкод, потом суёшь деньги в автомат. Всё на доверии. Какое уж тут «полицейское государство»?
Стих о нежносте
Да, нынче девочки не сильно образованы и не все знают, что афторы любовных стишков, такие как Бальмонт, Тургенев, Полонский, Северянин, Белый, Пастернак — давно умерли — и пишут им коменты, как живым — но зато — КАКИЕ это комменты!
Статья «Классики и девочки» с сайта «Свободная пресса» сделала мой день.
Ctypes
У PHP есть модуль из которого можно «дёрнуть» любую dll/so. Следовало ожидать, что и у Python есть
Вот что получилось (finfo.py):
# -*- coding: utf8 -*-
from ctypes import *
NONE = 0 # No special handling
DEBUG = 1 # Print debugging messages to stderr
SYMLINK = 2 # If the file queried is a symlink, follow it
COMPRESS = 4 # If the file is compressed, unpack it and look at the contents
DEVICES = 8 # If the file is a block or character special device, then open the device and try to look in its content
MIME = 16 # Return a mime string, instead of a textual description
CONTINUE = 32 # Return all matches, not just the first
CHECK = 64 # Check the magic database for consistency and print warnings to stderr
PRESERVE_ATIME = 128 # On systems that support utime(2) or utimes(2), attempt to preserve the access time of files analyzed
RAW = 256 # Don’t translate unprintable characters to a ooo octal representation.
class finfo:
def __init__(self, magicfile = None, flag = NONE):
"""Инициализация. Передаются имя magic-файла (или используется размещение
по умолчанию и флаги (см. константы выше)"""
self.lib = cdll.LoadLibrary('libmagic.so.1')
# следующие функции возвращают указатель на char, что я указываю
self.lib.magic_buffer.restype = c_char_p
self.lib.magic_file.restype = c_char_p
self.lib.error.restype = c_char_p
self.magic = self.lib.magic_open(flag)
self.lib.magic_load(self.magic, magicfile)
def buffer(self, content):
"""определить содержимое из строки"""
return self.lib.magic_buffer(self.magic, content, len(content))
def file(self, filename):
"""определить содержимое файла"""
return self.lib.magic_file(self.magic, filename)
def __del__(self):
self.lib.magic_close(self.magic)Вызывается модуль просто:
import finfo
mime = finfo.finfo('/usr/share/file/magic', finfo.MIME)
print mime.file('more.png')Блог как инструмент мифотворчества
Я тут подумал — сейчас блоги являются основным источником не только новостей, но и выполняют роль портфолио и основным сборником фактов о человеке, при этом единственным их цензором является автор блога.
Это хорошая возможность для имеющего способности к мифотворчеству. Нет ничего проще — опубликовать в своём блоге запись задним числом («отмотав» время на пару лет назад), например о том, что экономика США рухнет, используя в качестве аргументации размышления наших лестничных экспертов и обрести последователей как гуру экономики.
Страшно подумать какие перспективы открываются для больших компаний, которые с удовольствием вносят коррективы в историю. Тут есть где развернуться! Собственные провалы можно замаскировать шквалом «новостей в прошлое». Несколько проплаченных публикаций в прошлое от центральных
Не было ли замечено уважаемыми читателями случаев применения такой тактики?
«Бракъ и безбрачiе во всѣхъ половыхъ и моральныхъ проявленiяхъ»
Цитата из книги «Бракъ и безбрачiе во всѣхъ половыхъ и моральныхъ проявленiяхъ» (1878 выпуска):
Дѣвушка, остающаяся дѣвственницей, по достиженiи полнаго своего физическаго строенiя, вскорѣ испытывает на себѣ бездну болѣзней: накожныя сыпи, тоску и пр., смертельныхъ враговъ ея красоты. Свѣжесть исчезаетъ, прелести блекнутъ и ея здоровье ослабѣвает по мѣрѣ того, какъ она медлитъ выполнить законъ природы.
В отрыве от контекста и в старой орфографии выглядит довольно комично, между тем, книга довольно серьёзная и, на мой взгляд, разумная (хотя и не без некоторых, иногда довольно диких, заблуждений).
MySQL 5.1 не готов
MySQL 5.1 ставить на production нельзя:
We still have 20 known and tagged crashing and wrong result bugs in 5.1 35 more if we add the known crashing bugs from 5.0 that are likely to also be present in 5.1.
We still have more than 180 serious bugs (P2) in 5.1. Some of these can be found here.
We have more than 300 known and verified less critical bugs that are not going to be addressed soon. (The total reported number of bugs to the MySQL server is of course much larger
Пишет о свежем релизе MySQL 5.1 Michael Widenius, «родитель» MySQL, который занимает сейчас пост технического директора в MySQL AB.
Для тех, кто не читает
Python Ctypes: автоматическая генерация
Столкнулся с проблемой: нужно дёргать из Python библиотеку, очень богатую на структуры. Я эксперементирую с ctypes, которая ничего не знает
Оказывается, есть утилита, которая генерирует структуры по заголовочным файлам автоматически. Называется h2xml.py, в интернете есть небольшое описание. Попробую её.
Единственный недосток: язык — Cи++, с Си
Опечатка
Спросил сегодня по аське, вместо «как у тебя дела», «как у тебя елда». Слишком полагаюсь на проверку орфографии в клиенте.
Эпопея с MAPI
Все эти пляски с ctypes — следствие одной большой задачи, с которой мы столкнулись в группе внутренних сервисов. Интеграция нашего интранета с Microsoft Exchange Server — это сервер для обмена сообщениями и совместной работы. Основной протокол, по которому этот сервер работает — MAPI.
После небольшого исследования выяснилось, что направлений для дальнейшего исследования три: можно попытаться работать с MAPI через RPC, можно использовать библиотеки, которые
Последний вариант,
Я долго не мог выяснить что за RPC применяет Microsoft, пока не начал перебирать всё, что приходит на ум. Оказалось, что Microsoft, в основном, использует диалект
Документации на него — кот наплакал, чуть примеров и в Сети есть несколько эксплоитов, написанных при помощи этого модуля. Этого хватило, чтобы понять как примерно им пользоваться и несколько дней и я пытался сделать прототип для общения с Exchange на нём.
Довольно быстро оказалось, что задача очень трудоёмкая. Даже для того, чтоб описать только вызовы верхнего уровня, ушёл бы не один день, а описывать
Готовых библиотек для работы с MAPI немного. Бесплатная, кажется, так и вовсе одна — libmapi. Сейчас стабильной версией считается 0.7, поскольку библиотека требует присутствия Samba4, то решено было ставить её из исходников. Оказалось, дело это очень непростое, так как база пакетов на машине, куда пришлось её ставить была разрушена, «Пайтонов» было два, от чего у исталлятора уносило крышу и имелась собственная Samba3, которая используется в работе.
Наши админы попробовали её поставить, но после нескольких проблем, сказали, что это очень сыро и ставить не получается. Я их понимаю — работы у них масса, слишком много времени на исталляцию недописанного софта они выделять не в состоянии. Поэтому библиотеку я ставил сам. В рунете я не смог найти никаких описаний того, что это
Для начала, лучше всего ставить версию из транка. Встаёт она значительно проще, чем стабильная. Далее. Сначала надо поставить Samba4, для этого в каталоге «script» есть специальный скрипт, который выкачивает её и ставит. Посколько API Samba меняется очень часто (это «альфа»), выкачивать нужно определённую ревизию, скрипт это умеет, но ему нужен git. Git — это распределённая система контроля версий, это пакет в Debian называется
Как оказалось, Samba4 в памяти не нужна. Всё что он неё надо, чтобы она была скомпилена со всеми библиотеками и небольшой конфиг, образец которого есть в дебрях libmapi. Не забудьте правильно выставить язык в конфиге, в небольшой инструкции по установке есть описание того, как это делается. В установочных файлах конфига проследите, чтобы все пути были указаны правильно. Например, мне пришлось поправить пути до исходников Samba с «samba4» на «samba4/source4», а так же руками добавлять PKG_CONFIG_DIR в файлы configure.
Дайте libmapi и Samba4 весь софт, который она попросит. Даже опциональный. И самый свежий (к Python это не относится, у меня взлетело с 2.4). Это важно. Некоторые файлы нужно будет перенести вручную, например, библиотеки для Python. После компиляции создайте профиль (в wiki libmapi есть инструкция) и запустите openchangeclient, чтобы проверить соединение. Если у вас домен, то не забудьте про утилиту provision (описание можно найти в инете, важно пускать её именно так как в примерах — чтобы текущей была указанная в примерах папка).
Если openchangeclient выдаёт
Кажется, это всё. Да, если у вас несколько «Пайтонов» на машине, удалите все, кроме одного, или перепишите место, где в конфигах определяется версия «Пайтона» руками (я так и сделал), иначе часть модулей, возможно, встанет не туда, куда ожидается. Python нужен для работы provision (кстати, некоторые утилиты написаны на Perl, но с ним проблем у меня не было).
После всех боданий, из Си удалось подключиться к Exchange и получить данные. Из Python пока удаётся только залогиниться, но это дело времени — нужно описать нужные структуры и понять что куда передавать. В документации, кстати, есть неточности, лучше читать исходники.
Captain Lenin
Повезло же жить в интересные времена! Вчера узнал, что моя жена не была даже октябрёнком,
Сейчас смешно, а в детстве, я, помню, плакал, что не могу повстречать Ленина (NOT GAY!), наверное я на него проецировал своих дедушек, которых не застал в живых. Или слабой детской душе хотелось
Интересные времена, да, сидя в ванне с ноутом, пишу в блог
Новости кино: «Стиляги»
Посмотрели вчера в кинотеатре фильм «Стиляги». Рекомендую! Настолько хорошо, что не верится, что снято в России.
В нашем кино научились платить деньги за музыку?
Libmapi писали индусы?
Есть ощущение, что некоторые части libmapi писали индусы. Напоминаю, что libmapi — библиотека для общения с Microsoft Exchange Server, к которой я пишу биндинг в Python с использованием ctypes.
Некоторые вызовы я предпочёл переписать на Python, так как код содержит баги и глупости. Например, мне приходит (в терминах Python) массив событий. Приходят два «слова», два числа, которые содержат дату/время старта и окончания. Числа приходят в минутах, например, чтобы узнать какой там указан день, нужно нацело разделить число на 1440 (количество минут в сутках) и прибавить один.
В итоге, я вычисляю всё вот так (часовой пояс я ещё не умею определять):
last = event_end - event_start
day = event_start // 1440
hour = (event_start - day * 1440) // 60
minute = event_start % 60
day += 1Авторы libmapi делают куда затейлевее:
for (hour = 0; hour < 24; hour++) {
if (!((event_start - (60 * hour)) % 1440)) {
// значит мы нашли час, который указан в событии
day = ((event_start - (60 * hour)) / 1440) + 1;
last = event_end - event_start;
}
}
А мужики-то и не знают!
Сергей Чикуенок из студии Лебедева сделал потрясающее открытие: чем сложнее структура документа, тем больше тормозит браузер.
Libmapi: поправили один баг
В пятницу выслал на корявом английском багрепорт ребятам, которые пишут libmapi: по коду было видно (и подтвердилось полевыми испытаниями), что на стыке годов события следующего года будут отображаться через openchangeclient криво. Поправили, правда, странно и сложно:
_PUBLIC_ uint32_t mapidump_freebusy_year(uint32_t month, uint32_t year)
{
uint32_t realmonth;
realmonth = month - (year * 16);
while (realmonth > 0xc) {
year++;
realmonth = month - (year * 16);
}
return year;
}Если не забуду, надо будет выслать им две моих строчки кода, где я нахожу месяц и год битовыми операциями и сдвигом.
А ещё поправили один из багов, который мешал библиотеке нормально собираться при некоторых условиях. Молодцы. Надо чаще им писать.
А что, ещё что-то осталось?
Меня мучают нехорошие подозрения. Из США едет жене на Новый год подарок. Долго едет, пару месяцев уже (с учётом заказа через специальную фирму, получения на склад в США и т. д.). Сегодня он прошёл российскую таможню. В строке «передано таможне» вес подарка указан как 0,615 кг, в следующей строке «обработка» вес уже 0 (ноль) килограмм. Меня мучают нехорошие подозрения. :)
С Новым годом!
Всех с Новым годом! Кажется в следующий раз в интернете я появлюсь уже в следующем году, сегодня вечером лечу в Казань, встречу Новый год в загородном доме, в кругу семьи.
Спасибо ребятам из EMSPost, которые напряглись и привезли подарок для жены сегодня в офис.
Адвентисты седьмого «S»
Просьба персонала «S7» выключать все электронные устройства в самолёте, так как они, якобы, мешают навигационным приборам, что не подтверждается наукой, очевидно является вопросом веры. Не наука, значит религия. Если моя вера говорит об обратном, то я могу не подчиниться, сославшись на конституционное право о свободе вероисповедания?