• Как правильно реализовать continuous deployment для запуска миграций?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Ну все руками делается.
    Делаете каталог для файлов миграции и в нем какой-то главный типа control.sh
    в control.sh инклюдите актуальные файлы миграции
    Для дедупликации проще всего в базе сделать таблицу, в которую при миграции добавляется "дата, имя скрипта миграции, статус (completed/failed), и при выполнении скрипта миграции соответствнено он проверяет по базе выполнялся уже или нет, чтобы не запускаться вторично. Может быть какие-то скрипты наоборот нужно прогонять каждый раз, тогда можно в таблицу добавить колонку для такого флага.

    И все. При автодеплое конкретной версии - в ее ветке оно найдет в control.sh список миграционных скриптов, control.sh через базу данных может перепровить надо ли их запускать или пропустить, если они уже выполнились, или выполнить независимо от этого и сделает запись в базу о выполнении.

    Естественно контроль - ответственность разработчиков, магии тут не будет. И предполагается, что вы всегда деплоите более позднюю версию поверх старой.
    Ответ написан
    Комментировать
  • Какую специализацию выбрать при знании "по верхам"?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    блоггер
    курьер
    тиктокер
    коучер
    Ответ написан
    3 комментария
  • Кто сталкивался с ошибкой установки php amqp.dll в Windows Server 2019?

    @MasterCopipaster Автор вопроса
    Во общем, надо было зайти на GitHub и почитать инструкцию по установки там.
    Оказывается она ставится не так как обычно.
    After download, copy the rabbitmq.4.dll and rabbitmq.4.pdb files to the PHP root folder and copy php_amqp.dll and php_amqp.pdb files to PHP\ext folder
    Add extension=amqp to the php.ini file
    Check if the module is properly installed with php -m

    Надо было разместить файл rabbitmq.4.dll в корневой директории где установлен php после этого все заработало
    Ответ написан
    Комментировать
  • В каких приложениях Go существенно эффективнее чем Node.js и PHP?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Бенчмарки - это хорошо, но очень важно понимать что именно там меряли и почему результаты именно такие.

    Несколько лет назад я тоже делал бенчмарки Python, PHP, Node, Go.
    Для меня были важны две вещи:
    1 - скорость ответа сервера/кол-во запросов в секунду
    2 - объём сервиса в памяти, т.к. от этого зависит стоимость ресурсов

    На тесте, где сервисы не делали запросы в базу - из всех четверых лучше всего отработал Go с приличным отрывом, цифры, к сожалению, уже не помню.

    Но вся эта разница сошла на нет, как только добавился всего один простой SQL запрос в базу, в таблицу с 10 строками. И на этом фоне разница по скорости ответа была меньше 10%.

    Иными словами если ваш сервис работает с базой - критической разницы по скорости работы между Go/Rust/PHP/Node/Java, особо не будет.

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

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

    Один экземпляр Go занимал в памяти порядка 6мб RAM, при том, что Pytho+Django порядка 60мб.
    Node уже не помню сколько, но что-то близкое к Python'у.

    Вот тут уже, когда серверов у вас будет много - количество серверов с Go у вас будет в 10 раз меньше, соответственно расходы за эти сервера у вас будут в 10 раз меньше :)

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

    Где-то читал статью, что у людей было API на порядка 40 серверов на Node, после переписывания на Go - серверов осталось два, из которых второй запасной :)
    Ответ написан
    13 комментариев
  • Как запретить одновременные (одинаковые) входящие запросы на стороне API?

    @Quadrollionaire
    Не думаю что это лучшее решение, но как вариант.
    1) Вычисляете хэш (либо идентификаторов чеков, либо еще чего нить, но главное чтоб запрос можно было уникализировать)
    2) Добавляете это все в редис, rabbit, kafka (лучше кафка если нужна какая-никакая, гарантия, хотя с тем же редисом ее тоже можно достигнуть за счет правильного конфига)
    3) Создаете обработчики которые читают очередь и выполняют всю работу

    P.S.) Можете обойтись и без хэша просто записывая в редис обработанные чеки за последние пол дня к примеру и когда прилетает запрос, смотрите какие уже обработаны, их не добавляете в очередь, а те что новые - пускаете в дальнейший путь. В таком случае и уникализировать ничего не надо (гемора меньше)
    Ответ написан
    3 комментария
  • Насколько актуальна такая карта развития фронтенд?

    На мидла невозможно устроиться после 5м курсов. Мидл подразумевает под собой опыт, который курсы дать не могут.
    Раз вы уже работаете, то советую вам продолжать работать и изучать технологии, внимательнее смотреть на код вашего продукта и думать, что в нём можно улучшить. Думайте, какую задачу бы вам помог решить какой-нибудь новый модный Фреймворк.

    Если в вашей компании есть практика наставничества или грейдов, то посмотрите на неё. Ну и не забывайте про своих более опытных коллег - попросите их вас оценить, чтобы понять слабые стороны
    Ответ написан
    Комментировать
  • Timezone при отредактированном формате в моделе Laravel?

    Sanes
    @Sanes Автор вопроса
    protected function serializeDate(\DateTimeInterface $date)
    {
        return $date->format('Y-m-d H-i-s');
    }
    Ответ написан
    Комментировать
  • В чём отличие @Decorator от @Decorator()?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Декоратор - это функция, которой на вход подаётся функция и вернуть он должен тоже функцию. Например:
    @decorator 
    def foo():
     ..

    Эквивалентно foo = decorator(foo)

    Теперь про случай из вопроса. В качестве декоратора вместо обычной функции вы используете класс (точнее его объект):
    @FuncDec()
    def foo():
        print('Hello')

    Эквивалентно foo = FuncDec()(foo), а именно:
    • создаётся объект FuncDec (вызывается конструктор __init__)
    • этот объект вызывается (__call__) вместе с параметром foo
    • объект вернул функцию wrapper, которая и будет в дальнейшем выполняться вместо объявленной foo
    • профит

    Но если убрать скобки, то получится эквивалент foo = FuncDec(foo)
    То есть просто вызов конструктора, который у вас не принимает параметров - поэтому и ругается.
    Ответ написан
    Комментировать
  • Живы ли вэб-компоненты?

    Suntechnic
    @Suntechnic Автор вопроса
    Мой собственный ответ после изучения темы и чтения иностранных коллег будет таким:

    Технология была многообещающей и интересной на старте. Для ее поддержки гугл даже придумал отдельную спецификацию HTML Imports: https://w3c.github.io/webcomponents/spec/imports/i... (можете не ходить, там 404), что позволяло подключать однофайловые компоненты прямо в документ так:
    <link rel="import" href="my-component.html">
    Классно же да?

    Но технология не приобрела популярности, возможно так как была слишком простой и понятной, а именно в это время на пик славы вышел npm, gulp и вот это всё. В моду входила непонятная магия, утрата контроля над кодом и всякие оптимизаторы позволявшие сделать для одного слайдера на главной страницы бандл в полтора, а иногда 2-3 Мб. кода, и всё это без всяких там jQuеry.
    Ребята одумались и убрали спецификацию HTML Imports, предлагая разбивать компоненты на 3 отдельных файла - js, css и html с шаблоном. Причём js надо было подключать на странице, css тоже, а html должен был загружать по задумке создателей уже в само js. Такой подход позволял резко усложнить работу с web-components и сделать код снова неуправляемым, но было поздно - технология уже уступила позиции конкурентам.
    Конечно это был сарказм, если кто-то не понял.

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

    Короче технология по задумке хорошая, но на практике не применимая, поэтому широкого распространения и не получает.
    Ответ написан
    2 комментария
  • Как попасть на интервью или как найти работу Python junior/intern разработчиком?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    1. Если устраиваешься на работу в русско-язычную компанию, то и резюме должно быть на русском.
    2. Ты устраиваешься на работу программистом, а не деплоером приложений на хероку. Это хорошо, что твои приложения где то запущены, но работодателей интересует твой код, его и показывай.
    I like people, not only books. In my childhood I figured out that I should think about how
    other people feel, this led to desire to be a psychologist but after playing with computers I
    discovered that programming can solve so much more.

    Чет вообще в голос. Без обид, паста крутая. Какое она отношение имеет к твоим профессиональным качествам?
    3. Это хорошо, что ты перечислил книжечки, которые ты прочитал, но они должны быть ни как не в пункте твоих знаний.

    Из твоего резюме понятно только то, что ты умеешь чета там на хероку заливать, прочитал несколько книг и философствуешь на уровне пьяного одноклассника. Из 160 заявок 2 отклика с таким резюме - предел мечтаний. Посмотри в интернете примеры резюме, их куча.

    P.S. Зашел в git... Убери "Junior Python developer" и как минимум "Git" и "Flask" из навыков. Видно, что ты даже документацию Flask не осилил, вероятнее всего и с Django такая же ситуация.
    P.S.2. Если ты по гайдам с sqlalchemy разобрался - это не означает, что есть смысл пихать PostgreSQL в список навыков.
    Ответ написан
    Комментировать
  • Как можно защитить верстку?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Возможно ли как-нибудь защитить верстку, но и при этом чтоб сайт находился на хостинге, чтоб клиент мог потыкать посмотреть?

    Самый простой вариант- это привязать исполнение скриптов к домену. Это, конечно, никакая не защита, но при данной постановке задачи и не может быть 100% защиты, но от недалекого воришки спасёт.

    Иным вариантом может быть воздействие на нехорошего человека путём встройки некой приколюхи, которая через время, в случае неуплаты, проявит себя. Будь то просто "изчезновение" сайта, либо же надпись на странице о том, какой он мудила. Опять же, не защита, и требует дополнительных усилий, но в некоторых случаях сыграет вам на руку.

    А вообще с мудаками, действительно, не стоит водить дел. Но этот опыт приобретается только лишь самолично.
    Ответ написан
    6 комментариев
  • Стек технологий при переделке монолита на микросервисы?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    https://amphp.org/ и "прямые руки" архитектора.
    Ответ написан
    Комментировать
  • Кого пригласить для разработки онлайн системы школы подготовки к сдаче экзаменов?

    DanArst
    @DanArst
    Гриффиндор в моде при любой погоде!
    Для курсов и онлайн-школ есть отличное решение в лице Moodle.
    Есть руководства по установке Moodle на хостинг, интеграции с CRM, сервисами аналитики и тд.
    Если сами не справитесь, то любой более-менее разбирающийся фрилансер решит эту задачу
    Ответ написан
    1 комментарий
  • Можно ли упростить код?

    lxstvayne
    @lxstvayne
    Люблю Python
    Создай словарь с ключами "::<ваша уникальная эмоция>" и значением - соответственный смайл. Если эмоций на один ключ много, то делай значение-массив. Потом ищи в сообщении свою уникальную команду (ключ словаря : ) ) бери значение и делай с ним, что захочешь. Если есть повторение одного и того же кода, значит код стоит упрощать или выносить в функции. Такой код читается лучше. В вашем очень трудно разобраться
    Ответ написан
    Комментировать
  • Что должно быть сначала код ревью или тестирование?

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

    Исходя из этого - сначала ревью.
    Ответ написан
    Комментировать
  • Как поделить базу между микросервисами?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Но немаловажная суть микросервисов в том, что бы минимизировать зависимости, в том числе обеспечить каждый микросервис своей БД.

    Именно.

    Дублировать данные для каждого микросервиса нет никакого смысла.

    В микросервисной архитектуре в дублировании как раз есть смысл.

    Может быть вам просто не нужны микросервисы, какую проблему вашего проекта решает микросервисная архитектура? А может вы наоборот зря заморачиваетесь по поводу дублирования, какие проблемы у вас с ним?
    Ответ написан
    Комментировать
  • Можно ли сделать так, чтобы по клику на mash вызвалась определенная функция?

    wapster92
    @wapster92 Куратор тега JavaScript
    Вешаешь на весь канвас событие click, получаешь из event координаты курсора, при заданных условиях запускаешь нужную функцию.
    Ответ написан
    Комментировать
  • В PWA приложении, как заставить работать start_url файла webmanifest?

    Wacdis
    @Wacdis Автор вопроса
    PHP, Python, GO, Rust, NodeJS, SOA/MSA
    Блин, проблема была в том, что сам Chrome после установки открывал установленное приложение, но как-то не так (на MacOS, по крайней мере). После закрытия приложения, вновь открыв его, все загружается там где нужно. Вот код манифеста:
    {
    	"name": "Myapp",
    	"short_name": "Myapp",
    	"description": "",
    	"start_url": "/m/",
    	"display": "standalone",
    	"orientation": "portrait",
    	"theme_color": "#ffffff",
    	"background_color": "#ffffff",
    	"lang": "es-ES",
    	"serviceworker": {
    		"src": "https://domain.com/m/sw.js"
    	},
    	"icons": [
    		{
    			"src": "/inc/favicon.app.512x512.png",
    			"sizes": "512x512",
    			"type": "image/png"
    		},
    		{
    			"src": "/inc/favicon.app.192x192.png",
    			"sizes": "192x192",
    			"type": "image/png"
    		}
    	]
    }
    Ответ написан
    Комментировать
  • Как привлечь провайдера к ответственности?

    @egn_onegin
    Всем участвующим в беседе доброго времени суток!
    Зарегистрировался исключительно из-за данного поста.
    Небольшое лирическое отступление: работаю в support регионального isp, в связи с чем приходится постоянно общаться с подобными всезнающими геймерами.
    Поскольку предварительно я почитал ответы автора сабжа на некоторые комментарии аудитории, то отвечать постараюсь максимально доступным языком.

    morfianes
    Согласно предоставленной тобой лично трассировке winmtr (по хопам):
    1. твой роутер;
    2. какой-то неизвестный провайдерский хост, предположительно, закрытый по icmp;
    3. очередной хост на сети твоего провайдера (возможно, промежуточный коммутатор или иное, предположительно, активное сетевое оборудование);
    4. gateway твоего провайдера, с которого тебе непосредственно предоставляется доступ во-вне (в интернет) - на этом ЗО (зона ответственности) твоего провайдера ВСЕ!!!
    Вот, лять, прямо вообще ВСЕ, от слова СОВСЕМ!!!
    5. ЗО вышестоящего оператора!!!
    и т.д.

    Ты молодец!! Красава!! Ресспектую!!
    Нагуглил, а может и в Яндексе поискал и нашел, 2ip.ru на котором "пробил" принадлежность проблемного, по твоему мнению, ipшника, а именно 94.25.8.129, и, казалось бы, вот ОНО!!!
    Ipшник находится в адресном пространстве, принадлежащем твоему провайдеру, но...
    Правильно - ничего!!!
    Вот, лять, прямо вообще НИЧЕГО!!! От слова СОВСЕМ!!!

    Тот, факт, что, согласно нарытым тобой данным, ipшник принадлежит Ростелекому, ну, т.е. твоему провайдеру, вообще ни о чем не свидетельствует.
    Как правильно заметил support Ростелекома, о чем и тебе сообщил, ты даже скриншот с перепиской скинул, но головой подумать дальше видимо чего-то не хватило.

    Согласно данным whois, ресурс с этим ipшником находится в сети Prestig_Internet.
    Ничего не смущает, не?!

    А теперь так же банально, как ты 2ip.ru разыскивал, берем и гуглим, ну Яндексом пользуемся, (тебе что удобнее??) Prestig_Internet и первой ссылкой, по каким-то причинам, enforta.ru.
    Немного странно, конечно, но и к этому вскоре подойдем.

    Чуть ниже в результатах поиска, хотя... не утруждайся - прикладываю ссылку: https://www.list-org.com/company/704092
    Сам же ты все равно не найдешь.
    Переходим по ссылке, читаем и, о Боже!!, выясняем для себя следующее:
    - Организация ООО "ПРЕСТИЖ-ИНТЕРНЕТ"... наверное имеет прямое отношение к сети Prestig_Internet, по крайней мере это вполне логично предположить.

    По всей видимости у ООО "ПРЕСТИЖ-ИНТЕРНЕТ" в свое время не хватило адресной емкости, в связи с чем у Ростелеком, да-да, именно у твоего провайдера, просто напросто был куплен ipшник.
    Вот так просто!!! Взяли и купили у Ростелеком ipшник, прикинь, ля!!!
    Однако, полагаю, что данный ipшник Ростелеком просто взял и "зажал", т.е. данный адрес не является PI, т.е. провайдеро-независимым, но это ты потом загуглишь, ну или в Яндексе найдешь.
    По факту расторжения договорных отношений между ООО "ПРЕСТИЖ-ИНТЕРНЕТ" и Ростелеком его (ipшник), скорее всего, придется вернуть.

    Читаем далее:
    - Статус: ПРЕКРАЩЕНИЕ ДЕЯТЕЛЬНОСТИ ЮРИДИЧЕСКОГО ЛИЦА ПУТЕМ РЕОРГАНИЗАЦИИ В ФОРМЕ ПРИСОЕДИНЕНИЯ с 01 ноября 2017 года.

    И тут, казалось бы, все мои доводы рухнули, разлетелись в пух и прах, но... х... ты угадал!!
    Листаем ниже!!
    - Правопреемники: АО "ЭР-Телеком Холдинг" (брэнды Дом.ру и Энфорта, если, вдруг, ты не в курсе).
    Теперь более понятно, при чем тут Энфорта. Если все еще не понятно - читай далее.

    Таким образом получаем следующее:
    - ipшник принадлежит Ростелеком, ибо он не является PI (предположительно);
    - железо, которое работает на этом ipшнике, принадлежит АО "ЭР-Телеком Холдинг" - на основании данных list-org.com;
    - какие отношения в разрезе данного ip адреса между Ростелеком и АО "ЭР-Телеком Холдинг" мне вот прям до звезды фиолетово.

    Могу осмелиться предположить, что маршрутизация от тебя, а по факту от твоего роутера 192.168.0.1 (D-Link, наверное), до конечного ресурса, а именно 162.249.73.10, который, как бы, тоже нихрена не у тебя под боком находится, строится по принципу OSPF... а может BGP... а может... (да, простят и поправят, в случае ошибки, коллеги по цеху).
    Что такое OSPF/BGP потом загуглишь, ну или в Яндексе найдешь.
    Если не найдешь, привлекай Rambler к содействию.
    Конечно, мои предположения к фактически используемой маршрутизации на сети твоего провайдера, а так же точкам обмена трафика с другими операторами связи, остаются только предположениями, но... если... вдруг...

    Итого:
    - 212.48.195.0 - граница ЗО твоего провайдера (Вот, лять, прямо вообще КОНЕЦ!!! От слова СОВСЕМ!!!), с этого момента Ростелеком тебе должен/обязан (читай, как больше нравится) чуть меньше, чем ни...чего;
    - ресурс 94.25.8.129 фактически принадлежит АО "ЭР-Телеком Холдинг", несмотря на то, что ipшник находится в адресном пространстве Ростелеком, контакты ЭР-Телеком найдешь, тут уже совсем все изи;
    - менять маршрут ради тебя одного такого пи...дельного никто не станет - хлопотно;
    - почитай/ознакомься: https://habr.com/ru/post/134892/ - доступным для понимания языком написано;

    P.S. уж слишком дохрена вас таких... "интересных", платят 500рэ за 100М, а голову выделывают...
    Ответ написан
    6 комментариев
  • Super(). в Django, что это?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Стоит сначала выучить язык программирования Python прежде, чем браться за изучение фреймворков, написанных на нём.
    Ответ написан
    Комментировать