[{"content":"Overview As a SysAdmin at Cognativ, I support Linux and hybrid infrastructure across Microsoft Azure and on-premises Proxmox environments. My work focuses on reliable software delivery, infrastructure operations, production troubleshooting, and close collaboration with development and support teams.\nKey Responsibilities and Achievements Configured, deployed, and maintained self-hosted Gitea and act runners for on-premises and hybrid development workflows, improving job execution speed and infrastructure integration. Planned and implemented resilient CI/CD workflows for multi-environment deployments, improving build control and reducing dependency on external automation services. Managed hybrid Azure and Proxmox environments, coordinating virtual machines, networking, storage, access policies, and workload placement. Administered and tuned production databases, including backups, performance optimization, user access control, replication support, and routine maintenance. Troubleshot application failures, deployment issues, and infrastructure incidents to maintain service continuity and reduce downtime. Collaborated with developers and support teams to streamline releases and resolve environment-specific issues across hybrid infrastructure. Executed operational SOPs and runbooks for service restarts, credential rotation, failover checks, and standard diagnostics across Debian and Nix-based Linux systems. Key Technologies Microsoft Azure and Proxmox Debian, Nix, and Linux system administration Gitea, act runners, Git, and CI/CD automation Virtual machines, networking, storage, and access control Database administration, backups, monitoring, and diagnostics ","permalink":"https://tin3ga.netlify.app/experience/cognativ/","summary":"Overview As a SysAdmin at Cognativ, I support Linux and hybrid infrastructure across Microsoft Azure and on-premises Proxmox environments. My work focuses on reliable software delivery, infrastructure operations, production troubleshooting, and close collaboration with development and support teams.\nKey Responsibilities and Achievements Configured, deployed, and maintained self-hosted Gitea and act runners for on-premises and hybrid development workflows, improving job execution speed and infrastructure integration. Planned and implemented resilient CI/CD workflows for multi-environment deployments, improving build control and reducing dependency on external automation services.","title":"SysAdmin"},{"content":"Overview As a Backend Developer and DevOps Engineer at InterIntel Technologies Limited, I built scalable data-processing workflows, automated infrastructure operations, and supported cloud-based communication systems. My work combined Python backend development, data engineering, deployment automation, observability, and production support.\nKey Responsibilities and Achievements Planned and implemented scalable data pipelines with Apache Spark, Cassandra, and PostgreSQL to process large data volumes for analytics and real-time decision-making. Designed ETL functions, packages, and pipelines to extract, transform, and load data from databases, APIs, spreadsheets, and flat files. Identified and resolved SQL query and ETL bottlenecks, improving data retrieval and loading performance. Automated streaming ETL workflows with Faust to process and transform high-volume analytics data. Deployed and managed a GitOps delivery pipeline with ArgoCD and Helm for microservices across staging and production Kubernetes clusters. Monitored infrastructure with Prometheus and Grafana, creating alerts for resource bottlenecks and service failures. Developed Bash and Python scripts to automate server configuration, backups, and log rotation. Delivered a cloud-based customer service solution using AudioCodes Virtual Edition SBC and Microsoft Teams Direct Routing. Data Pipeline Development and Integration I created reusable ETL components and end-to-end workflows that improved data quality, processing efficiency, and maintainability across multiple sources and targets.\nPipeline Design and Performance Configured connectors for PostgreSQL, spreadsheets, CSV files, APIs, and other data sources. Implemented data-quality and integrity checks to keep transformed data accurate and consistent. Built transformation functions with pandas and Apache Spark for cleaning, standardization, aggregation, and format conversion. Optimized loading through bulk inserts, batching, prepared statements, asynchronous operations, partitioning, and incremental loads. Restructured complex SQL queries and optimized joins and partitioning strategies for faster retrieval from large datasets. Key Technologies Python, SQL, pandas, Apache Spark, and Faust PostgreSQL and Cassandra Psycopg and Cassandra CQL Engine Customer Service Solution Architecture I developed a secure, cloud-based voice solution using AudioCodes Virtual Edition SBC integrated with Microsoft Teams. The system enabled scalable customer-support communications through Direct Routing.\nArchitecture and Integration Designed a hybrid framework that securely routed voice traffic between AudioCodes VE SBC and Microsoft Teams. Defined Azure infrastructure and networking requirements for reliable voice integration. Provisioned the required Microsoft Teams licenses, users, and voice-routing policies. Configured AudioCodes VE SBC as a Microsoft Teams Direct Routing interface. Secured SIP trunking with TLS and SRTP encryption to protect voice traffic. Key Technologies AudioCodes Virtual Edition SBC Microsoft Teams Direct Routing and Phone System Microsoft Azure virtual networks and virtual machines ","permalink":"https://tin3ga.netlify.app/experience/interintel/","summary":"Overview As a Backend Developer and DevOps Engineer at InterIntel Technologies Limited, I built scalable data-processing workflows, automated infrastructure operations, and supported cloud-based communication systems. My work combined Python backend development, data engineering, deployment automation, observability, and production support.\nKey Responsibilities and Achievements Planned and implemented scalable data pipelines with Apache Spark, Cassandra, and PostgreSQL to process large data volumes for analytics and real-time decision-making. Designed ETL functions, packages, and pipelines to extract, transform, and load data from databases, APIs, spreadsheets, and flat files.","title":"Backend Developer / DevOps Engineer"},{"content":"Pull Request A pull request (PR) is a fundamental concept in version control systems, particularly in distributed version control systems like Git. It is a mechanism used to propose changes to a codebase in a collaborative software development environment.\nBenefits of a pull request workflow Isolation of Changes: Each pull request is associated with a specific branch, allowing changes to be isolated until they are thoroughly reviewed and tested. Collaborative Code Review: They facilitate collaborative code reviews, allowing multiple team members to review and discuss proposed changes before merging. Continuous Integration: Integration with CI tools ensures that changes do not break existing functionality and meet project standards before being merged. Improve code quality and performance: When creating a pull request, you\u0026rsquo;re inviting a colleague to review your code, seeking constructive feedback. This collaborative process aims to enhance code quality through the insights and suggestions provided by the reviewer. Pull requests play a pivotal role in version control systems. Tools like Copilot for PRs and CodiumAI PR-Agent serve the purpose of enhancing PR descriptions and facilitating faster review and merging processes, thereby contributing to improved collaboration within your team.\nCodiumAI\u0026rsquo;s PR-Agent CodiumAI\u0026rsquo;s PR-Agent is an open source AI agent tool designed to streamline and expedite the process of reviewing pull requests (PRs). This tool automatically analyzes both the commits and the PR itself, delivering various types of feedback to enhance the efficiency of the review process. CodiumAI\u0026rsquo;s PR Agent features include:\nPR Review: Feedback about the PR main theme, type, relevant tests, security issues, focused PR, and various suggestions for the PR content. Auto-Description: Automatically generating PR description - name, type, summary, and code walkthrough. Question Answering: Answering free-text questions about the PR. Code Suggestion: Committable code suggestions for improving the PR. Getting started with CodiumAI\u0026rsquo;s PR-Agent For public repositories Just mention the name @CodiumAI-Agent in your git provider environment and ask to /review, /describe, /improve, or /ask anything e.g. \u0026ldquo;Is my PR documented enough?\u0026rdquo;, and the agent will perform these tasks for you.\nFor private repositories and open-source projects: You will first need to install the app on you private repo. Just follow this detailed step by step guide. Then summon your pull request helping agent easily, just write /review, /describe, /improve or /ask anything e.g. \u0026ldquo;is my PR documented enough?\u0026rdquo;, and the agent will perform these tasks for you.\nTry it it\u0026rsquo;s Free In any PR comment on your public GitHub repository, mention @CodiumAI-Agent with a desired command in any PR comment. The agent will generate a response based on your command.\nPR-Agent Commands Explore the links for in-depth details and examples related to the commands.\n✅ /review: Scans the PR code changes, and automatically generates a PR review.\n✅ /ask \u0026ldquo;\u0026hellip;\u0026rdquo;: Answers questions about the PR, based on the PR code changes.\n✅ /improve: Scans the PR code changes, and automatically generates committable suggestions for improving the PR code.\n✅ /describe: Scans the PR code changes, and automatically generates PR description - title, type, summary, code walkthrough and labels.\n✅ /add_docs: Scans the PR code changes, and automatically suggests documentation for the undocumented code components (functions, classes, etc.).\n✅ /similar_issue: Retrieves the most similar issues to the current issue.\n✅ /update_changelog: Automatically updates the CHANGELOG.md file with the PR changes.\n✅ /generate_labels: Scans the PR code changes, and given a list of labels and their descriptions, it automatically suggests labels that match the PR code changes.\nCopilot for PRs Copilot for PRs brings the power of Copilot to the PR experience, to help you write better PR descriptions, and to help your team review and merge PRs faster. Copilot for PRs features include:\nSuggestions for your pull request description : allows developers to insert marker tags in their pull request description. When the description is saved, Copilot will expand the marker into a description of the changes in the pull request. AI-powered review responses: auto-generate changes in response to requests to add documentation or even to add another test AI-powered PR repair: Proposes a fix to forgotten documentation and unit test updates during the PR process. AI-powered PR completion: Copilot\u0026rsquo;s bot is being empowered with the capability to complete pull requests given a few indicative edits such as adding comments to all your functions, throughout all your code. Gentest: Copilot\u0026rsquo;s prototype uses AI to identify changes in your PR that may be lacking tests, and suggests tests for you to build on or use directly. Resolving issues with AI: automatically describes how to solve an issue and even to automatically suggest the changes you need to make. Getting started with Copilot for PRs Sign in with GitHub. This dashboard will be used to manage your Copilot for PRs settings. Install the GitHub App. You must have admin access to the repository or be an owner of the organization to install the GitHub App. Add your repos to the waitlist. Copilot for PRs is available as a technical preview in order to identify if it brings value to our users. We\u0026rsquo;re limited on capacity, so you\u0026rsquo;ll need to add your repositories to our waitlist. Include marker tags in your PR description. Copilot will automatically expand them for you. Copilot for PRs Markers/commands copilot:all: showcases all the different kinds of content in one go.\ncopilot:summary: expands to a one-paragraph summary of the changes in the pull request.\ncopilot:walkthrough: expands to a detailed list of changes, including links to the relevant pieces of code.\ncopilot:poem: expands to a poem about the changes in the pull request.\nComparison Platforms 💻 CodiumAI\u0026rsquo;s PR-Agent offers extensive compatibility with various Git providers such as GitHub, GitLab, Bitbucket, and CodeCommit. Its versatility is showcased through multiple usage options including CLI, GitHub Action, GitHub App, Docker, among others. While Copilot for PRs currently caters exclusively to GitHub, this platform-specific support seamlessly integrates with GitHub workflows. Additionally, PR-Agent provides users with the flexibility to choose from a diverse range of models, including GPT-4, GPT-3.5, Anthropic, Cohere, and Llama2, allowing for a customized experience based on specific project requirements or user preferences.\nSource code 📜 CodiumAI\u0026rsquo;s PR-Agent operates on an open-source basis, actively encouraging contributions from the community. In contrast, GitHub Copilot is not open source; it is a proprietary product developed by GitHub, a subsidiary of Microsoft. While GitHub Copilot utilizes OpenAI\u0026rsquo;s Codex model as its underlying technology, the specific implementation and integration with GitHub remain proprietary.\nEase of Use 👍 When it comes to installation and use case scenarios, CodiumAi provides excellent documentation and clear, easy-to-follow explanations. As of right now, Copilot for PRs documentation is not as informative. In addition PR-Agent commands are concise and provide detailed feedback.\nData Privacy 🕵️ CodiumAI empowers developers who prioritize privacy to independently host their PR-Agent instances, with a steadfast commitment: no user data is stored or used for training purposes. In contrast, GitHub Copilot Business gathers personal data across three categories: User Engagement Data, Prompts, and Suggestions.\nPricing 💰 CodiumAI\u0026rsquo;s PR-Agent is available for free, in contrast to GitHub Copilot, which comes with a price tag of $10 USD per month or $100 USD per year. Nonetheless, GitHub Copilot does offer a complimentary tier for students and educators.\nConclusion By automatically generating detailed pull request descriptions, providing intelligent code suggestions, and ensuring documentation accuracy, CodiumAI sets itself apart with unparalleled depth and customization. Unlike settling for less, users embrace a tool that evolves with them, thanks to its open-source nature. CodiumAI serves as a community-driven platform, incorporating diverse expertise to cater to the ever-changing needs of developers. Acting as a coding companion, it supports users in tasks ranging from intricate code reviews to generating test cases, answering queries, and streamlining changelog updates.\n","permalink":"https://tin3ga.netlify.app/posts/elevating-prs-with-the-magic-of-an-ai-agent-for-a-seamless-experience/","summary":"Pull Request A pull request (PR) is a fundamental concept in version control systems, particularly in distributed version control systems like Git. It is a mechanism used to propose changes to a codebase in a collaborative software development environment.\nBenefits of a pull request workflow Isolation of Changes: Each pull request is associated with a specific branch, allowing changes to be isolated until they are thoroughly reviewed and tested. Collaborative Code Review: They facilitate collaborative code reviews, allowing multiple team members to review and discuss proposed changes before merging.","title":"Elevating PRs With the Magic of an AI Agent for a Seamless Experience"},{"content":"Overview During my internship with ICT Authority in Machakos, I supported day-to-day IT operations and the Digital Literacy Program. The role strengthened my practical experience in network access management, end-user support, hardware and software maintenance, and technical troubleshooting.\nKey Responsibilities and Achievements Managed and monitored internet access using Agile Controller, including creating user accounts, resetting passwords, and revoking access. Diagnosed and resolved system and network issues across hardware and software environments. Configured, deployed, and maintained end-user equipment and accessories to ensure reliable operation. Installed and upgraded computer hardware and software to meet organizational requirements. Performed data entry for beneficiary schools participating in the Digital Literacy Program. Configured and troubleshot Voice over Internet Protocol (VoIP) phones to support reliable communication. The internship also strengthened my communication, teamwork, and problem-solving skills in a public-sector IT environment.\n","permalink":"https://tin3ga.netlify.app/experience/icta/","summary":"Overview During my internship with ICT Authority in Machakos, I supported day-to-day IT operations and the Digital Literacy Program. The role strengthened my practical experience in network access management, end-user support, hardware and software maintenance, and technical troubleshooting.\nKey Responsibilities and Achievements Managed and monitored internet access using Agile Controller, including creating user accounts, resetting passwords, and revoking access. Diagnosed and resolved system and network issues across hardware and software environments.","title":"Information Technology Intern"},{"content":"Introduction I am going demonstrate how you can add an appimage application shortcut to linux desktop system\u0026rsquo;s application menu and also how to customize its icon.But first lets get to understand what an appimage software is.\nWhat is an appimage application For starters,there are many ways an application can be installed in a linux system i.e deb packages,snaps,flatpaks and appimages.Our focus today is appimages. An Appimage application is a single portable and executable software that can be run on linux without installation.\nBenefits of using appimages Compatibility with most linux distributions. Simple to run i.e download,make it executable and run.since it is not installed no system libraries are altered. Download and use trusted software directly from the original author(s). Uninstalling is as simple as just deleting the file. Running an app image Lets download the fluent reader software(it is a modern rss reader) as an example. Once download is completed,navigate to the downloads folder and right-click on the downloaded appimage file,click on Properties thereafter,Click on the permissions tab and check the execute option. The software should be running by now without any problems.\nAdding a shortcut with custom icon to the linux application menu Note: super user permission is required for this process.\nOpen the terminal Navigare to the /usr/share/applications directory. Create a new file with a .desktop extension in the applications directory. Open the file with gedit Add the following template text to your empty file and replace with the location of your exec(i.e appimage location) and icon of your choice.eg Save your file and exit the terminal. You should be able to see your software shortcut in the menu and it should run when clicked if you followed the steps above correctly.\nThanks and have fun🙂\n","permalink":"https://tin3ga.netlify.app/posts/appimage-software-menu-shortcut/","summary":"Introduction I am going demonstrate how you can add an appimage application shortcut to linux desktop system\u0026rsquo;s application menu and also how to customize its icon.But first lets get to understand what an appimage software is.\nWhat is an appimage application For starters,there are many ways an application can be installed in a linux system i.e deb packages,snaps,flatpaks and appimages.Our focus today is appimages. An Appimage application is a single portable and executable software that can be run on linux without installation.","title":"Appimage Software Menu Shortcut"},{"content":"Introduction Docker Compose is a tool used for defining and running multi-container Docker applications. It allows developers to describe all the services that make up an application in a single YAML file, defining the relationships and configurations between them. Docker Compose then uses this YAML configuration to deploy and manage the application\u0026rsquo;s containers as a single unit. Docker Compose is particularly useful for development environments, testing, and deploying multi-container applications in a consistent and reproducible manner. It simplifies the process of managing complex application architectures by providing a declarative configuration file and a set of commands for common operations.\nComponents of Docker compose compose file A YAML file is used to define the configuration of the entire application stack, including services, networks, and volumes. It specifies details such as the Docker images to use, container dependencies, environment variables etc.\nThe default path for a Compose file is compose.yaml or compose.yml. docker-compose.yml/docker-compose.yaml also supported for backwards compatibility.\nServices Each service in a Docker Compose file represents a containerized application component. Services can be built from a specified Dockerfile or use pre-built images from a registry. You can define the relationships and dependencies between services.\nVolumes Volumes can be defined to persist data outside the containers. This is crucial for storing data that needs to survive container restarts or updates.\nEnvironment Variables Docker Compose allows you to set environment variables for services.\nNetworks Docker Compose allows you to define custom networks to connect containers and control communication between them. Services can be attached to specific networks to isolate or expose their communication.\nA Sample compose file The Docker Compose file below defines a set of services that work together to run a Flask-based todo application along with a PostgreSQL database and Traefik as a reverse proxy/load balancer.\nservices: todo: image: tinegagideon/flask-todo ports: - \u0026#34;5000:5000\u0026#34; environment: - DATABASE_URL=postgresql+psycopg2://postgres:postgres@todo-db:5432/postgres labels: # Explicitly tell Traefik to expose this container - \u0026#34;traefik.enable=true\u0026#34; # The domain the service will respond to - \u0026#34;traefik.http.routers.todo.rule=Host(`localhost`)\u0026#34; depends_on: - todo-db - traefik todo-db: image: postgres:14 ports: - \u0026#34;5432:5432\u0026#34; environment: - POSTGRES_PASSWORD=postgres - POSTGRES_USER=postgres - POSTGRES_DB=postgres volumes: - pgdata:/var/lib/postgresql/data traefik: image: traefik:v3.0 command: - \u0026#34;--api.insecure=true\u0026#34; - \u0026#34;--providers.docker=true\u0026#34; - \u0026#34;--providers.docker.exposedbydefault=false\u0026#34; - \u0026#34;--entrypoints.web.address=:80\u0026#34; ports: - \u0026#34;80:80\u0026#34; - \u0026#34;8080:8080\u0026#34; volumes: - \u0026#34;/var/run/docker.sock:/var/run/docker.sock:ro\u0026#34; volumes: pgdata: Compose file breakdown The compose file is divided into two sections: services and volume, with three services.\nServices Section todo Service\nIt uses an image named tinegagideon/flask-todo for the Flask todo application. Exposes port 5000 of the container to port 5000 of the host machine. Sets environment variables for the Flask application, including the database URL. Uses labels to configure Traefik to expose this service and defines the routing rule. Depends on the todo-db service and the traefik service. todo-db Service\nUses the official PostgreSQL image with version 14. Exposes port 5432 of the container to port 5432 of the host machine. Sets environment variables for the PostgreSQL database i.e the password, username, and database name. Mounts a volume named pgdata to persist PostgreSQL data. traefik Service\nUses the Traefik image with version 3.0. Specifies command-line arguments for Traefik: --api.insecure=true enables insecure access to the Traefik API.\n--providers.docker=true enables Docker as a provider.\n--providers.docker.exposedbydefault=false specifies that services must be explicitly exposed.\n--entrypoints.web.address=:80 defines the entry point for HTTP traffic.\nExposes port 80 and port 8080 of the container to the corresponding ports on the host machine. Mounts the Docker socket to interact with Docker daemon inside the Traefik container. Volumes Section Defines a named volume named pgdata that is used by the todo-db service to persist PostgreSQL data.\n","permalink":"https://tin3ga.netlify.app/posts/a-docker-compose-example-flaskapp-+-postgresql-+-traefik/","summary":"Introduction Docker Compose is a tool used for defining and running multi-container Docker applications. It allows developers to describe all the services that make up an application in a single YAML file, defining the relationships and configurations between them. Docker Compose then uses this YAML configuration to deploy and manage the application\u0026rsquo;s containers as a single unit. Docker Compose is particularly useful for development environments, testing, and deploying multi-container applications in a consistent and reproducible manner.","title":"A Docker Compose Example (FlaskAPP + PostgreSQL + Traefik)"},{"content":"Introduction🐋 Docker is a revolutionary containerization platform that streamlines software development and deployment. It encapsulates applications and their dependencies, ensuring consistency across different environments. Docker eliminates the \u0026ldquo;it works on my machine\u0026rdquo; problem, promoting collaboration and scalability. Its efficient resource utilization and isolation capabilities make it a vital tool for modern software development.\nPrerequisites 📋 Flask Application. Docker Follow these steps to install docker to your computer. Docker Hub Account create a free account. I will assume that you have a basic understanding of python, especially the Flask framework and an understanding of networking ports.\nSample project 🏗️ Project Directory Structure:\nhello-flask/ ├── app/ │ ├── __init__.py │ └── app.py ├── requirements.txt └── Dockerfile Sample code in app.py file:\nfrom flask import Flask app = Flask(__name__) # create an instance of our imported Flask class. @app.route(\u0026#34;/\u0026#34;) def home(): return \u0026#39;hello flask\u0026#39; # allows the code to be executed directly as a script if __name__ == \u0026#39;__main__\u0026#39;: app.run(debug=True, host=\u0026#39;0.0.0.0\u0026#39;) Official Flask Documentation\nDockerfile 📝 Docker automates image creation by interpreting instructions from a Dockerfile, a text file containing sequential commands required to build a specific image. A Docker image comprises immutable layers, each representing an instruction from the Dockerfile. These layers are arranged in a stack, with each one capturing the incremental changes made compared to the previous layer.\ncreate a Dockerfile with the following instructions:\nFROM python:alpine RUN apk update RUN apk add -y python-pip; pip install --no-cache-dir --upgrade pip WORKDIR /hello-flask COPY requirements.txt . RUN pip install -r requirements.txt COPY /app . ENTRYPOINT [ \u0026#34;python\u0026#34; ] CMD [ \u0026#34;app.py\u0026#34; ] Each instruction break down FROM python:alpine It specifies the base image to use, in this case, python:alpine. This image is based on the Alpine Linux distribution and includes Python.\nNote that while it\u0026rsquo;s possible to use a Debian-based distro as the base image, it would require manual installation of Python within the image. A python image based on alpine is smaller size compared to other distributions, therefore contributing to a more lightweight and efficient container.\nRUN apk update This updates the package index on the Alpine system using the apk package manager.\nRUN apk add -y python-pip; pip install --no-cache-dir --upgrade pip This installs python-pip using apk and then upgrades pip to the latest version. The -y flag is used to automatically confirm the installation.\nWORKDIR /hello-flask Sets the working directory inside the container to /hello-flask.\nCOPY requirements.txt . Copies the requirements.txt file from the build context (where the Dockerfile is located) into the /hello-flask directory in the container.\nRUN pip install -r requirements.txt Installs the Python packages listed in requirements.txt using pip. This is typically done in a separate step to take advantage of Docker layer caching.\nCOPY /app . Copies the contents of the /app directory from the build context into the current working directory /hello-flask in the container.\nENTRYPOINT [ \u0026quot;python\u0026quot; ] Specifies the default executable when the container starts. In this case, it sets the default executable to Python.\nCMD [ \u0026quot;app.py\u0026quot; ] Provides default arguments for the ENTRYPOINT. When the container is run, it will execute python app.py by default.\nBuilding your docker image 🔨 The docker build command builds Docker images from a Dockerfile and a context.\ndocker image build -t myrepo/hello-flask .\nThis will build an image with the repository name as myrepo/hello-flask and a tag of latest is applied by default. The -t option allows you to tag your Docker image with a specific name and optionally a tag. Tags are typically appended to the image name by specifying them following a colon.\nThe dot at the end of the command specifies the build context. The build context is the path to the directory containing the Dockerfile and any files needed for the build process. In this case, it\u0026rsquo;s set to the current directory.\nRunning a container from your image 📦 The docker container run command runs a command in a new container, pulling the image if needed and starting the container.\ndocker container run --rm -p 5000:5000 myrepo/hello-flask\nreplace myrepo with your docker hub username or if you don\u0026rsquo;t intend to upload to image just use name of the image.e.g\ndocker container run --rm -p 5000:5000 hello-flask\n--rm This flag removes the container automatically after it stops running. It helps to keep the system clean by avoiding the accumulation of unused containers.\n-p 5000:5000 This flag maps the port 5000 from the host to the port 5000 on the container. It allows communication between the host machine and the running container through this specified port.\nmyrepo/hello-flask This is the name of the Docker image used to create the container. It\u0026rsquo;s assumed that you have an image named hello-flask in the myrepo repository.\nanother useful OPTION to add to the docker container run command is: --detach or -d this runs the container in the background and prints its ID.\nYou should be able to view a webpage by visiting http://localhost:5000\nPushing your image to docker hub 🚀 Before trying to push your image make sure to login in the docker CLI using docker login with your docker hub credentials.\nUse docker image push to upload your images to the Docker Hub registry or to a self-hosted one.\ndocker image push myrepo/hello-flask\nOther Commands docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] \u0026ndash; create an image tag\ndocker image ls \u0026ndash; lists images in your local machine.\ndocker container ls or docker ps [OPTIONS] \u0026ndash; lists containers.\ndocker container stop [container id | container name] \u0026ndash; stop a running container.\ndocker container rm [container id | container name] \u0026ndash; remove container.\ndocker image prune [OPTIONS] \u0026ndash; remove unused images.\nMore Commands - Documentation\nImages Vs Containers An image represents the application we intend to execute, while a container is an instance of that image running as a process.\nThink of a Docker image as a recipe or a blueprint for creating a specific environment, and a Docker container as a ready-made dish prepared using the recipe (image).\n","permalink":"https://tin3ga.netlify.app/posts/crafting-a-docker-image-for-your-flask-web-app/","summary":"Introduction🐋 Docker is a revolutionary containerization platform that streamlines software development and deployment. It encapsulates applications and their dependencies, ensuring consistency across different environments. Docker eliminates the \u0026ldquo;it works on my machine\u0026rdquo; problem, promoting collaboration and scalability. Its efficient resource utilization and isolation capabilities make it a vital tool for modern software development.\nPrerequisites 📋 Flask Application. Docker Follow these steps to install docker to your computer. Docker Hub Account create a free account.","title":"Crafting a Docker Image for Your Flask Web App"},{"content":"Introduction A weather application is always the first and easiest way for many developers to learn how to use APIs.Today we are going to go through the basics of creating and deploying your site build using Vue.js.\nGetting Started First we need to create a free open weather account to access their API. To use vueCLI, we need to download and install Node.js.\nOnce the installation is completed run the following commands in the terminal.\nnpm install -g @vue/cli # OR yarn global add @vue/cli creating the project To create a project open your terminal and,run vue create weather\nNavigate and select default using the arrow keys.\nWhen completed a folder will be created with git initialized. Open the folder using your code editor of choice. It should show something similar to this.\nCoding Since it is a very small application we wont need the components folder and we are going to have to delete the boilerplate code already there in the App.vue file.\ninside the div tag type the following code\n\u0026lt;header\u0026gt; \u0026lt;h1\u0026gt;WeatherApp\u0026lt;/h1\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; autocomplete=\u0026#34;off\u0026#34; class=\u0026#34;search-box\u0026#34; placeholder=\u0026#34;Search for a city...\u0026#34; v-model=\u0026#34;query\u0026#34; @keypress=\u0026#34;fetchWeather\u0026#34; /\u0026gt; \u0026lt;/header\u0026gt; \u0026lt;main class=\u0026#34;card\u0026#34; v-if=\u0026#34;typeof weather.main != \u0026#39;undefined\u0026#39;\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;location\u0026#34;\u0026gt;{{weather.name}}, {{weather.sys.country}}\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;temp\u0026#34;\u0026gt;{{ Math.round(weather.main.temp)}}°C\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;weather\u0026#34;\u0026gt;{{weather.weather[0].main}}\u0026lt;/div\u0026gt; \u0026lt;/main\u0026gt; V-model is a directive in vue.js that interacts with the DOM,we have bind the input to a variable data stored in query. @keypress(which can also be expressed as v-on:keypress) is a directive that listens to DOM events and runs fetchWeather method when triggered.\nThe following code goes inside the script tag\nexport default { name: \u0026#34;App\u0026#34;, data() { return { api_key: \u0026#34;\u0026lt;your api key\u0026gt;\u0026#34;, url_base: \u0026#34;https://api.openweathermap.org/data/2.5/\u0026#34;, query: \u0026#34;\u0026#34;, weather: {} }; }, methods: { fetchWeather(e) { if (e.key === \u0026#34;Enter\u0026#34;) { fetch( `${this.url_base}weather?q=${this.query}\u0026amp;units=metric\u0026amp;APPID=${this.api_key}` ) .then(res =\u0026gt; { return res.json(); }) .then(this.setResults); } }, setResults(results) { this.weather = results; } } }; Viewing the app in a local server open the terminal,run npm run server then click at the localhost:8080 link.\nDeployment There are various platforms from which we can deploy our app from.But we are going to focus on netlify for today.\nWe will need to sign up for an account.i recommend signing up with github.\nNetlify allows you to drag and drop the files to be deployed but alternatively you can deploy directly from github.\nUsing github makes it easy to update your site since changes are made as soon as they are pushed to your repository.To do so follow the steps below\nOn the sites menu select new site from git. Connect to Git Provider Search for your repo/configure the netlify app on Github. Build and deploy Always ensure the build command is set to npm run build and the publish directory set to dist\n","permalink":"https://tin3ga.netlify.app/posts/hosting-web-application-for-free/","summary":"Introduction A weather application is always the first and easiest way for many developers to learn how to use APIs.Today we are going to go through the basics of creating and deploying your site build using Vue.js.\nGetting Started First we need to create a free open weather account to access their API. To use vueCLI, we need to download and install Node.js.\nOnce the installation is completed run the following commands in the terminal.","title":"Hosting Web Application for Free"},{"content":" Multiple variable assignments name, age, occupation = \u0026#34;fatma\u0026#34;, 30, \u0026#34;cook\u0026#34; print(name, age, occupation) # fatma 30 cook HTTP server python -m http.server Swap variables a = \u0026#34;a\u0026#34; b = \u0026#34;b\u0026#34; a, b = b, a print(a, b) # b a Ternary operator yob = 1997 print(\u0026#34;hey kid(gen alpha)\u0026#34; if yob \u0026gt;= 2013 else \u0026#34;wassup gen z\u0026#34; if yob \u0026gt;= 1995 else\u0026#34;hello future grandma(millennials)\u0026#34; if yob \u0026gt;= 1980 else \u0026#34;hey grandma(gen x)\u0026#34; if yob \u0026gt;= 1965 else \u0026#34;hello ancestor (baby boomer)\u0026#34;) # wassup gen z Variable unpacking users = [\u0026#39;kalama\u0026#39;, \u0026#39;kairetu\u0026#39;,\u0026#39;munga\u0026#39;,\u0026#39;mwanaisha\u0026#39;] print(*users) #kalama kairetu munga mwanaisha user1, user2 , *other_users= users print(other_users) #[\u0026#39;munga\u0026#39;, \u0026#39;mwanaisha\u0026#39;] Reverse a list z = [10,20,30,40] print(z[::-1]) #[40, 30, 20, 10] Sort a list numbers = [1000000, -500000, 999999999, -1000000000, 123456789] print(sorted(numbers)) # [-1000000000, -500000, 1000000, 123456789, 999999999] Sort a list - reversed numbers = [1000000, -500000, 999999999, -1000000000, 123456789] print(sorted(numbers, reverse=True)) #[999999999, 123456789, 1000000, -500000, -1000000000] Filter from a list numbers = [1,2,3,4,5,6,7,8,9,10] odd = list(filter(lambda x: x%2!=0, numbers)) print(odd) #[1, 3, 5, 7, 9] List comprehension names = [\u0026#39;lizzy\u0026#39;,\u0026#39;bruce\u0026#39;,\u0026#39;wafula\u0026#39;] print([name.title() for name in names]) #[\u0026#39;Lizzy\u0026#39;, \u0026#39;Bruce\u0026#39;, \u0026#39;Wafula\u0026#39;] Remove duplicates from a list num = [5, 2, 8, 3, 5, 2, 1, 8, 9, 4, 1] print(list(set(num))) # [1, 2, 3, 4, 5, 8, 9] Combine two lists to a dictionary letters = [\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;, \u0026#34;c\u0026#34;, \u0026#34;d\u0026#34;] num = [1,2,3,4] print(dict(zip(letters, num))) # {\u0026#39;a\u0026#39;: 1, \u0026#39;b\u0026#39;: 2, \u0026#39;c\u0026#39;: 3, \u0026#39;d\u0026#39;: 4} Unpacking using * operator and zip pair = [(\u0026#39;jack\u0026#39;, 50),(\u0026#39;inaam\u0026#39;, 80), ( \u0026#39;Anna \u0026#39;, 70), (\u0026#39;John\u0026#39;, 35)] names, marks = zip(*pair) print(names) print(marks) #(\u0026#39;jack\u0026#39;, \u0026#39;inaam\u0026#39;, \u0026#39;Anna \u0026#39;, \u0026#39;John\u0026#39;) #(50, 80, 70, 35) Type conversion of items in an iterable using map function strings = (\u0026#34;1\u0026#34;,\u0026#34;2\u0026#34;,\u0026#34;3\u0026#34;,\u0026#34;4\u0026#34;,\u0026#34;5\u0026#34;,\u0026#34;6\u0026#34;,\u0026#34;7\u0026#34;,\u0026#34;8\u0026#34;) print(tuple(map(int, strings))) # (1, 2, 3, 4, 5, 6, 7, 8) Alternative value for input statements username = input(\u0026#39;Name: \u0026#39;) or \u0026#39;N/A\u0026#39; #or name_input = input(\u0026#39;Name: \u0026#39;) username = name_input if name_input else \u0026#39;N/A\u0026#39; Creating a shadow copy of a list mylist = [1,2,3,4,5] copy_list = mylist[:] ","permalink":"https://tin3ga.netlify.app/posts/python-one-liners/","summary":"Multiple variable assignments name, age, occupation = \u0026#34;fatma\u0026#34;, 30, \u0026#34;cook\u0026#34; print(name, age, occupation) # fatma 30 cook HTTP server python -m http.server Swap variables a = \u0026#34;a\u0026#34; b = \u0026#34;b\u0026#34; a, b = b, a print(a, b) # b a Ternary operator yob = 1997 print(\u0026#34;hey kid(gen alpha)\u0026#34; if yob \u0026gt;= 2013 else \u0026#34;wassup gen z\u0026#34; if yob \u0026gt;= 1995 else\u0026#34;hello future grandma(millennials)\u0026#34; if yob \u0026gt;= 1980 else \u0026#34;hey grandma(gen x)\u0026#34; if yob \u0026gt;= 1965 else \u0026#34;hello ancestor (baby boomer)\u0026#34;) # wassup gen z Variable unpacking users = [\u0026#39;kalama\u0026#39;, \u0026#39;kairetu\u0026#39;,\u0026#39;munga\u0026#39;,\u0026#39;mwanaisha\u0026#39;] print(*users) #kalama kairetu munga mwanaisha user1, user2 , *other_users= users print(other_users) #[\u0026#39;munga\u0026#39;, \u0026#39;mwanaisha\u0026#39;] Reverse a list z = [10,20,30,40] print(z[::-1]) #[40, 30, 20, 10] Sort a list numbers = [1000000, -500000, 999999999, -1000000000, 123456789] print(sorted(numbers)) # [-1000000000, -500000, 1000000, 123456789, 999999999] Sort a list - reversed numbers = [1000000, -500000, 999999999, -1000000000, 123456789] print(sorted(numbers, reverse=True)) #[999999999, 123456789, 1000000, -500000, -1000000000] Filter from a list numbers = [1,2,3,4,5,6,7,8,9,10] odd = list(filter(lambda x: x%2!","title":"Python One Liners"},{"content":"Introduction Selenium is a framework that many developers use to automate web browsers. It\u0026rsquo;s an open source tool that offers compatibility, with web browsers and supports programming languages. While its commonly used for testing web applications it\u0026rsquo;s also handy for tasks like web scraping and automating browser actions. WebDriver, which is a part of Selenium allows developers to control web browsers programmatically.\nUsing Selenium to scrape data Task: Scraping the latest news posts from a popular blog post Please note that to follow along you must have an understanding of basic HTML elements and CSS classes and id selectors as well as python\nTo use selenium we first need to install the package using pip. pip install selenium Using a code editor of your choice create a .py file and import selenium.webdriver module which provides all the WebDriver implementations.\nfrom selenium import webdriver driver = webdriver.Chrome() driver.get(\u0026#39;https://www.google.com\u0026#39;) To test if everything is working so far we need to instruct the Selenium WebDriver to navigate a given URL. Running the .py file should launch a browser instance and close immediately the website loads.\nChrome() class also provides implementation for chromium based browsers e.g brave and not just the chrome.\nTo use Brave, a Chromium-based browser, with Selenium WebDriver in Python, you can set the binary location using the webdriver.ChromeOptions() class and then pass these options as a parameter when creating the WebDriver instance. Here\u0026rsquo;s how you can do it:\nfrom selenium import webdriver BROWSER_PATH = r\u0026#34;C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe\u0026#34; OPTIONS = webdriver.ChromeOptions() OPTIONS.binary_location = BROWSER_PATH driver = webdriver.Chrome(options=OPTIONS) driver.get(\u0026#39;https://www.google.com\u0026#39;) To prevent the browser instance from closing, add the following property with name \u0026lsquo;detach\u0026rsquo; and set its value to \u0026lsquo;True\u0026rsquo; OPTIONS.add_experimental_option(\u0026quot;detach\u0026quot;, True)\nScraping the data I will demonstrate using pulselive website. The following code should load the website on a browser instance.\nfrom selenium import webdriver BROWSER_PATH = r\u0026#34;C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe\u0026#34; OPTIONS = webdriver.ChromeOptions() OPTIONS.binary_location = BROWSER_PATH OPTIONS.add_experimental_option(\u0026#34;detach\u0026#34;, True) URL = \u0026#39;https://www.pulselive.co.ke/news\u0026#39; driver = webdriver.Chrome(options=OPTIONS) driver.get(URL) We now need find the HTML elements that may be of use to us. To interact with web pages and find HTML elements using Developer Tools, you can follow these steps:\nOpen Brave browser.\nNavigate to the web page you want to inspect.\nTo open Developer Tools:\nOn Windows/Linux: Press Ctrl + Shift + I. On macOS: Press Option + ⌘ + I or right-click anywhere on the page and select \u0026ldquo;Inspect\u0026rdquo; from the context menu. In the Developer Tools panel that opens, you will see various tabs such as \u0026ldquo;Elements,\u0026rdquo; \u0026ldquo;Console,\u0026rdquo; \u0026ldquo;Network,\u0026rdquo; etc. You are interested in the \u0026ldquo;Elements\u0026rdquo; tab, which shows the HTML structure of the web page.\nIn the \u0026ldquo;Elements\u0026rdquo; tab, you can expand and collapse elements to explore the page\u0026rsquo;s structure. Look for the \u0026lt;div\u0026gt; element with a class name of \u0026ldquo;article-list-items.\u0026rdquo; It should be under the \u0026lt;ul\u0026gt; (unordered list) element, and each list item \u0026lt;li\u0026gt; should contain an \u0026lt;a\u0026gt; tag for the article link and an \u0026lt;h2\u0026gt; tag for the article title.\nLocating elements using By This is done by first importing By from from selenium.webdriver.common.by from selenium.webdriver.common.by import By next we instruct the webdriver instance using find_element method i.edriver.find_element(By.CLASS_NAME, value='article-list-items') then assign this to a variable(i named mine articles) Note: div(class=\u0026lsquo;article-list-items\u0026rsquo;) is the parent element of the articles.\nExecuting this code returns a selenium webElement, To access the relevant text and links, we need to narrow down using css selectors to the specific element that we are targeting i.e getting all the links contained in the div element with a class name article-list-items\nRemember the div with a class name article-list-items,it is an unordered list element containing list elements(the list elements also contain other divs and anchor tags) find_elements(By.CSS_SELECTOR) value=\u0026lsquo;li a\u0026rsquo; helps narrow down to the target element in our case, links in the anchor tags. Since find_elements does not return a single element but all the elements matching our value, assign a variable to point to the results and iterate to get a hold of each item. Finally for each item call the get_attribute method with attribute name \u0026lsquo;href\u0026rsquo; to return the url contained in each anchor tag.\nFor the article titles the approach is similar.\nTo get the title contained in h2 tags use find elements by css selector value=\u0026lsquo;li h2\u0026rsquo; and because h2 tags do not have attributes but instead contain texts in between. The text can be retrieved by using the property text.\nThe above code prints the articles with article titles and links separated by a semi-colon.\nFinal tips Have you noticed how every time we ran the code a new browser application window is launched.using this option OPTIONS.add_argument(\u0026quot;--headless=new\u0026quot;) runs everything in the background. To automatically shut down the chromiumdriver executable instance i.e browser instance add driver.quit() at the end of your code.\nConclusion This is just a simple example use case on how automation can be used to simplify the process of acquiring information. The amount of applications is vast and i hope this demonstration provides you will a few insights and tips on how to get started with web scraping automation.\nCheck out the Unofficial documentation here.\n","permalink":"https://tin3ga.netlify.app/posts/web-scraping-using-selenium/","summary":"Introduction Selenium is a framework that many developers use to automate web browsers. It\u0026rsquo;s an open source tool that offers compatibility, with web browsers and supports programming languages. While its commonly used for testing web applications it\u0026rsquo;s also handy for tasks like web scraping and automating browser actions. WebDriver, which is a part of Selenium allows developers to control web browsers programmatically.\nUsing Selenium to scrape data Task: Scraping the latest news posts from a popular blog post Please note that to follow along you must have an understanding of basic HTML elements and CSS classes and id selectors as well as python","title":"Web Scraping Using Selenium"},{"content":" Ikigai (生き甲斐) Iki in Japanese means life, and gai describes value or worth.\nThe Japanese word ikigai is often translated to \u0026lsquo;your life purpose\u0026rsquo;. Ikigai can encompass your life purpose, and can be as small as a daily ritual.\nDiscover your purpose in life by finding something that makes you wake up each day. Finding your Ikigai means aligning your work with your passions, talents, and the things that bring you joy.\nPurpose fuels you.\nKaizen (改善) kai translates to change, revision; and zen - virtue, goodness.\nKaizen is the Japanese concept of continuous improvement.\nIt emphasizes making small, incremental changes over time to improve efficiency and effectiveness.\nFocus on small improvements each day.\nZen Mindset Zen Buddhism emphasizes mindfulness, presence, and simplicity. Applying a Zen mindset to your work can help you stay focused.\nBecome more aware of your thoughts and feelings, By acknowledging these emotions without judgement you can work through them regaining your motivation.\nWabi Sabi (侘寂) wabi means subdued, austere beauty, while sabi means \u0026ldquo;rustic patina.\u0026rdquo;\nWabi-sabi is an aesthetic philosophy that celebrates the beauty of imperfection, transience, and simplicity.\nEmbrace imperfection, as there is beauty in simplicity.\nShoshin (初心) Shoshin means beginner\u0026rsquo;s mind.\nIt refers to having an attitude of openness, eagerness, and lack of preconceptions.\nThe idea behind shoshin is that when you approach life with a beginner\u0026rsquo;s mind, you are more receptive to new experiences and insights. You let go of assumptions, biases, and preconceived notions, which can often limit your understanding and growth. Instead, you adopt a mindset of curiosity and humility,\nKakeibo (家計簿) kakeibo can be translated household ledger.\nIt\u0026rsquo;s a simple yet effective way to track your income, expenses, and savings, with the goal of achieving better financial stability and mindfulness about your spending habits.\nApplying this concept to your daily tasks and goals can help you become more mindful of how you use your time.\nPomodoro Pomodoro is an Italian word for tomato.\nThe Pomodoro Technique is a time management method developed by Francesco Cirillo, he initially used a tomato-shaped kitchen timer to track his work intervals.\nIt involves working in short, focused bursts with regular breaks, therefore aligns with the idea of mindfulness and focus found in Japanese philosophies.\n","permalink":"https://tin3ga.netlify.app/posts/japanese-philosophies-for-increased-productivity/","summary":"Ikigai (生き甲斐) Iki in Japanese means life, and gai describes value or worth.\nThe Japanese word ikigai is often translated to \u0026lsquo;your life purpose\u0026rsquo;. Ikigai can encompass your life purpose, and can be as small as a daily ritual.\nDiscover your purpose in life by finding something that makes you wake up each day. Finding your Ikigai means aligning your work with your passions, talents, and the things that bring you joy.","title":"Japanese Philosophies for Increased Productivity"},{"content":"List Comprehension Python lists are a fundamental data structure for storing and managing data collections. Lists are adaptable, flexible, and may store a variety of data kinds, including integers, strings, and even other lists. List comprehension lets you make a new list by applying an expression to each item in an existing iterable (such as a list, tuple, or range) and optionally filtering the items depending on a condition. List comprehensions are a more compact and readable means of creating lists than typical for loops. As an example, suppose we want to create a new list of even numbers from a list of random numbers.\nnumbers = [84, 77, 50, 89, 33, 36, 59, 31, 76, 1, 20, 58, 59, 93, 70, 28, 51, 7, 48, 74] Using a for loop\neven_numbers = [] for number in numbers: if number % 2 == 0: even_numbers.append(number) Using list comprehension\neven_numbers = [num for num in numbers if num % 2 == 0] the syntax for list comprehension is :\nlist = [new_item for item in some_list if conditional_statement] Dictionary Comprehension Dictionaries in Python are a versatile data structure that may be used to store and manage collections of key-value pairs. Dictionary comprehension is a simple and effective method for creating dictionaries in Python. You can create dictionaries by specifying key-value pairs based on an expression and an iterable. Dictionary comprehensions are a logical extension of list comprehensions and a useful feature for easily generating dictionaries without the use of explicit loops.\nsuppose we have a dictionary of cars and year of manufacture, and we want to create a dictionary of recently manufactured ones\ncar_dictionary = { \u0026#34;Tesla Model 3\u0026#34;: 2020, \u0026#34;Toyota Camry\u0026#34;: 2022, \u0026#34;Ford Mustang\u0026#34;: 2021, \u0026#34;Honda Civic\u0026#34;: 2023, \u0026#34;Chevrolet Silverado\u0026#34;: 2019 } using a for loop\nrecently_manufactured = {} for (car,year) in car_dictionary.items(): if year \u0026gt; 2021: recently_manufactured[car] = year using dictionary comprehension\nrecently_manufactured = {car:year for (car, year) in car_dictionary.items() if year \u0026gt; 2021} the syntax for dictionary comprehension is:\ndictionary = [new_key:new_value for (key, value) in some_dict.items() if conditional_statement] ","permalink":"https://tin3ga.netlify.app/posts/list--dictionary-comprehension-in-python/","summary":"List Comprehension Python lists are a fundamental data structure for storing and managing data collections. Lists are adaptable, flexible, and may store a variety of data kinds, including integers, strings, and even other lists. List comprehension lets you make a new list by applying an expression to each item in an existing iterable (such as a list, tuple, or range) and optionally filtering the items depending on a condition. List comprehensions are a more compact and readable means of creating lists than typical for loops.","title":"List \u0026 Dictionary Comprehension in Python"},{"content":"Introduction Sometimes, we need to run Python scripts at regular intervals to complete specific tasks. However, as humans, we often forget or remember too late. Operating systems offer built-in capabilities to schedule the execution of commands or programs when needed. While Linux simplifies task automation through the \u0026lsquo;crontab\u0026rsquo; utility, Windows also offers similar functionality. With the right know-how, you can effectively automate tasks in Windows,\nWindows Task Scheduler Task Scheduler is a built-in utility in Microsoft Windows operating systems that allows users to automate various tasks and processes on their computer. It provides a way to schedule the execution of programs or scripts at specific times or in response to specific events. Task Scheduler is a valuable tool for improving productivity, automating maintenance tasks, and ensuring that critical processes run on time.\nTask Automation Using Task Scheduler To automate Python scripts, it\u0026rsquo;s crucial to identify the Python path on your system. You can do this by running the following command in the Command Prompt: where python. Take note of the first output displayed as it will provide the Python path.\nNext, make sure to take note of the absolute path of the directory where your Python \u0026ldquo;.py\u0026rdquo; file is located, as this will be the location from which you\u0026rsquo;ll execute your Python script. Here are steps outlining how to schedule a task to execute daily at a specific time. Keep in mind that this is just one example, and Task Scheduler offers a wide range of options for automating tasks. Feel free to explore and be creative with your task scheduling to meet your specific needs.\nStep 1: Open Task Scheduler Press Win + S to open the Windows search bar. Type \u0026ldquo;Task Scheduler\u0026rdquo; and select it from the search results to open the Task Scheduler application.\nStep 2: Create a Basic Task In the Task Scheduler window, click on \u0026ldquo;Create Basic Task\u0026hellip;\u0026rdquo; in the right-hand panel. This will start the task creation wizard. Step 3: Name and Description In the wizard, give your task a name and an optional description. Click \u0026ldquo;Next.\u0026rdquo;\nStep 4: Trigger Choose \u0026ldquo;Daily\u0026rdquo; as the trigger type since you want the script to run daily. Click \u0026ldquo;Next.\u0026rdquo;\nStep 5: Daily Trigger Settings Specify the start date and time for your daily task. Choose whether you want the task to recur every day or on specific days of the week. Click \u0026ldquo;Next.\u0026rdquo;\nStep 6: Action Select \u0026ldquo;Start a program\u0026rdquo; as the action to perform and click \u0026ldquo;Next.\u0026rdquo;\nStep 7: Program/script In the \u0026ldquo;Program/script\u0026rdquo; field, enter the path to your Python executable. Typically, this is located at C:\\PythonXX\\python.exe, where \u0026ldquo;XX\u0026rdquo; represents your Python version number. In the \u0026ldquo;Add arguments (optional)\u0026rdquo; field, enter the full path to your Python script that you want to run daily. In the \u0026ldquo;Start in (optional)\u0026rdquo; field, specify the directory where your Python script is located. Click \u0026ldquo;Next.\u0026rdquo;\nStep 8: Review Review your task settings. If everything looks correct, click \u0026ldquo;Finish.\u0026rdquo;\nStep 9: Task Confirmation After clicking \u0026ldquo;Finish,\u0026rdquo; you\u0026rsquo;ll see a summary of your task. To make any additional changes, click \u0026ldquo;Open the Properties dialog for this task when I click Finish.\u0026rdquo; Otherwise, click \u0026ldquo;Finish.\u0026rdquo;\nStep 10: Task Properties (Optional) If you clicked \u0026ldquo;Open the Properties dialog,\u0026rdquo; you can further customize your task in the Properties window. You can set conditions, triggers, and other settings as needed.\nStep 11: Running the Task The task has been set to run on a basis. To execute it manually simply right click on the task, in the Task Scheduler Library. Choose the option \u0026ldquo;Run.\u0026rdquo;\nYour Python script will then be executed automatically every day at the designated time as configured in Task Scheduler. Please ensure that your script is programmed to carry out the intended task without requiring any user input as scheduled tasks operate silently in the background.\n","permalink":"https://tin3ga.netlify.app/posts/python-script-automation-in-windows/","summary":"Introduction Sometimes, we need to run Python scripts at regular intervals to complete specific tasks. However, as humans, we often forget or remember too late. Operating systems offer built-in capabilities to schedule the execution of commands or programs when needed. While Linux simplifies task automation through the \u0026lsquo;crontab\u0026rsquo; utility, Windows also offers similar functionality. With the right know-how, you can effectively automate tasks in Windows,\nWindows Task Scheduler Task Scheduler is a built-in utility in Microsoft Windows operating systems that allows users to automate various tasks and processes on their computer.","title":"Python Script Automation in Windows"},{"content":"Introduction The zip() function in Python is a built-in function that allows you to combine two or more iterables (such as lists, tuples, or other sequences) element-wise. It creates an iterator that generates tuples, where each tuple contains one element from each of the input iterables. The resulting iterator stops when the shortest input iterable is exhausted. This is particularly useful when you want to work with multiple sequences simultaneously.\nsyntax:\nlist1 = [1, 2, 3] list2 = [\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;] for item in zip(list1, list2): print(item) output is a tuple containing elements from the two lists: (1, \u0026#39;a\u0026#39;) (2, \u0026#39;b\u0026#39;) (3, \u0026#39;c\u0026#39;) Suppose we have two lists and we need to combine the content in each using a for loop.\nmovies = [\u0026#39;Godfather\u0026#39;, \u0026#39;DieHard\u0026#39;, \u0026#39;Casablanca\u0026#39;, \u0026#39;Mad Max: Fury Road\u0026#39;, \u0026#39;Heat\u0026#39;] year = [1997, 1988, 1942, 2015, 1995 ] using range and count variable:\nHowever if one list is shorter we get an index error Using the zip function by default stops when the shortest input iterable is exhausted.\n","permalink":"https://tin3ga.netlify.app/posts/combine-iterables-together-using-zip-function/","summary":"Introduction The zip() function in Python is a built-in function that allows you to combine two or more iterables (such as lists, tuples, or other sequences) element-wise. It creates an iterator that generates tuples, where each tuple contains one element from each of the input iterables. The resulting iterator stops when the shortest input iterable is exhausted. This is particularly useful when you want to work with multiple sequences simultaneously.","title":"Combine Iterables Together Using Zip Function"}]