DelphiRobustServer. Autocollection of API. WindowsService or Desktop modes.

Added new features

Autocollection of API. Collects methods and its params and can be used as a draft. Works through Delphi RTTI methods.

Result looks like Continue reading

Posted in Delphi | Leave a comment

Delphi.Rtti.Overloaded methods

That is known that overloaded methods works not so well in Rtti Delphi by default. To fix this RRUZ created this method

So, you can use them like

 

Posted in Delphi | Leave a comment

Algos.Hackerrank.Birthday Cake Candles

You are in charge of the cake for your niece’s birthday and have decided the cake will have one candle for each year of her total age. When she blows out the candles, she’ll only be able to blow out the tallest ones. Your task is to find out how many candles she can successfully blow out.

For example, if your niece is turning  years old, and the cake will have  candles of height , she will be able to blow out  candles successfully, since the tallest candles are of height  and there are  such candles.

Function Description

Complete the function birthdayCakeCandles in the editor below. It must return an integer representing the number of candles she can blow out.

birthdayCakeCandles has the following parameter(s):

  • ar: an array of integers representing candle heights

Continue reading

Posted in C# | Leave a comment

Algos.Hackerrank.Mini – Max Summ

Given five positive integers, find the minimum and maximum values that can be calculated by summing exactly four of the five integers. Then print the respective minimum and maximum values as a single line of two space-separated long integers.

For example, . Our minimum sum is  and our maximum sum is . We would print

Function Description

Complete the miniMaxSum function in the editor below. It should print two space-separated integers on one line: the minimum sum and the maximum sum of  of  elements.

miniMaxSum has the following parameter(s):

  • arr: an array of  integers

Input Format

A single line of five space-separated integers.

Constraints

Output Format

Print two space-separated long integers denoting the respective minimum and maximum values that can be calculated by summing exactly four of the five integers. (The output can be greater than a 32 bit integer.)

Sample Input

Sample Output

Explanation

Our initial numbers are , and . We can calculate the following sums using four of the five integers:

  1. If we sum everything except , our sum is .
  2. If we sum everything except , our sum is .
  3. If we sum everything except , our sum is .
  4. If we sum everything except , our sum is .
  5. If we sum everything except , our sum is .

Hints: Beware of integer overflow! Use 64-bit Integer.

MyDecision

Complexity O(n)

Posted in C# | Leave a comment

Delphi.RobustServer.Упрощаем routing запросов. Базовый класс TRP

Дописал базовый класс TRP, от которого можно наследовать всю бизнес логику. Теперь можно обращаться, скажем по адресу Users/Create, сервер найдет класс TRPUsers и попытается найти у него метод Create. Реализация TRP включает в себя RTTI механизм. Чуть позже есть идея добавить атрибуты [HttpGet], [HttpPost] которые можно будет добавлять над методами.

Сам базовый класс выглядит так Continue reading

Posted in Delphi | Leave a comment

Delphi.RobustServer.Обработка POST запросов для основных MIME

Доработал обработку POST запросов для следующих MIME типов

  • application/json
  • application/x-www-form-urlencoded
  • multipart/form-data

Теперь сервер умеет работать с json, принимать файлы, пока ещё не оч. большие (poststream блоками читается в строку = оперативную память), поэтому по-хорошему, размер файлов надо ограничить, ну и одновременную закачку файлов тоже, чтобы не подвесить память. Конечно же, стандартный form-url-encoded поддерживается, хотя если в multipart не указывать файл, просто параметры тоже прочитаются с декодированием из urlEncoded

Ну и в качестве бонуса научил сервер отправлять письма. Управлением памятью теперь почти везде занимается класс ISP<>, который находится в модуле  uCommon.

Модуль декодирования POST запроса похудел и выглядит следующим образом Continue reading

Posted in Delphi | Leave a comment

Delphi.RobustServer. Логгер на GUI

Добавил логгер на GUI

Механизм такой – при добавлении сообщения в лог, автоматически обновляется GUI. Сообщения идут в обратном порядке. Ключевым моментом является функция WaitAndCreateLogFileStream класса TLDSLogger. Сначала сообщения пишутся в файл, затем из файла в GUI. Всей многопоточной логикой заведует класс TLDSLogger.

Continue reading

Posted in Delphi | Leave a comment

Delphi.RobustServer.Открытие соединения с БД.Простой случай.

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

Но это в случае, если у нас не 20 000 запросов в секунду, которые открывают соединение, в этом случае, наш сервер захлебнется, потому что не будет успевать это обрабатывать, соединения будут открываться быстрее, чем закрываться, и это будет расти как снежный ком, до того момента, пока  MySQL, например, не скажет, “у вас слишком много соединений, бай бай”.

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

На более конкретном примере это выглядело так. 20 000 потоков в сек. опрашивали сервер – а нет ли чего нового для меня в буфере? Дожидаясь своей очереди, они забирали информацию и изменяли буфер, удаляя унесенные данные и передавали квант следующему потоку.

Реализуем пока самый простой случай. Когда нагрузка у нас по данному запросу небольшая. А высоконагруженный вариант сделаем чуть позже.  Сделаем же нашу реадизацию красиво, то есть так… Continue reading

Posted in Delphi | Leave a comment

Delphi.RobustServer. Загрузка файлов на сервер

Сделал простую загрузку файлов на сервер, с возможностью создания уникального имени, если такое имя уже будет в директории сервера. Сама директория будет строиться как files/year/month/day

Результат кода выглядит так

Сам запрос идет через multipart следующим образом… Continue reading

Posted in Delphi | Leave a comment

Delphi.RobustServer. Совершенствуем CommandGet и тестовый класс TRPUsers

Немного отрефакторил код OnCommandGet, получилось так, довольно коротко…

Обработка запросов происходит в методах Process…, например ProcessUsers выглядит так Continue reading

Posted in Delphi | Leave a comment