• В чем разница императивного и декларативного подхода в javascript? Это процедурный и ООП стили?

    @pikkvile
    fullstack js developer
    Моё понимание такое.
    Декларативное программирование - это когда в коде описано что должно получиться, а императивное - когда написано как это сделать. Т.е. в первом случае мы совершенно не интересуемся, каким именно образом машина сделает работу, какие инструкции в каком порядке выполнятся и так далее, мы просто объясняем ей, что хотим увидеть в результате. Примеры декларативных языков - html, css, sql, конфиг nginx. Ещё тут стоит упомянуть функциональные языки (lisp, haskell), программы на них тоже, как правило, являются описанием (декларацией) того "что должно получиться". Ну, короче говоря, мы говорим компьютеру: вот смотри, мне надо чтобы было так, а как ты это сделаешь, мне не интересно. Аналогия такая: у меня есть чертёж бани, я даю его бригаде строителей и уезжаю. Как именно они там будут таскать брёвна, пилить доски и прочее - я не в курсе.
    Программируя императивно, мы описываем конкретные шаги, действия и точный порядок, в котором их нужно исполнять. Напрямую руководим процессом, непосредственно отдаём приказания. Примеров масса, большинство популярных языков императивны, в том числе и javascript. Ты пишешь: вот, сделай-ка переменную myVar, потом запиши туда число 5, повторяй это до тех пор, пока что-то не случится... и так далее. Возвращаясь к примеру с баней, ты теперь - начальник бригады, именно говоришь какое бревно куда класть.
    Что касается процедурного и объектно ориентированного стилей, это немного о другом. Я бы сказал, что это два разных способа писать императивные программы. В процедурном случае мы организуем код, наши команды (приказы машине) в виде процедур. Процедура - набор команд. Это довольно простой способ организации кода и исторически более ранний. ООП - это чуть более сложный подход к организации кода, когда мы группируем инструкции и данные, которыми они манипулируют, вместе. Объект - это состояние (данные) плюс поведение (набор методов). Но это уже немного другая история.
    Ответ написан
  • Есть ли способ объявить переменную при использовании UPDATE и ORDER BY?

    @Vitsliputsli
    Судя по поведению СУБД, функции (а по сути это CASE WHEN) вычисляются только один раз, отсюда и проблемы. Можно так:
    UPDATE tbl SET
            number=(@cnt:=@cnt+1) 
        WHERE !@cnt:=0
        ORDER BY id DESC

    запись ужасная, т.к. сразу не очевидно, что за чушь мы пишем в WHERE, но WHERE отрабатывает раньше, поэтому работает...
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    @khevse
    Однозначного ответа на данную задачу нет, потому что помимо сохранения консистентности данных могу быть дополнительные требования. Например:
    - таблица слишком большая, поэтому применяется шардирование (оно же партиционирование);
    - используется репликация с одним или несколькими ведущими узлами;
    - требуется линеаризация;
    - и т.д. и т.п. как по отдельности так и в совокупности.

    Могу только порекомендовать вот эту книгу (сейчас сам её дочитываю):
    https://www.piter.com/product/vysokonagruzhennye-p...
    В ней очень подробно расписана работа с системами работающими с большими объемами данных.

    Книгу нашел в вопросе:
    Книга по распределенным отказоустойчивым системам?
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

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

    Теперь представьте магию. Вы создаете заказ, который приводит к множеству параллельных, последовательных и очень сложно-разветвленных задач (резервирование на складе, отправка уведомлений, списание средств ит.п), в глубине которых что-то обламывается. Поскольку сервисы изолированы и почти ничего не знают друг о друге, надо всех причастных заставить вернуть "как было" через общий канал. Обломавшийся микросервис, зная ключ операции, кидает в шину сообщение "операция (id) не удалась, без подробностей". Далее все микросервисы: 1) откатывают операцию по id, если уже сделали 2) перестают реагировать на такой id, если еще не дошли запросы.
    Итого: система вернулась в первоначальное состояние в целостном виде.

    За все надо платить: на каждую операцию обязательно тесты и двойная работа по добавлению обратных операций, иногда нетривиальной логики (например, в части отправки сообщений). Если что-то пошло не так, должны быть очень качественные логи - отладчиком такое не пройти.
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    @stratosmi
    1) Это некорректное разбиение на микросервисы, вообще-то. Так как приводит к серьезной проблеме с производительностью. И то, ради чего на микросервисы разбивали - горизонтальное масштабирование - получается и что бесполезно.

    2) Если всё же вы решили забить на предупреждение из пункта 1), то - одно из решений - решается двухфазной транзакцией https://docs.microsoft.com/ru-ru/dotnet/framework/...
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    MetaAbstract
    @MetaAbstract
    Разработка интерактивных функциональных прототипов
    Координатор распределенных транзакций, а вообще говоря наверно блокчейн можно использовать)
    Ответ написан
  • Можно ли считать выполнение xmlhttprequest запроса работой в отдельном потоке?

    @Interface
    Дисклеймер:
    С веб-воркерами (и чем-то подобным) все и так понятно, поэтому далее я пишу вне их использования

    Ответ на ваш вопрос сильно зависит от понимания заголовка. Если мы говорим про браузер или какую-то его часть - то вполне вероятно это действительно работа в отдельном потоке. Только это работа браузера, а не javascript. Вот например статья про node.js https://codeburst.io/how-node-js-single-thread-mec... (достаточно прочитать Top Highlight)
    The main event loop is single-threaded but most of the I/O works run on separate threads, because the I/O APIs in Node.js are asynchronous/non-blocking by design, in order to accommodate the event loop.

    Таким образом про node.js можно сказать, что оно - многопоточное приложение. Но вот с точки зрения javascript-а, то есть как-бы изнутри него - node.js - однопоточный. Иными словами: весь JavaScript код и в браузере и в ноде позиционирует себя как однопоточное приложение. И исполняется так же. Но какие-то операции вне языка (I/O или тот же xhr) могут быть реализованы как угодно браузером. Это строго говоря вопрос больше про устройство среды исполнения.

    Я подвис, но мой ответ был, что JS можно считать многопоточным и я так предполагаю из-за наличия xmlhttprequest запросов (в простонародии ajax).
    - строго говоря это не так. Хотя мне кажется это не далеко от истины. Если мы поговорим, что язык многопоточный, я думаю мы имеем ввиду, что языком поддерживается работа с потоками, а не то как он устроен изнутри или как изнутри устроена среда его исполнения. Потому как какая-нибудь сборка мусора может выполняться в отдельном потоке, но это не делает сам ЯЗЫК много поточным.

    Вопрос: Относится ли WebAPI к движку JavaScript и корректно ли утверждать, что фактически xmlhttprequest выполняется в отдельном потоке от остального кода JavaScript?

    - Нет. Это API которое браузер предоставляет внутрь движка. Это можно проследить взяв например node.js и сравнив с браузерным js. Так, например, в node.js доступны внутренние модули (fs, http, path etc.)., а также другие фичи, такие как process.argv и так далее, в то время как в браузере есть WebAPI, например, fetch. При этом в браузере нет require('path'), зато в ноде нет fetch.

    И это при том что и браузер (chrome) и node.js работают на одном движке (V8).

    В node.js нет доступа к xhr, что уже может навести на мысли о том, что это не часть движка.

    Важное замечание: я думаю сравнивая node.js и браузер, можно сформировать какое-то представление о том, что из себя представляет чистый движок js, но тем не менее это не полностью достоверно. Потому как, например, и там и там есть совместимые друг с другом setInterval и setTimeout, однако (если мне не изменяет память) они не входят в движок.

    Если хочется четче понять где проходит граница, но не так сильно чтобы читать спеки - можно попробовать встроить движок самостоятельно. V8 или SpiderMonkey (в Firefox'е) умеют встраиваться в другие приложения и если встраивать их самостоятельно - и API внутрь движка (причем конкретной его реализации, а не абстрактного понятия) нужно будет прокидывать самостоятельно - тогда можно будет увидеть, что в голом движке не будет ни setTimeout, ни alert, ни console.log, ни document ни даже require и т.д.
    Ответ написан
  • Можно ли считать выполнение xmlhttprequest запроса работой в отдельном потоке?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Не относится.
    В спецификации языка ничего про XHR нет. Про WebWorker-ы, кстати, тоже. Это фичи исключительно платформы (браузер, nodejs, nashorn, etc...), а не языка. Да, XHR (возможно) выполняется в отдельном потоке, но этот поток порождается не движком JS, а браузером.

    JS — однопоточный и асинхронный. Это значит, что в один момент времени выполняется только одна функция, а если в этот момент из внешнего источника приходит просьба сделать что-то еще, то это "что-то еще" становится в очередь, пока текущий стек вызовов не опустеет. Например, если сделать setTimeout(fn, 1000), а потом запустить вычисление факториала от 100500, то fn вызовется, когда факториал посчитается, а не через секунду.
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    то что вы описали называется двухФазным комитом, раньше очень часто использовался.
    сейчас активнее используют похожий но немного другой подход, тоже связанный с тем что резервируют определенные ресурсы (например деньги на счету, и товар на складе) потом проверяют промежуточный статус операции, и потом проводят и подтверждают операцию - разница в том что ничего не перезаписывается а непрерывно все запросы логируется, и любые откаты операции идут через добавление новых записей-запросов в лог (он же и очередь сообщений)
    ----
    там много тонкостей, например вы говорили про время-метки, в целом метки времени добавляют - если нужно контролировать очередность промежуточных шагов (но обычно это не так важно, поэтому метку времени не всегда добавляют), но добавляют уникальный айди операции, тк в случае сбоя запроса (при например длительном ожидания ответа), может произойти "переотправка" запроса, и нам эта метка с уникальным айди позволяет не дублировать одну и туже операцию.
    =====
    есть тонкости например с тем, каким образом разделены эти микросервисы, может это просто дублирование одного и того же сервиса но например каждый из них обрабатывает запросы от разных сегментов пользователей, поэтому не требуется согласовывать какие-то операции между этими микросервисами.
    ====
    на мой взгляд - это вобще разводные вопросы не имеющие правильного ответа, схемы подбираются конкретно под проект и задачи, тем более если вы не разрабатывали какую-нибудь платежную систему, типа яндекс.денег то вообще бесполезно что-то обсуждать.
    это не камень в ваш огород, этим вообще обычно мало кто реально занимается, уверен те кто у вас это спрашивал сами мало что в этом понимают, а спрашивают такие вещи чтоб вас слить.
    Ответ написан
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    index0h
    @index0h
    PHP, Golang. https://youtube.com/index0h
    Если возникла проблема - очень большая вероятность того, что разделение на микросервисы было не корректным и стоит вернуться к монолиту.

    Что касается распределенных транзакций. Как минимум можно пытаться повторять запросы N раз, в противном случае откатывать на каждом из сервисов.

    Как вариант можно использовать всякие kafka для хранения истории сообщений с целью дальнейшего восстановления неотрботавших транзакций.

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

    Правильного варианта не существует. Все зависит от проекта
    Ответ написан
  • Как спарсить текст постов из Instagram по username?

    0xcffaedfe
    @0xcffaedfe
    Developer & Reverser
    api пробовали использовать, а не городить огород?
    Ответ написан
  • Есть ли в этом мире подходящий международный интернет-эквайринг?

    @boss_lexa


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

    От той платежной системы что у вас есть сейчас можно вот что сделать
    1) попросите чтобы вам открыли все страны на прием платежей
    2) отключите 3DS - не во всех странах знают как им пользоваться (потеря на конверсии в оплату), вырастит риск фрода - но его можно компенсировать например через api maxmind minFraud.
    3) при оплате картой валюта которой отличается, мастеркад и виза конвертируют валюты примерно на 3-4% выше от биржевого курса (у них на сайтах есть калькуляторы). Берите курс с openexchangerates и либо увеличвайте на сайте сумму в долларах, либо уменьшайте сумму в гривнах при оплате (на 3-4% чтобы у клиентов примерно столько списывалось сколько и должно быть)

    сам не пробовал но вот такю инфу нашел по самой простой форме компании в сша LLC в вайоминге
    зарегать LLC удаленно в вайоминге (нет налогов в штате) https://www.wyomingagents.com/llc
    получите EIN https://www.wyomingagents.com/wyoming-ein-number
    зарегаете payoneer
    зарегаете stripe и настроите вывод на payoner
    если есть возможность лучше конечно слетать и открыть счет в сша
    налог 20% с прибыли + небольшая фикс плата штату ежегодно
    если есть продажи в США нужно платить налог с продаж (размер налога от штата зависит)
    сервис для помощи с налогами https://taxfyle.com/

    тут процесс описан
    https://lhe.io/stripe-payoneer-integration/
    Ответ написан
  • Как расположить элементы по кругу?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    Делайте по такому принципу.
    Ответ написан
  • Где выгоднее жить программисту, в Москве или Новосибирске?

    mashletov
    @mashletov
    Math.random()
    Переехал в Москву с юга @ Отдаю 30% ЗП за квартиру.
    Планирую уйти из офиса на удалёнку и уехать куда-нибудь в село опять.
    Ответ написан
  • Как выбрать программиста с адекватной ценой за час?

    m77x
    @m77x
    Консультант
    Дмитрий, конечно я вас разочарую. В нашей ТП саппорт может отвечать сутки, просто перебирая чей-то говнокод и как итог - плюнуть на тикет и закрыть со словами Лаврова "д*билы б*я". Он же может по просьбе клиента за 10 минут из заготовок уже создать макет проекта на 100% рабочий.
    Как нам оплачивать ему работу в первом и втором случае?
    Ответ на поверхности: оклад.

    Отсюда вывод: не приглашать фрилансеров для работы, а заключать контракт на создание/ведение/обслуживание вашего проекта. Сейчас достаточно грамотных в техническом плане малых компаний, которые берутся за обслуживание и честно выполняют свою работу. Их регламент: оплата после выполнения, или с минимальной предоплатой. Уровень сложности вы описываете в ТЗ или вместе с вами специалист компании составляет ТЗ (техническое задание) и сроки. Приемка по акту. Если вас не устроила их работа - акт не подписываете и все.

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

    @cicatrix
    было бы большой ошибкой думать
    Знаете, это рынок.
    Представьте себе, не дай бог, у вас судебное разбирательство, и надо вам нанять адвоката. Один стоит 1000 р. в час, другой - 15000 р. в час. Как оценивать работу адвоката?

    Вообще, у программиста-фрилансера (как и у адвоката) должен быть опыт решения похожих задач в прошлом и лучше всего - рекомендательные письма / координаты предыдущих нанимателей, чтобы у них можно было поинтересоваться качеством его работы.
    Ответ написан
  • Как понять что перед вами Senior Developer?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Или как понять разработчику что пора выставлять"новый" тариф?


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

    gobananas
    @gobananas
    finishhim.ru
    Делаете ветку master, ветку dev и отдельные ветки под отдельные фичи.
    Делаете 2 сайта - один сам проект (основной) - на него выкатываете master, второй сайт тестовый - на него выкатываете ветку dev. Остальные ветки разрабатываете, сливаете с dev выкатываете на тест, если там всё нормально то dev сливаете с мастером. За ноут просто когда садитесь если мастер новый есть делаете git pull и стягиваете новую версию
    Ответ написан