BLOG "Моё хобби" или "как я трачу свободное время"

Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
wopox1337, круто. Наконец то рабочий способ. Вопрос: а не выйдет ли за пределы float если все время прибавлять 99999.0. Я тут искал максимальное число, думаю можно его ставить вместо суммирования. Но я так и не нашел конкретное значение. Везде пишут, что зависит от процессора и ОС. Одно что известно, так это что всегда 32 бит
 
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
В продолжение поста #137
Современные программы тормозят не потому что плохо оптимизирован низкоуровневый код, а потому что программисты не умеют оценивать сложность алгоритмов, не понимают, какие алгоритмы стоит применять, какие не уместны в данной задаче, что программе надо делать в первую очередь, что потом, не понимают, как контролировать десятки tradeoffs. Талантливые архитекторы, которые умеют всё это кун-фу, ценятся на вес золота.

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.

Ключевое тут «wrong places» и «wrong times». Архитектура приложения это «right place», и начало проектирования для неё — самое «right time». Разворачивать циклы раньше времени и отмечать регистровые переменные — это можно (и нужно) потом делать. А выбрать правильные структуры данных и алгоритмы с адекватной сложностью — вот это делать «никогда не рано». Вот такая моя трактовка фразы Кнута.
 
Сообщения
273
Реакции
424
Помог
5 раз(а)
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
А ещё я думаю тут виноват заговор производителей железа:smile3: В 90-х в 64KB такое умудрялись засунуть:yes3:
Ну по факту да, докупить железа сейчас выгоднее, чем найм реально профессионального разраба
 

Rey

Сообщения
197
Реакции
190
Помог
5 раз(а)
wopox1337, Может я не верно уловила суть, но просмотр демок можно и таким образом реализовать:
C#:
bind "f1" "dem_speed 0.25"        //скорость 1/4
bind "f2" "dem_speed 0.5"        //скорость 1/2
bind "f3" "dem_speed 2"            //скорость х2
bind "f4" "dem_speed 4"            //скорость х4
bind "f5" "dem_pause 1"            //пауза
bind "f6" "dem_jump -5;wait;dem_pause 0;wait;dem_speed 1"        //перемотка назад на 5 сек
bind "f7" "dem_pause 0;dem_speed 1"                                //воспроизведение и обычная скорость
bind "f8" "dem_jump 5;wait;dem_pause 0;wait;dem_speed 1"        //перемотка вперед на 5 сек
Потому что при использовании viewdemo юзабельны тольк F1-F12. К тому же у меня на клавиатуре есть значки для управления просмотром видео, которые помогают ориентироваться =)
P.s. Может я ничего нового тут не сказала ни для кого, но почему то мало кто пользует подобное, зачастую все мышкой тычут...
P.p.s. И прошу извинить если вообще не в тему тут мой пост)))
 
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
если вообще не в тему тут мой пост)))
В порядке. В блогах обсуждение - норма.

В ходе перемоток прийдётся вечно тыкать кнопки тогда.

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

Как по времени свободнее буду постараюсь релизнуть наработку.
 

Rey

Сообщения
197
Реакции
190
Помог
5 раз(а)
wopox1337, аа, ну тогда, не до конца все поняла) Я это для себя делала когда то (иногда, "на память", делала нарезки с моим "шароскиллом" на пабликах, и этого мне хватало) А твоя реализация куда функциональней, моего "КэФэГэ" ^_^
 
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
Не буду вдаваться в подробности, но материал мне показался ценным.
17035
Книга: Крэг Ларман. Применение UML 2.0 и шаблонов проектирования.
Онлайн: Применение UML 2.0 и шаблонов проектирования. Введение в объектно-ориентированный анализ, проектирование и итеративную разработку



Книга: Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14
30 Май 2019
 
Последнее редактирование:
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
На этот пост, как и смысль меня сподвигли посты из бложика fantom

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

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

Вывод в лог это по сути комментарий. Логирование уровня Trace по большей части их и заменяет.
Уровни Trace и Debug читают разработчики, а все что выше — техподдержка и админы. Поэтому до уровня Info сообщения должны точно отвечать на вопросы: «Что произошло?», «Почему?» и по возможности «Как исправить?». Особенно это касается ошибок в файлах конфигурации.

Качественный состав уровней логирования уже разобран в предыдущей статье, здесь рассмотрим только количественный состав:
  • Trace — вывод всего подряд. На тот случай, если Debug не позволяет локализовать ошибку. В нем полезно отмечать вызовы разнообразных блокирующих и асинхронных операций.
  • Debug — журналирование моментов вызова «крупных» операций. Старт/остановка потока, запрос пользователя и т.п.
  • Info — разовые операции, которые повторяются крайне редко, но не регулярно. (загрузка конфига, плагина, запуск бэкапа)
  • Warning — неожиданные параметры вызова, странный формат запроса, использование дефолтных значений в замен не корректных. Вообще все, что может свидетельствовать о не штатном использовании.
  • Error — повод для внимания разработчиков. Тут интересно окружение конкретного места ошибки.
  • Fatal — тут и так понятно. Выводим все до чего дотянуться можем, так как дальше приложение работать не будет.
Далее, имея какие-то удобно структуризированные логи хотелось бы их своевремено получать, и хранить.
Я нашёл некоторый выход из этой ситуации. Можно использовать Sentry API Reference
Тем самым, заранее подготовленные логи, присылать в мощный сервис. Подход имеет преемущества, но и недостатки.
Из преемуществ - можно почитать описание к Sentry - станет ясно.
А, о недостатках - как минимум - падение. Оно не гарантирует нам доставку логов в Sentry. По всей видимости этот вопрос временно решается записью логов в файлы .log, всё так же структурированно. А, в дальнейшем, можно уже будет поговорить о преемуществах работы c сервером в контейнере Docker и описании работы с docker events

Начну с простого, попробую на суд представить систему логирования, быть может, вместе мы найдём лучшее решение. Пошёл писать.
И сходу нашёл полезную, готовую, похожую реализацию.
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
А, о недостатках - как минимум - падение. Оно не гарантирует нам доставку логов в Sentry. По всей видимости этот вопрос временно решается записью логов в файлы .log, всё так же структурированно
Вот тут кафка тебя выручит. Так как она имеет транзакционный лог, и последний обработанный лог она также захендлит сама имея оффсет. И если что то упадет или пойдет не так, ты мож продолжить отправлять логы с последнего успешного. На файлах тебе придётся делать логику пропускания дублей самому. Хотя по факту там не так уж и сложно. И если брать какой то один сервачок наверно даже лучше будет, чем оверхед в виде кафки.
 
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
Начну с простого, попробую на суд представить систему логирования
Сделал приблизительный набросок. Занимаюсь по мере свободного времени.
Код:
#include <amxmodx>
#include <amxmisc>

#pragma ctrlchar '\'

////////////////
enum LogLevel_s ( <<=1 ) {
    type_Off = 0,
    type_Info = 1,
    type_Warnings,
    type_Debug
}

enum LogType_s ( <<=1 ) {
    type_LogToDir = 0,
    type_Console = 1
}

native bool: Logger_Add(const LogLevel_s: type, const message[2048]);
////////////////

new LogLevel_s: logger_level = (type_Info | type_Warnings | type_Debug);
new LogType_s: logger_type = ((any: 1 << type_LogToDir) | (any: 1 << type_Console));

new g_LogsFile[PLATFORM_MAX_PATH];
new const LOG_DIR_NAME[] = "LoggerAPI_Test";

public plugin_init() {
    register_plugin("Logger API", "1.0.0", "SergeyShorokhov");

    hook_cvar_change(create_cvar("logger_level", "abc"), "CVar_change");
    //bind_pcvar_num(create_cvar("logger_type", "0"), logger_type);

    GetLogsFilePath(g_LogsFile, .dir = LOG_DIR_NAME);

    Logger_Add(type_Info, "ASDASDASD\n\n\n\n\n\n\n\n\n");
}

public CVar_change(pcvar, const old_value[], const new_value[]) {
    logger_level = ParseLogLevel(new_value);
}

static LogLevel_s: ParseLogLevel(const sLogLevel[]) {
    new LogLevel_s: logLevel = type_Off;
    for(new i; i < strlen(sLogLevel); i++) {
        switch(sLogLevel[i]) {
            case 'a': logLevel += type_Info;
            case 'b': logLevel += type_Warnings;
            case 'c': logLevel += type_Debug;
        }
    }

    return LogLevel_s: logLevel;
}



/**
 * @section API
 */

public plugin_natives() {
    register_native("Logger_Add", "native_Add");
}

public native_Add(const plugin_id, const argc) {
    enum { arg_level = 1, arg_message };

    static LogLevel_s: level; level = LogLevel_s: get_param(arg_level);
    static message[2048]; get_string(arg_message, message, charsmax(message));

    if(level & (any: 1 << ~logger_level)) {
        return 0;
    }

    if(logger_type & (any: 1 << type_LogToDir)) {
        log_to_file(g_LogsFile, message);
    }

    if(logger_type & (any: 1 << type_Console)) {
        server_print(message);
    }

    return 1;
}

/**
 * @endsection API
 */


static GetLogsFilePath(buffer[], len = PLATFORM_MAX_PATH, const dir[] = "Logger") {
    get_localinfo("amxx_logs", buffer, len);
    strcat(buffer, fmt("/%s", dir), len);

    if(!dir_exists(buffer) && mkdir(buffer) == -1) {
        set_fail_state("[Logger API] Can't create folder! (%s)", buffer);
    }

    static iYear, iMonth, iDay;
    date(iYear, iMonth, iDay);
    strcat(buffer, fmt("/L%i%02i%02i.log", iYear, iMonth, iDay), len);
}
 
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
Возможно, позже релизну ресурсом, если у кого-либо будет интерес.
было бы очень здорово получить релиз ресурса. Уверен разлетится сразу среди серверодержателей и их админов, которые просматривают демки.
Таки да, ничего для вас не жалко. ?

C++:
alias "nextFrame" "jumpNext";
alias "prevFrame" "jumpPrev";

// Demo speed control
alias Set_00001 "alias jumpNext dem_jump 0.0001 ; alias jumpPrev dem_jump -0.0001 ; echo Speed setUp to: 0.0001x";
alias Set_0001  "alias jumpNext dem_jump 0.001  ; alias jumpPrev dem_jump -0.001  ; echo Speed setUp to: 0.001x";
alias Set_0005  "alias jumpNext dem_jump 0.005  ; alias jumpPrev dem_jump -0.005  ; echo Speed setUp to: 0.005x";
alias Set_001   "alias jumpNext dem_jump 0.01   ; alias jumpPrev dem_jump -0.01   ; echo Speed setUp to: 0.01x";
alias Set_005   "alias jumpNext dem_jump 0.05   ; alias jumpPrev dem_jump -0.05   ; echo Speed setUp to: 0.05x";
alias Set_01    "alias jumpNext dem_jump 0.1    ; alias jumpPrev dem_jump -0.1    ; echo Speed setUp to: 0.1x";
alias Set_1     "alias jumpNext dem_jump 1      ; alias jumpPrev dem_jump -1      ; echo Speed setUp to: 1x";
alias Set_2     "alias jumpNext dem_jump 2      ; alias jumpPrev dem_jump -2      ; echo Speed setUp to: 2x";
alias Set_4     "alias jumpNext dem_jump 4      ; alias jumpPrev dem_jump -4      ; echo Speed setUp to: 4x";

alias speed_00001   "Set_00001 ; alias speed_current cur_speed_00001 ; alias speedUp speed_0001";
alias speed_0001    "Set_0001  ; alias speed_current cur_speed_0001  ; alias speedUp speed_0005 ; alias speedDown speed_00001";
alias speed_0005    "Set_0005  ; alias speed_current cur_speed_0005  ; alias speedUp speed_001 ; alias speedDown speed_0001";
alias speed_001     "Set_001   ; alias speed_current cur_speed_001   ; alias speedUp speed_005  ; alias speedDown speed_0005";
alias speed_005     "Set_005   ; alias speed_current cur_speed_005   ; alias speedUp speed_01  ; alias speedDown speed_001";
alias speed_01      "Set_01    ; alias speed_current cur_speed_01    ; alias speedUp speed_1   ; alias speedDown speed_005";
alias speed_1       "Set_1     ; alias speed_current cur_speed_1     ; alias speedUp speed_2   ; alias speedDown speed_01";
alias speed_2       "Set_1     ; alias speed_current cur_speed_2     ; alias speedUp speed_4   ; alias speedDown speed_1";
alias speed_4       "Set_4     ; alias speed_current cur_speed_4     ; alias speedDown speed_2";

alias cur_speed_00001 "Set_00001 ; alias speedUp speed_0001";
alias cur_speed_0001  "Set_0001  ; alias speedUp speed_0005 ; alias speedDown speed_00001";
alias cur_speed_0005  "Set_0005  ; alias speedUp speed_001 ; alias speedDown speed_0001";
alias cur_speed_001   "Set_001   ; alias speedUp speed_005  ; alias speedDown speed_0005";
alias cur_speed_005   "Set_005   ; alias speedUp speed_01  ; alias speedDown speed_001";
alias cur_speed_01    "Set_01    ; alias speedUp speed_1   ; alias speedDown speed_005";
alias cur_speed_1     "Set_1     ; alias speedUp speed_2   ; alias speedDown speed_01";
alias cur_speed_2     "Set_2     ; alias speedUp speed_4   ; alias speedDown speed_1;";
alias cur_speed_4     "Set_4     ; alias speedDown speed_2";

// Pause toggle
alias pauseOn     "dem_pause 1 ; echo Demo paused.   ; alias pauseToggle pauseOff";
alias pauseOff    "dem_pause 0 ; echo Demo unpaused. ; alias pauseToggle pauseOn";
alias pauseToggle "pauseOn";

// Play Speed aliases
alias +speed_025 "host_framerate 0.001; echo Demo speed fall (0.25x).;"
alias -speed_025 "host_framerate 0; echo Demo speed normalize.;"
alias +speed_05 "host_framerate 0.002; echo Demo speed fall (0.5x).;"
alias -speed_05 "host_framerate 0; echo Demo speed normalize.;"
alias +speed_2 "host_framerate 0.008; echo Demo speed increase (2x).;"
alias -speed_2 "host_framerate 0; echo Demo speed normalize.;"
alias +speed_4 "host_framerate 0.016; echo Demo speed increase (4x).;"
alias -speed_4 "host_framerate 0; echo Demo speed normalize.;"

alias "+nextFrame" "alias _zpecial @nextFrame;@nextFrame"
alias "-nextFrame" "alias _zpecial"
alias "@nextFrame" "zpecial;wait;nextFrame;wait;"

alias "+prevFrame" "alias _zpecial @prevFrame;@prevFrame"
alias "-prevFrame" "alias _zpecial"
alias "@prevFrame" "zpecial;wait;prevFrame;wait;"


// Greetings
speak fvox/activated.wav;
wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;wait;
echo "+                                                    +";
echo "    Viewdemo helper config  ";
echo "    Update: 28.01.2019                ";
echo "    (c) wopox1337 @ Dev-CS.ru ";
echo "            GoodLuck & HaveFun       ";
echo "Usage:";
echo "  Mouse4 - Backward play";
echo "  Mouse5 - Forward play";
echo "  Mwheeldown - Speed--";
echo "  Mwheelup - Speed++";
echo "  F5 - 0.25x speed";
echo "  F6 - 0.5x speed";
echo "  F7 - 2x speed";
echo "  F8 - 4x speed";
echo "";
echo " Script requiments: CS_Fixes.asi (for unblock '_special' loop cmd)";
echo "  (github.com/wopox1337/CS_Patches/releases)";
echo "+                                                    +";
echo "";
echo "";
viewdemo;

// Settings: //////////////////////

// You can setup default speed for view: (speed_4 / speed_2 / speed_1 / speed_01 / speed_005 / speed_001 / speed_00001)
speed_1;

// Binds
bind "mouse5"      "+nextFrame"; // Forward
bind "mouse4"      "+prevFrame"; // Backward
bind "mwheeldown"  "speedDown ; speak fvox/beep.wav"; // Speed--
bind "mwheelup"    "speedUp   ; speak fvox/bell.wav"; // Speed++
bind "mouse3"      "pauseToggle";
bind "F5"          "+speed_025";
bind "F6"          "+speed_05";
bind "F7"          "+speed_2";
bind "F8"          "+speed_4";

// Settings: //////////////////////

upd: прикрепил патч, линк помер, мб кому-то и пригодится.
 

Вложения

Последнее редактирование:
Сообщения
2,752
Реакции
3,017
Помог
61 раз(а)
P.S: откапал это из недров приватов




Набросал плагинчик с эффектом смерти "Ангела" :derisive:, может быть доделаю..
Код:

#include <amxmodx>
#include <reapi>

enum {
TASK_Think = 13378
}

const Float: TASK_FREQ = 0.1;
const TRANS_SPEED = 60;
const Float: GRAVITY = -0.3;
const FULLVIS = 255;

new g_iCurrentThink[MAX_CLIENTS + 1] = { 255, ... };

public plugin_init() {
register_plugin("Angelic death", "0.0.1b", "wopox1337");
RegisterHookChain(RG_CSGameRules_PlayerKilled, "CSGameRules_PlayerKilled", .post = true);
RegisterHookChain(RG_CSGameRules_PlayerSpawn, "CSGameRules_PlayerSpawn", .post = true);
// TODO
//RegisterHookChain(RG_CBasePlayer_PreThink, "CBasePlayer_PreThink", .post = true);

set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET);
}

public CBasePlayer_PreThink(pPlayer) {
set_entvar(pPlayer, var_sequence, 104);
set_entvar(pPlayer, var_gaitsequence, 1);
}

public CSGameRules_PlayerKilled(const pPlayer, const killer, const inflictor) {
set_entvar(pPlayer, var_gravity, GRAVITY);

set_task(TASK_FREQ, "OnPlayer_Think_Dead", .id = TASK_Think + pPlayer);
g_iCurrentThink[pPlayer] = FULLVIS;
}

public CSGameRules_PlayerSpawn(pPlayer) {
// set_entvar(pPlayer, var_flags, ~FL_FROZEN);
if(!is_user_connected(pPlayer)) return;

rg_set_rendering(pPlayer,
.fx = kRenderFxNone,
.render = kRenderNormal,
.amount = FULLVIS
);
}


public OnPlayer_Think_Dead(pPlayer) {
pPlayer -= TASK_Think;

if((g_iCurrentThink[pPlayer] -= TRANS_SPEED) > 0)
set_task(TASK_FREQ, "OnPlayer_Think_Dead", .id = TASK_Think + pPlayer);
else
g_iCurrentThink[pPlayer] = 0;

rg_set_rendering(pPlayer,
.fx = kRenderFxSolidFast,
.render = kRenderTransAdd,
.amount = g_iCurrentThink[pPlayer]
);
}

// Thanks to BAILOPAN for useful stock
stock rg_set_rendering(index, fx = kRenderFxNone, render = kRenderNormal, const amount = 16)
{
set_entvar(index, var_renderfx, fx);
set_entvar(index, var_rendermode, render);
set_entvar(index, var_renderamt, float(amount));
}



Если пресинк раскомментить - будет ещё интереснее

(для форса DIE HS sequence https://github.com/s1lentq/ReGameDL...adee47a36a103/regamedll/dlls/player.cpp#L2743)
 
Сообщения
459
Реакции
272
Помог
9 раз(а)
wopox1337,
be07f3af060796a3dbbb9184f2887a3f.jpg
и как сделать выходящий за workspaceRoot output готовых плагинов? у меня есть вопросики, тик-так
 
Сообщения
175
Реакции
11
wopox1337, спасибо за плагин.
Скажи, пожалуйста, есть ли в планах сделать чтобы когда тебя убивали верх не кидало. А то дизориентация идёт и не знаешь откуда убили?
Или это уже есть там в настройках?
 
Сообщения
175
Реакции
11
Pokemoshka, понял, спасибо. Я так понял это тогда надо просто раскомментить пресинк, о котором wopox и писал при публикации?
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу