• Как распланировать классы для приложения а-ля pastebin.org?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно попробовать отдельный класс ресолвер с единственным (?) методом - определить тип текста. Он же может быть и Фабрикой для создания нужного класса. (я использую псевдокод в стиле c#, думаю, также любому программисту будет понятно)
    class Paste {
      string Brief() {}
      // other methods
    }
    
    class PythonCode : Paste {
      string Brief() {}
    }
    class MayakovskyPoetry : Paste {
      string Brief() {}
    }
    
    class Resolver {
      Paste Guess(string text) {}
    }

    И использование:
    Paste text = Resolver.Guess(userText);
    string brief = text.Brief();
    Ответ написан
    4 комментария
  • Какую книжку почитать об организации классов для игрушек?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Чаще всего, если название класса не приходит на ум, то он спроектирован неверно, содержит слишком разрозненные функции. Не бойтесь делать больше классов, по классу на одну задачу/функцию - не класс, который содержит одну функцию (метод), а класс, который реализует выполнение какой-то одной задачи в программе.
    Обязательно прочите Приёмы объектно-ориентированного проектирования. П.... Это одна из лучших книг по архитектуре систем. Можно сказать, классический труд. Книга не самая простая, но даст вам необходимую базу для дальнейшего роста.
    Ответ написан
    Комментировать
  • Что такое bool(false)?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Ошибка в запросе, поэтому вернулся не ресурс, а значение false.
    Возможные причины ошибки:
    1) нет подключения к базе данных (ранее не сделали подключение, или указали неверные данные)
    2) ошибка в SQL-запросе, например, неправильно указали имя таблицы или поля.
    Для того. чтобы точнее сказать, в чём дело, нужно увидеть текст ошибки. Добавьте после команды var_dump($result); вывод ошибки:
    echo mysql_errno($link) . ": " . mysql_error($link) . "\n";

    и укажите, что там будет написано.
    Ответ написан
    Комментировать
  • Как объединить несколько ПК по wi-fi и нужен ли маршрутизатор?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Так сделать можно, если получится настроить у принтеров айпи в одной подсети и если wifi-адаптер принтеров поддерживает этот режим.
    Вот инструкция, как это делать.
    Но лучше не парьтесь и поставьте точку доступа, они сейчас очень дешёвые.
    Ответ написан
    2 комментария
  • SSH ключи для GitHub работают на BitBucket?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Может, просто забыли, когда на битбакет тот же самый ключ добавили? В настройках аккаунта битбакета есть добавленный ключ? С какой сигнатурой?
    Ответ написан
  • Как создать кнопку для сайта, при нажатии которой изображение автоматически загружается/сохраняется на компьютер пользователя?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Именно сразу сохранить на диск не получится. Но можно сделать обычную ссылку, после нажатия на которую автоматически начнётся обычное скачивание файла штатными средствами браузера, не зависимо от того, какой тип файла (хоть html). Для этого нужно в заголовки ответа добавить заголовок Content-Disposition: attachment. Добавить этот заголовок можно через php-скрипт (как указал dzedzinskiy), можно через настройку веб-сервера. Во втором случае удобнее расположить все файлы для скачивания в отдельную папку, специально для этого предназначенную, и повесить в настройках веб-сервера форсированно отдавать файлы из папки (если апач, то можно в .htaccess этой папки указать).
    Ответ написан
    Комментировать
  • Почему javascript проваливает проверку когда много условий?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если у вас в элементах var2-var4 записаны числа, то тип данных всё равно строка, и для сравнения с нулём нужно преобразовать строку в число. Либо как сказал @GM2mars, только в его примере лучше указать вторым параметром систему счисления: parseInt(form.var4.value, 10) === 0, потому как в старых браузерах числа, начинающиеся с нуля ("012"), считались восьмеричным числом. Либо просто указать +form.var4.value === 0, где унарный плюс переведёт строку в число.
    А само присвоение valid = false в данном случае корректно.
    Но я обычно делаю так:
    function validate(form) {
      var errors = [];
      if (form.var1.value.length < 2) errors.push('length');
      if (+form.var2.value == 0) errors.push('var2');
      if (+form.var3.value == 0) errors.push('var3');
      if (+form.var4.value == 0) errors.push('var4');
      showErrors(errors);
      return errors.length == 0;
    }
    function showErrors(errors) {
      foreach (error in errors) {
        switch (errors[error]) {
          case 'length': document.getElementById('var1_e').innerHTML='err1'; break;
          case 'var2': document.getElementById('var2_e').innerHTML='err2'; break;
          case 'var3': document.getElementById('var3_e').innerHTML='err3'; break;
          case 'var4': document.getElementById('var4_e').innerHTML='err4'; break;
        }
      }
    }

    Такой подход позволяет разделить собственно проверку значений и обработку ошибок.
    Ответ написан
  • Как выбрать и заменить элемент jQuery?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    <div class="container">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
    </div>

    $('.item').click(function(){
        $('.container .item:first-child').insertAfter(this);
        $(this).parent().prepend(this);
    });

    Вот этот код рабочий: jsfiddle.net/44R5R/2
    Этот код ставит кликнутый элемент в начало списка блоков, а на его место ставит первый элемент.
    Дальше я не понял, что делать надо с удалениями. Если нужно сделать, чтобы тот, по кому кликнули, стал первым - и единственным, то остальные нужно просто удалить.
    Ответ написан
    Комментировать
  • Как найти и заменить текст в базе данных mysql?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    UPDATE articles SET text = REPLACE(text, '8-927-123-45-67', '8-927-123-76-54') WHERE text LIKE '%8-927-123-45-67%'
    Ответ написан
  • Как проверить на более точное совпадение?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    вам какие строчки сравнивать? Строчки 'v.y' и 'vry' разные, их и правда легко сравнить обычным оператором ==. Если вам нужно, чтобы строки 'v.y' и 'V.y' и 'v.Y' были равны, то есть без учёта регистра, то лучше сравнивать строки, приведённые к нижнему регистру:
    function checkMatch(request, item) {
     	return request.toLowerCase() === item.toLowerCase();
     }

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

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам надо сделать весь цикл внутри формы, а не создавать отдельные формы в каждой строке:
    echo "<form method=\"post\" action=\"\">";
    echo "<table>";
    for ($i = 0; $i < count($items); $i++) {
      $id = $items[$i]['id'];
      $text = $items[$i]['text'];
      echo "  <tr>
        <td><label><input type=\"checkbox\" name=\"delete[]\" value=\"$id\"> Удалить</label></td>
        <td>$text</td>
      </tr>\n";
    }
    echo "</table>";
    echo "<input type=\"submit\">";
    echo "</form>";

    Все отмеченные id, и только отмеченные, появятся в массиве $_POST['delete'].
    С ними нужно уже делать то, что вам там надо - например, передать в SQL запрос DELETE.
    Только помните, что в массиве могут прийти не только числа, хакер может передать туда строчки с sql-инъекцией.
    Ответ написан
    5 комментариев
  • Какие есть инструменты для сборки веб-проекта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Для автоматизации рутинных процедур (склейка css/js/картинок, сжатие картинок, т.п.) можно попробовать Grunt (сложнее, но больше готовых тасков) или Gulp (попроще, поменьше готовых тасков, но простые можно легко найти готовые).
    Для совместной работы используйте git, в качестве клиента под win могу порекомендовать SourceTree.
    Заведите себе сервер, на который будете выкладывать результат вашей работы, желательно vpn, чтобы туда можно было ставить свои программы. (Рекомендую попробовать самый дешёвый сервер у DigitalOcean.) И осваивайте сразу современные методики разработки и деплоя (размещения).
    Ответ написан
    1 комментарий
  • Веб-разработчик, программист или нет?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Программист - тот, кто использует языки программирования для решения своих задач. А какова задача - программа или сайт - уже другой вопрос.
    Использование php/python/ruby/node.js/etc на сервере, скорее всего, даёт разработчику возможность назвать себя программистом.
    Использование javascript на клиентской стороне для программирования бизнес-логики (например, один из js-фреймворков) - тоже программист.
    Использование одной из популярных CMS (Wordpress, Drupal, Joomla, etc.) и дописывание кастомных модулей для них - программист.
    А если разработчик использует в качестве основных инструментов для своей работы не-языки программирования (HTML, CSS), то он не программист, даже если он пару раз вставлял jQuery-скрипты для создания анимации на страницу, и даже если он поменял некоторые вещи в этих скриптах.
    Ответ написан
    Комментировать
  • Как лучше оптимизировать JavaScript код?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    function handleChange(input) {
        var index = input.id.split('-')[1];
        var counch = document.getElementById('countspr-' + index);
        if (input.checked) {
    	counch.style.display='inline';
    	counch.value = 1;
    	counch.focus();
        } else {
    	counch.style.display='none';
    	counch.value = '' ;
        }
    }

    Использовать так:
    <input style="display:none" id="countspr-1" name="checkcountsp[]" type="text" maxlength="2" size="1" value="" > 
    <input type="checkbox" id="spr-1" name="checksp[]" onchange="handleChange(this)">Товар 1

    Обратите внимание, я добавил дефис в id элементов.
    У элемента chackbox не ставится атрибут value. Если надо установить галочку, то ставится атрибут checked, если нужно вывести подсказку при наведении, то атрибут title:
    <input type="checkbox" name="checkboxname" checked title="Подсказка"> Описание
    Ответ написан
    1 комментарий
  • Где и как вы храните информацию о своей IT инфраструктуре?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите статью о сервисе Appnestic. У них, к сожалению, нет бесплатного тарифа, но у них есть свой редактор сети хостов, с возможностью указания разных параметров к каждому. Может, если поговорить с автором @chuck, то он сможет что-то предложить.
    Ответ написан
  • Какой велосипед написать на с++ для закрепления изученного?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Сделайте какую-нибудь простую игру, с минимумом действий, но с задействованием всего вашего арсенала с c++, особенно ООП.
    Например, напишите rogue-like игру, типа того, что описана в этом топике.
    Тут у вас будет и работа с графикой, и хранение данных в файлах с конфигами (предметы, монстры, уровни), и игровая механика (перемещение, удары), и искусственный интеллект (поиск пути).
    Графику можно сделать как консольной (в текстовом режиме), так и освоить какую-нибудь графическую библиотеку (Qt, например). А можно написать два разных интерфейса и выбирать - запустить в консоли или в окне.
    Позже можно будет добавить работу с сетью и режим игры вдвоём.
    Этот проект (относительно) не сложный, но даст вам очень много практического опыта. Ведь одно дело писать классы в учебных целях, когда заранее известна конечная иерархия, а другое дело - полностью разработать иерархию, реализовать её, увидеть, что вышло не очень (так часто бывает, нужен опыт), найти способ как провести рефакторинг, обнаружить ценность интерфейсов, переписать классы на использование интерфейсов (или общие абстрактные предки), увидеть, что это гораздо лучше, порадоваться за себя, дать поиграть друзьям, получить багрепорты, исправить все баги, и так далее.
    Ответ написан
    Комментировать
  • Как мне починить express приложение после скачки с гита?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    У вас есть файл events.js? в нём в 72 строке есть строчка throw er; которая выбрасывает исключение, что и приводит к тому, что приложение вылетает. По идее, до этой строчки программа не должна доходить, либо должен быть глобальный обработчик исключений.
    После загрузки с гит вы сделали npm install? загрузили все нужные модули?
    UPD. Выяснили, что проблема не в вашем коде, а в стороннем модуле, точнее, в вашем окружении для работы этого модуля.
    У вас стоит ruby на этом компьютере? для работы модуля node-compass требуется установленный ruby gem (ссылка, как установить)
    Ответ написан
  • Какие есть технологии для разработки браузерных онлайн-игр?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Как верно сказал @Eugene22, выбирать язык стоит из двух факторов - 1) существующий опыт на каком-то языке и 2) что хочется изучить для будущего. Если с первым пунктом плохо, то остаётся выбрать какой-то язык и начать его изучать.
    Браузерные игры состоят из трёх компонентов:
    1) клиентская часть - тут практически без вариантов - javascript.
    2) серверная часть - тут есть множество вариантов. Из основных два варианта - php или Node.js (это серверный javascript). Оба варианта достойны рассмотрения, у каждого есть свои достоинства и недостатки. Также можно рассмотреть Python и Ruby. Не стоит сбрасывать со счёта Java и .Net языки (тут c# и asp.net). Ну и экзотика - Erlang или Go (всё-таки go я отнёс к экзотике, потому что это развивающийся язык, но активно набирает очки).
    3) База данных - для хранения игровых данных. Здесь тоже есть о чём подумать - взять обычный привычный вдоль и поперёк исследованный MySQL, или подумать о более мощных базах типа Postgres, или взять модный MongoDb и его nosql-братьев.
    Выбирайте, что вам нужно и вперёд. Но самый главный мой совет - не беритесь за что-то "типа Травиана и Гриполиса" в качестве первого проекта. Подобные проекты делаются годами профессиональными опытными программистами. Сделайте что-то гораздо проще - типа танчиков, бомбермена, вертолётиков, гонок - где есть только одна основная игровая механика. За время разработки этого проекта вы получите бесценный опыт, без которого вы даже не сможете оценить сложность тех проектов, о которых вы говорили в вопросе.

    UPD. В своём ответе вы просите добавить аргументов в пользу некоторых серверных языков. Добавлю про них.
    Первым рассмотрим php. Это достаточно простой язык для начала написания скриптов, и можно очень быстро написать что-то уже рабочее. Но это язык, который за внешней простотой прячет большую гибкость и достаточно сложные моменты. Поэтому для профессионального его использования нужны его глубокие знания, иначе получившийся код будет 1) медленным, 2) дырявым (ошибки и уязвимости) и 3) сложным в поддержке (сложно добавлять новые функции). Но начать его использовать очень просто.
    Node.js. Это серверная платформа, имеющая в качестве языка программирования javascript. Он в некоторых задачах намного быстрее, чем php, но в некоторых может быть сравним по скорости. Его преимущество, что используется тот же язык, что и для клиентской части - меньше изучать. Его сложность в том, что для серверного языка он достаточно сложен, писать хороший код сложнее, чем на php. Плюс, его основные парадигмы - прототипное наследование и асинхронный код - достаточно сложны для понимания. Хорошим советом может оказаться учиться писать не обычный javascript, а его разновидность CoffeeScript, но многие не согласятся, тут нет единого мнения.
    Python. Это очень мощный язык, позволяющий писать программы не только для web (собственно, сервер игры), но он используется очень много где. Он имеет очень простой синтаксис (кстати, отличающийся от многих других c-подобных языков), но очень гибкий и быстрый, и обладает богатейшей библиотекой готового кода (в принципе, php и node.js тоже обладают этим преимуществом). Недостатком можно отметить то, что гораздо меньшее количество программистов им владеют, и может быть, будет сложнее получить консультацию по возникшим вопросам (а вопросы будут - причём в любом языке). В общем, Python - отличный выбор для начала изучения серверного программирования.
    Ruby может дать очень быстрый старт и быструю разработку. Но его знают ещё меньше программистов, чем Python. Насчёт скорости выполнения он, вроде, медленнее питона (тут я не уверен, не хочу обманывать - у меня нет опыта на ruby). Его синтаксис достаточно своеобразен. Но если вы его хорошо освоите, то никогда не останетесь без высокооплачиваемой работы.
    Java и C# - очень мощные языки общего назначения, дадут очень сильную платформу для любого приложения, в том числе и сервера. Но они сложные, изучать их и хорошо писать на них гораздо сложнее предыдущих рассмотренных языков.
    Go - новый развивающийся язык, можно рассмотреть его для изучения. Но на нём пока мало готового кода, мало материалов, небольшое сообщество.
    Erlang - функциональный язык с очень необычной архитектурой (с точки зрения всех предыдущих языков), и очень необычный синтаксис. Изучать его сложно, но он даёт потрясающие результаты - в некоторых задачах. Советовать его не буду.
    Ответ написан
    3 комментария
  • Правильно ли написано "web develope"?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Web development - веб-разработка.
    Если вы хотите develop, то это глагол, и фраза "web develop" будет переводиться как "веб разрабатывает", да к тому же с ошибкой - "web develops". Нужно перфразировать, что-то типа вот этого:
    We develop the web, I develop websites.
    Ну а про слово "develope" вам сказал @Scorpi. Погуглите, как часто это слово используется и в каком контексте. Но я бы не советовал.
    Ответ написан
    Комментировать
  • Как сделать правильный редирект при переходе с ПС?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    REQUEST_URI передаётся всегда, его не может не быть.
    Проблема может быть в том, что вы не поставили кавычки $_SERVER[REQUEST_URI], и выражение в скобках воспринимается как константа, и выскакивает ошибка уровня NOTICE.
    Попробуйте такой код:
    if( !isset($_SESSION['version']) && wp_is_mobile()) {
       wp_redirect( $_SERVER['REQUEST_URI'] . '?version=mobile' ); 
       exit;
    }
    Ответ написан
    Комментировать