Noutați

Do You Want To See How To Create A Showcase Mobile Game?

We love featuring our showcase applications – it’s great to see the versatility and skill Delphi developers put into them. There’s such a wide variety of offerings too from intelligent order-taking, machine-learning vision apps, powerful museum mobile experiences which enhance visits to exhibits with helpful information and three dimensional images. Wherever your imagination takes you RAD Studio Delphi can help make it a reality on Windows, macOS, Linux, iOS and Android. All work and no play? Not with Firemonkey! Games are also well represented by our community of wonderfully talented Delphi developers. This beautifully-designed game from French developer GBESort is a great example of what can be done. FMXPong is a version of the famous game “Pong”. The original Pong, from Atari, was very likely the first computer game ever released. FMXPong is a tribute to the original, but bringing things right up to date in 3D. FMXPong also contains some additional features enabled by the modern world of mobile devices. For example you can move the paddle by touching on the screen or by tilting the smartphone or tablet which the code then detects using the gyroscope of your device. What’s better than a great mobile game written with Delphi? How about a great game with full open source? All the code for FMXPong is fully open source and available at: https://github.com/gbegreg/FMXPong Website FMXPong Google Play FMXPong Screenshot Gallery Are you ready to write a mobile game?

Read More

This API Adds Machine Learning Computer Vision To Your App

Microsoft’s Azure has a broad collection of services you can access with an easy-to-use API. Azure is Microsoft’s cloud hosting and computing platform with a catalog of more than 200 different products. It also includes products which allow you to implement Machine Learning services. Those services all have an API which can you can access using client access libraries or a REST client. Delphi takes this ease of use one step further by providing a TAzureConnectionInfo to implement some of those services quickly and with a minimal amount of code. Also, we can access the services using Delphi’s built-in REST client. Is Azure Read Client Free? No, the Azure Read Client is not free, but the good news is when you first register you will get some free 12 months services and an free-tier allowance for services so you can try things out as you develop, test and launch your app. Some Azure services have very generous ‘always free’ levels. The service we going to use in our OCR application is  “Cognitive Search” which is one of those which is always free. It has a permanent limit of 10,000 documents, but that’s more than enough for our testing purposes. How do we get API credentials for the “Computer Vision” service resources? For our OCR application, we going to use the “Cognitive Services->Computer Vision” resource. First you must have an “Azure subscription”. Go to the link below and create an “Azure subscription” if you don’t have one. It’s free to start! https://azure.microsoft.com/en-us/free/cognitive-services/ Once you have the subscription, you can create the required service links. Go to this link to create a “Computer Vision” resource. https://portal.azure.com/#create/Microsoft.CognitiveServicesComputerVision Make sure you select the correct region because you can’t go back and change it later. Now go to the resource you created and choose “Keys and Endpoint” from the left-hand menu. Now, copy one of the keys and and the location. We need those in our application. How to connect to the Cognitive Services REST API? We need TRESTClient, TRESTRequest and a TRESTResponse components to connect to the cognitive services REST Api. Lets drag and drop TRESTClient in to the forum and do some basic property changes. Make sure the “Accept” property has “application/json” type. Set the content type to “application/json“. Then drop a TRESTRequest component into the forum and set client property to the client we created earlier. Set the method to “rmPOST“. Place a TRESTResponse component and set the response property in the request component to this response object. Add some edit boxes, buttons and a memo box to complete our interface. How do we use the API to post the image for processing? We cannot post the image to cognitive services and get the result in one call. The image processing takes time, although usually this is less than five seconds. So, first we need to submit our image to the cognitive service and get the “Operation-Location” and check the status until it’s “succeeded”. If the server is still processing the image, status will be “running” instead. For each and every call to cognitive service API, we need to provide our subscription key through the HTTP Header. It’s the key we copied earlier from the resource we created. To do that, add a new parameter to TRESTRequest component, set the ‘kind’ to […]

Read More

Firestore async dataset methods in TMS WEB Core v1.7

In this last blog article of 4 blog posts, we introduce a last major new feature in the Google Firestore dataset, i.e. new async features. Before providing details about these new features, let’s first look at the classic VCL TClientDataSet, how it can work how it works and what the implications are of inherently asynchronous implementations for use with a REST API based communication between a client dataset and the Google Firestore backend. Classic VCL TClientDataSet operations The editing and navigation interface for a TClientDataSet is best provided by using data-aware controls such as TDBGrid, TDBNavigator and more. Still, many times you need to process some records in code according to specific business logic. When it comes to populating and modifying a TClientDataSet in classic VCL code, you would use code similar to the following code snippets. Inserting a record in the dataset ClientDataSet1.Insert; ClientDataSet1.FieldByName(‘Description’).AsString := ‘Call up a meeting with Sales group.’; ClientDataSet1.FieldByName(‘Status’).AsString := ‘New’; ClientDataSet1.Post; Modifying a record in the dataset ClientDataSet1.Edit; ClientDataSet1.FieldByName(‘Status’).AsString := ‘Done’; ClientDataSet1.Post; Deleting a record in the dataset  Processing all the records in the dataset ClientDataSet1.First; while not ClientDataSet1.EOF do begin //do some processing based on one or more fields of the record ClientDataSet1.Next; end; Equivalents with Firestore? Question is, will the above code work in Firestore ClientDataSet too? Yes the above code will work as standalone. But the code that follows the above code will fail if it depends on the success of the database operation in the previous code. This is important to understand so let’s look at 2 examples of how the code that follows can fail in Firestore TClientDataSet. Failing code example 1 Consider the following variation of the last example: if not ClientDataSet1.Active then ClientDataSet1.Open; ClientDataSet1.First; while not ClientDataSet1.EOF do begin // do some processing based on one or more fields of the record .. ClientDataSet1.Next; end; This will fail on TClientDataSet1.First. Why? Because an open is an asynchronous operation that takes time to open the cloud database. There is no guarantee that the open will be complete by the time you reach the next statement. What will happen is unpredictable. In fact, this is true of all the ClientDataSets in TMS Web Core dealing with cloud databases. Failing code example 2 Consider another example where we want to first insert a record in a Firestore collection, then get the record’s id that Firestore generates and stuff it as a foreign key value in another dataset’s new record. // adding a new customer’s record Customers.Insert; Customers.FieldByName(‘FirstName’).AsString := ‘John’; … more data for the customer record as needed … Customers.Post; // getting the generated id from Firestore newid := Customers.FieldByName(‘id’).AsString; // adding the invoice for the customer Invoices.Insert; … more data for the invoice record as needed … // setting the foreign key value as the id generated earlier Invoices.FieldByName(‘customer_id’).AsString := newid; Invoices.Post; Do you see what will cause a problem here? Customers.Post is an async operation as it will add a new record in the Firestore collection. There is no guarantee that it will finish by the time you reacth the next statement that remembers the generated id in newid.  To rescue with async Fortunately, we have a solution for the above coding problems in the new version of TWebFirestoreClientDataSet. They consist of the following methods that allow you […]

Read More

Announcing beta support for FMXLinux!

Intro We have been working on this for quite some time now and today we can proudly announce beta support for FMXLinux in ALL FNC products. Download the latest update today to get started! Below is a list of FNC products that have been tested in FMXLinux. With FMXLinux, we add a new platform to the wide variety of already supported platforms in FNC. TMS FNC Components can be used simultaneously on these frameworks TMS FNC Components can be used simultaneously on these operating systems/browsers TMS FNC Controls can be used simultaneously on these IDEs Getting Started Beta support means that the components have been tested and deployed on a Linux environment (Ubuntu 20.04) after properly setting up FMXLinux and other dependencies required for various parts of FNC. Support for FMXLinux is limited to RAD Studio 10.4 Sydney and the path to the source files has to be manually configured in the library path (the automated installer currently does not pick up FMXLinux). Please follow the instructions below to add FMXLinux support to RAD Studio. Please note that adding the SDK is an essential part of the configuration process and it is important to add the SDK to RAD Studio when all the necessary libraries are added to your Linux environment. After following the above instructions, please execute the following commands sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 sudo apt-get install zlib1g-dev sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 sudo apt install libwebkit2gtk-4.0-dev Add each path that contains FNC source files of the products you have installed to the Linux 64 bit library path. Start a new multi-device FMX project and select the Linux 64 bit profile. When the PAServer is running correctly, you can connect to Linux environment and start deploying your application.  Preview We have created a short video to give you an idea on what you can expect when deploying new or existing FNC applications. Feedback! With this beta support for FMXLinux announcement we start a journey on a new and exciting road. Feedback during the beta period is highly appreciated. After a couple of updates, we’ll announce full support and further fine-tune the installation process as well as provide more videos, documentation and demos.

Read More

Easily Build Real-Time Stock Market Charts Using Javascript

In this global economic turmoil, it has become very important for investors to make the right financial decision based on accurate and up-to-date market data. With Sencha Ext JS and Marketstack API, you can build a stock market web application that provides real-time data and helps the investors uncover valuable insights. In this article, you will find all the details. What is Marketstack API? Marketstack is a REST API that provides real-time stock market data. It supports 25,000 stock tickers across the globe from 72 stock exchanges, including NYSE, Nasdaq, and ENX. Also, it offers accurate historical market data of more than 30 years. With an uptime of nearly 100%, it has become one of the most reliable stock market APIs that you can find online. Why should you use Marketstack API? Offers real-time, intraday, and historical stock market data in JSON format, which is very easy to integrate with web applications Supports integration with multiple languages and frameworks, including JavaScript, Python, Node, and Go Handles traffic spike efficiently Offers bank-grade security using the industry-standard 256-bit HTTPS encryption Provides easy-to-follow documentation How to Build a Real-Time Stock Market Web Application with Sencha Ext JS and Marketstack API Sencha Ext JS is a feature-rich JavaScript framework for building business-grade web applications. By integrating Marketstack API, you can create a real-time stock market application easily. Take a look at it: To create the stock market application shown above, you have to follow these steps: 1. First, you have to create the model. Go to app > model folder, create HomeModel.js file and add these codes: Ext.define(‘Demo.model.HomeModel’, {     extend: ‘Ext.data.Model’,       alternateClassName: [         ‘home’     ],     requires: [         ‘Ext.data.field.Number’,         ‘Ext.data.proxy.Rest’     ],       fields: [         {             type: ‘float’,             name: ‘low’         },         {             type: ‘float’,             name: ‘high’         },         {             type: ‘int’,             name: ‘date’         },         {             type: ‘float’,             name: ‘close’         },         {             type: ‘float’,             name: ‘open’         }     ],       proxy: {         type: ‘rest’     } }); Here, you are adding different fields, including open, close, data, high and low. Also, you are defining their types. 2. Then you have to create the view. Go inside view folder and create OHLCCharts.js file. Insert these codes: Ext.define(‘Demo.view.OHLCCharts’, { extend: ‘Ext.panel.Panel’, alias: ‘widget.OHLCCharts’,   alternateClassName: [ ‘OHLCCharts’ ], requires: [ ‘Demo.view.OHLCChartsViewModel’, ‘Demo.view.OHLCChartsViewController’, ‘Ext.toolbar.Toolbar’, ‘Ext.toolbar.Fill’, ‘Ext.form.field.Date’, ‘Ext.button.Button’, ‘Ext.chart.CartesianChart’, ‘Ext.chart.axis.Time’, ‘Ext.chart.series.CandleStick’, ‘Ext.chart.interactions.PanZoom’, ‘Ext.chart.interactions.Crosshair’ ],   controller: ‘ohlccharts’, viewModel: { type: ‘ohlccharts’ }, dock: ‘top’, height: ‘100vh’, padding: 0, style: { background: ‘#ffffff’ }, width: ‘100wh’, layout: ‘fit’, bodyPadding: 0, frameHeader: false, manageHeight: false,   dockedItems: [ { xtype: ‘toolbar’, alignTarget: ”, border: 2, dock: ‘top’, style: { background: ‘#c6e4aa’ }, layout: { type: ‘hbox’, padding: ‘0 10 0 0’ }, items: [ { xtype: ‘tbfill’ }, { xtype: ‘textfield’, id: ‘tickerInput’, width: 100, fieldLabel: ‘Ticker’, labelWidth: 40, value: ‘AAPL’ }, { xtype: ‘datefield’, id: ‘fromDatePicker’, width: 250, fieldLabel: ‘From’, labelWidth: 50, value: ’01/01/2020′ }, { xtype: ‘datefield’, id: ‘toDatePicker’, resizable: false, width: 250, fieldLabel: ‘To’, labelWidth: 50, value: ’12/31/2020′ }, { xtype: ‘button’, id: ‘refreshBtn’, text: ‘Refresh’, listeners: { click: ‘onRefreshBtnClick’ } } ] }, { xtype: ‘cartesian’, dock: ‘top’, height: ’85vh’, id: ‘mycandlestickchart’, itemId: ‘mycandlestickchart’, margin: ‘0 0 0 […]

Read More

Developer Stories: Michał Bąkowski Exclusively Elaborates On TonCut

Michał Bąkowski first worked with Delphi many years ago. He participated in the Delphi 26th Showcase Challenge with his cutting optimization (TonCut) showcase entry. Learn more about his software over at the TonCut website. When did you start using RAD Studio/Delphi and have long have you been using it? I’ve started with Delphi 1 ages ago. Before I was working with Borland Pascal for Windows and when Delphi came out, it was like a revolution. What was it like building software before you had RAD Studio/Delphi? It was much more time consuming, difficult and harder to control. With Delphi, creating UI is very fast and simple. How did RAD Studio/Delphi help you create your showcase application? Most of all it allows creating own components and easily using it. Besides that, when I started working on TonCut, there was no other option actually.  All other tools were far behind Delphi. What made RAD Studio/Delphi stand out from other options? It allows fast creation and modification of UI. This is the main advantage of Delphi. What made you happiest about working with RAD Studio/Delphi? Hard to tell. I think, again option to create own components. What have you been able to achieve through using RAD Studio/Delphi to create your showcase application? Well, I created the app that my customers like. This is all I need. What are some future plans for your showcase application? We will be working on adding more AI to the app. Also we plan to add new optimization algorithms (1D with slants, 2D nesting of any shapes and maybe even 3D). Some functional changes are also on their way.   Thank you so much Michał! Head on over to the TonCut showcase to read more about Michał’s work

Read More

Machine Learning: 5 Ways To Use ML in your Windows Apps

How do I start using Machine Learning in Windows? Machine learning isn’t only for the cloud, or run locally in a web browser or command prompt, Microsoft is bringing it to PCs in the latest Windows 10 release. For example, Microsoft provides Python’s WinRT to create Windows Machine Learning applications, and ONNX (Open Neural Network Exchange) format, an open standard for sharing trained deep learning models between platforms and services. The latest release of Windows 10 provides plenty of new APIs for your applications. This includes the support for running trained Machine Learning models as part of Windows applications, taking advantage of local GPUs to accelerate Machine Learning applications. On the other hand, Embarcadero created Python4Delphi (P4D) to empower Python users with Delphi’s award-winning VCL functionalities for Windows which enables us to build native Windows apps 5x faster. This integration enables us to create a modern GUI with Windows 10 looks and responsive controls for our Python Machine Learning applications. Python4Delphi makes it very easy to use Python as a scripting language for Delphi applications. It also comes with an extensive range of demos and tutorials. With Python4Delphi, you can integrate any Python features, functionalities, and libraries with Delphi to create a nice GUI for your Machine Learning applications in Windows. In this tutorial, we will discuss the following: How to use these 5 Python libraries with different Machine Learning capabilities to perform Machine Learning in Windows Apps: Matplotlib, NLTK, Pillow, OpenCV, and Keras. All of them would be integrated with Python4Delphi to create Windows Apps with Machine Learning capabilities. Prerequisites: Before we begin to work, download and install the latest Python for your platform. Follow the Python4Delphi installation instructions mentioned here. Alternatively, you can check out the easy instructions found in Getting Started With Python4Delphi video by Jim McKeeth. Time to get started! First, open and run our Python GUI using project Demo1 from Python4Delphi with RAD Studio. Then insert the script into the lower Memo, click the Execute button, and get the result in the upper Memo. You can find the Demo1 source on GitHub. The behind the scene details of how Delphi manages to run your Python code in this amazing Python GUI can be found at this link. Open Demo01.dproj. 1. How do I enable Matplotlib inside Python4Delphi in Windows? Matplotlib is one of the most popular and oldest plotting libraries in Python which is used in Machine Learning. In Machine Learning, Matplotlib helps to gain insights from a huge amount of data through different data visualization techniques. With the high demand for Data Science and Analytics skill sets, drawing graphics programmatically is a very popular task these days. You can easily solve these tasks by combining the Matplotlib library with Python4Delphi (P4D). Matplotlib can be used in Python scripts, the Python and IPython shell, web application servers, and various graphical user interface toolkits (in this post, Python GUI by Delphi’s VCL using P4D)! After installing Python4Delphi properly, you can get Matplotlib using pip or easy install to your command prompt: and don’t forget to put the path where your Matplotlib installed, to the System Environment Variables, here are the example: C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38/Lib/site-packages C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38/Scripts C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38 C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38/Lib/site–packages C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38/Scripts C:/Users/YOUR_USERNAME/AppData/Local/Programs/Python/Python38 The following is a code example of Matplotlib to create Stacked Horizontal Bar Chart to Visualize Discrete Distribution (run […]

Read More

Get A Workflow Supercharge For Your Sales

Take your order and billing workflow to the next level with this brilliant Android app. Smart Trader is of course written in Delphi using the cross-platform power of the Firemonkey FMX framework. Produced by Soluciones Informáticas Globales S.A. based in Buenos Aires Smarter Trader is now available in its third version for Android. As stated by the SIG S.A. “SMART TRADER is an app for mobile devices with android platform, designed to optimize the task of order taking and billing in the moment, with the specific objective of increasing the productivity of your sales force. It has an online and offline mode of operation, allowing to take orders, invoice them and make snakes autonomously. How can Smart Trader help with your workflow? Search for items by code, name, item, vendor, or scan the barcode. View the requested item data: price, units per package and display, stock availability, photo. Suggest offers, out of Stock items, highlight new products. Adds up the value the order as items are added to the bill of sale. View the final total including any discounts. Issue an electronic invoice. Of course, record the visit, the names of the sales person and the order placed. The customer’s geographic location can also be captured using the Android device’s in-build GPS If the sale falls through for any reason, the sales person can record details of why it didn’t go ahead. Starting your day the Smart Trader way At the beginning of their working day sellers can review the list of clients by account code, name or address and obtain the following information from them: What is the customer’s geographical location? Do they have any previous sales or specific requests? Are there any invoices or payments pending collection? When was the last visit made and who made it? Are there any special discounts or promotional items available which can be offered? What discount policy you have with this customer? Other workflow friendly features Smart Trader contains advanced search features which allow you to search for items rapidly assess orders, customer or order profitability, mark accounts for collection, issue along with a host of other features packed into the one application. Google Play SMART TRADER 3 Screenshot Gallery Library

Read More

Comprehensive Guide to Cyber Insurance

Published April 22, 2021 WRITTEN BY THE KIUWAN TEAMExperienced developers, cyber-security experts, ALM consultants, DevOps gurus and some other dangerous species. Social media, advanced technology, and the growing popularity of business transactions over the web continue to determine how organizations operate and communicate with their prospective customers. However, they’re also gateways to cyberattacks and data loss. Whether launched by criminals, insiders, or run-on-the-mill hackers, the likelihood of a cyberattack exists, and both small and established organizations face the risk of moderate or severe harm. As a component of their risk management strategy, companies now have to routinely decide the risks to accept, control, avoid, or transfer. Risk transfer is where cyber insurance policies come into play. What Is Cyber Insurance?  It’s also called cyber liability insurance coverage (CLIC) or cyber risk insurance. In essence, the policy is designed to provide risk exposure mitigation to companies. It does this by offsetting any expenses the business incurs to recover after a security breach or any other cyber-related threat.  The concept entered the market in the early 2000s and has its roots in E&O (errors and omissions) insurance. Very few providers existed then, and the main threats covered included network security, viruses, and unauthorized access. A lot has changed from its initial inception. For instance, the earlier iterations mainly focused on third-party indemnity coverage. But as years went by, providers began including first-party coverage for credit monitoring, notification, crisis management, public relations, and identity restoration. Earlier on, the first-party coverages were sub-limited, contrary to the full limits available in the market right now. Soon after, additional like PCI penalties and fines, regulatory penalties and fines, first-party business interruption, and cyber extortion followed later. The recent years have seen the inclusion of social engineering, system failure coverage, and property damage to devices and hardware. Different advancements in the coverage’s scope are witnessed every year.   Types of Cyber Insurance Coverages Here are the different types of cybersecurity insurance coverages:  Cyber Security Insurance It’s also referred to as the Crisis Management Expense or Privacy Notification coverage. The insurance product covers you and your business against first-party damage but not against damage to third-parties. It specifically takes care of the immediate response cost after a data breach. Some of these costs include: Contracting forensic experts to ascertain the breach’s origin and give suggestions on practical approaches to site security and future breach prevention Paying a public relations service to help address the crisis Informing everyone whose personally identifiable information is compromised Monitoring the victims’ credit for 12 months Compensating the cost of restoring stolen identities Cyber Liability It’s also called the Information Security and Privacy Insurance and covers liability for breach damages. Direct response costs aren’t covered. It’s ideal for e-commerce agencies and those that keep client data in their internal electronic network. Common breaches involve the following types of personal or financial data: Credit card numbers Social security numbers Bank account details Health information Intellectual property or trade secrets Technology Errors and Omissions Also called E&O or Professional Liability, the liability coverage protects corporates that offer technology products and services. It protects you from bearing the entire cost of defending yourself when a civil lawsuit awards damages after a customer’s negligence claim. Apart from the companies selling and servicing computer products, the insurance also includes advertising […]

Read More

Add STOMP to your apps for lightweight real-time streaming

STOMP is a publish/subscribe messaging protocol which allows for very lightweight communications between almost any mixture of programming languages, operating system platforms and “message brokers”.  This article goes into detail about what STOMP is, why you would want to use it, some quick-start hints to get you up and running and a fully working example of using STOMP in your Delphi programs – all for free. What is STOMP? STOMP is the Simple (or Streaming) Text Orientated Messaging Protocol. STOMP describes an agreed message protocol format so that STOMP clients can communicate and work with any STOMP message broker (the STOMP name for the server). What is the difference between STOMP and websockets? It’s a good question!  We looked at Websockets in a previous article.  Websockets are sometimes the underlying transport technology used to implement STOMP.  In a sense, websockets are how the messages get passed around and STOMP is the agreed format of what is passed.  STOMP doesn’t need to use websockets to work. Is STOMP hard to use? Like any technical subject there are a few concepts to understand but once you get comfortable with the terminology STOMP is extremely easy to use.  If you write your own server applications, or ‘brokers’, any STOMP client can interact with them no matter what computer language or technology is used.  The official STOMP website even states “you can use Telnet to login to any STOMP broker and interact with it”. Behind the scenes STOMP uses headers and frames to control the back and forth of the communications.  It’s modeled on HTTP but it’s more lightweight and doesn’t really have anything to do with it. The broker controls things such as an optional heartbeat system Clients ‘SUBSCRIBE’ to a ‘topic’.  The clients can then post messages to that topic.  Messages sent to that channel get passed on to all clients subscribed to the same topic.  Clients can be subscribed to more than one topic. Clients can also be brokers but that complicates our examples, so we’ll stick here with the idea of the client and the broker being separate entities. STOMP subscriptions and possible uses For example, I could write a client to subscribe to a topic called “/myapplication/errors”.  Then, whenever my application encounters an error, it could send a message to the “/myapplication/errors” topic.  All other clients also subscribed to that topic would receive that message and could then act on it, reply or ignore it. Imagine that one of the clients was a status page showing a count of errors.  It could show a real-time visualization of the severity, number and frequency of the errors.  That status page could be a web page, a Delphi VCL application running on Windows, macOS app or a Firemonkey mobile app running on an iPhone. The content is up to your imagination Whilst STOMP defines how the messages get passed around the actual text content of the message is totally under your control in your code.  The messages work best when they are plain text – because that’s the format underpinning the STOMP protocol – but they could just as easily be some JSON or similar text-based encoding. First steps on how to use STOMP in your applications RabbitMQ makes testing your Delphi STOMP programs more straight-forward. First, it’s easiest if we install […]

Read More