Disclaimer

The content of this blog is my personal opinion only. Although I am an employee - currently of Nvidia, in the past of other companies such as Iagination Technologies, MIPS, Intellectual Ventures, Intel, AMD, Motorola, and Gould - I reveal this only so that the reader may account for any possible bias I may have towards my employer's products. The statements I make here in no way represent my employer's position, nor am I authorized to speak on behalf of my employer. In fact, this posting may not even represent my personal opinion, since occasionally I play devil's advocate.

See http://docs.google.com/View?id=dcxddbtr_23cg5thdfj for photo credits.

Sunday, January 31, 2016

Compile-time vs run-time checks in Perl's Safe

I have long thought that the fundamental problem with computer security is that we don't really have a way of doing a "safe eval".



Or, conversely: lots of code really wants to evaluate code provided by a caller or user.  But doing an arbitrary "eval" is unsafe, for many well-known reasons.  So many, many programs create restricted subset languages, no matter whether interpreted or compiled, and then allow the user to specify that.  But... there are many ways in which these supposedly safe restricted subset languages can be implemented with security holes.  And they are - implemented with security holes - over and over and over again.



Heck, just figuring out how to quote text to be passed between two levels is a copious source of bugs.



I think that, in an ideal world, we might be able to code a "safe eval" once and for all.  One that is designed to test security assertions such as "cannot access filesystem".





Perl's Safe::reval  (restricted eval) is the best attempt at this that I aqm familiar with.  http://perldoc.perl.org/Safe.html



But it has problems.



One of the best known problems is that it can, or at least used to, be able to return a Perl object with a DESTRUCTOR that would execute outside the Safe compartment.  I assume that this has been fixed, since it is no longer mentioned.



Another problem, IMHO, is Safe's dependence on compile-time rather than run-time checking:



Safe - perldoc.perl.org: "Any attempt by the code in STRING to use an operator which is not permitted by the compartment will cause an error (at run-time of the main program but at compile-time for the code in STRING). "
This is a problem if you are trying to safely eval code that depends on a library that generates unsafe code - but where that unsafe code is not actually executed in the code under test.



I was hopeful that Safe made a distinction between permit/deny and trap - with trap being dome at run-time inside the compartment.  Unfortunately, not so - trap is an alias for the compile-time check deny.



Similarly eval'ing within the compartment itself...



---



So close, but not close enough. :-(





===



Of course, even if you have a properly Safe compartment, then it is up to the user, the caller, to pass the correct opcode tags.  And the opcode tags are not fine graqin enough - e.g. you might want an app to be able to access its own files but not those of another app.











'via Blog this'

Compile-time vs run-time checks in Perl's Safe

I have long thought that the fundamental problem with computer security is that we don't really have a way of doing a "safe eval".



Or, conversely: lots of code really wants to evaluate code provided by a caller or user.  But doing an arbitrary "eval" is unsafe, for many well-known reasons.  So many, many programs create restricted subset languages, no matter whether interpreted or compiled, and then allow the user to specify that.  But... there are many ways in which these supposedly safe restricted subset languages can be implemented with security holes.  And they are - implemented with security holes - over and over and over again.



Heck, just figuring out how to quote text to be passed between two levels is a copious source of bugs.



I think that, in an ideal world, we might be able to code a "safe eval" once and for all.  One that is designed to test security assertions such as "cannot access filesystem".





Perl's Safe::reval  (restricted eval) is the best attempt at this that I aqm familiar with.  http://perldoc.perl.org/Safe.html



But it has problems.



One of the best known problems is that it can, or at least used to, be able to return a Perl object with a DESTRUCTOR that would execute outside the Safe compartment.  I assume that this has been fixed, since it is no longer mentioned.



Another problem, IMHO, is Safe's dependence on compile-time rather than run-time checking:



Safe - perldoc.perl.org: "Any attempt by the code in STRING to use an operator which is not permitted by the compartment will cause an error (at run-time of the main program but at compile-time for the code in STRING). "
This is a problem if you are trying to safely eval code that depends on a library that generates unsafe code - but where that unsafe code is not actually executed in the code under test.



I was hopeful that Safe made a distinction between permit/deny and trap - with trap being dome at run-time inside the compartment.  Unfortunately, not so - trap is an alias for the compile-time check deny.



Similarly eval'ing within the compartment itself...



---



So close, but not close enough. :-(





===



Of course, even if you have a properly Safe compartment, then it is up to the user, the caller, to pass the correct opcode tags.  And the opcode tags are not fine graqin enough - e.g. you might want an app to be able to access its own files but not those of another app.











'via Blog this'

Saturday, January 23, 2016

UI design ideas inspired by Giving Blood

BRIEF:

Propose UI feature that allows you to scroll the entire screen around, as if embedded in a 2D plane that is 3X wide and high, to access buttons.


DETAIL:

I just spent a morning giving blood.  Platelets.  3.5 hours at the blood donor center; machine set for 90 minutes; possibly 2.5 hours on the cot.  Paperwork and phlebotomist tubing and other setup.  Plus half an hour of travel time.



I would like give more blood more often.  Not just because it is a good deed - I already give at about the maximum rate - but also because it just plain feels good.  I am considering giving while blood and platelets more often rather than double reds less often, partly to more often get that good feeling of having done good.



I would like to empty my Inbox more often.



Synergy?



I have never been able to use a laptop or tablet to read email while donating blood.   But it seems like it should be possible to read email on a cellphone while donating blood, although past attempts have not succeeded well.

I conjecture that the past attempts failed because of lousy cellphone email client design.  I am hopeful that the new swipe-oriented clients would allow me to read email on my cellphone with one free hand and arm, while donating blood with a needle stuck in the other arm.

It is hard to do much with your hands if you are needles in both arms, making reading, difficult, whether book or cellphone. Whole blood donations are single needle; all of my recent double red donations have been single needle; my platelet donation today was double needle, although single needle apharesis is an option for platelet donations.  I think that I am going to ask o single needle donations in the future.

But, the experience of trying to read email on my cellphone with apharesis needles in both arms has given me some UI ideas. Recorded here.

I was able to hold my phone in the hand of the arm into which blood was being returned.   There was too much tubing to try to hold my phone in the hand of the arm from which blood was being taken.  Bear that in mind if you are strongly right or left handed.

Using the "Zero" email app to go through the Unread email in my Inbox was reasonably easy to do, in this very restricted position.  Swipe up to move to the next message, left/right to go in or out.  Similarly, after I ran out of unread email to read, using the Flipboard or New York Times or Oregonian news apps was easy enough - easy swipes or taps that did not have to be directed at any particular button.

But, accessing buttons, doing anything other than swiping, was a real pain.  In particular, the X that closes many screens, from the upper right hand corner, was quite hard to reach.  One of the phlebotomists chastised me for moving too much, causing the apharesis blood return to block.

This difficulty of accessing buttons was what caused me to

a) Only be able to scan my unread Gmail in Zero.  I could swipe into and out of a view that allowed me to read most of any email.  But clicking on links (oh, no, I clicked on links in email!!!!! Security alert!!!!! But at least it was email that I expected, not unsolicited, although I must increase my phishing paranoia) brought me to a web browser that was hard to navigate by swipes.

b) It was easy to tap the Zero star that left an email in my Inbox for further handling.  Ditto swipe to dismiss and archive.  But filing to a folder or project was out of the question.

c) Zero's Inbox view, list oriented, with many different options - perhaps may have been useful, but I could not manage to use it.

d) As I have mentioned elsewhere, Zero does not work for my company email, which is ActiveSync only to cellphones, forbidding IMAP except on laptops. Zero does not yet support ActiveSync, so I cannot use it for work.

       Nor were any of the other email clients usable in this "My arms are pinned down, and I can only swipe with my thumbs" usage model.

e) For the first time I actually made good use of the Apple accessibility feature that brings the top line of the screen with the X icon down to halfway.   But it was still uncomfortable.

f) I was able to accurately hit buttons like the start button.  So it is the reach, not the buttons, that is the problem.

g) I found myself wanting to be able to scroll the entire screen around to be able to reach the buttons, much as one moves around a map.  As if the screen was embedded in a blank 2D plane. I imagined it as a firm press or other gesture to engage the "move the whole screen" around" mode, swipes and scrolls to move the button at the far distant UR corner to under my left thumb.  With elasticity to move the screen back.

I.e. I think that this "scroll the screen" approach might go a long way to allowing the traditional icons and button decorations for user interface to be useful in a one handed environment.

I can imagine "separability": the video or webpage or email you are looking at might stay fixed on the screen, while a mask of the buttons might move around.   Or move all together.

h) I plan to ask for a single needle the next tie I give platelets, so I may no longer care.   But:

h.1) I think that I *will* care - because I think this swiping is easier to use than the traditional UI.

h.2) I think this may be especially relevant to users who do not have the option - to physically disabled users, who may have to ability to move their thumb, but not their hand or wrist or arm.    Certainly to people in a cast.

I wonder if deliberately trying to test UIs by deliberately restricting motion, much as I did by accident when trying to read email while donating platelets, might be a good way of encouraging better UI design.  More accessible not just for the disabled, nor just for the increasing number of older folks, but also for the entire bleeding market.

Disclaimers:

First, I am not a doctor, nor do I have any special knowledge about the Red Cross policies for blood donation.   I am just a user, a blood donor, who would like optimize his blood donations, both for maximum good and personal convenience.

If this information is already available from the Red Cross, then I wish it had been concisely presented on the website.  If it is already presented, then, damn, *I* was not able to find it!

Second, for any insurance company that sees this post and considers it evidence of a preexisting condition:  Tain't so.   I am not giving platelets because I, or a member of my family, is expected to need them.   I am just giving blood because I think it is a good thing.

Optimizing Blood Donation

Donating blood makes me feel good.  Today I gave platelets. Before that, my last donation was double reds, and so on.

I would like to "maximize" the good that my blood donations provide. 
BOTTOM LINE: I am going to try switching from a 2XR/112 schedule to a W/56+P/~28 schedule: i.e. I am going to try to donate whole blood at the maximum frequency, plus platelets in-between circa once a month, or even one a fortnight, rather than double reds at the maximum frequency. I think this maximizes the good done by my donation, and may even give me the selfish benefit of helping me catch up on email while donating. Single needle donation, so I have a hand free to read email on my cellphone.

        Table for Blood Donation Scheduling Dependencies

This is my current best understanding:
FromTo
Whole BloodDouble RedsPlatelets
Whole Blood56567
Double Reds112112 (3x/yr)112
Platelets777 (24x/yr)
~14 days average

I was having trouble getting a straight story on how often I could donate blood.  I know the standard intervals: once every 56 days for whole blood, once every 112 days for double red, once every 7 days for platelets. But even these have fine print: e.g. double reds no more than 3 times a year (messing up my plans to make a blood donation on January 1st, which I thought would make a nice start to the new year); e.g. platelets' minimal interval may be 7 days, but you are only allowed to give platelets 24 times a year, averaging slightly longer than once every 2 weeks).

And I was hearing many confusing and contradictory things about interleaving different types of donations.   E.g. I asked the phlebotomists, a few blood drives ago, when I could next give whole blood after donating platelets, and their answer was "56 days".  

So, at recent blood donations I asked more detailed questions, some of which were "escalated"; as well as doing some web.research.  

How "Good" is Whole Blood vs Double Red Blood Cell Donation?

The phrase "Double Red Blood Cells" tends to imply that a 2RBC donation provides 2X the red blood cells that a whole blood donation provides.

At least two phlebotomists were under the impression that a 2RBC donation provides more like 3X-4X the RBC than a WB donation.  However, both of these went and did some more checking, and the answer seems to be no.  2

WB: 470 ml collected (circa 1 pint).

  • Typical hematocrit value is 45% for men, 40% for women. Hematocrot = packed cell volume = fraction of volume of blood that is red blood cells.
  • Therefore, in 1 pint of whole blood, the volume of red blood cells os approximately 218ml (men), or 190ml (women).
2RBC: 
  • The reservoir bag is larger than a pint - IIRC it is circa 620ml
  • But apparently there are other fluids, like saline and anticoagulant in the bag.
  • The reported volume of red blood cells collected was 360ml, in at least one instance.  (I may start tracking this from donation to donation.)

If these values are correct - 218ml-RBC/WB-donation for men, 190ml-RBC/WB-donation, vs. 360ml-RBC/2RBC-donation (male?), them it would appear that 2RBCs do collect only abut 2X the red blood cells, per donation, or about the same amount over a year, over a year than whole blood donations provide, given the 2X-longer interval. In fact, slightly less - perhaps as much as 17% less.

But:

  • PRO-2RBC: bigger batch of cells from one donor => less immune system challenge for recipient.
  • PRO-2RBC: double reds probably has lower processing costs than whole blood donations.
  • CON-2RBC: whole blood donations also contribute platelets and plasma.
It seems to me that whole blood donations may do slightly more "good" than 2RBC donations, if assiduously giving at the maximum rate.  To which the benefits of extra interleaved platelet donations could be added.



How Often Can You Interleave Different Types of Blood Donations?

Normally (which we will stipulate for all of these statements), you can give platelets 7 days after a whole blood donation.

Normally you can whole blood 7 days after a platelet donation.   However, platelet donations are aphaeresis, drawing blood, separating the platelets, and returning the red blood cells and most of the plasma.  Sometimes the return process cannot be completed, in which case the interval will be longer.

Although one might expect to be able to donate platelets 7 days after a double red donation, or at least without having to wait the full 112 days, this is not done. Apparently, although the double red donation returns most plasma and platelets, there may be enough "extra-corporeal blood loss" in the machine that the Oregon Red Cross does not permit this: apparently they do require the donor to wait the full 128 days until the next donation of any form.

GLEW HYPOTHESIS: to me, this sounds like "these machines are relatively new, and we are still evolving policies and performing studies as to how best to use them".  I would not be at all surprised if this policy is different, possibly with different machines, or as studies are made.

Donation Schedules

Discussion

First, donating on any regular schedule is better than not donating:

W/56: Every 56 days: donate whole blood

2XR/112: Every 112 days: donate double reds (but no more than thrice a year).

P/14: Every 7-14 days, donate platelets. (And plasma, if your local Red Cross is set up for donations of plasma and platelets together.)

Of course, donating at ay frequency, not necessarily the maximum, is better than not donating.

But it occurred to me that a schedule such as the following might provide greater good:

W/56 + P/14:  Every 56 days, donate whole blood; every 14 days or so, donate platelets.

I wondered if it was possible to do 2XR/112+P/14, i.e. give double reds at the highest frequency, and donate platelets "in between".  However, it seems that the Red Cross does not allow this, apparently because of "extracorporeal loss".

So it seems that we only need to compare

W/56
W/56+P/14
2XR/112

W/56+P/14 sees to be unambiguously better than W/56, so if you or I have time to give platelets "in-between" our whole blood donations, go for it.

On the face of things, both W/56 by itself, and W/56+P/14 seem to be "better value" than 2XR/112, since W/56 seems to provide the same number of whole blood cells as 2XR/112, plus some platelets, plus plasma.

But: there is a hard to quantify value to having twice the number of red blood cells drawn from the same donor: less chance of bad reactions, etc.  I don't know how to quantify the value, although I would hope that some public health statistician has done so.  (If I knew where to find the necessary stats, I could do the analysis.)   (The shelf life of red blood cells is apparently 42 days, so there is no possibility of building up a "stock" of blood from the same donor.)

Also, "Double red cell donations from Type O donors and donors with Rh-negative blood types play a very important role in maintaining blood supply levels.", since O- is the so-called universal donor of red blood cells, while O+ can be given Rh+ recipients, around 80% of the population.  (I.e. O- is the universal donor, and O+ is the almost universal donor).

(Conversely, AB is the universal plasma donor.)

So choosing between W/56+P/14 and 2XR/112 involves:

For the universal plasmas donors of type AB, donating plasma and platelets seems to be a win, whether in schedules W/56 or W/56+P/14, versus donating only red blood cells using the 2XR/112 schedule.

For the universal O- and nearly universal O+ red blood cell donors, donating plasma and platelets is less crucial, and both W/56 and 2XR/112 donate approximately the same amount of red blood cells.

Nevertheless, I should hope that there is still some benefit for an O+/O- donor to donate platelets and plasma as well as red blood cells, so W/56+P/14 would seem to be "for the greater good".  Again, except for the benefit of having bigger batches from the same donor.

Convenience

The "benefit" of W/56+P/14 must be weighed against the convenience, and the probability of compliance.

It is much easier to commit to giving double reds three times a year, than it is to commit to giving whole blood every two months.

Time

Whole blood: the actual donation takes 8-10 minutes, but the Red Cross says to allow 1 hour for the entire process.  To this you have to add travel time.

Double Reds: Circa 1.5 hours for the entire process.  Plus travel time - but since you can only give half as often, the total time cost over a year is halved.  Double Reds may be the best way to give for someone who has little free time, even for good deeds like giving blood.

Platelets: the Red Cross' web pages say 1.5 to 2.5 hours.  For me, today, it was actually 3.5 hours.  The actual donation was 90 minutes.   And to this you have to add travel time.

Multitasking:

Note: phlebotomists are past masters at mutitasking.  I am only talking about multitasking for the blood donors: trying to get work done, e.g. process email, while giving blood.

When I was in grad school I used to be able to read or study while giving a single needle apharesis donation.  It is hard to do much with your hands if you are needles in both arms, making reading, difficult, whether book or cellphone. Whole blood donations are single needle; all of my recent double red donations have been single needle; my platelet donation today was double needle, although single needle apharesis is an option for platelet donations.

Double needle / two arm platelet donations are a bit faster (don't have to reverse the flow).   And apparently double needle platelet donations are apparently a bit higher quality than single needle platelet donations.  Hearsay; I have not researched; but this sounds plausible, I can imagine several mechanisms that might be responsible.

Here, I think that I am going to be selfish:  if I can get some useful work done in the circa 90 minutes I am donating platelets (or in the much shorter times for whole blood and double red donations), I am much more likely to actually donate. Heck, if I could clear my Inbox once a week while donating blood, I would!  But unfortunately the allowed frequencies do not support that.

I am leaning towards single needle donations for platelets in the future, just to try to get this selfish benefit.

Although perhaps it would be good for my soul to sit quietly and meditate while giving blood. Plus it is fun to chat with the phlebotomists and volunteers.

Also:  I was amazed to see that the Oregon Red Cross in Portland has a large selection of movies that you can watch while donating platelets.   Large screens in front of every cot!!!  Things have certainly changed since grad school!!! There are lots of movies that I want to watch; and I am sure that the Red Cross would allow you or me to bring in our own DVDs, of movies, or classes like The_Great_Courses.

(I wonder if The Teaching Company might consider making their DVD classes available to the Red Cross for viewing by blood donors?  Good cause, possibly a good tax deduction, good advertising, and possibly sticky: watch the first lecture in a series, buy the rest.)


Disclaimers:

First, I am not a doctor, nor do I have any special knowledge about the Red Cross policies fir blood donation.   I am just a user, a blood donor, who would like optimize his blood donations, both for maximum good and personal convenience.

If this information is already available from the Red Cross, then I wish it had been concisely presented on the website.  If it is already presented, then, damn, *I* was not able to find it!

Second, for any insurance company that sees this post and considers it evidence of a preexisting condition:  Tain't so.   I am not giving platelets because I, or a member of my family, is expected to need them.   I am just giving blood because I think it is a good thing.

Sunday, January 10, 2016

Notes and Thoughts about: Dynamic Keypad / User Interface Elements (Quadro, Keypad)

This page, http://blog.andy.glew.ca/2016/01/notes-and-thoughts-about-dynamic-keypad.html, for generic discussion.  Thoughts if I decide to spend time writing my own, and/or criteria when trying to comparison shop.

Related Blog Pages

The original page, http://blog.andy.glew.ca/2016/01/dynamic-keypad-user-interface-elements.html, is more of a shopping project - a page where I take notes, a sort of informal review.  Posted in the hope that others may find useful.

It soon became obvious that I was very hopeful about Quadro, a particular iPhone remote control facility, with multiple buttons, whose main claim to fame seems to be using AppleScript/OSA commands. I was hopeful this might make it more reliable than the many, many, macro facilities I have used in the past.  Perhaps; but Quadero still has reliability problems. Split into a separate page,
Quadro - I love it when it works, but it is often unreliable.

http://blog.andy.glew.ca/2016/01/scripting-raw-io-macros-versus.html is a somewhat generic discussion of the pros and cons of the various levels of abstraction found in such tools.  One of my big frustrations with Quadro, second to reliability, is that I cannot drive all user interface actions because Quadro does not seem to provide all raw keyboard and mouse events.

http://blog.andy.glew.ca/2016/01/notes-and-thoughts-about-dynamic-keypad.html for still more generic thought.

For the umpteenth time, realized that I should have written this in wiki rather than blog.   Googlesb blogspot/blogger blog really does not provide much support for pages that need to evolve by being split and otherwise refactored.  Let alone transclusion.



Software Running on the Target

Many, IMHO most, such remote macro facilities require some special software "server" running on the target machine.

This scares people: because such software can do pretty much anything.  It is security vulnerability.  Especially for closed source software.

Such concerns are somewhat allayed for software such as Android Keypad, where the software running in the target is just well-known software such as the VNC - essentially a remote terminal facility.
     In theory, users could monitor the VNC traffic, and verify that no commands they do not want are being inserted.
     In practice, I suspect that few users do this.

Even more specific: the client could appear to the target as an ordinary Human Input Device (HID), connected via USB or BlueTooth.  Once again, in theory a monitor could be inserted: in practice, few probably do.

Communications Channel

A communications channel is needed to connect the extended input device to the target.

It could be a standard I/O protocol, such as USB or BlueTooth.  Probably with the constraints of a "profile", such as a HID (Human Interface Device), constraining what actions can be performed.

But: the extended input device can also benefit from feedback from the target, e.g. to monitor errors, or to do what Quadro does, showing what appears to be an OSA/AppleScript menu command hierarchy to the user.  Constraining to a HID profile might prohibit this.

An arbitrary, device defined, protocol can be created.   But then users get scared off by the security implications.

A bidirectional protocol such as VNC could be used.   Standard, inspires a bit more confidence about security.   But VNC is not defined at a level that makes it easy to detect higher level semantics such as "command finished".

"Extended Input Device"

I am beginning to use the term "Extended Input Device" for the class of devices I am talking about here.  Just because I need a term to think about.   Not restricted to physical hardware: could be software.  Not restricted to software running on a client device physically separate from the target: could be software running on the same OS.  Not restricted to input - the "extended input device" client may want to be able to receive feedback from its "server" on the target, for purposes such as handling errors, decided what optimized commands to send, etc.  But certainly, for the purposes of this discussion my main emphasis is to produce new, alternative, interface devices.  Possibly auxiliary.

(Conversely, VNC is both input and output, but essentially extended existing HIOD, rather than creating new types of HID.)

Multithreading

A single extended input device client may talk to a single server on the target.

Multiple client devices may talk to the same server.   E.g. multiple keypads, a small iPhone keypad, and a larger iPad.  Extends to speech, gesture, etc., extended input devices.

The "single server on the target" may talk to multiple applications, running concurrently.

For these reasons it is probably important that the target server be multithreaded, or otherwise capable of handling asynchronous concurrent events.

Similarly, if the client interacts, receiving replies such as for errors, it needs to be able to disambiguate replies from multiple asynchronous target applications.

I conjecture that lack of this sort of multithreading/multiplexing capability is one of the reasons that my trial of Quadro has experienced so many problems.   On OSes such as MacOS-X, error dialog boxes probably disrupt the expected sequencing of a single threaded conversation between client, target server, and target app.

Perhaps blocking a single thread is acceptable.

But it would be nice to be able to switch to a different thread, so as to be able to close such dialog boxes,  kill and restart target server, etc.

Interestingly, "send and forget" macro packages may be more robust in this context.    Raw input event macros are unreliable, since errors may result in raw input events being sent to unexpected conswquences.  But raw input events can always be sent, and will always do something - so long as they can be sent to a thread that is not blocked, and so long as they are not blocked in a stalled queue along the way.

Another aspect of reliability is the queue structure.

รง


The sort of thing that the X Windows system provides.   The sort of thing that used to be provided by some character terminal packages on serial lines, modems, etc., so that you could run several ttys across a single phone line.
     VNC, however, is not multiplexed like this.  Therefore using VNC as the communications channel between client and server is a step backward.

Essentially, this is the sort of thing that networking, TCP/IP, provide.   Or that SSH allows, so that you can do X Windows across an SSH connection.  Essentially, a tunnel.

So, why not use existing SW packages, like SSH, for such tunneling?  Why think about making it part of the "extended input device client-server communications channel link"?

Mainly, ease of use.  It's a pain to have to set up SSH separate from the extended input device, whether for security or multiplexing.   Even more of a pain to have to manually connect different instances.

Moreover, the sort of extended input device system we are contemplating is dynamic.  Essentially every remote application is a separate thread, requiring its own multiplexing, and thread handling on either end.

Therefore, while it may be fine to reuse existing software such as SSH internally, it would be bad to reuse at the application level, and require the user to set up such connections manually.

The extended input device client/server should be setting up such a multiplexed channel, forking it as needed, and otherwise provided management facilities.  At the lowest level, all traffic may indeed go through a separate client and server thread at either end, but such a receiver should drain its buffers as quickly as possible and forward on to the actual worker threads.  In a non-blocking manner, potentially discarding input transmitted if the receiver does not have room to accept.

Conceptually, multiplexing IP, TCP, or SSH across such a communications channel might be easiest in terms of reusing existing code.   Of course, the overhead of such full-ish network tunneling might be too much.

TBD: are there any other multiplexed protocols, reasonably standard, that could be leveraged?

TBD: when we talk about SSH or TCP/IP, we usually imagine that we are communicating across wired Ethernet or WiFi.  This is good: such networks are reasonably ubiquitous.   But it would also be good to be able to network across BlueTooth or USB.  Of course people already send TCP/IP across such links, but there may also be suitable multiplexed protocols that can also be used.

CURRENT THOUGHTS:

  • multiplex across SSH and TCP/IP most general
    • possibly SSL / TLS
  • may also want to talk more primitive, possibly mostly unidirectional, HID (Human Interface Device) BlueTooth/USB - just to get ubiquity.

SSL / TLS: can imagine the server on the target system exposing an HTTPS interface.   ??????

Security, Authentication

Quadro: the QuadroSync server on the target just provides a TCP/IP address and port for the client to connect to.  Scary!!! :-( The Keypad app connects via low security VNC.  Of course, should send VNC across SSH.  IIRC at least one of these apps provided a primitive two factor: displaying a code on the target, to be typed into the client, or vice versa.

I think that I definitely want such an extended input device to have such a separate authentication channel.  And to similarly have nonced encrypted communications, set up by default.

One "advantage" of using BlueTooth is that the existing BT security infrastructure can be used. Although BT has had security problems, surely they have solved them, so that wireless BT mice and keyboards can be used securely.

One advantage of using wired USB is that at least wireless man-in-the-middle attacks are impossible.

Error Handling

Always a pain.

Want to be able to reset parts - an individual app, etc. - without having to reset whole.

If an app spawns am error dialog, ideally would not have input stream go and press buttons in that dialog, unless the dialog was expected.   Or possibly direct, and hope that nothing causes dialog to do bad stuff.

Want to be able to create a separate client-server thread to go and handle the dialog errors.  Probably default discarding any pended input blocked by dialog, although sometimes such dialogs allow pended macros to cvomplete once some buttion like "are you sure" is pressed.

KLUGE IDEA: scripting interfaces like AppleScript provide lousy handling of errors, and of things like startup delays L: any script that contains "delay(5s) /* give app chance to start*/" is IMHOP bad.
    
If the script interface does not support, may be able to kluge by sending simply observable commands - such a s a command that opens an expected dialog, that we can look for, on successful completion".

Sketching a Protocol

Across any channel on the multiplexed link, we want to be able to 
  • send raw input events
    • sequence of keystroke modifiers keys
    • ditto mouse events
    • possibly at low level key down/up events
  • commands, whether 
    • locally unique menu commands
    • menu paths
    • or fully functional, sufficiently unique, commands
Each such being addressed to a particular thread and/or a particular multiplex.

I highly suspect that it would be good to identify recursive, nested, transaction boundaries, for error handling.  Not because I expect the be able to provide atomicity, but so that extra queued up commands can be discarded when an error occurs.

New threads/multiplexes are created whenever talking to a new application. Possibly to each instance of an application, each window, etc.

Error handling may involve creating a new channel sequence (probably after canceling an existing).  But without necessarily forking a new app/window/instance.

Requests sent one way may get replies sent the other.   Because want non-blocking by default, transaction IDs to match them up.    Unidirectional may not require replies, but should be able to handle unexpected replies.







Quadro - I love it when it works, but it is often unreliable

Quadro is an example of a remote control app, and app that runs on an iPhone, and talks to a server process on a Mac or PC, allowing remote control of multiple apps on the target.  Quadro allows multiple  "palettes" of colorful buttons, with icons and text, to be created on the iPhone/iPad, with each being bound to a keyboard macro or what I am guessing is an AppleScript / OAS command.   I.e. I am guessing that Quadro's claim to fame is that it has a fairly generic OAS driving engine on MacBook side of the connection.

I.e. Quadro is an example of the sort of application that I have written about many times, and for which I started collecting "shopping notes" in http://blog.andy.glew.ca/2016/01/dynamic-keypad-user-interface-elements.html. This Quadro page started out in that more generic page, but I quickly became quite excited about Quadro, and started collecting copious notes.

Related Blog Pages

The original page, http://blog.andy.glew.ca/2016/01/dynamic-keypad-user-interface-elements.html, is more of a shopping project - a page where I take notes, a sort of informal review.  Posted in the hope that others may find useful.

It soon became obvious that I was very hopeful about Quadro, a particular iPhone remote control facility, with multiple buttons, whose main claim to fame seems to be using AppleScript/OSA commands. I was hopeful this might make it more reliable than the many, many, macro facilities I have used in the past.  Perhaps; but Quadero still has reliability problems. Split into a separate page,
Quadro - I love it when it works, but it is often unreliable.

(1-2 months later, I started trying to use Quadro again after an update, resulting in the post Quadro no longer worked after update ... but now it does (8h wild goose chase later).  Although I would rather not have endured 8h of thrashing trying to get Quadro working again, I am fairly happy with the improvements made, as I say in New Quadro Release - Nice Improvement. Although there are
Ways to Make Quadro Even Better, I emphasize:
I like Quadro enough that I want everyone to use it.  Therefore, I am very Very VERY happy with the new Quadro release!  Everybody should use it! I really do think that it is one of the best things to happen to user interfaces since swipes and GUIs.  When the Quadro folk explain that they have properly secured Quadro, I will be able to recommend it without reservation.
http://blog.andy.glew.ca/2016/01/scripting-raw-io-macros-versus.html is a somewhat generic discussion of the pros and cons of the various levels of abstraction found in such tools.  One of my big frustrations with Quadro, second to reliability, is that I cannot drive all user interface actions because Quadro does not seem to provide all raw keyboard and mouse events.

http://blog.andy.glew.ca/2016/01/notes-and-thoughts-about-dynamic-keypad.html for still more generic thought.

For the umpteenth time, realized that I should have written this in wiki rather than blog.   Googlesb blogspot/blogger blog really does not provide much support for pages that need to evolve by being split and otherwise refactored.  Let alone transclusion.

Quadro

http://quadro.me/

Googling kept turning up Quadro.

Eventually realized that I had written enough about Quadro to warrant aa page of its own: http://blog.andy.glew.ca/2016/01/quadro-i-love-it-when-it-works-but-it.html

Currently, Jam 10, 2016, after a week of using Quadro, 
  • I am still hopeful that Quadro will be a good tool
  • I am frustrated, driven to exasperation, by how unreliable and flakey Quadro is.
    • Almost par for the course with this sort of application, although I suspect that Quadro, because of its command rather than keyboard orientation, hangs more than most more "Raw I/O" based tools in this class.
    • I was about to give up using Quadro today, but I am figuring out that it is more reliable in some environments than others.
  • I can't say that I regret contributing 50$ to support Quadro development, the maximum freemium they provide.  But I sure wish that it was more reliable.
  • I remain concerned about security, lack of.
Apparently the developer's second go around: he tried to make a business of it with an earlier company, Actions.  In the Quadro blog he explains that the earlier company was not able to survive with a one time fee, so with Quadro he is going freemium+subscription: free base, 3$ to get the keyboard, 20$ annual to get advanced features, 50$ forever.
    This in itself makes me sympathetic.  It's hard to make a go, a living, as an independent developer.  I paid the 50$. 

The developer, Cristiano Troffei, writes his blogs and the software documentation and UI in a somewhat incoherent Italian inspired English.   Phraseology that is often hard to understand, and which can be somewhat irritating: "Ta-da!!" "Ehmm, I need to tell you something..."  "Automate any recurring iteration..." (which this native English speaker would replace by "Automate recurring tasks..."). Many more examples.
      I almost gave up on Quadro at this point. This sort of app is inherently a big security risk, and it seems that much malware is written in incoherent English. But I clicked around, and, coming from a non-English speaking country, I am willing to make allowances.  I am probably equally incoherent in French, and negligibly coherent in Cristiano's native language, Italian.  I hope that I do not regret this.
     The Quadro web pages could really benefit by a native English speaker cleaning them up.  If they almost turned me off, I am sure they are turning off other potential customers.

Security?

This sort of user interface application is a huge security vulnerability: you are giving the application the ability to type AS YOU, and to basically do anything you can do.

In this respect Quadro is no different than having a custom keyboard on your cell-phone to replace the clunky Appe or Google keyboard:  Swype, or LastPass. For me, in years past, the Graffiti handwriting recognition.
     Similarly, voice control software like Dragon NaturallySpeaking.
     Or any keyboard mapping software, like Karabiner on MacOS.
     AutoHotKey on Wndows.

Actually, Quadro may be a little bit more secure than a custom keyboard or AutoHotKey: Quadro is an adjunct to your keyboard, and is not necessarily the full keyboard.  I believe Apple had to arrange so that a custom keyboard on iPhone would not be used for the system password.  Quadro inherently does not or should not see passwords or credit card numbers you are typing in on your laptop keyboard. AutoHotKey and Karabiner, however, I believe see all keyboard activity.

But in addition to the security vulnerability of acting as an input device, Quadro adds to that the risk of communicating from one malware vulnerable device, yoyr iPhone, to another, your Mac or PC.   I sure do hope that the Quadro iPhone/PC communications channel is properly encrypted.  I do not know if it is or not - Quadro does not document that in any way that I have found.  I would have trouble recommending Quadro to others unless this can be proven.

Many of the things I most want on computers, like input mediation, are similar security vulnerabilities. This has inspired thoughts about what a security model should look like to avoid such problems.   E.g. not just "this is an approved input device", but also "this device is approved only for input to SW apps of low security importance".  Similarly for the queries that apps like Quadro have to use.

Quadro Problem Reports and Wishlist Items

Problem: Unreliable Swiping: on Quadro you are supposed to be able to swipe from left to write to get to a list of "palettes" (collections of custom pads for different apps).   On my iPhone - an iPhone 6+ - I cannot do this swipe reliably. More than half the time I end up hitting a button.  This can be really bad, if the button hit has a negative effect, like deleting an email.

Hmm...  possibly my swiping is unreliable because I have an Otterbox case. ... No, removed the case, still a problem.   Plus, I use many other apps, e.g. Flipboard, that have similar swipes, that work reliably.

I highly recommend that either the swipe be fixed, or that some other UI element be used or at least be available to get to the list of palettes and the settings and display - the "Quadro Top Level" inside the app.

(Several hours later: I just figured out that pressing on the star icon, at the bottom left hand corner, then Open Library, takes me to the library of palettes, with the settings gearwheel, etc.  So there is a way to get there apart from the unreliable let to right swipe.)

Problem: Need to be able to disable Quadro Palettes and sheets: Quadro comes with a big list of palettes already written for many apps.  This is good.   However, most of them I do NOT want to use, at least not yet.

Especially since my main usage model for Quadro is to have a pair of "email triage" palettes (actually, sheets) (for Apple MacOS Mail.app, for work and personal email).  I do not use the standard Quadro palette for mail. But I do not want to delete the standard.  Instead, I want to only to use my specified palette/sheet.

Problem: Switching out of App and Back changes currently active Sheet for App: E.g. as explained above, I have defined two similar but different "email triage" sheets for work and personal email.   But I still have the original palette /sheet for the Mail app.   When I switch away from Mail, e.g. to read a web page, and switch back, I am moved back to the original palette sheet.  And I then have to remember how to switch sheets. 

Problem: Switching Sheets is a Pain, Non-Obvious:  as explained above, I have three sheets for Mail: the original Quadro Mail palette, and two separate palettes for wrk and personal.  I often need to switch between them (more often than should be, because Quadro switches back to the top level Mail sheet too often).

The official way to switch sheets is the ellipsis, three dots "..." at the bottom of the screen. Not obvious.

I really wish that there was a way to create buttons that could switch to other app pallettes, and/or different sheets for the same app.  Buttons that I could name or provide a useful icon for.    In some ways, a "group" is much like this - a group button leads to what appears to be a sheet, but a sheet which does not appear on the top level of palettes.

Problem: What is Difference between a Sheet and a Group?  

I think that a sheet appears on the top level list of palettes, but a group does not. Also, you can select buttons, and move the to a different palette or sheet, but apparently not to a different group.

Problem: Undo:   Desperately need an Undo feature, for when I am doing edits.  (Like when I accidentally grouped some buttons I did not want.  It took me quite a while to move them back to where they came from, and then place them back into their original arrangement.

Undo is just standard for modern SW. Assumed.  

For my purposes, if Quadro had a text representation that I could version control, I could live without undo.

Problem: Need Text Representation, that can version control and diff 

Like Undo, this is just par for the course, standard, expected.

If I am maintaining a big set of palettes, ones that I will be constantly adding to as I add/remove projects (remember, my mostcommon button is "File to project folder"), then I need version control.

I would also like a text representation that I can easily generate.  Since I have to add folders outside of Quadro, I would like to be able to automatically keep Quadro in sync, rather than having to fall back to manual editing.

An XML representation should be easy.  Many if not most UI tools that allow buttons to be moved around use some such representation.

THIS IS IMPORTANT.  If I find a tool that has text config files for palettes, etc., I will switch to that and away from Quadro.  I will have trouble recommended Quadro until some such support is available.

Wish: Program Interaction on Windows 

Quadro is very Mac centric.  Perhaps not surprising, given developer.

Quadro only provides "automatic integration of menu items" on Mac.  Knowing a bit about Cocoa, I think I can guess at how this is done.

In my experience, Windows is similarly fairly easy to get automatic menus for: the Accessibility interfaces, used so that helper programs for disabled folk can read read the screen.  I highly recommend that such simple "menu scraper" be provided for Windows as well as Mac.

Problem: Odd Select Behavior: Tap, Press, Hold:   Quadro has icons at bottom of screen: star, ellipsis (...), question mark, pencil.

For a very long time I thought that Quadro only had strange "transient" menus: click and slide, menu dsappears if you lift finger.

Eventually I realized that Quadro has both:

Tap, menu stays open.

Press (i.e. tap more slowly), and menu disappears.

OK, I think that I can use this now.   But an overall comment, advice to Quadro developer:  probably one of the biggest markets for something like Quadro is people who, while perhaps not sufficiently disabled to need a screen reader and switches, may not have as much fine grain muscle control as a youngster like you.   Quadro's UI, in many ways, is an impediment to such users.

Several hours later, a similar problem:  All of a sudden the palette I was working on stopped working. Hitting the Archive button on this Mail palette did nothing. Repeated attempts.   Eventually, I restarted both my Mac and my iPhone.  Problem persisted.
      In frustration, I jabbed my finger several times on a button.  Suddenly it worked, deleting several emails I did not want to delete :-(.  Insufficient undo. :-( :-( :-(.

It looks like
a) a quick tap on the button makes Quadro do the action on that button
b) a long press on the button displays the note field as a banner across the top
c) but a moderate speed press and release - slower than a quick tap, but not so long to be interpreted as a long press - selects the button (the button changes color), but does nothing.

I wasted an hour figuring that out, including restarting two devices.   How many other users would just conclude that Quadro is broken, and give up?

By the way:  I wasted an hour on this because Quadro had crashed a few minutes earlier.   I think that it may have crashed because first I created a button to move a mail message to folder "Inbox-Processing/Defer Briefly", the in Gmail changed the folder name to "Defer/Defer Briefly".   I suspected that the change of folder name left an orphan Quadro button dangling.   Haven't debugged fully, but it did stop working - although that may just be this button speed issue - and it did crash Quadro on the iPhone (after briefly displaying overlapping buttons).


Plea:  Please, please, please, allow me to disable Quadro palettes and sheets I do not use!!!!   I really am sick and tired of staring at the Chrome palette while I type these notes into my blog.  The buttons are absolutely nothing that I want to use, and I keep hitting them by accident.  I will probably have to delete this palette before long and I would much rather just be able to disable it until I have time ti figure out how to use it.  But right now, I only have time to try to use my email triage palette/sheet - heck, I don't even want to use the standard Mail palette.

At this moment, there is only one palette/sheet I want to use: my personal email triage.  Soon, there will be two: personal ad work email triage.  I don't want to see anything else.

If I only have these two palettes, you could grep them to indicate not currently active.

Or give me a reduced list of currently enabled palettes.  But right now Quadro is giving me so much crap that I keep tripping over.

Worse, although it switches away from the palette/sheets I want to use, it keeps the bloody Chrome palette up way to often.  I would rather have my Mail palette up, so that I can switch back to it easily.

Suggestion: Work with Companies like Dragon, or SW Companies for the Disabled: As I explained above, SW like Quadro has a bigger hurdle or barrier to acceptance than much other SW.  Such input mediation software is inherently a security vulnerability.  A user has to trust that the Quadro users (a) are not themselves bad guys, and (b) have not committed any errors in app security.

It is interesting to try to think about security models that would make it easier to write SW like Quadro (and keyboard macros facilities, and ...), and "let a thousand flowers bloom".

But until such a security model exists, in a popular OS - until then, security concerns will be a problem for Quadro sales.

At the moment the only way to remove this trust barrier is

a) Open Source (apparently not the way that Quadro wants to go)

b) be part of an already trusted company

Something like Quadro will only come into wide use if a major company - Apple, Microsoft, maybe Google - integrates it, makes t a standard feature of the OS that they sell.  This has happened, slowly, with software for the disabled.

Before that, however, companies like Nuance Dragon are a step partway:

Dragon already has to be trusted, since it is an input device that a user can use for all interactions.  Plus, Dragon has many of the software issues that Quadro has to solve: automatically figuring out what menus are on the screen, etc.

Smaller scale: there are many smaller companies, down to consultants, that provide custom software to accommodate disabled computer users.

If I were the Quadro developers, I would try to work with, and possibly sell, Quadro to this range of company.  (Well, I'm actually more of an Open Source type of guy, but I understand the need to earn a living.)


Problem: Gmail WebApp support broken:  since my main usage model is email, one of the first things I tried was to create a palette for Gmail.   If memory serves, there was no existing palette in the library for Gmail.  But when I went to create one such a palette popped up.

I suspect the following: the Quadro developers are developing Gmail support.  But t is not ready yet.  So they removed it from the top level palette list.  However, they did not remove it from the overall library, so it was uncovered when I started trying to create my own.

Bad SW practice:  when a feature is not being shipped, it should be completely removed or disabled. Shipping something "invisible" but available is a big source of security bugs.  And such sloppy config management does not inspire confidence in using a product such as Quadro.

Problem: Back out of Making Changes:  e.g right now, I started trying to change an Icon.  Had second thoughts.  But in the "Looks" pane, there is no way to say "Don't do anything, throw away all of the changes I just made".

So now I have to go manually find the icon that you originally gave me.

Problem: Searching for Icons:  e.g right now, I accidentally changed to no icon.  OK, I am going back icon to try to get the old icon back.  Happily, there is a big list of icons I can scroll through.   Search for "fast" - I see a few  Search for "Soon"- None.   OK, perhaps I should scroll manually.   But now I can't do that.

To begin with, I am given a big list.   But if I search, it filters the list.  And there is no way to go back to "No filter". Apart from workaround below.

I can work around this bug by selecting No Icon, hitting the checkmark, and ten hitting "Icon/Change..." again - which now gives me the full list again.  But that is really annoying.

Problem: Overlapping Buttons:  I was going to complain about how hard it is to edit a palette in Quadro, versus how easy in the Keypad app.  Quadro does not allow buttons to overlap, which can be a pain when moving buttons around.  Keypad allows buttons to overlap, and has a sort order front to back to determine which is visible.
      I was going to complain - I still complain - but I just managed to crash Quadro in a way such that buttons overlapped. :-)

Wish: More Button and Other User Actions:  Quadro seems only to support tapping on a button to get an action (although long press pulls up some help text (a note), while a press longer than a quick tap but shorter than a long press does nothing, confusingly).

The Keypad app supports more: single tap, double tap, triple tap.  I have used other apps that have more, like long press.

Keypad also supports a "Gesture Pad": in addition to 1/2/3 taps, it supports gestures like swipe left/right/up/down with 1/2/3 fingers, pinching, and rotation.
     At first I was quite excited about Keypad's Gesture Pad, since the new generation of email apps that I am trying to improve on have made great use of swipes in their UI - and I have found that I am much faster at using such a swipe based interface than I am at moving my hand to a button. However, after some use of Quadro I have found that its buttons are almost as good as the swipe based interface. I suspect that the real win in terms of speed/ease of use is not having to move my hand so far.  A swipe interface like Zero or Triage apps on iPhone just allows me to move my thumb where it is, whereas a button in an email-reading app on iPhone woyuld require a reach (unless the bitton, by good design, is placed where my thumb rests).  But Quadro is not an email reading app - the email does not appear on theiPhone screen.  Instead, my hand remains in the same place, and I just get to tap the button. So there is not that much differene in motion between swipe and Quadro, whereas there is a big difference between them and an iPhone mail reading app.
     Bottom Line: both swipe and Quadro allow the full surface of the iPhone to be used for user interface, rather than being limited to the periphery and hence requiring motion.
     It may not be a question of amount of motion, versus precision.  Buttons on an iPhone mail reading app are necessarily small, whereas Quadro buttons are larger, and swipes can be larger still.

Anyway, I am feeling less need to try to multiplex multiple commands off the same button as I thought that I might.  Such multiplexing also goes against one of the theoretic justifications of a interface such as Quadro: that the label or icon displayed indicates what the action will be.
    But: I am running out of buttons, especially since Quadro's limitations mean that its buttons are bigger than the buttons I created with Keypad.
    I probably would like at least one simple multiplex: a tap to perform the primary action associated with a button, while a long press would bring up a group hidden beneath the button.  Typically, a group of related commands.
    E.g. I might have a "Defer" button on which a quick single tap just deferred until the next pass.   While a long press brought up a fancier scheduler, with times like "Defer to Luch", "Defer to this Afternoon", "Defer to this Evening", "Defer to Tomorrow Morning", etc.
      I have long been frustrated by the small set of standard defer times, and the annoyance of having to use an arbitrary date/time chooser if outside the set.
      I suppose that multiple select times could be selected easily by tapping.  Possibly as a wheel, with a display - tap once, it says "After This", again whatever the next period, again tomorrow, again... until it loops back.
      Also, I can imagine pressing a button and then gesturing - e.g. press and gesture N for next pass, e for this evening, T for tomoorow, w for this coing weekend.  But I think that I am dreaming in technicolor: this has graduated from Quadro suggestions, to what I might have in my dreams.

It might be nice to have swipes off the buttons supported.

I have log imagined a "swipe syntax" - e.g. buttons for verbs like "Move" and "Copy", and a set of active labels.  With implicit subject being the currently selected message, swipe verb to object (target label). 2 verbs, N targets => N+2 buttons, versus 2N buttons as Quadro would currently have it, requiring separate buttons for "Move to Label" and "Copy to Label".

(Of course, "Copy to" might be "Add a label, without destroying any existing labels", while "Move to" might be "Remove all preexisting labels and add a new label".  (Or, "remove all preexisting labels of a certain class").  With this label interpretation, a third verb might be imagined - "Create a new object".  With or without the labels attached to the original.)

Wish: Want ability to bind commands to swipes:  Quadro provides the ability to generate swipes via is keyboard, but only allows them to be used for their standard text actions. Some of Quadro's competitors, like Keypad, provide the ability to bind commands/actions/functions to different swipes.

Generic Problem: Race Conditions and Other Errors in Target Actions:  QI have noticed race condition type problems in Quadro: e.g. press the Quadro button for "Archive" too many times too quickly, and eventually the next message is not selected as it should be.
    This is a generic problem, not specifically Quadro.   It is a problem with any event driven UI, if the action is asynchronous: in particular, it is a problem with any macro facility, which "Sends and Forgets".
     I was hoping that Quadro, because it is more integrated with the app than a simple macro like keypad, might be smart enough to detect when the command specified was finished before releasing the next.  Apparently not.

Handling errors in general is the bane of macro facilities.   E.g. some of my old AutoHotKey macros select Outlook folders by sending arrow keys to navigate menus.  If the menu structure changes... Even worse is sending function keys, which may error or be ignored - so that the next set of keys does something completely undesired.
    Quadro may reduce some of these errors by asking the app what menu items it supports, and sending those.  Accessibility frameworks, in both Apple Cocoa and Microsoft Windows, typically support this.  Programs like Dragon take advantage.
     One can think of ways to make input programs even more robust against such errors.   E.g. provide "transactions" - either all of the commands in the sequence are performed, or none.

Debatable Problem: Quadro Buttons are too Large, Text too bulky: In Keypad, on my iPhone 6+, I can fit default circular buttons 6 across width, and 9 vertically.   Or 5 defaut rectangular buttons across, same 9 vertically.  But I can also redue height, so that I can have rectangular 18 rectangular buttons, vertically, with perfectly readable text
    In Quadro,  I only get 4 across and 6 vertically.
    Obviously, I can get much less on a Quadro screen than in Keypad.

Worse, keypad does not have a fixed grid of button sizes - or, rather, it has a grid, but buttons are about 10x larger.  So much more aesthetic effects can be attained. It's the difference between a fixed width font and a proportional font with kerning.

Worse still: I find that I can hardly ever create useful 1x1 buttons in Quadro.  The icon set is insufficiently self explanatory, and Quadro will not display both text and icon at 1x1.  So nearly all of my Quadro buttons are at least 1x2, to get a useful amount of text, or an icon plus a label. 2 acroos, 6 down => 12 total.

I recommend that Quadro allow the text label to be displayed below the icon in a 1x1 box.  Oftentimes just a single word, in small type, is enough to let somebody figure out what an icon is for - and eventually visual association kicks in.  It is faster to squint at small text than it is to long press to see the note.

I would also like to recommend that Quadro support smaller icons in addition to the current size.  But that is a second tier suggestion.

Now, I am surprised that I am thinking about this.  I really do advocate "Few Big Buttons", and surely 12 buttons is more than enough?
     Probably for "top level" keypads (aka palettes).
     But... I sometimes want to escape into larger sets.   E.g. in my usual email triage app, I usually only need Archive / Defer Briefly / Defer Longer plus maybe a few top level projects. Currently 10 buttons total, of which one is used only to work around a Quadro limitation.
      But even here, the 12 button de-fact limitation means that I cannot use a nice big 2x2 button for more than 1 or 2 buttons.
       I.e. allowing smaller buttons for infrequently used tasks allows larger buttons for frequent tasks.

Moreover, this is just in my top level keypad / palette.  From this I may escape into a scheduling palette, with a list of standard times, or a list of projects that is larger than my current WIP (Work In Progress) list.  Although I can usually only handle 2-4 WIP projects, I often have a dozen background projects going on.

+ Time:
++ Soon, as soon as I am finished reading email
++ Lunch
++ This afternoon
++ This evening
++ Tomorrow Morning
++ This weekend

+ Place:
++ At home
++ At work
++ On the beach
++ In the woods
++ Grocery Store

+ Person:
++ Wife
++ Daughter
++ Boss
++ Coworker 1

Problem: Error Handling: Quadro misbehaves if Apple Mail (Gmail) / Move to / folder has been renamed or moved:  Second time this has happened.  I am reasonably certain that there is no other problem, and that the misbehavior - ultimately a hang - has been reproduced, and is due solely to this problem.

So, here's the situation: I want to use Quadro mainly for "Email Triage" - going through my email as quickly as possible.  Mainly hitting "Archive" and moving on, sometimes refiling the email in folders such as "Defer", "Defer Briefly" (which means "handle this after I have scanned all of my email), "Delegate to PersonX", and possibly refiling it to a folder associated with one of a small number of projects. Usually, the small number of projects, 2 or 3, is a subset of a larger list.   Which projects are in my top-level triage list change regularly.  E.g. today my top level projects are "Giving" (receipts for tax purposes for charitable contributions made at the end of the year), and "College Search".

Like I said, these projects change.  They move around.  Sometimes they get deleted, or at the least renamed.  Sometimes they get reorganized, e.g. moved from Projects/Current/Foo to Projects/Completed/Foo.

This is what has just happened.  I changed the name of a project.  There was an existing Quadro button for the project.  When I opened the Mail app and the email triage palette/sheet, Quadro worked - but the button that moved the selected message to the renamed folder did nothing.  It dod nt appear to hang, it just did nothing.

However, when I further tried to edit the button, when I opened "Application", Quadro just plain hung - before displaying the application list. Rotating wheel.  ... Eventually - 10, 15 minutes later? - it timed out.    Since there appears to be no way of cancelling a button (pad) edit in Quadro, I had to tap the check mark. Wt this point I got asked to place the button - then death.  The button eded up placed overlapping other buttons.  Quadro nonresponsive.  Next time I hit checkmark, it just disappears.

When I reopen the Quadro app on the iPhone, it "works", in the sense that I can switch palettes.   It thinks that it is connected to the Mac QuadroSync.   I get Mac notifications.  But none of the buttons do anything.

When I got to this point last time, I restarted both iPhone and Mac.  Restarted Quadro. Deleted the button(pad) that I thought might be causing the problem.   Was frustrated that that did not solve the problem.   Ended up deleting almost all of the Quadro buttons I had created, and then realized that in addition to the "missing move to target", I was not tapping fast enough.  And when I recovered from that, the problem seemed to go away. Now, let's see...

Restarting the Mac but not the iPhone.  Quadro restarts.  Works at first - iPhine Quadro switches between Chrome and Mail when I move between Chrome and Mail on Mac.
      But after first time I tap on the possibly bad button(pad), Moving to the renamed folder, same sort of misbehavior.  Hangs.   Currently I am getting a "Drag the Pad to position", for a pad that I was not editing.
      I.e. gives every indication of a bug such as a buffer overflow.

Quadro hung, so I double-click iHone home button, ad swipe it away. Restart. Still hung. At this point I should probably look at the QuadroSync process on Mac.  But I have other stuff to do.

No, wait...  the QuadroSync process has disappeared.  Restarting.

This time, I am very careful to delete the button with the filter that got renamed.  NOW I can recreate it, without Quadro hanging (yet).  The new button works,

But... I kept a duplicate of the old button in a group.  Click on that, same problem.  Hangs for a while. Eventually, the Quadrosync app on Mac disappears from the status bar.  I assume it has timed out.   However, the iPhone Quadro app still; hangs - either it does not have a timeout, or I have not waited long enough without typing at it.  If I type at it, eventually it dies.  I can hasten its death by double-clicking home and swiping it out.

CONCLUSION: it looks pretty darn sure that if Quadro tries to do Apple Mail.app, "Move to", a folder (mailbox) that no longer exists, that Quadro misbehaves.

This is not a total surprise.  This sort of problem often occurs in scripting that is "blind", which does not check the return status of an application.   Moreover, it is quite likely that, if Quadro is using AppleScript or te like, that there is no way to check that the Mail app is having a problem.   UNIX shell scripts can check, when every command is a separately forked/exec'ed process, by looking at the process exit code. But there are fewer standards for checking the error of a command sent to an app, as if human interaction.   UNIX expect scripts can look for error indications, but there must be some sort of error log or console for expect to run on.  Again, no standard that I know of for such error handling on Mac.

If there is such a standard, the Quadro is not using it.   That would be regrettable.

If there is no such standard, then that is especially regrettable.

Even though I can understand Quadro having this sort of problem, nevertheless the sort of behavior Quadro exhibits is bad.  It gies every idication of a buffer overflow.   I will sketch out below what proper error handling should liuke like, eve if the underlying Mac tools do not support error handling as well as might be wished.

I was really, Really, REALLY hoping that Quadro, because it is more tightly integrated than a VNC sender like Keypad, might handle such problems.  Seems not.

Glew motto: Error handling is the true test of software quality.

TBD: how to deal with errors such as this:

Separate iPhone Quadro and Mac QuadroSync processes, obviously.  On the Mac, need separate comm process and process to interact with applications. Possibly more than one of the latter, so that actions such as "Kill Hung Process" can be scripted via QuadroSync.  Keepalives and timeouts. On UNIX, siagalrm signal handlers.  Report an error when timing out, instead of randomly performing what appears to be a buffer overflow.

Problem: Quadro hangs and otherwise misbehaves on an error such as a "Move to" folder target no longer existing:  The first bug is that Quadro hangs wen its button configuration does not match the app configuratuon.  Whiole pne might argue that is a user error, it is still bad to hand.  (And it is stupid to say that it is a user error.)

Problem: Quadro hangs and otherwise misbehaves on an error such as a "Move to" folder target no longer existing:  The second bug is that Quadro should be able to detect when the folder targeted by Mail > Message > Move to ... no longer exists - because Quadro obviously can get the folder list to set up the button.  So evn though Quadro should not hang it would be even better if Quadro could detect the error before hanging, and proide an error message that the user can use to figureout which button(s) are bfoken, and fix them.

Problem: Need to be able to see "Menu Path" to a Function/Action :  actions in Quadro's functions for buttons (pads) are usually obtained via a path, that often corresponds to a menu hierarchy, probably because Quadro is automatically inspecting the app menus: e.g. Function > + add actuion > Applications >  Mail > Message > Move to > (select folder from a browse list, e.g. "tax" and then "giving")

However, when inspecting a button, all that I can see is the last element "giving".

Problem #1: not necessarily unique.  The same name can appear multiple places in the tree.

Problem #2: if a bug such as described earlier, where a target path got moved without updating the Quadro button....  well, it makes it darned hard to update the Quadro button if you cannot inspect to see where the problem is.

It would we really, really, nice to e able to see what the full path is from the Quadro UI.

Having a text readable data format for palettes would go a long way towards this, and more: the I could grep for invalid folders, and/or automatically keep in synch.

Problem: It is annoying to have to reseelect App each time I add a button:  My application involves creating many buttons in the same palette for the same app.   This will not be just at start: I will have to do this constantly, as projects get added and deleted.

Each time I hit edit (check) and + to add a pad, then applications, I have to scroll a LONG LONG WAY down thelist to find Mail.  And then into the mail.

At the very last, Quadro should remeber that the last app accessed was Mail, and take me there.

(Quadro does put the current app at the top.  But since log each change in a website, this is always Chrome, never the app that I am adding a Quadro action for, Mail.)

Lesser Problem: Folder (Mailbox) list in Apple Mail.app "Move to.." loses structure:  I have three email accounts connected to the Apple Mail.app. Quadro loses some of their structure when it makes them available for the user to choose from.

The snippet below shows the structure, which I will summarize as



















  • Mailboxes

    • Inboxes
      • Exchange
      • iCloud
      • Google














  • Various Mail.app mailboxes, like VIPs and Flagged
  • Exchange













  • exchange folders















  • iCloud

    • iCloud folders














  • Google

    • Gmail folders
    However, while the folders and subfolders are represented with the classic unfolding tree, the top level is indicated by having "Mailboxes", "Exchange", "iCloud" and "Google" in a different font.

    Unfortunately, Quadro, when it makes the folder (mailbox) list available, loses that structure. So, for example, "Google" appears undistinguished from its first folder (mailbox), "Starred".

    (Half of the moving of folders around above, that caused Quadro to hang and then crash, was to try to minimize the ugliness of this flattening.)


    Problem: Quadro does not understand terminating at an interior node of a menu tree:  I will provide first the example that bit me just now, related to email filing. However, this is a generic issue with Quadro which I was already planning on posting about.

    Many Quadro actions correspond to traversing a menu tree.

    The following example corresponds the menus for Apple's Mail.app, as understood by Quadro.  The bold stuff are standard; the italicized stuff are folder names. (Inbox is bold an italic - its a folder name, can even be changed by user, but is standard):

    • Application
      • Mail (Apple's Mail.app on MacOS)
        • Commands
          • Mail
          • File
          • ...
          • Message
            • ...
            • Move To
              • Inbox
                • Exchange
                  • Defer 
                    • Defer Briefly
                    • Someday
                  • Projects
                • iCloud
                • Google
              • ...generic per server Drafts, etc. ...
              • ...  etc
    Note: on my Exchange account, I have subfolders of Inbox. In Apple parlance, I have mailboxes inside the Inbox mailbox, and sub-sub-mailboxes, etc..  E.g. "Inbox/Defer/Defer Briefly".  They work in Exchange.  They work with Mail.app.   (Gmail, on the other hand, does not allow you to create subfolders of Inbox, although it does allow you to create subfolders of most othe folders (labels, in Gmail parlance)).

    Here's the problem: Quadro thinks that you have to traverse all of the way to a leaf of the menu tree.  
         So Quadro does not allow me to Move To my Exchange mailbox/folder Inbox/Defer.   Nor does it allow me to Move To Exchange>Inbox.  It requires that I go all the way to Inbox/Defer/Defer_Briefly.
         This sucks.  I have defined a mailbox hioerarchy, and Quadro does not allow me to use it.  To make my hierarchy work with Quadro, I would have top create special "other" subfolders all over the place.

    This is NOT a problem with Apple's Mail.app.   Apple allows me to Move To Exchange>Inbox and Exchange>Inbox/Defer.  It is solely a problem with how Quadro interprets, traverse, the menu tree.

    Before I was aware that this was a problem with moving to email folders, I realized that it was also a problem with any menu tree.   Many of my own mashups of commands have done things like open a menu top level or interior node, but not traverse all the way to the end. Then, when the macro stops, the menu is open on the screen, and you can finish traversing it via keyboard or mouse commands, which you can have bound to still other macro keys.
         This provides a Quick and Dirty way of parameterization.  Instead of having the toll snarf down the whole m,enu tree, the tool just traverses the hard part to the obvious part.  Often the problem is getting past the first few levels of the menu tree.

    Macros like this are easy to do
    • with Karabiner on Mac
    • with AutoHotKey on Windows
    because they are sending raw I/O events, like keystrokes and mouse movement and clicks, to the apps.
         In fact, that is pretty much the definition of a "macro".

    Command processing systems like AppleScript or Cocoa key bindings may or may not allow stuff like this.   

    Quadro allows  "shortcuts" - but these appear to be only keystroke shortcuts.  Searching frantically, I cannot find any Quado actions that emulate mouse clicks.
           Keypad, conversely (still my main competition for Quadro), supports mouse clicks and keystrokes.  Keypad does not directly support traversing the app menus, as exposed through accessibility and other interfaces,.  But it is straightforward, although annoying, to bind to commands in Keypad.

    I would not care so much about not having mouse clicks on Windows - Windows is pretty good about having a keyboard equivalent of every mouse commands.
         Apple MacOS, however, has long resisted having fully functional set keyboard menu navigation. For example, as far as I can tell there is no standard way to open the context menu from the keyboard.  ... Well, there is Accessibility NumPad+Ctl+5 to open the context menu (Fn+Ctk+I/5 on MacBook). Unfortunately, I can find no way to send a numpaf+ctl+5, as opposed to control+5, from Quadro.
           Similarly, Ctrl+F2 accesses the menu bar, and you can type in menu names and arrows to navigate the menus.   But I can find no way to enter Ctrl+F2 in Quadro.

    Quadro's "shortcut" appears to be limited to opt-ctl-cmd-shift-... plus a keystroke  that can be sent via the iPhone keyboard.  The  default iPhone keyboard has letters a-zA-Z, nuymbers 0-9, and the usual collection of symbols.  (Plus emoji).  But as far as I can see, it has no way of generating function keys like F1.
          Perhaps if I install an alternate keyboard?  Damn, yet another thing to research.

    (OK, I can see that, since Quadro has a keyboard, and also what amounts to a touchpad with swipes.  So obviously Quadro can generate arrows keystrokes.
        Now, I want to be ab le to send them from my own buttons.  I don't want to have to switch to a keyboard to type them.  Besides, in my usage of Quadro, I might as well switch to a real keyboard.
        E.g. in my Quadro palettes for Apple's Mail.app, I can move between messages by quadro keys bound to command+P/N keystrokes, which Quadro's shortcut feature allows.    But Microsoft's Outlook.app uses arrow keys, and hads to P/N bindings that I can find. So I have to switch to the keyboard.)

    I am considering creating Mac OSX shortcuts like cmd+opt+shift+ctl+P/N for arrow motion, etc.   Bit this is suboptimal, a pain to maintain, and part of the reason I tried Quadro in the first place.
         

    OK, the following seems to be  a fairly generic way of getting to the Mac top level menu, that uses only keys Quadro can currently send (no function keys or mouse clicks):

    • cmd+shift+?: get to Help menu in menubar
      • in a text box typing a search term.
      • now, how do I get out of that text box
    • right arrow: wrap around the menu bar to the apple menu
      • more importantly, get out of the
    Unfortunately, macro-ifying to navigate the menu bar is subject to all sorts of problems.  What if menu items change?  
           Oh, wait: there is no obvious way for Quadro to send an arrow,

    Anyway: this started out as "I want to be able to move to an interior node of a folder hierarchy in Mail".

    Generalized to "Often I want to just plain open a Menu, but not traverse to a terminal command".

    And morphed into "Quadro may be okay at exercising application exported commans (menu names), but Quadro does not seem to have ways of transmittig full input macros.  

    Problem: Quadro  macro facilities: no obvious way to tranmit mouse clicks, function kerys, arrow keys, etc:  Quadro's shortcuts seem to be limited to modifier key + a-zA-Z0-9 plus a few symbols.  But no function keys. No arrow keys.  No mouse clicks.
           It looks like Quadro is concentrating on the menu commands exported, typically to Accessibility input managers, also to Apple Script and Apple's standard Keyboard Shortcuts.  Command driven is good, avoids many of the problems of macros - like, what if the menu sequence has changed?
          But, often the command set is incomplete.  At which point you have to fall back to sending raw user input events.

    It looks like Quadro has concentrated on AppleScript-like scripting, and not so much on raw user input.  It only has a limited set of "shortcut keys", and appears incapable of generating function keys and mouse clickls.  I believe that I came across a Quadro blog saying"Do that with AppleScript" or the like.
         I have started writing custom AppleScripts emitting system events for the stuff that plain old AppleScript and Quadro cannot do.  Nooby problems, plus the usual problems with raw I/O macro scripting.  Interestingly, the more of these I have, the  less I need Quadro - I can probably call them from other systems, like Keypad, or even VNC.
         I sure would like it if Quadro providing full "Raw Mouse and Keystroke Event Scripting", in addition to the AppleScript level scripting it sees to be supplying now.

    Inpsired to meta-genericize:
    http://blog.andy.glew.ca/2016/01/scripting-raw-io-macros-versus.html


    Problem:  two versions of app "Microsoft Outlook", Quadro gets confused.
         I have two versions of apps called "Microsoft Outlook":
    1) the Mac native Microsoft Outlook (formerly Accompli)
    2) I have the Parallels virtual machine installed, and Windows Outlook in the guest.
          Quadro starts the Parallels version.   But it sees to send commands to the native version.  Te Windows version exports no commands to OSA / AppleScript / Quadro, although the native Mac version does.

    While I cannot criticize Quadro too much for this - first world problem, aka power user problem (if I am a power user, and not a wants-too-mich-power-for-his-own-good user) - it is still a problem.

    TBD: try to fix by editing resources to give unique names.

    TBD:  I wonder if Quadro's problems with Gmail are caused by having multiple Chrome windows into Gmail?  Hmm....

    While I can imagine it might be hard for Quadro to handle multiple instances, it can probably detect and warn user.

    Problem: "NOT CONNECTED / Tap here to open connection panel" does not work - the tap here does not work - when editing a page (creating a new pad):
          Pretty self explanatory.  More detail: I am trying ti create a new pad.  I hit "Applications".  I get the NOT CONNECTED warning.   But "tap here to open connection panel" does not open connection panel.  I need to exit out of adding a pad - and, in fact, add a broken pad and then delete it (more reason to want a "Cancel Pad Edit), and then hit Star, Open Library, the display oicon to get to the connection panel.
          Typical problem: and error message that may or may not work in one context, but not another.  (Interestingly, I do not even get that error message when I am not editing.  Nothing happens at all.

    Problem (Enhancement): I want 2 distinct pads for same app - Email Triage, personal and work.  Many buttons same, but some (folders) different.  Quadro's sharing imposes annoyances:
          At the moment I have two different sheets for Work/Personal.  5 buttons(pads) that are the same (mark unread/undo/cloise/open/archive).  But 4 buttons that are different - particular refile folders.   And 1, or 2, that are parallel but different - "Defer Briefly" is in both, but different "Defer Briefly" folders fir the different accounts. Plus "More..." button that takes me to

    Now, I know how to have a single sheet for all the common stuff, and different sheets for the per-Account stuff.   But that means that I cannot have a single sheet that has the most common buttons for Work/Personal, some of which are common, some of which are not.
         Pus, switching sheets is not obvious.  I want a button that can switch sheets.

    Similarly I know about groups. I could have separate groups for the common stuff, Work Stuff, and Personal stuff.   But that requires switching between groups.  Does not allow the most common stuff visible all at same time.

    SUGGESTION: superimpose sheets.
       E.g.    Work Triage = Common Stuff with Work Specific Triage stuff superimposed
       E.g.    Personal Triage = Common Stuff with Personal Specific Triage stuff superimposed

    (Plus, of coursem ability to jump to the suoerimposed compoments separately.)

    Plus ability to have buttons link to sheets.  (Which would almost do away with need for groups).

    Problem (Enhancement): Groups are Modeful:
          From my main triage palette/sheets, I go into a group to use the actions that do not fit at top level.  I hit a button(pad) for the action.   But I then have to exist the group to return to the main sheet.

    Reflects two different mindsets:  sometimes a sheet/group is a persistent, modeful, context.  Commands used over and over together.

    But sometimes a sheet/group is an escape:  Too many pads to fit at top level sheet, so escape to another sheet/group, select a command.   But now want to return to top level.

    Once again, having actions that change Sheets/Groups would accomplish both.

    Bug: Quadro just crashed. Jan 7, 2016, 2pm.
        I have experienced crashes before, but before I could guess - e.g. accessing a folder that was renamed in Gmail but not in Quadro.
         This time, no idea.  It just became unresponsive, and then *pop*, the iPhone app disappeared.   Apparently the Mac app, QuadroSyc, also disappeared.

    Bug: repeated Quadro hangs ... 3pm
        I would love Quadro - if it worked reliably!!!
        What I have works lovely - when it works.  But it has hung a dozen or so times this afternoon.   It works for a while, then stops working.   And I have not yet been able to figure out a pattern - although I am beginning to suspect it may just be due to having too many buttons/pads.

    I have rebooted/restarted both my Mac and my iPhone several times.  But I am beginning to see that it may not always be necessary to do a full reboot/restart.

    Request: please provide a "Restart QuadroSync" option
        While debugging the problems mentioned aboe (or, rather, trying to work through them), I have several ties restarted QuadroSync  on ny MacBook.   Usually by going to the Quadrosyc icon in the menu bar, hitting its only pulldown Exit, and then reinstalling.  There must be a better way.
         I highly recommend adding a restart entry to the pulldown menu.   If it worked, it wouyld make this much less frustrating.

    :-) Almost two hours without a crash or hang: :-) Yippee!!!!
        What did I change?  Not sure ....
        Except that I did put Mail.app into "Offline" mode.
        After some of the early hangs I saw warnings like "Mail abort: 2 messages could not be sent to the mailbox "Archive-Exchange".
         I conjecture that these networking problems were and are related to the hangs.

    Of course, I may just have a lot of such problems that will be reflected as "synchronization errors" when next I connect.

    I don't expect Quadro to eliminate such problems.  I do expect Quadro to be well behaved in the presence of such errors.  Ideally, to provide enough information to help figure out what they are - which things are haing problems.

    I was hoping that Quadro, because more tightly integrated (via AppleScript) than a raw keyboard/mouse macro program, might be more robust. While Quadro may be more robust, it is not clear if it is doing all of the error handling that it should be.

    Bug: Timing Sensitive Behaviour Observed
        I just observed a slight Quadro stall (not a full fledged hang), during which I tapped on the keypad a few times, thonking I may have mistyped.   And the events were qyueued up, and applied to the wrong emails
        Thank goodness for the Undo command in Mail.app.
        All SW should have an Undo command.  (Yes, Quadro, I mean you)

    I was hopeful that Quadro would be able to observe when actions are complete.  But it seems, more and more, that Quadro is largely AppleScript/OSA based, and ApplesScripts often need to add delays.

    Timing sensitive programs: bad idea.  I wonder how many of Quadro's built-in palettes have delays built in?

    Problem: Quadro needs ability to rotate dis
        Quadro on my iPhone only runs in Portrait mode.   I badly need it to be able to run rotated, in Landscape mode, if only because at my desk at work I can only prop up my phone in Landscape mode.  And because the iphone cable gets in the way in portrait mode, coming from the bottom.  (I need to plug in charger while using Quadro all day.)


    Problem: Quadro annoying error messages llike 'QuadroSync connection error / The daemon in the cellar just shout: 60
        I am sure that the developer thinks these error messages are amusing.
        Me, I just find them annoying.  And off-putting. Non-professional.
        Professionalism matters, because a product like Quadro, as I noted above, is a big security vulnerability.   This sort of childish error message is the sort of thing that you find in malware and Warez sites.  Every time I see an error like this I think to myself "I wonder if the Quaadro guys have stolen my identity and are emptying my bank account now?"
        Ditto the poor English grammar: "just shout: 60"
        60 what? I assume that it is an error code.  Error code returned from what?  AppleScript.

    Inspires more thinking about security model: Quadro is better than a third party keyboard or mouse, because not all of my I/O goes through it.
         Of course, I don't klnow that: being non-open, Quadro might have hooked itself into the OS in a place so that it sees I/O from  other devices.
        But assuming not that, then the problem is that Quadro can generate everything.  Again, if the Quadro events and commands were tagged with a capability, I could make sure that the really security sensitive apps do not accept Quadro input.
        Q: tag with a capability given to Quadro?  Or tagged with Quadro's ID?  Both...

    Amusing Quadro side effect: causes smartwartch to count spurioius steps
         I wear both a Pebble smartwatch and a Jawbone UP2 fitness band.  Long story as to why I suboptinally wear two.
         Yestertday, I was wearing watch on right and Jawbone on left.  Both counting st5eps.
          I noticed that watch reported 16,000 steps, while Jawbone reported 6,000.  Usually they are within 10% of each other.
         I conjecture that Quadro was causing me to move my right arm more.
         I think that is good: big muscle movements rather than small finger and wrist movements.  And none of the stretching for modifer keys.  I am fairly certain that changing from mouse to trackball had a similar effect, and helped my "computeritis" a lot.


    Jan 8, 2016, 11am: I *LIKE* Quadro
         I like Quadro so far very much, even with the problems above.
         Using Quadro, I have been able to acheive Inboz Zero in my personal email for the first time in months, and am almost caught up with work email.
         I continue to like the Zero iPhone  app - but I suspect that Quadro will make me much less reluctant to use my laptop.
         I like Quadro enough that I am seriously considering buying a cheap tablet to run Quadro on. Larger surface area, more buttons than fit on my iPhone 6+.

    Problem: Quadro really needs to be on Android, other cheap tablets
         I like Quadro very miuch. Enough that I am considering getting a tablet just to provide extra surface area for more buttons.
         Problem: Quadro only seems to be available on Apple iOS, iPhone and iPad.
         This is a major obstacle.  Cheap Android tablets are widely available. Apple iPads are much more expensive.  Even a used iPad first generation costs >90$, at least on Amazon.  New Android tablets are available for <40 br="">    (Plus, I have two cheap Android tablets that I never used - they were given away as conference swag.  Never used, because too slow.  But may be fast enough for Quadro usage.)

    By the way, it would be nice to have a statement about minimum system requirements.  Will Quadro run on a 16GB original iPad?

    Long-term - if the Quadro developers really wish to push it - of course, don't even need Android or iOS.  Just need a cheap touchscreen and a radio.  Probably Linux OS.

    The biggest reason to be on Apple is the ecosystem - there is greater certainty that the developer will get paid.  Android almost as good, although easier to pirate the software.  Linux ...   might as well give up hope of getting paid.
          But there is probably a market for selling a dedicated Linux I/O device like Quadro.  But that gets you into the hardware business, which is not much fun.



    Minor Problem: QuadroInstaller.HelperTool left running, even though QuadroSync Exit invoked

    I have started looking at the running processes, since I have to restart QuadroSync and Quadro so often   I noticed the following minor problem.  (The fact that I need to restart so often, that Quadro hangs so often, is not a m inor problem.)

    "Exit" should mean "everything".   There should be no Quadro stuff left running

    Initially QuadroSync is running
        $ bash $>  ps alxwww > ps2
        $ bash $>  grep -i quadro ps2
    0  6125     1   0  31  0  2469944   2688 -      Ss     ??    0:00.01 /Library/PrivilegedHelperTools/com.quadro.QuadroInstaller.HelperTool
          501  6127     1   0  46  0  4123340  90048 -      U      ??    0:01.74 /Applications/QuadroSync.app/Contents/MacOS/JavaAppLauncher
          501  6132     1   0  46  0  2576088  12320 -      S      ??    0:00.04 /Library/Application Support/Quadro/QuadroNGui.app/Contents/MacOS/QuadroNGui
    I go to the QuadroSync menubar icon, right click, click on exit
        $ bash $>  ps alxwww > ps3
        $ bash $>  grep -i quadro ps3
    0  6125     1   0  31  0  2469944   2688 -      Ss     ??    0:00.01 /Library/PrivilegedHelperTools/com.quadro.QuadroInstaller.HelperTool
    I.e. 2 of the Quadrosync processes were killed, but not the third, the com.quadro.QuadroInstaller.HelperTool
    This may be left from installation.  Be that as it may, it should no longer be running.
        $ bash $>  uname -a 
       Darwin SYSTEM-NAME 14.5.0 Darwin Kernel Version 14.5.0: Tue Sep  1 21:23:09 PDT 2015; root:xnu-2782.50.1~1/RELEASE_X86_64 x86_64
        $ bash $>

    Problem: Immense Frustration when Quadro hangs repeatedly; great happiness when Quadro works

    Yesterday, reading email from home, I was frustrated to point of despair by repeated hangs.  Often hangs seem to be die to error handling - Mail.app dialogs about what appear to be Exchange server errors.

    Was about to give in.  Leading to shopping for other Android apps, XKey physical keypads.

    Today, reading email from work on a Sunday, nobody else in office, Quadro worked well enough.

    It would be sad if Quadro Mail.app not reliably usable from home.   But useful if could consistently use from work.  Unfortunately, on other days Quadro has died even at work, so such simple "it works here" do not quite apply.

    But even if I can only use something like Quadro once a week, only on a Sunday when network is unloaded, would be useful enough.  I just need to learn when it can be reliably used, and when it should be avoided.

    Problem: Partial ls of Quadro crash report logs:
    /Users/glew/Library/Logs/CrashReporter/MobileDevice/AG6i/Quadro_2016-01-05-131041_AG6i.crash
    /Users/glew/Library/Logs/CrashReporter/MobileDevice/AG6i/Quadro_2016-01-05-132416_AG6i.crash
    But these logs do not seem to include all of the hangs, when I have been able to "cleanly" exit/restart.

    Problem: Must constantly reenter (changing) IP address 

    As I move from home to work, from net to net, I must constantly determine and reenter IP addres.

    (Usual problem with pairing - yet another reason why BlueTooth, with an existing pairing solution, might be a nice way to go.)

    Good: works across tether / Personal Hotspot 

    If my iPhone and Mac had two wifi connections, one for such local Wifi based device connections, and the other for talking to the outside world, this might allow me to not have reenter TCP/IP address so often.

    Works when Mac is wired - still can use Personal Hotspot wifi.

    But not when Mac needs wifi to connect to net, when I don't want Mac to send everything across phone.

    Problem: Often "bounce" when hitting a group, also hitting button at same position in group entered 

    I use a Quadro "group" as an escape to a collection of pads that do not fit on the main triage screen for my personal/work email triage palette.

    Unfortunately, often when I hit the group button/pad, I end up accidentally hitting the button that happens to be at the same position on the screen in the new group,   Which means that the incorrect action is often performed.

    Thank goodness for the "Undo" button!!!  (Which I quickly learned to place on every frequently used Quadro palette/screen.

    If this were a keyboard, I would say that the problem was "key bounce".

    Key bounce should not apply to a touchpad.  But it is almost as if the Quadro is asking to read the touch position on entry - or if somehow that reprogrammed keys are being reread, which a new "press down" event.

    If I am very careful and quick, I can quickly tap and release and not get the extra key.  But if I press at a moderate speed, this "bounce" occurs.

    I do not have this sort of problem with other apps.

    Good: Quadro worked well today, no problems: Jan 10 
    I am going to start recording when Quadro works both with and without problems.

    Today, at the office, no major problems.  The key bouncing issue on the "More..." button.  But no crashes, no hangs.   If it always works like this, I love Quadro.

    Problem: Quadro timeout when client and targdet on different nets - no way to sto, had to wait until timeout 

    This morning connecting at home.  My iPhone, the Quadro client, and my MacBook, the Quadro target, got onto different wifi networks.  Since using non-routable IPs, it is only to be expected that they could not connect:  my complaint is that I had to wait until the connection attempt timed out.  None of the usual ways to cancel a pending connection - hitting the back arrow, etc. - worked.  I was about to doubleclick and kill when it timed out, and I could reconnect properly.

    This raises a bigger issue: normally I have my phone and laptop on different wifi nets, with no peer-to-peer.  I can change this at my home - I have done so - but not everyone will be able to do this.

    For example, at work my company laptop will be on a wifi SSN XXX-Staff, while my phone will be on wifi net XXX-Staff-BYOD, or XXX-Guest.   There will be no peer to peer.  I think this means that Quadro will be useless in this environment, unless I set up a tunnel, traversing thew net out and back in.

    This has not bitten me at work yet, because my laptop has been using a wired ethernet, and has also been able to use personal hotspot tethering.  But it will hurt me when I travel to other offices in the next week.

    I do have the option of using personal hotspot / wifi tethering, and sending all of my laptop traffic through my phone's personal dataplan.  I am not enthusiastic about that. Plus, will require VPN even when I don't otherwise need it.

    Many similar scenarios can be imagined.

    In particular, if Quadro-like software is ever on an Internet-of-Things device, not a full iPhone - well, nobody I know who cares about security is going to want to allow IoT devices onto the same wifi segments as the machines that actually matter. (Of course, an extended input device with Quadro arguably really does matter, and possibly should be on the secure network.)

    This is one of the advantages of using BlueTooth - even if the Quadro "extended input device" tunnels TCP/IP across BT, the fact remains that computer systems are set up for device-to-device Bluetooth, while having wifi and other networking going elsewhere.

    Problem: want more 'Context' than simply app name

    Quadro seems to use the app name as the context.

    I would like option of using the full window title.   E.g,. I use Quadro Aplle Mail.app for both personal and work.  So I want to use a work palette/sheet for Quadro when window title is 'Inbox - COMPANY 76 messages', and personal when window title is 'Inbox - Google 453 messages'.  Regexp?

    I know this can be done. RescueTime does it.  On Windows, AutoHotKey does.

    Unexpected Benefit: RescueTime less confuses
    An unintended side effect of Quadro is that, since Quadro's client is running on my iPhone, my RescueTime time tracking is more accurate.  Whereas, when I do the equivalent of Quadro using a tool running on my PC, such as AutoHotKey, RescueTime cannot always attribute the time correctly.