Monday, September 02, 2024

Blessings of working on large real-world projects

Working on large real-world projects can offer numerous blessings and benefits, both professionally and personally. Here are some of the key advantages:

Professional Growth: Large projects often involve complex problems that require innovative solutions. This can lead to significant professional development as you learn new skills and technologies.

Teamwork and Collaboration: Big projects usually involve teams with diverse skill sets. Working in such environments can enhance your ability to collaborate effectively, communicate with others, and understand different perspectives.

Networking Opportunities: Large projects often bring together professionals from various companies, industries, and even countries. This can be a great opportunity to build a professional network that can be valuable throughout your career.

Visibility and Recognition: Being part of a significant project can increase your visibility within your organization and your industry. Successful completion of such projects can lead to recognition and can be a strong addition to your resume.

Problem-Solving Skills: The complexity of large projects can help you hone your problem-solving skills. You'll often need to think critically and creatively to overcome challenges, which is a valuable skill in any career.

Project Management Experience: Large projects can provide experience in project management, including planning, execution, monitoring, and closing projects. This is a highly transferable skill set that is valued in many industries.

Sense of Accomplishment: Completing a large project can give you a strong sense of accomplishment. Knowing that you contributed to something significant can be very satisfying and can boost your confidence.

Impact: Large projects often have a substantial impact on the company, industry, or even society. Being part of something that makes a difference can be very rewarding.

Financial Rewards: Working on large projects can sometimes lead to financial bonuses or higher compensation due to the value they bring to the organization.

Learning from Failure: Large projects can also be challenging and sometimes fail. Working on such projects can teach you valuable lessons about what doesn't work, resilience, and the importance of risk management.

Diversity of Work: Large projects may involve various aspects such as research, design, implementation, and testing. This diversity can keep the work interesting and engaging.

Mentorship Opportunities: You may have the chance to be mentored by more experienced professionals or to mentor others, which can be a fulfilling way to give back and grow.

Resource Management: You'll likely deal with budgeting, scheduling, and resource allocation, which can improve your ability to manage resources effectively.

Adaptability: Large projects can change scope or direction, requiring you to be adaptable and flexible. This can improve your ability to cope with change in any area of life.

Cultural Exposure: If the project is international, you might work with people from different cultures, which can broaden your worldview and intercultural communication skills.

While working on large real-world projects can be demanding and sometimes stressful, the experience and skills gained are often invaluable and can significantly enhance your career and personal development. While revisiting some of my old notes, I stumbled upon a list I had compiled during a past project. It's fascinating to reflect on the myriad of elements that were part of this single endeavor. Below is a snapshot of that list, though I've had to omit a few items. This compilation serves as a reminder of the myriad blessings that come with engaging in large-scale, real-world projects.

Programmable logic controller (PLC) - Or programmable controller is an industrial computer that has been ruggedized and adapted for the control of manufacturing processes, such as assembly lines, machines, robotic devices, or any activity that requires high reliability, ease of programming, and process fault diagnosis.

Real-time system - Any information processing system with hardware and software components that perform real-time application functions and can respond to events within predictable and specific time constraints.

Codesys - An integrated development environment for programming controller applications according to the international industrial standard IEC 61131-3.

Human Machine Interface (HMI) - A user interface or dashboard that connects a person to a machine, system, or device.

Telegraf - Plugin-driven server agent for collecting and reporting metrics.

InfluxDB - Time series database.

PostgreSQL - Also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.

Go - Statically typed, compiled programming language designed at Google.

Edge Software Provisioner (ESP) - Enables ODMs, System Integrators and Developers to automate the installation of a complete operating system and software stack (defined by a Profile) on bare-metal or virtual machines using a "Just-in-Time" provisiong process.

FIDO Device Onboard (FDO) - Provisioning with the FIDO Device Onboard protocol enables industrial Internet of Things devices to leverage public key cryptography to help simply and securely onboard IoT devices to any cloud or on-premises management platform without the need for human intervention.

Fast Identity Online (FIDO) - FIDO Alliance is focused on providing open and free authentication standards to help reduce the world's reliance on passwords, using UAF, U2F and FIDO2

Preboot eXecution Environment (PXE) - A standardized client–server environment that boots a software assembly, retrieved from a network, on PXE-enabled clients.

FusionAuth - Provides authentication, authorization, and user management.

Kubernetes open-source container orchestration system for automating software deployment, scaling, and management. Originally designed by Google
Kubespray - Powerful open source tool for deploying and managing Kubernetes clusters.

Flask - A micro web framework written in Python.

Docker - A set of platform as a service products that use OS-level virtualization to deliver software in packages called containers.

KubeVirt - Virtual machine management add-on for Kubernetes. The aim is to provide a common ground for virtualization solutions on top of Kubernetes.

Kubelet - The primary "node agent" that runs on each node. 

Guacamole - Cross-platform Remote Desktop Gateway, allows a user to take control of a remote computer or virtual machine via a web browser.

ASP.NET - A framework for building web apps and services with .NET and C#, Supported on Linux, Windows, and macOS.

Lightbits - Delivers high-performance shared storage across servers while providing high availability and read-and-write management designed to maximize the value of flash-based storage.

Nginx - A web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. 

React - Front-end JavaScript library for building user interfaces based on UI components.

Node.js - Cross-platform, back-end JavaScript runtime environment that runs on a JavaScript Engine and executes JavaScript code outside a web browser, which was designed to build scalable network applications.

Next.js - Web development framework enabling React-based web applications with server-side rendering and generating static websites.

Debian - Also known as Debian GNU/Linux, is a Linux distribution composed of free and open-source software.

Ubuntu - A Linux distribution based on Debian and composed mostly of free and open-source software.

CentOS - A Linux distribution that provides a free and open-source community-supported computing platform, functionally compatible with its upstream source, Red Hat Enterprise Linux.

Windows - A group of several proprietary graphical operating system families developed and marketed by Microsoft.

Virtual Machine - Is the virtualization/emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer.

Kernel-based Virtual Machine (KVM) - is a virtualization module in the Linux kernel that allows the kernel to function as a hypervisor.

DNS - The Domain Name System protocol is an important part of the web's infrastructure, serving as the Internet's phone book: every time you visit a website, your computer performs a DNS lookup.

DHCP - Dynamic Host Configuration Protocol is a client/server protocol that automatically provides an Internet Protocol (IP) host with its IP address and other related configuration information such as the subnet mask and default gateway.

Balsamiq -  low-fidelity wireframing tool for product managers, founders, devs, & UX teams worldwide. It's the fast, focused way to design

Figma: A collaborative web application for interface design, with additional offline features enabled by desktop applications for macOS and Windows.

Thursday, May 25, 2023

How to Install and Use RTSP Simple Server

 
How to Install and Use RTSP Simple Server
 
1. Create a folder to store the app

mkdir /etc/rtsp-server
cd /etc/rtsp-server

 
2. Download the latest release. On a Linux command line, you might use a command like:

wget https://github.com/aler9/rtsp-simple-server/releases/download/v0.17.11/rtsp-simple-server_v0.17.11_linux_amd64.tar.gz

Please replace v0.17.11 with the latest version.

3.  Extract the downloaded file:

tar -xzf rtsp-simple-server_v0.17.11_linux_amd64.tar.gz
 
4. This will create a rtsp-simple-server file in your current directory. This is the server executable.
 
5.  To keep the rtsp-simple-server running as a service on a Linux-based system, you can create a systemd service.

sudo nano /etc/systemd/system/rtsp-simple-server.service
 
Then, add the following content to the file:

[Unit]
Description=RTSP Simple Server
After=network.target
 
[Service]
ExecStart=/etc/rtsp-server/rtsp-simple-server /etc/rtsp-server/rtsp-simple-server.yml
 
Restart=always
RestartSec=3
User=yourusername
Group=yourgroupname
 
[Install]
WantedBy=multi-user.target

 
Replace yourusername and yourgroupname with your username and group name respectively. 

Save the file and exit the editor.

Now reload the systemd manager configuration:

sudo systemctl daemon-reload
 
To start the service immediately, use:

sudo systemctl start rtsp-simple-server
 
To enable the service to start on boot, use:

sudo systemctl enable rtsp-simple-server
 
You can check the status of the service with:

sudo systemctl status rtsp-simple-server
 
6. To stream an MP4 file using RTSP (Real Time Streaming Protocol):

ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://localhost:8554/stream
 
To continuously loop the video and stream it, you can use the -stream_loop -1 option with FFmpeg, which tells FFmpeg to loop the input indefinitely.

ffmpeg -stream_loop -1 -re -i input.mp4 -c copy -f rtsp rtsp://localhost:8554/stream
 


 
7. Test the stream (replace localhost by the server IP if testing from another machine)
 






Wednesday, December 11, 2019

Export Online SharePoint Term Store Data to CSV Files


#Set the variables
$siteCollectionUrl = "https://TENANT.sharepoint.com/sites/SITE_COLECTION"
$folderPath = "D:\Terms\Export\"
$termGroupName = "GROUP_NAME"

# Check if you have the Online SharePoint Powershell and 
# SharePoint PnP PowerShell Online modules installed or not
Get-Module -Name Microsoft.Online.SharePoint.PowerShell -ListAvailable | Select Name,Version
Get-Module -Name SharePointPnPPowerShellOnline -ListAvailable | Select Name,Version

# Uncomment these lines if not installed already
#Install-Module -Name Microsoft.Online.SharePoint.PowerShell
#Install-Module SharePointPnPPowerShellOnline

# Connect to your site (I am using the WebLogin for the two-factor authentication):
Connect-PnPOnline -Url $siteCollectionUrl -UseWebLogin

# Get the group you want to export its term sets
$termGroup = Get-PnPTermGroup -GroupName $termGroupName -Includes TermSets

# Loop over the Term Sets
foreach ($termSetItem in $termgroup.TermSets)
{    
    write-host "Working on Term Set:"$termSetItem.Name "[" $termSetItem.Id "]"

    # The Collection that will hold the Terms in this Term Set
    $collection = @()

    # Load the Term Set
    $termSet = Get-PnPTermSet -TermGroup $termGroup -Identity $termSetItem.Id -Includes Terms

    # Create the object and add it to the collection
    $termData = new-object PSObject
    $termData | Add-member -membertype NoteProperty -name "Term Set Name" -Value $termSet.Name
    $termData | Add-member -membertype NoteProperty -name "Term Set Description" -Value $termSet.Description
    $termData | Add-member -membertype NoteProperty -name "LCID" -Value ""
    $termData | Add-member -membertype NoteProperty -name "Available for Tagging" -Value "TRUE"
    $termData | Add-member -membertype NoteProperty -name "Level 1 Term" -Value ""
    $termData | Add-member -membertype NoteProperty -name "Level 2 Term" -Value ""
    $termData | Add-member -membertype NoteProperty -name "Level 3 Term" -Value ""
    $collection += $TermData    

    # Loop over the Terms Level 1
    foreach ($termItem1 in $termSet.Terms)
    {
        # Load the Level 1 Term
        $term1 = Get-PnPTerm -TermGroup $termGroup -TermSet $termSetItem.Id -Identity $termItem1.Id -Includes Terms        
        
        # Create the object and add it to the collection
        $term1Data = new-object PSObject
        $term1Data | Add-member -membertype NoteProperty -name "Term Set Name" -Value ""
        $term1Data | Add-member -membertype NoteProperty -name "Term Set Description" -Value ""
        $term1Data | Add-member -membertype NoteProperty -name "LCID" -Value ""
        $term1Data | Add-member -membertype NoteProperty -name "Available for Tagging" -Value "TRUE"
        $term1Data | Add-member -membertype NoteProperty -name "Level 1 Term" -Value $term1.Name
        $term1Data | Add-member -membertype NoteProperty -name "Level 2 Term" -Value ""
        $term1Data | Add-member -membertype NoteProperty -name "Level 3 Term" -Value ""
        $collection += $term1Data

        # Loop over the Terms Level 2
        foreach ($termItem2 in $term1.Terms)
        {
            # Load the Level 2 Term
            $term2 = Get-PnPTerm -TermGroup $termGroup -TermSet $termSetItem.Id -Identity $termItem2.Id -Includes Terms        
        
            # Create the object and add it to the collection
            $term2Data = new-object PSObject
            $term2Data | Add-member -membertype NoteProperty -name "Term Set Name" -Value ""
            $term2Data | Add-member -membertype NoteProperty -name "Term Set Description" -Value ""
            $term2Data | Add-member -membertype NoteProperty -name "LCID" -Value ""
            $term2Data | Add-member -membertype NoteProperty -name "Available for Tagging" -Value "TRUE"
            $term2Data | Add-member -membertype NoteProperty -name "Level 1 Term" -Value $term1.Name
            $term2Data | Add-member -membertype NoteProperty -name "Level 2 Term" -Value ""
            $term2Data | Add-member -membertype NoteProperty -name "Level 3 Term" -Value ""
            $collection += $term2Data

            # Loop over the Terms Level 3
            foreach ($termItem3 in $term2.Terms)
            {
                # Load the Level 3 Term
                $term3 = Get-PnPTerm -TermGroup $termGroup -TermSet $termSetItem.Id -Identity $termItem3.Id -Includes Terms        
        
                # Create the object and add it to the collection
                $term3Data = new-object PSObject
                $term3Data | Add-member -membertype NoteProperty -name "Term Set Name" -Value ""
                $term3Data | Add-member -membertype NoteProperty -name "Term Set Description" -Value ""
                $term3Data | Add-member -membertype NoteProperty -name "LCID" -Value ""
                $term3Data | Add-member -membertype NoteProperty -name "Available for Tagging" -Value "TRUE"
                $term3Data | Add-member -membertype NoteProperty -name "Level 1 Term" -Value $term1.Name
                $term3Data | Add-member -membertype NoteProperty -name "Level 2 Term" -Value $term2.Name
                $term3Data | Add-member -membertype NoteProperty -name "Level 3 Term" -Value $term3.Name
                $collection += $term3Data
            }
        }
    }

    # Build the file path, I am using the Term Set name as the filename
    $filePath = $folderPath + $termSet.Name + ".csv"

    # Write to the file
    $collection | Export-csv $filePath -notypeinformation
}

Tuesday, October 25, 2016

Nintex Forms o365 - Redirect to another page on saving

As Nintex forms on o365 does not have the option to set the URL to the page you want to go to after saving your item, there is a work around for that, in the below code I am changing the source parameter in the url to the new page which is the edit form in my case.


var newSrc = hostWebUrl + '/Lists/MyList/DispForm.aspx?ID=' + listItemId;
var newUrl = document.URL.replace(/(source=).*?(&)/gi,'$1' + newSrc + '$2');
window.history.pushState({path:newUrl},'',newUrl);

I hope it help somebody.

Friday, October 14, 2016

Nintex Workflow o365 – Error assigning a task to SharePoint Group

I have received this error on assigning a task to a SharePoint group:

Activity in progress
Retrying last request. Next attempt scheduled after 10/14/2016 11:25 AM. Details of last request: HTTP Unauthorized to https://blablabla.sharepoint.com/sites/Test/_api/sp.utilities.utility.SendEmail Correlation Id: 1a1a1a1a- abcd-efgh-ijkl-3c3c3c3c3c3c Instance Id: 2b2b2b2b-abcd-efgh-ijkl-4d4d4d4d4d4d
Access denied. You do not have permission to perform this action or access this resource.


Then I discovered that in order to make it working I need to add my account to the group or to change its settings “Who can view the membership of the group?” to “Everyone”.

Another solution I believe is to grant full control permission to the workflow as shown here: https://community.nintex.com/community/build-your-own/nintex-for-office-365/blog/2015/05/14/o365-call-http-web-service-failed-unauthorized-access-denied

Sunday, June 05, 2016

Just passed Nintex Workflow Pro Exam!

I just checked https://learning.nintex.com site, created a free account and passed the pro exam.


And the Admin exam:



Sunday, October 18, 2015

Store the SharePoint filtered values

In case you have a view for your list and users use this view and filter its values and want to keep this filter saved without creating a personal view, you can create a JavaScript file with this content:


 








Then reference this JavaScript file from any page where you have your view. It is simply listen to the “onhashchange” and save the value after the “#” in the localStorage and retrieve it on next page load. The URL of the page after you change the filter looks like this: “/Lists/TestList/AllItems.aspx#InplviewHash6c224f7d-adc4-430c-8501-312cabe57c26=FilterField1%3DLinkTitle-FilterValue1%3DTest%2520Item” and the hash value is everything after the “#”

Blessings of working on large real-world projects

Working on large real-world projects can offer numerous blessings and benefits, both professionally and personally. Here are some of the key...