Feeds

LN Webworks: 7 Reasons Why Your Drupal Site Needs Ongoing Support and Maintenance

Planet Drupal - Thu, 2024-02-01 04:52

Every security concerns, bugs, and outdated technological systems pose varying issues that need immediate addressing. That’s why you require regular Drupal support and maintenance for your website. If you miss addressing the issues promptly, your business can not only suffer losses but also lose its valuable reputation. This blog elaborates on 7 reasons why consistent Drupal support and maintenance are imperative for your Drupal site. 

Categories: FLOSS Project Planets

The OSI board expands, adding two new seats; focus on AI and international policies

Open Source Initiative - Thu, 2024-02-01 04:34

At the August board meeting, the OSI board voted to add two new appointed seats, and at the December board meeting named Professor Sayeed Choudhury and Gaël Blondelle as new board members.

The expansion of the board was voted upon to give greater operational stability and continuity to the organization. The rationale for this decision is explained in further detail in the August 2023 board meeting minutes. The new composition of the board is:

  • four directors elected among individual members (seated for two years), 
  • four directors elected among representatives of Affiliate organizations (seated for three years), and
  • four directors (previously two) appointed by the board (seated for three years).

All four board-appointed seats are carefully selected by the board based on the strategic priorities of the OSI. Professor Sayeed Choudhury and Gaël Blondelle were chosen to fill the two new board seats because of their expertise in areas that will be most relevant to the OSI in coming years: AI and international policies.

The skills and contacts Sayeed and Gaël bring to the board will serve the OSI’s mission and goals moving forward. The two new board members will also be instrumental in the fundraising efforts of the organization with their deep networks of corporate donors and grant givers.

Sayeed Choudhury

Sayeed Choudhury is the associate dean for digital infrastructure and director of the Open Source Programs Office (OSPO) at Carnegie Mellon University. He started the first OSPO based at a US university while at Johns Hopkins University. He is the director of an Alfred P. Sloan Foundation grant for coordination of University OSPOs and a co-investigator for the Black Beyond Data Project. He is the software task force leader and member of the steering committee for the Research Data Alliance (RDA) – US. Choudhury was a President Obama appointee to the National Museum and Library Services board. He has testified for the Research Subcommittee of the Congressional Committee on Science, Space and Technology.

“The Open Source Initiative plays an important role in the Open Source ecosystem from a community, legal and policy perspective,” said Choudhury. “Carnegie Mellon University has recently launched two initiatives that focus on impact from Open Source software — Ecosystem for Next Generation Infrastructure (ENGIN) and Open Forum for AI (OFAI). I look forward to partnering with the OSI board and working with the OSI membership on these initiatives and other programs being advanced by the OSI.”

Gaël Blondelle 

Gaël Blondelle joined the Eclipse Foundation in 2013 and now serves as chief membership officer. He has been involved in the Open Source arena for more than 18 years in a number of key roles. Blondelle co-founded an Open Source start-up and worked as its chief technology officer. He then worked in business development for an Open Source systems integration company and managed a strategic research project aiming to create an Open Source ecosystem with major industrial players. Blondelle joined the Eclipse Foundation to pursue his goal of helping more companies work in Open Source, and to grow open, innovative and collaborative ecosystems.

“I am honored to join the OSI board, and look forward to helping the OSI onboard more sponsors and affiliates globally,” said Blondelle. “The work being done on the Open Source AI Definition is fantastic and we need an organization like the OSI to stand for Open Source AI in an elaborated and well articulated way. At the same time, we also need to stand for the Open Source Definition (OSD) that is regularly under attack from different sides. The OSD has enabled the development of Open Source technologies over the last 25 years, and we need to make sure this continues.”

Please join us in welcoming these two new board members to the OSI!

The post <span class='p-name'>The OSI board expands, adding two new seats; focus on AI and international policies</span> appeared first on Voices of Open Source.

Categories: FLOSS Research

The Embedded Developer’s Dilemma in Choosing Hardware

Planet KDE - Thu, 2024-02-01 04:00

When designing an embedded product, there’s a lot riding on those crucial first decisions of choosing a hardware vendor and board. Clearly, the hardware you select must be powerful enough to support your product, a challenging determination given that software is usually still in the planning stages at this point in the process. Plus, planning for post-launch capabilities that may be on the drawing board creates additional uncertainty as to how much power you’ll need. However, overspending on beefed up capacity that you will never use costs money, impacting the company’s bottom line.

Optimizing time spent optimizing

It’s not that you can’t change the hardware midstream, but it often takes a while to realize that the existing platform isn’t going to fit. Until hardware constraints become too problematic to ignore, software engineers can waste time working around a limited platform, struggling to debug it properly, and ultimately delivering a suboptimal product. A midstream hardware change stalls development, curtails developer creativity, and forces further software adaptations, elongating the development timeline and adding costs.

When underpowered means underdelivering

However, a more severe problem arises when teams fail to recognize the need for a hardware upgrade. Building around a less powerful chip to keep down costs can stifle feature sets and cripple performance. This can trap software teams into spending more time working on costly workarounds than on making forward progress. Operating at the edge of a usable system often results in feature cuts and time spent building makeshift solutions that lead to poor product quality, diminished user experience, and a codebase filled with workarounds. This creates deep holes that are nearly impossible to dig out of.

Right-sizing your silicon

Oof. Okay, what to do about it? Here a few guidelines that may help:

  • Carefully weigh your processing power, RAM, storage capacity, and I/O needs against the potential impacts they can make on development deadlines. As code size approaches onboard storage and RAM capacity, the time and effort to make things work grows exponentially. This is also the case for ongoing maintenance where preserving some headroom for additional features and fixes is essential.
  • Highly complex feature sets like user-configurable capabilities, new over-the-air updates, or 3D visualizations consume RAM and storage space much faster than other areas. Estimate generously to avoid the risk of having an amazing feature that can barely fulfil its promise.
  • Any embedded system is going to be connected to a raft of sensors, peripherals, and physical buttons. Detailed I/O planning is crucial to ensure your systems have enough GPIOs, A/Ds, D/As, UARTs, and USB, SPI, and I2C ports. Be sure to consider product expansions such as additional product lines and feature upgrades. Planning for some spare I/O capacity through expansion boards or modules early on can mitigate significant coding and reliability issues later on.
  • Boards with additional peripherals, even if not currently required, can add value down the line. For example, an extra USB port can be a huge advantage during development for networking or additional storage, and onboard Bluetooth can enable future customer-requested features.
Critical choices shouldn’t be rushed

The intersection of hardware capability and software design is where successful embedded systems are born. Thoughtful hardware selection, a forward-looking approach to product design, and an integrated hardware-software development strategy are critical to a strong start in your embedded project. By prioritizing these considerations, you’re well positioned to deliver a product that meets current requirements in a reasonable amount of time and is adaptable for future demands.

We recommend reading a couple of our best practice guides, Designing Your First Embedded Linux Device and Best Practices: Embedded Development Hardware, which addresses this topic in more detail along with other best practices to get your project started on the right foot.

 

About KDAB

If you like this article and want to read similar material, consider subscribing via our RSS feed.

Subscribe to KDAB TV for similar informative short video content.

KDAB provides market leading software consulting and development services and training in Qt, C++ and 3D/OpenGL. Contact us.

The post The Embedded Developer’s Dilemma in Choosing Hardware appeared first on KDAB.

Categories: FLOSS Project Planets

Russ Allbery: Review: System Collapse

Planet Debian - Thu, 2024-02-01 01:06

Review: System Collapse, by Martha Wells

Series: Murderbot Diaries #7 Publisher: Tordotcom Copyright: 2023 ISBN: 1-250-82698-5 Format: Kindle Pages: 245

System Collapse is the second Murderbot novel. Including the novellas, it's the 7th in the series. Unlike Fugitive Telemetry, the previous novella that was out of chronological order, this is the direct sequel to Network Effect. A very direct sequel; it picks up just a few days after the previous novel ended. Needless to say, you should not start here.

I was warned by other people and therefore re-read Network Effect immediately before reading System Collapse. That was an excellent idea, since this novel opens with a large cast, no dramatis personae, not much in the way of a plot summary, and a lot of emotional continuity from the previous novel. I would grumble about this more, like I have in other reviews, but I thoroughly enjoyed re-reading Network Effect and appreciated the excuse.

ART-drone said, “I wouldn’t recommend it. I lack a sense of proportional response. I don’t advise engaging with me on any level.”

Saying much about the plot of this book without spoiling Network Effect and the rest of the series is challenging. Murderbot is suffering from the aftereffects of the events of the previous book more than it expected or would like to admit. It and its humans are in the middle of a complicated multi-way negotiation with some locals, who the corporates are trying to exploit. One of the difficulties in that negotiation is getting people to believe that the corporations are as evil as they actually are, a plot element that has a depressing amount in common with current politics. Meanwhile, Murderbot is trying to keep everyone alive.

I loved Network Effect, but that was primarily for the social dynamics. The planet that was central to the novel was less interesting, so another (short) novel about the same planet was a bit of a disappointment. This does give Wells a chance to show in more detail what Murderbot's new allies have been up to, but there is a lot of speculative exploration and detailed descriptions of underground tunnels that I found less compelling than the relationship dynamics of the previous book. (Murderbot, on the other hand, would much prefer exploring creepy abandoned tunnels to talking about its feelings.)

One of the things this series continues to do incredibly well, though, is take non-human intelligence seriously in a world where the humans mostly don't. It perfectly fills a gap between Star Wars, where neither the humans nor the story take non-human intelligences seriously (hence the creepy slavery vibes as soon as you start paying attention to droids), and the Culture, where both humans and the story do.

The corporates (the bad guys in this series) treat non-human intelligences the way Star Wars treats droids. The good guys treat Murderbot mostly like a strange human, which is better but still wrong, and still don't notice the numerous other machine intelligences. But Wells, as the author, takes all of the non-human characters seriously, which means there are complex and fascinating relationships happening at a level of the story that the human characters are mostly unaware of. I love that Murderbot rarely bothers to explain; if the humans are too blinkered to notice, that's their problem.

About halfway into the story, System Collapse hits its stride, not coincidentally at the point where Murderbot befriends some new computers. The rest of the book is great.

This was not as good as Network Effect. There is a bit less competence porn at the start, and although that's for good in-story reasons I still missed it. Murderbot's redaction of things it doesn't want to talk about got a bit annoying before it finally resolved. And I was not sufficiently interested in this planet to want to spend two novels on it, at least without another major revelation that didn't come. But it's still a Murderbot novel, which means it has the best first-person narrative voice I've ever read, some great moments, and possibly the most compelling and varied presentation of computer intelligence in science fiction at the moment.

There was no feed ID, but AdaCol2 supplied the name Lucia and when I asked it for more info, the gender signifier bb (which didn’t translate) and he/him pronouns. (I asked because the humans would bug me for the information; I was as indifferent to human gender as it was possible to be without being unconscious.)

This is not a series to read out of order, but if you have read this far, you will continue to be entertained. You don't need me to tell you this — nearly everyone reviewing science fiction is saying it — but this series is great and you should read it.

Rating: 8 out of 10

Categories: FLOSS Project Planets

Paul Wise: FLOSS Activities January 2024

Planet Debian - Thu, 2024-02-01 00:54
Focus

This month I didn't have any particular focus. I just worked on issues in my info bubble.

Changes
  • OpenStreetMap: fixed a bunch of broken website URLs
  • Debian pass-otp: oathtool safety
  • reportbug: fix crash
  • Debian BTS usertags: fix Python, Ruby, QA, porter, archive, release tags
  • Debian wiki pages: TransitionUploadHook
Issues Review
  • Debian BTS usertags: changes for the month
  • Debian screenshots:
Administration
  • Debian wiki: unblock IP addresses, approve accounts
Communication
  • Respond to queries from Debian users and contributors on the mailing lists and IRC
Sponsors

All work was done on a volunteer basis.

Categories: FLOSS Project Planets

Drupalize.Me: Part 4: Utility Components in Drupal (Spotlight on Symfony in Drupal)

Planet Drupal - Wed, 2024-01-31 19:03
Part 4: Utility Components in Drupal (Spotlight on Symfony in Drupal)

We've made it to the final blog post (for now?) in our spotlight on Symfony in Drupal. In this blog post, we'll take a look at Symfony's utility components. We're using this term to group together Symfony components that provide useful functionality. It's a great idea to familiarize yourself with these. You can make use of them in your own modules, or bring them into other PHP application code.

Blake Hall Wed, 01/31/2024 - 18:03
Categories: FLOSS Project Planets

The Python Coding Blog: Why Should Only The Grown-Ups Have Fun With Python?

Planet Python - Wed, 2024-01-31 18:29

If you’re reading this, you’re possibly familiar with my Python work for adults. What you may not know is that most of my time over the past 8 years has been devoted to teaching Python to children and teenagers.

I didn’t like how coding was taught to kids (and still is in most places). It was either too limited and gimmicky, using children-specific platforms that only have a loose resemblance to real programming. Or they taught coding in a “classic” style, with dry and boring exercises.

I felt there was the need to treat coding for children seriously, like a proper modern academic subject. So I set out to create a curriculum and teaching style specifically suited for coding for young people, covering the subject thoroughly but also making it engaging, creative, and yes, fun!

And this is what I’ve been doing for many years, having taught thousands of students!

And now, this curriculum and my very own teaching style is available to teenagers and preteens all around the world through my new platform, Codetoday Unlimited. There are video courses starting from the basics but stretching all the way to intermediate and advanced levels, because curious and ambitious young learners are often frustrated they can’t find resources for their age group that goes beyond the basics.

And there’s a forum where I can interact with the students, where they can ask questions and get feedback.

And the first two levels, 10 hours of video courses, are free for anyone, anywhere.

If you know teenagers or preteens who want to take coding in Python seriously, perhaps they’re bored of the children’s platforms, then get them to try Codetoday Unlimited.

Visit Codetoday Unlimited

The post Why Should Only The Grown-Ups Have Fun With Python? appeared first on The Python Coding Book.

Categories: FLOSS Project Planets

Dirk Eddelbuettel: dtts 0.1.2 on CRAN: Maintenance

Planet Debian - Wed, 2024-01-31 18:02

Leonardo and I are happy to announce the release of a very minor maintenance release 0.1.2 of our dtts package which has been on CRAN for a little under two years now.

dtts builds upon our nanotime package as well as the beloved data.table to bring high-performance and high-resolution indexing at the nanosecond level to data frames. dtts aims to offers the time-series indexing versatility of xts (and zoo) to the immense power of data.table while supporting highest nanosecond resolution.

This release follows yesterday’s long-awaited release of data.table version 1.5.0 which had been some time in the making as the first new major.minor release since Matt drifted into being less active and the forefront. The release also renamed the one C-level API accessor to data.table (which was added, if memory serves, by Leonardo with our use in mind). So we have to catch up to the renamed identifier; this release does that, and adds a versioned imports statement on data.table.

The short list of changes follows.

Changes in version 0.1.2 (2024-01-31)
  • Update the one exported C-level identifier from data.table following its 1.5.0 release and a renaming

  • Routine continuous integration updates

Courtesy of my CRANberries, there is also a report with diffstat for this release. Questions, comments, issue tickets can be brought to the GitHub repo.

If you like this or other open-source work I do, you can now sponsor me at GitHub.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.

Categories: FLOSS Project Planets

GNU Taler news: GNU libmicrohttpd 1.0 released

GNU Planet! - Wed, 2024-01-31 18:00
We are glad to announce the release of GNU libmicrohttpd v1.0, and future plans for the library.
Categories: FLOSS Project Planets

GNU Taler news: NLnet open call with funding opportunities for GNU Taler integrators

GNU Planet! - Wed, 2024-01-31 18:00
Join us on our journey towards informational self-determination in payments! As part of NGI TALER, NLnet Foundation is running an open call and will award grants to third parties working on GNU Taler enhancements globally. The application process is simple and the first submission deadline is April 1st 2024.
Categories: FLOSS Project Planets

The Drop Times: Behind the Scenes: Drupal's Footprint in Top Universities

Planet Drupal - Wed, 2024-01-31 10:34
A walkthrough of the behind-the-scenes tasks executed (with code examples and the tools we used in this exercise) to generate the preliminary dataset for analyzing Drupal usage among the top 300 universities. This blog covers everything from selecting the university ranking to generating a CSV file with the universities and their Drupal usage.
Categories: FLOSS Project Planets

Drupal Association blog: Why DrupalCon Portland 2024 is a Must-Attend Event

Planet Drupal - Wed, 2024-01-31 10:20

DrupalCon is the most significant open-source tech event in North America. Mark your calendars, as DrupalCon Portland is returning to the City of Roses this 6-9 May 2024! Whether you're a seasoned Drupal pro or just starting your open-source journey, DrupalCon Portland 2024 has something for everyone.

You might wonder why you should attend DrupalCon. Read on to learn why DrupalCon Portland 2024 is a must-attend event!

Elevate Your Skills

Power up your expertise! DrupalCon Portland will gather the brightest minds in the Drupal ecosystem. Attend mind-bending sessions, interactive workshops, and cutting-edge keynotes to amplify your skills. Elevate your Drupal game and bring a competitive edge to your projects. You’ll also have access to job fairs and opportunities to develop your resume. Students and recent alums of universities, colleges, high schools, trade schools, and Drupal training programs can take advantage of $50 student-priced tickets!

Forge Powerful Connections

Connect and conquer! DrupalCon isn’t just about code; it's about connections. Network with industry leaders, fellow developers, and creative minds. Forge partnerships, exchange ideas, and immerse yourself in a community that fuels success. Your next extensive collaboration might just be a handshake away.

Ride the Wave of Drupal Trends and AI

Stay ahead of the curve! DrupalCon is your gateway to the latest trends in Drupal. From groundbreaking features to emerging technologies, ride the wave of innovation. Gain insights into the future of Drupal and position yourself as a pioneer in the ever-evolving tech landscape.

Unleash the Drupal Spirit

It is more than an event – it's a celebration! DrupalCon is where the Drupal spirit comes to life. Engage in fun activities, socialize with like-minded individuals for robust conversations, and celebrate the strength of our community. Let's make memories together at DrupalCon Portland 2024!

Vibrant social after-hour events

Unwind and celebrate with the community at after-hours gatherings and explore the charming city of Portland. This year’s event will have a revamped Welcome Reception party with interactive elements and an exciting Trivia night on Thursday! There are also sponsored events from our partners for attendees to enjoy.

For more details on DrupalCon Portland 2024, register for the event on 6 February! We can’t wait to see you in the City of Roses.

Categories: FLOSS Project Planets

Bits from Debian: New Debian Developers and Maintainers (November and December 2023)

Planet Debian - Wed, 2024-01-31 10:00

The following contributors got their Debian Developer accounts in the last two months:

  • Alexandre Detiste (tchet)
  • Amin Bandali (bandali)
  • Jean-Pierre Giraud (jipege)
  • Timthy Pearson (tpearson)

The following contributor was added as Debian Maintainer in the last two months:

  • Safir Secerovic

Congratulations!

Categories: FLOSS Project Planets

Tag1 Consulting: Moving from Drupal 7 to Drupal 10: Managing Complex File and Media Migrations

Planet Drupal - Wed, 2024-01-31 09:00

In our latest Tag1 Team Talk, our Drupal migration experts delve into the intricacies of migrating media and files in the context of moving from Drupal 7 to Drupal 10. With Drupal 7 nearing its end of life and Drupal 10 in General Availability, this discussion is more relevant than ever! Hosted by Janez Urevc, Strategic Growth and Innovation Manager at Tag1, and featuring key Drupal contributors Lucas Hedding and Mauricio Dinarte, this talk offers an in-depth look into the world of Drupal migrations. The episode covers various critical aspects, including the evolution of the media landscape from Drupal 7 to Drupal 10, the challenges in migrating locally stored versus remote media, and handling inline embedded media. Additionally, our guests provide practical advice on leveraging Rsync for efficient file transfers, managing large file libraries, and dealing with unique challenges such as remote media migrations and cloud storage solutions like S3. Gain valuable insights from anecdotes shared by the experts, highlighting real-world scenarios and problem-solving techniques used in their migration projects. This episode is a must-watch for anyone involved in Drupal migrations, offering expert guidance to navigate this complex but essential process. Watch now to enhance your understanding of Drupal migrations...

Read more janez Wed, 01/31/2024 - 06:00
Categories: FLOSS Project Planets

Real Python: Python's Format Mini-Language for Tidy Strings

Planet Python - Wed, 2024-01-31 09:00

When you’re doing string interpolation in your Python code, you often need to format the interpolated values to meet some formatting requirements. To do this, Python provides what is known as the format mini-language, which defines the syntax of a format specifier.

Perhaps you’re comfortable working with strings, but you want to take even more control of them. With proficiency in the format mini-language, you’ll be able to use format specifiers to do things like formatting numbers as currency values, using scientific notation, expressing a value as a percentage, and so much more.

In this tutorial, you’ll:

  • Learn the format mini-language syntax
  • Align and fill textual output in your code
  • Convert between data types in your outputs
  • Provide format fields dynamically
  • Format numeric values in different ways

To get the most out of this tutorial, you should be familiar with Python’s string interpolation tools, such as the str.format() method and f-strings.

Get Your Code: Click here to download the free sample code that shows you how to use Python’s format mini-language for strings.

Using String Interpolation and Replacement Fields

When you’re working with strings, it’s common that you need to embed or insert values and objects into your strings so that you can build new strings dynamically. This task is commonly known as string interpolation.

In Python, you’ll find three popular tools that allow you to perform string interpolation:

  1. The modulo operator (%)
  2. The str.format() method
  3. F-string literals

The modulo operator is sort of an old-fashioned tool. It was the first string interpolation tool in Python. Unfortunately, it doesn’t provide many string formatting features. So, in this tutorial, you’ll focus on the str.format() method and f-strings.

To dynamically interpolate a value into a string, you need something called replacement fields. In both str.format() and f-strings, curly braces ({}) delimit replacement fields. Inside these braces, you can put a variable, expression, or any object. When you run the code, Python replaces the field with the actual value.

Anything not contained in braces is considered literal text, and Python copies it unchanged to the output.

In the following sections, you’ll learn how replacement fields work in str.format() and f-strings.

The str.format() Method

You can use str.format() to interpolate values into your strings. This method operates on a string object where you insert replacement fields as needed. Then Python interpolates the arguments to .format() into the string to build the final string dynamically:

Python >>> "Hello, {}!".format("Pythonista") 'Hello, Pythonista!' Copied!

In this example, you have a string containing a replacement field. Then, you call .format() with a single argument. When you run this code, the method inserts its argument into the replacement field and builds a final string.

You can use .format() in several ways. In the example above, the replacement field is empty. However, you can use zero-based indices to define a specific insertion order. You can also use named fields:

Python >>> "Hello, {0}! Good {1}!".format("Pythonista", "morning") 'Hello, Pythonista! Good morning!' >>> "Hello, {name}! Good {moment}!".format( ... name="Pythonista", moment="morning" ... ) 'Hello, Pythonista! Good morning!' Copied!

In the first example, you use integer indices to define the order in which you want to insert each argument into the replacement fields. In the second example, you use explicit argument names to insert the values into the final string.

The Python documentation uses the following Backus–Naur form (BNF) notation to define the syntax of a replacement field for the .format() method:

BNF Grammar replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" Copied!

From this BNF rule, you can conclude that the field name is optional. After that, you can use an exclamation mark (!) to provide a quick conversion field. This field can take one of the following forms:

  • !s calls str() on the argument.
  • !r calls repr() on the argument.
  • !a calls ascii() on the argument.
Read the full article at https://realpython.com/python-format-mini-language/ »

[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

Categories: FLOSS Project Planets

Revisited i18n with CMake

Planet KDE - Wed, 2024-01-31 08:39

With Qt 6.2, we introduced a new CMake API to handle internationalization (i18n) of Qt-based projects: qt_add_translations, qt_add_lupdate and qt_add_lrelease. These functions have shortcomings that we address in the upcoming Qt 6.7 release.

Categories: FLOSS Project Planets

Zero to Mastery: Python Monthly Newsletter 💻🐍

Planet Python - Wed, 2024-01-31 05:00
49th issue of Andrei Neagoie's must-read monthly Python Newsletter: Weekend Project Idea, Python + A.I., Why Type_Checking, and much more. Read the full newsletter to get up-to-date with everything you need to know from last month.
Categories: FLOSS Project Planets

Programiz: Python Program to Compute the Power of a Number

Planet Python - Wed, 2024-01-31 04:56
In this example, you will learn to compute the power of a number.
Categories: FLOSS Project Planets

Pages