• Начал полное погружение в PHP затронут язык Си как скомпилировать .cgi?

    @MadridianFox
    Web-программист, многостаночник
    Вот, тут написано как скомпилировать простейшую программу в студии. Просто делаете что там написано, но вместо кода в файле main.cpp вставляете свой.

    Но это лишняя трата времени. Никто сейчас не пишет cgi программы на Си. Точнее php-программисты этого не делают. Если, когда вы программируете на php, вы внезапно понимаете что вам надо написать что-то на си, значит вам надо сменить язык. Ну или вы уже работаете в корпорации размером с гугл или фейсубк и тогда вы знаете что делаете.
    Ответ написан
  • Насколько сложнее C++ чем Java?

    @MadridianFox
    Web-программист, многостаночник
    Вы не то спрашиваете. Вот зачем вы спрашиваете? Хотите выучить что-то полегче?
    На самом деле вы должны ответить на вопрос - какие программы вы хотите писать.
    С академической точки зрения плюсы сложнее. Да, не в последнюю очередь из-за ручной работы с памятью. Но после нескольких месяцев практики вы привыкните и это не будет сложным.
    Ответ написан
    4 комментария
  • Как в insert картинку добавить?

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

    @MadridianFox
    Web-программист, многостаночник
    То что на другом сайте юзер тоже будет авторизован вы проверяли или только так думаете? Просто это не должно так работать - сессия привязывается к кукам, которые видны только на том сайте, который их поставил.

    А если даже это и работает так как вы говорите, то просто измените структуру сессии - данные для каждого отдельного сайта храните под ключём, которым является домен этого сайта.
    Ответ написан
  • Учить ли c++ в 2018. Для знающего C#?

    @MadridianFox
    Web-программист, многостаночник
    Тут правильно отвечают - надо научиться программировать для начала, а после этого другие языки учить не придётся, только узнавать нюансы и стандартную библиотеку.
    Чтобы научиться программировать необходимо написать с десяток программ. Программ с большой буквы, а не просто кусков кода которые делают то или это..
    И не просто написать и забыть, а написать и пытаться развивать. Написали простой веб-сервер который отдаёт файлы из папки - ок, попытайтесь прикрутить к нему скриптовый язык для динамической генерации страниц, или cgi. или ещё что-нибудь. Сделали себе текстовый редактор - добавьте в него систему плагинов. Написали сайт - добавьте ещё функционала. И ещё и ещё.

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

    На это уйдёт много лет и только после этого вы сможете сказать что вы умеете программировать и соответственно знаете какой-то язык.
    Ответ написан
    5 комментариев
  • Почему после подгрузки полей формы через jquery load(), yii2 их не принимает в model?

    @MadridianFox
    Web-программист, многостаночник
    Вы вот говорите про jquery, но ни строчки js кода не показали.
    На всякий случай проверьте. что csrf токен отправляется.
    Ответ написан
  • Как проверить существование класса?

    @MadridianFox
    Web-программист, многостаночник
    1) это где такие лабораторные дают, что необходимо фреймворк написать?))
    2) а вы уверены, что вам нужна рефлексия и динамика вообще? Почему вы считаете, что использование неймспейсов это проблема?

    По PSR-4 неймспейсы как раз используются для автозагрузки классов, потому что неймспейс по сути должен повторять путь до класса. У вас какой-то не универсальный автолоад, как же файлы в других папках? Как вы будете подгружать классы из папок внутри папки controllers?
    Правильный подход - получать полное имя класса (с неймспейсом) и при автолоаде просто заменять слэши на прямые, чтобы получить путь до файла.

    Свой автолоад это обязательное условие? можно просто воспользоваться композером. Обязательно автолоад делать через устаревший __autoload(), а не через общепринятый spl_autoload_register()?

    Создать объект класса используя его название в строке можно просто используя переменную:
    $classname = "app\\controllers\\MainController";
    $methodname = "actionIndex";
    $controller = new $classname(); // тут сработает автолоад
    
    $controller->{$methodname}();


    При этом вы можете (и должны) обеспечить безопасность, так чтобы никто не мог передать через GET и имя класса и имя метода, и вызвать любой метод. Делается это очень легко.
    Во-первых путь из GET к нам приходит имя класса без неймспейса, ну логично. Неймспейс мы потом прицепим к нему. Так никто не сможет случайно создать объект любого класса, а только объект класса из папки с контроллером. Это не возбраняется.
    Во-вторых, если кто-то передал абра-кадабру, то надо не падать с ошибкой Class not found, логично. Для этого, перед созданием класса просто смотрим на то какие файлы есть в папке с контроллерами. Если там нет файла с тами же именем что и класс - то показываем 404.

    Потом, перед тем как вызвать метод, проверяем что он существует функцией method_exists($obj, $method_name), опять же - метода нет -- идите-ка вы на 404.

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

    @MadridianFox
    Web-программист, многостаночник
    Как-то вопрос про docker, но до последнего момента не понятно зачем вам docker.
    Конечно gulp вы используете только на этапе разработки, он у вас должен стоять локально, так чтобы phpstorm его видел. Если собираете контейнер в продакшен - то вы должны просто взять весь результирующий код, скопировать его в контейнер и запускать его. Если в контейнере запускается окружение для разработки - то прокидываете локальную папку в контейнер. Не понимаю как вам вообще пришло в голову засовывать гульп в контейнер)
    Ответ написан
    2 комментария
  • Не могу перейти на картинке в директория сайта?

    @MadridianFox
    Web-программист, многостаночник
    Добавьте перед RewriteRule строки
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    чтобы, если файл существует, апач не применял RewriteRule
    Ответ написан
  • Как проверить права?

    @MadridianFox
    Web-программист, многостаночник
    Так как вы спрашиваете - никак. Вы можете только посмотреть права на файлы (в том числе и исполняемые файлы, которые и являются тем что вы называете командами), и сопоставить их с тем - в каких группах состоит пользователь.
    Ответ написан
    Комментировать
  • Как можно оптимизировать код?

    @MadridianFox
    Web-программист, многостаночник
    Во-первых, отличия в стиле надо выносить в классы.
    .btn-change-sect {
        display: none;
        border-bottom: 2px solid #ffffff;
    }
    
    .active {
       display: block;
       border-bottom: 2px solid #ff7300;
    }

    Во-вторых, не стоит привязываться к конкретике, в вашем случае, при клике есть только текущий элемент и все остальные
    $( ".btn-change-sect" ).click(function() {
        // убираем активный стиль со всех подобных элементов
        $( ".btn-change-sect" ).removeClass("active");
        // ставим активный стиль текущему элементу
        $(this).addClass("active");
    });
    Ответ написан
  • Как правильно использовать цикл?

    @MadridianFox
    Web-программист, многостаночник
    Вы не должны сразу писать энное количество элементов, а потом в них рассовывать результат. Нет.
    Вы должны в цикле выводить сразу разметку, в которую вставляете данные. Сколько итераций сделает цикл - ровно столько тэгов будет выедено.
    Пример ниже ужасен, но он показывает суть)
    $result = mysql_query("SELECT * FROM `catalog` WHERE `type`='$_GET[type]' ORDER BY `id` DESC");
    while($row = mysql_fetch_assoc($result)){
        echo "<div class=\"item active\">".$row["name"]."</div>";
    }
    Ответ написан
    4 комментария
  • Как настроить учетную запись FTP на Ubuntu?

    @MadridianFox
    Web-программист, многостаночник
    Права файлов/папок это не user/group, а user: rwx + group: rwx + other: rwx, где rwx это три права - чтение, запись и исполнение. Сделайте ls -l и увидите в первом столбце строки вида: -rwxrw-r-- или что-то подобное - это права на файлы.
    Если точнее, то такая запись прав состоит из 10 символов
    1) - или d -- указание на файл или папку (бывают и другие варианты, но эти чаще всего)
    2) rwx -- первая тройка прав это права владельца
    3) rwx -- вторая тройка прав - права группы
    4) rwx -- третья тройка прав - права всех остальных
    вместо любого символа из тройки можно ставить прочерк - это значит что этого права нет

    Т.е. rwx для владельца значит что он может читать писать и исполнять файлы.
    rwx для группы значит, что все кто состоит в группе файла (знаю что это странно звучит, точнее будет сказать - в основной группе владельца) могут читать писать и исполнять.
    Подробнее про это можно погуглить .

    Когда файл создаётся через ftp, то его владелец это пользователь webmaster и его группа это группа с именем webmaster (да, бывают одноимённые с пользователем группы). И наоборот, когда файлы создаются через web, то для них владелец это www-data и группа соответствующая.

    Как вы сами сказали - вариантов много, можно, например, настроить ftp чтобы он работал от имени того же www-data.
    но проще просто добавить пользователя webmaster в группу www-data, а пользователя www-data в группу webmaster. Тогда и через web и через ftp будет доступ ко всем файлам, при условии что у них стоят нормальные права для группы.
    Ответ написан
  • Какой язык программирования изучать, что-бы быстрее найти работу?

    @MadridianFox
    Web-программист, многостаночник
    Если хотите научиться программировать - пишите программы на си и на java. Эти два языка дадут вам понимание базовых и универсальных концепций программирования. Си - как механическая коробка передач. С него на языки с автоматическим управлением памятью уходить легко. Обратно не очень. Java - эталон современного ООП. Всякие js/go/python вам создадут детскую травму по этой части, там либо всё не так, либо урезано.
    После этого хоть в ад, хоть в Израиль... Изучение следующих языков будет просто запоминанием синтаксиса и стандартной библиотеки, ну и применением нюансов языка относительно первых двух.

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

    Студент? Замечательно - у тебя есть куча времени для практики и возможность устроиться куда-нибудь в качестве студента-обезьянки-которая-пишет-код.
    Ответ написан
    Комментировать
  • Как сделать парсер?

    @MadridianFox
    Web-программист, многостаночник
    Универсальный - никак. Вы, конечно, можете попытаться положиться на тэги nav и main, но никто не гарантирует, что они используются, никто не гарантирует что в них то что вам надо.
    Ответ написан
    Комментировать
  • Как вывести данные из БД в таблицу php и изменить их?

    @MadridianFox
    Web-программист, многостаночник
    Всё просто:
    1) делаете запрос select nazv, dat, [sum] from my_table where ...
    2) в php проходитесь в цикле по полученным строкам, записываете отдельные значения в массивы и переменные
    3) выводите данные из массивов и переменных на страницу
    Ответ написан
    Комментировать
  • Static use methods?

    @MadridianFox
    Web-программист, многостаночник
    Нет. И не понимаю вашего желания. Статический метод отличается от простой функции тем, что при вызове метода видно какому классу он принадлежит. Это хорошо, т.к. у вас несколько классов могут иметь статические методы с одинаковыми названиями, например BlogPostAR::find() и CommentAR::find().

    То же касается и хелперов. Несколько библиотек могут предоставлять свои хелперы для похожих задач.
    А если вам лень набирать имя класса - ок, используёте as:
    use yii\helpers\ArrayHelper as ah;
    ah::toArray($obj);

    но и этого я вам не советую. Через месяц вы забудете что значит ah и придётся отвлекаться на поиск соответствующего use. Или ещё хуже - ваш код будет поддерживать другой человек.
    Гораздо понятнее, когда в коде написано ArrayHelper::toArray(), потому что все кто работает с yii к этому привыкли.
    Ответ написан
    4 комментария
  • Как очистить массив от мусора?

    @MadridianFox
    Web-программист, многостаночник
    Массивы в Си это указатели на область памяти некоторого размера. Точнее просто указатели, размер, хоть где-то и есть (free ведь откуда-то знает сколько памяти освободить), но точно не в указателе.
    Рядом с массивом - за его границами, лежат какие-то данные. Для вас это ничего не значащий мусор, но это могут быть другие переменные, или адреса возврата из функции, если массив лежит на стэке.
    Так вот, ни в коем случае не модифицируйте и не читайте память, которая лежит за границами массива. В лучшем случае, вы наткнётесь на свободный участок, заполненный мусором. В худшем - перезапишете значение другой переменной и создадите себе баг, который без отладчика не найдёте.

    Что касается предметной области:
    char symbols[] = "XO";
    uint8_t winner_index;
    for(uint8_t char_index=0; char_index<2; char_index++){
      for(uint8_t i=0; i<3; i++){
        // rows
        if(a[i][0] == symbols[char_index] && a[i][1] == symbols[char_index] && a[i][2] == symbols[char_index]){
            winner_index = char_index;
            break 2;
        }
        // columns
        if(a[0][i] == symbols[char_index] && a[1][i] == symbols[char_index] && a[2][i] == symbols[char_index]){
            winner_index = char_index;
            break 2;
        }
      }
      // diagonal 1
      if(a[0][0] == symbols[char_index] && a[1][1] == symbols[char_index] && a[2][2] == symbols[char_index]){
          winner_index = char_index;
          break;
      }
      // diagonal 2
      if(a[0][2] == symbols[char_index] && a[1][1] == symbols[char_index] && a[2][0] == symbols[char_index]){
          winner_index = char_index;
          break;
      }
    }
    Ответ написан
    2 комментария
  • Как сделать авто запись в базу?

    @MadridianFox
    Web-программист, многостаночник
    В зависимости от деталей задачи в таких случаях используются два подхода, и оба уже описаны в других ответах.

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

    Если расчёт не сложный, результат нужен нечасто, то можно считать его на лету. Главное выделить алгоритм, который зависит от начальных данных и прошедшего времени. Ну например - пусть скидка растёт на 1 процент каждый месяц. Тогда алгоритм будет такой: берём дату регистрации, берём текущую, считаем количество прошедших месяцев, проверяем чтобы оно не выходило за какой-то предел (не может же быть скидка больше 100%, да и 100% тоже, этот предел устанавливается бизнесом), ну и добавляем это число к начальной скидке.
    Это то что вам надо.
    Ответ написан
    Комментировать
  • Как не заменять переменную в sh скрипте?

    @MadridianFox
    Web-программист, многостаночник
    поставить обратный слэш перед долларом? не?
    Ответ написан
    3 комментария