Yet another conference 2011

yac2011]

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

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

Больше всего меня разочаровал доклад Нигмы "В поисках математики", я ожидал, что они расскажут как они высчитывали там супер-алгоритмы для своего поиска, а они рассказали как они сделали свой WolframAlpha. Ну может я лох, что не прочитал более подробный анонс к докладу, но меня не покидало чувство, что меня наебали.

Хотя, вполне возможно конкретика была на мастер классах, но т.к. верстка меня интересует достаточно мало, то их я посещать не стал. Зато в кулуарах атмосфера была гораздо жарче чем на самих докладах и различные споры были гораздо интереснее самих докладов. Очень понравился конкурс для сисадминов, по настройке nginx на скорость и дальнейшем тесте на стресс, хотя чувак из организаторов который отвечал за эту секцию был уж очень нервный, нужно менее эмоционально реагировать, когда зрители заступают за линию.

Но в целом это мелочи, главное что такие события происходят и становятся традицией.

Еще раз спасибо Яндексу


яндекс      

9 million hits/day with 120 megs RAM

Оставлю у себя в закладках.

After checking this for about 9 months, I can tell you this almost always reads that number: 300 microseconds. This is about one third the time a camera flash illuminates. That’s, well, pretty quick. When I started, my software was taking about 0.25 seconds (250 000 microseconds) to produce the front page of my website. I needed to improve performance by over 800x.

Далее


memcache, nginx, php      

Обновления в блоге

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

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

Одно из гланвых изменений, я перенименновал свой канал на feedburner. Теперь RSS доступен по адресу:

http://feeds.feedburner.com/rpsl

прошу всех кто был подписан, сменить рсс. Прежний рсс канал жил очень долго, под именем, которое осталось с момента, когда блог еще был на другом домене. В общем, рано или поздно, это пришлось бы сделать, поэтому лучше сейчас, чем потом.

Кстати странно, но фидбернер не умеет делать редирект после переименнования, это очень плохо. Тот же livejorunal, после того как я переименновал свой аккаунт, зарезервировал мой старый ник и оставил с него редирект на новый журнал, хотя там это платно.


blog, rss      

Node Saver

Примерно в марте месяце, пока мне было скучно и хотелось поиграться с MongoDB, я решил сделать свой аналог замечательного сайта peeep.us. Дело в том, что peeep.us хоть и жутко удобный, но не совсем безопастный, добавленные туда страницы потом хрен удалишь и самое ужасное, он открыт к индексации. Кстати все кто хочет почитать лепру но не имеют туда доступа могут ..., ну короче намек поняли, все как с мегафоном.

save.rpsl.info

Первую версию, которая на момент публикации поста, живет на save.rpsl.info я написал часа за четыре, из них примерно два часа я искал у кого своровать дизайн :D

После этого, я решил что связка php и mongodb для такой микрозадачи не нужна и решил переписать ее на node.js. За несколько вечеров я разобрался и сделал и то, что хотел. В конечном варианте полностью отказалася от MongoDB и заменил его на Memcached. Зачем мне тут монго? Данные я кладу на несколько дней, данных мало, заодно и решится вопрос с их очисткой, а то, что не надежно, ну и фиг с ним. Ничего ценного там хранить смысла нету, а статистика ребута memcached'a на серваке говорит о том, что если раз в полгода я и потеряю данные, то ничего страшного не произойдет.

И все бы было хорошо, но я не решил главную проблему - сохранение работает только для открытых источников, как передавать страницу с сайта, которая закрыта basic auth я не придумал. У меня есть конечнонесколько идей, но проверять их мне слишком лениво. Вторая проблема в том, что мне не хочется из-за этой мелочи поднимать на боевом серваке Node.JS, в какой-то момент пробовал взять виртуалку у clodo.ru, заодно потестировать его, но тесты оказались плачевными, потом хотел у alice2k стрельнуть кусочек vds, но уехал в Испанию и снова забил на это.

В итоге с марта месяца, у меня на рабочем столе лежит папка node, которую я все время хочу удалить и в последний момент вспоминаю, что этого делать не стоит. Несколько раз приходилось доставать из бэкапа.

Сегодня мне захотелось ее удалить, поэтому я решил выложить сорцы на github

В общем форкайте меня, все дела. https://github.com/Rpsl/node-saver


memcache, mongodb, nodejs, php      

Проверка multi_query в mysqli

Увидел сегодня красивое решение проверки выполнения мультизапроса в mysqli.

Если кто не в курсе, то можно сформировать в одну строку кучу запросов, разделяемых точкой с запятой, а потом отдать это на выполнение. Так вот проверять ошибки можно разными способами, а можно просто в конец добавить некий абстрактный SELECT 'complete'. Это подходит для запросов типа INSERT, DELETE, UPDATE.

Eще, у меня в примере указан не прямой вызов multi_query, а обертка для запросов, думаю что это и зачем вам объяснять не нужно.

if ( $DB()->multi("
    UPDATE someshit SET bla=bla-1 WHERE id='%d';
    DELETE FROM someshit WHERE category='%d';
    DELETE FROM someshit WHERE id='%d';
    SELECT 'complete';",
    $id, $category, $id) != "complete" )
{
    self::$resultCode = self::DB_ERROR;
    return false;
}
self::$resultCode = self::SUCCESS;

mysql, php      

Обновил NAS

nas

У меня дома, уже почти год живет ReadyNAS Duo, вчера мне было скучно и я подумал, что будет неплохо обновить его.

Изначально планировал купить в него второй жесткий диск, т.к. с момента покупки, в нем живет только один seagate на полтора террабайта и бэкапам time machine, в последнее время, там очень тесно. Хотел купить второй такой-же, но почитав документацию, обнаружил, что покупка второго hdd не позволит увелить общий объем устройства, а позволит сделать только raid. Так как raid на 1.5 террабайта мне совсем не нужен, я решил отказаться от этой идеи и потом, когда будут ресурсы, купить жесткий диск от 3 террабайт.

Таким образом, из возможного обновления, мне оставалась только оперативка. По спецификации, в него можно засунуть до 1гб оперативной памяти, SODIMM на 200pin. В целом, мне вполне хорошо жилось и на 256. Nas тихо стоит в шкафу, качает торренты, принимает бэкапы и ничего больше не делает, но когда кол-во активных торрентов переваливает 10-15, то веб-интерфейс начинает жутко тупить.

Почитав несколько заметок и упоминаний на сайте производителя, что этому величеству не всякая память подходит, остановил свой выбор на "Crucial CT12864X40B". Заказал, проехался до магазина, привез, запустил.

Вообще я не ожидал сильных изменений, да и на глаз ничего нового не увидел. Работать, вроде, стал шустрее, торренты качаются, time machine стала работать быстрее, но т.к. никаких тестот я не проводил, мне кажется все эти улучшения эффект плацебо.


nas, netgear      

Scrollbar и центрирование

Столкнулся сегодня с косяком, допустим есть однотипные страницы, на которых основной контент автоматически центрируется.

#content {
   margin: 0 auto;
}

Так вот, при загрузке страницы, до момента пока основной контент еще не подгрузился, а шапка уже появилась, то scroll'a справа нету, как только контент подгружается, то сбоку появляется scrollbar и весь контент из-за этого прыгает на несколько пикселей влево. В целом этот баг можно решить, если задать основному блоку min-height, но это не универсальное решение. Тем более это может вызывать косяки, если вдруг окажется, что контента у нас на странице нету, будет большой вентум.

Думали-думали, не знали что делать, в итоге решили сделать как у fb, что бы скроллбар был всегда на странице, не важно активный или нет.

body {
   overflow-y: scroll;
}

Возможно это не самое лучшее решение, но гарантировано убирает проблему с прыганьем контента и избавляет от вероятности появления вентумов на странице.

Может расскажите другие способы решения?


css      

PHP - Переворот числа

Видать dotZero почувствовал, что я уже устал переворачивать строки, поэтому подкинул сегодня задачу, которую я до этого не решал. Днем разбираться с ней было некогда, а вечером, решил все-таки уделить ей внимание и разобраться как это работает.

Задача простая. Перевернуть любое целое число используя только математические операторы. Было 5432, должно стать 2345.

function reverseInt( $a )
{
    $tmp = $a;
    $return = 0;

    while( $tmp > 0 )
    {
        /*

        Играть с числами очень весело, можно находить и открывать для себя
        их волшебные свойства. Так, например, если 432 разделить на 10,
        то мы получим 43.2

        Выделяя остаток от деления, нам очень легко решить нашу
        задачу по перестановке числа.

        Таким образом, проходим по каждому разряду числа,
        умножая его после каждой итерации на 10
        и прибавляя к результату остаток от деления,
        получаем нужное нам число.

        */

        $return = ( $return * 10 ) + ( $tmp % 10 );

        /*
        Каждый раз делим исходное число на 10, что-бы обойти каждый его разряд.
        */

        $tmp = intval( $tmp / 10 );
    }

    return $return ;
}

$foo = 123456789;

echo 'Start: ' . $foo . "\n";

$bar = reverseInt( $foo );

echo 'End: ' . $bar . "\n";

Как видно, все достаточно просто, нужно просто понять как это работает. Теперь хочу найти все варианты с решением этой задачи, думаю что если сделать это с помощью битовых операций получится еще быстрее и красивее.


php, работа      

Request uri в nginx

Второй раз натыкаюсь.

В первый раз я не мог понять почему на php скрипт приходил GET запрос, хотя я отправлял POST и при этом массив был пустой, но при просмотре php://input нужные мне переменные были видны.

Тут ситуация была простой, но не очевидной, при запросе, я не попадал в нужный location и nginx успешно отправлял меня на @404, в следствие чего, php получал уже GET запрос.

Сейчас, эта фича, помогает работать с ssi включениями, т.к. при сборе "блоков" страницы у нас есть возможность получить оригинальный URL и добраться до нужных нам GET параметров.

Из доков nginx:

$request_uri, эта переменная равна полному первоначальному URI вместе с аргументами;

Пример, вывод $_SERVER из подключенного ssi блока:

[QUERY_STRING] => do=search&action=search
[REQUEST_URI] => /?q=творог&lr=213

Что бы получить нужный нам фэйковый $_GET, можно сделать что-нибудь типо этого:

parse_str( str_replace('/?', '', getenv('REQUEST_URI') ), $original_get );

nginx, php      

Хитрожопые инкорпорейтед

Наткнулся сегодня на еще одно решение задачи, про переворот строки. Вспомнил этот комикс.

$a = 'abcdefgh';
// Напишите здесь недостающий код,
// чтобы результатом работы скрипта
// была строка $a, повернутая наоборот
echo $a;
$a = 'abcdefgh';
$a='hgfedcba';
echo $a;

welcome aboard


php, работа