Архив метки: work

Анатомия Play Framework

Продолжая «оперировать» Play Framework в процессе реализации своего первого веб-приложения наткнулся на очень интересный материал «Play, Anatomy of a web framework» (серия статей).

Автор рассказывает про внутренности фреймворка. От запуска приложения, через обработку реквеста и респонса, до сущности changes hot reload (Hot redeploy, моментальной перезагрузки ваших изменений в коде в дев окружении без необходимости что-то пересобирать/перезапускать).

Если первая часть, упомянутая по ссылке выше, рассказывает про последовательность действий, которая происходит при запуске веб-сервера, то во второй части мы уже видим, какой ценой разработчики фреймворка добились того, что мы меняем java-файл, нажимаем в браузере F5 и тут же видим наши изменения. Основная идея: Play очень легкий компонент, который легко перезагрузить, Play — stateless компонент (не хранит состояний между запросами), т.е. можно легко уничтожить объекты/классы и создать их заново в процессе рестарта, ибо ничего не теряется.

Третья статья раскрывает секреты роутинга. Все, что мы пишем в файлу routes, трансформируется в обычный scala код, поэтому так прекрасно работает type safe в IDE и вообще все просто.

Let’s Play

Захотелось изменить жизнь если не к лучшему, то к чему-то новому и взор мой пал на мир Java и что там нынче есть для удобного создания веб-приложений. После прочтения статей типа «Стоит ли использовать Spring Boot в вашем следующем проекте?» обратился к фреймворку Play Framework — The High Velocity Web Framework For Java and Scala.

Прямо на титульной странице сайта проекта можно увидеть видео, показывающее за 20 минут основы разработки для Java и Scala разработчиков (отдельно). Если честно, видео вдохновляющее, но довольно короткое. Тут мне стало интересно, кто на практике использует эту наработку, и наткнулся я на материал от разработчиков linkedin.com. В этом видео рассказываются не только основы и фишки разработки. В самом начале, например, довольно четко выделено, чем же так хорош Play для разработчиков (не надо ковыряться в консоли, парсить огромные логи, ждать деплоя приложения после каждого изменения и т.п.). Где-то на 15-й минуте начинается обсуждение о том, что Play — это event-based фреймворк (в отличие от большинства других, основанных на тредах). И т.п.

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

Для дальнейшего ознакомления с темой можно почитать пару статей:
Developing Scalable Web Applications with Play
Integrating Play for Java and Akka (тут много про асинхронную природу фреймворка)

Да и можно посмотреть еще одно видео от автора первого. «Node.js v.s. Play Framework» by Yevgeny(Jim) Brikman at ScalaMatsuri 2014

Еще есть страничка под названием The Ultimate Guide to Getting Started with the Play Framework со ссылками на материалы по различным аспектам разработки.

Deadlock в MySQL

Это магическое пугающее слово deadlock =)

Получить его в мускуле достаточно просто:

Transaction #1
BEGIN;
SELECT * FROM `testlock` WHERE id=1 LOCK IN SHARE MODE; /* GET S LOCK */
SELECT SLEEP(5);
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK */
COMMIT;

Transaction #2
BEGIN;
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK - DEADLOCK AND ROLLBACK HERE */
COMMIT;

Первая транзакция лочит данные, вторая пытается получить лок ДРУГОГО типа этих же данных и ждет, в это время первая транзакция тоже хочет получить еще и блокировку ДРУГОГО типа. В итоге они ждут друг друга и так до бесконечности.

Описание ситуации.

Числа Фибоначчи

Для расчета какого-то числа Фибоначчи необязательно брутфорсить, т.е. перебирать всю последовательность методом сложения. Есть прекрасная Формула Бине. По ней прекрасно можно найти n-й элемент последовательности.

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

Ну и наконец мы можем таким образом найти n, при котором число Фибоначчи перевалит, например, за 1000 знаков, по формуле: i * Math.log10(phi) + Math.log10(1/Math.sqrt(5)) , где phi — так называемое Золотое сечение. Вычисляется по формуле (Math.sqrt(5) + 1) / 2

Почему формула такая? Да потому что следуем условию, что phi**n/sqrt(5) > 10**999 (** — степень, 10**999 — это первое число, у которого 1000 знаков)

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

Преобразовать IP адрес в целое число на PHP

Рассмотрим IP адрес версии 4. Он состоит из 4х октетов, 4 чисел, каждое из которых может быть от 0 до 255. По сути, каждое число имеет тип byte, состоит из 8 битов.

В интернете множество вариантов, как сделать конвертацию (1, 2). Наиболее наглядно, на мой взгляд, рассмотрели проблему здесь.

Сюда же я приведу свой вариант, реализованный на уровне бинарной обработки чисел. Кажется, он как обычно быстрее, чем все это варианты с перемножением и возведением в степень. Стоит упомянуть, что и в PHP, и в СУБД есть средства для конвертации IP в числе и обратно, так что данный пост имеет чисто академический смысл.


$ip = '70.112.108.147';
$arr = explode('.', $ip);

// для наглядности, что получается после смещений
echo decbin($arr[0]<<24) . "\n"; // 24 - это 3 блока по 8 нулей echo decbin($arr[1]<<16) . "\n"; // 16 - это 2 блока по 8 нулей echo decbin($arr[2]<<8) . "\n"; // 8 - это 1 блок по 8 нулей echo decbin($arr[3]) . "\n"; // оставляем как есть // теперь просто склеим все значения. Не просоммируем, а именно применим операцию OR, что-то вроде конкатенации $ipInt = $arr[0]<<24 | $arr[1]<<16 | $arr[2]<<8 | $arr[3]; var_dump($ipInt);