Pull to refresh
8
0
freem4n @freem4n

User

Send message

Кейс разработки на Golang: платформа Виртуальной АТС ITooLabs

Reading time1 min
Views7.9K
Публикуем получасовое видео с докладом о языке разработки Golang для участников партнерской конференции Битрикс24. В докладе CEO ITooLabs Алексей Найденов расскажет про кейс разработки собственной телефонной платформы на Golang, и о том, почему мы отказались от других вендорских решений и стали сами вендором, и почему выбрали Golang.

Доклад может быть интересен тем, кто последние пять лет скрывался от мира и поэтому не слышал про Golang, а также тем, кто про Golang слышал, но еще колеблется и хотел бы услышать про примеры успешных проектов.

В докладе описаны кейсы разработки и эксплуатации платформы виртуальной АТС для операторов связи (свыше 20 000 аккаунтов) и голосовой почты для одного из крупнейших мобильных операторов юго-восточной Азии (70 миллионов пользователей).
Читать дальше →
Total votes 18: ↑16 and ↓2+14
Comments4

Не все cookie одинаково полезны

Reading time9 min
Views38K
В этой статье я хотел бы рассказать о том, как можно объединить небольшие недочеты в обработке cookie-значений в цепочку, и произвести за счет этого атаку на пользователей популярных веб-приложений.
image
Читать дальше →
Total votes 56: ↑55 and ↓1+54
Comments5

PyTest

Reading time24 min
Views362K

Предисловие


По историческому призванию я SQL-щик. Однако судьба занесла меня на BigData и после этого понесла кривая — я освоил и Java, и Python, и функциональное программирование (изучение Scala стоит в списке). Собственно на одном из кусков проекта встала необходимость тестирования кода на Python. Ребята из QA посоветовали для этих целей PyTest, но даже они затруднились толком ответить чем этот зверь хорош. К сожалению, в русскоязычном сегменте информации по данному вопросу не так уж и много: как это используют в Yandex да и все по-хорошему. При этом описанное в этой статье выглядит достаточно сложно для человека начинающего путешествие по этой стезе. Не говоря уже об официальной документации — она приобрела для меня смысл лишь после того, как я разобрался с самим модулем по другим источникам. Не спорю, там написаны интересные вещи, но, к сожалению, совсем не для старта.

Юнит-тестирование Python


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

Вводная по необходимым знаниям


На описываемый момент знания Python у меня были достаточно поверхностны — я писал кое-какие несложные модули и знал стандартные вещи. Но при столкновении с PyTest мне пришлось пополнять багаж знаний декораторами тут и тут и конструкцией yield.

Преимущества и недостатки PyTest


1) Независимость от API (no boilerplate). Как код выглядит в том же unittest:

Код
import unittest

class TestUtilDate(unittest.TestCase):
    def setUp(self):
        #init_something()
        pass
        
    def tearDown(self):
        #teardown_something()
        pass
        
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
        
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        
    def test_failed_upper(self):
        self.assertEqual('foo'.upper(), 'FOo')
        
if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TestUtilDate)
    unittest.TextTestRunner(verbosity=2).run(suite)


То же самое в PyTest:

Код
import pytest

def setup_module(module):
    #init_something()
    pass

def teardown_module(module):
    #teardown_something()
    pass

def test_upper():
    assert 'foo'.upper() == 'FOO'
    
def test_isupper():
    assert 'FOO'.isupper()
    
def test_failed_upper():
    assert 'foo'.upper() == 'FOo'


2) Подробный отчет. В том числе выгрузка в JUnitXML (для интеграции с Jenkins). Сам вид отчета может изменяться (включая цвета) дополнительными модулями (о них будет позднее отдельно). Ну и вообще цветной отчет в консоли выглядит удобнее — красные FAILED видны сразу.

image

3) Удобный assert (стандартный из Python). Не приходится держать в голове всю кучу различных assert'ов.

4) Динамические фикстуры всех уровней, которые могут вызываться как автоматически, так и для конкретных тестов.

5) Дополнительные возможности фикстур (возвращаемое значение, финализаторы, область видимости, объект request, автоиспользование, вложенные фикстуры)

6) Параметризация тестов, то есть запуск одного и того же теста с разными наборами параметров. Вообще это относится к пункту 5 «Дополнительные возможности фикстур», но возможность настолько хороша, что достойна отдельного пункта.

7) Метки (marks), позволяющие пропустить любой тест, пометить тест, как падающий (и это его ожидаемое поведение, что полезно при разработке) или просто именовать набор тестов, чтобы можно было запускать только его по имени.

8) Плагины. Данный модуль имеет достаточно большой список дополнительных модулей, которые можно установить отдельно.

9) Возможность запуска тестов написанных на unittest и nose, то есть полная обратная совместимость с ними.

Про недостатки, пусть их и не много, могу сказать следующее:

1) Отсутствие дополнительного уровня вложенности: Для модулей, классов, методов, функций в тестах есть соответствующий уровень. Но логика требует наличие дополнительного уровня testcase, когда та же одна функция может иметь несколько testcase'ов (например, проверка возращаемых значений и ошибок). Это частично компенсируется дополнительным модулем (плагином) pytest-describe, но там встает проблема отсутствия соответствующего уровня фикстуры (scope = “describe”). С этим конечно можно жить, но в некоторых ситуациях может нарушать главный принцип PyTest — «все для простоты и удобства».

2) Необходимость отдельной установки модуля, в том числе в продакшене. Все-таки unittest и doctest входят в базовый инструментарий Python и не требуют дополнительных телодвижений.

3) Для использования PyTest требуется немного больше знаний Python, чем для того же unittest (см. «Вводная по необходимым знаниям»).

Подробное описание модуля и его возможностей под катом.
Читать дальше →
Total votes 26: ↑23 and ↓3+20
Comments11

Обзор панели управления хостингом Plesk 12.5

Reading time7 min
Views18K
Недавно вышло обновление популярной панели управления хостингом Odin Plesk 12.5. В этой версии был значительно улучшен пользовательский интерфейс и добавлены функции безопасности, включая Server Shield Plus и MagicSpam. Администраторы серверов оценят обновленный дизайн интерфейса (в том числе для мобильных устройств), упрощающий взаимодействие с пользователями и доступ к инструментам восстановления.

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

Что отличает обновление Plesk 12.5? Он стал действительно удобнее и проще. Даже если раньше вы попробовали Plesk и используете что-то другое, очень рекомендуем посмотреть на эту версию. Разница, как говорится, налицо. Пробную версию облачного сервера выдаем в конце статьи, чтобы вы могли протестировать новый Plesk.



В этой статье мы детальнее узнаем о новых возможностях Plesk 12.5 и рассмотрим процесс обновления Plesk с прошлой версии и процесс установки Plesk на чистый сервер.
Читать дальше →
Total votes 12: ↑10 and ↓2+8
Comments7

Подробно об объектах и классах в PHP

Reading time25 min
Views94K
Сегодня объекты используются очень активно, хотя это трудно было предположить после выхода PHP 5 в 2005 году. Тогда я ещё мало что знал о возможностях этого языка. Пятую версию PHP сравнивали с предыдущей, четвёртой, и главным преимуществом нового релиза стала новая, очень мощная объектная модель. И сегодня, десять лет спустя, около 90% всего PHP-кода содержит объекты, не изменившиеся со времени PHP 5.0. Это убедительно говорит о том, какую роль сыграло внедрение объектной модели, неоднократно улучшавшейся на протяжении последующих лет. В этом посте я хотел бы рассказать о том, как всё устроено «под капотом». Чтобы люди понимали суть процессов — почему сделано так, а не иначе — и лучше, полнее использовали возможности языка. Также я затрону тему использования памяти объектами, в том числе в сравнении с эквивалентными массивами (когда это возможно).

Я буду рассказывать на примере версии PHP 5.4, и описываемые мной вещи справедливы для 5.5 и 5.6, потому что устройство объектной модели там почти не претерпело изменений. Обратите внимание, что в версии 5.3 всё не так хорошо с точки зрения возможностей и общей производительности.

В PHP 7, который пока ещё активно разрабатывается, объектная модель переработана не сильно, были внесены лишь незначительные изменения. Просто потому что всё и так хорошо работает, а лучшее — враг хорошего. Были добавлены возможности, не затрагивающие ядро, но здесь об этом речи не пойдёт.
Читать дальше →
Total votes 58: ↑54 and ↓4+50
Comments15

Nginx и https. Получаем класс А+

Reading time4 min
Views161K
image

Недавно вспомнилось мне, что есть такой сервис — StartSsl, который совершенно бесплатно раздаёт trusted сертификаты владельцам доменов для личного использования. Да и выходные попались свободные. В общем сейчас напишу, как в nginx настроить HTTPS, чтобы при проверке в SSL Labs получить рейтинг А+ и обезопасить себя от последних багов с помощью выпиливания SSL.

Итак, приступим. Будем считать, что у вы уже зарегистрировались на StartSsl, прошли персональную проверку и получили вожделенный сертификат. Для начала опубликую итоговый конфиг, а после этого разберу его.
Читать дальше →
Total votes 61: ↑52 and ↓9+43
Comments85

Сделаем код чище: Специальные расширения vsnprintf() в ядре Linux

Reading time3 min
Views19K
Смотря на кучу исходного кода, который засылают программисты в списки рассылки подсистем ядра Linux иногда хочется плакать. С одной стороны бывает ужасный и непотребный код, с другой — люди, возможно, впервые пытаются что-то сделать для ядра, поэтому не знают всех его особенностей.

Книга Linux Device Drivers устарела, а новая версия выйдет нескоро. Поэтому мне хочется заполнить пробелы в знаниях тех программистов, которые пишут код в ядро.
Читать дальше →
Total votes 51: ↑49 and ↓2+47
Comments8

Что не договаривают сервисы по защите от DDoS или почему защита не работает

Reading time4 min
Views44K
Поводом для этой статьи послужил аудит безопасности в одном интернет-проекте. Заказчик попросил разобраться с их системой безопасности и проверить, насколько они подвержены тем или иным атакам. При этом, нас уверяли, что от DDoS-атак они защищены полностью и нет повода беспокоиться, так как они под защитой одного из лидеров рынка – Incapsula.

Тут-то нас и ждало большое удивление — заказчик был абсолютно не защищен.

Давайте разберемся что же произошло, но сначала немного теории.
Читать дальше →
Total votes 52: ↑46 and ↓6+40
Comments41

Реализация словаря в Python 2.7

Reading time15 min
Views114K
В этой статье пойдёт речь о том, как реализован словарь в Python. Я постараюсь ответить на вопрос, почему элементы словаря не упорядочены, описать, каким образом словари хранят, добавляют и удаляют свои элементы. Надеюсь, что статья будет полезна не только людям, изучающим Python, но и всем, кто интересуется внутренним устройством и организацией структур данных.
Читать дальше →
Total votes 65: ↑64 and ↓1+63
Comments37

Оптимизируем VPS за 5$ (512MB RAM / 1 CPU) так, что сайт на wordpress выдерживает нагрузку в 42,735,587 хитов в день

Reading time9 min
Views95K
Когда вы приобретаете сервер VPS с 256MB или 512MB оперативной памяти на борту и лишь часть мощности процессора, то использовать для таких сервисов как MySQL/PHP/Apache настройки по умолчанию является очень плохой идеей. В настоящее время у меня запущено 3 сайта на самом дешевом тарифном плане с 512MB RAM/1 CPU. Не уверен полностью, но посещаемость составляет порядка 5-10 тысяч посетителей в день. Далее я хочу поделиться инструкцией как оптимизировать LAMP используя всего лишь 512 MB и при этом не уходя в swap. Обычно при такой настройки используется 256 – 378Mb памяти и все работает довольно быстро.

Определяем доступную память и активность swap.

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

$ free -m

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

$ ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less


Настраиваем LAMP сервер для потребления малого количества оперативной памяти. Останавливаем, отключаем ненужные сервисы

Первый и очевидный вопрос, который необходимо задать — это «какие сервисы мне не нужны в использовании?». Недавно, я обнаружил очень удобную утилиту для управления сервисами. Она называется "sysv-rc-conf" и управляет сервисами при помощи псевдографики и флажками. Выгдялит вот так:



Здесь представлен список сервисов, которые я изменил.

  • Postfix. Этот сервис позволяет отправлять и получать почтовые email сообщения для домена. Я использую для этих целей Google Apps для отправки почты и mailchimp для новостных подписчиков. Таким образом я остановил и отключил этот сервис.
  • Bind9. Он нужен для управления DNS записями Вашего домена. Его можно отключить, так как все DNS записи хранятся у хостера.
  • SSHD. Имеются и другие реализации, которые используют гораздо меньше памяти, но они не поддерживают sftp, поэтому данный сервис я оставил без изменений.


Не запускайте X-сервер, выключите все ненужные сервисы и настройте Apache, MySQL, PHP только с базовой необходимой функциональностью.
Читать дальше →
Total votes 131: ↑81 and ↓50+31
Comments85

Публикация на стене Вконтакте средствами php

Reading time5 min
Views139K
Получив задачу создать автоматическую публикацию материалов сайта на стене нашей страницы Вконтакте, я обнаружил, что рецептов по этой, казалось бы, актуальной теме относительно мало.

В действительности всё оказалось довольно просто, и чтение документации по API часто помогает сэкономить время.

Читать дальше →
Total votes 84: ↑60 and ↓24+36
Comments59

Как подготовиться к докладу на техническую тему

Reading time7 min
Views19K
На MoscowJS приходят докладчики разного уровня. У некоторых за плечами опыт выступлений на крупных конференциях. Кто-то преподавал в ВУЗе или вёл тренинги. Многие выступают на публике в первый раз.

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

  • Как вы готовитесь к докладу;
  • Как вы ведёте себя во время выступления.

В этой статье я расскажу о первом пункте. А именно, как подготовить себя к докладу на техническую тему.
Читать дальше →
Total votes 41: ↑39 and ↓2+37
Comments11

Application Porno или как найти секреты в мобильных приложениях и вынести всё

Reading time5 min
Views54K
В новостной ленте я недавно обнаружил любопытное исследование, где ребята скачали и распарсили Android Playmarket, проанализировали сотни тысяч приложений на предмет наличия зашитых секретных токенов и паролей.

То что результат их работы касался только анализа декомпилированного кода под Android, cподвиг меня написать про исследование, которое я проводил еще год назад, причем не только для Android, но и для iOS приложений, и которое, в итоге, вылилось в целый online-инструмент, о котором я расскажу в самом конце, когда станет очевиден его смысл. Часть написанного ниже была представлена на конференции ZeroNights и на страницах журнала «Хакер». (Т.к. материал не был опубликован онлайн, редакция дала на «добро», на публикацию здесь). Итак, поехали.
Читать дальше →
Total votes 99: ↑92 and ↓7+85
Comments38

Чеклист по оптимизации VPS на PHP/Mysql/Nginx

Reading time3 min
Views45K
Как обеспечить более высокую производительность VPS сервера, который работает на Nginx + PHP + Mysql? В этой статье приведен чеклист основных настроек, которые позволят существенно оптимизировать работу сервера. Настройка займет не более 10 минут и не требует ничего, кроме редактирования конфигурационных файлов.
Читать дальше →
Total votes 34: ↑17 and ↓170
Comments21

[Перевод] Расследование манипуляций с панелью управления. Часть 1

Reading time4 min
Views7.5K
Всем привет! Сегодня предлагаем вашему вниманию перевод статьи «Control Panel Forensics: Evidence of Time Manipulation and More…», автор Chad Tilbury трудился спецагентом в Офисе специальных расследовнаий ВВС США, а после этого стал заниматься проблемами пиратства в Американской Ассоциации Кинопрокатчиков. О расследованиях компьютерных преступлений этот парень знает не из учебников. Итак, начнем!

Панель управления — давно известный инструмент Windows, позволяющий изменять огромное количество настроек системы. Использование панели управления может быть ограничено с помощью Групповых политик, но в любом случае, некоторые элементы панели доступны для большинства учетных записей (для внесения некоторых изменений необходимы права администратора). В ходе расследования мы можем провести аудит использования панели управления для того, чтобы идентифицировать широкий спектр действий пользователей, таких как:

  • Изменения настроек Брандмауэра (firewall.cpl), необходимы для того, чтобы в дальнейшем использовать неавторизованное ПО;
  • Добавление/изменение учетных записей (nusrmgr.cpl);
  • Отключение функций «Восстановление системы» и службы Теневого резервного копирования (sysdm.cpl);
  • Изменение системного времени (timedate.cpl);
  • Взаимодействие с приложениями сторонних производителей, изменяющими настройки безопасности.

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



Доступ к центру поддержки (этот апплет в англ.версии называется Security Center) сам по себе не является особенно интересным. Но необходимо учитывать, что этот апплет был открыт сразу же после запуска известного инструмента для подбора паролей на роутерах. Как говорится, почувствуйте разницу!
Читать дальше →
Total votes 7: ↑4 and ↓3+1
Comments1

LUA в nginx: слегка интеллектуальный firewall

Reading time6 min
Views30K

Данный пост является продолжением применения lua в nginx.

Там обсуждалось кеширование в памяти, а тут lua будет использоваться для фильтрации входящих запросов в качестве этакого фаервола на nginx-балансере. Нечто подобное было у 2GIS. У нас свой велосипед :) В котором разделяем динамику и статику, стараемся учесть NAT и белый список. И, конечно же, всегда можно навернуть еще специфичной логики, что не выйдет при использовании готовых модулей.
Данная схема сейчас спокойно и ненапряжно (практически не сказывается на использовании cpu) обрабатывает порядка 1200 запросов/сек. На предельные величины не тестировалось. Пожалуй, к счастью :)
Читать дальше →
Total votes 50: ↑50 and ↓0+50
Comments16

Переполненяем стек в fprintf на Linksys WRT120N

Reading time4 min
Views12K
После того, как мы получили расшифрованную прошивку и JTAG-доступ к устройству, настало время поисследовать код на какие-нибудь интересные баги.
Как мы узнали раньше, WRT120N работает на RTOS. В целях безопасности, административный WEB-интерфейс RTOS использует HTTP Basic authentication:

image

Большинство страниц требуют аутентификацию, но есть несколько страниц, которые явно запрещают ее:

image

image

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

Некоторые из этих страниц не существуют на самом деле, другие существуют, но ничего не делают (NULL-функции). Однако, страница по адресу /cgi/tmUnBlock.cgi имеет какой-то обработчик, который обрабатывает пользовательские данные:
image
Читать дальше →
Total votes 69: ↑67 and ↓2+65
Comments12

Пишем numpy-модуль для ускорения математических функций с помощью SIMD-инструкций

Reading time11 min
Views9.4K
Пакеты numpy и scipy предоставляют прекрасные возможности для быстрого решения различных вычислительных задач. Концепция универсальных функций (ufunc), работающих как со скалярными значениями, так и с массивами различных размерностей, позволяет получить высокую производительность при сохранении присущей языку Python простоты и элегантности. Универсальная функция обычно используются для выполнения одной операции над большим массивом данных, что идеально подходит для оптимизации с помощью SIMD-инструкций, однако мне не удалось найти готового решения, основанного на свободном программном обеспечении и позволяющего использовать SIMD для вычисления в numpy таких математических функций, как синус, косинус и экспонента. Реализовывать алгоритмы вычисления этих функций с нуля совсем не хотелось, но к счастью в интернете нашлось несколько свободных библиотек на языке «С». Преодолев лень сомнения, я решил написать собственный numpy-модуль, предлагающий универсальные функции для синуса, косинуса и экспоненты. За подробностями и результатами тестов добро пожаловать под кат.
Пишем свой numpy-модуль!
Total votes 34: ↑34 and ↓0+34
Comments4

Введение в анализ сложности алгоритмов (часть 2)

Reading time11 min
Views169K
От переводчика: данный текст даётся с незначительными сокращениями по причине местами излишней «разжёванности» материала. Автор абсолютно справедливо предупреждает, что отдельные темы могут показаться читателю чересчур простыми или общеизвестными. Тем не менее, лично мне этот текст помог упорядочить имеющиеся знания по анализу сложности алгоритмов. Надеюсь, что он окажется полезен и кому-то ещё.
Из-за большого объёма оригинальной статьи я разбила её на части, которых в общей сложности будет четыре.
Я (как всегда) буду крайне признательна за любые замечания в личку по улучшению качества перевода.


Опубликовано ранее:
Часть 1

Сложность


Из предыдущей части можно сделать вывод, что если мы сможем отбросить все эти декоративные константы, то говорить об асимптотике функции подсчёта инструкций программы будет очень просто. Фактически, любая программа, не содержащая циклы, имеет f( n ) = 1, потому что в этом случае требуется константное число инструкций (конечно, при отсутствии рекурсии — см. далее). Одиночный цикл от 1 до n, даёт асимптотику f( n ) = n, поскольку до и после цикла выполняет неизменное число команд, а постоянное же количество инструкций внутри цикла выполняется n раз.
Читать дальше →
Total votes 55: ↑53 and ↓2+51
Comments16

Tips & tricks for MySQL Developers. Работа с SQL

Reading time10 min
Views51K

Эта статья задумана мной как сборник некоторых интересных моментов по использованию и оптимизации SQL запросов в БД MySQL, на мой взгляд, плохо освещенных в интернете. Так, из статьи вы узнаете о конструкции with rollup, и о том, как переписать подзапросы in и not in на join'ы, а так же обновление и удаление данных в нескольких таблицах — одним запросом, и многое другое. Начнем по порядку.
Читать дальше →
Total votes 71: ↑67 and ↓4+63
Comments28

Information

Rating
Does not participate
Registered
Activity