Linux touchpad mini-update

A few tiny notes from the land of Linux touchpad improvements:

  1. If you’d like to ensure you’re notified when I have substantive updates on the touchpad driver, I’ve setup a subscription list here: https://tinyletter.com/inedibill. It will be used only for sending updates about the touchpad driver, so probably no more than one email every couplefew months
  2. Matt Mayfield has been doing hero’s work on ensuring that Linux touchpad driver can successfully discard thumb input. His commits to this end are in this branch. In using the libinput debug tool, it’s apparent that Matt’s branch is excellent at allowing a second finger to rest on the touchpad while still taking the active finger input as cursor movement, whereas the latest libinput release tends to interpret any cursor movement with an extra finger down as scrolling. We’re working to make it possible to download an installable version of Matt’s changes soon.
  3. I’ve begun the process of attempting to enumerate the acceleration differences between Linux and Mac here. If anyone else wants to take a stab at concisely describing how acceleration differs on macOS vs Linux touchpad, feel free to drop me a line at bill -at- staticobject.com and I’ll aim to incorporate your findings.

Hoping to have a more robust update on this in the next couple months, or when we get an installable driver available (if sooner).

Native emoji support (color emojis) in arch Linux

If you’re on Arch, and you use sites with native emojis like Amplenote, you probably get pretty tired of seeing empty black boxes wherever emojis are supposed to be. However, Google isn’t especially forthcoming about the easiest path to fix that.

My experience is that what you want is the ttf-emojione package from AUR. The easiest way to install it is via the Add/Remove Software app:

If the command line is more your speed, you should be able to install it via yaourt -S ttf-emojione

After you’ve installed the package, you’ll need to log out and log in for the emojis to show in their full color glory. Here’s a test of whether your handiwork was successful: ūü§Ēūü§Ēūü§Ē

Linux touchpad like a Macbook: progress and a call for help

The note sourced to create this blog post lives here. I’ll copy updates to the blog from that note every so often, but the note will be more updated. And the note has a couple footnotes this version doesn’t support. That aside…

It’s taken me longer than I’d hoped to craft a follow up to my viral blog post on… Linux touchpad drivers (what a weird sentence to write). I’d hoped to find 10 or 20 people who shared my belief that Linux touchpads are in a sorry state. Turns out, a niche OS with a subjective quality issue is — in this case — a topic that’s important to thousands. So much so that several commenters on the last blog indicated willingness to donate time or money to improve the plight of this beleaguered driver.

If this collective will can be harnessed, we have a golden opportunity for developers to escape the limitations imposed by modern Apple hardware. Hardware manufacturers are doing their part. There are already laptops that compare favorably against Macbook on tech specs and price. Now, we “just” need software that approximates the fit-and-finish of using a Macbook. Modern day Linux is getting very close: my most recent Linux laptop is the first I’ve ever owned where waking from sleep mode reliably works. ‚ėē

The crux of the challenge is that we need to objectively fix a subjective problem. After spending the past year examining the challenges, here’s how I think we can do it:

Define the goal

To create a touchpad solution for Linux that serves as many users as possible, we want to be maximally objective in describing what we aim to deliver.

My first idea to be objective was to quantify how the cursor worked on OS X, and create a suite of tests we’d use to guide development. That turned out to be a misadventure, for circumstantial reasons.

My second idea is my current preferred plan forward:

1) to fork libinput (overview doc, contributor docs, source), and

2) find up to three developers dedicated to making a measurably better driver.

Why start from libinput instead of building from scratch or another driver? The following line of reasoning from Peter Hutterer (libinput maintainer), persuaded me:

Don’t start from scratch. your goal is for this to be eventually used, at which point libinput is your only option. for any other approach you’ll have to a) stick to xorg only or b) convince every wayland compositor to implement support for your driver (and that you’ll maintain that driver for the upcoming future). given that Fedora already defaults to Wayland, a) isn’t really an option and b) is not likely to happen.

In addition to its Wayland integration, libinput is already built to support Xorg via xf86-input-libinput.

Why three developers for six months? Because any more than three developers A) is unrealistic to expect B) harder to coordinate C) leaves responsibility too open-ended. Why six months? Because the Static Object’s metrics suggest that should be enough time to make a significant impact on this project [footnote describes gradual pace of progress in project]. It’s easy to imagine we could begin seeing noticeable improvements to touchpad tracking accuracy within a couple months of starting development.

I believe the most serious flaw in my plan is the subjectivity around how, specifically, the cursor should behave. Practically speaking, we won’t be able to perfectly clone Apple’s touchpad behavior. So, in place of an objectively provable target, we’ll work from a shared set of intentions:

Project deliverables

  1. Linux touchpad scores on par with Macbook touchpad per mouseaccuracy.com testing. As of today, I can consistently score twice as high on macOS (average score 250 with “Hard” + “Small” options) vs Linux (average score ~100).
  2. Visual or terminal-based means to configure rudimentary touchpad settings. The fewest options I could imagine supporting for v1 would be: scroll speed/acceleration, scroll speed, natural scrolling toggle, hopefully support for gestures.
  3. First-class palm and thumb detection/ignoring
  4. Possess a means to submit bugs and have them addressed (via Github issues)
  5. “Feels like a Macbook” to greatest extent possible

We would seek to achieve these modest goals only on modern laptop hardware, eg purchased within last 2-3 years. Broader support should follow.

This project’s grand vision will be realized when its users forget it exists. ūüéČ

Next steps

What are the next steps on the Linux touchpad roadmap?

How I will help this move forward

  1. Accountability updates. If this post succeeds in wrangling a couple developers to move this project forward, I commit to posting at least one public update per quarter on the status of the project.
  2. Functional quality assurance lead. I will monitor our progress toward the “Project Deliverables,” and help coordinate QA resources during development.
  3. Corporate fundraiser. Reach out to companies that would stand to benefit from sponsoring better Linux touchpad performance, provided others can point me toward the appropriate contacts.
  4. Information conduit. I’ve collected about 20 notes worth of information about Linux touchpad drivers over the past year. Perhaps some of these would assist new project participants trying to get up to speed?

Help I need from others to move forward

Can you help advance this cause? Here’s what we need:

  1. Commit to hack on the project. We need 1-3 developers who can commit to pursuing the Project Deliverables over at least 3 part-time months (preferably 6-12 months). I can coordinate matching developers skills to areas of project need. Since libinput is mostly composed of C, experience in that language will be a big plus.
  2. Got contacts? If anyone reading this knows the decision makers at companies who might like to support a popular project, help me out with an e-intro? If we can find a benevolent corporate ally (Microsoft? Google?), we could potentially leverage their resources to fund a full time developer for some months.
  3. Evaluate Chrome OS touchpad driver. See my “Tangential Opportunity to Help” memo. I consider this avenue a longshot to be the long-term solution for a Linux touchpad driver, but in the short term, it might be a viable driver for Linux users until the long-term solution is built.
  4. Got knowledge? I’ve become a lot more of a Linux touchpad expert than I’d ever hoped, but there are still people like Peter who know a lot more than I do about the interplay between the kernel, Wayland, and the input driver. I’d love to have contact info for a couple experienced Linux OSS-familiar devs who could accelerate my future research.

If you can help with any of these: please drop a line in the blog comments, or email bill at staticobject.com

Into a future less bound to Apple’s whims

All of the above plan is subject to change if better evidence/ideas are presented. I’m a pragmatist at heart, and the proposed plan is the most realistic path I can conceive to deliver a better Linux touchpad experience before the end of 2019. There’s low-hanging fruit to be picked. The touchpad driver most Linux users are currently utilizing (libinput) is developed part time, by a single developer (thanks Peter!).

There’s never been a broad mandate to make Linux touchpads pleasant to use. With your help driving attention to this issue, we can change that.

Measuring developer productivity in 2019

Until I spent the better part of 50 hours writing this guide about measuring developer productivity, I had little appreciation for how far we’ve come in the past four years. If you’re an engineering manager, there’s a growing body of data that suggests you can make a blanket increase in engineering efficacy. If you’re a great developer, you now stand to earn your due. These are exciting times to be programming.

Additional topics covered in the (admittedly a bit too epic) guide:

If you manage developers, would love to hear what you think of this effort? Is it relevant to you? Anything that could make it better?

Best interview questions to ask candidate interviewees

It’s too hard to find the best interview questions. Even though it’s widely acknowledged that “hiring right” is¬†the make-or-break duty of every growing business, finding the perfect interview question requires¬†sifting through a compendium of books, blogs, and brains.

As a boss, what I want is a broad list of great interview questions, organized by the quality I wish to¬†evaluate (e.g., “hard worker,” “focused,” “team player”). So that’s what I’ve compiled, below.

Read more about the methodology at the bottom of this post, following the questions. tl; dr it involved selectively extracting from all the best books and blog posts I could find in a week of research.

Part one: the most sought-after traits in employees

The most sought-after traits have been broken into four tiers, based on the frequency with which they were mentioned in first-page¬†search¬†results. If you only have an hour for your interview, you probably don’t want to go very in-depth on more than 3 different areas. A popular strategy at bigger companies is to share different areas of evaluation between the team. It helps to ensure that you won’t miss a fatal weakness of the applicant.

If you are going to interview collaboratively, remember that some questions are duplicated between sections. Don’t be that interviewer who¬†repeats a question from the previous interviewer.

Tier One

There is one talent that almost every blog & book regards as critical. Apparently, businesses don’t want to hire a candidate that causes drama and resists management?

  • Team player. Are they friendly, agreeable and upbeat?

Tier Two

These qualities were cited by 75% of publications surveyed, which is to say they are important to virtually every company. “Honesty” is one of the hardest qualities to evaluate in an interview context, but I’ve found a handful of¬†questions to penetrate the interview defenses.

Tier Three

Qualities that were mentioned by roughly half the sources surveyed. Many of the most critical talents Bonanza seeks are located here.

  • Communicator. Do they know how to wield language and be tactful?
  • Leadership. Does this candidate have the tools to be a leader?
  • Ambitious. Every business wants a team that is self-motivated and hard-working
  • Focused. Can they possibly eschew Facebook, Twitter, IM, Hacker News, et al. for eight hours?
  • Problem-solving. Can they work autonomously, surmounting challenges and making decisions lacking manager intervention?
  • Intelligent. Does this candidate have the raw smarts to be proficient at their job?
  • Organized. Can they keep track of the details and prioritize among choices?

Tier Four

These qualities weren’t mentioned as consistently across articles surveyed. It is my personal judgement that¬†they are still important to assess, depending on the role being filled.

  • Passionate. Are they excitable? Do they love their work?
  • Creative. Can they figure out novel solutions to problems?
  • Stable. Loyalty and dependability are essential to team morale.
  • Invested in us. Have they done the homework on the company they’re appyling to?
  • Meat & potatoes. Miscellaneous questions not to forget.

Part 2: My favorite interview questions

This list is the culmination of a week spent¬†combing the internet and popular books for great¬†interview question. I have attempted to choose¬†my favorite versions of the classic questions (e.g., “What’s your weakness?”) such that the¬†version chosen gives the candidate the opportunity to talk in the realm of specific examples.

Do note: some questions apply to more than one category, so are listed more than once. Don’t make a fool¬†of yourself in a collaborative¬†interview by asking the same question twice. Use your communication skills to coordinate questions¬†with your teammates.

Team player, friendly, agreeable, upbeat

  1. What do you think makes a person likeable?
  2. How would a co-worker who likes you describe you?
  3. How would a co-worker who dislikes you describe you?
  4. What qualities in your co-workers bother you most? Do you appreciate most?
  5. If I were to ask your current boss what your greatest strength is, what would he or she tell me?
  6. What do you have Strong Opinions about?
  7. Describe the boss who would get the very best work from you.
  8. What changes have you made in working with others to be more effective at work?
  9. What could you have done to improve your relationship with your worst boss?
  10. What’s a time you disagreed with a decision that was made by your boss? How did you handle it?
  11. Tell me about a time you had a conflict with a co-worker, and how you handled it?
  12. How do you deal with a difficult customer?
  13. What do you feel an employer owes an employee?
  14. Give an example of a time you misjudged someone
  15. When was the last time you were angry?
  16. Can you describe a time when your work was criticized?

Adaptable, flexible, eager to learn

  1. What do you think are the most important attributes of successful people? How do you rate yourself in those areas?
  2. If you could change one thing about yourself by snapping your fingers, what would it be and why? Do you have a plan for
  3. making that improvement?
  4. Tell me about competitor (or similar) businesses you kept up with in your past position. What did you glean from them?
  5. When have you failed? Describe what happened and what you learned from it.
  6. How do you take advantage of your strengths?
  7. How do you compensate for your weaknesses?
  8. What’s the most interesting thing you’ve learned in the past year?
  9. If you were starting college today, what classes would you take? (Alternative: What would you like to learn more about in the next year?)
  10. What books are you reading? (Alternative: What industry publications are your favorites?)
  11. Tell me about the last time you took a risk? Was it the right decision? What did you learn?
  12. How do you keep up with changes in your field?
  13. What was the most useful criticism you received?
  14. How do you measure your own success?

Trustworthy, honest

  1. Have you worked in a position where you felt you weren’t given enough to do?
  2. What was the most useful criticism you received?
  3. If I were to ask your current boss what your greatest weakness was, what would he or she tell me?
  4. Tell me about the last time you had to make an unpopular decision
  5. When have you failed? Describe what happened and what you learned from it.
  6. Tell me about a work incident in which you were totally honest, despite a potential risk or downside.
  7. What’s your greatest fear about this opportunity?
  8. Where does your boss think you are now? [Ed: answer doesn’t matter, smell of truthfulness in response does]
  9. If I looked through your web browser history, what would I learn that isn’t on your resume?
  10. Tell me about some of the gaps in your employment. How did these come about?
  11. May I contact your current employer? May I contact your references?
  12. Why shouldn’t I hire you?

Culture fit, compatible personality

  1. Describe the boss who would get the very best work from you
  2. What will make you love coming to work here everyday?
  3. What type of work environment do you prefer?
  4. What gets you excited outside of work?
  5. If I looked through your web browser history, what would I learn that isn’t on your resume?
  6. Assume that you come to work here. One year from now you go home one Friday evening thinking that accepting this job was the best thing you ever did. What happened during the year for you to feel that way?
  7. How much time per week do you spend working alone? Do you think it should be more or less?
  8. How competitive are you?
  9. Do you have a favorite quote?
  10. What unique experiences separate you from other candidates?
  11. What are the most important rewards you expect to get from your career?
  12. Where do you see yourself in five years?
  13. Which areas of your work are most often praised?
  14. Tell me about the funniest role you’ve had on a job/project?
  15. When you are on vacation, what do you miss most about work?
  16. How would you describe yourself to a stranger at a party?
  17. How do you incorporate fun into your day?

Communicator, tactful

See also: “Team player

  1. Why are you leaving your current job?
  2. Have you given presentations to your peers, either at work or in other contexts?
  3. See that picture frame on the wall? Sell it to me.
  4. What’s a time you disagreed with a decision that was made by your boss? (Alternate: If you know your boss is¬†100% wrong about something, how would you handle it?)
  5. If you feel strongly about an idea, but a person doesn’t agree with you, what tactics would you use to persuade¬†them?
  6. What’s your greatest fear about this opportunity?
  7. Describe a time where you put in extra effort to make sure a person with whom you were communicating had really understood your point.
  8. Describe a situation in which you dealt with a difficult customer
  9. Why shouldn’t we hire you?
  10. What do you think we could do better or differently?

Leadership

  1. How do you motivate people?
  2. What do you think are the most important attributes of successful leaders?
  3. Tell me about the last time you had to make an unpopular decision
  4. Tell me about the last time you fired someone
  5. How do you decide what tasks to delegate to whom?
  6. How do you bring other team members into your process? (Alternate: How do you get others on board with your decisions?)
  7. Did you inaugurate new processes in your previous position? Tell me about them
  8. Have you been in charge of a budget? How did you balance priorities?
  9. What’s the most difficult part of being a manager for you?
  10. What do your reports find most difficult about your management style?
  11. How do you set expectations with your reports or peers? How do you handle a situation where a report fails to meet expectations (e.g., consistently missing deadlines)?
  12. Describe a situation where you successfully resolved a conflict with a team member.
  13. Would you rather be liked or feared?
  14. Describe a crisis you faced at work. What was your role? How did you resolve it? What were the results?
  15. Do you have a management philosophy? No.

Ambitious, self-motivated, hard-working

See also: “Invested in us

  1. What would your first 30, 60, 90 days look like in this role?
  2. What extracurricular activities were you involved with in college? Since?
  3. What side projects have you done? What was the biggest?
  4. Tell me something that happened at work in the last year that made it a truly great day.
  5. Have you been promoted in past jobs? How did these promotions come about?
  6. Describe a situation in your past job where you were proactive? (Alternate: Give me an example from a previous job where¬†you’ve shown initiative)
  7. When did you first start doing [the job’s requirement]? [Ed note: if they started doing it before required in school, suggests self-starter]
  8. How do you keep up with changes in your field?
  9. How competitive are you?
  10. What are your short range goals and objectives?
  11. Give me an example of a goal you set in the past and how you went about reaching it?
  12. Where do you see yourself in five years?
  13. Do you take work home with you?
  14. How ambitious are you? No.

Focused, tenacious

  1. What are your strategies for making the most of your day?
  2. What do you do when things are slow? (You are lacking for projects)
  3. What do you do when you’re burned out to rekindle your spark?
  4. If you’re struggling with an idea, how do you break through and find a solution?
  5. How do you pass time while waiting for [job specific pause point, like compiling a program]?
  6. Describe a time where you put in extra effort to improve a business process to be more efficient?
  7. What percentage of your time is spent on each of your job responsibilities? [Answer matters less than whether they seem to keep track of it]

Problem-solving, self-sufficient, autonomous, decisive

See also: “creative.”

  1. Describe a time when you were asked to do something you weren’t trained to do. How did you handle it?
  2. Tell me about a time when you made a decision without all the information you needed.
  3. Can you tell me about a time when you discovered a more efficient way to do a routine task? Have you done this repeatedly?
  4. What are some of the Google tricks you use to find answers to your questions?
  5. How do you decide whether to message your boss when you have a tough problem?
  6. How many dentists are there in Poland?
  7. How would you build a toaster for a blind person?
  8. See that picture frame on the wall? Sell it to me.
  9. Tell me about the last time you took a risk? Was it the right decision? What would you have done differently?
  10. Can you think of a time where you were forced to take charge when your manager wasn’t available?
  11. Have you worked in a position where you felt you weren’t given enough to do?
  12. What was the most important task you’ve ever had?

Intelligent, proficient, competent

  1. What are you especially good at compared to others?
  2. Have you been promoted in past jobs? How did these promotions come about?
  3. What’s the one accomplishment you’re most proud of? Why?
  4. What is your greatest professional achievement?
  5. What’s your greatest fear about this opportunity?
  6. Tell me something that happened at work in the last year that made it a truly great day
  7. How would you rate yourself in terms of speed, quality, and self-direction? [Ed: Can they answer a multi-part question?]
  8. In what college courses did you get the worst grades? Why? How do you think it’ll effect your job performance?
  9. Tell me about the last time you took a risk? Was it the right decision? What would you have done differently?
  10. What do you consider to be the most important aspect of your craft?
  11. What do you consider to be the most misunderstood aspect of your craft?
  12. If I asked a co-worker friend what made you most valuable to the team, what would they say?

Organized, detail-oriented

  1. What would your first 30, 60, or 90 days look like in this role?
  2. Tell me about the first 60 minutes of your typical day
  3. What are your strategies for making the most of your day?
  4. Have you been in charge of a budget? How did you balance priorities?
  5. What do you do when you begin a project? How does this help the project go successfully?
  6. What tools do you use to maintain organization? How do you keep lists?
  7. Tell me about a project where you noticed a small detail that made a big difference?
  8. What percentage of your time is spent on each of your job responsibilities?
  9. Describe the top of your desk
  10. Do you always double-check your work? What’s your system for deciding?

Passionate, excitable

  1. What excites you about our company?
  2. What gets you excited outside of work?
  3. Describe the boss who would get the very best work from you.
  4. What are the most important rewards you expect to get from your career?
  5. If you had unlimited money, what would you be doing?

Creative

  1. Tell me about the last time you took a risk? Was it the right decision? What would you have done differently?
  2. Tell me about the last time you found a unique solution to a long-standing problem.
  3. Tell me about the last time you figured out how to save your company money? Did they heed your advice?
  4. Did you inaugurate new processes in your previous position?
  5. What improvements might you make to our business?
  6. Where do you draw inspiration for your craft from?

Stable, loyal, dependable

  1. Why are you leaving current job? Have you brought your concerns with your job to the attention of your boss?
  2. Is this the first time you’ve thought about leaving? What made you stay before?
  3. Why have you had so many jobs?
  4. How do we know you’ll stick around?
  5. Will your current job be surprised to hear you’re leaving?
  6. What aspect of our job appeals to you least?
  7. How does your ideal job stack up to what we’re offering?
  8. Have you been absent from work more than a few days in any previous position?

Invested in us

  1. What about this job most excites you?
  2. What about this company most excites you? (Alternative: What do you know about the company?)
  3. What do you think we could do better or differently?
  4. What advantage do we have over our competitors? (Who are our competitors?)
  5. How does your ideal job stack up to what we’re offering?
  6. Where do you see yourself in five years?
  7. What criteria are you using to choose companies you interview with?

Misc, administrative

  1. Tell me about yourself
  2. Which areas of your work are most often praised?
  3. Is there any question I haven’t asked you that I should?
  4. Salary range expectations?
  5. When can you start?
  6. Are you considering other offers?

Methodology

Settling on the definition for what makes a “great” interview question is a subjective affair.¬†There¬†were a couple rules I applied. I wanted questions that lead the candidate to talk about a¬†specific example; questions like “what’s your management style?” (a common question amongst my¬†sources [1]) are too vague to expect worthwhile insights in return.¬†When in doubt, I considered whether I would be annoyed to¬†get asked the question in an interview (e.g., “Give us one word that describes you“). If¬†so, it’s not on the list. 80% of questions evaluated are not on the list.

Once I decided what I was after, I purchased a handful of Amazon’s top-rated interview books, and¬†visited tens of Google’s top ranked pages on interviewing. Most of my sources are linked in the footnotes¬†[1][2].

Building a dataset from my research, I sought to make two determinations:

  1. What are the top 15 qualities that employers seek in an employee?
  2. What are the most succinct questions to evaluate those qualities?

The first goal was tricky, because often, sources will refer to the same idea in slightly different¬†ways (e.g., “adaptable,” “flexible,” or “willing to learn”). Some qualities, like “problem-solving” and¬†“creative” feel distinct, but related. In these cases, I added links between the two categories to help the reader¬†find related questions.

Still here? Hello!

I’d wager you would pass the “hard-working” and “tenacious” evaluation phases of the interview.¬†So why not check out the many jobs Bonanza is hiring for at the moment?¬†Everyone loves an interview where they know the questions in advance. ūüôā

Also: if you have a favorite interview question that I haven’t listed here, please share it in the comments! Around¬†10% of the questions above were from my personal collection, indicating there are likely still¬†more good questions lurking out there.

Footnotes

[1] Bibliography:

[2] I didn’t start documenting until around half way through my research, so the list isn’t quite comprehensive

Linux touchpad like a Macbook: goal worth pursuing?

Following is my proposal to improve the state of Linux touchpad drivers. It’s a cause I have spent almost a year of my spare time researching in depth. The first section, below, surveys the landscape of today’s available Linux touchpad drivers. The second section (“The Journey Here“) gets into greater depth describing the current failings of available choices. The third section (“The Path Forward“) proposes my best ideas for how we might be able to realize a Linux touchpad driver with polish level matching a Macbook Pro.

A survey of today’s Linux touchpad drivers

For the last 6 months, I’ve been trying to configure a Dell Precision laptop running Arch to get the same feel as the Macbook Pros I loved until the Touchbar Era. I started with the Arch default, libinput. I gave up on it in about a week, when I determined that something as simple as controlling the two-finger scroll speed was not included in the available options. The default was about 3x faster than the comfortable speed I’ve grown to love with my Macbooks. Had I not been disuaded by scroll speed, I might’ve still abandoned ship for the lack of scroll gliding (a feature I never knew I’d been using until it was taken away), which apparently I have Strong Opinions about.

Linux being Linux, I figured that I’d have a universe of touchpad drivers to choose from, each with its own awkward UI that would be confusing and painful to use, but ultimately get the job done. What I discovered instead was all of three options: one of which I had just eliminated (libinput), one that has been abandoned by its maintainers in favor of libinput (synaptics), and a third that was also abandoned by its maintainers, with zero graphical UI left behind (mtrack).

I’m writing this blog because I appreciate the nuances of how the Macbook touchpad performs, but the Touchbar Era has taught me that it sucks to have my user experience tied to the whims of a singleminded hardware company. I want to be part of the solution to create a Linux touchpad driver that’s indistinguishable from the Macbook, and has at least a minimal UI to accommodate the most common differences in user preference. I believe this would bring Linux hardware a big step closer to owning the same panache that makes the Macbook experience special. All evidence collected to date suggests that my mission may well prove quixotic. But if other people care about this, it could get done. I posit my ideas on a path forward here. If you’ve got time and want to learn more about what informs my opinions on the best path forward, read on…

The Journey Here

After realizing libinput wasn’t going to work for me, I found this blog post, whose title seduced me (“The perfect (almost) touchpad settings on Linux”). I went on to write my own follow up blog post, after discovering that the initial blog post left much to be desired compared to the Macbook standard I longed for. When it came to scroll speed and scroll glide, mtrack performed like a champ. Graphical UI be damned, I spent minutes — eventually hours — parsing the documentation. Between the 1,001 options available, I was optimistic about my prospects to recreate my Macbook utopia. And I would’ve done it, if not for the wretched nuisance I’d come to call “Cursor Nudge.” In a nutshell, “Cursor Nudge” is the phenomenon by which the center point of your depressed thumb will glide by a few millimeters as a natural effect of transitioning from the “move cursor” position to the “depress” position. None of mtrack’s 1,001 options could conquer Cursor Nudge, and eventually I grew weary of clicking right next to my target.

Down to my final shot, I really wanted synaptics to work. Yeah, it was abandonware, but it was abandonware that had been forsaken due to its multitude of options. A multitude of options seemed to be what I needed to replicate the Macbook. Initial results were promising: Cursor Nudge was not an issue with Synaptics. In fact, for my first few days using it, I found it pretty bearable. I wouldn’t confuse it with Macbook — not without the smooth acceleration and deceleration. Not with only the slighest twinge of scroll glide. Not with the need to click in the bottom right corner to effect a right click. But it was… probably satisfactory. If not for the bugs. About once or twice a day, when I put my thumb down to click or start scrolling, my open document would jerk toward the bottom of the scrollable viewing area. I Googled it. I installed the xinput listener, captured all my tracking input into logs, and tailed the logs to look for patterns that preceded the bug. And then I wondered, “does Apple still sell the pre-Touchbar Macbook?” Turns out, in what I can only interpret as tacit admission of their wrongdoing, they do. It doesn’t have enough RAM, and much of its technology is 10 years old. But its polish level remains eons beyond what I can replicate with Linux, and I refuse to carry around a mouse.

I also emailed the maintainer of libinput (previously maintainer of Synaptics). I asked him what it would take to write a Linux touchpad driver that would approach parity with the Macbook. His take wasn’t optimistic (“unless you raise enough money to hire at least one full-time developer there’s little point”). I have to imagine this is what naturally happens to a developer that has spent large swaths of a career worrying about backwards compatibility and subtle hardware differences. It sounds like a special type of hell he’s dealing with, and I appreciate the heroics that have gone into making a variety of Linux touchpad drivers almost good enough. But, even though I did eventually cave and buy new old Macbook, I’m not resigned to the imperfections of the current Linux touchpad landscape. A friend of mine who doesn’t even work in tech pointed out to me a month ago that he was reading a random post where they linked to my first blog post pursuing a Macbook-equivalent Linux driver. Somebody besides me cares about this.

The Path Forward

Wherein it becomes apparent that the author doesn’t yet know the best solution.

I think a polished driver could only be delivered within a narrow range of parameters. It probably isn’t going to support laptops older than 3-5 years old. It isn’t going to offer 1,001 options. It may or may not be continuously supported. It may use one of the existing drivers as a starting point, even if that starting codebase isn’t “clean” or well-documented.

Could we build something that works better than existing solutions for 95% of users (= developers) for less than $100k? Probably. Do users (or companies) feel enough pain with the Linux touchpad solutions that they’d donate money (or time) to tackle an esoteric issue? That is what I need to find out.

With a sufficiently enthusiastic response to this blog (todo: define sufficient), I would volunteer my own time to spearhead the non-development aspects of a solution [1]. I could create a Kickstarter page, or help PM or QA development efforts on a driver built to mimic Macbook on the widest possible range of modern laptops. I could donate time to whatever better idea you present. But, first I need a hand to determine: does this actually matter?

Update November 2018: Been putting a lot of time into this cause lately. I’m at about 10 notes and counting so far. I should have a proper blog update to post within the next month.

 

[1] I’d rather be programming this than PMing it, but my programmer brain is currently dedicated to quantifying developer activity and counting lines of code

Alternatives to Xmarks (now discontinued)

Xmarks (nee Firemarks) has been a reliable companion to address my cross-platform bookmarking needs over the past 10 years. As such, I was saddened to receive word that parent company Lastpass has chosen to discontinue Xmarks as of mid-2018. This sent me on a quest to find the best Xmarks alternative, but the first Google result I was presented (alternative.to) when searching “Xmarks alternatives” contained a spate of services that had precious little relevance to users like myself who simply want the means to save bookmarks in a cross-browser compatible extension, with as few other bells and whistles as possible.

After considerable Googling, here are the top three recommendations I’d present to other Xmarks users being forced to abandon ship:

Eversync

There’s good reason that this is the most-cited service you’ll find (alongside Xmarks) when Googling terms like “cross browser bookmarks.” It supports all the major browsers/platforms (including my current laptop, running Chromium on Arch Linux). It has been doing this long enough to have a quaint (read: “embarrassingly outdated”) little website that imputes the difficulty of building a business with via bookmarking extension.

Eversync’s web site¬†welcomes you to the 90s

Most importantly, it’s got impeccable ratings. As of March 2018, it maintains a 4.5 star rating on the Chrome app store with about 3,000 ratings. I consider this an incredible feat, given that greater volume of ratings typically drive a product’s average toward the 3 stars.

The biggest gripe I have with Eversync is that its creators package a collection of junk like “Speed Dial.” If you’re a power user with more than 500 bookmarks, Nimbus (who appears to have purchased the extension from Everhelper at some point) will try to charge you $45/year for the extension (plus Nimbus bloat). Woe that it does cost money to maintain a web service.

Chrome sync

Ok, technically this isn’t a cross-browser solution. But if you’re like me and you only stray outside of Chrome on occasion (usually to test a page I’m developing on another browser), then the simplest way to sync bookmarks is to simply use the browser’s built-in capability. No extensions to download, no potential that you’re going to have to change managers again when software maker abandons their product.

If you choose this option, you will most likely want to visit your browser’s Settings -> Sync settings and disable the properties that you don’t want or need synced on all of your workstations:

Raindrop.io

This option “only” manages 4 stars on 300 ratings¬†in the Chrome app store, so it’s a half-step below Eversync in terms of its user reputation. I’m including it here anyways because its home page inspires me to believe that its developers are actively working on it, and thus its functionality may be more likely to improve compared to Eversync. Further, it’s list of features¬†including “Duplicate finder” and “Broken link finder” indicate a level of product dogfooding (creator using own product = creation of features to maximize user satisfaction) that was largely absent in Xmarks. For what it’s worth, the Pro version of Raindrop is also a few bucks cheaper than the Pro version of Eversync ($5/month for Eversync vs $3/month for Raindrop).

If anyone has firsthand experience with Raindrop, I’d be much obliged to learn your satisfaction level in the comment section below.

Counting lines of code for fun & profit

Those wizards over at Static Object have published a new opus entitled Counting Lines of Code is Garbage, So Let’s Go Dumpster Diving. I believe it’s the most comprehensive analysis online when it comes to reconciling how Lines of Code can be transformed into meaningful measurement and insights.

They also recently published a video illustrating how Static Object consolidates commits to make it easier for developers to follow the activity that’s happening in their repo.

Both of the posts represent a quantum leap forward in terms of Static Object’s ability to explain what it is and why it exists.

Linux with a Macbook Touchpad Feel, Pt 2

Update: Below are what I believe to be the best settings available to tune a Linux touchpad to feel like a Macbook Pro touchpad, but it still isn’t perfect, and a year of research had led me to believe that it can’t be perfect without bigger changes to the underlying Linux drivers. I’ve written this follow up post to explore paths forward.¬† Original post follows…

Since my last laptop upgrade to a Dell Precision, I have made it an ongoing project to try to match my laptop (running Arch via Antergos) touchpad to the smooth & predictable operation of a Macbook Pro. It has been a long road, but at this point I have a setup that I think compares favorably to a Macbook experience.

In my previous entry, I covered the three available options for Linux touchpads before settling on mtrack as my touchpad driver of choice. In the weeks since, I have walked back this decision due to the jittery behavior of the mtrack driver when one slides a thumb in an effort to click. I frequently found myself barely missing my click target, and that’s no way to live.

So I returned to review my three options. In spite of its halting development progress, the next best option seemed to be the Synaptics driver. The fact that it was initially included as the default drive for Arch added to its credibility.

Having opted for Synaptics, the foremost challenge became locating a single concise & authoritative source to explain all available Synaptics touchpad driver options. Read on for a link to that source. I will also share my current touchpad configuration, with annotations on the updates I made to maximize the consistency & elegance of my touching experience.

Installation

Since Synaptics is the default driver for many Linux distros (including Ubuntu and Antergos, to my knowledge), you might well be running the Synaptics driver already. The easiest way to determine is to run

cat /var/log/Xorg.0.log | grep synaptics

If you see output like the following, you’re in good shape:

[ 16885.807] (II) LoadModule: "synaptics"
[ 16885.808] (II) Loading /usr/lib/xorg/modules/input/synaptics_drv.so
[ 16885.808] (II) Module synaptics: vendor="X.Org Foundation"
[ 16885.808] (II) Using input driver 'synaptics' for 'DLL07BF:01 06CB:7A13 Touchpad'

If not, chances are there is a configuration file for libinput or mtrack that has a lower alphanumeric file name in either /etc/X11/xorg.conf.d/, the first directory Xorg looks for touchpad config files, or /usr/share/X11/xorg.conf.d/ its secondary location. To get your laptop to choose Synpatics over other drivers, you must change the filename of your Synaptics driver config file to have a lower alphanumeric precedence than its competitors. I.e.,

bill /usr/share/X11/xorg.conf.d $ ls -l
total 16
-rw-r--r-- 1 root root  1350 Dec 25 05:03 10-quirks.conf
-rw-r--r-- 1 bill users 1935 Jan  7 11:03 30-synaptics.conf
-rw-r--r-- 1 root root   951 Dec 20 09:24 40-libinput.conf
-rw-r--r-- 1 root root  1753 Nov 18  2016 70-mtrack.conf

In my case, my Synaptics driver config file lives at /usr/share/X11/xorg.conf.d/30-synaptics.conf. The “30-” that my config file begins with is a lower number than my libinput or mtrack config files contain, so Xorg chooses to use Synaptics and ignore the other drivers.

Configuration

In my past post, I lauded mtrack for going big on configurability, noting the 50-100 different options available on differing versions of mtrack. The good news is that Synaptics has even more options available than Mtrack. The bad news is that you’re not going to find any one complete & accurate source to learn about all of the options available to you.

This page is the best you’re going to find. It’s pretty good.

After reading through the litany of options available, and experimenting in real world usage, the final Synaptics config file I settled on actually implements relatively few custom options:

Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
        # Enabling tap-to-click is a perilous choice that begets needing to set up palm detection/ignoring. Since I am fine clicking my touchpad, I sidestep the issue by disabling tapping. 
        Option "TapButton1" "0"
        Option "TapButton2" "0"
        Option "TapButton3" "0"
	# Using negative values for ScrollDelta implements natural scroll, a la Macbook default. 
        Option "VertScrollDelta" "-80"
	Option "HorizScrollDelta" "-80"
        # https://wiki.archlinux.org/index.php/Touchpad_Synaptics has a very buried note about this option
	# tl;dr this defines right button to be rightmost 7% and bottommost 5%
	Option "SoftButtonAreas" "93% 0 95% 0 0 0 0 0"  
        MatchDevicePath "/dev/input/event*"
EndSection

You’ll note that this config file doesn’t setup coasting after a two-finger scroll, since Synaptics enables this by default. The -80 values for scroll delta correspond closely with the rate at which a Macbook will scroll with two fingers. The greatest difference between my Linux and Macbook config is that I have enabled a slight area at the bottom right of my touchpad to function as my right click. After several hours of usage, I’ve found this area sized such that I only end up right clicking when I make an effort to go for the bottom right corner.¬†It’s a handy optimization that prevents me from needing to remove right click from the touchpad entirely.

On to the finer details

The previous post lamented how challenging I had found it to tweak values for the touchpad properties without restarting Lightdm (logging out and logging in again). Since then, I’ve discovered two means that allow experimenting with different touchpad values without requiring a log out/log in cycle. Both methods will allow you to precisely configure your touchpad settings without needing to log out and log back in.

The first method is via xinput, the second via synclient.

Using xinput

The greatest benefit to using xinput directly in changing touchpad settings is that it will work with either the Synaptics, libinput, or mtrack drivers. The second method I’ll outline below (synclient) only works with Synaptics.

To configure your settings using xinput, start by running xinput --list. Note which ID corresponds to your touchpad (for me, it’s ID 13), and then run xinput --list-props id. For example:

$ xinput --list-props 13
Device 'DLL07BF:01 06CB:7A13 Touchpad':
	Device Enabled (142):	1
	Coordinate Transformation Matrix (144):	1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
	Device Accel Profile (274):	1
	Device Accel Constant Deceleration (275):	2.500000
	Device Accel Adaptive Deceleration (276):	1.000000
	Device Accel Velocity Scaling (277):	12.500000
	Synaptics Edges (282):	49, 1179, 50, 878
	Synaptics Finger (283):	25, 30, 0
	Synaptics Tap Time (284):	180
	Synaptics Tap Move (285):	67
	Synaptics Tap Durations (286):	180, 180, 100
	Synaptics ClickPad (287):	1
	Synaptics Middle Button Timeout (288):	0
	Synaptics Two-Finger Pressure (289):	282
	Synaptics Two-Finger Width (290):	7
	Synaptics Scrolling Distance (291):	-80, -80
	Synaptics Edge Scrolling (292):	0, 0, 0
	Synaptics Two-Finger Scrolling (293):	1, 0
	Synaptics Move Speed (294):	1.000000, 1.750000, 0.129955, 0.000000
	Synaptics Off (295):	0
	Synaptics Locked Drags (296):	0
	Synaptics Locked Drags Timeout (297):	5000
        ...

Each of these property values correspond to properties you’ll find in the Synaptics configuration documentation. To change a value, you would then use xinput set-prop, for example:

xinput set-prop --type=int "DLL07BF:01 06CB:7A13 Touchpad" "Synaptics Scrolling Distance" -70 -70

You’ll note the first string is the copy-pasted name of my touchpad from xinput --list, the second string is the copy-pasted name of the setting that was shown via –list-props, and all of the settings that follow are the values to be used. After running the command above, when I re-run xinput --list-props id I see Synaptics Scrolling Distance (291): -80, -80, meaning my natural scroll is about 15% faster than before.

Using synclient

One benefit unique to the the Synaptics driver is that it comes with a dedicated utility for configuring its setting values. You can see all current applied settings by invoking synclient. You’ll see something like

$ synclient
Parameter settings:
    LeftEdge                = 49
    RightEdge               = 1179
    TopEdge                 = 50
    BottomEdge              = 878
    FingerLow               = 25
    FingerHigh              = 30
    MaxTapTime              = 180
    MaxTapMove              = 67
    MaxDoubleTapTime        = 180
    SingleTapTimeout        = 180
    ClickTime               = 100
    EmulateMidButtonTime    = 0
    EmulateTwoFingerMinZ    = 282
    EmulateTwoFingerMinW    = 7
    VertScrollDelta         = -70
    HorizScrollDelta        = -70
    ...

Again, you can consult the Synaptics settings documentation to map these esoteric names into actual behavior. Setting a new value is then simply a matter of running synclient VertScrollDelta=-80

Persisting configuration changes

After you’ve tweaked your touchpad to your satisfaction, you’ll need to propagate all your settings changes back into the config file we discussed in step one. The only bit that can make this challenging is if you used synclient, the variable names used by synclient can differ significantly from those that are known to xinput when it goes to configure your touchpad upon login.

If you’re not sure how your synclient values correspond to values you would feed to the Synaptics driver config file, use the steps from the “Using xinput” section above to list all the properties for your touchpad. Here, you’ll be able to see the config setting names that xinput knows for your touchpad, as well as the values it is currently using. For example, xinput --list-props tells me that after tweaking in synclient, I set up my button regions as follows:

Synaptics Soft Button Areas (314):	1079, 0, 760, 0, 0, 0, 0, 0

I can then copy those into my config file 30-mtrack.confas follows:

Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
        ...
        Option "SoftButtonAreas" "1079 0 760 0 0 0 0 0"
EndSection

After the setting values have been saved in your configuration file, they will be applied automatically upon restart/login.