Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 11/30/16 in Blog Entries

  1. 3 points
    A new forum update is coming soon, and one of the features I'm hyped for are Reactions. We already have post liking, but sometimes a "like" just isn't specific enough. From the IPS Community website: We have the ability to create custom reactions, so if you have any requests for reactions, let us know in the comments!
  2. 2 points
    [Edit] If anyone is reading this after the fact, clubs can be found here. A new forum update is coming soon, and one of the features I'm hyped for are Clubs. Clubs are sub-communities where you can discuss various topics that you define. Users From the IPS Community website: Access Levels Content Each club can have their own forums, download categories, blogs, and calendars. Index Forums Club owners can add forums where members can create topics. Club leaders and club moderators have control over these forums and can pin, lock, move, merge, and hide threads in these forums. These screenshots depict a single forum "Topics". Blogs Project Pokémon recently got Blogs. With clubs, you can create a blog managed by the club leaders and club moderators. Downloads Clubs can also have files, similar to our downloads section. Calendars And finally, the calendar. And who knows? Maybe there'll be something else in there too
  3. 2 points
    At the company at which I work, we have this legacy application written in C#. (It's different from the one written in Classic ASP.) Let's call this the dragon. It's old, it's previously defeated many brave knights, and its name is an acronym that shares a letter or two with the word "dragon". The dragon is responsible for breathing fire to defend the village from intruders. (It uses coding and algorithms to do Things to Products because of business logic. While the details aren't important, I doubt I could say what it does beyond giving a brief overview of what it looks like to an outside observer.) However, the dragon also has this habit of attacking the knights who control it, so we need a new village gaurdian (the dragon is composed mostly of spaghetti code, and if we are ever to replace it, we need to understand how the spaghetti works). And so, a week or two ago I undertook a challenging task: to shrink the dragon so it'll fear the knights again (to refactor things to make it more readable). Armed with a mouse, keyboard, and the support of a fellow knight (a coworker who's dealt with this application before), I got to work so I could deal a mighty blow to the dragon. (Disclaimer: this post contains a lot of technical C# stuff that can't all be hidden behind dragon metaphores. Hopefully anyone who's not a programmer can still follow.) On my journey of code cleanup, the dragon presented many obstacles. A lot of it was superfluous spacing, redundant comments, and generally painful code, like so: //// //// Configure processing /// this.ConfigureProcessing(); //// //// Do the thing //// try { this.DoTheThing(); } catch { // eat it } if (this.SomeProperty == SomeValue) { // throw new SomeKindOfException(); // this was commented out // to-do: figure out why this was commented out } To make it even better, this.ConfigureProcessing does nothing and is referenced nowhere else, meaning we can easily remove most of the above. Also you should never ever ever ever ever catch an exception without handling it somehow. It will cause pain further down the line (but not in this blog post). If nothing else, log it somehow. Taking all of that into consideration, I reduced that code to this: try { this.DoTheThing(); } catch (Exception ex) { Trace.WriteLine($"Got an exception in TheType.TheFunction: {ex.ToString()}"); } There were also some things outside of general cleanup that I did. Imagine a class like this: public abstract class Magic : IAlgorithm { private string spellName = "Alakazam"; public string SpellName { get { return spellName; } set { if (value == null) { throw new ArgumentException("SpellName can't be null"); } spellName = value; } } private IWizard wizard = null; public IWizard Wizard { get { return wizard; } private set { if (value == null) { throw new ArgumentException("Wizard can't be null"); } wizard = value; } } #region IAlgorithm Methods public void SetWizard(string wizard) { this.Wizard = wizard; } public void Cast() { if (this.Wizard == null) { throw new Exception("Cannot call Execute before SetWizard"); } this.PerformMagic(); } #endregion protected abstract void PerformMagic(); } Not shown: 20 or more classes that inherit from this My fellow adventurer made the observation that the only times SetWizard was called was right after constructors of child classes, kinda like this: public Magic GetMagicInstance(string magicType, string spell, IWizard wizard) { Magic magic = null; switch (magicType) { case "white": magic = new WhiteMagic() { Spell = spell }; magic.SetWizard(wizard); case "black": magic = new BlackMagic() { Spell = spell }; magic.SetWizard(wizard); case "lost": LostMagic magic = new LostMagic() { Spell = spell }; magic.SetWizard(wizard); } return magic; } // Somewhere else calls magic.Cast after all instances of Magic have been created So using this knowledge and the knowledge of new C# features, we made the appropriate changes everywhere to make the class (and related classes) look like this: public abstract class Magic : IAlgorithm { public Magic(string spellName, string wizard) { SpellName = SpellName ?? "Alakazam"; Wizard = wizard ?? throw new ArgumentNullException(nameof(wizard)); } public string SpellName { get; } public IWizard Wizard { get; } #region IAlgorithm Methods public abstract void Cast(); #endregion } They say that if it bleeds, you can kill it. The dragon was certainly bleeding, if the code review tool was anything to go by: there were red lines (removals) all over the place in the pull request (Git terminology basically meaning we're publishing our changes). Two other knights in our party came to inspect our triumph (they reviewed the code to make sure it was done right). When it was all over, a total of 4 people (2 of us were involved in the refactoring) thoroughly reviewed everything and approved. Then we released the changes to be applied to the dragon down in the village (along with some other minor quality-of-life changes). About a week later*, one of the villagers called for help because the dragon that's supposed to defend the village was unable to breathe as much fire (a user opened a support ticket because the Things being done to Products weren't being done correctly). I was skeptical that any of my changes would have that effect. After all, when I shrunk the dragon, I made sure to quintuple-check my changes before releasing it to make sure its fire breath was as unchanged. So I investigated for a few hours to find out why. I ruled out places that could have been affected and was thoroughly stumped. That's when my fellow party member used his influence with the king to learn the secrets known only to the villagers (he used his higher permissions to debug the application, reading data from the production database). That's when I spotted the issue. Remember that constructor in the Magic class that was created? Take another look at the SpellName assignment: SpellName = SpellName ?? "Alakazam"; That should be: SpellName = spellName ?? "Alakazam"; In C#, variables are case-sensitive, so the property was being assigned to itself, and all Magic classes (WhiteMagic, BlackMagic, LostMagic, etc.) all only used the Alakazam spell. No wonder the flames were weak! We fixed the issue, and gave the villagers a dragon capable of properly defending them, and spent the rest of the day identifying how many intruders snuck into the village while the dragon was powerless to stop them (we had to find out which Products didn't have the Thing done properly). Conclusion Case sensitivity can potentially lead to a lot of pain and suffering. In this case with the constructor, that's standard practice in C#, and it's perfectly understandable that no one caught that one mistake, especially since it's just one letter in commit full of thousands of other changes. The tooling didn't catch it, because it checks for useless assignments. This wasn't useless, it says "make SpellName be Alakazam if it's null". Always be careful of casing when variable names are similar. * I massively simplified a lot of things. While a week is probably a bit long to go without noticing anything wrong, there's reasons. Also it didn't affect everything, because it just broke some hacks that are there because business logic.
  4. 2 points
    A new forum update is coming soon, and one of the features I'm looking forward to is Device Management. This makes it more difficult for others to gain unauthorized access to your account. From the IPS Community website:
  5. 1 point
    Hola todos (Hello everyone) hoy (today) os enseñare los colores en español (i want to show you the colors in spanish lenguage) Empecemos (lets begin) Red -> Rojo Blue -> Azul Green -> Verde Orange -> Naranja (this word its used for fruit too like in english) Brown -> Marron Black -> Negro Pink -> Rosa (Rosa its too for a flower and female name) White -> Blanco Amarillo -> Yellow Purple -> Morado Navy Blue -> Azul marino Grey -> Gris Esto es todo amigos (Thats all guys) Gracias por ver (Thanks for watching)
  6. 1 point
    It was with the generation I started that I was inexperienced young and that led me to have a team and a little knowledge of the weaknesses. I started learning the 151 pokemons what made me more excited was the leader's battles since they put my skills to the test, I felt very small, I even captured them all, exchanging my hobbies back then with my relatives i finished the league at 62 hours of play with a team of level 80 as I liked to raise levels did not pose any problem I do not remember what my team was but my water starter had pidgeot and had a machoke and others which were repeated When I came to capture Mewtwo, it was then that I suffered what was mine in my own flesh. I was left without poke balls i have blue and yellow on my own
  7. 1 point
    Yeah i have memories in this game and gale of darkness first of all i begin how i played this games i dont know its casuality or destiny or pure luck many years ago my father met someone (same person take choice for obtain gba and pokemon games or game cube with 4 games) temporary period of time game is in my own the game are (mario kart double dash mario party 4 pokemon colosseum and pokemon XD) i recognize i dont began i new game because because exists another and its in begining (he said recently tested this game but he dont make more progress) in that case i began my adventure with my starters (espeon and umbreon dont bad remenber) the rest of team are unknow because i dont remenber but i remenber captured feraligart and transferred in my sapphire the game overall its amazing and this games are difficult because its not for all type of players the trainers and plot events are difficult but no worries the tutorials in this games for how capture and certain things are pretent because dont forget newcomers began in this game team i love so much team cypher and orre region in general are amazing this game have content for dont make bored have something like battle tower the characters gameplay and graphics its good combibation and hope the 8th from switch make me feel the times of pokemon stadium or battle revolution
  8. 1 point
    This day its everything and the same time its nothing finally i approved everything and almost i have title of vocational studies that means i can work in every place related with my studies i cant believe the previous day of this day everything its negative but today recieve good new i approved the last one and i can enjoy this summer properly without problem finally its like finally i beat this game its amazing how time passed and since 2012 everyday everytime i tried do the best but this is the day for tell dude you are awarded because you work so hard i dont want forget this moment because its like when naruto its a hokage i dont know how explain its something realizes as person this year i make heroic things than average person are impossible but i m capable for make possible impossible things good summer everyone
  9. 1 point
    What do u like the most please tell me Mario or Lugi i prefer Mario because he is a really good character to play with and that i also think that Lugi is a weird character to play and that i do not like him that much i am not that interested in him
  10. 1 point
    Today I learned about a feature in our new Gallery app: notes. The feature is best described using pictures. One of the old Project Pokémon banners I had lying around, uploaded to a private album When your mouse is in the giant dark-gray area, there's some buttons. One of them is the Add Note button. The Add Note Button Clicking the Add Note button adds a transparent, resizable, and movable rectangle to the image, which comes with a text box that lets you add text. Once notes are added, they can be read by mousing over the image.
  11. 1 point
    By night and by weekend I'm an admin here at Project Pokémon (when I'm not busy saving Hyrule or doing other stuff). But by day, I'm a software developer for a certain company. This company has an internal legacy system written in Classic ASP (a really old language used to make websites) that we have to maintain, and releasing changes to it is never fun. Today we released a month's worth of changes, far more than we like to release at one time. (We couldn't release because reasons; although, we probably should have added a feature switch. Lesson learned.) Within this legacy system, there's a page that is designed to be printed out. Users will then scan an I2of5 barcode on it with a handheld scanner, making it easier to continue their work. After the updated the system, however, we got reports that the barcodes wouldn't scan anymore. Barcodes that were printed before this update worked fine. We reprinted the barcode that was working, and sure enough, the new release gave a different barcode generated from the same source text. I had my hands all over the page with this barcode, but I know I didn't touch the barcode itself. Thanks to source control, we were able to use git blame and looked at the entire code path responsible for the generation of this I2of5 barcode. This kind of barcode is generated by encoding some text into what looks like garbage, but looks like and scans like a barcode when this garbage is displayed using a particular font. Unfortunately, nothing in that code path has changed for years, and since we released this thing a month ago without any (related) issues, we had to find out what changed. Yet comparing the output of the old and new code showed different barcodes. The new barcode's garbage-looking text had some special characters in it called "replacement characters", which is a special kind of character to indicate something's wrong with the character encoding (more on that in a bit). We inspected the HTTP headers and HTML metadata, and there was no difference, so it wasn't a matter of the web browser interpreting the raw text data incorrectly. So we had to try something else. We used a git bisect (or rather a manual version of it, because of a bunch of branching weirdness - don't ask) and eventually found the exact commit that introduced the issue. The only thing that changed about the page in question is that a new ASP file was included. This ASP file, along with the ones it in turn includes, are simply containers for functions and classes and are not intended to write anything to the page. To debug what was causing the problem we removed parts of this included file until finally there was nothing left. We tried removing the reference to this file altogether, and that made the problem go away. We put it back and made sure the file was empty, and to double check, we removed that file and re-created it to make double sure it was empty. Turns out including an empty text file causes issues with our barcode! What is a text file? It's just a file containing bytes that programs interpret as text. But there's different kinds of text. ASCII text interprets one byte as one character. One byte can have a value from 0-255, and while standard ASCII only has characters for 0-127, extended ASCII has characters for 128-255 too. There's also variants of Unicode, where multiple bytes can be used for a single character, which is useful for characters that aren't found in English. How is a program to know what kind of text is in a text file though? By adding extra bytes to the beginning of the file to indicate the text encoding: the Byte Order Mark (BOM). Using HxD, I found that these "empty" text files weren't in fact empty, they had the BOM bytes to mark the file as UTF-8, which is a variant of Unicode that looks like ASCII until the 128-255 byte value range. By including this "empty" file, we were including the BOM, which changed the character encoding of the entire page, completely changing the meaning of the text that's used to display the barcodes (because it uses extended ASCII characters for some reason). Thankfully, this whole release didn't go as bad as it could have. Because of our Blue/Green deployment setup, we weren't under as much pressure as we could have otherwise been, and we only had to revert to the previous version twice, and the release only took 8 hours (because of testing and debugging other issues*). * Bonus material: when using Powershell to create a virtual application in IIS, note that "userName" is case sensitive in some versions of IIS. In 7.5, it's fine to use "username", but when using 8.5, that case sensitivity will cause setting the application credentials to silently fail. (Not that we encountered a situation exactly like this one or anything.)
  12. 1 point
    A new forum update is coming soon, and one of the features I'm looking forward to is the blog sidebar. Project Pokémon recently got Blogs. They're already your personal corner of the site, and with this, you can customize them even further. From the IPS Community website:
  • Newsletter

    Want to keep up to date with all our latest news and information?
    Sign Up
×
×
  • Create New...