• Как запустить php и nginx в одном контейнере?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Приложение же состоит из одного файлика index.php и выводит текст "Hello World!".


    php не умеет выводить текст в браузер. Это значит что в первом докерфайле уже устанавливается какой-то веб сервер, возможно httpd

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

    А еще проще найти готовый. связка nginx с php достаточно стандартная сборка, уверен есть официальный образ, еще и не один от разных вендоров.
    Ответ написан
    5 комментариев
  • Почему не работает клавиатура ноутбука в Linux?

    @Alexey_Neonov
    Проблема в том, что Ubuntu считает ваш компьютер планшетом и отключает клавиатуру. Приведенное ниже исправление работает, если следующая команда дает вам любое число, которое является , а не 31 или 32 .

    В последних ядрах есть ошибка, которая отключает клавиатуру некоторых ноутбуков. Пока в основном Acer и HP. Обычно можно перейти к восстановлению и загрузиться с ядра 5.4.0-42 или использовать внешнюю клавиатуру.

    https://typerus.ru/linuks-ne-rabotayet-klaviatura-...
    Ответ написан
    Комментировать
  • Уход во время испытательного срока, нормально ли это?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Если так делаешь пару раз - нормально. Если десять раз - плохо.
    Ответ написан
    Комментировать
  • Почему Facebook и Vk написаны на PHP, если большие базы данных предполагаются делать на Java и C#?

    @Dementor
    программист, архитектор, аналитик
    Facebook. Изначально все начиналось как развлекуха для студентов. А для студентов в нулевых PHP для веб-разработки - это стильно, модно, молодежно, особенно если сравнивать с популярным в то время Perl. Когда пользователи повалили толпой, то они напряглись и перешли через несколько лет на Hyper-PHP

    VKontakte. Изначально задумывались как клон ФБ. Основатель - это бывший разработчик ФБ, который настолько хорошо знал внутреннюю кухню, что решился на форк. Вероятно проблемы масштабирования догнали их позже и они только через три года после ФБ решили перевести проект на KittenPHP.

    P.S. Не нужно путать "лучшие практики" и "так исторически сложилось".
    P.S.S. Вообще-то "большие базы данных предполагаются делать на" Erlang ))
    Ответ написан
    Комментировать
  • Каким образом узнать ImageId Ubuntu 20.04?

    @mureevms
    aws ec2 describe-images \
        --filters \
           "Name=owner-id,Values=099720109477" \
           "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-*-20.04-*-server-*"  \
           "Name=architecture,Values=x86_64" \
           "Name=creation-date,Values=2023-*" \
        --query 'Images[*].[CreationDate, ImageId]' \
        --region us-east-1 \
        --output table \
        | sort

    Последняя строка в выводе - искомый AMI
    Обратите внимание на параметр region. В разных регионах будет разный image-id.
    owner-id = 099720109477 это Canonical

    Вспомнил о сервисе поиска AMI на сайте ubuntu, там можно отфильтровать по параметрам, в качестве результата выводится последний созданный образ https://cloud-images.ubuntu.com/locator/ec2/
    Ответ написан
    Комментировать
  • Как подключить PostgreSQL к react-app вебсайту?

    @aleksey_savin
    Подключать приложение на React напрямую к базе данных - очень плохая идея. Код вашего сайта доступен для любого, кто откроет его в браузере. Соответственно, любые учётные данные, в данном случае от вашей базы данных, можно там же и подсмотреть. Выше верно написали: нужен бэкенд, например, на node.js, к нему будут отправляться API-запросы, например, через fetch или axios, и уже этот бэкенд будет связываться с базой данных.
    Ответ написан
    1 комментарий
  • Как подключить PostgreSQL к react-app вебсайту?

    vabka
    @vabka
    Токсичный шарпист
    Суть вопроса, как мне делать INSERT и SELECT запросы в вебсайте?

    Никак. Эти запросы должен делать бэкенд.
    А сайт должен делать http запросы к нему, например, при помощи функции fetch
    Ответ написан
    Комментировать
  • Можно ли заставить Node 18 использовать скомпилированную версию библиотеки?

    MvcBox
    @MvcBox
    Software Developer [C/C++/JS(for Node.js)/etc]
    При запуске ноды в переменной окружения LD_LIBRARY_PATH можете задать свои пути поиска библиотек.
    LD_LIBRARY_PATH="тут_ваши_пути_поиска" node ./index.js
    Ответ написан
    2 комментария
  • Есть ли смысл учить Golang если уже хорошо знаешь .NET?

    GavriKos
    @GavriKos
    В том что если завтра вас уволят, то сможете отзываться на более широкий пул вакансий.
    Ну и общий кругозор расширите конечно
    Ответ написан
    2 комментария
  • Есть ли смысл учить Golang если уже хорошо знаешь .NET?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Из коробки компилируется в единственный, сравнительно компактный, бинарь без зависимостей от рантайма и окружения.
    (и без подводных, в отличие от full aot и assembly trimming)

    2. Сможешь рассматривать вакансии, где требуется Golang, если собираешься искать работу.
    3. Сможешь нанимать go-шников со всеми вытекающими, если будешь искать разрабов в свой проект.
    4. Если твой проект должен будет активно взаимодействовать, например, с kubernetes и прочими devops-штуками, то Go может быть чуть удобнее, тк практически все эти инструменты написаны на Go и для работы с ними имеются готовые библиотеки, которые, вероятно, будут лучше, чем их альтернативы для .NET.
    Ответ написан
    3 комментария
  • Должны ли все асинхронные методы вызываться с ключом async?

    petermzg
    @petermzg
    Самый лучший программист
    Calculate не является асинхронной функцией поэтому async не нужен. И очень плохо вызывать в асинхронном коде Thread.Sleep, для асинхронного кода есть Task.Delay.

    async преобразует код в конечный автомат (State Machine)
    Ответ написан
    3 комментария
  • Можете посоветовать книги, статьи, видио уроки по JavaScript, jQuery и по PHP?

    @Kirill-Gorelov
    С ума с IT
    Если не хочешь после обучения оставаться голодным, то не изучай вордпрес...
    Изучай фреймворки. Джунов берут за хорошие деньги со знанием одного из фреймворка laravel/symphony, с ВП либо фриланс, либо средненькая веб студия....
    Ответ написан
    3 комментария
  • Какие навыки требуются Junior программисту микроконтроллеров?

    @dima20155
    you don't choose c++. It chooses you
    1. Прежде всего, нужно знание схемотехники, но в вашем случае этот этап можно вычеркнуть.
    2. Естественно, знание основ С и С++ (синтаксиса, базовых конструкций). Советую вам использовать в своих проектах С++, поскольку зачастую вы сможете писать в стиле С без каких-либо проблем, а при необходимости воспользоваться фичами/библиотеками для С++.
    3. Навыки hardware и software отладки. Здесь просто нужна практика с любимой IDE.
    4. Понимание указателей, типов памяти (статическая, динамическая, автоматическая, регистровая). Как память выделяяется и прочее.
    5. Знание базовых структур данных. Это немного скользкий пункт, поскольку С++ предоставляет хорошую (хотя и весьма минималистичную) стандартную библиотеку STL, в которой есть большинство из необходимых структур данных, но они используют довольно много дополнительной аллокации памяти, поэтому если пишете под что-то 8битное, то имейте это ввиду.
    6. Знание git на базовом уровне сейчас важно для джуна любой IT специализации.
    7. Неплохо бы иметь базовое представление о том как устроен микроконтроллер и его архитектура.
    8. Неплохо бы понимать RTOS (FreeRTOS - классика жанра), а главное зачем он нужен, а когда он не нужен или вреден.
    9. Лично мне всегда в работе пригождается python, но это всегда сторонние задачи/автоматизация.

    P.S. Нашел ещё вот такой RoadMap.
    P.S.S. Получилось довольно объемно. Но пункты 2-5 по сути можно объединить в один. Все это можно изучить написав парочку проектов для классической STM32 + HAL.
    P.S.S.S. Сам начинал как hardware разработчик. Путь embedded разработчика начального уровня не был сложным для меня и занял не очень много времени.
    Ответ написан
    Комментировать
  • Как найти COM порт оптимально?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, ардуино (ну как минимум китайские клоны) отдают определённый VID/PID USB устройства. Этим можно пользоваться для сужения диапазона поиска. Эту инфу можно узнать из реестра Windows.
    Во-вторых, если ты контролируешь прошивку ардуинки, можешь заставить её отправлять какой-то хэндшейк (заранее известный пакет) при подключении к порту (обычно арудино перезагружается при коннекте к порту). Тогда достаточно подождать совсем чуть-чуть, отправка данных не потребуется. Также меньше шансов что-то поломать, отправив левые данные в неизвестное устройство.
    В-третьих, просто сделай два последовательных цикла - один создаёт и запускает потоки, а второй их дожидается. Тогда ожидание будет параллельным.
    Ответ написан
    2 комментария
  • Нужен ли антивирус на linux server?

    @nApoBo3
    Антивирус нужен везде где вы имеете дело в не контролируемыми данными. Все.
    Если в вашу систему могут попасть или пройти через нее данные от не доверенных систем и антивирус умеет с данным типом данных работать, то он нужен.
    Например
    1) у вас есть NTP сервер, вы получаете время из не доверенной системы и раздаете его не доверенным системам. Но антивирус не умеет работать с NTP протоколом. Значит не нужен.
    2) у вас FTP, вы получаете файлы от не доверенных систем и отдаете, антивирус умеет работать с файлами, значит нужен.
    3) у вас прокси, он стоит за другим прокси управляемым вами, вы вышестоящий прокси считаете доверенной системой, антивирус на нижестоящем прокси не нужен.

    Этот вопрос никак не связан с ОС сервера, ответ одинаков для любой операционной системы.
    Ответ написан
    Комментировать
  • Как создать контейнер Django?

    deepblack
    @deepblack
    Он ругается на отсутствие gcc

    Добавь его в образ python:3.8.6-alpine
    RUN apk add --no-cache --virtual .build-deps gcc musl-dev \
         && pip install cython \
         && apk del .build-deps gcc musl-dev


    Или используй другой образ в котором уже есть gcc.

    Upd.:

    Возьми нужный образ (по ссылке оттуда можно перейти в GitHub и посмотреть как устроен Dockerfile определенного образа)
    отсюда (выбираешь версию и базовый образ, допустим возьмем python:3.8-alpine в нем Python 3.8.16 - посвежее будет того что ты взял изначально, Х.З. зачем тебе старая версия)
    Далее создай у себя в директории Dockerfile, примерно следующего содержания:

    FROM python:3.8-alpine
    
    RUN apk add --no-cache --virtual .build-deps gcc musl-dev \
         && pip install cython \
         && apk del .build-deps gcc musl-dev
    COPY requirements.txt .
    RUN pip install -r requirements.txt

    Билдишь образ
    docker build -t appname:1.0 .

    после этого у тебя будет контейнер с python 3.8.16 и gcc + должны собраться твои зависимости из requirements.txt
    Останется добавить туда твое приложение и в общем готово.
    Могут быть какие-то нюансы со сборкой образа,
    но направление в котором двигаться я задал.

    В docker-compose не забудь указать что нужно юзать твой Dockerfile или указать имя контейнера который мы выше сбилдили.

    Если что-то непонятно то отдельные детали можно загуглить ))
    Ответ написан
    2 комментария
  • Как называется такая практика и является ли она приемлемой?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Такая практика называется вандализмом и не является приемлемой.

    Создать коммит Х2, который отменит все новые изменения master можно например так
    # Вредоносные действия делаем в своей ветке, 
    # так как не можем коммитить напрямую в master
    git switch feature
    # Якобы подтягиваем изменения из master, но по факту отменяем.
    git merge --ff $(git commit-tree -p master -p feature1 -m "X2" feature1^{tree})
    # Отправляем Pull Request обратно в master
    Но зачем? Практика перезатирания чужих правок ненормальна, если только это не исправление ошибок.

    Чтобы бороться с вандализмом используется рецензирование, когда Pull Request не вливается в основную ветку пока другие люди не просмотрят изменения и не одобрят.
    Ответ написан
    4 комментария
  • Как работает asyncio.sleep?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть такой системный вызов select (а также подобные ему poll, epoll итд), суть которого - передать массив файловых дескрипторов (частный случай - сетевых соединений) и затем при получении событий ввода-вывода получить список тех дескрипторов, в которых произошёл ввод-вывод. Важно понимать, что при это программа "засыпает", передаёт управление ОС и не тратит ресурсов. ОС сама разбудит программу при наступлении нужных событий (записался файл, пришли новые сетевые байтики итд). Высокопроизводительные сетевые приложения (типа nginx, haproxy итд) используют подобный подход для того, чтобы эффективно обрабатывать большое количество сетевого трафика одновременно.

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

    Обычный ввод/вывод является блокирующим: пока не будет выполнена операция (чтение/запись/передача/приём), программа приостанавливает свою работу в ожидании. В asyncio весь ввод-вывод является неблокирующим: операции ввода-вывода не приостанавливают работу программы, а позволяют перейти к другим ожидающим задачам.

    Обычный вызов sleep приводит к приостановке и засыпанию программы на указанное время (с передачей управления ОС), и в ней в это время ничего не выполняется. Как только время истечёт, ОС вернёт управление программе. Всё это время программа не работает, события ввода-вывода не обрабатывает.

    В то же время asyncio.sleep возвращает управление потоку событий, а не ОС, что позволяет переключиться на выполнение других задач, обработать новые события итд итп. Программа не останавливается и управление ОС не передаёт (ну, кроме сна в процессе исполнения select), поэтому asyncio.sleep приводит к неблокирующему засыпанию, не мешающему выполнять задачи, которым ждать окончания сна одной конкретной задачи не нужно. Когда истечёт не менее чем указанное в asyncio.sleep время, поток событий вернёт управление приостановленной задаче.

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

    Например, пусть есть функция, которая делает asyncio.sleep(1), затем три секунды работает числомолотилка без ввода-вывода. Тогда если у нас выполняются подряд с интервалами 0.1 с три таких функции, то первая задержит на 2.9 секунд возврат управления второй, а вторая - на 5.8 с третьей.

    Это общий принцип, разумеется, там много нюансов и особенностей реализации.
    Ответ написан
    Комментировать
  • Как работает asyncio.sleep?

    Vindicar
    @Vindicar
    RTFM!
    Идея простая.
    Асинхронные приложения - это набор пар "операция - обработчик", где операция - это некоторый длительный процесс (скажем, вводы/вывод), который не требует постоянного внимания со стороны кода. Когда операция завершается, выполняется её обработчик. Этот обработчик может планировать другие операции, и так далее.

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

    Соответственно, await-вызов сохраняет текущий контекст корутины, и планирует новую длительную операцию. Какую - зависит от того, что идёт после await. Эта операция представлена тем или иными awiatable значением (Future, Task и т.п.).

    Рабочий цикл (loop, его также называют реактор) просто проверяет текущие операции. Как только одна из них завершилась, он выполняет её обработчик. А потом продолжает проверять остальные активные операции.

    Ключевой момент - выполняет обработчик, а только потом проверяет остальные операции. Т.е. если обработчик планирует операцию через await - это не проблема, она будет выполняться наравне с остальными. А вот если обработчик просто делает что-то длительное, он не возвращает управление циклу, и не даёт выполняться остальным операциям.

    asyncio.sleep() планирует ничего не делающую операцию, которая завершится успехом через заданное время. Поэтому её выполнение не мешает циклу-реактору. Просто ещё один await вызов, который приостанавливает текущую корутину и возвращает управление реактору.

    time.sleep() ничего не знает о реакторе и асинхронных операциях. Она приостанавливает выполнение обработчика, не прерывая его и не отдавая контроль реактору. Поэтому на время time.sleep() (или любой длительной синхронной операции) спит вся программа.
    Ответ написан
    5 комментариев
  • Как называется такая практика и является ли она приемлемой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Является ли нормальной практикой для девелопера создать ветку feature1 от не последнего коммита мастера, то бишь не от "g"

    Да. В частности это стандартная практика разработчиков ядра linux: фичи должны расти от релизов или релиз-кандидатов, а не от каких-то случайных коммитов.

    и потом смерджить feature1 с коммитом X2 затирая изменения f и g?

    Из вопроса непонятно, это требование -- затирать, или это побочный эффект которого хочется избежать?
    Если делать обычный git merge, то никакого затирания не будет. Будут конфликты, если изменения касаются одних и тех же мест, иначе будет объединение изменений ветки и мастера.
    Чтобы затирать изменения можно делать git merge --strategy=ours -- в результате мёржа изменения сделанные в ветке которая мёржится будут потеряны.
    Ответ написан