Обновление и планы

После всех потрясений последних лет изменения в моей жизни кажутся скучными - и потому, в сравнении, благополучными. Я думаю, что я готова к новой главе, которая будет естественным продолжением предыдущих. Главное изменение - это уточнение направления и ближайших целей.

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

1. Достижения и навыки

Большинство из инструментов, которые я перечисляю, я, разумеется, знаю не идеально. Но это те навыки, за применение которых мне платят. Поэтому я запишу их в достижения: я достигла уровня, достаточного для уверенного использования.

Photo by Lum3n

Основные рабочие инструменты

Здесь перечислено, что я использую каждый или почти каждый рабочий день.

  • Symfony
  • PHP
  • MySQL
  • REST API
  • Git
  • Jira
  • Agile/Scrum
  • PhpStorm

Дополнительные рабочие инструменты и навыки

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

Читать дальше

Ищу работу

Image by Gerd Altmann from Pixabay

В блоге давно не было обновлений, а всё потому, что я не делаю теперь ничего интересного, о чём можно рассказать. Начальник меня опять подвёл – при этом, я уверена, считая, что это я подвожу его, – и, в общем, я в поиске работы. Резюме вот опубликовала, как бы грустно и пусто оно ни выглядело.

Со своими проектами у меня всегда было трудно, я, видимо, такой человек, который предпочитает работать на кого-то, в команде и с конкретными задачами. Самостоятельно поднимать тяжёлый коммерческий сайт со сложной задумкой, конечно, весело, но опыта моего на это не хватает, ресурса стрессоучтойчивости тем более. А если вместо зарплаты или просто помощи в разработке меня кормят баснями о светлом будущем, пока сами забираются в Bitrix и прочее 1с, то я вообще перестаю реагировать. Впрочем, перестану жаловаться на прошлую работу, и сосредоточусь на поиске новой.

В общем, если вам нужен в команду кто-то настолько грустный, как я, совсем немного опытный в PHP, Symfony, Docker и о-чём-я-тут-ещё-писала, см. список тэгов, – то скорее email me. Или, если вы не нанимаете, может, отправьте ссылки на меня кому-то знакомому, у кого есть вакансии.

Если я пишу на Symfony, почему использую Hexo для блога?

Этот пост для начинающих в создании сайтов, которые уже немного разобрались в вопросе, но пока не уверены, где и как размещать свои собственные сайты и блоги. И это не реклама и не призыв делать всё так же, как я – просто описание того, что я использую.

Меня спросили: почему, если я пишу на Symfony, я не сделаю себе блог на Symfony? Неужели не могу написать?
Конечно, я могу!

Но я завела статический блог, потому что он дёшев и прочен. Вместо динамической системы, которая может падать от недостатка ресурсов, это просто html-страницы, немножко css и js. Он лежит на бесплатном хостинге статических сайтов GitHub Pages (просто GitHub-репозиторий), я плачу таким образом только за домен.

Photo by Miguel Á. Padriñán from Pexels

Для блога мне не нужно никаких сложных функций. Комментарии предоставляет Disqus (хотя я думаю перейти на другое решение, когда будет время разобраться в этом вопросе подробнее), RSS генерирует плагин Hexo.

Читать дальше

Обновление части шаблона Twig с помощью Ajax

Столкнулась с необходимостью обновить часть страницы, созданной в Twig, с помощью ajax-запроса. Как обновить страницу, используя шаблон, где есть готовый цикл, который я хочу снова использовать? В поиске готовых вариантов нашла всего один вопрос на StackOverflow и кучу кривых переводов той же страницы. Возможно, решение такое тривиальное? Или никто не занимается этим? Или мои навыки поиска решений далеки от идеала?
В любом случае, на будущее запишу своё решение.
Задача и код сильно упрощены, в моём проекте нужно было получать другие объекты.

Задача:
Каждые 10 секунд обновлять на странице данные: показывать 10 последних комментариев.

Алгоритм:

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

Я использую Symfony 4, и вот в контроллере есть страница, где выводятся последние комментарии:

Читать дальше

Всегда учиться - учитывать реальность

Photo by Kevin Ku from Pexels

Я часто встречаю посты о том, что разработчик должен постоянно учиться и развиваться, браться за реальные проекты, рассылать резюме и всячески “прогрессировать”. Советы разной степени полезности о том, как быть крутым. Хотя многие пишут их от чистого сердца, желая помочь новичкам, далеко не все в реальности учитывают новичка как человека.

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

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

  1. Учитесь так, как вам это нравится.
  2. Учитесь всегда, но не за счёт собственного здоровья и благополучия.
  3. Не поддавайтесь на слабо всех этих профи из интернета, они сами чаще всего зарвавшиеся новички. Можно использовать их данные и их мнения, но не подчиняться этим мнениям.
  4. Сообщество разработчиков должно быть дружественным. Если вы столкнулись с грубостью, то виноваты не вы: что бы вы ни пытались сделать криво, какие бы глупые вопросы ни задавали, если вам ответили грубо – это не из-за вас, это эго отвечающего. При необходимости меняйте сообщество: вы не клялись в верности рыцарскому ордену, это всего лишь один форум или одна группа по интересам.
  5. Не будьте грубы сами. Если у вас нет моральных сил, которые вы готовы вложить в общение, если нет никакого желания никому помогать, пройдите мимо. Никому не вменяется в обязанность помогать другому, но когда вы сами обнаружите в себе готовность и желание отдавать – это радость и удовольствие.
  6. Все эти пункты тоже только буковки, написанные одним человеком. Я по эту сторону экрана не могу вам диктовать. Думайте сами по себе, думайте о самих себе и поступайте так, как считаете нужным.

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

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

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

Я советую не прекращать учиться на самой жизни, а не на буковках в бложиках. Где-то там, если вам интересна эта тема, найдётся место HTML, CSS, JavaScript, PHP, Python, C++ и другим страшным буквам и словам.

И когда у вас будут на то силы, то да, выберите себе проект и делайте его!
Я вот делаю соцсеть для проекта “12 книг Верна за 12 месяцев”.

Правильные папки для установки и конфигурации FOSUserBundle в Symfony 4

Symfony уже обновилась до 4.1, популярные бандлы добавляют совместимость, а вот документацию обновлять не спешат. Когда я впервые пыталась установить FOSUserBundle, серьёзно запуталась. Для профессионалов это, может, и очевидно, но мне стоило разобраться сначала, как изменилась структура папок и куда теперь смотреть.

Установка

Предполагается, что установить Symfony и нужные компоненты вы уже сможете. Требуются Doctrine, Annotations, SwiftMailer, Translation и Twig – всё это уже есть в вашем проекте, если создали его как symfony/website-skeleton, и всё это нужно добавить, если использовали symfony/skeleton. И ещё нужны настроенные в файле .env доступ к базе данных и mailer.
Устанавливается FOSUserBundle просто, но шаги установки используют не те файлы, которые сейчас указаны в документации. Пройдёмся по порядку, указываю не полностью инструкцию – её найдёте в документации – а правильные папки и файлы в Symfony 4.

Обработка шаблонов

Иногда FOSUserBundle выдаёт ошибку при установке, если в файле config/packages/framework.yaml не указан обработчик шаблонов.
Просто добавить туда templating: engines

1
2
3
framework:
templating:
engines: ['twig']

Читать дальше

Дебаг в PhpStorm с помощью XDebug под Docker, локально

Задача

Запустить в PhpStorm дебаг php-приложения, запущенного в docker-контейнере на том же компьютере, где работает PhpStorm.
Уточняю особенно, что контейнер на той же машине, где IDE, потому что с задачей дебага на удалённом сервере я пока не справилась.

Настройка Docker

Я пользуюсь генератором docker-compose PHPDocker.io, возьмём его результат за основу. Не забыть в поле Extensions поставить галочку напротив XDebug.
После, как обычно, скачать архив, распаковать файлы в корневую папку проекта.
В папке /phpdocker/php-fpm, где уже лежит файл с настройками php-ini-overrides.ini, я создала ещё один файл - xdebug.ini.

1
2
3
4
5
6
7
8
9
; ./phpdocker/php-fpm/xdebug.ini

zend_extension=/usr/lib/php/20170718/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_port=9000
xdebug.remote_autostart=on
xdebug.remote_connect_back=0
xdebug.idekey=PHPSTORM

За точными объяснениями настроек отсылаю к официальной документации. Замечу только, что порт 9000 можно изменить, но тогда его же нужно изменить в настройках PhpStorm. Кстати, remote_host можно указывать в этом же файле. Перейдём к нему вот-вот, я его указываю в docker-compose для удобства изменения.

Читать дальше

Приключения с SSL

На одной неделе дважды занималась конкретно вопросами ssl-сертификатов для сайтов.
Во-первых, собственный блог – можете заметить, теперь “защищённое соединение”. Оказывается, GitHub Pages (где блог размещён) прямо в начале этого мая начали поддерживать ssl-сертификаты и перенаправление на https для других доменов. Когда я создавала блог, поддерживали только для собственных, поэтому когда я перешла на свой домен (хорошо иметь редкую фамилию))), то сначала оставалась без безопасности.
Чтобы получить перенаправление на https, нужно было просто убрать из настроек custom domain и после добавить назад. Сделала это несколько дней назад, как только узнала. Стоило за новостями следить, но, честное слово, мне много чего стоило бы делать.

Во-вторых, по работе прямо сегодня возник тот же вопрос.

Читать дальше

Доступ к базе данных в docker-compose

Это была очень глупая и очень неприятная проблема, поэтому я обязана это записать, чтобы не повторять ошибку!
Задача: иметь доступ к контейнеру с базой из контейнера с php-приложением.

Допустим, у нас есть файл docker-compose.yml (пример сгенерировала в phpdocker.io):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3.1"
services:

mysql:
image: mysql:5.7
container_name: my-project-mysql
working_dir: /application
volumes:
- .:/application
environment:
- MYSQL_ROOT_PASSWORD=root-password
- MYSQL_DATABASE=my-database
- MYSQL_USER=my-user
- MYSQL_PASSWORD=my-password
ports:
- "8082:3306"

webserver:
<...>

php-fpm:
<...>

Читать дальше

Перенаправление виртуального хоста для nginx-proxy в Docker

По работе потребовалось: на некоторый период времени перенаправлять запросы на другой сайт (отправлять клиентов, которые не платят за услугу, на страницу оплаты). Используется автоматический обратный прокси-сервер nginx от jwilder.
Решение кажется очевидным и простым (и, вероятно, грубым), но я определённо рада, что нашла хоть такое. Основное преимущество: настройки в отдельном файле для каждого сайта, что делает проще автоматизацию перенаправления.

Для этого при создании контейнера с nginx нужно прописать дополнительные тома для настроек: conf.d для общих настроек и vhost.d, где будут храниться файлы для каждого виртуального хоста.

1
2
3
4
5
$ docker run -d -p 80:80 -p 443:443 \
--name nginx \
-v /path/to/conf.d:/etc/nginx/conf.d \
-v /path/to/vhost.d:/etc/nginx/vhost.d:ro \
jwilder/nginx-proxy

Читать дальше