• Как сделать чтобы jQuery и MooTools работали и не мешали друг другу?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Где вы вызываете jQuery.noConflict()? попробуйте вызвать после загрузки jQuery, но до загрузки MooTools.
    Если отключить jQuery, то скрипты на MooTools работают нормально?
    Ответ написан
  • Как изменить название коммита в Git?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    --amend
    но только если не успели запушить
    Ответ написан
    1 комментарий
  • Где хранить данные сайта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите на Wordpress - это такая система управления сайтом, она вам поможет управлять разными страницами.
    Купите домен и хостинг, на хостинг установите вордпресс (хотя есть хостинги с уже предустановленным вордпрессом - посмотрите вот тут, например: https://wpmag.ru/wordpress-hosting/. От меня - DigitalOcean будет отличным вариантом).
    В самом вордпрессе настройте несколько категорий, и создавайте страницы на каждый день с праздниками.
    Вот когда появится необходимость выводить на главную страницу именно сегодняшнюю страницу - тогда пишите вопрос, как это сделать. А сейчас поищите подробные статьи по созданию сайтов и конкретно по вордпрессу. Начните читать с этой страницы.
    Ответ написан
    Комментировать
  • Объясните что такое полиморфизм простыми словами ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Полиморфизм указывает, какую версию метода текущего объекта запустить.
    Например, у вас есть несколько наследуемых классов, с разной реализацией одного и того же метода. То есть, у вас есть несколько разных методов с одинаковым именем (и сигнатурой), реализованных в разных классах. Какую версию метода вызвать? Это зависит от типа переменной, в которой находится объект.
    Также с помощью полиморфизма можно поместить объекты разных классов в один массив с типом базового класса.

    Создадим три класса с двумя методами - один виртуальный, а другой нет. Виртуальный метод переопределён (override) в классах-наследниках. Невиртуальный метод просто скрыт в наследниках новой реализацией (невиртуальные нельзя переопределять).
    class Animal {
        public void Info() { Console.WriteLine("Animal"); }
        public virtual void Say() { Console.WriteLine("Nothing to say"); }
    }
        
    class Cat : Animal {
        public void Info() { Console.WriteLine("Cat"); }
        public override void Say() { Console.WriteLine("Meow"); }
    }
        
    class Dog : Animal {
        public void Info() { Console.WriteLine("Dog"); }
        public override void Say() { Console.WriteLine("Woof"); }
    }

    При создании объекта важно, в переменную какого типа объект будет записан:
    Dog dog1 = new Dog();
    Animal dog2 = new Dog();
    // Не виртуальный метод - вызовется метод класса, указанного у переменной 
    dog1.Info(); // напишет Dog
    dog2.Info(); // напишет Animal
    // Виртуальный метод - вызовется метод класса, которого переменная реально имеет
    dog1.Say(); // напишет Woof
    dog2.Say(); // напишет Woof


    А теперь частая ситуация, когда полиморфизм нужен - при итерации массива:
    Animal[] animals = new Animal[10];
    FillAnimals(animals); // заполним массив вперемешку собаками и кошками
    
    foreach (var animal in animals) animal.Say(); // вызовется правильный метод
    // У невиртуальных методов так сделать нельзя! Полиморфизм в действии

    Наследование без виртуальных методов полезен только фиксацией интерфейса.

    Вот весь код примера: code.re/5ZC
    Вставьте его вот сюда и проверьте.

    P.S. Написал код на C#, чтобы подчеркнуть разницу между виртуальными и невиртуальными методами. В Javascript все методы виртуальные (как и в php, например).

    UPD. (спасибо @Petroveg)
    В языке C# (и других статически типизированных) обычно делают так - если метод в базовом классе записывается для всех потомков и оттуда будут использоваться напрямую, то он помечается обычным, невиртуальным. А если метод предназначен для того, чтобы в наследниках его переопределить, то необходимо его сделать виртуальным, чтобы при вызове метода компилятор выбрал нужную версию метода. То есть некоторые методы лучше делать виртуальными, а некоторые нет.
    И ещё раз - виртуальность важна только в одном случае - если объект-наследник записан в переменную базового класса:
    Animal animal = new Dog();
    В javascript невиртуальных методов не бывает - динамическая основа этого языка ВСЕГДА автоматически вызывает именно последнюю версию метода, определяя конкретную по цепочке прототипов. Поэтому в Javascipt, по большому счёту, сильно думать о полиморфизме смысла нет - это только абстрактная концепция, не влияющая на сам код, а только на архитектуру.
    Ответ написан
    6 комментариев
  • Какой есть portable server, который можно использовать для одного конкретного проекта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Denwer
    Работает даже с флэшки и cdrom.
    Не требует прав Администратора для запуска дефолтного сайта (localhost). С правами администратора поддерживает кучу сайтов, каждый в своём домене (http: //site1/, http: //site2/)
    Ответ написан
  • Как получить имя и директорию загруженного файла?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    А вам для чего это нужно сделать? просто чтобы понять, где оно лежит, или записать дополнительно в базу?
    Посмотрите вот этот раздел документации: Custom logic, и связанный с ним раздел Events.
    В этом документе описано, как создать обработчик события записи файла, этот обработчик будет автоматически вызываться при каждом сохранении файла, и там можно сделать что-то с этим файлом.
    Ответ написан
    Комментировать
  • При нескольких одновременых вызовах скрипта некоторые запросы выдают пустую страницу. Что не так?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    В ошибочном ответе нет ваших хедеров, которые задаются скриптом. Может быть, что-то вызывает ошибку, начинается отдача контента, и хедеры уже не отправляются.
    Я так понял, до указанного кода есть другой код?
    Это скрипт на простом php, вне yii?
    Сколько файлов в вашей папке с изображениями?
    Напишите первой строчкой скрипта (если ещё нет такой строчки):
    ob_start();
    И скажите, начнут ли появляться ваши хедеры в браузере в этих ошибочных загрузках.
    Перед fpassthru добавьте ещё
    ob_end_clean();
    Ответ написан
  • Есть ли нормальная он-лайн система для команды разработчиков?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Пользовался одно время Ассемблой. Хорошая штука.
    Сейчас пользуюсь BitBucket - тоже мощная штука, неограниченно бесплатных частных репозиториев (гит, меркуриал), но до 5 участников (можно до 8 увеличить).
    Есть вики, файлы, задачи.
    Плюс у них куча смежных проектов, которые отлично интегрируются с репозиторием.
    Но в Ассембле богаче возможности самой платформы.
    Но в Ассембле бесплатен только один проект :)
    Ответ написан
    Комментировать
  • Как понять, почему Google Play удаляет приложение?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    То есть, у вас монетизация "мимо кассы" гугла? Это запрещено правилами. Все платежи в игру игроки должны делать через платежи гугла. (есть послабления этого правила для интернет-магазинов, торгующих реальными, невиртуальными товарами).
    Собственно, это и указано в ссылке, что вам прислали.
    Единственный вариант для вас - внедрить платежи гугла.
    Не вздумайте ещё раз размещать это приложение без их платежей - вероятен полный бан аккаунта (со всеми другими играми, если есть).
    Кстати, вот почитайте ещё другие причины в этой статье.
    Вам ещё повезло, что вам явно указали причину удаления.
    Ответ написан
    4 комментария
  • Какой есть аналог gametutorials.com?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Необходимые ресурсы для геймдизайнеров - в самой статье больше англоязычных, но внизу и в комментах накидали много разных вариантов.
    gamedev.ru
    Ну и самый главный: habrahabr.ru/hub/gdev
    Ответ написан
    Комментировать
  • Какая есть простая библиотека, реализующая классы в JavaScript?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Для начала, вот обширный список библиотек для реализации классов.
    Лично мне нравится AtomJs от хабрапользователя @TheShock (статья об AtomJS).
    Ответ написан
    Комментировать
  • Верно ли смоделированы данные (MongoDB)?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Во-первых, вы должны определить самый часто возникающий вопрос. Скорее всего, он таков - найти город по его номеру (_id) или по названию (city), и вывести последнюю зарегистрированную инфу, причём не важно, когда именно была эта инфа (то есть время и дата не будут участвовать в условии запроса). А иногда нужно для города вывести всю доступную инфу (например, в виде графика), и тогда нужна уже вся коллекция данных, в том числе и инфа о дате и времени.
    Тогда вам нужна такая схема: в документе храните последнюю запись о погоде. А для истории завести внутреннюю коллекцию, в которую постепенно заносить устаревающие данные.
    {
    	_id : ObjectID(),
    	city: rubtsovsk,
    	forecast : {
    		date: 27.07.2014,
    		time: 18:30,
    		current_temp_c : 19,
    		current_temp_f : 60,
    		cloud_title  : "пасмурно",
    		precip_title : "без осадков"
    	},
    	forecasts : [
    		{
    			date: 27.07.2014,
    			time: 6:30,
    			current_temp_c : 19,
    			current_temp_f : 60,
    			cloud_title  : "пасмурно",
    			precip_title : "без осадков"
    		},
    		{
    			date: 26.07.2014,
    			time: 18:30,
    			current_temp_c : 19,
    			current_temp_f : 60,
    			cloud_title  : "пасмурно",
    			precip_title : "без осадков"
    		}
    	]
    }

    Плюс, я бы всё-таки заменил строковые данные "пасмурно","без осадков" на их коды, а конкретные строки вставлял в программе. Хотя бы чтобы учесть возможность последующей локализации.
    Ответ написан
  • Какой JavaScript фреймворк посоветуете для One-Page Enterprise Web App?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если Enterprise, то Angular.js будет хорошим выбором.
    Есть ещё Durandal.Js - Single Page Apps Done Right. Сам не пробовал, но хвалят.
    Ответ написан
    Комментировать
  • Проиндексируется ли то, что напечатано через js?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Ни гугл, ни яндекс не умеют индексировать страницы, которые показываются javascript-ом, по крайней мере, автоматически.
    Но и гугл, и яндекс этому можно научить.
    Для того, чтобы поисковики умели индексировать ajax-страницы, нужно особенным образом подготовить сайт.
    Например, у вас есть сайт www.example.com. И вы делаете несколько страниц, подгружаемых через ajax, например, у вас вот такие странички:
    www.example.com/#!first
    www.example.com/#!second
    www.example.com/#!third

    (важно добавить восклицательный знак!)
    После этого необходимо подготовить на сервере скрипт, который будет выдавать тот же контент, что и ajax-версия (иначе могут быть проблемы).
    Нужно сделать доступными следующие страницы
    www.example.com/?_escaped_fragment_=first
    www.example.com/?_escaped_fragment_=second
    www.example.com/?_escaped_fragment_=third

    И тогда поисковик сумеет проиндексировать ваш сайт. А ваш javascript никто не будет выполнять, вдруг вы там биткойны майните. (хотя были разговоры, что гугл выполняет скрипты для проверки чго-то там).
    Вот статья про это в гугле, а вот в яндексе.
    Вот статья про то, как всё это можно настроить.
    Ответ написан
    1 комментарий
  • Чтение и запись файла, как заблокировать на время перезаписи?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам нужны семафоры. Заведите в каком-нибудь месте специальный флаг, что файл занят. Перед обработкой файла устанавливаете флаг, после обработки снимаете. Другие клиенты перед запросом файла проверяете флаг, и если установлен, то делаете то, что нужно.
    Флаг можно ставить в каком-нибудь быстром key-value хранилище - memcached, Redis, APC, MongoDB, обычную базу в спец.табличку. На крайний случай - в отдельный файл.

    А можете рассказать, зачем такой странный кейс - запрещать чтение? что будут делать другие клиенты, если читать нельзя? Ждать? А сколько времени происходит обработка данных?
    Пока данные не обновились, почти всегда вполне допускается отдавать предыдущую версию. Данные читаете, обрабатываете в памяти ил отдельном файле, и записываете. Зачем запрещать чтение в это время?
    Ответ написан
    Комментировать
  • Как реализовать самоуничтожение сайта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Присоединяюсь к ответам @sim3x и @EnterSandman.
    Если есть подозрения, то только такая схема работы - заключать договор, не размещать на хостинге заказчика и не отдавать ключи от сервера до оплаты.
    Всякие бэкдоры и бомбы - не то. Как уже сказали, против вас будут бэкапы, плюс пострадает репутация - не отмажетесь.
    Как вариант, размещать сервер на каком-нибудь облачном хостинге, как описано в этой статье.
    Ответ написан
    Комментировать
  • Как обстоят дела с IT в Саратове?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Какое направление IT больше интересует?

    0) Я сам из Саратова. Образование получить можно. СГУ традиционно силён в программировании, но и СГТУ тоже хорошо готовит прогеров. В СГТУ есть факультет APTech. По другим вузам не скажу.
    Есть несколько колледжей, готовящих как программистов, так и спецов по ИБ (правда, с небольшим уклоном на программирование).
    Но при любом уровне преподавания в любом вузе, самым главным было, есть, и будет всегда оставаться одно - стремление изучать и способность самообучаться.

    1) Работа у нас разнообразная, но не очень высокооплачиваемая. Есть несколько приличных веб-студий. Есть компании, работающие "на дядю" (заграничные клиенты) - у них зарплата самая высокая. Есть компании, занимающиеся разработкой железок (телеком, т.п.).
    Плюс, всегда есть возможность фриланса.
    Ответ написан
    1 комментарий
  • Как сделать авторизацию в чате node.js + socket.io на сайте, использующем PHP?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    1) запрашивать из ноды скрипт на php, который будет говорить, авторизован ли пользователь. (лёгкий способ)
    2) хранить в общей базе данных сессии (токен сессии), так что из ноды легко узнать, авторизован ли пользователь (хороший способ)
    3) Реализовать в ноде тот же способ авторизации, что и в php. (плохой способ - придётся повторно запрашивать пароль для входа в чат)
    4) использовать Redis PubSub для обмена информацией между php и node. (плохой способ - в php придётся постоянно запрашивать данные, нет ли в канале нового запроса)
    Ответ написан
    2 комментария
  • Как лучше построить архитектуру серверной части на Erlang (Cowboy) для обмена через WebSocket с мобильными клиентами?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если у вас очень большая нагрузка (или планируется очень большая нагрузка), и один сервер не справляется, то тогда вариант с отдельными воркерами будет более гибким. (Вы даже сможете делать воркеров на разных языках.)
    Если у вас всем занимается один сервер, то лучше использовать только сам Эрланг - он прекрасно держит висящее пассивное соединение. Как данные появятся (их возвратит колбек), так они сразу уйдут клиенту, а пока данные готовятся, то ресурсы на поддержание коннекта практически не расходуются.
    Плюс, насчёт нескольких серверов - Эрланг сам умеет работать на нескольких серверах, так что второй вариант выглядит предпочтительнее. Но первый - гибче. Больше гибкости для последующего развития сервиса.

    Хм. Перечитал ваш вопрос. Воркер у вас только на обработку данных. А Эрланг будет в любом случае держать соединение. Получается, в первом варианте профит будет в случае, если в качестве воркера будет использоваться не-Эрланг, который будет (значительно) быстрее обрабатывать эту специфическую задачу (ежели у вас задача сложно обрабатывается на самом эрланге).
    Ответ написан
  • Не конфликтуют ли Apache и node.js одновременно установленные?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Не конфликтуют, если сидят на разных портах.
    Часто делают так - ноду вешают на порт 3000, и прокидывают вызовы на неё через внешний фронтенд типа nginx, который слушает стандартный 80-й порт. В принципе, можно проксировать ноду и апачем, но не уверен что это хорошая идея - апач не самая шустрая штука. Если хочется иметь несколько сайтов на разных платформах на одном сервере, то лучшим выбором будет поставить nginx фронтендом, и через него использовать и apache, и node.js.
    А сайты на php можно и вообще без апача запускать, прямо через nginx. Разберитесь с этим, будет хороший профит.
    Ответ написан
    4 комментария