• Какие приложения в jira (или другой софт) помогают отслеживать эффективность программиста?

    vabka
    @vabka
    Токсичный шарпист
    Как отличить добросовестного программиста от плохого?

    Обычно для этого существует перфоманс ревью и всякие опросы 360. Если коллеги говорят, что всё збс, подкрепляя это фактами, то скорее всего так и есть.

    Коллеги, как вы следите за эффективной работой?

    Мы например делаем естимейты в стори поинтах и следим за team velocity и burndown chart
    В жире вроде из коробки можно смотреть, как стори поинты сгорают.
    Ещё можно попробовать внедрить kanban и выставить WIP-limit, чтобы одновременно в работе задач было на 1 или 2 меньше, чем разработчиков есть - тогда "лишние" могут тратить время на то, чтобы помогать "отстающим".
    На дейликах можно примерно находиться в курсе о том, какой статус по задачам.
    Можно ещё замерять lead time - сколько примерно времени проводит задача в определённых статусах (независимо от затраченного времени)
    О том, что происходит в коде, должен заботиться тимлид, а не ПМ.
    Ответ написан
    1 комментарий
  • Почему браузер скрывает всё что выше якоря?

    Newto
    @Newto
    Потому что якорь для того и существует, что бы при переходе пользователь увидел тот контент, что помечен якорем (id элемента в HTML). Когда такой элемент где-то наверху страницы, то браузер автоматом скролит страницу до этого элемента. А если внизу, то браузеру просто скролить некуда.
    Ответ написан
    4 комментария
  • Как управлять яндекс-лампочкой в обход апи яндекса?

    @justslipknot Автор вопроса
    Как выяснилось, яндекс лампочки - это ребрендированная Tuya лампочка. У Tuya есть локальный протокол и модуль для Home Assistant. Но я решил вопрос немного иначе:
    1. Устанавливаем приложение Smart Life или Tuya Home (оба совместимы с яндекс лампами)
    2. Сбрасываем настройки лампочек и добавляем их в приложении Smart Life / Tuya Home
    3. Регистрируем приложение на платформе Tuya. Инструкция есть в этом репозитории.
      Пояснение
      Этот шаг нам нужно проделать, чтобы получить Local Key, который требуется для шифрования и расшифровки запросов (Local Key, как я понял, обновляется после сброса настроек). Инструкция, как быстро добавить устройства в приложение платформы Tuya так же представлено в репозитории

    4. Выбираем библиотеку для работы с Tuya local api. Я выбрал вот эту библиотеку для C#. На GitHub странице этой библиотеки есть инструкция по работе с Tuya local api.
    5. Реализуем нужный нам функционал


    Небольшой топорный пример из моего тестового проекта:
    Поиск устройств Tuya в сети

    // Эти данные можно получить на странице вашего приложения на платформе Tuya.
    var accessId = "<access id>";
    var apiSecret = "<api secret>";
    
    // Сканируем сеть на наличие доступных устройств Tuya. 
    // Хранение найденных устройств реализуется как душе угодно
    
    var scanner = new TuyaScanner();
    scanner.OnNewDeviceInfoReceived += (sender, info) =>
    {
       // логика сохранения найденных устройств 
    };


    Получение Local Key


    Самый важный этап.
    Пример взят из репозитория библиотеки
    var api = new TuyaApi(region: TuyaApi.Region.CentralEurope, accessId: ACCESS_ID, apiSecret: API_SECRET);
    var devices = await api.GetAllDevicesInfoAsync(anyDeviceId: DEVICE_ID);
    foreach(var device in devices)
    {
        Console.WriteLine($"Device: {device.Name}, device ID: {device.Id}, local key: {device.LocalKey}");
    }


    Отправка команд устройству

    var device = new TuyaDevice("<IP адрес>", "<local key>", "<device id>");
    
    // Пример команды включения лампочки
    // Метод FillJson автоматически подставляет нужные параметры, поэтому сразу пишем запрос.
    // Про методы DPS можно почитать в официальной документации Tuya
    var onCommand = device.FillJson("{\"dps\":{\"20\":true}}");
    
    var request = device.EncodeRequest(TuyaCommand.CONTROL, onCommand );
    
    // Посылаем сигнал. Если устройство не ответит, то падает исключение 
    var encodedResponse = await device.SendAsync(request);
    var response = device.DecodeResponse(encodedResponse);



    Далее остаётся разобраться с кодами команд и можете контролировать лампы как вам угодно.
    Ответ написан
    3 комментария
  • Реально ли работать в одном IT-проекте (продуктовом) больше 5-ти лет и не деградировать профессионально?

    В одном проекте можно, в другом нельзя; одному программисту можно, другому нельзя. Если человек хочет развиваться, вы его не остановите. Если не хочет - не заставите. Проект может помогать или мешать, но сам по себе определяющим фактором почти не является. Собственно, вы сами это подтверждаете своим bio:
    Несмотря на долгий срок работы в проекте, нахожу новые интересные задачи, которые не позволяют заскучать.


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

    @rPman
    Вводи выводи криптовалюты.

    Юридически пока еще можно 'выбрать юрисдикцию' где это либо законно либо не затрагивает законодательство по причине ее закостенелости.
    Ответ написан
    Комментировать
  • Возможно ли сделать прозрачную MITM атаку (без промежуточного ip)?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    Внимание! Изменился адрес почты!
    Возможна :)

    Вы описали сценарий работы корпоративного прокси с бампингом :) Правда, для его работы нужно одно, но крайне существенное условие - на компьютере 1.1.1.1 в доверенных корневых сертификатах должен находиться сертификат/CA сертификата, который будет использоваться на 3.3.3.3

    Иначе не получится нифига, потому что у Вас нету сессионного ключа, Вы не сможете "подделать" соединение между клиентом и Вами.

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

    @Programmir
    Вначале делаешь табы, потом у каждого таба делаешь табы.
    Ответ написан
    Комментировать
  • Какой сброс будет лучше для css?

    valgerofficial
    @valgerofficial
    Десигнер LVL100
    Вот так

    *,
    ::before,
    ::after {
        padding: 0;
        margin: 0;
    
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
             -o-box-sizing: border-box;
                box-sizing: border-box;
    }
    
    html {
        -webkit-text-size-adjust: 100%;
        -ms-text-size-adjust: 100%;
        -webkit-font-smoothing: subpixel-antialiased;
        text-rendering: geometricPrecision;
    }
    
    body {
        margin: 0;
        padding: 0;
        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Helvetica Neue, sans-serif;
    
        -webkit-font-smoothing: subpixel-antialiased;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
        -webkit-touch-callout: none;
    }
    
    html,
    body {
        height: 100%;
        min-height: 100%;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0;
    }
    
    html,
    body,
    article,
    aside,
    details,
    figcaption,
    figure,
    footer,
    header,
    hgroup,
    main,
    menu,
    nav,
    section,
    summary {
        display: block;
    }
    
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {font-weight: 400;}
    
    h1  {font-size: 2.2em;}
    h2  {font-size: 1.9em;}
    h3  {font-size: 1.65em;}
    h4  {font-size: 1.4em;}
    h5  {font-size: 1.2em;}
    h6  {font-size: 1em;}
    
    audio:not([controls]) {
        display: none;
        height: 0;
    }
    
    [hidden],
    template {
        display: none;
    }
    
    a {
        background: transparent;
        text-decoration: none;
        cursor: pointer;
    }
    
    a:active,
    a:hover {
        outline: 0;
    }
    
    img {
        border: 0;
    }
    
    ul,
    li {
        outline: 0;
        border: 0;
        list-style: none;
    }
    
    abbr {
        cursor: help;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, smcp 1, c2sc 1;
    }
    
    abbr[title] {
        text-decoration: none;
        border-bottom: 1px dotted;
    }
    
    b,
    strong {
        font-weight: 700;
    }
    
    dfn {
        font-style: italic;
    }
    
    mark {
        background: #ff0;
        color: #000;
    }
    
    time {
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0;
    }
    
    small {
        font-weight: 400;
        font-size: 80%;
    }
    
    sub,
    sup {
        font-size: 75%;
        line-height: 0;
        position: relative;
        vertical-align: baseline;
    }
    
    sup {
        top: -0.5em;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0, sups 1;
    }
    
    sub {
        bottom: -0.25em;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0, subs 1;
    }
    
    svg:not(:root) {
        overflow: hidden;
    }
    
    hr {
        height: 0;
        -webkit-box-sizing: content-box;
        -moz-box-sizing: content-box;
        box-sizing: content-box;
    }
    
    pre {
        overflow: auto;
    }
    
    code,
    kbd,
    pre,
    samp {
        font-family: "Source Code Pro", Consolas", "Courier New", SFMono-Regular, Menlo, Monaco, monospace;
        font-size: 0.8em;
        font-feature-settings: kern 0, liga 0, calt 1, dlig 0, pnum 0, tnum 1, onum 0, lnum 1, zero 1;
    }
    
    button,
    form,
    input,
    optgroup,
    select,
    textarea {
        outline: 0;
        color: inherit;
        font: inherit;
    }
    
    button,
    select {
        border: 0;
        text-transform: none;
    }
    
    button,
    html input[type="button"],
    input[type="reset"],
    input[type="submit"] {
        -webkit-appearance: button;
        cursor: pointer;
    }
    
    button:not(:disabled),
    [type="button"]:not(:disabled),
    [type="reset"]:not(:disabled),
    [type="submit"]:not(:disabled) {
      cursor: pointer;
    }
    
    button[disabled],
    html input[disabled] {
        cursor: default;
    }
    
    button::-moz-focus-inner,
    input::-moz-focus-inner {
        border: 0;
    }
    
    input {
        line-height: normal;
    }
    
    input[type="radio"],
    input[type="checkbox"] {
        box-sizing: border-box;
        padding: 0;
    }
    
    input[type="number"]::-webkit-inner-spin-button,
    input[type="number"]::-webkit-outer-spin-button {
        height: auto;
    }
    
    input[type="search"] {
        -webkit-appearance: textfield;
        -moz-box-sizing: content-box;
        -webkit-box-sizing: content-box;
        box-sizing: content-box;
    }
    
    input[type="search"]::-webkit-search-cancel-button,
    input[type="search"]::-webkit-search-decoration {
        -webkit-appearance: none;
    }
    
    input[type="color"],
    input[type="date"],
    input[type="datetime"],
    input[type="datetime-local"],
    input[type="number"],
    input[type="range"],
    input[type="tel"],
    input[type="week"] {
        font-feature-settings: kern 0, liga 1, calt 1, pnum 1, tnum 0, onum 0, lnum 1, zero 0;
    }
    
    fieldset {
        border: 1px solid silver;
        margin: 0 2px;
        padding: 0.35em 0.625em 0.75em;
    }
    
    legend {
        border: 0;
    }
    
    textarea {
    	resize: vertical;
        overflow: auto;
    }
    
    optgroup {
        font-weight: 700;
    }
    
    table {
        border-collapse: collapse;
        border-spacing: 0;
    }
    
    tbody,
    caption {
        font-feature-settings: kern 1, liga 1, calt 1, pnum 0, tnum 1, onum 0, lnum 1, zero 1;
    }

    Ответ написан
    Комментировать
  • Зависает :hover при нажатии на мобильных устройствах как этом можно иправить?

    yupiter7575
    @yupiter7575
    Python программист
    В чем смысл добавлять наведение на экранах где по определению не может быть наведения? Врятли это можно исправить, просто уберите через media запросы - лучше спать будете
    Ответ написан
    1 комментарий
  • Стоит ли в 2к20 брать мак на High Sierra?

    DevMan
    @DevMan
    деньги как раз там вполне адекватные - есть очень мало ноутов, способных пободаться с макбуками по цена/характеристики.

    последняя ось - дело вполне решаемое.
    но, если вопрос только в деньгах и знакомстве с макосью, то угорать по макам - последнее дело.
    Ответ написан
    8 комментариев
  • Social network на Wordpress хорошо или плохо?

    Как обстоят дела с оптимизацией при большом количестве юнитов?

    Рано задумываться над оптимизацией. Ваш проект скорее всего не взлетит, поэтому вордпресс тут идеально подойдет.

    Болен идеей ВП.

    Надеюсь это пройдет. Есть люди которые до сих пор пишут сайты на друпале и это у них не прошло к сожалению.
    Ответ написан
    Комментировать
  • Как закрыть доступ к сайту и настроить инвайты?

    DevMan
    @DevMan
    да фигня вопрос - прост при регистрации спрашиваем код инвайта.
    элементарно реализуется на любом яп'е.
    Ответ написан
    2 комментария
  • Нужен ли диплом программисту?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Раньше диплом "говорил" всем, кто его просил показать: "он хорошо учился и у него есть знания для работы по направлению...".

    Сейчас - стало так: "он хорошо учился и у него были знания по направлению..., но это не точно, они могут быть неактуальны и нужно всё снова проверять".

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

    Остальное - сейчас абсолютно непредсказуемо и вероятность отказа соискателя без диплома напрямую зависит от эволюции той или иной структуры.

    Лучше - чтобы какой-никакой, но он был.
    Ответ написан
    Комментировать
  • Бросать исключение или возвращать коды ошибок/успеха? Является ли исключением то, что метод не может выполнить свою задачу?

    Adamos
    @Adamos
    Пока вы вызываете одну функцию и решаете, что делать с ее ответом, вы не поймете исключений.
    Вот когда вам надо будет вызвать функцию, которая вызывает методы класса, которые вызывают методы других классов - вы либо изрисуете себе все стены теми вариантами ошибок, которые каждый из этих методов может вернуть, либо поймете, как это прекрасно - просто поймать исключение, если что-то пошло не так, и не париться с тем, что и где именно.
    Ответ написан
    3 комментария
  • Как изучать node js в 2019м?

    Начните сначала с клиентского JS и пускай learn.javascript.ru будет вашей библией на это время.

    Изучать нужно также, как и любое другое ремесло — практика и теория, при этом практика в случае с программированием должна преобладать.

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

    Не пытайтесь найти универсальный ответ в данном вопросе.
    Ответ написан
    Комментировать
  • Как сделать из домашнего пк сервер VPS?

    Zoominger
    @Zoominger
    System Integrator
    хочу сдать его в аренду по типу: VPS/VDS

    Не возьмёт абсолютно никто.
    Ну разве что какой-нибудь школьник для серверов Майнкрафта.
    Затея обречена на провал. Главная характеристика любого подобного сервиса - надёжность. Какую надёжность можете предоставить вы? Правильно, никакую. Вырубится свет - и ваши клиенты потеряют время, произойдёт у вас авария на линии - и клиенты потеряют сайты, сгорит у вас БП и... ну вы поняли.
    Ответ написан
    4 комментария
  • Если цель свалить в другую страну и там работать программистом, нужен ли диплом для визы?

    1) Человек, который орет "хочу свалить в другую страну" - малолетний дебил, который не определился с тем, что ему нужно в жизни.
    2) Таких малолетних дебилов куча. Открываешь какой-то ролик "айти-мигранта" из какого-нибудь вьетнами, чили - сидит порет какую-то херню. И даже сам себе ответить не может, зачем и для чего он туда поехал.
    __

    Грамотный подход:

    1) Выбираем 1-3 страны, которые ты считаешь перспективными.
    2) Изучаем требования к кандидатам.
    3) Изучаем методы миграции.
    4) Принимаешь решение по конкретной стране - есть смысл, нет смысла итд.
    5) Начинаешь вкладывать время, силы, деньги, чтобы пролезть в горлышко миграции.
    6) Получаешь то, что ты хотел (либо понимаешь, что прямой дороги пока нет, и надо как-то обходами действовать).
    7) Радуешься жизни, либо понимаешь, что как-то не очень-то и хорошо получилось.
    Ответ написан
    1 комментарий
  • Как найти возможность в любой момент брать шабашки на 1000-2000 рублей?

    php666
    @php666
    PHP-макака
    Если перефразировать вопрос: я работаю удаленно, денег не хватает, нищеброд. Хочу такую работу, что бы ничего не делать и получать косарь рублей за установку цмс.

    Рональд Макдональд правильно написал - "Влажная мечта любого фрилансера"
    Объективно, айти - не та отрасль, где можно легко находить такие мелкие заказы.
    Такси, грузоперевозки или все, что связано с массовой востребованностью. Ибо на тысячу населения гораздо больше людей имеют потребность в такси, нежели в сайто-правках.

    В автосервисе за снятие/установку одного колеса берут рублей 100 или 200. Фрилансеры тоже хотят также - прилагать мало усилий и получать за это немалые деньги. Проблема только в том, что вас много, а заказчиков - объективно меньше. И раздутый пузырь фриланса терпит крах каждый раз, когда тут появляется очередная тема про фриланс, не состыковывающаяся с реалиями жизни.

    Чтоб покрывать непредвиденные затраты (поход в кафе, в гости, заправка авто, подарки... ) .
    Это не непредвиденные затраты, это ничто. Даже мужичок с завода может себе позволить кафе и заправить своё ведро. Куда деньги деваешь (если они у тебя, конечно, есть)?
    Ответ написан
    Комментировать
  • Как собрать и минифицировать CSS и JS в Yii2?

    @ph4n70m
    Разобрался.
    Качаешь отсюда https://developers.google.com/closure/compiler/ jar и кидаешь в корень проекта

    npm i yuicompressor - и тащишь yuicompressor.jar тоже в корень

    Создаёшь файл через ./yii asset/template config/minify.php

    Убираешь комментарии с двух строк вверху (где константы) и внизу. А также "раскомменчиваешь"
    'bundles' => [
    'app\assets\AppAsset',
    'yii\web\YiiAsset',
    'yii\web\JqueryAsset',
    ],

    и всё. можешь запускать
    ./yii asset config/minify.php assets/app_min.php

    На выходе будет файл в assets/app_min.php который и подключаешь к проекту
    Ответ написан
    Комментировать