text:
using namespace swift;

template <typename... T, typename... U>
static InFlightDiagnostic diagnose(ASTContext &Context, SourceLoc loc,
                                   Diag<T...> diag, U &&... args) {
  return Context.Diags.diagnose(loc, diag, std::forward<U>(args)...);
}

namespace {

enum class AccessedStorageKind : unsigned {
  /// The access is to a location represented by a SIL value
  /// (for example, an 'alloc_box' instruction for a local variable).
  /// Two accesses accessing the exact same SILValue are considered to be
  /// accessing the same storage location.
  Value,

  /// The access is to a global variable.
  GlobalVar,

  /// The access is to a stored class property.
  ClassProperty
};

/// Represents the identity of a stored class property as a combination
/// of a base and a single projection. Eventually the goal is to make this
/// more precise and consider, casts, etc.
class ObjectProjection {
public:
  ObjectProjection(SILValue Object, const Projection &Proj)
      : Object(Object), Proj(Proj) {
    assert(Object->getType().isObject());
  }

  SILValue getObject() const { return Object; }
  const Projection &getProjection() const { return Proj; }

  bool operator==(const ObjectProjection &Other) const {
    return Object == Other.Object && Proj == Other.Proj;
  }

  bool operator!=(const ObjectProjection &Other) const {
    return Object != Other.Object || Proj != Other.Proj;
  }

private:
  SILValue Object;
  Projection Proj;
};

/// Represents the identity of a storage location being accessed.
/// This is used to determine when two 'begin_access' instructions
/// definitely access the same underlying location.
///
/// The key invariant that this class must maintain is that if it says
/// two storage locations are the same then they must be the same at run time.
/// It is allowed to err on the other side: it may imprecisely fail to
/// recognize that two storage locations that represent the same run-time
/// location are in fact the same.
class AccessedStorage {

private:
  AccessedStorageKind Kind;

  union {
    SILValue Value;
    SILGlobalVariable *Global;
    ObjectProjection ObjProj;
  };

public:
  AccessedStorage(SILValue V)
      : Kind(AccessedStorageKind::Value), Value(V) { }

  AccessedStorage(SILGlobalVariable *Global)
      : Kind(AccessedStorageKind::GlobalVar), Global(Global) {}

  AccessedStorage(AccessedStorageKind Kind,
                  const ObjectProjection &ObjProj)
      : Kind(Kind), ObjProj(ObjProj) {}

  AccessedStorageKind getKind() const { return Kind; }

  SILValue getValue() const {
    assert(Kind == AccessedStorageKind::Value);
    return Value;
  }

  SILGlobalVariable *getGlobal() const {
    assert(Kind == AccessedStorageKind::GlobalVar);
    return Global;
  }

  const ObjectProjection &getObjectProjection() const {
    assert(Kind == AccessedStorageKind::ClassProperty);
    return ObjProj;
  }

  /// Returns the ValueDecl for the underlying storage, if it can be
  /// determined. Otherwise returns null. For diagnostic purposes.
  const ValueDecl *getStorageDecl() const {
    switch(Kind) {
    case AccessedStorageKind::GlobalVar:
      return getGlobal()->getDecl();
    case AccessedStorageKind::Value:
      if (auto *Box = dyn_cast<AllocBoxInst>(getValue())) {
        return Box->getLoc().getAsASTNode<VarDecl>();
      }
      if (auto *Arg = dyn_cast<SILFunctionArgument>(getValue())) {
        return Arg->getDecl();
      }
      break;
    case AccessedStorageKind::ClassProperty: {
      const ObjectProjection &OP = getObjectProjection();
      const Projection &P = OP.getProjection();
      return P.getVarDecl(OP.getObject()->getType());
    }
    }
    return nullptr;
  }
};

/// Models the in-progress accesses for a single storage location.
class AccessInfo {

  /// The number of in-progress 'read' accesses (that is 'begin_access [read]'
  /// instructions that have not yet had the corresponding 'end_access').
  unsigned Reads = 0;

  /// The number of in-progress write-like accesses.
  unsigned NonReads = 0;

  /// The instruction that began the first in-progress access to the storage
  /// location. Used for diagnostic purposes.
  const BeginAccessInst *FirstAccess = nullptr;

public:
  // Returns true when beginning an access of the given Kind will
  // result in a conflict with a previous access.
  bool conflictsWithAccess(SILAccessKind Kind) {
    if (Kind == SILAccessKind::Read) {
      // A read conflicts with any non-read accesses.
      return NonReads > 0;
    }

    // A non-read access conflicts with any other access.
    return NonReads > 0 || Reads > 0;
  }

  /// Returns true when there must have already been a conflict diagnosed
  /// for an in-progress access. Used to suppress multiple diagnostics for
  /// the same underlying access violation.
  bool alreadyHadConflict() {
    return (NonReads > 0 && Reads > 0) || (NonReads > 1);
  }

  /// Returns true when there are any accesses to this location in progress.
  bool hasAccessesInProgress() { return Reads > 0 || NonReads > 0; }

  /// Increment the count for given access.
  void beginAccess(const BeginAccessInst *BAI) {
    if (!FirstAccess) {
      assert(Reads == 0 && NonReads == 0);
      FirstAccess = BAI;
    }

    if (BAI->getAccessKind() == SILAccessKind::Read)
      Reads++;
    else
      NonReads++;
  }

  /// Decrement the count for given access.
  void endAccess(const EndAccessInst *EAI) {
    if (EAI->getBeginAccess()->getAccessKind() == SILAccessKind::Read)
      Reads--;
    else
      NonReads--;

    // If all open accesses are now ended, forget the location of the
    // first access.
    if (Reads == 0 && NonReads == 0)
      FirstAccess = nullptr;
  }

  /// Returns the instruction that began the first in-progress access.
  const BeginAccessInst *getFirstAccess() { return FirstAccess; }
};

/// Indicates whether a 'begin_access' requires exclusive access
/// or allows shared access. This needs to be kept in sync with
/// diag::exclusivity_access_required, exclusivity_access_required_swift3,
/// and diag::exclusivity_conflicting_access.
enum class ExclusiveOrShared_t : unsigned {
  ExclusiveAccess = 0,
  SharedAccess = 1
};

/// Tracks the in-progress accesses on per-storage-location basis.
using StorageMap = llvm::SmallDenseMap<AccessedStorage, AccessInfo, 4>;

/// A pair of 'begin_access' instructions that conflict.
struct ConflictingAccess {
  AccessedStorage Storage;
  const BeginAccessInst *FirstAccess;
  const BeginAccessInst *SecondAccess;
};

} // end anonymous namespace

namespace llvm {
/// Enable using AccessedStorage as a key in DenseMap.
template <> struct DenseMapInfo<AccessedStorage> {
  static AccessedStorage getEmptyKey() {
    return AccessedStorage(swift::SILValue::getFromOpaqueValue(
        llvm::DenseMapInfo<void *>::getEmptyKey()));
  }

  static AccessedStorage getTombstoneKey() {
    return AccessedStorage(swift::SILValue::getFromOpaqueValue(
        llvm::DenseMapInfo<void *>::getTombstoneKey()));
  }

  static unsigned getHashValue(AccessedStorage Storage) {
    switch (Storage.getKind()) {
    case AccessedStorageKind::Value:
      return DenseMapInfo<swift::SILValue>::getHashValue(Storage.getValue());
    case AccessedStorageKind::GlobalVar:
      return DenseMapInfo<void *>::getHashValue(Storage.getGlobal());
    case AccessedStorageKind::ClassProperty: {
      const ObjectProjection &P = Storage.getObjectProjection();
      return llvm::hash_combine(P.getObject(), P.getProjection());
    }
    }
    llvm_unreachable("Unhandled AccessedStorageKind");
  }

  static bool isEqual(AccessedStorage LHS, AccessedStorage RHS) {
    if (LHS.getKind() != RHS.getKind())
      return false;

    switch (LHS.getKind()) {
    case AccessedStorageKind::Value:
      return LHS.getValue() == RHS.getValue();
    case AccessedStorageKind::GlobalVar:
      return LHS.getGlobal() == RHS.getGlobal();
    case AccessedStorageKind::ClassProperty:
        return LHS.getObjectProjection() == RHS.getObjectProjection();
    }
    llvm_unreachable("Unhandled AccessedStorageKind");
  }
};

} // end namespace llvm

/// Returns whether a 'begin_access' requires exclusive or shared access
/// to its storage.
static ExclusiveOrShared_t getRequiredAccess(const BeginAccessInst *BAI) {
  if (BAI->getAccessKind() == SILAccessKind::Read)
    return ExclusiveOrShared_t::SharedAccess;

  return ExclusiveOrShared_t::ExclusiveAccess;
}

/// Extract the text for the given expression.
static StringRef extractExprText(const Expr *E, SourceManager &SM) {
  const auto CSR = Lexer::getCharSourceRangeFromSourceRange(SM,
      E->getSourceRange());
  return SM.extractText(CSR);
}

/// Returns true when the call expression is a call to swap() in the Standard
/// Library.
/// This is a helper function that is only used in an assertion, which is why
/// it is in a namespace rather than 'static'.
namespace {
bool isCallToStandardLibrarySwap(CallExpr *CE, ASTContext &Ctx) {
  if (CE->getCalledValue() == Ctx.getSwap(nullptr))
    return true;

  // Is the call module qualified, i.e. Swift.swap(&a[i], &[j)?
  if (auto *DSBIE = dyn_cast<DotSyntaxBaseIgnoredExpr>(CE->getFn())) {
    if (auto *DRE = dyn_cast<DeclRefExpr>(DSBIE->getRHS())) {
      return DRE->getDecl() == Ctx.getSwap(nullptr);
    }
  }

  return false;
}
} // end anonymous namespace

/// Do a sytactic pattern match to try to safely suggest a Fix-It to rewrite
/// calls like swap(&collection[index1], &collection[index2]) to
///
/// This method takes an array of all the ApplyInsts for calls to swap()
/// in the function to avoid need to construct a parent map over the AST
/// to find the CallExpr for the inout accesses.
static void
tryFixItWithCallToCollectionSwapAt(const BeginAccessInst *Access1,
                                  const BeginAccessInst *Access2,
                                  ArrayRef<ApplyInst *> CallsToSwap,
                                  ASTContext &Ctx,
                                  InFlightDiagnostic &Diag) {
  if (CallsToSwap.empty())
    return;

  // Inout arguments must be modifications.
  if (Access1->getAccessKind() != SILAccessKind::Modify ||
      Access2->getAccessKind() != SILAccessKind::Modify) {
    return;
  }

  SILLocation Loc1 = Access1->getLoc();
  SILLocation Loc2 = Access2->getLoc();
  if (Loc1.isNull() || Loc2.isNull())
    return;

  auto *InOut1 = Loc1.getAsASTNode<InOutExpr>();
  auto *InOut2 = Loc2.getAsASTNode<InOutExpr>();
  if (!InOut1 || !InOut2)
    return;

  CallExpr *FoundCall = nullptr;
  // Look through all the calls to swap() recorded in the function to find
  // which one we're diagnosing.
  for (ApplyInst *AI : CallsToSwap) {
    SILLocation CallLoc = AI->getLoc();
    if (CallLoc.isNull())
      continue;

    auto *CE = CallLoc.getAsASTNode<CallExpr>();
    if (!CE)
      continue;

    assert(isCallToStandardLibrarySwap(CE, Ctx));
    // swap() takes two arguments.
    auto *ArgTuple = cast<TupleExpr>(CE->getArg());
    const Expr *Arg1 = ArgTuple->getElement(0);
    const Expr *Arg2 = ArgTuple->getElement(1);
    if ((Arg1 == InOut1 && Arg2 == InOut2)) {
        FoundCall = CE;
      break;
    }
  }
  if (!FoundCall)
    return;

  // We found a call to swap(&e1, &e2). Now check to see whether it
  // matches the form swap(&someCollection[index1], &someCollection[index2]).
  auto *SE1 = dyn_cast<SubscriptExpr>(InOut1->getSubExpr());
  if (!SE1)
    return;
  auto *SE2 = dyn_cast<SubscriptExpr>(InOut2->getSubExpr());
  if (!SE2)
    return;

  // Do the two subscripts refer to the same subscript declaration?
  auto *Decl1 = cast<SubscriptDecl>(SE1->getDecl().getDecl());
  auto *Decl2 = cast<SubscriptDecl>(SE2->getDecl().getDecl());
  if (Decl1 != Decl2)
    return;

  ProtocolDecl *MutableCollectionDecl = Ctx.getMutableCollectionDecl();

  // Is the subcript either (1) on MutableCollection itself or (2) a
  // a witness for a subscript on MutableCollection?
  bool IsSubscriptOnMutableCollection = false;
  ProtocolDecl *ProtocolForDecl =
      Decl1->getDeclContext()->getAsProtocolOrProtocolExtensionContext();
  if (ProtocolForDecl) {
    IsSubscriptOnMutableCollection = (ProtocolForDecl == MutableCollectionDecl);
  } else {
    for (ValueDecl *Req : Decl1->getSatisfiedProtocolRequirements()) {
      DeclContext *ReqDC = Req->getDeclContext();
      ProtocolDecl *ReqProto = ReqDC->getAsProtocolOrProtocolExtensionContext();
      assert(ReqProto && "Protocol requirement not in a protocol?");

      if (ReqProto == MutableCollectionDecl) {
        IsSubscriptOnMutableCollection = true;
        break;
      }
    }
  }

  if (!IsSubscriptOnMutableCollection)
    return;

  // We're swapping two subscripts on mutable collections -- but are they
  // the same collection? Approximate this by checking for textual
  // equality on the base expressions. This is just an approximation,
  // but is fine for a best-effort Fix-It.
  SourceManager &SM = Ctx.SourceMgr;
  StringRef Base1Text = extractExprText(SE1->getBase(), SM);
  StringRef Base2Text = extractExprText(SE2->getBase(), SM);

  if (Base1Text != Base2Text)
    return;

  auto *Index1 = dyn_cast<ParenExpr>(SE1->getIndex());
  if (!Index1)
    return;

  auto *Index2 = dyn_cast<ParenExpr>(SE2->getIndex());
  if (!Index2)
    return;

  StringRef Index1Text = extractExprText(Index1->getSubExpr(), SM);
  StringRef Index2Text = extractExprText(Index2->getSubExpr(), SM);

  // Suggest replacing with call with a call to swapAt().
  SmallString<64> FixItText;
  {
    llvm::raw_svector_ostream Out(FixItText);
    Out << Base1Text << ".swapAt(" << Index1Text << ", " << Index2Text << ")";
  }

  Diag.fixItReplace(FoundCall->getSourceRange(), FixItText);
}

/// Emits a diagnostic if beginning an access with the given in-progress
/// accesses violates the law of exclusivity. Returns true when a
/// diagnostic was emitted.
static void diagnoseExclusivityViolation(const AccessedStorage &Storage,
                                         const BeginAccessInst *PriorAccess,
                                         const BeginAccessInst *NewAccess,
                                         ArrayRef<ApplyInst *> CallsToSwap,
                                         ASTContext &Ctx) {

  DEBUG(llvm::dbgs() << "Conflict on " << *PriorAccess
        << "\n  vs " << *NewAccess
        << "\n  in function " << *PriorAccess->getFunction());

  // Can't have a conflict if both accesses are reads.
  assert(!(PriorAccess->getAccessKind() == SILAccessKind::Read &&
           NewAccess->getAccessKind() == SILAccessKind::Read));

  ExclusiveOrShared_t PriorRequires = getRequiredAccess(PriorAccess);

  // Diagnose on the first access that requires exclusivity.
  const BeginAccessInst *AccessForMainDiagnostic = PriorAccess;
  const BeginAccessInst *AccessForNote = NewAccess;
  if (PriorRequires != ExclusiveOrShared_t::ExclusiveAccess) {
    AccessForMainDiagnostic = NewAccess;
    AccessForNote = PriorAccess;
  }

  SourceRange rangeForMain =
    AccessForMainDiagnostic->getLoc().getSourceRange();
  unsigned AccessKindForMain =
      static_cast<unsigned>(AccessForMainDiagnostic->getAccessKind());

  if (const ValueDecl *VD = Storage.getStorageDecl()) {
    // We have a declaration, so mention the identifier in the diagnostic.
    auto DiagnosticID = (Ctx.LangOpts.isSwiftVersion3() ?
                         diag::exclusivity_access_required_swift3 :
                         diag::exclusivity_access_required);
    auto D = diagnose(Ctx, AccessForMainDiagnostic->getLoc().getSourceLoc(),
                       DiagnosticID,
                       VD->getDescriptiveKind(),
                       VD->getName(),
                       AccessKindForMain);
    D.highlight(rangeForMain);
    tryFixItWithCallToCollectionSwapAt(PriorAccess, NewAccess,
                                       CallsToSwap, Ctx, D);
  } else {
    auto DiagnosticID = (Ctx.LangOpts.isSwiftVersion3() ?
                         diag::exclusivity_access_required_unknown_decl_swift3 :
                         diag::exclusivity_access_required_unknown_decl);
    diagnose(Ctx, AccessForMainDiagnostic->getLoc().getSourceLoc(),
             DiagnosticID,
             AccessKindForMain)
        .highlight(rangeForMain);
  }
  diagnose(Ctx, AccessForNote->getLoc().getSourceLoc(),
           diag::exclusivity_conflicting_access)
      .highlight(AccessForNote->getLoc().getSourceRange());
}

/// Make a best effort to find the underlying object for the purpose
/// of identifying the base of a 'ref_element_addr'.
static SILValue findUnderlyingObject(SILValue Value) {
  assert(Value->getType().isObject());
  SILValue Iter = Value;

  while (true) {
    // For now just look through begin_borrow instructions; we can likely
    // make this more precise in the future.
    if (auto *BBI = dyn_cast<BeginBorrowInst>(Iter)) {
      Iter = BBI->getOperand();
      continue;
    }
    break;
  }

  assert(Iter->getType().isObject());
  return Iter;
}

/// Look through a value to find the underlying storage accessed.
static AccessedStorage findAccessedStorage(SILValue Source) {
  SILValue Iter = Source;
  while (true) {
    // Base case for globals: make sure ultimate source is recognized.
    if (auto *GAI = dyn_cast<GlobalAddrInst>(Iter)) {
      return AccessedStorage(GAI->getReferencedGlobal());
    }

    // Base case for class objects.
    if (auto *REA = dyn_cast<RefElementAddrInst>(Iter)) {
      // Do a best-effort to find the identity of the object being projected
      // from. It is OK to be unsound here (i.e. miss when two ref_element_addrs
      // actually refer the same address) because these will be dynamically
      // checked.
      SILValue Object = findUnderlyingObject(REA->getOperand());
      const ObjectProjection &OP = ObjectProjection(Object,
                                                    Projection(REA));
      return AccessedStorage(AccessedStorageKind::ClassProperty, OP);
    }

    switch (Iter->getKind()) {
    // Inductive cases: look through operand to find ultimate source.
    case ValueKind::ProjectBoxInst:
    case ValueKind::CopyValueInst:
    case ValueKind::MarkUninitializedInst:
    case ValueKind::UncheckedAddrCastInst:
    // Inlined access to subobjects.
    case ValueKind::StructElementAddrInst:
    case ValueKind::TupleElementAddrInst:
    case ValueKind::UncheckedTakeEnumDataAddrInst:
    case ValueKind::RefTailAddrInst:
    case ValueKind::TailAddrInst:
    case ValueKind::IndexAddrInst:
      Iter = cast<SILInstruction>(Iter)->getOperand(0);
      continue;

    // Base address producers.
    case ValueKind::AllocBoxInst:
      // An AllocBox is a fully identified memory location.
    case ValueKind::AllocStackInst:
      // An AllocStack is a fully identified memory location, which may occur
      // after inlining code already subjected to stack promotion.
    case ValueKind::BeginAccessInst:
      // The current access is nested within another access.
      // View the outer access as a separate location because nested accesses do
      // not conflict with each other.
    case ValueKind::SILFunctionArgument:
      // A function argument is effectively a nested access, enforced
      // independently in the caller and callee.
    case ValueKind::PointerToAddressInst:
      // An addressor provides access to a global or class property via a
      // RawPointer. Calling the addressor casts that raw pointer to an address.
      return AccessedStorage(Iter);

    // Unsupported address producers.
    // Initialization is always local.
    case ValueKind::InitEnumDataAddrInst:
    case ValueKind::InitExistentialAddrInst:
    // Accessing an existential value requires a cast.
    case ValueKind::OpenExistentialAddrInst:
    default:
      DEBUG(llvm::dbgs() << "Bad memory access source: " << Iter);
      llvm_unreachable("Unexpected access source.");
    }
  }
}

/// Returns true when the apply calls the Standard Library swap().
/// Used for fix-its to suggest replacing with Collection.swapAt()
/// on exclusivity violations.
bool isCallToStandardLibrarySwap(ApplyInst *AI, ASTContext &Ctx) {
  SILFunction *SF = AI->getReferencedFunction();
  if (!SF)
    return false;

  if (!SF->hasLocation())
    return false;

  auto *FD = SF->getLocation().getAsASTNode<FuncDecl>();
  if (!FD)
    return false;

  return FD == Ctx.getSwap(nullptr);
}

static void checkStaticExclusivity(SILFunction &Fn, PostOrderFunctionInfo *PO) {
  // The implementation relies on the following SIL invariants:
  //    - All incoming edges to a block must have the same in-progress
  //      accesses. This enables the analysis to not perform a data flow merge
  //      on incoming edges.
  //    - Further, for a given address each of the in-progress
  //      accesses must have begun in the same order on all edges. This ensures
  //      consistent diagnostics across changes to the exploration of the CFG.
  //    - On return from a function there are no in-progress accesses. This
  //      enables a sanity check for lean analysis state at function exit.
  //    - Each end_access instruction corresponds to exactly one begin access
  //      instruction. (This is encoded in the EndAccessInst itself)
  //    - begin_access arguments cannot be basic block arguments.
  //      This enables the analysis to look back to find the *single* storage
  //      storage location accessed.

  if (Fn.empty())
    return;

  // Collects calls the Standard Library swap() for Fix-Its.
  llvm::SmallVector<ApplyInst *, 8> CallsToSwap;

  // Stores the accesses that have been found to conflict. Used to defer
  // emitting diagnostics until we can determine whether they should
  // be suppressed.
  llvm::SmallVector<ConflictingAccess, 4> ConflictingAccesses;

  // For each basic block, track the stack of current accesses on
  // exit from that block.
  llvm::SmallDenseMap<SILBasicBlock *, Optional<StorageMap>, 32>
      BlockOutAccesses;

  BlockOutAccesses[Fn.getEntryBlock()] = StorageMap();

  for (auto *BB : PO->getReversePostOrder()) {
    Optional<StorageMap> &BBState = BlockOutAccesses[BB];

    // Because we use a reverse post-order traversal, unless this is the entry
    // at least one of its predecessors must have been reached. Use the out
    // state for that predecessor as our in state. The SIL verifier guarantees
    // that all incoming edges must have the same current accesses.
    for (auto *Pred : BB->getPredecessorBlocks()) {
      auto it = BlockOutAccesses.find(Pred);
      if (it == BlockOutAccesses.end())
        continue;

      const Optional<StorageMap> &PredAccesses = it->getSecond();
      if (PredAccesses) {
        BBState = PredAccesses;
        break;
      }
    }

    // The in-progress accesses for the current program point, represented
    // as map from storage locations to the accesses in progress for the
    // location.
    StorageMap &Accesses = *BBState;

    for (auto &I : *BB) {
      // Apply transfer functions. Beginning an access
      // increments the read or write count for the storage location;
      // Ending onr decrements the count.
      if (auto *BAI = dyn_cast<BeginAccessInst>(&I)) {
        SILAccessKind Kind = BAI->getAccessKind();
        const AccessedStorage &Storage = findAccessedStorage(BAI->getSource());
        AccessInfo &Info = Accesses[Storage];
        if (Info.conflictsWithAccess(Kind) && !Info.alreadyHadConflict()) {
          const BeginAccessInst *Conflict = Info.getFirstAccess();
          assert(Conflict && "Must already have had access to conflict!");
          ConflictingAccesses.push_back({ Storage, Conflict, BAI });
        }

        Info.beginAccess(BAI);
        continue;
      }

      if (auto *EAI = dyn_cast<EndAccessInst>(&I)) {
        auto It = Accesses.find(findAccessedStorage(EAI->getSource()));
        AccessInfo &Info = It->getSecond();
        Info.endAccess(EAI);

        // If the storage location has no more in-progress accesses, remove
        // it to keep the StorageMap lean.
        if (!Info.hasAccessesInProgress())
          Accesses.erase(It);
        continue;
      }

      if (auto *AI = dyn_cast<ApplyInst>(&I)) {
        // Record calls to swap() for potential Fix-Its.
        if (isCallToStandardLibrarySwap(AI, Fn.getASTContext()))
          CallsToSwap.push_back(AI);
      }

      // Sanity check to make sure entries are properly removed.
      assert((!isa<ReturnInst>(&I) || Accesses.size() == 0) &&
             "Entries were not properly removed?!");
    }
  }

  // Now that we've collected violations and suppressed calls, emit
  // diagnostics.
  for (auto &Violation : ConflictingAccesses) {
    const BeginAccessInst *PriorAccess = Violation.FirstAccess;
    const BeginAccessInst *NewAccess = Violation.SecondAccess;

    diagnoseExclusivityViolation(Violation.Storage, PriorAccess, NewAccess,
                                 CallsToSwap, Fn.getASTContext());
  }
}

namespace {

class DiagnoseStaticExclusivity : public SILFunctionTransform {
public:
  DiagnoseStaticExclusivity() {}

private:
  void run() override {
    SILFunction *Fn = getFunction();
    // This is a staging flag. Eventually the ability to turn off static
    // enforcement will be removed.
    if (!Fn->getModule().getOptions().EnforceExclusivityStatic)
      return;

    PostOrderFunctionInfo *PO = getAnalysis<PostOrderAnalysis>()->get(Fn);
    checkStaticExclusivity(*Fn, PO);
  }
};

} // end anonymous namespace

SILTransform *swift::createDiagnoseStaticExclusivity() {
  return new DiagnoseStaticExclusivity();
}


Sometimes, silly small things about code I write just delight me. There are lots of ways to time things in R. 1 Tools like microbenchmark are great for profiling code, but what I do all the time is log how long database queries that are scheduled to run each night are taking.
It is really easy to use calls to Sys.time and difftime when working interactively, but I didn't want to pepper all of my code with the same log statements all over the place. So instead, I wrote a function.
Almost all of timing is straightforward to even a novice R user. I record what time it is using Sys.time, do a little formatting work to make things look the way I want for reading logs, and pass in an optional message.
The thing I needed to learn when I wrote timing a few years back was how to fill in STUFF and # Call my function here.
Did you know that you can pass a function as an argument in another function in R? I had been using *apply with its FUN argument all over the place, but never really thought about it until I wrote timing. Of course in R you can pass a function name, and I even know how to pass arguments to that function– just like apply, just declare a function with the magical ... and pass that along to the fucntion being passed in.
So from there, it was clear to see how I'd want my function declartion to look. It would definitely have the form function(f, ..., msg = ''), where f was some function and ... were the arguments for that function. What I didn't know was how to properly call that function. Normally, I'd write something like mean(...), but I don't know what f is in this case!
As it turns out, the first thing I tried worked, much to my surprise. R actually makes this super easy– you can just write f(...), and f will be replaced with whatever the argument is to f! This just tickles me. It's stupid elegant to my eyes.


Lemon Pepper Chicken Pitas – Easy to make and family-approved, these delicious chicken pitas blend bright Middle Eastern flavors and mild spices with the satisfying crunch of fresh veggies.
When my sisters and I were kids, it was inevitable that somewhere between 2-3pm we would ask my mom that ever-important question, "What's for dinner tonight?" Now, my mom is a pretty good cook, so our responses generally leaned toward the positive. Of course, each of us had our own food idiosyncrasies. For instance, I HATE lima beans and my youngest sister finds lasagna unbearable (weirdo).
One of the meals that I particularly loved was chicken pitas. My mom would execute it with various dressings, marinades, and fillings, but it always ended in something delicious. And I'm pretty sure that a love for chicken pitas was a sentiment shared by all.
Twenty years later, my kid agrees that chicken pitas are pretty awesome. Today's recipe for Lemon Pepper Chicken Pitas is uniquely my own, and at first I thought he might be turned off by some of the Middle Eastern flavors that are involved in this dish. Thankfully, that's not the case at all! He loves the tender chicken and crunchy vegetables, not to mention the fact that I allow him to assemble his own pita. As such, I've made this recipe numerous times this summer and there have been no complaints from the peanut gallery. Another generation of chicken pita lovers lives on!
Note: The links above are Amazon Affiliate links and a portion of the sales go to support Simple Seasonal at no additional cost to you.
Easy to make and family-approved, these delicious chicken pitas blend bright Middle Eastern flavors and spices with the satisfying crunch of fresh veggies.
To prep the chicken, whisk together the olive oil, lemon juice, salt, and pepper. Allow the chicken to marinate for 30 minutes to an hour before cooking. Grill the chicken over medium-high heat for 8-10 minutes, or until it reaches an internal temperature of 165ºF.
Make the salad while the chicken is marinating and grilling. The salad tastes the best when the veggies are thinly sliced. This is most easily done with a mandolin slicer, but an extra sharp knife will work, too. Evenly coat the vegetables with the white wine vinegar, olive oil, salt, and pepper that have been whisked together.
If you decide to make fresh baba ganoush be sure to check out my Baba Ganoush* recipe for detailed instructions. To save on time, you can purchase canned baba ganoush from many grocery stores, but it's not nearly as tasty. Garlic hummus is also a delicious alternative in this recipe.
To assemble, cut the pitas in half, spread with a generous portion of baba ganoush, and stuff with the salad and grilled chicken. Serve immediately.
My entire family would love these – thanks for the meal inspiration!


text:
Q: Local storage not shown after refresh I just can't get it working no matter what I do. Been sitting for hours and nothing.  After submitting form I create local storage of values name, surname, email, so that I would be able to use them to fill up form so that user would not have to type them everytime.
submit() is in review.controller.js
(function () {
    'use strict';
angular.module('app').controller('ReviewController', ReviewController);

ReviewController.$inject = ['$location', 'AuthenticationService', 'FlashService', 'UniversalService', '$scope', '$sce', '$rootScope','$route','$cookies','localStorageService'];
function ReviewController($location, AuthenticationService, FlashService, UniversalService, $scope, $sce, $rootScope,$route,$cookies,localStorageService) {
   var vm = this;
    vm.name = null;
    vm.surname = null;
    vm.Email = null;
    vm.review = null;
    vm.allgenres = [];
    vm.submit = submit;
    vm.allreviews = [];
    $scope.localArray=[];
    loadAllReviews();
    submit();

    $scope.templates = [{ name: 'man.main.view.html', url: 'main/main.view.html'}];
    $scope.template = $scope.templates[0];

    function loadAllReviews() {
        UniversalService.GetAllReviews()
            .then(function (review) {
                vm.allreviews = review;
            });
    }

    $scope.init = function () {debugger;
       // $scope.$MainController.obtained_array = localStorage.getItem("storageKey");debugger;
        $scope.storageKey = localStorage.getItem("storageKey");debugger;
    };

    $scope.storageKey = localStorage.getItem('storageKey');

  /*  $scope.$watch("storageKey", function() {debugger;
        localStorage.setItem('storageKey', storageKey);
    });*/

    function submit() {
    if($rootScope.name!=null)    {
        var JSONObject = {
             "name":$rootScope.name,
             "surname":$rootScope.surname,
             "email":$rootScope.email,
             "review":$rootScope.review
            }
        var temp={
            "name":$rootScope.name,
             "surname":$rootScope.surname,
             "email":$rootScope.email
        }
        $scope.localArray.push(temp);

        localStorageService.set("storageKey", $scope.localArray);

        $scope.storageKey = localStorageService.get("storageKey");
       // $rootScope.obtained_array = localStorageService.get("storageKey"); debugger;

        console.log($scope.storageKey);debugger;

        var Results = UniversalService.PostReview(JSON.stringify(JSONObject));
        }
    }
}

main.controller.js
'use strict';

var app= angular.module('app').controller('MainController', MainController);
MainController.$inject = ['$location', 'AuthenticationService', 'FlashService', 'UniversalService', '$scope', '$sce', '$rootScope','$log','PagerService','localStorageService','$mdDialog'];
function MainController($location, AuthenticationService, FlashService, UniversalService, $scope, $sce, $rootScope,$log,PagerService,localStorageService,$mdDialog) {
   var vm = this;
    vm.allreviews = [];
    vm.allusers=[];
    vm.allemails=[];
    vm.all=[];
    vm.avatars=[];
    $scope.filteredAll = [];
    $scope.all=[];
    $scope.items=[];

    $scope.pager = {};
    $scope.setPage = setPage;

    loadAllReviews();
    loadAllEmails();
    loadAllUsers();
    loadAll();
    loadAvatars();
    initController();
    setPage();
    submit();

    $scope.init = function () {
        $scope.$parent.storageKey = localStorage.getItem("storageKey");debugger;
       // $scope.obtained_array = localStorage.getItem("storageKey");
       // console.log(obtained_array); debugger;
       // $scope.storageKey = localStorage.getItem("storageKey");debugger;
    };

    function refresh() {
        location.reload();debugger;
    }

    function loadAll() {
        UniversalService.GetAll()
            .then(function (a) {
                $scope.all=a;
            });
    }

     function loadAllUsers(callback) {
        UniversalService.GetAll()
            .then(function (response) {
                $scope.users=response;
                if (callback) {
                    callback(response);
                }
            });
    }

    function loadAllReviews() {
        UniversalService.GetAllReviews()
            .then(function (review) {
                vm.allreviews = review;
            });
    }

    function loadAllEmails() {
        UniversalService.GetAllEmails()
            .then(function (email) {
                vm.allemails = email;
            });
    }

    function setPage(page) {
        loadAllUsers(function (response) {
            if (response) {
                if (page < 1 || page > $scope.pager.totalPages) {
                    return;
            }
            // get pager object from service
            $scope.everything=response;
            $scope.pager = PagerService.GetPager(response.length, page);
            // get current page of items
            $scope.items = response.slice($scope.pager.startIndex, $scope.pager.endIndex + 1);
            }
        });
    }

    function initController() {
        $scope.setPage(1);  // initialize to page 1
    }

}
HTML file:

Add review

    <form name="form" ng-submit="vm.submit()" role="form">

                    Name
                    <input type="text" name="text" ng-model="name" onchange="CallItems()" id="name" class="form-control" ng-model="vm.name" placeholder="Enter name here"  required />
                    Name is required

                    Surname
                    <input type="text" ng-model="surname" name="text" id="surname" class="form-control" ng-model="vm.surname" placeholder="Enter surname here"  required/>
                    Surname is required

                    Email
                    <input type="text" name="email" id="email" class="form-control" ng-model="vm.email" placeholder="Enter email here" required />
                    Email is required

                    Review
                    <input type="text" name="text" id="review" class="form-control" ng-model="vm.review" placeholder="Enter review here"  required/>
                    Review is required

                <button id="submit" type="submit" onclick="passInfo()" class="btn btn-primary">Submit</button>

                Review succesfully created!

                Add new review or
                View reviews!

    </form>

Currently I add these values to button to test if values are added:
<button ng-disabled="localStorage.getItem('LS_wimmtkey') !== null"> {{obtained_array}}</button>
My main.view is inserted into the review.view (because form and reviews are on the same page, main is for the review listing and reviews are submitted form)
After submiting form all these values appear in the button, but after refreshing page none of them are shown anymore. I kind of understand that it is all because everything I do with local storage is inside submit() function, but I am not sure how to fix it

A: You can write a init function on second controller and set the local Storage value in a variable.So whenever you refresh the page, init function will be called and local storage value will be available for you to use it in View

A: see below line:
<button ng-disabled="localStorage.getItem('LS_wimmtkey') !== null"> {{obtained_array}}</button>

"obtained_array" belong to $rootScope, so $rootScope can't bind to the template(binding to $rootScope is not possible )
quick solution is: change the following line
in case of: MainController
$scope.obtained_array = localStorage.getItem("LS_wimmtkey");debugger;

in case of :ReviewController (you are setting in this ctrl "LS_wimmtkey")
$scope.$parent.obtained_array = localStorage.getItem("LS_wimmtkey");debugger;

redpajama_set_name: RedPajamaStackExchange


SENDAI, Japan — The estimated death toll from Japan's disasters climbed past 10,000 Sunday as authorities raced to combat the threat of multiple nuclear reactor meltdowns and hundreds of thousands of people struggled to find food and water. The prime minister said it was the nation's worst crisis since World War II.
According to officials, more than 1,800 people were confirmed dead – including 200 people whose bodies were found Sunday along the coast – and more than 1,400 were missing in Friday's disasters. Another 1,900 were injured.


text:
.panerai
From ICANNWiki
Status: Proposed
Registry Provider: Neustar
Registry: Richemont DNS Inc.
Registry Backend: Neustar
Date Implemented: 26 March 2015
Type: Brand TLD
Priority #: 1692 - Richemont DNS Inc.
nTLDStats
Registrations: 1
Parked Domains: 1
Parked Domain %: 100.0 %
Delegation: 25 March 2015
General Availability: N/A
.panerai is a delegated Brand TLD in ICANN's New gTLD Program. Richemont DNS Inc. manages the TLD and is its Registry. The proposed application succeeded and was delegated to the Root Zone on 26 March, 2015.[1].[2][3]
The following is excerpted from the applicant's response to question #18:
"The content of this Answer to Question 18 set forth below which describes the plans for Richemont DNS's registry constitutes the "purpose" of the registry as that term is used in paragraph 1.b. of Specification 9 of the Draft New gTLD Registry Agreement found in Module 5 of the Richemont DNS Guidebook dated January 11, 2012 ("the Purpose"). Richemont DNS will publish its Charter and its policies, guidelines, and other supporting documentation related to the implementation of the registry consistent with the Purpose, all prior to launch. All second level domain names registered by Richemont DNS on behalf of itself or an affiliate will be registered through an ICANN-accredited registrar and will be consistent with the Purpose. All registrants of second level domain names will be affiliates of Richemont DNS or will be parties operating under a written trademark license specifically allowing the registration of a second level domain name within this registry (the "Required License").
Founded in Florence in 1860 as a watchmaker's shop, workshop and school, Officine Panerai, Branch of Richemont International SA ("Panerai") was for many years the official supplier of precision instruments for the Italian Navy, mostly for the underwater special corps. The projects developed by the company at the time, including the Luminor and Radiomir watch were covered by military secret until 1997, when the brand was purchased by Compagnie Financière Richemont S.A ("CFR"), the Swiss luxury goods holding company, and launched on the international market. Officine Panerai is today the only Italian fine watch making company, developing and producing its own calibres and watches - a blend of Italian history and design with Swiss craftsmanship - in its own manufacture in Neuchatel, Switzerland. Watches are distributed worldwide through an exclusive network and in boutiques in Florence, Portofino, Madrid, Geneva, Dubai, Beirut, Doha, Riyadh, Los Angeles, Macau, New York, Buenos Aires, Beijing, Hong Kong, Shanghai, Tokyo, Moscow and Paris.
Its ultimate parent company is Compagnie Financière Richemont S.A. ("CFR"), a Swiss luxury goods holding company, which was created in 1988. This application is being made by Richemont DNS Inc. ("Richemont DNS"), one of CFR's indirect wholly-owned subsidiaries. The group of companies whose ultimate parent company is CFR are referred to herein collectively as "Richemont". Richemont's luxury businesses operate globally. The largest market is Asia-Pacific, which generates more than 40 per cent of sales. We believe the diversity of our geographical operations, with a lack of dependency on any one market, represents a long-term competitive advantage. Panerai, through its various divisions, operates through more than 500 points of sale for watches and accessories, including 41 boutiques, in over 35 countries worldwide.
Richemont directly employs more than 20,000 people worldwide and has employees based in all major regions of the world. Two-thirds of Richemont's employees are based in Europe, but Asia-Pacific and the Americas are also significant and growing areas of employment. The majority of Richemont's employees in Europe are based in Switzerland, France, and Germany, where the manufacture of luxury goods is concentrated. Asia and the Far East are growing markets. In all regions, employees are engaged in retail, distribution, after sales service and⁄or administrative functions.
Richemont 'A' shares are listed on the SIX Swiss Exchange, Richemont's primary listing, and are included in the Swiss Market Index ('SMI') of leading stocks. Richemont's South African Depository Receipts are listed in Johannesburg, Richemont's secondary listing. Richemont is the eighth largest company in the Swiss Market Index and, as of 2007, Richemont was the third-largest luxury goods company in the world by annual revenues. In the 2010⁄2011 financial year, Richemont sales were €6.892 billion, a rise of 33% on the previous year (at actual exchange rates) and our operating profit rose by 63% to €1.355 billion.
Under the Richemont brands, investments in research, development and innovation extend to watch movements, new product designs and marketing-related activities. The annual accounting charge for research and development costs is some €20 million. PANERAI is a registered trademark in jurisdictions throughout the world. Richemont DNS intends to operate the .Panerai registry under a suitable license from Panerai and on Panerai's behalf.
The .Panerai registry will be a standard, i.e. not a community-based, restricted registry."[4]
↑ Delegated String, ICANN.org Retrieved 26 Mar 2015
↑ Reveal Day 13 June 2012 – New gTLD Applied-For Strings
↑ Application Download, gTLDresult.ICANN.org Retrieved 19 March 2013
Retrieved from "https://icannwiki.org/index.php?title=.panerai&oldid=99505"
Richemont DNS Inc.
Neustar Backend
Create a Person Page
Donate to ICANNWiki
Sponsor our Work
About ICANNWiki

redpajama_set_name: RedPajamaCommonCrawl


text:
Technologyopinion
Samsung Galaxy Note 8 review: A phoenix rises from the ashes - and there's not a wisp of smoke in sight
The Note 8's stunning display and dual lens camera take it up a notch from the Galaxy S8 - but it has a price to match
Sophie CurtisTechnology and Science Editor
Samsung had a lot to prove with its Galaxy Note 8 , the first new addition to the Note range of smartphones since the Galaxy Note 7 was pulled from store shelves last year following a number of reports of handsets catching fire and exploding.
Many thought it was brave - or perhaps foolish - of Samsung to continue using the Note brand, after such a high-profile recall.
But the company has come out fighting with a multimedia powerhouse of a smartphone, taking design cues from the award-winning Galaxy S8 and combining them with the power and functionality of previous Galaxy Note devices.
It's early days, of course, but as yet there have been no reports of any overheating issues. Samsung has implemented a new eight-point battery safety test, in an attempt to make sure history doesn't repeat itself.
Assuming that all the components stay below boiling point, this is undoubtedly one of the most desirable phones on the market, and Samsung is already reporting record pre-orders in the US. But with an eye-watering price of £869, it may struggle to gain mainstream success.
Here's my verdict on the Galaxy Note 8.
The Galaxy Note 8 is very similar in appearance to the Galaxy S8+, and only a fraction bigger, with a 6.3-inch Super AMOLED screen as opposed to a 6.2-inch one on the S8+.
As with the S8 and S8+, the Note 8 boasts an "Infinity" display, which means the interactive part of the screen stretches almost to the edges of the device, with extremely narrow bezels around the edge.
The corners on the Note 8's display are more angular than those on the S8, and the glass doesn't curve at the edges in the same way, but it is still an extremely attractive device.
The "Quad HD+" display, which is certified as "Mobile HDR Premium", serves up sharp images and eye-popping colours, making the most of the larger screen space.
The all-glass body makes it a little slippery to hold, and it does pick up fingerprints easily, but both of these problems can be solved by putting a case on the phone.
iPhone 7 Plus (L), Galaxy Note 8 (M), and Galaxy S8+ (R)
Samsung Galaxy Note 8: Release date, price, features and specs of Samsung's new 6.3-inch superphone
As with the S8, the fingerprint reader is positioned high up on the back of the phone, which makes it difficult to reach when you're holding the device with one hand.
Luckily the Note 8 comes with a variety of authentication options, including an iris scanner and facial recognition, so you don't have to rely solely on the fingerprint reader to unlock your phone.
The main difference between the S8 and the Note 8 is the inclusion of Samsung's S Pen stylus, which makes it easier to draw, take notes, and mark up documents on the smartphone.
The Note 8 comes with a new and improved S Pen, which has a finer tip and is pressure-sensitive, letting you create more detailed effects.
It also has a number of features designed to take advantage of this, including "live messages", which automatically turn hand-written messages into GIFs, and "Translate", whereby you can highlight a section of text using the S Pen, and instantly translate it into another language.
You can also use the S Pen to scribble notes on the Note 8's always-on display without unlocking the phone. These notes can then be saved to the phone or copied and pasted into other applications.
If you're the kind of person who likes to use a stylus, this is undoubtedly the best smartphone you can get. The S Pen is smooth and comfortable to use, and thanks to the little slot in the bottom, you're unlikely to lose it.
But if you're used to manipulating touchscreens with your fingers, it takes a bit of getting used to - I had to keep reminding myself that some tasks, like taking screenshots, really are easier with a stylus.
The Note 8 is Samsung's first smartphone with a dual-lens camera, bringing it into line with Apple's iPhone 7 Plus.
The 12-megapixel sensor on the Galaxy S8 is no slouch, boasting an aperture of f/1.7 for capturing detailed photos in low-light conditions.
Samsung Galaxy Note 8 deals: The cheapest prices from the likes of Carphone Warehouse, EE, Vodafone and Three
However, the Note 8 takes this to the next level, with one 12-megapixel wide-angle lens and one 12-megapixel telephoto lens, offering 2X optical zoom on top of the standard digital zoom. There's also optical image stabilisation, to reduce accidental blur.
The dual camera lets you capture a depth-of-field effect, known as "bokeh", whereby the subject of the photo is in focus and the background is blurred. This technique is often used by fashion photographers, to make the model appear as if they are popping out of the picture.
I compared the Note 8's camera side-by-side with the iPhone 7 Plus's dual lens camera, and it performed well, with lots of detail in photos even when zoomed in.
While pictures taken with the iPhone 7 Plus came out brighter, the colours captured by the Galaxy Note 8 were more true to life.
Best of all, with the Galaxy Note 8 you can adjust the level of blur in the background, even after the picture has been taken, giving you an opportunity to get artistic with your photos.
The model I tested was running Android 7.1.1 Nougat , but with Google recently announcing the release of Android 8.0 Oreo, you can expect an over-the-air update for the Note 8 fairly soon.
The large screen size makes the Note 8 well suited to multitasking, so you can watch a YouTube video on one half of the screen while replying to an email or browsing the web on the other, for example.
Whether or not you'll find this feature useful depends on how you use your phone, but it's something Apple is also bringing to iPhones with the release of iOS 11 later this month.
I personally find it a bit awkward to have lots of information crammed onto the screen at once - and it's not like it takes long to switch between apps on Android - but applications may become better adapted to this format over time.
If there's a particular combination of apps you find useful to having running side by side, you can create a shortcut and add it to the Note 8's Edge panel for quick access.
Bixby voice
Samsung's virtual personal assistant Bixby made its debut on the Galaxy S8, but it was fairly underwhelming, as the company's image recognition software, Bixby Vision, was the only AI technology enabled at the time.
Now Samsung has released Bixby Voice - which is essentially the company's answer to Apple Siri, Amazon Alexa and Google Assistant, allowing users to control their smartphones using voice commands.
There's a dedicated Bixby button on the side of the Note 8, which you can press to call up the virtual assistant and then give it an instruction like "take a selfie", "show me the last photo I took", or "share this photo on Facebook".
Samsung Galaxy S8 review: Everything it needed to be and more
It can also be used to open web pages, scroll through them, set reminders and control smart home applicances.
In my tests it seemed to work pretty well. Integration with apps like Facebook makes it more useful than personal assistants that just act as voice-controlled search engines. I also prefer pressing a button to call up the assistant to using a wake word like "Alexa" or "OK Google"
You can create custom voice commands, which prompt the phone to carry out a sequence of actions, which is a nice touch. For example, you can use the command "good night" as a shortcut for "turn on 'do-not-disturb' mode, set an alarm for 6am and turn on blue light filter".
Confusingly, the Note 8 also has Google Assistant built in, so you have to choose which personal assistant to use. Given that Assistant is better established, users may lean towards Google's offering, but the dedicated Bixby button puts Samsung's assistant within easy reach.
The Note 8 is a beautifully crafted smartphone that oozes sophistication. It offers everything the Galaxy S8 does, but with the added benefit of a smart stylus for when productivity is the order of the day, and a dual-lens camera to take your photography up a notch.
The £869 price tag will be pretty hard for most people to swallow, making it even more expensive than the 128GB iPhone 7 Plus - although the forthcoming iPhone 8 is rumoured to cost even more.
But for those with business accounts, or those who are happy to fork out for absolute top-of-the-range technology, this is likely to be high on the lust list.
Importantly, it shows that Samsung is capable of rising like a phoenix from ashes, stronger and even more ambitious than before.
The Samsung Galaxy Note 8 is available to pre-order now from the Samsung website , and also from selected operators and retailers including Carphone Warehouse , EE , Three and Sky Mobile . It will begin shipping to customers in the UK on September 15.
MirrorSciTech
Follow @MirrorTech
Samsung Inc.
Amazon Prime Day9 incredible tech deals to buy before the Amazon Prime Day 2019 sale ends tonightThe second day of Amazon Prime Day is underway and these are the tech items we think are too good to miss
Rare animalsPhoto of starfish with 'thicc a**' goes viral - here's what the 'bum' actually isIn the image, the starfish looks like it has a rather peachy bottom, or 'thicc a**', as its photographer describes it
RobotsWorking women are twice as likely as men to have their jobs replaced by ROBOTSAlmost one in 10 working women in the UK hold jobs with a high potential for automation
Video GamesDragon Quest Builders 2 Switch review: You build em up I'll knock em down!Grab your tools and get ready to face the children of Hargon in this epic build-em-up
FacebookFacebook's latest iOS update is making the app CRASH - and users are furiousSince downloading Facebook's latest iOS update, many users claim that the app keeps crashing
National LotteryBig change to National Lottery scratchcard rules to protect players
BrexitHoliday costs rise as pound hits six-month low as Boris Johnson hurtles towards No Deal Brexit
Sterling hit a six-month low against the euro - days before school summer holidays - after the Tory PM favourite hardened his stance
IkeaIKEA oven door explodes sending shards of hot glass all over family kitchen
Mum Emma Clark has hit out after the less-than-a-year-old Whirlpool oven detonated saying it was lucky the children weren't in the room
Fire ServiceHuge fire rips through London flat block as 40 firefighters race to scene
London Fire Brigade have 40 firefighters battling the blaze at the scene as thick black smoke poured from the building
Marriage'Bridezilla' demands fiancé get second job to fund extravagant £64k wedding
The bride-to-be also revealed that she had given up her own job in order to plan her big day


Springtime Special: get a FREE rabbit and carrot chip kookie with every bag (small or large, excluding bonus bags) of our meat brittle!
Nothing beats that aroma of the weekend breakfast, a captivating flavor of bacon gathering everyone, including the doggy, around the kitchen table. Our chefs have mastered Grandma's kitchen secrets of that appetizing crispiness which culminates in our marbleized pork brittle. So now every day can be Sunday for your doggy!
Bow-Wow Factor: Pork is the "other" white meat, a healthy source of iron, potassium and protein.


October was another busy month in retail as the industry prepares for the holiday season and pundits make predictions of how this year will fare compared to others. At KWI, we've been closely following some recent trends focused on digitally native brands setting up physical stores and the rise of pop-ups, as well as how some innovative companies are using mall kiosks as extensions of their brands. The common theme here is that customers are demanding new ways to engage with brands and that shoppers are finding that nothing can replace the ability to touch and feel a product, especially for fashion brands.
According to eMarketer, Americans will likely will spend $1.002 trillion from Nov. 1 to Dec. 31. This would be a 5.8% increase from last year, and the strongest growth since 2011. Brick-and-mortar sales represent 87.7% of total holiday spending, a share that has declined. This year, e-commerce sales are estimated to increase 16.6% to $123.73 billion—12.3% of all holiday retail sales.
Black Friday no longer carries the same weight it once did, with at least 60 retailers planning to keep their stores closed during Thanksgiving this year, including Costco, Nordstrom and TJMaxx. In addition, consumers expect deals and discounts throughout the year, not just on this one day, as seen by Amazon Prime Day and other retailers offering significant deals outside of the season.
Retail Dive delves into a recent report from commercial real estate firm JLL that examined the trend of digital startups moving to physical locations. Over the next five years, 850 physical spaces are set to open 'clicks-to-bricks' stores with Casper cited as opening 200 storefronts, AdoreMe with 300, and Allbirds poised to open stores in four cities. More than half of the e-tailers included in the report opened up pop-up locations first in New York City, followed by Los Angeles and Toronto. When it comes to permanent locations, NYC leads, followed by LA, San Francisco and Chicago.
PYMNTS explores how the mall kiosk or retail merchandising unit (RMU) is being revived by a company called Fourpost, as it aims to democratize the department store concept and meet the evolving needs of brands. Brands will be able to lease space for a relatively short period of time – six months to one year – in a variety of designs, from standard cubes to triangles and receptacles. The spaces come with the kinds of elements that a retailer would need in a mall, such as lighting, signage, point of sale (POS) hardware and Wi-Fi, as well as access to amenities like event space.
Fashion brands have long used the 'drop' model popularized by Supreme to generate buzz and excitement for a launch. But now brands outside of the fashion world are getting into the mix, with brands like Shake Shack, Dos Toros and Quip trying out the approach to launch specialty products or generate app downloads.
Adweek reports from Shopify Plus Commerce event how direct-to-consumer brands are making headway against incumbent brands by focusing on technology and customer experience. Brands like Knix, Parachute, Cuyana, Adore Me, Rebecca Minkoff and Brooklinen shared their experience in building brands and connecting with customers.


text:
Richard Edmund Neal (14 februari 1949) is een Amerikaanse politicus die sinds 1989 de Amerikaanse vertegenwoordiger is voor het 1e congresdistrict van Massachusetts. Het district, genummerd als het 2e district van 1989 tot 2013, omvat Springfield, West Springfield, Pittsfield, Holyoke, Agawam, Chicopee en Westfield, en is veel landelijker dan de rest van de staat. Neal, lid van de Democratische Partij, is sinds 2013 de decaan van de delegatie van Massachusetts naar het Huis van Afgevaardigden van de Verenigde Staten en hij is ook de decaan van de delegaties van het New England House.

Amerikaans politicus

redpajama_set_name: RedPajamaWikipedia


text:
Academics Sidebar Menu
Registrar/Student Records Office
Degrees & Programs Communication Studies
Cultivate eloquence and wisdom, studying how to imitate Christ's creative, provocative, and reconciling communication.
Develop into a wise analyst of human influence in a globally-oriented, media-saturated culture. Explore the difficulty of interpersonal faithfulness in a transient culture, the increasing power of the media, and the role of persuasion and propaganda in social movements. Study verbal and nonverbal aspects of oral, print and electronic messages and discuss questions such as: How do messages lead to meaning—or misunderstanding or manipulation? How has public discourse influenced culture? What are the effects of image-based communication?
Scheduling Courses in Communication Studies
The Communication Studies program has four foundational, required courses and then students choose seven courses from different categories. While there is no "template" or required order of classes, there are specific recommendations and requirements as outlined here. There is a lot of flexibility in the major, but do see your advisor early and often to make sure you are on track. Course descriptions are in the College Catalog. Download the List of Required COM Courses (PDF)
COM 006: All students interested in Communication Studies should plan to take COM 006 (Messages, Meaning, and Culture) their first semester at Westmont (or second semester if need be). This course is required for the major and it provides an overview of many areas, theories, and concepts within the communication discipline. It also meets the General Education (GE) "Understanding Society" requirement.
If COM 006 is full, then we suggest that first year students take COM 015 (Public Speaking, which meets the Writing/Speech Intensive GE) their first semester and COM 006 in the Spring.
COM 015: Students are encouraged to take Public Speaking in their first year as it meets the Writing/Speech Intensive GE requirement and is a core course in the major.
COM 098: All students are required to take COM 098 (Research Methods in Communication) for the major, and it is a pre-requisite for several courses. We recommend you take this course early, but after you've taken COM 006. It is best to have this course completed by the end of fall semester in your second year (or sooner if you are a transfer student). You may take it second semester of your first year if you've already completed COM 006.
During your second year, you will want to start taking courses that interest you and meet the category requirements for the major. You will also want to look into off campus programs and plan your GE courses based on your major and off campus program plans. Your advisor will discuss your plans for completing major courses, general education courses, and off campus programs with you.
We advise students to take COM 101 - Rhetoric I the Fall of their junior year, unless they plan to be off campus, in which case they should take COM 101 in the fall of their senior year. This course is only offered during fall semesters.
During the spring of your junior year, you will need to talk with your advisor about which senior capstone experience option is best for you. You will choose an internship, a research project, or a senior seminar. You will also complete an "application for degree" with your academic advisor, which is submitted to the Registrar's office for approval.
In your senior year you will complete a senior capstone experience as well as all of your other requirements for a Westmont degree. Whether or not you complete the internship as part of your capstone experience, we recommend all students complete internships, in Santa Barbara, at home over the summer, or on an off-campus program.
Deborah Dunn, Ph.D.
Started the Westmont Initiative for Public Dialogue and Deliberation
Elizabeth Gardner, Ph.D.
Studies social change and the rhetorical construction of childhood
Greg Spencer, Ph.D.
Most recent book is Reframing the Soul: How Words Transform Our Faith
Lesa Stern, Ph.D.
Studies interpersonal communication's impact on resilience and flourishing.
Lorraine Yoro
Email: lyoro@westmont.edu
Office: First Floor of Deane Hall (104)
See career paths for graduates who majored or minored in communication studies at Westmont.
Borders, Boundaries, and Brexits: Peace and Conflict from Jerusalem to Belfast
Professors Deborah Dunn and Caryn Reeder (Religious Studies) will lead the 2019 Mayterm Course: Borders, Boundaries, and Brexits: Peace and Conflict from Jerusalem to Belfast. Students will study conflict and reconciliation in Israel/The West Bank and Northern Ireland. The course is framed by a discussion of borders and how they are physically, symbolically, and politically constructed, interpreted, refined, and enshrined. This will involve discussion of the physical environment and discursive landscapes, memory, national narratives of identity, and the pedagogy of space, such that students are able to see the connections among context, history, institutions, and human symbolic activity. In particular, conflict over and the struggle for natural resources will be highlighted as a factor in the creation of borders, as well as the effects of those borders on the use of resources and on the environment.
Kaylee Hicks Named 2020 Senior of the Year
Kaylee Hicks '20, senior of the year in communication studies, is a pursuer of truth, a rigorous discerner in class discussions, and a most dependable student. She does not shy away from raising questions and challenging prevailing flows of thought, yet also challenges and dissents in welcoming ways and with a humble spirit. Her ability to mentor younger students and create hospitable spaces in and beyond the classroom make her a truly ethical communicator and scholar. Kaylee has certainly made her mark on Westmont! She participated in Potter's Clay all four years, growing in her leadership each year, serving on the core team, leading ministries, and serving as publicity manager. Her love of the Spanish language and Mexican culture led her to study abroad in Querétaro, Mexico, where she found it "a joy and a privilege to become more fluent and able to communicate competently with my host family, professors, and even Uber drivers!" In addition to her ministry and study abroad, Kaylee sang with the college choir and WOW (Women of Westmont, an a cappella vocal group). She's also worked with the Conversation Café and served as an Orientation team leader and teaching assistant in communication research methods. Professor Lesa Stern says that Kaylee is particularly gifted in helping students clarify and pursue their research ideas while also encouraging them along the way. Kaylee says that her involvement in various ministries and discussion activities were especially valuable, as she cherished helping people feel seen, heard and known. She says that "this is, in large part, what prompted me to pursue a graduate degree in speech language pathology, where I can help to give the gift of communication to others so they are able to express themselves better and find a sense of belonging."
Spencer Offers Help in 'Reframing the Soul'
Greg Spencer recently published his new book, Reframing the Soul. "As we work on our word choice, we become empowered to reframe our story according to the truth of our lives and the wisdom of the gospel. New circumstances, such as a natural disaster, often drive us to reframe. In times of crisis, we might realize that the labels we've been using are unsatisfying. Reframing the Soul guides readers through four 'soul essentials': remembering the past with gratitude, anticipating the future with hope, dwelling within themselves with peace, and relating to others in love."
Westmont Initiative for Public Dialogue and Deliberation
Deborah Dunn and Rachel Winslow (Westmont Downtown) have launched the Westmont Initiative for Public Dialogue (WIPD). The initiative works with neighbors to speak and listen well together about the challenges facing the Santa Barbara community for our common good and human flourishing. The first conversation focused on how to care for vulnerable children, with an emphasis on the foster care system. The Fall 2018 public conversation topic is immigration, using the framework established by the National Issues Forums Institute. Rachel and Deborah spent a year working as research fellows with the Kettering Foundation in Dayton, Ohio to prepare for this work. The vision of the WIPD is to promote the common good, equip students and neighbors to facilitate effective community dialogues, cultivate human community through healthy conversation and listening, help community partners frame issues well, support democratic participation, and endeavor to tackle "wicked problems."
Award for Elizabeth Gardner
Elizabeth Gardner, who completed her doctorate at the University of Maryland, was recently honored for writing the 2017 Outstanding Dissertation by the American Society for the History of Rhetoric. She presented a paper based on the research ("Establishing Adolescents' Rights through State Child Labor Legislation") at the National Communication Association Conference in November 2017.
Lesa Stern Presents Paper in Dallas
Lesa Stern presented her research, "Examining Christian Listeners' Role in Gossip: A Relational Dilemma"— in November 2017 at the National Communication Association Conference held in Dallas, Texas.
Greg Spencer Named Master Teacher
Greg Spencer, Westmont professor of communication studies, is the Western States Communication Association (WSCA) Communication and Instruction Interest Group's 2018 Master Teacher.
There are many exciting and challenging off campus program opportunities that work well with a communication studies major. There are also many programs that work well for your second major, your minor, or for general education. Here is a list of programs that are specific to the major:
American University of Paris - Global Communication
American Studies Program, Washington, D.C.
The Hague, Netherlands (University Studies Abroad Consortium) - Communication Management
Los Angeles Film Studies Center
NYU - Buenos Aires, Argentina - Global Media, Journalism, Cinema
Communication Studies Mayterm in Conflict & Reconciliation (Israel / West Bank & Northern Ireland in 2019)
Senior of the Year. Each year we recognize one student for academic achievement both in communication studies and in their general and other studies at Westmont. Typically, the senior of the year has achieved a near-perfect GPA in communication courses, but contributions to the department and peers are considered as well.
Lambda Pi Eta is the official communication studies honor society of the National Communication Association (NCA). As a member of the Association of College Honor Societies, Lambda Pi Eta has over 400 active chapters at four-year colleges and universities worldwide. Westmont students are invited to join when they've completed at least 60 units overall, at least 12 COM units, and are ranked in the top 1/3 of their graduating class (in recent years, the cut-off for the top third of the class is a 3.5 GPA).
Phi Kappa Phi is the honor society open to all majors at Westmont College, and sponsor of both lectures and banquets honoring scholarship and the love of learning.
Major Honors. Some students are motivated by doing high level research, writing, and working semi-independently. If you desire to go above and beyond what you'd be expected to do in the classroom, or you have a particular research interest, talk to one of your professors about completing an major honors thesis. This is especially encouraged if you plan to go to graduate school. If you choose this option, you will need to have all of your plans in place by the end of your junior year.
Honors at Commencement are awarded based on cumulative GPA. If you are a member of Lambda Pi Eta, you may choose to wear an honor cord with your commencement robe; this is in addition to honor cords for cum laude, magna cum laude, and summa cum laude awards, based on your cumulative Westmont GPA.
Scholarships & Fellowships After Westmont. There are many scholarship and fellowship opportunities for Westmont graduates, especially for those considering graduate school. Imagine yourself a Fulbright Scholar or a Javitz or Lilly Fellow.
Mayterm Abroad
Two professors (Deborah Dunn from Communication Studies and Caryn Reeder from Religious Studies) will lead students on an academic study abroad program framed by a discussion of borders and how they are physically, symbolically, and politically constructed, interpreted, reified, and enshrined. Our two "cases" for in-depth study and travel include Israel and Palestine/The West Bank, and Northern Ireland/Ireland/The United Kingdom. We will cross many "borders" - from Israel to the West Bank, from the UK to the Republic of Ireland, from a Catholic community to a Protestant Community, from an Arab neighborhood to a Jewish neighborhood, and from the Christian sector to the Jewish sector in the old city of Jerusalem.
We will visit, study, engage in close readings of, and learn to appreciate the various expressions of conflict, peace, and memory over the centuries and across conflicting cultures. How do people memorialize war? Peace? Violence? Sacrifice? How do scapegoats both create recipes for genocide and possibilities for peace? We will observe the borders and boundaries that define one people while excluding another. We observe physical boundaries as well as social boundaries, from walls to music to language to dress to sport. At the same time, we will engage some on-the-ground peacemakers who actively work to create peace in their communities and in their nation via dialogue, prayer, and ancient Christian practices (from fasting to pilgrimage). We also will meet people who insist that the true way to peace is to live more simply, to work in harmony with natural resources, and to change the ways we relate to our physical environment.
Students will earn credit for two courses, for a total of eight units. The courses will be taught organically, as a whole. The courses you will earn credit for include COM 134 (4 units), a course currently in the catalogue, and approved for major credit for communication studies majors and elective credit for students in other majors. COM 134 has also been approved for the GE category, Thinking Historically. You will also earn credit for another 4-unit course, which can count either as a COM special topics course (COM 195) or as a Religious Studies special topics (RS 107 on borders, creation care, and the Bible).
Communication Studies Alumni
Amy Owens Roach '03
As vice president of iHeartMedia's Connections West team, she works with the country's largest advertisers on cross-platform, custom marketing campaigns, reaching more than 243 million people each month. Amy specializes in automotive advertising, working closely with Honda and Nissan to create artist-driven marketing campaigns using iHeartMedia's suite of assets. "My job is exciting and rewarding, as it allows for me to be creative, meet with clients at the building stage of a campaign, and present opportunities that have been customized for them" she says.
Liane Koh '08
Liane started as a hotel front-desk agent and concierge in Santa Barbara, earned a diploma in culinary arts from Le Cordon Blue, and worked as a management intern for a major resort in Singapore and the Maldives, before earning a master's degree in communication management from the Annenberg School for Communication at USC. She now manages five to eight accounts doing traditional and digital marketing, brand strategy, social media and content creation, reputation management, and cause-related marketing.
Paul Angone '05
Paul is the best-selling author of 101 Secrets For Your Twenties, All Groan Up, and 101 Questions You Need to Ask in Your Twenties (and let's be honest, your thirties, too). He is also a national keynote speaker, the creator of AllGroanUp.com, which has been read by millions of people in 190 countries, and an organizational consultant with a master's degree in organizational leadership. Paul has worked with companies such as Intel Security, Wells Fargo, and Aflac to help them attract, develop, and retain the Millennial generation, and his work has featured in Bloomberg, The Chicago Tribune, and Business Insider.
Dave Tell '98
Dave teaches rhetoric at the University of Kansas, specializing in postmodern theory and the place of religious discourse in public life. After graduating from Westmont, Dave earned his master's degree and doctorate at Penn State. His current work focuses on the intersections of rhetorical theory and cultural politics. His work on the Emmett Till Memory Project is groundbreaking, as is his forthcoming book, Remembering Emmett Till (U of Chicago Press). His previous book is Confessional Crises: Confession and Cultural Politics in Twentieth-Century America.
Anita Perez Ferguson '71
Anita is a speaker, author, and consultant in program and leadership development, and has served as president of the National Women's Political Caucus, chair of the Inter American Foundation, as White House Liaison to the U.S. Department of Transportation, and as a Visiting Fellow at the Woodrow Wilson Foundation. She translated her experience into her books, A Passion for Politics, and Women Seen & Heard: Lessons Learned from Successful Speakers. See her contribution to California Listens: https://www.youtube.com/watch?v=PeEZCDkW3fM&feature=youtu.be
Jim Roach '00
An Emmy award winning songwriter, record producer, and owner of Santa Monica Recordings based in Los Angeles. After years of being on the road and in the studio as a multi-instrumentalist, he switched gears in 2004 to work exclusively in the recording studio. He writes and produces music for film, television, trailers and commercials and works with artists as well. From 2015-2016 he took a job as executive producer for Apple Music and Beats1 Radio with Zane Lowe.
Joy Eggerichs Reed '04
Joy is the founder and director of Punchline Speakers, an agency connecting "great speakers to great opportunities (and vice versa)." A speaker and consultant who records a weekly podcast for Relevant Magazine, she is also an advisory board member helping Christian Mingle with their re-branding. For seven years she served as director of Love and Respect Now, serving people trying to navigate dating and their relationships.
Felicia Wright Roark '07
As a business consultant focused on strategy and change management, Felicia helps business executives and managers build critical leadership capabilities and achieve data-driven results. Consulting allows Felicia to use her passion for self-improvement and continual learning to inspire new ways of thinking within Fortune 100 and 500 company cultures across the globe. To transition from her former career as a political lobbyist, Felicia went back to earn her MBA degree ten years after graduating Westmont.
Kristin Rushforth Ritzau '04
After internships at Westmont that ranged from the film industry to event planning to Amnesty International, Kristin earned a master's in Christian leadership at Fuller Theological Seminary and worked with young adults in church and university settings. After she published her first book, A Beautiful Mess: A Perfectionist's Journey Through Self-Care, she sought certification as a spiritual director. Feeling called to the classroom, she then earned a doctorate in practical theology and spiritual formation at Claremont School of Theology.
Don Waisanen '02
Don teaches at Baruch College, CUNY Marxe School of Public and International Affairs. He also delivers workshops on communication strategy, storytelling, and leadership and improvisation. In his research, Don seeks to understand how communication works to promote or hinder the force of citizens' voices. He is the author of Political Conversion: Personal Transformation as Strategic Public Communication. Previously, he worked in broadcast journalism, as a speechwriter, and on political campaigns. He earned his Ph.D. in Communication from the University of Southern California and is an improvisational comedian.
Megan Moe '88
After working as a reporter in New Jersey, a market researcher in Delaware, a floor director and camera operator for television in Buffalo, N.Y., and a public service announcement writer for PBS in San Francisco, she moved to overseeing the communication discipline (advertising, journalism and communication studies) in the department of Communication and the Arts at Lee University. She studies women who've been subject to domestic violence, both physical and emotional. She earned her MA at UC Davis and her Ph.D. at Penn State.
Amanda Wigno Harter '08
Amanda works as the North State Service Area Marketing Communications Manager for Dignity Health. She worked overtime to keep the public updated on evacuations of NICU babies during the Carr Fire this last summer. She earned her master's degree in organizational leadership with an emphasis in nonprofit management from Simpson University and serves as team captain in the Shasta Roller Derby league.
Douglas L. Kelley '80
Douglas Kelley received his doctorate from the University of Arizona and his master's from Arizona State University, where he teaches. He studies interpersonal communication processes, focusing on marital communication and how couples negotiate privacy and relational expectations. He co-wrote "Communicating Forgiveness," an interdisciplinary work that offers a hopeful framework for negotiating healthy and just responses to relational disappointments.
Lauren Cano Amaro '06
Lauren teaches relational, health, and family communication at Pepperdine University. Her research projects ask: How do families "heal and deal" in the wake of major traumas? She has developed interventions for family caregivers, children of alcoholics, and parents of children with severe allergies, focusing on the importance of positive communication practices such as gratitude and communal coping. She earned her Ph.D. in communication at Arizona State University.
Hillary McCall '11
Hillary started with the Santa Barbara Foundation doing communications and marketing, developing its first online platforms, implementing new branding strategies, and telling the stories of philanthropy taking action. "Seeing the social impact of my work was of high, personal value in my professional development," she says. She went on to oversee network and development at Incredible Children's Art Network (iCAN), and currently serves as senior business development manager at Souktel Digital Solutions in Washington, D.C.
Sarah Higgins '01
Sarah works with children and young adults with autism teaching and doing behavioral therapy, noting that "what has been most fulfilling in this field is seeing students make progress in any area that will enhance how they function in life, seeing them take pride in their work, and discovering what brings them joy." Previously she was a behavioral therapist and instructional assistant in special education, and is a certified assistant in Speech-Language Pathology (CU Boulder). Ready for a new adventure, and drawing on her background in dance and Pilates, Sarah is starting school again to study physical therapy.


The Bayshore Sprint is designed for entry level Triathletes looking to do a true Swim, Bike Run. Swim is in the shallow calm Alamitos Bay, Short bike ride up the path and finishing with a run up the run path. So much fun. LIMITED ENTRIES.


text:
Images of the ocean world, the lands that touch it, and the life within it.
Sunset in the Sulu Sea, Philippines
Koh Tachai - Thailand Paradise in the Similan Islands. This half-moon arc of white sand beach is surrounded by crystal clear water, coral reefs, and completely deserted of tourists. Only a few times a day do dive boats stop for a few hours, as you are not allowed to stay on the island overnight.
The Coral Triangle - Indonesia Indonesia, which stretches from north of Singapore, east to Papua New Guinea, and north to Borneo, is made up of more than 17,000 islands (6,000 of which are inhabited) and 150 active volcanoes - the most famous being Krakatoa. Komodo Island sits in the lower point of the 'coral triangle', a vast reef area with the worlds largest coral and fish diversity. Almost a dozen organizations are active in the preservation and conservation of these pristine reefs, many under threat by unsustainable fishing practices and globally warmer seas. Here, the fiery sun slips into the Flores Sea - a sea filled with unbelievable biodiversity, staggering beauty, and a landscape of color.
Paradise Cove - Mexico Turquoise waters, shimmering white sand beaches, azure skies, salt and pepper stripped limestone cliffs draped in palm trees - paradise indeed. Here, the beaches of Tulum are the nesting grounds for sea turtles. From May to August, almost every night, the turtles come to the beaches to dig holes and to lay their eggs.
Curve of the Earth, Riviera Maya - Mexico A solitary fishing boat glides through tropical waters towards a fiery sun. On mornings like this, you truly wonder if you are at the end of the world, where the sun and sky meet in a red hot welded joint.
Always Remember - Thailand This tranquil beach, on the western coast of Thailand, was the terrifying stage for the 'Boxing Day' tsunami of 2004, which killed 230,000 people in 14 countries. Scientific date place this ocean floor earthquake at magnitude 9.2, the energy generated was equivalent to 550 million Hiroshima bombs, and research shows that the entire planet measurably vibrated. Now, looking toward the calm flat line between sky and sea, it is impossible to imagine a singular wall of water (90 feet high) that stretched across the entire horizon. This image was taken right in front of a five-star resort which has become home for monkeys, vines, and spiders - its luxury in ruins, the mosaic pools filled with living plants and sand, the jungle reclaiming its own.
Little Jerry Beach, Koh Lak - Thailand On the crude scrap of paper that was called a 'map' this beach was noted as "secret beach". And so we hiked; through the rain forest, along jungle cliffs webbed with vines, up and down muddy troughs of leaf litter, in the darkness of an occlusive green canopy, through the webs of gigantic Golden Orb spiders (5 inch legspan), to finally emerge on this pristine sand beach. After hours of profuse sweating, we walked into the light and laid in the sand - only to notice a maintained trail coming down through the forest behind us, from the highway, and a bamboo shack selling ice cream and soda. Stupid map.
Similan Sunrise - Thailand Sunrise over the tiny Islet of Similan #6. Although not large enough to posses a white sand beach, this tiny granite outcropping is surrounded with lively reefs filled with hundreds of species of tropical fish, soft and hard corals, octopus and the occasional larger pelagic.
Anemone Garden, Similan Islands - Thailand On a shelf of bare granite was this small covey of partially closed blue and purple Magnificent Anemone. As we floated overhead the resident Skunk Clownfish kept a close watch on us, never straying away from the safety of their little anemone homes.
Koh Bon, Similan Islands - Thailand The waters around the island of Koh Bon are nearly indescribable in their clarity and beauty. The jungle, the granite boulders stacked just so, the stunning azure blue of the water. It's almost as if it were a constructed stage for a movie.
Moonrise over the Sulu Sea, Philippines.
Soaring Manta, Similan Islands - Thailand A giant manta ray soars silently over a wall of sea fans along the rocky cliffs of Koh Bon island. These giant, gentle creatures can become twelve to twenty-five feet wide, wingtip to wingtip. They glide past divers in graceful arcs while filtering the plankton from the water with massive gills.
The Jaya - Thailand Indonesian built, this traditional phinsi schooner was our home for a week, diving the fantastic oceans of the Similan Islands of Thailand.
Clown Fish - Thailand The clown Anemonefish and the anemone have a symbiotic relationship. The clown fish is not harmed by the stinging tentacles of the anemone, and its bright orange color acts as a lure for passing fish. After the anemone paralyzes its prey, the clown fish gets to eat the leftovers. The clown fish helps keep the anemone clean and increases water circulation by its constant swimming action.
Tranquility - Thailand Snorkeling is like flying. You glide over powder-white sand, weightless, captivated by the myriad small fish that pass just a few feet away, and slowly move to deeper water, to deeper coral patches and the life that can be found there.
Barrel Sponge - Thailand Large barrel sponges like this one, weathered the Tsunami of 2004 much better than the surrounding fans and soft corals. But, due in part to an inexhaustible effort by the local divers here at Ao Nang, who painstakingly replaced and supported the broken fans with bamboo, the diving, and the health of the reef, is returning to its original vibrant state.
Crescent Beach - Oregon The small town of Cannon Beach, with its iconic "Haystack Rock", as seen from Ecola Point, just north of the city.
Edge of the Storm, Ambergris Caye - Belize Scattered sunlight grazes the ocean as a hurricane safely passes the island, hundreds of miles off the coast.


Registration opening soon. Sign up for alerts by using the registration button.
Drug repurposing represents a promising approach to find new therapeutic uses for existing drugs. This two-day meeting will provide a platform to highlight some of the latest developments in the field of drug repurposing.
There is a need for more systematic and strategic approaches and resources, and this meeting wants to highlight and showcase such efforts besides recent drug repurposing studies.
The field of drug repurposing provides a natural opportunity to combine the strengths of the academic and industrial field. Therefore, we encourage scientists from both sectors, as well as clinicians, to attend this meeting and use it as a networking opportunity and an interdisciplinary forum for discussion.