text:
High level of motorists speeding in 50km/h zones: top speed of 132km/h
— Very high speeds recorded in areas people expected to walk and cycle
— "Absence of fixed speed cameras is something of a mystery," says group
— Gardai regularly tweet about motorists exceeding urban limits by 50% or more.
Speed detection data in urban areas in Galway and Mayo show that speeding in urban areas is a significant issue with speed limit compliance as low as 2% in one location and less than 50% in another.
IMAGE: Speed and pedestrian survival rates (image: NSW Government)
The speed limit data is from a community group in Galway, and official data from Mayo County Council. Postings by @GardaTraffic — the official account of the Garda Síochána Traffic Corps also shows how widespread the issue is across the country.
Examples of recent checks by Gardai included drivers clocked at the following speeds and locations which are 50km/h roads: 84km/h and 72km/h on the Merrion Road in Dublin; three detections between 82km/h and 90km/h on the Quincentenary Bridge in Galway; 76km/h in Ballinacurra, Co Cork, 76km/h on the Sean Moore Road in Dublin; 92km/h in Kilmacthomas, Co Waterford.
Galway and Dublin seem to be a popular spot for Gardai highlighting speeding on Twitter; another two examples include 121km/h on a 50km/h section of the Tuam Road in Galway in heavy rain; "several" drivers at over 75km/h in Bluebell in Dublin and a motorcyclist at 117km/h on an unidentified 50km/h road in Galway.
In 60km/h zones there were also a number of examples extremely high speeds, including: Gardai catching a motorist at 126km/h on a 60km/h section of Naas Road in Dublin in wet conditions; four motorists traveling "in the low to mid 90's" at Clondrinagh in suburban Limerick; and a car traveling at 98km/h on the N11.
Nearly all of the above mentioned locations include no or a minimal level of segregation between motorists and people walking and cycling, as well as at-grade crossings for cyclists and pedestrians.
In Galway, walking and cycling campaigners at the Community Road Safety Action & Information Network (Cosain) used a commercially-available radar speed gun to record speeds at Parkmore Road in Galway — the area is a residential suburb as well as an access route to a large business park and a link road between the N17 and the N6. The road has narrow cycle lanes.
IMAGE: Stopping distance by speed (image: UK Department of Transport)
Cosain said: "There was an extremely low level of compliance with the 50 km/h speed limit. Of the total of five hundred vehicles included in the systematic surveys, only ten (2%) were observed to be travelling at or under the 50km/h speed limit. If 'speeding' is defined as driving at 60 km/h or more in a 50 km/h zone, then a total of 436 motorists were observed to be speeding, comprising 87% of the entire 500 vehicles surveyed. Overall 70-80% of drivers were travelling at 65 km/h or above, which Cosain categorises as 'high risk' speeding."
As we reported last week, a planned redesign of Parkmore Road was rejected by the planning authority, An Bord Pleanála, which said that there was too great of a difference between the proposed design and guidelines which aim to make roads safer and attractive for walking and cycling.
On the existing road, two motorists were recorded at maximum speeds in excess of 100 km/h in main speed survey, while spot checks to "provide additional evidence of the extremely dangerous speeds known to occur in this residential area" found a car driver was seen travelling at 121 km/h on the evening of June 26, while a motorcyclist was clocked at 132 km/h around 8pm on August 3.
IMAGE: A speeding car passes a speed detected sign beside a narrow cycle lane in Ballina, Co Mayo.
Cosain regularly does speed checks in Galway city, but it said that these were the highest speeds recorded by it "anywhere in the city to date".
Overall, Cosain said: "No significant change in the average speed of vehicles in Parkmore has been observed since the previous survey report in 2014. 99% of cars were exceeding the speed limit in 2014 and in 2016 the figure is 98%."
The group added: "Residents have told us that Gardai have attended periodically for speed surveillance but whether it's the case that they have attended too infrequently or were there at times of low traffic, there seems to be no significant deterrent effect overall."
"The absence of fixed speed cameras is something of a mystery to us," the Cosain spokesperson added. "Fixed speed cameras are of proven benefit, but so far we have not learned why they are not widely used in Galway and elsewhere in Ireland."
Ireland is one of the few countries which does not use fixed speed cameras in urban areas. The only fix camera system in operation in Ireland is in the Port Tunnel motorway and it was only decided recently that it would be used for enforcement after a new legal view was issued that no new law was required to use the camera in prosecutions.
Ireland is not the only place to struggle with the concept of fixed speed cameras. Bike Portland, a cycling news website covering Portland in Oregon, has covered the struggle between city and state authorities over the use of fixed speed cameras. But Bike Portland has reported that the first of such cameras, which was recently installed in a 40mph (60km/h) zone, is already viewed as a success.
Meanwhile, sample data released by Mayo County Council to IrishCycle.com under envirenmental freedom of information laws shows high speeds every hour of the day in two 50km/h zone locations in Ballina, Co Mayo — the Foxford Road and the Killala Road, both well within the urban built up area of the town.
The data was recorded on speed detection signs which are designed to alert motorists to their own speeding in an attempt to slow them down, but, unlike such signs in Portland and elsewhere, there's no enforcement function for such signs in Ireland.
The data released was for the hours between 7am on Friday February 20 2016 to 7am on Saturday February 21. The data recorded includes the speeds of bicycles, tractors and Friday evening rush hour traffic, which lower the overall speeds recorded.
The highest recorded speed was 97km/h between 9am and 10am on the Friday morning, and 98km/h between 7am and 8am on a Saturday morning.
The percentage of passing vehicles recorded over the limit was 23.85% at the Foxford Road location and 53% at the Killala Road location between 7am and midnight on Friday. Speeding increased at both locations between midnight and 7am on Saturday — with speeding at 51% and 64% in those hours at the respective locations.
DETAILED DATA:
Cosain survey data for Parkmore Road in June 2016:
Example data for Killala Road, Ballina between 7am on Friday February 20 2016 to 7am on Saturday February 21 (times/dates corrected on table headers to correspond to requested and provided data):
Example data for Foxford Road, Ballina between 7am on Friday February 20 2016 to 7am on Saturday February 21:
A sample of examples from @GardaTraffic:
Pearse St Gardaí Speed check on Merrion Rd. Lots of compliance with 50Kph limit. Slow down, Arrive Alive.! pic.twitter.com/r8KbcaIsIH
— An Garda Síochána (@GardaTraffic) August 4, 2016
On the 50km/h Quincentenary Bridge in Galway:
Speed checks on Quincentenary Bridge in Galway on 9.9.16… FCPN issued. Please slow down. pic.twitter.com/SteFw6qi6X
— An Garda Síochána (@GardaTraffic) September 10, 2016
DMR Traffic detect motorist doing 126kph in a 60 zone on a wet Naas Rd. Please slow down & stay safe! pic.twitter.com/6Dxm8aOE8q
Limerick traffic corp, 4 vehicles detected travelling at Clondrinagh in the low to mid 90's where a 60kph limits applies, FCPS's issued. pic.twitter.com/izBvuwC7ek
Pearse St Traffic -60 kph speed c/point N11, highest detection 98kph. Slowdown Arrive Alive ! pic.twitter.com/fVr3X1mKc1
— An Garda Síochána (@GardaTraffic) July 31, 2016
Waterford Speed Check Numerous FCPN's issued by Kilmacthomas Gardai. All in a built 50kmph area. Highest 92 kmph pic.twitter.com/5Q3qWYbv60
inpetto62 September 26, 2016 at 9:57 am
And this phenomenon of cars and their drivers is exactly why The Netherlands is full of all kind of physical speed breakers.
crc September 26, 2016 at 1:56 pm
The Naas Rd example is particularly unfortunate (126km/h); it's not like there isn't enough room to engineer good cycling facilities away from the main road.
Aidan Smith September 26, 2016 at 9:20 pm
Thanks Cian. Just to note that "travelling" is spelled incorrectly a couple of times in the article.
HivemindX September 27, 2016 at 11:45 am
When the subject of speed limit enforcement comes up people generally complain that the cameras are only put in places where there is no issue with speeding (shooting fish in a barrel, simply for money). Presumably these people feel that none of these examples are a real issue. Sure it's a grand straight road, and I know it like the back of my hand. Cyclists and/or pedestrians shouldn't be using a road like that anyway.
People also seem to have no problem with speed limits, unless they are enforced. I imagine there are those, who don't consider themselves to be anti-social vermin at all, who would have no problem vandalising or supporting the vandalism of fixed speed enforcement cameras. You don't have to look hard to find implicit, or explicit, support of the destruction of these cameras, or even the arson of gatso vans.
Mike McKillen September 28, 2016 at 12:18 pm
These data, albeit from a privately held Bushnell speed-detector device, are a cause for concern and give lie to the notion that most drivers are speed limit compliant. The RSA free-speed surveys also show extensive non-compliance and yet we have the oft repeated refrain from AA Ireland that Garda detection systems are akin to shooting fish in a barrel.
The penalties for speeding need to be ramped up to take account of nature of the vehicle For example, HGV, bus and coach drivers are driving high mass vehicles so kinetic energy is high, hence the penalty-points and fine need to be set far higher than for saloon car drivers.
Titration of penalties according to speed zone limit and actual exceedance also needs to happen.
One size for all is no longer appropriate. It's not a deterrent.
HivemindX September 28, 2016 at 4:23 pm
I believe the AAs implication is not that speeding isn't happening, it is that it isn't a problem. Complaining about enforcement is not based on the idea that most motorists drive legally but on the idea that there is nothing wrong with going 100kph in an 80 or 140 on a motorway.


It hasn't always been as graceful and eloquently designed as are the intricate presentations you can see upon a visit to theater. However, ballet has been around since the 15th century when small groups of people would gather to witness a rudimentary form of ballet. What is often considered so beautiful about this type of dance is the gracefulness of the moves.
Ballet should not be misconstrued as dance that's just for the ladies. Some of the greatest ballet dancers such as Mikhail Baryshnikov and Paul Taylor were men who gave phenomenal performances time and again to audiences who were delighted and amazed to witness the grace, strength, endurance and talent these dancers produced for them.
The beauty of ballet dancing comes in many different forms of ballet, as you may already know. Originating in Italy and expanding from there to many points in the world, ballet has always been regarded as a trained form of dancing that required practice to achieve. Even though ballet was nowhere near as defined as it is now, it has always been a dance designed with a number of chorographic moves designed to make an artistic expression through dance.
Most will agree that classical ballet is the most formal style of ballet dance. There are some variations within classical ballet but, for the most part, the basics are recognized by the School of American Ballet and the Royal Academy of Dance, amongst others. Did you know that the first ballet shoes that allowed a dancer to balance on the toes was simply well sewn at the end? Today, ballet shoes are boxed, making it possible for the dancer to appear virtually weightless in many moments of ballet dancing.
Neoclassical ballet has a less formalized presentation to it but at the same time it is often noticeably more structured. Dancers who perform this type of ballet sometimes demonstrate a noted focus that is characteristic. Other styles of ballet include pre-romantic ballet, romantic ballet and ballet d'action.
Those who have studied ballet dance for any length of time know that it take practice, practice and more practice to begin the mastery of this graceful dance. This does not mean that you cannot study ballet for pleasure or other reasons. It is a dance style that often speaks with fluid moves and artistic expression that both dancers and their audiences enjoy experiencing and watching.
Perhaps you have a young child who has expressed an interest in ballet dancing. There's no time like the present to get them into a class or lessons at home that allow them to fully explore their interest. In the beginning, be supportive and encouraging of even the slightest progress. Encourage your child to continue with the lessons and take time to teach them some of the history of the art of ballet dancing.
You may even want to treat them to a trip to see a real ballet dancer in action. This can be one of the most motivating and moving experiences to be eyewitness to a professional ballet dancer live and in person such as the performances that are given at the theaters and opera houses.


text:
package com.alibaba.jstorm.daemon.nimbus.metric;

import com.alibaba.jstorm.common.metric.MetricMeta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicIntegerArray;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.jstorm.client.ConfigExtension;
import com.alibaba.jstorm.cluster.StormClusterState;
import com.alibaba.jstorm.common.metric.AsmGauge;
import com.alibaba.jstorm.daemon.nimbus.NimbusData;
import com.alibaba.jstorm.daemon.nimbus.metric.flush.FlushEvent;
import com.alibaba.jstorm.daemon.nimbus.metric.merge.MergeEvent;
import com.alibaba.jstorm.daemon.nimbus.metric.refresh.RefreshEvent;
import com.alibaba.jstorm.daemon.nimbus.metric.uploader.DefaultMetricUploader;
import com.alibaba.jstorm.daemon.nimbus.metric.uploader.MetricUploader;
import com.alibaba.jstorm.daemon.nimbus.metric.uploader.TopologyMetricDataInfo;
import com.alibaba.jstorm.daemon.nimbus.metric.uploader.UploadEvent;
import com.alibaba.jstorm.metric.DefaultMetricIDGenerator;
import com.alibaba.jstorm.metric.DefaultMetricQueryClient;
import com.alibaba.jstorm.metric.JStormMetricCache;
import com.alibaba.jstorm.metric.JStormMetrics;
import com.alibaba.jstorm.metric.MetaType;
import com.alibaba.jstorm.metric.MetricDef;
import com.alibaba.jstorm.metric.MetricIDGenerator;
import com.alibaba.jstorm.metric.MetricQueryClient;
import com.alibaba.jstorm.metric.MetricUtils;
import com.alibaba.jstorm.metric.SimpleJStormMetric;
import com.alibaba.jstorm.metric.TimeTicker;
import com.alibaba.jstorm.metric.TopologyMetricContext;
import com.alibaba.jstorm.utils.JStormUtils;
import com.alibaba.jstorm.utils.TimeUtils;
import com.codahale.metrics.Gauge;

import backtype.storm.generated.MetricInfo;
import backtype.storm.generated.TopologyMetric;
import backtype.storm.utils.Utils;

public class ClusterMetricsContext {
    private static final Logger LOG = LoggerFactory.getLogger(ClusterMetricsContext.class);

    protected JStormMetricCache metricCache;

    /**
     * map<topologyId, TopologyMetricContext>>, local memory cache, keeps only one snapshot of metrics.
     */
    protected final ConcurrentMap<String, TopologyMetricContext> topologyMetricContexts = new ConcurrentHashMap<>();

    public static final String PENDING_UPLOAD_METRIC_DATA = "__pending.upload.metrics__";
    public static final String PENDING_UPLOAD_METRIC_DATA_INFO = "__pending.upload.metrics.info__";

    // the slot is empty
    private static final int UNSET = 0;
    // the slot is ready for uploading
    private static final int SET = 1;
    // the slot is being uploaded
    private static final int UPLOADING = 2;
    // the slot will be set ready for uploading
    private static final int PRE_SET = 3;

    protected final AtomicIntegerArray metricStat;

    protected StormClusterState stormClusterState;

    private MetricUploaderDelegate metricUploaderDelegate;
    protected final List<MetricUploader> metricUploaders = new ArrayList<>();
    private MetricUploader lastMetricUploader;
    private final AtomicBoolean readyToUpload = new AtomicBoolean(false);

    protected AtomicBoolean isShutdown;
    protected String clusterName;
    protected int maxPendingUploadMetrics;

    private final NimbusData nimbusData;
    private MetricQueryClient metricQueryClient;

    /**
     * use default UUID generator
     */
    private final MetricIDGenerator metricIDGenerator = new DefaultMetricIDGenerator();

    public ClusterMetricsContext(final NimbusData nimbusData) {
        LOG.info("create cluster metrics context...");

        this.nimbusData = nimbusData;
        this.metricCache = nimbusData.getMetricCache();
        this.stormClusterState = nimbusData.getStormClusterState();
        this.isShutdown = nimbusData.getIsShutdown();
        clusterName = ConfigExtension.getClusterName(nimbusData.getConf());
        if (clusterName == null) {
            throw new RuntimeException("cluster.name property must be set in storm.yaml!");
        }

        this.maxPendingUploadMetrics = ConfigExtension.getMaxPendingMetricNum(nimbusData.getConf());
        this.metricStat = new AtomicIntegerArray(this.maxPendingUploadMetrics);

        int cnt = 0;
        for (int i = 0; i < maxPendingUploadMetrics; i++) {
            TopologyMetricDataInfo obj = getMetricDataInfoFromCache(i);
            if (obj != null) {
                this.metricStat.set(i, SET);
                cnt++;
            }
        }
        LOG.info("pending upload metrics: {}", cnt);

        // track nimbus JVM heap
        JStormMetrics.registerWorkerGauge(JStormMetrics.NIMBUS_METRIC_KEY, MetricDef.MEMORY_USED,
                new AsmGauge(new Gauge<Double>() {
                    @Override
                    public Double getValue() {
                        return JStormUtils.getJVMHeapMemory();
                    }
                }));
    }

    /**
     * init plugins and start event
     */
    public void init() {
        try {
            initPlugin();
        } catch (RuntimeException e) {
            LOG.error("init metrics plugin error:", e);
            System.exit(-1);
        }

        pushRefreshEvent();
        pushFlushEvent();
        pushMergeEvent();
        pushUploadEvent();
        pushDiagnosisEvent();
        LOG.info("Finish");
    }

    public void initPlugin() {
        // init rate controller
        MetricUploader.rateController.init(nimbusData.getConf());

        String metricUploadClass = ConfigExtension.getMetricUploaderClass(nimbusData.getConf());
        if (StringUtils.isBlank(metricUploadClass)) {
            metricUploadClass = DefaultMetricUploader.class.getName();
        }
        // init metric uploader
        LOG.info("metric uploader classes:{}", metricUploadClass);
        String[] classes = metricUploadClass.split(",");
        for (String klass : classes) {
            klass = klass.trim();
            if (StringUtils.isBlank(klass)) {
                continue;
            }

            Object instance = Utils.newInstance(klass);
            if (!(instance instanceof MetricUploader)) {
                throw new RuntimeException(klass + " isn't MetricUploader class ");
            }
            MetricUploader metricUploader = (MetricUploader) instance;
            try {
                metricUploader.init(nimbusData);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            metricUploaders.add(metricUploader);
            LOG.info("Successfully init metric uploaders:{}", metricUploaders);
        }
        this.lastMetricUploader = metricUploaders.get(metricUploaders.size() - 1);

        // init metric query client
        String metricQueryClientClass = ConfigExtension.getMetricQueryClientClass(nimbusData.getConf());
        if (!StringUtils.isBlank(metricQueryClientClass)) {
            LOG.info("metric query client class:{}", metricQueryClientClass);
            this.metricQueryClient = (MetricQueryClient) Utils.newInstance(metricQueryClientClass);
        } else {
            LOG.warn("use default metric query client class.");
            this.metricQueryClient = new DefaultMetricQueryClient();
        }
        try {
            metricQueryClient.init(nimbusData.getConf());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        LOG.info("Successfully init MetricQureyClient ");

        this.metricUploaderDelegate = new MetricUploaderDelegate();
        this.readyToUpload.set(true);
    }

    public void pushRefreshEvent() {
        LOG.debug("Issue RefreshEvent.RefreshSys Event");

        RefreshEvent refreshTopologyEvent = new RefreshEvent();
        refreshTopologyEvent.setClusterMetricsContext(this);
        nimbusData.getScheduExec().scheduleAtFixedRate(refreshTopologyEvent, 0, 60, TimeUnit.SECONDS);
    }

    public void pushFlushEvent() {
        FlushEvent event = new FlushEvent();
        event.setClusterMetricsContext(this);
        nimbusData.getScheduExec().scheduleAtFixedRate(event, 15, 15, TimeUnit.SECONDS);
    }

    public void pushMergeEvent() {
        MergeEvent event = new MergeEvent();
        event.setClusterMetricsContext(this);

        nimbusData.getScheduExec().scheduleAtFixedRate(event, 60, 60, TimeUnit.SECONDS);
    }

    public void pushDiagnosisEvent() {
        DiagnosisEvent event = new DiagnosisEvent();
        event.setClusterMetricsContext(this);

        nimbusData.getScheduExec().scheduleAtFixedRate(event, 60, 60, TimeUnit.SECONDS);
    }

    public void pushUploadEvent() {
        UploadEvent event = new UploadEvent();
        event.setClusterMetricsContext(this);

        // special, upload thread is actually an inf-loop, so we use Long.MAX_VALUE
        nimbusData.getScheduExec().scheduleAtFixedRate(event, 0, Long.MAX_VALUE, TimeUnit.SECONDS);
    }

    public void shutdown() {
        LOG.info("Begin to shutdown");
        getMetricUploaderDelegate().cleanup();

        LOG.info("Successfully shutdown");
    }

    /**
     * get topology metrics, note that only topology & component & worker
     * metrics are returned
     */
    public TopologyMetric getTopologyMetric(String topologyId) {
        long start = System.nanoTime();
        try {
            TopologyMetric ret = new TopologyMetric();
            List<MetricInfo> topologyMetrics = metricCache.getMetricData(topologyId, MetaType.TOPOLOGY);
            List<MetricInfo> componentMetrics = metricCache.getMetricData(topologyId, MetaType.COMPONENT);
            List<MetricInfo> workerMetrics = metricCache.getMetricData(topologyId, MetaType.WORKER);

            MetricInfo dummy = MetricUtils.mkMetricInfo();
            if (topologyMetrics.size() > 0) {
                // get the last min topology metric
                ret.set_topologyMetric(topologyMetrics.get(topologyMetrics.size() - 1));
            } else {
                ret.set_topologyMetric(dummy);
            }
            if (componentMetrics.size() > 0) {
                ret.set_componentMetric(componentMetrics.get(0));
            } else {
                ret.set_componentMetric(dummy);
            }
            if (workerMetrics.size() > 0) {
                ret.set_workerMetric(workerMetrics.get(0));
            } else {
                ret.set_workerMetric(dummy);
            }
            ret.set_taskMetric(dummy);
            ret.set_streamMetric(dummy);
            ret.set_nettyMetric(dummy);

            return ret;
        } finally {
            long end = System.nanoTime();
            SimpleJStormMetric.updateNimbusHistogram("getTopologyMetric", (end - start) / TimeUtils.NS_PER_US);
        }
    }

    public void deleteMetric(String topologyId, int metaType, List<String> idList) {
        final TopologyMetricContext context = topologyMetricContexts.get(topologyId);
        if (context != null) {
            for (String id : idList) {
                MetricMeta meta = metricQueryClient.getMetricMeta(clusterName, topologyId, MetaType.parse(metaType), id);
                if (meta != null) {
                    LOG.warn("deleting metric meta:{}", meta);
                    metricQueryClient.deleteMeta(meta);
                    context.getMemMeta().remove(meta.getFQN());

                    metricCache.put(topologyId, context.getMemMeta());
                } else {
                    LOG.warn("Failed to delete metric meta, topology:{}, metaType:{}, id:{}, meta not found",
                            topologyId, metaType, id);
                }
            }
        } else {
            LOG.warn("Failed to delete metric meta, topology:{} doesn't exist!", topologyId);
        }
    }

    public TopologyMetricContext getClusterTopologyMetricContext() {
        return topologyMetricContexts.get(JStormMetrics.CLUSTER_METRIC_KEY);
    }

    public static String getWorkerSlotName(String hostname, Integer port) {
        return hostname + ":" + port;
    }

    public boolean isTopologyAlive(String topologyId) {
        return topologyMetricContexts.containsKey(topologyId);
    }

    public TopologyMetric getMetricDataFromCache(int idx) {
        return (TopologyMetric) metricCache.get(PENDING_UPLOAD_METRIC_DATA + idx);
    }

    public TopologyMetricDataInfo getMetricDataInfoFromCache(int idx) {
        return (TopologyMetricDataInfo) metricCache.get(PENDING_UPLOAD_METRIC_DATA_INFO + idx);
    }

    public Map<String, Long> registerMetrics(String topologyId, Set<String> metricNames) {
        TimeTicker ticker = new TimeTicker(TimeUnit.MILLISECONDS, true);

        TopologyMetricContext topologyMetricContext = topologyMetricContexts.get(topologyId);
        if (topologyMetricContext == null) {
            LOG.warn("topology metrics context does not exist for topology:{}!!!", topologyId);
            return new HashMap<>();
        }

//        if (!topologyMetricContext.finishSyncRemote()) {
//            LOG.warn("waiting for topology {} to finish sync with remote.", topologyId);
//            return new HashMap<>();
//        }

        ConcurrentMap<String, Long> memMeta = topologyMetricContexts.get(topologyId).getMemMeta();
        Map<String, Long> ret = new HashMap<>();
        for (String metricName : metricNames) {
            Long id = memMeta.get(metricName);
            if (id != null && MetricUtils.isValidId(id)) {
                ret.put(metricName, id);
            } else {
                id = metricIDGenerator.genMetricId(metricName);
                Long old = memMeta.putIfAbsent(metricName, id);
                if (old == null) {
                    ret.put(metricName, id);
                } else {
                    ret.put(metricName, old);
                }
            }
        }
        long cost = ticker.stop();
        LOG.info("register metrics, topology:{}, size:{}, cost:{}", topologyId, metricNames.size(), cost);

        return ret;
    }

    public void printDiagnosticStats() {
        StringBuilder sb = new StringBuilder(256);
        for (int i = 0, j = 0; i < maxPendingUploadMetrics; i++) {
            int v = metricStat.get(i);
            if (v != UNSET) {
                sb.append(i).append(":").append(v).append("\t");
                if (++j % 5 == 0) {
                    sb.append("\n");
                }
            }
        }
        LOG.info("metric stats\n--------------------------------------\n{}\n",
                sb.length() == 0 ? "ALL UNSET" : sb.toString());
    }

    public int getAndPresetFirstEmptyIndex() {
        for (int i = 0; i < maxPendingUploadMetrics; i++) {
            if (metricStat.get(i) == UNSET) {
                if (metricStat.compareAndSet(i, UNSET, PRE_SET)) {
                    return i;
                }
            }
        }
        return -1;
    }

    public int getFirstPendingUploadIndex() {
        for (int i = 0; i < maxPendingUploadMetrics; i++) {
            if (metricStat.get(i) == SET) {
                return i;
            }
        }
        return -1;
    }

    public void markUploaded(MetricUploader curUploader, int idx) {
        if (curUploader == lastMetricUploader) {
            forceMarkUploaded(idx);
        }
    }

    public void forceMarkUploaded(int idx) {
        this.metricCache.remove(PENDING_UPLOAD_METRIC_DATA + idx);
        this.metricCache.remove(PENDING_UPLOAD_METRIC_DATA_INFO + idx);
        this.metricStat.set(idx, UNSET);
        if (MetricUploader.rateController.isEnableRateControl()) {
            MetricUploader.rateController.decrUploadingNum();
        }
    }

    public void markUploading(int idx) {
        this.metricStat.set(idx, UPLOADING);
    }

    public void markSet(int idx) {
        this.metricStat.set(idx, SET);
    }

    public JStormMetricCache getMetricCache() {
        return metricCache;
    }

    public ConcurrentMap<String, TopologyMetricContext> getTopologyMetricContexts() {
        return topologyMetricContexts;
    }

    public StormClusterState getStormClusterState() {
        return stormClusterState;
    }

    public boolean isReadyToUpload() {
        return this.readyToUpload.get();
    }

    public MetricUploaderDelegate getMetricUploaderDelegate() {
        return metricUploaderDelegate;
    }

    public NimbusData getNimbusData() {
        return nimbusData;
    }

    public MetricQueryClient getMetricQueryClient() {
        return metricQueryClient;
    }

    public MetricIDGenerator getMetricIDGenerator() {
        return metricIDGenerator;
    }

    public String getClusterName() {
        return clusterName;
    }

    public class MetricUploaderDelegate {

        public boolean isUnderFlowControl() {
            return MetricUploader.rateController.isEnableRateControl() &&
                    !MetricUploader.rateController.syncToUpload();
        }

        public void cleanup() {
            for (MetricUploader metricUploader : metricUploaders) {
                metricUploader.cleanup();
            }
        }

        /**
         * register metrics to external metric plugin
         */
        public boolean registerMetrics(String clusterName, String topologyId, Map<String, Long> metrics) throws
                Exception {
            boolean ret = true;
            for (MetricUploader metricUploader : metricUploaders) {
                ret &= metricUploader.registerMetrics(clusterName, topologyId, metrics);
            }
            return ret;
        }

        /**
         * upload topologyMetric to external metric plugin (such as database plugin)
         *
         * @return true means success, false means failure
         */
        public boolean upload(String clusterName, String topologyId, TopologyMetric tpMetric, Map<String, Object>
                metricContext) {
            boolean ret = true;
            for (MetricUploader metricUploader : metricUploaders) {
                ret &= metricUploader.upload(clusterName, topologyId, tpMetric, metricContext);
            }
            return ret;
        }

        /**
         * upload metrics with given key and metric context. the implementation can
         * retrieve metric data from rocks db
         * in the handler thread, which is kind of lazy-init, making it more
         * GC-friendly
         */
        public boolean upload(String clusterName, String topologyId, Object key, Map<String, Object> metricContext) {
            boolean ret = true;
            for (MetricUploader metricUploader : metricUploaders) {
                ret &= metricUploader.upload(clusterName, topologyId, key, metricContext);
            }
            return ret;
        }

        /**
         * Send an event to underlying handler
         */
        public boolean sendEvent(String clusterName, MetricEvent event) {
            boolean ret = true;
            for (MetricUploader metricUploader : metricUploaders) {
                ret &= metricUploader.sendEvent(clusterName, event);
            }
            return ret;
        }

    }
}

redpajama_set_name: RedPajamaGithub


StopFake: Fact-checking the news and events in Ukraine.
Facebook and Google and their humongous data crunching machines flourish while fine media wilt. How to compete? They take media's original costly-to-produce-content for free and make it available to users to circulate, anticipating their needs with their intelligent algorithms.
Earnings of course go where the public is and, hence, newspapers and digital news outlets are having to squeeze the newsrooms, and produce meaningless stories about cats to get the clicks, and sack the newsroom savvies who covered wars, told the difficult stories, racked the muck and hold power accountable. Now they can only afford inexperienced journalists who can churn out the news as if they were sausage factories; little or no editing, hardly any verification, the truth-finding business turned into white noise, official propaganda, infotainment, producing anything but hard-to-dig truths.
However, just when many were forecasting doomsday for journalism, stories of Davids against Goliaths spring about in the world: small teams of journalists using the same technologies developed by the giants to find sources out in the world wide open web, to produce stories that expose wrongdoings by mighty rulers and potent corporations. These reporters learn how to play with the available software, use social networks and chatting services to collaborate with each other across borders and also, to contrast information and then, publish simultaneously to give power to their punches.
Despite the uncertain future, opportunity is knocking on the door of journalism. Millions of sources are open to be used by journalists and techies.
For example, Bellingcat, a group of citizen investigative journalists, tracked the route of the Buk missile-launcher carrying the missile that was to down the Malaysian Airlines plane over Eastern Ukraine. They used Google Earth (as well as work on-site), to verify the locations depicted in photos posted by the public; satellite pictures (the purchase of which was crowd-funded) and photos of Russian soldiers on the social networking site VKontakte that enabled the investigators to determine to which military unit the missile launcher belonged. Bellingcat also used Checkdesk, a collaboration platform, to ask citizens to verify the authenticity of specific videos and photos posted in social media and Bridge, a crowdsourcing translation tool, for quick verification of significant events during the war in Ukraine.
Journalists of Rutas del Conflicto are completing a data-base of massacres in Colombia with the victims' aid. They want every name to be right, to bring back some humanity to the insanity of a country still resistant to look at the real face of its own tragedy; Kenyan Joshua Ogure and his friends managed to use GPS to put their beloved neighbourhood of the Kibera in the outskirts of Nairobi on the map and discovered that 81 percent of the schools were considered informal and that the government had only built 4 percent of Kibera's schools to host almost 60.000 students.
Other groups, such as Chequeado in Argentina, Africa Check in South Africa, Stop-Fake in Ukraine, follow public discourses of their leaders and fellow journalists, join forces with users and check them with publicly available data to help citizens sort out truth from deception. According to the Reporter's Lab, there are currently 96 active fact-checking projects in 37 countries; the third Global Fact-Checking Summit will bring leading fact-checkers to Buenos Aires in June.
Despite the uncertain future, opportunity is knocking on the door of journalism. Millions of sources –from public databases and leaked documents to photos posted in social networks and experts and witnesses among the readers – are open to be used by journalists and techies. There seems to be no limit to what reporters can discover and verify across countries and topics to hold power accountable and unearth thorny truths.
Every March Chequeado gathers around 80 volunteer fact-checkers – students and academics – to live-check the yearly speech of Argentinean president. They follow every reference to statistics on topics including economy and demographics and check in the appropriate database if the fact is true. Chequeado has also a large online community of fact-checkers following the speech. "We are sure that the people who are involved in producing information, are more prepared to criticize what the media and leaders are saying," says Laura Zommer, executive director at Chequeado.
Reported.ly is a new type of newsroom where journalists, based all over the world, report, verify and investigate international stories emerging on social media and the open web. By using satellite images, tracking flights and maritime routes and crowdsourced citizen videos they were able to follow arms trade between Italy and Saudi Arabia and the use of arms against civilians in Yemen. "This is becoming traditional reporting," says Malachy Browne, managing editor at Reported.ly. "By applying these methods and tools, we are able to cover a disproportioned amount of stories on what's happening around the world," he adds.
First Draft News is a new community made up of media organizations working on open source investigations and verification of eyewitness content. The site offers free training resources for journalists looking for best ways to use social media content in their newsrooms.
This story originally appeared in the May 2016 newsletter of the Open Society Foundation's Program on Independent Journalism and is reprinted with permission.
Traditional war reporting, which mostly focused on revealing the brutality of the conflict in Colombia, is being replaced by new storytelling techniques using alternative narratives and creative digital tools. Here's Proyecto Coca, Rutas del Conflicto and 4 Ríos.


Mailen Design commissioned to construct a one-off development maximising views over Monaco harbour for all the properties.
We had previously worked with the client on a number of feasibility studies for private villas in the region. We were initially introduced by a construction company we had been collaborating with in the UK on the development of off-site construction projects, mostly structurally insulated panel and cross laminated timber build schemes.
The brief from the client was to create a one-off development and to maximise views over Monaco harbour for all the properties. The architectural composition was in response to the local authority's request for a development of striking contemporary quality, nestled into the challenging topography. The design for the luxury two storey villa and four apartments has now been granted a building permit by the local authority, and the scheme is being considered for development by a number of investors.
The buildings are designed to complement each other in form and materials whilst maintaining an individuality between the villa and the apartment block. The limestone clad facades with projecting limestone colonnades and integrated louvres at roof level provide a solid appearance with classical proportions and integrated shading. This is punctured with brass clad highlights and balcony balustrades on both buildings. Slim aluminium window frames, anodized with a matching brass finish, are part of the simple and elegant material palette.
Ben Mailen, managing director of Mailen Design commented: "I think the client felt we were appropriate because of our commitment to striking contemporary architecture and our passion for exploring well-crafted materials. We approach every project individually with the site context being one of the main drivers. Our experience of allowing designs to work with individual site characteristics rather than fight against them helped in getting the scheme to work with a challenging topography. Previous work for commercial developer clients also helped us balance the floor areas to make the scheme financially viable, whilst creating something which was visually stunning."
The scheme has divided the site to accommodate each new building. They nestle into the hillside providing privacy to the upper level of the development which faces the primary route into Monaco, with open views from the south facing elevations across the Mediterranean. The villa and apartments each have their own swimming pools. These are at ground level for the villa and two ground floor duplexes, cascading over an infinity edge towards the sea and landscaping below, and at roof level for the two third floor apartments.
The steep slope of the site was the main challenge for the design.
Each of the apartments has a private swimming pool, regardless of where they sit. To have a number of private infinity pools at different levels of the block, all with views over Monaco harbour, is quite unique. This coupled with the fact that the pools on the upper levels can be seen from within the apartments we think will create something truly special.
In early conversations with the local planners they stressed that in order to gain permission for a scheme of this size in this context the design would need to be extraordinary. It also needed to differ from the prevailing vernacular which is regular white boxes with clay tile roofs. We think that our design brings a new level of material craftsmanship and spatial creativity which will hopefully act as a standard for new residential developments nearby.


text:
Gemma Oberth
Services will be provided through end 2017
However, additional resources for Mozambique's HIV response are required
The Board has approved $77 million to extend Mozambique shortened HIV grant (MOZ-H-MOH). The additional funds will allow Mozambique to continue providing services through to the end of 2017. The Board was acting on the recommendations of Technical Review Panel and the Grant Approvals Committee.
The original grant had an end date of 31 December 2016. The main reason for the shortened grant is related to imbalances in the Global Fund's previous allocation methodology. "Mozambique's grant was shortened to two years primarily due to under-allocation for the 2014-2016 period," said Paul Bonilla, with the Global Fund Secretariat's country team for Mozambique. Indeed, the 2014-2016 allocation methodology allotted 58% of total HIV funds to the top 15 high-burden countries (including Mozambique), despite these countries carrying 80% of the disease burden (see GFO article). The new allocation methodology for 2017-2019 will bring the allotted amounts for high HIV burden countries much closer in line with the need.
In addition to being under-allocated, Mozambique faced another challenge – just $3.2 million of the 2014-2016 allocation was new funding. The rest of the country's $252.6 million allocation for HIV was existing in-country funding that was already committed to programs, Bonilla told GFO.
When the original grant was signed, the funding gap – i.e. the amount that would have allowed the original grant to be funded through to the end of 2017 – was $87 million. However, in May 2016, $10 million in savings from the original grant were identified, reducing the gap to $77 million. The Global Fund is now able to fund this gap because the Finance and Operational Performance Committee said in March 2016 that $700 million was available for portfolio optimisation (which includes funding shortened grants).
"Most of this extension is to cover the procurement of antiretrovirals (ARVs)," said Uliane Appolinário, also with the country team for Mozambique. "We have to ensure the continuation of those services." In Mozambique, all HIV treatment is funded by external donors, with approximately 48% from the Global Fund and the remaining 52% from the U.S. Government.
(Despite this reliance on external funding for treatment, Mozambique's 2014 concept note made no request for ARVs under the within allocation budget, but made a $225.4 million above allocation request. However, the final budget of the approved grant included $87.1 million for the procurement of ARVs, pre-ARV medicines, treatment adherence and treatment monitoring.)
While the costed grant extension for Mozambique's HIV program is a necessary stop-gap to ensure the continuity of services – especially for treatment – it is also presents an opportunity. Bonilla said that the additional investment is "building on the success that the program has demonstrated. The programme is performing extremely well." Mozambique has contributed significantly to the Global Fund's overall results, so there is confidence that the additional resources will translate into further impact.
Recent policy developments in treatment eligibility also create additional opportunity for impact from the costed grant extension. In February 2016, Mozambique moved to CD4 500 eligibility for ART among the general population, which Bonilla called "a really massive scale up." It was only in 2012 that Mozambique moved to CD4 350 eligibility.
Further, the country will begin rolling out universal test-and-treat (UTT) in 30 hotspot districts starting in July 2016, and there are plans to gradually expand UTT in 2017. Geospatial mapping shows that HIV in Mozambique is highly concentrated in just a few districts (see figure). This evidence was recently presented at the 21st International AIDS Conference in Durban, South Africa. Leucipo Gonçalves, the Executive Secretary of the Mozambique CCM, said that "the test-and-treat strategy is still being discussed, with various scenarios which have to be considered in order to make this process run smoothly." Alongside this change, a recently-approved national policy on key populations also stipulates that there should be preferential access to treatment for sex workers, men who have sex with men, and other vulnerable groups. In December 2015, a high-level delegation visited the country in support of this new policy. The delegation included Mark Dybul, Executive Director of the Global Fund; Ambassador Deborah Birx, Coordinator of the United States Government Activities to Combat HIV/AIDS; and Michel Sidibé, Executive Director of UNAIDS.
Although the additional Global Fund investment is necessary, it is also not enough. The need for additional resources for Mozambique' HIV response is clear. Costing analyses of Mozambique's current national strategic plan on HIV/AIDS (2015-2019) suggest that program costs will increase from $273 million in 2014 to $433 million in 2019 in order to reach current targets. Modelling shows that an accelerated scale up would come with a price tag of $495 million by 2019. This pales in comparison to the $21 million in domestic resources allocated to both HIV and TB in 2013 (as cited in the 2014 concept note). The same costing analysis shows that Mozambique's national targets for people who inject drugs and men who have sex with men are not in line with global Fast-Track targets.
It is likely that Mozambique will begin planning for its next cycle of Global Fund investment in early 2017. "Given the roll out of test-and-treat, we will need to ensure even greater involvement of civil society in the next round of funding," said Gonçalves. "Modes of community-based service delivery will be absolutely necessary for the country to reach its treatment targets."
Information for this article comes from the July 2016 report of the Secretariat's Grant Approvals Committee to the Board (GF-B35-ER07). This document is not available on the Fund's website.
See separate GFO article in this issue for an overview of the shortened grants for which funding was approved.
key populations
test-and-treat

redpajama_set_name: RedPajamaCommonCrawl


text:
Chapel Hill employees connect through book club
BY Summer Winkler
Chapel Hill employees have turned a new chapter in their lives.
Four times a year, people from a variety of town departments meet to socialize and discuss their latest reads at the Words @ Work book club.
A group of employees came up with the idea for the book club and started it last year. Members include police officers, librarians, town administrators and the mayor.
"It's a new program for all town employees. It's a book club that offers employees the chance to learn and have fun together and connect ideas with our work at the town," said Maggie Hite, circulation librarian at the Chapel Hill Public Library.
Hite is in charge of selecting books for the group.
Chapel Hill Mayor Mark Kleinschmidt recently joined the book club. He was prepared to attend his first meeting on Feb. 20 by reading "A Home On the Field" by UNC professor Paul Cuadros, but he was unfortunately unable to attend.
"I was disappointed that I couldn't go. I'm looking forward to the next one," he said. "I'm going to block off that day and make sure nothing happens."
Brian Callaway, Chapel Hill's energy management specialist, said Words @ Work helped him get back into reading for fun.
"I recently graduated from UNC, and graduate school can wear you out on reading," Callaway said. "I do a bunch of reading for work too, and independent reading is an old habit that I had forgotten about. This has been good to kickstart that."
Callaway said the book club has also given him a chance to interact with co-workers from different departments and read books he wouldn't know about otherwise.
The book club has also helped employees gain a new perspective on the town and their work.
The first book the club read was "I'm A Stranger Here Myself: Notes on Returning to America After 20 Years Away" by Bill Bryson. The book is about an American who lived in England for many years and came back to the United States with a new perspective on his own culture.
"For us, that insider/outsider view sparked some of us to look different at our jobs and our perceptions," Hite said about the book. "Sometimes when you look at something through comedy or a funny focus, it's easier to see things."
Next up in Town Talk
Live from Franklin Tweet for April 21
Where notable Chapel Hill adults got their start
Residents raise concerns over new Google Fiber hut


Architecturally designed, decidedly edgy and definitely worth a look. Built in 2006, this weatherboard and concrete block home will appeal to those with an eye for a very cool city-side retreat. In a peaceful, private, mature garden setting it features a high stud with full height doors and windows which flood the house with natural light and give it a bright and airy feel. With gorgeous oak flooring, two spacious living areas with gas fire and a generous master suite on its own level, this is a vibrant home that will appeal to buyers looking for something special. The location in the heart of Mission Bay is walking distance to Eastridge Shopping Centre, local transport and just minutes to the waterfront and CBD. Offered in immaculate condition, this Selwyn College zoned home deserves your close inspection.


1. Tell us about the person behind the work.
I guess what I'd most like readers of Even Before My Own Name www.TracyKoretsky.com to know is that its author is happy. Several centuries ago, while still in my very first few months of college, I happened to be watching the evening news. There had been a study; it found that most people who have unhappy childhoods turn out to have happy adult lives. This fell upon me like a ray slipping through the edges of a drawn blind. It had never occurred to me that I'd had an unhappy childhood; I would have said I had an unhappy life. But in that instant, I understood it was over. I was on my own now, an adult, and happiness was not only possible, but mine to craft. All right, I was wrong. At the age of seventeen, I still had a fair amount of childhood left to wend, and let's face it, it never leaves us entirely, but I was on my way, most definitely on my way.
Even Before My Own Name, I think, can be read as the history of that transition, the long insistence that despite the bad luck of a mother who died when I was twelve and a father who was mentally ill, there is still so very much to laugh at and be grateful for. I have never lost my sense of wonder about that. I sometimes find myself on a sunny day singing out loud while gazing at some breathtakingly beautiful view – the San Francisco Bay Area is so abundant with them – and I just find myself taken again by the thought: what if they could see me now. I think they (whoever the heck "they" are) would say, "Hey, I like her smile!
2. Even Before My Own Name. A huge undertaking. Where did this need for expression come from?
3. How long did it take for you to complete the book ?
I'm never good at that question. I often return to projects after writing something else for a while – sometimes a long while. For example, during the years I wrote my first novel, Ropeless www.ReadRopeless.com, I got my poetry yah-yahs from writing the voice of Danny, one of its four narrators. So the poems in Even Before My Own Name were mostly written pre-Ropeless or post-the first draft of my second novel, which I returned to before revising "Even Before…" for cohesion. So you see…a pattern.
Oh, this is all about process. Forgive me. You want to know the personal stuff. Okay. Many of the poems were first composed in Pittsburgh, Pennsylvania, during the years I worked as a guidance consoler taking graduate classes in art history and fiction writing. I begged, and I mean this – abjectly begged – to be let into a stellar community group: The Squirrel Hill Poets, http://squirrelhillpoets.org/ who were all way, way more experienced that I was, and off I went. Many of the poems woven throughout this collection were first written under their tutelage and loving care.
Fast forward a great many years and find me in one never-ending-quest-for-novel-publication exhausted moment in 2005. I slump on my bed and promise to give myself poetry for 2006. Which, let's face it, wouldn't have been enough time even if I'd had any idea where to begin. I recognized that I was not skilled enough to read poetry much less write it, so I began there. I thought about the kinds of stuff an M.F.A. program would include: some reading classes, including criticism; some prompt-type classes; an individual mentor; peer-exchange, maybe some magazine editorial work, some critical writing – then asked myself how I could mock-up something like that for myself. Of course I couldn't do it as well, of course not. I'm not presuming to say I gave myself an MFA. I'm saying that I looked at what the teachers thought might help one become a strong poet and either signed up or created it myself. So, by the fall of 2009, I was ready to release the resulting book.
4. Your thoughts on turning 50?
Haven't done it quite yet, not until this coming Thanksgiving but, hey, I'm precocious, so I gave myself my gift to myself last year! One to give away, that's what I wanted – a piece of my life-long art that I feel is complete and satisfies me. No money involved, no competitions, or publishers, the only goal: reach as many readers as possible. After all, it's connecting with readers that makes me happy, and this is a book about letting go and choosing happiness. I should say too, that I dedicated the book to "the girl I once was." That girl didn't care all that much about the judges' opinions. I wanted to honor her.
5. You've led an interesting life; how'd you get so lucky?
By being a weirdo kid, I guess. And also, all my life glasses, and much of my life, hearing loss in my left ear. It kinda put me in my own world. And is it ever interesting in there!
from Brooklyn living with her middle-aged son, a man with Down syndrome; her obese, repressed daughter; a brilliant man whose wheel chair cost him a career; and a prissy social worker, and they think ,"dour," or "sentimental." All I can say is, not from this author. Uh-uh. Once again – letting go and choosing happiness. Laughter and acceptance I guess I've got a bit of a theme going.
All I wanted from poetry once the poems in the collection were locked down was for it to make me laugh. The result is a chapbook of what I call "la-la poems," pretty, pretty nature lyrics that are fun to wrap your mouth around, with a fair amount of Japanese genre influence – that's been a keen interest. I've got quite a few of those out to magazines. Meanwhile, though I haven't written more than a few short stories since Pittsburgh, I'd like to try them again. I would do it too, if I had any idea where to begin. Alas, it seems I am not skilled enough to read them much less write, so I'm beginning there. And then, of course, as you can see, I am doing my best to share Even Before My Own Name with as many readers as possible. So many more readers than if I had just cajoled friends and family and made sad eyes at acquaintances; readers from all over the country – the world in fact. Amazing places! I can't imagine how the story of a struggling teen-ager from Chicago's Jewish suburbs might be received by someone from Malaysia or Iceland (and yes, my e-book has gone both places.) What can they possibly make of it? Certainly it can only be encountered by them as literature, as an opportunity for an empathy. Really, what more can a writer ask for?
8.Please provide any contact info you would like for my readers to find you/r/work.
Although you can get both books many places online as well as a free download of the poetry collection from its website, there are interesting readers' comments on their Amazon pages. People might also enjoy the audio readings I've posted on the my books' homepages, which are, once again, http://www.ReadRopeless.com and http://www.TracyKoretsky.com.
There's an interview with me about Ropeless here http://www.wordgathering.com/past_issues/march_2007/interview/koretsky2.html) and one of me all the way back in Pittsburgh, PA here: http://www.tracykoretsky.com/EBMON/html/audio_poems.html.
The Adirondack Review http://www.theadirondackreview.com/ will publish a review of Even Before My Own Name in June. Meanwhile here is another http://bayareapoetsreview.com/fall_2009_reviews_1from the Bay Area Seasonal Review.
Clara54 was pleased to bring you this awesome interview with Tracy. Keep in touch for more insights & wonderful profile creatives like Tracy-peace.
Just read your interview. I like your frankness and you come across as a very honest person.
Something very rare in today's world.
I'm so glad you took the time to read and comment. It's a privilege to be able to share some behind-the-scenes thoughts with readers.


Why Dream Of Being On A Maine Lake, Own The Spot On The Water! Under 25' From The Lake's Edge, This Conroy Lake Waterfront Home In Monticello Maine Is Up To Snuff. Heated Insulated Garage, New Addition On Lake Home Enjoyed For 31 Years By Neat Owners. Open Deck, Cathedral Living Room! Watch The Video Open House On Demand Tour. Valuable Land, 3.25 Acres With 185' On Lake, 700' On Dead End Roads To Develop! 1.3 Acres Is A Pine Plantation! Level To Rolling, Pride Of Ownership Shows Loud And Clear. New Windows. Not Every Property Borders The Waterfront. Not Every Home On A Lake Has Extra Acreage To Protect The Privacy, To Develop With Loved Ones You Want Close By. Maine Lake Home, Garage Too And Hook Ups For Your Camper Friends. Lots Of Land On The Waterfront! Deep Lake, Filled With Fish! Rent Out When You Don't Use! Explore Northern Maine, Aroostook County, Western New Brunswick Canada From This Central Location On Conroy Lake In Monticello! Ready To Wake Up From The Lake Home Dream?
Heading North Up US Rt 1, Take Hill Siding Road On Left, Turn Left On Lake Road, Right On Conroy Lake Road At Small White House Of Worship. Turn Right, Look For Arrow For Woodland Drive Which Dead Ends. Blue Lake Home, Garage, 3.25 Acres Of Land On Water!


Southern Charm features women's boutique clothing and men's casual wear. We offer the largest selection in the area of all the brands you've been looking for. We want to offer a little "Southern Charm" to all of our customers by offering great styles with great customer service.


On Monday night, Lauryn Hill shared an essay responding to accusations from musician Robert Glasper that she "stole music" for her album, The Miseducation of Lauryn Hill. The eight-time Grammy Award winner also addressed the treatment of her band, her notorious lateness.
The Miseducation was the first time I worked with musicians outside of the Fugees who's report and working relationship was clear. In an effort to create the same level of comfort, I may not have established the necessary boundaries and may have been more inviting than I should have been. In hindsight, I would have handled it differently for the removal of any confusion. And I have handled it differently since, I'm clear and I make clear before someone walks in the door what I am and am not looking for. I may have been inclusive, but these are my songs.
The former Fugee also talked about the rumors surrounding the remixing of songs from her magnum opus. She was adamant that she could perform the original works if she wanted to.
She also credited her lateness to shows to caring too much about performing and wanting to give her fans the greatest experience possible. "Me being late to shows isn't because I don't respect my fans or their time, but the contrary, It can be argued that I care too much, and insist on things being right," Ms. Hill proclaimed.
The 20th anniversary of The Miseducation of Lauryn Hill was on Aug. 25.
I chose to wait until after the anniversary to post this. Thank you everyone for the Love! I'd like to clear a few things up.


Cover sufficient genetic diversity to ensure resistance to climatic and sanitary hazards.
Forest research programmes have highlighted important differences in performance between tree species of different provenance. For tree species used more for reforestation purposes, research programmes have been used to develop improved forest varieties with superior performances (for a given pedoclimatic range) compared to forest genetic resources of identified and selected categories.
In this context, Irstea has come up with recommendations for using FRM, in an aim to guide tree planters in choosing material which is adapted to their region and meets their objectives. Along with a technical guide called "Réussir la plantation forestière", recommendations are set out in species sheets which remind the reader of general characteristics and available basic materials, and indicate the FRM to opt for depending on the region of use.
In order to adapt French forests to climate change, and in the framework of the National Plan for Adaptation to Climate Change 2011-2015, the Ministry of Agriculture has commissioned Irstea to run an ongoing review programme of these recommendations, in view of this objective. The programme aims to take climatic risks into account for the next forestry cycles, for different species and areas of use. This will avoid creating or renewing stands which will not last, and help move towards using FRM that will allow for better adaptation in a changing environmental context.


Home / Blog / Culture and Relationships / 5 Ways Pride KILLS A Software Project!
In this video on my YouTube channel, I share some stories that will present at least 5 ways pride kills a software project. At the end of the video I'll share three strategies I've used to fight pride.
The first way pride can kill a software project is when we become too proud of an opportunity to lead.
At the beginning of my career, I had an amazing opportunity to lead a team to build a software product using a new technology. I was inexperienced, and my pride caused me to be resistant to work with more senior people.
It didn't take long, but half my team was resistant to my changes and they wanted to see me fail. Ultimately I was given the opportunity to work on a different project but it was really because I was so difficult to work with.
The second way pride can kill a software project is when we become too proud of a select group of people.
On a project where I was able to work at a new company with many people I'd worked with before, we created a clique and didn't respect and work with the existing teams at the company very well.
In short time our project's success was at risk because we didn't get buy-in from the others on the team.
We were too proud of those we trusted, and didn't work hard enough to get the others we should collaborate with to understand that we respected their value.
The third way pride can kill a software project is when we become too proud of past successes and efforts.
I was helping a client at the consultancy I worked for, and there was a person there who was very senior and experienced, but he wouldn't change. Everyone in the company respected him – and they wanted to see him rise to the occasion, but he just wouldn't budge.
When we become too proud of the work we've done to gain skills, we can start to get resistant to doing the work it takes to stay relevant and GROW. Eventually this individual did come along to his senses, but it was painful and wasteful for a long time and caused work to be difficult for many others until that happened.
The fourth way pride can kill a software project is when we become too attached to our ideas and their potential value.
I was helping another client where they had asked our consultancy to build a product. We warned this client that what they wanted to build was too risky, and that the budget they had allocated put too much risk in all of their ideas being good.
Though we tried hard to convince the client of the importance of our approach, and how software development is different from manufacturing, ultimately we did the work the way they asked. The end result was that the business folded, because they didn't profit enough off their ideas to pay back the investment in the development.
The fifth and final way I've seen pride kill a software project is when people have too much pride in the way a process was done before.
At a company I worked with, the process that was used for selling needed a change. Many of us at the company had seen a shift in the industry, but key people in the sales department refused to entertain our ideas.
Though it was understandable that as not being in sales outside "technologists" trying to influence their process may have felt off-putting, it was out of our genuine concern for them. We wanted them to see that customers now wanted lean software development, and our company culture had to change to continue to deliver what the market wanted.
There are a few ways we can also fight pride.
The first thing we can do to help fight pride getting in the way of our career growth and successful software projects is to simply cultivate gratitude. By being more grateful of what we have, we have less attachment in being right, rewarded, or having certain outcomes – and this gives us the courage we need to try new things.
The second thing we can do to help fight pride is to see the potential in other people and the value of their ideas. If we always look to others to do things how we do, and we only evaluate others based on how often they are supporting our ideas, we miss out on the ability to benefit from what they might bring to the table. It helps us be more humble when we keep an open mind to the value of others at all times.
The last thing we can do to help fight pride is to encourage risk taking at our company and with our people. With risk comes reward, and working at companies that only take small, calculated risks only produces minimal improvements. It also creates a culture where people are unable to be as creative, and produce the innovation and efficiency breakthroughs necessary to really move to the next level. This is really the responsibility of technology leadership at companies, and a leader of a team who knows the importance of this and lets others fail to learn will harvest the best ideas from their people.
Watch my video on a Minimum Viable Product here.
Watch my video on How To A/B Software Development here.


text:
Q: Why if I put resolve() into the callback function of fs, the promise doesn't return (tips: I'm using a nodejs framework eggjs based on koa)
The code below can run successfully.But if I put resolve() into callback function of fs.renameSync(), the promise won't return any thing, and the request keeps pending status.
What causes this? Does this have to do with the order of execution?

 async uploadAsset(assetName, file) {
    const { app } = this;
    const logger = this.logger;
    return new Promise(function(resolve, reject) {
      fs.renameSync(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`, err => {
        if (err) {
          logger.warn(err);
          reject();
        }
      });
      resolve();
    });
  }

A: renameSync is a synchronous version of rename. It does not accept a callback as an argument; it only accepts an oldpath and a newpath. If you pass a third argument, it will be ignored; the callback function you're passing is never called.
If you want this to be callback-based, use fs.rename instead, which does take a callback.
Your resolve is also outside the callback at the moment, when it should be inside:
async uploadAsset(assetName, file) {
  const { app } = this;
  const logger = this.logger;
  return new Promise(function(resolve, reject) {
    fs.rename(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`, err => {
      if (err) {
        logger.warn(err);
        reject();
      }
      resolve();
    });
  });
}

Or use fs.promises instead, to accomplish this without constructing the Promise yourself.
async uploadAsset(assetName, file) {
  const { app } = this;
  const logger = this.logger;
  return fs.promises.rename(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`)
    .catch((err) => {
      logger.warn(err);
      throw new Error(err);
    });
}

redpajama_set_name: RedPajamaStackExchange


That's right! Julie's set to take part in one of four 2013 SXSW Interactive Festival Keynotes. She'll share the keynote schedule with Mathew Inman (The Oatmeal) and Elon Musk (SpaceX/Tesla) with a special interview on Monday, March 11 in Austin, Tex.
Joshua Topolsky, co-founder and founding editor in chief of The Verge, will interview Julie. The two will dish on all things OUYA — from crowdsourcing, to disruptive innovation and beyond.
The 20th annual South by Southwest (SXSW) Interactive Festival runs March 8-12, 2013 in Austin, Texas. The event features five days of compelling presentations, networking events and programs from the brightest minds in emerging technology.
I want to go to there. I live in Austin and would love to know exact details. I can't wait to buy my Ouya, and my dream car is a model S. Anyone got 90 grand they wanna give me?
Hey, what's this BS I've heard about not having Google Play support? Seriously? Did OUYA have a bad date with Google, and now desires to end it all?
If I were the emotional sort, I'd say I feel lied to.
You'd better hope the eSfere doesn't get funded, OUYA, or consider your lunch eaten.
Sounds great! I live in austin, so ill be sure to drop by and check it out!
I would love to go and get more details on the Ouya..it is pre ordered, but of course I want to know more!
Great news. Will Ouya be demoing at SXSW? Can we meet Julie?


text:
JGUS
Associated Press photos A visitor stands at the World Trade Center memorial plaza in New York during a ceremony Tuesday on the anniversary of the 9/11 terrorist attacks.
Chrissy Bortz of Latrobe, Pa., pays her respects at the Wall of Names at the Flight 93 National Memorial in Shanksville, Pa., after a memorial service Tuesday.
Wednesday, September 12, 2018 1:00 am
Americans gather at 9/11 memorials
JENNIFER PELTZ and KAREN MATTHEWS | Associated Press
NEW YORK – Americans looked back on 9/11 Tuesday with tears and somber tributes as President Donald Trump hailed "the moment when America fought back" on one of the hijacked planes used as weapons in the deadliest terror attack on U.S. soil.
Victims' relatives said prayers for their country, pleaded for national unity and pressed officials not to use the 2001 terror attacks as a political tool in a polarized nation.
Seventeen years after losing her husband, Margie Miller came from her suburban home to join thousands of relatives, survivors, rescuers and others on a misty morning at the memorial plaza where the World Trade Center's twin towers once stood.
"To me, he is here. This is my holy place," she said before the hours-long reading of the names of her husband, Joel Miller, and the nearly 3,000 others killed when hijacked jets slammed into the towers, the Pentagon and a field near Shanksville, Pennsylvania, on Sept. 11, 2001.
The president and first lady Melania Trump joined an observance at the Sept. 11 memorial near Shanksville, where one of the jetliners crashed after 40 passengers and crew members realized what was happening and several passengers tried to storm the cockpit.
Calling it "the moment when America fought back," Trump said the fallen "took control of their destiny and changed the course of history." They "joined the immortal ranks of American heroes," he said.
At the Pentagon, Vice President Mike Pence recalled the heroism of service members and civilians who repeatedly went back into the Pentagon to rescue survivors.
The terrorists "hoped to break our spirit, and they failed," he said.
At the United Nations, Security Council members stood for a moment of silence, led by U.S. Ambassador Nikki Haley.
The 9/11 commemorations are by now familiar rituals, centered on reading the names of the dead. But each year at ground zero, victims' relatives infuse the ceremony with personal messages of remembrance, inspiration and concern. For Nicholas Haros Jr., that concern is officials who make comparisons to 9/11 or invoke it for political purposes.
"Stop. Stop," implored Haros, who lost his 76-year-old mother, Frances. "Please stop using the bones and ashes of our loved ones as props in your political theater. Their lives, sacrifices and deaths are worth so much more. Let's not trivialize them."
This year's anniversary comes as a heated midterm election cycle kicks into high gear. But there have long been some efforts to separate the solemn anniversary from political campaigns.
The group 9/11 Day, which promotes volunteering on the anniversary, asks candidates not to campaign or run political ads for the day. Organizers of the ground zero ceremony allow politicians to attend, but they've been barred since 2011 from reading names or delivering remarks.
If not political speeches, there were politically tinged appeals from some victims' relatives amid the reading.
"My hope is that discrimination, hatred and bigotry will cease and that we all will come together and love," said Debra Epps, a sister of victim Christopher Epps.
Another sister, Chaundera, had an answer for anyone who wonders why families still come to such ceremonies after 17 years.
"Because soldiers are still dying for our freedom. First responders are still dying and being ill," Chaundera Epps said, adding, "God bless America that's never, ever, stopped being great."
Memorials to 9/11 continue to grow at Shanksville, where a newly dedicated Tower of Voices will eventually include a wind chime for each of the 40 people killed there, and ground zero, where work is to begin soon on a pathway honoring rescue and recovery workers.
It will serve as a way to recognize those who became sick or died from exposure to toxins released when the Trade Center's twin towers collapsed. Researchers have documented elevated rates of respiratory ailments, post-traumatic stress disorder and other illnesses among people who spent time in the rubble.
The most iconic pictures from Sept. 11 and its aftermath


Creates a more advanced union between natural nail and acrylic. The appropriate application eliminates detachments and uprisings.Improved color stabilizers prevent discoloration and yellowing of the acrylic during use or exposure to UV light. WARNING: This product can expose you to chemicals including Dimethyltolylamine, which is known to the State of California to cause cancer. For more information go to www.p65warnings.ca.gov.


Straight Wiring/Molded Plugs for Single Contact Sealed Lights 10" Lead Standard two terminal plug with male pins, bare lead..
Straight Wiring/Molded Plugs forDouble Contact Sealed Lights 10" Lead Standard PL-3 plug with male pins, bare lead wires an..
Wiring/Molded Plugs for Sealed Marker/Clearance & Utility Lights 6" Lead Pigtails feature standard PL-10 plug with male..
Right Angle Wiring/Molded Plugs forDouble Contact Sealed Lights 10" Lead Standard PL-3 plug with male pins, bare lead wires..
Right Angle Wiring/Molded Plugs for Single Contact Sealed Lights 10" Lead Standard two terminal plug with male pins, bare l..
Wiring/Molded Plugs for Sealed Marker/Clearance & Utility Lights 18" Lead Pigtails feature standard PL-10 plug with mal..
Wiring/Molded Plug for Marker/Clearance & Utility Lights Standard molded .180 male plug with 6" and 12" lead wiresFor u..
Wiring/Molded Plugs for 3-Pc Sealed Identification Light Bars Standard two terminal plugs with male pins; 65" bare lead wir..


On March 25, 2015, the Electronic Healthcare Network Accreditation Commission (EHNAC) submitted the following comments on ONC's Interoperability Roadmap to Karen DeSalvo, MD, MPH, MSc, National Coordinator for Health Information Technology and Acting Assistant Secretary for the Department of Health and Human Services.
EHNAC focused its comments on the commission's core expertise – the accreditation process for organizations and health IT products in the areas of privacy, security and confidentiality.
To read EHNAC's full comments and letter to Dr. DeSalvo, please click here.


This writeup was inspired by catting weird things to /dev/audio.
Now, we know that catting a file to /dev/audio converts it into sound, correct? However, our Windows-using friends don't have any such thing as /dev/audio. But, there is a way!
and so on. Now, click on 'project'. Now, go down to "Import Raw Data". Click on it, and it will give you a window where you can select the file you want.
There you go! I find that .exe files work well, although .bmp's and .jpgs often produce good results. .pdf's do not work at all, they just produce static. So do .wmvs and .avis.


Honmura-An is the highly regarded Tokyo venture of restaurateur Koichi Kobari and definitely isn't your run-of-the-mill soba noodle bar.
This soba noodle restaurant originally began in Soho, New York where it was regularly voted into the top 10 NY restaurants in the Zagat guide (the only Asian restaurant to make the list). The owner closed the New York outpost and returned to take over his father's restaurant to reinvent his concept in Tokyo. The result is a stark but busy establishment in the middle of Roppongi that buzzes with young and affluent Tokyoites, drawn to the long list of seasonal starters and soba noodles made fresh on-site every day. The pricing is much more reasonable than its New York predecessor and it's two doors up from R2, a lively bar which is an expat institution.


text:
✎ About David Clayton-Thomas
Who is it?: Singer, Record producer, Songwriter, Musician
Birth Day: September 13, 1941
Birth Place: Canada
Birth Sign: Virgo
David Clayton-Thomas Net Worth
David Clayton-Thomas is a Canadian musician, singer, and songwriter who has a net worth of $3 million. David Clayton-Thomas was born in Kingston upon Thames, Surrey, United Kingdom in September 1941. He is best known for being the lead vocalist of the band Blood, Sweat & Tears.
David Clayton-Thomas is a member of Rock Stars
 Net worth: $3 Million (Updated at 10 September 2018)
David Clayton-Thomas net worth: David Clayton-Thomas is a Canadian musician, singer, and songwriter who has a net worth of $3 million. David Clayton-Thomas was born in Kingston upon Thames, Surrey, United Kingdom in September 1941. He is best known for being the lead vocalist of the band Blood, Sweat & Tears. The band formed in 1967 and Clayton-Thomas was the front man and guitarist from 1968 to 1972, 1974 to 1981, and 1984 to 2004. Blood, Sweat & Tears released their debut studio album Child Is Father to the Man in 1968 and their self-titled album was released in 1968 and reached #1 in the US where it was 4x multi-platinum. Their album Blood, Sweat & Tears 3 was released in 1970 and also reached #1 in the US. They released their 11th album in 1980. The band had a #1 hit on the US Adult Contemporary chart with the single "Spinning Wheel" which also reached #2 in the US as did the singles "You've Made Me So Very Happy" and "And When I Die". David Clayton-Thomas has released several solo albums and is a member of the Canadian Music Hall of Fame and Canada's Walk of Fame.
David Clayton-Thomas fans also viewed:
Brian Baker Net Worth
Danny Wright Net Worth
Frank Bello Net Worth
Alvin Lee Net Worth
Mark Slaughter Net Worth
Scott Rockenfield Net Worth
Greg Hawkes Net Worth
Eric Melvin Net Worth
Gary Rossington Net Worth
Bernard Purdie Net Worth


text:
Home Homes & Gardens Volunteer, Donate to Improve Potomac Triangle Parks
Volunteer, Donate to Improve Potomac Triangle Parks
Work With Guerrilla Gardeners, Neighbors to Finish Job on Improved Parks
Elizabeth O'Gorek
Guerrilla Gardeners of Washington DC is teaming up with Brothas Huddle and the residents of Potomac Gardens to landscape two adjacent parcels known as Potomac Triangle Parks, Commissioner Kelly Waud (6B07) announced at the Sept. 8 meeting of Advisory Neighborhood Commission (ANC) 6B —and they're looking for volunteers to help!
"I'm really very excited about this," Waud said. "I can't stop smiling and grinning about this happening."
Guerrilla Gardeners, whose work includes garden beds near Eighth and I Streets SE and near the Marine Barracks has committed to the project for the next five years.
Several years ago, the Potomac Triangle Parks were renovated but the government funding ran out before any landscaping could be done. Provisions for upkeep were also not established, resulting in the current conditions wrought by neglect.
The collaboration aims to change that, hoping to empower the residents of the community to assume collective "ownership" of these spaces in order to improve and maintain them for their own use and benefit through "sweat equity."
Once work is complete, volunteers and the community can celebrate the work when the garden is dedicated in a Garden Day ceremony at 10 a.m. Sept. 27.
You can support and assist this effort with donations and physical labor. Sign up or donate at: https://guerrillagardenersdc.org
Donations are 100 percent tax-deductible and will be used to support these volunteers and their work as well as establish a dedicated fund for continued upkeep and enhancement.
All donations collected through this link will be used for this project only. Reaching the campaign goal will ensure these parks will be maintained and further developed through the end of 2025.
8 a.m. to 11 a.m. Saturday, Sept. 12
Removal of weeds and overgrowth
Rain date: 8 a.m. to 11 a.m. Sunday, Sept. 13
Soil improvement, planting, mulch
10 a.m. Saturday, Sept. 26
Garden Day 2020 Dedication celebration!
Rain date: 10 a.m. Sunday, September 27
You can sign up through the following website: https://guerrillagardenersdc.org. Donate to this project of Guerrilla Gardeners via GoFundMe at gofundme.com/f/guerrilla-gardening-on-barracks-row
Advisory Neighborhood Commission (ANC)
Advisory Neighborhood Commission (ANC) 6B
donate to garden
Guerilla Gardeners
Kelly Waud (6B07)
Potomac Triangle Parks
Previous articleFirst Two Shops Open at The Roost
Next articleUnder the Hill of Clutter?
Renting in The Time of COVID
Capitol Hill Garden Club Spreads Garden Love


Just popping in to share a quick post on how I created these cute and oh so easy Valentine Goody bags. If you are a regular visitor to my blog then you know that my hubby and I don't have kiddos, the people kind nor the animal kind. So, I do my best to do things for my nieces and nephews when the fun holidays come around, aside from the things I create for my hubby.
So, I had these cute little white and kraft sacks that I picked up at my local Hobby Lobby some time ago. And I had been picking up some cute stuff from the $1 bins at Target so that I have items available for times like this or the unexpected gift that might be needed. I simply printed out this printable found HERE or HERE and by choosing to print it 6up on my 8.5x11 paper they were sized perfectly for these bags. A little tip from me to you, I use Matte Photo paper and I tell you, these look like real chalkboards!!! And I love that I can use larger files and simply tell my printer to print them smaller!
I also printed out a sheet of background paper from this kit HERE on 3M Matte Sticker paper from Office Depot to create my own washi tape. Then I cut them like little banners and stuck them on the bags too. I scrunched up a little crepe paper and filled the bags with candy and goodies and presto chango the plain bag became this adorable Valentine Goody bag! This would be a great project for kids to do too!
The photos shown here are from my Instagram feed. If you are on IG do let me know and I can be found @nct621 would love to follow you back.
You are such a good Aunt. Those are adorable bags!
These bags are just too cute!!! I adore the chalkboard art! Best part is...that there's goodies inside too!


text:
Q: find which object is on top while overlapping? i have two objects (2 shape objects/ 1 shape object and 1 text object) which are at the same alignment on the canvas.
i wish to know is there any way to find out which object is on the top from them.
canvas.getObjects();
this will give me the list of all the objects that are on canvas but i want which one is on the top?

A: FabricJS doesn't have an explicit z-index property, akin to CSS z-index. The way things are rendered is: get an array of visible objects and draw them one by one, starting from the first one. The first object ends up underneath all others, while the last one ends up on top.
However, you should keep in mind that with canvas.preserveObjectStacking set to false (also false by default), active objects are always rendered on top, no matter their position in the array.
If you don't care about the active objects, you can simply compare the objects' indices:

const canvas = new fabric.Canvas('c')

const rectR = new fabric.Rect({
  width: 100,
  height: 100,
  fill: 'red'
})

const rectG = new fabric.Rect({
  left: 50,
  top: 50,
  width: 100,
  height: 100,
  fill: 'green'
})
canvas.add(rectR, rectG)
console.log('red rect index:', canvas.getObjects().indexOf(rectR))
console.log('green rect index:', canvas.getObjects().indexOf(rectG))
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.5/fabric.js"></script>
<canvas id="c" width="500" height="400"></canvas>


Armor All Synthetic Lubricant - 4oz.
For more than 50 years Armor All has been making products for those of us who love our cars. It is in this spirit that we bring you Armor All Bike. The Armor All bike product line includes a full range of lubricants, cleaners and grease designed to minimize friction on small moving parts and to optimize performance for today's bicycle components. Armor All Bike Synthetic Lubricant is formulated to work and last under severe riding conditions. The PTFE provides a non-stick coating that keeps all small moving parts rust free and functional.


T.J. Vasher left fans and opponents in awe of his playmaking ability while at Rider. He's doing the same thing at Texas Tech.
T.J Vasher was the prize recruit of Texas Tech's 2016 class. Rated as a four-star receiver coming out of Rider, Vasher routinely left fans and defenders in awe with his spectacular catches on the football field and mind-numbing dunks on the basketball court.
He's doing the same thing on the gridiron at Texas Tech now. Vasher set the standard for college football's best catch of the 2018 season in the first week against Ole Miss. Despite having to fight through some nagging injuries, Vasher has 23 receptions for 362 yards and four touchdowns. He caught five passes for 79 yards and a TD last Saturday against Kansas.
Vasher is one of the best two-sport athletes to ever come out of Wichita Falls. He's the best athlete I've ever covered.
I got a chance to catch up with Vasher after Tech's victory against Kansas. Part of that interview can be seen in the video above. In it, Vasher talks about his recent injury, his chemistry with quarterback Alan Bowman and fellow receiver Antoine Wesley and how much he keeps up with the Rider Raiders.
I also got about four minutes with Vasher for a one-on-one interview. Here's a transcription of how that interview went.
JH: You knew you were going to be counted on to be one of the leading receivers on this team. How did you approach this season?
TJ: With a business mentality. Knowing what we had lost this last year, I just knew I wanted to be that guy in the room, the field, the practice field, anywhere for my teammates, the quarterbacks, the other receivers. I just wanted to be that guy that they all look at.
JH: How tough has it been to have to fight through the injuries and be missing time?
TJ: It's extremely tough. I've never had to be a person who was hurt and had to sit and watch. (Outside receivers coach Emmett Jones) teaches us a lot about mental toughness and having to push through and keep going and look at what's next. I just try to take whatever I can from him and keep moving. I don't try to get too down. I just try to keep moving for what's next.
JH: I always ask you about basketball when I see you. I know probably not too much this time of year, but how much are you getting to hoop here?
TJ: Not too much. I haven't touched a ball in a minute. Around the spring is when we all start going to the rec center, shooting some hoops.
JH: Where do you rank on this team as far as playing basketball?
TJ: No question. Everybody can vouch for it.
JH: Who's your toughest competition on the team?
TJ: Um, I don't know. (Junior receiver Antoine Wesley) is talented at basketball. (Sophomore quarterback Jett Duffey) is not bad.
JH: It seems like you and Antoine (who is 6-foot-5) on the same team wouldn't be very fair.
TJ: Oh yeah, we already have this planned. We're going to do intramurals in the spring. But I can't say anyone in my class is on my level like that. The freshmen have been talking about Xavier Benson. They think he might be a good one.
JH: How much do you miss playing? Do you miss competing on the court at all?
TJ: It crosses my mind sometimes, but I love football. I love the day to day with it, the film study, the people you meet, how you travel, the atmosphere. I love it. I don't think back on it too much. In making the decision, my dad was always like, "Whatever you pick, don't live with any regret. If that's what you want to do, then go for it and do it full tilt." I don't try to look back. Basketball was fun, but I feel like it was just for that moment.
JH: Compare this year's team to past year's. It's been a little bit of a struggle in your past seasons here, but you guys are playing at a higher level. What's it like being a part of this team and being a part of the winning atmosphere now?
TJ: It makes me so happy. You get excited because you were here and was getting recruited when things weren't so great. You heard how much bad people had to say about what was going to happen and how it was all going to go. We've always talked about how it only matters what the people in this room think and do. The people in this locker room and on this team have the mentality that it doesn't matter who says what. I know my talent. I know the talent of the guy next to me. And we're gonna go rock.
Vasher and the Red Raiders are currently 5-2 and looking like a threat in the Big 12. They have a tough matchup against Iowa State on Saturday before hosting Oklahoma and Texas in consecutive weeks. The Tech-Iowa State game will air on ESPN2 at 11 a.m.