Search
Write a publication
Pull to refresh
-1
0
Send message

Хак синтаксиса PHP

Reading time5 min
Views29K
Вы когда-нибудь задумывались о том, как расширить ядро PHP? Что нужно для того, чтобы создать новое ключевое слово или даже разработать новый синтаксис? Если у вас есть базовые знания языка C, то проблем с созданием небольших изменений возникнуть не должно. Да, я понимаю, что это может быть немного бессмысленно, но неважно — забавно ведь.

Давайте создадим альтернативный способ определения класса. Самый простой способ определения, разрешённый в PHP, выглядит следующим образом:

<?php
class ClassName {}

Мы можем упростить синтаксис и заменить фигурные скобки на точку с запятой.

<?php
class ClassName;

Если вы попытаетесь выполнить этот код, то он, очевидно, выдаст ошибку. Не проблема, мы можем это исправить.
Читать дальше →

Определение расстояния между географическими точками в MySQL

Reading time3 min
Views68K
При разработке современного сайта часто возникает необходимость реализовать функционал вывода близлежащих географических точек. Самым оптимальным способом решения этой задачи является перекладывание работы по реализации определения точек на плечи MySQL. Если конкретней, то нам будут нужны возможности пространственных расширений MySQL (до версии 5.0.16 эти расширения были доступны только для MyISAM, более поздние версии MySQL поддерживают работу пространственных расширений с InnoDB, NDB, BDB и ARCHIVE).

Расстояние между точками будет вычисляться по формуле гаверсинусов. Формула позволяет получать расстояние между точками с очень низкой погрешностью (величина погрешности прямо пропорциональна расстоянию между точками, и не превышает 10-20 километров при вычислении очень больших расстояний, например между штаб-квартирой Google в Калифорнии (37.422045, -122.084347) и оперным театром в Сиднее, Австралия (-33.856553, 151.214696)).

Читать дальше →

Пилим Adblock

Reading time9 min
Views174K


Стратегия


Итак, Адблок… Но здесь я буду говорить не столько о блокировке рекламы, сколько об оптимизации и правильном использовании этого интересного своей универсальностью дополнения. Не отношусь к тем, кого раздражает сама реклама — меня раздражает способ ее доставки.
Читать дальше →

Shodan – самый страшный поисковик Интернета

Reading time3 min
Views703K


«Если люди не могут найти что-то в Google, они думают, что это не сможет найти никто. Это не так», – утверждает Джон Мэзерли, создатель Shodan, самого страшного поискового движка Интернета.

В отличие от Google, который ищет в Сети простые сайты, Shodan работает с теневыми каналами Интернета. Это своего рода «черный» Google, позволяющий искать серверы, веб-камеры, принтеры, роутеры и самую разную технику, которая подключена к Интернету и составляет его часть.

Читать дальше →

Манипулирование URL'ами в JavaScript

Reading time2 min
Views71K
Из года в год, сталкиваюсь с одной и той же проблемой. Как добавить, изменить или удалить параметр к некоторому адресу в строковом виде. Быстро и грязно это можно делать с помощью, например, регулярных выражений или найти каке-то готовое решение. Зачастую также может потребоваться, к примеру, подменить путь в адресе или изменить протокол с HTTP на HTTPS и т.д.

В целом, это хочется делать просто и понятно. При этом хочется разумного компромиса. Я встречал некоторые библиотеки, которые дают мощный функционал, но при этом по объему — десятки килобайт JavaScript кода. Несколько десятков килобайт, чтобы, например, подменить параметр в QueryString? Эх…
Читать дальше →

Оперативная реакция на 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-скрипт
Читать дальше →

9-килобайтный скрипт превратит любой браузер с WebRTC в узел распределённой CDN

Reading time3 min
Views26K
Чуть больше двух лет назад я написал статью-исследование "Темная материя интернета". Основная идея той статьи — использовать ресурсы миллионов обычных пользователей интернета для того, чтобы снять большую часть нагрузки с веб-сайтов, подобно тому, как в сетях BitTorrent участники помогают друг другу качать файлы. Это могло бы многократно снизить стоимость хостинга, уменьшить зависимость сайтов от рекламы и платных сервисов или пожертвований. Тогда любые попытки реализовать подобную «децентрализованную CDN» наталкивались на необходимость устанавливать специальный софт в виде отдельного приложения или расширения браузера.

Но пару месяцев назад состоялся первый видеозвонок между браузерами Firefox и Chrome, ставший возможный благодаря технологии WebRTC. Вместе эти браузеры имеют долю рынка почти в 60%, а значит всё необходимое, чтобы стать узлом P2P-сети, у большинства пользователей интернета есть уже сейчас или появится в ближайшие недели (когда полноценная поддержка WebRTC войдёт в стабильную сборку Firefox).

Стартап PeerCDN собирается использовать новые возможности для создания распределённой CDN для статического контента, воспользоваться которой можно будет, просто включив в код страницы небольшой (9 кб) скрипт. Никаких плагинов, дополнений и дополнительных телодвижений не нужно, всё происходит прозрачно для клиента. Создатели обещают запустить сервис в течение ближайших недель, а пока можно записаться в список рассылки.



Как это работает?

Таблица для выбора диагонали экрана и разрешения

Reading time2 min
Views184K
Когда у вас возникнет вопрос, как выбрать диагональ экрана, или в каком разрешении скачать фильм, предлагаю воспользоваться таблицей Головина для выбора диагонали экрана (pdf, 85 Кб). Название я придумал сам, надеюсь, Головин был бы не против.



С появлением первых телевизоров с разрешением 4к (3840 × 2160), я хотел обновить график для определения оптимального расстояния до экрана. Но, поскольку там указаны рекомендуемые расстояния, это бы снова вылилось в субъективные обсуждение возможностей зрения каждого. Новая таблица, теоретически, должна помочь каждому сделать выбор, в не зависимости от остроты зрения.

Инструкция и теория

Вертикальная черта, затем ноль

Reading time3 min
Views41K
Заголовок, выраженный словами, понадобился только для поисковой находимости. Но речь пойдёт о роли символьной конструкции «|0» в JavaScript.

Впервые на неё я обратил внимание, когда переводил FAQ про asm.js и читал спецификации этого подмножества языка JavaScript. Там «|0» служит, например, для указания типа значения, возвращаемого из функции: увидели «|0» после значения — значит, перед нами знаковое целое.

Вдругорядь я заметил конструкцию «|0» в примере кода на Гитхабе, где происходило преобразование к целому числу результата деления на 1024².

Тогда глаза мои открылись, и я увидел прекрасные возможности:

( 3|0 ) === 3;       // целые числа не изменяет
( 3.3|0 ) === 3;     // у дробных чисел отбрасывает дробную часть
( 3.8|0 ) === 3;     // не округляет, а именно отбрасывает дробную часть
( -3.3|0 ) === -3;   // в том числе и у отрицательных дробных чисел
( -3.8|0 ) === -3;   // у которых Math.floor(-3.3) == Math.floor(-3.8) == -4
( "3"|0 ) === 3;     // строки с числами преобразуются к целым числам
( "3.8"|0 ) === 3;   // при этом опять же отбрасывается дробная часть
( "-3.8"|0 ) === -3; // в том числе и у отрицательных дробных чисел
( NaN|0 ) === 0;     // NaN приводится к нулю
( Infinity|0 ) === 0;     // приведение к нулю происходит и с бесконечностью,
( -Infinity|0 ) === 0;    // и с минус бесконечностью,
( null|0 ) === 0;         // и с null,
( (void 0)|0 ) === 0;     // и с undefined,
( []|0 ) === 0;           // и с пустым массивом,
( [3]|0 ) === 3;          // но массив с одним числом приводится к числу,
( [-3.8]|0 ) === -3;      // в том числе с отбрасыванием дробной части,
( [" -3.8 "]|0 ) === -3;  // и в том числе с извлечением чисел из строк,
( [-3.8, 22]|0 ) === 0    // но массив с несколькими числами вновь зануляется
( {}|0 ) === 0;                // к нулю также приводится пустой объект
( {'2':'3'}|0 ) === 0;         // или не пустой
( (function(){})|0 ) === 0;    // к нулю также приводится пустая функция
( (function(){ return 3;})|0 ) === 0;    // или не пустая

Итак, во-первых, перед нами удобное средство отбрасывания дробной части.

  • По отношению к отрицательным числам оно полезно тем, что дробное число превращается не в ближайшее меньшее целое число (возрастая по модулю), как это случилось бы после «Math.floor()», а в ближайшее меньшее по модулю целое число (возрастая по значению). Нередко именно это и требуется.
     
  • По отношению к положительным числам оно полезно уж тем одним, что конструкция «|0» более чем на порядок короче по сравнению с «Math.floor()». Поэтому она может и должна вызывать у разработчиков привыкание не меньшее, чем та принятая в jQuery запись «$()», о которой я говорил четыре дня назад, что с неё никто добровольно не перейдёт обратно на «document.getElementsByClassName()», например.

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

Читать дальше →

Часть 2: если у меня есть 30.000 рублей, куда их можно вложить?

Reading time8 min
Views55K

Вот так хабрасообщество смотрит на инвестиции в отечественные проекты

Я уже несколько раз писал про разработанные нами в рамках российского права механизмы краудинвестирования, позволяющие быстро вложить небольшую сумму (например, 1000 рублей) в проект. В прошлом топике про механику реализации микроинвестиций разгорелся довольно объёмный спор про то, что в России это не сработает из-за менталитета «все хотят всех кинуть».

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

Загадка выпадающего списка «Амазона»

Reading time2 min
Views192K
Бен Кэменс обнаружил, что в выпадающем списке Shop by Department на сайте «Амазон» ховер-эффект происходит очень быстро, абсолютно без какой-либо задержки. Тем самым происходит нарушение старого, выработанного ещё в 90-х годах прошлого века правила: перед отображением пункта подменю необходим так называемый гистерезис, запаздывание.



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

Домашний/проводной интернет с резервным каналом по 3g

Reading time7 min
Views52K
Решил написать, так как в основном есть статьи по резервированию основного 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
Читать дальше →

Как за одну минуту восстановить текст после неудачной отправки веб-формы

Reading time3 min
Views119K
Бывало ли когда-нибудь так, что вы набирали в браузере длинный и интересный текст, внимательно вычитывали его, и тут, буквально через мгновение, понимали, что при обращении к сайту произошла ошибка, а ваш текст в форме был стёрт?

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

И, тем не менее, вы писали длинный текст именно там, где ничего для сохранения данных формы не сделано.

Можно ли теперь как-то восстановить данные, если вы не можете скопировать текст из формы и не можете отправить POST-запрос повторно?

Не закрывайте браузер!
Решение есть

На пути к созданию безопасного веб-ресурса. Часть 1 — серверное ПО

Reading time7 min
Views99K
Я уже довольно долгое время хочу формализовать все свои мысли, опыт, ежедневно применяемый на практике, и многое другое в одном месте и предоставить их общественности. Уверен, многим этот материал будет полезен. Он посвящен различным моментам в конфигурации серверного ПО Linux и безопасным подходам к созданию сайтов/приложений на php (все же это до сих пор одна из самых популярных связок, хоть её успешно и подвигают другие технологии. Но советы так же легко применимы и к веб-ресурсам на других технологиях).

Т.е. речь идет о типичной ситуации. Проект (стартап), купили под него сервер и разворачиваем на нем сайт. Бизнесу не нужно тратить лишних денег на сервера (поэтому будут выбраны наиболее производительные связки ПО), а так же нужно, чтобы все было безопасно, при чем бесплатно :)
Много текста. По-другому никак

Объединение JavaScript и CSS в одном файле

Reading time2 min
Views13K
Если Вы работали над оптимизацией загрузки страницы, Вы знаете, насколько дорогостоящая каждая загрузка ресурса. Чем больше число внешних ресурсов, к которым Вы обращаетесь, тем больше время требуется для загрузки страницы.
Как правило, веб-страницы обращаются ко многим внешним CSS и файлам JS и следовательно подвергаются многим загрузкам ресурса. Совет от гуру оптимизации в необходимости объединить все файлы CSS и все до одного файлы JS, чтобы уменьшить число ресурсов до двух. Это, без сомнения, поможет сократить время загрузки страницы.
Если Вы все же считаете что эти две загрузки не являются лучшим решениям, я с Вами соглашусь. В этой статье мы рассмотрим способ объединения CSS с JS и сведем количество загрузок к одной. Я обнаружил этот способ, отчаянно пытаясь оптимизировать страницы в Microsoft Office Live
Читать дальше →

TCP Congestion Control или Почему скорость прыгает

Reading time4 min
Views125K
Всем привет!

Бывало ли у вас такое, что ставите файл на закачку, и скорость медленно, но верно возрастает, затем, в какой-то момент, резко снижается, затем опять возрастает? Закачка файла в один поток не обеспечивает полную скорость канала? Запускаете торрент-клиент, и пинг в игре сильно прыгает? Используете 3G-модем (или другую линию с относительно большой потерей пакетов) и не можете это терпеть?
Наверняка вы винили во всем ваш роутер, либо обвиняли своего провайдера в кривой настройке шейпера? Это влияет, но виноваты не они.
Итак, встречайте:

TCP Congestion Control, или TCP Congestion Avoidance Algorithm.

Читать дальше →

Вебсокеты: боевое применение

Reading time6 min
Views79K
imageВебсокеты — это прогрессивный стандарт полнодуплексной (двусторонней) связи с сервером по TCP-соединению, совместимый с HTTP. Он позволяет организовывать живой обмен сообщениями между браузером и веб-сервером в реальном времени, причем совершенно иным способом, нежели привычная схема «запрос URL — ответ». Когда два года назад я присматривался к этому стандарту, он был еще в зачаточном состоянии. Существовал лишь неутвержденный набросок черновика и экспериментальная поддержка некоторыми браузерами и веб-серверами, причем в Файрфоксе он был по умолчанию отключен из-за проблем с безопасностью. Однако теперь ситуация изменилась. Стандарт приобрел несколько ревизий (в том числе без обратной совместимости), получил статус RFC (6455) и избавился от детских болезней. Во всех современных браузерах, включая IE10, заявлена поддержка одной из версий протокола, и есть вполне готовые к промышленному использованию веб-серверы.

Я решил, что настало время попробовать это на живом проекте. И теперь делюсь, что из этого вышло.
Что вышло

Suit Up! Простой и легкий WYSIWYG

Reading time10 min
Views58K


Статья делится на три части:
UPD Критика


Вступление


Не так давно, а, точнее, года два назад, в кругу разработчиков, с которыми я имел честь общаться (почти все — новички), каждый, кому поступила задача поставить WYSIWYG, ставили монстрообразный TinyMCE. Этот редактор считался почему-то стандартом у многих веб разработчиков, хотя, мало кому нужны были то большое количество функций, которые предлагались программистам. Тут тебе и то и это. Наверно, таким образом, новички пытались сказать клиенту «смотри, мы тебе на сайт запилили Ворд».

Однажды (не помню при каких условиях), мне захотелось или понадобилось разобраться в том, как работают браузерные «рич эдиторы». Моему удивлению не было предела, когда я сам, не имея каких-либо глубоких познаний в веб разработке, сделал две кнопочки: Bold и Italic, что оказалось очень простой задачей. Мне захотелось больше узнать о том, что же делать дальше. Так я познакомился с серией статей «WYSIWYG HTML редактор в браузере» (по ссылке первая статья, советую прочесть). Но информация на тот момент мне показалась несколько сложноватой. Поэтому я решил методом тыка, наступая на уже растоптанные кем-то грабли, написать свой простой редактор.

Сделал я его в виде jQuery плагина, и, думаю, не стоит отвечать «почему». Получилось кое-как заставить работать его в разных браузерах. Тут мне пришла в голову идея написать статью на хабр, после некоторых доработок. Время шло, допиливание я откладывал, откладывал… Два года, черт, целых два года. Но я постараюсь исправиться.


Простейший редактор


Для того, чтоб дать возможность пользователю менять содержимое блока (в данном случае, обычного дива) просто задаём ему (блоку) атрибут contenteditable:
<div contenteditable></div>

Редактор готов!
Читать дальше →

Измеряем производительность «облачных» дисков — спасаем MySQL

Reading time6 min
Views21K
В последнее время в облачных средах и хостингах все чаще стали попадаться «виртуальные» жесткие диски. Техническая служба хостера может заверять, что «виртуальный» диск — быстрый, как десяток рейдов 10 (рейд 100 ;-) ) и держит сотни, а то и тысячи IOPS – однако MySQL заметно для клиентов тормозит. А как это доказать хостеру?

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

В статье я проиллюстрирую простую методику нахождения «точки опрокидывания» производительности виртуального жесткого диска, с использованием доступных в дистрибутивах инструментов – sysbench и iostat. Также мы измерим «точку опрокидывания» известных своей тормознутостью виртуальных дисков EBS от Амазона – как обычных EBS, так и Provisioned IOPS EBS (1000 и 2000 IOPS).
Читать дальше →

Information

Rating
Does not participate
Registered
Activity