Кризис: насколько всё плохо?

Насколько всё плохо в стране в связи с кризисом можно увидеть на сайте «Сократили», простенький, но посещаемый стартап, где (наверняка RSS-подпиской из поиска) перепечатываются новости и посты с блогов по ключевым словам, связанным с кризисом.

У меня оставались какие-то иллюзии… Теперь они разрушены.

26 комментариев

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!

18 комментариев

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».

29 комментариев

Рулить должен тот, кто отвечает

Консерваторы отечественного разлива, по моим наблюдениям, как и Чепмен, считают, что муж — глава семьи, но пишут все больше об обязанностях жены. В результате остается ощущение, что муж хоть и глава, но какая-то декоративная: в чем состоит его лидерская функция — обрисовывается весьма смутно.

Вроде как он зарабатывает деньги, но вообще-то человек, который только дает деньги, называется не глава, и спонсор. Кроме того, у меня оставалось шизофреногенное такое впечатление, что хотя муж как бы глава, но реально за то, будет ли в семье все хорошо, отвечает жена. Все развалилось? А, так это жена была недостаточно мягкой и любящей. Денег нет? Жена не умеет экономить. Ссоры? Жена — стерва.

Может быть, дело в том, что статьи эти рассчитаны на женскую аудиторию как больше интересующуюся семейными проблемами, но тогда неясно, как муж может быть лидером, если он вообще не парится вопросами семейного благополучия?

Мне как-то сложно отойти от максимы о том, что рулить должен тот, кто отвечает, а отвечать — тот, кто рулит. То есть, если ты глава семьи и твоя семья развалиась, то ты самый первый в этом виноват. А если ты не виноват, значит, ты не был главой этой семьи. Как-то так. Кроме того, меня ставили в тупик советы жене дать мужу возможность быть главным, чуть ли не сделать его главой семьи собственными силами. Мне все казалось, что если ты из кого-то что-то делаешь, то ты и есть главный, так? А то какое-то лицемерие получается.

Провокационный пост про то, что мужчина должен. А я и бизнесы такие знаю, это, видимо, какое-то универсальное и очень стойкое стойкой заблуждение.

4 комментария

Вышла Opera 10.0 alpha1

Вышла Opera 10.0 alpha 1, из важных обновлений движка:

  • полностью проходит тест ACID3
  • новый движок регулярный выражений с улучшеной производительностью
  • улучшена производительность CSS
  • изменён вывод «голого» XML
  • поддержка подгружаемых шрифтов (web fonts)
  • поддержка RGBA и HSLA (цвет с указанием прозрачности)
  • поддержа Selector API (который сейчас уже поддерживает Safari и IE8)
    Из других интересных особенностей: встроенная проверка орфографии, автообновление билдов.

3 комментария

DJ сейшн в «Яндексе»

Проводим очередной DJ-сейшн в «Яндексе». Играет DJ Biohedge, стиль — Progressive/Tech/Uplifting House/Trance.

Адрес вещания — прежний, заходите. Если что-то не так со звуком — пишите в чат, мы сами звук с сайта не слушаем.

Обновление: мы закончили

Оставить комментарий

К iPhone 3G подходят не все SIM?

Разные SIM (21.88КиБ)

Как я уже писал, в Казани нам не удалось позвонить ни с одно из двух SIM-карт, которые у нас были на руках. На Новый год мы летим в Казань и решили попробовать разобраться в чём тут дело. В Москве у нас шесть SIM-карт из разных городов и стран, мы решили попробовать посмотреть с какими iPhone «заведётся».

Не распознал iPhone одну-единственную карту, на фото я положил несколько карт рядом, чтобы было понятно в чём тут дело. У карты, которая не подошла (это казанская SIMка «Мегафона») контактная площадка меньше. В остальных телефонах, где она стояла, проблем не было. Кто-нибудь знает в чём тут дело?

2 комментария

JavaScript: два синтаксиса определения функции

Смотрите-ка, не я один думал, что два определения функции (через «function f() {}» и «f = function () {}») эквивалентны. Я дочитываю книгу «JavaScript: The Good Parts» (автор — Douglas Crockford), вот до какого места я только что добрался:

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.

9 комментариев

Камеры средней скорости

Я не в курсе как в Москве, а в Казани (где я прожил почти всю сознательную жизнь), сейчас стоят камеры, замеряющие скорость автомобиля. Проехал мимо неё быстро — штраф придёт тебе по почте. Камеры приходится втыкать очень частно, иначе как следить за скоростным режимом. А вот в Шотландии придумали более экономичное решение:

Особо циничны камеры контроля средней скорости. Их ставят в начале и в конце определенного отрезка. Камера запоминает номер автомобиля и ждет, когда этот автомобиль проедет отрезок. Если автомобиль сделает это слишком быстро, значит, он превысил скорость. Штраф придет по почте в конверте. Вот оно — идеальное полицейское государство.

Это цитата с сайта Артемия Лебедева. Кстати, Тёма здесь про полицейское государство малость преувеличивает — немного выше он описывает магазин самообслуживания в полном смысле этого слова: берёшь товар, сам сканируешь штрихкод, потом суёшь деньги в автомат. Всё на доверии. Какое уж тут «полицейское государство»?

28 комментариев

Стих о нежносте

Да, нынче девочки не сильно образованы и не все знают, что афторы любовных стишков, такие как Бальмонт, Тургенев, Полонский, Северянин, Белый, Пастернак — давно умерли — и пишут им коменты, как живым — но зато — КАКИЕ это комменты!

Статья «Классики и девочки» с сайта «Свободная пресса» сделала мой день.

13 комментариев

Ctypes

У PHP есть модуль из которого можно «дёрнуть» любую dll/so. Следовало ожидать, что и у Python есть что-то подобное. Это что-то подобное называется ctypes. Я попробовал реализовать небольшой модуль, который обращается к библиотеке libmagic (которая занимается определением типа файла по его сигнатуре).

Вот что получилось (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')

10 комментариев

Блог как инструмент мифотворчества

Я тут подумал — сейчас блоги являются основным источником не только новостей, но и выполняют роль портфолио и основным сборником фактов о человеке, при этом единственным их цензором является автор блога.

Это хорошая возможность для имеющего способности к мифотворчеству. Нет ничего проще — опубликовать в своём блоге запись задним числом («отмотав» время на пару лет назад), например о том, что экономика США рухнет, используя в качестве аргументации размышления наших лестничных экспертов и обрести последователей как гуру экономики.

Страшно подумать какие перспективы открываются для больших компаний, которые с удовольствием вносят коррективы в историю. Тут есть где развернуться! Собственные провалы можно замаскировать шквалом «новостей в прошлое». Несколько проплаченных публикаций в прошлое от центральных интернет-изданий, которые потом как бы случайно всплывут на блогах (интернеты — типография по бесконечному переизданию боянов) и орда пубертатных «экспертов» сметёт всё на своём пути.

Не было ли замечено уважаемыми читателями случаев применения такой тактики?

11 комментариев

«Бракъ и безбрачiе во всѣхъ половыхъ и моральныхъ проявленiяхъ»

Цитата из книги «Бракъ и безбрачiе во всѣхъ половыхъ и моральныхъ проявленiяхъ» (1878 выпуска):

Дѣвушка, остающаяся дѣвственницей, по достиженiи полнаго своего физическаго строенiя, вскорѣ испытывает на себѣ бездну болѣзней: накожныя сыпи, тоску и пр., смертельныхъ враговъ ея красоты. Свѣжесть исчезаетъ, прелести блекнутъ и ея здоровье ослабѣвает по мѣрѣ того, какъ она медлитъ выполнить законъ природы.

В отрыве от контекста и в старой орфографии выглядит довольно комично, между тем, книга довольно серьёзная и, на мой взгляд, разумная (хотя и не без некоторых, иногда довольно диких, заблуждений).

2 комментария

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.

Для тех, кто не читает по-английски: всё очень плохо, много критических багов, продукт сырой, падает.

15 комментариев

Python Ctypes: автоматическая генерация

Столкнулся с проблемой: нужно дёргать из Python библиотеку, очень богатую на структуры. Я эксперементирую с ctypes, которая ничего не знает об *.h-файлах, поэтому структуры приходится описывать руками. На 20-й структуре я сломался.

Оказывается, есть утилита, которая генерирует структуры по заголовочным файлам автоматически. Называется h2xml.py, в интернете есть небольшое описание. Попробую её.

Единственный недосток: язык — Cи++, с Си почему-то утилита не работает.

6 комментариев

Опечатка

Спросил сегодня по аське, вместо «как у тебя дела», «как у тебя елда». Слишком полагаюсь на проверку орфографии в клиенте.

13 комментариев

Эпопея с MAPI

Все эти пляски с ctypes — следствие одной большой задачи, с которой мы столкнулись в группе внутренних сервисов. Интеграция нашего интранета с Microsoft Exchange Server — это сервер для обмена сообщениями и совместной работы. Основной протокол, по которому этот сервер работает — MAPI.

После небольшого исследования выяснилось, что направлений для дальнейшего исследования три: можно попытаться работать с MAPI через RPC, можно использовать библиотеки, которые только-только начали бурно расти (т. к. Microsoft открыла протокол) или использовать Windows-машину, на которой сделать RPC-обёртку для готового клиента Exchange, COM-объекта.

Последний вариант, с COM-объектом, нравится нам всем меньше всего и является запасным, в случае, если ничего больше не заработает.

Я долго не мог выяснить что за RPC применяет Microsoft, пока не начал перебирать всё, что приходит на ум. Оказалось, что Microsoft, в основном, использует диалект DCE-RPC, который называется MSRPC. C DCE-RPC, да и вообще с технологиями Microsoft (NMB, SMB) из Python можно работать модулем impacket. Библиотека не обновлялась два года, но работает.

Документации на него — кот наплакал, чуть примеров и в Сети есть несколько эксплоитов, написанных при помощи этого модуля. Этого хватило, чтобы понять как примерно им пользоваться и несколько дней и я пытался сделать прототип для общения с Exchange на нём.

Довольно быстро оказалось, что задача очень трудоёмкая. Даже для того, чтоб описать только вызовы верхнего уровня, ушёл бы не один день, а описывать MAPI-вызовы внутри DoRCP… В общем, от этой идеи пришлось отказаться.

Готовых библиотек для работы с MAPI немного. Бесплатная, кажется, так и вовсе одна — libmapi. Сейчас стабильной версией считается 0.7, поскольку библиотека требует присутствия Samba4, то решено было ставить её из исходников. Оказалось, дело это очень непростое, так как база пакетов на машине, куда пришлось её ставить была разрушена, «Пайтонов» было два, от чего у исталлятора уносило крышу и имелась собственная Samba3, которая используется в работе.

Наши админы попробовали её поставить, но после нескольких проблем, сказали, что это очень сыро и ставить не получается. Я их понимаю — работы у них масса, слишком много времени на исталляцию недописанного софта они выделять не в состоянии. Поэтому библиотеку я ставил сам. В рунете я не смог найти никаких описаний того, что это кто-то делал, поэтому несколько советов.

Для начала, лучше всего ставить версию из транка. Встаёт она значительно проще, чем стабильная. Далее. Сначала надо поставить Samba4, для этого в каталоге «script» есть специальный скрипт, который выкачивает её и ставит. Посколько API Samba меняется очень часто (это «альфа»), выкачивать нужно определённую ревизию, скрипт это умеет, но ему нужен git. Git — это распределённая система контроля версий, это пакет в Debian называется git-core, а не git. Git нужен последней версии (sic!), иначе скрипт скачать ревизию не сможет.

Как оказалось, Samba4 в памяти не нужна. Всё что он неё надо, чтобы она была скомпилена со всеми библиотеками и небольшой конфиг, образец которого есть в дебрях libmapi. Не забудьте правильно выставить язык в конфиге, в небольшой инструкции по установке есть описание того, как это делается. В установочных файлах конфига проследите, чтобы все пути были указаны правильно. Например, мне пришлось поправить пути до исходников Samba с «samba4» на «samba4/source4», а так же руками добавлять PKG_CONFIG_DIR в файлы configure.

Дайте libmapi и Samba4 весь софт, который она попросит. Даже опциональный. И самый свежий (к Python это не относится, у меня взлетело с 2.4). Это важно. Некоторые файлы нужно будет перенести вручную, например, библиотеки для Python. После компиляции создайте профиль (в wiki libmapi есть инструкция) и запустите openchangeclient, чтобы проверить соединение. Если у вас домен, то не забудьте про утилиту provision (описание можно найти в инете, важно пускать её именно так как в примерах — чтобы текущей была указанная в примерах папка).

Если openchangeclient выдаёт какую-то ерунду, воспользуйтесь strace, libmapi укладывает не все файлы как надо, посмотрите что openchangeclient пытается открыть и не находит. Некоторые файлы я перекладывал руками, в дистрибутиве всё есть, просто не всё попадает в свои папки.

Кажется, это всё. Да, если у вас несколько «Пайтонов» на машине, удалите все, кроме одного, или перепишите место, где в конфигах определяется версия «Пайтона» руками (я так и сделал), иначе часть модулей, возможно, встанет не туда, куда ожидается. Python нужен для работы provision (кстати, некоторые утилиты написаны на Perl, но с ним проблем у меня не было).

После всех боданий, из Си удалось подключиться к Exchange и получить данные. Из Python пока удаётся только залогиниться, но это дело времени — нужно описать нужные структуры и понять что куда передавать. В документации, кстати, есть неточности, лучше читать исходники.

6 комментариев

Captain Lenin

Повезло же жить в интересные времена! Вчера узнал, что моя жена не была даже октябрёнком, сам-то я помню как Брежнева хоронили. Забавно. Скажите, уже надо объяснять, что Брежнев — это такой генсек (а заодно кто такой генсек и его роль в государственности)?

Сейчас смешно, а в детстве, я, помню, плакал, что не могу повстречать Ленина (NOT GAY!), наверное я на него проецировал своих дедушек, которых не застал в живых. Или слабой детской душе хотелось чего-то светлого и всемогущего, а Бога в СССР для ребёнка было повстречать не менее непросто,чем Ленина. Одна из бабушек частенько рассказывала как было бы хорошо, если бы дедушка был жив, куда бы он мог сводить, как бы он не давал в обиду и так далее — она пережила его лет на 30.

Интересные времена, да, сидя в ванне с ноутом, пишу в блог какие-то смутные воспоминания детства.

11 комментариев

Новости кино: «Стиляги»

Посмотрели вчера в кинотеатре фильм «Стиляги». Рекомендую! Настолько хорошо, что не верится, что снято в России.

В нашем кино научились платить деньги за музыку?

9 комментариев

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;
    }
}

7 комментариев

А мужики-то и не знают!

Сергей Чикуенок из студии Лебедева сделал потрясающее открытие: чем сложнее структура документа, тем больше тормозит браузер.

14 комментариев

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 (ноль) килограмм. Меня мучают нехорошие подозрения. :)

12 комментариев

С Новым годом!

Всех с Новым годом! Кажется в следующий раз в интернете я появлюсь уже в следующем году, сегодня вечером лечу в Казань, встречу Новый год в загородном доме, в кругу семьи.

Спасибо ребятам из EMSPost, которые напряглись и привезли подарок для жены сегодня в офис.

6 комментариев

Адвентисты седьмого «S»

Просьба персонала «S7» выключать все электронные устройства в самолёте, так как они, якобы, мешают навигационным приборам, что не подтверждается наукой, очевидно является вопросом веры. Не наука, значит религия. Если моя вера говорит об обратном, то я могу не подчиниться, сославшись на конституционное право о свободе вероисповедания?

25 комментариев

← сюда туда →