• Nginx + php5-fpm VS Nginx + Apache; Что выбрать?

    Сильно ли выигрывает в производительности Nginx + php5-fpm ?

    У них разная архитектура: nginx может обслужить большее количество запросов в единицу времени с меньшим расходом памяти. Так что в теории должно быть: да, сильно.

    Можно ли прикрутить .htaccess Nginx + php5-fpm ?

    Можно сделать все то, что умеет .htaccess в конфиге nginx, но прикрутить нельзя.

    Стоит ли переходить на Nginx + php5-fpm ?
    Сейчас стоит nginx+apache на виртуалках на выделенном сервер. Все на Centos + openvz.
    Проектов много разных крутится.

    А зачем? Если задаете такие вопросы, у вас сейчас все хорошо.

    Схема с nginx красивее, легковеснее, проще в настройке. Я несколько лет уже использую nginx+gunicorn (это питоновый wsgi-сервер, прослойка между приложением и веб-сервером), никакой нужды нет в apache. Но если все ОК, переходить не нужно. Также если нужно будет работать с типовыми проектами, которым нужен .htaccess, но писали не вы, это будет печально: я постоянно плачу кровавыми слезами, если подобная задача возникает, т.к. нужно переписывать все эти .htaccess.
    Ответ написан
    Комментировать
  • Как удобнее хранить пароли для веб-студии?

    1. Любая программа для хранения паролей (например, KeePass или любая другая похожая). Их суть сведется к шифрованию файла БД симметричным алгоритмом.
    2. Хранение этого самого файла где-нибудь: Dropbox, Яндекс.Диск, etc.

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

    Я несколько лет использую для себя KeePass + Dropbox (а бэкап БД можно делать на другом Dropbox-аккаунте), полет нормальный. Имею доступ к паролям с телефона/ноутбука/etc, помня при этом только 2 сложных пароля: до Dropbox и к файлу БД. Там же я и пароли генерирую, например.

    Также никогда, ни в коем случае нельзя доверять к любым сервисам, которые заставляют пароли передавать/хранить у них (в незашифрованном виде).
    Ответ написан
    4 комментария
  • Что происходит когда вызываешь Object.apply(this ) в конструкторе "класса"?

    Думаю, этот код выдран откуда-то вами, но могу предположить вот что. Есть у вас обычный "класс".

    var X = function() { }
    X.prototype = {}

    Инициализировать вы его будете вот так: var x = new X(arg1, arg2, arg3, ...), что не всегда удобно. Можно, например, вот так: var x = make(X, [arg1, arg2, arg3]).

    Для этого можно сделать обертку:

    var make = function(maker, args) {
        var X = function() {
            maker.apply(this, args);
        }
        X.prototype = maker.prototype;
        return new X();
    }
    Ответ написан
    Комментировать
  • Как написать запрос на sqlalchemy с фильтром по количеству покупок?

    Это должно быть вот так. Нужно использовать GROUP BY.

    def regular_clients(self, time_start, time_end):
        return db.session.query(User).join(Sales).filter(self.id==1, Sales.timestamp >= time_start, Sales.timestamp <= time_end).group_by(User.id).having(func.count(Sales.id) >= 5).all()
    Ответ написан
    1 комментарий
  • Какими модулями вы пользуетесь для SEO Django?

    Я эволюционно шел:
    1. Сначала просто вбивал переменные в методе формирования контекста.
    2. Добавил стандартные мета-теги в модель с настройками (на случай, если нечего вбивать).
    3. Добавил мета-теги в модель, допустим, с категорией и понял, что стоит создать абстрактный класс, от которого позже наследовал и базовые настройки и эту модель.
    4. Понял, что вьюхи сильно дублируют код: постоянно присваиваю переменным одно и то же.
    5. В базовой вьюхе определил переменную, которая определяет, какие мета-теги используются, для каждой из них сделал метод ее получения, теперь во вьюхах пишу просто список мета-тегов, оно пытается выгрузить их из модели, либо найти метод, который их вернет (такой метод нужен на случай, если мета-теги не заполнены и нужно вместо seo_title подставить просто name).
    6. Понял, что, по-хорошему, тут нужно создать приложение, которое сможет расширять любую вьюху. То есть отвязать его от моей базовой вьюхи и подарить сообществу.
    7. Наконец-то решил погуглить: нашел django-meta, которое делает все то же самое, только чуть более изящно, автор явно прошел дальше по эволюционной ветке.
    8. Приуныл, собираюсь использовать вот буквально завтра.

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

    Да, что касается админки. Если там нужны какие-то стандартные действия с полями SEO, типа как добавление их в fieldsets, лучше тоже создать миксин, который переопределил get_fieldsets, например (или что там у вас).

    p.s. Я не думаю, что все это имеет смысл на сайте-визитке, например. Я бы делал такое начиная с масштаба интернет-магазина и более.
    Ответ написан
    Комментировать
  • Как обновить дату в поле модели django при смене текущего года?

    Обновлять по крону - это красивое решение. У вас дата очень напрашивается быть в БД и работать с миром как обычное поле. Как я понимаю, хранится она долго, создается при сохранении объекта модели, обновляется раз в год. Здесь не нужен метод, который проверяет ее актуальность, потому что вам эта проверка не нужна подавляющее большинство времени. Должен быть просто метод, заполняющий дату и ничего больше не делающий. Тем более, если после 1 января у вас будет пик посещений, вы получите дополнительную нагрузку на БД, плюс еще и неактуальные в ней данные останутся. Привязывать обновление данных к запросу нехорошо. Гораздо лучше крон, который сделает ее актуальной незаметно в 4:03 утра 1 января для всех сразу.

    Если бы это была быстро меняющаяся информация, то тогда подобный метод + кэш были бы кстати.
    Ответ написан
    Комментировать
  • Как сделать редирект старых ссылок на новые?

    Что-то в этом роде:

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.html$ $1.php?%{QUERY_STRING} [L,R=301]
    Ответ написан
  • В чем преимущества Ubuntu LTS(Long Time Support)?

    Основное преимущество в том, что ее можно долго не трогать и не обновляться до нового релиза: она поддерживается, обновления безопасности идут, какие-то пакеты тоже обновляются. Отлично для серверов и для ноутбуков родителей. В целом пакеты там старее, чем в не LTS, и ждать только что вышедшую версию не стоит. Если волнует вопрос свежести пакетов, то LTS будет минусом, однажды точно помучаетесь с подключением реп.

    Если хотите самые новые пакеты и постоянно обновляться, то вам нужен rolling release дистрибутив типа Arch, других вариантов нет просто архитектурно, там всегда будут более новые пакеты, их будет проще достать.
    Ответ написан
  • DNS, каков порядок выбора ns записей клиентами?

    В любом случае нужно иметь постоянные адреса серверов в DNS, по которым балансировать с помощью DNS, если нужно, и с которых проксировать на главные/резервные сервера, как уже заметили в ответах, но я хочу немного добавить для полноты картины.

    Еще нужно учитывать, что клиентские/провайдерские сервера кэшируют запросы, порой очень надолго, поэтому никаких обращений к вашим NS не будет. Кроме того, не ясно, какой длины цепочка из серверов до вас, там по пути могут что попало накэшировать. Бинд по умолчанию максимально кэширует на неделю, например.

    Также я прошелся по RFC1034 по диагонали, нашел важное: "The order of RRs in a set is not significant, and need not be preserved by name servers, resolvers, or other parts of the DNS." Или: "Since the DNS does not preserve the order of RRs, this function may choose to sort the returned addresses or select the "best" address if the service returns only one choice to the client."

    В общем, точно нельзя полагаться на определенный порядок нигде.

    Пара примеров:

    Например, Гугл использует балансировку: их NS возвращают один адрес с малым TTL (300). Вот реакция разных серверов на это: мой named по умолчанию так и возвращает, и пока TTL не истечет, показывает одну запись; 4.2.2.1 выводит сразу много А записей с разными маленькими TTL; 8.8.8.8 просто не кэширует, отдает по одному адресу, но с разными TTL (тоже маленькими)).

    Касательно NS можете попробовать dig @8.8.8.8 ya.ru NS и убедиться в том, что порядок любой.
    Ответ написан
    Комментировать
  • Как правильно сделать зеркало субдомена?

    Настроить 301 редирект с admin.ru на admin.site.ru. Как это сделать, зависит от многих факторов. Предполагаю, что DNS-сервер не ваш, в таком случае редиректы обычно настраиваются в панели управления DNS/доменом. Если там нельзя настроить редиректы, то создаете там же зону для домена, указываете там в A записи IP-адрес вашего сервера, добавляете CNAME для www. Если домен уже на сервер указывает, просто делаете для него редирект 301 на ваш поддомен. В nginx, например, это было бы так:

    server {
         listen  80;
         server_name www.admin.ru admin.ru;
         rewrite ^ http://admin.site.ru$request_uri? permanent;
    }

    Для apache просто используете .htaccess:

    Redirect 301 / http://admin.site.ru/

    Если вы действительно решили для админки дать отдельный домен - это странно, ее лучше никому не показывать, держать под SSL на странном URL.
    Ответ написан
    1 комментарий
  • Какое использовать регулярное выражения для поиска и замены url?

    Используйте вот эту штуку.
    Ответ написан
    Комментировать
  • Как организовать перелинковку страниц?

    Мануалы Яндекса или Гугла не имеют информации о том, чтобы ставить rel="nofollow" на дублирующие ссылки. Такой информации нет даже на странице Гугла, посвященной дублирующему контенту. Кроме того, есть информация, nofollow - это плохо. Но сам Гугл говорит, что это не так, что единичные nofollow-ссылки ни на что не повлияют и просто будут исключены из графа ссылок. Общим является то, что нигде нет информации о том, чтобы помечать дублирующиеся ссылки атрибутом rel="nofollow", но есть немало информации о том (например), что гугл берет только первую ссылку, что nofollow для внутренних дублирующихся ссылок не нужен, но если поставить, то ничего не случится. Думаю, Яндекс поступает как-то аналогично, потому что это, во-первых, логично, а во-вторых, от него я не встречал иной информации.

    Отсюда вывод, что nofollow нужен для контента, к которому нет доверия, но не чтобы дублирующие ссылки. Это его изначальное предназначение. Кроме того, этот атрибут ближе к рекомендации, чем к приказу.

    Так что делайте сколько угодно внутренних ссылок у себя на сайте. Все равно гораздо важнее общее качество контента и общее качество сайта (структура, верстка, URL и т.п.).

    Что касается перелинковки, то ее делать нужно логично/правильно, чтобы вы сами хотели по этим ссылкам нажимать, это было удобно. Вы говорите, что "не должно быть ссылок на страницы, которые находятся уровнем выше" - это почему? Они могут быть, их может быть много. Взять каталог, у которого есть путь, - вот вам ссылки выше по уровню.
    Ответ написан
    Комментировать
  • Какие приемы для именования переменных в css препроцессорах используете Вы?

    Не использую БЭМ и мощный препроцессор, почти всегда хватает LESS, поэтому супер-архитектуры предложить не могу, но есть вариант, который не доставляет геморроя лично мне.

    Для вашего кода, если значения для класса уникальны, я бы их вбил в тот же файл с аналогичными свойствам названиями. Если эти значения используются где-то еще, то вынес бы их в обособленный файл с переменными, но добавил бы префикс, который бы указывал на кусок дизайна, в котором они используются (типа card_padding-top, card-sidebar_padding-top, etc). Этих обособленных файлов может быть много, это может быть как тотальный файл для всего проекта (и, допустим, там отступы от хидера, от сайдбара или что-то в таком духе), так это может быть файл настроек для конкретного модуля, страницы, части, унифицированного элемента и логика такая же. Т.к. не использую БЭМ, приходится постоянно следить за иерархией, но если следить, то получается неплохо.

    Кроме того, наверное, имеет место сказать: я вынес все шрифты в отдельные миксины вместе с line-height и все встречающиеся цвета в переменные, позволяет менять цветовую гамму, например, на Новый Год правкой в один файл.

    В итоге то, что должно быть действительно reusable, как правило, обособляется, имеет свою директорию, свой файл с переменными, где по префиксам понятно, куда оно относится, и инклудится, а то, что уникально, просто имеет конфигурируемый кусок, как правило, в начале файла. И имеется супер-глобальные мега-reusable пременные/миксины, в принципе тоже можно рассматривать как модуль.
    Ответ написан
    3 комментария
  • Порекомендуйте progressar с обратным вывзовом?

    Я использовал несколько раз progress.js и остался доволен, он минималистичен и прост. Вашу задачу тоже умеет: просто навешиваете callback на изменения и в ней уже вызываете, что вам нужно.
    Ответ написан
    Комментировать
  • Авторазвертка доменов 3 уровня nginx apache2?

    Правильно ли я понял, что вся сложность в том, чтобы перечитать конфигурацию nginx/apache без перезагрузки демона? Если да, то для этого есть reload, который умеют демоны. В вашем случае, скорее всего: service nginx reload и аналогично для apache.
    Ответ написан
    3 комментария
  • Как отсслеживать сообщений apt через python в Debian?

    Не уверен, что точно понял вопрос, но у apt-get'а есть флаг -y. А сообщения apt-get в Python отслеживаются довольно просто: я так понимаю, используется subprocess, там можно получить как stdout, так и stderr, по ним что угодно отловить. Но это все как-то сложно... Если у вас набор ПО не меняется часто и все сводится к манипуляциям в shell, то гораздо логичнее и проще здесь использовать простенький bash-скрипт. Если же речь идет про сервера и их много, то можно не костылять, использовать, например, Ansible.
    Ответ написан
    Комментировать
  • Какие ЯП не требуют кучу прикладнухи для устройства на работу?

    Я постараюсь подключить философию, примеры и "как если бы я говорил в баре с вами".

    ЯП - это инструмент. Инструмент всегда взаимодействует с объектом и со средой. Соответственно, вам точно нужно что-то знать про объект и уметь пользоваться инструментом внутри среды, а это потащит дополнительные знания, назовем их "естественными" зависимостями. Насколько глубоко их нужно знать? Тут ответа не бывает: настолько, насколько нужно и хочется. Тут важен баланс и акцент. Если нет строгих параметров на уровне разума, нужно верить интуиции, потому что больше нечему. Для JS-программиста JSON/jQuery/AJAX - это естественные зависимости, их в любом случае не получится обойти. Даю зуб, что вам хватит вечера и немного гугла, чтобы стать чуть ли не LIKE A PRO в этом. Это все форматы хранения данных, либы, парадигмы. Это примерно как прочитать состав у шоколадки по сложности и входному порогу. Скорее всего, вас пугают сложные слова. Примерно как сказать "НАПРАВЛЕННЫЙ АЦИКЛИЧЕСКИЙ ГРАФ", и вы сразу знаете теорию графов, хотя с практической точки зрения суть настолько элементарна, что аж страшно, а вы будете долго прокрастинировать и искать что попроще.

    Это что касается близких и неизбежных естественных зависимостей. Но есть и более далекие, но тем не менее все равно естественные, их знание позволяет развиваться, иметь более полную картину в голове. Вот есть гитарист, он может быть просто технарем. Есть гитарист-музыкант, который чувствует дорийский лад в блюзе. А есть гитарист-музыкант-звукорежиссер, который наконец-то понял, как надо жирно сводить гитары и теперь в симбиозе со звукарем. Кто из них самый крутой, очевидно.

    Вы можете просто верстать (html/css) и игнорировать программирование в целом. Но естественная среда противится: вы уже (!) пишете на декларативном языке, неплохо было бы узнать об этом подробнее (о языках или даже о типизации), тем более, что крайне близко к вам находится интереснейший язык js, а там моментально вылезут проблемы связывания html и js, разные подходы к этому, целые парадигмы и фреймворки; и вот вам выпадает интересная задача по анимированию svg, вы курите мануал по нужной либе, читаете что-то про reflow/repaint, внезапно узнаете что-нибудь про селекторы. И через какое-то время, будучи все тем же верстальщиком, вы видите архитектурный косяк дизайна, который очень неудобно укладывается в используемые технологии, предлагаете его пофиксить и спасаете команду от факапа через месяц, когда какой-нибудь транзишн наложится на какой-нибудь position: fixed и еще и в Safari упадет анимация и только там, а тут и новая тудушка: "Переделать, нафиг, всю шапку, чтобы ок было". Что-то изменилось в мышлении и картина стала полнее. ВНЕЗАПНО вы уже и инженер, можно сказать, ЗП растет, все дела, рутины меньше стало.

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

    Подведу тут черту: естественные зависимости - это норма, а суть в инжиниринге. Можно двигаться по зависимостям дальше. У вас есть интервал, где есть минимальный порог, ниже которого нельзя, и максимальный, где вы "мастер на все руки", что тоже плохо. Между минимальным и максимальным порогом можно двигаться. Взять те же сети: разворачиваете приложение, видите линуху, настраиваете сеть. Можно немного заморочиться и прочитать про основы маршрутизации, буквально 2 вечера, можно еще про сетевой стек в линукс, еще 2 вечера, и уже будет во много раз проще. Кроме того, возрастет культура в целом и если вы программист на бэке, то вам будет проще взаимодействовать с админами. Про OSPF, очевидно, читать не надо, важен баланс. Баланс - это понимание того, на что у вас акцент (вы программист? какой? фронт/бэк? насколько важны сети/ос? проектируете бд? верстаете? интересен ли прикладной кодинг под какую-то ос и так далее...) и насколько интересны естественные далекие зависимости выбранной области.

    Так вот, теперь у нас есть естественные зависимости, инжиниринг и баланс между порогами. А не php/jquery/html/css.

    Важно также отметить, что все очень быстро развивается сейчас, а это еще один аргумент, что привязываться к инструменту не стоит. Кто-то может сказать, мол, взять тот же js, программирование на нем - это целая парадигма, иной подход, свои фичи. Это так, но дело тут не в js, а в целом в динамичных/интерпретируемых языках.

    Кстати, что касается SEO: с технической точки зрения это пара мануалов от гугла и не более того. Там сеошники наговорить могут много, с ними надо быть осторожнее :)

    А теперь, собственно, выводы:

    1) Вакансий крутых много, надо пробовать. Нужно только отличать близкие и необходимые естественные зависимости от мастера на все руки. Я считаю, что мастером на все руки нужно поработать хоть однажды, чтобы просто понять, почему это плохо. Но зависимости будут всегда, и это норма. Вы перечислили слишком радикально, конечно.
    2) Себя пилить под вакансию не нужно. Нужно просто идти туда, где интересно, всегда стараться быть инженером и не убить в себе искусство (то есть не бояться делать так, как кажется правильно, чтобы либо убедиться в правоте, либо ошибиться и стать круче).
    3) Не нужно думать в стиле "а что если завтра рубионреилс развалится, комьюнити разойдется, вакансий не будет, что я буду делать". Вы же инженер. У вас опыт в проектировании IT-систем, перейти на что-то смежное, если будет понятно, что технология умирает, не составит труда.
    4) По естественным зависимостям нужно двигаться по мере интереса, вы станете от этого только лучше.

    Это, конечно, если вам действительно все это интересно. Все это области, очень близкие к искусству, и тут надо любить все это делать.
    Ответ написан
    8 комментариев
  • В чем разница полнотекстового и морфологического поиска?

    Морфологический поиск - это поиск, который учитывает морфологию (род, число, падеж и т.п.).

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

    Зачастую системы полнотекстового поиска поддерживают и морфологию (ведь у нас все равно текст превращается в слова, почему бы и нет?).

    Реализация этих поисков может быть самая разная. Можно использовать, например, Sphinx, а можно FULLTEXT-поиск в MySQL, который тоже поддерживает морфологию. Или костыли: взять морфологический анализатор текста (например, pymorphy) и прикрутить его между запросами к SQLite.
    Ответ написан
    1 комментарий
  • Как дать определенному пользователю права на запись и чтение определенной папки?

    Боюсь, вопрос ваш таит больше, чем вы хотите услышать.

    По умолчанию в Linux система доступа - это DAC. https://ru.wikipedia.org/wiki/%C8%E7%E1%E8%F0%E0%F...

    В вашем случае нужно дать права на эту папку этому пользователю: chown user:group /usr1.
    И назначить возможность ее изменять/читать: chmod 700 /usr1

    В таком случае группа не сможет читать/писать туда, как и все остальные, но пользователь сможет. Однако данный пользователь сможет получить доступ к любым другим ресурсам, если там стоят соответствующие права.

    В вашем же случае, обращая внимание на постановку вопроса и на название директории (usr1), скорее всего, вы хотите сделать что-то странное и не тем инструментом. Возможно, стоит почитать про SELinux, возможно, вам поможет chroot (небезопасен в определенных случаях), возможно, нужно посмотреть в сторону cgroups/LXC или виртуализации.

    Напишите, что хотите сделать. :)
    Ответ написан
    5 комментариев
  • Iptables и правильное перенаправление на 80 порт?

    Тут фича в том, что после REDIRECT пакет не проходит цепочку PREROUTING далее или еще раз. Поэтому можно сделать так: маркировать пакет в PREROUTING и дропать в INPUT маркированные пакеты.

    iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 8000 -j MARK --set-mark 1
    iptables -I INPUT  -i eth0 -m mark --mark 1 -j DROP

    Существующее у вас правило

    iptables -A INPUT -i eth0 -p tcp --dport 8000 -j ACCEPT

    убирать нельзя, т.к. пакет далее идет в цепочку INPUT, где дропнется (политика по умолчанию у вас DROP) без этого правила. Однако дропать маркированные пакеты нужно до него, иначе оно пропустит их (поэтому в правиле выше флаг "-I", что, возможно, вы захотите изменить, расставив правила по порядку).

    Еще один путь: можно повесить веб-сервер на localhost и использовать DNAT, но для этого нужно еще net.ipv4.conf.all.route_localnet=1, иначе пакет будет отброшен (martian packet).
    Ответ написан
    Комментировать