Noutați

Lingo: A Go micro language framework for building Domain Specific Languages

Domain Specific Languages (DSL) are small, focused languages with a narrow domain of applicability. DSLs are tailored towards their target domain so that domain experts can formalize ideas based on their knowledge and background. This makes DSLs powerful tools that can be used for the purpose of increasing programmer efficiency by being more expressive in their target domain, compared to general purpose languages, and by providing concepts to reduce the cognitive load on their users. Consider the problem of summing up the balances of different bank accounts in a CSV file. A sample CSV file is provided in the example below where the first column contains the name of the account holder and the second column contains the account balance. name, balance Lisa, 100.30 Bert, 241.41 Maria, 151.13 You could solve the problem of summing up balances by using a general-purpose language such as Ruby as in the code snippet below. Apart from the fact that the code below is not very robust, it contains a lot of boilerplate that is irrelevant to the problem at hand, i.e., summing up the account balances. #!/usr/bin/env ruby exit(1) if ARGV.empty? || !File.exist?(ARGV[0]) sum = 0 File.foreach(ARGV[0]).each_with_index do |line, idx| next if idx == 0 sum += Float(line.split(‘,’)[1]) end puts sum.round(2) Below is an example AWK script that solves the same problem. AWK is a DSL that was specifically designed to address problems related to text-processing. #!/usr/bin/awk -f BEGIN{FS=”,”}{sum+=$2}END{print sum} The Ruby program has a size of 208 characters, whereas the AWK program has a size of 56. The AWK program is roughly 4x smaller than its Ruby counterpart. In addition, the AWK implementation is more robust by being less prone to glitches that may appear in the CSV file (e.g., empty newlines, wrongly formatted data-fields). The significant difference in terms of size illustrates that DSLs, by being more focused on solving specific problems, can make their users more productive by sparing them the burden to write boilerplate code and narrowing the focus of the language on the problem at hand. Some popular DSLs most software developers use on a regular basis include Regular Expressions for pattern matching, AWK for text transformation or Standard Query Language for interacting with databases. Challenges when designing Domain Specific Languages Prototyping, designing and evolving DSLs is a challenging process. In our experience this is an exploratory cycle where you constantly prototype ideas, incorporate them into the language, try them out in reality, collect feedback and improve the DSL based on the feedback. When designing a DSL, there are many components that have to be implemented and evolved. At a very high level there are two main components: the language lexer/parser and the language processor. The lexer/parser is the component that accepts input as per the language definition which is usually specified specified by means of a language grammar. The parsing/lexing phase produces a syntax tree which is then passed onto the language processor. A language processor evaluates the syntax tree. In the example we saw earlier, we ran both the Ruby and AWK interpreters providing our scripts and the CSV file as input; both interpreters evaluated the scripts and this evaluation yielded the sum of all the account balances as a result. Tools such as parser generators can significantly reduce the effort of lexer/parser development by means […]

Read More

Bookmarks and Navigator are available for RAD Studio 11!

Bookmarks and Navigator, originally known as the Parnassus plugins, are some of our most-requested IDE addons. We’re very glad to let you know they are now available in GetIt for RAD Studio 11. 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: Bookmarks is a developer-favourite addon that replaces the editor’s inbuilt bookmarks, with an unlimited number of bookmarks, a handy shortcut (Ctrl+B), avoids overwriting bookmarks accidentally, caret bookmarks for quick toggling of location and reverse/stack navigation, a docked window showing bookmark context, and more. Navigator is a related plugin that helps you quickly navigate anywhere in your code: press Ctrl+G, and type to filter to show all useful elements in the current unit. You can type, for example, ‘prop Foo’ (or even shorter, ‘p f’ or even ‘f’ if you have few enough items to make this useful: it filters more as you type more) to find properties with Foo in their name, or find property read/write fields or methods related to that property… or to navigate to classes, records, enums and other types; unit sections like uses clauses; methods; variables, and more. Anything useful in your unit is shown in Navigator and is quickly accessible. It also adds a minimap to the IDE editor showing where you are in your code. RAD Studio 11 showing the Bookmarks and Navigator plugins both in use: bookmarks are shown in the editor and the docked window on the bottom right, while the Navigator plugin is providing the minimap on the right side of the editor and the floating navigation window where I’m searching for a method Bookmarks and Navigator are usually available immediately with the release, and that did not happen for RAD Studio 11. However, we have configured our internal build so that these plugins will always be available in future: that is, you can feel assured we have internal setup to not repeat the delay. The third Parnassus plugin, Debugger, should also come within a few days. The plugins are available for both RAD Studio 11.0 and 11.1; in fact, the screenshot above is taken with RAD Studio 11.0. Thankyou for your patience waiting for these plugins, and we hope you find the Delphi and C++Builder IDE even more productive and pleasant to use with these extensions! Don’t forget — they’re available right now in GetIt. Happy coding!

Read More

Windows 11 Win32 Debugging Patch for RAD Studio 11.1

There is a new patch (or hotfix) available for RAD Studio 11.1. The patch addresses an issue specific to debugging Win32 apps on Windows 11, where the IDE sometimes appears to freeze. Typical situations where you could observe the freeze include evaluating watches with side effects, opening the Threads view to switch threads, attaching to a process, and other common debugging actions. The issue is caused by getting the thread wait chain (GetThreadWaitChain()), which sometimes takes up to a minute. It is resolved by disabling the thread wait chain feature in the debugger. The exact cause of the thread wait chain delay is unknown but it appears to be related to a thread having a socket open, possibly where the thread is waiting to finish network IO. Thread wait chain information is disabled for Win32 on both Windows 10 and Windows 11. There is an environment variable to re-enable it if you need the feature: set DBK_ENABLE_WAITCHAIN=1 on a command prompt, and run RAD Studio (alternatively, set that environment variable globally for Windows.) Only Windows 11 is affected by the issue, so you only need to install the patch on Windows 11. Installation You can download this in GetIt (our recommended technique; also it will show as available on the Welcome Page when you start the IDE) or install manually after downloading from my.embarcadero.com (the zip file contains a batch file installer.) The RAD Studio 11.1 Welcome screen showing the ‘Patch available’ button. Click this to install patches, including this one. Remote Debugging Because this patches the debugger, if you do remote debugging you will also need to update PAServer on the remote machine. The patch installer replaces the (your RAD Studio install location)PAServersetup_paserver.exe file, but you’ll need to copy that over to the remote machine and install it. There are full details in the patch readme.  

Read More

The Metaverse Minute: Auggie Awards edition

Not one, not two, but all of the experiments housed in the Petricore AR Experiments app were created using Unity’s AR Foundation. This whimsical collection of activities includes taking a family photo, petting a virtual dog, mixing paint colors from the real world, and more. This eclectic app is a celebration of AR. The AR Paint Bucket game is one of our experiments where a player places an AR paint bucket and has to grab colors from the real world to mix and match a given target color. Our inspiration for this was the TikTok trend of people trying to guess the color of mixing paint. We used Unity to develop the Paint Bucket game, relying primarily on AR Foundation. AR Foundation/Unity made it really easy to jump in and build something that’s fun quickly, which was our goal with these experiments. – Oliver Awat, Lead Designer & Senior Developer, Petricore

Read More

How To Create An HTML CSS Grid

An efficient and robust Javascript data grid is vital for building a data-intensive web app. The massive volumes of data generated by small and medium enterprises call out for the need of good JavaScript developer tools that can help you build web apps capable of handling millions of data points. Ext JS meets all your requirements ranging from building a simple HTML CSS grid to a more complex and sophisticated responsive HTML 5 data grid. Continue reading for step by step instructions on how to create an HTML5 grid. To keep things simple we are creating an app using just a single HTML file. You can put all the JavaScript code in the same file. The final JavaScript data grid we’ll build looks as follows: Step 1: Which Files do I Need to Import to Create HTML CSS Grid? As a first step, link the CSS stylesheet in your HTML 5 grid project. This file will import the CSS grid layout. Create an empty HTML file and add the following line anywhere in the header of the HTML file: Next, you need to include the Ext JS library to import the objects of the HTML CSS. Add this to the HTML file: Step 2: How do I Create the Data Model for the HTML CSS Grid? To set up the data grid in JavaScript, you need to define the data model with all the fields of our grid. This is defined in the onReady() method that you can add to the script section of the HTML file. Ext.onReady(function() { Ext.define(“com.extjsGrid.Sencha”, { extend: “Ext.data.Model”, fields: [“Product”, “Environment”, “Description”] }); The above code defines a grid model com.extjsGrid.Senchawith three data fields named Product, Environment and Description. Note this onReady() function is not complete yet. We still have to define the data store and display method inside it. Step 3: How do I Create the Data Store for the HTML CSS Grid? As a third step for creating the JavaScript data grid, you need to create a data store for our HTML 5 data grid. We’ll create a variable senchaStore that is tied to our com.extjsGrid.Sencha data model. We’ll populate the data grid using the data key of our JSON data store object. Append the onReady() method with the following code. var senchaStore = Ext.create(“Ext.data.Store”, { model: “com.extjsGrid.Sencha”, data: [ {‘Product’: ‘Ext JS’, ‘Environment’: ‘Javascript’, ‘Description’:’Ext JS is the most comprehensive JavaScript framework for building feature-rich, cross-platform web applications’}, {‘Product’: ‘React Grid’, ‘Environment’: ‘React’, ‘Description’:’React Grid by Sencha is a perfect modern enterprise-grade grid solution for React UI that comes with 100+ amazing data grid features.’}, {‘Product’: ‘Ext Angular’, ‘Environment’: ‘Angular’, ‘Description’:’ExtAngular provides the most complete set of components for building data-intensive web apps using Angular.’}, {‘Product’: ‘Ext React’, ‘Environment’: ‘React’, ‘Description’:’ExtReact is the most complete set of React components for building data-intensive web apps using React’}, {‘Product’: ‘ExtWebComponents’, ‘Environment’: ‘Javascript’, ‘Description’:’ExtWebComponents provides a framework-agnostic set of over 140+ UI components for application development.’} ] }); Step 4: How do I Display the HTML 5 Grid? You can display the HTML 5 data grid using the Ext JS panel. Add the following code after adding the data store of step 3. Ext.create(“Ext.grid.Panel”, { renderTo: document.body, store: senchaStore, title: “Sencha Products”, width: 1000, columns: [{ text: ‘Prodcut’, dataIndex: ‘Product’, autoSizeColumn: true }, { text: […]

Read More

Tkinter vs DelphiFMX in the Embarcadero Open Source Stream

We are starting something new, and I’m pretty excited about it. This is the first in a series of regular live streams discussing the latest in open source projects. Both projects sponsored by Embarcadero and key projects in the community. I will be the the host, and I’ll be joined by members of the community, developers involved in these open source projects, as well as members of Embarcadero and Idera’s Product Management. Our first stream, next week, is focused on Tkinter vs DelphiFMX for Python GUI development, so is squarely aimed at the Python developer. Thursday, Jun 2, 2022 at 10:00 AM CDT These streams serve multiple purposes: Collaborate for me with other project managers at Embarcadero and Idera to shape the roadmap and how we support these projects Share behind the scenes conversations with the community of these conversations Collaboratively shape the future of these open source projects Regular updates for what’s new with these projects and the community The goal is to rotate through projects each week and include a theme with the project. For example this week we are discussing the DelphiFMX for Python GUI library and comparing it with Tkinter, the existing de facto Python GUI library. This is a good opportunity to see gaps where DelphiFMX can improve, while seeing what DelphiFMX does to improve the life of the Python developer. Speaking of Python GUI development, we have a new . We will also look at some of the related projects for Python : Agenda for the stream: Tkinter vs. DelphiFMX Overview and comparison of the two libraries Where can DelphiFMX improve? What’s new in DelphiFMX Review Issues & Pull Requests Answer Questions Other feedback or contributors Plan roadmap for future changes Future streams will cover other projects in our Python Ecosystem, non-Python projects, and even community projects we love! This is the latest map of your Python Ecosystem. I’ve split it into two parts, the top half is projects for Python developers, and is the focus of the stream on June 2nd. We are planning on June 9th to focus on projects for Delphi developers that wrap Python libraries for simple Open Pascal based development. I’m really excited to show what we are working on there. Here is a list of some other open source libraries we may discuss in future streams: SonarDelphi Sonar-Delphi plugin used to analyze Delphi projects with SonarQube Bold for Delphi – A Model Driver Architecture (and ORM library) for Delphi Dev-C++ – A fast, portable, simple, and free C/C++ IDE C++ Arcade Games – 4 arcade games developed in C++Builder with FireMonkey for Windows, macOS, iOS and Android DelphiArcadeGames – 4 arcade games developed in Delphi with FireMonkey for Windows, macOS, iOS and Android DelphiBigNumbers – Really, really big integer and floating point numbers in Delphi Kastri – General purpose Delphi library skia4delphi – 2D GUI Library for VCL and FireMonkey Hashload Boss – Dependency Manager for Delphi and Lazarus And open to community suggestions As part of the live stream I will share more detailed documents about the project, but here are a few stats as a preview. Hope to see you online for the webinar on Thursday, Jun 2, 2022 at 10:00 AM CDT.

Read More

What Are Code Editors And What Is IDE Software?

Whether you’re new to programming or an expert developer, you need tools that make it easier to write and edit code. That’s why most developers these days use IDEs and code editors to simplify the process of coding and save time. An IDE software essentially consists of common development tools, such as a code editor, debugger, compiler, etc. In this article, we’ll discuss what exactly are IDEs and code editors and what you should look for in IDE software. We’ll also show you the best IDEs and code editors that you can use for your next project. What is IDE software? When we talk about IDE software (Integrated Development Environment) we mean a specialized software application that provides a set of tools required to write and test code. IDEs are becoming more and more popular as they make the process of coding/programming smooth and efficient. Additionally, IDEs help with faster coding and minimize bugs and coding mistakes. Most IDEs consist of a text editor or code editor, a compiler, and a debugger. Developers use the code editor to write and edit source code. The compiler then translates that source code into another programming language that a computer can understand. The debugger is used to test the software. Without IDEs, developers would have to use, configure, integrate and manage all of these tools separately. Some IDEs also come with other useful features, such as auto code completion, allowing developers to comment on lines of code, find references to other resources, and many more. What is a code editor? A code editor is also a software application that allows programmers to write and edit code. Code editors offer useful features, such as auto-complete, HTML tag highlight, syntax highlight, color-coding,  and many more to help programmers write and edit code more efficiently. Advanced code editors support a wide range of programming/coding languages, such as JavaScript, HTML, PHP, C++, Python, and more. What should you look for in IDE Software? Here are some of the key questions you should ask before choosing an IDE: Does your IDE offer features for faster and smarter coding? When you’re choosing an IDE, you should consider which features it offers for faster and smarter coding. Efficient IDEs like Embarcadero RAD studio offers features like auto code completion, auto code formatting, smart code navigation, auto code error detection, and more to save time and effort. Does the IDE software have an integrated toolchain? A powerful IDE like RAD Studio or Delphi is an integrated toolchain. This means the IDE provides you with all the tools (editors, compilers, and debuggers) you need for efficient software development, so you don’t have to search and buy any other additional tools or applications. Simply put, an IDE’s toolchain should include everything you need to create fully functional software. Does the IDE have efficient debugging capabilities? Good IDEs like RAD Studio or Delphi have powerful debuggers to help developers detect and fix bugs and errors in their code efficiently. RAD Studio and Delphi’s debuggers allow you to add breakpoints so that you can pause the program conditionally or at a specific location, trace the execution route of the code, inspect the current value of variables, and more. Good IDE software help you improve code quality A good IDE like RAD Studio is capable of […]

Read More

The Future of the GitLab Web IDE

Way back in April 2018, GitLab 10.7 introduced the Web IDE to the world and brought a delightful multi-file editor to the heart of the GitLab experience. Our goal was to make it easier for anyone and everyone to contribute, regardless of their development experience. Since its introduction, tens of millions of commits have been made from the Web IDE, and we’ve added features like Live Preview and Interactive Web Terminals to enhance the experience. Now, we’re excited to share some big changes we have in store for the Web IDE in coming milestones. What makes an IDE? Over the years, we’ve learned a lot about how you all are using the Web IDE. We’ve compared it to our Web Editor in the repository view. We’ve spoken to developers, designers, product managers, and technical writers alike. Almost universally, we hear that the Web IDE is great for small changes: a quick change to a config file, an update to a Markdown file, or a typo fix in a merge request. These lightweight changes make up the vast majority of the Web IDE usage. And for those use cases, it’s super convenient and intuitive. But to grow, and to really earn the moniker “IDE,” what are we missing? What keeps developers from making more complex changes in the Web IDE? What can we do to elevate the experience? We hear about missing features and functionality like a collapsible file panel that supports contextual actions and drag and drop or tighter integration with merge requests. We’ve learned that there’s no single feature that’s a deal-breaker for most developers; it’s the sum total of a lot of little user experience gaps. The Web IDE is built on top of the fantastic open source project, Monaco. What made Monaco a great choice as the foundation of the Web IDE is also what makes it more difficult to address all these concerns holistically. Monaco is just that: a foundation. We have to implement all these workflows and features ourselves. Meanwhile, another open source project has been laser-focused on delivering a lovable IDE on top of Monaco. Enter VS Code You may have heard of Visual Studio Code, or VS Code. With its dominant market share, chances are pretty good that you are even using it as your primary code editor. As it happens, VS Code core is also open sourced under the MIT license. While the core project isn’t a perfect drop-in replacement for the Web IDE, our Staff Frontend Engineer, Paul Slaughter, wanted to see if we could run it inside GitLab. Turns out, we can: In this video Paul Slaughter, Staff FE Engineer, walks Eric Schurter, Senior Product Manager, through the VS Code Web IDE proof of concept. See parts two, three, and four for closer looks at extensions, performance, and customization. As you can see in the videos above, Paul was able to build a proof of concept that brings the VS Code editing experience into the GitLab UI, running entirely in the browser. No additional infrastructure needed. Next, we asked ourselves the question: Do we want to continue to invest in implementing custom features for the Web IDE that ultimately deliver the same value as those already available in VS Code? Or do we embrace VS Code inside GitLab, and invest […]

Read More

When the pursuit of simplicity creates complexity in container-based CI pipelines

In a GitLab book club, I recently read “The Laws of Simplicity,” a great book on a topic that has deeply fascinated me for many years. The book contains an acronym that expresses simplicity generation approaches: SHE, which stands for “shrink, hide, embody.” These three approaches for simplicity generation all share a common attribute: They are all creating illusions – not eliminations. I’ve seen this illusion repeat across many, many realms of pursuit for many years. Even in human language, vocabulary development, jargon, and acronyms all simply encapsulate worlds of complexity that still exist, but can be more easily referenced in a compact form that performs SHE on the world of concepts. Any illusion has a boundary or curtain where in front of the curtain the complexity can be dealt with by following simple rules, but, behind the curtain, the complexity must be managed by a stage manager. For instance, when the magic show creates the spectre of sawing people in half, what appears to be a simple box is in fact an exceedingly elaborate contraption. Not only that, but the manufacturing process for an actual simple box and the sawing box are markedly different in terms of complexity. The manufacturing of complexity and its result are essentially the tradeoff for what would be the real-world complexity of actually sawing people in half and having them heal and stand up unharmed immediately afterward. To bring this into the technical skills realm, consider that when you leverage a third-party component or API to add functionality, you only need to know the parameters to obtain the desired result. The people maintaining that component or API must know the quantum mechanics detail level of how to perform that work in a reliable and complete way. Docker containers are a mechanism for embodying complexity, and are used in scaled applications and within container-based CI. When a CI/CD automation engineer uses container-based CI, it is possible to make things more complex and more expensive when attempting to do exactly the opposite. At its core, this post is concerned with how it can happen that pursuing a simpler world through containers can turn into an antipattern – a reversal of desired outcomes – many times, without us noticing that the reversal is affecting our productivity. The prison of a paradigm is secure indeed. The Second Law of Complexity Dynamics Over the years I have come to believe that the pursuit of reducing complexity has similar characteristics to The Second Law of Thermodynamics. The net result of a change between mass and energy results in the the same net amount of mass and energy, but their ratio and form have changed. In what I will coin “The Second Law of Complexity Dynamics,” complexity is similarly “conserved,” it is just reformed. If complexity is not eliminated by simplifying efforts, we reduce its impact in a given realm by changing the ratio of complexity and simplicity on each side of one or more curtains. But alas, complexity did not die, it just hid and is now someone else’s management challenge. It is important not to think of this as cheating. There is no question that hiding complexity carries the potential for massive efficiency gains when the world behind the hiding mechanisms becomes the realm of specialty skills and specialists. […]

Read More

Extend TMS WEB Core with JS Libraries with Andrew: Luxon

The last couple of posts covered FlatPickr, a popular and very capable datepicker JS Library.  We looked at many of its options, and looked at two completely different ways to add it to our TMS WEB Core projects.   What we didn’t really delve too much into is the whole area of date and time formats, timezones, internationalization, and the differences between date-handling in Delphi and JavaScript. Well, we did a little, but just enough to get through some examples.  This time out, we’ll go into a bit more detail and also introduce the latest JS Library to our repertoire – Luxon – which describes itself as “a powerful, modern, and friendly wrapper for JavaScript dates and times.”  I’m not at all sure that I buy the “friendly” bit, but it is indeed powerful and modern, so let’s see where it fits in. Motivation. Long-time Delphi developers are likely to be pretty familiar with TDateTime and its various advantages and shortcomings.  And even if you’re relatively new to Delphi and haven’t had much of an opportunity to interact with TDateTime, there’s not much there to trip you up and, by and large, it isn’t likely to garner much attention on its own. This is a good thing, of course. When dealing with JavaScript, however, the nice and comfy TDateTime is replaced with a rather sinister JavaScript date format that is none of these things.  Sure, it is easy enough to get started with a JavaScript date, but it really is an entirely different beast.  Moving between the two can be a challenge, and even just trying to do the tiniest bit of formatting can sometimes be a lot more trouble than might seem possible.  So in this post we’re going to go over a bunch of this kind of stuff.  Get it all out in one fell swoop, rip off the band-aid so to speak, so we can candidly and confidently move on to other topics, but have this in our back pocket when we need it.  And believe me, we’ll be needing it! Epic Epoch. Let’s dip our toe into the shallow end first and quickly go over what TDateTime is. Delphi uses the TDateTime class to encode, naturally, a date and a time.  It does this in a very simple way – by using a floating point number (specifically, a double) where the whole part of the number represents the number of days since 1899-12-30 and the fractional part of the number represents the time as a fraction of a day.  Noon would be represented as .5, 18:00 would be represented as .75, and so on.  The choice of 1899-12-30 is somewhat arbitrary, but I ran across this link which described it this way: It appears that the reason for Delphi starting at 30 Dec 1899 is to make it as compatible as possible with Excel while at the same time not adopting Excel’s incorrectness about dates. Historically, Excel played second fiddle to Lotus 1-2-3. Lotus (which may have got this error from Visicalc) incorrectly considered 1900 to be a leap year hence a value of 60 gives you 29 Feb 1900 in Excel but is interpreted as 28 Feb 1900 in Delphi due to Delphi starting 1 day before. From the 01 Mar 1901 the two date systems […]

Read More