• Activity
  • Votes
  • Comments
  • New
  • All activity
    1. Day 12: Rain Risk

      Today's problem description: https://adventofcode.com/2020/day/12 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/12


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      12 votes
    2. Day 11: Seating System

      Today's problem description: https://adventofcode.com/2020/day/11 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/11


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      13 votes
    3. Day 10: Adapter Array

      Today's problem description: https://adventofcode.com/2020/day/10 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/10


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      14 votes
    4. Day 9: Encoding Error

      Today's problem description: https://adventofcode.com/2020/day/9 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/9


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      11 votes
    5. Day 8: Handheld Halting

      Today's problem description: https://adventofcode.com/2020/day/8 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/8


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      12 votes
    6. Day 7: Handy Haversacks

      Today's problem description: https://adventofcode.com/2020/day/7 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/7


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      12 votes
    7. Day 6: Custom Customs

      Today's problem description: https://adventofcode.com/2020/day/6 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/6


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      10 votes
    8. Day 5: Binary Boarding

      Today's problem description: https://adventofcode.com/2020/day/5 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/5


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      13 votes
    9. Day 4: Passport Processing

      Today's problem description: https://adventofcode.com/2020/day/4 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/4


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      13 votes
    10. Day 3: Toboggan Trajectory

      Today's problem description: https://adventofcode.com/2020/day/3 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/3


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      12 votes
    11. I've created a temporary sub-group for Advent of Code 2020, subscribe if you're interested!

      As we did last year, I've set up a temporary sub-group that we can use for this year's Advent of Code at ~comp.advent_of_code Some discussion and solutions were starting in this thread, but it...

      As we did last year, I've set up a temporary sub-group that we can use for this year's Advent of Code at ~comp.advent_of_code

      Some discussion and solutions were starting in this thread, but it will be easier to organize inside a devoted sub-group, and also makes it simpler for people to both find and avoid the relevant topics.

      If you posted solutions in that topic, please move them into the threads for Day 1 and Day 2.

      I automatically subscribed everyone that commented in or voted on that original topic, as well as everyone that posted a comment in any of last year's topics, but nobody else. So if you're interested in participating in Advent of Code or discussing it, please subscribe to the sub-group. Posts from the sub-group won't be shown to logged-out users by default either, so any logged-out users that want to observe will need to visit the sub-group directly (or you're welcome to email me and request an invite so you can register and subscribe).

      I've also set up scheduled posts to happen automatically as each day's puzzle unlocks.

      25 votes
    12. Day 2: Password Philosophy

      Today's problem description: https://adventofcode.com/2020/day/2 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/2


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      15 votes
    13. Day 1: Report Repair

      Today's problem description: https://adventofcode.com/2020/day/1 Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c. Please post your...

      Today's problem description: https://adventofcode.com/2020/day/1


      Join the Tildes private leaderboard! You can do that on this page, by entering join code 730956-de85ce0c.

      Please post your solutions in your own top-level comment. Here's a template you can copy-paste into your comment to format it nicely, with the code collapsed by default inside an expandable section with syntax highlighting (you can replace python with any of the "short names" listed in this page of supported languages):

      <details>
      <summary>Part 1</summary>
      
      ```python
      Your code here.
      ```
      
      </details>
      
      13 votes
    14. Privacy is a lonely bastion. Anyone know how to meet friends online these days?

      At some point we recognized the signs of desperation. My wife and I had been running to the window like puppies for a glimpse of any unusual traffic. We caught ourselves bingeing on news articles,...

      At some point we recognized the signs of desperation. My wife and I had been running to the window like puppies for a glimpse of any unusual traffic. We caught ourselves bingeing on news articles, as if saturating ourselves with reporting could somehow make us relevant to a world that saw less and less of us. We even resorted to calling my mother. After listening to 90 uninterrupted minutes of narration regarding her most recent routine doctor’s visit, we broke down. We resolved to end the isolation that was slowly killing us. Then the pandemic hit.

      Our biggest stumbling block is figuring out how can we make friends online using only privacy-respecting platforms and software? We would like to see some friendly faces in real time without being simultaneously, you know, mined. Could anyone in the know share suggestions?

      Edit: I'm grateful people are considering this. Thank you! I find it helps to ask people what their ideal solution would be, no matter how far-fetched. So, in response to that: My dream platform/venue/project would meld aspects of Lunchclub with The Human Library. I have stories to tell. I would love to video chat with fully-clothed individuals drawn from all over the world, chosen based on their stories and ambitions. It would work the way a good host does. You know, "Greta once had the job of getting sweat stains out of Bruce Springsteen's guitar strap. You two should swap cleaning stories, since you work at that drycleaner's, right, Butchie? Is it true it's a front for the mob? Oh, excuse me, I have to disinfect the pizza guy. I'll leave you to it." Maybe I should flesh this out more.

      36 votes
    15. Programming Challenge: Over-engineer obfuscation of a mailto link on a hypothetical webpage

      This is a bit of a silly challenge that came to mind when I saw a discussion about obfuscating mailto links on the unofficial Discord server. This challenge is intentionally meant to be ridiculous...

      This is a bit of a silly challenge that came to mind when I saw a discussion about obfuscating mailto links on the unofficial Discord server. This challenge is intentionally meant to be ridiculous and encourages horrendous solutions that should never see the light of day in actual production code.


      Some Background

      On the internet, bots are an incredibly common. They may do anything from crawling through webpages to map out valid links on the web, to spamming forums with links to scam websites. Among some of the less ethical uses of bots is the collection of any email addresses that might be sitting around in a webpage's source code, either made visible to the user or hidden behind some alternative text. These bots collect these email addresses for any number of purposes, including phishing attempts to hijack accounts.

      Commonly, these emails can be found sitting inside of so-called mailto links, which will open your default mail application and pre-populate the recipient's address, preparing you to send a new email in a single click. It's a safe bet that the vast majority of mailto link implementations aren't very sophisticated, simply providing a snippet that looks much like the following:

      <a href="mailto:johnsmith@example.com">Contact Me</a>
      

      Given the above, most bots will likely only ever scrape a webpage for a link containing href="mailto:. A simple form of obfuscation to combat a bot could be to leave the href attribute empty on initial page load, capture the on click event, dump the mailto email address into the href attribute, and finally remove the on click event handler from the link before re-sending the click event.

      We're not here for simple, however.


      Challenge

      As suggested in the title, the challenge is to over-engineer this obfuscation. There is only one hard requirement:

      Clicking the "Contact Me" link should, to the user's perception, function (mostly) identically to a simple mailto link. Specifically, clicking the link should ultimately result in the user's mail application opening (or being prompted to open) with no further input from the user and the "to" field being correctly pre-populated with the intended email address. This means that captchas and the like are not allowed. Delays in triggering the mail application due to processing layers of obfuscation, however, are expected and acceptable (although "until well after the heat death of the universe" is not an acceptable delay, so let's be reasonable).

      Apart from the requirement above, solutions that require increasingly more sophisticated methods of de-obfuscation for a bot to discover your email address are preferred. The more complicated a bot's design would need to be to discover your email address, and the more painful it is for other programmers to see the abomination you've created, the better.

      CSS is not required. A functioning webpage is not required. An entire web server is not required. A full, working web project including a framework with defined routes, security features, a VM provisioning script, and whatever the fuck else you would need is not required. You can build an actual web project around this if you wish, but code snippets and some comments explaining what does what will be more than sufficient.

      11 votes
    16. Addressing topic areas that chronically engender "low quality" discussion

      It is pretty clear there are certain subject areas where the discussion simply never goes well here. This isn't a Tildes thing really. Frankly these topics rarely go well anywhere online but, as...

      It is pretty clear there are certain subject areas where the discussion simply never goes well here. This isn't a Tildes thing really. Frankly these topics rarely go well anywhere online but, as we have aspirations 'round these parts of being more sophisticated than the Reddit rabble, I think it's worth digging into.

      Overall Tildes is a fairly low-activity site, but if I ever see a topic that even tangentially touches on "identarian" issues get past double-digit comments, there will almost surely be an acrimonious exchange inside. I don't want to pretend I'm above this, I've been sucked into these back-and-forths myself as, I think, has almost every regular poster at one time or another. I've largely disengaged from participating in these at this point and mostly just watch from the sidelines now.

      Unlike most of the common complaints with Tildes, I don't think this one will get better as the site grows and diversifies. If anything, I think it's going to end up creating norms and a culture that will bleed over into other controversial topics from tabs/spaces to iOS/Android. To keep that from happening, the community will need to form a consensus on what "high quality discussion" means and what we hope to get out of having conversations on these issues here.
      To start, when I say "doesn't go well" I'm thinking of indicators where some combination of the following happen:

      1. None of the participants learn anything new about the subject, themselves, or another viewpoint
      2. Preponderance of "Malice" and "Noise" tags
      3. Heated back-and-forth exchanges (related to the above)
      4. Frequent accusations (and evidence) of speaking in bad-faith or mischaracterization of peoples' statements

      These threads end in people being angry or frustrated with each other, and it's become pretty clear that members of the community have begun to form cliques and rivalries based on these battle lines. It also seems like the stridency and tone are making people leave out of frustration, either deleting their accounts or just logging off for extended stretches of time, which is also an outcome we don't want. So let's go into what we can do to both change ourselves and how others engage with us so people feel like they're being heard without everything breaking down into arguments.

      The "Whys" of this are varied and I'm sure I don't see the whole picture. Obviously people come into any community bringing different background experiences and with different things they're hoping to get out of it. But in my view the root cause comes down to approaching discussions as a win/lose battle rather than a shared opportunity to learn about a subject or perspective. From observing many of these discussions without engaging, there are evident patterns in how they develop. The main thrust seems to be that criticism and pushback pretty quickly evolve from specific and constructive (e.g. "This [statement or behavior] is problematic because [reason]") to general and defamatory (e.g. "[Person] is [bad thing], as evidenced by them doing/making [action/statement]").

      This approach very quickly turns a conversation between two people into a symbolic battle about making Tildes/the world safe for [community], defending the wrongfully accused, striking a blow against censorship, or some other broad principle that the actual discussion participants may or may not actually be invested in. Once this happens the participants are no longer trying to listen or learn from each other, they're trying to mine their posts for things they can pick through to make them look bad or invalidate their participation. This has the effect of obliterating nuance and polarizing the participants. Discussions quickly devolve from people speaking candidly to people accusing each other of mischaracterizing what they've said. This makes people defensive, frustrated, and creates a feedback loop of negativity.

      The win/lose battle approach permeates political discussion on Tildes (and elsewhere), which is a separate issue, but it gets especially problematic in these threads since the subject matter is intensely personal for many people. As a result, it's important to take care that pushback on specific positions should always endeavor to make people feel heard and accepted despite disagreement. On the flip side, there needs to be a principle of charity in place where one accepts that "no offense/harm intended" actually means no offense intended without dissecting the particulars of word-choice to uncover secret agendas. If a charitable interpretation is available, it isn't constructive to insist or default to the uncharitable one. It may not feel fair if you know that the more negative interpretation is correct, but it is literally impossible to have productive discussion any other way. If you can't imagine that a well informed, intelligent, and decent person might hold a certain view then the only conclusion you can draw is that they're either ignorant, stupid, or evil and every response you make to them is going to sound like you think this of them. That's not a position where minds are going to be changed from. English isn't necessarily a first language for everyone here and, even if it is, not everyone keeps up to date on the fast moving world of shifting norms and connotations in social media. What's more, not all cultures and places approach these issues with the same assumptions and biases you're familiar with.

      Now I don't actually believe in appealing to peoples' sense of virtue to keep things going constructively in situations like this. Without very active moderation to reinforce it, it just never works and can't scale. So I think operationalizing these norms is going to take some kind of work. Right now we freeze out comments when they have a lot of back-and-forth, which I think is good. But maybe we should make it a bit more humanistic. What if we rate limited with a note to say "Hey this discussion seems to be pretty heated. Maybe reflect on your state of mind for a second and take a breather if you're upset."

      Or, in long threads with lots of my bad indicators, the submit button can send to the post preview rather than immediately posting. It could then flash a banner to be a quick reminder of the ground rules (e.g. Try to assume good faith, Remember the Human, Listen to understand rather than respond, Careful with the snark, It's not about winning/losing, etc.) This would introduce just a touch of friction to the posting process, hopefully just enough to make people think "Maybe I could phrase that better" or "You know, this isn't worth my time" and disengage (Obligatory relevant XKCD)

      Alternatively, maybe it is the case that this is honestly just intractable without some sort of third-party mediation mechanic and we freeze out comments under such topics entirely. Like I said before, I worry the frequency with which these discussions turn dispiriting has a chance of acculturating new users or signaling to prospective users that this is an expected way for this community to engage.

      This is a long post, and I hope it does not itself turn into another case study in the issues I'm trying to raise. I want to open the floor to anyone who has other ideas about causes and solutions. I also ask that we try to keep any critiques to specific actions and behaviors without trying to put blame on any groups of people. We all contribute to the vibe one way or another so we can all stand to try a little harder on this front.

      25 votes
    17. Distinguish "voted" state better?

      I've been on Tildes for several months now, but, to this day, I still have trouble discerning from the UI that I've already voted on something. I end up clicking, which makes it unvote, and I have...

      I've been on Tildes for several months now, but, to this day, I still have trouble discerning from the UI that I've already voted on something. I end up clicking, which makes it unvote, and I have to click to vote again.

      This is less of a problem in the feed, because a voted post stands out more, but when you click through to a post page, that context is gone, and the problem is very pronounced.

      I don't have any great solutions top of mind, but you could explore colour changes, wording changes, or extra wording.

      14 votes
    18. A brief look at programming paradigms

      Overview If you've spent any significant amount of time programming, then you've probably heard discussions about imperative, functional, and declarative programming. These discussions are often...

      Overview

      If you've spent any significant amount of time programming, then you've probably heard discussions about imperative, functional, and declarative programming. These discussions are often mired in technical knowledge and require a fair amount of intuition when trying to grasp the differences between the examples placed in front of us. These different programming styles, usually called programming "paradigms", are discussed as if they exist within a vacuum with complete and total isolation from one another. This only furthers the confusion and frustration among newer programmers especially, which runs counter to the goal of instructing them.

      In this post I'll be taking a look at the oft-neglected intersections where these paradigms meet with the hope that the differences between them will be better understood by reframing our existing knowledge of programming basics.

      Note: I'll be using PHP for my code examples and will try to provide comments when necessary to point out language quirks.


      Understanding Fundamentals is Imperative

      Let's start by first reviewing the most basic, fundamental programming paradigm: imperative programming. The term is a bit strange, but the important thing to understand about it is that imperative programming refers to writing software as a series of instructions where you tell the computer how to solve a specific task. For example, if we need to add together a bunch of numbers inside of an array, we might write code that looks like this:

      $numbers = [ 8, 31, 5, 4, 20, 78, 52, 18, 96, 27 ];
      $sum = 0;
      foreach($numbers as $number) {
          $sum += $number;
      }
      

      This is a pretty typical example that you've probably encountered in some form or another at some point in your programming studies or career--iterate over an array one element at a time from the first element to the last and add the current element to some accumulating variable that starts at 0. The kind of loop you use may differ, but the general format of the solution looks the same. This is very similar to the way the computer itself performs the task, so the code here is just a relatively human-friendly version of the actual steps the computer performs. This is the essence of imperative programming, the basic building blocks of everything you learn early on.


      Abstract Concepts

      As the software we write gets larger and more complex, we then tend to rely on "abstractions" to simplify our code and make it easier to understand, reuse, and maintain. For example, if we've written a program that adds arrays of numbers together, then we probably aren't doing that in only one place. Maybe we've written a tool that generates reports on large data sets, such as calculating the total number of sales for a particular quarter, gross profit, net profit, remaining inventory, and any number of other important business-related metrics. Summing numbers could be so common that you use it in 30 different places, so to avoid having to maintain 30 separate instances of our number adding code from above, we define a function:

      function sum($numbers) {
          $sum = 0;
          foreach($numbers as $number) {
              $sum += $number;
          }
      
          return $sum;
      }
      

      We do this so frequently in our code that it becomes second nature. We attach so many names and terms to it, too: DRY, abstraction layers, code reuse, separation of concerns, etc. But one thing experienced programmers learn is to write their functions and object and interface methods in such a way that anyone who uses them doesn't need to care about the underlying implementation details, and instead only need to worry about the method name, expected arguments (if any), expected return type (if any), and expected behavior. In other words, they don't need to understand how the function or method completes the intended action, they only need to declare what action they want performed.


      A Declaration of Understanding

      Anyone who has looked into the concept of the declarative programming paradigm should find those last words familiar: "they don't need to understand how the function or method completes the intended action, they only need to declare what action they want performed". This is the oft-touted explanation of what declarative programming is, the difference between detailing "how" and declaring "what", and I believe that it's this great similarity that causes imperative and declarative programming to become heavily entwined in a programmer's mind and makes it difficult to understand. Take this common example that authors tend to use to try to detail the difference between declarative and imperative programming:

      // imperative
      function sum($numbers) {
          $sum = 0;
          foreach($numbers as $number) {
              $sum += 0;
          }
      
          return $sum;
      }
      
      // declarative
      function sum($numbers) {
          return array_reduce($numbers, fn($x, $y) => $x + $y, 0);
      }
      

      The authors will go on to state that in the imperative example, you tell the computer how to sum the numbers, whereas in the declarative example you don't tell the computer how to do it since you don't know anything about the reduce implementation, but intuitively it still feels as if you're telling the computer how to perform its task--you're still defining a function and deciding what its underlying implementation details are, i.e. the steps it needs to take to perform the task, even if its details are abstracted away behind function or method calls that could have varying implementation details of their own. So how the hell is this any different from defining functions like we do in imperative programming?

      The answer is simple: it isn't. We've used so many names and terms to describe functions and methods in our ordinary imperative programming, but the truth is that a well-defined function or method serves as a declarative interface to an imperative implementation. Put differently, declarative programming is defining and utilizing simple interfaces that describe what you want accomplished while the underlying implementation details are inevitably written using imperative code.


      Functional Differences

      Now we can finally tackle one of the biggest trends in programming right now: the functional programming paradigm. But to understand this paradigm, it's important to understand what a "function" is... from a mathematical perspective.

      Yes, I know, math tends to be a enthusiasm sink for many, but don't worry, we're not actually going to be doing math. We only need to understand how math treats functions. Specifically, math functions usually look something like f(x) = {insert expression here}, which is loosely equivalent to the following code:

      function f($x) {
          return {insert expression here};
      }
      

      The important thing to note about functions in math is that you can run them a theoretically infinite number of times on the same input x and still get the same return result. Unlike in a lot of the programs we can write, math functions don't produce side effects. Files aren't written to or destroyed, database entries aren't deleted, some global counter somewhere isn't incremented, and your x doesn't suddenly change. The idea behind functional programming is to embody some of that nature of mathematical functions because they're predictable and always reproducible, and therefore simple to test as well. For example, take the following:

      // not functional
      function increment(&$x) { // pass by reference--$x will be modified outside of this function!
          $x++;
      }
      
      $x = 1;
      increment($x);
      increment($x);
      increment($x);
      
      // functional
      function increment($x) { // pass by value--$x will NOT be modified outside of this function!
          return $x + 1;
      }
      
      $x = 1;
      $y = increment($x);
      $y = increment($x);
      $y = increment($x);
      

      Note that the first example will change the value of $x on each call, meaning each subsequent call of increment($x) produces a different result. Meanwhile the second example doesn't change $x and so the return value of increment($x) is always the same. This may seem like a silly example, but in larger, more complex software this can be significant. So now that we have an understanding of functions from a mathematical perspective, we have everything we need to actually understand what functional programming is.

      Functional programming is a subset of declarative programming. Just like in declarative programming, you use simple interfaces to tell the program what you want to do rather than how to do it. But unlike declarative programming as a whole, functional programming imposes some additional restrictions on what you should and shouldn't do:

      • You should encapsulate behavior in pure functions, which always give a consistent output for a given input and don't have side effects.

      • You should write functions in such a way that you can compose them together, allowing you to combine and chain behavior to produce new functions or use the output of one as the input for another.

      • You should avoid side effects as much as possible.

      • You should avoid mutable state (e.g. changing the values in a variable).

      • You should avoid sharing state between components.

      These restrictions would require an entirely separate post on their own to properly cover and have been covered so many times in so many ways by others elsewhere that it would be superfluous for me to try to add anything more. It's important to note, however, that these restrictions are imposed because they provide some key benefits. By avoiding side effects and by avoiding mutable and shared states, the code you write becomes more predictable and tracing the behavior of an algorithm becomes far simpler. By writing pure, composable functions, you create reusable building blocks that can be strung together in virtually any configuration with predictable results. This makes writing, reading, maintaining, and debugging code easier and less error-prone.

      That said, I feel that it's important to note that in the real world when writing practical software that users can interact with, it's simply not possible to completely avoid side effects or mutable state. The very act of creating and updating database entries is itself an act of mutating state, which runs contrary to functional programming principles and is essential for many important software projects. But even if you can't adhere strictly to functional programming principles, it's possible to benefit significantly from being aware of them and integrating them into your own software development strategies.

      Let's consider a more practical example to illustrate this. Imagine that you've built a social media website and you're trying to test a push notification system that will be triggered when your user receives a new message. Now imagine your code and unit tests look something like this:

      function sendNotification(&$message) { // pass by reference--$message will be modified outside of this function!
          $notification_system = new NotificationSystem();
          if(!$message['sent_push_notification']) {
              $notification_system->sendPushNotification($message);
              $message['sent_push_notification'] = true;
          }
      }
      
      function testSendNotification() {
          $message = [
              'user_id'=>'{some_id}',
              'contents'=>'Hi!',
              'sent_push_notification'=>false
          ];
      
          sendNotification($message);
          sendNotification($message);
      }
      

      At a quick glance you probably wouldn't be aware of why the second message didn't send, but the fact that our sendNotification() function mutates the state of the data provided to it is the culprit. This is code that doesn't adhere to functional programming principles since the data provided to it is mutated. As a result, running the function multiple times on the same variable doesn't result in the same behavior as the first call. If we wanted to work around this without adhering to functional programming principles then we would need to manually set $message['sent_push_notification'] = false; between function calls, which makes our unit tests potentially more error-prone. Alternatively we can make a simple change to adhere better to those functional principles:

      function sendNotification($message) { // pass by value--$message will NOT be modified outside of this function!
          $notification_system = new NotificationSystem();
          if(!$message['sent_push_notification']) {
              $notification_system->sendPushNotification($message);
              $message['sent_push_notification'] = true;
          }
      
          return $message;
      }
      
      function testSendNotification() {
          $message = [
              'user_id'=>'{some_id}',
              'contents'=>'Hi!',
              'sent_push_notification'=>false
          ];
      
          sendNotification($message);
          sendNotification($message);
      }
      

      Now both notifications will be sent out, which is what we would intuitively expect. You should also notice that the above is also a blend of imperative, declarative, and functional programming. Our function definitions have imperative code, our sendNotification() function adheres to the functional programming principle of avoiding mutable state (well, mostly), and our NotificationSystem object provides a declarative interface for sending a push notification for a message.


      Final Thoughts

      By viewing these three paradigms not as completely separate concepts but as layers on top of one another, where functional programming is a type of declarative programming which is implemented using imperative programming, we can stop being confused by their similarities and instead find clarification in them. By understanding that imperative programming is the backbone of everything, that declarative programming is just simplifying that backbone with simple interfaces, and that functional programming is simply adding some additional guidelines and restrictions to the way you write code to make it more consistent, reusable, and predictable, we can start to see that we're not choosing one programming paradigm over another, but instead choosing how much consideration we place on the design of the programs we write. Except in purely functional languages, functional programming isn't some alien concept distinct from imperative or declarative programming, but is instead a natural evolution of the two.

      There are a lot of details I've glossed over here. Each of these programming paradigms is far too detailed to include a proper analysis in an already lengthy post that tries to separate them from each other and clarify their differences. Blog articles exist in a thousand different places that can do each one far more justice than I can, and programming languages exist that completely cut imperative programming out of the picture. But for your average programmer slinging JavaScript, C, Rust, PHP, or what have you, I hope that this serves as a crucial starting pointing to understanding just what in the hell these functional programming enthusiasts are on about.

      25 votes
    19. The Road to the Tildes 2020 Census: Pandemic Boogaloo

      Hello everyone! Some of you may remember last years census. I did say I wanted to repeat it, and have decided to push the date forward, as last year a few people said that doing it in December at...

      Hello everyone!

      Some of you may remember last years census. I did say I wanted to repeat it, and have decided to push the date forward, as last year a few people said that doing it in December at the end of the year probably wasn't the smartest choice, due to well, christmas and new year's eve and I totally agree. Wish I would've seen that earlier, but I guess I'm dumb lol. Summer may give us better stats because more people are on vacation any maybe check in more regularily. Or maybe there's also less people around because everyone's on vacation. Who fucking knows, I don't know. I don't know anything.

      Anyway, just like last time, I'd like to organize a preliminary discussion about the census and what questions we should ask this community. As a reminder, this was the 2019 census.

      Areas that I'd like to improve: Politics, mainly. The 8values test I think is good, but maybe there's something better out there. We could do it with the political compass and go full quadrant and r/politicalcompassmemes, but of course that's also not going to be very accurate. I honestly don't even know if there's a good solution to this problem.

      Other than that, are there other questions you'd like to ask the community? Let's discuss!I hope someone replies or this is gonna be emberassing.

      41 votes
    20. How it feels like to think about my own death about once a day

      For the past 20 years, I thought about my own demise about once a day. Bipolar depression can do that to you. I was always prone to bouts of melancholia. Someone once wrote that the problem with...

      For the past 20 years, I thought about my own demise about once a day. Bipolar depression can do that to you. I was always prone to bouts of melancholia. Someone once wrote that the problem with melancholia is that it kinda feels good. It's addictive. Abandoning all hope is equivalent to abandoning all failure. You're suddenly in power. Eventually came the desire to die. My girlfriend lived in a high apartment and the thought of jumping from the window became a secret obsession. Every time I felt any kind of insecurity, during fights big and small, the window was always there, a reminder of a perfect solution. That's how some call suicide: a perfect solution. Something that cannot be rectified. The ultimate fantasy.

      This girlfriend eventually dumped me, and then came another. She was going to another state and I had difficulties relocating. She was a doctor, I was a freelance professional. Two very distinct economic situations. When the move proved impossible, I took a box of pills and threw myself in the pool. Happily, I soon realized that breathing was grossly underestimated, and quickly swam to the surface. That day I decided to live.

      This doesn't mean death is not a part of every single one of my days. It's like an addiction for the brain, an automatic response of the unpleasant kind. Lost a job or a relationship? Your brain suggests suicide. Is your Playstation 4 no working? Maybe you should not be living at all. Unemployed? Don't waste time and resources on a futile pursuit! For every single minor frustration that might ruin your day, I may be fighting with the thought of throwing myself in front of a train.

      I could, of course, talk to people, but how many people do you know that are able to deal with the fact that their friend/relative/partner/coworker can envision their own death multiple times a day, and for the most mundane reasons?

      No, I am not gonna kill myself, this is not a suicide watch. Living is awesome. I like eating, fucking and watching TV shows. I also think a lot about suicide. And it sucks.

      26 votes
    21. Are there any major problems in society that we genuinely do not have any good solutions to?

      One of the most notable aspects of political discourse today is how many of the problems we have seem to have relatively simple solutions for how consequential they are: To reduce wealth...

      One of the most notable aspects of political discourse today is how many of the problems we have seem to have relatively simple solutions for how consequential they are:

      To reduce wealth inequality, we can use progressive taxation, antitrust, support of unionization so that poor people/workers have a large stake in their wages.

      To give poorer people equal opportunity, we can use welfare initiatives like free (as in paid by taxes/free at the point of use) college, better pay for teachers and more equitable resource (as in textbooks, tables, chalk distribution for schools so poor people get more equitable education to rich people.

      To reduce crime, violence and repeat sentencing we can reduce poverty (see the top question), encourage mental health initiatives and do not have cops take thatand have jail be rehabilitative rather than punitive.

      To make make software less centralized and invasive, we can require Internet companies give you full, immediate disclosure of all the forms your data will be used and let people opt out of all of them, delete all their data, and also enforce antitrust when it comes to social media platforms (I.E Facebook should not own Instagram, WhatsApp, Messenger and their new TikTok analogue and the first thing you should see when logging into any of them is a list of ways these companies will collect your data and let you opt out of all of them and be as anonymous as you please)

      To make sure democracy is indeed representative of the people and works well, we can introduce a parliamentary system or multi-winner congressional seats and institute STV or RCV or just approval voting if you really can't have more than 1 representative for an area (the US senate is cucked)

      To make more progress in stopping COVID, we can have mass testing by the government, people must take social distancing seriously and wear masks, medics need to be taken seriously and properly supplied with PPE and all that.

      Given these solutions, what are large problems we have/will have that we genuinely don't have an answer to instead of just not wanting to do something about it?

      A few examples that come to my mind are:

      How do we get corrupion out of a government? Since the vast majority of stuff I have mentioned in this post would be done by governments and governments under extensive corruption cannot be trusted to regulate anything.

      How do we regulate news outlets to be fair and objective? We can get news outlets to be publically/popularly funded instead of ad(large-corporate)-funded and enforce antitrust, but that doesn't stop bias, outright lying and sensationalism.

      How do we get peple to change their minds? Evidence of everything I've mentioned in this post is more than around, but that hasn't convinced Republicans/conservatives. For some people groups, acceptance has literally been a decades-long political campaign to be recognized as normal or ok.

      EDIT: 3 4 more.

      How do we get people to befriend eachother and be social and tell apart those who genuinely don't want to do this and those who do but don't know how to or don't like to/aren't good at doing it in the ways usually available?

      If we choose to let the population decline (see the climate change question), are we fully prepared for the consequences of having a society that will be growing older and older, perhaps indefinitely?

      If we choose to not let the population decline and seek to keep birthrates at replacement level, how do we convince people to do so? If we don't/can't and start using things like artificial wombs to have children, who will take care of them? Do we make orphanages socially acceptable/valued and well-funded? Do we turn kindergartens and schools into a 24/7 institution and add in non-study things like housing and video games, and make teachers basically parents, but with many children to take care of?

      If electoralism fails, what can we do to still have a voice in the world? Can we do anything?

      18 votes
    22. Web-based rich text editor

      Hi, I’m usually just overthinking my note-taking setup with plaintext markdown notes, but recently I had to create and share (as PDF) some rich text documents as well. What I’m looking for:...

      Hi,

      I’m usually just overthinking my note-taking setup with plaintext markdown notes, but recently I had to create and share (as PDF) some rich text documents as well. What I’m looking for:

      • Collaborative editing to some extent (ideally real-time like Google Docs..)

      • Rich text formatting

      • Export as PDF (or even Word if possible)

      • Web & mobile app (iOS)

      I’m aware of Microsoft 365 with Word online and Google Docs. I really can’t stand Word online, it feels so super slow one can barely use it. I also feel the same about the application for macOS. It’s just this gigantic thing I don’t need. I want some headings, basic formatting, lists etc.

      And then there’s Google Docs. It just feels wrong. It’s a weird editor, especially on mobile, it’s in this format I can’t grab, it feels like the files are not under my control.

      I’m also aware of some self-hosted solutions like ONLYOFFICE and probably some NextCloud addon/solution. But these are things I don’t want either since it’s usually a hassle to install them, keep them up to date and take care of the data.

      I’m just hoping that I’m missing out on something else available except the Microsoft and Google solutions.

      At some point I just thought I might stick to Markdown files and export them as PDFs or even Word documents, but I don’t know about any reliable online collaboration solution for markdown docs either.

      9 votes
    23. On apathy

      Hello again! There have been quite a few posts on Tildes as of late that have rubbed my opinionated brain the wrong way. The purpose here is to have a conversation about apathy in general, less...

      Hello again!

      There have been quite a few posts on Tildes as of late that have rubbed my opinionated brain the wrong way. The purpose here is to have a conversation about apathy in general, less focused on political or social issues and more on why we've seen an increase in apathy. This isn't a public shaming or an attack on anybody in particular. Apathy is at an all time high universally, and we've had several conversations here on Tildes where it has come into play in front of important issues.

      ...Everything's fucked. We are totally and utterly done for. 2020 is the worst year ever, I want a time machine. We are all going to die. Why does any of this even matter?...

      I think we've all seen some variant of that sentiment this year, especially on the internet. It has been rough: COVID-19, the rise of fascism, climate change and ongoing political and social strife around the world. It is quite the cluster! It has been almost impossible for most of us to not look away at some point or another: turn off the news, disconnect the internet, run off into the woods (that's me!), self-isolate (thanks 'rona!) This is all entirely understandable. It's perfectly acceptable to do this for mental health reasons.

      Let's be real though, 2020 has been rough, but let's get even more cynical, shall we? In the last two decades we've seen endless war and suffering in the middle east and elsewhere, we've noticed an ongoing rise in extremism all over the world, we saw the towers fall, we've witnessed school shooting after school shooting after school shooting after school shooting, we have (Yes, we. You may have voted for someone else, but we all have a hand in this democracy.) put a fascist in office (yeah, that was going on 4 years ago), we've seen so much horrible shit happen.

      2020 isn't the outlier, I'd posit it's a combination of being the culmination of decades of growing strife and the sudden realization that total societal collapse (in a way) and the dangers that much of the 3rd and developing worlds have been facing for centuries can happen right here, right now, in our comftorable first world nations.

      So looking at these factors, it is easy to see why apathy has grown, right? I mean, in the face of all of this adversity it'd be hard to not get discouraged. We see the powers at be spins their wheels and balk at solutions; train after train screaming down the tracks, the brake lever sitting right there, we scream and scream, "PULL THE FUCKING LEVER"... they don't. For whatever reason, be it money or self interest or whatever... they don't. So yeah, fuck this system! These people are supposed to do our bidding and they don't. These leaders can't even lead, so why the fuck do we even bother? How many times does this happen? How many people do we need to elect to fix our system? How many votes, protests, rallies, legislative sessions, meetings, politician offices, social media posts? How much effort have we put in, how much does it take? I'm so fucking tired. I give up. Why the fuck do we even bother?

      We've all been in this place, and I think some of us don't want to think about it. We don't want to question why we feel this way, why political and social systems are broken, FUBAR. I'd suggest that some people feel a related guilt, they know they could be doing more but... insert excuse here. I'd venture to guess some people just honestly don't care, true apathy. Fueled by a lack of empathy that in my opinion comes from the numbness associated with witnessing atrocity after tragedy after trauma via the internet. This doesn't account for all of the apathetic populations in the world, but I think topically it covers a good portion.

      So what do we do? I could rant all day about why we need to be on the streets. I could lecture about how a functioning society is a privilege and that it takes good willed effort to maintain. I could soapbox for the rest of my life about how a functioning democracy is not just a privilege but a requirement and that, it too, takes effort. That's not what I want to do though! Me or somebody else talking to people about apathy most often turns into talking at the apathetic masses. Talking at isn't a conversation and it almost never bears fruit.

      So Tildes, I defer to you. What do you think we need to do to reform our society and political system to a functioning point? How do we stoke people to make the effort? As it is currently, that won't happen in America it seems. So what's the solution? We know why there is apathy, how do we beat it?

      10 votes
    24. What is the best way to teach Python for my 11-year-old sister that lives in another state?

      This may seem an obvious question, but not as much as it seems. She uses Windows, I’m currently using Linux/macOS. How to instruct her to install her Python environment? Should I use Zoom, Skype,...

      This may seem an obvious question, but not as much as it seems. She uses Windows, I’m currently using Linux/macOS. How to instruct her to install her Python environment? Should I use Zoom, Skype, Google Hangouts, or another solution? Is there and easy way for live-drawing (online blackboard) to explain things to her visually? And, perhaps most importantly, how can I do that for free?

      13 votes
    25. [SOLVED] Tech support request: Possible screen-tearing issue while gaming on TV

      EDIT: This is now solved thanks to @Amarok! Solution is here. Changing the refresh rate from 60 Hz to 120 Hz fixed it. My husband and I recently upgraded our TV to a Samsung Q70, and I have...

      EDIT: This is now solved thanks to @Amarok! Solution is here. Changing the refresh rate from 60 Hz to 120 Hz fixed it.


      My husband and I recently upgraded our TV to a Samsung Q70, and I have started experiencing an odd issue, visible in this video here.

      The Issue

      There's a horizontal section across the entire bottom of the screen that seems to be refreshing later than the rest of the TV. The game is running on a PC hooked up to the TV via HDMI, and the TV is running on game mode. This issue did not happen on our last TV (a 10-year-old Visio that I don't remember the model number of).

      The Oddness

      • It doesn't happen on the desktop or in video inputs.

      We've been watching YouTube and Hulu through a Shield TV that we also have hooked up, and this issue isn't present in any of those, nor is it visible when I'm using desktop applications on the TV through the PC.

      • It only happens in certain games.

      The video is from Trackmania 2: Lagoon, where it is always present. Meanwhile, it is not present at all in Trackmania (2020). Likewise, I've been playing 428 Shibuya Scramble where it shows up in the exact same way in the exact same area, but it does not exist in Distance or Rogue Legacy, for example.

      • It does not respond to v-sync.

      I've tried toggling v-sync on and off, both through the game itself and forcing it through my video card. Neither alleviated the issue. The display looked the same whether or not v-sync was turned on or off.


      I'm looking for any guidance anyone can give me, especially if this is a hardware issue with the TV itself, since I'm still in the return window.

      6 votes
    26. Reddit starts an Ethereum scalability competition in order to launch Community Points (monetization of karma) site-wide

      Here is the admin post in r/ethereum announcing the contest and below is the text of that post. Previous Tildes and r/TheoryOfReddit discussions on this: Tildes: Reddit is moving forward with...

      Here is the admin post in r/ethereum announcing the contest and below is the text of that post.


      Previous Tildes and r/TheoryOfReddit discussions on this:


      tl;dr: Do you believe your Ethereum scaling technology can handle Reddit's scale? It's time to let the Ethereum community hear about it. Send your demo in the comments by July 31, 2020.

      This is your chance to earn some fame but, to be clear, there is no prize if your solution is chosen or modified to meet Reddit’s needs. Our lawyer made us write this.

      https://preview.redd.it/q7hhi6lzlp551.png?width=1200&format=png&auto=webp&s=cdb26cbbe59e26f4fc73da5740da1308e2a87579

      The Goal

      In conjunction with the Ethereum Foundation, Reddit is inviting Ethereum scaling projects to show the community how your scaling solution can be used to bring Community Points to mainnet. Our goal is to find a solution that will support hundreds of thousands of Community Points users on mainnet today, and can eventually scale to all of Reddit (430 million monthly users).

      We’ve evaluated some of the most promising scaling solutions, and have learned a few things:

      1. There are plenty of awesome projects that we don't know about yet. We seem to learn about a promising new scaling solution every day.
      2. Most existing scaling solutions focus on the exchange use case, which favors optimizing for transfers. Many of these designs don't take into consideration the costs of obtaining tokens or entering the scaling system, which can be significant. Community Points distributions have cost an order of magnitude more gas than all other operations combined, primarily due to on-chain storage costs associated with onboarding new users.
      3. It's unclear how to determine the best solution. There is a lot of code, a lot of documentation, and a lot of hype out there. But there are very few objective real-world reviews or comparisons of various products/implementations.
      4. We need the Ethereum community's help to figure this out.

      Do you have a scaling project that meets the criteria below? If so, share your demo in the comments of this post by July 31, 2020. Please note that all demos need to simulate Community Points usage for 100,000 users.

      We also invite all scaling experts in the Ethereum community to comment on any demos submitted to enable a better understanding of the trade-offs and compromises between different solutions.

      We will review the demos and plan to share any updates by September. While we don’t expect any novel scaling projects, we hope that you, the Ethereum scaling expert, can show us how to scale Community Points.

      Demos should include:

      1. A live proof of concept showing hundreds of thousands of transactions
      2. Source code (for on & off-chain components as well tooling used for the PoC). The source code does not have to be shared publicly, but if Reddit decides to use a particular solution it will need to be shared with Reddit at some point
      3. Documentation
        1. How it works & scales
        2. Cost estimates (on-chain and off-chain)
        3. How to run it
        4. Architecture
        5. APIs (on chain & off)
        6. Known issues or tradeoffs
      4. Summary of cost & resource information for both on-chain & off-chain components used in the PoC, as well as cost & resource estimates for further scaling. If your PoC is not on mainnet, make note of any mainnet caveats (such as congestion issues).

      Requirements

      Scaling. This PoC should scale to the numbers below with minimal costs (both on & off-chain). There should also be a clear path to supporting hundreds of millions of users.

      • Over a 5 day period, your scaling PoC should be able to handle:
        • 100,000 point claims (minting & distributing points)
        • 25,000 subscriptions
        • 75,000 one-off points burning
        • 100,000 transfers

      Decentralization. Solutions should not depend on any single third-party provider.

      • We prefer solutions that do not depend on specific entities such as Reddit or another provider, and solutions with no single point of control or failure in off-chain components, but recognize there are numerous trade-offs to consider

      Usability. Scaling solutions should have a simple end user experience.

      • Users shouldn't have to maintain any extra state/proofs, regularly monitor activity, keep track of extra keys, or sign anything other than their normal transactions
      • Transactions complete in a reasonable amount of time (seconds or minutes, not hours or days)
      • Free to use for end users (no gas fees, or fixed/minimal fees that Reddit can pay on their behalf)
      • Bonus points:
        • Users should be able to view their balances & transactions via a blockchain explorer-style interface
        • Exiting is fast & simple

      Interoperability. Compatibility with third party apps (wallets/contracts/etc) is necessary.

      • Scaling solutions should be extensible and allow third parties to build on top of it
      • APIs should be well documented and stable
      • Documentation should be clear and complete
      • Third-party permissionless integrations should be possible & straightforward
      • Simple is better. Learning an uncommon or proprietary language should not be necessary. Advanced knowledge of mathematics, cryptography, or L2 scaling should not be required. Compatibility with common utilities & toolchains is expected.
      • Bonus Points: Show us how it works. Do you have an idea for a cool new use case for Community Points? Build it!

      Security. Users have full ownership & control of their points.

      • Balances and transactions cannot be forged, manipulated, or blocked by Reddit or anyone else
      • Users should own their points and be able to get on-chain ERC20 tokens without permission from anyone else
      • Points should be recoverable to on-chain ERC20 tokens even if all third-parties involved go offline
      • A public, third-party review attesting to the soundness of the design should be available
      • Bonus points:
        • Public, third-party implementation review available or in progress
        • Compatibility with HSMs & hardware wallets

      Other Considerations

      • Minting/distributing tokens is not performed by Reddit directly [1]
      • One off point burning, as well as recurring, non-interactive point burning (for subreddit memberships [2]) should be possible and scalable
      • Fully open-source solutions are strongly preferred

      [1] In the current implementation, Reddit provides signed data for claims, but does not submit the actual claim transaction for the user (the user does that themselves). Note that smart contracts are considered independent of Reddit provided there is a path to decentralizing control over them.

      [2] Subreddit memberships are currently implemented as a contract acting as an ERC777-style operator that can burn points on a monthly basis, but we are open to changing that implementation.

      Community Points Overview

      To help you get started, this is an overview of how Community Points work today and some stats on how it's used. We are open to changing most implementation details, provided the basic requirements (above) are met.

      Usage stats over the past month

      Number of Community Points holders: ~17,500

      Number of transfers: ~20,000

      (reference: reddit.dappradar.com)

      Number of subreddit memberships: ~800

      Contracts

      Community Points is built around 3 contracts:

      1. SubredditPoints: the ERC20 token
      2. Distributions: manages token supply & token claims
      3. Subscriptions: enables membership subscriptions in the form of recurring token burn

      Deployed Contracts & Source Code

      r/FortniteBR

      SubredditPoints: https://rinkeby.etherscan.io/address/0xe0d8d7b8273de14e628d2f2a4a10f719f898450a

      Subscriptions: https://rinkeby.etherscan.io/address/0x396b89db5e9317ff25360c86bd4e2aae3bbc62ea

      Distributions: https://rinkeby.etherscan.io/address/0xc0c08af3f2a3f8d6730118e0d2de4367053ebddf

      r/CryptoCurrency

      SubredditPoints: https://rinkeby.etherscan.io/address/0xdf82c9014f127243ce1305dfe54151647d74b27a

      Subscriptions: https://rinkeby.etherscan.io/address/0x77cb2dbeadb7313242d7f3070ce8fc98e96080e4

      Distributions: https://rinkeby.etherscan.io/address/0x1c5122bfeba106eea33cf5bdf2004ab22213ca20

      Points Distribution & Claims

      Token supply is controlled by distribution rounds managed in the Distributions contract and triggered by Reddit. For each round (occurring ~monthly), Reddit submits a proposal for points distribution to a subreddit for approval. Once approved, Reddit issues signed claims for individual users according to the agreed upon points distribution. These claims can be redeemed on-chain. Claims are obtained from Reddit, and submitted to the Distributions contract, which validates the claim and calls the Subreddit Points contract to mint points.

      https://preview.redd.it/lunpaj18mp551.png?width=1120&format=png&auto=webp&s=da31db1db07cfe4f327692a7398772019b8eb7bd

      Memberships

      Subreddit memberships are obtained by burning points via the Subscriptions contract. Redditors can optionally configure their membership to be renewable on a monthly basis without additional interaction. The Subscriptions contract is granted permission to burn points by being configured as an ERC777-style default operator in the Subreddit Points contract.

      https://preview.redd.it/bqnvt50amp551.png?width=1120&format=png&auto=webp&s=812f46a0308aea370908eb73ca93abac810e58ba

      ***

      We'll be watching this thread and answering questions. Looking forward to what comes out of this!

      30 votes
    27. Best way to subscribe to podcast back-catalogs?

      Every now and then I come across a limited-run podcast that wrapped up ages ago and I want to add it to my feed. I don't want to manually click through the old episodes one by one, I want to...

      Every now and then I come across a limited-run podcast that wrapped up ages ago and I want to add it to my feed. I don't want to manually click through the old episodes one by one, I want to subscribe to it as if it were being published in realtime. Are there any tools that can help me with this?

      I think what I'm looking for is some sort of app that republishes an existing RSS feed with a date offset based on whatever recent date you subscribe to it. Even better would be something that lets me specify my own custom drip rate so I can binge through large catalogs at my own pace.

      I've been thinking about coding something like this but I don't want to reinvent the wheel if an existing solution is already out there.

      10 votes
    28. The case for an "Escalation" label for political threads

      This is a follow up to the thread from a few days ago, and specifically my comment in that thread regarding the use of a "Escalation" label. As many users identified in that topic, political...

      This is a follow up to the thread from a few days ago, and specifically my comment in that thread regarding the use of a "Escalation" label.

      As many users identified in that topic, political discussion on Tildes has the potential to become very heated, very quickly, and often the standards of discussion on these topics is below what we expect elsewhere on Tildes. In that thread, many suggestions were offered in order to remedy the situation, including banning overt political content entirely, more liberal moderation by @Deimos, more liberal usage by the community of labels, addition of new labels, and more. All of these solutions have their advantages and disadvantages, but I want to talk about the one I believe would be the most effective and least disruptive to the site as is: addition of new labels.

      Right now, there are two main tags that might be used on a comment that is seen as falling short of Tildes's standards: noise and malice. Users seem to have some variation in how they interpret how each tag should be used, but it seems like there is at least some agreement on the 'noise' tag being used for comments that are clearly low effort. Users seem to have more hesitation to use the 'Malice' tag, however. While it is sometimes clear when a comment is hostile or malicious, this is not always the case. Argumentative is not always hostile, and sometimes topics are naturally contentious. One takeaway from that thread (for me) is that labeling something as malice confers a judgement on intent, and users are not always comfortable doing this as it can be difficult to tell if someone truly meant to be malicious. But in political threads, the intent matters less than the effect a comment has in a discussion. Someone can not be acting maliciously, but still be clearly making the situation worse. This is the point of an 'Escalation' label.

      An "Escalation" label should be applied to comments that have made the situation worse.

      Furthermore, an "Escalation" label would not only affect the sorting of a comment or thread, but has the potential to halt the discussion if there is too much escalation in a short amount of time. Here is what I envision:

      Define the heat of a comment (as in, "ohhh this conversation is getting heated") as follows:

      H = k*n ∑ Ni / di

      where k is a tuning constant, n is the number of escalation tags given to the comment in question, and the sum ranges over the comment's direct ancestors and descendants in the thread with Ni being the number of "Escalation" labels given to the other comment and di is the distance from the current comment to that other comment. Here is an example thread:

      .
      ├── A
      ├── C0
      │   └── C1 (N=1)
      │      └── C2 (N=0)
      │          └── C3 (N=2)
      │               └── C4 (N=1)
      └── B0
          └── B1
      

      The heat of comment C3 would then be

      H = k*2 (1/2 + 1) = 3k

      Finally, define the heat H(T) of a thread T to be the sum of the heats of its comments. My proposal is that if the heat of a given thread surpasses some threshold value Hc, replies are locked in that thread only. This essentially shuts down extremely heated conversations before they get out of control and cause an entire topic to be locked.

      The above definition can obviously be modified, but it has a few good properties that I think should be retained.

      1. It takes into account the relative positions of comments. A thread that is 20 comments long that has a comment with 1 "Escalation" at the beginning, midpoint, and end is probably a better and more controlled situation than a thread with 3 "Escalation" labels in a row.
      2. One extremely heated comment (n is large) that generates many okay or slightly heated replies (n~1) is oftentimes just as bad as many comments that each escalate a bit (a long chain of comments, each with n~1).
      3. It considers a the whole thread as opposed to on a comment by comment basis. If there is only one person in a thread posting heated comments, even if the replies are measured and reasonable, there is a good chance that thread is not producing a worthwhile discussion. If that one problem user stays problematic too long, eventually the heat of the thread will surpass the threshold and the chain will be locked.

      I am sure there are disadvantages that I am not thinking of right now, but I truly think a system like this could be beneficial if implemented and used by Tildes. Furthermore, if two people are genuinely interested in the discussion and want it to continue, it is in their interest to avoid posting comments that get generate a high heat score so that the thread doesn't become locked. If they are not interested and keep escalating anyway, that conversation probably shouldn't continue.

      I am interested in your thoughts on this idea. However, I don't intend for this topic to become a repeat of many of the suggestions and comments in the thread linked at the beginning - I don't mean to reignite that discussion.

      31 votes
    29. A review of Andrew Lloyd Webber's 'By Jeeves'

      I watched the streamed version of 'By Jeeves' today. I have thoughts that I want to express. There’s a saying in show business: “If you have a good strong finish, they'll forgive anything.” (Well,...

      I watched the streamed version of 'By Jeeves' today. I have thoughts that I want to express.


      There’s a saying in show business: “If you have a good strong finish, they'll forgive anything.” (Well, maybe it’s only Rose in ‘Gypsy’ who says that, but it has wider applications.) This show was the opposite of that. I was going along with the badness of the adaptation, the absurdity of the plot, the silliness of the narrative framework, and the falseness of the characters – and then the ending came along and trumped everything else with its awfulness.

      For starters, the narrative framework was silly. Bertie Wooster is due to give a banjo recital at a local hall, but the banjo goes missing, so his valet Jeeves convinces Bertie to entertain the audience with a reminiscence. But rather than commit wholeheartedly to the story, Bertie and Jeeves keep popping out of it with references to bad props and lighting and music. At the times when the plot went along as normal, it was quite an enjoyable play, for what it was. Then Jeeves would appear with a car built from a sofa and some cardboard boxes, or a ladder going to nowhere, or a pig mask (more about that later), and destroy the mood. I wish the writer Alan Ayckbourn had committed to the plot, rather than framing it in this way. It felt silly. It set the wrong tone. P.G. Wodehouse’s Jeeves and Wooster stories are comedies of manners, not farces (although they often contain farcical elements). The comedy is subtle, not broad.

      On the matter of tone, I noticed a distinct lack of the 30s slang which gave the original stories their flavour. Bertie spoke generic upper-class English in this play, rather than the lingo of his time and his culture.

      With regard to the story, I’m not sure where this plot came from. I don’t pretend to have read all the Jeeves and Wooster stories, but I do have the book that the setting for this play comes from: ‘The Code of the Woosters’. The backdrop of Totleigh Towers and most of the characters in the play come from this novel. But the plot is nothing like the book. It has elements that are reminiscent of Wodehouse’s stories, such as characters pretending to be each other (which was too over-the-top in this play), and Bertie having to steal something to create a diversion, but the plot itself is an invention of Ayckbourn’s (I assume).

      The scene near the end of the play with the whole household running around chasing a man in a pig mask, while singing about hunting and implying that they think it’s a real pig, was jarring. The pig mask came from the framing narrative, where Bertie’s trying to give a banjo recital but has to tell a story instead. Jeeves is stage-managing the story-telling, and produces a pig mask that he found in the back of the theatre for Bertie to wear when he acts out breaking into Totleigh Towers and pretending to steal a bag of swag because… who cares. He wears the mask as a prop to tell the story. But, in the story that Bertie is telling, the other people see a man wearing a pig mask, and start talking about a chauvinist pig, a real pig, and hunting wild boar. If the pig mask came from the theatre, then it wasn’t used in the original fake burglary, so the people wouldn’t have seen a man wearing a mask, so they wouldn’t have been singing “It’s a Pig!”

      I get the feeling that Alan Ayckbourn didn’t really understand the source material, and wrote his own play, using some names from the original stories.

      As evidence of this, Bertie Wooster himself was wrong. He was far too competent and intelligent. Situations kept happening to him, rather than being caused by him. He’s not supposed to be a sensible man surrounded by useless people; he’s supposed to be one of those useless people, but lacking the self-awareness to see himself as such. He’s supposed to be just as useless as his friends Gussie Fink-Nottle and Bingo Little. But he didn’t feel like that in this play. (I also wonder if the actor playing him wasn’t a bit too old for the role. Bertie seems like a man in his mid-20s to early 30s, whereas the actor seemed about a decade older than this.) I may be influenced by the fact that I’ve recently started re-watching the ‘Jeeves and Wooster’ television series: I think Hugh Laurie [actor] and Clive Exton [writer] had a great take on the character of Bertie, while this play missed it entirely.

      Other wrong moments in the play include the song “Half a Moment” which was far too romantic and sincere for this play, and the song “It’s a Pig!” which added a tone of absurdity (as mentioned before). And the song “What Have You Got To Say, Jeeves” was totally misjudged. Bertie turns on Jeeves, and accuses him of incompetence. That’s out of character for Bertie; he always knew that Jeeves was the smart one.

      Ah, Jeeves. Poor Jeeves. He might be the title character in this play, but it doesn’t do him justice.

      For one thing, where are his sartorial judgements? A running joke in the stories is that Bertie wants to wear a particular item of clothing, Jeeves advises against it, and Bertie wears it anyway. After the action is over, and Jeeves saves the day, Bertie stops wearing the item. It’s an indirect way of him acknowledging Jeeves’ intelligence and apologising to Jeeves for not paying attention to his advice. That never got a mention in this play.

      Then we get to the ending. The denouement was wrong. So very very wrong.

      In the stories, Jeeves is subtle, even Machiavellian, in his manoeuvres. He solves problems by manipulating things and people quietly behind the scenes. He gets a letter delivered to the wrong person. He distracts someone with a new romantic interest. He plays on people’s character weaknesses. In this play, he spins a prop fountain to move Cyrus Budge into Bertie’s position. Not only does he break the fourth wall to implement his solution (in the story that Bertie is acting out, the fountain would have been real and not able to be spun), but that solution is very uncharacteristic of Jeeves.

      And that’s just the beginning of the bad ending. Suddenly, all three sets of star-crossed lovers couple up, without any resolution. They just... get together. They literally run across stage into each others' arms.

      And then… and then…

      … the replacement banjo arrives and the play goes totally off the rails.

      I have a feeling that Ayckbourn and Lloyd Webber thought they were creating the proverbial good strong finish, after which audiences would forgive them for butchering the Jeeves and Wooster stories. Instead, they were jumping up and down on the corpse of those stories.

      Jeeves gives Bertie a silent banjo and tricks him into thinking it’s playing music that everyone else can hear. Then Jeeves suggests a full chorus accompany Bertie – at which point the entire cast comes on stage wearing costumes from 'The Wizard of Oz'!

      This is just further evidence that Alan Ayckbourn and Andrew Lloyd Webber never really understood the nature of the material they were adapting. They put cheap laughs into a play that’s supposed to be a subtle satire on the wastrel upper class of the 1930s. Like I said before, the Jeeves and Wooster stories are a comedy of manners, rather than an open comedy. They’re subtle comedy, rather than broad comedy. You don’t laugh at a Wodehouse story, you smirk knowingly - or, at most, you chuckle quietly. And I don’t think the writers got that at all. They wrote this play to get laughs, rather than smirks.

      Also, the use of ‘The Wizard of Oz’ is anachronistic. The Jeeves and Wooster stories are set firmly in the milieu of the 1920s and 1930s. In the framing narrative, everyone in the hall listening to Bertie is dressed in the fashions of the 1930s. However, the ‘Wizard of Oz’ movie wasn’t released until 1939. Yes, the books were published 30-40 years earlier, but the costumes used in this play are from the movie versions of the Oz characters. As the most obvious example, one person comes out dressed as the Wicked Witch of the West, complete with green make-up on her face, but the Wicked Witch did not have green skin in the orginal book: that only came from the movie.

      The ending is a shambolic climax to a play that didn’t know where it was going to begin with.

      Two minor notes to finish up with:

      • Someone needed to tell the actor playing Cyrus Budge how to pronounce his dialogue. It’s “stomach UPset”, not “stomach upSET” (that is, “upset” used as a noun, not an adjective). And “incandescence” might originally have been a French word, but it’s not pronounced in the French style.

      • It was a joy to see the actor who plays Paula in ‘Crazy Ex-Girlfriend’ as Honoria Glossop in this. She managed to upstage Bertie in the one scene she had with him, and it was a delight to watch.

      6 votes
    30. LaTeX: Using a different font for glyphs used in commands like \sum

      Hello everyone. I consider myself fairly competent when it comes to my work with LaTeX, but as everyone who uses it knows, it is definetely strange sometimes. And right now I have a problem which...

      Hello everyone. I consider myself fairly competent when it comes to my work with LaTeX, but as everyone who uses it knows, it is definetely strange sometimes. And right now I have a problem which just irks me in the wrong ways:

      I use XeTeX and a number of custom fonts for my documents, but when writing mathematical formulas I found out that the font I set for Greek letters (Gentium Plus) is used for letter commands like \alpha, \Alpha, ... but not for commands like \sum, \prod. As you can see in this example here. You can see XeTeX defaults to Computer Modern.

      I've looked all over the net for solutions but I can't find one. I'm using mathspec, amsmath, amsfonts, amssymb as my font related packages and I set my fonts like this:

      \setmainfont{Charis SIL}
      \setsansfont{Helvetica Now Display}
      \setmonofont[Scale=MatchLowercase]{Fira Code Retina}
      \setmathfont(Digits,Latin){Charis SIL}
      \setmathfont(Greek){Gentium Plus}
      

      I feel like I'm going insane not solving this problem. Should you require it, my entire LaTeX template is here on Github. Please help, thank you.

      8 votes
    31. How should we go about handling population growth and staying at or above replacement levels?

      Tl;dr human birth rates are falling universally and globally and at some point in this century will mean a decrease of the world's population. The effects of this will/has been felt in stuff like...

      Tl;dr human birth rates are falling universally and globally and at some point in this century will mean a decrease of the world's population. The effects of this will/has been felt in stuff like pensions/retirement and so far, noone has proposed any solutions other than increased immigration and denying women abortions. So what should we do to solve this? Should we even find solutions given that stuff like pollution and climate change is man-made?

      12 votes
    32. Have you tried degoogling your Android?

      In a pursuit of a more privacy-oriented mobile computing I've installed LineageOS ROM on my phone and decided to try living without Google Play Services, which usually provide aGPS (cell tower...

      In a pursuit of a more privacy-oriented mobile computing I've installed LineageOS ROM on my phone and decided to try living without Google Play Services, which usually provide aGPS (cell tower geopositioning), push notifications and lots of other frameworks like Google Maps that apps use as libraries.

      My phone has 4 primary uses:

      • Communicator - mostly Telegram, WhatsApp and Slack. Email of-course.
      • Navigator - GPS and Maps are an irreplaceable tool if you're living in a modern metropolis
      • Internet browser - obviously
      • Music Player - music on the go

      So let's see how you're supposed to tackle each of the uses, while using as much FOSS as possible.

      1. System functionality - both push notifications and aGPS can be solved by microG - fake Google Play Services library. Not sure how it implements push, but aGPS is checked against Mozilla's geolocation database.
      2. Communications - Telegram is available on F-Droid (OSS app store), but everything else is not. The solution here is to use Aurora (Play Store front-end to rip APKs) and install them manually. Push notifications might be broken even with microG (WhatsApp is missing notifications for me, sometimes). AOSP email is fine, K9-mail is ugly but works somewhat better.
      3. Maps and navigation: OpenStreetMap is the obvious choice here and OsmAnd delivers the frontend. It has enough metadata for businesses to get you around, but compared to Google Maps it's can be sometimes lacking and/or out-of-date. Navigation itself is decent, but it's missing timetables for public transportation compared to GMaps, which can be a problem, especially if trains are cancelled or delayed. Overall it's very usable, almost feature complete, but I've found myself falling back to Google Maps in my browser when it comes to using public transport.
      4. Internet browser - Firefox, with uBlock Origin installed (yes, it works on Android) it's really good.
      5. Music Player - there are tons of music players available on F-Droid, you can pick whichever suits your needs. Here I actually stepped away from the FOSS and bought myself a PowerAMP license on developer's website. One of the rare moments where paid Android software is available outside of Play Store.

      Now that the primary use cases are solved, let's try some other useful apps:

      • E-banking? Broken without Google Play, app refuses to even start properly.
      • Bike sharing? Taxi app? Public transport app? Broken without Google Maps libraries for the obvious reason. You might or might not be able to use the browser version, depending on the app.
      • Reddit Relay/any app that requires the license? Okay you've ripped the APK with Aurora, but you can't buy the license to remove the ads.
      • Ebook reader? Nothing good on F-Droid, have to rip something off Aurora.

      Basically you have to be prepared to use your mobile browser a lot. And for some of the sites, do it in a "desktop mode" with tiny text, since the mobile version will just nag you to download the app, that might be broken.

      The takeaway is simple - you give up A LOT of convenience just to cut off Google analytics (which you still might get with apps like Slack). It's certainly usable, don't get me wrong, but I still feel kind of stupid fumbling with OsmAnd when I'm out with my friends and trying to look something up. I'll probably end up going back to the stock ROM, or just installing the Google Apps. For me it was an experiment and I think I've got a general feel on how much information and use I'm actually getting out of GApps.

      So Tildes, have you tried degoogling your phone? How did it go? Are you still using it?

      28 votes
    33. Recommendations for a simple video chat system for Grandma

      Grandma is understimulated in assisted living, and while Mom is looking into ways to either bunk with her, or drag her back to our place, I'm exploring other options. Her apartment does have...

      Grandma is understimulated in assisted living, and while Mom is looking into ways to either bunk with her, or drag her back to our place, I'm exploring other options. Her apartment does have wireless internet, so we could set up some sort of telepresence or video calling device, but even something as simple as a Relay or a KC2 isn't great, because it loses power, and needs to be explained to her.

      I'm thinking that we might have better luck with a Tablet or a PC solution, and I do have a Kindle Fire (5th Gen?) and an off brand Windows 10 tablet around, and I am open to a Pi Project or speciality devices, but it has to be simple enough to plug and play, and the dream would be if it could start a video chat without the receiver having to pick up, or at least as simple as a nurse being able to come in and start a call. Any suggestions?

      18 votes
    34. How do you manage your ebooks & web documents?

      I've been organizing my personal collection of ebooks (epubs & pdfs) lately so I've been thinking of possible "best practices" to employ and wanted to open a discussion on it. There are sources...

      I've been organizing my personal collection of ebooks (epubs & pdfs) lately so I've been thinking of possible "best practices" to employ and wanted to open a discussion on it.

      There are sources for free ebooks online which are trustworthy such as https://archive.org/index.php and https://www.gutenberg.org/ which provide DRM-Free copies in multiple formats.

      These are great but a few of my ebooks are from less trusted sources so handling the security aspects should be considered as well. (Example: An interesting PDF from Hacker News or Reddit)

      General:
      For general organization and management, Calibre (https://calibre-ebook.com/) has been very useful so far. You can use Calibre to handle converting, meta-data, reading, and organization of your library.

      Security:
      From what I can research the epub and pdf formats can be both vulnerable to malicious but the potential is much higher for pdf. As you then might expect, pdf exploits are more common.

      A few precautions you can take include using your browsers pdf viewer versus a standalone alternative, using an up to date and secure pdf reading with JavaScript disabled, or relying on a cloud service such as google drive that allows online viewing.

      An offline e-reader is another easy solution as the malicious code would require a much more specific attack vector.

      Reading:
      https://us.norton.com/internetsecurity-emerging-threats-is-it-safe-to-download-free-ebooks-online.html
      https://www.baldurbjarnason.com/notes/epub-javascript-security/

      12 votes
    35. I have used Android my entire life. Then I acquired four Apple devices in a week.

      Hi Tilderinos! As the title says, I have used Android almost my entire life. Many parts of the internet (especially reddit) really look down on Apple for many reasons (may of them valid). Starting...

      Hi Tilderinos!

      As the title says, I have used Android almost my entire life. Many parts of the internet (especially reddit) really look down on Apple for many reasons (may of them valid). Starting about 3 weeks ago, I started to wonder if the grass really was greener on the other side. I would like to share my experience.

      My first smart device was an iPod tough 4th generation. Back then, iOS was really bad. Notifications took over the screen. If you didn't want to deal with a notification right then, you had to dismiss it permanently. Multitasking did not exist (until a few updates later) Android was miles better then. Switching was the obvious choice. Flash forward to now, through many different android devices. I had a Samsung Galaxy S10e, Galaxy Watch LTE, and Galaxy Buds. I had the best ecosystem of devices that Android has to offer (Tizen vs WearOS is arguable, but I have not used WearOS).

      I wanted to get back into mountain biking, and I wanted to bring only my buds and watch. This should be an obvious use case for an LTE watch and bluetooth earbuds. Unfortunately, transferring music to the watch is a difficult prospect. You must have the files downloaded onto your phone, but I use Spotify or Google Play Music. Spotify does have a Tizen app, but it is pretty terrible. Also, I wanted to have audiobooks and podcasts downloaded to listen to. I could not find any apps for audiobooks or podcasts for my Galaxy Watch. All my google-fu got me to the answer: Just transfer the files and play them in the watch music app. This was a pretty bad solution for a few reasons. First, listening times did not sync with the phone. Second, I don't think that the watch music app would save the timestamp when you closed it. Finally, the Galaxy Watch has 4gb storage, and only leaves around 2gb usable. Game of Thrones book 5 weighs in at about 1.3gb. If I wanted my book and even a single episode from most of my podcasts, that would not be enough storage.

      Because of this experience, I started looking into the Apple Watch. My grandfather gave me his old iPhone 6s+ and I got an Apple Watch series 3 LTE for a great deal on craigslist. I thought the phone would be a downgrade from an s10e. In a few ways it is, such as the screen, battery life, and camera. But for everything else about this phone, it is just as good as my s10e, which is 4 years newer. I still have my s10e, and I keep it charged. There are very few times where I want to use my s10e over my 6s+. This was not what I was expecting when I switched. I expected to use the 6s+ to see if I could handle a new iPhone, just so I could use an Apple Watch. Since then, I borrowed my dad's old MacBook Pro mid 2012 non-retina, to see if I liked OS X. I am currently typing this in that MacBook. I also bought the AirPods Pro.

      Almost every single interaction between these devices is quick, intuitive, and seamless. OS X is way better than windows. Parallels makes running windows software a dream. When I bought parallels, I was able to pay with my watch through Apple Pay. I have not heard of any software doing anything like that with google/samsung pay and windows. Overcast is able to automatically sync podcasts and playback times to the watch, and easily switch which device is playing. Audible is a bit more clunky (and I am still looking for an alternative for books), but it is possible to get books on the watch, and the playback time syncs without issue. The AirPods Pro seamlessly switch between the phone and watch. They are already paired with the MBP through iCloud, although they do not seamlessly switch. I think this is because the bluetooth chip in the computer is too old. CarPlay is miles better than android auto. Siri is just as good for most thing as google assistant, and is more consistent.

      This is a pretty long post already, but the bottom line is every single apple device I am trying out is better than the corresponding android/windows device that is 2-4 years newer. After many years of shunning apple, I am back on the apple bandwagon. I am currently planning on replacing all of my devices with something from apple (except my gaming desktop, unfortunately). I would like to hear about your experiences with switching to or from either ecosystem.

      (Mods: I wasn't sure if this should be in ~talk or ~tech. Please move it if necessary)

      19 votes
    36. Cellphone review: Umidigi F2

      I was recently in the market for a cheap used phone. I was looking for an Android device, preferably less than 3 years old, preferably with an unlockable bootloader and rootable, for $200 or less....

      I was recently in the market for a cheap used phone. I was looking for an Android device, preferably less than 3 years old, preferably with an unlockable bootloader and rootable, for $200 or less. I was looking at used Pixel 2's when I came across this weird Chinese manufacturer I'd never heard of.

      The Umidigi F2 is a bizarre device. I was blown away by the specs, and the seller was only asking $200CAD for it, so I took a chance. I've got to say, so far I'm pretty impressed.

      Quick Specs:

      • 6.5" IPS LCD, 2340x1080px, bezelless, w/ hole-punch camera, no notch
      • 6GB Dual-channel LPDDR4 RAM, 128GB Storage
      • Mediatek P70 - ARM Cortex A73/A53 Octo-core 2.0/2.1GHz CPU
      • 5 cameras, 32MP front-facing, 48MP rear, 13MP wide-angle, 5MP depth, 5MP macro
      • Dual SIM, MicroSD
      • 5150mAh battery
      • ~40 frequency bands
      • 3.5mm headphone jack
      • Stock Android 10

      At this price I was initially skeptical. There must be something wrong with it, some glaring flaw I wasn't seeing, and/or those specs must be fake. I'm happy to say though, they're real, and the device seems much more solid than I expected.

      I've had the thing a little over a week so far, and have only charged it once. On the first charge it lasted 4 days before I charged it, and still had 30% battery remaining after I'd spent a couple hours surfing the web and two hours watching youtube (total screen-on time was ~4.5hrs). After charging it I haven't been using it as much, but it's currently been running 3 days and it has 70% battery remaining. I've used it to listen to the radio for 3 hours this morning. Oh yeah, did I mention? Bizarrely, it has a FM radio tuner for some reason.

      So far everything has been smooth, the device performs really well, which is not something I expected from a Mediatek CPU. Rooting it went smoothly, and I've been able to tweak a bunch of settings via the EdXposed framework, as much as you can in Android 10 anyway. I did remove some background bloat, but otherwise the default ROM is very close to vanilla AOSP.

      The build quality of the thing is honestly not bad. I've used mid-range Samsung devices that have felt cheaper and more plastic-y than this. I have read some reports of bad touchscreens, but so far I haven't had any problems. There's also a DIY solution to solve that. Unfortunately, if it dies, this is pretty much my only option, since the warranty and support is pretty much nonexistent. At a quarter the price of a brand-name phone with similar specs though, I'm willing to roll those dice.

      So, other than warranty, what are the downsides? Well, so far the biggest gripe I have is there is no notification LED on it. So if I go to the washroom and come back I can't just tell at a glance if I've missed a call or text, I actually need to unlock it. Luckily the fingerprint reader and face unlock are both pretty reliable. There is no wireless charging, which I'm more or less okay with. The main reason I'd want that is if the USB port died, but again, this is the sort of phone that if anything is wrong with it you're pretty much meant to throw it out. The speaker is a bit tinny, and unfortunately it's mono. The cameras are bad. The 48MP camera does take 8000x6000 pictures, but they're grainy to the point where even if you resize them down they still look worse than something taken with a good 6MP camera. This seems to be a software problem though. The camera module is apparently made by Samsung, and people have said it's gotten better with every OTA update. As for that, there's been an update this month, but a lot of people are expecting it might be the last update they put out. Umidigi apparently has a bad track record of only providing updates for a few months.

      In conclusion, this is objectively a decent phone, and for it's price, it's exceptional. You sacrifice warranty, updates, any kind of support really, but you get some very decent hardware for $200.

      Official site: https://www.umidigi.com/page-umidigi_f2_specification.html
      Purchasable on amazon for fast shipping, purchase on aliexpress to save $50.

      9 votes
    37. [SOLVED] Tech support request: Broken start menu on Windows 10

      Solved! Thanks to @pseudolobster's post here, I was able to resolve the issue by creating a new user account on the computer. I'm leaving the post up for posterity, in case anyone else is ever...

      Solved!

      Thanks to @pseudolobster's post here, I was able to resolve the issue by creating a new user account on the computer. I'm leaving the post up for posterity, in case anyone else is ever searching up this same issue in the future.


      My husband is starting to transition to work from home. He is using his personal computer and just yesterday set up a VPN, Microsoft Teams, and Windows' built-in remote desktop so that he can access his work computer. Everything worked smoothly and he was able to finish out his workday from home just fine.

      Primary Issue

      This morning, upon booting his computer, he cannot access his Start Menu. It is on screen, and it appears clickable, but nothing comes up. Likewise, the search bar in his task bar is present on boot, but upon clicking the start menu for the first time it disappears and does not return. Other basic Windows functionality seems to be broken. Alt-tabbing does not work to switch between windows. System tray icons are present, but right clicking them and selecting an option does nothing. We cannot open taskbar settings or network settings this way, for example.

      This might be indicative of a larger breakdown. Even by command line, I can't get to the Windows 10 settings or Windows Update. It seems like all of the "new Windows"-style interfaces won't start (though the old ones, like the Control Panel, do).

      We can still open up apps by clicking on the links in his taskbar, and those seem to work fine. I can also get to the run command with Win+R.

      He is running Windows 10, and as far as I know, it's fully up-to-date (I can't open Windows Update to check).

      Additional Information

      In attempting to diagnose this issue, I've come across several others that are potentially related. I don't know if these are relevant and they're not a primary concern at the moment, but I'm including them here in case they help contextualize what's going on.

      There seems to be a runaway process that slowly eats up more and more memory over time, as well as a chunk of CPU. Sometimes it's called "Service Host: Windows Push Notifications User Service_#####" and sometimes it's called "Service Host: WpnUserService_#####" with the numbers changing each boot.

      Also, in attempting to restart the computer, it sometimes (but not always) pauses with a notification about programs still running, with one of them being "Task Host Window" with the message Task Host is stopping background tasks. (\Microsoft\Windows\Plug and Play\Device Install Reboot Required) Finally, immediately before restarting, it shows an error message from "svchost.exe" which reads The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.

      Is this potentially a malware/intrusion issue?

      Attempted Solutions

      I have tried, to no success:

      • Rebooting the computer, both via a restart in Windows as well as by holding down the power button
      • Signing out and back in to his user account on the computer
      • Running sfc /scannow
      • Running DISM.exe /Online /Cleanup-image /Restorehealth

      Request for Help

      I know we have a lot of techy people here, but I also know you are all probably busy with everything that's going on. Nevertheless, if anyone has any guidance or help they could give on this issue, I'd greatly appreciate it.

      Also, it's been a while since I've used Windows, but IIRC there's a way of just resetting the whole thing and starting fresh? That's not ideal, but if that's the course of action I need to take, just let me know. Ultimately I just want this to work, by whatever method, so that my husband can be at home and reduce his exposure.

      7 votes