Feeds

The Drop Times: Drupal GovCon 2024: The Heartbeat of the DC Drupal community

Planet Drupal - Mon, 2024-08-12 09:12
Drupal GovCon 2024 kicks off tomorrow in Washington, D.C., uniting professionals from government, non-profits, education, and the private sector for a free, three-day conference. With over 800 participants expected, this event promises rich sessions, networking opportunities, and insights from the organizers, shared exclusively with The DropTimes, the official media partner.
Categories: FLOSS Project Planets

Mike Driscoll: Creating Progress Bars in Your Terminal with Python and Textual

Planet Python - Mon, 2024-08-12 08:21

The Textual package is a great way to create GUI-like applications with Python in your terminal. These are known as text-based user interfaces or TUIs. Textual has many different widgets built-in to the framework.

One of those widgets is the ProgressBar. If you need to show the progress of a download or long-running process, then you will probably want to use a progress bar or some kind of spinner widget to show the user that your application is working.

This tutorial will show you how to create a simple progress bar with Textual!

Installation

If you do not have Textual installed yet, you can get it by using Python’s handy pip tool. Open up your terminal and run the following command there:

python -m pip install textual

Textual will get installed, along with all its dependencies. You may want to create a virtual environment first and install Textual there.

Creating a ProgressBar in Textual

Creating a progress bar with Textual is pretty straightforward. The following code is based on an example from the Textual documentation. The main difference is that this version uses a button to start the timer, simulating a download or some other long-running process rather than catching a key event.

You can copy this code into your favorite Python editor and give it a quick study:

# progressbar_demo.py from textual.app import App, ComposeResult from textual.containers import Center, Middle from textual.timer import Timer from textual.widgets import Button, ProgressBar class Progress(App[None]): timer = Timer def compose(self) -> ComposeResult: with Center(): with Middle(): yield ProgressBar() yield Button("Start") def on_mount(self) -> None: """ Set up the timer to simulate progress """ self.timer = self.set_interval(1 / 10, self.advance_progressbar, pause=True) def advance_progressbar(self) -> None: """ Called to advance the progress bar """ self.query_one(ProgressBar).advance(1) def on_button_pressed(self) -> None: """ Event handler that is called when button is pressed """ self.query_one(ProgressBar).update(total=100) self.timer.resume() if __name__ == "__main__": app = Progress() app.run()

The compose() method is kind of fun as it uses both the Center() and the Middle() containers to position the widgets in the middle of the terminal. You then set up the timer object in on_mount() and you start the timer in on_button_pressed()which is the Button widget’s event handler.

When you run this code, you will initially see what’s known as an indeterminate progress bar. What that means is that Textual doesn’t have any information about how long the progress is, so the progress bar just shows a kind of “bouncing” or “cycling” progress:

When you press the “Start” button, you will see the progress bar go from 0-100%, and the text fields to the right will update as well:

If you want to make your progress bar stand out, add a gradient. A gradient will make the colors of the progress bar change over time and make the widget look neat!

Wrapping Up

Adding a progress bar or simply showing some kind of informational widget that lets the user know your application is working is always a good idea. You don’t want the user to think the application has crashed or frozen. The user might be forced to close the application and lose their information after all!

Fortunately, Textual makes adding a progress bar easy. Not only is it easy, but the progress bar is easy to update so you can accurately give the user a sense of when the work will be done. Give it a try and see what you think!

Related Reading

Want to learn more about Textual? Check out the following articles:

The post Creating Progress Bars in Your Terminal with Python and Textual appeared first on Mouse Vs Python.

Categories: FLOSS Project Planets

The Drop Times: Latest Breakthroughs in the Drupal Starshot Initiative

Planet Drupal - Mon, 2024-08-12 04:00
<p class="dropcaps">The Drupal Starshot Initiative, introduced at DrupalCon Portland, is making significant strides in defining its direction and goals. Recently, <a href="https://www.thedroptimes.com/42164/drupal-announces-new-track-leads-starshot-project-advancement">the initiative announced the creation of "tracks"</a> to concentrate development efforts on specific areas. This approach is set to streamline progress and ensure that each aspect of the project receives the attention it needs.</p><p>The Drupal community's response has been robust, with nearly 65 submissions for leadership roles within these tracks. Leaders have been selected, drawing expertise from a diverse set of companies. However, three tracks are still in search of leadership, and the project remains focused on evolving through community-driven collaboration.</p><p>Our founder, Anoop John, <a href="https://youtu.be/aU2Hueh6i-s">conducted an interview</a> with Dries Butyaert at the beginning of July, which we <a href="https://www.thedroptimes.com/interview/41572/chief-who-drives-and-driven-drupal-talk-with-dries-buytaert">published on July 18</a>. In it, Dries, optimistic about the path the initiative is taking, said:&nbsp;</p><blockquote><p><em>"We have been working hard on the Starshot initiative, dedicating around six hours a day to it. We have made a lot of progress."</em></p></blockquote><p>and we are witnessing that enthusiasm spreading like wildfire in the community. As detailed in Dries Buytaert's <a href="https://www.thedroptimes.com/42132/drupal-starshot-new-strategy-marketers">blog post</a>, the Starshot Initiative—currently a temporary name—targets empowering marketers and expanding Drupal's market presence. Aimed at projects with budgets between $30,000 and $120,000 USD, the initiative focuses on ease of use, flexibility, smart defaults, and strong integrations, making Drupal a gold standard for marketers. Key features include AI-assisted tools, advanced content modeling, and efficient content reuse, all designed to help marketers scale their sites without being hindered by technical limitations.</p><p><span style="box-sizing:border-box;margin:0;padding:0;text-align:left;">The&nbsp;</span><a href="https://www.thedroptimes.com/42104/drupal-starshot-initiative-introduces-new-contribution-bonuses" target="_blank"><span style="box-sizing:border-box;margin:0;padding:0;text-align:left;">Drupal Starshot Initiative has introduced new contribution bonuses</span></a><span style="box-sizing:border-box;margin:0;padding:0;text-align:left;"> to encourage community involvement further</span>. These bonuses are designed to reward those who lead and contribute to the project, leveraging Drupal's powerful contribution credit system. This includes 10 credits per issue for contributions to specific Starshot modules, 50 credits per week for organizational pledges of dedicated team members, and 1 credit per $100 invested in the innovation fund, starting from a $5,000 minimum.</p><p>Looking ahead, the impact of Drupal 11 and the Starshot Initiative on web development is expected to be profound. Drupal 11 brings innovations such as improved APIs, a revamped admin interface, and enhanced performance, making it more powerful and user-friendly. Starshot builds on this by simplifying installation and configuration, making Drupal accessible even to newcomers.</p><p>As the community continues to work hard on Starshot, anticipation is building for more updates at DrupalCon Barcelona in September. Dries hinted that they hope to showcase real progress, from marketing efforts to the first implementation of "recipes," one of the key technical components of Starshot.</p><p>Now, let's explore what <em>The Drop Times</em> has been reporting on over the past week.</p><p><a href="https://www.thedroptimes.com/41622/which-cms-powers-top-us-university-websites-comprehensive-analysis">A comprehensive study by The Drop Times</a> reveals that 35.4% of U.S. universities prefer Drupal for its flexibility and robust community support. The study highlights Drupal's growing role in academic content management.</p><p><a href="https://www.thedroptimes.com/interview/42044/resurrected-with-resilience-dallas-ramsdens-drupal-legacy">In a conversation</a> with <em><strong>Elma John</strong></em>, a former sub-editor with <em>The DropTimes</em>, <a href="/people/32359/dreambubbler" data-entity-type="node" data-entity-uuid="20d35642-6e8c-4a72-baa3-e3000e862103" data-entity-substitution="canonical">Dallas Ramsden</a>, CEO of Xequals, shares his 16-year journey with Drupal, including surviving a life-threatening accident and transitioning to teaching. His story is one of resilience and dedication to the Drupal community.</p><p><strong>Alka Elizabeth</strong>, sub-editor at The Drop Times, <a href="https://www.thedroptimes.com/42015/closer-look-at-ffws-transition-jakala">reports on JAKALA, a leading data and AI company, acquiring digital experience solutions provider FFW.</a> This deal, the largest non-public digital agency acquisition in Europe for 2023, significantly expands JAKALA's global workforce and market position.</p><p>The Drupal Association has introduced the <a href="https://www.thedroptimes.com/42169/drupals-starshot-edition-bounty-program-seeks-accelerate-contribution-and-reward-innovation">Starshot Edition of its Bounty Program</a>, offering credits to contributors for their involvement in key projects. This initiative aims to accelerate progress within the community.</p><p><a href="https://www.thedroptimes.com/42098/drupal-ai-module-alpha-6-update-released">The AI Module in Drupal has launched its Alpha 6 update,</a> including most core functionalities. A series of instructional videos has been created to help users navigate these new features.</p><p><a href="https://www.thedroptimes.com/42102/introducing-dresktop-multi-platform-tool-drupal-project-management">Jose Daniel Estrada introduces Dresktop</a>, a desktop application designed to simplify Drupal project management, inspired by Acquia Desktop and other tools.</p><p><a href="https://www.thedroptimes.com/42133/drupalorg-outage-resolved-after-brief-downtime">The Drupal.org website experienced a brief outage</a>, but thanks to swift action, the issue was promptly resolved, with insights from <a href="/people/27085/hestenet" data-entity-type="node" data-entity-uuid="a83a1737-f31e-4f40-8f7b-2d0c7228bedb" data-entity-substitution="canonical">Tim Lehnen</a>, CTO of the Drupal Association.</p><p>Acquia and other sponsors will <a href="https://www.thedroptimes.com/42031/drupal-govcon-community-party-in-college-park">host a community party for Drupal GovCon attendees on August 13</a>. The event promises an evening of relaxation and networking.</p><p><a href="https://www.thedroptimes.com/42153/last-chance-submit-sessions-twin-cities-drupal-camp-2024">Session proposals for Twin Cities Drupal Camp 2024 are open until August 15</a>. The camp, taking place at the University of Minnesota, encourages last-minute submissions.</p><p><a href="https://www.thedroptimes.com/42168/visit-droptimes-stall-at-drupal-govcon-2024">The Drop Times will participate in Drupal GovCon from August 13 to 15</a>, inviting attendees to discuss the latest trends in Drupal and digital governance at our stall.</p><p>With DrupalCon Barcelona 2024 approaching, <a href="https://www.thedroptimes.com/42079/drupalcon-barcelona-2024-register-now-regular-rate">attendees are encouraged to secure their tickets at the regular rate</a> before August 19 for significant savings.</p><p>DrupalCon Singapore 2024 will be held from December 09 to 11, <a href="https://www.thedroptimes.com/42129/drupalcon-singapore-2024-agenda-released">featuring a wide array of sessions tailored to the Drupal community</a>.</p><p><a href="https://www.thedroptimes.com/42097/drupal-tech-talk-37-be-held-in-tilburg-september-5">The 37th Drupal Tech Talk will take place on September 5, 2024</a>, at Spoorlaan 348 in Tilburg at 19:00 CEST. Hosted by <a href="/organization/14123/indicia" data-entity-type="node" data-entity-uuid="2b89aed5-bc5a-46b2-ac70-f89061095844" data-entity-substitution="canonical">Indicia</a> and organized by <a href="/organization/19104/finalist" data-entity-type="node" data-entity-uuid="c470dfbd-89db-4300-b989-4b3a1d4b26bf" data-entity-substitution="canonical">Finalist</a>, <a href="/organization/19339/react-online" data-entity-type="node" data-entity-uuid="2a5e3872-c5a2-4b50-8e22-475659cc6ad2" data-entity-substitution="canonical">React Online</a>, <a href="/organization/20011/swis" data-entity-type="node" data-entity-uuid="6546e414-fe75-40bb-acef-8d376b614fc8" data-entity-substitution="canonical">SWIS</a>, and <a href="/organization/19533/synetic" data-entity-type="node" data-entity-uuid="c3fa64e1-ea1a-4a90-8e1d-fe355452b3c9" data-entity-substitution="canonical">Synetic</a>, this meetup promises insightful sessions, networking, and community building. Dutch Drupal developers will gather to share experiences, learn from experts, and enjoy food and drinks.</p><p>We acknowledge that there are more stories to share. However, due to selection constraints, we must pause further exploration for now.</p><p>To get timely updates, follow us on <a href="https://www.linkedin.com/company/the-drop-times/">LinkedIn</a>, <a href="https://twitter.com/thedroptimes">Twitter</a> and <a href="https://www.facebook.com/thedroptimes">Facebook</a>. You can also, join us on Drupal Slack at <a href="https://drupal.slack.com/archives/C04A6AZGYF6">#thedroptimes</a>.</p><p>Thank you,<br>Sincerely<br><strong>KAZIMA ABBAS</strong><br><strong>Sub-editor, </strong><em><strong>The DropTimes</strong></em><strong>.</strong></p>
Categories: FLOSS Project Planets

Zato Blog: How to correctly integrate APIs in Python

Planet Python - Mon, 2024-08-12 04:00
How to correctly integrate APIs in Python 2024-08-12, by Dariusz Suchojad

Understanding how to effectively integrate various systems and APIs is crucial. Yet, without a dedicated integration platform, the result will be brittle point-to-point, spaghetti integrations, that never lead to good outcomes.

Read this article about Zato, an open-source integration platform in Python, for an overview of what to avoid and how to do it correctly instead.

More blog posts
Categories: FLOSS Project Planets

Golems GABB: Scaling and Performance Optimization of Drupal

Planet Drupal - Mon, 2024-08-12 03:24
Scaling and Performance Optimization of Drupal Editor Mon, 08/12/2024 - 10:24

The future is not distant anymore, so what kind of "good Drupal performance and scalability" can we expect in 2024? Moreover, what implementations can be done via Drupal's features and options to impress an online audience?
Nowadays, in the era of digital content, a website should be ultramodern in both presentation and performance. Consumers prefer easy experiences. Hence, the ability of an organization to do this for them is a critical factor in service delivery. Regarding the user side of the services, sites should hold up with rapid traffic growth, constantly upgrade, and provide users with a wide range of features.
Moreover, such a growing level of cross-communication may not only meet those expectations but also go far beyond them to help organizations grow in the digital domain. 

Categories: FLOSS Project Planets

Freexian Collaborators: Monthly report about Debian Long Term Support, July 2024 (by Roberto C. Sánchez)

Planet Debian - Sun, 2024-08-11 20:00

Like each month, have a look at the work funded by Freexian’s Debian LTS offering.

Debian LTS contributors

In July, 13 contributors have been paid to work on Debian LTS, their reports are available:

  • Bastien Roucariès did 20.0h (out of 20.0h assigned).
  • Chris Lamb did 18.0h (out of 18.0h assigned).
  • Daniel Leidert did 5.0h (out of 4.0h assigned and 6.0h from previous period), thus carrying over 5.0h to the next month.
  • Guilhem Moulin did 8.75h (out of 4.5h assigned and 15.5h from previous period), thus carrying over 11.25h to the next month.
  • Lee Garrett did 51.5h (out of 10.5h assigned and 43.0h from previous period), thus carrying over 2.0h to the next month.
  • Lucas Kanashiro did 5.0h (out of 5.0h assigned and 15.0h from previous period), thus carrying over 15.0h to the next month.
  • Markus Koschany did 40.0h (out of 40.0h assigned).
  • Ola Lundqvist did 4.0h (out of 10.0h assigned and 14.0h from previous period), thus carrying over 20.0h to the next month.
  • Roberto C. Sánchez did 5.0h (out of 5.25h assigned and 6.75h from previous period), thus carrying over 7.0h to the next month.
  • Santiago Ruano Rincón did 6.0h (out of 16.0h assigned), thus carrying over 10.0h to the next month.
  • Sean Whitton did 2.25h (out of 6.0h assigned), thus carrying over 3.75h to the next month.
  • Sylvain Beucler did 39.5h (out of 2.5h assigned and 51.0h from previous period), thus carrying over 14.0h to the next month.
  • Thorsten Alteholz did 11.0h (out of 11.0h assigned).
Evolution of the situation

In July, we have released 1 DLA.

August will be the month that Debian 11 makes the transition to LTS. Our contributors have already been hard at work with preparatorty tasks and also with making contributions to packages in Debian 11 in close collaboration with the Debian security team and package maintainers. As a result, users and sponsors should not observe any especially notable differences as the transition occurs.

While only one DLA was released in July (as a result of the transitional state of Debian 11 “bullseye”), there were some notable highlights. LTS contributor Guilhem Moulin prepared an update of libvirt for Debian 11 (in collaboration with the Old-Stable Release Managers and the Debian Security Team) to fix a number of outstanding CVEs which did not rise to the level of a DSA by the Debian Security Team. The update prepared by Guilhem will be included in Debian 11 as part of the final point release at the end of August, one of the final transition steps by the Release Managers as Debian 11 moves entirely to the LTS Team’s responsibility. Notable work was also undertaken by contributors Lee Garrett (fixes on the ansible test suite and a bullseye update), Lucas Kanashiro (Rust toolchain, utilized by the clamav, firefox-esr, and thunderbird packages), and Sylvain Beucler (fixes on the ruby2.5/2.7 test suites and CI infrastructure), which will help improve the quality of updates produced during the next LTS cycle.

June was the final month of LTS for Debian 10 (as announced on the debian-lts-announce mailing list). No additional Debian 10 security updates will be made available on security.debian.org.

However, Freexian and its team of paid Debian contributors will continue to maintain Debian 10 going forward for customers of the Extended LTS offer. Subscribe right away if you sill have Debian 10 systems which must be kept secure (and which cannot yet be upgraded).

Thanks to our sponsors

Sponsors that joined recently are in bold.

Categories: FLOSS Project Planets

Freexian Collaborators: Debian Contributions: autopkgtest/incus builds, live-patching, Salsa CI, Python 3.13 (by Stefano Rivera)

Planet Debian - Sun, 2024-08-11 20:00
Debian Contributions: 2024-07

Contributing to Debian is part of Freexian’s mission. This article covers the latest achievements of Freexian and their collaborators. All of this is made possible by organizations subscribing to our Long Term Support contracts and consulting services.

autopkgtest/Incus build streamlining, by Colin Watson

Colin contributed a change to allow maintaining Incus container and VM images in parallel. Both of these are useful (containers are faster, but some tests need full machine isolation), and the build tools previously didn’t handle that very well.

This isn’t yet in unstable, but once it is, keeping both flavours of unstable images up to date will be a simple matter of running this regularly:

RELEASE=sid autopkgtest-build-incus images:debian/trixie RELEASE=sid autopkgtest-build-incus --vm images:debian/trixie Linux live-patching, by Santiago Ruano Rincón

In collaboration with Emmanuel Arias, Santiago continued the work on the support for applying security fixes to the Linux kernel in Debian, without the need to reboot the machine. As mentioned in the previous month report, kpatch 0.9.9-1 (and 0.9.9-2 afterwards) was uploaded to unstable in July, closing the Intent to Salvage (ITS) bug. With this upload, the remaining RC bugs were solved, and kpatch was able to transition to Debian testing recently. Kpatch is expected to be an important component in the live-patching support, since it makes it easy to build a patch as a kernel module. Emmanuel and Santiago continued to work on the design for Linux live-patching and presented the current status in the DebConf24 presentation.

Salsa CI, by Santiago Ruano Rincón

To be able to add RISC-V support and to avoid using tools not packaged in Debian (See #331), the Salsa CI pipeline first needed to move away from kaniko to build the images used by the pipeline. Santiago created a merge request to use buildah instead, and it was merged last month. Santiago also prepared a couple of more MRs related to how the images are built: initial RISC-V support, that should be merged after improving how built images are tested. The switch to buildah introduced a regression in the work-in-progress MR that adds new build image so the build job can run sbuild. Santiago hopes to address this regression and continue with the sbuild-related MRs in August.

Additionally, Santiago also contributed to the install docker-cli instead of docker.io in the piuparts image MR, and reviewed others such as reprotest: Add –append-build-command option, fix failure at manual pipeline run when leaving RELEASE variable empty and Fix image not found error on image building stage.

Python 3.13 Betas, by Stefano Rivera

As Python 3.13 is approaching the first release, Stefano has been uploading the beta releases to Debian unstable. Most of these have uncovered small bugs that needed to be investigated and fixed.

Stefano also took the time to review the current patch set against cPython in Debian.

Python 3.13 isn’t marked as a supported Python release in Debian’s Python tooling, yet, so nothing has been built against it, yet. Now that the Python 3.12 transition has completed, the next task will be to start trying to build Debian’s Python module packages against Python 3.13, to estimate the work required to transition to 3.13 in unstable.

Miscellaneous contributions
  • Carles Pina updated the packages python-asyncclick, python-pyaarlo and prepared updates for python-ring-doorbell and simplemonitor.
  • Carles Pina updated (reviewing or translating) Catalan translations for adduser, apt-listchanges, debconf and shadow.
  • Colin merged OpenSSH 9.8, and prepared a corresponding release note for DSA support now being disabled. This version included some substantial changes to split the server into a listener binary and a per-session binary, and those required some corresponding changes in the GSS-API key exchange patch. Sorting out the details of this and getting it to work again took some time.
  • Colin upgraded 11 Python packages to new upstream versions, and modernized the build process and/or added non-superficial autopkgtests to several more.
  • Raphaël Hertzog tweaked tracker.debian.org’s debci task to work around changes in the JSON output. He also improved tracker.debian.org’s ability to detect bounces due to spam to avoid unsubscribing emails that are not broken, but that are better than Debian at rejecting spam.
  • Helmut Grohne monitored the /usr-move transition with few incidents. A notable one is that some systems have ended up with aliasing links that don’t match the ones installed by base-files which could lead to an unpack error from dpkg. This is now prevented by having base-files.preinst error out.
  • Helmut investigated toolchain bootstrap failures with gcc-14 in rebootstrap but would only discover the cause in August.
  • Helmut sent a MR for the cross-exe-wrapper requested by Simon McVittie for gobject-introspection. It is a way of conditionally requesting qemu-user when emulation is required for execution during cross compilation.
  • Helmut sent three patches for cross build failures.
  • Thorsten Alteholz uploaded packages lprint and magicfilter to fix RC-bugs that appeared due to the introduction of gcc-14.
  • Santiago continued to work on activities related to the DebConf24 Content Team, including reviewing the schedule and handling updates on it.
  • Santiago worked on preparations for the DebConf25, to be held in Brest, France, next year. A video of the BoF presented during DebConf24 can be found here.
  • Stefano worked on preparations for DebConf24, and helped to run the event.
Categories: FLOSS Project Planets

The Last Month in GSoC

Planet KDE - Sun, 2024-08-11 07:00

I’ve realized that it’s been nearly a month since the last update about my GSoC project, so it’s time to publish a new one.

I’ve been upstreaming the Python bindings to their corresponding repositories and addressing the comments. Many thanks to Nico, Christophe, Volker, Ben and Carl (my mentor) for their comments! The CMake part has improved a lot and it’s almost ready to be merged. CI support should be ready for FreeBSD and Linux. We can add support for Windows if people are interested.

I’ll probably write a tutorial on how to add Python bindings to a library next week.

Categories: FLOSS Project Planets

Ravi Dwivedi: How My Schengen Visa Was Refused by Austria

Planet Debian - Sun, 2024-08-11 02:29

Vienna - the capital of Austria - is one of the most visited cities in the world, popular for its rich history, gardens, and cafes, along with well-known artists like Beethoven, Mozart, Gödel, and Freud. It has also been consistently ranked as the most livable city in the world.

For these reasons, I was elated when my friend Snehal invited me last year to visit Vienna for a few days. We included Christmas and New Year’s Eve in my itinerary due to the city’s popular Christmas markets and lively events. The festive season also ensured that Snehal had some days off for sightseeing.

Indians require a visa to visit Austria. Since the travel dates were near, I rushed to book an appointment online with VFS Global in Delhi, and quickly arranged the required documents. However, at VFS, I found out that I had applied in the wrong appointment category (tourist), which depends on the purpose of the visit, and that my travel dates do not allow enough time for visa authorities to make a decision. Apparently, even if you plan to stay only for a part of the trip with the host, you need to apply under the category “Visiting Friends and Family”.

Thus, I had to book another appointment under this category, and took the opportunity to shift my travel dates to allow at least 15 business days for the visa application to be processed, removing Christmas and New Year’s Eve from my itinerary.

The process went smoothly, and my visa application was submitted by VFS. For reference, here’s a list of documents I submitted -

  • VFS appointment letter

  • Duly-filled visa application form

  • Original passport

  • Copy of passport

  • 1 photograph

  • My 6 months bank account statement

  • Cover letter

  • Consent form (that visa processing will take up to 15 business days)

  • Snehal’s job contract

  • My work contract

  • Rent contract of Snehal

  • Residence permit of Snehal

  • A copy of Snehal’s passport

  • Invitation letter from Snehal

  • Return flight ticket reservations

  • Travel insurance for the intended travel dates

The following charges were collected from me.

Service Description Amount (Indian Rupees) Cash Handling Charge - SAC Code: (SAC:998599)

0

VFS Fee - India - SAC Code: (SAC:998599)

1,820

VISA Fee - India - SAC Code:

7,280

Convenience fee - SAC Code: (SAC:998599)

182

Courier Service - SAC Code: (SAC:998599)

728

Courier Assurance - SAC Code: (SAC:998599)

182

Total

10,192

I later learned that the courier charges (728 INR) and the courier assurance charges (182 INR) mentioned above were optional. However, VFS didn’t ask whether I wanted to include them. If you apply for a visa through VFS, remember to request them to remove courier assurance charges from your bill.

My visa application was submitted on the 21st of December 2023. A few days later, on the 29th of December 2023, I received an email from the Austrian embassy asking me to submit an additional document -

Subject: AUSTRIAN VISA APPLICATION - AMENDMENT REQUEST: Ravi Dwivedi VIS 4331

Dear Applicant,

On 22.12.2023 your application for Visa C was registered at the Embassy. You are requested to kindly send the scanned copies of the following documents via email to the Embassy or submit the documents at the nearest VFS centre, for further processing of your application:

  • Kindly submit Electronic letter of guarantee “EVE- Elektronische Verpflichtungserklärung” obtained from the “Fremdenpolizeibehörde” of the sponsor’s district in Austria. Once your host company/inviting company has obtained the EVE, please share the reference number (starting from DEL_____) received from the authorities, with the Embassy.

Kindly Note: It is in your own interest to fulfil the requirements as indicated above and submit the missing documents within 14 days of the receipt of this email. Otherwise a decision will be taken based on the documentation available. “Sie werden in Ihrem Interesse ersucht, die gekennzeichneten Mängel so schnell wie möglich zu beheben bzw. fehlende Unterlagen umgehend nachzureichen, um die weitere Bearbeitung des Antrages zu ermöglichen. Sollten Sie innerhalb 14 Tagen die gekennzeichneten Mängel nicht beheben bzw. die fehlenden Unterlagen nicht nachreichen, wird über den vorliegenden Antrag ohne diese Unterlagen bzw. Mängelbehebung entschieden.” Austrian Embassy New Delhi

R.J/ Consular Section +91 11 2419 2700 EP-13, Chandragupta Marg, Chanakyapuri, New Delhi 110 021, India bmeia.gv.at/botschaft/new-delhi facebook.at/AustrianEmbassyNewDelhihttp://www.facebook.at/AustrianEmbassyNewDelhi | twitter.com/MFA_Austriahttp://www.twitter.com/MFA_Austria

[refocus1][Signatur_V+30]https://www.bmeia.gv.at/en/european-foreign-policy/foreign-trade/refocus-austria/[Logo_AT_IN_22px]

I misunderstood the required document to be a scanned copy of the letter of guarantee form signed by Snehal, and responded by attaching it.

Upon researching, Snehal determined that the document is an electronic letter of guarantee, and is supposed to be obtained at a local police station in Vienna. He visited a police station the next day and had a hard time conversing due to the language barrier (German is the common language in Austria, whereas Snehal speaks English). That day was a weekend, so he took an appointment for Monday, but in the meantime the embassy had finished processing my visa.

My visa was denied, and the refusal letter stated:

The Austrian embassy in Delhi examined your application; the visa has been refused.

The decision is based on the following reason(s):

  • The information submitted regarding the justification for the purpose and conditions of the intended stay was not reliable.

  • There are reasonable doubts as to your intention to leave the territory of the Member States before the expiry of the visa.

Other remarks:

You have been given an amendment request, which you have failed to fulfil, or have only fulfilled inadequately, within the deadline set.

You are a first-time traveller. The social and economic roots with the home country are not evident. The return from Schengen territory does therefore not seem to be certain.

Neither my travel agent nor the VFS application center mentioned this document, called the Elektronische Verpflichtungserklärung (EVE). Additionally, the required documents list from the VFS website leads to a dead link. Snehal also told me that his wife’s visa was approved earlier without this document. I suggest that the Austrian visa authorities fix that URL and write instructions on how hosts can obtain that document.

Credits to Snehal and Contrapunctus for editing, Badri for proofreading.

Categories: FLOSS Project Planets

Tidy First? Recommendation to read Kent Beck's book

Planet KDE - Sat, 2024-08-10 18:01

Most of the time programmers do not write new code. Instead, they read, try to understand,  extend, and fix bugs in existing code. While some parts of KDE are pretty new and follow modern standards, many parts are more then two decades old -- following obsolete coding principles, using outdated ways of solving problems, and having additions from several persons with different styles. Often when we read code, we immediately spot things we could improve.

Kent Beck's approach is applying a series of small tidyings that leads to structural change and an overall better software design. In his new book Tidy First? he describes his idea in three parts: Tidyings, how to manage tidyings, and software design theory.

In the first part the author introduces generic tidyings like dead code removal, moving declaration and initialization together, introducing new interfaces, or explicit parameters. Most proposals are not new, but it is a good reminder to follow them and fix these things wherever you come across them in code you are working with. After reading the first part, I felt motivated to create some tidying commits right away. For KDE more specific tidying could be added: Fix deprecation warnings from Qt and KF, replace C-style code by C++, use modern C++ (range-base for loop, initialization lists), fix compiler warnings.

The second part gives hints on how to organize and commit tidyings. Separate tidyings from new features or behavioral changes. Find a balance between asking for review of your tidyings too often or with too extensive reviews.

In the third part Kent Beck offers some basic ideas from software design, especially future options and code coupling.

The book is worth reading for both commercial and open-source developers. Both are facing similar issues. Open-source developers are not worrying about costs, but precious spare time dedicated to coding for their pet project. Every projects has bit rot and profits from regular tidyings by their developers.

People interested in software design will recognize the ideas from classic books like Structured Design or Refactoring: Improving the Design of Existing Code. Nevertheless, Tidy First? makes the knowledge easily accessible. Most chapters are only one to three pages long and the book stays below a hundred pages.

This is the first book of a planned series of small books. Kent Beck develops his ideas in his blog (partially pay-walled) and discusses his views with his readers. Some blog post make it into Kevin's weekly web reviews.

Categories: FLOSS Project Planets

Benjamin Mako Hill: For Additional Confusion

Planet Debian - Sat, 2024-08-10 11:56

The Wikipedia article on antipopes can be pretty confusing! If you’d like to be even more confused, it can help with that!

Categories: FLOSS Project Planets

Making a Difference

Planet KDE - Sat, 2024-08-10 11:32

How to contribute and jump start your career in Free Software with the KDE Community

With Aleix Pol, KDE e.V. President and core contributing developer of (among other many things) KDE Connect, Plasma, Discover and KAlgebra.

Categories: FLOSS Project Planets

Bits from Debian: DebConf24 closes in Busan and DebConf25 dates announced

Planet Debian - Sat, 2024-08-10 10:00

On Saturday 3 August 2024, the annual Debian Developers and Contributors Conference came to a close.

Over 339 attendees representing 48 countries from around the world came together for a combined 108 events made up of Talks, Discussions, Birds of a Feather (BoF) gatherings, workshops, and activities in support of furthering our distribution and free software (25 patches submitted to the Linux kernel), learning from our mentors and peers, building our community, and having a bit of fun.

The conference was preceded by the annual DebCamp hacking session held July 21st through July 27th where Debian Developers and Contributors convened to focus on their Individual Debian related projects or work in team sprints geared toward in-person collaboration in developing Debian.

This year featured a BootCamp that was held for newcomers with a GPG Workshop and a focus on Introduction to creating .deb files (Debian packaging) staged by a team of dedicated mentors who shared hands-on experience in Debian and offered a deeper understanding of how to work in and contribute to the community.

The actual Debian Developers Conference started on Sunday July 28 2024.

In addition to the traditional 'Bits from the DPL' talk, the continuous key-signing party, lightning talks and the announcement of next year's DebConf25, there were several update sessions shared by internal projects and teams.

Many of the hosted discussion sessions were presented by our technical core teams with the usual and useful meet the Technical Committee and the ftpteam and a set of BoFs about packaging policy and Debian infrastructure, including talk about APT and Debian Installer. Internationalization and localization have been subject of several talks. The Python, Perl, Ruby, and Go programming language teams, as well as Med team, also shared updates on their work and efforts.

More than fifteen BoFs and talks about community, diversity and local outreach highlighted the work of various team involved in the social aspect of our community. This year again, Debian Brazil shared strategy and action to attract and retain new contributors and members and opportunities both in Debian and F/OSS.

The schedule was updated each day with planned and ad-hoc activities introduced by attendees over the course of the conference. Several traditional activities were performed: a job fair, a poetry performance, the traditional Cheese and Wine party, the group photos and the Day Trips.

For those who were not able to attend, most of the talks and sessions were videoed for live room streams with the recorded videos made available through a link in their summary in the schedule. Almost all of the sessions facilitated remote participation via IRC messaging apps or online collaborative text documents which allowed remote attendees to 'be in the room' to ask questions or share comments with the speaker or assembled audience.

DebConf24 saw over 6.8 TiB of data streamed, 91.25 hours of scheduled talks, 20 network access points, 1.6 km fibers (1 broken fiber...) and 2.2 km UTP deployed, more than 20 country Geoip viewers, 354 T-shirts, 3 day trips, and up to 200 meals planned per day.

All of these events, activities, conversations, and streams coupled with our love, interest, and participation in Debian and F/OSS certainly made this conference an overall success both here in Busan, South Korea and On-line around the world.

The DebConf24 website will remain active for archival purposes and will continue to offer links to the presentations and videos of talks and events.

Next year, DebConf25 will be held in Brest, France, from Monday, July 7 to Monday, July 21, 2025. As tradition follows before the next DebConf the local organizers in France will start the conference activities with DebCamp with particular focus on individual and team work towards improving the distribution.

DebConf is committed to a safe and welcome environment for all participants. See the web page about the Code of Conduct in DebConf24 website for more details on this.

Debian thanks the commitment of numerous sponsors to support DebConf24, particularly our Platinum Sponsors: Infomaniak, Proxmox, and Wind River.

We also wish to thank our Video and Infrastructure teams, the DebConf24 and DebConf committees, our host nation of South Korea, and each and every person who helped contribute to this event and to Debian overall.

Thank you all for your work in helping Debian continue to be "The Universal Operating System".

See you next year!

About Debian

The Debian Project was founded in 1993 by Ian Murdock to be a truly free community project. Since then the project has grown to be one of the largest and most influential open source projects. Thousands of volunteers from all over the world work together to create and maintain Debian software. Available in 70 languages, and supporting a huge range of computer types, Debian calls itself the universal operating system.

About DebConf

DebConf is the Debian Project's developer conference. In addition to a full schedule of technical, social and policy talks, DebConf provides an opportunity for developers, contributors and other interested people to meet in person and work together more closely. It has taken place annually since 2000 in locations as varied as Scotland, Argentina, Bosnia and Herzegovina, and India. More information about DebConf is available from https://debconf.org/.

About Infomaniak

Infomaniak is an independent cloud service provider recognized throughout Europe for its commitment to privacy, the local economy and the environment. Recording growth of 18% in 2023, the company is developing a suite of online collaborative tools and cloud hosting, streaming, marketing and events solutions. Infomaniak uses exclusively renewable energy, builds its own data centers and develops its solutions in Switzerland, without relocating. The company powers the website of the Belgian radio and TV service (RTBF) and provides streaming for more than 3,000 TV and radio stations in Europe.

About Proxmox

Proxmox provides powerful and user-friendly Open Source server software. Enterprises of all sizes and industries use Proxmox solutions to deploy efficient and simplified IT infrastructures, minimize total cost of ownership, and avoid vendor lock-in. Proxmox also offers commercial support, training services, and an extensive partner ecosystem to ensure business continuity for its customers. Proxmox Server Solutions GmbH was established in 2005 and is headquartered in Vienna, Austria. Proxmox builds its product offerings on top of the Debian operating system.

About Wind River

Wind River For nearly 20 years, Wind River has led in commercial Open Source Linux solutions for mission-critical enterprise edge computing. With expertise across aerospace, automotive, industrial, telecom, and more, the company is committed to Open Source through initiatives like eLxr, Yocto, Zephyr, and StarlingX.

Contact Information

For further information, please visit the DebConf24 web page at https://debconf24.debconf.org/ or send mail to press@debian.org.

Categories: FLOSS Project Planets

The Drop Times: Which CMS Powers the Top US University Websites? A Comprehensive Analysis

Planet Drupal - Sat, 2024-08-10 08:36
A comprehensive study by The DropTimes (TDT) uncovers a significant preference for Drupal among U.S. universities, with 35.4% opting for this robust and flexible CMS. The findings highlight Drupal&#039;s critical role in shaping the digital landscape of higher education, as institutions increasingly favor free and open-source solutions for their adaptability and community support. Dive into the study&#039;s insights and discover how Drupal is leading the charge in academic content management
Categories: FLOSS Project Planets

Thorsten Alteholz: My Debian Activities in July 2024

Planet Debian - Sat, 2024-08-10 04:50
FTP master

This month I accepted 502 and rejected 40 packages. The overall number of packages that got accepted was 515.

In case you want to upload dozens of packages, it would be nice to give some heads-up before. It is kind of a shock to see a full NEW queue in the morning, though it was much shorter in the evening before.

Debian LTS

This was my hundred-twenty-first month that I did some work for the Debian LTS initiative, started by Raphael Hertzog at Freexian.

  • [#1074439] bookworm-pu: cups 2.4.2-3+deb12u7 has been marked for accept

This month I finished the new version of tiff for Bullseye (and Bookworm). The upload will follow, when Bullseye has been handed over to the LTS team in August.

Last but not least I attended the monthly LTS/ELTS meeting.

Debian ELTS

This month was the seventy-second ELTS month. During my allocated time I uploaded or worked on:

  • [ELA-1126-1-1]exim4 security update for one CVE. This was the delayed ELA I mentioned in my last report.
  • [ELA-1144-1-1]exim4 security update for one CVE to fix parsing of multiline RFC 2231 header filenames in Stretch and Buster. Jessie was not affected by this issue.
  • Uploaded new versions of tiff for Jessie and Stretch that got stuck in the autopkgtests.

For whatever reason, I had trouble with the CI again. The new tiff package wanted to run the autopkgtest of cups but never did it. So the corresponding ELA will appear only in August.

I also continued to work on an update for libvirt. There really is a reason why some packages don’t get much attention. Nevertheless someone has to take care of them. I also did a week of FD and attended the LTS/ELTS meeting.

Debian Printing

This month I uploaded …

This work is generously funded by Freexian!

Debian Astro

This month I uploaded a new upstream or bugfix version of:

Debian IoT

This month I uploaded new upstream or bugfix versions of:

Debian Mobcom

This month I uploaded …

The following packages have been prepared by the GSoC student Nathan:

misc

This month I uploaded new upstream or bugfix versions of:

Categories: FLOSS Project Planets

Russell Coker: PineTime Status

Planet Debian - Sat, 2024-08-10 02:16

Since my last blog post about the PineTime [1] I haven’t done anything exciting with it. I’ve been wearing it every day and it’s working reasonably well for me. It’s been working better since I changed to a Samsung Galaxy Note 9 as my main phone [2], so it seems that the Huawei Mate 10 Pro has some issues with Bluetooth that were making it unreliable.

A relative also has one which is working well for them but which had some problems, I only discovered that holding the button down for a long time (longer than usual for device reset) makes a PineTime reboot because of their issues. I also once had their device get into a bad state where the only thing I could do was flash a newer firmware which fortunately fixed the problem.

My latest issue is the battery life. Recently it has been taking ages to get above about 90% charge when charging and the time taken to go down to ~70% when I charge it seems to be decreasing. Yesterday it suddenly went to 13% after being 73% the previous night. Then it stayed at 13% all day. It seems quite inaccurate. But also it doesn’t seem to be lasting as long as before.

Generally it seems to me that Pine64 products are almost great. I won’t rule out the possibility of a newer firmware for the PineTime alleviating the battery issues (or at least reporting the status accurately) and making Bluetooth connectivity more reliable (even on older phones). For the PinePhonePro an update to Mobian could reduce power wasting from user space (there’s an issue that I have reported in Plasma Mobile but no-one is interested on working on this before KDE 6), and a kernel update could improve things. But I don’t think there’s a possibility of it ever having the battery last a day while polling Matrix and Jabber servers which is something that every Android phone can do without problems.

Related posts:

  1. Bluetooth Versions and PineTime I’ve done some tests with the PineTime [1] on different...
  2. More About the PineTime Since my initial review of the PineTime 10 days ago...
  3. The PineTime I have just got a PineTime smart watch [1] from...
Categories: FLOSS Project Planets

This week in KDE: SVG Breeze cursors and more thumbnails

Planet KDE - Sat, 2024-08-10 00:31

First up is something cool: support for SVG-based cursor themes! This allows compatible themes to always display beautiful sharp cursors at any size, and has already been rolled out for the Breeze Light and Breeze Dark cursor themes. It does not use the Hyprcursor system, and we have not yet upstreamed it to be a different cross-desktop spec. However, we are considering doing so in the near future. This work was done by Jin Liu and Vlad Zahorodnii, and lands in Plasma 6.2.0.

On the subject of cross-desktop specs, KDE apps now does support the cross-desktop thumbnailer spec, meaning that any of these thumbnailers already on the system will now instantly start working! One of the most notable examples would be the STL file thumbnailer, which will be a boon for anyone working with 3D models or 3D printers. This work was done by Akseli Lahtinen and lands in KDE Frameworks 6.6. You can read about it more in this blog post.

That isn’t all, though…

More Notable New Features

Elisa now shows the total duration of the songs from the playlist in its footer (Karl Hoffman, Elisa 24.12.0. Link):

Plasma now lets you escape from the tyranny of time by hiding the clocks on the login and lock screens entirely (Someone going by the pseudonym “Be Ing”, Plasma 6.2.0. Link)

Plasma’s Pager widget now lets you turn off window outlines if you’d prefer a cleaner display of only the virtual desktops (Christian Muehlhaeuser, Plasma 6.2.0. Link)

The Breeze Light and Breeze Dark Plasma styles (not color schemes, Plasma styles) now respect your systemwide accent color too. In particular, this makes the built-in Breeze Twilight Global Theme fully accent-color-aware (Niccolò Venerandi, Plasma 6.2.0. Link):

Notable UI Improvements

Elisa now remembers window maximization state and prior window geometry across launches as expected (me: Nate Graham, Elisa 24.08.0. Link)

Filelight now remembers its window size (and position, on X11) across launches (me: Nate Graham, Filelight, 24.12.0. Link)

When using background blur e.g. in apps like Konsole, there’s no longer a blurry sharp corner poking out of the rounded titlebar corners (Xaver Hugl, Plasma 6.2.0. Link)

Notable Bug Fixes

Fixed a silly bug that caused System Settings’ Display & Monitor page to be unable to show auto-rotate settings the first time it was opened (Marco Martin, Plasma 6.1.4. Link)

When you click on column headers in System Monitor to sort a table by a different column, they’re now ordered top-to-bottom as expected (Arjen Hiemstra, Plasma 6.1.5. Link)

Worked around a quirk in VLC, with the net result that standard MPRIS-compatible play/pause controls (e.g. via global shortcut, dedicated keyboard keys, or the Media Player widget) work again (Fushan Wen, Plasma 6.1.5. Link)

Worked around a Qt bug that caused widgets in Plasma’s Widget Explorer to overlap after clearing the search field text with animations globally disabled (me: Nate Graham and Noah Davis, Plasma 6.1.5. Link)

Fixed a bug that caused the “copy time/date to clipboard” feature of Plasma’s Digital Clock widget to not work on Wayland. This should also more generally help with clipboard issues where the source window disappears after content is copied (David Redondo, Plasma 6.2.0. Link)

The “Small font” setting on System Settings’ Fonts page now works again, because we fixed a subtle Plasma 6 porting error that broke it (Marco Martin, Frameworks 6.6. Link)

Other bug information of note:

Notable in Performance & Technical

Fixed an issue that caused noticeable frame drop when using certain hybrid Intel+NVIDIA GPU setups (Xaver Hugl, Plasma 6.1.4. Link)

You can now drag-and-drop stuff to an Plasma panel in auto-hide mode on Wayland; it un-hides as needed, just like it does on X11 (Yifan Zhu, Plasma 6.1.5. Link)

Changing the language on System Settings Region & Language page is now more reliable, accounting for cases where distros might not set things up quite right themselves (Han Young, Plasma 6.1.5. Link)

Improved the speed and performance of Discover’s search feature (Aleix Pol Gonzalez, Plasma 6.1.5. Link)

Improved system performance when using ICC color profiles (Xaver Hugl, Plasma 6.2.0. Link)

Video players are now more likely to be to able to trigger KWin’s direct scan-out feature, saving power and system resources (Xaver Hugl, Plasma 6.2.0. Link)

Made Plasma’s Global Menu feature work more reliably on Wayland with exported menus from Electron apps like VSCode (David Redondo, Plasma 6.2.0. Link)

…And Everything Else

This blog only covers the tip of the iceberg! If you’re hungry for more, check out https://planet.kde.org, where you can find more news from other KDE contributors.

How You Can Help

Otherwise, visit https://community.kde.org/Get_Involved to discover other ways to be part of a project that really matters. Each contributor makes a huge difference in KDE; you are not a number or a cog in a machine! You don’t have to already be a programmer, either. I wasn’t when I got started. Try it, you’ll like it! We don’t bite! Or consider donating instead! That helps too.

Categories: FLOSS Project Planets

Carl Trachte: Embedding an SVG in a graphviz Generated SVG and More DAG Hamilton

Planet Python - Fri, 2024-08-09 21:39

Last time I used a previous post's DAG Hamilton graphviz output to generate a series of functionally highlighted DAG Hamilton workflow graphs. The  SVG (scalable vector graphics) versions of these graphs will serve as the input for this post.

I was dissatisfied with the quality of the PNG output, or at least how it rendered, fuzzy and illegible. My thought was that an SVG presentation would provide a more crisp, scalable (hence the name SVG) view of each graph.

Where I ran into problems was the embedded logos. Applications like PowerPoint allowed the inclusion of the logos as SGV "images" within the SVG "image" in PowerPoint, but did not render them; blank spaces remained.

So I set out to embed the SVG of the logos inline as elements within the final SVG file; it turned into quite the journey . . .

So SVG is really just XML, right? No, it is XML; it's just not just XML. There are XML tags and what is inside those tags can contain multiple SVG characteristics, all in their own syntax, most listed as quoted text.

At this point finding a library that allows for programmatic manipulation of SGV by tag or reviewing some open source browser source code may have helped. I did not do either of those things (a brief internet search yielded Python libraries, but they seemed focused more on conversion to and from SVG and other image formats) and set out on my own.

Like most people, I have played with Inkscape and converted images to SVG format. I even blogged about having done this with POVRay rendered pysanky eggs back in the day. Using something with software written by people way smarter than you and actually understanding it are two entirely different animals.

To make matters worse . . . I cannot actually display the SVG images or inline them here on Blogger. Smaller SVG snippets seem to work, but an entire graph with SVG logos is either too much or I am doing something wrong. Another (blurry) PNG example of the output will have to do.

Important concepts with links:

1) viewBox, scale, dimensions - Soueiden (classic, kind of the standard as far as I can tell):

https://www.sarasoueidan.com/blog/mimic-relative-positioning-in-svg/

2) the four quadrants of svg space (but you only see the lower right):

http://dh.obdurodon.org/coordinate-tutorial.xhtml

3) use x, y positioning to place embedded SVG rather than viewBox coordinates:

I have lost the link, but whoever suggested this, thank you.

4) (no link) Allow graphviz to do as much work as possible before editing any svg. For instance, when bolding edges of the graph in SVG, the edges will invariably overlap the nodes. This looks ugly. graphviz handles all that and it is far far simpler than trying to do it on your own.

5) bezier curves - nothing in this post about them, but they were part of my real introduction to SVG, and the most fun part. Recommend.

https://javascript.info/bezier-curve#de-casteljau-s-algorithm

Methodology for putting SVG logos inside the SVG document (not necessarily in order):

1) scale the embedded SVGs with the "width" and "height" attributes (SVG). I made mine proportional relative to the original SVGs' dimensions.

2) Calculate where the SVGs are supposed to go within the graphviz generated SVG coordinate space.

graphviz pushes everything into the upper right SVG space quadrant with an SVG "translate" command with 4 units padding. This needs to be taken into account when positioning the SVG elements relative to graphviz' coordinate space. The elements will be using the lower right SVG space quadrant coordinate space.

3) Leverage the positioning and size of the original PNG logos to place your SVG ones, then pop the old logo image elements and "erase" the boxes around them (yes, quite hacky, but effective).

This is a Python blog. Nutshell: I used xml.etree.ElementTree and rudimentary text processing of the SVG specific parts to get this done.

The whole thing got quite unwieldy and I turned once again to DAG Hamilton to help me organize and visualize things. (Blurry) screenshot below:





Wow, it looks like you just collected every piece of information you could about all the dimensions and smashed it all together in the final SVG document at the end.

Yes.

Hey, why is that one node just hanging out at a dead end not doing anything?

I was not getting the whole coordinate thing and needed it for reference.

The code:

# run.py - the DAG Hamilton control file.

"""Hamilton wrapper."""
# https://hamilton.dagworks.io/en/latest/concepts/driver/#recap
import sys
import pprint
from hamilton import driver
import editsvgs as esvg
OUTPUTFILES = {'data_source_highlighted':'data_source_highlighted_final',               'web_scraping_functions_highlighted':'web_scraping_functions_highlighted_final',               'output_functions_highlighted':'output_functions_highlighted_final'}
dr = driver.Builder().with_modules(esvg).build()
dr.display_all_functions('esvg.svg', deduplicate_inputs=True, keep_dot=True, orient='BR')
for keyx in OUTPUTFILES:    results = dr.execute(['hamilton_logo_root',                          'company_logo_root',                          'graph_root',                          'doc_attrib',                          'hamilton_logo_tree_indices',                          'company_logo_tree_indices',                          'hamilton_logo_png_attrib',                          'company_logo_png_attrib',                          'parsed_hamiltonlogo_png_attrib',                          'parsed_companylogo_png_attrib',                          'biggerdimension',                          'dimensionratio',                          'parsed_graph_dimensions',                          'hamilton_logo_position',                          'hamilton_svg_dimensions',                          'hamilton_logo_dimensions_orig',                          'biggerdimension_company',                          'dimensionratio_company',                          'company_logo_position',                          'company_svg_dimensions',                          'company_logo_dimensions_orig',                          'final_svg_file'],                          inputs={'hamiltonlogofile':'hamiltonlogolarge.svg',                                  'companylogofile':'fauxcompanylogo.svg',                                  'testfile':keyx + '.svg',                                  'outputfile':OUTPUTFILES[keyx] + '.svg',                                  'hamiltonlogopng':'hamiltonlogolarge.png',                                  'companylogopng':'fauxcompanylogo.png'})        print('\ndoc_attrib =\n')    pprint.pprint(results['doc_attrib'])    print('\nhamilton_logo_tree_indices =\n')    pprint.pprint(results['hamilton_logo_tree_indices'])    print('\ncompany_logo_tree_indices =\n')    pprint.pprint(results['company_logo_tree_indices'])    print('\nhamilton_logo_png_attrib =\n')    pprint.pprint(results['hamilton_logo_png_attrib'])    print('\nparsed_hamiltonlogo_png_attrib =\n')    pprint.pprint(results['parsed_hamiltonlogo_png_attrib'])    print('\ncompany_logo_png_attrib =\n')    pprint.pprint(results['company_logo_png_attrib'])    print('\nparsed_companylogo_png_attrib =\n')    pprint.pprint(results['parsed_companylogo_png_attrib'])    print('\nbiggerdimension =\n')    pprint.pprint(results['biggerdimension'])    print('\ndimensionratio =\n')    pprint.pprint(results['dimensionratio'])    print('\nparsed_graph_dimensions =\n')    pprint.pprint(results['parsed_graph_dimensions'])    print('\nhamilton_logo_position =\n')    pprint.pprint(results['hamilton_logo_position'])    print('\nhamilton_svg_dimensions =\n')    pprint.pprint(results['hamilton_svg_dimensions'])    print('\nhamilton_logo_dimensions_orig =\n')    pprint.pprint(results['hamilton_logo_dimensions_orig'])    print('\ndimensionratio_company =\n')    pprint.pprint(results['dimensionratio_company'])    print('\ncompany_logo_position =\n')    pprint.pprint(results['company_logo_position'])    print('\ncompany_svg_dimensions =\n')    pprint.pprint(results['company_svg_dimensions'])    print('\ncompany_logo_dimensions_orig =\n')    pprint.pprint(results['company_logo_dimensions_orig'])    print('\nfinal_svg_file =\n')    pprint.pprint(results['final_svg_file'])
# editsvgs.py - DAG Hamilton noun-named functions.

# python 3.12
"""Attempt to position svg logos and editflowchart with svg."""
import os
import pprint
import xml.etree.ElementTree as ET
import itertools
import sys
import copy
import reusedfunctions as rf
# Pop this to get rid of png image.# '{http://www.w3.org/1999/xlink}href': 'hamiltonlogolarge.png'}PNG_ATTRIB_KEY = '{http://www.w3.org/1999/xlink}href'# '{http://www.w3.org/1999/xlink}href': 'fauxcompanylogo.png'}
def hamilton_logo_root(hamiltonlogofile:str) -> ET.Element:    """    Get root of ElementTree object for Hamilton    logo svg file.
    hamiltonlogofile is the svg file with the Hamilton logo.    """    print('Getting Hamilton logo svg file root Element . . .')    return rf.getroot(hamiltonlogofile)
def company_logo_root(companylogofile:str) -> ET.Element:    """    Get root of ElementTree object for company    logo svg file.
    companylogofile is the svg file with the company logo.    """    print('Getting company logo svg file root Element . . .')    return rf.getroot(companylogofile)
def graph_root(testfile:str) -> ET.Element:    """    Gets root Element of graphviz graph svg.
    testfile is the graphviz svg file.    """    print('Getting root Element of main graph svg file . . .')    return rf.getroot(testfile)
def doc_attrib(graph_root:ET.Element) -> dict:    """    Gets graphviz svg document's dimensions and viewBox    in a dictionary.
    graph_root is the graphviz svg file root Element. 
    Returns dictionary of xml/svg data for doc.    """    print('Getting dimensions and viewBox for main graph svg file . . .')    return graph_root.attrib
def hamilton_logo_tree_indices(graph_root:ET.Element, hamiltonlogopng:str) -> tuple:    """    Get tree indices (3 deep) for original png    Hamilton logo on graph.
    graph_root is the root Element of graphviz graph svg.
    hamiltonlogopng is the name of the png file referenced    in the image link in the svg file (string).
    Returns 3 tuple of integers.    """    print('Getting ElementTree indices for tree for Hamilton png logo Element . . .')    return rf.gettreeindices(graph_root, hamiltonlogopng)
def company_logo_tree_indices(graph_root:ET.Element, companylogopng:str) -> tuple:    """    Get tree indices (3 deep) for original png    company logo on graph.
    graph_root is the root Element of graphviz graph svg.
    companylogopng is the name of the png file referenced    in the image link in the svg file (string).
    Returns 3 tuple of integers.    """    print('Getting ElementTree indices for tree for company png logo Element . . .')    return rf.gettreeindices(graph_root, companylogopng)
def hamilton_logo_png_attrib(graph_root:ET.Element, hamilton_logo_tree_indices:tuple) -> dict:    """    Get attrib dictionary for original Hamilton png file Element in graph svg.
    graph_root is the root Element of graphviz graph svg.
    hamilton_logo_tree_indices are the lookup indices for the Hamilton    logo png Element within the xml tree.    """    print('Getting attrib dictionary for original Hamilton png file Element in graph svg . . .')    return rf.getpngattrib(graph_root, hamilton_logo_tree_indices)
def company_logo_png_attrib(graph_root:ET.Element, company_logo_tree_indices:tuple) -> dict:    """    Get attrib dictionary for original company png file Element in graph svg.
    graph_root is the root Element of graphviz graph svg.
    company_logo_tree_indices are the lookup indices for the company    logo png Element within the xml tree.    """    print('Getting attrib dictionary for original company png file Element in graph svg . . .')    return rf.getpngattrib(graph_root, company_logo_tree_indices)
def parsed_hamiltonlogo_png_attrib(hamilton_logo_png_attrib:dict) -> dict:    """    Work dictionary that has information on former    location of png Hamilton logo image in the     graphviz svg.
    Basically getting svg text values into float format.
    Returns new dictionary.    """    print('Getting svg text values into float format for Hamilton png Element . . .')    return rf.parsepngattrib(hamilton_logo_png_attrib)
def parsed_companylogo_png_attrib(company_logo_png_attrib:dict) -> dict:    """    Work dictionary that has information on former    location of png company logo image in the     graphviz svg.
    Basically getting svg text values into float format.
    Returns new dictionary.    """    print('Getting svg text values into float format for company logo png Element . . .')    return rf.parsepngattrib(company_logo_png_attrib)
def biggerdimension(hamilton_logo_root:ET.Element) -> str:    """    hamilton_logo_root is the ElementTree Element    for the big svg Hamilton logo.
    Returns 'Y' if the y dimension is the     bigger one, and 'X' if the x one is.
    Returns None if there is a key error.    """    print('Determining bigger dimension for svg Hamilton logo . . .')    return rf.getbiggerdimension(hamilton_logo_root)
def dimensionratio(biggerdimension:str, hamilton_logo_root:ET.Element) -> float:    """    biggerdimension is a string, 'X' or 'Y'.
    hamilton_logo_root is the ElementTree Element    for the big svg Hamilton logo.
    Returns ratio of bigger dimension    to smaller one (float).    """    print('Calculating dimensions ratio for Hamilton logo svg . . .')    return rf.getdimensionratio(biggerdimension, hamilton_logo_root)
def parsed_graph_dimensions(graph_root:ET.Element) -> tuple:    """    Get translate coordinates from graphviz    svg root Element.
    Returns two tuple of x, y translation.    """    graph0dimensions = graph_root[0].attrib    coordstr = graph0dimensions['transform']    coordstr = coordstr[coordstr.index('translate'):]    coordstr = coordstr[coordstr.index('(') + 1:-1]    vals = [float(x) for x in coordstr.split(' ')]    return tuple(vals)
def hamilton_logo_position(parsed_graph_dimensions:tuple,                           parsed_hamiltonlogo_png_attrib:dict) -> tuple:    """    parsed_graph_dimensions is an x, y two tuple.
    parsed_hamiltonlogo_png_attrib is a dictionary.
    Returns x, y position of Hamilton logo svg graphic as a    two tuple.    """    print('Getting position of Hamilton logo . . .')    return rf.getposition(parsed_graph_dimensions, parsed_hamiltonlogo_png_attrib)
def company_logo_position(parsed_graph_dimensions:tuple,                          parsed_companylogo_png_attrib:dict) -> tuple:    """    parsed_graph_dimensions is an x, y two tuple.
    parsed_hamiltonlogo_png_attrib is a dictionary.
    Returns x, y position of company logo svg graphic as a    two tuple.    """    print('Getting position of company logo . . .')    # Add 4.    x = parsed_companylogo_png_attrib['X'] + parsed_graph_dimensions[0]    # Add negative number with big absolute value.    # Upper right quadrant translation thing.    y = parsed_companylogo_png_attrib['Y'] + parsed_graph_dimensions[1]     return x, y
def hamilton_svg_dimensions(parsed_hamiltonlogo_png_attrib:dict,                            biggerdimension:str,                            dimensionratio:float) -> tuple:    """    Get width and height of svg Hamilton logo within    final document.
    parsed_hamiltonlogo_png_attrib is the dictionary of    numeric values associated with the original image    position of the Hamilton png logo within the    svg document.
    biggerdimension is the 'X' or 'Y' value that    indicates which dimension is the larger of    the two.
    dimensionratio is the ratio of the larger    dimension to the smaller one.
    Returns x, y two tuple of floats.    """    print('Getting size of Hamilton logo in final doc . . .')    return rf.getdimensions(parsed_hamiltonlogo_png_attrib, biggerdimension, dimensionratio)
def hamilton_logo_dimensions_orig(hamilton_logo_root:ET.Element) -> tuple:    """    hamilton_logo_root is the ElementTree Element    for the big svg Hamilton logo.
    Returns two tuple of width, height.    """    print('Retrieving dimensions of Hamilton logo svg . . .')    return rf.getdimensionsorig(hamilton_logo_root)
def final_svg_file(testfile:str,                   outputfile:str,                   hamilton_logo_root:ET.Element,                   hamilton_logo_tree_indices:tuple,                   hamilton_logo_position:tuple,                   hamilton_svg_dimensions:tuple,                   hamilton_logo_dimensions_orig:tuple,                   company_logo_tree_indices:tuple,                   parsed_companylogo_png_attrib:dict,                   company_logo_position:tuple,                   company_logo_root:ET.Element,                   company_svg_dimensions:tuple,                   company_logo_dimensions_orig:tuple,                   ) -> str:    """    Replaces image logos with scaleable    svg ones.
    testfile is the name of the original svg file.
    outputfile is the name of the intended final    svg file.
    hamilton_logo_root is the elementree root object    for the Hamilton logo svg file.
    hamilton_logo_tree_indices are nested indices     indicating the location of the original Hamilton    logo png elementree Element within the input    svg document.
    hamilton_logo_position - x, y tuple - where to    put the svg Hamilton logo within the final    svg document.
    hamilton_svg_dimensions - x, y tuple - width and    height of Hamilton svg logo within the final    svg document.
    hamilton_logo_dimensions_orig - two tuple of width, height    of original svg file Hamilton logo.
    company_logo_tree_indices are nested indices     indicating the location of the original company    logo png elementree Element within the input    svg document.
    company_logo_position - x, y tuple - where to    put the svg company logo within the final    svg document.
    company_logo_root is the elementree root object    for the company logo svg file.     company_svg_dimensions - x, y tuple - width and    height of company svg logo within the final    svg document.
    company_logo_dimensions_orig - two tuple of width, height    of original svg file company logo.
    Returns string filename.    """    print('Making changes to svg . . .')    hlti = hamilton_logo_tree_indices     retval = outputfile    tree = ET.parse(testfile)    root = tree.getroot()    # pop Hamilton png    print('Popping original Hamilton png logo . . .')    root[hlti[0]][hlti[1]][hlti[2]].attrib.pop(PNG_ATTRIB_KEY)    print('Appending Hamilton svg to root Element . . .')    root.append(hamilton_logo_root)    print('Adjusting viewBox for Hamilton svg . . .')    root[-1].attrib['viewBox'] = '0.00 0.00 {0:.3f} {1:.3f}'.format(*hamilton_logo_dimensions_orig)    print('Adjusting height and width for Hamilton svg . . .')    root[-1].attrib['height'] = str(hamilton_svg_dimensions[1])    root[-1].attrib['width'] = str(hamilton_svg_dimensions[0])    print('Positioning Hamilton logo svg within final svg . . .')    root[-1].attrib['x'] = str(hamilton_logo_position[0])    root[-1].attrib['y'] = str(hamilton_logo_position[1])    print('Erasing Hamilton logo bounding box . . .')    # After popping png, polygon resides one index unit back.    root[hlti[0]][hlti[1]][hlti[2] - 1].attrib['stroke'] = 'none'    clti = company_logo_tree_indices    # pop company png    print('Popping original company png logo . . .')    root[clti[0]][clti[1]][clti[2]].attrib.pop(PNG_ATTRIB_KEY)    print('Adding company logo svg Element to main svg file . . .')    root.append(company_logo_root)    print('Adjusting viewBox for company svg . . .')    root[-1].attrib['viewBox'] = '0.00 0.00 {0:.3f} {1:.3f}'.format(*company_logo_dimensions_orig)    print('Adjusting height and width for company svg . . .')    root[-1].attrib['height'] = str(company_svg_dimensions[1])    root[-1].attrib['width'] = str(company_svg_dimensions[0])    print('Moving company logo svg to the correct position in the display . . .')    # Had to adjust 15 units to get it out of the way of the legend.    root[-1].attrib['x'] = str(company_logo_position[0] - 15)    root[-1].attrib['y'] = str(company_logo_position[1])    print('Erasing company logo bounding box . . .')    # After popping png, polygon resides one index unit back.    root[clti[0]][clti[1]][clti[2] - 1].attrib['stroke'] = 'none'    print('Writing new svg . . .')    tree.write(retval)    return retval
def biggerdimension_company(company_logo_root:ET.Element) -> str:    """    company_logo_root is the ElementTree Element    for the big svg company logo.
    Returns 'Y' if the y dimension is the     bigger one, and 'X' if the x one is.    """    print('Determining bigger dimension for svg company logo . . .')    return rf.getbiggerdimension(company_logo_root)
def dimensionratio_company(biggerdimension_company:str,                           company_logo_root:ET.Element) -> float:    """    biggerdimension is a string, 'X' or 'Y'.
    company_logo_root is the ElementTree Element    for the big svg company logo.
    Returns ratio of bigger dimension    to smaller one (float).    """    print('Calculating dimensions ratio for company logo svg . . .')    return rf.getdimensionratio(biggerdimension_company,                                company_logo_root)
def company_logo_position(parsed_graph_dimensions:tuple,                          parsed_companylogo_png_attrib:dict) -> tuple:    """    parsed_graph_dimensions is an x, y two tuple.
    parsed_companylogo_png_attrib is a dictionary.
    Returns x, y position of company logo svg graphic as a    two tuple.    """    print('Getting position of company logo . . .')    return rf.getposition(parsed_graph_dimensions,                          parsed_companylogo_png_attrib)
def company_svg_dimensions(parsed_companylogo_png_attrib:dict,                           biggerdimension_company:str,                           dimensionratio_company:float) -> tuple:    """    Get width and height of svg company logo within    final document.
    parsed_companylogo_png_attrib is the dictionary of    numeric values associated with the original image    position of the company png logo within the    svg document.
    biggerdimension is the 'X' or 'Y' value that    indicates which dimension is the larger of    the two.
    dimensionratio_company is the ratio of the larger    dimension to the smaller one.
    Returns x, y two tuple of floats.    """    pprint.pprint(parsed_companylogo_png_attrib)    print('Getting size of company logo in final doc . . .')    return rf.getdimensions(parsed_companylogo_png_attrib,                             biggerdimension_company,                            dimensionratio_company)
def company_logo_dimensions_orig(company_logo_root:ET.Element) -> tuple:    """    company_logo_root is the ElementTree Element    for the big svg company logo.
    Returns two tuple of width, height.    """    print('Retrieving dimensions of company logo svg . . .')    return rf.getdimensionsorig(company_logo_root)

# reusedfunctions.py - utility/helper/main functionality
#                      at a granular level.

# python 3.12
"""Auxiliary module to Hamilton svg script."""
import itertools
import xml.etree.ElementTree as ET
# Pop this to get rid of png image.# '{http://www.w3.org/1999/xlink}href': 'hamiltonlogolarge.png'}PNG_ATTRIB_KEY = '{http://www.w3.org/1999/xlink}href'
def gettreeindices(graph_root, png):    """    Get tree indices (3 deep) for png on graph.
    graph_root is the root Element of graphviz graph svg.
    png is the name of the png file referenced    in the image link in the svg file (string).
    Returns 3 tuple of integers.    """    countergeneratorx = itertools.count()    counterx = next(countergeneratorx)    for nodex in graph_root:        countergeneratory = itertools.count()        countery = next(countergeneratory)        for nodey in nodex:            countergeneratorz = itertools.count()            counterz = next(countergeneratorz)            for nodez in nodey:                if PNG_ATTRIB_KEY in nodez.attrib:                    if nodez.attrib[PNG_ATTRIB_KEY] == png:                        return counterx, countery, counterz                counterz = next(countergeneratorz)            countery = next(countergeneratory)        counterx = next(countergeneratorx)
def getroot(filename):    """    Get root of ElementTree object for svg file.
    filename is the svg file string.    """    return ET.parse(filename).getroot()
def getpngattrib(graph_root, indices):    """    Get attrib dictionary for png file Element in graph svg.
    graph_root is the root Element of graphviz graph svg.
    indices are the lookup indices for the     png Element within the xml tree.    """    return graph_root[indices[0]][indices[1]][indices[2]].attrib
def parsepngattrib(attrib):    """    Work dictionary that has information on    location of png image in the     graphviz svg.
    Basically getting svg text values into float format.
    Returns new dictionary.    """    retval = {}    retval['X'] = float(attrib['x'])    retval['Y'] = float(attrib['y'])    retval['height'] = float(attrib['height'][:attrib['height'].index('px')])    retval['width'] = float(attrib['width'][:attrib['width'].index('px')])    return retval
def getbiggerdimension(root):    """    root is the ElementTree Element    for the svg file element to be    embedded into the main svg file.
    Returns 'Y' if the y dimension is the     bigger one, and 'X' if the x one is.
    Returns None if there is a key error.    """    dimensions = root.attrib    try:        if float(dimensions['height']) > float(dimensions['width']):            return 'Y'        else:            # X bigger or equal            return 'X'    except ValueError:        pass    return None
def getdimensionratio(biggerdimension, root):    """    biggerdimension is a string, 'X' or 'Y'.
    root is the etree Element for the    svg Element that is to be embedded    into the final svg file
    Returns ratio of bigger dimension    to smaller one (float).    """    dimensions = root.attrib    if biggerdimension == 'Y':        return float(dimensions['height']) / float(dimensions['width'])    else:        return float(dimensions['width']) / float(dimensions['height'])
def getposition(dimensions, attrib):    """    dimensions is an x, y two tuple.
    attrib is a dictionary.
    Returns x, y position of svg graphic as a    two tuple.    """    # Add 4.    x = attrib['X'] + dimensions[0]    # Add negative number with big absolute value.    # Upper right quadrant translation thing.    y = attrib['Y'] + dimensions[1]     return x, y
def getdimensions(attrib, biggerdimension, dimensionratio):    """    Get width and height of svg within    final document.
    attrib is the dictionary of numeric values    associated with the original image    position of the png within the    svg document.
    biggerdimension is the 'X' or 'Y' value that    indicates which dimension is the larger of    the two.
    dimensionratio is the ratio of the larger    dimension to the smaller one.
    Returns x, y two tuple of floats.    """    if biggerdimension == 'Y':        return (attrib['width'],  dimensionratio * attrib['width'])    else:        return (dimensionratio * attrib['height'], attrib['height'])
def getdimensionsorig(root):    """    root is the ElementTree Element    for the svg Element to be embedded     in the main svg file.
    Returns two tuple of width, height.    """    return float(root.attrib['width']), float(root.attrib['height'])

# OUTPUT (stdout)

Getting Hamilton logo svg file root Element . . .Getting company logo svg file root Element . . .Getting root Element of main graph svg file . . .Getting dimensions and viewBox for main graph svg file . . .Getting ElementTree indices for tree for Hamilton png logo Element . . .Getting ElementTree indices for tree for png Element . . .Getting ElementTree indices for tree for company png logo Element . . .Getting ElementTree indices for tree for png Element . . .Getting attrib dictionary for original Hamilton png file Element in graph svg . . .Getting attrib dictionary for original company png file Element in graph svg . . .Getting svg text values into float format for Hamilton png Element . . .Getting svg text values into float format for company logo png Element . . .Determining bigger dimension for svg Hamilton logo . . .Calculating dimensions ratio for Hamilton logo svg . . .Getting position of Hamilton logo . . .Getting size of Hamilton logo in final doc . . .Retrieving dimensions of Hamilton logo svg . . .Determining bigger dimension for svg company logo . . .Calculating dimensions ratio for company logo svg . . .Getting position of company logo . . .Getting size of company logo in final doc . . .Retrieving dimensions of company logo svg . . .Making changes to svg . . .Popping original Hamilton png logo . . .Appending Hamilton svg to root Element . . .Adjusting viewBox for Hamilton svg . . .Adjusting height and width for Hamilton svg . . .Positioning Hamilton logo svg within final svg . . .Erasing Hamilton logo bounding box . . .Popping original company png logo . . .Adding company logo svg Element to main svg file . . .Adjusting viewBox for company svg . . .Adjusting height and width for company svg . . .Moving company logo svg to the correct position in the display . . .Erasing company logo bounding box . . .Writing new svg . . .
doc_attrib =
{'height': '825pt', 'viewBox': '0.00 0.00 936.00 824.60', 'width': '936pt'}
hamilton_logo_tree_indices =
(0, 4, 2)
company_logo_tree_indices =
(0, 5, 2)
hamilton_logo_png_attrib =
{'height': '43.2px', 'preserveAspectRatio': 'xMinYMin meet', 'width': '43.2px', 'x': '218.3', 'y': '-673.9', '{http://www.w3.org/1999/xlink}href': 'hamiltonlogolarge.png'}
parsed_hamiltonlogo_png_attrib =
{'X': 218.3, 'Y': -673.9, 'height': 43.2, 'width': 43.2}
company_logo_png_attrib =
{'height': '43.2px', 'preserveAspectRatio': 'xMinYMin meet', 'width': '367.2px', 'x': '279.3', 'y': '-673.9', '{http://www.w3.org/1999/xlink}href': 'fauxcompanylogo.png'}
parsed_companylogo_png_attrib =
{'X': 279.3, 'Y': -673.9, 'height': 43.2, 'width': 367.2}
biggerdimension =
'X'
dimensionratio =
1.0421153385977506
parsed_graph_dimensions =
(4.0, 820.6)
hamilton_logo_position =
(222.3, 146.70000000000005)
hamilton_svg_dimensions =
(45.01938262742283, 43.2)
hamilton_logo_dimensions_orig =
(8710.0, 8358.0)
dimensionratio_company =
9.047619047619047
company_logo_position =
(283.3, 146.70000000000005)
company_svg_dimensions =
(390.8571428571429, 43.2)
company_logo_dimensions_orig =
(712.5, 78.75)
final_svg_file =
'data_source_highlighted_final.svg'

# . . . etc. 2 more times.

Note on DAG Hamilton: my use case for this tool is very rudimentary and somewhat pedestrian. That said, it is becoming essential to my workflows.

The DAG Hamilton project is still at its relatively early stages with some very exciting active development ongoing. It seems like every week some amazing new decorator feature gets released.

I am not much of one for decorators use - grateful for their existence and use in the 3rd party modules I use. Truthfully, 3/4 of the work I do could probably be accomplished with a relatively recent version of Python and dictionaries.

Where DAG Hamilton helps me out a lot is in corralling and organizing code. I tend to get a bit undisciplined and have trouble "seeing" the execution path. DAG Hamilton helps there.

Thanks for stopping by.










Categories: FLOSS Project Planets

Kalyani Kenekar: One Backpack, One Passport: My First Solo Trip

Planet Debian - Fri, 2024-08-09 14:30
Planing A Self Organized Solo Trip

You know the movie Queen?

The actor Kangana Ranaut plays in that movie the role of Rani Mehra, a 24-year-old Punjabi woman, who was a simple, homely girl that was always reliant on her family. Similar to Rani I too rarely ventured out without my parents and often needed my younger sibling by my side. Inspired by her transformation, I decided it was time to take control of my own story and discover who I truly am.

Trip Requirements My First Passport

The journey began with a significant first step: Obtaining my first passport❗️ Never having had one before, I scheduled the nearest available interview date on June 29 2022. This meant traveling to Solapur, a city 309 km from my hometown, accompanied by my father. After successfully completing the interview, I received my passport on July 14 2022.

Select A Country, Booking Flights And Accommodation

Excited and ready to embark on my adventure, I planed trip to Albania 🇦🇱 and booked the flight tickets. Why? I had heard from friends that it was a beautiful European country with beaches and other attractions, and importantly, it didn’t require a visa for Indian citizens and was more affordable than other European destinations. Before heading to Albania, I planned a overnight stop in Abu Dhabi with a transit visa, thanks to friend who knew the process for obtaining it.

Some of my friends did travel also to Europe at the same time and quite close to my plannings, but that I realized just later the trip. 😉

Day 1, Starting The Experience

On July 20, 2022, I started my journey by traveling from Pune, Maharashtra, to Delhi, where my brother lives. He came to see me off at the airport, adding a touch of warmth and support to the beginning of my solo adventure. Upon arriving in Delhi, with my next flight scheduled for July 21, I stayed at a backpacker hostel named Zostel, Paharganj, Delhi to rest.

During my stay, I noticed that many travelers at the hostel carried rucksacks, which sparked a desire in me to get one for my own trip to Europe. Up until then, I had always shopped with my mom and had never bought anything on my own. Inspired by the travelers, I set out to find a suitable rucksack. I traveled alone by metro from Paharganj to Rohini to visit a Decathlon store, where I purchased a 50-liter rucksack. This was a significant step in preparing for my European adventure and marked a milestone in my journey of self reliance.

Day 2, Flying To Abu Dhabi

The following day, July 21 2024, I had a flight to Abu Dhabi. I spent the night at the hostel to rest before my journey. On the day of the flight, I needed to reach the airport by 3 PM, and a friend kindly came to drop me off. With my rucksack packed and excitement building, I was ready for the next leg of my adventure.

When we arrived at the airport, my friend saw me off, marking the start of my international journey. With mom made spices, chutneys, and chilly flakes packed for comfort, I completed my immigration process in about two and a half hours. I then settled at the gate for my flight, feeling a mix of excitement and anxiety as thoughts raced through my mind.

To ease my nerves, I struck up a conversation with a man seated nearby who was also traveling to Abu Dhabi for work. He provided helpful information about safety and transportation in Abu Dhabi, which reassured me. With the boarding process complete and my anxiety somewhat eased. I found my window seat on the flight and settled in, excited for the journey ahead. Next to me was a young man from Ranchi(Zarkhand, India), heading to Abu Dhabi for work at a mining factory. We had an engaging conversation about work culture in Abu Dhabi and recruitment from India.

Upon arriving in Abu Dhabi, I completed my transit, collected my luggage, and began finding my way to the hotel Premier Inn AbuDhabi, which was in the airport area. To my surprise, I ran into the same man from the flight, now in a cab. He kindly offered to drop me at my hotel, which I gladly accepted since navigating an unfamiliar city with a short acquaintance felt safer.

At the hotel gate, he asked if I had local currency (Dirhams) for payment, as sometimes online transactions can fail. That hadn’t crossed my mind, and I realized I might be left stranded if a transaction failed. Recognizing his help as a godsend, I asked if he could lend me some Dirhams, promising to transfer the amount later. He kindly assured me to pay him back once I reached the hotel room. With that relief, I checked into the hotel, feeling deeply grateful for the unexpected assistance and transferred the money to him after getting to my room.

Day 3, Flying And Arrive In Tirana

Once in the hotel room, I found it hard to sleep, anxious about waking up on time for my flight. I set an alarm to wake up early, but my subconscious mind kept me alert, and I woke up before the alarm went off. I got freshened up and went down for breakfast, where I found some vegetarian options like Idli-Sambar and bread with butter, along with some morning tea. After breakfast, I headed back to the airport, ready to catch my flight to my final destination: Tirana, Albania.

I reached Tirana, Albania after a six hours flight, feeling exhausted and I was suffering from a headache. The air pressure had blocked my ears, and jet lag added to my fatigue. After collecting my checked luggage, I headed to the first ATM machine at the airport. Struggling to insert my card, I asked a nearby gentleman for help. He tried his best, but my card got stuck inside the machine. Panic 🥵 set in as I worried about how I would survive without money. Taking a deep breath, I found an airport employee and explained the situation. The gentleman stayed with me, offering support and repeatedly apologizing for his mistake. However, it wasn’t his fault, the ATM was out of order, which I hadn’t noticed. My focus was solely on retrieving my ATM card. The airport employee worked diligently, using a hairpin to carefully extract my card. Finally, the card was freed, and I felt an immense sense of relief, grateful for the help of these kind strangers. I used another ATM, successfully withdrew money, and then went to an airport mobile SIM shop to buy a new SIM card for local internet and connectivity.

Day 4, Arriving In Tirana, Facing Challenges In A Foreign Country

I had booked a stay at a backpacker hostel near the city center of Tirana. After sorting out the ATM and SIM card issues, I searched for a bus or any transport to get there. It was quite late, around 8:30 PM, and being in a new city, I was in a hurry. I saw a bus nearly leaving the airport, stopped it, and asked if it went to the city center. They gave me the green flag, so I boarded the airport service bus and reached the city center.

Feeling very tired, I discovered that the hostel was about an hour and a half away by walking. Deciding to take a cab, I faced a challenge as the driver couldn’t understand my English or accent. Using a mobile translator to convert my address from English to Albanian, I finally communicated my destination to him. With that sorted out, I headed to the Blue Door Backpacker Hostel and arrived around 9 PM, relieved to have finally reached my destination and I checked in.

I found my top bunk bed, only to realize I had booked a mixed-gender dormitory. This detail had completely escaped my notice during the booking process. I felt unsure about how to handle the situation. Coincidentally, my experience mirrored what Kangana faced in the movie “Queen”.

Feeling acidic due to an empty stomach and the exhaustion of heavy traveling, I wasn’t up to cooking in the hostel’s kitchen.

I asked the front desk about the nearest restaurant. It was nearly 9:30 PM, and the streets were deserted. To avoid any mishaps like in the movie “Queen,” I kept my passport securely locked in my bag, ensuring it wouldn’t be a victim of theft.

Venturing out for dinner, I felt uneasy on the quiet streets. I eventually found a restaurant recommended by the hostel, but the menu was almost entirely non-vegetarian. I struggled to ask about vegetarian options and was uncertain if any dishes contained eggs, as some people consider eggs to be vegetarian. Feeling frustrated and unsure, I left the restaurant without eating.

I noticed a nearby grocery store that was about to close and managed to get a few extra minutes to shop. I bought some snacks, wafers, milk, and tea bags (though I couldn’t find tea powder to make Indian-style tea). Returning to the hostel, I made do with wafers, cookies, and milk for dinner. That day was incredibly tough for me, I filled with exhaustion and struggle in a new country, I was on the verge of tears 🥹.

I made a video call home before sleeping on the top bunk bed. It was a new experience for me, sharing a room with both unknown men and women. I kept my passport safe inside my purse and under my pillow while sleeping, staying very conscious about its security.

Day 5, Exploring Nearby Places

I woke up the next day at noon. After having some coffee, the hostel management girl asked if I wanted breakfast. She offered curd with cornflakes, which I refused because I don’t like curd. Instead, I ordered a pizza from a vegetarian pizza place with her help, and I started feeling better.

I met some people in the hostel, some from Syria and others from Italy. I struggled to understand their accents but kept pushing myself to get involved in their discussions. Despite the challenges, I felt more at ease and was slowly adapting to my new environment.

I went out from the hostel in the evening to buy some vegetables to cook something. I searched for shops and found some potatoes, tomatoes, and rice. I decided to cook Khichdi, an Indian dish made with rice, and added some chili flakes I brought from home. After preparing my dinner, I ate and then went to sleep again.

Day 6, Tiranas Recent History

The next day, I planned to explore the city and visited Bunkart-1, a fascinating museum in a massive underground bunker from the communist era. Originally built as a shelter for Albania’s political and military elite, it now offers a unique glimpse into the country’s history under Enver Hoxha’s oppressive regime. The museum’s exhibits include historical artifacts, photographs, and multimedia displays that detail the lives of Albanians during that time. Walking through the dimly lit corridors, I felt the weight of history and gained a deeper understanding of Albania’s past.

Day 7-8, Meeting Friends From India

The next day, I accidentally met with Chirag, who was returning from the Debian Conference 2022 held in Prizren, Kosovo, and staying at the same hostel. When I encountered him, he was talking on the phone, and I recognized he was Indian by his accent. I introduced myself, and we discovered we had some mutual friends.

Chirag told me that our common friend, Raju, was also coming to stay at the hostel the next day. This news made me feel relaxed and happy to have known people around. When Raju arrived, the three of us, Chirag, Raju, and I planned to have dinner at an Indian restaurant and explore Tirana city. I had a great time talking and enjoying their company.

Day 9-10, Meeting More Friends

Raju had a ticket to leave soon, so Chirag and I made a plan to visit Shkodër and the nearby Komani Lake for kayaking. We started our journey early in the morning by bus and reached Shkodër. There, we met new friends from the conference, Pavit and Abraham, who were already there. We had dinner together and enjoyed an ice cream treat from Chirag.

Day 12, Kayaking And Say Good Bye To Friends

The next day, Pavit and Abraham had a flight back to India, so Chirag and I went to Komani Lake. We had an adventurous time kayaking, even though neither of us knew how to swim. We took a ferry through the backwaters to the island on Komani Lake and enjoyed a fantastic adventure together. After our trip, Chirag returned to Tirana for his flight back to India, leaving me to continue my journey alone.

There should have been a video here but your browser does not seem to support it.

Day 13, Climbing Rozafa Castel

By stopping at Shkodër, I visited Rozafa Castle. Despite the language barrier, as most locals only spoke Albanian, people around me guided me correctly on how to get there. At times, I used applications like Google Translate to communicate. To read signs or hotel menus, I used Google Photos' language converter. I even used the audio converter to understand and speak some basic Albanian phrases.

I took a bus from Shkodër to the southern part of Albania, heading to Sarandë. The journey lasted about five to six hours, and I had booked a stay at Mona’s Hostel. Upon arrival, I met Eliza from America, and we went together to Ksamil Beach, spending a wonderful day there.

Day 14, Vlora Beach: Beach Side Cycling

Next, I traveled to Vlorë, where I stayed for one day. During my time there, I enjoyed beach side cycling with a cycle provided by the hostel owner and spent some time feeding fish. I also met a fellow traveler from Delhi who had brought along some preserved Indian curry. He kindly shared it with me, which was a welcome change after nearly 15 days without authentic Indian cuisine, except for what I had cooked myself in various hostels.

Day 15-16 Visiting Durress, Travelling Back To Tirana

I then visited Durrës, exploring its beautiful beaches, before heading back to Tirana one day before my flight home. On the day of my flight, my alarm didn’t go off, and I woke up late at the hostel. In a frantic rush, I packed everything in just five minutes and dashed toward the city center to catch the bus to the airport. If I had been just five minutes later, I would have missed the bus. Thankfully, I managed to stop it just in time and began my journey back home, reflecting on the incredible adventure I had experienced.

Fortunately, I wasn’t late; I arrived at the airport just in time. After clearing immigration, I boarded my flight, which had a layover in Warsaw, Poland. The journey from Tirana to Warsaw took about two and a half hours, followed by a seven to eight-hour flight from Poland back to India. Once I arrived in Delhi, I returned to Zostel and booked a train ticket to Aurangabad for the next three days.

Backview 😄

This trip was an incredible adventure for me. I never imagined I could accomplish something like this, but I did. Meeting diverse people, experiencing different cultures, and learning so much made this journey truly unforgettable.

Looking back, I realize how much I’ve grown from this experience. Although I may have more opportunities to travel abroad in the future, this trip will always hold a special place in my heart. The memories I made and the incredible people I met along the way are irreplaceable.

This experience goes beyond what I can express through this blog or words; it was incredibly precious to me. Every moment of this journey is etched in my memory, and I am grateful for every part of it.

Categories: FLOSS Project Planets

Pages