I just managed to mess up the MySQL root account. Not a smart idea. After some MySQL manual reading and some serious Google-Fu, I figured out how to fix it.
- Stop the mysql server
- Add the following to the my.cnf file
- Start the mysql server
- Start a mysql client and run the following query
REPLACE INTO mysql.user VALUES ('localhost','root',PASSWORD('blah'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
- Quit the mysql client
- Stop the mysql server
- Remove what we added to my.cnf in step 2
- Restart the mysql server
After some digging around, I found that it actually wasn’t that difficult at all.
Getting it in
Putting something in an assembly as an embedded resource is pretty easy. At least if you are using Visual Studio. Just add the file to your project, click on it, and then under Properties set Build Action to Embedded Resource. And thats it!
Getting it out
Lets say we want an image called hello.png in a folder called Wopdidoo as a Stream.
If we are executing code in the same assembly, we can do as follows:
Assembly assembly = Assembly.GetExecutingAssembly();
Stream imageStream = assembly
If you are not executing code in the same assembly you just have to get that assembly reference in a different way. I often use
Assembly.GetAssembly(typeof(T)), where T is some type you know exists in the same assembly as the file you want. The rest is the same.
As far as I know, you use the stream as any other stream. Not sure if it is writable though? Probably not… let me know if you have some brilliant clues on that matter 🙂
❓ Remember to Dispose it when you are done.
I sometimes find it a bit difficult to figure out that string which identifies the resource. I then often use the following code to “find” it:
foreach (string s in assembly.GetManifestResourceNames())
It basically just scans through all the resource names and prints them out to the debug console 🙂
When doing background work you often want to call back to a user interface and let the user know that you are not dead. However, this is can be a bit difficult some times because windows forms can only be updated by code running on the same thread as the forms are. So, to get around this you can for example use a method called
Invoke on the control or form you need to update.
sender, SomeEventArgs e)
// Check if invoke is required
// And if it is, call Invoke on the form with a delegate to this same method and return.
sender, e });
// Second time around, InvokeRequired will be false and it will skip
// here where you can update the controls you need to update