Developer от Бога

DV

воскресенье, 9 июля 2017 г.

Java

Java, язык программирования высокого уровня, а это значит что вам необязательно знать электронику и регистры процессоров. Когда я решил заняться разработкой мобильных приложений и программ для компьютеров, долго думал что же выбрать, С++ или Java. Все-таки выбрал Java, конечно не забывая подглядывать в книги по C++.
Да, Java проигрывает в скорости работы приложений минимум на 80% и потребляют больше памяти. Но подобные языки программирования, которые не привязаны к конкретной операционной системе - это будущее. С каждым годом, компьютеры и разная переносимая электроника становятся все быстрее в обработке инструкций, и имеют все больше оперативной памяти. Также появляются новые компании со своей продукцией - новыми процессорами и операционными системами. Монополия на рынке процессоров Intel, AMD рушится под натиском новых чипов с архитектурой ARM и других, а дальше будет все еще более разнообразнее. Microsoft также есть о чем беспокоится, хоть мы замечаем их успешные попытки "подсадить" на Windows разработчиков мобильных приложений.
Но вернемся к Java. Данный язык программирования хорошо продуман, и имеет историю развития более 20 лет. Прежде всего нужно знать общий принцип работы программ на Java. Приложения разрабатываются на JDK, "весом" в несколько сотен мегабайт, а работают на JVM - виртуальной машине Java, которая занимает от 10 мегабайт до нескольких сотен килобайт, в зависимости на чем будут использоваться программы( компьютер или какое-то мобильное устройство). Скачать Java машину можно на официальном сайте.



В даном курсе программирования Java , будем больше обращать внимание на те моменты, по которым больше всего вопросов. Но повторим общие стандарты Java с СИ-подобными языками:


int a = 1;// Переменная типа int - хранит целые числа.
double b = 2.3; // Переменная типа double - хранит числа с плавающей точкой.
float c = 4.56;// Переменная типа double - хранит большие числа с плавающей точкой.
char d = 's';//Переменная типа char - хранит символы в одинарных кавычках.
String str "iVARIOUS";// Переменная типа String, хранит строки.
boolean = true; // Переменная типа boolean - хранит только два значения: true и false.
int[] arr = new int[9];// создания массива на 9 чисел.


{// участок кода без имени, в нем можно объявлять переменные с именами которые уже объявлялись, это не вызовет ошибку.
int a = 7;
double b = 8.3;
}

public void func(){ // Участок кода с именем, вызываться только по имени func(), и не возвращает значений.
//....
}

public int func(){// Участок кода с именем, вызываться только по имени func(), и возвращает значение типа int (как и любого типа).
//....
return 25;
}

public int func(int a){// Участок кода с именем, вызываться только по имени func(), принимает значения, и возвращает значение типа int (как и любого типа).
//....
return a;
}

Основы рисунка

Рисунок, древнейшее направление в изобразительном искусстве, с чего начать при изучении рисунка ? Прежде всего нужно усвоить одну вещь, рисунок и живопись невозможна без анализа происходящего( конечно если речь идет о стиле - реализм), анализ который как я лично считаю, даже более важен чем количество нарисованных картин (тоесть- практики). Почему я так считаю? Из опыта. Учится рисованию практикой - больше опираеться на случай, который по теории вероятности может быть на второй минуте рисования, или может не быть даже на втором году беспрерывного рисования( например какое то случайное пятно, которое ляжет удачно так, что вам подскажет как рисовать подобные моменты на других картинах). Другое дело это анализ и улавливание закономерностей природы, что поможет гораздо быстрее разгадать как в небе краски намешаны и как ведет себя свет и тень в природе. Конечно для начала все начинается с простых форм, из которых можно создать формы посложнее. Так как под руками нет гипсового набора из художественного института чтоб сфотографировать для примера, в нашем изучении поведения света, мы будем использовать 3D моделирование которое рассчитывает свет дифференциальными уравнениями, взятое конечно из физики света, и не доверять этому способу причин нет. Давайте отрендерим треугольник и отразим его в черно-белом цвете, что мы там увидим (Рисунок)



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

Java. Классы и Обьекты

Java является языком объектно-ориентированным, это значит что программа состоит из объектов, или классов, которые по своей сути - не зависимы. То есть - если в Java объекте нет метода (или функции , как это принято называть в языках программирования СИ ) который возвращает (return) или предоставляет доступ к присвоению значений своим элементам, вы эти элементы никак не сможете использовать. Java Класс, по структуре чем то напоминает корпускулярно-волновой дуализм света. То-есть, в одних ситуациях свет ведет себя как электромагнитная волна, а в других как частица(с объектом можно вести себя как с переменной типа int, давая ей имена и присваивать значения, а можно вести себя и более шире ).
В СИ подобных языках ( к которым относится и Java) есть переменная типа int.
Int принимает в некотором диапазоне целые значения: 1, 2, 3... Int создается записью:

Int 'название';

Объект из класса создается подобным образом - 'тип' плюс 'название'.
Только если описание типа int уже заложено языком Java, то тип объекта вы должны сами придумать какой вам нужен, создав класс.
Например, класс содержащий размеры чего-то, должен иметь внутри себя имеет запись вида:

public class size {

int x=2;
int y=4;
int z=6;

}

Это был создан только Java класс (тип) ( что то вроде вашей собственной переменной int, но которая может хранить не одно число, а много разных).
Но чтоб создать переменную (вернее-Объект), нужно ей дать еще имя, для
int x;

'int'-это тип переменной, х - название переменной и имя участка в памяти, в которой хранится некое значение. Как типу int нельзя присвоить значение (int = 5), так и классу нельзя присвоить значение ( public class size{} , size = 5 ). Класс это только описание переменной, как буд-то вы сказали: "int-должен хранить только целые числа!".
Работа начинается после создания объекта:


public class size {

int x=2;
int y=4;
int z=6;

}


size object_a;//Имя указателя на Физически существующий объект в памяти.
object_a = new size();// Физически существующий объект в памяти.
size object_b; //Имя указателя на Физически существующий объект в памяти.
object_b=object_a;// Копирование физического адреса на который указывает object_a;
//.....................
object_b=new size();//Создание нового объекта
object_b=object_a;// Создание копии объекта object_a;

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

STM32

В последнее время, в мобильных телефонах, планшетах, и в прочих переносимых устройствах используются чипы с ядрами ARM. Если изучить чип одного производителя, то совсем не трудно будет перейти к другому производителю микроконтроллеров. Разница будет только в работе с периферийными блоками в микроконтроллерах.
Микроконтроллер можно представить как маленький компьютер, со своей оперативной и постоянной памятью, а также со своими входами/выходами для общения с внешним миром. Ядра ARM как уже упоминалось ( хоть и разные конечно) схожи от всех производителей, а вот периферию ( постоянную память , АЦП/ЦАП , интерфейсы передачи/приема данных ) производители ставят на свое усмотрение какую хотят.
И Это важно понять сразу, микроконтроллер похож на материнскую плату к которой присоединены разные вышеперечисленные устройства , и эти устройства для программиста - независимы от ядра (их перед работой нужно включать, настраивать как совершенно отдельные элементы, хотя они и находятся в одной микросхеме с ядром).
В микроконтроллерах есть регистры, регистры содержат данные. Одни данные (числа) используются для вычислений, другие данные (числа) для настроек микроконтроллера. В регистры записываются только двоичные числа. Регистры могут быть 8, 16, 32, 64 - битные, это значит что за один такт микроконтроллер может что то сделать с данными в регистре (записать/прочитать, произвести какое то вычисление). Чем больше разрядность регистров, тем большее число может быть обработано/перемещено за один такт.
Данный курс, будет посвящен работе с микроконтроллером STM32F407VG установленный на плате DISCOVERY, на ней есть все необходимое для изучения процессов протекающих внутри микроконтроллера, а также программатор, прошивающий как установленный МК так может использоваться для прошивки других МК. В качестве среды, будем использовать редактор Keil который можно скачать совершенно бесплатно на сайте компании, единственный минус бесплатной версии - это размер кода не должен превышать 32 килобайта. Но написать программу в 32 килобайта будет очень непросто, поэтому в первые несколько лет можно спокойно не заморачиваться по поводу редакторов.

3D Моделирование

Художники компьютерной графики, особенно направления в 3D, делятся на два типа: те кто умеют рисовать руками, и те кто не умеет. Тем кто рисует реально, намного проще, так как 90% у них уже есть то что надо для этого, а половину функций редакторов графики даже знать не нужно, остальные 10% нужных качеств занимает зависимость от аппаратных средств и знание самого редактора 3D графики.
Мы будем изучать 3D моделирование в редакторе Autodesk Maya , скачать последнюю версию Maya можно на официальном сайте, бесплатной 30-ти дневной версии вполне хватит чтоб пройти небольшой курс и создавать - любые 3D сцены: от дизайна интерьеров, архитектуры, и до работы в игровой индустрии, а перейти на любой другой редактор можно будет в любой момент, так как все 3D редакторы работают по одним и тем же принципам.
Мы не будем рассматривать средства выделения, перемещения и т.д, так как с этим не бывает проблем. Рассмотрим основные методы, которых достаточно чтоб сделать любую задачу быстро и качественно.
Объекты в 3D графике состоят из полигонов (плоскостей), ребер, и вершин которыми можно манипулировать - выделять, перемещать, изменять размеры, резать по полам. В основном, процесс моделирования (возьмем персонажа) происходит так: берется примитив - плоскость, из граней которой выдавливают новые грани и полигоны по образу "из головы". Есть методы для тех кто не обладает художественным обьемным мышлением : загружая в редактор фотографии человека или предмета с разных сторон,"наращивая" поверх них полигоны.
Но даже и этот метод устаревает, так как есть программы ( той же Autodesk) которые прямо по фотографиям с разных ракурсов создают модели в 3D, а остается только подправить несовершенство 3D сканеров.
Несмотря на тяжелые 3D редакторы с тысячами функций, для создания сцен любого уровня нужно всего с десяток, рассмотренных в этом курсе.

STM32. Программирование на СИ

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

*((uint32_t*)0x40020C00)=0b1010101000000000;


где сразу видно какие биты и какого регистра включены, а в документации можно увидеть что они делают, чем запоминать огромное количество слов из структур, где иногда ради установки одного бита нужно помнить 5-6 слов. Новичкам, не знакомым со всеми терминами и архитектурой микроконтроллера такой способ довольно запутанный.
Поэтому, никаких библиотек в примерах не будет. При создании проекта в Keil, не используйте имена проектов, документов, и папок в которых есть пробелы, это вызывает ошибку и недоумение у новичков - в чем дело.
Работать будем с широким использованием указателей и адресами.

WEB Разработка

WEB программирование, прежде всего это - разработка сайтов , и программ на сервере, которые определяют поведение сайта. Для написания этого сайта,iVARIOUS, использовались знания HTML,CSS,PHP,MYSQL. Стоит упомянуть то что огромную роль играет еще JavaScript, но его я стараюсь использовать минимум, в связи с тем, что программы на JavaScript зависят от версий и разработчиков браузеров. Также от версий и разработчиков браузеров в меньшей степени зависит и технология CSS, поэтому лучше использовать стандартные теги для описания элементов. Нет смысла описывать все HTML теги ( слова ), которые делают цвет текста, расположение элементов на странице и т.д , в интернете этой информации достаточно. Я разработал этот сайт всего за три месяца, не зная совершенно ничего о HTML,CSS,PHP,MYSQL.

HTML - язык гипертекстовой разметки, это еще не программирование, который говорит о размерах элементов, цвете , размере шрифта. Если нужно вывести заголовок страницы крупным шрифтом, пишем h1 Заголовок h1.
Есть размеры и поменьше - h2, h3, h4, h5, h6. Также с помощью HTML сообщает браузеру где на странице элементы будут в виде таблицы (table), списка , где будет картинка, видео и их размеры на странице.

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

Javascript - интерпретируемый язык программирования, тут уже начинается логика программ и поведения сайтов. Команды Javascript выполняются на компьютерах пользователей, поэтому в случае если на сайте будут происходить разные ресурсоемкие вычисления ( например интерактивные проекты в 3D ) лучше переложить работу вычислений на компьютеры пользователей. К сожаленью проблемы JavaScript те же что и в CSS, разные браузеры по разному понимают работу JavaScript.

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

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

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