• Activity
  • Votes
  • Comments
  • New
  • All activity
    1. Removing or editing "Exemplary" labels?

      Might it be useful for our Exemplary (and I imagine Malice) labels to be removable or editable? I recently added an Exemplary label with a description that was a bit more "fuck that other guy!"...

      Might it be useful for our Exemplary (and I imagine Malice) labels to be removable or editable? I recently added an Exemplary label with a description that was a bit more "fuck that other guy!" than I would've liked, and despite it not being publicly visible, I still felt the need to in some way correct my mistake to not drag the other user into my hostility, but there's no option to do so. If we can't remove the labels because users shouldn't be juggling the timer or something, I get that, but editing seems like a good (yet low-priority) thing to implement.

      I can't recall this being explicitly outlined anywhere when labels were being introduced, sorry if I've forgotten something. Knowing me, I probably argued against it somewhere :P

      16 votes
    2. Apollo 11 is phenomenal, and gave me an existential crisis

      Apollo 11 is a limited IMAX only engagement, at least for now, and I don't know how long it'll be in theaters. But while it is, I implore everyone to go see it.This movie left me speechless, and...

      Apollo 11 is a limited IMAX only engagement, at least for now, and I don't know how long it'll be in theaters. But while it is, I implore everyone to go see it.This movie left me speechless, and not just in the sense of the footage being so incredible as to leave me without words, though that's certainly a factor. It's restored footage and audio of the Apollo 11 mission, for anyone that doesn't know, and it covers the launch, moon landing, and re-entry.

      It's so easy for historical events to be looked back on and be seen as just that: events. Like a natural disaster or the existence of a waterfall or a canyon, so many battles, inventions, and human triumphs are stripped of humanity, remembered only as things that happened, not things people did. Apollo 11 has staggering to witness footage, yes, but it weaves that footage together with the human moments wonderfully. The scenes of the launch countdown or the lander making its descent are intercut and splitscreened with the footage of the NASA control centers, with names of all the teams, as audio of their conversations with the astronauts and recaps of what has happened and is going to play over the incredibly restored launch footage. Cuts to the crowd overlooking the Apollo 11 launch are also common in the beginning.

      This is not an educational video, one to be seen for great understanding of the finer details of the mission. Apollo 11 instead acts as history in motion, with a perspective to the individuals and the event simultaneously. It's about the people that accomplished the amazing things you see. A display of the triumph of human spirit over the perceived rules of the world and the desire for understanding out world and breaking the limits that we thought were imposed on us. And yet, we as the viewers have a perspective that the people who actually accomplished the great things we see never did. The splitscreening helps to assign human beings to the awe inspiring footage in front of the viewer, yes, but at the same time it offers 2 entirely separated perspectives framed as one, one that the human beings being assigned to the footage never truly experienced in the moment. We have an intimate view of the control center with a simultaneous omnipotent-esque view of the mission in all of its glory. The viewer as the omnipotent being is true of most films to some degree, but the way in which the movie frames its central event, small and big at the same time, really highlights an omnipresent view that even those who lived through the launch never experienced in real time. It's a film of contrast between the individuals and the accomplishment of the collective, but in its control center voiceovers and constant splitscreens, it's really a movie that bridges the two contrasts.

      Basically, I loved it in ways that, despite my extensive best efforts, I find difficult to describe. This line sounds corny, I know, but you owe it to yourself to see it on the biggest screen that you can, and I implore everyone to try to make time for it and find a true IMAX showing, if possible. The visuals alone may not have been the biggest thing that awed me, but they were certainly a huge part of it. And for anyone that's also seen it, what'd you think? I'd love to see other perspectives on this doc.

      11 votes
    3. Things to consider with visual novels

      Not sure if this the right place to post this but here goes... I'm writing a story and I'm trying to figure out the best medium to tell it. I'm strongly leaning toward visual novels. I like anime...

      Not sure if this the right place to post this but here goes... I'm writing a story and I'm trying to figure out the best medium to tell it. I'm strongly leaning toward visual novels. I like anime and I want the story to have a similar look and feel. Maybe someday it will even become an anime. Who knows?

      That said, does anyone here have any thoughts on the pros/cons of taking the visual novel approach as opposed to a traditional novel or light novel?

      7 votes
    4. Tilderinoes with mental health issues: do you feel like happiness is impossible?

      By “happiness” I don't mean “the place where happy people are happy all the time”, but rather “the absence of persisting suffering”. For some context, I've been suffering from clinical depression...

      By “happiness” I don't mean “the place where happy people are happy all the time”, but rather “the absence of persisting suffering”.

      For some context, I've been suffering from clinical depression for over nine years now. Maybe more. I've been hurt by other people many times in my life, especially in childhood and during school. I have almost never felt connected to another human being, and the older I get, the harder it gets to get any kind of intimacy. I feel like “I'm a creep and I'm a weirdo” regularly, as if my teen angst has never left me. On a good day I will merely be tired, and I think I don't need to describe a bad day.

      Recently I've been discovering interesting approaches to therapy and using awareness to “pull yourself by the boot straps”, but whenever the time comes to actually use them in practice, a very real question: “Why should I do it? Happiness is impossible, I will always be what I am, so why go through additional pain of trying to change anything when the result isn't guaranteed?”.

      So the question is: how do you answer this (loaded) question? How do you get back your faith in better future for yourself when you have so little experience actually being better? Can you actually do that?

      34 votes
    5. Why open source projects don't charge (while keeping the code open)?

      I'd gladly pay a reasonable price for professional packages/support for programs like Emacs/Melpa, Debian, and Xfce. As a user, I empathize with the complaints by developers that are constantly...

      I'd gladly pay a reasonable price for professional packages/support for programs like Emacs/Melpa, Debian, and Xfce. As a user, I empathize with the complaints by developers that are constantly overworked. Even if this doesn't generate enough money to pay for everything, it might be enough to hire someone to handle the issues and communities, something that clearly drains their efforts, especially because programmers tend to prefer technical challenges rather than dealing with people.

      I understand that many projects accept donations, but I think providing an actual reward (even if its something minimal, like an updated package instead of having to build it from source) might be a good way to get resources and avoid developer burndown.

      11 votes
    6. This Week's Releases 01/03 - Solange, Pond, 2-Chainz and more.

      Releases of the week 23/02/2019 - 01/03/2019 Featured Release Solange - When I Get Home (Neo-Soul, Alternative R&B) Solange has unveiled her new album, When I Get Home. Spanning 19 tracks, it...

      Releases of the week 23/02/2019 - 01/03/2019


      Featured Release

      Solange - When I Get Home (Neo-Soul, Alternative R&B)

      Solange has unveiled her new album, When I Get Home. Spanning 19 tracks, it marks Solange’s fourth album to date and serves as the follow-up to her 2016 opus, A Seat at the Table.
      When I Get Home was written, performed, and executive produced by Solange herself, but she was hardly in the studio. Among the album’s many contributors were Earl Sweatshirt, Panda Bear, Tyler the Creator, Blood Orange’s Dev Hynes, Sampha, Pharrell Williams, Gucci Mane, Playboi Carti, Raphael Saadiq, Metro Boomin, The-Dream, Cassie, Abra, and The Internet’s Steve Lacy.
      “Y’all! I’m filled w so much joy right now!!! Wow! I can’t thank y’all enough for this moment and for all the feelings i feel in my body!” Solange wrote in a tweet. “I’m bringing home w me everywhere I go yalll and I ain’t running from shit no more. Your love lifts me up so high. Thank you!”

      Source: Consequence of Sound

      Listen to single

      Stream

      Other Notable Relases

      Pond - Tasmania (Neo-Psychedelia, Psychedelic Pop)

      Listen to single
      Stream

      2 Chainz - Rap or Go to the League (Trap Rap, Southern Hip Hop)

      Listen to single
      Stream

      Sun Kil Moon - I Also Want To Die In New Orleans (Contemporary Folk, Spoken Word)

      Listen to single
      Stream

      T-Pain - 1UP (Alternative R&B, Trap Rap)

      Listen to single
      Stream

      Feel free to discuss or feature any and all other releases in the comments below

      Discussion Points

      Have you listened to any of these releases?
      What are your thoughts?
      What are you looking forward to listen to?
      What have you enjoyed from these artists in the past?

      // All feedback on this format welcome.

      7 votes
    7. MLS Week 1: All Match Discussions

      A list of matches for the week: Toronto FC @ Philadelphia Union New York City FC @ Orlando City FC New York Red Bulls @ Columbus Crew New England Revolution @ FC Dallas Real Salt Lake @ Houston...

      A list of matches for the week:

      Toronto FC @ Philadelphia Union
      New York City FC @ Orlando City FC
      New York Red Bulls @ Columbus Crew
      New England Revolution @ FC Dallas
      Real Salt Lake @ Houston Dynamo
      Portland Timbers @ Colorado Rapids
      Minnesota United FC @ Vancouver Whitecaps
      Chicago Fire @ LA Galaxy
      FC Cincinnati @ Seattle Sounders
      Montreal Impact @ San Jose Earthquakes
      Atlanta United FC @ DC United
      Sporting Kansas City @ Los Angeles FC

      9 votes
    8. I want an emulation box for my TV. What options best fit my needs?

      Note: I wasn't sure whether to post this in ~games or ~tech, so if it needs to be moved, feel free to put it where it belongs! I've been playing my Playstation Classic a lot, and it's made me want...

      Note: I wasn't sure whether to post this in ~games or ~tech, so if it needs to be moved, feel free to put it where it belongs!

      I've been playing my Playstation Classic a lot, and it's made me want to setup a full emulation box for my TV. I started looking into options and quickly got in over my head, so I'm hoping you fine folks can help me sort this out.

      Caveat: I am somewhat techy, but not nearly to the same level as the average Tildes user.

      Here is a rundown for what I'm going for:

      • Systems: I want to be able to emulate up through the Dreamcast with no slowdown (or, at least, no slowdown as a result of my hardware--if it's natural to the original console or a limitation of the emulator, that's fine).

      • Input: I want to use a wireless controller for input. Ideally six face buttons and four shoulders, so that it can easily stand in for almost all common controller layouts.

      • Graphics: If possible, I'd like to be able to enhance the eye candy a bit with things like upscaling, increasing the internal resolution, and shaders. This would be nice to have, but is not a necessity. Running at fullspeed in the original with no enhancements is the target minimum, though.

      • Footprint: Something up to the size of, well, a retro game console. I don't want a full PC next to my TV, but it doesn't have to be the size of a credit card either.

      • Budget: Let's go with under $400 USD? Given the cost of a Raspberry Pi that seems like overkill, but I know the Pi can't do all the way up to N64/Dreamcast, and I'm not sure how much more power those need. That price limit is flexible if I'm being unreasonable with my expectations.

      With all that in mind, here are my questions:

      1. What hardware best suits my needs? I am not interested in building my own and am seeking pre-built solutions.

      2. What controller is best? I'd prefer to have a one-size-fits-all solution, rather than swapping them out. Six face buttons would help make the Genesis, Saturn, and N64 feel more natural, but I suspect that might be hard to come by?

      3. It looks like Retroarch is definitely the way to go for easy setup, but there seem to be a lot of different standalone options (e.g. Lakka, RetroPie, Recalbox). Which one should I go with? I should add that I really only care about ease of use and simplicity. I do not need something flashy, and the less friction in both setup and use, the better.

      4. Any other tips, pieces of advice, or resources? I don't have a lot of experience with emulation, so a lot of this is uncharted territory for me, hence my uncertainty and need for guidance.

      11 votes
    9. Code Quality Tip: Cyclomatic complexity in depth.

      Preface Recently I briefly touched on the subject of cyclomatic complexity. This is an important concept for any programmer to understand and think about as they write their code. In order to...

      Preface

      Recently I briefly touched on the subject of cyclomatic complexity. This is an important concept for any programmer to understand and think about as they write their code. In order to provide a more solid understanding of the subject, however, I feel that I need to address the topic more thoroughly with a more practical example.


      What is cyclomatic complexity?

      The concept of "cyclomatic complexity" is simple: the more conditional branching and looping in your code, the more complex--and therefore the more difficult to maintain--that code is. We can visualize this complexity by drawing a diagram that illustrates the flow of logic in our program. For example, let's take the following toy example of a user login attempt:

      <?php
      
      $login_data = getLoginCredentialsFromInput();
      
      $login_succeeded = false;
      $error = '';
      if(usernameExists($login_data['username'])) {
          $user = getUser($login_data['username']);
          
          if(!isDeleted($user)) {
              if(!isBanned($user)) {
                  if(!loginRateLimitReached($user)) {
                      if(passwordMatches($user, $login_data['password'])) {
                          loginUser($user);
                          $login_succeeded = true;
                      } else {
                          $error = getBadPasswordError();
                          logBadLoginAttempt();
                      }
                  } else {
                      $error = getLoginRateLimitError($user);
                  }
              } else {
                  $error = getUserBannedError($user);
              }
          } else {
              $error = getUserDeletedError($user);
          }
      } else {
          $error = getBadUsernameError($login_data['username']);
      }
      
      if($login_succeeded) {
          sendSuccessResponse();
      } else {
          sendErrorResponse($error);
      }
      
      ?>
      

      A diagram for this logic might look something like this:

      +-----------------+
      |                 |
      |  Program Start  |
      |                 |
      +--------+--------+
               |
               |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |    Username     +--->+    Set Error    +--+
      |    Exists?      | No |                 |  |
      |                 |    +-----------------+  |
      +--------+--------+                         |
               |                                  |
           Yes |                                  |
               v                                  |
      +--------+--------+    +-----------------+  |
      |                 |    |                 |  |
      |  User Deleted?  +--->+    Set Error    +->+
      |                 | Yes|                 |  |
      +--------+--------+    +-----------------+  |
               |                                  |
            No |                                  |
               v                                  |
      +--------+--------+    +-----------------+  |
      |                 |    |                 |  |
      |  User Banned?   +--->+    Set Error    +->+
      |                 | Yes|                 |  |
      +--------+--------+    +-----------------+  |
               |                                  |
            No |                                  |
               v                                  |
      +--------+--------+    +-----------------+  |
      |                 |    |                 |  |
      |   Login Rate    +--->+    Set Error    +->+
      | Limit Reached?  | Yes|                 |  |
      |                 |    +-----------------+  |
      +--------+--------+                         |
               |                                  |
            No |                                  |
               v                                  |
      +--------+--------+    +-----------------+  |
      |                 |    |                 |  |
      |Password Matches?+--->+    Set Error    +->+
      |                 | No |                 |  |
      +--------+--------+    +-----------------+  |
               |                                  |
           Yes |                                  |
               v                                  |
      +--------+--------+    +----------+         |
      |                 |    |          |         |
      |   Login User    +--->+ Converge +<--------+
      |                 |    |          |
      +-----------------+    +---+------+
                                 |
                                 |
               +-----------------+
               |
               v
      +--------+--------+
      |                 |
      |   Succeeded?    +-------------+
      |                 | No          |
      +--------+--------+             |
               |                      |
           Yes |                      |
               v                      v
      +--------+--------+    +--------+--------+
      |                 |    |                 |
      |  Send Success   |    |   Send Error    |
      |    Message      |    |    Message      |
      |                 |    |                 |
      +-----------------+    +-----------------+
      

      It's important to note that between nodes in this directed graph, you can find certain enclosed regions being formed. Specifically, each conditional branch that converges back into the main line of execution generates an additional region. The number of these distinct enclosed regions is directly proportional to the level of cyclomatic complexity of the system--that is, more regions means more complicated code.


      Clocking out early.

      There's an important piece of information I noted when describing the above example:

      . . . each conditional branch that converges back into the main line of execution generates an additional region.

      The above example is made complex largely due to an attempt to create a single exit point at the end of the program logic, causing these conditional branches to converge and thus generate the additional enclosed regions within our diagram.

      But what if we stopped trying to converge back into the main line of execution? What if, instead, we decided to interrupt the program execution as soon as we encountered an error? Our code might look something like this:

      <?php
      
      $login_data = getLoginCredentialsFromInput();
      
      if(!usernameExists($login_data['username'])) {
          sendErrorResponse(getBadUsernameError($login_data['username']));
          return;
      }
      
      $user = getUser($login_data['username']);
      if(isDeleted($user)) {
          sendErrorResponse(getUserDeletedError($user));
          return;
      }
      
      if(isBanned($user)) {
          sendErrorResponse(getUserBannedError($user));
          return;
      }
      
      if(loginRateLimitReached($user)) {
          logBadLoginAttempt($user);
          sendErrorResponse(getLoginRateLimitError($user));
          return;
      }
      
      if(!passwordMatches($user, $login_data['password'])) {
          logBadLoginAttempt($user);
          sendErrorResponse(getBadPasswordError());
          return;
      }
      
      loginUser($user);
      sendSuccessResponse();
      
      ?>
      

      Before we've even constructed a diagram for this logic, we can already see just how much simpler this logic is. We don't need to traverse a tree of if statements to determine which error message has priority to be sent out, we don't need to attempt to follow indentation levels, and our behavior on success is right at the very end and at the lowest level of indentation, where it's easily and obviously located at a glance.

      Now, however, let's verify this reduction in complexity by examining the associated diagram:

      +-----------------+
      |                 |
      |  Program Start  |
      |                 |
      +--------+--------+
               |
               |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |    Username     +--->+   Send Error    |
      |    Exists?      | No |    Message      |
      |                 |    |                 |
      +--------+--------+    +-----------------+
               |
           Yes |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |  User Deleted?  +--->+   Send Error    |
      |                 | Yes|    Message      |
      +--------+--------+    |                 |
               |             +-----------------+
            No |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |  User Banned?   +--->+   Send Error    |
      |                 | Yes|    Message      |
      +--------+--------+    |                 |
               |             +-----------------+
            No |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |   Login Rate    +--->+   Send Error    |
      | Limit Reached?  | Yes|    Message      |
      |                 |    |                 |
      +--------+--------+    +-----------------+
               |
            No |
               v
      +--------+--------+    +-----------------+
      |                 |    |                 |
      |Password Matches?+--->+   Send Error    |
      |                 | No |    Message      |
      +--------+--------+    |                 |
               |             +-----------------+
           Yes |
               v
      +--------+--------+
      |                 |
      |   Login User    |
      |                 |
      +--------+--------+
               |
               |
               v
      +--------+--------+
      |                 |
      |  Send Success   |
      |    Message      |
      |                 |
      +-----------------+
      

      Something should immediately stand out here: there are no enclosed regions in this diagram! Furthermore, even our new diagram is much simpler to follow than the old one was.


      Reality is rarely simple.

      The above is a really forgiving example. It has no loops, and loops are going to create enclosed regions that can't be broken apart so easily; it has no conditional branches that are so tightly coupled with the main path of execution that they can't be broken up; and the scope of functionality and side effects are minimal. Sometimes you can't break those regions up. So what do we do when we inevitably encounter these cases?

      High cyclomatic complexity in your program as a whole is inevitable for sufficiently large projects, especially in a production environment, and your efforts to reduce it can only go so far. In fact, I don't recommend trying to remove all or even most instances of cyclomatic complexity at all--instead, you should just be keeping the concept in mind to determine whether or not a function, method, class, module, or other component of your system is accumulating technical debt and therefore in need of refactoring.

      At this point, astute readers might ask, "How does refactoring help if the cyclomatic complexity doesn't actually go away?", and this is a valid concern. The answer to that is simple, however: we're hiding complexity behind abstractions.

      To test this, let's forget about cyclomatic complexity for a moment and instead focus on simplifying the refactored version of our toy example using abstraction:

      <?php
      
      function handleLoginAttempt($login_data) {
          if(!usernameExists($login_data['username'])) {
              sendErrorResponse(getBadUsernameError($login_data['username']));
              return;
          }
      
          $user = getUser($login_data['username']);
          if(isDeleted($user)) {
              sendErrorResponse(getUserDeletedError($user));
              return;
          }
      
          if(isBanned($user)) {
              sendErrorResponse(getUserBannedError($user));
              return;
          }
      
          if(loginRateLimitReached($user)) {
              logBadLoginAttempt($user);
              sendErrorResponse(getLoginRateLimitError($user));
              return;
          }
      
          if(!passwordMatches($user, $login_data['password'])) {
              logBadLoginAttempt($user);
              sendErrorResponse(getBadPasswordError());
              return;
          }
      
          loginUser($user);
          sendSuccessResponse();
      }
      
      $login_data = getLoginCredentialsFromInput();
      
      handleLoginAttempt($login_data);
      
      ?>
      

      The code above is functionally identical to our refactored example from earlier, but has an additional abstraction via a function. Now we can diagram this higher-level abstraction as follows:

      +-----------------+
      |                 |
      |  Program Start  |
      |                 |
      +--------+--------+
               |
               |
               v
      +--------+--------+
      |                 |
      |  Attempt Login  |
      |                 |
      +-----------------+
      

      This is, of course, a pretty extreme example, but this is how we handle thinking about complex program logic. We abstract it down to the barest basics so that we can visualize, in its simplest form, what the program is supposed to do. We don't actually care about the implementation unless we're digging into that specific part of the system, because otherwise we would be so bogged down by the details that we wouldn't be able to reason about what our program is supposed to do.

      Likewise, we can use these abstractions to hide away the cyclomatic complexity underlying different components of our software. This keeps everything clean and clutter-free in our head. And the more we do to keep our smaller components simple and easy to think about, the easier the larger components are to deal with, no matter how much cyclomatic complexity all of those components share as a collective.


      Final Thoughts

      Cyclomatic complexity isn't a bad thing to have in your code. The concept itself is only intended to be used as one of many tools to assess when your code is accumulating too much technical debt. It's a warning sign that you may need to change something, nothing more. But it's an incredibly useful tool to have available to you and you should get comfortable using it.

      As a general rule of thumb, you can usually just take a glance at your code and assess whether or not there's too much cyclomatic complexity in a component by looking for either of the following:

      • Too many loops and/or conditional statements nested within each other, i.e. you have a lot of indentation.
      • Many loops in the same function/method.

      It's not a perfect rule of thumb, but it's useful for at least 90% of your development needs, and there will inevitably be cases where you will prefer to accept some greater cyclomatic complexity because there is some benefit that makes it a better trade-off. Making that judgment is up to you as a developer.

      As always, I'm more than willing to listen to feedback and answer any questions!

      25 votes