Noutați

An SA story about hyperscaling GitLab Runner workloads using Kubernetes

The following fictional story1 reflects a repeating pattern that Solutions Architects at GitLab encounter frequently. In the analysis of this story we intend to demonstrate three things: (a) Why one should be thoughtful in leveraging Kubernetes for scaling, (b) How unintended consequences of an approach to automation can create a net productivity loss for an organization (reversal of ROI) and (c) How solutions architecture perspectives can help find anti-patterns – retrospectively or when applied during a development process. A DevOps transformation story snippet Gild Investment Trust went through a DevOps transformational effort to build efficiency in their development process through automation with GitLab. Dakota, the application development director, knew that their current system handled about 80 pipelines with 600 total tasks and over 30,000 CI minutes so they knew that scaled CI was needed. Since development occurred primarily during European business hours, they were interested in reducing compute costs outside of peak work hours. Cloud compute was also a target due to acquring the pay per use model combined with elastic scaling. Ingrid was the infrastructure engineer for developer productivity who was tasked with building out the shared GitLab Runner fleet to meet the needs of the development teams. At the beginning of the project she made a successful bid to leverage Kubernetes to scale CI and CD to take advantage of the elastic scaling and high availability all with the efficiency of containers. Ingrid had recently achieved the Certified Kubernetes Administrator (CKA) certification and she was eager to put her knowledge to practical use. She did some additional reading around applications running on Kubernetes and noted the strong emphasis on minimizing the resource profile of microservices to achieve efficiency in the form of compute density. She defined runner containers with 2GB of memory and 750millicores (about three quarters of a CPU) had good results from running some test CI pipelines. She also decided to leverage the Kubernetes Cluster Autoscaler which would use the overall cluster utilization and scheduling to automatically add and remove Kubernetes worker nodes for smooth elastic scaling in response to demand. About 3 months into the proof of concept implementation, Sasha, a developer team lead, noted that many of their new job types were failing with strange error messages. The same jobs ran fine on quickly provisioned GitLab shell runners. Since the primary difference between the environments was the liberal allocation of machine resources in a shell runner, Sasha reasoned that the failures were likely due to the constrained CPU and memory resources of the Kubernetes pods. To test this hypothesis, Ingrid decided to add a new pod definition. She found it was difficult to discern which of the job types were failing due to CPU constraints, which ones due to memory constraints and which ones due to the combination of both. She knew it could be a lot of her time to discern the answer. She decided to simply define a pod that was more liberal on both CPU and memory and have it be selectable by runner tagging when more resources were needed for certain CI jobs. She created a GitLab Runner pod definition with 4GB of memory and 1750 millicores of CPU to cover the failing job types. Developers could then use these larger containers when the smaller ones failed by adding the […]

Read More

Mobile performance optimization with Adaptive Performance 4.0

Boat Attack starts off with plenty of scalers engaged by the menu scene, which was stabilized before the capture was done. In this example, the temperature rises quickly and the device goes into throttling. Adaptive Performance tries to stabilize the situation and reduce effects on the GPU, as this is clearly the bottleneck. The shadow scalers thereby reduce quality rapidly – but because that’s not enough, both the view distance and resolution decrease as well. The frame rate then stabilizes and the temperature drops. The game is rescued from throttling and its frame rate raises to 60 fps. Layer culling scaler With the layer culling scaler, you can dynamically adjust layer cull distances at runtime. This feature uses the indexer system to make certain decisions, like when and how much to increase or decrease layer cull distances for optimal performance and thermal stability. The sample we ship with Adaptive Performance loops in medium CPU load until it reaches critical frame rates and then decreases the cull distance of layers. The result of this is that the cull distance for layers changes depending on the CPU and GPU load. You can set a different value for the culling distance of each layer so that they scale proportionally. This helps you determine which objects to cull earlier to save performance. For details on how to do this, see the following code sample. Adaptive decals Adaptive decals target visual effects. In Amazing Adventures of Dr. Arm, there is a boss fight scenario that uses many particles and decal projectors. When the mobile device gets hot and throttling is imminent (or already occurring), the number of particles emitted scales down. In this case, less visually important emitters, things like the leaves blowing in the wind, tiny sparks, and other such elements, turn off completely. The scaler also reduces decal distances.

Read More

5 Easy Things To Learn Today About C++ Software

Hello Developers, C++ is one of the oldest and stronger programming language. It has many functions and methods to manipulate strings and doing string operations as fast as possible in your C++ software. These options and different string types allow you to develop low memory usage and faster applications in all sorts of situations. Today we will continue to look at some more string and wide string operations available in modern C++. We will learn to obtain string capacity and length. We will also learn how to compare strings. Iterators are another modern feature of C++ and we will learn how to use how to use then with Wide Strings. One of the important things is reading and writing text files. Also, we take a look at how to use wide strings in file I/O operations. Finally, we learn to use Form Properties of C++ Builder, Delphi and RAD Studio. Head to LearnCPlusPlus.org to learn all about how to create C++ software LearnCPlusPlus.org is packed full of great articles for professionals and beginners alike. The posts vary from articles suitable for people who are just starting to learn C++ – basics like string handling, pointers, loops, and all those fundamental building blocks of this rich and powerful programming language – to much more in-depth and advanced subjects like artificial neural networks and AI, along with the math behind it. Our focus is on the C++ language, particularly modern C++, and will work with almost any environment and IDE software you can choose although, of course, we believe RAD Studio C++ Builder is the best option! If you are new to RAD Studio, we think these posts may help you as much as a rapid introduction to programming in C++, all the way to the most robust, modern, and latest techniques for those more experienced with the language. For those who are perhaps wanting to expand their knowledge with the most up-to-date features, routines, and methodologies this is a great little boost (pun intended) to your C++ knowledge. The new RAD Studio 11, C++ Builder 11, Delphi 11 are released with great new features and we are developing and testing new examples for you with the latest RADS 11 that means.LearnCPlusPlus.org examples are working well with the latest C++ Builder. You can see more of our C++ posts on this blog by clicking the following dynamic search link: https://blogs.embarcadero.com/?s=C%2B%2B Here are today’s selections: How can we use C++ Builder in the most modern and efficient ways? These posts are designed to give you more information and to be easy to understand the modern and professional ways that we use in C++. Here are the topics, This Is How String Capacity And Lengths Work In A C++ App How To Make A Comparison Between Strings In A C++ App How To Use Wide String Iterators In Modern C++ Software The Modern Way To Read Formatted Wide Strings In A C++ App How To Use Form Properties In C++ Cross Platform Apps What kind of C++ software questions are we answering? These are the questions that we answer in this collection: How can I use the string capacity and length methods in a C++ app? What kind of methods I can use to get size of a std::string? How can I use the empty() method with strings? How to get length() of a std::string? How can I use size() property of […]

Read More

Extend TMS WEB Core with JS Libraries with Andrew: Tabulator Part 5: Editing Data in Tabulator

In our continuing Tabulator adventures, last time out we barely scraped the surface when it comes to interactions.  We had a little side adventure into tooltips, potentially applicable to many TMS WEB Core projects.  And we got quite a bit further down the path of making our example project, Actorious, more useful. Grid-type controls are a natural fit for effectively organizing and displaying all kinds of data.  But in some cases, we’ll actually want to give the user the ability to make changes to the data, either by editing it directly or by using other elements on the page.  In this article, we’re going to primarily be looking at this special subcategory of interactions and how to get the most out of Tabulator when building editing interfaces into your TMS WEB Core projects. Motivation. As we discussed at the outset of this Tabulator miniseries, the basic concept behind it and similar JavaScript grids is that they ultimately have a bit of a self-centered view of the world. Meaning that they are, in effect, the entire package of data and UI elements.  As developers, we’re basically connecting them up at a pretty high level, providing them with data and letting them do as much of the work as possible from that point on.  When it comes to editing data, this doesn’t really change. Tabulator, in particular, has many options related to editing data, which we’ll get into shortly.  The potential problem, though, is in keeping track of what it is doing in case you need to take those changes and apply them elsewhere, like in the actual data source that you’re using. From a Delphi standpoint, it might help to think of a JavaScript grid as a disconnected TClientDataSet.  You’re basically giving it a block of data.  And when it’s done, you’re getting a block of data (the changes) back.  What format that communication takes is entirely up to you, and we’ve got a few options, as usual. The mechanisms that you ultimately end up using will hopefully result in a very cohesive and highly integrated and performant product.  So let’s have a look at some of those options. Column Definitions. Again. As with so many things in Tabulator, the easiest way to get started is by adding some options to the Tabulator column definitions.  By default, columns are not editable at all, but can easily be set to be editable.  The only question is what kind of editor do you want?  Let’s start with a simple new example project, TabulatorEditor, and then work our way first through a few of the built-in editors.  Quick and easy.  The usual Project.html additions can be used to load the Tabulator library.  If you’re using the JSDelivr CDN, it also offers the ability to combine many libraries into a single request.  We’re going to end up using the latest version of Bootstrap, Luxon and FlatPickr, so why not combine them all.  Here’s what it looks like.             In our WebFormCreate procedure, we can then create a basic Tabulator setup similar to what we’ve done previously. In this case, there are just a bunch of different field data types, so we can play around with how the editors might work. The Tabulator Documentation has plenty of examples, so we’re not […]

Read More

Chart data import in Delphi

TMS FNC Chart v2.0 is a major milestone and we are already collecting feedback and thinking about new features for the next version. We listed some of the top requested features in this blog post, but if you have other exciting ideas, please let us know in the comments. The blog post also gives an overview of what v2.0 brings alongside some very interesting chart related topics! Data Import This specific blog post however, focuses on a very important aspect of application development: data import. TMS FNC Chart is designed with one thing in mind: flexibility. The main goal in the FNC architecture has always been flexibility, and in TMS FNC Chart, this is no different. TMS FNC Chart is capable of importing JSON, CSV & custom data arrays. While designing these specific features, we aimed for loading data with a single line of code, but with the ability to customize the details. After running through installation process, you’ll find a demo which focuses on data import and demonstrates how to bring out the maximum potential of the chart. As a small code snippet, you’ll see how easy it is to add & append data. procedure TForm1.LoadInitialData; var loadOptions: TTMSFNCChartLoadOptions; begin loadOptions := TTMSFNCChartLoadOptions.Create; try loadOptions.YRange := arEnabledZeroBased; TMSFNCBarChart1.LoadFromDataArray(loadOptions, 0, [123, 98, 54, 154, 128, 87, 103], nil, [‘Apple’, ‘Watermelon’, ‘Pineapple’, ‘Pear’, ‘Banana’, ‘Lemon’,’Grapefruit’, ‘Peach’]).LegendText := ‘Sold’; finally loadOptions.Free; end; end; The above code snippet loads the initial data. procedure TForm1.AppendData; var s: TTMSFNCChartSerie; begin s := TMSFNCBarChart1.AddSeriesFromDataArray([0.88, 1.32, 2.43, 0.76, 0.44, 1.03, 1.10]); s.YValues.Positions := [ypLeft]; s.LegendText := ‘Price’; end; Afterwards, we can append data and add new series without having to clear the ones that already exist. Code snippets are great to get started, but what’s even better is a video, explaining the capabilities in detail. Feedback In the coming weeks, we’ll bring out more videos, so stay tuned! Anything you wish to see covered in a video or blog post? Please let us know.

Read More

What Are Cross Platform Programming Languages?

Building cross-platform software is a challenging process. You need to consider many critical aspects for the successful development of the product. Choosing the best cross platform programming languages for development is at the top of that list. This article aims to aid your language selection by discussing cross platform programming languages, their evolution, features, and pros, and cons. A cross platform programming language is a programming language that enables developers to develop apps for various platforms using a single codebase. These apps can run seamlessly on multiple platforms without significant changes. Java, React Native, Flutter, Ionic, Sencha, and Xamarin are some popular cross platform programming languages and frameworks. How did the evolution of cross-platform programming languages happen? Cross-platform programming languages are not something novel. Cross-platform development has been around for more than two decades now. However, each language has evolved distinctly, adapting to various architectures and offering more features. First, C was considered a truly cross platform programming language in the early 70s. It was well-suited for system programming. Furthermore, C was capable of reusing the same source code across entirely different architectures for developing kernels and device drivers. However, it required some minor modifications to the code. After C, some other cross platform programming languages such as C++ and Delphi emerged to enlarge the field of cross-platform development further. C++ as a cross platform programming language C++ is also one of the initial cross-platform languages, even though it couldn’t shift into the world of the web and mobile. C++ is best suited for developing software like operating systems, database engines, game engines, compilers, and servers. At the same time, C++ is a great choice as a cross-platform language. You need to have sound knowledge and familiarity with the ecosystem to develop apps faster using it. Read this article to learn about the best IDE for the C++ newbie. The C++ builder by Embarcadero is packed with a set of robust libraries to boost productivity and deliver amazing user experience. Delphi is one of the most versatile cross platform programming languages Delphi is a strongly typed, event-driven, cross platform programming language with an extensive supportive tools and frameworks ecosystem. It also features a wide range of web and database libraries for the rapid development of apps that work on various platforms such as web, mobile, and internet-enabled devices. Delphi enables you to build a native app. A native app is an application designed to work on a specific device and its OS, utilizing that device’s device-specific software and hardware. These native apps can tap into specific resources, enabling them to easily access several services on a device like an accelerometer, microphone, and push notifications. The latest Delphi 11.1 release of Embarcadero helps you build native apps 5x Faster with a single codebase. Try Delphi 11.1 For Free Why do we need cross platform programming languages? Developing cross-platform software requires coding in a way that removes all the dependencies from a particular platform. To accomplish that, you have to use a programming language that supports you. That is where cross-platform programming languages come into play. The majority of popular programming languages support developing cross-platform software. However, some programming languages work better by supporting many platforms or offering solid abstraction layers to manage the differences between platforms transparently. Embarcadero offers a wide range of products such as RAD Studio, Delphi, and C++ Builder for developing […]

Read More

The Parallel Debugger plugin is now available for RAD Studio 11!

The Parallel Debugger plugin, originally from Parnassus, is now available in GetIt for RAD Studio 11.x (ie 11.0 and 11.1.) This follows up making Bookmarks and Navigator available a few weeks ago. The Parallel Debugger is an addon that lets you see what’s going on in all threads in your app at once. A traditional debugger in the IDE shows only one thread, one call stack, and so forth. The plugin shows you all call stacks for all threads next to each other (ie visually parallel matching that they are running in parallel), adds markup in the editor showing where each thread is executing, color-codes threads, lets you run, step or trace into on a per-thread basis, and more. Read the original announcement blog post to see the full set of features! Screenshot showing some of the Parallel Debugger features: parallel call stacks, coloured threads, extra editor markup, per-thread run/pause/step/trace, etc To install, go to the Tools menu in the IDE, GetIt Package Manager, and select the IDE Plugins section in the category selector on the left. You’ll see it listed: select it and click Install. The Parallel Debugger selected in GetIt. Note there are many other IDE addons in the same category too! The Debugger plugin does stress the various debuggers, because each of them is doing so much more (roughly linearly increased by the number of threads in your app.) It works best on Windows, and we don’t recommend using it for remote debugging, such as for macOS. It adds a new top-level menu called Thread, and in that is a submenu ‘Feature Level’. Keep that on ‘CPU Only’ when you don’t want the Parallel Debugger heavily involved. Then turn it back on when you need to do some debugging in parallel! We hope you find this useful, and helps you debug and understand your app’s parallel actions.

Read More

How To Create A React Responsive Grid

A grid is a powerful method to display a large volume of information to the users within a website. It allows users to perform various tasks like sorting, filtering, etc. In this article, we will tell you how to build enterprise-ready React data grids. The React grid layout is the React library that enables the creation of powerful grids if you use React in your front-end. However, robust and fully-responsive grids are critical requirements for many applications that process large amounts of information. You can have a better React responsive grid if you choose a modern enterprise-grade grid solution like Sencha GRUI, which has 100+ amazing data grid features. This article will describe how to create a React responsive grid and why you should use Sencha for better results. How Can You Create A Grid In React? First, let’s see how you can use React grid layout using a React data grid example. First, we will create a React app from scratch. To create the react app, you can use the ‘create-react-app’ command and create a sample application template.  Run npx create–react–app my-grid-app Run cd my–grid–app Next, you need to install the ‘react-grid-layout’  package, which contains the modern react grid components and functions you can use to create responsive grids. Following is the command to install the React grid.  npm install react–grid–layout Then we can start creating our React grid component. First, you must import the GridLayout Component from the ‘react-grid-layout’  package.  import GridLayout from “react-grid-layout”; How To Extend The React Component Class To Create The Grid? After importing it, extend the React component class and create a component class to start using the GridLayout. You can use the ‘data grid’ property set the width, height, x and y-axis, and minimum and maximum width of each child grid in the grid layout. class MyGrid extends React.Component {   render() {     return (                          1                            2                            3                     );   } } This will create a basic grid layout you can use to extend to add more functionalities to the UI. If you are unable to work with React grid view, this article might help you. Other libraries provide the same capability with more powerful features and efficiency that React give to the grid layout. Sencha GRUI is one such intuitive grid that you can use to build more modern and responsive web applications. How Can You Create A Grid In Sencha GRUI? GRUI by Sencha, which has been created using Ext JS grid, consists of more than 100 grid features and enables users to create enterprise-grade grid solutions for React UI. This grid provides all the features of the React grid layout, but it is easier to use and performs better. Let’s see how you can create a React grid using a Sencha react grid example that uses the “sencha-grid” package.   First, create a react application using the create-react-app command as in the previous example.  Run npx create–react–app my-grid-app Run cd my–grid–app Next, you must install the sencha sencha-grid component package using the following command. Run npm add @sencha/sencha–grid Then, after importing the React component from the beginning, you need to import the SenchaGrid and Column Components, the main components you can use to create the grid layout.  import React from “react”; import { SenchaGrid, Column […]

Read More

What Is Low Code And Why Do We Need Low Code App Development

In this technology era, the growth of digital services and evolving consumer needs have made companies seek faster ways for digital transformation. Low Code is an excellent solution adopted by companies worldwide to boost their digitalization. Yet, what is low code and what is a low code programming language? In this article, let’s find out what it is exactly. We’ll also discuss why we need Low Code, Pros and cons of Low Code, and some best Low Code platforms you can find in the market. What is low code? Low Code is a modern approach to software development that emphasizes little to no coding. It allows faster delivery of software with less manual coding. Furthermore, you don’t need extensive knowledge of programming languages to build apps with the Low Code approach. A low code application platform is a bunch of tools that facilitate low code development. It enables building applications visually with the help of modeling and a GUI. One key feature of low code platforms is their drag-and-drop layout builder. According to Gartner, more than 65% of software development projects will use low code approach by 2024. The pressure to produce digital solutions to cope with Covid 19 pandemic has further increased the adoption of this approach. Why do we need low code app development? The low code approach simplifies the development of sophisticated business apps. It allows you to easily build complete software rich with modern interfaces, integrations, and logic without writing thousands of complex code lines. The following are some major benefits you can gain through this low code application platform approach. Increased productivity – Since low code development speeds up application delivery, a project once took a few months now only takes a few days. Thus, low code has removed the time barrier from software development, paving the way for real innovation. Reduced Costs – The ability to deliver more apps in less time undoubtedly reduces the costs. However, it’s not the only driver of this cost savings. Low code also eliminates the need for more developers, cutting down hiring costs. Besides, Low Code platforms make everyone in an organization more productive without being limited to IT people. Improved business agility – In this rapidly evolving technology landscape, businesses must effectively adapt and respond to changing market conditions and potential opportunities. Building apps using traditional development approaches to cope with these needs can be tedious. Low code development tools aid the rapid development of systems that are capable of meeting numerous requirements. Enhanced customer experience – The impacts of low code development travel beyond the IT companies who are using it. The consequences of speedy development lead to better customer satisfaction. For instance, Low Code allows development companies to adapt to evolving market conditions and customer needs quickly. Best Low Code Platforms Businesses with the need to scale should search for effective ways to maximize their productivity. Investing in one of the best low code platforms might be a great solution to this endeavor. They are basically app builder software that includes intuitive and visual tools for users to build apps rapidly with less effort. PowerApps, Retool, Quixey, Creatio, GeneXus, Zoho Creator, Appian, and Mendix are some popular Low Code app development platforms. What Are The Pros Of Low Code Development? Mitigation of shadow IT – […]

Read More

Use Streaming Audit Events to connect your technology stack with GitLab and Pipedream

Gitlab recently released Streaming Audit Events to provide you real-time visibility into what happens inside your GitLab groups and projects. Whenever something happens, an event will be sent to the HTTPS destination of your choice. This is a great way to understand immediately when something has changed and if there is an action that needs to be taken. These events are often used to drive automation to update GitLab in response to certain actions, such as creating a new issue to onboard a team member when an account is added to a group, or to restore the correct value of a merge request approval setting if it is changed. We know that many users want to combine the streaming audit events with other data sets and tools they already work with. Taking automatic action in response to audit events happening can help ensure your GitLab groups and projects are always in the correct, compliant state. Pipedream simplifies the streaming audit event process Driving automation off of these events or combining the events with other data sets means the destination which will receive the events needs to be running and have logic in place for how to handle the events as they come in. This normally would require setting up and maintaining a server with high availability to receive events as they happen, run any automation scripts, and then process the events if they needed to be sent to another tool or combined with another data set. This is tricky to do right and an extra step that takes time. Enter our partner, Pipedream.  Pipedream lets you connect APIs, remarkably fast. This includes the new streaming audit events from GitLab. When you select the GitLab New Audit Events trigger in a Pipedream workflow, Pipedream will automatically register an HTTPS endpoint for audit events in your GitLab group: From there, Pipedream allows you to transform the data, forward it to any other tools using Pipedream’s prebuilt actions, or write any custom automation with code (i.e., Node.js, Python, Go, or Bash). Getting started with Pipedream and GitLab The video below shows an example of how to use GitLab streaming audit events and Pipedream together to automatically alert your security team if a sensitive project setting is changed. This is powerful because it ensures that your security teams can immediately take action when a change occurs and understand why it happened. This is just one example of what you can do with Pipedream and GitLab together. Pipedream allows you to use any GitLab API in response to an audit event: You can change the setting to its original value, add comments to issues, kick off pipelines, and more. You can also trigger any action in any of the 700+ other apps that it has built-in integrations with. Open source integration means everyone can contribute Pipedream and GitLab are both strong believers in open source. The integration is publicly available at the Pipedream repository, and contributions are welcome! We are excited to see what sort of workflows you create with Pipedream and GitLab together. Final thoughts In this post, we talked about the power of GitLab’s Streaming Audit Events to give you immediate visibility into your groups and projects and how Pipedream makes it easy to build and automate workflows based on those audit events. […]

Read More