• Переход с PHP на …?

    Stdit
    @Stdit
    Если надоел PHP и вообще такой подход (запустился-выполнился-умер), хочется чего-то свежего и концептуально другого, я бы порекомендовал Nodejs. Особенно интересно становится при использовании вебсокетов через socket.io. По поводу xslt не могу ничего сказать, не было такого опыта, но библиотеки соответствующие имеются.
    Ответ написан
    Комментировать
  • Apache + MySQL на Windows в production — как убедить людей что это плохо

    Stdit
    @Stdit
    Есть ли смысл переубеждать руководство? Можно просто сообщить (лучше даже письменно, или хотя бы по email), по мнению технического специалиста, чем такой выбор чреват, какие дополнительные затраты он принесёт, и в каком случае. Если руководство примет решение оставить такой набор — то пускай он остается, когда начнутся упомянутые проблемы с обновлениями, то руководству придётся терпеть даунтаймы и оплачивать работу специалиста по устранению этих проблем, вплоть до переноса бд на другой сервер. С другой стороны, если это будет какой-нибудь никому не нужный «корпоративный портал» на 100 хитов в сутки, то он может спокойно себе работать десять лет на любом офисном включенном компьютере с виндой, и никому от этого плохо не станет.
    Ответ написан
    4 комментария
  • Сортировка и выборка в MySQL

    Stdit
    @Stdit
    Скорее всего запускается фулскан, потому что не находит правильного индекса. Что говорят EXPLAIN запросов? И это, я надеюсь, $counthis[posid] эскейпится перед вставкой в строку запроса, а то выглядит опасно.
    Ответ написан
    6 комментариев
  • Как изучить/разобраться в чужом PHP коде?

    Stdit
    @Stdit
    Схему вызовов функций и методов классов неплохо делает xhprof. Правда, он предназначен скорее для выявления узких мест, но его графы вызовов очень облегчают понимание механизма работы фреймворка.
    Ответ написан
    Комментировать
  • Имеется 1000 jpeg-ов, надо в уголок каждого автоматически впечатать растром его имя файла. Как?

    Stdit
    @Stdit
    Есть ещё интересный способ, это ECMAScript для Photoshop. Не то, чтобы он подходит для этой задачи конкретно (тут convert справится на ура), но инструмент очень мощный, в своё время выручал при автоматизации сложных эффектов.
    Ответ написан
    Комментировать
  • Node.js в качестве server-side для enterprise приложения?

    Stdit
    @Stdit
    По моему опыту, nodejs — удобная, стабильная и быстрая штука, имеющая отличное сообщество и много хороших библиотек в npm. Преимущества можно перечислять долго, лучше сразу перейти к проблемам.

    — Сложно найти готовых к работе толковых программистов, даже среди фронтендщиков. Но можно обучить. На обучение и понимание среды nodejs, API, асинхронности, замыканий, калбэков, событий, функционального подхода — уходит примерно месяц-два.
    — Библиотеки из форнтендов использовать можно, но только если они грамотно написаны и оптимизированы для перманентной работы. Иначе есть риск, что они сожрут всю память или повесятся.
    — Сервер nodejs обычно однопоточный, со всеми вытекающими. Имеется возможность форкать и открывать дочерные процессы, на это нужны дополнительные затраты труда. Но это требуется только в исключительных случаях.
    — Код пишется в основном легко, если следовать чёткому стандарту, который обычно навязывается используемым фреймворком. Однако javascript, ввиду своей нестрогости, неустойчив к коррозии, в спешке или по неопытности можно наделать рака и превратить жизнь своей команды в ад.
    — При сложной логике со множеством вызовов можно без злого умысла нагородить «лестниц» из калбеков. Однако, проблема решается разными вариантами библиотек управления задачами (async, Q, и т.д.). Вообще лучше делать максимальную декомпозицию кода, создавать бесчисленные функции внутри функций — не очень хорошая практика.

    По поводу камней:
    — Обычно, всякие руководства и мануалы типа «hello world» используют один сокет для соединения с БД. На практике оказалось, что если этот сокет зависает под тяжёлым запросом, то все остальные запросы прилежно ждут его освобождения. Поэтому первое, что нужно сделать в новом проекте — это подключить database connection pool.
    — Случилось так, что количество одновременных подключений к серверу перевалило за тысячу, и внезапно возникли необъяснимые аномалии и отказы. Как выяснилось, страшного ничего не произошло, и нужно было просто в операционной системе разрешить открывать на порядок больше файловых/сокетных дескрипторов.
    — Память для nodejs лучше ограничивать ключами запуска и отдавать больше для БД (если они на одной машине). В противном случае nodejs не спешит запусктать сборщик мусора (это ведь затратная операция) и разрастается.
    — Перезагрузки nodejs из-за внезапных падений от багов решаются специальными библиотеками, например forever.
    — Чтобы nodejs не вылетал из-за исключений, нужно ставить глобальный обработчик uncaughtException, который пишет их в лог или сразу шлёт на мыло ответственному лицу.
    — Нужно не забывать отвязыватсь обработчики от событий по окончании работы подписанного на событие объекта (removeListener()).

    По поводу фреймворков, используем express, потому что он красивый, простой и мы к нему привыкли.
    Ответ написан
    2 комментария
  • Почему так сложно сдерживать стоны?

    Stdit
    @Stdit
    Сбой в разбиении смски на куски, вызванный скорее всего коллизией какого-нибудь хеша или переполнением. А если это коллизия хешей в айфоне при разбиении, постановке в очередь и отправке, тогда ситуация становится еще интереснее.
    Ответ написан
    4 комментария
  • Как отвязать чужие домены от IP?

    Stdit
    @Stdit
    Прописать в настройках вебсервера, чтобы перманентно редиректил такие запросы на ваш домен. Как конкретно это сделать — зависит от вашего вебсервера и прав доступа (пожно в конфиге nginx, или в .htaccess апача, или вообще в php через определение хоста.
    Ответ написан
    8 комментариев
  • Книга по внутреннему устройству и работе AngularJS?

    Stdit
    @Stdit
    Конечно да. AngularJS — один из самых интересных современных фреймворков, детальная информация про его подкапотную была бы интересна и полезна, думаю, многим. Серию постов на Хабре не хотите сделать?
    Ответ написан
    Комментировать
  • Использование тернарного оператора ?: с подавлением ошибки?

    Stdit
    @Stdit
    Неудивительно, что вас смущает использование «собаки», нутро верно подсказывает, что это — умалчивание ошибки и во многих случаях используется как костыль. А isset, empty и is_null — это очевидная логика, причем разная, и более чистый и понятный код. Я бы рекомендовал забыть что «собака» вообще существует, пока нужда остро не прижмет в каком-нибудь стареньком проекте.
    Ответ написан
    4 комментария
  • Как эмулировать браузерный запрос к google при помощи cURL?

    Stdit
    @Stdit
    Гугл ведь неспроста блокирует запросы от скриптов, и проверяет их капчей, поэтому нужно доказать ему, что ваш скрипт — не бот (распознать капчу). Я замечал, что он это делает, когда запрашиваемые слова не связаны морфологически и идут массово с одного адреса (который, к тому же, наверняка принадлежит известному датацентру?). Еще можно попробовать отправлять корректный «браузерный» заголвок, с юзерагентом и прочими хедерами.
    Ответ написан
  • Подскажите как сверстать?

    Stdit
    @Stdit
    image

    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg whdth="600" height="500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
        <defs>
            <radialGradient id="g1" cx="55%" cy="45%" r="50%" fx="50%" fy="50%">
                <stop offset="0%" style="stop-color:hsl(190,50%,50%);stop-opacity:1" />
                <stop offset="100%" style="stop-color:hsl(190,50%,20%);stop-opacity:1" />
            </radialGradient>
            <linearGradient id="g2" x1="0%" y1="0%" x2="100%" y2="100%">
                <stop offset="0%" style="stop-color:hsl(190,50%,20%);stop-opacity:1" />
                <stop offset="50%" style="stop-color:hsl(190,50%,30%);stop-opacity:1" />
                <stop offset="50%" style="stop-color:hsl(190,50%,100%);stop-opacity:1" />
                <stop offset="100%" style="stop-color:hsl(190,50%,20%);stop-opacity:1" />
            </linearGradient>
            <linearGradient id="g3" x1="0%" y1="100%" x2="100%" y2="0%">
                <stop offset="0%" style="stop-color:hsl(190,50%,20%);stop-opacity:1" />
                <stop offset="50%" style="stop-color:hsl(190,50%,30%);stop-opacity:1" />
                <stop offset="50%" style="stop-color:hsl(190,50%,100%);stop-opacity:1" />
                <stop offset="100%" style="stop-color:hsl(190,50%,20%);stop-opacity:1" />
            </linearGradient>
            <rect id="layer1" width="600" height="500" fill="url(#g1)"/>
            <rect id="layer2" width="600" height="500" fill="url(#g2)"/>
            <rect id="layer3" width="600" height="500" fill="url(#g3)"/>
            <filter id="f1" x="0" y="0">
                <feImage result="op1" xlink:href="#layer1"/>
                <feImage result="op2" xlink:href="#layer2"/>
                <feImage result="op3" xlink:href="#layer3"/>
                <feBlend mode="multiply" in="op1" in2="op2" result="op12"/>
                <feBlend mode="multiply" in="op12" in2="op3"/>
            </filter>
        </defs>
        <rect width="500" height="500" filter="url(#f1)"/>
        <text font-size="28" x="20" y="100" width="500" style="stroke:none;fill:white">
           Может, не надо рисовать картинки на CSS?
        </text>
        <text font-size="40" x="20" y="400" width="500" style="stroke:none;fill:white">
            Для этого ведь создан SVG.
        </text>
    </svg>
    
    Ответ написан
    1 комментарий
  • Логика работы с MongoDB в сервере на Node.JS?

    Stdit
    @Stdit
    При использовании одного соединения с БД есть серьёзный риск перегрузить сокет базы настолько, что именно он станет узким тормозящим местом всего проекта. Это довольно подлый нюанс, который не заметен на этапе тестирования и ввода в эксплуатацию (как и проблема гонок в mongo, но это отдельный разговор). У меня такое было, правда не на mongo, а на pg, но суть от этого не меняется: пока сокет базы занят перекачиванием больших объемов данных на специфических страницах, сайт будет заблокирован. Но и открывать соединение с базой на каждый запрос тоже не самая лучшая идея, так как на открытие, настройку и содержание соединения нужно несоразмерно много ресурсов (в том числе и на сервере БД). Поэтому должен быть пул соединений с БД. Драйверы mysql и pg такой пул имеют, насчет mongodb не уверен, так как не копал устройство драйверов mongo для nodejs.
    Ответ написан
    Комментировать
  • Репликация MongoDB для отказоустойчивости

    Stdit
    @Stdit
    ReplicaSet хорошо документирован, делается легко и быстро. При выходе из строя мастера им автоматически ставится один из слейвов. Существует много драйверов с автоматической поддержкой ReplicaSet, например в драйвере php нужно просто указать список хостов БД.
    Ответ написан
    Комментировать
  • JS библиотека для визуализации БД?

    Stdit
    @Stdit
    Можно использовать старый добрый graphviz.
    Ответ написан
    2 комментария
  • border-collapse: separate или как побороть двойную линию между ячейками?

    Stdit
    @Stdit
    jsfiddle.net/6AHnH/1/
    В хроме и фф работает, в ие проверить пока не могу, но точно не будет работать в ие6.
    Ответ написан
    1 комментарий
  • Как правильно соединяться с базой в нагруженных проектах?

    Stdit
    @Stdit
    Однажды ошибка в этом месте (делать одно глобальное соединение с БД) стоила мне целых выходных. Сразу оговорюсь, что использовался не mysql, а модуль node-postgres, но суть должна быть одинаковой. При большой нарузке длинные запросы блокировали сокет базы, и как следствие работу всего сервиса. Поэтому нужно было срочно переделывать модель на Connection Pool, который на этапе разработки как-то ушел из внимания, так как на одном коннекте с небольшой бд тестовых данных вроде бы все было хорошо. :)

    Пул может организовать несколько параллельных подключений, которые не будут мешать друг другу. По окончании запроса подключение освобождается и уходит в пул. При отсутсвии свободных слотов в пуле запрос ставится в очередь до освобождения одного из слотов. Что касается доступа в БД, я использовал простейший вариант — непосредственный доступ через модуль и его параметры подключения по умолчанию. В каждом файле, который нуждается в БД, делается require драйвера БД и через него происходит обращение в базу. При использовании пула надо обязательно следить за освобождением соединений (функция done). Количество соединений в пуле задается опцией настроек модуля.

    О том, как использовать пул в pg, можно почитать здесь.
    Ответ написан
    3 комментария
  • Сколько стоит натянуть верстку

    Stdit
    @Stdit
    Это зависит от многих факторов.

    1. Блочная ли у вас верстка и качественная ли нарезка, соответствуют ли хотя бы приблизительно блоки верстки шаблонам/компонентам сайта (основной фактор скорости «надевания» верстки, в этом плане быстрее всего надевается верстка под готовые cms, когда верстальщик имеет уже опыт работы с ней, но в вашем случае это вряд ли возможно).
    2. Нормально ли сделаны блоки и их дизайн (тайлинг текстур, простота ресайза элементов, отсутствие всяких трудновыполнимых переходов между блоками).
    3. Требуется ли дополнительная нарезка графики (особенно если в psd слои оргазизованы без группировок и имен).
    4. Требуется ли поддержка устаревших браузеров (включая ИЕ8) и нестандартных фич новых браузеров (тех, что с префиксами), как и предыдущих пункт, необходимо в случае, если верстка готова не полностью.
    5. Требуется ли дополнительное программирование (js), анимации, ajax-рефреши, валидация форм в реальном времени и прочие модные штуки.

    Таким образом, стоимость может отличаться на несколько порядков, и просто так оценить ее может только специалист, имеющий в руках дизайн и ТЗ. Если же верстка у вас полностью готова и разрабатывалась под готовую структуру сайта — оценивайте количеством отдельных блоков верстки.
    Ответ написан
    Комментировать
  • JavaScript меня в могилу сведет [Node.js]

    Stdit
    @Stdit
    // m1.js
    module.exports.Model = function() {
      this.test = function() {
        console.log("MODULE 1");
      };
    };
    
    // m2.js
    module.exports.Model = function() {
      this.test = function() {
        console.log("MODULE 2");
      };
    };
    
    //test.js
    var model1 = new (require('./lib/m1.js').Model);
    var model2 = new (require('./lib/m2.js').Model);
    
    model1.test();
    model2.test();
    
    //result
    MODULE 1
    MODULE 2
    
    Ответ написан
    Комментировать