Программистика
关闭频道
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
显示更多5 594
订阅者
-324 小时
+87 天
-8530 天
帖子存档
5 593
Использование символов для представления чисел
UTF-8 использует числа для представления чисел, представляющих числа, состоящие из битов, представляющих символы. Но и это еще не все! Сейчас
я собираюсь применять символы для обозначения некоторых из этих чисел. На заре межкомпьютерных коммуникаций люди хотели передавать между компьютерами нечто большее, чем просто текст; нужно было отправлять двоичные данные. Но сделать это было непросто, потому что раньше
многие значения ASCII были зарезервированы для управляющих символов и не обрабатывались последовательно между системами. Также некоторые системы поддерживали передачу только 7-битных символов.
Кодировка Quoted-Printable
Кодировка Quoted-Printable, также известная как QP-кодировка, — это механизм, позволяющий передавать 8-битные данные по пути, который поддерживает только 7-битные данные. Она был создана для вложений электронной почты. Эта кодировка позволяет представить любое 8-битное байтовое значение тремя символами: символом =, за которым следует пара шестнадцатеричных чисел, по одному для каждого полубайта. Конечно, при этом знак = получает особое значение и поэтому должен быть представлен с использованием =3D, его значения находится в таблице ASCII, которая будет представлена ниже. В кодировке Quoted-Printable есть несколько дополнительных правил. Символы табуляции и пробела должны быть представлены как =09 и =20 соответственно, если они расположены в конце строки. Длина закодированных строк не может превышать 76 символов. Знак = в конце строки — это мягкий разрыв строки, который удаляется при декодировании данных получателем.
Кодировка Base64
Хотя кодировка Quoted-Printable работает, она не очень эффективна, поскольку для представления единственного байта требуются три символа. Более эффективна кодировка Base64, и она действительно имела большое значение, когда обмен данными между компьютерами занимал гораздо больше времени, чем сегодня. Кодировка Base64 упаковывает 3 байта данных в 4 символа. 24 бита данных в трех байтах разделены на четыре 6-битных блока, каждому из которых назначается печатный символ, как показано в таблице Base 64, которая будет тоже представлена ниже. Эта кодировка преобразует каждый набор из трех байтов в четыре символа. Но при этом не гарантируется, что длина данных будет кратна трем байтам. Проблема решается с помощью символов заполнения; символ = будет добавлен в конец строки, если строка занимает только 2 байта, либо же будут добавлены символы ==, если строка займет всего 1 байт.Кодировка Base64 до сих пор часто используется для вложений электронной почты.
Кодировка URL
В одном из предыдущих разделов вы видели, что кодировка Quoted-Printable наделила особой силой символ = и что эта же кодировка включала механизм для
представления обычного символа =. Практически идентичная схема используется в URL-адресах веб-страниц. Если вы когда-нибудь рассматривали URL-адрес веб-страницы, вы могли заметить такие последовательности символов, как %26 и %2F. Они существуют потому, что определенные символы имеют особое значение в контексте URL-адреса. Но иногда нам нужно использовать эти символы как литералы — другими словами, без специальных значений. Как мы уже видели, символы представлены в виде последовательности 8-битных блоков. Каждый фрагмент может быть представлен двумя шестнадцатеричными символами, как показано на схеме, которая тоже будет представлена ниже. Кодировка URL, также известная как процентная кодировка, заменяет символ на знак %, за которым следует шестнадцатеричное представление этого символа. Например, косая черта (/) имеет особое значение в URL-адресах. Она имеет код 47 в ASCII, что равно 2F в шестнадцатеричном формате. Если нужно использовать / в URL-адресе, не учитывая его особое значение, мы заменяем его на %2F.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 593
Графические процессоры
Сегодня я вам расскажу вкратце, как компьютер представляет графику и с помощью чего он это делает.
Графика — это раскраска картины по номерам в масштабе. Нет ничего необыч ного в том, чтобы нарисовать 8 миллионов цветных пятен и раскрашивать их 60 раз в секунду, если вам нужно получить качественное видео. Однако для этого необходимо около полумиллиарда обращений к памяти в секунду.
Работа с графикой — это специализированная задача, которая не требует всех функций универсального процессора. Ее легко можно распараллелить: рисова ние нескольких точек за раз может улучшить производительность.
Графические процессоры имеют две особенности. Во-первых, они включают большое количество простых процессоров. Во-вторых, у них гораздо более широкие шины памяти, чем у обычных процессоров, что означает, что они полу чают доступ к памяти намного быстрее.
Со временем графические процессоры приобрели более универсальные функ ции. Были продуманы варианты стандартных языков программирования для
работы с графическими процессорами — теперь они используются для опре деленных классов приложений, которым доступны все преимущества своей
архитектуры.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 593
Булева алгебра
Подобно тому как алгебра, булева алгебра — это набор правил для работы с числами, она, изобретенная в XIX веке английским математиком Джорджем Булем, представляет собой набор правил, которые используются для работы с битами. Как и в случае с обычной алгеброй, в булевой алгебре применяются правила ассоциативности, коммутативности и дистрибутивности.
Существуют три основные логические операции НЕ, И и ИЛИ, а также одна составная операция — исключающее ИЛИ:
НЕ (NOT) — эта операция означает «противоположность». Например, если бит ложный, НЕ этот бит будет истинным. Если бит истинен, НЕ этот бит будет ложным.
И (AND) — в этой операции задействовано 2 бита или более. В 2-битной операции результат будет истинным, только если И первый, И второй бит истинны. Если задействовано более 2 бит, результат будет истинным только в том случае, если все биты истинны.
ИЛИ (OR) — эта операция также включает 2 бита или более. В 2-битной операции результат будет истинным, если первый ИЛИ второй бит истинен; в противном случае результат будет ложным. Если бит больше, чем 2, результат будет истинным, если какой-либо из битов истинен.
Исключающее ИЛИ (XOR) — Результат операции «исключающее ИЛИ» будет истинным, если первый и второй биты имеют разные значения.
Ниже прикреплю таблицы истинности всех этих операций.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 593
Библиотеки, исполняемые файлы и динамически компонуемые библиотеки
Когда файл компилируется, полученный машинный код помещается в объектный файл (с расширением .obj в Windows или .o в операционных системах на основе UNIX). Машинный код в объектном файле:
перемещаемый — это означает, что адреса памяти, в которых находится код, еще не определены;
несвязанный — это означает, что любые внешние ссылки на функции и глобальные данные, которые определены вне единицы компиляции, еще не были связаны. Объектные файлы могут быть собраны в группы, называемые библиотеками.
Библиотека — это просто архив, очень похожий на файл ZIP или TAR, содержащий ноль или более объектных файлов. Библиотеки существуют просто для удобства, позволяя собирать большое количество объектных файлов в один простой в использовании файл.
Объектные файлы и библиотеки связываются (линкуются) в исполняемый файл компоновщиком. Исполняемый файл содержит полностью разрешенный машинный код, который может быть загружен и запущен операционной системой. Работа компоновщика заключается в следующем:
рассчитать окончательные относительные адреса всего машинного кода, который будет отображаться в памяти при запуске программы;
убедиться, что все внешние ссылки на функции и глобальные данные, определенные в каждой единице компиляции (объектном файле), правильно разрешены. Важно помнить, что машинный код в исполняемом файле все еще можно перемещать, а это означает, что адреса всех инструкций и данных в файле по-прежнему относятся к относительному, а не к абсолютному базовому адресу. Окончательный
абсолютный базовый адрес программы неизвестен до тех пор, пока она не будет загружена в память непосредственно перед запуском.
Динамически подключаемая библиотека (dynamic link library, DLL) — это особая библиотека, которая представляет собой гибрид между обычной статической
библиотекой и исполняемым файлом. DLL действует как библиотека, поскольку
содержит функции, которые могут быть вызваны любым количеством различных
исполняемых файлов. В то же время DLL действует и как исполняемый файл, потому что она может загружаться операционной системой независимо и содержит
код запуска и завершения работы, работающий так же, как функция main() в исполняемом файле C++.
Исполняемые файлы, использующие DLL, содержат частично связанный машинный код. Большинство ссылок на функции и данные полностью разрешены
в окончательном исполняемом файле, но любые ссылки на внешние функции или данные, которые существуют в DLL, остаются несвязанными. Когда исполняемый файл запускается, операционная система разрешает адреса всех несвязанных функций, находя соответствующие библиотеки DLL, загружая их в память, если они еще не загружены, и исправляя необходимые адреса в памяти. Динамически
подключаемые библиотеки — очень полезная функция операционной системы,
поскольку отдельные библиотеки DLL могут быть обновлены без изменения исполняемых файлов, которые их используют.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 593
К сожалению, сегодня поста не будет, загонялся по учëбе, и не успел подготовить интересный контент! 🌫
5 593
Хотели бы вы видеть статьи по самым основам(что такое функции, типы данных, основы ООП и так далее)
5 593
Что такое foo и bar?
Если вы читали учебные пособия по программированию, то могли в некоторых видеть, как применяются такие слова, как foo и bar, и сегодня я вам расскажу о них, и для чего они используются.
foo и bar - это общепринятые заглушки или обозначения, которые часто используются в качестве примеров или иллюстраций кода. Они не имеют никакого специального значения для компилятора, а используются исключительно в качестве примеров.
Часто вы их можете увидеть в учебниках, учебных пособиях и статьях на различных сервисах.
Пример:
def foo(a):
return a + 48
def bar(b):
return b + 44
print(bar(67) * foo(78))
Честно, я не люблю использовать эти заглушки в коде, ведь, как мне кажется, переменные, функции, массивы и так далее должны называться осмысленно, даже в учебных пособиях.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 593
Оператор goto в C++
Сегодня я вам расскажу об очень интересном операторе в языке C++
goto предоставляет возможность передвигаться в коде программы от одной метки к другой. Однако использовать этот оператор все не торопятся, ведь его использование ухудшает читаемость кода.
C++
#include <iostream>
int main()
{
int i = 0;
start_loop://Метка
if (i < 5){
std::cout << i << " ";
i++;
goto start_loop;
}
std::cout << std::endl;
}
Вывод: 0 1 2 3 4 5Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica
5 593
Стили именования структур в коде
Сегодня я вам расскажу о нескольких стилях, которые приняты в сообществе программистов, для именования переменных, функций, массивов, классов и так далее.
CamelCase - этот стиль подразумевает использовать строчные буквы для первого слова и заглавные для каждого последующего слова.
Пример:
completeInt
Snake case - в этом стиле слова разделяются символом подчёркивания "_", все буквы пишутся в нижнем регистре.
Пример: complete_int
PascalCase - Каждое слово начинается с буквы верхнего регистра.
Пример: CompleteInt
Hungarian Notation- в этом стиле к основной части названия добавляется префикс, который может указывать на тип данных или другой добавочной информации.
Пример: intNumber
Kebab case - Слова разделяются дефисом. Обычно применяется к URL и именах файлов.
Пример: complete-int
Screaming Snake Case - Все буквы написаны в верхнем регистре и слова разделяются символами: "_". Обычно используется для обозначения констант.
Пример: COMPLETE_INT
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 593
Функциональная компоновка в C#
Язык C# сам по себе не поддерживает функциональную компоновку, что создает семантические проблемы. Но такую функциональность можно легко ввести. Рассмотрим простой случай на C# для определения двух функций с использованием лямбда-выражения.
C#
Func<coffee_beans, coffee_ground> Grind_coffee = Coffee_Beans => new coffee_ground(Coffee_Beans);
/* Функция высшего порядка Grind_coffee возвращает делегат Func, который принимает coffee_beans
в качастве аргумента, а затем возвращает объект coffee_ground.*/
Func<coffee_ground, latte> Complete_coffee = Coffe_Ground => new latte(Coffee_Ground);
/*Функция высшего порядка Complete_coffee возвращает объект latte и принимает
в качестве параметра объект coffee_ground.*/
Первая функция, Grind_coffee, принимает в качестве параметра объект coffee_beans и возвращает новый экземпляр класса coffee_ground. Вторая функция, Complete_coffee, принимает в качестве параметра объект coffee_ground и возвращает новый экземпляр latte. Цель функций — создать объект класса latte, объединив ингредиенты, получаемые в результате вычислений. Как скомпоновать эти функции? В C# есть возможность выполнять их последовательно, передавая результат первой функции во вторую по цепочке
//Компоновка функций(неудачный вариант)
coffee_ground Coffee_Ground = Grind_coffe(Coffe_Beans);
latte Latte = Complete_coffee(Coffee_Ground);
latte Latte = Complete_coffe(Grind_coffee(Coffee_Beans));
/*Неудачный пример компоновки функций, где чтение данных выполняется задом наперёд.*/
Сначала выполняется функция Grind_coffee, которой передается параметр Coffee_Beans, затем результат Coffee_Ground передается в функцию Complete_coffee. Второй вариант, который даст тот же результат, — объединить выполнение Grind_coffee и Complete_coffee, что позволит реализовать основную идею функциональной компоновки. Но с точки зрения удобства чтения это неудачный шаблон, поскольку он заставляет читать код справа налево, что не является естественным. Было бы неплохо читать код логически слева направо. Лучшим решением было бы создать параметризованный, специализированный метод расширения, который можно было бы использовать для компоновки любых двух функций с одним или несколькими параметризованными входными аргументами.
Ниже определена функция Compose и выполнен рефакторинг предыдущего примера. (Параметризованные аргументы выделены жирным шрифтом.)
static Func<A, C> Compose<A, B, C>(this Func<A, B> f, Func<B, C> g) => (n) => g(f(n)
/*Создаёт параметризованный метод расширения для любого параметризованного делегата Func<A, B>, который принимает в качестве входного аргумента параметризованный делегат Func<B, C> и возвращает объединённую функцию Func<A, C>.*/
Func<coffe_beans,latte> makeLatte = Grind_coffe.Compose(Complete_coffe);
latte Latte = makeLatte(Coffe_Beans)
функция высшего порядка Compose составляет цепоч-
ку из функций Grind_coffe и Complete_coffe, создавая новую функцию makeLatte,
которая принимает аргумент coffe_beans и выполняет coffe_beans (Grind_coffe
(Coffe_Beans)).
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 593
Так разве среднее не находится по этой формуле: middle=(left+right)/2Большое спасибо подписчику, который заметил ошибку в моëм коде, которая мешала корректной работе всего алгоритма, но уже в статье всë исправлено Большое спасибо, что помогаете, спрашиваете и указываете на ошибки, это позволяет нам всем учиться быстрее и эффективнее❤️
5 593
Если для обслуживания запроса необходимо несколько обращений к прикладным сервисам, то один-единственный медленный прикладной запрос может затормозить работу всего запроса конечного пользователя
5 593
Бинарный поиск
Сегодня я вам расскажу о том, что такое бинарный поиск, о том как он работает и в чём он лучше обычного поиска.
Давайте сперва рассмотрим обычный поиск, допустим перед нами стоит задача выяснить индекс определённого элемента массива, и мы воспользуемся следующим методом его нахождения:
def search(items, number):
import random
i = 0
for element in items:
if element == number:
return f"В массиве присутствует цифра 7 под индексом: {i}"
i += 1
items = [1, 2, 5, 6, 7, 90, 180]
print(search(items, 7))
С помощью этой функции мы узнали, что в массива items цифра 7 имеет индекс: 4
Но если бы нам был дан массив из тысячи или даже намного большего числа элементов, то проверять поочерёдно каждый элемент массива было слишком долго. И именно в таких ситуациях необходим бинарный поиск, который проделает эту работу гораздо быстрее, ведь он не проверяет все элементы массива поочерёдно.
Но при этом его алгоритм довольно прост: Он берёт массив(обязательно отсортированный, иначе алгоритм не сработает) и при каждой итерации делит его пополам, проверяет равен ли элемент массива, стоящий по середине этого самого списка или может даже таблицы, с искомым элементом, если элемент больше искомого, то алгоритм отбрасывает все элементы, стоящие до среднего, а если средний элемент меньше искомого, то алгоритм отбрасывает все элементы, стоящие после среднего, и после этого алгоритм начинает всё сначала, но только уже с оставшимися элементами списка
Сейчас разберём это на примере:
def bynary_search(items, number):
low = 0 #Индекс самого маленького элемента массива
high = len(items) - 1 #Индекс самого большого элемента массива
while low <= high:
mider = low + high #Индекс среднего элемента массива
numb = items[mider] #Средний элемент массива
if numb == number: #Действие при равенстве среднего и искомого элементов
return mider
elif numb > number: #Действие, если средний элемент больше искомого
high = mider - 1
elif numb < number: #Действие, если средний элемент меньше искомого
high = mider + 1
return None #функция вернёт None, если искомого элемента нет в массиве
items = [1, 2, 5, 6, 7, 90, 180]
print(bynary_search(items, 7))
А если вы хотите произвести поиск по массиву или таблице, состоящей из строковых элементов, то лучше сортировать массив по алфавиту и проводить практически тоже самое.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 593
Хеш-функции
Сегодня я вам расскажу, что такое Хеш-функции и чем они полезны.
Давайте сперва дадим определение этому термину.
Хеш-функция - это функцию, которая получает строку и возвращает число. Допустим, что код получат входными данными слово:
сыр, а на выводе мы получим число: 4. Примерно так работают Хеш-функции.
При этом любая Хэш-функция должна соответствовать некоторым требованиям:
1.Она должна быть последовательной. Допустим, вы передали ей строку "сыр" и получили 4. Это значит, что каждый раз в будущем,
передавая ей строку "сыр", вы будете получать 4. Без этого хеш-функция бесполезна.
2.Разным словам должны соответствовать разные числа. Например, хеш функция, которая возвращает 2 для каждого полученного слова, никуда не годится. В идеале каждое входное слово должно отображаться на свое число.
Таким образом, хеш-функция связывает строки с числами, но вы, наверное, спросите, зачем это нужно. А сейчас я представлю пример кода и на нём разберём ситуацию, в которой хеш-функция необходима.
'''Создадим программу, которая будет получать на вход продукт,
а выводить в консоль цену за этот продукт, это и будет хеш-функцие'''
def price_product():
price = {"сыр": 250, "молоко": 140, "яблоки": 80} #Создаёи словарь
product = input("Введите интересующий вас продукт: ") #Вводимый пользователем продукт
return price[product]
print(price_product())
Хеш-таблица состоит из ключей и значений. В хеше price имена продуктов являются ключами, а цены - значениями. Хеш-таблица связывает
ключи со значениями.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 593
Безопасность в Сети
Сегодня я вам расскажу о том, как обеспечивается безопасность персональных данных в интернете.
Интернет спроектирован так, что кто угодно может легко подключиться к нему и начать передавать трафик. Открытая архитектура не только стимулировала
волну инноваций, но и сделала интернет платформой для атак неслыханного масштаба и размаха. Одна из самых распространенных и разрушительных атак - DDoS (Distributed Denial of Service - •отказ в обслуживании•), при которой множество компьютеров в сети посылают трафик на компьютер-жертву в попытке
истощить ее ресурсы. Существует множество различных видов DDoS-aтaк. Простейшая форма DDоS-атаки представляет собой отправку трафика большим
числом компьютеров (в совокупности называемых ботнетом) на компьютер жертву. DDоS-атаки обычно проводятся со взломанных компьютеров (например, ноутбуков или серверов), но изобилие плохо защищенных устройств IoT привело к возникновению совершенно нового вектора DDoS-aтaк. Может
ли скоординированная атака миллиона подключенных к интернету «умных» тостеров обрушить Google? К сожалению, IоТ-производители не слишком
озабочены безопасностью программного обеспечения. На сегодняшний день
защита от атак со стороны крайне плохо защищенных IоТ-устройств ложится на плечи сетевых операторов. Чтобы отбить у пользователей охоту подключать
к сети ненадежные устройства, необходимы новые стимулы или нормативная база. В целом многие проблемы безопасности в интернете сводятся к наличию/
отсутствию мотивации.
Спам (нежелательные сообщения) сегодня составляет более 90 % всего трафика электронной почты, поскольку спамеры накопили базы из миллионов адресов,
а горе-маркетологи могут без особых затрат рассылать по ним сгенерированные сообщения. К счастью, существует ПО для фильтрации таких писем, способное
анализировать и отбрасывать созданный другими компьютерами спам. Ранние варианты фильтрующего ПО отличали спам от настоящих писем в основном
по содержанию сообщений. Однако спамеры быстро научились обходить эти фильтры. Зато проверка IР-адресов отправителей и получателей, а также шаблонов
отправки электронной почты оказалась намного эффективнее.
Чаще всего спам в электронной почте просто раздражает. Но порой такие сообщения могут оказаться частью мошеннической схемы или попыткой
украсть персональные данные - пароли или информацию о банковских счетах. Фишинговые (phishing) сообщения маскируются под письма от надежного источника (например, банка). С их помощью злоумышленники пытаются обманом заставить пользователя раскрыть конфиденциальную информацию (к примеру, номера банковских карт). Хищение персональных данных становится серьезной проблемой, если мошенники собирают достаточно данных для оформления
кредитных карт и других документов на имя жертвы обмана.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
