• Существуют ли универсальные способы обезопасить php сайты?

    Wohlstand
    @Wohlstand
    Илья Т.: ну хотя бы защитить самые важные из них (ядерные пышки, которые 100% не меняются). Я лично против применения CMS (за исключением phpBB) и предпочитаю самописки. Да, их дольше строить, особенно если руками калибровать стиль, но они надёжнее, легче, и весь код под полным контролем.
  • Существуют ли универсальные способы обезопасить php сайты?

    Wohlstand
    @Wohlstand
    Илья Т.: как я уже сказал, назначить chown root:root и chmod 444 на все файлы сайта (папки должны быть 755), так файлы будет невозможно перезаписать, даже если они лежат в хомяке зверя. Это защитит файлы от перезаписи, подмены, порчи
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    EXL: он у меня уже открыт, только лежит в подпапке моего игрового движка: https://github.com/WohlSoft/PGE-Project/tree/maste...
    А так, планирую в ближайшее время "отпочковать" его как отдельный под-модуль (в отдельный репозиторий), чтобы его можно было использовать отдельно. Для сборки использую QMake, хотя в режиме Non-Qt. Сначала я собираю все зависимости через цепочку bash-скриптов (build_deps.sh - начало, потом в _Libs/_sources скрипт-толстопуз "___build_script.sh", который распаковывает тарболы и вызывает сборщики (а также патчит кое-что, чтобы не плодить тучи симлинков, ведь сборки этих либ я таскаю вместе с проектом с собой, используя самые свежие с официальных реп)), а затем собираю QMake-проекты зависимостей. Сам форк я назвал "SDL Mixer X", и инфу о нём разместил тут: wohlsoft.ru/pgewiki/SDL_Mixer_X
  • Как быстро найти группу объектов в массиве, попадающих в выбранную зону по координатам Лево-Верх-Право-Низ?

    Wohlstand
    @Wohlstand Автор вопроса
    Для себя я применил алгоритм R-Tree, работает очень хорошо и очень быстро, даже если на карте более миллиона элементов!
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    EXL: Спустя время я уже решил большинство проблем с SDL Mixer путём создания форка: (для себя решил использовать QMake для сборки, и автоматизация сборки либ-зависимостей (libSDL2, libOGG, libVORBIS, libFLAC, libMAD) на любой платформе через bash-скрипт)
    - исходники libModPlug я интегрировал в один проект с SDL Mixer,
    - исправил проблему ресемплирования путём создания собственного ресемплера на стороне SDL Mixer (чтобы обойти использование внутри-SDL-евского).
    - добавил дополнительные форматы (libGME, libADLMIDI (который работает абсолютно везде вне зависимости от предустановленных MIDI-устройств и даёт одинаковое звучание везде) )
  • Что будет, если фрилансер допустит ошибку в своей работе?

    Wohlstand
    @Wohlstand
    Бывает что у разработчиков мылится глаз, и потом в итоге баги, которые разраб не смог найти, находятся любопытным пользователем в самом дальнем углу
  • Как обеспечить работу с текстурами OpenGL с очень маленькой видеопамятью?

    Wohlstand
    @Wohlstand Автор вопроса
    P.S. Сама игрушка у меня потребляет очень мало видеопамяти, т.к. я сделал динамическую подгрузку текстур по запросу (не нужна текстура сейчас - не грузить, как будет нужна - загрузить. В зависимости от размера текстуры, компьютера и его харда в момент подгрузки текстуры игра на четверть секунды подвисает, но при повторном использовании всё летает).
  • Как обеспечить работу с текстурами OpenGL с очень маленькой видеопамятью?

    Wohlstand
    @Wohlstand Автор вопроса
    Всё, я как раз решил свои проблемы с этим.
    1) Бред в VirtualBox был лишь потому что я с самого начала неправильно создавал OpenGL-контекст через SDL. Как стал делать правильно, всё заработало везде
    2) По поводу не прогрузившихся текстур на старой видеокарте - вы правы, это из-за степени двойки. Та видеокарта не поддерживает текстуры не кратные степени двойки. В итоге я сделал проверку на поддержку этой возможности, и стал приводить картинки к степени двойки перед биндингом, и всё заработало как часы.
    Сейчас я уже сделал модульную поддержку драйверов отрисовки: OpenGL 2, OpenGL 3 и софтвар через SDL-ные вызовы
  • Как быстро найти группу объектов в массиве, попадающих в выбранную зону по координатам Лево-Верх-Право-Низ?

    Wohlstand
    @Wohlstand Автор вопроса
    Спасибо, я как раз примерил следующее: в одном случае сделал сетку на базе хэш-таблиц, индекс каждой ячейки которых я рассчитываю через остаток от деления на размер ячейки сетки. В другом случае применил R-Дерево.

    Извините за поздний ответ.
  • Qt Creator Русифицируется ли справка?

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

    P.S. Английский очень полезен даже тем, чтобы понимать смысл команд по им самим, поэтому настоятельно рекомендую поучить его, даже просто переводя слова переводчиком (фразы или абзацы увы, не всегда хорошо).
  • Какие самые печальные/курьезные по последствиям баги в вашей практике (или о которых знаете)?

    Wohlstand
    @Wohlstand
    Второй случай связан с электронным расписанием моего университета, было время когда оно буквально полный бред показывало, все дни были перепутаны. Баг решился в миг как только исправил одну единичку в php-коде, после чего всё встало на свои места. Эта единичка значила чётность первой в семестре недели. Ошибка была в детекторе, который эту единичку считал
  • Как записать логическое выражение в переменную?

    Wohlstand
    @Wohlstand Автор вопроса
    Отлично! Всё сделал и работает офигенно! std::function как контейнер, а лямбда-функции - это вообще то, что надо!!! СПАСИБО!
  • Как определять прозрачные области спрайта, используя маску?

    Wohlstand
    @Wohlstand Автор вопроса
    Уже прошло много времени и я уже нашёл, какой криворукий алгоритм там был:
    Думаю что многие знали алгоритм битовой маски AND->OR (в VisualBasic делался через BitBlit).

    Это значит, что:
    1) сначала по-пиксельно рисуется на экране/фоне маска, но с особым методом: цвет каждого пикселя рассчитывается через побитовую операцию "И" к R, G и B между каждым пикселем фона и маски.
    2) в том же самом месте так же по-пиксельно рисуется сама картинка, но уже вместо "И" применяем побитовое "ИЛИ".
    Этот старый алгоритм использовался до изобретения альфа-канала, увы, он медленный (потому что чтобы нарисовать одну и ту же картинку, дважды оббегаем все писксели).

    Я реализовал конвертирование таких масок в альфа-канал через битовые операции, и работает действительно почти в два раза дольше, чем я бы просто объединял маску с картинкой как инвертированный альфа-канал. Но мне этот алгоритм помогает фиксить "ленивые" маски, которые почему ленивые: потому что отличаются от картинки только белым фоном (а должны быть чёрным силуэтом), что принципиально неправильно, и при переводе этого в альфа-канал, получаю черти-что.
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    Всё, слинковалось со статической версией Qt5, когда я заменил "-lmikmod" на "-lmikmod.dll"
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    @EXL Всё заработало, проверил MIDI, проверил OGG, тоже играют.
    Я собрал правильно, но забыл перетащить LIB-ы в папку с Qt, почему линковалось со smpeg-ским SDL_mixer. Когда всё поместил как надо, почему-то в статической сборке Qt-5 упорно не линкуется MikMod как ни крути (менял позицию -lmikmod то туда, то сюда, не линкуется пока, тогда попробую собрать его статически), хотя в динамической всё слинковалось на ура.
    Конфигуривовал SDL2_mixer вот так:
    ./configure --enable-music-mp3 --enable-music-mp3-mad-gpl --disable-music-mp3-smpeg  --enable-music-midi --enable-music-midi-timidity --disable-music-midi-fluidsynth --disable-music-mod-modplug --enable-music-mod --enable-music-mod-mikmod --disable-music-mod-mikmod-shared --enable-music-flac=yes --disable-music-flac-shared --with-gnu-ld --disable-sdltest  --libdir=/d/DevTools/Qt/5.3.0/Tools/mingw482_32/lib --includedir=/d/DevTools/Qt/5.3.0/Tools/mingw482_32/include
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    @EXL, Проект кросс-платформенный, делаю И для Windows, И для Linux, И для Mac OS X (друг помогает собирать и отлаживать на Mac), на линуксе не тестировал, на на Windows MP3 глухомань, как ни крути.
    Вот склепал быстренько:
    wohlnet.ru/sentfile/DummySDL_Musplay.zip
    Перетаскиваешь в окно любой файл и жмёшь "играть" или "остановить" чтобы запускать или останавливать музыку.
    Собираю в Qt 5.3, SDL-либы (SDL2 и SDL2_mixer) распаковал прямо в Qt-шную папку bin, lib, include, share, на линуксе всё собирается без лишней возни с либами.
  • Как заставить SDL2_mixer воспроизводить mp3-формат?

    Wohlstand
    @Wohlstand Автор вопроса
    Собрал всё, и libmad, проковырялся с ./configure чтобы наконец собралась, всё равно ничего не слышно. Даже стал снимать состояние:
    Mix_MusicType type=Mix_GetMusicType(play_mus);
            qDebug() << QString("Music type: %1\n").arg(
                    type==MUS_NONE?"MUS_NONE":
                    type==MUS_CMD?"MUS_CMD":
                    type==MUS_WAV?"MUS_WAV":
                    /*type==MUS_MOD_MODPLUG?"MUS_MOD_MODPLUG":*/
                    type==MUS_MOD?"MUS_MOD":
                    type==MUS_MID?"MUS_MID":
                    type==MUS_OGG?"MUS_OGG":
                    type==MUS_MP3?"MUS_MP3":
                    type==MUS_MP3_MAD?"MUS_MP3_MAD":
                    type==MUS_FLAC?"MUS_FLAC":
                    "Unknown");

    и
    if(Mix_PlayMusic(play_mus, -1)==-1)
                {
                    qDebug() << QString("Mix_PlayMusic: %1\n").arg(Mix_GetError());
                    // well, there's no music, but most games don't break without music...
                }
    
                qDebug() << QString("Music is %1").arg(Mix_PlayingMusic()==1?"Playing":"Silence");


    В итоге вывод:
    "Music type: MUS_WAV"
    "Music is Playing"
    "Music type: MUS_MP3"
    "Music is Playing"

    А пока играет MP3 - тишина, а WAV играет и всё слышно
  • Как рендерить анимированный QGraphicsPixmapItem из одной общей картинки, размещённой вне QGraphicsPixmapItem?

    Wohlstand
    @Wohlstand Автор вопроса
    Эксперимент прошёл на ура, QGraphicsPixmapItem я превратил в QGraphicsItem.
    Создал класс аниматора, который хранит только целый спрайт и имеет две выводящие функции:
    image(), которая возвращает текущий кадр, читая исходное изображение через copy(), и wholeImage() которая просто отдаёт целый спрайт.
    [в памяти хранится только одно цельное изображение, таймер в каждом экземпляре аниматора меняет только значение позиции кадра, а image() генерирует текущий]. Так же сделаю второй тест: создам второй буфер, куда каждый такт таймера кадр будет копироваться (как я сделал в старом по-объектном аниматоре) в выделенный для него QPixmap, а image() просто будет раздавать этот готовый кадр напрямую. Тем самым сделаю вывод, что быстрее и надёжнее. Чтобы анимация отображалась, я поставил внешний таймер, который вызывает update() на сцену (явно указав видимую область). Поставил период в 31 миллисекунду вместо 1, иначе мой одноядерный процессор нагружается на 100%.
  • Как рендерить анимированный QGraphicsPixmapItem из одной общей картинки, размещённой вне QGraphicsPixmapItem?

    Wohlstand
    @Wohlstand Автор вопроса
    Попробую через QGraohicsItem, тем более мне нужно руками их хватать, перетскивать, изменять опции, и т.п.
    setAnimation() я уже сделал, но она создаёт аниматор внутри самого объекта: количество кадров, скорость кадров, и в итоге исходный спрайт превращается в анимашку. Я хочу попробовать так:
    - создать аниматор как независимый объект, который будет выдавать текущий кадр.
    - в предзагрузке файла буду создавать массив аниматоров, каждый из которых анимирует свою картинку и по-индексно присваивать элементам ссылку на свой аниматор, чтобы paint() прописовывал именно его кадр. Вопрос ещё в том. как дать понять сцене, что элемент обновился, и что надо вызвать paint()? Но чтобы не звонить update() каждую миллисекунду, процессору от этого будет не хорошо, особенно если в зоне видимости нет анимированных объектов