Ответы пользователя по тегу Программирование
  • Можно ли отрендить html/js страницу на сервере?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Если нужны только линки и контейнеры (а исходные линки - статичны):
    1. Получаем DOM-рендер страницы с помощью phantom.js
    2. Берём текущий DOM со всеми свойствами объектов после рендеринга
    3. Убираем оттуда все скрипты (отфильтровать).
    4. Из DOM'а извлекаем все стили DOM-объектов - формируем новый стиль (CSS) для каждого из DOM объектов для этой страницы, который затем минимизируем, инлайним (в тэг style в header).
    5. Сохраняем готовую страницу как HTML-файл.
    Ответ написан
  • Что такое дзен программирование?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Простой пример, где применяется грамотный код PHP-класса для получения информации о песне с сервера Icecast с удобным и понятным использованием.
    Ответ написан
    Комментировать
  • Как найти координаты крайних точек изображения?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Используйте InkScape (svg editor), сделайте получение контура по картинке и svg-path будет готов.
    Программно: построение связанных кривых Бизье + граничный "бегунок", где граница - это прозрачные/непрозрачные пиксели по периметру изображения, иными словами: "вытравка" контурной обводки.
    Если на PHP - можно библиотеку GD использовать. (а вообще - любой язык и его средства для пиксельной манипуляции с изображением)
    Ответ написан
    2 комментария
  • Аналог strtr Delphi?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    пока такой вариант
    Список функций для работы со строками: тут
    Точной копии нет, можно комбинировать: StringReplace и StuffString.
    Ответ написан
    Комментировать
  • Как запустить исходники apk файла в Android Studio?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Что я делаю не так?
    Занимаетесь реверс-инженерингом, что в разы трудозатратнее написания подобного ПО прямым методом.
    Ответ написан
    2 комментария
  • Стоит ли создавать дополнительные переменные для лучшей читаемости кода?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    2-й.
    он не только более короткий, но и намного менее ресурсозатратный.
    Ну, и... "ломик в рукаве": php.net/manual/ru/function.array-sum.php
    Ответ написан
    4 комментария
  • Программирование с ноля. Не студенческий возраст. С чего начать?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    JS (+HTML/CSS) (учебник на русском):
    1. node.js (для сервера, например, для предоставления информации с датчиков)
    2. nwjs (для создания десктоп приложений, также имеет в своём составе node.js)
    3. phonegap (для кросс-платформенных мобильных приложений)
    Ответ написан
    Комментировать
  • В каком вузе лучше условия для получения навыков программирования (МАИ или РЭУ им. Плеханова)?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Поступать лучше и туда, и туда.
    Пройдете в оба - там уже будете думать.
    "А не пройдёте - ВЕК МЕНЯ ПОМНИТЬ БУДЕТЕ!" (м/ф "Ух, ты! Говорящая рыба!") :)
    Навыки программирования приходят только с опытом и всё зависит от Вас, а не от вуза.
    Ответ написан
    Комментировать
  • Как организовать работу оповещений на сервисе?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Это триггер состояний.
    Сущности: оповещение, канал (оповещения), статус доставки, статус обработки, время повторного действия, кол-во повторов
    По триггеру создаётся экземпляр сущности "оповещение" и присваивается "канал".
    Далее, канальный воркер (каждый воркер для своего канала и они синхронны):
    1. забирает пакет оповещений длиной N-штук и проставляет статус: sending
    2. пытается отправить.
    3. когда всё обработано - проставляет статус обработки, согласно обработке (success,fail,retry + sendAt:timestamp + retryCount++ - сам добавляет в очередь)
    4. Когда все отправлено - переходит к выборке следующего пакета данных.
    Если есть возможность проверки доставки - поле изменяется с помощью входящего события о доставке (за это отвечает протокол канала доставки).
    5. После успешной обработки оповещения (статусы все success), можно или просто "убить" оповещение из очереди или поместить в архивную таблицу оповещений (если этого требует бизнес-процесс).
    Ответ написан
    Комментировать
  • У кого как организован процесс оценки работ по разработке?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Хороший вопрос!
    Я тоже задавался этим вопросам и пришел к выводу, что необходимо в компании разработать автоматизированную систему оценки.

    Есть 2 вида оценки работ:
    1. Прогнозируемая
    2. Фактическая (по времени и тому, что было сделано)

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

    Теперь, предположим, что часть рабочих носят по-одному кирпичу, а один - по 10 сразу.
    Стоит ли тому, кто носит сразу по 10 кирпичей - платить 5*10?
    Или же "украсть" у него кровно заработанные деньги, если он делает это быстрее?
    Т.е. разговор идёт о сложности алгоритма (вложенность, рекурсии и т.д.)

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

    1. Прогнозируя изначально и получив фактически выполненную работу - можно сравнить и на основе этой разницы скорректировать алгоритм прогноза.
    2. Оплата всегда ведётся по прогнозируемым трудозатратам вместе с разработчиками.
    3. Если что-то требует исследовательской работы - это делается в первую очередь и стоимость этой работы оговаривается заранее.
    Ответ написан
  • Что на сайте нужно обязательно кэшировать?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Обязательно - не надо ничего кэшировать.
    Дополнение от dimasmagadan : Не забываем про настройку сервера для того, чтобы браузер клиента мог сам кэшировать страницы.

    В идеале, кэшировать надо данные ВСЕХ функциональных блоков, зависящих от входных параметров.
    К ним относятся:
    1. SQL-запросы и ответы
    2. поиск по любой структуре данных и результат этого поиска
    3. файловая структура, находящаяся по определённому пути
    4. данные, полученные для каждого из блоков представления ("список", "выборка", "статистика" и т.д.)
    5. сформированный шаблонизатором контент на основе GET-параметров

    Всегда кэшируйте первым тот блок, который занимает больше времени при обработке данных и т.д. по нисходящей.
    Первые претенденты на кэширование, как правило: блоки с пунктами 2, 3 и 5.

    Дополнение от Алексей Уколов :
    Кеширование - это большая боль для разработчика, на самом деле. И "не надо кешировать" - это именно с этой точки зрения. Любой кеш усложняет приложение в разы, потому что его нужно инвалидировать, обрабатывать ошибки и т.п. Но часто без него не обойтись, это факт.
    Ответ написан
    7 комментариев
  • Как забанить по Ip или домену Конкурента?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Усложнить парсинг - способов масса:
    1. Запретить просмотр исходного кода материала со всех IP, кроме поисковиков.
    2. Для остальных - отображать материалы единым целым изображением с водяными знаками или использовать JS-обфускацию с таймером-задержкой при подгрузке контента статьи для определения автоматического парсинга, а также следить за событием выделения и копирования текста на странице.
    3. Можно раскидывать текст по слоям, но это достаточно сложно сделать с сохранением адаптивности шаблона.
    4. Можно изображения резать по диагонали или как угодно и загружать по слоям.
    5. Можно делать частичное наполнение, чтобы получить индексацию по ключам.
    6. Можно использовать умышленно разный язык, чтобы буквы разного языка выглядели бы одинаково, а затем - незаметно после парсинга конкурентом, заменять всё на нормальные (нужного языка). В итоге - у него будет для ПС - говноконтент)
    7. Можно ключи текста заменить местоимениями или писать антонимы.

    Т.е. задача: чтобы конкурент делал больше работы по обеспечению SEO, чем Ваша система в автоматическом режиме. Только тогда он поймет, что тратит больше времени и это бессмысленно делать с Вашим сайтом.
    Ответ написан
    24 комментария
  • Возможно ли создать программу сортировщик ютуба?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    так вроде он ща так и делает....
    Ответ написан
  • Как расшифровать файл javascript?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    /** @type {Array} */
    var _0x6e0a = ["random", "floor", "\n", "URL GOTO=http://ad-social.org/in/earn?soc=in&type=like", "SET !TIMEOUT_STEP 0", "TAG POS=1 TYPE=A ATTR=CLASS:openTask<SP>btn&&ONCLICK:openTask*;&&HREF:javascript:;", "WAIT SECONDS=5", 'SEARCH SOURCE=TXT:"404 Not Found"', "TAB CLOSE", 'SEARCH SOURCE=TXT:"\u0417\u0430\u043a\u0430\u0437 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d... \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d, \u043b\u0438\u0431\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437-\u0437\u0430 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439, \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0412\u0430\u043c\u0438. "',
        "ONDIALOG POS=1 BUTTON=OK CONTENT=", "WAIT SECONDS=1", "TAG POS=1 TYPE=A ATTR=CLASS:skip-task-btn&&HREF:javascript:;", "WAIT SECONDS=2", "SET !TIMEOUT_STEP 15", 'SEARCH SOURCE=TXT:"\u00a9 2016 Instagram"', 'SEARCH SOURCE=TXT:"\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u0430\u043d\u043d\u0430\u044f \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430."', "TAG POS=1 TYPE=A ATTR=TXT:\u041d\u0440\u0430\u0432\u0438\u0442\u0441\u044f",
        "WAIT SECONDS=", "URL GOTO=http://ad-social.org/in/earn?soc=in&type=follower", "TAG POS=1 TYPE=BUTTON ATTR=TXT:\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f"
    ];
    /**
     * @param {number} opt_attributes
     * @param {number} expectedNumberOfNonCommentArgs
     * @return {?}
     */
    function getRandomInRange(opt_attributes, expectedNumberOfNonCommentArgs) {
        return Math[_0x6e0a[1]](Math[_0x6e0a[0]]() * (expectedNumberOfNonCommentArgs - opt_attributes + 1)) + opt_attributes;
    }
    var n = _0x6e0a[2];
    for (;;) {
        iimPlayCode(_0x6e0a[3]);
        /** @type {number} */
        i = 0;
        for (; i < 6; i++) {
            e = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[5]);
            if (e < 0) {
                iimPlayCode(_0x6e0a[6]);
                break;
            }
            z0 = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[7]);
            if (z0 > 0) {
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[3]);
            }
            z = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[9]);
            if (z > 0) {
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[10] + n + _0x6e0a[11] + n + _0x6e0a[12] + n + _0x6e0a[13]);
                iimPlayCode(_0x6e0a[3]);
            } else {
                iimPlayCode(_0x6e0a[14] + n + _0x6e0a[15]);
                z1 = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[16]);
                if (z1 > 0) {
                    iimPlayCode(_0x6e0a[8]);
                    iimPlayCode(_0x6e0a[10] + n + _0x6e0a[11] + n + _0x6e0a[12] + n + _0x6e0a[13]);
                    iimPlayCode(_0x6e0a[3]);
                }
                iimPlayCode(_0x6e0a[4] + n + _0x6e0a[17]);
                iimPlayCode(_0x6e0a[18] + getRandomInRange(3, 5));
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[18] + getRandomInRange(15, 20));
                iimPlayCode(_0x6e0a[3]);
            }
        }
        iimPlayCode(_0x6e0a[19]);
        /** @type {number} */
        i = 0;
        for (; i < 6; i++) {
            e = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[5]);
            if (e < 0) {
                iimPlayCode(_0x6e0a[13]);
                break;
            }
            z0 = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[7]);
            if (z0 > 0) {
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[19]);
            }
            z = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[9]);
            if (z > 0) {
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[10] + n + _0x6e0a[11] + n + _0x6e0a[12] + n + _0x6e0a[13]);
                iimPlayCode(_0x6e0a[19]);
            } else {
                iimPlayCode(_0x6e0a[14] + n + _0x6e0a[15]);
                z1 = iimPlayCode(_0x6e0a[4] + n + _0x6e0a[16]);
                if (z1 > 0) {
                    iimPlayCode(_0x6e0a[8]);
                    iimPlayCode(_0x6e0a[10] + n + _0x6e0a[11] + n + _0x6e0a[12] + n + _0x6e0a[13]);
                    iimPlayCode(_0x6e0a[19]);
                }
                iimPlayCode(_0x6e0a[4] + n + _0x6e0a[20]);
                iimPlayCode(_0x6e0a[18] + getRandomInRange(3, 5));
                iimPlayCode(_0x6e0a[8]);
                iimPlayCode(_0x6e0a[18] + getRandomInRange(15, 20));
                iimPlayCode(_0x6e0a[19]);
            }
        }
    };
    Ответ написан
  • Какова правильная логика обновления клиента игры?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Есть версия и есть хеш-сумма текущей версии всех данных приложения (файлы + БД).
    При запуске - проверяются оба значения.
    При несоответствии - выполняется операция синхронизации:
    1. Выявление различий
    2. Подготовка списка изменений относительно текущей версии у пользователя
    3. Резервирование текущей версии пользователя
    4. Загрузка всех необходимых файлов на устройство пользователя. (с возможностью докачки при разрыве соединения)
    5. Выполнение изменений.
    6. Проверка сделанных изменений (п.1)
    7. Удаление резервной копии (созданную в п.3)
    При прерывании любого из пунктов (сел аккумулятор у ПК или смартфона и прочее) - всегда должна быть возможность продолжить обновление с прерванного шага.
    Ответ написан
    Комментировать
  • Кто хочет поломать немного мозг?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Это обычный тетрис в невесомости.
    Вначале поднимаем все фигуры вверх и заполняем строку за строкой.
    Если надо лучше - уже комбинаторика.
    Ответ написан
    Комментировать