text:
Victoria Grizzlies
Westshore Rebels
BCFC
Victoria Shamrocks
Best of the West Shore
A Day in the Life West Shore
Women of the West Shore
VIDEO: Prince Harry takes on first duties since royal crisis talks
Britain's Press Association says Duke of Sussex to carry on meetings into next week
Britain's Prince Harry gestures next to Rugby League World Cup 2021 ambassador James Simpson in the gardens at Buckingham Palace in London, Thursday, Jan. 16, 2020. (AP Photo/Kirsty Wigglesworth)
Prince Harry went back to work Thursday, taking on his first royal duties since a pivotal summit with Queen Elizabeth II on his future role in the royal family.
Harry is expected to carry on as normal, with no immediate plans to be reunited with his wife Meghan, who travelled to Canada after the couple released a bombshell statement last week announcing their wish to step back from royal duties. He is set to carry on meetings into next week, Britain's Press Association reported.
The monarch brokered a deal on Monday that determined there would be "a period of transition" to sort out the complicated matter of how to be a part-time royal. Meghan and Harry will spend time in both Canada and the U.K. as things are sorted out.
In his first engagement since the crisis emerged, Harry will host the Rugby League World Cup 2021 draw at Buckingham Palace.
In the meantime, he has released two video statements on causes he has long championed: mental health and the Invictus Games.
In the first video, he introduced a new initiative to champion the importance of mental health for those who play rugby. The initiative aims to combine sport with mental health awareness at a time when suicide is the leading cause of death for men between the ages of 20 and 49 in the UK.
In footage posted on the Sussexroyal Instagram page, he also launched the next leg of the Invictus Games for wounded service personnel and veterans. The event will be held in Dusseldorf in 2022.
ALSO READ: Queen agrees to let Harry, Meghan move part-time to Canada
"I hope everyone in Germany is ready for what will be an incredible week of sport!" Harry said. "I have no doubt that the German public will get right behind these games and that every single competitor can expect a warm welcome and an amazing atmosphere."
Dog on 'death row' to be euthanized after B.C. owner loses last bid to appeal
Meth package shot into B.C. prison with bow and arrow
Explore Goldstream News Gazette
Goldstream News
Goldstream Weather
Goldstream Classifieds
© 2020, Goldstreaml News and Black Press Group Ltd.


text:
Q: Connect signal - handler created outside class I'm following the tutorial at https://docs.godotengine.org/en/stable/getting_started/step_by_step/your_first_game.html.
I am at the part where I connect my Area2d to the OnPlayerBodyEntered handler via the godot ui and for some reason it keeps creating it inside the namespace but outside the class.
How can I either get the ui to put the handler in the right place (inside the class) OR connect the handler another way?
UPDATE: I see at https://docs.godotengine.org/en/latest/getting_started/step_by_step/signals.html it is possible to add event handlers stricly via code.
My updated question is:
Am I doing something wrong when I try to add a connection or is this a known bug with the Godot editor?

redpajama_set_name: RedPajamaStackExchange


text:
Q: Convergence of variance and mean of weighted sums of random variables Let $c_n$ be a sequence of positive real numbers such that
$$\sum^{\infty}_{n=1}{c_n} = \infty, \qquad \sum^{\infty}_{n=1}{c_n^2} < \infty.$$
Let $X_n$ be a family of i.i.d random variables with $\mathbb{E}(X_n) = 0$ and $\sigma^2(X_n) = 1$ for each $n$, and define the random variable
$$X = \sum^{\infty}_{n=1}{c_n X_n}.$$
Is it true that
$$\mathbb{E}(X) = \sum^{\infty}_{n=1}{\mathbb{E}(c_n X_n)} = 0$$
and
$$\sigma^2(X) = \sum^{\infty}_{n=1}{\sigma^2(c_n X_n)} = \sum^{\infty}_{n=1}{c_n^2}?$$
If so, how does one prove this (and where is a source, if possible)? If not, what counterexamples exist?

A: It is easy to see that $\sum c_i X_i$ converges in $L^2$.  (For any $n \le m$, we have $E\left(\sum_{i=n}^m c_i X_i\right)^2 = \sum_{i=n}^m c_i^2$ by independence.  As $n,m \to \infty$ this goes to 0, since $\sum c_i^2$ converges, so $\sum c_i X_i$ is $L^2$-Cauchy.)
It follows that the mean and variance of $X$, the $L^2$ limit of the sum, are as desired (0 and $\sum c_i^2$ respectively), since mean and variance are continuous with respect to $L^2$.
Edit: Thanks to commenters for pointing out why almost sure convergence also follows.

A: Seems like Lévy's continuity theorem is useful in this case. Let $\varphi(t) = E(e^{itX_j})$ and $g(t) = \log\varphi(t)$. We first show that $\widetilde{\varphi}(t) := \prod_j \varphi(c_jt) = \prod_j E(e^{itc_jX_j})$ converges pointwise. As $E(X_j)=0$ and ${\rm Var}(X_j)=1$, we have $(*): g(t)=-\frac12t^2 + o(t^2)$. Therefore, for any fixed $t$ and any $\epsilon>0$, we have $\left|g(c_jt)+\frac12c_j^2t^2\right| < \epsilon c_j^2t^2$ when $c_j$ is small. Now, as $A:=\sum_j c_j^2<\infty$, when $N$ is large, we get $\sum_{j=N}^\infty c_j^2<\epsilon$ and also every $c_j$ with $j\ge N$ will be small. So, if $N\le m\le n$,
$$
\left|\sum_{j=m}^n \left(g(c_j t) + \frac12 c_j^2t^2\right)\right|
\le\sum_{j=m}^n\epsilon c_j^2t^2
<\epsilon At^2.
$$
Thus $\left\{\sum_{j=1}^n \left(g(c_j t) + \frac12 c_j^2t^2\right)\right\}$ is a Cauchy sequence and we conclude that $\sum_j g(c_jt)$ and hence $\prod_j \varphi(c_jt)$ converge pointwise.
Next we show that $\widetilde{\varphi}$ is continuous at zero. Consider $\widetilde{g}(t) := \sum_j g(c_j t)$. Apply (*) again, we see that for any $\epsilon>0$, if $t$ is small, we have $\left|g(t)+\frac12t^2\right| < \epsilon t^2$ and in turn
$$
\left|\widetilde{g}(t)+\frac12At^2\right|
= \left|\sum_jg(c_jt)+\sum_j\frac12c_j^2t^2\right| < \epsilon At^2.
$$
Hence $\widetilde{g}(t) = -\frac12At^2+o(t^2)$. In particular, it is continuous at zero. So $\widetilde{\varphi}(t) = e^{\widetilde{g}(t)}$ is also continuous at $0$.
Therefore, by Lévy's continuity theorem, $X=\sum_j c_jX_j$ converges in distribution and $\widetilde{\varphi}, \widetilde{g}$ are resp. the characteristic function and cumulant generating function of $X$. Since $\widetilde{g}(t) = -\frac12 At^2 + o(t^2)$, we conclude that $E(X)=0$ and ${\rm Var}(X)=A$.


text:
Q: Confused about subspaces of functions I find that subspaces of vectors makes sense, but I'm having trouble with the following problem involving a function:
Let $a$ be a real number and consider the following subset of $C[-1,1]$:
   $$F := \{f(x) \in C[-1,1]: f(0) = a\} $$
For which values of $a$ is $F$ a subspace of $C[-1,1]$? If $F$ is a subspace, prove it.
I am really confused on how to solve this. I understand that with vectors, one criteria for being a subspace is containing the zero vector. Would this be the same as this function needing to go through the origin so that $f(0)=0$? Thank you!

A: The zero vector of your space is the function $x \mapsto 0$. We know that it must be contained in that set in order for it to be a subspace. And since this set contains functions $f$ only such that $f(0) = a$ we have that $a$ must be $0$ in order for it to be a candidate subspace.
Now is it really a subspace? Yes because not only the zero vector is there but also for all vectors $f,g$ and any scalar $\lambda$ we have
$$ (f + g)(0) = f(0) + g(0) = 0 \implies f+g \in F$$
$$ (\lambda f)(0) = \lambda f(0) = 0 \implies \lambda f \in F $$
Hence $F$ is subspace only if $a=0$.


text:
Q: using Bonmin Counne and Ipopt for NLP I want to just be sure that I am eligible to use Bonmin and Couenne for solving just the NLP problem (Still I do not have integer variable) and I am eager to obtain global optimum not local. I also read that Ipopt first search for the global answer and if it does not find that it will provide a local answer. How I can understand my answer is a global answer when I using Ipopt. Also, I want to what is the best NLP and MINLP open source pythonic solvers for these issues that can be merged with Pyomo?
The main reason for my question is the following output using Bonmin:
NOTE: You are using Ipopt by default with the MUMPS linear solver.
Other linear solvers might be more efficient (see Ipopt documentation).
Regards

A: Some notes:
(1) "Ipopt first search for the global answer and if it does not find that it will provide a local answer"  This is probably not how I would phrase it. IPOPT finds local solutions. For some problems these will be the global solution. For convex problems, this is always the case (except for numerical issues).
(2) Bonmin is a local MINLP solver, Couenne is a global NLP/MINLP solver. Typically Bonmin can solve larger problems than Couenne, but you get local solutions.
(3) "NOTE: You are using Ipopt by default with the MUMPS linear solver. Other linear solvers might be more efficient (see Ipopt documentation)."  This is just a notification that you are using IPOPT with linear algebra routines from MUMPS. There are other linear sub-solvers that IPOPT can use and that may perform better on large problems. Often the HARWELL routines (typically called MAnn) give better performance. MUMPS is free while the Harwell routines require a license.

In a follow-up answer (well it is not answer at all) it is stated:

Regarding Ipopt how I can understand that it is finding the global
  solution or local optimum? the code will notify that? Regarding to
  Bonmin according to AMPL page AMPL It provides the global solution for
  the convex problem " Finds globally optimal solutions to convex
  nonlinear problems in continuous and discrete variables, and may be
  applied heuristically to nonconvex problems." And you were saying that
  it is obtained the local solution, I am a bit confused on this part.
  But the general question about all those codes is that how I can find
  out that the answer is global optimum?

(a) Ipopt does not know if a solution is a local or a global optimal solution. For convex problems a local optimum is a global optimal solution. You will need to convince yourself the problem you pass on to Ipopt is convex (Ipopt will not do this for you).
(b) Bonmin: the same: if the problem is convex it will find global solutions. Otherwise you will get a local solution. You will get no notification whether a solution is a global solution: Bonmin does not know if a solution is a global optimum.
(c) When looking for guaranteed global solutions you can use a local solver only when the problem is convex. For other problems you need a global solver. Another approach is to use a multi-start algorithm with a local solver. That gives you confidence that you are not ending up with a bad local optimum.
If possible, I suggest to discuss this with your teacher. These concepts are important to understand (and most solver manuals assume you know about them).


Gabicci Vintage 'Lineker' Men's Mod knitted polo shirt in navy with stylish Retro sky blue tipping. The 'Lineker' knitted polo top is a staple within the Gabicci Vintage range and features contrast tipping to the collar and 3 button placket. Finished with the traditional Gabicci Vintage 'G' emblem to the chest, the 'Lineker' knitted polo shirt really hits the back of the net in terms of style!
- Gabicci Vintage 'Lineker' men's 60s mod knitted polo shirt in navy.
- Retro sky blue tipping to the collar and the placket.
- Gabicci Vintage 'G' emblem to the chest.
- SKU: V39GM09 Lineker Knitted Polo Shirt.


text:
Manama, June 21 (BNA): The Central Bank of Bahrain (CBB) announced that the monthly issue of the Sukuk Al-Salam Islamic securities has…
Lucie Lapovsky , CONTRIBUTOR I write about strategic financial issues in higher education. Opinions expressed by Forbes Contributors are their own. Shutterstock…
b8ta store in San Francisco b8ta store in San Francisco Amid the carnage in brick-and-mortar retail and a juggernaut called Amazon that's…
The defining feature of the new perceptive stage is that the work involved in interacting with government will be significantly reduced and…
The move from active investing to passive has been a hot topic lately. Fund flows show that investors are voting with their…
Moody's: Islamic banks' strong liquidity driven by retail strengths and gov Sukuk availability
Moody's Investors Service says that the liquidity coverage ratios (LCRs) of Islamic banks in key Asian and Gulf Cooperation Council (GCC) countries…
Dubai to host Islamic economy summit
The third edition of the Global Islamic Economy Summit is scheduled for October 11 and 12. The event will discuss compliance with…
Saudi-based development bank issues RM350mil sukuk
KUALA LUMPUR: Saudi Arabia-based Islamic Development Bank (IsDB), whose shareholders comprise the 57 member countries of the Organisation of Islamic Cooperation, has…
Saudi Arabia Economic and Construction Industry Outlook and 5 Year Forecast 2012-2016
Market research, overview, SWOT analysis and 5 Year forecast for the Saudi Arabia economy and construction industry. Economic overview, analysis and forecasts…
KSA's first Hampton by Hilton to open in 2018
Hilton Worldwide has signed a management agreement that will see the hotel debut in the Kingdom of Saudi Arabia. Hampton by Hilton…

redpajama_set_name: RedPajamaCommonCrawl


text:
Moto G Play (2021) Allegedly Listed on Google Play Console, Tipping Snapdragon 460 SoC, 6.5-Inch Display
Moto G Play (2021) is said to have been spotted in a Google Play Console listing, which includes some specifications and an image of the phone from the front. The phone is said to be powered by Snapdragon 460 SoC and come with a notched selfie camera. The bezels are relatively thick all around. However, at this point it is unclear if this is the image of the Moto G Play (2021) or just a placeholder. The phone was allegedly spotted in a Geekbench listing last month that also suggested the presence of Snapdragon 460 SoC.
As per a tweet from tipster '@TTechinical", a phone called Moto G Play (2021) has been spotted in a Google Play Console listing with some specifications and an image. The phone is said to be powered by Snapdragon 460 SoC (SM4350) and Adreno 610 GPU, and come with 3GB RAM or at least have a variant with 3GB RAM. It is expected to run Android 10. Moto G Play (2021) is said have a 720x1,600 pixels display with 280ppi pixel density. The tipster adds that it will feature a 6.5-inch display.
Coming to the image in the listing, it shows a phone with a notch for the selfie camera, relatively thick bezels on the side and an even thicker chin. The power and volume buttons are on the right side. However, this could just be a placeholder image and not a picture of the actual Moto G Play (2021).
The Best Mobile Phones Under Rs. 10,000 in India [December 2020 Edition]
Last month, a phone believed to be the Moto G Play (2021) was spotted in a Geekbench listing with Snapdragon 460 SoC and 3GB of RAM. It scored 253 in single-core and 1,233 in multi-core tests. Earlier in November, known tipster Steve Hemmerstoffer, aka OnLeaks, shared a render of a Motorola phone allegedly called Motorola Moto G10 Play, but Hemmerstoffer had said that the name had not been confirmed. So, it is possible that the renders shared by him were of the rumoured Moto G Play (2021). If this turns out to be true, the phone will look quite different from the image in the Google Play Console listing.
Is OnePlus 8T the best "value flagship" of 2020? We discussed this on Orbital, our weekly technology podcast, which you can subscribe to via Apple Podcasts, Google Podcasts, or RSS, download the episode, or just hit the play button below.
Motorola Moto G Phone Codenamed 'Nio' Could Have Dual Selfie Cameras


text:
package com.mapswithme.maps.widget.placepage;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.mapswithme.maps.Framework;
import com.mapswithme.maps.R;
import com.mapswithme.maps.ads.CompoundNativeAdLoader;
import com.mapswithme.maps.ads.DefaultAdTracker;
import com.mapswithme.maps.ads.MwmNativeAd;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.bookmarks.data.RoadWarningMarkType;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.location.LocationListener;
import com.mapswithme.maps.promo.Promo;
import com.mapswithme.maps.purchase.AdsRemovalPurchaseControllerProvider;
import com.mapswithme.util.Graphics;
import com.mapswithme.util.NetworkPolicy;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import com.mapswithme.util.statistics.PlacePageTracker;
import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior;

public class BottomSheetPlacePageController implements PlacePageController, LocationListener,
                                                       View.OnLayoutChangeListener,
                                                       BannerController.BannerStateRequester,
                                                       BannerController.BannerStateListener,
                                                       PlacePageButtonsListener,
                                                       Closable
{
  private static final float ANCHOR_RATIO = 0.3f;
  private static final float PREVIEW_PLUS_RATIO = 0.5f;
  private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
  private static final String TAG = BottomSheetPlacePageController.class.getSimpleName();
  private static final String EXTRA_MAP_OBJECT = "extra_map_object";
  private static final int ANIM_BANNER_APPEARING_MS = 300;
  private static final int ANIM_CHANGE_PEEK_HEIGHT_MS = 100;
  @NonNull
  private final Activity mActivity;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private AnchorBottomSheetBehavior<View> mPlacePageBehavior;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private View mButtonsLayout;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private PlacePageView mPlacePage;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private PlacePageTracker mPlacePageTracker;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private Toolbar mToolbar;
  private int mViewportMinHeight;
  private int mCurrentTop;
  private boolean mPeekHeightAnimating;
  private int mOpenBannerTouchSlop;
  /**
   * Represents a value that describes how much banner details are opened.
   * Must be in the range [0;1]. 0 means that the banner details are completely closed,
   * 1 - the details are completely opened.
   */
  private float mBannerRatio;
  @SuppressWarnings("NullableProblems")
  @NonNull
  private BannerController mBannerController;
  @NonNull
  private final AdsRemovalPurchaseControllerProvider mPurchaseControllerProvider;
  @NonNull
  private final SlideListener mSlideListener;
  @NonNull
  private final GestureDetectorCompat mGestureDetector;
  @Nullable
  private final RoutingModeListener mRoutingModeListener;
  @NonNull
  private final AnchorBottomSheetBehavior.BottomSheetCallback mSheetCallback
      = new AnchorBottomSheetBehavior.BottomSheetCallback()

  {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int oldState, int newState)
    {
      LOGGER.d(TAG, "State change, new = " + BottomSheetPlacePageController.toString(newState)
                    + " old = " + BottomSheetPlacePageController.toString(oldState)
                    + " placepage height = " + mPlacePage.getHeight());
      if (isSettlingState(newState) || isDraggingState(newState))
      {
        return;
      }

      if (isHiddenState(newState))
      {
        onHiddenInternal();
        return;
      }

      setPullDrawable();

      if (isAnchoredState(newState) || isExpandedState(newState))
      {
        mBannerController.onPlacePageStateChanged();
        mPlacePageTracker.onDetails();
        return;
      }

      mBannerController.onPlacePageStateChanged();
      setPeekHeight();
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset)
    {
      mSlideListener.onPlacePageSlide(bottomSheet.getTop());
      mPlacePageTracker.onMove();

      if (slideOffset < 0)
        return;

      updateViewPortRect();

      resizeBanner();
    }
  };

  private void onHiddenInternal()
  {
    Framework.nativeDeactivatePopup();
    updateViewPortRect();
    UiUtils.invisible(mButtonsLayout);
    mPlacePageTracker.onHidden();
  }

  private void setPullDrawable()
  {
    @AnchorBottomSheetBehavior.State
    int state = mPlacePageBehavior.getState();
    @DrawableRes
    int drawableId = UiUtils.NO_ID;
    if (isCollapsedState(state))
      drawableId = R.drawable.ic_disclosure_up;
    else if (isAnchoredState(state) || isExpandedState(state))
      drawableId = R.drawable.ic_disclosure_down;

    if (drawableId == UiUtils.NO_ID)
      return;

    ImageView img = mPlacePage.findViewById(R.id.pull_icon);
    Drawable drawable = Graphics.tint(mActivity, drawableId, R.attr.bannerButtonBackgroundColor);
    img.setImageDrawable(drawable);
  }

  private void resizeBanner()
  {
    int lastTop = mCurrentTop;
    mCurrentTop = mPlacePage.getTop();

    if (!mBannerController.hasAd())
      return;

    int bannerMaxY = calculateBannerMaxY();
    int bannerMinY = calculateBannerMinY();
    int maxDistance = Math.abs(bannerMaxY - bannerMinY);
    int yDistance = Math.abs(mCurrentTop - bannerMinY);
    float ratio = (float) yDistance / maxDistance;
    mBannerRatio = ratio;

    if (ratio >= 1)
    {
      mBannerController.zoomOut(1);
      mBannerController.open();
      return;
    }

    if (ratio == 0)
    {
      mBannerController.zoomIn(ratio);
      mBannerController.close();
      return;
    }

    if (mCurrentTop < lastTop)
      mBannerController.zoomOut(ratio);
    else
      mBannerController.zoomIn(ratio);
  }

  private int calculateBannerMaxY()
  {
    View coordinatorLayout = (ViewGroup) mPlacePage.getParent();
    int height = coordinatorLayout.getHeight();
    int maxY = mPlacePage.getHeight() > height * (1 - ANCHOR_RATIO)
               ? (int) (height * ANCHOR_RATIO) : height - mPlacePage.getHeight();
    return maxY + mOpenBannerTouchSlop;
  }

  private int calculateBannerMinY()
  {
    View coordinatorLayout = (ViewGroup) mPlacePage.getParent();
    int height = coordinatorLayout.getHeight();
    return height - mPlacePageBehavior.getPeekHeight();
  }

  public BottomSheetPlacePageController(@NonNull Activity activity,
                                        @NonNull AdsRemovalPurchaseControllerProvider provider,
                                        @NonNull SlideListener listener,
                                        @Nullable RoutingModeListener routingModeListener)
  {
    mActivity = activity;
    mPurchaseControllerProvider = provider;
    mSlideListener = listener;
    mGestureDetector = new GestureDetectorCompat(activity, new PlacePageGestureListener());
    mRoutingModeListener = routingModeListener;
  }

  @SuppressLint("ClickableViewAccessibility")
  @Override
  public void initialize()
  {
    Resources res = mActivity.getResources();
    mViewportMinHeight = res.getDimensionPixelSize(R.dimen.viewport_min_height);
    mOpenBannerTouchSlop = res.getDimensionPixelSize(R.dimen.placepage_banner_open_touch_slop);
    mToolbar = mActivity.findViewById(R.id.pp_toolbar);
    UiUtils.extendViewWithStatusBar(mToolbar);
    UiUtils.showHomeUpButton(mToolbar);
    mToolbar.setNavigationOnClickListener(v -> close());
    mPlacePage = mActivity.findViewById(R.id.placepage);
    mPlacePageBehavior = AnchorBottomSheetBehavior.from(mPlacePage);
    mPlacePageBehavior.addBottomSheetCallback(mSheetCallback);
    mPlacePage.setOnTouchListener((v, event) -> mGestureDetector.onTouchEvent(event));
    mPlacePage.addOnLayoutChangeListener(this);
    mPlacePage.addClosable(this);
    mPlacePage.setRoutingModeListener(mRoutingModeListener);

    ViewGroup bannerContainer = mPlacePage.findViewById(R.id.banner_container);
    DefaultAdTracker tracker = new DefaultAdTracker();
    CompoundNativeAdLoader loader = com.mapswithme.maps.ads.Factory.createCompoundLoader(tracker,
                                                                                tracker);
    mBannerController = new BannerController(bannerContainer, loader, tracker,
                                             mPurchaseControllerProvider, this, this);

    mButtonsLayout = mActivity.findViewById(R.id.pp_buttons_layout);
    ViewGroup buttons = mButtonsLayout.findViewById(R.id.container);
    mPlacePage.initButtons(buttons, this);
    UiUtils.bringViewToFrontOf(mButtonsLayout, mPlacePage);
    UiUtils.bringViewToFrontOf(mActivity.findViewById(R.id.app_bar), mPlacePage);
    mPlacePageTracker = new PlacePageTracker(mPlacePage, mButtonsLayout);
    LocationHelper.INSTANCE.addListener(this);
  }

  @Override
  public void destroy()
  {
    LocationHelper.INSTANCE.removeListener(this);
  }

  @Override
  public void openFor(@NonNull MapObject object)
  {
    mPlacePage.setMapObject(object, (policy, isSameObject) -> {
      @AnchorBottomSheetBehavior.State
      int state = mPlacePageBehavior.getState();
      if (isSameObject && !isHiddenState(state))
        return;

      mBannerRatio = 0;
      mPlacePage.resetScroll();

      if (object.getOpeningMode() == MapObject.OPENING_MODE_DETAILS)
      {
        mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_ANCHORED);
        return;
      }

      UiUtils.show(mButtonsLayout);
      openPlacePage();
      showBanner(object, policy);
    });

    mToolbar.setTitle(object.getTitle());
    mPlacePageTracker.setMapObject(object);
    Framework.logLocalAdsEvent(Framework.LocalAdsEventType.LOCAL_ADS_EVENT_OPEN_INFO, object);
  }

  private void showBanner(@NonNull MapObject object, NetworkPolicy policy)
  {
    boolean canShowBanner = object.getMapObjectType() != MapObject.MY_POSITION
                            && policy.canUseNetwork()
                            && object.getRoadWarningMarkType() == RoadWarningMarkType.UNKNOWN;
    mBannerController.updateData(canShowBanner ? object.getBanners() : null);
  }

  private void openPlacePage()
  {
    mPlacePage.post(() -> {
      setPeekHeight();
      mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED);
      setPlacePageAnchor();
    });
  }

  private void setPeekHeight()
  {
    if (mPeekHeightAnimating)
    {
      Log.d(TAG, "Peek animation in progress, ignore.");
      return;
    }

    // If banner details are little bit or completely opened we haven't to change the peek height,
    // because the peek height is reasonable only for collapsed state and banner details are always
    // closed in collapsed state.
    if (mBannerRatio > 0)
      return;

    final int peekHeight = calculatePeekHeight();
    if (peekHeight == mPlacePageBehavior.getPeekHeight())
      return;

    @AnchorBottomSheetBehavior.State
    int currentState = mPlacePageBehavior.getState();
    if (isSettlingState(currentState) || isDraggingState(currentState))
    {
      LOGGER.d(TAG, "Sheet state inappropriate, ignore.");
      return;
    }

    if (isCollapsedState(currentState) && mPlacePageBehavior.getPeekHeight() > 0)
    {
      setPeekHeightAnimatedly(peekHeight);
      return;
    }

    mPlacePageBehavior.setPeekHeight(peekHeight);
  }

  private void setPeekHeightAnimatedly(int peekHeight)
  {
    int delta = peekHeight - mPlacePageBehavior.getPeekHeight();
    ObjectAnimator animator = ObjectAnimator.ofFloat(mPlacePage, "translationY", -delta);
    animator.setDuration(delta == mBannerController.getClosedHeight() ? ANIM_BANNER_APPEARING_MS
                                                                      : ANIM_CHANGE_PEEK_HEIGHT_MS);
    animator.addListener(new UiUtils.SimpleAnimatorListener()
    {
      @Override
      public void onAnimationStart(Animator animation)
      {
        mPeekHeightAnimating = true;
        mPlacePage.setScrollable(false);
        mPlacePageBehavior.setAllowUserDragging(false);
      }

      @Override
      public void onAnimationEnd(Animator animation)
      {
        mPlacePage.setTranslationY(0);
        mPeekHeightAnimating = false;
        mPlacePage.setScrollable(true);
        mPlacePageBehavior.setAllowUserDragging(true);
        mPlacePageBehavior.setPeekHeight(peekHeight);
      }
    });
    animator.addUpdateListener(animation -> onUpdateTranslation());

    animator.start();
  }

  private void onUpdateTranslation()
  {
    mSlideListener.onPlacePageSlide((int) (mPlacePage.getTop() + mPlacePage.getTranslationY()));
  }

  private void setPlacePageAnchor()
  {
    View parent = (View) mPlacePage.getParent();
    mPlacePageBehavior.setAnchorOffset((int) (parent.getHeight() * ANCHOR_RATIO));
  }

  private int calculatePeekHeight()
  {
    final int organicPeekHeight = mPlacePage.getPreviewHeight() + mButtonsLayout.getHeight();
    final MapObject object = mPlacePage.getMapObject();
    if (object != null)
    {
      @MapObject.OpeningMode
      int mode = object.getOpeningMode();
      if (mode == MapObject.OPENING_MODE_PREVIEW_PLUS)
      {
        View parent = (View) mPlacePage.getParent();
        int promoPeekHeight = (int) (parent.getHeight() * PREVIEW_PLUS_RATIO);
        return promoPeekHeight <= organicPeekHeight ? organicPeekHeight : promoPeekHeight;
      }
    }

    return organicPeekHeight;
  }

  @Override
  public void close()
  {
    mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_HIDDEN);
    mPlacePage.reset();
  }

  @Override
  public boolean isClosed()
  {
    return isHiddenState(mPlacePageBehavior.getState());
  }

  @Override
  public void onLocationUpdated(Location location)
  {
    mPlacePage.refreshLocation(location);
  }

  @Override
  public void onCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy)
  {
    @AnchorBottomSheetBehavior.State
    int currentState = mPlacePageBehavior.getState();
    if (isHiddenState(currentState) || isDraggingState(currentState) || isSettlingState(currentState))
      return;

    double north = trueNorth >= 0.0 ? trueNorth : magneticNorth;
    mPlacePage.refreshAzimuth(north);
  }

  @Override
  public void onLocationError(int errorCode)
  {
    // Do nothing by default.
  }

  @Override
  public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
      oldTop, int oldRight, int oldBottom)
  {
    if (mPlacePageBehavior.getPeekHeight() == 0)
    {
      LOGGER.d(TAG, "Layout change ignored, peek height not calculated yet");
      return;
    }

    mPlacePage.post(this::setPeekHeight);

    if (isHiddenState(mPlacePageBehavior.getState()))
      return;

    updateViewPortRect();
  }

  private void updateViewPortRect()
  {
    mPlacePage.post(() -> {
      View coordinatorLayout = (ViewGroup) mPlacePage.getParent();
      int viewPortWidth = coordinatorLayout.getWidth();
      int viewPortHeight = coordinatorLayout.getHeight();
      Rect sheetRect = new Rect();
      mPlacePage.getGlobalVisibleRect(sheetRect);
      if (sheetRect.top < mViewportMinHeight)
        return;

      if (sheetRect.top >= viewPortHeight)
      {
        Framework.nativeSetVisibleRect(0, 0, viewPortWidth, viewPortHeight);
        return;
      }
      viewPortHeight -= sheetRect.height();
      Framework.nativeSetVisibleRect(0, 0, viewPortWidth, viewPortHeight);
    });
  }

  @NonNull
  private static String toString(@AnchorBottomSheetBehavior.State int state)
  {
    switch (state)
    {
      case AnchorBottomSheetBehavior.STATE_EXPANDED:
        return "EXPANDED";
      case AnchorBottomSheetBehavior.STATE_COLLAPSED:
        return "COLLAPSED";
      case AnchorBottomSheetBehavior.STATE_ANCHORED:
        return "ANCHORED";
      case AnchorBottomSheetBehavior.STATE_DRAGGING:
        return "DRAGGING";
      case AnchorBottomSheetBehavior.STATE_SETTLING:
        return "SETTLING";
      case AnchorBottomSheetBehavior.STATE_HIDDEN:
        return "HIDDEN";
      default:
        throw new AssertionError("Unsupported state detected: " + state);
    }
  }

  @Override
  public void onSave(@NonNull Bundle outState)
  {
    mPlacePageTracker.onSave(outState);
    outState.putParcelable(EXTRA_MAP_OBJECT, mPlacePage.getMapObject());
  }

  @Override
  public void onRestore(@NonNull Bundle inState)
  {
    mPlacePageTracker.onRestore(inState);
    if (mPlacePageBehavior.getState() == AnchorBottomSheetBehavior.STATE_HIDDEN)
      return;

    MapObject object = inState.getParcelable(EXTRA_MAP_OBJECT);
    if (object == null)
      return;

    @AnchorBottomSheetBehavior.State
    int state = mPlacePageBehavior.getState();
    mPlacePage.setMapObject(object, (policy, isSameObject) -> {
      restorePlacePageState(object, policy, state);
    });
    mToolbar.setTitle(object.getTitle());
  }

  private void restorePlacePageState(@NonNull MapObject object, @NonNull NetworkPolicy policy,
                                     @AnchorBottomSheetBehavior.State int state)
  {
    mPlacePage.post(() -> {
      setPlacePageAnchor();
      mPlacePageBehavior.setState(state);
      UiUtils.show(mButtonsLayout);
      setPeekHeight();
      showBanner(object, policy);
      setPullDrawable();
    });
  }

  @Override
  public void onActivityCreated(Activity activity, Bundle savedInstanceState)
  {
  }

  @Override
  public void onActivityStarted(Activity activity)
  {
    mBannerController.attach();
    mPlacePage.attach(activity);
  }

  @Override
  public void onActivityResumed(Activity activity)
  {
    mBannerController.onChangedVisibility(true);
  }

  @Override
  public void onActivityPaused(Activity activity)
  {
    mBannerController.onChangedVisibility(false);
  }

  @Override
  public void onActivityStopped(Activity activity)
  {
    mBannerController.detach();
    mPlacePage.detach();
  }

  @Override
  public void onActivitySaveInstanceState(Activity activity, Bundle outState)
  {
    // No op.
  }

  @Override
  public void onActivityDestroyed(Activity activity)
  {
    Promo.INSTANCE.setListener(null);
  }

  private static boolean isSettlingState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_SETTLING;
  }

  private static boolean isDraggingState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_DRAGGING;
  }

  private static boolean isCollapsedState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_COLLAPSED;
  }

  private static boolean isAnchoredState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_ANCHORED;
  }

  private static boolean isExpandedState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_EXPANDED;
  }

  private static boolean isHiddenState(@AnchorBottomSheetBehavior.State int state)
  {
    return state == AnchorBottomSheetBehavior.STATE_HIDDEN;
  }

  @Nullable
  @Override
  public BannerController.BannerState requestBannerState()
  {
    @AnchorBottomSheetBehavior.State
    int state = mPlacePageBehavior.getState();
    if (isSettlingState(state) || isDraggingState(state) || isHiddenState(state))
      return null;

    if (isAnchoredState(state) || isExpandedState(state))
      return BannerController.BannerState.DETAILS;

    return BannerController.BannerState.PREVIEW;
  }

  @Override
  public void onBannerDetails(@NonNull MwmNativeAd ad)
  {
    mPlacePageTracker.onBannerDetails(ad);
  }

  @Override
  public void onBannerPreview(@NonNull MwmNativeAd ad)
  {
    mPlacePageTracker.onBannerPreview(ad);
  }

  @Override
  public void onBookmarkSet(boolean isSet)
  {
    if (!isSet)
      return;

    @AnchorBottomSheetBehavior.State
    int state = mPlacePageBehavior.getState();
    if (!isCollapsedState(state))
      return;

    mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_ANCHORED);
  }

  @Override
  public void closePlacePage()
  {
    close();
  }

  private class PlacePageGestureListener extends GestureDetector.SimpleOnGestureListener
  {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e)
    {
      @AnchorBottomSheetBehavior.State
      int state = mPlacePageBehavior.getState();
      if (isCollapsedState(state))
      {
        mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_ANCHORED);
        return true;
      }

      if (isAnchoredState(state) || isExpandedState(state))
      {
        mPlacePage.resetScroll();
        mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED);
        return true;
      }

      return false;
    }
  }
}

redpajama_set_name: RedPajamaGithub


text:
Microsoft Might Kill the Classic Control Panel Soon, Will Hopefully Fix Settings First [Updated]
By Joel Hruska on March 27, 2020 at 8:16 am
Update (3/28/2020): More information has come to light on the specifics of what MS is changing. As of this writing, only the "System" applet appears to be impacted. As Jim Salter points out at Ars Technica, however, there are definitely still some functions that MS needs to move over to Settings before it sunsets the System applet out of CP. Clearly Microsoft has more work to do before it can kill off the old-fashioned standard. Original story below:
Ever since Windows 8, Microsoft has shipped two methods of changing system settings. In the beginning, the new Settings menu was a joke. Over the last eight years, it's slowly become more functional and has subsumed more of Control Panel's capabilities. According to Windows Central, that could be about to change.
There are Feature IDs in the latest build of Windows 10 that would replace or redirect current Control Panel traffic back to the Settings application. Windows Central writes:
These feature IDs are HideSystemControlPanel, SystemControlPanelFileExplorerRedirect, and SystemControlPanelHotkeyRedirect. All these feature IDs are disabled in the latest public builds, but they do exist, suggesting that Microsoft is testing it internally.
This isn't going to be a near-term change — Windows Central thinks it'd be H1 2021 at the earliest, and that was before Covid-19 screwed up everyone's everything. The question of whether Settings is good enough to get rid of Control Panel is an interesting one. Familiarity bias means that we're likely to be predisposed towards using CP over the newer Settings app, but how much do we still need the OG version?
The short answer: Yes.
The longer answer: Yes, right now, but not if Microsoft puts some work into migrating current Control-Panel-only functions.
There are still some places in the Settings menu where changing low-level settings under the hood requires you to open the Control Panel-equivalent screen. The Power menu under Settings gives you the basics right up front:
Choose "Additional Power Settings" and the OS opens the Control Panel "Power Settings" page for you. There are a number of functions that aren't mapped to Settings yet, including reprogramming what buttons do and fine-tuning the OS' various power-saving measurements.
One possibility is that Microsoft would remove Control Panel without removing any of its secondary windows or reskinning them to match Windows 10. There's no reason Microsoft couldn't remove the Control Panel interface and relocate "Administrative Tools" to a link inside the existing Settings tool.
I can't claim to have performed some kind of exhaustive survey of Microsoft's UI implementation, but one thing I've noticed in the past is that Microsoft has kept its more data-dense UI elements in the older-style Windows format while the Settings page is reserved for simpler options and presentation. Redesigning everything Control Panel accesses to follow this formula is probably a non-starter. There are some places where data needs to be presented densely to be handled in reasonable fashion:
The Display page already shows some data on how this might go. You can access the 'Advanced' sections, which keep their old-style formatting, but you don't need to open the actual "Display" section of Control Panel to do it — you can use the Settings page to access this menu.
My guess is that Microsoft will continue slowly moving functionality over to Settings, but that we'll see "old style" Windows UI elements for a while yet — possibly forever, for settings buried deep under the hood. As for whether this will be a net improvement for Windows, I think moving back to a unified system in which all controls are found under the same app would be an improvement at this point. During the Windows 8 era, you could ignore Settings in almost all cases. Now with Windows 10, there's a split between Control Panel and Settings. Better to move things over to Settings, intelligently, rather than require people to shuffle forever between the two.
Now Read:
Surface Laptop 3 Review: Can Ice Lake Freeze Out a Core i7-7700HQ From 2016?
Windows Zero-Day Attack Lets Hackers Hide Malicious Code in Fonts
Microsoft Unveils DirectX 12 Ultimate, Its Next-Generation API


text:
\section{Introduction}

The summits of the Internal Antarctic Plateau might be among the best
sites in the world for astronomical facilities. The free atmosphere
has low amounts of water vapour and the turbulence is concentrated to
a thin surface layer. The largest source of the turbulence in the
surface layer is the near surface winds, that are triggered by the
sloping terrain in combination with the temperature inversion.
For a more extensive analysis we refer the reader to  Hagelin {\em et al.\/}
(\cite{hag08a}), in this contribution we briefly summarize the
results. The scientific goals of this study were:

1) To perform a detailed comparison of the ECMWF-analysis data with
radiosoundings and AWS-data (Automatic Weather Station) of the wind
speed and the temperature, near the surface as well as in the free
atmosphere.

2) Using radiosoundings to estimate the median values of the wind
speed in the first tens of meters at the South Pole and Dome C.

3) Studying the wind speed in the free atmosphere we intend to
quantify which site is the best for astronomical applications.

4) We extend the analysis of the Richardson number done by Geissler \&
Masciardri (\cite{ges06}) at Dome C to the three sites (South Pole,
Dome C and Dome A) in order to quantify the regions and periods that
are more likely to trigger turbulence.

\section{Results and Discussion}

\subsection{$\partial\theta/\partial z$ and ($\partial v/\partial z)^2$ at
  Dome A, Dome C and the South Pole}

As shown by  Hagelin {\em et al.\/} (\cite{hag08a}) there is an
excellent agreement between the ECMWF analysis and the
radiosoundings at both Dome C and the South Pole. However, during the
winter, there is also a large offset in the first vertical
grid-point.

The dynamic instabilities are described by the wind shear and the
thermal stability is represented by the gradient of the potential
temperature. A positive potential temperature gradient is defined as stable
conditions, the vertical displacement of the air is suppressed and so is the
production of dynamic turbulence.

The monthly median of the potential temperature, see Fig.~4 of
Hagelin {\em et al.\/} (\cite{hag08b}), shows that during most of the year
a temperature inversion is present. In the central months of the winter
(June, July and August) Dome A shows the most stable conditions with a
very sharp temperature inversion near the surface.

The difference in ($\partial v/\partial z)^2$ is much less evident,
see Fig.~5 in Hagelin {\em et al.\/} (\cite{hag08a}), but Dome A has a
slightly larger gradient than the other two sites during most months.

\subsection{Radiosoundings: the surface wind speed}

Above the summits of the Internal Antarctic Plateau the surface winds
are expected to be weaker than elsewhere on the plateau. Fig.~6 in
Hagelin {\em et al.\/} (\cite{hag08a}) shows the median wind speed at
the South Pole and Dome C from April to November. While it is true that
the wind speed at the lowest level is weaker at the summit (Dome C)
than at the slope (South Pole), it is clearly visible a sharp wind
shear in the first 10/20 m at Dome C. Above this height the wind speed
at Dome C is either stronger or comparable to that of the South Pole.

In the core of the winter (June, July and August) the wind speed above
Dome C reaches 8 m/s at 20 m and 9 m/s at 30 m. The sharp change in
the wind speed in the first 10/20 m matches our expectations of a
large wind speed gradient. This is a necessary condition to justify
the presence of optical turbulence in the surface layer (Agabi {\em et
  al.\/} \cite{Ag06}, Trinquet {\em et al.\/} \cite{Tr08}) in spite of
very stable thermal conditions. Such a strong wind speed, 8-9 m/s at
10 m, might be a source of vibrations produced by the impact of the
atmospheric flow on a telescope structure and should therefore be
taken into account in the design of astronomical facilities.

\subsection{ECMWF analyses: The wind speed in the free atmosphere}

The wind speed in the free atmosphere
during the summer is quite weak and is almost constant with height
(see Fig.~7 in Hagelin {\em et al.\/}
(\cite{hag08a})).
The median wind speed from December to March never
exceeds 15 m/s at any height for any site. As the winter approaches
the wind speed above 10 km increases monotonically. The rate at which
the wind speed increases is not the same above the different sites.
The smallest increase rate is seen at the South Pole whereas the
largest increase rate is found above Dome C. These differences are far
from being negligible since at these heights the median wind speed at
Dome C is almost twice that of the other sites.

This effect can be explained by the polar vortex, that
forms above Antarctica during the winter. The increase rate of the
wind speed is proportional to the distance of the site to the centre
of the polar vortex. This is the reason why the wind speed above Dome C is
particularly large above 10 km in winter. At 15 km  a.s.l. the wind
speed of Dome C can easily be almost twice the wind speed of Dome A or
F and even thrice the wind speed of the South Pole. The wind speed at
the South Pole is the weakest of the four in all seasons and at all
heights.

\subsection{The Richardson number}

The Richardson number is an indicator of the stability of the
atmosphere, $Ri=\frac{g}{\theta}\frac{\partial \theta/\partial
  z}{(\partial v/\partial z)^2}$, where g is the gravitational
acceleration (9.8 m/s$^2$), $\theta$ is the potential temperature and
v is the horizontal wind speed. The atmosphere is considered to be
stable if the Richardson number is larger than the critical value,
typically 0.25. The smaller the Richardson number is the higher is the
probability to trigger turbulence.

Comparing the Richardson number gives a relative estimate of the
probability of the triggering of turbulence.  The method proposed by
Geissler \& Masciadri (\cite{ges06}), to calculate the inverse of the
Richardson number to rank different sites qualitatively, has been
definitely proved by comparing an Antarctic site (Dome C) with a
mid-latitude one (Mt.~Graham).  Indeed, as seen in Fig.~9 in Hagelin
{\em et al.\/} \cite{hag08a}, Dome C is always more stable than
Mt.~Graham, except the high part of the atmosphere in September and
October when the polar vortex creates strong high altitude winds at
Dome C. As discussed in Hagelin {\em et al.\/} \cite{hag08a} this
proves that the probability to trigger turbulence above mid-latitude
sites is larger than above Dome C.

Comparing the three Antarctic sites with each other, see Fig.~10 of
Hagelin {\em et al.\/} \cite{hag08a}, it appears that the most stable
conditions are found above the South Pole. Dome A is less stable than
the South Pole and the least stable conditions are found at Dome
C. This is most likey due to the polar vortex that produces a strong
wind shear at this site.

\section{Conclusions}
This study allowed us to draw a first comprehensive picture of the
atmospheric properties above the Internal Antarctic Plateau. In spite
of the generally good conditions for astronomical applications, Dome C
does not appear to be the best site with respect to the wind speed, in
the free atmosphere as well as in the surface layer. All the other
sites show a weaker wind speed in the free atmosphere.

Above Dome A the gradient of the potential temperature is particularly
large near the surface, indicating extreme thermal stability
associated to a strong optical turbulence when a thermodynamic
instability occurs. It is even possible that the optical turbulence
here is larger than at Dome C. However, to predict the thickness of
such a layer it is necessary to have either measurements or
simulations with a mesoscale model with a higher spatial resolution.

At present, the best argument that makes Dome C a better place for
astronomical applications than the South Pole is the extreme thinness
of the turbulent surface layer. Dome A probably has comparable or
larger values of the optical turbulence with respect to Dome C in the
surface layer. We cannot conclude whether the surface layer at Dome A
is thinner than what is observed at Dome C. Our study clearly
indicates that Dome C is not the best site on the Internal Antarctic
Plateau with respect to the wind speed (both in the surface layer and
in the free atmosphere) nor is it the site with the most stable
conditions in the free atmosphere. Both the South Pole and Dome A show
more stable values of 1/Ri.

\section*{Acknowledgments}
This study has been carried out using radiosoundings from the AMRC
(Antarctic Meteorological Research Center), University of Wisconsin,
Madison and from the Progetto di Ricerca 'Osservatorio Meteo
Climatologico' of the PNRA (Programma Nazionale di Ricerche in
Antartide). ECMWF products are extracted from the MARS-catalogue. This
study has been funded by the Marie Curie Excellence Grant (ForOT)
MEXT-CT 2005-023878, FP6.

redpajama_set_name: RedPajamaArXiv


text:
sj Miller (born March 20, 1970) is an American academic, public speaker, social justice activist, Professor of Teacher Education at the Santa Fe Community College. Miller is agender and does not use any personal pronouns.

Early life and education
Miller was born in New Orleans, Louisiana, and grew up in Santa Fe, New Mexico, attending Santa Fe High School. Miller taught middle and high school English for eight years before going on to earn a PhD in Educational Thought and Socio-Cultural Studies from the University of New Mexico.

Miller medically transitioned from female toward male while working as an assistant professor at Indiana University of Pennsylvania. Miller was disowned by a father after coming out as agender-transgender.

Career
Miller has held teaching positions at Indiana University of Pennsylvania and University of Missouri-Kansas City. Miller served as an associate professor of literary studies at University of Colorado Boulder.

In the fall of 2010, Miller helped draft the Beliefs Statement about Social Justice in English Education and helped pass the Resolution on Social Justice in Literacy Education, which informed the newly-vetted CAEP Social Justice Standard 6-the first ever standard in the United States that advances social justice work in teacher preparation for the National Council of Teachers of English. In April 2016, Miller was selected for a project hosted by UNESCO-MGIEP (Mahatma Gandhi Institute of Education for Peace and Sustainable Development) to integrate social justice education into the mainstream school curriculum.

In 2016, Miller was hired as Deputy Director of Educational Equity at the Steinhardt School of Culture, Education, and Human Development at New York University.

As of 2022, Miller is a Professor of Teacher Education in the Teacher Academy at Santa Fe Community College, Santa Fe, New Mexico. Beginning in Autumn 2022, Miller is additionally teaching online courses in the teacher education program at the University of Washington Bothell School of Educational Studies.

Advocacy
Miller has written and spoken nationally and internationally about the impact of bullying on youth, particularly young people whose gender identities are nonconforming and those in the LGBTQ community.

Following the Donald Trump administration's withdrawal of federal guidance on gender identity under Title IX, Miller spoke out in support of transgender youth in a February 2017 interview on CBSN.

In March 2017, Miller was featured in the CBSN documentary Gender: The Space Between, which focused on gender fluidity.

In 2018, Miller gave the TEDMED talk: Why Gender Identity Justice Matters for Everyone.

Selected books

 Miller, s. (2019). about gender identity justice in schools and communities. New York: Teacher College Press.
 Miller, s. Mayo, C., Hoskin, R., & Green, J. (2019). Navigating trans*+ and complex gender identities. Bloomsbury: U.K.
 Miller, s., & Rodriguez, N. (Eds.). (2016). Educators queering academia: Critical memoirs. New York: Peter Lang.
 Miller, s. (Ed.). (2018). Enseñando, afirmando, y reconociendo a jóvenes trans* y de género creative: Un marco de enseñanza queer(A. Stevenson Valdés, Trans). Santiago: Ediciones Universidad Alberto Hurtado.
 Miller, s. (Ed.). (2016). Teaching, affirming, and recognizing trans and gender creative youth: A queer literacy framework. New York: PalgraveMacmillan.
 Miller, s., Burns, L., & Johnson, T.S. (2013). Generation BULLIED 2.0: Prevention and intervention strategies for our most vulnerable students.  New York: Peter Lang.
 Miller, s. & Kirkland, D. (Eds.). (2010). Change matters: Critical essays on moving social justice research from theory to policy. New York: Peter Lang.
 Miller, s., Beliveau, L., DeStigter, T., Kirkland, D., & Rice, P. (2008). Narratives of social justice teaching: How English teachers negotiate theory and practice between preservice and inservice spaces. New York: Peter Lang.
 Miller, s., & Norris, L. (2007). Unpacking the loaded teacher matrix: Negotiating space and time between university and secondary English classrooms. New York: Peter Lang.

Selected publications

Burns, L., & Miller, s. (2017). Social justice policymaking in teacher education from conception to application: Realizing Standard VI. Teachers College Record, 119(2), 1-38.
Miller, s., Mayo, C., & Lugg, C. (2017). Sex and gender in transition in US schools: Ways forward. Sex Education, 18(4), 345-359.
National Council Teachers of English. (2018). NCTE statement on gender and language. Urbana: IL.
Miller, s. (2018). Reframing schooling to liberate gender identity. Multicultural Perspectives, 20(2), 70-80
Poteat, P.V., Calzo. P.J., Yoshikawa, H., Miller, s., Ceccolini, C., Rosenbach, S., & Mauceri, N. (2018). Discussing transgender topics within gay-straight alliances: Factors that could promote more frequent conversations. International Journal of Transgenderism. Accessed from https://doi.org/10.1080/15532739.2017.1407983
Miller, s. (2018). Gender identityWOKE: A theory of trans*+ for animating literacy practices. In D. Alvermann, NJ Unrau, M. Sailors and R. Ruddell (Eds.), Theoretical models and processes of literacy edition 7 (pp. 403–418). New York: Routledge.
Miller, s. (2019). The impact and role of emotions in schools for teachers and students with complex gender identities. Teachers College Record,121 (13).
Miller, s. (2019) Trans*+ and gender identity diverse students' right to use a Bathroom: Debating human dignity. In M. Levinson and J. Fay (Eds.), Democratic discord in schools: Cases and commentaries in educational ethics (pp. 191–194.). Cambridge, MA: Harvard Press.
Miller, s. (2020). Gender identity complexities turn. GLQ: A Journal of Lesbian and Gay Studies,26 (2), 239-242.
Miller, s. (2020). Gender Identity is trans-sectional turn: Expanding the theory of trans*ness into literacy practice. In C. Mayo and M. Blackburn (Eds.), Queer, trans and intersectional theory in educational practice ( pp. 35–49). New York: Routledge.

Selected awards and recognition
 2005: Paul and Kate Farmer English Journal Writing Award, Article of the Year, "Shattering Images of Violence in Young Adult Literature: Strategies for the Classroom"
 2007: Richard A. Meade award, National Council on Teacher Education, "Unpacking the Loaded Teacher Matrix: Negotiating Space and Time Between University and Secondary English Classrooms"
 2015: Joanne Arnold Courage and Commitment Award, University of Colorado Boulder
 2017: Exemplary Research Award, American Educational Research Association, Division K, Teaching and Teacher Education, "Teaching, Affirming and Recognizing Trans and Gender Creative Youth: A Queer Literacy Framework"
2018: Outstanding Book Award, Michigan Council Teachers of English Teaching, Affirming and Recognizing Trans and Gender Creative Youth: A  A Queer Literacy Framework
2019: AERA Distinguished Contributions to Gender Equity in Education Research Award

Book series Editor

 Miller, s. (Ed.). Spaces In-between: Beyond Binary Gender Identities and Sexualities Series. Teachers College Press: New York, NY.
 Miller, s. & Burns, L. (Eds.). Social Justice Across Contexts in Education. Peter Lang: New York, NY.

Personal life
Miller enjoys participating in sports and fitness activities, including swimming, running, and cycling, and was formerly an All-American high school soccer player who played Division 1 Soccer at U.C. Berkeley.

References

External links

1970 births
Transgender non-binary people
American LGBT rights activists
LGBT people from New Mexico
Living people
People from Santa Fe, New Mexico
Steinhardt School of Culture, Education, and Human Development faculty
Transgender writers
University of New Mexico alumni
Transgender academics
Transgender studies academics
Non-binary writers
Non-binary activists
Agender people

redpajama_set_name: RedPajamaWikipedia


text:
Q: Memory leak in IE: Due to ajax call using .load() I am loading entire data of .html files in a div via ajax call. The html page contains link,script tags required for HTC(html component) to bind with the elements on page.
The structure of the page is like:

I am using jQuery to load HTML pages like this

<input type="radio" class="openpage" id="0001">
<input type="radio" class="openpage" id="0002">
<input type="radio" class="openpage" id="0003">
<input type="radio" class="openpage" id="0004">

The problem with this is that IE memory keeps pilling up as radio buttons are clicked to load pages and after loading few pages browsers stops responding.
I can see the memory going up in task manager.
The application runs in IE 5,6,7,8,9 and in quirks mode in IE10. I tried to replicate the same scenario in chrome and it showed no problem. So I think it is IE specific memory management related problem.
I read many articles but I was not convinced.I also read this question on SO but it suggests to load only some part of page which is not acceptable in my case.This article seems relevant but I am not sure what exactly causes memory leak in my case.
The entire body above is actually in a iframe . So as a workaround I reload the
frame with the main page containing  after 8 clicks of radio button.
I have tried to clear stuffs before each load using:
$("#loadPages").empty();

$("#loadPages").find("*").off();

$.ajaxSetup({ cache: false });

But nothing works.So I doubt whether jquery can clear events registered through htc.
1) It would be great if you explain the reason of memory leak in this case.
2) And in general why memory leak can occur in a browser after loading many resources. This does not happen in modern browsers but why it occurred in older browsers.
3) Is there a way to release browsers memory without refreshing the frame.
4)Is there a way to check what all resources are residing in a browsers memory.

A: You have a couple of workflows:

*

*Replace existing DOM structures by dynamically loaded structures.

*Wire in additional event handling after load.

From here:

*

*When removing/replacing DOM nodes, events are still bound

*By being bound to event handlers, the DOM nodes may not be able to clear

*DOM nodes persist in memory, detached from the UI, but still leaking memory.

Your options are:

*

*Make certain to clear all events on existing structures before clearing those nodes from the DOM, and allowing the new content to load.

*Have several nodes for display, and load each only one time.

*Check if a node exists, and simply detach it, rather than try to replace it.

IE has separate COM channels for the JavaScript and the Rendering engine, this means that sometimes, particularly with event binding.  Objects/state in JS can hold on to references to UI/DOM nodes... and DOM nodes can reference JS event handlers.  In many cases this means that those portions won't be garbage collected leading to inflated memory usage.  It was far worse with earlier versions, but still happens.
You can have similar issues with other browsers, but IE tends to display this behavior much sooner.  This also happens more with long-living single page applications.
If you only load each resource once, into its' own DOM node, you can simply detach/reattach that node.  Also, you can rely on event propagation to listen to events from the parent node.  Either of these will reduce the risk of contention, and overhead.
As to unregistering your event handlers, jQuery does a better job than most with this, as long as you register with jQuery, and use jQuery to remove/delete the node (and its' children).

A: Have you ever consider to use xhr requests?
They can load the content to your target using ajax.
I did a sample fiddle to your question. Have a look at it.
Cheers.
Snippet

function getXmlHttpRequest() {
  var xmlhttp;
  if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
    // code for IE7+, Firefox, Chrome, Opera, Safari

  } else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    // code for IE5 and IE6
  } else {
    alert("Browser doesn't support Ajax..!!");
  }

  return xmlhttp;
}

function loadPage(pageTitle) {
  //pageTitle = pageTitle + ".html";
  xmlhttp = getXmlHttpRequest();
  if (xmlhttp != null) {
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState < 4) {
        document.getElementById('loadPage').innerHTML = "Content Loading...!";
      } else if (xmlhttp.readyState == 4) {
        var res = xmlhttp.responseText;
        document.getElementById('loadPage').innerHTML = res;
      }
    }
    xmlhttp.open("GET", pageTitle, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(null);
  }
}

function showAlert() {
  alert("This is me!");
}
$(document).ready(function() {
  $(".openpage").on("click", function() {
    loadPage($(this).attr("id"));
  });
});

<input type="radio" class="openpage" name="radio-group" id="https://dl.dropboxusercontent.com/u/105580681/xhr-fiddle/0001.html">
<input type="radio" class="openpage" name="radio-group" id="https://dl.dropboxusercontent.com/u/105580681/xhr-fiddle/0002.html">
<input type="radio" class="openpage" name="radio-group" id="https://dl.dropboxusercontent.com/u/105580681/xhr-fiddle/0003.html">
<input type="radio" class="openpage" name="radio-group" id="https://dl.dropboxusercontent.com/u/105580681/xhr-fiddle/0004.html">

In this fiddle, i'm loading the html files using dropbox links. You can use your initial idea of 0001 - 0004 id numbers.
However if you are loading the entire content of a html page this will load everything from that external html page to inside of your targeted main page.
 Example:

        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">

Content of HTML 0001 Page

This will affect to your DOM file of the main page. Page functionality won't loose but it is not a good programming technic. So you probably need to write or load the content in xxxx.html files that you want to show on targeted element.

Learn more from
Using XMLHttpRequest Mozilla MDN
Using FormData Objects Mozilla MDN


How to Handle Excel File Full of Tags With SDL Trados Studio?
By taggy files I mean "embedded xml or html content" that is written into an Excel file alongside translatable text.
Translators and Technology: Friends or Foes?
It is a fact that different kinds of technology creep into the translation industry on all levels. As a result, some participants in this magical process of transforming a text to fit a different language, cultural, and sociological community, can feel quite uneasy, or even anxious. Will machine translation (MT) reach parity with human translation (HT)? Will there be a need for translators?
Read full article from here.
CAT tools have already been on the market for many years now and yet they are still improving. New technologies and emerging needs from translators are triggering a shift from computer-aided translation tools to smart device-aided translations tools. Does the future of productivity lie in web-based translation environments?
While CAT tools nowadays are inevitable in the toolkit of translators, it is still not long ago that professional translators had to work without them. The tools for computer-aided translation, not to be confused with online translation tools like Google Translate, only emerged in the early 1990s. Although there might have been some earlier attempts to create software that helps translators to improve their quality, productivity and consistency, in the last decade of the last century they came into full swing. Nowadays translators can choose from at least 20 different CAT tools, both online and offline, to suit their needs out of which SDL Trados and MemoQ are by far the best known.
However, only 25 years after the introduction of mainstream translation software a new era is on the horizon. The introduction of cloud technology, the rise of digital nomads, and the general availability of cheap and fast internet connections has led to a new branch on the CAT tool tree: translators can now use online translation environments, both free and paid, to work wherever they choose to.
The technological advancements in the last couple of years opened great opportunities for companies who looked beyond traditional CAT tools and wanted to pluck the low-hanging fruit of the cloud's capabilities. Several professionals, both from inside and outside the translation industry, quickly introduced their own online variants of the desktop translation tools. Examples included Smartling and Memsource (which has a desktop tool as well). These tools are browser-based, which means that they are accessible as webpages and can be used to work wherever users want as long as they have a compatible device and an internet connection. The online translation environments offer full functionality, which is often equivalent to the standard desktop tools. Users (in the case of Smartling and Memsource mainly project managers) can create translation memories and term bases, set rules for quality assurance and require users to perform several checks before they can deliver their translations. The tools also offer support for the most common file formats, like Microsoft Office files, PDF files and HTML documents, but also for bilingual filetypes like XLIFF and the proprietary formats of Trados and MemoQ. In addition, they often have familiar user interfaces, with well-known toolbars and panels that make it easier for project managers and translators alike to find their way in the online CAT tool.
It might be clear that the new members in the CAT tool family are working disruptively to shake up the CAT tool industry. It is therefore not a surprise that after the introduction of new online CAT tools developers of 'traditional' CAT tools also came up with an online version. MemoQ introduced MemoQ Web while SDL brought SDL Online Translation Editor to the table.
The most important feature of the web-based CAT tools is, (how surprising), that they work in a browser. Most of them were initially designed to work on a desktop, offering translators a convenient tool with omnipresent accessibility while at the same time making it easier for project managers to dispense projects. Indeed, project managers only had to upload files, create or connect a translation memory, and send a link to multiple translators, making it easier to complete projects, shorten the turnaround time, and circumvent lengthy discussions via email. But because these new online CAT tools were mainly directed at agencies and project managers, they fell short of meeting the needs of translators who wanted to work on the go. Other bright minds therefore developed new web-based CAT tools that supported the needs of the freelance translator better: in the past few years Lilt and Smartcat were introduced, among others. The SDL Online Translation Editor has also been created with freelance professionals in mind, while MemoQ Web is more dedicated to project managers.
The biggest difference between tools for freelance translators and project managers is their workflow. While project managers have loads of options to manage projects, tools like Lilt and Smartcat introduce only the options freelancers need: they can upload a file in different file types, create or use a translation memory (term bases are often not supported), work their way through the file, and complete the job. The tools have a familiar and simple user interface, so translators do not need to look for advanced options, but often, powerful options are hidden under the bonnet, so they can really compete with their desktop equivalents.
Another major advantage of CAT tools in the cloud is that they frequently release new features quickly and respond to feature requests even faster, while traditional CAT tools often require months for implementing, testing, and introducing new features in a newly built (minor) version of their tool.
Another major difference is that many tools aimed at freelancers are free to use. They offer various plans for advanced users, often based on the amount of characters being translated, but there is only one free flavour, and it comes without many of the options that paid users have access to.
In the past few years the online CAT tools have quickly risen to the level at which they can compete with traditional computer-based CAT tools. Where CAT tools have evolved and added new features with every new release, their online counterparts were introduced according to the status quo of traditional CAT tools. They sometimes even introduced ground-breaking new features that traditional CAT tools were not able to offer, like Lilt's adaptive machine translation.
Yet among translators there is still much debate about their adaptations. The most important concern is that of privacy. While computer resources are generally considered a safe option, many translators are afraid to use cloud environments because of the risk of hacks and leaks that expose clients' confidential information. At the same time, using a free online translation environment sometimes requires that translations are shared with the platform provider to improve the quality of generally available translation memories and machine translation services. Freelancers, whose business depends on credibility, simply cannot afford to share their client's information for the sake of improving their productivity or flexibility.
On the other hand, early adopters and technology enthusiasts debate that the cloud is much safer than many computers thanks to continuous security updates. However, they are only a small group in the world of translators.
Whatever the privacy concerns, until now the introduction of online CAT tools has made clear that they are here to stay. With the increasing adaptation of online tools, lifestyles shifting to working on the go, and digital nomadism it is expected that online translation environments will be increasingly in demand in the future.
Although traditional CAT tools do not offer any opportunities to be run on smart devices with an Android, iOS, or Windows Phone operating system, online CAT tools do not have this problem. That means that they can be used without barriers on smartphones and tablets, once they have been adopted on a computer. Indeed they offer the same experience everywhere as they are browser-based and do not need to be adapted much to work in different operating environments. An added advantage of this possibility is that users can start a task on their desktop, then work on it while away, and complete it in a third environment.
Yet, despite the seemingly endless possibilities of the online CAT tools, many of them still do not offer a flawless experience on smartphones and tablets. One of the biggest disadvantages of the browser-based tools is that they do not fit neatly onto the small screens of smart devices. A short experiment with a few translation platforms (Smartcat and Lilt; SDL's Online Translator Editor returned an error) quickly showed that the user interface has problems with touch-enabled devices. While all elements of a CAT tool (the panel with the bilingual format, a panel with translation memory results, a concordance panel, and some other interface elements) are present, they often do not fit neatly. While the interface appears fine in its initial state, touching a text box to add a translation will cause the panels to be re-arranged every time. Furthermore after touching the screen the screen keyboard pops up, often making (a part of) the source text invisible. While this problem is apparent on tablets, it is even more problematic on smartphones with even smaller screens. Working on a translation on the go using a tablet of smartphone therefore does not offer a seamless, flawless, or productive experience just yet.
Another problem is that rendering the translation environment on a tablet or smartphone requires considerable computing resources on some devices. So in order to make full use of an online CAT tool, users need to have a powerful tablet or smartphone that can execute scripts and render style sheets quickly to realize a productivity gain.
That brings us to the question of whether online CAT tools can fulfil the needs of professional translators. Basically, the answer is yes. Online CAT tools often work well on desktops. However, they are currently an online variant on computer-aided translation tools. That does not mean that they are fully fledged to become smart device-based translation tools (SAT). The current generation of browser-based CAT tools is perfect to use with laptops while one is on the go, but in order to benefit from their full potential for smartphones and tablets they still need to be more adapted to these devices. The future of CAT tools is in our hands, but it still need to be adapted to our fingers.
Machine translation (MT) is automated translation by computer software. MT can be used to translate entire texts without any human input, or can be used alongside human translators. The concept of MT started gaining traction in the early 50s, and has come a long way since. Many used to consider MT an inadequate alternative to human translators, but as the technology has advanced, more and more companies are turning to MT to aid human translators and optimize the localization process.
Well, that depends on the type of machine translation engine. There are several different kinds of MT software which work in different ways. We will introduce Rule-based, Statistical, and Neural.
Rule-based machine translation (RBMT) is the forefather of MT software. It is based on sets of grammatical and syntactical rules and phraseology of a language. RBMT links the structure of the source segment to the target segment, producing a result based on analysis of the rules of the source and target languages. The rules are developed by linguists and users can add terminology to override the MT and improve the translation quality.
Statistical MT (SMT) started in the age of big data and uses large amounts of existing translated texts and statistical models and algorithms to generate translations. This system relies heavily on available multilingual corpora and an average of two millions words are needed to train the engine for a specific domain – which can be time and resource intensive. When a using domain specific data, SMT can produce good quality translations, especially in the technical, medical, and financial field.
Neural MT (NMT) is a new approach which is built on deep neural networks. There are a variety of network architectures used in NMT but typically, the network can be divided into two components: an encoder which reads the input sentence and generates a representation suitable for translation, and a decoder which generates the actual translation. Words and even whole sentences are represented as vectors of real numbers in NMT. Compared to the previous generation of MT, NMT generates outputs which tend to be more fluent and grammatically accurate. Overall, NMT is a major step in MT quality. However, NMT may slightly lack behind previous approaches when it comes to translating rare words and terminology. Long and/or complex sentences are still an issue even for state-of-the-art NMT systems.
So now you have a brief understanding of MT – but what does it mean for your translation workflow? How does it benefit you?
MT is incredibly fast and can translate thousands of words per minute.
It can translate into multiple languages at once which drastically reduces the amount of manpower needed.
Implementing MT into your localization process can do the heavy lifting for translators and free up their valuable time, allowing them to focus on the more intricate aspects of translation.
MT technology is developing rapidly, and is constantly advancing towards producing higher quality translations and reducing the need for post-editing.
There are many advantages of using MT but we can't ignore the disadvantages. MT does not always produce perfect translations. Unlike human translators, computers can't understand context and culture, therefore MT can't be used to translate anything and everything. Sometimes MT alone is suitable, while others a combination of MT and human translation is best. Sometimes it is not suitable at all. MT is not a one-size-fits-all translation solution.
When translating creative or literary content, MT is not a suitable choice. This can also be the case when translating culturally specific-texts. A good rule of thumb is the more complex your content is, the less suitable it is for MT.
For large volumes of content, especially if it has a short turnaround time, MT is very effective. If accuracy is not vital, MT can produce suitable translations at a fraction of the cost. Customer reviews, news monitoring, internal documents, and product descriptions are all good candidates.
Using a combination of MT along with a human translator post-editor opens the doors to a wider variety of suitable content.
Which MT Engine Should You Use?
Not all MT engines are created equal, but there is no specific MT engine for a specific kind of content. Publicly available MT engines are designed to be able to translate most types of content, however, with custom MT engines the training data can be tailored to a specific domain or content types.
Ultimately, choosing an MT engine is a process. You need to choose the kind of content you wish to translate, review security and privacy policies, run tests on text samples, choose post-editors, and several other considerations. The key is to do your research before making a decision. And, if you are using a translation management system (TMS) be sure it is able to support your chosen MT engine.
You can use MT on its own, but to get the maximum benefits we suggest integrating it with a TMS. With these technologies integrated, you will be able to leverage additional tools such as translation memories, term bases, and project management features to help streamline and optimize your localization strategy. You will have greater control over your translations, and be able to analyze the effectiveness of your MT engine.
Four out of the five fastest-growing language services companies in 2018 are media localization specialists. The media business has seen a boom over the last two years, and traditional translation companies are taking notice. Media localization won't stay an uncontested insular niche for long. In fact, conventional LSPs and technology providers are moving into this sector and expanding their technical capabilities this year.
Omniscien, previously Asia Online, is best known for its trainable machine translation software, but now they are going into a new area – video subtitling. Omniscien has just started selling Media Studio, which was built based on product requirements from iflix, a Malaysian competitor to Netflix.
Under the hood Media Studio has machine learning components: audio transcription, dialog extraction, and neural MT engines pre-trained for subtitles in more than 40 language combinations. The technology is able to create a subtitle draft out of a raw video already in the target language. It can even adjust timings and split long sentences into multiple subtitles where necessary. And it's learning all the time.
For the human part of the work, Media Studio includes a web-based subtitle editor and a management system, both including a significant range of features right from the start. Translators can edit time codes in a drag-and-drop fashion, skip parts of the video without speech, customize keyboard shortcuts, and more. Project managers can assign jobs and automatically send job notifications, track productivity, and MT leverage.
The video is hosted remotely and is streamed to linguists instead of sending complete films and episodes. This adds a security layer for the intellectual property. No one in the biz wants the next episode of the Game of Thrones to end up on thepiratebay.org faster than it would on a streaming service. Linguists in low-bandwidth countries can download videos in low quality and with a watermark.
On the downside, this new tool does not integrate with existing CAT and business management systems for LSPs out of the box, doesn't have translation memory support or anything else that would make it fit as one of the blades in the Swiss army knife of LSP technology.
According to Omniscien's CEO Dion Wiggins, iflix has processed hundreds of thousands of video hours through the system since its inception in late 2016. By now, three more large OTT providers have started with Media Studio. Content distribution companies are the main target for the tool, but it will be available for LSPs as well once the pricing is finalized.
The subtitle editor is a CAT-tool with an embedded video player. Translators using this platform can watch videos and transcribe them with timings, possibly with integrated speech recognition to automatically create the first pass. As they translate using translation memory and termbase, they are able to see the subtitles appear on the screen.
The home dubbing is all about the setup on the voice-actor side. TransPerfect sends them mics and soundproofing so that recording can happen at home rather than at a local audio studio.
A media asset management platform stores videos at a single location and proxies them to the translator applications instead of sending complete files over the Internet, similar to Omniscien's approach.
The official launch of TransPerfect's Media.NEXT is scheduled for mid-August.
TransPerfect's tech is proprietary, meant to create a competitive advantage. Media localization companies such as Zoo Digital and Lylo took a similar approach. They have launched cloud subtitling and dubbing platforms, but continue to keep technology under the radar of other LSPs.
The idea of "dubbing in the cloud" is that it gives the client visibility into the actual stage of the process, and flexibility with early-stage review and collaboration with the vendor. The same idea permeates Deluxe Media's platform Deluxe One unveiled in April this year. It's a customer portal that provides clients with access to multiple services and APIs.
At the same time, subtitling capabilities are beginning to make their way into tools that are available to hundreds of LSPs around the world.
Popular translation editor memoQ has added a video player with a preview in their July release. The editor now opens the video file at the point that is being translated and displays the translated text so that translators can check it live. It can also show the number of words per minute, characters per second, or characters per line.
A similar preview appears in Wordbee. The embedded video player can open videos from an URL, or play clips that are uploaded to the editor directly. The initial release includes a character limitation feature to keep subtitles concise, and anchoring: clicking on the segment with the text rewinds the video to that text.
This is a step showing memoQ's and Wordbee's move deeper into media, and differentiating them from other TMS.
So far, few TMS had video previews, one of them was Smartcat. Subtitling functionality in Smartcat has been developed in 2013 for a special project, crowdsourced localization of e-learning platform Courserra. Today, users need to enable subtitling functionality on request. The feature set available includes a video player, timecode parsing, and anchoring. Subtitling user numbers in Smartcat are rising, according to product manager Pavel Doronin.
Back to memoQ and Wordbee, their development teams probably will need to expand the list subtitling features over time: first of all, timecode editing. Moreover, memoQ and Wordbee support .SRT extension, whereas Omniscien's tool supports TTML as well: a more advanced format that allows manipulating subtitle colors, position on screen and formatting. TTML might become more important for video on demand work and streaming platforms, for instance, it is the format that Netflix uses.
Future "luxury" features could include character tracking with descriptions explaining their voice and preferred vocabulary, support for the speech-to-text technology, audio recording, etc.
Subtitling is not new to the translation industry, and almost every mature CAT/TMS supports .srt SubRip text files. However, linguists have to run a third-party video player in a separate window to see their work. They also have to reload and rewind every time to see changes in the subtitles.
That's why in professional scenarios, subtitlers often use Amara, Subtitle Workshop, Oona captions manager, CaptionHub or similar specialized tools. These tools came from outside the language industry and didn't support translation memories, term bases, and embedded MT.
Previous attempts to create tools that combine the best of two worlds didn't quite meet with commercial success. Years following the launch, user numbers for dotsub.com, hakromedia SoundCloud, and videolocalize.com stayed limited. So far, most language industry professionals viewed media localization as a niche service rather than as a growth area. As a result, they didn't invest in specialized departments and software. But with video content increasing in share, and with media companies demonstrating record revenues, this might eventually change.
However, by the time it does change, translation tools may achieve a "good enough" capability. Fast-forward 1-2 years – most LSPs might be able to subtitle without extra investment or training. It will become even easier to enter into subtitling and compete, leading to price pressure. Subtitling may turn into an even more crowded and low-margin space before you can say "commoditization".
Dubbing, on the other hand, is a different kind of deal.
So far, the dubbing market has been dominated by larger companies such as Deluxe and SDI Media that provide voice talent in physical sound studios located in multiple countries. Perhaps one of the best examples of this would be Disney's Let It Go which has been translated into at least 74 languages.
Infrastructure for such projects is costly to build and maintain. Brick-and-mortar studios have high bills and need a constant flow of work to stay profitable. Projects might be hard to find for second-tier language outlets. To have a French studio overloaded and a Croatian studio suffering losses year after year is a realistic scenario for a network company.
The virtual/home studio approach being used by newer players in this field such as TransPerfect, Zoo Digital and Lylo Media, is more scalable and provides acceptable quality for most clients. But will it be enough for high-profile content owners that award the largest contracts?
If the home studio approach produces sustainable growth, commercial software vendors will jump in and replicate the technology, leading to lower entry to dubbing. However, if it fails over 2018-2019, instead M&A will become the go-to-market strategy in the media localization space. Watch out for smaller studio acquisition frenzy!
SDL Trados 2019 is Here!
Check the new features of Trados 2019 and stay tuned for our videos to go through the most important updates!


Custom Framed Mirrors- Roma - Builders Glass of Bonita, Inc.
We believe there is only one choice for custom framed mirrors – Roma Moulding. As a Design focused Glass and Mirror Company, offering custom frames was a must. The decision to partner with Roma Mouldings was an easy one. Roma's frames are not only of the finest quality, but the selection is simply the best. The hardest part is selecting which one to pick! We have many Roma Framed Mirrors on display in our Glass Design Center, and narrowing down the selection to our favorites often takes us weeks. We love them all, and so will you.
Don't be afraid of a wider frame, even if the mirror is smaller. Trust us, it works. It looks strong, bold and confident.
Don't match it – Consider contrasting your dark cabinetry for example, with a white or pewter framed vanity mirror. To get the custom look, the idea is not to match them.
Bevel it – Framed mirrors always look good with a beveled mirror. While we can cut and polish regular mirror in-house, we order beveled mirror from a manufacturer.
Stack it – stacking two frames together always looks amazing. You can add interest by picking two contrasting colors, and the stacked frame also adds depth.
Frame that TV – Add a frame to your TV and turn it into a work of art.


Did you know cable is not your only option for TV? While there are several different types of TV service, they all provide TV channels and services to your home. If you're looking for more information on alternatives to cable TV, keep reading for information on the variety of TV services available.
When shopping for TV, it's great to compare all available services to figure out the best option for your household. But when you start looking at your options, it's a good idea to consider other alternatives to the traditional cable TV. For starters, cable TV is often restricted to certain areas. Your next door neighbor may have one provider, but you may not be able to get the same service. Coverage is dependent on where the underground cables are laid. Where there are no cables, there is no coverage.
When you shop for TV service, the channels and programming are often the most important aspect to consider, apart from availability. Traditional cable TV may not have the channels you want. Consider other alternatives to cable TV to make sure you're getting all the channels you want, and maybe some extras.
Satellite TV service, from providers like DIRECTV, is a great alternative to cable TV. Cable TV restrictions often dictate what TV provider you get, but satellite TV isn't nearly as restricted. Customers just need a clear view of the southern sky to get satellite TV programming. A company like DIRECTV is a nationally available satellite TV service, so even if you live in remote, rural areas, you can get quality TV service.
Fiber optics is a high-speed form of cable TV, using fiber optic cables instead of traditional wires. Fiber optics are glass wires woven together to make the cable. Fiber optics are a great alternative to cable TV, given the quality transmission. Like cable TV, however, fiber optics are not available everywhere. As an alternative to cable TV, fiber optics can provide clearer and faster reception than cable, which is always a plus.
Cable TV alternatives are also found online. Companies like Netflix, Hulu, Apple and Amazon are all options for streaming TV. These services require a high-speed Internet connection and subscription, but that's it. They are portable and offer a wide variety of programming. Depending on your interests, you can find popular shows, as well as entire seasons of series, new and old movies and other programs like the news. One of the main cons for streaming TV is the lag time between when a show airs and when it's available to you. Another concern is data usage. Streaming TV programs uses a lot of bandwidth, so if your MBPS isn't up to par, your show could be fuzzy or choppy.
Cable TV alternatives are easy to come by, each offering its own advantages. Choosing the right one can ultimately come down to what kind of programming you want and what kind of quality and reception you're looking for. Explore your options to find the best fit for you.


text:
'use strict'

/**
 * Module dependencies.
 * @private
 */

var debug = require('debug')('router:route')
var flatten = require('array-flatten').flatten
var Layer = require('./layer')
var methods = require('methods')

/**
 * Module variables.
 * @private
 */

var slice = Array.prototype.slice

/* istanbul ignore next */
var defer = typeof setImmediate === 'function'
  ? setImmediate
  : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }

/**
 * Expose `Route`.
 */

module.exports = Route

/**
 * Initialize `Route` with the given `path`,
 *
 * @param {String} path
 * @api private
 */

function Route(path) {
  debug('new %o', path)
  this.path = path
  this.stack = []

  // route handlers for various http methods
  this.methods = Object.create(null)
}

/**
 * @private
 */

Route.prototype._handles_method = function _handles_method(method) {
  if (this.methods._all) {
    return true
  }

  // normalize name
  var name = typeof method === 'string'
    ? method.toLowerCase()
    : method

  if (name === 'head' && !this.methods['head']) {
    name = 'get'
  }

  return Boolean(this.methods[name])
}

/**
 * @return {array} supported HTTP methods
 * @private
 */

Route.prototype._methods = function _methods() {
  var methods = Object.keys(this.methods)

  // append automatic head
  if (this.methods.get && !this.methods.head) {
    methods.push('head')
  }

  for (var i = 0; i < methods.length; i++) {
    // make upper case
    methods[i] = methods[i].toUpperCase()
  }

  return methods
}

/**
 * dispatch req, res into this route
 *
 * @private
 */

Route.prototype.dispatch = function dispatch(req, res, done) {
  var idx = 0
  var stack = this.stack
  var sync = 0

  if (stack.length === 0) {
    return done()
  }

  var method = typeof req.method === 'string'
    ? req.method.toLowerCase()
    : req.method

  if (method === 'head' && !this.methods['head']) {
    method = 'get'
  }

  req.route = this

  next()

  function next(err) {
    // signal to exit route
    if (err && err === 'route') {
      return done()
    }

    // signal to exit router
    if (err && err === 'router') {
      return done(err)
    }

    // no more matching layers
    if (idx >= stack.length) {
      return done(err)
    }

    // max sync stack
    if (++sync > 100) {
      return defer(next, err)
    }

    var layer
    var match

    // find next matching layer
    while (match !== true && idx < stack.length) {
      layer = stack[idx++]
      match = !layer.method || layer.method === method
    }

    // no match
    if (match !== true) {
      return done(err)
    }

    if (err) {
      layer.handle_error(err, req, res, next)
    } else {
      layer.handle_request(req, res, next)
    }

    sync = 0
  }
}

/**
 * Add a handler for all HTTP verbs to this route.
 *
 * Behaves just like middleware and can respond or call `next`
 * to continue processing.
 *
 * You can use multiple `.all` call to add multiple handlers.
 *
 *   function check_something(req, res, next){
 *     next()
 *   }
 *
 *   function validate_user(req, res, next){
 *     next()
 *   }
 *
 *   route
 *   .all(validate_user)
 *   .all(check_something)
 *   .get(function(req, res, next){
 *     res.send('hello world')
 *   })
 *
 * @param {array|function} handler
 * @return {Route} for chaining
 * @api public
 */

Route.prototype.all = function all(handler) {
  var callbacks = flatten(slice.call(arguments))

  if (callbacks.length === 0) {
    throw new TypeError('argument handler is required')
  }

  for (var i = 0; i < callbacks.length; i++) {
    var fn = callbacks[i]

    if (typeof fn !== 'function') {
      throw new TypeError('argument handler must be a function')
    }

    var layer = Layer('/', {}, fn)
    layer.method = undefined

    this.methods._all = true
    this.stack.push(layer)
  }

  return this
}

methods.forEach(function (method) {
  Route.prototype[method] = function (handler) {
    var callbacks = flatten(slice.call(arguments))

    if (callbacks.length === 0) {
      throw new TypeError('argument handler is required')
    }

    for (var i = 0; i < callbacks.length; i++) {
      var fn = callbacks[i]

      if (typeof fn !== 'function') {
        throw new TypeError('argument handler must be a function')
      }

      debug('%s %s', method, this.path)

      var layer = Layer('/', {}, fn)
      layer.method = method

      this.methods[method] = true
      this.stack.push(layer)
    }

    return this
  }
})


Paying more taxes is entirely at your own discretion! However, by utilizing astute tax planning techniques and implementing innovative tax strategies I can assist you to maximize your earnings, minimize tax liabilities and retain profits in your business.
I take the uncertainty out of any tax or financial situation for individuals, small businesses, or corporations.
I emphasize my unique tax planning methods to find a customized solution for your personal or business finances. I offer you professional tax preparation that includes the implementation of strategies discussed during the planning process. I work closely with my clients to make them aware of their options and then I prepare their taxes to achieve the best possible results.
So whether you are seeking accounting services or tax preparation, my level of expertise in both tax and financial matters gives you optimal results and peace of mind.