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
https://github.com/users/tech10/packages/container/package/nvdaremoteserver-docker
# 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.

## Go

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.

#### 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
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
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
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

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?

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.

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

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