• Тонкости Rails 4 — Thread-Safety

    • Translation
    • Tutorial


    В Rails 4.0 по умолчанию будет включена опция config.threadsafe! и в данном уроке вы узнаете о том, что же она все-таки делает, как влияет на production и как вообще стоит вести себя с потоками.
    Читать дальше →
  • Стабильное вещание IPTV через VLC

      С IPTV пришлось познакомиться поближе, когда в компании интернет-провайдера где я работал, решили организовать вещание IPTV. Выяснилось, что вещание осуществляется в linux и программой vlc, которая по слухам единственная в своем роде. Была установлена тарелка и DVB-карта SkyStar2, которая предположительно должна была без проблем заработать в linux'e. Так и было со всеми новыми машинами, где была установлена ubuntu server. На Debian заработало только после обновления ядра. Настройка прошла относительно легко, благо на то время уже было несколько статей на эту тему и документация к vlc была тоже очень полезна. После запуска начались некоторые проблемы с пропаданием звука и видео на каналах и другие проблемы, описанные ниже. После их появления были написаны скрипты, устраняющие эти проблемы. Сейчас на них работает 3 сервера с 5 dvb-картами в общей сложности и вещается 23 канала с 3х спутников. Под катом — перечисление проблем, которые могут появиться после запуска вещания IPTV через VLC в Linux и то как с ними бороться. Бороться будем с помощью bash.
      Читать дальше →
    • Переделывание D-Link DIR-320 в 3G роутер

      Я более чем уверен, что многие уже не один раз видели подобные заголовки. Но каждый раз, когда их читаешь, получается, что нужно купить какой-то самый в мире проверенный модем, да к тому же удача должна быть к тебе благосклонна. А ведь самая распространённая проблема заключается в том, что нет такого модема, который бы не зависал по истечению определенного времени. Самый длинный интервал, что я видел – это 8 (восемь) часов. Как следствие, многие отказываются от подобной задумки и опускают руки, а в случае если без роутера никак, то приспосабливают для этих целей старенький ПК, да еще и устанавливают Windows (как правило, XP, ну или что будет под рукой).
      Так как ПК и уж тем более Windows, для меня не вариант и «того самого» модема у меня не было под руками, пришлось искать решение.
      Если интересно продолжение, прошу под «кат».
      Читать дальше →
    • Оперативная реакция на DDoS-атаки

      Один из ресурсов, за которым я присматриваю, вдруг стал неожиданно популярным как у хороших пользователей, так и у плохих. Мощное, в общем-то, железо перестало справляться с нагрузкой. Софт на сервере самый обычный — Linux,Nginx,PHP-FPM(+APC),MySQL, версии — самые последние. На сайтах крутится Drupal и phpBB. Оптимизация на уровне софта (memcached, индексы в базе, где их не хватало) чуть помогла, но кардинально проблему не решила. А проблема — большое количество запросов, к статике, динамике и особенно базе. Поставил следующие лимиты в Nginx:

      на соединения
      limit_conn_zone $binary_remote_addr zone=perip:10m;
      limit_conn perip 100;
      

      и скорость запросов на динамику (fastcgi_pass на php-fpm)
      limit_req_zone $binary_remote_addr zone=dynamic:10m rate=2r/s;
      limit_req zone=dynamic burst=10 nodelay;
      

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

      Но плохиши продолжали долбить, и захотелось их отбрасывать раньше — на уровне фаервола, и надолго.

      Сначала сам парсил логи, и особо настырных добавлял через iptables в баню. Потом парсил уже по крону каждые 5 минут. Пробовал fail2ban. Когда понял, что плохишей стало очень много, перенёс их в ipset ip hash.

      Почти всё хорошо стало, но есть неприятные моменты:
      — парсинг/сортировка логов тоже приличное (процессорное) время отнимает
      — сервер тупит, если началась новая волна между соседними разборками (логов)

      Нужно было придумать как быстро добавлять нарушителей в черный список. Сначала была идея написать/дописать модуль к Nginx + демон, который будет ipset-ы обновлять. Можно и без демона, но тогда придётся запускать Nginx от рута, что не есть красиво. Написать это реально, но понял, что нет столько времени. Ничего похожего не нашёл (может плохо искал?), и придумал вот такой алгоритм.

      При привышении лимита, Nginx выбрасывает 503-юю ошибку Service Temporarily Unavailable. Вот я решил на неё и прицепиться!

      Для каждого location создаём свою страничку с ошибкой
      error_page 503 =429 @blacklist;
      

      И соответствующий именованный location
      location @blacklist {
          fastcgi_pass    localhost:1234;
          fastcgi_param   SCRIPT_FILENAME    /data/web/cgi/blacklist.sh;
          include         fastcgi_params;
      }
      

      Дальше интересней.
      Нам нужна поддержка CGI-скриптов. Ставим, настраиваем, запускаем spawn-fcgi и fcgiwrap. У меня уже было готовое для collectd.

      Сам CGI-скрипт
      Читать дальше →
    • Домашний/проводной интернет с резервным каналом по 3g

      Решил написать, так как в основном есть статьи по резервированию основного 3g канала на другой, а 3g как резервный при проводном интернете — почему то сложно найти.

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

      Покопав интернет, были найдены устройства с поддержкой 3g «свистков». Выбор был из Zyxel Keenetic, drytek и TP-Link (но всю жизнь работали с Asus и D-Link по объективным причинам и собственным статистическим данным). По опыту решения «всяких» задач, выбор пал на TP-Link. Выбрать было просто, Open WRT дружит со всеми TP-Link'ами (запасной вариант). Так же требования по 3g связи. Предоставили мне Huawei E367 от мегафона.

      Коробка попала ко мне в руки. (описывать ее не буду, описаний много, сразу к делу). Приятные плюшки от TP-Link'а радовали всегда. В «поле» он у нас ни когда не тестился. Работа всегда велась с более стабильными роутерами. Но Open WRT в данном вопросе — перевесил все сомнения. И как оказалось — не зря, но об этом позже.

      Базовая прошивка, базовая настройка, Wan preffered, запуск, тест. Эмуляция «сетевой кабель не подключен» работает на ура. В обе стороны как надо переключается канал. Но мы то знаем, что «падения» бывают не только на «крыше», но и дальше. Кто то что то копал, задел кабель, порвал. Свитч жив, линк по кабелю жив, роутер «думат» что всё ок. Нас это не устраивает.

      Задача:
      1) TP-LINK TL-MR3420 V2
      2) 3g интернет Мегафон Huawei E367
      3) Провайдер с настройками по Static IP и проводом с RJ-45
      Читать дальше →
    • Arduino&Oregon или погодная станция своими руками

      Не так давно ко мне в руки попал набор юного радиолюбителя Arduino и много разных проектов получили путевку в жизнь (или «в стол»), но дурная голова рукам покоя не дает до сих пор.
      Благодаря удачному стечению обстоятельств случилось так, что в одном месте оказались:
      • Arduino — 1 шт.
      • Датчик для измерения температуры и влажности Oregon THGN132N — 2 шт.
      • RF-kit (приемник и передатчик) на 433МГц — 1 шт.

      Дополнительно к вышеперечисленному (исключительно для быстрого прототипирования) использовался Starter Kit от Seeed Studio (из него понадобился base shield, дисплей 16х2 с последовательным интерфейсом, модуль светодиода и соединительные кабели).
      Что же получилось?
    • Rails params & GC

        У нас тут в Rails комьюнити опять драма. Первоначальный репорт. Есть методы типа find_by_* которые проецируются на модели в find_by_title например и find_by_id.
        Их можно использовать так
        find_by_id(params[:id], select: «CUSTOM SQL»)
        Но обычно их используют вот так
        find_by_id(params[:id])
        И происходит SQL Injection если в params[:id] лежит {:select => «CUSTOM SQL»} — опции могут быть и в первом аргументе.

        Обратите внимание — :select это символ а не «select»(строка). Это значит что трюк ?id[select]=SQL не пройдет т.к. ключ окажется строкой. И вообще params это хеш типа HashWithIndifferentAccess. Те у него ВПРИНЦИПЕ не может быть символов в ключах т.к. они все уничтожаются при создании.

        Есть такой gem authlogic, в общем виде он использует find_by_token(token) где token это объект из сессии(которая хранится в куках и подписана session_secret). Чтобы в него записать :select => «SQL» вам нужно знать session_secret, поэтому уязвимость крайне редкая.
        Весь этот SQL Injection CVE не стоит выеденного яйца! И ради чего пост? DoS!
        Читать дальше →
      • Nginx+php-fpm+perl под Debian Squeeze

        • Tutorial

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

        В качестве теста решил перевести все свои сайты на nginx, до этого все работало на Apache из состава ZendServerCE. Интересно было пробовать насколько сложно будет полностью переехать на новый для себя веб-сервер, ведь используется несколько CMS (DLE, Wordpress, самописныеCMS).

        Задачи:
        • базовая работа web сервера — обработка html;
        • запуск php скриптов;
        • корректная работа phpmyadmin для всех сайтов на сервере;
        • запуск cgi и pl скриптов;
        • использование кеширования и подбор оптимальных параметров для увеличения производительности.


        Имеем свежеустановленный сервер Debian 6 в минимальной установке из netinstall. И так поехали.
        Читать дальше →
      • Шпаргалка по верстке для больших и маленьких

        Приветствую!

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

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

        • Translation
        Три года назад, когда я работал веб-разработчиком на YouTube, один из старших инженеров начал разглагольствовать о слишком большом весе видеостраницы. Страница была раздута до 1,2MB и содержала десятки запросов. Этот инженер так и заявил: если целые клоны Quake пишутся с объемом до 100KB, у нас просто нет оправданий! Я согласился с ним и был в восторге от нового проекта, решив сделать страницу просмотра YouTube с весом ниже 100 КВ. В этот вечер, в автобусе, едущем из Сан-Бруно, я написал код прототипа. Я решил ограничить функциональность базовым минимумом: видеоплеер, пять похожих видео, кнопка «Поделиться», инструмент разметки и десять комментариев, загружаемых с помощью AJAX. Я назвал проект “Feather” (англ. — перышко).

        Даже при таком ограниченном наборе функций страница весила около 250 КБ. Я углубился в изучение кода и понял, что наше средство оптимизации (т.е. Closure compilation) не способно исключить код, который никогда реально не используется на самой странице (чего и следовало ожидать от любого инструмента в сложившихся обстоятельствах). Единственным способом дополнительно сократить код было вручную оптимизировать спрайты CSS, Javascript и изображения. Три дня стараний — и я получил гораздо более удачное решение. И все равно это было не 100 КБ. Я совсем недавно закончил написание кода видеоплеера HTML5, и поэтому решил включить его вместо гораздо более увесистого Flash player. Бамс! 98KB, и всего 14 запросов. Я снабдил код некоторыми базовыми возможностями мониторинга и запустил его исполнение в части нашего трафика.
        Читать дальше →
      • Комфортное освещение для работы и отдыха

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

        Эта заметка содержит описание общих принципов создания комфортного освещения и фактическую реализацию бюджетного освещения жилой мастерской.



        Читать дальше →
      • Теория радиоволн: ликбез

          image

          Думаю все крутили ручку радиоприемника, переключая между «УКВ», «ДВ», «СВ» и слышали шипение из динамиков.
          Но кроме расшифровки сокращений, не все понимают, что скрывается за этими буквами.
          Давайте ближе познакомимся с теорией радиоволн.
          Читать дальше →
        • Литьё по моделям напечатанным на 3D-принтере

          • Translation

          Jeshua Lacock пишет:
          Эта страница описывает мою первую и успешную попытку отлить алюминиевые детали напрямую с моделей напечатанных PLA на 3D-принтере. Процесс практически идентичен литью с восковой модели, но вместо выжигания воска я выжигал пластик PLA (био-пластик)
          Читать дальше →
        • Noty — необычайно гибкий плагин jQuery для вывода уведомлений


            Почти месяц назад вышла вторая версия прекрасного и замечательного jQuery Notification plugin для вывода самых разнообразных уведомлений на сайте, странно что Хабр вообще обошёл его стороной, исправлю ситуацию.
            Читать дальше →
            • +107
            • 27.1k
            • 27
          • Оптимизация работы веб-студии. Применение теории ограничений в производстве сайтов



              В статье «12 тыс рублей за сайт. Есть ли бизнес за МКАДом?» я писал про наш подход к разработке сайтов на базе разработанной внутри компании технологии. На момент написания той статьи, мы выпускали «под ключ» 24 сайта в месяц. Это больше чем один сайт в день силами команды из 8 человек.

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

              И тут наше производство затрещало по швам. Практически сразу заявки стали становиться в очередь, менеджеры начали путаться в проектах, дизайнеры стали проситься в отпуск. Ситуация становилась поистине напряженной…
              Читать дальше →
            • CSRF уязвимость в Wordpress — комментарии

                Введение


                Читал я вчера про Егора Хомякова. Подумал — может и я так смогу? И начал я со своего блога на Wordpress. Адрес приводить не буду, иначе сам блог ляжет от Хабраэффекта, а меня обвинят в рекламе :).

                Теория


                Итак, где имеет смысл искать CSRF в Wordpress? Мне на ум приходит только одно — комментарии. С них я и начал.
                Осторожно, под катом две PNG картинки среднего размера. (этика, этика...)
                Читать дальше →
              • 10 миллионов хитов в день с WordPress на сервере за $15

                  Английский разработчик Эван Лейт (Ewan Leith) опубликовал пошаговую инструкцию, как поднять виртуальный микросервер на Amazon, Linode или другом облачном хостинге, который сможет крутить блог WordPress и выдерживать 10 миллионов хитов в сутки (отчёт составлен с помощью Blitz.io), при этом будет стоить всего пятнадцать долларов в месяц.

                  Инструкция описывает, как последовательно установить Ubuntu 11.10 (Oneiric), MySQL, PHP с PHP FPM, APC и модулем MySQL, Nginx с конфигурацией для WordPress, ну и сам WordPress. После этого сервер работает ещё довольно медленно, но всё меняет установка W3 Total Cache и Varnish, которые вместе с Nginx способны сотворить настоящее чудо.

                  Выполнить действия из инструкции способен даже человек, не являющийся техническим специалистом.
                  Читать дальше →
                • Rails: Хватит отмазываться, начинаем BDD-ить!

                  Кто здесь?


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

                  11:24:21 PM Michael: ну хз, надо пробовать
                  11:24:24 PM Michael: наверное так лучше
                  11:24:27 PM Michael: даже я думаю наверняка
                  11:24:36 PM Michael: но пока меня че-то останавливает
                  11:24:38 PM Michael: лень наверное :)
                  

                  Знакомо? «Не хочется разбираться? Нет времени?» Тогда читаем дальше. В статье расскажу, как настроить свое любимое рельсовое окружении на разработку с подходом BDD и начать новую жизнь (опционально).
                  Поехали!
                • IPv6 — он рядом. Часть 1



                  Сегодня идет множество дискуссий насчет сроков по внедрению IPv6 везде и всюду. Но очевидно одно: без телодвижений крупных компаний ничего не выйдет. Google уже использует IPv6, существуют сети, которые предоставляют IPv6, в том числе некоммерческие.
                  В этом посте я хотел бы рассказать не только как приобщиться к миру IPv6, но и некоторые тонкости, связанные с ним, о которые мне пришлось споткнуться.
                  В данном случае рассматривается не самый тривиальный сценарий настройки, в котором используется домашний сервер и вы полностью распоряжаетесь выделенным вам адресным пространством.
                  Читать дальше →