Результати пошуку за запитом: mvc4 5*
Огляд елементів у HTML5
Автор: Редакция ITVDN
Введение
HTML5 – последняя версия языка разметки. У HTML5 есть семантическая структура. В пятой версии языка ввели определенные средства для управления – они дают возможность сэкономить Ваше время при разработке веб-сайтов. В этой статье мы рассмотрим упомянутые средства управления, а также функции в HTML5.
Прежде чем начать, необходимо установить Visual Studio.
Мы можем включить опцию HTML в целевом разделе:
Tools -> Options -> Text Editor -> HTML.
Разметка HTML5
Объявление DOCTYPE:
<!DOCTYPE html>
Объявление кодировки символов:
<meta charset="utf-8" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sibeesh Passion wish you a happy new yeartitle>
head>
<body>
Welcome to Sibeesh Passion
body>
html>
Структура HTML5
Как уже говорилось, у HTML5 есть семантическая структура. Это уменьшает усилия UI-разработчика. На изображении объясняется эта структура.
До применения HTML5:
После:
Исходя из рисунка, понятно, что в HTML5 доступны такие элементы:
Header
Nav
Section
Aside
Article
Footer
Добавление собственных элементов
Вы можете создать собственный элемент, используя стили. Разметка должна выглядеть таким образом:
<!DOCTYPE html>
<html>
<head>
<title>Your own element title>
<script>document.createElement("yourelement")script>
<style>
yourelement {
display: block;
}
style>
head>
<body>
<div>
Normal element
div>
<yourelement>My elementyourelement>
body>
html>
Вы создали новый элемент «yourelement».
Новый синтаксис Атрибута
В HTML5 введен новый синтаксис атрибута:
Empty
Unquoted
Double Quoted
Single Quoted
Можно присвоить текстовое значение тега input type таким образом:
<input type="text" value="Sibeesh" disabled>
<input type="text" value=Sibeesh>
<input type="text" value="Sibeesh">
<input type="text" value=’Sibeesh’>
Примените CSS
Так же, как к обычным элементам HTML, так и к новым семантическим элементам можно применять стили.
footer{border:1px solid;}
Предыдущий стиль будет применен ко всем footer, доступным на странице. Не рекомендуется использовать верхний регистр (Footer, FOOTER) в названии элементов.
Обзор элемента Canvas
Если Вы хотите создать определённый графический контент, элемент Canvas, то Вам нужно:
Объявление Canvas
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
Реализация Canvas
var c = document.getElementById("canvasExample"); //Get the element
var ctx = c.getContext("2d"); // Get the context for the element
var grd = ctx.createLinearGradient(0, 0, 200, 0); //Create the line
grd.addColorStop(0, "blue"); // Apply the colors
grd.addColorStop(1, "white"); // Apply the colors
ctx.fillStyle = grd; //apply the style
ctx.fillRect(10, 10, 150, 80); // Fill
Здесь мы применили градиент к canvasExample.
Введение в SVG
Масштабируемая векторная графика (Scalable Vector Graphics) – графика для web типа canvas. Одно из различий между canvas и SVG то, что SVG поддерживает обработчик событий, а элементы canvas – нет.
Объявление SVG
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
Полный вариант HTML-документа:
<!DOCTYPE html>
<html>
<body>
<table style="border:1px solid #ccc;">
<tr style="border:1px solid #ccc;">
<td style="border:1px solid #ccc;">
<h2 style="text-align:center;">Canvash2>
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
td>
<td style="border:1px solid #ccc;">
<h2 style="text-align:center;">SVGh2>
<svg width="200" height="200">
<circle cx="100" cy="100" r="50"
stroke="green" stroke-width="4" fill="yellow" />
Bad Luck, It seems your browser won't support :(
svg>
td>
tr>
table>
<script>
var c = document.getElementById("canvasExample"); //Get the element
var cctx = c.getContext("2d"); // Get the context for the element
var grd = ctx.createLinearGradient(0, 0, 200, 0); //Create the line
grd.addColorStop(0, "blue"); // Apply the colors
grd.addColorStop(1, "white"); // Apply the colors
ctx.fillStyle = grd; //apply the style
ctx.fillRect(10, 10, 150, 80); // Fill
script>
body>
html>
Источник: http://www.c-sharpcorner.com/UploadFile/65794e/html-5-elements-in-a-look-part-1/
http://www.c-sharpcorner.com/UploadFile/65794e/html-5-elements-in-a-look-part-2/
11 золотих істин правильного SEO
Автор: Андрій Афанасьєв
Введение
Приветствую всех профессионалов или просто любителей великого дела – продвижения сайтов. Я постараюсь не затрагивать того, о чем пестрят страницы многих блогов и порталов и перетирать уже и так “до дыр” затертые темы относительно современного SEO. Работая руководителем интернет-рекламы в компании Abweb, мне с командой технических специалистов удалось накопить значительный бекграунд, который позволит поделиться прикольными “фишками” с Вами.
По заголовку данной статьи на меня может сразу политься поток критики по поводу понятия “правильное SEO”. Ребята, расслабтесь. Я расскажу об 11 золотых истинах правильного SEO относительно клиента и самому подходу к рабочемму процессу, которые мы составили с коллегами на основании реальных событий и опыта. Поэтому, данный материал будет полезен как для любителей своего дела, так и для клиентов, которые сотрудничают или собираются сотрудничать с интернет-агентством.
Прописные истины 2015. Какие они у нас?
1. Начнем с глобального. SEO – это специфическая услуга, в которой априори не может быть гарантий. Какого бы уровня не был специалист - Senior, Middle или Junior, никто из них одинаково не сможет дать 100% гарантии, но вероятность успешного результата все же есть. О гарантиях есть официальный материал Google, где указано, что гарантий даже стоит остерегаться!
Пусть этот аргумент станет палочкой-выручалочкой для тех продажников, от которых клиенты в договоре просят прописывать гарантии или возврат денег.
2. Поисковое продвижение не бывает быстрым. Да, иногда удается достигнуть очень быстрого результата, но на это влияет ряд факторов (трастовость ресурса, возраст, текущая история продвижения, качество самого сайта, ниша). Но, зачастую, результата нужно ждать 6 месяцев, а то и больше. Донесите до клиента, что Google - искусственный интеллект, который не доверяет первичным манипуляциям. И при дальнейшей модификации алгоритмов эти сроки аж никак не будут становиться меньше.
3. Качественно составленная семантика – первый шаг к успеху. Грамотно проработанное семантическое ядро - это действительно залог хорошего результата. Тут важны 2 аспекта: правильно подобрать запросы (не продвигать те ключи, которые не подходят тематике или типажу сайта) и корректно выбрать посадочные страницы под них. Например, часто возникает ситуация, когда основные запросы “садят” на страницу категории, хотя под них идеально подходит главная страница, которая продвигается значительно легче. Поэтому, это очень ответственный этап!
Чтобы сделать это максимально правильно, ориентируйтесь на тех, кто в ТОПе по продвигаемым ключевым словам, проводите анализ конкурентов. Просмотрите, какие целевые страницы они выбирают для продвижения и берите за базис их стратегию.
4. Внутренняя и внешняя оптимизация – неразрывные звенья. Невозможно получить ТОПы, выполнив лишь 1 фронт работ. Нужно хорошо оптимизировать сайт, устранить все ошибки, написать и разместить тексты, составить и разместить оптимизированные мета-теги, а потом выполнять работы по наращиванию ссылочной массы. Часто клиенты пытаются навязывать свое мнение, что один из этапов нужно пропустить (явно для того, чтобы сократить бюджет). Но это неверно. Только такой симбиоз даст что-то толковое!
5. Эра контента наступила. И это факт. Поисковые машины научились определять полезность контента. Есть сторонники OLDSCHOOL-теорий, что тексты никто не читает и главное, чтобы плотность ключевика там была процентов 5 не меньше. Это эра динозавров.
Нами лично было проведено много экспериментов, которые дали положительные результаты. Страница, которая содержит только текст с определенной оптимизацией под ключевики, ранжируется в поисковых системах хуже, чем структурированная и реально полезная страница. Такая страница должна содержать изображения, видеоматериалы, маркировочные списки и, желательно, конкретные предложения и прайсы. Все это выявляет большой интерес и важность для пользователя, попавшего на Вашу посадочную страницу. Пример удачной страницы одного из наших довольных клиентов:
Тут не просто голый текст, а реально важная информация для клиента, которая и делает контент полезным.
6. Вечные ссылки рулят. Вечные ссылки – это такие ссылки, которые оплачиваются разово, которые размещаются в теле постового материала или тематической статьи и “живут” на площадке столько, сколько существует сама площадка. Такие ссылки выглядят очень естественно (что несомненно нравится клиентам) и хорошо воспринимаются поисковыми системами.
И не нужно переживать, что ссылка будет мигать или будет снята за неуплату аренды, как это было в далеких 2000-ых. Единственный минус – дороговизна такой ссылки, но зато результат того стоит.
7. Стремительная положительная динамика от внутренней оптимизации видна в течении 1-ого месяца, а от продвижения ссылочным через 2-3.Часто клиенты спрашивают: “После внутренней оптимизации сайта произошел стремительный рост позиций, а после закупки ссылок мы топчемся на месте уже 2-й месяц?”. Очень типичная ситуация, на которую есть железный аргумент. Индексация сайта и индексация внешних ссылок на сайт – это два разных процесса, которые длятся по-разному. Для индексации ссылки и учета ее на ранжирование продвигаемого сайта поисковик проводит несколько апдейтов (2-3 месяца), а для учета всех изменений по сайту (текстов, метатегов) ему может быть достаточно 1 посещения Гугл-ботом (1-3 недели). Вот почему происходит такая разница в динамике по позициям на разных этапах, и успокойте заказчика.
8. Принудительная переиндексация целевых страниц помогает сдвинуть динамику. В инструменте Google Webmaster Tools есть инструмент, который позволяет отправлять страницы на целевую переиндексацию, чтобы привлечь быстроробота на страницу.
В основном, этот прием применяют для того, чтобы робот поисковика быстрее учел внесенные изменения в текст страницы или метатеги. Но, как показывает практика, если Вы долго не видите положительной динамики по позициям по продвигаемым страницам, можно попробовать отправить их через данный инструмент. Очень часто помогает сдвинуть позиции с мертвой точки. Невероятно, но факт!
9. Прозрачное SEO – это подушка безопасности. Это так, ибо зачастую данная услуга продается без гарантий. Максимальная прозрачность и этапность работ, открытый бюджет (Open Budget), а также промежуточная и ежемесячная отчетность поможет сгладить все конфликтные “углы”. Заказчик регулярно будет видеть перечень работ и какие манипуляции проводятся. Также, в конечном итоге даже при возникновении конфликтной ситуации можно попытаться вывернуть ее в то русло, что оплачена, в первую очередь, проведенная работа, а не ТОПовые позиции, которых ждет клиент и деньги не выброшены зря.
10. Для построения чего-то серьезного нужна не менее серьезная структура.Часто клиенты ошибочно считают, что весь цикл коммуникаций и все работы должно проводить то лицо, которое заключало с ними договор и продавало услугу, критикуя при этом структуру построения коммуникаций. Это ошибочно! (исключение - фриланс) Любая уважающая себя компания понимает и выстраивает свою иерархию по должностям и отделам, и в такой структуре один человек не может выполнять все процессы.
В интернет-агентствах зачастую структура состоит из sales менеджеров, аккаунт-менеджеров, технических специалистов и руководителей. И это правильно. Каждый должен выполнять определенный круг задач с максимальным качеством. Поэтому меня возмущают вакансии типа совмещающие в себе этакий микс с разных направлений и отраслей. Это важно доносить и клиентам.
11. Эксперименты - двигатель прогресса. Пускай и говорят, что работа сеошников во многом похожа на тыканье пальцем в небо. Зато, как приятно достигать неожиданного положительного результата при проведении очередного эксперимента. Признаюсь честно, мы точечно тестируем множество тактик и стратегий (те же арендные ссылки с Sape, ссылочные прогоны или переспам в метатегах), чтобы понимать четкую картину того, что пишут на большинстве блогов и можем ли мы с этой информацией согласиться или ее опровергнуть. Для нас эксперименты – это двигатели прогресса. Экспериментируйте и Вы!
Надеюсь, что этот дебютный материал будет полезным тем, кто только начинает свой путь в SEO или уже успешно по нему шагает. Ждем комментов ;)
Базові шаблони JavaScript
Автор: Антон Гончаров
Прежде всего стоит освежить память и немного повторить основы.
JavaScript – объектно-ориентированный язык программирования. Чаще всего в сценариях JS вы будете встречать объекты.
Элементарные типы данных JS:
числа
строки
булевые(true/false)
null
undefined
Объект в JS – это коллекция пар ключ/значение. Если же свойством объекта выступает функция, это свойство называют – методом.
Разновидности объектов в JS :
Собственные объекты:
встроенные (Array, Date)
пользовательские (var b = {};)
2. Объекты окружения:
window
объекты DOM
Прототип:
Для использования наследования обычно применяют прототип.
Что такое прототип – это объект. Каждая создаваемая функция получает свойство prototype, который ссылается на новый пустой объект.
Что такое Шаблон :
это повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования у часто возникающего контекста.
решение типичной задачи(эффективный прием).
Что делают шаблоны:
помогают писать более еффективный программный код, используя наработанные приемы.
помогают абстрактно мыслить программисту, не погружаясь в детали, пока этого не требует ситуация.
упрощает общение разработчиков, упоминание какого-либо приема сразу вносит ясность.
Типы шаблонов:
шаблоны проектирования
шаблоны кодирования
антишаблоны
Рассмотрим основные приемы написания качественного кода на JS.
Правила написания качественного кода:
удобочитаемость (вы или человек, который будет после вас читать код, должен легко и быстро его понимать)
документация (опять же, для понимания написаного вами кода)
предсказуемость (опять же, вытекает из первого)
непротиворечивость (отдельные составляющие программы не должны противоречить друг другу)
Первый прием(шаблон) на пути написания качественного кода – сведение к минимуму количества глобальных переменных.
Стараемся объявлять переменные в теле функций(так как мы помним, что функция есть локальной областью видимости). Любая переменная, объявляемая не в теле другой функции, является свойством глобального объекта window.
Почемy же нам стоит избегать глобальных переменных ? Они доступны всему приложению, соответсвенно, могут конфликтовать/перезаписываться.
Решение – использование слова var при объявлении переменных.
function mult(x, y) {
//антишаблон - глобальная переменная
res = x * y;
return res;
};
function mult(x, y) {
//локальная переменная
var res = x * y;
return res;
};
function antiPat() {
// антишаблон - использование нескольких операций присваивания
// переменная res - локальна, переменная glob - глобальна
// потому как присваивание выполняется справа налево
// glob = 5 - в данном случае необъявленная переменная
// операция эквивалентна var res = ( glob = 5 );
var res = glob = 5;
};
function antiPat() {
//решение : зарание объявить переменные;
var res, glob;
res = glob = 5;
};
Также переменные, объявленные с помощью слова var, не могут быть удалены, используя оператор delete.
var global0 = 5;
global1 = 10; // антишаблон
(function () { global_inFunc = 15 }()); // антишаблон
//пытаемся удалить
delete global0; // false
delete global1; // true
delete global_inFunc; // true
//проверяем
typeof global0 // 'number'
typeof global1 // 'undefined'
typeof global_inFunc // 'undefined'
В строгом режиме ('use strict';) присвоение значения необъявленной переменной вызовет ошибку.
Глобальный объект
var global = (function () { return this }());
Получаем доступ к глобальному объекту, потому как ссылка this указывает на глобальный объект.
Единственная инструкция var
function func () {
var x = 5, y = 10, mult = x * y, someObj = {}, k, l, m;
return …
};
У такого приема есть ряд приимуществ:
легко найти переменную(они все в одном месте)
уменьшает количество логических ошибок
уменьшает количество глобальных переменных(так как мы их объявили локально уже)
повышает удобочитаемость кода
Подъем
//антишаблон
some = 'global'; //глобальная переменная
function example() {
alert(some); //undefined
var some = 'local';
alert(some); //'local'
};
example();
Почему так происходит? Потому что в JS интерпретатор проходит по областям видимости на первом этапе обработки кода и собирает объявление переменных фунций и формальных параметров. В локальной области видимости переменная some неопределена (undefined). Она существует как глобальная переменная и как локальная.
Такое поведение именуется подъем (hoisting).
Второй этап выполнения кода интерпретатором – создание функций-выражений и необъявленных переменных.
Циклы for
function func (){
var i, max, sampleArray;
for ( i = 0; max = sampleArray.length; i < max; i++ ) {
// произвести действия над sampleArray[i]
}
};
Используя такой шаблон, значение свойства length будет извлекаться единожды, что увеличит драгоценную скорость работы.
var i, sampleArray = [];
for (i = sampleArray.length; i--;) {
// произвести действия над sampleArray[i]
};
Считаем итерации обратно от максимального значения к нулю, потому как сравнение с 0 эффективнее, чем сравнение с длиной массива.
var sampleArray = [],i = sampleArray.length;
while(i--){ // произвести действия над sampleArray[i]};
Такие изменения будут ощутимы на участках приложения, где необходима максимальная производительность.
Циклы for-in
Циклы for-in используются для обхода объектов (не массивов – это возможно, но не рекоменуется).
var car = {
doors: 4,
wheels: 4,
engine: 1
};
// расширяем функционал
// добавляем ко всем объектам метод ride
if (typeof Object.prototype.ride === 'undefined') {
Object.prototype.ride = function () { };
};
// Теперь все объекты через прототип имеют доступ к методу ride()
// чтобы отбросить метод при перечислении свойств необходим
// метод hasOwnProperty() для того, чтобы отфильтровать свойства прототипа
var i, hasOwn = Object.prototype.hasOwnProperty;
for (i in car) if (hasOwn.call(car, i)) {
console.log(i, ' : ', car[i]);
};
Для каждого собственного свойства объекта выполнить кусок кода в фигурных скобках.
Расширение prototype
Данный шаблон следует использовать очень аккуратно.
Даже если вы предупреждаете свою команду в докумментации (что является более предпочтительным и для новой комманды) или устно (недопустимо).
If ( typeof Object.prototype.someMethod !== 'function' ) {
Object.prototype.someMethod = function () {
//do something...
};
};
Приведение типов
// шаблон
var number = 0;
if (number === false) {
// не выполнится потому как number это 0, а не false
};
// антишаблон
if (number == false){ // инструкция выполнится };
Во избежание двузначности старайтесь использовать однозначную трактовку кода.
Шаблоны eval(), setInterval(), setTimeout()
Старайтесь не использовать в своих сценариях eval().
Функция принимает строку и выполняет её как програмный код. А это уже ставит под удар безопасность приложение, так как eval() выполнит код хакера. Возможно, эта функция понадобится вам во время динамической генерации кода, тогда лучше заменить eval(), как показано ниже:
// антишаблон
var property = 'name';
alert(eval('obj.' + property));
// лучше заменить на
var property = 'name';
alert(obj[property]);
Функциям setInterval(), setTimeout() и конструктору Function() старайтесь не передавать в качестве аргумента строки. По тем же причинам , что и функция eval().
// антишаблон
setTimeout( 'someFunc()', 5000);
setTimeout( 'someFunc(1, 2, 3)', 5000);
// заменить на
setTimeout( someFunc(), 5000 );
setTimeout( function(){ someFunc(1, 2, 3); }, 5000);
Если по каким-либо причинам вам все-таки приходится применять функцию eval(), оберните её в самовызывающуюся функцию, этот шаблон поможет вам создать локальную область видимости, предотвратит перетирание переменных и предотвратит создание глобальных переменных.
Также конструктор Function() отличается от eval() тем, что ему доступна лишь глобальная область видимости.
(function () {
var local = 1;
eval('local = 3; console.log(local)'); // результат 3
console.log(local); // результат 3
}());
(function () {
var local = 1;
Function('console.log(typeof local);')();// результат undefined
}());
Применяйте приведенные в этой статье шаблоны, эксперементируйте. Старайтесь создавать код, понятный и другим разработчикам.
Одно из самых главных приоритетов при написании кода- это простота. Как говорится в знаменитой пословице: “Все гениальное просто.”
На этом пока все. Желаю всем красивого кода. Всем спасибо!
Створення Web API в MVC6
Автор: Редакция ITVDN
Введение
ASP.Net Web API – это основа создания HTTP услуг широкого спектра клиентов, таких как браузеры, мобильные телефоны, планшеты и так далее. API должна быть совместима с современными браузерами, чтобы использовать эти услуги в простой форме. Мы можем быстро и просто сбрасывать служебные данные в браузер, а также приложения.
Необходимость в Web API
Если Вы нуждаетесь в Web Service и Вам не нужно SOAP, то API ASP.Net –лучший выбор. Он строит простые HTTP сервисы, основанные на базе существующей WCF. ASP.Net Web API на основе HTTP легко определяются. У них открытый исходный код. Легкая архитектура подходит для устройств с ограниченной шириной полосы, например, смартфонов.
Создание простой Web API в ASP. NET MVC 6
Запустите Visual Studio 2015 Preview. В меню Файл выберите New > Project. В диалоговом окне New Project нажмите Tempates > Visual C# > Web и выберите ASP. NET шаблон проекта Web-приложений. Назовите проект "WebApplication1" и нажмите OK.
В диалоговом окне New ASP.NET Project выберите "ASP.NET 5.0 Empty” шаблон.
Проект включает в себя следующие файлы:
Global.json содержит настройки решения. В project.json находятся настройки проекта. Project_Readme.html – read me файл. Startup.cs содержит встроенный код конфигурации.
Откройте файл Project.json. Добавьте библиотеки классов (class libraries) в разделе зависимостей (dependencies).
"dependencies": {
"Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
" "Microfost.AspNet.Diagnostics": "1.0.0-beta1"
}
Затем откройте Startup.cs с кодом, показанным ниже.
public class Startup
{
public void Configure(IApplicationBuilder app)
{
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
app.UseWelcomePage();
// app.UseMvc();
}
}
После отладки Visual Studio перейдите на http://localhost:port/ в браузере.
Создание Web API
Мы создадим Web API, чтобы упорядочить список клиентских продуктов. Сначала нужно добавить ASP.Net MVC6 в приложение.
Добавьте пакет MVC6 в список зависимостей в Project.json. Используйте код ниже.
"dependencies": {
"Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
"Microsoft.AspNet.Mvc": "6.0.0-beta1"
}
Затем добавьте MVC в request pipeline в Startup.cs.
Добавьте Using для Microsoft.Framework.DependencyInjection.
Добавьте следующий метод в Startup класс.
using System;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.Framework.DependencyInjection;//add new
namespace WebApplication1
{
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseWelcomePage();
app.UseMvc();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
}
}
Добавьте модель
using System;
using System.ComponentModel.DataAnnotations;
namespace WebApplication1.Model
{
public class Customer
{
public int CustomerId { get; set; }
[Required]
public string Name { get; set; }
}
}
Добавьте контроллер
using Microsoft.AspNet.Mvc;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Model;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
static readonly new List<Customer> _items = new List<Customer>()
{
new Customer { CustomerId = 1, Name = "Henry" },
new Customer { CustomerId = 2, Name = "John" },
};
public IEnumerable<Customer> Get()
{
return _items;
}
public IActionResult GetById(int id)
{
var its = _items.FirstOrDefault(x => x.CustomerId == id);
if (its == null)
{
return HttpNotFound();
}
return new ObjectResult(its);
}
public void CreateCustomer([FromBody] Customer item)
{
if (!ModelState.IsValid)
{
Context.Response.StatusCode = 400;
}
else
{
item.CustomerId = 1 + _items.Max(x => (int?)x.CustomerId) ?? 0;
_items.Add(item);
string url = Url.RouteUrl("GetByIdRoute", new { id = item.CustomerId },
Request.Scheme, Request.Host.ToUriComponent());
Context.Response.StatusCode = 201;
Context.Response.Headers["Location"] = url;
}
}
public IActionResult DeleteItem(int id)
{
var item = _items.FirstOrDefault(x => x.CustomerId == id);
if (item == null)
{
return HttpNotFound();
}
_items.Remove(item);
return new HttpStatusCodeResult(204);
}
}
}
Выше описывается класс HomeController.
Маршрутизация
Атрибут маршрутизации определяет URL шаблоны контроллера.
[Route("api/[controller]")]
Методы HTTP
[HttpGet], [HttpPost] и [HttpDelete] – атрибуты, определяющие методы HTTP для контроллера.
public IEnumerable<Сustomer> Get() { } //[HttpGet]
public IActionResult GetById(int id) { } //[HttpGetbyid}
public void СreateСustomer([FromBody] Сustomer item) { } // [HttpPost]
public IActionResult DeleteItem(int id) { } //[HttpDelete]
{Customerid: int} int ограничивает переменную до соответствия целому числу, чтобы URL-адреса совпадали.
http://localhost/api/home/1
http://localhost/api/home/42
Из этой статьи Вы узнали, как создавать Web API в MVC 6, используя модели, контроллер и HTTP методы.
Источник: http://www.c-sharpcorner.com/UploadFile/85ed7a/create-web-api-in-mvc-6/
Відносне та абсолютне позиціонування в HTML
Автор: Олександр Марченко
Введение
Данная статья будет полезной для новичков в мире Web-разработки, поскольку в ней будут рассмотрены основные сценарии использования свойства position.
Под позиционированием подразумевают расположение элемента в заданной системе координат. Можно выделить четыре типа позиционирования: нормальное, абсолютное, относительное и фиксированное. В зависимости от выбранного типа, установленного через свойство position, будет изменяться и система координат.
Вместе со свойством position целесообразно использовать следующую комбинацию свойств (или лишь несколько из них): left, top, right, bottom и z-index, с их помощью элемент можно позиционировать более точно и в определенных случаях абсолютно независимо от соседних элементов. Свойства left, top, right, bottom отвечают за перемещение элемента от его первоначального положения в четырех направлениях: вправо, вниз, влево, вверх соответственно. Свойство z-index отвечает за перемещение элемента на другую плоскость (или уровень) и может принимать значения из диапазона от 1 до N.
Наиболее часто свойство position используется для определения взаимного расположения слоев, далее рассмотрим особенности разных типов позиционирования.
Нормальное позиционирование
По умолчанию, если для элемента не задано свойство position или ему задано значение static, слои позиционируются друг за другом, при этом каждый следующий начинается с новой строки. Причем, слои размещаются максимально близко к верхнему левому углу страницы и без отступов между границами.
Кроме этого, свойства left, top, right, bottom и их значения, если таковы определены, игнорируются браузером.
Можем убедиться в этом, отобразив два примера кода в браузере:
Без использования свойства position.
<html>
<head>
<title>Positiontitle>
<style type="text/css">
div {
width: 240px;
height: 80px;
}
style>
head>
<body>
<div style="background-color: Yellow">div>
<div style="background-color: Red">div>
<div style="background-color: Green">div>
body>
html>
С использованием свойств position:static, top и left:
<html>
<head>
<title>Positiontitle>
<style type="text/css">
div {
width: 240px;
height: 80px;
}
style>
head>
<body>
<div style="background-color: Yellow">div>
<div style="background-color: Red; position:static; top:50px; left: 100px">div>
<div style="background-color: Green">div>
body>
html>
В итоге получим одинаковое отображение нашего кода в браузере:
Абсолютное позиционирование
При задании абсолютного позиционирования элемента, он «отделяется» от потока документа и перестает в нем существовать. Его местоположение, равно как и координаты, задается относительно краёв окна браузера, в так называемой «видимой области». Задается такой тип через значение absolute свойства position.
Стоит отметить следующие особенности данного типа позиционирования:
- свойства top и left имеют более высокий приоритет, нежели right и bottom, это означает, что при противоречии свойств left и right значение right будет игнорироваться, также браузер поведет себя относительно свойства bottom.
- при использовании абсолютного позиционирования и задании значений свойствам left, top, right, bottom и z-index изначальное местоположение слоя становится доступным для замещения другими соседними элементами.
div {
background-color:red;
width: 120px;
height: 240px;
position: absolute; /*Определяем абсолютное позиционирование элемента*/
top: 100px; /*Производим смещение на 100px вниз от изначального местоположения слоя*/
left: 150px; /*Производим смещение на 100px вправо от изначального местоположения слоя*/
bottom: 20px; /*Свойства bottom и right в данном случае будут игнорироваться*/
right: 40px;
}
С использованием свойств position:absolute, top и left:
<head>
<title>Positiontitle>
<style type="text/css">
div {
width: 240px;
height: 240px;
position: absolute;
}
#redBox {
background-color: red;
top: 10px;
left: 10px;
}
#greenBox {
background-color: green;
top: 70px;
left: 70px;
}
#blueBox {
background-color: blue;
top: 130px;
left: 130px;
}
style>
head>
<body>
<div id="redBox">div>
<div id="greenBox">div>
<div id="blueBox">div>
body>
html>
В итоге, получим следующее отображение разметки в браузере:
Используя для зеленого слоя свойство z-index и передав ему значение 3, сможем добиться следующего отображения:
#greenBox {
background-color: green;
top: 70px;
left: 70px;
z-index: 3;
}
Фиксированное положение
Если свойству position задать значение fixed, элемент будет привязан к определенной свойствами left, top, right, bottom точке на экране и не будет изменять своего положения при прокрутке веб-страницы. Следующей отличительной чертой от absolute будет то, что при размещении фиксированного элемента за пределами области видимости снизу или справа от нее не приводит к возникновению полос прокрутки.
Целесообразным применением данного типа позиционирования является создание меню, заголовков, неподвижных элементов, содержащих формы быстрой связи со службой поддержки (online chat).
С использованием свойств position:fixed, top и left:
<html>
<head>
<title>Fixedtitle>
<style type="text/css">
div {
width: 240px;
height: 240px;
}
#redBox {
background-color: red;
}
#greenBox {
background-color: green;
}
#blueBox {
background-color: blue;
}
#fixedBox {
background-color: cyan;
width: 200px;
height: 200px;
border-radius: 100px;
position: fixed;
top: 20px;
left: 150px;
opacity: 1.0;
}
style>
head>
<body>
<div id="redBox">div>
<div id="greenBox">div>
<div id="blueBox">div>
<div id="fixedBox">div>
body>
html>
Относительное позиционирование
В случае задания свойству position значения relative позиционирование элемента будет установлено относительно его места по умолчанию. Использование свойств left, top, right, bottom позволит изменять позицию элемента и сдвигать его в ту или иную сторону от его изначального местоположения. При задании свойствам положительного значения, к примеру, left: 70px, происходит смещение элемента вправо от левой границы родительского элемента, при задании отрицательного значения left: -70px, происходит сдвиг влево. Аналогично выполняются инструкции и для других свойств.
Стоит отметить, что данный тип позиционирования нельзя применять к элементам таблиц (ячейкам, строкам, колонкам и т.д.). Кроме этого, место, занимаемое элементом до его перемещения, остается пустым и не может быть занятым другими элементами.
С использованием свойств position:relative, top и left:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Relativetitle>
<style type="text/css">
div {
width: 640px;
height: 240px;
position: relative;
}
#redBox {
background-color: red;
top: 10px;
left: 10px;
}
#greenBox {
background-color: green;
top: 70px;
left: 70px;
}
#blueBox {
background-color: blue;
top: 130px;
left: 130px;
}
style>
head>
<body>
<div id="redBox">div>
<div id="greenBox">div>
<div id="blueBox">div>
body>
html>
Зачастую относительное и абсолютное позиционирование сами по себе не применяются, поскольку существует свойство margin, с очень похожим функционалом, позволяющий задать местоположения слоя относительно его соседей. Но сочетание разных типов позиционирования для вложенных слоев, делает их незаменимыми при необходимости изменить систему координат и задать размещения дочерних элементов относительно их родителя, избежав трудно-воспринимаемых конструкций из множества вложенных слоев.
Читабельність програмного коду
Автор: Редакция ITVDN
Введение
Вам приходилось возвращаться к фрагменту кода, написанному год или месяц назад? Каково это было? Это было просто, или приходилось вникать в код исходя из заметок? Если у Вас не получается быстро разобраться в коде и Вы задаете себе вопрос: «Что же я тогда имел ввиду?» – Вы определенно делаете что-то не так. Скорее всего, Ваш код работает правильно. И Вы знали его вдоль и поперек, когда над ним работали. Почему же Вы не можете его вспомнить сейчас? Быть может, он не был написан достаточно доступно и не соответствовал стандартам машинного кода? В этой статье Вы найдете полезную информацию о том, как научиться писать доступный не только для себя, но и для остальных разработчиков код.
Пример использования стандарта оформления кода
Рассмотрим это на следующем примере метода в C#:
public string Transform(List<DateTime> s)
{
string d = null;
foreach (DateTime kc in s)
{
if (kc > DateTime.Now)
{
d = d + kc + "\n";
}
else
{
d = d + "Delayed\n";
}
}
return d;
}
Скорее всего, Вы не можете понять, какую функцию он выполняет и как его можно использовать. Но после короткой реконструкции кода мы получим:
public string GetText(List<DateTime> arrivalTimes)
{
var stringBuilder = new StringBuilder();
foreach (DateTime arrivalTime in arrivalTimes)
{
if (arrivalTime > DateTime.Now)
{
stringBuilder.AppendLine(arrivalTime.ToString());
}
else
{
stringBuilder.AppendLine("Delayed");
}
}
return stringBuilder.ToString();
}
Или если мы обратимся к оператору “?:”, мы получим:
public string GetText(List<DateTime> arrivalTimes)
{
var stringBuilder = new StringBuilder();
foreach (DateTime arrivalTime in arrivalTimes)
{
string message = arrivalTime > DateTime.Now ? arrivalTime.ToString() : "Delayed";
stringBuilder.AppendLine(message);
}
return stringBuilder.ToString();
}
Что произошло с кодом? Некоторые изменения сделали наш код более читабельным:
1. Имя метода получило более понятное название.
2. Мы изменили названия переменных:
1. “kc” изменена на arrivalTime,
2. “s” изменена на arrivalTimes,
3. “d” изменена на stringBuilder,
Это облегчит понимание того, за что отвечает каждая переменная и как она используется.
3. Скобки были стандартизированы.
4. Добавлены вкладки для читаемости, размещения и разметки в скобках.
5. Оператор “?:” был введен для того, чтобы сократить наш код до четырех строчек.
6. Добавлен класс StringBuilder, чтобы избежать конкатенации (“string” + “string”). Кто-то может возразить, что создание экземпляра StringBuilder будет замедлять метод из-за его распределения памяти. Но стоит помнить, что конкатенация струн создает много мусора в памяти, который вынужден чистить Garbage Collector. Считается, что ~ 5 непрерывных строк равны созданию реализации StringBuilder, так что если список состоит из пяти или более элементов, то производительность этого метода будет увеличена. А для больших коллекций этот метод будет работать в несколько раз быстрее.
Правильный способ составления кода
Давайте перейдем к другому примеру. Рассмотрим класс пользователя:
public class User
{
public bool HasConfirmedEmail { get; set; }
public bool HasActiveAccount { get; set; }
public bool IsLoggedIn { get; set; }
public bool HasPremiumAccount { get; set; }
public bool StatusAutoGenerated { get; set; }
public DateTime LastStatusChange { get; set; }
public bool SetStatus(string status)
{
// write to Data Base
return true;
}
}
Метод, отвечающий за обновление статуса пользователя, который должен проверить, все ли свойства в правильном состоянии:
public string UpdateStatus(string status, User user)
{
if (user.HasActiveAccount)
{
if (user.HasConfirmedEmail)
{
if (user.IsLoggedIn)
{
if (user.HasPremiumAccount)
{
if (!user.StatusAutoGenerated)
{
if (user.LastStatusChange < DateTime.Now.AddDays(-1))
{
if (user.SetStatus(status))
{
return "Updated";
}
}
}
}
}
}
}
return "Fail";
}
Хотя этот код более понятный, чем первый, представленный в этой статье, он все еще не соответствует стандартам программного кода. Вот пример того, как этот код можно сделать немного лучше:
const string OK = "Updated";
const string FAIL = "Fail";
public string UpdateStatus(string status, User user)
{
if (!CanUpdateStatus(user)) return FAIL;
if (!user.SetStatus(status)) return FAIL;
return OK;
}
public static bool CanUpdateStatus(User user)
{
if (!user.IsLoggedIn) return false;
if (!user.HasActiveAccount) return false;
if (!user.HasConfirmedEmail) return false;
if (!user.HasPremiumAccount) return false;
if (user.StatusAutoGenerated) return false;
if (!(user.LastStatusChange < DateTime.Now.AddDays(-1))) return false;
return true;
}
Основные изменения, внесенные в этот код, чтобы улучшить его читабельность:
Static method был создан, чтобы проверить возможность обновления статуса пользователя. Это делает метод UpdateStatus более понятным с первого взгляда. Кроме того, логика метода CanUpdateStatus может быть повторно использована в других частях системы, если они являются public и static.
Все " if " были заменены, чтобы уменьшить вложения. Количество скобок значительно уменьшилось, и код гораздо легче читать и компилировать. Еще одним преимуществом данного условия является его масштабируемость. Представьте себе, что класс User имеет теперь еще три свойства, которые должны быть проверены перед обновлением статуса – будут необходимы еще три "if" выписки. Теперь Вы можете добавить только три (не более) линии в методе CanUpdatedStatus.
Строки, которые представляют сообщения, были удалены из тела методов и были введены в постоянные переменные. Это помогает поддерживать код, потому что независимо от числа использований кода есть только одно место, где Вы должны изменить содержание сообщения, если это необходимо. Но, на самом деле, все тексты должны быть помещены в проект внешних ресурсов.
Источник: http://blog.goyello.com/2014/12/11/clean-code/
3D-перетворення за допомогою CSS3
Автор: Олександр Марченко
Введение
Продолжая серию статей о реализации анимации, которая реализуется без знаний Javascript, стоит отметить, что использование 2D зачастую не производит на пользователя должного впечатления. Несомненно, 2D-преобразования, реализованные с использованием каскадных таблиц стилей CSS3, освобождают нас от написания нескольких строк JavaScript кода, и тем более от подключения разного рода фреймворков. Но нельзя того же сказать и про 3D-преобразования, которые также реализуются без скриптов, но в то же время обеспечивают ощущение объемности объектов на странице, придавая им 3-х мерности. К тому же, на сегодняшний день большинство браузеров актуальных версий поддерживают эти эффекты.
Перед тем, как приступить к практическим примерам, стоит лишний раз упомянуть о перспективе, поскольку она является ключевой составляющей, когда дело доходит до 3D-эффектов. Дело в том, что, благодаря стереоскопическому зрению, человек способен различать и воспринимать формы, размеры и расстояние до предметов. Поэтому для изображения объемных тел на плоскости, с учетом их пространственной структуры и отдаленности некоторых частей от зрителя, и приняли специальную технику изображения, названную перспективой. Иначе говоря, если в правильной мере обеспечить изобразительное искажения пропорций и форм реальных тел, можно достичь реалистичного объемного изображения. Самым простым примером могут быть две прямые, которые идут от пользователя и сходятся в так называемой точке схода – подобный эффект Вы наблюдаете, когда смотрите на рельсы, которые удаляясь от Вас к горизонту, сходятся в одну точку.
Так, используя свойство transform вместе с функциональной аннотацией perspective, можно добиться объемности визуального эффекта.
<head>
<title>title>
<style>
div {
width: 400px;
height: 400px;
margin: 100px;
float:left;
background-color: ActiveCaption;
}
#clear:hover {
transform: rotateY(45deg);
transition: 3s;
}
#perspective:hover {
transform: perspective(500px) rotateY(45deg);
transition: 3s;
}
style>
head>
<body>
<div id="clear">div>
<div id="perspective">div>
body>
Кроме того, стоит помнить, что вы можете комбинировать направления поворотов, обеспечивая своего рода несколько степеней свободы.
<head>
<title>title>
<style>
#id1 {
margin: 100px;
transition: 3s;
}
#id1:hover {
transform: rotateY(45deg) rotateX(45deg);
transition: 3s;
}
#id2 {
margin: 100px auto;
transition: 3s;
}
#id2:hover {
transform: perspective(400px) rotateY(45deg) rotateX(45deg);
transition: 3s;
}
style>
head>
<body>
<img id="id1" src="cloud.png" />
<img id="id2" src="cloud.png" />
body>
С помощью несложных манипуляций вы сможете достичь интересных эффектов:
<head>
<title>title>
<style>
#overlay {
margin: 100px auto;
width: 150px;
height: 150px;
background: gold;
border-radius: 100%;
border: 10px double #794103;
box-shadow: 0 0 15px #808080;
}
#overlay:hover {
background: #794103;
border: 10px double gold;
}
#overlay:hover #inner {
width: 130px;
height: 130px;
border-radius: 100%;
background-color: #794103;
border: 3px dashed gold;
transform: rotateX( 180deg );
}
#inner {
width: 130px;
height: 130px;
margin: 7px;
border-radius: 100%;
background-color: gold;
border: 3px dashed #794103;
transition: all 1s ease-out;
}
style>
head>
<body>
<div id="overlay">
<div id="inner">div>
div>
body>
Трехмерные переходы, безусловно, изменят правила игры и дадут нам, веб-разработчикам, несомненно, лучшие возможности делать плавную анимацию, не прибегая к Flash. В этой статье мы познакомились лишь с частью возможностей Transform Properties. Сами по себе они не могут служить универсальным решением, но, когда мы начинаем трансформировать элементы вокруг с помощью свойства transition, начинается самое интересное. Но с этим свойством мы детальней познакомимся с следующей статье.
Властивості CSS3 для перетворення
Автор: Олександр Марченко
Введение
Чем больше браузеров начинает поддерживать CSS3, тем больше веб-разработчиков начинает использовать некоторые интересные возможности данной технологии. А именно, совмещая работу CSS3 в связке с HTML5 и JavaScript, реализовывать разного рода графические эффекты. В итоге и появилось сленговое название для этих подходов - «Flash-killer».
В серии статей рассмотрим основные дополнения к CSS3, познакомимся с простейшими 2D и 3D преобразованиями.
Свойства CSS3 – Transform являются, пожалуй, наиболее популярными преобразованиями, которые позволяют применять векторные изменения к HTML элементам, расположенным на странице. Вы сможете контролировать наклон, масштабирование и поворот любого элемента на web-странице. Стоит отметить, что подобные эффекты предпочтительно применять исключительно к изображениям и другим графическим элементам, которые не содержат текстовой информации, поскольку искажение текста существенно снижает его читаемость. Итак, познакомимся с основными функциями свойства transform:
1. Skew отвечает за наклон элемента, может принимать два параметра. Первый отвечает за ось X, другой за ось Y, иначе говоря, наклоны по горизонтали или вертикали.
<head>
<title>title>
<style>
div {
width: 400px;
height: 200px;
background-color: crimson;
margin:100px;
font-size:50px;
color: white;
}
#skew1 {
transform: skew(30deg);
}
#skew2 {
transform: skew(-30deg);
}
#skew3 {
transform: skew(10deg, 10deg);
}
#skew4 {
transform: skewX(10deg);
transform: skewY(-10deg);
}
style>
head>
<body>
<div id="clear">Example Textdiv>
<div id="skew1">Example Text 1div>
<div id="skew2">Example Text 2div>
<div id="skew3">Example Text 3div>
<div id="skew4">Example Text 4div>
body>
2. Scale отвечает за масштабирование элемента по горизонтали и вертикали. Также используется и в частных случаях как ScaleX и ScaleY.
<head>
<title>title>
<style>
div {
width: 400px;
height: 200px;
background-color: ActiveCaption;
margin: 150px;
font-size: 50px;
color: white;
transform: scale(1)
}
#scale {
transform: scale(1.5);
}
#scaleX {
transform: scaleX(1.5);
}
#scaleY {
transform: scaleY(1.7);
}
style>
head>
<body>
<div id="clear">Example Textdiv>
<div id="scale">Example Text 1div>
<div id="scaleX">Example Text 2div>
<div id="scaleY">Example Text 3div>
body>
3. Rotate задает поворот элемента относительно точки трансформации, которая в свою очередь задается свойством transform-origin. В простейшем использовании обеспечивает поворот элемента за или против часовой стрелки относительно центра.
<head>
<title>title>
<style>
div {
width: 400px;
height: 200px;
background-color: chocolate;
margin:100px;
font-size:50px;
color: white;
}
#rotateL {
transform: rotate(-10deg);
}
#rotateR {
transform: rotate(10deg);
}
style>
head>
<body>
<div id="clear">Example Textdiv>
<div id="rotateL">Example Text 1div>
<div id="rotateR">Example Text 2div>
body>
4. Translate обеспечивает сдвиг элемента на определенное значение по горизонтали и вертикали. TranslateX отвечает за смещение по горизонтали, принимая положительное значение, сдвигает вправо, а принимая отрицательное значение, сдвигает влево. TranslateY действует аналогично по вертикальной направленности. Положительное принятое значение сдвигает элемент вниз, а отрицательное - вверх.
<head>
<title>title>
<style>
div {
width: 400px;
height: 200px;
background-color: crimson;
margin:100px;
font-size:50px;
color: white;
}
#translateL {
transform: translateX(-30px);
}
#translateR {
transform: translateX(30px);
}
#translateU {
transform: translateY(-20px);
}
#translateD {
transform: translateY(20px);
}
style>
head>
<body>
<div id="clear">Example Textdiv>
<div id="translateL">Example Text 1div>
<div id="translateR">Example Text 2div>
<div id="translateU">Example Text 3div>
<div id="translateD">Example Text 4div>
body>
Гораздо эффектней подобные трансформации выглядят, когда выполняются при наведении курсора мыши на элемент. В этом же примере вы сможете увидеть, что можно использовать сразу несколько преобразований для вашего элемента на странице.
<head>
<title>title>
<style>
#example {
width: 400px;
height: 400px;
background-color: #aa9fd5;
margin: 300px auto;
font-size: 50px;
color: white;
}
#example:hover {
transform: skew(30deg) scale(1.5,1.5) rotate(40deg) translateY(150px);
}
style>
head>
<body>
<div id="example">Transformdiv>
body>
Стоит помнить, что подобные манипуляции при статическом отображении не обеспечат у пользователя особого восхищения. Для того, чтобы привлечь внимание пользователя, стоит уделить время добавлению динамики на страницу. Об этом мы поговорим в следующих статьях из этого цикла.
Коротко про GIT, node.js, npm, Grunt, Bower на прикладі офіційного AngularJS програми angular-phonecat
Автор: Антон Гончаров
Введение
Эта статья предназначена для начинающего разработчика, который впервые столкнулся с изучением AngularJS и сопутствующими технологиями, такими как GIT, node.js, Grunt, Bower. Вы могли много читать литературы по поводу перечисленных выше технологий, в этой статье мы лишь вкратце опишем, чем по сути является каждая из них, и как с ней работать.
1. Проходим по ссылке:
https://docs.angularjs.org/tutorial
и следуем всем инструкциям по установке. Не бойтесь, мы Вам в этом поможем! И постараемся вместе разобраться в основных понятиях современного Frontend Development'a :)
Для начала нам следует установить git на свою ЭВМ :)
Коротко о git.
Git — система для контроля версий файлов. Более обширное определение - это ресурс, который позволяет разработчику или команде разработчиков контролировать версии своих приложений. Подробнее тут:
https://ru.wikipedia.org/wiki/Git
Идем по ссылке в новой вкладке:
http://git-scm.com/
и выбираем ту версию git, которая нас интересует, в соответствии с нашей операционной системой.
Скачиваем файл для установки, с расширением .exe и устанавливаем в папку Program files.
2. Идем по ссылке в новой вкладке браузера
https://github.com/
и регистрируемся. Github – самый крупный веб-сервер для хостинга (размещения) проектов разработчиков.
Итак, мы это все сделали, далее скачиваем приложение из репозитория angular-phonecat, размещенного на Github. То есть, нашей задачей теперь будет взять и скачать готовое приложение себе на жесткий диск.
3. AngularJS – это JavaScript фреймфорк, который заточен под разработку одностраничных приложений.
Официальный сайт AngularJS
https://angularjs.org/
Основной идеей AngularJS является убеждение создателей оного, что декларативное программирование (парадигма программирования - описание программы, какая она по сути, а не то, как ее создать) находит применение в разработке внешнего вида приложения, а императивное программирование (парадигма программирования – в отличие от декларативного программирования, описывает процесс вычисления в виде инструкций, по сути, пошагово изменяет инструкции программы, похоже на приказы) используется для описания бизнес логики.
AngularJS – расширяет HTML, чтобы создать двустороннюю привязку данных для динамического контента.
Цели AngularJS:
DOM-манипуляции не зависят от логики приложения.
Параллельная разработка путем разделения клиентской части и серверной части приложения.
Планирование разработчиком всех приложений – интерфейс, бизнес-логика, тестирование.
Открываем терминал/консоль и перемещаемся в ту папку, в которую хотим сохранить проект с помощью команды
cd Documents/
(эта команда означает - cd – change derictory на Documents)
и нажимаем Enter
мы переместились в папку, где хранятся документы (просто потому, что мне так удобней, можно этого не делать и остаться в корне диска).
Копируем следующую строку
git clone --depth=14 https://github.com/angular/angular-phonecat.git
вставляем в терминал/консоль и нажимаем Enter. Эта строка создает папку angular-phonecat и копирует приложение с Git с последними 14 коммитами (изменениями). Ждем окончания копирования проекта.
Далее переходим в директорию с нашим приложением командой
cd Documents/angular-phonecat
или
cd angular-phonecat/
после жмем Enter и оказываемся в папке с приложением
4. У нас на жестком диске есть наше приложение, теперь нам следует установить node.js.
Node.js – что такое node.js? Есть много статей, определений и объяснений. В общем и коротко:
Node.js – это интерпретатор JavaScript. Приложение node.js получает js код и выполняет его.
Нам надо установить node.js в папку с нашим приложением.
Переходим по ссылке:
http://nodejs.org/download/
качаем приложение и устанавливаем.
5. Вместе с node.js устанавливается и npm. Что такое npm?
Npm – это node package manager. Npm устанавливает пакеты, которые прописаны в файле package.json
перед установкой npm нам следует проверить, какая версия node.js установлена у нас. Это мы делаем командой в терминале:
node –-version
есть :)
Теперь в терминале набираем следующее:
npm install
На выходе получаем такую структуру нашего проекта:
Файл package.json содержит в себе информацию о приложении, название, версию, установленные пакеты в приложении. Возможна установка пакетов как через файл package.json, так и через терминал.
6. Это не обязательно, но в будущем этот пакет Вам пригодится.
Grunt – это Task Runner – автоматизатор процессов, позволяет проводить минификацию кода, сборку кода(компиляцию), тестирование.
В терминале вводим следующее:
npm install -g grunt-cli
(-d - говорит о том, что мы устанавливаем grunt глобально.) Дополнительно устанавливаем в директорию с приложением
npm install grunt-cli
теперь обновляем npm:
sudo npm update npm -g
sudo - (substitute user and do – подменить пользователя и выполнить) – в Unix системах позволяет пользователям выполнять команды от имени суперпользователя root.
В директории с приложением требуется создать файл Gruntfile.js, вложим в него код из официального примера
http://gruntjs.com/sample-gruntfile
в конце страницы - конечная версия файла, копируем код себе в файл. Или копируем отсюда:
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/**/*.js'],
dest: 'dist/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '/! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> /\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
qunit: {
files: ['test/**/*.html']
},
jshint: {
files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'],
options: {
// options here to override JSHint defaults
globals: {
jQuery: true,
console: true,
module: true,
document: true
}
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'qunit']
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('test', ['jshint', 'qunit']);
grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
};
Пакеты, которые мы прописали в Gruntfile.js, следует установить через npm следующими командами:
npm install grunt-contrib-uglify --save-dev
npm install grunt-contrib-qunit --save-dev
npm install grunt-contrib-concat --save-dev
npm install grunt-contrib-jshint --save-dev
Подробнее об установленных пакетах можно прочитать тут:
https://github.com/gruntjs/grunt-contrib-uglify
https://github.com/gruntjs/grunt-contrib-qunit
https://github.com/gruntjs/grunt-contrib-concat
https://github.com/gruntjs/grunt-contrib-jshint
https://github.com/gruntjs/grunt-contrib-watch
7. Установка Bower и что это такое.
Bower – менеджер пакетов для клиентской стороны приложения JS.
Отличием Bower от Npm есть то, что Bower, если возникнет конфликт, не позволит Вам поставить несовместимый пакет(библиотеку), которая уже установлена, Bower ставит одну версию пакета.
В терминале ставим глобально bower и пишем:
npm install -g bower
и конечно ставим в директорию с проектом
bower install
8. Сongrats !!!
Теперь у нас установлено приложение и мы можем запускать его, из файловой системы заходим в папку с приложением, потом в папку – app, находим файл и тапаем (двойной клик) по нему index.html или (что будет правильным) нужно зайти в терминал и ввести:
npm start
(запускаем сервер) и в браузере в омнибоксе (адресной строке) ввести:
http://localhost:8000/app/index.html
Wuala – наше приложение запускается и работает.
Подробнее об AngularJS и как с ним работать вы можете узнать из курса AngularJS в учебном центре CyberBionic Systematics.
Всем спасибо и удачного кода.
Адаптація співробітника
Автор: Вікторія Черевко
Введение
Вопрос адаптации сотрудника на новом месте довольно хорошо исследован и, можно сказать, порядком «избит». Но все же стоит уделить внимание некоторым основным шагам, которые стоит совершить, для того чтобы данная процедура прошла как можно приятнее и эффективнее как для сотрудника, так и для рабочего коллектива.
Адаптация нового сотрудника – процедура введения нового специалиста в коллектив компании. Не распространяется на временных сотрудников, на работающих в компании консультантов, на выполняющих разовые работы специалистов. Зачастую данная процедура состоит из нескольких этапов:
Вручение новому сотруднику «папки новичка» менеджером по адаптации в первый день выхода на работу после подписания всех корпоративных документов. В данной папке зачастую содержаться ручка, блокнот и книга путеводитель. Путеводитель или краткий справочник содержит в себе информацию о корпоративных правилах, инфраструктуре компании, контактной информации административных отделов.
Изучение новым специалистом корпоративных документов, презентаций отделов, краткие руководства о первых шагах ( рекомендуют их сделать в первую рабочую неделю).
Получение и настройка учетных записей к почте, внутреннему корпоративному порталу, сетевому хранилищу и т.д.
Пройти необходимые адаптационные курсу и тренинги, а также курс по корпоративной безопасности.
Подведение итогов адаптационных тренингов и тестирования с менеджером по адаптации новых сотрудников.
После этой несложной процедуры во многих компаниях принято знакомить новых специалистов с исполнительными директорами. Зачастую это происходит в форме группового общения, когда набирается группа в 5 и больше сотрудников (до 30, в зависимости от размера компании). Подобные мероприятия призваны в более открытой форме преподнести общее виденье компании, ее цели, приоритеты и проблемы. В более неформальной манере познакомить с политикой компании и заложить фундамент для продуктивных отношений.
Часто подобные тренинги проводят все руководители подразделений и отделов, на таких встречах изучается тематика и особенности работы конкретного подразделения. Эти этапы не являются обязательными частями процедуры адаптации и практически не отслеживаются, но имеют не меньше пользы, нежели тренинги по охране труда и корпоративной безопасности. Поскольку формируют здоровые открытые отношения между сотрудниками и способствуют снижению тревожности и неуверенности у новых сотрудников.
После прохождения всех этапов процедуры адаптации менеджер по адаптации проводит заключительную беседу с новым сотрудником, на которой подымаются все вопросы, интересующие сотрудника и проводится планирование процедуры испытательного срока длительностью от 3х до 6ти месяцев.
Об особенностях процедуры прохождения и завершения испытательного срока Вы познакомитесь в наших следующих статьях.