Криптонит. Разработка, наука, шифрование
1.87K subscribers
808 photos
50 videos
480 links
Канал IT-компании «Криптонит».
Рассказываем про:
•работу с Big Data на основе AI, ML, шифрования
•разработку и языки программирования
•математику и криптографию

На связи @OBogolyubskaya_official
Присоединяйтесь к нам: https://career.kryptonite.ru/
Download Telegram
А у нас новая рубрика — #Накодь!

Сегодня — код на JavaScript с ошибкой (а может, и нет😀). Кто увидел, где она и как её можно решить — ждём в комментариях🔥

А завтра поделимся вариантами решения от Василия Беляева, нашего руководителя группы разработки интерфейсов!
Please open Telegram to view this post
VIEW IN TELEGRAM
В карточках оставили решение вчерашней ошибки
Uncaught TypeError: this.clearHistory is not a function


Экспертизой поделился Василий Беляев, руководитель группы разработки интерфейсов в «Криптоните».

Если понравилась эта задачка, то обязательно посмотрите вот это видео (смотреть). Там Василий разбирает задачи «Палиндром», «Поворот матрицы» и «Подсчёт элементов в списке» — их часто дают на собеседовании. #javascript

📌Если понравилась наша новая рубрика #накодь, то обязательно ставьте 🖤. Мы разберём ошибки других языков программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вам понравилась наша новая рубрика #накодь, а значит, мы продолжаем!

Теперь посмотрим на #rust — найдёте в этом коде ошибку? Пишите в комментариях!
А вот и вариант решения вчерашней ошибки — читайте карточки🖤

Их нам помог составить Александр Авраменко, руководитель направления системного программирования в «Криптоните» .

Типичные ошибки какого языка программирования смотрим дальше? #накодь
Please open Telegram to view this post
VIEW IN TELEGRAM
В нашем канале обновились рубрики — собрали их актуальный список в одном посте: нажимайте на тэги и читайте только то, что интересно вам❤️

🔹#нейрословарь — разбираем термины из мира нейронных сетей;
🔹#на_ноль_делить_нельзя — рассказываем о неочевидных математических фактах;
🔹#накодь — постим код с ошибкой, а потом рассказываем, как её решить;
🔹#история_математики — рассказываем про необычные математические приборы и ЭВМ прошлого;
🔹#Криптонит_говорит — делаем наш айтишный подкаст;
🔹#языки_программирования — сделали обзоры Java, JavaScript, Python, C++, Golang, Scala, Rust, Spark и продолжаем рассказывать о трендах;
🔹#научные_статьи — ломаем мозг над сложными статьями сотрудников «Криптонита»;
🔹#задачки — решаем задачки на логику и математику;
🔹#вакансии_Криптонит — приглашаем присоединиться к нашей команде;
🔹#новости_Криптонит — рассказываем, чем живёт компания;
🔹#мнения_экспертов — делимся мыслями наших экспертов на актуальные темы;
🔹#подборки — собираем в одном месте ресурсы для специалистов разных областей ИТ;
🔹#цитаты_вдохновляют — делимся мыслями известных людей;
🔹#интервью — наши сотрудники рассказывают о профессиональном пути и трендах отрасли;
🔹#Криптонит_объясняет — рассказываем просто насколько это возможно о сложных терминах и понятиях.
🔹#ИЯП — изучаем языки программирования прошлого;
🔹#криптословарь — объясняем основные криптографические термины.
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть у нас тут «скалисты»? Мы принесли вам задачку — что напечатает программа?

Ждём ваши ответы в комментариях! #нашкодь #накодь
А вот и объяснение вчерашней задачи по Scala! #накодь
А у нас новая ошибка на Scala в нашей рубрике #накодь

В чём проблема в коде ниже? Ждём ответы в комментариях! ⬇️

object UnitError { 

def printMsg(message: String): Unit = {
println(message)
}

def process(data: List[Int]): List[Unit] = {
for (element <- data) yield {
printMsg(s"Элемент: $element")
}
}

def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3)
val res = process(nums)
println(s"Результат: $res") // Вывод List[Unit] даёт неожиданный результат
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Правильный код и объяснение вчерашней ошибки #накодь

🔴Ошибка заключается в неверной конструкции при использовании функции process. Она возвращает пустые значения: List((), (), ()). Происходит это потому, что yield собирает результаты каждой итерации. В итоге получается список, состоящий из пустых значений Unit — по одному на каждый элемент в data.

❗️Unit в Scala — это аналог void в Java и Си-подобных языках, означающий пустое значение. В данном примере yield собирает результаты printMsg(...), которые все являются Unit (пустыми).

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

Исправление

Если требуется вернуть список преобразованных значений, тогда нужно использовать эти значения в yield.
def printMsg(message: String): String = { // Теперь возвращает String 
println(message)
message // Возвращает саму строку
}

def process(data: List[Int]): List[String] = { // Теперь функция возвращает List[String]
for {
element <- data
} yield {
printMsg(s"Обрабатываем элемент: $element") // Теперь выводится результат String
}
}


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

Приходите 27 апреля в 14:00 в Музей криптографии — эксперты из «Криптонита», билайна и других брендов подробнее расскажут об этой профессии.

Зарегистрироваться
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы просили — мы сделали! Новая ошибка из рубрики #накодь — теперь на языке С++!

Итак, есть ли тут проблема кроме narrowing conversion? Ждём ваши варианты в комментариях.

#include <cstdint>
#include <vector>

struct Type
{
Type(uint16_t, uint32_t = {})
{}
};

int main()
{
std::vector<Type> vector;
std::uint32_t object_id{};

// Есть предупреждение о narrowing conversion
vector.insert(vector.begin(), {0, object_id});

// Нет narrowing conversion
vector.push_back({0, object_id});

// Нет narrowing conversion
vector.insert(vector.begin(), Type{0, object_id});
}
Рассказываем, где же притаилась ошибка во вчерашнем коде.

Проблема в том, что в строке

vector.insert(vector.begin(), {0, object_id}); 

в вектор вставляется 2 элемента типа Type, а не один, как ожидает программист.

❗️Причина в том, что метод insert у вектора имеет перегрузку (номер 5), которая вторым параметром принимает std::initializer_list. А компилятор, видя фигурные скобки в коде, в первую очередь пытается создать объект такого типа.

И тут ему это удается, потому что у конструктора Type второй параметр имеет значение по умолчанию, следовательно, Type умеет создаваться, если в конструктор передали только один аргумент. В итоге компилятор успешно создает std::initializer_list с двумя элементами типа Type.

Так как создание std::initializer_list выполняется с использованием uniform initialization, то компилятор следит за корректностью преобразований. В примере объект типа std::uint32_t передается в конструктор Type, который принимает первым параметром std::uint16_t. То есть, возникает риск потери точности (32 бита не могут поместиться в 16 бит).

📌Об этом компилятор и предупреждает. Вот упрощенный пример, где видим то же самое предупреждение.

Может возникнуть вопрос, почему создание Type от 0 не вызывает предупреждение, ведь 0 - это int, а он, скорее всего 32 бита и тоже не помещается в 16 бит. Но тут литерал. Компилятор видит, что 0 вмещается в 16 бит и не предупреждает. Но если поместить int в переменную, то также возникает предупреждение.

🔹Эту ошибку для рубрики #накодь и объяснение нам помогли сделать коллеги из направления системного программирования в «Криптоните».
Please open Telegram to view this post
VIEW IN TELEGRAM