Задать вопрос
  • Как gulp-jade заставить файлы работать с другим форматом?

    werty1001
    @werty1001
    undefined
    gulp.src( '*.jade' )
      .pipe( jade() )
      .pipe( gulp.dest(function(file) {
    
        file.basename = file.basename.split('.')[0] + '.tpl';
    
        return 'app/build';
    
      })
    );
    Ответ написан
    Комментировать
  • Как gulp-jade заставить файлы работать с другим форматом?

    Serj-One
    @Serj-One
    i'm sexy and i know it
    Что мешает переименовать после компиляции?
    https://www.npmjs.com/package/gulp-rename
    extname = ".tpl"
    Ответ написан
    2 комментария
  • Как хранить пароли удобно и правильно?

    saboteur_kiev
    @saboteur_kiev Куратор тега Системное администрирование
    software engineer
    Критичные сервисы - локальный менеджер паролей или файликами на маленьким криптодиске.
    Некритичные множественные сервисы - придумать алгоритм создания пароля, с участием примет ресурса.
    ssh - ключи и выкинуть пароли.
    Ответ написан
    Комментировать
  • Как сохранять бэкапы на сервер через консоль?

    Xuxicheta
    @Xuxicheta
    инженер
    несколько команд для изучения
    ssh-keygen
    ssh-copy-id
    rsync
    rdiff-backup
    Ответ написан
    5 комментариев
  • Как защищают код от редактирования?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Очень просто, в крупных компаниях есть понятие код ревью. Так как это не опенсорс, где любой программист может увидеть что делает тот или иной программный модуль, есть несколько уровней контроля - от базового тестирования, до серьезного анализа каждого более менее значимого модуля. Несколькими людьми, часто из крупных специализированных контор типа Allied Testing и подобных, которым важно иметь репутацию и заказы, а не тырить мелочь по карманам.
    Ответ написан
    Комментировать
  • Как сохранять бэкапы на сервер через консоль?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Довольно сложно отвечать в режиме "слепой глухому", т.к. не совсем понятно, что именно у Вас не получается... но, давайте попробую.

    Нужно скидывать архив через SSH на сервер (при этом не хочется каждый раз вводить пароль), всегда в определенную папку будет отправляться /mnt/backupftp/$sitename - название $sitename динамичное, оно подставляется в зависимости от команды: sitestop sitename, которой собственно и запускается скрипт.

    Что бы не вводить пароль - используйте авторизацию по ключу. Информации на эту тему, просто прорва, например вот (первая попавшаяся ссылка).

    Если название $sitename - уже передано в скрипт, не вижу ни одной проблемы с тем, что бы его использовать.

    При этом не хочется из папки архивов делать помойку, нужно чтобы в папке каждого сайта хранилось не более 3 резервных копий, то есть старые файлы нужно как-то затирать, если записывается уже 4-й архив.
    После подключения по SSH - считаете кол-во файлов в папке, можно их так же предварительно отсортировать в прямом или обратном порядке по датам, а потом удалить все файлы по списку, чей индекс в массиве больше/меньше 2 или 3.

    Потом просто загружаете Ваш файл туда...
    Ответ написан
    Комментировать
  • Как массово переименовать html файлы по содержимому тегов?

    @x_dmitry_x
    # -*- coding: utf-8 -*-
    
    from __future__ import print_function, unicode_literals
    import os
    from lxml import etree
    
    FILES_DIR = 'Путь/До/Папки/С/Файлами'
    
    def main():
        parser = etree.HTMLParser()
        for fname in os.listdir(FILES_DIR):
            path = os.path.join(FILES_DIR, fname)
            tree = etree.parse(path, parser)
            root = tree.getroot()
            el = root.find('.//h3[@class="header-text"]')
            if el is not None:
                header = el.text
                if not header:
                    print(fname, 'Пустой заголовок')
                    continue
                new_fname = header.strip() + '.html'
                new_path = os.path.join(FILES_DIR, new_fname)
                try:
                    os.rename(path, new_path)
                except Exception as e:
                    print(fname, 'Ошибка при переименовании')
                    continue
                print(fname, '-->', new_fname)
            else:
                print(fname, 'Заголовок не найден')
    
    if __name__ == '__main__':
        main()
        raw_input('Enter для закрытия...'.encode('cp866')) # Да, я использую windows :(
    Ответ написан
    Комментировать
  • Как получить доступ к свойствам объекта из самого объекта?

    In4in
    @In4in
    °•× JavaScript Developer ^_^ ו°
    zhencshiny_23106604_orig_.jpeg
    Ответ написан
    Комментировать
  • Почему из трех вариантов инициализации controller работает только третий?

    @SuperOleg39ru
    Front-end разработчик
    На самом деле не работает ни один из вариантов.

    Просто ваша директива получает в качестве контроллера функцию mailListCtrl, которую вы и объявили в 3 варианте.

    Оберните название контроллера в кавычки:

    mailApp.directive('mailList', function(){
        return {
            restrict: 'E',
            templateUrl: 'mailListDirective.html',
            controller: 'mailListCtrl',
            // replace: true,
            controllerAs: 'mailListCtrl'
        };
    });


    Еще лучше, если вы начнете использовать компоненты, появившиеся в Angular 1.5+

    А вот стартовый шаблон, использующий вебпак для сборки и синтаксис ES6, так выглядит современное приложение на Angular 1.
    Ответ написан
    1 комментарий
  • Существуют ли книги по компьютерным сетям без воды?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Что значит "без воды"? Книга на то и книга, чтобы обьяснять вещи на примерах. Если Вам это не надо - читайте RFC. Там вот без воды.
    Ответ написан
    7 комментариев
  • Почему в программах так редко используются переменные повторно?

    Ni55aN
    @Ni55aN
    Наверное вопрос касается того, почему бы не использовать уже выделенную память под переменную нужного нам типа, чем выделять повторно под новую переменную, для уменьшения времени выполнения программы?

    В языках высокого уровня переменные для того и созданы, чтобы выполняли каждая свою роль. иначе конструкции вида
    int i=0;
    
    for(;i<4;i++)
    dosmth(i);
    
    for(;i<7;i++)
    dosmth(i);


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

    Rou1997
    @Rou1997
    И вам того же: блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла
    блаблабла, а данные у вас загружаются с помощью AJAX, необходимо с помощью сниффера, например Fiddler, отследить откуда они у вас загружаются, и симитировать все необходимые запросы средствами curl или любой другой библиотеки, реализующей протокол HTTP, работа кропотливая, требует внимательности, но сложно только в первый раз.
    Ответ написан
    2 комментария
  • Какие есть сервисы отправки почты с помощью AJAX?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Нельзя так делать и не надо....
    И сервисов соответственно нет.
    Можно использовать любое АПИ для отправки, но чтобы отправить что-то нужно указать ключ.
    Указывать ключ в JS коде = дать всем возможность отправлять любые письма от вашего имени и за ваш счет.
    Ответ написан
    1 комментарий
  • Как удалить дубликаты из json?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    arr = Array.from(new Set(arr));
    Ответ написан
    Комментировать
  • Почему в примере выводит числа до 105 хотя явно указан while?

    alsopub
    @alsopub
    Цикл for($a=1;$a<=$step;$a++) напинается при $i=92, что меньше 100.
    Цикл отрабатывает, $i становится больше 100 и внешний цикл завершается.
    Ответ написан
    Комментировать
  • Как адптивно сверстать блок с видео в ноутбуке?

    Как то делал подобное, но с картинками внутри. Тогда помню, что нашел macbook, нарисованный на css (правда, в моем случае это Pro).
    В принципе, вам так же можно было бы вставить туда видео.

    Но я бы всё таки сделал, как было написано выше.
    Создал бы контейнер, в который поместил бы видео и задал ему background в виде макбука. Остается вычислить отступы в процентах и готово.
    upd. Нашел пример реализации и почти что копию вашего вопроса на SO
    Ответ написан
    Комментировать
  • Существуют ли препроцессоры для Javascript наподобие Sass?

    sim3x
    @sim3x
    Просто склеить все файлы в один
    https://www.npmjs.com/package/gulp-concat-js

    Делай такую же структуру как и у сасс
    Ответ написан
    Комментировать
  • Как компьютер понимает нули и еденицы?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Ну типа жил был транзистор значит. И он был такой весь из себя крайне радикальный - не было у него по жизни других настроений, кроме двух - либо он говорил всем "да" и пропускал через себя всё, что в одно ухо (левая дырка) влетело, то из другого (правая дырка) сразу вылетало. Либо же настроение его могло поменяться, тогда он становился крайне негативным и переставал пропускать себя любую информацию - замыкался в себе, думал о главном.
    А настроение его зависело от того, насколько хорошо он питался. Суёшь ты ему в рот (третья дырка) нормальное питание - он добрый, на всё согласен, информацию через себя пропускает. Чуть только начинаешь его кормить меньше, чем он хочет (есть у него определённый уровен неообходимого питания) - он тут же отключался от мира и ни на что не реагировал, пока снова не пихнёшь ему в рот достаточноого питания. Так и получилось, что аналоговый уровень питания, то есть количество еды, которое ты ему кладёшь в рот, в итоге превращается в бинарное значение - 0 или 1 на правом ухе.

    И вот если найти нашему транзистору таких же друзей и объединить их - то можно получить цифровую схему. В которой в зависимости от поданного питания на разные рты и левые ухи мы будем получать разные комбинации питания на правых ухах. Чаще всего транзисторы соединяют довольно странным образом - правое ухо одного ко рту другого, чтобы первый контроллировал настроение второго. И т.д. Чем больше транзисторов - тем сложнее можно придумать алгоритм, который эта схема будет реализовывать.

    И вот в современных процессорах миллионы этих транзисторов (если быть точнее, то на текущий момент около 1,400,000,000) спаяны вместе. чтобы распознавать входные команды и выдавать результат по заданной схеме.

    Ты спросишь, мой маленький друг, как же розетка соединяется с процессором? Как эти 220В превращаются в 0 и 1 на моём мониторе?. А всё дело в том, что блок питания преобразует переменный ток в постоянный, который потом подаётся на процессор. Блок питания совсем не мудрёный - пара диодов и трансформатор, можешь даже собрать его сам дома из говна и палок. А интересное дальше.
    Но если подать ток на схему из транзисторов - то они застынут в одном положении, заданном схемой, и ничего происходить не будет? Да, ты прав, чтобы компьютер считал, необходимо менять ток на его входных ножках, тем самым отдавая ему разные команды. Но тут возникает проблема синхронизации - поменять напряжение одномоментно невозможно (физика, типа, химия там, электроны бегают, заряд меняется, дырки должны образоваться успеть) - нужно определённое время. Поэтому придумали "частоту". Рядом с транзисторами сидит важный кристалик, который генерирует ток по синусоиде с равномерной частотой. Эта синусоида немного рихтуется, превращаясь в бесконечный поток "есть питание" и "нет питания" меняющийся с одинаковой частотой. На графике это выглядит как пила, примерно. И вот все договорились, что будут засекать момент, в котором "всё готово", все транзисторы заняли своё положение и всё устаканилось и наконец можно считать выходной результат, например, на верхушке зубчика пилы, то есть когда генератор частоты дал 1. И вот совремменные процессоры делают это с частотой 2 гигагерца, то есть 2 миллиарда раз в секунду все транзисторы в процессоре меняют своё состояние.

    P.S. Я сделал небольшое допущение. На самом деле в правом ухе не 1 и 0, а точно такое же напряжение, которое ты подал на левое ухо, если транзистор включён, либо никакого, если выключен. Но чаще всего это потсоянный небольшой ток. Благодаря уровню необходимого питания на ртах у транзисторов, этот небольшой ток может быть либо меньше необходимого (0), либо больше, при котором транзистор включается(1). Это всё зависит от того, из чего сделан транзистор. Это уже химия, дружок. Сплавы всякие, металлов. Они ещё полупроводники называются, потому что до конца не определились, готовы они всегда пропускать ток, или никогда. Этим тохитрые людишки и воспользовались, заставляя полупроводники менять своё настроение и позволять тебе играть в майнкрафт.
    Ответ написан
    5 комментариев
  • Code review верстки новичка + вопросы?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Нужна конструктивная критика

    Ну давайте покритикуем... постараюсь все аргументировать.

    Начнем не с кода, а с юзабилити так сказать: есть люди, которые используют tab для перемещения по странице. Это факт. В вашем случае получается, что в верхнем меню перемещаться можно только по словам (но не по иконкам), а по остальной странице - вообще нельзя. Т.е. формально перемещение идет, но ничего не выделяется и совершенно не понятно где мы находимся. Имеет смысл добавить для focusable-елементов стили для :focus.

    Второе - при уменьшении экрана в некоторых местах надписи начинают наезжать (несильно, но глаз режет) друг на друга. Возможно вам стоит почитать статью про изменение размера шрифта в зависимости от размера экрана - иногда это очень полезно.

    Ну а теперь перейдем собственно к коду. Скриптов у вас немного, поэтому буду говорить про CSS. Вопрос: у вас css файл на 2606 строк - вы пишете все в нем? Если да - вам стоит посмотреть в сторону систем сборки (grunt / gulp) - имеет смысл отдельные компоненты делать в отдельных файлах, а затем это все склеивать. Так проще ориентироваться в происходящем (и те, кто будут работать с вашим кодом после вас скажут вам спасибо). Опять же префиксы для браузеров можно будет расставлять автоматически.

    Дальше:
    .work_pic1-part1:hover span,
    .work_pic1-part1:hover:before,
    .work_pic2-part1:hover span,
    .work_pic2-part1:hover:before,
    .work_pic3-part1:hover span,
    .work_pic3-part1:hover:before,
    .work_pic4-part1:hover span,
    .work_pic4-part1:hover:before,
    .work_pic1-part2:hover span,
    .work_pic1-part2:hover:before,
    .work_pic2-part2:hover span,
    .work_pic2-part2:hover:before,
    .work_pic3-part2:hover span,
    .work_pic3-part2:hover:before
    ...

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

    К концу файла глаза довольно сильно устают. Префиксы раздражают, как и множество одинаковых (и совершенно ни о чем не говорящих) чисел. Так что префиксы лучше расставлять автопрефиксером, а в будущем посмотреть на less / sass - препроцессоры упрощают работу и имеют разные плюшки вроде переменных (например длина анимаций просто напрашивается на вынесение в переменную), наследования стилей и.т.д.

    Еще по поводу размера css: есть такое понятие как critical css - стили для первого видимого экрана. Их можно выделить автоматически (см. системы сборки) и встроить прямо в html. А все остальные стили загружать уже потом. Это создаст у пользователя впечатление быстрой загрузки. У Виталия Фридмана есть занятная лекция на youtube, где он рассматривает этот и другие вопросы оптимизации загрузки на примере smashingmagazine.

    Комментарии. Их нет. В большинстве случаев они и правда не нужны, но после нарезки такого рода окончаний
    </div>				
                    </div>
                </div>
            </div>
        </footer>
    </div>

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

    Да и напоследок: названия классов очень разнородные - то дефисы, то подчеркивания, то длинные, то короткие, иногда в них видится система, но эта система переодически дает сбой. Не люблю я БЭМ, но, вероятно вам стоит почитать о нем более подробно (или про аналоги, решающие те же задачи - недавно тут на тостере был вопрос о том, что делать, если бэмоподобные классы перестали нравиться - пришли к выводу, что rscss тоже неплох).

    P.S.: планшета под рукой нет, поэтому про тормоза ничего сказать не могу - на слабом нетбуке все работает более-менее нормально.
    Ответ написан
  • Как настроить ui router?

    1. вариант - regexp, например:
    .state('home.listgroup', {
        url: ':course/{grouplist:[1-3]}',
        templateUrl: 'templates/listgroup.php',
        controller: 'listGroupCtrl'
      })

    2 вариант - что-то делать в resolve, например грузить данные и возвращать reject для некорректных данных:
    .state('home.listgroup', {
        url: ':course/:grouplist',
        templateUrl: 'templates/listgroup.php',
        controller: 'listGroupCtrl',
        resolve: ['$q', '$stateParams', function($q) {
             if ($stateParams.grouplist > 3) {
                 return $q.reject();
             }
        })];
      })
    Ответ написан