text:
Taipei European School
Take Me to TES
Welcome from Board of Directors
Inquiries and Visits
Applications 2020-2021
Extra Curricular Activities (ECAs)
Welcome from Parent Support Council
Life in Taipei
Working at TES
Welcome to Our Alumni Community
The AEFE
Infant School (Cycle 1)
Elementary School (Cycle 2 & 3)
Middle School (Cycles 3 & 4)
High School (Lycée)
Guidance Counselling
Pedagogical Projects
Weekly Memo
German Section
Pedagogical Quality Management
Policies and Curricula
Learning Resources / Lern-Ressourcen
German School Association & Vorstand
TGSEA
British Primary Section
Our Teaching and Learning Vision
Curriculum: Introduction
Curriculum: Early Years
Curriculum: KS1
Specialist Subjects
BPS Policies
British Primary Council
British Secondary & High School Section
Curriculum: IGCSE
Curriculum: IB
Co-Curricular Activities (CCAs)
Graduation Requirement
BSHS Blog
German Section ›
Teaching & Learning ›
The German School Taipei was founded in 1990 and provides children with school education according to German curricula and standards, leading up to general qualifications for enrolment at institutions of higher education.
At a very early stage, the school engaged in close cooperation with the British school and the French school. The schools have combined resources and benefit from a larger shared system. In 2002, the schools joined to form the Taipei European School. Within this framework, the German School Taipei (Deutsche Schule Taipei) functions as the German Section (Deutsche Sektion).
In Primary School up to Klasse 4 and in Secondary School (phase 1) up to Klasse 8, lessons are given on the basis of the framework curricula for German Overseas Schools as approved by the Standing Conference of the Ministers of Education and Cultural Affairs of the German Länder (Federal States).
Students in Klasse 9 and 10 are taught in cooperation with the High School Section using the UK National Curriculum in preparation for the International General Certificate of Secondary Education (IGSCE) of the University of Cambridge and also according to the framework curricula for German Overseas Schools. Classes are conducted both in English and in German. The students sit both the British IGCSE exams, as well as the German exams leading to intermediate centrally administered qualifications. This provides a smooth pathway for German students into the senior High School within the German system (Oberstufe: equivalent to "Senior High School"), as well as to international higher grade programmes.
Klasse 11 and 12 are conducted in English in cooperation with the British Secondary and High School Section and lead to the International Baccalaureate Diploma (IB). In the subject group language A, students attend German classes at a native speaker level. They thereby acquire the bilingual IB Diploma, which is acknowledged in Germany as a general qualification for enrolment at an institution of higher education.
The German School Taipei features small classes, in which students are supported intensively on an individual basis.
During the Federal Government and Länder Inspections (Bund-Länder-Inspektion) in September 2010 and November 2016, the German School Taipei qualified to receive the quality seal "Excellent German Overseas School" (Exzellente Deutsche Auslandsschule). It is a German Overseas School recognised by the Standing Conference of the Ministers of Education and Cultural Affairs of the German Länder (Federal States).
If you are interested in a place in Kindergarten or in school for your child, please contact us. You will find concise information on our school in our Information Brochure.
LOCATION - PRIMARY CAMPUS
Swire European Primary Campus
99 FuGuo Road, ShiLin District,
Tel: +886-2-8145-9007
Fax: +886-2-2832-5058
LOCATION - SECONDARY CAMPUS
Swire European Secondary Campus
31 JianYe Road, ShiLin District,
© 2019 TAIPEI EUROPEAN SCHOOL


text:
"""
===
pai
===

-------------------------
Picture archive inspector
-------------------------

:Author: Pauli Virtanen <pav@iki.fi>
"""
from __future__ import division

__version__ = "0.1.2.dev"

# Sorry, the code is slowly becoming a mess...

import sys, os, shutil, tempfile, re, random, time, traceback, copy
import pygtk
pygtk.require('2.0')
import gtk
import gobject
import gc
import traceback
import optparse

import threading, Queue

IMAGE_EXTENSIONS = [ '.jpg', '.gif', '.png', '.tif', '.tiff', '.bmp' ]

##############################################################################
## Detect Maemo/Hildon
##############################################################################

try:
    import hildon
    HILDON = True
except ImportError:
    HILDON = False

if HILDON:
    DEFAULT_COLUMNS = 1
    MAX_IMAGE_CACHE = 2
    DO_PRELOADING = True
else:
    DEFAULT_COLUMNS = 2
    MAX_IMAGE_CACHE = 10
    DO_PRELOADING = True

##############################################################################
## GUI threading helpers
##############################################################################
#
# Every time you call a non-threadsafe GTK function (=most of them),
# be sure that either
#
# 1. The function where you make the call is a GTK signal handler, OR,
# 2. The function is in GUI thread and holding the GDK lock, OR,
# 3. You make the call via run_in_gui_thread or run_later_in_gui_thread
#
# Note: gobject.* callback functions don't reserve the GDK lock.
#       To avoid confusion, ONLY USE THE run_* FUNCTIONS BELOW.
#

#
# Blocks to run in gui thread sometime later (as a shorthand) can be
# specified via
#
# >>> @run_in_gui_thread
# ... def _():
# ...     stuff_to_do
#
# But remember how lexical binding works though,
#
# >>> item = True
# >>> def foo():
# ...     assert item == True
# >>> item = False
# >>> foo()
# Traceback (most recent call last):
#   ...
# AssertionError
#

def run_in_gui_thread(func, *a, **kw):
    """Run the function in the GUI thread, next time when the GUI is idle."""
    # NB: gobject.idle_add functions are in main thread, but NOT inside
    #     the GDK lock
    def timer():
        gtk.gdk.threads_enter()
        try:
            func(*a, **kw)
            return False
        finally:
            gtk.gdk.threads_leave()
    gobject.idle_add(timer)
    return None

def run_later_in_gui_thread(delay, func, *a, **kw):
    """Run the function in the GUI thread, after a delay"""
    # NB: gobject.idle_add functions are in main thread, but NOT inside
    #     the GDK lock
    def timer():
        gtk.gdk.threads_enter()
        try:
            func(*a, **kw)
            return False
        finally:
            gtk.gdk.threads_leave()
    gobject.timeout_add(delay, timer)
    return None

def assert_gui_thread(func):
    """Assert that this function is ran in the GUI thread. [decorator]"""
    if not __debug__: return func
    def _wrapper(*a, **kw):
        assert threading.currentThread() == threading.enumerate()[0], \
               (func, threading.currentThread(), threading.enumerate())
        return func(*a, **kw)
    return _wrapper

##############################################################################
## Image list / recursive archive unpack
##############################################################################

import zipfile
import tarfile
import subprocess

class ExtensionMap(dict):
    def __init__(self, dictionary=None):
        dict.__init__(self)
        self.update(dictionary)

    def has_key(self, string):
        for key in self.iterkeys():
            if string.lower().endswith(key):
                return True
        return False

    def get(self, string, default=None):
        for key in self.iterkeys():
            if string.lower().endswith(key):
                return dict.__getitem__(self, key)
        return default

    def __contains__(self, string):
        return self.has_key(string)

    def __getitem__(self, string):
        for key in self.iterkeys():
            if string.lower().endswith(key):
                return dict.__getitem__(self, key)
        raise KeyError(string)

def numeric_file_sort(filelist):
    """Return the given list, sorted by file name, not heeding
       leading zeroes in numbers."""

    def sort_key(filename):
        key = ""
        lastend = 0
        for match in re.finditer("\d+", filename):
            key += filename[lastend:match.start()]
            lastend = match.end()
            key += "%08d" % (int(match.group()))
        return key

    lst = list(filelist)
    lst.sort(key=sort_key)
    return lst

class DummyUnpacker(object):
    def __init__(self, archive_filename):
        self.archive = archive_filename
        self._files = None

    @property
    def files(self):
        """Return a list of full pathnames to the archive"""
        if self._files is None:
            self._files = self._get_files()
        return self._files

    def _get_files(self):
        return [self.archive]

    def open_file(self, name):
        """Open a file in the archive"""
        return open(self.archive, 'r')

    def _prefix_archive(self, lst):
        return [self.archive + os.path.sep + fn for fn in lst]

    def _unprefix_archive(self, name):
        if not os.path.commonprefix([name, self.archive]) == self.archive:
            raise ValueError("File not in archive!")
        return name[len(self.archive)+1:]

class ZipUnpacker(DummyUnpacker):
    def _get_files(self):
        f = zipfile.ZipFile(self.archive, 'r')
        try:
            return self._prefix_archive(f.namelist())
        finally:
            f.close()

    def open_file(self, name):
        name = self._unprefix_archive(name)
        f = zipfile.ZipFile(self.archive, 'r')
        try:
            return f.read(name)
        finally:
            f.close()

class TarUnpacker(DummyUnpacker):
    def _get_files(self):
        f = tarfile.open(self.archive_filename, 'r')
        try:
            return self._prefix_archive(f.getnames())
        finally:
            f.close()

    def open_file(self, name):
        name = self._unprefix_archive(name)
        f = tarfile.open(self.archive_filename, 'r')
        try:
            return f.extractfile(name).read()
        except:
            f.close()

class RarUnpacker(DummyUnpacker):
    def _get_files(self):
        p = subprocess.Popen(["unrar", "vb", self.archive],
                             stdout=subprocess.PIPE,
                             stdin=subprocess.PIPE)
        out, err = p.communicate()
        lst = [fn.strip() for fn in out.split("\n") if fn.strip()]
        return self._prefix_archive(lst)

    def open_file(self, name):
        tmpdir = tempfile.mkdtemp()
        name = self._unprefix_archive(name)

        p = subprocess.Popen(["unrar", "e", self.archive, name,
                              tmpdir + os.path.sep],
                             stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        p.communicate()

        try:
            basename = os.path.basename(name)
            return open(os.path.join(tmpdir, basename), 'r')
        finally:
            shutil.rmtree(tmpdir)

class SevenZipUnpacker(DummyUnpacker):
    def _get_files(self):
        p = subprocess.Popen(["7z", "l", self.archive],
                             stdout=subprocess.PIPE,
                             stdin=subprocess.PIPE)
        out, err = p.communicate()
        begun = False
        lst = []
        for line in out.split("\n"):
            if not begun:
                if line.startswith('-------'):
                    begun = True
                continue
            if line.startswith('------'): break
            lst.append(line[53:])
        return self._prefix_archive(lst)

    def open_file(self, name):
        tmpdir = tempfile.mkdtemp()
        name = self._unprefix_archive(name)

        p = subprocess.Popen(["7z", "e", "-o%s" % tmpdir, self.archive, name],
                             stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        p.communicate()

        try:
            basename = os.path.basename(name)
            return open(os.path.join(tmpdir, basename), 'r')
        finally:
            shutil.rmtree(tmpdir)

def recursive_find(dirname, unpackers, progress_queue=None):
    """Return all files under dirname, with associated unpackers (if any)."""
    pathlist = [ os.path.abspath(dirname) ]
    files = []
    file_unpackers = {}

    while len(pathlist) > 0:
        path = pathlist[0]
        del pathlist[0]

        if os.path.isdir(path):
            if progress_queue: progress_queue.put(os.path.basename(path))

            for fn in reversed(numeric_file_sort([os.path.join(path, i)
                                                  for i in os.listdir(path)])):
                pathlist.insert(0, fn)
        elif os.path.isfile(path) and path in unpackers:
            if progress_queue: progress_queue.put(os.path.basename(path))
            unpacker = unpackers[path](os.path.abspath(path))

            add_list = numeric_file_sort(unpacker.files)
            for fn in add_list:
                file_unpackers[fn] = unpacker
            files += add_list
        else:
            files.append(path)

    return files, file_unpackers

class FileList(object):
    """Get a list of files in given sources, including contents of archives,
    which will be recursively unpacked."""

    zip_extension_map = ExtensionMap({
        '.zip': ZipUnpacker,
        '.cbz': ZipUnpacker,
        '.tar': TarUnpacker,
        '.tar.gz': TarUnpacker,
        '.tar.bz2': TarUnpacker,
        '.tbz': TarUnpacker,
        '.tb2': TarUnpacker,
        '.tgz': TarUnpacker,
        '.rar': RarUnpacker,
        '.cbr': RarUnpacker,
        '.7z': SevenZipUnpacker,
        })

    def __init__(self, filenames, extensionlist=None, progress_queue=None):
        if not isinstance(filenames, list):
            filenames = [filenames]

        # Recursive find
        self._files = []
        self._file_unpackers = {}
        for filename in filenames:
            fns, ups = recursive_find(filename, FileList.zip_extension_map,
                                      progress_queue)
            self._files += fns
            self._file_unpackers.update(ups)

        if extensionlist:
            self._files = [i for i in self._files
                           if os.path.splitext(i)[1].lower() in extensionlist]

    def __str__(self):
        return str(self._files)

    def __getitem__(self, i):
        return self._files[i]

    def __len__(self):
        return len(self._files)

    def open_file(self, fn):
        unpacker = self._file_unpackers.get(fn)
        if unpacker:
            return unpacker.open_file(fn)
        else:
            return open(fn, 'r')

##############################################################################
## ImageCache / ImageView
##############################################################################

class ImageCache(object):
    def __init__(self, filelist, max_items=MAX_IMAGE_CACHE):
        self.raw_pixbufs = {}
        self.scaled_pixbufs = {}
        self.filenames = []
        self.filelist = filelist
        self.max_items = max_items
        self.interpolation = gtk.gdk.INTERP_BILINEAR

    @assert_gui_thread
    def add(self, filename):
        if filename in self.filenames:
            return # noop

        # cleanup cache, if necessary
        if len(self.filenames) + 1 > self.max_items:
            try:
                del self.raw_pixbufs[self.filenames[0]]
            except KeyError:
                pass
            try:
                del self.scaled_pixbufs[self.filenames[0]]
            except KeyError:
                pass
            del self.filenames[0]
            gc.collect()

        # load image (aargh, gtk.gdk.PixbufLoader doesn't work properly...)
        if os.path.isfile(filename):
            raw_pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
        else:
            f=tempfile.NamedTemporaryFile(suffix=os.path.splitext(filename)[1])
            fh = self.filelist.open_file(filename)
            if isinstance(fh, str):
                f.write(fh)
            else:
                try:
                    shutil.copyfileobj(fh, f)
                finally:
                    fh.close()
            f.flush()
            raw_pixbuf = gtk.gdk.pixbuf_new_from_file(f.name)
            f.close()

        # process
        self.filenames.append(filename)
        self.raw_pixbufs[filename] = raw_pixbuf

    def set_interpolation(self, interpolation):
        self.scaled_pixbufs = {}
        self.interpolation = interpolation

    def get(self, filename):
        self.add(filename)
        return self.raw_pixbufs[filename]

    @assert_gui_thread
    def get_scaled(self, filename, width, height, rotated=False):
        self.add(filename)
        try:
            pixbuf = self.scaled_pixbufs[filename]
            if pixbuf.get_width() != width or pixbuf.get_height() != height:
                raise KeyError(filename)
            return pixbuf
        except KeyError:
            pixbuf = self.raw_pixbufs[filename]
            if rotated:
                pixbuf = pixbuf.rotate_simple(
                    gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
            if width != pixbuf.get_width() or height != pixbuf.get_height():
                pixbuf = pixbuf.scale_simple(width, height,
                                             self.interpolation)
            self.scaled_pixbufs[filename] = pixbuf
            gc.collect()
            return pixbuf

class ImageView(gtk.DrawingArea):
    __gsignals__ = {
        'expose-event': 'override',
        'style-set': 'override',
        'direction-changed': 'override',
        }

    def __init__(self, cache, xspacing=0):
        self.xspacing = xspacing
        self.cache = cache

        self.pango_context = None
        self.pango_layout = None

        self.filenames = []

        self.text = u""

        self.rotated = False
        self.zoom_ratio = 1.0
        self.offset = [0, 0]
        self.limits = [0, 0]
        self.screen_size = [0, 0]

        gtk.DrawingArea.__init__(self)
        style = self.get_style().copy()
        style.bg[gtk.STATE_NORMAL] = gtk.gdk.Color(0, 0, 0)
        self.set_style(style)

    def normalize_offset(self):
        def limit(x, a, b):
            return min(max(x, a), b)
        for j in 0, 1:
            self.offset[j] = limit(
                self.offset[j],
                min(0, -self.limits[j]/2 + self.screen_size[j]/2),
                max(0, +self.limits[j]/2 - self.screen_size[j]/2))

    def set_files(self, filenames):
        self.filenames = filenames
        run_in_gui_thread(self.queue_resize)

    @assert_gui_thread
    def do_style_set(self, previous_style):
        if self.pango_layout:
            self.pango_layout.context_changed()
        if isinstance(previous_style, gtk.Style):
            gtk.Widget.do_style_set(self, previous_style)

    @assert_gui_thread
    def do_direction_changed(self, direction):
        if self.pango_layout:
            self.pango_layout.context_changed()
        gtk.Widget.do_direction_changed(self, direction)

    @assert_gui_thread
    def do_expose_event(self, event):
        if not self.window or not self.window.is_visible():
            return False
        if not self.cache or not self.filenames:
            return False
        x, y, width, height = self.get_allocation()

        # draw some text
        text_size = self.__get_text_size_and_prepare_layout()
        height -= text_size[1]

        self.window.draw_layout(self.get_style().white_gc, 0, 0,
                                self.pango_layout,
                                background=gtk.gdk.Color(0,0,0),
                                foreground=gtk.gdk.Color(65535,65535,65535))

        # render image

        self.normalize_offset()
        to_show = self.__get_files_to_show(self.filenames, width, height)
        for xpos, ypos, pixbuf in to_show:
            area = event.area.copy()
            dy = max(text_size[1] - area.y, 0)
            area.y += dy
            area.height -= dy
            self.blit_image(pixbuf,
                            xpos - self.offset[0],
                            ypos - self.offset[1] + text_size[1],
                            area)
        return False

    @assert_gui_thread
    def preload(self, filenames):
        if not DO_PRELOADING:
            return

        if not self.window or not self.window.is_visible():
            return

        if not isinstance(filenames, list):
            filenames = [filenames]
        x, y, width, height = self.get_allocation()
        text_size = self.__get_text_size_and_prepare_layout()
        height -= text_size[1]
        self.__get_files_to_show(filenames, width, height)

    @assert_gui_thread
    def __get_text_size_and_prepare_layout(self):
        if not self.pango_context:
            self.pango_context = self.create_pango_context()
        if not self.pango_layout:
            self.pango_layout = self.create_pango_layout(self.text)
        self.pango_layout.set_text(self.text)
        text_size = self.pango_layout.get_pixel_size()
        return text_size

    @assert_gui_thread
    def __get_files_to_show(self, files, win_width, win_height):
        xpos = []
        ypos = []
        pixbufs = []

        total_width = 0
        total_height = 0

        i = 0
        while i < len(files):
            try:
                raw_pixbuf = self.cache.get(files[i])
            except IOError:
                del files[i]
                continue
            total_width += raw_pixbuf.get_width()
            total_height = max(raw_pixbuf.get_height(), total_height)
            i += 1

        if len(files) == 0:
            return []

        # FIXME: separate layout rotation from image rotation?
        if self.rotated:
            total_width, total_height = total_height, total_width

        available_width = win_width - self.xspacing*(len(files) - 1)
        available_height = win_height

        ratio = min(available_width / total_width,
                    available_height / total_height)
        ratio *= self.zoom_ratio

        for i in range(len(files)):
            raw_pixbuf = self.cache.get(files[i])
            img_width = int(raw_pixbuf.get_width() * ratio)
            img_height = int(raw_pixbuf.get_height() * ratio)

            if self.rotated:
                img_width, img_height = img_height, img_width

            pixbuf = self.cache.get_scaled(files[i], img_width, img_height,
                                           self.rotated)

            # FIXME: separate layout rotation from image rotation?
            if not self.rotated:
                if not xpos:
                    xpos.append(img_width + self.xspacing)
                elif i == len(files) - 1:
                    xpos.append(xpos[-1] + img_width)
                else:
                    xpos.append(xpos[-1] + img_width + self.xspacing)
                ypos.append(.5*(win_height - img_height))
            else:
                if not ypos:
                    ypos.append(img_height + self.xspacing)
                elif i == len(files) - 1:
                    ypos.append(ypos[-1] + img_height)
                else:
                    ypos.append(ypos[-1] + img_height + self.xspacing)
                xpos.append(.5*(win_width - img_width))

            pixbufs.append(pixbuf)

        # FIXME: separate layout rotation from image rotation?
        if not self.rotated:
            xpos.insert(0, 0)
            offset = .5*(win_width - xpos[-1] - xpos[0])
            xpos = [x + offset for x in xpos]
            xpos.pop()
        else:
            ypos.insert(0, 0)
            offset = .5*(win_height - ypos[-1] - ypos[0])
            ypos = [y + offset for y in ypos]
            ypos.pop()

        self.limits = [total_width*ratio, total_height*ratio]
        self.screen_size = [available_width, available_height]

        return zip(xpos, ypos, pixbufs)

    @assert_gui_thread
    def blit_image(self, pixbuf, dst_x, dst_y, clip_rect):
        pixbuf_area = gtk.gdk.Rectangle()
        pixbuf_area.width = pixbuf.get_width()
        pixbuf_area.height = pixbuf.get_height()

        xoff = int(dst_x)
        yoff = int(dst_y)

        clip_rect.x -= xoff
        clip_rect.y -= yoff
        area = pixbuf_area.intersect(clip_rect)

        if area.width > 0 and area.height > 0:
            self.window.draw_pixbuf(self.get_style().black_gc,
                                    pixbuf,
                                    area.x, area.y,
                                    int(area.x+xoff), int(area.y+yoff),
                                    area.width, area.height)
        return True

##############################################################################
## UI
##############################################################################

class CollectionUI(ImageView):

    def __init__(self, sources, filelist, ncolumns=1, rtl=False):
        self.sources = sources
        self.filelist = filelist

        self.cache = ImageCache(filelist)
        ImageView.__init__(self, self.cache)

        self.pos = 0
        self.rtl = rtl
        self.ncolumns = ncolumns
        self.preload_id = 0
        self.update_id = 0

        self.connect("map-event", self.__map_event)

    def next(self, count=1):
        last_pos = self.pos
        self.pos += count
        self.__limit_position()
        if last_pos == self.pos: return

        if not self.rtl:
            self.offset = [-1e9,-1e9]
        else:
            self.offset = [+1e9,-1e9]
        if self.rotated:
            self.offset.reverse()
        self.__schedule_update_position()

    def previous(self, count=1):
        last_pos = self.pos
        self.pos -= count
        self.__limit_position()
        if last_pos == self.pos: return

        if not self.rtl:
            self.offset = [+1e9,1e9]
        else:
            self.offset = [-1e9,1e9]
        if self.rotated:
            self.offset.reverse()
        self.__schedule_update_position()

    def next_screen(self, count=1):
        last_pos = self.pos
        self.pos += self.ncolumns*count
        self.__limit_position()
        if last_pos == self.pos: return

        if not self.rtl:
            self.offset = [-1e9,-1e9]
        else:
            self.offset = [+1e9,-1e9]
        if self.rotated:
            self.offset.reverse()
        self.__schedule_update_position()

    def previous_screen(self, count=1):
        last_pos = self.pos
        self.pos -= self.ncolumns*count
        self.__limit_position()
        if last_pos == self.pos: return

        if not self.rtl:
            self.offset = [+1e9,1e9]
        else:
            self.offset = [-1e9,1e9]
        if self.rotated:
            self.offset.reverse()
        self.__schedule_update_position()

    def adjust_zoom(self, step):
        scales = [1, 1.5, 2]

        try:
            j0 = scales.index(self.zoom_ratio)
        except ValueError:
            j0 = 0

        try:
            self.zoom_ratio = scales[j0 + step]
        except IndexError:
            if step > 0:
                self.zoom_ratio = scales[-1]
            else:
                self.zoom_ratio = scales[0]

        self.offset = [0, 0]

    def pan_around(self, dx, dy):
        """
        Pan the screen (dx, dy) half-screens.

        :Returns: True if position changed, false is screen limits hit.
        """
        xstep = self.screen_size[0]/2
        ystep = self.screen_size[1]/2

        last_offset = [self.offset[0],
                       self.offset[1]]

        self.offset[0] += dx*xstep
        self.offset[1] += dy*ystep

        self.normalize_offset()

        # did pan or hit edge?
        xmin = 3
        ymin = 3
        panned = (abs(self.offset[0]-last_offset[0]) > xmin or
                  abs(self.offset[1]-last_offset[1]) > ymin)
        return panned

    def pan_to_offset(self, x, y):
        """
        Pan the screen to given offset
        """
        self.offset[:] = x, y
        self.normalize_offset()

    def goto(self, i):
        self.pos = i
        self.__limit_position()
        self.__schedule_update_position()

    def first(self):
        self.pos = 0
        self.__schedule_update_position()

    def last(self):
        self.pos = len(self.filelist) - self.ncolumns
        self.__schedule_update_position()

    def update_view(self):
        self.__limit_position()
        self.__schedule_update_position()

    def set_interpolation(self, interpolation):
        self.cache.set_interpolation(interpolation)

    def get_interpolation(self):
        return self.cache.interpolation

    @assert_gui_thread
    def __map_event(self, widget, event):
        self.__schedule_update_position()
        self.schedule_preload()
        return False

    def __limit_position(self):
        if self.pos > len(self.filelist) - self.ncolumns:
            self.pos = len(self.filelist) - self.ncolumns
        if self.pos < 0:
            self.pos = 0

    def preload(self, files, preload_id=0):
        if preload_id != self.preload_id:
            return # expired preload request
        preload_files = self.__get_preload_files()
        for i in range(0, len(preload_files), self.ncolumns):
            j = i + self.ncolumns
            if j >= len(preload_files):
                preload_files += [preload_files[-1]] * self.ncolumns
            ImageView.preload(self, preload_files[i:j])

    def schedule_preload(self, delay=750):
        self.preload_id += 1
        run_later_in_gui_thread(delay,
                                self.preload,
                                self.__get_preload_files(),
                                self.preload_id)

    def __update_position(self, update_id):
        if update_id != self.update_id: return

        files = self.__get_show_files()
        filenames = [ f for f in files ]
        filenames = [ os.path.join(os.path.basename(os.path.dirname(f)),
                                   os.path.basename(f))
                      for f in filenames ]
        self.text = u"%d / %d: %s" % (
            self.pos+1, len(self.filelist),
            unicode(', '.join(filenames), "latin-1"))
        self.set_files(files)

        self.schedule_preload()

    def __schedule_update_position(self, delay=10):
        self.update_id += 1
        run_later_in_gui_thread(delay, self.__update_position, self.update_id)

    def __get_show_files(self):
        endpos = self.pos + self.ncolumns
        if endpos > len(self.filelist):
            endpos = len(self.filelist)

        filelist = self.filelist[self.pos:endpos]

        if self.rtl:
            filelist.reverse()

        return filelist

    def __get_preload_files(self):
        files = []

        ranges = (range(0, 2*self.ncolumns+1, 1)
                  + range(-self.ncolumns,0,1))

        for i in ranges[:MAX_IMAGE_CACHE]:
            if 0 <= self.pos + i < len(self.filelist):
                files.append(self.filelist[self.pos + i])
        return files

class Config(dict):
    def load(self, filename):
        f = open(filename, "r")
        for line in f:
            try:
                key, value = line.split("\t", 1)
                self[key] = value
            except:
                pass

    def save(self, filename):
        f = open(filename, "w")
        for key, value in self.items():
            if key:
                f.write("%s\t%s\n" % (key, str(value)))

class Bookmarks(object):
    def __init__(self, sources, config):
        if not isinstance(sources, list):
            sources = [sources]

        self.config = config
        self.configkey = ':'.join(sources).replace("\t", "_")

        self.values = []

        try:
            if self.configkey in self.config:
                self.values = map(int, self.config[self.configkey].split("\t"))
        except:
            self.values = []

        while len(self.values) < 10:
            self.values.append(0)
        if len(self.values) > 10:
            self.values = self.values[0:10]

    def __setitem__(self, i, value):
        self.values[i] = int(value)
        self.config[self.configkey] = '\t'.join(map(str, self.values))

    def __getitem__(self, i):
        return self.values[i]

class PaiUI(object):

    def __init__(self, sources, filelist, config, rtl=False, ncolumns=2):
        self.config = config
        self.collection = CollectionUI(sources, filelist, ncolumns=ncolumns,
                                       rtl=rtl)
        self.bookmarks = Bookmarks(self.collection.sources, self.config)
        self.collection.goto(self.bookmarks[0])

        self.fullscreen = False

        self.collection.set_size_request(300, 200)
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("destroy", self.destroy_event)
        self.window.connect("key-press-event", self.key_press_event)

        self.window.add_events(gtk.gdk.BUTTON_RELEASE_MASK
                               | gtk.gdk.BUTTON_PRESS_MASK
                               | gtk.gdk.BUTTON_MOTION_MASK)
        self.window.connect("button-release-event", self.button_release_event)
        self.window.connect("button-press-event", self.button_press_event)
        self.window.connect("motion-notify-event", self.motion_notify_event)
        self.window.add(self.collection)

        self.drag_obj = None

    @assert_gui_thread
    def show(self):
        self.window.show_all()
        if self.fullscreen:
            self.window.fullscreen()

    def _do_left(self):
        if not self.collection.pan_around(-1, 0):
            if not self.collection.rotated:
                if not self.collection.rtl:
                    self.collection.previous()
                else:
                    self.collection.next()
            elif self.collection.zoom_ratio == 1:
                self.collection.next_screen(10)
        else:
            self.collection.queue_draw()

    def _do_right(self):
        if not self.collection.pan_around(1, 0):
            if not self.collection.rotated:
                if not self.collection.rtl:
                    self.collection.next()
                else:
                    self.collection.previous()
            elif self.collection.zoom_ratio == 1:
                self.collection.previous_screen(10)
        else:
            self.collection.queue_draw()

    def _do_up(self):
        if not self.collection.pan_around(0, -1):
            if self.collection.rotated:
                if not self.collection.rtl:
                    self.collection.previous()
                else:
                    self.collection.next()
            elif self.collection.zoom_ratio == 1:
                self.collection.previous_screen(10)
        else:
            self.collection.queue_draw()

    def _do_down(self):
        if not self.collection.pan_around(0, 1):
            if self.collection.rotated:
                if not self.collection.rtl:
                    self.collection.next()
                else:
                    self.collection.previous()
            elif self.collection.zoom_ratio == 1:
                self.collection.next_screen(10)
        else:
            self.collection.queue_draw()

    @assert_gui_thread
    def key_press_event(self, widget, event):
        if event.keyval in (gtk.keysyms.q, gtk.keysyms.Escape):
            self.close()

        elif event.keyval in (gtk.keysyms.space, gtk.keysyms.Return):
            self.collection.next_screen()

        elif event.keyval == gtk.keysyms.b:
            self.collection.previous_screen()

        elif event.keyval == gtk.keysyms.Home:
            self.collection.first()

        elif event.keyval == gtk.keysyms.End:
            self.collection.last()

        elif event.keyval == gtk.keysyms.Left:
            self._do_left()

        elif event.keyval == gtk.keysyms.Right:
            self._do_right()

        elif event.keyval == gtk.keysyms.Up:
            self._do_up()

        elif event.keyval == gtk.keysyms.Down:
            self._do_down()

        elif event.keyval == gtk.keysyms.Prior:
            self.collection.previous_screen(10)

        elif event.keyval == gtk.keysyms.Next:
            self.collection.next_screen(10)

        elif event.keyval == gtk.keysyms.r:
            self.collection.rtl = not self.collection.rtl
            self.collection.update_view()

        elif event.keyval == gtk.keysyms.d:
            if self.collection.ncolumns > 1:
                self.collection.ncolumns = 1
            else:
                self.collection.ncolumns = 2
            self.collection.update_view()

        elif event.keyval == gtk.keysyms.u:
            self.collection.unity_ratio = not self.collection.unity_ratio
            self.collection.update_view()

        elif event.keyval in (gtk.keysyms.plus, gtk.keysyms.F7):
            self.collection.adjust_zoom(1)
            self.collection.update_view()

        elif event.keyval in (gtk.keysyms.minus, gtk.keysyms.F8):
            self.collection.adjust_zoom(-1)
            self.collection.update_view()

        elif event.keyval in (gtk.keysyms.o, gtk.keysyms.F4):
            self.collection.rotated = not self.collection.rotated
            self.collection.update_view()

        elif event.keyval in (gtk.keysyms.f, gtk.keysyms.F6):
            if not self.fullscreen:
                self.window.fullscreen()
                self.fullscreen = True
            else:
                self.window.unfullscreen()
                self.fullscreen = False

        elif event.keyval == gtk.keysyms.i:
            if self.collection.get_interpolation() == gtk.gdk.INTERP_BILINEAR:
                self.collection.set_interpolation(gtk.gdk.INTERP_HYPER)
            elif self.collection.get_interpolation() == gtk.gdk.INTERP_HYPER:
                self.collection.set_interpolation(gtk.gdk.INTERP_NEAREST)
            else:
                self.collection.set_interpolation(gtk.gdk.INTERP_BILINEAR)
            self.collection.update_view()

    @assert_gui_thread
    def button_release_event(self, widget, event):
        # determine if it was not a click
        if self.drag_obj:
            x0, y0, t0, offset = self.drag_obj
            self.drag_obj = None
            if time.time() > t0 + 0.500:
                # too long to be a click
                return
            if (event.x-x0)**2 + (event.y-y0)**2 > 10**2:
                # too large movement to be a click
                return

        x, y, w, h = self.collection.get_allocation()
        if event.x <= w/4:
            self._do_left()
        elif event.x >= w*3/4:
            self._do_right()
        elif event.y <= h/4:
            self._do_up()
        elif event.y >= h*3/4:
            self._do_down()

    @assert_gui_thread
    def button_press_event(self, widget, event):
        self.drag_obj = (event.x, event.y, time.time(),
                         tuple(self.collection.offset))

    @assert_gui_thread
    def motion_notify_event(self, widget, event):
        if self.drag_obj is None:
            # no drag going on
            return

        x0, y0, t0, offset = self.drag_obj

        if time.time() < t0 + 0.100:
            # delay 100 ms before reacting to drag
            return

        self.collection.pan_to_offset(offset[0] - (event.x - x0),
                                      offset[1] - (event.y - y0))
        self.collection.queue_draw()

    @assert_gui_thread
    def close(self):
        self.bookmarks[0] = self.collection.pos
        gtk.main_quit()

    @assert_gui_thread
    def destroy_event(self, widget):
        self.close()

##############################################################################
## Progress dialog
##############################################################################

class ProgressDialog(object):
    """A dialog box that reports progress.

    >>> dlg = ProgressDialog()
    >>> dlg.set_progress(percentage=50, text="Foo")
    >>> dlg.close()
    """
    def __init__(self, title=""):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title(title)

        vbox = gtk.VBox(False, 2)
        vbox.set_border_width(10)
        self.window.add(vbox)
        vbox.show()

        self.label = gtk.Label()
        vbox.pack_start(self.label)
        self.label.show()

        self.bar = gtk.ProgressBar()
        vbox.pack_end(self.bar)
        self.bar.show()

        self.window.show()

        self.queue = Queue.Queue()
        self.__listener = threading.Thread(target=self.__listener)

        run_in_gui_thread(self.__listener.start)

    def __listener(self):
        while True:
            item = copy.copy(self.queue.get())
            if isinstance(item, str):
                run_in_gui_thread(self.bar.set_text, item)
                run_in_gui_thread(self.label.set_text, item)
                run_in_gui_thread(self.bar.pulse)
            elif item == None:
                run_in_gui_thread(self.window.destroy)
                return

    @assert_gui_thread
    def __getattr__(self, name):
        return getattr(self.bar, name)

    def close(self):
        self.queue.put(None)

##############################################################################
## Main
##############################################################################

# Note: we *must* hold a reference to the main UI object;
#       otherwise it is destroyed even though in use.
MAIN_UI = None

def start(args, options, config):
    if not args:
        if HILDON:
            dummy_ui = gtk.Window()
            m = hildon.FileSystemModel()
            dlg = hildon.FileChooserDialog(
                dummy_ui, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, m)
        else:
            dlg = gtk.FileChooserDialog(
                title="Open",
                action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
                buttons=(gtk.STOCK_OPEN, gtk.RESPONSE_OK,
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                )
        dlg.set_local_only(True)
        dlg.set_select_multiple(True)

        result = dlg.run()
        if result != gtk.RESPONSE_OK:
            gtk.main_quit()
            sys.exit(0)
        args = dlg.get_filenames()
        dlg.destroy()

    sources = [os.path.realpath(p) for p in args if os.path.exists(p)]

    progress = ProgressDialog("Starting PAI...")
    def _load():
        filelist = FileList(sources, IMAGE_EXTENSIONS, progress.queue)
        run_in_gui_thread(_finished, filelist)

    @assert_gui_thread
    def _finished(filelist):
        global MAIN_UI
        progress.close()
        MAIN_UI = PaiUI(sources, filelist, config, ncolumns=options.ncolumns,
                        rtl=options.rtl)
        MAIN_UI.show()

    threading.Thread(target=_load).start()

def main():
    usage = ("%%prog [options] [images-or-something]...\n"
             "Picture archive inspector version %s" % __version__)
    parser = optparse.OptionParser(usage=usage)
    parser.add_option("-r", "--rtl", action="store_true", dest="rtl",
                      help="show images in right-to-left order", default=True)
    parser.add_option("-l", "--ltr", action="store_false", dest="rtl",
                      help="show images in left-to-right order")
    parser.add_option("-c", "--columns", type="int", dest="ncolumns",
                      help="show images in N columns", default=DEFAULT_COLUMNS)
    options, args = parser.parse_args()

    if options.ncolumns > 4 or options.ncolumns < 1:
        parser.error("invalid number of columns given")

    config_fn = "%s/.pairc" % os.environ["HOME"]
    config = Config()
    if os.path.exists(config_fn):
        config.load(config_fn)

    gtk.gdk.threads_init()

    gtk.gdk.threads_enter()
    run_in_gui_thread(start, args, options, config)
    gtk.main()
    gtk.gdk.threads_leave()

    config.save(config_fn)

    sys.exit(0)

if __name__ == "__main__": main()

redpajama_set_name: RedPajamaGithub


For further information please visit the Parliamentary Polling District Review 2019 page.
Would you like to work at the heart of the democratic process participating in various job roles for Parliamentary, Local Government and other elections and referenda? If yes then please visit our working at an election page.


text:
Q: React router v6 is not rendring the component I have a different design for my login page and admin panel but when I login into the application my admin panel routes aren't rendering the component.
index.js
ReactDOM.render(
        <BrowserRouter>
            <ScrollToTop>
                <AuthContextProvider>
                    <Routes>
                        <Route path="/app" exact element={<App/>} />
                        <Route path="/login" element={<Login/>} />
                    </Routes>
                </AuthContextProvider>
            </ScrollToTop>
        </BrowserRouter>,
        document.getElementById('root')
    );

app.js

    return (

            <Tooltip ref={copyTooltipRef} target=".block-action-copy" position="bottom" content="Copied to clipboard" event="focus" />

            <AppTopbar onToggleMenuClick={onToggleMenuClick} layoutColorMode={'dark'}
                mobileTopbarMenuActive={mobileTopbarMenuActive} onMobileTopbarMenuClick={onMobileTopbarMenuClick} onMobileSubTopbarMenuClick={onMobileSubTopbarMenuClick} />

                <AppMenu model={menu} onMenuItemClick={onMenuItemClick} layoutColorMode={layoutColorMode} />

                    <Routes>
                        <Route path="/" exact element={<Dashboard colorMode={layoutColorMode} location={location} />} />
                        <Route path="/customers" element={<Contacts/>} />
                        <Route path="/customers/new" element={<AddContact/>} />
                        <Route path="/customers/:id" element={<CustomerCard/>} />
                    </Routes>

                <AppFooter layoutColorMode={layoutColorMode} />

            <CSSTransition classNames="layout-mask" timeout={{ enter: 200, exit: 200 }} in={mobileMenuActive} unmountOnExit>

            </CSSTransition>

);

My login and dashboard routes are working but when I navigate to other components they are not rendering. What is the problem?

A: In a normal react programm the app component is wrapped inside of the index-js for the render this seems to be missing here, if this is accidental just add the app-js to the index, if not then add the browser router property around the app.js. All route and router elements must be childs of the browser router
Also check your outlet that you seem to use for the routes, this isnt provided here but it could lead to issues that arent covered here
Example for the app js in the code
 ReactDOM.render(
    <BrowserRouter>
        <ScrollToTop>
            <AuthContextProvider>
                <Routes>
                    <Route path="/app" exact element={<App/>} />
                    <Route path="/login" element={<Login/>} />
               <App />
               </Routes>
            </AuthContextProvider>
        </ScrollToTop>
    </BrowserRouter>,
    document.getElementById('root')
);

redpajama_set_name: RedPajamaStackExchange


Any code within Accessing the Bing Ads API in a Console Application by Shinigami is licensed under a Creative Commons Attribution 4.0 International License.
Although there's plenty of documentation by Microsoft on how to use their Bing Ads API the documentation on how to initially connect to it seems a bit fragmented so this is an attempt to summarize all the steps required to grant a console application access to the API.
Most of these details come from these articles.
In order to connect to the API you need the following pieces of information.
These can be found here, they're present in the URL as the customer and account route values.
In my case I wanted a console application to be able to access the Bing Ads API and get details of ongoing campaigns without any user interaction so I wanted to get the initial refresh token manually and then allow the application to request a new one when required.
To allow the console application to authenticate it needs to be registered in the application portal as specified here. This application should be created as a "Native Application", the Application ID for this application is the Client ID that is used to authenticate with OAuth and generate a Refresh token.
You should then use Client ID from the created application in the below URL, the client state code can be whatever you like.
This URL will take you to a login screen where you should login with the same account that is used to access the Bing Ads account, it will then ask for permission to access Bing Ads on your behalf.
Once accepted it will redirect to a blank webpage from which you can extract the access code from the URL.
The code and Client ID should then be posted to the OAuth login service to get the refresh token.
The returned refresh token can then be used in conjunction with your developer token and clientId in your console application, code for a sample application can be found here.
I've created a sample web application for getting these refresh tokens here.


Meriden Martial Arts Classes For Kids & Adults - BJJ - Summer Camp -Birthday Parties & More!
It's the Meriden fitness program everyone's raving about. That's because every class is fun, focused, and full of great exercise to get you fit, fast. Click to learn more & get started today!
These amazing Meriden kids martial arts classes pack fitness, fun, and self-defense into every session. Plus, your child develops powerful skills like confidence, focus, discipline, and more! Click now to learn more!
Discover the Meriden Brazilian Jiu Jitsu program that's turning our city's men and women into insanely awesome grapplers. Amazing instructors. Great fitness & conditioning. Beginners welcome. Click now!
Discover the renowned Brazilian dance-martial art with our Meriden Capoeira classes. Get in amazing shape. Make friends and become part of the rich culture of song and dance that surrounds this powerful martial art. Click now to learn more and get started today!
Our Meriden Martial Arts school can certainly help you with all of those things.
Kids of all ages as well as their parents love these Meriden kids martial arts classes. That's because they focus beyond martial arts. Kids are taught self-discipline and respect as well as focus and confidence. The kids are better-behaved everywhere they go, their sense of respect improves and they perform better in school.
We have the most action-packed Brazilian Jiu Jitsu (BJJ) class in town! Our Meriden Brazilian Jiu Jitsu (BJJ) class will give you a head start so you can learn powerful submission and grappling techniques.
Our program is structured to help you handle yourself when standing up or laying on your back. We have friendly members and instructors who will help you practice these techniques and attain great success. And even more...our Meriden Brazilian Jiu Jitsu (BJJ) classes are designed to be fun and action-packed.
The movements in Capoeira are fast, complex, and require high levels of strength, control, and coordination, resulting in full-body conditioning, It's exercise that builds strength, power, and lean muscle mass.


text:
Return to Countryside Mobility
Accessible heritage sites for all
British Sign Language tours introduced at two top Devon heritage attractions.
Date Posted: 28 October 2019
Seaton Tramway and Lundy Island, two very different and unique heritage attractions in Devon, have now introduced special tours aimed explicitly at Deaf British Sign Language (BSL) users.
The new filmed tours feature a BSL signer, to help BSL users get a better understanding of the information presented at both attractions, and help them feel engaged with the history of the sites.
Many Deaf BSL users in the UK use BSL as their first language and may struggle with large panels of written English. By introducing the filmed BSL tours, Deaf visitors can receive information in a format they prefer.
The tours were developed by Heritage Ability, working closely with a Deaf BSL signer. Heritage Ability is a three-year initiative funded by the National Lottery Heritage Fund, to help improve accessibility at over 20 attractions in the South West.
Each BSL tour consists of several short film clips, signed by a volunteer Deaf BSL user. The volunteer, with a member of the Heritage Ability team, visit the heritage attraction to learn the history of the site in detail. The volunteer is then filmed, signing the relevant information in a way that is both engaging and informative for other Deaf BSL users. The clips are then transferred onto tablets, which are available to visitors on request, and can be picked up on arrival in the reception area. Visitors can use the tablets to travel around the site and access the information at their own pace. The clips are also uploaded to the Heritage Ability YouTube channel, for visitors to view on their own devices.
Paul Valentine, the Heritage Ability Deaf volunteer who features in the Lundy BSL tour, said:
"Having a BSL filmed tour available at attractions is so important. It helps BSL users who struggle with written English, to go out with their families and enjoy the heritage in the South West on an equal footing."
Derek Green, General Manager at Lundy Island, said
"Introducing the new BSL filmed tour at Lundy, has allowed us to offer BSL users a much better experience to enjoy our unique island, Its history and wealth of wildlife. We are extremely grateful to Heritage Ability for their support and assistance to improve our access to Lundy for everyone."
Heritage Ability is managed by Living Options Devon, a local Exeter based charity. All LOD projects are developed or supported by people who have a first-hand understanding of the challenges faced by disabled people and Deaf BSL users.
Heather Brown, Deputy CEO of Living Options Devon, stated:
"It is fantastic that the new BSL filmed tours are now in place at Seaton Tramway and Lundy.
"Heritage Ability is working with 22 sites in the South West to help break down the barriers faced by Deaf BSL users visiting heritage attractions. We believe by providing information in a format BSL users are comfortable with, they can just relax and enjoy their day."
The South West of England is brimming with heritage; from country parks, to historic houses, castles and rugged coastlines. It's here to be enjoyed by everyone - but not everyone can.
Disabled and Deaf people (who use British Sign Language) struggle to experience these places because of physical barriers, a lack of accessible interpretation and untrained staff and volunteers.
That's where Heritage Ability comes in. We're unlocking the heritage at over 20 destinations across Devon, Dorset, Cornwall, Somerset and Gloucester so that disabled people and British Sign Language users can have engaging experiences with the places that we love. We're creating Easy Read guides to large print formats, BSL tours and more - connecting people with places. It's thanks to Heritage Lottery Fund that we can make heritage accessible - for everyone.
Heritage Ability is delivered by the team at South West disability charity, Living Options Devon.
Living Options Devon, Ground Floor Units 3-4, Cranmere Court, Exeter, EX2 8PW

redpajama_set_name: RedPajamaCommonCrawl


A recent Wall Street Journal article about natural resources is both brazen and controversial.
Natural resources, we are told, are not running out.
Titled The Scarcity Fallacy, the piece drew my attention. I read the short overview ("…we have broken though such limits again and again…innovation improves the environment…") before scanning the byline at page bottom to learn about the author. It read: Mr. Ridley is the author of The Rational Optimist and a member of the British House of Lords.
Published author? Member of the House of Lords? These credentials hooked me. I wanted to read his article.
Will these critters emerge if the human world ends?
The article sucked me in, not only because of the message, but because of the clarity and precision of the writing.
The basic gist of the piece is that doom and gloom prophets have historically and repeatedly predicted shortfalls and imminent scarcity of material resources (and energy), only to have their warnings neutralized by unforseen or unexpected adoption of fresh alternatives that avert catastrophe. For example, in 1972 the think-tank group The Club of Rome published a book titled Limits to Growth, predicting shortages of metals, minerals, and fuels. What happened instead is efficiency improved in the use of materials.
This is basic journalism: provide facts that support your story. However, Ridley's use of facts is judicious. He doesn't drown us in statistics or bore us with repetition. Like walnuts in a salad, his facts add substance and improve his story's flavor.
Ridley's position and previous publication hooked me into reading his article; his clarity and precision strengthened his message – and made it hit home. This is the type of writing to strive for – powerful and persuading.
In the last post I mentioned Vine Videos – six second videos now rampant on the internet. I created my own vine video (the first, perhaps the last) to market the fiction book River of Dreams. It's intended to provide atmosphere – weather, sound, images – that underscore the book's tone. It's six seconds long, but took quite a lot longer to produce. Unfortunately, after uploading it to YouTube, it is labeled as having a length of seven seconds. Well, I'm not returning to shave off that final fraction of a second…..not yet anyhow.
So climate change is just one of those ignorant doom saying philosophies?
Not at all. The climate is always changing. Always. Getting warmer or getting cooler. The English used to plant grapes when the climate was warmer, then skated on the Thames River when the climate was cooler. Climate change is – like gravity – a fact of life. It exists now. It has always existed. The two questions that are relevant to the current climate situation (and are not related to this article) are whether the current climate change has been largely caused by humans, and for how long it will continue in the direction in which it is moving. I'm curious – did you read the article?
I confess, I did Not read the WSJ article. I have seen anthropogenic climate change denialists cite similar arguments for avoiding economic changes to reduce greenhouse gas emissions. I Am Confident that Man Made Climate change is Different than the mistaken resource depletion doomsaying processes of History.
Yes – climate is changing…how much we can alter that is still unknown. CERN in Switzerland published a study two years ago in which they cited changes in solar activity as possibly contributing to our climate change. How much is caused by humans? Unknown. Is this process irreversible? Unknown. What can we do to change it? Unknown. However, cutting back on fossil fuels – for whatever reason – will likely only be beneficial. Thanks for the input – from you, a person who has worked in this field for a long time. Much appreciated.


text:
Home Uncategorized Spectacular solar eclipse sweeps Africa, Europe and US
Spectacular solar eclipse sweeps Africa, Europe and US
NAIROBI: Africans were treated on Sunday to a spectacular solar eclipse that swept across the continent, while sky-gazers in the United States and Europe also glimpsed the rare phenomenon.
Partial Solar Eclipse is seen in Nairobi, Kenya on November 3, 2013. Kenya boasts that it is one of the best locations in the world to view this hybrid solar eclipse, which according to scientists is a rare occurrence.
A total eclipse could be seen over parts of Africa and one of the best views was in northern Kenya's Sibiloi national park, where a few hundred tourists gathered on the edge of the desert lake Turkana.
Alongside the tourists were colorfully dressed Kenyans from the Turkana, Rendile and Dasanach tribes, many draped in beads, who cheered as the sky darkened.
However, dramatic weather almost spoilt the show, with sandstorms, rain, a rainbow and heavy cloud all minutes before the eclipse, an AFP photographer said.
Some tourists, fearing they would miss the sight, jetted off at the last minute, seeking a clearer spot on other side of lake.
In the end the eclipse, which lasted about 10 seconds in Kenya, was partially obscured by cloud.
Sky-gazers in Gabon, Congo, Uganda and Ethiopia were also treated to the total eclipse.
"I saw a black disc progressively cover the sun. It's magnificent," said Clarence Diledou, who lives of Gabon's port town of Port-Gentil. However, unfortunately the bad weather spoiled the party a bit." The West African nation got peak viewing of the total eclipse as it swept over a path nearly 60 kilometres (37 miles) wide.
In Port-Gentil, families gathered together for the occasion along the sea front, facing the sun. Like many in the town, Diledou used special glasses distributed by authorities to watch the rare event.
Those who did not have any came up with imaginative solutions, among them Pauline Koumba, who put a bowl of water in her courtyard and watched the reflected eclipse.
"I saw the brief passage of the eclipse in my bowl. But it was over quickly and the black clouds spoiled the effect," she said.
Families also gathered in Gabon's capital Libreville, where the eclipse was less spectacular, but where the skies darkened noticeably for about half an hour from 1330 GMT.
In the eastern United States, viewers caught sight of a partial eclipse lasting 45 minutes close to sunrise.
Partial views were also available in southern European countries Spain, Italy, Greece, and also in Iraq.
The round shape of the Earth explains why viewers in Africa saw a total eclipse, while those in the United States and Europe only saw the sun partly obscured.
Experts say a safe way to view an eclipse is by making a pinhole camera — piercing a tiny hole in a piece of paper then turning your back to the sun and using the pierced page to project the image of the sun on another sheet of paper.
Courtesy: AFP
2013 November Solar Eclipse
Africa Eclipse
Hybrid Solar Eclipse
Trans-Atlantic Solar Eclipse
Previous articleJohn Kerry aims to bridge gaps with Saudi Arabia
Next articleIndian-origin scientist explains evolution of life
US ignores India's request against Google, Facebook
UP CM's decision to set up anti-Romeo squads popular: Survey


text:
Q: Android - OnScrollListener for Staggered Grid View Please excuse my English, I'm French...
So, I've got a question for my Android App.
I've to integrate a grid view as Pinterest style.
I found this lib : Staggered Grid View (https://github.com/maurycyw/StaggeredGridView)
It's work fine but... There is no OnScrollListener !
I had to know when the user see the last item, in order to load more.
But it's not possible without OnScrollListener !
Have you got an idea for my problem ?
Thanks a lot.

A: Try this if nothing works for you then wrap your recycler view in a scroll view and then check if scroll view has reached its bottom:
In your xml file:
<ScrollView
    android:id="@+id/scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbars="vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    </RelativeLayout>

</ScrollView>

In your class file:
private ScrollView mScrollView;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initScrollView();
    ...
}

private void initScrollView() {
    mScrollView = (ScrollView) mView.findViewById(R.id.scroll_view);
    mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            if (mScrollView != null) {
                if (mScrollView.getChildAt(0).getBottom() <= (mScrollView.getHeight() + mScrollView.getScrollY())) {
                    // Scroll view is at bottom
                    // If not loading then start load more
                } else {
                    // Scroll view is not at bottom
                }
            }
        }
    });
}

Remember to set nested scrolling of recycler view to false for smooth scrolling in your class file:
mRecyclerView.setNestedScrollingEnabled(false);

If you want to start loading next page just before it reaches the bottomm, then just subtract an integer from mScrollView.getChildAt(0).getBottom()
For example 1000 is subtracted here:
if (mScrollView.getChildAt(0).getBottom() - 1000 <= (mScrollView.getHeight() + mScrollView.getScrollY())) {
    // Scroll view is at bottom
    // If not loading then start load more
} else {
    // Scroll view is not at bottom
}

Use a greater integer to start loading much before the scroll reaches bottom.

A: UPDATE:
After testing,
Calling notifyDataSetChanged() for StaggeredGridView Adapter case to reset the scroll position to 0 (Start of the Views).
Instead use PinterestLikeAdapterView

I have add loadMoreListener to the StaggeredGridView
steps:
1- add a loadmore Interface and booelan isLoading (at the top of the class)
public interface OnLoadMoreListener {
    public boolean onLoadMore();
}

private boolean mIsLoading;
private OnLoadMoreListener mLoadMoreListener;

2- find trackMotionScroll function, in the else of deltaY > 0
and after the up = false; add
if (overhang <= 80) { // 80 is how nearest to the end. ZERO mean the end of list
    // scrolling down and almost reach the end of list
    if (false == mIsLoading && null != mLoadMoreListener) {
        if (false == mLoadMoreListener.onLoadMore()) {
            mIsLoading = true;
            Log.d(TAG, "loadMore");
        }
    }
}

3- add setListener() and loadComplated() functions
public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
    this.mLoadMoreListener = onLoadMoreListener;
}

public void loadMoreCompleated() {
    mIsLoading = false;
}

HOW to use:
1- define a loadMoreListener in your Activity/Fragment
private StaggeredGridView.OnLoadMoreListener loadMoreListener = new StaggeredGridView.OnLoadMoreListener() {

    @Override
    public boolean onLoadMore() {
        loading.setVisibility(View.VISIBLE);
        // load more data from internet (not in the UI thread)

        return true; // true if you have more data to load, false you dont have more data to load
    }
};

2- when you done data loading and add it to the adapter call
private void doneLoading() {
    gridView.loadMoreCompleated();
    loading.setVisibility(View.GONE);
}

A:
had to know when the user see the last item, in order to load more.
  But it's not possible without OnScrollListener !

Why would you use onScrollListener for that? Instead, write a class (MyStaggeredGridAdapter, perhaps?) that extends BaseAdapter and apply it to the StaggeredGridView. Then you can use the adapter's getView() method, which will be called whenever a new view needs to be rendered.

A: To know when the last item is shown on the screen, i use the Adapter's getView() method. Just compare your last index with the "position" parameter. Something like this
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...

        if (lastLoaded == position){
            loadMore();
        }

        ...
    }

and maybe then you would like to see this: How to add data into bottom of Android StaggeredGridView and not go back top? to avoid load the list from the begining and continue from the last item shown.
i hope this helps, don't know if it's the best solution, but is working for me ;)


text:
Shooting at Cinema in Viernheim Germany, Possible ISIS Attack
A masked assailant was shot and killed by German police after opening fire at a movie theater in Viernheim, Germany. Reports are diverging, with some saying zero casualties while other have 25-50 injuries.
CNN is covering the event, which is unfolding.
"This (police) operation is now finished," the shopping center said on its Facebook page. "At this moment in time we have no information on injured persons. The driveway is still blocked. We will keep you updated on new developments. "
Sasse leads fresh calls to use seized 'El Chapo' money to pay for border security


text:
Number of Offline Players : 1 Player
Game only supports one player in an offline mode on a single device.
1 Player is part of the Number of Offline Players category. Number of players supported in a general of unspecified offline game mode. Offline mode means there is no internet (online) connection nor multiple devices used in any internal network structure through either wi-fi or any cable connection.
You are currently viewing games for Windows that are marked as Number of Offline Players : 1 Player. Games for other platforms are also tracked by this attribute. You can restrict the list of games below to any of the following platforms:
All Platforms, 1292 Advanced Programmable Video System, Acorn 32-bit, Altair 680, Altair 8800, Amstrad PCW, Android, Apple I, Arcade, Astral 2000, Atari 8-bit, Atom, bada, BBC Micro, BeOS, BlackBerry, Blu-ray Disc Player, BREW, Browser, Commodore 16, Plus/4, Compucolor I, Compucorp Programmable Calculator, CP/M, Dedicated console, Dedicated handheld, DOS, DoJa, Dreamcast, DVD Player, ECD Micromind, Electron, ExEn, Fire OS, FM-7, Galaksija, GameCube, GameStick, GIMINI, Gizmondo, Heathkit H11, Heath/Zenith H8/H89, HD DVD Player, HP 9800, HP Programmable Calculator, GP32, Kindle Classic, IBM 5100, Intel 8008, Intel 8080, iPad, iPhone, Jolt, J2ME, KIM-1, Laser 200, Linux, Macintosh, Mainframe, Memotech MTX, Microtan 65, MOS Technology 6502, Mophun, Motorola 6800, N-Gage, N-Gage (service), Neo Geo, Neo Geo CD, New Nintendo 3DS, Newton, Nintendo 3DS, Nintendo DS, Nintendo DSi, North Star, Noval 760, Nuon, Oculus Go, Oculus Quest, Oric, OS/2, Ouya, Palm OS, PC-6001, PC-8000, PC-88, PC-98, Philips VG 5000, PlayStation, PlayStation 2, PlayStation 3, PlayStation 4, PSP, PS Vita, Poly-88, SD-200/270/290, SC/MP, Sharp X1, Sharp X68000, SG-1000, Sinclair QL, Sol-20, SRI-500/1000, Supervision, SWTPC 6800, Symbian, Tektronix 4050, Telstar Arcade, Tiki 100, TI Programmable Calculator, TIM, Tizen, Tomahawk F1, tvOS, watchOS, Wang 2200, Wii, Wii U, webOS, Windows, Windows 3.x, Windows Apps, Windows Mobile, Windows Phone, Xbox, Xbox 360, Xbox One, Xerox Alto, Zeebo, Zilog Z80, Zodiac
Viewing Page 556 of 583 (items 13876-13900 of 14565) Previous | Next
^ - 1
10 - a
b - ~
ä - a
ō - o
u - k
w - t
Game Title Year Publisher
The War of the Worlds: Andromeda 2018 Mediamas Europa
War Of The Zombie: Real-Time & Turn-Based Strategy Simulation 2018 Van der Veer Games
War on Folvos 2007 Toro-Publishing
WarPath 2006 Akella, Groove Games, Lighthouse Interactive Game Publishing BV
Warplanes: WW2 Dogfight 2019 Home Net Games
Warrior Dragon 2000 Lumental Games
Warrior Kings: Battles 2003 Empire Interactive Entertainment, Empire Interactive Europe Ltd., SEGA Corporation, Strategy First, Inc.
Warrior Kings: Battles (Collector's Edition) 2003 Empire Interactive Europe Ltd.
The Warrior's Tale 2006 Battle Phase Games
Wars and Battles: Normandy 2018 HexWar Games Ltd.
Wars and Battles: October War 2018 HexWar Games Ltd.
Wars and Warriors: Joan of Arc 2004 Akella, Enlight Interactive Inc.
Wars of Napoleon 2016 Slitherine Ltd.
Wars of Succession 2018 Slitherine Ltd.
Warthogs 2006 Crystal Shard
War Thunder 2012 Gaijin Entertainment Corporation, Tencent Holdings Limited
War Times 2004 1C Company, Planeta DeAgostini S.A., Strategy First, Inc.
WarTorn 2000 Virgin Interactive Entertainment (Europe) Ltd.
War Truck Simulator 2016 Dev4play
War Twat 2008 Retromasters
War Twat (Colour Blindness Edition) 2008 Retromasters
War Wind II: Human Onslaught 1997 GOG Limited, Mindscape International Ltd., Strategic Simulations, Inc.
War World: Tactical Combat 2006 Akella, Lighthouse Interactive Game Publishing BV
Wasteland 2 2014 inXile Entertainment, Inc., KOCH Media GmbH
Wasteland 2 2014 Deep Silver, Inc.
Goto Page: 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563


text:
Mourning After
'The Walking Dead's' Abortion Misstep
AMC's zombie hit has stumbled into the abortion debate, provoking fury, writes Kate Aurthur.
Kate Aurthur
Updated 07.13.17 11:24PM ET / Published 11.23.11 2:51PM ET
Bob Mahoney / AMC
Googling "The Walking Dead" and "abortion" yields hundreds of results from the past week—sites ranging from Jezebel to the ACLU have written about a plot turn in the Nov. 20 episode. And they're all really mad about it.
In the course of AMC's successful post-apocalyptic zombie drama, Lori (Sarah Wayne Callies)—one of the survivors—has had sex with two men, one of whom is her husband. She has found out she is pregnant and, because they're in zombie hell, decides to end the pregnancy. In the recent Season 2 episode in question, she takes a bunch of tablets labeled "morning-after pills." But, like so many TV characters before her when faced with this decision, she changes her mind and throws them up. (She can form a club with Andrea from Beverly Hills, 90210, Miranda from Sex and the City, Ryan's girlfriend Theresa on The O.C., and many others.)
What got the Internet upset is the misinformation the show spread by showing Lori taking a handful of morning-after pills when she is weeks' pregnant with the aim to no longer be pregnant. The Walking Dead is adding to the confusion between emergency contraception such as Plan B (which is, indeed, a morning-after pill, and prevents a woman's egg from being fertilized) and RU-486 (which is administered by doctors and does cause abortion).
"Aren't they supposed to have fact checkers to catch this kind of thing?" asked the ACLU blog.
"Seriously, Walking Dead writers: Do you just not know how emergency contraception works, or did you assume we didn't?" posed Flavorwire.
And the SEO headline in Slate's XX Factor was: "The Walking Dead characters mistakenly think the morning after pill causes abortion. Do the writers?"
All good questions. Did anybody ask AMC? Or the writers? According to Marnie Black, the network's senior vice president of publicity, the network did not receive a single inquiry from a journalist.
Here is what Glen Mazzara, The Walking Dead's executive producer and show runner, has to say about it (the show's publicist emailed this to me):
"The producers and writers of The Walking Dead are fully aware that the morning-after pill would not induce an abortion or miscarriage. We exercised our artistic creative license to explore a storyline with one of our characters, not to make any pro-life or pro-choice political statement. We sincerely hope that people are not turning to the fictional world of The Walking Dead for accurate medical information."
Mazzara's statement could be dissatisfying for those among us who think that anything in culture, whether it's fictional or not, is political, and for others among us who know that lots of people do extrapolate medical information from scripted television.
What is certain is that abortion—which is still legal—continues, perhaps more than any other, to be a fraught issue in popular culture. The debate plays out insanely in Breaking Dawn: Part I, the most recent Twilight movie, in which the characters who want Bella to have an abortion use the word "fetus" and the ones who don't say "he" and "baby." And pro-choice viewers of The Walking Dead might raise a suspicious eyebrow at an interview the show's writer/executive producer/comic writer Robert Kirkman did with Entertainment Weekly in which he said, "If there's ever been an argument for abortion I think the thought of bringing a child into a world infested with zombies is definitely something that at least warrants a discussion." (That's the only argument for abortion—and for a mere discussion?)
What's also troubling is that this discussion coincided with a storyline in which Lori's hosts—at an idyllic farm seemingly untouched by the zombie apocalypse—are discovered to be keeping a group of "walkers" alive in a nearby barn. When asked why, one of the characters responded, "They're people." The show's heroes, however, accused of "murdering" such people, had a much more limited definition of what life is. "These aren't people," responded Glen (Steven Yeun). The timing is especially disturbing, as Lori and her husband debated whether to bring a child into this messed-up world. While the words "fetus" and "embryo" aren't uttered, the "walkers" may as well be standing in here for Lori's unborn child.
Is it murder? Has The Walking Dead become a parable about the sanctity of all life, hidden behind the window dressing of a horror story?
In 2004 I wrote a story for The New York Times about the abortion taboo on television. I talked to Josh Schwartz, the creator of The O.C., about his show's non-abortion storyline, and his decision not to have any of the characters use the actual word "abortion."
"There's something about the word 'abortion,'" he told me. "That the show would sink under the weight of it.'"
The Walking Dead clearly learned that very lesson this week in the land of the blogger apocalypse.
Jace Lacob has contributed to this report.


"Joseph Estrada has been in public service since 1969."
In 30 months as president, Joseph Estrada scored the highest agricultural growth rate ever by any president (6.5 percent in 1999), broke the backbone of the Moro Islamic Liberation Front by capturing 45 of their camp, including their headquarters, banned sovereign guarantees on contracts of private investors, and revived the economy from near recession.
From minus 0.6 percent in 1998, real GDP growth immediately leaped to 3.4 percent in 1999 and 4.4 percent in 2000 before falling to a 3-percent rise in 2001, Gloria Arroyo's first year.
President Erap's record 6.5 percent agriculture growth has never been surpassed. This year, a severe rice shortage developed. Rice being 20 percent of the consumer basket, the shortage spiked inflation, doubling to 6.7 percent by September 2018—the highest in 11 years. The reason for the rice shortage—neglect of agriculture.
Erap also made the government closer to the people with his populist policies. He stopped rate increases by utilities controlled by the country's oligarchs and monopolies.
As commander-in-chief, he gave better pay and incentives to soldiers, buying them boots and bullets and providing them a sack of rice monthly.
Estrada's cabinet was never involved in any shady deals or contracts grossly disadvantageous to the government. He gave away broadband rights for free, thus making cellular telephony available to the poor. In Europe, broadband licenses were auctioned for billions of dollars. After Estrada, the aborted ZTE NBN contract was marred by allegations of kickbacks that doubled project cost.
Estrada had been in public service since 1969, when he first won the mayoralty of San Juan town, Metro Manila. He went on to be elected four times as town mayor.
Erap was San Juan mayor for 17 years, senator for six years, vice president for six years, president for less than three years, and Manila mayor for four years. He won the prestigious TOYM (Ten Outstanding Young Men) not for his movies, many of which were blockbusters, but for public service.
In Manila thus, Estrada spent a spectacular P6.76 billion, from 2013 to 2016, to modernize the capital that was once described as the Pearl of the Orient and the Paris of the East.
Looking forward, Erap's biggest projects are four reclamation projects covering 1,400 hectares. This will double Manila's commercial space. The projects will modernize Manila overnight and recapture the city's title as the Philippines' greatest city.
No mayor in Manila's history has poured so much on great projects in so short a time as Estrada. He offers Manilans a "womb to tomb" program of government, one inclusive to include everyone, young and old.
As mayor, Estrada never worked so hard as an executive. Twelve-hour days were the norm each week—interacting with people, conducting advocacy and visioning meetings, signing voluminous papers, conducting oculars at any time of the day and night to check on the progress of numerous projects in simultaneous construction in many different places.
"Being mayor of Manila is more difficult than being president of the Philippines!" exclaims Estrada. In Malacañang, the presidential palace, the chief executive is surrounded by cabinet men and other subalterns to whom he can bark orders and he is sure those orders will be executed. Visitors to the palace are screened by protocol and appointments secretaries.
"Being mayor is my last hurrah," Estrada keeps saying. He knows the enormous problems he faces as CEO of the Philippines' national capital and most important city, it being the center of trade, commerce, finance, and governance.


text:
package jp.ksgwr.pipeline;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * Output Pipe
 * @author ksgwr
 *
 */
public class OutTap extends Pipe {

	/**
	 * constructor output System.out
	 */
	public OutTap() {
		super.out = System.out;
	}

	/**
	 * constructor
	 * @param out output stream
	 */
	public OutTap(OutputStream out) {
		super.out = out;
	}

	/**
	 * constructor
	 * @param file output file
	 * @throws FileNotFoundException exception
	 */
	public OutTap(File file) throws FileNotFoundException {
		super.out = new FileOutputStream(file);
	}

	/**
	 * constructor
	 * @param file output file
	 * @param charset charset
	 * @throws FileNotFoundException exception
	 */
	public OutTap(File file, String charset) throws FileNotFoundException {
		super.out = new FileOutputStream(file);
		super.outputCharset = charset;
	}

}


People who are in control of their gambling habits play for fun and like the idea of possibly winning big. They set limits on how much money and time they can spend, and they are likely to gamble on the internet. But gambling is just one of several leisure activities these players undertake. In contrast, gambling is a form of escapism for problem players and often their only social activity, say Richard Wood of GamRes Ltd. in Canada, and Mark Griffiths of Nottingham Trent University in the UK. The results appear in Springer's Journal of Gambling Studies.
Their study is among the first to explore the strategies, attitudes and motivations of so-called "positive players" who are not at risk of becoming problem gamblers. Wood and Griffiths analyzed the results of an online survey completed by 1,484 positive players and 209 problem players.
Most previous harm-minimization research has focused on the negative aspects of problem gambling and uses a "stick" approach (i.e. don't play like this or else!). However, this study has helped to detail what non-problematic "positive play" looks like. This "carrot" approach (i.e. play like this and you are more likely to have a positive experience) may resonate with a wider range of players who ignore messages that focus on problem gambling, which they see as largely irrelevant to them.
Wood and Griffiths also found that the internet was by far the most popular medium, where up to 93 percent of the positive players in their study regularly gambled. This suggests that online gambling is not, by default, inherently riskier than gambling in more traditional ways. The National Lottery - and especially its online version - leads the popularity stakes, ahead of scratch cards (65.5 percent), sports betting (32.7 percent) and electronic games such as slot machines (28.5 percent).
Wood and Griffiths also found gambling is a form of entertainment for positive gamblers, who enjoy the dream of winning big. Those who play more also have more personal strategies in place to control their pastime. Nine out of ten respondents almost always decide on a spending limit before starting to gamble. Others decide beforehand how much money they can reasonably afford to lose, and also set a limit on their play time. Positive players also often only take a set amount of money with them when going to gamble in bars or casinos, and make a point of leaving their bank cards at home.
By contrast, problem gamblers play to find relief for a particular mood they are in, be it boredom, stress or feeling upset. It's about the actual experience of playing rather than the chance to win. In many cases it's their only social activity. Problem players are less likely than positive players to gamble on their own, such as on the internet, and were often likely to do so in a social setting along with family and friends.
"This might mean that the advice often given that social play is safer than gambling alone should be reconsidered," elaborates Wood.
"Positive players take personal responsibility for their pastime by using various strategies to ensure that they only gamble what they can afford to spend," adds Griffiths.
Wood, R.T.A. Griffiths, M.D. (2014). Understanding Positive Play: An Exploration of Playing Experiences and Responsible Gambling Practices, Journal of Gambling Studies DOI 10.1007/s10899-014-9489-7.


text:
DOE exec bares 5-year action plan on energy efficiency, RE utilization
byPhilippines News Agency
CEBU CITY—The Philippines will begin implementing next year a five-year action plan for energy efficiency and is increasing the use of renewable energy (RE) in a bid to address issues related to climate change.
Energy Undersecretary Donato D. Marcos bared these Philippine initiatives during the opening of the 46th Asia-Pacific Economic Cooperation Energy Efficiency and Conservation (Apec-EGEEC) Meeting held here on Monday.
"I trust that Apec will tackle interventions to mitigate the effects of climate change through energy efficiency and push for an environment friendly and developed economy," he said.
For its part, Marcos said the Philippines has come up with an Energy Efficiency Road map and its corresponding action plan that it will undertake from 2016 to 2020.
"This road map is envisioned to be the master plan of the Philippines's Department of Energy in achieving energy efficiency and conservation programs and activities to higher levels and define the role of the government in coming up with a range of measures aimed at improving energy efficiency, driven by legislative orders and decrees targeting energy saving programs," he noted.
Marcos said the action plan has targeted five energy-intensive sectors, namely: transport, industry, commercial and residential buildings and the cross-sectoral.
Moreover, the energy official said the Philippines is aggressive in the promotion and installation of RE, as it recognizes the importance of addressing energy issues relevant to economic growth and development.
"As a matter of record, we rank second as the largest geothermal producer in the world with 1,868-MW [megawatts] installed capacity as of 2013, or equivalent to 10.78 percent of the total installed capacity of the country," he stressed.
For its energy efficiency programs, Marcos said the country has generated energy savings of 1.6 million tons of oil equivalent for the same year.
"The Philippines reaffirms its commitment to the Apec's unified goal of building strong partnerships toward economic development as we are optimistic that with Apec support, our vision of harmonization and connectivity will come to excellent productive realization," he further said.
The 46th Apec-EGEEC Meeting will discuss various priority areas, including energy efficiency policies and programs, and energy intensity and RE goals.
Philippines News Agency
Lawmaker to SSS: Don't mess with measure to hike retirees' pension
byJovee Marie de la Cruz
DOTC teams up with British firm to ease Naia air traffic
byLorenz S. Marasigan
Bohol LGU asks DENR, NWRB to settle spring water extraction issue with neighboring town
The town of Sevilla in the province of Bohol has asked the Department of Environment and Natural Resources (DENR) to stop its neighboring town Balilihan from extracting water from a spring located in one of its barangays.
JTI awarded #2 Top Employer in the Philippines for 2nd consecutive year
JTI Philippines has been certified as Top Employer for 2023 marking the second time that it has received the prestigious national accreditation. The award as the number two Top Employer in the country, further cements the JTI the company's reputation where its people come first for the second consecutive year.
400 Cebu farmers get CLOAs from DAR
A total of 400 agrarian reform beneficiaries (ARB) in Barangay Binongkalan, Catmon, Cebu received 326 certificates of land ownership award (CLOAs), covering 157.28 hectares of agricultural lands from the Department of Agrarian Reform (DAR) to improve their economic lives.
byJonathan L. Mayuga
PAFMI presses govt to build 'strong' industry-based corn development program
After backing the extension of lower corn tariffs, a group of feed millers is urging the government to boost domestic productivity as a long-term measure to ensure sufficient supply of raw materials.
byJasper Y. Arcalas


text:
Eberhard Christoph Balthasar Freiherr von Danckelman, född 23 november 1643 i Lingen (Ems), död 31 mars 1722 i Berlin, var en brandenburgsk statsman.

Danckelman var den äldste av sju bröder, vilka alla vann framskjutna ställningar inom den preussiska förvaltningen, blev 1663 lärare för prins Fredrik av Brandenburg (sedermera kung Fredrik I av Preussen), 1688 – efter dennes tronbestigning – statsråd, 1692 president för regeringen i Kleve och 1695 förste minister. I sistnämnda egenskap verkade han kraftigt för landets höjande såväl i materiellt hänseende (industrin utvecklades genom inflyttade franska flyktingar, och postväsendet förbättrades) som i andligt (universitetet i Halle an der Saale och Konstakademien i Berlin inrättades). Han fortsatte även kurfurstens politik (samverkan med Vilhelm III mot Ludvig XIV).

Danckelman blev emellertid som uppkomling och hänsynslöst fordrande chef hatad av den brandenburgska adeln och av ämbetsmännen. År 1697 fick han avsked med pension, och kort därefter anklagades han för försnillning av statspapper samt för hemliga underhandlingar med främmande länders ministrar. Han fängslades utan dom, då anklagelserna inte kunde bevisas, och fråntogs sina gods och sina hederstitlar. Han hölls i hårt fängelse till 1702, sedan i lindrigare; 1707 frigavs han, med villkor att han skulle uppehålla sig i staden Cottbus, och fick en årlig pension sig tilldelad. Vid Fredrik Vilhelm I:s tronbestigning (1713) återkallades han till hovet; men trots att han fick flera anbud, lät han inte åter utnämnas förste minister.

Danckelmans snabba uppgång och ännu snabbare fall väckte oerhörd uppmärksamhet. Sannolikt verkade förutom avundsmäns förtal mest ovilja från kurfurstens gemål Sofia Charlotta, då Danckelman var mindre välvillig mot hennes hemland, Braunschweig-Lüneburg. Att han ställde sig försiktigt reserverad mot kurfurstens plan på den preussiska kungatronen, medverkade säkerligen även. Hans intima kännedom om den brandenburgska politikens hemligheter vållade, att kurfursten ej vågade låta honom gå fri, utan fängslade honom, såsom vanligen skedde vid den tidens kabinettskriser.

Källor

Preussiska politiker
Födda 1643
Avlidna 1722
Män
Ugglan
Personer från Niedersachsen

redpajama_set_name: RedPajamaWikipedia


Hello. I plan on backpacking this 26 mile loop next weekend March 11. I plan on hiking this loop for 2 days and 1 night and want to make sure this is possible. Is there anything I should be prepared for on this hike? Then I was hoping to go to Mahogany Camp Ground and spend one night and the next day hike up to Telescope Peak. Is it going to be too cold to camp at Mahogany and is there currently a lot of snow on Telescope? Can I get a topography map for these hikes at Furnace Creek or Stovepipe Wells? Any helpful advise would be greatly appreciated. Thanks so much for your help!!!!
As for whether or not you'll be cold at Mahogany ... that's 8,200 and might be pretty chilly. Really going to depend on your gear and what you're comfortable in. I just snow camped at Strozzi Ranch at 6,300 which was cold as a mother, and everyone in our group has top-shelf gear thanks to working in the outdoor industry. Was probably around 10-15 that night. We tried to keep each other entertained as long as possible but once the sun set (early) and the whiskey ran out (pretty quick) we all dove into our trucks for a long night.
Wish I could offer better info but I'm pretty beat up from my trip and need some rest. Have a great trip!
Also, there is a good chance of rain and snow this weekend, so be prepared for that on the loop, and to have to park at the Kilns and hike up from 6900 ft to Mahogany Flat.
26 miles in 2 days sounds reasonable if you are fit enough for it.