Задать вопрос
  • Какие есть нормальные библиотеки для gui?

    gscraft
    @gscraft
    Программист, философ
    Языков с нативными (родными для языка, поддерживаемыми крупной компанией и/или авторами среды языка и/или ОС) UI-библиотеками мало. Неслучайно прошел бум Electron, Cordova, React Native, что и сейчас в ходу, наряду с перспективными Flutter и MAUI. До сих пор жив Qt, что долгое время был практически безальтернативен по ряду причин, прижившись на многих языках (в том числе несколько проектов для Go). Хорошо обстоит дело со своими UI на C/C++, C#, Java , где немало достойных решений, например, Compose, Avalonia или старожилы wxWidgets, GTK2+ и тот же Qt. Большая часть библиотек для других языков являются мостами, слоями для C/С++ библиотек. Для Go так же существуют прослойки, а «нативных» (на самом деле тоже слоев) решений для языка ничтожно мало и они любительские, едва ли подходящие для серьезных решений — разве что для каких-то своих узких задач. Решением остается прямой вызов инструментария ОС, вроде Win32 API, что едва популярно в наше время.

    https://github.com/go-graphics/go-gui-projects — есть сайты-сборники, где перечисляются многие библиотеки. Но придется изучать:
    • Имеющийся функционал, стабильность и удобство
    • Качество поддержки среды, есть ли обновления и перспективы
    • Наличие документации и сообщества


    — на что может уйти прорва времени на фоне решений на других языках. На мой взгляд, на сегодня, для UI одним из лучших вариантом будет C# , тем более если нужна кроссплатформенность. Хорошим выбором будут Electron / JS, Python / PySide, тем более если нужен быстрый прототип. Go — вряд ли, лично я ничего не нашел, свыше прослоек, но зачем тогда Go и трудности слабого сопровождения этих проектов? И да, в ряде случаев локальный сервер с HTML / JS — хорошее решение.
    Ответ написан
  • Щелчки/хлопки при перемотке/остановке звука. Как решить?

    gscraft
    @gscraft
    Программист, философ
    Столкнулся с подобным с двумя звуковыми устройствами, думаю дело в аппаратном отключении-включении устройства и особенностях питания-USB. Когда начинает поступать звук, устройство физически включается, и наоборот, выключается при исчезновении звука. Не знаю, возможно ли это настроить для карт Creative.
    Ответ написан
    Комментировать
  • Возможно ли из докера Ubuntu получить GUI проприетарного ПО?

    gscraft
    @gscraft
    Программист, философ
    Теоретически возможно, но это будет страшное колдунство. Нужно будет развернуть внутри контейнера X-сервер, предоставив ему доступ к оборудованию хоста, а затем подключиться к нему через VNC, например. Что осложняется наличием Windows-хоста, где запуск графических приложений в WLS2 может оказаться нетривиальной задачей. Готового рецепта Вам никто не даст, его не существует, хотя можно найти гайды по запуску графических приложений в Docker вообще, что не факт — подойдет ли решение Вам.

    Рационально найти другое решение. Не совсем понятно, причем тут веб-версия, если речь о файловой базе данных? Браузер может с ней работать? А если возможно использовать клиент, который подключается к серверу, зачем клиент помещать внутрь контейнера, если там можно расположить только сервер? Плюс, непонятно, что за изоляцию пытаетесь решить, тем более если речь о файловой базе. Контейнеры — неподходящий вариант для хранения файлов. Наоборот, есть смысл создавать тома, вынесенные за пределы контейнера, даже для серверных баз. А если том вынесен из контейнера, что изолирует контейнер?
    Ответ написан
    2 комментария
  • Безопасно ли использовать АПИ ключ гугла в исходниках?

    gscraft
    @gscraft
    Программист, философ
    Во-первых, Вы не скроете ничего, что передается с клиентской стороны, где бы оно ни хранилось. Такие ключи как правило публичны и не имеют риска хищения. Скажем, привязаны к домену, а для приватных операций требуют отдельной аутентификации/авторизации. Во-вторых, хранить какие-либо настройки в исходном коде в любом случае плохая идея. Все изменяемые значения должны быть вынесены в конфигурационный файл. Поскольку код должен быть распространяемым (отправляться в версии, применяться в других проектах, использоваться в иных условиях и т.д.). Если у Вас нет сборщика и не хотите усложнять кодовую базу, то как минимум в отдельный, подключаемый JS-файл.

    PS Еще один момент, если речь о ключе, который получается в результате аутентификации в Google, то приложение должно позволять локальный логин пользователя, нельзя привязывать приложение к аутентификации глобально. В редких случаях при такой необходимости нужно создавать мост для серверной части, которой делегировать любые операции с закрытой частью API.
    Ответ написан
    Комментировать
  • Как заставить Windows увидеть сеть из WSL2 в режиме host?

    gscraft
    @gscraft Автор вопроса
    Программист, философ
    Эта задача не имеет адекватного решения. Docker для Windows имеет особую реализацию, собственную сеть, и режим хоста означает, что приложение будет работать не в сети WSL2 / Windows, а в сети самого Docker. Тогда как открытие портов создает туннели для сетей WSL2 и Windows. Единственный способ заставить это работать, это каждый раз при запуске контейнеров вручную делать туннель, что едва ли просто сделать, поскольку, опять-таки, согласно документации "This interface is actually within the virtual machine".
    Ответ написан
    Комментировать
  • ПК зависает до полного обесточивания, что это может быть, БП или плата?

    gscraft
    @gscraft Автор вопроса
    Программист, философ
    Вопрос можно удалить, он будет висеть мертвым грузом без ответа. Плата была заменена, плата была нестабильна при многих испробованных настройках. С новой платой (другой модели и другого производителя) и с тем же прочим железом никаких проблем нет.
    Ответ написан
    Комментировать
  • Как сохранить значение в селекте?

    gscraft
    @gscraft
    Программист, философ
    Можно предположить, что пользуетесь маршрутизатором, раз речь о переходе на другую страницу. Состояние компонентов при переходе сбрасывается, т.е. все вложенные в router-outlet компоненты инициализируются заново. Было бы сложнее и хуже, будь иначе. У Вас два пути. Во-первых, сохранить состояние компонента тем или иным образом. Во-вторых, пересмотреть подход к архитектуре приложения.

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

    По моему опыту, усложнять не стоит. Постарайтесь сделать так, чтобы страница отвечала за набор данных и при переходе состояние сохранялось как состояние страницы, т.е., чтобы при нажатии F5 данные были восстановлены (и утеряны, если пользователь их не сохранил). Воспринимайте состояние страницы как такое состояние, которое должно быть возобновлено после закрытия браузера / приложения. Если несколько разделов отвечают за связанный набор данных, то данные должны храниться в родительском компоненте, а переключение компонент не должно быть переходом между страницами.
    Ответ написан
    1 комментарий
  • Как переместить значение из функции ниже по коду, сделать глобальным в js?

    gscraft
    @gscraft
    Программист, философ
    Это удивительный вопрос! Обычно наоборот, начинающие пытаются понять, почему переменная доступна вне функции.
    var a = 0; // переменная, объявленная снаружи, всегда доступна вглубь
    function foo () {
      b = 1; // b объявлена как window.b и доступна везде
      var c = 2; // переменная доступна внутри функции
      let d = 3; // переменная доступна внутри блока { }, где объявлена
    }
    // a == 0
    // b == 1
    // c == undefined
    // d == undefined

    А вообще, читайте документацию, mdn, например.

    PS Не используйте глобальные переменные. Лучше найти другое решение, связать классы, функции в единую среду выполнения.
    Ответ написан
    Комментировать
  • Как исправить ошибки возникающие при поднятии/установке сайта с помощью Docker?

    gscraft
    @gscraft
    Программист, философ
    Вы собираете решение на основе некого полу-любительского Docker-образа. По ссылке на github видно, что автор(ы) репозитория страдает некой манией велосипедных дел, и создал свои контейнеры на все про всё, и при этом давно их не обновляет. Если хотите решение на базе Docker, то стоит быть готовым к тому, что такое решение нужно сопровождать, т.к. сторонние нестабильны. Поэтому желательно разобраться в базовых образах nginx / php / базы данных, чтобы завести это все вручную и самостоятельно, с уверенным пониманием процесса. В официальных хабах есть все необходимые инструкции: как устанавливать пакеты, как задать стартовые настройки через окружение или шаблонные значения. Это займет время, конечно, день-два, но окупится как в данном проекте, так и в дальнейшем. Эти контейнеры систематически обновляются и имеют лучшую совместимость, в противоположность случаю, когда что-то отваливается у авторов 10+ контейнеров, неспособных их сопровождать (в чем проблема и сейчас: не хватает расширения, автор не предусмотрел / забросил, подложив проблему своим пользователям). В Вашей ситуации нужно также ознакомиться со списком требований Drupal, и развернуть требуемый Dockerfile для PHP (через Alpine и встроенную систему установки расширений или Debian / ppa)
    Ответ написан
    1 комментарий
  • Как запустить скрипт для нескольких пользователей одновременно?

    gscraft
    @gscraft
    Программист, философ
    Если правильно понял Вашу проблему, то никаких дополнительных усилий прилагать не нужно, данные каждого пользователя будут заполняться параллельно друг другу. Если, конечно, у Вас нет проблем с конфигурацией базы данных, с многопоточной работой серверного приложения и с однопоточным подключением в приложении, например. В остальном, вся сеть так работает: пользователи инициируют работу тех или иных хранилищ, те в свою очередь спокойно параллельно пишут данные. Сложнее решить как раз обратное: исключить одновременную перезапись связанных данных или не выполнять одну работу многократно. Если Вы как раз эту проблему хотите решить, чтобы многие пользователи имели доступ к одному ресурсу данных, используйте блокировки, транзакции. Ну или переосмысляйте архитектуру приложения / структуру данных. Без подробностей вряд ли что-то еще можно посоветовать.
    Ответ написан
    5 комментариев
  • Как обновить значение в массиве Mongodb?

    gscraft
    @gscraft
    Программист, философ
    https://docs.mongodb.com/drivers/node/fundamentals... — есть доходчивый пример, нужно запросить искомый элемент { "answers.username": "username" } (искомый элемент массива должен идентифицироваться однозначно, разумеется), но в отличие от примера использовать инкремент https://docs.mongodb.com/manual/reference/operator...$set: { $inc: { likes: 1 } }
    Ответ написан
    Комментировать
  • Как вывести список с фигурными скобками?

    gscraft
    @gscraft
    Программист, философ
    Вас непросто понять. Почему нужен вывод фигурными скобками? set — не функция, а класс, попробуйте вывести type(set). Когда Вы вызываете s = set() — создаете экземпляр класса набора данных, с помощью set(list()) — конвертируете список в множество. Если задание подразумевает создание типа данных, аналогичного set уникальностью значений, то оно несколько сложнее, чем то, что делаете Вы, и фигурные скобки здесь не причем. Вам нужно реализовать класс с методами, добавляющими значения с проверкой на уникальность. Причем, делается это разными способами, можно, например:
    class MySet(object):
      def __init__(self):
        self.items = list()
    
      def add(self, item):
        try:
           self.items.index(item)
           self.items.append(item)
        except ValueError as e:
           pass
    Ответ написан
  • Почему не работает innerHTML?

    gscraft
    @gscraft
    Программист, философ
    Полагаю, библиотека JSDOM не меняет исходный файл. Вам нужно получить HTML после изменения элемента и передать этот HTML как ответ. Например,

    function getCards() {
      // ... некий код
      return dom.window.document.innerHTML;
    }
    // в обработчике маршрута:
      const html = getCards();
      res.send(html);
    Ответ написан
    6 комментариев
  • Как вырезать слово из строки?

    gscraft
    @gscraft
    Программист, философ
    <?php
    $string = 'Нажми кнопку и получи @приз, чтобы принять участие';
    $matches = [];
    if (preg_match('/@[а-я]+/ui', $string, $matches)) {
      $word = $matches[0];
      echo $word, PHP_EOL;
    }
    Ответ написан
    Комментировать
  • Нарушают ли конструкторы инкапсуляцию?

    gscraft
    @gscraft
    Программист, философ
    Это почему сеттеры нарушают инкапсуляцию? Вовсе нет. Контроль сохраняется за внутренней логикой класса. И в отношении конструкторов, получается, странным образом интерпретируете инкапсуляцию. Логика ООП практически потеряет смысл, если нельзя будет настраивать поведение объектов. Каким образом с чем-либо взаимодействовать, если нет значений, которые можно передать объекту?

    Самая банальная проблема, которую решает инкапсуляция, это нарушение работы объекта и непредсказуемость последствий при прямом обращении к свойствам объекта. Например, у нас есть класс, реализующий работу с файлом, и одним из его свойств является дескриптор открытого файла. Если открыть файл, а затем обнулить или заменить дескриптор, то объект потеряет контроль над открытым ранее файлом. Понятно, что это свойство должно быть целиком закрыто и лишено внешнего доступа. Но объект может инициализироваться с путем файла, и путь к файлу может быть так же сеттером, и при изменении пути файла пользователем можно корректно среагировать, от исключения до закрытия ранее открытого файла. Это двоякое свойство, которое логично сохранить, скажем, только для конструктора — объекту необходимо установить это свойство, и объект прямо ассоциируется с путем, ему переданным, цикл жизни будет связан с конкретным файлом. Могут быть и иные опции, например, размер буфера, который можно позволить менять в реальном времени, перенастраивая некоторые параметры работы с файлом в логике сеттера и т.д..

    То есть, смысл инкапсуляции — это возможность реализации конкретной логики с распределением закрытости свойств. В одних случаях уместно закрыть доступ целиком, чтобы не нарушать базовое поведение объекта, когда разумно оставить установку значений только через конструктор, скажем, если цикл жизни объекта это некий конечный процесс, и может быть уместно запретить изменение этого поведения для дочерних классов, в других — допустимо менять свойства динамически, сеттерами, но оставляя обработку изменения за логикой класса.
    Ответ написан
    Комментировать
  • Как оптимизировать запись в файл .xls?

    gscraft
    @gscraft
    Программист, философ
    И Excel спокойно поглощает такое количество строк? Там вроде около миллиона строк, но Excel не предназначен для этого, если массив данных очень большой, то работать с ним лучше через СУБД.

    Способов оптимизации много, но универсальных путей не так много, не зная бизнес-требований, структуры данных сложно сказать точнее. Из общего. Во-первых, да, брать данные порциями, например, по 10к или 50к строк. Во-вторых, не брать данные повторно, кэшировать (вряд ли у Вас меняются все данные каждый раз), сохраняя срезы Excel или денормализацией. В-третьих, оптимизировать структуру данных и / или запросы. В этом плане Doctrine или другой движок едва ли играют роль, тем более Вы используете конструктор запросов. В-четвертых, если память грузит запись в Excel, можно отказаться от движка (опять же, неизвестно, используете ли такой?), писать вручную в XML-шаблон, упаковывая в Excel опять же руками.
    Ответ написан
    8 комментариев
  • Как перезаписать значение в файле json?

    gscraft
    @gscraft
    Программист, философ
    А в чем проблема? Разберитесь, как работать с JSON в C#, т.е. 1) распарсить в объект 2) изменить значение 3) записать обратно в JSON. https://docs.microsoft.com/ru-ru/dotnet/standard/s... или https://www.newtonsoft.com/json
    Ответ написан
    Комментировать
  • Целесообразно ли логирование выносить в отдельную базу?

    gscraft
    @gscraft
    Программист, философ
    А в чем загвоздка? Проблем с этим нет, если журналы грузят базу, то используйте отдельную. И даже не классическую базу, а MongoDB, например, или иные инструменты.

    PS Ну а снятие копий, почему не исключить таблицы при выборке? Плюс, есть другие решения для разработчика, например, наборы тестовых данных (у Laravel есть соответствующий инструмент).
    Ответ написан
    2 комментария
  • Цикл проходит несколько раз, где ошибка?

    gscraft
    @gscraft
    Программист, философ
    Судя по Вашему JSON, полученному от сервиса, Вам не нужны два цикла foreach, второй — лишний, его можно просто удалить.
    Ответ написан
    2 комментария
  • В чем практический смысл использования интерфейсов в PHP?

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

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

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

    В-третьих, продуманный интерфейс позволяет в большей степени создавать взаимозаменяемые реализации — конечные классы. Тот, кто использует интерфейс при разработке класса обязан разработать все обязательства интерфейса.

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

    Проектирование приложения на базе интерфейсов — полезная практика, хотя и не необходимая. Если пишется небольшое приложение и есть точная уверенность, что оно не будет дальше расширяться и меняться или если не предполагается командная работа, то интерфейсами можно пренебречь. Если приложение масштабно, будет разрабатываться и сопровождаться несколькими специалистами или предполагается его дальнейшее развитие — интерфейсы являются буквально необходимостью.

    Добавлю, к слову, о внедрении зависимостей. Действительно, этот подход может использоваться и без интерфейсов, тот факт, что инверсия управления и внедрение зависимостей используются чаще всего с интерфейсами — своего рода совпадение. Хороший пример: фреймворк Yii 2 или библиотека Pimple, там в качестве маркеров для внедрения зависимостей часто используются произвольные (или основанные на иных соглашениях) строки. Это к тому, что DI — необязательно самый яркий пример использования интерфейсов (хотя и более ценный, чем другие варианты).
    Ответ написан
    Комментировать