• Какие основные понятия в ООП?

    vabka
    @vabka
    Токсичный шарпист
    Агрегация/Ассоциация/Композиция - это всё виды взаимоотношений между разными типами. Это не принципы
    Абстракция - это просто сама возможность вводить какие-то новые абстракции, поверх уже существующих. Ради этого ООП и придумано.

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

    И уже споров о глубинном смысле трёх волшебных слов была целая куча (а ведь если бы кто-то когда-то не решил всё уместить в одиночные слова - этой неразберихи бы не было)

    Так что из всех принципов, которые объединяют все более-менее ООП-языки остаётся только:

    1. Всё есть объект, и объект объединяет под собой некоторые данные (которые могут быть не доступны публично) и операции (методы или функции), которые можно произвести над совокупностью этих данных.
    2. Имеется какой-нибудь механизм для полиморфизма.

    В общем-то первый такой принцип можно назвать этой самой абстракцией и, отчасти, инкапсуляцией.
    Ответ написан
    Комментировать
  • Можно ли обойтись без базовой станции?

    @Drno
    Роутер то какой стоит??
    Скорее всего он просто перегревается. И стоит 700р))

    У Кинетика есть хорошие модели

    Можно микротик поставить, Hap AC - ему 15 клиентов вообще лафа)))
    Ответ написан
    1 комментарий
  • Как работает свитч-кейс?

    vabka
    @vabka
    Токсичный шарпист
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    switch-case в js не умеет сопоставлять одновременно несколько значений.
    Так что никак твой код рабочим не сделать.
    Тем более, что не понятно, что он должен делать.

    В общем случае switch разворачивается примерно вот так:

    switch (expression) { // expression - это какое-то выражение. Тоесть значение одно.
      case variant1: // variant1 и variant2 - это тоже какое-то выражение. Тоесть тоже ровно одно значение.
        // ...
      break;
      case variant2:
        // ...
      break;
      default:
        // ...
      break;
    }
    
    // Вот в такое
    const value = expression;
    if(value === variant1) {
      //...
    } else if (value === variant2) {
      //...
    } else {
      // ...
    }
    Ответ написан
    Комментировать
  • Как работает свитч-кейс?

    examix
    @examix
    Gutta cavat lapidem
    switch - case

    Принимает аргумент и выполняет строгое сравнение с требуемыми блоками условий, если условие сравнения в блоке истинно выполняется код в данном блоке до ближайшей директивы break. Если ни один блок сравнений не сработал, выполняется блок кода default.
    let etalonCity1 = ['Самара',  'Архангельск'];
    switch (arg) {
    	case etalonCity1[1]:  // if (arg === etalonCity1[0])
    		//to-do
    		break;
    	case etalonCity1[0]:  // if (arg === etalonCity1[1])
    		//to-do
    		break;
    	default:
    		//to-do
    		console.log('Условия сравнения не совпали');
    		break;
    }


    Вариант сравнения используя ' тернарный оператор '
    a === b ? console.log('true') : console.log('false');

    Если сравнение истина выполни то, что после вопросительного знака если ложно выполни то, что после двоеточия.
    Ответ написан
    Комментировать
  • Как происходит доступ к эл. массива на уровне ядра? Malloc выделяет непрерывную физическую память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как происходит доступ к эл. массива на уровне ядра?

    Так же как и на уровне приложения -- через трансляцию виртуального адреса в физический.

    Например массив Int* arr = new int[1024*1024*1024] он как храниться?

    Если мы для определённости возьмём linux, то у ядра есть несколько разных способов выделения памяти, в зависимости от того, для чего эта память выделяется. Есть наиболее простой и стандартный kmalloc который выделяет память непрерывную как виртуально так и физически. Обычно этим механизмом нельзя выделить большой непрерывный кусок. Есть vmalloc, который выделяет непрерывную виртуально, но возможно прерывную физически память. Есть get_free_pages который выделяет непрерывные страницы физической памяти, возможно, не отображаемые ни в какие виртуальные адреса. Есть Contiguous Memory Allocator который при старте системы резервирует кусок непрерывной физической памяти и может аллоцировать оттуда куски по запросу.
    Важный момент состоит в том, что аллокации делаемые ядром linux через упомянутые интерфейсы всегда обеспечиваются физической памятью, у памяти ядра нет пейджинга.

    А физическая, для массива то же? Ведь, так будет доступ намного быстрее?

    Почему быстрее? С точки зрения процессора всё равно будет трансляция виртуального адреса в физический, если повезёт -- попадание в TLB, если не повезёт -- ходить по каталогам и таблицам страниц в памяти.

    получается эмулятор каждый адрес вычислять что ли?

    Простой эмулятор -- да, наверно. Умный эмулятор может кешировать эту информацию, например именно это свойство даёт QEMU большую часть его Q.
    Ответ написан
    Комментировать
  • «Семантические» HTML5 элементы — это аттавизм?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    Не всё так радужно, как задумывалось, но смысл в их использовании есть.
    От каких то тэгов больше - от каких то меньше.
    Но если что-то можно сделать не прилагая почти никаких усилий и получить от этого пользу, то почему этого делать не стоит?

    https://habr.com/ru/company/htmlacademy/blog/546500/

    Основных поинтов использования семантики 3.
    1) Использование подходящих элементов делает их использование удобнее. Несколько раз встречал когда ссылки делали дивами с js поверх. Нет возможности нажать на них колёсиком чтобы открылаьс в новой вкладке или правой кнопкой с соответствующем ссылке контекстным меню. Это отвратительно неудобно.
    2) это помощь людям с ограниченными возможностями для понимания контекста происходящего на экране. Наглядный пример это ссылки внутри тэга nav. Можно побаловаться со скрин ридером и будет понятно о чём речь.
    Если коротко: ссылки в div будут озвучены как: *ссылка*.
    Ссылки в nav: "ссылка, навигация"
    https://vc.ru/promo/132280-kak-zvuchat-sayty-nezry...
    https://www.youtube.com/watch?v=RQiN1Hhrxu0
    3) Помощь поисковым ботам понимать контекст и формировать снипеты в поисковой выдаче. Пример есть в статье выше.
    https://siteclinic.ru/blog/technical-aspects/html5...

    с какой-либо из «сторон дела»: пользователя, верстки, программирования, поисковых систем?

    1) Про пользователей выше
    2) Про вёрстку - удобнее читать
    3) Про программирование - использование верных тэгов соответствующим образом влияет на работу с этими элементами в JS либо избавляет от необходимости в JS в принципе.
    4) Про поисковые системы выше.
    Ответ написан
    11 комментариев
  • Выбрать Rust или C++?

    vabka
    @vabka
    Токсичный шарпист
    Rust достаточно стабильный и популярный, чтобы начать с ним работать.
    По геймдеву - в принципе все нужные низкоуровневые библиотеки для работы с графикой там уже есть. Да и движки свои понемногу да появляются.
    Пример из тех, что сейчас активно развиваются - bevy, на нём уже можно делать не очень сложные игры, да и просто как образец он тоже интересный: во главе угла стоит модульность и ECS.
    Ответ написан
    Комментировать
  • Выбрать Rust или C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Rust создавался при разработке браузера Mozilla чтобы закрыть конкретные дефекты С++. Системообразующие дефекты такие как NPE, Buffer Overflow e.t.c. Сегодня доля Rust файлов в сорцах мозиллы составляет 40% от общего количества файлов. Это - достаточно чтобы считать успехом мероприятие.

    Нужно ли брать Rust при разработке игровых движков? ХЗ. Я-бы сказал что Rust важнее для тех приложений где важна инфо-безопасность. Я не спец в Rust, но я чисто из любопытва смотрел например как в Rust открыть файл (мне надо было парсить логи). Так вот открыв файл ты не просто не получаешь файловую переменную. Ты получаешь монаду Either (там кажется она называется Result<>) и вот пока ты ее паттерн матчингом не проверишь - никакого файла не получишь. Тоесть протокол работы с файлами строгий настолько, насколько это возможно. Срезать поворот - не получается. Это в сях можно взять fopen(..) и результат проe..ать.

    Вобщем rust по уровню строгости напоминает... ну не знаю Haskell наверное. Хотя в Rust тоже можно творить безпредел - но по крайней мере ты будешь явно декларировать операции как usafe. Это слишком очевидно вобщем-то. Дело техники на code-review просто отделить опасное и принять решение стоит ли так кодить или нет.

    Да и один финский парень обещал что в Rust скоро зайдет как второй язык разработки ядра Linux. Ждем пока.
    Ответ написан
    Комментировать
  • Почему переменную не видно внутри iife?

    @historydev Куратор тега JavaScript
    Потому-что точки с запятой ставить нужно.
    const url = 'https://jsonplaceholder.typicode.com/todos/1';
    
    (async () => {
    	
    	console.log(url)
    })()
    Ответ написан
    Комментировать
  • Скрипт проверки работает ли служба в Linux, есть ли заготовки?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Всё это умеет systemd, не нужно велосипедить.
    Ответ написан
    2 комментария
  • Какой пакетный менеджер использовать в WordPress-теме: npm, bower, yarn?

    Bower давно мёртв. NPM точно есть у всех и мало нынче отличается от Yarn. Но при этом многие используют Yarn. Если речь про свой собственный сайт, то возьмите монетку, загадайте для каждой стороны NPM и Yarn, подкиньте её и получите ответ. Если встанет на ребро - берите Bower, Вселенная пытается вам что-то сказать.
    Ответ написан
    4 комментария
  • Для чего нужен Promise.resolve, если он не срабатывает в Promise?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Promise.resolve(value) - это статический метод, возвращающий промис в состоянии fulfilled с указанным значением.
    Эквивалент new Promise((resolve) => resolve(value))
    И можно как-то выполнить промис без аргументов?
    Что значит "выполнить"? Создать можно, сменить статус с pending на fulfilled нельзя, на rejected можно по исключению.
    P.S. Если вас смущает то, что и там и там используется resolve, то в new Promise это всего лишь название переменной для каллбэка в функции. Оно может быть любым.
    new Promise((แก้ไข) => แก้ไข('Решено'));
    //Promise { <state>: "fulfilled", <value>: "Решено" }
    Ответ написан
    Комментировать
  • Почему для счётчиков не используют беззнаковые (unsigned) числа?

    vabka
    @vabka
    Токсичный шарпист
    В целом - так исторически сложилось, что в C# используется знаковый тип для индексации массивов.
    В Java вообще, например, нет беззнаковых типов. (думаю, из-за этого и в C# для индексации используется int)
    В новых языках, например в Rust от этого сразу уходят - в нём для индексации массивов используется usize (беззнаковый, размером с указатель на целевой машине)
    Ответ написан
    Комментировать
  • Как создать объект с регистронезависимыми ключами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Если завернуть объект в Proxy, можно будет изменять ключи при обращениях к объекту:

    const obj = new Proxy({}, {
      get(target, key) {
        const lowerKey = key.toLowerCase();
        return target[Object.hasOwn(target, lowerKey) ? lowerKey : key];
      },
      set(target, key, val) {
        target[key.toLowerCase()] = val;
        return true;
      },
      has(target, key) {
        return key in target || key.toLowerCase() in target;
      },
      defineProperty(target, key, descriptor) {
        return Object.defineProperty(target, key.toLowerCase(), descriptor);
      },
      deleteProperty(target, key) {
        return delete target[key.toLowerCase()];
      },
      getOwnPropertyDescriptor(target, key) {
        return Object.getOwnPropertyDescriptor(target, key.toLowerCase());
      },
    });
    Ответ написан
    1 комментарий
  • Как перенести переменную js из окна на другую страницу?

    vabka
    @vabka Куратор тега Веб-разработка
    Токсичный шарпист
    А для чего именно нужно передать?
    Есть разные способы и не все вам могут подойти.
    Самый простой и без привлечения сервера - через local storage
    Ответ написан
    2 комментария
  • Как игровые движки понимают инородные языки?

    Vindicar
    @Vindicar
    RTFM!
    1. Встраивают интерпретатор нужного языка, при необходимости урезают стандартную библиотеку (чтобы не давать коду плагинов лишних возможностей) и подсовывают туда средства общения с хост-программой.
    2. Если нет нужды изолировать плагин от остальной программы, то полагаю что да, накладные расходы на поддержку плагинов уменьшатся в случае, когда плагин написан на том же языке, что и программа. В противном случае организация "песочницы" может занять столько же усилий, сколько встраивание интерпретатора.
    3. Лучше, если язык плагина является или интерпретируемым (как Lua или JS), или компилируется в байткод (как Python/Java/C#). Также желательно, чтобы язык плагина имел средства интроспекции.
    Ответ написан
    Комментировать
  • Как игровые движки понимают инородные языки?

    vabka
    @vabka
    Токсичный шарпист
    Интерпретатор lua (в случае Love2D и Cocos), и Mono (в случае Unity) можно подключить, как обычную сишную библиотеку.
    В этом случае C++ не нужно "понимать" чужой язык, достаточно лишь понимать, какие сишные функции надо вызывать, чтобы запустить код на "чужом" языке, и как туда передать доступ к функциям движка (это делается, обычно, путём передачи указателей на функции)
    Ответ написан
    Комментировать
  • Как написать функцию с возвращаемым значением типа string, возвращающую одно из полей json'а, пришедшее с запросом axios?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Мужик, async/await - это просто сахар над Promise. Любая async функция возвращает Promise по определению, любой await этот Promise разрешает.
    async function setLegalLevel(): Promise<string> {
      ...
      await axios.post
      ...
    }
    ...
    const val: string = await setLegalLevel();
    Ответ написан
    Комментировать
  • Объединение массивов, почему contact неработает?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    [].concat()
    function mergeArrays(arr1, arr2) {
     let arr3 = arr1.concat(arr2);
     console.log(arr1, arr2, arr3);
    }
    
    mergeArrays([1,2,3,4], [5,6,7,8]);
    Ответ написан
    1 комментарий
  • Можно ли как-то запретить пользователю через консоль браузера отключать стили?

    petushok55
    @petushok55
    Обучаюсь на практике.
    Тебя вообще касаться не должно что там пользователь делает через консоль браузера.
    И любой js код юзер может изменить. Даже взять полностью код и вырезать лишнее.
    Есть например расширение "User Javascript and Css", с его помощью можно на любую страницу свой код впихнуть.
    Если это какая-то игра и тебе нужно ждать проигрывания анимации, то привяжи данные к серверу
    Ответ написан
    1 комментарий