Copyright © 2006 by Ikuo Uchiyama
CGAT is a Comparative Genome Analysis Tool that was developed for detailed comparison of closely related bacterial-sized genomes, mainly for analysis of complex evolutionary changes between two related genomes. CGAT visualizes precomputed pairwise genome alignments on both dotplot and alignment viewers. Users can put several information on this alignment, such as existence of tandem repeats or interspersed repetitive sequences and changes in codon usage bias, to facilitate interpretation of the observed genomic changes. Besides visualization functionalities, CGAT also provides a general framework to process genome-scale alignments using various existent alignment programs such as BLAST/MegaBlast, FASTA, MUMmer, Blat and BlastZ.
Basically, CGAT employs a client-server architecture, which consists of AlignmentViewer (client; a Java application) and DataServer (a set of Perl scripts). The DataServer consists of data construction scripts and CGI scripts and AlignmentViewer obtains the data from the server thorough the HTTP protocol. AlignmentViewer can also obtain data from the local file system when the server and client are installed on the same machine.
AlignmentViewer is written in Java and should run on any machine supporting Java (JDK 1.4 or higher).
DataServer is a set of Perl scripts and assumes Unix environment with Perl installed (version 5.8 or higher). It also assumes that the perl executable is installed in the /usr/bin directory; please make a symbolic link if it is located in a different directory. The LWP (libwww-perl) module, which is downloadable from the CPAN site, is also required when you want to download data from the MBGD server. DataServer also needs an HTTPD server for communicating with the client program. In this manual, we assume that Apache HTTPD version 2.0 or more is installed on your server machine.
CGAT uses several programs for calculating alignments of two sequences and identifying several feature segments on individual sequences. Currently the following programs are supported:
Table 1. Alignment programs currently supported by CGAT
| program | URL |
|---|---|
| Blast/MegaBlast | http://www.ncbi.nlm.nih.gov/BLAST/ |
| Fasta | http://fasta.bioch.virginia.edu/ |
| MUMmer | http://mummer.sourceforge.net/ |
| Blat/WABA | http://www.cse.ucsc.edu/~kent |
| BlastZ | http://www.bx.psu.edu/miller_lab/ |
| PatternHunter | http://www.bioinformaticssolutions.com/products/ph/ |
| CHAOS | http://lagan.stanford.edu/lagan_web/index.shtml |
| GAME | http://cancer.informatics.indiana.edu/game/ |
| SSAHA | http://www.sanger.ac.uk/Software/analysis/SSAHA/ |
You should install one or more of the above programs on the server machine before installing the CGAT DataServer. Please refer to the above URL for installing individual programs. Basically, the DataServer assumes at least the NCBI Blast/MegaBlast package is installed.
The latest version of CGAT is available at http://mbgd.genome.ad.jp/CGAT/. You can download and install only the client program (AlignmentViewer.jar) or the full version including both the client and server programs (CGAT.tar) depending on what you need.
The client program ( AlignmentViewer.jar). You can download and install only the client program if you intend to connect to the existing servers that you have already set up or to the default server (http://mbgd.genome.ad.jp/CGAT/) for trial.
The client program as a Mac OSX application ( AlignmentViewer.app). We recommend Mac OSX users to download this because it has been set up with increased memory allocation that solves the problem described in the next section.
The full version of CGAT ( CGAT.tgz), including both the client and server programs. You must install this package if you intend to analyze your own data locally.
Basically, you need not particular operation after having downloaded the program file (AlignmentViewer.jar) — double click the icon (OSX or Windows) or type the java command (Unix) to invoke the program. See the chapter " The CGAT AlignmentViewer program "
However, in the default setting of the Java virtual machine (JVM), you will be likely to encounter a memory allocation error especially when aligning long sequences dynamically. To avoid this problem, you need to increase the size of the memory allocation pool for the JVM.
Windows: Download the AlignmentViewer.jar file and do the following (see Figure 1).
Create a shortcut of the AlignmentViewer.jar file (Right-click on the jar file ⇒ Create Shortcut).
Open the properties window of the shortcut (Right-click on the shortcut ⇒ Properties).
Open the Shortcut tab and enter the java command in the Target: box as follows: [ java -Xmx512m -jar "C:\Documents and Settings\..." ], where "C:\Documents and Settings\..." is the original file location. This might be different in you situation, but do not modify the original name in anyway. Then, press "OK".
Mac OSX: Download and use the OSX application version of AlignmentViewer (AlignmentViewer.app), instead of the AlignmentViewer.jar file.
Linux/Unix: Download the AlignmentViewer.jar file and type java -Xmx512m -jar AlignmentViewer.jar to invoke the program.
Copy the downloaded archive CGAT.tgz into an appropriate directory and extract files by tar command, which generates a directory named CGAT. Enter this directory and invoke a configuration script SetUp.pl.
tar cvfz CGAT.tgz cd CGAT SetUp.pl |
# in csh or tcsh source etc/cgat.csh # in sh or bash . etc/cgat.sh |
The set up script tries to detect alignment programs available on the server machine and installs detected programs in the $CGAT_HOME/build/align directory. You might want to move some commands from the $CGAT_HOME/build/align.in directory or to remove some unnecessary commands manually.
Similarly, you might want to install manually some optional commands for collecting feature segments from the $CGAT_HOME/build/segment.opt directory. Note that in this case you must always set up by yourself (if you wanted), since currently the set up script does not try to check the availability of these commands automatically. Currently, the following commands are available:
Glimmer: Microbial gene-finding system available at http://www.cbcb.umd.edu/software/glimmer/. Currently, ver.2 is assumed by default, but you can use ver.3 if you manually edit the commands/Glimmer.pl file. Before that, of course, you must correctly set up the glimmer program itself.
ISfind: Searching an insertion sequence (IS) database by the BLAST program. The IS database should be a FASTA formatted sequence file with each comment line containing IS family name as ">${ISname} Fam:${familyname}", and the file should be installed as $CGAT_HOME/database/isdb . See the IS Finder database for information about IS families. One can use the GIB-IS database available at DDBJ as a downloadable IS database. Download the table file (IS-table-text.txt) and run the following command:
$CGAT_HOME/build/bin/conv_GIB_IS.pl -nr IS-table-text.txt > $CGAT_HOME/database/isdb |
On Windows or Mac OSX, double clicking on the "AlignmentViewer" icon invokes the program. On Unix systems, type the following command on the command line:
java -jar AlignmentViewer.jar |
However, when invoking with the above command, you will be likely to encounter a memory allocation error especially when you want to see an alignment of long sequences generated by dynamical calculation. To avoid this, we recommend you to increase the size of the memory allocation pool for the Java virtual machine with the -Xmx option.
java -Xmx512m -jar AlignmentViewer.jar |
After running the program, first you must load data by choosing File ⇒ Load from the menu.
Choose the server from which data are downloaded. By default, only the default CGAT server (running on the MBGD server) is registered. You can add more servers to this list in the Locations section of the Properties panel (File ⇒ Properties), if you or your colleagues have been setup an original new server. See the chapter " The CGAT DataServer package " for server setup and the " Configuring AlignmentViewer "section for properties setup.
Choose the alignment data to be downloaded specified by the combination of organism names and a program name. Note that choosing the server URL above reset the list of available alignment data. If you have setup the data on the local file system that the AlignmentViewer program can directly accessed, and have correctly set the CGAT_HOME variable in the Properties panel, you can also choose the data available on the local machine. These data are listed without the "(Server)" indication.
Choose the gene attribute data for coloring genes.
Choose the feature segment data to be shown on the additional annotation tracks (see the section "Alignment display panel "). By default, maximally three types of segment data can be loaded at once, but the maximum number can be increased in the Properties panel.
The main window of AlignmentViewer consists of four parts: a menu bar, a control panel, an alignment display panel, and a dotplot display panel. Both the alignment and dotplot displays show precomputed alignments. Users can change the current view on each display by pressing a scrolling or zooming button on the control panel. These operations update both the alignment and dotplot displays in a coherent manner.
In AlignmentViewer, one of the compared sequences is considered as the reference sequence and the other is considered as the target sequence. In the alignment display panel, the reference and the target sequences are displayed on the upper and lower tracks, respectively, and in the dotplot display panel, the reference and the target sequences correspond to the x- and y-axes, respectively. These sequences can be exchanged by View ⇒ Exchange Reference Genome.
The control panel contains several buttons for controlling the current view of both the alignment and dotplot displays.
Move the current position to the left or right along the current alignment.
Zoom-in or -out the current view.
Toggle the alignment color mode between the "Best Hit" mode and the "Identity" mode.
Best Hit: white, orthologs; cyan, duplicated on the sequence 1; green, duplicated on the sequence 2; and blue, paralogs (by default).
Identity: red, 50%; yellow, 85%; and green, 100% (by default).
Toggle the alignment mode between the "Regionwise" alignment mode and the "Reference-target" alignment mode. See the section " Alignment display panel ".
Exchange the reference sequence and the target sequence.
Toggle the status of the dotplot display panel between displayed and hidden.
Zoom-in or -out the dotplot display.
Specify the axis of the dotplot to be zoomed individually.
Toggle the background color of the alignment and dotplot displays between the dark color (black by default) and the light color (white by default).
Show an annotation table for information on gene or feature segment.
The alignment display panel contains three basic tracks: the central tracks (alignment track) shows a graphical representation of the alignments, and the upper and lower tracks (gene annotation tracks) show the gene annotation of the upper and lower genomes, respectively. More annotation tracks can be added to display the location of several feature segments.
In addition, the "location fields" and the "strand switches" are on the left side of the tracks. The location field indicates the central coordinate of the current view, and strand switch indicates the strand of each genome currently selected. Users can jump to the desired location by entering a coordinate value or a gene identifier (e.g. HP0812) in the location field, and can toggle the strand direction by pressing the strand switch.
Some notes: 1) You must always enter the location of the reference genome if you want to see the orthologous alignment around the specified locus. If you want to specify the location in the current target genome, you should exchanges the reference and the target genomes before entering the position; 2) If you invert the reference genome by the strand switch button, the direction of the subsequent movement is also inverted. This means that when you press the 'move left' button, the cursor in the dotplot display will move right, since the coordinate of the dotplot display is not changed by this operation.
In CGAT, there are two modes in the alignment display: "regionwise" alignment mode and "reference-target" alignment mode. In the regionwise alignment mode, all alignments included in the current view are displayed. Each alignment is represented as a trapezoid formed by connecting the corresponding endpoints of the aligned region. On the other hand, in the reference-target alignment mode, every orthologous regions of the target sequence is mappend as a fragment onto the reference sequence.
The alignment track displays precomputed alignments schematically. Using the zooming buttons in the control panel, users can change the scale from the entire genome level to the single nucleotide level. In the nucleotide sequence alignment, mismatched site is colored red and gapped site is colored green (by default).
In the regionwise alignment mode, left click on one of the alignment regions (tetragons) sets the center of the selected alignment adjusted to the center of the display.
By right click on the alignment track, a pop-up menu appears including the following items:
View Re-Alignment: Re-calculate alignment between the sequences within the current displayed region. This item appears only when the current displayed region is smaller than the specified length (Size of Realignment). See the "Configuring AlignmentViewer" section.
View Alignment: Display the precomputed alignment under the clicked position.
Ident = ## %: No action. The item is displayed only for showing the percent identity of the precomputed alignment under the clicked position.
Color Legend: Display the color legend for the current alignment display.
The annotation track displays several types of feature segments identified in each genome.
By left click on one of the feature segments in the annotation track, a pop-up menu appears:
SegmentName: Open the web browser to access the web site, if an appropriate URL is defined on the server. Otherwise, no action is taken.
View Sequence: ## - ##: Show the nucleotide sequence of the feature segment.
Clicked Pos: ## : No action. The item is displayed only for showing the clicked position.
Redraw (Set Center=##) : Move the clicked position to the center of the display window.
Search Alignment ## - ## : Search the set of precomputed alignments for those covering the region around the clicked position.
Color Legend: Display the color legend for the current annotation display.
In the dotplot display panel, all alignments are plotted onto the 2-dimensional space with the horizontal (X) and the vertical (Y) axes representing the reference and the target sequences, respectively. In this plot, the current scope, i.e. the region displayed in the alignment display, is also shown as a rectangular region. Users can move the current scope by clicking on any points in the plot to move.
In the dotplot display, independent scaling of the x-axis and y-axis is possible. This feature is useful in visualizing the distribution of homologous regions of a specific segment on one genome against the entirety of the other genome. In the following example, dotplot with expanded y-axis scale clarifies the presence of inverted duplication at both ends of the rearranged segment on the reference genome (x-axis).
Load data from the specified server or the local file system. See the "Starting AlignmentViewer " section.
Mark a specified set of genes.
An input form is opened for users to enter a list of gene names to be marked. Gene names can be entered individually or be read from a file. By pressing the Search button, gene names are registered. Locations of the registered genes are indicated on each axis of the dotplot display, and a new table window is opened containing the information of the these genes.
Additional calls of this function will add genes to the existing list. To remove genes from the list, enter the gene names to be removed and press Clear. To clear the entire list, press All Clear.
Filtering out the alignments that do not satisfy the specified conditions. Alignments are filtered from both the alignment and dotplot displays. A filter can be applied to one of the following fields:
Identity: percentage identity; numeric.
Score: similarity score; numeric.
Best Hit Status: one of the following: 3, orthologs (bidirectional best hits, BBH); 2, duplicated only in the sequence-2; 1, duplicated only in the sequence-1; 0, paralogs.
Once filtered, a '*' mark is displayed on the left side of the alignment track (see Figure 11C). Additional calls will add filters to the existing one. For example, users can specify conditions such as "Best Hit Status is BBH and Identity ≥ 90%" by two successive calls of this function. To reset the filters, press the Reset Alignment Filters button.
Filtering out the genes or feature segments that do not satisfy the specified conditions. A filter can be applied to any field of any kind of segment that is currently loaded.
Kinds of conditions to be applied are different depending on the types of the fields (numeric and string). The following conditions are defined:
Available conditions are: Between (a ≤ x ≤ b), Except Between(x < a or b < x), Less Than (x < a), Less Equal (x ≤ a), Equal (x = a), Greater Equal (x ≥ a), and Greater Than (x > a), where a and/or b are values to be specified. To specify Between or Except Between, two values should be separated by a comma (e.g. "80,90").
Available conditions are Regex (regular expression) and Equal (exact match).
Once filtered, a '*' mark is displayed on the left side of the annotation track. Additional calls will add filters to the existing one. To reset the filter on the specified segment, choose the segment type and press the Reset This Filter button. To reset all filters, press the Reset All Filters button.
Search each genome for specific segments or sets of segments dynamically, by calling a CGI script running on the server. Results will be displayed in the additional annotation tracks, or in the outermost pair of tracks (overwriting the existing data) if the maximum number of segment tracks have already been used.
Currently, the following programs are available:
Blast: BLAST similarity search for a nucleotide [blastn(direct) / tblastx(translation)] or a protein [tblastn] query sequence.
PatSearch: Regular expression pattern search. See the document of the Java regex library.
DirRep: Direct repeat search.
SimpleRep: Simple repeat (or short tandem repeat) search.
Show table of genes or specified feature segment on the specified genome. In the table, each row contains species name, the beginning position, the ending position, strand direction, assigned color, and the name of the segment. Additional fields are added, if any, depending on the segment type. By clicking a row of this table, the current scope is reset such that the specified gene or segment is centered.
Many properties of AlignmentViewer can be configured through property parameters. These parameters can be changed on the properties window (File ⇒ Properties). Configured properties are saved in the user home directory.
In the properties window, the properties are categorized into the following four sections.
Locations: Locations of data to be loaded. See "Load data " for loading data.
CGAT_HOME: The server home directory containing the database. You can load data from the local file system, only when the CGAT database is installed in a directory accessible from the AlignmentViewer.
Server URL: Addresses of the CGAT servers. Multiple servers can be specified. You can choose which server to use when you load the data.
Proxy URL: Specify if your organization uses a proxy server. Please ask your network administrator.
Color: Color preferences. You can set two different sets of colors for the dark and light background color modes.
Background: The background color of both the alignment track and the dotplot display.
Viewing Frame: The color of the frame indicating the current scope in the dotplot display.
Match/Mismatch/Gap: Colors for displaying nucleotide sequence alignments in the annotation track.
Identity: Colors for drawing alignment regions according to the percentage identities (the identity color mode). Colors of the three points (highest, middle, and lowest percentages) can be specified, and the others are interpolated between these colors.
Gene Attribute: Colors for drawing genes in the annotation tracks using gene attribute values. Colors of the highest and lowest values can be specified, and the remaining values are interpolated between them.
Panel: Hight of the tracks and the maximum number of tracks.
Maximum # of Segment Tracks: Maximum number of feature segments to be loaded. Possibly, the height of the tracks should also be modified (lowered) to display all the information within the screen when you want to increase the number of segment tracks.
Height of Alignment/Gene/Segment Area: Hight of the tracks in the alignment display can be set individually for the alignment track, the gene annotation tracks and the feature segment tracks.
Alignment: Alignment parameters.
Match/Mismatch/Open Gap/Extension Gap: The scoring system for dynamically calculating alignments in the AlignmentViewer program.
Size of Realignment: Maximum length of the displayed region (scope) within which the re-alignment of the sequences is allowed by right click on the alignment track.
The CGAT DataServer package is a collection of data construction scripts and CGI scripts. The data construction scripts run several programs to generate comparison data to be visualized by the AlignmentViewer program. AlignmentViewer can obtain data through the Internet using the CGI interface implemented in the server package. Alternatively, AlignmentViewer can also obtain data from the $CGAT_HOME directory when the server and client are installed on the same machine.
Data generated by CGAT DataServer can be classified into the following three classes:
A collection of locally aligned segment pairs between two genomes, which are displayed on both alignment and dotplot display panel in AlignmentViewer.
A collection of feature segments in each genome, which can be displayed on the feature segment tracks in AlignmentViewer.
A value associated with each gene, which can be used to assign color to that gene in AlignmentViewer.
Table 1. List of directories on the $CGAT_HOME directory
| Directory | Contents |
|---|---|
| database | The current release of the database, which is accessed by the CGAT CGI scripts |
| database.work | Space for constructing the new database release |
| work | Workspace for database construction where many intermediate files are generated. |
| perllib | Perl libraries. |
| etc | Configuration tables etc. |
| build | Scripts for constructing the database |
| commands | Commands for identifying several feature segments on each genome. |
| htdocs | HTML documents and CGI scripts |
| client | Java source code of the client program (AlignmentViewer) |
Table 2. List of directories on the database directory
| Directory | Contents |
|---|---|
| genomes | Genomic sequences |
| genes | Gene information, including position table (tab subdirectory), nucleotide sequences (nt subdirectory), and amino acid sequences (aa subdirectory) |
| alignment | Collection of genome alignments calculated by several programs |
| segments | Collection of feature segments calculated by several programs |
| geneattr | Collection of gene attribute values calculated by several programs |
Essentially, the data construction process consists of the following steps:
Prepare your genomic sequence data. If your sequences are already in the MBGD database, you can skip this step, because the procedure will automatically try to download missing data from MBGD.
Edit $CGAT_HOME/etc/speclist to specify a set of species to be analyzed and a set of programs to be executed for each species set.
Run $CGAT_HOME/build/BuildAll.pl. This script executes all procedures for building the database according to the $CGAT_HOME/etc/speclist file, and eventually constructs data on the $CGAT_HOME/database.work directory.
Run $CGAT_HOME/build/Release.pl to release the data from the $CGAT_HOME/database.work directory to the $CGAT_HOME/database directory.
Before running programs, you must prepare genome sequences data. There are three possible ways.
If your sequences are already in the MBGD database, the simplest way to prepare data is to remember the abbreviated names of those genomes in the MBGD database (e.g. 'eco' for Escherichi coli K12). and use these names in the configuration table described in the next section. The build procedure automatically try to download missing data from MBGD. Note that the sequence name specified here is used throughout the system (hereafter we call it SPNAME).
Alternatively, if you have genomic data in GenBank format, you can use the $CGAT_HOME/build/getDataFromGenBank.pl script to convert it to the CGAT database. The syntax of the command is
getDataFromGenBank.pl GBK_FILE SPNAME
For example:getDataFromGenBank.pl NC00913.gbk eco |
Otherwise, you must prepare data by yourself. The data you should prepare are as follows:
Choose an appropriate unique name (SPNAME) that is composed of alphanumeric characters.
$CGAT_HOME/database/genomes/SPNAME: a genomics sequence in fasta format.
$CGAT_HOME/database/genes/aa/SPNAME: translated sequences of genes in fasta format (optional; if you want to calculate attribute values associated with protein sequences).
$CGAT_HOME/database/genes/nt/SPNAME: nucleotide sequences of genes in fasta format (optional; if you want to calculate attribute values associated with nucleotide sequences).
$CGAT_HOME/database/genes/tab/SPNAME: a tab-delimited table of genes containing the following information: beginning position, ending position, direction (1/-1), color code (= function category code; optional), the name of the gene, and the name of the product (optional). The beginning position must be smaller than the ending position even for the gene on the reverse chain. The file must begin with a header line containing a tab-delimited list of field names as follows,
#from to dir color name product 190 255 1 1 B0001 thr operon leader peptide 337 2799 1 1 B0002 bifunctional aspartokinase I/homeserine dehydrogenase I 2801 3733 1 1 B0003 homoserine kinase 3734 5020 1 1 B0004 threonine synthase 5234 5530 1 100 B0005 hypothetical protein |
Next, you must prepare $CGAT_HOME/etc/speclist file, which contains information required for the database building procedure. The following information should be specified in this file:
A set of genomic sequences to be compared. If more than two species are specified, all-against-all pairwise comparison will be performed. Note that currently CGAT can handle only pairwise comparisons.
A set of programs to be executed for each sequence set.
The speclist file consists of macro definition and dataset definition sections, where macro definition must precede the dataset definition. Syntax of the definition of macro variable is as follows:
SET varname = value |
The dataset definition section is a tab-delimited table, containing the following fields: SPNAME_LIST, PROGRAM_LIST,FLAG_UPDATE, and FLAG_PUBLIC. SPNAME_LIST is a comma-delimited list specifying a set of species to be compared. PROGRAM_LIST is a space-delimited list specifying script files to be executed for each species set. The file names are relative to the $CGAT_HOME/build directory and the wildcard characters such as '*' can be used. For example, align/* specifies all (executable) files under the $CGAT_HOME/build/align directory. FLAG_UPDATE and FLAG_PUBLIC are flags specifying the data should be updated and the data should be open to the public (through the CGI script), respectively. The value should be 1 (yes) or 0 (no). Default value is 1.
The following is an example of the speclist file. The file directs the build script to compare genome sequences "hpy" and "hpj" by executing all programs for identifying feature segments in the $CGAT_HOME/build/segment directory, followed by all programs for calculating gene attribute values in the $CGAT_HOME/build/geneattr directory, followed by all programs for calculating alignment between the two genomes n the $CGAT_HOME/build/align directory.
#################### # macro definition #################### SET AlignAll = align/* SET SegmentAll = segment/* geneattr/* #################### # dataset definition #################### hpy,hpj $SegmentAll $AlignAll |
Run BuildAll.pl under the $CGAT_HOME/build directory to execute building procedures. This script creates $CGAT_HOME/work directory if not exists, and move to this directory, and then executes programs that have been specified in the $CGAT_HOME/etc/speclist file in the previous section.
BuildAll.pl |
AlignmentViewer can directly access the resulting data file locally when the environmental variable $CGAT_HOME is correctly set. Therefore you can skip this section if you intend to use AlignmentViewer only on the machine on which the database was constructed. On the other hand, if you want to allow access to the database from various machines through the Internet, you must set up a web server on the server machine.
If there is already a HTTP server running on the server, the simplest way to add the CGAT service to the existing server is to create a symbolic link to $CGAT_HOME/htdocs/CGAT on a web site directory. For example, if you have a public_html directory on your home directory as your own homepage, you can add CGAT service to this page by creating the above symbolic link on this directory:
ln -s $CGAT_HOME/htdocs/CGAT ~/public_html |
Next you must edit the httpd.conf file to modify the server setting. The location of the httpd.conf file is system dependent; on Mac OSX, user specific configuration can be described in a separate file, /private/etc/apache2/users/USERNAME.conf (for 10.5) or /etc/httpd/users/USERNAME.conf (for 10.4), where USERNAME should be replaced with your username. In any way, this step usually requires administrator privilege. Please ask an administrator of the machine if you do not have the privilege.
The following is a configuration required for the above example where the server is located on the public_html directory:
<Directory /PATH_TO_YOUR_HOME_DIRECTORY/public_html> Options ExecCGI FollowSymLinks AddHandler cgi-script .cgi SetEnv CGAT_HOME /PATH_TO_CGAT_HOME SetEnv PERLLIB /PATH_TO_CGAT_HOME/perllib/ </Directory> |
Possibly, you may need to load some additional Apache modules. For example, the above setting contains the SetEnv directive which requires the mod_env module. If this module is not loaded in the default setting, you must add the following line to the httpd.conf file.
LoadModule env_module MODULE_PATH/mod_env.so |
Please remember that you must restart the HTTP server to reflect the change after you modify the httpd.conf file. Typically, this can be done by the command apachectl restart . Mac OSX users can turn on/off the HTTP server by turning on/off, respectively, the "Personal Web Sharing" service in the Sharing pane opened through Apple menu ⇒ System preference ⇒ Sharing.


| | |
- CreateTables(dbfilename='db/supercooldb.db', areyousure='no')
- Create the database tables
NOTE: will delete old database!!!!
input:
dbfilename - name of the database file to create
areyousure - must be 'yes' in order to create the database
output:
db - the database structure
- addcuration(db, data, sequences, curtype, curations, submittername='NA', description='', method='', primerid=1, submitteragent='HeatSequer')
- Add a new manual curation to the database
input:
db : scdbstruct
from dbstart()
data : int or dict of (Type:Value)
if int - the value of DataID from Data table, otherwise a list of (Type,Value) tuples to add to Data table
sequences : list of ACGT
the sequences to curate
curtype : str
the curation type (COMMON,DIFFEXP,CONTAM,HIGHFREQ,PATHOGEN)
curations : list of Type,Value
The curations to add to the CurationList table (Type,Value)
submittername : str
Name of the submitter (first,last) or NA
description : str
text description of the curation entry (i.e. "lower in whole wheat pita bread")
method : str
text description of how the curation was detected - only if needed
primerid : int
the PrimerID from Primers table of the sequences (usually 1 - the V4 515F,806R)
submitteragent : str
the program submitting the curation
output:
curationid : int
the CurationID (in Curations table) of the new curation, or 0 if not added
data : int
the DataID from Data table
- adddata(db, data, studyid=[])
- add new data entries (for a new study)
input:
db : scdbstruct
from dbstart()
data : list of tuples (Type:Value)
a list of tuples of (Type,Value) to add to Data table (i.e. ("PUBMEDID","322455") etc)
studyid : list of int
the ids in which this study appears (from finddataid)
output:
suid : int
the value of DataID for the new study (from Data table)
- addontology(scdb, ontology, ontoprefix='', namelist={})
- add an obo ontology file to scdb
input:
scdb : scdbstruct
from scdbstart()
ontology : str
name of the obo ontology file to add
ontoprefix : str
the ontology prefix (i.e. ENVO) to show at end of each string, or '' for autodetect (default)
namelist : dict of ids
if non-empty, keep only items with ids from namelist (get namelist from ontologysubtreeids() )
output:
scdb :scdbstruct
with the new ontology items added to scdb.ontology dict
- createontologytree(db, ontologies=[], outname='db/ontologygraph.pickle')
- load the ontology tree graphs into the scdb and store them in a pickle dict
input:
db : from scdbstart()
ontologies : list of str
list of obo ontologies to use or empty to use the default files (db.ontologyfiles)
outname : str
name of the output pickle file
output:
db - scdbstruct
with the ontodict field added
- dbconnect(scdb, dbname='db/supercooldb.db')
- connect to the database
input:
scdb : scdbstruct
from scdbstart()
dbname - the name of the database to connect to
- dbstart(dbname='db/supercooldb.db')
- start the database structure and connect to database
input:
dbname : string
the name of the database to connect to
output:
db : dbstruct
the database variable
- delcuration(db, curid)
- delete a curation and the corresponding curationlist from the database
input:
db : : from startdb()
curid : int
the curationid
output:
deleted : bool
True if deleted, False if not found/not deleted
- finddataid(db, datamd5='', mapmd5='')
- find the data id for the data/map md5 (which are calculated on load)
note the md5s don't change following filtering/normalization/etc... - only the original data
input:
scdb : from startdb()
datamd5 : str
from Experiment.datamd5
mapmd5 : str
from Experiment.mapmd5
output:
outlist:
a list of ints of matching dataID indices (or empty if no match)
- getcurationontologies(db, sequence)
- get the curation for items and all upstream (ontology-wise) items for a given sequence
input:
db : from scdbstart()
sequence : str (ACGT)
output:
onto : dict of key=str and value dict of key=str and value=int
a dictionary of ['up','down','contaminant'] of dict of ontology item and number of times total we see it
- getcurationstrings(db, sequence)
- get a nice string summary of a curation
input:
db : from scdbstart()
sequence : str (ACGT)
output:
shortdesc : list of str
a short summary of the curations (1 item per curation)
- getdatainfo(db, dataid)
- get the information about a given study dataid
input:
db : from dbstart()
dataid : int
The dataid on the study (DataID field)
output:
info : list of (str,str,str)
list of tuples for each entry in the study:
type,value,descstring about dataid
empty if dataid not found
- getontoparents(db, term)
- get all the parent terms (including original term) for a given ontology term.
look in all ontology trees in db.ontodict
input:
db : from scdbstart()
term : str
the ontology term (lower case)
output:
terms : list of str
all the parent terms of this item
- getseq(db, seq, primerid=1, insert=False)
- get the sequence id for the sequence seq in the database.
if it doesn't exist - create it and return the new id
input:
db : scdbstruct
from dbstart()
seq : sequence (ACGT)
the sequence to find/add
primerid : int
the PrimerID from Primers table of the sequenced region
insert : bool
True to insert the sequence if not in table, False to return 0 and not insert
output:
seqid : int
the SeqID from the Sequences table for the sequence
- getseqcurationids(db, seqid)
- get the curation ids for the sequence with the id seqid
input:
db : from sbdtart()
seqid : int
the sequence identifier (from getseq)
output:
curids : list of int
ids of all the curations for this sequence
- getseqcurations(db, sequence)
- Get the manual curations for a sequence
input:
db : from scdbstart()
sequence : str (ACGT)
output:
curs : list of list of (curation dict,list of [Type,Value] of curation details)
- getstudyannotations(db, studyid)
- get the list of annotations for study studyid
input:
db : from dbstart()
studyid : int
The dataid of the study
output:
info: list of str
the list of curations for this study (1 item per curation)
- loaddbonto(db, ontofile='db/ontology.pickle', ontofromidfile='db/ontologyfromid.pickle')
- load the pickled ontologies to the scdb structure
input:
db : from scdbstart
ontofile : str
name of the ontologies term file (from saveontologies)
ontofromidfile : str
name of the ontologies reverse dict file (from saveontologies)
output:
db : scdbstruct
with the loaded ontologies fields
- loadontologies(scdb, pickleit=True, ontologies=[])
- load the ontologies into the scdb class
input:
scdb : scdbstruct
from scdbstart()
pickleit : bool
True (default) to pickle the loaded ontologies to default location, False to not pickle
ontologylist : list of str
names of the obo ontology files to load or empty to use the default files (from scdb.ontologyfiles)
- loadontotrees(db, ontopickle='db/ontologygraph.pickle')
- load the ontology dict pickle file
input:
db : from scdbstart()
ontopickle : str
the pickled ontology dict filename (from createontologytree())
output:
db : scdbstruct
with the ontology dict in ontodict
- saveontologies(scdb, ontofile='/Users/amnon/Python/git/heatsequer/db/ontology.pickle', ontofromidfile='/Users/amnon/Python/git/heatsequer/db/ontologyfromid.pickle')
- save the ontologies to pickle files.
use after loadontologies()
- select_column_and_value(cur, sql, parameters=())
- get a dict with field as key, value as values for an sql query
|


Ajit Kumar
Home
About Me
Publications
CV
© 2019. All rights reserved.

Minimal SymPy Tutorial


Shareable link for reproducing the current memory contents (opens in a new window/tab)
CPU
PC
IR
Decoded
FETCH
DECODE
EXECUTE
Wait time:
Memory
Inspector
address
hex
binary
signed
float
Copyright © 2013-2017 Joel Edström. Licensed under the MIT License.


This inspection warns if wildcard name is same as section name. It isn't an error but could be confusing in some cases.
E.g. 'output' in 'shell' section is list of paths from 'output:' section, use 'wildcard.output' if you need access to
the wildcard. On the other hand 'output' in 'params' section is a wildcard name. Also, wildcard name shouldn't
contain dot character.


Hello, I was trying to make a PvP Fighter, Weapons Master and maybe one more Class. I was thinking of the starting feats to be Blooded and Thug to add to the initative bonuses(Eventually getting imp Intiative and Supioior). Also I was thinking of makeing him real high in Taunt Skill and getting Skill focus and epic skill focus in it. My choice of Weapon would a Greatsword. I was also thinking of taking Monk lvls so He could wear cloth armor, gain Tumble the Monk speed and get to lvl 6 for Imp KD. Now would going three more Monk lvls to Nine be worth it, to get improved evasion? I also wanted him to have a high Attack Bonus and good AC I know that will be hard with what I'm looking for. So if anyone has Idea's, improvement's and suggestion's I would greatly appriciate it. Thank you.
hm..well as far as 6 monk for IKD, and clothes goes; id rather take more ftr levels, since for weapon master you need 13 int, you can pick up a few feats as well as IKD. For imp evasion, id go 10 rogue over 9 monk, sinceyou get sneaks, imp evasion, as well as UMD with tumble.
The background story for the char that I had in mind wouldn't be a rouge, and on the sever I play UMD dosent fit the world, i could get UMD but wouldn't be right. Thanks for your imput though, good looking out.


{% extends 'base.html' %} {% block title %}Home{% endblock title %} {% block body %}
Online Library Project is about Providing more free boks to students, Teachers,
People in search of ebooks,etc.
We decided to provide as much as free books we can.
Members can add books if they want.


Hey Sis, my name is Kendall Roberts and I am the creator of Humming Your Truth. I am an Online Personal Coach, you're probably wondering what does a personal coach do? Think of me as your personal thought partner and hype woman. I will support you in exploring and developing tools to improve your quality of life. My goal is to support Black Women in recognizing the importance of self-preservation through supporting them with developing healthy coping skills, implementing strong self-care habits, and finding their purpose.
Ancestral Wellness Co. , is a holistic wellness company created to meet the diverse needs of women. Providing doula services to support mothers in developing tools and techniques to maintain their physical and mental wellness through out your birthing journey. As well as offering wellness consultations and herbal teas to support you in maintaining and improving your overall wellness. Here at Ancestral Wellness Co. we help you to tap into your deepest well of Ancestral knoweledge that you have as a woman.


The incident rate is a measure of frequency with which some event such as a disease or accident occurs over a specified time period. Incident rate or "incidence" is a numerically defined as the number of new cases of disease within a time period as a proportion of the number of people at risk for the disease.


Click the crystals to increase your number, the goal is to reach the target number without going over.
If you hit the number you win.


Hi, I'm Alyssa Page
I am a mathematics student turned logistics professional turned full-stack developer. I care about building beautiful, useful products and better relationships.
I'm a Tulsa, Oklahoma to San Diego transplant with a mathematics degree from beautiful CSU Long Beach. Go Beach! I ended up back in my home state working in safety and logistics in the oil industry until I had to get back west and enrolled in DevBootcamp.
I enjoy warm days hiking with my dog, Charles Barkley, a good dystopian fiction novel, all things sequined and being mediocre at pub trivia but great at creating team names.


Drag & Drop: Drop Effects
Drop Here:
0
Drag Me
Effect reported in dragEnd:
Source: effectAllowed (set in 'dragstart' event)
copy
move
link
none
copyLink
linkMove
all
uninitialized
Target: dropEffect (set in 'dragOver' event)
copy
move
link
none


Click the button to append an item to the list
Note: First create an LI node, then create a Text node, then append the Text node to the LI node. Finally append the LI node to the list.


#pragma once
#ifdef USE_TILE_LOCAL
# include "tiletex.h"
# include "tiles-build-specific.h"
#endif
enum wm_event_type
{
WME_NOEVENT = 0,
WME_ACTIVEEVENT,
WME_KEYDOWN,
WME_KEYUP,
WME_MOUSEMOTION,
WME_MOUSEBUTTONUP,
WME_MOUSEBUTTONDOWN,
WME_MOUSEWHEEL,
WME_MOUSEENTER,
WME_MOUSELEAVE,
WME_QUIT,
WME_CUSTOMEVENT,
WME_RESIZE,
WME_EXPOSE,
WME_MOVE,
WME_NUMEVENTS = 15
};
struct wm_keysym
{
unsigned char scancode;
int sym;
unsigned char key_mod;
unsigned int unicode;
};
struct wm_active_event
{
unsigned char type;
unsigned char gain;
unsigned char state;
};
struct wm_keyboard_event
{
unsigned char type;
unsigned char state;
wm_keysym keysym;
};
struct wm_mouse_event
{
enum mouse_event_type
{
PRESS,
RELEASE,
MOVE,
WHEEL,
};
enum mouse_event_button
{
NONE = 0x00,
LEFT = 0x01,
MIDDLE = 0x02,
RIGHT = 0x04,
SCROLL_UP = 0x08,
SCROLL_DOWN = 0x10,
};
// Padding for ui_event
unsigned char type;
// kind of event
mouse_event_type event;
// if PRESS or RELEASE, the button pressed
mouse_event_button button;
// bitwise-or of buttons currently pressed
unsigned short held;
// bitwise-or of key mods currently pressed
unsigned char mod;
// location of events in pixels and in window coordinate space
unsigned int px;
unsigned int py;
};
struct wm_resize_event
{
unsigned char type;
int w, h;
};
struct wm_expose_event
{
unsigned char type;
};
struct wm_quit_event
{
unsigned char type;
};
struct wm_custom_event
{
unsigned char type;
int code;
void *data1;
void *data2;
};
// Basically a generic SDL_Event
struct wm_event
{
unsigned char type;
wm_active_event active;
wm_keyboard_event key;
wm_mouse_event mouse_event;
wm_resize_event resize;
wm_expose_event expose;
wm_quit_event quit;
wm_custom_event custom;
};
#ifdef USE_TILE_LOCAL
enum mouse_cursor_type
{
MOUSE_CURSOR_ARROW = 0,
MOUSE_CURSOR_POINTER,
NUM_MOUSE_CURSORS,
};
// custom timer callback function
typedef unsigned int (*wm_timer_callback)(unsigned int interval, void* param);
class WindowManager
{
public:
// To silence pre 4.3 g++ compiler warnings
virtual ~WindowManager() {};
// Static Alloc/deallocators
// Note: Write this function in each implementation-specific file,
// e.g. windowmanager-sdl.cc has its own WindowManager::create().
static void create();
static void shutdown();
// Class functions
virtual int init(coord_def *m_windowsz) = 0;
// Environment state functions
virtual void set_window_title(const char *title) = 0;
virtual bool set_window_icon(const char* icon_name) = 0;
virtual tiles_key_mod get_mod_state() const = 0;
virtual void set_mod_state(tiles_key_mod mod) = 0;
virtual void set_mouse_cursor(mouse_cursor_type id) = 0;
virtual unsigned short get_mouse_state(int *x, int *y) const = 0;
virtual string get_clipboard() = 0;
virtual bool has_clipboard() = 0;
// System time functions
virtual unsigned int set_timer(unsigned int interval,
wm_timer_callback callback) = 0;
virtual void remove_timer(unsigned int& timer_id) = 0;
virtual unsigned int get_ticks() const = 0;
virtual void delay(unsigned int ms) = 0;
// Event functions
virtual int wait_event(wm_event *event, int timeout) = 0;
virtual bool next_event_is(wm_event_type type) = 0;
virtual void show_keyboard() = 0;
// Display functions
virtual bool init_hidpi() = 0;
virtual void resize(coord_def &m_windowsz) = 0;
virtual void swap_buffers() = 0;
virtual int screen_width() const = 0;
virtual int screen_height() const = 0;
virtual int desktop_width() const = 0;
virtual int desktop_height() const = 0;
// Texture loading
virtual bool load_texture(GenericTexture *tex, const char *filename,
MipMapOptions mip_opt, unsigned int &orig_width,
unsigned int &orig_height,
tex_proc_func proc = nullptr,
bool force_power_of_two = true) = 0;
};
// Main interface for UI functions
extern WindowManager *wm;
#endif //USE_TILE_LOCAL
↑ V707 Giving short names to global variables is considered to be bad practice. It is suggested to rename 'wm' variable.


How do I view Meditation?
Process over product… I am always going to be concerned with product, and I don’t really learn things if they don't have tangible outcomes, so although I did’t spend hours looking at design I believe process and product work hand in hand with each other.. I guess I used my existing square space website as a base for my design, I used the same colours and type because I knew that was going to be a winning combo and would mean I would’t have to think as much about the design while still keeping some integrity…
So before I started reading the second chapter of “search inside yourself” I believed that meditation was a tool that was proven to have a massive amount of benefit. That it serves much more of a purpose than just serving monks that spend their lives meditating. it is a tool for self-discovery, lowers anxiety, can increase the over-all feeling of mental wellbeing.
While reading the chapter there was nothing that I read that I got overly excited about. I liked the response about it doesn’t matter where you are, how you sit, what success you have, its more about attempting and intention. This is a really nice way to explain it and get people interested without overwhelming people, its not usually about the goal of spending your whole life meditating, but of the small hidden benefits of self-care.
After reading another students blog it has also made me reflect on how it is being used to benefit big corporation, and it is being sucked into the mainstream and I wonder how much of what they are saying is true? I don’t think mindfulness should be a way to increase productivity. if that is something that happens on a side note then that is fine, but we don’t need to know how to work harder, we need to learn how to relax and turn off. I have worked myself to a point of breaking for someone else and if they had tried to use mindfulness techniques to make me work that hard for longer thats not compassionate or productive. So although I believe meditation and mindfulness are amazingly powerful techniques they shouldn’t be used for the wrong reasons.


Small border church marks 175 years
by Mairead HollandA CHURCH in Co Monaghan which draws most of its small congregation from Co Fermanagh celebrated its 175th anniversary yesterday.
St Mary's Parish Church, Drummully, has only 36 people registered as parishioners following a decline in numbers due to the Troubles and lack of employment in the area.
However, yesterday, the Church of Ireland was filled for the service which was also attended by parishioners from Galloon and Sallaghy.
It was led by the Bishop of Clogher, the Right Rev John McDowell, and Roy Crowe, diocesan reader and pastoral assistant.
The building of the church coincided with the famine and while the population of many parts of Fermanagh and Monaghan was decimated the parish of Drummully was largely unaffected.
Following partition in 1921, the parish was cut off from the UK by the new border. However, Drummully Salient, an area inaccessible by road except through Co Fermanagh, was not policed until May 1924.


BREAKING THE WAVES A film review by James Berardinelli Copyright 1996 James Berardinelli
RATING (0 TO 10): 8.5 Alternative Scale: ***1/2 out of ****
Denmark/France, 1996 U.S. Release Date: beginning 11/13/96 (limited) Running Length: 2:39 MPAA Classification: R (Violence, sex, nudity, profanity) Theatrical Aspect Ratio: 2.35:1
Cast: Emily Watson, Stellan Skarsgard, Katrin Cartlidge, Jean-Marc Barr, Adrian Rawlins, Udo Kier Director: Lars von Trier Producers: Vibeke Windelov, Peter Aalbaek Jensen Screenplay: Lars von Trier Cinematography: Robby Muller Music: Joachim Holbek U.S. Distributor: October Films
According to writer/director Lars von Trier, BREAKING THE WAVES is "a simple love story", but "simple" hardly begins to describe this deeply disturbing, multi-layered drama. In fact, nowhere is the picture's complexity more evident than in its study of contrasts -- it is highly spiritual yet anti-religious, triumphant yet tragic, and personal yet universal. Love forms the film's core, but rather than approaching the subject from a cliched perspective, BREAKING THE WAVES examines no less than six facets of the emotion: transformative love, sacrificial love, redemptive love, destructive love, romantic love, and sexual love. And, despite a slightly disappointing conclusion, this movie still rates among the best of the year.
To date, von Trier's best-known international effort was the 1991 release, ZENTROPA (called EUROPA outside of North America). Those whose familiarity with the director dates to that movie will find BREAKING THE WAVES a surprising experience. Gone are the artistic, stylized flairs that dominated ZENTROPA. The nearly-antiseptic perspective has been replaced by something far more involved and intimate. It's easy to view the characters in ZENTROPA from a detached vantage point; a similar approach is impossible for BREAKING THE WAVES.
This epic-length film is divided into nine sections: a prologue, seven "chapters", and an epilogue. BREAKING THE WAVES transpires sometime during the 1970s in Scotland. (The exact year is irrelevant since there's a timeless quality to the material -- it could be taking place today if the music, clothing, and automobiles didn't argue for an earlier decade.) Most of the action occurs in a closed village with deeply-rooted fundamentalist Christian beliefs. According to the elders who rule with an iron fist, life isn't for enjoyment; it's for serving God. Sex isn't for pleasure; it's for procreation.  So when meek, kind-hearted Bess (Emily Watson) announces that she intends to marry oil-rig worker Jan (Stellan Skarsgard), an unbeliever, the entire community is stunned.
Despite the stern disapproval of all the elders, the marriage goes ahead, and Bess finds herself happier than she ever could have imagined.  But heartbreak looms ahead. Jan returns to his rig, leaving a lonely Bess behind. Even her best friend and sister-in- law, Dorothy (BEFORE THE RAIN's Katrin Cartlidge), can't lift her out of her profound depression, but when a local doctor (Adrian Rawlins) is called in to evaluate her mental state, he proclaims her sane. Then tragedy strikes as a freak work accident renders Jan paralyzed from the neck down.
Central to the narrative is Bess' relationship with God. For most of the movie, von Trier keeps it ambiguous whether she is psychotic or truly involved in some kind of special communion with the Almighty. Does she really hear God's voice, or is she exhibiting signs of a split personality? Is she His instrument of salvation, or is she merely experiencing potentially self-destructive delusions? Unfortunately, in a late scene, von Trier tips the balance in favor of one interpretation, and this dilutes the film's overall impact.
That said, there's little doubt that von Trier is using BREAKING THE WAVES as an opportunity to contrast the elders' rigid, unforgiving attitudes with Bess' gentle, giving spirit. Because her unorthodox attempts to save her injured husband involve breaking the Law, she puts her status within the community at jeopardy. To further emphasize the strength of her position's spiritual foundation, von Trier parallels Bess' sufferings with those of Jesus -- she is condemned by the holders of the Law, suffers for the sake of those she loves, and, ultimately, offers a path to salvation.
BREAKING THE WAVES is presented as an excursion in cinema verite. Von Trier, in collaboration with cinematographer Robby Muller, uses a handheld camera throughout. In addition, in order to obtain a grainy image with muted colors, the film makers took the original widescreen print, transferred it to video, then brought it back to film. So, while there are times when BREAKING THE WAVES may threaten to induce nausea (especially to those who sit close to the screen), this style effectively creates a faux documentary environment that breaches invisible barriers and brings us into painfully close contact with the characters.
One area where von Trier errs is in his use of artistic "chapter breaks". Each chapter has a title that's presented during a brief intermission from the action which features a richly-hued, painting-like image on screen while '70s rock tunes (like Elton John's "Goodbye Yellow Brick Road" or David Bowie's "Life on Mars") play in the background. The biggest problem with these inserts is that, while they offer a brief respite from the film's unrelenting intensity, their interruption of the mood becomes an unwanted intrusion.
As the deeply disturbed Bess, British stage actress Emily Watson turns in an award-worthy performance. Since Bess must endure a number of physically and mentally degrading events while her volatile personality veers from emotional calm to complete hysteria, Watson's task of creating a believable character becomes more difficult as the movie progresses. To her credit, she never falters. The supporting players, including Stellan Skarsgard and Katrin Cartlidge, do fine jobs, but none captures the lens the way Watson does.
There's no denying that BREAKING THE WAVES is a difficult motion picture to endure, yet, despite its length, it holds the viewer's attention for the full one-hundred fifty-nine minutes. Excepting the chapter breaks, there isn't a wasted moment. And, if not for a somewhat forced catharsis during the epilogue (the weakest segment of the movie), BREAKING THE WAVES would have been more wrenching than it is. This achievement announces that von Trier's aptitude for fashioning characters equals, if not exceeds, that which he has previously displayed for images.
- James Berardinelli e-mail<EMAIL_ADDRESS>ReelViews web site: http://www.cybernex.net/~berardin
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


Kubernetes approaches networking somewhat differently than Docker does by default. There are 4 distinct networking problems to solve:
localhost
communications.Kubernetes assumes that pods can communicate with other pods, regardless of which host they land on. We give every pod its own IP address so you do not need to explicitly create links between pods and you almost never need to deal with mapping container ports to host ports. This creates a clean, backwards-compatible model where pods can be treated much like VMs or physical hosts from the perspectives of port allocation, naming, service discovery, load balancing, application configuration, and migration.
To achieve this we must impose some requirements on how you set up your cluster networking.
Before discussing the Kubernetes approach to networking, it is worthwhile to
review the “normal” way that networking works with Docker. By default, Docker
uses host-private networking. It creates a virtual bridge, called docker0
by
default, and allocates a subnet from one of the private address blocks defined
in RFC1918 for that bridge. For each
container that Docker creates, it allocates a virtual ethernet device (called
veth
) which is attached to the bridge. The veth is mapped to appear as eth0
in the container, using Linux namespaces. The in-container eth0
interface is
given an IP address from the bridge’s address range.
The result is that Docker containers can talk to other containers only if they are on the same machine (and thus the same virtual bridge). Containers on different machines can not reach each other - in fact they may end up with the exact same network ranges and IP addresses.
In order for Docker containers to communicate across nodes, they must be allocated ports on the machine’s own IP address, which are then forwarded or proxied to the containers. This obviously means that containers must either coordinate which ports they use very carefully or else be allocated ports dynamically.
Coordinating ports across multiple developers is very difficult to do at scale and exposes users to cluster-level issues outside of their control. Dynamic port allocation brings a lot of complications to the system - every application has to take ports as flags, the API servers have to know how to insert dynamic port numbers into configuration blocks, services have to know how to find each other, etc. Rather than deal with this, Kubernetes takes a different approach.
Kubernetes imposes the following fundamental requirements on any networking implementation (barring any intentional network segmentation policies):
What this means in practice is that you can not just take two computers running Docker and expect Kubernetes to work. You must ensure that the fundamental requirements are met.
This model is not only less complex overall, but it is principally compatible with the desire for Kubernetes to enable low-friction porting of apps from VMs to containers. If your job previously ran in a VM, your VM had an IP and could talk to other VMs in your project. This is the same basic model.
Until now this document has talked about containers. In reality, Kubernetes
applies IP addresses at the Pod
scope - containers within a Pod
share their
network namespaces - including their IP address. This means that containers
within a Pod
can all reach each other’s ports on localhost
. This does imply
that containers within a Pod
must coordinate port usage, but this is no
different than processes in a VM. We call this the “IP-per-pod” model. This
is implemented in Docker as a “pod container” which holds the network namespace
open while “app containers” (the things the user specified) join that namespace
with Docker’s --net=container:<id>
function.
As with Docker, it is possible to request host ports, but this is reduced to a
very niche operation. In this case a port will be allocated on the host Node
and traffic will be forwarded to the Pod
. The Pod
itself is blind to the
existence or non-existence of host ports.
There are a number of ways that this network model can be implemented. This document is not an exhaustive study of the various methods, but hopefully serves as an introduction to various technologies and serves as a jumping-off point. If some techniques become vastly preferable to others, we might detail them more here.
For the Google Compute Engine cluster configuration scripts, we use advanced
routing to
assign each VM a subnet (default is /24
- 254 IPs). Any traffic bound for that
subnet will be routed directly to the VM by the GCE network fabric. This is in
addition to the “main” IP address assigned to the VM, which is NAT’ed for
outbound internet access. A linux bridge (called cbr0
) is configured to exist
on that subnet, and is passed to docker’s --bridge
flag.
We start Docker with:
DOCKER_OPTS="--bridge=cbr0 --iptables=false --ip-masq=false"
This bridge is created by Kubelet (controlled by the --configure-cbr0=true
flag) according to the Node
’s spec.podCIDR
.
Docker will now allocate IPs from the cbr-cidr
block. Containers can reach
each other and Nodes
over the cbr0
bridge. Those IPs are all routable
within the GCE project network.
GCE itself does not know anything about these IPs, though, so it will not NAT
them for outbound internet traffic. To achieve that we use an iptables rule to
masquerade (aka SNAT - to make it seem as if packets came from the Node
itself) traffic that is bound for IPs outside the GCE project network
(<IP_ADDRESS>/8).
iptables -t nat -A POSTROUTING ! -d <IP_ADDRESS>/8 -o eth0 -j MASQUERADE
Lastly we enable IP forwarding in the kernel (so the kernel will process packets for bridged containers):
sysctl net.ipv4.ip_forward=1
The result of all this is that all Pods
can reach each other and can egress
traffic to the internet.
If you have a “dumb” L2 network, such as a simple switch in a “bare-metal” environment, you should be able to do something similar to the above GCE setup. Note that these instructions have only been tried very casually - it seems to work, but has not been thoroughly tested. If you use this technique and perfect the process, please let us know.
Follow the “With Linux Bridge devices” section of this very nice tutorial from Lars Kellogg-Stedman.
Flannel is a very simple overlay network that satisfies the Kubernetes requirements. It installs in minutes and should get you up and running if the above techniques are not working. Many people have reported success with Flannel and Kubernetes.
OpenVSwitch is a somewhat more mature but also complicated way to build an overlay network. This is endorsed by several of the “Big Shops” for networking.
Weave is yet another way to build an overlay network, primarily aiming at Docker integration.
Calico uses BGP to enable real container IPs.
The early design of the networking model and its rationale, and some future plans are described in more detail in the networking design document.


{{=T("The Messaging Module is the main communications hub of the Sahana system. It is used to send alerts and/or messages using SMS & Email to various groups and individuals before, during and after a disaster.")}}
{{=T("Features Include")}}:
{{=T("Create & manage Distribution groups to receive Alerts")}}
{{=T("Send Alerts using Email &/or SMS")}}
{{=T("View Alerts received using either Email or SMS")}}


这里是提示信息。
Are you sure you want to delete your account
You can only sign up for an account once with a given e-mail address.


Author Notes
This document is created to unify saints in hymn singing especially with respect to Tagalog
updated translation.
This digital copy was previously protected by registration code but after fellowship
with co-workers, elders, and, responsible brothers from Metro Manila, it was decided that
this document can be freely distributed to the saints.


migraine mitochondrial DNA mtDNA associated epigenetic patients Mitochondrial mitochondria brain important studies However, association role including methylation {border-style Therefore, px;} stress #ffffff;} genes nuclear oxidative regulation riboflavin clinical complex Neurol RNA diseases Cephalalgia Sci changes headache mutation aura energy gene observed prevalence reported Cell Med disease human pathophysiology study Headache damage metabolism modifications syndrome Migraine Moreover, Res higher pathogenesis Epigenetic RNAs Riboflavin disorders dysfunction genome histone mechanisms result results variants Figure cellular episodes expression mitochondria. non-coding px; {font-family Biol Genet MELAS ROS components considered control cyclic disturbances font-size genetic involved linked located long mitochondria, mutations play prophylaxis related variability ATP Chen Curr ETS Oxidative Wang common deficiency double; efficacy encoded functioning m.A>G methyltransferases migraine. performed region regions sequence subunits susceptibility therapy threshold trial vomiting Arch Biochem Biophys CpG Epigenetics Int Mitochondria Neurology Neurosci action attacks border-color border-width cases containing depression disease, diseases. effective element encoding epilepsy especially form frequency functional general hand, high impaired impairment increased individuals large levels migraine, migraine: neurodegenerative neurological neurons new nucleus, occur occurs positive production profile proteins research resulting review solid; specific stroke-like symptoms trials valproate {font-style {font-weight -oxoG Chem Clin Dis Eur Genomics PGC-α Pain biogenesis blood bold called cell copies counterpart, courier; cross-talk cytosine detected did differences directly disease. disease: diseases, does em; entire epigenetics functions haplogroup heavy homeostasis influence information known lactic light limited lower methyltransferase miRNAs model myopathies neuronal noncoding nucleus occurrence pathogenesis. patients, phosphorylation population potential pt;} question randomized rat regulatory risk shown single small spreading suggest supported therapeutic treatment trigeminal usually


You are currently logged in as {{AppState.Login.Credentials.Profile.FirstName}}.
{{AppState.Login.LoginError.ErrorId}}


| author | {{c.author_name}}
<{{c.author_email}}> {{c.author_date.utc}} UTC |
| committer | {{c.committer_name}}
<{{c.committer_email}}> {{c.committer_date.utc}} UTC |
| parent | {{p}} |
| {{!fname.html}} | +{{added}} | -{{deleted}} |
{{c.diff.body}}% end


{% extends "comics/base.html" %} {% load simple_crop %} {% block page-title %}{{ series.name }}{% endblock page-title %} {% block content %}
{{ series.unread_issue_count }}
{{ series.name }}
No series currently available.
No series match your search.


>>
<<
Usr
Pri
JfC
LJ
Phr
Dic
Voc
!:
Help
Primer
Ambivalence
Every verb has two definitions: a dyad used when it has both a left and right argument, and a monad used when it has only a right argument. The two definitions are usually related, as in - with a dyad definition of minus and a monad definition of negate.
5 - 3
2
- 7
_7
The dyad is also referred to as the dyadic case of the verb and the monad is referred to as the monadic case of the verb.
The term ambivalence is used in the chemical sense of both valences to indicate that a verb can react with both a single argument and with two arguments.
Remember: every verb has both a monad and dyad definition.
>>
<<
Usr
Pri
JfC
LJ
Phr
Dic
Voc
!:
Help
Primer


Cuba medical program becomes source of controversy
by The Associated PressHAVANA (AP) — A much-lauded overseas medical program has become the focus of accusations that it serves as cover for fomenting protests against governments opposed by Cuba.
Cuba said Friday that it’s pulling 700 members of its medical mission to Bolivia after the arrest of four members of the program, which began under now-exiled President Evo Morales. The four were accused of fomenting protests against the government that took over from Morales, a Cuban ally.
The end of Cuba’s 400-person medical mission to Ecuador was also announced this week, along with the accusation by Ecuador’s interior minister that Cuba misused official passports to bring in 250 Cubans during protests against President Lenin Moreno, whom Cuba also opposes.
Brazilian President Jair Bolsonaro ended his county’s Cuban medical program after taking office last year.
The Associated Press


Total cases
Active cases
Recovered
Deaths
Hospitalized
Symptomatic Hospitalized
IC Hospitalized
Tests


OK Button
Click on OK if you are happy with the changes you have made to the topic information update options.


SmartSDK is the FIWARE’s “cookbook” for developing smart applications. SmartSDK project is co-funded by the EU's Horizon2020 programme under agreement number 723174 - ©2016 EC and by CONACYT agreement 737373
Send us an email at<EMAIL_ADDRESS>we will be happy to hear from you soon!


 So when she spots a deer in the forest being pursued by a wolf, she cannot resist fighting it for the flesh. But to do so, she must kill the predator and killing something so precious comes at a price ... Dragged to a magical kingdom for the murder of a faerie, Feyre discovers that her captor, his face obscured by a jewelled mask, is hiding far more than his piercing green eyes would suggest. Feyre's presence at the court is closely guarded, and as she begins to learn why, her feelings for him turn from hostility to passion and the faerie lands become an even more dangerous place. Feyre must fight to break an ancient curse, or she will lose him forever.
The Free Novels Read Link


This team is comprised of individuals with several different talents and areas of focus. Scroll to get to know us better.
Hebler Saucedo
Artist, Creative Director
Hebler is a senior in the Interactive Media Design program with a special interest in visual art. He is the main story-teller within the game and has been the creative director.
Yarelly Gomez
Front-End Developer, Back-End Developer
Yarelly is a Senior in the Interactive Media Design program and also has a minor in Computer Science & Software Engineering. She is the web designer/engineer and assists in the integration of the game onto the web.
James Tear
Designer,Artist
James is senior in the Interactive Media Design program with a special interest in visual art. James is a contributing artist.
Cindy Phanz
Artist, Game Developer
Cindy is a a senior in the Interactive Media Design program and has a special interest in the arts. She is the artist as well as a contributing developer on the game itself.


CSS Coverage Demo: Page 3
- Open the developer toolbar (Shift+F2)
- Type "
csscoverage start
"
- Click through the pages in turn.
Done.
- When you're done collecting data, close the notification bar
or type "
csscoverage stop
"
- In the style editor check for selectors with a
strikeout,
or type "csscoverage report
"
Back to Start
.page3-test1
.sheetA-test1
.sheetA-test5
.sheetB-test1
.sheetB-test5
.sheetC-test1
.sheetC-test5
.sheetD-test1
.sheetD-test5


fun deleteRecursively(file: File): Unit
Deletes a specific file. If the file is a directory, all contained files and subdirectories are deleted recursively.


Getting Started with Vitis Vision¶
Describes the methodology to create a kernel, corresponding host code and a suitable makefile to compile an Vitis Vision kernel for any of the supported platforms in Vitis. The subsequent section also explains the methodology to verify the kernel in various emulation modes and on the hardware.
Prerequisites¶
- Valid installation of Vitis™ 2020.1 or later version and the corresponding licenses.
- Install the Vitis Vision libraries, if you intend to use libraries compiled differently than what is provided in Vitis.
- Install the card for which the platform is supported in Vitis 2020.1 or later versions.
- If targeting an embedded platform, set up the evaluation board.
- Xilinx® Runtime (XRT) must be installed. XRT provides software interface to Xilinx FPGAs.
- Install/compile OpenCV libraries(with compatible libjpeg.so). Appropriate version (X86/aarch32/aarch64) of compiler must be used based on the available processor on the target board.
- libOpenCL.so must be installed if not present along with the platform.
Vitis Design Methodology¶
There are three critical components in making a kernel work on a platform using Vitis™:
- Host code with OpenCL constructs
- Wrappers around HLS Kernel(s)
- Makefile to compile the kernel for emulation or running on hardware.
Host Code with OpenCL¶
Host code is compiled for the host machine that runs on the host and provides the data and control signals to the attached hardware with the FPGA. The host code is written using OpenCL constructs and provides capabilities for setting up, and running a kernel on the FPGA. The following functions are executed using the host code:
- Loading the kernel binary on the FPGA – xcl::import_binary_file() loads the bitstream and programs the FPGA to enable required processing of data.
- Setting up memory buffers for data transfer – Data needs to be sent and read from the DDR memory on the hardware. cl::Buffers are created to allocate required memory for transferring data to and from the hardware.
- Transfer data to and from the hardware –enqueueWriteBuffer() and enqueueReadBuffer() are used to transfer the data to and from the hardware at the required time.
- Execute kernel on the FPGA – There are functions to execute kernels on the FPGA. There can be single kernel execution or multiple kernel execution that could be asynchronous or synchronous with each other. Commonly used command is enqueueTask().
- Profiling the performance of kernel execution – The host code in OpenCL also enables measurement of the execution time of a kernel on the FPGA. The function used in our examples for profiling is getProfilingInfo().
Wrappers around HLS Kernel(s)¶
All Vitis Vision kernels are provided with C++ function templates (located at <Github repo>/include) with image containers as objects of xf::cv::Mat class. In addition, these kernels will work either in stream based (where complete image is read continuously) or memory mapped (where image data access is in blocks).
Vitis flow (OpenCL) requires kernel interfaces to be memory pointers with width in power(s) of 2. So glue logic is required for converting memory pointers to xf::cv::Mat class data type and vice-versa when interacting with Vitis Vision kernel(s). Wrapper(s) are build over the kernel(s) with this glue logic. Below examples will provide a methodology to handle different kernel (Vitis Vision kernels located at <Github repo>/include) types (stream and memory mapped).
Stream Based Kernels¶
To facilitate the conversion of pointer to xf::Mat and vice versa, two adapter functions are included as part of Vitis Vision xf::cv::Array2xfMat() and xf::cv::xfMat2Array(). It is necessary for the xf::Mat objects to be invoked as streams using HLS pragma with a minimum depth of 2. This results in a top-level (or wrapper) function for the kernel as shown below:
extern “C”
{
void func_top (ap_uint *gmem_in, ap_uint *gmem_out, ...) {
xf::cv::Mat<…> in_mat(…), out_mat(…);
#pragma HLS dataflow
xf::cv::Array2xfMat<…> (gmem_in, in_mat);
xf::cv::Vitis Vision-func<…> (in_mat, out_mat…);
xf::cv::xfMat2Array<…> (gmem_out, out_mat);
}
}
The above illustration assumes that the data in xf::cv::Mat is being streamed in and streamed out. You can also create a pipeline with multiple functions in pipeline instead of just one Vitis Vision function.
For the stream based kernels with different inputs of different sizes, multiple instances of the adapter functions are necessary. For this,
extern “C” {
void func_top (ap_uint *gmem_in1, ap_uint *gmem_in2, ap_uint *gmem_in3, ap_uint *gmem_out, ...) {
xf::cv::Mat<...,HEIGHT,WIDTH,…> in_mat1(…), out_mat(…);
xf::cv::Mat<...,HEIGHT/4,WIDTH,…> in_mat2(…), in_mat3(…);
#pragma HLS dataflow
xf::cv::accel_utils obj_a, obj_b;
obj_a.Array2xfMat<…,HEIGHT,WIDTH,…> (gmem_in1, in_mat1);
obj_b.Array2xfMat<…,HEIGHT/4,WIDTH,…> (gmem_in2, in_mat2);
obj_b.Array2xfMat<…,HEIGHT/4,WIDTH,…> (gmem_in3, in_mat3);
xf::cv::Vitis-Vision-func(in_mat1, in_mat2, int_mat3, out_mat…);
xf::cv::xfMat2Array<…> (gmem_out, out_mat);
}
}
For the stream based implementations, the data must be fetched from the input AXI and must be pushed to xfMat as required by the xfcv kernels for that particular configuration. Likewise, the same operations must be performed for the output of the xfcv kernel. To perform this, two utility functions are provided, xf::cv::Array2xfMat() and xf::cv::xfMat2Array().
Array2xfMat¶
This function converts the input array to xf::cv::Mat. The Vitis Vision kernel would require the input to be of type, xf::cv::Mat. This function would read from the array pointer and write into xf::cv::Mat based on the particular configuration (bit-depth, channels, pixel-parallelism) the xf::cv::Mat was created.
template <int PTR_WIDTH, int MAT_T, int ROWS, int COLS, int NPC>
void Array2xfMat(ap_uint< PTR_WIDTH > *srcPtr, xf::cv::Mat<MAT_T,ROWS,COLS,NPC>& dstMat)
| Parameter | Description |
|---|---|
| PTR_WIDTH | Data width of the input pointer. The value must be power 2, starting from 8 to 512. |
| MAT_T | Input Mat type. Example XF_8UC1, XF_16UC1, XF_8UC3 and XF_8UC4 |
| ROWS | Maximum height of image |
| COLS | Maximum width of image |
| NPC | Number of pixels computed in parallel. Example XF_NPPC1, XF_NPPC8 |
| srcPtr | Input pointer. Type of the pointer based on the PTR_WIDTH. |
| dstMat | Output image of type xf::cv::Mat |
xfMat2Array¶
This function converts the input xf::cv::Mat to output array. The output of the xf::kernel function will be xf::cv::Mat, and it will require to convert that to output pointer.
template <int PTR_WIDTH, int MAT_T, int ROWS, int COLS, int NPC>
void xfMat2Array(xf::cv::Mat<MAT_T,ROWS,COLS,NPC>& srcMat, ap_uint< PTR_WIDTH > *dstPtr)
| Parameter | Description |
|---|---|
| PTR_WIDTH | Data width of the output pointer. The value must be power 2, from 8 to 512. |
| MAT_T | Input Mat type. Example XF_8UC1, XF_16UC1, XF_8UC3 and XF_8UC4 |
| ROWS | Maximum height of image |
| COLS | Maximum width of image |
| NPC | Number of pixels computed in parallel. Example XF_NPPC1, XF_NPPC8 |
| dstPtr | Output pointer. Type of the pointer based on the PTR_WIDTH. |
| srcMat | Input image of type xf::cv::Mat |
Interface pointer widths¶
Minimum pointer widths for different configurations is shown in the following table:
types
MAT type Parallelism Min PTR_WIDTH Max PTR_WIDTH XF_8UC1 XF_NPPC1 8 512 XF_16UC1 XF_NPPC1 16 512 XF_ 8UC1 XF_NPPC8 64 512 XF_ 16UC1 XF_NPPC8 128 512 XF_ 8UC3 XF_NPPC1 32 512 XF_ 8UC3 XF_NPPC8 256 512 XF_8UC4 XF_NPPC8 256 512 XF_8UC3 XF_NPPC16 512 512
Kernel-to-Kernel streaming¶
There are two utility functions available in Vitis Vision, axiStrm2xfMat and xfMat2axiStrm to support streaming of data between two kernels. For more details on kernel-to-kernel streaming, refer to the “Streaming Data Transfers Between the Kernels” section of UG1277 document.
axiStrm2xfMat¶
axiStrm2xfMat is used by consumer kernel to support streaming data transfer between two kernels. Consumer kernel receives data from producer kernel through kernel streaming interface which is defined by hls:stream with the ap_axiu< PTR_WIDTH, 0, 0, 0> data type. axiStrm2xfMat would read from AXI stream and write into xf::cv:Mat based on particular configuration (bit-depth, channels, pixel-parallelism) the xf::cv:Mat was created.
template <int PTR_WIDTH, int MAT_T, int ROWS, int COLS, int NPC>
void axiStrm2xfMat(hls::stream<ap_axiu<PTR_WIDTH, 0, 0, 0> >& srcPtr, xf::cv::Mat<MAT_T, ROWS, COLS, NPC>& dstMat)
| Parameter | Description |
|---|---|
| PTR_WIDTH | Data width of the input pointer. The value must be power 2, starting from 8 to 512. |
| MAT_T | Input Mat type. Example XF_8UC1, XF_16UC1, XF_8UC3 and XF_8UC4 |
| ROWS | Maximum height of image |
| COLS | Maximum width of image |
| NPC | Number of pixels computed in parallel. Example XF_NPPC1, XF_NPPC8 |
| srcPtr | Input image of type hls::stream<ap_axiu<PTR_WIDTH, 0, 0, 0> > |
| dstMat | Output image of type xf::cv::Mat |
xfMat2axiStrm¶
xfMat2axiStrm is used by producer kernel to support streaming data transfer between two kernels. This function converts the input xf:cv::Mat to AXI stream based on particular configuration (bit-depth, channels, pixel-parallelism).
template <int PTR_WIDTH, int MAT_T, int ROWS, int COLS, int NPC>
void xfMat2axiStrm(xf::cv::Mat<MAT_T, ROWS, COLS, NPC>& srcMat, hls::stream<ap_axiu<PTR_WIDTH, 0, 0, 0> >& dstPtr)
| Parameter | Description |
|---|---|
| PTR_WIDTH | Data width of the input pointer. The value must be power 2, starting from 8 to 512. |
| MAT_T | Input Mat type. Example XF_8UC1, XF_16UC1, XF_8UC3 and XF_8UC4 |
| ROWS | Maximum height of image |
| COLS | Maximum width of image |
| NPC | Number of pixels computed in parallel. Example XF_NPPC1, XF_NPPC8 |
| srcPtr | Input image of type hls::stream<ap_axiu<PTR_WIDTH, 0, 0, 0> > |
| dstMat | Output image of type xf::cv::Mat |
Memory Mapped Kernels¶
In the memory map based kernels such as crop, Mean-shift tracking and bounding box, the input read will be for particular block of memory based on the requirement for the algorithm. The streaming interfaces will require the image to be read in raster scan manner, which is not the case for the memory mapped kernels. The methodology to handle this case is as follows:
extern “C”
{
void func_top (ap_uint *gmem_in, ap_uint *gmem_out, ...) {
xf::cv::Mat<…> in_mat(…,gmem_in), out_mat(…,gmem_out);
xf::cv::kernel<…> (in_mat, out_mat…);
}
}
The gmem pointers must be mapped to the xf::cv::Mat objects during the object creation, and then the memory mapped kernels are called with these mats at the interface. It is necessary that the pointer size must be same as the size required for the xf::Vitis-Vision-func, unlike the streaming method where any higher size of the pointers (till 512-bits) are allowed.
Makefile¶
Examples for makefile are provided in the examples and tests section of GitHub.
Design example Using Library on Vitis¶
Following is a multi-kernel example, where different kernel runs sequentially in a pipeline to form an application. This example performs Canny edge detection, where two kernels are involved, Canny and edge tracing. Canny function will take gray-scale image as input and provided the edge information in 3 states (weak edge (1), strong edge (3), and background (0)), which is being fed into edge tracing, which filters out the weak edges. The prior works in a streaming based implementation and the later in a memory mapped manner.
Host code¶
The following is the Host code for the canny edge detection example. The host code sets up the OpenCL platform with the FPGA of processing required data. In the case of Vitis Vision example, the data is an image. Reading and writing of images are enabled using called to functions from Vitis Vision.
// setting up device and platform
std::vector<cl::Device> devices = xcl::get_xil_devices();
cl::Device device = devices[0];
cl::Context context(device);
cl::CommandQueue q(context, device,CL_QUEUE_PROFILING_ENABLE);
std::string device_name = device.getInfo<CL_DEVICE_NAME>();
// Kernel 1: Canny
std::string binaryFile=xcl::find_binary_file(device_name,"krnl_canny");
cl::Program::Binaries bins = xcl::import_binary_file(binaryFile);
devices.resize(1);
cl::Program program(context, devices, bins);
cl::Kernel krnl(program,"canny_accel");
// creating necessary cl buffers for input and output
cl::Buffer imageToDevice(context, CL_MEM_READ_ONLY,(height*width));
cl::Buffer imageFromDevice(context, CL_MEM_WRITE_ONLY,(height*width/4));
// Set the kernel arguments
krnl.setArg(0, imageToDevice);
krnl.setArg(1, imageFromDevice);
krnl.setArg(2, height);
krnl.setArg(3, width);
krnl.setArg(4, low_threshold);
krnl.setArg(5, high_threshold);
// write the input image data from host to device memory
q.enqueueWriteBuffer(imageToDevice, CL_TRUE, 0,(height*(width)),img_gray.data);
// Profiling Objects
cl_ulong start= 0;
cl_ulong end = 0;
double diff_prof = 0.0f;
cl::Event event_sp;
// Launch the kernel
q.enqueueTask(krnl,NULL,&event_sp);
clWaitForEvents(1, (const cl_event*) &event_sp);
// profiling
event_sp.getProfilingInfo(CL_PROFILING_COMMAND_START,&start);
event_sp.getProfilingInfo(CL_PROFILING_COMMAND_END,&end);
diff_prof = end-start;
std::cout<<(diff_prof/1000000)<<"ms"<<std::endl;
// Kernel 2: edge tracing
cl::Kernel krnl2(program,"edgetracing_accel");
cl::Buffer imageFromDeviceedge(context, CL_MEM_WRITE_ONLY,(height*width));
// Set the kernel arguments
krnl2.setArg(0, imageFromDevice);
krnl2.setArg(1, imageFromDeviceedge);
krnl2.setArg(2, height);
krnl2.setArg(3, width);
// Profiling Objects
cl_ulong startedge= 0;
cl_ulong endedge = 0;
double diff_prof_edge = 0.0f;
cl::Event event_sp_edge;
// Launch the kernel
q.enqueueTask(krnl2,NULL,&event_sp_edge);
clWaitForEvents(1, (const cl_event*) &event_sp_edge);
// profiling
event_sp_edge.getProfilingInfo(CL_PROFILING_COMMAND_START,&startedge);
event_sp_edge.getProfilingInfo(CL_PROFILING_COMMAND_END,&endedge);
diff_prof_edge = endedge-startedge;
std::cout<<(diff_prof_edge/1000000)<<"ms"<<std::endl;
//Copying Device result data to Host memory
q.enqueueReadBuffer(imageFromDeviceedge, CL_TRUE, 0,(height*width),out_img_edge.data);
q.finish();
Top level kernel¶
Below is the top-level/wrapper function with all necessary glue logic.
// streaming based kernel
#include "xf_canny_config.h"
extern "C" {
void canny_accel(ap_uint<INPUT_PTR_WIDTH> *img_inp, ap_uint<OUTPUT_PTR_WIDTH> *img_out, int rows, int cols,int low_threshold,int high_threshold)
{
#pragma HLS INTERFACE m_axi port=img_inp offset=slave bundle=gmem1
#pragma HLS INTERFACE m_axi port=img_out offset=slave bundle=gmem2
#pragma HLS INTERFACE s_axilite port=img_inp bundle=control
#pragma HLS INTERFACE s_axilite port=img_out bundle=control
#pragma HLS INTERFACE s_axilite port=rows bundle=control
#pragma HLS INTERFACE s_axilite port=cols bundle=control
#pragma HLS INTERFACE s_axilite port=low_threshold bundle=control
#pragma HLS INTERFACE s_axilite port=high_threshold bundle=control
#pragma HLS INTERFACE s_axilite port=return bundle=control
xf::cv::Mat<XF_8UC1, HEIGHT, WIDTH, INTYPE> in_mat(rows,cols);
xf::cv::Mat<XF_2UC1, HEIGHT, WIDTH, XF_NPPC32> dst_mat(rows,cols);
#pragma HLS DATAFLOW
xf::cv::Array2xfMat<INPUT_PTR_WIDTH,XF_8UC1,HEIGHT,WIDTH,INTYPE>(img_inp,in_mat);
xf::cv::Canny<FILTER_WIDTH,NORM_TYPE,XF_8UC1,XF_2UC1,HEIGHT, WIDTH,INTYPE,XF_NPPC32,XF_USE_URAM>(in_mat,dst_mat,low_threshold,high_threshold);
xf::cv::xfMat2Array<OUTPUT_PTR_WIDTH,XF_2UC1,HEIGHT,WIDTH,XF_NPPC32>(dst_mat,img_out);
}
}
// memory mapped kernel
#include "xf_canny_config.h"
extern "C" {
void edgetracing_accel(ap_uint<INPUT_PTR_WIDTH> *img_inp, ap_uint<OUTPUT_PTR_WIDTH> *img_out, int rows, int cols)
{
#pragma HLS INTERFACE m_axi port=img_inp offset=slave bundle=gmem3
#pragma HLS INTERFACE m_axi port=img_out offset=slave bundle=gmem4
#pragma HLS INTERFACE s_axilite port=img_inp bundle=control
#pragma HLS INTERFACE s_axilite port=img_out bundle=control
#pragma HLS INTERFACE s_axilite port=rows bundle=control
#pragma HLS INTERFACE s_axilite port=cols bundle=control
#pragma HLS INTERFACE s_axilite port=return bundle=control
xf::cv::Mat<XF_2UC1, HEIGHT, WIDTH, XF_NPPC32> _dst1(rows,cols,img_inp);
xf::cv::Mat<XF_8UC1, HEIGHT, WIDTH, XF_NPPC8> _dst2(rows,cols,img_out);
xf::cv::EdgeTracing<XF_2UC1,XF_8UC1,HEIGHT, WIDTH, XF_NPPC32,XF_NPPC8,XF_USE_URAM>(_dst1,_dst2);
}
}
Evaluating the Functionality¶
You can build the kernels and test the functionality through software emulation, hardware emulation, and running directly on a supported hardware with the FPGA. For PCIe based platforms, use the following commands to setup the environment:
$ cd <path to the folder where makefile is present>
$ source <path to the Vitis installation folder>/Vitis/<version number>/settings64.sh
$ source <path to Xilinx_xrt>/setup.sh
$ export DEVICE=<path-to-platform-directory>/<platform>.xpfm
Software Emulation¶
Software emulation is equivalent to running a C-simulation of the kernel. The time for compilation is minimal, and is therefore recommended to be the first step in testing the kernel. Following are the steps to build and run for the software emulation:
For PCIe devices:
$ make host xclbin TARGET=sw_emu
$ make run TARGET=sw_emu
For embedded devices:
$ export SYSROOT=< path-to-platform-sysroot >
$ make host xclbin TARGET=sw_emu BOARD=Zynq ARCH=< aarch64 | aarch32 >
$ make run TARGET=sw_emu BOARD=Zynq ARCH=< aarch64 | aarch32 >
Hardware Emulation¶
Hardware emulation runs the test on the generated RTL after synthesis of the C/C++ code. The simulation, since being done on RTL requires longer to complete when compared to software emulation. Following are the steps to build and run for the hardware emulation:
For PCIe devices:
$ make host xclbin TARGET=hw_emu
$ make run TARGET=hw_emu
For embedded devices:
$ export SYSROOT=< path-to-platform-sysroot >
$ make host xclbin TARGET=hw_emu BOARD=Zynq ARCH=< aarch64 | aarch32 >
$ make run TARGET=hw_emu BOARD=Zynq ARCH=< aarch64 | aarch32 >
Testing on the Hardware¶
To test on the hardware, the kernel must be compiled into a bitstream (building for hardware). This would consume some time since the C/C++ code must be converted to RTL, run through synthesis and implementation process before a bitstream is created. As a prerequisite the drivers has to be installed for corresponding XSA, for which the example was built for. Following are the steps to build the kernel and run on a hardware:
For PCIe devices:
$ make host xclbin TARGET=hw
$ make run TARGET=hw
For embedded devices:
$ export SYSROOT=< path-to-platform-sysroot >
$ make host xclbin TARGET=hw BOARD=Zynq ARCH=< aarch64 | aarch32 >
$ make run TARGET=hw BOARD=Zynq ARCH=< aarch64 | aarch32 >
Note1. For non-DFX platforms, BOOT.BIN has to be manually copied from < build-directory >/< xclbin-folder >/sd_card / to the top level sd_card folder.
Note2. For hw run on embedded devices, copy the generated sd_card folder content under package_hw directory to an SDCARD and run the following commands on the board:
cd /mnt
export XCL_BINDIR=< xclbin-folder-present-in-the-sd_card > #For example, "export XCL_BINDIR=xclbin_zcu102_base_hw"
./< executable > < arguments >


{% extends 'panel.html' %} {% load utilities %} {% block head_title %}Confirm Deletion{% endblock %} {% block panel_content %}
Are you sure you want to delete a {{ object.source|source_to_name }} dataset containing {{ object.datafiles.count }} file{{ object.datafiles.count|pluralize }}?


THE SPIRAL STAIRCASE (1946) A Film Review Copyright Dragan Antulov 2000
One of the most interesting (or disturbing) elements of today's popular culture is media obsession with the serial killer phenomena. This obsession is particularly visible in the area of motion picture industry, with multitude of serial killer films being produced by Hollywood in the last decade. However, serial killers weren't that unfamiliar to the filmmakers in previous decades. One of the films that gives insight in the way Hollywood handled such material in its Golden Age is THE SPIRAL STAIRCASE, 1946 Hitchcockian thriller directed by Robert Siodmak.
The plot, based on the novel by Ethel Lina White, is set in small New England town in the first decades of 20th Century. Local residents have been recently affected by the series of murders, in which all the victims are women affected with some kind of mental or physical disabilities. Helen Capel (played by Dorothy McGuire) is beautiful girl who works as a servant in the mansion of old and bed-ridden Mrs. Warren (played by Ethel Barrymore). Since she happens to be mute since childhood, everyone in the mansion, including Professor Albert Warren (played by Ed Brent), Mrs. Warren's stepson, is concerned for her safety and advise her to stay within the locked doors of the house until the killer is caught. Mrs. Warren, on the other hand, warns Ethel that the real danger lurks within the house, but Helen doesn't believe her. Instead she would leave the mansion because of the young and handsome Doctor Parry (played by Kent Smith) who wants to marry her. But, before that happens, she must stay in the house for the night, but soon she would find that Mrs. Warren's warning is quite justified.
Although remade twice for the television, THE SPIRAL STAIRCASE hardly comes to mind when people think about most important genre films in 1940s Hollywood. It may be argued that the great Alfred Hitchcock and his work shadowed the film's reputation, but the real reason probably lies in the fact that the film was at least a few decades ahead of its time. Those who pay attention could see that many horror and thriller directors in later decades have borrowed heavily from THE SPIRAL STAIRCASE. The most obvious examples are the use of killer's POV, strange noises in the dark being mistaken for the killer by its potential victim and sexual activity being equal to death sentence - two cliches almost inseparable from slasher movies. However, what separates this film from its 1980s imitators is the lack of gore and shock tactics. Siodmak relies on suspense, and manages to make film truly exciting, by creating generally creepy atmosphere. His directorial skills help this movie in overcoming even such cliched setting of isolated country mansion in the stormy night. Even the viewers who are accustomed to such sort of films would be genuinely scared by Siodmak's masterful manipulation.
The most valuable of this film are characters, though. Scriptwriter Mel Dinelli managed to create some really interesting personalities, memorable despite their relatively short appearance in 81 minutes of this film. Heroine is superbly played by Dorothy McGuire, although her character doesn't say a word. But the supporting characters are also excellent, being played by always reliable character actors.  Unfortunately, obligatory Hollywood romance brought character that isn't that interesting - good doctor, played by Kent Smith, which isn't that necessary for the course of film. But, thankfully, and against the Hollywood conventions, his character leaves the movie before the end and the damsel in distress has to rely only on herself. Characters in this film are even more interesting when we try to understand them in psychoanalytical context - THE SPIRAL STAIRCASE actually tries to explain serial killer motives as the consequence of masculine impotence. Use of Freudian psychology in thrillers would become much more fashionable in later decades, thanks to Hitchcock who made it one of his trademarks. Siodmak is in such matters, of course, less explicit but equally effective as the great Master of Suspense, which makes THE SPIRAL STAIRCASE one of the true gems of classic Hollywood.
RATING: 8/10 (+++)
Review written on March 2nd 2000
Dragan Antulov a.k.a. Drax Fido: 2:381/100 E-mail<EMAIL_ADDRESS>E-mail<EMAIL_ADDRESS>E-mail<EMAIL_ADDRESS>Filmske recenzije na hrvatskom/Movie Reviews in Croatian http://film.purger.com
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


Tech A beginner’s guide to the math that powers machine learning by Ben Dickson 2 hours ago 4 Tuesday — October 6, 2020
Insights How to perfect your fintech story and close your next funding round by Nadja Poljo 2 hours ago 14
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago
There’s a six-figure career in software development in your future. This training can be your gateway TNW Deals 7 minutes ago