TGViewer
Channel Public Channel
dev notes

dev notes

@junsenior

Пишу про Go, Vim, и про то, как я медленно ползу в сторону FAANG.

С предложениями: @junsenpub
Subscribers
1.39K
Photos
33
Videos
6
Links
189

Showing posts older than #159 · Back to latest

Older Posts 20 shown
Post #158 1.97K
Микросервисы ― это прекрасно. Но, как показывает опыт, разработчики часто не знают что это, как их применять и зачем микросервисы нужны. Предыдущий проект, на котором я работал, разрабатывался под микросервисную архитектуру, и мне этот подход понравился. Модуль, где обрабатывается большое количество математики ― берём Python. Модуль, где сосредоточена основная нагрузка по запросам ― берём golang. Бизнес-логика ― PHP. Каждый выделенный модуль был небольшого размера (кроме бизнес-логики), что позволяло не искать людей на его поддержку, и поддерживать самим. А выбранный язык позволил сделать кодовую базу в десятки раз меньше, чем если бы она писалась на одном языке.

В последнее время я всё больше интересуюсь golang, оставив PHP как рабочий инструмент. И на фоне этого интереса и моей люблю к микросервисам была найдена отличная серия статей: "Микросервисы на Golang", в 10 частях. Всё, от понятия микросервиса до реальных примеров - https://ewanvalentine.io/microservices-in-golang-part-1/

Думал перевести, но не знаю, какой процент людей на этом канале интересуется подобным. Если тебе интересно ― нажимай на кнопку "Перевод". Наберём хороший отклик ― переведу все 10 частей.
Post #157 1.86K
Объекты в PHP передаются по ссылке. А если я скажу, что это не совсем так? Под катом интересно и коротко о том, как это работает, и что будет на самом деле, если в сигнатуру функции добавить символ амперсанда.

https://soundcloud.com/5minphp/episode83
SoundCloud Hear the world’s sounds Explore the largest community of artists, bands, podcasters and creators of music & audio
Post #153 1.93K

Forwarded from PHP Digest

Приведение типов в PHP во многих случаях работает по принципу «лучше хоть как-то, чем никак».

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

debug=_0 // .env
(bool) getenv('debug'); // true!

Чтобы избавиться от таких проблем, можно взять filter_var с его флагами и бросать свой Exception.

Или можно взять обертку над значениями zakirullin/mess:

(new Mess(getenv('debug')))->getAsBool();
// _0 => UncastableValueException

В Mess можно скармливать массивы/примитивы:

$mess = new Mess($apiResponse);
$profile = new Profile(
$mess['profile']['name']->getString(),
$mess['votes']->getInt(),
$mess['is_deleted']->getBool()
)
// Dealing with typed ValueObject
GitHub GitHub - zakirullin/mess: Make your PHP arrays sweet'n'safe Make your PHP arrays sweet'n'safe. Contribute to zakirullin/mess development by creating an account on GitHub.
Post #152 1.71K
Многие в комьюнити PHP знают кто такой Никита Попов ― автор большого числа RFC для последних версий PHP и нескольких интересных opensource решений. Нашёл небольшой обзор, где он рассказывает о новинках в PHP 8 от лица разработчика большинства из них: https://www.youtube.com/watch?v=NbBRXwu1Md8. Приятного просмотра :)
YouTube Nikita Popov / What’s new in PHP 8.0? [eng] This is a video from the PHP fwdays | Special edition online conference, that was held on June 6, 2020. Talk description: PHP 8.0 is expected to be released by the end of the year, so it’s time to take a first look at the next major version of PHP. Attributes…
Post #150 2.05K
Рубрика: интересные проекты, найденные в глубинах интернета.

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

Чем они интересны? Во-первых, дядя Сережа, который Брин, когда-то взял их как основу для первой версии движка Google.
Во-вторых, с их помощью можно генерировать текст. Когда я только заинтересовался golang ― нашёл в сети интересный проект: https://github.com/arnaucube/flock-botnet, где на основе марковских цепей был сделан твиттер-ботнет, который вполне связно научился отвечать на твиты пользователей. Этакая нейросеть на минималках.

И вот на днях я покопался в коде этого проекта, и на удивление, кода там не много и он вполне читабелен. Скормив пару книжек, вроде "Война и Мир", сеть стала выдавать на моё первое слово что-то вроде того:
Все мы   – профессионалы! чаевые ему, ха-ха-ха. Мир просто спрашиваешь?
Это было даже немного жутковато :D Появились мысли допилить её до 2-ого или 3-его порядка, скормить туда пару сотен книг и посмотреть, насколько связные получатся ответы.
GitHub GitHub - arnaucube/flock-botnet: Twitter botnet with autonomous bots replying tweets with text generated based on probabilities… Twitter botnet with autonomous bots replying tweets with text generated based on probabilities in Markov chains - arnaucube/flock-botnet
Post #149 1.73K
Postman ― отличный инструмент. Если ты работаешь с API, скорее всего, хотя бы раз его использовал. Я перестал пользоваться аналогами когда первый раз попробовал собрать через него документацию: для каждого запроса можно указать md-разметку с описанием параметров, после чего в пару кликов - опубликовать на хосте и поделиться ссылкой.
Пару проектов назад меня бросили на жуткий legacy: отсутствие документации и тех, кто когда-то это писал, заставили долго и упорно заносить все запросы в Postman, по мере их нахождения в проекте, описывать документацию и структурировать по папкам.
Сегодня нашёл отличный инструмент для Laravel ― генератор коллекции по уже существующим роутам. Знал бы о нём тогда ― сэкономил бы много времени :) Ставим как пакет, запускаем одной artisan-командой ― готово, коллекция в формате json ждёт импорта. Пользуйтесь!

https://github.com/profclems/postman-collection-generator
GitHub GitHub - profclems/postman-collection-generator: A package that automatically generates postman collection from laravel api/web… A package that automatically generates postman collection from laravel api/web routes - profclems/postman-collection-generator
Post #148 1.78K
Пару дней назад упомянул доклад с разбором статических анализаторов. Сейчас же — тема поинтересней. Небольшой подкаст от "Пятиминутка PHP" затрагивает очень интересный инструмент — Rector. Проставить типизацию у аргументов и возвращаемых значений? Сделает. Проставить типы у полей классов? Легко. Заменить Laravel-фасады на DI? Тоже сможем. Заменить автоматически старые функции на новые аналоги? Давай сюда свой код.
А помимо этого — авто-замена на стрелочные функции там, где это можно. И всё это конфигурируется, какие-то правила можно убрать, какие-то оставить. В общем, этакий Eslint для PHP.

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

Круто, обязательно попробую на днях, прогнав через Rector один старый проектик.
Ну а ты пока слушай — https://soundcloud.com/5minphp/rector
SoundCloud Hear the world’s sounds Explore the largest community of artists, bands, podcasters and creators of music & audio
Post #147 1.72K
Никита Попов ― один из разработчиков PHPStorm, за которым числится огромное число RFC, множество библиотек для PHP и в целом ― огромный вклад в комьюнити. Недавно ребята нашли в закромах его gist'ов на github статью про ассоциативность операторов в PHP и про то, почему
<?php

$a = 1;
$c = $a + $a++;
var_dump($c); // int(3)

$a = 1;
$c = $a + $a + $a++;
var_dump($c); // int(3)

можно логично объяснить.

Интересно? Читаем - https://habr.com/ru/post/511916/
Хабр Порядок вычисления в PHP Примечание переводчика. Никита Попов внёс и продолжает вносить огромный вклад в развитие языка PHP. Он очень хорошо понимает внутренности движка PHP и в данной с...
Post #146 1.81K
https://gitlab.com/gadelkareem/skeleton

Нашёл отличный бойлерплейт для go/nuxt(vuejs) проектов, с примером API, примером использующего его фронта, тестами и CI/CD пайплайнами. Ссылка засветилась на реддите, отзывы ― отличные, многие взяли для своих проектов, кто-то ― перевёл свои проекты на этот шаблон. Будем посмотреть (с)
GitLab Waleed Gadelkareem / Skeleton · GitLab
Post #145 1.73K
0 == "строка" — больше не true

Дожили, у нас отнимают самое дорогое (и слава богу): в PHP 8 нестрогое сравнение больше не будет выдавать тех удивительных результатов, один из которых приведён выше! Об этом сообщает соответствующий принятый RFC. Выдавалось это из-за того, что операнд со строкой приводился к числу, тип операндов не проверялся, и мы получали удивительные баги, если где-то случайно указали == вместо ===.

Ребята с редита жалуются, что если они накатят PHP 8, то их проверка паролей в банковском бэке сломается, и придётся всё исправлять :D Так что, если ты не пишешь бэк для Bank Of Amerika, PHP 8 — правильный выбор.
Post #144 1.74K
Тем временем, JetBrains релизнули второй мажорный релиз PHPStorm в этом году.

Коротко о главном:
- Поддержка union types из PHP8
- Псевдотип false
- Новый движок потока управления
- Улучшения при работе с composer
- PHP_CodeSniffer, PHP CS Fixer и PHP Mess Detector можно запускать через docker compose
- Все команды Symfony, Laravel Artisan, Drupal Drush, WP-CLI и скрипты Composer можно очень быстро запускать в PhpStorm, не открывая терминала
- Функция извлечения подкласса из класса для рефакторинга классов, которым лучше быть быть парой классов
- Полная поддержка пул-реквестов GitHub
- Поддержка OpenAPI

Не коротко о главном:
https://www.jetbrains.com/ru-ru/phpstorm/whatsnew/
JetBrains Что нового в PhpStorm 2026.2 Представляем новые возможности PhpStorm 2026.2: менеджер навыков агентов, встроенный GitHub Copilot, атрибут #[FileReference], новое окно Laravel, а также улучшения для Git, терминала и работы с базами данных.
Post #140 1.75K
Ночного абстрактного синтаксического дерева вам в ленту!
Нашёл отличный видос, где коротко рассказывают про инструменты статического анализа для PHP - на основе разбиения на лексемы, на основе AST и в добавок множество инструментов, о которых ты не слышал, но которые могут быть интересными.

https://www.youtube.com/watch?v=QJ3pRd4Ua08
YouTube 25+ инструментов для аудита кода, CI/CD и не только (Александр Новиков, Spiral Scout) Инструментов статанализа свыше ста, но скорее всего вы слышали о пяти из них. Александр пощупал еще 88 и выбрал те, от которых сложно отказаться, попробовав раз. Слайды https://bit.ly/3eGakrU 01:55 Что такое статический анализ? 02:40 Инструменты статического…
Post #139 1.59K
В Symfony, начиная с версии 4.2 был добавлен autowiring через аннотацию @ required. Описываем любой публичный не статический метод, ставим над ним @ required, передаём ему аргументы, для типов которых есть сервисы - вуаля.

Но, через боль и слёзы узнал ещё одну вещь: autowiring в родительском классе в Symfony отработает только в том случае, если дочерний класс так же был интегрирован через autowiring. Аннотация @ required позволяет не инициализировать переменные через конструктор, что неочевидно может привести к такой ошибке: где-то создаём объект через new class(), конструктор не ругается (ведь зависимые классы подтягиваются через другой метод). И тут-то возникают ошибки. С одной стороны - это очевидно, так как обычная инициализация не включает никакие механизмы Symfony, упрощающие жизнь. С другой - я попался, теперь буду знать :)
Post #136 1.58K
2. Интерактивный rebase. Иногда нужно схлопнуть несколько коммитов, которые уже ушли в удалённый репозиторий, или, например, поменять сообщение у последнего коммита. Для этого можно использовать git rebase -i.
Например, мы хотим схлопнуть последние 2 коммита в один, и изменить ему сообщение. Для этого делаем:
git rebase -i HEAD~2, где после тильды указываются число коммитов от последнего - HEAD:

  pick d60786481 commit 1 name
pick 7a9d27f04 commit 2 name

# Rebase 889cd8739..7a9d27f04 onto 889cd8739 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.

Сначала идёт описание 2-х коммитов, а ниже, в комментарии, действия, которые мы можем над ними выполнить. Нам нужно выполнить squash, поэтому вместо pick пишем s или squash, сохраняем файл и открывается новый, где можно будет указать новое commit-сообщение. Указываем, сохраняем, профит. Если изменения были локально и не уходили в удалённый репозиторий - можно просто залить. Если уже уходили - то в push перед именем ветки ставим "+" - сокращения флага --force.

3. Интересная вещь - хэши коммитов. Непонимание того, как git отслеживает изменения, ведут к конфликам в коде. Например: у тебя есть dev и master-ветки. Тебе нужно что-то поправить, что уже ушло в master. Логично, что эти же изменения нужно залить и в dev. Бывает, что проще сначала сделать ветку от dev, сделать правку там (допустим, поправить надо конфиг в паре строк), залить в dev. Затем сделать ветку от master, поправить там и залить в master. Вроде бы задача решена, но в следующий раз, когда ты будешь вливать что-то из dev в master, git может начать ругаться, несмотря на то, что код полностью идентичен. Произойдёт это из-за того, что у коммитов не совпадут хеши, а хеши - это одно из условий проверки кода на конфликты. Придётся подтягивать изменения, делать rebase, заливать опять. В таком случае правильный вариант - это сделать изменения в dev, залить. Затем перейти в master, сделать rebase или merge на dev, и залить и туда. И обоих ветках будет одинаковый коммит и в последующем ошибок не возникнет.

git - мощнейший инструмент, и вышеописанные команды - только верхушка айсберга. Если подобный формат разрабора команд и разных фишек - понравится, в последующем буду чаще писать о том, на что способна эта система контроля версий.
Post #135 1.63K
Я уже давно не пользуюсь клиентами для GIT и перешёл на работу из командной строки. И сейчас расскажу почему это круто, какие в этом плюсы и опишу пару команд, о которых, как выяснилось, многие не знают.

Привязываться к какому-либо инструменту для работы с системой контроля версий, как по мне, плохой выбор.
Когда я только завёл этот канал - единственный инструмент, который я использовал для работы с git - IDE PHPStorm. Ну а что, удобно: Ctrl + K - открывается окно с изменениями, которые можно одной кнопкой закоммитить. Ctrl + Shift + K - вот и запушили. А потом получилось так, что передо мной оказалась консоль боевого сервера, где не было привычных комбинаций, были локальные изменения, которые нельзя было заливать. pull бросался ошибками, а когда с помощью stackoverflow изменения были закоммичены - выяснилось, что коммит надо отменить, а изменения сохранить. С того момента я решил, что нужно набивать команды из консоли, разбираться в том, что умеет git и через некоторое время понял, какие возможности и удивительную гибкость несёт за собой такой подход.

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

Но даже работая из консоли ограничиться стандартными git commit и git push получится только первое время, и только если ты работаешь один. Как только появляется команда - появляются конфликты в коде, которые надо уметь решать. Сейчас опишу несколько полезных команд и тонкостей, которые помогают мне при работе из консоли:

1. Многие знают про git log, который отображает ветку коммитов. Например, нужно убедиться, что rebase корректно перенёс твои изменения поверх master'а - git log это отобразит. Так же он отобразит хэши коммитов, авторов и дату изменений. Но мало кто знает про более мощный инструмент - git reflog.
reflog показывает историю комманд, которые ты делал и отображает, сколько действий назад они были выполнены:

  7a9d27f04 (HEAD -> ... HEAD@{0}: commit (amend): ...
f45c7d11b HEAD@{1}: commit (amend): ...
f6745f94a HEAD@{2}: commit (amend): ...
e2b332a3d HEAD@{3}: commit (amend): ...
aa08bbdcc HEAD@{4}: rebase finished: returning to refs/heads/...
aa08bbdcc HEAD@{5}: rebase: ...
d60786481 HEAD@{6}: rebase: ...
889cd8739 (origin/master, origin/HEAD, master) HEAD@{7}: rebase: checko
ut master

Вместо ... названия веток и commit-сообщений. HEAD@{0} - последнее изменение - git commit --amend. Например, что-то сломалось и ты решил откатить изменения, но при этом сохранить файлы. Например - откатим git commit --amend. Для этого выполняем:
git reset --soft HEAD@{4} - откатываемся до того состояния, которые были при HEAD@{4} - до rebase, а флаг --soft позволяет сохранить все изменения.
Post #133 1.83K
Только сейчас узнал что в Symfony есть крутой компонент, позволяющий управлять доступом к общим ресурсам - Lock Component.
Часто бывает, что команда не успевает закончить работу, а менеджер (будь то cron или обёртка в виде supervisor) запускает ещё один экземпляр. Со временем пулл процессов накапливается, и возникает неприятная вещи - взаимные блокировки, утечки памяти и на выходе если и не фаталы, то дубли в базе обеспечены.
Решение - подключаем трейт LockableTrait, и ставим проверку в начале команды:

if (!$this->lock()) {
$output->writeln('The command is already running in another process.');
return Command::SUCCESS;
}

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

В целом Lock Component позволяет использовать различные адаптеры, от Redis'а до семафоров, реализованных в PHP (https://www.php.net/manual/en/book.sem.php). Беру на вооружение :)
Post #132 1.73K
Хеллоу комрадс! Ай фаунд джаст эн амазинг чанэл вэа а мэн из гугл девелопс а дистрибьютед датабэйс ин го!

А если серьёзно, то чувак возвёл свой акцент в абсолют и стабильно выпускает новые серии в свой многосерийный проект по разработке key-value хранилки на go! Способ подачи, конечно, странноватый, но материал отличный, в русском сегменте такого не найти.

Нет, ну вы только послушайте - https://www.youtube.com/watch?v=oPwGrCoOUdo
YouTube Distributed key-value db in go #1: local database In this video we will start implementing the distributed key-value database in Go (golang). I start with a small HTTP server that implements set and get key operations and uses BoltDB as it's backend storage. All with strong Russian accent and tons of simplicity…
Post #131 1.69K
Нашёл интересную серию уроков по работе Active Record в PHP - https://webshake.ru/oop-v-php-prodvinutyj-kurs/pattern-active-record-v-php

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

Кому интересно - от прикреплённого урока идём дальше по навигации, и под конец получим что-то похожее на самую базовую работу Eloquent в Laravel. Можно заморочиться и прикрутить билдер запросов, анализ аннотаций и глубже разобраться в том, как этот вид ORM работает.
php.zone Паттерн Active Record в PHP Пример реализации паттерна проектирования Active Record на примере PHP.
Post #130 1.69K
Осенью нас порадует (а порадует ли?) новая версия PHP в стабильном виде. Много интересных RFC, вроде бы всё хорошо, но были моменты, которые мне сразу не понравились. Например - объявление и инициализация свойств класса в конструкторе, о чём я писал выше. Зачем?

Вчера на хабре вышла отличная статья от AlexLeonov - https://habr.com/ru/post/511266/
И заставляет задуматься, а действительно ли это то развитие языка, которое мы хотели? Что думаете по этому поводу?
Хабр Мне не нравится то, во что превращается PHP И я уже знаю, что скажете вы, глядя на заголовок статьи: — Кто ты такой? Почему ты позволяешь себе так говорить? Отвечу сразу, чтобы не было недомолвок: Я...
Post #129 1.78K
Ребята из mail перевели отличную статью о том, как golang работает с различными уровнями процессорного кэша - https://habr.com/ru/company/mailru/blog/510200/

По словам Джеки Стюарта, трехкратного чемпиона мира по гонкам Формулы-1, понимание автомобиля помогло ему стать лучшим пилотом: «Гонщику не обязательно быть инженером, но нужен интерес к механике».

Транслируя это правило на понимание работы железа и инструментов, с которыми мы работаем - можно значительно улучшить скорость работы наших программ.
В статье на простых примерах показывается, как хранятся данные в разных кэшах процессора и какие методы оптимизации существуют, чтобы добиться максимальной производительности при работе с кэшем. Лично я с удовольствием прочитал :)
Хабр Go и кэши CPU Источник: unsplash.com По словам Джеки Стюарта, трехкратного чемпиона мира по гонкам Формулы-1, понимание автомобиля помогло ему стать лучшим пилотом: «Гонщику не обязательно быть инженером,...
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →