Вот и пригодилась опять теория вероятности ;)

Задача: есть два исполнителя. Необходимо обеспечить, чтобы исполнителю №1 доставалось 2/3 заявок, и исполнителю №2 — 1/3 задач.

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

  • Исполнитель 1, с долями 2/3
  • Исполнитель 2, с долями 1/3

Как вычисляем исполнителя:

Всего долей: 3

  • — Создаем кость, с гранями 1,2,3
  • — Грани 1 и 2  = Исполнитель 1
  • — Грань 3  = Исполнитель 2

Кидаем «кость». Какая грань выпадет, такой исполнитель и назначается. В принципе при достаточном количестве бросков, процентное соотношение выпадений исполнителя выходит:

  • Исполнитель 1:  67%
  • Исполнитель 2:  33 %

Ну и кому интересно, вот код реализации:

API Map Yandex: Изменение содержимого метки «на лету»

Задача: разместить внутри метки поле ввода текста (комментарий) и сохранять его значение

Решение:

При формировании Json данных FeatureCollection, внутри каждой метки, в настройке balloonContentBody разместим теги <textarea style=’width: 100%;’></textarea>. И кнопку сохранения результата. Но! Сохранить результат в БД не сложно. Сложно добиться того, чтобы то что пользователь ввел в поле, сохранилось, после перевыбора метки мышкой. Содержимое поля скидывается каждый раз к изначальному, т.к. движек яндекса каждый раз перерисовывает отображение html на основании данных которые у него » в душе». Поэтому функция сохранения будет выглядеть как-то так:

Что тут происходит?

  1. Изменения сохраняются в базу данных при помощи вызова скрипта receipts2/savecomment
  2. Читаем данные которые яндекс хранит у себя в нутри
  3. Изменем эти данные, добавив комментарий
  4. Сохраняем данные «внутри»

В результате после перещелкивания по метке, комментарий сохраняется.

YII2 выполнение кода в каждом контроллере

В продолжении темы примитивного логгирования. Понадобилось записывать, какой пользователь открывает какие страницы. И если с клиентским отображением в принципе ничего сложного, просто вставил в /view/layouts/main.php код вида:

Но, к сожалению оный не перехватывает вызов страниц, которые завершаются в контроллере. Ну например всякие ajax запросы на странице. Поступил чуть хитрее: создал свой компонент в папке components (требуется создать папку если нет):

И добавил/отредактировал в /config/web строчки:

Плюс добавил сохранение сессии в константу sess в web/index.php

Итого, в логах теперь красуется всё то нужно:

Примитивное логгирование в YII2

Иногда необходимо в проект добавить логгирование событий работы, однако не всегда удобно тащить для этого кучу сторонних библиотек. Тем более что особых требований и не нужно. Если достаточно что бы:

  • логи велись «стандартно» для системы на базе Linux, с автоматической ротацией и т.п.
  • особых тонкостей и настроек для вывода не нужно, достаточно просто текста

То вполне можно написать свою простенькую модель вида:

И использовать её далее в любом месте в коде, например так:

Логи можно будет наблюдать в стандартном /var/log/messages:P.S. Раньше тоже велосипедил с добавлением лога в отдельный файл, а потом подумал «А зачем?». В большинстве случаев достаточно так.

OpenVPN клиент на RaspberryPi

В наличии: файл ovpn. Задача установить соединение.

Решении: напишем скрипт и положим в крон:

1 2 3 298