- General
- Boot Sequence
- Boot Line Parameters
- Network Boot
- Network Boot using PXELINUX
- Network Boot using PXELINUX with a RAM Root File System
- Network boot using PXELINUX with an NFS Root File System
- Network Boot using gPXE
- Network Boot using gPXE with a RAM Root File System
- Network boot using gPXE with an NFS Root File System
- Local Boot
- Local Boot using SYSLINUX
- Local Boot using SYSLINUX with a RAM Root File System (automated install)
- Local Boot using SYSLINUX with a RAM Root File System (manual install)
MiniMyth supports two boot methods:
- network boot and
- local boot.
MiniMyth supports two root file system types:
- RAM root file system and
- NFS root file system.
The primary combination is network boot with a RAM root file system. Network boot with an NFS root file system was added to make development and debugging easier. Local boot was added to support networks that use a DHCP server that cannot be configured to support network boot, and to support installations that desire more security than can be provided when the kernel, root file system and configuration files are downloaded from a TFTP server.
Like most Linux distributions, MiniMyth must retrieve multiple items when it boots:
- the boot loader,
- the boot loader configuration,
- the kernel,
- the initial root file system (if needed),
- the final root file system (if needed) and
- the MiniMyth configuration.
In some cases, the initial root file system contains everything needed by the system. In these cases, there is no need for a separate final root file system, because the initial root file system contains all the functionality required of a final root file system. For example, when the initial root file system contains all the needed application software, there is not need for a separate final root file system. Essentially, in these cases, the initial root file system is the final root file system.
For MiniMyth using a RAM root file system, the RAM root file system is an initial root file system. In addition, there is no final root file system because the RAM root file system contains all the functionality needed to run MiniMyth.
In some cases, the kernel does not need any extra software in order to retrieve the final root file system. In these cases, there is no need for a separate initial root file system, because the kernel contains all the functionality required of an initial root file system. For example, when all the kernel modules needed to retrieve the final root file system are compiled into the kernel, there is no need for an initial root file system to contain and load the needed kernel modules. Essentially, in these cases, the kernel is the initial root file system.
For MiniMyth using an NFS root file system, the NFS root file system is a final root file system. In addition, there is no initial root file system because the kernel contains all the functionality needed to mount an NFS root file system.
The item retrieval is a chained sequence of events:
- the computer BIOS retrieves the boot loader,
- the boot loader retrieves the boot loader configuration, the kernel and the initial root file system (if needed),
- the kernel and the initial root file system retrieve the final root file system (if needed) and
- the root file system retrieves the MiniMyth configuration.
These items need not be retrieved from the same same location. In fact, these items can be divided into three location groups:
- the boot loader, the boot loader configuration, the kernel and the initial root file system (if needed),
- the final root file system (if needed) and
- the MiniMyth configuration.
How and from where these items are retrieved depends on the boot method and the root file system type.
For MiniMyth using network boot, the boot loader, the boot loader configuration, the kernel, the initial root file system (if needed) and the MiniMyth configuration are retrieved from a server on the network. For MiniMyth using local boot, the boot loader, the boot loader configuration, the kernel, the initial root file system (if needed) and the MiniMyth configuration are retrieved from the local storage device.
For MiniMyth using a RAM root file system, there is no final root file system. For MiniMyth using an NFS root file system, the final root file system is mounted over the network.
You can affect MiniMyth with boot line (the APPEND line for PXELINUX and SYSLINUX) configuration. You can find more information in the configuration obtained from the boot line section.
For network boot, you must be able to send boot file name in the DHCP's DHCPOFFER message. Most Windows, MacOS, Linux and BSD based DHCP servers support sending the boot file name. However, most DHCP servers found in off-the-shelf home routers do not support sending the boot file name. Therefore, if you are running a computer based DHCP server, then you will likely be able to configure and send the boot file name. However, if you are running an off-the-shelf home router based DHCP server, then you will likely not be able to configure and send the boot file name.
In addition, for network boot, you must be able to run a TFTP server on your network. There are TFTP servers for Windows, MacOS, Linux and BSD. Therefore, if you have an always-on computer on your network, then you will likely be able to run a TFTP server. However, if you do not have an always on computer on your network, then you will likely not be able to run a TFTP server.
If constraints prevent you from meeting either of these two network boot requirements, then your only option is to use the local boot method.
For network boot, you need a motherboard and network interface adapter that support network boot. While there are other kinds of network boot, the most common is the industry standard PXE (Preboot eXecution Environment) network boot. Most modern motherboards with integrated network interface adapters support PXE network boot. Therefore, this is the network boot method that we will cover.
For PXE network boot, you need a PXE boot loader. While their are other PXE boot loaders, one of the most widely used PXE boot loaders is PXELINUX and one of the most flexible PXE boot loaders is gPXE. Therefore, these are the PXE boot loaders that we will cover.
For PXELINUX based network boot, the following sequence occurs:
- The computer BIOS sends a BOOTP request to the DHCP server.
- The DHCP server tells the computer BIOS the IP address of the TFTP server and the location on the TFTP server of the PXELINUX boot loader, and the BIOS retrieves the PXELINUX boot loader from the TFTP server.
- The PXELINUX boot loader tells the PXELINUX boot loader the location on the TFTP server of the PXELINUX boot loader configuration file, and the PXELINUX boot loader retrieves the PXELINUX boot loader configuration file from the TFTP server.
- The PXELINUX boot loader configuration file tells the PXELINUX boot loader the location on the TFTP server of the kernel file and initial root file system file (if needed), and the PXELINUX boot loader retrieves the kernel file and the initial root file system (if needed) from the TFTP server.
-
The PXELINUX boot loader configuration file tells the PXELINUX boot loader, the kernel and the initial root file system (if present)
the location of the final root file system file (if needed),
and the kernel and initial root file system (if present) mount the final root file system (if needed).
- For an NFS root file system, the location is the IP address of NFS server and the location on the NFS server of the root file system file.
Given that most people run their MythTV backend on Linux, the most common scenario for network boot is a network running the ISC DHCP server, running a Linux TFTP server and using PXELINUX. There are numerous guides on the Internet for setting up this network boot configuration. I think that the one created for network booting an EPIA M motherboard is the best.
However, this guide was not written specifically for MiniMyth. As a result, the contents of the PXELINUX configuration file and the preferred locations of the kernel and root file system are different. Therefore, for this information, be sure to look at the network boot using PXELINUX with a RAM root file system section or the network boot using PXELINUX with an NFS root file system section, depending on which root file system type you have chosen.
First, follow the instructions for setting up PXE network boot using PXELINUX found in the network boot using PXELINUX section.
Your PXELINUX configuration file should contain the following, where '{version}' is the version of the MiniMyth distribution (e.g. 0.26.0-83):
DEFAULT minimyth-ram NOESCAPE 1 LABEL minimyth-ram KERNEL minimyth-{version}/kernel APPEND ro root=/dev/ram0 ramdisk_size=192000 initrd=minimyth-{version}/rootfs
Once you have set up your DHCP and TFTP servers for network boot, you need to download and install the files for booting a RAM root file system by following these steps:
- Download the files that are necessary for booting a RAM root file system. These files can be found in the 'ram-minimyth-{version}.tar.bz2' file in a MiniMyth distribution download directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Extract the 'ram-minimyth-{version}.tar.bz2' file by running the command 'tar -jxf ram-minimyth-{version}.tar.bz2. This should create the directory 'ram-minimyth-{version}'.
- Change to the user 'root'.
- Create a directory named 'minimyth-{version}' in the '{boot}' directory. The '{boot}' directory is the MiniMyth boot directory on your TFTP server, which is the directory on the TFTP server that contains the PXELINUX boot loader file ('pxelinux.0').
- Copy the 'kernel' file from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Copy the 'rootfs' file from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Copy the 'themes' directory from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
Finally, create an appropriate MiniMyth read-only configuration directory in the '{boot}' directory. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
First, follow the instructions for setting up PXE network boot using PXELINUX found in the network boot using PXELINUX section.
Your PXELINUX configuration file should contain the following, where '{version}' is the version of the MiniMyth distribution (e.g. 0.26.0-83), '{nfs-server}' is the IPv4 address of the NFS server and '{nfs-directory}/minimyth-{version}' is the MiniMyth root file system shared by the NFS server:
DEFAULT minimyth-nfs NOESCAPE 1 LABEL minimyth-nfs KERNEL minimyth-{version}/kernel APPEND ro root=/dev/nfs ip=dhcp nfsroot={nfs-server}:/{nfs-directory}/minimyth-{version}
Once you have set up your DHCP and TFTP servers for network boot, you need to download and install the files for booting an NFS root file system by following these steps:
- Download the files that are necessary for booting an NFS root file system. These files can be found in the 'nfs-minimyth-{version}.tar.bz2' file in a MiniMyth distribution download directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Extract the 'nfs-minimyth-{version}.tar.bz2' file by running the command 'tar -jxf nfs-minimyth-{version}.tar.bz2. This should create the directory 'nfs-minimyth-{version}'.
- Change to the user 'root'. The root file system contains device nodes and programs that are SUID. Therefore, if you do not extract the root file system as root, MiniMyth will not boot correctly.
- Create a directory named 'minimyth-{version}' in the '{boot}' directory. The '{boot}' directory is the MiniMyth boot directory on your TFTP server, which is the directory on the TFTP server that contains the PXELINUX boot loader file ('pxelinux.0').
- Copy the 'kernel' file from the 'nfs-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Extract the 'nfs-minimyth-{version}/rootfs.tar.bz2' file by running the command 'tar -jxf rootfs.tar.bz2' in the 'nfs-minimyth-${version}' directory. This should create the directory nfs-minimyth-{version}/rootfs'.
- Extract the 'nfs-minimyth-{version}/themes.tar.bz2' file by running the command 'tar -jxf themes.tar.bz2' in the 'nfs-minimyth-${version}' directory. This should create the directory nfs-minimyth-{version}/themes'.
- Move the contents of the 'nfs-minimyth-{version}/themes' directory to the 'nfs-minimyth-{version}/rootfs/rootfs-ro/usr/share/mythtv/themes' directory.
- Create a directory named 'minimyth-{version}' in the '{nfs-directory}' directory. The '{nfs-directory}' directory is a directory on your NFS server.
- Move the contents of the 'nfs-minimyth-{version}/rootfs' directory to the '{nfs-directory}/minimyth-{version}' directory.
- Share the '{nfs-directory}/minimyth-{version}' directory using NFS. This NFS share can (and should) be read only and squash root.
Finally, create an appropriate MiniMyth read-only configuration directory in the '{boot}' directory. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
For gPXE based network boot, the following sequence occurs:
- The computer BIOS sends a BOOTP request to the DHCP server.
- The DHCP server tells the computer BIOS the IP address of the TFTP server and the location on the TFTP server of the gPXE boot loader, and the BIOS retrieves the gPXE boot loader from the TFTP server.
- The DHCP server tells the gPXE boot loader the URI of the gPXE boot loader configuration file, and the gPXE boot loader retrieves the gPXE boot loader configuration file found at the URI.
- The gPXE boot loader configuration file tells the gPXE boot loader the URI of the kernel file and the URI of the initial root file system file (if needed), and the gPXE boot loader retrieves the kernel file and the initial root file system (if needed) found at their respective URIs.
-
The gPXE boot loader configuration file tells the gPXE boot loader, the kernel and the initial root file system (if present)
the location of the final root file system file (if needed),
and the kernel and initial root file system (if present) mount the final root file system (if needed).
- For an NFS root file system, the location is the IP address of NFS server and the location on the NFS server of the root file system file.
Given that most people run their MythTV backend on Linux, the most common scenario for network boot is a network running the ISC DHCP server, running a Linux TFTP server and using PXELINUX. There are numerous guides on the Internet for setting up this network boot configuration. Unfortunately, there are few guides on the Internet for network boot on a network running the ISC DHCP server, running a Linux TFTP, running the Apache HTTP server and chainloading gPXE. At some point, I should write one.
First, follow the instructions for setting up PXE network boot using gPXE found in the network boot using gPXE section.
Your gPXE configuration file should contain the following, where '{version}' is the version of the MiniMyth distribution (e.g. 0.26.0-83):
#!gpxe kernel http://tftp.home/minimyth/minimyth-{version}/kernel ro root=/dev/ram0 ramdisk_size=192000 initrd http://tftp.home/minimyth/minimyth-{version}/rootfs boot
Once you have set up your DHCP, TFTP and HTTP servers for network boot, you need to download and install the files for booting a RAM root file system by following these steps:
- Download the files that are necessary for booting a RAM root file system. These files can be found in the 'ram-minimyth-{version}.tar.bz2' file in a MiniMyth distribution download directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Extract the 'ram-minimyth-{version}.tar.bz2' file by running the command 'tar -jxf ram-minimyth-{version}.tar.bz2. This should create the directory 'ram-minimyth-{version}'.
- Change to the user 'root'.
- Create a directory named 'minimyth-{version}' in the '{boot}' directory. The '{boot}' directory is the MiniMyth boot directory on your TFTP server, which is the directory on the TFTP server that contains the gPXE boot loader file ('gPXE.0').
- Copy the 'kernel' file from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Copy the 'rootfs' file from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Copy the 'themes' directory from the 'ram-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
Finally, create an appropriate MiniMyth read-only configuration directory in the '{boot}' directory. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
In order to locate MiniMyth distribution files such as the theme file system images and the extras file system image, MiniMyth needs to know the location of the MiniMyth distribution used to boot MiniMyth. Normally, MiniMyth uses the 'initrd' boot line parameter to determine the location of the MiniMyth distribution used to boot MiniMyth. When the 'initrd' kernel boot line parameter is not present, MiniMyth assumes that the MiniMyth distribution used to boot MiniMyth is located in '{MM_MINIMYTH_BOOT_URL}/minimyth-{version}/'. Since, gPXE does not use the 'initrd' boot line parameter, MiniMyth will assume that the MiniMyth distribution used to boot MiniMyth is located in '{MM_MINIMYTH_BOOT_URL}/minimyth-{version}/'. Therefore, when booting using gPXE, it is important that your root file system be located at '{MM_MINIMYTH_BOOT_URL}/minimyth-{version}/'.
First, follow the instructions for setting up PXE network boot using gPXE found in the network boot using gPXE section.
Your gPXE configuration file should contain the following, where '{version}' is the version of the MiniMyth distribution (e.g. 0.26.0-83), '{nfs-server}' is the IPv4 address of the NFS server and '{nfs-directory}/minimyth-{version}' is the MiniMyth root file system shared by the NFS server:
#!gpxe kernel http://tftp.home/minimyth/minimyth-{version}/kernel ro root=/dev/nfs ip=dhcp nfsroot={nfs-server}:/{nfs-directory}/minimyth-{version} boot
Once you have set up your DHCP, TFTP and HTTP servers for network boot, you need to download and install the files for booting an NFS root file system by following these steps:
- Download the files that are necessary for booting an NFS root file system. These files can be found in the 'nfs-minimyth-{version}.tar.bz2' file in a MiniMyth distribution download directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Extract the 'nfs-minimyth-{version}.tar.bz2' file by running the command 'tar -jxf nfs-minimyth-{version}.tar.bz2. This should create the directory 'nfs-minimyth-{version}'.
- Change to the user 'root'.
- Create a directory named 'minimyth-{version}' in the '{boot}' directory. The '{boot}' directory is the MiniMyth boot directory on your TFTP server, which is the directory on the TFTP server that contains the gPXE boot loader file ('gpxe.0').
- Copy the 'kernel' file from the 'nfs-minimyth-{version}' directory to the '{boot}/minimyth-{version}' directory.
- Extract the 'nfs-minimyth-{version}/rootfs.tar.bz2' file by running the command 'tar -jxf rootfs.tar.bz2' in the 'nfs-minimyth-${version}' directory. This should create the directory nfs-minimyth-{version}/rootfs'.
- Extract the 'nfs-minimyth-{version}/themes.tar.bz2' file by running the command 'tar -jxf themes.tar.bz2' in the 'nfs-minimyth-${version}' directory. This should create the directory nfs-minimyth-{version}/themes'.
- Move the contents of the 'nfs-minimyth-{version}/themes' directory to the 'nfs-minimyth-{version}/rootfs/rootfs-ro/usr/share/mythtv/themes' directory.
- Create a directory named 'minimyth-{version}' in the '{nfs-directory}' directory. The '{nfs-directory}' directory is a directory on your NFS server.
- Move the contents of the 'nfs-minimyth-{version}/rootfs' directory to the '{nfs-directory}/minimyth-{version}' directory.
- Share the '{nfs-directory}/minimyth-{version}' directory using NFS. This NFS share can (and should) be read only and squash root.
Finally, create an appropriate MiniMyth read-only configuration directory in the '{boot}' directory. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
MiniMyth can boot from a local flash device. It can boot from a USB flash disk connected using USB. It can boot from a CompactFlash card connected using a CF-to-IDE adapter. However, it should be noted that people have had trouble with very long loading times for the MiniMyth kernel and MiniMyth RAM root file system when booting from a USB flash disk.
Since MiniMyth make no assumptions about the media, it should be able to local boot from other types of local storage devices (e.g. a hard disk) as well. However, we have not tested this and this page does not contain instructions for these configurations.
For local boot, you can use any boot loader that is able to boot Linux from a FAT partition and has initial RAM disk (initrd) support. Boot loaders that meet these requirements include popular boot loaders such as GRUB and LILO. However, in this documentation and the automated installation scripts, we use SYSLINUX, which is a close relative of the PXELINUX boot loader that we use to support network boot using PXELINUX.
For SYSLINUX based local boot, the following sequence occurs:
- The computer BIOS queries the local storage device for the location on the local storage device of the SYSLINUX boot loader.
- The boot sector on the local storage device tells the computer BIOS the location on the local storage device of the SYSLINUX boot loader file, and the BIOS retrieves the SYSLINUX boot loader from the local storage device.
- The SYSLINUX boot loader tells the SYSLINUX boot loader the location on the local storage device of the SYSLINUX boot loader configuration file, and the SYSLINUX boot loader retrieves the SYSLINUX boot loader configuration file.
- The SYSLINUX boot loader configuration file tells the SYSLINUX boot loader the location on the local storage device of the kernel file and initial root file system file (if needed), and the SYSLINUX boot loader retrieves the kernel and the initial root file system image (if needed).
- The SYSLINUX boot loader configuration file tells the SYSLINUX boot loader, the kernel and the initial root file system (if present) the location of the final root file system (if needed), and the kernel and initial root file system (if present) mount the final root file system (if needed).
There is no reason that MiniMyth cannot local boot the boot loader and kernel while using an NFS root file system. However, we have not tested this and this page does not include instructions for this configuration.
There is no reason that MiniMyth cannot local boot with a regular (non RAM) root file system. However, we have not tested and this page does not include instructions for this configuration.
This leaves us with local boot with a RAM root file system.
Given that most people run their MythTV backend on Linux, most people should have a computer running Linux. Therefore, we will give instructions for installing local boot MiniMyth using a computer running Linux.
The are two methods for creating a MiniMyth local boot device with a RAM root file system: automated and manual. We will cover both.
The MiniMyth distribution contains a shell script that will create a MiniMyth local boot device from a USB connected, flash device. This shell script attempts to detect the flash device and automates the manual steps for creating a MiniMyth local boot device with a RAM root file system. To run this shell script, do the following:
- If you do not already have one, create a MiniMyth read-only configuration directory with your desired files. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
- Connect your flash device to the computer running Linux through the USB interface. A USB flash disk can be connected directly. A CompactFlash card can be connected through a USB card reader.
- Download the 'mm_local_install' and 'mm_local_helper' shell scripts from the MiniMyth distribution download directory's 'scripts' directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Run the command 'bash mm_local_install {directory}', where '{directory}' is the directory that contains your MiniMyth read-only configuration directory.
- Review the information reported by 'mm_local_install' and decide whether or not allow 'mm_local_install' to continue. If the flash device is not correct or 'mm_local_install' was unable to detect the flash device, then you can provide the desired flash device as the second argument to 'mm_local_install'. If the MiniMyth distribution download URL is not correct or you want to install a MiniMyth distribution from a different location, then you can provide the URL that points to the desired MiniMyth distribution as the third argument of 'mm_local_install'.
- Disconnect your flash device from the computer and connect it to your MiniMyth system.
If you want to see what was installed on the flash device, you can reconnect it and mount it. Essentially, 'mm_local_install' formatted the flash device as FAT, installed the SYSLINUX boot loader and boot loader configuration file, and installed all the files in the 'ram-minimyth-{version}.tar.bz2' file from the MiniMyth distribution, including the 'minimyth.md5' file, 'kernel' file, the 'rootfs' file and the 'themes' directory.
If there is some reason that you cannot perform (or do not wish to perform) an automated install, then you can perform a manual install by following the instructions below:
- If you do not already have one, create a MiniMyth read-only configuration directory with your desired files. You can find out how to do this in the MiniMyth configuration instructions. If you already have a MiniMyth read-only configuration directory be sure that it is up-to-date for the version of MiniMyth you plan to run.
- Connect your flash device to the computer through the USB interface. A USB flash disk can be connected directly. A CompactFlash card can be connected through a USB card reader.
- Download the files that are necessary for booting a RAM root file system. These files can be found in the 'ram-minimyth-{version}.tar.bz2' file in a MiniMyth distribution download directory. The location of the MiniMyth distribution download directories can be found in the MiniMyth download instructions.
- Extract the 'ram-minimyth-{version}.tar.bz2' file by running the command 'tar -jxf ram-minimyth-{version}.tar.bz2. This should create the directory 'ram-minimyth-{version}'.
- Change to the user 'root'.
- Make sure that your flash device is not mounted by running the command 'umount /dev/{device}', where '{device}' is your flash device (e.g. sda).
- Format your flash device with the label 'minimyth' and a FAT file system having lowercase and long file name support by running the command 'mkfs.msdos -I -F 32 -n minimyth /dev/{device}'. The FAT file system is used because it is supported by both SYSLINUX and MiniMyth. The lowercase and long file name support is needed because configuration file names are case sensitive and do not conform to the 8.3 file format. The label 'minimyth' is used because MiniMyth identifies any partition labeled 'minimyth' as the MiniMyth boot partition.
- Install the SYSLINUX boot loader on your flash device by running the command 'syslinux /dev/{device}'.
- Mount your flash device by running the command 'mount /dev/{device} {boot}', where '{boot}' is a mount point of your choosing.
-
Create the SYSLINUX configuration file '{boot}/syslinux.cfg' containing
DEFAULT minimyth-ram LABEL minimyth-ram KERNEL kernel APPEND ro root=/dev/ram0 ramdisk_size=192000 initrd=rootfs
- Copy the 'kernel' file from the 'ram-minimyth-{version}' directory to the '{boot}' directory.
- Copy the 'rootfs' file from the 'ram-minimyth-{version}' directory to the '{boot}' directory.
- Copy the 'themes' directory from the 'ram-minimyth-{version}' directory to the '{boot}' directory.
- Create the MiniMyth distribution file list by running the command 'cd ${boot} ; md5sum `ls -1 kernel rootfs themes/*` > minimyth.md5'. The MiniMyth distribution file list will be needed in the future when running the local boot update command 'mm_local_update' to update your MiniMyth distribution to the latest version.
- Copy your MiniMyth read-only configuration directory ('conf') to the '{boot}' directory.
- Make sure that everything has been written to your flash device by running the command 'sync'.
- Unmount your flash device by running the command 'umount ${boot}'.
- Disconnect your flash device from the computer and connect it to your MiniMyth system.
While we have used the SYSLINUX boot loader, there should be no reason that you cannot use a different boot loader, but we have not tested this. Independent of the boot loader used, you must format the drive/partition as FAT, because that is the only file system recognized by MiniMyth. Independent of the boot loader used, you the file system must support lowercase and long file names, because configuration files are case sensitive and do not conform to the 8.3 file format.
While we have used a flash device, there should be no reason that you cannot use a different local storage device (e.g. a hard disk), but we have not tested this.
While we have used a computer running Linux to perform the manual install, there should be no reason that you cannot use a computer running Windows to perform the manual install, but we have not tested this. The SYSLINUX website has instructions for installing the SYSLINUX boot loader from a computer running Windows. When creating text files such as the SYSLINUX configuration file and the MiniMyth configuration file and script, be sure that you use an editor that writes Unix text file format and not DOS text file format.


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object de.myfoo.commonj.util.AbstractManager de.myfoo.commonj.work.FooWorkManager
public final class FooWorkManager
Implementation of a WorkManager. The WorkManager is the abstraction for dispatching and monitoring asynchronous work and is a factory for creating application short or long lived Works.
This WorkManager does not support remoting works. However,
applications that follow the programming model will work.
Serializable Works will be executed within the local JVM but the
WorkItem
can safely be down-casted to a
RemoteWorkItem
.
If the scheduled Work
is a daemon Work, then the life-cycle of
that Work is tied to the application that scheduled it. If the application is
stopped, the Work.release()
method will be called.
WorkManager
| Field Summary |
|---|
| Fields inherited from class de.myfoo.commonj.util.AbstractManager |
|---|
pool |
| Fields inherited from interface commonj.work.WorkManager |
|---|
IMMEDIATE, INDEFINITE |
| Constructor Summary | |
|---|---|
FooWorkManager(ThreadPool pool)
Creates a new instance of FooWorkManager. |
|
FooWorkManager(ThreadPool pool,
int maxDaemons)
Creates a new instance of FooWorkManager. |
| Method Summary | |
|---|---|
protected void |
finalize()
Clean up. |
void |
forceShutdown()
Shutdown the thread pool and daemons. |
int |
getMaxDaemons()
Getter for maxDaemons |
commonj.work.WorkItem |
schedule(commonj.work.Work work)
Dispatches a Work asynchronously. |
commonj.work.WorkItem |
schedule(commonj.work.Work work,
commonj.work.WorkListener wl)
Dispatches a Work asynchronously. |
void |
setMaxDaemons(int maxDaemons)
Setter for maxDaemons |
void |
shutdown()
Shutdown the thread pool and daemons. |
boolean |
waitForAll(java.util.Collection workItems,
long timeoutMs)
Wait for all WorkItems in the collection to finish successfully or otherwise. |
java.util.Collection |
waitForAny(java.util.Collection workItems,
long timeoutMs)
Wait for any of the WorkItems in the collection to finish. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public FooWorkManager(ThreadPool pool)
pool
- the thread pool to execute work inpublic FooWorkManager(ThreadPool pool, int maxDaemons)
pool
- the thread pool to execute work inmaxDaemons
- max number of daemons to allow| Method Detail |
|---|
public commonj.work.WorkItem schedule(commonj.work.Work work) throws commonj.work.WorkException, java.lang.IllegalArgumentException
At-most-once semantics are provided. If the server fails then the Work will not be executed on restart.
If this FooWorkManager is a pinned one, i.e. one obtained using
RemoteWorkItem.getPinnedWorkManager()
and that JVM that it
represents has failed then a WorkRejectedException
will be
thrown even if the remote JVM restarts. The pinned WorkManager must be
refreshed by using a normal WorkManager and then acquiring a new pinned
WorkManager.
schedule
in interface commonj.work.WorkManager
work
- the Work to execute.
commonj.work.WorkException
- If queuing this up results in an exception then
a WorkException is thrown.
java.lang.IllegalArgumentException
- thrown if work is a javax.ejb.EnterpriseBean.WorkManager.schedule(commonj.work.Work)
public commonj.work.WorkItem schedule(commonj.work.Work work, commonj.work.WorkListener wl) throws commonj.work.WorkException, java.lang.IllegalArgumentException
At-most-once semantics are provided. If the server fails then the Work will not be executed on restart.
The WorkListener methods are called using the J2EE context of the caller as the Work progresses through processing.
If this FooWorkManager is a pinned one, i.e. one obtained using
RemoteWorkItem.getPinnedWorkManager()
and that JVM that it
represents has failed then a WorkRejectedException
will be
thrown even if the remote JVM restarts. The pinned WorkManager must be
refreshed by using a normal WorkManager and then acquiring a new pinned
WorkManager.
schedule
in interface commonj.work.WorkManager
work
- the Work to execute.wl
- can be null or a WorkListener which is used to inform the
application of the progress of a Work.
commonj.work.WorkException
- If queuing this up results in an exception then a
WorkException is thrown.
java.lang.IllegalArgumentException
- thrown if work is a
javax.ejb.EnterpriseBean.WorkManager.schedule(commonj.work.Work,
commonj.work.WorkListener)
public boolean waitForAll(java.util.Collection workItems, long timeoutMs) throws java.lang.InterruptedException, java.lang.IllegalArgumentException
The WorkItems collection should not be altered once submitted until the method returns.
waitForAll
in interface commonj.work.WorkManager
workItems
- the Collection of WorkItem objects to wait for.timeoutMs
- the timout in milliseconds. If this is 0 then this
method returns immediately.
true
if all WorkItems have completed,
false
if the timeout has expired.
java.lang.InterruptedException
- thrown if the wait is interrupted.
java.lang.IllegalArgumentException
- thrown if workItems is null, any of the
objects in the collection are not WorkItems or the timeout_ms is
negative.WorkManager.waitForAll(java.util.Collection, long)
public java.util.Collection waitForAny(java.util.Collection workItems, long timeoutMs) throws java.lang.InterruptedException, java.lang.IllegalArgumentException
The WorkItems collection should not be altered once submitted until the method returns.
waitForAny
in interface commonj.work.WorkManager
workItems
- the Collection of WorkItem objects to wait for.timeoutMs
- the timeout in ms. If this is 0 then the method returns
immediately, i.e. does not block.
java.lang.InterruptedException
- thrown if the wait is interrupted.
java.lang.IllegalArgumentException
- thrown if workItems is null, any of the
objects in the collection are not WorkItems or the timeout_ms is
negative.WorkManager.waitForAny(java.util.Collection, long)
public void shutdown()
shutdown
in class AbstractManager
public void forceShutdown()
forceShutdown
in class AbstractManager
protected void finalize() throws java.lang.Throwable
finalize
in class java.lang.Object
java.lang.Throwable
public int getMaxDaemons()
public void setMaxDaemons(int maxDaemons)
maxDaemons
- The maxDaemons to set.
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Time Capsul is like a normal time capsule…
Expect it is not buried in the ground, but in the cloud...
And it doesn’t go offline…
And it is always updating and backfilling…
I guess it’s not a time capsule at all
What it Actually is:
Time Capsul is cloud base platform for publicly documenting the world around us and
what it once was.
TimeCapsul asks its users to upload images from photo albums, frames, and even their phones. Then
combine the images with a description to tell a story.
By combining everyone’s history and heritage we can remember where we came from, explore new
locations and their history, and as a community document a more accurate past.
Join us


Binds:
F1
- general freeroam menu.
Commands:
/veh [veh_name] - creating vehicle.
/skin [skin_name] - change skin.
/fix - repair the vehicle.
/flip - flip the vehicle.
/weapon [weapon_name] - give the weapon for player.
/kill - suicide.
/hp - set 100% health for player.
/armour - set 100% armour for player.
/warp [player_id] - warp to player.
/tp [x] [y] [z] - teleportation player in the coordinates.


File API & FileReader API not supported
XHR2's FormData is not supported
XHR2's upload progress isn't supported
Drag and drop an image...
Upload progress:
File API & FileReader API not supported
XHR2's FormData is not supported
XHR2's upload progress isn't supported
Upload progress:


What channel is Arsenal vs Vitoria on? TV and live stream information
Arsenal are facing off against Vitoria Guimaraes on the unusual Europa League game night of Thursday
by Sam FletcherArsenal are back in Europa League action as they face bottom of the group Vitoria SC - but on a bizarre Wednesday game night.
After a disappointing draw at home to Wolves on Saturday, the Europa League comes as a welcome distraction for Unai Emery where qualification to the knockout stages can be all but confirmed with a win.
Last season’s finalists have won each of their three opening Group F fixtures and have kept a clean sheet in two of them.
Yet, undoubtedly, their most difficult European fixture this season came against Wednesday’s opponents when the Gunners twice had to come from behind to take all three points.
Here’s everything you need to know ahead of the match...
When is the game?
The game is being played on Wednesday 6th November.
The match was scheduled for Thursday but with Vitoria’s rivals Braga also competing in the competition this season the Arsenal match has been brought forward to prevent fans clashing.
Kick-off is set for 3:50pm so it doesn’t interfere with the Champions League matches later in the day.
Where is the game being played?
The game takes place at Vitoria SC’s Estadio D.Afonso Henriques.
The ground has a capacity of 30,165.
What TV channel is the game on?
The game will be shown live on BT Sport 2. Coverage to start at 3:30pm.
Can you live stream the game?
If you’re a subscriber to BT Sport you will be able to watch the match on their website or via the BT Sport app.
Alternatively, you can follow all of the action on the Mirror Football live blog.
Arsenal team news
Unai Emery boasts a fully-fit squad ahead of the trip to Portugal but has left out some of his key names.
Mesut Ozil and Pierre-Emerick Aubameyang have not travelled.
Granit Xhaka has been left out of the squad and likely played his last game for the club after being stripped of the captaincy following his furious outburst at fans last month.
Reiss Nelson featured for the under-23s on Friday night and is available for selection after recovering from a knee injury.
Vitoria SC team news
Vitoria have a host of players sidelined through injury with manager Ivo Vieira having to resort to the bare-bones of his squad.
Jhonatan, Alhassan Wakaso, Andre Andre, Joseph Amoah, Ola John, Falaye Sacko, Valerii Bondarenko and Miguel Oliveira are all confirmed to miss the match, while Victor Garcia will have a late medical.
Betting odds
- Vitoria 11/5
- Draw 13/5
- Arsenal 23/20
Odds courtesy of thepools.com


Stress is perfectly normal. It is just a sense of danger - real or imaginary - that kicks your body's defenses into high gear, also known as "fight or flight" or the stress response. Stress has a positive effect on your body. It helps you stay energetic, focused, and alert.
Physiological symptoms of stress are the response of the body to stressful situations.
Cognitive Symptoms of stress is the way we mentally process our surroundings.
Stress is easily manageable, a few ways are: the use of technology, learning to say "no", setting realistic goals, etc.. Keeping a positive outlook on life is the key.
Stress is perfectly normal. It is just a sense of danger - real or imaginary - that kicks your body's defenses into high gear, also known as "fight or flight" or the stress response. It is a big difference between being stressed and overly stresses. Stress has a positive effect on your body. It helps you stay energetic, focused, and alert.  Being overly stressed can cause major damage to many areas such as:
It is no surprise that college can be extremely stressful on an individual. College students are made to adjust to an independent life, learning to balance their social, work and academic life. College students are constantly given deadlines for assignments, projects, midterms, finals, etc.. Contrary to popular belief, stress is not only caused by negative life events such as strict deadlines, arguments etc.. but can be caused by positive events such as clubs, graduating etc..
A common term many individuals either hear or use is "fight or flight". What exactly is the "fight or flight response?"
The human body sends a signal to the brain giving it a warning signal that you are in danger, "beginning with the release of the hormone ACTH into the bloodstream. Within seconds, there is the output of adrenalin and other stress-related hormones, a rise in blood pressure, an increase in glucose levels and the alerting of the major organs and sensory systems to prepare for physical action."
Physiological symptoms of stress are the response
of the body to stressful situations.
Some physiological signs of stress are: shallow,
rapid breathing, heart racing, increased
perspiration, etc..
Cognitive Symptoms of stress is the way we mentally
process our surroundings.
Some cognitive signs of stress are: difficulty
concentrating, easily distracted, tendency to be
negative, etc..
Behavioral symptoms of stress are actions performed that are observed by other people. Some behavioral signs of stress are: irritability, sarcasm, losing patience, etc..
Cognitive Symptoms of stress is the way we mentally process our surroundings.
Behavioral symptoms of stress are actions performed that are observed by other people.Physiological symptoms of stress are the response of the body to stressful situations.
Being aware of stressful situations is the key component to managing stress. An effective way of monitoring and understanding where your stress comes from is by using a journal/diary. By keeping a record of your stressors you can have a better understanding of how you react to situations you are in.


--- layout: post title: Bret Victor - Inventing on Principle categories: [] tags: - geek - research status: publish type: post published: true meta: _original_post_id: '' _original_import_author: John Duprey author: ---
Bio: Bret Victor invents tools that enable people to understand and create. He has designed experimental UI concepts at Apple, interactive data graphics for Al Gore, and musical instruments at Alesis.
For more on Bret, see worrydream.com.
This talk was given at CUSEC 2012 (2012.cusec.net).


This page tests for all features Modernizr can detect and caches the result in a session cookie, thus reducing page loading time.
You can verify it by reloading the page.
Loading time:


Query: {{ query }}
ProvGame ProvGraph ProvPolyGraph TrioGraph LinGraph Run Query Top-k Patterns: Sample Size: Failure Pattern: Weight for Recall: Weight for Informativeness:


Toggle navigation
Liquor Tree
Toggle navigation
Bartender
Choose Your Spirit
Recipe Ingredients:
Recipe Instructions:


{{ _('A joint project between the chair in History of the Ottoman Empire and Modern Turkey and the University Library. Funded by the DFG.') }} | {{ _('Contact') }}


{{workshop.date.strftime('%d')}}{{workshop.date.strftime('%b')}}
{{workshop.description|safe}}
Want to know about future workshops? Join the mailing list.


Get some historical market data to train and test the model. For example, get data for the securities shown in the following table:
| Group Name | Tickers |
|---|---|
| Overall US market | SPY, QQQ, DIA |
| Tech companies | AAPL, MSFT, TSLA |
| Long-term US Treasury ETFs | IEF, TLT |
| Short-term US Treasury ETFs | SHV, SHY |
| Heavy metal ETFs | GLD, IAU, SLV |
| Energy sector | USO, XLE, XOM |
qb = QuantBook() tickers = ["SPY", "QQQ", "DIA", "AAPL", "MSFT", "TSLA", "IEF", "TLT", "SHV", "SHY", "GLD", "IAU", "SLV", "USO", "XLE", "XOM"] symbols = [qb.AddEquity(ticker, Resolution.Daily).Symbol for ticker in tickers] history = qb.History(symbols, datetime(2020, 1, 1), datetime(2022, 2, 20))


Join us any evening for refreshing elixirs, conversation and maybe a game or two of Dance Dance Revolution. Wireless access is always provided; BYOWS (Bring your own Web server).
you'll find us right in the center of downtown Webville.If you need help finding us, check out our detailed directions. Come join us!


DynamicPaintSurface(bpy_struct)¶
base class — bpy_struct
-
class
bpy.types.
DynamicPaintSurface
(bpy_struct)¶ A canvas surface layer
-
brush_collection
¶ Only use brush objects from this collection
Type: Collection
-
brush_influence_scale
¶ Adjust influence brush objects have on this surface
Type: float in [0, 1], default 0.0
-
brush_radius_scale
¶ Adjust radius of proximity brushes or particles for this surface
Type: float in [0, 10], default 0.0
-
color_dry_threshold
¶ The wetness level when colors start to shift to the background
Type: float in [0, 1], default 0.0
-
color_spread_speed
¶ How fast colors get mixed within wet paint
Type: float in [0, 2], default 0.0
-
depth_clamp
¶ Maximum level of depth intersection in object space (use 0.0 to disable)
Type: float in [0, 50], default 0.0
-
displace_factor
¶ Strength of displace when applied to the mesh
Type: float in [-50, 50], default 0.0
-
displace_type
¶ Type: enum in [‘DISPLACE’, ‘DEPTH’], default ‘DISPLACE’
-
dissolve_speed
¶ Approximately in how many frames should dissolve happen
Type: int in [1, 10000], default 0
-
drip_acceleration
¶ How much surface acceleration affects dripping
Type: float in [-200, 200], default 0.0
-
drip_velocity
¶ How much surface velocity affects dripping
Type: float in [-200, 200], default 0.0
-
dry_speed
¶ Approximately in how many frames should drying happen
Type: int in [1, 10000], default 0
-
effect_ui
¶ Type: enum in [‘SPREAD’, ‘DRIP’, ‘SHRINK’], default ‘SPREAD’
-
effector_weights
¶ Type: EffectorWeights
, (readonly)
-
frame_end
¶ Simulation end frame
Type: int in [1, 1048574], default 0
-
frame_start
¶ Simulation start frame
Type: int in [1, 1048574], default 0
-
frame_substeps
¶ Do extra frames between scene frames to ensure smooth motion
Type: int in [0, 20], default 0
-
image_fileformat
¶ Type: enum in [‘PNG’, ‘OPENEXR’], default ‘PNG’
-
image_output_path
¶ Directory to save the textures
Type: string, default “”, (never None)
-
image_resolution
¶ Output image resolution
Type: int in [16, 4096], default 0
-
init_color
¶ Initial color of the surface
Type: float array of 4 items in [0, inf], default (0.0, 0.0, 0.0, 0.0)
-
init_color_type
¶ Type: enum in [‘NONE’, ‘COLOR’, ‘TEXTURE’, ‘VERTEX_COLOR’], default ‘NONE’
-
init_layername
¶ Type: string, default “”, (never None)
-
is_active
¶ Toggle whether surface is processed or ignored
Type: boolean, default False
-
is_cache_user
¶ Type: boolean, default False, (readonly)
-
name
¶ Surface name
Type: string, default “”, (never None)
-
output_name_a
¶ Name used to save output from this surface
Type: string, default “”, (never None)
-
output_name_b
¶ Name used to save output from this surface
Type: string, default “”, (never None)
-
point_cache
¶ Type: PointCache
, (readonly, never None)
-
shrink_speed
¶ How fast shrink effect moves on the canvas surface
Type: float in [0.001, 10], default 0.0
-
spread_speed
¶ How fast spread effect moves on the canvas surface
Type: float in [0.001, 10], default 0.0
-
surface_format
¶ Surface Format
Type: enum in [‘VERTEX’, ‘IMAGE’], default ‘VERTEX’
-
surface_type
¶ Surface Type
Type: enum in [‘PAINT’], default ‘PAINT’
-
use_antialiasing
¶ Use 5x multisampling to smooth paint edges
Type: boolean, default False
-
use_dissolve
¶ Enable to make surface changes disappear over time
Type: boolean, default False
-
use_dissolve_log
¶ Use logarithmic dissolve (makes high values to fade faster than low values)
Type: boolean, default False
-
use_drip
¶ Process drip effect (drip wet paint to gravity direction)
Type: boolean, default False
-
use_dry_log
¶ Use logarithmic drying (makes high values to dry faster than low values)
Type: boolean, default False
-
use_drying
¶ Enable to make surface wetness dry over time
Type: boolean, default False
-
use_incremental_displace
¶ New displace is added cumulatively on top of existing
Type: boolean, default False
-
use_output_a
¶ Save this output layer
Type: boolean, default False
-
use_output_b
¶ Save this output layer
Type: boolean, default False
-
use_premultiply
¶ Multiply color by alpha (recommended for Blender input)
Type: boolean, default False
-
use_shrink
¶ Process shrink effect (shrink paint areas)
Type: boolean, default False
-
use_spread
¶ Process spread effect (spread wet paint around surface)
Type: boolean, default False
-
use_wave_open_border
¶ Pass waves through mesh edges
Type: boolean, default False
-
uv_layer
¶ UV map name
Type: string, default “”, (never None)
-
wave_damping
¶ Wave damping factor
Type: float in [0, 1], default 0.0
-
wave_smoothness
¶ Limit maximum steepness of wave slope between simulation points (use higher values for smoother waves at expense of reduced detail)
Type: float in [0, 10], default 0.0
-
wave_speed
¶ Wave propagation speed
Type: float in [0.01, 5], default 0.0
-
wave_spring
¶ Spring force that pulls water level back to zero
Type: float in [0, 1], default 0.0
-
wave_timescale
¶ Wave time scaling factor
Type: float in [0.01, 3], default 0.0
-
output_exists
(object, index)¶ Checks if surface output layer of given name exists
Parameters: index (int in [0, 1]) – Index Return type: boolean
-
classmethod
bl_rna_get_subclass
(id, default=None)¶ Parameters: id (string) – The RNA type identifier. Returns: The RNA type or default when not found. Return type: bpy.types.Struct
subclass
-
classmethod
bl_rna_get_subclass_py
(id, default=None)¶ Parameters: id (string) – The RNA type identifier. Returns: The class or default when not found. Return type: type
-
Inherited Properties
Inherited Functions
References


Look at that!!
Maybe you read sth about me
Please be patient and try to reach me Click here and win 100k $$$


This vignette provides a quick tour of the R package rtweet: Collecting Twitter Data
.
Search for up to 18,000 (non-retweeted) tweets containing the rstats hashtag.
## search for 18000 tweets using the rstats hashtag
rt <- search_tweets(
"#rstats", n = 18000, include_rts = FALSE
)
## preview tweets data
rt
## preview users data
users_data(rt)
## plot time series (if ggplot2 is installed)
ts_plot(rt)
Quickly visualize frequency of tweets over time using ts_plot()
.
## plot time series of tweets
ts_plot(rt, "3 hours") +
ggplot2::theme_minimal() +
ggplot2::theme(plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "Frequency of #rstats Twitter statuses from past 9 days",
subtitle = "Twitter status (tweet) counts aggregated using three-hour intervals",
caption = "\nSource: Data collected from Twitter's REST API via rtweet"
)
Twitter rate limits cap the number of search results returned to 18,000 every 15 minutes. To request more than that, simply set retryonratelimit = TRUE
and rtweet will wait for rate limit resets for you.
## search for 250,000 tweets containing the word data
rt <- search_tweets(
"data", n = 250000, retryonratelimit = TRUE
)
Search by geo-location—for example, find 10,000 tweets in the English language sent from the United States.
## search for 10,000 tweets sent from the US
rt <- search_tweets(
"lang:en", geocode = lookup_coords("usa"), n = 10000
)
## create lat/lng variables using all available tweet and profile geo-location data
rt <- lat_lng(rt)
## plot state boundaries
par(mar = c(0, 0, 0, 0))
maps::map("state", lwd = .25)
## plot lat and lng points onto state map
with(rt, points(lng, lat, pch = 20, cex = .75, col = rgb(0, .3, .7, .75)))
Randomly sample (approximately 1%) from the live stream of all tweets.
Stream all geo enabled tweets from London for 60 seconds.
## stream tweets from london for 60 seconds
rt <- stream_tweets(lookup_coords("london, uk"), timeout = 60)
Stream all tweets mentioning realDonaldTrump or Trump for a week.
Retrieve a list of all the accounts a user follows.
Retrieve a list of the accounts following a user.
## get user IDs of accounts following CNN
cnn_flw <- get_followers("cnn", n = 75000)
## lookup data on those accounts
cnn_flw_data <- lookup_users(cnn_flw$user_id)
Or if you really want ALL of their followers:
Get the most recent 3,200 tweets from cnn, BBCWorld, and foxnews.
## get user IDs of accounts followed by CNN
tmls <- get_timelines(c("cnn", "BBCWorld", "foxnews"), n = 3200)
## plot the frequency of tweets for each user over time
tmls %>%
dplyr::filter(created_at > "2017-10-29") %>%
dplyr::group_by(screen_name) %>%
ts_plot("days", trim = 1L) +
ggplot2::geom_point() +
ggplot2::theme_minimal() +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "Frequency of Twitter statuses posted by news organization",
subtitle = "Twitter status (tweet) counts aggregated by day from October/November 2017",
caption = "\nSource: Data collected from Twitter's REST API via rtweet"
)
Get the 3,000 most recently favorited statuses by JK Rowling.
Search for 1,000 users with the rstats hashtag in their profile bios.
## lookup users by screen_name or user_id
users <- c("KimKardashian", "justinbieber", "taylorswift13",
"espn", "JoelEmbiid", "cstonehoops", "KUHoops",
"upshotnyt", "fivethirtyeight", "hadleywickham",
"cnn", "foxnews", "msnbc", "maddow", "seanhannity",
"potus", "epa", "hillaryclinton", "realdonaldtrump",
"natesilver538", "ezraklein", "annecoulter")
famous_tweeters <- lookup_users(users)
## preview users data
famous_tweeters
# extract most recent tweets data from the famous tweeters
tweets_data(famous_tweeters)


Tahuna is the chief town and port for the Sangihe Islands within the province of North Sulawesi. It is located on the island of Sangihe Besar. A convenient entry port into Indonesia if coming from the southern Philippines. The only airport in the islands is located here - Naha airport.
Position 03° 36'19"N, 125° 30'03"E.
Whilst this is not an official port of entry for Indonesia, there is a CIQP office here and there is support from central government to make this a clearance port for yachts coming from the north.
It is probable that you are able to complete all clearance formalities except for securing a visa on arrival.
Last updated February 2016.
Details on the anchorage here will be coming soon. A dinghy pontoon is planned. There are some internet cafés in the centre of town but it's easier to buy a "Wifi Internet Voucher", which you can use on your boat. Only Rp100,000 for 250Mb, valid 30 days.
Last updated July 2013.


Piceno LLC is a wine import firm based in Wilmington, Delaware. Its founder and President is Jack Polidori.
Piceno LLC specializes in the wines and varietals found in Italy’s Ascoli Piceno Province, the southernmost of the five provinces that comprise the Marche Region. Located along the eastern, mid-central Adriatic coast of Italy, this zone benefits by its proximity both to the Appenine Mountains to the west and the cool sea breezes from the Adriatic Sea to the east. Ascoli Piceno also is endowed with highly mineralized clay soils, both north and south facing hills, and a long growing season, thus enabling the production of both high quality red and white grapes.
Piceno LLC got its start in 2011 when Polidori decided to help make available in the United States wines from his family’s home province. His paternal family originated in the portion of the province known as the Offida DOC region … specifically, the Commune of Ripatransone.
Piceno LLC aims to introduce to the American market longtime varietals grown in this province such as Rosso Piceno Superiore, Rosso Piceno, Passerina, Pecorino, and the various blends that utilize the area’s prominent varietals: reds such as Montepulciano, Sangiovese, and Cabernet Sauvignon; and whites such as Pecorino, Passerina, and Trebbiano.
Piceno LLC also intends over time to find other lesser known, but interesting high quality grapes and wines from the Balkan countries on the eastern coast of the Adriatic Sea.
The evolution of Piceno’s original mission to find and deliver lesser known varietals now includes the identification of ‘craft’ vineyards in other ‘less traveled’ areas of Italy and the Adriatic basin (which includes the Balkans). These efforts have taken us to wine areas renowned for their unique soil characteristics and family-owned vineyards that provide great quality and price values. We now represent four such vineyards --- each of them family-owned, small production enterprises.
http://www.wineweb.com/scripts/searchWineMap.cfm/Italy/_/Marches/Ascoli-Piceno/
http://www.marchebreaks.com/ascolipicenowines.htm
http://loprofile.com/2014/09/italys-province-of-ascoli-piceno/
http://www.consorziovinipiceni.com/en/
http://www.lemarcheholiday.net/
https://en.wikipedia.org/wiki/Ripatransone
http://en.geosearch.it/p_1/marche/cantine/provincia-ascoli-piceno.php


Florida man demands less money during bank robbery, deputies say
by Jordan SmithBOCA RATON, Fla. (Gray News) - Deputies in Palm Beach County said Sandy Hawkins could have walked out of Wells Fargo this week with $2,000, but he settled for less.
Apparently, $1,100 was plenty for the 73-year-old robbery suspect.
An arrest report reviewed by The Palm Beach Post said Hawkins walked into the bank Monday sporting a “Make America Great Again” shirt and asked the teller for $1,100. The teller, in turn, asked Hawkins for his debit card, not realizing Hawkins’ alleged intent to rob the place.
 Investigators later learned there was no weapon involved.
Authorities said the teller handed Hawkins $2,000, but Hawkins rejected it because he only wanted the specified amount.
The teller said he counted out 11 $100 bills and gave it to Hawkins, who then left.
The next day, investigators reviewed footage from the bank’s security cameras. They took images to the surrounding businesses, hoping that someone could identify the suspect.
They caught a bit of luck when they got to Turn 3, a sports bar in the same shopping strip as the bank. The bar’s manager identified the suspect as Sandy Hawkins, who had reportedly become a regular patron at the establishment.
The manager’s father directed law enforcement to Hawkins’ home, not far from the strip mall. Half an hour later, they were knocking on his door.
Deputies said Hawkins told them he’d “make this easy.” They said he pulled out a wrinkled-up deposit slip with a handwritten message on the back: “Give me $1,100 now. No alarms. Hope to get caught.”


I'm not sure how many TV series have been moved to the big screen before the end of its small screen run. Actually, I'm not sure if there are that many TV series that are brought to the big screen at all: it seems to be an 1990s phenomenon, though there was Star Trek all those years go. Mostly, what we see are nostalgia trips ("Flintstones", "Lost in Space", the "Avengers") ironic revivals ("The Brady Bunch") or Ideas That Should Not Have Been Thought ("Dennis the Menace"). But we'll probably never see (thankfully, actually) a "Friends" movie, though it may feel like that each and every Jennifer Aniston or David Schwimmer romantic comedy is an alternative history of the TV show.
So, on Friday, "X-Files" has joined "Beavis and Butthead" and "MST3K" as the three TV shows I can name off-hand to have made it to the big screen before their runs have finished. It should be more successful than its two predecessors. While it may not make the American Film Institute's Top 100 films (not exactly an authoritative list), it isn't disappointing, like "Beavis and Butthead", or why-bother like "MST3K".
I had hoped "X-Files" would have been more ambitious. Considering the series internal mythology and its threads of continuity, my idea of an "X-Files" movie would have been a movie that could have been dropped into the existing series as-is. It would have been a vehicle to carry the myth arc from the season finale, and leave questions for the season premiere. The series would have torn down the increasingly tattered curtain between small and big screens.
 I don't think that many non-fans will see the movie, and there are some 20 million people following the series. At $5 a pop, you have a $100 million movie. Plus repeats, because people will watch it several times to dig out the myth-arc clues or the tiniest indicators of the Mulder-Scully relationship. The strength of the fan base depends in large part on exploring these mysteries. Yes, it'd make less than "Godzilla", but Chris Carter et al wouldn't have staked $200 million in a movie that'll make $150M.
The "X-Files" movie, as it turns out, was made to be more accessible to general audiences, and this robs it of a lot of punch. Whether the movie will be well-referred to next season is open to question. Certainly, the elements of the past finale aren't present, beyond an off-hand reference to the closing down of the X-Files as semi-organized activity. A recurring character does die, so I suppose they have to say something. He, however, was not as significant as Deep Throat, Mr. X or the Cancer Man.
In any case, the centerpiece Conspiracy plays a little like a Monster of the Week. The uninitiated have perhaps heard of the Conspiracy, would expect to see it in the movie, but it feels there more for scares and chills than for advancing the myth-arc. Yes, things are revealed about the nature of the black oil and what the Conspiracy is up to, but not much more than we know already. The main datum is that the Conspiracy itself, in setting up a double-cross, has itself been double-crossed. Besides this, Scully has to be rescued by Mulder. At the end, Cancer Man is talking to someone else, and there's a "curses, foiled again by Mulder" moment. General audiences may wonder why they don't just kill Mulder -- they've offed others. I suppose, in the space of this movie, it was too much to go into the Mulder-is-an-unwitting-pawn (i.e., "Luke, I am your father") thread that was touched on in the past two seasons. Yes, the speculation was wrong, but there still seems to be something special about Mulder.
One thing that surprised me was the apocalyptic themes in the film. While apocalypse and millennium may have lurked in the background of the "X-Files" (and is the centerpiece of Carter's other series), there has never been a sense that the Conspiracy would lead towards an almost Biblical end of the world scenario. Yet that is what the movie implies, in no unclear terms. I think it's an interesting change, though I'm not sure if it's a good one.
The movie, being a summer movie, isn't the height of originality. There are clearly bits and pieces from "Aliens". Actually, this reduces the extraterrestrials a fair amount. Prior to this, the aliens lurked in the shadows; it wasn't clear if they even existed outside of Mulder's mind. Now, we see them a bit more clearly: not quite men in rubber suits, but they've lost the sense of the sinister, the diabolical.
There are also Lovecraftian influences. "X-Files" has had Lovecraftian stories before, but mainly having to do with funguses hiding deep in the ground. This is similar: underground viruses that have existed for eons, a trip to Antartica. Perhaps it's more fitting for the end of the century: viruses and things that violate internally, rather than Great Old Ones menacing externally.
Oh, one somewhat cute thing: Mulder and Scully finally lock lips, but only in a Xena-Gabriel or Xander-Buffy sort of way. This is actually unrelated to any Shipper revelation. As a tease, a bone was tossed to Shippers earlier. It's unclear if this bone will lead to anything else in the upcoming season. The Scully-Mulder interaction is fairly good in the movie, a bit looser than it has been for most of this season.
There's a personal-crisis-must-happen-in-movies theme, of Scully being transfered to Utah. It, of course, is resolved by re-opening the X-Files as an investigative unit at the end of the movie, but I thought it'd make for a nice way to move the series to Los Angeles: Mulder and Scully are sent out there as a condition of re-establishing the X-Files.
All in all, I liked the movie. I thought it could have been more ambitious, but I was entertained. It's nice to see scenes unfolding in Washington or Texas, instead of South Vancouver or East Vancouver.
"The court determined that Fox TV does not impede free and fair competition in the teen-angst soap-com genre, therefore Party of Five need not be broken into five 'Parties of One,' one being distributed to each of the other networks."
-- "The court determined that Fox TV does not impede free and fair competition in the teen-angst soap-com genre, therefore Party of Five need not be broken into five 'Parties of One,' one being distributed to each of the other networks."
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


A power-law dependence of the run-out distance and time as a function of aspect ratio (column) and input energy (slope)
Two regimes with different values of the exponents are observed: a low-energy and a high-energy regime.
Column collapse: MPM captures frictional regime, however does not capture collisional regime
Slope - Low input energies: the distribution of kinetic energy in the system is found have a significant effect on the run-out, as the energy is mostly consumed in the destabilisation process.
MPM captures the “saturation effect” of dissipation due to friction, where the dilation of granular materials and rolling of the grains change in response to increase in friction coefficient
Slope: MPM is successfully able to simulate the transient run-out evolution with a single input parameter


Sammi is a new web developer, Minecraft streamer, and LEGO collector. Plagued by the horribly conflicting toxins of procrastination and perfectionism, she has a habit of planning or beginning projects without ever fleshing them out or finishing them, which results in a whole lot of not actually creating things. This is her 2021 attempt to fight that, and make progress every day.
#100daysofcode is an online coding event that challenges participants to code for one hour per day and to expand their technical network. Sammi's version of the challenge keeps the core purpose of the challenge in tact (code for one hour every day) but alters the network expansion requirements by challenging herself to connect with at least one person a week through a tech event or challenge, grab a coffee (in-person/virtual) with someone she wouldn't normally, or collaborating with someone on a project outside her comfort zone.


Enter Registration Details
First Name
Middle Name
Last Name
Username
Id Number
Email
Address
Password
Confirm Password


Some tools for working with Github upstream repos
So at the last MFUG Hack Night, I was convinced it was time to start hacking on my dream of a Github dashboard-esque thing that would tell me when the various clones I had had upstream changes.
So of course, the first thing I tried to do was to pick a programming language. At first, we thought of a Node-based local website. But I don’t know Node and I don’t like JavaScript. It being a functional hack night, I next considered Elm but stopped for two reasons:
- The elm-lang website examples currently crash,
- I don’t know Elm well enough (or at all, really.)
So I was stuck. I felt like the only way forward was a local-website dashboard-like interface. I could do it in python, but I’d prefer to do it in a functional language. But I didn’t know any functional language well enough. And the ideas for what the dashboard could do were getting numerous, making me feel overwhelmed at the idea of actually implementing it (I really can only afford to allocate a few short hours to this project.)
So in the end, I didn’t get started, and left the evening having accomplished nothing but having a good time talking to people - a pretty nice way to spend the night, but disheartening because I came out of it with the same number of programs that I went in with.
On the way home, on the tram, though, I thought perhaps a better place to start was to think about exactly what I wanted to do, and write down a usage plan for the tools that I felt I needed.
In the spirit of Linux/djb/sordina, I figured I’d try and have several self-contained programs, and then combine them in various ways to get the result I wanted.
What I wanted was:
- A way to see if a repo I have forked has upstream changes,
- Merging these changes in, if I so wish.
It turns out in order to do this I thought I wanted a tool to clone all the
repositories I had on Github (I’ve forked a lot of things.) But in fact, after
I’d actually written the tool, clone-all
, and used it, I realised I didn’t
want a copy of all those repos locally, simply because there are too many.
Nevertheless, I’ve kept that one around incase someone else finds it useful.
The other tool, infer-upstream
, turns out to be useful to derive the
upstream remote, and then I wrote a few bash scripts around it, to automate
the parts I wanted to automate.
So the tools turned out to be:
- clone-all - Clones all the Github repos of a specific user,
- infer-upstream - Determins the source repo of a fork,
- fetch_upstreams - Fetches upstreams of a series of directories, shows a short diff.
Happily, these three things turned out to be remarkably trivial to write, and require almost no work on my part, aside from having to understand a bit of Haskell. And I’m pretty happy about that, because I do have a little bit of time to learn Haskell insofaras I think it’ll be useful in the future.
clone-all
Let’s have a look at what clone-all
does:
noon@tmp>clone-all --help
Usage: clone-all [DIRECTORY] (-u|--user ARG)
Available options:
-h,--help Show this help text
DIRECTORY Directory to clone everything into
-u,--user ARG Name of the user to clone the repos of.
noon@tmp>clone-all . -u cosilky
Looking up repositories for cosilky ...
Found 1 repositories for cosilky.
1 that you don't already have.
Cloning into 'IPD_Morality'...
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 21 (delta 5), reused 21 (delta 5)
Receiving objects: 100% (21/21), 14.07 KiB, done.
Resolving deltas: 100% (5/5), done.
Unsurprising. Good.
infer-upstream
Consider
04:14 PM noon@tmp>infer-upstream --help
Usage: infer-upstream (-r|--repo ARG) (-u|--user ARG)
Available options:
-h,--help Show this help text
-r,--repo ARG Name of the repository that we will look up.
-u,--user ARG Name of the user that we will look this repo up on.
So for example:
noon@tmp>infer-upstream -r scirate3 -u silky
git@github.com:draftable/scirate3.git
So it writes the upstream ssh url to stdout.
Putting them together
These two were the only Haskell programs I had to write. And infact, they are heavily based on sordina’s Commando program, in terms of how they deal with parameters, etc, so not much work at all was involved.
In order to accomplish my goal of having correct upstream remotes set, for
all my existing repositories, and then being able to get a nice status, it
remains only to write some bash scripts that loop around in my dev
directory, doing the appropriate things.
Indeed, this is what I have done in
The first script - upstream_everything
- takes a directory, looks for those
folders which are git repositories, then assumes they are Github repositories
and tries to find a source for it, under the assumption it is a fork.
Supposing it finds a source, it creates a new upstream
remote and moves on.
Supposing it doesn’t, it does nothing.
The second script - fetch_upstreams
- does the thing that I actually wanted:
It looks in the current folder, for a bunch of git repos, and fetches the
changes from the upstream
remote, and tells you about the differences.
Example of it in action:
<EMAIL_ADDRESS>fetching upstream for Javascript-Voronoi ...
1 file changed, 2 insertions(+), 2 deletions(-)
fetching upstream for dogecoin ...
fetching upstream for git-big-picture ...
fetching upstream for Serpent ...
2 files changed, 13 insertions(+), 11 deletions(-)
fetching upstream for rust ...
remote: Counting objects: 26, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 26 (delta 13), reused 4 (delta 4)
Unpacking objects: 100% (26/26), done.
From github.com:rust-lang/rust
0ae4b97..c12d3c0 auto -> upstream/auto
b1646cb..0ae4b97 master -> upstream/master
15 files changed, 385 insertions(+), 109 deletions(-)
fetching upstream for linux ...
9737 files changed, 513118 insertions(+), 268283 deletions(-)
fetching upstream for oh-my-zsh ...
309 files changed, 17219 insertions(+), 1084 deletions(-)
fetching upstream for idris-koans ...
6 files changed, 103 insertions(+), 11 deletions(-)
fetching upstream for joblint ...
26 files changed, 671 insertions(+), 325 deletions(-)
fetching upstream for python-quaec ...
1 file changed, 1 insertion(+), 1 deletion(-)
fetching upstream for Commando ...
5 files changed, 216 insertions(+), 98 deletions(-)
fetching upstream for scirate3 ...
321 files changed, 9141 insertions(+), 4436 deletions(-)
fetching upstream for Life ...
1 file changed, 10 insertions(+), 3 deletions(-)
Again, it’s completely unsurprising, and ridiculously simple. But importantly, it’s useful to me, and does exactly what I want! For the moment I’ve decided not to attempt to merge and push these changes automatically, but it’s clear that it would not be hard to add.
In the end, I’m very happy that I’ve actually finished this, and didn’t end up wasting weeks (or even a weekend!) on writing a big feature-full dashboard that I would probably stop using.
Maybe you find these tools useful, maybe you don’t! But at least I learned some Haskell and had some fun!


GLITTER
Reviewed by Harvey Karten Twentieth Century Fox/Columbia Pictures Director: Vondie Curtis-Hall Writer: Cheryl L. West (story), Kate Lanier Cast: Mariah Carey, Max Beesley, Valarie Pettiford, Terrence Howard, Ann Magnuson Screened at: AMC, NYC, 9/19/01
In 2001 you'll hear it told, This movie "Glitter" is not gold.
If the Bard is watching the screen from high above the clouds, he'd probably say "I told you so!" "Glitter," which yields more unintentional humor than any other movie since Paul Verhoeven's "Showgirls," is a sappy, soapy, songfest which, if the film were a debut for Mariah Carey might have ended her career before it ever started. Her large public would have been thwarted, missing the mellifluous tones of the person whom Billboard Magazine in 1999 called The Artist of the Decade. Cheryl L. West's story is subverted by some of scripter Kate Lanier's dialogue, a sample of which comes from Ms. Carey's character's introduction to a large audience at Madison Square Garden, "Do not take your friend for granted: you'll never know when you'll lose him." Featuring scenes borrowed from the naive romances of the 1950's, Vondie Curtis-Hall's film is a fictionalized homage to Mariah Carey, one of pop song's most celebrated vocalists of the nineties who was responsible for selling 140 million albums and singles, earning 84 gold, platinum and multi- platinum certifications.
Mariah Carey, who is physically as endowed as is her voice, fills the screen in virtually every scene in the role of Billie Frank, who at the age of eleven or so is abandoned by her mother Lillian (Valarie Pettiford), a traumatic event which causes Billie to be mistrustful of the kindness of strangers. Director Curtis-Hall introduces young Billie (Isabel Gomes) observing her mom's performance in a night club, shyly joining her in a song before a respectful but small audience. When her mother is fired and financial problems loom, Billie is turned over to a social services agency, later attracting the attention of a second-rate producer, Timothy Walker (Terrence Howard). Walker is pushed aside by popular DJ Julian Dice (Max Beesley), who persuades her to turn her production contract over to him. Little does Dice realize that his own coup will be topped by some major talent in the industry, forcing this handsome young man--who has become her lover--to surrender his find to the big guys.
Filmed by Geoffrey Simpson in Toronto and New York, with some stunning footage from (sigh) the World Trade Center, the chic Soho neighborhood and Madison Square Garden, "Glitter" is awash with Terence Blanchard's score, featuring so many songs (performed by talent including Mariah Carey's own "All my Life," "I Didn't Mean to Turn You On," and "Loverboy" plus an assortment of pop favorites by Stevie Wonder, The Strikers, Zapp, Whodini and others) that we in the audience are virtually MTV'd rather than able to enjoy whole pieces sung passionately by Ms. Carey. "Glitter" is not unlike George Cuckor's 1954 semimusical "A Star is Born,"about a doomed Hollywood star couple featuring Judy Garland as a performer on the way up while James Mason is on his way down. While Mariah Carey's songs simply cannot compel like the classics of Harold Arlen and Ira Gershwin and the script bears none of the quality of Moss Hart's for the Cuckor classic, the fatal flaw is the series of borrowed and banal interplays between Billie and her first real boyfriend, Dice. Watch especially for the poorly directed scene featuring Billie's walking out on Dice after the former has gone through a jealous tantrum and particularly for an unintentionally laughable juxtaposition of their getting together, as Dice and Billie, now living apart, seem to be communicating by ESP, the estranged couple separately composing a song as though they were in the same room.
Max Beesley is the one standout performer, working courageously with a fatuous script while Mariah Carey--who insists that her rendition of Billie Frank is only marginally autobiographical--acts throughout like a wide-eyed tourist who has just arrived from Kansas for a week in the Big Apple rather than a world-class singer who climaxes her career as the star performer at Madison Square Garden.
Rated PG-13. Running time: 98 minutes. (C) 2001 by Harvey Karten<EMAIL_ADDRESS>========== X-RAMR-ID: 29511 X-Language: en X-RT-ReviewID: 250594 X-RT-TitleID: 1108787 X-RT-SourceID: 570 X-RT-AuthorID: 1123
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


NOTE: This is a BETA version. It is currently only made available to select partners.
Unsettled Amounts
Get fine granularity details of the amounts owed to or by your client, broken down by Exchange, Currency,
Amount Types, or even Instruments.
These breakdowns are made accessible by the provided endpoints, each serving a particular purpose. To know
when amounts are owed, the Exchange endpoints may be most useful, whereas the Currency endpoints might be
more useful for a casual overview of the amounts and their value dates.
The amounts returned are returned with all available decimal points. For rendering these values in a UI, we
recommend referencing the
Reference Data Resource Currencies
NOTE: The Simulation Enviornment only has limited mock data.
Add the parameter "?env=live" to the url of this page, if you wish to use the live environment.
Endpoints
By Currency
/hist/v1/unsettledamounts
By Exchange:
/hist/v1/unsettledamounts/exchanges
/hist/v1/unsettledamounts/instruments
/hist/v1/unsettledamounts/exchanges/{ExchangeId}
Response:
Click button to launch function.
JS code:
Click button to show code.


SKY UX components are assembled from a small set of core design elements. These design elements act as the building blocks for the components and allow you to build user interfaces that incorporate SKY UX styles and patterns.


index
module docmodel.docstructure_parser
DocumentStructureParser
Document Structure Parser.
This module contains a minimal document structure parser. It is meant as a
temporary default and will be replaced by more sophisticated parsers and these
parsers will act more like the other tarsqi components.
The main goal of the parser is to add docelement tags to the tag repository on
the TarsqiDocument. Sometimes docelement tags already exist in the tag
repository (for example when reading a ttk file), in which case the parser does
nothing. Otherwise, the parser calls a simple method to recognize paragraphs and
creates a docelement Tag for each of them.
The docelements are used by Tarsqi components by looping over them and
processing the elements one by one.
class DocumentStructureParser
Inherits from: object
Simple document structure parser used as a default if no structure tags are
found in the tag repository of the TarsqiDocument.
Public Functions
parse(self, tarsqidoc)
Apply a default document structure parser to the TarsqiDocument if
there are no docelement tags in the tags repository. The parser uses
white lines to separate the paragraphs.
module functions
slurp(text, offset, test)
Starting at offset in text, find a substring where all characters pass
test. Return the begin and end position and the substring.
slurp_space(text, offset)
Starting at offset consume a string of space characters, then return the
begin and end position and the consumed string.
slurp_token(text, offset)
Starting at offset consume a string of non-space characters, then return
the begin and end position and the consumed string.
split_paragraphs(text)
Very simplistic way to split a paragraph into more than one paragraph,
simply by looking for an empty line.


One-Way Frequencies
| ParkType | Frequency | Percent | Cumulative Frequency |
Cumulative Percent |
|---|---|---|---|---|
| Monument | 63 | 46.67 | 63 | 46.67 |
| Park | 51 | 37.78 | 114 | 84.44 |
| Preserve | 8 | 5.93 | 122 | 90.37 |
| River | 3 | 2.22 | 125 | 92.59 |
| Seashore | 10 | 7.41 | 135 | 100.00 |
The FREQ Procedure
| ParkType | Frequency | Percent | Cumulative Frequency |
Cumulative Percent |
|---|---|---|---|---|
| Monument | 63 | 46.67 | 63 | 46.67 |
| Park | 51 | 37.78 | 114 | 84.44 |
| Preserve | 8 | 5.93 | 122 | 90.37 |
| River | 3 | 2.22 | 125 | 92.59 |
| Seashore | 10 | 7.41 | 135 | 100.00 |


As covered in sec. 1.2, ChromeVox is just another web application on Chrome OS — see fig. 2. It injects accessibility affordances for blind and low-vision users into all running web applications as part of its default behavior. In addition, ChromeVox exposes a light-weight API that allows web applications to customize the overall accessibility experience for a given application. This API allows us to experiment with new strategies for adding accessibility to web applications that stretch the limits of today’s web platform. In this section, we’ll illustrate this with a concrete example.
The word processor in Google Docs is designed to provide a desktop-like experience for WYSIWYGS text editing. A key design requirement was to enable collaboration across the web in all supported browser/OS combinations, and to enable reliable round-tripping of the document independent of browser differences in HTML serialization.
Google Docs achieves this by storing an in-memory model of the document content in JavaScript that is updated continuously in response to user input. As this model updates, the results are rendered to the visual display by appropriately updating the DOM, including drawing the visual caret and appropriately styling the presentation to match the user’s intent. Notice that in this implementation, the content being edited is not directly serialized in the HTML DOM; instead, the implementation uses an underlying Model, View, Controller (MVC) abstraction where the document model as encapsulated in the internal JavaScript data structures are continuously reflected in the view layer represented by the HTML DOM. The controller, which handles user input is implemented as an off-screen text input field that the user never sees; all aspects of user interaction are managed by the web application itself, rather than relying on the browser.
The MVC design pattern adopted by Google Docs enables users on different browser/OS combinations to collaborate effectively without differences in HTML serialization among browsers affecting the ability to effectively round-trip content. Thus, this word-processor as designed has a number of advantages over more traditional approaches of using HTML’s content-editable feature. However, it presents an interesting challenge to traditional approaches to access-enabling web applications that rely solely on the document markup containing the needed accessibility affordances. To illustrate, access technologies like screen readers watch for the insertion caret when producing spoken feedback within a word processor. However, in the described implementation, the insertion caret is drawn to the screen by the web application along with the stylized visual presentation of the content being authored; the controller that receives user input is itself never rendered to the screen.
To help provide better accessibility in web applications that extend the browser platform, ChromeVox exposes a light-weight API that enables Web developers affect the following aspects of the overall accessibility experience:
The Google Docs product uses this API to implement an accessible word processor in conjunction with ChromeVox. The same techniques are used by Google Spreadsheets; this provides an end-user accessibility experience that closely matches and will eventually surpass accessibility that users have come to expect in desktop applications.