...

суббота, 6 декабря 2014 г.

[Перевод] Пересмотренное руководство по Grunt для начинающих

Еще в марте 2013 года я написал статью руководство по Grunt для начинающих и она стала самой посещаемой статьей на моем сайте. Я написал ее в то время, когда сам только начинал своё знакомство с Grunt, и это было скорее руководство для себя, чем для кого-то ещё. Теперь, спустя 18 месяцев, я почувствовал, что пришло время пересмотреть как я использую Grunt потому что сейчас я знаю гораздо больше, чем в то время.

Если вам не терпится просто увидеть код, то весь он есть на Github.



Установка Node и Grunt для всех пользователей




В первую очередь вы должны убедиться, что у вас установлены Node и Grunt CLI (command line interface).

  • На сайте Node.js есть установщики для различных операционных систем. Всю информацию можно найти здесь.

  • После установки Node.js просто выполните следующую команду в вашем терминале (я использую iTerm2) для установки grunt-cli

    npm install -g grunt-cli







Создание каталога проекта




Наш проект потребует несколько каталогов. Их структура представлена ниже:

grunt/
src/
src/images/
src/scripts/
src/styles/




Создание gruntfile




Прежде всего, я больше не использую scaffolding инструменты (такие как grunt init или Yeoman). Я настроил все с нуля. Это означает, что у меня гораздо больше понимания что происходит в данный момент. Это совсем не сложно как только вы сделали это несколько раз.

В корне проекта создаем файл с названием Gruntfile.js

В этот файл добавьте следующий код:



module.exports = function(grunt) {

require('time-grunt')(grunt);

require('load-grunt-config')(grunt, {
jitGrunt: true
});
};


Хотите верьте, хотите нет, это всё что касается нашего Gruntfile.


time-grunt говорит вам, сколько времени заняли каждая задача и общая сборка, а jitGrunt: true говорит load-grunt-config использовать более быстрый загрузчик задач jit-grunt (это необязательно, но скорость это хорошо, правда?).


Создание файла пакета




Давайте двигаться дальше и создадим наш наш базовый файл package.json. Этот файл будет содержать в ближайшее время зависимости нашего проекта. Добавьте следующее (очевидно, измените упоминания «my-project» на настоящее имя вашего проекта).

{
"name": "my-project",
"version": "0.0.1",
"description": "My project"
}




Добавление зависимостей




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

npm install grunt --save-dev
npm install time-grunt --save
npm install load-grunt-config --save-dev
npm install grunt-concurrent --save-dev
npm install grunt-contrib-clean --save-dev
npm install grunt-contrib-imagemin --save-dev
npm install grunt-sass --save-dev
npm install grunt-contrib-uglify --save-dev




Если вы посмотрите в package.json, то должны увидеть что-то вроде этого:

{
"name": "my-project",
"version": "0.0.1",
"description": "My project",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-concurrent": "^1.0.0",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-imagemin": "^0.8.1",
"grunt-contrib-uglify": "^0.6.0",
"grunt-sass": "^0.16.1",
"load-grunt-config": "^0.13.1"
},
"dependencies": {
"time-grunt": "^1.0.0"
}
}




Вот список того, о чем мы только что установили:

grunt: сам планировщик задач.

time-grunt: необязательное, но приятное дополнение — он говорит вам сколько времени заняли каждая задача и общая сборка.

load-grunt-config: позволяет сохранить наш главный gruntfile коротким и лаконичным. Более подробно об этом чуть ниже.

grunt-concurrent: выполнять задачи одновременно. Из коробки Grunt выполняет задачи одну за другой, что может занять некоторое время в зависимости от объема и типа задач, которые необходимо выполнить. Однако часто возникают задачи, которые не зависят от других задач, и могут выполняться одновременно.

grunt-contrib-clean: все очень просто, эта задача удаляет мусор — используйте с осторожностью!

grunt-contrib-imagemin: незаменим, т.к. для всех ваших изображений необходима оптимизация.

grunt-sass: компилирует ваши в SASS/SCSS файлы в CSS. Обратите внимание: этот модуль использует более быстрый, но экспериментальный libsass компилятор. Если вы испытываете проблемы, то, вероятно, должны использовать стабильный, но более медленный grunt-contrib-sass.

grunt-contrib-uglify: делает ваш javascript прекрасным и безобразным.

Настройка задач




Один из лучших модулей которые я представил это load-grunt-config. Он позволяет нам поместить конфиг для каждой из наших задач в отдельный файл. Это гораздо удобнее, чем хранить все настройки в одном большом Gruntfile.

Создайте следующие файлы в директории grunt:

grunt/aliases.yaml
grunt/concurrent.js
grunt/clean.js
grunt/imagemin.js
grunt/jshint.js
grunt/sass.js
grunt/uglify.js
grunt/watch.js




Обратите внимание: имена этих файлов должны соответствовать именам задач.

Скопируйте и вставьте конфиг для каждой задачи ниже в соответствующий файл.


ALIASES.YAML


default:
description: 'Default (production) build'
tasks:
- prod
dev:
description: 'Development build'
tasks:
- 'concurrent:devFirst'
- 'concurrent:devSecond'
img:
description: 'Image tasks'
tasks:
- 'concurrent:imgFirst'
devimg:
description: 'Development build and image tasks'
tasks:
- dev
- img
prod:
description: 'Production build'
tasks:
- 'concurrent:prodFirst'
- 'concurrent:prodSecond'
- img




Здесь мы определяем различные псевдонимы для наших задач:

default — выполняет задачи prod при запуске grunt в командной строке.

dev — выполняет задачи разработки (но не задачи изображений).

img — выполняет задачи изображений.

devimg — выполняет задачи разработки и изображений.

prod — выполняет задачи производства и изображений.

Кликните сюда для получения дополнительных сведений о настройке псевдонимов для задач при помощи load-grunt-config.
CONCURRENT.JS


module.exports = {

// Опции
options: {
limit: 3
},

// Задачи разработки
devFirst: [
'clean',
'jshint'
],
devSecond: [
'sass:dev',
'uglify'
],

// Производственные задачи
prodFirst: [
'clean',
'jshint'
],
prodSecond: [
'sass:prod',
'uglify'
],

// Задачи изображений
imgFirst: [
'imagemin'
]
};




Для примера возьмем задачи разработки. Вы можете видеть, что они настроены для запуска сначала clean, а затем одновременно sass:dev и uglify для восстановления css и javascript.

Кликните сюда для получения дополнительных сведений о настройке grunt-concurrent.
CLEAN.JS


module.exports = {
all: [
"dist/"
]
};




Настроить grunt-contrib-clean довольно просто. Здесь я просто удалил все содержимое каталога /dist. используйте эту задачу с осторожностью — она удалит без разбора все, что вы скажите без каких-либо предупреждений. Поэтому убедитесь, что вы настроили ее правильно.

Кликните сюда для получения дополнительных сведений о настройке grunt-contrib-clean.
IMAGEMIN.JS


module.exports = {
all: {
files: [{
expand: true,
cwd: 'src/',
src: ['images/*.{png,jpg,gif}'],
dest: 'dist/'
}]
}
};




Конфиг выше просто оптимизирует все изображения в src/images/ и сохраняет их в dist/images/.

Кликните сюда для получения дополнительных сведений о настройке grunt-contrib-imagemin.
SASS.JS


module.exports = {
// Development settings
dev: {
options: {
outputStyle: 'nested',
sourceMap: true
},
files: [{
expand: true,
cwd: 'src/styles',
src: ['*.scss'],
dest: 'dist/styles',
ext: '.css'
}]
},
// Production settings
prod: {
options: {
outputStyle: 'compressed',
sourceMap: false
},
files: [{
expand: true,
cwd: 'src/styles',
src: ['*.scss'],
dest: 'dist/styles',
ext: '.css'
}]
}
};




Я разделил задачи sass на процессы разработки и продакшена. Конфиг очень похож, но для целей разработки я установил стиль вывода "nested" и включил карту кода.

Кликните сюда для получения дополнительных сведений о настройке grunt-sass.
JSHINT.JS


module.exports = {

options: {
reporter: require('jshint-stylish')
},

main: [
'src/scripts/*.js'
]
};




JShint проверяет ваш jsvascript и гарантирует что с ним все тип-топ.

Кликните сюда для получения дополнительных сведений о настройке grunt-contrib-jshint.
UGLIFY.JS


module.exports = {
all: {
files: [{
expand: true,
cwd: 'src/scripts',
src: '**/*.js',
dest: 'dist/scripts',
ext: '.min.js'
}]
}
};




Uglify просто берет ваши Javascript файлы и минифицирует их.

Кликните сюда для получения дополнительных сведений о настройке grunt-contrib-uglify.
WATCH.JS


module.exports = {

options: {
spawn: false,
livereload: true
},

scripts: {
files: [
'src/scripts/*.js'
],
tasks: [
'jshint',
'uglify'
]
},

styles: {
files: [
'src/styles/*.scss'
],
tasks: [
'sass:dev'
]
},
};




Watch запускает указанные задачи всякий раз, когда файлы за которыми он следит каким-либо образом изменяются — добавляются, удаляются, редактируются.

Note: The easiest way to get Livereload working is to install the browser extension.


Click here for more information on configuring grunt-contrib-watch and Livereload.


Запуск задач




Если вы закончили настройку вашего проекта, как описано выше, то теперь вы можете запустить задачи. Как обсуждалось ранее существуют различные псевдонимы задач, которые вы можете запускать. Теперь просто введите grunt в командной строке в корне вашего проекта.

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



Я люблю маленькие сводки, которые предоставляет grunt-time. Я вижу, как много времени заняло выполнение, каждого из наборов задач. Плюс сколько времени занял весь процесс сборки.

В зависимости от ваших потребностей вы также могли бы выполнить grunt dev, grunt devimg, или grunt img.


Вы можете также запустить grunt watch, если хотите чтобы grunt следил за изменениями ваших .sass и .js и автоматически запускал sass или jshint и uglify.


Резюме




На самом деле это все. Если вы поэкспериментируете с тем что представлено выше вы скоро обретете уверенность, начнете добавлять задачи и модифицировать рабочий процесс в лучшую сторону в соответствии с вашими требованиями.

Еще раз, код, прилагаемый к этой статье можно найти на Github.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Хакер нашел способ читать файлы на серверах Facebook

image

Bug Bounty программы приносят плоды различным фирмам, в том числе и крупнейшим. Чаще всего, хакеры находят достаточно простые в эксплуатации уязвимости вроде XSS и CSRF, но бывают и интересные, которые встречаются достаточно редко. Одним из таковых, является недавний пример чтения файлов на серверах Facebook, найденный Йосипом Франковичем (Josip Franjković).


Слабым местом фейсбука оказалась форма загрузки файлов, расположенная на странице загрузки резюме. Попытавшись загрузить файлы с потенциально опасными расширениями вроде .php, а также файлы с именами наподобие "/etc/passwd" и «file:///etc/passwd», Йосип, получал лишь путь к этим файлам, а также их содержимое, после преобразования в Base64.


Продолжая загружать различные файлы, он заметил, что загруженный архив с расширением .zip распаковывается и в ответ выдается все тот же контент в Base64 и путь к распакованным файлам. После этого, Йосип создал на своем компьютере симлинк на файл "/etc/passwd" (ln -s /etc/passwd link), упаковал его в ZIP (zip --symlinks test.zip link) и попробовал загрузить на сервер в качестве резюме. В ответе от сервера было содержимое файла "/etc/passwd", находящегося на сервере Facebook. Таким способом, он мог прочитать любой файл на сервере.


Содержимое файла "/etc/passwd" на сервере

image


На устранение уязвимости, фейсбуку потребовалось менее 12 часов. Вознаграждением для Франковича, по программе поощрения «белых» хакеров, стала выплата в размере $5500.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Перевод] Краткая история веб-дизайна

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

В наше время наблюдается стремительный рост доли мобильного трафика. Кроме того, время, потраченное пользователем в Интернете со смартфона или другого мобильного гаджета в среднем значительно больше времени, проведенного человеком за стационарным компьютером. Этот факт не может не повлиять на вектор дальнейшего развития веб-дизайна.


Метаморфозы происходят не только с железками и технологиями, но и с нашим мозгом. Широко обсуждается развитие «клипового мышления», как ответа на возросшее количество информации. Проводится множество практических исследований поведения людей и их мышления при взаимодействии с веб-дизайном. Подробно об этом в своем блоге пишет доктор психологических наук Сьюзан Уэйншенк.



Когда мы запускали наш проект об электронных платежных системах Web-payment.ru, нам казалось, что мы создали достаточно удобный, аккуратный и чистый дизайн, который не отвлекает от чтения статей и другой полезной информации. Однако уже сейчас мы понимаем, что этого недостаточно и нужно учесть еще множество нюансов, чтобы даже сложный материал было интересно читать. В этом направлении мы и будем двигаться дальше.


Свой интерес к превращению моих дизайнов в код я потерял в тот самый момент, когда осознал сколько всего нужно сделать чтобы идея претворилась в жизнь. Простые на первый взгляд задачи имеют так много способов решения, однако заработать они могут не во всех браузерах. Мне всегда было интересно: почему между дизайном и кодом есть разделение? Почему мы сначала упрощаем сложное, разбивая его на более простые вещи, а потом снова усложняем их? Вместо того, чтобы спорить о том, следует ли дизайнерам учиться писать код или нужно ли разработчикам учиться дизайну, я предлагаю вместе нарисовать единую картину того, как веб-дизайн эволюционировал и как мы можем устранить разрыв между кодом и дизайном.


Тёмный век веб-дизайна (1989)






Cамо начало веб-дизайна можно назвать тёмными временами, ведь экраны были в прямом смысле черными, вмещая в себя всего лишь небольшое количество одноцветных пикселей. Дизайн тогда создавался при помощи символов и табуляции, поэтому мы переместимся вперед, в то время, когда графические пользовательские интерфейсы были главным инструментом веб-серфинга. Те времена табличной верстки можно назвать Диким Западом веба.

Таблицы — начало (1995)






Появление на свет браузеров, способных показывать изображения, было первым шагом в веб-дизайн — такой, каким мы его знаем сегодня. Самым доступным способом структурирования информации была концепция использования таблиц, которые на тот момент стали доступны в HTML. Поэтому помещение таблиц внутрь других таблиц и смешивание статических ячеек с ячейками относительных размеров началось с книги Дэвида Сигела "Creating Killer Sites". Применение таблиц в таких целях казалось не совсем правильным, поскольку их основным предназначением является структурирование информации. И тем не менее, этот метод создания веб-дизайна был самым распространенным в течение длительного времени. Была тогда и другая проблема — сохранение работоспособности этих хрупких структур. В то же время популярность приобрело «разрезание макетов» на отдельные элементы. Дизайнеры рисовали красивые макеты, а разделением их на части поменьше и склеиванием их так, чтобы дизайн работал как надо, занимались разработчики. С другой стороны, таблицы обладали такими шикарными особенностями, как возможность выравнивать содержимое по вертикали, определять его размеры в пикселях и в процентах. Главным преимуществом таблиц было то, что они позволяли максимально близко воссоздать структуру сетки. Тогда же разработчики поняли, что перестали любить внешние интерфейсы и их разработку.

Javascript приходит на помощь (1995)






Ответом на ограничения HTML был Javascript. Хотите вывести всплывающее окно? Или вам нужно настроить динамическое изменение расположения элементов? Ответ один — Javascript. Однако главная проблема заключалась в том, что Javascript ложился поверх материала, из которого состоит веб и, соответственно, должен был загружаться отдельно. Нередко ленивые разработчики использовали его для создания быстрой заплатки для кода, однако в умелых руках он способен превратиться в очень мощный инструмент. В наши дни мы предпочитаем избегать использования Javascript, если тот же самый элемент может быть реализован с помощью CCS, но даже несмотря на это, JavaScript сегодня не теряет своей актуальности как в разработке интерфейсов (jQuery), так и в программировании серверной части (Node.js).

Золотая эпоха свободы – Flash (1996)






Появившаяся в 1996 году технология обещала невиданную ранее свободу и ставила своей целью разрушить барьеры, которые сдерживали развитие веб-дизайна в то время. Дизайнер мог работать с любыми формами, размерами макетов, анимациями, взаимодействиями и использовать любой шрифт и все это при помощи одного инструмента — технологии Flash. Конечный результат работы упаковывался в один файл, а после этого отправлялся в браузер для отображения. Все это работало при условии, что у пользователя стояла последняя версия flash plugin и было немного свободного времени для того, чтобы подождать, пока содержимое загрузиться. Выглядело это волшебно. То время было золотой эпохой ярких страниц приветствия, вводных анимаций и всякого рода интерактивных эффектов. К сожалению, технологии явно не хватало открытости, дружественности к поиску, а потребление ресурсов Flash было по-настоящему большим. Когда Apple решили избавиться от него в своем первом iPhone (2007), технология начала угасать, во всяком случае с точки зрения перспектив в веб-дизайне.

CSS (1998)






Примерно в то же время, что и Flash, появился другой, лучший с технической точки зрения способ структурирования дизайна — Cascading Style Sheets (CSS). Его базовая концепция заключалась в разделении функций контейнера содержимого и функций его представления, таким образом, что сам контент помещался в HTML, а его визуальное форматирование происходило при помощи CSS. Первые версии технологии были далеки от гибкости, однако самой большой проблемой была медленная скорость адаптации браузеров к ней. Для введения полной браузерной поддержки CSS потребовалось несколько лет и нередко его использование сопровождалось немалым количеством багов. Одновременно с этим нередко получалось так, что самые новые CSS-свойства поддерживались только в одном браузере, в то время, как в других этой поддержки не было. Для разработчиков это стало настоящим кошмаром. Здесь также важно пояснить, что CSS не является языком написания кода, скорее — языком объявления свойств объектов и, если вопрос о том, надо ли дизайнерам учиться писать код остается открытым, то ответ на вопрос «Следует ли им понимать, как работает CSS?» совершенно точно будет положительным.

Подъем мобильного контента — сетки и фреймворки (2007)






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

После нескольких итераций победу одержала сетка в 960 px, а разделение на 12 столбцов стало использоваться дизайнерами преимущественно. Следующим шагом была стандартизация широко распространенных элементов, таких как формы, меню навигации, кнопки, а также создание возможности их быстрого и простого использования или, попросту говоря — создание библиотеки визуальных элементов, которая содержит в себе весь необходимый код. Победителями здесь стали Bootstrap и Foundation, что также говорит о том факте, что грань между веб-сайтом и приложением стала стираться. Недостатком подхода стало то, что новые дизайны стали чаще выглядеть одинаково. Сами же дизайнеры при этом по-прежнему не могли получить доступ к их изменению без понимания того, как работает код.


Адаптивный веб-дизайн (2010)






Умный парень по имени Итан Мэркот решил бросить вызов существующему подходу, предложив отображать одинаковое содержимое, используя при этом разные формы макетов для его представления, назвав это термином «Responsive web design» (адаптивный веб-дизайн). Формально, мы все еще продолжаем использовать HTML и CSS, поэтому речь здесь идет больше о концептуальном улучшении.

Относительно этого подхода существует немало заблуждений. Для дизайнера «адаптивность» означает создание множества набросков разных макетов, а для клиента это значит, что все будет работать на телефоне. Разработчик при этом думает о скорости загрузки страницы, о том, как представить пользователю изображения, о смысловой нагрузке элементов, о приоритете мобильной или десктопной версии и так далее… Главное преимущество такого подхода заключается в сохранении одного и того же контента на разных макетах. На практике это значит, что один и тот же веб-сайт работает везде. Надеюсь, что хотя бы с этим определением согласны все.


Упрощение (2010)






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

Упрощение визуальных элементов, или так называемый «плоский дизайн» также является частью этого процесса. Главное его преимущество в том, что материалам, приоритетности отображаемой информации и содержимому в целом уделяется гораздо больше внимания. Глянцевые кнопки заменяются иконками, это позволяет нам использовать векторные изображения и шрифты-иконки. Веб-шрифты позволяют получить прекрасную типографику. Самое забавное здесь в том, что веб был близок к этой идее с самого начала, но ведь на то она и молодость…

Светлое будущее (2014)






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

Формально, сегодня существует несколько новых идей, которые поддерживают движение в этом направлении. Новые юниты CSS, такие как vh, vw (высота и ширина области просмотра) позволяют получить гораздо большую гибкость при позиционировании элементов. Они также решают проблему, которая удивляла многих дизайнеров: почему центральное выравнивание по вертикали в CSS делается с таким трудом? Еще одна крутая идея, ставшая частью CSS — Flexbox, который позволяет создавать макеты и изменять их при помощи одного свойства, вместо написания кучи кода. Ну и наконец, web components — еще более основательная попытка, которая представляет собой связанный вместе набор элементов, таких, например, как галерея или форма регистрации. Это создает возможность упростить рабочий процесс, так как элементы становятся строительными блоками, которые могут быть использованы много раз, в том числе и самостоятельно.


Ну а каковы ваши мысли по поводу будущего веб-дизайна?


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Дайджест интересных материалов о создании контента, маркетинге и Growth Hacking #4


сегодня в 11:08





717


14






Похожие публикации



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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


CHIP — Arduino-совместимый электронный обучающий конструктор для детей


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



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



Некоторые учебные наборы предназначены для получения элементарного опыта, например, пайки. Другие — исходно сложны, так что ребенок теряет интерес к наобору из-за его излишней сложности. Chip можно использовать как для обучения элементарным приемам работы с электроникой, так и для изучения более сложных приемов.



CHIP поставляется с набором различных цветных светодиодов, так что ребенок может персонализировать своего «Чипа». Кроме того, в наборе поставляется миниатюрная плата «Pixel Power», совместимая с некоторыми другими элементами. Плату можно использовать в самых разных проектах.



Что входит в комплект?



  • Печатная плата CHIP (фигурка героя и есть плата);

  • Плата Pixel Power;

  • 2 кнопки;

  • Боковой переключатель;

  • Разъемы типа «папа» и «мама»;

  • Резисторы на 220 Ом;

  • Разъем для батарейки;

  • По два светодиода синего, красного, желтого и зеленого цветов (длина — 10мм);

  • Батарейка на 3 Вольта.


Время программировать


Когда Chip вставляется в Arduino (само собой, эту плату также нужно приобрести перед использованием), ребенок может настроить управление «глазами» Чипа, задавая команды программным путем. Можно обойтись и без Arduino, используя плату, которая поставляется в комплекте. После пайки схему можно подключить к ПК для дальнейшей работы.


Для обучения ребенка программированию разработчики предлагают воспользоваться проектом Hour of Code.



Сами разработчики рекомендуют еще и плату SALDUINO UNO R3.



Сколько это стоит


Проект собирал средства на Kickstarter (причем запрашивалось всего 2,5 тысячи долларов), и вся сумма уже собрана. Цена же комплекта с одним ЧИП-ом составляет 10 долларов. За 25 можно купить уже 3 таких набора.


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


Выводы


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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Перевод] Выразительный JavaScript: HTTP

Путь разработчика: истории о моих фееричных провалах, часть 2

Всем привет, с вами снова Delfuego FM, и я наконец-таки созрел, чтобы выложить вторую часть статьи! Вследствие неоднозначной реакции на первую часть, была предпринята попытка выложить вторую на geek times, и… она успешно провалилась. Поэтому придётся совершить небольшой хабрасуицид и выложить её прямо тут! Итак, поехали!..

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


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






Спустя более полугода после судьбоносного знакомства на Невском проспекте, меня пригласили в Москву на позицию геймдизайнера.


Пока мы ехали с другом с Ленинградского вокзала, Москва встречала меня песней “Welcome to Paradise city”, игравшей по радио. Тогда мне казалось, что я действительно в Парадизе: наконец-таки произошёл переломный момент в жизни, дом остался позади, я приглашён на работу мечты в город мечты, всё как никогда замечательно, и с каждым днём будет становиться всё лучше.


Это действительно могло быть так, но…



Любой грамотный специалист увидел бы в предложенном мне тестовом задании только одну фразу: «Беги, беги отсюда и не оборачивайся!» — дело в том, что в тестовом задании мне надо было прокомментировать разрозненную канитель игровых идей в стиле «ограбления корованов в стиле линейки, на крыльях как в Айон, и со зрением как у Терминатора».


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


Разработка документации игры шла в древнем боевом стиле «лебедь, щука и рак» — ключевые детали игры менялись каждую неделю несколько раз. Лица, принимавшего решения не было, а моя должность не предполагала подобной власти. Затем, когда дизайн-документ игры был готов, вылезли проблемы с подбором персонала – не знаю точно, в чём была причина, но если им на собеседовании показывали тот же поток сознания, что и мне, в этом нет ничего удивительного.


Спустя пару месяцев я отправился обратно в Питер, в командировку на конференцию мобильных разработчиков. Случайным образом эта конференция совпала по времени с похоронами одноклассницы, погибшей в автокатастрофе. Земля ей пухом. Она была самой красивой в классе.



После конференции у начальства выкристаллизовалась мысль «надо всё упрощать и побыстрее выпустить более простую игру». Эта была здравая мысль, но в качестве более простой игры начальство по какой-то злой иронии судьбы выдумало раннер, в котором автомобилем надо было создавать ДТП, давить пешеходов и творить прочий беспредел на дороге. Почему-то мне сразу стало понятно, что из этого ничего путёвого не выйдет.


Тянулись дни, а строк кода, как и игрового арта, не прибавлялось. Именно в этот момент мне в руки впервые попала Unity, и если бы мой разум не был затуманен заблуждением, что программировать в Unity тяжело, я мог бы поковырять этот движок и выяснить, что делать на нём игры элементарно просто – спустя 2 года, когда я наконец-таки освоился в Unity, за 1 вечер я сделал то, что тогда в Москве не могли сделать в течении 3х месяцев.


Спустя 5 месяцев в Москве меня уволили за «низкий КПД» — при отсутствующих задачах, менеджменте, коде и игровом контенте.

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


Я сразу же попробовал найти себе место в геймдеве, и нашёл только пару команд энтузиастов, которые предлагали делать игру за процент. И знаете что я хочу сказать? Никогда не связывайтесь с энтузиастами, не доказавшими, что они действительно могут на энтузиазме создавать хорошие игры. А лучше не связывайтесь вообще ни с какими.


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

Но это было после, а тогда я решил, что освоился в разработке на энтузиазме, что в организации процесса нет ничего сверхъестественного и я могу взять её на себя, и тогда у меня всё получится.



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


Тогда меня наконец-таки озарила мысль: надо всё брать в свои руки. И код, и графику. Делать всё самому, чтобы не зависеть от псевдоэнтузиастов, а что не получается – заказывать за деньги.


Эта идея, пожалуй, самая правильная из всех, которые меня когда-либо посещали.


Правда, по незнанию я решил, что перед началом разработки надо серьёзно прокачаться в программировании и «архитектуре игр», и это задержало разработку на ещё 7 месяцев (вот ведь балда!).


За время, пока подготавливался к программированию в Unity, я успел сделать ещё несколько ошибок, в том числе два эпик фейла при создании одного сайта (комбо фейл!)



Эпик фейл комбо началось с того, что меня попросили помочь в создании интернет-магазина. Дизайн я решил взять на себя и записался на соответствующие курсы. Организаторы курсов занимались также и созданием интернет-проектов, и я решил, что они как раз те люди, с которыми надо делать сайт. Проект получался довольно большой, и его разработку решили разделить на 4 этапа, и на каждый этап сделать по отдельному договору. Никогда так не делайте. Никогда.


1 этап был самый простой и заключался в небольших правках wordpress шаблона. Но, так как весь проект был объёмный, я не увидел ничего зазорного в том, чтобы за 5% работ было заплачено 40% бюджета – я считал, что эта сумма будет предоплатой за все 100%. Да и то, что я ходил к этим ребятам на курсы располагало к обоюдной лояльности.


А по факту вышло, что после 1 этапа разработчики потеряли к проекту интерес и отказались делать остальные этапы, которых не было в первом договоре.


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



После отказа выполнять остальные этапы я спешно нашёл других исполнителей, находящихся в Москве. Предыдущий фейл меня совсем ничему не научил – из-за спешки я оформил отношения между двумя юрлицами стыдно признаться как (практически никак). Но, студия выглядела прилично, и отзывы на fl были хорошие, сумма первого этапа была незначительная, а заказчик нервничал, когда же у него появится сайт, и я решил не затягивать начало разработки. Договор вместе с полным т/з оформили уже после перевода денег, но его подписанную версию со стороны исполнителя мы так и не увидели.


В результате после срыва дедлайна на 2 недели нам предоставили нечто донельзя забагованное, практически не соответствующее т/з и выполненное на не обговорённой cms-ке. Ещё спустя месяц попыток получить деньги назад стало ясно, что нас тупо кинули. Хоть сумма была незначительная, времени на эту недостудию мы угробили немало. У этих Остапов Бендеров на фрилансе в лого синяя лента-стрелка, идущая из правого нижнего угла в верхний левый, так что будьте осторожны.



Но вернёмся к разработке игр. Когда эпопея с неразработкой сайта закончилась, выяснилось, что для создания игры на Unity практически не надо знать javascript – достаточно пройти его основной курс на codecademy, и затем уже разбираться как работает Unity на практическом опыте. По моему опыту знания JS составляют 5% в разработке игры, остальное – усидчивость во время поисков путей решения задачи на unity answers и в документации, и во время экспериментов с кодом.


Эпилог

Мы всегда ищем врагов, препятствия и причины неудач где-то вовне, а на самом деле всё это всегда находится внутри. В моём случае я боялся приступить к разработке игр хоть как-нибудь, затем я боялся организовывать разработку, а затем делать её своими силами, считая что это слишком сложно и т.п. А на самом деле главное препятствие находилось внутри меня. Этот поиск врагов вовне, а не внутри, издревле вредит человечеству. Об этом просто не принято говорить, нас учат совершенно обратному. Так, сейчас я наблюдаю за омоновцем, который вместе со своим батальоном пропахал всю Чечню, и который не может самостоятельно победить внутренних демонов пристрастия к алкоголю. Его учили побеждать внешнего врага, а не внутреннего. И таких примеров по всему миру миллионы.


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



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


И спасибо за внимание!


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


пятница, 5 декабря 2014 г.

[Из песочницы] Задачи тысячелетия. Просто о сложном

image

Привет, хабралюди!

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


После доказательства гипотезы (теперь уже теоремы) Пуанкаре Григорием Перельманом, основным вопросом, который заинтересовал многих, был: «А что же он собственно доказал, объясните на пальцах?» Пользуясь возможностью, попробую объяснить на пальцах и остальные задачи тысячелетия, или по крайней мере подойти в ним с другой более близкой к реальности стороны.



Равенство классов P и NP




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

Также существуют NP-задачи, найденное решение которых можно быстро проверить по определенному алгоритму. Для примера тот же перебор компьютером. Рассмотрим вышеприведенный пример с решением квадратного уравнения — решение есть и проверить его можно также быстро. Из этого напрашивается логичный вывод: NP-класс включает в себя P-класс. А вот в строгости этого включения и состоит вся проблема.


Другими словами неизвестно существует ли для всех NP-задач такой алгоритм, который позволял бы решать такие задачи точно так же как и проверять за достаточно быстрое (полиномиальное время) время? Для каких-то существует, а для каких-то его так и не нашли. Над решением этого вопроса бьются уже более 40 лет.


На просторах интернета также встретил такую интересную и прозрачную формулировку:



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





В данном случае задача состоит в том, а есть ли такой алгоритм действий, благодаря которому даже не имея информации о том, где находится человек, найти его так же быстро, как будто зная где он находится.

Гипотеза Ходжа




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

Гипотеза Римана




Всем нам еще со школы известны простые числа которые делятся только на себя и на единицу (2,3,5,7,11...). С давних времен люди пытаются найти формулу, которая объясняла бы их распределение. За невозможностью найти такой, ученые применили свои усилия к функции распределения простых чисел, которая показывает количество простых чисел меньше или равных определенного числа. Например для 4 — 2 простых числа, для 10 — уже 4 числа. Гипотеза Римана как раз устанавливает свойства данной функции распределения.

Теория Янга — Миллса




Уравнения квантовой физики описывают мир элементарных частиц. Физики Янг и Миллс, обнаружив связь между геометрией и физикой элементарных частиц, написали свои уравнения. Из уравнений Янга — Миллса следовало существование частиц, которые действительно наблюдались в лабораториях во всем мире, однако доказать их справедливость пока никто не смог.

Существование и гладкость решений уравнений Навье — Стокса




Бросим камень в реку, от него пойдут волны, турбулентность. Эти, а также множество других подобных явлений описываются уравнениями, известными как уравнения Навье — Стокса. Для простых частных случаев уже найдены решения, в которых как правило части уравнений отбрасываются как не влияющие на конечный результат, но в общем виде решения этих уравнений неизвестны, и при этом даже неизвестно, как их решать.

Гипотеза Бёрча — Свиннертон-Дайера




Данная гипотеза связана с описанием некоторых алгебраических уравнений — так называемых эллиптических кривых. Примером подобного уравнения является выражение x2 + y2 = z2. Эвклид дал полное описание решений этого уравнения, но для более сложных уравнений поиск решений становится чрезвычайно трудным. Данная гипотеза является единственным относительно простым общим способом вычисления ранга, одного из важнейших свойств эллиптических кривых.

Если вспомнить про знаменитую теорему Ферма, то в ее доказательстве эллиптические кривые заняли одно из важнейших мест.


Гипотеза Пуанкаре




Думаю если не все, то большинство точно о ней слышали. Чаще всего встречается расшифровка как «сферу можно стянуть в точку, бублик нельзя». От себя добавлю, что бублик можно легко растянуть в обычную кофейную кружку. Эта формулировка справедлива для гипотезы Тёрстона, которую в действительности доказал Перельман. Частный случай гипотезы Пуанкаре же говорит о том, что любое трехмерное многообразие без края (вселенная, например) подобно трехмерной сфере. А общий случай переводит это утверждение на объекты любой мерности.

Заключение




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

Но на самом деле это не так — математика создавалась как механизм с помощью которого можно описать наш мир, и в частности многие наблюдаемые вещи. Она повсюду, она в каждом доме. Как сказал В.О Ключевский: «Не цветы виноваты, что слепой их не видит».


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


P.S. Это моя первая статья на хабре, в ней я пытался рассказать о «проблемах тысячелетия» более простым, основанным на реальных примерах, языком. Прошу сильно не ругать и не закидывать помидорами если что-то не до конца получилось. Критику и предложения по улучшению жду в комментариях.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Как организовать отправку push-уведомлений на айфон

Мы в Surfingbird используем пуш-уведомления, чтобы сообщать нашим пользователям срочные новости и просто информировать их об интересных материалах за день. Уже в первые недели тестов пуши показали свою огромную эффективность в плане увлечения ретеншена. Этому есть логичное объяснение – телефон у пользователя всегда с собой, в метро, в туалете, на совещаниях и т. д. Когда юзеру приходит пуш, все его внимание концентрируется на этом уведомлении. Однако, когда мы только начали внедрять пуши, то столкнулись с некоторыми трудностями. О трудностях и их преодолении мы и хотим рассказать в этом посте.

image




Начнем с того, что мы изначально не хотели использовать сторонние сервисы, такие как Amazon SNS, Parse, Push IO и т. д. Как бы удобны ни были все эти решения, они лишают вас гибкости и возможности как-то повлиять на процесс.


Немного о том, зачем нам вообще нужны пуш-уведомления. Если в мире происходит какое-то важное событие, мы хотим максимально быстро известить об этом наших пользователей. Не важно, что это за событие: с полок супермаркетов исчез пармезан, курс доллара бьет все рекорды, авария в метро или японцы начали выкладывать в инстаграм котиков в кукольных кроватках из Икеи. Любой подобный инфоповод нужно максимально быстро отработать и доставить в телефон пользователя.


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

Первым нам на глаза попался Net::APNS. Нам очень понравился код милейший аватар с лисичкой. Но код был совершенно непригоден для использования в продакшене. Он открывал соединение перед каждой отправкой сообщения на каждый девайс и, после отправки, закрывал его. Это, во-первых, занимает очень много времени, а во-вторых, может (и будет) воспринято Apple как DoS-атака.


Ну что же, в целом код модуля понятный и поддерживаемый, осталось лишь немного его обогатить. В самом начале мы использовали простой формат уведомлений:


image


Код получился такой:



package Birdy::PushNotification::APNS;

use 5.018;
use Mojo::Base -base;
no if $] >= 5.018, warnings => "experimental";

use Socket;
use Net::SSLeay qw/die_now die_if_ssl_error/;

use JSON::XS;
use Encode qw(encode);

BEGIN {

$Net::SSLeay::trace = 4;
$Net::SSLeay::ssl_version = 10;

Net::SSLeay::load_error_strings();
Net::SSLeay::SSLeay_add_ssl_algorithms();
Net::SSLeay::randomize();
}

sub new {
my ($class, $sandbox) = @_;

my $port = 2195;
my $address = $sandbox
? 'gateway.sandbox.push.apple.com'
: 'gateway.push.apple.com';

my $apns_key = "$ENV{MOJO_HOME}/apns_key.pem";
my $apns_cert = "$ENV{MOJO_HOME}/apns_cert.pem";

my $socket;
socket(
$socket, PF_INET, SOCK_STREAM, getprotobyname('tcp')
) or die "socket: $!";

connect(
$socket, sockaddr_in( $port, inet_aton($address) )
) or die "Connect: $!";

my $ctx = Net::SSLeay::CTX_new() or die_now("Failed to create SSL_CTX $!.");

Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL);
die_if_ssl_error("ssl ctx set options");

Net::SSLeay::CTX_use_RSAPrivateKey_file($ctx, $apns_key, &Net::SSLeay::FILETYPE_PEM);
die_if_ssl_error("private key");

Net::SSLeay::CTX_use_certificate_file($ctx, $apns_cert, &Net::SSLeay::FILETYPE_PEM);
die_if_ssl_error("certificate");

my $ssl = Net::SSLeay::new($ctx);

Net::SSLeay::set_fd($ssl, fileno($socket));
Net::SSLeay::connect($ssl) or die_now("Failed SSL connect ($!)");

my $self = bless {
'ssl' => $ssl,
'ctx' => $ctx,
'socket' => $socket,
}, $class;

return $self;
}

sub close {
my ($self) = @_;

my ($ssl, $ctx, $socket) = @{$self}{qw/ssl ctx socket/}

CORE::shutdown($socket, 1);
Net::SSLeay::free($ssl);
Net::SSLeay::CTX_free($ctx);
close($socket);
}

sub write {
my ($self, $token, $alert, $data_id, $sound) = @_;

Net::SSLeay::write(
$self->{'ssl'},
$self->_pack_payload($token, $alert, $data_id, $sound)
);
}

sub _pack_payload {
my ($self, $token, $alert, $data_id, $sound) = @_;

my $data = {
'aps' => {
'alert' => encode('unicode', $alert),
},
'data_id' => $data_id,
};

# добавляем звук
$data->{'aps'}->{'sound'} = 'default' if $sound;

my $xs = JSON::XS->new->utf8(1);
my $payload =
chr(0)
. pack('n', 32)
. pack('H*', $token);

# кеширование внутри переменной
if (!$self->{'_alert'}) {

# необходимо такое сообщение, чтобы полезная нагрузка не превышала 256 байт
my $json = $xs->encode($data);
my $overload = length($payload) + length(pack 'n', length $json) + length($json) - 256;

if ($overload > 0) {
substr( $data->{'aps'}->{'alert'}, -$overload ) = '';
}

# сохраним чтобы больше не пересчитывать
$self->{'_alert'} = $data->{'aps'}->{'alert'};
}

my $json = $xs->encode($data);
$payload .= pack('n', length $json) . $json;

return $payload;
}




Однако, после первых же тестов стало понятно, что в продакшене лучше не пользоваться простым форматом нотификации. Всё дело в том, что если вы отправляете неверное или неразборчивое уведомление, Apple возвращает ошибку и закрывает соединение.

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

image


Как видно, в описании ошибки указан идентификатор уведомления, вызвавшего эту ошибку. Для того, чтобы у уведомлений были идентификаторы, необходимо использовать расширенный формат уведомлений:


image


Для этого перепишем два метода. В качестве $push_id можно использовать порядковый номер токена:



sub write {
my ($self, $token, $alert, $data_id, $sound, $push_id) = @_;

Net::SSLeay::write(
$self->{'ssl'},
$self->_pack_payload($token, $alert, $data_id, $sound, $push_id)
);
}

sub _pack_payload {
my ($self, $token, $alert, $data_id, $sound, $push_id) = @_;

my $data = {
'aps' => {
'alert' => encode('unicode', $alert),
},
'data_id' => $data_id,
};

# добавляем звук
$data->{'aps'}->{'sound'} = 'default' if $sound;

my $xs = JSON::XS->new->utf8(1);
my $payload =
chr(1)
. pack('N', $push_id)
. pack('N', time + (3600 * 24) )
. pack('n', 32)
. pack('H*', $token);

# кеширование внутри переменной
if (!$self->{'_alert'}) {

# необходимо такое сообщение, чтобы полезная нагрузка не превышала 256 байт
my $json = $xs->encode($data);
my $overload = length($payload) + length(pack 'n', length $json) + length($json) - 256;

if ($overload > 0) {
substr( $data->{'aps'}->{'alert'}, -$overload ) = '';
}

# сохраним чтобы больше не пересчитывать
$self->{'_alert'} = $data->{'aps'}->{'alert'};
}

my $json = $xs->encode($data);
$payload .= pack('n', length $json) . $json;

return $payload;
}




Так гораздо лучше! Теперь можно спокойно отправлять пуши, до тех пор, пока не придёт ответ с ошибкой. После чего, из описания ошибки вытаскиваем идентификатор проблемного уведомления, закрываем старое и открываем новое соединение, продолжаем отправлять уведомления с того места, где произошла ошибка.

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

Но и это ещё не всё. Пользователь может удалить ваше приложение или просто запретить приём пушей. Для того, чтобы не слать уведомления по мёртвым токенам, нужно использовать фидбек сервис. Он возвращает список всех токенов, на которые больше не стоит слать уведомления. Формат фидбека:


image


Как рекомендует Apple, достаточно всего раз в сутки, по крону, подключаться к feedback.push.apple.com:2196 и читать из сокета. Полученные токены нужно просто удалить из базы данных.



sub read_feedback {
my ($self) = @_;

my $result = [];
my $bytes = Net::SSLeay::read( $self->{'ssl'} );

while ($bytes) {
my ($ts, $token);

($ts, $token, $bytes) = unpack 'N n/a a*', $bytes;
$token = unpack 'H*', $token;

push @$result, {
'ts' => $ts,
'token' => $token,
};
}

return $result;
}




К слову, для отправки уведомлений на андроид, достаточно сделать обычный http-запрос, в котором можно передать сразу 1000 токенов. Конечно же, параллельно можно делать несколько запросов. А если и это кажется слишком медленным, можно воспользоваться Cloud Connection Server (XMPP).

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


1;


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Немцы создали библиотеку пьяных аудиозаписей

Эпиграф:

— Пил?

— Не пил!

— Скажи Гибралтар.

— Пил.

Тема немного курьезная, но мне кажется, что именно таких в последнее время не хватает на Хабре. Особенно в пятницу.



Итак, немецкие ученые из двух университетов Мюнхена создали базу аудизаписей, где записа речь 162-х людей в состояние алкогольного опьянения. Данные собирались с 2007 года по 2009 и теперь на основании базы данных создается языковой корпус (статья о корпусах на Вики) Alcohol Language Corpus (ALC).


Корпус предполагается использовать для машинного обучения, чтобы автоматизационные системы (к примеру, в автомобиле) автоматически распознавали состояние хозяина и блокировали управление. Таким образом предполагается бороться с бессовестным человеческим фактором.


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


Стоимость набора записей — порядка $1200 (внушительная сумма за 162 структурированные речи немецких алкоголиков :)

Кстати, вот пример из базы.


Новость закончена, можете ставить минус за краткость.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Azure RemoteApp выходит из бета-тестирования

Привет хабр!

Тем, кто долгое время работает со службами удаленных рабочих столов, название RemoteApp не кажется чем-то новым. Технология RemoteApp пришла к нам в Windows Server 2008 как расширение функционала Remote Desktop Services (а до 2008-го — Terminal Services), позволяя доставлять на рабочие станции непосредственно окно приложения, исполняемое на удаленном сервере, а не весь удаленный рабочий стол.



Технология долгое время развивалась от версии к версии и буквально недавно началось глобальное бета-тестирование Azure RemoteApp — сервиса для доставки приложений напрямую из облака, который так просили пользователи. Microsoft Azure, как гибкая IaaS платформа, без проблем позволяет развернуть полноценную масштабируемую RDS-ферму, но существенно приятнее вместо большого количества виртуальных серверов(которые нужно администрировать, обновлять и поддерживать), получить весь тот же функционал в виде отдельного масштабируемого сервиса.


Сервис выходит из бета-тестирования 11 декабря и будет предоставляться в формате Pay-As-You-Go, а также появится в корпоративных программах с 1 февраля 2015 года.



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




Служба Azure RemoteApp доставляет приложения на основе Windows Server из Azure по протоколу RDP. Пользователи могут получать доступ к своим приложениям в удаленном режиме практически отовсюду, в любое время и с различных устройств. Приложения централизованно размещаются в Azure, но работают так, как если бы они выполнялись на устройствах конечных пользователей.


Среди ключевых преимуществ:



  • Запуск приложений Windows из любого места

  • Быстрое масштабирование в соответствии с изменением потребностей бизнеса

  • Защита конфиденциальных корпоративных приложений

  • Поддержка облачных и гибридных развертываний






Это могут быть как приложения Microsoft Office, так и любые другие приложения, которые можно самостоятельно загрузить и преднастроить в облаке. Богатые возможности построения гибридных сценариев позволяют даже строить сложные распределенные гибридные решения, размещая часть backend-сервисов в локальной инфраструктуре, часть — в IaaS, а сама доставка приложений будет работать на базе Azure RemoteApp.

Подробнее про размещение своих приложений в облаке можно почитать на официальной странице продукта (облачное развертывание и гибридное развертывание), а также посмотреть на Channel 9.


Как это выглядит для пользователей?




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


Для хранения пользовательских данных будет доступно 50Гб облачного хранилища для хранения документов, которое автоматически подключается ко всем сессиям пользователя в качестве внешнего диска. Приложения запускаются на базе Windows Server 2012 R2, а это значит, что используется самая последняя версия протокола RDP и в частности доступен функционал RemoteFX, который позволяет доставлять пользователям медиа-контент и хорошую графику.


Как попробовать и сколько стоит?




В первую очередь нужно оформить пробную подписку Microsoft Azure и добавить себе сервис Azure RemoteApp.

C 11 Декабря сервис перейдет из Preview-режима в режим 30-дневной пробной подписки, с последующим переходом в коммерческую редакцию. На начальном этапе будет доступно две редакции сервиса — Базовая и Стандартная. Базовая редакция создана для размещения стандартных LOB-приложений, а Стандартная предусматривает также возможность использования приложений Microsoft Office (не включает в себя лицензию).



На табличке выше представлена детализация по двум доступным редакциям с текущими вариантами ценообразования. Стоит также отметить, что ценнобразование формируется с ежедневной детализацией и строится на базе Коллекций(App Collection) с минимальным порогом в 20 пользователей. Таким образом, в случае если вы планируете разворачивать сервисы на 10 человек, то ценник будет все равно выставляться за 20.


Более подробно с ценообразованием и часто задаваемыми вопросами можно ознакомиться на официальной странице сервиса.


Полезные ссылки




This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Не беспокойтесь, мы за ними присмотрим. Интеграция Zabbix в личный кабинет клиента

Tantum possumus quantum scimus




Пожалуй каждый согласится — мониторинг является одной из важнейших составляющих ИТ инфраструктуры.

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

image

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

Кому-то по душе Nagios, кто-то выберет Munin, а так же найдутся любители проприетарных или иных решений.


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

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


Под хаброкатом расскажем как у нас это получилось.



Описание.




Немного остановимся на процедуре подключения сервиса.

В первую очередь нужно выбрать вкладку «Мониторинг».

image

Ознакомимся с описанием сервиса и подключим его.

image


«Из коробки» для выбора доступны самые, на наш взгляд, важные из параметров.

image


Кликнем на «Настройки» для установки нужных пороговых значений и параметров уведомлений.

Пороговые значения можно выставить в промежутке от 10% до 90% с шагом в 10%.

Так же имеется возможность настроить варианты уведомлений.

image

image


А что если набор предопределенных метрик не полностью соответствует требованиям к мониторингу?

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

image


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

image


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

А так же отправляет клиенту уведомление по email и создает тикет для дежурных инженеров(если были отмечены соответствующие галочки).

image


Кликнув по ссылке «Прочитано» отключаем цветовую индикацию.

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

image


По каждому из графиков доступен просмотр данных в разрезе нужного промежутка времени.

image

image


Техническая часть.




Для интеграции с нашей админкой мы использовали, найденный на просторах гитхаба, класс.

Критерием выбора была возможность получать картинки графиков (в API такого функционала нет) и простота реализации класса.

Несколько других были написаны так, что было не понятно — это для работы с API или для запуска космического корабля.

Этот класс расчитан для версий Zabbix до 2.2, по этому пришлось его немного доработать. Добавили нужные нам фичи, исправили авторизацию для, используемой нами, 2.4 версии и некоторые параметры в ZabbixAPI вызовах.

Так же изменили скрипт формирования графика в zabbix, чтобы можно было вырезать лишние данные и вставлять свой заголовок.

Обмен данными идет по http/https, API отдает json объект в виде массива.

Графики берутся несколько хитрее — как бы эмулируется браузер, т.е. скрипт через curl авторизируется логин/паролем и с выданой кукой скачивает png-шку с графиком.


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

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


Все запросы к Zabbix скрыты ключами на основе md5 хеширования с солью. Параметры запроса так же хранятся в redis и не доступны пользователю, т.е. не видно конкретные параметры и ссылки на сервер мониторинга.


Скрипт в cron 1 раз в минуту проверяет все активные триггеры и записывает дату и время начала события и дату и время когда проверка показала, что такой триггер больше не активен (логируются только выбранные при подключении сервиса триггеры).


В зависимости от выбранных событий по срабатыванию триггера, юзеру отсылается сообщение о новом активном триггере и о триггерах, которые он еще не отметил как прочитанные в личном кабинете и/или создается тикет с текстом триггера и/или мигает пункт меню «Мониторинг».


В самом Zabbix шаблоны триггеров в описании заданы как «scm_IDтриггера порог%», например «scm_CPU 70%», за счет этого после заказа скрипт сам может найти ID триггеров (уникальные для каждого хоста и варианта триггера), и это позволяет легко заменить описание «scm_CPU 70%» на «CPU load more than 70%» или «Загрузка CPU выше 70%».


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


Шаблоны для мониторинга каких-то специфических вещей создавались с нуля, либо дорабатывались найденные, так же немного поправили default шаблоны под нашу специфику.

Если возникнет интерес, то с удовольствием поделимся с сообществом наработками.


На этом все !

Благодарим за внимание!


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Мобильные телефоны и тотальная слежка АНБ: как это работает

image

Имя Эдварда Сноудена последние два года регулярно мелькает в новостях по теме информационной безопасности. Благодаря разоблачениям этого бывшего сотрудника американских спецслужб все уже слышали, что Агентство национальной безопасности (АНБ, NSA) обладает возможностями тотальной мобильной слежки за гражданами. Но как именно устроена эта слежка, мало кто знает. В данном обзоре мы собрали некоторые подробности о технологиях, которыми пользуется NSA — и не только оно.


Одна из первых неприятных новостей от Сноудена касалась подрыва доверия к технологиям криптозащиты. В рамках секретного проекта АНБ под названием Bullrun была получена возможность обхода многих систем шифрования – но не за счёт взлома, а за счёт эксплуатации закладок, специально оставленных производителями по требованию АНБ. А в некоторых случаях вендоров просто обязали сдавать агентству шифровальные ключи. Таким образом, были дискредитированы многие стандарты безопасности, считавшиеся надёжными и применявшиеся в крупном бизнесе и государственных организациях.


image


Буквально на днях в СМИ появилось развитие этой истории – некоторые детали операции AuroraGold, в рамках которой АНБ следило за сотрудниками телекомов, читая их электронную переписку и внутренние документы. Уже в мае 2012 года АНБ собрало таким образом технические данные о 70% мобильных сетей всего мира. Под прослушку попала и GSM Association – международная организация телекомов, где разрабатываются рекомендации по новым стандартам связи. Цель операции AuroraGold – та же, что и у проекта Bullrun: внедрить закладки либо узнать об уязвимостях, которые помогут обойти алгоритм шифрования A5/3 и другие новые технологии защиты. Судя по документам из архива Сноудена, первые попытки взломать G4 удавались агентству АНБ ещё в 2010 году – то есть ещё до того, как этот «безопасный» стандарт получил широкое распространение.


Другой вектор атак АНБ – это мобильные ОS и приложения. Как выяснилось, спецслужба имеет доступ ко множеству данных на смартфонах: списки контактов и звонков абонентов, а также их SMS и GPS-данные. Для этого в АНБ были собраны команды хакеров, каждая из которых занималась взломом одной из популярных OS. В публикации немецкого журнала Spiegel подчёркивается, что одной из первых была взломана операционка Blackberry, хотя традиционно она считалась более защищенной, чем iOS и Android.


image


И конечно же, возможности прослушки значительно расширились благодаря развитию рынка мобильных приложений. Многие из них регулярно передают значительное количество пользовательских данных третьим сторонам. Таким образом, для подслушивания необязательно взламывать OS – достаточно убедить пользователя поставить себе «полезное» мобильное приложение.


Но ещё больше возможностей для слежки обнаружилось в самих сетях мобильной связи. В документах Сноудена нашлось описание шпионского каталога АНБ — проекта Ant, в котором есть решения для манипуляции мобильными сетями на все случаи жизни. Необязательно перехватывать данные через уязвимое ПО — можно установить закладки на стадии изготовления устройств связи. Вот, например, скомпрометированный радио-модуль для телефона:


image


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


image


Или целая сотовая сеть в одной коробке:


image


Есть и спектральный анализатор на базе мобильного телефона Motorola L9, который позволяет записать радио-спектр для дальнейшего анализа:


image


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


image


Конечно, само по себе существование такого каталога устройств не означает, что кто-то уже использует их для тотальной слежки. Однако вслед за публикацией каталога стали появляться и свидетельства практического применения.


В сентябре 2014 года была обнаружена подозрительная будка на крыше IZD-Tower, напротив комплекса UNO-city (Венский международный центр). Будка огорожена прочным металлическим забором, под наблюдением 10 камер. Вероятнее всего, это поддельная базовая станция мобильной сети.


image


Вена является третьим городом-резиденцией ООН (после Нью-Йорка и Женевы), там же расположены штаб-квартиры ОПЕК и ОБСЕ. Вполне понятен интерес АНБ к месту, где собираются высокопоставленные лица большинства стран. А вот предположительная зона покрытия данной станции:


image


Такие базовые станции могут перехватить IMSI (так называемые IMSI-catcher), а затем через сеть SS7 отслеживать местоположение жертвы. Однажды отследив IMSI жертвы, можно отслеживать ее перемещение по всему миру до тех пор, пока пользователь не сменит SIM-карту. Подробнее о таких атаках мы уже рассказывали здесь.


Документы Сноудена говорят о том, что станция в Вене (Vienna-Annex) является лишь частью глобальной сети слежения SIGINT. Дальше уже можно искать по списку стран и городов, упомянутых в этих документах. Вот фото похожей структуры, найденной на крыше в Риме:


image


Кстати, американские спецслужбы не ограничиваются стационарными системами слежения. Они уже давно используют станции-перехватчики StingRay на специальных автомобилях, которые могут подъехать к заданной цели. А в ноябре журнал Wall Street Journal сообщил, что Министерство юстиции США использует самолеты Cessna с поддельными базовыми станциями для перехвата данных пользователей:


image


Кто виноват и что делать?




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

В августе 2014 года журнал Popular Science рассказал о том, как группа специалистов по безопасности ESD America продвигает собственную разработку – «особо защищенный» смартфон CryptoPhone 500 на базе Android. Поскольку подобных продуктов на рынке уже несколько, разработчики использовали небанальный рекламный ход. С помощью своего продвинутого смартфона они обнаружили на территории США 17 поддельных базовых станций, которые в принудительном порядке отключают шифрование данных:


image


Одну такую станцию прослушки обнаружили около крупного казино в Лас-Вегасе, ещё несколько — вблизи военных баз США. Кто, кроме АНБ, может использовать такую технику? Да кто угодно. Правда, коммерческие комплексы дороговаты — более $100 тыс. Однако можно значительно удешевить решение, если воспользоваться бесплатным ПО для создания своей собственной базовой станции.


Как от этого спастись? Один из вариантов уже упомянут выше – «защищенный» смартфон. Однако удовольствие недешёвое: CryptoPhone стоит $3.500. За эти деньги клиент получает «закрытие» ряда векторов атаки, которые фигурировали выше в нашем списке. В частности, здесь есть контроль известных уязвимостей Android OS, контроль подозрительной деятельности мобильных приложений, и даже мониторинг baseband-процессора: именно эта фича позволяет определить подключение фальшивой базовой станции-перехватчика, чего не замечают обычные смартфоны.


Защититься от поддельных базовых станций с обычным телефоном сложнее, но кое-что сделать всё-таки можно. В сетях UMTS (G3) используется взаимная аутентификация мобильной станции в сотовой сети, и сотовой сети — в мобильной станции. Поэтому одним из признаков прослушки является принудительное переключение из режимов G4 и G3 в менее безопасный режим G2. Если пользователь заранее отключит у себя 2G-режим, это усложнит злоумышленнику задачу перехвата радио-эфира. Некоторые модели мобильных телефонов позволяют переключать используемый тип сети:


image


Также во многих телефонах на базе Android есть сервисное меню, вызываемое командой *#*#4636#*#*, где можно выбрать тип сети. Правда, такое решение чревато повышенным потреблением батареи, а также потерей связи в случае отсутствия покрытия сети 3G.


image


Поддельные базовые станции позволяют перехватывать любые данные, передаваемые через сотовую сеть – однако для этого требуется физическое нахождение абонента в зоне действия базовой станции. Поэтому более продвинутым методом слежки можно считать атаки на сеть SS7, позволяющие перехватывать данные абонента, а также его местоположение, из любой точки земного шара. Здесь тоже есть свои коммерческие решения: в одном из прошлых постов мы рассказывали о системе SkyLock американской компании Verint, которая позволяет отслеживать любых абонентов по всему миру.


Как можно помешать прослушке в этом случае? Поскольку атаки базируются на легитимных сообщениях сигнальной сети SS7, грубая фильтрация этих сообщений может оказать негативное влияние на весь сервис. По опыту экспертов Positive Technologies, адекватная защита от атак на SS7 должна представлять собой комплекс мероприятий на стороне оператора, включая мониторинг трафика SS7 и «умный» контроль фильтрации, который позволяет блокировать только попытки атак и фрода. Подробнее о том, как это реализуется на основе наших продуктов, можно прочитать в статье «Безопасность сетей мобильной связи на основе SS7».


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.