• Как сделать партнёрскую программу так чтоб выплаты не признали откатом или взяткой?

    @boss_lexa
    Выплачивая деньги физ лицам вы становитесь их налоговым агентом по уплате с их доходов 13% НДФЛ,
    что врятли будет выгодно.

    Чтобы избежать НДФЛ нужно делать выплаты из зарубежного юрлица - сами создайте или используйте сервисы вроде https://www.solar-staff.com/partner-network
    Ответ написан
    Комментировать
  • Фрилансеры, а вы применяете онлайн кассы?

    @boss_lexa
    Варианты платить меньше за кассы есть
    UPD еще ОФД 999 в год ,1999 = 3 года https://e-ofd.ru/

    UPD2 еще для сайтов есть вариант купить ФН и кассу и размещать их в датацентре за 800 руб (оплата ОФД включена)
    https://umka365.ru/
    https://online.kit-invest.ru/
    Узнал насчет ФН на 36 месяцев - сказали тоже могут поставить, но подороже, также можно прислать свой ФН
    Ответ написан
    6 комментариев
  • В чем практическая польза итераторов в JS?

    search
    @search
    мама говорит что я особенный
    Полезность итераторов в том что это открытый интерфейс для любой структуры данных. Как вы уже поняли, любой класс/объект в JS может обладать интерфейсом итератора. Идея итератора в том чтобы скрыть внутреннее представление структуры данных от потребителя этих данных. Например, если вы работаете с какими-либо замысловатыми структурами данных, типа бинарных деревьев. Пользователю совсем не обязательно знать как ваш класс/объект хранит бинарное дерево. Пользователь просто его получает и проходит по всем его элементам в цикле. В дальнейшем, вы можете, при необходимости, заменить одну структуру данных на другую, не меняя самого пользователя. Например, вы можете заменить бинарное дерево на б-дерево прозрачно для самого пользователя (пользователь не будет знать что вы подменили структуры, он по прежнему получает что-то что можно проитерировать и ему этого достаточно).

    Для того чтоб глубже понять суть вопроса, можно погуглить про инкапсуляцию и SOLID (в вашем случае, принцип Open/closed).
    Ответ написан
    1 комментарий
  • Какой алгоритм шифрования применяется?

    myjcom
    @myjcom
    Все достаточно просто

    IiiEncryptionXor class:
    spoiler
    package primary.utils
    {
       import flash.utils.ByteArray;
       
       public class IiiEncryptionXor
       {
           
          
          public function IiiEncryptionXor()
          {
             super();
          }
          
          public static function encrypt(string:String, key:String) : String
          {
             var barr:ByteArray = new ByteArray();
             barr.writeUTFBytes(Base64.encode(string));
             var xstr:String = xorr(barr,key);
             return Base64.encode(xstr);
          }
          
          public static function decrypt(string:String, key:String) : String
          {
             var barr:ByteArray = Base64.decodeToByteArray(string);
             var xstr:String = xorr(barr,key);
             return Base64.decode(xstr);
          }
          
          private static function xorr(barr:ByteArray, key:String) : String
          {
             var keypos:Number = NaN;
             var keyByteArr:ByteArray = new ByteArray();
             keyByteArr.writeUTFBytes(key);
             var keylen:int = keyByteArr.length;
             var barrlen:int = barr.length;
             var barrNew:ByteArray = new ByteArray();
             for(var i:int = 0; i < barrlen; i++)
             {
                keypos = i % keylen;
                barrNew[i] = barr[i] ^ keyByteArr[keypos];
             }
             return barrNew.toString();
          }
       }
    }

    Key string: (из DataModelBase)
    spoiler
    private const VERY_LONG:String = "some very-very long string without any non-latin characters due to different string representations inside of variable programming languages";


    Base64 class:
    spoiler
    package primary.utils
    {
       import flash.utils.ByteArray;
       
       public class Base64
       {
          
          private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
          
          public static const version:String = "1.1.0";
           
          
          public function Base64()
          {
             super();
             throw new Error("Base64 class is static container only");
          }
          
          public static function encode(data:String) : String
          {
             var bytes:ByteArray = new ByteArray();
             bytes.writeUTFBytes(data);
             return encodeByteArray(bytes);
          }
          
          public static function encodeByteArray(data:ByteArray) : String
          {
             var dataBuffer:Array = null;
             var i:uint = 0;
             var j:uint = 0;
             var k:uint = 0;
             var output:String = "";
             var outputBuffer:Array = new Array(4);
             data.position = 0;
             while(data.bytesAvailable > 0)
             {
                dataBuffer = new Array();
                i = 0;
                while(i < 3 && data.bytesAvailable > 0)
                {
                   dataBuffer[i] = data.readUnsignedByte();
                   i++;
                }
                outputBuffer[0] = (dataBuffer[0] & 252) >> 2;
                outputBuffer[1] = (dataBuffer[0] & 3) << 4 | dataBuffer[1] >> 4;
                outputBuffer[2] = (dataBuffer[1] & 15) << 2 | dataBuffer[2] >> 6;
                outputBuffer[3] = dataBuffer[2] & 63;
                for(j = dataBuffer.length; j < 3; j++)
                {
                   outputBuffer[j + 1] = 64;
                }
                for(k = 0; k < outputBuffer.length; k++)
                {
                   output = output + BASE64_CHARS.charAt(outputBuffer[k]);
                }
             }
             return output;
          }
          
          public static function decode(data:String) : String
          {
             var bytes:ByteArray = decodeToByteArray(data);
             return bytes.readUTFBytes(bytes.length);
          }
          
          public static function decodeToByteArray(data:String) : ByteArray
          {
             var j:uint = 0;
             var k:uint = 0;
             var output:ByteArray = new ByteArray();
             var dataBuffer:Array = new Array(4);
             var outputBuffer:Array = new Array(3);
             for(var i:uint = 0; i < data.length; i = i + 4)
             {
                j = 0;
                while(j < 4 && i + j < data.length)
                {
                   dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j));
                   while(dataBuffer[j] < 0 && i < data.length)
                   {
                      i++;
                      dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j));
                   }
                   j++;
                }
                outputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 48) >> 4);
                outputBuffer[1] = ((dataBuffer[1] & 15) << 4) + ((dataBuffer[2] & 60) >> 2);
                outputBuffer[2] = ((dataBuffer[2] & 3) << 6) + dataBuffer[3];
                for(k = 0; k < outputBuffer.length; k++)
                {
                   if(dataBuffer[k + 1] == 64)
                   {
                      break;
                   }
                   output.writeByte(outputBuffer[k]);
                }
             }
             output.position = 0;
             return output;
          }
       }
    }
    Ответ написан
    Комментировать
  • Выбор cms для заметок сис.админа?

    neuotq
    @neuotq
    Прокрастинация
    Я вам советую завести на git и хостить(можно к примеру gitlab у них есть бесплатные приватные репозитории ), а можно и не хостить. А сами заметки/блог вести в Markdown. Markdown имеет простейший и удобный синтаксис + есть огромное количество бесплатных редакторов.
    Таким образом вы получите портируемую, слабо от чего-либо зависящую систему удобных заметок с историей изменений добавлений.
    Ответ написан
    Комментировать
  • Какие есть интересные free API для веб проекта?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Комментировать
  • Как сделать простейший php прелоадер кеша для сайта?

    catanfa
    @catanfa
    Можно выгрузить список URL в текстовый файл (если урлы меняются, то можно обновлять этот текстовый файл скриптом) и сконфигурировать siege для обхода этого списка раз в сутки. В итоге, задача решится буквально одной строчкой (похоже на то, что предлагает Виктор) но с опциями siege можно очень гибко управлять процессом, поиграться с количеством потоков, настроить таймауты, не нужно забивать место на диске, он сгенерит красивый отчёт, который можно проанализировать, и т.д.
    Ответ написан
    1 комментарий
  • Как работать с очень длинными списками в JavaScript (angular, react, vuejs)?

    alvvi
    @alvvi
    export default apathy;
    (angular не использует vdom, для него история другая)
    перерисует целиком свой виртуальный dom

    Давайте немного проясним: виртуальный DOM - это грубо говоря js объект содержащий другие объекты.
    При добавлении нового сообщения туда добавится новый объект и весь DOM сравнится со старой версией с помощью diff-алгоритма специфичного для конкретного фреймворка.
    И только результат этого сравнения добавится в реальный DOM.
    Работа с объектом значительно быстрее работы с самим DOM-ом, поэтому чтобы оно начало работать заметно медленее у вас должен быть дикий уровень вложенности или очень большой DOM.

    100 сообщений и 50 контактов - это небольшие цифры, с таким любой из упомянутых фреймворков справится без просадок.

    Вот пример бенчмарков с большим количеством объектов(1000+) для многих фреймворков на примере незамысловатой таблицы:
    www.stefankrause.net/js-frameworks-benchmark6/webd...
    (там же есть ссылка на репо чтобы увидеть как она выглядит)
    Как видите, там в таблицу уже содержащую 10 000 добавляется еще 1000(!) объектов, и многие фреймворки впонле с этим справляются.

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

    @okos Автор вопроса
    Собственно, откостылил.
    Внутри vue части сделал глобальные функции vueInit, vuePostMsg, и ссылку на vueCallback
    let vueCallback
    
    function vueInit (callback) {
      vueCallback = callback
    }
    
    function vuePostMsg (msg, params) {
          ppuApp.processMessage(msg, params)
    }
    
    window.vueInit = vueInit
    window.vuePostMsg = vuePostMsg


    Дальше, думаю, понятно. На первое время мне хватит.
    Ответ написан
    Комментировать
  • Как правильно рассчитывать себестоимость работ для проекта?

    tema_sun
    @tema_sun
    Предполагаемое количество часов умножить на стоимость часа и затем умножить на Пи.
    Ответ написан
    Комментировать
  • Делегирование на Upwork: какова механика?

    opium
    @opium
    Просто люблю качественно работать
    Совершенно нормально работать с командой, все одному делать крайне сложно
    1. Агентство удобно в плане определенной автоматизации, но опять таки если у вас скажем кто то сидит на окладе , а контракт почасовой тоже сложно.

    2. Оба варианта ок, с учетом того что в неделе 7*24 часов с мануалом нет проблем.
    Ответ написан
    1 комментарий
  • Как начальник может контролировать фрилансера по часам удалённо?

    petermzg
    @petermzg
    Самый лучший программист
    timedoctor.com позволяет удобно учитывать отработанное время
    Ответ написан
    Комментировать
  • Как защитить Socket.io от клиентского внедрения?

    SagePtr
    @SagePtr
    Еда - это святое
    Никак, всё что может сделать браузер - то может сделать и клиент, притворившись браузером
    Ответ написан
    Комментировать
  • Как устроиться на работу бывшему ИП?

    Andrey_Pletenev
    @Andrey_Pletenev
    Pletenev.com
    1) Перестать ныть. Вселенная вам ничего не должна, но в ней достаточно и работы и денег.
    2) Перестаньте искать путь, где не встретите трудностей - такого пути нет. Даже путь сидеть на попе и ничего не делать - несет в себе проблемы. Воспринимайте трудности, как уроки для изменения себя.
    3) Не спрашивайте других чем вам следует заниматься в жизни. Это ваша собственная задача и вам ее нужно решить, покопавшись в себе, а не на основе критерия п.2. Для раскопок себя есть соответствующие курсы.
    Ответ написан
    Комментировать
  • Что делать, если нет портфолио для резюме, но есть опыт?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Портфолио такая штука интересная... Вот я с WP работаю 10+ лет, опыта вагонище. А показать тоже осбо нечего. Либо старье, которое может быть вполне норм само по себе, но уровень то у меня уже совершенно другой, не репрезентативно. Все свежее, крупное и вкусное - под NDA. Опенсорса немного есть, есть контрибюшены в экосистеме WP, но этого вроде как мало. Что делать? Для себя я выбрал несколько проектов под NDA, поговорил с клиентами и получил добро показывать их непублично, оговаривая эту особенность с новыми клиентами при показе. Это дает плюсы – во-первых, если клиент решить связаться с владельцем такого сайта и спросить референс, я буду уверен что бывший клиент не сделает круглые глаза, а подтвердит мое участие в проекте и даст нормальную рекоммендацию. Во-вторых, новому клиенту такое уважение к NDA и клиентским данным однозначно придется по душе, они такое любят. Особенно крупные, у которых и деньги есть на разработчиков с рейтом выше среднего. При найме та же кухня.
    Ответ написан
    Комментировать
  • Как правильно задавать вопросы в переписке?

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

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Центральный показатель для бизнеса, а следовательно и руководителей, как людей представляющих интересы этого самого бизнеса - это коэффициент возврата инвестиций (ROI). Соответственно, сотрудник должен приносить компании больше денег, чем потребляет. Естественно, что чем выше разрыв между затратами и прибылью, тем лучше, поэтому фонд оплаты труда руководитель должен держать на том минимальном уровне, который гарантирует бесперебойную работу сотрудников. Один из факторов этой бесперебойности - низкая текучка. Сотрудников терять нежелательно. И чем ценнее для компании сотрудник, чем более он профессионален и/или чем больше на него завязано, тем дороже обходится его потеря. Натурально в деньгах. Придётся затратить больше, чем обычно, денег на поддержание работы без него. Придётся затратить деньги и время (те же деньги) на поиск, найм, введение в работу, возможно, обучение нового сотрудника. При этом он может оказаться совсем неподходящих и цикл придётся повторить. Или может оказаться просто хуже прошлого и эффективность отдела снизится. Поэтому, когда сотрудник приходит просить прибавку, руководитель оценивает может ли этот сотрудник уйти или только блефует, насколько легко его будет заменить, какой урон компании будет нанесён его уходом. Потом руководитель оценивает стоимость расширения ФОТ - есть ли резервы, какой сейчас ROI, будет ли больший ROI от реинвестиции этих средств во что-то другое? Если уход сотрудника будет стоить меньше, чем увеличение ФОТа, сотруднику откажут.

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

    Из этого вывод, стратегия проста - увеличивайте собственный профессиональный уровень на столько, чтобы свободно менять компанию, как только вас что-то перестало устраивать.
    Ответ написан
    4 комментария
  • Как успеть нанять сотрудников после получения первого заказа?

    newross
    @newross
    Product owner
    Попытка проглотить кусок, который не по зубам, чревата эпичным провалом.
    Крупный проект может сделать только команда. Не стоит путать рабочую группу из только что нанятых непонятных друг другу людей с командой. Чтобы команда сформировалась, необходимо довольно длительное время и опыт успешно завершенные проекты поменьше.
    В таких ситуациях можно:
    - купить готовую команду;
    - реализовать проект совместно с партнером, у которого уже есть команда;
    - отказаться от проекта до момента, пока не будет выращена своя команда.
    Конечно, остается небольшая вероятность, что вы везучий засранец, который наймет высококлассных совместимых друг с другом профессионалов за 3 копейки и сделаете из них команду за неделю. Но я бы не стал рассчитывать на это.
    Ответ написан
    Комментировать
  • Существует ли внятная инструкция, как стать фрилансером на Wordpress с нуля?

    gobananas
    @gobananas
    finishhim.ru
    1. Ставите на домашний ПК
    2. Ставите на сервер
    3. Делаете сайт, заливаете на сервер
    4. Ставите GIT
    5. Деплоите на сервер с GIT
    6. Делаете блог на WP
    7. Добавляете пару плагинов, фотогалерею
    8. Делаете магазин на WP
    9. Ставите много плагинов
    10. Все начинает жутко тормозить, разруливаете тормоза
    11. Меняете пару раз дизайн
    12. Ставите ещё один WP на другой акк без пароля к адмике
    13. Немного ждёте
    14. Лечите WP от вирусов
    15. Учитесь настраивать безопасность сервера вообще и WP в частности
    16. Читаете новости о плагинах с уязвимостями на зарубежных сайтах
    17. Качаетесь в английском
    18. Отвечаете на тостере и стаке на вопросы про WP
    19. Идёте на Upwork
    Ответ написан
    3 комментария