Language Selection

English French German Italian Portuguese Spanish

Development

Programming Leftovers

Filed under
Development
  • GNU Toolchain Begins Adding ARMv8.7-A Support

    The GNU compiler toolchain has begun landing Arm's contributions around ARMv8.7-A architecture support.

    While all of the ARMv8 cores to date remain with older versions of the architecture and even cases like ARMv8.2-A with the Cortex-A78 and X1, Arm continues working on new ARMv8 revisions and getting that software support in place well ahead of hardware availability.

  • Software correctness is a lot like flossing

    Which means that they’re not seeing the bigger picture. An explanation of why programmers “don’t care about correctness” shouldn’t just be post-hoc rationalizations. Here’s my main argument for why most programmers don’t seem to care about software correctness:

    Which is worse: buggy software or a root canal?

    How often do you floss?

    Whenever I pose this in a discussion, I get the same answer: everyone thinks root canals are worse, and at most half of the group flosses daily. That’s ridiculous! Flossing takes like three minutes a day. But people don’t do it because it’s fiddly, annoying, and inconvenient. If people are unwilling to do something simple to keep their teeth from rotting, why should we expect people to use annoying inconvenient tools to improve software?

  • Javascript Alert – Linux Hint

    Javascript is the most known language of the web. Javascript is widely used in front-end development as well as in the back-end. Javascript provides a lot of built-in functions to help in development. In this article, we are going to learn one of the javascript’s built-in alert() method, which is used to show pop-ups over the screen to either display a message or show a warning. The alert box is different from any other message or text on the screen. It is a pop-up that contains a message/text with an “OK” button. The user won’t be able to do any task while an alert box is over the screen, and he/she clicks the “OK” button. So, it is not recommended, if not needed. So, let’s have a look at what is an alert box and what are the different ways to use it.

  • Javascript Print Page – Linux Hint

    Javascript is a scripting or programming language, which is most commonly used nowadays in the web industry. It provides a lot of built-in objects, functions, and methods to perform several tasks. In this article, we are going to have a look at one of them which is used to print the web page. So, let us get started!

    You must have encountered some websites that provide a button to print the whole web page, or you must have felt the need to print a web page but there is no print button there. Javascript’s built-in object window provides us a method named print(). We can use window.print() function to fulfill this requirement.

  • Planned obsolescence | Playing Perl 6␛b6xA Raku

    Twelve years ago Larry planned the obsolescence of one of my modules. His cunning plan was executed by lizmat a fortnight ago. If you are building Rakudo from source you take another shortcut now.

  • Get Started With Django Part 3: Django View Authorization – Real Python

    In part 1 of this series, you learned the fundamentals of Django models and views. In part 2, you learned about user management. In this tutorial, you’ll see how to combine these concepts to do Django view authorization and restrict what users can see and do in your views based on their roles.

    Allowing users to log in to your website solves two problems: authentication and authorization. Authentication is the act of verifying a user’s identity, confirming they are who they say they are. Authorization is deciding whether a user is allowed to perform an action. The two concepts go hand in hand: if a page on your website is restricted to logged-in users, then users have to authenticate before they can be authorized to view the page.

    Django provides tools for both authentication and authorization. Django view authorization is typically done with decorators. This tutorial will show you how to use these view decorators to enforce authorized viewing of pages in your Django site.

  • PyCharm 2020.3 EAP #3

    The third build of PyCharm 2020.3 is now available in the Early Access Program with features and fixes for a smoother, more productive experience.

    We invite you to join our EAP to try out the latest features we have coming up, test that they work properly in your environments, and help us make a better PyCharm for everyone!

  • Change Tick Frequency in Matplotlib

    Matplotlib is one of the most widely used data visualization libraries in Python. Much of Matplotlib's popularity comes from its customization options - you can tweak just about any element from its hierarchy of objects.

    In this tutorial, we'll take a look at how to change the tick frequency in Matplotlib. We'll do this on the figure-level as well as the axis-level.

  • Python Software Foundation News: Key generation and signing ceremony for PyPI

    On Friday October 30th at 11:15 AM EDT the Python Software Foundation will be live streaming a remote key generation and signing ceremony to bootstrap The Update Framework for The Python Package Index. You can click here to see what time this is in your local timezone.

    This ceremony is one of the first practical steps in deploying The Update Framework to PyPI per PEP 458.

    The Python Software Foundation Director of Infrastructure, Ernest W. Durbin III, and Trail of Bits Senior Security Engineer, William Woodruff, will be executing the runbook developed at https://github.com/psf/psf-tuf-runbook.

    For transparency purposes a live stream will be hosted from the Python Software Foundation's YouTube channel. Please subscribe to the channel to be notified when the stream is live if you'd like to follow along.

  • Generating random avatar images in Django/Python - Peterbe.com

    But most people don't have their mugshot on Gravatar.com unfortunately. But you still want to display an avatar that is distinct per user. Your best option is to generate one and just use the user's name or email as a seed (so it's always random but always deterministic for the same user). And you can also supply a fallback image to Gravatar that they use if the email doesn't match any email they have. That's where this blog post comes in.

  • How to work with Files in Python | FOSS Linux

    In this tutorial, we see how to work with files in python, such as creating files, reading data from files, writing data to files, removing, and renaming files.

  • Lang team Backlog Bonanza and Project Proposals

    A month or two back, the lang team embarked on a new initiative that we call the "Backlog Bonanza". The idea is simple: we are holding a series of meetings in which we go through every pending RFC, one by one, and try to reach some sort of determination about what to do with it. Once we've finished that, we can start in on categorizing other forms of backlog, such as tracking issues.

  • Core team membership changes

    The core team has had a few membership updates in the last month, and we wanted to provide an update.

    To start, Florian Gilcher is joining the Core team as a full member. Florian has been attending meetings as an observer since March 2019. He is the lead of the Community Events team, and has done a lot of work in the open source world, with plenty of insight to offer especially as we look to form a Rust Foundation.

    There are also two folks stepping back from the team. Carol Nichols has been a member of the team for three years, and she is stepping back to make more time for other projects in the community, including crates.io and her continued work on the Rust book. Nick Cameron has recently welcomed a second child (congratulations!) and is leaving the core team to be able to focus more on his family and his work at PingCAP. He will continue to be around in the Rust community.

  • This Week in Rust 362

Programming: Qt, PHP, JS and Bash

Filed under
Development
  • Qt 6 To Ship With Package Manager For Extra Libraries - Phoronix

    Adding to the list of changes coming with the Qt 6 toolkit, The Qt Company has now outlined their initial implementation of a package manager to provide additional Qt6 modules.

  • Qt for MCUs 1.5 released

    A new release of Qt for MCUs is now available in the Qt Installer. If you are new to Qt for MCUs, you can try it out here. Version 1.5 introduces new platform APIs for easy integration of Qt for MCUs on any microcontroller, along with an in-depth porting guide to get you going. Additionally, it includes a set of C++ APIs to load new images at runtime into your QML GUI. As with every release, 1.5 also includes API improvements and bug fixes, enhancing usability and stability.

  • KDDockWidgets v1.1 has been released! - KDAB - KDAB on Qt

    KDDockWidgets v1.1 is now available!

    Although I just wrote about v1.0 last month, the 1.1 release still managed to get a few big features.

  • KDAB TV celebrates its first year - KDAB

    A year ago KDAB started a YouTube channel dedicated to software development with Qt, C++ and 3D technologies like OpenGL. We talked to Sabine Faure, who is in charge of the program, about how it worked out so far and what we can expect in the future.

  • How to build a responsive contact form with PHP – Linux Hint

    Contact forms are commonly used in web applications because they allow the visitors of the website to communicate with the owner of the website. For most websites, responsive contact forms can be easily accessed from various types of devices such as desktops, laptops, tablets, and mobile phones.
    In this tutorial, a responsive contact form is implemented, and the submitted data is sent as an email using PHP.

  • Applying JavaScript’s setTimeout Method

    With the evolution of the internet, JavaScript has grown in popularity as a programming language due to its many useful methods. For example, many websites use JavaScript’s built-in setTimeout method to delay tasks. The setTimeout method has many use cases, and it can be used for animations, notifications, and functional execution delays.Because JavaScript is a single-threaded, translative language, we can perform only one task at a time. However, by using call stacks, we can delay the execution of code using the setTimeout method. In this article, we are going to introduce the setTimeout method and discuss how we can use it to improve our code.

  • Removing Characters from String in Bash – Linux Hint

    At times, you may need to remove characters from a string. Whatever the reason is, Linux provides you with various built-in, handy tools that allow you to remove characters from a string in Bash. This article shows you how to use those tools to remove characters from a string.

    [...]

    Sed is a powerful and handy utility used for editing streams of text. It is a non-interactive text editor that allows you to perform basic text manipulations on input streams. You can also use sed to remove unwanted characters from strings.

    For demonstration purposes, we will use a sample string and then pipe it to the sed command.

Python Programming

Filed under
Development
  • Dissecting a Web stack - The Digital Cat

    Having recently worked with young web developers who were exposed for the first time to proper production infrastructure, I received many questions about the various components that one can find in the architecture of a "Web service". These questions clearly expressed the confusion (and sometimes the frustration) of developers who understand how to create endpoints in a high-level language such as Node.js or Python, but were never introduced to the complexity of what happens between the user's browser and their framework of choice. Most of the times they don't know why the framework itself is there in the first place.
    The challenge is clear if we just list (in random order), some of the words we use when we discuss (Python) Web development: HTTP, cookies, web server, Websockets, FTP, multi-threaded, reverse proxy, Django, nginx, static files, POST, certificates, framework, Flask, SSL, GET, WSGI, session management, TLS, load balancing, Apache.
    In this post, I want to review all the words mentioned above (and a couple more) trying to build a production-ready web service from the ground up. I hope this might help young developers to get the whole picture and to make sense of these "obscure" names that senior developers like me tend to drop in everyday conversations (sometimes arguably out of turn).
    As the focus of the post is the global architecture and the reasons behind the presence of specific components, the example service I will use will be a basic HTML web page. The reference language will be Python but the overall discussion applies to any language or framework.
    My approach will be that of first stating the rationale and then implementing a possible solution. After this, I will point out missing pieces or unresolved issues and move on with the next layer. At the end of the process, the reader should have a clear picture of why each component has been added to the system.

  • Introducing AutoScraper: A Smart, Fast and Lightweight Web Scraper For Python | Codementor

    In the last few years, web scraping has been one of my day to day and frequently needed tasks. I was wondering if I can make it smart and automatic to save lots of time. So I made AutoScraper!

  • django-render-block 0.8 (and 0.8.1) released!

    A couple of weeks ago I released version 0.8 of django-render-block, this was followed up with a 0.8.1 to fix a regression.

    django-render-block is a small library that allows you render a specific block from a Django (or Jinja) template, this is frequently used for emails when you want multiple pieces of an email together in a single template (e.g. the subject, HTML body, and text body), but they need to be rendered separately before sending.

  • Pyston v2: 20% faster Python | The Pyston Blog

    We’re very excited to release Pyston v2, a faster and highly compatible implementation of the Python programming language. Version 2 is 20% faster than stock Python 3.8 on our macrobenchmarks. More importantly, it is likely to be faster on your code. Pyston v2 can reduce server costs, reduce user latencies, and improve developer productivity.

    Pyston v2 is easy to deploy, so if you’re looking for better Python performance, we encourage you to take five minutes and try Pyston. Doing so is one of the easiest ways to speed up your project.

  • Pyston v2 Released As ~20% Faster Than Python 3.8 - Phoronix

    Version 2.0 of Pyston is now available, the Python implementation originally started by Dropbox that builds on LLVM JIT for offering faster Python performance.

    Pyston developers believe their new release is about 20% faster than the standard Python 3.8 and should be faster for most Python code-bases.

  • Python int to string – Linux Hint

    Python is one of the universal languages that support various types of data types like integer, decimal point number, string, and complex number. We can convert one type of data type to another data type in Python. This data type conversion process is called typecasting. In Python, an integer value can easily be converted into a string by using the str() function. The str() function takes the integer value as a parameter and converts it into the string. The conversion of int to string is not only limited to the str() function. There are various other means of int to string conversion. This article explains the int to string conversion with various methods.

  • Python isinstance() Function – Linux Hint

    Python is one of the best and efficient high-level programming languages. It has a very straightforward and simple syntax. It has very built-in modules and functions that help us to perform the basic tasks efficiently. The Python isinstance() function evaluates either the given object is an instance of the specified class or not.

Programming Leftovers

Filed under
Development

  • PyTorch 1.7.0 Now Available - Exxact

    PyTorch is a widely used, open source deep learning platform used for easily writing neural network layers in Python enabling a seamless workflow from research to production. Based on Torch, PyTorch has become a powerful machine learning framework favored by esteemed researchers around the world.

    The newest stable release of PyTorch, version 1.7.0, has a number of new highlights including  CUDA 11, New APIs for FFTs, Windows support for Distributed training and more.

  • Stefan Scherfke: Raise … from … in Python
  • PyCoder’s Weekly: Issue #444 (Oct. 27, 2020)
  •   

  • Program in Arm6 assembly language on a Raspberry Pi | Opensource.com

    Assembly language offers special insights into how machines work and how they can be programmed.

  • How JavaScript became a serious programming language

    JavaScript's humble start began in 1995, when it was created in just 10 days by Brendan Eich, then an employee with Netscape Communications Corporation. JavaScript has come a long way since then, from a tool to make websites pretty to a serious programming language.

    In its early days, JavaScript was considered a visual tool that made websites a little more fun and attractive. Languages like Jakarta Server Pages (JSP; formerly JavaServer Pages) used to do all the heavy lifting on rendered web pages, and JavaScript was used to create basic interactions, visual enhancements, and animations.

    For a long time, the demarcations between HTML, CSS, and JavaScript were not clear. Frontend development primarily consists of HTML, CSS, and JavaScript, forming a "layer cake" of standard web technologies.

Programming Leftovers

Filed under
Development

  • Rust Lands Experimental Cranelift-Based Code Generator - Much Faster Debug Build Times - Phoronix

    Landing yesterday within the Rust code-base is the initial version of a Cranelift code generator back-end. By leveraging the Cranelift code generator that is developed as part of the Bytecode Alliance for WebAssembly, Rustc with Cranelift can experince much faster debug builds. 

    The pull request adding rustc_codegen_cranelift as an alternative code generator for the Rust compiler has been merged. When compiling Rust code with the debug mode set, this has the potential of speeding up compile times by 20~30% compared to the debug mode LLVM builds. 

  • Qt 6 Additional Libraries via Package Manager

    With Qt 6 we want to provide more flexibility via leveraging a package manager in addition to Qt Online Installer. The new package manager functionality, based on conan.io (https://conan.io), allows providing more packages to the users without increasing the complexity of the baseline Qt. In addition to the packages provided by Qt, the package manager can be used for getting content from other sources.

  • Perl Weekly Challenge 84: Reverse Integer and Find Square Matrices | laurent_r [blogs.perl.org]

    These are some answers to the Week 84 of the Perl Weekly Challenge organized by Mohammad S. Anwar.

    Spoiler Alert: This weekly challenge deadline is due in a few days (November 1, 2020). This blog post offers some solutions to this challenge, please don’t read on if you intend to complete the challenge on your own.

Python Programming

Filed under
Development
  • Equality vs Identity

    You're probably already familiar with equality: that's the == operator. identity uses the is operator.

  • Creating a Binary Search in Python – Real Python

    Binary search is a classic algorithm in computer science. It often comes up in programming contests and technical interviews. Implementing binary search turns out to be a challenging task, even when you understand the concept. Unless you’re curious or have a specific assignment, you should always leverage existing libraries to do a binary search in Python or any other language.

  • How to Set Axis Range (xlim, ylim) in Matplotlib

    Matplotlib is one of the most widely used data visualization libraries in Python. Much of Matplotlib's popularity comes from its customization options - you can tweak just about any element from its hierarchy of objects.

    In this tutorial, we'll take a look at how to set the axis range (xlim, ylim) in Matplotlib, to truncate or expand the view to specific limits.

  • On code isolation in Python | Artem Golubin

    I started learning Python in 2009, and I had a pretty challenging task and somewhat unusual use of Python. I was working on a desktop application that used PyQT for GUI and Python as the main language.

    To hide the code, I embedded Python interpreter into a standalone Windows executable. There are a lot of solutions to do so (e.g. pyinstaller, pyexe), and they all work similarly. They compile your Python scripts to bytecode files and bundle them with an interpreter into an executable. Compiling scripts down to bytecode makes it harder for people with bad intentions to get the source code and crack or hack your software. Bytecode has to be extracted from the executable and decompiled. It can also produce obfuscated code that is much harder to understand.

  • Python Software Foundation Fellow Members for Q3 2020

    It's that time of year! Let us welcome the new PSF Fellows for Q3! T

Programming: PHP, Raku and Python

Filed under
Development
  • PHP version 7.3.24RC1 and 7.4.12RC1 - Remi's RPM repository - Blog

    Release Candidate versions are available in testing repository for Fedora and Enterprise Linux (RHEL / CentOS) to allow more people to test them. They are available as Software Collections, for a parallel installation, perfect solution for such tests, and also as base packages.

    RPM of PHP version 7.4.12RC1 are available as SCL in remi-test repository and as base packages in the remi-test repository for Fedora 32-33 or remi-php74-test repository for Fedora 31 and Enterprise Linux 7-8.

    RPM of PHP version 7.3.24RC1 are available as SCL in remi-test repository and as base packages in the remi-test repository for Fedora 31 or remi-php73-test repository for Enterprise Linux.

  • PHP - Removing Specific Element from An Array – TecAdmin

    Q. How do I remove a specific element from an array using PHP.

    In this tutorial, you will learn two PHP unset() and array_splice() methods to remove specific array elements.

  • 2020.43 Release And Star

    Quite a number of releases this week(end): Alexander Kiryuhin released the Rakudo 2020.10 compiler release, Claudio Ramirez immediately provided many Linux package versions of that release, and JJ Merelo updated the standard Raku Alpine Docker image, as well as the special Raku Alpine Docker Image for testing modules by module developers.

  • Retrieving Email and Phone No. for a Desktop App from Google Contacts using Python and Gmail API | by Aritra Roy | Analytics Vidhya | Medium | Codementor

    Though python has been created by Guido van Rossum as a hobby project in the 90’s decade, it has become the most popular language now. Due to its ability to work in various fields and easy syntax python is now used in Big-Data Analysis, ML & AI, Deep-learning, image-processing as well as in web development, game development, and so on. Moreover, it has plenty of libraries which one can use to easily and quickly complete the task.

  • Working with Numbers in Python | FOSS Linux

    In this "Working for Python" tutorial, we shall see the various ways to use the Integers, Floating point numbers, and complex numbers with practical examples.

  • New book: Create Graphical User Interfaces with Python

Linux Foundation Claims It Supports Diversity

Filed under
Development

Programming: Buzzwords, Meson, Tracealyzer, LLVM, Python and Rust

Filed under
Development

  • What is DevSecOps? Everything You Need To Know About DevSecOps

    Most people are familiar with the term “DevOps,” but they don’t know how to really utilize it. There’s more to DevOps than just development and operational teams. There’s an essential element of DevOps that is often missing from the equation; IT security. Security should be included in the lifecycle of apps. 

    The reason you need to include security is that security was once assigned to one team that integrated security near the end-stages of development. Taking such a lax approach to security wasn’t such a problem when apps were developed in months or years. The average development cycle has changed quite a bit, though, and apps can be developed in a matter of days or weeks. Outdated security practices like leaving security too late can bring DevOps initiatives to their knees. 

  •   

  • Nibble Stew: The Meson Manual: Good News, Bad News and Good News

    Starting with good news, the Meson Manual has been updated to a third edition. In addition to the usual set of typo fixes, there is an entirely new chapter on converting projects from an existing build system to Meson. Not only are there tips and tricks on each part of the conversion, there is even guidance on how to get it done on projects that are too big to be converted in one go.

  • Percepio Releases Tracealyzer Visual Trace Diagnostics Solution Version 4.4 with Support for Embedded Linux

    Percepio announced the availability of Tracealyzer version 4.4 with support for embedded Linux. Tracealyzer gives developers insight during software debugging and verification at the system level by enabling visual exploratory analysis from the top down. This makes the software suitable for spotting issues during full system testing and drill down into the details to find the cause.

    Version 4.4 adds several views optimized for Linux tracing, in addition to a set of visualizations already in Tracealyzer, and leverages Common Trace Format (CTF) and the widely supported LTTng, an open source tracing framework.

  •   

  • LLVM Adds A SPIR-V CPU Runner For Handling GPU Kernels On The CPU - Phoronix

    LLVM has merged an experimental MLIR-based SPIR-V CPU runner that the developers are working towards being able to handle CPU-based execution of GPU kernels. 

    This new SPIR-V runner is built around the MLIR intermediate representation (Multi-Level Intermediate Representation) with a focus of going from GPU-focused code translated through SPIR-V and to LLVM and then executed on the CPU. The runner focus is similar to that of the MLIR-based runners for NVIDIA CUDA, AMD ROCm, and Vulkan, but just executing on the CPU itself. It was earlier this year LLVM added the MLIR-Vulkan-Runner for handling MLIR on Vulkan hardware. 

  • Python Modulo in Practice: How to Use the % Operator – Real Python

    Python supports a wide range of arithmetic operators that you can use when working with numbers in your code. One of these operators is the modulo operator (%), which returns the remainder of dividing two numbers.

  • Test & Code : Python Testing for Software Engineering 136: Wearable Technology - Sophy Wong

    Wearable technology is not just smart consumer devices like watches and activity trackers.

    Wearable tech also includes one off projects by designers, makers, and hackers and there are more and more people producing tutorials on how to get started. Wearable tech is also a great way to get both kids and adults excited about coding, electronics, and in general, engineering skills.

    Sophy Wong is a designer who makes really cool stuff using code, technology, costuming, soldering, and even jewelry techniques to get tech onto the human body.

  • Librsvg's test suite is now in Rust

    Some days ago, Dunja Lalic rewrote the continuous integration scripts to be much faster. A complete pipeline used to take about 90 minutes to run, now it takes about 15 minutes on average.

    [...]

    The most complicated thing to port was the reference tests. These are the most important ones; each test loads an SVG document, renders it, and compares the result to a reference PNG image. There are some complications in the tests; they have to create a special configuration for Fontconfig and Pango, so as to have reproducible font rendering. The pango-rs bindings do not cover this part of Pango, so we had to do some things by hand.

Open Hardware Projects With Arduino

Filed under
Development
Hardware
  • Arduino Blog » Transform a pile of clothing into the robot of your nightmares

    While whatever you heard bump in the night was probably nothing to be concerned about, if you see a suspicious blob of clothing on the floor, you might give it another look. Although not particularly dangerous, YouTuber “Sciencish” has come up with a robot that causes a pile of clothes to turn and face, then travel towards the light source you used to check it out.

    The device features four photoresistors, along with an Arduino Uno and two steppers on a robotic chassis for movement. It also accommodates a filament or wire frame on which clothing can rest. When a light is shined at it, the LDRs pick up this “signal” through the clothes. The robot then waits until the lights are off, pauses a bit more, and then rotates to face the person and incrementally advances.

  • Arduino Blog » Say hello to the new Arduino Oplà IoT Kit: Experience the Internet of Things in your hands!

    We’re excited to announce the launch of the Arduino Oplà Kit, the first open programmable IoT platform that allows you to add smart connectivity to the devices around your home or workplace and build custom IoT devices.

    The Oplà IoT Kit contains all the hardware necessary to create eight connected applications, access to an online platform with assembly instructions, and a 12-month subscription to the Arduino Create Maker Plan. This kit is perfect for beginners with basic DIY experience, while more advanced users can leverage it to customize and hack their smart applications and devices, with full control of their data and processes.

Syndicate content

More in Tux Machines

Today in Techrights

Android Leftovers

Stereoscopic cam board taps Raspberry Pi CM4

StereoPi is going to Crowd Supply to pitch an open-spec “StereoPi v2” stereoscopic camera board that works with the Raspberry Pi CM4. The v2 adds a Type-C port and advances to GbE and 802.11ac. In Dec. 2019, Russia-based Virt2real found Crowd Supply success with a StereoPi stereoscopic camera board that works with the Raspberry Pi Compute Module 3 (CM3). Now operating under the StereoPi name, the company has posted a Crowd Supply page for a second-gen model that uses the new Raspberry Pi CM4. Read more

8 Tools to Easily Create a Custom Linux Distro

When there are so many Linux distros out there, you are probably wondering why someone would want to create their own distro instead of getting a readymade one. While in most cases a readymade distro is fine, if you want to have a distro that is 100 percent tailored to your needs (or your mum or dad’s needs), you may have to create your own custom Linux distro. With the right tools, creating your own Linux distro isn’t as hard as it seems, though it takes time for sure. There are many tools for the purpose – some of them are universal, and some of them are distro-specific. Here are eight of them. Read more