C# — В целях обучения решил написать свой браузер.


Содержание

Программа минимум: что должен знать начинающий C# программист

Рассказывает Мош Хамедани, автор курсов по C# на Udemy

Мои студенты часто задают вопросы такого рода:

Мош, меня только что приняли на должность Junior C#-разработчик. Что ты посоветуешь? Что мне необходимо выучить?

Итак, если вы ищете первую работу в качестве C#-разработчика или недавно её получили, эта статья расскажет вам, какие навыки являются необходимыми. Я постарался объединить их в единый «путь», который подойдёт желающим разрабатывать как декстопные, так и веб-приложения.

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

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

Базовые навыки

Вне зависимости от выбранной сферы разработки существует несколько моментов, которые стоит знать.

Структуры данных и алгоритмы

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

4 октября 2020 – 1 марта 2020, Москва и онлайн, беcплатно

Вы можете удивиться, но крупные компании наподобие Microsoft, Apple и Amazon уделяют на интервью много времени именно проверке знания структур данных и алгоритмов, а не ASP.NET 5 или WPF! Они просто хотят понять, можете ли вы мыслить, как программист.

Вот неплохая книга для начала изучения: Data Structures and Algorithms Made Easy

Если вы в чём-то не разобрались — не отчаивайтесь! Просто убедитесь, что вы поняли, что такое списки, стеки, очереди, деревья и хеш-таблицы, и умеете их реализовывать на чистом C#. Реализуйте несколько алгоритмов поиска и сортировки.

Базы данных

SQL Server — это наиболее часто используемая реляционная СУБД среди .NET разработчиков. Разберитесь в основах реляционных баз данных и базовых операциях в SQL Server.

T-SQL — это язык запросов, используемый в SQL Server. Освойте функции SELECT, INSERT, UPDATE, DELETE, JOIN и GROUP BY.

Вот полезные материалы:

Когда вы работаете с РСУБД, то часто используете системы объектно-реляционного отображения для работы с объектами в базе данных. Существует много таких систем, но самой популярной является Entity Framework.

Материалы для изучения:

Веб-разработка

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

Поэтому все веб-разработчики делятся на 3 группы:

  • Фронтенд-разработчики;
  • Бэкенд-разработчики;
  • Full-stack-разработчики: те, кто занимаются и фронт-, и бэкендом.

В зависимости от ваших предпочтений стоит выбрать один из двух путей. Full-stack-разработчики обычно более востребованы.

Фронтенд

Если вы собрались заняться фронтендом, то вам нужно познакомиться с основами HTML, CSS и Javascript.

HTML — это язык разметки веб-страниц. В отличие от языков программирования (таких как C#), у него нет логики. Для декорации нашей страницы мы используем CSS. И, наконец, JavaScript — язык, отвечающий за поведение веб-страницы.

Материалы для изучения:

Бэкенд

ASP.NET MVC — это доминирующий среди C#-разработчиков фреймворк для создания серверных веб-приложений. Для работы с ASP.NET MVC вам всё равно потребуется базовое знание HTML, CSS и Javascript. Поэтому я советую вам начать изучение с фронтенда и затем перейти к бэкенду, изучив весь спектр веб-разработки.

Вот моё руководство, в котором мы создадим простое приложение с использованием ASP.NET MVC5 и Entity Framework 6: A Step-by-Step ASP.NET MVC Tutorial for Beginners

Десктоп-разработка

Если вы хотите заняться разработкой приложений под Windows, вам понадобится отличный от предыдущего набор навыков (хотя и они, как ни странно, могут пригодиться). Большинство заданий потребует от вас знания XAML, WPF или Windows Forms.

Преимущества и недостатки C# — Учим Шарп #1

Опубликовано shwan в 06.11.2020

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

Что бы тебе ни рассказывали на всевозможных онлайн курсах, книгах, тренингах и конференциях, о том, как можно стать программистом за 21 день – все это ложь, п*дежь и провокация.

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

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

История языка C#

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

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

Возможной версией использования символа хештега принято считать наследование плюсиков от предков, примерно следующим образом: C → C++ → C++++(C#), потому что символ «#» при хорошем воображении можно получить путем объединения 4-х знаков «+».

Язык активно развивается. Регулярно выходят новые версии C#, которые добавляют новые синтаксические конструкции в язык, а также увеличивают его быстродействие и надежность.

Преимущества C#


Данный язык использует объектно-ориентированный подход к программированию во всем. Это означает, что тебе нужно будет описывать абстрактные конструкции на основе предметной области, а потом реализовывать между ними взаимодействие. Данный подход пользуется большой популярностью, потому что позволяет не держать в голове всю информацию, а работать по принципу черного ящика: подал входные данные -> МАГИЯ -> PROFIT.

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

Еще стоит упомянуть, что все это работает на базе платформы .NET Framework. Что это означает? Для многих непосвященных, это просто какая-то приблуда, которую нужно установить на комп, чтобы программа запустилась, но дело обстоит значительно глубже. Написанный тобой код на языке C# транслируется в промежуточный язык (IL), который в свою очередь уже преобразуется в машинный код на твоем компьютере прямо во время выполнения приложения (JIT). Спрашивается, зачем это все? А суть в том, что ты можешь пилить со своим другом Васей на разных языках один и тот же проект и ни одному из вас не придется переучиваться. Но я никогда не видел, чтобы это реально использовали на практике. Но это еще не все. Так как окончательная компиляция из промежуточного кода выполняется в живую на твоей конкретной машине, то возможно увеличение производительности за счет использования специфических команд именно твоего процессора.

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

Ты просто скачиваешь нужное тебе решение из nuget и начинаешь его использовать. В большинстве своем они бесплатны. Сюда же можно отнести большое количество обучающего и справочного материала. Практически на любой свой вопрос ты сможешь найти ответ на стековерфлоу. Ну а на крайний случай всегда можешь спросить в моем телеграм чате для программистов.

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

Но IDE действительно хороша, к тому же имеется ее полнофункциональная бесплатная версия Community.

Еще к плюсам можно отнести строгую типизацию, которая позволяет защититься от дурака, и не так давно появившаяся кросспратформенность в .NET Core (да-да, мелкомягкие потихоньку захватывают линукс).

Недостатки C#

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

C# очень легко дизассемблируется. Это означает, что с большой долей вероятности твой код будет получен и изучен конкурентами. Конечно же, есть специальные инструменты, которые могут усложнить этот процесс, но на 100% защититься от этого практически невозможно.

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

C# не является повсеместно распространенным языком. Большинство программистов сосредоточены в коммерческой Enterprise сфере, что накладывает весьма серьезные ограничения на поиск работы в небольших городах, где кроме Delphi или PHP ничего жизни не видели. К тому же, как бы то ни было, C# в первую очередь ассоциируется с Windows. Вряд ли в обозримом будущем что-то изменится и Винда все также будет продолжать доминировать на рынке, но все же небольшой риск остается, особенно учитывая недавние фейлы с обновлениями в Windows 10.

Перспективы развития C#

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

Компания Microsoft остается одной из крупнейших IT компаний мира, а C# ее флагманский язык программирования, который постоянно развивается и впитывает в себя все новые возможности. Поэтому в обозримом будущем проблем у данного языка возникнуть не должно.

Сферы применения языка C#

В этой области C#, наверное, впереди планеты всей. Хочешь разрабатывать обычные приложения для компьютера – пожалуйста, стандартные WinForms Application и консоль тебе в помощь. Хочешь такие же, но покрасивее? – используй WPF. И специальные приложения для магазина в Windows Store тоже. Веб-приложения? – Легко ASP.NET всегда придет на помощь. На Linux? – тоже не вопрос, .NET Core уже здесь. Мобильное приложение? – Xamarin сделает сразу под все платформы. Хочешь написать игру? – движок Unity показывает себя очень даже неплохо, и при этом также адаптирует игру под различные платформы. Хочешь приблизить апокалипсис с восстанием машин и создаешь искусственный интеллект? – есть целая платформа с кучей инструментов для этого Microsoft AI Platform. Также и для компьютерного зрения и ботов. Я вообще с трудом могу придумать пример того, что невозможно реализовать на C#. Я где-то встречал даже операционную систему написанную на шарпе. Поэтому в этой области все хорошо.

Цукерберг рекомендует:  Тест по C#. Средний уровень

Зарплаты разработчиков C#

Здесь все в целом неплохо. По данным на 2020 год, C# явно не является самым высокооплачиваемым языком, но и не самый низкооплачиваемый тоже. Среднее значение зарплаты для данного языка в России около 90к рублей. Это весьма неплохой результат, но бесспорно есть и более дорогие языки. В целом, уровень заработной платы намного больше зависит от прямоты рук и уровня знаний, поэтому не так важно на каком языке писать, главное делать это хорошо. Но данная цифра задает примерный уровень для Middle разработчика в среднем по России. От этого уже можно отталкиваться.

Итоги

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

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

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

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

Он неплохо подходит как для начинающих в качестве первого языка, так и для реализации крупных коммерческих проектов.

На этом мы заканчиваем наш первый урок. Подписывайтесь на мои социальные сети: Вконтакте, Телеграм, YouTube и Дзен. Ну а еще есть специальный закрытый чат, для изучающих C# по моему курсу. С вами был Вадим. Пока!

[C#] Написание простого Web-Browser’a.

Школа Читера

— Основы основ — начинаем писать статьи для начинающих с целью создания полноценного раздела

Ссылки сообщества
Изображения и альбомы
Пользователи
К странице.
05.11.2011, 18:22 #1

Всем привет, с вами †KILLER†
Сейчас я вам расскажу, как написать простой Web-Browser на C#.
Говорю сразу. мы создадим Browser не с нуля, а на движке Internet Explorer.

Итак. приступим.
Создаем Windows Form .
Растягиваем её .
В свойствах Form’ы меняем название .
Допустим. на «Web-Browser For Zhyk.Ru».

Из панели элементов перетаскиваем на форму «WebBrowser» и растягиваем как желаем.
Затем добавляем следующие элементы: TextBox , Button .
P.S. это вначале позже мы добавим еще .

Расставляем все элементы как в обычном браузере.
WebBrowser почти на всю форму, а Button и TextBox на одной линии сверху.

В свойствах Button’a пишем «Перейти».
Кликаем на нашу кнопку 2 раза.
Мы переходим к коду, где у нас уже стоит «рукописное перо» между двумя вот такими вот скобочками- «<" и ">»
Теперь туда мы вставляем такой код:

Мы создали уже простенький браузер.
Тестим:
Компилируем
В TextBox вводим нужный URL . (без «http://». )
Жмем «Перейти»
И в браузере открывается наша страница.

Теперь создадим следующие элементы: TextBox -3 штуки.
На них пишем:
1 — «Назад»
2 — «Вперед»
3 — «Обновить»

Начнем с кнопки «Назад» . как вы уже поняли данная кнопка будет переносить нас на предыдущую страницу.
Кликнем по данной кнопке 2 раза.
И мы перейдем к коду.
Вставляем туда следующее:

Теперь также нажимаем на кнопку «Вперед» 2 раза .
И вставляем следующий код:

И наша последняя кнопка — «Обновить».
Также как и с остальными кнопками жмем по ней 2 раза и вставляем следующий код:

Практика для начинающих програмистов c#

backatom1

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

Было бы не плохо если опытные C# програмисты давали тут, простые и средней сложности задачки(в первое время конечно), а те кому нужен опыт решали бы эти задачи и ответы тоже оставляли бы здесь. Желательно чтоб решения выкладывали все, они были бы неплохими учебными материалами для тех кто бы не смог решить самостоятельно задачку, ну конечно же желательно чтобы код был прокомментирован.


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

Думаю этот пост будет полезен многим

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

Foxy2020

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

Было бы не плохо если опытные C# програмисты давали тут, простые и средней сложности задачки(в первое время конечно), а те кому нужен опыт решали бы эти задачи и ответы тоже оставляли бы здесь. Желательно чтоб решения выкладывали все, они были бы неплохими учебными материалами для тех кто бы не смог решить самостоятельно задачку, ну конечно же желательно чтобы код был прокомментирован.

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

Думаю этот пост будет полезен многим

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

C# — В целях обучения решил написать «свой» браузер.

Готовые решения интересных задач на C++ с подробными объяснениями и комментариями.

Пишем упрощенный ассемблер и виртуальный процессор — часть 1

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

8 способов нахождения наибольшего общего делителя

Эта статья появилась на свет совершенно неожиданно. Мне на глаза случайно попался код вычисления НОД на C#.

С первого взгляда мне даже всё понравилось: простенько, лаконичненько и без лишнего выпендрёжа. Однако чем дольше я рассматривал этот код, тем больше возникало сомнений в его эффективности. Я решил сделать маленькое исследование.

Оптимизация кода через ручной тайминг

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

Веб-сервер на C++ и сокетах

Создадим HTTP-сервер, который обрабатывает запросы браузера и возвращает ответ в виде HTML-страницы.

Шаблоны в C++ — часть 2

Эта статья является продолжением первой части про шаблоны и шаблонные функции в C++.

Шаблонные функции-члены

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

Шаблоны и шаблонные функции в C++. Введение

Шаблонные функции

Давайте рассмотрим простой пример. Допустим, у нас есть функция, которая меняет местами значения двух переменных типа int:

Раздельная компиляция программ на C++

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

Определение и перегрузка операторов класса в C++

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

Перегрузка методов класса в C++

Методы класса можно перегружать также, как и обычные функции. Особенно это удобно, когда нужно сделать несколько конструкторов, которые будут принимать разные параметры.

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

Перегрузка функций в C++

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

Как начать создавать веб-браузер?

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

Любые рекомендации приветствуются!

Хорошо разбить его на кусочки. Что такое веб-браузер? Что оно делает? Это:

  • Выбирает внешний контент.. Вам нужна библиотека HTTP или (не рекомендуется) пишите это самостоятельно. Там много сложностей/тонкости протокола HTTP, например, обработка заголовков истекает, разные версии (хотя в основном это в наши дни) и т.д.
  • Обрабатывает разные типы контента. Theres реестр Windos для такого рода вещей, который вы можете комбинировать. Я говорю о интерпретации контента на основе типа MIME здесь;
  • Парсы HTML и XML: создание DOM (объектной модели документа);
  • Парсы и применяет CSS: это подразумевает понимание всех свойств, всех единиц измерения и всех способов, которые могут быть заданы (например, «border: 1px solid black» vs the separate border-width, и т.д.);
  • Реализует визуальную модель W3C (и это настоящий кикер); и
  • Имеет механизм Javascript.

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

  • Сколько одновременных подключений использовать?
  • Сообщение об ошибке пользователю;
  • Доверенные;
  • Пользовательские параметры;
  • и др.

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

  • Trident:, разработанный Microsoft для Internet Explorer;
  • Gecko:, используемый в Firefox;
  • Webkit:, используемый в Safari и Chrome 0-27;
  • KHTML:, используемый в среде рабочего стола KDE. Webkit раздвоен из KHTML несколько лет назад;
  • Elektra:, используемый в Opera 4-6;
  • Presto:, используемый в Opera 7-12;
  • Blink:, используемый в Chrome 28+, Opera 15+, webkit fork;


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

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

  • SpiderMonkey:, используемый в Gecko/Firefox;
  • TraceMonkey: заменит SpiderMonkey в Firefox 3.1 и представляет компиляцию JIT (точно в срок);
  • KJS:, используемый Konqueror, привязанный к KHTML;
  • JScript: механизм Javascript Trident, используемый в Internet Explorer;
  • JavascriptCore:, используемый в Webkit браузером Safari;
  • SquirrelFish: будет использоваться в Webkit и добавит JIT как TraceMonkey;
  • V8: механизм Google Javascript, используемый в Chrome и Opera;
  • Opera (12.X и меньше) также использовала свои собственные.

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

Это много работы.

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

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

Некоторые ресурсы, которые вы можете проверить:

  • HTMLayout.NET: быстрый, легкий и встраиваемый HTML/CSS рендерер и компонент менеджера компоновки.
  • GeckoFX: элемент управления Windows Forms, который встраивает элемент управления браузера Mozilla Gecko в любое приложение Windows Forms.
  • SwiftDotNet: браузер, основанный на Webkit в С#
  • Геккон DotNetEmbed
  • Gecko #
  • Рендеринг веб-страницы — шаг за шагом

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

Это безумно амбициозный проект (особенно для одного разработчика), но что-то, что я хотел бы сделать когда-нибудь — вы могли бы многому научиться у него.

Я не очень много знаю о том, как работают протоколы (что вам определенно нужно исследовать) или многое о том, что происходит в браузере, но отличное место для начала было бы источником браузеров с открытым исходным кодом, прежде всего Chrome и Firefox. Chrome — это особенно хороший проект для просмотра, поскольку они делают только то, что я ожидаю от вас: хром и бэкэнд браузера. Забудьте сначала создать механизм рендеринга — используйте Webkit или Gekko.

Вы имеете в виду, как писать собственный движок рендеринга?

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

Тем не менее, вот некоторые (очевидные) указатели:

  • пишите много кода, который делает мелкие вещи, например, решают все проблемы projecteuler.net
  • узнайте все, что можете, о своем инструментарии и его стандартах сообщества.
  • написать много больше кода
  • получить реальное твердое представление конечных автоматов
  • написать еще код
  • узнать все о стеке tcp/ip и о том, как он используется для http
  • узнайте все о http
  • узнать стандарты (html, xml, sgml, css)
  • отпраздновать свой 150-летний юбилей.
  • начните работу с фактическим проектом браузера.

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

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

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

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

Вам нужно сначала создать цели вашего проекта (и то, что вы надеетесь достичь) очень явным. Это то, что вы просто делаете для удовольствия, или вы ожидаете, что другие люди будут использовать ваш браузер? Если вы ожидаете, что другие будут использовать его, какими будут стимулы для них? Нереально ожидать, что вы разработаете новый браузер с нуля, который каждый сможет использовать в качестве замены для Chrome, Safari, Firefox, IE, Opera и т.д. Все эти проекты имеют начальный старт на 10-15 лет вы, и к тому времени, как вы догнали их, они будут еще на 10-15 лет раньше вас. Кроме того, у них намного больше возможностей для мужчин, поэтому, если вы хотите, чтобы ваш проект был успешным, вам понадобится эта сила человека в какой-то момент.

Именно по этой причине Apple и Google, крупные компании с большим количеством ресурсов, не начали с нуля. Даже Microsoft не начинала с нуля. Оригинальный IE был основан на Mosaic. Единственные значимые браузеры, которые были созданы сегодня с нуля, — это Opera, Konqueror и Lynx, которые, к сожалению, имеют небольшую долю рынка. Позвольте забыть о Lynx на данный момент, поскольку это текстовый браузер и, по-видимому, единственная причина, по которой он все еще существует, потому что он служит этой конкретной нише. Opera, возможно, является одним из лучших браузеров, когда-либо созданных, но при этом никогда не было большой доли рынка, поэтому помните, что успех и инновации — это не одно и то же. KHTML — это двигатель Konqueror, который никогда не стал очень успешным, но является основой WebKit, которую используют как Apple, так и Google. Я думаю, можно было бы однозначно утверждать, что если бы KHTML никогда не был создан, ни Safari, ни Chrome не существовало бы. Интересно, что и KHTML, и Opera были в основном созданы норвежскими программистами, работающими в одном здании в Осло.

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

Конечно, перед вами стоит дополнительная задача, которая делает создание нового успешного браузера труднее, чем создание новой успешной ОС. Ожидается, что браузеры будут безупречно запускать весь старый код, плавающий в Интернете. Теперь предположим, что Линусу Торвальдсу сказали, что его новая ОС не имеет значения, если он не будет полностью совместим с UNIX или какой-либо существующей ОС. Я сомневаюсь, что он бы побеспокоился, и Linux, вероятно, не существовал бы сегодня. Реально, конечно, единственная причина, по которой Linux стала популярной, состояла в том, что она была хорошо разработана, и проект GNU смог создать инструменты для переноса огромного количества существующего кода в Linux. Без идеологической поддержки GNU для Linux это никогда не было бы шансом.

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

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

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

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

Восстановить Мозаику, но с вашими собственными дизайнерскими идеями. Это то, что я хотел бы предложить, если вы просто делаете это ради удовольствия или своей собственной образовательной выгоды. Прочтите исходные спецификации HTML 1.0 и HTML 2.0, а также спецификации HTTP 1.1 и текущие спецификации URI и убедитесь, что ваш браузер придерживается всех этих спецификаций. Вы можете, конечно, загружать существующее программное обеспечение, которое уже обрабатывает транспортные протоколы, соглашения URI и т.д., Но если вы серьезно относитесь к разработке своего собственного браузера, я думаю, что это хорошее упражнение, чтобы делать эти вещи с нуля, так что вы получаете хорошее чувство того, как все части головоломки подходят друг другу. В конце шага 0 вы должны иметь браузер, который по крайней мере сопоставим с тем, что было современно в 90-е годы. Это хорошая первая веха. И вы действительно можете загрузить оригинальную Mosaic в ftp://ftp.ncsa.uiuc.edu/Mosaic/ и посмотреть, как она сравнивается с вашим браузером. Это также хорошее упражнение, чтобы увидеть, как текущие веб-сайты отображают в древнем браузере, таком как Mosaic.

Добавьте поддержку вашего DOM в свой браузер. Сначала сосредоточьтесь на W3C DOM Level 1 и Level 2, так как почти все текущие браузеры полностью поддерживают их. Затем посмотрите на уровень 3 и уровень 4. DOM чрезвычайно важен для веб-программирования, поэтому, если вы собираетесь построить современный веб-браузер, весь дизайн должен учитывать это. Поскольку вы пишете браузер на С#, вы можете принять во внимание, как вы могли бы использовать существующую объектную модель .NET в своих интересах.

Посмотрите на существующие механизмы сценариев и посмотрите, можете ли вы перенести их в свой проект. Я бы отговорил вас от написания собственного интерпретатора JavaScript не только потому, что это очень большой проект сам по себе, но и потому, что в оптимизацию JS-компиляторов (например, V8) уже сделано много работы. Поэтому, если вы не являетесь гуру в дизайне компилятора, ваш ручной интерпретатор JS, скорее всего, уступает тому, что уже существует, даже если оно следует за спецификациями EMCAScript безупречно. Опять же, я думаю, что скриптовый движок должен быть полностью отдельным модулем от фактического браузера, поэтому я думаю, было бы гораздо полезнее иметь фреймворк, который позволит вам заменить любой скриптовый движок, а не создавать механизм сценариев который работает только с вашим браузером.

Посмотрите на исходный код HTML/CSS/JS для лучших 10-20 сайтов в Северной Америке (Google, Facebook, YouTube, Twitter, Википедия, Amazon, популярные платформы для ведения блогов и т.д.) и спроектируйте браузер хорошо работать с этими сайтами. Это несколько более трудная задача для решения, чем создание браузера, который придерживается всех существующих стандартов (что то, что текущие браузеры все еще не делают отлично), тем более делает браузер, который правильно отображает все веб-сайты в Интернете (никто не может сделай это). Люди будут жаловаться, что ваш браузер нарушает стандарты и так далее, но это не так много, как люди, жалующиеся на то, что они не могут получить доступ к Google или Facebook с вашим браузером. Я не могу придумать ни одного браузера, который бы правильно следил за всеми (или даже самыми) стандартами в своем первом выпуске, поэтому я говорю, что даже не пытаюсь попробовать. Если вы можете сделать то, что люди захотят использовать достаточно, чтобы когда-либо была вторая или третья версия, тогда вы можете беспокоиться о стандартах в этот момент.

Введение в C# или что нужно знать о языке CSharp

И так… я наконец решил собрать свой багаж знаний в нечто единое для того, что бы помочь начинающим разработчикам ПО в нелегком деле изучения языка программирования C#. Я прекрасно помню, когда впервые познакомился с данным языком программирования и как впервые пытался написать программу. Я помню все трудности и не понятные моменты. Именно с ними я и хочу поделится со своими читателями.
Почему я начал писать о C#, а не о PHP или JavaScript? Ответ прост — C# самый читаемый раздел в моем блоге и именно по данному языку мне задают самое большое число вопросов.
Я буду очень признателен всем посетителям моего ресурса, которые будут помогать мне в написании данной методички (книги или что-бы из этого не получилось). Пишите свои отзывы, задавайте вопросы, указывайте не до конца раскрытые темы. Все это я буду учитывать и вносить необходимые правки.

Изучение языка программирования C# процесс сложный, если Вы не знакомы с объектно ориентированным программированием (ООП), но возможный. Так же Вам нужно иметь представление о том что такое компьютер и как он работает. Все, что я буду писать, будет ориентированно на людей — не знакомых с программированием, либо имеющим базовые навыки в данной области. Я не буду углубляться во все нюансы языка программирования CSharp, что бы не загружать Вас. А так же не буду описывать все типы данных, все ключевые слова и т.п. вещи. Моя задача донести базовые знания, отработав и запомнив которые, Вы сможете с легкостью изучать рассматриваемый язык более подробно самостоятельно.

Примечание: В качестве подготовительной работы Вам необходимо скачать Visual Studio C# с сайта Microsoft и установить его на свой компьютер. Именно в этой среде Вы можете создавать свои приложения.

И так! Начнем процесс обучения!

Язык программирования C# — ООП во всей красе. Даже самая примитивная программа будет реализована «сложно» в понятиях начинающего разработчика. Именно поэтому ключевым моментов изучения языка C# является понимание принципов ООП. Я не просто так выделил слово понимание — Вам необходимо именно понимать ООП, Вы можете выучить все принципы — но писать программы, а тем более дорабатывать сущесвующие, Вам будет сложно. И причина будет в том, что Вы не сможете пересказать принципы ООП своими словами, а значит не сможете понять то, как реализует эти принципы другой разработчик.
ООП конечно вещь хорошая, однако чтобы начать писать свои первые программы нужно знать еще некоторые вещи: типы данных, операции и конструкции языка. Именно о них я и расскажу сегодня. Вам нужно будет выучить эти вещи. Выучить так, что бы у Вас не было ни малейшего колебания в том какой тип данных Вам нужен, что Вам нужно писать чтобы объявить его или написать цикл, или условие.

Типы данных
Разрабатывая ПО, вы работаете с различной информацией, которая может быть выражена цифрами, предложениями, буквами, логическими следствиями и т.д. В связи с этим в C# были созданы следующие типы данных:

Int32 (или int) — тип данных для хранения целых чисел (1, 2, -100, 0, 23413123) в диапазоне от -2 147 483 648 до 2 147 483 647.
Int64 (или long) — тип данных для хранения целых чисел (1, 2, -100, 0, 23413123) в диапазоне от -9223372036854775808 до 9223372036854775807.
Double (или double) — тип данных для хранения десятичных чисел (1, 2.123, -100.11232345, 0, 23413123.1).
Boolean (или bool) — тип данных для хранения результата логического выражение. Принимает значение ИСТИНА (true) или ЛОЖЬ (false).
Char (или char) — тип данных для хранения одного символа (‘a’, ‘1’, ‘-‘, ‘ ‘). По своей сути данный тип — это число c кодом символа. Именно поэтому char может конвертироваться в int и наоборот.
String (или string) — тип данных для хранения строк. По своей сути данный тип — массив (поговорим о них позже) из символов char.

Важно: Выше указаны далеко не все типы данных языка C#. Однако в начале Вашего пути их будет вполне достаточно
Важно: Любой тип данных может быть использован в массивах. Что это такое и зачем они нужны мы рассмотрим позже

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

+ — сложение чисел, либо «склеивание» (конкатенация) строк. Не применяется при работе с типами bool, char.
— разница двух чисел.
* — умножение двух чисел.
/ — целая часть от деления двух чисел при использование типа int. Результат деления при использовании типа double.
% — остаток деления двух чисел. Именно остаток, а не дробная часть.


&& — логическое И. Применяется для типа bool.
|| — логическое ИЛИ. Применяется для типа bool.
! — логическое НЕ (отрицание). Применяется для типа bool.

.Net And C#

Страницы

Автоматизация бизнеса

среда, 18 июля 2012 г.

Как создать браузер, работа с WebBrowser C#

Для того, чтобы создать браузер необходимо создать приложение Windows Forms, которое включает в себя элементы управления Button, TextBox, Panel и конечно WebBrowser. Конечный пользователь должен набрать адрес веб страницы, а наш браузер должен отобразить документ.
И так приведу список всех элементов.

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

private void txtAdress_KeyPress( object sender, KeyPressEventArgs e)
<
if ( e .KeyChar == ( char )13)
<
webBrowseMain.Navigate(txtAdress.Text);
>
>

Здесь каждое нажатие клавиш перехватывается обработчиком события txtAdress_KeyPress и если нажата клавиша , то в действие вступает WebBrowser, методу webBrowseMain.Navigate передается URL который пользователь набрал в элементе txtAdress.
При запуске кнопки Back, Forward и Stop должный быть недоступными, поскольку они не имеют смысла при первоначальной загрузки. Позднее можно сообщать приложению когда надо активировать кнопки Back и Forward исходя от того где находится пользователь в стеке страниц. Когда страница загружается было бы уместном активировать кнопку Stop, но при завершении запретить доступ к ней.
Запрограммируем функциональность кнопок.

private void btnGo_Click( object sender, EventArgs e)
<
string url = txtAdress.Text;

webBrowseMain.Navigate( new Uri (url));
>

private void btnBack_Click( object sender, EventArgs e)
<
webBrowseMain.GoBack();
>

private void btnStop_Click( object sender, EventArgs e)
<
webBrowseMain.Stop();
>

private void btnHome_Click( object sender, EventArgs e)
<
webBrowseMain.GoHome();
>

private void btnRefresh_Click( object sender, EventArgs e)
<
webBrowseMain.Refresh();
>

private void btnForward_Click( object sender, EventArgs e)
<
webBrowseMain.GoForward();
>

По имени обработчика можно понять который обработчик принадлежит которой кнопке.

Когда форма загружается первоначально, событие Form1_Load отключает к соответствующим кнопкам. Чтобы включать и отключать доступ к кнопкам, приходится обращаться к множеству событий. Для активации кнопки Stop в начале загрузки необходимо добавить обработчик события Navigating.

private void webBrowseMain_Navigating( object sender, WebBrowserNavigatingEventArgs e)
<
btnStop.Enabled = true ;
>
После загрузки снова доступ к кнопке Stop отключим.

private void webBrowseMain_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e)
<
btnStop.Enabled = false ;
>

Доступность кнопок Back и Forward зависит от возможности перехода в перед или назад в стеке страниц. В этом нам помогут события CanGoForwardChanged и CanGoBackChanged. И так во время инициализации определяем данные события.

webBrowseMain.CanGoForwardChanged+= new EventHandler (webBrowseMain_CanGoForwardChanged);
webBrowseMain.CanGoBackChanged+= new EventHandler (webBrowseMain_CanGoBackChanged);

и после вписываем события

private void webBrowseMain_CanGoForwardChanged( object sender, EventArgs e)
<
if (webBrowseMain.CanGoForward)
btnForward.Enabled = true ;
else
btnForward.Enabled = false ;
>

private void webBrowseMain_CanGoBackChanged( object sender, EventArgs e)
<
if (webBrowseMain.CanGoBack)
btnBack.Enabled = true;
else
btnBack.Enabled = false;
>

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

Учим C#: №1

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

Возникает новое направление – объектно-ориентированное программирование. Его особенность заключается в использовании виртуальных функций и классов, что увеличивает гибкость динамической организации программы в виде отдельных модулей; а также активное преднамеренное использование таких свойств как наследование, полиморфизм, инкапсуляция. Разработан объектно-ориентированный язык программирования C++, соответствующий практически всем аспектам данного направления. Данный язык является основным во многих операционных системах, и почти вся нами горячо любимая Windows (почему почти?
— потому что без ASMa никак в системном программировании). Короче в С++ писали почти все
(и чуть меньше пишут сейчас). Также широко используется сочетание его с другими языками. Проги в С/C++ компилируются в бинарные исполняемые файлы или в бинарные динамические библиотеки (dll).

Но как известно многим нам – программистам и юзерам, существует один страшный монстр в этом компьютерном мире, и называет он себя гордо – Microsoft. Базару нет — он управляем, и управляет им отважный
праотец миллионов дыр в своих операционках, его дырявое величество, Билл Гейтс, мать его так!
Решил Билл удивить мир и сказал своим апостолам:

— Вот С++ — хорошая концепция, а мы мутим, типа, самую лучшую реализацию этой концепции под самую глючную, самую дырявую, короче, самую конченную операционную систему во всем этом, из-за наших систем, неидеальном мире! Мы гребанные молодцы. Надо создавать свой язык программирования и заставим пользоваться им всех владельцев новых версий Visual C++ 7. Вот это будет тема, типа!

И то ли он что-то недосказал, то ли апостолы что-то прослушали. Сделали, в общем, вещь толковую. А назвать ее решили C#. Я считаю, красивый понт. А Билл, сам того не желая, сделал в своей жизни хоть что-то толковое, а не очередную покупку у лохов прав на DOS или подписывание контрактов с IBM, где последняя расписывается в том, что является лохушкой!
C# имеет двух родителей – это С++ и Java, легко учится при наличии небольшого опыта хоть в одном из этих двух языков.
В последние годы много шуму наделал язык JAVA от Sun Microsystems. Его можно назвать внуком С++. Программы JAVA компилируются не в бинарный исполняемый файл, как в С/C++, а в так называемый байт-код, выполняемый виртуальной машиной JAVA. Так был решен вопрос о переносимости. Но, по мнению Microsoft, у JAVA ест один серьезный недостаток – отсутствие прямой поддержки Windows. Код JAVA не совместим с кодом C/C++, но синтаксис явно
заимствован из С++, но конечно есть некоторые изменения.

Интересный факт:
Язык программирования JAVA – это детище Sun Microsystems, можно сказать, гордость этой компании. Хотя еще какие-то 2 недели назад моя матушка скачивала Java Virtual Machine(среду выполнения JAVA-приложений) с сайта Microsoft. Однако, по решению суда от 3.02.2003, зловещий производитель Windows не имеет прав на распространеие JVM.

И вот тут Microsoft решает внести свою лепту. В конце 90х разрабатывается язык С# для создания кода Net Framework. В 2000 году появляется первая бета-версия. Мне не известно, на чем сделан Net Framework, но это не мешает мне рассказать о том, что это и зачем надо.

Итак, Net Framework – это среда, в которой могут выполняться программно-независимые приложения. В данной среде поддерживается совместная работа в приложении разных языков программирования. Net Framework определяет библиотеки классов, используемых в C#. Любая примитивная программа C# основана на использовании библиотек классов Net Framework. И, пожалуй, самое главное – Net Framework не ограничивается Windows! Я не знаю, существует ли реализация данной среды под другие системы, но уверяю вас, что скоро это все будет.

Net Framework содержит в себе не зависящую от языка среду выполнения. Программы C# не компилируются в бинарный исполняемый файл, а компилируются в промежуточный язык (MS Intermediate Language, MSIL). MSIL можно назвать переносным ассемблером, но это псевдо-ассемблер. Среда переводит MSIL в машинный исполняемый код, который в последствии и выполняется. То есть, Net Framework содержит интерпретатор MSIL. А кто сказал, что интерпретаторы плохи? Я с ним не согласен (ну без базару, небольшой проигрыш во времени при запуске), и вот мой аргумент:
интерпретируемость – это идеальное решение проблем переносимости прог. В это же время не возникает никаких ошибок при переносе (если же конечно не глючная версия Net Framework �� ).
Кто знаком с PERL, вспомните, как просто переносятся скрипты в разные ОС.

По традиции, сейчас мы вместе напишем первую прогу на С# — “Hello
World. ”. Если вы являетесь счастливым обладателем MS Studio Net, можете набрать прогу в файле с расширением .сs (пусть его имя Hello.cs), затем в командой строке набираете csc Hello.cs в директории содержащей исходник. В результате получается файл Hello.exe, и запустится он только при наличии Net Framework.

using System; //Это называется определением пространства имен, об этом я буду говорить
//позже
class Hello //Определение класса
<

public static void Main() //любая C#-программа начинается с вызова функции Main()
<
Console.WriteLine(“Hello World. ”);//метод вывода строки класса Console
>
>

ИТОГ. В вышеприведенном листинге ярко видны 2 отличия от С++:

  • мы определили пространство имен, использовав новое ключевое слово’using’, которого в С++ не было;
  • функция Main() содержится прямо в классе, как в
    JAVA;

А вот еще одно не очень яркое:

  • в С++ для вывода строки в консольном режиме, мы использовали оператор
    cout (в принципе, это целый класс) из iostream.h.

Несмотря на все, С# не утрачивает возможности использования динамических библиотек. Успешно комбинируется с ASP.net. Кроме разработки обычных приложений C# может быть использован для автоматизации работы программ, в частности офисных приложений Microsoft, а также других важных направлениях информационных технологий и сферах деятельности человека. С# имеет
нововведение, тип decimal, используемый в финансовых вычислениях. Об этих и других возможностях этого концептуально нового языка я расскажу позже, в следующих статьях.

Объектно-ориентированная модель C# куда более совершенна модели C++. Об этом пойдет речь в следующей статье.

C# Написать свой полноценный браузер (без компонента WebBrowser)

Хочу написать свой браузер, но не на основе компонента WebBrowser, а на сторонней библиотеке. Вопрос только в том, на какой? Как именно это делать?
Заранее спасибо за ответы!

Информацию рою здесь:
cyberforum.ru/csharp-beginners/thread938456.html
otvet.mail.ru/question/179044720

Я НЕ СОБИРАЮСЬ писать его с нуля, НО хочу, чтобы он был максимально приближенным к моим интересам! т. е. , как например Chrome написанный на Хромиуме.

Цукерберг рекомендует:  Обучение - httpктоможетстатьпрограммистом.рф
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих