• Как ведут себя данные при удалении?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В реляционных БД не существует гарантий относительно порядка записей внутри таблицы. Этот порядок
    - это особенности технической реализации хранения данных внутри блоков и сегментов. Это - "know how"
    и это будет зависеть от типа DBMS (Postgres, MySQL, Oracle) и от типа таблицы (heap, index-organized, clustered e.t.c)

    Если говорить грубо, то записи (data-rows) лежат не плотно а вразнобой с пробелами с выравниванием
    к блокам. Ну тоесть вообще-вообще не так как в Excel. Удаление data-rows в Postgres насколько я помню
    физически не удаляет запись а помечает ее мертвой используя служебные поля. Впоследствии VACUUM
    делает работы по уплотнению.

    Поэтому порядок ты сам обеспечиваешь, делая запрос с опцией ORDER BY some_date_time.
    Ответ написан
    1 комментарий
  • Python в запущенный в контейнере работает медленнее натива?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Разница в бинарях - Python на хостовой машине собран без отладочной информации, а тот, который в образе python:3.10.4 собран с нею.

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

    Можно пойти дальше и собрать Python из исходников самому, но самостоятельная сборка это такое себе развлечение (хотя с помощью pyenv делать это довольно просто), а выигрыш не такой уж и значительный - устанавливать бинарные пакеты сильно проще.

    PS
    Никогда не используй образы Alpine - там вместо glibc суррогат под названием musl. В прочем для статически слинкованных бинарей на Go использовать можно, но тогда уж выгоднее использовать scratch
    Ответ написан
    5 комментариев
  • Как возвращать ошибки в REST API?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ответ написан
    Комментировать
  • Как из MVP сделать библиотеку?

    Nipheris
    @Nipheris Куратор тега C++
    Вот подводные.
    Если коротко, то вам надо:
    • решить, как доставлять пользователю ВАШИ зависимости (в целом варианта три: на уровне исходного кода, на уровне инструкции для пользователя, или использовать пакетный менеджер);
    • решить, как пользователь будет собирать библиотеку и получать себе необходимые настройки сборки (например, многие проекты, которые сами используют CMake, автоматически генерят так называемые CMake-конфиги, чтобы потом библиотеку можно было легко подключить с помощью find_package);
    • настроить правильный API для своей библиотеки, в частности аккуратно выставить публичные хедеры, чтобы был свой так называемый "header namespace" и прочие штуки;

    Т.к. я кинул вам уже целых две книги (неплохие, хорошо пригождаются в работе), то вы понимаете, что в C++ с этим немного геморройно, в частности из-за адского зоопарка сборочных систем и целевых платформ.
    С другой стороны, наиболее популярны сейчас CMake и Meson (симейк считай билд-система по-умолчанию для C++), а также появились ультимативные решения задачи упаковки, такие как Conan (который унифицирует различную сборочную информацию и пропускает её через себя, чтобы можно было использовать в разных пакетах разные сборочные системы). Но всё-таки разобраться придётся, чудо в такой разнородной экосистеме сотворить сложно. Кстати, именно по этой причине многие плюют на грамотную упаковку, и предлагают подключать библиотеку путём импорта в проект исходников (например, через git-сабмодули).

    Вы можете задавать более конкретные вопросы, постараюсь помочь.
    Ответ написан
    Комментировать
  • Может ли физ лицо создавать интернет-проекты?

    php666
    @php666
    PHP-макака
    Вопрос, на самом деле, довольно сложный, если у вас нет знакомого юриста.

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

    Пришлось срочно ознакомиться с вопросом "кто я" и "что я делаю" и заплатить за онлайн-консультацию у юристов.

    Советую автору зайти на правовед.ру и почитать то, что там накоплено в базе по ответам юристов. Ключевые слова: "информационный посредник", "политика конфиденциальности для сайта", "оферта для сайта" и тд.

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

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

    Почитайте текст от одного юриста с правоведа (Дмитрий Васильев) что он пишет в открытом доступе как реклама своих навыков: https://pravoved.ru/question/604239/ и отчасти ответы на банальные вопросы владельцев сайтов.
    Ответ написан
    4 комментария
  • Договорился на подработку, прислали договор на подписание, в нём увидел пункты которые не видел в других подобных договорах - это мошенники?

    @402d
    начинал с бейсика на УКНЦ в 1988
    Сравните
    ГК РФ Статья 715. Права заказчика во время выполнения работы подрядчиком
    и пункт 2.4.3. и в судебной практике можете найти 2.4.2 дословно
    Ответ написан
    Комментировать
  • Какое оптимальное время въехать в проект?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какое оптимальное время въехать в проект?

    Не бывает оптимального времени. Обычно заказчик и исполнитель вместе решают какое время.
    Но для оценки я рекомендую следующее. Посмотреть backlog проекта. Посмотреть какие критичные
    таски висят. Или блокеры. Посмотреть что у них общее.

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

    Для анализа кода поставте план - график. Например 1 неделя на развертывание проекта.
    Если там специфичное облако - то на изучение облака еще 1-2 недели.

    План график должен включать обязательные пункты который надо пройти. Например если это
    Laravel/react - то вы должны поднять в облаке привет-мир на этом стеке и продемонстрировать
    что он работает. И только после этого переходить к развертыванию проекта.

    Если на проекте есть архитектурная документация, confluence, wiki - то берите пару недель на чтение.
    Выписывайте ВСЕ новые слова на бумажку. По ним задаете вопросы.

    У вас должен быть ментор или консультант который раз в несколько дней должен отвечать
    на ваши вопросы по списку. Ваш план-график должен учитывать риски и внезапные investigations
    результатом которых могут быть НОВЫЕ таски которые вы сами создадите. Например - сдохли
    сертификаты по сроку. Создать новые. Это время. Это тоже таски и они должны быть эстимированы.
    Ответ написан
    3 комментария
  • Как скачать видео частями?

    twobomb
    @twobomb
    youtube-dl — библиотека для скачивания видео с YouTube
    Вот нашёл обертку под C#
    YoutubeDLSharp

    var res = await ytdl.RunVideoPlaylistDownload(
        "https://www.youtube.com/playlist?list=PLPfak9ofGSn9sWgKrHrXrxQXXxwhCblaT",
        start: 52, end: 76
    );
    Ответ написан
    Комментировать
  • Как создать файл используя js?

    Sect0R
    @Sect0R
    Full Stack Developer
    function downloadTextAsFile(text, filename) {
      const blob = new Blob([text], {type: 'text/plain;charset=UTF-8'});
      const link = document.createElement('a');
    
      link.setAttribute('download', filename);
      link.setAttribute('type', 'hidden');
      link.setAttribute('href', window.URL.createObjectURL(blob));
    
      document.body.appendChild(link);
      link.click();
    
      setTimeout(() => {
        window.URL.revokeObjectURL(link.href);
        document.body.removeChild(link);
      }, 100);
    }
    
    downloadTextAsFile('Hello world', 'hellofile.txt');
    Ответ написан
    Комментировать
  • Перспективно ли изучения GO для начинающих?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не собираюсь переквалифицироваться в джуны и пытаться устроиться в компанию, возраст уже не тот для этого да и организация иная - нет привязки к единому месту географически к тому-же я всегда худо-ли бедно, но работал на себя, не в компании.


    Письмо, полное сомнений и множества вопросов. Я не совсем понял что требуется от нас. Если отвечать на главный вопрос - то да. Перспективно. Go драйвит Google как основной язык для микросервисов. Но учитывая возраст кандидата я-бы спросил следующее.
    - как с английским?
    - как быстро обучаешся чему-то новому?
    - согласен ли на релокацию?

    Какие перспективы в РФ - понятия не имею но перспективы в зарубежных конторах - есть.

    Хочу предупредить автора об ошибках которые я сам совершал. Я думал что дело в языках и технологиях. Но это не так. Дело в коммуникациях. Я работал минимум с 5 зарубежными компаниями и я своими глазами видел что мои знания просто нивелировались на фоне например моего не очень сильного английского. А другие teammates в силу широких коммуникатиционных скилов могли очень быстро найти контакт с нужными людьми и обходили
    меня в карьере достаточно быстро.

    По сути когда тебе за 40 - вообще не имеет значения какой язык ты знаешь. У тебя за плечами должен быть уже
    такой багаж что тебя можно просто брать как опытного советника в технических вопросах. Язык можно подучить но если речь идет просто о распределенных системах и микро-сервисах то больше знаний требуется в части например анализа узких мест системы. Кеширования. Грамотного дизайна безопасности и репликаций и бекапов и восстановления от сбоев. Этот пласт знаний вообще лежит вне языка. И поэтому джун даже очень хорошо выучивший Go или Python не может решать такие вопросы. А автор - скорее всего может. Барьером может быть
    какая-то банальность. Например язык. Поэтому я и спрашиваю.
    Ответ написан
    4 комментария
  • Как работает grpc?

    @deliro
    А что тут понимать-то? Представь, что у тебя есть два сервиса, которые общаются по JSON-RPC over HTTP. Приходит сервис1 к сервису2 и говорит, ну-ка бахни мне метод getSomethingOfSomething с аргументами вот такими. И всё это в виде JSON внутри HTTP body. Сервис2 идёт, смотрит у себя в реестре метод getSomethingOfSomething, вызывает его с аргументами и отдаёт результат. Легко? Легко. Теперь тоже самое, только вместо HTTP там HTTP/2, а вместо JSON — protobuf. То есть, два сервиса договорились, что в первых четырёх байтиках будет лежать, например, int32, в следующих восьми будет лежать float64 ну а там дальше ещё что-то будет лежать.
    Ответ написан
    3 комментария
  • Как установить пакеты в go проект без интернета?

    1. Можете класть их в папку vendor вашего проекта. https://blog.gopheracademy.com/advent-2015/vendor-...
    2. Можете переносить кэш пакетов с другой машины (он лежит в $GOPATH/pkg/mod)
    3. Можете использовать replace в файле go.mod, чтобы указать, где лежит тот или иной пакет. https://go.dev/ref/mod#go-mod-file-replace
    Ответ написан
    Комментировать
  • Выполнение/вызов функции из Go файла при нажатии на кнопку html?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Алгоритм у вас будет примерно таким...
    При нажатии на кнопку у вас будет вызвана функция (обработчик события onClick у кнопки).
    В этой функции вы сделаете AJAX запрос по протоколу HTTP на ваш сервер, где запущено ваше ПО на Go.
    В main.go вы запускаете HTTP сервер, который примет запрос от вашей функции JavaScript, обработает его и ответит.

    Разберём самый простой вариант с методом GET, чтобы вам было проще тестировать.

    На сервере (своём компьютере) запускаете main.go примерно такого содержания
    package main
    
    import (
        "fmt"
        "net/http"
    )
    
    func helloHandler(w http.ResponseWriter, req *http.Request) {
        fmt.Fprintf(w, "hello\n")
    }
    
    func main() {
        http.HandleFunc("/hello", helloHandler)
    
        http.ListenAndServe(":8081", nil)
    }

    Этот сервис будет слушать порт 8081 любого IP адреса на сервере, где будет запущен.
    Предположим, что вы тестируете на своём компьютере, в этом случае для проверки вам нужно в браузере откройте url `127.0.0.1:8081/hello`
    После этого вы должны увидеть в ответе просто текст: "hello".
    Когда этот этап будет завершен - вы сможете перейти к вызову этого URL уже из JavaScript.
    Для этого можете использовать то, что вам привычнее, если такого нет - можете воспользоваться этим примером
    const req = new XMLHttpRequest();
      const url='http://127.0.0.1:8081/hello';
      req.open("GET", url);
      req.send();
      req.onreadystatechange=(e)=>{
        console.log(req.responseText)
      }

    PS: Если не понятно или что-то не получится - пишите, помогу разобраться.
    Ответ написан
    21 комментарий
  • Как посмотреть сколько времени занимает выполнение каждой функции программы (C++)?

    vabka
    @vabka
    Токсичный шарпист
    Тебе нужен профайлер.
    В Visual Studio есть свой.
    Ещё советую прочесть эту статью:
    https://habr.com/ru/post/482040/
    Ответ написан
    Комментировать
  • Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Если дать короткий ответ, то всегда следует задуматься о декомпозиции класса в такой ситуации.

    Подобный твоему класс представляет из себя монолит - довольно распространенный примитив проектирования, попутно именуемый как "God Object". Объект, который может всё и от которого все вокруг зависят.
    Если появляется желание разбить реализацию интерфейса класса на несколько файлов, значит уже есть понимание того, как тематически декомпозировать этот класс и, вероятно, проблема остается только в том, чтобы правильно декомпозировать состояние класса.

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

    Если говорить развернуто.

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

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

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

    Общий шаблон такого разделения выглядит так. Чаще всего разработчики именуют файлы именем класса. Например MyClass.h и MyClass.cpp. Когда нужно тематически разделить определение интерфейса, к имени класса после точки и перед расширением файла добавляется суффикс, говорящий о тематике определения. Например MyClass.serialization.cpp, MyClass.crud.cpp или MyClass.callbacks.cpp.
    Ответ написан
    5 комментариев
  • Как правильно правильно просканировать большое количество адресов в сети?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    В общем хочу провести небольшое исследование,

    Проводите. Оно реально будет небольшим, потому как как только пров увидит скан - он тут же забанит Вашу VPS "до выяснения".
    Ответ написан
    Комментировать
  • Ошибка mutex слишком много обращений к объекту?

    @res2001
    Developer, ex-admin
    Найдите тут подходящую под ваше описание ошибку
    https://linux.die.net/man/3/pthread_mutex_lock
    Я что-то не нашел.
    Единственный более-менее подходящий с натяжкой вариант - EAGAIN - возвращается в случае рекурсивного мьютекса при превышении максимального количества блокировок.

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

    axifive
    @axifive
    Software Engineer
    Вам нужно засечь время исполнения.
    В Unix системах есть команда: timego ....
    В Windows PowerShell есть Measure-Command{start-process go ... }

    А дополнительную отладочную информацию можно получить с помощью флагов
    https://pkg.go.dev/cmd/compile#hdr-Command_Line
    Ответ написан
    Комментировать