-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

[recovery mode] По щучьему велению… (язык программирования Pike)

Суббота, 10 Июня 2017 г. 12:01 + в цитатник
Статья представляет собой очень краткое введение в Pike. Признайтесь — мало кто из вас слышал об этом языке. Однако язык Pike даже применяется в продакшене (для работы Opera в режиме Turbo).

Краткие характеристики:

— интерпретируемый (не будете думать чем бы заняться во время компиляции);
— cинтаксис: основанный на С (с минимальными отличиями);
— лицензия — GNU GPL, GNU LGPL and MPL;
— объектно-ориентированный;
— со сборщиком мусора (которому кстати, можно подсказывать если очень надо);
— …

История

Язык появился еще 1994 году. Автор Fredrik H"ubinette. Предшественником считатся язык LPC (объектно-ориентированный язык на иснове языка C, созданный прежде всего для разработки игр — LPC Тут на самом деле интересная история — но копипастить вики не имеет смысла. Короче говоря, если бы не игры, не было бы языка.

Скажу сразу — с документацией не все в порядке. Далеко не все примеры (даже для новичков) будут работать (причем это может быть даже Hello world!).

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

Привет, мир!

Текст программы:

int main()
{
  write("Hello world!\n");
  return 0;
}

Сохраняем этот текст в hello.pike и запускаем в коммандной строке: pike hello.pike

Теперь с окошечком:

int main()
{
    GTK.setup_gtk(); 
    object w = GTK.AboutDialog();
    w.set_program_name("My GTK hello world program");
    w.signal_connect("destroy", lambda(){exit(0);});
    w.set_title("My first program"); 
    w.set_comments("Pike is a dynamic programming language with a syntax similar to Java and C. "+ 
        "It is simple to learn, does not require long compilation passes and has powerful built-in" +
	    "data types allowing simple and really fast data manipulation.");  
	array(string) arr1=({"Mr. Smith", "and others"});
	array(string) arr2=({"Mrs. Smith", "and others"});    	
    w.set_authors(arr1);
	w.set_artists(arr2);
    w.show_now();
    
  return -1;
}



Как видим, работа идет через GTK. Возврат -1 из функкции main нужно для того чтобы программа сразу не прекратила работу, иначе окошечка не увидите. Выход и программы происходит по кнопке закрытия окна с помощью прикрепленной лямбда-функции lambda(){exit(0);}

В официальном туториале для этого применяют GTK.Alert(«Hello world!»), но однако у меня такое не заработало (версия 8.0) — видимо туториал устарел.

Структуры данных:

Синтаксис работы с основными структурами данных радует.

Массивы:

int main()
{
    array(string) arr1 = ({ "red", "green", "white" });
	write(arr1);
	write("\n");
	array(string) arr2 = ({ "red", "green", "yellow" });
	write(arr2);
	write("\n");
	write(arr2 + arr1);  //просто все элементы двух массивов 
	write("\n");
	write(arr2 & arr1);  //пересечение 
	write("\n");
	write(arr2 | arr1);  //объединение множеств 
	write("\n");
	write(arr2 ^ arr1);  //xor - т.е. только те элементы которые не являются общими 
	write("\n");
	write(arr2 - arr1);  //разность 
	write("\n");
    
  return 0;
}

Результат:

redgreenwhite
redgreenyellow
redgreenyellowredgreenwhite
redgreen
redgreenyellowwhite
yellowwhite
yellow

Maps:

int main()
{
    mapping map2 = (["red":4, "white":42, "blue": 88]);
    mapping map1 = (["red":4, "green":8, "white":15]);	
	
    print_map(map2 + map1);
    print_map(map2 - map1);
    print_map(map2 & map1);
    print_map(map2 | map1);
    print_map(map2 ^ map1);
    
    return 0;
}

void print_map(mapping m){
    array(string) arr;
    arr = indices(m);
    foreach(arr, string key){
        write(key + ":" + m[key] + " ");    
    write("\n");
}


Результат:

red:4 green:8 white:15 blue:88
blue:88
red:4 white:15
red:4 white:15 green:8 blue:88
green:8 blue:88

Есть еще так называемые multiset. По сути тоже что mapping, но без значений:

int main(){
    multiset o = (< "", 1, 3.0, 1, "hi!" >); 
    print_multiset(o);	
    return 0;
}

void print_multiset(multiset m){
    array(string) arr;
    arr = indices(m);
    foreach(arr, string key){
        write(key + ":" + m[key] + " ");
    };
    write("\n");
}

Результат:

1:1 1:1 3.0:1 :1 hi!:1

Объекты

class car {    
    public string color;
	public string mark;
	private string driver;
	
	void create(string c, string m, string d){	
	    color = c;
		mark = m;		
		driver = d;
	}
	
	string who(){
	    return mark + " " + color + "\n";
	}	
}

int main(){
    car car1 = car("red", "vaz", "Mike"); 
    write(car1.who());	
	
    car car2 = car("green", "mers", "Nik");
    write(car2.who());		
    write(car2.mark);
	
    return 0;
}

Результат:

vaz red
mers green
mers

Метод create играет роль конструктора. Есть и модификаторы доступа. Но будьте осторожны с модификатором static. Мало того что он означает совсем не то, что вы подумали — он еще и depricated.

Связь с Java

А теперь дернем код Java (а почему и нет если можем?):

int main()
{
    float pi = Java.pkg.java.lang.Math.PI;
	write("Pi = " + pi + "\n");
	
	object syst = Java.pkg.java.lang.System;
	write("time = " + syst.currentTimeMillis() + "\n");
	
	object str = Java.pkg.java.lang.String("...Hello!...");	
	write((string)str.substring(3,str.length()-3) + "\n");
	
	object map2 = Java.pkg.java.util.HashMap(); 
        object key = Java.pkg.java.lang.String("oops");		
	object val = Java.pkg.java.lang.String("ha-ha");	
	map2.put(key, val);
	write((string) map2.get("oops") + "\n");
	
	object map = Java.JHashMap(([ "one":1, "two":2 ]));   
	write((string) map.get("two") + "\n");
    
  return 0;
}

Как видно из примера, обращение к классам Java идет через Java.pkg. При печати надо не забывать приводить объекты Java к строке с помощью (string). Можно вызывать обычные методы Java. Как видно из примера, для HashMap есть даже специальная конструкция для облегчения работы (что, впрочем, неудивительно).

Работа с интернетом

Скачаем страничку с интернета и выведем в консоль:

int main()
{
    Protocols.HTTP.Query web_page;
    web_page = Protocols.HTTP.get_url("https://pike.lysator.liu.se/about/");
    string page_contents = web_page->data();  
    write(page_contents);    
    return 0;
}

Щука помнит об СССР:

int main(){
    Geography.Countries.Country c = Geography.Countries.USSR;	
    write(c.name + "\n");    
    return 0;
}

Отступление от темы
(Готовя этот материал, параллельно экспериментировал с задачей определения страны по IP адресу — по своему адресу конечно. И вздрогнул когда перепутал программы и мне в ответ пришло «USSR»).

Заключение

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

Ссылки

-> Главная
-> Википедия (англ)
-> Статья об языке
-> github
-> Roxen (веб-сервер на Pike)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330638/


Метки:  

[recovery mode] Без правок. Как стать самым счастливым дизайнером на планете

Суббота, 10 Июня 2017 г. 11:21 + в цитатник


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

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

Ошибка дизайнера


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

— Это полная херня!
— Но я же все сделал, как вы сказали!
— Ты дизайнер. Не я должен тебе говорить, что делать и как.
— :(

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

Эффективные коммуникации


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

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

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

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

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

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

Как отправить макеты по почте и не облажаться


Бывают случаи, когда все-таки приходится отправлять макеты по почте. В этом случае я могу посоветовать несколько вещей:

— Обязательно описывайте процесс вашей работы. Почему вы сделали так, а не по-другому. Почему эта кнопка должна находиться именно здесь, почему она красного цвета и так далее. Это покажет, что каждое ваше решение обосновано.
— Отправьте видео. Очень просто создать анимацию в Principle, посложнее во Framer и After Effects. Было время, я создавал презентацию проекта в Apple Keynote (проект приняли).
— Перед отправкой макетов ответьте на простые вопросы, которые помогут избежать банальных ошибок. Ясна ли главная цель пользователя на каждой странице? Останавливается ли взгляд на нужных элементах и в нужной последовательности? Соблюдена ли визуальная иерархия? Соответствует ли визуальный вес элементов их роли в интерфейсе? Нет ли орфографических или пунктуационных ошибок?
— Ну и, напоследок, перечитайте задание и сверьте его с решением.

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

Еще одна вещь


Вспомните начало статьи. Клиент не доволен работой, а дизайнер считает упреки необоснованными. Почему такое происходит? Почему два профессионала своего дела конфликтуют? Быть может, потому что они попросту не понимают друг друга? Вполне может быть.

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

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

Отличной недели!
Илья
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330640/


Метки:  

Решение линейных диофантовых уравнений с любым числом неизвестных

Суббота, 10 Июня 2017 г. 04:16 + в цитатник
image
Здравствуйте, уважаемые читатели!
Продолжаю серию дилетантских статей о математике.

Сегодня предлагаю поразмышлять над некоторой интересной математической задачкой.
А именно, давайте-ка для разминки решим следующее линейной уравнение:

$5a+8b+3c+2d = 17$


«Чего сложного?» — спросите вы. Действительно, лишь одно уравнение и целых четыре неизвестных. Следовательно, три переменных есть свободные, а последняя зависит от оных. Так давайте выразим скорее! Например, через переменную $a$, тогда множество решений следующее:

$ \begin{cases}\displaystyle{ a= \frac{17-8b-3c-2d}{5}\\ b,c,d\in\mathbb{R} } \end{cases} $


где $\mathbb{R}$ — множество любых действительных чисел.
Что же, решение действительно оказалось слишком тривиальным. Тогда будем нашу задачу усложнять и делать её более интересной.
Вспомним про линейные уравнения с целыми коэффициентами и целыми корнями, которые, собственно, являются разновидностью диофантовых уравнений. Конкретно — наложим на наше уравнение соответствующие ограничение на целочисленность коэффициентов и корней. Коэффициенты при неизвестных у нас и так целые ($5; 8; 3; 2; 17$), а вот сами неизвестные необходимо ограничить следующим:

$ a,b,c,d \in \mathbb{Z} $


где $\mathbb{Z}$ — множество целых чисел.
Теперь решение, полученное в начале статьи, «не проканает», так как мы рискуем получить $a$ как рациональное (дробное) число. Так как же решить это уравнение исключительно в целых числах?
Заинтересовавшихся решением данной задачи прошу под кат.

А мы с вами продолжаем. Попробуем произвести некоторые элементарные преобразования искомого уравнения:

$5a+8b+3c+2d = 17\\ \Leftrightarrow 5a+8b+2(c+d)+c = 17$


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

$c+d = t \Rightarrow \\5a+8b+2(c+d)+c = 17 \Leftrightarrow 5a+8b+2t+c = 17$


Опа, мы с вами достигли интересного результата! Коэффициент при $c$ у нас сейчас равен единице, а это значит, что мы с вами можем выразить эту неизвестную через остальные неизвестные в этом уравнении без всяких делений (чем грешили в самом начале статьи). Сделаем это:

$5a+8b+2t+c = 17 \Leftrightarrow c = 17-5a-8b-2t$


Обращу внимание, что это говорит нам о том, что какие бы не были $a,b,t$ (в рамках диофантовых уравнений), всё равно $c$ останется целым числом, и это прекрасно.
Вспоминая, что $c+d = t$ справедливо говорить, что $d = t-c$. А подставив заместо $c$ полученный выше результат получим:

$d = t-c = t-(17-5a-8b-2t) = 3t+5a+8b-17$


Тут мы также видим, что что какие бы не были $a,b,t$, всё равно $d$ останется целым числом, и это по-прежнему прекрасно.
Тогда в голову приходит гениальная идея: так давайте же $a,b,t$ объявим как свободные переменные, а $c,d$ будем выражать через них! На самом деле, мы уже это сделали. Осталось только записать ответ в систему решений:

$ \begin{cases}\displaystyle{ a,b,t \in \mathbb{Z}\\ c = 17-5a-8b-2t\\ d = 3t+5a+8b-17 } \end{cases} $


Теперь можно лицезреть, что в системе решений нигде нет деления, а это значит, что всегда решения будут целочисленными. Попробуем найти частное решение исходного уравнения, положив, к примеру, что $a=1;b=2;t=3$:

$ \begin{cases}\displaystyle{ a=1\\ b=2\\ t=3\\ c = 17-5*1-8*2-2*3=-10\\ d = 3*3+5*1+8*2-17=13 } \end{cases} $


Подставим в исходное уравнение:

$5*1+8*2+3*(-10)+2*13 = 17 \Leftrightarrow 17=17$


Тождественно, круто! Давайте попробуем ещё разок на другом примере?

$3a+7b-11c=1$


Тут мы видим отрицательный коэффициент, он может доставить нам изрядных проблем, так что давайте от греха избавимся от него заменой $c'=-c$, тогда уравнение будет следующим:

$3a+7b+11c'=1$


Как мы помним, наша задача сделать такие преобразования, чтобы в нашем уравнении оказалась неизвестная с единичным коэффициентом при ней (чтобы затем выразить её через остальные без любого деления). Для этого мы должны снова что-нибудь взять «за скобку», самое быстрое — это брать числа которые самые близкие к единице:

$3a+7b+11c'=1 \Leftrightarrow 3(a+b)+4b+11c'=1$


Введем замену $a+b=t_1$, тогда получим:

$3(a+b)+4b+11c'=1 \Leftrightarrow 3t_1+4b+11c'=1$


Вновь возьмем за скобку и наконец получим в уравнении неизвестную с единичным коэффициентом:

$3t_1+4b+11c'=1 \Leftrightarrow 3(t_1+b)+b+11c'=1$


Введем замену $t_1+b=t_2$, тогда:

$3(t_1+b)+b+11c'=1 \Leftrightarrow 3t_2+b+11c'=1$


Выразим отсюда нашу одинокую неизвестную $b$:

$3t_2+b+11c'=1 \Leftrightarrow b=1-11c'-3t_2$


Из этого следует, что какие бы $c',t_2$ мы не взяли, $b$ все равно останется целым числом. Тогда найдем $t_1$ из соотношения $t_1+b=t_2$:

$t_1+b=t_2 \Leftrightarrow t_1=t_2-b = t_2-(1-11c'-3t_2)\\ \Leftrightarrow t_1=4t_2+11c'-1$


Аналогичным образом найдем $a$ из соотношения $a+b=t_1$:

$a+b=t_1 \Leftrightarrow a=t_1-b = 4t_2+11c'-1 - (1-11c'-3t_2)\\ \Leftrightarrow a=7t_2+22c'-2$


На этом наша система решений созрела — мы выразили абсолютно все неизвестные, не прибегая к делению, тем самым показывая, что решение точно будет целочисленным. Также не забываем, что $c'=-c$, и нам надо ввести обратную замену. Тогда окончательная система решений следующая:

$ \begin{cases}\displaystyle{ a=7t_2-22c-2\\ b=-3t_2+11c+1\\ c,t_2 \in \mathbb{Z} } \end{cases} $



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

$a_1b_1+a_2b_2+..+a_nb_n=N$


Для его решения в целых числах необходимо выполнение следующего условия:

$N \mod GCD(a_1,a_2,..,a_n) = 0$


(где $GCD$наибольший общий делитель).
Доказательство
Доказательство в рамках этой статьи не рассматривается, так как это повод для отдельной статьи. Увидеть его вы можете, например, в чудесной книге В. Серпинского «О решении уравнений в целых числах» в §2.

Резюмируя вышесказанное, выпишем алгоритм действий для решения линейных диофантовых уравнений с любым числом неизвестных:
  1. Проверяем, а решаемо ли уравнение вообще (вышеописанным свойством $N \mod GCD(a_1,a_2,..,a_n) = 0$). Если ответ положительный — переходим к следующему пункту.
  2. Для ускорения процесса поделим все коэффициенты (включая свободный член) на их $GCD$.
  3. Избавляемся от отрицательных коэффициентов в уравнении заменой $a'_n=-a_n$
  4. Проводим серию замен (разваливая некоторые члены уравнения на суммы и объединяя их в скобки) таким образом, чтобы в конце концов один из членов уравнения был с единичным коэффициентов, и мы смогли вывести его без какого либо деления. Объявляем все переменные,
    через которые выражена оная, как свободные.
  5. Выводим остальные переменные через вышевыведенную (выводим из всех наших замен), не забывая также про обратные замены.
  6. Объединяем все в единую систему решений.


В заключение стоит сказать, что также можно добавить ограничения на каждый член уравнения в виде неравенства на оного (тогда к системе решений добавляется система неравенств, в соответствии с которой нужно будет скорректировать ответ), а также добавить ещё чего-нибудь интересное.

С вами был Петр,
спасибо за внимание.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330632/


Метки:  

Redux: попытка избавиться от потребности думать во время запросов к API, часть 2

Суббота, 10 Июня 2017 г. 03:37 + в цитатник

Мы хотим создать пакет, который позволит нам избавиться от постоянного создания однотипных reducer'ов и action creator'ов для каждой модели, получаемой по API.


Первая часть — вот эта вот статья. В ней мы создали конфиг для нашего будущего пакета и выяснили, что он должен содержать action creator, middleware и reducer. Приступим к разработке!


Action Creator


Начнем мы с самого простого — action creator'а. Тут наш вклад будет минимальным — нам нужно просто написать традиционный action creator для redux-api-middleware с учетом нашего конфига.


Для получения юзеров он должен выглядеть приблизительно так:


    import {CALL_API} from 'redux-api-middleware';

    const get = () => ({
        [CALL_API]: {
             endpoint: 'mysite.com/api/users',
             method: 'GET',
             types: ['USERS_GET', 'USERS_SUCCESS', 'USERS_FAILURE']
         }
    });

В action можно добавить еще headers, credentials. Если запрос успешен, то мы получаем USERS_SUCCESS, и у него в action.payload лежат полученные по API данные. Если произошла ошибка, — получаем USERS_FAILURE, у которого в action.errors лежат ошибки. Все это подробно описано в документации.


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


    import {CALL_API} from 'redux-api-middleware';

    const initGet = (api) => (entity) => ({
        [CALL_API]: {
             endpoint: api[entity].endpoint,  // endpoint мы будем брать из конфига
             method: 'GET',
             types: api[entity].types  // и actions мы будем брать из конфига
         }
    });

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


    import {CALL_API} from 'redux-api-middleware';

    const initGet = (api) => (entity, params) => ({
        [CALL_API]: {
             endpoint: `${api[entity].endpoint}${objectToQuery(params)}`,
             method: 'GET',
             types: api[entity].types
         }
    });

Инициализируем сам creator:


const get = initGet(config.api);

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


Reducer


Точнее, два. Один будет класть в store сущности, а другой — время их прихода. Хранить их в одном месте — плохая идея, ведь тогда мы будем смешивать чистые данные с локальным состоянием приложения на клиенте (ведь время прихода данных у каждого клиента свое).


Тут нам понадобятся те же successActionTypes и react-addons-update, который обеспечит иммутабельность store. Тут нам надо будет пройтись по каждой сущности из entities и сделать отдельный $merge, то есть, совместить ключи из defaultStore и receivedData.


    const entitiesReducer = (entities = defaultStore, action) => {
        if (action.type in successActionTypes) {
            const processedData = {};
            const receivedData = action.payload.entities || {};
            for (let entity in receivedData) {
                processedData[entity] = { $merge: receivedData[entity] };
            }
            return update(entities, processedData);
        } else {
            return entities;
        }
    };

Аналогично для timestampReducer, но там мы будем устанавливать текущее время прибытия данных в store:


        const now = Date.now();
        for (let id in receivedData[entity]) {
            entityData[id] = now;
        }
        processedData[entity] = { $merge: entityData };

schema или lifetime, successActionTypes понадобятся нам при инициализации — аналогичный код мы писали в action creator'е.


Чтоб получить defaultState, сделаем так:



    const defaultStore = {};
    for (let key in schema) {  // или lifetime, для второго reducer'а
        defaultStore[key] = {};
    }

successActionTypes можно получить из конфига api:


    const getSuccessActionTypes = (api) => {
        let actionTypes = {};
        for (let key in api) {
            actionTypes[api[key].types[1]] = key;
        }
        return actionTypes;
    };

Это, конечно, задача простая, но один такой простой reducer сэкономит нам кучу времени на написании своего reducer'а для каждого типа данных.


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


Middleware


Напомню, что мы считаем, что к нам приходят сразу нормализованные данные. Тогда в middleware мы должны пройтись по всем данным, полученным в entities, и собрать список id отсутствующих связанных сущностей, и сделать запрос к API за этими данными.


    const middleware = store => next => action => {
        if (action.type in successActionTypes) {  // Если это action, в котором пришли данные
            const entity = successActionTypes[action.type];  // Определяем тип данных
            const receivedEntities = action.payload.entities || {};;  // Достаем пришедшие сущности
            const absentEntities = resolve(entity, store.getState(), receivedEntities);  // Находим отсутствующие
            for (let key in absentEntities) {
                const ids = absentEntities[key];  // Получаем список id отсутствующих
                if (ids instanceof Array && ids.length > 0) {  // Если список не пустой
                    store.dispatch(get(key, {id: ids}));  // Отправляем action, который идет за этими и только этими данными
                }
            } 
        }
        return next(action);
    }

successActionTypes, resolve и get нужно передавать middleware при инициализации.


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


Для простоты мы будем считать, что в store.entities хранятся наши данные. Можно и это вынести как отдельный пункт конфига, и присоединять туда reducer, но на данном этапе это неважно.


Мы должны вернуть abcentEntities — словарь такого вида:


const absentEntities = {users: [1, 2, 3], posts: [107, 6, 54]};

Где в списках хранятся id отсутствующих данных. Чтоб определить, каких данные отсутствуют, нам и пригодятся наши schema и lifetime из конфига.


Вообще, по foreign key может лежать и список id, а не один id — никто не отменял many-to-many и one-to-many relations. Это нам надо будет учесть, проверив тип данных по foreign key, и, если что, сходить за всеми из списка.


const resolve = (type, state, receivedEntities) => {
    let absentEntities = {};
    for (let key in schema[type]) {  // проходим по всем foreign key полученных
        const keyType = schema[typeName][key];  // Получаем тип foreign key
        absentEntities[keyType] = [];  // Инициализируем будущий список отсутствующих
        for (let id in receivedEntities[type]) {  // Проходим по всем полученным сущностям
            // Проверка на список
            let keyIdList = receivedEntities[type][id][key]; 
            if (!(keyIdList instanceof Array)) {
                keyIdList = [keyIdList];
            }
            for (let keyId of keyIdList) {
                // Проверяем, есть ли id в store
                const present = state.entities.hasOwnProperty(keyType) && state.entities[keyType].hasOwnProperty(keyId);
                // Проверяем, есть ли он в receivedEntities
                const received = receivedEntities.hasOwnProperty(keyType) && receivedEntities[keyType].hasOwnProperty(keyId);
                // Проверяем, не просрочены ли данные?
                const relevant = present && !!lifetime ? state.timestamp[keyType][keyId] + lifetime[keyType] > Date.now() : true;
                // Если он получен в данном action, или лежит в store и актуален, класть его в absent нет смысла
                if (!(received || (present && relevant))) {
                    absentEntities[keyType].push(keyId);
                }
            }
        }
    };

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


Заключение


В целом, все уже работает, если мы примем такие допущения:


  1. Можно обойтись без тестирования.
  2. Никто и никогда не допустит ошибку в конфигах.
  3. Данные приходят в middleware уже нормализованными.

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


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330634/


Метки:  

Наивно. Супер. Рецензия на книгу Джина Желязны «Говори на языке диаграмм»

Пятница, 09 Июня 2017 г. 22:37 + в цитатник
image

Книга "Say It With Chart" (дословно «Скажи это с помощью диаграммы») написана более 30-ти лет назад (в 1985 году!), однако и сегодня пользуется интересом. Она переведена на главные мировые языки, переиздается вновь и вновь, бизнесмены, маркетологи, аналитики считают её настольной книгой и в 2017-м.
Книгу интересно читать, в ней много полезного, но это было ожидаемо. Неожиданностью стал недостаток информации о её авторе в сети (которому принадлежит еще несколько мировых бестселлеров). О Джине Желязны нет статьи в Википедии (ни на английском, ни на русском), на запросы типа «биография Дж. Желязны» или «кто такой Дж. Желязны» выдаются бесчисленные сайты с одним и тем же текстом — аннотацией к книге «Говори на языке диаграмм». А это, согласитесь, только усиливает интерес, поэтому рецензия будет состоять из двух частей: «О книге» и «Кто такой Джин Желязны?».

О книге

image
В книге показано, как эффективно передать информацию в визуальной форме с помощью различных диаграмм, графиков и схем. Автор именно «показывает», а не просто рассказывает. Книга читается легко и на одном дыхании, потому что 80% информации в ней — это изображения — рисунки, диаграммы всех видов, примеры «хорошо и плохо», графики и таблицы. И всего около 20% объема книги — это текст — правила, примеры из практики, советы, выводы. То есть слово «пособие» в названии использовано абсолютно оправданно.

Главная идея сформулирована в самом начале:
«Работа над любой презентацией начинается с определения того, что вы хотите сказать. И лишь потом — выбор формы диаграммы и рисунка».
К этой мысли автор возвращает читателя на протяжении всей книги. Этим фактом объясняется успех книги: несмотря на то, что она написана очень давно и технологии визуализации данных шагнули далеко вперед, подход и способы остаются актуальными. Желязны признается:
«Не всегда было так, как сейчас. Я пришел в сферу визуальных коммуникаций в 1961 году до нашей эры. То есть до эры компьютеров, вычислительных и копировальных машин».
В оригинале используется игра слов: «It wasn’t always like that. I entered the field of visual communications in the year 1961 B.C. That’s Before Computers, Before Calculators, Before Copiers». B.C. = Before Christ = до рождества Христова, то есть до н.э. Before Computers, Before Calculators, Before Copiers.

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

Пособие по визуальным коммуникациям состоит из 4-х частей: выбор диаграмм, использование диаграмм, концепции и метафоры в презентации (решения в поисках проблемы) и sayit.com (использование компьютерных технологий в представлении данных).

image

Часть I — описание процесса преобразования данных в диаграммы. Читателю предлагается пройти следующий путь:
  • «отталкиваясь» от фактических данных сформулировать идею,
  • затем определить тип сравнения (все идеи могут быть показаны с помощью 5-ти типов сравнений),
  • исходя из типа сравнения, выбрать тип диаграммы.

Джин Желязны уточняет:
«Тип диаграммы определяют вовсе не данные (доллары или проценты) и не те или иные параметры (прибыль, рентабельность или зарплата), а ваша идея — то, что вы хотите в диаграмму вложить».

Формулировка того, что вы хотите сказать, должна быть краткой и четкой. Главный посыл — заголовок презентации или диаграммы — сравним с заголовком статьи в газете или журнале. Ошибочны заголовки диаграмм типа «Количество контрактов, заключенных с января по август» (констатируют факт, вывод нужно делать зрителям самостоятельно). Хороший заголовок должен указывать на суть изображения, например, «Количество контрактов выросло» (констатируют вывод).

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

image

В п. 1.3. первой части «Выбор диаграмм» подробно рассмотрены все 5 основных видов диаграмм: круговая, линейчатая, гистограмма, график и точечная; их варианты и примеры использования. Некоторые рекомендации сегодня кажутся «прописными истинами», хотя, возможно, именно в этой книге они и были прописаны впервые:
  • Круговая диаграмма – самый непрактичный тип диаграмм.
  • Помещать на круговой диаграмме не более 6-ти компонентов, в идеале – 5 самых важных, остальные сгруппировать в один сектор с названием «прочее».
  • Самый главный сектор круговой диаграммы должен идти от линии 12-ти часов циферблата (сверху вправо), он должен быть самым контрастным.
  • Не использовать на линейчатой диаграмме и гистограмме одновременно подписи на шкале и у столбца.
  • На диаграммах использовать целые числа, избегая дробей.
  • Координатная сетка не должна быть яркой. «Координатная сетка как линии футбольного поля; нужны, чтобы судьи могли выполнять свои функции, а не чтобы привлекать внимание зрителей».


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

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

Часть II посвящена использованию 5 типов диаграмм для передачи соответствующих идей. На 44 страницах автор последовательно комментирует и подробно разбирает 80 примеров диаграмм разного вида. Материал помогает углубиться в перечисленные в первой части типы визуализации данных. Автор приводит иллюстрации (примеры диаграмм), комментирует их, сравнивает с другими.

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

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


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

Часть III «Концепции и метафоры в презентации (Решения в поисках проблемы)» — 50 страниц рисунков, схем, моделей визуализации процессов, отношений, движения, взаимодействия с минимумом текста (заголовки и редкие, краткие пояснения). Все эти «визуальные решения проблем коммуникации» разделены на две группы: визуальные концепции (абстрактные фигуры) и визуальные метафоры (предметы окружающего мира). Это готовый набор изображений для использования в докладах, презентациях или статьях — достаточно наполнить нужную своим содержанием.

В части IV речь идет о том, «как разработать наглядные пособия для презентации на компьютере».
Полезными в компьютерной презентации Джин Желязны считает эффекты анимации, движения элементов, цветные фото, звуки, видео и ссылки. Главные плюсы (по сравнению с «доинтернетовскими» печатными материалами) — скорость создания графической работы и возможность внести изменения в считанные минуты (прямо на месте, где будет проходить презентация или по дороге к нему). Минусы — это технические сложности (необходим проектор, экран и др.) и «ощущение того, что выступающий пускает пыль в глаза, и его заботит больше форма, а не содержание информации».

Перечислены правила хорошей презентации (например, «чем крупнее, тем лучше»). Отдельный параграф рассуждений о цвете в презентации: «используйте цвет по назначению, а не для красоты»; назначения цвета — выделить нужные элементы, обозначить лейтмотив (один параметр на разных слайдах одним и тем же цветом), изобразить символически (использовать символическое значение цвета).

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

image

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

Кто такой Джин Желязны?

image

Недосказанность книги заставила меня пойти за этим человеком со шпагой и сделать еще несколько открытий.

На его персональном сайте говорится, что он работает директором по визуальным коммуникациям в McKinsey & Company (консалтинговая фирма существует с 1926 года!), выступает с лекциями и тренингами в ведущих бизнес-школах Америки и Европы. Его книги: «Говори на языке диаграмм» (Say It With Charts), «Говори на языке презентаций» (Say It With Presentations), сейчас идет работа над «Говори на языке воображения» (Say It With Imagination).

image

Интересно противопоставление взглядов Дж. Желязны и Эдварда Тафти.
Желязны защищает PowerPoint и доказывает, что инструмент может быть очень полезным в визуальной коммуникации. Он пишет:
«Думаю, что все вы знаете о жарких спорах экспертов бизнес-коммуникации вокруг PowerPoint. Наверное, нет другого такого софта, вокруг которого было бы столько эмоций. Иногда даже кажется, что противники застрелят друг друга пунктами списков (bullet points — «пули пункты»). Громче всех, конечно, «выстрелы» критиков. Один из главных, профессор Университета Йеля Эдвард Тафти, утверждает, что PowerPoint провоцирует людей на создание пошлого, тривиального контента и сильно «засоряет» серьёзную коммуникацию. «Совещания должны фокусироваться на кратких письменных отчетах на бумаге, а не на тезисах или обрывочных пунктах списка, проецируемых на стену», — считает Тафти в своей работе «Когнитивный стиль PowerPoint».
Далее Желязны доказывает пользу самой популярной программы для создания презентаций, приводя свой вариант визуализации карты похода Наполеона на Москву (Charles Joseph Minard (1781–1840)) — той самой карты, которую Тафти называет одним из лучших примеров информационной графики, — сделанные в PowerPoint.

image

image

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

У него есть книга мемуаров «В одно мгновение» (In The Moment), в которой он делится эпизодами своей жизни.
Вступление к книге:
«Если бы вы были восьмилетним ребёнком и видели, что ваших друзей куда-то забирают нацисты, то вы бы подумали, что Париж — это плохое место пребывания в 1942 году. Если бы вы носили Звезду Давида, то так оно и было. Переход от измученной Европы к энергичной, трепещущей Америке также не всегда воспринимался легко. Школа в Бронксе (на уличный манер «Da Bronx»), колледж, служба в ВВС и, наконец, корпоративная Америка — мир крупного бизнеса. Большие шаги и отсутствие матери, которая могла бы вести тебя. Для начала Жанно стал Джином, автором этих сверкающих, разоблачающих, дерзких, тонких, мудрых, острых, терпимых, любопытных, гениальных, грустных и веселых, хитрых и прямолинейных эссе без границ. Джин, мы готовы развлекаться и удивляться всему тому, что ты должен сказать, и неизменно восхищаться твоими идеями».

Джин Желязны — визуал во всех сферах жизни и проявлениях. Кроме его знаменитых книг, подтверждением тому является его хобби — коллекционирование необычных наборов шахматных фигур. У него десятки шахматных наборов неожиданной формы.

image
image

В этом увлечении очевидна его любовь к геометрическим формам, восхищение линиями, наблюдательность и юмор — все то, что свойственно истинному художнику и творцу.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330630/


Метки:  

SQL Server Integration Services (SSIS) для начинающих – часть 1

Пятница, 09 Июня 2017 г. 20:30 + в цитатник


SSIS – это инструмент, который позволяет в удобном виде реализовать интеграцию, т.е. реализовать процесс переноса данных из одного источника в другой. Этот процесс иногда называют ETL (от англ. Extract, Transform, Load – дословно «извлечение, преобразование, загрузка»).

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

Дальше будет очень много картинок!

Необходимые инструменты для изучения SSIS


В данной статье SSIS будет рассматриваться на примере SQL Server 2014 Developer Edition. Службы Integration Services доступны в SQL Server 2014 начиная с редакции Standard.

Дополнительно необходимо будет скачать и установить инструмент разработчика SQL Server Data Tools (SSDT).

SSDT – это расширение для Visual Studio, которое позволит создавать проекты необходимого нам типа.

Для облегчения процесса установки, я воспользуюсь SSDT для Visual Studio 2012 (VS2012), его можно скачать по ссылке (файл «SSDTBI_VS2012_x86_ENU.exe»):
www.microsoft.com/en-US/download/details.aspx?id=36843

По описанию, данная версия SSDT поддерживает следующие версии SQL Server: SQL Server 2014, SQL Server 2012, SQL Server 2008 и 2008 R2.

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

Установка SQL Server и SSDT


Первым делом установим SQL Server со всеми необходимыми компонентами.

Я все устанавливал на чистую Windows 7 SP 1 (x64), ничего дополнительного кроме указанного ниже устанавливать не придется.

Т.к. курс предназначен для начинающих, то распишу весь процесс установки подробно.

Запускаем установочный файл SQL Server 2014:




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

Т.к. мне в дальнейшем понадобится Analysis Services (SSAS), то я отметил и его, если он вам не нужен вы можете не выбирать данный компонент.

У меня нет других установленных SQL Server, и я сделаю этот экземпляр используемым по умолчанию:


Сделаю, чтобы SQL Agent запускался автоматически:


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


Установлю смешанный режим аутентификации, указав свой пароль для пользователя sa:


Т.к. я еще выбрал Analysis Services, то делаю настройки для него:


Нажимая Next и Install запускаем установку SQL Server и его компонент.

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

Следующим шагом установим SSDT – это расширение для Visual Studio, которое даст нам возможность создавать проекты SSIS. Установщик SSDT ставит минимальную версию оболочки VS, поэтому предварительно устанавливать VS отдельно нет надобности.

Запускаем «SSDTBI_VS2012_x86_ENU.exe», и добравшись до следующего шага выбираем следующий пункт:


Нажимая Next запускаем установку.

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

Это все, что нам понадобится для изучения SSIS.

Создание демонстрационных баз данных


Запустим SQL Server Management Studio (SSMS) и при помощи скрипта создадим 3 базы данных – первые две (DemoSSIS_SourceA и DemoSSIS_SourceB) будут выступать в роли источников данных, а третья (DemoSSIS_Target) в роли получателя данных:
-- первая БД выступающая в роли источника данных
CREATE DATABASE DemoSSIS_SourceA
GO

ALTER DATABASE DemoSSIS_SourceA SET RECOVERY SIMPLE 
GO

-- вторая БД выступающая в роли источника данных
CREATE DATABASE DemoSSIS_SourceB
GO

ALTER DATABASE DemoSSIS_SourceB SET RECOVERY SIMPLE 
GO

-- БД выступающая в роли получателя данных
CREATE DATABASE DemoSSIS_Target
GO

ALTER DATABASE DemoSSIS_Target SET RECOVERY SIMPLE 
GO

В базах источниках создадим тестовые таблицы и наполним их тестовыми данными:
USE DemoSSIS_SourceA
GO

-- продукты из источника A
CREATE TABLE Products(
  ID int NOT NULL IDENTITY,
  Title nvarchar(50) NOT NULL,
  Price money,
CONSTRAINT PK_Products PRIMARY KEY(ID)
)
GO

-- наполняем таблицу тестовыми данными
SET IDENTITY_INSERT Products ON

INSERT Products(ID,Title,Price)VALUES
(1,N'Клей',20),
(2,N'Корректор',NULL),
(3,N'Скотч',100),
(4,N'Стикеры',80),
(5,N'Скрепки',25)

SET IDENTITY_INSERT Products OFF
GO

USE DemoSSIS_SourceB
GO

-- продукты из источника B
CREATE TABLE Products(
  ID int NOT NULL IDENTITY,
  Title nvarchar(50) NOT NULL,
  Price money,
CONSTRAINT PK_Products PRIMARY KEY(ID)
)
GO

-- наполняем таблицу тестовыми данными
SET IDENTITY_INSERT Products ON

INSERT Products(ID,Title,Price)VALUES
(1,N'Ножницы',200),
(2,N'Нож канцелярский',70),
(3,N'Дырокол',220),
(4,N'Степлер',150),
(5,N'Шариковая ручка',15)

SET IDENTITY_INSERT Products OFF
GO

Создадим таблицу в принимающей базе:
USE DemoSSIS_Target
GO

-- принимающая таблица
CREATE TABLE Products(
  ID int NOT NULL IDENTITY,
  Title nvarchar(50) NOT NULL,
  Price money,
  SourceID char(1) NOT NULL, -- используется для идентификации источника
  SourceProductID int NOT NULL, -- ID в источнике
CONSTRAINT PK_Products PRIMARY KEY(ID),
CONSTRAINT UK_Products UNIQUE(SourceID,SourceProductID),
CONSTRAINT CK_Products_SourceID CHECK(SourceID IN('A','B'))
)
GO

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


Запустим Visual Studio 2012 и выберем один из видов предлагаемой нам настройки среды, так здесь же я откажусь от локальной документации:


Создадим новый проект (File -> New -> Project…):


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


То же самое сделаем в свойствах пакета, который создался по умолчанию:


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

Создадим соединения:






Заполняем параметры соединение с БД:

Боевые параметры соединения в дальнейшем можно будет настроить при создании задачи SQL Server Agent.



Для удобства я переименую название соединения на SourceA:


Таким же образом создадим и переименуем соединения для баз DemoSSIS_SourceB и DemoSSIS_Target:


Переименуем пакет, созданный по умолчанию, в «LoadProducts.dtsx»:


Сначала напишем простую логику, которая будет полностью очищать таблицу Products в базе DemoSSIS_Target и снова загружать в нее данные из двух баз данных DemoSSIS_SourceA и DemoSSIS_SourceB.

Для очистки воспользуемся компонентом «Execute SQL Task», который мы при помощи мыши создадим в области «Control Flow»:


Для наглядности можно переименовать название компонент. Зададим ему имя «Delete All Products From Target»:

Для этой цели используется свойство Name.

Дважды щелкнем на этом элементе и пропишем следующие свойства:


Т.к. TSQL команда «TRUNCATE TABLE Products» ничего не возвращает оставим свойства ResultSet равным None.

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

Теперь скинем в область «Control Flow» компонент «Data Flow Task» и переименуем его в «Load Products From Source A», а также протянем к этому компоненту зеленную стрелку от «Delete All Products From Target»:


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

Щелкнув дважды на «Load Products From Source A» мы попадаем в область «Data Flow» этого элемента.

Data Flow Task – это сложный компонент, который имеет свою область, в которой создаются вложенные элементы для работы с потоком данных.

Скинем в эту область компонент «Source Assistant»:




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

Пока воспользуемся режимом «Data access mode» равным «Table or view». Это приведет к получению всех строк из таблицы Products. Посмотреть данные можно нажав на «Preview…».

На закладке Columns мы можем выбрать только необходимые нам колонки и при необходимости переименовать их прописав новое имя в колонке «Output Columns»:


Для получателя нужна еще одна дополнительная колонка SourceID, добавим ее к выходному набору при помощи компонента «Derived Column», который переименуем в «Add SourceID», так же протянем синюю стрелку к данному элементу от «OLE DB Source»:


Дважды щелкнем по элементу «Add SourceID» и пропишем значение «A» в виде константы:

Здесь я воспользовался функцией преобразования типа (DT_STR,1,1251) для того чтобы превратить Unicode строку в ANSI.

Теперь создадим компонент «Destination Assistant»:


Направим в него поток от «Add SourceID»:


Дважды щелкнем по «OLE DB Destination» и произведем настройки:

Здесь мы показываем в какую таблицу будет записываться полученный набор.

«Keep identity» используется в случае если в принимающей таблице есть поле с флагом IDENTITY и мы хотим, чтобы значения в него тоже записывались из источника (это аналогично включению опции SET IDENTITY_INSERT Products ON).

Перейдя на закладку Mappings осуществим привязку полей источника с полями получателя:

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

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

Запускаем пакет на выполнение из Visual Studio нажав Start или клавишу F5:


Так же пакет можно выполнить, воспользовавшись командой из контекстного меню:


При помощи «Set as StartUp Object» можно задать пакет, который будет запускаться по нажатию на Start (F5).

Какой пакет будет запускаться при нажатии на Start (F5) можно переопределить в свойствах проекта:

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

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

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

В случае наличия ошибок их можно будет увидеть вкладке Progress.

Нажмем на ссылку «Package execution completed…» или на кнопку «Stop Debugging» расположенную на панели инструментов для остановки выполнения пакета.


Выполним запрос:
USE DemoSSIS_Target
GO

SELECT *
FROM Products

И убедимся, что данные были записаны в принимающую таблицу.

Перейдем в область «Control Flow» и создадим еще один компонент «Data Task Flow», который назовем «Load Products From Source B», протянем на него зеленную стрелку от «Load Products From Source A»:


Двойным щелчком зайдем в область «Data Flow» этого элемента и создадим «Source Assistant»:


Дважды щелкнув на этом элементе, настроим его по-другому:

Выберем режим «SQL command» и пропишем следующий запрос:
SELECT
  ID SourceProductID,
  'B' SourceID,
  Title,
  Price
FROM Products

Дальше сразу создадим компонент «Destination Assistant» и протянем на него синюю стрелку от «OLE DB Source»:




Двойным щелчком зайдем в редуктор этого элемента и настроим его:




Запустим проект на выполнение и убедимся, что данные с двух источников попали в таблицу в базе Target:

USE DemoSSIS_Target
GO

SELECT *
FROM Products



Дополнительно в контекстном меню стрелки можно активизировать «Data Viewer»:


Теперь при запуске пакета на выполнение в этой точке будет сделана остановка и нам будут показаны данные этого потока:

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

Для отключения этой функции в контекстном меню стрелки выбираем «Disable Date Viewer»:


Для первой части думаю этого будет достаточно.

Создадим сборку:


В результате мы получим файл «C:\SSIS\SSISDemoProject\bin\Development\SSISDemoProject.ispac».

Рассмотрим каким образом делается развертывание этого проекта на SQL Server.

Развертывание SSIS


Все последующие действия будем делать в SSMS.

Создание каталога SSISDB:

Здесь вводим любой пароль.

Теперь создаем папку, в которой будет располагаться наш проект:


Разворачиваем сам проект:








В завершении мы должны увидеть следующую картину:


После обновления (F5) мы увидим наш проект:


Создание задачи в SQL Server Agent


Создадим задачу в SQL Agent, для выполнения пакета по расписанию:


Создаем новый шаг:


На вкладке «Configuration -> Parameters» можно задать параметры пакета (их рассмотрим в следующих частях).

На вкладке «Configuration -> Connection Manager» мы можем изменить параметры подключения для каждого соединения, которое мы создали в проекте:


На закладке Advanced можно изменить логику, которая будет использоваться при успешном или неуспешном завершении шага:


Шаг создан:


Осталось создать расписание для данной задачи:


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


Все, задача создана.

Делаем тестовый запуск:

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

Результат выполнения задачи можно увидеть в следующем журнале:

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

Более подробный отчет о выполнении пакета можно посмотреть при помощи следующего отчета:






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


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

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

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

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

Хороших выходных! Удачи!

Продолжение следует…
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330618/


Метки:  

Security Week 23: EternalBlue портировали на Win10, ЦРУ атакует с файлсерверов, маркетологи незаметно заразили весь мир

Пятница, 09 Июня 2017 г. 19:58 + в цитатник
Приключения EternalBlue продолжаются: теперь исследователи из RiskSense портировали его на Windows 10. На первый взгляд это деструктивное достижение, однако же, именно в этом состоит немалая часть работы исследователя-безопасника. Чтобы защититься от будущей угрозы, сначала надо эту угрозу создать и испытать, причем крайне желательно сделать это раньше «черных шляп».

Ранее RiskSense разработали EternalBlue-модуль для Metasploit, который отличается от оригинала тем, что его гораздо хуже детектят IDS. Из него выкинули имплант DoublePulsar который слишком хорошо изучен и не особо умеет скрываться на машине, демаскируя атаку. Вместо него исследователи разработали собственный шеллкод, который способен загрузить нужную нагрузку напрямую.

Исходный EternalBlue, как и его модуль для Metasploit, работает лишь на Windows 7 и Windows XP, а также на Windows Server 2003/2008 R2. В своем отчете компания подробно анализирует все цепочку багов, используемых эксплойтом, и из документа видно, что к подобной атаке уязвимы все системы на базе ядра NT – однако выручают защитные технологии, часть из которых EternalBlue обходить умеет, часть – не очень.

Старший аналитик компании Шон Диллон высказался в духе, что атаки такого типа (heap spray) на ядро Windows – «почти чудо», настолько трудоемка их разработка, в отсутствие доступных исходников ОС. Поэтому такую же атаку для Linux разработать было бы проще.

Исследователи же создали версию, успешно атакующую Windows 10 x64 версии 1511 (Threshold 2), для чего понадобилось разработать новый способ обхода DEP. Особо отмечено, что на других версиях Win10 новый эксплойт не работает. Но принцип атаки понятен, понятна и его широкая применимость. Ждем волны WannaCry под Windows 10?

Опубликована документация на имплант ЦРУ для заражения сетей

Новость. Американское разведсообщество все больше «радует» мировое сообщество информационной безопасности. То ли АНБ соревнуется с ЦРУ в эдаком хитром пиаре, то ли в обеих организациях завелись последователи Сноудена – столь же идейные, но, все же, более осторожные.

В прошлый четверг на WikiLeaks появилась публикация о разработанном в ЦРУ импланте, превращающем файлсервер под Windows в точку распространения вредоносных программ по локальной сети. Инструмент, скромно названный Pandemic, подменяет запрашиваемые машинами с файлсервера файлы троянизированными версиями. Согласно документации, Pandemic 1.1 умеет подменять до 20 различных файлов объемом до 800 Мб.

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

Очевидно, заражение машины-клиента происходит в том случае, если файл с сервера будет запущен, то есть в первую очередь опасны исполняемые файлы. Однако нельзя исключать применение Pandemic с эксплойтами, например, для Microsoft Office – в этом случае заражение будет распространяться и через документы.


Китайский зловред заразил 250 миллионов компьютеров по всему миру

Новость. Исследование. Пекинское маркетинговое агентство Rafotech продемонстрировало блестящий пример беспощадного китайского маркетинга. Не само – ему помогли ребята из CheckPoint, вскрывшие нехилую кампанию Fireball. Современный маркетинг не может без биг даты – клиента надо знать лучше, чем его мама. Поэтому бигдату нужно собирать, как можно быстрее и больше.

Rafotech придумала собирать ее с помощью троянца. Зловред Fireball заражает компьютер жертвы очень простыми методами – его устанавливают более-менее легитимные программы (так называемое crapware) самой Rafotech и ее коллег, также его можно получить в спаме. Казалось бы, не самые мощные каналы распространения, однако же, по данным CheckPoint, троянец инфицировал более 250 миллионов компьютеров по всему миру.

Первым делом Fireball заменяет установленный в браузере поисковик на поддельный, который перенаправляет запросы в Yahoo или Google но при этом прилежно собирает информацию для своих владельцев. Помимо этого Fireball умеет все, что может понадобиться честному китайскому маркетологу: запускать произвольный код, загружать и устанавливать из Интернета любой софт, манипулировать веб-траффиком пользователя так, чтобы генерировать просмотры рекламы. Технически Fireball продвинут не хуже своих более знаменитых ботнетов – он отлично умеет избегать обнаружения (что доказывает масштаб распространения), и имеет гибкую инфраструктуру управления и контроля.



На своем сайте Rafotech заявляет, что ею «охвачено более 300 миллионов пользователей». Ну, теперь мы знаем, что это похоже на правду. Таки охвачено. Однако тревожит, что речь не только об индивидуальных пользователях – в CheckPoint посчитали, что Fireball поражены 20% корпоративных систей в мире. Потенциально это дает боевым маркетологам поистине устрашающие возможности, и не только по показу рекламы.

Древности


«Find-1575»

Неопасный резидентный вирус. Записывается в COM- и EXE-файлы при их старте и при поиске файлов в каталогах (функции DOS FindFirst и FindNext FCB). При некоторых условиях по экрану начинает ползать «зеленая гусеница». Перехватывает int 1Ch, 21h

Цитата по книге «Компьютерные вирусы в MS-DOS» Евгения Касперского. 1992 год. Страницa 67.

Disclaimer: Данная колонка отражает лишь частное мнение ее автора. Оно может совпадать с позицией компании «Лаборатория Касперского», а может и не совпадать. Тут уж как повезет.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330626/


Метки:  

О новых интересных законах или «Тварь ли я дрожащая или всё-таки сообщество»

Пятница, 09 Июня 2017 г. 19:38 + в цитатник
image

Данный пост навеян недавними постами о запрете VPN, TOR и прочих «средств обхода блокировок» (тут и тут), о мессенджерах и вообще всё растущим интересом властьпридержащих к тотальному контролю над мнениями, умами и жизнями. Даже не столько постами навеян, сколько комментариями к ним.

Кто-то предлагает «заводить трактор», кто-то предлагает выходить на митинги, кто-то ничего не предлагает, а просто ругает власть, которая в очередной раз спокойненько всех нагнула (ещё нет, но, думаю, все согласятся, что все эти законы примут и будут новые, ещё интереснее).

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

Я всего лишь предлагаю вспомнить что мы здесь, все собравшиеся — "сообщество IT-профессионалов". И все вышеуказанные проблемы растут из/затрагивают/используют нашу сферу. И мы можем хотя бы попытаться решать проблему внутри сообщества.

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

И одним из возможных решений или хотя бы попыткой решения было бы следующее:

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


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

Что мы можем сделать



  1. Образование — доносить со студенческой скамьи, что IT — это иногда большая ответственность. Что ты можешь или помогать ущемлять конституционные права населения вообще и сообщества в частности, или быть частью сообщества, но не играть за обе команды сразу. Те, кто имеет отношение к образованию, преподаватели ВУЗов и курсов, спикеры конференций и семинаров, рекрутеры, вербующие старшекурсников — это прежде всего ваша ответственность.
  2. Управление — принимать соответствующие решения, когда к вам на работу приходит устраиваться «коллаборационист». Это сфера ответственности управленцев и кадровиков.
  3. Информация — распространять соответствующую информацию, списки, резюме и т.п. Это работа сообщества в целом, тут каждый может помочь. Особенно те, кто имеет отношения к СМИ, имеет блоги, твиттеры, каналы, стримы и прочие орудия воздействия на широкие массы.
  4. Те специалисты, которые работают на условного врага — отказываться от исполнения идиотский указаний вплоть до увольнения. Со своей стороны сообщество должно оказывать поддержку тем, кто отказался работать против сообщества и общества в целом. В нашей сфере всегда есть нехватка специалистов и сообщество вполне может помочь с трудоустройством таким людям.


У IT есть огромное преимущество перед многими другими отраслями. У нас замкнутое и (сравнительно) не слишком уж многочисленное сообщество. И любые законы, которые принимаются для/против сообщества, реализуются руками членов сообщества. Если Равшан откажется строить шлагбаум для «Платона» (история с борьбой дальнобойщиков), на его место придёт Джамшут и ещё сотни тысяч других.

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

Кстати, крупные компании заинтересованы в этом как минимум не меньше, чем другие, потому что такие вещи зачастую или ограничивают их в чём-то, или выжимают с рынка (https://geektimes.ru/post/278362/), или просто заставляют оплачивать фантазии депутатов. Кроме крупных компаний, в этом также заинтересованы провайдеры, которые также часто платят из своего кармана за любые несуразицы (СОРМ).

Работа с возражениями



Дискриминация при приёме на работу запрещена.


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

Да что мы можем? Мы же просто программисты… ничего не получится… злое правительство… вот если бы кто-то… досиделись… нет, мне ребёнка ещё из садика забирать...


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

Ой не, лучше сесть на трактор/пойти на митинг


Одно другому совершенно не мешает и вполне может работать параллельно.

Я не в России, мне пофик


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

Я за блокировки, они спасают меня от террористов, делают мой интернет чище, а мою кожу — нежной и шелковистой


Очень хотелось бы посмотреть, сколько террористов удалось наловить на нашей планете благодаря блокировкам и запретам в Интернете. Вообще, перефразируя известное изречение «если бы терроризма не было, его бы стоило выдумать» — прикрываться борьбой с терроризмом очень удобно, можно протащить любые законы, а несогласных объявить пособниками. Террористы давно и успешно обходят любые блокировки, а блокировки делают для управления толпой, ограничения доступа к «ненужной» информации и вычисления тех, кому такая информация интересна. А незащищённый, например, VPN'ом (который хотят запретить) трафик некоторые провайдеры разбавляют своей рекламой, собирают личные данные и проч. и проч. Более того, пока кто-то всерьёз верит в заблуждение, что блокировки способны защитить от терроризма, занижается уровень опасности («у нас блокировки, нам не страшно»), чем пользуются эти самые террористы. Ну и отличная цитата от Франклина, которая себя уже давно оправдала: "Те, кто готовы пожертвовать свободой ради безопасности, не достойны ни свободы, ни безопасности". Дайте им защищать вашу безопасность ценой вашей свободы и скоро вы станете просто бесправным домашним животным.

Убивают не пули, а люди. Программисты не виноваты, виноваты депутаты.


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

Хэппи энд Вместо послесловия


Поддерживать данную инициативу или нет — это личное дело каждого. Но ясно одно — уже назрело время сообществу IT-профессионалов становиться действительно сообществом, поднимать дискуссии, начинать диалог с властью, где-то даже не словом, а делом показывать несогласие, самостоятельно выражать своё мнение, которое у нас никто не хочет спрашивать. Привлекать в дискуссию специалистов из других областей — юристов, социологов, экономистов. То, с чем мы сейчас столкнулись — это большой гнойник. Это не просто очередной депутатский фортель, это комплексная проблема — проблема нарушения конституционных прав, проблема некомпетентности власти, проблема отсутствия диалога власти и экспертов, проблема экономических просчётов, проблема ущемления бизнеса всех размеров для реализации этих фантазий. В дальнейшем эти проблемы будут усугубляться проблемами оттока квалифицированных кадров (судя по шуму заведённых тракторов), а это уже — настоящая проблема информационной безопасности и удар по экономике.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330610/


Метки:  

[Из песочницы] Русскоязычная спецификация языка Java

Пятница, 09 Июня 2017 г. 19:17 + в цитатник
Столкнулся я с необходимостью перевода материала, касающегося языка Java. Причем, перевод должен быть сделан не для себя, а так сказать, для общего пользования. Поэтому, он должен быть максимально приближен к оригиналу и выполнен в соответствии с требованиями спецификации языка. Как оказалось, эти два требования не всегда означают одно и то же. Ну, во-первых, сам оригинал позволяет себе довольно вольное обращение с терминами, «но это так мелочь», а во вторых, в который раз пришлось столкнуться с разночтениями в русской трактовке Java-язычных терминов. А это, на мой взгляд, уже довольно большая и давно существующая проблема.

Начнем с того, что в языке Java существуют такие термины как operator, operation, operand и statement. В силу устоявшейся традиции, в русскоязычных переводах термин operator чаще всего переводится как «операция». Например, в первом томе Хорстмана читаем: «Операция / означает целочисленное деление». И это не единичный пример, а общепринятая практика. Хорошо, пусть в русскоязычных переводах объединены понятия operator и operation, хотя это и противоречит требованиям спецификации и словаря: «Operators are special symbols that perform specific operations on one, two, or three operands, and then return a result». Однако пойдем дальше.

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

С точки зрения спецификации: «Statements are roughly equivalent to sentences in natural languages. A statement forms a complete unit of execution» и к ним относятся все наши «операторы» в т.ч. ветвления, циклов и пр. Хотя в спецификации они именуются как statements.

Теперь прочитав, например переводную литературу, вы уже будете несколько озадачены, обратившись к первоисточникам. Но и это еще не все. Обратимся, например к оператору (или все-таки инструкции?) switch:

        switch (choice) {
            case 1: 
                     . . . .
                     break;
            case 2: 
                     . . . .
                    break;
            case 3: 
                     . . . .
                     break;
            case 4: 
                     . . . .
                     break;
            default:
                     //неверный ввод
                     break;
        }

Сможете ли вы дать определения используемым здесь понятиям: switch, choice, case n (отдельно для case и отдельно для n), default, break? Вот, например, как представляет себе это переводчик того же Хорстмана:
Выполнение начинается с метки ветви case, соответствующей значению 1 переменной choice, и продолжается до очередного оператора break или конца оператора switch.
. Лично меня формулировка
соответствующей значению 1 переменной choice
вводит в ступор, хотя, конечно, догадаться можно. Но не это главное. Тут продемонстрирована устоявшаяся традиция перевода термина statement словом «оператор», вносящая некоторую сумятицу по отношению к его англоязычному собрату. Что же касается поставленного вопроса, то вот как его трактует спецификация:

switch — statement;
choice — expression;
case — switch label;
n — case constant;
break — statement;

-> Официальная спецификация языка

Теперь о традициях перевода. Судя по всему, сложились они на заре программирования в Советсвком Союзе, и в дальнейшем кочевали из языка в язык. Насколько известно мне, первая попытка русскоязычного переводя спецификации языка Java была сделана в 1999 году. Но, опять же насколько известно мне, напечатана не была. В ней, действительно, была отдана дань устоявшимся традициям, о которых было сказано выше. Однако, в 2015 году вышел, наконец, печатный перевод. И вот здесь-то, значение терминов оказалось пересмотренным, и на мой взгляд, более соответствует официальной англоязычной спецификации. Хотя, как мне кажется, там тоже есть к чему придраться. В этом издании operator имеет значение «оператор», statement — «инструкция», ну и т.д.

Очень хотелось бы узнать мнение специалистов, поскольку вопрос, на мой взгляд, является непраздным, поскольку касается основ языка, на которых строится его фундамент и правильное понимание. Кроме того, связанные с этим вопросы могут, например, встретиться на сертификационных экзаменах, которые как известно, стараются сдавать на языке оригинала, ну и просто в общении программистов, которые могут представлять себе по разному значения тех или иных терминов. А может быть существует и официальной русскоязычное издание спецификации языка Java? В любом случае, для его выхода накопилось достаточно разночтений. Ведь все вышесказанное касается только отдельных примеров, которых несомненно гораздо больше.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330624/


Метки:  

Приглашаем на официальный мастер-класс по UE4 от Epic Games

Пятница, 09 Июня 2017 г. 18:12 + в цитатник
imageВо вторник, 13 июня, в Санкт-Петербруге, в Университете ИТМО пройдет мастер-класс по разработке игр на Unreal Engine 4, где экспертом выступит евангелист Epic Games — Шьорд де Йонг. Посетителям на выбор будет предложена одна из двух тем, которые Шьорд подготовил для выступления. В зале Шьорду будут помогать опытные разработчики на UE4.

Об эксперте


За спиной у Шьорда почти двадцать лет опыта работы в игровой индустрии. Он начинал с дизайна уровней, но со временем перешел и во многие области разработки игр, такие как гейм дизайн, рендеринг, скриптинг. Шьoрд специализируется исключительно на игровом движке Unreal Engine, с которым он работает с 1999 года и имеет весьма обширные знания о данной технологии. Он работал со всеми четырьмя поколениями движка и над семью выпущенными на нем AAA проектами, в числе которых игры серии Unreal Tournament, WarPath, Rekoil, Huxley. Шьорд является автором двух книг о разработке игр, проводит лекции и воркшопы в университетах по всему миру, а также возглавляет свою собственную студию разработки — Teotl Studios, которая в прошлом году выпустила успешный Survival Horror — The Solus Project.

Детали мероприятия:


Мастер класс проводится университетом ИТМО в рамках запуска и развития направления ITMO.GameDev, совместно с Epic Games и официальным сообществом разработчиков Unreal Engine 4. Это будет уже второе подобное мероприятие в Санкт-Петербруге. Напомним, что 8 апреля в Санкт-Петербурге состоялся первый официальный митап разработчиков UE4 при участии Sperasoft, Epic Games и официального сообщества разработчиков UE4, который собрал в одном месте более 120 человек.

Начало в 15:30. Длительность сессии — 4 часа, язык — английский. По желанию вы можете принести с собой ноутбук. Предпочтительная версия движка — 4.16 (или 4.15 с установленным плагином RenderDoc).

Место проведения:


г. Санкт-Петербург, ул. Ломоносова, д. 9, ауд. 1216/0 (актовый зал), Университет ИТМО.

Для участия в мероприятии необходимо зарегистрироваться.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330616/


Гейзенбаг 2.0: как прошла в Петербурге конференция по тестированию

Пятница, 09 Июня 2017 г. 18:02 + в цитатник


В Москве конференция Гейзенбаг уже проходила в декабре 2016-го, а теперь впервые добралась до Петербурга. Суть у Гейзенбаг 2017 Piter осталась прежней: «конференция о тестировании, но не только для тестировщиков». А изменились ли детали? Какие доклады были в этот раз? Правда ли, что Илари Хенрик Эгертер сбрил свою удивительную бороду? Ответы на все эти важнейшие вопросы — под катом.

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



Первым выступающим был Илари Хенрик Эгертер, уже знакомый зрителям московского Гейзенбага, где у него тоже был открывающий кейноут. И тех, кто запомнил его по тому выступлению (уже доступному на YouTube), прямо с утра ждал шок: вместо запомнившейся всем эпической бородищи, на отращивание которой явно ушёл не один год, у Илари теперь гораздо более скромная борода.

А Илари говорят ненастоящий - бороды то нет. Ну почти нет :) @ilarihenrik, where is your beard?#heisenbug pic.twitter.com/YCWQET07Bk

— Maxim Shulga (@maxbeard12) June 4, 2017


Однако быстро стало ясно, что это не помешало ему остаться харизматичным спикером, неутомимо тестирующим всё вокруг себя — включая саму конференцию. В начало презентации он успел добавить пару фотографий, сделанных прямо перед выступлением: Илари заметил, во-первых, что мы не успели заменить указатели с проходившей накануне конференции HolyJS, а во-вторых, что для англоговорящего спикера они выглядят довольно противоречиво. Спасибо, Илари, баг-репорт принят!



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



После Илари все разошлись по трём залам — и обо всех последовавших докладах не расскажешь, но кое-что опишем. Очень широко в программе была представлена автоматизация тестирования — что, пожалуй, логично в случае мероприятия «и для тестировщиков, и для разработчиков». И известный многим по подкасту Radio QA Алексей Виноградов, занявший главный зал после Илари, повёл речь как раз об улучшении автотестов, начав с ироничного дисклеймера: «В принципе, доклад могут понять все, потому что я говорю на русском языке, а в примерах кода будут знакомые символы от A до Z, но рассчитан он на тех, кто уже занимался автоматизацией тестирования». Другой его запоминающейся фразой стала «Горжусь тем, что после многих лет работы программистом улучшил свой уровень и смог стать тестировщиком» — действительно, пока некоторые разработчики смотрят на тестирование сверху вниз и ощущают его примитивной работой, тот же Гейзенбаг показывал, насколько это далеко от правды.



Алексей стал разбирать конкретные примеры, начав «предположим, что у нас стоит задача протестировать Amazon, и первым делом проверим авторизацию». Зрители с интересом следили за его предложениями по улучшению тестов, однако выяснилось, что не все согласны с его подходом. Как только дело дошло до вопросов из зала, микрофон оккупировал другой спикер, Николай Алименков, и стал напористо расспрашивать об опыте Алексея: работал ли он когда-либо в проектах, где автотесты писало сразу много людей, и долгосрочными ли были эти проекты?

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

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



Пока в главном зале кипели эти страсти, всё было гораздо спокойнее в третьем, где Марк Филипп рассказывал про особенности JUnit 5 (который после долгого периода Milestone-версий этим летом должен наконец дойти до релиза). У этой версии популярнейшего фреймворка интересная история появления: деньги на её прототип решили собрать с помощью краудфандинга, оплатив так работу двух разработчиков на протяжении шести недель, и удалось собрать 219% от требовавшейся суммы. Становилось интересно узнать непосредственно от главного организатора этой кампании: означает ли этот успех, что open source-сообществу вообще стоит активно использовать краудфандинг? Сам доклад был техническим, и там времени на подобные подробности не было, но в интервью для онлайн-трансляции расспросили Марка об этом. Оказалось, что краудфандинговая кампания требует приложить много сил, от разработки системы наград для участников до правильного юридического оформления. А значит, хотя рабочее время разработчиков с её помощью оплатить удалось, следует учесть, что для такого требуется и затратить немало времени.



Доклад Марка стал не единственным на конференции случаем, когда о новой версии востребованного проекта рассказывал ключевой для этого проекта человек. Артём Ерошенко рассказывал об Allure 2 — и по его словам, этот инструмент, появившийся в петербургском офисе Яндекса, всё чаще начинают использовать за рубежом (правда, обычно узнают о нём благодаря релоцировавшемуся россиянину).

А Дэн Куйаяр, на прошлом Гейзенбаге рассказавший о своём Appium и занявший третье место по оценкам зрителей, теперь снова говорил о нём, но уже под другим углом. Appium давно используется для тестирования мобильных приложений, а недавно стал поддерживать также приложения для Windows и Mac, и в выступлении был сделан акцент на этом.



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



Наконец, завершал конференцию кейноут Николая Алименкова с подробным разбором ряда паттернов проектирования (любопытно, что при интересе к ним знаменитую книгу от «Gang of Four» он назвал «хорошей для того, чтобы засыпать»). Николай, разумеется, первым делом решил разобраться с доводами Алексея Виноградова: «Поднимите руки, у кого в проекте больше трёх человек пишут функциональные автотесты. А теперь те, у кого больше пяти. Так, треть зала уверенно подняла руки! Говорите, блефуют? К сожалению, у меня нет инструмента проверить их на этот блеф».

Кто из Николая и Алексея прав? Решать вам — а мы за плюрализм мнений и за то, чтобы видеть ситуацию с разных сторон. Будем ждать вас в декабре Москве на следующем Гейзенбаге, который станет двухдневным, а на прощание покажем, что происходит, когда зовёшь выступать на конференцию специалиста по security testing из Google:

Что может сделать профессионал в безопасности (@paradoxengine) с системой управления лифтом за 5 секунд #heisenbug pic.twitter.com/gAzyNnge4H

— SQA underhood (@sqaunderhood) June 4, 2017
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330614/


[Из песочницы] Xenoblade Chronicles — разбор игровых данных

Пятница, 09 Июня 2017 г. 17:11 + в цитатник
image

Всем привет! Меня зовут Артем, в тырнетах более известен под идиотским ником TTEMMA, но не суть. Я являюсь одним из основателей любительской группы переводчиков Russian Studio Video 7 и единственным ромхакером-программистом в данной команде.

Мы с командой первые, кто смог подарить фанатам Resident Evil переводы двух культовых игр на Nintendo GameCubeResident Evil Remake и Resident Evil Zero, когда-нибудь я расскажу о том, как мы все это делали, но в данной теме я бы хотел рассказать о такой роскошной игре, как Xenoblade Chronicles на Nintendo Wii и о том, как происходил и далее происходит ромхак данной игры. В данной игре всё сделано в японском стиле, странно и в некоторых моментах просто задаёшься вопросом — «Зачем?», но потом вспоминаешь, на сколько японцы странные люди и эти вопросы отпадают. Ну что ж, начнём?

Предисловие


Xenoblade Chronicles эта та игра, из-за которой стоит, нет, даже нужно приобрести Nintendo Wii. JRPG, большой открытый мир, куча вспомогательных квестов и захватывающий сюжет, который затянет прохождение игры не на недели, а на месяца. Все, кто знаком с Nintendo Wii, знает, что консоль предназначена для слабеньких красочных семейных игр по типу Super Mario и т.п, но то, что сотворили Monolith Soft достойно похвалы, их Xenoblade Chronicles обладает прекрасной и красивой графикой, не смотря на огромные технические ограничения консоли(посоревноваться в плане графики может только Resident Evil Remake и Resident Evil Zero).

image

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

Технические нюансы


Немного расскажу о самой Wii и о том, о чем речь в данной теме не пойдёт.

Что Nintendo GameCube, что Nintendo Wii работает на процессоре от IBM с архитектурой PowerPC. Данный процессор работает в Big-Endian режиме, это важно запомнить(как по мне, хакинг файлов Big-Endian намного удобнее, чем Little-Endian из-за порядка байтов).

Благо, Nintendo сильно позаботились о разработчиках игр и в своих SDK предоставили просто огромное количество форматов для любой цели, именно о них речь в данной теме и не пойдёт. Может быть я потом и расскажу о них подробно, но моя лень вряд ли позволит. Выделить из форматов Nintendo я хочу лишь один – BRFNA (Binary Revolution Font), о нём и пойдёт дальше речь.

Шрифт


Шрифт в Xenoblade Chronicles(далее XC) хранится в стандартном, но редко используемом в играх формате с расширением BRFNA.

Существует лишь два стандартных для Wii формата шрифта:

  1. BRFNT(более популярный)
  2. BRFNA(редко используемый)

Я не буду углубляться в их структуру, а лишь расскажу о различиях:

  • В BRFNA был добавлен новый блок, хранящий в себе информацию о кодировке(ansi, kanji, european и т.д.)
  • В BRFNA текстуры с символами сжаты неизвестным мне форматов, в то время как в BRFNT они лежат в открытом виде и спокойно редактируются.

BRFNA успел доставить много проблем, во первых – неизвестный тип сжатия, во вторых – слегка странное разделение по кодировкам. Спас нас из этой ситуации, как ни странно, официальный конвертер шрифтов из 3DS SDK от Nintendo. Но и с ним появились проблемы, пришлось изучать используемые кодировки в самом XC, писать отдельные конфигурационные файлы для конвертера текстур и поиграться с настройками самого конвертера, чтобы шрифт был идентичен оригиналу. И о благо, после нескольких дней мучений я смог вывести русские буквы с использованием русских кодов символов из UTF8.

image

Правда, игра долго упиралась из-за размера нового шрифта и крашилась в самом начале загрузки игры. Сначала были подозрения, что мои кривые руки делают что-то не так, но после того, как я убрал умляуты из шрифта, то игра спокойно запустилась. Но убирать умляуты я категорически не хотел, поэтому подошёл с другой стороны, я просто изменил формат текстур c IA4(4 бита на цвет, 4 бита на прозрачность) на просто I4(4 бита на цвет, без прозрачности) и вуаля, XC взлетела как миленькая.

Почему я решил изменить именно формат текстур? Потому что могу! Ну а если честно, то это никак не ухудшило качество символов. Вывод символов в данной игре работает таким образом, что он выводит лишь альфа канал, никак не используя при этом основной канал, а вот если использовать формат шрифта без прозрачности, то ему и использовать, кроме как основной канал, нечего. Безобразие, подумал я и решил обойтись без прозрачности, чтобы не захламлять место.

На этом моменте работы со шрифтом были окончены и вычеркнуты из списка задач.

PKB\PKH – контейнеры файлов


Что-то начал я свой рассказ совсем не с того. Чтобы добраться до многих основных файлов, придётся их как-то извлечь из контейнера PKB.

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

Пример PKB
image

Самое же интересное хранится в PKH файлах, но и чтобы добраться до них придётся постараться. Все PKH файлы находятся в отдельном для каждого языка U8 архиве с именем static.arc.

STATIC.ARC английского языка
image

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

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

PKH можно поделить на 2 блока: Header и Entry, что я и сделал.

public class pkhModuleEntry
    {
        public uint ID;
        public uint unk;
        public ushort sizeFile;
        public uint offsetFile;

        public pkhModuleEntry()
        {
            ID = unk = offsetFile = sizeFile = 0;
        }

    }

public class pkhModule
    {
        uint Magic;
        uint version;
        uint tableOffset;
        uint pkhSize;
        uint countFiles;
        pkhModuleEntry[] entry;
        string[] extensions;
        ...
    }

Entry у нас начинается с указателя tableOffset. Только вот проблема в том, что entry разделено ещё на несколько блоков, загрузка всей информации о файлах происходит таким образом:

for (int i = 0; i < countFiles; i++)
            {
                entry[i] = new pkhModuleEntry();
                entry[i].ID = mainPkhSfa.ReadUInt32();
                entry[i].unk = mainPkhSfa.ReadUInt32();
            }

            for (int i = 0; i < countFiles; i++)
                entry[i].sizeFile = mainPkhSfa.ReadUInt16();

            for (int i = 0; i < countFiles; i++)
                entry[i].offsetFile = mainPkhSfa.ReadUInt32();

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

  1. Индексы файлов и неизвестные значение
  2. Размеры файлов
  3. Указатели на файлы

Можно заметить, что указатель на определённый файл хранится в uint32, то есть в 4-байтной переменной, а вот размер, почему-то, в 2-байтной. Объясню данный изъян, как я говорил выше, в PKB файлы выравнены по 2048 байт и это сделано не спроста. Размер файла указывается не в байтах, а в количестве данных блоков. К примеру, размер файла указан 0xC, следовательно размер в PKB будет 0xC * 0x800 = 0x6000.

Пример PKH
image

Изучив данную структуру был быстро наклёпан распаковщик\запаковщик и я приступил к изучение контейнеров, хранящих в себе текст.

Контейнеры с текстом


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

  1. Контейнер BDAT – хранит в себе какие-то данные и строки, приоритетно системные (меню, торговля, настройки).
  2. Контейнер SB – хранит в себе скрипты и строки с разговорами с жителями.
  3. Контейнер REV – хранит в себе данные и строки, используемые в кат-сценах.

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

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

Контейнер BDAT


image

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

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

К сожалению, Dolphin обладает хреновеньким дебаггером(либо я просто зажрался и привык к дебаггеру PCSX, где есть все возможные функции для дебагга). Мне надо было выяснить, в какой области памяти расшифровывается BDAT и поставить там брик на запись, но, Dolphin умеет ставить бряк только на команду по адресу, но на чтение\запись из опр. участка RAM не умеет, это стало проблемой. Начались поиски Dolphin с дополненными функциями для дебагга и таковой был найден — Dolphin DebugFast на основе 4 версии, в него добавлена лишь одна особенность — брик на чтение\запись в RAM, то что нужно, подумал я и приступил к дальнейшему хаку.

Найдя в памяти участок с нужными мне данными, я поставил брик и начал изучать, как же игра расшифровывает свои BDAT. Всё оказалось просто и в тоже время интересно. В BDAT есть 2 байтовый ключ, первый байт грузится в регистр R5, второй в R0 соответственно, так же есть булевая переменная, которая в начале расшифровка устанавливается в 1(true).

Если булевая переменная установлено в 1, то расшифровка происходит с помощью регистра R5, если же в 0, то расшифровка происходит с помощью регистра R0.

Шифрование же основано на простом XOR, порядок расшифровка таков:

  1. Зашифрованный байт = Зашифрованный байт ^ R(5 или 0)
  2. R(5 или 0) = (Зашифрованный байт + R(5 или 0)) & 0xFF
  3. Смена булевой переменной на противоположное значение

Код на C#:

public static void BDAT_DecryptPart(int offset, int size, ushort key, MemoryStream data)
        {
            data.Position = offset;
            int endOffset = offset + size;
            if (endOffset > data.Length)
                endOffset = (int)data.Length;

            bool reg = true;
            byte _r0 = (byte)(0xFF - (key & 0xFF));
            byte _r5 = (byte)(0xFF - (key >> 8 & 0xFF));
            byte inByte = 0;

            while (offset < endOffset)
            {
                inByte = data.GetBuffer()[offset];
                if (reg)
                {
                    data.GetBuffer()[offset] = (byte)(inByte ^ _r5);
                    _r5 = (byte)((_r5 + inByte) & 0xFF);
                    reg = false;
                }
                else
                {
                    data.GetBuffer()[offset] = (byte)(inByte ^ _r0);
                    _r0 = (byte)((_r0 + inByte) & 0xFF);
                    reg = true;
                }
                offset += 1;
            }
        }

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

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

Примерчик
Зашифрованный блок с 0x2C — 0x66.

image

Но разбор этого блока я отложил, и решил разобраться с общей структурой. Путем непростого анализа, было выявлено, что Header у нас занимает всего 0x20 байт, его структуру я описал ниже.

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

class header
    {
        public uint magic;
        public byte mode;
        public byte unk;
        public ushort offsetToNameBlock;
        public ushort sizeTableStruct;
        public ushort unkTableOffset;
        public ushort unk2;
        public ushort offsetToMainData;
        public ushort countEntryMain;
        public ushort unk3; public ushort unk4;
        public ushort cryptKey;
        public uint offsetToStringBlock;
        public uint sizeStringBlock;
        ...
   }

  • Magic — константа и всегда равна BDAT(ansi)
  • Mode — 1: нет шифрования, 3: имеется шифрование
  • unk — как понятно, неизвестно, но данный байт всегда равен нулю
  • offsetToNameBlock — указатель на зашифрованный блок с именами блоков
  • sizeTableStruct — размер одного блока со всеми данными
  • unkTableOffset — указатель на таблицу, которую до конца я разобрать не смог
  • unk2 — неизвестно, но всегда равен 0x3D
  • offsetToMainData — указатель на блок, содержащий все данные
  • countEntryMain — количество блоков по указателю offsetToMainData (размер блока MainData можно просчитать таким образом: sizeTableStruct * countEntryMain)
  • unk3 — неизвестно, всегда 0x01
  • unk4 — неизвестно, всегда 0x02
  • cryptKey — 2-х байтный ключ для расшифровки
  • offsetToStringBlock — указатель на блок с текстом
  • sizeStringBlock — размер блока с текстом(равен 0, если текста нет)

После Header до offsetToNameBlock идут неизвестные данные, как выяснилось это информация о блоках в MainData и имеет данную структуру:

class typeStruct
    {
        public byte unk;
        public byte type;
        public ushort idx;
        ...
    }

  • unk — неизвестно
  • type — тип данных
  • idx — указатель в MainData(точный указатель просчитывается таким образом: offsetToMainData + (IndexStructure * sizeTableStruct) + idx

И остался последний блок — offsetToNameBlock, он имеет такую структуру:

class nameBlock
    {
        public string bdatName;
        public nameBlockEntry[] nameEntry;

        public nameBlock(StreamFunctionAdd sfa, int countName)
        {
            bdatName = sfa.ReadAnsiStringStopByte();
            sfa.SeekValue(2);

            nameEntry = new nameBlockEntry[countName];

            for (int i = 0; i < countName; i++)
            {
                nameEntry[i] = new nameBlockEntry(sfa);
            }
        }
    }

    class nameBlockEntry
    {
        public ushort offsetToStructType;
        public ushort unk;
        public string name;
        public typeStruct type;

        public nameBlockEntry(StreamFunctionAdd sfa)
        {
            offsetToStructType = sfa.ReadUInt16();
            unk = sfa.ReadUInt16();
            name = sfa.ReadAnsiStringStopByte();

            type = new typeStruct(sfa, offsetToStructType);

            sfa.SeekValue(2);
        }
    }

Хочу выделить только переменную countName, которой нет нигде в Header, но просчитывается она путем отнимания указателя на NameBlock 0x20 и делением данного числа на 4. Объясню почему: Header кончается по адресу 0x20, NameBlock начинается далеко после Header, а как мы знаем, сразу после Header идёт информация о структурах блоков в MainData, которая занимает 4 байта на структуру. И вот чтобы узнать кол-во таких структур, нужно узнать размер только информации о структурах и поделить на их размер, то есть 4.

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

Есть блок, где хранятся все данные — MainData. Данный блок поделён на несколько блоков, количество которых описано переменной countEntryMain, а размер одного такого блока описан переменной sizeTableStruct. А вот какие данные хранятся в одном таком блоке уже описывается с помощью класса typeStruct, количество которых может быть от 1 до нескольких. Для каждой typeStruct есть название, которое храниться в nameBlockEntry.

Вот и всё, BDAT разобран был наклёпан софт для извлечения\замены текста, который успешно пашет.

Пример извлечённых строк из BDAT
image

Заключение


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

Возможно будет и продолжение разбора форматов в данной игре, но это не точно. Если понравилась моя статья, то я расскажу о том, как мы переводили Resident Evil Remake и Resident Evil Zero.

Спасибо за уделённое время!

P.S. Это моя первая статья в подобной тематике, прошу не кидаться тапками, а лучше сразу указать на ошибки. Может что-то нужное не раскрыл до конца или не объяснил, прошу указать на это, чтобы больше таких ошибок не повторилось.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330612/


Метки:  

Кодировка символов и Console

Пятница, 09 Июня 2017 г. 16:26 + в цитатник
Процессор работает на основе сигналов, эти сигналы складываются в блоки, на основе этих блоков процессор интерпретирует некие операции над этими блоками сигналов. В таком ключе все хорошо работает пока не появляется человеческий фактор, а именно человеку нужно взаимодействовать с процессором. На заре компьютеров, Человеку достаточно было отображать сигнал в виде света, если есть сигнал, «лампочка» зажглась, если нет сигнала, «лампочка» не горит, но поскольку такое взаимодействие человека и компьютера, требовало специальных знаний обозначения сигнала (что значит «лампочка» в контексте программы) решено контекст делегировать на компьютер, а то есть на основе естественного языка передавать информацию человеку. С этого момента у программистов появилось новая «головная боль» проблема кодировок естественных языков, одна из первых и старых проблем программирования.

Немного теории


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

Немного практики


В современном мире, почти все кодировки и отображение контролирует операционная система, чаще всего в Windows отображаются кракозябры, а в Linux все хорошо, и новичкам советуют ставить Linux и не «париться», это в корне не верный подход, На самом деле все дело в настройках операционной системе на которой вы работаете. В Linux кодировка и отображение кодировки настроено на стандарт utf-8 или utf-32 (смотря какой конкретный дистрибутив) и оба стандарта совместимы, а в Windows исторически сложилось Legacy разработка, настройка кодировки отображения идет в console cp866(Если вы используете русский диструбутив windows) а winapi использует code pages 1251(На русском дистрибутиве) в связи с этим у нас несколько путей решения:
  • Сохранять исходные коды в cp866 чтобы компилятор или интерпретатор «вшивал» код символов для conosle windows по умолчанию
  • Подменять шрифты где символы соответствуют кодировке cp866 то есть символ «А» в шрифте графически был на месте символа. Например в нумерации кодировке для символа «А» cp866 это код 0x80, а для символа windows code pages 1251 0xc0 таким образом именно в шрифте нужно перерисовать символы где должны отображаться буква «А»
  • Подменять кодировку программно нужно написать небольшую функцию(процедуру) которая перехватывает весь поток вывода и подменяет символы на ту кодировку которая отображает символы по умолчанию это cp866
  • Самый рациональный и простой метод это переключить операционную систему в нужную вам кодировку в для console windows это будет команда в самой консоле chcp 1251 для кодировки windows code pages 1251, а для utf-8 соответственно chcp 65001(список всех кодировок windows) для языка C++ можно написать команду после main system("chcp 1251");

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

P. S. По мимо обсуждения статьи в комментариях буду рад, пообщаться в telegram: @almost_human
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330608/


Метки:  

Третья IT-конференция GeekDay — три дня бесплатных мастер-классов по программированию

Пятница, 09 Июня 2017 г. 14:40 + в цитатник


Новость для тех, кто мечтает получить IT-профессию: с 22 по 24 июня пройдёт онлайн-IT-конференция GeekDay #3. За это время вы сможете прослушать 20 бесплатных мастер-классов по различным сферам программирования и разработки.


Что вас ждёт на третьем GeekDay?


  1. Вы узнаете, как разработать и кастомизировать Android-приложение, как создать несколько приложений под iOS и 2D-игру. Поймёте, как сделать код лаконичным и красивым.
  2. На мастер-классах вы сможете пообщаться с профессиональными практикующими программистами уровня Senior. У каждого спикера — профильное образование, солидный стаж работы по специальности и большой опыт разработки сервисов и приложений для крупных компаний (Mail.Ru Group, МегаФон, Билайн).
  3. Общение и обмен опытом со специалистами поможет вам сформулировать идею и реализовать свой проект.

Спикеры конференции:


  • Сергей Камянецкий, Senior C# Developer. Вместе с Сергеем вы разработаете 2D-игру и узнаете, как научить игровые объекты взаимодействию с пользователем и друг с другом.
  • Юрий Жайворонок, Senior Web Developer Mail.ru Group, работал над «HYKL» вместе с Berkeley University. Расскажет, как обычному программисту добиться успеха в IT-сфере.
  • Евгений Картавец, Senior .Net Developer, Team Lead, руководитель отдела обучения GeekBrains. Научит основам ООП и даст рекомендации для дальнейшего развития.
  • Игорь Филимонов, глава департамента веб-разработки в МакроИндекс. У него вы научитесь хитростям работы с CMS-платформами и за час создадите свой блог.
  • Алексей Кадочников, профессиональный веб-разработчик. На его лекции вы узнаете, как сделать из фиксированного макета адаптивный, и сможете применить знания на практике.
  • Кирилл Лукьянов, профессиональный iOS-разработчик с опытом в IT-сфере более 13 лет. Научит создавать Task-лист и iOS-приложение для видео-стриминга.
  • Александр Фисунов, разработчик ПО с многолетним опытом работы в крупных проектах. Расскажет о возможностях Java — самого популярного языка программирования в мире.
  • Александр Ерофеев, сотрудник, преподаватель и аспирант СпбПУ. Расскажет, как при помощи HTML/CSS создавать сайты, приложения, презентации и другие IT-объекты.
  • Владимир Языков, профессиональный веб-разработчик с опытом реализации крупных проектов. Вы узнаете о методологии БЭМ и сможете избежать классических для новичка ошибок.
  • Василий Дерябин, создатель и управляющий партнёр в веб-студии «Visario.ru». Научит вас создавать продающие лэндинги для стартапов без навыков программирования.
  • Роман Муратов, профессиональный C#-разработчик. Расскажет об взаимодействиях с игровыми объектами и особенностях реализации игрового инвентаря.
  • Юрий Афанасьев, Senior PHP Developer в «Alpari». Вы узнаете о способах сделать код лаконичным и красивым и получите советы для развития с нуля до уровня Senior.

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


Зарегистрироваться для участия в конференции или просмотра трансляции можно на сайте конференции. Ждем вас!

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330600/


Метки:  

Набор на курс Python: почему мы думаем, что Python 2.7. — это серьезно, а Python 3 — модно

Пятница, 09 Июня 2017 г. 14:38 + в цитатник
Пару дней назад мы открыли набор на один из самых долгожданных курсов — курс серьезного изучения Python. Сегодня мы хотели рассказать вам о направленности и программе курса. Курс предназначен для тех, кто уже знает всякое про Python, но хочет повысить свой навык до уровня middle разработчика и найти уже работу, которая будет приносить не только удовольствие, но и хороший доход (ведь лучшим по результатам обучения студентам наши партнеры — крупнейшие IT компании предложат пройти собеседования). Мы не ждем на курсе новичков: поэтому наличие некоего beginner уровня проверяется вступительным тестом — там всего пара десятков вопросов. Если большинство из вопросов теста вызывают длительный ступор — лучше задуматься над тем, чтобы немного подтянуть свои знания по Python самостоятельно, ведь во время курса может не быть возможности останавливаться на basic вещах.

Заранее также стоит оговорится, что подавляющее число материалов курса будет на английском языке. Это неизбежное следствие международной востребованности и применимости языка. Вся “движуха”, крупные конференции, статьи, актуальные книги и т.п. — на английском.
Как была составлена программа? Мы собрали требования актуальных вакансий Python разработчиков с зарплатой выше 100к и актуализировали их с нашими компаниями-партнерами. Далее, опираясь на полученные результаты, представление преподавателя курса о, скажем так, динамическом диапазоне языка, мы разбили курс на 5 логических частей, пропорционально востребованности на рынке труда.

Python for everyone. Вступительная часть курса будет своеобразным трамплином для разгона. Несмотря на вступительное тестирование, уровень знаний на входе все равно будет варьироваться, но в ходе первых недель мы придем к общему знаменателю. В процессе посмотрим на функциональные приемы языка, декораторы, покопаемся в “кишках” интерпретатора, обсудим алгоритмы (непременная составляющая большинства собеседований), поговорим про ООП и паттерны проектирования, завершим блок operation аспектами разработки.

Python for web. Самый обширный пласт курса. Это связано с тем, что большинство актуальных вакансий требуют знаний того или иного web фреймворка, Django в частности. Мы начнем с того, что посмотрим, как создавать простые приложения без всяких фреймворков, а потом с головой окунемся в Django. Тут будут и SQLAlchemy, и REST, и Celery, и, конечно, “ванильная” Djago c ее ORM’ом, view’шками, template’ами. Не забудем поговорить и про тестирование. А, в зависимости от наличия времени, может успеем обсудить штуки типа Flask, Twister и Tornado. В этом блоке будет одно сквозное ДЗ, где мы будем делать Django приложение.

Python for data science. Анализ данных в наши дни безмерно, иногда даже чрезмерно, популярен и в предложениях о работе это тоже находит свое отражение. Понятно, что стать специалистом по machine learning за пару занятий не получится, зато вполне по силам получить навыки data science инженера. Такой специалист создает data pipeline’ы, поддерживает инфраструктуру аналитики. Тут самое оно изучить NumPy, Pandas, попрактиковаться рисовать красивые картинки и даже поднять “игрушечный” Hadoop и написать для него простейший таск.
Python for high performance. Дональд Кнут учит нас, что преждевременная оптимизация — это корень всех зол. Но в предпоследней части курса уже, кажется, самое время затронуть аспекты производительности. Мы будем говорить про профилирование, написание расширений на C, конкурентные вычисления. Рассмотрим возможные оптимизации, а также осветим вопрос “что делать, если Python недостаточно?”.

Python for future. Python 3 — это то светлое будущее, которое уже наступило, правда, неравномерно. В этом блоке мы будем обсуждать основные изменения, которые произошли в языке между версиями, рассмотрим новые классные фичи (один asyncio чего стоит!). Обязательно обсудим процесс миграции проектов со второй версии на третью.
Конечно, нельзя в рамках одного курса натренировать отличного django разработчика, аналитика и инфраструктурного программиста. Почти нереально даже если сфокусироваться на чем-то одном. Ведь хорошего разработчика делает реальная рабочая практика и опыт. В свою очередь, получение широкого спектра знаний, дает возможность определиться с тем, чем именно вы хотите заниматься как Python разработчик, возможность, при необходимости, заниматься чем угодно, возможность “срезать углы” и наступать на меньшее количество граблей по дороге к своей мечте.
И да, это все Python 2.7, кроме финального блока курса, где мы погружаемся в особенности Python 3. Сразу возникает предмет для споров и возражений. Безусловно, Python 3 — это хорошо, современно, стильно, модно, молодежно. Третья версия получает развитие, новые фичи и однажды мы все войдем в это прекрасное будущее. Но есть нюанс, Python 2.7 (да и 2.6) никуда магическим образом не исчезает из-за того, что Python 3 — это right way to go. Во многих компаниях, в том числе и крупных, компаниях остается Python 2.x код, который нужно поддерживать. Да и новый код тоже частенько пишется на том же Python 2.7, хотя бы потому что последняя CentOS, на которой повсеместно крутятся сервера, из коробки дает именно этот Python, а ставить поверх другую версию и жить с двумя, мягко говоря, неудобно. Если посмотреть вакансии на каком-нибудь агрегаторе, то вы опять-таки увидите, что достаточно часто требуется использование именно Python 2.7. Так же, но это уже чисто субъективно, кажется проще и лучше освоить сначала 2.7, а потом, если потребуется, переходить на 3. Освоение новых фич и особенности не займет много времени, зато будет ясно, откуда “растут ноги” у тех или иных решений и всегда будет возможность разобраться в legacy коде.

Естественно, не обойдется и без практики! HW в учебном плане означает домашнее задание (homework), которое будет разбираться и обсуждаться на занятиях. ДЗ сопровождает каждую из теоретических выкладок и дает возможность самостоятельно “пощупать” то, о чем мы говорили на занятии. Кстати говоря, помимо всего прочего, есть даже одно задание на Go, так что скучать не придется!

Финализируется курс работой над собственным проектом. При прочих равных, он может стать хорошим подспорьем на собеседовании с потенциальным работодателем и стать частью вашего портфолио.
Попробуем? Сдавайте вступительный тест и присоединяйтесь к новой группе !
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330606/


Метки:  

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

Пятница, 09 Июня 2017 г. 14:09 + в цитатник
image

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

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

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

Ходите по собеседованиям.

Да, именно. Минимум раз в месяц. А лучше 2-3 раза в месяц. До тех пор пока счетчик не дойдет до 15. Британскими учеными к сожалению ничего про эти числа не сказано, но думаю этого количества будет достаточно, чтобы уже на 16-м собеседовании HR-менеджер услышал звон ваших стальных яиц еще из коридора. Что для этого нужно сделать? Разместить свою резюме на популярном ресурсе и время от времени мониторить его на предмет новых вакансий. Увидели вакансию про вас — откликайтесь. Откликайтесь на джуниора и тимлида будучи мидлом. Откликайтесь на ведущего разработчика будучи вчерашним стажером. Откликайтесь на все, что более ли менее относится к вашей профессии, и куда бы вас могли взять с натяжкой или без. Пробуйте все.

Что вам это даст? Во-первых уже во время первого разговора по телефону с представителем кадровой службы вы заметите ЭТО. Вы заметите, что волнуетесь значительно меньше. Потому что вам будет пофиг. Потому что у вас есть работа, где вам в целом нравится и неплохо платят. А “они” хотят человека вашей квалификации, но на 15-20 т.р. дешевле. И находятся “они” в Южном Бутово с “15 минутами на маршрутке от метро”. И именно отсутствие волнения позволит вам задавать какие угодно вопросы. Про график работы, про обеды, про наличие кофе машины, про страховку и оплачиваемый спортзал, да про что угодно. Второй раз вы это почувствуете, когда первый раз поедете на очное интервью. И опять же по той же причине. Вам будет пофигу. Вам будет без разницы, провалите вы его или нет. Справитесь ли с задачей написать на бумажке пузырьковый метод или произведете ли на кадровика впечатление “ответственного и исполнительного”. И именно этим этой легкостью в общении и кучей встречных вопросов, которые вы теперь не боитесь задавать, вы произведете дополнительное впечатление на оценивающую сторону, ибо поверьте, количество кандидатов, которые задают больше 2-3 дежурных вопросов на собеседовании на самом деле очень невелико.

Во-вторых, вы будете знать рынок. Через полгода у вас будет отличное представление рынка труда. Вы будете знать за какой срок вы найдете себе работу на текущий (-10% от текущей) уровень зарплаты. Вы будете знать какие требования выставляют кандидатам, какие вопросы задают, что ожидают увидеть. Вы будете знать, что вас ждет, если вы на корпоративе ущипнете за зад жену финансового директора. Вы намного спокойнее будете заходить в кабинеты боссов и бигбоссов. Сможете продвигать свое мнение, защищать свою точку зрения, потому что вам пофиг. Потому что вы уже не будете бояться потерять свою работу. Потому что вы знаете, что только за последние полгода вы получили 4 предложения с такими же условиями. Потому что вы знаете, что вашей фирме на текущую ставку найти спеца равного вам просто не реально (компании, в которых вы были, с такими же бюджетами ищут их месяцами).

В-третьих, каждый полученый вами job-offer будет давать вам +5 к длине. Понимание того, что вас оценили и зовут к себе реально поднимает самооценку. А если вам не перезвонили — так опять же — пофигу. Вы же к ним и не собирались.

В-четвертых, вы можете получить реально хорошее предложение.

Желаю удачи)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330602/


Метки:  

[Перевод] Пишем софт, который будут ненавидеть

Пятница, 09 Июня 2017 г. 13:51 + в цитатник
Куда ни посмотришь — всюду статьи о лояльности клиентов, об удовлетворённости пользователей, об интуитивной понятности интерфейсов и о прочем подобном. Хватит уже об этом. Поговорим лучше о создании плохого софта, такого, поработав с которым, пользователь возненавидит и сам этот софт, и его разработчиков, и свои мышь с клавиатурой заодно.



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

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

Совет №1. Чем медленнее — тем лучше


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

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


Совет №2. Игнорируйте предложения и пожелания пользователей


Пользователи предлагают добавить в программу новую возможность? Что бы это ни было, пусть, для выполнения просьбы нужна пара строк кода, отвечайте так: «Это невозможно». Даже не думайте о том, чтобы обсуждать подобные предложения с коллегами. Отшейте пользователя — и проблемы как ни бывало.

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

Совет №3. Не заботьтесь о времени безотказной работы приложения


Всякие «соглашения об уровне предоставления услуг» — глупости. Совершенно нормально, если система будет наглухо виснуть каждые несколько минут. А ещё лучше, если речь идёт о программе, которая, скажем, используется для обслуживания клиентов. Например — на кассе.

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


Совет №4. Стремитесь к самому новому


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

Если вы следите за событиями в среде JavaScript, значит — вы понимаете — о чём я говорю.

Совет №5. Обновляйте веб-страницы целиком


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

Совет №6. Ваш софт — это просто, любой сможет его понять


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


Совет №7. Проверка форм — не ваше дело


Просто представьте, как это замечательно — ввести данные в форму, ошибиться в какой-нибудь мелочи, и, после её отправки и перезагрузки страницы, увидеть снова ту же форму с пустыми полями. Это не ваша вина, если пользователь неправильно понял, что куда надо вводить.

Совет №8. Ваше мнение — это единственное, что имеет значение


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


Совет №9. Чем больше загадочности — тем лучше


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

Совет №10. Никаких напоминаний, автообновлений и уведомлений


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



Совет №11. Побольше таинственных слов


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

Совет №12. Интуитивная понятность — это не к нам


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

Совет №13. Экран загрузки должен быть всегда и везде


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


Итоги


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

Уважаемые читатели! А какими «вредными советами» о разработке ПО можете поделиться вы?
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330596/


Метки:  

[Перевод] Ansible v.s. Salt (SaltStack) v.s. StackStorm

Пятница, 09 Июня 2017 г. 13:24 + в цитатник

image


Дисклеймер


За последний месяц я слушал интервью с разработчиками на всех трех продуктах и слышал утверждение «считайте [Ansible / Salt / StackStorm] клеем». А теперь я, как самоделкин-любитель, с удовольствием скажу, что у меня в гараже отнюдь не единственный горшок с клеем. У меня 6 разных типов клея для разного применения, различных склеиваемых материалов и условий среды. Все эти 3 продукта находятся в одном и том же лагере, и каждый может быть с успехом использован для достижения совершенно разных целей. Недавно произошел большой перехлест функционала, состоящий в том, что все они проникают в область сетевой автоматизации. Мнения, приведенные ниже, принадлежат мне, а не моему работодателю (который продает продуктов сетевой инфраструктуры и развертывания на миллиарды долларов).


Я пользовался всеми тремя продуктами, в развитие двух из них (Salt и StackStorm) внес значительный вклад и частично способствовал развитию Ansible. Говоря откровенно, продукт, с которым я менее всего знаком, — это Ansible, но я беседовал с коллегами и собирал информацию, чтобы заполнить пробелы.




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




*Использовать под присмотром взрослых*
Использовать под присмотром взрослых


Задайте себе несколько вопросов:


  • Какие среды нужно поддерживать? Каков набор серверов и сетевых устройств?
  • Кто мои пользователи? Хардкорные сисадмины, специалисты по информационной безопасности, разработчики?
  • Сколько я готов выделить на пользовательскую разработку?

С агентом или без агента?


Уделите этому внимание, это действительно важно. В этой статье я собираюсь сосредоточиться на вопросах автоматизации устройств и их оркестрации. Этими устройствами могут быть маршрутизаторы, коммутаторы, межсетевые экраны, излучающие электромагнитные волны следующего поколения циркулятроны — не имеет значения. Что действительно важно — в их операционной системе не будет установлен агент. У Ansible было совместимое решение — использование SSH в качестве транспорта, поэтому он хорошо вписывается в мир конфигураций конечных устройств, для которых SSH является наименьшим общим знаменателем. SaltStack создавался как шина для высокоскоростного и безопасного миньона (агента), управляющего коммуникацией, но он также имеет режим использования без агента. StackStorm вышел на игровое поле последним и по своей архитектуре не отдает предпочтения какой-либо из работ. Он поддерживает инструменты на основе агентов посредством пакетов для Chef, Puppet, Salt, а также собственные SSH-средства дистанционного управления и встроенную поддержку для вызова сборников сценариев — плейбуков Ansible.


API


Другое ключевое отличие — API:


  • Ansible предоставляет интерфейс CLI, Ansible Tower (корпоративная версия) имеет API;
  • StackStorm имеет CLI, но также имеет REST API для всех компонентов и сервисов в бесплатной версии;
  • у Salt есть как CLI, так и REST API (по умолчанию он не включен), также возможно использование «Enterprise API» в составе продукта Enterprise, который включает в себя такие функции, как RBAC.

Ansible


Ansible — детище Майкла ДеХаана. Продукт был разработан для автоматизации однообразных задач администрирования серверов в крупных средах. Майкл был в новообразованной технологической группе RedHat, где основал разные проекты (такие как Cobbler), а после ухода из RedHat основал Ansible (хотя теперь Ansible и принадлежит RedHat). Выдержка из блога Майкла, посвященного основам Ansible, объясняющая цель проекта:


«Мы хотели создать еще один очень демократичный проект для решения новых проблем с открытым исходным кодом в Red Hat, в который мог быть вовлечен широкий круг разработчиков. Мы вспомнили о busrpc. Этот проект существовал для заполнения пробелов между Cobbler и Puppet. Cobbler может подготовить систему, а Puppet может сложить файлы конфигурации. Но, поскольку Puppet слишком описательный, его невозможно использовать для выполнения таких операций, как перезагрузка серверов или выполнение в промежуточное время всех задач «по требованию».

Эти задачи «по требованию» эволюционировали в плейбуки Ansible, а затем появилась и начала свое развитие экосистема модулей Ansible.


Дизайн


Ansible прост, что является его главным качеством (это сразу станет ясным, если посмотреть на другие 2 качества). В нем нет ни демонов, ни баз данных, а требования для установки минимальны. Ansible просто устанавливается на Linux-машине и всё. Можно определить целевые серверы в статическом файле, сгруппировать их в содержательные разделы или использовать некий динамический модуль обнаружения хостов (такой как Amazon EC2 или OpenStack) для поиска виртуальных машин на основе вызова API. После того как была проведена инвентаризация, можно выделить специфичные для хоста или группы переменные для использования в плейбуках. Они, опять же, хранятся в статических текстовых файлах.


Затем Ansible подключится к выбранному хосту или группе и запустит плейбук. Сборник сценариев (плейбук) представляет собой последовательность модулей Ansible для выполнения на удаленных хостах, написанных на YAML.


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


Ansible работает по следующему алгоритму: подключение к серверу по SSH (или WS-Man/WinRM для Windows), копирование кода на языке Python, исполнение и удаление самого себя.


Архитектура


Архитектура Ansible прямолинейна: существует приложение, выполняющееся на локальном компьютере, и выполняемые на удаленном хосте задачи, которые поддерживают между собой связь по SSH и через файлы, передаваемые по SCP/SFTP. У Ansible нет архитектуры «сервер-клиент», в отличие от двух других продуктов, поэтому распараллеливание задач происходит на локальной машине, но не масштабируется на несколько серверов (если не использовать Tower).


Ansible при управлении удаленными машинами не оставляет на них своего кода, поэтому вопрос, как обновить Ansible при переходе на новую версию, в действительности не стоит.


Расширяемость


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


#!/usr/bin/python
import datetime
import json
date = str(datetime.datetime.now())
print json.dumps({
    "time" : date
})

ansible/hacking/test-module -m ./timetest.py

Вы должны увидеть примерно следующий результат:


{"time": "2012-03-14 22:13:48.539183"}

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


Корпоративная поддержка


Ansible Tower — это корпоративная версия (Enterprise), которая превращает командную строку Ansible в сервис с веб-интерфейсом, планировщиком и системой уведомлений.
Планировщик задач
Планировщик задач


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


Поддержка сетей


Раздел о поддержке сетей в Ansible — наиболее полный среди всех трех продуктов и охватывает всех основных вендоров сетевого оборудования и платформы. В Ansible возможно:


  • Автоматизировать настройку всего, что связано с сетевым оборудованием, — от указания систем для подключения до конфигурации основных сервисов, и всё это с помощью модулей и плейбуков для конкретной сетевой платформы.
  • Тестировать и проверять текущее состояние сети, выполнять или откладывать процесс сбора фактов о существующей конфигурации.
  • Непрерывно проверять соответствие изменений сетевым настройкам.

Ansible поддерживает Arista, Cisco (все программируемые платформы), F5, Juniper и других производителей. Только в Ansible поддержка в основном предоставляется и осуществляется вендорами, а не сообществом. На данный момент это лучшие интерфейсы API, наибольшая функциональность и работа с самыми последними платформами (поскольку поддерживаются более новые версии).


Сильные стороны


  • Очень быстро и просто начать работу.
  • Множество примеров, документации и модулей от сообщества.
  • Ansible Tower реализует функции для крупных корпоративных внедрений.
  • Сетевые модули, поддерживаемые вендорами.

Слабые стороны


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

StackStorm


Я пользовался StackStorm начиная с версии v0.11 (ранняя предварительная бета-версия) вплоть до последней версии v2.2. Это сложная платформа широкого применения, как и Salt. Хотя рассказ о ней требует времени, но все же часто у слушателя создается неправильное впечатление о системе. Я вижу в этом и силу, и слабость. Слабость, потому что сложность системы может заставить отказаться от развертывания совсем или использовать более простое, но неправильное решение там, где StackStorm была бы хорошей альтернативой (часто в таких случаях даже пишется собственное решение «с нуля»). Сила в том, что, как только станет понятно, как использовать сильные стороны, система становится действительно гибкой.

Интерфейс StackStorm
Интерфейс StackStorm


Дизайн


Ядром StackStorm является исполняемый движок с подключаемыми правилами, спроектированный как глубоко настраиваемая служба IFTTT (if-this-then-that, «если это, тогда то»). Можно настроить StackStorm реагировать на произошедшие события запуском простого «действия» (команды) или сложного рабочего процесса. Рабочие процессы доступны в двух вариантах: в виде ActionChain — цепочки действий (проприетарный рабочий процесс DSL) или в виде рабочего процесса на OpenStack Mistral, движок которого основан на YAML.


StackStorm также включает службу для «chatops», с помощью которой можно инициировать рабочие процессы из событий или сообщений платформы чата (например, Slack).


Перечень основных составляющих StackStorm:


  • Сенсоры — плагины Python для входящей или исходящей интеграции, получающие или наблюдающие события. Когда произошедшее во внешней системе событие обрабатывается датчиком, сработает триггер StackStorm.
  • Триггеры — представления внешних событий в StackStorm. Существуют триггеры общие (например, таймеры и вэбхуки) и триггеры интеграции (например, тревога в Sensu или обновление задачи в JIRA). Новый тип триггера можно определить, написав плагин сенсора.
  • Действия — это исходящая интеграция StackStorm. Существуют общие действия (ssh, вызов REST), интеграции (OpenStack, Docker, Puppet) или настраиваемые действия. Действиями являются либо плагины Python, либо прочие сценарии, интегрируемые в StackStorm путем добавления нескольких строк метаданных. Действия могут быть вызваны непосредственно пользователем через CLI или API или использоваться и вызываться как часть правил и рабочих процессов.
  • Правила привязывают триггеры к действиям (или к рабочим процессам), применяя критерии соответствия и привязывая полученную из триггера информацию на вход действий.
  • Рабочие процессы объединяют действия в «uber-действия», определяя порядок, условия перехода и передачу данных между ними. Большинство решений автоматизации содержат более одного шага и, следовательно, требуют наличия более одного действия. Рабочие процессы, как и «атомарные» действия, доступны в библиотеке действий, могут вызываться вручную или запускаться по правилам.
  • Пакеты — это единицы размещения контента для развертывания. Они упрощают управление и совместное использование подключаемого в StackStorm содержимого путем группирования инструментов интеграции (триггеров и действий) и автоматизации (правил и рабочих процессов). Растущее количество пакетов доступно в сообществе StackStorm. Пользователь может создавать свои пакеты, выкладывать их на Github или отправлять в StackStorm Exchange.
  • Журнал аудита с полной информацией о запуске контекста и результатах выполнения действий, запущенных вручную или автоматически.

Дизайн


StackStorm состоит из ряда сервисов, использующих очередь сообщений (rabbit) и хранилище данных (mongo) для сохранения своего состояния и обмена данными между собой. StackStorm также имеет web-интерфейс (да, даже в бесплатной версии!), который позволяет настраивать правила, выполнять действия «по требованию» и проверять журнал аудита.


Архитектура



В отличие от Ansible и Salt, StackStorm не был предназначен для настройки рабочих станций или коммуникаций. StackStorm включает пакеты для Salt, Chef, Puppet и Ansible, поэтому при необходимости использования Chef для системы управления агентами и конфигурациями воспользуйтесь StackStorm для вызова сервисов на базе API, таких как Sensu или Kubernetes. Это является легко достижимым и очевидным решением. В Salt все еще существует концепция выполнения на конечной машине или на мастере (на выбор). Если требуется вызвать API Kubernetes, то вопрос о том, какой компьютер вызвал API, становится спорным. То же самое касается конфигурации сетевых устройств.


MongoDB можно масштабировать, используя хорошо документированные шаблоны, то же касается и RabbitMQ. Сами службы разрабатывались с API HTTP/RESTful и могут использовать балансировку нагрузки для масштабирования. Роли могут быть развернуты на одном сервере или распределены по нескольким серверам в зависимости от потребностей.


Мне действительно нравится расширяемость StackStorm, это определенно ключевое преимущество над другими двумя продуктами. Точки расширения StackStorm называются пакетами. Они являются автономными, могут храниться в Git и управляют своими зависимостями через виртуальные среды уровня пакета на языке Python. При установке пакета указывается URL-адрес Git или URL-адрес HTTP, (необязательные) учетные данные, а StackStorm уже загружает, настраивает и устанавливает пакет.


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


В отличие от Salt и Ansible, StackStorm не содержит никаких расширений при поставке, все они должны устанавливаться индивидуально. Это облегчает развертывание и упрощает зависимости.
При разработке механизма интеграции для StackStorm можно создавать сенсоры, действия и рабочие процессы в одном определении. Модули Salt и Ansible являются автономными. Таким образом, если расширение (например, Salt) включает Beacons, «Модули исполнения» и «Модули состояния», то у них нет ничего общего, за исключением названия и автора. Это может создать проблемы при управлении зависимостями pip.


Решение этой проблемы в StackStorm заключается в том, что каждый пакет имеет как свой файл requirements.txt, так и файл YAML, описывающий назначение, требования и версию пакета. Можно обновить пакет линейно и при этом сохранить существующую конфигурацию. Пакеты также содержат шаблонную конфигурацию, в отличие от Ansible и Salt, в которых формат конфигурации модулей хранится только в документации, делая их более подверженными ошибкам пользователя. Кроме того, часто приходится просматривать код модуля, если разработчик не удосужился задокументировать параметры конфигурации должным образом.


Еще одной уникальной особенностью является то, что «ChatOps-псевдонимы» (команды чата) встроены в пакеты. Поэтому при установке, например, пакета NAPALM установятся также все команды чата для NAPALM.


Корпоративная поддержка


StackStorm — это продукт с открытым исходным кодом по лицензии Apache-2, размещенный на GitHub. StackStorm принадлежит компании Brocade (которая недавно распродала часть активов, и часть StackStorm теперь принадлежит Extreme Networks).


При лицензировании StackStorm покупается продукт под названием «Brocade Workflow Composer», и владелец лицензии получает дополнительный функционал, а также Enterprise-level-поддержку. Развернутая в производственной среде система, с которой я работал, была лицензирована, и их группа поддержки оставила у меня впечатление отзывчивой и знающей. Вы также получаете RBAC, в котором можете указать для каждого уровня действий, у кого и к каким действиям есть доступ.


Brocade Workflow Composer
Brocade Workflow Composer


Поддержка сетей


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


В апреле 2017 года они объединили поддержку библиотеки NAPALM и кроссплатформенного пакета абстракции Python для Cisco, Juniper, Arista и других вендоров. Теперь можно использовать функционал NAPALM в части маршрутизации, интерфейсов, пиринга BGP и некоторых других отличных возможностей. Мэтт Освальт (соавтор книги O'Reilly по сетевой автоматизации) написал хороший блог о прогрессе в этом направлении.





Демонстрация NAPALM для StackStorm


Сильные стороны


  • Бесплатный web-интерфейс по умолчанию прост в использовании и не требует глубоких знаний Python или DevOps.
  • Интеграция ChatOps встроена, работает «из коробки» (с помощью Slack, просто развертывается ключ API) и поддерживает многие другие чат-платформы.
  • OpenStack Mistral действительно мощный, и, если его освоить, станет возможным сразу охватывать несколько инструментов DevOps, легко создавать ветви и циклы.
  • Brocade Workflow Composer — отличный способ заставить «не-разработчиков» использовать систему.

Слабые стороны


  • Не имеет такого количества доступных пакетов расширения, как Salt и Ansible. Вначале проверьте, доступны ли пакеты для ваших систем и API и какие функции входят в них входят.
  • Система OpenStack Mistral все еще довольно плохо документирована, в синтаксисе запросов YAQL существует множество проб и ошибок.

Salt


Прежде всего Salt — это продукт, SaltStack — это компания. Поэтому, когда я говорю о Salt, я говорю о Salt Open — версии с открытым исходным кодом.


Salt имеет массивный перечень составляющих, поначалу (и когда я говорю «поначалу», я имею в виду «первый год»), это может быть действительно потрясающим. Salt выполняет множество функций, поэтому, как правило, сравнивая Salt с Ansible, Salt-фанаты говорят «да, но он делает намноооооого больше». Как и в случае со StackStorm, это работает и за, и против Salt. Если бы я просто сказал вам принести grains (кристаллы) из шахты, вы бы подумали, что я имею в виду роман Толкиена, но как только вы узнаете, что такое Salt mine (соляная шахта) в терминологии Salt, все станет очевидным.


Дизайн


Salt родилась как распределенная система для удаленного исполнения команд и данных запросов на удаленных узлах или «миньонах». Удаленное исполнение возможно либо на отдельных узлах, либо на группах по произвольным критериям выбора — «таргетинг».


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


  • Мастер — сервер, который запускает основные службы для общения с миньонами Salt. Он также содержит хранилище ключей для шифрования между ним и миньонами.
  • Миньоны — агенты, которые используют микро-версию Salt для локального исполнения и связи с мастером.
  • Движки — они же Salt Engines (солевые двигатели) — это внешние процессы, исполняемые в течение продолжительного времени, которые работают с Salt.


  • Состояния или формулы — файлы, содержащие YAML и шаблонные данные для настройки миньонов. Механизм шаблонов также очень гибок. Он не ограничивается поддержкой Jinja, но также поддерживает и chetah, genshi, mako (очень важно для тех, кто имеет опыт с Puppet), wempy или даже чистый Python.

Миньоны (прокси или обычные) могут быть адресованы с использованием grains (крупинки, кристаллы), pillars (столбов, колонн) или идентификаторов. Существуют и другие плагины для таргетинга, а также возможность создавать собственные, основанные на чем-то вроде SQL-запроса или KVP-хранилища.


  • Grains — Salt содержит интерфейс для получения информации о нижерасположенной системе. Он называется интерфейс «крупинок», потому что представляет собой «соль», состоящую из «крупинок» информации. Grains собираются для операционной системы, имени домена, IP-адреса, ядра, типа ОС, памяти и многих других свойств системы. Интерфейс grains доступен для модулей и компонентов Salt, так что нужные команды миньонов автоматически становятся доступными в соответствующих системах.


  • Pillars — это интерфейс Salt, предназначенный для обеспечения глобальных значений, распределяемых среди миньонов. Pillar — это ресурс свободной формы данных, который может быть JSON, YAML либо другим требующимся и может храниться в файлах или внешне. Это уникальное свойство Salt, позволяющее интегрировать его с другими системами, в которых общее хранилище данных было бы полезно (например, ITSM или реестр ресурсов).

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


Архитектура


Архитектура Salt основана на принципе ступицы колеса и спицы (веерная структура). В некоторых очень больших развертываниях используется несколько мастеров, но это случается довольно редко. Мастера можно легко масштабировать до многих тысяч узлов отчасти из-за облегченной шины сообщений ZeroMQ. Другие модели развертывания:


  1. Установка без мастера.
  2. Иерархические мастера, связанные между собой с помощью синдика.

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


Основанная на событиях система Salt использует маяки (beacons). Подобно системе сенсоров и триггеров StackStorm, маяки Salt запускают события в шину сообщений, которые затем могут быть обработаны в реакторе (на мастере). Механизм правил в реакторе довольно сырой по сравнению со StackStorm, поскольку обычно команда состояния или выполнения активируется позади маяка, запускающего событие. Тем не менее, маяки работают на миньонах, поэтому, если события обнаруживаются на серверах, все предельно ясно. Поскольку StackStorm и Ansible не имеют агентов, это будет уникальной функцией Salt.


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


Расширяемость


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


Наиболее распространенными сценариями для расширения могут быть разработка модуля состояния (для описания того, как должна быть сконфигурирована часть программного обеспечения или службы) или модуля исполнения (код для взаимодействия с API или системой). Оба типа модулей могут быть написаны по относительно небольшому шаблону, оба хорошо задокументированы и могут быть проверены с помощью неплохой встроенной тестовой среды. Выполнить узловую проверку модулей можно c помощью PyTest, даже не находясь на мастере или совсем без работающего мастера. Для тестирования интеграций требуется система Linux, хотя с небольшими навыками хакера модули можно запустить и на OSX (о Windows не может идти и речи, как и в случае StackStorm с Ansible).


Возможно либо поддерживать свой автономный пакет, либо вносить непосредственный вклад в проект Salt на GitHub. Самым большим недостатком при внесении кода в основной проект является то, что пользователям для легкой установки ваших модулей может потребоваться подождать целый цикл обновлений. Это занимает примерно 3-5 месяцев при их текущем темпе работы, поэтому, хотя система Salt и «поставляется с батарейками», она имеет недостатки.


У Salt также есть менеджер пакетов, SPM, который в основном нацелен на группировку формул управления конфигурацией (state files). Его можно использовать для упаковки модулей, чтобы обойти медленный цикл релизов, о котором я упомяну в слабых сторонах (хотя это и не очень хорошо задокументировано).


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


Корпоративная поддержка


«Salt Open» — это версия системы с открытым исходным кодом, но можно лицензировать и "Salt Enterprise", которая поставляется с некоторыми приятными функциями, такими как:


  • веб-интерфейс для таргетинга, исполнения кода, контроля соответствия состоянию и интеграции с LDAP;
  • интеграция с ServiceNow, позволяющая разворачивать новые серверы и применять состояния из интеграции ServiceNow ITSM;
  • RBAC с интеграцией LDAP (естественно);
  • «Enterprise API», который транслирует функции версии Enterprise в REST API.

Поддержка сетей


Поскольку Salt полагается на шину сообщений, а ZeroMQ имеет ряд зависимостей, для которых обычно требуется полная настройка сети на уровне ОС, то управление сетевыми устройствами не является очевидным при использовании Salt. В последнем релизе Salt значительно улучшена поддержка «прокси миньонов». Прокси-миньоны — виртуальные миньоны — это процесс, который может где угодно работать для удаленного управления устройствами по SSH, HTTP или с помощью другого транспортного механизма. Он использует ту же функциональность, что и обычный миньон, но у него есть и некоторые особенности. Чтобы избежать путаницы с прокси в Puppet (прокси там является центральной машиной, через которую проходят все запросы), скажу, что это всего лишь процесс, связанный с устройством, к которому вы обращаетесь. Таким образом, это отдельный процесс на каждом миньоне. Он обычно легкий и потребляет около 40 МБ ОЗУ. Можно создавать прокси-миньоны, разрабатывая модули Python, которые могут выполняться на миньоне. Команда Salt демонстрировала это в прошлые годы на SaltConf.


Поддерживаемые в настоящее время сетевые платформы:


  • JunOS (Juniper);
  • NXOS (Cisco);
  • Cisco NSO (оркестратор NETCONF от Cisco);
  • NAPALM.

    Компания Salt недавно присоединилась к поддержке NAPALM благодаря очень умным инженерам из Cloudflare. NSO и NAPALM имеют схожие черты, но NSO несет лицензионные издержки от Cisco, и вам нужно будет решить, каким путем следовать на раннем этапе.




Поддержка NAPALM в демонстрации Salt


Сильные стороны


  • Salt может работать как с агентом, так и без агента (salt-ssh).
  • Ультравысокая производительность для крупных развертываний благодаря ZeroMQ.
  • Архитектура на основе агентов позволяет развертывать маяки на хостах под управлением как Windows, так и Linux и даже обнаруживать события локально.
  • Широко использует некоторые очень большие развертывания (например, LinkedIn) .
  • Salt легко может быть объединена с существующим набором баз данных или API-интерфейсов благодаря своей сильной расширяемости.

Слабые стороны


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

Заключение


Основанный на событиях или нет?


Это самое большое различие между этими тремя продуктами. Salt и StackStorm имеют такой функционал. StackStorm имеет службы, которые можно написать (сенсоры), и строго типизированные события, которые могут быть вызваны, как и сложный механизм правил. Salt имеет маяки — службы, которые могут быть запущены как на агентах, так на центральном мастере для обнаружения событий на локальных машинах. Это уникальная возможность. Версия Ansible с открытым исходным кодом не позволяет (и не пытается) реагировать на события.


Поддержка сообщества


Я видел, что производители сетей специально разрабатывали модули для Ansible, тогда как в случае с другими платформами (за исключением Brocade для StackStorm) модули были внесены сообществом. Несомненно, Ansible имеет самую широкую поддержку сетевых платформ. Хотя с внедрением NAPALM и NSO как в StackStorm, так и в Salt это меняет ситуацию, поскольку обе системы поддерживают Arista, JunOS (Juniper), Cisco APIC-EM, NXOS и т.д.


Время начинать


Сила Ansible — это минимальное количество настроек (их, в принципе, нет). Популярность в сетевых задачах может быть обусловлена простотой и знакомством сетевых администраторов с CLI для управления удаленными устройствами без необходимости развертывания каких-либо дополнительных серверов для запуска программного обеспечения. Если у вас много небольших изолированных сайтов (например, коммерческих филиалов), следует подумать, не разделить ли архитектуру. Мой работодатель управляет сетями передачи данных в некоторых крупных сетевых супермаркетах, и я бы не решился иметь мастера в центре, в то время как магазины в сельских районах могут иметь ненадежную связь.


Хранилища данных конфигураций


Salt уникальна тем, что ее ключевые хранилища подключаемы. Если вы хотите хранить пароли или ключи из Hashicorp Vault, это как два пальца. Если вы хотите хранить крупицы данных в базе SQL, все, опять же, работает «из коробки». Подумайте, каким другим системам и платформам могут потребоваться для доступа или ввода данные, которые вы таргетируете.


Безопасность


Если сравнивать Ansible и Salt, Salt имеет собственное хранилище ключей для связи с агентами, а Ansible использует SSH для транспорта. Плохо управляемая среда Ansible, как правило, представляет собой набор закрытых ключей, хранящихся на ноутбуке администраторов (пожалуйста, не делайте этого). Salt предлагает уникальную функцию для защиты данных. Шаблоны, состояния или grains могут быть сохранены во внешнем безопасном хранилище данных. StackStorm хранит данные в MongoDB, которые ваша группа информационной безопасности, безусловно, должна проверить перед тем, как выпускать систему в производственную среду.


Обучение


Если вы не хотите быть единственным специалистом, поддерживающим эту платформу, нужно будет обучить некоторых коллег. Salt и Ansible имеют опубликованные подробные книги, StackStorm — нет. Salt и (RedHat) Ansible предлагают решения для обучения почти исключительно в США, StackStorm — нет (пока). Salt и Ansible имеют курсы по PluralSight, но они действительно базовые.


Лицензирование


И Salt, и StackStorm имеют лицензию Apache-2, Ansible — GPLv3. Если вы не слишком хорошо знакомы с лицензированием OSS, я рекомендую веб-сайт «TLDR Legal». Salt в качестве примера была использована SuSE для создания продукта системного управления (отчасти из-за гибкости их лицензии OSS).



Анекдотично (я очень внимательно слежу за этим), но Ansible пользуется вниманием сетевых администраторов и инженеров DevOps по всему миру. Вы наверняка убедитесь, что нанять инженера Ansible намного проще, чем Salt или StackStorm. Но инженеры DevOps так же редки, как и зубы у куриц, поэтому вы будете платить много долларов независимо от платформы.


Какой клей мне выбрать?


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


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


Благодарность: спасибо за отзывы и вклад в развитие от Salt, StackStorm, Ansible и членов сообщества.

Энтони Шоу


Директор группы по инновациям и техническому развитию Dimension Data, отец, христианин, фанат Python, решает проблемы с opensource, идеями и людьми.


Ссылки


  1. Ansible v.s. Salt (SaltStack) v.s. StackStorm.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330594/


Метки:  

Информационная безопасность: не ждите «жареного петуха» — он сам придет

Пятница, 09 Июня 2017 г. 12:53 + в цитатник
Сегодня мы хотим поговорить об информационной безопасности, а именно об аспектах защиты периметра в меняющихся условиях ведения бизнеса. Учитывая растущую популярность облаков, а также озер данных, у руководства возникает желание сделать все возможное для защиты периметра. Тем временем, IT-специалистам приходится формулировать обоснование для запуска проектов в сфере ИБ, убеждая бизнес в необходимости следить за безопасностью постоянно.




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

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

Например, при стоимости бизнеса в 100 000 рублей, можно вообще везде использовать только бесплатные или OpenSource системы защиты. Для многомиллиардного бизнеса, напротив, не жалко и пары миллионов на один только Firewall – ведь проникновение в сеть может стоить гораздо больше. Таким образом можно решить, нужен ли компании, например, функционал защиты от вторжений (IPS): если стоимость его внедрения будет выше того урона, который принесет проникновение в сеть злоумышленника, то подобная система совершенно ни к чему.

Нужен ли вам DDoS, точно также зависит от того, какую роль в работе компании играет сайт. И далее, уровень системы защиты от распределенных атак тоже зависит от того, сколько денег приносит сайт – ведущие порталы и интернет-магазины могут заплатить десятки тысяч за защиту от DDoS, а небольшому сайту, который помогает получать заказы, будет достаточно решения за $100.

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

Не продукт – процесс


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

С дополнением, модернизацией или даже просто обновлением каждой системы происходит квантовый скачок уровня защищенности. Например, на шлюзах начинают устанавливаться системы Application Control или начинает шифроваться траффик, передаваемый между серверами. То есть компании выстраивают защиту по мере того, как перед ними появляются новые угрозы. У этого процесса есть определенные триггеры, которые вызывают дальнейшие движения:

1) Новые законодательные требования

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

2) Изменение инфраструктуры

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

3) Новые сервисы

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

4) Новые уязвимости

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

5) Маркетинг

Еще один, причем весьма популярный двигатель прогресса в сфере информационной безопасности – это маркетинг. Взять тот же Firewall, который эволюционировал в UTM, а позже – в NGFW (Next Generation Firewall). Обновление слоганов и технологий нередко вызывает интерес у ответственных лиц, и обновление Firewall до NGFW или внедрение новой системы IDS, становится данью моде, хотя и повышает уровень защищенности периметра в целом.

6) Жареный петух

Увы, самая распространенная причина для усиления защиты периметра безопасности – это удар клюва жареного петуха. Когда сайт уже взломали, базу данных уже украли, начинаются попытки защититься от дальнейших атак подобного характера. При этом негативным фактором остается постоянное отставание от злоумышленников минимум на один шаг. Ведь внедрив нужное оборудование или ПО, а возможно подписавшись на какой-то сервис ИБ, представители компании забывают о том, что нужно продолжить заботиться о безопасности своих сетей. Да, если вы защитились от DDoS после того, как сайт неделю был недоступен, следующая DDoS уже вряд ли будет представлять для вас такую же опасность. Но другие новые атаки, скорее всего, снова застанут вас врасплох.

Процессный подход


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



Кто-то идет путем передачи всего этого безобразия на откуп внешнему подрядчику (именно поэтому в последнее время аналитики предсказывают рост рынка ISaaS (Information Security as a Serice). Другие, кто не хочет ждать очередного провала, приступают к планированию и организации процессов ИБ самостоятельно. Для этого необходимо оценить возможные риски и научиться управлять ими. Однако это тема отдельного материала, и мы вернемся к ней в ближайшем будущем.
Что на ваш взгляд важнее при обеспечении ИБ?

Проголосовал 21 человек. Воздержалось 5 человек.

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

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330592/


Город цифрового солнца. Путевые заметки из Иннополиса

Пятница, 09 Июня 2017 г. 12:44 + в цитатник
Иннополис задумывался как идеальный город айтишников, место силы и место обучения, особая экономическая зона и зона особых человеческих отношений. Как здесь все устроено? Насколько эффективно работает? Правда ли, что люди здесь более открыты (и более наивны), чем «на материке»? И что будет с Иннополисом через десять лет? Читать далее

https://habrahabr.ru/post/330482/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1000 999 [998] 997 996 ..
.. 1 Календарь