Задать вопрос
  • Чем SVN лучше Git?

    @miksir
    IT
    Основные отличия - гита от svn - распределенность и хорошая поддержка ветвлений в разработке (ветки).

    SVN, конечно же, поддерживает ветки, но при сложных ветвлениях (ветки мержатся между собой) случаются неожиданные конфликты и т.п. Хотя, если у вас классическая схема - фича-ветка от мастера (транка) и обратный мердж в мастер (транк) - разница почти незаметна.

    Про распределенность: у SVN центральный сервер, у гита - граф серверов, хотя 99% процентов разработчиков используют локальный репо + один удаленный, т.е. по сути - тот же центральный сервер. Зато, так как репа локальная, гит очень быстр в переключении веток.

    Есть еще куча различий и, как плюсов, так и минусов у каждого ПО. Хотя сегодня SVN все реже и реже можно встретить, но в общем для многих рабочих групп его вполне достаточно для полноценной работы. С другой стороны - знать git тоже обязательно сегодня, ибо почти стандарт ;)

    Если вот так на первый взгляд поискать "чем svn лучше"...
    • работа с бинарными файлами, и быстрее и есть централизованные локи по репозиторию (что важно, ибо мердж бинарного файла обычно не очень эффективен);
    • есть система управления доступом вплоть до веток;
    • комит определенного юзера этим юзером и подписан, тогда как в гите аутентификация и поле автора не связаны никак (впрочем, последние две проблемы можно пофиксить хуками);
    • порядок комитов явный, т.е. есть глобальный счетчик с номером у каждого комита, хотя, конечно, не так принципиально;
    • частичный чекаут, т.е. начиная с любого узла SVN, удобно, если много мелких проектов - не нужно несколько репозиториев, просто один с папками проектов в корне


    Но я бы не стал говорить, что svn нормальный, а git нет. Просто он другой и со своими тараканами. Сам долгое время работал на SVN, потом потихоньку перебрались на git в основном из-за подводных камней сложного ветвления.
    Ответ написан
    Комментировать
  • Postgres не обновил sequence при вставке с PK?

    @miksir
    IT
    В отличии от мускуля, где автоинкремент встроен в потроха на уровне движка, сиквенс - это просто некий отдельно лежащий счетчик

    Для того, что бы он работал как автоинкремент - нужно каждый раз получать значение конкретного счетчика, делается это путем назначения default значения на первичный ключ таблицы в виде вызова функции nextval.
    id integer NOT NULL DEFAULT nextval('"some_id_seq"'::regclass)

    default значение отрабатывает только если это поле не было передано во вставке или было передано со значением default.

    Т.е., если вы вставляете в таблицу в явным указанием id - default не выполняется, сиквенс не меняется. Так что в этом случае нужно явно проставить значение счетчика через setval
    Ответ написан
    Комментировать
  • Как технически получают КБМ (коэффициент бонус малус) у страховой?

    @miksir
    IT
    Все движения по ОСАГО (например, оформление полиса) в настоящее время страховые передают в единый реестр. Ну и КБМ тоже. Соответственно, оттуда он и запрашивается. Для страховых есть API
    dkbm-web.autoins.ru/dkbm-web-1.0/kbm.htm
    Ответ написан
  • Location в NGINX?

    @miksir
    IT
    location = / {
      root /var/www/main;
      try_files /index.html =404;
    }
    
    location / {
      /var/www/qwerty;
      try_files /index.html =404;
    }
    Ответ написан
    Комментировать
  • Как правильно сделать свой сервер GIT?

    @miksir
    IT
    1. git сервер, можно взять saas решения (гитхаб, гитлаб и т.п.) или сделать свой (самое простое - просто ssh доступ к серверу и сделанный там git init --bare)
    2. git clone на dev сервере
    3. Хук post-receive на git сервере, который сходит по ssh на dev сервер и сделает там git pull. В случае гитхаб и т.п. - смотреть их вебхуки и т.п. - и по их вызову уже делать git pull). Конечно, всякие миграции и прочее придется исполнять руками. Или брать системы деплоя уже и использовать их.
    Ответ написан
    Комментировать
  • Как настроить адресацию по домену в nginx на на разные локальные IP адреса в зависимости от домена к которому обращаются?

    @miksir
    IT
    1. Терминировать SSL на 192.168.0.2 и далее проксировать на 0.3 и 0.4, как указано в ответе ky0
    1.1 - проксировать по http, локалка все же... минусы - могут быть подводные камни с генерацией ссылок в приложении, нужно предпринять некоторые телодвижения для этого (зависящие от приложения)
    1.2 - проксировать по https, в минусах оверхед на установку дополнительного tls, может и не критично

    2. Проксировать не доходя до L7 уровня используя SNI для роутинга. nginx это делать не умеет, можно использовать haproxy https://www.haproxy.com/blog/enhanced-ssl-load-bal...
    Ответ написан
    Комментировать
  • Как установить более новую версию nginx-extras debian?

    @miksir
    IT
    В jessie-backports (https://packages.debian.org/ru/jessie-backports/ng... ) nginx-extras 1.10.3
    Ответ написан
    Комментировать
  • Ответственность за баги при нетривиальном поведении?

    @miksir
    IT
    Все очень просто. Требовать в ТЗ наличие тест-кейсов. Или составлять свой доп к ТЗ и утверждать его. По идее, это должны делать QA, но я так понял их нет у вас, так что делать вам.
    После этого - посчитать время в внести в бюджет затраты на автоматизацию этих тест-кейсов.

    Задача дергать все контролы - это не задача программиста. Если тимлид и руководство требует это от программиста - это просто самодурство и некомпетентность. Программисты тестировать свой код не умеют. Это аксиома.
    Ответ написан
    2 комментария
  • Symfony ApiDoc FOSRestBundle и NelmioApiDocBundle (swagger)?

    @miksir
    IT
    Пардон за предыдущий ответ, не совсем понял суть. Не, Nelmio этого не умеет. Он умеет только показывать версии объектов, если они используются с JMS Serializer. Частично отображение разных экшенов контроллера в зависимости от версии можно сделать через view.
    Ответ написан
  • Как использовать несколько ключей одного сервера в git?

    @miksir
    IT
    Битбакет, равно как и гитхаб используют ключ для определения имени пользователя. По-этому, User при SSH коннекте в этим серверам всегда один - git. Т.е. нужно убрать User jobsearch (или заменить на User git, да и в первом случае можно поставить User git).
    Далее, что бы ssh выбрал разные ключи, при подсоединении нужно указывать не имя оригинального хоста, а имя алиаса хоста (тот, что в Host). Т.е. git clone host_h2:/... и git clone host_h1:/...., ну или git clone git@host_h2:/... и git clone git@host_h1:/.... если в конфиге убрали User.
    Ответ написан
  • Как должен вести себя нормальный PM?

    @miksir
    IT
    Начните пользоваться трекером, хотя бы. Все задачи - через трекер. Задачи должны декомпозироваться на мелкие, до 8-16 часов, хотя бы. Приоритетом могут управлять менеджеры, хоть 10 - пусть сами дерутся. Принципиально не меняете задачу, не закончив ее (ну, за исключением хотфиксов). Но учитывайте , что тут больше к вам требований, чем к ПМ-ам - правильно декомпозировать проект, оценить задачу и выдержать время, и да, это тоже занимает время.
    А найти хорошего ПМ-а еще сложнее, чем хорошего программиста.
    Ответ написан
    Комментировать
  • Почему не отдаётся статика?

    @miksir
    IT
    Конфиг нормальный, все работает именно так, как вы написали. Запрос к / уходит на 127.0.0.1:8080. Запрос на /index.html попадает в другой локейшн и отдается статикой. Так как вы не описали, как же должна себя вести система, какие запросы должны быть статикой, какие - динамикой, то предложить другой конфиг возможности нет.

    PS;
    Вариант 1. Описываем / отдельным локейшеном точного совпадения
    root /home/www/files;
    
    location = / {
       index index.html;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    Запрос / попадет в "= /", там отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html, который попадет в "location ~ \.(html|css|js)$".

    Вариант 2. Просто проверяем наличие файлов на диске, и перебрасываем в ноду только если таковых нет.
    root /home/www/files;
    
    location / {
        try_files $uri $uri/ @nodejs;
        index index.html;
    }
    
    location @nodejs {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    В данном случае запрос попадает в "location /", там try_files проверяет наличие файла на диске или наличие такой директории. Наличие директории срабатывает (у нас есть на диске директория /home/www/files/), запрос остается в контексте location /, отработает модуль autoindex, проверит наличие /index.html на диске, и если найдет - сделает внутренний редирект на /index.html. Если же try_files ничего не нашло (например, на запрос /bla/bla/), то try_files делает внутренний редирект на свой последний аргумент - "именованный локейшн", в котором уже происходит работа с нодой.

    В принципе второй вариант даже где-то предпочтительнее, но если нужно поведение "перебрасываем на ноду по запросу /dir/file.txt даже если на диске есть /home/www/files/dir/file.txt" - то первый вариант.

    Оба варианта будут давать 404, если файл index.html убрать с диска. Если нужно поведение, что есть index.html - даем его, нет - уходим на ноду, то конфиг чуток меняем.
    Вариант 3
    root /home/www/files;
    
    location / {
        try_files $uri /index.html @nodejs;
    }
    
    location @nodejs {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~ \.(html|css|js)$ {
        access_log off;
        expires 30d;
    }

    Поменялся только try_files, теперь он не проверяет наличие директории, но проверяет наличие двух файлов, запрошенного (в случае запроса / - такого файла нет), и /home/www/files/index.html вне зависимости от URL запроса.
    Ответ написан
    2 комментария
  • Nginx + php7-fpm High load?

    @miksir
    IT
    5000 запросов в 1 секунду на PHP скрипт? Давайте начнем с PHP, может, а не с nginx. Считаете время ответа одного запроса T, считаете количество воркеров PHP N = 5000*T. Далее запускаете это число воркеров, делаете одновременные запросы на все воркеры и путем увеличения числа ядер процессора добиваетесь времени ответа сервера такого же, какой был на одном воркере. Ну, это без учета того, что если используется СУБД - ее время ответа тоже нужно будет исправлять на заданной конкурентности. Не хватает ядер, добавляем сервера.
    Ответ написан
    4 комментария
  • Безопасность банковских карт?

    @miksir
    IT
    1) На некоторых интернет магазинах не требуется никакого подтверждения смс кодом или еще как-то.

    1) Так называемое 3ds (подверждение смс) - способ защиты мерчанта от фрода. В случае вашего несогласия с платежом (опротестование через банк) при отключенном 3ds - убыток несет мерчант. Если мерчант поддерживает 3ds - ответственность перекладыватся на владельца карты. Т.е. если у вас увели данные карты и купили через 3дс - у вас хороший шанс опротестовать и получить деньги назад (хоть это и займет много времени). Если 3дс был (у вас увели телефон или посадили вирус или как-то узнали код) - вернуть ничего не получится. Почему не все мерчанты поддерживают 3дс? Ну, например почитайте https://habrahabr.ru/company/badoo/blog/234677/ - там есть цифры, как 3дс уменьшало продажи.

    Вопрос: что можно сделать с картой, имея лишь ее номер и зачем, если это небезопасно, банки выбивают номер на самом видном месте?

    2) Сейчас почти ничего, мест, где можно провести операцию только по номеру карты без какой-то дополнительной верификации - почти не осталось. Я бы не стал светить номер карты везде в интернете, но и скрывать номер от друзей/начальника и т.п. смысла нет. А вот CVV код (на обратной стороне) стоит спрятать (лучше всего переписать и затереть нафиг). Опять же, если уведут номер карты + cvv - скорее всего такие платежи можно будет опротестовать, но нафига вам лишний гимор.

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

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

    @miksir
    IT
    1. Далеко не все базы умеют unsigned.
    2. Первичный ключ может быть отрицательным, почему нет, можно руками добавить.
    3. unsigned может доставить проблем с языком программирования, у которого нет unsigned типов и такой же размер int.
    4. И самое главное - да пофиг
    Ответ написан
    2 комментария
  • Существует ли мессенджер/онлайн консультант с поддержкой веток обсуждений?

    @miksir
    IT
    Любой мессенджер с каналами. Jabber, IRC. Из популярных продуктов - Slack.
    Ответ написан
    Комментировать
  • Почему не работает CHROOT с php-fpm?

    @miksir
    IT
    chroot - это смена корня ("/") файловой системы. PHP переключившись на новый рут ничего не знает об уровнях выше, для него корень теперь - /var/www/mysite.com/fileman. Т.е. когда вы говорите - выполни скрипт fastcgi_param SCRIPT_FILENAME /var/www/mysite.com$fastcgi_script_name; - он ищет от своего нового корня, а значит реально по файловой системе он ищет файл /var/www/mysite.com/fileman/var/www/mysite.com$fastcgi_script_name

    Если вы не понимаете, зачем вам чрут - лучше не использовать. Там может возникнуть много нюансов.
    Ответ написан
    Комментировать
  • Возможно ли на PHP организовать многострочный поиск без регулярок?

    @miksir
    IT
    $needleLen = strlen($needle);
    $pos = -$needleLen;
    while ( ($pos = strpos($haystack, $needle, $pos+$needleLen) !== false) {
    // ...
    }
    Ответ написан
    Комментировать
  • Nginx: proxy_protocol + обычное соединения + X-Real-IP header, как заставить работать совместно?

    @miksir
    IT
    Интересно. Пока вижу только два варианта. 1) не использовать прокси протокол, а просто ставить на haproxy заголовок X-Real-Ip и его расшифровывать на nginx. 2) Описать два сервера на разных портах, один для прокси протокола на кастомном порту, другой для обычных 80/443.
    Ответ написан