Характеристики семейства AVR

AVR – это семейство 8 — битных микроконтроллеров от компании Atmel. Популярность данного семейства, в основном, заключается:

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

Пожалуй, это основные параметры, которые определяют успех любого производителя микроконтроллеров, чем ATMEL с семейством AVR и отличается. Конечно, есть конкуренты у данного семейста – PIC от Microchip, которые держат свою нишу малобюджетных дешевых микроконтроллеров на все случаи радио – жизни.
Чем же характеризуются технические возможности микроконтроллеров семейства AVR? Если кратко, то характеристики такие:

  • производительность порядка 1 MIPS(Million of Instruction Per Sets) при тактовой частоте генератора в 1Мгц. Это позволяет выполнять 1 млн операций за 1 такт тактового генератора. Такая производительность обусловлена RISC архитектурой микроконтроллера и тщательно проработанной системой команд ;
  • усовершенствованная архитектура RISC (Reducing Instruction Set Computing – вычисления с сокращенным набором команд) – предполагает набор компактных и быстро исполняющихся команд вычисления;
  • наличие 32-х регистров общего назначения (РОН). РОН нужны для быстрой операции чтения и записи, после операции с данными без обращения к памяти. Так как обращение к памяти занимает больше тактов, чем к РОН, то это дает преимущество в скорости выполнения кода;
  • отдельные шины команд и данных. Данный поход отвечает Гарвардской архитектуре и отличается от классической модели хранения команд и данных в ПК по принципу фон Неймана, когда одна шина для одной памяти, где хранятся и команды и данные. Гарвардская архитектура позволяет ускорить процесс выполнения команд и операции с данными, так как раздельная шина позволяет выполнять все эти действия параллельно, в большинстве случаях, за один такт;
  • Flash – память программы. Дает возможность прямо в готовом изделии перепрограммировать (перепрошить) кристалл через внутрисистемный последовательный канал. Flash – память AVR позволяет выполнять, в пределах, 10 000 циклов стирания/записи;
  • возможность сохранять сторонние данные в энергонезависимой памяти EEPROM. Данная память использует, как дополнительный накопитель для хранения пользовательских данных программы. На уровне готового устройства это могут быть настройки, текст, данные датчиков и т.д. Запись в данную память можно произвести как программно, так и через внешний интерфейс обмена данных SPI. EEPROM в AVR позволяет выполнять, в пределах, 100 000 циклов стирания/записи;
  • сторожевой таймер. Нужен для автоматизации выполнения операций через определенные промежутки времени;
  • периферия для работы с аналоговыми сигналами. К ним можно отнести 10-ти разрядный, многоканальный АЦП и аналоговый компаратор;
  • таймеры – счетчики для подсчитывания как внутренних, так и внешних импульсов. В AVR может быть как минимум быть 16-ти разрядный и один или два 8-ми разрядных таймеров-счетчиков, которые могут работать в режиме 8-ми, 9-ти, 10-ти и 16-ти битовой широтно-импульсной модуляции (PWM);
  • набор модулей последовательной передачи информации , такие как SPI, TWI(I2C), UART(USART);
  • имеет внутренний тактовый генератор, позволяющий работать без внешнего тактового генератора. Пределы использования внешнего тактового генератора : от 0Гц до 16 – 20 МГц
  • встроенный детектор питания, реагирующий на падение напряжения;
  • большое количество режимов энергосбережения с возможностью выхода из спящего режима, как по внешнему прерыванию, так и по сторожевому таймеру.
  • диапазон напряжений от 2.7 до 5.5 В. В критических случаях заработает и при диапазоне 1.6 до 6.0 В;

C/C++ для AVR. Пошаговый курс

Это очередной курс, посвященный изучению программирования микроконтроллеров AVR на языке высокого уровня C/C++. При изучении данного курса будут использовано инструментальное средство программирования IDE Atmel Studio, который содержит в себе редактор исходного кода и отладчик для архитектуры AVR. Помимо этого будет использован симулятор Proteus 8 для анализа работоспособности программы.

Данный курс содержит описание архитектуры, который отвечает требованиям программирования на языке высокого уровня C/C++. Для глубокого понимания можно обратиться к курсу Assembler для AVR. Пошаговый курс

Assembler для AVR. Пошаговый курс

Данный курс материалов пошагово описывает использование микроконтроллеров AVR на низкоуровневом языке программирования AVR. В роли инструментального средства выступает Atmel Studio — родная для AVR IDE, позволяющая программировать и отлаживать код, написанный как на Assembler, так и на C/C++. В роли симулятора будет использованы как родной отладчик Atmel Studio, так и Proteus, но можно использовать и готовую плату — дело по вкусу. Материалы будут пополнятся по мере появления личного времени авторов блога.

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

Шаг 1. Обзор AVR

Шаг 2. Концепция языкового ассемблера в микроконтроллерах

Шаг 3. Программирование и тестирование AVR

Шаг 4. Регистры в AVR

Шаг 5. Порты в AVR

Шаг 6. Память SRAM в AVR

Шаг 7. Переходы и ветвления в программе

Шаг 8. Вычисления в программе

Шаг 9. Планирование проектов на AVR

Шаг 10. Периферия AVR

 

Часть 2. Простой пример создания Hello World в Java ME

Связанные статьи:

В прошлом посте мы рассматривали общий обзор того, что из себя представляет Java ME, рассмотрели конфигурации и профили платформы. В данном посте продолжим и создадим начальный пример Hello World и запустим на виртуальном эмуляторе, входящий в Java ME SDK 3.2.

Требуемые инструменты

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

  • установленный JDK 7 или выше с виртуальной машиной Java;
  • Java ME SDK 3.4 — набор средств для разработки на Java ME, включающий в себя и эмуляторы;
  • Java ME SDK 3.4 Plugins for NetBeans — набор плагинов для NetBeans, скачиваются на официальном сайте, на той же странице и месте, где и Java ME SDK 3.4
  • IDE NetBeans — интегрированная среда разработки на Java. Причем, скачивать c поддержкой PHP. Не будем захламлять NetBeans ненужными, нужные мы сами дальше установим;
  • Плагины Java ME для NetBeans — дополнительно устанавливается через интерфейс NetBeans;

После того, как JDK 7 установлен, Java ME SDK 3.2 установлен и NetBeans установлен неободимо установить на NetBeans дополнительные плагины Java ME для создания проектов Java ME. Установка плагинов осуществляется через интерфейс NetBeans в меню «Сервис»->»Подключаемые модули»

netbeans-modules

Во вкладке «Доступные модули» через поиск вбиваем ключевое слово «Java ME» и устанавливаем все доступные модули, а те, что мы скачали в архиве Java ME SDK 3.4 Plugins for NetBeans(oracle-jmesdk-3-4-rr-nb-plugins.zip) добавляем через то же диалоговое окно, но со вкладки «Загружено», предварительно разархивировав содержимое архива.

Дальше нам настроить среду NetBeans, чтобы она нашла наш Java ME платформу на этапе создания проекта Java ME. Для этого опять заходим в меню «Сервис»->»Платформы Java»

netbeans-java-platforms

Нажимаем  появившемся окне на кнопку «Добавить платформу»

java-me-platform-set-netbeansВыбираем «Эмулятор платформы CLDC Java ME» , жмем далее и выйдет окно выбора папки домашней директории Java ME SDK

select-java-me-sdk-platform-netbeansПосле выбора платформы необходимо поставить галочку на обнаруженную платформу и нажать на кнопку «Готово». Все, настройка завершена, теперь приступим к созданию проекта.

Создание проекта Java ME

После установки всех плагинов и настройки платформы у нас будет возможность создавать проекты Java ME стандартным способом. Для этого переходим «Файл»->»Создать проект…»

create-java-me-cldc-project-netbeans

Выбираем шаблон проекта «Java ME» в категории и «Mobile Application» в проекте, жмем «Далее >»

type-name-and-next

Вводим название нашего проекта и выбираем место хранения, жмем «Далее >»

select-conf-and-profile-and-nextВыбираем платформу эмулятора, конфигурацию и профиль, жмем «Далее >» и «Готово»

our-java-me-project

На данный момент у нас есть пустой проект. Добавим класс «HelloWorld.java» в папку исходного кода, который будет содержать код запуска приложения с выводом на экран записи приветствия «Hello World»:

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.*;

/**
 * @author WebSofter
 */
//Создаем основной класс мидлета(Java ME приложения)
//через наследование класса MIDlet и реализацию интерфейса 
//обработчика команд CommandListener
public class HelloWorld extends MIDlet implements CommandListener{
    private Command cmdExit;//Объект комманды для меню
    private Display dispMainDisplay;//Объект дисплея для вывода
    public HelloWorld(){
        dispMainDisplay = Display.getDisplay(this);//Получаем текущий дисплей устройства
        cmdExit = new Command("Выход", Command.SCREEN, 2);//Dsltkztv gfvznm lkz rjvfyls
    }
    public void startApp() {
        //Создаем новый текст
        TextBox txtHello = new TextBox("Hello World", "Hello World!", 256, 0);
        //Добавляем нашу команду
        txtHello.addCommand(cmdExit);
        //Добавляем слушатель событий
        txtHello.setCommandListener((CommandListener) this);
        //Выводим текст на дисплей
        dispMainDisplay.setCurrent(txtHello);
        
    }
    //Стандартный метод паузы мидлета
    public void pauseApp() {
    }
    //Стандартный метод выхода из текущего окна класса
    public void destroyApp(boolean unconditional) {
    }
    //Обработчик событий, реализованый из интерфейса CommandListener
    public void commandAction(Command c, Displayable s){
        if(c == cmdExit){
            destroyApp(false);//Выходим из мидлета
            notifyDestroyed();//Уведомляем о выходе
        }
    }
}

Необходимо отметить, что в Java название класса должно соответствовать названию файла класса иначе выйдет ошибка. Данный класс содержит основной минимальный код для запуска приложения Java ME, иначе говоря мидлета(MIDlet), так называются программы для Java ME в среде Java.

После того, как класс есть и код для него написан необходимо зарегистрировать данный, главный, класс в свойствах проекта. Для этого нажимаем ПКМ на проекте и выйдет диалоговое окно с настройками проекта

project-properties-winВ разделе «Application Descriptor» во вкладке MIDlets записываем название главного класса, которого мы добавили в проект. Жмем «OK» и запускаем наш проект b мы увидим как запуститься эммулятор и установится в него наш мидлет и запустится автоматически

run-our-midlet-jar

После сборки проекта в директории проекта dist появятся файлы Hello_World.jad и Hello_World.jar.

Часть 1. Простой пример создания Hello World в Java ME

Связанные статьи:

Компактная версия платформы Java (Java ME) представляет собой надежную и настраиваемую среду для приложений, работающих на мобильных и встраиваемых устройствах: мобильных телефонах, цифровых приемниках, проигрывателях дисков Blu-ray, цифровых устройствах хранения данных, модулях M2M, принтерах и других устройствах.
Технология Java ME изначально разрабатывалась для преодоления ограничений, связанных с созданием приложений для компактных устройств. С этой целью компания Oracle разработала технологию Java ME, которая способна соответствовать подобным техническим ограничениям и позволяет создавать Java- приложения, работающие на компактных устройствах с ограниченным объемом памяти, диагональю экрана и зарядом аккумулятора.

Конфигурации и профили Java ME

Java ME построена как блочная структура, где составляющие можно поделить на конфигурации и на профили. У каждой конфигурации есть свой профиль, как это показано на рисункеjavame-structureЕсли рассматривать Java ME в общем среде Java, то к Java ME относится отдельный класс устройств, которые ограничены ресурсами и производительностью в отличии от Java EE и Java SE приложений, которые расcчитаны на высокопроизводительные сервера и персональные компьютеры. Сам класс Java ME делится еще на 2 подкласса конфигурации устройств, как показано на рисунке

javame-cdc-vs-cldc

CDC(Connected Device Communication) — конфигурация устройст с соединением в сеть. Это класс устройств, которые характеризуются следующими свойствами:

  • имеют процессор, имеющий 32 — битную архитектуру;
  • имеют тактовую частоту не ниже 75 MHz;
  • имеют оперативную память в пределах 4 — 32 Мб.

К этим устройствам можно отнести телевизоры, приставки, спутниковые антенны, автомобльные встраиваемые устройства и т.д.

CLDC(Connected Limited Device Communication)  — конфигурация устройств с соединением в сеть с ограниченными ресурсам. Это класс устройств, которые характеризуются следующими свойствами:

 

  • имеют процессор, имеющий 16 — 32 — битную архитектуру;
  • имеют тактовую частоту не ниже 16 MHz;
  • имеют оперативную память в пределах 256 Кб — 4 Мб.

К данной конфигурации устройств можно отнести различного рода телефоны, коммуникаторы, цифровые приемники и т.д.

Смысл конфигураций заключается в присутствии или отсутствии в API Java для данного устройства определенных классов и предъявляет определенные требования к Java -машине, поэтому приложения CDC выполняются на JVM(Java Vitual Mashine) по аналогии с Java EE и Java SE, а CLDC приложения запускаются на специфичной Java — машине — KVM(Kilobyte Virtual Mashine), который предназначен для процессоров с ограниченными возможностями. К примеру, в конфигурации CLDC определенные классы, которые присутствуют в CDC и в общем наборе Java SE/EE, но в силу ограниченности ресурсов железа их количество и свойства урезаны. CDC содержит почти все классы, что и в CLDC.

С конфигурацией мы закончили. Теперь рассмотрим профили конфигураций.  Профили — это набор требований к ресурсной базе внутри конфигурации, таким обрзом, CDC имеет свои профили, а CLDC имеет свои. Мы не будем расматривать специфичные особенности профилей CDC, так как нас интересует мобильная разработка, а это профили CLDC, коих рассмотрим поподробнее.

Профили CDC:

  • Foundation profile;
  • Personal profile.

Профили CLDC:

  • IMP-NG — Information Module Profile — Next Generation
  • MIDP — Mobile Informaton Device Profile.

Версии Java ME

Данные профили актуальны для версии Java ME SDK 3.4, на данный момент существует Java Me SDK 8.1, в котором есть дополнительные профили, а сами профили MIDP и IMP-NG утратили свои былые названия.

javame-jdk-8-structureМы не будем рассматривать версию Java ME SDK 8 и рассмотрим профиль MIDP в CLDC версии Java SDK 3.4.

MIDP(Mobile Informaton Device Profile) — профиль мобильных информационных устройств. Имеет свои версии — 2.0 и 2.1. Каждая версия различается наличием или отсутствием в устройстве определенных функциональных возможностей и предъявляет определенные требования к аппаратным возможностям устройства, но не к API Java. В разработке MIDP, в свое время, принимали участие многие производители мобильных устройств, когда был пик телефонов с Java ME, но развивается и по сей день, а в JDK 8.1 мобильная разработка направлена только для встроенных применений, и так, нет реализации MIDP профиля (нет пакета LCDUI). Тем не менее, JDK 8.1 обеспечивает реализацию профиля MEEP, который является дальнейшим развитием IMP-NG/MIDP.

Еще надо учитывать, что конфигурации могут иметь версии. В Java ME SDK 3.4 самая новая реализация CLDC имеет версию 1.1,  а MIDP — 2.1, был еще профиль MIDP 3.0, который не получил дальнейщее развитие в Java ME SDK 3.4, в силу того, что в Java ME SDK 8 профиль MIDP был реструктуризирован.

На этом закончим данный пост и в продолжении займемся практической частью реализации примера.

Основные модули Node.js. Модуль util.

Модуль Util, в первую очередь, предназначен для удовлетворения потребностей внутренних API Node.js. Методы данного модуля очень полезны, если мы хотим обработать код, обработать данные, искать ошибки на основе стандартных методов Node.js. Модуль util является встроенным модулем Node.js и предлагает, на данный момент, следующие стабильные методы для обработки данных:

1.Метод util.debuglog(section)

util.debuglog(section) — выводит пользовательский дебаг.



2.Метод util.format(format[, …])

util.format(format[, …]) — обрабатывает строки.



3.Метод util.log(string)

util.log(string) — вывод объекта в в виде строки для дебагинга с меткой.



4.Метод util.inspect(object[, options])

util.inspect(object[, options]) — вывод объекта в в виде строки для дебагинга с дополнительными опциями.



5.Метод util.isArray(object)

util.isArray(object) — проверка объекта на тип массива.



6.Метод util.isRegExp(object)

util.isRegExp(object) — проверка объекта на тип регулярного выражения.



7.Метод util.isDate(object)

util.isDate(object) — проверка объекта на тип даты.



8.Метод util.isError(object)

util.isError(object) — проверка объекта на возврат ошибки.



9.Метод util.inherits(constructor, superConstructor)

util.inherits(constructor, superConstructor) — наследует методы прототипа из одного конструктора в другой. Прототип конструктора constructor будет установлен новый объект, созданный из superConstructor.



10.Метод util.deprecate(function, string)

util.deprecate(function, string) — отмечает, что метод не следует использовать больше.



Создание пользовательских модулей в Node.js

Масштабируемость проекта на Node.js отличается легкостью реализации и подразумевает создание пользовательских модулей. Все модули Node.js можно разделить на встроенные, которые скомпилированы вместе с сервером, так и сторонние, пользовательские. Встроенными можно считать часто используемые модули, которые работают с сетью (http), с файловой системой (fs) , с событиями (events) и т.д. Пользовательские модули можно загрузить из менеджера пакетов npm или создавать собственные, которые будут решать те задачи проекта, которые легче отделить от остальной части. Виды модулей, которые можно реализовать можно подразделить на 3 вида:

  • модули js — обычные модули, в которых можно написать серверный код Node.js;
  • модули json — хорошо подходят для хранения часто изменяемых переменных проекта или для его конфигурации. По сути это обычный файл с данными типа json;
  • модули node — это скомпилированный тип модулей, которые отличаются высокой производительностью для высоконагруженных частей проекта.

Любой готовый модуль можно разместить в пользовательской директории, но первую очередь сервер ищет модуль с таким названием в стандартной директории node_modules и если там не находит, то ищет уже в пользовательских директориях, при этом, если по молчанию названия модуля не указано, то ищет модуль с названием index.js, дальше index.json и index.node. Для подключения модуля в серверной части используется функция include(), который возвращает переменную из модуля. Для того, чтобы эта переменная была доступна при подключении используется конструкция exports.varName1 = varName2, где varName1 — это пользовательская переменная, которая доступна при подключении модуля, а varName2 — это данные, которые передаются в переменную модуля varName1 после обработки в модуле. Далее покажем на примере как создать и использовать модули js и json.

1. Структура примера

Давайте, чтобы детально описать пример создадим проект со следующей структурой:node-modules-exmpl-structure

где www — корневая папка проекта, server.js — главный файл проекта для организации точки входа в проект и подключения модулей, configs — директория для модулей json и наш модуль в ней conf.js, modules — директория для модулей js и наш модуль в ней module.js. Давайте напишем код работы для каждого файла в структуре.

2. Организация модуля conf.json

Данный модуль является файл для хранения одной переменной в формате json и давайте запишем в ней вот такой код с переменными:

{
"name":"Mark",
"age":25
}

3. Организация модуля module.js

Данный модуль, пусть, будет содержать код для возврата объекта, который мы в ней создадим:

//Создадим объект пользователей
function Users(name){
    this.name = name;
}
//Добавим еще один метод для вывода имени
Users.prototype.view = function(){
    console.log(this.name);
};
exports.Users =  Users;//Возвращаем переменную из модуля

4. Файл запуска server.js

Ниже представлен код файла server.js, в котором подключаются модули и запускается пример работы проекта:

var user = require('./modules/module.js');//Подключаем наш модуль js
var conf = require('./configs/conf.json');//Подключаем наш модуль json
var name = new user.Users(conf.name);//Создаем объект из переменной модуля
name.view();//Выводим имя юзера на консоль

При указании файла модуля можно опустить расширения *.js и *.json

5. Возврат чистого объекта из модуля

Если мы посмотрим на код выше, то станет понятно, что объект Users — это объект переменной user, который возвращается модулем через конструкцию exports. А как сделать так, чтобы модуль возвращал чистый объект, т.е. можно было бы сразу написать вот так:

var Users = require('./modules/module.js');//Подключаем наш модуль js
var conf = require('./configs/conf.json');//Подключаем наш модуль json
var name = new Users(conf.name);//Создаем объект
name.view();//Выводим имя юзера на консоль

Для того, чтобы данный код сработал необходимо в модуле указать export через его глобальный объект module:

//Создадим объект пользователей
function Users(name){
    this.name = name;
}
//Добавим еще один метод для вывода имени
Users.prototype.view = function(){
    console.log(this.name);
};
module.exports.Users =  Users;//Возвращаем переменную из модуля

6. Запуск примера

Через консоль переходим в директорию нашего проекта www и выполняем команду(в Windows):

node server.js

и мы увидим результат, как на скриншоте:
node-modules-post-resultСкачать рабочий пример можно скачать по ссылке.

 

Решаем ошибку «Most middleware (like favicon) is no longer bundled with Express»

Решили обновить модуль Express для Node.js, с 3.x до 4.x, но вышла такая ошибка «Most middleware (like favicon) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware», которая гласит, что ныне подключение иконки favicon.ico, производиться через отдельный модуль, доступный по адресу https://github.com/senchalabs/connect#middleware.

Решение проблемы

Для Express 4. Устанавливаем новый модуль serve-favicon:

$> npm install serve-favicon

Затем в server .js или перезаписываем строки :

var favicon = require('serve-favicon');//Подключаем новый модуль
//...
app.use(favicon(options.favicon));//Загружаем нашу иконку

Для Express 3 . Ниже старый код, который вы сипользовали, вероятно, до этого и который вызывал ошибку в 4.x версии Express

app.use(express.favicon(options.favicon));

 

Простое решение для предотвращения DDoS — атак на PHP

DDoStop — это модифицированная версия проекта DDoS-Shield. Загрузить проект DDoStop можно здесь.

Описание

DDoStop — это набор скриптов с минимальным кодом для быстрой конфигурации и развертывания защиты PHP — страниц сайта от DDoS — атак. Конечно, проект не претендует на профессиональный подход к решению данной проблемы, но для простой защиты от ботов и мелких DDoS — атак вполне годен.

Техническая сторона

DDoStop работает по модели различного временного доступа реальных посетителей и ботов. Есть возможность сконфигурировать проект на  минимальное среднее время между визитами одного посетителя и максимальных посещений за минимальное время — это главный пункт конфигурации.  Реальные посетители физически не могут посетить одну страницу 90 в течении 30 секунд, но боты, которые являются основными DDoS — вредителями, могут себе такое позволить. Когда боты начинают атаковать, то они сразу попадают под запрет на доступ к сайту с выдачей ошибки в заголовке 503, как ниже на рисунке

ddos-atack-message

Если бот удалился, то через некоторое время его IP разблокируется, а это время можно задать в конфигурационном файле conf_ddos.php(об этом будет рассказано ниже). IP каждого бота , после блокировки, попадает в log-файл AttackersIPs.Log, расположенный в папке ddos/log.  В зависимости от степени безопасности могут выходить различные информационные сообщения. После каждой атаки ботов на адрес, записанный в конфигурационном файле отправляет сообщение на уведомление о том, что пойман очередной бот. Данная защита имеет большую значимость, когда требуется быстро защитить страницы сайта, чтобы предотвратить отток большого трафика и нагрузку на CPU от наплыва большого количества запросов DDoS — ботов.

Файлы проекта и включение в сайт

Проект состоит из 2 скриптов php: ddos/index.php и conf_ddos.php, иконки бана в папке ddos/images/cross.gif, файла лога ddos/log/AttackersIPs.Log.

  • index.php — ядро защиты. Весь процесс с операциями с IP выполняется здесь;
  • conf_ddos.php — файл конфигурации для начальной настройки проекта;
  • AttackersIPs.Log — файл, в которую будут записаны блокированные IP — адреса ботов.

Для включения сайта достаточно разархивировать проект с GitHub в корневую папку сайта, как ниже на рисунке

ddos-sec-add-in-site

 

И теперь, для того чтобы защитить ту или иную страницу достаточно подключить файл conf_ddos.php при помощи php функции require(«./conf_ddos.php»)  первой строчкой

include("conf_ddos.php"); //Защишаем страницу от DDoS - атак

Конфигурация/настройка защиты

Вся конфигурация и настройка управляется через conf_ddos.php, который имеет следующий вид

  $crlf=chr(13).chr(10);
  $itime=3;  // Минимальное число секунд между визитами
  $imaxvisit=10;  // Максимальное число визитов в $itime x $imaxvisits секундах
  $ipenalty=($itime * $imaxvisit);  // Минуты ожидания
  $iplogdir="./ddos/logs/";// Папка хранения логов с IP
  $iplogfile="./AttackersIPs.Log"; //Имя файла лога
  
  // Время
  $today = date("Y-m-j,G");
  $min = date("i");
  $sec = date("s");
  $r = substr(date("i"),0,1);
  $m =  substr(date("i"),1,1);
  $minute = 0;
  
  // установка данных для администратора
  $to      = 'support@voting.ru';   //Адрес админа
  $headers = 'From: voting.ru support@voting.ru' . "\r\n" .   // 	   
    		 'X-Mailer: voting.ru защишен от DDoS';
  $subject = "Предупреждение на возможные DDOS атаки @ $today:$min:$sec";
  

  //Сообщение при бане:
  $message1='<span style="color: red;">Временный интенсивный траффик или распознена как DDOS атака!!!</span>
';
  $message2='Пожалуйста, подождите ... ';
  $message3=' секунд или повторите попытку входа через несколько минут.
';
  $message4='<span style="color: blue;">Защита призведена DDOS скриптом на PHP!!!</span>
Если вы человек, то смените IP и вы свободны.
Мы временно забанили ваш IP <b>'.$_SERVER["REMOTE_ADDR"].' </b>из-за DDOS атаки.';
  $message5=' Ваш сайт был атакован или боты захотели зайти через IP - адресов: '.$_SERVER["REMOTE_ADDR"];
  $message6='
<img src="./ddos/images/cross.gif" alt="" border="0" />';
include("ddos/index.php");//Включаем главный файл DDOS - защиты из диерктории ddos

Проверка

Для проверки заходим на страницу с включенной DDoS защитой и жмем F5 для имитации обновления страницы в режиме DDoS — атаки и видим страницу

ddos-atack-message

Статья о том, как использовать IndexedDB в HTML5

IndexedDB — это API для хранения данных в браузере пользователя. Можно также использовать куки(cookie) и локальное хранилище(Local Storage), но они не предоставляют желаемый юзабилити, который предоставляет IndexedDB. Данные, хранимые в IndexedDB устойчивы. Данный способ хранения предоставляет богатые возможности запросов и доступны как в онлайн так и в оффлайн режимах. Также IndexedDB способен сохранять большие объемы данных. Увидеть состояние доступных хранилищ браузера можно через инструменты WEB — разработчика на панели Resources
IndexedDB-show-storage-img

 

IndexedDB — это текущий и рекомендованный кондидат для хранения локальных данных и доступный только в современных браузерах для Desctop.

IndexedDB сохраняет данные в форме объектов через индексные ключи. Всякая операция, которая происходит в IndexedDB происходит через транзакции. Объекты группированы внутри объектов хранения. IndexedDB содержит объектные хранилища и эти хранилища содержат объекты с уникальными keyPath.

IndexedDB vs LocalStorage

Хотя оба были спроектированы на предоставление клиентской стороне, как хранилища данных, но оба имеют различные цели и должны быть использованы согласно требованиям. LocalStorage хранит данные в key-value парах, но в отличии от IndexedDB, они не могут храниться в форме объектов. Вместо этого, они хранятся только в виде строковых key-value парах. Простой трюк хранения объектов с использованием LocalStorage — это использование объекта JSON.parse(). Но это не лучшее решение для хранения большого объема данных и сложных объектов. Тем не менее, LocalStorage был спроектирован для хранения мелких данных и предоставляет синхронный API доступа к ним. IndexedDB — это отличное решение для манипуляции больших объемов данных и предоставляет асинхронный API. Он использует индексацию на хранение данных и транзакции на выполнение операций. Он даже поддерживает простые типы данных. IndexedDB может казаться лучше, чем LocalStorage, но его API сложен для использования и на данный момент только последние версии современных браузеров поддерживают его. Для базового простого хранения можно продолжать использовать LocalStorage, но если вы хотите хранить большой объем данных, то IndexedDB — лучшее решение для этого, который, помимо всего позволяет вам выполнять комплексные сложные запросы на поиск данных.

IndexedDB vs Web SQL

WebSQL был также WEB — хранилищем с собственным API для хранения хранения данных на клиентской стороне. В отличии от IndexedDB, который является NoSQL базой данных, WebSQL использует SQL — запросы для операций с данными. W3C больше не поддерживает эту спецификацию, согласно http://www.w3.org/TR/webdatabase/

Предостережение. Эта спецификация больше не активна в поддержке и Web Applications Working Group не включила его в будущее развитие.

С этого момента, оно не поддерживается и его нельзя использовать в своих проектах.

IndexedDB vs Cookies

Cookies(печенки) — это может звучать вкусно, но это не так. Cookies могут отправлять и получать с каждым запросом http запросом данные в результируя в дополнительном трафике. Для примера, если у вас 10 кБ куков каждый и делаете 10 запросов, то сможете передать 100 кБ данных. Также, данные в куках имеют только строковый тип и следовательно их из строки необходимо парсировать. Также, область хранения куков лимитирован и многие пользователи могут блокировать поддержку куков в своих браузерах. Следовательно Cookies(куки) можно использовать для хранения очень мелких и не критичных данных.

Использование IndexedDB

1. Открытие БД IndexedDB.

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

window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
 
if(!window.indexedDB)
{
    console.log("Your Browser does not support IndexedDB");
}

Раз мы знаем, что IndexedDb поддерживается, то мы можем открыть базу данных. Вы не можете поросто открыть базу данных, скорее IndexedDb потребует от вас запроса на окрытие базы данных.

var request = window.indexedDB.open("testDB", 2);

Здесь первый параметр — это имя базы данных, а второй — версия базы данных. Версия БД позволит вам представить схему текущей вашей БД в тех или иных режимах,т.е. предатсавит хранилища объектов, сохраненные в них и их структуры. Если вы обновите вашу БД до новой версии, то придется создать/удалить несколько объектов в хранилище, чем создать/удалить все объекты в хранилище.
Когда вы захотите увеличить версиб БД, то происходит событие onupgradeneeded. Вместе с onupgradeneeded имеются также события success, error и blocked, которые информируют об результатах запроса.

var db;
request.onerror = function(event){
    console.log("Error opening DB", event);
}
request.onupgradeneeded   = function(event){
    console.log("Upgrading");
    db = event.target.result;
    var objectStore = db.createObjectStore("students", { keyPath : "rollNo" });
};
request.onsuccess  = function(event){
    console.log("Success opening DB");
    db = event.target.result;
}

Событие onupgradeneeded должно вызываться каждый раз, когда WEB — страница выпадает в первые секунды открытия на пользовательских браузерах или, если, версии их БД были обновлены. Следовательно, вы можете создавать объекты хранения только при событии onupgradeneeded. Если не имеются обновления в версия и страница открыта предварительно, то вы можете получить событие onsuccess. onerror — событие происходит когда в процессе были допущены какие-либо ошибки. onblocked — происходит, когда предыдущее соединение не было закрыто. Выше в коде мы создаем объект хранения под именем «student» с индексным ключом “roll no”.

 

2. Добавление объекта в ObjectStore

Чтобы добавить данные в базу данных IndexedDB, мы , впервую очередь, должны создать транзакцию с правами чтения и записи на нашем объекте хранения. Выполнять то или иное действие на объете хранения требует создания транзакции. Следующий код показывает доступ к нашему объекту хранения и добавление в него данных.

var transaction = db.transaction(["students"],"readwrite");
transaction.oncomplete = function(event) {
    console.log("Success");
};

transaction.onerror = function(event) {
    console.log("Error");
};  
var objectStore = transaction.objectStore("students");

objectStore.add({rollNo: rollNo, name: name});

3. Удаление данных из ObjectStore

Удаление аналогично добавление. Для этого вам необходимо создать транзакцию и вызвать функцию удаления с ключом, удаляемого объекта

db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);

4. Доступ к объекту данных через ключ ObjectStore

Необходимо использовать get() функцию для получения данных объекта через ключ

var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);
request.onsuccess = function(event){
    console.log("Name : "+request.result.name);    
};

5. Обновление(редактирование данных) объекта

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

var transaction = db.transaction(["students"],"readwrite");
var objectStore = transaction.objectStore("students");
var request = objectStore.get(rollNo);
request.onsuccess = function(event){
    console.log("Updating : "+request.result.name + " to " + name);
    request.result.name = name;
    objectStore.put(request.result);
};