Задать вопрос
  • Как защитить программу от копирования без интернета?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Никак. Единствнный способ гарантированно защититься от нелицензионного копирования - это вынести ключевую часть функционала на сервер. Любая остальная защита - лишь усложнение реверс инжениринга и взлома. Всегда можно каленым железом вырезать любую проверку ключа из исполняемого кода.

    Активация ключа по телефону/интернету исключает лишь самый тривиальный способ "взлома" - просто копирование одной и той же лицензии по куче компьютеров без модификации исполняемых файлов.

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

    @WaterSmith
    Android-разработчик. Java, Kotlin
    Имеется, как и предел итераций записи на SSD или флеш накопитель. Только вот реально ли его достигнуть на практике - вопрос открытый.
    Скажем, первое что нагуглилось:
    Производители микроконтроллеров AVR в документации указывают что их Flash-память можно перезаписывать не менее 10000 раз, а EEPROM- 100000 раз.
    Ответ написан
    5 комментариев
  • Используют ли Rabbitmq в внешней сети?

    @rPman
    Для упрощения администрирования и защиты сервисов в рабочей сети общепринятая практика - собирать их все в локальной сети (при необходимости объединенной по интернету с помощью vpn), потому как иначе либо каждый сервис должен уметь защищаться от атак (напоминаю, шифрование не спасет от ддоса) либо в каждом участке сети настраивать фаервол.
    Ответ написан
    Комментировать
  • Является ли взаимозаменяемым опыт разработки на разных языках рамках одной платформы JVM (Java, Scala, Kotlin)?

    Jacen11
    @Jacen11
    да всем плевать сколько лет и где вы там просиживали, важны реальные знания. Есть те кто десять лет сидит и ничего толком не знают, кто то за год уже почти мидл. Учитывается главным образом как на вопросы ответите. Ну если ответы равны будут, то конечно уже посмотрят на прочее, но что то сомневаюсь что в реальном мире есть люди с одинаковыми знаниями и навыками.
    лично я устраивался без опыта на вакансиями с требованиями в несколько лет и менял стек пару раз. Один раз после трудоустройства всплыло что интервьюер забыл, что у меня нет коммерческого опыта в текущем стеке, претензий к моей работе не было
    Ответ написан
    2 комментария
  • Можно ли передать нужный тип переменной в дженерик функции?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    getFormattedData тоже должен быть дженерик и собсно его(дженерик) прокидывать в нижестоящие.

    Типа того:
    type Type1 = 1;
    type Type2 = 2;
    type Type3 = 3;
     
    type ContainsType<T extends UniversalType = UniversalType> = {type: T};
    
    type UniversalType = Type1 | Type2 | Type3;
    
    
    class Cls {
      async getFormattedData<T extends UniversalType>(data: ContainsType<T>): Promise<T> {
            const anyDataObject = this.validateData(data);
            const result = this.formatDataByType(anyDataObject);
            return result;
      }
    
      validateData<T extends UniversalType = UniversalType>(data: ContainsType<T>): T {
        return data.type
      }
    
      formatDataByType<T extends UniversalType = UniversalType>(data: T): T {
        return data
      }
    
    }
    const foo = await new Cls().getFormattedData({type: 2}); // 2


    Если ты явно чему-то пропиваешь тип который никак не зависит от входного дженерика:
    const anyDataObject: Type1 | Type2 | Type3 = ...
    то какбэ всё - приехали, ты сам указал, что тут именно такой тип(во всём его многообразии) и пофиг на входные данные. Ты можешь дальше сузить тип внутри метода:
    if (anyDataObject === 2) {
      // тут anyDataObject для ts считается Type2
    }
    но это уже никак не повлияет на выходной тип.

    В общем выводить типы можно только если они зависят от входных данных(которые в свою очередь получаются через дженерик), иначе откуда TS узнает, что там от чего зависит.
    Если ты заранее даже приблизительно не знаешь, что придёт на вход, то и что пойдёт на выход ты ноже не знаешь, а не знаешь ты - не знает и, тем более, TS: там просто одни произвольные данные превратились в другие без использования логики. С тем же успехом можно попытаться вывести точный тип Math.random().
    Ответ написан
    Комментировать
  • Как обойти вложенный массив объектов и вывести объекты как дерево?

    szQocks
    @szQocks
    const recursy = (item) => {
       if(item.children){
          return <Route path={item.path} element={item.element}>{item.children.map(recursy)}</Route>;
        }
        
        return <Route path={item.path} element={item.element} />;
      };
    
    
    array.map(recursy)


    С ключами сам разберешься, и убери строки за место компонентов, строки на сколько я знаю в jsx не компоненты
    Ответ написан
  • Какие ограничения есть на ip адреса для SSH?

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

    Ну давай по порядку:
    1.
    • 151.248.113.78 - вроде ок
    • 127.0.0.1 - точно мимо, тк локалхост
    • 194.85.283.12 - невалидный адрес. ipv4 - это четыре 8битных числа. 283 не входит в этот диапазон
    • 192.168.15.2 - подозрительно похож на адрес в локальной сети
    • 172.16.0.92 - аналогично
    • 185.76.145.0 - подозрительно похоже на адрес подсети, но пока карандашом
    • 10.55.84.56 - что-то подозреваем

    2. Идём смотреть, какие адреса точно являются локальными
    • 151.248.113.78 - не локальный
    • 192.168.15.2 - Для использования в частных сетях. RFC 1918. Глобальная маршрутизация запрещена
    • 172.16.0.92 - Для использования в частных сетях. RFC 1918. Глобальная маршрутизация запрещена
    • 185.76.145.0 - не локальный
    • 10.55.84.56 - Для использования в частных сетях. RFC 1918. Глобальная маршрутизация запрещена

    Остаются всего два адреса:
    151.248.113.78 и 185.76.145.0
    Причём второй может оказаться невалидным, если подсеть /24
    Ответ написан
    Комментировать
  • Почему на хабр карьере так мало вакансий для разработчиков уровня Junior?

    Всегда так было. Всем нужен чел с опытом, который сразу сможет начать работать, а не Джун, которого ещё год обучать придется, чтобы он пользу начал приносить.

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

    + всякие крупные компании в принципе не делают вакансии для джунов, тк их и так достаточно набирают через программы стажировки и обучения.
    Ответ написан
    4 комментария
  • Чем лучше инициализировать переменные, дефолтными значениями или null?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Если "пустое" значение совсем валидно, то лучше его. Если совсем невалидно, то null.
    Разумеется, есть и промежуточные варианты, когда это значание - объект, и некоторые поля можно использовать, а некоторые нет. Тут по ситуации, исходя из того, как удобнее делать проверки.

    C null можно ещё немного переписать код так:

    return value == null ? <EmptyComponent ../> : <RealComponent value={value} />


    тогда внутри RealComponent у тебя гарантированно правильное значение, с которым можно спокойно работать.
    Ответ написан
    Комментировать
  • Как сделать collect в кортеж?

    vabka
    @vabka Куратор тега Rust
    Кортеж имеет фиксированный размер и по тому просто так collect сделать нельзя.
    Тут тебе три варианта:
    1. Вроде в itertools есть реализации collect для небольших гомогенных кортежей.
    2. Делай collect в Vec и бери элементы из него
    3. Сделай два раза next на итераторе

    Код

    раз
    fn main() {
        let items = [1,2];
        let mut iter = items.into_iter().map(|x|5+x);
        let a = iter.next().unwrap();
        let b = iter.next().unwrap();
        println!("{a} {b}");
    }


    Два:
    fn main() {
        let items = [1,2];
        let [a,b] = items.map(|x|5+x);
        println!("{a} {b}");
    }


    Три:
    use itertools::Itertools; // 0.9.0
    
    fn main() {
        let items = [1,2];
        let (a,b) = items.iter().map(|x|5+x).next_tuple().unwrap();
        println!("{a} {b}");
    }

    Ответ написан
    4 комментария
  • На чем пишутся современные десктопные приложения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    java - "не подходит для десктопа"

    На платформе Java (Groovy, Kotlin) написана среда разработки Jetbrains Idea.
    Правда есть у меня подозрение что из библиотек там использован не Swing а SWT
    но я уж не помню я слишком давно этот вопрос изучал. За много лет многое могло поменятся.
    SWT не слишком кроссплатформенный.

    На Java написан менеджер закачек Vuze (Azureus) и такая векторная рисовалка как Yed
    которой я пользуюсь иногда.

    Еще OracleDeveloper, Beaver, SOAP-UI, и много всяких тулов программисткого толка.

    По поводу JavaFX но я честно говоря не видел чтоб кто-то
    активно что-то графическое на нем разрабатывал. Скорее всего это была наивная попытка
    исправить недостатки Swing. И сделать его ... более мультимедийным чтоли.

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

    Для окон остается что-то очень хардовое типа Photoshop, 3dMax, AutoCad где можно грузить на 200%
    клиентский CPU и ты реально будешь хотя-бы чувствовать пользу от такой отдачи.

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

    Поэтому не звучит вопрос что на Java десктопы не пишут. А их щас реально уже НИ НА ЧЕМ не пишут.
    Даже на С++. Реально только игры и редкие приложения типа там 1С или какие-то клиент-банки.
    Ответ написан
    7 комментариев
  • На чем пишутся современные десктопные приложения?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    на всем ), именнно ввиду непопулярности десктопа все размыто

    прежде всего на Сшарпе - все просто: десктоп значит винда, винда значит либы, либы значит Сшарп - отличаются как раз малым размером (хехе),

    потом Qt / GTK/ Tcl с их портами на куда придется и куда приестся - от PyQT (наверно, самому вмнеяемому для Питона но с хз какой лицензией - уже не слежу, что там отпустили попустили допустили, о! pyside ожил свежий!) до Tk портировнного на Go - как-то изучал дела с десктоп приложениями - сам Go с десктопом и был и плохо и остался плохо, но вот именно порты Tk там из известных продвинулись дальше всего

    ну и Delphi конечно, если программистов найдете )) нет, не умер, но, думаю, дорог в поддержке )

    если думаете с чего начинать - рекомендую PySide, мне кажется будет наименьше число разочарований и тормозов при создании желаемого
    Ответ написан
    3 комментария
  • Почему не работает перемещение в C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас полная каша в голове. Вы не понимаете, что такое перемещение, копирование.

    Вот как вы себе пердставляете перемещение int*?
    int* - это адрес в памяти. Число. Когда вы "перемещаете" img этого типа, вы перемещаете одно число. Из переменной img, в вектор.

    При этом что там лежит в памяти по адресу, равному этому числу (или на 20 сдвинутому), вообще не поменялось.

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

    Так, у вас в imgs вы не пихаете копию данных, а пихаете указатель.
    Ответ написан
    2 комментария
  • Что за тип Unit в Haskel Rust Kotlin? Чем отличается от Void?

    vabka
    @vabka Куратор тега Rust
    void означает, что функция ничего не возвращает. Такие функции не получится использовать в выражениях и их результат нельзя никуда присвоить. Из-за этого многие обобщённые вещи приходится писать по два раза: один раз для обычных функций и ещё раз для функций, которые возвращают void.
    Такие функции ещё называют процедурами.

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


    Можно ли увидеть аналог пример кода на c# java с этим типом?

    Нельзя, тк в их системе типов такого типа просто нет. Можно его имитировать при помощи пустой структуры например.
    Но в мире дотнета есть f#, а в мире жавы - скала и котлин.

    А еще, вот к примеру я придумал, почему нету(может этот тип и есть), К примеру в c# есть понятие Boxing типов при касте через object
    int a=(int)(object)1;
    Что довольно дорого и долго. С выделением памяти в куче.
    А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово? Ведь это прекрасно покроет все простые структурные типы, int char double., Enum, кортежи в 8 байт. А все остальное уже как объект.

    1. А что делать если тебе боксинг явно нужен?
    2. А где ты будешь метаданные передавать? Как в такой ситуации отличить тот же long от ссылки на объект?
    3. По спецификации передаётся ссылка, а не двойное машинное слово.

    И каким боком боксинг имеет отношение к юниту?
    Ответ написан
    3 комментария
  • Видит ли работодатель мой трафик?

    @SunTechnik
    Выключаете VPN.
    Заходите на любой сайт по определению IP ( 2ip.ru например). Записываете IP.

    Включаете VPN.
    Заходите еще раз на сайт по поределению IP. Если адрес поменялся - значит весь выходной трафик идет через VPN и, потенциально, виден работодателю.

    Анализирует ли он его и надо ли это ему- вопрос другой.
    https трафик (youtube) - зашифрован. То-есть видно что Вы ходили на youtube, но что Вы там смотрели - непонятно. (Если только у Вас не стоит какого-нибудь левого доверенного сертификата и работодатель не занимется атакой mitm .
    Ответ написан
    7 комментариев
  • Зеркала Arch linux почему то всегда выдают 404 что делать?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    перед установкой чего либо всегда желательно обновить систему(-Syu) чтобы не встречать подобных казусов о чем в принципе и написал выше в комментариях к вопросу Василий Дёмин .
    В локальной базе версия пакета, судя по выхлопу, у вас edk2-ovmf-202308-2 (модификация 2), которую pacman и пытается запросить у внешнего сервера, НО на серверах она уже другая edk2-ovmf-202308-3 (модификация 3) что можно видеть если запросить информацию с сервера по данному пакету
    pacman -Si edk2-ovmf
    или даже посмотреть на оффсайте арча edk2-ovmf

    чтобы pacman увидел новую версию нужно синхронизировать локальный репозиторий с удалённым, для этого служит команда
    pacman -Sy
    информацию по ключу можно глянуть в хелпе(-h, --help)
    pacman -Sh
    ...
      -y, --refresh        загрузить обновленные базы данных с серверов
                           (-yy принудительно обновить даже если обновленные)


    после чего pacman уже сможет скачать и установить нужный пакет с сервера, но если система давно не обновлялась то такая установка будет считаться как частичное обновление системы что для дистрибутивов с ролинг-релизом настоятельно рекомендуется этого не делать, поэтому перед установкой необходимо обновить все пакеты в системе добавив ключ -u, --sysupgrade
    в целом команда будет выглядеть так:
    pacman -Syu edk2-ovmf
    Ответ написан
    Комментировать
  • Готовая система папок?

    Stalker_RED
    @Stalker_RED
    С точки зрения вёрстки - это же просто список <ul> с иконками папок и ссылками. Вам вёрстка списка нужна?
    Со стороны бэкэнда - надо прочитать список папок и файлов в нужной директории, и отдать его в шаблонизатор. Все.
    Ответ написан
    Комментировать
  • Какой плагин который показывает, что принимает функция?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Плагин не нужен. Это функционал из коробки. В настройках в строке поиска пишем inlay hint и включаем что надо.
    Ответ написан
    8 комментариев
  • Как начать учить программированию детей начальной школы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поищите книги Scratch Programming. Там был язык какой-то и среда для детей.
    Ответ написан
    1 комментарий
  • Как получить тип первой перегрузки в typescript?

    WblCHA
    @WblCHA
    https://github.com/microsoft/TypeScript/issues/321...

    type OverloadProps<TOverload> = Pick<TOverload, keyof TOverload>;
    
    type OverloadUnionRecursive<TOverload, TPartialOverload = unknown> = TOverload extends (
      ...args: infer TArgs
    ) => infer TReturn
      ? // Prevent infinite recursion by stopping recursion when TPartialOverload
        // has accumulated all of the TOverload signatures.
        TPartialOverload extends TOverload
        ? never
        :
            | OverloadUnionRecursive<
                TPartialOverload & TOverload,
                TPartialOverload & ((...args: TArgs) => TReturn) & OverloadProps<TOverload>
              >
            | ((...args: TArgs) => TReturn)
      : never;
    
    type OverloadUnion<TOverload extends (...args: any[]) => any> = Exclude<
      OverloadUnionRecursive<
        // The "() => never" signature must be hoisted to the "front" of the
        // intersection, for two reasons: a) because recursion stops when it is
        // encountered, and b) it seems to prevent the collapse of subsequent
        // "compatible" signatures (eg. "() => void" into "(a?: 1) => void"),
        // which gives a direct conversion to a union.
        (() => never) & TOverload
      >,
      TOverload extends () => never ? never : () => never
    >;
    
    // Inferring a union of parameter tuples or return types is now possible.
    type OverloadParameters<T extends (...args: any[]) => any> = Parameters<OverloadUnion<T>>;
    type OverloadReturnType<T extends (...args: any[]) => any> = ReturnType<OverloadUnion<T>>;

    https://www.typescriptlang.org/play?ts=4.7.2#code/...
    Ответ написан
    1 комментарий