version: '3.8'
services:
# Поднимаю сразу реверс-прокси, чтобы пробросить всё наружу на нужный мне порт.m
nginx:
build:
context: ./.docker/nginx
dockerfile: Dockerfile.dev
volumes:
- ./:/app
depends_on:
- php-fpm
ports:
- "8080:80"
php-fpm:
build:
context: ./.docker/php
dockerfile: Dockerfile.fpm-dev
args:
IMAGE_ENV: dev
volumes:
# Вот тут вся магия) Мы просто подключаем файлы проекта в виде вольюма
# Т.е. имеем доступ ко всем файлам и изнутри и снаружи контейнера.
# Внутри контейнера файлы будут видны по пути /app
- ./:/app
environment:
# Даже XDEBUG можно пробросить для IDE
XDEBUG_CONFIG: 'discover_client_host=true client_host=127.0.0.1 log_level=0 client_port=9003'
PHP_IDE_CONFIG: "serverName=Docker"
env_file:
- .env.local
depends_on:
- mysql
# Делаю отдельный контейнер для комманд-лайн утилит,
# чтобы не проще запускать консоль Symfony. Мне так удобнее.
# Здесь будет всё практически как и у php-fpm, только без самого php-fpm процесса
php-cli:
build:
context: ./.docker/php
dockerfile: Dockerfile.cli-dev
args:
IMAGE_ENV: dev
volumes:
- ./:/app
- composer:/root/.composer/cache
environment:
XDEBUG_CONFIG: 'discover_client_host=true client_host=127.0.0.1 log_level=0 client_port=9003'
PHP_IDE_CONFIG: "serverName=Docker"
env_file:
- .env.local
depends_on:
- mysql
mysql:
build:
context: ./.docker/db
dockerfile: Dockerfile
volumes:
- mysql:/var/lib/mysql
env_file:
- .env.local
environment:
MYSQL_ROOT_HOST: '%' # needs to be enclosed with quotes
ports:
- "6603:3306"
# Тут ещё два дополнительных вольюма. Один для кэша composer, а второй для файлов базы данных, чтобы она не убивалась при перезапуске наших контейнеров. Убивать мы её будем только сознательно. если нам надо её очистить.
volumes:
composer:
mysql:
# Образ Nginx
FROM nginx:alpine
# Копируем файл с настройками
COPY ./task/default.conf /etc/nginx/conf.d/default.conf
# Устанавливаем рабочую директорию
WORKDIR /app
# Образ php-fpm
FROM php:8.2-fpm
ARG IMAGE_ENV
# Устанавливаем нужные пакеты и расширения
RUN apt-get update && apt-get install -y -qq libpq-dev unzip libxml2-dev libicu-dev libonig-dev zlib1g-dev libpng-dev librabbitmq-dev \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd && docker-php-ext-install pdo_mysql && \
docker-php-ext-configure intl && docker-php-ext-install intl && \
pecl install xdebug amqp && rm -rf /tmp/pear && docker-php-ext-enable xdebug amqp && \
rm -rf /var/lib/apt/lists/*
# Use the default development configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# Копируем файл с настройками xdebug
COPY ./php.d/${IMAGE_ENV}/default.ini /usr/local/etc/php/conf.d/default.ini
COPY ./php.d/${IMAGE_ENV}/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Создаем пользователя app, чтобы не работать под рутом
RUN adduser --disabled-password --gecos '' --uid 1000 app
USER app
# Устанавливаем рабочую директорию
WORKDIR /app
# Образ php-cli
FROM php:8.2-cli
ARG IMAGE_ENV
# Устанавливаем нужные пакеты и расширения
RUN apt-get update && apt-get install -y -qq git unzip libpq-dev libxml2-dev libicu-dev librabbitmq-dev && \
docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd && docker-php-ext-install pdo_mysql && \
docker-php-ext-configure intl && docker-php-ext-install intl && \
pecl install xdebug amqp && rm -rf /tmp/pear && docker-php-ext-enable xdebug amqp && \
rm -rf /var/lib/apt/lists/*
# Use the default development configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# Копируем файл с настройками xdebug
COPY ./php.d/${IMAGE_ENV}/default.ini /usr/local/etc/php/conf.d/default.ini
COPY ./php.d/${IMAGE_ENV}/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Качаем и устанавливаем composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet
# Если всё же будете работать в контейнере под рутом, то заставляем composer работать под рутом
# ENV COMPOSER_ALLOW_SUPERUSER 1
# Создаем пользователя app, чтобы не работать под рутом
RUN adduser --disabled-password --gecos '' --uid 1000 app
USER app
# Устанавливаем рабочую директорию
WORKDIR /app
# Если надо подключить shell переменные, то создаём тут же ..env.local файл и делаем.
include .env.local
export
# Поддержка возможности запускать шелл-скрипты
SHELL:=/bin/bash
# Кэш
c: cache-clear cache-warmup
cc: cache-clear
cw: cache-warmup
cache-clear:
docker-compose run --rm php-cli bin/console c:c
cache-warmup:
docker-compose run --rm php-cli bin/console c:w
up: docker-up
down: docker-down
restart: docker-down docker-up
init: docker-down init-common
reset: docker-down-clear init-common
init-common: clear docker-pull docker-build docker-up app-init
test: test
test-coverage: test-coverage
test-unit: test-unit
test-unit-coverage: test-unit-coverage
# Если в контейнере другой пользователь, то будут ошибки доступа при редактировании файлов.
# Поэтому надо сделать chown и chmod для папки var (кэш и логи)
chown:
sudo chown -R 1000:1000 . # Тут указываем свои данные пользователя с хоста
sudo chmod -R 777 ./var/
docker-up:
docker-compose up -d
docker-down:
docker-compose down --remove-orphans
docker-down-clear:
docker-compose down -v --remove-orphans
docker-pull:
docker-compose pull
docker-build:
docker-compose build
app-init: composer-install app-wait-db app-migrations ready
clear:
docker run --rm -v ${PWD}:/app --workdir=/app alpine rm -f .ready
ready:
docker run --rm -v ${PWD}:/app --workdir=/app alpine touch .ready
test:
docker-compose run --rm php-cli php bin/phpunit
test-coverage:
docker-compose run --rm php-cli php bin/phpunit --coverage-clover var/clover.xml --coverage-html var/coverage
test-unit:
docker-compose run --rm php-cli php bin/phpunit --testsuite=unit
test-unit-coverage:
docker-compose run --rm php-cli php bin/phpunit --testsuite=unit --coverage-clover var/clover.xml --coverage-html var/coverage
composer-install:
docker-compose run --rm php-cli composer -V
docker-compose run --rm php-cli composer install
app-create-db:
docker-compose run --rm php-cli ./bin/console doctrine:database:create
app-wait-db:
#docker-compose exec lkui-mysql mysqladmin --user=root --password=password ping --silent --wait=60 &> /dev/null
#sleep 20
until docker-compose exec -T mysql mysqladmin ping -u root -P ${MYSQL_TCP_PORT} -p${MYSQL_ROOT_PASSWORD} | grep "mysqld is alive" ; do >&2 echo "MySQL is unavailable - waiting for it... " ; sleep 5 ; done
app-migrations:
docker-compose run --rm php-cli ./bin/console doctrine:migrations:migrate --no-interaction
app-fixtures:
docker-compose run --rm php-cli ./bin/console doctrine:fixtures:load --no-interaction
migration:
docker-compose run --rm php-cli ./bin/console make:migration
migrate:
docker-compose run --rm php-cli ./bin/console doctrine:migrations:migrate #--no-interaction
fixtures:
docker-compose run --rm php-cli ./bin/console doctrine:fixtures:load
?>
и писать чистый HTML, можно посреди HTML открыть PHP тег <?php
и воспользоваться языком, например вывести HTML в цикле (опять же, закрыв тег после начала цикла), или использовать переменную как значение, или выводить HTML по условию.тут всякие визуальные уточнения страницы; форма, css специфика для страницыcss стоит писать отдельно и подключать как файл/файлы, для формы будет отдельный шаблон
тут всякие оперативные реакции на действия в браузере требуемые страницей.js тоже стоит писать отдельно и подключать как файл/файлы
чуйка говорит, что через QA реалистичнее "ворваться". Что думаете?Думаю, это маркетинг.
Вообще, хотелось бы, конечно, выучить хорошо Excel, SQL и дэшборды делать какие-нибудь на первых порах:), но судя по всему требуется знать финанализ, опыт в бизнесе и маркетинге и тд, чего у меня нет.Это требуется тем, кто ставит задачи, а разработчикам лишь для ознакомления и не обязательно.
IT в самом худшем положении чем когда-либо
PHP
, Python
и прочее, где низки порог вхождения, и тут уже всё стаёт на свои места. Даже школьники пишут всякую дичь на PHP
и очень этим гордятся.конкуренция адская, front-end, UX/UI дизайнеров и тестировщиков/QA -- как собак нерезаных и все профнепригодны
QA
и Dev'ы
можно вот просто так. Сейчас разработчики сами отлично умеют всё тестировать, так что тут сложно сказать что-то... Вообще QA
стек используется одни инструменты, deve
стек использует другие инструменты для работы, по этому тут так же не получится прыгать туда-сюда. Даже если вы будете QA
и захотите перейти в dev'ы
и программирования не убежишьnode.exe server.js
require('http').createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Привет!');
}).listen(3000, () => { });
require('http').createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(php('c:\\projects\\app\\main.php')); // вызов PHP
}).listen(3000, () => { });
2) Есть видеопоток, на котором, например, обнаруживаются автомобильные номерные знаки и отправляется запрос в базу данных для проверки его наличия. В результате возвращается какой-то результат.Обычно делается полная обработка видео до конца, после чего все найденные номера пишутся в базу с метками времени, по необходимости делаются снэпшоты конкретного фрейма и сохраняются отдельно, ссылка на место хранения картинки так же пишется в бд. Далее уже можно делать запросы в бд на сопоставление двух таблиц - имеющегося списка владельцев и распознанных номеров. По необходимости заводится табличка связей, типа найдено юзер.айди / парсед_нумбер.айди для того чтобы не бегать с выборочными запросами по пользователю и т.п...
3) Для этой базы данных я хочу создать WEB с личной учетной записью и реализацией в виде пользователя - администратора...Это базовый функционал любого современного фреймворка, авторизация и роли. Здесь вы никакого функционала по идее не пишете вообще. Только создаете и настраиваете соответствующие роли и права. "создать WEB" в вашем случае логично просто написав АПИ с десятком рутов, далее будет не особо важно будет ли у вас веб страничка или приложение.
1) PostgreSQLЛюбая рбд. Специфичных задач я тут не вижу, подойдет все что можно установить и с чем вы знакомы лучше.
2) Python + Tenserflow и/или что-то в этом роде + psycopg2Опять же, задача чисто прикладная, любые инструменты выполняющие поставленную задачу подойдут. Производительность и качество можно проверить только тестами на конкретных данных.
По п.2, ожидается, что не будет необходимости отслеживать сразу несколько объектов и отправлять несколько параллельных запросов. Однако это не исключено.Это в любом случае будет работа с командной строкой, любой процесс из которой можно запустить отдельным потоком.
3) Python + Flask и связанное с этим, например, Bootstrap и тому подобноеСкорее всего апи на любом фреймворке + какой-нибудь реакт/вью.
4) Android Studio, Kotlin + что-то для работы с БДПо описанию скорее какой-нибудь PWA хватит с головой. Вся работа с бд идет через апи, ничего дополнительного особо придумывать не надо.
Я напоминаю вам, что у меня нет опыта работы с чем-то настолько большим. Спасибо.Слона едят по кускам. Разбейте задачи на понятные подзадачи и решайте все в порядке реализации. Каких-то инновационных фичей я тут не вижу, все строится либо на готовых модулях/приложениях, либо на достаточно примитивной логике, так что задача вполне по силам новичку, хоть и придется поработать.
Собираюсь поступать
Обратите внимание, что версия JRE различается
в зависимости от используемой вами SDK — скачайте нужную. В то же время
ActivePerl должен быть именно версии 5.6.1.x — более старые или новые не подойдут.
На ПК должен быть установлен транслятор ActivePerl 5.6.1.635 и хотя
бы один комплект SDK.
zero_ones = np.random.choice([0,1], 100, p = [0.3,0.7])
unique, counts = np.unique(zero_ones, return_counts=True)
unique_strings = [str(digit) for digit in unique]
plt.bar(unique_strings,counts, edgecolor='black')
plt.show()
X = np.random.normal(0,1,1000)
plt.hist(X, edgecolor='black', bins=50)
plt.show();