Фото

Удивительные возможности современного C++


Было время, когда С++ не хватало динамизма, и увлечься этим языком было трудно. Но всё изменилось, когда было принято решение развить стандарт C++. С 2011 года язык стал более динамичным и постоянно развивается. В статье мы рассмотрим некоторые интересные функциональные возможности языка.

Ключевое слово auto

Когда в 11 версии C++ только появилось auto, жизнь стала намного легче.

Идея auto состояла в том, чтобы заставить компилятор C++ определять тип ваших данных во время компиляции, вместо того чтобы заставлять вас каждый раз объявлять тип. Это было удобно, если у вас были типы данных вроде map<string, vector <pair <int, int>>> ?

 

auto an_int = 26;              // при компиляции тип выводится в int
auto a_bool = false;        // в bool
auto a_float = 26.04f;     // в float
auto ptr = &a_float;        // и даже в указатель
auto data;                        // а можно ли так? Вообще-то нельзя.

 

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

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

 

auto merge(auto a, auto b)     // Тип параметров и возвращаемых данных тоже может быть auto!
{
std::vector c = do_something(a, b);
return c;
}
std::vector<int> a = { ... };     // какие-то данные
std::vector<int> b = { ... };    // какие-то данные
auto c = merge(a, b);           // тип определяется возвращаемой информацией!
 
 

В строках 7 и 8 была использована инициализация в скобках. Эта функция также была добавлена в 11 версии C++.

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

Теперь встаёт хороший вопрос, что произойдёт, если мы напишем auto a = {1, 2, 3}? Это ошибка компиляции? Это вектор?

На самом деле, в 11 версии C++ был представлен std::initializer_list<type>. Инициализированный список в скобках будет считаться легковесным контейнером, если объявлен как auto.

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

 

void populate(auto &data) {                                    // видите!
data.insert({"a", {1, 4}});
data.insert({"b", {3, 1}});
data.insert({"c", {2, 3}});
}
 
auto merge(auto data, auto upcoming_data) {     // и не надо писать длинный идентификатор снова
auto result = data;
for (auto it: upcoming_data) {
result.insert(it);
}
return result;
}
 
int main() {
std::map<std::string, std::pair<int, int>> data;
populate(data);
 
std::map<std::string, std::pait<int, int>> upcoming_data;
upcoming_data.insert({"d", {5, 3}});
 
auto final_data = merge(data, upcoming_data);
for (auto itr: final_data) {
auto [v1, v2] = itr.second;                                         // про структурное связывание будет ниже
std::cout << itr.first << " " << v1 << " " << v2 << std::endl;
}
return 0;
}
 

Не забудьте проверить строку 25! Выражение auto [v1, v2] = itr.second — новая функция в 17 версии C++. Это называется структурным связыванием. В предыдущих версиях приходилось извлекать каждую переменную отдельно. Но структурное связывание сделало этот процесс более удобным.

Более того, если вы хотите получить данные, используя ссылку, то просто добавьте символ — auto &[v1, v2] = itr.second.

Лямбда-выражение

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

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

 

std::vector<std::pair::<int, int>> data = {{1, 3}, {7, 6}, {12, 4}};    // обратите внимание на скобочную инициализацию
std::sort(begin(data), end(data), [ ](auto a, auto b) {                   // auto!
    return a.second < b.second;
});

 

Приведённый выше пример может многое сказать.

Во-первых, обратите внимание, как фигурные скобки упрощают вам жизнь. Затем следуют универсальные begin()end(), которые тоже были добавлены в 11 версии. После идёт лямбда-выражение в качестве компаратора ваших данных. Параметры лямбда-выражения объявлены с помощью auto, что было добавлено в 14 версии С++. До этого auto нельзя было использовать в качестве параметров функции.

Обратите внимание, мы начинаем лямбда-выражение с квадратных скобок [ ]. Они определяют область действия лямбды — сколько у неё полномочий над локальными переменными и объектами.

Как определено в этом потрясающем репозитории по современному C++:

  • [ ] — ничего не захватывает. Таким образом, вы не можете использовать любую локальную переменную внешней области видимости в лямбда-выражении. Вы можете использовать только параметры.
  • [=] — захватывает локальные объекты (локальные переменные, параметры) в области видимости по значению. Вы можете использовать, но не изменять их.
  • [&] — захватывает локальные объекты (локальные переменные, параметры) в области видимости по ссылке. Вы можете изменить их, как в примере, приведённом ниже.
  • [this] — захватывает этот указатель по значению.
  • [a, &b] — захватывает объект a по значению, объект b по ссылке.

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

 

std::vector<int> data = {2, 4, 4, 1, 1, 3, 9};
int factor = 7;
for_each(begin(data), end(data), [&factor](int &val) {          // захват factor по ссылке
val = val * factor;
factor--;                             // это будет работать, потому что переменная находится в области видимости лямбды
});
for(int val: data) {
std::cout << val << ' ';      // 14 24 20 4 3 6 9
}
 

В приведённом выше примере, если вы захватили локальные переменные по значению ([factor]) в лямбда-выражении, то вы не можете изменить factor в 5 строке. Вы просто не имеете права делать это. Не злоупотребляйте своими правами!

Наконец, обратите внимание, что мы берём переменную val в качестве ссылки. Это гарантирует, что любое изменение внутри лямбда-функции фактически изменяет vector.

Инициализатор в if и switch

Вам точно понравится эта возможность в С++ 17.

 

std::set<int> input = {1, 5, 3, 6};
if(auto it = input.find(7); it == input.end()) {         // первая часть - инициализация, вторая - условие
std::cout << 7 << " not found!" << std::endl;
}
else {
             // it тоже попадает в область видимости else!
std::cout << 7 << " is there!" << std::endl;
}
 
Очевидно, теперь вы можете выполнять инициализацию переменных и проверять условие сразу внутри блоков if или switch. Это поможет сделать код лаконичным и чистым. Общая форма:
 
if (init-statement(x); condition(x)) {
    // какой-то код

else {    // else тоже имеет переменную x в области видимости
    // какой-то другой код
}
 

Компиляция и constexpr

Скажем, у вас есть какое-то выражение для оценки, и его значение не изменится после инициализации. Вы можете предварительно рассчитать значение, а затем использовать его в качестве макроса. Или, как предложил C++ 11, можно использовать constexpr.

Программисты стремятся максимально сократить время выполнения программ. Поэтому если некоторые операции можно отдать на выполнение компилятору, это стоит сделать.

 

constexpr double fib(int n) {     // функция объявлена с помощью constexpr
if(n == 1) return 1;
return fib(n-1) * n;
}
int main()
{
const long long bigval = fib(20);
std::cout << bigval << std::endl;
return 0;
}
 

Приведённый выше код — распространённый пример использования constexpr.

Поскольку мы объявили функцию вычисления Фибоначчи как constexpr, компилятор может предварительно вычислить fib(20) во время компиляции. Так что после неё он может заменить строку с

const long long bigval = fib (20);

на

const long long bigval = 2432902008176640000;

 

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

Переменные также могут быть constexpr. В этом случае, как вы можете догадаться, эти переменные должны вычисляться во время компиляции. Иначе вы получите ошибку компиляции.

Интересно, что позже в C++ 17 были представлены constexpr-if и constexpr-lambda.

Кортежи

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

auto user_info = std::make_tuple("M", "Chowdhury", 25); // используем auto, чтобы уменьшить описание типов

                                                                                                    // чтобы получить доступ к данным
std::get<0>(user_info);
std::get<1>(user_info);
std::get<2>(user_info);

// в 11 версии С++ мы использовали tie, чтобы сделать связывание

std::string first_name, last_name, age;
std::tie(first_name, last_name, age) = user_info;

// но в 17 версии стало гораздо удобнее
auto [first_name, last_name, age] = user_info;

 Иногда удобнее использовать std::array вместо кортежа. Такой массив подобен обычному массиву в C вместе с несколькими функциями стандартной библиотеки C++. Эта структура данных была добавлена в 11 версии C++.

 

Вывод типов шаблонных параметров для классов

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

 

std::pair<std::string, int> user = {"M", 25};         // раньше
std::pair user = {"M", 25};                                     // C++ 17

 

В этом примере для первого элемента кортежа будет выведен тип const char *, а не std::string.

Выводимый тип задаётся неявно. Это становится ещё удобнее для кортежей.

 

// раньше
std::tuple<std::string, std::string, int> user ("M", "Chy", 25); 
// C++ 17
std::tuple user2("M", "Chy", 25);

 

Эта функция не имеет никакого смысла, если вы слабо знакомы с шаблонами в C++.

Умные указатели

Указатели могут быть адскими.

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

К счастью, в C++11 появились умные указатели, которые намного удобнее, чем простые. Они помогают программистам предотвращать утечки памяти, освобождая её, когда это возможно. Они также обеспечивают исключительную безопасность.

 

Источник:  tproger.ru

 



Фото

История HTML: от зарождения до современности


HTML (HyperText Markup Language) — это язык разметки, который используется для создания веб-страниц. Его история начинается в конце 1980-х годов...

Тим Бернерс-Ли, британский ученый, работавший в Европейском центре ядерных исследований (CERN), задумался о способе обмена научной информацией между исследователями. 

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

Тим Бернерс-Ли предложил создать единый язык разметки, который позволил бы связывать документы через гипертекстовые ссылки. Так появился HTML, который стал основой для Всемирной паутины (World Wide Web). HTML позволил создавать документы, которые могли быть легко доступны и читаемы на любом компьютере, независимо от операционной системы и программного обеспечения. Это был революционный шаг, который открыл новые горизонты для обмена информацией и взаимодействия между людьми по всему миру.

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

HTML 1.0: Первые шаги в веб-разработке

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

 
<!DOCTYPE html>
<html>
<head>
    <title>Пример HTML 1.0</title>
</head>
<body>
    <h1>Заголовок 1 уровня</h1>
    <p>Это абзац текста.</p>
    <a href="https://example.com">Пример ссылки</a>
</body>
</html>

 

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

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

Эволюция HTML: От HTML 2.0 до HTML 4.01

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

HTML 2.0

HTML 2.0 был выпущен в 1995 году и включал в себя все элементы HTML 1.0, а также добавил новые возможности, такие как формы для ввода данных и таблицы для структурирования информации. Это сделало веб-страницы более интерактивными и удобными для пользователей. Формы позволили создавать интерактивные элементы, такие как поля ввода, кнопки и выпадающие списки, что значительно расширило возможности взаимодействия с пользователями.

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

HTML 3.2

HTML 3.2, выпущенный в 1997 году, добавил поддержку стилей (CSS) и скриптов (JavaScript), что позволило создавать более сложные и динамичные веб-страницы. Это была важная веха в развитии веб-дизайна, так как разработчики получили возможность контролировать внешний вид и поведение веб-страниц. CSS позволил отделить структуру документа от его стиля, что упростило разработку и поддержку веб-сайтов.

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

HTML 4.01

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

 
<!DOCTYPE html>
<html>
<head>
    <title>Пример таблицы</title>
</head>
<body>
    <table border="1">
        <tr>
            <th>Имя</th>
            <th>Возраст</th>
        </tr>
        <tr>
            <td>Иван</td>
            <td>25</td>
        </tr>
        <tr>
            <td>Мария</td>
            <td>30</td>
        </tr>
    </table>
</body>
</html>

 

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

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

HTML5: Революция в веб-технологиях

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

Новые семантические элементы

HTML5 ввел новые семантические элементы, такие как <header><footer><article><section>, которые позволяют лучше структурировать контент и делают его более доступным для поисковых систем и вспомогательных технологий. Эти элементы помогают улучшить SEO (поисковую оптимизацию) и делают веб-страницы более понятными для поисковых систем.

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

Встроенные мультимедиа

HTML5 добавил поддержку встроенных мультимедийных элементов, таких как <audio> и <video>, что позволило воспроизводить аудио и видео непосредственно на веб-страницах без необходимости использования сторонних плагинов. Вот пример использования видео в HTML5:

 
<!DOCTYPE html>
<html>
<head>
    <title>Пример видео</title>
</head>
<body>
    <video controls>
        <source src="video.mp4" type="video/mp4">
        Ваш браузер не поддерживает видео.
    </video>
</body>
</html>

 

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

Улучшенная поддержка форм

HTML5 также улучшил поддержку форм, добавив новые типы ввода, такие как emaildatenumber, и новые атрибуты, такие как placeholder и required, что упростило создание и валидацию форм. Это значительно упростило процесс взаимодействия пользователей с веб-сайтами и улучшило пользовательский опыт.

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

API и новые возможности

HTML5 включил множество новых API, таких как Geolocation API, Web Storage API, Canvas API, которые расширили возможности веб-приложений и позволили создавать более интерактивные и функциональные веб-сайты. Эти API предоставили разработчикам доступ к новым функциям и возможностям, что значительно расширило возможности веб-разработки.

Geolocation API позволяет определять местоположение пользователя, что открыло новые возможности для создания геолокационных сервисов и приложений. Web Storage API предоставляет возможность хранения данных на стороне клиента, что улучшило производительность и удобство использования веб-приложений. Canvas API позволяет создавать сложные графические элементы и анимации, что значительно улучшило визуальное восприятие веб-сайтов.

Современное состояние и будущее HTML

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

Тренды и перспективы

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

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

Влияние на будущее

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

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

 

Источник:   https://sky.pro

 



Фото

Как добавить иконку (favicon) на сайт в HTML


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

Что такое favicon

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

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

Favicon сайта хостинга AdminVPS
Favicon сайта хостинга AdminVPS

Favicon выполняет несколько ключевых функций:

  1. Упрощение навигации для юзеров. С помощью фавикона пользователям легче находить нужные вкладки среди множества открытых сайтов.
  2. Брендинг. Запоминающийся favicon формирует яркий образ бренда. Иконка вызывает у пользователей ассоциации с продуктом или услугой, что в дальнейшем может повысить лояльность и доверие к бизнесу.
  3. Сертификаты безопасности. В некоторых браузерах значок сайта отображается рядом с предупреждениями о безопасности. Это может повысить уровень доверия к ресурсу, поскольку юзер будут видеть знакомую иконку и знать, что веб-ресурс принадлежит определённому бренду.

Фавикон различных сайтов видно в окне браузера на вкладках:

Фавиконы разных сайтов
Фавиконы разных сайтов

Иконка сайта может иметь разный формат, что главным образом влияет на её отображение:

  • ICO. Этот формат является золотым стандартом для фавиконов и поддерживает прозрачность, а также различные размеры (16x16, 32x32, 48x48 и так далее). Он совместим с большинством браузеров.
  • PNG. Современный формат, поддерживающий прозрачность и более высокое качество изображений. Однако не все браузеры корректно отображают PNG-файлы в качестве фавиконов.
  • SVG. Векторный формат, который позволяет масштабировать изображение без потери качества. Хотя SVG-файлы могут отлично выглядеть на современных устройствах, некоторые браузеры могут не поддерживать их в качестве фавиконов, что важно учитывать при выборе формата.

Как создать favicon

Создать значок сайта можно с помощью множества доступных онлайн-инструментов.

Выбор изображения

Первый шаг — выбрать или сгенерировать изображение. Например, подойдёт логотип вашей компании, символ или другой элемент, который точно передаёт суть вашего бизнеса. Рекомендуемые размеры для фавиконов — 16x16 пикселей для стандартного отображения на вкладках браузеров и 32x32 пикселя для более качественного отображения на устройствах с высоким разрешением. Помните, что изображение должно быть чётким и легко различимым.

Конвертация в нужный формат

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

Оптимизация

Убедитесь, что размер файла фавикона не превышает 100 КБ. Чем меньше весит иконка, тем быстрее она будет загружаться на сайте, что особенно важно для мобильных устройств. Сжимайте изображения при помощи инструментов, например, TinyPNG или ImageOptim, чтобы уменьшить вес файла без значительной потери качества.

Полезные сервисы

Для более быстрой разработки фавикона можно воспользоваться сервисами:

1. Favicon.io

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

2. Favicon.cc

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

3. RealFaviconGenerator.net

Этот сервис генерирует полный набор иконок для всех устройств и платформ, включая Android и iOS. Он предоставляет подробные инструкции по добавлению сгенерированных файлов на ваш сайт, что упрощает процесс интеграции.

Как добавить иконку на сайт HTML

Теперь, когда у вас есть готовая иконка, необходимо добавить её на интернет-страницу. Это делается с помощью тега <link>, который помещается в секцию <head> вашего HTML-документа.

Пример HTML-кода для добавления favicon:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" href="favicon.ico" type="image/x-icon">
    <title>Мой сайт</title>
</head>
<body>
    <h1>Добро пожаловать на мой сайт!</h1>
</body>
</html>

В этом примере favicon.ico — это имя вашего файла с иконкой. Убедитесь, что файл находится в той же папке, что и ваш HTML-документ. Если вы используете другие форматы, замените

type="image/x-icon"

на соответствующий тип, например,

type="image/png"

для PNG.

Указание дополнительных размеров

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

Пример:

<link rel="icon" href="favicon-16x16.png" sizes="16x16" type="image/png">
<link rel="icon" href="favicon-32x32.png" sizes="32x32" type="image/png">
<link rel="icon" href="favicon-96x96.png" sizes="96x96" type="image/png">

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

Как добавить иконку в HTML для мобильных устройств

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

<link rel="apple-touch-icon" sizes="180x180" href="apple-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="android-icon.png">
<link rel="icon" type="image/png" sizes="512x512" href="android-icon.png">

Тестирование иконки

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

Тестирование в различных браузерах

Проверьте, как ваш значок выглядит в популярных браузерах, таких как «Яндекс Браузер», Google Chrome, Mozilla Firefox, Safari и Microsoft Edge. Каждый из них может обрабатывать фавиконы немного по-разному. Например, Chrome может кешировать старое изображение, если вы вносите изменения, поэтому лучше открыть сайт в режиме инкогнито или очистить кеш браузера, чтобы увидеть обновлённый значок.

Проверка на мобильных устройствах

Не забудьте протестировать favicon и на мобильных устройствах. На смартфонах и планшетах значок может отображаться иначе, особенно в зависимости от операционной системы (iOS или Android). Проверьте, как смотрится и отображается иконка на разных экранах, включая устройства с высокой плотностью пикселей (Retina).

Причины проблем с favicon

Если ваша иконка не отображается, на то может быть несколько причин. Разберём основные причины ошибок и предложим их решение.

Проверка пути к файлу

Вы должны проверить, правильно ли вы указали расположение файла в HTML-коде. Например, если ваш файл называется favicon.ico и находится в папке images, путь должен выглядеть так:

<link rel="icon" href="images/favicon.ico" type="image/x-icon">

Если файл находится в корневой директории вашего веб-ресурса, путь будет:

 href="favicon.ico"

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

Очистка кеша браузера

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

Неправильный формат файла

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

Чтобы проверить тип MIME, вы можете использовать инструменты разработчика в вашем браузере. Откройте вкладку «Сеть» и обновите страницу, затем найдите ваш файл иконки в списке ресурсов. Убедитесь, что указанный тип MIME соответствует формату файла, например, image/x-icon для .ico и image/png для .png.

Заключение

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

 

Источник:  adminvps.ru

 



Фото

Парсинг сайтов на Python: как написать скрипт


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

Что такое парсинг?

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

Часто парсинг используют боты, которые потом предоставляют доступ к собранным структурированным данным. Это может быть список статей на сайте, вакансий на платформе по поиску работы или предложений на досках объявлений. Например, один из героев нашего блога написал бот, который нашел ему работу за месяц. Если у сайта нет полноценного открытого API, то парсер ищет данные с помощью GET-запросов к серверу, а это создает дополнительную нагрузку на сервер.

Это накладывает некоторые этические ограничения на скрипты для парсинга веб-сайтов:

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

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

Для чего нужен парсинг?

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

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

Python и Beautiful Soup

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

Еще одно преимущество Python — его популярность. Для  языка программирования есть большое количество сторонних библиотек для различных задач и активное сообщество, которое может помочь советом. Одна из полезных библиотек для парсинга веб-сайтов — BeautifulSoup. С ее помощью можно легко анализировать HTML-файлы и находить в них нужные данные. В этой статье будем парсить сайт с ее помощью.

Как установить Beautiful Soup

Есть несколько популярных способов запуска кода на Python:

  • На своем компьютере. Python работает на Windows, Linux и MacOS. Для этого надо предварительно установить язык программирования на устройство. Сам код можно писать в редакторе или в полноценной IDE. Из бесплатных доступны Visual Studio Code и PyCharm Community. Плюсы этого способа заключаются в том, что все данные хранятся локально, а код выполняется быстрее.
  • В облачном сервисе. Есть множество платформ, которые позволяют писать и запускать код на Python в облаке. Для этого на компьютер не надо устанавливать дополнительные пакеты и заботиться о совместимости. Понадобится только браузер и стабильное подключение к интернету. Все данные будут передаваться на удаленный сервер. Такой способ подходит для новичков или для быстрых экспериментов с кодом. Можно использовать бесплатные Repl.itGoogle Colab или Programiz

Для работы нам понадобятся библиотеки BeautifulSoup, requests и lxml. Их можно установить с помощью следующей команды в терминале:

    $ pip3 install requests BeautifulSoup4 lxml
 

Получаем HTML-страницу

Для начала парсинга надо получить страницу, из которой будем вытаскивать полезные данные. Для этого будем использовать библиотеку requests, чтобы отправить GET-запрос, в качестве ответа получить код страницы и сохранить его. Попробуем распарсить вот эту статью, получив заголовок и первый абзац. Код выглядит следующим образом:

    import requests
 
    url = 'https://blog.skillfactory.ru/programmist-v-sims-4/'
    response = requests.get(url)
    response.raise_for_status()
    print(response.text)

Что в коде:

  • import requests — импортируем библиотеку requests в код скрипта;
  • url = ‘https://blog.skillfactory.ru/programmist-v-sims-4/’ — переменная, в которой хранится ссылка на целевую страницу;
  • response = requests.get(url) — выполняем GET-запрос и передаем в него переменную с хранящейся ссылкой;
  • response.raise_for_status() — эта функция вернет нам код ошибки, если запрос не получится выполнить. Если не добавить эту строчку, то Python будет дальше выполнять код и не обращать внимания на ошибку;
  • print(response.text) — печатаем код полученной страницы.

В ответе мы получим весь код страницы, включая CSS-стили и JavaScript. Вот так это выглядит:

Html разметка
Html-разметка страницы

Парсим страницу

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

Для этого потребуется веб-инспектор в любом браузере. Мы будем использовать Safari, но этот режим есть и в других браузерах. К примеру, в Google Chrome он открывается сочетанием клавиш Сtrl + Shift + I (Windows) или ⌥ + ⌘ + I (macOS). После этого можно выбрать на странице элемент и увидеть его код в инспекторе.

Веб-инспектор в браузере
Веб-инспектор в браузере Safari

Заголовок статьи находится в теге <h1>, поэтому попробуем получить его содержимое с помощью библиотеки BeautifulSoup. Для этого передадим в функцию find искомый тег:

    from bs4 import BeautifulSoup
    import requests
 
    url = 'https://blog.skillfactory.ru/programmist-v-sims-4/'
    response = requests.get(url)
    response.raise_for_status()
 
    soup = BeautifulSoup(response.text, 'lxml')
    title = soup.find('h1')print(title)
 
 

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

    soup = BeautifulSoup(response.text, 'lxml')
    title = soup.find('h1')
    title = title.text
    print(title)
 
 

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

    paragraph = soup.find('p')
    paragraph = paragraph.text
 
    print(paragraph)
 
 
 

Мы в точности повторили весь порядок действий, но парсер вывел совсем не ту строчку. Все дело в том, что мы искали элемент по тегу <p>. В HTML-файле их может быть несколько, а BeautifulSoup ищет самый первый. Поэтому запрос надо уточнить и сделать его более конкретным.

Для этого можно указать дерево наследования элементов. К примеру, если тег <p> входит в <article>, а тот — в <main>, то код запроса можно будет записать так: soup.find(‘main’).find(‘article’).find(‘p’). Еще можно искать элемент по его классу. Для этого в функцию надо передать тег и его класс: soup.find(‘p’, class_=’paragraph’).

В нашем случае запрос будет выглядеть следующим образом:

    paragraph = soup.find('div', class_='single-content').find('p')
    paragraph = paragraph.text
 
    print(paragraph)
 
 

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

Сохраняем результат

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

Для этого воспользуемся встроенной функцией write(). Сперва откроем файл в режиме записи:

    file = open("parsing.txt", "w")
 

Если файла с таким названием нет, то Python сам создаст его в директории проекта.

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

    file.write(title)
    file.write(paragraph)
 
    file.close()
 

Коротко о том, как парсить сайты на Python

  • С помощью парсинга можно автоматически анализировать веб-страницы и вытаскивать из них полезную информацию.
  • Для парсинга необходимо отправлять запросы к серверу, чтобы получать код сайтов, а это может нагружать сервис, поэтому важно не злоупотреблять этим.
  • Если у сервиса есть публичное API, то лучше пользоваться им.
  • В Python удобно парсить веб-сайты с помощью библиотеки BeautifulSoup.
  • Запросы выполняются с помощью библиотеки requests.
  • Результат парсинга можно сохранять в файл, вносить в базу данных или отправлять с помощью почты и мессенджеров.

 

Источник: blog.skillfactory.ru

 

 



Фото

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


Изучите преимущества и особенности языка C#. История, недостатки и преимущества Си Шарп в одном месте. Узнайте всё о языке программирования C sharp

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

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

 

Особенности языка Си Шарп

А что же означает само название C#? В термине C Sharp слово «шарп» имеет свою символическую значимость. Знак «#» (читается как «диез» в музыкальной нотации) означает повышение звуковой высоты на полтона. С другой стороны, название «C#» происходит от «эволюционной цепочки» C → C++ → C++++(C#), где символ «#» составлен из четырёх знаков «+».

Исследуем язык C#: продукт, признанный Microsoft

История развития C# началась в 1993-2001 годах, когда группа инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота разработала его как язык программирования для создания приложений на платформе Microsoft.

В 2000 году Microsoft представила промышленные версии новых технологий и решений для обмена сообщениями и данными, а также для разработки интернет-приложений. Была запущена платформа .NET, которая объединила несколько языков программирования, что было новинкой для того времени.

Одним из ключевых нововведений платформы .NET была технология ASP.NET (Active Server Pages), предназначенная для создания серверных веб-приложений с возможностью взаимодействия с базами данных. Специально для ASP.NET был разработан язык программирования C#, который стал основным языком разработки на этой платформе. Более того, сама технология ASP.NET была полностью написана на C#.

Сравнение с другими языками программирования

C# имеет синтаксис, похожий на C, и в этом отношении он близок к C++ и Java. В качестве объектно-ориентированного языка C# унаследовал многое от Java и C++. Как и Java, C# изначально был разработан для веб-приложений, и около 75% его синтаксических возможностей схожи с Java. C# также называют «очищенной версией Java». Еще 10% возможностей он заимствовал у C++, а 5% — у Visual Basic. Оставшиеся 10% — это уникальные идеи разработчиков. Благодаря объектно-ориентированному подходу C# позволяет создавать крупные, но гибкие, масштабируемые и расширяемые приложения.

Си Шарп давно уже поддерживает множество полезных функций, таких как:

  • Инкапсуляция,
  • Наследование,
  • Полиморфизм,
  • Перегрузка операторов,
  • Статическая типизация.

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

В сравнении с другими языками, C# относительно молод, но уже прошел долгий путь. Первая версия языка была выпущена вместе с Microsoft Visual Studio .NET в феврале 2002 года. На текущий момент последняя версия — C# 8.0, которая была выпущена в сентябре 2019 года вместе с .NET Core 3.0.

Роль платформы .NET в разработке на C#

Когда говорят о C#, часто имеют в виду технологии, предоставляемые платформой .NET, такие как Windows Forms, WPF, ASP.NET и Xamarin. И наоборот, при упоминании .NET часто подразумевают C#. Однако, хотя эти понятия связаны, они не должны быть тождественными. C# был специально создан для работы с фреймворком .NET, но сама платформа .NET имеет более широкий контекст.

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

  • Поддержка различных языков. Основа .NET — общеязыковая среда исполнения Common Language Runtime (CLR), что позволяет использовать несколько языков программирования. Помимо C#, поддерживаются VB.NET, C++, F# и другие диалекты, связанные с .NET, такие как Delphi.NET. Код, написанный на любом из этих языков, компилируется в сборку на общем промежуточном языке CIL (Common Intermediate Language) — своего рода «ассемблер» платформы .NET. Это позволяет создавать модули приложения на разных языках.
  • Богатая библиотека классов. .NET предоставляет единую библиотеку классов для всех поддерживаемых языков. Независимо от того, разрабатываем ли мы текстовый редактор, чат или сложный веб-сайт на C#, мы всегда используем библиотеку классов .NET.
  • Разнообразие технологий. CLR и базовая библиотека классов — это основа для целого набора технологий, доступных разработчикам при создании различных типов приложений. Например, для работы с базами данных есть технологии ADO.NET и Entity Framework Core. Для создания графически насыщенных приложений есть WPF и UWP. Для более простых графических приложений используются Windows Forms. Для мобильной разработки — Xamarin. Для веб-разработки — ASP.NET и т.д.

Таким образом, платформа .NET играет важную роль в разработке на C#. Когда говорят о C#, часто имеют в виду технологии, такие как Windows Forms, WPF, ASP.NET и Xamarin, предоставляемые платформой .NET. В то же время платформа .NET включает в себя гораздо больше, чем просто C#.

Билл Гейтс называл .NET одним из лучших созданий Microsoft, и есть весомые основания для такого утверждения. Фреймворк .NET представляет собой мощную платформу для разработки приложений. Вот несколько ключевых аспектов:

  • Поддержка нескольких языков. .NET базируется на общеязыковой среде выполнения Common Language Runtime (CLR), что позволяет использовать различные языки программирования. Помимо C#, в .NET поддерживаются VB.NET, C++, F# и другие языки, связанные с платформой. Это дает разработчикам гибкость выбора языка в зависимости от их предпочтений и требований проекта.
  • Библиотека классов. .NET предоставляет единую библиотеку классов, которая предлагает широкий набор функциональности для разработки приложений. Благодаря этому разработчики могут использовать готовые компоненты и решения, ускоряя процесс разработки и повышая эффективность.
  • Разнообразие технологий. .NET предлагает различные технологии и инструменты для создания разных типов приложений. Например, для веб-разработки доступны ASP.NET и ASP.NET Core, для создания настольных приложений — Windows Forms и WPF, а для разработки мобильных приложений — Xamarin. Это позволяет разработчикам выбирать подходящую технологию в зависимости от требований и целей проекта.
 

 

.NET Framework и .NET Core: различия и развитие

В течение длительного времени развитие .NET осуществлялось под названием .NET Framework, преимущественно как платформы для Windows. Однако, начиная с 2019 года, разработка этой платформы была прекращена, и последней версией стала .NET Framework 4.8.

В 2014 году Microsoft представила альтернативную платформу — .NET Core, которая заменила устаревший .NET Framework. .NET Core был разработан с целью объединить возможности .NET Framework и добавить новую функциональность. Важно отметить, что .NET Framework ориентирован преимущественно на Windows, в то время как .NET Core — кроссплатформенное решение.

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

Преимущества языка C#:

  • Поддержка большинства продуктов Microsoft: C# тесно интегрирован с различными продуктами Microsoft, что облегчает разработку приложений для платформы Windows.
  • Бесплатность некоторых инструментов. Для небольших компаний и индивидуальных разработчиков доступны бесплатные инструменты, такие как Visual Studio, облачная платформа Azure, Windows Server и другие.
  • Фиксированный размер типов данных. Наличие фиксированного размера типов данных, таких как 32-битные int и 64-битные long, обеспечивает «подвижность» языка и упрощает программирование, поскольку вы всегда точно знаете, с какими данными работаете.
  • Автоматическая сборка мусора. Благодаря механизму автоматической сборки мусора большинство разработчиков не нужно беспокоиться о высвобождении памяти. Среда выполнения Common Language Runtime (CLR) самостоятельно управляет сборкой мусора и очисткой памяти.
  • Синтаксический сахар. C# предлагает множество удобных конструкций, называемых «синтаксическим сахаром», которые облегчают чтение и написание кода. Эти конструкции не влияют на процесс компиляции.
  • Низкий порог вхождения. Синтаксис C# имеет схожие элементы с другими языками программирования, что делает его более доступным для новичков и облегчает переход от других языков.
  • Поддержка множества операционных систем. С использованием Xamarin, на C# можно создавать программы и приложения для различных операционных систем, включая iOS, Android, MacOS и Linux.
  • Рыночный спрос. Сегодня во многих регионах есть большое количество вакансий для C#-программистов, что открывает широкие возможности для карьерного роста.

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

  • Ориентированность на платформу Windows. Язык C# имеет приоритетную ориентацию на платформу Windows, что может ограничивать его применение в других операционных системах.
  • Лицензионная стоимость для крупных компаний. Хотя C# доступен бесплатно для небольших фирм, индивидуальных программистов, стартапов и учащихся, приобретение лицензионной версии для крупных компаний может стать значительной финансовой затратой.

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

Сколько времени потребуется для освоения C#

C# отлично подходит для новичков, так как его изучение и понимание относительно просты. В интернете можно найти множество онлайн-школ, предлагающих обучение C# в течение периода от 1 до 6 месяцев. Кроме того, существуют экспресс-курсы, которые позволяют начинающим освоить основы языка всего за несколько дней. Если у вас уже есть опыт работы с C, C++ или Java, изучение C# будет гораздо проще и быстрее.

Востребованность C# на рынке разработки

C# продолжает удерживать свою позицию в рейтинге наиболее востребованных языков программирования на рынке разработки. Начиная с интереса разработчиков для платформы Windows, C# расширил свою сферу применения и научился работать на различных операционных системах, таких как Mac OS, Linux, iOS и Android. Открытый доступ к коду платформы также позволил снять большинство ограничений на использование C#, что привело к активному развитию и расширению его применения. Он рекомендуется как один из основных языков для разработчиков в любой области.

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

В отношении зарплаты программистов, работающих на C#, статистика Хабр.Карьеры показывает, что она обычно варьируется от 60 до 200 тысяч рублей, со средней зарплатой около 100 тысяч рублей.

Таким образом, платформа .NET — неотъемлемая часть разработки на C# с разнообразными инструментами и ресурсами, которые помогают разработчикам создавать мощные и эффективные приложения.
 

Перспективы будущего C#

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

 

Источник:   blog.geekbrains.by

 



Фото

История языка программирования C


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

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

Создание языка C

Предшественники языка C

История языка C начинается с разработки языка B, который был создан Кеном Томпсоном в Bell Labs в конце 1960-х годов. Язык B, в свою очередь, был основан на языке BCPL (Basic Combined Programming Language), разработанном Мартином Ричардсом. BCPL был создан для написания компиляторов и операционных систем, и его простота и эффективность стали основой для будущих разработок. BCPL предоставил программистам мощные инструменты для работы с памятью и ресурсами системы, что стало важным шагом в эволюции языков программирования.

Разработка языка C

В начале 1970-х годов Деннис Ритчи и Брайан Керниган в Bell Labs начали работу над улучшением языка B. Они стремились создать язык, который был бы более мощным и гибким, сохраняя при этом простоту и эффективность. В результате этих усилий в 1972 году появился язык C. Основной целью разработки языка C было создание инструмента, который позволял бы эффективно писать системное программное обеспечение, такое как операционные системы и компиляторы. Язык C быстро завоевал популярность благодаря своей универсальности и мощным возможностям.

Основные особенности языка C

Язык C был разработан с учетом следующих ключевых особенностей:

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

Развитие и стандартизация

Публикация "The C Programming Language"

В 1978 году Деннис Ритчи и Брайан Керниган опубликовали книгу "The C Programming Language", которая стала основным руководством по языку C. Эта книга, часто называемая "K&R" по именам авторов, сыграла ключевую роль в популяризации языка и его стандартизации. "K&R" не только описала синтаксис и семантику языка, но и предложила множество примеров и практических рекомендаций, что сделало ее незаменимым ресурсом для программистов.

ANSI C и ISO C

В 1983 году Американский национальный институт стандартов (ANSI) начал работу по стандартизации языка C. В 1989 году был опубликован стандарт ANSI C, также известный как C89. В 1990 году этот стандарт был принят Международной организацией по стандартизации (ISO) и стал известен как ISO C. Стандартизация языка C позволила создать единые правила и рекомендации для разработчиков, что способствовало улучшению качества и совместимости программного обеспечения.

Развитие стандартов C

С тех пор язык C продолжал развиваться, и были выпущены новые стандарты:

  • C99: В 1999 году был принят стандарт C99, который добавил новые возможности, такие как новые типы данных (например, long long int), новые функции стандартной библиотеки и улучшения в синтаксисе. C99 также включил поддержку новых возможностей для работы с массивами и указателями, что сделало язык еще более мощным и гибким.
  • C11: В 2011 году был принят стандарт C11, который включил новые возможности многопоточности, улучшения в работе с памятью и другие усовершенствования. C11 также добавил поддержку атомарных операций и улучшил возможности работы с многопоточными программами, что стало важным шагом в развитии языка.
  • C18: В 2018 году был принят стандарт C18, который в основном включал исправления ошибок и уточнения предыдущих стандартов. C18 не добавил значительных новых возможностей, но улучшил стабильность и совместимость языка, что сделало его еще более надежным инструментом для разработки программного обеспечения.

Влияние на другие языки программирования

Языки, вдохновленные C

Язык C оказал значительное влияние на разработку многих других языков программирования. Вот некоторые из них:

  • C++: Разработанный Бьярне Страуструпом в начале 1980-х годов, C++ расширяет C, добавляя объектно-ориентированные возможности. C++ сохранил многие особенности C, такие как синтаксис и управление памятью, но добавил классы, наследование и полиморфизм, что сделало его мощным инструментом для разработки сложных приложений.
  • Objective-C: Этот язык, разработанный Брэдом Коксом и Томом Лавом в 1980-х годах, добавляет объектно-ориентированные возможности к C и используется для разработки приложений для macOS и iOS. Objective-C сочетает в себе мощь C с гибкостью объектно-ориентированного программирования, что сделало его популярным выбором для разработки приложений под платформы Apple.
  • Java: Разработанный Джеймсом Гослингом и его командой в Sun Microsystems в середине 1990-х годов, Java заимствует синтаксис и многие концепции из C и C++. Java была разработана с учетом кроссплатформенности и безопасности, что сделало ее популярным выбором для разработки веб-приложений и корпоративного программного обеспечения.
  • C#: Разработанный Microsoft в начале 2000-х годов, C# также заимствует многие идеи из C и C++, но ориентирован на разработку приложений для платформы .NET. C# сочетает в себе мощь C++ с простотой и удобством использования, что сделало его популярным выбором для разработки приложений под Windows и другие платформы.

Влияние на системное программное обеспечение

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

Заключение

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

 

Источник:   sky.pro

 



Фото

История Ассемблера


Ассемблер (англ. «Assembler») — это низкоуровневый язык программирования, который представляет собой промежуточное звено между машинным кодом и высокоуровневыми языками программирования.

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

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

 

Пример кода на ассемблере. 

 

    Начинают изучение программирования обычно с вывода на экран строки «Hello, world!». В языке программирования Python для этого достаточно одной команды:

                print("Hello, World!")

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

          .MODEL SMALL
          .STACK 100h
          .DATA
          HelloMessage DB 'Hello, World!',13,10,'$'
         .CODE
         START:
         mov ax,@data
         mov ds,ax
         mov ah,9
         mov dx,OFFSET HelloMessage
         int 21h
        mov ah,4ch
        int 21h
        END START

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

Кратко про процессоры и машинный язык

    Для более полного понимания языка ассемблера начнем с основ работы процессора и того, на каком языке можно общаться с ним.

 

Схематическое изображение уровня языков программирования.

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

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

    Например, в архитектуре Intel 8088 инструкция 0000001111000011B представляет операцию сложения двух чисел, в то время как 0010101111000011B выполняет вычитание.

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

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

Основы ассемблера

Ниже приведена таблица с примерами машинного кода, соответствующими инструкциями на ассемблере и их описаниями:

 

История создания ассемблера

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

 

ЭВМ ENIAC на электронных лампах.

    Проблема была решена, когда ЭВМ научились хранить программы в памяти. В 1950 году была разработана первая программа-транслятор, которая переводила программы, написанные на понятном человеку языке, в машинный код. Эта программа была названа программой-сборщиком, а язык программирования получил название «ассемблера» (от английского слова «assembler» — сборщик). Впервые этот термин стал использовать английский учёный Морис Уилкс (Maurice Wilkes).

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

Как устроен язык ассемблер

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

 

Код ассемблера из кодов операций и операндов.

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

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

  • ADD — сложение (от англ. addition);
  • SUB — вычитание (от англ. subtraction);
  • MUL — умножение (от англ. multiplication) и так далее.

Регистры и ячейки памяти получают символические имена, например:

  • EAXEBXAXAH — имена для регистров;
  • mem1 — имя для ячейки памяти.

Пример команды сложения чисел из регистров AX и BX:

add ax, bx

И вот команда вычитания чисел из регистров AX и BX:

sub ax, bx

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

Некоторые из них:

  • INCLUDE — открыть файл и начать его компиляцию;
  • EXIT — прекратить компиляцию файла;
  • DEF — назначить регистру символическое имя и так далее.

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

Вот пример ассемблерного кода, который выводит на экран цифры от 1 до 10:

   section .text global _start _start: mov ecx,10 mov eax, '1'
   label1: mov [num], eax mov eax, 4 mov ebx, 1 push ecx
   mov ecx, num
   mov edx, 1
   int 0x80
   mov eax, [num] sub eax, '0' inc eax add eax, '0' pop ecx loop label1
   mov eax,1
   int 0x80
   section .bss num resb 1
 

Почему для разных семейств процессоров нужен свой ассемблер

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

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

Кому и зачем нужен язык ассемблера?

    Ассемблер, даже по нашему примеру «Hello, World!», показывает, что он не так удобен для разработки, как языки высокого уровня. Большие программы на этом языке уже никто не пишет, но есть области, где он становится незаменимым: 

  1. Разработка встроенных программ для микроконтроллеров. Микроконтроллеры устанавливаются в системах сигнализации, пультах управления, датчиках, бытовой технике, модемах и других устройствах. Микроконтроллеры даже используются в робототехнике и спутниковых навигационных системах. Память у них ограничена, поэтому ассемблер идеально подходит для их программирования, так как каждая его команда транслируется в одну команду в двоичном коде. Это позволяет определить время выполнения программы и объем памяти, необходимый для ее хранения, исходя из исходного текста программы.
  2. Написание драйверов устройств и некоторых компонентов операционных систем, например, ядра или загрузчика. Некоторые любительские операционные системы, такие как MenuetOS и KolibriOS, полностью написаны на ассемблерном коде. Его также можно найти и в программах для игровых приставок и мультимедийных кодеков.
  3. Реверс-инжиниринг — обратная разработка программ. Область используется для понимания работы программ и их алгоритмов в случаях, когда исходный код не доступен по каким-либо причинам. Этим занимаются антивирусные компании, исследующие вирусы и трояны, создатели драйверов и операционных систем, а также просто любопытные люди. Кроме того, компьютерные злоумышленники также активно используют реверс-инжиниринг для взлома программ, поиска уязвимостей, написания вирусов, генерации ключей и прочих противоправных действий.

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

 

Востребованность программистов на ассемблере в 2025

    Программисты на ассемблере востребованы, хотя на веб-сайтах по поиску работы, вероятнее всего, вы не найдете вакансий с заголовками «Требуется программист на ассемблере». Зато там много объявлений, которые требуют знание языка в дополнение к языкам высокого уровня, таким как C, C++ или Python. Вакансии могут быть связаны с реверс-инженерингом, компьютерной безопасностью, разработкой драйверов и программ для микроконтроллеров/микропроцессоров, а также системным программированием и другими областями.

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

 

Стоит ли начинать изучение программирования с языка ассемблера

    Нет, такой подход не рекомендуется. На это есть несколько причин:

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

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

 

Источник: blog.skillfactory.ru

 

 



Фото

Как читать excel-файлы (xlsx) при помощи Python


.xlsx – это расширение документа Excel, который может хранить большой объем данных в табличной форме. Более того, в электронной таблице Excel можно легко выполнять многие виды арифметических и логических вычислений.

 

Иногда программистам требуется прочитать данные из документа Excel. В Python для этого есть множество различных библиотек, например, xlrdopenpyxl и pandas. Сегодня мы поговорим о том, как читать excel-файлы (xlsx) при помощи Python, и рассмотрим примеры использования различных библиотек для этих целей.

Для начала
Для проверки примеров этого руководства потребуется какой-нибудь файл Excel с расширением .xlsx, содержащий какие-либо исходные данные. Вы можете использовать любой существующий файл Excel или создать новый. Мы создадим новый файл с именем sales.xlsx со следующими данными:

sales.xlsx

Sales Date Sales Person Amount
12/05/18 Sila Ahmed 60000
06/12/19 Mir Hossain  50000
09/08/20 Sarmin Jahan 45000
07/04/21 Mahmudul Hasan 30000

Этот файл мы и будем читать с помощью различных библиотек Python в следующей части этого руководства.
  

Чтение Excel-файла с помощью xlrd

    Библиотека xlrd не устанавливается вместе с Python по умолчанию, так что ее придется установить. Последняя версия этой библиотеки, к сожалению, не поддерживает Excel-файлы с расширением .xlsx. Поэтому устанавливаем версию 1.2.0. Выполните следующую команду в терминале:

       pip install xlrd == 1.2.0

       После завершения процесса установки создайте Python-файл, в котором мы будем писать скрипт для чтения файла sales.xlsx с помощью модуля xlrd.

Воспользуемся функцией open_workbook() для открытия файла xlsx для чтения. Этот файл Excel содержит только одну таблицу. Поэтому функция workbook.sheet_by_index() используется в скрипте со значением аргумента 0.

Затем используем вложенный цикл for. С его помощью мы будем перемещаться по ячейкам, перебирая строки и столбцы. Также в скрипте используются две функции range() для определения количества строк и столбцов в таблице.

Для чтения значения отдельной ячейки таблицы на каждой итерации цикла воспользуемся функцией cell_value() . Каждое поле в выводе будет разделено одним пробелом табуляции.

   

import xlrd

# Open the Workbook
workbook = xlrd.open_workbook("sales.xlsx")

# Open the worksheet
worksheet = workbook.sheet_by_index(0)

# Iterate the rows and columns
for i in range(0, 5):
    for j in range(0, 3):
        # Print the cell values with tab space
        print(worksheet.cell_value(i, j), end='\t')
    print('')

Запустим наш код и получим следующий результат.

       

Чтение Excel-файла с помощью openpyxl

    Openpyxl – это еще одна библиотека Python для чтения файла .xlsx, и она также не идет по умолчанию вместе со стандартным пакетом Python. Чтобы установить этот модуль, выполните в терминале следующую команду:

pip install openpyxl

После завершения процесса установки можно начинать писать код для чтения файла sales.xlsx.

Как и модуль xlrd, модуль openpyxl имеет функцию load_workbook() для открытия excel-файла для чтения. В качестве значения аргумента этой функции используется файл sales.xlsx.

Объект wookbook.active служит для чтения значений свойств max_row и max_column. Эти свойства используются во вложенных циклах for для чтения содержимого файла sales.xlsx.

Функцию range() используем для чтения строк таблицы, а функцию iter_cols() — для чтения столбцов. Каждое поле в выводе будет разделено двумя пробелами табуляции.

import openpyxl

# Define variable to load the wookbook
wookbook = openpyxl.load_workbook("sales.xlsx")

# Define variable to read the active sheet:
worksheet = wookbook.active

# Iterate the loop to read the cell values
for i in range(0, worksheet.max_row):
    for col in worksheet.iter_cols(1, worksheet.max_column):
        print(col[i].value, end="\t\t")
    print('')

Запустив наш скрипт, получим следующий вывод.

 

Чтение Excel-файла с помощью pandas

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

pip install pandas

    После завершения процесса установки создаем файл Python и начинаем писать следующий скрипт для чтения файла sales.xlsx.

В библиотеке pandas есть функция read_excel(), которую можно использовать для чтения .xlsx-файлов. Ею мы и воспользуемся в нашем скрипте для чтения файла sales.xlsx.

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

import pandas as pd

# Load the xlsx file
excel_data = pd.read_excel('sales.xlsx')
# Read the values of the file in the dataframe
data = pd.DataFrame(excel_data, columns=['Sales Date', 'Sales Person', 'Amount'])
# Print the content
print("The content of the file is:\n", data)

После запуска кода мы получим следующий вывод.

Результат работы этого скрипта отличается от двух предыдущих примеров. В первом столбце печатаются номера строк, начиная с нуля. Значения даты выравниваются по центру. Имена продавцов выровнены по правому краю, а сумма — по левому.

Заключение

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

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



1