• Как исправить ошибку доступа используя Capistrano?

    @Dimka5 Автор вопроса
    Так как сам новичок в этом, пишу ответ как для новичков.
    Я долго пытался сделать что то с паролями, учетными записями ос, но всё это не то.
    Из лога важно понять что идёт запрос с тестового сервера (где приложение) http://000.000.000.003/ на сервер с GitLab с репозиторием http://000.000.000.002/ и хочет он авторизоваться именно на аккаунте GitLab а не на учётке в ОС. Так же я заметил упоминание про SSH.
    В общем я перестал делать всё через пароли. Стал разбираться с SSH, прочитал про него тут https://losst.ru/avtorizatsiya-po-klyuchu-ssh. В общем его надо сгенерировать а потом в панели GitLab в настройках аккаунта добавить его
    Решение
    В конфиге Capistrano изменил ссылку external_url на SSH тип (её можно скопировать на странице репозитория в GitLab)
    git@000.000.000.002:root/nameproject.git
    Зашел на тестовый сервер 000.000.000.003, через удалённый доступ что бы можно было копировать текст.
    Выполнил команду для генерации ключей, нажимал просто Enter ничего не вводил
    ssh-keygen
    Нам нужен публичный, он сгенерировался зедсь, откроем его
    vi ~/.ssh/id_rsa.pub
    Скопируем содержимое файла и вставим в GitLab'е в
    Профиль в правом верхнем углу > Settings > слева список > SSH Keys

    и нажмём кнопку "Добавить ключ"
    Готово. Шаг развёртывания с авторизацией в удалённом репозитории должен быть пройден.
    Ответ написан
    1 комментарий
  • Django: Как в модуле django-bootstrap3 (django-bootstrap4) закрашивать поле при ошибке?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В общем нашёл интересный метод. Не скажу, что решение оптимальное, но оно выполняет свою задачу, хотя и является некоторыми "костылями" (на мой взгляд).
    Метод этот я назвал "Метод провоцирования ошибки, ну или назначения ошибки" :-). При этом (как мне кажется) этот метод будет работать во всех расширениях и в том числе и в чистом варианте Django.

    Суть в чём. Как бы говорим "а вот на этом поле ошибка". И бац всё срабатывает. Кстати вывод ошибки через raise вообще можно в этом случае отключить, а можно и оставить по желанию. В коде это всё выглядит очень просто. Вот так:
    def clean(self):
            username = self.cleaned_data['username']
            password = self.cleaned_data['password']
            password_check = self.cleaned_data['password_check']
    
            if User.objects.filter(username=username).exists():
                from django.forms.utils import ErrorList
                self._errors['username'] = ErrorList()
                self._errors['username'].append('Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!')
                # raise forms.ValidationError('Пользователь с данным логином уже зарегистрирован в системе!', code='user exists',)
    
            if password != password_check:
                from django.forms.utils import ErrorList
                self._errors['password'] = ErrorList()
                self._errors['password'].append(' ')
                self._errors['password_check'] = ErrorList()
                self._errors['password_check'].append('Вы ошиблись при вводе паролей, они не совпадают, введите повторно!')

    5ba79a5457a07845474039.png5ba79a810c0b3754369354.png

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

    5ba79b1c5b278976234283.pngНо всё-таки, как я уже сказал, метод не совсем оптимален, поэтому ищутся и другие варианты решения.

    p.s. да кстати, поле не будет выделяться, если не прописать в append ничего. Поэтому я там ставил пробел.

    p.s.2
    Решение 2. На мой взгляд оптимальное.
    и вот тут как говорить "за спрос денег не берут". Я через гугл переводчик всё это дело спросил на гитхабе у разработчика дополнения django-bootstrap3. И какая же была моя радость, что ответили быстро и точно. Единственное, чего в нём нельзя (ну или я пока не нашёл), так это сразу использовать и POP-up сообщение с красной формой. Но это уже совсем для искушённых. А решение такое:
    def clean(self):
            username = self.cleaned_data['username']
            password = self.cleaned_data['password']
            password_check = self.cleaned_data['password_check']
    
            if User.objects.filter(username=username).exists():
                raise forms.ValidationError({'username':'Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!'}, code='user exists')
    
            if password != password_check:
                raise forms.ValidationError({'password': '',
                                             'password_check': 'Вы ошиблись при вводе паролей, они не совпадают, введите повторно!'}, code='passwords do not match',)


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

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

    сорри за мед-скиллс в пейнте:
    n2YY4XVFoqv562.jpg
    Ответ написан
    3 комментария
  • Андроид после удаления и повторной установки приложения заполняет поля данными при запуске, почему?

    thelongrunsmoke
    @thelongrunsmoke
    Программист
    Потому, что данные приложения не удаляются автоматически, а сохраняются, на случай, если пользователь захочет вернутся. Это можно запретить в манифесте android:allowBackup="false", очищать кэш и данные можно самостоятельно, слушая android.intent.action.QUERY_PACKAGE_RESTART.
    Ещё лучше, использовать AccountManager, а не хранить всё подряд в БД.
    Ответ написан
    1 комментарий
  • Как бы вы начали обучение go?

    gobananas
    @gobananas
    finishhim.ru
    Обучение Go мало чем отличается от других языков.
    Я поставил себе Go на машину
    Написал hello world, запустил
    Написал скрипт для работы со строками посложнее - запустил
    Пощупал структуры в языке
    Поставил на сервер go нагуглил веб-сервер, запустил
    Поставил nginx, прокинул запрос к Go
    Ну и всё, дальше что хотите, то и пишите
    Ответ написан
    Комментировать
  • Начальное проектирование программ на Golang: нужен ли вам UML или что вы используете для наведения порядка?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы пытаетесь скрестить ежа с ужом.

    UML схемы действительно полезны, когда сразу уместить в голове сложную систему взаимодействия не получается. Например у вас есть 5 обособленных внешних систем со своими состояниями и вам необходимо спроектировать api между каждой из них. UML в этой ситуации вас очень выручит. Если в основном будете использовать sequence диаграммы - рекомендую смотреть в сторону PlantUML. Во всяких VisualParadigm на переделки (а они будут) вы потратите кучу времени, а с текстом в PlantUML это на порядки проще.

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

    Что касается Go - определяйте интерфейсы, а далее пишите под их реализацию. Так как интерфейсы утиные - вам ничто не мешает писать требуемые интерфейсы для ваших сервисов в пакетах этих сервисов, там же определяет интерфейсы для внешнего использования.
    Ответ написан
    1 комментарий
  • Как определить вхождение координат в определенную зону?

    Moskus
    @Moskus
    Используя Яндекс.Карты - никак, потому что, во-первых, у их API нет функций пространственных отношений, а во-вторых, они не предоставляют возможности скачать данные, которые созданы в конструкторе, в каком-либо стандартном картографическом формате.
    Но вообще, задача имеет решение - вы можете рисовать свою схему на geojson.io , экспортировать ее в Shape-файл, загрузить в базу SpatiaLite https://www.gaia-gis.it/fossil/libspatialite/index (См. список базовых рецептов тут www.gaia-gis.it/gaia-sins/spatialite-cookbook/inde... )
    А дальше вам нужно, используя SQL, проверять пространственное отношение между точками и областями загруженной ранее геометрии https://www.gaia-gis.it/spatialite-2.0/spatialite2... .
    Ответ написан
    Комментировать
  • Как функционально программировать для параллельных вычислений на C#?

    @khimalex
    Чисто функционально, как в F#, на C# будет сложно что-то сделать, а так:
    Как упоминалось - это PLINQ.
    А ещё метод Task.ContinueWith.
    Обратите внимание что лучше использовать в сочетании с Task.WhenAll, тогда будет параллельность.
    Не помню точно, но то ли Дж. Рихтер упоминал, то ли Ст. Клири, что Task создавали с прицелом на функциональный подход к разработке.
    Ещё есть TPL Dataflow и Rx.NET.
    Это более высокие уровни абстракции над Task.
    И всё это можно объединить как TPL.
    Ответ написан
    Комментировать
  • Можно ли восстановить исходники из apk?

    borisdenis
    @borisdenis
    Ленив и вреден...
    Одного dex2jar мало

    1. Качаем dex2jar-0.0.9.8.zip (номер версии может изменяться) и извлекаем все файлы в желаемую папку, например D:\Decompile .
    2. Качаем Java Decompiler, я использовал JD-GUI и извлекаем файлы для удобства в ту же папку, куда и dex2jar.
    3. Качаем apktool и apktool-install-windows-r04-brut1.tar.bz2 и извлекаем файлы уже в системную папку. По умолчанию C:\Windows. (Не забываем скачать второй архив)
    4. Берем нужный apk файл и кладем в папку с dex2jar и Java Decompiler. В примере приведу декомпиляцию приложения Прикрепленный файлCalculator.zip ( 66,18 КБ )
    5. . (надо извлечь из архива).
    6. Открываем Командную строку (Обработчик команд Windows) в вышеупомянутой папке (В папке по пустому месте при зажатой кнопке Shift нажимаем правую кнопку мыши и выбираем Обработчик команд Windows).
    7. Вводим команду dex2jar Calculator.apk и если все прошло хорошо, в той же папке появится файл Calculator.apk.dex2jar.jar
    8. Запускаем jd-gui и открываем полученный на предыдущем шаге файл. (На Windows 7 открывать с правами администратора и с совместимостью Windows XP SP3)
    9. Выбираем пункт меню File-Save All Sources и сохраняем.
    10. Извлекаем полученный zip архив.
    11. Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:\Decompile\Calculator\src\com\android)
    12. Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции
    13. Если все хорошо, тогда в указанной папке будут исходники в двух форматах (java и smali), ресурсы и файлы AndroidManifest.xml, apktool.yml
    14. Все готово, исходники получены. Правда после декомпиляции в коде есть, можно сказать, ошибки, я заметил пока только что вместо true и false стоят 1 и 0 соответственно.


    Взято с 4pda гуглится за пару секунд
    Ответ написан
    4 комментария
  • Что нужно иметь и знать в фреймворке React джуну?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Хороший кандидат на должность Junior React Developer, по моему мнению, должен соответствовать следующему перечню требований:
    1. Хорошее знание JavaScript. В React разработке используется ES6 и большинство экспериментальных фич еще не вошедших в стандарт.
    2. Хорошее знание HTML и CSS. Кроссбраузерная верстка. Так же, хорошо иметь представление о том, что такое css-in-js.
    3. Web APIs. Умение работать с объектной моделью документа(DOM) и все эти XMLHttpRequest, localstorage, cookie, history и прочее.
    4. Хорошее знание API React. Вы должны хорошо знать React, знать его возможности, понимать основные концепции и уметь ответить на большинство типовых вопросов. Для этого достаточно хорошо изучить документацию, разобрать пару типовых проектов на github и попрактиковаться. Много полезной информации, приёмов и идей можно подчерпнуть из тематических статей и докладов. Так же, на просторах интернета можно найти подборки типовых вопросов, часто задаваемых на собеседованиях. В англоязычном сегменте их больше.
    5. Redux. Уверенное знание API. API библиотеки до боли пост. Знать, что такое промежуточное ПО и зачем оно. Понимать базовые концепции архитектуры Flux. Все это есть в документации и многочисленных курсах.
    6. Умение работать с менеджером пакетов npm на базовом уровне.
    7. Node.js. Хотя бы уметь написать простейший express/koa сервер, который будет отдавать ваше приложение и статику.
    8. Webpack. Базовые знания.
    9. Умение работать с git. Хотя бы знать и уметь примерять команды: init, clone, add, commit, push, pull, merge, checkout.
    10. Иммутабельность. Четкое понимание зачем это надо. Знание приемов иммутабельного изменения структур данных. Это есть в официальном туториале React.
    11. Статическая типизация TypeScrpt/Flow. Для начала хватит самых основ и способности понимать чужой код.
    12. Функциональное программирование. Хватит знаний полученных в процессе изучения JavaScript, а так же не помешает знать, что такое каррирование, чистые функции и рекурсия.
    13. Базовые концепции ООП. Хватит знаний полученных в рамках изучения JavaScript.
    14. Асинхронный код. Понимать как его правильно организовывать. Promise, async/await.
    15. Сетевые протоколы передачи данных. Вполне хватит базовых знаний о http/https, о том, что такое заголовки и какие они бывают. Хорошо знать о том, что такое websocket.
    16. За плечами должен быть хотя бы один учебный проект на React. Хватит типового тестового задания.
    Примеры таких заданий: 1, 2, 3(сайт может быть не доступен на территории РФ, советую отрыть через VPN и посмотреть), 4, 5. Если подобного проекта у вас нет, то будьте готовы, что потенциальный работодатель предложит вам выполнить тестовое задание и только по его результату вас, может быть, пригласят на техническое интервью. Если напишите хорошо, вас скорей всего пригласят.
    17. Желателен опыт создания типовых UI элементов. Например, чтобы не вызывало трудностей написать простой кастомный чекбокс. Куча примеров реализаций типовых элементов есть на codepen.

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

    Похожий вопрос.
    Ответ написан
    18 комментариев
  • Как в symfony 4 разбить большую форму на вкладки?

    voronkovich
    @voronkovich
    Нужно просто вручную вывести поля формы в коде вкладок в шаблоне (How to Control the Rendering of a Form). Если это админка, и вы используете bootstrap, можете использовать табы: https://getbootstrap.com/docs/4.0/components/navs/#tabs.
    Основная проблема при использовании вкладок заключается в том, что вам нужно, чтобы после отправки формы текущая вкладка осталась открытой. Поэтому, нужно сохранять идентификатор текущей вкладки в хранилище браузера. Пример можете найти здесь: How to keep the current tab active on page reload ....

    Примерно так это может выглядеть:

    {% extends 'base.html.twig' %}
    
    {% block body %}
    <ul class="nav nav-tabs" role="tablist">
        <li class="nav-item">
            <a class="nav-link active" href="#general-tab" data-toggle="tab" role="tab" aria-selected="true">
                General
            </a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#security-tab" data-toggle="tab" role="tab" aria-selected="false">
                Security
            </a>
        </li>
    </ul>
    <div class="tab-content">
        {{ form_start(form) }}
        {{ form_errors(form) }}
        <div class="tab-pane active show" id="general-tab" role="tabpanel" aria-labelledby="general-tab">
            {{ form_row(form.field1) }}
            {{ form_row(form.field2) }}
        </div>
        <div class="tab-pane" id="security-tab" role="tabpanel" aria-labelledby="security-tab">
            {{ form_row(form.field3) }}
            {{ form_row(form.field4) }}
        </div>
        <button type="submit">Submit</button>
        {{ form_end(form) }}
    </div>
    {% endblock %}
    
    {% block javascripts %}
    {{ parent() }}
    <script charset="utf-8">
    $(function() {
        $('a[data-toggle="tab"]').on('show.bs.tab', function(e) {
            localStorage.setItem('activeTab', $(e.target).attr('href'));
        });
    
        var activeTab = localStorage.getItem('activeTab');
    
        if (activeTab) {
            $('.nav-tabs a[href="' + activeTab + '"]').tab('show');
        }
    });
    </script>
    {% endblock javascripts %}
    
    {% block stylesheets %}
    {{ parent() }}
    <style type="text/css" media="screen">
    .tab-pane:not(.show) {
        display: none;
    }
    .tab-pane.show {
        display: block;
    }
    </style>
    {% endblock  %}
    Ответ написан
    Комментировать
  • Как изучить язык баз данных SQL?

    akaish
    @akaish
    Стек Java\Android
    К сожалению, чтобы Вам что-то посоветовать - необходимо узнать Ваш личный "фундамент". Хоть указанная Вами книга и будет полезной (даже с учетом того, что она писалась для MySQL версии 4.х, фундаментально как в СУБД, так и в SQL и в конкретном синтаксисе MySQL последнее, наверно, десятилетие, ничего не менялось), я бы посоветовал следующий алгоритм обучения:

    1) Знакомство с основами реляционной алгебры, нормальными формами и реляционной моделью. Без фанатизма, прочтение и осознание статей даже на Википедии хватит за глаза.

    2) Знакомство с спецификацией SQL2008. Опять же, без фанатизма. В любом случае, работать Вы будете впоследствии с определенным диалектом языка.

    3) Выбор диалекта языка. Подбор литературы (практически любой, за исключением книг из серии "{0} для чайников" и "100 и одно решение для {0}"). На этом этапе важно определиться также с инструментарием, который Вы будете использовать в дальнейшем. Для начала подойдет любой онлайн интерпретатор SQL кода, к примеру sqlfiddle. Но по мере изучения Вам понадобятся более сложные инструменты.

    4) Знакомство с UML. Точнее, если по минимуму, с той частью, которая затрагивает прототипирование БД. SQL и СУБД - это инструменты, которые позволяют автоматизировать процессы бизнес логики. UML позволяет эти процессы описать и на основе этих процессов создать прототип схемы БД, от которого уже можно идти к конкретной реализации.

    Итак. Четыре базовых шага выполнены. Дальше все просто, перевариваете информацию и занимаетесь практикой от простого к сложному (в комментариях уже указывали вполне годные наборы задачек). Попутно узнаете особенности программной реализации выбранной Вами СУБД. И внимательно читаете документацию от разработчика. На примере SQLite, у них подробно разобрана семантика запросов: SQLite CREATE. Под MySQL найдете сами.

    Теперь поясню, почему все четыре шага важны.
    1) Без базовых фундаментальных знаний вы просто не поймете, почему, к примеру, в ячейке столбца номера нельзя указывать два номера телефона, или как работают ограничения на целостность данных.
    2) Хоть диалекты SQL и отличаются от стандарта SQL:2008, следует понимать, что знание стандарта позволит Вам в случае необходимости переключиться с одной СУБД на другую. Также, хорошая реляционная SQL СУБД должна быть совместима с этим стандартом априори.
    3) Тут на Ваш вкус. Посмотрите изложение автора перед покупкой, посмотрите списки того или иного программного обеспечения. Но факт остается фактом, что прочтение только стандартов, мануалов и официальной документации - путь явно не для всех. Кому-то просто необходимо "художественное" изложение, да и просто из книг можно почерпнуть реальные примеры из опыта автора.
    4) Надо понимать, что реляционные СУБД всего лишь инструмент для хранения и обработки данных, обеспечивающий определенные бизнес-процессы определенной предметной области. И под бизнес-процессами следует понимать не как какую-то эфемерную для простого человека вещь, а то, что закладывается под этим словом в оригинальном языке, т.е. совокупность процессов\действий, направленных на создание продукта\предоставление услуги. А средства UML позволяют все это описать в стандартизированной графической форме. Чтобы знать SQL не надо знать UML, не надо знать, что такое и, к примеру, ЖЦ программного продукта. Но со временем, если Вы захотите расти дальше, Вам нужен будет инструмент прототипирования. Также, как если вы дорастете до архитектора БД, вам нужно будет представление о том, как эти БД проектировать, начиная с описания предметной области и заканчивая организационной точкой зрения. Стандарты ГОСТ 34.601-90 и ISO/IEC 12207:2008.

    Я, как и многие, начинал с какого-то полу прочитанного учебника и примеров из сети. Сейчас я понимаю, что просто потратил время практически впустую. Как ни странно, хоть и принято ругать наше образование, но список курсов для специальностей "ПИ" подобран не просто так. Помимо самого языка следует знать математический "бэкенд" и как его использовать для реализации задач предметной области. Я отношусь к SQL потребительски, это не мой основной язык, но сейчас я понимаю, что если бы уделил ему больше внимания не как языку, а, в первую очередь, как к одному из инструментов СУБД, работающих на основе реляционной алгебры для обеспечения бизнес-процессов, я бы избежал кучу потерянного времени, костылей и ошибок. Надеюсь, мой ответ будет Вам полезен.
    Ответ написан
    3 комментария
  • Как изучить язык баз данных SQL?

    @poimanoo
    Я перед собеседованием на должность sql-джуна будучи полным нулем за ночь порешал задачки на этом сайте и на следующий день решил все предложенные задачи и был принят) Скажу так - я бы посоветовал порешать эти задачи, они там предлагаются по нарастанию сложности и подкреплены теорией, за которой вам не нужно лишний раз лезть в учебники. Уверяю, с каждым десятком решенных задач Вы будете чувствовать себя гуру sql) Спустя задачек 30, когда у Вас сформируется представление о том, что из себя представляет SQL на деле, тогда можно приступать к литературе, поверьте, после практики гораздо легче воспринимать материал, ибо уже имеется представление, о чем речь.
    По литературе(с небольшими пояснениями):

    1. Введение в системы баз данных(Автор C.J.Date) - на мой взгляд очень доступное и максимально компактное описание того, на чем базируется SQL, разжеваны основные понятия, рассмотрены нормальные формы, а после предлагаются задачки.

    2. SQL Полное руководство - тут понятно по названию, здесь можно найти описание всех возможностей. Ищите наиболее позднее издание(у меня третье, для примера, это 2015 год).

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

    Если вы выбрали MS SQL Server:

    1. Microsoft SQL Server 2012 Руководство для начинающих - там хоть и не сильно углубляясь, но описано почти все что нужно на начальных этапах. Там и про индексы, и про оптимизацию, и про бизнес-аналитику, в общем, рекомендую.

    2. Microsoft SQL Server 2012 Создание запросов - просто и исчерпывающе(на момент издания) о том, как можно и нужно писать запросы на t-sql(расширение sql для MS SQL Server) с закреплением материала предлагаемыми заданиями.

    Если Вы выбрали Postgresql, то официальное руководство там исчерпывающее.

    По Oracle и MySQL советов дать не могу, ибо дела не имел. Удачи!
    Ответ написан
    1 комментарий
  • Как увеличить производительность скрипта?

    igorzakhar
    @igorzakhar
    Разбор задачи на Reddit https://www.reddit.com/comments/zaa0v.
    Адаптировал под случай который указан в условии:
    прямоугольник определяется значениями (x1, y1, x2, y2), где (x1, y1) - верхний левый угол, (x2, y2) - правый нижний угол.
    x1,y1───────────┐
        │           │
        │           │
        │           │
        │           │
        └───────────x2,y2

    Алгоритм слудующий: находим сумму площадей всех прямоугольников и эту сумму вычитаем из площади полотна.
    Площадь прямоугольника, в нашем случае, равна (x2 - x1) * (y1 - y2).

    Случай 1. Прямоугольники не пересекаются.
    Прямоугольники (0,3,4,0), (4,7,7,3) и (7,3,10,0) будут выглядеть примерно так:
            * * * 
            * * * 
            * * *
            * * *
    * * * *       * * *
    * * * *       * * *
    * * * *       * * *

    Общая площадь этих трех прямоугольников проста для вычисления, это всего лишь сумма площадей каждого отдельного прямоугольника: (4 * 3) + (3 * 4) + (3 * 3)

    Случай 2. Прямоугольники пересекаются, общее пересечение имеют 2 прямоугольника.
    Рассмотрим три прямоугольника (0,3,4,0), (2,5,5,1) и (4,7,7,4):
            * * * 
            * * * 
        * * + * * 
        * * *     
    * * + + *      
    * * + + *      
    * * * *

    Вы видите, что прямоугольники пересекаются (области, где они пересекаются, отмечены символом "+" вместо "*"). Поэтому, если мы просто вычислим сумму площадей, как мы делали раньше, 12 + 12 + 9, мы получим слишком большое значение (33 вместо 28), потому что мы рассчитываем области с пересечением дважды.
    Чтобы получить правильный ответ, мы должны вычесть области, в которых пересекаются два прямоугольника: (12 + 12 + 9) - (4 + 1) = 28.

    Случай 3. Общее пересечение имеют сразу несколько прямоугольников.
    Рассмотрим прямоугольники (0,3,4,0), (2,5,5,1) и (3,3,0,6)
        * * *
        * * *     
    * * + x + *      
    * * + x + *   
    * * * + * *

    Теперь три прямоугольника перекрываются в точках, отмеченных символом "x" (как и раньше, знак "+", где перекрываются только два прямоугольника). Сумма площадей всех трех треугольников: 12 + 12 + 9. Затем мы должны вычесть сумму всех площадей, где пересекаются два прямоугольника 4 + 3 + 4 (прямоугольники 1 и 2 пересекаются в области с площадью 4, прямоугольники 1 и 3 пересекаются в области с площадью 3, и прямоугольники 2 и 3 пересекаются в области с площадью 4). Мы получили (12 + 12 + 9) - (4 + 3 + 4).
    Однако, вычитая все области пересечения двух прямоугольников, мы вычитаем область, в которой три прямоугольника пересекаются (обозначено "x"), три раза. Поэтому мы должны добавить площадь пересечения трех прямоугольников, чтобы получить правильный результат. Таким образом, общая площадь, покрытая прямоугольниками:
    A = (12 + 12 + 9) - (4 + 3 + 4) + (2) = 33 - 11 + 2 = 24

    Общее правило, на самом деле, довольно простое. Если S1 - сумма площадей всех прямоугольников, S2 - сумма всех областей, где пересекаются два прямоугольника, S3 - сумма всех областей, где пересекаются три прямоугольника, S4 - сумма всех областей, где пересекаются четыре прямоугольника и т.д., значение общей площади равно:
    A = S1 - S2 + S3 - S4 + S5 - S6 + S7 - S8 + ...
    Это известно в математике как принцип включений-исключений, потому что вы чередуете включение и исключение областей.
    Значения в нашем примере соответствуют:
    S1 = 12 + 12 + 9 
    S2 = 4 + 3 + 4  
    S3 = 2

    Пример вычисления с использованием рекурсии

    def bounding_box(rects):
        return (min(r[0] for r in rects),
                max(r[1] for r in rects),
                max(r[2] for r in rects),
                min(r[3] for r in rects))
    
    
    def area(rect):
        a, b, c, d = rect
        return (c - a) * (b - d)
    
    
    def clip(bb, rects):
        if not rects:
            return []
    
        (x1, y1, x2, y2) = rects[0]
        rs = rects[1:]
        (a1, b1, a2, b2) = bb
    
        if a1 == a2 or b1 == b2:
            return []
    
        if a1 >= x2 or a2 <= x1 or y1 <= b2 or y2 >= b1:
            return clip(bb, rs)
    
        result = [(max(a1, x1), min(b1, y1), min(a2, x2), max(b2, y2))]
        return result + clip(bb, rs)
    
    
    def cover(bb, rects):
    
        if not rects:
            return 0
        rc = rects[0]
        rs = rects[1:]
    
        (a1, b1, a2, b2) = bb
        (x1, y1, x2, y2) = rc
    
        top = (a1, b1, a2, y1)
        bottom = (a1, y2, a2, b2)
        left = (a1, y1, x1, y2)
        right = (x2, y1, a2, y2)
    
        sum_area = sum(cover(x, clip(x, rs)) for x in [top, bottom, left, right])
        return area(rc) + sum_area
    
    
    def main():
        width_canvas = 10
        height_canvas = 10
    
        rect1 = (0, 3, 4, 0)
        rect2 = (2, 5, 5, 1)
        rect3 = (3, 3, 6, 0)
        rs = [rect1, rect2, rect3]
    
        painted_area = cover(bounding_box(rs), rs)
        canvas_area = width_canvas * height_canvas
        unpainted_area = canvas_area - painted_area
    
        print("Canvas area:", canvas_area)
        print("Painted area:", painted_area)
        print("Unpainted area:", unpainted_area)
    
    
    if __name__ == '__main__':
        main()



    Код на GitHub Gist
    Код на GitHub с тестами
    Ответ написан
    Комментировать
  • Проблемы трудоустройства и свободного времени в it, насколько все плохо?

    @Katzuhiro_Akira
    Доброго времени суток. Все вопросы указанные в посте, сами по себе невозможно ответить прямо в абсолюте.

    Сама по себе профессия и специалист строится от отношения к работе и отношению к самому себе.
    Поэтому отвечу из своего опыта.

    Вы говорите о том, что такая работа может приносить удовольствие. Все зависит от точки зрения, кому и что нравится, но не стоит забывать о мире. Как минимум в профессии есть пару очень неприятных трудностей.
    1 - неправильное тз - таким образом не понятно, что от тебя вообще хотят.
    2 - всезнающие заказчики - типичные мозгоеды, которые непонятно чего хотят и не понимают даже принципов вашей работы
    3 - ДЕДЛАЙН`s - по большей части время исполнения ограничено сроками и всем плевать на сложности во время разработки(обычно редко что-то проходит гладко(из разряда: пропустил запятую и 3 часа искал где))
    4 - отношение к профессии - многие относятся к программистам принебрежительно ибо "мы просто нажимаем кнопки", а творческо-технический уклад жизни никого не интересует т к иногда приходится придумывать то, чего до этого вообще не было.

    Что касается заработной платы:
    Согласен, мнение разнится.
    Все зависит от многих факторов(как думают):
    - Навыки
    - Знания
    - Опыт
    - Коммуникабельность
    Дело в том, что от первых трех не зависит заработная плата программиста(от слова вообще) т к никто из нанимателей не сможет оценить твои знания лучше чем иной программист(ито не факт(если подходы отличаются)), поэтому важно умение договариваться. От того главная проблема: "будь ты хоть нинзя кода, то веселого дурочка ты не обойдешь".
    -- в моем случае, последнее намертво отсуствует, поэтому, для меня, важно портфолио.

    По поводу конкуренции:
    Вся конкуренция разнится от типа специалиста и языка/технологии. Одни более важны, другие менее востребованы, но все это мода, не более.
    Например: проекты, которые написаны с нуля стоят того ибо они более продуманы и целостны, но в текущее время нужны "кубики", которые быстро собираются, быстро приносят прибыль.. и быстро разваливаются.
    НО конкуренция в россии, на самом деле высокая. Мода на информационные техноогии сделала свое дело, поэтому сейчас множество "болтливых бездарей" окупировали рынок и это плохо. Общее мнение упало, цены упали, уровень среднего программиста упал ниже табуретки.

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

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

    -- Весь ответ это сугубо мое мнение.
    Ответ написан
    Комментировать
  • Как правильно использовать super()?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    1. Зависит от логики вашего кода. В некоторых случаях метод суперкласса можно вообще не вызывать.
    2. Прежде всего надо заметить, что требования передавать класс в вызов super относится только к Python2. В Python3 можно просто super().__init__(*args, **kwargs) Но если класс всё-таки передаётся, то это должен быть тот класс, в методе которого происходит вызов.
    Ответ написан
    1 комментарий
  • Как начать тестировать веб сайт с помощью WebDriver(Selenium) + Ruby, (GitHub Jenkins) технологий?

    @Talik0507
    Работаю, Живу
    В интернете достаточно много инфы по использованию селениум на различных языках.

    https://m.habrahabr.ru/post/247725/
    Как пример. Первая ссылка в гугле.

    Вообще есть тренинги у Алексея
    https://selenium2.ru/trainings.html
    Ответ написан
    Комментировать
  • Как реализовать многопользовательский доступ к проекту QGIS?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Сам проект QGIS это лишь описание какие слои открыть и как их покрасить. Тут не нужен многопользовательский доступ, один раз настроил и всем раздал.
    А многопользовательский доступ нужен к данным, а для этого их нужно разместить в базе данных, PostGIS например.
    Ответ написан
    1 комментарий
  • C# vs Java для удалённой работы за рубежом. Что востребовано?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Ориентироваться на зарплаты по языкам программирования - это полный идиотизм.
    Много платят за уровень специалиста, а не за язык.
    Найти опытного специалиста по PHP, который зарабатывает больше среднего специалиста по Java или C# - несложно.

    Поэтому пока вы годами будете выбирать и прыгать с одного на другое, кто-то другой уже приобретет опыт и устроится.
    Ответ написан
    Комментировать