• Как сделать рандом с процентами?

    @alexalexes
    Возьмите интервал генерации случайных чисел (от 0 до 99) и раскидайте сгенерированные числа по эквивалентным интервалам (0...69, 70...89, 90...99) - если число попало в опред. интервал, значит ширина интервала будет вероятностью попадания в него этого числа.
    $rnd_number = rand(0, 99);
    switch(true)
    {
      case $rnd_number < 70: 
       echo "One";
        break;
     case $rnd_number >= 70 && $rnd_number < 90:
        echo "Two";
        break;
     case $rnd_number  >= 90:
        echo "Three";
        break;
    }

    Чтобы в этом убедиться, повторите эксперимент, например, 1000 раз:
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
      $rnd_number = rand(0, 99);
      switch(true)
      {
        case $rnd_number < 70: 
         $counter["One"]++;
          break;
       case $rnd_number >= 70 && $rnd_number < 90:
          $counter["Two"]++;
          break;
       case $rnd_number  >= 90:
          $counter["Three"]++;
          break;
      }
    }
    var_dump($counter);

    Если хотите эксплуатировать именно функцию array_rand(), то ей нужно предоставить такой массив:
    $block_array = array('One','One','One','One','One','One','One','Two','Two','Three');
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
     $gen_value = array_rand($block_array);
     $counter[$gen_value]++;  
    }
    var_dump($counter);

    Вес каждого элемента увеличивается путем его тиражирования пропорционально вероятности его выпадания.
    Решение не будет отличаться от классики.
    Ответ написан
    Комментировать
  • Как сделать рандом с процентами?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Можно для каждого значения сделать вес, можете сделать так, чтобы сумма все х весов была 100,
    но не обязательно — это могут быть произвольные значения. Главное, что доля веса от суммы всех весов — будет вероятностью данного элемента.

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

    Обновление от 13.06.2020:
    Так вышло, что мой тимлид математик и нашел интересное и эффективное решение этой задачи
    <?php
    
    $values = [
        ['value' => 'One', 'weight' => 20],
        ['value' => 'Two', 'weight' => 30],
        ['value' => 'Three', 'weight' => 50]
    ];
    
    function randByWeight(array $arr) {
        $max = 0;
        $result = [];
        foreach($arr as $value) {
            $rand = pow((mt_rand() / (mt_getrandmax() + 1)), 1/$value['weight']);
            if ($rand > $max) {
                $max = $rand;
                $result = $value;
            }
        } 
    
        return $result;
    }
    
    // Например: 'Three' выпадет в 50% случаев, тк его вес -- половина от суммы всех весов
    // Например: 'Two' выпадет в 30% случаев, тк его вес -- 30% от суммы всех весов
    var_dump(randByWeight($values));

    sandbox.onlinephpfunctions.com/code/39de2d54a298de...

    Чем хорошо это решение — его можно использовать прямо в SQL запросе!
    SELECT * FROM table ORDER BY POWER(random(), 1/weight) DESC LIMIT 1


    Классическое решение:
    <?php
    
    $values = [
        ['value' => 'One', 'weight' => 20],
        ['value' => 'Two', 'weight' => 30],
        ['value' => 'Three', 'weight' => 50]
    ];
    
    function randByWeight(array $items) {
        $sum = array_reduce($items, function(int $acc, array $item): int {
            return $acc += $item['weight'];
        }, 0);
        
        $rand = (mt_rand() / (mt_getrandmax() + 1)) * $sum;
    
        foreach($items as $item) {
            if($rand < $item['weight']) {
                return $item;
            }
            
            $rand -= $item['weight'];
        }
    }
    
    // Например: 'Three' выпадет в 50% случаев, тк его вес -- половина от суммы всех весов
    // Например: 'Two' выпадет в 30% случаев, тк его вес -- 30% от суммы всех весов
    var_dump(randByWeight($values));

    sandbox.onlinephpfunctions.com/code/aee9dca651213e...
    Ответ написан
    3 комментария
  • Можно ли в Mac OS отключить перевод дерикторий в домашней папке на русский язык?

    DevMan
    @DevMan
    По идее достаточно удалить файл .localized из этих директорий. Сам не проверял.
    https://discussions.apple.com/thread/252040

    Удалите файл из одной директории, рестартаните Finder (через killall) и проверьте.
    Ответ написан
    1 комментарий
  • Как перенести mac os полностью с hdd на ssd?

    TerAnYu
    @TerAnYu
    Системный администратор
    Если раздел большой, а информации на нём мало и перенести необходимо на диск меньшего размера, то необходимо:
    1 - загрузиться с установочного диска/flash диска;
    2 - запустить Disk Utility;
    3 - Уменьшить раздел, который будем переносить до минимально возможного размера, передвигая ползунок разделов (возможно будет делаться долго из-за большой фрагментации);
    4 - клонировать диск через кнопочку Restore (выбираем исходный раздел, нажимаем Restore, Destination выбираем новый раздел на новом диске, предварительно создав его);
    5 - увеличить скопированный раздел на конечном диске.
    Готово, система перенесена на другой диск, меньшего объёма.
    Ответ написан
    3 комментария
  • Что если к планшету подключать зарядное на 2,1 ампера?

    @Carfik
    Автор говнокода
    Планшет будет заряжаться
    Ответ написан
    Комментировать
  • Как сделать удаление картинок чтоб они удалялись?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Route::get()


    The DELETE method is not supported for this route


    <a href="public/uploads/product_images/delete/{{$image->id}}"


    The GET method is not supported for this route.


    Ой, ну не знаю… У вас какой знак зодиака? А то без этого мы не сдвинемся с места, на котором топчемся который месяц.

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

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Я плохой программист

    Вы вообще еще не программист и не факт что им будете.

    или же неправильно распределяю время на программирование?(от 1,5 часов до 5 в день) в чем проблема?

    Если бы вы тратили от 1.5 до 5 часов в день хотя бы год, думаю было бы гораздо больше результатов.

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

    Вся проблема в том, что вы не готовы понять или принять ответ, что вы либо ленивый, либо неспособный заставлять себя изучить технологии.

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

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

    Вот возьмем школу.
    10-12 лет тратить по 5-7 часов в день на уроки.
    Вот 10-12 лет спустя - вы стали математиком? Литератором? Поэтом? Биологом? Физиком? Химиком?
    Да нет, едва-едва общие знания получили, которые даже не очень понятно где применить.

    Тоже самое и в ИТ: 2-3-4 месяца это даже не начало, это так, сверху поковырял.
    Ответ написан
    Комментировать
  • Прокрастинация, проблемы языка или я не программист?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    На изучение почти чего угодно в сфере ИТ обычно нужны эти 3 вещи:
    1. время
    2. терпение
    3. английский

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

    В процессе изучения, конечно, тебя сопровождает естественное любопытство. Но только лишь на нём не получится ехать всю дорогу. Когда начинается рутина или непреодолимые сложности, понадобятся воля и терпение. Да и всё то, что я перечислил выше.

    Удовольствие в программировании, как в его изучении, так и в решении практических задач, построено на дофаминовом подкреплении. Оно, к сожалению, рассчитано только на короткие цели. Поэтому (и не только поэтому) большие задачи необходимо разбивать на более мелкие. Это называется декомпозиция. Но это также и навык, которым нужно овладеть, прежде чем иметь возможность применять. Змейку не захотелось делать потому, что она слишком сложная и долгая. Однако если в своей голове сумеешь разбить змейку на более простые задачи: управление, показ еды, показ самой змейки, - то будет намного интереснее.
    Ответ написан
    8 комментариев
  • Будущее веб-разработчиков python?

    AgentProvocateur
    @AgentProvocateur
    Ответы за будущее - дело неблагодарное, ибо "смотреть в завтрашний день могут не только лишь все..".

    А вот в настоящем - стек Python (django/flask/tornado и пр.) - самый невостребованный в сфере разработки web-бэкенда из популярных/широко используемых. Чтобы убедиться в этом, достаточно самому изучить открытые данные там, где удобно - hh, moikrug, upwork и пр.
    Т.е. пододвинься к краюшку фласк, джанга и прочее?

    Они давно там. Если прямо сейчас провести диванную аналитику, к примеру, по сервису moikrug, то получаем такой топ по числу вакансий:

    1. Go - 135;
    2. RoR - 121;
    3. Node.js - 88;
    4. Yii - 70;
    5. Symfony - 53;
    6. Laravel - 50;
    7. Asp.net - 46;
    8. Django - 42;
    9. Flask - 14;
    10. Tornado - 4.

    Тенденции очевидны. Несмотря на то, что из каждого утюга доносятся "новости" и "мнения", мол, RoR уже всё, node.js/go - мертворожденные и нежизнеспособные поделки, а python - серебряная пуля на все случаи, чуть ли не лучший язык, а django - чуть ли не самый продуманный и грамотный backend-фреймворк...рыночные реалии показывают обратную картину.

    При таком не радужном настоящем бэкенда на python, будущее выглядит еще более сомнительным, особенно, с поправкой на текущие тренды. Прикол ещё в том, что надуваемый из всех инфо-щелей хайп вокруг python (благодаря ML, big data и пр.) ничуть не способствует повышению востребованности оного в web, даже наоборот. В итоге, сейчас получаем ситуацию, при которой конкуренция среди python-разработчиков превышает значения в php/js/java, а вот работы для них - слёзы (в сравнении с коллегами по соседним стекам). Что касается прошлого - питону 27 лет, джанге 14, выводы делайте сами.

    P.S. Я совсем не имею в виду, что python - плохой язык, а django/flask/tornado - плохие/отсталые фреймворки. Всего-лишь транслирую рыночную ситуацию на основе открытых данных:)
    Ответ написан
  • Подписка пользователей на события сайта?

    @malbaron
    MySQL годится не больше и не меньше, чем гипотетический "специальный сервер"
    Ответ написан
    Комментировать
  • С чего начинается CI?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    CI - это автоматизированная сборка проекта на основе версионного контроля и прогон тестов.

    Собственно, начинать надо с задачи реализации деплоя.
    Деплой сделать - задача нетривиальная. Есть для этого разные инструменты и универсального решения нет. Отладить процедуру деплоя нужно для сборок в CI и для продакшена/стейджа.
    Лично я для своего последнего маленького проекта для выкладки в продакшн выбрал deploybot.com - в принципе всё, что нужно есть, в том числе и хорошая интеграция с DigitalOcean.

    Что касается инструмента для CI, то из бесплатных обычно пользуются Jenkins. Я пробовал в последнем проекте PHP CI - тоже годно, но не настолько гибкий инструмент.

    Выкладку на продакшн/стейдж можно настроить по-разному. Например по коммиту в специальную ветку, по ключевым словам в коммите или вообще вручную. На прод однозначно стоит делать выкладку вручную.

    А, еще один немаловажный момент. Для успешного функционирования этого всего дела нужно внедрить версионирование схемы БД и фикстуры (для CI).

    Жизненный цикл у нас был такой. Тимлид определяет некий не большой, но и не очень маленький набор фич, которые должны попасть в новую версию приложения. Все тикеты связаны с версиями. И поэтому может случится так, что даже готовую фичу он определит в другую версию продукта.
    Каждая готовящаяся к релизу версия получает свою ветку в git и там делается мердж нужных коммитов с фичами. Каждый коммит автоматически тестируется в CI.
    Когда все фичи сделаны и коммиты слиты, то можно залить на стейдж сервер и погонять вживую версию в условиях близких к боевым. И наконец, если всё хорошо, то делается деплой на продакшн.
    Ответ написан
    Комментировать
  • Как на PHP реализовать беспрерывное выполнение задачи?

    $file='/tmp/parser_status.lock';
    if(!flock($lock_file = fopen($file, 'w'), LOCK_EX | LOCK_NB))
      die("Already runninng\n");

    В начала файла. И на крон каждую минуту..
    Если что-то пойдет не так, блокировка снимется и запустится новый скрипт.

    Костыль конечно, но работает уже несколько лет :)
    Ответ написан
    Комментировать
  • Symfony2: Как в контейнер служб добавить класс из папки vendor?

    @zloyusr
    Для контейнера нет разницы где физически расположен файл. Это забота автозагрузчика. Если вы зарегистрировали сервис в services.yml:
    services:
        fooService:
            class: \Bar

    То он будет доступен в контроллере:
    $foo = $this->get('fooService');
    Но для интеграции сторонней библиотеки, я бы рекомендовал создать отдельный бандл и хранить всю конфигурацию сервисов в services.yml этого бандла.
    Ответ написан
    3 комментария
  • Где взять готовый образ для виртуалки?

    @rPman
    Не ищите эти глупости…
    Виртуалка -> livecd -> debootstrap (подсовываете любой dep репозитарий, например от ubuntu) = 150mb инсталляция, chroot в нее и до настраиваете (kernel + grub + по мелочи типа timezone, locales) -> опционально доставить драйвера виртуалки (например для vbox дополнения, ставить прямо с cd)

    Этот способ идеально подходит к минимальным конфигурациям в любых контейнерах любых виртуалок… lxc/openvz/kvm/vbox/… минимум телодвижений, максимальная скорость развертывания… идеален для запуска серверных/консольных утилит. Для настройки X под суетиться нужно чуть больше (в основном если нужны навороты вида не дефолтные шрифты, сглаживание, ускорение видео и т.п.), просто для запуска приложений достаточно поставить xorg-server и какую либо DM, например openbox.
    Ответ написан
    Комментировать
  • Баг или фича в цсс?

    @avrelian
    !important — это как последняя пуля. Надо беречь для себя…
    Ответ написан
    Комментировать
  • Выбор железа для SQL сервера 1С

    @mobileDeveloper
    Недавно брали сервер, как раз под 1С.
    Как писали выше, используйте счётчики, необходимо мониторить загрузку по памяти, дискам, процессору, сетевым интерфейсом, обращению к файлу подкачки. Собирать информацию необходимо периодически, постоянно следить за изменением показателей — очень пригодится позже, для анализа и решения проблем с узкими местами.
    В вашем случае, с 0,5 Гб базой существующего сервера должно хватать.
    В случае значительного роста, необходимо продумать всё наперёд.
    В нашей организации, БД за 2 года выросла с 20 до 70 Гб, кол-во пользователей с 25 до 50 одновременно работающих.
    По опыту и показаниям счётчиков:
    — процессор значительно загружен бывает очень редко и врят ли будет узким местом, скажу только, что выбирать выгоднее один 4-х ядерный, вместо двух 2-х ядерных из-за схемы лицензирования MS SQL на процессор, если СУБД другая, то считайте сами, по деньгам;
    — сетевой интерфейс, бывает загружен значительно, но пока не являлся узким местом, 2-х гигабитных интерфейсов хватает;
    — памяти, тут как всегда её много не бывает, и сейчас она относительно недорога, плюс всё серверное ПО 64-bit (ОС, СУБД, УПП);
    — самый большой затык в дисковой подсистеме, наибольшая нагрузка на неё, поэтому при больших объёмах выбирайте самый быстрый тип RAID, не забывая про надёжность (у нас Raid 10). Как советуют выше, мы выбрали SSD — это достаточно дорого, кроме того, эти диски имеют свойство быстро умирать, поэтому обязательный запас, на случай выхода из строя, но эти диски дают в разы бОльшие скорости на операциях случайного чтения и записи, обгоняя любые НЖМД. Также не забываем разносить базы и логи на разные тома рейда, и помним про tempdb в MS SQL.

    При увеличении количества одновременно работающих пользователей, на первый план выйдет проблема блокировок на уровне таблиц БД. Вам наверное пока рано об этом думать.

    Советую почитать раз и два.
    Ответ написан
    3 комментария
  • Локализация сайта

    Kyborg2011
    @Kyborg2011
    1. Как эффективнее хранить эти локализационные массивы: в файлах php и подключать (include_once) определенный файл в зависимости от языка или в json с применением memcache и выбирать нужный?

    По моему БД MySQL удобнее всего в данном случае.

    2. Как определить системный язык пользователя (причем независимо от операционки)?

    Насколько я знаю — никак. Обычно на сайтах какойто язык стоит стандартно, а можно переключится на другие.

    3. Возможно есть более эффективный подход?

    Если писать с нуля, то эффективнее не знаю, если на Zend Framework, то там специальные классы уже разработаны.
    Ответ написан
    5 комментариев
  • Несколько баз Redis на хосте

    FCron
    @FCron
    в редисе можно держать несколько баз, по умолчанию клиент подключается к базе №0
    в конфиге можно задать максимальное возможно количество баз данных

    выбор базы данных командой select (http://code.google.com/p/redis/wiki/SelectCommand)
    Ответ написан
    1 комментарий