Delphi

How To Build a Digit Classifier In Tensorflow

procedure TForm1.Button2Click(Sender: TObject); var   i, X, Y: DWORD;     fLibrary: HMODULE;   fModel: Pointer;   fInterpreterOptions: Pointer;   fInterpreter: Pointer;   fStatus: TfLiteStatus;   fInputTensorCount, fOutputTensorCount, fNumDims: Int32;   fInputTensor, fOutputTensor: Pointer;   fInputDims: Integer;   fTensorName: PAnsiChar;   fTensorType: TfLiteType;   fTensorByteSize: SIZE_T;     // 28×28 pixel image as input   fInput: array [0 .. 28 * 28 – 1] of Float32;     // output 0 to 9   fOutput: array [0 .. 10 – 1] of Float32;     fValue: Extended; begin   fLibrary := LoadLibrary(LibraryName);     if fLibrary = 0 then   begin     ShowMessage(‘Error: Load tensorflow lite library ‘ + LibraryName + ‘ – ‘ +       SysErrorMessage(GetLastError));     Exit;   end;     try     fModel := TfLiteModelCreateFromFile(PAnsiChar(AnsiString(Edit1.Text)));       if fModel = nil then     begin       ShowMessage(‘Error: Create model from file – ‘ +         SysErrorMessage(GetLastError));       Exit;     end;       fInterpreterOptions := TfLiteInterpreterOptionsCreate;       if fInterpreterOptions > nil then     begin       TfLiteInterpreterOptionsSetNumThreads(fInterpreterOptions, 2);         fInterpreter := TfLiteInterpreterCreate(fModel, fInterpreterOptions);         // parameters / model can be removed immediately after the interpreter is created       TfLiteInterpreterOptionsDelete(fInterpreterOptions);       TfLiteModelDelete(fModel);         if fInterpreter > nil then       begin         fStatus := TfLiteInterpreterAllocateTensors(fInterpreter);           fInputTensorCount := TfLiteInterpreterGetInputTensorCount(fInterpreter);         fOutputTensorCount := TfLiteInterpreterGetOutputTensorCount           (fInterpreter);           // fLiteTensor* TfLiteInterpreterGetInputTensor(const TfLiteInterpreter* interpreter, int32_t input_index);         // returned structure TfLiteTensor         // an example is simple, there is no need to translate everything from the         // in general, the source of the: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/c         { typedef struct TfLiteTensor {           TfLiteType type;           TfLitePtrUnion data;           TfLiteIntArray* dims;           TfLiteQuantizationParams params;           TfLiteAllocationType allocation_type;           size_t bytes;           const void* allocation;           const char* name;           struct TfLiteDelegate* delegate;           TfLiteBufferHandle buffer_handle;           bool data_is_stale;           bool is_variable;           TfLiteQuantization quantization;           TfLiteSparsity* sparsity;           const TfLiteIntArray* dims_signature; }         fInputTensor := TfLiteInterpreterGetInputTensor(fInterpreter, 0);         fOutputTensor := TfLiteInterpreterGetOutputTensor(fInterpreter, 0);           if fInputTensor > nil then         begin           // info about tensor           // fNumDims := TfLiteTensorNumDims(fInputTensor);           // fTensorName := TfLiteTensorName(fInputTensor);           // fTensorType := TfLiteTensorType(fInputTensor);           fTensorByteSize := TfLiteTensorByteSize(fInputTensor);             // writing pixels to fInput, top to bottom, left to right           for Y := 0 to Image1.Picture.Bitmap.Height – 1 do           begin             for X := 0 to Image1.Picture.Bitmap.Width – 1 do             begin               if (Image1.Canvas.Pixels[X, Y] > 0) then                 fInput[X + (Y * Image1.Picture.Bitmap.Width)] := 1               else                 fInput[X + (Y * Image1.Picture.Bitmap.Width)] := 0;             end;           end;             // fTensorByteSize = Length(fInput) * SizeOf(Float32)           fStatus := TfLiteTensorCopyFromBuffer(fInputTensor, @fInput,             fTensorByteSize);             fStatus := TfLiteInterpreterInvoke(fInterpreter);             if fStatus = kTfLiteOk then           begin             for i := 0 to High(fOutput) do               fOutput[i] := 0;               fOutputTensor := TfLiteInterpreterGetOutputTensor(fInterpreter, 0);               // info about tensor             // fNumDims := TfLiteTensorNumDims(fOutputTensor);             // fTensorName := TfLiteTensorName(fOutputTensor);             // fTensorType := TfLiteTensorType(fOutputTensor);             fTensorByteSize := TfLiteTensorByteSize(fOutputTensor);               if fOutputTensor > nil then             begin               // fTensorByteSize = Length(fOutput) * SizeOf(Float32)               fStatus := TfLiteTensorCopyToBuffer(fOutputTensor, @fOutput,                 fTensorByteSize);                 if fStatus = kTfLiteOk then               begin                 ListView1.Items.Clear;                   for i := 0 to Length(fOutput) – 1 do                 begin                   // ingenious solution, coolest conversion                   fValue := StrToFloat(Copy(FloatToStr(fOutput[i]), 1, 17));                     if fValue = 1 then                   begin                     with ListView1.Items.Add do                     begin                       Caption := FloatToStrF(fValue, ffNumber, 17, 17);                       SubItems.Add(IntToStr(i));                     end;                   end;                 end;                   ListView1.AlphaSort;                   Beep;               end;             end;           end;         end;       end;     end;   finally     FreeLibrary(fLibrary);   end; end;

Read More

Everything You Need To Know About Blockchain

Blockchain is a term utilized to represent distributed ledger technology. Blockchain is used to build a storage system for data in a distributed and immutable mode. So there are key features we need to mention. Immutability – this means that once data is written to a blockchain data storage or ledger, it cannot be changed – so it’s there forever. For instance, in a relational database, no matter how much security you have, the data can be accessed and modified on the system. A blockchain system guarantees that if one bit of data is altered it says it is in an invalid state, and since the data is distributed on various systems, the verified data with a justified state can be retrieved. Distribution – is the key to trust. As long as the data you see is in the blockchain and it’s in a valid state you can trust the data to be accurate. This trust is the key and this trust is achieved in a blockchain system by replicating the datastore on several hosts on the internet. For instance, as long as the peers accept that bit of data is valid, so you can completely trust that data that is stored on that system. In Blockchain the trust is requisite. Immutability – Trust Distribution – valid/invalid For many industries trust is a problem. The automobile industry is one of those where trust, or lack of it, causes problems. People order used cars from other countries which do not easily share tracking information and this can mean that faking data about the car’s prevenance and history is easier. For instance, odometer fraud is one of the problems that you can seriously impact the value of a vehicle. Representing a vehicle as having been used 5,000 miles instead of 50,000 miles can mean a huge difference in perceived value and potential usable life span of the car or truck. In many countries car service records are largely kept on paper which can of course very easy to be fake.  So, let’s imagine that pushing all service providers to a blockchain and all the readings kept on the blockchain. The integrity and immutability of the blockchain data means that a modification of the records would be detectable. Moreover, agencies such as insurance companies can also contribute by appending accident details of a car giving a much more complete picture of the vehicle’s history in a way which is very difficult or even impossible for dishonest vendors to fake. Transferring money from one country to another takes your time and can be expensive because of the need to comply with multiple different regulations and policies, but eventually, another person receives the money. Your bank updates its records and sends them to the main clearing bank in your country where they are passed through a number of systems where it analyzes them to prevent money laundering and to comply with various trade embargoes. Assuming your transaction passes the checks, the funds are then sent them to another country’s clearing bank. They again update the record and send it to the receiver’s bank account. Even in these highly automated times, it can take several days for the money to arrive in the destination account. This is where Bitcoin can offer an alternative to the traditional brocks and […]

Read More

RADoween: Full-Stack Web App Development with Delphi and TMS

Up and running from concept to launch in just five days On October 14, Atanas emailed Bruno with an idea for a TMS WEB Core-powered web app to run our internal partner Halloween costume contest. The goal was for a simple web page where team members could submit pictures of their Halloween costumes, and then everyone could vote on their favorites. Oh, and we needed it ASAP so we would have time to use it. The idea is simple, but as any experienced programmer can tell you, there are a lot of technical questions and requirements to satisfy: Can you take pictures from the web app or just upload them? Setting up the back end to store the data Communication from the front end to the back end Preventing spam votes An administrative interface for everything Especially in web development, it is common to divide developers into two categories: front-end and back-end. The reason for this is that, most often, two completely different programming languages are required. The front end runs on JavaScript (with WebAssembly still gathering momentum), while the back end runs on various languages: PHP, C#, Java, Python, Perl, etc. The running joke in software development is that the front end looks impressive, but the back end is scary. From a conceptual point of view, a front-end developer builds the part the user sees, making UI and design esthetics important. In contrast, the back-end developer-only creates the part that other developers see. Ideally, both parts are well designed, but now I’m off in the weeds and forgot the purpose of this blog post. When you take all the software and tools used to build an application, that is referred to as the stack. The most common web stack is LAMP, an acronym that initially stood for Linux, Apache, MySQL, PHP, but this is incomplete as it assumes JavaScript is the only solution for the in-browser. One of the reasons Node.js was so popular is that it allowed developers to use JavaScript on the back end as well as the front-end. This made the concept of a full-stack more popular: No longer would two different skill sets and programming languages be needed: Everyone can just use JavaScript everywhere! Well, JavaScript isn’t the only full-stack programming language. In my mind, Delphi conceptualized full-stack development with its client-server architectures. Instead of using PHP or Java (both released the same year as Delphi) for the back end, and then something else for the front end, Delphi did everything in the same IDE with the same programming language. In 1995 most web applications were just static HTML (Cascading Style Sheets didn’t even appear until 1996, and they took a while to catch on). And while JavaScript was born in 1995 along with Delphi, PHP, Java, and many other modern programming languages, it still hadn’t seen widespread adoption. Today, most web pages make heavy use of JavaScript. Sometimes there is more JavaScript code than the rest of the HTML, CSS, and images combined. Okay, that was an interesting dive into stacks, front ends, back ends, and the history of web development, but what does all of that have to do with Halloween? Glad you asked—Delphi is still a fabulously productive full-stack development tool for web application development thanks to the power of TMS WEB Core front-end and TMS XData back end, and […]

Read More

What Is It Like To Be A Developer Serge Pilko?

Hello. This article is part of a series where we speak with professional software developers, ask them what it’s like to write code for a living, and perhaps gain a few insights into the software development industry along the way. Today we have a very popular member of the Delphi and RAD Studio developer community, Serge Pilko. Serge and I have collaborated behind the scenes on a few things in the last couple of years for Embarcadero and he’s one of those truly positive people who just oozes developer talent. Serge is CEO of Embarcadero Tech Partner, Softacom, a company based in Minsk, Belarus with customers from all around the world including the United States, Denmark, Belgium, Germany, Netherlands and more than 15 others. Hi, Serge. We’ve been crossed paths as developers for several years but I think this is the first time you’ve given an interview for Embarcadero. Could you tell us a bit about yourself and your professional journey from a Delphi developer to CEO of a Delphi software development company? Hi Ian, thank you for inviting me for this interview. My name is Serge Pilko and I am the CEO of Softacom, a Delphi software development company. Remembering my youth I wouldn’t say that I fell in love with technologies. In high school,  when we were studying C ++ and Visual Basic, I hated them. I had scores from 2 to 3 in the programming. So the choice of a software developer career was made under the influence of my parents. At the university, I got quite excited with programming because I was lucky to have a great teacher comparing to high school where I was unlucky 😁. At the university I started studying Delphi 3 (at that time it was the latest Delphi version) and decided to explore it deeper. Looking ahead I should mention that later this interest in Delphi has guided me to becoming a Delphi Evangelist and the first Embarcadero MVP in Belarus. But let’s come back to the chronology of the events. During and after my graduation, I worked as a developer for around 10 years and in 2008 I decided to start a new chapter of my career. I created my own company Softacom that today unites the best Delphi experts in Belarus. Though we offer a wide range of software development services, we focus on the modernization and migration of legacy software and work with local and foreign companies of different sizes. Today, our company is an official consulting and training partner of Embarcadero and acts as a certified consulting partner of TMS Software. The Softacom Website Do you remember your first projects that inspired you to follow a career in development? I think that those short projects I had during the first 2-3 years at the university did the job. They made me think that I got excited experimenting with some student databases, text editors and, of course, a calculator. I think that every Delphi developer started with a calculator. That was in the late 90ss. It was really inspired to create a GUI app easily, when instead of a console app you can have an amazing app with a rich user interface. Btw, I have a funny story about that. We (students) were young and had an inquisitive […]

Read More

All You Need To Know About Using Low Code REST

REST is a type of software architecture that was designed to ensure interoperability between different Internet computer systems. Basically the idea is that services that comply with REST architecture can more easily communicate with one another. REST stands for representational state transfer and it was proposed by computer scientist Roy Fielding’s 2000 PhD thesis, Architectural Styles and the Design of Network-based Software Architectures, in which he introduced and described REST. What is REST and why should I learn more about it? The goal of REST is to increase performance, scalability, simplicity, modifiability, visibility, portability, and reliability. This is achieved through following REST principles such as a client–server architecture, statelessness, cacheability, use of a layered system, support for code on demand, and using a uniform interface. You can have access to the complete original Roy Fielding’s 2000 PhD thesis here: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm Who is Roy Fielding? Dr. Fielding was deeply involved in the web’s early development and standardization, he began working at and for the World Wide Web Consortium in 1994 and co-authored the HTTP 1.0 specification. Later he was the main author behind the HTTP 1.1 and URI specs also co-founded the Apache web server project. The name “Representational State Transfer” is intended to evoke an image of how a well-designed Web application behaves: a network of web pages (a virtual state-machine), where the user progresses through the application by selecting links (state transitions), resulting in the next page (representing the next state of the application) being transferred to the user and rendered for their use. Fielding’s approach was to make sure that the REST architectural style emphasises the scalability of interactions between components, uniform interfaces, independent deployment of components, and the creation of a layered architecture to facilitate caching components to reduce user-perceived latency, enforce security, and encapsulate legacy systems. Are there rules on how to implement REST? REST does not enforce any rule regarding how it should be implemented at lower level, it just put high level design guidelines and leaves you to think of your own implementation. What we do have is the definition of 6 architectural constraints which make any web service – a true RESTful API. Client–server: By separating the user interface concerns from the data storage concerns, we improve the portability of the user interface across multiple platforms and improve scalability by simplifying the server components. Stateless: Each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client. Cacheable: Cache constraints require that the data within a response to a request be implicitly or explicitly labeled as cacheable or non-cacheable. If a response is cacheable, then a client cache is given the right to reuse that response data for later, equivalent requests. Uniform interface: By applying the software engineering principle of generality to the component interface, the overall system architecture is simplified and the visibility of interactions is improved. In order to obtain a uniform interface, multiple architectural constraints are needed to guide the behavior of components. REST is defined by four interface constraints: identification of resources; manipulation of resources through representations; self-descriptive messages; and, hypermedia as the engine of application state. Layered system: The layered system style allows […]

Read More

Gain A Python Performance Revolution With Delphi

According to TIOBE Python has overtaken Java and is most likely to overtake C in the near future. Python is the most searched language according to PYPL Index. There are some advantages to using Python for this popularity. Here are some advantages: Python is easy to read, learn and write. Improved productivity due to its simplicity. Effectively executes the code sequentially line by line which can make it easier to debug than event-driven code. Automatically assigns the data type during execution. Free and Open-Source. Huge standard library of read-made functions and features. Code once and run on many platforms. Why is the source code of a typical Python program so short? This brevity comes about because Python has a huge standard library allowing many activities and functionality to be expressed with smaller and more succinct program statements compared to many other languages. There is a test in Github to prove this code-brevity hypothesis. It is called Raytracer benchmarks and it’s based on examples from Typescript. Python got second place with just 275 lines of code. You can check that here. https://github.com/edin/raytracer How can I run Python scripts in Delphi? It’s great if we can take the advantage of Python’s advantages in our Delphi application, combing the best of both worlds. Let’s see how we can run a Python script inside a Delphi application. The easiest way to do that is by using Python for Delphi (P4D). Python for Delphi (P4D) is an open-source project by pyscripter. You can find the source code of Python for Delphi (P4D) from this link. https://github.com/pyscripter/python4delphi You can clone the source and install components by using the packages in the packages folder. Then add the source path to the library and you are ready to go. Are there any demo applications of using Python in Delphi programs? There are many Demo applications you can run out of the box. There are two components we use often. TPythonEngine: We use this component to execute Python scripts. TPythonGUIInputOutput: We use this component to get output to a UI component (Eg: TMemo). By using those components, we can execute a Python script and get the result with just a single line of code. procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; procedure TForm1.Button1Click(Sender: TObject); begin    PythonEngine1.ExecStrings( Memo1.Lines ); end; You can run the Demo projects and get results from a Python script at runtime. Did you know you can run Python programs with Delphi? These two languages combined together make a remarkably comprehensive solution to almost any software problem you can imagine. Why not download a free trial of RAD Studio Delphi and try out the power of Delphi and Python combined today?

Read More

Get To Know This Industry-Leading Mobile Lighting Delphi App

MyInterface is the deceptively simple yet powerful client application for the industry-leading LightFactory system from New Zealand developer Dream Solutions Limited. The MyInterface app, which is written using the excellent cross-platform features of the RAD Studio Delphi Firemonkey FMX framework, runs on iOS and Android devices. Dream Solutions say, “This app connects to LightFactory or NEO systems and displays the interfaces build using the Mobile Interface Builder. When started the app will show a list of available interfaces that are being served by the system. Using this tool, you can click and drag buttons, sliders, images, text and switches onto a custom mobile form. You can save as many layouts as you want that are then served to the mobile device from LightFactory. Open the MyInterface app on your iOS or Android device and a list of available layouts is shown. When selected the layout you created will show and can be used to control your LightFactory system.” The Lightfactory Website Dream Solutions have a number of other apps in the Android Play and Apple App Stores. We’ve written about one or two of them before here: https://blogs.embarcadero.com/lframote-a-gorgeous-light-remote-android-mobile-app-integration/ Thanks to Dream Solutions for choosing the power of RAD Studio to make their solutions available. App Website MyInterface Apple Store MyInterface Google Play MyInterface Screenshot Gallery

Read More

The Inexorable Rise Of The Supercharged Developer

Over time, software development has experienced a major drift not just in implementation, but in terms of the mindset as well. Back in the day, the engineering teams had clear, specific, and defined roles. The individuals in the team were expected to perform their part of the duty with minimalistic involvement and participation in other fields. Now that we are living in an agile world, the engineering mindset has been revamped and every individual is regarded as a full-stack package and should have the knowledge and expertise to execute the end-to-end cycle of software development. In this article, we’ll look at some of the key points of focus for software developers as an all-in-one package, especially when it comes to desktop and native application development. How can I make a full-fledged application using third-party APIs? Nowadays, when we talk of disruption and breakthrough technologies, it is highly dependent on time investment. Disruption in technology comes with effective use and management of time. Therefore, it is useless to recreate the wheel and engineer things from scratch that are already available in the form of open-source projects, SDKs, toolkits, packages, and libraries. When it comes to desktop or native ecosystems, we know that desktop apps are powerful execution tools that can natively run on your local machine to provide holistic application navigation and utilization experiences. With the advancement of modern web technologies, the desktop application development paradigm also experienced a major drift in terms of implementation. Technologies such as JavaScript and Python have inspired the hybrid implementation of desktop apps. Delphi is by far one of the most popular choices for native desktop application development. To develop a full-fledged application, you can easily integrate third-party APIs in your Delphi code and create exciting desktop applications as an all-in-one developer. For instance, you need to create an application that involves some modules related to maps. For this problem statement, you already have Google Maps APIs readily available. You can simply utilize these ready-to-use Google Maps APIs and map them according to your use case. Similarly, there are tons of other APIs, libraries, and SDKs for different use cases that you can use and integrate without starting the development process of these modules from scratch. Leveraging APIs such as those from API Layer among others is the smart way to use other people’s hard work to inject that kind of capable broad-strength modernity into your apps. Supercharged developers employ smart techniques to reach their targets – and there’s nothing smarter than standing on the shoulders of giants who have already done the hard work for you. What is an easy way to develop an end-to-end artificial intelligence-based application? Undoubtedly, artificial intelligence is at a boom right now and there’s every sign that this is a trend which is very much here to stay. There are tons of applications and use cases where AI has proved beneficial. From the technology and development perspective as well, researchers and engineers are actively working on producing dynamic and scalable frameworks that facilitate the development of AI applications. As the AI offerings improve and new techniques are refined many of the things we previously only thought possible in science fiction or would require vast computing resources are becoming available to regular developers at extremely affordable pricing plans and with easy […]

Read More

Do You Know The German Word For “Sauerkraut”?

You know, the hardest part about learning a new language is remembering some of the more esoteric words and phrases. Does that error message say “syntax error” or “successful compilation”? Does that button really say “end” in Danish or has there been some kind of horrible misunderstanding? How do I exit VIM? Just kidding – nobody knows that. But seriously, it’s not just the rote learning of words which are direct equivalents of your own first language, it’s also about noting down phrases which mean something entirely different in the one you are trying to master. My own favorite is the French phrase “il s’offre des fleurs“, literally, “he gives himself flowers” but it actually is used to mean that a particularly vain man thinks a little too highly of himself. Audio notebook to the rescue! This offline Audio Notebook helps you learn a new foreign language. According to the developer, “The own individual vocabulary (words, phrases, idioms) for learning a foreign language is entered from you in your native language (left) and in the foreign language (right). In addition, an audio note (for example, the debate in the foreign language) be included. Thus you can specifically customize the learning to your own needs the new language. Listen to the audio recording on the bus or on the train and thus strengthening your sense of language and your vocabulary. The lyrics and the audio example: you can at any time and thus adapt easily. The detained words, phrases or expressions can be corrected and completed. You can also add or remove new superfluous. For learning a language you put just a new language (language folder) and you add your own lessons. The foreign-language expression can be shown or hidden. This facilitates learning. If you are looking for something, then use the full-text search, so you can browse through all lessons and display the desired text and then edit them as necessary.” Oh, and Sauerkraut? It’s a Chinese invention…. but the word is totally German. Google Play Sprachen Lernen-AudioNotizbuch Screenshot Gallery RAD Studio Delphi can help you turn your great ideas into reality. Why not download a free trial copy today and see what it can do for you?

Read More

Everything You Need To Modernize With RAD Server

In the modern age isn’t it true to say we are completely surrounded and immersed in technology of diverse forms? Much of it now is entirely cloud-based but there’s still a substantial proportion which employs a mix of both cloud and more physical hardware computing resources. However, the common thread amongst all of these technologies, even the most recent ones, is the certainty of them becoming obsolete. After all, even though all technologies evolve rapidly, they are eventually replaced by something which is either an evolutionary step thanks to advances in technological offerings or because new and more potent ways of providing a service or solving a problem emerge. To save a technology or application from fading into oblivion, its makers consistently upgrade it with new features and prepare it in anticipation of future trends and ways of doing things. As simple as this may seem, such a task can become arduous, especially if the application is complex and has a wider codebase. Additionally, many of the libraries and frameworks on which the application is built can go out of service or are superseded and need updates. To tackle the challenge of upgrading and modernizing an application, robust development studio solutions like RAD Server have powerful methods that streamline the process. Such methods help you gain a sense of the kind of changes you will have to implement. Additionally, they also guide you through the modernization tasks themselves. This article dives into what the modernization journey with RAD Server looks like and why can be essential for applications in the first place. Why Would You Need To Modernize Your Applications? The field of software development has a radically different landscape today to that of even five years ago. Applications now use their hardware resources much more efficiently thanks to advances in operating system abstraction and support. The wide range of programming languages enables you to create applications which perform complex tasks better than before and with optimizations in the code creation process thanks to a maturing of the development industry’s tooling providers and the supporting component eco-system. If your application is to survive in such a landscape, it will have to modernize and offer more than before. When it comes to web applications, advancements in what we have come to expect from a web browser and the rendering scaffolding which supports that have come by making them much more dynamic and robust. Developers can now create web applications at remarkable development velocity and, when done right, the same codebase can work on all kinds of devices thanks to the invention of techniques like adaptive rendering of user interfaces and virtualization of hardware differences to provide a generic API or set of properties and methods which address the lowest common denominator of hardware sensors and functionality . Modularity has also been achieved through microservices, and operations have become as serverless as feasible. The question of security and scalability has also become an integral part of the conversation around application development. With a rise in cybersecurity concerns, applications need to be secure throughout and use the best practices. Additionally, the applications also need to be scalable to accommodate a wider user base and deployment when necessary. Without these abilities, your application can lose its competitive edge and be eventually forgotten. What Is […]

Read More