• Куда движется профессия системного администратора?

    athacker
    @athacker
    Выбирайте то, к чему душа больше лежит. IT Ops останутся навсегда, какие бы облака там не парили над нами. Всё равно полно организаций, которые не доверяют потусторонним конторам хранение своих данных и обслуживание своей IT-инфраструктуры (и правильно делают). Особенно в свете развития законов и методик оповещения об утечках и т. п.

    IT Ops, на мой взгляд, поинтереснее (сам такой потому что), так как задачи разнообразнее. Но в DevOps, например, денег больше платят. Хотя в IT Ops сейчас тоже много из DevOps наприлетало -- Infrastructure as a Code, ansible/chef/puppet, хранение конфигов/плейбуков в VCS, вот это вот всё. И это действительно приводит к тому, что нужно меньше людей, чтобы управлять существенно бОльшими по размеру инфраструктурами. Но и квалификация этих людей тоже должна быть выше, и программерский бэкграунд какой-то тоже нужен. Потому что даже в IT Ops очень много автоматизации, которую нужно писать руками на Shell, Powershell, Python, смотря где как принято.

    Отдельный денежный сегмент -- это DBA. Oracle, PostgreSQL, MariaDB -- прокачанных DBA мало, и стоят они дорого. С другой стороны, рынок, где требуются DBA -- довольно узок. И чтобы не было проблем с поиском работы -- квалификация должна быть высокой.

    Есть ещё NetOps, т. е. сетевые инженеры. Но там сейчас грустно -- несмотря на то, что для работ в операторских сетях, например, нужна нефиговая такая квалификация и знание особенностей кучи вендорского железа (редко кто строит гомогенные в смысла вендора сетевого железа сети, в основном сборная солянка - -Cisco/Juniper/Mikrotik/Dlink/Huawei), но зарплаты там (по Москве) -- 90-100 тысяч. При этом практикуются ночные/выходные дежурства и всё такое. Можно найти прекрасные места, где сетевой инженер будет зарабатывать бОльшую сумму, но в целом -- как-то так.

    Если резюмировать -- в IT Ops ниже порог вхождения в целом. Т. е. можно найти работу, где не требуется серьёзная квалификация, но и денег будет соответственно.

    DevOps -- порог вхождения выше, т. к. DevOps подразумевает выполнение вполне конкретного набора задач, и для их выполнения уже вряд ли возьмут человека с улицы, надеясь, что он "по ходу разберётся" (а вот в IT Ops или даже NetOps в мелких и средних конторах ещё может прокатывать). Квалификация требуется выше, но и денег больше.

    DBA -- всё ещё сложнее, чем с DevOps. Рынок узкий, квалификация нужна высокая, но зарплаты тоже высоки, повыше DevOps, по моим наблюдениям.

    В чистый NetOps сейчас уходить... Ну такоэ... Есть крупные конторы, где этим можно нормально зарабатывать, но всё равно, квалификация требуется высокая, а денег относительно требуемого объёма знаний платят не так уж много. Вот IT Ops + NetOps -- это да, тут можно найти хорошую работу. Но для этого книжек придётся прочитать в полтора раза больше, чем отдельно IT Ops и в два раза больше -- чем отдельно NetOps :-)
    Ответ написан
    4 комментария
  • Что можно тянуть в одного на Java?

    @frozen_coder
    Java-developer
    Напишите файловый сервер с возможностью загрузки файлов через ftp-клиент, через web-морду, через SOAP ( или REST), через мобильную приложуху с аутентификацией, базой юзеров, также можно в базе хранить какую-нибудь метоинформацию о файле. Например, может быть такой маленький личный фотоальбом с подписями(блог-постами, комментами etc.), фотки из которого доступно скачать и залить повсякому. Попробуете всё.
    web и Java = Enterprise. Это приложения масштаба предприятия, т.е. они как-то автоматизируют его бизнес-процессы и документооборот, переносят его работу в web и электронный формат. Они также могут общаться с другими приложениями, системами. Отсюда пляшем. Вам нужно какое-то предприятие, у которого вся работа в оффлайн, всё плохо, бюрократия и ад. Придумайте сложный бизнес-процесс со сложными сущностями. Разный и изменяющийся во времени и пространстве уровень доступа. Интеграция с другими приложениями или гос.сервисами. Электронный банк, электронные платежи, электронная валюта. Наворотить можно много чего.
    Начните с малого - какой-нибудь справочник-реестр с функциями CRUD - создать, прочитать, редактировать, удалить запись. Далее прикрутите систему прав и ролей пользователей(не все могут создавать, редактировать и тем более удалять). Добавьте работу с файлами - скачать, загрузить, экспорт в pdf и exel. Продолжайте накручивать своё приложение функционалом - личка и чат, доска объявлений, имитация отношений начальник - подчиненный (тайм-менеджмент, таск-менеджмент, сбор отчетов каких-нибудь по работе), уведомления (в почту, в системе, м.б. попробовать с смс), напишите другую маленькую систему и заобщайте их между собой по SOAP или REST(например, другая система может читать из справочника и что-нибудь туда писать). Берите какое-нибудь гипотетическое предприятие (склад, магазин, автосервис, школа, больница, завод и т.д.) и представьте, что ему надо свой документооборот перевести в электронный вид и максимально автоматизировать бизнес-процессы.
    Из фреймворков - семейство Spring.
    Ответ написан
    6 комментариев
  • Как натренировать тестировщика?

    1) Пусть они пройдут любые курсы по тестированию (особо без разницы, какие - тестировать ручками - не ракеты в космос запускать).
    2) Напиши хорошие, жирные тест-кейсы на какой-то кусок функционала и скажи своим тестерам их прогнать несколько раз. А потом сказать "Все остальное, нужно проверять также".
    3) Как увидишь, кто из ребят бревно, кто сообразительный - давай сообразительному курс по тест-дизайну и сажай его писать тест-кейсы на весь функционал, а остальные уже пусть по ним все проверяют.
    4) Если хочешь автоматизацию, то найми того, кто это вам сделает. Когда будет каркас, с настроенным дженкинсом - уже будет их достаточно просто расширять (хватит базовых курсов по java/python).
    Ответ написан
    1 комментарий
  • C# vs Php. Что выбрать?

    @tiqq
    По личному опыту скажу, что C# и Visual Studio - это самый эстетически приятный тандем из всех, с которыми приходилось работать. C# прост, понятен и элегантен настолько, насколько это возможно.

    Касательно перспектив:

    Если в Ваших планах карьера программиста, то я бы однозначно посоветовал C# и .NET. Так как .NET-программистов значительно меньше, чем php-разработчиков, как следствие зарплаты значительно выше(но и вакансий меньше). Так же безусловным плюсом является то, что в случае с C# Вы не ограничены лишь веб-приложениями: на C#, помимо веб приложений, пишутся десктопные приложения, мобильные кроссплатформенные приложения(Xamarin), игры, о которых Вы упомянули, а это значит, что если, к примеру, какое-то направление Вам пришлось не по душе, Вы за гораздо меньшее время сможете переквалифицироваться. В случае же с php Вы имеете дело только с веб-приложениями.

    Если же Вы видите себя в будущем исключительно веб-ориентированным программистом, то, возможно, следует рассмотреть php. Бэкенд большинства веб-сайтов(особенно относительно простых) пишется именно на php, и, скажем, без работы Вы точно не останетесь, хоть и за в среднем меньшие деньги, чем если будете C#-программистом.

    Итог: я бы посоветовал C#. Погружайтесь в платформу .NET и становитесь экспертом. Удачи)
    Ответ написан
    3 комментария
  • Лучшие практики. Как закрыть главную форму из дочерней?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - не обязательно делать "логин" главной формой. можно стартовать главную форму скрытой, а форму логина дочерней, но показывать раньше, и дальше действовать в зависимости от успешности логина

    2 - конкретно в WinForms можно отрабатывать вообще разные формы последовательно

    using System;
    using System.Windows.Forms;
    
    namespace X
    {
        internal static partial class Y
        {
            /// <summary>
            /// Главная точка входа для приложения.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(A = new fmA());
                // bla-bla-bla with login
                Application.Run(B = new fmB());
            }
            internal static fmA A;
            internal static fmB B;
        }
    }


    3 - для WPF не подскажу, но наверняка оба подхода можно рассмотреть и пробовать искать аналогии

    ps для WinForms
    Как закрыть главную форму из дочерней?
    буквальный ответ - ни как, закрытие главной формы, это завершение Application.Run(A = new fmXXX()); и если вы не модифицирутете код Main- тогда это завершение программы
    Ответ написан
    2 комментария
  • Как использовать свои способности?

    inoise
    @inoise Куратор тега Карьера в IT
    Solution Architect, AWS Certified, Serverless
    Делайте то что нравится, но не отступайтесь перед трудностями. Я от многих слышал что у меня хороший мозг и все такое, что мне учиться проще чем другим и что я ленивая задница. И только я знаю что что бы там ни было у меня в способностях я каждую неделю сижу и изучаю новый материал, ставлю эксперименты и ищу "подходящий" мне путь. Прошел далеко не одну специальность в IT: делал сайтики, как вы говорите, работал на себя, был фронтом, бэком, лидом, руководителем, экспертом, сейчас вот архитектор и это далеко не конец.

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

    И да, в IT нельзя останавливаться в обучении. Прервал обучение на полгода - попал в догоняющий эшелон. И догонять вам не только технологии - вам ещё и себя самого догнать придется
    Ответ написан
    Комментировать
  • Как исправить ошибку доступа используя 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?

    Одного 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 с тестами
    Ответ написан
    Комментировать