• В чем сложность поддержки проектов на Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Более четырёх лет пишу на Go, лично для меня поддерживать проекты на других языках сложнее ))
    До Go много лет писал на Perl/PHP/Python/Java/C/Ruby on rails/JavaScript и "крутил" еще не мало чего.
    Сейчас пишу только на Go и Python.

    Основная сложность в Go - это то, что если вы начинаете писать "криво" - то писать так очень трудно :))
    Подход к реализации в Go достаточно непривычный для тех, кто приходит из скриптовых языков.
    Например запрет циклических импортов - это самое первое, что "взрывает" мозг :)
    Нужно время чтобы адаптироваться после скриптовых языков.

    Про обработку ошибок - это да, это, пожалуй, единственное что мне не нравится в Go.
    Для себя я решил эту проблему за 1-2 часа :) и больше меня это не беспокоит.

    По ООП - в Go оно есть, лично мне оно нравится намного больше, чем ООП в других языках ))
    Всё, что реально нужно - всё есть, но при этом ничего лишнего нет.
    Интерфейсы - просто прекрасны :)) Каналы, горутины - это просто "счастье" :))

    А если объективно - то я бы не стал говорить о сложности поддержки проекта применимо к какому то конкретному языку.

    Как правило сложность поддержки возникает там, где нормальная архитектура не заложена в проект.
    Т.е. проект как могла так и писала куча людей плюс, как обычно, сделать нужно было побыстрее )), от этого никто вообще не думал об архитектуре и получилось то, что получилось :))
    Про покрытие тестами и документацию мы вообще не говорим )))

    А когда в таком проекте нужно что-то доработать или исправить ошибку, то почти всегда очень не просто найти то место, где нужно править, и после правок в одном месте, как правило, что-то ломается в другом :)

    Как минимум, нужно соблюдать принципы SOLID, иначе код получается, мягко говоря, не поддерживаемым.
    Но понимание этих принципов так же приходит с опытом, их нельзя научиться соблюдать просто прочитавши книгу или статью. Нужно сделать несколько проектов используя эти принципы, написать криво, понять как было бы правильно, всё переделать и так несколько раз.
    Тогда, со временем, начнёт получаться понятный и легко поддерживаемый код.

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

    Хочется добавить, что как бы не писали про Go, что он простой и т.д. - он явно сложнее Python/PHP и т.д.
    Это еще один повод сказать, что поддерживать код на Go сложно ))

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

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    https://github.com/topics/home-assistant
    посмотрите что уже есть в теме для умных домов.

    Недавно возился с такой штучкой https://aliexpress.ru/item/4000631637868.html
    Суть такая. Переключатель инициализируется именим вайфай сети и паролем к ней.
    Сам ходит в облако за командами.
    За 700 баксов в год китайцы продают ключ для приложения, чтобы можно было пользоваться облаком.
    Это для девелоперов своих систем. Простому клиенту можно скачать приложение eWelink
    Ответ написан
    Комментировать
  • Машинный код и ассемблер. Как прочитать код?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    5-й столбец - метки для перехода, 6-й столбец - мнемоники инструкций, 7-й - операнды
    Предыдущие столбцы - порядковый номер строки программы и собственно машинные коды операции

    Открываете инструкции целевого процессора (который вы не указали, кстати, как и какой именно ассемблер используется) - да интерпретируете...
    HALT -команда приостановки процессора до ожидания прерывания
    MOV - перенос данных из одного операнда в другое...
    и т.п.
    В принципе - ничего сложного
    Ответ написан
    1 комментарий
  • Как реализовать gitlab ci использую docker-compose?

    Если кратко то как то так.

    1. Образы БД брать из офф репозитория, подкидывать только файлы конфигурации если требуются через docker-compose.
    2. Образ приложения собирать либо на шаред раннерах, либо на своём раннере.
    3. Собранный образ пушить в репозиторий гитлаба.
    4. На сервере куда деплоить поставить гитлаб раннер, привязать к нему тэг.
    5. В докер композ указать в качестве имаджа репозиторий гитлаба/имяобраза:тэг
    6. В gitlab ci добавить 2 стейджа. 1 это сборка и пуш докер образов, 2 это выполнение на установленном раннере docker-compose up -d
    Ответ написан
    Комментировать
  • Нормально ли хранить роли в jwt токене?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Только надо учитывать, что если мы безоговорочно доверяем инфе из токена, то изменив роль юзера в БД мы будем получать старую роль, пока токен не протухнет.
    Ответ написан
    2 комментария
  • Дырка ли в межбанковской системе быстрых платежей (СБП)?

    SayMAN83
    @SayMAN83
    Работаю в IT
    Я участвовал во внедрении СБП для банка ВТБ. Скажу кратко, все переводы СБП проходят через систему НСПК. И она по номеру телефона ищет клиента в указанном вами банке получателя. Вероятно косяк именно там.
    Ответ написан
    3 комментария
  • Как защититься от двойного списания в многопоточном приложении?

    @sviato_slav
    Добавь в таблицу поле version.
    Делай все в транзакции (уровень не ниже - Read committed):
    1. При выборке строки из базы сохрани значение version у себя в программе.
    2. При апдейте делай так:
    Update ... set balance = balance - сумма покупки, version=version + 1 where version = сохраненное значение версии.
    3. Если запрос проходит успешно, то количество измененных строк = 1, если ничего не менялось = 0.
    Все это называется - optimistic locking
    Ответ написан
    Комментировать
  • Как можно ускорить работу Exception?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Если вас беспокоит скорость работы исключений, вы что-то делаете неправильно"

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

    Ошибка валидации при валидации - это не исключительная ситуация, а совершенно нормальная. Часть бизнес-логики. То есть в процессе валидации всего массива данных исключения кидаться не должны.
    Если исключения используются для управления ходом выполнения программы - это УЖЕ ошибка.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Трата состоит из трех этапов. Чтение баланса пользователя, проверка хватает ли средств и собственно запись нового баланса.

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

    баланс юзера расчитывается на лету и не хранится в юзере. Расчитывсется на основе истории его пополнений/расходов.

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

    Если в многопоточном приложении произойдет так что два потока прочитают баланс, проверят хватает ли средств на покупку и этот этап пройдет успешно для обоих, то далее последуют две записи, которые загонят юзера в минус. Какие есть варианты защиты от двойной траты?

    Как раз уровень изоляции. При правильно выбранном уровне хрен чего второй прочитает, пока первый не завершит свою транзакцию и не отпустит ресурсы.
    Ответ написан
    1 комментарий
  • Как вытянуть музыку из флеш приложения?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Например:
    to SWF converter/unprotector
    Как Разобрать Flash (платный)
    JPEXS Free Flash Decompiler

    Или Far Manager умеет открывать EXE, как архив (то есть можно найти ресурсы):618b93d6a4cae377627457.png
    Ответ написан
    Комментировать
  • Git и два вопроса о работе?

    DollyPapper
    @DollyPapper
    1)предложит сначала стянуть к себе ветку, если есть конфликты предложит их разрешить, потом смерджить, после этого можно пушить еще раз
    2) он значит message. То есть сообщение к коммиту
    Ответ написан
    1 комментарий
  • Как заполнить таблицу случайными данными?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Из комментария в вопросе:
    INSERT INTO sales (Product_idProduct, sale_date, price, [count])
      SELECT TOP(100) (RAND(id) * 3) + 1, 
                       DATEADD(dd, - (1000 * RAND(id)), GETDATE()), 
                       (RAND(id) * 100) + 1, (RAND(id) * 10) + 1
        FROM sysobjects
        ORDER BY id DESC
    Ответ написан
    Комментировать
  • Как систематизировать знания?

    есть ощущение, что какой-то большой пласт теоретических знаний упущен

    Это прекрасное чувство «голода» к знаниям.

    Порекомендую практику: писать (свой) проект, параллельно читая код другого «хорошего» проекта. Списывать, копировать — понимая.

    Если сталкиваетесь с невиданным явлением, термином, продуктом, паттерном — остановиться, погуглить, разобраться. Спросить.
    Ответ написан
    Комментировать
  • Где хранить данные о заказах в корзине интернет магазина до оформления заказа?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Заказ хранить однозначно в базе.
    При первом входе пользователю кидается кука. Не важно зарегистрирован или нет. И обязательно дайте какой нибудь идентификатор, который можно ввести на другом устройстве.
    В итоге получаем 4 кейса.

    1. аноним (без регистрации) - просто оформляет заказ, желательно, сохранить его данные и при последующем заказе подтянуть их что бы не заполнял снова, ну и выдать сообщение мы рады что вы вернулись. Привязка по почте, телелефону или адресу
    2. аноним (он зарегистрирован, но пока не вошел) - при оформлении нужно показать сообщение мол вы можете войти и заполнить все данные автоматом
    3. уже вошел в систему - тут просто оплата
    4. ввод номера заказа на другом устройстве, тут устанавливается кука и подтягиваются данные с сервера
    Ответ написан
    3 комментария
  • Где хранить данные о заказах в корзине интернет магазина до оформления заказа?

    profesor08
    @profesor08
    1. Если пользователь зарегистрировался и вошел в кабинет, то хранить в базе данных.
    2. Если пользователь не зарегистрирован, то хранить в localStorage или в IndexedDB, просто потому что куки и сессия может быстро протухнуть, а это очень сильно разочаровывает, когда ты накидал интересных вещей в корзину, а через некоторое время открыл сайт, а в корзине пусто.
    3. Если пользователь незарегистрированным накидал в корзину товаров, то если он зарегистрируется, то сохранить корзину в базу данных.
    Ответ написан
    1 комментарий
  • Как на лету прослушивать php://input?

    profesor08
    @profesor08 Куратор тега PHP
    Надо запускать пхп в интерактивном режиме, где он сам будет обрабатывать запросы.

    php -S 0.0.0.0:80

    <?php
    
    error_log("My Error"); // Выведет ошибку в консоль
    Ответ написан
    Комментировать
  • Как решить проблему с разными часовыми поясами пользователей?

    Aetae
    @Aetae
    Тлен
    Ну какбэ не заморачиваться.
    Хранить часовой пояс пользователя, работать по серверному UTC времени.
    Разрешить менять часовой пояс пользователю только раз в день(неделю\месяц) и только руками в настройках.
    При смене часового пояса юзера - смотреть, чтоб это не сбросило ему "стрик", сдвинув в ту или иную сторону, но не чаще/реже чем N(сверить с датой последнего пройденного) - тут уж сами смотрите, как у вас там что, но не думаю, что это будет сложнее пары if'ов.
    Ну и предупреждение юзеру мол "Внимание, при смене ЧП следующий эвент будет тогда-то".
    Ответ написан
    Комментировать
  • Должен ли WEB-разработчик уметь настраивать VPS/сервер?

    Aetae
    @Aetae
    Тлен
    Знать как работает и уметь боль-мене понять конфиг того же nginx - да. Без этого часто может быть грустно. Даже если именно настраивать не придётся ни разу.

    Уметь именно правильно настраивать - нет. Это задача админа(девопса). Там на самом деле тонкостей и сложностей очень и очень много. На отдельную должность, ага, и не одну.
    Ответ написан
    3 комментария
  • Должен ли WEB-разработчик уметь настраивать VPS/сервер?

    Adamos
    @Adamos
    Вопрос "должен ли" - всегда идиотский. Никто никому ничего не должен. В частности, нанимать и платить.
    Если вы такой крутой фронтендер, что вас ценят именно на этом фронте настолько, чтобы работодателю было жалко тратить ваше ценное время на настройки, он лучше наймет девопса - скорее всего, вам это все не понадобится.
    Но как можно стать крутым специалистом, вообще не интересуясь настолько смежными областями? Я не знаю.
    Вы такими сомнениями и прикидками сами себе ограничиваете рост статусом веб-макаки, которую можно только посадить в опенспейс на узкоспециализированную работу и до настройки серверов просто не допускать. Зато - "не должен", да...
    Ответ написан
    3 комментария
  • Как в vue router менять на ходу get параметры?

    @AndromedaStar
    .Net - monkey
    router.push({ path: 'blablabla', query: { p: 'pValue' }})
    Ответ написан
    Комментировать