• Как улучшить процесс разработки/тестирования/деплоя?

    возьмите тот же Trello, создайте в нем несколько колонок в стиле Agile: ToDo, In Development, Testing, ..., Release, Released (ну или другой набор, до которого Вы постепенно эволюционируете)
    работайте с Git по GitFlow - это довольно удобная методология, которая наведет у вас порядок как в репозитории, как в проекте так и в релизах
    если коротко:
    - создаете таск
    - создаете ветку из develop для этой таски (feature/*)
    - кодите, коммитите, радуетесь жизни
    - отдаете таску вместе с веткой тестировние (вот тут можно использовать Jenkins для того, чтобы поднять проект в тестовом окружении на какой-то ветке дабы руками не разворачивать, а можно подружить Jenkins с Bitbuket и объяснить ему, что нужно поднимать проект в тестовом окружении во время создания пулл-ректвеста feature/* => develop)
    - все, что оттестировали можете сливать обратно в develop; хотя можно и не сливать их, а ждать дня релиза и тогда в develop сливать уже оттестированные фичи
    - из ветки develop дулаете ветку releast/*, прогоняете по ней все регрессивное тестирование, описываете release notes
    - заканчиваете релиз, мержем этой ветки в master и обратно в develop с установкой не мастере тега с номером версии
    https://trello.com/
    https://habrahabr.ru/post/106912/
    https://jenkins.io/
    мы используем JIRA+Bitbucket
    Ответ написан
    1 комментарий
  • Типы образуются от классов?

    нет, Java такое не должна собрать и должна сказать, что класс `Person` не найден

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

    вы верно мыслите - слева у вас стоит тип, а справа вы используете класс. в случае с классом, который ни от чего не наслудуется и от него ничего не наследуется тип - это и есть класс.

    далее представим, что у вас есть два класса Person и Worker. при этом Worker наследуется от Person. вы можете смело писать следующее:
    Person personFoo = new Person();
    Person personBar = new Worker();
    Worker workerBeez = new Worker();

    с первой и третьей строкой все ясно, а вторая строка, как вы понимаете, из-за полиморфизма. объекты personFoo и personBar будут принадлежать одному типу: Person. все эти три объекта формально будут принадлежать к одному типу и workerBeez можно использовать там же, где и Person если соблюден принцип подстановки

    аналогичная ситуация с интерфейсами. если же класс реализует интерфейс, то объекты этого класса будут относиться еще и к типу интерфейса:
    IWorkable worker = new Worker(); // при условии, что Worker реализует интерфейс IWorkable


    теперь если все это собрать в кучу, то класс, которые наследуется от другого класса и реализует несколько интерфейсов, по сути относится к нескольким типам: к типу, который относится к классу, от которого он наследуется, к типам всех интерфейсов и к собственному типу
    Ответ написан
    Комментировать
  • Как лучше организовать работу с удаленным сервером через phpstorm?

    я так работал с Yii(1). это заведомо неправильный и неудобный подход (скажу по личному опыту). правильным будет разворачивание всего, что нужно локально с деплоем по на тестовый сервер (если он вообще будет нужен) после коммитов или мержей (в общем, в определенные веховые этапы разработки), а разработку вести локально с локальным репозом гита, через который будете пушить изменения в удаленный. а удаленный репоз использовать для деплоя. в рол удаленного репоза можно выбрать тот же (один из):
    1. gitolite
    2. gitlab
    3. bitbucket
    4. github (публично)

    если у вас винда, то можно поднять тот же OpenServer или же Vagrant. если же линукс, то все, что угодно начиная от локального LAMP-сервера и заканчивая тем же вагрантом или докером
    Ответ написан
  • Можно ли посмотреть, что печатает в консоли Linux пользователь подключенный по SSH?

    есть такая утилита `w`:
    w - Show who is logged on and what they are doing
    просто одна только буковка в терминале
    в последней колонке указывается последняя команда, которую ввел юзер
    на сервере при подключении удаленно по ssh работает и отображает корректно
    sazhyk упоминал, что можно настроить bash-окружение так, чтобы история дампилась сразу же в ~/.bash_history:
    нужно добавить следующие строки в ~/.bashrc или в ~/.bash_profile:
    shopt -s histappend
    PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

    источник: web.archive.org/web/20090815205011/http://www.cube...
    Ответ написан
    Комментировать
  • Как перенести docker root dir на другой диск?

    на сколько я помню, я нагло удалял старую папку рабочую папку с докером, изменял в конфиге /etc/defaults/docker путь к папке и перезапускал его. он у меня исправно работал. но это было еще на v1.7 и на убунте 14.04, если мне не изменяет память. сейчас он у меня живет в родной папке и я не переносил его никуда т.к. заменил свою SSD-шку на ноуте на более объемную.
    тут ребята пишут: https://github.com/docker/docker/issues/3127#issue...
    кажется, я именно так и делал - прописывал в конфиге
    опишите более подробно что вы делаете и какое у вас окружение (какая ОСь, к примеру)
    Ответ написан
    Комментировать
  • Как запускать модуль из командной строки одной командой?

    для варианта под линукс я создал следующий файл с именем script:
    #!/usr/bin/env node
    
    console.log("Hallo!");

    и сделал его исполняемым:
    chmod +x script
    и дальше запустил его:
    $ ./script 
    Hallo!

    дальше, вы должны его положить или слинкова в одну из директорий, которые записаны в переменной окружения $PATH (я предполагаю, что мы говорим о линуксе) либо же добавить в $PATH директорию, в которой лежит ваш скрипт. тогда вы сможете его вызывать из любого места. обычно для этого скрипт ложат или линкуют в ~/bin директорию
    Ответ написан
    4 комментария
  • Обрезать изображение на php при загрузке?

    советую использовать расширениe Imagick и его метод Imagick::resizeImage. Это разширение довольно богато на функционал и все, что вам нужно в плане работы с изображениями вы можете сделать с его помощью
    Ответ написан
    Комментировать
  • Почему php не видит отсылаемый аяксом объект?

    у вас $_GET будет содержать массив, который вы передали в data. тоесть, вы можете смело обращаться к $_GET['youIps'] и $_GET['name'], а не к $_GET['ourDataSend']. ourDataSend - это всего лишь имя переменной и оно не передается AJAX-ом
    Ответ написан
  • Какой смысл в метках?

    вот вам синтетический и глупый пример:
    outerLoop: for(var i = 0; i < 10; i++){
    	for(var j = 0; j < 10; j++){
    		if(i > 5 && i % 2 == 0){
    			break outerLoop;
    		}
    	}
    }

    в этом случае прервется внешний цикл (по i). если не использовать метку цикла вместе с брейком, то прервется только внутренний цикл (по j)

    метки используются очень редко и обычно их использоание считается дурным тоном, но если без них уж прям никуда и они дейсвительно облегчают понимание кода и уменьшают его количество, то можно, но с осторожностью.
    Ответ написан
    1 комментарий
  • Почему Symfony не использует routing.yml из бандла?

    новый роут-конфиг (в бандле src/AppBundle/Resources/config/routing.yml) нужно импортировать в главный роут-конфиг (в app/config/routing.yml): symfony.com/doc/2.8/book/routing.html#including-ex...
    Ответ написан
    4 комментария
  • Как работают скриптовые языки встроенные в приложения?

    В приложении должна быть реализована поддержка плагинов.

    например в С/C++ возможна динамическая подгрузка модулей. тоесть, к примеру, нужно положить скомпилированную библиотеку в папку с планинами, а приложение будет загружать их оттуда приблизительно так: проходит по всем либам в папке, загружает их и запускает определенны метод/ф-ию из этой библиотеки (как писал GavriKos - таким макаром плагин реализует некий интерфейс) - этот метод/ф-ия являет точкой входа для плагина

    другие приложения, тот же WoW, используют интерпретируемые языки для написания плагинов. в этом случае этот язык дергает API-функции скомпиленого приложения (ядра). кстати, ярким примером является NodeJS. там ядро написано на C, а работа с этим ядром идет уже на языке JavaScript. к примеру, мы хотим записать в файл, мы вызываем ф-ию fs.write, эта ф-ия запускает ф-ию ядра, которая уже записывает это дело в файл и после записи вызывает коллбек. приблизительно так же реализованы интерфейсные расширения в WoW

    в голову приходит еще один вариант: паттерн Интерпретатор. еси коротко, то суть в том, что пользователь пишет некую лексическую конструкцию по некоторым правилам, а приложение разбирает эту конструкцию и делает выводи что нужно сделать. это тоже своего рода плагин.
    Ответ написан
    Комментировать
  • Как работать с Phantomjs через Proxy?

    попробуйте сделать вот так:
    var phantom = require('phantom');
    phantom.create({
        parameters: {
            proxy: '12.34.56.78:9876'
        }
    }, function(browser){
        browser.createPage(function(page){
            page.open('http://example.com/req.php', function() {
                ...
            });
        });
    });
    Ответ написан
    Комментировать
  • Как определить находится ли мышка над элементом в данный момент?

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

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

    вот здесь, в первоисточнике, есть достойное описание как сохранять полученные файлы на сервере.
    весь процесс происходит примерно так:
    1. в форме вы добавляете инпут для файла и меняете метод отправки формы (как у вас в уроке
    2. на сервере файл приходит через POST-запрос. Zend-механизмами этот файл сохраняется во временную директорию под временным именем, а информация о нем доступна в суперглобальном массиве $_FILES (под ключиком, который соответствует имени инпута в форме)
    3. далее вы должны проверить не возникли ли какие-то ошибки во время загрузки файла
    4. если ошибок не возникло, то вы что-то далаете с этим файлом: можете его сохранить куда вам нужно или отправить почтой, или еще что-то
    Ответ написан
    1 комментарий
  • Зачем писать такой большой код?

    добавлю к вышесказанному: такой код проще тестировать
    Ответ написан
    Комментировать
  • Как при переходе по ссылке отправить информацию серверу без get запроса?

    не обязательно использовать AJAX
    рендерим менюшку с вашими чистыми ссылочками
    с помощью JS-а на каждую ссылочку с меню вешаем обработчик клика, который делает следующее: он запрещает переход по ссылке, но при этом отправляет пользователя по модифицированной ссылке. что-то типа этого:
    // псевдокод
    window.location.href = $(e.currentTarget).href + '?from=menu&id=foo';

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

    Update 1: далее ТС упомянул, что ссылка в адресной строке после перехода не должна содержать дополнительных параметров. для этого нужно очистить url и редиректить уже на очищенный url. в этом случае будет все красиво
    Ответ написан
  • Правильная ли декомпозиция базы данных?

    я бы сделал так:
    есть набор мест, которые как-то там характеризируются (пускай это будет сектор, ряд и место - на самом деле это неважно) и каждая такая запись имеет свою айдишку:
    [Seat]
    id
    sector
    row
    number

    на сколько я понимаю, покупаются/резервируются места на некоторое мероприятие (матч, концерт и т.д.). соответственно, должна быть таблица этих событий. дл простоты охарактеризируем ее только датой. нам и дата не нужна, но пускай себе будет
    [Event]
    id
    datetime

    резервирование или покупка места должна относиться к таблице Seat и к таблице Event:
    [Reservation]
    id
    seat_id
    event_id
    // another fields

    Seat к Reservation как one-to-many
    Event к Reservation как one-to-many
    пользователя можно втулить сюда же, но бы выделил связь с юзером в отдельны сущности: Ticket как билет и еще одну сущность как факт продажи билета некому юзеру TicketTransfer. но это уже зависит от вашего сервиса, который вы реализуете

    я считаю, что так будет правильно
    Ответ написан
    Комментировать
  • Как реализовать сортировку корневых элементов в Doctrine Extensions Tree?

    я советую хранить в одной таблице не лес, а одно дерево. тоесть, иметь только один корневой элемент и от него уже раскидывать ветви. он может быть пустым, фейковым, без особой смысловой нагрузки, но он должен быть один. тогда у вас исчезнут упомянутые проблемы
    Ответ написан
    2 комментария
  • Откуда начинает выполнятся дочерний процесс?

    если писать на С и использовать fork, то дочерний процесс начинает исполняться с места, где был вызван fork. тогда код разделяется на два подпространства: родительский процесс и форкнутый процесс
    stackoverflow.com/a/11734354
    судя по коду, в питоне аналогично - процесс исполняется с места форка
    Ответ написан
  • Как получить доступ к сокету без request?

    тогда нужно заводить отдельный сторедж для соединений и добавлять их туда при каждом подключении. а связывать крон-джобу с express-сервером нужно через какой-то интерфейс. мне в голову приходит RabbitMQ
    Ответ написан
    4 комментария