Date   

Recommended NVDA remote server based on golang development

 

 
Hello everyone
 this is the new NVDA remote server based on go lang development, here is the official GitHub repository and description
GitHub Repository:
https://github.com/tech10/nvdaRemoteServer
docker link
https://github.com/users/tech10/packages/container/package/nvdaremoteserver-docker
readme:
# Introduction
 
Welcome to the server for the NVDARemote addon, written in the [Go programming language.](https://golang.org/) The idea for this program was enspired by [the one released here.](https://github.com/jmdaweb/NVDARemoteServer)
 
The original server for the addon is written in [Python,](https://www.python.org/) which works well enough under most circumstances. However, there were a few reasons why I wanted to write the server in Go.
 
- Performance. Go can be much faster than Python if you write your program properly.
- Automatic generation of the self-signed certificate, if desired. Both the addon and the server utalize self-signed SSL certificates, and the addon doesn't verify a certificate's authenticity before connecting. Therefore, I wanted a program that would automatically generate the needed certificate, store it in memory, and use it until the program is terminated.
- Less memory should be used by the Go program.
- Easy to compile on other operating systems without changing the code base much, if at all.
- Can be compiled into a static, position-independent binary if desired, for use across systems using different libraries.
- Should be able to easily upgrade a program to utalize the latest version of Go without changing API calls within the program.
 
 
## Goals
 
My goals for this project are to create a stable server for the NVDARemote addon, which will be fast and have an efficient memory footprint. Configuration of the program will be done through the command line. Any log output can easily be redirected by the various facilities across operating systems, so a log file wouldn't need to be implemented by the program.
 
 
# Downloading / installation
 
## Go
 
With the latest version of Go installed, use the following command.
 
```console
$ go install github.com/tech10/nvdaRemoteServer
```
 
This should download and compile the latest code, placing the binary within your GOBIN environment variable. Presuming you have the GOBIN in your path, you will be able to execute it fairly easily. If not, you will need to update your path or execute the binary with its full path.
 
 
### Static build
 
If you require a completely static build of the program, you can clone the GitHub repository and execute the bash script. So long as you have the [musl libc](https://www.musl-libc.org/) installed, and musl-gcc in your path, you can do the following:
 
```console
$ git clone https://github.com/tech10/nvdaRemoteServer
$ cd ./nvdaRemoteServer
$ ./build-static.sh
```
 
Installing musl libc is beyond the scope of this document, and is specific to your Linux distribution.
 
 
## Docker
 
Thanks to a feature request in [issue 1,](https://github.com/tech10/nvdaRemoteServer/issues/1) a Dockerfile has been added. Automatically built and published images with GitHub actions are currently placed on the GitHub Container Registry, a service that is in public beta. As such, this service is subject to change until it's announced as stable. I don't anticipate many changes to the service, so everything ought to continue working as is.
 
Below are some minimal examples of getting the service up and running within a Docker container. The installation and use of Docker is beyond the scope of this document.
 
 
### Downloading the Docker image
 
#### GitHub Container Registry
 
The automatically built images are [located here.](https://github.com/users/tech10/packages/container/package/nvdaremoteserver-docker) Provided on that page is a command you can copy to the clipboard which should pull the latest image. Here is an example use of downloading and running the image.
 
```console
$ docker pull ghcr.io/tech10/nvdaremoteserver-docker:v0.1.20
$ docker run ghcr.io/tech10/nvdaremoteserver-docker:v0.1.20
```
 
 
#### Docker Hub
 
Automatically built images are now available on [Docker Hub.](https://hub.docker.com) Here is an example to pull the latest image and run it.
 
```console
$ docker pull tech10/nvdaremoteserver
$ docker run tech10/nvdaremoteserver
```
 
 
### Manually build docker image
 
Clone the repository, and from within the directory, build a Docker image, then run it. Some sample commands are below.
 
```console
$ git clone https://github.com/tech10/nvdaRemoteServer
$ cd ./nvdaRemoteServer
$ docker build -t nvdaremoteserver-docker .
$ docker run nvdaremoteserver-docker
```
 
# Usage
 
```console
$ nvdaRemoteServer [-cert /path/to/ssl/certificate] [-key /path/to/ssl/key] [-ip4 0.0.0.0] [-ip6 [::]] [-port 6837] [-motd "Example message of the day."] [-motd-always-display false] [-send-origin true] [-log-level 0]
```
 
Please note that the brackets around a parameter indicate that it is optional.
 
 
## Parameters
 
### Optional
 
#### `-cert`
 
This is the path to the SSL certificate the program will use to communicate securely, as the NVDA addon uses TLS for secure communication.
 
 
#### `-key`
 
This is the path to the SSL key. Both the certificate and key file need to exist and be accessible by the program, or the program will fall back to generating its own certificate.
 
 
##### Note about the cert and key files
 
If you are using the official NVDA addon as a server, or the unofficial one I linked above, you are welcome to use the same server.pem file for the certificate and key. The server should load successfully under this configuration.
 
If the certificate and key files both exist and fail to load a valid SSL key pair, the program will terminate rather than falling back on automatic self-signed SSL key generation.
 
 
#### `-ip4`
 
IPV4 address for the program to listen for incoming connections on. By default, all addresses are used. If you don't want to listen on IPV4, enter `-ip4 0` as the parameter.
 
 
#### `-ip6`
 
IPV6 address for the program to listen for incoming connections on. By default, all addresses are used.  If you don't want to listen on IPV6, enter `-ip6 0` as the parameter.
 
If you use 0 for both IPV4 and IPV6 addresses, the program will fall back to listening on all IP addresses.
 
The IPV6 parameter must have the address address surrounded by brackets. The address must also be on an interface for your computer. For example, this type of parameter can be used.
 
`[fd80::ffe8]`
 
So long as that is a valid IPV6 address on one of your network interfaces, this example in the local prefix of IPV6 addresses, you will be able to listen for incoming connections to the server.
 
 
#### `-port`
 
Choose the port the server will use. The default is 6837. Valid port numbers are between 1 and 65536.
 
 
#### `-motd`
 
Enter a message of the day for your server. You probably want to quote this string in the shell, ensuring spaces will be escaped properly, as in the example command line parameter.
 
 
#### `-motd-always-display`
 
Force the client to display the message of the day from the server, even if it hasn't changed since you last connected. This value is a boolean, so it can be true, false, 1, or 0. The numbers 1 and 0 are the same as true and false.
 
 
#### `-send-origin`
 
By default, when the server receives a message from a client, it will send that same message to all clients that need to receive it, but it will add an origin field to that message. This requires that the message be decoded into a value the program can more easily manipulate, an origin message added to it, then encoded back to the value that will be sent to all clients. This could cause a slight performance hit. You can disable this feature by setting it to false, if desired, though you might find some things don't work properly for you if you do so.
 
 
#### `-log-level`
 
This will choose what you want logged. The default level is 0.
 
 
##### Logging Levels
 
Each level above the previous will also log what the prior level is logging. For instance, 1 will log both levels 0 and 1.
 
- -1 will disable logging, with the exception of error messages, which are always logged. This includes panicks, which crash the program.
- 0 will log when the server has started, stopped, or if an error has occurred that isn't severe enough to be logged at all times.
- 1 will log information about which clients connect, logging both their ID and IP address.
- 2 will log what channels each client joins and leaves, which will contain channel passwords. Don't use this log level in production.
- 3 will log what the program is doing at each stage of its operation. Use this for debugging purposes only.
- 4 will log the protocol that the server and client are exchanging. Don't use this unless you're a developer or you want to annalize the protocol being used. This might cause a performance degrodation, since the protocol being exchanged is also sent to the console, or redirected to a file by your operating system if you've told it to do so.
 
 
# Notes on self-signed certificate generation
 
The certificate that this program generates will allow for secure verification. However, like the certificate packaged by the addon, you can't verify it by using any certificate authority. If this changes in the addon and it requires certificate verification in the future, a certificate, key, and a root certificate authority file will be required for the server to use. The client would then require the appropriate files to verify the certificate is valid, unless you get a certificate from Letsencrypt, or another certificate authority.
 
To generate the certificate, the program will use a source of random entropy that is cryptographically secure. This can be a problem on servers that are headless, meaning you access them remotely only. However, daemons such as Haveged exist to provide your system with available entropy that can be utalized.
 
As a result of the secure random number generator, along with the various algorithms needed to generate the keys, the generation of a self-signed certificate can take some time, anywhere between three to ten seconds in the best case sanario. If the program takes longer than thirty seconds to generate the certificate, it is probably hanging as it waits for available entropy to complete random number generation. Once the key is generated, the program will run with its full performance.
 
 
# Statistics
 
These by no means should be taken as representative of any definitive stats, but the results given by systemd's tracking of memory and CPU use can speak for themselves.
 
When running the servers, both the Go and Python versions, I was performing similar tasks over different periods of time, typing, reading, and doing virtually everything on the remote system, including writing this section of the document and collecting the statistics.
 
Here is what they gathered for both the Python and Go versions of the NVDARemote server. The Python version I was running was 3.9.2, and Go was 1.16.2.
 
 
## Python
 
The run time was approximately one hour.
 
```console
$ sudo systemctl status NVDARemoteServer
 NVDARemoteServer.service - NVDARemote relay server
 Loaded: loaded (/usr/lib/systemd/system/NVDARemoteServer.service; disabled; vendor preset: disabled)
 Active: active (running) since Tue 2021-03-23 12:37:24 MDT; 1h 0min ago
 Process: 11551 ExecStart=/usr/bin/python /usr/share/NVDARemoteServer/server.py start (code=exited, status=0/SUCCESS)
 Main PID: 11553 (python)
 IP: 4.5M in, 5.2M out
 Tasks: 5 (limit: 1151)
 Memory: 12.0M
 CPU: 1min 13.385s
```
 
 
## Go
 
The runtime was approximately five hours, fourteen minutes.
 
```console
$ sudo systemctl status nvdaRemoteServer
 nvdaRemoteServer.service - NVDARemote relay server
 Loaded: loaded (/etc/systemd/system/nvdaRemoteServer.service; enabled; vendor preset: disabled)
 Active: active (running) since Tue 2021-03-23 07:21:02 MDT; 5h 14min ago
 Main PID: 7512 (nvdaRemoteServe)
 IP: 10.6M in, 11.6M out
 Tasks: 8 (limit: 1151)
 Memory: 4.8M
 CPU: 13.324s
```
 
 
## Notes about the results
 
There is one difference between the Python and Go versions of the server that is significant, other than the programming language being used. The Python server forks itself into the background, something that isn't strictly necessary to do with systemd processes. The Go version of the server does no forking, so the systemd service is capable of monitoring its process directly. This may cause results to be different than they should be, but the use of memory and CPU time should be fairly accurate.
 
 
## Observations using the servers
 
My personal observations are the following, running both servers on a server approximately 50MS ping time away from both locations, which would make the round trip approximately 100MS:
 
- When running the Python version of the NVDARemote server, the delay is noticeable between the controlling computer, and the computer being controlled.
- When running the Python version of the server using [PyPy,](https://www.pypy.org/) which is a faster version of Python for longer running programs, the delay is less, better than Python and a bit more stable. I can still tell that I'm controlling a remote computer.
- When running the Go version of the NVDARemote server, the delay can still be noticed, but is less than the Python version of the server. General stability and delay between keystrokes is also improved on the Go version of the server, and sometimes, I forget that I'm actually controlling a remote computer.
 
I took no benchmarks of response times between sending and receiving data, but I would estimate that the Go program is at least four or five times faster than the Python program, perhaps more so. It definitely seems to use less CPU.
 
In comparing the two servers, keep the following in mind. Python is an interpreted language. Therefore, the program is compiled into machine code as it is executed. This compiling and reading of the program will increase CPU use and slow down the responsiveness of a program. PyPy will compile the entire Python program into machine code before it begins to execute, which makes it faster than Python for long running processes, though slightly slower in starting. I believe it was stated that PyPy is at least four times faster than Python. Go will compile the entire program into machine code before you execute it, leaving you with a binary that you will run on your computer, similar to programming languages such as C. In [one particular use case,](https://getstream.io/blog/switched-python-go/#:~:text=Go%20is%20extremely%20fast.,40%20times%20faster%20than%20Python.) it was stated that Go was forty times faster than Python.
 
 
# Bugs
 
Open an issue explaining what the bug is and how you encountered it. Try and be as detailed as you can, to allow the bug to be reproduced. Be detailed, or your issue will be closed if it can't be resolved properly.
 
 
# Contributing
 
Fork this project and submit a pull request. Please use another branch on your fork of this project if you are submitting a pull request for something. Also, keep the following guidelines in mind.
 
- Test your contributions before submitting them, making sure the program compiles properly.
- Remember to make use of gofmt. This will keep the formatting of the code standard for everyone.
- Try and keep your code as clean and efficient as possible.
 
 
# Final thoughts
 
Primarily, I am writing this program for my use, but am releasing it for anyone to utalize, should they wish.
Finally, thanks to tech10 for developing such a good server


Re: edit user guide

Pranav Lal
 

Hi Brian,

 

I agree with you about not having office  keyboard shortcuts in the NVDA user guide. However,  we should have documentation which explains how to do things in common applications in the NVDA manual or in its separate books like the excel book.

 

Take the example of  needing to determine which is the last occupied cell in a column. I believe ctrl + down arrow does this but when I am using the screen reader, my thoughts are something like:

A mouse user could scroll quickly and find this stuff out, where should I look? In the excel manual or in the NVDA manual for a feature or keyboard shortcut? Mean while, I am down arrowing or perhaps using page down to go down which is a suboptimal way to do this.

 

 

Pranav

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Brian Vogel
Sent: Tuesday, April 6, 2021 7:21 PM
To: nvda@nvda.groups.io
Subject: Re: [nvda] edit user guide

 

Microsoft documents, and well, each and every keyboard shortcut for virtually every product they make, and definitely for the Office suite programs.

These keyboard shortcuts, and all program-specific keyboard shortcuts, are not NVDA shortcuts and would have no place in the NVDA user guide, as they have nothing whatsoever to do with NVDA (or any screen reader, for that matter).
--

Brian - Windows 10 Pro, 64-Bit, Version 20H2, Build 19042  

Always remember others may hate you but those who hate you don't win unless you hate them.  And then you destroy yourself.

       ~ Richard M. Nixon

 


Re: Navigating dates in the Windows 10 calendar using NVDA 2020.4 and the Windows 10 app essentials 21.03 add-on

 

Hi,

Can you retry after restarting NVDA while focused on Calendar app? NVDA does announce dates as I move between weeks (up or down arrow in month view).

Cheers,

Joseph

 

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Louise Pfau
Sent: Tuesday, April 6, 2021 5:51 PM
To: NVDA Group <nvda@nvda.groups.io>
Subject: [nvda] Navigating dates in the Windows 10 calendar using NVDA 2020.4 and the Windows 10 app essentials 21.03 add-on

 

Hi.  I was trying to navigate through the dates in the Windows 10 calendar, which is set up in a tabular structure like an Excel spreadsheet.  When I was navigating by week (the row equivalent), NVDA wouldn’t speak the new date that had the focus.  It did speak the date when I moved by day though.  I’m using Windows 10 pro Version 20H2 (OS Build 19042.867), NVDA 2020.4, and the Windows 10 app essentials 21.03 add-on.  Has anyone else come across this?

 

Thanks,

 

Louise


Navigating dates in the Windows 10 calendar using NVDA 2020.4 and the Windows 10 app essentials 21.03 add-on

Louise Pfau
 

Hi.  I was trying to navigate through the dates in the Windows 10 calendar, which is set up in a tabular structure like an Excel spreadsheet.  When I was navigating by week (the row equivalent), NVDA wouldn’t speak the new date that had the focus.  It did speak the date when I moved by day though.  I’m using Windows 10 pro Version 20H2 (OS Build 19042.867), NVDA 2020.4, and the Windows 10 app essentials 21.03 add-on.  Has anyone else come across this?
 
Thanks,
 
Louise


regular expressions for my keyboard only notations for math

Michael
 

Some regular expressions to go with my keyboard only notations for math         

The following material is likely more than anyone wants to read. Skip through it to material you do want to read. I have not updated NVDA to the current version. I may have said things about the speech dictionaries that aare no longer up-to-date.  Wherever  there are mistakes, forgive me.

 

Appendix 2 How To Modify The Speech Dictionary In NVDA

 

NVDA is a screen reading program produced by NV Access(R). It speaks the information about various parts of the active window in response to keystrokes pressed by the user. If the keystroke is not an NVDA command, NVDA merely echoes the keystroke. But, if it is an NVDA command keystroke such as NVDA-key + t, NVDA tells the user something about the active window. In the case of NVDA-Key + t, NVDA announces the title of the active window.  NVDA commands take the form of the NVDA-key followed by a letter. The INSERT key is by default the NVDA-key. However, NVDA allows the user to change the NVDA-key to the CapsLock key if desired.

The user can control how NVDA announces a string of characters.  If the user wants NVDA to speak a particular string of characters a certain way, he or she can make an entry in its speech dictionary for that particular string of characters. After this entry is saved into the speech dictionary, whenever that particular string of characters is encountered, NVDA speaks it according to the entry just made in the speech dictionary.

For example, NVDA ordinarily speaks the word tortilla with an “L” sound rather than a “y” sound.  To force NVDA to pronounce it with the “y” sound, there must be an entry in the speech dictionary to instruct NVDA to speak the string of characters “torteeya” as desired.

To make such an entry do the following.

STEP 1: Put focus on the main NVDA menu with the keystroke  NVDA-key + n. The user can arrow down through a list of submenus.  Or, press the letter “p” to go to the preferences menu. The first menu under “Preferences” is ‘General’. The user may arrow down the the Speech Dictionary or type ‘d” and NVDA will jump into the
default speech dictionary, There are three entries. They are respectively “Default”,
“voice”, and “temporary”.  I suggest putting my changes into the default dictionary.

But before entering the default dictionnary, a word about the other two choices is in order.

The user can arrow once to the voice dictionary which is  the dictionary belonging
to the synthesizer currently running. For instance, if the Microsoft Speech
Platform synthesizer is running, arrowing to the Voice Dictionary opens the dictionary whose entries govern the speech under that synthesizer. The entries in this
dictionary apply to the Microsoft Speech Platform session and not to any
other synthesizer that has been installed. Whatever synthesizer is running,
the entries in the default speech dictionary apply.
The tempory dictionary is like the voice dictionary, but it is erased when
you exit the NVDA session.

Entering the default dictionary. A list of entries will appear.  The user may add a new entry or arrow down to an entry he or she wishes to change. To add a new entry Tab once. To change an entry, arrow down the the entry in question and tab twice. Or to remove the entry in question, tab three times. But the object of this appendix is to add entries in support of the calculus book.

So, tab only once to add an entry. Focus will be on the “Add” button. Press the ENTER key to activate it. NVDA says “add a dictionary entry dialogue, pattern edit”. Focus is now in an edit box. The string of characters to be entered here is the string of characters as they appear in the text, that is, the actual character string encountered by the reading cursor.  As an example, type in the word tortilla. Press the TAB key ”.  again, and the focus will be in another edit box. NVDA will say “replacement pattern edit”. The replacement string to be typed will force NVDA to pronounce the word tortilla with a ‘y’ sound rather than an ‘l’ sound. That pattern is “tortee ya”.

Tab again to put focus in a comment edit box. Tabbing again puts focus on a check box called “Case sensitive”. Its default value is “not checked”. To make the replacement happen only when tortilla is upper case (either its first letter or all of them), press the space bar to check it.

Tabbing again puts focus on a combo box whose entries are respectively “anywhere, “forward”, and “regular expression”.   The “anywhere” choice means that the pattern being replaced may appear either by itself or anywhere in a longer string of
non-blank characters. The “forward” choice means that the pattern being replaced must appear at the very front of a longer string of characters. Of course, it may appear by itself and not part of a longer string of characters.  If the “forward” choice is picked, and the pattern being replaced appears following  one or more non-blank characters, NVDA will not speak using the replacement pattern.

 

Regular expressions are required to address certain situations where more
flexibility is needed,  and they will be discussed later. For now, suffice it
to say, that in the case of a regular expression, the pattern to be replaced
and the replacement pattern will contain special characters that will   
cause a more suffisticated replacement to take place.

Now, the user is ready to implement the  changes specified below.

However, since NVDA supports regular expressions, some of them will not be
entered into the NVDA speech dictionary.
The speech dictionary dialog may ask you if the Actual Pattern  should be case
sensitive.  If you check “no”, then any characters in the Actual Pattern string
may be either upper or lower case. If however, you check “yes”, then the
characters in the Actual Pattern string must exactly match the case of the
characters encountered in the text before the Replacement Pattern will be
triggorred.

The changes listed below do not need case sensitivity unless otherwise
stated.


SECTION0.1 Modifications For Chapter 1 Number Systems

 

Chapter 1 discusses number systems which uses * for multiplication, / for
division, + for addition, and – for subtraction.

One change for chapter 1 is that for section headings, “SECTION”.

Actual Pattern=”SECTION”, Replacement Pattern=”section”

The other change is that Subscripts in this book are indicated by the
suffix underscore plus an integer. An example is x_0 for x sub zero.

Actual Pattern=_”, Replacement Pattern=”sub”

Some readers may wish to hear x^2 read as x squared rather than x raised to
exponent 2 and also x^3 read as x cubed. .  If the reader is willing to
treat these two cases as special cases, the preferred reading can be
supported as follows. Use two carot symbols instead of one, and preceed the
carots with a space. Without that space, the variable name may not be spoken clearly. For example, write x cubed as x ^^3.

This will require the user to make the following changes to the speech
dictionary.

Add the following entry.

Actual Pattern ^^2 and Replacement Pattern squared.

The change for x cubed is similar.

SECTION0.2 Modifications for Chapter 2 Functions
Chapter 2 discusses functions of one and of two variables. I introduce
notation for exponents, denominators, and absolute value.

Below is a list of changes I propose to make to the speech dictionary for
chapter 2.

It would be nice if the characters “f(x)” is spoken as
“f of x”. But, we also want “g(t)” to be read as “g of t”.

IN other words, we want the function name to be any character upper or lower
case and to have a subscript.  We also want flexibility in the number of
independent variables and also flexibility of  variable names.

Three regular expressions  working together accomplish this goal.

 

Regular expression recognizing the function name and opening parenthesis.:

Actual Pattern:

“([a-zA-Z])\(“

Replacement Pattern:

“\1           of    open parenthesis                “

 

Regular expression recognizing all arguments which are followed by a comma:

Actual Pattern:
“*([a-zA-Z]?)(\_?\d*)([/\.]?\d*) *([-]|[+]?) *([a-zA-Z]?)(\_?\d*)([/\.]?\d*) *[\,]{1}”

Replacement Pattern:

“\1 \2 \3 \4 \5 \6 \7    , “

 

Regular expression recognizing an argument not followed by a comma:

Actual Pattern:

“*([a-zA-Z]*)(\_?\d*)([/\.]?\d*) *([-]|[+]?) *([a-zA-Z]?)(\_?\d*)([/\.]?\d*) *\)”

Replacement Pattern:

“\1 \2 \3 \4 \5\6 \7     close parenthesis     “

 

 

H(x0)  will be read as “h of x”. The function name (f, g, h, or any other letter)
does not matter.

The following changes do not involve regular expressions.

 


actualPattern=:R->R, Replacement Pattern= maps R into R

 

Actual Pattern=”+/-“, Replacement Pattern=”plus or minus”

Actual Pattern=”<=”, Replacement Pattern=”less than or equal to”

Actual Pattern=”>=”, Replacement Pattern=”greater than or equal to”

ActualPattern=!, Replacement Pattern=factorial
ActualPattern=_, Replacement Pattern=sub

 

Actual Pattern=”(/”, Replacement Pattern=”open parenthesis begin denominator”

Actual Pattern=”/)”, Replacement Pattern=”end of denominator close parenthesis”

Actual Pattern=”(^”, Replacement Pattern=”open parenthesis begin exponent”

Actual Pattern=”^)”, Replacement Pattern=”end of exponent close parenthesis”

Actual Pattern=”(|”, Replacement Pattern=”open parenthesis begin absolute value”

Actual Pattern=”|)”, Replacement Pattern=”end of absolute value close parenthesis”

Actual Pattern=”}/”, Replacement Pattern=”open brace begin denominator”

Actual Pattern=”/}”, Replacement Pattern=”end of denominator close brace”

Actual Pattern=”{^”, Replacement Pattern=”open brace begin exponent”

Actual Pattern=”^}”, Replacement Pattern=”end of exponent close brace”

Actual Pattern=”{|”, Replacement Pattern=”open brace begin absolute value”

Actual Pattern=”|}”, Replacement Pattern=”end of absolute value close brace”

Actual Pattern=”[/”, Replacement Pattern=”open bracket begin denominator”

Actual Pattern=”/]”, Replacement Pattern=”end of denominator close bracket”

Actual Pattern=”[^”, Replacement Pattern=”open bracket begin exponent”

Actual Pattern=”^]”, Replacement Pattern=”end of exponent close bracket”

Actual Pattern=”[|”, Replacement Pattern=”open bracket begin absolute value”

Actual Pattern=”|]”, Replacement Pattern=”end of absolute value close bracket”

 

NOTE: In the text, I only use parentheses to specify begin and end of
exponents, denominators, and absolute value. It is up to you whether to use
braces and brackets as well. But, if you do decide to use braces and brackets
n addition to parentheses, I strongly suggest 
that  the Replacement Pattern mentions the brace or bracket   . unless you do,
the speech will not help you keep track of opening and closing braces and
brackets. If documents you send to your professor do not have an equal number
of opening and closing braces/brackets/parentheses, he  or she will think
you are confused and maybe lower your grade.

 

SECTION0.3Modifications For Chapters 3, 4, and 5

The chapter on limits only needs two changes to the speech dictionary. No
changes are needed for chapters 4 and 5.

 

Actual Pattern=”lim:”, Replacement Pattern=”limit as”

Actual Pattern=”->”, Replacement Pattern=”approaches”

 

SECTION0.4Modifications For Chapters 6, 7, and 8

 

Regular expression for what variable a derivative is taken with respect to:

Actual Pattern:

“(\/)d([a-zA-Z])(\))”

Replacement Pattern:

“with respect to           \2”

 

Actual Pattern= (d0

Replacement Pattern=”Open parenthesis  ze rowth derivative”

 

Actual Pattern=”(d1”

Replacement Pattern=”Open parenthesis first derivative”

 

Actual Pattern= “(d2”

Replacement Pattern=” Open parenthesis second derivative”

 

Actual Pattern= “(d3”

Replacement Pattern=”Open parenthesis third derivative”

Ordinary derivative whose differentiation level is specified by an integer:

Fourth derivative:

Actual Pattern:

“(d4”

Replacement Pattern:

“open parenthesis fourth derivative”

 

Eighth derivative:

Actual Pattern:

“(d8”

Replacement Pattern:

“Open parenthesis eighthth derivative “

 

The first, second, third, fourth, and eighth derivatives are entries that are
not regular expressions. They are more understandable when not handled by a
regular expression.

However, the fifth, sixth, seventh, and ninth derivatives are all handled by a
regular expression. Their replacement patterns are very understandable.

Regular expression recognizing fifth, sixth, seventh, and ninth derivatives:

Actual Pattern:

“(\()d([5679])”

Replacement Pattern:

“open parenthesis               \2   th    derivative”

 

Ordinary derivatives whose  differentiation level is specified by an index variable:

This regular expression comes into play in a future chapter, but it fits here.

Actual Pattern:

“(\()d([a-zA-Z])([-]|[+]?)([1-9]?)”

Replacement Pattern:

“open parenthesis       \2      th        \3    \4          derivative”

 

 

SECTION0.5 Modifications For Chapter 9, Rieman Integration

This chapter introduces notations for summation and for integrals.

I leave it to the reader whether or not to make this group case sensitive. I mean demanding that the characters “int” should be upper case to prevent collisions in the text.

 

 

Actual Pattern=”/INT”, Replacement Pattern=”integral”

Actual Pattern=”/INT{“, Replacement Pattern=”integral lower bound”

Actual Pattern=”{/u“, Replacement Pattern=”begin upper bound”
Actual Pattern=”/u}“, Replacement Pattern=”end of upper bound, and the integrand is ”

 

Actual Pattern=”/INT{}”, Replacement Pattern=”indefinite integral”

Actual Pattern=”/INT{}:”, Replacement Pattern=”indefinite integral of the integrand”

Actual Pattern=”/INT{}”, Replacement Pattern=”integral”


I found myself entering the above integral notations using brackets instead
of braces, so I recommend including the following just to make the entering
text more forgiving.

Actual pattern=”[/l“, replacement pattern=”begin lower bound”
Actual pattern=”/l]“, replacement pattern=”end of lower bound”

 

Actual Pattern=”]/u“, Replacement Pattern=”begin upper bound”

 

actual pattern =”/u[“, replacement pattern =”end of upper bound, and the integrand is,”
actual pattern =”/INT[]”, replacement pattern =”indefinite integral”
actual pattern =”/INT[]:”, replacement pattern =”indefinite integral of the integrand”

Your professor might prefer the representation of an upper bound used in
latex which is “\to”.
Actual Pattern=”\to”, Replacement Pattern=”and upper bound”

 

Actual Pattern=”/INTI”, Replacement Pattern=”inner integral”

Actual Pattern=”/INTM”, Replacement Pattern=”middle integral”

Actual Pattern=”/INTO”, Replacement Pattern=”outer integral”

SECTION0.6 Modifications for Chapter 12 Vectors

actual pattern={||x+y||},
Replacement Pattern=open brace begin norm x+y end norm close brace

 

Actual pattern=DET2, Replacement Pattern=second order determinant

Actual pattern=DET3, Replacement Pattern=third order determinant

Actual pattern=(.), Replacement Pattern=dot product

Actual pattern=(*), Replacement Pattern=cross product


 SECTION0.7 Modifications For Chapter 13

 

Partial derivative whose differentiation level is specified by an integer:

Fourth partial derivative:

Actual Pattern:

“(pd4”

Replacement Pattern:

“open parenthesis fourth partial derivative”

 

Eighth partial derivative:

Actual Pattern:

“(pd8”

Replacement Pattern:

“open parenthesis eighth partial derivative”

 

Regular expression recognizing fifth, sixth, seventh, and ninth partial derivatives:

Actual Pattern:

“(\()pd([5679]  )”

Replacement Pattern:

“open parenthesis       \2     th partial derivative

 

Partial derivative whose differentation level is specified by an index variable:

Actual Pattern:

“(\()pd([a-zA-Z])([-]|[+]?)([1-9]?)”

Replacement Pattern:

open parenthesis       \2      th        \3    \4          partial derivative

 

 

SECTION0.8 Modifications For Chapters 14, 15, 16, and 17


actualWord=:R->Rn Replacement Pattern=maps R into R n

 

actualWord=:R2->R2 Replacement Pattern=maps R2 into R2

 

actualWord=:R3->R3 Replacement Pattern=maps R3 into R3

 

actualWord=:Rn->Rn Replacement Pattern=maps R n into R n

 

actualWord=:R2->R Replacement Pattern=maps R2 into R

 

actualWord=:R3->R Replacement Pattern=maps R3 into R

actualWord=:RN->R Replacement Pattern=maps RN into R

 

This group is case sensitive.

 

Actual Pattern=”/DINT:”, Replacement Pattern=”double integral”

Actual Pattern=”/LINT:”, Replacement Pattern=”line integral over curve”

Actual Pattern=”/SINT:”, Replacement Pattern=”surface integral”

Actual Pattern=”/TINT:”, Replacement Pattern=”triple integral”

There is a set of notations for derivatives for which I made no entries into the speech dictionary. It is not uncommon to represent a derivative by following the function name with an apostrophe. For example, f’(x) represents the first  derivative of f(x). Likewise, f’’(x) is the second derivative of f(x). You may occasionally encounter three apostrophes for third derivative such as for example f’’’(x). However, it is unlikely that the student will ever see more than three apostrophes for differentiation. In fact, the use of apostrophe for differentiation is more prevalent in differential equations books than in a calculus text.

So, if the student hears ’ or y’’, he or she should understand that differentiation is being represented. Just get used to it.

Testing regular expressions involving carrot and parenthesis exposed a problem in two of the seven synthesizers I exercised. Those two are Microsoft Speech Platform and Microsoft SAPI5. The other five synthesizers passed the test.

I tested regular expressions for beginning and ending exponential expressions.

My syntax for these exponential expressions is that  the expressions are bracketed between (^ and ^).

 

Regular expression to recognize beginning of exponential expression:

Actual Pattern:

[\(][\^]

Replacement Pattern:

Begin exponent

 

 

Regular expression to recognize end  of exponential expression:

Actual Pattern:

[\^][\)]

Replacement Pattern:

end of exponent

 

The regular expression for the end of an exponential expression fails to recognize the end.

The regular expression for the beginning exponential expression works as expected.

The two regular expressions are very similar. Why does one work and not the other?

Here are some test cases:

  (^ ^)

(^w+3^)

I then wrote a regular expression to recognize the pair “()”, and NVDA sees the closing parenthesis but not the opening one. Puzzling!

 

The following synthesizers execute these regular expressions correctly.

Eloquence,

ESpeak NG,

Soft Voice,

Speech Player ESpeak,

SVox Pico Synthesizer,

The following synthesizers did not execute these regular expressions correctly.

Microsoft Speech API Version 5,

Microsoft Speech Platform

For these last two synthesizers, I input the regular expressions into their Voice Dictionaries.

 

(^ w + 3^)

Begin exponent is recognized but not the end of exponent.

 

This is not a fix but what I did to expose the problem.

NOTE: The number of spaces specified in the replacement patterns for regular expressions should not be ignored. Some parts of the replacement string may be spoken so quickly, that you, the listener, may hear them as a nonintelligible blip.

© Michael R. Cross

 

 


a keyboard approach only to read and write math equations

Michael
 

Examples of equations using the keyboard only:

Agree with those you will communicate with how you want to express mathematical notation. There is no one right way to do fthis as long as you are all consistent.  The carrot symbol usually precedes an exponent. x^3 is x cubed.

 

y = LIM: x->5: f(x) means y = the limit as x approaches 5 of the funtction F(x).

 

y = (d2/dx) f(x) means y = the second derivative with respect to x of the  function f(x).

 

y = (d3/dx) f(x) means y = the third derivative with respect to x of the function f(x).

 

y = INT:{L5}:{U7}: f(x) dx

means y = the integral from lower bound 5 to  upper bound 7 of the function f(x) with respect to x.

In print books the lower bound is expressed as a subscript. The upper bound is expressed as a superscript. You may choose to do it this way.

y = INT: subscript 5 superscript 7 f(x) dx.

 

Exponents are also usually expressed as a supersscript.

Assume that you are sending what you write to a person capable of forgiving minor syntax errors rather than to a piece of software  which will not forgive minor errors.

A professor with several degrees in mathematics will understand immediately what you mean, and will probably suggest  improvements.

This is only a start. Don't ask your professor to learn Braille.  I recommend that you not put a piece of software between you and the person you are trying to communicate with. Such a piece of software will act  like a precompiler that your input has to satisfy before your message reaches your audience. Just a suggestion. Do what you want.

Once everybody has agreed to thses notations, you can write regular expressions to have what you write read as it would be spoken in a math class.

Good luck.

 

 

 

 


Re: NVDA User Guide doesn't open in default browser

Louise Pfau
 

I tested several web-based manuals.  Most opened in Edge, but a few opened in another browser for some reason.  I used the shortcuts linked to the manuals in the program menus.  When I installed the beta of NVDA 2020.4 however, the NVDA user guide opened in Edge.  I think I might have mentioned that the issue was resolved in another post in this thread.
 
Thanks,
 
Louise


Re: Strange behaviour of Google Chrome

Gene
 

Cookies take up space on the hard drive but its minimal. They are tiny text files and you could have thousands of cookies and take very little room. At times, a cookie may cause a problem and need to be deleted. That may have been the case in this instance. I suspect in such cases, the cookie has somehow been corrupted, thus my discussion of backing up cookies so you can restore cookies and perhaps replace the corrupted one with one that isn't.

Gene

-----Original Message-----
From: Louise Pfau
Sent: Tuesday, April 06, 2021 1:08 PM
To: nvda@nvda.groups.io
Subject: Re: [nvda] Strange behaviour of Google Chrome

When I looked through the options of what to delete, it said that the
cookies were taking up space on the hard drive. The reason I deleted the
browsing data in the first place was because NVDA wasn't navigating the
banking page correctly.

Louise


Re: Strange behaviour of Google Chrome

Louise Pfau
 

When I looked through the options of what to delete, it said that the cookies were taking up space on the hard drive. The reason I deleted the browsing data in the first place was because NVDA wasn't navigating the banking page correctly.

Louise


Re: What are the accessible mathematics read and write solutions?

Bruno Aníbal Prieto González
 

I recommend using Pandoc to convert between different formats. If you
have a file, in Word or LaTeX format, you can convert it to html and
read it with the NVDA Access8Math add-on. If you want to produce math,
you can use Markdown, and formulas are entered between $here goes the
formula$, inside those dollar signs you must enter the formula in
LaTeX format. You can convert that to PDF, Word, HTML, etc.

2021-04-06 5:03 GMT-04:00, Sascha Cowley via groups.io
<sascha.camille=yahoo.com@groups.io>:

There is MathPlayer ( https://www.dessci.com/en/products/mathplayer/ ) ,
which works with NVDA and Firefox to make some maths content accessible. It
also supposedly works with Microsoft Word, though I have personally never
managed to get this working.
With experimental UIA support enabled for Word, native equations in Word are
fairly accessible, or were when I tried it some months ago. I've also had a
little success using equations in Google Docs, though I had trouble
inputting them. I have not worked with the Docs equation editor very much at
all, though, so I may have just been missing something.
Using LaTeX, or a similar (even ad hoc) plane text notation is often
successful. The advantage with LaTeX is that it produces nicely typeset
output. Unfortunately, it is extremely picky, and debugging output is often
not very helpful. Plus it's just a lot to learn.






Re: Pausing nvda...

Gene
 

I don't know if an add-on allows such things to be blocked. I just turn off speech, as has already been discussed. The shift command only pauses speech during read all or read to end or whatever its called. Control only stops current speech and won't affect announcements such as we are discussing.

However, at times, it may be useful to hear an announcement. Perhaps you might want to lower NVDA volume so you hear announcements but much more softly.

Gene

-----Original Message-----
From: Chris Mullins
Sent: Tuesday, April 06, 2021 4:22 AM
To: nvda@nvda.groups.io
Subject: Re: [nvda] Pausing nvda...



Hi

You can use the shift key to pause /resume speech when a “say all” command has been issued but I don’t think it will work to block message announcements during a Skype call.



Cheers

Chris



Sent from Mail for Windows 10





From: Monte Single
Sent: 06 April 2021 01:33
To: nvda@nvda.groups.io
Subject: Re: [nvda] Pausing nvda...





Hi List,



Maybe I've missed some posts on thisthread.

The simplest way to pause and resume nvda reading is to press the shift key,

like a toggle, off and on.

It works.



Cheers,



Monte



-----Original Message-----

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Luke Davis

Sent: April 5, 2021 6:03 PM

To: nvda@nvda.groups.io

Subject: Re: [nvda] Pausing nvda...



On Mon, 5 Apr 2021, Brian Vogel wrote:



Is there another command that allows for NVDA output to be suspended,
entirely, while not requiring that one exit it? I could have sworn there

was, but perhaps not.



Another? As in: other than speech mode off, which does exactly that?



Or, do you mean a command that will do what speech mode off does, but also

globally disable keyboard intercept as sleep mode does for an application?

If you want that, I don't know of anything, but then I can't imagine why

having that would be easier than unloading NVDA.



Setting your speech synth to "No speech" will do something similar to speech

mode off, and I suppose you can do that with a profile, which you can't do

with sleep mode.



Luke


Re: Pausing nvda...

Carlos Esteban Martínez Macías
 

Hi all.
Is possible that some installers have a message wile the process is runing, that says, for example, coping files to c:\program files\example or similar. So, is the installer have this mesages but a progress bar not is here, the speech mode on beep can make a sound that stop when the process is finished.
Regards.

Músico (pianista) y ayuda a usuarios ciegos y con discapacidad visual en el uso de lectores de pantalla y tecnología. Experto certificado en el lector de pantalla NVDA.

Musician (pianist) and help to the blind people and with visual disability in use of screen readers and technology. Certified expert in the screen reader NVDA.


Re: Are there any extensions for LibreOffice?

Rui Fontes
 

Try contacting with:

Quentin Christensen <quentin@...>


Rui Fontes


Às 14:56 de 06/04/2021, Richard B. McDonald escreveu:

Hi Gigi!

 

Yes indeed, everything you say is correct.  No doubt, some collaboration between NVDA and LibreOffice (LO) seems necessary. 

 

In fact, I am presently connected with a person in Germany who is involved with LO development and who has a keen interest in improving LO’s accessibility.  He has likewise noted that some sort of collaboration is needed.  My problem is that I do not have any contacts within NVDA to try to connect them with LO.  I have said to my LO contact that I am willing to volunteer to improve accessibility.  I just do not know how to go about it. 

 

Do you know what I can do to foster this?

 

Thanks,

Richard

 

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Gianluigi Coppelletti
Sent: Monday, April 05, 2021 7:43 AM
To: nvda@nvda.groups.io
Subject: Re: [nvda] Are there any extensions for LibreOffice?

 

Hi,

I'm afraid that there aren't any, but I really hope that the accessibility of LibreOffice with NVDA will be improved in the future, because more and more blind users are choosing this suite as this is a very good free alternative to MS-Office. Unfortunately this doesn't depend on the NVDA's developpers only.

Ciao.

Gigi

Il 01/04/2021 23.07, Richard B. McDonald ha scritto:

Hi!

 

I am using Windows 10, NVDA 2020.4 and LibreOffice 7.2.  Are there any extensions for NVDA that improve its accessibility with LibreOffice?  In particular, LibreOffice has a spreadsheet application, Calc, that has some material accessibility issues.

 

Thanks,

Richard


Re: Are there any extensions for LibreOffice?

Richard B. McDonald
 

Hi Gigi!

 

Yes indeed, everything you say is correct.  No doubt, some collaboration between NVDA and LibreOffice (LO) seems necessary. 

 

In fact, I am presently connected with a person in Germany who is involved with LO development and who has a keen interest in improving LO’s accessibility.  He has likewise noted that some sort of collaboration is needed.  My problem is that I do not have any contacts within NVDA to try to connect them with LO.  I have said to my LO contact that I am willing to volunteer to improve accessibility.  I just do not know how to go about it. 

 

Do you know what I can do to foster this?

 

Thanks,

Richard

 

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Gianluigi Coppelletti
Sent: Monday, April 05, 2021 7:43 AM
To: nvda@nvda.groups.io
Subject: Re: [nvda] Are there any extensions for LibreOffice?

 

Hi,

I'm afraid that there aren't any, but I really hope that the accessibility of LibreOffice with NVDA will be improved in the future, because more and more blind users are choosing this suite as this is a very good free alternative to MS-Office. Unfortunately this doesn't depend on the NVDA's developpers only.

Ciao.

Gigi

Il 01/04/2021 23.07, Richard B. McDonald ha scritto:

Hi!

 

I am using Windows 10, NVDA 2020.4 and LibreOffice 7.2.  Are there any extensions for NVDA that improve its accessibility with LibreOffice?  In particular, LibreOffice has a spreadsheet application, Calc, that has some material accessibility issues.

 

Thanks,

Richard


Re: edit user guide

 

Microsoft documents, and well, each and every keyboard shortcut for virtually every product they make, and definitely for the Office suite programs.

These keyboard shortcuts, and all program-specific keyboard shortcuts, are not NVDA shortcuts and would have no place in the NVDA user guide, as they have nothing whatsoever to do with NVDA (or any screen reader, for that matter).
--

Brian - Windows 10 Pro, 64-Bit, Version 20H2, Build 19042  

Always remember others may hate you but those who hate you don't win unless you hate them.  And then you destroy yourself.

       ~ Richard M. Nixon

 


Re: Working with MS-Excel

falkogiepmans@...
 

There is a nice video series on youtube by Teacher Ryan O. Unfortunately this is hearing based so I'm not sure if this is helpfull for you.
 
 


Re: NVDA User Guide doesn't open in default browser

falkogiepmans@...
 

Did you test it another web-based manual with the same extension? If it is a different kind of file the default program can be different as well.
 
 


edit user guide

falkogiepmans@...
 

Hi All,

I would like to include some windows key shortcuts for Excel in the user guide (like control+arrows to find data in a sheet). It occurred to me that a lot of people are not aware of this and look in the NVDA user guide thinking that is all. 
How can I efficiently contribute to this? Should I make a pull-request on the github of NVDA?

Thanks in advance,
Falko
 
 


Re: Pausing nvda...

Jarek.Krcmar
 

Nvda+S.If you press at first this hotkey, you stop the talking, if you press twice, Nvda will beef, if you press three, Nvda will talk.

Jarek


Dne 05.04.2021 v 14:20 Arun napsal(a):


What is the best way to pause nvda while I am on a skype call…

Arun



__________ ESET Internet Security __________

Tato zprava byla zkontrolovana, a nebyly v ni nalezeny zadne hrozby.



Verze detekcniho jadra: 23081 (20210405)

https://www.eset.cz <https://www.eset.cz>
--
Jarek


Re: Pausing nvda...

Chris Mullins
 

Hi

You can use the shift key to pause /resume speech when a “say all” command has been issued but I don’t think it will work to block message announcements during a Skype call.

 

Cheers

Chris

 

Sent from Mail for Windows 10

 

From: Monte Single
Sent: 06 April 2021 01:33
To: nvda@nvda.groups.io
Subject: Re: [nvda] Pausing nvda...

 

Hi List,

 

Maybe I've missed some posts on thisthread.

The simplest way to pause and resume nvda reading is to press the shift key,

like a toggle,  off and on.

It works.

 

Cheers,

 

Monte

 

-----Original Message-----

From: nvda@nvda.groups.io <nvda@nvda.groups.io> On Behalf Of Luke Davis

Sent: April 5, 2021 6:03 PM

To: nvda@nvda.groups.io

Subject: Re: [nvda] Pausing nvda...

 

On Mon, 5 Apr 2021, Brian Vogel wrote:

 

> Is there another command that allows for NVDA output to be suspended,

entirely, while not requiring that one exit it?  I could have sworn there

was, but perhaps not.

 

Another? As in: other than speech mode off, which does exactly that?

 

Or, do you mean a command that will do what speech mode off does, but also

globally disable keyboard intercept as sleep mode does for an application?

If you want that, I don't know of anything, but then I can't imagine why

having that would be easier than unloading NVDA.

 

Setting your speech synth to "No speech" will do something similar to speech

mode off, and I suppose you can do that with a profile, which you can't do

with sleep mode.

 

Luke

 

 

 

 

 

 

 

 

 

 

 

2481 - 2500 of 85361