LINUX.ORG.RU

Предсказуемость математики и луа

 ,


1

1
function hashStr (nome)
	hours, minutes = GetGameTime()
	count1=hours* 3,1415926535
	count2=minutes* 3,1415926535
	count3=count1*count2
	count3=string.sub(count3, 1, 3)
	count3=string.format("%03d",count3)
	hNik=string.byte(nome,1)
	hNik2=string.byte(nome,2)
	hNome=hNik*hNik2
	hNome=string.sub(hNome, 1, 3)
	hNome=string.format("%03d",hNome)
	r1=string.sub(count3, 1, 1)
	r2=string.sub(hNome, 1, 1)
	r3=string.sub(count3, 2, 2)
	r4=string.sub(hNome, 2, 2)
	r5=string.sub(count3, 3, 3)
	r6=string.sub(hNome, 3, 3)
	r=r1 .. r2 .. r3 .. r4 .. r5 .. r6
	return r
end

hours, minutes = GetGameTime() получает текущие час и минуту в формате: 01 22

Скармливаем слово на одном компе - получаем предсказуемо одинаковый результат. Скармливаем на другом компе получаем тоже предсказуемо одинаковый результат, но не такой, как на предыдущем компе. Это как вообще? Данные одинаковые. Ник один и тот же. Время одно и то же. Результат всегда разный. Это вообще законно?! Время возвращается серверное - одинаковое и там и там.

Перемещено Dimez из general

★★★★★

Последнее исправление: hobbit (всего исправлений: 2)

Ответ на: комментарий от LightDiver

А как правильно указать? И еще про фрид. Там три варианта: fread, fgetc и fgets. И вот они нихрена у меня не работают. Я тупо перебором подобрал тот, который хоть что то выводил приличное.

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

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

У меня есть две команды:

netstat |grep '7776 ESTABLISHED' | awk '{print $2}

Эта выводит второй столбец таких вот данных:

tcp        0      0 192.168.0.92:51768      sir8.antoshin.exam:7776 ESTABLISHED
tcp        0      0 192.168.0.92:41386      sir8.antoshin.exam:7776 ESTABLISHED

Если число резко растет, значит клиенту игровому резко поплохело и нужно включать сигнал - музыку.

netstat |grep '7776 ESTABLISHED' | wc -l

Вторая команда тупо считает количество строк. Если строк меньше двух - значит сервер упал или клиент упал или еще чего. И нужно включать музыку. Вот такое я и хотел реализовать.

https://github.com/Vladgobelen/SirusOFF/blob/main/offn.lua

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

Мне нереально понравился дебагер или хз что это у си. Невероятно удобно, красиво. На русском, подсвечивает тебе все, подскажет где ты ошибся, как лучше сделать. Не то что луа..

https://cdn.discordapp.com/attachments/811217303378329643/1094874237010985070/prmr.png

Вот! Ну охренительно же.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Набросал код на Си, должно работать. Я сам не сишник, а на C++ с Qt программирую, так как там всё проще.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BUFFER_SIZE 4096
#define ATOI_BUFFER 256
#define SLEEP_TIME_SECONDS 30

int executeCommand(char *command, char *stdout, int stdoutSize, size_t *dataSize)
{
    int result = 0;
    FILE *pipe = popen(command, "r");
    *dataSize = 0;

    if (pipe == NULL) {
        return 0;
    }

    size_t bytesRead = 0;
    size_t bytes = 0;
    do {
        bytes = fread(stdout + bytesRead, 1, stdoutSize - bytesRead, pipe);
        if (bytes) {
            bytesRead += bytes;
        } else {
            int errorCode = ferror(pipe);
            if (errorCode) {
                result = 1;
                fprintf(stderr, "Error read pipe: %d", errorCode);
            }
        }
    } while (bytes);

    *dataSize = bytesRead;
    pclose(pipe);

    return result;
}

int isNewLine(char symbol)
{
    return (symbol == '\r' || symbol == '\n');
}

void skipNewLineSymbols(char *text, size_t stdoutSize, size_t *pos)
{
    while (*pos < stdoutSize) {
        if (isNewLine(text[*pos])) {
            (*pos)++;
        } else {
            break;
        }
    }
}

void findFirstNewLineSymbol(char *text, size_t stdoutSize, size_t *pos)
{
    while (*pos < stdoutSize) {
        if (!isNewLine(text[*pos])) {
            (*pos)++;
        } else {
            break;
        }
    }
}

void getNextLine(char *text, size_t stdoutSize, size_t *lineStart, size_t *lineLength)
{
    size_t newLineStart = *lineStart + *lineLength;
    size_t newLineLength = 0;
    int validString = 0;

    if (newLineStart < stdoutSize) {
        skipNewLineSymbols(text, stdoutSize, &newLineStart);
        if ((newLineStart < stdoutSize) && !isNewLine(text[newLineStart])) {
            size_t newLineEnd = newLineStart + 1;
            findFirstNewLineSymbol(text, stdoutSize, &newLineEnd);
            newLineLength = newLineEnd - newLineStart;
            validString = 1;
        }
    }

    if (validString) {
        *lineStart = newLineStart;
        *lineLength = newLineLength;
    } else {
        *lineStart = -1;
        *lineLength = 0;
    }
}

long int toNumber(char *text, size_t length)
{
    char atoibuf[ATOI_BUFFER + 1];
    atoibuf[ATOI_BUFFER] = 0;

    if (length > ATOI_BUFFER) {
        fprintf(stderr, "Error atoi buffer too small: %d, required size: %ld", ATOI_BUFFER, length);
        length = ATOI_BUFFER;
    }

    memcpy(atoibuf, text, length);
    atoibuf[length] = 0;

    return atol(atoibuf);
}

void checkNetLimit(char *text, size_t stdoutSize)
{
    size_t lineStart = 0;
    size_t lineLength = 0;
    long int number = 0;

    do {
        getNextLine(text, stdoutSize, &lineStart, &lineLength);
        if (lineLength) {
            number = toNumber(text + lineStart, lineLength);
            if (number > 50000) {
                system ("sh alarm.sh");
                printf ("количество пакетов превышено\n");
                printf ("%ld\n", number);
            }
        }
    } while (lineLength);
}

void checkLineLimit(char *text, size_t stdoutSize)
{
    size_t lineStart = 0;
    size_t lineLength = 0;
    long int number = 0;

    getNextLine(text, stdoutSize, &lineStart, &lineLength);
    if (lineLength) {
        number = toNumber(text + lineStart, lineLength);
        if (number < 2) {
            system ("sh alarm1.sh");
            printf ("Строк меньше двух\n");
        }
        printf ("%ld\n", number);
    }
}

int main()
{
    char buf[BUFFER_SIZE + 1];
    buf[BUFFER_SIZE] = 0;
    size_t dataSize = 0;
    int res = 0;

   system ("sh servMesg.sh");
    while (1) {
        res = executeCommand("netstat |grep '7776 ESTABLISHED' | awk '{print $2}'", buf, BUFFER_SIZE, &dataSize);
        if (res == 0 && dataSize) {
            checkNetLimit(buf, dataSize);
        }

        res = executeCommand("netstat |grep '7776 ESTABLISHED' | wc -l", buf, BUFFER_SIZE, &dataSize);
        if (res == 0 && dataSize) {
            checkLineLimit(buf, dataSize);
        }

        sleep(SLEEP_TIME_SECONDS);
    }
    return 0;
}

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Ох жесть.. Я в это вчитываться буду вечерами, мечтая рано или поздно все разобрать.

Аааа… Вижу несколько функций. Попробую по очереди их разобрать.

А ты не мог бы прокомментировать в коде хотя бы типы переменных? Почему именно такие и какой у них там внутри формат.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Аааа… Вижу несколько функций. Попробую по очереди их разобрать. А ты не мог бы прокомментировать в коде хотя бы типы переменных? Почему именно такие и какой у них там внутри формат.

Вот сделал мелкие исправления, и расположил функции в удобном порядке. Написал комментарии, но сам код не тестировал. https://pastebin.com/DQSjzG4R

V1KT0P ★★
()
Ответ на: комментарий от LightDiver

Ох жесть.. Я в это вчитываться буду вечерами, мечтая рано или поздно все разобрать.

Это из-за того что это чистый си без сторонних библиотек. Сравни низкоуровневый си без библиотек с высокоуровневым C++ с Qt фреймворком:

#include <QProcess>
#include <QTextStream>
#include <QThread>

// Количество секунд между проверками
#define SLEEP_TIME_SECONDS 30

// Объявление функции, чтоб можно было их расположить в любом порядке, так я хочу их разместить после main функции
QString executeCommand(QString command);
void checkNetLimit(QString data);
void checkLineLimit(QString data);

// Отсюда стартует программа
int main()
{
    executeCommand("servMesg.sh");

   // Бесконечно крутимся в цикле
   // тут можно конечно добавить проверку на прерывание выполнения из консоли по ctrl+c и корректно завершиться
   // но это если уже весь код понятен, а так это лишнее для такого простого кода
    while (1) {
        // Выполняем командную строку и получаем вывод
        QString data = executeCommand("netstat |grep '7776 ESTABLISHED' | awk '{print $2}'");
        checkNetLimit(data);

        // Выполняем командную строку и получаем вывод
        data = executeCommand("netstat |grep '7776 ESTABLISHED' | wc -l");
        checkLineLimit(data);

        // Засыпаем на некоторое время
        QThread::sleep(SLEEP_TIME_SECONDS);
    }

    return 0;
}

// Выполнение консольной команды из переменной command, и возврат текстового вывода
// так как Qt не предоставляет возможности вызова консольной команды как функция system
// значит напишем её сами, но она будет платформо зависимой
// в данном случае будет вызвать /bin/sh и передавать команду на исполнение
QString executeCommand(QString command)
{
    QProcess process;
    QString program = "/bin/sh";
    QStringList arguments;
    arguments.append("-c");
    arguments.append(command);

    process.start(program, arguments, QIODevice::ReadOnly);
    process.waitForFinished();

    return process.readAllStandardOutput();
}

// Функция проверки сетевых лимитов
void checkNetLimit(QString data)
{
    // Разделяем текст на строки
    QStringList lines = data.split('\n', QString::SkipEmptyParts);

    // Если вывод пустой то ничего не делаем или можем добавить вывод ошибки в консоль
    if (lines.isEmpty()) {
        return;
    }

    for (int i = 0; i < lines.size(); ++i) {
        // Числовой результат который попытаемся получить из строки
        // Конвертим строку в число предварительно убрав whitespace('\t', '\n', '\v', '\f', '\r', ' ') символы по бокам методом trimmed()
        qint64 number = lines[i].trimmed().toULongLong();
        if (number > 50000) {
            executeCommand("alarm.sh");
            QTextStream(stdout) << "количество пакетов превышено\n" << number << "\n";
        }

    }
}

void checkLineLimit(QString data)
{
    // Если вывод пустой то ничего не делаем или можем добавить вывод ошибки в консоль
    if (data.isEmpty()) {
        return;
    }

    // Числовой результат который попытаемся получить из строки
    // Конвертим строку в число предварительно убрав whitespace('\t', '\n', '\v', '\f', '\r', ' ') символы по бокам методом trimmed()
    long int number = data.trimmed().toULongLong();

    QTextStream stream(stdout);
    if (number < 2) {
        executeCommand("alarm1.sh");
        stream << "Строк меньше двух\n";
    }
    stream << number << "\n";
}
V1KT0P ★★
()
Ответ на: комментарий от LightDiver

Любая развесистая клюква if’ов выглядит, как говно. Сам такие писал не раз, кхм. Не знаю Lua, но как-то странно, что не работает даже первый принт. Однако первый принт надо ставить сразу на входе, до любой операции с данными.

Virtuos86 ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А так программировать на lua это боль как по мне.

На lua легко начать, но сложно продолжить =)

Мне при взгляде на код ТС сложно вообще себя убедить, что на этом можно захотеть самому кодить. За деньги – да, фо фан – нет.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Ты наверное программист, тебе не понять тогда. Lua язык для непрограммистов в первую очередь. А код ТС. Он за всю жизь вторую неделю только к кодированию как виду деятельности прикоснулся считай, а ты чего хотел =) Ты вот на первых своих порах тоже кое как писал хехе. Просто когда ты чисто увлекаешься не вникая в суть можно перемудрить и большой соблазн делать всё здесь и сейчас без намёка на хотя бы частичное проектирование, ты вот как программист просто себе такого позволить не можешь, а я и ТС можем ибо вертели мы на своём вертолёте все эти ваши паттерны и архитектуры гыгыгы, но ☝️ ты неизбежно к этому приходишь после очереди факапов без приципа «сначала отмерь, потом отрежь» =) Всему своё время.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU
if pQuests == nil then
	pQuests={}
end
if pQuests[1] == nil then
	pQuests[1]={}
end
if pQuests[2] == nil then
	pQuests[2]={}
end
if pQuests[3] == nil then
	pQuests[3]={}
end
message="!добавить квест 1 964"
msg=mysplit(message)
q=msg[3]
msg=msg[4]
for key, val in pairs(pQuests[q]) do
	print ("fdsfsafsafsa")
	if val==msg then
		print("*Квест " .. val .. " " .. GetAchievementLink(val) .. " уже был добавлен.")
		testID=1
	else
	end
end
if testID~=1 then
	table.insert(pQuests[q], msg)
	print("*Квест " .. msg .. " " .. GetAchievementLink(msg) .. " был добавлен.")
end

Вот какого хрена q не принимается таблицей? Ну должно же?

P.S. ЭТО ТИПЫ! Блядские типы! q=tonumber(q) все чинит!

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 3)
Ответ на: комментарий от Virtuos86

А как проверить содержимое строки, содержимое информации об игроке и условия без ифов?

Если в коде грубая опечатка, например of вместо or - скрипт просто будет крашится с первой же строки. Где бы ты принт не поставил.

Вот игрок просит квест, мне нужно этот квест выдать. Я как то кроме ифа не вижу вариантов.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Мне при взгляде на код ТС сложно вообще себя убедить, что на этом можно захотеть самому кодить

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

pihter ★★★★★
()
Ответ на: комментарий от pihter

Не, ну готе я хотя бы альтернативу вижу, хотя в детстве обожал на самом старте кубарсика (после него начал си и си меня доканал. Фантомные боли от него до сих пор). А какая альтернатива ифу? Вот мне нужно проверить кучу условий. Как? Мне действительно интересны варианты.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Например я бы например вот это:

if pQuests == nil then
	pQuests={}
end
if pQuests[1] == nil then
	pQuests[1]={}
end
if pQuests[2] == nil then
	pQuests[2]={}
end
if pQuests[3] == nil then
	pQuests[3]={}
end

Написал бы вот так:

function initTable(value)
    if value == nil then
        return {}
    end
    return value
end

pQuests = initTable(pQuests)
pQuests[1] = initTable(pQuests[1])
pQuests[2] = initTable(pQuests[2])
pQuests[3] = initTable(pQuests[3])

Я еще раньше хотел предложить что-то типа такого:

function initTable(&value)
    if value == nil then
        value = {}
    end
end

initTable(pQuests)
initTable(pQuests[1])
initTable(pQuests[2])
initTable(pQuests[3])

Но оказалось что в lua нет передачи переменной по ссылке в функцию, это увеличило мою ненависть lua и я забил на это.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Но оказалось что в lua нет передачи переменной по ссылке в функцию, это увеличило мою ненависть lua

$ cat /tmp/l.lua 
function inc( a )
  a.val = a.val + 1
end

b = { val = 3 }
print( b.val )
inc( b )
print( b.val )

$ lua /tmp/l.lua 
3
4

таблицы передаются по ссылке

pihter ★★★★★
()
Ответ на: комментарий от V1KT0P

А еще есть метатаблицы, которые позволяют переопределить операцию взятия индекса и добавить туда инициализацию, но ИМХО, это лишнее и твой вариант и, тем более, изначальный, ТСа – очевидные.

А ты, по-моему, изобрел усложнение на ровном месте, ради мифической красоты

pihter ★★★★★
()
Ответ на: комментарий от LightDiver

Вот какого хрена q не принимается таблицей? Ну должно же?

P.S. ЭТО ТИПЫ! Блядские типы! q=tonumber(q) все чинит!

Попробовал IDE ZeroBrane Studio для lua, по команде Analyze находит опечатки по типу «of» из примера выше. Также есть отладчик в котором можно смотреть состояние переменных и там четко видно в чем проблема и падает на нужной строке.

Тут можно даже логически догадаться, сперва у тебя есть строка message="!добавить квест 1 964", ты эту строку разбиваешь на отдельные строки msg=mysplit(message), затем одну из этих строк ты присваиваешь переменной q=msg[3] и в этой переменной именно строка «1» а не число 1, это разные вещи. И поэтому при попытке получить значение из таблицы по строке ты получаешь ошибку ибо там такого нет.

V1KT0P ★★
()
Ответ на: комментарий от LINUX-ORG-RU

Lua язык для непрограммистов в первую очередь

На практике «языки для непрограммистов» спроектированы через жопу и оказываются сложнее и дороже в кодинге, чем нормальные ЯП.

Вспомнить хотя бы VBA.

wandrien ★★
()
Ответ на: комментарий от V1KT0P

Эээ… Но ведь ты переменной pQuests присваиваешь значение: {}

А так вообще можно? Разве это работает?

Оооо… У меня сейчас было просветление. Я прям третью чакру открыл. Когда я объявляю таблицу, я ведь присваиваю кавычки переменной. Гениально. Спасибо. Я просто пока не понимаю еще таких особенностей. И не очень вижу что повторяемое и как могу вынести в функцию. А когда вижу, выношу.

А иногда не выношу, оставляю на потом. Сначала делаю как получится. Мне для начала нужно понять как реализовать хоть как то. Часто по 10 часов перебираю варианты и потом ищу где баг, чтобы хоть как то заработало. А уже потом можно приводить в приличный вид. Но с каждым днем все проще.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Я пару дней назад начал гуглить ide для луа и первым делом нагуглил зеро брейн студио. Эта гадость по опыту первых же минут использования, оказалась даже хуже kwrite. Нет работы со строками, нет подсветок многих. Да это же кошмар. А отладку оно не позволит из за вставок wow api.

Nvim еще больше подсвечивает. Он еще и endы лишние и незакрытые показывает. Я пока им пользуюсь. Мне бы нормальные плагины найти для nvim лучше.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Часто по 10 часов перебираю варианты и потом ищу где баг, чтобы хоть как то заработало

Книжка Иерусалимского состоит из 200 страниц объяснений и 200 страниц справочника по стандартной библиотеке и это абсолютно все, больше в мире знаний про Луа нет: в этой книге разжеваны абсолютно все особенности и возможности языка. Прочитай – горя знать не будешь

pihter ★★★★★
()
Ответ на: комментарий от pihter
posX, posY = GetPlayerMapPosition("player");

print (posX)
if TDG[sender]["x"]==nil then
	print (posY)
	TDG[sender["x"]=posX
	TDG[sender["y"]=posY
else
	posX1=TDG[sender["x"]
	posY1=TDG[sender["y"]
	print (posX1)
	print (posY1)
end
print ("fdsa")

Вот казалось бы - банальщина: posX, posY = GetPlayerMapPosition(«player»);

Это выдает координаты игрока вот в таком вот виде:

0.58399593830109
0.58074426651001

И пока я не пытаюсь записать это в таблицу - все работает. Принтом выводит. Добавляю дальше проверку и запись - скрипт крашится. Минут 30 сижу медитирую… Явно проблема какая то очевидная, а я не вижу.

Ой я дурак, вот сейчас прочитал и понял. У меня кажись скобки не закрытые. И хрен кто это подсветит, блин.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Мне бы нормальные плагины найти для nvim лучше.

Я для вима использую syntastic – показывает все синтаксические ошибки, которые может выявить интерпретатор lua прям на лету

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

pihter ★★★★★
()
Ответ на: комментарий от LightDiver

Явно проблема какая то очевидная, а я не вижу

posX1=TDG[sender["x"]
posY1=TDG[sender["y"]

закрывающие скобки?

как так-то? он когда крашится, совсем ниче не пишет? поставь синтастик: оттакого бы точно уберег

pihter ★★★★★
()
Ответ на: комментарий от pihter

Да да, вот только что минуту назад увидел уже и исправляю. А там тупо нет вывода никакого. Если такая грубейшая ошибка, скрипт просто не сработает. Вообще весь полностью. И самый прикол в том, что если такая ошибка в блоке –[[ –]], скрипт тоже не сработает. И приходится часами перечитывать каждую строку, вглядываться, думать.

Самое простое в таком случае - вырезать 90% скрипта и пошагово построчно его переписывать, проверяя все раз за разом.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Странно: луа подробно все выдает в выхлоп в подобных случаях, и в си возвращает, когда встроенный – наверняка куда-то пишет.

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

pihter ★★★★★
()
Ответ на: комментарий от pihter

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

Мне в этом случае придется функции апи эмулировать, а это добавляет ошибок.

Я сейчас пытаюсь найти расстояние между двумя точками на карте.. хмм.. Кажется была формула пифагора на это. a2 = b2 + c2

Теперь бы еще вспомнить как этим пользоваться. Ух..

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Ты наверное программист, тебе не понять тогда.

Нет. Просто есть с чем сравнивать. Lua по дизайну как язык программирования устарел чтобы быть интересным для ковыряния в нем.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Вопрос не в устаревании, а в доступных инструментах. Луа - это скриптовый инструмент вовки. Скрипты вовки именно на нем, потому его я и использую. Был бы на питоне, использовал бы питон или еще что. Иногда не приходится выбирать.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от pihter

Мне при взгляде на код ТС сложно вообще себя убедить, что на этом можно захотеть самому кодить

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

ОК

Virtuos86 ★★★★★
()
Ответ на: комментарий от LightDiver

А как проверить содержимое строки, содержимое информации об игроке и условия без ифов?

Вопрос не в наличии if’ов, а в их количестве. Так-то, если в ЯП нет паттерн-матчинга, особой альтернативы нет если только не использовать хэш-таблицы.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

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

В первые дни я не то что каждую строчку - я каждую команду искал в гугле и тщательно переписывал, сравнивая варианты и параметры. А потом с каждым использованием становилось все проще и проще, а в какой то момент открывается такое вот «Откровение» и ты ВДРУГ начинаешь разумом осознавать как оно работает. Как перещелкивает что то в голове.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

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

Я тебе даже скажу, что имена переменных - это на самом деле ключи в хэш-таблице, где эти самые переменные и лежат.

wandrien ★★
()
Ответ на: комментарий от pihter

Для отладки был фантастически удобный отладчик, написанный прям на луа и запускающийся отдельной программкой

Попробовал Visual Studio Code с расширением Lua Debug (actboy168.lua-debug). В итоге даже получше ZeroBrane, если не считать что для каждого lua файла нужен json конфиг. Плюс еще установка плагина геморная.

V1KT0P ★★
()
Ответ на: комментарий от LightDiver

Это из-за изучения ЯП по докам, и как следствие отсутствия фундаментального понимания языка программирования и его философии с возможностями. Присоединюсь к пожеланию изучить книжку Иерусалимски. Я сам не читал, но на нее всё дрочат. Наверное, есть из-за чего.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Внимание, суперсурьезный вопрос. Я сейчас вместо удаления одного лишнего каталога, случайно удалил все, кроме каталога .git через shit+del

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

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от V1KT0P

Неееет… За последние 20 лет со мной такое впервые. Хм. Вообще не понимаю как и что сейчас произошло. Выделил каталог, нажал шифт+дел, ентер и все пропало. Пиздец какой то. Если бы выделились все каталоги - пропал бы и каталог .git - логично? А остались .git и .directory. Причем если нажать ctrl+z - пишет что сейчас будет безвозвратно удален каталог, который я и хотел удалить. Чушь какая то.

То есть по контрол+z отменяется последнее действие - его создание.. Хм.. Хотя его нет уже.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от V1KT0P
git status
Текущая ветка: main
Ваша ветка опережает «origin/main» на 6 коммитов.
  (используйте «git push», чтобы опубликовать ваши локальные коммиты)

Изменения, которые не в индексе для коммита:
  (используйте «git add/rm <файл>...», чтобы добавить или удалить файл из индекса)
  (используйте «git restore <файл>...», чтобы отменить изменения в рабочем каталоге)
        удалено:       .gitignore
        удалено:       GuildChat.toc
        удалено:       LICENSE
        удалено:       core.lua
        удалено:       developer.lua
        удалено:       expp.lua
        удалено:       knb.lua
        удалено:       quests/qp.lua
        удалено:       quests/quests.lua
        удалено:       roll.lua


Мда.. Еще и куча временных файлов с данными ушло. А я уже уверовал что уж со мной то таких ошибок не случится. Впервые за жизнь такая срань.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Могу посочувствовать. Если изменения не были закоммичены в git, то ничего не поделаешь. Если какие-то утерянные исходники прямо сейчас открыты в редакторе, то их можно сохранить и восстановить тем самым.

Virtuos86 ★★★★★
()
Ответ на: комментарий от LightDiver

Выделил каталог, нажал шифт+дел, ентер и все пропало

С тех пор как я перешел на vifm – он меня пару раз спасал от такого. Там пока программу не закрыл можно тупа через u отменить даже удаление (хотя, конечно, если ты далал его через dd, а не через DD) суть – та же магия что и с корзиной. Шифт+дел – плохая привычка

Но в твоем случае файлы с диска можно восстановить (кроме имен файлов) у тебя там маленькие текстовые файлы, любая утилита для восстановления удаленных файлов спасет отца русской демократии

pihter ★★★★★
()
Ответ на: комментарий от LightDiver

Насчет того что тестировать или писать юнит тесты под аддоны wow-а. Вот набросал интерактивный тест для «knb.lua», в консоли вводишь сообщение и оно отправляется в «knb.lua», а затем уже результат выполнения пишется в консоль. Так можно легко тестировать скрипты на синтаксические или логические ошибки, особенно если прикрутить GUI для этого.

function SendChatMessage(msg ,chatType ,language ,channel)
    print(string.format("Chat [%s]: \"%s\"", chatType, msg))
end

listSniffers = {}

Sniffer = {}

function Sniffer:new (o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

function Sniffer:RegisterEvent(event)
    self.event = event
end

function Sniffer:SetScript(onEvent, func)
    self.onEvent = onEvent
    self.func = func
end

function CreateFrame(name)
    local sniffer = Sniffer:new()
    listSniffers[#listSniffers + 1] = sniffer
    return sniffer
end

local GC_Sniffer = CreateFrame("Frame")
GC_Sniffer:RegisterEvent("CHAT_MSG_GUILD")
GC_Sniffer:SetScript("OnEvent", function (self, event, message, sender)
    SendChatMessage(message, "PONG", nil, 1)
end
)

dofile("knb.lua")

while (1) do
    io.write("Send message to GUILD chat: ")
    local message = io.read()
    local nickname = "Admin"
    for i, v in ipairs(listSniffers) do
        if v ~= nil then
            if v.event == "CHAT_MSG_GUILD" and v.onEvent == "OnEvent" and type(v.func) == "function" then
                v.func(nil, nil, message, nickname)
            end
        end
    end
end
V1KT0P ★★
()
Ответ на: комментарий от pihter

Гит рулит. Я ничего важного не потерял - так, тесты с картой, инвентарем за последние часов шесть. Глупости всякие чисто для проверки. Все что было сделано для реального - сохранено. Если бы я не пользовался гитом, сейчас пропало бы все, что я делал за посдение недели. А меня еще несколько суток уговаривали попробовать гит и начать им пользоваться. А я долго не хотел.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Virtuos86

то ничего не поделаешь

Да вы прикалываетесь: кластеры, в которых файлы хранились на дисках физически не стираются при удалении файлов (если не предпринимать специальных мер), а просто помечаются как свободные и будут перезаписаны только при записи файлов поверх

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

pihter ★★★★★
()
Ответ на: комментарий от LightDiver

ну а на второй комп ты эти изменения отправляешь? а что если бы и папку гит удалил или с хардом чего? Я строго держу свой сервак и все, на что мне не наплевать – коммичу и пушу на удаленный на случай сбоя техники

pihter ★★★★★
()