All streams
Search
Write a publication
Pull to refresh
68
0
Свистунов Сергей @svistunov

Технический менеджер

Send message
Здесь важно было только то, что путь начинается с /users, т.к. дальше возможны варианты:
  • /users/1
  • /users/1/visits
  • /users/zfsdfasdadsdf

Это всё уже внутри handleGetUser()
handleGetUser
void Connection::handlerGetUser() {
    char *endptr;
    auto id = strtol(path.Data + 7, &endptr, 10);

    if (endptr[0] != 0 && endptr[0] != '/') {
        WriteNotFound();
        return;
    }

    if (id >= USERS_CNT || db.users[id].Fields == 0) {
        WriteNotFound();
        return;
    }

    if (endptr[0] == 0) {
        db.users[id].MarshalJSON(outBuf);
        WriteResponse();
        return;
    }

    if (strncmp(endptr, "/visits", 7) != 0) {
        WriteNotFound();
        return;
    }

    uint64_t fromDate = 0;
    uint64_t toDate = 0;
    char country[101];
    country[0] = 0;
    uint64_t toDistance = 0;

    endptr += 7;
    while (true) {
        switch (endptr[0]) {
        case '?':
        case '&':
            ++endptr;
            break;
        }

        if (endptr[0] == 0) {
            break;
        } else if (strncmp(endptr, "fromDate=", 9) == 0) {
            fromDate = strtol(endptr + 9, &endptr, 10);
        } else if (strncmp(endptr, "toDate=", 7) == 0) {
            toDate = strtol(endptr + 7, &endptr, 10);
        } else if (strncmp(endptr, "country=", 8) == 0) {
            endptr += 8;
            auto pos = strchr(endptr, '&');
            if (pos != NULL) {
                pos[0] = 0;
                percent_decode(country, endptr);
                pos[0] = '&';
                endptr = pos;
            } else {
                percent_decode(country, endptr);
                break;
            }
        } else if (strncmp(endptr, "toDistance=", 11) == 0) {
            toDistance = strtol(endptr + 11, &endptr, 10);
        } else {
            WriteBadRequest();
            return;
        }
    }

    outBuf.Append("{\"visits\":[");
    auto first = true;

    for (auto it = db.users[id].visits->cbegin();
            it != db.users[id].visits->cend(); ++it) {
        if ((fromDate == 0 || db.visits[*it].VisitedAt > fromDate)
                && (country[0] == 0
                        || strcmp(db.locations[db.visits[*it].Location].Country,
                                country) == 0)
                && (toDistance == 0
                        || toDistance
                                > db.locations[db.visits[*it].Location].Distance)) {

            if (toDate != 0 && db.visits[*it].VisitedAt > toDate) {
                break;
            }

            if (!first) {
                outBuf.Append(",{\"mark\":");
            } else {
                first = false;
                outBuf.Append("{\"mark\":");
            }

            outBuf.AddLen(
                    hl_write_string(uint64_t(db.visits[*it].Mark), outBuf.End));

            outBuf.Append(",\"visited_at\":");
            outBuf.AddLen(
                    hl_write_string(db.visits[*it].VisitedAt, outBuf.End));

            outBuf.Append(",\"place\":\"");
            outBuf.Append(db.locations[db.visits[*it].Location].Place);
            outBuf.Append("\"}");
        }
    }

    outBuf.Append("]}");

    WriteResponse();
}

Его вообще нет на github'е.

Насколько я знаю — нет, даже, если бы они были, то accept потокобезопасный. Он сработал бы только в 1 потоке, в остальных был бы EAGAIN.
В grpc-gateway есть фатальный недостаток — он очень медленный. Цепочка выглядит: Umarshal JSON -> Marshal protobuf -> Call gRPC -> Marshal protobuf on server -> Unmarshal protobuf on gateway -> Marshal JSON.
В Go на стороне сервиса довольно легко написать HTTP handler, который будет делать Unmarshal JSON'а напрямую в gRPC Request структуры (уже есть теги json) и вызывать реализацию gRPC метода.
Почему-то напомнило "Хакер в столовой"
День 200-ый

Посетители столовой с ужасом находят, что, чтобы насыпать соли, они должны подойти к официанту, предьявить паспорт, получить специальный 8-значный одноразовый код к солонке. Для получения перца процедуру следует повторить.
Вызов функции через cgo с ненулевой вероятностью создаст новый полноценный thread операционной системы, что убьёт всю лёгкость горутин.
CPP-4141 Make CLion available as IntelliJ plugin
anastasiak2512, есть какие-нибудь планы по этой задаче?
В Linux можно выделять зажав клавиши Win+Alt, в Windows, если не ошибаюсь, просто с Alt
Была «Золотая лихорадка», наступает «Астероидная» :)
На новые винты надо будет ещё и ОСь налить.
Их платит работодатель, из з/п удерживаются 13% НДФЛ.
Не забывайте, что «там» налоги ~50%. Так что получается 100 000$ * 0.5 * 30 / 12 = 125 000р/мес, что не сильно отличается.
MySQL (по крайней мере, 4.x и 5.x) хранит столбцы типа DATETIME в виде строки «YYYY-MM-DD HH:MM:SS».

Не совсем так, строка упакована 8 байт:
DATETIME: Eight bytes:
    A four-byte integer packed as YYYY×10000 + MM×100 + DD
    A four-byte integer packed as HH×10000 + MM×100 + SS
На картинке вижу выпуклое, а при вращении на видео — вогнутое :)
Ответ в последнем предложении перед скриншотами :)
Проект называется «Экранная заставка Яндекс.Фотки для Gnome». Есть сборки только для Linux. Видимо из-за этого автор так написал. Не надо придираться к словам.
Этот проект разрабатывается в свободное время, которого, к сожалению, сейчас нет.
В планах есть вынос настроек в отдельный конфиг, чтобы каждый смог под себя настроить цвет фона, скорость смены картинок,…
На новогодних праздниках постараюсь сделать новый релиз и выложить исходники.
Он xscreensaver совместим, но тестировался только под Gnome.

Information

Rating
Does not participate
Location
Lisboa, Португалия
Date of birth
Registered
Activity

Specialization

Chief Technology Officer (CTO)
Lead