• Как новичку работать с git для поддержки одного сайта?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Как открыть файл .cpp .h и прочие в программе на С?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Эм... ну так открывайте. это все те же текстовые форматы, на расширение файла вообще плевать.
    Ответ написан
  • Не могу использовать операции ветвления в Qt?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ui->okbutton->clicked() судя по всему возвращает void. Дальше читать тексты ошибок.
    Ответ написан
    Комментировать
  • Dependency Injection (Какой способ лучше использовать)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1-ый вариант валиден если бы было так:
    Handler(ServiceFactory factory) {
            this.factory = factory;
            this.service = factory.createService()
        }

    если оба сервиса существуют в единственном экземпляре - то второй вариант. Если нужно делать шаблоны типа Registry и хранить там пул сервисов, то тогда опять же как и в случае с фабриками - первый вариант.
    Ответ написан
    5 комментариев
  • Что значит передача результата работы одного обработчика другому?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    пример - модальное окно с бэкдропом (примечание, это просто пример. Обычно это делают через stopPropogation).

    <div class="container">
        <button class="child">Close</button>
    </div>


    document.addEventListener('click', function (e) {
        if (e.doNotClose) {
              return false;
        }
        // закрываем модальное окно
    }, true);
    
    document.querySelector('container').addEventListener('click', function(e) {
        // просим обработчик кликов на документе не закрывать окно
        e.doNotClose = e.hasOwnProperty('doNotClose') ? e.doNotClose : true;
    });
    
    document.querySelector('button').addEventListener('click', function (e) {
        // просим обработчик кликов на контенере не мешать третьему обработчику закрывать окно
        e.doNotClose = false;
    });


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

    В 99% случаев обычно все работают с preventDefault и stopPropogation. На и еще можно в таком случае использовать: у нас есть десяток ктопок, на каждом свой обработчик. Итоговое действие одно, отправить куда-то данные или что-то сделать, причем сами обработчики не знают что, их задача только данные подготовить. А обработчик контейнера, в котором эти кнопки, принимает данные и уже с ними что-то делает. События всплывают всегда вверх, обработчики так же вызываются в поредке вложенности элементов, на которые они навешаны.
    Ответ написан
    Комментировать
  • Как установить Yii 2 advanced через composer?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как понимаю, токен с GitHub а. В чем проблема?

    в этом и проблема. API гитхаба без авторизации накладывает жесточайшие лимиты. Идите в свой профиль на гитхабе, создайте токен и добавьте его в настройки composer на своей машине. composer в ошибках все должен был написать.

    nschoenmaker.nl/2013/02/composer-api-limit-at-github
    Ответ написан
    Комментировать
  • Как сделать,что бы автоматически при коммите изменения выливались на хостинг?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    поправка - не по коммиту а по git push на удаленный сервер. Если доступ по SSH предоставляется, проблем быть не должно.

    http://git-scm.com/book/ru/%D0%9D%D0%B0%D1%81%D1%8...
    Ответ написан
    Комментировать
  • Работа в Беларуси в IT ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    (что бы зимой не ниже -5/-10)

    Не уверен что в Бресте будут такие условия. Хотя ниже редко.

    В Бресте у вас думаю будут кое какие проблемы с поиском работы. Почти все сконцентрировано в Минске, что-то где могут заинтересовать UNIX/Linux администраторы есть в Гродно, ну а так я бы на вашем месте посмотрел по вакансиям/порассылал резюмешки.

    В Минке проблем с трудоустройством не должно быть. Опять же можете сначала по удаленке пройти собес.

    По поводу политики... А что вас интересует то? Если в нее не лесть то все вроде бы и нормально.
    Ответ написан
    4 комментария
  • Как создать GUI на чистом C?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Берете Qt, осваиваете C++ а на сях пишите только библиотеки.

    p.s. сишные программы должны быть только под консоль, ибо это тру.
    Ответ написан
    2 комментария
  • Есть ли в C# аналог numeric_limits из C++?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Int16.MaxValue
    Int16.MinValue
    Int.MaxValue
    Int.MinValue
    Double.Epsilon


    Словом... частично все это есть, но судя по всему не полностью.
    Ответ написан
    5 комментариев
  • Как настроить зависимости для проекта через composer?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    composer умеет работать с GIT репозиториями. Вам просто в composer.json каждого проекта придется прописать репозиторий для этого пакета.

    Подробнее в документации. https://getcomposer.org/doc/04-schema.md#repositories
    Ответ написан
    Комментировать
  • Зачем в angularjs использовать jquery?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    angular - для построения приложений, jquery - для работы с DOM. Знаете, бывает такая грустная и печальная ситуация, когда в спецификациях к проекту прописывают очень грустную строчку типа "Supported browsers: IE8+ and last two versions of another browsers". И вот после того как закончишь пускать скупую слезу, открываешь консоль, переходишь в директорию проекта и пишешь: bower install --save jquery.

    Суть не в дурацких jQuery плагинах (хотя и это может быть вполне себе веской причиной), а в том что jQuery предоставляет чертовски удобное API для работы с DOM, которое содержит в себе огромную кучу кастылей только ради того, что бы вы не думали о тех нюансах, которые могут вас подстерегать при казалось бы банальных вещях.

    На своих проектах, которые реализуются под десктопные браузеры, я всегда подключаю jQuery, только потому что обжегся уже несколько раз при использовании API браузера в чистом виде. Иногда там такие интересные особенности закрадываются, которые без пары лет опыта работы и не узнаешь, а тратить деньги клиента только потому что "jQuery это уже не круто" и потом впустую просирать время за долгими ночными дебагами, имхо дебилизм.
    Ответ написан
  • Как сделать Router для PHP фреймфорка?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    По поводу инклудов - читаем про PSR-0/PSR-4 автозагрузку.

    $className = sprintf('\MyCoolFramework\Module\%s\Controller', $this->modul);
    // подключать не нужно, для этого нужен автозагрузчик 
    // который из неймспеса и названия класса сгенерит вам путь к файлу и подключит его
    // некрасивый способ
    $controller = new $className();
    // красивый способ, но медленный, зато с плюшками
    $class = new ReflectionClass($className);
    $controller = $class->newInstance();


    Плюшки метода с рефлексиями в том, что вы можете:
    1) Узнать есть ли какие-то требования у контроллера в плане аргументов конструктора и предоставть ему зависимости
    2) достать метод из класса который вы хотите вызвать, получить список аргументов и попытаться сопоставить имеющиеся данные с этими аргументами.
    3) запускать метод экшена так же стоит рефлексией, и достать рефлексию нужного метода (и проверить что он есть) этим методом проще.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я слегка к вечеру начал туго соображать, но давайте попробуем. Возможно я допущу какое грубое невежество или моя версия алгоритма не слишком интересная... но мне откровенно лень много думать. Так что задачу я решу почти в лоб. Для начала определимся что мы должны сделать...

    $words = explode(' ', 'a b c d'); // сразу представим строку как массив для более удобной работы с оным
    $expectedResult = [
        // 1st level
        [
            'a b c d e',
        ],
        // 2-ой уровень
        [
            'a',
            'b c d e'
        ],
        [
            'a b',
            'c d',
        ],
        [
            'a b c',
            'd'
        ],
        // 3-ий уровень
        [
            'a',
            'b',
            'c d',
        ],
        [
            'a',
            'b c',
            'd'
        ],
        [
            'a b',
            'c',
            'd'
        ],
        // 4-ый уровень
        [
            'a',
            'b',
            'c',
            'd'
        ]
    ];


    каждый уровень представляет из себя комбинации предыдущего:
    то есть для строки "a b c d" первый элемент третьего уровня:
    [
        'a',
        'b',
        'c d'
    ]

    можно составить как конкатенацию первого элементов второго уровня строки 'b c d' с добавлением оторванной части
    ['a'] + ['b', 'c d']
    Следовательно можно упростить алгоритм введя рекурсию постоянно уменьшая сложность. Разделяй и влавствуй как говориться. Поскольку нас теперь заботят только элементы первого и второго уровня алгорим существенно упрощается (можно хоть 666 уровней делать, реализация от этого сложнее не становится. Единственный минус - на большой вложенности можно упереться в лимит по стэку - решается заменой стэка на очередь вызовов но это не здесь и не сейчас).

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

    Допустим у нас 4 слова в строке. Нам нужно собрать все варианты элементов третьего уровня. Для этого нам надо:
    1) ['a'] + ['b', 'c d'] - есть наборы для строк "a" и "b c d"
    2) ['a'] + ['b с', 'd'] - есть наборы для строк "a" и "b c d"
    3) ['a b'] + ['c', 'd'] - есть наборы для строк "a b" и "c d"
    На третьем стэпе мы достигли ситуации, при которой у нас вторая часть строки содержит количество слов равной требуемому уровню (два слова для второго уровня). Собирать комбинации больше неизчего. Сделаем это нашим уловием выхода из цикла.

    Давайте теперь попробуем соорудить функцию, которая будет корректно отрабатывать первый и второй уровни

    function buildLevel(array $words, $level) {
        // с первым уровнем все просто
        if ($level === 1) return [implode(' ', $words)];
        if ($level === 2) {
            // со вторым чуть по сложнее...
            $result = [];
            $chunk = [];
            while(count($words) >= $level) {
                // отделяем первое слово из "строки" и зановим его к первому "слагаемому"
                array_push($chunk, array_shift($words));
                $result[] = array_merge([implode(' ', $chunk)], [implode(' ', $words)]);
            }
    
            return $result;
        }
    
        throw new \Exception(sprintf('Not implemented for level %d for now', $level));
    }


    Проверям работу: ideone.com/ggFzJd
    array(1) {
      [0]=>
      string(7) "a b c d"
    }
    array(3) {
      [0]=>
      array(2) {
        [0]=>
        string(1) "a"
        [1]=>
        string(5) "b c d"
      }
      [1]=>
      array(2) {
        [0]=>
        string(3) "a b"
        [1]=>
        string(3) "c d"
      }
      [2]=>
      array(2) {
        [0]=>
        string(5) "a b c"
        [1]=>
        string(1) "d"
      }
    }

    все ок, только результаты надо склеить.... Но давайте вспомним одно из основных правил программирования! DRY - do not repeat your self. Что мы видим? Одинаковый код! В обработке второго уровня у нас используется код, который мы уже использовали в обработке первого уровня! Причем дважды! Кошмар! Рефакторим...

    $result[] = array_merge(buildLevel($chunk, 1), buildLevel($words, 1));


    Теперь вспомним наш замысел... Мы хотели огранизовать рекурсию, и она родимая у нас и выходит. Функция вызывает самою себя понижая уровень. Сложность решения уменьшается, все хорошо. По такому же принципу добавляем обработку третьего уровня. Попробуйте сначала сами и самостоятельно попробуйте побороть проблему "склейки" результатов третьего и второго уровня. Зачем просто унифицируйте решения. Для того что бы поставить логическую точку, я все же предоставлю готовое решение, но постарайтесь все же сами сделать сначала:

    ideone.com/fwS4u6 - к сожалению времени не так много... может позже доделаю склейку. Пока так. Суть надеюсь будет ясна. Если кто допилит - буду рад.
    Ответ написан
  • ОС Android ругается на SSL сертификат?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    корневые сертификаты на вашем телефоне видать гнилые. Проверьте.

    https://code.google.com/p/android/issues/detail?id...
    Ответ написан
    3 комментария
  • Как Assetic внедрить в Twig?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Эм... вы точно долистали документацию до конца?
    https://github.com/kriswallsmith/assetic#twig
    Ответ написан
    Комментировать
  • Как сжать скрипт до невозможности?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вся магия не в eval а в состовлении строки. Проследите логику.

    var codes = 'atZMZh.YYsin(X*Xe/8W++)V>s;sVUfor(TUToSXo)R255Q256P&QOO*PN16L=0;KKL>J)+&&),]=>><<10|a+p+4210943TsK],=[L*p[9858122,1-,63+Rfunction([d]ImageDZa(var =-1;2>	)*n+(e()*(n);TdK3>d;dVp;e[l++=e,t,n){returnYrandom()1023tne=(j=c.creZeM=a.width/=4,k=a.height/=4)).dZa;r(tLL6|(tNNN|(tOO};i 4+3W)W+t/5)};2e7Uo=s18&63,n[so<=i(s&,s10O)?2>o?1:2:0;S=*,u=Q*,a=i(o,uf	f;fVTl	l;lVTp	p;pV2<an[o|u185)f*l*pn[o+f|u+l484);TaJa;aV3SJo;oVTuJu;uVp=/3,f=2>a?:5>a?6990400:l=X2*uu/8,sp/=1.5+s/2)2==ao>l+1f=p*=1/ot[u+(15-oP*s+*ar(0,f,p);setInterval(){o=new DZe/0,u=Ycos(Ra=XRf=[o%,i(o%2hpd=m=lKkSKM>o;oV{v=o/k-1,g=[a*v+u,.5s/k,a-u*vb=32;TqK3>q;qV{w=g[qv=f[q]-~~f[qD=1/w;0<w?v=v:D=-D;I=D*v=f+(h=g*D)*v;T0>wq]--;I<b;){(w=n[0]&|(1]&63)8|(2]O)0])b=I,v=0d=2qv+=d,d=1]m=t[(v&15(d&15*w+P*q])+=h;I+=D}}m=r(m,3*,b*b/)mLOm8OmOQ}c.putj,0,0)},L)';
    for (_ = codes; g = /[^ -IM[-~]/.exec(_); ) with (_.split(g)) {
        _ = join(shift());
    }


    Еще чуть упростим для понимания:
    for (_ = codes; g = /[^ -IM[-~]/.exec(_); ) {
        var parts = _.split(g);
        _ = parts.join(str.shift());
    }


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

    (не финальная версия, просто торопился и откровенно говоря лень)
    ) * n + (e() * (n);
            for (d = 0; 3 > d; d++) p; e[l++ = e, t, n) {
                returnMath.random() 1023tne = (j = c.createM = a.width /= 4, k = a.height /= 4)).data; r(t16166 | (t & 255 * 256 & 255 * 256 & 255 * 256 | (t & 255 & 255
                }; i 4 + 3 * Math.sin(e / 8) * Math.sin(e / 8 + t / 5)
            }; 2e7 > s; s++) o = s18 & 63, n[so <= i(s & , s10 & 255) ? 2 > o ? 1 : 2 : 0; > s; s++) for (o = * , u = 255 * , a = i(o, uf) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > f; f++) for (l) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > l; l++) for (p) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > p; p++) 2 < an[o | u185) f * l * pn[o + f | u + l484);
                        for (a = 0; 16 > a; a++) 3 > s; s++) for (o = 0; 16 > o; o++)
                        for (u = 0; 16 > u; u++) p = /3,f=2>a?:5>a?6990400:l=Math.sin(2*uu/8, sp /= 1.5 + s / 2) 2 == ao > l + 1f = p *= 1 / ot[u + (15 - o256 * s + * ar(0, f, p); setInterval() {
                                o = new Date / 0, u = Math.cos(Math.sin(o) a = Math.sin(Math.sin(o) f = [o % , i(o % 2hpd = m = l = 0; k > s; s++) for (o = 0; M > o; o++) {
                                                v = o / k - 1, g = [a * v + u, .5s / k, a - u * vb = 32;
                                                    for (q = 0; 3 > q; q++) {
                                                        w = g[qv = f[q] - ~~f[qD = 1 / w; 0 < w ? v = v : D = -D; I = D * v = f + (h = g * D) * v;
                                                            for (0 > wq] --; I < b;) {
                                                            (w = n[0] & | (1] & 63) 8 | (2] & 255) 0]) b = I, v = 0d = 2qv += d, d = 1
                                                ] m = t[(v & 15(d & 15 * w + 256 * q]) += h; I += D
                                                }
                                            }
                                            m = r(m, 3 * , b * b / ) m16 & 255m8 & 255m & 255255
                                        }
                                        c.putj, 0, 0)
                                }, 16)

    видимо где-то что-то напутал и пропустил скобки... ну да не суть. Попробуйте сами распотрошить этот код.
    Ответ написан
  • Какие вопросы задают на собеседовании на позицию стажера в Яндекс?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Зависит от отдела и месторасположение. У нас в Минске насколько мне известно процедура собеседований несколько отличается, как и процессы внутри отделов. Но думаю следует ждать задачи по алгоритмам, посмотреть как вы думаете и все такое...
    Ответ написан
    Комментировать