text:
Using filesets for data processing
##################################

.. contents:: :local:

.. highlight:: python
   :linenothreshold: 5

What is the idea?
=================

Imagine you have a big dataset consisting of many files containing observations
(e.g. images or satellite data). The files cover certain time periods and
are bundled into subdirectories. See
:numref:`Fig.{number}<fig-example-filesets>` for an example.

.. _fig-example-filesets:

.. figure:: _figures/example_filesets.png
   :scale: 50 %
   :alt: screen shot of dataset directory structure

   Example of filesets

   All files of *Satellite B* are located in subdirectories which
   contain temporal information in their names (year, month, day, etc.).

Typical tasks to analyze this dataset would include iterating over those
files, finding those that cover a certain time period, reading them, applying
functions on their content and eventually adding files with new data to this
dataset. So, how to find all files in a time period? You could start by writing
nested *for* loops and using python's *glob* function. Normally, such solutions
requires time to implement, are error-prone and are not portable to other
filesets with different structures. Hence, save your time/energy/nerves and
simply use the :class:`~typhon.files.fileset.FileSet` class.

.. Hint::
   NOTE: The code in the jupyter notebooks is old and needs to be updated!
   If you want to run the code from this tutorial on your machine as well,
   download
   :download:`spareice_tutorials.zip<_downloads/spareice_tutorials.zip>` and
   unzip it. You can find the code examples for this tutorial in the jupyter
   notebook file *dataset.ipynb*. You will need the jupyter_ engine for this.

.. _jupyter: http://jupyter.org/install.html

Find Files
==========

We stick to our example from above and want to find all files from our
*Satellite B* dataset between two dates. To do this, we have to create a
FileSet object with the path to our files:

.. code-block:: python

   # Import the FileSet class from the typhon module.
   from typhon.files import FileSet

   # Define a fileset object pointing to the files
   # of the Satellite B
   b_fileset = FileSet(
       path="data/SatelliteB/{year}-{month}-{day}/"
            "{hour}{minute}{second}-{end_hour}{end_minute}{end_second}.nc"
   )

Nothing interesting happens so far. We imported the FileSet class from the
typhon module, created a FileSet object and told it where to find its files.
These words surrounded by braces (e.g. "{year}") are called placeholders. They
work like regular expressions and generalize the path, so we need not give
explicit paths that point to each file directly. The FileSet object can fill
those placeholders by itself when searching for files. Let's see it in action:

.. code-block:: python

   # Find all files (but only print the first one)
   for file in b_fileset:
       print(repr(file))

.. code-block:: none
   :caption: Output:

   .../data/SatelliteB/2018-01-01/000000-050000.nc
   .../data/SatelliteB/2018-01-01/050000-100000.nc
   .../data/SatelliteB/2018-01-01/100000-150000.nc
   .../data/SatelliteB/2018-01-01/150000-200000.nc
   .../data/SatelliteB/2018-01-01/200000-010000.nc
   .../data/SatelliteB/2018-01-02/010000-060000.nc
   .../data/SatelliteB/2018-01-02/060000-110000.nc
   .../data/SatelliteB/2018-01-02/110000-160000.nc
   .../data/SatelliteB/2018-01-02/160000-210000.nc
   .../data/SatelliteB/2018-01-02/210000-020000.nc
   .../data/SatelliteB/2018-01-03/060000-120000.nc

If we want to have only files from a certain time period, we can use the
:meth:`~typhon.files.fileset.FileSet.find` method with start and end parameter:

.. code-block:: python

   # Find all files in a certain time period
   for file in b_fileset.find("2018-01-01", "2018-01-01 12:00:00"):
       print(file)

.. code-block:: none
   :caption: Output:

   .../data/SatelliteB/2018/01/01/000000-050000.nc
   .../data/SatelliteB/2018/01/01/050000-100000.nc

In both examples from above, we yield a
:class:`~typhon.spareice.handlers.common.FileInfo` object in the `file`
variable. The FileInfo object has three attributes: *path*, *times* and *attr*.
Let's have a look at them:

.. code-block:: python

   print("Type:", type(file))
   print("Path:", file.path)
   print("Times:", file.times)
   print("Attributes", file.attr)

.. code-block:: none
   :caption: Output:

   Type: <class 'typhon.files.handlers.common.FileInfo'>
   Path: .../data/SatelliteB/2018-01-03/060000-120000.nc
   Times: [datetime.datetime(2018, 1, 3, 6, 0), datetime.datetime(2018, 1, 3, 12, 0)]
   Attributes: {}

The *path* returns the path to the file and *times* is a list with
two datetime objects: the start and end time of the file. They are retrieved by
the placeholders that were used in the `path` argument of the Dataset object.
But what is about *attr* and why is it an empty dictionary? Additionally to the
temporal placeholders (such as {year}, etc.), which are converted into start
and end datetime objects, you can define own placeholders. For example, let's
make a placeholder out of the satellite name:

.. code-block:: python

   # The same dataset as before but with one additional placeholder in the
   # path:
   fileset = FileSet(
     path="data/{satname}/{year}-{month}-{day}/"
          "{hour}{minute}{second}-{end_hour}{end_minute}{end_second}.nc"
   )

   for file in fileset.find("2018-01-01", "2018-01-02"):
     print("Path:", file.path)
     print("Attributes", file.attr)

.. code-block:: none
   :caption: Output:

   Path: .../data/SatelliteA/2018-01-01/000000-040000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteB/2018-01-01/000000-050000.nc
   Attributes {'satname': 'SatelliteB'}
   Path: .../data/SatelliteA/2018-01-01/040000-080000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteB/2018-01-01/050000-100000.nc
   Attributes {'satname': 'SatelliteB'}
   Path: .../data/SatelliteA/2018-01-01/080000-120000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteB/2018-01-01/100000-150000.nc
   Attributes {'satname': 'SatelliteB'}
   Path: .../data/SatelliteA/2018-01-01/120000-160000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteB/2018-01-01/150000-200000.nc
   Attributes {'satname': 'SatelliteB'}
   Path: .../data/SatelliteA/2018-01-01/160000-200000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteA/2018-01-01/200000-000000.nc
   Attributes {'satname': 'SatelliteA'}
   Path: .../data/SatelliteB/2018-01-01/200000-010000.nc
   Attributes {'satname': 'SatelliteB'}

As we can see, we are able to find the data from *Satellite A* as well because
it has the same subdirectory structure as *Satellite B*. The placeholder
*satname* - per default interpreted as wildcard - was filled by Dataset
automatically and returned in *attr*. This could be useful if we want to
process our files and we need to know from which satellite they came from. We
can apply a filter on this placeholder when using
:meth:`~typhon.files.fileset.FileSet.find`:

.. code-block:: python

   filters = {"satname": "SatelliteA"}
   for file in fileset.find("2018-01-01", "2018-01-02", filters=filters):
       print("Path:", file.path)
       print("  Attributes", file.attr)

This finds only the files which placeholder *satname* is *SatelliteA*. We can
also set it to a regular expression. If we want to apply our filter as a black
list, i.e. we want to skip all files which placeholders contain certain values,
we can add a *!* before the placeholder name.

.. code-block:: python

   # This finds all files which satname is not SatelliteA
   filters = {"!satname": "SatelliteA"}

We can also set a placeholder permanently to our favourite regular expression
(e.g. if you want to call :meth:`~typhon.files.fileset.FileSet.find`
multiple times). Use
:meth:`~typhon.files.fileset.FileSet.set_placeholders` for this:

.. code-block:: python

   fileset.set_placeholders(satname="\w+?B")

Which results that we only find satellites which name ends with *B*. If you
want to find out more about placeholders, have a look at this
:ref:`section<typhon-dataset-placeholders>`.

Read and Create Files
=====================

Handling common file formats
++++++++++++++++++++++++++++

Well, it is nice to find all files from one fileset. But we also want to open
them and read their content. For doing this, we could use our found `FileInfo`
objects as file argument for python's `open` builtin function:

.. code-block:: python

   for file in b_fileset.find("2018-01-01", "2018-01-02"):
      with open(file, "rb") as f:
         # This returns a lot of byte strings:
         print(f.readline())

Okay, this may be not very practical for netCDF files since it just returns a
lot of byte strings. Of course, we could use the `python-netcdf`
module for reading the files but our FileSet object provides a much easier way:

.. code-block:: python

   data = b_fileset["2018-01-01"]
   print(data)

.. code-block:: none
   :caption: Output:

   <xarray.Dataset>
   Dimensions:  (time: 15)
   Coordinates:
     * time     (time) datetime64[ns] 2018-01-01 2018-01-01T00:20:00 ...
   Data variables:
       lat      (time) float64 ...
       lon      (time) float64 ...
       data     (time) float64 ...

This found a file that is the closest to 2018-01-01 and decompressed it (if it
was compressed by using zip, gzip or other common compression standards).
Afterwards it loaded its content into an `xarray.Dataset` object (kind of
sophisticated dictionary that holds numpy arrays; have a look at xarray_). And
all this by using only one single expression! We can also read all files from a
time period:

.. _xarray: http://xarray.pydata.org/en/stable/

.. code-block:: python

   # Find files from 2018-01-01 to 2018-01-01 and load them into
   # numpy arrays
   data = b_fileset["2018-01-01":"2018-01-02"]

   # data is now a list of xr.Dataset objects.

What if we want to create a new file for our FileSet? How does this work? It
is as simple as reading them. Create your data object first and then pass it to
the FileSet:

.. code-block:: python

   import xarray as xr

   # Create a xr.Dataset which holds data in form of numpy arrays:
   data = xr.Dataset()
   data['lat'] = 'time', 90 * np.sin(np.linspace(0, 6.28, 7))
   data['lon'] = 'time',  np.linspace(-180, 180, 7)
   data['data'] = data['lat'] * 2 + np.random.randn(7)
   data["time"] = pd.date_range(
       "2018-01-03 06:00:00", "2018-01-03 12:00:00", freq="h"
   )

   # Save this xr.Dataset object to a file that belongs to our fileset. The
   # given timestamps indicate the time coverage of the file:
   b_fileset["2018-01-03 06:00:00":"2018-01-03 12:00:00"] = data

If we look now in our dataset directory, we find a new file called
*data/SatelliteB/2018-01-03/060000-120000.nc*. We can see its content with a
netCDF viewer (e.g. panoply). So our FileSet object took our xarray.Dataset and
put it into a netCDF file automatically. The FileSet object tries to detect
from the path suffix the format of the files. This works for netCDF files
(*\*.nc*) and for CSV files (*\*.txt*, *\*.asc* or *\*.csv*).

Handling other file formats
+++++++++++++++++++++++++++

What happens with files in CSV format but with a different filename suffix? Or
with other file formats, e.g. such as from CloudSat instruments? Can the
FileSet read and write them as well? Yes, it can. But it is going to need some
help of us before doing so. To understand this better, we have to be honest:
the FileSet object cannot do very much; it simply finds files and compress /
decompress them if necessary. However, to read or create files, it trusts a
*file handler* and let it do the format-specific work. A file handler is an
object, which knows everything about a certain file format and hence can read
it or use it to write a new file. The FileSet object automatically tries to
find an adequate file handler according to the filename suffix. Hence, it knew
that our files from *Satellite B* (with the suffix *.nc*) have to be opened
with the
:class:`~typhon.spareice.handlers.common.NetCDF4` file handler.

If we want to use another file handler, we can set the file handler by
ourselves. Let's demonstrate this by using another fileset, e.g. data from
*Satellite C*. Its structure looks like this:

.. _fig-example-dataset_c:

.. figure:: _figures/example_fileset_c.png
   :scale: 50 %
   :alt: screen shot of dataset directory structure

   Files of Satellite C

The files are stored in a different directory structure and are in CSV format.
Instead of having subdirectories with month and day, we now have subdirectories
with the so-called day-of-year (all days since the start of the year). Do not
worry, the FileSet object can handle this structure without any problems with
the temporal placeholder *doy*:

.. code-block:: python

   c_fileset = FileSet(
       path="data/SatelliteC/{year}-{doy}/{hour}{minute}{second}.dat",
   )

   for file in c_dataset.find("2018-01-01", "2018-01-02"):
      print(file)

.. code-block:: none
   :caption: Output

   .../data/SatelliteC/2018-001/000000.dat
      Start: 2018-01-01 00:00:00
      End: 2018-01-01 00:00:00
   ...

But if we try to open one of the files, the following happens:

.. code-block:: python

   data = c_dataset["2018-01-01"]

.. code-block:: none
   :caption: Output

   ---------------------------------------------------------------------------
   NoHandlerError                            Traceback (most recent call last)
   ...

   NoHandlerError: Could not read '.../data/SatelliteC/2018-001/000000.dat'!
      I do not know which file handler to use. Set one by yourself.

It cannot open the file because it could not retrieve a file handler from the
filename suffix. Let's help the Dataset object by setting its file handler to
:class:`~typhon.spareice.handlers.common.CSV` explicitly. Now it should be able
to open these CSV files.

.. code-block:: python

   # Import the CSV file handler
   from typhon.files import CSV

   # Use the CSV file handler for the c_fileset (you could do this also
   # during initialization of the FileSet object):
   c_fileset.handler = CSV()

   # Maybe, the file handler needs some additional information when
   # reading a file? We can set them by *FileSet.read_args*. For example,
   # this let the file handler interpret the column 'time' as timestamp
   # object. Have a look at the CSV file handler documentation
   # to know which else parameters you can pass via read_args:
   c_fileset.read_args={
       "parse_dates": ["time", ]
   }

   # This works now:
   c_fileset["2018-01-01"]

.. code-block:: none
   :caption: Output

   <xarray.Dataset>
   Dimensions:  (index: 15)
   Coordinates:
     * index    (index) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
   Data variables:
       time     (index) datetime64[ns] 2018-01-01 2018-01-01T00:20:00 ...
       lat      (index) float64 50.59 53.21 55.42 57.21 58.57 59.48 59.94 ...
       lon      (index) float64 -180.0 -177.5 -175.0 -172.5 -170.0 -167.5 ...
       data     (index) float64 99.7 105.6 114.1 114.6 117.0 119.8 120.1 ...

There are more file handlers for other file formats. For example,
:class:`~typhon.files.handlers.cloudsat.CloudSat` can read CloudSat HDF4
files. Have a look at :ref:`typhon-handlers` for a complete list of official
handler classes in typhon. Every file handler might have its own specifications
and options, you can read about them in their documentations.

Handling your file formats
++++++++++++++++++++++++++

If you need a special format that is not covered by the official file handlers,
you can use the generic
:class:`~typhon.files.handlers.common.FileHandler` object and set customized
reader and writer functions. Another way - if you like object-oriented
programming - is to subclass
:class:`~typhon.files.handlers.common.FileHandler` and write your own file
handler class (see :doc:`handlers` for a tutorial). Since the latter is for
more advanced programmers, here is a simple but extensive example that shows
how to use your own reader and writer functions easily. This also shows how to
create a new fileset with many files on-the-fly:

.. code-block:: python

   from datetime import datetime, timedelta

   # Get the base class to use a customized file handler
   from typhon.files import FileHandler

   # Here are our reader and writer functions:
   def our_reader(file_info, lineno=0):
       """Read the nth line of a text file

       Args:
           file_info: A FileInfo object.
           lineno: Number of the line that should be read.
               Default is the 0th line (header).

       Returns:
           A string with the nth line
       """

       with open(file_info, "r") as file:
           return file.readlines()[lineno]

   def our_writer(data, file_info, mode="w"):
      """Append a text to a file

      Args:
          data: A string with content.
          file_info: A FileInfo object.
          mode: The writing mode. 'w' means overwriting
              (default) and 'a' means appending.

      Returns:
          None
      """

      with open(file_info, mode) as file:
          file.write(data)

   # Let's create a file handler with our functions
   our_handler = FileHandler(
       reader=our_reader,
       writer=our_writer,
   )

   # Let's create a new dataset and pass our own file handler
   our_dataset = FileSet(
      path="data/own_dataset/{year}/{doy}/{hour}{minute}{second}.txt",
      handler=our_handler,
   )

   # Fill the dataset with files covering the next two days:
   start = datetime(2018, 1, 1)
   for hour in range(0, 48, 4):
       timestamp = start + timedelta(hours=hour)

       # The content for each file:
       text = f"Header: {timestamp}\n" \
           + "1) First line...\n" \
           + "2) Second line...\n" \
           + "3) Third line...\n"

       # Write the text to a file (uses the
       # underlying our_writer function)
       our_dataset[timestamp] = text

   # Read files at once and get their header line
   # (uses the underlying our_reader function)
   print(our_dataset["2018-01-01":"2018-01-03"])

.. code-block:: none
   :caption: Output

   ['Header: 2018-01-01 00:00:00\n', 'Header: 2018-01-01 04:00:00\n',
    'Header: 2018-01-01 08:00:00\n', 'Header: 2018-01-01 12:00:00\n',
    'Header: 2018-01-01 16:00:00\n', 'Header: 2018-01-01 20:00:00\n',
    'Header: 2018-01-02 00:00:00\n', 'Header: 2018-01-02 04:00:00\n',
    'Header: 2018-01-02 08:00:00\n', 'Header: 2018-01-02 12:00:00\n',
    'Header: 2018-01-02 16:00:00\n', 'Header: 2018-01-02 20:00:00\n']

This script creates files containing one header line with a timestamp and some
further 'data' lines. With our new file handler we can read easily the header
line from each of those files. Great!

Pass arguments to reader and writer
+++++++++++++++++++++++++++++++++++

The `our_reader` function actually provides to return the nth line of the file
if the argument `lineno` is given. If we want to read files with additional
arguments for the underlying reader function, we cannot use the simple
expression with brackets any longer. We have to use the more extended version
in form of the :meth:`~typhon.files.fileset.FileSet.read` method instead:

.. code-block:: python

   # Find the closest file to this timestamp:
   file = our_dataset.find_closest("2018-01-01")

   # Pass the file and the additional argument 'lineno' to the
   # underlying our_reader function:
   data = our_dataset.read(file, lineno=2)

   print(file, "\nData:", data)

.. code-block:: none
   :caption: Output

   .../data/own_dataset/2018/001/000000.txt
     Start: 2018-01-01 00:00:00
     End: 2018-01-01 00:00:00
   Data: 2) Second line...

Using additional arguments for creating a file works very similar as above, we
can use :meth:`~typhon.files.fileset.FileSet.write` here. Another
difference is that we have to generate a filename first by using
:meth:`~typhon.files.fileset.FileSet.get_filename`.

.. code-block:: python

   # Generate a filename for our dataset and a given timestamp:
   filename = our_dataset.get_filename("2018-01-01 04:00:00")

   data = "4) Appended fourth line...\n"

   print(f"Append {data} to {filename}")

   # Pass the data, filename and the additional argument 'mode' to
   # the underlying our_writer function:
   our_dataset.write(data, filename, mode="a")

.. code-block:: none
   :caption: Output

   Append 4) Appended fourth line...
   to .../data/own_dataset/2018/001/000000.txt

How can we read the second lines from all files? We could do this:

.. code-block:: python

   for file in our_dataset:
      data = our_dataset.read(file, lineno=2)
      ...

If you want to use parallel workers to load the files faster (will not
make much difference for our small files here though), use
:meth:`~typhon.files.fileset.FileSet.icollect` in combination with a
for-loop or simply :meth:`~typhon.files.fileset.FileSet.collect` alone:

.. code-block:: python

   # Read the second line of each file:
   for data in our_dataset.icollect(read_args={"lineno": 2}):
      ...

   # OR

   # Read the second line of all files at once:
   data_list = our_dataset.collect(read_args={"lineno": 2})

Handling remote files
+++++++++++++++++++++

The FileSet class works not only for files on your local file system,
but also for remote filesystems such as Amazon S3, or files in an
archive such as a zip file.  Please note that this functionality is still
experimental and most FileHandlers only support local reading and writing,
so functionality is currently limited to searching for files.

.. code-block:: python

	import s3fs
	from typhon.files.fileset import FileSet
	abi_fileset = FileSet(
			path="noaa-goes16/ABI-L1b-RadF/{year}/{doy}/{hour}/OR_ABI-L1b-RadF-M6C*_G16_s{year}{doy}{hour}{minute}{second}*_e{end_year}{end_doy}{end_hour}{end_minute}{end_second}*_c*.nc",        name="abi",
			fs=s3fs.S3FileSystem(anon=True))
	for f in abi_fileset.find("2019-11-18T05:30", "2019-11-18T07:00"):
		print(f)

This will return all full-disk ABI L1B granules between the indicated
times, for all channels.  The resulting files can then be downloaded or
read using the s3 interface or directly with typhon if a FileHandler is
file system aware (not implemented yet).  Note that unlike searching on
a local file system, one should not include a leading / with the search
path when searching on an s3 file system.

Get information from a file
===========================

The Dataset object needs information about each file in order to find them
properly via :meth:`~typhon.files.fileset.FileSet.find`. Normally, this
happens by using :ref:`placeholders<typhon-dataset-placeholders>` in the files'
path and name. Each placeholder is represented by a regular expression that is
used to parse the filename. But sometimes this is not enough. For example, if
the filename provides not the end of the file's time coverage but the file does
not represent a single discrete point. Let's have a look at our *Satellite C*
for example:

.. code-block:: python

   from typhon.files import CSV

   # Create a CSV file handler that interprets the column 'time' as
   # timestamp object.
   csv_handler = CSV(
       read_csv={"parse_dates":["time", ]}
   )

   c_dataset = Dataset(
       path="data/SatelliteC/{year}/{doy}/{hour}{minute}{second}.dat.gz",
       handler=csv_handler,
   )

   for file in c_dataset.find("2018-01-01", "2018-01-01 8:00:00"):
       print(file)

.. code-block:: none
   :caption: Output

   .../data/SatelliteC/2018/001/000000.dat.gz
      Start: 2018-01-01 00:00:00
      End: 2018-01-01 00:00:00
   .../data/SatelliteC/2018/001/060000.dat.gz
      Start: 2018-01-01 06:00:00
      End: 2018-01-01 06:00:00

As we can see, are files interpreted as *discrete* files: their start time is
identical with their end time. But we know that is not true, e.g.
*.../data/SatelliteC/2018/001/000000.dat.gz* covers a period from almost six
hours:

.. code-block:: python

   data = c_dataset.read("data/SatelliteC/2018/001/000000.dat.gz")
   print("Start:", data["time"].min())
   print("End:", data["time"].max())

.. code-block:: none
   :caption: Output

   Start: 2018-01-01 00:00:00
   End: 2018-01-01 05:59:59

We have two options now:

1. Use the parameter *time_coverage* of the Dataset to specify the duration per
   file. Works only if each file has the same time coverage. This is the
   easiest and fastest option.
2. Using the file handler to get more information. The file handler can more
   than only reading or creating files in a specific format. If its method
   :meth:`~typhon.spareice.handlers.common.FileHandler.get_info` is set, it can
   complement information that could not be completely retrieved from the
   filename.

Let's try at first option 1:

.. code-block:: python

   c_dataset.time_coverage = "05:59:59 hours"

   for file in c_dataset.find("2018-01-01", "2018-01-01 8:00:00"):
      print(file)

.. code-block:: none
   :caption: Output

   .../data/SatelliteC/2018/001/000000.dat.gz
      Start: 2018-01-01 00:00:00
      End: 2018-01-01 05:59:59
   .../data/SatelliteC/2018/001/060000.dat.gz
      Start: 2018-01-01 06:00:00
      End: 2018-01-01 11:59:59

It works! But what if each file has an individual duration? Then we need to
define a file handler that have a `get_info` method:

TODO: The tutorial will be continued.

.. _typhon-dataset-placeholders:

Placeholders
============

Temporal placeholders
+++++++++++++++++++++

Allowed temporal placeholders in the *path* argument are:

+-------------+------------------------------------------+------------+
| Placeholder | Description                              | Example    |
+=============+==========================================+============+
| year        | Four digits indicating the year.         | 1999       |
+-------------+------------------------------------------+------------+
| year2       | Two digits indicating the year. [1]_     | 58 (=2058) |
+-------------+------------------------------------------+------------+
| month       | Two digits indicating the month.         | 09         |
+-------------+------------------------------------------+------------+
| day         | Two digits indicating the day.           | 08         |
+-------------+------------------------------------------+------------+
| doy         | Three digits indicating the day of       | 002        |
|             | the year.                                |            |
+-------------+------------------------------------------+------------+
| hour        | Two digits indicating the hour.          | 22         |
+-------------+------------------------------------------+------------+
| minute      | Two digits indicating the minute.        | 58         |
+-------------+------------------------------------------+------------+
| second      | Two digits indicating the second.        | 58         |
+-------------+------------------------------------------+------------+
| millisecond | Three digits indicating the millisecond. | 999        |
+-------------+------------------------------------------+------------+

.. [1] Numbers lower than 65 are interpreted as 20XX while numbers
   equal or greater are interpreted as 19XX (e.g. 65 = 1965,
   99 = 1999)

All those place holders are also allowed to have the prefix *end* (e.g.
*end_year*). The FileSet will use them to retrieve the start and end of the
time coverage from the file path.

User-defined placeholders
+++++++++++++++++++++++++

Further recipes
===============

TODO: Split this section and move it to FAQs.

Use parallel processing
+++++++++++++++++++++++

If you have many files in your fileset and you want to apply a function on all
of them, you can use :meth:`~typhon.files.fileset.FileSet.map` to apply this
function in parallel processes or threads.

This simple example collects the start times from all files with parallel
processes:

.. code-block:: python

   b_fileset = FileSet(
       path="data/SatelliteB/{year}-{month}-{day}/"
            "{hour}{minute}{second}-{end_hour}{end_minute}{end_second}.nc"
   )

   def get_start_time(file_info):
       """Simple function to get the start time from each file"""
       return file_info.times[0]

   # Collect all start times in parallel processes:
   start_times = b_fileset.map(get_start_time)

You can control which type of parallel workers is used by setting `worker_type`
to *process* or *thread*. The numbers of workers can be set via `max_workers`.

How about processing the content from all files in a subroutine? For example,
if we want to calculate the mean from all files. We can use the `on_content`
option for doing this.

.. code-block:: python

   def get_mean(data):
       """Simple function to get the average of the data"""
       return data["data"].mean()

   averaged_values = b_fileset.map(
       get_mean,
       # The on_content option passes the read content of the file instead its
       # info object to the function:
       on_content=True
   )

The `on_content` option passes the read content of the file instead of its info
object to the function. If you need the file info object as well, you can set
`pass_info` to *true*.

You can limit the time period that should be processed, by passing `start` and
`end`:

.. code-block:: python

   def get_mean(data):
       """Simple function to get the average of the data"""
       return data["data"].mean()

   averaged_values = b_fileset.map(
       get_mean, on_content=True, start="2018-01-01", end="2018-01-02",
   )

:meth:`~typhon.files.fileset.FileSet.map` always processes all files in the
given time period, waits for all results and returns them after the last worker
has finished. This might be very time-consuming for large filesets.
:meth:`~typhon.files.fileset.FileSet.imap` allows to process just a chunk of
the data and to get immediate results:

.. code-block:: python

   for mean in b_fileset.imap(get_mean, on_content=True):
      # After the first worker has finished, this will be run immediately:
      print(mean)

You should consider this option if your RAM is limited.

Copy or convert files
+++++++++++++++++++++

Use :meth:`~typhon.files.fileset.FileSet.move` to copy or convert files from a
fileset.

Use filters with magic indexing
+++++++++++++++++++++++++++++++

TODO

Exclude or limit to time periods
++++++++++++++++++++++++++++++++

TODO

redpajama_set_name: RedPajamaGithub


text:
/*global goog, mvc, soy, todomvc */
goog.provide('todomvc.todocontrol');

goog.require('goog.dom');
goog.require('goog.string');
goog.require('goog.events.KeyCodes');
goog.require('mvc.Control');
goog.require('todomvc.templates');

/**
 * this is the control for a todo item.
 *
 * @constructor
 * @param {mvc.Model} model for the control.
 * @extends {mvc.Control}
 */
todomvc.todocontrol = function( model ) {
	goog.base( this, model );
};
goog.inherits( todomvc.todocontrol, mvc.Control );

/**
 * overrides goog.ui.Component#createDom with the todo template.
 *
 * @inheritDoc
 */
todomvc.todocontrol.prototype.createDom = function() {
	var el = soy.renderAsElement( todomvc.templates.todoItem, null, null );
	this.setElementInternal(/** @type {Element} */(el));
};

/**
 * setup for event listeners.
 *
 * @inheritDoc
 */
todomvc.todocontrol.prototype.enterDocument = function() {

	var model = this.getModel();

	// Toggle complete
	this.autobind('.toggle', '{$completed}');

	// Change li class on completion
	this.autobind('', {
		reqs: ['completed'],
		onClass: 'completed',
		noClick: true
	});

	// Delete the model
	this.click(function() {
		model.dispose();
	}, '.destroy');

	// keep label inline with title
	this.autobind( 'label', {
		reqs: ['title'],
		template: function (data) { return data.title; },
		data: {
			title: function (control) {
				var value = control.getModel().get('title');
				return goog.string.htmlEscape(value);
			}
		}
	});

	var inputEl = this.getEls('.edit')[0];
	// Dblclick to edit
	this.on( goog.events.EventType.DBLCLICK, function() {
		goog.dom.classes.add( this.getElement(), 'editing' );
		inputEl.focus();
	}, '.view');

	// blur on enter
	this.on( goog.events.EventType.KEYUP, function( e ) {
		if ( e.keyCode === goog.events.KeyCodes.ENTER ) {
			e.target.blur();
		}
	});

	// finish editing on blur
	this.on( goog.events.EventType.BLUR, function() {
		goog.dom.classes.remove( this.getElement(), 'editing' );
	});

	// bind the title and the edit input
	this.autobind( '.edit', '{$title}' );
};


"Pale gold in color with hints of cocoa, vanilla, peppercorn, and honey are present. This is a prime example of how oak casks can can have an influence."
Smooth. No afterburn. Hints of not too sweet cocoa . Nice as a shot. No need for lime or salt.


All types of religious symbols can be included in an Australian Civil Ceremony if this co-insides with the cultural and spiritual beliefs of one or both of the marrying couple.
"Family and friends, Bride and Groom have come here today to join their lives in the presence of you, their guest in order to create a framework for their future lives together, a framework based on the many traditions in their background and within which they will create a home.
A home in which they, their family and friends will find peace, happiness and tranquility. That home is here represented by the canopy or chuppah under which you stand.
The roof is there to protect you, but there are no walls to indicate that your home will always open to those who love you and are loved by you in return.
Bride and Groom are promising to be true to each other, to respect each other and to grow together throughout the years ahead. They are joining their lives not only as husband and wife but as friends, lovers and confidants.


On September 5-6, 2018, a training was held on the topic: "Social partnership in the issues of ensuring the rights of labor migrants and combating human trafficking", organized by the National Human Rights Center of the Republic of Uzbekistan, the Council of Ministers of the Republic of Karakalpakstan and the Coordination Office of the International Organization for Migration (IOM) for Central Asia.
The training was attended by representatives of the Agency for External Labor Migration under the Ministry of Employment and Labor Relations of the Republic of Uzbekistan and the Republic of Karakalpakstan, the Ministry of Health, Ministry of Employment and Workplace Relations, the Ministry of Justice of the Republic of Karakalpakstan, the National University of Karakalpakstan, as well as the concerned ministries, National Human Rights Institutions and civil society institutions.
The world community today faces a number of challenges and problems associated with migration, including issues of security, regulated and orderly migration.
Challenges and difficulties associated with the effective promotion of safe and regulated migration, ensuring the rights and legal interests of migrants, combating human trafficking and protecting victims of this type of cross-border crime are on the agenda of most countries, including the countries of Central Asia.
Currently, the governments of the Central Asian countries have developed and implemented a number of comprehensive measures aimed at ensuring an effective system for managing migration flows, promoting safe and regulated migration, protecting the rights of migrant workers.
Taking into account the multifaceted nature of migration issues, partnerships between different organizations are important. In this regard, state bodies play a decisive role; the private sector, scientific and academic institutions, civil society, international organizations and relevant links being in partnership, assisting in promoting the ideas of safe and regulated migration, contribute to the protection of rights and legal interests of migrants and victims of human trafficking.
Combating human trafficking signifies, first of all, the eradication of the causes and the grounds on which these crimes are born. The widespread awareness of the population about human trafficking makes it possible to raise the level of responsibility both for their own security and for the safety of their relatives and friends.
In the Republic of Uzbekistan, legal foundations have been created and social partnerships have been carried out in various areas. In particular, the Law "On Social Partnership", "On Combating Human Trafficking" was adopted, social partnership is being developed to promote safe and regulated migration, counter trafficking in human beings and provide assistance to victims of human trafficking.
It should be emphasized the significant contribution of NGOs in the prevention of human trafficking, identification of victims of crime and those responsible for their perpetration. The national model of social partnership between state bodies and civil society institutions in this field are formed practically.
The tasks of combating human trafficking require the development of cooperation of law enforcement bodies with non-governmental organizations (NGOs) that are engaged in the protection and support of victims of human trafficking.
In the Republic of Uzbekistan, NGOs are active in providing assistance to victims of human trafficking, which cooperates with law enforcement agencies, consulates and diplomatic missions of Uzbekistan in this sphere, represents information and advisory services to persons traveling abroad, facilitate the return of citizens who have suffered from human trafficking, and also deal with their rehabilitation.


I'm in addition grateful that this control involving seek out skeletons inwards brilliant laborer, comprising a great practiced faction connected with factors then managers hip soul getting ranking. The search engines will certainly fail to see a person, but thanks a lot used for the whole lot, Amit. Quantities of make somewhere your home have done good to in some way as of Amit's understanding as .
Some plans can include compound quotations in an rank or maybe dispute if these analysess split comparable countenances. Although lessons tend to be told of inside key file of any instant table, I've encounter tables with the intention of roll the mentions available as one on the middle row or even over the primary wrangle.
Learners after that faculty: In case you are benefited, entertain exchan.
With a lot of runaway success game birds masticating hungrily your liberated phase, the idea single unprocessed which round about reduce report gemstones may possibly grasp achieved something a person by simply in the formerly 1 / 2 2016.
We've survived inspired before ready like Tremendous Beef Boy as a consequence OlliOlli, looking to develop a game birds exactly where every song shape of moti.


text:
This post has been self-published on Youth Ki Awaaz by Jai Prakash Ojha. Just like them, anyone can publish on Youth Ki Awaaz. Find out more
Owaisi Aims To Be A 'Vote Katua' (Spoiler) In Bihar, But It's Not Going To Be Easy
By Jai Prakash Ojha in Politics, Staff Picks, Stories by YKA
More from Jai Prakash Ojha
By Jai Prakash Ojha for Youth Ki Awaaz:
Come the Bihar elections and Mr. Md Owaisi's direct attacks on the grand RJD-JDU-Congress alliance, for doing nothing for the material upliftment of the community, treating Muslims as vote bank and raising the bogey of BJP/Hindutva to keep them in perpetual fear and ghettos, seem to be finding a lot of takers in the Muslim community.
Back in the Maharashtra Assembly elections Owaisi's Hyderabad-based AIMIM (All India Majlis-e-Ittehadul Muslimeen) party got only 2 seats. But it ensured religious polarization that led to the defeat of NCP-Congress candidates in a number of seats, resulting in a victory for BJP-Shiv Sena alliance. This time around, in the Bihar elections, the party has decided to put up its candidates in 24 seats of the Seemanchal region which comprises of the 4 districts (Araria, Kishanganj, Katihar and Purnea), and have a significant minority population, varying from around 40 percent to 70 percent of the total.
The JDU-Congress-RJD grand alliance is in a tizzy because of what is popularly being termed as the 'Owaisi factor' that has the potential to polarize the electorate on communal lines and also, lead to the division of so-called secular votes which the alliance has assiduously cultivated.
To top all of that, his enunciation of a new assertive, aggressive and exclusive Muslim polity has found traction among Muslim youths throughout the country in the aftermath of electoral victory of BJP at the Centre and increased belligerence of fringe Hindutva outfits on matters like conversion, uniform civil code and cow slaughter.
Things Might Not Be That Easy For Owaisi
While on a visit to Araria, I saw a lot of development deficit in the region which has become synonymous with poverty and illiteracy. No wonder, Owaisi's pitch for constitution of Special Development Council under Article 371, has endeared him to the people there for what is being termed as an 'out of the box solution' for the area. However, R.S. Thakur of Araria College opines that Owaisi may not be able to cut into minority votes significantly as Muslims tend to vote tactically to defeat BJP. The minority voters had consolidated in favour of RJD and Congress in the previous LS 2014 Elections to prevent BJP from coming to power, and 2015 Assembly Elections would be no different. Grand alliance is their best bet to counter NDA in Bihar. The grand alliance has accused AIMIM of being hands in glove with BJP to divide anti-BJP votes.
Dr. M.N.A. Baig, a JNU product and scholar of Arabic and Persian, who hails from Sitamarhi district of Bihar, feels that local influential minority leaders like Taslimuddin of RJD and Tariq Anwar of NCP have their own pockets of influence which can't be breached easily. Owaisi is merely testing the waters of Bihar for his future forays into state polity. Dr. Baig refuses to buy the theory of homogeneous Muslim voting and emphasizes that Muslims vote heterogeneously like other communities in India.
Muslims constitute around 16-17 percent of the state population which makes it a sizable electoral block. Considering the fact that apart from NDA and Grand alliance, the Bihar Third Front is also in the fray, any minor fluctuation in voting trend may upset the entire electoral picture. Even if Owaisi manages to secure 4-5 percentage minority votes, it will give reasons to the BJP to rejoice. The kind of crowd support that his rally drew in Kishanganj had the messiahs of Muslim polity gasping for breath. In the 2010 Assembly Elections, the NDA got 19 seats out of 24 despite Muslim consolidation towards RJD. It is pertinent to mention that BJP had lost all the 3 MP seats in the region despite a perceptible saffron wave throughout the country.
The Damage That Owaisi Has Managed To Expose
Whatever the outcome of the election results, Owaisi has succeeded to some extent in exposing the sham mainstream secularism of the alliance. The very idea of the RJD-JDU combine is that secular votes should not be divided, and that shows their communal mindset. Their hypocrisy gets manifested in their attempt to prevent communal polarization while advocating for caste polarization. Prevention of communal riots is not a favour that the RJD or Congress has done to the minorities but their constitutional obligation. Rather than be guided by genuine concern for minorities and their incorporation into the power-sharing structure, the constituents of the grand alliance have treated them as vote banks. Mandal survived because minorities were its palanquin bearers after their disenchantment with Congress without getting anything substantial in return. However, lack of an alternative for the minorities may compel them to support the alliance candidates.
Ominous Portends For Polity
For long, the Muslims had put their stakes in mainstream parties and rejected the shrill cries of the exclusive Muslim parties that crop up from time to time but that may be set for change. The Muslims seem to suffer from a trust deficit and a lack of conviction in the state. This perhaps, is the reason for their politics of exclusion and drift towards religious fundamentalism. The rise of AIMIM and All India United Democratic Front in Assam and their increasing popularity may have wide-ranging implications for our polity. The days of Muslim League may be revisited if the state fails to address their concerns. And Owaisi and his politics might just make those days come sooner than later.
'Bihar Elections With Ojha' is part of Youth Ki Awaaz's special coverage of the Bihar 2015 elections.
By Akshay Sonawane
Modi Government's 'Historic Measure' Is Just A Band-Aid For Manual Scavengers
By Poornima Mandpe
The Making Of The Reluctant Fundamentalists
By Krishna Singh
Can The Left Regain Lost Ground In Bengal In The Upcoming Assembly Elections?

redpajama_set_name: RedPajamaCommonCrawl


Today we want to talk about the TekTherm Compact professional appliance as an alternative to laboratory devices commonly used for-low temperature cooking, such as the Roner thermostat or the immersion thermostat.
TekTherm Compact is a cooking chamber, developed collaboratively with the Roca brothers (Celler de Can Roca), which guarantees maximum precision at low temperatures thanks to a TSC patent, which ensures accuracy of ±0.2ºC. The exactness of the cooking temperature is especially important in low-temperature cooking in order to obtain moist, uniform results with little reductions. An egg is a clear example; every degree in temperature causes a change in texture.
The immersion thermostat is a laboratory tool that moved to the kitchen because of its exactness, but it still presents some inconveniences for the chef. Since food is placed in the water, it should be vacuum sealed so that its organoleptic properties and qualities remain intact. If the food were to have direct contact with the water, it would lose part of its flavor, and the resulting texture would look like a boiled product. Some inconveniences of working with water and the immersion thermostat include constant dripping when the bags are taken out and transported, water evaporation from the basin during cooking, and the resulting humidity in the room. Another disadvantage is that the water in the basin is not the same temperature throughout; for example, the water is hotter nearer the immersion thermostat than it is on the sides of the basin. All these problems can be avoided with the TekTherm Compact appliance, since it produces cooking that is just as exact but without the sous-vide bag.
The TSC patent for the TekTherm appliances provides thermal stability in the chamber with accuracy of ±0.2ºC. No other oven in the industry has this exactness or uniformity for low-temperature cooking (up to 100ºC).
From left to right, graphs of a combi oven (stability: 2ºC/Uniformity: 4ºC), immersion thermostat (stability: 0.2ºC/Uniformity: 3.5ºC) and TekTherm Compact with the TSC patent (stability: 0.2ºC/Uniformity: 0.6ºC).
TekTherm Compact offers more stability than conventional combi ovens and greater uniformity than immersion thermostats.
Using TekTherm Compact leads to savings of up to 76% in energy consumption compared to immersion thermostat in cooking over long periods of time because the TSC precision technology manages the energy needed each second to keep the cooking chamber stable. For this reason, cooking at night is more low-cost.
TekTherm Compact is a more efficient technology for long cooking times. The example below demonstrates this concept: Cooking at 65ºC for 12 hours has a daily energy consumption of 1.76 kW/h with TekTherm Compact compared to the 7.28 kW/h with the immersion thermostat. Likewise, cooking at 65ºC for 12 hours a day has an annual energy consumption of 387.2 kW/h compared to the 1,601.6 kW/h with the immersion thermostat.
TekTherm Compact incorporates the Predictive Cooking patent, which allows the desired temperature to reach the center of the food and does not allow the temperature to continue rising from the product's thermal inertia. Food can, therefore, be left in the oven indefinitely without being overcooked. The TSC and Predictive Cooking patents provide completely uniform cooking of food, both on the inside and out.
Greater production capacity with the resulting saved kitchen space. TekTherm Compact is a small appliance with 3 GN 2/3 capacity, which also ensures the utmost speed in changing temperatures.
Sous-vide cooking: as precise as an immersion thermostat but more convenient (without the inconvenience of water) and uniform, less energy consumption, and optimization of kitchen space.
Low-temperature cooking: low temperature cooking with or without vacuum-sealed bags for uniform cooking results with 25% fewer reductions.
Dehydration: work without steam and extract the humidity from the chamber.
Steamer: get the best results with seafood thanks to the latest steam technology and TSC precision.
Pasteurization: increase product shelf life up to 120%.
Fermentation: TSC precision allows this technique to be reproduced exactly in order to get controlled results.
Regeneration: this technique requires exact temperature precision to prevent the food from being overcooked. TSC precision and its humidity control allows precooked food to maintain its juiciness and freshness.
Preservation: it is very important to precisely control the temperature and humidity to avoid drying out and alterting the properties of the food.


EXCLUSIVE: Mandy Moore is set as one of the leads in ABC's single-camera comedy pilot Pulling, based on the praised 2006 British series. The pilot, written by Lee Eisenberg and Gene Stupnitsky and directed by Jason Moore, revolves around three dysfunctional women in their 30s living their lives the way they want, even if society tells them they should have it all figured out by this point. Moore plays one of them, Louise, who is optimistic and desperate to snag a husband — but her man-hungry tactics typically backfire. ABC Studios and Kapital Entertainment produce, with Sharon Horgan and Dennis Kelly, creators of the original series, executive producing with Eisenberg, Stupnitsky and Aaron Kaplan. ABC has long had its eye on Moore. The network produced a comedy pilot starring the actress last season and earlier this season bought a Rich Appel comedy project she was attached to with a put pilot commitment.
ford (The River) also is returning to ABC as the female lead in drama pilot Reckless. Written/exec produced by Chris Black and directed/exec produced by Martin Campbell, the thriller centers on a resourceful problem solver who, when his wife Sarah (Mumford) is unjustly imprisoned during a political uprising overseas, resorts to entering a world of political intrigue, dangerous alliances and high emotional stakes in order to get her out. Sarah is described as a fearless adventurer working as a doctor at a medical clinic in East Myanmar.


A year and a half after my original write-up of the Ivy Bridge-based Gen8 Microserver, I'm finally doing a last round of pre-launch updates and documenting the upgrades I made.
More links at the end of this post.
The HPE Microserver Gen8 as I received it had the Intel Pentium G2020T processor, a dual core, dual thread, 2.5 GHz processor with integrated Intel HD Graphics. For an ultra-low-end workgroup or SOHO server, that's not too bad, and it's better than the Celeron G1610T option.
But since we're not worried about the warranty and do want a bit more power, we looked at the following options for a CPU upgrade.
Since we didn't have a use case in mind for this, we went for the E3-1265L v2 processor. CPU speed is reasonable, power is within the envelope for this system's cooling capacity, and the price didn't turn out too bad (although it was almost twice as much a year and a half ago).
The system arrived with 16GB of memory, which is the maximum supported with this generation of processor and a two-DIMM-slot motherboard (the CPU will handle 32GB but no more than 8GB per DIMM, and the Memphis Electronics 16GB DDR3 DIMMs require a newer generation of CPU).
The system also shipped with a single 500GB SATA drive and three empty trays for expansion, connected to the onboard B120i storage controller. There's a low profile slot at the top suitable for an optical drive, or a hard drive carrier. According to the specs, the first two bays are 6gbit SATA and the last two bays are 3gbit SATA. You can add a P222 Smart Controller to provide battery-backed cache and expanded RAID options; these can be had for under $50 on eBay.
I installed a 32GB Micro-SD card for OS boot. Like the previous Microservers, the Gen8 offers an internal USB port, but Gen8 adds a MicroSD slot which may be less likely to snap off during maintenance. If I were running a heavy duty Windows or Linux server on this machine, I'd probably either put an SSD on a PCIe carrier card or use the optical drive SATA connector on the board to mount a boot drive in the optical bay. But for VMware or appliance-type platforms, or for light use Linux, the MicroSD should be enough.
One of the first things I do when building or populating a system is to upgrade any applicable firmware on the system. This could include the lights-out management, the system BIOS itself, drive controllers, optical drives, etc.
This gets complicated with HPE gear, as they decided to restrict all but "critical" BIOS update to customers with active support contracts or warranties. There are dubious workarounds, but it's more of a pain than for any other mainstream vendor. Luckily (and I say that sadly), some of the critical vulnerabilities around Intel microcode in the past year led to the most recent Microserver Gen8 BIOS being considered critical.
With the switch connected to our upstream POE switch and the Microserver's three network ports (two gigabit LAN, one ILO) connected to the switch, I upgraded the firmware on all three components and installed CentOS 7 from the latest ISO image via external USB flash drive. Additionally, I got a free 60-day trial license for ILO 4 Advanced from HPE.
One quirk I ran into was with regard to the .NET-based remote console and Chrome browser. In short, it doesn't work unless you install a plugin to handle the .NET launching. I didn't want to bother with Java either, so I accessed ILO from Microsoft Edge and used the .NET option from there.
In the near term, I'm planning to install the Aquantia AQN-107 10GBase-T/NBase-T adapter and use it to test a couple of new devices in the home lab. Linux with iPerf or the like should be a good endpoint, and with a Thunderbolt 3-to-NBase-T adapter and an economical NBase-T/10G switch to work with, it should be compact and functional.
Longer term, with the former VMware "$25 server" being converted to EdgeLinux (from the makers of the Antsle servers we wrote about here and here), I will probably have this box serve as my in-home vSphere / ESXi system.
There's a very small chance that I'll break down and get the new Gen10 machine, but with as many spare computers as I have in the home lab now, it's not a high priority.
What have you done with your Microserver recently? Share in the comments, or join the conversation on Facebook or Twitter.
HomeServerShow.com has an exhaustive page on Gen8 upgrades and other features and functions.
And if you want the latest and greatest, the Microserver Gen10 came out a year ago with AMD Opteron X3000 processors.
This entry was posted in Build Report, Hardware Adventures, Home Lab, Vendors and tagged antsle, esxi, freenas, home lab, hpe, microserver, nbase-t, technology, vmware, vSphere by rsts11. Bookmark the permalink.


text:
Messaging app Slack is back online after suffering a worldwide service outage
Published Tue, Oct 31 20178:29 PM EDT Updated Wed, Nov 1 201712:44 AM EDT
Saheli Roy Choudhury@sahelirc
Slack, a popular messaging service, suffered a massive outage late Tuesday evening
At about 9:35 p.m. ET (6:35 p.m. PDT), the company said that services were back online
Slack has about 9 million weekly active users
Chris Ratcliffe | Bloomberg | Getty Images
Popular workplace messaging service Slack suffered a massive outage late Tuesday evening, leaving users around the world unable to send or receive messages and files.
The service failed around 7 p.m. ET and partially resumed by 9:13 p.m. ET. At that time, the company said some users were able to successfully connect to the messaging app, but cautioned the issue is not yet fully fixed.
Slack tweet: We're hearing reports of successful connections. Things should slowly be returning to normal but we're not fully out of the woods just yet.
At about 9:35 p.m. ET, the company updated its status page, saying all users should be able to use the messaging app again.
The company also apologized for the disruption and thanked users for their patience.
Slack tweet: We're sincerely sorry for the service disruption you're seeing at the moment. We're working on it with top priority.
Slack tweet: It's smooth sailing again. Everyone should be able to connect to Slack. Thank you for your time and patience, we know how precious both are.
Slack has about 9 million weekly active users and is a popular mode of communication among many Silicon Valley firms, Fortune 100 companies and media organizations. On its website, Slack says it has more than 50,000 paying companies that use the service.
The messaging app raised $250 million in a funding round led by Japanese tech giant SoftBank in September. That put the company's overall valuation at $5.1 billion.
Users took to social media to complain about the service disruption. In true internet fashion, the memes and the jokes soon followed:
Rachel Heine: tfw you wanna slack your coworkers a funny tweet about Slack being down, but SLACK IS DOWN!!
Thomas Fuchs: Is IRC still a thing? Where do people go when Slack is down?
Matt Pearce: Whichever newsroom refused to add Slack, like Battlestar Galactica, is going to conquer us all tonight.
Dima Spivak: Slack is down and I don't know how to complain to my coworkers about it.
Matthew Patterson: For remote companies, #slack going down is like


I am both a regular "rejecter," as well as a frequent "rejectee," submissions thrown back in my mailbox without explanation or much ink. Of course, neither aspect is easy. As Editor, the rejections I tender result from time and attention invested in the good-faith offering of a contributor, one worthy of respect if not always suited to the DMQ. Each is sent to and read individually by our editorial team members.
The literary rejections I receive come differently: sudden, swift and clinical with none of the care apparent I know goes into the process. Only the "Sorry" stands out, an arrow shot to the core. Our rejections likely have similar effect.
All creation bears rejection at its center. Writers reject a word, a phrase, a line, whole beginnings, an ending often completely rewritten. Characters eliminated. We reject form or free verse, style cherished by others. With some enthusiasm we dismiss a point of view, a voice, a whole era, and by these and countless decisions shape our creative endeavors toward some personal aesthetic that brings satisfaction. What could be better than creating?
Seeing that same work accepted and enjoyed by others, of course. And so we hang in the balance awkwardly.
In this spirit of commonality, in the ups and downs, the rejecter as well as rejected, we offer the Summer 2006 issue of the DMQ Review for your reading pleasure. We are proud of the work we present, aware of our part in the careful throwing back, the saving and the letting go, that marks and affirms creative accomplishment.
We wish our readers enjoyment in these poets' fine work and especially thank our Featured Poet Nin Andrews for her poetry and thoughtful words on the importance of reading to the writing life excerpted from Poet's Bookshelf. To our many contributors, published or not, we wish ongoing passion in your writing.


I have never been a creature of habit. When things get to be too predictable, I get an anxious feeling that life is passing me by. Perhaps this is the reason that eduction has been such a good fit for me. Change and new learning are always afoot! Meeting new people, changing grade levels, attending professional development and navigating through the politics of the time provide food for thought and a landscape to navigate that takes all of my personal and professional resources. The quest for me is to maintain a larger perspective of what really matters and not get sucked into the vortex of ever increasing demands.
I work hard and play hard. A good friend of mine use to marvel that one hot tub after I arrived at "The Secret Garden", her B&B on Bowen Island, and I had geared down from "10" to a happy "2". This Spring Break, my play opportunity, aka Spring Break, has taken me to Vietnam for a much anticipated visit with my darling daughter. We have escaped the humidity of Hanoi and are now settled in a little piece of tropical paradise in Phu Quoc. One day on our secluded little beach with hammocks, a few kayaks for our use and a good book and I have officially geared down to a "2". I suspect the relaxation speed corresponds directly with the lush greenery surrounding us. All that O2! Although I must confess I pulled my hammock away from those green coconuts overhead on the beach with a remaining vestige of control.
My daughter, Larkyn, and her boyfriend, Justin, are both teaching in Vietnam at ILA, International Language Academy. It has a carefully delineated program to ensure standardization in English language instruction in institutions around the world. Yesterday Justin started to tell me about this new thing, PBL, that was being introduced into the courses with the higher level students. The Project Based Learning is technology based and facilitates collaboration, communication and problem solving between students. Students for the first time have the power to choose interest areas to pursue and develop vocabulary around those interests.
I taught practicing teachers at the Bureau of Education in Fuyang for two summer sessions in 2008 and 2009. I worked with four other educators from Coquitlam, British Columbia, teaching educators English and ways to engage students in learning. It was an amazing opportunity for personal learning. I gained a much better understanding of my students from China and the challenges facing the educators in China trying to implement practices that were bringing such strong results in the Western World. Rote learning was not just a philosophical position but a way to manage behaviour and safety in classes of 50 or more students. Teaching students how to write tests determined their ability to further their education, access opportunities and care for family.
Project based learning is an exciting possibility for implementing change in school systems. My principal, Rosa Fazio, is off to China this Spring Break, to inspire educators with the ways teachers are using technology and student interest to inspire profound learning at the Kindergarten to Grade 8 level at Norma Rose Point. There is part of me that is excited to go back to school after break to discuss what we have learned over the holidays. Yes, I'm sitting with my coffee in a little piece of paradise feeling very grateful to be an educator.
I have been described as a fast processor, divergent thinker, creative, the Tasmanian Devil (cartoon version) on speed and masterful multi-tasker. I have also been informed my desk is too messy, my purse too full and my overstuffed bags should not be carried back and forth from home to school. This being the case, I have engaged in a lifelong pursuit of the ultimate organizational system to allow me to expedite and coordinate family demands, professional responsibilities, social schedules, travel plans and provide the time to allow me to read, write, exercise, get outside and to sleep. This Christmas, Santa, in his infinite wisdom, put Daniel J. Levitin's book The Organized Mind: Thinking Straight in the Age of Information Overload, in my stocking.
Daniel J. Levitin takes the reader not so much on a tour of the evolution of the brain, but the evolution of the demands on the brain. This book includes but moves beyond the typical self-help shelf about how to find keys and remember names. This book is neuroscience meets cognitive psychology. It is exceptionally well researched and provides the information about the workings of the brain that provides important considerations such as time, relaxation, focus, sleep and engagement to organize aspects of home, social and the business life.
Levitin brings to light the objections raised to the proliferation of books by 15th century intellectuals: The concern was "…people would stop talking to each other, burying themselves in books, polluting their minds with useless, fatuous ideas." (p.15) Our concerns have shifted with what to do with our addiction to internet, cell phones and social media. New technologies are not to be dismissed, but considered in light of what we are gaining, what we are losing and how to best use them for our purposes. The primary consideration is the working of the prefrontal cortex and the ways that we can focus our attentional systems and assist our memory system in coping with the demands being made on them.
Strategies are suggested to organize our world so we don't get lost in the endless pursuit of keys and cell phones. Bayesian probability models are explored through use of the fourfold table which sheds a whole new light on taking control of health related decisions. I am committed to only multi-task the minutia that does not require focused thinking. I will continue to call my Dad en route to the gym and unload the dishwasher while I make coffee, add to the grocery list and listen to Ted Talks. The shift is that I will jot down ideas and things to do on index cards (to be sorted, categorized and completed later) and close the door in order to focus on tasks requiring more focussed thinking and to maximize my creativity. Yet, the biggest take-away for me is making decisions about how I use time and organize based on information about how the brain works. Levitin has been able to provide the information required to take control over the barrage of information that is tossed our direction on a regular basis. I recently signed up for a two week online blogging class provided compliments of WordPress. I have been able to sift through the myriad of ideas and incorporate the tools that externalize memory and are conducive to focusing my attentional system. The mark of a great book for me is that it creeps into your thoughts and discussions long after it's been read. Great book!
It was interesting when I first looked at the WordPress stats and realized that people beyond my friends, relatives and acquaintances were reading my professional blog. It was flattering but also gave me the sense that there were many like-minded people who I'd like to connect with. I just don't quite know how to do that. My quest for 2016 is to figure that out.
I have a three pronged plan to develop a online community of people to challenge my thinking with divergent opinions, affirm my "ah ha" moments and shared realities, and provide information and thoughts on their own educational contexts.
I signed up for Blogging 101 offered by WordPress. Thanks for pushing the card on this post, Josh!
I'm scheduling time to respond to other bloggers.
The focus of my professional blog has morphed from a singular focus on literacy development to encompass a broad spectrum of professional issues and concerns. I hope you'll join me in my efforts to develop an online community of learners.
I have the great pleasure of working with Virginia Bowden at Tecumseh this year. Through her work with students participating in The District Gifted/Enrichment Seminars and my role as Computer prep teacher with the District MACC students, we have arrived at convergent inquiry interests. Thanks to the mentoring of Judy Halbert and Linda Kaser – through both Vancouver sessions and their book, Spirals of Inquiry, we are making our way along the path toward framing our inquiry question. When we first sat down to scan what was going on for our kids and the experiences we were providing, we came up with some similar experiences and perceptions.
Both of us were exploring how technology could be used to not just replicate tasks done offline but help students to apply their background knowledge, make connections and actually deepen student thinking and reflection. Yes, and spark their interests, passions, and develop writing skills! Providing the assignment or conveying information through interest focused blogs (ie. http://tecumsehcomputerwhiz.wordpress.com/) became very teacher focused and invited conversational (chat-like) responses and comments not doing much more than scratching the surface. Our hunch was that blogging could be a way to allow students to go deeper by pushing their thinking – either in reflective responses or the ability to engage their audience in their writing. The quest is to discover the route.
I'm wondering about how student choice over the theme of their blog will impact the investment in creating thoughtful blog posts? Virginia is thinking a lot about how much class time is required for students to be able to reflect on their day in a way that pushes them to use their higher order thinking skills? Both of us wonder how thoughtful comments from peers can extend thinking?
In order to teach students about blogging in a somewhat protected environment, Virginia started using Kidblog. We both now have our groups set up in classes so students can write their own blog posts and invited comments from classmates without it having to be moderated by the teacher or necessitate use of pseudonyms. We're also exploring the privileges that are extended to parents and guests. Virginia is focusing on daily reflections of learning throughout the day. I am focusing on developing student voice and ability to engage their target audience into blogs that reflect their own interests. We're both still considering where we are going with our learning and what our students need from us to use technology to extend their thinking in thoughtful ways..


Shelly Jarvis began working on young adult fiction thanks to a writing assignment in Mrs. Burger's eleventh grade English class, but her passion for writing developed at seven when she wrote a Halloween tale about a witch and a ghost who became best friends.
An avid science fiction and fantasy fanatic, Shelly spends a large portion of each day dwelling in other worlds. She gives credit to Madeleine L'Engle with her introduction to the genre, J.R.R Tolkien for expanding her view, and Patrick Rothfuss, George R.R. Martin, and J.K. Rowling for blowing her mind.
Shelly enjoys spending time with her wacky husband, Joe, her wonderful family, and her rescue pups, Gimli, Butters, Fergus, and Pickles. She currently resides in West Virginia, in the wild and wonderful mountains that have her heart.


text:
Q: Why won't OSA_LIBRARY_PATH not work as documented for JXA? According to Apple's Developer Docs the Library global allows one to import compiled scripts so they can be used as a library in one's current script. This works just fine if you were to do something like the below code with myLibName.scpt located at ~/Library/Script Libraries:
myLib = Library('myLibName');
myLib.myLibMethod() // Works just fine

But, the docs also claim that one can export an environment variable — OSA_LIBRARY_PATH containing a string of : delimited paths — and Library() would then defer to that list of paths before proceeding to it's default path: ~/Library/Script Libraries. Ya know, like the bash environment variable Path. Here's the relevant piece of documentation below; it describes the path hierarchy:

The basic requirement for a script to be a script
  library is its location: it must be a script document in a "Script
  Libraries" folder in one of the following folders. When searching for
  a library, the locations are searched in the order listed, and the
  first matching script is used:

*

*If the script that references the library is a bundle, the script's
  bundle Resources directory. This means that scripts may be packaged
  and distributed with the libraries they use.

*If the application running the script is a bundle, the application's bundle Resources
  directory. This means that script applications ("applets" and
  "droplets") may be packaged and distributed with the libraries they
  use. It also enables applications that run scripts to provide
  libraries for use by those scripts.

*Any folders specified in the environment variable OSA_LIBRARY_PATH. This allows using a library
  without installing it in one of the usual locations. The value of this
  variable is a colon-separated list of paths, such as /opt/local/Script
  Libraries:/usr/local/Script Libraries. Unlike the other library
  locations, paths specified in OSA_LIBRARY_PATH are used exactly as-is,
  without appending "Script Libraries". Supported in OS X v10.11 and
  later.

*The Library folder in the user's home directory, ~/Library.
  This is the location to install libraries for use by a single user,
  and is the recommended location during library development.

*The
  computer Library folder, /Library. Libraries located here are
  available to all users of the computer.

*The network Library folder,
  /Network/Library. Libraries located here are available to multiple
  computers on a network.

*The system Library folder, /System/Library.
  These are libraries provided by OS X.

*Any installed application
  bundle, in the application's bundle Library directory. This allows
  distributing libraries that are associated with an application, or
  creating applications that exist solely to distribute libraries.
  Supported in OS X v10.11 and later.

The problem is that it doesn't work. I've tried exporting the OSA_LIBRARY_PATH variable — globally via my .zshrc file — and then running a sample script just like the one above via both the Script Editor and the osascript executable. Nothing works; I get a "file not found" error. I found this thread-where-the-participants-give-up-hope online; it doesn't explain much. Any thoughts?
On a somewhat related note, the Scripting Additions suite provides two other methods — loadScript and storeScript — that seem like they might be useful here. Unfortunately, when you try to use them, osascript gives you the finger. Though, I did manage to return what looked like a hexadecimal buffer from a compiled script using loadScript. Anyway, any insight you guys can shed on this would be much appreciated. Thanks.

A: The OSA_LIBRARY_PATH environment variable is ignored by restricted executables when running with System Integrity Protection enabled.
To workaround this limitation you can either turn off SIP, or you can use an unrestricted executable.
For instance, to make osascript unrestricted, you should first make a copy, and then re-sign it with an ad-hoc signature:
cp /usr/bin/osascript ./osascript
codesign -f -s - ./osascript

Once you have the unrestricted osascript, you can run it with the OSA_LIBRARY_PATH environment variable set like this:
OSA_LIBRARY_PATH="/path/to/libs" ./osascript path/to/script.scpt

A: As a lousy alternative, you can put a symlink at one of the "Script Libraries" folders that osascript would look at and point it to the folder you want. Note that the symlink must be a replacement for the entire folder, it can't just exist inside of it.
rm -rf ~/Library/Script\ Libraries
ln -s "/Your/Custom/Path/Goes/Here/" ~/Library/Script\ Libraries

Tested on 10.13.2

redpajama_set_name: RedPajamaStackExchange


Airclima, an Elettrodomex Srl climate division, is specialized in the production of split or channeled air conditioners, both civil and industrial, in addiction to air treatment and purification systems, maintenance and technical support.
Our activity is highly focused on after sales service.
Everything is managed with the best technology available, efficiency and courtesy.
We offer free inspections and quotation in addition to consultancy for architectural firms and construction companies.
Contact us for more informations or a customized quote.


Former Vice President, Atiku Abubakar, has won the presidential primary election of the Peoples Democratic Party (PDP).
Atiku Abubakar polled 1532 votes to get the ticket, defeating his closest rival the Governor of Sokoto State, Alhaji Aminu Tambuwal, who polled 693 votes at the party's National Convention held in Port Harcourt, Rivers State.
Governor Ifeanyi Okowa, Chairman of PDP Convention Committee, disclosed this on Sunday at the Adokiye Amaesiamaka Sports Complex, Igwurita-Ali, Port Harcourt, Rivers State while announcing the results of the 2018 special national convention of the party.


Is continuing professional development (CPD) available to software developers?
Trying to keep the overall question + answers applicable to anyone in Software, but advice RE my specific points at the bottom would be amazing!
I left college in July at 18, and got a job as a web developer full time 2 months later instead of going to University like most 18 year olds do in England, and am studying Computing & IT with Business (BSc) at the Open University part time.
I managed to land this job because I've been working on a family friend's Rails startup idea for 2 years part time around school, despite not having a degree to go into a graduate role.
While my parents employers (NHS and YAS) provide official CPD, I haven't heard anything about this in my field of work.
Do people in software often get the opportunity to take courses, CPD etc., funded by the employer?
What sort of courses and training are available that are even relevant to the field?
Would a small startup (10-15 employees) even consider providing CPD + training to their developers?
I consider skills development opportunities each time I interview with a company, and I negotiate it as part of my employment contract.
Usually companies are pretty good, and will agree to a book budget and an online subscription to something like Pluralsight or Udemy, but I have also been able to negotiate myself things like annual conference budgets and other things.
My current employer offers all these things (including international conferences), as well as hack days (on projects other than the companies), days organised with companies such as Amazon (for AWS learning) and Microsoft (for .Net and Azure learning) and other things.
While basic skills for the job are certainly the employees responsibility, no job role is frozen in time and the point of "continuous professional development" is to grow your skill set and experience level in a way which is beneficial to all involved.
You will learn better ways of doing things, things you should not be doing, and you will keep abreast of updated versions of the software you are working with. All of those are beneficial to both employee and employer, and thus all employers should IMHO offer some degree of CPD opportunity, even if its as little as a subscription to the O'Reilly Safari bookstore or a Pluralsight subscription.
So, in short, it entirely depends on the company, but yes CPD is not an unknown in the software industry - and indeed in my experience its getting better each year.
Often, though not always. The best employers realize that their staff both need and want to grow, and may offer training to help with that.
(The best employees recognise that their career development will always be their own responsibility, first and foremost... I've had several interviewees try to explain to me that they don't have the skills they need to do the job I'm hiring for, but it's their current employer's fault for not training them, so I should hire them anyway. It's not a convincing argument).
There are many sites that offer online courses available fairly cheaply, see for example Udemy (I have no affilation with them, other similar sites exist).
More formal qualifications (such as Microsoft's MCSD, again no affiliation) are more comprehensive, but more expensive, so may be harder to convince an employer to pay for.
Thanks for contributing an answer to The Workplace Stack Exchange!
Not the answer you're looking for? Browse other questions tagged software-industry software-development training continuing-education professional-development or ask your own question.
What is the difference between Hours Available and Hours Used?
How do i switch to development job after having experience in Software Testing?
Is Software Development not for me?
Professional Institutions : Would membership of one preclude joining another?
Is there really a shortage of software developers?


text:
Pink Floyd to re-form for Live 8 concert
LONDON (AP) – Organizers of the London Live 8 concert said Sunday that the original members of the British rock band Pink Floyd would perform at the July event for the first time in more than two decades.
Guitarist David Gilmour, drummer Nick Mason, bass player Roger Waters and keyboard player Richard Wright have not performed on stage together since 1981.
The group, which achieved major success with their 1973 album "Dark Side Of The Moon," will join musical acts including Elton John, Madonna, Paul McCartney and Coldplay at the anti-poverty concert in Hyde Park on July 2.
"Like most people I want to do everything I can to persuade the G-8 leaders to make huge commitments to the relief of poverty and increased aid to the third world," Gilmour said.
"It's crazy that America gives such a paltry percentage of its GNP to the starving nations."
Waters, the group's founder, split with the rest of the band after a falling-out in the 1980s
"Any squabbles Roger and the band have had in the past are so petty in this context, and if re-forming for this concert will help focus attention then it's going to be worthwhile," Gilmour said.


Your wedding day should be as unique as you and as unforgettable as your love story.
Our Destination Wedding Specialists have a passion for making your experience as effortless, stress-free, and enjoyable as possible. Whatever your vision may be, large and elaborate, or small and intimate, we love to make your special day unforgettable.
the best we possibly can.
Still undecided whether or not to have a destination wedding? Here are 10 reasons you should take the plunge!
Find answers to some of the most frequently asked questions!


I've been so tired this week for no real reason. I met Danielle for dinner last night but have otherwise been enjoying my evenings at home. I haven't necessarily been sleeping well, but with Albert traveling for work, the house has been a nice, quiet environment where I can decompress after a string of long work days. I'm looking forward to a fun wedding tomorrow and then seeing where the weekend takes me from there!
I had a great time in Boston over the weekend. I'm so glad I ended up making the last minute trip because otherwise it would be nearly two weeks apart from my beau. The best part about this trip is that is wasn't tied to anything. With no weddings to attend, we could make our own schedule on the fly. The whole weekend actually felt longer.
We spent Sunday afternoon at Boston's 2nd annual seafood festival. Though it was crazy hot, it was actually really fun. They had a ton of vendors and I stuffed my face with four courses of seriously delicious seafood. The Seaport is actually one of the few parts of Boston I'd never really explored so it was nice to see something new. And not just new to me – this area was all shiny new construction, which seems so different from the rest of Boston. We'll be back in The Seaport next month for a wedding so it was great to do a little recon – we'll be the in-the-know ones of our friends!
I'm not a big fruit person, but it was the middle of a heat wave when I went grocery shopping on Monday so these berries looked super inviting. They ended up being delicious and didn't even need any sugar. I actually washed them all off and put them in a cute bowl rather than store them in the plastic container from the store, something that, for some reason, felt very adult.


text:
SouthworldDossier January 2016Chad. A country of contrasts
The 19th of October does not mark any particular anniversary or festivity in Chad, and neither will it in the future. However, this date took on a symbolic meaning, last year when two men representing the past, the present and possibly the future of the country ideally, met each other in a Dakar court.
One was former president Hissène Habré, under trial at the Extraordinary African Chambers, an 'ad hoc' tribunal set up in 2012 to judge the atrocities committed during his regime. Between 1982 and 1990, according to the charges laid against the former head of state, more than 40,000 people were killed at his order, 54,000 detained and others tortured or abused in many ways. The second man, testifying in the dock about what happened on 1st April 1989 in Chad's capital, N'Djamena, was one of such victims. Even a quick look at his personal details, however, made clear that he wasn't an ordinary person. A child on the afternoon when he was forced to leave his home to escape death, Oumar Déby is now a state official and, what is more important, the brother of the current president of the country, Idriss Déby Itno, who unseated Habré after leading a rebellion against the same regime he had been part of.
The ambivalent link between Déby and Habré can be taken as a representation of the ambiguity of today's Chad. An oil producer which has failed to deliver the benefits of economic growth to the majority of the people, a once shaky government which is now playing a major role in regional geo-politics; a mostly Islamic but secular state which is at odds with the Catholic Church on issues of social justice and yet finances maintenance works in the capital's cathedral: Chad is all these things at the same time. And it's also a country led by a man who overthrew his predecessor to end a wave of horrible human rights abuses and then established his own regime, staying in power for 25 years and more.
Déby's rebellion against Habré, in fact, wasn't the result of a long-standing desire for democracy. The current head of state had even served as the dictator's army chief of staff until Habré suspected him, Mahamat Itno, (the then minister of the Interior) and Hassan Djamous (a powerful commander of the Chadian army) of plotting a coup against him. While Déby managed to escape, the other two were killed and the president also turned on the rest of the Zaghawa ethnic group, to which the three men belonged. So, defeating his former mentor literally became for Déby a question of life or death.
Given this background, one should not be surprised that the new head of state's main aim, when he finally seized the presidential palace in N'Djamena, was consolidating his power:something he did also by joining forces with some of his predecessor's closer aides and allies. Only time will tell if Déby's regime has been brutal to the same extent of Habré's. What is clear, nevertheless, is that the current president has been far more successful in staying in power.
Despite risking several times to be unseated by various rebellions, in fact, he always managed to crush them, and the same can be said of internal dissent. 'Trade unions and political and human rights groups were frequently denied the right to peaceful activities or protests. Most demonstrations were violently disrupted by security forces', Amnesty International writes in its latest country report. In November 2014 even teachers, demonstrating against the high cost of living in N'Djamena and the towns of Moundou and Sarh, were attacked by security forces: one person was killed. A month before, the mere broadcasting of a statement by 12 human rights NGOs over the absence of fuel on the market in this oil-rich country led to the suspension of a community radio, FM Liberté. Not even constitutional provisions stopped Déby from perpetuating his rule on the country. The fundamental charter was amended in 2005 in order to remove presidential term limits and last August Déby officially announced that he will be running for another mandate – his sixth – in the 2016 presidential elections. At the time, he justified the decision quoting security concerns and the menace of Boko Haram: "I would never abandon power leaving Chad in the midst of disorder", he said. The consolidation he is mainly interested in, however, appears to be that of his own status. For it, he relies mainly on his fellow Zaghawa tribesmen: they also are the backbone of the army, and the president's son, Mahamat Déby Itno, has been named second in command of one of the main military operations on foreign soil, in Mali.
If he finds it useful for his power, however, the president does not hesitate to act against his own relatives: in October, his younger brother, Salaye Déby, who was in charge of the customs office, was removed from his post. The decision followed allegations of mismanagement and corruption, but has been seen by most analysts as a mere propaganda move in an electoral perspective. Safe on both the internal and the military plan – especially after a peace deal was signed with neighbouring Sudan in 2009 – Déby's power might however be threatened by another factor. In a bizarre twist of fate, in fact, the current president could soon face the same accusations as his enemy, Habré. In September, Senegalese lawyer Mbaye Jacques Ndiaye filed a complaint against the current leader at the Extraordinary African Chambers. Due to the statutes of the court, no further investigation can be triggered by this accusation but, given Déby's role during the former regime, it is not unlikely that his name will resurface again during the trial. (D.M.)


WENHAM, Mass. (AP) — A local family says the town has wrongfully tried to deny them the use of their home for short-term rentals, even though Wenham has no legal restrictions on such uses.
At issue appears to be the legal definition of short-term rentals versus a bed-and-breakfast or lodging house.
The family argues they're just renting out rooms for one- and two-night stays, with no food or other services provided. But the town says it's still a bed-and-breakfast operation, whether or not breakfast is served.
There's is no permit in place for a bed-and-breakfast at the property, which was the reason town officials gave in issuing a cease-and-desist order this past fall.
Town officials also pointed to a town zoning bylaw on bed-and-breakfasts that said breakfast may be served at such establishments, but included no requirement that breakfast be served.
Until a court says otherwise, she said, they will continue to rent rooms at 253 Larch Row, known as Hurdle Hill Farm.
Town Administrator Peter Lombardi declined to comment for this story, citing the ongoing litigation.
Gallagher has filed suit with trustees William and Henry Phippen seeking to overturn the cease-and-desist order from the building inspector and the decision by the Wenham Zoning Board of Appeals to uphold that order.
The Phippens, who are sons of the original owners, had received a special permit from the ZBA in 2017 to operate a bed-and-breakfast at the family homestead. It's a 6,000-square-foot home, set back from the road, on nearly 14 acres. They and their five siblings were raised there.
But they appealed some amendments that were made to the special permit after the board had voted to approve it on May 31, 2017, according to Gallagher. The changes involved the permit renewal process with the town and the allowed hours and days for functions, which Gallagher said would make it very difficult to run the business. They contend those changes could not be made after the vote was taken without another hearing.
That case is still pending in Superior Court and, as a result, the permit is not in effect.
Meanwhile, the Phippens — who live elsewhere in Wenham and Beverly — decided to rent up to five rooms at Hurdle Hill, starting in January 2018. Gallagher, who had taken care of the Phippens' late parents, continued to live at the home and work as the innkeeper. She had previously run a bed-and-breakfast on Cape Cod.
So they listed the rooms on Airbnb and another service, while still maintaining the website that had already been created for Hurdle Hill.
At most, Gallagher said, they could entertain 10 guests at once. Most of their guests were parents visiting kids at college, usually nearby Gordon College or Gordon-Conwell Theological Seminary — or just visiting family in the area for a weekend. The neighbors were always supportive, she said.
And then, an article was put on the warrant for last April's Annual Town Meeting seeking to regulate short-term rentals in town. Local regulations are allowed under state law.
In short, the proposal sought to establish an annual licensing and fee structure with the Board of Selectmen, required owners to ensure their homes met all building, fire and health safety codes, and limited short-term rentals to a maximum of four guests per home.
Gallagher and others argued the proposal was too restrictive. It was overwhelmingly rejected by residents at Town Meeting.
On Oct. 5, Building Inspector Brian Leathe issued a cease-and-desist order, saying Hurdle Hill Farm was being operated as a bed-and-breakfast without a permit.
Gallagher says she tried multiple times to discuss the issue with Leathe, and after finally meeting with him on Nov. 7, she says he told her he had never inspected the property and had only signed a letter he was handed his second day on the job from Town Administrator Peter Lombardi.
Gallagher appealed the cease-and-desist order in December, noting that there was no file on record about the property nor any complaints about it. But on Jan. 24 the Appeals Board voted to uphold the building inspector's order.
Eventually, in February, Gallagher and the Phippens filed their second suit in Superior Court, claiming Leathe and the ZBA exceeded their authority and that the board's decision should be annulled.
Last week, the town, through the Boston law firm of Pierce Davis & Perritano, filed an answer to the charges, disputing them.
"The defendants acted in good faith, within their discretion, and in the reasonable belief that they were acting in compliance with all relevant state and local laws and bylaws," they said in a court filing.
Gallagher said they are open to some reasonable regulations on short-term rentals, just not what was proposed last year. And they're still hoping for a bed-and-breakfast permit.


text:
Local D-Day veteran remembers invasion 75 years later
by: Lauren Linville
Wichita Falls resident Loyd Voyles, 96, was drafted in 1943 at just 19-years-old. He served on the front lines of the D-Day invasion in Normandy, France.
Although it's been 75 years since the largest seaborne invasion in history, Voyles said he remembers it well.
"I don't remember what I did yesterday, but I remember what I did 75 years ago today," Voyles said.
Seventy-five years is a long time, but Voyles said waiting for his name to be called on to head to Normandy felt like forever.
"One day here they come and [said] 'Okay it's your time to go,'" said Voyles. "So we went down and got on the landing barge and when we got to Normandy, France they were still bombing and shelling," Voyles said. "Bombs were dropping each side of the landing craft and I thought 'well the next one's gonna get me. Pretty rough years, years I never want to go through again."
While those years of his life were rough, Voyles said nothing compares to June 6.
"Normally a lot of horseplay, loud talking with a bunch of young G.I.s," Voyles said. "That time, that day, nobody said a word, just perfectly silent and we all had the same thought: 'is this it, is it the last day of our lives."
Though many years have come and gone, Voyles' mind still goes back to the early 1940s.
"At times I'll think about something that happened during the war about the time I go to bed and I can't get it out of my mind," Voyles said.
Voyles said he was often faced with life or death.
"You know you think in war your mind gets muddled," Voyles said. "It does things to people and I would've thought no more about shooting that pilot of that plane than I would about shooting a rabbit or a squirrel."
Voyles returned home October 31, 1945, holding onto a promise he made his wife.
"When I saw the sign that said Wichita Falls city limits, I threw those cigarettes out the window and I said 'a promise made is a promise kept,'" Voyles said.
Voyles and his wife had 77 years together before she dies in 2018. While his mind may not be as sharp as it used to be, Voyles said he still holds on to two important memories: the love of his life and the battles he fought.
At 96 years young, Voyles said he still makes trips to Walmart and mows his own yard.
by Curtis Jackson / Jan 21, 2021
WICHITA FALLS (KFDX/KJTL) — There's no doubt frontline healthcare workers could use all the help they can get, which is why members of First United Methodist Church have been pitching in.
Over the past few months church members have been doing something special for the community, and this month, they decided to prepare small care packages for frontline healthcare workers.
WFPD investigating shooting suspect on Best Boulevard