Entries Tagged ‘программирование’:

Обжора skype

Разработчикам нужно отрезать пальцы.

История юзер-агентов

В начале был NCSA Mosaic, и Mosaic называл себя NCSA_Mosaic/2.0 (Windows 3.1), и Mosaic показывал картинки с текстом, и счастье пришло.

И потом пришел новый веб-браузер, известный как «Mozilla», что сокращением было для «Mosaic Killer»(«Убийца Мозаики»)

в конце этой увлекательной статьи вы узнаете, почему юзер-агент Гугл Хрома выглядит так дико:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

рекомендуется к прочтению

mysql, postgre, mongodb и снова mysql

На работе столкнулся с досадным недостатком mysql: он не умеет делать слияние отсортированных индексом массивов.

На пальцах: пусть есть таблица  objects (id, category_id, time) с индексом (category_id, time). Задача – выбрать среди данных нескольки категорий N последних.

Запрос:
SELECT  * FROM objects WHERE category_id IN (10,11,12,13, 14) ORDER BY time DESC LIMIT 10;
даже не думает работать по индексу. Он отбирает все объекты из этих категорий, сортирует их filesort’ом и потом отбирает первые. Хотя очень логично поступить аналогично сортировке слиянием: взять отсортированные последовательности для каждой категории и сливать их, пока не получим N элементов.

Итак, мелькнула идея попробовать применить PostgreSQL. Поставил, перелил в него таблицу, сделал аналогичные запросы – он приятно удивил: 0.5-0.6 секунд против 2.5-3.0 в мускуле. Причём Постгре был под виндой, а Мускул под FreeBSD. Не могу точно утверждать, индексы разруливает лучше или просто сыграл тот факт, что движок быстрее (а он реально быстрее), потому что он и без проставленных индексов работал быстрее мускула (в районе 1.0-1.5 сек).

Я бы на этом и остановился, но шеф настоял, чтобы я попробовал MongoDB. Опустив лирику, могу только подписаться под резюме: “Быстрый, как понос”. Для той же самой задачи он дал результаты порядка 0.2-0.3 сек.

И уже все были готовы перейти на использование MongoDB, как вдруг мелькнула шальная мысль. Сделали копию таблицу в Mysql MEMORY engine, внесли данные в нужном порядке, убрали (!) все индексы. Ура! Результаты порядка 0.02-0.05 сек.

Что тут сказать… Универсальных решений не бывает, вот и всё.

partial distinct

предлагаю SQL-задачку. не надуманная, возникла на работе.

контекст: музыкальный сайт, таблица (mysql) с плейлистами юзера

playlists:
{
int id, //автоинкремент
int song_id, //id самой песни
int user_id, //id юзера, который добавил себе песню
datetime added, //время, когда добавлена песня в его плейлист
}

song_id не уникальны, т.к. песню могли добавить несколько юзеров.

задача: написать SQL для выборки: “последние песни, добавленные в плейлисты пользователей”. для песен нужно вывести кто и когда их добавил в последний раз. дубликаты песен выводить не нужно, если песню добавили два юзера – вывести последнее добавление.

иными словами, нужно выбрать “последние N неповторяющихся песен в плейлистах с указанием того, кто последний и когда её добавил”.

то, что пока придумал я, имеет 4 select’а в запросе и 3й уровень вложенности этих select’ов. сможешь лучше?

P.S. конечно же, должно работать максимально быстро. в наличии есть индекс по added.

день программиста

с праздником нас!

Программист — человек, больной тяжёлой формой поражения коры головного мозга – интеллектом, дальше

Напрягай мозги!

Юра Зновьяк сегодня подкинул забавную задачку. Цитирую:

Interview question: f(f(n)) == -n
Design a function f, such that:
f(f(n)) == -n
Where n is a 32 bit signed integer; you can’t use complex numbers arithmetic.
If you can’t design such a function for the whole range of numbers, design it for the largest range possible.

В двух словах: нужно написать int f(int n) {…} такую что f(f(n))==-n.

Я написал для всего диапазона int, кроме 3х чисел. Мне понадобилась 2 минуты чтобы придумать и минуты 3 чтобы закодить. А ты?