My experience with Microsoft Store

Hello, again!

As a hobbyist software developer, I want my applications to be easy to find on the web and easy to download by potential users. When I began developing my first application, KeyPress OSD, I was struck by what hurdles one can face. One of the biggest deterrents would probably be, in my case, malware and virus warnings.

Since Windows 8, Microsoft integrated its own antivirus application in the operating system and made it aggressive. It proactively tries to detect potentially harmful applications. In the past, users were allowed to easily download any application they found on the internet and just run or install it. Now, because of the security measures employed by Microsoft in Windows, it has become very hard to execute any random application you may download. Windows discourages users to run the downloaded app or can even prevent inexperienced users to run it at all.

Now, as a new software developer, I was very unhappy with the aforementioned situation. My applications were labeled and still are, as malware. It feels to me like small developers are shunned or outcasted by Microsoft in the name of security. How to solve this issue? As far as I know, there are two options: sign the binary files using purchased VeriSign or DigiCert certificates, or publish the applications on the Microsoft Store, introduced in Windows 8.

Because I am in a collaboration with Tablet Pro, I had the option to publish my applications on Microsoft Store. Thank you for this, Justice!

My experience with the Microsoft Windows Store is overall positive. It is pretty good, but this post would not be written if everything was positive ;). Humans like to point out the negatives, right?

Microsoft provides users, such as me, with a dashboard where one can manage the submitted applications and their store-front properties. When an application is submitted to be published on Windows Store, it undergoes several stages to be certified and published. Primarily, there are two stages: an automated one and a human-centric one (a person from Microsoft tests the app).

The automated certification process does not return detailed error logs.

I once submitted a package with a malformed DLL, but I was not aware of this. The error I received on the Windows Store dashboard was just: «bad EXE format», but it did not point on what file this error occurred. I e-mailed Microsoft Support numerous times, weeks have passed by, and no one was able to tell me exactly why my package was rejected. It amazed me they were unable to give me an answer. They kept on bouncing the responsibility between different teams.

One day I decided to remove from the .appx package one DLL at a time, and resubmit it to the store, until it no longer fails. I discovered that msvcr100.dll was malformed. I do not know how it got to be malformed. This happened in the context of a major new version of my app. I was packaging it with a new DLL that I wrote and compiled myself. I initially believed the culprit was my new DLL. However, it was not. I had to do stupid trial and error to get to successfully publish the new Church Bells Tower version.

Human error reports lack details or are misleading.

Recently, I submitted Quick Picto Viewer to the Windows Store and it got rejected. The dashboard error report said: «App Quality - Misleading Content; Information within the product or metadata does not accurately represent the product. Products need to have unique functionality and value in the Store». I e-mailed Microsoft Support to ask what they mean by that. They told me, and provided me with a screen shot, that the About panel does not say it is published by Tablet Pro. I found their reply utterly silly. My other apps do not explicitly mention Tablet Pro at About.

To be honest, before submitting it, I did not test QPV on my system in the «Windows Store» mode, because I was lazy. However, I decided to do so, and I discovered it was crashing the very moment one tried to open an image. One could argue the app quality is crap, indeed, but why did they not report this? They could have said in the initial report on the dashboard, and I would not have had to e-mail them about it. A simple message would have sufficed: «App crashes on image open». The reply I got from Microsoft Support was a confirmation that they treat their customers as fragile snowflakes. You cannot hurt your customers by telling them the truth, but it is totally fine to mislead them with euphemisms and irrelevant things.

Microsoft Store dashboard has bugs.

If one tries to reorganize resources, such as screen shots, it sometimes loses the images or messes up the image descriptions. Or, if you try to upload a new package, without deleting the older one first, you get unexpected results: the old package is not replaced or, you get no package at all, after Apply. I am using Firefox and maybe they do not care about making it work well on this browser.

On the positive side of things, when I developed an application for Tablet Pro, Microsoft Support was more than great. One of the guys from there, in his spare time, helped us develop a DLL that we needed.

In conclusion, I am happy at least I have a safe way to distribute my applications to potential users. No virus or malware warnings, and as a big plus, app updates are automatically handled by Windows Store. Overall, I cannot complain much. For now.

Best regards, Marius.

How to face discrimination

Marhaban!

The discrimination of disabled people is omnipresent in the society. Even in civilized countries, it still manifests on many levels, e.g., low presence and representation in the media (movies and TV shows), poorly accessible infrastructure and transportations means. In underdeveloped countries, the situation is much more dramatic. Such a person may not even be able to read, because s/he would not get access to any education, out of sheer carelessness. In other contexts, a device with Internet access is not a commodity, but a luxury item. To understand discrimination as a phenomenon and know how to deal with it, you should:

  • Read literature on disabled people, such as, what it means to be an emancipated disabled person. Only through reading about what kind of prejudices are out there against disabled people, you can learn to observe subtle forms of discrimination that most people are not even aware they employ; even some disabled people do not notice them.
  • Know your human rights, and the associated international treaties and laws that apply irrespective of disabilities in any of the signatory countries.
  • Know the local laws and rights. Look for them on the official sites of the government of the country or state you live in.
  • Learn, be curious, be determinate and be assertive. Discrimination prevails because of ignorance, our ignorance as well.
  • Try to engage other people to help you fight against discrimination.

Most likely, if you are a disabled person, no one will bother to tell you what rights you have, e.g., a disability pension or free tickets to public concerts. You might not be informed even when you are entitled to specific services for your condition. You need to know your rights and demand their implementation, according to each social context you find yourself in. Be assertive and not obedient or compliant. For example, do not accept being refused to get a free ticket, if there is a law stating you are entitled to it.

Whenever you can, ask to talk with the superior authority, to get clear and well-documented explanations as to why you are denied what you know for sure the law entitles you to. It often happens that the people selling something or providing a service are not aware of the relevant legislation for their workplace. Name the laws and be precise, speak eloquently. Print or save on your smartphone the relevant sections to have them at hand, in case you have to be even more persuasive.

Voice your concerns and make people aware of how and when you are being discriminated. Denounce every form of social or institutional discrimination you face. Do it on social networks as well. Make yourself heard. Be vocal! Otherwise, we cannot raise awareness on the issues disabled people face. Sympathize with other communities of disabled people, not just with the one you are a part of. We all must act united in our causes.

Try to engage your friends or, at least, your family to support you in your endeavors. When you interact with the local authorities, you might need help or assistance. Entice your representative(s) to refuse any form of discrimination on your behalf, to be persistent and strong on his or her position, to fight for inclusion. If you know a particular law should apply in your case as well, but you are denied, explain it to your family members. They should be your strongest allies against discrimination and in the fight for emancipation.

Friends or acquaintances that discriminate against you should be avoided entirely. If you are discriminated in less obvious ways, explain it to them, make them aware of it. Denounce discrimination, even when it happens in your family.

When you go out in public, if people suddenly insult you or attempt to bully you, answer with ignorance. Do not stop from your ride, move on. Take these things lightly. Refuse the people that want to pray or give you "the good news", and even those who want to give you money. Show people you have a spine.

And be courageus! Go out whenever possible. Let people see disabled people exist out there in the world.

PS. This article was extracted from my e-book on people with disabilities.

Ciao!

Blending modes math formulas

Hello, again!

I recently overhauled the blending modes maths in Quick Picto Viewer. I decided to write an article here on the maths behind the common blending modes, because I was not able to easily find in one place the mathematical formulas. However, I will not be describing how they visually impact the image or their use cases.

Blending modes describe mathematically how the colours of two images are mixed when composited on top of each other. The mathematical formula is applied on each image colour channel: R, G and B, for each overlapping pixel. The formulas provided here work on normalized RGB values. To normalize the values, one has to divide by 255 each R, G and B value, given they are in the range of 0 to 255. Therefore, floating point precision is necessary for the computations.

In the following table, the base layer is B and the image on top is A, and Z is the result of the math formula which has to be applied on each colour channel. The commutative blending modes are marked with * (asterisk). For these, the layers order does not matter.

Fomula Blend mode Category
z = min(A, B) *Darken Darker
z = A * B *Multiply Darker
z = A + B - 1 *Linear burn Darker
z = 1 - ((1 - B) / A) Color burn Darker
z = max(A, B) *Lighten Brighter
z = 1 - ( (1 - B) * (1 - A) ) *Screen Brighter
z = A + B *Linear dodge (linear add) Brighter
z = B / (1 - A) Color dodge Brighter
if (A < 0.5)
 z = 2 * A * B
else
 z = 1 - (2 * (1 - A) * (1 - B) )
Hard light Contrast
if (A < 0.5)
 z = (1 - 2*A) * (B^2) + 2 * B * A
else
 z = 2 * B * (1 - A) + sqrt(B) * (2 * A - 1)
Soft light Contrast
if (B < 0.5)
 z = 2 * A * B
else
 z = 1 - (2 * (1 - A) * (1 - B) )
Overlay Contrast
if (A <= (1 - B))
 z = 0
else
 z = 1
*Hard mix Contrast
z = B + (2 * A) - 1 Linear light Contrast
if (A < 0.5)
 z = 1 - (1 - B) / (2 * A)
else
 z = B / (2 * (1 - A))
Vivid light Contrast
z = (B + A)/2 *Average Contrast
z = A + B - 2 * (A * B) *Exclusion Inversion
z = abs(B - A) *Difference Inversion
z = B / A Divide Cancelation
z = B - A Substract Cancelation
z = gray(A) + B - gray(B) Luminosity Component
z = gray(B) - gray(A) + B + A/5 Ghosting Component contrast

The gray() function takes the non-normalized RGB values and returns a normalized value. It is defined as:

g = (r*0.299 + g*0.587 + b*0.114)/255.0

I used the NTSC colour weights to convert the colour of the pixel to gray, because I get very similar results with other applications. Of course, one can try more accurate conversion algorithms.

The Ghosting blending mode is a personal concoction :-). The end results one can get with it are quite interesting.

Till next time... best regards, Marius.