• Activity
  • Votes
  • Comments
  • New
  • All activity
    1. Fortnightly Programming Q&A Thread

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads. Don't forget to format your code using the triple...

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads.

      Don't forget to format your code using the triple backticks or tildes:

      Here is my schema:
      
      ```sql
      CREATE TABLE article_to_warehouse (
        article_id   INTEGER
      , warehouse_id INTEGER
      )
      ;
      ```
      
      How do I add a `UNIQUE` constraint?
      
      9 votes
    2. Play Chess against GPT-2

      @theshawwn: I am preparing to release a notebook where you can play chess vs GPT-2. If anyone wants to help beta test it: 1. visit https://t.co/CpWrFvtnY2 2. open in playground mode 3. click Runtime -> Run All 4. Scroll to the bottommost cell and wait 6 minutes If you get stuck, tell me.

      5 votes
    3. Hard drive dying, trying to save a VM

      I have a large VirtualBox VM on an external HDD. The HDD fails the S.M.A.R.T. test. The VM still works fine, but any regular attempt to copy the VM files over to a healthy drive fails ... there is...

      I have a large VirtualBox VM on an external HDD. The HDD fails the S.M.A.R.T. test. The VM still works fine, but any regular attempt to copy the VM files over to a healthy drive fails ... there is clearly already something corrupt in the VM's virtual HDD, although it is not (apparently? yet?) affecting the functionality of the actual VM.

      Any suggestions on how to save the VM? Linux Mint Guest OS, Pop_OS (Ubuntu) Host. The VM is nearly 800 GB. Both regular copy and rsync fail.

      Thanks,
      Eric

      PS: (and perhaps I should have led with this, but...) is it okay to ask these kinds of specific, technical, "help me with my tech-stuff" questions here on Tildes?


      Update to the update ... moved update info into a comment ... will keep my progress updated in that primary comment.

      Danke, y gracias to all

      14 votes
    4. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      12 votes
    5. Exotic threats in mobile testing...

      I'm currently in the process of reading the excellent "Lessons Learned in Software Testing: A Context-Driven Approach". Early on the following is mentioned. Test common threats before exotic...

      I'm currently in the process of reading the excellent "Lessons Learned in Software Testing: A Context-Driven Approach". Early on the following is mentioned.

      Test common threats before exotic threats.

      Seems reasonable enough. That said, it got me thinking It'd be cool to generate a list of such threats for future devs/testers to draw on. So...I'm calling on the collective experience of any Tilders involved in iOS or Android development to lend a hand.

      In your time working on mobile, what issues have you encountered that you would you classify as exotic? I.e those issues that infrequently arise but when they do can cause major damage. Any and all help is appreciated.

      4 votes
    6. Choosing a new printer

      I'm thinking about getting a new printer. My needs are basically to print out textual documents 2-3 times per month from macOS. I don't need to print photos. I will not buy an inkjet because of...

      I'm thinking about getting a new printer. My needs are basically to print out textual documents 2-3 times per month from macOS. I don't need to print photos. I will not buy an inkjet because of the outrageous price of the ink. I would like to have fax support (my spouse sees a lot of doctors and they still use fax machines a lot, and we're not comfortable sending personal medical info via a fax service on the web), and it would be nice if we could also scan documents. So I'm thinking a multi-function device.

      We currently have a Brother 7840W MFC with print, fax, copy, and scan. It's over 10 years old (maybe 15?) and I dislike it. It's been slowly losing functionality over the past 5+ years. The WiFi went out, but I was able to connect it via wired ethernet to a computer and share it from there. The drivers insist that there's a paper jam, but there isn't and it prints just fine (but sounds like some of the internal mechanical components are going to die any day now.) The UI of the printer is awful. I recall having to use the phone pad to enter my WiFi password, and it was like texting on a Motorola StarTAC. (Like if you want the letter "C" press the number "2" three times, etc.) The drivers and related software don't work like normal macOS software. (Disclosure: I also once wrote a scanner driver for Brother and it was horrible, but they shipped it, so I'm not real comfortable putting their software on my computer. But that was 25 years ago, so maybe they're better now?)

      I've heard horrible things about the drivers and software of most other major printer makers - HP, Epson, Lexmark, etc. I'm guessing what I'm looking for doesn't exist, but I just want a multi-function device in as small a package as is reasonable, and with a UI on the device and software that doesn't suck and that won't die on me in < 5 years. Does such a thing exist?

      17 votes
    7. Ask Tildes: Design practices for retrieving dozens (or hundreds) of related records over a RESTful API

      I'm looking for some feedback on a feasible mechanism for structuring a few API endpoints where a purely RFC-spec compliant REST API wouldn't suffice. I have an endpoint which returns $child...

      I'm looking for some feedback on a feasible mechanism for structuring a few API endpoints where a purely RFC-spec compliant REST API wouldn't suffice.

      I have an endpoint which returns $child entries for a $parent resource, let's call it: /api/parent/:parentId/children. There could be anywhere from a dozen to several hundred children returned from this call. From here, a child entity is related to a single userOrganization, which itself is a pivoting entity on a single user. The relationship between a child and user is not strictly transitive, but can each child only has one userOrganization which only has one user, so it is trivial to reach a user from a child resource.

      Given this, the data I need for the particular request involves retrieving all user's for a parent. The obvious, and incorrect solution to the problem is to make the request mentioned above, and then iterate through and make an API request to retrieve each user. This is less than very good as this would obviously be up to several hundred API calls.

      There's a few more scalable solutions that could solve this problem, so any input on these ideas is great; but if you have a better proposal that also works, I'm keen to explore that!

      Include user relationships in the call by default.

      This certainly does solve the problem, but it's also pumping down a load of data I don't necessarily need. This would probably 2x the amount of bytes travelling along the wire, and in 8 out of 10 calls, that extra data isn't needed.

      Have a separate /api/parent/:parentId/users call.

      Another option that partially solves the issue: I need data from both the child and the user to format this view, so I'd still need to make the initial call I documented earlier. Semantically, it feels a bit odd to have this as a resource because I don't consider a user to be nested under a parent in terms of database topology.

      Keep the original call, but add a query parameter to fetch the extra data

      This comes across as the 'least worst' idea objectively, in terms of flexibility and design. Through the addition of the query parameter, you could optionally retrieve the relationship's data. This seems brittle and doesn't scale well to other endpoints where it could be useful though.

      Utilize a Stripe expands-style query parameter.

      Stripe implements the ability to retrieve all related records from an API endpoint by specifying the relations as strings. This is essentially the same as the above answer, but is scaled to all available API endpoints. I love this idea, but implementing it in a secure way seems fraught with disaster. For example, this is a multi-tenancied application, and it would be trivial to request userOrganization.user.organizations.users. This would retrieve all other organisations for the user, and their users! This is because my implementation of expands simply utilises the ORM of my choice to perform a database join, and of course the database has no knowledge about application tenancy!


      Now, I do realise this problem could easily be solved by implementing a GraphQL API server, which I have done in the past, but unfortunately time and workload constraints dictate implementing a GraphQL-based solution is infeasible. As much as I like GraphQL, I'm not as proficient in that area as compared to implementing high quality traditional APIs, and the applications I'm working on at the moment are focusing on choosing boring technology, and not using excessive innovation tokens.

      Furthermore, I do consider the conceptuals around REST APIs to be more of an aspirational sliding scale, rather than a well defined physical entity, because let's face it, the majority of popular APIs today aren't REST-compliant, even Stripe's isn't, and it's usually both financially healthier and feature-rich to choose a development path that results in a rough product that can be refined later, than aiming for a perfect initial release. All this said, I don't mind proposals or solutions to my problem that are "good enough". As long as they aren't too hacky! :)

      10 votes
    8. Announcing the alpha release of Intergrid

      Intergrid is an online outliner and note-taking app. It's inspired by – and in many ways replicates – Indigrid, except it's on the Web. It's free to use, and it's readily available right from the...

      Intergrid is an online outliner and note-taking app. It's inspired by – and in many ways replicates – Indigrid, except it's on the Web. It's free to use, and it's readily available right from the main page.

      Why Intergrid?

      The main goal of Intergrid is to help you focus on the notes.

      There are no settings. You can't pick the font. Theming is not an option. There's only content, and what you want to do with it.

      Plus, it looks cool.

      Is it feature-complete?

      Hell no. It's been in development for three months – which is to say, not very long. It still has ways to go.

      Which is why I'm keeping the initial release rather quiet: Tildes and a handful of friends are the only people to know about it so far.

      Are there bugs?

      Afraid so. There are some I know about, and there are probably some I couldn't even reach.

      Why release it, then?

      Because it works already. You can add, edit, and save your notes in-browser. As long as you have cookies enabled, it will serve you. (Intergrid doesn't use cookies, and has no tracking to speak of, but the permission for localStorage – the technology used to store and gather data about your notes – is adjacent, as far as browsers are concerned.)

      It would be of particular use to people on systems other than Windows. While the current version is focused on desktops, future versions may gain mobile support – all the more likely because, outside from a handful of hardcoded interactions and design considerations, there's nothing preventing mobile users from enjoying the app.

      There's also the pragmatic reason: something Jeff Atwood called "Always Be Shipping", all the way back in 2007. You can't get feedback on an app that has no public version. Your programming expertise and design sense will only get you so far. Getting it out there – and going forward with the feedback – is a generous part of the process.

      Where are you planning to take it?

      The first step would be the fix the bugs. There will be a list of known ones in the comments.

      Once those are fixed (or can be postponed without repercussions to being able to use the app), there are features I'm going to implement within the next couple of months. Most of them, at least initially, are going to be put in to keep up with Indigrid's feature set.

      • Views: open, move, and close columns, each hosting a different view on the notes, allowing you to gain perspective or edit multiple ideas simulatenously

      • Bookmarks: store views as separate named bookmarks, allowing you to traverse different mental spaces within the notes

      • Action History and Undo/Redo: record changes to the notes and time-travel between its different states, because sometimes, you want to be able to "go there" and not be weighted down by rock-solid commitment

      • Offline Use: work with your notes even when the Internet is down

      (Even though the code for columns is already in the development branch, I was unable to come up with a respectable way of handling it before New Year, which is when I promised to release the app.)

      In the long term, I'd like to make sure you could access your notes from any browser on any device. This plan also includes the ability to create and share read-only or editable partial copies of your notes – for example, as presentation or a basis for an online discussion. After finishing with shaping up the current, local-only version, this is where want to take the development. I reckon it would take me somewhere between 6 and 12 months to finish the codebase for this.

      Anything else I should know?

      Do keep in mind that this is an early release. There may be bugs – perhaps even the kind that will rid you of your notes. If you're uncomfortable about using software this early in development, please don't: your sanity is dearer to me than getting users.

      It will, however, get stable over time. If there's ever a breaking change on the horizon – the kind of change that will change an aspect of Intergrid radically – users will be notified about it at least two weeks ahead, so that at least they could backup their notes. I want to ensure the safety of mind for the users of Intergrid, so that they know their notes are in safe hands.

      That said, make regular backups anyway. The nodes are encoded/decoded as indented plain text, which means they can be transferred to and from a simple textfile with copy/paste. Any single whitespace character – space, tab etc. – is considered one level of indentation, so it doesn't matter how you indent your plain-text notes: they will be aligned as you'd expect. Intergrid and Indigrid both export tab-indented text.

      Can I help?

      From the coding and design perspective, I would appreciate open-source involvement. However, at this stage, even though there's a repository awaiting changes, I'm uncomfortable making it public just yet, because licensing is hard and I don't want to get into any sort of legal trouble without at least understanding what I'm dealing with.

      Once this and other aspects of open-sourcing the code are dealt with, I'm going to post another update.

      If you'd like to support the development financially, you could donate via PayPal.me. The first $5 or so will go to supporting the infrastructure: the monthly hosting payment and 1/12th of the yearly domain name price. (Even though the domain name has been paid for for the next two years, I'd like to be able to host the app reliably. The domain name is directly tied to the data saved – you can't access another website's saved data unless they're on the same main domain – which is why it's important to keep it.)

      Check out Intergrid

      19 votes
    9. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      13 votes
    10. Day 25: Cryostasis

      Today's problem description: https://adventofcode.com/2019/day/25 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/2019/day/25


      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>
      
      5 votes
    11. Day 24: Planet of Discord

      Today's problem description: https://adventofcode.com/2019/day/24 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/2019/day/24


      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>
      
      4 votes
    12. Day 23: Category Six

      Today's problem description: https://adventofcode.com/2019/day/23 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/2019/day/23


      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>
      
      5 votes
    13. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      11 votes
    14. Day 10: Monitoring Station

      Today's problem description: https://adventofcode.com/2019/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/2019/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>
      
      8 votes
    15. Day 15: Oxygen System

      Today's problem description: https://adventofcode.com/2019/day/15 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/2019/day/15


      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>
      
      6 votes
    16. Day 22: Slam Shuffle

      Today's problem description: https://adventofcode.com/2019/day/22 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/2019/day/22


      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>
      
      6 votes
    17. Day 14: Space Stoichiometry

      Today's problem description: https://adventofcode.com/2019/day/14 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/2019/day/14


      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>
      
      8 votes
    18. Day 21: Springdroid Adventure

      Today's problem description: https://adventofcode.com/2019/day/21 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/2019/day/21


      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>
      
      5 votes
    19. Day 20: Donut Maze

      Today's problem description: https://adventofcode.com/2019/day/20 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/2019/day/20


      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>
      
      5 votes
    20. Day 7: Amplification Circuit

      Today's problem description: https://adventofcode.com/2019/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/2019/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>
      
      10 votes
    21. Day 18: Many-Worlds Interpretation

      Today's problem description: https://adventofcode.com/2019/day/18 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/2019/day/18


      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>
      
      8 votes
    22. Day 19: Tractor Beam

      Today's problem description: https://adventofcode.com/2019/day/19 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/2019/day/19


      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>
      
      6 votes
    23. Day 6: Universal Orbit Map

      Today's problem description: https://adventofcode.com/2019/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/2019/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>
      
      11 votes
    24. Day 17: Set and Forget

      Today's problem description: https://adventofcode.com/2019/day/17 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/2019/day/17


      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>
      
      7 votes
    25. Day 16: Flawed Frequency Transmission

      Today's problem description: https://adventofcode.com/2019/day/16 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/2019/day/16


      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>
      
      6 votes
    26. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      13 votes
    27. Day 13: Care Package

      Today's problem description: https://adventofcode.com/2019/day/13 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/2019/day/13


      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>
      
      8 votes