text:
// feat/online-feature.h

// Copyright 2013   Johns Hopkins University (author: Daniel Povey)
//           2014   Yanqing Sun, Junjie Wang,
//                  Daniel Povey, Korbinian Riedhammer

// See ../../COPYING for clarification regarding multiple authors
//
// 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
//
// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
// WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
// MERCHANTABLITY OR NON-INFRINGEMENT.
// See the Apache 2 License for the specific language governing permissions and
// limitations under the License.

#ifndef KALDI_FEAT_ONLINE_FEATURE_H_
#define KALDI_FEAT_ONLINE_FEATURE_H_

#include <string>
#include <vector>
#include <deque>

#include "matrix/matrix-lib.h"
#include "util/common-utils.h"
#include "base/kaldi-error.h"
#include "feat/feature-functions.h"
#include "feat/feature-mfcc.h"
#include "feat/feature-plp.h"
#include "feat/feature-fbank.h"
#include "itf/online-feature-itf.h"

namespace kaldi {
/// @addtogroup  onlinefeat OnlineFeatureExtraction
/// @{

/// This class serves as a storage for feature vectors with an option to limit
/// the memory usage by removing old elements. The deleted frames indices are
/// "remembered" so that regardless of the MAX_ITEMS setting, the user always
/// provides the indices as if no deletion was being performed.
/// This is useful when processing very long recordings which would otherwise
/// cause the memory to eventually blow up when the features are not being removed.
class RecyclingVector {
public:
  /// By default it does not remove any elements.
  RecyclingVector(int items_to_hold = -1);

  /// The ownership is being retained by this collection - do not delete the item.
  Vector<BaseFloat> *At(int index) const;

  /// The ownership of the item is passed to this collection - do not delete the item.
  void PushBack(Vector<BaseFloat> *item);

  /// This method returns the size as if no "recycling" had happened,
  /// i.e. equivalent to the number of times the PushBack method has been called.
  int Size() const;

  ~RecyclingVector();

private:
  std::deque<Vector<BaseFloat>*> items_;
  int items_to_hold_;
  int first_available_index_;
};

/// This is a templated class for online feature extraction;
/// it's templated on a class like MfccComputer or PlpComputer
/// that does the basic feature extraction.
template<class C>
class OnlineGenericBaseFeature: public OnlineBaseFeature {
 public:
  //
  // First, functions that are present in the interface:
  //
  virtual int32 Dim() const { return computer_.Dim(); }

  // Note: IsLastFrame() will only ever return true if you have called
  // InputFinished() (and this frame is the last frame).
  virtual bool IsLastFrame(int32 frame) const {
    return input_finished_ && frame == NumFramesReady() - 1;
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return computer_.GetFrameOptions().frame_shift_ms / 1000.0f;
  }

  virtual int32 NumFramesReady() const { return features_.Size(); }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  // Next, functions that are not in the interface.

  // Constructor from options class
  explicit OnlineGenericBaseFeature(const typename C::Options &opts);

  // This would be called from the application, when you get
  // more wave data.  Note: the sampling_rate is only provided so
  // the code can assert that it matches the sampling rate
  // expected in the options.
  virtual void AcceptWaveform(BaseFloat sampling_rate,
                              const VectorBase<BaseFloat> &waveform);

  // InputFinished() tells the class you won't be providing any
  // more waveform.  This will help flush out the last frame or two
  // of features, in the case where snip-edges == false; it also
  // affects the return value of IsLastFrame().
  virtual void InputFinished();

 private:
  // This function computes any additional feature frames that it is possible to
  // compute from 'waveform_remainder_', which at this point may contain more
  // than just a remainder-sized quantity (because AcceptWaveform() appends to
  // waveform_remainder_ before calling this function).  It adds these feature
  // frames to features_, and shifts off any now-unneeded samples of input from
  // waveform_remainder_ while incrementing waveform_offset_ by the same amount.
  void ComputeFeatures();

  void MaybeCreateResampler(BaseFloat sampling_rate);

  C computer_;  // class that does the MFCC or PLP or filterbank computation

  // resampler in cases when the input sampling frequency is not equal to
  // the expected sampling rate
  std::unique_ptr<LinearResample> resampler_;

  FeatureWindowFunction window_function_;

  // features_ is the Mfcc or Plp or Fbank features that we have already computed.

  RecyclingVector features_;

  // True if the user has called "InputFinished()"
  bool input_finished_;

  // The sampling frequency, extracted from the config.  Should
  // be identical to the waveform supplied.
  BaseFloat sampling_frequency_;

  // waveform_offset_ is the number of samples of waveform that we have
  // already discarded, i.e. that were prior to 'waveform_remainder_'.
  int64 waveform_offset_;

  // waveform_remainder_ is a short piece of waveform that we may need to keep
  // after extracting all the whole frames we can (whatever length of feature
  // will be required for the next phase of computation).
  Vector<BaseFloat> waveform_remainder_;
};

typedef OnlineGenericBaseFeature<MfccComputer> OnlineMfcc;
typedef OnlineGenericBaseFeature<PlpComputer> OnlinePlp;
typedef OnlineGenericBaseFeature<FbankComputer> OnlineFbank;

/// This class takes a Matrix<BaseFloat> and wraps it as an
/// OnlineFeatureInterface: this can be useful where some earlier stage of
/// feature processing has been done offline but you want to use part of the
/// online pipeline.
class OnlineMatrixFeature: public OnlineFeatureInterface {
 public:
  /// Caution: this class maintains the const reference from the constructor, so
  /// don't let it go out of scope while this object exists.
  explicit OnlineMatrixFeature(const MatrixBase<BaseFloat> &mat): mat_(mat) { }

  virtual int32 Dim() const { return mat_.NumCols(); }

  virtual BaseFloat FrameShiftInSeconds() const {
    return 0.01f;
  }

  virtual int32 NumFramesReady() const { return mat_.NumRows(); }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat) {
    feat->CopyFromVec(mat_.Row(frame));
  }

  virtual bool IsLastFrame(int32 frame) const {
    return (frame + 1 == mat_.NumRows());
  }

 private:
  const MatrixBase<BaseFloat> &mat_;
};

// Note the similarity with SlidingWindowCmnOptions, but there
// are also differences.  One which doesn't appear in the config
// itself, because it's a difference between the setups, is that
// in OnlineCmn, we carry over data from the previous utterance,
// or, if no previous utterance is available, from global stats,
// or, if previous utterances are available but the total amount
// of data is less than prev_frames, we pad with up to "global_frames"
// frames from the global stats.
struct OnlineCmvnOptions {
  int32 cmn_window;
  int32 speaker_frames;  // must be <= cmn_window
  int32 global_frames;  // must be <= speaker_frames.
  bool normalize_mean;  // Must be true if normalize_variance==true.
  bool normalize_variance;

  int32 modulus;  // not configurable from command line, relates to how the
                  // class computes the cmvn internally.  smaller->more
                  // time-efficient but less memory-efficient.  Must be >= 1.
  int32 ring_buffer_size;  // not configurable from command line; size of ring
                           // buffer used for caching CMVN stats.  Must be >=
                           // modulus.
  std::string skip_dims; // Colon-separated list of dimensions to skip normalization
                         // of, e.g. 13:14:15.

  OnlineCmvnOptions():
      cmn_window(600),
      speaker_frames(600),
      global_frames(200),
      normalize_mean(true),
      normalize_variance(false),
      modulus(20),
      ring_buffer_size(20),
      skip_dims("") { }

  void Check() const {
    KALDI_ASSERT(speaker_frames <= cmn_window && global_frames <= speaker_frames
                 && modulus > 0);
  }

  void Register(OptionsItf *po) {
    po->Register("cmn-window", &cmn_window, "Number of frames of sliding "
                 "context for cepstral mean normalization.");
    po->Register("global-frames", &global_frames, "Number of frames of "
                 "global-average cepstral mean normalization stats to use for "
                 "first utterance of a speaker");
    po->Register("speaker-frames", &speaker_frames, "Number of frames of "
                 "previous utterance(s) from this speaker to use in cepstral "
                 "mean normalization");
    // we name the config string "norm-vars" for compatibility with
    // ../featbin/apply-cmvn.cc
    po->Register("norm-vars", &normalize_variance, "If true, do "
                 "cepstral variance normalization in addition to cepstral mean "
                 "normalization ");
    po->Register("norm-means", &normalize_mean, "If true, do mean normalization "
                 "(note: you cannot normalize the variance but not the mean)");
    po->Register("skip-dims", &skip_dims, "Dimensions to skip normalization of "
                 "(colon-separated list of integers)");}
};

/** Struct OnlineCmvnState stores the state of CMVN adaptation between
    utterances (but not the state of the computation within an utterance).  It
    stores the global CMVN stats and the stats of the current speaker (if we
    have seen previous utterances for this speaker), and possibly will have a
    member "frozen_state": if the user has called the function Freeze() of class
    OnlineCmvn, to fix the CMVN so we can estimate fMLLR on top of the fixed
    value of cmvn.  If nonempty, "frozen_state" will reflect how we were
    normalizing the mean and (if applicable) variance at the time when that
    function was called.
*/
struct OnlineCmvnState {
  // The following is the total CMVN stats for this speaker (up till now), in
  // the same format.
  Matrix<double> speaker_cmvn_stats;

  // The following is the global CMVN stats, in the usual
  // format, of dimension 2 x (dim+1), as [  sum-stats          count
  //                                       sum-squared-stats   0    ]
  Matrix<double> global_cmvn_stats;

  // If nonempty, contains CMVN stats representing the "frozen" state
  // of CMVN that reflects how we were normalizing the data when the
  // user called the Freeze() function in class OnlineCmvn.
  Matrix<double> frozen_state;

  OnlineCmvnState() { }

  explicit OnlineCmvnState(const Matrix<double> &global_stats):
      global_cmvn_stats(global_stats) { }

  // Copy constructor
  OnlineCmvnState(const OnlineCmvnState &other);

  void Write(std::ostream &os, bool binary) const;
  void Read(std::istream &is, bool binary);

  // Use the default assignment operator.
};

/**
   This class does an online version of the cepstral mean and [optionally]
   variance, but note that this is not equivalent to the offline version.  This
   is necessarily so, as the offline computation involves looking into the
   future.  If you plan to use features normalized with this type of CMVN then
   you need to train in a `matched' way, i.e. with the same type of features.
   We normally only do so in the "online" GMM-based decoding, e.g.  in
   online2bin/online2-wav-gmm-latgen-faster.cc; see also the script
   steps/online/prepare_online_decoding.sh and steps/online/decode.sh.

   In the steady state (in the middle of a long utterance), this class
   accumulates CMVN statistics from the previous "cmn_window" frames (default 600
   frames, or 6 seconds), and uses these to normalize the mean and possibly
   variance of the current frame.

   The config variables "speaker_frames" and "global_frames" relate to what
   happens at the beginning of the utterance when we have seen fewer than
   "cmn_window" frames of context, and so might not have very good stats to
   normalize with.  Basically, we first augment any existing stats with up
   to "speaker_frames" frames of stats from previous utterances of the current
   speaker, and if this doesn't take us up to the required "cmn_window" frame
   count, we further augment with up to "global_frames" frames of global
   stats.  The global stats are CMVN stats accumulated from training or testing
   data, that give us a reasonable source of mean and variance for "typical"
   data.
 */
class OnlineCmvn: public OnlineFeatureInterface {
 public:

  //
  // First, functions that are present in the interface:
  //
  virtual int32 Dim() const { return src_->Dim(); }

  virtual bool IsLastFrame(int32 frame) const {
    return src_->IsLastFrame(frame);
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return src_->FrameShiftInSeconds();
  }

  // The online cmvn does not introduce any additional latency.
  virtual int32 NumFramesReady() const { return src_->NumFramesReady(); }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  //
  // Next, functions that are not in the interface.
  //

  /// Initializer that sets the cmvn state.  If you don't have previous
  /// utterances from the same speaker you are supposed to initialize the CMVN
  /// state from some global CMVN stats, which you can get from summing all cmvn
  /// stats you have in your training data using "sum-matrix".  This just gives
  /// it a reasonable starting point at the start of the file.
  /// If you do have previous utterances from the same speaker or at least a
  /// similar environment, you are supposed to initialize it by calling GetState
  /// from the previous utterance
  OnlineCmvn(const OnlineCmvnOptions &opts,
             const OnlineCmvnState &cmvn_state,
             OnlineFeatureInterface *src);

  /// Initializer that does not set the cmvn state:
  /// after calling this, you should call SetState().
  OnlineCmvn(const OnlineCmvnOptions &opts,
             OnlineFeatureInterface *src);

  // Outputs any state information from this utterance to "cmvn_state".
  // The value of "cmvn_state" before the call does not matter: the output
  // depends on the value of OnlineCmvnState the class was initialized
  // with, the input feature values up to cur_frame, and the effects
  // of the user possibly having called Freeze().
  // If cur_frame is -1, it will just output the unmodified original
  // state that was supplied to this object.
  void GetState(int32 cur_frame,
                OnlineCmvnState *cmvn_state);

  // This function can be used to modify the state of the CMVN computation
  // from outside, but must only be called before you have processed any data
  // (otherwise it will crash).  This "state" is really just the information
  // that is propagated between utterances, not the state of the computation
  // inside an utterance.
  void SetState(const OnlineCmvnState &cmvn_state);

  // From this point it will freeze the CMN to what it would have been if
  // measured at frame "cur_frame", and it will stop it from changing
  // further. This also applies retroactively for this utterance, so if you
  // call GetFrame() on previous frames, it will use the CMVN stats
  // from cur_frame; and it applies in the future too if you then
  // call OutputState() and use this state to initialize the next
  // utterance's CMVN object.
  void Freeze(int32 cur_frame);

  virtual ~OnlineCmvn();
 protected:

  /// Smooth the CMVN stats "stats" (which are stored in the normal format as a
  /// 2 x (dim+1) matrix), by possibly adding some stats from "global_stats"
  /// and/or "speaker_stats", controlled by the config.  The best way to
  /// understand the smoothing rule we use is just to look at the code.
  static void SmoothOnlineCmvnStats(const MatrixBase<double> &speaker_stats,
                                    const MatrixBase<double> &global_stats,
                                    const OnlineCmvnOptions &opts,
                                    MatrixBase<double> *stats);

  /// Get the most recent cached frame of CMVN stats.  [If no frames
  /// were cached, sets up empty stats for frame zero and returns that].
  void GetMostRecentCachedFrame(int32 frame,
                                int32 *cached_frame,
                                MatrixBase<double> *stats);

  /// Cache this frame of stats.
  void CacheFrame(int32 frame, const MatrixBase<double> &stats);

  /// Initialize ring buffer for caching stats.
  inline void InitRingBufferIfNeeded();

  /// Computes the raw CMVN stats for this frame, making use of (and updating if
  /// necessary) the cached statistics in raw_stats_.  This means the (x,
  /// x^2, count) stats for the last up to opts_.cmn_window frames.
  void ComputeStatsForFrame(int32 frame,
                            MatrixBase<double> *stats);

  OnlineCmvnOptions opts_;
  std::vector<int32> skip_dims_; // Skip CMVN for these dimensions.  Derived from opts_.
  OnlineCmvnState orig_state_;   // reflects the state before we saw this
                                 // utterance.
  Matrix<double> frozen_state_;  // If the user called Freeze(), this variable
                                 // will reflect the CMVN state that we froze
                                 // at.

  // The variable below reflects the raw (count, x, x^2) statistics of the
  // input, computed every opts_.modulus frames.  raw_stats_[n / opts_.modulus]
  // contains the (count, x, x^2) statistics for the frames from
  // std::max(0, n - opts_.cmn_window) through n.
  std::vector<Matrix<double>*> cached_stats_modulo_;
  // the variable below is a ring-buffer of cached stats.  the int32 is the
  // frame index.
  std::vector<std::pair<int32, Matrix<double> > > cached_stats_ring_;

  // Some temporary variables used inside functions of this class, which
  // put here to avoid reallocation.
  Matrix<double> temp_stats_;
  Vector<BaseFloat> temp_feats_;
  Vector<double> temp_feats_dbl_;

  OnlineFeatureInterface *src_;  // Not owned here
};

struct OnlineSpliceOptions {
  int32 left_context;
  int32 right_context;
  OnlineSpliceOptions(): left_context(4), right_context(4) { }
  void Register(OptionsItf *po) {
    po->Register("left-context", &left_context, "Left-context for frame "
                 "splicing prior to LDA");
    po->Register("right-context", &right_context, "Right-context for frame "
                 "splicing prior to LDA");
  }
};

class OnlineSpliceFrames: public OnlineFeatureInterface {
 public:
  //
  // First, functions that are present in the interface:
  //
  virtual int32 Dim() const {
    return src_->Dim() * (1 + left_context_ + right_context_);
  }

  virtual bool IsLastFrame(int32 frame) const {
    return src_->IsLastFrame(frame);
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return src_->FrameShiftInSeconds();
  }

  virtual int32 NumFramesReady() const;

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  //
  // Next, functions that are not in the interface.
  //
  OnlineSpliceFrames(const OnlineSpliceOptions &opts,
                     OnlineFeatureInterface *src):
      left_context_(opts.left_context), right_context_(opts.right_context),
      src_(src) { }

 private:
  int32 left_context_;
  int32 right_context_;
  OnlineFeatureInterface *src_;  // Not owned here
};

/// This online-feature class implements any affine or linear transform.
class OnlineTransform: public OnlineFeatureInterface {
 public:
  //
  // First, functions that are present in the interface:
  //
  virtual int32 Dim() const { return offset_.Dim(); }

  virtual bool IsLastFrame(int32 frame) const {
    return src_->IsLastFrame(frame);
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return src_->FrameShiftInSeconds();
  }

  virtual int32 NumFramesReady() const { return src_->NumFramesReady(); }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  virtual void GetFrames(const std::vector<int32> &frames,
                         MatrixBase<BaseFloat> *feats);

  //
  // Next, functions that are not in the interface.
  //

  /// The transform can be a linear transform, or an affine transform
  /// where the last column is the offset.
  OnlineTransform(const MatrixBase<BaseFloat> &transform,
                  OnlineFeatureInterface *src);

 private:
  OnlineFeatureInterface *src_;  // Not owned here
  Matrix<BaseFloat> linear_term_;
  Vector<BaseFloat> offset_;
};

class OnlineDeltaFeature: public OnlineFeatureInterface {
 public:
  //
  // First, functions that are present in the interface:
  //
  virtual int32 Dim() const;

  virtual bool IsLastFrame(int32 frame) const {
    return src_->IsLastFrame(frame);
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return src_->FrameShiftInSeconds();
  }

  virtual int32 NumFramesReady() const;

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  //
  // Next, functions that are not in the interface.
  //
  OnlineDeltaFeature(const DeltaFeaturesOptions &opts,
                     OnlineFeatureInterface *src);

 private:
  OnlineFeatureInterface *src_;  // Not owned here
  DeltaFeaturesOptions opts_;
  DeltaFeatures delta_features_;  // This class contains just a few
                                  // coefficients.
};

/// This feature type can be used to cache its input, to avoid
/// repetition of computation in a multi-pass decoding context.
class OnlineCacheFeature: public OnlineFeatureInterface {
 public:
  virtual int32 Dim() const { return src_->Dim(); }

  virtual bool IsLastFrame(int32 frame) const {
    return src_->IsLastFrame(frame);
  }
  virtual BaseFloat FrameShiftInSeconds() const {
    return src_->FrameShiftInSeconds();
  }

  virtual int32 NumFramesReady() const { return src_->NumFramesReady(); }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  virtual void GetFrames(const std::vector<int32> &frames,
                         MatrixBase<BaseFloat> *feats);

  virtual ~OnlineCacheFeature() { ClearCache(); }

  // Things that are not in the shared interface:

  void ClearCache();  // this should be called if you change the underlying
                      // features in some way.

  explicit OnlineCacheFeature(OnlineFeatureInterface *src): src_(src) { }
 private:

  OnlineFeatureInterface *src_;  // Not owned here
  std::vector<Vector<BaseFloat>* > cache_;
};

/// This online-feature class implements combination of two feature
/// streams (such as pitch, plp) into one stream.
class OnlineAppendFeature: public OnlineFeatureInterface {
 public:
  virtual int32 Dim() const { return src1_->Dim() + src2_->Dim(); }

  virtual bool IsLastFrame(int32 frame) const {
    return (src1_->IsLastFrame(frame) || src2_->IsLastFrame(frame));
  }
  // Hopefully sources have the same rate
  virtual BaseFloat FrameShiftInSeconds() const {
    return src1_->FrameShiftInSeconds();
  }

  virtual int32 NumFramesReady() const {
    return std::min(src1_->NumFramesReady(), src2_->NumFramesReady());
  }

  virtual void GetFrame(int32 frame, VectorBase<BaseFloat> *feat);

  virtual ~OnlineAppendFeature() {  }

  OnlineAppendFeature(OnlineFeatureInterface *src1,
      OnlineFeatureInterface *src2): src1_(src1), src2_(src2) { }
 private:

  OnlineFeatureInterface *src1_;
  OnlineFeatureInterface *src2_;
};

/// @} End of "addtogroup onlinefeat"
}  // namespace kaldi

#endif  // KALDI_FEAT_ONLINE_FEATURE_H_

redpajama_set_name: RedPajamaGithub


Arrange a manageable monthly donation to WindReach. Click here for instructions.
Sponsor your star today – WindReach Stars Campaign.
WindReach does not offer refunds on donations. However, we recognize that special circumstances can arise. We are a friendly bunch so please do contact us to discuss your concerns regarding your donation. Should WindReach be able to consider your refund or cancellation in special circumstances, requests are to be made within 30 days of the transaction.
Your privacy and security is as important to WindReach as it is you. We are fully committed to preserving the privacy of our users. This statement has been formulated to disclose our information gathering methodology as well as disseminating practices for this website. If you are submitting personal details, credit card numbers, or other information over the Internet which you wish to remain private, please note that, while all attempts are made to secure information transmitted to this website, there is a possibility that information submitted may be observed by a third part while in transit.
Our website has security measures in place to protect the loss, misuse and alteration of the information under our control. Only certain employees have access to the information you provide us. They have access only for data analysis and quality control purposes.
We encrypt certain sensitive information (such as credit care information) using Secure Sockets Layer (SSL) technology to ensure that your Personally Identifiable Information is safe as it is transmitted.
US donors may contribute to WindReach via the Friends of Bermuda Community Foundation (FBCF) by completing a Gift Intention Form requesting that their charitable donation be distributed to WindReach. The completed form and requests for further information should be sent to Friends of Bermuda Community Foundation at info@friendsofbcf.org.
FBCF is a US registered public charity exempt from Federal income tax under section 501 (c) (3) of the Internal Revenue Code. Its EIN is 38-3938349.
If you would like to donate by purchasing a WindReach Star, please fill out the form below and send it to tjoseph@windreach.bm.


Hi everyone! Welcome to Glowing Local, a place to encourage you to shine the light of God's love into your local story.
What exactly does that mean? My hope is that Glowing Local imparts a small place in this giant world-of-the-web where you can be encouraged, providing handy resources for you to in turn help those around you… especially when your life is already filled to the brim with responsibilities, to-do's lists, and a lot of guilt (can I get an Amen?) I hope Glowing Local will grant a breath of fresh air, giving support in little pieces, and offering useful ways to make a difference right where you are.
Check out our Prayer Journals, one tool to tangibly get serious about loving on those near to you. Also, make sure to check out our Resources, a place loaded with tips and advice to get you there.
• Want to find a coupon code? Sign up for our Newsletter to receive fun updates and occasional discount codes.
• Find some new book reads and add your thoughts on some great books.
My name is Sarah, and I am a wife and a mom to one red-headed, fire-starter of a little boy. Our family lives in Greenville, SC, and I consider each day a success when I can maintain a semblance of sanity and keep my child alive for just.one.more.day. Our family enjoys all things outdoors – hiking, running, camping, adventure…you name it. I read books all the time…a little more than is probably normal. Glowing Local is my way of stepping out of the mundane (and the crazy) to create a better story for my life; I want my story to be a reflection of what the Lord has done, and continues to do, through me...even if for today, that just means getting the caked on eggs off my stovetop.


Here are two Great Egrets where I think the higher angle works. If you want to include reflections you have to be higher.
Here we see a super low Great Egret. It is too close to the camera, but you can see what I meant big "leg issue" With that low angle you have problems to keep the virtual legs….
but with the virtual legs explanation i get the picture!
How was your recent trip to Florida?? What was your favorite subject to photograph? I really liked that pelican eating the fish.
Thanks for the good info.!
I think my favorite subject were Black Vultures. They are not the most pretty birds, but they have lots of character. When you are very close to them you can see how smart they actually are.


On 7/8 - one of our numbers in the plan (iPhone 8) got added to a random text group made up of numbers not in the contact list! Today (7/9) an unknown number got added to our text group automatically (this was a nexus ) and one more phone in our plan (iphone) got added to another random text group!!
What is happening? Are others experiencing this kind of random additions to unknown groups? I saw some folks reporting this issue on ATT and Verizon in late 2017. I called Tmobile support today - they denied any widespread issue and did not create a case for my issue !
The same thing happened to my families group text yesterday. Still trying to figure it all out.
My group chat has been going through something similar. We all have Galaxy phones. 2x Galaxy S9 and 1x Galaxy S6.
We are experiencing the same thing. Three of our lines received group texts from numbers not in our contact lists. I called some of the numbers and the people I talked to have T-Mobile and use iPhones. T-Mobile support suggested I change my number!!! They are not coming up with any decent solutions.
Their only suggestion was to change your number? That's a little ridiculous. I told my family to just block the number since the other person was not being cooperative to help figure out how they got on our group messages. We also all have android phones, no iphones.
Hey folks -- this is super bizarre, and I'm sorry to say not something we've heard about before. Someone texting you accidentally is one thing, but a number being added to your own existing group message is super weird. Has anyone seen a recurrence of this since this thread was originally started?
The person who was added to our group said that this was the third time they have been added to a group message.
Oh goodness! So on their end, the group messages just started appearing? And this wasn't someone anyone had messaged before?
Can I ask where everyone posting here is located? Just a ZIP will be fine; we wouldn't want you to share your exact addresses in this public user forum. I'd just like to see if everyone is in the same general area.
Has this happened again to anybody?
My family and I are in 89074 and the person added's number is Florida, area code 772.
Im assuming thats what happened. I dont know if they started getting our messages, but they texted a (?) and i/we had no idea who it was. So i dont know if they could see all the other messages between myself and my family, but it started a new thread with them included.
I just asked them to send a screen shot of where their thread began.
we are in 72042 zip code and the texts we received were from all over. California, Missouri, Ohio, and Arizona. The last time we received one of these texts was Tuesday (7-10). We aren't using our texting right now because we don't know if they are going to random people or not. We have a ticket in now with tech support and waiting for a response.
Thanks for your responses, all! burkek10 -- when you reached out to our Tech team, were they able to file a ticket for you?
btoaejniljjjo -- are you able to share your ticket number? Even though we don't have the account access necessary to file tickets from our public user forum, we are able to take a peek at them!
I did not reach out to the Tech team. If it happens again i will, but i am hoping this is just a one time goof.
To be honest, I'm hoping so, too -- but I also understand wanting to have answers; and engineers reviewing this oddity is the best way to get those -- and in a prolonged situation, would also be the best way to ensure that it's being corrected! The fact that this happened and stopped makes me think that there must have been some kind of routing hiccup in the SMS system that's now been corrected -- but if it happens again, please keep us posted for sure!
Hello, this same thing just started happening to me last night. The tech I spoke to thought someone was spamming people with my number, but it sounds more like a routing issue to me (I am a Telecom professional myself). I am in-state right now and just got one random message from an in-going group chat right now.
Same thing happened twice today to my group in 2 different group texts.
Just got in to say this is the same exact thing that happened to me last night, and even tonight again as well!
It's happening to my existing group texts that I'm in. We all just randomly receive a group text message from a complete stranger whom none of us know!
On the second occurrence, the person even said that they received an image from us!
...Unfortunately the person wasn't too helpful when we inquired them about it as they panicked, told us to "LEAVE ME ALONE!", and completely self-destructed.
I have no clue as to what SMS messages these random people are getting from me, but if random cellular numbers are now receiving private MMS images, well this a pretty severe issue T-Mobile needs to check into ASAP.
Today I received a group text to my family from a FL number when our numbers are from all over but my number is from VA.
This just happened to me last night. A new group text showed up including all the members of our family group text + 1 complete stranger from the Buffalo, NY area. We're all in CO and nobody knows this person. They started demanding to know why they were added to the group. Those were the first messages in the new conversation, so I can't tell how many of our messages they received from our family group.
Afterward, I also noticed I had been added to someone else's group text around the same time. I just deleted the conversation, but if I get added back I'm going to warn them. The idea that private texts and images are potentially being sent to random strangers is extremely uncomfortable.
hmmm... I was in Colorado when this happen s to me as well!
It happened to me as well. I'm in TX getting added to group all over the place. When I asked one group to please remove me from the chat, they were shocked and said that I was the one texting their group... This is extremely odd, and a breach of information. I'm not trying to be a part of someone else's conversation I have no business being in, and I wouldn't want someone in mine. I called customer service and they seem clueless to this issue. I suggest calling in as well, maybe the more people to call they'll start listening. I create a "trouble ticket," so I can get to the engineers. I was told to send a letter to their customer relations department...which is ridiculous.
I've been having the same issue the last couple months. I've been added to 3 separate group chats and they appear to be kids (one instance they were sending funny face photos to eachother) and another time (not sure if it was the same numbers) I got added into the group and they got defensive when I asked who it was and why I had gotten added. They said I didn't need to know and to get off their chat. Not like I was there on purpose! I found they were from New York and Florida areas each time so assuming a connection issue there perhaps?
This just happened to me moments ago. What is going on?!?!
to the thread (with random numbers ) and we were blamed to be hackers.
Same thing happened to me as well. What is T-Mobile doing about it? Maybe time to open a lawsuit. Personal messages are being distributed randomly even though you select the correct contact. This is a major security issue or breech. Same issue NY to Florida.
The same thing happened to me a few days before Halloween I called Tmobile and they told me to block the group chat which my phone didn't have the option to do so mute the chat (another option my phone didn't have), or ask the original person who started the chat to remove myself & my two family members from the chat. Of course that doesn't help us figure out how we got added into a random group chat with 4 other strangers. Luckily the other people in the chat weren't crazy and wanted to solve the problem too. It's still not solved on their end. I had my family delete our group chat and I started a new one adding each of our names... So far it seems to have worked, but we've decided not to share any personal info over texts anymore.
This has been happening to us for the past week. From everyone's replies it doesn't seem like T-mobile is taking the issue seriously. This is a breach of our privacy. Luckily, yesterday's stranger was understanding and is also going to call customer support.


PMM mysql relication monitoing not working for multisource replication.
PMM MySQL Replication dashboard error "Multiple Series Error" forthe host with multi-source replication.
This cause the error: Metric query returns 2 series. Single Stat Panel expects a single series.


Biomedical Innovation: Can the U.S. Keep Its Edge?
The United States has gotten comfortable in its role as the undisputed global leader in biomedical research and manufacturing. Over the past 30 years, many European multinational firms shifted R&D to the U.S. to take advantage of its matchless ecosystem for innovation. But today, other countries realize the value of attracting R&D in the life sciences, and the private-sector production activities associated with it, for creating high-value-added jobs. Many Asian and European nations are pursuing strategies to wrestle biomedical innovation infrastructure away from the United States. What policy moves should the U.S. implement to keep its leadership in this field intact?


Periods of rain. Thunder possible. High 52F. Winds NW at 10 to 20 mph. Chance of rain 60%..
Rain likely. Low 41F. Winds N at 15 to 25 mph. Chance of rain 90%. Rainfall near a quarter of an inch.
TEXAS CITY, Texas (WAND) -What would you do if men wearing clown masks pulled up next to you in your driveway wielding machetes?
That is what happened to a couple in Texas City, Texas.
The man and woman were sitting in their car in their driveway when two men pulled up alongside them.
One wearing a clown mask got out, walked up to them and stuck a machete through the car window.
He put the machete to the man's throat, and said, "You gonna give it up, or I'm gonna cut you," according to a police report.
The second man, also wearing a clown mask, came up to the passenger-side door, but the woman was able to escape and grab her children's two-wheel scooter.
She then started hitting the two suspects with it.
The suspects ran back to their car with the woman still chasing them with the scooter, hitting their car with it and busting out a window.
The suspects were identified as 32-year-old Luis Jimenez and 35-year-old Jose Lugo.
They were placed under arrest and charged with aggravated robbery.


text:
House Speaker Says Health Care Remains 'Focus'
Published January 8, 2020 at 8:04 AM EST
House Speaker Jose Oliva, R-Miami Lakes, address a room.
House Speaker Jose Oliva said Tuesday that health care continues to be his top priority for the upcoming legislative session after he pushed through a series of changes last year.
"Health care remains the central focus of our agenda. And that's not by our own doing, that's because it kind of chose us," Oliva, R-Miami Lakes, said during an interview on the Preston Scott show on WFLA radio in Tallahassee. "In spite of all the positive economic indicators in Florida, health care continues, nationwide … to cripple families. And so that's what we've chosen as our main goal, is to try to inject some sort of free market principles into a very broken health-care system."
READ MORE: The Key Issues Entering The 2020 Florida Legislative Session
Oliva said he spent a "good amount" of time on Monday preparing for the 2020 session by discussion scope-of-practice expansions, health-care affordability and access to care.
"That continues to be our focus," Oliva said.
A House health care panel in December approved a proposal (HB 607) that would allow certain advanced practice registered nurses and physician assistants to practice independently from physicians. The measure, sponsored by Rep. Cary Pigman, R-Avon Park, is similar to a proposal that passed the full House during the 2019 session but stalled in the Senate.
Senate President Bill Galvano told The News Service of Florida in December that he's "always been very cautious" about expanding scopes of practice for nurses and physician assistants. Physician groups also have long lobbied against such proposals.
"That's an issue that probably will have to be worked out, if at all," Galvano, R-Bradenton said.
The Legislature in recent years has taken steps to expand the scope of practice for advanced practice registered nurses. In 2016, lawmakers authorized advanced practice registered nurses to prescribe controlled substances. But the law maintained a requirement that the nurses have supervisory relationships with physicians.
Pigman's bill would build on that and allow certain advanced practice registered nurses to practice without written agreements with supervisory physicians. To qualify, the nurses would need to have completed a graduate level course in pharmacology and have 2,000 hours of supervised practice in the preceding two years.
In short, the advanced practice registered nurses would be able, like physicians, to admit, manage and discharge patients at hospitals and other facilities, as well as prescribe medication, write orders and sign and certify documents such as death certificates.
Meanwhile, Oliva does not seem as interested in pursuing limits on lawsuits --- commonly known as tort reform --- as part of his health care agenda during the 60-day session, which starts Jan. 14.
When asked on the radio show whether it is possible to "have true health care in the state, or even nationally, without dealing with tort reform," Oliva replied, "Yes."
"The main issue in health care, again, is that the state keeps paying these exorbitant bills," Oliva said.
Oliva in 2019 spearheaded a number of bills that he argues will lower health care costs, including a measure that eliminated the longstanding "certificate of need" regulatory program for hospitals. Also, Oliva was a key backer of a bill that lays the groundwork for the state to begin importing prescription drugs from Canada and other countries.
Copyright 2020 Health News Florida
Health News FloridaFlorida HouseFlorida health care2020 Florida LegislatureHouse Speaker Jose Oliva
DeSantis Draws Praise From Trump On Prescription Drug Effort
The Key Issues Entering The 2020 Florida Legislative Session

redpajama_set_name: RedPajamaCommonCrawl


text:
Nine radio producers. Two days. One rest stop on the New York State Thruway. In this show, we'll bring you stories of people who are just passing through, and people who are at the rest stop every day—working. One of them has worked there since 1969. A bunch of others came from Asia and eastern Europe to pour coffee for travelers.
Image by Nancy Updike.
Check out the map of this show here.
Podcast listeners! There's an extra, bonus story in the podcast this week. Reporter Sean Cole visits the farm stand at the Plattekill rest stop, meets one of the regular customers...and recklessly gets in the car with her and her "domestic partner." Do not try this at home.
Lisa Pollak
Host Ira Glass describes scenes from a rest stop on the New York State Thruway, the Plattekill Travel Plaza, and the kind of people you might meet if you ever stayed long enough to talk with them. These include Robert Woodhill, the general manager, who needs a good sales day so he can beat his friend Andy, who manages a rest stop in Maine, in their weekly competition. Ira hangs out with a group of foreign students who've landed in Plattekill on a summer work program, and reporter Lisa Pollak gets travel tips from Lenny Wheat, who works at the rest stop's information booth. Reporter Jonathan Goldstein spends a few hours in the rest stop parking lot. (30 minutes)
Sean Cole
Nancy Updike
Greg Warner
More stories of travelers and workers at highway rest stop. The competition between Plattekill and Maine continues. Reporter Sean Cole observes the lunch rush at the rest stop's busiest restaurant and stumbles into a behind-the-scenes romance. Reporter Gregory Warner watches a cashier at the Travel Mart deal with an angry customer. Reporters Nancy Updike and Jay Allison hang out for the graveyard shift—midnight to 8 a.m.—and find a surprising amount of romance at the rest stop. (25 minutes)
Plattekill Travel Plaza
Scenes from the Plattekill Travel Plaza, a rest stop on the New York State Thruway.
If you enjoyed this episode, you may like these
137: The Book That Changed Your Life
Act Four: Little Sod Houses For You And Me
Writer Meghan Daum goes to DeSmet, South Dakota, where Laura Ingalls Wilder lived and where many of the books she wrote in the Little House on the Prairie series are set.
115: First Day
Act One: Lost At Sea
Dishwasher Pete tells the story of his first day washing dishes on an oil rig off the coast of Louisiana.
129: Advice
Act One: Sleepless In Seattle
What if you asked people for advice and actually took all the advice that everyone gave you? As an experiment, writer Sarah Vowell tried exactly that, when she recently solicited advice from many different people about insomnia.
Three Miles
What happens when of a group of public school students in the Bronx goes to visit an elite private school three miles away.
20 Acts in 60 Minutes
All kinds of little stories that we ordinarily can't use on the radio show because they are just too short.


Mastronardi Hall at The College of Mt. St. Vincent in Riverdale, NY has 36,000 total square feet and 110 living units. The steel-framed student residence hall was built as an addition to an existing building and houses nearly 200 students.


As always the magical ride must come to an end. So I must say that you have until 11:59p Sunday evening to make a comment on both Adrian's and my blog. It has truly been fun. If I haven't said it yet you guys are Fantabulous!--is that a word? (lol). I love reading your comments and visiting your blogs. We will announce the winners on Monday. Take care and enjoy the last card of our blogaversary. GOD Bless!
Hey A, still rockin' your colors. I just couldn't resist it. The girl theme is still alive with my go-to cart--Forever Young. I don't feel as though I use it enough. I just love the stylish women on this card. I wish Provocraft would make a counterpart for it with stylish men. That would be awesome.
Very nicley done and yes, stylish men...I would like that too!
Beautifl card. I love this cartridge. TFS!
All good things must come to an end! I have had so much fun tag teaming with you! I look forward to year 3!!!!! Thanks for making such beautiful card in such beautiful colors!!!!
A, I am sending these cards to you. Happy Blogaversary girl!
Happy Blogaversary It has been fun visiting you and Adrian. Amazing cards. I love the frame you made on this card.
Happy Blogaversary!!!! You ladies have done a GREAT job with all your projects all week!! So loving this beautiful card! GREAT lo design and colors!!
Thanks for sharing and again happy blogaversary!!
Happy Blog anniversary, friend!! I've enjoyed visiting and seeing all your creations! Your card of course is nothing short of JUST DARLING!! Thanks for sharing your anniversary and talents with us!!
love love it congrats to you.
This is card is AMAZING, love everything about it,swiss dots is the perfect folder, you just can't go wrong with that one. Great job and HAPPY BLOGAVERSARY!
Awesome card!! I don't use Forever young cart enough:) Love the cut and the design! Happy Blogaversary!
You have been on a roll Gloria.Love the girl dress and the colors are just perfect.
Great card! Love the color combo on this!
Very cute card!! I love the black, white and red. It's so funny that I'm not a fan of red by itself but love it with black and white!!
A-dor-able!! Love this card with your Spellbinders oval! I love Forever Young cart too, fabulous silhouettes. Thanks for all the fun you and Adrian provided and Happy Official Blogaversary!--Pat N.
Im excited i was picked.Congrats to the rest of the winners.
Very stylish, love hte polka dot dress!


A multi-styling Shoe Strap that will help RELAX your feet by securing the foot to the shoe and preventing HEEL SLIPPAGE while walking on Stilettos, Kitten heels, Wedges, Ballet flats, because they all have the same problem; they have the tendency to slip off the back of the foot. This causes stress on the foot and makes our beloved shoe uncomfortable to wear, no matter what shoe-brand they are. The Strap was designed to LOOK & FEEL as part of the shoe. Wear Strappy Couture anywhere on your shoe! Place it where is most comfortable and where it helps you secure your foot the most. Strappy Couture are removable and can be interchanged with all shoes. Up your functional FASHION!


text:
Slovak | Sitemap | Contacts
Slovak office of standards, metrology and testing
UNMS SR
Legislation Department
C.I.P.
European Affairs and International Relations
The Official Journal of the UNMS SR
eMetrology and Testing
Home / Home / Testing
Activities in Testing
The Department of Testing of the Slovak Office of Standards, Metrology and Testing fulfils tasks arising from the Act No. 264/1999 Coll. on technical requirements on products and on conformity assessment and on change and amendments to some acts, as amended ("Law on conformity") and from the Act No. 254/2011 Coll. on transportable pressure equipment and on change and amendments to some acts.
Activities are focused primarily on the following:
- Enforcement of conformity assessment performance under the Act No. 264/1999 Coll (PDF, 104,9 kB)., Act No. 254/2011 Coll.,
- Granting, changing and withdrawing the authorization of bodies,
- Notification of bodies in charge of conformity assessment according to EC Directives,
- Coordination of the activity of Notified Bodies working groups for separate EC Directives and the Slovak Government Ordinances (PDF, 300,4 kB)
- Methodical guidance for activities of authorized and notified bodies,
- Monitoring of authorized and notified bodies in compliance with the Act No. 264/1999 Coll (PDF, 104,9 kB)., Act No. 254/2011 Coll.,
- Implementation of activities under the Testing and Technical Standardization Development Program,
- Preparing of supporting documents of international agreements and contracts, and providing the tasks arising from them,
- Organizing "The Day of Testing",
- Providing advisory and consultancy services in the field of conformity assessment.
print page send page last change: 24. 2. 2017
The Official Journal of the SOSMT
Annual Report 2018 (PDF, 4,7 MB)
Directive (EU) 2015/1535
Regulation No 764/2008/EC
Processing the Personal Data of the Persons Concerned (PDF, 201,7 kB)
Anti-Corruption Hotline (PDF, 221,0 kB)
© 2008-2020 ÚNMS SR. Webmaster: ELET | Departments of ÚNMS SR | Contacts


Is there a manual with specific steps on how to create an edublogs.org site?
Anyone know of a good plugin for audio, that can play a playlist of songs?
How can I use the framemarket layout with my pagelines theme?
How to Link to a URL that changes daily?
Deleting a plugin: what happens to the files?


text:
package org.apache.tomcat.websocket.pojo;

import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;

import javax.websocket.EncodeException;
import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;

import org.apache.tomcat.util.ExceptionUtils;
import org.apache.tomcat.websocket.WrappedMessageHandler;

/**
 * Common implementation code for the POJO message handlers.
 *
 * @param <T>   The type of message to handle
 */
public abstract class PojoMessageHandlerBase<T>
        implements WrappedMessageHandler {

    protected final Object pojo;
    protected final Method method;
    protected final Session session;
    protected final Object[] params;
    protected final int indexPayload;
    protected final boolean convert;
    protected final int indexSession;
    protected final long maxMessageSize;

    public PojoMessageHandlerBase(Object pojo, Method method,
            Session session, Object[] params, int indexPayload, boolean convert,
            int indexSession, long maxMessageSize) {
        this.pojo = pojo;
        this.method = method;
        // TODO: The method should already be accessible here but the following
        // code seems to be necessary in some as yet not fully understood cases.
        try {
            this.method.setAccessible(true);
        } catch (Exception e) {
            // It is better to make sure the method is accessible, but
            // ignore exceptions and hope for the best
        }
        this.session = session;
        this.params = params;
        this.indexPayload = indexPayload;
        this.convert = convert;
        this.indexSession = indexSession;
        this.maxMessageSize = maxMessageSize;
    }

    protected final void processResult(Object result) {
        if (result == null) {
            return;
        }

        RemoteEndpoint.Basic remoteEndpoint = session.getBasicRemote();
        try {
            if (result instanceof String) {
                remoteEndpoint.sendText((String) result);
            } else if (result instanceof ByteBuffer) {
                remoteEndpoint.sendBinary((ByteBuffer) result);
            } else if (result instanceof byte[]) {
                remoteEndpoint.sendBinary(ByteBuffer.wrap((byte[]) result));
            } else {
                remoteEndpoint.sendObject(result);
            }
        } catch (IOException ioe) {
            throw new IllegalStateException(ioe);
        } catch (EncodeException ee) {
            throw new IllegalStateException(ee);
        }
    }

    /**
     * Expose the POJO if it is a message handler so the Session is able to
     * match requests to remove handlers if the original handler has been
     * wrapped.
     */
    @Override
    public final MessageHandler getWrappedHandler() {
        if (pojo instanceof MessageHandler) {
            return (MessageHandler) pojo;
        } else {
            return null;
        }
    }

    @Override
    public final long getMaxMessageSize() {
        return maxMessageSize;
    }

    protected final void handlePojoMethodException(Throwable t) {
        t = ExceptionUtils.unwrapInvocationTargetException(t);
        ExceptionUtils.handleThrowable(t);
        if (t instanceof RuntimeException) {
            throw (RuntimeException) t;
        } else {
            throw new RuntimeException(t.getMessage(), t);
        }
    }
}


text:
2018 Geneva Motor Show Articles
Geneva Motor Show
Audi E-Tron Prototypes Show Up In Geneva
Reports suggest a driving range of 500 kilometers/311 miles, with two electric motors – one at the front, one at the back – to provide AWD.
By Jake Holmes 06 March 2018
Updated Mitsubishi Outlander PHEV Debuts In Geneva - Live Photos
Mitsubishi presents in Geneva its updated Outlander PHEV, which is the best selling plug-in hybrid in the world with ~ 150,000 sales.
SsangYong e-SIV EV Concept Hits The Stage In Geneva
Here's the SsangYong e-SIV EV concept - a C-segment all-electric SUV - unveiled at the 2018 Geneva Motor Show.
Honda Will Open Order Books For Urban EV In Early 2019
Honda re-confirmed at the Geneva Motor Show press conference that the production version of the all-electric Urban EV Concept is coming in 2019.
Nissan Says It's Selling 1 New LEAF Every 12 Minutes In Europe
Nissan starts the show in Geneva with news of new LEAF orders tsunami in Europe. The new LEAF is being sold every 12 minutes across Europe.
Nissan IMx KURO Electric Bows In Geneva
The electric crossover concept received a pioneering Brain-to-Vehicle (B2V) system that interprets signals from the driver's brain to assist with driving.
Rimac C_Two Debuts With 120-kWh Battery, 0-60 In 1.85 Seconds - Video
It boasts impressive specs, such as a 0 to 60 MPH time of just 1.85 seconds. That comes courtesy of its 1,914 HP and 2,300 newton-meters of torque.
By Eric Loveday 06 March 2018
Aston Martin Reveals Electric Lagonda Vision (w/video)
Aston says that a revitalized Lagonda is set to be the world's first luxury brand exclusively driven by zero-emission powertrain technologies.
By InsideEVs Editorial Team 06 March 2018
Jaguar I-Pace Priced From $70,495 U.S.
Jaguar has just announced that U.S. pricing for its electric I-Pace will start at a tick over $70,000. Optioned out, closer to $100,000.
By Chris Bruce 06 March 2018
Nissan Reveals Formula E Livery In Geneva
With alliance partner Renault leaving to focus on its Formula 1 efforts with its works team, Nissan will become the first Japanese manufacturer to race in FE.
By Motorsport.com 06 March 2018
Formula E Debuts Next-Generation Race Car In Geneva (Video)
"Not only is it striking on the eye, the performance and range show clear progress in terms of technological development in only four years.
IONITY Debuts 350 kW Ultra-Fast Charging Station
IONITY is set to unveil at the 2018 Geneva Motor Show a design concept of its 350 kW ultra-fast charging stations for Europe.
GFG Style And Envision Presents Sibylla Concept Electric Car
GFG Style and Envision announced an all-electric concept car - Sibylla, that will be unveiled at the 2018 Geneva Motor Show.
Smart EQ NightSky Special Edition Gets Optional Fast Charging
Apart from a new name, the Fortwo and the Forfour get visual makeovers and a fast-charging option, provided you live in Europe. Theses electric vehicles in the Mercedes-Benz lineup will wear the special designation "EQ." While we aren't expected to see the first models until at least 2020, Daimler has used that same badge for the first time on its new Smart Fortwo and Forfour special editions....
By Jeff Perez 05 March 2018
Mercedes-Benz To Unveil First Production EQ Electric In Geneva
Mercedes-Benz announced that it will unveil at the 2018 Geneva Motor Show, the first series-production model from the electric EQ brand.
Giugiaro Teases Electric Sedan Ahead Of Geneva Reveal
It has enough autonomous tech to render the steering wheel obsolete, but Giugiaro did not have the heart to get rid of it. A living legend, 79-year-old Giorgetto Giugiaro has worked its magic on a new concept car set to be displayed in a little over a month from today at the Geneva Motor Show. Last year at the same event, the three-seater Techrules Ren made an appearance with a turbine-hyb...
By Adrian Padeanu 14 February 2018


text:
Q: Switch Statement with range value I'm writing swtich javascript switch statement in JS file and figured out the problem whole day still cannot find the solution.
Here is my javascript file written in jQuery :
var percent = 20;
var widthbytes;
switch(percent)
{
case 0:
   widthbytes=0;
   break;
    case (percent > 10 && percent < 20):
   widthbytes=16;
   break;
    case (percent >=20 && percent < 30):
       widthbytes=30;
       break;
default:
       widthbytes=0;
       break;
}
average.width(widthbytes);

It always return to default instead of 30. Anything wrong with my codes ?

A: switch statement only check the value of variable and then give the result according to that value so your expression
case (percent > 10 && percent < 20):

return boolean value which is not not comparable to variable value. Use if-else to get the job done.

A: just make a bit change in your code.
 You have switch(percent)**in your code, only change for this ***switch(true)*.
The reason for that is because the switch statement return a boolean value, this is why we need they have the same comparation, i.e. boolean vrs boolean.
For example the case 10: return one value; true or false.

A: I can't see a problems with @Carlos Marin's answer. This works:-
var percent = 10; //test values-> 10, 11, 19, 20, 21, 29, 30
var widthbytes;

switch(true){
// case 0:
//    widthbytes=0;
//    break;
case (percent > 10 && percent < 20):
   widthbytes=16;
   break;
case (percent >=20 && percent < 30):
   widthbytes=30;
   break;
default:
   widthbytes=0;
   break;
}

console.log(widthbytes);

A: switch statements don't work like that. Your second case is checked like this: if (percent == (percent > 10 && percent < 20)) ..., which will not yield the desired result.
You could use an if / elseif / else construct:
if (percent === 0) {
  widthbytes = 0;
} else if (percent > 10 && percent < 20 {
  widthbytes = 16;
} else if (percent >= 20 && percent < 30 {
  widthbytes = 30;
} else {
  widthbytes = 0;
}

Or you could use a function that turns the ranges into constants:
function getRange(percent) {
  return Math.floor(percent/10);
}

switch(getRange(percent)) {
  case 10:
    widthbytes = 16;
    break;
  case 20:
    widthbytes = 30;
    break;
  default:
    widthbytes = 0;
}

Note that to get a cleaner implementation i assimilated your original case 0: into the default, since they both do the same thing. If that is not desirable, you need to change the getRange function to no longer return the same range for 0 as for any number between 0 and 10.

redpajama_set_name: RedPajamaStackExchange


Miguel is a master teacher of Chi Kung and Kundalini Yoga. I was a beginner in both areas when I took his courses and he demonstrated wonderful patience and skill, helping me learn postures and practices quickly and easily.
He also takes the time and effort to share the deeper wisdom and meaning within each training. Because of his depth of knowledge and unique approach, even advanced students would gain much from Miguel's courses. We are fortunate to have him in our Albuquerque community!
Empower your spinal cord for health!
It uses techniques developed by Dr. Thompson in 1973, Yin Yoga philosophy of Paulie Zink, and the practical application of Paul Grilley, Sarah Powers and Bernie Clark.
If you have an unexpected twinge in the lumbar, lower back, area; pain shooting down one leg, circling the hip or waist and traveling up the spine. If your trunk is tilted, have a lateral curvature or scoliosis of the spine. This class is for you!
The culture of theory and intellectual conversation is not practice. Participate in class and then evaluate the results.
Start by aligning and energizing! Come to a joyful class that will align and build body consciousness through breath and asana.
Initiate change in the alignment of your spine. Dedication and determination in your practice is the path to health and joy without pain. It should be remembered that basically the sacroiliac is responsible for most of the tension in the neck.
This is a major reason for the whiplash's notable resistance to purely localized treatment. In a pelvic tilt, with a scoliotic change in the spine, the curvature extends from the sacral bone to the base of the skull. And so it becomes obvious that if you treat the neck, without correcting the spinal curvature, you are not getting at the root of the problem.
Yin Yoga and Aroma Yoga.
Traditionally, all yoga systems were considered to be a preparation for the inner evolution and outer transformation for which Kundalini energy, is invariably a catalyst. In the context of life as we know it, in which true change is very rare, Yoga works amazingly quickly.
Yoga is not about mastering difficult-looking exercises. It's very user-friendly. Essentially, if you can breathe, you can do it!
If you are taking an anti-inflammatory drug like ibuprofen please open this link for more information.
The sacroiliac articulation is an amphiarthrodial joint, formed between the auricular surfaces of the sacrum and the ilium. The articular surface of each bone is covered with a thin plate of cartilage, thicker on the sacrum than on the ilium. These cartilaginous plates are in close contact with each other, and to a certain extent are united together by irregular patches of softer fibrocartilage, and at their upper and posterior part by fine interosseous fibers. In a considerable part of their extent, especially in advanced life, they are separated by a space containing a synovia-like fluid, and hence the joint presents the characteristics of a diarthrosis (several types of bone articulation permitting free motion in a joint).
In the absence of anterior pelvic support when the line of gravity moves anteriorly the innominates will tend to rotate cephalad (towards the head or anterior part) and laterally on the sacrum and caudad and laterally on the sacrum. The sacrotuberous ligament is loosened. The ligamentous balance is disturbed and the innominate bone will subluxate cephalad and laterally on the sacrum on an acetabular axis.
With the dysfunction in anterior rotation the Sacroiliac Joints will move cephalad and anteriorly relative to the acetabular (cup-shaped cavity at the base of the hipbone into which the ball-shaped head of the femur fits) axis causing an apparent lengthening of the legs. If the dysfunction is greater on one side the legs will appear to be of unequal length, but both will still appear longer than normal. The pelvis will be asymmetrical and the sacral base will be higher on one side and the sacrum may appear slightly twisted.
comfortable clothing & handkerchief; sheepskin is nice to have.
Meditation in Motion developed over 7,000 years ago.
This awareness gives rise to Traditional Chinese Medicine and Reiki.
The Way of the ARHAT, Turn pain into Joy!
and Reconditioning to achieve consciousness.
comfortable clothing and handkerchief; sheepskin is nice to have.


Almost to 9,000 Participants joined the second edition of the Techcombank Ho Chi Minh City International Marathon.
On December 2, 2018, nearly 9,000 athletes from 63 countries participated in the second edition of the Techcombank Ho Chi Minh City International Marathon. The event attracted professional athletes, corporate executives, local celebrities, local run clubs, and many first-time runners. Participants started in downtown Ho Chi Minh City at the historic Saigon Zoo and Botanical Garden and ran past key city landmarks including the Ho Chi Minh City Post Office, Saigon Opera House, and Ho Chi Minh City Hall. The marathon course crossed six districts on its way to the finish at the riverfront of Empire City in Thu Thiem, where runners were treated to stunning views of the Ho Chi Minh skyline.
Crossing the finish line first in a time of 02:20:20 and taking the $5,000 top prize was Geoffrey Birgen from Kenya. Second place with a prize of $2,500 went to Josphat Kiptanui Too Chobei from Kenya in a time of 02:23:47. Third place went to Peter Keter from Kenya who took home $1,500 with a time of 02:26:54. On the women's side, the top spot and $5,000 went to Peninah Kigen from Kenya in a time of 02:47:03. Mercy Jelimo Too from Kenya finished second in a time of 02:49:28 and collected $2,500 while Susan Jepkoech from Kenya rounded out the podium in a time of 02:53:10.
In addition to the marathon distance, a 21km, 10km and 5km (newly added this year) attracted thousands of experienced and many first-time runners. Over 82% of registrants across all distances were from Vietnam, with the oldest male and female finishers being 68.
Participants and the general public were also treated to a weekend of exciting activities at the Marathon Village at Empire City. Activities included a 1.5 km and 3 km (introduced this year) Kids Run, Marathon Village activities, live bands and DJs, drum performances and a Meet-the-Pros session, all designed to inspire individuals to embrace healthier lifestyles, overcome challenges and engage in our community.
This event also presented an opportunity for the running community to give to those less fortunate. For the Ho Chi Minh City Fund for the Poor and the Ho Chi Minh City Sports Talent Support Fund, the organizer donated VND 10,000 per km for every participant who completed their race within the cut-off time. In total 900 million were donated to these two wonderful charities. In addition to this, Techcombank Ho Chi Minh City International Marathon also donated 70 million to Newborns Vietnam.
Manulife is proud to return again this year as the Exclusive Sponsor of the exciting "Marathon Village. And with Revive and the 5km are both making their first appearance at this year's event and so is the "First Step Challenge" campaign. Organizers are taking their commitment to put on a race for all individuals one step further with a challenge to make exercise part of our daily life. Companies are being challenged to become 'First step Challenge Partners" encouraging employees to enter any of the race distances and run together.
Sunrise Events Vietnam was established in 2015 and is the exclusive licensee of the World Triathlon Corporation for IRONMAN 70.3 events in Vietnam. The vision of the company is to stage world-class endurance and transformative events that promote active, inspiring and healthy lifestyles for Vietnamese while establishing the country as one of premier sports tourism hubs in Asia. In addition to the TECHCOMBANK IRONMAN 70.3 Vietnam, the company also organizes the Techcombank Ho Chi Minh City International Marathon, the largest international running event in the country.
Techcombank pursues a proven, differentiated customer-centric business model with demonstrated success in implementing their ecosystem approach of partnering with anchor corporate clients such as leading real estate developers, airlines, and utility companies. The Bank's unique value proposition, tailored products, and market leading quality of service allows them to capture a high-quality retail customer base of affluent and mass-affluent Vietnamese which delivers the highest risk-adjusted returns.


ZENITH.AERO is an online community for active Zenith aircraft builders and flyers, and is to promote this very worthwhile and rewarding hobby. While independent of Zenith Aircraft Company and Zenair, we welcome their active participation and support, as well as contributions from other professionals.
As an online community we rely on your active participation. We require that members be friendly and courteous with their posts, and be respectful of fellow members (there are already too many unmoderated internet mail lists full of unreliable information from dubious sources). Please report any abuses to us, and contact us with your suggestions and comments.
Please read the posted rules of zenith.aero, as well as the FAQ - Frequently Asked Questions, and please contact us if you have any suggestions, questions or concerns. We want to make this a fun and useful site for Zenith aircraft builders and flyers.
Last updated by Zenith.Aero Jul 6, 2012.


text:
HomeTrendingWhat happened to Glee Star Naya Rivera
What happened to Glee Star Naya Rivera
Nene July 11, 2020
Naya Rivera, 33-year old Glee star presumed dead after boat trip with son.
Glee star Naya Rivera who played 'satana' is dead(allegedly) after her four-year-old son was found alone in a boat on a lake in Southern California.
The 33-year-old rented the boat on Wednesday afternoon at Lake Piru, north-west of Los Angeles, the Ventura County Sheriff's office said.
Ongoing search to find the actress is still active. Naya Rivera is best known for playing cheerleader Santana Lopez in Glee. The musical comedy TV series ran on the Fox network from 2009 to 2015.
Sadly she now falls among the Top Glee Stars who have died. See others here See Now
What Happened to Naya in the Boat Incident?
Rivera's child was spotted by another boater three hours after the actress had taken the boat, CBS Los Angeles reports, quoting the sheriff's office.
It says the boy told investigators that he and his mother were swimming - but she never got back into the boat.
The missing person was later formally identified as Naya Rivera, a Los Angeles resident.
The sheriff's department said the lake would be closed to the public as the search resumed on Thursday, with dive teams from across the region taking part.
On Thursday, Officer Chris Dyer of the Ventura County Sheriff's office said that authorities would be "switching efforts" to a search and recovery operation.
"We're presuming that an accident happened, we're presuming that she drowned in the lake," he said. "There are no signs of foul play, no signs that anything went wrong, besides a tragic accident."
Over 80 professional search-and-rescue personnel are still actively searching for Rivera, using helicopters, boats, and ground teams, police said.
"The goal is still to bring Ms Rivera home to her family so they can have some closure," Mr Dyer said.
Sadly, just on Tuesday, Rivera posted a picture of herself and her son with a caption "just the two of us" on IG.
https://www.instagram.com/p/CCW3bLhAUCt/?utm_source=ig_web_copy_link
So many celebrities have called for prayers for the missing actress, including singer Demi Lovato and Harry Shum Jr, who also played Mike Chang in Glee.
Other stars, Heather Morris, wrote in her Instagram story: "We need all the prayers we can get to bring our Naya back home to us. We need your love and light."
Jackée Harry, who appeared in the sitcom The Royal Family, posted a clip of her acting alongside Rivera.
"Please God, don't cut this life short," she said.
https://twitter.com/JackeeHarry/status/1281100302121177088?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1281100302121177088%7Ctwgr%5E&ref_url=https%3A%2F%2Fwww.bbc.com%2Fnews%2Fworld-us-canada-53345696
Another Star Lost So Sad! Please leave your comments Down below
How to Tell if You're in Love


text:
Carriera

Arbitro
Subito dopo la laurea conseguita all'università di Tokyo entrò in contatto con l'ambiente calcistico come calciatore (fu scelto per far parte della prima rosa dello Yomiuri, giocandovi come centrocampista sino alla stagione 1973) e, contemporaneamente, come arbitro di quarta divisione. In seguito al passaggio in seconda divisione avvenuto nel 1976 abbandonò l'attività di calciatore per concentrarsi esclusivamente nella carriera arbitrale: approdato in prima divisione nel 1980, fino al 1992 divenne uno degli arbitri principali della Japan Soccer League mantenendo l'incarico anche dopo l'avvento del professionismo nel calcio giapponese.

Arbitro internazionale dal 1984, fu convocato dalla FIFA per i Mondiali del 1986 e del 1990, dove diresse due incontri. Ha avuto modo di dirigere anche delle gare alle Olimpiadi di Seul e dell'edizione 1990 della Coppa d'Africa.

Dirigente
Ritiratosi dall'attività arbitrale nel 1994, nel 1996 assunse l'incarico di dirigente nel comitato arbitri della Japan Football Association (di cui è stato nominato presidente onorario nel 2006) per poi passare, nel 1998, al medesimo ruolo nella AFC.

Note

Voci correlate
Yoshiyuki Maruyama
Masayoshi Okada
Tōru Kamikawa

Collegamenti esterni

redpajama_set_name: RedPajamaWikipedia


How Can the Bathroom Fitters Lend You a Hand?
Install new furniture, add decorations, and/or paint the bathroom.
Setting-up anything else you need.
Keep in mind: We need to disconnect any and all bathroom furniture and accessories before commencing work. The removed possessions can then be either re-connected or disposed of in a responsible manner.
Tape measures & hand tools.
The building materials that we can cover range from wall boards and plaster to fixings and various plumbing & electrical materials. We also take the issue of safety very seriously and have provided each bathroom fitter with special protective clothing to avoid any accidents. In addition to all of the above, we could also use our partnership with a well-established hardware store brand to order bathroom accessories, furniture, and tiles at up to a 20% reduced bathroom fitting cost! Of course, if you happened to buy everything in advance, we'll be more than pleased to help you install your shower fitting purchases instead.
Solve Your Conundrum Today – Hire Bathroom Fitting Croydon!
If you're a homeowner who's looking for new ways to make your property interesting, or a landlord who's about to change tenants, don't worry – this shower installation Croydon service will provide you with all the assistance you need. Just get in touch with any of the outgoing tradesmen and list everything that you wish to see in your new bathroom. We'll then arrange for a survey and instantly provide you with a preliminary quote. Call us on 020 3746 5384 or contact us through our form or instant chat today to completely re-imagine your bathroom in a single session!


text:
import pytest

from tests.lib import (
    _change_test_package_version, _create_test_package, pyversion,
)
from tests.lib.local_repos import local_checkout

def _install_version_pkg(script, path, rev=None):
    """
    Install the version_pkg package, and return the version installed.

    Args:
      path: a tests.lib.path.Path object pointing to a Git repository
        containing the package.
      rev: an optional revision to install like a branch name or tag.
    """
    path = path.abspath.replace('\\', '/')
    revision = '' if rev is None else '@{}'.format(rev)
    url = 'git+file://{}{}#egg=version_pkg'.format(path, revision)
    script.pip('install', '-e', url)
    result = script.run('version_pkg')
    version = result.stdout.strip()

    return version

def test_git_install_again_after_changes(script):
    """
    Test installing a repository a second time without specifying a revision,
    and after updates to the remote repository.

    This test also checks that no warning message like the following gets
    logged on the update: "Did not find branch or tag ..., assuming ref or
    revision."
    """
    version_pkg_path = _create_test_package(script)
    version = _install_version_pkg(script, version_pkg_path)
    assert version == '0.1'

    _change_test_package_version(script, version_pkg_path)
    version = _install_version_pkg(script, version_pkg_path)
    assert version == 'some different version'

def test_git_install_branch_again_after_branch_changes(script):
    """
    Test installing a branch again after the branch is updated in the remote
    repository.
    """
    version_pkg_path = _create_test_package(script)
    version = _install_version_pkg(script, version_pkg_path, rev='master')
    assert version == '0.1'

    _change_test_package_version(script, version_pkg_path)
    version = _install_version_pkg(script, version_pkg_path, rev='master')
    assert version == 'some different version'

@pytest.mark.network
def test_install_editable_from_git_with_https(script, tmpdir):
    """
    Test cloning from Git with https.
    """
    result = script.pip(
        'install', '-e',
        '%s#egg=pip-test-package' %
        local_checkout(
            'git+https://github.com/pypa/pip-test-package.git',
            tmpdir.join("cache"),
        ),
        expect_error=True,
    )
    result.assert_installed('pip-test-package', with_files=['.git'])

@pytest.mark.network
def test_install_noneditable_git(script, tmpdir):
    """
    Test installing from a non-editable git URL with a given tag.
    """
    result = script.pip(
        'install',
        'git+https://github.com/pypa/pip-test-package.git'
        '@0.1.1#egg=pip-test-package'
    )
    egg_info_folder = (
        script.site_packages /
        'pip_test_package-0.1.1-py%s.egg-info' % pyversion
    )
    result.assert_installed('piptestpackage',
                            without_egg_link=True,
                            editable=False)
    assert egg_info_folder in result.files_created, str(result)

@pytest.mark.network
def test_git_with_sha1_revisions(script):
    """
    Git backend should be able to install from SHA1 revisions
    """
    version_pkg_path = _create_test_package(script)
    _change_test_package_version(script, version_pkg_path)
    sha1 = script.run(
        'git', 'rev-parse', 'HEAD~1',
        cwd=version_pkg_path,
    ).stdout.strip()
    script.pip(
        'install', '-e',
        '%s@%s#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/'), sha1),
        expect_stderr=True
    )
    version = script.run('version_pkg')
    assert '0.1' in version.stdout, version.stdout

@pytest.mark.network
def test_git_with_branch_name_as_revision(script):
    """
    Git backend should be able to install from branch names
    """
    version_pkg_path = _create_test_package(script)
    script.run(
        'git', 'checkout', '-b', 'test_branch',
        expect_stderr=True,
        cwd=version_pkg_path,
    )
    _change_test_package_version(script, version_pkg_path)
    script.pip(
        'install', '-e', '%s@test_branch#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/'))
    )
    version = script.run('version_pkg')
    assert 'some different version' in version.stdout

@pytest.mark.network
def test_git_with_tag_name_as_revision(script):
    """
    Git backend should be able to install from tag names
    """
    version_pkg_path = _create_test_package(script)
    script.run(
        'git', 'tag', 'test_tag',
        expect_stderr=True,
        cwd=version_pkg_path,
    )
    _change_test_package_version(script, version_pkg_path)
    script.pip(
        'install', '-e', '%s@test_tag#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/'))
    )
    version = script.run('version_pkg')
    assert '0.1' in version.stdout

@pytest.mark.network
def test_git_with_ref_as_revision(script):
    """
    Git backend should be able to install from a ref
    """
    version_pkg_path = _create_test_package(script)
    script.run(
        'git', 'update-ref', 'refs/foo/bar', 'HEAD',
        expect_stderr=True,
        cwd=version_pkg_path,
    )
    _change_test_package_version(script, version_pkg_path)
    script.pip(
        'install', '-e', '%s@refs/foo/bar#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/')),
        expect_stderr=True
    )
    version = script.run('version_pkg')
    assert '0.1' in version.stdout

@pytest.mark.network
def test_git_with_tag_name_and_update(script, tmpdir):
    """
    Test cloning a git repository and updating to a different version.
    """
    result = script.pip(
        'install', '-e', '%s#egg=pip-test-package' %
        local_checkout(
            'git+https://github.com/pypa/pip-test-package.git',
            tmpdir.join("cache"),
        ),
        expect_error=True,
    )
    result.assert_installed('pip-test-package', with_files=['.git'])
    result = script.pip(
        'install', '--global-option=--version', '-e',
        '%s@0.1.2#egg=pip-test-package' %
        local_checkout(
            'git+https://github.com/pypa/pip-test-package.git',
            tmpdir.join("cache"),
        ),
        expect_error=True,
    )
    assert '0.1.2' in result.stdout

@pytest.mark.network
def test_git_branch_should_not_be_changed(script, tmpdir):
    """
    Editable installations should not change branch
    related to issue #32 and #161
    """
    script.pip(
        'install', '-e', '%s#egg=pip-test-package' %
        local_checkout(
            'git+https://github.com/pypa/pip-test-package.git',
            tmpdir.join("cache"),
        ),
        expect_error=True,
    )
    source_dir = script.venv_path / 'src' / 'pip-test-package'
    result = script.run('git', 'branch', cwd=source_dir)
    assert '* master' in result.stdout, result.stdout

@pytest.mark.network
def test_git_with_non_editable_unpacking(script, tmpdir):
    """
    Test cloning a git repository from a non-editable URL with a given tag.
    """
    result = script.pip(
        'install', '--global-option=--version',
        local_checkout(
            'git+https://github.com/pypa/pip-test-package.git@0.1.2'
            '#egg=pip-test-package',
            tmpdir.join("cache")
        ),
        expect_error=True,
    )
    assert '0.1.2' in result.stdout

@pytest.mark.network
def test_git_with_editable_where_egg_contains_dev_string(script, tmpdir):
    """
    Test cloning a git repository from an editable url which contains "dev"
    string
    """
    result = script.pip(
        'install', '-e',
        '%s#egg=django-devserver' %
        local_checkout(
            'git+git://github.com/dcramer/django-devserver.git',
            tmpdir.join("cache")
        )
    )
    result.assert_installed('django-devserver', with_files=['.git'])

@pytest.mark.network
def test_git_with_non_editable_where_egg_contains_dev_string(script, tmpdir):
    """
    Test cloning a git repository from a non-editable url which contains "dev"
    string
    """
    result = script.pip(
        'install',
        '%s#egg=django-devserver' %
        local_checkout(
            'git+git://github.com/dcramer/django-devserver.git',
            tmpdir.join("cache")
        ),
    )
    devserver_folder = script.site_packages / 'devserver'
    assert devserver_folder in result.files_created, str(result)

@pytest.mark.network
def test_git_with_ambiguous_revs(script):
    """
    Test git with two "names" (tag/branch) pointing to the same commit
    """
    version_pkg_path = _create_test_package(script)
    package_url = (
        'git+file://%s@0.1#egg=version_pkg' %
        (version_pkg_path.abspath.replace('\\', '/'))
    )
    script.run('git', 'tag', '0.1', cwd=version_pkg_path)
    result = script.pip('install', '-e', package_url)
    assert 'Could not find a tag or branch' not in result.stdout
    # it is 'version-pkg' instead of 'version_pkg' because
    # egg-link name is version-pkg.egg-link because it is a single .py module
    result.assert_installed('version-pkg', with_files=['.git'])

@pytest.mark.network
def test_git_works_with_editable_non_origin_repo(script):
    # set up, create a git repo and install it as editable from a local
    # directory path
    version_pkg_path = _create_test_package(script)
    script.pip('install', '-e', version_pkg_path.abspath)

    # 'freeze'ing this should not fall over, but should result in stderr output
    # warning
    result = script.pip('freeze', expect_stderr=True)
    assert "Error when trying to get requirement" in result.stderr
    assert "Could not determine repository location" in result.stdout
    assert "version-pkg==0.1" in result.stdout

@pytest.mark.network
def test_reinstalling_works_with_editible_non_master_branch(script):
    """
    Reinstalling an editable installation should not assume that the "master"
    branch exists. See https://github.com/pypa/pip/issues/4448.
    """
    version_pkg_path = _create_test_package(script)

    # Switch the default branch to something other than 'master'
    script.run('git', 'branch', '-m', 'foobar', cwd=version_pkg_path)

    script.pip(
        'install', '-e',
        '%s#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/')),
    )
    version = script.run('version_pkg')
    assert '0.1' in version.stdout

    _change_test_package_version(script, version_pkg_path)
    script.pip(
        'install', '-e',
        '%s#egg=version_pkg' %
        ('git+file://' + version_pkg_path.abspath.replace('\\', '/')),
    )
    version = script.run('version_pkg')
    assert 'some different version' in version.stdout