rain launches first 5G network in Africa

DURBAN – After the success of its 4G data offerings, rain activated Africa’s first commercial 5G network by making it available to selected existing customers.

This deployment of a 5G wireless data network, in certain parts of Johannesburg and Tshwane, is one of the first in the world and will help South Africa to benefit from lower data costs and the coming Fourth Industrial Revolution (4IR).

Khaya Dlanga, rain’s Chief Marketing Officer, said, "Selected customers in rain’s 5G coverage area have been invited to be the first to purchase ultra-fast 5G, unlimited internet for only R1000 per month. rain will deliver a state-of-the-art 5G router to a customer’s home. No installation is required, the router is simply plug-and-play and it will be connected immediately. The speed and capacity of the 5G network, together with the latest WiFi 6 technology in the router, will enable rain users to stream high-definition video to multiple devices simultaneously".

rain’s initial 5G offering is to provide fast, affordable and easy to install wireless connectivity to homes and businesses as an alternative to ADSL, fibre and fixed-LTE.

In the next couple of weeks the company will open up the offer to all homes and small business within the coverage area of Johannesburg and Tshwane. During the course of 2020, the coverage area will be extended to the major metros in South Africa.

rain is leveraging its 4G data networking infrastructure in building the 5G network in its regulated 3600 MHz spectrum band. This enables rain to build a cost-effective network and limit the required additional number of sites, yet still providing wide coverage. It enables rain to reduce the cost of data for South Africans.

After the success of its 4G data offerings, rain activated Africa’s first commercial 5G network by making it available to selected existing customers. Photo: File

Dlanga said, "Access to affordable, fast broadband is key for the country to revive economic growth."

5G is the next generation wireless networking technology and offers considerable advances in speed and capacity. On average 5G can provide speeds at least 10 times faster than existing 4G/LTE networks. Dlanga notes that during testing rain has seen speeds approaching 700 Mbps in ideal conditions.

"However, in real world conditions we expect to see at least 200 Mbps for customers," said Dlanga.

In future, 5G will also power super-fast mobile connectivity for smartphones and enable the connection of millions of internet-of-things (IOT) devices. Dlanga said that rain is committed to be a key player in building the 5G and 4IR ecosystem in South Africa.

This will contribute to the country meeting its socio-economic challenges, particularly reducing unemployment and improving education. As an example, rainis working with WITS University and Huawei Technologies to establish a 5G Innovation Lab.

"This exciting space will give young engineers a head-start in developing the new, innovative applications of 5G," concluded Dlanga.


                                                      o>ai3/a-oj/az
                                                        T^omMjots

     CouftT «: CfltolKiflLATRaLS         llJfc-fo3,3<g-Oi
                                         (jutt Co3,a/cQ -€£
X"
                                        factor Kb. & ^ M
                                        MiLPnxrAb.%S3>ahR
       CusEJi:

 BgcAu&g XW LOST 7fe ftmwk OMMYe^fjgiyu^Cga^/^-o/
 AMD UytL-(n<9t3itQ~oa soaxj) Vbo Rjq^^JOer fte"fluci^b^ ouBqIh-
     CDF EinTd- f^/ftetn ftS [jl»bl^.

                                               Sf.MfleflSL^
                                               A.

                                               dl/yw^2i

         U
                                               RECHVED1N
 ggfafr
 Lpo^^y; /x- 7.sgsv                                 ^Jt-O^fr

                                               Abe^Acoste,


Burgeoning Regulations Threaten Our Humanity

By Robert Higgs Insofar as mainstream economics may be said to make moral-philosophical assumptions, it rests overwhelmingly on a consequentialist-utilitarian foundation. When mainstream economists say that an action is worthwhile, they mean that it is expected to give rise to benefits whose total value exceeds its total cost (that is, the most valued benefit necessarily forgone by virtue of this particular action's being taken). But nearly always the economists make no attempt to evaluate as part of their benefit-cost calculus any costs that might be incurred as a result of how and by whom the action is taken.

Often they verge on the assumption that benefits and costs exist apart from those who take the action, even though this assumption clashes with the foundational principles of their science. Thus, in benefit-cost calculations, economists often attach a value to certain expected benefits (e.g., the dollar value of lives saved as a result of a safety regulation) and compare this value to the dollar outlays by the government that imposes and enforces the regulation and by the private parties who are compelled to comply with it, often at great private expense.

I cannot recall, however, ever seeing a benefit-cost computation that attaches any cost valuation to the loss of freedom by the regulated parties. It is as if it matters not at all that an action is mandated, as opposed to freely chosen. Freedom itself is, in effect, considered worthless, and hence its loss entails no sacrifice regarded as worthy of receiving weight in the calculation.

On the basis of such procedures, at least in a pro forma sense, countless regulations and laws have been imposed on the public willy-nilly. Apart from the many questions that might be raised even in the context of the usual benefit-cost study, one who values freedom cannot help but be struck by how entire societies have been overwhelmed by suffocating regulations and by how drastically people's freedoms have been curtailed, all under the presumption that each drop of this deluge constituted a net improvement in social well-being. Insofar as the trampled freedom is concerned, the motto seems to have been: nothing valued, nothing lost.

In a more fundamental sense, the essence of such mainstream benefit-cost calculations boils down to a glorification of the material and the measurable and a complete denial of the spiritual. With such a mentality, rulers justify making each of us a puppet at the end of the strings they pull and jerk. That we value above all the capacity to make our own decisions, to shape—insofar as the laws of nature and economics permit—the contours of our own lives matters not a whit to our rulers and their apparatchiki. They know what is best for us to do and to refrain from doing—indeed, they have the numerical studies to prove that they know best!

Freedom, however, needs no benefit-cost justification. To deprive us of it is to deprive us of a priceless part of what makes us human beings, rather than programmed robots or puppets on strings. For too long people have deferred to the imagined expertise and superior judgment of those who presume to rule them even in the tiniest details of their daily lives. Little by little, as mentalities adjust to such continuously growing controls, people are losing not only latitude for self-direction, but a core part of their very humanity.

In the most economically developed parts of the world, this process has already proceeded so far that one wonders whether the Communists' vision of creating a New Man was so far-fetched after all. For the sake of our humanity, for the sake of our very souls, we must challenge the continuation of this onslaught. No doubt you and I may sometimes decide badly in one way or another, but unless we have the freedom to make decisions for ourselves—and, as the necessary correlate, the obligation to bear full responsibility for any harm we cause in the process—we shall ultimately find ourselves in that horrifying dystopia where everything that is not required is forbidden and where we are no longer truly human at all.

This site contains copyrighted material the use of which in some cases has not been specifically authorized by the copyright owner. Such material is made available for the purposes of news reporting, education, research, comment, and criticism, which constitutes a 'fair use' of such copyrighted material in accordance with Title 17 U.S.C. Section 107. If you wish to use copyrighted material from this site for purposes of your own that go beyond 'fair use', you must obtain permission from the copyright owner. It is our policy to respond to notices of alleged infringement that comply with the DMCA and other applicable intellectual property laws. It is our policy to remove material from public view that we believe in good faith to be copyrighted material that has been illegally copied and distributed by any of our members or users.


/* Copyright 2016 Kjetil S. Matheussen

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */

#include "nsmtracker.h"
#include "hashmap_proc.h"
#include "sequencer_proc.h"
#include "../Qt/Qt_mix_colors.h"
#include "../Qt/Qt_colors_proc.h"
#include "SeqAutomation.hpp"
#include "../audio/Mixer_proc.h"

#include "song_tempo_automation_proc.h"

#include <QPainter>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
#include <QVector> // Shortening warning in the QVector header. Temporarily turned off by the surrounding pragmas.
#pragma clang diagnostic pop

// The sequencer tempo automation. It maps between abstime and absabstime.
//

namespace{

struct TempoAutomationNode{
  double time; // abstime format
  double value;
  int logtype;
};

}

static double g_max_tempo = 4.0;

static radium::SeqAutomation<TempoAutomationNode> g_tempo_automation;

static TempoAutomationNode create_node(double abstime, double value, int logtype){
  TempoAutomationNode node = {.time = abstime,
                              .value = value,
                              .logtype = logtype};

  return node;
}

static float get_node_y(const TempoAutomationNode *node, float y1, float y2){
  float mid = (y1+y2)/2.0f;

  if (node->value >= 1.0)
    return scale(node->value,
                 g_max_tempo, 1.0,
                 y1, mid);
  else
    return scale(node->value,
                 1.0, 1.0/g_max_tempo,
                 mid, y2);
}

/*
faust code for "get_optimized_custom_value":
"""
g_max_tempo = hslider("max_tempo", 4.0, 0.001, 10000, 0.001);

scale(x,x1,x2,y1,y2) = y1 + ( ((x-x1)*(y2-y1)) / (x2-x1));

get_node_y(value, y1, y2) = ret with {
    mid = (y1+y2)/2.0f;

    larger = scale(value,
                   g_max_tempo, 1.0,
                   y1, mid);
    smaller = scale(value,
                    1.0, 1.0/g_max_tempo,
                    mid, y2);

    ret = select2(value>=1,smaller, larger);
};

process(abstime, abstime1, abstime2, value1, value2) = ret with{
    y1 = get_node_y(value1, 0, 2);
    y2 = get_node_y(value2, 0, 2);
    midtime = scale(1, y1, y2, abstime1, abstime2);
    smaller = scale(abstime, abstime1, midtime, value1, 1.0);
    larger = scale(abstime, midtime, abstime2, 1.0, value2);
    ret = select2(abstime<=midtime, larger, smaller);
};
"""
 */
static double get_optimized_custom_value(double input0, double input1, double input2, double input3, double input4){
  double fHslider0 = g_max_tempo;
		double fSlow0 = double(fHslider0);
		double fSlow1 = (1.0 / ((1.0 / fSlow0) - 1.0));
		double fSlow2 = (1.0 / (1.0 - fSlow0));
                //		for (int i = 0; (i < count); i = (i + 1)) {
			double fTemp0 = double(input0);
			double fTemp1 = double(input3);
			double fSel0 = 0.0;
			if ((fTemp1 >= 1.0) != 0) {
				fSel0 = (fSlow2 * (fTemp1 - fSlow0));

			} else {
				fSel0 = (1.0 + (fSlow1 * (fTemp1 - 1.0)));

			}
			double fTemp2 = double(input2);
			double fTemp3 = double(input1);
			double fTemp4 = ((1.0 - fSel0) * (fTemp2 - fTemp3));
			double fTemp5 = double(input4);
			double fTemp6 = (fTemp5 - 1.0);
			double fSel1 = 0.0;
			if ((fTemp5 >= 1.0) != 0) {
				fSel1 = (fSlow2 * (fTemp5 - fSlow0));

			} else {
				fSel1 = (1.0 + (fSlow1 * fTemp6));

			}
			double fTemp7 = (fSel1 - fSel0);
			double fTemp8 = ((fTemp4 / fTemp7) + fTemp3);
			double fSel2 = 0.0;
			if ((fTemp0 <= fTemp8) != 0) {
				fSel2 = ((((fTemp7 * (1.0 - fTemp1)) * (fTemp0 - fTemp3)) / fTemp4) + fTemp1);

			} else {
				fSel2 = (1.0 + (((0.0 - (fTemp8 - fTemp0)) * fTemp6) / (0.0 - (fTemp8 - fTemp2))));

			}
			double output0 = fSel2;

                        //		}

                        return output0;

}

static double get_custom_value(double abstime, const TempoAutomationNode *node1, const TempoAutomationNode *node2){
  const double abstime1 = node1->time;
  const double abstime2 = node2->time;

  const double value1 = node1->value;
  const double value2 = node2->value;

  if (value1<=1.0 && value2<=1.0)
    return scale_double(abstime, abstime1, abstime2, value1, value2);

  if (value1>=1.0 && value2>=1.0)
    return scale_double(abstime, abstime1, abstime2, value1, value2);

#if 1
  return get_optimized_custom_value(abstime, abstime1, abstime2, value1, value2);
#else
  const float y1 = get_node_y(*node1, 0, 2);
  const float y2 = get_node_y(*node2, 0, 2);
  const double midtime = scale_double(1, y1, y2, abstime1, abstime2);

  if (abstime <= midtime)
    return scale_double(abstime, abstime1, midtime, value1, 1.0);
  else
    return scale_double(abstime, midtime, abstime2, 1.0, value2);
#endif
}

// Called from MIXER.cpp in the player thread.
double RT_TEMPOAUTOMATION_get_value(double abstime){
  radium::SeqAutomation<TempoAutomationNode>::ScopedRtAccess rt_access(g_tempo_automation);

  g_tempo_automation.RT_get_nodes(abstime, rt_access);

  if(rt_access.node1 != NULL && rt_access.node2 != NULL)
    return get_custom_value(abstime, rt_access.node1, rt_access.node2);

  return 1.0;
}

double TEMPOAUTOMATION_get_value(int nodenum){
  R_ASSERT_RETURN_IF_FALSE2(nodenum>=0, 1.0);
  R_ASSERT_RETURN_IF_FALSE2(nodenum<g_tempo_automation.size(), 1.0);

  return g_tempo_automation.at(nodenum).value;
}

double TEMPOAUTOMATION_get_abstime(int nodenum){
  R_ASSERT_RETURN_IF_FALSE2(nodenum>=0, 0);
  R_ASSERT_RETURN_IF_FALSE2(nodenum<g_tempo_automation.size(), 0);

  return g_tempo_automation.at(nodenum).time;
}

int TEMPOAUTOMATION_get_logtype(int nodenum){
  R_ASSERT_RETURN_IF_FALSE2(nodenum>=0, LOGTYPE_LINEAR);
  R_ASSERT_RETURN_IF_FALSE2(nodenum<g_tempo_automation.size(), LOGTYPE_LINEAR);

  return g_tempo_automation.at(nodenum).logtype;
}

int TEMPOAUTOMATION_get_num_nodes(void){
  return g_tempo_automation.size();
}

int TEMPOAUTOMATION_add_node(double abstime, double value, int logtype){
  if (abstime < 0)
    abstime = 0;

  int ret = g_tempo_automation.add_node(create_node(abstime, value, logtype));

  SEQUENCER_update(SEQUPDATE_SONGTEMPO);

  return ret;
}

void TEMPOAUTOMATION_delete_node(int nodenum){
  R_ASSERT_RETURN_IF_FALSE(nodenum >= 0);
  R_ASSERT_RETURN_IF_FALSE(nodenum < g_tempo_automation.size());

  if (nodenum==0 || nodenum==g_tempo_automation.size()-1) {

    TempoAutomationNode node = g_tempo_automation.at(nodenum);
    node.value = 1.0;
    g_tempo_automation.replace_node(nodenum, node);

  } else {

    g_tempo_automation.delete_node(nodenum);

  }

  SEQUENCER_update(SEQUPDATE_SONGTEMPO);
}

void TEMPOAUTOMATION_set_curr_node(int nodenum){
  if (g_tempo_automation.get_curr_nodenum() != nodenum){
    g_tempo_automation.set_curr_nodenum(nodenum);
    SEQUENCER_update(SEQUPDATE_SONGTEMPO);
  }
}

void TEMPOAUTOMATION_set(int nodenum, double abstime, double value, int logtype){
  int size = g_tempo_automation.size();

  R_ASSERT_RETURN_IF_FALSE(nodenum >= 0);
  R_ASSERT_RETURN_IF_FALSE(nodenum < size);

  const TempoAutomationNode *prev = nodenum==0 ? NULL : &g_tempo_automation.at(nodenum-1);
  TempoAutomationNode node = g_tempo_automation.at(nodenum);
  const TempoAutomationNode *next = nodenum==size-1 ? NULL : &g_tempo_automation.at(nodenum+1);

  double mintime = prev==NULL ? 0 : next==NULL ? R_MAX(R_MAX(node.time, abstime), SONG_get_length()*MIXER_get_sample_rate()) : prev->time;
  double maxtime = (prev==NULL || next==NULL) ? mintime : next->time;

  abstime = R_BOUNDARIES(mintime, abstime, maxtime);

  value = R_BOUNDARIES(1.0/g_max_tempo, value, g_max_tempo);

  node.time = abstime;
  node.value = value;
  node.logtype = logtype;

  g_tempo_automation.replace_node(nodenum, node);

  SEQUENCER_update(SEQUPDATE_SONGTEMPO);
}

// Does nothing if end_time < length and do_shrink==false.
// Don't shrinks below second last node. (i.e. we don't change a manually created node)
//
void TEMPOAUTOMATION_set_length(double end_time, bool do_shrink){

  R_ASSERT_RETURN_IF_FALSE(end_time >= 0);

  int size = g_tempo_automation.size();
  R_ASSERT_RETURN_IF_FALSE(size != 1);

  if (size==0){

    g_tempo_automation.add_node(create_node(0,        1, LOGTYPE_LINEAR));
    g_tempo_automation.add_node(create_node(end_time, 1, LOGTYPE_LINEAR));

  } else {

    const auto &second_last = g_tempo_automation.at(size-2);
    auto last = g_tempo_automation.last();

    if (end_time <= last.time && do_shrink==false)
      return;

    if (end_time <= second_last.time)
      return;

    if (equal_doubles(last.value, 1.0) && equal_doubles(second_last.value, 1.0)){
      last.time = end_time;
      g_tempo_automation.replace_node(size-1, last);
    } else {
      g_tempo_automation.add_node(create_node(end_time,1,LOGTYPE_LINEAR));
    }

  }

  SEQUENCER_update(SEQUPDATE_SONGTEMPO);
}

double TEMPOAUTOMATION_get_length(void){
  if (g_tempo_automation.size()==0)
    return 1.0;

  return g_tempo_automation.last().time;
}

void TEMPOAUTOMATION_reset(void){
  g_tempo_automation.reset();
  g_tempo_automation.set_do_paint_nodes(true);
  SEQTEMPO_set_visible(false);
  //TEMPOAUTOMATION_set_length(SONG_get_length(), true);
}

static bool absabstime_scales_linearly_with_abstime(double time){ // time can be either abstime or absabstime.
  if (time < 0.00001)
    return true;

  int size = g_tempo_automation.size();

  if (size < 2)
    return true;

  const TempoAutomationNode &node1 = g_tempo_automation.at(0);
  const TempoAutomationNode &node2 = g_tempo_automation.at(1);

  double val1 = node1.value;
  double val2 = node2.value;

  if (time <= node2.time && fabs(val1-1.0)<0.000001 && (node1.logtype==LOGTYPE_HOLD || fabs(val2-1.0)<0.000001))
    return true;

  return false;
}

// A little bit tricky to calculate this more efficiently when we want a very accurate value. Fortunately, the song needs to be several hours long before noticing that it's slow.
static int64_t get_absabstime_from_abstime(double goal){

  int64_t absabstime = 0;
  double abstime = 0.0;

  int size = g_tempo_automation.size();

  const TempoAutomationNode *node1 = &g_tempo_automation.at(0);
  const TempoAutomationNode *node2 = &g_tempo_automation.at(1);
  int i = 1;
  //fprintf(stderr,"************** time node2: %f\n", node2->time / 44100.0);

  while(true){
    if (abstime >= goal)
      return absabstime;

    double tempo;

    if (i==size) {
      tempo = 1.0;
    } else {
      if (!g_tempo_automation.get_value(abstime, node1, node2, tempo, get_custom_value)){
        i++;
        if (i<size){
          node1 = node2;
          node2 = &g_tempo_automation.at(i);
        }
        continue;
      }
    }

    abstime += (double)RADIUM_BLOCKSIZE * tempo;
    absabstime += RADIUM_BLOCKSIZE;
  }
}

int64_t TEMPOAUTOMATION_get_absabstime(double goal){

#if !defined(RELEASE)
  printf(".......... Note: TEMPOAUTOMATION_get_absabstime(%f) called.\n", goal);
#endif

  if(absabstime_scales_linearly_with_abstime(goal))
    return goal;

  return get_absabstime_from_abstime(goal);
}

// Based on pseudocode for the function BinarySearch_Left found at https://rosettacode.org/wiki/Binary_search
static double BinarySearch_abstime(int64_t absabstime, double low, double high) {

  double mid = (low + high) / 2.0;

  if (fabs(low-high) <= 1.0)
    return mid;

  int64_t try_ = get_absabstime_from_abstime(mid);

  //printf("Goal: %d. Try: %d, low: %f, mid: %f, high: %f\n", (int)absabstime, (int)try_, low, mid, high);

  if (try_==absabstime)
    return mid;

  if (try_ > absabstime)
    return BinarySearch_abstime(absabstime, low, mid);
  else
    return BinarySearch_abstime(absabstime, mid, high);
}

// This function could spend a lot of time.
double TEMPOAUTOMATION_get_abstime_from_absabstime(int64_t absabstime){

#if !defined(RELEASE)
  printf(".......... Note: TEMPOAUTOMATION_get_abstime_from_absabstime(%d) called.\n", (int)absabstime);
#endif

  if(absabstime_scales_linearly_with_abstime(absabstime))
    return absabstime;

  double low = 0.0;
  double high = SONG_get_length() * MIXER_get_sample_rate();

  int64_t high_absabs = get_absabstime_from_abstime(high);
  if (absabstime >= high_absabs){
    //printf("  PAST end. absabs: %f, high_absabs: %f. Song len: %f\n", (double)absabstime/44100.0, (double)high_absabs/44100.0, high);
    return high + (absabstime-high_absabs);
  }

  return BinarySearch_abstime(absabstime, low, high);
}

static TempoAutomationNode create_node_from_state(hash_t *state, double state_samplerate){
  double time = HASH_get_float(state, "abstime");
  return create_node(state_samplerate < 0 ? time : time*(double)pc->pfreq/state_samplerate,
                     HASH_get_float(state, "value"),
                     HASH_get_int32(state, "logtype"));
}

void TEMPOAUTOMATION_create_from_state(hash_t *state, double state_samplerate){
  g_max_tempo = HASH_get_float(state, "max_tempo");
  g_tempo_automation.create_from_state(HASH_get_dyn(state, "nodes"), create_node_from_state, state_samplerate);
  SEQTEMPO_set_visible(HASH_get_bool(state, "is_visible"));
  SEQUENCER_update(SEQUPDATE_SONGTEMPO);
}

static hash_t *get_node_state(const TempoAutomationNode &node, void*){
  hash_t *state = HASH_create(5);

  HASH_put_float(state, "abstime", node.time);
  HASH_put_float(state, "value", node.value);
  HASH_put_int(state, "logtype", node.logtype);

  return state;
}

hash_t *TEMPOAUTOMATION_get_state(void){
  hash_t *state = HASH_create(2);

  HASH_put_array(state, "nodes", g_tempo_automation.get_state(get_node_state, NULL));
  HASH_put_bool(state, "is_visible", SEQTEMPO_is_visible());
  HASH_put_float(state, "max_tempo", g_max_tempo);

  return state;
}

double TEMPOAUTOMATION_get_max_tempo(void){
  return g_max_tempo;
}

void TEMPOAUTOMATION_set_max_tempo(double new_max_tempo){
  if (new_max_tempo < 1.0001)
    g_max_tempo = 1.0001;
  else
    g_max_tempo = new_max_tempo;

  SEQUENCER_update(SEQUPDATE_SONGTEMPO);
}

float TEMPOAUTOMATION_get_node_x(int nodenum){
  int64_t start_time = SEQUENCER_get_visible_start_time();
  int64_t end_time = SEQUENCER_get_visible_end_time();

  float x1 = SEQTEMPO_get_x1();
  float x2 = SEQTEMPO_get_x2();

  const TempoAutomationNode &node1 = g_tempo_automation.at(nodenum);

  return scale(node1.time, start_time, end_time, x1, x2);
}

static float get_node_y(const TempoAutomationNode &node, float y1, float y2, void *data){
  return get_node_y(&node, y1, y2);
}

float TEMPOAUTOMATION_get_node_y(int nodenum){
  float y1 = SEQTEMPO_get_y1();
  float y2 = SEQTEMPO_get_y2();

  const TempoAutomationNode &node1 = g_tempo_automation.at(nodenum);

  return get_node_y(node1, y1, y2, NULL);
}

void TEMPOAUTOMATION_paint(QPainter *p, float x1, float y1, float x2, float y2, double start_time, double end_time){

  TEMPOAUTOMATION_set_length(end_time, false);

  g_tempo_automation.paint(p, x1, y1, x2, y2, start_time, end_time, get_qcolor(SEQUENCER_TEMPO_AUTOMATION_COLOR_NUM), get_node_y);
}


//
//  KSCrashSentry_CPPException.c
//
//  Copyright (c) 2012 Karl Stenerud. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall remain in place
// in this source code.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//

#import <Foundation/Foundation.h>

#include "KSCrashSentry_CPPException.h"
#include "KSCrashSentry_Private.h"
#include "KSMach.h"

//#define KSLogger_LocalLevel TRACE
#include "KSLogger.h"

#include <cxxabi.h>
#include <dlfcn.h>
#include <exception>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <typeinfo>

#define STACKTRACE_BUFFER_LENGTH 30
#define DESCRIPTION_BUFFER_LENGTH 1000

// Compiler hints for "if" statements
#define likely_if(x) if(__builtin_expect(x,1))
#define unlikely_if(x) if(__builtin_expect(x,0))

// ============================================================================
#pragma mark - Globals -
// ============================================================================

/** True if this handler has been installed. */
static volatile sig_atomic_t g_installed = 0;

/** True if the handler should capture the next stack trace. */
static bool g_captureNextStackTrace = false;

static std::terminate_handler g_originalTerminateHandler;

/** Buffer for the backtrace of the most recent exception. */
static uintptr_t g_stackTrace[STACKTRACE_BUFFER_LENGTH];

/** Number of backtrace entries in the most recent exception. */
static int g_stackTraceCount = 0;

/** Context to fill with crash information. */
static KSCrash_SentryContext* g_context;

// ============================================================================
#pragma mark - Callbacks -
// ============================================================================

typedef void (*cxa_throw_type)(void*, std::type_info*, void (*)(void*));

extern "C"
{
    void __cxa_throw(void* thrown_exception, std::type_info* tinfo, void (*dest)(void*)) __attribute__ ((weak));

    void __cxa_throw(void* thrown_exception, std::type_info* tinfo, void (*dest)(void*))
    {
        if(g_captureNextStackTrace)
        {
            g_stackTraceCount = backtrace((void**)g_stackTrace, sizeof(g_stackTrace) / sizeof(*g_stackTrace));
        }

        static cxa_throw_type orig_cxa_throw = NULL;
        unlikely_if(orig_cxa_throw == NULL)
        {
            orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw");
        }
        orig_cxa_throw(thrown_exception, tinfo, dest);
        __builtin_unreachable();
    }
}

static void CPPExceptionTerminate(void)
{
    KSLOG_DEBUG(@"Trapped c++ exception");

    bool isNSException = false;
    char descriptionBuff[DESCRIPTION_BUFFER_LENGTH];
    const char* name = NULL;
    const char* description = NULL;

    KSLOG_DEBUG(@"Get exception type name.");
    std::type_info* tinfo = __cxxabiv1::__cxa_current_exception_type();
    if(tinfo != NULL)
    {
        name = tinfo->name();
    }

    description = descriptionBuff;
    descriptionBuff[0] = 0;

    KSLOG_DEBUG(@"Discovering what kind of exception was thrown.");
    g_captureNextStackTrace = false;
    try
    {
        throw;
    }
    catch(NSException* exception)
    {
        KSLOG_DEBUG(@"Detected NSException. Letting the current NSException handler deal with it.");
        isNSException = true;
    }
    catch(std::exception& exc)
    {
        strncpy(descriptionBuff, exc.what(), sizeof(descriptionBuff));
    }
#define CATCH_VALUE(TYPE, PRINTFTYPE) \
catch(TYPE value)\
{ \
    snprintf(descriptionBuff, sizeof(descriptionBuff), "%" #PRINTFTYPE, value); \
}
    CATCH_VALUE(char,                 d)
    CATCH_VALUE(short,                d)
    CATCH_VALUE(int,                  d)
    CATCH_VALUE(long,                ld)
    CATCH_VALUE(long long,          lld)
    CATCH_VALUE(unsigned char,        u)
    CATCH_VALUE(unsigned short,       u)
    CATCH_VALUE(unsigned int,         u)
    CATCH_VALUE(unsigned long,       lu)
    CATCH_VALUE(unsigned long long, llu)
    CATCH_VALUE(float,                f)
    CATCH_VALUE(double,               f)
    CATCH_VALUE(long double,         Lf)
    CATCH_VALUE(char*,                s)
    catch(...)
    {
        description = NULL;
    }
    g_captureNextStackTrace = (g_installed != 0);

    if(!isNSException)
    {
        bool wasHandlingCrash = g_context->handlingCrash;
        kscrashsentry_beginHandlingCrash(g_context);

        if(wasHandlingCrash)
        {
            KSLOG_INFO(@"Detected crash in the crash reporter. Restoring original handlers.");
            g_context->crashedDuringCrashHandling = true;
            kscrashsentry_uninstall((KSCrashType)KSCrashTypeAll);
        }

        KSLOG_DEBUG(@"Suspending all threads.");
        kscrashsentry_suspendThreads();

        g_context->crashType = KSCrashTypeCPPException;
        g_context->offendingThread = ksmach_thread_self();
        g_context->registersAreValid = false;
        g_context->stackTrace = g_stackTrace + 1; // Don't record __cxa_throw stack entry
        g_context->stackTraceLength = g_stackTraceCount - 1;
        g_context->CPPException.name = name;
        g_context->crashReason = description;

        KSLOG_DEBUG(@"Calling main crash handler.");
        g_context->onCrash();

        KSLOG_DEBUG(@"Crash handling complete. Restoring original handlers.");
        kscrashsentry_uninstall((KSCrashType)KSCrashTypeAll);
        kscrashsentry_resumeThreads();
    }

    g_originalTerminateHandler();
}

// ============================================================================
#pragma mark - Public API -
// ============================================================================

extern "C" bool kscrashsentry_installCPPExceptionHandler(KSCrash_SentryContext* context)
{
    KSLOG_DEBUG(@"Installing C++ exception handler.");

    if(g_installed)
    {
        KSLOG_DEBUG(@"C++ exception handler already installed.");
        return true;
    }
    g_installed = 1;

    g_context = context;

    g_originalTerminateHandler = std::set_terminate(CPPExceptionTerminate);
    g_captureNextStackTrace = true;
    return true;
}

extern "C" void kscrashsentry_uninstallCPPExceptionHandler(void)
{
    KSLOG_DEBUG(@"Uninstalling C++ exception handler.");
    if(!g_installed)
    {
        KSLOG_DEBUG(@"C++ exception handler already uninstalled.");
        return;
    }

    g_captureNextStackTrace = false;
    std::set_terminate(g_originalTerminateHandler);
    g_installed = 0;
}


Search form

News

Agriculture

The Ontario government has announced a program to help beekeepers rebuild their colonies, as a means to maintain the essential role honeybees play in the pollination of agricultural crops.

Harsh winter conditions and ongoing health threats, such as from varroa mites or other pests, have knocked back bee populations. The province is anticipating higher than average mortality rates, and, to help offset these losses, the province is providing a one-time payment of $105/hive to beekeepers who have 10 hives or more and lose over 40% of their colonies by October 31, 2014 (from January 1). Full article at: http://www.realagriculture.com/2014/05/ontario-government-announces-fund...


/* Copyright 2016 The TensorFlow Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/

export interface BoundingBox {
  loX: number;
  loY: number;
  hiX: number;
  hiY: number;
}

/**
 * Accelerates label placement by dividing the view into a uniform grid.
 * Labels only need to be tested for collision with other labels that overlap
 * the same grid cells. This is a fork of {@code amoeba.CollisionGrid}.
 */
export class CollisionGrid {
  private numHorizCells: number;
  private numVertCells: number;
  private grid: BoundingBox[][];
  private bound: BoundingBox;
  private cellWidth: number;
  private cellHeight: number;

  /**
   * Constructs a new Collision grid.
   *
   * @param bound The bound of the grid. Labels out of bounds will be rejected.
   * @param cellWidth Width of a cell in the grid.
   * @param cellHeight Height of a cell in the grid.
   */
  constructor(bound: BoundingBox, cellWidth: number, cellHeight: number) {
    /** The bound of the grid. Labels out of bounds will be rejected. */
    this.bound = bound;

    /** Width of a cell in the grid. */
    this.cellWidth = cellWidth;

    /** Height of a cell in the grid. */
    this.cellHeight = cellHeight;

    /** Number of grid cells along the x axis. */
    this.numHorizCells = Math.ceil(this.boundWidth(bound) / cellWidth);

    /** Number of grid cells along the y axis. */
    this.numVertCells = Math.ceil(this.boundHeight(bound) / cellHeight);

    /**
     * The 2d grid (stored as a 1d array.) Each cell consists of an array of
     * BoundingBoxes for objects that are in the cell.
     */
    this.grid = new Array(this.numHorizCells * this.numVertCells);
  }

  private boundWidth(bound: BoundingBox) { return bound.hiX - bound.loX; }

  private boundHeight(bound: BoundingBox) { return bound.hiY - bound.loY; }

  private boundsIntersect(a: BoundingBox, b: BoundingBox) {
    return !(a.loX > b.hiX || a.loY > b.hiY || a.hiX < b.loX || a.hiY < b.loY);
  }

  /**
   * Checks if a given bounding box has any conflicts in the grid and inserts it
   * if none are found.
   *
   * @param bound The bound to insert.
   * @param justTest If true, just test if it conflicts, without inserting.
   * @return True if the bound was successfully inserted; false if it
   *         could not be inserted due to a conflict.
   */
  insert(bound: BoundingBox, justTest = false): boolean {
    // Reject if the label is out of bounds.
    if ((bound.hiX < this.bound.loX) || (bound.loX > this.bound.hiX) ||
        (bound.hiY < this.bound.loY) || (bound.loY > this.bound.hiY)) {
      return false;
    }

    let minCellX = this.getCellX(bound.loX);
    let maxCellX = this.getCellX(bound.hiX);
    let minCellY = this.getCellY(bound.loY);
    let maxCellY = this.getCellY(bound.hiY);

    // Check all overlapped cells to verify that we can insert.
    let baseIdx = minCellY * this.numHorizCells + minCellX;
    let idx = baseIdx;
    for (let j = minCellY; j <= maxCellY; j++) {
      for (let i = minCellX; i <= maxCellX; i++) {
        let cell = this.grid[idx++];
        if (cell) {
          for (let k = 0; k < cell.length; k++) {
            if (this.boundsIntersect(bound, cell[k])) {
              return false;
            }
          }
        }
      }
      idx += this.numHorizCells - (maxCellX - minCellX + 1);
    }

    if (justTest) {
      return true;
    }

    // Insert into the overlapped cells.
    idx = baseIdx;
    for (let j = minCellY; j <= maxCellY; j++) {
      for (let i = minCellX; i <= maxCellX; i++) {
        if (!this.grid[idx]) {
          this.grid[idx] = [bound];
        } else {
          this.grid[idx].push(bound);
        }
        idx++;
      }
      idx += this.numHorizCells - (maxCellX - minCellX + 1);
    }
    return true;
  }

  /**
   * Returns the x index of the grid cell where the given x coordinate falls.
   *
   * @param x the coordinate, in world space.
   * @return the x index of the cell.
   */
  private getCellX(x: number) {
    return Math.floor((x - this.bound.loX) / this.cellWidth);
  };

  /**
   * Returns the y index of the grid cell where the given y coordinate falls.
   *
   * @param y the coordinate, in world space.
   * @return the y index of the cell.
   */
  private getCellY(y: number) {
    return Math.floor((y - this.bound.loY) / this.cellHeight);
  };
}


Q:

How to convert time format?

My Windows date format is Month/Date/Year. If I want set StartTime with format "yyyy/MM/dd HH:mm:ss", How can I do that. I try the following code.
DateTime StartTime = DateTime.ParseExact("2011/01/04 09:30:00", "yyyy/MM/dd HH:mm:ss", null);

But StartTime come out with 1/4/2011  9:30:00 AM.
                          (month/date/year hh:mm:ss)

A:

You're parsing the time correctly, but displaying it with the default format.  Try StartTime.ToString("yyyy/MM/dd HH:mm:ss")

A:

This code works correctly, and you have a strong-typed DateTime object now.
If you wish to then output it in the format you have above, then you call ToString() with the format in your second argument.

A:

It is using your format to parse the date correctly, but it is displaying it by default.  To display it in the format you created it in you will either need to use String.Format or you can even use 'ToString()' with a pattern.


Angioedema and Hemorrhage After 4.5-Hour tPA (Tissue-Type Plasminogen Activator) Thrombolysis Ameliorated by T541 via Restoring Brain Microvascular Integrity.
Background and Purpose- tPA (tissue-type plasminogen activator) is the only recommended intravenous thrombolytic agent for ischemic stroke. However, its application is limited because of increased risk of hemorrhagic transformation beyond the time window. T541 is a Chinese compound medicine with potential to attenuate ischemia and reperfusion injury. This study was to explore whether T541-benefited subjects underwent tPA thrombolysis extending the time window. Methods- Male C57BL/6 N mice were subjected to carotid artery thrombosis by stimulation with 10% FeCl3 followed by 10 mg/kg tPA with/without 20 mg/kg T541 intervention at 4.5 hours. Thrombolysis and cerebral blood flow were observed dynamically until 24 hours after drug treatment. Neurological deficit scores, brain edema and hemorrhage, cerebral microvascular junctions and basement membrane proteins, and energy metabolism in cortex were assessed then. An in vitro hypoxia/reoxygenation model using human cerebral microvascular endothelial cells was used to evaluate effect of T541 on tight junctions and F-actin in the presence of tPA. Results- tPA administered at 4.5 hours after carotid thrombosis resulted in a decrease in thrombus area and survival rate, whereas no benefit on cerebral blood flow. Study at 24 hours after tPA administration revealed a significant angioedema and hemorrhage in the ischemia hemisphere, a decreased expression of junction proteins claudin-5, zonula occludens-1, occludin, junctional adhesion molecule-1 and vascular endothelial cadherin, and collagen IV and laminin. Meanwhile, ADP/ATP, AMP/ATP, and ATP5D (ATP synthase subunit) expression and activities of mitochondria complex I, II, and IV declined, whereas malondialdehyde and 8-Oxo-2'-deoxyguanosine increased and F-actin arrangement disordered. All the insults after tPA treatment were attenuated by addition of T541 dose dependently. Conclusions- The results suggest T541 as a potential remedy to attenuate delayed tPA-related angioedema and hemorrhage and extend time window for tPA treatment. The potential of T541 to upregulate energy metabolism and protect blood-brain barrier is likely attributable to its effects observed.


namespace UnityEngine.Rendering.HighDefinition
{
    [GenerateHLSL(needAccessors = false, omitStructDeclaration = true)]
    unsafe struct ShaderVariablesLightLoop
    {
        public const int s_MaxEnv2DLight = 32;

        [HLSLArray(0, typeof(Vector4))]
        public fixed float _ShadowAtlasSize[4];
        [HLSLArray(0, typeof(Vector4))]
        public fixed float _CascadeShadowAtlasSize[4];
        [HLSLArray(0, typeof(Vector4))]
        public fixed float _AreaShadowAtlasSize[4];

        [HLSLArray(s_MaxEnv2DLight, typeof(Matrix4x4))]
        public fixed float _Env2DCaptureVP[s_MaxEnv2DLight * 4 * 4];
        [HLSLArray(s_MaxEnv2DLight * 3, typeof(float))]
        public fixed float _Env2DCaptureForward[s_MaxEnv2DLight * 3];
        [HLSLArray(s_MaxEnv2DLight, typeof(Vector4))]
        public fixed float _Env2DAtlasScaleOffset[s_MaxEnv2DLight * 3];

        public uint _DirectionalLightCount;

        public uint _PunctualLightCount;
        public uint _AreaLightCount;
        public uint _EnvLightCount;
        public uint _EnvProxyCount;
        public int  _EnvLightSkyEnabled;         // TODO: make it a bool
        public int _DirectionalShadowIndex;

        public Vector4 _CookieAtlasSize;
        public Vector4 _CookieAtlasData;

        public Vector4 _PlanarAtlasData;

        public float _MicroShadowOpacity;

        public float _DirectionalTransmissionMultiplier;

        public uint _NumTileFtplX;
        public  uint _NumTileFtplY;

        // these uniforms are only needed for when OPAQUES_ONLY is NOT defined
        // but there's a problem with our front-end compilation of compute shaders with multiple kernels causing it to error
        //#ifdef USE_CLUSTERED_LIGHTLIST
//        float4x4 g_mInvScrProjection; // TODO: remove, unused in HDRP

        public float g_fClustScale;
        public float g_fClustBase;
        public float g_fNearPlane;
        public float g_fFarPlane;
        public int g_iLog2NumClusters; // We need to always define these to keep constant buffer layouts compatible

        public uint g_isLogBaseBufferEnabled;
        //#endif

        //#ifdef USE_CLUSTERED_LIGHTLIST
        public uint _NumTileClusteredX;
        public uint _NumTileClusteredY;

        public uint _CascadeShadowCount;

        // TODO: move this elsewhere
        public int _DebugSingleShadowIndex;

        public int _EnvSliceSize;

        // Uniform variables that defines if we shall be using the raytraced indirect diffuse
        public int _RaytracedIndirectDiffuse;
    }
}


Directional asymmetry of the frog monocular optokinetic nystagmus: cholinergic modulation.
The frog monocular optokinetic gaze nystagmus (OKN) was studied by coil recordings after intravitreal administration of cholinergic drugs into the closed eye. Before injection, the frog displayed OKN for stimulations in the temporo-nasal (T-N) direction only. The injection of muscarinic agonists, as well as that of nicotinic antagonists, provoked the appearance of a naso-temporal (N-T) component, the slow phase velocity gain then being strongly and significantly increased. The abolition of the OKN directional asymmetry indicates that acetylcholine seems to act in opposite ways through muscarinic and nicotinic binding sites. The GABAergic and cholinergic systems may interact to generate and modulate OKN in the frog.


Q:

Groovy Maven Plugins

I am trying to run Spock tests and perhaps some Groovy scripts, currently for a Groovy app, but in future for Java projects as well.
I am really confused about which plugins should be used and how to best configure them, aka least amount of code.
I found numerous articles showing Maven XML settings for gmaven-plugin, gmaven-runtime and groovy-eclipse plugin, which seems like it works under IDEA as well.
I have been using Eclipse for a while and now am trying out IDEA Community Edition.
One of the confusions stems from the fact that I was able to add following dependency to my POM, in addition to having Gmaven in  section.
<dependency>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.5</version>
</dependency>

I understand that the question is a bit vague... but so is documentation on the matter :)

A:

For fully Maven-Groovy projects read this post Building your Groovy 2.0 projects with Maven

I have sample project with Maven, Java and Spock tests. There is one requirement here. Spock tests needs to have names like  FooTest.groovy.
My configuration looks like this
<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.5</version>
    <configuration>
        <providerSelection>2.0</providerSelection>
        <source/>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.gmaven.runtime</groupId>
            <artifactId>gmaven-runtime-2.0</artifactId>
            <version>1.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy-all</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
</plugin>

Fully working project is here: https://github.com/mariuszs/java-spock-test-sample


Follow-up Survey of Donor Candidates for Living Related Kidney Transplantation With Prostate Cancer.
With the increasing number of elderly kidney donor candidates due to the lack of available donors, prostate cancer has sometimes been detected in these candidates during pretransplant screening examinations. There are currently no guidelines or consensus on prostate cancer screening and treatment in donors. We retrospectively evaluated the clinical course of donor candidates with prostate cancer. Between January 2006 and December 2016, 9 donor candidates for living related kidney transplantation were incidentally diagnosed with prostate cancer at our institution. All male kidney transplant donor candidates routinely received prostate-specific antigen (PSA) testing. The patients with PSA levels > 4.0 ng/mL underwent prostate biopsies. For future kidney transplantation, treatment for localized prostate cancer was prostatectomy. Seven low- or intermediate-risk patients according to the D'Amico risk classification underwent endoscopic prostatectomy, while 2 high-risk patients underwent high dose-rate brachytherapy to prioritize prostate cancer treatment. Of the 7 who underwent surgery, 3 patients ultimately became living related kidney transplantation donors for their wives. There was no recurrence of PSA elevation after treatment. This study showed that donor candidates with prostate cancer could safely donate a kidney after a thorough evaluation to exclude those with high-risk prostate cancer. Transmission of prostate cancer through kidney transplantation seems unlikely and robot-assisted laparoscopic prostatectomy may be feasible for donor candidates with localized prostate cancer.


Bactriban without a prescription

Most U bactriban without a prescription. Overall, a pharmacy technician's main goal is to assist the pharmacist in helping patients and customers. Do I have to get certified to become a pharmacy tech?.

Most employers and states require National Certification. Someday, the regulations may be the same everywhere, but for now it's different in bactriban without a prescription every state. The first step is to find out what is required in your state and/or any prospective employers.

Pharmacy Technicians are required to register and keep an updated license with the Board of Pharmacy in their respective state, at the minimum. They are expected to be attentive and accurate, but also friendly and knowledgeable.

The first reason is that when you are using this bactriban without a prescription pill, you can see the results of its usage in a short span of time. Vimax pills are effective male enhancement pills for a few reasons. The main reason why people opt for this pill is the fact that you do not have to use the Vimax pill for lifelong.

After you are assured of desired results, you can stop using this pill but can still avail its benefits. But if you consider the fact that you do not have to take these pills lifelong and are yet assured of results, then the pills might not seem that expensive to you. There are a lot of people who feel that Vimax is expensive as compared with the other male enhancement pills.

Moreover, Vimax pills are not readily available and are only available through their website Vimax pills also assure you of no side effects and more importantly, if you are not satisfied after using them, you can get your money back.

This may bactriban without a prescription not be as strong a identify with as believed via some scientists, though. Other studies bactriban without a prescription tend to show that the mere convince behind alopecia is, in certainty, irritability of the fraction follicles to DHT. In experience, late studies purport to show a relationship between physical exercise and hair's breadth forfeiture linked to androgenic alopecia.

That is why I almost always services both together for bactriban without a prescription upper-class effect. Manner, I hanker after to mention that Propecia is not for women. Studies organize shown that Rogaine works change one's mind for regrowing trifle than Propecia.

There is nothing that utter in against applying both methods at the very time. Propecia on the other hand seems to work sick after stopping hair's breadth diminution but success benefit of rowing different locks has been limited.


2019 Dublin Fingal by-election

A by-election was held in the Dáil Éireann Dublin Fingal constituency in Ireland on Friday, 29 November 2019, to fill the vacancy left by the election of Independents 4 Change TD Clare Daly to the European Parliament.

It was held on the same day as three other by-elections in Cork North-Central, Dublin Mid-West and Wexford. The Electoral (Amendment) Act 2011 stipulates that a by-election in Ireland must be held within six months of a vacancy occurring. The by-election writ was moved in the Dáil on 7 November 2019.

At the 2016 general election, the electorate of Dublin Fingal was 93,486, and the constituency elected one Fianna Fáil TD, one Independents 4 Change TD, one Fine Gael TD, one Labour Party TD, and one Sinn Féin TD.

The election was won by Fingal County Councillor Joe O'Brien of the Green Party. It was the first by-election won by a Green Party candidate.

Among the candidates were 2 Senators Lorraine Clifford-Lee and James Reilly and four Fingal County Councillors Ann Graves, Dean Mulligan, Joe O'Brien and  Duncan Smith.

This was the first occasion when by-elections were contested by Independents 4 Change (who also contested Dublin Mid-West) and the Social Democrats (who also contested Cork North-Central and Dublin Mid-West).

Campaign
During the campaign, the Fianna Fáil candidate Lorraine Clifford-Lee was embroiled in controversy when she had to apologise for the language she had used in tweets she had made in 2011, which were derogatory towards the Traveller community.

Result

See also
List of Dáil by-elections
Dáil constituencies

References

External links
Dublin County returning officer

2019 Dublin Fingal by-election
Category:2019 in Irish politics
Category:2019 in the Republic of Ireland
Category:32nd Dáil
Category:By-elections in the Republic of Ireland
Category:By-elections in County Dublin
Category:November 2019 events in Europe
Category:2010s elections in Ireland
Category:Elections in Fingal


"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AnimationFrameAction_1 = require("./AnimationFrameAction");
var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
exports.animationFrameScheduler = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
exports.animationFrame = exports.animationFrameScheduler;
//# sourceMappingURL=animationFrame.js.map


The cost of visiting a Disney Park can add up quickly. Most families have limited budgets for something as expensive as a Disney vacation, so it is important to make a budget. Something that often sneaks under the radar when budgeting for a Disney park vacation are souvenirs. In my opinion souvenirs are crucial in bringing the Disney memories home with you, but how many of them end up in the back of your closet? Sometimes Disney park souvenirs tow a fine line between cherished keepsakes and forgotten junk. Disney park veterans will tell you many of their favorite items are showcased proudly in their homes while other souvenirs are quickly forgotten about.

Here is my guide on 3 souvenirs I recommend you buy, and 3 souvenirs I suggest you don’t.

Worth the Money

1) Mickey Mouse Ears

2) At least one printed ride photo

(Photo credit: www.pinterest.com)

3) Disney Rain Poncho

Not Worth the Money

1) Balloons

(Photo Credit: www.pinterest.com)

2) Night Time Light Up Toys and Glow Sticks

3) Disney Candy

Mickey Ears are the most iconic Disney park memento. The Mickey Ears are a relic from the years of the Mickey Mouse Club television show, but have taken on a life of their own as a Disney Park classic. For Disney fanatics displaying your Ears on your cubicle, or hanging your Ears at home can be a fun way to show your fandom. If the traditional black Mickey Ears aren't for you then you can always choose from the dozens of other Mickey Ear styles. Whether you choose the traditional Mickey themed Ears or any of the other choices this is a souvenir that will be used and reused for trips in the future.Hear me out if you've never bought a ride photo. Choosing one ride photo that includes as many of your family members as possible is a great way to watch your family grow. Documenting these memories of your Disney vacation will make your trip timeless. Seeing your family grow on Splash or Space Mountain is a unique opportunity to not only to create a great souvenir, but it also can also create a timeless family tradition.This suggestion is obviously more crucial to those who are planning a trip to Walt Disney World. Unlike California, Florida will literally rain on your 3 o’clock parade. So be prepared. I suggest buying the Walt Disney World rain poncho because they are good quality. Yes, there are pricier than the local dollar store’s but they don’t feel like you have a garbage bag over your head. More than likely you will use and reuse these rain coats over the span of your vacation, and that’s why I say it's worth your money.Sorry to be the fun police, but Disney balloons aren't worth the money. Here are 3 main reasons why. First reason is that balloons are not permitted on the rides. So unless you have a stroller to tie it to, or have a member of your party willing to not ride the attraction just to hold the balloon then you cannot keep it. Secondly, balloons fly away causing young children to become upset. Third, they are expensive. Don’t get me wrong these are good quality balloons, but at ten dollars a pop I suggest holding onto that money and putting it towards a Disney souvenir that won’t fly away. It’s hard to knock something that gives so much joy, but because that joy can literally fly away I have a hard time saying that balloons at the parks are worth the money.Seen at night in the Disney parks, these toys light up in fun neon colors. I have to admit these neon lights make the atmosphere look more entertaining, but you are going to have no other purpose for these toys once the night is over. Once you come home from your trip they are going to under up under the bed or hidden deep within the closet. Also these toys are also not as enjoyable during the day.Not sure if Disney candy is considered a souvenir, but for the purposes of this article we will agree it is. I love candy, but a lot of the park candy you can get anywhere. Eating candy that I could buy at a gas station does not give me the Disney experience I want. I suggest saving the money on the candy to buy that additional Dole Whip or Mickey Bar. Saving you money for those extra sweet treats that are Disney Park exclusives will be so much more memorable. What Disney Park souvenirs are a must have for you and your family? What do you and your family avoid? I think it's important for everyone to share these experience and hopefully this article can give first time park goers a good idea of what souvenirs are worth the money when budgeting their first Disney vacation.


All js be my js --- The ultimate JavaScript module solution


Edge effects and landscape matrix use by a small mammal community in fragments of semideciduous submontane forest in Mato Grosso, Brazil.
A community of small mammals was studied in seasonal semideciduous submontane forest in the state of Mato Grosso, Brazil. This study evaluated the use of edge and matrix pasture, by different small mammal species. Overall, 31 areas were studied, with a total sampling effort of 33,800 trap x nights. Only seven of the 25 species captured in the study sites were able to use the pasture matrix; we classified these species as generalists. Fourteen species were found to be intermediate in habits, being able to use forest edges. We found only four species habitat specialists, occurring only on transect lines in the interior of the fragment, at least 150 m from the edge. Transects located in the pasture matrix and 50 m from the edge had significantly lower species richness and abundance than transects located in the fragment edge or in the interior of the fragment. All transects located within the fragment had similar species richness and abundance, but transects located 50 m from the edge had slightly lower, but non-significant, species richness than transects located 100 m apart from edges. Rarefaction curves demonstrated that only medium-sized fragments (100-300 ha) reached an asymptote of species accumulation. The other areas require further sampling, or more sampling transect, before species accumulation curves stabilize, due to a continued increase in species number.


<Canvas>
    <Kind>42</Kind>
    <Name>Type</Name>
    <IsMinified>0</IsMinified>
    <XPosition>1.000000000</XPosition>
    <YPosition>90.000000000</YPosition>
</Canvas>
<Widget>
    <Kind>44</Kind>
    <Name>FONT SIZE</Name>
    <Value>7</Value>
</Widget>
<Widget>
    <Kind>4</Kind>
    <Name>TRACKING</Name>
    <Value>0.295566499</Value>
</Widget>
<Widget>
    <Kind>4</Kind>
    <Name>LEFT MARGIN</Name>
    <Value>10.640393257</Value>
</Widget>


Oh, Boy: Survey Finds That NFL's Core Audience Losing Interest Okay, here's a mid-afternoon change-of-topic. Men aged 18 to 49 are, or used to be, the NFL's core audience. Men aged 18 to 49 are, or used to be, the NFL's core audience. Four years ago, 75% of that demographic followed the NFL "closely." Four years ago, 75% of that demographic followed the NFL "closely." And now? And now? Just 51%. I'm not sure that 75% ever really followed the NFL "closely," but that stat reveals something anyway -- the NFL was deemed cool and manly so that even if you weren't "closely" following the NFL, as guy, you still felt that you should say you follow it closely. I'm not sure that 75% ever really followed the NFL "closely," but that stat reveals something anyway -- the NFL was deemed cool and manly so that even if you weren't "closely" following the NFL, as guy, you still felt that you shouldyou follow it closely. About one-third of that previous 75% apparently no longer thinks the NFL is cool and manly and so no longer claims to be following it closely. (Plus, a sizable number who really did used to follow it closely really don't follow it closely any longer.) About one-third of that previous 75% apparently no longer thinks the NFL is cool and manly and so no longer claims to be following it closely. (Plus, a sizable number who really did used to follow it closely really don't follow it closely any longer.) BTW, yes, we will have a Super Bowl thread on Sunday. I don't think I'll be watching but I don't want to take my personal viewcott to the extreme of denying commenters a place to talk about the game. BTW, yes, we will have a Super Bowl thread on Sunday. I don't think I'll be watching but I don't want to take my personal viewcott to the extreme of denying commenters a place to talk about the game. If a cob is interested in doing a post, please do. If no one is, I'll put up a crappy one. I think tv-event threads are the ultimate case of "didn't read the post, went right to the comments." If a cob is interested in doing a post, please do. If no one is, I'll put up a crappy one. I think tv-event threads are the ultimate case of "didn't read the post, went right to the comments." Oh, might as well mention: I don't watch many movies any more, but I did catch one I thought was pretty good. Oh, might as well mention: I don't watch many movies any more, but I did catch one I thought was pretty good. Mind you, when you don't watch many movies, the few movies you do watch end up seeming a lot better than they otherwise would -- now they're a novelty again, and the old cliches seem... well, they don't seem new, but they do seem to work. Mind you, when you don't watch many movies, the few movies you do watch end up seeming a lot better than they otherwise would -- now they're a novelty again, and the old cliches seem... well, they don't seem new, but they do seem to work. Also, I'm a little biased here -- I think Charlie Day might be the greatest comic actor working today. Also, I'm a little biased here -- I think Charlie Day might be the greatest comic actor working today. So anyway, Fist Fight -- basically a remake of the 80s classic Three O'Clock High, except with a bully adult challenging a meek adult to a fight at three o'clock after school, instead of a bully student challenging a meek student, is pretty decent. So anyway,-- basically a remake of the 80s classic, except with a bully adult challenging a meek adult to a fight at three o'clock after school, instead of a bully student challenging a meek student, is pretty decent. It's not great, but I did laugh a number of times, and was generally amused even when I wasn't laughing. It's not great, but I did laugh a number of times, and was generally amused even when I wasn't laughing. My only real problem is the ending. As with the movie Bad Moms (also pretty good), the film sets up a bunch of difficult-to-solve problems through most of its length, and then at the end just says "All the problems are now solved, just because the movie is now over." My only real problem is the ending. As with the movie(also pretty good), the film sets up a bunch of difficult-to-solve problems through most of its length, and then at the end just says "All the problems are now solved, just because the movie is now over." You might say "No one cares about that in a comedy," and I'd say, "Eh, people care less about that in a comedy, but if you like the movie and the characters, and are halfway interested in the light drama of the film (which, in most good comedies, you are), you do want a plausible resolution, not just have the film say that a magic wand was waved and everything's now fixed, even though no one actually worked on fixing anything during the movie." You might say "No one cares about that in a comedy," and I'd say, "Eh, people careabout that in a comedy, but if you like the movie and the characters, and are halfway interested in the light drama of the film (which, in most good comedies, you are), you do want a plausible resolution, not just have the film say that a magic wand was waved and everything's now fixed, even though no one actually worked on fixing anything during the movie." But yeah, it's not that important. But yeah, it's notimportant. Also, there's that joke that Hollywood now seems to think is super-funny -- little kids using profanity -- that really isn't very funny. That joke in this movie isn't as lame as it usually is, because part of the humor is Charlie Day being surprised by it and trying to go along with it (for reasons), but still, not really as funny as I'm thinking the writers and producers thought it was. Also, there's that joke that Hollywood now seems to think is super-funny -- little kids using profanity -- that really isn't very funny. That joke in this movie isn't as lame as it usually is, because part of the humor is Charlie Day being surprised by it and trying to go along with it (for reasons), but still, not really as funny as I'm thinking the writers and producers thought it was. Also, there is of course some pointless pro-teacher agitation. I always wonder-- do they do that on purpose, knowing that there are a lot of teachers in America, and if they throw in some light NEA propaganda (Pay us more and pay us to buy the supplies necessary to do our jerbs!), they'll see a bit of boost to the box office? Also, there is of course some pointless pro-teacher agitation. I always wonder-- do they do that on purpose, knowing that there are aof teachers in America, and if they throw in some light NEA propaganda (Pay us more and pay us to buy the supplies necessary to do our jerbs!), they'll see a bit of boost to the box office? But that's a pretty minor thing. It's mostly about a cowardly Charlie Day trying to weasel his way out of a fight with Ice Cube, and being understandably frustrated (to the point where his voice gets high pitched and fluttery) that Ice Cube doesn't seem to understand that adults just don't go around challenging other adults to parking-lot fist fights after school. But that's a pretty minor thing. It's mostly about a cowardly Charlie Day trying to weasel his way out of a fight with Ice Cube, and being understandably frustrated (to the point where his voice gets high pitched and fluttery) that Ice Cube doesn't seem to understand thatjust don't go around challenging other adults to parking-lot fist fights after school. Also, Jillian Bell returns, almost, to the comedic heights she hit in Twenty-Two Jump Street playing, again, the role of Woman Who Says Terrible, Weird Things. She was kinda lame in the cute-but-not-great Office Christmas Party, but she has better lines here. Also, Jillian Bell returns, almost, to the comedic heights she hit inplaying, again, the role of Woman Who Says Terrible, Weird Things. She was kinda lame in the cute-but-not-great, but she has better lines here. Posted by: Ace at 03:10 PM

MuNuvians MeeNuvians Polls! Polls! Polls! Frequently Asked Questions The (Almost) Complete Paul Anka Integrity Kick Top Top Tens Greatest Hitjobs News/Chat


# Characterizing and Forecasting User Engagement with In-app Action Graph: A Case Study of Snapchat

```
@inproceedings{tgcnl_kdd19,
 author = {Liu, Yozen and Shi, Xiaolin and Pierce, Lucas and Ren, Xiang},
 title = {Characterizing and Forecasting User Engagement with In-App Action Graph: A Case Study of Snapchat},
 booktitle = {Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery \&\#38; Data Mining (KDD)},
 pages = {2023--2031},
 year = {2019}
}
```

links
- [kdd](https://dl.acm.org/citation.cfm?id=3330750)
- [acm](https://dl.acm.org/citation.cfm?id=3330750)
- [arXiv](https://arxiv.org/abs/1906.00355)
- [spotlight](https://www.youtube.com/watch?v=m8m72FSDgPY)
- [code](https://github.com/INK-USC/temporal-gcn-lstm)


A case management demonstration project for the frail elderly in Israel.
This article presents an evaluation of an innovative community-based case management demonstration project for the frail elderly in Israel. The evaluation study was part of a nine-countries European project within the framework of the 1999 International Year of the Older People. The Department for the Aged of the Israeli Ministry of Labor and Social Affairs and the author initiated the project. The basis for the project development is described, including institutional structure, workers' qualifications, technical resources, and clients assessment criteria. The findings showed increased quality of life for the elders and their caregivers, more coordination and cooperation between various social and health services, activation of a variety of services, and client satisfaction. Recommendations are made to continue and expand this type of project to a larger segment of the elderly population.


I'm No Angel

I'm No Angel is a 1933 pre-code film directed by Wesley Ruggles, and starring Mae West and Cary Grant. West received sole story and screenplay credit. It is one of her films that was not subjected to heavy censorship.

Plot

Tira (Mae West) shimmies and sings in the sideshow of Big Bill Barton's Wonder Show, while her current boyfriend, pickpocket "Slick" (Ralf Harolde), relieves her distracted audience of their valuables for Big Bill (Edward Arnold). One of the rich customers, Ernest Brown, arranges a private rendezvous, during which Slick barges in and attempts to run a badger game on the customer. The customer threatens to call the cops, so Slick whacks him over the head with a bottle. Mistakenly thinking he has killed the man, Slick flees, but is caught and jailed.

Fearing that Slick will implicate her, Tira asks Big Bill for a loan to retain her lawyer, Bennie Pinkowitz (Gregory Ratoff). He agrees on condition that she does her lion taming act, which includes putting her head into the mouth of one of the beasts, promising her that it will get her (and him) to the "Big Show". It does. (West did some of her own stunts, including riding an elephant into the ring.)

Tira's fame takes her to New York City, where wealthy Kirk Lawrence (Kent Taylor) is smitten, despite being engaged to snobbish socialite Alicia Hatton (Gertrude Michael). He showers her with expensive gifts. Kirk's friend and even richer cousin, Jack Clayton (Cary Grant), goes to see Tira to ask her to leave Kirk and his fiancée alone. He ends up falling for her himself. Tira and Jack’s romance leads to a wedding engagement.

Tira tells Big Bill she is quitting to get married. Unwilling to lose his prize act, he has Slick, recently released from prison, sneak into Tira's penthouse suite, where Jack finds him in his robe. As a result, Jack breaks off the engagement. Tira sues Jack for breach of promise. The defense tries to use her past relationships to discredit her, but the judge allows her to cross examine the witnesses herself and in doing so she wins over not only the judge and jury, but also Jack. Jack agrees to give her a big settlement check. When he goes to see her, Tira tears up the check, and the two reconcile.

Context
I'm No Angel was released immediately after She Done Him Wrong, when Mae West was one of the nation's biggest box office attractions and its most controversial star. In the early 1930s, West's films were an important factor in saving Paramount Pictures from bankruptcy.  Depression era audiences responded to the fantasy rise of a woman from the wrong side of the tracks. It was the most popular movie in the US in 1933.

Cary Grant starred opposite her for the second and final time; their first film together had been She Done Him Wrong. Grant remained annoyed for decades that West often took credit for his career despite the fact that he had made major films before.  The smash hit Blonde Venus, starring Marlene Dietrich and Cary Grant, predates She Done Him Wrong by a year even though Mae West always claimed to have discovered Grant for her film, amusingly elaborating that up until then he had only made "some tests with starlets."  She would frequently claim to various reporters through the years that she spotted him as an unknown walking across a parking lot, asked who he was (nobody knew according to her story) and stated that, "If he can talk, I'll use him in my next picture." This tale remains routinely incorporated into most magazine articles about either West or Grant to this day.

West's ribald satire outraged moralists. Film historians cite her as one of the factors for the strict Hollywood production code that soon followed.  The Hays Office forced a few changes, including the title of the song "No One Does It Like a Dallas Man", altered to "No One Loves Me Like a Dallas Man". David Niven claims, in an interview on Parkinson, that the Hays Office changed the title from "It Ain't No Sin".

Cast

 Mae West as Tira
 Cary Grant as Jack Clayton
 Gregory Ratoff as Benny Pinkowitz
 Edward Arnold as "Big Bill" Barton
 Ralf Harolde as "Slick" Wiley
 Kent Taylor as Kirk Lawrence
 Gertrude Michael as Alicia Hatton
 Russell Hopton as "Flea" Madigan
 Dorothy Peterson as Thelma
 William B. Davidson as Ernest Brown (as Wm. B. Davidson)
 Gertrude Howard as Beulah Thorndyke, Tira's main maid
 Libby Taylor as Libby, Tira's hairdressing maid
 Hattie McDaniel as Tira's manicurist (uncredited)

Reception
The film was Paramount's biggest hit of the year. It was also Franklin Roosevelt's favourite film.

Signature Mae West lines
 "Oh, Beulah, peel me a grape!"
 "Well, it's not the men in your life that counts, it's the life in your men." This line was nominated for the American Film Institute's 2005 list AFI's 100 Years...100 Movie Quotes.
 "When I'm good I'm very good. But when I'm bad I'm better."

Soundtrack
 "They Call Me Sister Honky-Tonk" (1933) (uncredited)
 Music by Harvey Oliver Brooks
 Lyrics by Gladys DuBois and Ben Ellison
 Sung by Mae West
 "That Dallas Man" (1933) (uncredited)
 Music by Harvey Oliver Brooks
 Lyrics by Gladys DuBois and Ben Ellison
 Played on a record on which Mae West sings
 "I Found a New Way to Go to Town" (1933) (uncredited)
 Music by Harvey Oliver Brooks
 Lyrics by Gladys DuBois and Ben Ellison
 Sung by Mae West
 "I Want You, I Need You" (1933) (uncredited)
 Music by Harvey Oliver Brooks
 Lyrics by Ben Ellison
 Played on a piano and sung by Mae West
 "I'm No Angel" (1933) (uncredited)
 Music by Harvey Oliver Brooks
 Lyrics by Gladys DuBois and Ben Ellison
 Sung by Mae West at the end and during the closing credits

References

Bibliography
 When I'm Bad, I'm Better: Mae West, Sex, and American Entertainment, by Marybeth Hamilton (Berkeley: University of California Press, 1997).
 Goodness Had Nothing to Do with It, by Mae West (Avon: 1959). ASIN B0007HCX2O
 Mae West: A Bio-Bibliography, by Carol M. Ward (New York: Greenwood Press, 1989).
 The Complete Films of Mae West, by Jon Tuska (Secaucus, NJ: Carol Pub. Group, 1992).

External links

 Reel Classics
 The New York Times
 Cary Grant.net republished original Variety and New York Times reviews
 Filmsite.org review

Category:1933 films
Category:1930s romantic musical films
Category:1930s romantic comedy films
Category:American films
Category:American black-and-white films
Category:American musical comedy films
Category:American romantic comedy films
Category:English-language films
Category:Circus films
Category:Films directed by Wesley Ruggles
Category:Films made before the MPAA Production Code
Category:Films set in New York City
Category:Paramount Pictures films
Category:Films with screenplays by Mae West
Category:1930s musical comedy films
Category:American romantic musical films


Distorted visual feedback effects on drawing in Parkinson's disease.
We investigated the effects of distorted visual feedback on the drawing performance of a group with Parkinson's disease (PD) and a control group. Twenty older healthy adults and 20 PD patients copied figures onto a digitizer tablet with a pen under normal and distorted visual feedback conditions. PD patients were less able than controls to adjust the size of their drawing to compensate for distortions in visual feedback. The effect was particularly pronounced when patients were required to draw smaller than normal. Nevertheless, with practice. PD patients showed a similar degree of improvement in size as controls, although they did not match the control group's level of performance. Overall, these findings support the notion that PD may have specific difficulty adjusting to a change in gain (or discrepancy) between visual and kinesthetic feedback when they must alter the size of their drawing. These findings point to the putative role of the basal ganglia in adjusting for the intermodal discrepancy between sensory feedback, and re-scaling the size of movements.


Today Mark Zuckerberg called Danny Sullivan - vinothshankaran
http://www.locallytype.com/2012/07/31/today-mark-zuckerberg-called-danny-sullivan/

======
babasave
thanks for submitting this. really made me smile, that you found it HN worthy!


article

Hooters, which was founded in Clearwater, announced Wednesday it will lay off about 700 workers throughout the Bay Area due to the COVID-19 pandemic.

Workers who were affected include waitresses and maintenance workers.

The restaurant chain said the employees worked at 11 Hooters locations across Tampa Bay, including the original Hooters on Gulf to Bay Boulevard, where 64 people were laid off.

According to the Florida Department of Economic Opportunity, the additional Hooters locations and impacted workers include:

40 employees at 2250 Tyrone Square in St. Petersburg

73 employees at 4215 W. Hillsborough Avenue in Tampa

100 employees at 5336 Treadway Drive in Port Richey

105 employees at 10023 East Adamo Drive in Tampa

58 employees at 13606 Bruce B. Downs Blvd. in Tampa

40 employees at 3427 Commercial Way in Spring Hill

34 employees at 4420 West Gandy Blvd. in Tampa

36 employees at 4125 4th Street North in St. Petersburg

69 employees at 381 Mandalay Avenue in Clearwater

60 employees at 192 Johns Pass Boardwalk West in Madeira Beach


DAYTONA BEACH, Fla. — Danica Patrick’s NASCAR career is officially coming to an end with a lot of torn up sheet metal.

Patrick’s tenure at Stewart-Haas Racing ended with a crash because of a blown tire at Homestead in November. Sunday’s Daytona 500 — Patrick’s final NASCAR start — she got caught in a wreck that wasn’t of her own doing.

Chase Elliott violently slammed into the wall after contact from Brad Keselowski as the drivers were running second and third. The crash then collected others including Kevin Harvick, Kasey Kahne, Patrick and David Ragan.

“I said earlier today that I feel like the whole thing was picture perfect with Godaddy on the car … but it just wasn’t meant to be I guess today,” Patrick said after the crash.

Patrick ended her time as a full-time NASCAR driver when her contract at Stewart-Haas Racing expired. At 35, Patrick put together a deal for the Daytona 500 and Indianapolis 500 for 2018 before retiring from auto racing and pursuing other opportunities involving her lifestyle brands.

Sunday’s race was with Premium Motorsports, where she was reunited with former crew chief Tony Eury Jr. Patrick ran in the middle of the pack for most of the race and was proud of how competitive her team was until the crash.

“That’s the gamble about Daytona is it can go so well and it can go so awful,” Patrick said.

Patrick’s boyfriend, Green Bay Packers quarterback Aaron Rodgers, was in attendance at the race. The two shared a kiss on the grid before the race began.


A tweet from the University of Toledo's verified account was taken down Tuesday afternoon after the tweet, which promised to change the school's mascot to Shrek if there were 500,000 retweets, started gaining serious traction.

It appears as though the University Of Toledo has deleted its promise to change its mascot to Shrek if it got 500K retweets. Was getting roughly 1,000 retweets a minute towards the end. pic.twitter.com/fqrQPUItkv — Darren Rovell (@darrenrovell) April 24, 2018

"The tweet was meant to be fun, but it caused too much of a distraction," school spokesperson Christine Billau said in an email to ESPN.

The tweet was up for more than three hours and had accumulated nearly 91,000 retweets. As more and more publications and handles picked up the tweet, the number of retweets gained momentum.

At the time the post was taken down, the tweet was averaging roughly 1,000 retweets per minute.

It was doubtful that even 500,000 retweets would result in a change of Toledo's mascot. DreamWorks Animation owns 12 trademarks to the cartoon ogre, which has generated more than $5 billion in revenue for the company.

Rocky the Rocket has been the mascot of the school's sports teams since 1966, last receiving an updated costume in 2008.