Будильник из Banana Pi (Raspberry Pi)

Скопирую сюда статью которую писал в 2014 году на geektimes, про то как я будильник из микрокомпьютера делал.


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

  1. Уметь играть интернет-радио в качестве будильника.
  2. Работать по Wi-Fi (wpa2, “N” режим, желательно уметь без wps).
  3. Желательно уметь показывать время и работать как часы.
  4. Желательно иметь возможность настройки через телефон или компьютер.

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

Читать далее

raspberry pi, banana pi, php      

Wunder digest

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

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

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

wunder digest

https://github.com/Rpsl/wundrelist-digest

Читать далее

php, service, wunderlist, github, todo      

Turboloader - автоматическое скачивание сериалов

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

turbofilm_m

Изначально я не напрягался, а смотрел серии прямо на сайте через встроенный броузер playstation или apple tv, но бродилки там ущербные и работают совсем не так как все привыкли. Например после очередного апдейта на турбофильме они просто перестали логиниться, т.к. у них форма была на js и тэг "a" был без аттрибута "href", хромы и файрфоксы такое кушают на ура, а эти скромники отказываются. Так как сериалы мне все равно смотреть хотелось, я решил что нужно это исправлять. Сначала пошел по пути легкого сопротивления и сделал на другом сайте простую кнопку, по нажатию которой отправлялся хитрый POST запрос и меня логинило на сайте, но все равно навигация превращалась в ад.

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

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

Turboloader - скачать на гитхаб

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

Пример конфигурации описан на гитхабе. Только я вас прошу, не ставьте проверку часто, а то нас всех выпилят и останемся без сериалов.


nas, php, turbofilm, сериалы      

PHP: detect UTF-8

Пару недель назад, мне кто-то доказывал, что mb_detect_encoding, работает в разы быстрее своих надуманных конкурентов. Задача простая, проверить входящую строку на принадлежность к UTF-8. Логика простая, либо UTF-8, либо нет. В повседневной жизни, обычно не приходится выбирать из зоопарка кодировок и, чаще всего, строка либо в utf8, либо в cp1251.

Сделал простой синтетический тест. Прогнал определение через функцию 10000 раз. Посмотрел кто быстрее.

Вариант 1, который мне нравится:

$s = microtime(true);

for( $i=0; $i<10000; $i++ )
{
    $string = 'sdf;gklaj;skdjf;sdkfls;dfjk';

    if( preg_match('//u', $string ) )
    {

    }
}

$e = microtime(true);

echo "\n\n" . $e-$s;

Средний результат выполнения скрипта на моей машине ~0.020 сек. Сравнивал я его с более правильным решением, которое выглядит так:

$s = microtime(true);

for( $i=0; $i<10000; $i++ )
{
    $string = 'sdf;gklaj;skdjf;sdkfls;dfjk';

    mb_detect_encoding( $string, array('UTF-8'), true );
}

$e = microtime(true);

echo "\n\n" . $e-$s;

Средний результат выполнения скрипта на моей машине ~0.050 сек. После этих тестов, решил прогнать на больших объемах данных, сгенерировал текст размером 10к байт и пропустил через ф-ции. Для preg_match время выполнения составило ~0.120 сек, для mb_detect_encoding ~0.7 сек. Из этих изысканий можно сделать вывод, что определение через preg_match работает в разы быстрее чем стандартные механизмы, но, вероятно, проигрывает в количестве доступых фич. На самом деле, есть еще три миллиона разных способов решить эту задачу, расскажите чем пользуетесь вы?


php, utf      

PHP Memoize

Вчера ради интереса пересматривал pecl каталог модулей для php, наткнулся на интересный модуль memoize. Вспомнил, что сам делал его реализацию на уровне php+memcached.

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

Так же нужно понимать, что код будет выполнен только один раз, поэтому использование, например, sql запросов в ф-ции не допустимо. Недопустимо использование global и его аналогов ( Static::\$data ), недопустимо использование ветвлений в зависимости от времени или окружения.

function my_expensive_function($x) {
    sleep(10);
    return $x . 'bar';
}

memoize('my_expensive_function');

// now calls to my_expensive_function() are cached by their arguments

echo my_expensive_function('foo'); // returns "foobar" in 10s
echo my_expensive_function('foo'); // returns "foobar" in 0.0001s

В общем идея понятна, на уникальность никак не претендует, но свою нишу может занять. Зачем использовать свой велосипед? Модуль на GitHub Модули в Pecl


memcached, memoize, php      

Failed to validate oauth signature and token

На досуге, решил навоять один сервис, который тесно интегрирован с социальными сетями, в частности с твиттером. Во время работы, натолкнулся на интересную ошибку, в "некоторый момент", апи твиттера вылетает и начинает на любые запросы отдавать 401 ошибку. Не авторизован ты и все.

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

Тихо и не спеша, я просрал на это дело около трех вечеров, по 1-2 часа вечером выделяю на проекты. Что самое странное, апи то работало, то не работало и уловить динамику появления ошибки у меня не получалось.

А решение, как обычно было рядом, проблема была в том, что я захлопывал крушку ноутбука :D Точнее так, сервисы я стараюсь сразу делать в родной среде, тобишь на линуксе, для этих делов, у меня есть virtualbox, в котором живут виртуалки с линуксом. Пока я работаю над одним сервисом, выключать виртуалки не приходится. Я их просто перетащил на другой рабочий стол и сижу себе спокойно по ssh, делаю tail -f на лог ошибок. Собственно, паттерн работы с ноутбуком, подразумевает что выключать его приходится редко, а засыпать часто. Ну и вот, после просыпания, в виртуалках время не синхронизировалось, а оставалось тем, в какой момент ноутбук засыпал. Из-за этого, при подписывание запросов, они подписывались не правильно и апи твиттера посылал меня на болт считая жуликом.


api, Linux, php, twitter, virtualbox      

PHP - fastcgi_finish_request

А вы знаете про эту замечательную функцию?

Если кратко, то используя ее можно заставить приложение отдавать контент пользователю гораздо быстрее, разделяя логику приложения на "это необходимо пользователю" и "это пользователю не очень важно". Когда php работает в fastcgi режиме, например в популярной связке nginx+php-fcgi, у вас появляется возможность сначала посчитать все данные которые необходимы что бы отдать пользователю страницу, а уже потом, когда страница отдана и nginx отдает ее клиенту, можно выполнить все остальные действия, например отправить письма или обновить кэш или запустить некие механизмы очистки.

Нужно отдельно упомянуть, что для правильной работы, fastcgi_finish_request должен запускать после session_write_close и ob_* функций.

Простой пример:

import someshit

print(123)
echo 'Hello word';

// В данной реализации, данные отдадутся в клиенту сразу,
// а если закомментировать вызов fastcgi_finish_request(),
// клиент будет ждать 10 секунд, до того, как получит ответ.
fastcgi_finish_request();

sleep(10);

php      

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      

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      

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, работа      

Про блоги

Давно уже в голове крутится мысль, что современные блог движки, они такие сухие, безидейные, не вдохновляющие. Вот тот-же самый wordpress, есть он, у меня на нем блог работает, при этом я 100500 раз переезжал на другие движки и пробовал вести блог на них, но все равно возвращался обратно. Они не вдохновляют на то, что-бы в них писать. Тем на которые можно и хочется написать много, а желания нету. Это не потому что я такой ленивый, а потому что написать новый пост превращается в тягомотину.

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

Идея написать свой блог движег не покидает меня уже миллион лет, но это такая морока, что мне не хочется этим заниматься. Читая интернеты, обнаружил что Бирман выложил очередной релиз своего блог движка. Снаружи очень красивая, внутри какой-то дикий пиздец творится. Я всегда был уверен, что дизайнеры не должны заниматься программированием, а программисты дизайном ( именно поэтому, в моем блоге, такой убогий диз ). Но учитывая, что Эгея носит еще статус беты, я не буду выражать свое "фи", ведь если не заглядывать под капот, то это действительно очень красивый и лаконичный продукт.

Вот честно, я заинсталил его себе и даже тешил себя мыслями, что смогу перенести свой блог туда, мол буду писать там, но две вещи меня держат:

​1) Все ссылки на страницы моего блога поломаются, но это не проблема, это решаемо.

2) Оформление постов в данном движке происходит с помощью wiki разметки и соответсвенно все посты едут, полез в гугл поискать механизм который умеет конвертировать html в wiki формат, но адекватных механизмов не нашел.

На этом и забил.

Но все же мысль избавить от Wordpress'a не дает мне покоя. Он меня жутко достал. Он медленный. Он уродует контент. #hate, #hate.

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

Вот опять я всех обругал, а ведь не хотел. ((


blog, e2, php, wordpress      

PHP Перевернуть строку без буфера.

Еще один способ как перевернуть строку. Не используется дополнительный буфер, просто красивая работа с данными.

$str = (string) '123456789';

echo $str . "\n";

$count = strlen( $str ) - 1  ;

for( $i=0; $i<=$count; $i++ )
{
    $str[ $count + $i + 1 ] = $str[ $count - $i ];
    $str[ $count - $i ] = '';
}

echo $str . "\n";

Результатом выполнения будет

123456789
987654321

Все просто.


php, алгоритмы      

Preg Match на уровне Дьявола

$pattern = "/\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}
|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})
[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})
[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}
[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})
[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]
{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})
[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}
[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})
[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}/i";

Кто скажет что это?


php, preg_match      

Еще немного про собеседования

Решил дополнить поднятую тему про собеседования и рассказать о вопросах которые задают чаще всего.

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

Первое на что хочу обратить ваше внимание, это то, что вопросы которые задают php(?) программистам, в основной своей сути имеют довольно академический характер и в жизненных циклах проектов встречаются не часто, но тем не менее, нужно уметь решать эти задачи. Это обусловленно тем, что у работодателей нету времени и желания давать вам типичные задачи, в стиле - "Напиши класс, который будет отвечать за работу с пользователями". 99 процентов всех вопросов задаются по заготовленному листку и должны быть решены на листке бумаги. Никаких IDE, никаких гуглов, никаких ответов типа "я не помню синтаксис". Если вы настроены решительно и хотите произвести хорошее впечатление, то уделите время, что бы потренироваться и чувствовать себя уверенно.

Все вопросы можно разделить на три категории: PHP, MySQL(?), все остальное.

Любой из этих пунктов, так же делится на две части: теория и практика. Начну пожалуй с PHP. С теоретическими вопросами, в целом, не сложно. Они почти везде одинаковые: Отличия между PHP 5.2 и 5.3, основные приципы ООП. Не частый, но вопрос с подвохом - "В каких случаях использование ООП, является убыточным?". Дальнейшие вопросы на теорию, в основном, зависят от ваших ответов, и несут цель узнать на сколько хорошо вы разбираетесь в материале о котором говорили выше.

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

function revert( $string ){ return strrev( $string ); } ?>

Но это не cамый лучший вариант ответа. Выучите алгоритм с обращением к символом строки как к объекту массива.

Очень частые задачи, на написание рекурсивных функций или на понимание работы операторов кода.

$a = 10;
echo ++$a + $a++ - ++$a + $a ;

На днях пока решал задачи, попалось интересное задание, у меня такое ни разу не спрашивали, но думаю что к такому надо быть готовым:

var_dump( 0123 == 123 );

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

Теоретические вопросы про MySQL или любую другую СУБД почти всегда касаются индексов и насколько вы понимаете как их использовать, в каких случаях и на что их ставить и в каких случаях индексы могут быть вредны. Обязательно спросят про различия между версиями. Поинтересуются насколько глубоко вы знаете тонкости работы СУБД и вкурсе ли вы про то, что такое тригеры, хранимые процердуры, представления.

Практические задачи - это просьба нарисовать две таблицы с различными данными и просьба написать запрос, который покажет умеете ли вы использовать операторы HAVING, GROUP BY, ... etc. Обязательно знать разницу между JOIN запросами.

Еще часто спрашивают про верстку, про css, про javascript. Но расписывать это все не вижу смысла.


css, javascript, join, mysql, php, жизнь, работа      

Немного про собеседования

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

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

Вообще собеседования, для меня стали большим мотиватором в саморазвитии. Помню как я пошел на самое первое, был уверен что я такой крутой и смогу все рассказать сходу, расскажу какие ~~крутые~~ штуки я умею делать и меня сразу возьмут. ХА ХА Лох. На первом собеседование, меня за пять минут смешали с грязью и больше всего мне хотелось провалиться сквозь землю. Когда перед тобой сидят несколько взрослых человек и задают тебе серьезные вопросы, на которые ты не знаешь как ответить, но говорить "я не знаю" считаешь не приемлемым, то разволноваться в общем не проблема.

Первый вопрос, с которого было начато собеседование звучал так: "Что из себя представляют индексы (MySQL) в физическом плане". Блядь. Да я никогда в жизни не задумывался, о том, что они из себя представляют в физическом плане. Начал рассказывать про B-Tree, бла-бла-бла, но я понятие не имею что это за файлы и какая у них структура. Сказал честно, что никогда этим не интресовался, но попытался предположить как и что это. В общем был полный FAIL. Хотя думаю что даже если бы и попал в ту контору, очень быстро бы сгорел работать по китайскому календарю и тратить по два часа на общественный транспорт.

В другой, на первый взгляд, не плохой конторе, меня встретили директор отдела разработок и его заместитель. Рассказали мне про контору, задавали кучу вопросов из книги про гору фудзи, все бы хорошо, но это было в двухпоточном режиме. Директор мне задавал задачи, я решал их на листочке, а его заместитель при этом активно общался со мной и мне приходилось решая задачу, общаться с ним на тему сколько шариков для тениса поместиться в боинг, сколько автомобилей и заправок для них в Москве и попытаться ответить на самый не нормальный, но не менее интересный вопрос "Как называется наша вселенная?"

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

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

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

Сейчас, пока поднимаю воспоминания, вспомнил про еще довольно странную контору. Офис - несколько этажей в довольно крупном бизнес центре. Очень крутой пакет (страховка/обеды/...), достаточно высокая зарплата на старте ( \ 80 000 ), корпоративная лицензия на PhpStorm :)))

Так вот, к собеседованию я готовился почти неделю. Вызубрил все различия между версиями php и mysql, поднял все знания какие есть по паттернам программирования и мог с ходу написать кучу разных интересных штук. Выспался, пришел в отличном настроение и так нелепо обломался.

Вопросы которые мне задавали, были настолько простые, что я оказался к ним не готов. Я не смог вспомнить, что различия между одинарной кавычкой не только в автопарсинге переменных, но еще и преобразование спецсимволов, запутался в htmlentities и html_entity_decode и вообще очень сильно лажал на примитивных вещах, на которые до этого никогда не обращал внимание. Было стыдно и был очень злой на себя.

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

Ну и тем крутым, которые знают php отлично, я процитирую Bolk'a

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

Сказать есть ли тут ошибки, если нет, то что получим и что вообще тут происходит.

var_dump((bool) print_r(${strrev('SLABOLG')} = 1, $GLOBALS[1]{1} == (unset) b"1") == "00");

mysql, php, жизнь, работа      

PHP Кэширование картинок часть вторая.

Я уже когда-то писал про мой способ кэшировать картинки, а сейчас заметил, что не выкладывал сюда переделанный варинт,
Идея осталась прежней, только работа с изображениями была отдана либе http://phpthumb.gxdlabs.com/

/**
 * Скрипт iCacher создан что бы облечить кеширование изображений на сайте
 * и организовать лаконичную возможность генерации картинок различных размеров.
 * iCacher является т.н. роутером для http://phpthumb.gxdlabs.com/ и не будет
 * работать правильно при отсутвие данной библиотеки.
 *
 * Для правильно работы подразумевается соблюдение нескольких правил:
 *
 *  1. В папке MAIN_FOLDER хранятся оригинальные изображения.
 *  2. В папку CACHE_FOLDER будут храниться измененные изображения.
 *  3. При обращение к несуществующему файлу из папки CACHE_FOLDER происходит
 *      перенаправление на данный файл*, который в свою очередь создает
 *      необходимый файл либо возвращет 404 ошибку.
 *          * .htaccess rewrite rule:
 *              RewriteRule   ^images_folder/([0-9a-z]+)/([0-9a-z]+)/(.*)$  iCacher.php?param=$1&size=$2&file=$3 [L,QSA]
 *  4. После генерации изображений они должны быть доступны по прямому запросу.
 *  5. Для обновления миниатюр вы должны самостоятельно организовать удаление
 *      созданых скриптом файлов.
 *      В крайнем случае можно использовать GET параметр flush с любым значением.
 *
 *
 *  При необходимости создавайте собственные плагины или ф-ции обработки.
 */

Скрипт лежит на github.com - https://github.com/Rpsl/iCacher/blob/master/iCacher.php

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


cache, htaccess, images, php, картинки      

WordPress — gallery shorttag highslide

Два примера, для решения одной и той же задачи.

В первом примере полный идиотизм, во втором хорошее решение. Вот теперь вопрос, почему большая часть всех CMS работает как первый пример. ?
Читать далее


blog, javascript, jquery, php, wordpress      

Разработка под Joomla

joomla.png

Хочешь испытать чувства сходные с разработкой под Joomla ?
Да
Брось говно на вентилятор.


CMS, joomla, php, разработка      

Кэширование MySQL - MySimpleCache

Собственно возвращаясь к прошлому посту - "PHP Кэширование MySQL, хочу сказать спасибо всем, кто помог советами.

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

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

Проект поселился на github.com, маловероятно, но возможно он еще будет обновляться, так что актуальная версия всегда там.

github.com

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

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

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

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


cache, memcache, mysimplecache, mysql, php, sql      

PHP Кеширование Mysql

mysql

UPD: Рабочая версия php MySimpleCache

Други, мне требуется ваша помощь или совет.

Такая ситуация, есть большая куча сайтов, написанных давным-давно. Они представляют из себя кучу файлов, в которых идет в перемешку php/html/sql запросы. Ни о каких современных паттернах программирования там речи нету. Переписывать эти сайты нет ни времени, ни желания, но они ужастно грузят БД.

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

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

mysql_query
mysql_fetch_assoc
mysql_fetch_array
mysql_num_rows
mysql_result
....

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

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

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


cache, memcache, mysql, php      

Чат для vbulletin

Главное что бы было желания, все остальное уже дело техники.

Снимок экрана 2010-03-05 в
11.37.50.png

Очень давно я хотел сделать чатик для нашего уютного форума. Если кто-то помнит, то он даже был там очень давно, но тогда по техническим и эстетическим причинам его пришлось убрать.

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

В итоге, просидев около 4 часов над сорцами чата и переделкой его стилей у нас получилась отличная консоль, которая открывается - закрывается по нажатию горячих клавиш и доступна всем зарегистрированным пользователям.
Единственная проблема с которой я столкнулся - это кривое отображение в ie6, но решать её, по своим внутренним убеждениям я не собираюсь.

Живой пример на http://forum.centrgroup.ru (для зарегистрированных)
Если кому интересна сама реализация - пишите в комменты, постараюсь рассказать.


centr, php, vbulletin, форум      

Livejournal in google reader

livejournal
Давным давно, в одной далекой галактике, я сделал себе standalone блог и livejournal, потихоньку начал пропадать из списка сайтов которые я посещаю ежедневно. Учитывая, что я читаю около пары сотен человек, то вариант захождения раз в неделю и чтения всех записей начинал сильно утомлять, т.к. трудно осилить пару сотен постов. В то же время я начал активно пользоваться google reader'ом для чтения rss каналов сайтов которые мне интересны.

К сожалению и по не сильно понятным мне причинам, livejournal не даёт читать френделенту через rss, но зато он позволяет подписаться на rss конкретных пользователей которые вам интересны. В то же время, в Google reader есть возможность сортировать каналы по папкам, и если читать сразу всю папку, то получается как раз подобие френдленты. В целом всё хорошо, только этот вариант не подходит тем, у кого друзья пишут под замочные записи, но и тут тоже livejournal предусмотрел вариант аутентификации, для получения ленты с закрытыми записями.

В интернете есть различные серивисы, включая pipes.yahoo.com и freemyfeed.com, которые могут выступать в роли прокси, но меня не устраивает вариант, когда мои пароли будут храниться не понятно где. Поэтому я сделал маленький прокси, которые автоматически авторизует вас для google reader'а и на выходе вы получаете полный feed ваших друзей.

Читать далее

Google, livejournal, php, rss      

Twitter it для vBulletin

На днях, мне захотелось сделать наш форум еще более интегрированным в, не побоюсь этого слова, великую социальную сеть twitter.

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

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

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

twitterit

Читать далее

centr, php, vbulletin, форум      

PHP Кэширование картинок.

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

Логика работы скрипта очень простая. Он смотрит входящие параметры, проверяет есть ли картинка заданного размера и отдает её если она есть или создает в подпапке  такую картинку и отдает её.

Это спасает нас от необходимости делать кучу ресайзов при загрузке картинки + это универсальный способ, который можно использовать в любом проекте.

Листинг под катом.

Читать далее

bash, images, optimize, php      

Автоматическое обновление wordpress

Есть в wordpress'e такая занимательная опция, как автоматическая установка и обновление плагинов. Просит от вас только указать хост, логин и пароль для ftp/sftp доступа, а далее делает всё сама. К сожалению "из коробки" эта опция заводится далеко не у всех. Если вы тоже стали одним из счастливых обладателей сообщения:

Downloading update from http://downloads.wordpress.org/plugin/%plugin-name%.zip

Download failed.: Could not create Temporary file

Installation Failed

... то сделать вам нужно следующие: Читать далее


php, update, wordpress      

Hotkeys для wordpress

В этой заметке, я расскажу как легко добавить в ваш блог поддержку hotkey's.

Hotkey - это определенное сочетание клавиш, по нажатию которых происходит определенное действие. Мы уже привыкли использовать ctrl+c/ctrl+v. Тенденции развития интернета диктуют свою моду и многие уже привыкли использовать для перехода между страницами сайта сочетание "ctrl+left" или "ctrl+right".

Для добавления этого функционала, первое что нам потребуется - плагин hotkey для библиотеки jquery.

jQuery hotkey

Теперь о том, как это сделать. У нас есть два варианта:

  • Генерировать код в самом шаблоне с помощью встроенных функций
  • Генерировать код "на лету", с помощью JS

Я выбрал второй вариант, т.к. он мне показался более правильным, во первых мы не напрягаем шаблон лишними вызовами, и главное мы уверенны что будем получать правильные ссылки. Ведь нам нужно на главной странице листать все записи, в категории листать записи категории, а внутри поста листать посты. Таким образом, всё что нам осталось, это добавить в header шаблон (скорее всего header.php) нижеприведенный код.

Читать далее

blog, javascript, php, web2.0, wordpress      

Интеграция phpbb3 с любым сайтом.

Не очень давно, по работе, пришлось делать интеграцию уже имеющегося сайта, с форумом на системе phpBB 3-ей версии.

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

Для того, что бы понимать зачем и как это делать, сначала я постараюсь объяснить логику работы. Из уже готовых изменений, нам нужно добавить в БД сайта, дополнительное поле, например - 'user_f_id', в которое мы будем записывать информацию о сопоставлении профилей пользователей сайта, с профилями пользовталей форума (предполагается числовой идентификатор, user_id из БД форума - таблицы %prefix%_users).

Читать далее

php, phpbb, форум      

Цветовая идентификация

function get_username_html_color($username )
{
    return '#' . substr( md5($username ), 0, 6 );
}

Довольно приятная идея возникла у subz в топике на хабрабабре.
Пользователь "Dreadatour" сразу накидал скрипт который в реал тайме отобржает ваш цвет.
Идея класс, обязательно куда нибудь прикручу.


blog, habrahabr, php      

Movable Type: Поигрались и хватит

Четыре месяца назад, я наткнулся на это двигло и мне стало интересно, а как же оно работает? Захотелось пощупать, потрогать изнутри, пропатчить чего нибудь. Тут и господин saahov нашелся очень кстати. Поставил, вот уже сколько играюсь и всё больше и больше склоняюсь к мысли, что ну его в пень.

Блог, должен быть тем инструментом, который один раз настроил, поставил, дизайн нарисовал и больше проблем возникать не должно. А тут, как ни попытка копнуть глубже, так гемморой.

Ладно, молчу про то, что он (MT) такой весь из себя для гиков. Просто меня он не устраивает.

Не устраивает то, что на подсос всех библиотек и обработку обычного логина ему нужно почти 100мб оперативки и только на машине с более чем 500мГц на борту он перестает занимать cpu на 100%.

Не утраивает довольно тупая система стилей. С шаблонами все просто великолепно, только вот со стилями проблемы и ладно то, что через css можно извратиться как хочешь и поменять местами, но ведь остальная его часть замурована. Может мне просто не хватило терпения и внимательности, но попробуйте что угодно ввести слева в строку поиска. Удивитесь. =)

Читать далее

CMS, perl, php, wordpress