Как выучить JavaScript с нуля
Некоторые старые языки умирают. Например, Алгол. Некоторые преобразуется во что-то новое. Например, Паскаль. Некоторые остаются, но уходят на второй план. Например, С++. А некоторые продолжают жить и развиваться. Например, JavaScript.
Несмотря на то, что JavaScript появился достаточно давно — в 1995 году, он до сих пор является одним из основных языков в веб-разработке (да и не только). Он впитал в себя мощь от С++ и простоту от Бэйсик. Поэтому и сегодня программисты JavaScript востребованы и не остаются без работы.
Однако современный JavaScript достаточно сильно отличается от своего далёкого предка. И хотя он сохранил относительную простоту, и основы языка вы также можете изучить довольно быстро, он бурно развивался и сегодняшние его возможности многократно расширились, по сравнению с 1995 годом.
Поэтому, если вы хотите знать не только основы, но владеть JavaScript в совершенстве и претендовать на высокооплачиваемые должности, вам придётся потратить немало времени и сил на обучение.
Потому что сегодня на JavaScript пишут программы не только для сайтов. И не только для серверов. Но и для компьютеров (причём с хорошей графикой).
Но и это ещё не всё! На JavaScript даже пишут программы для микроконтроллеров, где, как казалось ещё несколько лет назад, вечным фаворитом будет язык Си.
Итак, если вы решили изучить JavaScript самостоятельно, то я предлагаю вам обратить внимание на видеокурс Программирование на JavaScript с нуля до гуру 2.0, основные разделы которого перечислены ниже:
- Введение. Общие сведения о курсе, советы по его изучению. Общие сведения о JavaScript. Какое потребуется ПО и где его взять.
- Основы программирования на JavaScript. Как пишутся программы. Как выполнять отладку. Основы языка. Полезности из опыта прохождения собеседования.
- Объектно-ориентированное программирование на JavaScript. Раньше JavaScript не поддерживал ООП. Однако времена меняются. Теперь это объектно-ориентированный язык. В этом разделе изучаем ООП и особенности его применения в JavaScript.
- Стандартные функции и объекты в JavaScript. Любой язык программирования содержит множество встроенных функций и объектов. В этом разделе изучаем таковые в JavaScript.
- Работа с HTML-документом. Изначально JavaScript разрабатывался для работы с клиентской частью, основой которой является HTML-документ. В этом разделе разбираемся, как с этими документами работать.
- События в JavaScript. Любой современный язык программирования должен уметь обрабатывать события, такие как щёлчок кнопкой мыши или завершение загрузки документа. В этом разделе учимся работать с событиями в JavaScript.
- Асинхронность в JavaScript. Возможно, вы даже не знаете, что такое синхронность и асинхронность. Изучив этот раздел не только узнаете, но и поймёте. А также научитесь использовать.
- Сетевые запросы. Современный мир — это сеть. Без умения работать с сетью вы не сможете стать профессионалом и претендовать на высокую зарплату. В этом разделе вы научитесь работать с сетью, а в практическом уроке сможете создать свой собственный чат.
- Упражнения. Теория без практики мертва. Почти к каждому уроку в видеокурсе прилагаются тщательно продуманные и подобранные практические упражнения.
Ну и куда же без подарков? К этому видеокурсу их прилагается аж 5 штук!
- Библиотека jQuery. Более 10 видеоуроков об одной из самых востребованных библиотек.
- Защита JavaScript-кода от копирования. Если вы не хотите, чтобы ваши разработки были доступны каждому посетителю вашего сайта, вы можете защитить свой код от копирования. Как? Об этом расскажет данный мини-курс.
- Решение упражнений из курса. Если вы решите все упражнения из курса самостоятельно, то вы большой молодец. Однако даже в этом случае вам не помешает посмотреть, как это делает опытный программист.
- HTML для начинающих. даже если вы уже знаете HTML, этот курс не будет лишним, поскольку он рассказывает о HTML5 — последней версии этого языка.
- CSS для начинающих. На тот случай, если вы не знаете CSS или знаете не очень хорошо. Или не слышали о том, что сейчас действует 3-я версия CSS.
Ну и напоследок немного статистических сведений о курсе. Итак, это:
- 72 урока общей продолжительностью 13,5 часов.
- Пять мини-курсов в подарок (51 урок общей продолжительностью более 13 часов).
- Множество упражнений с решениями.
- Все исходные коды из курса.
- Поддержка от автора.
- Гарантия возврата средств, если курс вас не устроит.
Курс React Js С Нуля До Создания Spa Приложения
Для просмотра адреса в вашем браузере должен быть включен Javascript. Результатом курса будет небольшое приложение новостей, в котором можно добавить новость, а так же посмотреть у новости “подробнее”. Мы используем куки для наилучшего представления нашего сайта. Если Вы продолжите использовать сайт, мы будем считать что Вас это устраивает. KIRUPA предлагает универсальный бесплатный курс, который включает в себя как видео, так и текстовые учебники. Он охватывает все основы React, а также некоторые более продвинутые варианты его использования. Это официальное руководство предназначено для абсолютных новичков (хотя рекомендуется иметь базу HTML и JS). В нем вы пройдете процесс создания интерактивной игры tic-tac-toe. Это идеальное введение в концепцию написания приложения с помощью React. Чаще всего базовые курсы программирования не требуют специальной подготовки. Для продвинутого обучения достаточно материала предыдущего курса. Курсы Angular 8 Basic онлайн основаны исключительно на нашей образовательной программе, которая была создана на базе современных материалов и техник в мире информационных технологий. Мы поможем тебе получить только самые необходимые и актуальные знания, которые предоставляет курс Angular 8 Basic, чтобы начать работу разработчика сразу по окончанию курсов.
Как Узнать Стоимость Обучения?
Обучение проходит эффективнее, если студент уже имеет опыт работы с другими фреймворками, как например ECMAScript 6, Babel.js. Веб-дизайнеру, frontend-специалисту, который хочет освоить новые технологии создания сайтов. Студенты курса имеют возможность улучшить свой технический английский и посещать курсы английского и Speaking Club в течение всего периода обучения. Имена ссылок соответствуют названиям свойств объекта. Сами же стили присваиваем компоненту с помощью пропса style. Он будет отвечать только за рендер нашего массива картинок. Позже обернем его в компонент высшего порядка, который будет передавать ему в пропсах данные и функции для выполнения при взаимодействии с ним. Таким образом мы немного отделим логику и данные от представления. Свойство collection— это ссылка на JSON-файл с набором картинок с сайта. Кроме того, дипломный проект можно смело включить в собственное портфолио. Twitter продолжал работать, но пропал счетчик символов, без которых трудно понять, сколько еще осталось до конца сообщения. Я мог открыть сайт Wired, но не мог просматривать или оставлять комментарии. Достаточно легко react курсы отключить JavaScript, просмотреть веб-страницы, найти неработающие вещи и исправлять их. Но этот сайт или его функция можно спроектировать так, чтобы работать без JavaScript. Легко не заботиться о человеке, который намеренно отключил часть веб-браузера и все еще хочет, чтобы все работало.
Получить Программу Курса React
- Но как по мне, RN идеально подходит для контентных приложений или для Курсы React во Львове тех, где не требуются серьезные вычисления.
- Во время курса вы создадите три уникальных компонента с нуля.
- Также, более детально определяем последовательность действий в продвижении — источники/каналы распространения и целевые действия пользователя.
- У React Native уже достаточно большое комьюнити, разработавшее решение для большинства проблем, встречавшихся еще несколько лет назад.
Полный онлайн курс Angular 8 Basic в ITEA — это максимальный акцент на практике. Мы не используем во время занятий скучный и устаревший материал. Мы детально прорабатываем каждый аспект, чтобы познакомить студентов с теорией и подкрепить ее практическими задачами. Завершив изучение, ты приобретешь богатый опыт, который оценит каждый современный разработчик. Диджитал-агентство “Brander” занимается разработкой сайтов и приложений для бизнеса уже более 10 лет. Одна из главных причин обратить внимание на React Native — примеры приложений.
Как Выучить Javascript С Нуля Самостоятельно
Это невероятная возможность создавать кроссплатформенный системы, тратя меньше времени и получая полноценные приложения. Поддержка и комьюнити достаточно мощные, и это дает возможность развиваться в этом направлении. На самом деле по сравнению с другими приложениями, здесь не заторможенности интерфейса. Функциональный подход и redux позволяет создавать масштабные программы.
После завершения урока обучающиеся познакомятся с возможностью работать с формами в React, а также с такими понятиями как подъём состояния и валидация с PropTypes. После завершения урока обучающиеся познакомятся с подвидами компонентов, узнают, что такое state в React компонентах, научатся добавлять события к элементам и работать со списками. После завершения урока обучающиеся познакомятся, что такое JSX, научатся писать простые компоненты с помощью JSX.
В то же время происходил рост популярности React, React Native и GraphQL. Я искал ресурсы, которые бы помогли мне научиться совмещать все эти компоненты, но ничего не нашел. Так что эта книга представляет собой руководство, которого мне тогда очень не хватало.
Курс “React с нуля для начинающих” позволит не только освоить азы данного инструмента, но и получить современные продвинутые техники его использования. В курсе используется последняя актуальная версия React 17. Видеозаписи лекций без обратной связи и участия преподавателя.
Информацию берите из нескольких источников или от разных авторов, чтоб сравнить несколько подходов выполнения одной и той же задачи. JS применяется на фронтенде, бэкенде, для разработки мобильных приложений, поэтому вакансий предостаточно и работа будет всегда. Его стоит изучать тем, кто планирует с нуля войти в сферу IT и интересуется разработкой вебсайтов или мобильных приложений. Курс актуален для Front end/Full Stack разработчиков уровня junior+, желающих научиться писать собственные SPA, а в дальнейшем и Mobile App.
У вас уже должна быть рабочая установка Cordova с настроенной Android Studio / Xcode. Если нет, то в туториале есть ссылка на веб-сайт Quasar, где они показывают, как это настроить. Из этого туториала вы узнаете, как создать приложение, используя Svelte 3 от начала до конца. Он использует компоненты, стили и обработчики событий.
Записаться На Курс
Команда нашей компании разрабатывает решения для бизнеса, сервисные, рекламные продукты, программы для служб такси, сферы образования, онлайн-коммерции, стартапов и другие проекты под заказ. Конечная цель этой книги – научить вас использовать возможности одного только javascript для создания всех видов приложений. Идея этой книги возникла у меня после написания первого десктопного приложения на Electron. Сделав карьеру веб-разработчика, я был захвачен возможностями использования веб-технологий для создания кроссплатформенных приложений.
Независимо от того, новичок вы в программировании или уже опытный разработчик, изучение новых концепций и языков/фреймворков — обязательно, дабы не отставать от быстрых изменений. Регистрация и оплата аккаунта в магазинах осуществляется самим заказчиком. Когда-то используемый в основном для добавления интерактивности в окна веб-браузера, javascript теперь является основным строительным блоком мощных и надежных приложений. Скотт охватывает такие технологии, как Node.js, GraphQL, React, React Native и Electron.
Дальше Expo создаст папку с проектом под тем названием, которые вы указали в slug, и сам установит необходимые зависимости. Если вы все сделали правильно, то при запуске команды npm run startу вас в консоли отобразится информация о том, что приложение сбилдилось, и появится QR-код для открытия его в приложении Expo. В браузере откроется соответствующая страница, в которой также будет консоль live reload и UI для запуска эмуляторов. Пишем название проекта и его текстовый идентификатор. Если у вас установлен Yarn, то Expo предложит использовать его вместо npm.
Бесплатные курсы программирования

Это полностью бесплатная платформа для изучения основ программирования с нуля. Code Basics был создан разработчиками и сообществом Хекслет для того, чтобы любой желающий мог попробовать себя в программировании и заложить правильный фундамент для новой профессии, основанный не на запоминании специфики, а на понимании системы в целом.
А если что-то не получается?
Спрашивайте! В каждом уроке есть раздел «Обсуждение». Здесь можно задать вопрос, уточнить условие задания, если оно кажется вам непонятным. Ответит наша поддержка или другие пользователи. Обсуждения доступны для всех, вы тоже можете отвечать на вопросы и помогать другим ученикам в освоении новой профессии.
При выполнении практики также советуем внимательно читать вывод тестов – в нем содержится информация о том, почему решение не проходит. А еще вы можете сравнить свой результат с готовым решением. Впрочем, не советуем обращаться к нему до тех пор, пока успешно не выполните задание. Помните – вы учитесь, а не повторяете.
Как начать обучение?
Достаточно просто зарегистрироваться. Регистрация на платформе бесплатная, после регистрации вы получите доступ ко всем курсам Code Basics. Выбирайте любой – и проходите.
Как проходит обучение?
Code Basics – полностью автоматизированная онлайн платформа. Поэтому вы можете заниматься в любое удобное время, когда захотите.
Курсы программирования состоят из тематических блоков, в каждом есть несколько уроков. Проходите уроки последовательно: сначала изучите теорию, потом выполните практическое упражнение прямо в браузере – система проверит его автоматически.
Чему здесь можно научиться?
Вы можете познакомиться с основами языков JavaScript, PHP, Java, Python, Ruby, Go, C# и другими. Также на Code Basics доступны курсы по HTML и CSS.
Для кого курсы?
Курсы Code Basics подходят для всех, кто начинает изучать программирование с нуля. Возраст, профессия – не имеют значения. На Code Basics занимаются взрослые и подростки, технари и чистые гуманитарии.
Какие возможности есть для практикующих разработчиков?
Code Basics – проект с открытым исходным кодом. Участвовать в его развитии может любой практикующий разработчик. Исходный код доступен на GitHub. Вы можете помочь в создании новых курсов и уроков, улучшать существующие, исправлять неточности и опечатки, переводить курсы на английский язык.
Как самостоятельно выучить JavaScript? Топ бесплатных курсов для начинающих!


Так вот почему всех программистов красные глаза! Они просто в душе коммунисты!

1 день назад

Так станет проще работать

2 дня назад

Как проклятие невидимой стены ждало меня 20 лет
- Автор:kesn
- Больше интересных фото и комментариев воригинале материала

Когда на меня накатывает хандра, я бросаю всё и пилю свой игровой движок. Это неблагодарное занятие, но меня прёт.
В самом начале у меня были такие планы: вжух-вжух, щас возьму ведро, накидаю туда всяких библиотек для графики, физики и звуков, добавлю сетевую библиотеку по вкусу, перемешаю всё с какой-нибудь системой сообщений, и готово. Приключение на 15 минут.
И вот я тут спустя 5 лет.
Ладно, если быть честным, то я почти не уделял времени разработке, потому что постоянно спотыкался на всяких бесящих меня ошибках: то сериализация не работает с наследованием, то потоки не хотят нормально разделять память, то обновление языка ломало совместимость… Я могу, блин, целую Камасутру написать про соитие с игровым движком. Все эти ошибки сильно демотивируют, потому что хочется уже наконец-то заняться делом, а не ковыряться с байтиками.
Это не моё видео, но оно очень точно передаёт, как у меня происходит разработка:
С другой стороны, конечно, когда эти проблемы решаешь, чувствуешь себя богом и королём жизни, и после этого ты вроде как опять хочешь программировать. И даже кажется, что это была последняя трудность. Ха-ха, наивный. Но мне это нравится. Типа как альпинисты идут в гору и страдают, когда можно пойти в бар с друзьями и попить пивко. Каждому своё.
Ну и вот про одну такую ошибку я хотел поговорить. Есть такой движок — ODE (Open Dynamics Engine). Он появился где-то в палеолите, динозавры его накодили, от документации остались только царапины на скалах. Но он работает, он простой в использовании, и у него есть сишные заголовки, поэтому я мог просто написать враппер на Nim и использовать его в своём движке. В Nim вообще ни хрена нету, поэтому канонический способ — это взять какую-нибудь библиотеку из Си, научиться её вызывать, а потом говорить всем, что ты написал крутую программу на Nim.
Итак, сначала я просто добавил кубики на сцену и отрисовал их. Физический движок был в полной гармонии с графическим, и когда мне графика отрисовывала, что я приближаюсь к кубу и толкаю его, кубик действительно отлетал и вращался. Короче говоря, всё шло так, как я и планировал.
Разумеется, если вы не планируете делать Minecraft, то вам может понадобиться что-то поинтересней, чем кубик. В ODE есть специальный класс Trimesh, который как раз позволяет вам сделать сложную геометрию. Фактически, вы можете создать любое тело из набора треугольников. Типа такого:

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

Я создал треугольник, он успешно отрисовался на сцене, я начал ходить по миру… и обнаружил, что треугольник не в том месте, где нарисован, а где-то непонятно где.
Так и появилась эта дурацкая невидимая стена.
Фактически, я мог ходить по сцене, и где-то я упирался в тот самый треугольник, который вообще-то должен был быть там, где нарисован. Я в принципе даже что-то такое и ожидал, потому что, как я уже где-то писал, только три раза в своей жизни я написал код, который заработал с первого раза. Наверняка я где-то перепутал координату — вместо X передал Y, или наоборот, ну что-нибудь такое. Эти программисты, вы знаете!
Отрисовать этот треугольник я не мог, потому что координаты были правильные, графический движок всё отрисовывал правильно, но вот физический движок как-то неправильно интерпретировал мои правильные данные. Поэтому я стал ходить по миру и пытаться определить очертания этой невидимой стены. В конце концов я её нашёл (она была достаточно странной), и я решил немного подвигать треугольник, чтобы посмотреть, как он влияет на эту стену. Казалось бы, если я просто где-то перепутал координаты, то подвинув треугольник, я немножко подвину эту стену. Но хрен мне там! Стена исчезала и появлялась совершенно случайно, прыгала далеко даже от малейшего изменения координат, и я не мог понять, почему.
И тут я вспомнил эту недалёкую женщину из заЩИТников! Если кто не знает, она сделалась невидимой и решила спрятаться в дожде. Отличный план, надёжный, как швейцарские часы:

Я подумал, что это прям мой случай, и решил полить свою стену дождём, чтобы увидеть её. Дождя у меня не было, зато были кубики, поэтому я создал штук 50 и стал кидать их вниз. При касании стены они к ней прилипали, и я мог видеть её очертания. А когда что-то видишь — отлаживать в разы легче!

Что ж… Это была хорошая попытка понять, по какому закону стена появляется в том месте, где она появляется, но это мне ничего не дало. Даже видя эту стену, я не находил никакой закономерности.
Если нужно где-то найти таких же неудачников, как я, то самое лучшее место для этого — интернет. И я нашёл его — единственного человека, который отстрадал своё и рассказал об этом. Представляете, в 2006 году у какого-то чувака из Германии пятая точка горела точно так же, как у меня сейчас! Не знаю, что он выкурил (похоже, что исходники), но, ОКАЗЫВЕТСЯ, физический движок ожидает от вас трёхмерные точки, но передавать их надо как четырёхмерный вектор, просто в четвертой координате надо поставить мусор, типа так: [x1, y1, z1, 0, x2, y2, z2, 0, . ]. Скажите, как по const dReal* Vertices я должен понять, что там ждут в гости четырёхмерные вершины?

За что я люблю опенсорс — можно всегда докопаться до истоков всего. Я полез в исходники, и вот что обнаружил.
В 2003 году пришёл Russel Smith и добавил всю эту функциональность с trimesh collisions, в том числе интересующую меня строчку:

Тут всё понятно, потому что в определении чётко говорится, что dVector3 — это четырёхмерный вектор (есть некий шарм в этой логике).
А потом через пару месяцев врывается Erwin Coumans и переписывает так, чтобы тип был непонятен:


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

Вообще этот пост был задуман как развлекательный, типа «смотрите, погромист опять страдает, хахаха». Но мне кажется, что он поднимает достаточно глубокую проблему: как только вы выкладываете код, он начинает свой долгий путь сквозь время. Никто не знает, когда и кто его будет читать — может, вы или ваш коллега через пару месяцев, может, тысячи независимых разработчиков через пару лет, может, какой-то парень с горящим продом.
Получается такой вот эффект бабочки, как с этой невидимой стеной. Поэтому когда вы в следующий раз сядете писать код, представьте, что какой-то разраб через 20 лет будет в нём разбираться, и, пожалуйста, постарайтесь сделать жизнь этого чувака хоть чутоку легче. Ведь однажды этим кем-то можете оказаться вы сами.
Не только лишь все могут смотреть в будущее, но вы сможете, если подпишетесь на мой уютненький канал Блог Погромиста.
А ещё я держу все свои яйца в одной корзине (в смысле, все проекты у одного облачного провайдера) — Timeweb. Поэтому нагло рекламирую то, чем сам пользуюсь — вэлкам.
Показать полностью 9 1
3 дня назад

Если ты ростом ниже 185, то даже знание плюсов тебе не поможет

5 дней назад

Интересно, а сколько разработчиков в мире используют только свой код?

Показать полностью 1
11 дней назад

Гилфойл ерунды не скажет

Показать полностью 1
11 дней назад

Что заставляет программистов писать вирусы
Материал был взят и переведен с Рэддита. Приятного прочтения!
1. В 7 классе я ходил на кружок программирования, который фактически превратился в кружок по созданию вредоносных программ. Мы с другом написали программу, которая постоянно открывала на компьютере один сайт для взрослых и врубала звук на полную мощность. У нескольких человек этот сайт открылся прямо на уроке. Было весело.
2. Я написал эту программу ради азарта. Это был аддон для Воркрафта. Он запускался, когда персонаж входил в игру. А потом персонаж получал приглашение в гильдию от игрока с заряженным аккаунтом и сам становился главой гильдии. После этого можно было идти в игровой банк и забрать оттуда все ценное. Написать код было просто, но вот протестировать его работу с помощью приемов социальной инженерии очень сложно. Но мне повезло с первого раза. Прилив адреналина был колоссальным, но я также понимал, что меня, скорее всего, забанят в этой игре. Моей следующей целью была высшая рейдерская гильдия на сервере. Чтобы убедить лидера гильдии участвовать в моем тестировании, понадобился час разговоров по скайпу. Он попался на крючок, и все почти получилось. Я знал, что у этой гильдии игровых ценностей на сотни тысяч долларов. Глава установил аддон, но потом я понял, что он вошел через альтернативного персонажа, не имевшего доступ к богатству гильдии. Так у меня все провалилось. Меня выгнали из гильдии и забанили. Позже мне удалось вернуть свой аккаунт, но без тех ценностей, которые я награбил раньше.
3. В юности я создал несколько троянов удаленного доступа. С их помощью воровал аккаунты в разных играх и продавал их в интернете. Когда я впервые запустил троян, было 200 загрузок и 90 заражений. Половину угнанных аккаунтов я отдал другу, который помогал писать программу. Потом продал два акка и купил попугая, потому что люблю птиц. А потом старший брат объяснил, что все это плохо и незаконно, и я остановился.
4. Раньше вирусы создавались ради демонстрации крутости и были не особо вредными, это во времена Дос и вплоть до Виндовс XP. Потом появились черви для кражи паролей. Потом ботнеты, а они уже только ради денег. Они крадут данные, пароли, откровенные фотки, все подряд, для последующей продажи. Потом киберпреступники научились использовать сторонние компьютеры для майнинга, взлома сайтов и прочего дерьма.
5. У меня есть друг, который мошенничал с кредитками, крал личные данные, информацию с компьютеров, используя для этого кейлоггер, замаскированный под ссылку для скачивания. В школе он начал продавать вещи и одежду всем, включая меня. А через два года за ним приехали из ФБР и увезли, хотя он и был несовершеннолетним. Ему пришлось заключить сделку и вернуть товаров на 50 тысяч долларов. А еще он взломал главу отдела безопасности Xbox, про это есть видео на ютубе.
6. Когда-то я любила троллить людей в чатах, рассказывая, что у меня есть постеры с Бритни Спирс, но для их закачки надо открыть файл, который я пришлю. Так я получала доступ к компьютерам жертв. Могла полностью просматривать жесткий диск, скачивать, что мне надо, удалять с компьютера файлы. Однажды я стала удалять кучу всего с компьютера парня, с которым в это время общалась в чате, и он заплакал. Мне стало жаль его, и я прекратила, и больше никогда этим не занималась.
7. Я занимался этим ради денег. Уже в старших классах я занимался черным СЕО и восстановлением сайтов. Потом я познакомился с парнем, который придумал, как через песню из альбома вшить ссылку. Эта программа случайным образом одну из песен на компьютере превращала в ссылку. Когда человек хотел прослушать ее, всплывала надпись, что надо скачать кодек. Он скачивал, и я получал 10 центов. Свою ссылку мы размещали на торрентах, скачиваний было много, денег хватало. Позже я стал нанимать индусов, чтобы они распространяли по торрентам файл с этой ссылкой. Мне тогда было 16, и я за месяц заработал 4 тысячи долларов. Это было круто, учитывая, что на черном СЕО и сайтах у меня выходило около тысячи в месяц. А через несколько месяцев все пошло наперекосяк, и я стал заниматься другими делами.
Похожие подборки без цензуры и купюр ежедневно выходят на моем канале https://t.me/realhistorys
Всем здоровья и добра!
Показать полностью
Поддержать
12 дней назад

Как понимать мемы про айти?

12 дней назад

3D видеокарта-«декселератор» из 90-х. Как работала S3 ViRGE «под капотом»?

Друзья! Многие ли из вас застали такую легендарную видеокарту, как S3 ViRGE? Когда-то этот GPU стоял чуть ли не в каждом втором офисном компьютере: благодаря дешевизне и заявленной поддержке 3D-ускорения, эту видеокарту просто сметали с полок магазинов. Далеко не все могли себе позволить ATI Rage, Riva TNT и уж тем более 3dfx Voodoo и очень разочаровывались в свежекупленной видеокарте, когда пытались поиграть в новомодные игры тех лет. На момент написания статьи, в сети слишком мало материала о том, как работали видеокарты 90-х «под капотом», однако мне удалось найти даташит на видеочип, SDK для программирования 3D-графики специально под него и некоторую документацию. Я решил исправить это недоразумение и начать развивать отдельную рубрику о работе старых видеочипов: начиная от S3 ViRGE и заканчивая GPU PS2 и PSP. Сегодня мы с вами: вспомним о S3 ViRGE, узнаем о том, как работали видеокарты в 90-х годах, затронем 2D и 3D режим и почему они тесно связаны между собой, посмотрим на проприетарное графическое API S3 ViRGE и раскроем причину, почему же этот GPU был таким медленным!
❯ 3D графика на ПК: начало
В начале 90-х годов 3D-графика на обычных домашних компьютерах была редкостью. Профессиональные GPU применялись только на дорогущих графических станциях, которые использовались в кинематографе или различных симуляциях, а также на дорогих японских игровых автоматах. У простого обывателя не было доступа к аппаратным средствам рендеринга 3D-графики.

Однако это не значит, что 3D-графики не было вообще. Прогресс развития домашних процессоров шёл семимильными шагами и гиганты рынка —Intel,AMDи в некоторой степени Cyrix, выпускали всё новые и новые процессоры с повышенными тактовыми частотами, а ближе к середине 90-х — и с SIMD (MMX). Поскольку многие техники для отрисовки трехмерного изображения были разработаны ещё в 60-х — 70-х годах, игроделы к началу-середине 90-х во всю использовали некоторые наработанные техники из кинематографа для растеризации 3D-графики прямо на процессоре — так называемыйсофтварный рендеринг.

Одной из самых известных техник 90-х являлась 2.5D графика с использованием рейкастинга — когда картинка на экране выглядит как трёхмерная, однако по факту весь мир представлен в виде 2D-координат, а эффект «пола и потолка» был как бы фейковым. Принцип его работы довольно прост: от глаз игрока для каждого горизонтального пикселя (т. е. при разрешении 240х320, у нас будет 240 проходов) пускаются «лучи» и ищется пересечение с ближайшей стеной относительно угла обзор из глаз игрока. Из этого пересечения берется дистанция до этой стены (на основе дистанции и угла считается «высота» данной строчки стены) и считается какую строчку текстуры необходимо вывести в этой точке. Одними из первых игр с применением этой технологии стал Hovertank и Wolfenstein 3D, а технология применялась практически до конца 90-х. Одной из самых лучших реализаций рейкастинга — движок Duke Nukem 3D, Build Engine, написанный Кеном Сильверманом.

Однако не одним 2.5D мы были едины. Шли годы, в СНГ многие люди продолжали наслаждаться 8-битными и 16-битными играми на клонахNESи SMD. У некоторых уже появлялась PS1, которая позволяла играть в игры с довольно хорошей 3D-графикой, однако на ПК 3D-игры были доступны не всем. Но в 1996 году выходитQuake— новейший шутер от первого лица от id Software с настоящей, трушной 3D-графикой и переворачивает всю индустриюFPSс ног на голову. Посудите сами: Джон Кармак умудрился реализовать достаточно быстрый софтварный рендерер, который мог вполне сносно работать на Pentium 75Мгц в разрешении 320×240. А ведь помимо отрисовки кадра, игре нужно было просчитывать логику монстров (довольно примитивную, к слову), обрабатывать столкновения, просчитывать видимую геометрию с помощью BSP-дерева и обрабатывать клиент-серверную логику самой игры. Это была самая настоящая революция в мире 3D игр на ПК.

В 1997 году, id Software выпустили glQuake — порт Quake с софтрендера на OpenGL, плюс своеобразную прослойку для совместимости с API 3dfx Glide (на видеокартах Voodoo) и подмножества OpenGL, используемым в игре. Порт на OpenGL позволял разгрузить ЦПУ, перенеся всю отрисовку графики с процессора на 3D-ускоритель. Сам по себе, OGL как графическое API, представлял из себя лишь набор спецификаций, который мог быть реализован как в программном виде, так и в аппаратном производителем видеокарты (на примере Windows — OpenGL32.dll это программная реализация, которая при необходимости обращается к atioglxx.dll/nvoglvxx.dll — аппаратной реализации OpenGL от вендора видеочипа). Однако, OpenGL корнями уходил именно в отрисовку промышленной графики, а DirectX всё ещё находился в зачаточной форме, из-за чего многие производители разрабатывали собственное графическое API: из известных мне, могу подчеркнуть ATI CIF (C Interface), 3dfx Glide и проприетарное SDK S3 ViRGE. Некоторые вендоры поддерживали целые игровые движки — например, BRender и RenderWare.

Отдельные 3D-акселлераторы потихоньку начали завоевывать сердца геймеров и создавать новый сегмент рынка. Серьезные видеокарты от известных производителей, такие как 3dfx Voodoo, ATI Rage и Riva TNT стоили достаточно дорого и многим были не по карману. Зато существовало множество видеокарт с 3D-ускорителями от других производителей, про некоторые из них вы могли даже не слышать: отдельные дискретные видеокарты Intel (i740), видеокарты от производителя чипсетов SiS и конечно же, видеокарты от S3 с сериями ViRGE и Savage. Видеочипы от Intel и SiS делали упор на D3D 7.

S3 ViRGE была весьма неплохой видеокартой с точки зрения 2D-ускорения. Сейчас 2D принято считать частным случаем 3D (по факту, 2D-спрайты — это 3D-квады, состоящие из двух треугольников), однако в то время для работы с памятью видеокарты и аппаратного ускорения некоторых операций, таких как блиттинг (BitBlt) существовало отдельное графическое API — DirectDraw. С этим у ViRGE было всё хорошо — он поддерживал довольно высокое разрешение экрана (при желании, объём видеопамяти можно было нарастить и установить разрешение ещё выше) и умел ускорять часть операций как DDraw, так и GDI.
Однако, ViRGE разочаровывал многих геймеров 90х своей производительностью в 3D-графике. На коробке с бюджетной видеокартой красовались красивые надписи о 3D-графике следующего поколения, а на фотографии можно было увидеть некую игру про мехов с невиданной графикой!

По факту, ViRGE подходил для 3D-игр не особо хорошо. Конечно в те годы никто особо не плевался от FPS и при желании, игру могли пройти и в 15, и в 20 FPS. Однако производительность софтварного рендерера иногда была даже выше, чем у растеризатора ViRGE, а игры должны были быть специально адаптированы под неё (т. е. портированы для использования S3DTK). Тайтлов с адаптацией по этот GPU было немало: как минимум, Tomb Raider и MechWarrior 2 (который шел в комплекте с игрой). Польские ребята из известной многим Techland даже написали прослойку S3D -> OpenGL, позволявшей запускать Quake на ViRGE. Производительность была не ахти…
Видеокарт от S3 нашлись и у меня, причём сразу несколько — ViRGE в PCI-исполнении и Trio в AGP-исполнении! Иногда я их использую для проверки старых материнских плат, которых у меня не так уж и много — рабочих на PGA370 и ниже у меня совсем нет. Однако остаётся вопрос, как эти видеокарты работали под капотом? Давайте узнаем!
❯ «Под капотом»
Исторически сложилось так, что 3D и 2D акселераторы могли быть отдельными и формально не зависящими друг от друга устройствами. Архитектура IBM PC в зависимости от «поколения», предполагала сразу несколько типов видеоадаптеров, которые были стандартизированы под определенный тип мониторов. Один из таких адаптеров, VGA, стал стандартом на долгие годы, в то время как два других использовались в совсем ранних машинах. Их ключевое отличие было в организации видеопамяти и цветности — CGA/EGA предполагал разбитие пространства экрана на т. н. битплейны (один байт содержал информацию о нескольких пикселях и если не ошибаюсь, для сохранения адресного пространства сегменты экрана необходимо было переключать аля банки памяти) и былпалитровым, в то время как VGA предполагал как палитровый режим, так и полноценный RGB и мог отразить весь фреймбуфер в линейную область адресного пространства. Кроме того, долгое время VGA использовался для обозначения разрешения дисплея: QVGA — половина VGA (320×240), VGA (640×480), широкоформатный WVGA (800×480) и т. п.

Другой особенностью была полная (насколько мне известно) обратная совместимостью друг с другом. Например, GeForce 7xx, как один из последних GPU, который поддерживал Legacy BIOS, теоретически вполне мог работать и с EGA режимами, и с CGA через соответствующие видеорежимы int 10h!
3D-режимы же никак не были стандартизированы и каждый производитель реализовывал работу с ними по разному — как уже говорилось ранее, кто-то реализовывал поддержку совсем молодого D3D и OpenGL (насколько мне известно, лучше всего с OpenGL было у NVidia. Остальные вендоры поддерживали OGL, но были свои болячки — у ATI они тянулись чуть ли не до середины-конца нулевых), а кто-то делал собственное графическое API и работал с видеочипом почти напрямую. Первые 3D GPU использовали шину PCI, которую почти сразу заменила более скоростная, но интерфейсно и софтварно почти идентичная шина AGP, а затем уже появился PCI-E, который оставался тем же PCI в софтовом плане, но был дифференциальным и последовательным, а не параллельным как интерфейсы-предшественники.

Дабы понять, как работают первые видеокарты, необходимо узнать о том, как происходит процесс отрисовки 3D-графики в общем случае. В мире программирования графики это называетсяконвейероми состоит он как минимум из нескольких этапов:
Установка состояний: Программа задаёт источники света на сцене, параметры Z-буфера и Stencil-буфера, какую текстуру(ы) следует наложить на рисуемую геометрию и с какой фильтрацией, какой тип аппаратного сглаживания использовать и т. п.
Ранее, каждый стейт необходимо было устанавливать отдельно, при необходимости — для каждого DrawCall’а. После подготовки состояния, программа вызывает соответствующую функцию отрисовки.
Обработка геометрии: Геометрия не поступает в растеризатор «как есть», в мировых координатах. Растеризатор оперирует вершинами в нормализованныхClip Spaceкоординатах — обычно, это [-1, -1… 1, 1], где 0.5 — центр экрана по каждой оси. Именно поэтому сначала необходимо провести этап трансформации геометрии для перевода из некой глобальной системы координат (которая может выражаться в метрах или, например, в пикселях) в Clip Space. Для этого чаще всего координаты (корректнее — трансформации) представляются в виде трех перемноженных матриц — model (мировые координаты геометрии), view (положение «глаз» в мире, или по простому камера. Умножая model на неё, мы получаем координаты объекта в пространстве камеры) и projection (матрица проекции, которая преобразовывает координаты из пространства глаз в тот самый Clip Space. Именно в этой матрице задается FOV для перспективной проекции и виртуальные размеры экрана для ортографической матрицы). После этого, координаты каждой вершины трансформируются полученной ModelViewProjection матрицей и получается финальная позиция для Clip Space. Звучит как сложный учебник матану, по факту всё очень просто. 🙂

Детали реализации низкоуровневого матана, в том числе перемножения матриц и построения матриц трансформаций и проекции знать желательно, но необязательно. Сейчас этим занимаются очень удобные математические библиотеки — например, glm, dxmath или d3dx.
Кроме того, ранее именно на вершинном этапе считалось освещение для уровня. В некоторых видеочипах была возможность аппаратного расчета источников света, в некоторых — только программная на ЦПУ.
На видеокартах тех лет, в том числе и S3 Virge, трансформацией вершин занимался центральный процессор, из-за чего было довольно серьёзное ограничение на количество вызовов отрисовки и число треугольников в одной модели. Видеокарты с аппаратной, но всё ещё не программируемой трансформацией вершин появились лишь к GeForce 2 — называлась эта технология T&L (Transform and Lightning) и её преимущество было в том, что у видеокарты были специализированные векторные сопроцессоры, способны быстро пересчитывать векторные операции (а у ЦПУ, в свою очередь, развивались SIMD наборы инструкций, позволяющие выполнять несколько операций над float одновременно). В некоторых случаях, был даже отдельный программируемый векторный сопроцессор как, например, в PlayStation 2, что позволяло реализовать вершинные шейдеры ещё в 2000 году! На современных видеокартах, этапом трансформации в самом простом случае управляют вершинные шейдеры. Помимо этого, есть возможность создания геометрии «на лету» с использованием тесселяции и геометрических шейдеров, а совсем недавно появились Mesh-шейдеры, которые объединили несколько подэтапов конвейера в один.

Растеризация: Сам процесс отрисовки геометрии на дисплей с данными, полученными с прошлого этапа. Именно на этом этапе треугольники (или иные геометрические примитивы) закрашиваются определенным цветом или на них накладывается текстура. В процессе растеризации есть такое понятие, как интерполятор — специальный модуль, который интерполирует несколько значений в барицентрических координатах растеризуемого треугольника, дабы текстурный юнит мог наложить определенный участок текстуры на фрагмент треугольника.
В современных видеокартах этот этап конвейера программируется пиксельными (или фрагментными) шейдерами. В старых видеочипах (исключение — вроде-бы частично программируемый GPU Nintendo 64, поправьте в комментариях, если не прав) этот процесс строго определен в каждом GPU и не программировался. Именно поэтому такой подход к рисованию графики назывался Fixed function pipeline. Были ещё комбайнеры, но они появились заметно позже — когда в видеокартах появилось уже несколько текстурных юнитов, способных смешивать несколько текстур одновременно.

Делая вывод, мы можем понять, что S3 Virge и другие видеочипы были устройствами, которые умели рисовать лишь тот уровень графики, который был заложен производителем с завода. Такой подход называется фиксированным конвейером — Fixed Function Pipeline. Сейчас разработчики видеочипов перешли с фиксированного конвейера на программируемый (шейдерный). Уже начиная с SM2.0-SM3.0, на современных видеокартах появилась возможность создавать крутое и достаточно сложное освещение и различные эффекты, которые стали неотъемлемыми в современных играх.
Кроме того, важно понимать, что в видеопамяти ранних видеочипов хранился только фреймбуфер, а немного позже — текстуры, именно поэтому VRAM в старой документации называют «текстурной памятью». Вообще, некоторые нюансы первых версий OpenGL тянуться именно из особенностей работы первых видеокарт. Вспомнить хотя бы первые функции для старта отрисовки геометрии и загрузке вершин на видеокарту — это были связки glBegin/glVertex/glEnd:
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(1, 0, 0);
glVertex3f(1, 1, 0);
glEnd(); // Для одного треугольника
glBegin(GL_TRIANGLES);
for(int i = 0; i
glEnd(); // Для меша
Даже сам glBegin/glVertex/glEnd появились не спроста. Геометрию на видеокарте начали хранить только в начале нулевых (и то не везде — привет встройкам Intel и S3).
Но перейдем к особенностям работы S3 ViRGE. Даташит лежит в свободном доступе, благодаря чему мы можем более подробно ознакомиться с характеристиками этого видеочипа и о том, как он работал под капотом.

В основе у нас лежит 64-х битное ядро, которое могло обрабатывать как 2D-графику с аппаратным ускорением, так и 3D-графику. Ядро работало на частоте 135МГц с встроенным RAMDAC (модуль, отвечающий за вывод картинки на аналоговые разъемы — VGA и DVI, однако выводом на TV-тюльпаны занимался отдельный чип TV-энкодер). Современные видеочипы перешагнули планку 1ГГц, однако сравнение исключительно по частоте некорректны — архитектуры очень сильно отличаются. Помимо этого, видеочип умел декодировать видео с интерполяцией и аппаратно «помогать» процессору с скейлингом видео (например, когда вы разворачиваете плеер на весь экран) и даже рендерить видео в текстуру (что позволяло реализовать, например, телевизоры в играх)!
3D движок поддерживал следующие возможности:
- Затенение по Гур.о
- Маппинг текстур с перспективной коррекцией и билинейной/трилинейной фильтрацией, а также мипмаппингом.
- Depth-буфер, сэмплинг тумана и поддержка альфа-блендинга (прозрачной геометрии).
Чип поддерживал две шины — PCI и менее известную VLB (Vesa Local Bus, очень условно ISA)
Помимо этого, у чипа не было встроенной памяти — к нему необходимо было подключать внешнюю DRAM-память 2/4/8Мб. От её количества зависело максимально-поддерживаемое разрешение экрана. Текстуры при необходимости хранились в ОЗУ.

Видеопамять когда-то расширялась за счёт дополнительных модулей! Эту видеокарту можно расширить аж до 8МБ!
Поддерживаемые разрешения экрана:

Для DirectDraw и ускорения 2D-графики в Windows была реализация аппаратного BitBLT — копирования пикселей в точку на экране. Она поддерживала все режимы, которые были в реализации этой функции в Windows — от монохромных, до 24-х битных. Без альфа-блендинга, само собой. Но тут нет ничего необычного — многие видеочипы тех лет предоставляли простое 2D-ускорение.
Интереснее реализация отрисовки 3D-графики. Каждый треугольник описывался 3-мя регистрами на каждый параметр — координата X, Y для каждой точки, текстурные координаты и т. п. Всего для отрисовки одного треугольника могло потребоваться до 43 регистров! Весьма немало. И именно из-за этого в свое время появились glBegin/glVertex/glEnd!

Параметры сэмплера (текстурного юнита) задавались регистрами, которые определяли формат пикселя текстуры и сам тип фильтрации. Как я уже говорил выше — поддерживалась билинейная и трилинейная фильтрация и проприетарный формат сжатия текстур, который стал стандартом: S3TC или DXT.

Для программирования S3 ViRGE было разработано собственное C SDK — S3DTK, которое состояло из сэмплов и заголовочных файлов для общения с GAPI видеочипа (или видеочипом напрямую, если игра предназначена для DOS). При этом вполне не исключено, что GAPI для Windows работало с видеокартой напрямую, предоставляя PCI-драйвер лишь как прослойку для обмена данными. Поскольку это не D3D, для игр с поддержкой видеоускорения требовалось качать специфические версии. Некоторые игры (как Quake 2) поддерживали мультирендер, но не поддерживали S3 ViRGE.
Весь графический API помещался в один заголовочный файл. API было не простым, а очень простым и понятным — думаю, даже разработчикам-новичкам было легко начать программировать под ViRGE!

Формат вершин был фиксированным и зависел от того, как вы рисовали геометрию на экране:

GAPI поддерживало различные типы треугольных списков, а также точки (POINT для спрайтов и систем частиц) и линии:
#define S3DTK_TRILIST 0
#define S3DTK_TRISTRIP 1
#define S3DTK_TRIFAN 2
#define S3DTK_LINE 3
#define S3DTK_POINT 4
Фактическое API для рисования умещалось в 9 функций и ещё несколько функций для инициализации библиотеки, преобразования адресного пространства и работы с Windows.
Для работы с состоянием видеочипа служили две функции — SetState и GetState. Именно они отвечали за то, как рисовалась геометрия на экране:

А для фактического рисования примитивов служили функции TriangleSet и TriangleSetEx! Да, это альтернатива DrawPrimitives/DrawArrays в современных GAPI. Никаких индексов тогда ещё не использовалось! Функции принимали указатель на массив вершин и их количество, а также на тип рисуемой геометрии (треугольники, линии и т. п.). В Ex версии, можно было «пачкой» установить стейты параллельно с рисованием — такой подход используется в DX10+ API — стейты тоже задаются исключительно «пачками», только теперь они поделены на подгруппы.

Для 2D-рисования были свои, отдельные функции — для блиттинга. Поддерживался ColorKey/хромакей — прозрачным считался определенный цвет, переданный как параметр функции

Основной причиной медлительности S3 ViRGE был низкий филлрейт. При отрисовке примитивов, которые занимают большое пространство экрана, FPS резко просаживался даже с примитивными кубиками и пирамидками. Однако, если не насаживаться на филлрейт и делать что-то типа 2D-поля и 3D-танчиков, то производительность оставалась вполне приемлимой.
❯ Заключение
История S3 закончилась поглощением компанией VIA. После этого, компания разрабатывала интегрированную графику специально для чипсетов VIA, а материнские платы на этих чипах пользовались довольно высоким спросом. Поэтому нередко взяв старый бюджетный ноутбук, года эдак 2005, можно найти в нём VIA Chrome — наследника легендарного S3 Savage! Проблемы у такого подхода тоже были — из-за наследия из конца 90х, ранние Chrome по сути поддерживали только D3D 7.0 и OpenGL ~1.4. Несколько позже, в 2009 году, компания выпустила S3 Chrome 540 GTX — одну из последних видеокарт на собственной архитектуре. Этот видеочип был достаточно современным и поддерживал DX10.1, OpenGL 3.0. Интересно, реально ли найти эту видеокарту сейчас?

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

Насколько я понимаю, неравнодушные инженеры после закрытия 3dfx и слияния S3 с VIA решили «слить» даташиты в сеть, за что им большое спасибо! Ведь теперь мы имеем возможность посмотреть на принцип работы таких устройств сами!
Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня, мой Telegram и @Timeweb.Cloud, чтобы не пропускать новый материал каждую неделю!
