text:
NumPy C Code Explanations¶
Fanaticism consists of redoubling your efforts when you have forgotten your aim. — George Santayana
An authority is a person who can tell you more about something than you really care to know. — Unknown
This Chapter attempts to explain the logic behind some of the new pieces of code. The purpose behind these explanations is to enable somebody to be able to understand the ideas behind the implementation somewhat more easily than just staring at the code. Perhaps in this way, the algorithms can be improved on, borrowed from, and/or optimized.
Memory model¶
One fundamental aspect of the ndarray is that an array is seen as a "chunk" of memory starting at some location. The interpretation of this memory depends on the stride information. For each dimension in an -dimensional array, an integer (stride) dictates how many bytes must be skipped to get to the next element in that dimension. Unless you have a single-segment array, this stride information must be consulted when traversing through an array. It is not difficult to write code that accepts strides, you just have to use (char *) pointers because strides are in units of bytes. Keep in mind also that strides do not have to be unit-multiples of the element size. Also, remember that if the number of dimensions of the array is 0 (sometimes called a rank-0 array), then the strides and dimensions variables are NULL.
Besides the structural information contained in the strides and dimensions members of the PyArrayObject
, the flags contain important information about how the data may be accessed. In particular, the NPY_ARRAY_ALIGNED
flag is set when the memory is on a suitable boundary according to the data-type array. Even if you have a contiguous chunk of memory, you cannot just assume it is safe to dereference a data- type-specific pointer to an element. Only if the NPY_ARRAY_ALIGNED
flag is set is this a safe operation (on some platforms it will work but on others, like Solaris, it will cause a bus error). The NPY_ARRAY_WRITEABLE
should also be ensured if you plan on writing to the memory area of the array. It is also possible to obtain a pointer to an unwritable memory area. Sometimes, writing to the memory area when the NPY_ARRAY_WRITEABLE
flag is not set will just be rude. Other times it can cause program crashes ( e.g. a data-area that is a read-only memory-mapped file).
Data-type encapsulation¶
The data-type is an important abstraction of the ndarray. Operations will look to the data-type to provide the key functionality that is needed to operate on the array. This functionality is provided in the list of function pointers pointed to by the 'f' member of the PyArray_Descr
structure. In this way, the number of data-types can be extended simply by providing a PyArray_Descr
structure with suitable function pointers in the 'f' member. For built-in types there are some optimizations that by-pass this mechanism, but the point of the data- type abstraction is to allow new data-types to be added.
One of the built-in data-types, the void data-type allows for arbitrary structured types containing 1 or more fields as elements of the array. A field is simply another data-type object along with an offset into the current structured type. In order to support arbitrarily nested fields, several recursive implementations of data-type access are implemented for the void type. A common idiom is to cycle through the elements of the dictionary and perform a specific operation based on the data-type object stored at the given offset. These offsets can be arbitrary numbers. Therefore, the possibility of encountering mis- aligned data must be recognized and taken into account if necessary.
N-D Iterators¶
A very common operation in much of NumPy code is the need to iterate over all the elements of a general, strided, N-dimensional array. This operation of a general-purpose N-dimensional loop is abstracted in the notion of an iterator object. To write an N-dimensional loop, you only have to create an iterator object from an ndarray, work with the dataptr member of the iterator object structure and call the macro PyArray_ITER_NEXT
(it) on the iterator object to move to the next element. The "next" element is always in C-contiguous order. The macro works by first special casing the C-contiguous, 1-D, and 2-D cases which work very simply.
For the general case, the iteration works by keeping track of a list of coordinate counters in the iterator object. At each iteration, the last coordinate counter is increased (starting from 0). If this counter is smaller then one less than the size of the array in that dimension (a pre-computed and stored value), then the counter is increased and the dataptr member is increased by the strides in that dimension and the macro ends. If the end of a dimension is reached, the counter for the last dimension is reset to zero and the dataptr is moved back to the beginning of that dimension by subtracting the strides value times one less than the number of elements in that dimension (this is also pre-computed and stored in the backstrides member of the iterator object). In this case, the macro does not end, but a local dimension counter is decremented so that the next-to-last dimension replaces the role that the last dimension played and the previously-described tests are executed again on the next-to-last dimension. In this way, the dataptr is adjusted appropriately for arbitrary striding.
The coordinates member of the PyArrayIterObject
structure maintains the current N-d counter unless the underlying array is C-contiguous in which case the coordinate counting is by-passed. The index member of the PyArrayIterObject
keeps track of the current flat index of the iterator. It is updated by the PyArray_ITER_NEXT
In Numeric, broadcasting was implemented in several lines of code buried deep in ufuncobject.c. In NumPy, the notion of broadcasting has been abstracted so that it can be performed in multiple places. Broadcasting is handled by the function PyArray_Broadcast
. This function requires a PyArrayMultiIterObject
(or something that is a binary equivalent) to be passed in. The PyArrayMultiIterObject
keeps track of the broadcast number of dimensions and size in each dimension along with the total size of the broadcast result. It also keeps track of the number of arrays being broadcast and a pointer to an iterator for each of the arrays being broadcast.
The PyArray_Broadcast
function takes the iterators that have already been defined and uses them to determine the broadcast shape in each dimension (to create the iterators at the same time that broadcasting occurs then use the PyMultiIter_New
function). Then, the iterators are adjusted so that each iterator thinks it is iterating over an array with the broadcast size. This is done by adjusting the iterators number of dimensions, and the shape in each dimension. This works because the iterator strides are also adjusted. Broadcasting only adjusts (or adds) length-1 dimensions. For these dimensions, the strides variable is simply set to 0 so that the data-pointer for the iterator over that array doesn't move as the broadcasting operation operates over the extended dimension.
Broadcasting was always implemented in Numeric using 0-valued strides for the extended dimensions. It is done in exactly the same way in NumPy. The big difference is that now the array of strides is kept track of in a PyArrayIterObject
, the iterators involved in a broadcast result are kept track of in a PyArrayMultiIterObject
, and the PyArray_BroadCast
call implements the broad-casting rules.
Array Scalars¶
The array scalars offer a hierarchy of Python types that allow a one- to-one correspondence between the data-type stored in an array and the Python-type that is returned when an element is extracted from the array. An exception to this rule was made with object arrays. Object arrays are heterogeneous collections of arbitrary Python objects. When you select an item from an object array, you get back the original Python object (and not an object array scalar which does exist but is rarely used for practical purposes).
The array scalars also offer the same methods and attributes as arrays with the intent that the same code can be used to support arbitrary dimensions (including 0-dimensions). The array scalars are read-only (immutable) with the exception of the void scalar which can also be written to so that structured array field setting works more naturally (a[0]['f1'] = value
All python indexing operations arr[index]
are organized by first preparing the index and finding the index type. The supported index types are:
- integer
- newaxis
- slice
- ellipsis
- integer arrays/array-likes (fancy)
- boolean (single boolean array); if there is more than one boolean array as index or the shape does not match exactly, the boolean array will be converted to an integer array instead.
- 0-d boolean (and also integer); 0-d boolean arrays are a special case which has to be handled in the advanced indexing code. They signal that a 0-d boolean array had to be interpreted as an integer array.
As well as the scalar array special case signaling that an integer array was interpreted as an integer index, which is important because an integer array index forces a copy but is ignored if a scalar is returned (full integer index). The prepared index is guaranteed to be valid with the exception of out of bound values and broadcasting errors for advanced indexing. This includes that an ellipsis is added for incomplete indices for example when a two dimensional array is indexed with a single integer.
The next step depends on the type of index which was found. If all dimensions are indexed with an integer a scalar is returned or set. A single boolean indexing array will call specialized boolean functions. Indices containing an ellipsis or slice but no advanced indexing will always create a view into the old array by calculating the new strides and memory offset. This view can then either be returned or, for assignments, filled using PyArray_CopyObject
. Note that PyArray_CopyObject may also be called on temporary arrays in other branches to support complicated assignments when the array is of object dtype.
Advanced indexing¶
By far the most complex case is advanced indexing, which may or may not be combined with typical view based indexing. Here integer indices are interpreted as view based. Before trying to understand this, you may want to make yourself familiar with its subtleties. The advanced indexing code has three different branches and one special case:
- There is one indexing array and it, as well as the assignment array, can be iterated trivially. For example they may be contiguous. Also the indexing array must be of
type and the value array in assignments should be of the correct type. This is purely a fast path. - There are only integer array indices so that no subarray exists.
- View based and advanced indexing is mixed. In this case the view based indexing defines a collection of subarrays that are combined by the advanced indexing. For example,
arr[[1, 2, 3], :]
is created by vertically stacking the subarraysarr[1, :]
, andarr[3, :]
. - There is a subarray but it has exactly one element. This case can be handled as if there is no subarray, but needs some care during setup.
Deciding what case applies, checking broadcasting, and determining the kind of transposition needed are all done in PyArray_MapIterNew. After setting up, there are two cases. If there is no subarray or it only has one element, no subarray iteration is necessary and an iterator is prepared which iterates all indexing arrays as well as the result or value array. If there is a subarray, there are three iterators prepared. One for the indexing arrays, one for the result or value array (minus its subarray), and one for the subarrays of the original and the result/assignment array. The first two iterators give (or allow calculation) of the pointers into the start of the subarray, which then allows to restart the subarray iteration.
When advanced indices are next to each other transposing may be necessary. All necessary transposing is handled by PyArray_MapIterSwapAxes
and has to be handled by the caller unless PyArray_MapIterNew is asked to allocate the result.
After preparation, getting and setting is relatively straight forward, although the different modes of iteration need to be considered. Unless there is only a single indexing array during item getting, the validity of the indices is checked beforehand. Otherwise it is handled in the inner loop itself for optimization.
Universal Functions¶
Universal functions are callable objects that take inputs and produce outputs by wrapping basic 1-D loops that work element-by-element into full easy-to use functions that seamlessly implement broadcasting, type-checking and buffered coercion, and output-argument handling. New universal functions are normally created in C, although there is a mechanism for creating ufuncs from Python functions (frompyfunc
). The user must supply a 1-D loop that implements the basic function taking the input scalar values and placing the resulting scalars into the appropriate output slots as explained in implementation.
Every ufunc calculation involves some overhead related to setting up the calculation. The practical significance of this overhead is that even though the actual calculation of the ufunc is very fast, you will be able to write array and type-specific code that will work faster for small arrays than the ufunc. In particular, using ufuncs to perform many calculations on 0-D arrays will be slower than other Python-based solutions (the silently-imported scalarmath module exists precisely to give array scalars the look-and-feel of ufunc based calculations with significantly reduced overhead).
When a ufunc is called, many things must be done. The information collected from these setup operations is stored in a loop-object. This loop object is a C-structure (that could become a Python object but is not initialized as such because it is only used internally). This loop object has the layout needed to be used with PyArray_Broadcast so that the broadcasting can be handled in the same way as it is handled in other sections of code.
The first thing done is to look-up in the thread-specific global dictionary the current values for the buffer-size, the error mask, and the associated error object. The state of the error mask controls what happens when an error condition is found. It should be noted that checking of the hardware error flags is only performed after each 1-D loop is executed. This means that if the input and output arrays are contiguous and of the correct type so that a single 1-D loop is performed, then the flags may not be checked until all elements of the array have been calculated. Looking up these values in a thread- specific dictionary takes time which is easily ignored for all but very small arrays.
After checking, the thread-specific global variables, the inputs are evaluated to determine how the ufunc should proceed and the input and output arrays are constructed if necessary. Any inputs which are not arrays are converted to arrays (using context if necessary). Which of the inputs are scalars (and therefore converted to 0-D arrays) is noted.
Next, an appropriate 1-D loop is selected from the 1-D loops available to the ufunc based on the input array types. This 1-D loop is selected by trying to match the signature of the data-types of the inputs against the available signatures. The signatures corresponding to built-in types are stored in the types member of the ufunc structure. The signatures corresponding to user-defined types are stored in a linked-list of function-information with the head element stored as a CObject
in the userloops dictionary keyed by the data-type number (the first user-defined type in the argument list is used as the key). The signatures are searched until a signature is found to which the input arrays can all be cast safely (ignoring any scalar arguments which are not allowed to determine the type of the result). The implication of this search procedure is that "lesser types" should be placed below "larger types" when the signatures are stored. If no 1-D loop is found, then an error is reported. Otherwise, the argument_list is updated with the stored signature — in case casting is necessary and to fix the output types assumed by the 1-D loop.
If the ufunc has 2 inputs and 1 output and the second input is an Object array then a special-case check is performed so that NotImplemented is returned if the second input is not an ndarray, has the __array_priority__ attribute, and has an __r{op}__ special method. In this way, Python is signaled to give the other object a chance to complete the operation instead of using generic object-array calculations. This allows (for example) sparse matrices to override the multiplication operator 1-D loop.
For input arrays that are smaller than the specified buffer size, copies are made of all non-contiguous, mis-aligned, or out-of- byteorder arrays to ensure that for small arrays, a single loop is used. Then, array iterators are created for all the input arrays and the resulting collection of iterators is broadcast to a single shape.
The output arguments (if any) are then processed and any missing return arrays are constructed. If any provided output array doesn't have the correct type (or is mis-aligned) and is smaller than the buffer size, then a new output array is constructed with the special UPDATEIFCOPY flag set so that when it is DECREF'd on completion of the function, it's contents will be copied back into the output array. Iterators for the output arguments are then processed.
Finally, the decision is made about how to execute the looping mechanism to ensure that all elements of the input arrays are combined to produce the output arrays of the correct type. The options for loop execution are one-loop (for contiguous, aligned, and correct data type), strided-loop (for non-contiguous but still aligned and correct data type), and a buffered loop (for mis-aligned or incorrect data type situations). Depending on which execution method is called for, the loop is then setup and computed.
Function call¶
This section describes how the basic universal function computation loop is setup and executed for each of the three different kinds of execution. If NPY_ALLOW_THREADS
is defined during compilation, then as long as no object arrays are involved, the Python Global Interpreter Lock (GIL) is released prior to calling the loops. It is re-acquired if necessary to handle error conditions. The hardware error flags are checked only after the 1-D loop is completed.
One Loop¶
This is the simplest case of all. The ufunc is executed by calling the underlying 1-D loop exactly once. This is possible only when we have aligned data of the correct type (including byte-order) for both input and output and all arrays have uniform strides (either contiguous, 0-D, or 1-D). In this case, the 1-D computational loop is called once to compute the calculation for the entire array. Note that the hardware error flags are only checked after the entire calculation is complete.
Strided Loop¶
When the input and output arrays are aligned and of the correct type, but the striding is not uniform (non-contiguous and 2-D or larger), then a second looping structure is employed for the calculation. This approach converts all of the iterators for the input and output arguments to iterate over all but the largest dimension. The inner loop is then handled by the underlying 1-D computational loop. The outer loop is a standard iterator loop on the converted iterators. The hardware error flags are checked after each 1-D loop is completed.
Buffered Loop¶
This is the code that handles the situation whenever the input and/or output arrays are either misaligned or of the wrong data-type (including being byte-swapped) from what the underlying 1-D loop expects. The arrays are also assumed to be non-contiguous. The code works very much like the strided-loop except for the inner 1-D loop is modified so that pre-processing is performed on the inputs and post- processing is performed on the outputs in bufsize chunks (where bufsize is a user-settable parameter). The underlying 1-D computational loop is called on data that is copied over (if it needs to be). The setup code and the loop code is considerably more complicated in this case because it has to handle:
- memory allocation of the temporary buffers
- deciding whether or not to use buffers on the input and output data (mis-aligned and/or wrong data-type)
- copying and possibly casting data for any inputs or outputs for which buffers are necessary.
- special-casing Object arrays so that reference counts are properly handled when copies and/or casts are necessary.
- breaking up the inner 1-D loop into bufsize chunks (with a possible remainder).
Again, the hardware error flags are checked at the end of each 1-D loop.
Final output manipulation¶
Ufuncs allow other array-like classes to be passed seamlessly through the interface in that inputs of a particular class will induce the outputs to be of that same class. The mechanism by which this works is the following. If any of the inputs are not ndarrays and define the __array_wrap__
method, then the class with the largest __array_priority__
attribute determines the type of all the outputs (with the exception of any output arrays passed in). The __array_wrap__
method of the input array will be called with the ndarray being returned from the ufunc as it's input. There are two calling styles of the __array_wrap__
function supported. The first takes the ndarray as the first argument and a tuple of "context" as the second argument. The context is (ufunc, arguments, output argument number). This is the first call tried. If a TypeError occurs, then the function is called with just the ndarray as the first argument.
Their are three methods of ufuncs that require calculation similar to the general-purpose ufuncs. These are reduce, accumulate, and reduceat. Each of these methods requires a setup command followed by a loop. There are four loop styles possible for the methods corresponding to no-elements, one-element, strided-loop, and buffered- loop. These are the same basic loop styles as implemented for the general purpose function call except for the no-element and one- element cases which are special-cases occurring when the input array objects have 0 and 1 elements respectively.
The setup function for all three methods is construct_reduce
. This function creates a reducing loop object and fills it with parameters needed to complete the loop. All of the methods only work on ufuncs that take 2-inputs and return 1 output. Therefore, the underlying 1-D loop is selected assuming a signature of [ otype
, otype
, otype
] where otype
is the requested reduction data-type. The buffer size and error handling is then retrieved from (per-thread) global storage. For small arrays that are mis-aligned or have incorrect data-type, a copy is made so that the un-buffered section of code is used. Then, the looping strategy is selected. If there is 1 element or 0 elements in the array, then a simple looping method is selected. If the array is not mis-aligned and has the correct data-type, then strided looping is selected. Otherwise, buffered looping must be performed. Looping parameters are then established, and the return array is constructed. The output array is of a different shape depending on whether the method is reduce, accumulate, or reduceat. If an output array is already provided, then it's shape is checked. If the output array is not C-contiguous, aligned, and of the correct data type, then a temporary copy is made with the UPDATEIFCOPY flag set. In this way, the methods will be able to work with a well-behaved output array but the result will be copied back into the true output array when the method computation is complete. Finally, iterators are set up to loop over the correct axis (depending on the value of axis provided to the method) and the setup routine returns to the actual computation routine.
All of the ufunc methods use the same underlying 1-D computational loops with input and output arguments adjusted so that the appropriate reduction takes place. For example, the key to the functioning of reduce is that the 1-D loop is called with the output and the second input pointing to the same position in memory and both having a step- size of 0. The first input is pointing to the input array with a step- size given by the appropriate stride for the selected axis. In this way, the operation performed is
where is the number of elements in the input, , is the output, and is the element of along the selected axis. This basic operations is repeated for arrays with greater than 1 dimension so that the reduction takes place for every 1-D sub-array along the selected axis. An iterator with the selected dimension removed handles this looping.
For buffered loops, care must be taken to copy and cast data before the loop function is called because the underlying loop expects aligned data of the correct data-type (including byte-order). The buffered loop must handle this copying and casting prior to calling the loop function on chunks no greater than the user-specified bufsize.
The accumulate function is very similar to the reduce function in that the output and the second input both point to the output. The difference is that the second input points to memory one stride behind the current output pointer. Thus, the operation performed is
The output has the same shape as the input and each 1-D loop operates over elements when the shape in the selected axis is . Again, buffered loops take care to copy and cast the data before calling the underlying 1-D computational loop.
The reduceat function is a generalization of both the reduce and accumulate functions. It implements a reduce over ranges of the input array specified by indices. The extra indices argument is checked to be sure that every input is not too large for the input array along the selected dimension before the loop calculations take place. The loop implementation is handled using code that is very similar to the reduce code repeated as many times as there are elements in the indices input. In particular: the first input pointer passed to the underlying 1-D computational loop points to the input array at the correct location indicated by the index array. In addition, the output pointer and the second input pointer passed to the underlying 1-D loop point to the same position in memory. The size of the 1-D computational loop is fixed to be the difference between the current index and the next index (when the current index is the last index, then the next index is assumed to be the length of the array along the selected dimension). In this way, the 1-D loop will implement a reduce over the specified indices.
Mis-aligned or a loop data-type that does not match the input and/or output data-type is handled using buffered code where-in data is copied to a temporary buffer and cast to the correct data-type if necessary prior to calling the underlying 1-D function. The temporary buffers are created in (element) sizes no bigger than the user settable buffer-size value. Thus, the loop must be flexible enough to call the underlying 1-D computational loop enough times to complete the total calculation in chunks no bigger than the buffer-size.


text:
Black Cherry Soda 3.5G Mylar Bags Holographic
Material Holographic
Size Approximately 4x5 inches
Mylar bags allow your food investment to be stored in the best possible condition. They are are the perfect bags to store products while maximizing product freshness. Mylar bags are heat sealed, reusable ziplock bags designed to create a firm barrier between your product and the environment outside. It's as simple as inserting your goodies in the bag and sealing. Most commonly, mylar bags are used for long-term storage of dried, dehydrated foods and also herbs. By eliminating residual oxygen, it makes it the perfect bag to keep your long term food preserves freshly stored. Therefore, the long-term effects of heat, light, moisture, and oxygen are reduced dramatically or eliminated.

subset: commoncrawl


text:
These operators act on raw, logical and number-like vectors.
! x
x & y
x && y
x | y
x || y
xor(x, y)isTRUE (x)
For !
, a logical or raw vector(for raw x
) of the same
length as x
: names, dims and dimnames are copied from x
and all other attributes (including class) if no coercion is done.
For |
, &
and xor
a logical or raw vector. If
involving a zero-length vector the result has length zero. Otherwise,
the elements of shorter vectors are recycled as necessary (with a
when they are recycled only fractionally).
The rules for determining the attributes of the result are rather
complicated. Most attributes are taken from the longer argument, the
first if they are of the same length. Names will be copied from the
first if it is the same length as the answer, otherwise from the
second if that is. For time series, these operations are allowed only
if the series are compatible, when the class and tsp
attribute of whichever is a time series (the same, if both are) are
used. For arrays (and an array result) the dimensions and dimnames
are taken from first argument if it is an array, otherwise the second.
For ||
, &&
and isTRUE
, a length-one logical vector.
, &
and |
are S4 generics, the latter two part
of the Logic
group generic (and
hence methods need argument names e1, e2
indicates logical negation (NOT).
and &&
indicate logical AND and |
and ||
indicate logical OR. The shorter form performs elementwise
comparisons in much the same way as arithmetic operators. The longer
form evaluates left to right examining only the first element of each
vector. Evaluation proceeds only until the result is determined. The
longer form is appropriate for programming control-flow and typically
preferred in if
indicates elementwise exclusive OR.
is the same as
{ is.logical(x) && length(x) == 1 && !is.na(x) && x }
is defined analogously. Consequently,
may be preferable to if(cond)
of NA
In earlier R versions, isTRUE <- function(x) identical(x, TRUE)
had the drawback to be false e.g., for x <- c(val = TRUE)
Numeric and complex vectors will be coerced to logical values, with
zero being false and all non-zero values being true. Raw vectors are
handled without any coercion for !
, &
, |
, with these operators being applied bitwise (so !
the 1s-complement).
The operators !
, &
and |
are generic functions:
methods can be written for them individually or via the
(or S4 Logic
, see below)
group generic function. (See Ops
how dispatch is computed.)
is a valid logical object. Where a component of
or y
is NA
, the result will be NA
if the
outcome is ambiguous. In other words NA & TRUE
evaluates to
, but NA & FALSE
evaluates to FALSE
. See the
examples below.
See Syntax for the precedence of these operators: unlike many other languages (including S) the AND and OR operators do not have the same precedence (the AND operators have higher precedence than the OR operators).
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
and all
for OR and AND on many scalar
for operator precedence.
for bitwise versions for integer vectors.
y <- 1 + (x <- stats::rpois(50, lambda = 1.5) / 4 - 1)
x[(x > 0) & (x < 1)] # all x values between 0 and 1
if (any(x == 0) || any(y == 0)) "zero encountered"
## construct truth tables :
x <- c(NA, FALSE, TRUE)
names(x) <- as.character(x)
outer(x, x, "&") ## AND table
outer(x, x, "|") ## OR table
# }
Run the code above in your browser using DataLab


text:
After 30 years-some historians might say 100 years-of rhetoric about the "crisis" in American education, it's getting hard to come up with new ways to frighten the public about the state of American schools. So maybe it's understandable that the Council on Foreign Relations chose a foreboding title for its March report: "U.S. Education Reform and National Security." The message is even blunter in one of the chapter titles, "The Education Crisis Is a National Security Crisis." The council points to a slew of subpar standardized test scores as well as to the surprising fact that 75 percent of young people don't qualify for military service. (Education is hardly the only reason for that; criminal records and lack of physical fitness can also be disqualifiers.) The solutions recommended by the council task force, co-chaired by former Secretary of State Condoleezza Rice and former New York City public-schools chief Joel Klein, are almost as well worn as the crisis talk: Parents need more vouchers, which let them use public dollars for private schools; teachers need to be easier to fire; and we all need more charter schools.
"I think we should raise the alarm level," Klein told PBS NewsHour. "When a secretary of state calls this out as a national-security issue … I think we need to stop thinking this is somehow a narrow education problem and we will all be fine."
The message, boiled down, has a familiar ring: Schools have failed, and we desperately need alternatives-or we will not be fine. Based on the urgent tone, you might think that lawmakers had been ignoring the education-reform movement. But the reformers' policy agenda has been widely embraced. Between 1999 and 2009, the number of American students in charter schools tripled. Vouchers also experienced a boom, with 19 states now offering programs. Several states have made it easier to fire teachers.
No conclusive evidence shows that any of these reforms have worked. But that has not slowed the movement. In Louisiana, Republican Governor Bobby Jindal recently pushed through one of the most radical education-reform bills in the country. Louisiana's long-struggling schools have shown significant improvement in recent years. Not fast enough, though. Jindal and the legislature adopted every major plank of the education-reform platform: decreasing teachers' job protections and allowing superintendents to tie their salaries to test results; dramatically expanding the charter-school program; and offering private-school vouchers to 380,000 low- and middle-income students. In Georgia, voters will decide in November if the state should implement a charter system parallel to the traditional school system; never mind a recent report to the state's Board of Education showing that charters trail traditional schools in test performance. Across the country, in blue and red states alike, the thinking seems to be: With schools so hopeless, what's there to lose?
In fact, there's plenty to lose. For all their troubles, traditional public schools are performing well by many measures, and studies show that charters are performing no better. While achievement gaps between racial and ethnic groups persist, for instance, they have narrowed substantially. Between 1975 and 2010, the high-school completion rate for black students rose from 71 percent to 90 percent; for Hispanics, the rate increased from 53 percent to 69 percent. (Dropout rates for whites are lower as well.) The National Assessment of Educational Progress, a longitudinal study of student performance, also shows significant gains in math, particularly in elementary schools.
No one questions that public education can and should improve. But the crisis hyperbole drowns out nuanced conversations about what's actually happening in the schools. Why, for instance, are American students improving in math but not reading? Why have elementary schools been able to do better while high schools haven't? And why do countries less obsessed with testing produce higher-achieving students?
If lawmakers and activists left behind the doomsday rhetoric, we could have a different conversation. Instead of blaming teachers entirely for gaps in achievement, we could talk about social-welfare policies, like a living wage, that could give parents more time to help with homework. Rather than focusing almost exclusively on test results in reading and math, we could focus on a broader curriculum that emphasizes critical thinking; we could take another look at lab sciences, music, art, and other areas that get short shrift because of the primacy of standardized tests. Most important, we could stop seeking a magical panacea and instead work toward solving the genuine problems of public schools. If we don't, we'll eventually end up with a real crisis on our hands.


text:
Second of a two-part series. Read Part 1
Every profession has its symbols of success. For opera singers, it's performing at La Scala or the Met. For mountain climbers it's making it to the top of Everest. For scientists, if you get two papers published in the same issue of a prestigious journal like Nature, you're hot.
So when an Australian named Scott O'Neill had two papers published in Nature last year describing his big idea for combating a disease called dengue, the world took notice. O'Neill is a medical entomologist and dean of the faculty of science at Monash University in Melbourne.
"We were getting bombarded by people around the world, from different governments, wanting us to come work in their countries because people are so desperate for something to try and stop dengue," says O'Neill.
Dengue is nasty. It's transmitted by a mosquito and can be a deadly disease. But even if it doesn't kill you, it knocks you out with a week or more of high fever and a pounding headache. Billions of people around the world are at risk for getting dengue if they get bitten by a mosquito carrying the dengue virus.
O'Neill's big idea for stopping dengue didn't involve a vaccine or a medicine. Instead, it involved attacking the mosquito that transmits the disease.
There are two parts to the idea. First, find a way to treat mosquitoes in the lab so they could no longer transmit dengue. That took him more than a decade to figure out. And five years ago, O'Neill finally managed to do it.
Next, release those dengue-proof mosquitoes and show that they will not only survive outside the lab but actually drive out the native population of mosquitoes that can transmit dengue. That's what O'Neill showed in those two Nature papers last year.
Now, I say O'Neill has done this, but that's misleading, because science is now a team sport. "We don't work in isolation in any projects in science these days," he says. "The days of having someone beavering away by themselves in the backroom have long gone, I think. So we're working in large teams always."
The days of having someone beavering away by themselves in the backroom have long gone.
O'Neill's team is also spread around the world — he has collaborators in the United States, Brazil, Vietnam and Thailand, and in the tiny town of Babinda in northeastern Australia, where I went to visit.
Babinda's main claim to fame is winning the Golden Gumboot. A gumboot is the Australian term for a waterproof boot, what the Brits call a Wellington. The Golden Gumboot is a tongue-in-cheek award given each year to the Australian town that gets the most rain.
O'Neill's team here drives through the community in a minivan, releasing lab-reared mosquitoes. Martin Durkan is on the mosquito release team. When his day starts, there are dozens of small plastic containers in the back of the van, each with about two dozen of O'Neill's mosquitoes. I watch as he drives up to a house, jumps out, walks over to the front yard, and pries the lid off the container. "And away they go," he says. "The little angels are flying."
The Challenge Of Managing Science
These little angels are the key to combating dengue. The mosquitoes native to Babinda can transmit dengue. Scott's little angels can't. If the angels can take over from the natives, then in theory there will be no more dengue in Babinda. Not that there was ever a lot of dengue here, but you've got to start somewhere.
So how do you know if the angels are winning? Well, you could ask, but sometimes it's hard to tell what mosquitoes are saying. So a better way is to collect mosquito eggs. By analyzing the eggs, you can tell whether they came from O'Neill's angels, or the local riffraff.
The analysis is done in O'Neill's's lab at Monash University, where the mosquito eggs are ground up and put into a machine that will show whether the eggs are from those nasty wild mosquitoes or whether they are descendants of O'Neill's's angels.
So far this year, it looks like the angels are taking over from the natives. But it just as easily could have gone the other way.
O'Neill couldn't have found that out without relying on his team. He told me he's seen a lot of science projects fall over because teams couldn't hang together. "Finding a way to manage a group of people who are all quite individualistic and having them work together towards this common goal is critical," he says. "So I think there's a big management component to science that's not fully appreciated."
By all accounts O'Neill is a pretty good manager. But that means at times telling people things they don't want to hear. Michael Turelli, who works at the University of California, Davis, and is a devoted member of O'Neill's team, says O'Neill is a great team leader, "but that means that if part of the team isn't working, that part of the team is cut off without ceremony. I've seen him do that. And he does it in a way that people aren't offended. They realize, 'Yes, you can't give me another million dollars, because I haven't produced anything.' So that's that."
O'Neill is moving into a critical stage of his project — he's got his special mosquitoes, he's shown they can take over in the wild, but he still has to show they can stop dengue. That's going to mean taking on a bigger challenge: releasing them in countries like Vietnam and Thailand, where dengue is a huge problem.
The Balance Between 'Self-Promotion' And 'Cautious Conservatism'
O'Neill's colleague Scott Ritchie old me about another challenge O'Neill faces that has nothing to do with management. It's about how you portray your work. He says take the name they have given their project: Eliminate Dengue.
"That's really putting yourself up there," says Ritchie, "to say that we're going to eliminate dengue. And I think a lot of scientists are saying, 'Yeah, you bet. I'll bet you haven't thought of this, you haven't thought of that, you're making big promises before you've got the evidence to say that you're going to do it.' On the other hand, a name like that draws attention. It's certainly generated a lot of attention in the media. I mean, you're here, Joe. So I think you need to find this balance between self-promotion, but also a bit of cautious conservatism."
It's the entrepreneur in O'Neill that made him choose a bold name like Eliminate Dengue. He knows there are risks.
"We need the exposure; we need people to know about what we're doing. We want to have communities supporting what we're doing. But at the same time we need to be careful," says O'Neill. "This has the potential be difficult for the team, if it comes across that this is all Scott's idea and it's all because of Scott."
O'Neill and his colleagues have learned a lot in the past 20 years. And a goal as big as this, to change an entire species of mosquitoes in the world, could take another 20 years.
"Success for me is having an impact on dengue disease in communities. That's what we're really looking for," says O'Neill.
Copyright 2021 NPR. To see more, visit https://www.npr.org.


text:
Sign-on Letter for AL inclusion in S. 1668
Honorable Richard Shelby, We the undersigned, join with Mobile County Commissioner Mike Dean, the Mobile County Community Development (CDBG) Grant Administrator and three Alabama Advocacy groups who wrote July 2, 2007 (attached) to ask that you as the Ranking Member of the Senate Banking, Housing and Urban Affairs Committee, \"support the proposed Gulf Coast Recovery Act of 2007, S. 1668, and work with your colleagues to include funding for Alabama in this bill.\" The July 2 letter states that Alabama\'s share of federal Katrina CDBG housing recovery funds \"cannot even fulfill the unmet needs of Mobile County, much less the other Alabama counties impacted by Katrina.\" The Mobile County officials and advocacy groups reached their conclusion based on figures from on-site visits by a licensed inspector for 726 of the current 1,200 CDBG applications in the City and County of Mobile. Their July 2 letter also reveals: -81 of the 726 inspected Mobile County CDBG applicants had their homes completely destroyed or so severely damaged by Katrina that rebuilding is more cost effective (subsequent research by Alabama Appleseed found that: 171 of these families homes were destroyed; 39% have annual household incomes of $15,000 or less; 31% of the families live with a disabled person; and 166 of these households are headed by an elderly person). -Current funding will serve fewer than 10% of the 1200 families who applied from the City and County of Mobile. -In addition to the current 1,200 CDBG applicants, there are likely hundreds of others who did not make the deadline for the CDBG applications that were distributed in January 2007. (An earlier letter to Bill Johnson of ADECA, signed by 45 organizations and 343 individuals, describes the unfair deadlines as well the lack of a comprehensive unmet needs assessment for Alabama Katrina Victims, posted at www.alarise). The lack of a comprehensive assessment of unmet needs has a direct impact over one third of the 1200 families who applied for Katrina assistance: the July 2 letter explains that the Mobile County Commission, \"currently suspended inspections for the remaining 474 applications citing the limited amount of CDBG funds available for housing assistance.\" One of the 1200 applications not inspected belongs to Fay Lee of Coden, Alabama. The November 8, 2007 Montgomery Advertiser guest editorial, co-authored by Jim Fuller (himself a Katrina Survivor), retells the story of Mrs. Lee\'s daughter, Caleigh, who was interviewed by WKRG TV of Mobile. She was 9 years old when Hurricane Katrina destroyed their home and has spent the last of her childhood and the beginning of her adolescence \"crammed up\" and \"with no privacy\", living with as many as seven family members in a FEMA camper. Caleigh has seen her parents, who both work full time, living in a shed so that she and her brother can have more room in the camper. In the same TV interview, Caleigh\'s father, Tommy Lee, states that FEMA backed off their agreement to sell the camper and wants his wife and children to move from their property and the community where they have had ties for generations. A Katrina CDBG grant could rebuild the Lee\'s home, but Alabama was not allocated enough funds to serve this family, nor hundreds of other similarly situated families in Alabama, who have not even had their needs documented. We should all ask ourselves: What kind of a message is our state and country sending to children like Caleigh Lee and the rest of her community Jim Fuller thanked you in his October 21 Press Register op-ed for reserving front row seats for thirteen Alabama Katrina Survivors and their advocates at the Senate Banking, Housing, and Urban Affairs Committee in September. They included: South Bay Communities Alliance representing unincorporated south Mobile County; SOS Boat People of Bayou La Batre, where many elders and children still suffer in hurricane damaged homes; and Bay Area Women\'s Coalition from the historic African American community of Trinity Gardens in Mobile -- where 80 families are in a critical situation facing another wet, cold winter still depending on ragged tarps that replaced the roofs Katrina tore off 27 months ago. The Alabamians joined 24 other Katrina Victims and allies from the Equity and Inclusion Campaign from Louisiana and Mississippi. The Senate hearing reviewed the Gulf Coast Housing Recovery Act (S1668), and Mr. Fuller wrote in his Press Register guest editorial: \"We were encouraged when we heard the senator, on national television, acknowledge our unmet needs. Our optimism grew further when he secured a commitment from Louisiana Sen. Mary Landrieu, co-author of the bill, that Alabama\'s Katrina victims would be covered in her bill.\" The National Low Income Housing Coalition (NLIHC) in Washington DC issued a press release on the second anniversary of Katrina stating that Hurricanes Katrina and Rita damaged one million homes in four states, and that 300,000 homes were destroyed. Almost three-quarters of the totally destroyed homes were classified as \"affordable to low income\"; and over 100,000 mostly low income families remain displaced. This national advocacy group asks that you support the bill which could \"assist the many Alabamians who are still displaced.\" In addition to the bi-partisan political commitment to bring long promised federal funds to the region, substantial community support exists for S.1668 and the housing and economic recovery it offers. Developers, homeowners and businesses appreciate its flexibility for mixed-income community construction, Road Home resources and workforce housing, respectively. Furthermore, over 100 national and local non-profits have endorsed the bill, including faith-based organizations such as: Catholic Charities; the Religious Action Center for Reformed Judaism; Unitarian Universalist Association of Congregations; Bayou Interfaith Shared Community Organizing (BISCO); Mississippi Interfaith Disaster Task Force; People Improving Communities Through Organizing- Louisiana Interfaith Together (PICO-LIFT); Project Lazarus, and Providence Community Housing. Passage of The Gulf Coast Recovery Act, S 1668, and with adequate provisions for Alabama, could send the message that Caliegh Lee\'s family and the thousands of others on the Gulf Coast desperately need to hear - that she and her family are worthy of assistance, and that her state, her country, her fellow citizens will not let her down. Sincerely,


text:
This new Project "Demonstrating Best Practice in Raised Bog Restoration in Ireland" – No. : LIFE09 NAT/IE/000222 is a nature conservation project jointly funded by EU DG-Environment, the Department of Arts, Heritage and the Gaeltacht and Coillte (The Irish Forestry Board) under the EU LIFE-Nature Programme.
The project is being managed by Coillte and focuses on the restoration of 636 ha of raised bog habitat on 17 Coillte owned sites within the Natura 2000 Network and in Natural Heritage Areas. This project implements best practice restoration techniques developed in Coillte's previous Raised Bog Restoration Project (LIFE04 NAT/IE/000121).
Coillte acknowledges the funding received from the EU LIFE-Nature programme and from NPWS (Department of Arts, Heritage and the Gaeltacht) without which this project would not be possible.


text:
The May Board of Directors Meeting will be held on Monday, May 9, 2022 @ 6 PM at St. John's Episcopal Church, 2827 Wheat Street, in the Dining Room.
Pizza and beverages will be provided.
If no street parking is left on Wheat Street, the parking lot is in the rear of the church off of Holly St.
All board members are expected to be present; all members are welcome and encouraged to attend.
New Members - Remember that attending a club board meeting is one of the requirements for the GEM (Good Enthusiastic Member) Award.


text:
Stone Disease Stone Types Stone Remedies superb video by Nagjibhai Asodariya
Ayurveda remedies for stones read more information
Getting Sindhav-salt in lemon juice and drinking it standing up dissolves the stones.Calculus is an important kidney disease seen in many patients. Stones can cause excruciating pain but many patients do not have any discomfort despite having stones.
In some patients, stones can lead to urinary tract infections and kidney damage if not treated in time. It is very common to have stones once and for all. So it is important to know about stones and how to prevent them.
What is a stone?
Calcium oxalate or crystals in the urine combine with each other to form a hard substance in the urethra in the long run, known as stones.
What are the stones? What does it look like? Where is it found in the urethra?
Stones in the urethra vary in size, from as small as a grain of sand to as large as a ball. Some stones are round or elliptical and smooth on the outside. This type of stone is less painful and can be easily excreted naturally through urine.
Adding Sindhav-salt in cow's milk whey and drinking it daily in the morning for 215 days, the stones are excreted through urine and it is relaxed.
Licking the powder of gokharu in honey dissolves the stones.
A fine bowl of boron is crushed with water and the stone is crushed and excreted in the urine.
Getting lemon juice in coconut water and drinking it every morning removes stones.
Drinking karela juice with buttermilk removes stones.
Extracting the juice of radish leaves, adding surokhar in it, drinking it daily dissolves stones.
Drinking scaffold vegetable juice dissolves stones.
Drinking old jaggery and turmeric in buttermilk dissolves stones.
Drinking a decoction of black grapes dissolves stones.
Soaking 20 grams of kal at night, masali in the morning, straining the water in the morning every day removes stones.
Making a soup of kalthi and drinking it with a pinch of salt dissolves the stones and the terrible pain caused by the stones disappears.
Take four tolas of radish seeds and boil them in half a share of water. When half of the water is left, the stones are dissolved by drinking the extracted water.
Boil wheat and chickpeas together, add a pinch of sorghum to it and drink it.
Drinking a decoction of henna leaves removes stones.
After removing the corn kernels, simply burn the doda, make its ashes, take 1 gram of this ashes with water in the morning and evening, the pain of stones is stopped by urinary retention.


text:
Styx: Master of Shadows Screens, Info, Teaser Trailer
An infiltration game with RPG mechanics
News: First Teaser Trailer Released for Styx: Master of Shadows – February 14, 2014
Trailer Added February 14, 2014
Cyanide Studio and Focus Home Interactive have released the first official screenshots from Styx: Master of Shadows.
Styx, the game's playable character, is a 200-year-old Goblin. He's the *original* Goblin, in fact. He's a master of stealth, theft and murder.
Accompany Styx as he battles his way to the top of the miles-high, vertiginous and heavily-fortified Tower of Akenash. Along the way, complete missions having various objectives and gradually reconstruct a puzzle that unlocks the mystery of Styx's origins.
The game's levels are open and can be completed in more than one way. You must remain undetected at all times, however, as guards, soldiers and other Tower-protectors will adapt their behavior dynamically in response to your actions.
Styx: Master of Shadows , which will feature the game mechanics of an RPG, will be released sometime in 2014.


text:
Home > Unicorn > Sprinkles the Unicorn Poncho
Don't let the rain dampen your spirits. Clear the clouds and put a smile back on everyone's face with a super Unicorn Poncho designed to keep you both stylish and dry no matter how much the rain pours down! It's a well-known fact that unicorns are magic – and you'll feel magic too as you dance away in the dry as the rain comes down.
This plastic Unicorn Poncho will make sure you're a festival trendsetter and give you the chance to enjoy the tunes no matter how wet it gets. Mystic!
© Copyright 2006-2022 Gift Republic Ltd.


text:
New York struggles back 2 days after killer storm
Published 1:00 pm Thursday, November 1, 2012
Flights resumed, but slowly. The New York Stock Exchange got back to business, but on generator power. With the subways still down, great numbers of people walked across the Brooklyn Bridge into Manhattan in a reverse of the exodus of 9/11.
Two days after Superstorm Sandy rampaged across the Northeast, killing at least 62 people, New York struggled Wednesday to find its way. Swaths of the city were still without power, and all of it was torn from its daily rhythms.
At luxury hotels and drugstores and Starbucks shops that bubbled back to life, people clustered around outlets and electrical strips, desperate to recharge their phones. In the Meatpacking District of Manhattan, a line of people filled pails with water from a fire hydrant. Two children used jack-o'-lantern trick-or-treat buckets.
Gov. Andrew Cuomo said that parts of the subway would begin running again Thursday, and that three of seven tunnels under the East River had been pumped free of water, removing a major obstacle to restoring full service.
"We are going to need some patience and some tolerance," he said.
On Wednesday, both were frayed. Bus service was free but delayed, and New Yorkers jammed on, crowding buses so heavily that they skipped stops and rolled past hordes of waiting passengers.
New York City buses serve 2.3 million people on an average day, and two days after the storm they were trying to handle many of the 5.5 million daily subway riders, too.
As far west as Wisconsin and south to the Carolinas, more than 6 million homes and businesses were still without power, about 4 million of them in New York and New Jersey.
Mayor Michael Bloomberg said 500 patients were being evacuated from Bellevue Hospital because of storm damage. The hospital has run on generators since the storm. About 300 patients were evacuated from another Manhattan hospital Monday after it lost generator power.
Still, there were signs that New York was flickering back to life and wasn't as isolated as it was a day earlier.
Flights resumed at Kennedy and Newark airports on what authorities described as a very limited schedule. Nothing was taking off or landing at LaGuardia, which suffered far worse damage and still had water on the runways.
The stock exchange, operating on backup generators, came back to life after its first two-day weather shutdown since the blizzard of 1888. Mayor Michael Bloomberg rang the opening bell to whoops from traders below.
"We jokingly said this morning we may be the only building south of midtown that has water, lights and food," said Duncan Niederauer, CEO of the company that runs the exchange, in hard-hit lower Manhattan.
Most Broadway shows returned for Wednesday matinees and evening shows.
Across the Hudson River in New Jersey, National Guardsmen in trucks delivered ready-to-eat meals and other supplies to heavily flooded Hoboken and rushed to evacuate people from the city's high-rises and brownstones. The mayor's office put out a plea for people to bring boats to City Hall for use in rescuing victims.
Natural gas fires erupted in Brick Township, where scores of homes were wrecked by the storm. Some of the state's barrier islands, which took a direct hit from Sandy on Monday night, remained all but cut off.
President Barack Obama took a helicopter tour of the ravaged coast with New Jersey Gov. Chris Christie.
In New York, masses of people walked shoulder-to-shoulder across the Brooklyn Bridge to get into Manhattan for work, reminiscent of the escape scenes from the Sept. 11 terrorist attack and the blackout of 2003.
They entered an island sharply divided between those who had power and those who did not.
In Manhattan at night, it was possible to walk downtown along an avenue and move in an instant from a mostly normal New York scene — delis open, people milling outside bars — into a pitch-black cityscape, with police flares marking intersections.
People who did have power took to social media to offer help to neighbors.
"I have power and hot water. If anyone needs a shower or to charge some gadgets or just wants to bask in the beauty of artificial light, hit me up," Rob Hart of Staten Island posted on Facebook.
A respected New York steakhouse in the blackout zone, Old Homestead, realized its meat was going to go bad and decided to grill what was left and sell steaks on the sidewalk for $10. A center-cut sirloin usually goes for $47.
Simon Massey and his 9-year-old son, Henry, took one last walk near their powerless apartment in downtown Manhattan before decamping to a friend's place in Brooklyn where the electricity worked.
"We're jumping ship," he said. "We gorged on eggs and sausage this morning before everything goes bad. We don't want to spend another three or four days here."
They live on the 10th floor of a 32-floor building, where they were flushing the toilet with water from their filled tub and cooking on their gas stove. They found their way down the stairs with glowsticks and flashlights, and rationed iPad and phone use.
"I'm feeling scared," said Henry, who was home from third grade for a third straight day. "It just feels really, really weird. New York's not supposed to be this quiet."


text:
Transtherm MANOIR Full Glass Door, Storage Layout
Full Glass Door - Storage Layout
Dedicated to wine aging, Transtherm single temperature cabinets are designed to maintain a constant temperature between 10 ° C and 14 ° C (adjustable from 6 ° C to 18 ° C).
This ensures that your bottles age under optimal temperature and hygrometry conditions (Thermodynamic pump principle).
Technical advantages
- Combines technology / performance with respect for the environment
- Stable temperature thanks to double regulation Hot / Cold
- Optimized hygrometry thanks to a warmer and humid air intake
- Circulation of air ensured by the principle of the thermodynamic pump.
- No vibration thanks to the slow-cycle compressor mounted on silent blocs.
- Storage Layout
- Bottle capacity 166 bottles (Bordeaux Bottles)
- Dimensions H x W x D(mm) 1479x680x690
Instrument panel with display of different temperatures and lighting.
Combinations of Transtherm
Cabinets of the same size can be positioned with opposite hinges to give the impression of a large double-door unit. Single temperature, 3-temp and Multi-temp cabinets can be paired together, as long as they are at the same height.
Delivery Information - Click here
Delivered from our UK warehouse, with a 2 man premium home delivery service.
*Please contact us directly for delivery quotes to Scotland, Ireland and UK Islands
- Availability: 7-9 Weeks, if not in stock (Made to order)*
- Warranty: 2 Years
- Manufactured in: FRANCE
- Door Hinge: Right or Left (reversible)
* We try to hold a small amount of stock of these cabinets but please check first to find if product is available. Please note August factory closers means extended lead times July-September


text:
Going overseas to Turkey now, a country that has long sought to enhance its reputation as an international destination. The latest rebranding move - a new name. The U.N. has agreed to register Turkiye as the country's official name. NPR's Peter Kenyon reports that locals aren't sure what difference it makes.
PETER KENYON, BYLINE: The promotional campaign for the name change has been underway for some time, with videos like this one from Turkish Airlines featuring people saying the new name over and over.
UNIDENTIFIED PEOPLE: Hello, Turkiye.
KENYON: President Recep Tayyip Erdogan's government hopes the rebranding will give a boost to the economy as visitors start to return in large numbers after two pandemic-depressed tourist seasons. Some also wish to dissociate the country's name from the bird that traditionally appears on American dining tables at Thanksgiving and from the slang definition of a turkey as something that doesn't work or is foolish. It's not that much of a change for locals. The new name for Turkey is simply the way it's always been spelled and pronounced in Turkish. One observer noted it would be similar to calling Germany Deutschland. Turkish foreign policy analyst Yoruk Isik says this looks to him like a move to distract people from the long list of problems facing the country.
YORUK ISIK: Turkey is crumbling under possibly the biggest financial crisis since the Second World War. Our two neighbors are at war with each other. There is world food security crisis. And this is the moment we decide to change the country's name?
KENYON: To date, most international media, including NPR, have not adopted the change, but the souvenirs visitors will be hauling home from Istanbul's Grand Bazaar, will say, made in Turkiye. And people in Turkey will be wondering what the government's next move might be before Erdogan stands for reelection sometime in the next several months.
Peter Kenyon, NPR News, Istanbul.
(SOUNDBITE OF MURAT TUGSUZ'S "DESERT DREAM") Transcript provided by NPR, Copyright NPR.


text:
8 Core Processor
This is our brand new flagship device. The high level 8 core processor model. It boasts 4GB of RAM (can also upgrade to 8GB RAM). Keeping the unit incredibly responsive and easily capable of handling a whole load of tasks. It also boasts 64GB storage (can be upgraded to 128GB with the 8GB upgrade). On top of these amazing specs, we now have it running with a 8 core Qualcomm Snapdragon processor. And this flagship also has a 4G compatible SIM card slot.
Only Top Quality and Build Units
In the current market, there are now many cheaply built replica units which look similar to ours but have extremely poor internals and parts such as thin flimsy metal frames and cheap plastics.
We at Droid UK supply only the top quality, top of the range units with the best verified specs, and without the high price tags. We are also frequently the first ones to come out with new releases, specs and products, where others across the world then eventually try to follow.
Unfortunately, in the current market, there are many low-grade, low-quality, cheaply built products which are flooding the market, many with even fake specifications! Which is why it is always important to choose a highly reputable and trusted source like Droid UK to avoid any disappointments.
This Unit Is Plug And Play And Does Not Require Any Coding
This is for cars which have an original iDrive unit. For E9X cars without iDrive, you need to order a different system from us
You must have a working AUX for this to work with your car
Built-in Apple CarPlay and Android Auto Functionality…
Download any apps from Google Playstore.
YouTube, Spotify, Netflix and hundreds more!
Optional Extras…
Reverse Camera
This is our OEM style bootlid handle reverse camera, Our cameras are top quality build and look, with excellent picture quality, and integrate with the car exceptionally well. This add on also works along side your steering to show steering guides on screen, without the need for any coding. Your bootlid handle switch will of course function the exact same way too. (NOTE: If your car already has a reverse camera, you will not need to buy this, your existing camera will continue to work with the system just fine)
GPS Splitter
Our packages come with a GPS antenna included as standard, which works great and allows your car to have a fully working navigation.
But for those who want an even more precise and accurate GPS signal, you can use your cars existing GPS antenna. This cable allows you to connect your cars GPS antenna to the android unit. (NOTE: Your car must already have sat nav for this cable to be of any use, if your car does not already have sat nav, then you can still use the provided GPS antenna which is still great to use)
DAB Radio Pack
This add on allows your car to receive DAB radio stations. it requires a antenna (included) to be stuck onto the glass. Good upgrade for those who would like to listen to DAB Radio stations. (NOTE: If your car already has DAB, you will not need to get this upgrade. As with all your other existing features, your existing DAB radio will continue to work just as normal)
Frequently Asked Questions…
Q. Do I need to modify my car like cut my dashboard? Or do any
coding for this to work with my car?
A. Not at all. This unit will be 100% plug and play, you do not need to make any modifications like cutting of the dash and you do not need any coding work.
Q. Am I going to lose my original BMW menu and features with this?
A. Absolutely not, with our upgrade, ALL your original BMW menus and features will still be fully accessible and working. You will not lose anything you currently have, you only gain the countless new features.
Q. I do not know if my car is CCC, CIC, NBT, or EVO. What should I do?
A. Not to worry, We will figure this out ourselves, just give us your vehicle year when you order, and if we need more information we will contact you.
Q. My current iDrive unit is having problems or it does not work. Will your upgraded system fix my existing problems?
A. No. For this to work with your car, you need to have a working system already in your car, with a working AUX. Our unit works alongside your existing system, so any problems you have will still exist after this upgrade.
Q. Where are you based? And where will the item be shipped from?
A. We are genuine UK based. All item will be shipped from the UK. Unlike other sellers who claim to be from UK but are based overseas.
Q. I currently have the small screen in my car, is this compatible?
A. Yes absolutely. It is a huge upgrade for cars which have both the small screen and the large screen.
Q. Are all the necessary cables etc included in the package? Will I have to buy anything additional to make this work?
A. Everything you need to install this is included in the package. You will not need to buy anything additional to make this work as long as you have a working iDrive and AUX is working.
Q. Does my car need a working AUX for this to work? And if I do not have a working AUX, what can I do?
A. Yes, your car does need to have a working AUX for this to work with your car. If your car does not have a working AUX, then there is still a easy solution which will involve retrofitting the AUX to your car. Contact us for more details.
Q. I have heard sound quality is bad on these upgrades, is this true?
A. Definitely not. The sound quality on our units are excellent. We have some of the best quality and build units on the market. Other suppliers units do suffer from bad audio due to poor build quality and internals but our units do not suffer from this, this is why we are far superior.
Q. Your products on your main website are cheaper than you have listed them elsewhere, why is this?
A. Selling platforms have high selling fees which must be covered. This is why it is cheaper when buying from our website direct.
Q. Are things like DAB, or Reverse camera etc, included In the unit price?
A. No, unless otherwise stated, these are optional extras which are available to order with the units.
Q. My car does not currently have navigation, will this upgrade
give my car navigation?
A. Yes absolutely. The package comes with GPS included so this enables your car to have sat nav. You can then download apps such as Google Maps or Waze etc to use with the device.
Q. Do I have to pay customs?
A. If you are in the UK then no you do not have to pay any customs charges as the item is sent from the UK. If you are outside of the UK then customs charges may apply. In this case please check the rates with your countries customs laws.
Q. Is the unit difficult to install? Could I do it myself? Do you provide support for the installation?
We recommend using a professional to install the device. We provide full installation services for all our products. We also provide full support and guidance for the install of the item, ranging from install videos, support via messenger, support via phone call, and even support via video call. Our aftercare service is unmatched.
Q. What if I have problems or questions at any point?
The aftercare service is something we strongly and firmly believe in. This is where we excel above the rest. Our aftercare service is first class. We will be there to help usually 7 days a week and till late in the evening. Many others simply want to sell you their goods and be on their way. But we are always working on hand to answer any questions and help with any setting up of the units or problems and even just general talk about the units. You would never be just left on your own.
Q. I still have more questions, what should I do?
You can contact us via, messenger, call us, Whatsapp up etc, with anymore
questions and we will gladly help.


text:
And bless you us D I and Y are the key letters here as Fightmilk are hearty warriors on an underground scene currently bristling with C86-loving indie kids and hand-crafted communal live shows from The Gunners up north to the George Tavern out east and several gloriously shabby boozing points in between. Better still its safe to say that Fightmilk have a certain way with a berserkly self-deprecating lyric and a pithy put down. Dont you wanna do me? / I would wanna do me! shouts singer Lily Rae in Pity Party like the long-lost half-pissed lovechild of Eddie Argos and Louise Wener tossing crushed clumps of birthday cake at the crowd.
We saw Fightmilk play a fizzy Pandamonium show at The Victoria in January with Purs. And then we saw them again at The Hunter Club in west Suffolk in the spring. This makes them the first band to ever sign to fierce panda on the back of a gig in Bury St Edmunds which is charming and off-kilter and weirdly instinctive a bit like Fightmilk themselves. Or as they say in their own words:
Fightmilk formed in mid-2015 after a string of breakups mundane jobs and Carly Rae Jepsen-soundtracked dance parties. Our songs are about getting drunk with the right people and falling in love with the wrong ones. We leave odd time signatures or tricky chord changes to other people. Not enough people are making pop music anyway. You can dance to all of our songs apart from the slow ones though we'd like you to try and dance to those too."
We've done shows with Desperate Journalist Alex Chilltown Petrol Girls and Dingus Khan amongst others and self-released an EP and a festive charity single last year. We're planning to get an album out at the start of 2018 which we hope will be as good as EMOTION but with more guitars and swearing.
Fightmilk consist of the following four people. Accept no substitutes. Lily Rae (vocals/guitar) Alex (guitar/vocals) Adam (bass) Nick (drums).


text:
Provided by: systemd_252.5-2ubuntu3_amd64
systemd.path - Path unit configuration
A unit configuration file whose name ends in ".path" encodes information about a path monitored by systemd, for path-based activation. This man page lists the configuration options specific to this unit type. See systemd.unit(5) for the common options of all unit configuration files. The common configuration items are configured in the generic [Unit] and [Install] sections. The path specific configuration options are configured in the [Path] section. For each path file, a matching unit file must exist, describing the unit to activate when the path changes. By default, a service by the same name as the path (except for the suffix) is activated. Example: a path file foo.path activates a matching service foo.service. The unit to activate may be controlled by Unit= (see below). Internally, path units use the inotify(7) API to monitor file systems. Due to that, it suffers by the same limitations as inotify, and for example cannot be used to monitor files or directories changed by other machines on remote NFS file systems. When a service unit triggered by a path unit terminates (regardless whether it exited successfully or failed), monitored paths are checked immediately again, and the service accordingly restarted instantly. As protection against busy looping in this trigger/start cycle, a start rate limit is enforced on the service unit, see StartLimitIntervalSec= and StartLimitBurst= in systemd.unit(5). Unlike other service failures, the error condition that the start rate limit is hit is propagated from the service unit to the path unit and causes the path unit to fail as well, thus ending the loop.
Implicit Dependencies The following dependencies are implicitly added: • If a path unit is beneath another mount unit in the file system hierarchy, both a requirement and an ordering dependency between both units are created automatically. • An implicit Before= dependency is added between a path unit and the unit it is supposed to activate. Default Dependencies The following dependencies are added unless DefaultDependencies=no is set: • Path units will automatically have dependencies of type Before= on paths.target, dependencies of type After= and Requires= on sysinit.target, and have dependencies of type Conflicts= and Before= on shutdown.target. These ensure that path units are terminated cleanly prior to system shutdown. Only path units involved with early boot or late system shutdown should disable DefaultDependencies= option.
Path unit files may include [Unit] and [Install] sections, which are described in systemd.unit(5). Path unit files must include a [Path] section, which carries information about the path or paths it monitors. The options specific to the [Path] section of path units are the following: PathExists=, PathExistsGlob=, PathChanged=, PathModified=, DirectoryNotEmpty= Defines paths to monitor for certain changes: PathExists= may be used to watch the mere existence of a file or directory. If the file specified exists, the configured unit is activated. PathExistsGlob= works similarly, but checks for the existence of at least one file matching the globbing pattern specified. PathChanged= may be used to watch a file or directory and activate the configured unit whenever it changes. It is not activated on every write to the watched file but it is activated if the file which was open for writing gets closed. PathModified= is similar, but additionally it is activated also on simple writes to the watched file. DirectoryNotEmpty= may be used to watch a directory and activate the configured unit whenever it contains at least one file. The arguments of these directives must be absolute file system paths. Multiple directives may be combined, of the same and of different types, to watch multiple paths. If the empty string is assigned to any of these options, the list of paths to watch is reset, and any prior assignments of these options will not have any effect. If a path already exists (in case of PathExists= and PathExistsGlob=) or a directory already is not empty (in case of DirectoryNotEmpty=) at the time the path unit is activated, then the configured unit is immediately activated as well. Something similar does not apply to PathChanged= and PathModified=. If the path itself or any of the containing directories are not accessible, systemd will watch for permission changes and notice that conditions are satisfied when permissions allow that. Unit= The unit to activate when any of the configured paths changes. The argument is a unit name, whose suffix is not ".path". If not specified, this value defaults to a service that has the same name as the path unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the path unit are named identical, except for the suffix. MakeDirectory= Takes a boolean argument. If true, the directories to watch are created before watching. This option is ignored for PathExists= settings. Defaults to false. DirectoryMode= If MakeDirectory= is enabled, use the mode specified here to create the directories in question. Takes an access mode in octal notation. Defaults to 0755. TriggerLimitIntervalSec=, TriggerLimitBurst= Configures a limit on how often this path unit may be activated within a specific time interval. The TriggerLimitIntervalSec= may be used to configure the length of the time interval in the usual time units "us", "ms", "s", "min", "h", ... and defaults to 2s. See systemd.time(7) for details on the various time units understood. The TriggerLimitBurst= setting takes a positive integer value and specifies the number of permitted activations per time interval, and defaults to 200. Set either to 0 to disable any form of trigger rate limiting. If the limit is hit, the unit is placed into a failure mode, and will not watch the paths anymore until restarted. Note that this limit is enforced before the service activation is enqueued. Check systemd.unit(5), systemd.exec(5), and systemd.kill(5) for more settings.
Environment variables with details on the trigger will be set for triggered units. See the "Environment Variables Set on Triggered Units" section in systemd.exec(1) for more details. systemd(1), systemctl(1), systemd.unit(5), systemd.service(5), inotify(7), systemd.directives(7)


text:
At Springer Nature we recognise that providing the most personalised, up-to-date ROI information helps to make your life easier when it comes to assessing which products are most valuable to your portfolio. We offer a range of services to help you inform your purchasing decisions and encourage usage.
With our dedicated account development approach, we support you to get improved insights on your account and your Springer Nature product portfolio.


text:
I regularly review CSR reports for CorporateRegister.com. The review format is compact, ie not very long and detailed, and focuses on Content (what they disclose), Communication (how they disclose) and Credibility (can you believe it). It takes around 3 hours to read, understand, analyse and review a report. Even the lightest weight reports. So far, I have completed around 37 reviews, across all types of Company and in most sectors. After a while, you begin to get the hang of what to look for in a report. So, for the 1,212,507 people who read reports, I would like to offer some guidance as to how to make your reading experience enjoyable and worthwhile (ok, just a touch of sarcasm there). And for the very few people who do not read reports, this may help you get started J . At this point, regular readers will expect me to say: "First, equip yourself with a Chunky Monkey and a really interesting report." Ha! Ok. We'll assume you did that already. I find CSR reports fascinating – and I strongly believe in their importance and relevance in driving the transparency of businesses around the globe. So let's get dug in. Here are some introductory insights to report reading:
Start with an open mind
It is so easy to have bad vibes about report from a Company you have bad vibes about. You know they are not really into CSR and you expect to find a whole load of irrelevance in the report. You're mind is made up, and you look to prove your point as you read the report. Well, don't. Remember that CSR is evolving in every corporation and that each Company is facing different challenges and progressing at its own pace. We can learn from each Company. Whatever the motivation or the quality, any report so better than none. Go with an open mind, evaluate on the basis of what your read, by all means do a little cross-checking , but take the report on its merits. Try to understand the context in which the report was written. BAT, for example. Many would claim that a Company who makes cigarettes cannot be responsible. So when their CSR report lands in your lap, your automatic reaction is WTF?!?! i.e. a teeny weeny bit negative. @MBernhart (Michelle Bernhart of True Blue Communications) reviewed BAT's latest report which tackles the question head on of whether a tobacco company can be sustainable. They may not be your model of sustainability, but they operate a legal business and report on some measure of positive impact.
People write reports, not companies
Remember that the Company name may be on the cover, but it is people, real people who are doing their best to do a good job, who are charged with writing and producing the report. These people are doing the best they can with what they have. Sometimes, they are people who work for a totally great company with lots to report and a disposition for transparency. This makes life for the reporters much easier. Sometimes the hardest thing about writing a report is managing the internal politics. Just how much to disclose and more importantly, what NOT to disclose. Whether to tell the whole truth or just a little less than the whole truth. What to do with colleagues who do not provide data. How to present bad data in a good light and more. CSR reporters are always torn between reflecting the Company's position in a fair and balanced way, adhering to management demands and working conscientiously within reporting frameworks. By remembering that people write reports, you will be more balanced in your criticism, if you have criticism. An example is the 2008 report from Seiko. Sorry, but it's everything a CSR report should not be. But somewhere in Seiko there is a CSR person trying to do his or her best with the limited scope the Company allows. In reading this report, we should try to understand some of the limitations of a Company CSR reporter who has a desire to present good corporate citizenship but has not been able to make the sort of progress that supports good reporting. We should try to understand the complexities for a reporter, suspend negative judgement for a while, see what works, and try to encourage a better effort next time around.
Read the opening remarks by the Big Chief
The opening remarks by the Chairman, CEO or President, or all three, are quite telling. Often regarded as mumbo-jumbo empty phrases to skip over, they actually set the tone for the report, and give you a heads-up on what you may or may not find, Often there is no substance to these remarks (" this is our CSR report for the year 2008, it describes our csr activities blurb blurb we welcome your feedback blurb etc ") and this should alert you what you will find in the report. More blurb. If the opening remarks have substance, the report probably has too. Compare these two examples: Delhaize Report for 2008 – the opening remarks by the Chairman and President/CEO add nothing to the report and contain the standard blurb about how great Delhaize is and how doing CSR contributes to making them wonderful. Vodafone 2008 –here the CEO gives us a flavor of what is material to stakeholders and to Vodafone in a concise and well thought-out summary which precedes the most transparent and comprehensive reporting effort ever.
Choose how you read
After the opening remarks, there are a number of ways you can go. You can keep on reading. You can look for something specific. You can go to a section of interest. You can go for a pizza. If the Big Chief has said something meaningful, you might want to pick a thread and follow it in the report. If you have a particular issue or prejudgement about the Company, you can dive in to see what they report about that. If something is currently topical, such as climate change, you might want to go there first. This is where an index comes in very useful. A GRI index is the best. Tells you exactly where to find exactly what you are looking for. (Though beware, not all that is indexed is present). But the point is, don't try to read the report as if it were a best seller. They are not written by Alexander McCall Smith (as far as I know) and do not make for great bedtime stories. Read the report as a report in a discerning way – its purpose is to provide a lot of information to a broad range of stakeholders. By definition, not everybody will be interested in everything to the same degree. Decide what you want to read about and go there.
Seek materiality
Whilst good corporate citizenship is made up of different actions in many parts of the business, the true impacts of a corporation are the ones that address material issues, which are often related to indirect impacts. A corporation who reports on direct impacts alone has not matured to the most significant level of CSR. Gap Inc 2005-2006 report always sticks in my memory as an outstanding report that addresses indirect impacts well. The report is called "What is a company's role in society?" How more indirect than that can you get? The report contains a good materiality assessment summary.
Be copy-paste and delete aware
For all but first reports, I always check back to the prior report, sometimes several prior reports. It is hard to believe just how much copy-pasting goes on in reporting. Sometimes you can read the same paragraph year after year. Surely the point of a report is to report new stuff. Not to regurgitate. If nothing new has happened in the reporting period, leave it out. Or say why not. Often a glance at prior reports can give you a better sense of context and evolution of the company's approach, and also what they are not reporting. The Aviva CR report for 2009 neatly omitted to report on social-benefit insurance products offerings that were proudly announced in the previous report. Clearly Aviva had not been able to meet the challenges of changing consumer perceptions and behaviours. Look at promises made in previous reports and how they are addressed in the current report. You sometimes need to assess the report credibility based on what was copy-pasted or deleted from prior reports.
Look for consistency (and inconsistency) in data
If Companies have been reporting for years, they should present data in charts showing at least 3 prior years. This provides context and understanding of the measure of performance over time. Where contextual data is lacking, there is always a reason. A closer look often leads you to the answers. Marks and Spencer, in their last Plan A report, which I reviewed here, made no mention of high numbers redundancies despite this being plastered all over the UK press. 1,000 people- that's a lot of livelihoods and was glossed over in the CR report. Compare data, look for inconsistencies in carbon footprint calculations, see how companies spend pages talking about energy consumption reduction and carbon reduction per product, per person or per location when overall they have increased, not reduced their footprint. Look for big declarations (we support equal opportunity) and results ( 5% women in management). Look for the data that isn't reported. And think about why.
Give feedback, ask questions, make comments, get engaged
There is nothing worst for a CSR reporter than no reaction. All reporters want feedback on their report, even if it's negative. I regularly make contact with the reporting companies whose reports I review, if something is not clear to me, and I regularly provide feedback directly to Companies. In almost all cases, I get a positive and comprehensive response from someone who is committed to the process. The best recent example is W.M. Morrison, the UK Supermarket chain. After writing about issues related to product packaging, I received a long response with explanations from the Company. Similarly Aviva, mentioned above, responded to me frankly and constructively about issues I raised in their report. I could cite numerous more examples. So all of you who sit there beefing about how CSR reports are bad, worthless and even misleading – I urge you to do something about it and WRITE to the reporting companies. Ask, tell, demand .. and listen to the response.
Give some leeway to first-timers
The first CSR report is a real challenge. It is often written at a stage where the Company has started on the journey of CSR, but is still developing its approach. Not all data may be available. The mammoth exercise of aligning the Company in a way which fits into a reporting process is not to be underestimated. The first report requires the Company to address issues that have probably never before been discussed. Cut these companies some slack. Understand that the only way to gain reporting experience is to report. The best two examples for first timers I came across in the last year are Jumeirah Hotel Group in Dubai and Central Textiles of Hong Kong.
If you have read to the end of this post, congratulations! You are now qualified as an Advanced CSR Report Reader. Go read some reports! And don't forget that Chunky Monkey makes even the awfullest of reports more palatable.
elaine cohen is the joint CEO of BeyondBusiness, a leading reporting and social-environmental consulting firm . Visit our website at: www.b-yond.biz/en


text:
SANTA FE, N.M. — A special prosecutor who doubles as a state legislator is stepping down from her role in the manslaughter case against actor Alec Baldwin in the death of a cinematographer on a New Mexico film set.
Baldwin's legal team in February sought to disqualify special prosecutor and Republican state Rep. Andrea Reeb of Clovis based on constitutional provisions that safeguard the separation of powers between distinct branches of government.
Reeb said in a statement Tuesday that she "will not allow questions about my serving as a legislator and prosecutor to cloud the real issue at hand."
"It has become clear that the best way I can ensure justice is served in this case is to step down so that the prosecution can focus on the evidence and the facts," Reeb said.
District Attorney Mary Carmack-Altwies filed a notification in state district court and declined further comment.
Baldwin and weapons supervisor Hannah Gutierrez-Reed have pleaded not guilty to charges of involuntary manslaughter in the shooting death of cinematographer Halyna Hutchins. The charges carry a maximum penalty of 18 months in prison and fines.
Hutchins died shortly after being wounded Oct. 21, 2021, during rehearsals for the Western film Rust at a ranch on the outskirts of Santa Fe. Baldwin was pointing a pistol at Hutchins when the gun went off, killing her and wounding the director, Joel Souza.
A preliminary hearing is scheduled in May to decide whether the evidence is sufficient to proceed to a trial.
Prosecutors say assistant director David Halls, who oversaw safety on set, has signed an agreement to plead guilty in the negligent use of a deadly weapon.
In her role as legislator, Reeb has sponsored several criminal justice initiatives, including enhanced punishments for firearms violations.
The Republican from Clovis steered clear of voting on public spending to prosecute Baldwin and Gutierrez-Reed.
She was excused from a House floor vote in February on a proposed state budget that includes $360,000 for special prosecution expenses in the fatal film-set shooting.
Copyright 2023 NPR. To see more, visit https://www.npr.org.


text:
I'm thrilled to feature a guest post from ps pirro, one of my favorite bloggers, a longtime online friend, and author of one of my favorite unschooling books, 101 Reasons Why I'm An Unschooler. I hope you enjoy this article on food and freedom as much as I do!
"If people lose their ability to feed themselves, how can they be said to be free?"
~Kentucky farmer & writer Wendell Berry
I'm not the first writer to point out that, prior to the last century, most of what we ate came directly to our tables from the ground, from the trees, and from the animals with whom we shared the planet. Nor is it a revelation to note that this is no longer the case, that most of our food now comes from a factory, from a chemist's lab, from vertically integrated corporate interests.
You and I didn't choose this arrangement, of course. It preceded us. But, oddly enough, the generations before us didn't exactly chose it, either. What they chose -- and what many people today keep on choosing -- was something this arrangement seemed to offer: Freedom.
As Ben Hewitt, author of The Town that Food Saved, wrote, over the course of the last century, our culture made a bargain with the food industry. We turned over the growing, raising, processing and delivery of our food to business interests, and in return we were liberated (most of us, anyway) from the dirt, manure, fickle weather, hot sun, long hours and manual labor of farming.
We gained lives of clean fingernails and shoes that never touched mud. We gained a professional class, a middle class, leisure time, and abundance. We gained well-stocked supermarkets and full refrigerators, and the cost of food as a percentage of the household budget went down every year.
What we gained looked a lot like freedom. Fifty years ago, it seemed like a pretty good bargain.
Today it looks like a Faustian pact.
It's not just that the average morsel of food on our plates now travels 1200 miles to get to us, or that it takes eleven calories of fossil fuel energy to give us one calorie of food energy. It's not just the travesty of factory-farmed beef and chickens and hogs, or the loss of topsoil from over-plowing or the salinization and desertification from over-irrigating. All those things matter, but there is more.
The bargain we struck in the name of freedom has returned to haunt us on a fundamental level: it has undermined our sense of what it means to be us.
The food we eat is our most intimate connection to the world. It's what becomes us. It is us. It's us as individuals, and it's us as a culture.
When industrial food producers say, "We'll make dinner," they are asking us to relinquish that intimate connection. To sever our taproot. To become commodities eating commodities. They're also asking us to trust that their priorities as producers are aligned with our own as eaters. That's where the Faustian part of the bargain comes in. Because the priorities of the industrial food producers have never been aligned with our own. Industrial food producers have always been less concerned with our health and vitality -- and the health and vitality of the world in which we live -- than they are with our appetites. It's our appetites they aim to feed, not our deeply rooted need to be nourished.
Undoing the Faustian bargain doesn't mean we all have to become farmers, but it does mean drawing the food loop a little -- or a lot -- closer to home. It means educating ourselves about where the stuff we put on our plates comes from, how it's grown, who grows it and how it reaches us -- and then acting on that awareness. It means entering into relationship with our food and with those who grow it, something best done locally, right where we are.
When we break away from industrial food -- even one small step at a time, at the weekly farmers market or in a backyard garden -- we regain some of what was lost in that Faustian bargain: a sense of where we come from, and what we're made of, and made from, and how we're a part of the soil and the air and the water, as it is a part of us. We regain not just our sense of connection, but the actual connection itself, becoming that which we partake of, drawing into ourselves the stuff of our particular place on Earth.
And that connection, created and sustained in the face of all that divides us, might prove to be the most freeing thing of all.
You did not come into this world, you came out of it, like a wave from the ocean.
You are not a stranger here.
~Alan Watts