These engines turn at the whopping speed of 0.000001 m/s. Not only is the engine slow, the technology is old. The transistors that make the coquetry and the coils that make the engine revolve are the most retro data component of them all. Unfortunately we already claimed the retro badge, but would like to show you what we do with physical component and how we do small hacks to make things work.
Unfortunately we had to hack our solution in the end, even with stellar help from Marius and @bastards we could not get the engine revolving any faster enough for our needs. The voltage output and ossilating is stuck making it perform suboptimal. We think the motor or voltage output needs to be adjusted but lack the tools and time, so the hack we ended doing was to swap the Arduino with the laptop and running a virtual Arduino instead of the real deal. Simulating something easy with something complex to make stuff work. We feel this is a hack in the spirit of making up lost time.
Recruitment is an important, and integrated part of Pirates 365, to acquire the best talent for our crew. To help us with this we have developed The pirate recruitment terminal(PRT). This solution provides us with a visually appealing and an engaging experience to gather new recruits.
PRT User flow
Since pirate recruits normally aren’t that familiar with modern interfaces, we have chosen a living parrot to help and guide the user and provide a smooth user experience.
When a pirate is detected, our engaging parrot approaches the pirate and presents the sign-up option. We collect personal details and complete the process by taking a picture. The collected data is then sent into the platform for future processing.
The Pirate recruitment terminal technology stack
PRT The app is running on the vue.js progressive javaScript framework with Pinia🍍 for state management. For the 3d animated parrot🦜 we are using three.js and TroisJS with WebGL rendering. For AI vision👁️ and object detection🤠 we are running tensorflow under the hood. If available the model is running on GPU, if not we fall back to CPU.
Images, 3d model, fonts is stolen captured on the internetsea.
Captain Black Bart, is planning a big raid, Oslo is the target and according to ChatGPT the loot potential is #awsome.
Invitation is sent to all chosen crewmates using top of the art “Power Automate flows”. Crewmates are free to Accept or Decline the raid invitation.
When it’s time for the raid, we requires all crew members who have accepted the raid to check in, using their RFID card or phone.
If the crewmate have accepted more than one raid, he/she can choose to check in using our Raid Planning App
With the help of Midjourney AI, https://docs.midjourney.com/, we generated the app design component by asking the AI to provide us witht the latest & greates piracy themes.
The RFID data for all potential crewmates is stored in Azure AD using the “Postal Code” field, pretty “Nasty Hack” according to our “bosun”.
This data is imported to Dataverse “AAD User” virtual table for our app.
The waters run deep and dark when you are at sea. This is why intel like maps, a spyglass and knowing the tides help. To give our pirates an advantage we crawl barenswatch.no for other ships location. But, just as in dogeball, it is not enough to know where something is, you need to know where it is going and when you need to be there to intercept. So how do we calculate the best opportunities and how to intercept them?
Step 1: Crawl and Hijack Valuable Data 🦀
From the system diagram we see our Functions App communicates with the Braenswatch API and stors all boats data including current location. We poll this information several times giving us multiple data points not only for ballast and weight, but also for speed, location and direction (this will be important later).
For ease of use while creating the service we compiled all the data using Power BI Dashboards to see what we were working with. The dashboard can also be used to help captains understand the state of the seven seas, although we appreciate that more data is not necessarily better data. It depends on how you visualize, precent and timing of when to precent data to you user.
Step 2: Knowing which Opportunities to Strike 🏆
From the ships length, type and destination we can estimate its value. Slow moving ships heading for freight docs are ripe for looting, fast moving ships heading for a dry dock are empty and better left alone. For the sharp eye you have also spotted we have a Threat flag in or model, this is for marking known pirates, intercepters and the fuzz of the seven seas. Once again referencing to Sun Tzu: You always win the wars you never fight (dont search this quote).
If we decide that this opportunity is ripe for plundering, we look at its course and if it is feasible to intercept based on our current course. Good opportunities are heavy, slow moving ships. Bad opportunities are war ships of any kind or any opportunity in the vicinity of a war ship.
There is also a certain Goldilocks of opportunities: Based on your own vessel, you do not want to attack another ship that is too large, since it will be a harder fight, or too small, since it carries less booty. We can use the dashboard to visually find the opportune boats and use this investigation to write code that targets these boats automatically.
When we flag ships that are both opportune and not adjacent to warships we plot paths to figure out where they are going in relations to our course.
Step 3: Using Advanced Trigonometry to Pinpoint your Enemy 🎯
Youtube can teach you the basics about how to calculate a ships heading based on longitude, latitude, direction, true north and the course deviation.
True north will change depending on where on the globe you are positioned, so for intercept courses it is paramount to get this stuff right. You want to be at the place where your target ship will be, not where they have been. And you want to be there before they get there, not to ride up after them and trailing them forever. This is where we use the latitude, longitude, direction and speed from earlier and _try_ to plot the path of the ships. I stress try because Solveig just looked at Sebastian with the “do you mind not being an idiot” when he asked how se was doing it and if it was done. Then just sort of sigh’ed and continued clicking keys. So it works, trust us.
For our challenge we also need to estimate if it is a viable option to change our current corse to intercept the opportunity. For all business cases there is a cost/effect probability calculation. Fo us this depends on added time to destination with deviation and added length of trip, both of which adds to the total cost of provisions and consumables like petrol.
Step 4: Plot Optimal Course for Interception 🏴☠️
Finally when we have a list of opportune targets, we know which targets will be adjacent to our planned course form A to B we plot intercept maneuvers. Which, is a topic for another blog post – because this part is most certainly done… Trust us… 🤞🤞🤞
As we have mentioned before, our ship data comes from Kystverket. We expect high data quality and in the early days of pirating this was achieved by importing excel lists where the pirates had used much time to track down the ships in order to maintain accurate positions. Now this work poorly as the amount of ships has increased and the time used to maintain the lists resulted in ships sailing to the next city before we could even detect it. In other words, the ship had sailed. Therefore, we had to make a more efficient way to load the same data and keep it consistent with Kystverket. By using power automate we created a flow that contacts their api and fetches data from premade bounding boxes around the Norwegian coast. It deletes ships out of range and updates the location of those who remains. If new ships occur in our areas, they are created in Dynamics 365 and we will know!
By making the data collecting process more efficient for our pirates using data from other sources, we hereby claim the Go With The Flow and Dataminer badge!! Argh 🙂
Okey, we do agree that solution that won is a bit better than this, but that’s why we think this is a dirty hack! Instead of doing what you should do with the challenge, we ended up creating a canvas app that could run offline and add that to the Power Page. It still solves the challenge, doesn’t it?
And, you might as how we got this brilliant idea.. What is more innovative use of AI if it’s not asking these questions you don’t have the answer for yourself? So we asked ChatGPT how we could solve this challenge, and this is the answer we got:
Pirates and singers are alike. They need a great stage name for people to remember who they are. When a new pirate arrives at the harbor master looking for work, the first thing they need to do is find a good name.
Just imagine what EMINEM would be if his artist name was Marshall Bruce Mathers III !!
The Harbor Master enters the new pirate to the system, and lets the AI tool decide what type of name suits the new pirate the best.
On the save, a Power Automate fires off a querry to OpenAI via a custom connector with the querry “Give me a pirate name for *Full Name*”. The return is then entered on the contact card.
Arrr matey! Listen up ye landlubbers, th’ teams round us be workin’ hard n’ fast to come up with grand solutions. Even though we scallywags at Pirates o’ th’ CaribIN be battlin’ against pirates, we must lend a hand to our neighbors when they be in need. Cap’n Hack Sparrow @in2 needed a figurehead to rally his crew, and since our 3D printer be swift and sharp, we took on th’ task with glee.
They sent us a 3D model of a pirate they fancied, which we then sliced and printed with ease. Now they be all smiles n’ joyful, hoisting their mugs high! Yarrr!
With the rise of Citizen development, and low code/no code approach in Power Platform, organizations are facing new challenges regarding correct Application Lifecycle Management.
Citizen developers, often not having professional IT background, are often lacking needed knowledge to comfortably work with Power Platform solutions, not mentioning GIT source control.
In our team, we decided to implement Center of Excelence Application Lifecycle Management.
This allowed us, in a span of few hours, to have robust, controlable and reviewable history and version tracking for our solution.
We have decided to implement simplified version, with only two environments, Development and Production.
Instalation of CoE ALM kit is quite well described on MS Learn platform – https://learn.microsoft.com/en-us/power-platform/guidance/coe/setup-almacceleratorpowerplatform-preview, however in few points the documentation was a little bit outdated. This is expected, as this solution is still in Preview.
Also, you need to pay special care to any manual changes you make in DEvOps repository / configuration, as this can lead to unexpected results when running the pipelines.
One limitation that we faced, is that MS assumes the Azure Build agents are to be used, and does not allow one-place customization of Agent Pool used.
CoE ALM solutions installs two applications in Power Platform environment:
Second one is used for setting up the process and first one is used for managing the releases. Both of them offer user friendly visual interface to configure ALM process:
Triggering of solution deployment is as well user-friendly and hides the complexity of processes happening in the background:
In the background, multiple DevOps Pipelines are created and flow of solution is following:
Unpacked solution is available and versioned in GIT source control:
For each Solution Deployment Request, the PR is created and changes can be reviewed.
If this topic seems to be interesting for you, feel free to stop by our table for a chat! 🙂
Our deployment solution uses YAML and PowerShell scripts to ensure CI/CD
Rapid development = rapid testing = a lot of mess in our test environment. We are using PNP PowerShell to set up our demo team to keep it fresh and clean.