text:
FUTURES land-change modeling for evaluating innovative conservation scenarios
This is material for US-IALE 2019 workshop FUTURES land-change modeling for evaluating innovative conservation scenarios held in Fort Collins, Colorado, April 9, 2019. This workshop introduces GRASS GIS and FUTURES urban growth modeling framework.
Note: FUTURES v2 was released January 2020 (this workshop is updated to FUTURES v2)
Workshop introduction
r.futures.* is an implementation of the FUTure Urban-Regional Environment Simulation (FUTURES)[1] which is a model for multilevel simulations of emerging urban-rural landscape structure. FUTURES produces regional projections of landscape patterns using coupled submodels that integrate nonstationary drivers of land change: per capita demand (DEMAND submodel), site suitability (POTENTIAL submodel), and the spatial structure of conversion events (PGA submodel).
[1] Meentemeyer, R. K., Tang, W., Dorning, M. A., Vogler, J. B., Cunniffe, N. J., & Shoemaker, D. A. (2013). FUTURES: multilevel simulations of emerging urban-rural landscape structure using a stochastic patch-growing algorithm. Annals of the Association of American Geographers, 103(4), 785-807
There are a number of software requirements to run FUTURES that will need to be download and installed. Required software includes:
- addons
- R (≥ 3.5.0) - needed for r.futures.potential with packages:
- MuMIn, lme4, optparse, rgrass7
- SciPy - useful for r.futures.demand
We use the R statistical software for our calculation of site suitability (i.e. development potential) in FUTURES. R is a free software environment for statistical computing and graphics. If you don't have R, or you have older an version, please download and install the software from install R and be sure to additionally add these required packages:
install.packages(c("MuMIn", "lme4", "optparse", "rgrass7"))
Note: If you use MS Windows, make sure you first install R and then GRASS GIS, that will enable you to easily use R from GRASS GIS.
Use the instructions bellow to install GRASS GIS.
MS Windows
We will be using GRASS GIS 7.6.1 that can be found here in the OSGeo4W package manager. Please install the latest stable GRASS GIS 7 version and the SciPy Python package using the Advanced install option. A guide with step by step screen shot instructions is available here.
In order for GRASS to be able to find R executables, R must be on the PATH variable. If you install GRASS after you installed R, GRASS automatically looks for R executable, so you should be fine. If not, follow this solution to make R accessible from GRASS permanently. A simple but temporary solution is to open GRASS GIS and paste this in the black terminal (adjust the version):
set PATH=%PATH%;C:\Program Files\R\R-3.5.0\bin
This has to be repeated after restarting GRASS session.
Ubuntu Linux
Install GRASS GIS from packages:
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable sudo apt-get update sudo apt-get install grass
Mac OS X
Install GRASS GIS 7.6.0 from downloads page and follow the instruction. For latest Mojave, see also this known issue affecting addons installation.
Note: If r.futures.potential won't run for you despite R being installed, open new terminal and run:
which Rscript
and then append the printed path to PATH variable and run this command in GRASS GIS terminal:
export PATH="$PATH:/usr/local/bin/"
Then run r.futures.potential from GRASS command line (you may need to change directory to wherever you have your files).
Once GRASS GIS is installed, required addons needed for the workshop can be downloaded and installed from a GRASS GIS session. You can do this step once you are more familiar with GRASS after going through the GRASS GIS introduction in the next section:
g.extension r.futures g.extension r.sample.category
Workshop data
The data that we will be using for the workshop can be download here: sample dataset.
The dataset is prepared as GRASS GIS Location (part of GRASS GIS Database) and it includes data from the following sources:
- digital elevation model (NED)
- NLCD 1992/2001 Retrofit Land Cover Change Product
- transportation network (TIGER)
- county boundaries (TIGER)
- protected areas (Secured Lands)
- cities as points (USGS)
In addition, download population information as text files.
These text files containing county population past estimates and future projections were prepared based on (nonspatial) data available from NC OSBM.
GRASS GIS introduction
Here we provide an overview of the GRASS GIS project: grass.osgeo.org that might be helpful to review if you are a first time user. For this exercise it's not necessary to have a full understanding of how to use GRASS GIS. However, you will need to know how to place your data in the correct GRASS GIS database directory, as well as some basic GRASS functionality. Here we introduce main concepts necessary for running the tutorial:
Setting up GRASS for the tutorial
GRASS uses unique database terminology and structure (GRASS database) that are important to understand for the set up of this tutorial, as you will need to place the required data (e.g. Location) in a specific GRASS database. In the following we review important terminology and give step by step directions on how to download and place you data in the correct location.
Important GRASS directory terminology
- A GRASS database consists of directory with specific Locations (projects) where data layer are stored
- Location is a directory with data related to one geographic location or a project. All data within one Location has the same coordinate reference system.
- Mapset is a collection of maps within Location, containing data related to a specific task, user or a smaller project
Creating a GRASS database for the tutorial
You need to create a GRASS database with the Mapset that we will use for the tutorial before we can run the FUTURES model. Please download the GRASS Location for the workshop, noting where the files are located on your local directory. Now, create (unless you already have it) a directory named grassdata (GRASS database) in your home folder (or Documents), unzip the downloaded data into this directory. You should now have a Location futures_ncspm in grassdata.
GRASS GIS 7.0.3 startup dialog with downloaded Location and Mapsets for FUTURES workshop
Launching and exploring data in GRASS
Now that we have the data in the correct GRASS database, we can launch the Graphical User Interface (GUI) in Mapset practice1. The GUI interface allows you to display raster, vector data as well as navigate through zooming in and out. Advanced exploration and visualization, like many popular GIS software, is also possible in GRASS (e.g. queries, adding legend). The print screens below depicts how you can add different map layers (left) and display the metadata of your data layers.
Layer Manager and Map Display overview. Annotations show how to add raster layer, query, add legend.
Show raster map metadata by right click on layer
GRASS functionality
One of the advantages of GRASS is the diversity and number of modules that let you analyze all manner of spatial and temporal. GRASS GIS has over 500 different modules in the core distribution and over 230 addon modules that can be used to prepare and analyze data layers.
Prefix | Function | Example |
r.* | raster processing | r.mapcalc: map algebra |
v.* | vector processing | v.clean: topological cleaning |
i.* | imagery processing | i.segment: object recognition |
db.* | database management | db.select: select values from table |
r3.* | 3D raster processing | r3.stats: 3D raster statistics |
t.* | temporal data processing | t.rast.aggregate: temporal aggregation |
g.* | general data management | g.rename: renames map |
d.* | display | d.rast: display raster map |
Command line vs. GUI interface
GRASS modules can be executed either through a GUI or command line interface. The GUI offers a user-friendly approach to executing modules where the user can navigate to data layers that they would like to analyze and modify processing options with simple check boxes. The GUI also offers an easily accessible manual on how to execute a model. The command line interface allows users to execute a module using command prompts specific to that module. This is handy when you are running similar analyses with minor modification or are familiar with the module commands for quick efficient processing. In this workshop we provide module prompts that can be copy and pasted into the command line for our workflow, but you can use both GUI and command line depending on personal preference. Look how GUI and command line interface represent the same tool.
Task: compute aspect (orientation) from provided digital elevation model using module r.slope.aspect using both module dialog and command line.
- How to find modules? Modules are organized by their functionality in wxGUI menu, or we can search for them in Search modules tab. If we already know which module to use, we can just type it in the wxGUI command console.
Modules can be found in wxGUI menu
You can search modules by name, description or keywords in Search modules tab
By typing prefix r. we make a list of modules starting with that prefix to show up.
Computational region
Computational region - is an important raster concept in GRASS GIS. In GRASS a computational region can be set, subsetting larger extent data for quicker testing of analysis or analysis of specific regions based on administrative units. We provide a few points to keep in mind when using the computational region function:
- defined by region extent and raster resolution
- applies to all raster operations
- persists between GRASS sessions, can be different for different mapsets
- advantages: keeps your results consistent, avoid clipping, for computationally demanding tasks set region to smaller extent, check your result is good and then set the computational region to the entire study area and rerun analysis
- run
g.region -p
or in menu Settings - Region - Display region to see current region settings
Modeling with FUTURES
Initial steps and data preparation
First we will set the computational region of our analyses to an extent covering our study area that aligns with our base landuse rasters. Like explained in the instructions above, you simply need copy and paste these commands into the command prompt of GRASS or open g.region dialog.
g.region raster=landuse_2011 -p
The FUTURES model uses the locations of development and new development to predict when and where new urban growth will occur. This requires longitudinal data on urban land use. We will derive urbanized areas from NLCD dataset for year 1992, 2001, 2006 and 2011 by extracting categories category 21 - 24 into a new binary map where developed is 1, undeveloped 0 and NULL (no data). The NULL area is important in simulating urban growth as it precludes these are from becoming development. For this exercise we assume that water, wetlands and protected areas can not be developed, setting them to NULL.
First we will convert protected areas from vector to raster. We set NULLs to zeros (for simpler raster algebra expression in the next step) using r.null. Copy line by line into GUI command console and press Enter after each command.
v.to.rast input=protected_areas output=protected_areas use=val
r.null map=protected_areas null=0
And then create rasters of developed/undeveloped areas using raster algebra:
r.mapcalc "urban_1992 = if(landuse_1992 >= 20 && landuse_1992 <= 24, 1, if(landuse_1992 == 11 || landuse_1992 >= 90 || protected_areas, null(), 0))"
r.mapcalc "urban_2001 = if(landuse_2001 >= 21 && landuse_2001 <= 24, 1, if(landuse_2001 == 11 || landuse_2001 >= 90 || protected_areas, null(), 0))"
r.mapcalc "urban_2006 = if(landuse_2006 >= 21 && landuse_2006 <= 24, 1, if(landuse_2006 == 11 || landuse_2006 >= 90 || protected_areas, null(), 0))"
r.mapcalc "urban_2011 = if(landuse_2011 >= 21 && landuse_2011 <= 24, 1, if(landuse_2011 == 11 || landuse_2011 >= 90 || protected_areas, null(), 0))"
FUTURES is a multi-level modelling framework meaning that we model population projections for subregions and assume that these subregions are influenced differently by the factors that influence where development happens. This requires defining subregions for model implementation. For this exercise we use the county level, which is the finest scale of population data that is available to us. We therefore need to convert vectors of counties to a raster with the values of the FIPS attribute which links to population file:
v.to.rast input=counties type=area use=attr attribute_column=value output=counties
Before further steps, we will set our working directory so that the input population files and text files we are going to create in the following section are saved in one directory and easily accessible. You can do that from menu Settings → GRASS working environment → Change working directory. Select (or create) a directory and move there the downloaded files population_projection.csv and population_trend.csv.
Potential submodel
Module r.futures.potential implements the POTENTIAL submodel as a part of FUTURES land change model. POTENTIAL is implemented using a set of coefficients that relate a selection of site suitability factors to the probability of a place becoming developed. This is implemented using the parameter table in combination with maps of those site suitability factors (mapped predictors). The coefficients are obtained by conducting multilevel logistic regression in R with package lme4 where the coefficients may vary by county. The best model is selected automatically using dredge function from package MuMIn.
First, we will derive possible predictors of urban growth using GRASS modules.
Slope possibly influences urban growth as steep areas are difficult to build on. We will derive slope in degrees from digital elevation model using r.slope.aspect module:
r.slope.aspect elevation=elevation_30m slope=slope
Distance from lakes/rivers
Distance to lakes or rivers may contribute to an amenity draw where people would like to build a house in a location where they can view water. First we will extract category Open Water from 2011 NLCD dataset:
r.mapcalc "water = if(landuse_2011 == 11, 1, null())"
Then we compute the distance to water with module r.grow.distance and set color table to shades of blue:
r.grow.distance input=water distance=dist_to_water
r.colors -n map=dist_to_water color=blues -e
Distance from protected areas
Like water protected areas can attract urban growth as people enjoy living near scenic areas. We will use raster protected of protected areas we already created, but we will set NULL values to zero. We compute the distance to protected areas with module r.grow.distance and set color table from green to red:
r.null map=protected_areas setnull=0
r.grow.distance input=protected_areas distance=dist_to_protected
r.colors map=dist_to_protected color=gyr -e
Forest may influence urban growth in different ways. On the one hand it might be costly for developments as tree will need to be removed. On the other hand, people may want to live near forests. We calculate the percentage forest for a 0.5 km pixel to test forest influence, see NLCD categories Forest. We derive the percentage of forest also for year 1992.
r.mapcalc "forest = if(landuse_2011 >= 41 && landuse_2011 <= 43, 1, 0)"
r.mapcalc "forest_1992 = if(landuse_1992 >= 40 && landuse_1992 <= 43, 1, 0)"
r.neighbors -c input=forest output=forest_smooth size=15 method=average
r.neighbors -c input=forest_1992 output=forest_1992_smooth size=15 method=average
r.colors map=forest_smooth,forest_1992_smooth color=ndvi
Distance to main urban centers
Concentrated population and economic activities around main urban centers are important drivers of development. To calculate this influence we will compute distance to urban centers with more than 200,000 inhabitants:
r.grow.distance input=city_center distance=dist_to_city_center
Road density
Dense road construction often occurs in suburban areas where much much development occurs in U.S. cities. To capture this influence we can calculate road density based on the road network. We rasterize roads and use a moving window analysis (r.neighbors) to compute road density for a 1 km area:
r.neighbors -c input=roads output=road_dens size=25 method=average
Development pressure
Development pressure is an important variable in the FUTURES model that is always included as a dynamic variable reinforcing the pressure of past development. We assume that urban development in one location will increase the chance of development in near proximity. New simulated development is incorporated into calculating this development pressure every time step that FUTURES simulates urban growth. To estimate the influence that this local development pressure has, we include the development pressure r.futures.devpressure in our initial model estimates. Development pressure is based on number of neighboring developed cells within a specified search distance, weighted by distance. Its special role in the model allows for path dependent feedback between predicted change and change in subsequent steps.
When gamma increases, development influence decreases more rapidly with distance. Size is half the size of the moving window. When gamma is low, local development influences more distant places. We compute development pressure for development in 1992 for Potential model to estimate how much development pressure influenced new development between 1992 and 2011. Then, we compute it also for 2011 for future projections.
r.futures.devpressure -n input=urban_1992 output=devpressure_30_05_01_92 method=gravity size=30 gamma=0.5 scaling_factor=0.1
r.futures.devpressure -n input=urban_2011 output=devpressure_30_05_01_2011 method=gravity size=30 gamma=0.5 scaling_factor=0.1
Rescaling variables
First we will look at the ranges of our predictor variables by running a short Python code snippet in GUI Python shell (right click and select Paste Plus):
import grass.script as gs
for name in ['slope', 'dist_to_water', 'dist_to_protected',
'forest_smooth', 'forest_1992_smooth', 'dist_to_city_center',
'road_dens', 'devpressure_30_05_01_92', 'devpressure_30_05_01_2011']:
minmax = gs.raster_info(name)
print (name, minmax['min'], minmax['max'])
We will rescale some of our input variables:
r.mapcalc "dist_to_water_km = dist_to_water / 1000"
r.mapcalc "dist_to_protected_km = dist_to_protected / 1000"
r.mapcalc "dist_to_city_center_km = dist_to_city_center / 1000"
r.mapcalc "road_dens_perc = road_dens * 100"
r.mapcalc "forest_smooth_perc = forest_smooth * 100"
r.mapcalc "forest_1992_smooth_perc = forest_smooth * 100"
To build multilevel statistical model describing the relation between predictors and observed change, we randomly sample predictors and response variable. Our response variable is new development between 1992 and 2011.
r.mapcalc "urban_change_92_11 = if(urban_2011 == 1, if(urban_1992 == 0, 1, null()), 0)"
To sample only in the analyzed counties, we will clip the layer:
r.mapcalc "urban_change_clip = if(counties, urban_change_92_11)"
To help estimate the number of sampling points, we can use r.report to report number of developed/undeveloped cells.
r.report map=urban_change_clip units=h,c,p
We will sample the predictors and the response variable with more random points in undeveloped areas than in newly developed areas:
r.sample.category input=urban_change_clip output=sampling sampled=counties,devpressure_30_05_01_92,slope,road_dens_perc,forest_1992_smooth_perc,dist_to_water_km,dist_to_protected_km,dist_to_city_center_km npoints=5000,1000 random_seed=1
The attribute table can be exported as CSV file (not necessary step):
v.db.select map=sampling columns=counties,devpressure_30_05_01_92,slope,road_dens_perc,forest_1992_smooth_perc,dist_to_water_km,dist_to_protected_km,dist_to_city_center_km separator=comma file=samples.csv
Development potential
Now we find best model for predicting urbanization using r.futures.potential which wraps an R script.
We can run R dredge function to find "best" model. We can specify minimum and maximum number of predictors the final model should use. WARNING: can take some time to run.
r.futures.potential -d input=sampling output=potential.csv columns=counties,devpressure_30_05_01_92,slope,road_dens_perc,forest_1992_smooth_perc,dist_to_water_km,dist_to_protected_km,dist_to_city_center_km developed_column=urban_change_clip subregions_column=counties min_variables=4
You can then open the output file potential.csv, which is a CSV file with tabs as separators.
For this tutorial, the final potential is created with:
r.futures.potential input=sampling output=potential.csv columns=devpressure_30_05_01_92,road_dens_perc,forest_1992_smooth_perc,dist_to_water_km,dist_to_city_center_km developed_column=urban_change_clip subregions_column=counties --o
We can now visualize the suitability surface using module r.futures.potsurface. It creates initial development potential (suitability) raster from predictors and model coefficients and serves only for evaluating development Potential model. The values of the resulting raster range from 0 to 1.
r.futures.potsurface input=potential.csv subregions=counties output=suitability
r.colors map=suitability color=byr
Demand submodel
First we will mask out roads so that they don't influence into per capita land demand relation.
r.mask raster=roads maskcats=0
We will use r.futures.demand which derives the population vs. development relation. The relation can be linear/logarithmic/logarithmic2/exponential/exponential approach. Look for examples of the different relations in the manual.
- linear: y = A + Bx
- logarithmic: y = A + Bln(x)
- logarithmic2: y = A + B * ln(x - C) (requires SciPy)
- exponential: y = Ae^(BX)
- exp_approach: y = (1 - e^(-A(x - B))) + C (requires SciPy)
The format of the input population CSV files is described in the manual. It is important to have synchronized categories of subregions and the column headers of the CSV files (in our case FIPS number). How to simply generate the list of years (for which demand is computed) is described in r.futures.demand manual, for example run this in Python console:
','.join([str(i) for i in range(2011, 2036)])
Then we can create the DEMAND file:
r.futures.demand development=urban_1992,urban_2001,urban_2006,urban_2011 subregions=counties observed_population=population_trend.csv projected_population=population_projection.csv simulation_times=2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035 plot=plot_demand.pdf demand=demand.csv separator=comma method=logarithmic
In your current working directory, you should find files plot_demand.pdf and demand.csv.
If you have SciPy installed, you can experiment with other methods for fitting the functions:
r.futures.demand ... method=linear,logarithmic,logarithmic2,exp_approach
If necessary, you can create a set of demand files produced by fitting each method separately and then pick for each county the method which seems best and manually create a new demand file.
When you are finished, remove the mask as it is not needed for the next steps.
r.mask -r
Patch calibration
Patch calibration can be a very time consuming computation. Therefore we select only one county (Wake):
v.to.rast input=counties type=area where="value == 37183" use=attr attribute_column=value output=calib_county
g.region raster=calib_county zoom=calib_county
to derive patches of new development by comparing historical and latest development. We can keep only patches with minimum size 2 cells (1800 = 2 x 30 x 30 m).
r.futures.calib development_start=urban_1992 development_end=urban_2011 subregions=counties patch_sizes=patches.txt patch_threshold=1800 -l
We obtained a file patches.txt (used later in the PGA) - a patch size distribution file - containing sizes of all found patches.
We can look at the distribution of the patch sizes:
from matplotlib import pyplot as plt
with open('patches.txt') as f:
patches = [int(patch) for patch in f.readlines()]
plt.hist(patches, 2000)
At this point, we start the calibration to get best parameters of patch shape (for this tutorial, this step can be skipped and the suggested parameters are used).
r.futures.calib development_start=urban_1992 development_end=urban_2011 subregions=calib_county patch_sizes=patches.txt calibration_results=calib.csv patch_threshold=1800 repeat=10 compactness_mean=0.1,0.3,0.5,0.7,0.9 compactness_range=0.05 discount_factor=0.1,0.3,0.5,0.7,0.9 predictors=road_dens_perc,forest_2011_smooth_perc,dist_to_water_km,dist_to_city_center_km demand=demand.csv devpot_params=potential.csv num_neighbors=4 seed_search=probability development_pressure=devpressure_30_05_01_2011 development_pressure_approach=gravity n_dev_neighbourhood=30 gamma=0.5 scaling_factor=0.1
FUTURES simulation
We will switch back to our previous region:
g.region vector=counties align=landuse_2011 -p
Now we have all the inputs necessary for running r.futures.pga:
The entire command is here:
r.futures.pga subregions=counties developed=urban_2011 predictors=road_dens_perc,forest_smooth_perc,dist_to_water_km,dist_to_city_center_km devpot_params=potential.csv development_pressure=devpressure_30_05_01_2011 n_dev_neighbourhood=30 development_pressure_approach=gravity gamma=0.5 scaling_factor=0.1 demand=demand.csv discount_factor=0.1 compactness_mean=0.1 compactness_range=0.05 patch_sizes=patches.txt num_neighbors=4 seed_search=probability random_seed=1 output=final output_series=step
Quick description
The command parameters and their values:
- raster map of counties with their categories
... subregions=counties ...
- raster of developed (1), undeveloped (0) and NULLs for undevelopable areas
... developed=urban_2011 ...
- predictors selected with r.futures.potential and their coefficients in a potential.csv file. The order of predictors must match the order in the file and the categories of the counties must match raster counties.
... predictors=road_dens_perc,forest_smooth_perc,dist_to_water_km,dist_to_city_center_km devpot_params=potential.csv ...
- initial development pressure computed by r.futures.devpressure, it's important to set here the same parameters
... development_pressure=devpressure_30_05_01_2011 n_dev_neighbourhood=30 development_pressure_approach=gravity gamma=0.5 scaling_factor=0.1 ...
- per capita land demand computed by r.futures.demand, the categories of the counties must match raster counties.
... demand=demand.csv ...
- patch parameters from the calibration step
... discount_factor=0.1 compactness_mean=0.1 compactness_range=0.05 patch_sizes=patches.txt ...
- recommended parameters for patch growing algorithm
... num_neighbors=4 seed_search=probability ...
- set random seed for repeatable results or set flag -s to generate seed automatically
... random_seed=1 ...
- specify final output map and optionally basename for intermediate raster maps
output=final output_series=step
Color table
To highlight newly developed areas, we can set the following color ramp of raster final using r.colors. Copy and paste the following color ramp specification into tab Define, option rules:
-1 180:255:160 0 200:200:200 1 255:100:50 24 255:255:0
Animating results
Follow a tutorial how to make an animation from the results.
Scenarios involving policies that encourage infill versus sprawl can be explored using the incentive_power parameter of r.futures.pga, which uses a power function to transform the evenness of the probability gradient in POTENTIAL. You can change the power to a number between 0.25 and 4 to test urban sprawl/infill scenarios.
Lower power leads to urban sprawl behavior. Here is an example:
r.futures.pga subregions=counties developed=urban_2011 predictors=road_dens_perc,forest_smooth_perc,dist_to_water_km,dist_to_city_center_km devpot_params=potential.csv development_pressure=devpressure_30_05_01_2011 n_dev_neighbourhood=30 development_pressure_approach=gravity gamma=0.5 scaling_factor=0.1 demand=demand.csv discount_factor=0.1 compactness_mean=0.1 compactness_range=0.05 patch_sizes=patches.txt num_neighbors=4 seed_search=probability random_seed=1 output=final_sprawl output_series=step_sprawl incentive_power=0.25
Higher power leads to urban infill behavior, where new development is promoted close to existing developed areas. Here is an example:
r.futures.pga subregions=counties developed=urban_2011 predictors=road_dens_perc,forest_smooth_perc,dist_to_water_km,dist_to_city_center_km devpot_params=potential.csv development_pressure=devpressure_30_05_01_2011 n_dev_neighbourhood=30 development_pressure_approach=gravity gamma=0.5 scaling_factor=0.1 demand=demand.csv discount_factor=0.1 compactness_mean=0.1 compactness_range=0.05 patch_sizes=patches.txt num_neighbors=4 seed_search=probability random_seed=1 output=final_infill output_series=step_infill incentive_power=4
We can use parameter potential_weight to decrease or increase the probability p of development in a specified area. Input is a raster with values from -1 to 1. Where values are lower than 0, the probability surface is simply multiplied by the values, which results in decreased site suitability. Similarly, values greater than 0 result in increased site suitability. The probability surface is transformed from initial probability p with value w to p + w - p * w.
Task: pick one scenario and rerun analysis. You can use vector digitizer to digitize area for increasing or decreasing probability.
Parallel processing
To be able to evaluate the effect of scenarios on landscape, we will run several stochastic runs of each scenario. We will use r.futures.parallelpga to run the simulation on multiple CPUs. Addon r.futures.parallelpga wraps r.futures.pga and so it has the same parameters, but adds two more, nprocs to specify number of parallel processes and repeat to specify number of random runs. Omit random_seed parameter (handled by r.futures.parallelpga) and add your selected scenario parameter.
Select appropriate values for your computer, do not specify high number of cores unless you have plenty of memory.
r.futures.parallelpga nprocs=2 repeat=10 ...
In your computer does not have sufficient memory, you can use flag -d flag, which runs the simulation per subregion and merges the results together. This however can cause small discontinuities along subregion boundaries.
r.futures.parallelpga -d nprocs=2 repeat=10 ...
GRASS GIS Python API
Introduction to the GRASS GIS 7 Python Scripting Library
The GRASS GIS 7 Python Scripting Library provides functions to call GRASS modules within scripts as subprocesses. The most often used functions include:
- run_command: most often used with modules which output raster/vector data where text output is not expected
- read_command: used when we are interested in text output
- parse_command: used with modules producing text output as key=value pair
- write_command: for modules expecting text input from either standard input or file
Besides, this library provides several wrapper functions for often called modules.
Calling GRASS GIS modules
We will use GRASS GUI Python Shell to run the commands. For longer scripts, you can create a text file, save it into your current working directory and run it with python myscript.py from the GUI command console or terminal.
Tip: When copying Python code snippets to GUI Python shell, right click at the position and select Paste Plus in the context menu. Otherwise multiline code snippets won't work.
We start by importing GRASS GIS Python Scripting Library:
import grass.script as gs
Before running any GRASS raster modules, you need to set the computational region using g.region. In this example, we set the computational extent and resolution to the raster layer elevation_30m.
gs.run_command('g.region', raster='elevation_30m')
The run_command() function is the most commonly used one. Here, we apply the focal operation average (r.neighbors) to smooth the elevation raster layer. Note that the syntax is similar to bash syntax, just the flags are specified in a parameter.
gs.run_command('r.neighbors', input='elevation_30m', output='elev_smoothed', method='average', flags='c')
If we run the Python commands from GUI Python console, we can use AddLayer to add the newly created layer:
Calling GRASS GIS modules with textual input or output
Textual output from modules can be captured using the read_command() function.
gs.read_command('g.region', flags='p')
gs.read_command('r.univar', map='elev_smoothed', flags='g')
Certain modules can produce output in key-value format which is enabled by the -g flag. The parse_command() function automatically parses this output and returns a dictionary. In this example, we call g.proj to display the projection parameters of the actual location.
gs.parse_command('g.proj', flags='g')
For comparison, below is the same example, but using the read_command() function.
gs.read_command('g.proj', flags='g')
Certain modules require the text input be in a file or provided as standard input. Using the write_command() function we can conveniently pass the string to the module. Here, we are creating a new vector with one point with v.in.ascii. Note that stdin parameter is not used as a module parameter, but its content is passed as standard input to the subprocess.
gs.write_command('v.in.ascii', input='-', stdin='%s|%s' % (283730, 208920), output='point')
If we run the Python commands from GUI Python console, we can use AddLayer to add the newly created layer:
Convenient wrapper functions
Some modules have wrapper functions to simplify frequent tasks. For example we can obtain the information about a raster layer with raster_info which is a wrapper of r.info.
Another example is using r.mapcalc wrapper for raster algebra:
gs.mapcalc("forest_2011 = if(landuse_2011 >= 41 && landuse_2011 <= 43, 1, null())")
Function region is a convenient way to retrieve the current region settings (i.e., computational region). It returns a dictionary with values converted to appropriate types (floats and ints). Paste line by line if using GUI Python shell.
region = gs.region()
print (region)
# cell area in map units (in projected Locations)
region['nsres'] * region['ewres']
We can list data stored in a GRASS GIS location with g.list wrappers. With list_grouped, the map layers are grouped by mapsets (in this example, raster layers):
gs.list_grouped(type=['raster'], pattern="landuse*")
Here is an example of a different g.list wrapper list_pairs which structures the output as list of pairs (name, mapset). We obtain current mapset with g.gisenv wrapper.
current_mapset = gs.gisenv()['MAPSET']
gs.list_pairs('raster', mapset=current_mapset)
Post-processing with Python
We will show you some examples how we can use Python to process the results of our stochastic runs efficiently.
Developed land
In this example, you will compute how much forest and farmland (in average for all stochastic runs) is projected to be developed. Use list_grouped, r.mapcalc, r.stats in the following Python code. We suggest to first become familiar with modules' options and test them separately.
import numpy as np
import grass.script as gs
# list maps computed by r.futures.parallelpga for one scenario
# maps =
forest = []
agriculture = []
other = []
for each in maps:
# compute landcover in 2035 by updating landcover 2011 with the simulation results:
# gs...
# get information about how many cells there are of each land use category, use r.stats
# res = gs...
for line in res.strip().splitlines():
cat, cells = line.split()
cat = int(cat)
cells = int(cells)
# developed
if 21 <= cat <= 24:
# agriculture
elif cat == 81 or cat == 82:
# forest
elif 41 <= cat <= 43:
# other land use
# convert to NumPy arrays
forest = np.array(forest)
agriculture = np.array(agriculture)
other = np.array(other)
developed = np.array(developed)
print ("forest: {mean} +- {std}".format(mean=np.mean(forest), std=np.std(forest)))
print ("agriculture: {mean} +- {std}".format(mean=np.mean(agriculture), std=np.std(agriculture)))
print ("other: {mean} +- {std}".format(mean=np.mean(other), std=np.std(other)))
print ("developed: {mean} +- {std}".format(mean=np.mean(developed), std=np.std(developed)))
Forest fragmentation
In the next example we show how we can quantify forest fragmentation for our stochastic runs. We will use addon r.forestfrag. You can install it with:
g.extension r.forestfrag
We will run the fragmentation only for a small extent, because it's computationally demanding:
g.region n=214800 s=210390 w=275580 e=280020 -p
Fill in the missing steps in the workflow and run:
import grass.script as gs
# we will first define function which needs as input new landcover 2035 from previous example and
# 1. converts the landuse to binary forest map (categories 41 - 43)
# 2. compute forest fragmentation, use -a flag and set window=25 for example
# 3. remove temporary maps with g.remove
def forest_fragmentation(landuse):
# 1.
# 2.
result = gs.parse_command('r.stats', input='fragment', flags='cn',
parse=(gs.parse_key_val, {'sep': ' ', 'val_type': int}))
# 3.
return result
# then we will use this function:
current_mapset = gs.gisenv()['MAPSET']
landuse_maps = gs.list_grouped('raster', pattern="landuse_2035_*")[current_mapset]
# we limit our computation to first 5 so that we don't wait too long
landuse_maps = landuse_maps[:5]
for landuse in landuse_maps:
result = forest_fragmentation(landuse)
print (result)
Forest fragmentation run in parallel
Now we will do the same, but run it in parallel. We will use Python multiprocessing package. We have to make couple adjustments to the previous code, for example generate intermediate maps with unique names. Don't run the code from Python shell, that won't work, but run it as Python script.
from multiprocessing import Pool
import grass.script as gs
def forest_fragmentation(landuse):
forest_name = 'forest_2035_' + landuse
fragmentation = 'fragment_' + landuse
gs.mapcalc("{forest} = if({landuse} >= 41 && {landuse} <= 43, 1, 0)".format(landuse=landuse, forest=forest_name))
gs.run_command('r.forestfrag', flags='a', input=forest_name, output=fragmentation, window=25)
result = gs.parse_command('r.stats', input=fragmentation, flags='cn', parse=(gs.parse_key_val, {'sep': ' ', 'val_type': int}))
gs.run_command('g.remove', type='raster', name=[forest_name, fragmentation], flags='f')
return dict(result)
if __name__ == '__main__':
current_mapset = gs.gisenv()['MAPSET']
landuse_maps = gs.list_grouped('raster', pattern="landuse_2035_*")[current_mapset]
landuse_maps = landuse_maps[:5]
nprocs = 5
pool = Pool(nprocs)
p = pool.map_async(forest_fragmentation, landuse_maps)
print (p.get())
See also
- FUTURES tutorial
- Simulation Accuracy & Validation Informatics (SAVI) tool
- Workshop on urban growth modeling with FUTURES
- From GRASS GIS novice to power user (workshop at FOSS4G Boston 2017)
- Unleash the power of GRASS GIS at US-IALE 2017
- Creating animation from FUTURES output in GRASS GIS
- GRASS GIS and R
- GRASS Location Wizard


text:
Autodesk ADSK has outperformed the market over the past 10 years by 3.52% on an annualized basis producing an average annual return of 13.84%. Currently, Autodesk has a market capitalization of $42.63 billion.
Buying $100 In ADSK: If an investor had bought $100 of ADSK stock 10 years ago, it would be worth $370.17 today based on a price of $199.30 for ADSK at the time of writing.
Autodesk's Performance Over Last 10 Years
Finally -- what's the point of all this? The key insight to take from this article is to note how much of a difference compounded returns can make in your cash growth over a period of time.
This article was generated by Benzinga's automated content engine and reviewed by an editor.
© 2024 Benzinga.com. Benzinga does not provide investment advice. All rights reserved.
Trade confidently with insights and alerts from analyst ratings, free reports and breaking news that affects the stocks you care about.

subset: commoncrawl


text:
At The Debt Consolidators Canada, our network of Ontario credit relief offices offer the safest, fastest and easiest way for you to consolidate your Plantagenet debt online. Your high interest card debt and loan problems will be handled through a Ontario registered consumer credit relief office to ensure you are getting the best possible Plantagenet credit relief services. We aim to be your one stop high interest card debt solution provider in Ontario that allows you to consolidate all of your unsecured debt arears into one low easy to afford payment. No need to waste your valuable time searching for the right Plantagenet ON consolidating loans office to deal with as we have done all the work for you. Just fill out the short contact form above and a credit relief professional that is licenced to work in Plantagenet Ontario will contact you and explain all of your high interest card debt options to you, and best of all, this service is absolutely free.
Every year more and more Canadians in Ontario are turning to debt relief loans services to help them consolidate their unsecured debt arears, bills, and other unsecured lines of credit into one easy payment. The various consolidating loans programs are saving Ontario households thousands of dollars in unnecessary interest & credit fees. If you are suffering from the heavy weight of excessive high interest credit card bills, then you owe it to yourself and your family to check out what options are available to you in Plantagenet ON. Simply fill out our short form above and a consolidating loans counsellor licenced to work in Plantagenet ON will contact you and discuss what credit relief options are available. This is an absolutely free service so why wait? Join now and enjoy the financial benefits of debt consolidation.
Our network of debt consolidators & debt relief loans service providers are designed to consolidate all of your unsecured high interest credit card bills into one low monthly payment without the need of Ontario credit consolidation loans. The professional debt relief loans offices that we work with can help you consolidate debt with a Ontario debt consolidation plan that is just right for you! Use our short form above to learn more today about lowering your debt.
Many Ontario people simply pile up high interest card debt, card after card, without ever thinking about how they will ever pay it off, if this sounds like you then you may be a perfect candidate for a Plantagenet credit card consolidation program. Are you getting angry letters, phone calls, and even personal visits to your home from your creditors? The Plantagenet debt relief loans service providers can take on all your high interest card debt, deal with each high interest card debt company direct, and combine all your Ontario high interest card debt into one monthly payment. If your high interest card debt is out of control, and you can't even meet your minimum payments, then fill out our free debt consolidation form above and one of the Ontario credit relief representatives will contact you to work out a new reduced payment plan for all your credit card loans, bills, unsecured loans and other high interest card debt. This free debt consolidation Plantagenet service could save you 50% or more in monthly high interest credit card bills payments.


text:
3 comments:
- AnonymousApril 13, 2012 at 11:21 AM
Hi there,
Nice blog. We love it.
We've been taking note of your style and we've come to be wonderfully addicted to it.
We'd like to invite you as our 1st group of fashionista to join WhatIWear in a conquest to inspire the world,changing one wardrobe at a time.
Click HERE to become a member - www.whatiwear.com
Or check our blog at blog.whatiwear.com
Here are some members who have already joined us.
Anastasia Siantar - brownplatform.com
Andree Judd - avantgardien.tumblr.com
Willabell Ong - paledivision.blogspot.com
Marie Hamm - themavenpost.blogpost.com
Paris & London - themadtwins.blogspot.com
Alyssa Lau - theordinarypeoples.blogspot.com
Nadine Drexler - whengreengrasswasyellowonpictures.com
White Lace - whitelace.ro
Becka Häggblom - sunshineinnorth.blogspot.com
Michalina Z - stook-pook.blogspot.com
Jessica C - westmountfashionista.com
Claradevi Handriatmadja - luce-dale.com


text:
Our sickness tally this month has risen. I finally caught the illness the boys had, and then we went on a trip with sniffly friends, and Alrik succumbed, again.
The good news is that having a minor cold doesn't have to mean being miserable. I'm pleased to be writing a three-part series on the topic of sick days and kids for Children's Mucinex. My first post offered my go-to tips for helping your family survive cold and flu season, and this post and my next one will share some of the fun home activities we've indulged in while under self-imposed quarantine. The bonus to these activities? They make the kids feel better, too!
1. Snuggle and nurse
I have to admit, I eat up all the cuddling I get in when the kids are sick. There's nothing like a loving parent's lap and a gentle hug to make little ones feel secure and comforted — and it boosts my serotonin, too! Mikko's not always the cuddly sort, but during his recent bouts of illness, he would willingly crawl into my lap and even (gasp!) hold hands as we walked outside (something he wouldn't do even as a baby).
On an ill-advised outing before the kids were well, Mikko climbed into my lap at the aquarium, all the limbs and heft of his five-year-old self curled into a little ball. |
We gave up on the aquarium and went to a restaurant. Only I ate — both boys just leaned against me (hard to wield utensils, but I tried…), and Alrik nursed. I love that the word "nursing" has a double meaning that's perfectly suited to seeing little ones through a minor illness: comforting supply of fluids along with Mama's antibodies! |
That's one sad baby, but at least he feels comfortable and loved! |
2. Freely available drinks
During an illness, kids need readily offered fluids, all day long. Keep suggesting they take even a sip. For Mikko, we made sure he had a steady supply of cold water and diluted juice. We also offered popsicles as a treat. You can easily make your own by freezing juice or yogurt in little cups with spoons stuck into the tops.
Babies who are breastfeeding will likely increase their time feeding, which is a great boost for their immune system while providing needed fluids and nutrition. But for older kids (whether nursing or not), you can provide extra drink options to tempt them into hydration. Alrik appreciated sipping from a straw. Babies and toddlers might enjoy breastmilk- or formula-sicles: the familiar nutrients and taste but in an adventurous new texture and temperature. (I know this is possible with breastmilk and am getting negative results about whether it's ok to freeze formula; I'm going to guess it could be all right for a small quantity as a treat but not for regular feedings.)
3. Resting in the middle of the action
Kids who are sick need their rest — but they don't necessarily want to feel sequestered all day. The simple solution? Move their nap space to the family room. This is a great time to teach other kids who are feeling better about compassion and keeping voices low to help out the ailing sibling. But kids who feel crummy enough won't even notice the commotion! I also highly recommend snuggling with a cat and a matching quilt. Couldn't hurt.
4. Movies and video games as a family
Sick days can be good days to relax rules on screen time, if you're open to that — but that doesn't mean kids have to engage with screens alone. I recommend family movie time, which gives an opportunity for more snuggles as well as calming and entertaining the members of the family who are feeling far too well and cooped up. We also greatly enjoy playing kid video games along with Mikko. He's really good at them, and it gives him a lot of practice in reading, motor skills, and problem solving while being a fun way for us to work on something together.
5. Simple but enjoyable projects
As homeschoolers, we're always gathering little projects to do with the kids. Sick days are a great time to break out the easier ones. Check out Pinterest for more ideas than you could ever fit into a quarantine, or see what's already around your house. Low-key art projects, planting a few seeds, experimenting with ice, trying out a sensory bin, reading a stack of library books, writing letters to family members … anything that will distract your kids from their runny noses but still allow for plenty of resting as needed.
6. Foam art in the bathtub
For kids who are stuffy and feverish, the bath is a miracle worker. The warm, moist air unclogs and soothes, while the water can help regulate temperature. Keep your kids in the tub longer or entice them to return by providing simple, free-form bath projects. We purchased some foam shapes that stick to wet walls, but I was enamored when I found out cutting art foam into a variety of shapes is just as easy, just as effective, a whole lot cheaper (especially if you're reusing foam, as I was), and a lot more imagination-inspiring for the kids.
You can find art foam at any craft store, or at many discount stores and frequently in kid art kits. They cut easily with scissors. The foam shapes stick to the walls when damp and peel off with no fuss when dry. (Some of the bolder colors might leave a temporary stain, but I find that washes off. Test if you have a finicky shower surface.) The foam shapes also float on the water, so you can skim them off before draining the tub. Store them in a mesh bag for the next bathtime.
I cut a variety of geometric shapes in different colors and sizes, as well as more landscape-specific shapes (flowers, grass, stems, leaves, clouds). Depending on your scissors skill level (mine is very low), you could cut out vehicles, animals, houses, and the like — but be prepared (and excited) for your kids to use them in unanticipated ways.
Foam shapes also make a great activity bag or gift idea to offer another family, particularly if any of the kids there are sick! Other ideas for fun bathtimes include bubbles, changing the bath color, an assortment of bottles and containers to pour, several sponges and washcloths with directions to clean the tub or various body parts, and non-bath but waterproof toys (or kitchen utensils!) for a change of pace from the usual bath toys. You can also hop into the bath with your kid and play along!
7. Burning trees and other distractions
We decided it was high time to put our Christmas tree to good use. Sam had chopped it up and stored it with our firewood, so we pulled half of it out to burn.
I realize this is an odd one to recommend, but I think any out-of-the-ordinary activity can turn a sick day into a fun-with-mom-and-dad day. Mikko loves it when we use the fireplace, and we rarely do. When better to give it some action than when both our boys needed some cheering up? Burning a Christmas tree (pop! flare! pine scent!) was just the ticket.
As an eighth way to turn sick days into fun days, I support the appropriate use of over-the-counter medicine when my family members need it. We don't use medications often, even during an illness, but I like to know there are child-specific options available when cold or flu symptoms are keeping my children from sleep or making them just way too miserable. I'm glad that Children's Mucinex is one of those medicines, relieving symptoms of congestion and coughing due to colds and flu, and letting Mikko continue his active day and get restful sleep at night to support his immune system's hard work.
Before long, Mikko was back to his old self — playing, talking a mile a minute, and rosy-cheeked with fun instead of a fever!
Children's Mucinex Multi-Symptom Cold
When your child has a bad cold, you both can feel miserable. Children's Mucinex is the #1 children's brand for relieving congestion* and provides fast acting relief from your child's worst cold symptoms. Try Children's Mucinex Multi-Symptom Cold if your child needs relief from stuffy nose and chest congestion. Always use Children's Mucinex Multi-Symptom Cold as directed. (*Based on IRI unit share data for the 52 weeks ending November 2012)
Always use Children's Mucinex Multi-Symptom Cold as directed, which means following all the warnings and information on the product, not using any more than directed, and using only for children 4-12 years old. If you are unsure about using Children's Mucinex Multi-Symptom Cold, please consult your pediatrician.
And now, you can get a coupon for $2 off your next purchase of Children's Mucinex Multi-Symptom Cold on Coupon.com!
Please come back for one more post in the series with a fun and simple craft project that will put a smile on your kids' faces even if they're sick! I'm also very excited to give away a $100 CVS gift card on each post, so leave a simple comment to enter to win!
Comment below with an answer to this question to enter the giveaway: What activity makes your child smile when under the weather?
Please leave a valid email address in your comment so I can contact you if you win!
- No duplicate comments.
- You may receive 1 total entry by leaving a comment in response to the sweepstakes prompt on this post.
- This giveaway is open to US Residents age 18 or older. Winners will be selected via random draw, and will be notified by e-mail. You have 72 hours to get back to me; otherwise a new winner will be selected.
- The Official Rules are available here.
- This sweepstakes runs from 2/6/2013 – 3/31/2013
Be sure to visit the Children's Mucinex Multi-Symptom Cold page on BlogHer.com where you can read other bloggers' reviews and find more chances to win!


text:
Coco Hair & Beauty
Listed in Wales
029 2002 4939
21 Heol-Y-Deri, Cardiff, South Glamorgan CF14 6HA, UK
Description: Coco Hair & Beauty is a Cardiff beauty salon, specialising in a wide range of… Read more...
Listed in Wales
029 2002 4939
21 Heol-Y-Deri, Cardiff, South Glamorgan CF14 6HA, UK
Description: Coco Hair & Beauty is a Cardiff beauty salon, specialising in a wide range of… Read more...
Listed in Lancashire
0161 624 9535
Glodwick Rd, Oldham OL4 1BT, UK
Description: Established over sixty years ago, Harveys provides a wide selection of salon and beauty uniforms… Read more...
Listed in London
London SW3, UK
Description: The Chelsea Day Spa is an award winning boutique day spa in London with three… Read more...
Listed in Greater London
020 7229 1194
129A Queensway, London, Greater London W2 4SJ, UK
Description: Talented stylists and therapists in London. Michael and Vincenzo have been working together to provide… Read more...
Listed in Northern Ireland
07955 043873
221 Falls Road, Belfast, BT12 6FB, UK
Description: Alter Ego is a Nail and Beauty Bar in West Belfast – we're a refreshing… Read more...
Listed in London
218 Brick Ln, London E2 6DG, UK
Description: Asian Restaurant & Takeaway Awards, ARTA is working at the base by encouraging people to… Read more...
Listed in London
218 Brick Ln, London E2 6DG, UK
Description: The Asian Restaurant & Takeaway Awards (ARTA) are a unique festival that celebrates the best… Read more...
Listed in London
020 88009193
23B Portland Ave, London N16 6HD, UK
Description: Welcome to PureNaturals.com, your online source for Vitamins & Supplements for Men. At Pure Naturals… Read more...
Listed in Wales
0292 199 0634
16 Wyndham Arcade, Cardiff CF10 1FJ, UK
Description: Bellisimos Hair is a beautiful salon that offers everything in the world of hair. With… Read more...
Listed in Essex
07903 980273
11A Upminster Rd S, Rainham RM13 9YS, UK
Description: We are Holly Sheen's beauty. A beauty salon based in Rainham Essex, here to help… Read more...
Listed in Yorkshire
1800 102 2221
B. D. Sawant Marg, Andheri East, Mumbai, Maharashtra 400047, India
Description: Bebeautiful is India's top online beauty magazine for women with tips and tricks for all… Read more...
Listed in Blackburn
61 474 422 580
Sydney NSW, Australia
Description: At Glow Picks, my goal is to select the latest, greatest, and most effective Korean… Read more...
Listed in Bedfordshire
IGI Airport, Asset No. 6, Aerocity Hospitality District, New Delhi, Delhi 110037, India
Description: Body therapies are intended to enhance the appearance of the skin, improve the circulation of… Read more...
Listed in London
Stirling Rd, Birmingham B16 9BL, UK
Description: Europe biggest escort directory of independent escorts and escort agencies. At Euro Girls Escort directory… Read more...
Listed in Greater London
64 Petty France, Westminster, London SW1H 9HE, UK
Description: Find the best professional massage with Therapeutic massage in London to make your body relaxed.… Read more...
Listed in West Midlands
30 Albany Gardens, Hampton Ln, Solihull B91 2PT, UK
Description: On www.Childrenhairstyles.com, you will find categories full of articles about latest boys haircuts, girls hair… Read more...
Listed in London
130 Anerley Rd, London SE20 8EF, UK
Description: Nattie Dreadz Palace is your all in one retreat when wanting to pamper yourself, without… Read more...
Listed in Leicestershire
5a Main St, Barlestone, Nuneaton CV13 0ED, UK
Description: KristyOlivia is a (Barlestone) Midlands based Stylist who has built a brilliant reputation by her… Read more...
Listed in Greater Manchester
03333 206662
Hamilton St, Atherton, Manchester M46 0AY, UK
Description: A fantastic range of holly wood smile veneers to restore your smile and confidence, give… Read more...
Listed in London
Marylebone, London W1G 6AT, UK
Description: Age well provides multidimensional and inter-disciplinary assessment of aged people in a comprehensive CGA approach.… Read more...


text:
4tz 3115
Ladies' 14k white gold tanzanite ring, with one blue violet vivid (40%blue/60%violet) color, GIA Type I Clarity VS1, round brilliant cut tanzanite. The tanzanite weighs .66 carat, measures 5.4 mm wide by 5.4 mm long, and is 4 prong set. In addition, there are prong set round brilliant cut diamonds, G-H color, S12 clarity, with a total weight of .10 carat. The ring weighs 3.22 grams. Tanzanite is color enhanced by heating.
We understand that this is a big purchase. If you have any questions, please don't hesitate to contact us at 1-219-662-1390. We are here Tuesday through Saturday. Or visit us in Crown Point, Indiana at 126 South Main St.
Our family only supplies the most amazing Tanzanite gemstones. If you are interested in how our Tanzanite gemstones are graded, watch the video here.
Learn How We Grade Our TanzaniteWith over 30 years in the jewelry business, we custom design all our Tanzanite rings to fit our amazing gemstones. Each ring takes days to design and hours to patiently set and cast. No other company puts as much work into the finished piece of jewelry as the Moriarty family. You don't just get a piece of jewelry, you get a story behind it.
I received the most beautiful pair of round tanzanite earrings in 2 days! I love them. I cannot say enough about this company and the attention I received from them. I would highly recommend them to anyone interested in tanzanite.
- Jane
Excellent customer service. Received expert advice on my purchase. My new earrings are the most beautiful tanzanite gems I've ever seen. I look forward to purchasing more tanzanite jewelry from Tanzanite Designs.
- Audree
zero complaints! full praise! :)
I bought my wife a pair of exceptional oval tanzanite and tsavorite accent earrings and we are extremely happy with the quality of the product. they are more beautiful than expected! my wife is thrilled to wear such high end, sparkly earrings.
the entire process was seamless and packaging was great. steve, thank you for the email and the rest of your crew for a wonderful experience!
- Guy
See More Reviews from Trust PilotSo much goes behind each piece of jewelry we design. From cutting the rough Tanzanite, to brainstorming the design, to finishing the setting. Our whole family makes sure your purchase is unlike anything you have ever seen.
Steve Moriarty in our local papers after just one of his trips to the mines of Tanzania in search of Tanzanite for your jewelry. You don't just get a piece of jewelry, you get the story behind it too.


text:
Democrats keep getting dinged by media fact checkers for attacking Republicans for allegedly wanting to strip money from preventive health programs to pay for to keep the interest rates on some student loans from doubling this summer.
But that hasn't stopped progressives from continuing to make the claim. The latest comes in a new full-page MoveOn.org ad in Politico. The ad reads in part:
"Student loan rates double July 1, yet Republicans in Congress say they'll only keep rates low if they cur funding for women's health..."
The same charge has been repeatedly made by Obama administration officials and congressional Democrats who have made the allegation part of their larger claim that Republicans are waging a "war on women." (Republicans have retorted that it's been President Obama waging a "war on women" because women workers have lost more jobs than men during his time in the White House. That's another story, however.)
But, again, fact checkers have questioned the Democratic attack linking student-loan interest rates to women's health. NPR's very own health-care correspondent, Julie Rovner, recently wrote that Democrats are playing fast and loose on this one.
As she wrote on Tuesday on our sister blog Shots, the preventive health program that whose funding would be cut to pay for the student-loan program funds not just for women's but men's health programs, too.
"Clearly going after the program is part of the GOP effort to defund the 2010 health law, which they despise. But part of a war on women? Not so much."
On Wednesday FactCheck.org, produced by the Annenberg Public Policy Center, made a similar finding.
"Republicans are right: The White House is greatly exaggerating when it says that 'women, in particular,' benefit from a prevention fund that the House GOP proposes to repeal. The truth is that the fund in question wasn't set up specifically for women's health programs, and we could find no concrete evidence that it has paid anything to gender-specific health programs so far."
Thursday brought a tsk-tsk aimed at Democrats, particularly at Rep. Nancy Pelosi, the House minority leader and former speaker, from the Washington Post's Glen Kessler.
"Pelosi could have raised concerns about perceived cuts in preventive health. She could have also noted that women benefit greatly from such efforts. But she — and fellow Democrats — went too far to label this 'an assault on women's health.' Maybe evidence of that will emerge through the regular appropriations process—at which point we could revisit this ruling — but for the moment this smacks of political opportunism."
Which is not to say, of course, that both sides aren't guilty of it. But it is worth noting especially high-profile examples of the art form when they occur.
Copyright 2021 NPR. To see more, visit https://www.npr.org.


text:
Why make use of escort services? Read more about dragon dildo Escorts here
Are you sitting and getting a little petty and can't bear to go into town and find a one-night stand? Then it is an obvious opportunity to call for escorts dragon dildo who can satisfy you. And you do not have to wait long, because around the clock the Irish escorts are ready to give you exactly what you want. Go to one of the many sites for escorts in Ireland and search for an escorts dragon dildo, with whom you can make an appointment. You can use the smart search function to refine your search, so that you only see ads for blondes with big breasts and no pubic hair who live in dragon dildo or the surrounding area. Are you more for a redhead with small firm breasts and dressed in lacquer and leather or a MILF who has many years of experience with sex, then this is just what you are looking for. You can also narrow down your search by searching for sex services - are you for blowjob, ejaculation between the breasts or a good time doggy style, then you will definitely find an dragon dildo who can give it to you. It is also possible to find a lot of lovely Irish girls who can give you great sex service
Remember to be in control of the details before you meet - that makes the meeting with an escort dragon dildo a good experience. Once you have found the female escort who will satisfy your sex desires and fulfill your wildest sex fantasies, then contact her. You can easily and quickly find the phone number for her and then it's just a matter of calling and getting a handle on the details. First you agree on what you want to order her to do in relation to sex, and then an appointment and meeting place must be agreed - is it at your home or with her or maybe in the woods or at a hotel. And then, of course, it is absolutely essential to agree on what the services should cost. When all that is in place, then you need to get yourself ready for the meeting: take a shower and make yourself more handsome, dress in nice clothes and shave if necessary, so that you show up and give a good first impression to your escort dragon dildo. If she gets a good impression of you, then you can also expect that you get the best possible treatment and maybe be pampered a little extra. When you show up at the escort, you can start by small-talking a bit to make the atmosphere more relaxed, and then you come to the sex part. Maybe the girl is good at leading the way and then you just have to follow along and enjoy the meeting to the fullest. When you go home again, you will feel satisfied and comfortable. Maybe you have learned some new sex tricks that you can use with a girlfriend later in life.
Is it a loss to go to an escort in dragon dildo? No, not at all. Read more about the benefits of escort here You probably know it: you are horny and need sex and it should preferably be now and here. If you are single, then one of the solutions may be to go into town and try to score a girl who is willing to go home with you and have sex. But it is not every time that it succeeds. But an escort dragon dildo there is a sex guarantee. You can have just the kind of sex you want - and maybe even with 2 girls that you have always dreamed of. And when you dream about it. You do not have to spend weekend after weekend going to town looking for a sex. But with an escort you can have sex right now, cheap escorts are ready around the clock, every day and they are only a phone call away. Then you go and dream of getting a blowjob from a female escort dragon dildo or taking a naughty African girl anal, then you will just find the escort dragon dildo with whom you can live this out. So do not hold back because you find it embarrassing and loser-like to go to an escort girl dragon dildo . See it as part of your sex adventure and live life and enjoy all the wonderful and naughty sex that you get with the escort. If you have just been divorced, it may be that you do not just want to go out and find a one-night stand - then an escorts dragon dildois a great opportunity to have sex. And you can always count on full discretion from the girls, so should you meet the escort girl on another social occasion, then you can safely count on her keeping your little secret from friends and family.
Have you become happy with your female escort dragon dildo? You can choose to visit her again and again Maybe you will just be so happy with the escort that you become her regular customer, and you get a year-long relationship where you have a lot of hot and naughty sex, and get to try it a lot together. And besides nice and varied sex with an mature escorts dragon dildo, you can also have long conversations and cozy and caring petting and kissing, if that is what you need. It may be that you are a place in life where you need presence and deep conversations before you have sex, then it is just what you agree with your female escort dragon dildo that you spend some of the time together on. Be open to the escort about your needs, and she will do everything she can to fulfill your wishes, so that together you get the best possible experience out of your meeting. And if you build a close relationship, then you will experience that the sex you cultivate together gets better and better - just as it is with any other erotic relationship, where you also get to know each other better and better.
Escort dragon dildo, See escort girls who provide erotic services here
You can find an escort dragon dildo at any time of the day and there are always really many naughty escort ready to satisfy you sexually in every conceivable way. Look at many free escort dragon dildo and sexdating ads, and find perfect escort dragon dildo you like best. It could be her looks you fall for or her ad text, which tells in sexy detail what it is she can do for you. Call and talk to her about what it is you want, and arrange a meeting with her, then you can look forward to a sexy and naughty moment with a lot of good sex – for an escort dragon dildo knows what sex is about, and is keen that you should have the naughtiest and wildest sex experience with her. Do you like swingers?


text:
Asta and Yuno were abandoned together at the same church, and have been inseparable since. As children, they promised that they would compete against each other to see who would become the next Emperor Magus. However, as they grew up, some differences between them became plain. Yuno was a genius with magic, with amazing power and control, while Asta could not use magic at all, and tried to make up for his lack by training physically. When they received their Grimoires at age 15, Yuno got a spectacular book with a four-leaf clover (most people receive a three-leaf-clover), while Asta received nothing at all. However, when Yuno was threatened, the truth about Asta's power was revealed, he received a five-leaf clover Grimoire, a "black clover"! Now the two friends are heading out in the world, both seeking the same goal!
AnimeNewsNetwork (special)
AnimeNewsNetwork (anime)


text:
SSV Divider Valve W/ 12 Outlets & Indicator Pin
Couldn't load pickup availability
Trusted By
Lincoln Divider Valve
The SSV Divider Valve is the "heart" of a manual or automated Quicklub system. Featuring 12 outlets, the SSV valve is available in carbon steel and 303 stainless steer for corrosive environments. valves are available with cycle indicator pins to provide visual indication of system operation.
Return Policy
You can return unused or defective products up to 30 days from the date of order. Some product returns may be subject to restocking fees. Proof of Purchase will be required if we cannot verify your order information. Unless the product is defective or damaged in transit, the customer is responsible for return shipment costs.
Defective or Damaged Products
All shipments received must be immediately inspected for damage. If your order shipped on a freight carrier, any damage needs to be noted on the Freight Receipt before signing for the delivery. An exchange or refund will be provided at no additional cost. If damage is due to misuse or regular wear of the product, the return will be denied.
Order Cancellation
If you need to cancel your order for any reason, please contact us immediately. If the order is canceled prior to shipping, you will be refunded in full. Certain products that are manufactured to order cannot be canceled after the manufacturing process has started.


text:
James Bond, having just turned 50 years old at the movies, might be receiving the best possible belated birthday present. There's some significant buzz suggesting that the 23rd Bond film, Skyfall, which has been hailed by critics and audiences alike — global box office just passed the $1 billion mark — will become the first ever Bond movie to receive a Best Picture nod, when the Oscar nominations are announced this Thursday.
The main reason for the speculation is the Producers Guild of America (PGA) nominating Skyfall for its highest honor — often a bellweather for Oscar nomination day. The surprise inclusion among certain Best Picture locks such as Argo, Les Misérables, Life of Pi, Lincoln, Silver Linings Playbook and Zero Dark Thirty has given hope that everyone associated with the picture has cause to put on a tuxedo come the 85th Oscars on Feb. 24 at the Dolby Theatre in Los Angeles.
(MORE: After Oscar, 20 Movies to See in 2013—and 5 to Skip)
But before we bet the house on Skyfall either getting nominated (you can currently get pretty miserly odds of 11 to 8) or — surely not! — actually winning Best Picture (an eye-popping 150 to 1) there are some notable reasons to hedge the excitement being shown by fans. First, the PGA list always contains 10 movies whereas the current Oscar regulations state that there are anywhere between five and 10 films, based on a fairly complex system in which a film needs to get 5% of first-place votes during the nomination process. And then there's Bond's relationship with Oscar — the polar opposite of his success rate with women: over the course of the previous 22 movies, the franchise has only garnered seven nominations, which resulted in two wins (Best Sound Effects Editing for Goldfinger and Best Visual Effects for Thunderball in the mid 1960s). Indeed, the last nomination came more than 30 years ago for Best Song ("For Your Eyes Only").
Blockbusters don't fare particularly well with the Academy — though it is somewhat ironic to note that the perceived snub of Christopher Nolan's The Dark Knight in 2008 has been cited as a reason for the initial move to nominating 10 films at the Oscars, ensuring that popular pictures get recognized come award season. And there's another reason to not get too carried away by the PGA nomination: recent history has shown that the PGA went with money-making movies such as Star Trek over A Serious Man, which the Academy plumped for in 2009, and Bridesmaids rather than The Tree of Life in 2011.
As for Skyfall, not only was it widely praised — TIME's Richard Corliss called it "a necessary, rather than mandatory, addition to the year's popular culture," while Roger Ebert deemed it "a full-blooded, joyous, intelligent celebration of a beloved cultural icon, with Daniel Craig taking full possession of a role he previously played unconvincingly" — but even Bond alum Sir Roger Moore told TIME recently that he thinks Craig "is the Bond. He's quite brilliant."
(MORE: The James Bond Films at 50: A Golden Franchise for the Ages)
Even if Skyfall falls short of a Best Picture nod — and for what it's worth, it missed out on a nomination Wednesday in the same category at the British Academy Film Awards — the film could win a few little gold men come the big night. Sasha Stone, the founder and editor-in-chief at Awards Daily, reckons the movie will be recognized in five categories (Sound, Sound Editing, Cinematography, Visual Effects and Supporting Actor for Javier Bardem, which would be the first ever acting nomination for the franchise) and shouldn't be ruled out of the running for Best Editing and that elusive Best Picture either. "This is the first awards body that has honored Skyfall for Best Picture so far," Stone told MTV about the PGA nod. "It might show how the industry is thinking around this time. There are so many Skyfall fans out there that it seems like it has a much better chance today than it did yesterday."
One of the most long-overdue wins on Oscar night would be if Roger Deakins finally got his hands on a statue for Cinematography, as Skyfall would break an astonishing 0-9 run thus far. Among his misses are his previous collaborations with Skyfall's director, Sam Mendes, on Jarhead and Revolutionary Road. (Mendes, meanwhile, has had slightly better luck — he won Best Director for his debut feature, American Beauty.) And Adele must surely be considered the front-runner to take home Best Original Song for her eponymous theme (it's also the movie's only Golden Globe nomination). Indeed, it's rumored that she will be taking part in the special tribute to the 50th anniversary of the Bond franchise during the Oscars, which will be quite the coup for the organizers as the Londoner has been laying low since the birth of her baby boy last October.
(LIST: How Does Adele's 'Skyfall' Stack Up Against the Best and Worst James Bond Theme Songs?)
Pessimists will say that the Bond segment gives the Academy a get-out-of-jail card should Skyfall not win any hardware. But optimistic Bond fans hope that not only will the segment bring all six Bonds together on stage for the first time but these iconic actors will be able to say that they were there to witness an Oscar triumph or two and see Skyfall take its place among the best pictures of the year.
MORE: Skyfall Director Sam Mendes on Reinventing James Bond and His Favorite Scenes


text:
Today's restaurant environment is more complex than ever, and you need to know you're covered for the unexpected occurrence with insurance specific to the unique needs of restaurants and bars.
Whether you run a small cafe or a national chain, you could be held liable for anything from contaminated or spoiled food to spilled coffee. That's why you deserve an insurance company with commercial restaurant insurance coverage specifically designed for the risks you face.
Restaurant & Bar Insurance is needed for the following:
- Fine Dining
- Casual Dining
- Fast Food
- Ethnic Cuisine
- Delicatessen
- Coffee Shop
- Micro Brewery
Trent Insurance Agency offers free, comparative quotes on Restaurant & Bar Insurance from multiple insurance carriers so you can get the best possible rate.
Want to see how much we can save you? Just request a quote to find out.


text:
There are 0 real estate agents in the city of Syria to choose from. We've analyzed and ranked over 3 top real estate agent profiles in our network to help you find the best agents in Syria for 2024.
Our team evaluates the number of recent sales, confirmed customer reviews, and agent track record to determine the top agents in each location.
Hiring an agent who is experienced and trusted by past clients gives you confidence throughout the home buying or selling process. You can be sure you have the best partner to get you the best price for your home.
Syria has many real estate agents who claim to be the best and get you the best deal. How do you know who to trust and who will work the hardest for you?
We've crunched the numbers and gone through thousands of real estate agent profiles to bring you only the best as you begin your journey. Search, compare, and hire easily from this list of top Syria real estate agents of 2024.


text:
Real Estate Signs & Riders
With our photo-quality images, unlimited colors and quality hardware, buyers and sellers alike are sure to stop and marvel with these updated, upgraded real estate signs. We can print on a variety of materials, or we can print directly to your existing hardware; either way, the option is in your hands. Call us today, and take step up to better real estate signage.


text:
Mineral Database
Crystal System: Trigonal
Formula: Sn21Cl16O(OH)14O6
Status of Occurrence: Confirmed Occurrence
Distribution: Rare
Chemical Composition: Tin oxychloride
Method(s) of Verification: not known.
Chemical Group:
- Halides
Geological Context:
- Supergene : minerals on an artificial substrate
Introduction: abhurite occurs exclusively on tin ingots in shipwrecks. It is formed by the chemical reaction between the tin and the chloride ions present in seawater. First described from a shipwreck in the Red Sea, abhurite was approved as a mineral species in 1983. However, since that time the criteria for defining a substance as 'a mineral' have been changed (Nickel, 1995). There are substantial anthropogenic factors involved in the formation of abhurite (i.e. creation of metallic tin by mining and smelting, loading the tin onto a ship and taking that ship to the area in which it sinks and the process of abhurite formation can begin). According to the latest criteria that define whether something is or is not a mineral, it is most unlikely that this would be validated as a mineral species by the International Mineralogical Association (IMA) were it to be discovered today.
Occurrence in Wales: only one 'occurrence' of this substance is recorded from Wales, that being from a shipwreck off the Anglesey coast. Tin ingots recovered from the SS Liverpool, which sank off the coast of Anglesey in 1863 following a collision, are coated with abhurite in 'blisters'.
Key Localities:
- SS Liverpool wrecksite: coarse bladed abhurite crystals line 'blisters' on the surface of tin ingots recovered from the wreck of the SS Liverpool, which sank off the coast of Anglesey in 1863 following a collision.
- Definition of a mineral. Mineralogical Magazine, 59, 767-768.


text:
You have reached the aviation RFQ page for part number 45A62257-001, a [SubCategory] part by Textron Inc that is listed alongside the description "Plate Assembly." If you are interested in this part, or any other of the products we have listed, be sure to fill out and submit a Request for Quote (RFQ) form with details about your deadlines and other requirements. Once received, one of our expert team members will carefully review your form and respond with a customized quotation that meets your specific needs. With representatives on standby around-the-clock, you can expect a reply in 15 minutes or less of our review of your completed RFQ form.
Note : We Will Not Share Your Information To Any Third Parties.
Keep Your Lines Up is a leading aviation parts distributor, offering competitive pricing and rapid lead times on aviation bearings, fasteners, [Category] parts, engine supplies, and more. Upholding a strict No China Sourcing policy, all the manufacturers we work with, including Textron Inc, are industry leaders that have been vetted before being added to our Approved Vendor List (AVL). Submit a RFQ form for this item with part number 45A62257-001 and/or any other products of interest today to learn how we can get you the parts you require ASAP!
"We Proudly Support Intrepid Fallen Heroes Fund that serves United States Military Personal experiencing the Invisible Wounds of War : Traumatic Brain Injury (TBI) and Post Traumatic Stress (PTS). Please visit website (www.fallenheroesfund.org) and help in their valiant effort".
We Hope that You Will Visit Us Again the Next Time You Need Aircraft Parts and Make Us Your Strategic Purchasing Partner.
Request for Quote


text:
Neosho, MO Dental Clinics
Neosho, MO Free Dental (Also Affordable, Sliding Scale Dental, etc)
We also now display low cost, affordable clinics for the needy. Yes, our website name is FreeDental.org, but we now provide more.
We are as specific as possible on the listing pages. It is the website users responsibility to contact the clinics listed to confirm whether the clinics is free, low cost, affordable, etc. Do not take it for granted that the clinic is free since it is listed on the website.
We provide listings to help those with dental practices and services to help the needy.


text:
Small VSLING Wallet Burgundy Leather
Small VSLING Wallet Burgundy Leather
Small Valentino Garavani VSLING grainy calfskin leather wallet with VLogo Signature closure. Keep all things financial tucked away in this compact tri-fold wallet. Punctuated with a leather-covered VLOGO detail, this compact accessory is designed with multiple interior compartments for maximum utility. Retail price €390.
New and never used.
Size (L x H x W) | 10.5 x 8.5 x 3 cm |
Color | Burgundy |
Material | Calfskin Leather |
Included | Dustbag, box |
Serial | |
Item # | QS03255 |
Condition |
We support payment by global credit cards, by Finnish online-banking direct payment, and by invoice and installments for Finnish residents.
Tuemme verkkokaupassa maksuja luotto- ja pankkikorteilla, kotimaisilla verkkopankeilla, sekä myös osamaksua ja laskua.
We deliver using DHL Express service.
- In Finland the shipping fee is 10€, with orders over 1000€ have free shipping.
- To European countries the fee starts from 30€.
- To USA and Canada, the fee starts from 50€.
- Orders outside EU & US, please contact us
You can also choose to pickup in our store in Helsinki.
Return policy
Return policy
We offer 14 day returns for online orders, when products are in their original condition and everything is included as when sold.
The customer is responsible for the possible return shipping costs. Please contact us before making a return and if you have any questions before or after ordering.
If you are unable to pickup on time, please contact us to arrange delivery.
Condition ratings
Condition ratings
Here is our condition rating guidelines.
The item is brand new or like new, no wear or only minimal signs from storage. |
The item is almost new, it has only slight visible signs of use. |
The item is in excellent condition, it has some wear from normal use on the outside or inside. |
The item has been in regular use, it has wear typically on the handles, corners, hardware and might have some minor stains. |
The item has been in regular use, with visible wear or stains. |
All our products are authenticated with the basis of many years of professional training and international professional working experience in buying and selling luxury products. We always guarantee authenticity of every item.
Most of our products are either new or pre-owned, some are vintage, we clearly describe the items real condition. However, please review the details of each product before purchasing and you can always contact us to learn more of each item.
Queen Station Plus
Queen Station Plus
Earn QS+ points with each purchase, get discounts and other rewards.
These are professional photos of the actual item offered by Queen Station. All items are on display in our Helsinki store.
Browse our Valentino collection.
Browse our Wallet collection.
More at our store
Want to see this item in person? Visit our store in Helsinki, where we have this and many other luxury products available. As not all products are yet available online, you'll find all of our latest arrivals in our store, where we have everything on display.


text:
No defense for a bad joke
Published 12:00 am Wednesday, June 26, 2013
When it comes to knock-knock jokes, it helps to be 5 years old: You can slap your head, roll your eyes, and run outside and play.
In a courtroom where the defendant is charged with second-degree murder, a knock-knock joke has all the appeal of a bar of soap on the shower floor.
It is difficult to imagine how Don West, defense attorney in the trial of George Zimmerman, the man accused of killing 17-year-old Trayvon Martin, worked through the thought process that led him to slap his own forehead and say to himself:
"Yes! A knock-knock joke is just the way to begin my argument. No, wait, wait! Even better and ridicule the people who will decide the fate of my client! 'Colbert Report,' here I come!"
Thus, when Zimmerman's trial began Monday — in a courtroom where the parents of the victim were present — he offered a little joke:
Knock-knock. Who's there? George Zimmerman. George Zimmerman who? All right. Good. You're on the jury."
No one cued the laugh track. Lightning is funnier.
West's opening-day thud may have seemed amusing over coffee in his own kitchen, but even he knew it was inappropriate. We know because he said so in a lengthy, disclaiming preamble that would have killed even a funny joke. Before launching into The Joke, he warned jurors that they might not think it's funny under the circumstances. He even asked forgiveness in advance just in case they found the joke inappropriate (his word) and to hold it against him, not his client.
At this point in a comedy club, never mind a courtroom, anyone listening would be squirming in vicarious embarrassment for what was to come and was surely going to be a very bad/unfunny/inappropriate joke. Why tell it?
Because everyone is a comedian these days. Or at least everyone wants to be. Comedy, rather than providing relief from our too-serious times, has become the currency of choice. Indeed, as more and more people turn to "Comedy Central" for news, comedians have become among the most influential arbiters of current events.
Not, as funnyman Dave Barry would say, that there's anything wrong with that.
Ever since Jon Stewart told CNN's "Crossfire" hosts in 2004 that their left-right political slugfest was bad for America (and then-CNN president Jon Klein soon after killed the show), the power of the comedian has surged past the serious commentators.
Who wants to be the straight man when the funny guys get all the girls?
Not that comedy isn't commentary. But time and place are as important as the punch line. When a comedian is funny, we never forget that he is primarily a comedian. When a defense attorney plays a comedian at a murder trial, our sense of verisimilitude is thrown off kilter. Wrong character, wrong scene, wrong everything — especially the audience, which included the parents of the victim and the people whose sympathies West was trying to enjoin.
After much criticism, West sort of apologized for his lapse in judgment. He was sorry if anyone was offended, but he still thought it was funny.
Humor has a role in public life, obviously, and comedians make valuable contributions to our understanding by casting a light on our hypocrisies and self-righteousness. Nothing quite delivers a memento mori like a well-placed barb. But that barb best be sharp, and it better be well-placed. West's joke fell flat because it was neither.
The only imaginable use for humor in a murder trial — and this is a stretch — would be spontaneous and self-deprecating, which rarely goes wrong. Insulting one's potential allies, on the other hand, is an unforced error of conceivably catastrophic consequence. It's bad enough to be the butt of a joke, but a joke that's not funny?
The poor jurors in Zimmerman's trial were told more or less that they're so uninformed that they just might be stupid enough to buy the rest of his defense. Let's hope West has better material in his briefcase or Zimmerman, should he be convicted, may have unique grounds for appeal: His lawyer couldn't tell a joke.
Email: email@example.com.


text:
In houses with forced-air heating and cooling systems, ducts are used to distribute conditioned air throughout the house. In a typical house, however, about 20 percent of the air that moves through the duct system is lost due to leaks, holes, and poorly connected ducts. The result is higher utility bills and difficulty keeping the house comfortable, no matter how the thermostat is set.
How do you know that your home has poorly performing ducts?
A duct system that is well-designed and properly sealed can make your home more comfortable, energy-efficient, and safer.
Sealing and insulating ducts can help with common comfort problems, such as rooms that are too hot in the summer or too cold in the winter.
Fumes from household and garden chemicals, insulation particles, and dust can enter your duct system, aggravating asthma and allergy problems. Sealing ducts can help improve indoor air quality by reducing the risk of pollutants entering ducts and circulating through your home.
During normal operation, gas appliances such as water heaters, clothes dryers, and furnaces release combustion gases (like carbon monoxide) through their ventilation systems. Leaky ductwork in your heating and cooling system may cause "backdrafting" where these gases are drawn back into the living space, rather than expelled to the outdoors. Sealing leaks can minimize this risk.
Leaky ducts can reduce heating and cooling system efficiency by as much as 20 percent. Sealing and insulating ducts increases efficiency, lowers your energy bills, and can often pay for itself in energy savings. Plus, if you're planning to install new heating and cooling equipment, a well-designed and sealed duct system may allow you to downsize to a smaller, less costly heating and cooling system that will provide better dehumidification.
Energy used in our homes often comes from the burning of fossil fuels at power plants, which contributes to smog, acid rain, and global warming. Simply put, the less energy we use in our homes, the less air pollution we generate. By sealing your ducts and reducing the amount of energy necessary to comfortably heat or cool your home, you can reduce the amount of air pollution generated.
Because ducts are often concealed in walls, ceiling, attics, and basements, repairing them can be difficult. But there are things that you can do to improve duct performance in your house.
Some homeowners choose to take on duct sealing as a do-it-yourself project. Start by sealing air leaks using mastic sealant or metal tape and insulating all the ducts that you can access (such as those in attics, crawlspaces, unfinished basements, and garages). Never use duct tape, as it is not long-lasting. Also, make sure that the connections at vents and registers are well-sealed where they meet the floors, walls, and ceiling. These are common locations to find leaks and disconnected ductwork.
Many homeowners choose to work with a professional contractor for duct improvement projects. Most heating and cooling equipment contractors also repair ductwork.
View our Duct Sealing brochure (2.73MB) to learn more.
Energy Star - U.S. Environmental Protection Agency - U.S. Department of Energy


text:
Terry Haan, SpeedLine Solutions Inc.
"I figured you might appreciate an update of our experiences with NexusDB. The new NexusDB version is in about 300 restaurants and the response from our customers, and my customer care department has been great. Some of the largest Pizza Hut franchisee's in the USA have signed with SpeedLine for few hundred stores. I am anticipating a 20-30% drop in support calls once all our customers have this new version installed due to the improved reliability of NexusDB over our previous used database.
We are very excited about what NexusDB does to improve our product. Keep up the great work!"
(SpeedLine is the leading provider of intelligent solutions for pizza point of sale.
Terry has also provided us a white paper on their experiences with NexusDB)
Stephen Stewart, Senior Systems Architect at Softworks Computing Ltd
"Well I downloaded the trial version of the Nexus Memory Manager and plugged it in. The results were very impressive. Our Web server application now has a memory footprint that is no longer insane. Also, we got a throughput improvement of over 200%!!!! I never realised just how unsuitable the Borland memory manager is for our type of application, it was really crippling us in performance and the memory fragmentation was really bad.
I picked up the phone to my boss and said 'Buy it! Now!', and so he did. Great work."
(Softworks Computing Ltd is Europe's fastest growing supplier of client-server and web-based Time and Attendance and absence management solutions.)
A.P. Sastry, Senior Systems Developer with Real Business Software
"We have been fortunate enough to be involved with NexusDB since its inception and transition from FlashFiler. We have been using NexusDB as the basis for nearly a dozen of systems in use by our clients. Our largest system is a mission critical application with more than 100 client workstations hammering a NexusDB server in a call centre situation 14 hours a day, 6 days a week.
We have observed NexusDB to be a significant improvement over the previous system with no database corruption and no server downtime (other than routine monthly maintenance) in the past 18 months. We are very happy with the extra speed and functionality that NexusDB provides for us over the last database used."
Mark Tinney, President of JOBehaviors
"We partuclarly appreciate the constant, expert product support delivered by the NexusDB Team."
(JOBehaviors offers their Fortune 500 clients easily adaptable pre-employment, online screening services including 'knock-out questions', assessments, interest & willingness questionnaires and any other customized service needed that involves questions-answers-scores. To best facilitate this flexibility, they chose NexusDB as their backend online database because of its powerful speed plus extensibility in in form of monitors, extenders & referential integrity.)
More use(r)s of NexusDB
"We wrote a product called ToolTrak that, assisted by a portable data terminal with built-on barcode reader, tracks tools issued to individuals and currently Airbus are the biggest user. It's used in various divisions at Airbus including ones responsible for building the brand new Airbus A380."
Rafe Aldridge
"For most wheels and plastic skis on all the snowmobiles (Yamaha, Artic Cat, Polaris, Bombardier) everything is managed with a program using NexusDB. From quotation to production to shipping."
David Charron
Estate Agency Software by Independent Software Solutions Ltd."Nexus is the only DB we use. Single and multiple users installed at 1000+ locations. Rollout probably 80% complete."
Ken Randall
TrafficSystem."We are a small company, but our apps are being used by big radiostations and radiogroups."
Rodrigo Gomez
Import BLUMEX Export BV"The server currently collects all kinds of logistics information from our back-office production systems (UNIX based) and presents it through the clients on 60+ terminals. The information gets updated almost instant (using the messaging plugin) during the whole day (from 5:00AM through 7PM). We are currently extending the server so it can steer the PLC (Process Logic Controller) in sorting the products from the conveyor belt (3/4 mile long with 80+ sorter exits). NexusDB has proven to us (in the last months) that it is stable and fast enough to preform such tasks."
Bert Moorthaemer
More Projects "We have a Object-Relational DB based application (framework) which is used mainly in big Sport Organizations and Sport Centers in Germany and Netherlands. It covers every work done in the asociations from tournaments to courses, licences, ticket-sales to accounting. Biggest Customers are: German Horse Riding Federation, German Handball League, German Rowing Association, Several Gymnastic Associations, University of Utrecht and Amsterdam Sport and Cultural Centers."
Thomas Holdt
"An example of where we use NexusDB is at the International Advertising Festival which happens in Cannes each year - think Oscars for the advertising world and The Cannes Film Festival rolled into one. We handle all the electronic voting systems plus the registration system for this event."
Rafe Aldridge
Medium by PPD Group "We run our HR program using NexusDB. (~150 users over 6 divisions and 2 countries). We also run a custom/in-house production management program in one division (~30 users)."
David Charron
DataVara AB has the salary system Crona Lvn installed at 4600+ sites. It is based on NexusDB.
IL GIORNO s.p.a. uses NexusDB for their photo tracking and journalist royalty payment management applications.
Tiltsoft has a Volcano monitoring software (data manipulation, charting, alarms, etc...) running with NexusDB.
Khaki Software is using NexusDB in MessageTracker (phone message database for physician's office) and SampleTracker (pharmaceutical sample medicine tracker).
Asset Web Advisors s.r.l. has their Agieo, a NexusDB based Real estate management system, in place at IMI Immobiliare Milano and make sure that several branches are synchronized with all available data.
SJMovieDB has based their DVD/VHS Movie Database on NexusDB.