Retail sale has transformed to reduce the spread of COVID-19. Plastic shielding, gloves, masks, and tap to pay all help reduce the spread of COVID-19.
However we are still printing out and handing over paper receipts.
Instead we can make receipts contact-less. Transactions can be stored as a digital receipt instead with a QR code either containing the data or containing a link that goes to a site to get the data. Phones can scan the QR code. People who have a membership could receive their receipts as they typically scan their membership (though they may want their receipt as a QR code as well for software to manage).
COVID-19 is a hard problem. It is larger than building a Canadarm, larger than a hydroelectric dam at Niagara Falls, and larger than the tallest freestanding structure for 32 years. COVID-19 is a problem that requires engagement by everyone, every step of the way. Lives have been lost. Now is the time to hope for the best, but plan for the worst.
The impact of a COVID-19 resurgence and an ensuing lockdown would be substantially worse than initiating preventative measures. Preventative measures are an investment in enabling Ontario to operate safely (see “Impact of COVID-19 on Ontario’s Economy” below).
When children return to school in September, we need to minimize the spread of COVID-19 and to maximize the well-being of families and their ability to support themselves. Investing in education now by reducing class sizes to prevent a resurgence of COVID-19 would avoid a catastrophic impact on our health care and economy due to returning to a state of lockdown. As of July 30th, Ontario’s reported case rate for COVID-19 has remained steady at under 200 per day; we are not yet even near zero.
Current understanding of COVID-19 epidemiology
The most significant measure for reducing the spread of COVID-19 is to minimize contact between people to reduce the spread of infection. While Remdesivir is progress for treatment, its partial reduction of recovery time and mortality is further inhibited by availability. In the light of limited treatment, the uncertainty of immunity to COVID-19, and the unavailability of a vaccine, the best approach to contain the disease is to minimize its spread.
Recent studies highlight the following aspects of COVID-19 transmission necessary to consider when re-opening schools:
Asymptomatic adult carriers of COVID-19 have the same virus load as symptomatic carriers, suggesting asymptomatic carriers can be efficient transmitters.
There are other debilitating outcomes from COVID-19 other than death ranging from a prolonged recovery period to multiple organ failure that have a profound impact on income, employment, long term disability, parenting, and support from the government.
Children are less likely to suffer from COVID-19 than adults and show milder symptoms, potentially allowing infections to spread unnoticed.
Young symptomatic children (less than five years old) have at least as high or even 10-100 times higher viral load in their upper respiratory tracts as symptomatic adults. These data alert that symptomatic children may be more effective carriers and transmitters.
In children, SARS-CoV-2 persists in faecal samples even after clearing from the respiratory tract, which has the potential to transmit the virus (especially in kindergarten) even after negative tests.
It is premature at best to claim that schools aren’t a significant transmission route for COVID-19. Until we have substantial evidence to support these claims, we cannot risk people’s livelihoods and lives on a hope.
A commandlet in Unreal is a mini-program that can be run from the commandline typically for automation.
A couple of significant examples are:
Resave Packages: resaves packages, typically used to resave older packages to bring them up to date.
Fixup Redirects: when assets are moved, they leave redirectors behind so that assets that reference them can be updated. Fixup Redirects updates those assets referencing the redirectors, then removes the redirectors that are no longer used.
Cooking: convert content into a format more optimized for target platforms.
Localization Pipeline: processes text in the game for translation and retrieves translations to include into the game.
How to Create A Commandlet
All commandlets inherit from UCommandlet which provides the basic infrastructure for running a commandlet. As a UObject it automatically gets registered so that it can be found at startup to run.
Typically a commandlet ends in “Commandlet” for discoverability.
Generally commandlets are editor-only and should go into an editor only project.
A commandlet has a Main method that receives commandline parameters and returns an integer exit code that you override. A non-zero exit code is an error and will appear at runtime (particularly relevant in build processes to know something went wrong).
Example:
#pragma once
#include "Commandlets/Commandlet.h"
#include "CommandletSample.generated.h"
UCLASS()
class UCommandletSampleCommandlet : public UCommandlet
{
GENERATED_BODY()
virtual int32 Main(const FString& Params) override;
};
The body of a commandlet is like a main function for a standard of C++.
You can run a commandlet from Visual Studio by modifying the properties of the project under Debugging→Command Arguments and add a -run= option for your commandlet.
Example:
From Commandline
To run the commandlet from the commandline (such as for Jenkins) you can run:
Commandlets are primarily about automating operations done over some or all assets.
The Asset Registry is the means by which one gets access to the list and operations available for assets in uasset and umap files.
NOTE: A significant limitation of the asset registry is it is limited in accessing assets that are sub-objects in other objects. For example a map can contain actors and those actors may not be returned when querying the asset registry. Instead it may be required to consider assets that can contain your desired asset.
Once you have your list of assets, you can retrieve them:
for (const FAssetData& Asset : Assets)
{
<Native Class>* Instance = Cast<Native Class>(Asset.GetAsset());
// DO STUFF HERE
}
Source Control
You can add, edit, and delete files from source control from commandlets as well.
Source control is available if it has been configured for the user in the project settings or via commandline settings. An example for Perforce is provided:
-SCCProvider=Perforce -P4Port=<your perforce server name and port> -P4User=<p4user> -P4Client=<p4client>
It is recommended to force update otherwise cached information may be used that can give erroneous results. There is a version of this method for getting the state of multiple files at once which is far more efficient than one at a time.
Adding, editing, or deleting consists of actions in the source control provider:
const ECommandResult::Type Result = SourceControlProvider->Execute(ISourceControlOperation::Create<FCheckOut>(), PackageToSave);
Saving Packages
Saving a package after modification does require some care.
There are two ways to save packages whether there is a root object (World in maps) or just the package itself.
We use functions like the following to save the package. NOTE: this is a good place to consolidate functionality across uses:
/**
* Helper function to save a package that may or may not be a map package
*
* @param Package The package to save
* @param Filename The location to save the package to
* @param KeepObjectFlags Objects with any these flags will be kept when saving even if unreferenced.
* @param ErrorDevice the output device to use for warning and error messages
* @param LinkerToConformAgainst
* @param optional linker to use as a base when saving Package; if specified, all common names, imports and exports
* in Package will be sorted in the same order as the corresponding entries in the LinkerToConformAgainst
* @return true if successful
*/
bool UGatherDialogCommandlet::SavePackageHelper(UPackage* Package, FString Filename)
{
Package->FullyLoad();
EObjectFlags KeepObjectFlags = RF_Standalone;
FOutputDevice* ErrorDevice = GWarn;
FLinkerNull* LinkerToConformAgainst = nullptr;
ESaveFlags SaveFlags = SAVE_None;
// look for a world object in the package (if there is one, there's a map)
UWorld* World = UWorld::FindWorldInPackage(Package);
bool bSavedCorrectly;
if (World)
{
bSavedCorrectly = GEditor->SavePackage(Package, World, RF_NoFlags, *Filename, ErrorDevice, LinkerToConformAgainst, false, true, SaveFlags);
}
else
{
bSavedCorrectly = GEditor->SavePackage(Package, NULL, KeepObjectFlags, *Filename, ErrorDevice, LinkerToConformAgainst, false, true, SaveFlags);
}
// return success
return bSavedCorrectly;
}
I have written a number of tools for navigating our data in Dauntless. One of these tools gathers data about how our assets are referenced and the Unreal Engine pak files they go into for streaming installs for some platforms.
What I wanted to be able to do is from a particular node in the tree of assets (tree representation of a directed graph with cycles) was to search for a subnode (breadth first search) that matched search criteria by either name and/or chunk it belonged to (for cross-chunk references). Given the results of my search through my tree nodes and the collection of objects I then needed to navigate to the corresponding TreeViewItem and scroll to it.
If a TreeViewItem is collapsed, its visual children TreeViewItem instances may not be generated yet. This could might be simplified further based on the ItemContainerGeneratorStatus but I think it helps illustrate the stages.
My nodes are all based on a single type, the template parameter T. For more heterogeneous situations a base class, interface, or even just object would suffice.
On October 15th, 2019, I sent a letter to the Ontario Ministry of Education about Colour Theory.
The problem is the colour theory taught is Red-Yellow-Blue. This isn’t accurate. I received a response from the ministry on November 12th, 2019. I have included what I sent and the reply below.
I confess that I am disappointed. You see, the response wasn’t providing information indicating what I provided was incorrect, only that these are “suggestions for teachers” rather than mandatory. This contradicts my children’s teachers, motivating sending the email to the ministry (in fact they recommended going to the ministry).
When students make mistakes in school, we expect them to learn, improve, and hopefully make new and interesting mistakes instead of the same old ones.
What do we do when the education system is not only making a mistake, but propagates that mistake to others, then fails to remedy the issue when it is pointed out to them?
More specifically, a Dreem 2. I want to run some experiments.
I want to know if the Dreem 2 can provide enough information about my sleep patterns while using a CPAP or APAP to indicate which is better and why. A CPAP provides continuous positive air pressure, generally always the same. The APAP on the other hand has to monitor your breathing and adjust pressure based on patterns. Which means the APAP could have non-trivial latency that can impact sleep quality.
If the Dreem 2 can monitor sleep quality and other indicators, it could theoretically provide feedback faster to an APAP to modify air pressure. Furthermore since it is already a headband it can be incorporated into existing CPAP masks.
And taking about masks, why not have a means to take a series of photos of a person’s face and 3D-print custom-fit masks for people?
Maybe Respironics or ResMed will read this and make it happen for me.
A friend pointed out I hadn’t posted in a while. This was something I spun up the other day for fun.
This solution is a substantial departure from existing attempts that I’m aware of.
For a good summary of the theodicy problem, you can go to The Philosophy Dungeon. The basic dilemma is if you are all-powerful, all-knowing, and all-good, how can there be evil?
Inspiration and ideas for this solution come from Kurt Gödel’s Incompleteness Theorem (Incompleteness Theorems on Wikipedia) and from Claude Shannon’s Information Theory (Information Theory on Wikipedia). I’m sure they would not be impressed by having any similarities drawn.
These contexts include court proceedings (including what is said and written by witnesses, prosecutors, and judges), public policy, and a few other areas.
So when I see falsehoods in a filing to the court that a lawyer makes on behalf of a client, falsehoods that satisfy all of these characteristics:
The falsehood is not simply a clerical error (such as mistypings, etc)
The falsehood has evidence presented that contradicts the falsehood
The falsehood remains in subsequent filings
I would conclude either that the lawyer is representing a dishonest client which reflects poorly on the lawyer, or the lawyer is being dishonest to sway the decisions of the court on behalf of their client which reflects poorly on the lawyer.
In both cases, while I agree it may not warrant a lawsuit for defamation, the lawyer ought to earn a rebuke for this behaviour. Repeated incidents reflects poorly on the legal profession. The relevant Law Society ought to hold their lawyers to a higher standard.
This is the amount outstanding to my lawyer as of today, along with a request for a $20,000 retainer. Combined with the $58,982.06 I have already spent on legal fees, that totals $86,600.93.
This doesn’t include the other incidental costs I have incurred, such as lost work.
I have been separated for the past two and a half years. It has been a fight most of the way.
We are still fighting. I’m… struggling to keep going and make ends meet with the amount of debt I have accumulated. The emotional harm of this is process is ruining my outlook on people and life. It is killing my hope.
I have been paying as I go and may not be able to any longer.
These are my recommendations to you if you are going through a divorce or planning to.
I will update this as I get feedback and questions about it (though I won’t get into any personal details).
I spent an inordinate amount of time in Baldur’s Gate and sequels, Neverwinter Nights, and many others.
So I was delighted to see Pathfinder: Kingmaker coming out. I’ve been playing off and on and there is a bit of an adjustment. I think the most interesting detail is how easy it is to die. I don’t think this is a bad thing. It happens to be an adjustment to thinking that you shouldn’t expect to go wandering everywhere and expect it to adjust to your difficulty. If you get in over your head, you will suffer (looking at you Viscount Smoulderburn).