Thanks Healix. I am fine with the assumption but we should really document this and any other assumptions made (if any) for the API somewhere.
(edited by DarkSpirit.7046)
The Flag values do not seem right as I would have expected Masterwork and above weapons and armor to have the SoulBindOnUse flag set, but this is not the case. There are some items with SoulBindOnUse set, however, most of the other Masterwork+ items do not have that flag set.
For example:
https://api.guildwars2.com/v1/item_details.json?item_id=15305
(edited by DarkSpirit.7046)
I notice that some items that were missing last night are now found in the items API. Comparing with ALL items in the trading post, I have only 60 missing items now (see attached).
Attachments:
I don’t use flags on all my enums either. I only use enum flags in GameType, Item Flags, Restrictions, Infusion slot flags (i.e. Defense, Offense, Utility), and upgrade component flags because these come in the form of JSON arrays and can hold more than one enum value. But yes, I agree there would be quite a bit of work involved if you do the change.
You can pass a capacity parameter to the List constructor and test your theory.
(edited by DarkSpirit.7046)
Thanks for the experiments. I dont think there should be any big performance issue with that so I am convinced.
On a side note, for enum flags, you can also use the Enum.HasFlag method to make your code more readable instead of checking the bit states yourself.
(edited by DarkSpirit.7046)
The code needs to run more than once when you are looking for different items at different times. The performance does look good enough. I am curious though, if you need to check more than one flag (e.g. AccountBound + SoulBound, etc), how much does the performance differ, if at all.
(edited by DarkSpirit.7046)
yeah well one millisecond are 10000 ticks so half a millisecond is still fast enough. Even if Anet introduces so much flags that it goes up another 5000 ticks, no one should complain about the speed. We are not in real life business applications where every ms counts or you loose half a million Dollar
In my eyes using bitwise flags for every bit of efficiency is a little bit over engineering the code.
But If you drop me your dll and a sample unit test code I’ll gladly run it through LINQ-Pad
I am not sure if you are seeing this from the perspective of an actual app. Performance is critical when you are displaying large amounts of data where the code to access the item data don’t just get run once, but many times. Any performance inefficiency in your core library data accessors get multiplied.
That said, I don’t wish to sound all “doom-and-gloom” if you don’t use bitwise operations. Your library performance may just be good enough for most apps, plus you do have better code readability your way, I’ll give you that.
I am not ready to drop my dll yet as I am in the middle of making changes. But I can share my code to deserialize JSON flags to bit flags so you can copy-and-paste to integrate it to yours and test it, if you wish.
(edited by DarkSpirit.7046)
Compared to the TP, it’s 325 total missing, down from 813.
Thanks Healix. I didn’t want to bog down the TP server by querying for all the items, but thanks anyway.
I updated my Items.JSON a few minutes ago and compared it against just the weapons and armors from the trading post.
Here is a list of missing items from the API. There are no missing armor but there are some missing weapons:
0)Missing weapon Id 37258 Axe
1)Missing weapon Id 37259 Axe
2)Missing weapon Id 37261 Axe
3)Missing weapon Id 37262 Axe
4)Missing weapon Id 37266 Axe
5)Missing weapon Id 13612 Cleric’s Destroyer Short Bow
6)Missing weapon Id 37245 Dagger
7)Missing weapon Id 37254 Dagger
8)Missing weapon Id 13704 Explorer’s Destroyer Maul
9)Missing weapon Id 37292 Focus
10)Missing weapon Id 38326 Giver’s Krait Pilum
11)Missing weapon Id 37318 Greatsword
12)Missing weapon Id 37302 Greatsword
13)Missing weapon Id 37297 Greatsword
14)Missing weapon Id 37294 Greatsword
15)Missing weapon Id 37344 Hammer
16)Missing weapon Id 37374 Harpoon
17)Missing weapon Id 37394 Longbow
18)Missing weapon Id 37401 Longbow
19)Missing weapon Id 37441 Mace
20)Missing weapon Id 37422 Mace
21)Missing weapon Id 37435 Mace
22)Missing weapon Id 37417 Mace
23)Missing weapon Id 37414 Mace
24)Missing weapon Id 37458 Pistol
25)Missing weapon Id 37453 Pistol
26)Missing weapon Id 37451 Pistol
27)Missing weapon Id 37503 Rifle
28)Missing weapon Id 37490 Rifle
29)Missing weapon Id 37498 Rifle
30)Missing weapon Id 37484 Rifle
31)Missing weapon Id 37492 Rifle
32)Missing weapon Id 37496 Rifle
33)Missing weapon Id 37480 Rifle
34)Missing weapon Id 37479 Rifle
35)Missing weapon Id 37557 Shield
36)Missing weapon Id 37534 Shield
37)Missing weapon Id 37563 Shield
38)Missing weapon Id 37568 Short Bow
39)Missing weapon Id 37570 Short Bow
40)Missing weapon Id 37588 Short Bow
41)Missing weapon Id 37576 Short Bow
42)Missing weapon Id 37619 Speargun
43)Missing weapon Id 37635 Staff
44)Missing weapon Id 37629 Staff
45)Missing weapon Id 37653 Staff
46)Missing weapon Id 37654 Sword
47)Missing weapon Id 37659 Sword
48)Missing weapon Id 37671 Sword
49)Missing weapon Id 37673 Sword
50)Missing weapon Id 37676 Sword
51)Missing weapon Id 37678 Sword
52)Missing weapon Id 37682 Sword
53)Missing weapon Id 37691 Torch
54)Missing weapon Id 37703 Torch
55)Missing weapon Id 37699 Torch
56)Missing weapon Id 36217 Traveler’s Ceremonial Bulwark of the Night
57)Missing weapon Id 36208 Traveler’s Ceremonial Focus of the Night
58)Missing weapon Id 36210 Traveler’s Ceremonial Hammer of the Night
59)Missing weapon Id 36233 Traveler’s Ceremonial Pistol of the Night
60)Missing weapon Id 36234 Traveler’s Ceremonial Rifle of the Night
61)Missing weapon Id 36209 Traveler’s Ceremonial Scimitar of the Night
62)Missing weapon Id 36219 Traveler’s Ceremonial Speargun of the Night
63)Missing weapon Id 36239 Traveler’s Ceremonial Stave of the Night
64)Missing weapon Id 36223 Traveler’s Ceremonial Stave of the Night
65)Missing weapon Id 37715 Trident
66)Missing weapon Id 37727 Trident
Total: 67
I did not check against non-weapon+non-armor items on the TP or items that are not sellable on the TP so potentially the list could be longer.
EDIT: Next, I compared the items from this API against the items from the gw2db API. Seems that there are 12,592 missing items. I can’t say how accurate the gw2db API is, there may be old outdated data from gw2db. I have attached the data dump with the missing items to this post.
Attachments:
(edited by DarkSpirit.7046)
Lol…I knew the bottle-neck would be the server which was why I asked you to take the data dump in the first place.
https://forum-en.gw2archive.eu/forum/community/api/NET-Implementation/first#post2131073
This would impact performance even more than what we talked about recently. Asking your user to wait 15 to 30 minutes is extremely long.
You should try a bitwise-AND operation and see how many ticks it takes, if it even registers. If you take the outer loop of going through nth items in your list + going through your Flags enum List, your algorithm becomes O(n-square) while mine would be O(n). If ArenaNet introduces more items and Flags in the future, which they probably would, your algorithm performance would be impacted more than mine, at least in theory. But I can understand if you think that bitwise operations are not as intuitive and you decided to sacrifice efficiency to make your code look more intuitive.
(edited by DarkSpirit.7046)
That seems to be a fair analysis and in the end, it is your call. Thanks for looking into it though.
Seems to be fixed now that the discussion has gone to the second page.
Yes in the end your operation is faster (duh! its O(1) after all :P), but I deem the speed benefit not great enough to justify the additional work I and the other developers have to do, unless you can prove that it is really that much faster.
Well like you said, I do deem it to be more efficient because it is O(1) versus O(n). You are comparing the speed at which a computer processor performs a bitwise-AND versus FindAll. Even though I like LINQ myself, there is just no comparison the bitwise-AND operation is going to be faster. Sorry you would just have to trust my words since I don’t have the time to do performance testing.
Like I have said, if you prefer my approach, I am willing to share my code to reduce the amount of work you guys need to use it. My code uses the dynamic type, from .NET 4, so I hesitated to share it earlier.
(edited by DarkSpirit.7046)
You are converting to a List first anyway and that is still an O(n) operation compared to mine which is an O(1) operation. Furthermore, to check for the flag, my client only needs 1 line of code so the complexity is much lower.
The “.NET Implementation” topic in the Api forums seems to have “disappeared” after I have last replied to the thread. When I clicked on it, it loads an empty thread.
I noticed that it tries to bring me to page 2 when I clicked on the topic:
https://forum-en.gw2archive.eu/forum/community/api/NET-Implementation/page/2#post2147396
..which is empty. The discussions are all in page 1:
https://forum-en.gw2archive.eu/forum/community/api/NET-Implementation/page/1#post2147396
Hey Ruhrpottpatriot, I noticed that you deserialized item flags into a List. Although that is easier to deserialize, it is going to be harder for your client to use.
For example, if I am to look for items that are AccountBound, then I would have to search through the Flags List for AccountBound for each item. This is why I deserialize it to bit flags so I can just do this:
if ((pair.Value.Flags & GW2APIFlagsEnum.AccountBound) != 0) {…}
If you agree, let me know if you want to see my item flags JSONConverter or any part of my code if you want.
(edited by DarkSpirit.7046)
1. I saw Cliff description on item_details.json:
- infusion slots now show the item_id of the infusion instead of the full item details.
But I only see the infusion slots being returned as:
“infusion_slots”:[{"flags":[“Defense”]}]
It used to be:
infusion_slots = [list]
item = str
(no content)
flags = [list]
Defense
Offense
Utility
The only difference is that they removed the item string which was always empty, so I don’t understand how that relates to Cliff’s comment. For example,
https://api.guildwars2.com/v1/item_details.json?item_id=39550
2. Does the new “flags” property in recipe_details.json need to be an array? Every recipe so far are either AutoLearned or LearnedFromItem, never both. Perhaps there would be other flags values added later that would require “flags” to be an array?
Thanks.
(edited by DarkSpirit.7046)
@The Pointless: The recipe and item schema have changed.
Thanks I have updated mine too.
I am still holding out hope that they would provide NPC vendor “SoldBy” info for items soon.
I would really like to be able to come up with something like this:
http://www.gw2spidy.com/recipe/3157
…with the data provided.
I already have the code developed for this against the gw2db data but their data is missing some NPC vendor prices for some items so I had to supplement it.
As a bonus, if they can also provide Mystic Forge recipes that would be even better. I tried mixing the MF recipes into the crafting recipes and my code came up with new cheaper ways to make some of the named exotics, which is very cool.
(edited by DarkSpirit.7046)
Ok thanks for the idea, I’ll have to research what gzip compression (“Accept-Encoding: gzip” in the request header) will mean in android programming.
Maybe this would help:
When caching many small files, you can save a little bit of disk space by creating one large file. Files are allocated a specific amount of disk space, which for mostly everyone is going to be in intervals of 4KB. If you have a 1 byte file for example, it’s going to use up 4 KB.
For ~4700 3-8KB files, you could save anywhere from 5-10 MB of space, assuming 64×64 icons.
In my case, I’m caching 24,853 raw responses that are just a few 100 bytes in length each. In total, it’s only 11 MB, but since they’re all separate files, it’s actually 97 MB. In database form, it’s 4 MB.
That is cool, but in the case of my app that would be a little in the realm of adding more complexity for little gain since hard disk space is very cheap nowadays anyway. Squeezing better performance is where I have been investing time into.
(edited by DarkSpirit.7046)
Would be nice if Arenanet would release an official asset kit containing all those icons for use with the API or some sort of tool to pull the data from the gw2.dat. People have already started to pull the data in some ways from the AH which i believe wasn’t intended. Official sources would also help the wikis
What Zicore’s TP notifier does is to cache those images in a folder whenever his app tries to fetch an item image. This way, the app actually runs faster the more the user uses it at the cost of some disk space (which is cheap nowadays anyway). My image cache folder has 4738 PNG files right now.
(edited by DarkSpirit.7046)
You now can query the server for all the available recipes (WARNING!!!:: This will take a very, very long time) or for one recipe at a time.
I’m still looking for willing people to help me and the others code, especially on the subject of async requests.
Thanks.
I would advise people to use the data dump for items and recipes because these are not suppose to change often except maybe after a game patch. You can read the data into a dictionary when your app starts up, which doesn’t take too long, then do a dictionary lookup after that. This saves bandwidth and improves the performance of your app significantly at the same time.
Granted that the api is still beta and there is an existing bug where some items are missing. Cliff is looking into that. But after release, I expect the data to be more stable.
It is so fast, that I use this data to build item tooltips on my app on the fly. I cached the images of course. It would not have been possible if I have to go fetch data from the web each time I want to build up a tooltip as the mouse pointer moves across the items.
You can use the item and recipe data dump here:
https://www.dropbox.com/sh/zucn218fhneva3c/-MjOkUsTtI
Discussion:
(edited by DarkSpirit.7046)
I checked them out and their ids are not as close to running numbers as I initially thought, especially for the items. There are many gaps. They could be missing items or there are just no valid items with such item ids.
Anyway, I updated my JSON files to the JSON object with id-keys format. This format would make it easier to load them into a dictionary or map.
Is an IEnumerable<GW2APIFlagsEnum> a solution?
I already have a solution but I am just looking for a better one, if it exists. I had to implement my own JSONConverter to deserialize the JSON array values into bits and bitwise-OR them (see Healix’s post above). But I had to use the dynamic type to make my JSONConverter generic enough for all the Flags enum, which I am not happy about.
(edited by DarkSpirit.7046)
Yes that’s what my example also does. You create an object and annotate it with the [JsonProperty] attribute if the naming differs from the naming in the json string. Json.Net will then automatically try and find the enum and deserialize into.
You could also not define a type and let Json.Net deserialize for itself. But then you’dprobably get an object back.
Look how we did it in Gw2.Net (V1.World namespace and there look at the models).
I know all that but what we wanted is to deserialize JSON like this:
“flags”:[“AccountBound”,“SoulBindOnUse”]
into:
[Flags]
public enum GW2APIFlagsEnum
{
None = 0,
AccountBound = 0×01,
SoulBindOnUse = 0×02,
HideSuffix = 0×04,
NoMysticForge = 0×08,
NoSell = 0×010,
…
}
So the property looks like:
public GW2APIFlagsEnum Flags;
So Flags can take on the state of BOTH AccountBound and SoulBindOnUse at the same time, according to the JSON array, since they are bit-flags. You can use them like this by checking if individual bits are set:
if ((item.Flags & GW2APIFlagsEnum.NoSell) != 0) ….
if ((item.Flags & GW2APIFlagsEnum.SoulBindOnUse) != 0) ….
(edited by DarkSpirit.7046)
Json.Net can directly deserialze to enums.
snip
I meant deserializing enum Flags from JSON array, look at Healix’s example. For straight deserializing into enum, you can just use the built-in StringEnumConverter.
In order to make ItemFlags a generic type and also use the bitwise OR operator on it, I had to use the dynamic type. That works but I am not happy with resorting to that and I wonder if there is a better way.
(edited by DarkSpirit.7046)
2. There are a few entries in the data I’ve got with the weapon type “Toy”, actually. An example of this is the Frying Pan. Not even sure whether it even matters ingame, though, because I’ve not been able to buy town clothing sets.
You are right, I missed that.
snip!
I did get around to adding that to my page, along with the rest of what I could find from the data I’d grabbed: http://wiki.guildwars2.com/wiki/User:ThePointless/APIMap#Recipes
Not that I got much of a response on it on the other thread after the fact, like.
For what it is worth, I looked into yours and compared it against his.
1. His has a mistake for the “tool” type. It should be “charges” instead of “uses”, so yours is right. Can you fix it for him or tell him?
2. Both of you have the same mistake of listing “Toy” under the weapon type. There is no “Toy”, only “TwoHandedToy”.
3. Minor mistake on your recipe type. Amulet should be listed under Jeweler instead of Artificer.
Nicely done.
I talked to the item designers about this.
They agree with you that it’s strange, and they say it was a mistake made when designing the item. As you probably know, since guardians and warriors are the only ones who can use that item anyways, there’s no effective difference in how the item works.
Anyways, thanks for bringing this to our attention
Yes, right now there would not be any effective difference since only warriors and guardians can use heavy armor, until you guys decide to add new professions, for the next expansion, that would also wear heavy armor.
Thanks for looking into this Cliff!
I don’t see any documentation on the Recipe type property value enumeration on the website or the wiki. Here are the valid values that I have found for Recipe type:
Refinement,
Component,
Bulk,
Bag,
Dye,
Potion,
UpgradeComponent,
Inscription,
Insignia,
Consumable,
Dessert,
IngredientCooking,
Seasoning,
Feast,
Snack,
Soup,
Meal,
Coat,
Leggings,
Gloves,
Helm,
Boots,
Shoulders,
Sword,
Hammer,
LongBow,
ShortBow,
Axe,
Dagger,
Greatsword,
Mace,
Pistol,
Rifle,
Scepter,
Staff,
Focus,
Torch,
Warhorn,
Shield,
Harpoon,
Speargun,
Trident,
Amulet,
Ring,
Earring
Typical call: https://api.guildwars2.com/v1/recipe_details.json?recipe_id=3392
Output:
{"recipe_id":“3392”,“type”:“Component”,“output_item_id”:“12812”,“output_item_count”:“1”,“min_rating”:“0”,“time_to_craft_ms”:“2000”,“ingredients”:[{"item_id":“19680”,“count”:"2"}]}
(edited by DarkSpirit.7046)
Cool, so am I. I had to implement my own JSONConverter to deserialize the flags JSON array to a flags enum. It works but I am not too happy with the way I did it so I am looking for a more elegant solution.
I’m assuming something like?
[Flags] enum ItemFlags { None = 0, AccountBound = 1 << 0, HideSuffix = 1 << 1, NoMysticForge = 1 << 2, NoSalvage = 1 << 3, NoSell = 1 << 4, NotUpgradeable = 1 << 5, NoUnderwater = 1 << 6, SoulBindOnAcquire = 1 << 7, SoulBindOnUse = 1 << 8, Unique = 1 << 9 };
And then however you read the original flags,
ItemFlags flags = ItemFlags.None; foreach (string flag in item.flags) flags |= (ItemFlags)Enum.Parse(typeof(ItemFlags), flag, true); //try/catch this for unknown types
It’s a pretty simple way to get an enum representation of their string array.
Something like that except that I have to make the ItemFlags type more generic since I would want to use the same JSONConverter for the other flag-like enums.
I also use the EnumMember attribute to map certain JSON strings to enum flags since I am picky with the way my flags are spelled, but that is just extra code to handle it.
It sounds like you are deserializing the JSON data to a dictionary and attempting to use the event id guid as a key for a quick hashtable lookup?
As you already know, you can’t do that. The key has to be a combination of both the event id and the world id in order for it to be unique. Or you can have two levels of indexing via the world id and event id.
(edited by DarkSpirit.7046)
I can’t believe that a main event like the Temple of Balthazar is inactive for almost 24 hours without anyone attempting / starting it so the reset of the server state seems to be irrelevant in this case.
Just have a look at https://api.guildwars2.com/v1/events.json?world_id=2012&event_id=2555EFCB-2927-4589-AB61-1957D9CC70C8 and see what result you get! I bet it’s {"events":[]}Oh, don’t click the link as it will fail becasue of the forums redirect- you’ll need to copy and paste it into your browser.
Did you try other worlds instead of just that one (i.e. Piken Square)?
https://api.guildwars2.com/v1/events.json?event_id=2555EFCB-2927-4589-AB61-1957D9CC70C8
(edited by DarkSpirit.7046)
Yes we are using RestSharp to get the Json from the ANet server. However we are using Json.Net to deserialize the string as Json.Net is the fastest Json deserializer out there and we can use every bit off speed.
Cool, so am I. I had to implement my own JSONConverter to deserialize the flags JSON array to a flags enum. It works but I am not too happy with the way I did it so I am looking for a more elegant solution.
I’ll wait for you guys to get to the items API then.
Thanks for sharing that information with us. Admittedly when we were making those suggestions, we probably just asked for what we needed, without realizing that we could have extracted that same information from another, more-authoritative, api.
Thanks for taking the time to explain this to us.
(edited by DarkSpirit.7046)
Are you guys using RestSharp? I am not familiar with it but how well does it support deserializing the flags array from the item details into a bit flags enum?
Sorry for jumping the gun because you have not worked on that yet.
(edited by DarkSpirit.7046)
So it is requested that the API should provide images, too?
(I started writing a parser that parses all the images from items over gw2spidy All-Items-JSON and name them the ID of the item from GW2 official api)
Check the official suggestion thread:
If it is not there, please add it. Thanks.
Or just request for access to the gw2db api:
http://www.guildwars2guru.com/topic/70465-guild-wars-2-database-api-request-thread/
There are some useful info that the gw2db data has that are not exposed in ArenaNet’s api at the moment and vice versa. But we have requested for them in the API suggestion thread. Gw2spidy uses the gw2db data too.
(edited by DarkSpirit.7046)
I have updated my enums above as best as I can with the current schema from the items api shown here:
http://wiki.guildwars2.com/wiki/API/item_details
There are still some confusion with the subtypes because the items api returns strings while the TP api returns integer ids. Plus the fact that there are existing bugs surrounding the TP search filters so items may not have been listed correctly on the TP at the moment. However, in the context of the TP, they should not matter since the items in the new enums, returned by the items api, are bounded and are not able to be traded in the TP.
If my enum value is spelled differently as the strings returned from the items api, I have indicated those through the EnumMember attribute.
(edited by DarkSpirit.7046)
Please update this thread with your suggestions:
Missing a weapon subtype enum, “TwoHandedToy”.
One and only one item seems to have a strange restriction value of [Guardian, Warrior]. Item id 17012, Rabid Reinforced Scale Helm.
https://api.guildwars2.com/v1/item_details.json?item_id=17012
The rest of items only have restrictions across races (i.e. Asura, Charr, Human, Norn, or Sylvari).
(edited by DarkSpirit.7046)
Cheers and thanks!
It is bit different format thou (JSON array, versus JSON object with id-keys) – could we agree of dump format? Either one is okay, but consistency is best.
I prefer a JSON array but I am probably biased. The reason being that the ingredients in a recipe is also exposed as a JSON array and since my code needs to calculate the minimum crafting cost of a recipe, I would convert the ingredients array to be an array of recipes recursively. It makes sense to work with a JSON array of recipes with a JSON array of recipes within each recipe element as ingredients.
Another reason is that gw2db also exposes its items and recipes as a JSON array. Putting ArenaNet’s data in a JSON array this way makes it easier for developers to transition their code from one JSON database into the other.
That said, it may seem better, at first, to expose them as JSON objects with their recipe_id/item_id as keys so we can deserialize them into a dictionary for a faster lookup. But since the ids are almost in running order, it probably wouldn’t matter much if they are deserialized into an array and we use the normalized ids as array indices.
(edited by DarkSpirit.7046)
I have downloaded the full list of item and recipe details in here:
https://www.dropbox.com/sh/zucn218fhneva3c/-MjOkUsTtI
I have combined the detail records into a JSON array and validated them. Note that these files have to be in unicode format to preserve the unicode strings for some of the item names.
(edited by DarkSpirit.7046)
The TP API with buy/sell functionality would have to be implemented and given/sold by ArenaNet as nobody in their right state of mind should trust a 3rd party with something like that (and Anet would never give control over such a significant thing to the masses). The most we could get out of this would be a “view” function to see your buy/sell orders and search the TP.
It seems like a great way to monetize GW2 a bit more. Paying some small sum to be able to trade 24/7? It’s a no-brainer for traders.
They have plans for OAuth2 authentication and developers would need to be registered in order to use the api. You would only be able to access the api through your developer key and there is a set quota. I will not be surprised if one day, ArenaNet decides to charge an annual fee for developer registration like what Apple and Microsoft already do. These fees would propagate to the users when developers sell their apps through the mobile store.
The point I was trying to make is that people will download binaries simply because they don’t know any better. If you’re not making software that “works” you’re not making useful software, and to the average user source code doesn’t “work” — binaries do. It wasn’t an accusation. You’re right about signing, of course, but I’m not sure that’s an option in cases like these.
It is an option if the developer pays for it, but I don’t expect most developers to do so. Alternatively, the developer can post the PGP signature or MD5 hashes on to a secure website, although the user would need to be technical enough to use the right verification tools. Of course, the developer would also need to ensure that his own PC is clean and I would advise against distributing an autoit EXE as it is notorious for trojans. It should be obvious by now why I dislike distributing unsigned EXEs.
Most browsers would warn the user if they attempt to download an unsigned EXE. It is up to the user to make sound decisions to secure his own computer.
(edited by DarkSpirit.7046)
It’s always easy to say: hey, it’s open source, just go and read the code.
We both know that an average user of such a program won’t ever read the source because he won’t understand it anyway – he just downloads and executes it and the damage is done.Then an average user shouldn’t be downloading EXE binaries from an untrusted source in the first place. If the user still chooses to take the risk then that becomes his responsibility.
You can no more expect users to not download binaries than read, not to mention understand, source code, but releasing source code is the closest anyone can come to vouching for their software. If you don’t have the technical knowledge to compile code on your own you’re stuck with having to trust pre-compiled binaries.
The responsibility here is with virus checkers not automatically blacklisting executables like these. I note that MSE does not complain about the file in question.
Nobody said we expect average users to read source code. I only said average users should NOT be downloading EXEs from untrusted sources period. If users refuse to listen to sound advice and insists on taking that risk then do it at their own peril.
Personally, I would never want to distribute my EXEs, unless I digitally signed them or I do it through the mobile store. This is why I usually share my code to public domains as small javascripts so that even less technical users can run them. Otherwise it is using entities like GitHub and users would have to be technical enough to compile and run that code.
(edited by DarkSpirit.7046)