text:
#include "tensorflow/core/framework/common_shape_fns.h"
#include "tensorflow/core/framework/op.h"

namespace tensorflow {

using shape_inference::DimensionHandle;
using shape_inference::InferenceContext;
using shape_inference::ShapeHandle;

REGISTER_OP("VariableV2")
    .Output("ref: Ref(dtype)")
    .Attr("shape: shape")
    .Attr("dtype: type")
    .Attr("container: string = ''")
    .Attr("shared_name: string = ''")
    .SetIsStateful()
    .SetShapeFn([](InferenceContext* c) {
      TensorShapeProto shape_proto;
      TF_RETURN_IF_ERROR(c->GetAttr("shape", &shape_proto));
      ShapeHandle output_shape;
      TF_RETURN_IF_ERROR(
          c->MakeShapeFromShapeProto(shape_proto, &output_shape));
      c->set_output(0, output_shape);
      return Status::OK();
    })
    .Doc(R"doc(
Holds state in the form of a tensor that persists across steps.

Outputs a ref to the tensor state so it may be read or modified.
TODO(zhifengc/mrry): Adds a pointer to a more detail document
about sharing states in tensorflow.

ref: A reference to the variable tensor.
shape: The shape of the variable tensor.
dtype: The type of elements in the variable tensor.
container: If non-empty, this variable is placed in the given container.
        Otherwise, a default container is used.
shared_name: If non-empty, this variable is named in the given bucket
             with this shared_name. Otherwise, the node name is used instead.
)doc");

REGISTER_OP("Variable")
    .Output("ref: Ref(dtype)")
    .Attr("shape: shape")
    .Attr("dtype: type")
    .Attr("container: string = ''")
    .Attr("shared_name: string = ''")
    .SetIsStateful()
    .SetShapeFn([](InferenceContext* c) {
      PartialTensorShape shape;
      TF_RETURN_IF_ERROR(c->GetAttr("shape", &shape));

      // Variable has legacy behavior where we cannot tell the difference
      // between a scalar shape attribute and 'unknown shape'.  So if the shape
      // is a scalar, we return an unknown shape.
      if (shape.dims() <= 0) {
        return shape_inference::UnknownShape(c);
      }

      TensorShapeProto shape_proto;
      shape.AsProto(&shape_proto);
      ShapeHandle out;
      TF_RETURN_IF_ERROR(c->MakeShapeFromShapeProto(shape_proto, &out));
      c->set_output(0, out);
      return Status::OK();
    })
    .Doc("Use VariableV2 instead.");

REGISTER_OP("IsVariableInitialized")
    .Input("ref: Ref(dtype)")
    .Output("is_initialized: bool")
    .Attr("dtype: type")
    .SetAllowsUninitializedInput()
    .SetShapeFn(shape_inference::ScalarShape)
    .Doc(R"doc(
Checks whether a tensor has been initialized.

Outputs boolean scalar indicating whether the tensor has been initialized.

ref: Should be from a `Variable` node. May be uninitialized.
dtype: The type of elements in the variable tensor.
)doc");

REGISTER_OP("TemporaryVariable")
    .Output("ref: Ref(dtype)")
    .Attr("shape: shape")
    .Attr("dtype: type")
    .Attr("var_name: string = ''")
    .SetIsStateful()
    .SetShapeFn([](InferenceContext* c) {
      TensorShapeProto shape_proto;
      TF_RETURN_IF_ERROR(c->GetAttr("shape", &shape_proto));
      ShapeHandle output;
      TF_RETURN_IF_ERROR(c->MakeShapeFromShapeProto(shape_proto, &output));
      c->set_output(0, output);
      return Status::OK();
    })
    .Doc(R"doc(
Returns a tensor that may be mutated, but only persists within a single step.

This is an experimental op for internal use only and it is possible to use this
op in unsafe ways.  DO NOT USE unless you fully understand the risks.

It is the caller's responsibility to ensure that 'ref' is eventually passed to a
matching 'DestroyTemporaryVariable' op after all other uses have completed.

Outputs a ref to the tensor state so it may be read or modified.

  E.g.
      var = state_ops._temporary_variable([1, 2], types.float_)
      var_name = var.op.name
      var = state_ops.assign(var, [[4.0, 5.0]])
      var = state_ops.assign_add(var, [[6.0, 7.0]])
      final = state_ops._destroy_temporary_variable(var, var_name=var_name)

ref: A reference to the variable tensor.
shape: The shape of the variable tensor.
dtype: The type of elements in the variable tensor.
var_name: Overrides the name used for the temporary variable resource. Default
value is the name of the 'TemporaryVariable' op (which is guaranteed unique).
)doc");

REGISTER_OP("DestroyTemporaryVariable")
    .Input("ref: Ref(T)")
    .Output("value: T")
    .Attr("T: type")
    .Attr("var_name: string")
    .SetShapeFn(shape_inference::UnchangedShape)
    .Doc(R"doc(
Destroys the temporary variable and returns its final value.

Sets output to the value of the Tensor pointed to by 'ref', then destroys
the temporary variable called 'var_name'.
All other uses of 'ref' *must* have executed before this op.
This is typically achieved by chaining the ref through each assign op, or by
using control dependencies.

Outputs the final value of the tensor pointed to by 'ref'.

ref: A reference to the temporary variable tensor.
var_name: Name of the temporary variable, usually the name of the matching
'TemporaryVariable' op.
)doc");

REGISTER_OP("Assign")
    .Input("ref: Ref(T)")
    .Input("value: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: type")
    .Attr("validate_shape: bool = true")
    .Attr("use_locking: bool = true")
    .SetAllowsUninitializedInput()
    .SetShapeFn([](InferenceContext* c) {
      bool validate_shape;
      TF_RETURN_IF_ERROR(c->GetAttr("validate_shape", &validate_shape));
      if (validate_shape) {
        return shape_inference::MergeBothInputsShapeFn(c);
      }

      c->set_output(0, c->input(1));
      return Status::OK();
    })
    .Doc(R"doc(
Update 'ref' by assigning 'value' to it.

This operation outputs "ref" after the assignment is done.
This makes it easier to chain operations that need to use the reset value.

ref: Should be from a `Variable` node. May be uninitialized.
value: The value to be assigned to the variable.
validate_shape: If true, the operation will validate that the shape
  of 'value' matches the shape of the Tensor being assigned to.  If false,
  'ref' will take on the shape of 'value'.
use_locking: If True, the assignment will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
output_ref:= Same as "ref".  Returned as a convenience for operations that want
  to use the new value after the variable has been reset.
)doc");

REGISTER_OP("AssignAdd")
    .Input("ref: Ref(T)")
    .Input("value: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("use_locking: bool = false")
    .SetShapeFn(shape_inference::MergeBothInputsShapeFn)
    .Doc(R"doc(
Update 'ref' by adding 'value' to it.

This operation outputs "ref" after the update is done.
This makes it easier to chain operations that need to use the reset value.

ref: Should be from a `Variable` node.
value: The value to be added to the variable.
use_locking: If True, the addition will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
output_ref:= Same as "ref".  Returned as a convenience for operations that want
  to use the new value after the variable has been updated.
)doc");

REGISTER_OP("AssignSub")
    .Input("ref: Ref(T)")
    .Input("value: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("use_locking: bool = false")
    .SetShapeFn(shape_inference::MergeBothInputsShapeFn)
    .Doc(R"doc(
Update 'ref' by subtracting 'value' from it.

This operation outputs "ref" after the update is done.
This makes it easier to chain operations that need to use the reset value.

ref: Should be from a `Variable` node.
value: The value to be subtracted to the variable.
use_locking: If True, the subtraction will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
output_ref:= Same as "ref".  Returned as a convenience for operations that want
  to use the new value after the variable has been updated.
)doc");

namespace {

Status ScatterUpdateShape(InferenceContext* c) {
  ShapeHandle var_shape = c->input(0);
  ShapeHandle indices_shape = c->input(1);

  ShapeHandle unused_updates_shape;
  ShapeHandle concat;
  ShapeHandle var_subshape;
  TF_RETURN_IF_ERROR(c->Subshape(var_shape, 1, &var_subshape));
  TF_RETURN_IF_ERROR(c->Concatenate(indices_shape, var_subshape, &concat));
  TF_RETURN_IF_ERROR(c->Merge(c->input(2), concat, &unused_updates_shape));

  c->set_output(0, var_shape);
  return Status::OK();
}

}  // namespace

REGISTER_OP("ScatterUpdate")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: type")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = true")
    .SetShapeFn(ScatterUpdateShape)
    .Doc(R"doc(
Applies sparse updates to a variable reference.

This operation computes

```python
    # Scalar indices
    ref[indices, ...] = updates[...]

    # Vector indices (for each i)
    ref[indices[i], ...] = updates[i, ...]

    # High rank indices (for each i, ..., j)
    ref[indices[i, ..., j], ...] = updates[i, ..., j, ...]
```

This operation outputs `ref` after the update is done.
This makes it easier to chain operations that need to use the reset value.

If values in `ref` is to be updated more than once, because there are
duplicate entries in `indices`, the order at which the updates happen
for each value is undefined.

Requires `updates.shape = indices.shape + ref.shape[1:]`.

ref: Should be from a `Variable` node.
indices: A tensor of indices into the first dimension of `ref`.
updates: A tensor of updated values to store in `ref`.
output_ref:= Same as `ref`.  Returned as a convenience for operations that want
  to use the updated values after the update is done.
use_locking: If True, the assignment will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
)doc");

REGISTER_OP("ScatterAdd")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterUpdateShape)
    .Doc(R"doc(
Adds sparse updates to a variable reference.

This operation computes

    # Scalar indices
    ref[indices, ...] += updates[...]

    # Vector indices (for each i)
    ref[indices[i], ...] += updates[i, ...]

    # High rank indices (for each i, ..., j)
    ref[indices[i, ..., j], ...] += updates[i, ..., j, ...]

This operation outputs `ref` after the update is done.
This makes it easier to chain operations that need to use the reset value.

Duplicate entries are handled correctly: if multiple `indices` reference
the same location, their contributions add.

Requires `updates.shape = indices.shape + ref.shape[1:]`.

ref: Should be from a `Variable` node.
indices: A tensor of indices into the first dimension of `ref`.
updates: A tensor of updated values to add to `ref`.
output_ref:= Same as `ref`.  Returned as a convenience for operations that want
  to use the updated values after the update is done.
use_locking: If True, the addition will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
)doc");

REGISTER_OP("ScatterSub")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterUpdateShape)
    .Doc(R"doc(
Subtracts sparse updates to a variable reference.

```python
    # Scalar indices
    ref[indices, ...] -= updates[...]

    # Vector indices (for each i)
    ref[indices[i], ...] -= updates[i, ...]

    # High rank indices (for each i, ..., j)
    ref[indices[i, ..., j], ...] -= updates[i, ..., j, ...]
```

This operation outputs `ref` after the update is done.
This makes it easier to chain operations that need to use the reset value.

Duplicate entries are handled correctly: if multiple `indices` reference
the same location, their (negated) contributions add.

Requires `updates.shape = indices.shape + ref.shape[1:]`.

ref: Should be from a `Variable` node.
indices: A tensor of indices into the first dimension of `ref`.
updates: A tensor of updated values to subtract from `ref`.
output_ref:= Same as `ref`.  Returned as a convenience for operations that want
  to use the updated values after the update is done.
use_locking: If True, the subtraction will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
)doc");

REGISTER_OP("ScatterMul")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterUpdateShape)
    .Doc(R"doc(
Multiplies sparse updates into a variable reference.

This operation computes

```python
    # Scalar indices
    ref[indices, ...] *= updates[...]

    # Vector indices (for each i)
    ref[indices[i], ...] *= updates[i, ...]

    # High rank indices (for each i, ..., j)
    ref[indices[i, ..., j], ...] *= updates[i, ..., j, ...]
```

This operation outputs `ref` after the update is done.
This makes it easier to chain operations that need to use the reset value.

Duplicate entries are handled correctly: if multiple `indices` reference
the same location, their contributions multiply.

Requires `updates.shape = indices.shape + ref.shape[1:]`.

ref: Should be from a `Variable` node.
indices: A tensor of indices into the first dimension of `ref`.
updates: A tensor of updated values to multiply to `ref`.
output_ref:= Same as `ref`.  Returned as a convenience for operations that want
  to use the updated values after the update is done.
use_locking: If True, the operation will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
)doc");

REGISTER_OP("ScatterDiv")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterUpdateShape)
    .Doc(R"doc(
Divides a variable reference by sparse updates.

This operation computes

```python
    # Scalar indices
    ref[indices, ...] /= updates[...]

    # Vector indices (for each i)
    ref[indices[i], ...] /= updates[i, ...]

    # High rank indices (for each i, ..., j)
    ref[indices[i, ..., j], ...] /= updates[i, ..., j, ...]
```

This operation outputs `ref` after the update is done.
This makes it easier to chain operations that need to use the reset value.

Duplicate entries are handled correctly: if multiple `indices` reference
the same location, their contributions divide.

Requires `updates.shape = indices.shape + ref.shape[1:]`.

ref: Should be from a `Variable` node.
indices: A tensor of indices into the first dimension of `ref`.
updates: A tensor of values that `ref` is divided by.
output_ref:= Same as `ref`.  Returned as a convenience for operations that want
  to use the updated values after the update is done.
use_locking: If True, the operation will be protected by a lock;
  otherwise the behavior is undefined, but may exhibit less contention.
)doc");

namespace {

Status ScatterNdUpdateShape(InferenceContext* c) {
  ShapeHandle ref_shape = c->input(0);
  ShapeHandle indices_shape;
  TF_RETURN_IF_ERROR(c->WithRankAtLeast(c->input(1), 1, &indices_shape));
  ShapeHandle updates_shape;
  TF_RETURN_IF_ERROR(c->WithRankAtLeast(c->input(2), 1, &updates_shape));

  if (c->RankKnown(indices_shape) && c->RankKnown(updates_shape)) {
    const int64 outer_dims = c->Rank(indices_shape) - 1;
    const DimensionHandle ixdim = c->Dim(indices_shape, -1);

    // We can only do more validation if the last dimension of indices
    // is a known value.
    if (c->ValueKnown(ixdim)) {
      int64 ix = c->Value(ixdim);
      ShapeHandle unused;
      ShapeHandle prefix_indices;
      TF_RETURN_IF_ERROR(
          c->Subshape(indices_shape, 0, outer_dims, &prefix_indices));
      ShapeHandle prefix_updates;
      TF_RETURN_IF_ERROR(
          c->Subshape(updates_shape, 0, outer_dims, &prefix_updates));

      Status s = c->Merge(prefix_indices, prefix_updates, &unused);
      if (!s.ok()) {
        return errors::InvalidArgument(
            "The outer ", outer_dims, " dimensions of indices.shape=",
            c->DebugString(indices_shape), "must match the outer ", outer_dims,
            " dimensions of updates.shape=", c->DebugString(updates_shape),
            ": ", s.error_message());
      }

      ShapeHandle suffix_ref;
      TF_RETURN_IF_ERROR(c->Subshape(ref_shape, ix, &suffix_ref));
      ShapeHandle suffix_updates;
      TF_RETURN_IF_ERROR(
          c->Subshape(updates_shape, outer_dims, &suffix_updates));
      s = c->Merge(suffix_ref, suffix_updates, &unused);
      if (!s.ok()) {
        return errors::InvalidArgument(
            "The inner ", c->Rank(ref_shape) - ix, " dimensions of ref.shape=",
            c->DebugString(ref_shape), "must match the inner ",
            c->Rank(updates_shape) - outer_dims,
            " dimensions of updates.shape=", c->DebugString(updates_shape),
            ": ", s.error_message());
      }
    }
  }

  c->set_output(0, ref_shape);
  return Status::OK();
}

}  // namespace

REGISTER_OP("ScatterNdUpdate")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: type")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = true")
    .SetShapeFn(ScatterNdUpdateShape)
    .Doc(R"doc(
Applies sparse `updates` to individual values or slices within a given
variable according to `indices`.

`ref` is a `Tensor` with rank `P` and `indices` is a `Tensor` of rank `Q`.

`indices` must be integer tensor, containing indices into `ref`.
It must be shape `[d_0, ..., d_{Q-2}, K]` where `0 < K <= P`.

The innermost dimension of `indices` (with length `K`) corresponds to
indices into elements (if `K = P`) or slices (if `K < P`) along the `K`th
dimension of `ref`.

`updates` is `Tensor` of rank `Q-1+P-K` with shape:

```
[d_0, ..., d_{Q-2}, ref.shape[K], ..., ref.shape[P-1]].
```

For example, say we want to update 4 scattered elements to a rank-1 tensor to
8 elements. In Python, that update would look like this:

```python
    ref = tf.Variable([1, 2, 3, 4, 5, 6, 7, 8])
    indices = tf.constant([[4], [3], [1] ,[7]])
    updates = tf.constant([9, 10, 11, 12])
    update = tf.scatter_nd_update(ref, indices, updates)
    with tf.Session() as sess:
      print sess.run(update)
```

The resulting update to ref would look like this:

    [1, 11, 3, 10, 9, 6, 7, 12]

See [tf.scatter_nd](#scatter_nd) for more details about how to make updates to
slices.

ref: A mutable Tensor. Should be from a Variable node.
indices: A Tensor. Must be one of the following types: int32, int64.
  A tensor of indices into ref.
updates: A Tensor. Must have the same type as ref. A tensor of updated
  values to add to ref.
use_locking: An optional bool. Defaults to True. If True, the assignment will
  be protected by a lock; otherwise the behavior is undefined,
  but may exhibit less contention.
output_ref: Same as ref. Returned as a convenience for operations that want to
  use the updated values after the update is done.
)doc");

REGISTER_OP("ScatterNdAdd")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterNdUpdateShape)
    .Doc(R"doc(
Applies sparse addition between `updates` and individual values or slices
within a given variable according to `indices`.

`ref` is a `Tensor` with rank `P` and `indices` is a `Tensor` of rank `Q`.

`indices` must be integer tensor, containing indices into `ref`.
It must be shape `[d_0, ..., d_{Q-2}, K]` where `0 < K <= P`.

The innermost dimension of `indices` (with length `K`) corresponds to
indices into elements (if `K = P`) or slices (if `K < P`) along the `K`th
dimension of `ref`.

`updates` is `Tensor` of rank `Q-1+P-K` with shape:

```
[d_0, ..., d_{Q-2}, ref.shape[K], ..., ref.shape[P-1]].
```

For example, say we want to add 4 scattered elements to a rank-1 tensor to 8
elements. In Python, that addition would look like this:

    ref = tf.Variable([1, 2, 3, 4, 5, 6, 7, 8])
    indices = tf.constant([[4], [3], [1], [7]])
    updates = tf.constant([9, 10, 11, 12])
    add = tf.scatter_nd_add(ref, indices, updates)
    with tf.Session() as sess:
      print sess.run(add)

The resulting update to ref would look like this:

    [1, 13, 3, 14, 14, 6, 7, 20]

See [tf.scatter_nd](#scatter_nd) for more details about how to make updates to
slices.

ref: A mutable Tensor. Should be from a Variable node.
indices: A Tensor. Must be one of the following types: int32, int64.
  A tensor of indices into ref.
updates: A Tensor. Must have the same type as ref. A tensor of updated values
  to add to ref.
use_locking: An optional bool. Defaults to True. If True, the assignment will
  be protected by a lock; otherwise the behavior is undefined,
  but may exhibit less contention.
output_ref: Same as ref. Returned as a convenience for operations that want
  to use the updated values after the update is done.
)doc");

REGISTER_OP("ScatterNdSub")
    .Input("ref: Ref(T)")
    .Input("indices: Tindices")
    .Input("updates: T")
    .Output("output_ref: Ref(T)")
    .Attr("T: numbertype")
    .Attr("Tindices: {int32, int64}")
    .Attr("use_locking: bool = false")
    .SetShapeFn(ScatterNdUpdateShape)
    .Doc(R"doc(
Applies sparse subtraction between `updates` and individual values or slices
within a given variable according to `indices`.

`ref` is a `Tensor` with rank `P` and `indices` is a `Tensor` of rank `Q`.

`indices` must be integer tensor, containing indices into `ref`.
It must be shape `[d_0, ..., d_{Q-2}, K]` where `0 < K <= P`.

The innermost dimension of `indices` (with length `K`) corresponds to
indices into elements (if `K = P`) or slices (if `K < P`) along the `K`th
dimension of `ref`.

`updates` is `Tensor` of rank `Q-1+P-K` with shape:

```
[d_0, ..., d_{Q-2}, ref.shape[K], ..., ref.shape[P-1]].
```

For example, say we want to subtract 4 scattered elements from a rank-1 tensor
with 8 elements. In Python, that subtraction would look like this:

    ref = tf.Variable([1, 2, 3, 4, 5, 6, 7, 8])
    indices = tf.constant([[4], [3], [1], [7]])
    updates = tf.constant([9, 10, 11, 12])
    sub = tf.scatter_nd_sub(ref, indices, updates)
    with tf.Session() as sess:
      print sess.run(sub)

The resulting update to ref would look like this:

    [1, -9, 3, -6, -4, 6, 7, -4]

See [tf.scatter_nd](#scatter_nd) for more details about how to make updates to
slices.

ref: A mutable Tensor. Should be from a Variable node.
indices: A Tensor. Must be one of the following types: int32, int64.
  A tensor of indices into ref.
updates: A Tensor. Must have the same type as ref. A tensor of updated values
  to subtract from ref.
use_locking: An optional bool. Defaults to True. If True, the assignment will
  be protected by a lock; otherwise the behavior is undefined,
  but may exhibit less contention.
output_ref: Same as ref. Returned as a convenience for operations that want
  to use the updated values after the update is done.
)doc");

// TODO(simister): Re-enable once these additional ops do not dramatically
// increase binary size.

// REGISTER_OP("ScatterNdMul")
//     .Input("ref: Ref(T)")
//     .Input("indices: Tindices")
//     .Input("updates: T")
//     .Output("output_ref: Ref(T)")
//     .Attr("T: numbertype")
//     .Attr("Tindices: {int32, int64}")
//     .Attr("use_locking: bool = false")
//     .SetShapeFn(ScatterNdUpdateShape)
//     .Doc(
//         R"doc(Applies sparse subtraction between `updates` and individual
//         values or slices within a given variable according to `indices`.

// `ref` is a `Tensor` with rank `P` and `indices` is a `Tensor` of rank `Q`.

// `indices` must be integer tensor, containing indices into `ref`.
// It must be shape `[d_0, ..., d_{Q-2}, K]` where `0 < K <= P`.

// The innermost dimension of `indices` (with length `K`) corresponds to
// indices into elements (if `K = P`) or slices (if `K < P`) along the `K`th
// dimension of `ref`.

// `updates` is `Tensor` of rank `Q-1+P-K` with shape:

// ```
// [d_0, ..., d_{Q-2}, ref.shape[K], ..., ref.shape[P-1]].
// ```

// For example, say we want to multiply 4 scattered elements with a rank-1
// tensor with 8 elements. In Python, that multiplication would look like this:

//     ref = tf.Variable([1, 2, 3, 4, 5, 6, 7, 8])
//     indices = tf.constant([[4], [3], [1], [7]])
//     updates = tf.constant([9, 10, 11, 12])
//     sub = tf.scatter_nd_mul(ref, indices, updates)
//     with tf.Session() as sess:
//       print sess.run(sub)

// The resulting update to ref would look like this:

//     [1, 22, 3, 40, 45, 6, 7, 96]

// See [tf.scatter_nd](#scatter_nd) for more details about how to make updates
// to slices.

// ref: A mutable Tensor. Should be from a Variable node.
// indices: A Tensor. Must be one of the following types: int32, int64. A tensor
// of indices into ref.
// updates: A Tensor. Must have the same type as ref. A tensor of updated values
// to subtract from ref.
// use_locking: An optional bool. Defaults to True. If True, the assignment will
// be protected by a lock; otherwise the behavior is undefined, but may exhibit
// less contention.
// output_ref: Same as ref. Returned as a convenience for operations that want
// to use the updated values after the update is done.)doc");

// REGISTER_OP("ScatterNdDiv")
//     .Input("ref: Ref(T)")
//     .Input("indices: Tindices")
//     .Input("updates: T")
//     .Output("output_ref: Ref(T)")
//     .Attr("T: numbertype")
//     .Attr("Tindices: {int32, int64}")
//     .Attr("use_locking: bool = false")
//     .SetShapeFn(ScatterNdUpdateShape)
//     .Doc(
//         R"doc(Applies sparse subtraction between `updates` and individual
//         values or slices within a given variable according to `indices`.

// `ref` is a `Tensor` with rank `P` and `indices` is a `Tensor` of rank `Q`.

// `indices` must be integer tensor, containing indices into `ref`.
// It must be shape `[d_0, ..., d_{Q-2}, K]` where `0 < K <= P`.

// The innermost dimension of `indices` (with length `K`) corresponds to
// indices into elements (if `K = P`) or slices (if `K < P`) along the `K`th
// dimension of `ref`.

// `updates` is `Tensor` of rank `Q-1+P-K` with shape:

// ```
// [d_0, ..., d_{Q-2}, ref.shape[K], ..., ref.shape[P-1]].
// ```

// For example, say we want to divide a rank-1 tensor with 8 elements by 4
// scattered elements. In Python, that division would look like this:

//     ref = tf.Variable([10, 20, 30, 40, 50, 60, 70, 80])
//     indices = tf.constant([[4], [3], [1], [7]])
//     updates = tf.constant([2, 3, 4, 5])
//     sub = tf.scatter_nd_div(ref, indices, updates)
//     with tf.Session() as sess:
//       print sess.run(sub)

// The resulting update to ref would look like this:

//     [10, 5, 30, 13, 25, 60, 70, 16]

// See [tf.scatter_nd](#scatter_nd) for more details about how to make updates
// to slices.

// ref: A mutable Tensor. Should be from a Variable node.
// indices: A Tensor. Must be one of the following types: int32, int64. A tensor
// of indices into ref.
// updates: A Tensor. Must have the same type as ref. A tensor of updated values
// to subtract from ref.
// use_locking: An optional bool. Defaults to True. If True, the assignment will
// be protected by a lock; otherwise the behavior is undefined, but may exhibit
// less contention.
// output_ref: Same as ref. Returned as a convenience for operations that want
// to use the updated values after the update is done.)doc");

REGISTER_OP("CountUpTo")
    .Input("ref: Ref(T)")
    .Output("output: T")
    .Attr("limit: int")
    .Attr("T: {int32, int64}")
    .SetShapeFn([](InferenceContext* c) {
      ShapeHandle output;
      TF_RETURN_IF_ERROR(c->WithRank(c->input(0), 0, &output));
      c->set_output(0, output);
      return Status::OK();
    })
    .Doc(R"doc(
Increments 'ref' until it reaches 'limit'.

ref: Should be from a scalar `Variable` node.
limit: If incrementing ref would bring it above limit, instead generates an
  'OutOfRange' error.
output: A copy of the input before increment. If nothing else modifies the
  input, the values produced will all be distinct.
)doc");

}  // namespace tensorflow

redpajama_set_name: RedPajamaGithub


text:
Karl Schlesinger papers
Document | Accession Number: 2019.473.1
Identification cards and papers, correspondence, certificates, and documents relating to Karl and Eva Schlesinger before, during, and after the Holocaust.
Identification documents.
2 oversize folders
United States Holocaust Memorial Museum collection, gift of Dave Schlesinger
Donated to the United States Holocaust Memorial Museum in 2019 by Dave Schlesinger, son of Karl Schlesinger.
Material(s) in this collection may be protected by copyright and/or related rights. You do not require further permission from the Museum to use this material. The user is solely responsible for making a determination as to if and how the material may be used.
Plastic eyeglass frames, temple and lenses worn by a Jewish concentration camp inmate
Eyeglass frames, temple, and lenses worn by Karl Schlesinger while a prisoner in several concentration camps from May 1939, when he was 22, until April 1945. As he was processed for prison, a German civilian warned him not to wear his glasses so he hid them in his hands. The eyeglass bridge was repaired by a German civilian working in one camp. By May 1939, Karl had fled Nazi Germany for Belgium. He was imprisoned twice by the Belgians, first as an illegal Jewish refugee, then as a German spy. He was sent to a military hospital in France and when Germany occupied that country in June 1940, he was transferred to St-Cyprien and Gurs internment camps. In August 1942, Karl was deported to Trezbinia concentration camp, then to Auschwitz, where he was tattooed with 160304. In November 1943, he was sent to Warsaw to clean the ghetto after the failed uprising. When Soviet troops approached in July 1944, he was forced on a death march and sent by train to Dachau, then Allach. He was liberated on a train on April 29 in Starnberger See by an American tank division. He traveled to Feldalfing and other dp camps where he heard that his parents were alive in Berlin. After two tries, he illegally crossed into the Soviet sector to find them. Karl reunited with his parents, Philipp and Johanna, in Berlin that November.
Metal ID badge with number 87308 issued to a Jewish prisoner
Shield shaped, metal identification badge with prisoner number 87308 issued to 27-year-old Karl Schlesinger in Dachau concentration camp in August 1944. It is painted yellow and red to identify Karl as a Jew. By May 1939, Karl had fled Nazi Germany for Belgium. He was imprisoned twice by the Belgians, first as an illegal Jewish refugee, then as a German spy. He was sent to a military hospital in France and when Germany occupied that country in June 1940, he was transferred to St-Cyprien and Gurs internment camps. In August 1942, Karl was deported to Trezbinia concentration camp, then to Auschwitz, where he was tattooed with 160304. In November 1943, he was sent to Warsaw to clean the ghetto after the failed uprising. When Soviet troops approached in July 1944, he was forced on a death march and sent by train to Dachau, then Allach. He was liberated on a train on April 29 in Starnberger See by an American tank division. He traveled to Feldalfing and other dp camps where he heard that his parents were alive in Berlin. After two tries, he illegally crossed into the Soviet sector to find them. Karl reunited with his parents, Philipp and Johanna, in Berlin that November.
Pair of eyeglasses (broken) carried by Karl Schlesinger during WWI
Postcard: form, completed by Karl Schelsinger in Feldafing displaced persons camp in Germany and addressed to Kurt Schlesinger in Palestine stating Karl is well, dated June 13, 1945, in three languages; photographic portrait of Karl: December 1945, Berlin, Germany

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Updating Android SQLite database table while user operates App and avoid errors/poor user experience My Android App has a products table in an SQLite database that comes pre-populated when the user installs it.  The table can be updated from an Azure web service.
Instead of returning only the updated records from the web service and populating the SQLite table with the updated records, I want to simply return the 2900 records to the App.  This is because most of the products will have changed.  On opening the App, the products table is deleted using an SQL query and the ksoap2 response is sent to Product objects which are inserted into the database.
While this update to the products table is happening, I would like the user to be able to use the App without disruption.  If the Products table has been deleted, then they cannot operate the App properly.
What are my options?  Could I populate a temporary Product table and when the service has finished populating it, I could copy it to the 'live' Product table.  Or could I completely delete the Product table and rename the temporary table to "Product"?
Or am I going about this completely wrong.  Any advice would be most appreciated.
Code extract below:
 try {

          productDatasource.open();
          productDatasource.deleteProductTable();
          productDatasource.close();
          ArrayList<Product> arrProduct = new ArrayList<Product>();
          SoapObject request = new SoapObject(NAMESPACE, PRODUCT_METHOD_NAME);

         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
         envelope.dotNet = true;
         envelope.setOutputSoapObject(request);
         System.out.println("startit");
         HttpTransportSE ht = new HttpTransportSE(URL);
         ht.debug = true;
         ht.call(SOAP_ACTION_PRODUCT, envelope);

         SoapObject response = (SoapObject) envelope.getResponse();

         productDatasource.open();
         productDatasource.deleteProductTable();
         Product[] products = new Product[response.getPropertyCount()];

         for (int i = 0; i < products.length; i++) {

             SoapObject prodObj = (SoapObject)response.getProperty(i);
             Product product = new Product();

             product.setProductID(Integer.parseInt(prodObj.getProperty(10).toString()));
             product.setProductName(prodObj.getProperty(11).toString());
             product.setFKCategoryID(Integer.parseInt(prodObj.getProperty(5).toString()));
             product.setFKSubCategoryID(Integer.parseInt(prodObj.getProperty(13).toString()));
             product.setFKBrandID(Integer.parseInt(prodObj.getProperty(2).toString()));

             productDatasource.createProduct(product);
         }

A: The DBHelper class follows the Respsitory pattern. Where the access to the underlaying data is contained in a "Repository" class. This frees up your main logic to concentrate on the business logic and pushes all the data handling responsibility to the Repository. Depending on the complexity of your application the Repository may act as a "Facade" where the calls are simply proxied through to a Repository responsible for the domain object.
The code below creates a very simple template for the DBHelper
public class DBHelper
{

    Context context;
    private SQLiteDatabase db;
    private final String DB_NAME = "MYDataBase";
    private final int DB_VERSION = 1;
    private final String TABLE_NAME = "Animal";
    private final String TABLE_ROW_ID = "id";
    private final String TABLE_ROW_ONE = "animal_name";
    private final String TABLE_ROW_TWO = "animal_bio";

    public DBHelper(Context context)
    {
        this.context = context;
        CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context);
        this.db = helper.getWritableDatabase();
    }

    public static byte[] getBitmapAsByteArray(Bitmap bitmap)
     {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }

    public void addRow(String name, String bio)
    {

        ContentValues values = new ContentValues();
        values.put(TABLE_ROW_ONE, name);
        values.put(TABLE_ROW_TWO, bio);

        try
        {
            db.insert(TABLE_NAME, null, values);
            Log.w("database message","Insert successfully");
        }
        catch(Exception e)
        {
            Log.e("DB ERROR", e.toString());
            //e.printStackTrace();
        }
    }
    public void deleteRow(long rowID)
    {
        try
        {
            db.delete(TABLE_NAME, TABLE_ROW_ID + "=" + rowID, null);
                Log.w("database message","delete successfully");
        }
        catch (Exception e)
        {
            Log.e("DB ERROR", e.toString());
            e.printStackTrace();
        }
    }

    public void updateRow(long rowID,String name,String bio)
    {

        ContentValues values = new ContentValues();
        values.put(TABLE_ROW_ONE, name);
        values.put(TABLE_ROW_TWO, bio);

        try
        {
            db.update(TABLE_NAME, values, TABLE_ROW_ID + "=" + rowID, null);
            Log.w("database message","Update successfully");
        }
        catch (Exception e)
        {
            Log.e("DB Error", e.toString());
            e.printStackTrace();
        }
    }
    public int count_row()
    {
        int row=0;
            Cursor cursor;

        try
        {
                    cursor = db.query(
                    TABLE_NAME,
                    new String[]{TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO},
                    null, null, null, null, null
            );

            cursor.moveToFirst();

            if (!cursor.isAfterLast())
            {
                do
                {
                    row++;
                }

                while (cursor.moveToNext());
            }
        }
        catch (SQLException e)
        {
            Log.e("DB Error", e.toString());
            e.printStackTrace();
        }
    Log.w("row count..",""+row);
        return row;
    }

    public void getRow(long rowID)
    {
        Cursor cursor;

        try
        {
            cursor = db.query
            (
                    TABLE_NAME,
                    new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO},
                    TABLE_ROW_ID + "=" + rowID,
                    null, null, null, null, null
            );

            cursor.moveToFirst();

            if (!cursor.isAfterLast())
            {
                do
                {
                    Log.w("row ",""+cursor.getLong(0));
                    Log.w("row ",""+cursor.getString(1));
                    Log.w("row ",""+cursor.getFloat(2));

                }

                while (cursor.moveToNext());
            }
            cursor.close();
        }
        catch (SQLException e)
        {
            Log.e("DB ERROR", e.toString());
            e.printStackTrace();
        }
    }
    public void getAllRows()
    {

        int i=0;
            Cursor cursor;

        try
        {
                    cursor = db.query(
                    TABLE_NAME,
                    new String[]{TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO},
                    null, null, null, null, null
            );

            cursor.moveToFirst();

            if (!cursor.isAfterLast())
            {
                do
                {
                    Log.w("row "+i,""+cursor.getLong(0));
                    Log.w("row "+i,""+cursor.getString(1));
                    Log.w("row "+i,""+cursor.getFloat(2));

                    i++;
                }

                while (cursor.moveToNext());
            }
        }
        catch (SQLException e)
        {
            Log.e("DB Error", e.toString());
            e.printStackTrace();
        }

    }
    private class CustomSQLiteOpenHelper extends SQLiteOpenHelper
    {
        public CustomSQLiteOpenHelper(Context context)
        {
            super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            String newTableQueryString = "create table " +
                                        TABLE_NAME +
                                        " (" +
                                        TABLE_ROW_ID + " integer primary key autoincrement not null," +
                                        TABLE_ROW_ONE + " text," +
                                        TABLE_ROW_TWO + " text" +
                                        ");";
                db.execSQL(newTableQueryString);

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {

        }
    }
}

public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DBHelper database = new DBHelper(this);
    database.addRow("name1","bio1");
    database.addRow("name2","bio2");
    database.addRow("name3","bio3");
    database.addRow("name4","bio4");
    database.addRow("name5","bio5");

    database.getAllRows();

    database.updateRow(2,"name20","bio20");

    database.getAllRows();

    database.deleteRow(2);

    database.getAllRows();
}

more detail
http://mel-tools.mit.edu/code/SimpleContentProvider/doc/edu/mit/mobile/android/content/class-use/DBHelper.html
copy DBHelper class in your application
I hope it is useful.....

A: Use a ContentProvider together with a CursorLoader so that your UI remains fluid while the content is updating.  Use BulkInsert to add rows faster.  If you can just update records instead of replacing them, then add a column that lets you mark the record as needing update.  For information on getting started with SQL databases on Android, see http://developer.android.com/guide/topics/data/data-storage.html#db and http://developer.android.com/training/basics/data-storage/databases.html.

redpajama_set_name: RedPajamaStackExchange


My name is Dean Osborne I am able work from home! If you found this page, I would say to at least read the below because it can change your life. It changed mine! You have nothing to lose by reading.
I am the founder of abcautotransportinfo.com but more importantly I would like to share some information that I stumbled upon as I surfed late one night looking for an opportunity to make some extra money.
As with most, I currently work a full time job where I am confined to the office for most of the day. I needed a way to make additional income!
Now although I had fairly stable job [full of challenges], I was looking for other avenues to supplement my income. I decided I would research some online possibilities. I started to work the search engines!
I ran into scores and scores of online business opportunites. I signed up with a few of their affiliate programs and I started working to promote these programs with little success. As a surfer of the net, I would see all these affiliate sites and I knew that a select few HAD to be making money online, and making it as they slept.
However, deep down I figured that if others are succeeding online- who are not necessarily smarter than I, then I should be able to succeed too.
With a little more self-conviction, I went back to Google and started to do more research. Again, I found several programs- but that time, of course, I was more cautious of the hype and false promises.
But one striked me! - one of Google's result showed up associateprograms.com - a directory of affiliates programs that also offers reviews.
I clicked it and found they were giving SBI some great reviews. I was really impressed- but, as you would understand, still cautious, as most of these so called 'online business opportunites' always seems to be quite impressive.
Anyway SBI had a free affiliate program, so I said what the heck, I'll give it a shot. I signed up free as an affiliate.
Believe me, the rest is history, I had made only one sale (US$75) as an affiliate before I decided I had seen enough, I bought the product!
Within three weeks of buying the product I founded Signs of a Cheater using SBI. I later went on to build Flat Stomach Exercises.
I only wish I would have found it before I built this website. You will however see that my home page will include the links at the bottom of the page just as my SBI site. Just a little trick I learned with SBI that you can find out about later.
I feel very accomplished to watch my little website pull visitors per day (as they promised) from 5 to 10 to 30, and then the snowball really got started- in only a few weeks!
Now although my site is still young, it is already matching up with the 'goliath' websites out there- albeit I have my own niche.
As of 10/04/07, just 4 months, the website was averaging over 100 unique visits, 235 total page views PER DAY!
"infidelity at the workplace "
...you will likely see this website [signs-of-a-cheater.com] on the FIRST or SECOND page!
Top 10 Signs Of Cheating Men - Here They Are!
on the first or second page. Guess who taught me how to get my articles ranking so high..you guessed it! Yes, in the TOP 10 of over millions of pages! AND THIS IS STILL EARLY DAYS!
It is still hard for me to believe that this website is getting so much traffic with all the websites online in only 4 months! Amazing!
SBI's 10-day guide takes away all the complexites of building a profitable website. In fact, it feels like nothing but fun!
Today, my primary income is from referrals to my website that I forward to qualified infidelity counselors and private investigators.
Visitors contact me, I forward the email and I get paid! I wouldn't have believed it myself 4 ½ months ago.
SBI also teaches you how to monetize your site using the Google Adsense program. Below you will see the stats after only the second month of using SBI and only the first full month of adsense (You will notice that adsense is not even on all my pages at Signs of a Cheater as yet!). I will implement this slowly over time.
This month I am on pace to receive about $190 from adsense alone.
When someone clicks on any of my google ads, I make money from Google!
But while I thank Google for a super product, my heartiest thanks go to Ken Envoy and SBI. Google "Ken Envoy" to read more about him!
Thanks to SBI I am now have my part time job where I work approx 6 hours a week from home at night and make close to $600 a month and that's in 4 months. My website has only approximately 35 pages so far which still makes it an infant site.
I am not the only fanatic of SBI either; there are hundreds of other little people- that are succeeding with SBI.
SBI is the answer to my prayers! You can also see the overview of what they have to offer here.
If you're not too sure about what I meant about earning money with the Google Adsense program or making money by referals, click here on Google Adsense or referals to learn how you can get started making money.
If you read this far, you have nothing to lose except a chance to work from home. If you do your research as I did (I even googled many of the sites listed in the case studies to see if they were really coming up in google) then you will know that you are covered by there Money Back Guarantee.
If still have any questions email me directly, I can answer an questions you may have.


1625187 – After doing the Emoji selection by mouse from the emoji category list, the same list does not invoke again.
Bug 1625187 - After doing the Emoji selection by mouse from the emoji category list, the same list does not invoke again.
Description of problem: Tried to select an Emoji using mouse from the emoji category list window. After that, tried to invoke the same window again using ctrl + shift + e. However, was not able to invoke it. Had to reboot. This works fine with keyboard selection.
When ctrl-shift-e is pressed again, the emoji category list window does not invoke.
The emoji category list window should invoke properly.
I see  the same problem, also when selecting the emoji using the keyboard only and not using the mouse.
I don't yet get that smiley inserted into  gedit, I still see the underlined "e"
- Repeat the above steps.
and I cannot input emoji anymore.
> using ctrl + shift + e. However, was not able to invoke it. Had to reboot.
> This works fine with keyboard selection.
This is caused because gnome-shell does not send focus-in event to ibus-extension-gtk3 because ibus emojier expects focus-en event and terminates ctrl-shift-e feature.
But the ibus implementation causes this bug and now I changed it and ibus terminates ctrl-shift-e feature immediately when an emoji is chosen whether focus-in event comes or not.
> only and not using the mouse.
This includes three issues actually.
This is caused because gnome-shell does not send focus-in event and it's filed as https://gitlab.gnome.org/GNOME/gnome-shell/issues/573 .
If you cannot cancel "e" with Escape key, it's caused because gnome-shell does not implement HidePreedit feature and it's filed as https://gitlab.gnome.org/GNOME/gnome-shell/issues/431 .
After you type anything, focus-in event comes and the emoji is output but the wrong order causes SEGV.
ibus-1.5.19-4.fc29 has been pushed to the Fedora 29 testing repository. If problems still persist, please make note of it in this bug report.
ibus-1.5.19-4.fc29 has been pushed to the Fedora 29 stable repository. If problems still persist, please make note of it in this bug report.


text:
All notable changes to this project will be documented in this file.

# TODO
- Create a distributed directory network that can help users find and verify public deadmann nodes
- Add the ability to build, upload, and download modules


text:
Cheap Trick - Mighty Wings (1986)
Genre(s): Hard rock / Pop rock
More of: Cheap Trick
"Mighty Wings" is a song by American rock band Cheap Trick, released in 1986 as the third single from the ...
"Mighty Wings" is a song by American rock band Cheap Trick, released in 1986 as the third single from the soundtrack of the film Top Gun. It was written by Harold Faltermeyer and Mark Spiro, and produced by Faltermeyer.
Despite the commercial success of the Top Gun soundtrack, and unlike the four other singles culled from the album, "Mighty Wings" failed to make an appearance in the Billboard chart. It was the third of five singles to be released from the soundtrack, following "Danger Zone" by Kenny Loggins and "Take My Breath Away" by Berlin.
In the film Top Gun, the music (without vocals) is played in the first training session at Miramar, while the full version with vocals is played during the ending credits.
Shortly prior to the song's release, guitarist Rick Nielsen said in an interview with MTV's Alan Hunter: "We just finished a song in the studio last night with Harold Faltermeyer, recording a song for his movie called "Top Gun" which has Tom Cruise in it, and so the song we did was called "Mighty Wings". We didn't write it but we did it, and it sounds pretty cool. That's coming out this summer."
"Mighty Wings" was originally due to be released as the second single from Top Gun. However, it was announced in Billboard that it had been pushed back in favour of "Take My Breath Away". "Mighty Wings" was released by Columbia in late June and issued on 7″ vinyl in the US, Canada, Japan and South Africa. The B-side, "Dog Fight #3", is an instrumental written and performed by Faltermeyer.
Upon release, Billboard listed the song as a pop pick and stated: "Feverish fast-pulse rock from Top Gun; inclusion in the smash soundtrack should push the band towards its strongest chart bid in years." In his 2017 book Still Competition: The Listener's Guide to Cheap Trick, Robert Lawson described the song as "a piece of soulless, synth-driven corporate rock".
Cheap Trick - Don't Be Cruel (1988)
Ann Wilson & Robin Zander - Surrender to Me (1988)
Samantha Fox - Do Ya Do Ya (Wanna Please Me) (1986)
Def Leppard - Love Bites (1988)
Queen - Flash (1980)
Genesis - In Too Deep (1986)
Warrant - Heaven (1989)
Neneh Cherry - Buffalo Stance (1988)
Gloria Estefan - Get On Your Feet (1989)
U2 - Sunday Bloody Sunday (1983)
Living Colour - Glamour Boys (1988)
Abba - Lay All Your Love On Me (1981)
Naked Eyes - Promises, Promises (1983)
Bananarama - Venus (1986)
Paul Young - Love of the Common People (1982)
Meat Loaf - Modern Girl (1984)
Tears For Fears - Shout (1984)


Nowadays, it's very important for your franchisee sites to be optimized for mobile devices. If you're not, you could lose some leads. All that business is now going to your competitors!
According to a research Google did, around 47% of consumers use their smartphones to search for local franchises. Even more, 67% said that they're more likely to purchase a product or service if the site is mobile-friendly. As a franchisor, it's very important that you look out for the upcoming trends and use them as an opportunity to further expand your (and your franchisees') business.
First of all, let's look at some examples.
In the image on the left, you can clearly see that this site is not mobile friendly: it doesn't fit right, it cuts off the text, the navigation menu is nowhere to be found and the users would have to do a lot of scrolling just to see your whole site.
On the right, there's an optimized version of the site. As you see, there's a clean, organized design that only showcases important information and the calls to action are visible and clickable. Keep this in mind because we'll come back to these examples quite a bit in this post.
But how to ensure your franchisees won't fall into the digital age gap? Look out for these mistakes you may want to avoid so your franchisees' websites are ready for all those mobile visitors!
What mistakes should you avoid in a franchisee mobile landing page?
Think a of a scenario where a lead is looking for a restaurant. They want to find a place to eat in a specific zone but, upon accessing your site, they notice you don't have a way for them to get to you. Sure, you have your address but this will force them to look you up in another app. So what do they do? They'll probably move on.
In this example, a potential customer has an emergency that they're looking to solve as soon as possible. With the "Click to Call" option, your users will be able to click (be it a button, image or text) and the smartphone will immediately dial and call your business. This is great because you totally eliminated the step where they have to write down your number to dial it later.
Consumers will be able to contact you faster and they'll remember that next time they have an emergency. 61% of mobile users would like a "Click to Call" option in mobile sites. With this feature, they'll feel that you value their time and that you're there for them just a click away. In this next image, you'll have a visual reference for the Click to Call button.
First of all, a Call to Action (CTA) is one of the most important elements for every site. It more commonly refers to a button, but it can be any piece of text or information on your site that gets your leads to convert in essence, maximizing lead generation. With mobile users, it's more important than ever to have a clear, visible, easy and prominent CTA.
Remember, the screen of mobile devices is smaller than those on a desktop computer or laptop, so your visitors need to find your CTA at a first glance. In the example on the left, the user would see a messed-up site with no visible call to action (phone or address) and this could be frustrating for him/her.
According to HubSpot, a visitor stays on a site 3 to 5 seconds before deciding if it's what he/she wants. Use this information as an opportunity and engage the mobile user with your site on that lapse.
What does this mean? Plain text can result on a boring landing page. Again, let's go back to the example at hand: the site on the left is nothing but text (which you can't even see completely!). Take into consideration that touch screens are meant to be touched and clicked.
That's why buttons will become your best friends: instead of displaying all your info in a single page and giving them a never-ending page where they have to scroll and scroll to get through your content, use buttons to redirect them to those other pages they want to look through.
In the example to the right, you'll see that the landing page concentrates on the core information, but includes content that visitors may find useful with the help of buttons.
The way a user interacts with his/her phone is crucial and you should take it into consideration when providing a mobile landing page.
For instance, your page should be responsive. What this means is that it should adapt to the width and tallness of different screens. As you may have noticed, different mobile devices have different dimensions and your site needs to fit correctly in each one.
According to Google's research, 64% of users said they only want to scroll up and down, not left and right. By making your site not responsive, the page may look awkward in other devices and can cause your users to have to scroll up, down, left and right just to find the information they need (like in the example on the left).
Another thing to think about is their fingers. Your users' fingers now work as an extended tool for that mobile device. This means that they're tapping, clicking and going through your information with their fingers.
On that note, nothing is more annoying than clicking one option and realizing that you clicked something else by mistake. Buttons should be big enough so that your users' fingers won't stumble upon other buttons or options.
Again, immediacy is key here. Mobile users want to find what they're looking for in a short amount of time or else, they'll move on to another site and to another business. This means that every piece of information should be one or two clicks away.
Don't make it a puzzle for them. Make the information they want to find accessible. I know that by trying to only put the main objective in your mobile site, you may feel the need to leave everything else out but you need to still include a way for the users to find the information they're looking for.
Content can be tricky in a mobile landing page. Some may advise that you don't add real text at all. This is because, while a "regular" site is all about images and narrative, users on a mobile device are there to get punctual information.
Given the space constraints, it can be fairly easy to end up with a cluttered landing page. Be smart about its design and really focus on your main goal. Everything that can be placed in the back-burner, should. Visitors much prefer a clean and organized design that leads them to the core of your business, but that gives them the opportunity to learn more about you if need be.
Remember that these are people that really value their time and they won't want to deal with slow-loading mobile pages because you added too much stuff. In the end, you should worry about including: your logo, CTA (or main goal), phone or address and a navigation strategy that will allow the visitor to go through more content or to the "normal" non-mobile site.
Get On With The Times!
You may think that your customers don't use mobile devices but this is a growing trend that will one day include the big majority of Internet users. A tool like Empowerkit may be able to get you on with the times because, while it specializes in franchisee websites, you can also design a mobile landing page with it. So maybe you should give it a try!
Now that you have all of this information (and a way to put it to good use), don't lose all of those leads by having an unfriendly mobile site. Think about your users and get yourself out there for everyone to find you, no matter what they're using to do so. Your business runs on customers so if they want a mobile friendly site, you should try and give it to them.
If you'd like to read Google's research (What Users Want Most From Mobile Sites Today), click on the link.
If you have any other questions about this post or Empowerkit, don't be afraid to ask!


How do I switch to GnERGY?
You can register by going through our SIMPLE and EASY online quotation form. Click on the following link to Get a Quote and switch.
Or you can call us on 01252 494141 and our friendly customer service advisers will be more than happy to do all the hard work for you.


Vacation rental cabin / bungalow. Sleeps 10, 3 bedrooms, 2.5 bathrooms. Dogs allowed.
1/28: Come on in and relax.
6/28: Dining Room. 4 chairs & bench. 5th chair in living room nook.
7/28: Well stocked kitchen w/ glass top range.
8/28: Looking into the living room / dining room from kitchen.
9/28: Master Bedroom on the main level.
10/28: Play hard, rest well.
12/28: Chalet windows bring in the afternoon sun.
14/28: Nintendo Wii in Living Room.
15/28: Movie Library in the Living Room.
16/28: Warm up by the pellet stove on chilly visits.
18/28: Another view of the loft.
19/28: Trundle bed in the loft - sleeps two.
20/28: Bedroom 2 - Upstairs.
22/28: Bedroom 3 - Upstairs. Two sets of bunkbeds.
23/28: TV w/ VCR & DVD in the `kids room`.
24/28: Looking into the living room from the loft.
25/28: Outdoor seating for summer picnics.
27/28: Large lot behind the house.
Property Size 1,725 sq. ft.
Your whole family will enjoy this marvelous house in a peaceful, private setting with all the modern conveniences and a mountain feel. A warm and inviting great room, large dining area and ample kitchen will suit family and friends and the three bedrooms plus a loft will sleep all comfortably. The Master Bedroom on the main living floor has a comfy California King bed.
There are 2 Flat Screen TVs. The flat screen TV in the Great Room is a "Smart" TV so you can access your Netflix or Amazon Prime accounts (no cable TV), or play games together on the Nintendo Wii. Stocked with plenty of family entertainment, you can spend your days in the house or enjoying many of the nearby outdoor activities. Bring your dog along as they are more than welcome.
In the winter you have your very own snow park on the large lot! In the warmer months enjoy the decks and outdoor dining space.
For winter reservations, please note the Mountain Getaway has an upslope driveway. 4 Wheel Drive vehicles or snow chains are highly recommended for winter access. Stairs required for entry.
Your rental of this home comes with Guest privileges to Blue Lake Springs Recreation Center. Amenities include: weekend dining at Snowflake Lodge, pool, two lakes, children's play equipment, and tennis courts. In the "Family Fun Zone" you will find a basketball court, ping pong tables, bocce, shuffleboard and horseshoes. At the center of their summer program are activities such as inner tube, water polo, story time, movie night and bingo. BLS access is subject to guest fees.
There is always something to do for everyone! Arnold Rim Trail, White Pines Lake, the Stanislaus River...World renowned Big Trees State Park...home of some of the largest and most beautiful Sequoia Trees are all less than 5 minutes away! Award winning wineries and boutique style shopping opportunities in the nearby town of Murphys will be sure to please everyone. And of course Bear Valley Ski Resort and numerous high country lakes and trails (Including the Pacific Crest Trail) are all just a short drive away!
We look forward to your next visit to the Mountain Getaway!
**Booking this home will ask you to choose linen service - this service is optional and is per bed. When checking out to book, make sure you choose the quantity of beds you'd like made. This will include sheets and towels for your stay. If you would not like to use our linen service, make sure you plan ahead and bring your own sheets and towels for your stay.
Special notes about this home Pet Friendly. Read your emailed Guest Packet, Garage access is not included. No Cable TV. Yes, we have A/C!


text:
Yangon's colonial facades mix with gridlock
Stories from Myanmar (and yes, the world really is a small place)
February 20, 2017 by Kate Leahy in blog post
To cross the road in Yangon, take it one lane at a time, even if the road is four lanes wide. Go slow and steady so cars can anticipate your movement. When possible, follow the lead of Burmese women crossing at the same time. There is power in numbers.
In January, 2015, I learned how to cross the road in Myanmar while researching my new book, Burma Superstar. It was my first trip to the country formerly called Burma, and the trip would take me to its other major city, Mandalay, as well as its famous temple town, Bagan. I came across many of the country's quirks (like going through security on your way out of the airport). Yet the biggest impression of the trip was the pace of change within the country.
This was especially true in Yangon.
Today, the city is a boomtown. Luxury brands, a mainstay in other major Asian cities, are moving into the city for the first time. The price of cars (while still out of reach for most Burmese) has come down significantly, and traffic now snarls its arteries all day long. A bureaucrat banned motorcycles from the city, so gridlock is even worse. (In comparison, in Mandalay mopeds and motorcycles take up most of the road.)
Mandalay's favored form of transportation
International hotels in Yangon during the high season (November through February) boast rates that surpass Bangkok. Office space here rents at a premium, too. And everywhere you go, everyone, even a street vender frying samosas in a wok propped over an open flame, has a smart phone. A country that never had reliable phone service skipped the step of installing landlines and went straight to cellular. If I had visited the country as recently as three years ago, I would be looking at a different skyline, one with fewer cranes.
At the same time, much has stayed the same. Open-air tea shops serving concentrated tea sweetened with evaporated and condensed milk are still filled with mostly men during the day. Men and women alike wear a mix of jeans and t-shirts with traditional clothing—there are no signs that traditional Burmese longyis are going out of style. And a country that's already filled with pagodas is still building pagodas.
A popular tea shop in Yangon; the man on the right is an expert milk-tea maker and now travels to different tea shops training staff.
On my first visit, Myanmar felt like new frontier, but of course that's silly: civilization has existed along the Ayerarwady River since the Bronze Age. Yet because a military dictatorship cut the country off from the rest of the world for more than 50 years, it can feel stuck in time. The colonial facades down Pansodan Street show the strain of tropical heat, but they also recall the time int he 1920s when Yangon was a booming city filled with immigrants.
To me, parts of Myanmar felt strangely familiar. On our drive to Mt. Popa, an extinct volcano that is said to be the home of more than 30 Burmese nats, spirits, we passed rural farms that reminded me of the snapshots my mom took of our neighborhood when we lived in the southern Philippines when I was little. That's where I learned how to eat everything—rice, crispy fish—with my hands. Myanmar's rural areas looked like how I think I remember rural parts of the Philippines from 30 years ago.
And then moments would jolt you back to the present day. On my second trip to Myanmar, in August 2015, I was a little less wide-eyed. At one stuffy restaurant in Yangon, we were waved into a small private dining room. The windows were closed, and in place of natural light was a pastel painting of an English country garden. Air condition blasted on our heads while the owner came in to talk about celebrities who had visited his restaurant. We picked at the Thai-Burmese fusion food.
This meal was decidedly NOT at the restaurant mentioned above. Instead, it's from one of my favorite Yangon spots known locally as Rakhine restaurant, a restaurant focused on the seafood from Rakhine State.
When the owner finally left, the general manager eventually warmed up to us and started talking about the United States. Turned out that he had lived there for years, first managing a sushi restaurant in New York City before moving to Tampa to work at a dry cleaners. He moved back to Yangon when his mom's health worsened.
What did he miss the most about America?
Three things: NFL, NBA, and Domino's Pizza. He was a Tampa Bay Buccaneers fan.
How Burmese prepsters roll
The Burma Superstar cookbook comes out at the end of March. My goal when writing the book was not to glamorize an exotic country but rather provide a little peak into a place in transition through the lens of a restaurant from a Chinese neighborhood in San Francisco. Some of the recipes are traditional Burmese dishes, others are not. But like the general manager at that odd restaurant in Yangon, identities are fluid.
And allowing for fluidity is more desirable than removing a country from the rest of the world for another 50 years, just so it doesn't change.
February 20, 2017 /Kate Leahy
burmese, Burma Superstar


text:
Andy Rourke RC interview - April, 2022
Category Other Ex-Smiths
Category The Smiths
Thread starter Famous when dead
Text reproduction of his interview in "Record Collector presents: The Smiths" special (April 21, 2022).
"ACE OF BASS
It all began with a Neil Young badge pinned to his school blazer. In this brand new interview, Andy Rourke tells Lois Wilson about the call from an old mate that would change his life forever...
I met Johnny at school when I was 11. I was really into Neil Young at the time and he was wearing a Neil Young Tonight's The Night lapel badge. This was when everyone else seemed to be into Jethro Tull and heavy metal, so Neil Young was a conversation opener and pretty soon we were spending all our spare time together, either playing music or listening to music or talking about music. We formed a band together, Freak Party. It was me on bass, Johnny on guitar and funky Si Wolstenscroft on drums, and the music did get funky. The Clash's Sandinista! had just come out and we were jumping on that vibe. We rehearsed every night until kicking out time, we got stoned a lot and jammed a lot. They were good days, but we auditioned countless frontmen to no avail and eventually Johnny quit out of frustration as it became clear we weren't going anywhere.
Not long after he quit he called me up. He had a new band called The Smiths. Did I want to join. They'd already played their first gig at the Ritz in Manchester with Dale Hibbert on bass. Some mates of mine had gone along but I hadn't. I met up with Johnny, he said it didn't work out with Dale and he gave me a demo tape which had two songs on it - Suffer Little Children and The Hand That Rocks The Cradle. It wasn't what I was expecting but I could hear something great in there, something different and I really liked what Johnny was doing, The first recordings I did with The Smiths were the demos for Handsome Devil and Miserable Lie and these were done in the downstairs of a studio in Chorlton called Drone. That's when I first met Morrissey and Mike. When I got there, Mike was saring up his drums. He was chatty, easy to get on with. Then, as I was setting up Morrissey arrived, he introduced himself as Stephen, shook my hand then shuffled into the corner and started going through his bag of lyrics and sandwiches and stuff. People often called him aloof at that time, but I think he was painfully shy, he just wasn't used to meeting new people. Our first gig was at Manhattan Sound in Manchester (on 25 January 1983) and it was utter chaos. There was no stage, the sound was terrible, the audience were right in your face, virtually touching you and I was so nervous I really didn't enjoy it at all. But we played OK. James Maker introduced us. He was our go-go dancer. I wasn't comfortable with his role and I am pretty sure Mike and Johnny felt the same. It was an unnecessary distraction and I think it cramped Morrissey's style. There wasn't much scope for him when James was jumping around.
Johnny and I used to go to The Hacienda pretty much every night. In those days it was really quiet and it was freezing cold. People sat in their own corner. There was the drug dealing corner, the gay corner, the extrovert corner and when we got a gig there [on 4 February 1983] it felt like a big deal, and in many ways our first proper gig. We had monitors and a stage and a set list and Morrissey ordered a shit load of gladioli and he threw half out to the audience, and half he stuck in his back pocket and that became a thing and the boxes got bigger and bigger and his back pockets got bigger and bigger and eventually he had half a tree in there.
After that Hacienda gig, we really took off, there was no stopping us. We were a had total belief and we had a real "us versus them" attitude. Not being on Factory, there was a sense we stood apart from the other Manchester bands like A Certain Ratio, New Order, Durutti Column. We were our own separate thing.
I don't remember the exact point Steven became Morrissey but I know he first broke the news to Johnny and Johnny gave us the heads up we weren't to call him Steven or, worse still, Steve, which he hated. At first it was really awkward calling him Morrissey, and he'd get embarrassed and then he'd call me Rourke and I wouldn't be sure if we were to revert back to calling him Steven but eventually it became normal and we even got down to just Moz and Mozza.
Going on Top Of The Pops with This Charming Man was another big deal. I'd grown up listening to the Top 20 on the radio with my mum and it had been everything to me so I was overjoyed, we all were, but we were all nervous too. We went down to the studio. It was very surreal and we weren't prepared for the total fakeness of it - the miming, the fake audience dancing (and if they didn't dance they got thrown out). We went into the make-up room and we'd bought Marks & Spencer sweaters for the occasion and they said, "What are you going to be wearing for the show?" and we were like, "This is it." We went on in our black jeans and sweaters. We definitely stood out.
Ironically, Strangeways, Here We Come is my favourite album. It's the one on which we completely gelled. We had come of age and we were in our element and ready to take on the world and then of course we split up. There was no inkling Johnny was going to leave but in hindsight I can see the frustrations, but I was too busy getting on with my own thing to realise the gravity of the situation. When he left the impact was huge and I think we were all traumatised and probably still are. No one knew how to react. I didn't know whether to call him or leave him alone. It was a really awful time, horrible. for everyone concerned.
Almost immediately after he left, Morrissey asked me and Mike to play on his solo stuff-a big kick in the eye for Johnny and it made me feel even more awkward about speaking to him. I felt like I had betrayed him so it was a long while before we spoke again. We had been best friends and then we weren't talking. I hadn't fallen out with him, but I felt guilty. It's not a time I fondly recall.
In The Smiths when we were getting songs together, Johnny already knew how the music would sound and he would play his guitar part. I would write the bass part and that was as far as my writing went. Morrissey brought out the songwriter in me. He believed I could do it and he made me believe I could do it and we ended up writing together. We started off with a blank page and a blank cassette and from that we wrote Yes, I Am Blind and Girl Least Likely To.
After Morrissey, there was Freebass (with Mani and Peter Hook) and D.A.R.K. I also wrote the music for Anthony Bourdain's Raw Craft TV series and worked with James Franco putting his poems inspired by The Smiths to music. I am currently playing in Blitz Vega with KAV from the Happy Mondays. We've got a single coming out this year called Strong Forever to be followed by an EP."
Vulgarian · From Birmingham, U.K.
Perfectly Satisfied
Nice interview, he seems to have fond memories of his time in the Smiths He has very affectionate memories of Morrissey, but not really about Johnny. Very telling that Andy had no idea if it was ok to call Johnny or not when he quite the Smiths and this was the second band Johnny was in with Andy that he walked out on.
They really did have to work when Johnny left, there was another record to be made, Johnny obviously walked out on his contractual obligation on that, leaving the entire group on the hook for it, especially Morrissey - so it's saying something that Andy felt guilty for being put in the position Johnny put him in, Johnny caused a really awful time, horrible. for everyone concerned.
A clear conscience laughs at a false accusation
Ham-guzzling Xenophobe
What happened to Andy's autobiography?
from the Ice Age to the dole age
This is lovely. The part about the transition from 'Steven' to Morrissey was very interesting.
"The Smiths were almost like a beautiful painting. Every month you'd add a little bit here and a little bit there...but it wasn't quite complete and it was whipped away." - Morrissey.
Redacted said:
Nice interview, he seems to have fond memories of his time in the Smiths
Some fond memories and some painful, awkward memories.
Nice read, I really like Blitz Vega's Hey Christo and Andy looks great in this video.
'Morrissey brought out the songwriter in me. He believed I could do it and he made me believe I could do it and we ended up writing together. We started off with a blank page and a blank cassette and from that we wrote Yes, I Am Blind and Girl Least Likely To.'
TheSmiths_1985
Moved to off-topic
Some nice bits in this. I'll maybe venture to WH Smith and buy a copy of this magazine.
Spotlight. It's time the tale were told !
I really liked the stuff Andy did with Dolores in D.A.R.K.
Had real potential.
R.I.P Dolores.
Vegan Cro Spirit .444
WOW‼
that Vegas Blitz is really packing them in😐
its those state of the art graphics
This is a delightful reverie-reflection and goes some way towards ensuring that the soi-disant 'lawnmower parts' are finally validated and honoured.
We would never have experienced Les Zeppelin if Robert Plant and Jimmy Page had had a similarly disrespectful attitude towards John Paul Jones and John Bonham. In fact, the notion that Bonzo was 'just the drummer' is both risible and belied by the fact that his bandmates never recovered from his tragic early death.
One can only wonder at what 'The Smiths' might have become if their initial 'one for all and all for one' ethos had been genuine for all four parties to the Art Collective and it hadn't been derailed by greed and bad faith.
At least Johnny Marr finally awoke from the thralldom and stopped trying to defend the indefensible. Morrissey is still lost in a fog of devious, truculent and Unreliable Narrator nonsense about how and why he was a victim.
Of what, exactly?
His business ineptitude, his greed and his inability to be held to his word?
A charmless man, lacking in dignity, authenticity and even a scintilla of masculine 'band of brothers' honour.
Taxi for Steve...
Loser...begone!
R.I.P Dolores...
BrummieBoy said:
is that another Vegas Splits video?
WOWOW‼
DH Andy is an amazing bass player😐
'ta ta ta ta TA TA ta ta TA TA'
he has his tatata book open so he doesnt miss a single ta🤒
gordyboy9
the leather belts.
good stuff from andy although i dont see why he should feel guilty about playing with M,guy probably had a family to feed.
rip roaring,free scoring,never boring,glasgow celtic.
I still don't quite understand the Morrissey Bad/Marr good nonsense. I think at the very least Marr should be held in a more negative light with his self centered actions and eyeing of the limelight that clearly lead to him hurting multiple people around him. Sure, you can quit your band if it's not fun, or you can take a hiatus, but shunning your mates with no real explanation is a shitty thing to do, no matter how burnt out you are on being around them.
Wild T!
Turkerator
It explains why Girl Least Likely To sounds like
Only To Other People.
Moz probably told him to make it like that.
Moz used to do the same thing with Johnny.
The Wild Turkey said:
Well, he doesn't actually admit the 'inspiration' behind Girl Least, or just confess. Which made me laugh.
Js138 said:
Marr is extremely insecure and has tried to craft this image of him being the good guy vs Morrissey being a terrible monster. Marr broke up the band and needed to blame someone, because he was not going to take responsibility, there are a few paragraphs in Mozipedia quoting Andy, about how Marr was making demands at the end and no one went along with him. One was no more quiffs, he thought he could tell him and Morrissey how to wear their hair! Marr seemed to really think he was the most important person there, turns out he was not. Marr said it could have turned out differently if THEY, meaning the band, had handled it differently. He takes responsibility for nothing. I read an interesting article about how the Smiths were contractually bound to tour for Strangeways, not sure how they got out of it, but also signed to a new record company for another album after that, which became Morrissey's first solo album. The contract was written that the record company would have control of whatever was put out by either Marr or Morrissey, even if they broke up, which means Johnny could have gotten a solo deal too, if the record company had been interested in the songs he wrote, and he did write a few, but apparently they were not interested and only wanted Morrissey. That must have stung. Marr went on to the Pretenders, where he did a cover song and he was fired within 4 months.
He really is a horrible person and he has hurt a lot of people.
It's interesting that Andy does not feel he has to distance himself from Morrissey in this interview and slam him, the way Marr always does, but instead says kind things about him.
Sorry you Marr apologists are so emotionally stunted that it affects you like this, Rourke is clearly discussing happy memories in the band.
Maybe you don't know Andy's history. This statement alludes to his heroin addiction: "There was no inkling Johnny was going to leave but in hindsight I can see the frustrations, but I was too busy getting on with my own thing to realise the gravity of the situation."
Nobody's bassist
Thank you, Andy, for being one of three dudes to compel me to play bass. The other two were Ready Freddie Washington and my friend who was a Geddy fan. You're in great company... and possibly the most underrated bassist to "make it." Bass changed my life. My first year was spent building a foundation in Louder than Bombs, The Queen is Dead and, yes, Strangeways... a fantastic album. You helped change my life in a big, big way.
What I found more interesting was that they were calling him Moz and Mozza during the Smiths period, I thought that came later. And I wonder how that nickname came about, it's transition? Do you know?
Really? It's mentioned in Morrissey's autobiography - Johnny gave him the nickname 'Moz' in the Smiths period and it stuck.
Mike Joyce Interview Irish Times Oct '22 - some Morrissey mentions
Special Parallels
Michka Assayas Smiths memories lol
like lovers do
Far Out Magazine: Johnny Marr discusses first meeting Morrissey at a Patti Smith concert (November 30, 2022)
gashonthenail
Josh Klinghoffer interview, more mentions of recording "Bonfire of Teenagers" - ajournalofmusicalthings.com (September 5, 2022)
The Smiths A-Z: "What's The World?"


Filled with feeling but also a little too lighthearted for its own good, Infinitely Polar Bear does much to make you like it, but maybe a harsher perspective would have helped. Playing a manic-depressive father who has to care for his two young girls, Mark Ruffalo mostly cuts through standard disease-of-the-week platitudes. But writer-director Maya Forbes's gentle drama frustratingly stays on the surface of the issues that engage it.
Set in the late 1970s in Boston, Infinitely Polar Bear concerns the Stuart family, led by parents Cameron (Ruffalo) and Maggie (Zoe Saldana). Diagnosed as manic-depressive, Cameron tries not to let his condition affect him, which is difficult since he can't hold down a job, is prone to flying off the handle, and sometimes has full-blown breakdowns. His most recent crackup gets him arrested and institutionalized, leaving Maggie convinced that she has to become the head of the household. Enrolling in grad school for business in New York to help pull the family out of their lower-class status, Maggie realizes that she can't bring the children, Faith (Ashley Aufderheide) and Amelia (Imogene Wolodarsky), with her. This leaves only one option: The newly released Cameron will have to watch their kids while she's away at school. The burden of the responsibility seems too much for him, but what choice do they have?
Forbes should be commended for making a movie about mental illness that doesn't base its entire narrative on touchy-feely observations about those with the disease. Cameron is treated matter-of-factly, but unfortunately the movie can't resist a certain amount of cutesiness when it comes to his character. Still, Ruffalo plays him with bullheaded intensity—Cameron knows he's sick, but he's convinced that he's more stable than people assume—and the movie gets its strength from the way that Cameron's worldview isn't shared by the movie. He's his own island—poignantly so.
The filmmaker, who was an executive producer on The Larry Sanders Show and a writer on The Rocker and Monsters Vs. Aliens, has based Infinitely Polar Bear on her own childhood, and one recognizes that it must not have been an easy one. Being raised by a bipolar father, living in poverty, having mixed-race parents at a time when such marriages were less embraced by society, Forbes faced her share of hardships, but Infinitely Polar Bear doesn't try to make the children Angela's Ashes-style martyrs. Instead, there's a lot of life and love in Forbes's reminiscences—a warmth that suggests that no matter how hard it was at the time, she has the distance now to forgive.
But maybe she's also pulling her punches. One watches Infinitely Polar Bear and wonders if it was all quite as wistfully challenging as it plays out here. There's a darkness on the edge of Ruffalo's performance, but Cameron's torment is mostly portrayed as a darned nuisance, rarely hinting at the serious ailment that would make Maggie so concerned about leaving her children in his care.
With that said, Forbes's affection for these characters rubs off on the viewer. The film doesn't bear the sting of poverty that fills every frame of a Sunlight Jr., but it's wise about the rather remarkable age this family was living through. Unknowingly, the Stuarts are gender-role trailblazers, boasting a mother who will be the main breadwinner and a father who stays at home with the kids. Forbes lived through it, and it's her prerogative how she wants to tell her story. But in her insistence on finding the happy ending, Infinitely Polar Bear doesn't find enough of the sadness and pain that would have made such a conclusion earned.


text:
home Leisure Social And Internet
Researcher Claims It's Official: Facebook Is 'Dead and Buried' Amongst UK Teens
by Seth Colaner — Sunday, December 29, 2013, 02:38 PM EDT
Amid a claim and a denial about Facebook's plummeting popularity among teens, an EU study has emerged that affirms the former assertion, at least among teenagers in the UK. Professor of Material Culture at University College of London Daniel Miller wrote that his research team is conducting 15-month ethnographies on teens in 8 countries, and among the results they're finding, it would seem that Facebook is not doing well in the 16-18 age group.
"What we've learned from working with 16-18 year olds in the UK is that Facebook is not just on the slide, it is basically dead and buried," he wrote. "Mostly they feel embarrassed even to be associated with it."
The killer is that teenager's parents are on the site now, and Miller noted that it's just not perceived as cool anymore. But it's not merely that parents are present on Facebook; it's that the use case for the site has evolved. Now, instead of being a place where kids can go to interact with their friends without interloping parents, it's a space where parents are expecting kids to actively stay connected with the family.
Put another way: Facebook used to be sort of a kids-only party, and now not only are parents chaperoning the party, they're making the kids play the piano for their grandparents, too.
So what are kids looking to instead? Twitter, Instagram, SnapChat, and WhatsApp. Miller noted that each of those four services has its own role. For instance, SnapChat is used between very close friends, while WhatsApp is acceptable between good friends. Twitter is used for a broader audience, and Instagram can be for anyone, including strangers. Thus, it's clear that UK teens aren't souring on social media by any means, but they're no longer keen on Facebook.
It's important to note that these findings aren't backed by hard numbers on usage, or at least the source didn't cite any; the findings may be based more on qualitative interviews as opposed to quantitative statistics. That by no means disqualifies the results, but there will be plenty of people that will be skeptical until they see some stats.
In any case, it's hard to deny that Facebook is at least evolving in its usage, if not completely falling out of favor with younger users.
Tags: Facebook, U.K., Twitter, EU, Misc, social-media
MORE HOT HEADLINES IN LEISURE
Instagram Software Code Details New...
Facebook Will Shutter Onavo VPN App...
Researchers Find YouTube Is Heavily...
Microsoft Edge Mobile Browser Combats...
Popsugar's Twinning Selfie App Springs A...
Facebook Confirms API Bug Exposed Photos...
What Is Net Neutrality And Why It...


Get up to date results from the Rep. Of Ireland First Division for the 2019 football season. Get the latest football scores & result for all games in the First Division 2019 of Rep. Of Ireland and all other football match results from the Rep. Of Ireland First Division only at ScoresPro - #1 football livescores website for all of the Rep. Of Ireland's First Division football action!
Get the latest football results for the Rep. Of Ireland - First Division 2019 football tournament only at ScoresPro - the #1 football live score website for the Rep. Of Ireland First Division!


« Septiembre deja en Andújar 54 parados menos hasta un total de 4.521 desempleados.
This entry was posted on 4 octubre 2016 at 5:47 pm	and is filed under Andalucía, Provincia. You can follow any responses to this entry through the RSS 2.0 feed. Responses are currently closed, but you can trackback from your own site.


Get lyrics of Timmy tdat well well song you love. List contains Timmy tdat well well song lyrics of older one songs and hot new releases. Get known every word of your favorite song or start your own karaoke party tonight :-).
Get hot Timmy Tdat Well Well lyrics at Lyrics.camp!
Lyrics to 'One More Try' by Timmy T. It's been a long time since you left me / I didn' t mean to make you cry / I didn't mean to disappoint you / I didn't mean.
Lyrics to "Better Than I Used To Be" song by TIM MCGRAW: I know how to hold a grudge I can send a bridge up in smoke And I can't count the people I've let do.


Storm Bowling Products has agreed to a two year pilot sponsorship of the International Bowling Media Collegiate Bowlers of the Year Award.
Collegiate bowling isn't just about striking. There's a heavy emphasis on what happens in the classroom as well. Hear it first hand from a successful student-athlete.
Sydney Brummett talks about her practice sessions, what's in her arsenal, competing against friends and more!
Storm Bowling Products is excited to announce the most successful program in collegiate bowling, Wichita State University, has officially signed on as a Storm-sponsored college for the 2017-2018 collegiate season.
I love the competitiveness. The feeling I get when I need to strike in that moment to win a match or make it close is what I live for. I thrive on the high-pressure moments.
The bowlers will compete on four different patterns during the four rounds of competition.