Browse Month: Февраль 2017

Пишем биллинг. Как вычислять периоды услуг.

Когда работаете с датами, не забывайте страдать 😉

Есть услуга, которая стоит 300 рублей и продавец говорит, что услуга предоставляется на 1 месяц. Что такое месяц?

Обычно, мы не задумываемся об этом, а продавцы в своём договоре это стараются фиксировать. Кто-то говорит, что за месяц принимается фиксированное количество дней, обычно 30. Кто-то прописывает, что это календарный месяц.

Раньше, я считал, что если услуга заказана на 1 месяц, то можно просто прибавить единичку к месяцу. Но как быть с ситуацией, когда клиент заказал услугу 31 января, ведь 31 февраля не существует! Тут то и начинается всё веселье.

Лично мне не нравится схема, когда за месяц принимается какое-то фиксированное число дней. Я считаю такой подход не честным по отношению к клиенту. В году 365 дней, а иногда, даже 366 🙂 На 30 дней эти числа никак не делятся. Тогда как можно оказать услугу на год?

Должен быть какой-то правильный, честный и универсальный способ подсчета периодов действия услуг.

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

В этом месте читающий скажет: «Да в чем проблема считать даты исходя из кол-ва дней конкретных месяцев?» И я так сказал, но опять не обходиться без страданий (не забываем страдать).

Давайте попробуем вычислить дату окончания услуги, заказанную 2017-01-01 и оплаченную на 1 месяц:

Получили: 2017-01-31 23:59:59 (здесь всё хорошо).

Но теперь представим ситуацию, что клиент заказал услугу в 2017-01-02, как теперь вычислить дату окончания?

Нам кажется, что услуга должна кончиться: 2017-02-01 23:59:59, но правильный ответ: 2017-02-01 21:40:37 (всё из-за того, что в феврале всего 28 дней, и стоимость одного дня в феврале выше, чем в январе).

И тут нам кажется, что мы молодцы, мы написали правильную формулу и можно идти пить пиво…. но….

Предположим, что клиент заказывает услугу не на 1 месяц, а на 1 месяц и 1 день! Казалось бы ерунда, мы к этому готовы, и мы же готовы объявить клиенту стоимость такого периода? Мы же знаем, что услуга стоит 300 рублей в месяц, так давайте скажем, стоимость услуги на 1 день больше? Да, легко? Нам же никто не мешает узнать кол-во дней в месяце этого злосчастного одного дня? Да, можем… идём пить пиво…

Блииин, а если клиент оплатит услугу не сразу, если клиент положит услугу в корзину? А если, пока клиент будет оплачивать, наступит следующий месяц? А мы же уже посчитали стоимость услуги и сказали её клиенту?! Блин…. не забывайте страдать….

Работаем с сетями IPv4. Алгебра-логики. Вычисления.

IP адреса, несмотря на свою простоту, до сих пор являются сложнопонимаемыми для многих разработчиков.

Цель данной статьи показать, как можно вычислять все необходимые значения сети.

Итак:

Мы привыкли видеть IP адреса в виде: AAA.BBB.CCC.DDD, например: 192.168.100.15

Для манипуляций с IP адресами нам необходимо сначала перевести их в бинарный вид.

В языке Си преобразование IP адресов в бинарный вид и обратно делается с помощью ф-ий:

aton — Addres to numeric ( адрес в число )

ntoa — Numeric to address ( число в адрес )

p.s. «Адрес» это форма записи IP, который мы привыкли видеть (например: 192.168.100.15).

В PHP такими функциями служат: ip2long и long2ip

В JS можно использовать следующие функции:

В Perl:

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

 

Битовая маска

Битовая маска — это короткая запись Маски сети. Например, маску: 255.255.255.0 коротко можно записать как 24.

На самом деле, 24 означает кол-во единиц в двоичной системе счисления, соответствующей числу: 255.255.255.0.

Пример:

Маска: 255.255.255.0 это: 11111111.11111111.11111111.00000000 в двоичной системе счисления, т.е. 24 единицы )

В JS можно получить Битовую маску с помощью следующей ф-ии:

Надеюсь все в состоянии переписать эту ф-ию и для Perl? )

Привет, мир!

Да, это моя первая запись. Как и подобает программисту, первое что он пишет, это:
"Hello World".

Так что, я оставил именно такой заголовок)
p.s. если кому-то интересно почитать обо мне, то для этого я создал отдельную страничку)


%d такие блоггеры, как: