• Где посмотреть и поучиться правильной постройки баз данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Тут всё просто. Про Mongo надо просто забыть. Это вообще не база данных, а бессмысленное хранилище по типу "куча мусора", которое используется исключительно в стильных модных молодёжных стартупах, в которых не нашлось ни одного специалиста по базам данных. Это была тупиковая ветвь, поднявшаяся на отсутствовавшей на тот момент поддержке JSON в базах данных и хайпе.

    И вообще не надо называть "нереляционные хранилища" базами данных. Это специализированные движки - кэширующие(редис, мемкеш), поисковые(мантикора, эластик), аналитические (кликхаус) - которые используются в дополнение к базе данных. или совсем уж какие-то специализированные решения для визуализации или логирования- графана, сентри, кибана, локи - тысячи их. Но все это вещи факультативные, которые понадобятся только на определенном этапе развития проекта (или не понадобятся вовсе).

    А с базой данных и её построением придется столкнуться с самого начала. И вот про это есть великолепная книга Святослава Куликова Реляционные базы данных в примерах. Она очень четко рассказывает именно про постройку базы данных.
    Ответ написан
    2 комментария
  • Как Кинопоиск делает черный квадрат в захвате экрана?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Есть ооочень хороший метод показывать козу таким ... нехорошим козлам :)

    Ставится VB и приложение записи экрана
    В VB ставится винда
    В винде, которая в VB, ставится хром и идется на сайт и запускается просмотр.
    В хостовой системе запускается запись экрана или делается скрин

    ПРОФИТ!
    Ответ написан
    7 комментариев
  • С помощью каких фреймоворков создают мобильные приложения на Java?

    vabka
    @vabka
    Токсичный шарпист
    Десктопные - при помощи какого-нибудь Swing.
    Мобильные - при помощи Android SDK и того что идёт с ним (под ios не выйдет, ибо инструментов соответствующих нет)
    Но вообще я бы лучше посмотрел в сторону Kotlin, так как у него в этом плане экосистема лучше (Compose)
    Ответ написан
    3 комментария
  • Как внутри устроена HashMap, она использует singly linked list или BTS?

    @temp_temp
    Бакеты хранят внутри себя ноды в форме односвязного списка, но как только количество нод достигает 8 (константа TREEIFY_THRESHOLD = 8) и количество бакетов достигает 64 (константа MIN_TREEIFY_CAPACITY = 64), произойдет переход к древовидной структуре в этом бакете. Но возможен и обратный переход из древовидной структуры в односвязный список. Это происходит, когда количество нод в этом бакете сокращается до 6 (константа UNTREEIFY_THRESHOLD = 6), например при увеличении ёмкости хэш-таблицы (количеста бакетов). В этот момент происходит перехеширование всех элементов. Но есть ещё один интересный момент. Допустим вы переопределили хэшкод, чтобы тот возвращал одно и то же значение. И как не трудно догадаться все элементы будут попадать в один бакет. Изначально 16 бакетов, если добавить 9 нод и все они попадут в один бакет, то мапа расширится до 32, если не произойдет распределение, то при добавлении 10 ноды - расширится до 64. И вот если снова не произошло распределения и 11 ноду добавить в тот же бакет, то этот бакет перестроится в дерево.
    Ответ написан
    Комментировать
  • Где будет правильно расположить методы конвертации дто -> ентити и наоборот?

    Jacen11
    @Jacen11
    ты походу не догоняешь что такое дто и ентити. Умные западные чуваки энтити называют бизнесовую сущность со всякими бизнесовыми методами. Но из за аннотации в спринге такие как ты думают что это просто моделька для бд. Нет. А дто это просто модель данных без методов и этот объект нужен только для передачи данных в др место.
    методы конвертации

    это называется маперы, и да, в джаве проще использовать либы для этого и это не только мапстракт. И ничего там не сложно
    под маперы можно сделать пакет рядом с репой, репа должна уже модели возвращать. Никто кроме репы про дто не должны знать
    Ответ написан
    4 комментария
  • Насколько востребован MS Access?

    Adamos
    @Adamos
    Очень много учебных заведений учит проектировать информационные системы на базе MS Access.

    Это прекрасный маркер, что учебное заведение двадцать лет не обновляло учебный план и НИЧЕМУ в IT научить просто физически не может.
    Изучение этих резных костылей из копролита сейчас может только привить дурные привычки и создать неверное представление о том, как в современном мире решаются типовые задачи.
    Ответ написан
    Комментировать
  • Создать несколько таблиц или попробовать унифицировать?

    Melkij
    @Melkij
    PostgreSQL DBA
    json поле.
    Данные авторизации нужны только конкретному коду, работающему с этой авторизацией. Искать по токену авторизации, какому же сервису API принадлежит этот токен вы ведь не будете всё равно. (хотя и так можно будет при желании и достаточно современной СУБД)

    но в таком случае, скорее всего, понадобиться таблица с именами провайдеров

    А она у вас всё равно есть или будет.
    Хоть вы сами работаете с API и к каждому сервису максимум один комплект данных авторизации (таблица, где будут ключи храниться и будет такой таблицей с именами провайдеров). Хоть вы даёте своим пользователям возможность добавить API себе - тогда у вас будет табличка user_id, api_provider_id, credentials
    Ответ написан
    1 комментарий
  • Как лучше сократить код return на Java?

    @koperagen
    Условие "две стороны параллельны, другие две - нет" похоже на оператор xor
    Для него таблица истинности
    1 1 -> 0
    1 0 -> 1
    0 1 -> 1
    0 0 -> 0
    Т.е. можно записать так
    isSidesParallel(sideAb, sideCd) ^ isSidesParallel(sideBc, sideDa)
    (^ - это xor в джаве)
    Ответ написан
    2 комментария
  • Какой одноплатник выбрать для шлюза?

    @Tabletko
    никого не трогаю, починяю примус
    Любая itx материнка с впаяным процессором и четырёх портовая сетевая карточка. Wifi лучше отдельно делать, а не на линуксе.
    Ответ написан
    4 комментария
  • Как написать язык программирования?

    Griboks
    @Griboks
    Развёрнутый ответ займет многобуков, поэтому кратко...
    Языки бывают двух типов: компилируемые и интерпретируемые.

    Сложность создания первых заключается в трансляции высокоуровневый абстракции в низкоуровневый код (+управление памятью и прочие сложные вещи). Самый простой подход - придумать свой синтаксис, который переводить в какой-нибудь C++ или C#, а затем использовать стандартные средства языка для компиляции.

    Но я рекомендую вам сделать интерпретируемый язык (с постставкой Script). В таком случаем вы можете просто последовательно обрабатывать команды типа if cmd='add' then return a+b

    А если вы не хотите разбираться во всем этом, то лучше использовать генератор парсеров/компиляторов. Затем написать на своём языке компилятор своего языка (bootstrapping), чтобы получить независимый компилятор.

    P. S.
    Ваш вопрос про ассемблер не понятен. Вы хотите написать парсер и компилятор на ассемблер или же хотите, транслировать ваш язык в ассемблер? Или интерпретатор на ассемблере? Чем ниже уровень, тем больше вариантов.
    Ответ написан
    4 комментария
  • Java vs C# - что будет правильнее выбрать для написания учебника для школьников?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    DeviJoe, Нет смысла в школе учить что-то сложнее питона.
    Детям нужен быстрый результат, а не объектно-ориентированное.

    Учебник по джава и сам джава осилит меньше 10% в классе, единственное исключение - специализированная школа для разработчиков, где на программирование выделено как минимум 4-5 часов в неделю.
    Ответ написан
    Комментировать
  • Как реализуются интерфеинтерфесы в Java?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Видимо не достаточно понимаете =)
    Когда вы имплементируете интерфейс, к примеру Runnable, то вы реализуете метод run(). Вы его не переопределяете а реализуете, это не одно и тоже с переопределением. В JAVA есть класс Thread в котором объявлено что он знает интерфейс Runnable(вполне конкретный) и что в нем совершенно точно есть реализация метода run(), других методов которые не объявлены в интерфейсе не знает.
    Например если вы создатите свой интерфейс:
    interface MyRunnable{
          void run(); 
    }

    То класс Thread никак не будет знать что это и что с ним делать и пошлет вас в веселую пешую прогулку.
    Даже если вы создатите "однофамильца":
    interface Runnable{
          void run(); 
    }

    То класс Thread никак не будет знать что это и что с ним делать и пошлет вас в веселую пешую прогулку. Потому что это не реализация java.lang.runnable.
    Зато такой момент сработает:
    interface MyRunnable extends Runnable{
          void some(); //Обратите внимание что тут уже run нельзя объявить т.к. он объявлен в  Runnable
    }

    и при реализации этого интерфейса вас заставят реализовывать уже 2 метода
    class CoolRunnable implements MyRunnable{
          void some(){System.out.print("some from MyRunnable")} 
          void run(){System.out.print("run from Runnable")} 
    }

    И в этом случае класс Thread увидит что класс CoolRunnable реализует интерфейс Runnable в котором есть метод run() о котором он знает и который ему нужен. Метод some() он не увидит. При запуске соответственно он выведет только "run from Runnable".

    Если попробовать на пальцах объяснить так сказать по аналогии с чемто. Скажем вы класс который может нажимать на левую кнопку мыши. Ничего другого вам не объясняли. Т.е. вам дали описание что это называется мышь и на котором есть кнопка слева и которую нужно нажать. Теперь любой производитель берет это описание и реализует мышь с левой кнопкой. Каждый свою, из разного материала, с разными механизмами кнопки и принципами работы, разной формы, и даже с кучей других кнопок. Все они попадают к вам, вы смотрите что конкретный экземпляр мыши реализован по описание которое вы знаете, кроме того это именно то описание что у вас а не одноименное. На основе этого вы признаете что эта вещь вам подходит и начинаете нажимать левую кнопку мыши на любой такой мышке которую вам дадут. Если же приходит другой предмет то вы ломаете палец, потом руку и умираете от потери крови с криками что это не по описанию что у вас есть.
    Ответ написан
    Комментировать
  • На чём лучше сделать СКУД?

    gbg
    @gbg
    Любые ответы на любые вопросы
    0) Во "взрослой" промышленности применение разного рода макетов-малинок экономически не оправданно. Главная причина - у них не промышленное исполнение. Они не защищены от ЭМИ, от статического электричества, от иголок по питанию, от грозы. Это все придется добавлять сверху - иначе вашу хваленую БИЗОПАСНОСТЬ можно будет поломать вспышкой от фотика.

    1) МНОГО запросов - понятие сильно растяжимое. Эту задачу нужно решать на самом раннем этапе разработки архитектуры, однако, для этого нужен опыт. Поэтому, на этапе обучения, от этой задачи можно отказаться. Поверьте, инсталляции постгреса с дефолтными настройками (кроме одной) хватает на обслуживание 200-500 одновременных соединений. которые валят запросы каждую секунду. Как по вашему, это "много"?

    2)На этапе изучения, пока опыта нет, проще всего взять то, что знаете лучше всего.

    3) Скорость работы + работа с железом. Что-то я слышал такое про C++. Однако, если вы его не знаете, вы просто добавите себе проблем.

    Вывод - такая система будет вам по зубам, при условии, что вы знаете, как сделать каждую ее часть в отдельности. Вот вы делали хотя бы простой замок, открываемый через интернетик? SSL к нему привязывали? Двухфакторную авторизацию? fail2ban?

    Задачи, которые вы себе ставите, умещаются в нескольких разрабов, и то с трудом - тут и фронт, и бэк, и devops, раз про нагрузки речь пошла, и разработка железа.
    Ответ написан
    Комментировать
  • Как работает websocket на низком уровне?

    bingo347
    @bingo347
    Crazy on performance...
    Вопрос 1
    Браузер инициирует новое tcp соединение на тот же 80 порт сервера или бывают случаи что на другой ?
    WebSocket работает не поверх голого tcp, а поверх http (а тот уже поверх tcp или tls -> tcp). 80 порт стандартный для http, а 443 - для https (http поверх tls). WebSocket по умолчанию использует те же 80 и 443 порты для ws и wss протоколов соответственно. Но никто не мешает использовать кастомный порт. Конкретные порты для конкретных протоколов - это не более соглашения. Порты работают на IP уровне, который ничего не знает о прикладном уровне.

    Вопрос 2
    Что сервер делает с ws пакетами - проксирует их к СП как есть в обертке, или же обертку раскрывает и передает "чистые/сырые" данные далее ?
    Если речь идет о nginx как о реверси прокси, то для него это обычный http запрос, просто клиент очень долго шлет тело запроса, а сервер тело ответа (главное таймауты тут выключить). Так как http в принципе не запрещает серверу начать слать ответ не закончив чтение запроса, все вполне прекрасно работает.

    Вопрос 3
    Как сервер отличает ws от http - по некой сигнатуре - типа по последовательности первых пришедших байт, по которым можно распознать что это именно ws а не http ?
    По http заголовкам. В частности клиент шлет заголовок upgrade в котором говорит, что хочет WebSocket и еще несколько специфичных для WebSocket заголовков, а сервер отвечает статусом 101 и своим набором заголовков. Это и есть WebSocket рукопожатие. Само общение происходит уже в теле запроса и теле ответа.

    Вопрос 4
    Как эти данные передаются в сторону СП - через переменные окружения, или через unix-socket или через tcp стек?
    Если используя последние два варианта, то получается что сервер держит внутри системы соединения с СП до тех пор пока "наружное" tcp соединение между клиентом и сервером не буде закрыто?
    На уровне tcp вообще пофиг сколько времени открыто соединение, какая из сторон в какой последовательности и сколько данных отправляет. Тут лишь то, что клиент может попробовать открыть соединение, сервер его может принять (или отклонить), а после любая из сторон может слать данные другой или закрыть соединение. Ну и плюс есть гарантии, что потерянные данные будут отправлены повторно и порядок получения совпадет с порядком отправки. На уровне http у нас обычный запрос-ответ, просто клиент слишком долго шлет тело запроса, а сервер - тело ответа. На уровне WebSocket у нас в обе стороны ходят MessageFrame'ы, содержащие данные + метаданные и имеющие четкие границы.

    Вопрос 5
    В свою очередь СП это отдельный unix процесс отличный от основного бекенд приложения, которое работает по принципу "спросили - запустился - обработал - сформировал ответ - отправил - завершился" Или же это все то же бекенд приложение только в том случае если с ним установлено ws-соединение, оно не прекращает свою работу?
    Как реализуете, так и будет. Но одно можно сказать точно, соединение должно быть открытым на протяжении всего сеанса обмена сообщениями.
    Важно еще понимать, что в контексте WebSocket нет понятий запрос и ответ (хотя их могут реализовывать нижележащие протоколы), есть лишь понятие сообщение. Каждая из сторон, пока открыто соединение, может в любой момент времени отправлять любое количество сообщений.

    P.S. если обе стороны (и клиент и сервер) не ограничены только http протоколом для общения через tcp (как например это происходит у браузерных приложений), то WebSocket будет лишней нагрузкой как на сеть, так и на вычисления. Лучше взять какой-нибудь бинарный сериализатор, с четкими границами (msgpack, flatbuffer) и гонять данные по raw tcp или tls.
    Ответ написан
    2 комментария
  • Правильно ли выбрасывать исключения в бизнес логике?

    php666
    @php666
    PHP-макака
    Нет, это плохая практика.

    Исключительная ситуация на то и исключительная. Это ошибка запроса, нет коннекта к БД или отсутствие записи, которая, как мы уверены, должна существовать и тд. Это событие, после которого работа кода НЕВОЗМОЖНА.

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

    @granty
    Время интернет-магазинов прошло?
    Спросите у Амазона, Алиэскпресса, Ебея, или Озона. На "тлетворном западе" вообще всё продаётся через интернет магазины, включая повседневную еду. Каждая сеть супермаркетов имеет свой интернет-магазин.

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

    Бизнес поигрался в эти интернет-магазинчики, и быстро понял, что без нормально работающего законодательства и доставки, всё это не работает.
    Ответ написан
  • Как решить проблему?

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Контейнер карт: leaflet.js
    Остальное - не важно.
    Ответ написан
    Комментировать
  • Как сделать автоудаление информации из БД в веб-рриложении на Java?

    @anikavoi
    А еще можно навесить на таблицу триггер :)
    Ответ написан
    Комментировать
  • В каких случаях, можно опустить скобки в конструкции if и будет ли это правильно?

    @Woldan
    По конвенции скобки должны быть всегда:

    Note:if statements always use braces {}. Avoid the following error-prone form:

    if (condition) //AVOID! THIS OMITS THE BRACES {}!statement;


    proof: https://www.oracle.com/technetwork/java/codeconven...

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