Pull to refresh
-2
0
Send message

Вышло обновление, повышающее общую безопасность Windows 7

Reading time1 min
Views246K
Доброго дня,

спешу сообщить, что Microsoft выпустило новое обновление, KB2872339.
Особенность его в том, что оно негативно повлияет на пользователей нелицензионной Windows 7
Читать дальше →
Total votes 88: ↑55 and ↓33+22
Comments63

Centrifuge — я больше не буду обновлять страницу перед отправкой комментария

Reading time10 min
Views25K
Прошло некоторое время с тех пор, как я писал про Центрифугу в предыдущий раз. Произошло множество изменений за этот период. Многое из того, что было описано в ранних статьях (1, 2) кануло в лету, но суть и идея проекта остались прежними — это сервер рассылки real-time сообщений пользователям, подключенным из веб-браузера. Когда на вашем сайте возникает событие, о котором вам нужно моментально сообщить некоторым вашим пользователям, вы постите это событие в Центрифугу, а она, в свою очередь, отправляет его всем заинтересованным пользователям, подписанным на нужный канал. В самом простом виде это показано на схеме:



Проект написан на Python с использованием асинхронного веб-сервера Tornado. Использовать можно даже если бекенд вашего сайта написан не на Python. Хотелось бы рассказать о том, что Центрифуга представляет собой на данный момент.
Читать дальше →
Total votes 57: ↑55 and ↓2+53
Comments31

Пара полезных команд, которые могут пригодиться при DDoS и не только

Reading time3 min
Views81K
В моем случае, в качестве frontend сервера, стоит nginx и формат access-лога имеет вид:

log_format main '$remote_addr — $remote_user [$time_local] "$host" "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" -> $upstream_response_time';

Что на выходе дает что-то вроде такой строки:

188.142.8.61 — - [14/Sep/2014:22:51:03 +0400] «www.mysite.ru» «GET / HTTP/1.1» 200 519 «6wwro6rq35muk.ru» «Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.191602; .NET CLR 3.5.191602; .NET CLR 3.0.191602» "-" -> 0.003

1. tail -f /var/log/nginx/nginx.access.log | cut -d ' ' -f 1 | logtop

Позволяет получить общую картину: распределение уникальных IP, с которых идут запросы, кол-во запросов с одного IP и т.д.
Самое ценное — что все это работает в режиме реального времени и можно мониторить ситуацию, внося какие-либо изменения в конфигурацию (например просто забанить ТОП 20 самых активных IP через iptables или временно ограничить географию запросов в nginx через GeoIP http://nginx.org/ru/docs/http/ngx_http_geoip_module.html).
Читать дальше →
Total votes 105: ↑101 and ↓4+97
Comments21

Эффект неисправного монитора для текста, картинок и SVG

Reading time4 min
Views115K
Эффект Glitch Лукаса Беббера выглядит очень круто — как будто вы смотрите на текст на старом мониторе, который слишком часто роняли на пол и у него «плавает» вертикальная синхронизация и сведение.

Реализация этого эффекта на CSS выглядит вполне убедительно. Мне пришлось немного поломать голову, чтобы выяснить, как он работает, и теперь я хочу объяснить это вам. Кроме того, я воспроизвёл этот эффект не только для текста, но и для растровых изображений и SVG, а так же написал несколько примесей Sass, чтобы облегчить работу с ним.


Читать дальше →
Total votes 182: ↑176 and ↓6+170
Comments34

Django widgets и еще пара трюков

Reading time7 min
Views26K


Все знают что Django это замечательный фреймворк для разработки, с кучей мощных батареек. Лично для меня, при первом знакомстве с django все казалось крайней удобным — все для удобства разработчика, думалось мне. Но те кто с ним вынужден работать в течении долгого времени, знают, что не все так сказочно, как кажется новичку. Шло время проекты становились больше, сложнее, писать вьюшки стало неудобным, а разбираться во взаимоотношении моделей становилось сложнее и сложнее. Но работа есть работа, проект был большой и сложный, и, ко всему прочему необходимо было иметь систему управления страниц как в cms, и, вроде бы, есть замечательный django cms, к которому всего и надо что написать плагинов. Но оказалось, что можно сделать весь процесс несколько более удобным, добавив пару фич и немного кода.
Читать дальше →
Total votes 16: ↑11 and ↓5+6
Comments3

Продвижение приложений в AppStore (Google Play)

Reading time9 min
Views53K

Прежде чем мы написали этот материал, наши приложения загрузили более 2 000 000 раз, мы провели порядка 50 больших промо кампаний, побывали в топах AppStore более, чем в 24-х странах пока наконец не собрали всё это в один большой work flow. В статье почти нет очевидных вещей про ключевые слова, красоту иконок, скриншотов и рекламные кампании. Мы попытались привести работу продуктовой компании к единой модели, ответив на вопросы: «что?», «когда?», «зачем?» и даже на вопрос «а дальше что?». Если вы разрабатываете собственное приложение, хотите начать это делать или у вас просто есть друг разработчик или маркетолог продуктовой компании — в этой статье вы найдёте много полезной информации.
Читать дальше →
Total votes 58: ↑41 and ↓17+24
Comments9

Уведомления окончаний fabric задач, с декораторами и детальной информацией

Reading time3 min
Views4.3K
В существующем проекте есть долгоиграющие fab-задачки — получения дампов с удаленных серверов, агрегация данных, етс. Запускаешь задачу, отвлекаешься в соседнее окошко, через N минут(а то и через час) вспоминаешь, проверяешь… неэффективно.
Захотелось сделать всплывающие уведомления на десктоп по завершении задачи, а тут и статья про notify-send подвернулась. Решил сделать декоратор на fab-функции — самое ему место.
Но не так все просто оказалось...
Total votes 15: ↑15 and ↓0+15
Comments8

Настройка pgpool-II + PostgreSQL + Streaming replication + Hot standby в среде AWS

Reading time11 min
Views43K
Всем привет!
Решил описать основные моменты настройки отказоустойчивого (HA) кластера БД PostgreSQL в IaaS среде от Amazon — AWS.

Про настройку указанной связки с момента появления в свет 9й версии с нативной репликацией уже написано достаточно много статей, поэтому подробно останавливаться на настройке самого PostgreSQL и pgpool не буду, тут все относительно стандартно. Приводимые куски конфигов непригодны к бездумному копипасту, в любом случае придётся открывать свои конфиги и править необходимые параметры. Не хочу поощрять процесс конфигурации по методу копипаста.
Читать дальше →
Total votes 13: ↑13 and ↓0+13
Comments4

Лабораторный программируемый линейный блок питания UnionTest/KORAD UT3005EP и его калибровка/управление

Reading time4 min
Views89K
Купил недавно лабораторный блок питания UnionTest UT3005EP (31В 5.1А), это другое название известного блока питания KORAD — чистокровного китайца. Снова оригинальная китайская разработка, а не недоделанная копия. Первые ревизии блоков этой серии (~2012 год) имели недостатки (в частности, на максимальном токе — силовые транзисторы могли перегреться, это обнаружили в видеоблоге eevblog), однако позже они были исправлены. Лично я питаю слабость к 4-х разрядным светодиодным индикаторам — потому мой выбор и пал на блоки питания UnionTest/KORAD с учетом того, что на тестах исправленной ревизии он показывал себя хорошо.

Сначала я по привычке заказал блок напрямую из Китая, но он ко мне не дошел (деньги вернули) — и тут я увидел, что в наличии в московских магазинах по примерно той же цене (5210 рублей за эту модель) продают UnionTest — на первый взгляд KORAD с другим именем. Однако остается вопрос, не распродают ли там случайно старую ревизию железа? Блок я купил, и на внутренности мы сейчас посмотрим. Забегая вперед — ревизия новая.

Читать дальше →
Total votes 63: ↑61 and ↓2+59
Comments24

Мигрируем с raid1 на raid10 без потери данных в Debian

Reading time6 min
Views18K
Есть raid1 из 2 дисков, есть 2 дополнительных диска, нужно добавить эти 2 диска в массив и мигрировать на raid10 без потери данных. Ситуация усложняется тем, что boot расположен не в raid, а находит только на одном из дисков, и для усиления отказоустойчивости сервера загрузчик нужно переместить в raid1.

Все описанные действия проводились на рабочем боевом сервере. Схема универсальная, подойдет для любых других начальных условий. Так же аналогично можно мигрировать с raid10 на raid1.

Имеем:
На диске /dev/sdd1 находится /boot
На массиве /dev/md1 находится /
На массиве /dev/md2 находится swap
Если у вас с загрузчиком вопрос уже решен, можете перейти сразу к разделу с миграцией.
Читать дальше →
Total votes 21: ↑18 and ↓3+15
Comments14

Установка ST-LINK V2 в MAC OS X для разработки под STM32

Reading time5 min
Views28K
Недавно наткнулся на замечательную статью, о том, как собрать все инструменты для разработки в среде linux под контроллеры stm32 и я решил вновь вернуться к задаче, которую уже пытался решить, а именно заставить работать все тоже самое по Mac OS X (В моем случае версии 10.9.1 Mavericks), так как работать в CooCox (а он основан именно на Eclipse) в виртуальной машине уже изрядно надоело. В данной статье я опишу пошаговый алгоритм как все тоже самое заставить работать в OS X.



Итак, вы хотите разрабатывать на STM32 в среде Mac OS X, у вас есть ST-LINK V2 отдельно или на макетной плате, тогда добро пожаловать под кат.
Читать дальше →
Total votes 17: ↑13 and ↓4+9
Comments9

Интерфейс JTAG? — Это очень просто

Reading time6 min
Views248K
Многие знакомы со словом «JTAG», но знакомство это скорее всего поверхностное. В этой статье я хочу перевести Вас на новый уровень, так сказать «во френдзону». Возможно, для многих я не открою ничего нового, но надеюсь тем, кто давно хотел ознакомиться, будет интересно почитать. Итак, от винта.
image

Запустить JTAG тестирование
Total votes 90: ↑86 and ↓4+82
Comments17

WebSocket-чат на Tornado для вашего Django-проекта

Reading time28 min
Views68K
TornadoНедавно я запустил сайт backgrounddating.com и написал об этом здесь, на Хабрахабре. Разумеется, я уже тогда рассказал о некоторых технических деталях реализации этого проекта, но об одной из возможностей сайта я бы хотел написать отдельно, тем более, что документации (как на русском, так и на английском) на эту тему в Интернете пока что довольно мало. Итак, речь пойдёт о чате в реальном времени между двумя пользователями. Задача состоит в том, чтобы любой пользователь мог отправлять другим пользователям сообщения, и, если у получателя сообщения открыт чат с этим пользователям, то он сразу же видел входящие сообщения (а в ином случае он мог прочитать сообщения позже: то есть при открытии чата загружается история последних сообщений).

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

Сразу уточню, что это не единственный способ реализовать подобное. Вы можете использовать другой асинхронный веб-сервер (например node.js), можете использовать другую очередь сообщений (или вообще её не использовать, если вам подходят особенности такого варианта: с пользователями одного канала обязательно общается один и тот же worker веб-сервера). Я даже не утверждаю, что этот вариант самый лучший (но в данном случае он подошёл лучше всех). В конце концов, мы здесь вообще не будем рассматривать костыли (long polling, Flash) для старых браузеров (а это почти все версии IE, например), не поддерживающих веб-сокеты, и даже не будем рассматривать возможность подключаться из тех браузеров, которые уже поддерживают протокол WebSocket, но не стандартизированную версию (RFC 6455), а одну из устаревших. О том, как можно включить поддержку устаревшей версии «draft 76» (она же «hixie-76»), смотрите в документации Tornado.
Читать дальше →
Total votes 56: ↑43 and ↓13+30
Comments17

Оперативная реакция на DDoS-атаки

Reading time4 min
Views51K
Один из ресурсов, за которым я присматриваю, вдруг стал неожиданно популярным как у хороших пользователей, так и у плохих. Мощное, в общем-то, железо перестало справляться с нагрузкой. Софт на сервере самый обычный — 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-скрипт
Читать дальше →
Total votes 57: ↑50 and ↓7+43
Comments50

Django ORM, gevent и грабли в зелени

Reading time6 min
Views16K
Очень многие выбирают Django за его простоту. Код на Django прост и лаконичен, мы меньше думаем о костылях и больше о бизнес-логике.

Gevent тоже выбирают из-за того, что он простой, очень шустрый и не несёт за собой callback hell.

В голове возникает великолепная идея совместить две простые и удобные вещи вместе. Мы патчим Django и радуемся простоте, лаконичности и производительности, делаем множество запросов на другие сайты, создаём подпроцессы, в общем используем наш новый асинхронный Django по максимуму.
Но совместив их, мы незаметно для себя поставили несколько граблей на нашем пути.
Читать дальше →
Total votes 50: ↑48 and ↓2+46
Comments76

Публикация видео на канале пользователя YouTube

Reading time5 min
Views6.1K
Разрабатывая приложение под Android для создания слайд-шоу из фотографий, столкнулся с задачей публиковать готовые ролики на личном канале пользователя YouTube.
Пришлось повозиться, т.к. во-первых, применяем облачные вычисления и обработка данных может занимать дольше времени, чем действует token. А во-вторых, чтобы реализовать функцию, пришлось столкнуться с некоторыми неточностями и вопросами в мануале Google. Подробности под катом.

Читать дальше →
Total votes 15: ↑12 and ↓3+9
Comments4

Long Polling от А до Я своими руками

Reading time5 min
Views54K
Как реализовать long polling с помощью Nginx и Javascript в сети достаточно много материала. Но полного руководства я ещё не встречал. То возникают проблемы с компиляцией модуля под Nginx, то в браузере вертится иконка загрузки при long poll запросах. Под катом, полный материал как же все таки это сделать правильно.
Читать дальше →
Total votes 73: ↑69 and ↓4+65
Comments34

Трехмерные живые обои и OpenGL ES

Reading time9 min
Views44K


Доброго времени суток, Хабр!

Я — участник маленькой компании (из двух человек), которая делает живые обои (live wallpapers) для Android-девайсов. В этой статье будет рассказано о развитии наших приложений, от сравнительно простых до более сложных, примененных технологиях, трюках и решенных проблемах — все на конкретных примерах, в (почти) хронологическом порядке. Все наши обои — полностью трехмерные, написаны с использованием OpenGL ES.

В качестве бонуса — небольшая коллекция шейдеров, пользуйтесь ими как хотите. Предложения об их улучшении или исправлении будут только приветствоваться — мы не претендуем на звание гуру в этой области.
Итак, начнем!
Total votes 73: ↑68 and ↓5+63
Comments29

Алгоритм поиска пути Jump Point Search

Reading time6 min
Views123K
Этот алгоритм является улучшенным алгоритмом поиска пути A*. JPS ускоряет поиск пути, “перепрыгивая” многие места, которые должны быть просмотрены.  В отличие от подобных алгоритмов JPS не требует предварительной обработки и дополнительных затрат памяти. Данный алгоритм представлен в 2011 году, а в 2012 получил высокие отклики. Что из себя представляет данный алгоритм и его реализацию можно прочитать дальше в статье.


Читать дальше →
Total votes 110: ↑108 and ↓2+106
Comments37

Знакомство с MSP430 и «туалетная» автоматизация

Reading time9 min
Views111K
Давно читаю рубрику DIY и руки чесались что-нибудь сделать на микроконтроллере. И наудачу прочитал о MSP430 Launch Pad от Texas Instruments по цене $4.30. Идеальный набор для старта.
В качестве объекта для экспериментов был выбран автоматический освежитель воздуха одной известной марки.

Читать дальше →
Total votes 89: ↑85 and ↓4+81
Comments72

Information

Rating
Does not participate
Registered
Activity