text:
package org.apache.hadoop.tools;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FsShell;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DFSTestUtil;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.security.Credentials;
import org.apache.hadoop.tools.mapred.CopyMapper;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * Base class to test "-rdiff s2 s1".
 * Shared by "-rdiff s2 s1 src tgt" and "-rdiff s2 s1 tgt tgt"
 */
public abstract class TestDistCpSyncReverseBase {
  private MiniDFSCluster cluster;
  private final Configuration conf = new HdfsConfiguration();
  private DistributedFileSystem dfs;
  private DistCpOptions.Builder optionsBuilder;
  private DistCpContext distCpContext;
  private Path source;
  private boolean isSrcNotSameAsTgt = true;
  private final Path target = new Path("/target");
  private final long blockSize = 1024;
  private final short dataNum = 1;

  abstract void initSourcePath();

  private static List<String> lsr(final String prefix,
      final FsShell shell, Path rootDir) throws Exception {
    return lsr(prefix, shell, rootDir.toString(), null);
  }

  private List<String> lsrSource(final String prefix,
      final FsShell shell, Path rootDir) throws Exception {
    final Path spath = isSrcNotSameAsTgt? rootDir :
      new Path(rootDir.toString(),
          HdfsConstants.DOT_SNAPSHOT_DIR + Path.SEPARATOR + "s1");
    return lsr(prefix, shell, spath.toString(), null);
  }

  private static List<String> lsr(final String prefix,
      final FsShell shell, String rootDir, String glob) throws Exception {
    final String dir = glob == null ? rootDir : glob;
    System.out.println(prefix + " lsr root=" + rootDir);
    final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    final PrintStream out = new PrintStream(bytes);
    final PrintStream oldOut = System.out;
    final PrintStream oldErr = System.err;
    System.setOut(out);
    System.setErr(out);
    final String results;
    try {
      Assert.assertEquals(0, shell.run(new String[] {"-lsr", dir }));
      results = bytes.toString();
    } finally {
      IOUtils.closeStream(out);
      System.setOut(oldOut);
      System.setErr(oldErr);
    }
    System.out.println("lsr results:\n" + results);
    String dirname = rootDir;
    if (rootDir.lastIndexOf(Path.SEPARATOR) != -1) {
      dirname = rootDir.substring(rootDir.lastIndexOf(Path.SEPARATOR));
    }

    final List<String> paths = new ArrayList<String>();
    for (StringTokenizer t = new StringTokenizer(results, "\n"); t
        .hasMoreTokens();) {
      final String s = t.nextToken();
      final int i = s.indexOf(dirname);
      if (i >= 0) {
        paths.add(s.substring(i + dirname.length()));
      }
    }
    Collections.sort(paths);
    System.out
        .println("lsr paths = " + paths.toString().replace(", ", ",\n  "));
    return paths;
  }

  public void setSource(final Path src) {
    this.source = src;
  }

  public void setSrcNotSameAsTgt(final boolean srcNotSameAsTgt) {
    isSrcNotSameAsTgt = srcNotSameAsTgt;
  }

  @Before
  public void setUp() throws Exception {
    initSourcePath();

    cluster = new MiniDFSCluster.Builder(conf).numDataNodes(dataNum).build();
    cluster.waitActive();

    dfs = cluster.getFileSystem();
    if (isSrcNotSameAsTgt) {
      dfs.mkdirs(source);
    }
    dfs.mkdirs(target);

    optionsBuilder = new DistCpOptions.Builder(Arrays.asList(source), target)
        .withSyncFolder(true)
        .withUseRdiff("s2", "s1");
    final DistCpOptions options = optionsBuilder.build();
    options.appendToConf(conf);
    distCpContext = new DistCpContext(options);

    conf.set(DistCpConstants.CONF_LABEL_TARGET_WORK_PATH, target.toString());
    conf.set(DistCpConstants.CONF_LABEL_TARGET_FINAL_PATH, target.toString());
  }

  @After
  public void tearDown() throws Exception {
    IOUtils.cleanupWithLogger(null, dfs);
    if (cluster != null) {
      cluster.shutdown();
    }
  }

  /**
   * Test the sync returns false in the following scenarios:
   * 1. the source/target dir are not snapshottable dir
   * 2. the source/target does not have the given snapshots
   * 3. changes have been made in target
   */
  @Test
  public void testFallback() throws Exception {
    // the source/target dir are not snapshottable dir
    Assert.assertFalse(sync());
    // make sure the source path has been updated to the snapshot path
    final Path spath = new Path(source,
        HdfsConstants.DOT_SNAPSHOT_DIR + Path.SEPARATOR + "s1");
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));

    // reset source path in options
    optionsBuilder.withSourcePaths(Arrays.asList(source));
    // the source/target does not have the given snapshots
    dfs.allowSnapshot(source);
    dfs.allowSnapshot(target);
    Assert.assertFalse(sync());
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));

    // reset source path in options
    optionsBuilder.withSourcePaths(Arrays.asList(source));
    this.enableAndCreateFirstSnapshot();
    dfs.createSnapshot(target, "s2");
    Assert.assertTrue(sync());

    // reset source paths in options
    optionsBuilder.withSourcePaths(Arrays.asList(source));
    // changes have been made in target
    final Path subTarget = new Path(target, "sub");
    dfs.mkdirs(subTarget);
    Assert.assertFalse(sync());
    // make sure the source path has been updated to the snapshot path
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));

    // reset source paths in options
    optionsBuilder.withSourcePaths(Arrays.asList(source));
    dfs.delete(subTarget, true);
    Assert.assertTrue(sync());
  }

  private void syncAndVerify() throws Exception {

    final FsShell shell = new FsShell(conf);
    lsrSource("Before sync source: ", shell, source);
    lsr("Before sync target: ", shell, target);

    Assert.assertTrue(sync());

    lsrSource("After sync source: ", shell, source);
    lsr("After sync target: ", shell, target);

    verifyCopy(dfs.getFileStatus(source), dfs.getFileStatus(target), false);
  }

  private boolean sync() throws Exception {
    distCpContext = new DistCpContext(optionsBuilder.build());
    final DistCpSync distCpSync = new DistCpSync(distCpContext, conf);
    return distCpSync.sync();
  }

  private void enableAndCreateFirstSnapshot() throws Exception {
    if (isSrcNotSameAsTgt) {
      dfs.allowSnapshot(source);
      dfs.createSnapshot(source, "s1");
    }
    dfs.allowSnapshot(target);
    dfs.createSnapshot(target, "s1");
  }

  private void createSecondSnapshotAtTarget() throws Exception {
    dfs.createSnapshot(target, "s2");
  }

  private void createMiddleSnapshotAtTarget() throws Exception {
    dfs.createSnapshot(target, "s1.5");
  }

  /**
   * create some files and directories under the given directory.
   * the final subtree looks like this:
   *                     dir/
   *              foo/          bar/
   *           d1/    f1     d2/    f2
   *         f3            f4
   */
  private void initData(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path d1 = new Path(foo, "d1");
    final Path f1 = new Path(foo, "f1");
    final Path d2 = new Path(bar, "d2");
    final Path f2 = new Path(bar, "f2");
    final Path f3 = new Path(d1, "f3");
    final Path f4 = new Path(d2, "f4");

    DFSTestUtil.createFile(dfs, f1, blockSize, dataNum, 0);
    DFSTestUtil.createFile(dfs, f2, blockSize, dataNum, 0);
    DFSTestUtil.createFile(dfs, f3, blockSize, dataNum, 0);
    DFSTestUtil.createFile(dfs, f4, blockSize, dataNum, 0);
  }

  /**
   * make some changes under the given directory (created in the above way).
   * 1. rename dir/foo/d1 to dir/bar/d1
   * 2. delete dir/bar/d1/f3
   * 3. rename dir/foo to /dir/bar/d1/foo
   * 4. delete dir/bar/d1/foo/f1
   * 5. create file dir/bar/d1/foo/f1 whose size is 2*BLOCK_SIZE
   * 6. append one BLOCK to file dir/bar/f2
   * 7. rename dir/bar to dir/foo
   *
   * Thus after all these ops the subtree looks like this:
   *                       dir/
   *                       foo/
   *                 d1/    f2(A)    d2/
   *                foo/             f4
   *                f1(new)
   */
  private int changeData(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path d1 = new Path(foo, "d1");
    final Path f2 = new Path(bar, "f2");

    final Path bar_d1 = new Path(bar, "d1");
    int numDeletedModified = 0;
    dfs.rename(d1, bar_d1);
    numDeletedModified += 1; // modify ./foo
    numDeletedModified += 1; // modify ./bar
    final Path f3 = new Path(bar_d1, "f3");
    dfs.delete(f3, true);
    numDeletedModified += 1; // delete f3
    final Path newfoo = new Path(bar_d1, "foo");
    dfs.rename(foo, newfoo);
    numDeletedModified += 1; // modify ./foo/d1
    final Path f1 = new Path(newfoo, "f1");
    dfs.delete(f1, true);
    numDeletedModified += 1; // delete ./foo/f1
    DFSTestUtil.createFile(dfs, f1, 2 * blockSize, dataNum, 0);
    DFSTestUtil.appendFile(dfs, f2, (int) blockSize);
    numDeletedModified += 1; // modify ./bar/f2
    dfs.rename(bar, new Path(dir, "foo"));
    return numDeletedModified;
  }

  /**
   * Test the basic functionality.
   */
  @Test
  public void testSync() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData(source);
    }
    initData(target);
    enableAndCreateFirstSnapshot();

    final FsShell shell = new FsShell(conf);

    lsrSource("Before source: ", shell, source);
    lsr("Before target: ", shell, target);

    // make changes under target
    int numDeletedModified = changeData(target);

    createSecondSnapshotAtTarget();

    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    final DistCpSync distCpSync = new DistCpSync(distCpContext, conf);

    lsr("Before sync target: ", shell, target);

    // do the sync
    Assert.assertTrue(distCpSync.sync());

    lsr("After sync target: ", shell, target);

    // make sure the source path has been updated to the snapshot path
    final Path spath = new Path(source,
        HdfsConstants.DOT_SNAPSHOT_DIR + Path.SEPARATOR + "s1");
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));

    // build copy listing
    final Path listingPath = new Path("/tmp/META/fileList.seq");
    CopyListing listing = new SimpleCopyListing(conf, new Credentials(),
        distCpSync);
    listing.buildListing(listingPath, distCpContext);

    Map<Text, CopyListingFileStatus> copyListing = getListing(listingPath);
    CopyMapper copyMapper = new CopyMapper();
    StubContext stubContext = new StubContext(conf, null, 0);
    Mapper<Text, CopyListingFileStatus, Text, Text>.Context context =
        stubContext.getContext();
    // Enable append
    context.getConfiguration().setBoolean(
        DistCpOptionSwitch.APPEND.getConfigLabel(), true);
    copyMapper.setup(context);
    for (Map.Entry<Text, CopyListingFileStatus> entry :
      copyListing.entrySet()) {
      copyMapper.map(entry.getKey(), entry.getValue(), context);
    }

    lsrSource("After mapper source: ", shell, source);
    lsr("After mapper target: ", shell, target);

    // verify that we only list modified and created files/directories
    Assert.assertEquals(numDeletedModified, copyListing.size());

    // verify that we only copied new appended data of f2 and the new file f1
    Assert.assertEquals(blockSize * 3, stubContext.getReporter()
        .getCounter(CopyMapper.Counter.BYTESCOPIED).getValue());

    // verify the source and target now has the same structure
    verifyCopy(dfs.getFileStatus(spath), dfs.getFileStatus(target), false);
  }

  private Map<Text, CopyListingFileStatus> getListing(Path listingPath)
      throws Exception {
    SequenceFile.Reader reader = null;
    Map<Text, CopyListingFileStatus> values = new HashMap<>();
    try {
      reader = new SequenceFile.Reader(conf,
          SequenceFile.Reader.file(listingPath));
      Text key = new Text();
      CopyListingFileStatus value = new CopyListingFileStatus();
      while (reader.next(key, value)) {
        values.put(key, value);
        key = new Text();
        value = new CopyListingFileStatus();
      }
    } finally {
      if (reader != null) {
        reader.close();
      }
    }
    return values;
  }

  private void verifyCopy(FileStatus s, FileStatus t, boolean compareName)
      throws Exception {
    Assert.assertEquals(s.isDirectory(), t.isDirectory());
    if (compareName) {
      Assert.assertEquals(s.getPath().getName(), t.getPath().getName());
    }
    if (!s.isDirectory()) {
      // verify the file content is the same
      byte[] sbytes = DFSTestUtil.readFileBuffer(dfs, s.getPath());
      byte[] tbytes = DFSTestUtil.readFileBuffer(dfs, t.getPath());
      Assert.assertArrayEquals(sbytes, tbytes);
    } else {
      FileStatus[] slist = dfs.listStatus(s.getPath());
      FileStatus[] tlist = dfs.listStatus(t.getPath());
      Assert.assertEquals(slist.length, tlist.length);
      for (int i = 0; i < slist.length; i++) {
        verifyCopy(slist[i], tlist[i], true);
      }
    }
  }

  /**
   * Test the case that "current" is snapshotted as "s2".
   * @throws Exception
   */
  @Test
  public void testSyncWithCurrent() throws Exception {
    optionsBuilder.withUseRdiff(".", "s1");
    if (isSrcNotSameAsTgt) {
      initData(source);
    }
    initData(target);
    enableAndCreateFirstSnapshot();

    // make changes under target
    changeData(target);

    // do the sync
    Assert.assertTrue(sync());
    final Path spath = new Path(source,
        HdfsConstants.DOT_SNAPSHOT_DIR + Path.SEPARATOR + "s1");
    // make sure the source path is still unchanged
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));
  }

  private void initData2(Path dir) throws Exception {
    final Path test = new Path(dir, "test");
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path f1 = new Path(test, "f1");
    final Path f2 = new Path(foo, "f2");
    final Path f3 = new Path(bar, "f3");

    DFSTestUtil.createFile(dfs, f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, f2, blockSize, dataNum, 1L);
    DFSTestUtil.createFile(dfs, f3, blockSize, dataNum, 2L);
  }

  private void changeData2(Path dir) throws Exception {
    final Path tmpFoo = new Path(dir, "tmpFoo");
    final Path test = new Path(dir, "test");
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");

    dfs.rename(test, tmpFoo);
    dfs.rename(foo, test);
    dfs.rename(bar, foo);
    dfs.rename(tmpFoo, bar);
  }

  @Test
  public void testSync2() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData2(source);
    }
    initData2(target);
    enableAndCreateFirstSnapshot();

    // make changes under target
    changeData2(target);

    createSecondSnapshotAtTarget();

    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    syncAndVerify();
  }

  private void initData3(Path dir) throws Exception {
    final Path test = new Path(dir, "test");
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path f1 = new Path(test, "file");
    final Path f2 = new Path(foo, "file");
    final Path f3 = new Path(bar, "file");

    DFSTestUtil.createFile(dfs, f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, f2, blockSize * 2, dataNum, 1L);
    DFSTestUtil.createFile(dfs, f3, blockSize * 3, dataNum, 2L);
  }

  private void changeData3(Path dir) throws Exception {
    final Path test = new Path(dir, "test");
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path f1 = new Path(test, "file");
    final Path f2 = new Path(foo, "file");
    final Path f3 = new Path(bar, "file");
    final Path newf1 = new Path(test, "newfile");
    final Path newf2 = new Path(foo, "newfile");
    final Path newf3 = new Path(bar, "newfile");

    dfs.rename(f1, newf1);
    dfs.rename(f2, newf2);
    dfs.rename(f3, newf3);
  }

  /**
   * Test a case where there are multiple source files with the same name.
   */
  @Test
  public void testSync3() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData3(source);
    }
    initData3(target);
    enableAndCreateFirstSnapshot();

    // make changes under target
    changeData3(target);

    createSecondSnapshotAtTarget();

    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    syncAndVerify();
  }

  private void initData4(Path dir) throws Exception {
    final Path d1 = new Path(dir, "d1");
    final Path d2 = new Path(d1, "d2");
    final Path f1 = new Path(d2, "f1");

    DFSTestUtil.createFile(dfs, f1, blockSize, dataNum, 0L);
  }

  private int changeData4(Path dir) throws Exception {
    final Path d1 = new Path(dir, "d1");
    final Path d11 = new Path(dir, "d11");
    final Path d2 = new Path(d1, "d2");
    final Path d21 = new Path(d1, "d21");
    final Path f1 = new Path(d2, "f1");

    int numDeletedAndModified = 0;
    dfs.delete(f1, false);
    numDeletedAndModified += 1;
    dfs.rename(d2, d21);
    numDeletedAndModified += 1;
    dfs.rename(d1, d11);
    numDeletedAndModified += 1;
    return numDeletedAndModified;
  }

  /**
   * Test a case where multiple level dirs are renamed.
   */
  @Test
  public void testSync4() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData4(source);
    }
    initData4(target);
    enableAndCreateFirstSnapshot();

    final FsShell shell = new FsShell(conf);
    lsr("Before change target: ", shell, target);

    // make changes under target
    int numDeletedAndModified = changeData4(target);

    createSecondSnapshotAtTarget();

    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    testAndVerify(numDeletedAndModified);
  }

  private void initData5(Path dir) throws Exception {
    final Path d1 = new Path(dir, "d1");
    final Path d2 = new Path(dir, "d2");
    final Path f1 = new Path(d1, "f1");
    final Path f2 = new Path(d2, "f2");

    DFSTestUtil.createFile(dfs, f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, f2, blockSize, dataNum, 0L);
  }

  private int changeData5(Path dir) throws Exception {
    final Path d1 = new Path(dir, "d1");
    final Path d2 = new Path(dir, "d2");
    final Path f1 = new Path(d1, "f1");
    final Path tmp = new Path(dir, "tmp");

    int numDeletedAndModified = 0;
    dfs.delete(f1, false);
    numDeletedAndModified += 1;
    dfs.rename(d1, tmp);
    numDeletedAndModified += 1;
    dfs.rename(d2, d1);
    numDeletedAndModified += 1;
    final Path f2 = new Path(d1, "f2");
    dfs.delete(f2, false);
    numDeletedAndModified += 1;
    return numDeletedAndModified;
  }

   /**
   * Test a case with different delete and rename sequences.
   */
  @Test
  public void testSync5() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData5(source);
    }
    initData5(target);
    enableAndCreateFirstSnapshot();

    // make changes under target
    int numDeletedAndModified = changeData5(target);

    createSecondSnapshotAtTarget();

    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    testAndVerify(numDeletedAndModified);
  }

  private void testAndVerify(int numDeletedAndModified)
          throws Exception{
    SnapshotDiffReport report = dfs.getSnapshotDiffReport(target, "s2", "s1");
    System.out.println(report);

    final FsShell shell = new FsShell(conf);

    lsrSource("Before sync source: ", shell, source);
    lsr("Before sync target: ", shell, target);

    DistCpSync distCpSync = new DistCpSync(distCpContext, conf);
    // do the sync
    distCpSync.sync();

    lsr("After sync target: ", shell, target);

    // make sure the source path has been updated to the snapshot path
    final Path spath = new Path(source,
            HdfsConstants.DOT_SNAPSHOT_DIR + Path.SEPARATOR + "s1");
    Assert.assertEquals(spath, distCpContext.getSourcePaths().get(0));

    // build copy listing
    final Path listingPath = new Path("/tmp/META/fileList.seq");
    CopyListing listing = new SimpleCopyListing(conf, new Credentials(), distCpSync);
    listing.buildListing(listingPath, distCpContext);

    Map<Text, CopyListingFileStatus> copyListing = getListing(listingPath);
    CopyMapper copyMapper = new CopyMapper();
    StubContext stubContext = new StubContext(conf, null, 0);
    Mapper<Text, CopyListingFileStatus, Text, Text>.Context context =
            stubContext.getContext();
    // Enable append
    context.getConfiguration().setBoolean(
            DistCpOptionSwitch.APPEND.getConfigLabel(), true);
    copyMapper.setup(context);
    for (Map.Entry<Text, CopyListingFileStatus> entry :
            copyListing.entrySet()) {
      copyMapper.map(entry.getKey(), entry.getValue(), context);
    }

    // verify that we only list modified and created files/directories
    Assert.assertEquals(numDeletedAndModified, copyListing.size());

    lsr("After Copy target: ", shell, target);

    // verify the source and target now has the same structure
    verifyCopy(dfs.getFileStatus(spath), dfs.getFileStatus(target), false);
  }

  private void initData6(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path foo_f1 = new Path(foo, "f1");
    final Path bar_f1 = new Path(bar, "f1");

    DFSTestUtil.createFile(dfs, foo_f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, bar_f1, blockSize, dataNum, 0L);
  }

  private int changeData6(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path foo2 = new Path(dir, "foo2");
    final Path foo_f1 = new Path(foo, "f1");

    int numDeletedModified = 0;
    dfs.rename(foo, foo2);
    dfs.rename(bar, foo);
    dfs.rename(foo2, bar);
    DFSTestUtil.appendFile(dfs, foo_f1, (int) blockSize);
    numDeletedModified += 1; // modify ./bar/f1
    return numDeletedModified;
  }

  /**
   * Test a case where there is a cycle in renaming dirs.
   */
  @Test
  public void testSync6() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData6(source);
    }
    initData6(target);
    enableAndCreateFirstSnapshot();
    int numDeletedModified = changeData6(target);

    createSecondSnapshotAtTarget();

    testAndVerify(numDeletedModified);
  }

  private void initData7(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path foo_f1 = new Path(foo, "f1");
    final Path bar_f1 = new Path(bar, "f1");

    DFSTestUtil.createFile(dfs, foo_f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, bar_f1, blockSize, dataNum, 0L);
  }

  private int changeData7(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path foo2 = new Path(dir, "foo2");
    final Path foo_f1 = new Path(foo, "f1");
    final Path foo2_f2 = new Path(foo2, "f2");
    final Path foo_d1 = new Path(foo, "d1");
    final Path foo_d1_f3 = new Path(foo_d1, "f3");

    int numDeletedAndModified = 0;
    dfs.rename(foo, foo2);
    DFSTestUtil.createFile(dfs, foo_f1, blockSize, dataNum, 0L);
    DFSTestUtil.appendFile(dfs, foo_f1, (int) blockSize);
    dfs.rename(foo_f1, foo2_f2);
    /*
     * Difference between snapshot s1 and current directory under directory
       /target:
M       .
+       ./foo
R       ./foo -> ./foo2
M       ./foo
+       ./foo/f2
     */
    numDeletedAndModified += 1; // "M ./foo"
    DFSTestUtil.createFile(dfs, foo_d1_f3, blockSize, dataNum, 0L);
    return numDeletedAndModified;
  }

  /**
   * Test a case where rename a dir, then create a new dir with the same name
   * and sub dir.
   */
  @Test
  public void testSync7() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData7(source);
    }
    initData7(target);
    enableAndCreateFirstSnapshot();
    int numDeletedAndModified = changeData7(target);

    createSecondSnapshotAtTarget();

    testAndVerify(numDeletedAndModified);
  }

  private void initData8(Path dir) throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path bar = new Path(dir, "bar");
    final Path d1 = new Path(dir, "d1");
    final Path foo_f1 = new Path(foo, "f1");
    final Path bar_f1 = new Path(bar, "f1");
    final Path d1_f1 = new Path(d1, "f1");

    DFSTestUtil.createFile(dfs, foo_f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, bar_f1, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, d1_f1, blockSize, dataNum, 0L);
  }

  private int changeData8(Path dir, boolean createMiddleSnapshot)
      throws Exception {
    final Path foo = new Path(dir, "foo");
    final Path createdDir = new Path(dir, "c");
    final Path d1 = new Path(dir, "d1");
    final Path d1_f1 = new Path(d1, "f1");
    final Path createdDir_f1 = new Path(createdDir, "f1");
    final Path foo_f3 = new Path(foo, "f3");
    final Path new_foo = new Path(createdDir, "foo");
    final Path foo_f4 = new Path(foo, "f4");
    final Path foo_d1 = new Path(foo, "d1");
    final Path bar = new Path(dir, "bar");
    final Path bar1 = new Path(dir, "bar1");

    int numDeletedAndModified = 0;
    DFSTestUtil.createFile(dfs, foo_f3, blockSize, dataNum, 0L);
    DFSTestUtil.createFile(dfs, createdDir_f1, blockSize, dataNum, 0L);
    dfs.rename(createdDir_f1, foo_f4);
    dfs.rename(d1_f1, createdDir_f1); // rename ./d1/f1 -> ./c/f1
    numDeletedAndModified += 1; // modify ./c/foo/d1

    if (createMiddleSnapshot) {
      this.createMiddleSnapshotAtTarget();
    }

    dfs.rename(d1, foo_d1);
    numDeletedAndModified += 1; // modify ./c/foo
    dfs.rename(foo, new_foo);
    dfs.rename(bar, bar1);
    return numDeletedAndModified;
  }

  /**
   * Test a case where create a dir, then mv a existed dir into it.
   */
  @Test
  public void testSync8() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData8(source);
    }
    initData8(target);
    enableAndCreateFirstSnapshot();
    int numDeletedModified = changeData8(target, false);

    createSecondSnapshotAtTarget();

    testAndVerify(numDeletedModified);
  }

  /**
   * Test a case where create a dir, then mv a existed dir into it.
   * The difference between this one and testSync8 is, this one
   * also creates a snapshot s1.5 in between s1 and s2.
   */
  @Test
  public void testSync9() throws Exception {
    if (isSrcNotSameAsTgt) {
      initData8(source);
    }
    initData8(target);
    enableAndCreateFirstSnapshot();
    int numDeletedModified = changeData8(target, true);

    createSecondSnapshotAtTarget();

    testAndVerify(numDeletedModified);
  }
}


WoodenBoat School is approximately 250 miles from Boston by car, and 150 miles down east by boat. Airline service is available to Bangor, and WoodenBoat can provide transportation from there for an additional fee. Please notify us two weeks in advance if you need to be picked up at the airport. Details of this will be sent to you with your course confirmation.
Your course begins with dinner at 6:00 p.m. on Sunday, followed by a general meeting and an introductory session with your instructor. The Sunday dinner is for all students, whether or not they are taking board with the School. You may arrive at the School anytime you wish after noon on Sunday. You will find room assignments and other information posted in the entryway of the Student House. The School Director will be at the Student House at 5:00 p.m. to meet you. Most classes end on Friday afternoon. Students are asked to depart on Saturday morning. If your course ends on Saturday, you have your room/campsite for Saturday night.


text:
Travel Tips Mallorca
Porto Cristo - Port de Manacor
The pretty Spanish fishing village of Porto Cristo, also known as Es Port or Port de Manacor, is located in a district of Manacor, in the eastern part of the Balearic island of Mallorca. It is a quiet holiday resort and particularly suitable for holidaymakers looking for a relaxed and traditional holiday destination.
The city is not exclusively dependent on tourism as an industry and therefore you can enjoy a typical Spanish environment, there are no noisy bars here, but you can stop in traditional bodegas and enjoy good old Spanish cuisine and seafood.
History Port de Manacor
The name of the village is the Spanish name of "The Port of Christ". Behind the name are a few myths and legends; it is said that in 1260 AD during the Christian invasion of Mallorca a small fishing boat with a crucifix was washed ashore. Another legend says that an ox carrying a statue of God trotted through the city. When he arrived in the centre, he stopped and refused to walk. The locals saw it as a sign that it was a place where Christ wanted to be and the name "Port of Christ" was born.
Porto Cristo is not a typical tourist destination, but rather a traditional fishing village. In the natural harbour, one of the largest on the east coast, fishing boats are bobbing along. On the other hand, the new marina "Porto Cristo Nautica" offers shelter and home to sport boats and luxury yachts.
The city is charming, cozy and quiet. An extended walk through the town will take you to some charming bars and traditional restaurants. Along the coastline there are some particularly beautiful restaurants with magnificent views of the Mediterranean. Stop here and let your soul dangle.
Don't expect an exciting nightlife in Es Port, the evenings are quiet and relaxed. You'd rather enjoy a cool beer or a fine wine in the evening sun. For a more lively evening you can go to Cala Manacor, which is only a short taxi ride away. There are a few supermarkets and all the basic facilities you need for your holiday. The neighbouring town of Manacor is also home to Mallorca's famous pearl industry.
There is a wonderful and clean beach in this coastal town, with crystal clear water, which is so typical of the Mediterranean Sea of the Balearic Islands. Everywhere along the coast there are these typical "calas", secluded bays, white sandy beaches and azure waters.
The resort enjoys typical Mediterranean weather with mild winters and hot summers. In July and August the weather is hot and sunny with around 11 hours of sunshine a day. In winter the weather can be cool, but on most days you can enjoy a mild and Mediterranean climate.
The nearby Manacor is rich in cultural sights and the centre of the pearl industry. One of the biggest tourist attractions in Mallorca are the caves of Drac and Hams, near Cala Manacor. Sometimes the small coastal town is full of visitors who only come here because of the impressive caves.
The name of the village is the Spanish name of "The Port of Christ". Behind the name are a few myths and legends; it is said that in 1260 AD during the Christian invasion of Mallorca a small fishing boat with a crucifix was washed ashore. Another legend says that an ox carrying a statue of God trotted through the city. When he arrived in the centre, he stopped and refused to walk. The locals saw it as a sign that it was a place where Christ wanted to be and the name "Port of Christ" was born.Porto Cristo is not a typical tourist destination, but rather a traditional fishing village. In the natural harbour, one of the largest on the east coast, fishing boats are bobbing along. On the other hand, the new marina "Porto Cristo Nautica" offers shelter and home to sport boats and luxury yachts.

redpajama_set_name: RedPajamaCommonCrawl


The Digital Photography Book Digital Photography Book volume #1, #2 and #3 covers all important aspects of photography that pros facing every day. You …... The best digital photography books for portrait work that I've found are packed with photos. While a lot of the landscape photography concepts can be grasped without a photo to illustrate, understanding portrait work really requies good photo examples.
The best digital photography books for portrait work that I've found are packed with photos. While a lot of the landscape photography concepts can be grasped without a photo to illustrate, understanding portrait work really requies good photo examples.... If searched for a book by Lark Books PCPhoto Best Tips & Techniques for Digital Photography (A Lark Photography Book) in pdf format, in that case you come on to the loyal site.
The best digital photography books for portrait work that I've found are packed with photos. While a lot of the landscape photography concepts can be grasped without a photo to illustrate, understanding portrait work really requies good photo examples.


ABS Enclosure — Miami Electric Boards All items here were once used for prototyping/testing purposes or it's old inventory. Great place to get cheap working electric skateboard parts. All parts here are on a clearance or discount price. All sales final.
These enclosures are made out of ABS. There may be light markings, or holes drilled into the flange of the enclosure.


Let me know via email by filling in the form below, alternatively, open up the chat window and I'll be able to respond to you far quicker (I receive a thousand emails a day, no joke. The data says so).
How would you like me to get back to you?


The website was designed to provide information concerning the CEDREO TECH software. The entire content of the website, including but not limited to the trademarks, copywriting, logos, icons, infographics and videos, is CEDREO TECH SARL property and is protected under the international law of intellectual property. The other trademarks cited in this web site are trademarks of their respective owners. They are subject to the protection of intellectual property rights.
Access to and use of this web site is subject to the terms and general conditions along with all applicable laws. By proceeding to access and browsing this web site the user accepts without restriction or reservation those general conditions which void and supersede all prior agreements with CEDREO TECH.


text:
George Person[1, 2]
Personal Information | Notes | Sources | Event Map | All | PDF
Name George Person [3, 4, 5, 6, 7, 8]
Born 08 Mar 1888 Weldon, North Carolina [3, 4, 5, 6, 7, 8, 9]
Residence Halifax, North Carolina, USA [7]
Residence Philadelphia, Pennsylvania [4]
Residence 1900 Weldon, Halifax, North Carolina [3]
Residence 1930 Pittsburgh, Allegheny, Pennsylvania [5]
Residence 1930 Philadelphia, PA [10]
George lived in one of these houses off this street.
Died 10 Aug 1961 Pennsylvania [6]
Father Thomas Jefferson Person, b. 04 Jul 1852, Northampton, North Carolina , d. 27 Aug 1918, Halifax, North Carolina (Age 66 years)
Mother Martha Jones, b. 1862, Gaston, North Carolina , d. 15 Jul 1935, Weldon, North Carolina (Age 73 years)
Married 28 Dec 1881 Northampton, North Carolina [11, 12, 13, 14]
Family Elizabeth Person, b. Abt 1890, Pennsylvania
Born - 08 Mar 1888 - Weldon, North Carolina
Residence - - Philadelphia, Pennsylvania
Residence - George lived in one of these houses off this street. - 1930 - Philadelphia, PA
Died - 10 Aug 1961 - Pennsylvania
George Person was last seen on a World War II Draft Registration Card. It listed George as living in Philadelphia, Pennsylvania.
[S-2134050186] U.S. World War II Draft Registration Cards, 1942 , National Archives and Records Administration, (Ancestry.com), Roll: WW2_2139502.
George Person Birth Date: 8 Mar 1888 Residence: Philadelphia, Pennsylvania Birth: Weldon, North Carolina Roll: WW2_2139502
[S-2144004508] Ancestry Family Trees, (Online publication - Provo, UT, USA: Ancestry.com. Original data: Family Tree files submitted by Ancestry members.), Ancestry Family Trees.
http://trees.ancestry.com/pt/AMTCitationRedir.aspx?tid=8662431πd=713
[S-2137538330] 1900 United States Federal Census, Ancestry.com, (Online publication - Provo, UT, USA: The Generations Network, Inc., 2004.Original data - United States of America, Bureau of the Census. Twelfth Census of the United States, 1900. Washington, D.C.: National Archives and Records Administration, 1900. T623, ), Year: 1900; Census Place: Weldon, Halifax, North Carolina; Roll: T623_1199; Page: 9A; Enumeration District: 40.
Birth date: Mar 1888 Birth place: North Carolina Residence date: 1900 Residence place: Weldon, Halifax, North Carolina
[S-2146875265] U.S. World War II Draft Registration Cards, 1942, Ancestry.com, (Online publication - Provo, UT, USA: Ancestry.com Operations Inc, 2007.Original data - United States, Selective Service System. Selective Service Registration Cards, World War II: Fourth Registration. National Archives and Records Administration Branch loc), Roll: WW2_2139502; Local board: Philadelphia , Pennsylvania.
Birth date: 8 Mar 1888 Birth place: North Carolina Residence date: Residence place: Philadelphia, Pennsylvania
[S-2138647634] 1930 United States Federal Census, Ancestry.com, (Online publication - Provo, UT, USA: The Generations Network, Inc., 2002.Original data - United States of America, Bureau of the Census. Fifteenth Census of the United States, 1930. Washington, D.C.: National Archives and Records Administration, 1930. T626), Year: 1930; Census Place: Pittsburgh, Allegheny, Pennsylvania; Roll: ; Page: ; Enumeration District: ; Image: .
Birth date: abt 1890 Birth place: North Carolina Residence date: 1930 Residence place: Pittsburgh, Allegheny, Pennsylvania
[S-1034770426] Pennsylvania, Death Certificates, 1906-1963, Ancestry.com, (Ancestry.com Operations, Inc.).
[S-1694533890] U.S., World War I Draft Registration Cards, 1917-1918, Ancestry.com, (Ancestry.com Operations Inc), Registration State: North Carolina; Registration County: Halifax; Roll: 1765649.
[S-1034693255] U.S., Social Security Applications and Claims Index, 1936-2007, Ancestry.com, (Ancestry.com Operations, Inc.).
[S-2134050186] U.S. World War II Draft Registration Cards, 1942 , National Archives and Records Administration, (Ancestry.com).
1906 Manton St. Philadelphia PA 19146 USA
[S-2134050188] North Carolina Marriage Collection 1741-2004, FamilySearch.org, unk.
North Carolina Marriages, 1759-1979 « Back to search resultsImage is not available online. Search collection groom's name: Tom Person groom's birth date: 1853 groom's birthplace: groom's age: 28 bride's name: Martha Jones bride's birth date: 1862 bride's birthplace: bride's age: 19 marriage date: 28 Dec 1881 marriage place: Gaysburg, Northampton, North Carolina groom's father's name: Sterling Person groom's mother's name: Olive Person bride's father's name: Tom Jones bride's mother's name: Sophia Jones groom's race: Black groom's marital status: groom's previous wife's name: bride's race: Black bride's marital status: bride's previous husband's name: indexing project (batch) number: M75217-5 system origin: North Carolina-EASy source film number: 275843 reference number:
URL: https://www.familysearch.org/s/recordDetails/show?uri=http://pilot.familysearch.org/records/trk:/fsrs/rr_342246347/p5&hash=HloWXpZgU9zB10k5M56iYku8TUc%253
[S-2146874908] North Carolina Marriage Collection, 1741-2004, Ancestry.com, (Online publication - Provo, UT, USA: Ancestry.com Operations Inc, 2007.Original data - Dodd, Jordan, Liahona Research, comp. (P.O. Box 740, Orem, Utah 84059) from county marriage records on microfilm located at the Family History Library in Salt Lake City,), Data Source: North Carolina State Archives.
Birth date: abt 1862 Birth place: Marriage date: 28 Dec 1881 Marriage place: Northampton, North Carolina
[S-1034770686] North Carolina, Marriage Records, 1741-2011, Ancestry.com, (Ancestry.com Operations, Inc.).


text:
seamus dubhghaill
Promoting Irish Culture and History from Little Rock, Arkansas, USA
Tag Archives: Harold MacMillan
by Jim Doyle	Leave a comment
State Visit of U.S. President John F. Kennedy
John F. Kennedy, an Irish American and the first Catholic to become president of the United States, arrives in Ireland on a state visit on June 26, 1963. After Air Force One touches down at Dublin airport, Kennedy's motorcade weaves through the streets of Dublin city, the thrilled crowd, lacking ticker tape, improvises by throwing rolls of bus tickets.
Kennedy is proud of his Irish roots and makes a special visit to his ancestral home in Dunganstown, County Wexford, while in the country. There, he is greeted by a crowd waving both American and Irish flags and is serenaded by a boys choir that sings The Boys of Wexford. Kennedy breaks away from his bodyguards and joins the choir for the second chorus, prompting misty-eyed reactions from both observers and the press.
Kennedy meets with 15 members of his extended Irish family at the Kennedy homestead in Dunganstown. There he enjoys a cup of tea and some cake and makes a toast to "all those Kennedys who went and all those Kennedys who stayed." His great-grandfather, Thomas Fitzgerald, had left Ireland for the United States in the middle of the Great Famine of 1848 and settled in Boston, becoming a cooper. Generations of his descendants go on to make their mark on American politics.
At the time of JFK's visit to Ireland, the predominantly Catholic Irish Republic has been an independent nation for 41 years. The northern counties of the island, however, remain part of the largely Protestant British Empire and still suffer from long-standing sectarian violence. On the day after his arrival in Dublin, Kennedy speaks before the Irish parliament, where he openly condemns Britain's history of persecuting Irish Catholics. Two days later, he travels to England, America's oldest ally, to meet with British Prime Minister Harold MacMillan and his cabinet to discuss setting up a pro-democratic regime in British Guiana.
Kennedy later tells his aides that his favourite part of the trip was the wreath laying and silent funeral drill done by the Irish Army cadets at Arbour Hill military cemetery in Dublin.
Five months later, his widow, Jacqueline Kennedy, makes a special request to the Irish government. She asks that those same Irish army cadets, who so impressed the President on his visit, perform the drill again at his state funeral. Within days, those awe-stuck, trembling young men stand just inches away from foreign dignitaries from over 90 countries and perform their silent funeral drill in memory of a president that had inspired their country just a few short months earlier.
Categories: Irish American, Irish History, Politics & Government | Tags: Air Force One, American Flag, Arbour Hill, Boston, British Empire, British Guiana, British Prime Minister, Catholic, Cooper, County Wexford, Dublin, England, Great Famine, Harold MacMillan, Irish American, Irish Army, Irish Catholic, Irish Flag, Irish Republic, Jacqueline Kennedy, John F. Kennedy, Northern Ireland, Oireachtas, Protestant, Sectarian Violence, State Visit, The Boys of Wexford | Permalink.
Early Christian Ireland (400-1000)
Early Medieval Ireland (800-1166)
Early Modern Ireland (1536-1691)
Film, Radio, & Television
Irish American
Irish Free State
Irish Peace Process
Late Medieval Ireland (1169-1536)
Shipping & Shipbuilding
The Great Hunger
Wars & Rebellions
1916 Easter Rising Abbey Theatre American Civil War Anglo-Irish Anglo-Irish Treaty Australia Belfast British Army Canada Charles Stewart Parnell Church of Ireland Cork County Antrim County Cork County Donegal County Down County Dublin County Galway County Kerry County Limerick County Mayo County Tipperary Dublin Dublin Castle Dáil Éireann England Europe Fianna Fáil France Galway Germany Glasnevin Cemetery Great Britain Irish American Irish Civil War Irish Free State Irish Language Irish Nationalism Irish Rebellion of 1798 Irish Republican Army Irish Republican Brotherhood Irish Republicanism Irish Volunteers Irish War of Independence Limerick London Member of Parliament Michael Collins New York New York City Northern Ireland Paris Patrick Pearse Playwright Poet President of Ireland Protestantism Provisional Irish Republican Army Republic of Ireland Roman Catholic Rome Royal Irish Constabulary Scotland Sinn Féin Taoiseach Teachta Dála The Troubles Trinity College Dublin Ulster United Kingdom United States University College Dublin World War I World War II Éamon De Valera


text:
#ifndef MULTI_FRAME_H_
#define MULTI_FRAME_H_

#include <vector>

#include <CL/cl.h>
#include "CLKernel.h"
#include "FilterFrame.h"

enum result;
class MultiFrameRequest;

class MultiFrame : public FilterFrame
{
public:
    MultiFrame();

    ~MultiFrame() {}

    // Init
    // One-time configuration of this object to handle all multi-frame
    // processing for the duration of the clip
    result Init(
        const   int     &device_id,         // device used for filtering
        const   int     &temporal_radius,   // frame count both before and after frame being filtered
        const   int     &width,             // width of frame in pixels
        const   int     &height,            // height of frame in pixels
        const   int     &src_pitch,         // length in memory of a row of pixels in source buffer
        const   int     &dst_pitch,         // length in memory of a row of pixels in destination buffer
        const   float   &h,                 // NLM filtering strength
        const   int     &sample_expand,     // factor of radius of 3 to use for sampling
        const   int     &linear,            // TODO delete
        const   int     &correction,        // TODO delete
        const   int     &balanced);         // TODO float for bias: shadows or highlights

    // SupplyFrameNumbers
    // Returns a set of frame numbers, in the MultiFrameRequest
    // object, when Deathray requests which frames should be copied
    // to the device because they are missing
    void SupplyFrameNumbers(
        const   int                 &target_frame_number,   // frame being filtered
                MultiFrameRequest   *required);             // set of frame numbers that are missing from
                                                            // the device and need to be copied to it

    // CopyTo
    // Before processing each of the planes, all frames are
    // copied to the device. Usually most frames will already
    // be on the device. MultiFrameRequest defines the frame
    // numbers and host pointers of planes that have yet to
    // be copied to the device.
    //
    // Also zeroes the intermediate buffers.
    //
    // Called once per filtered frame
    result CopyTo(
                MultiFrameRequest   *retrieved);    // set of frame numbers to be copied to device

    // Execute
    // Runs all iterations of the temporal filter
    virtual result Execute();

private:

    // InitBuffers
    // Create the intermediate averages, weights and maximum
    // weights buffers and create the destination buffer
    result InitBuffers(
        const   int         &sample_expand);        // factor of radius of 3 to use for sampling

    // InitKernels
    // Configure global arguments for the filter and sort kernels,
    // arguments that won't change over the duration of clip processing
    result InitKernels(
        const   int         &sample_expand,         // factor of radius of 3 to use for sampling
        const   int         &linear,                // TODO delete
        const   int         &correction,            // TODO delete
        const   int         &balanced);             // TODO float for bias: shadows or highlights

    // InitFilterKernel
    // Configure global arguments for the filter and sort kernels,
    // arguments that won't change over the duration of clip processing
    result InitFilterKernel(
        const   int         &sample_expand,         // factor of radius of 3 to use for sampling
        const   int         &linear,                // TODO delete
        const   int         &correction,            // TODO delete
        const   int         &balanced);             // TODO float for bias: shadows or highlights

    // InitSortKernel
    // Configure the sort kernel which takes identifies the best samples
    // in the alpha set and uses them to produce the final filtered pixel
    result InitSortKernel(
        const   int         &linear);               // TODO delete

    // InitFrames
    // Create the Frame objects, one per step of the temporal filter
    result InitFrames();

    // ExecuteFrame
    // Process a single frame in the circular buffer of frames
    result ExecuteFrame(
        const   int         &frame_id,              // frame being filtered
        const   bool        &sample_equals_target); // frame containing sample pixels is also target of filtering

    // Frame
    // An object for each of the 2 * temporal_radius + 1 frames, all of which are processed separately.
    //
    // This allows a frame to stay in device memory without being repeatedly copied from host.
    //
    // The usage of multiple Frame objects mimics a circular buffer. As frame number, n, progresses over
    // the lifetime of filtering a clip, each of the static set  of frame objects will take it in turns
    // being the "target". e.g. for a cycle of 7 frames each object will do target processing once.
    // Over this cycle of 7 frames, each Frame object only needs to perform a single copy of host
    // data to the device
    class Frame {
    public:
        Frame();
        ~Frame() {}

        // Init
        // Tell the frame object to initialise its buffer
        result Init(
            const   int                 &device_id,     // device where buffer reside
                    cl_command_queue    *cq,            // command queue to use for the kernel
            const   ClKernel            &NLM_kernel,    // kernel object to load
            const   int                 &width,         // width in pixels of the frame
            const   int                 &height,        // height in pixels of the frame
            const   int                 &pitch);        // length of a row of pixels in memory

        // IsCopyRequired
        // Queries the Frame to discover if it needs data from the host
        // to be copied to the device, for the frame specified
        bool IsCopyRequired(
            int     &frame_number);                     // frame that may or may not be on device

        // CopyTo
        // All frame objects are given the chance to copy host data to the device, if needed.
        //
        // This handles the once-per-cycle copying of host data to the device
        result CopyTo(
                    int             &frame_number,      // frame number to copy, if required
            const   unsigned char   *const source);     // host buffer containing original pixels

        // Plane
        // Allows the parent to query the frame known to be handling the target
        // for the plane buffer it's using, so that all the other frames can use the same plane.
        //
        // Also returns the object's event for the copy of data to the buffer
        // so that other Frame objects can use the event as an antecedent
        void Plane(
            int         *plane,                         // returned buffer id for the frame
            cl_event    *target_copied);                // copy event

        // Execute
        // Performs the NLM pass.
        //
        // During each cycle the client instructs a single frame object that it is
        // handling the target frame. The id of the frame object handling the target frame
        // progresses circularly around the "ring" of Frame objects, as the clip is processed
        result Execute(
            const   bool        &is_sample_equal_to_target);    // specify whether frame is that being filtered

    private:

        int device_id_          ;   // device executing the kernels
        cl_command_queue cq_    ;   // command queue shared by all Frame objects and client object
        ClKernel filter_        ;   // each frame sets arguments for a kernel shared by all
        int frame_number_       ;   // frame being processed
        int plane_              ;   // buffer for the frame being processed
        int width_              ;   // width of plane's content
        int height_             ;   // height of plane's content
        int pitch_              ;   // host plane format allows each row to be potentially longer than width_
        cl_event copied_        ;   // tracks completion of the copy from host to device of the Frame's sample plane
        cl_event wait_list_[2]  ;   // used during execution to track completion of copying of target and sample planes
        int frame_used_         ;   // tracks count of times plane data has been copied to device - enables kludge
    };

    int temporal_radius_        ;   // count of frames either side of target frame that will be included in multi-frame filtering
    vector<Frame> frames_       ;   // set of frame planes including target
    int target_frame_number_    ;   // frame to be filtered
    int alpha_so_far_           ;   // position in alpha buffer where weight/pixel pairs will be written next
    ClKernel filter_            ;   // kernel that performs NLM computations, once per sample plane
    ClKernel sort_              ;   // single invocation of this kernel to sort all samples from all frames
    cl_event copied_            ;   // used to track the final copy to the device - at least one frame is copied to the device
    cl_event executed_          ;   // sort kernel is executed synchronously, but event is used for asynchronous copy back to host

    // Kernel needs to know whether the plane it is sampling from is the target plane
    static const int k_sample_equals_target = 1;
    static const int k_sample_is_not_target = 0;
};

#endif // MULTI_FRAME_H_

redpajama_set_name: RedPajamaGithub


☞ Oh, no! Could this cast doubt on other Weekly World News scoops? You mean the Bush administration might not have planned to house the homeless in clown cars?
Turns out Packer spelled his first name 'Alferd' (thanks, all) and, in an inspired sophomoric moment, the students at the University of Colorado named their grill after him.
Ron Sheldon: 'I've been playing this 0% interest game for over two years now, but without the balance transfer transaction fee (or, at worst, a $75 maximum fee). It started in late 2003, when I ordered on Amazon my daughter-in-law's birthday present and saw that I would get a $35 credit/rebate if I applied for an Amazon card, which I did. About two weeks after receiving the card I got a call from the fine folks that issued the card, Chase or one of those, telling me that I could take a cash advance or make a balance transfer, $50 maximum transaction fee, and pay 0% interest for 9 or 12 months (can't remember which). 'Sure, give me $14,000,' the credit limit for this card that I had applied for only to get the $35 credit/rebate. Never used the card again, but the interest-free money helped with a year's cash flow – income taxes due, annual contributions to six grandchildren's Coverdell Education Savings accounts, etc.
'Come mid-2004, I started receiving mail offers from other card issuers for 0% interest for 12 months on balance transfers with no transaction fee on the transfers. Why not? I transferred the remaining balance from the Amazon card to extend 0% interest for 12 more months.
'Come late-2004 my son and daughter-in-law asked if I could loan them $25,000 to help with adoption expenses and what interest rate I would charge them. I loaned them the money at 0% for first 12 months and 5% on remaining balance thereafter until loan was paid off.
'About this time I received CapitalOne offer for 0% interest for 12 months, $30,000 credit limit, no transaction fees on transfers – but would have to use the card for purchases at least once a month during the first five months of the account. This became a little more complicated since I didn't have anything close to $30,000 outstanding balances to transfer, but did receive some of those special checks they send from unused cards trying to get you to borrow, 1.99% interest with no balance transfer fee if I used the checks. Problem solved. Contacted issuer of the card that sent checks, increased credit limit to $30,000, and used a check to establish a balance to transfer to CapitalOne. As soon as check hit the credit card account, I transferred balance to CapitalOne, paying the issuer about $4 in interest until transfer completed.
'To meet CapitalOne requirement to use their card at least once a month during the first five months, I'd buy/charge a coffee on the card each month after receiving a monthly statement. Thank heaven for 7-Eleven for taking credit cards for a $1.29 coffee and CapitalOne minimum $0.50 monthly interest on these major purchases.
'Son and daughter-in-law made monthly payments to me at amount exceeding CapitalOne monthly payment minimum and repaid the $25,000 loan in a lump sum after 10 months.
'So, then came along Bank of NY about mid-2005 with 0% on balance transfers for 12 months with no transaction fee or monthly purchase requirement. Not knowing at that time that my son would pay off the loan as soon as he did, I transferred about $22,000 of the CapitalOnebalance to Bank of NY card so I could offer to extend my 0% rate to son until this June.
☞ In America, the streets are truly paved with gold.
But are we losing our way?
If you have broadband, click here (and watch Boston Legal on Tuesday nights on ABC at 10pm). If you dial up, the audio might be more practical – but, really, I think you just have to take the time to load the video.
You may not agree with it all, but it's a point of view we all owe it to ourselves to consider.


text:
Q: generating matrix with pandas I want to generate a matrix using pandas for the data df with the following logic:
Group by id
Low: Mid Top: End
For day 1: Count if (If level has Mid and End and if day == 1)
For day 2: Count if (If level has Mid and End and if day == 2)
….
Begin: Mid to New
For day 1: Count if (If level has Mid and New and if day == 1)
For day 2: Count if (If level has Mid and New and if day == 2)
….
df = pd.DataFrame({'Id':[111,111,222,333,333,444,555,555,555,666,666],'Level':['End','Mid','End','End','Mid','New','End','New','Mid','New','Mid'],'day' : ['',3,'','',2,3,'',3,4,'',2]})
Id  |Level  |    day
111  |End|
111 |Mid|    3
222 |End|
333 |End|
333 |Mid|    2
444 |New|    3
555 |End|
555 |New|   3
555 |Mid|    4
666 |New|
666 |Mid|    2
The matrix would look like this:
Low Top day1    day2    day3    day4
Mid End 0   1   1   0
Mid New 0   1   0   1
New End 0   0   1   0
New Mid 0   0   0   1
Thank you!  Thank you!

A: Starting from your dataframe
 # all the combination of Levels
level_combos=[c for c in itertools.combinations(df['Level'].unique().tolist(), 2)]
 # create output and fill with zeros
df_output=pd.DataFrame(0,index=level_combos,columns=range(4))

Probably is not very efficient, but it should work
for g in df.groupby(['Id']): # group by ID
    # combination of levels for this ID
    level_combos_this_id=[c for c in itertools.combinations(g[1]['Level'].unique().tolist(), 2)]

   # set to 1 the days present
    df_output.loc[level_combos_this_id,pd.to_numeric(g[1]['day']).dropna(inplace=True).values]=1

Finally rename the columns to get to the desired output
df_output.columns=['day'+str(i+1) for i in range(4)]

redpajama_set_name: RedPajamaStackExchange


See http://nilearn.github.io/manipulating_images/input_output.html Image(s) to resample.
Can be 'continuous' (default), 'linear', or 'nearest'. Indicates the resample method.
If True, guarantees that output array has no memory in common with input array. In all cases, input images are never modified by this function.
Data ordering in output array. This function is slightly faster with Fortran ordering.
If True (default) all resampled image values above max(img) and under min(img) are clipped to min(img) and max(img). Note that 0 is added as an image value for clipping, and it is the padding value when extrapolating out of field of view. If False no clip is preformed.
Use a fill value for points outside of input volume (default 0).
input image, resampled to have respectively target_shape and target_affine as shape and affine.
BoundingBoxError If a 4x4 transformation matrix (target_affine) is given and all of the transformed data points have a negative voxel index along one of the axis, then none of the data will be visible in the transformed image and a BoundingBoxError will be raised.
If a 4x4 transformation matrix (target_affine) is given and no target shape is provided, the resulting image will have voxel coordinate (0, 0, 0) in the affine offset (4th column of target affine) and will extend far enough to contain all the visible data and a margin of one voxel.
3x3 transformation matrices If a 3x3 transformation matrix is given as target_affine, it will be assumed to represent the three coordinate axes of the target space. In this case the affine offset (4th column of a 4x4 transformation matrix) as well as the target_shape will be inferred by resample_img, such that the resulting field of view is the closest possible (with a margin of 1 voxel) bounding box around the transformed data.
In certain cases one may want to obtain a transformed image with the closest bounding box around the data, which at the same time respects a voxel grid defined by a 4x4 affine transformation matrix. In this case, one resamples the image using this function given the target affine and no target shape. One then uses crop_img on the result.
NaNs and infinite values This function handles gracefully NaNs and infinite values in the input data, however they make the execution of the function much slower.
Handling non-native endian in given Nifti images This function automatically changes the byte-ordering information in the image dtype to new byte order. From non-native to native, which implies that if the given image has non-native endianess then the output data in Nifti image will have native dtype. This is only the case when if the given target_affine (transformation matrix) is diagonal and homogenous.


If you're new to search engine optimization (SEO), it can seem complicated with technical details. However, mastering some SEO basics is really quite simple. Here are some of the easiest ways to ensure your small business website is visible to all the search engines.
If you run a brick-and-mortar small business, you want to make sure new customers come to your store. A great way to encourage drop-ins is by making sure your physical location is front and center. That means adding it to several places on your website, as well as registering it online.
Start by adding your address to the footer of your website so that no matter which page a customer lands on it's easy to find you. Also include it on your Contact page. Make sure that you use text blocks, rather than an image. Search engines crawlers can't read the information within images.
Start by adding your business listing to Google My Business. It's a free service, and it will ensure that your business shows up across the internet, including Google Maps and Search. Besides Google there are hundreds of other online directories, and it's worth doing your due diligence to get listed on all the big ones, like Google, Yahoo, Bing, Yelp, YellowPages and TripAdvisor. Once you've covered those, it's also worth considering using paid services, which push out your information to hundreds of additional online directories at once. When you've got a new website, this is another good way to boost your backlinks.
Keywords are the words and phrases that people are searching to find businesses like yours. Choosing good keywords for every page on your website is a fundamental part of SEO. Without them, you'll practically be invisible to search engines. You'll use keywords across your website—in your titles, headings, image 'alt text', meta descriptions, and text—to help tell the search engines what your website is about.
To get started finding the best keywords for your business, brainstorm a list of the top words and phrases that you and your customers use to describe your products and services. You should also check out your competitors' websites to see which words and phrases they use. Keep in mind that factors such as location and niche markets can play a big part in determining the best phrases to use. For example, let's say you run a hardware store. Ideally, you'd choose between regional terms like faucet, spigot, pail and bucket to describe your merchandise.
There are a host of online tools for helping you select the best words for your business. Google Keyword Planner and Wordtracker can help you with finding ideas for the keywords. Moz will show you the keywords that rank well for your competition.
When you do a Google search and get a list of search results, title tags are the main headline links; meta descriptions are the short paragraph of descriptive text appearing underneath them. Together, they inform users and search engines about the content of every page on your website. They have a direct bearing on your ranking because the more descriptive, attractive, and relevant they are, the more users will click-through. A good click-through rate improves your ranking.
The trick for writing them is to use good keywords with a relevant and quality description. Don't "keyword stuff" (i.e., list multiple keywords one after the other in a non-complete and nonsensical descriptions). Google will penalize you. Make sure to keep the most important keywords first and the least important last. And you'll also need to ensure they're easy to read and descriptive.
Title tags should be 50-60 characters long, including spaces. Meta descriptions can—and should—be longer. Aim for 145-160 characters, including spaces (anything more will likely be truncated by the search engines).
Do not duplicate title tags: They must be written differently for every page. Duplicate tags negatively affect your search visibility.
Make it relevant: Title tags and meta descriptions must accurately describe the content on the page. If they don't, your users may click your link and then immediately bounce off your website. You don't want a high bounce rate.
Make your headline (<h1> tag) different from the title tag: This is another opportunity to vary the keyword phrasing of your page and increase its chances of appearing for different search intent.
Although search engines are sophisticated, they can't actually "see" images. And this means you have to tell them. Alt text is the description of an image, which you can see when you hover over it. Search engines use it to identify what an image is displaying so they can include it in search results, such as Google Images. Alt text influences your ranking because they're another great place to add relevant keywords that tell search engines what your website is about.
Ideally, you want to make sure that the alt text of the images on every page matches the content of that page. That way, if a user finds your website via an image search function they'll also find relevant content. In order to write good alt text, keep it short (under 125 characters), use keywords (but avoid keyword stuffing), and describe the image as specifically as possible. For example, if your image is of a butterfly on a wildflower in the forest, write all that out. Avoid just using "wildflower." For this example, good alt text would be: <img src="wildflower.jpg" alt="Butterfly on a wildflower in the forest">.
Along with titles and meta descriptions, search engines typically give a higher priority to headings when deciding what your pages are about. Make sure to use headings across your website. It's not enough to simply bold your headings, though. Search engines won't identify them as headings unless you make sure they're called out with <h1> or h2> tags in the page's HTML. There's no need to add these tags manually. Simply use the text format drop-down menu when you're creating content. A good rule of thumb is to use a new heading for every 150 words, or about three paragraphs.
Search engines want to know that your website is active and that it will provide current and relevant information for visitors. The best way to communicate this is by showing them—by adding new content to your website regularly. This explains the popularity of blogs, which provide a way to keep content new and fresh.
Plus, a big bonus for adding more content to your site regularly is that it offers the opportunity to add more keywords, titles, meta descriptions, and headings. The more content, the better your chances of improving your SEO rankings.
Blogging and fresh content offer another benefit: their appeal to social media. If you're serious about online marketing, you probably already have a social media presence for your brand. You can easily share all your newest content on Facebook, Twitter, LinkedIn and everywhere else to help build links back to your website.
Make sure to feature social share icons so that visitors can easily share your content with others. While social sharing doesn't directly contribute to your SEO rankings, they can make your content more visible and increase the likelihood that someone will create a backlink.
Get an overview of the different social platforms and what you need to know about each here.
If you're competing with websites that have put in 10 times the effort into the practices above, they'll rank 10 times better. Plus, don't get discouraged when your rankings don't improve overnight. It takes time. Once you optimize your website, you'll need to gain trust from search engines. Just stick with it and in time all your good work will pay off.
For more information on driving traffic to your website, check out these four simple tips to get potential clients clicking through to your site today.


text:
Decisions for issue Regulatory Enforcement Policy and Service Standards as Required by the Regulators' Code
Issue - decisions
Regulatory Enforcement Policy and Service Standards as Required by the Regulators' Code
15/01/2019 - Regulatory Enforcement Policy and Service Standards as Required by the Regulators' Code
RESOLVED that:
(i) Cabinet agreed the contents of the Enforcement Policy as outlined in Appendix 1 to the report;
(ii) Cabinet agreed the contents of the Service Standards as outlined in Appendix 2 to the report; and
(iii) Cabinet agreed the delegation of authority to the Strategic Director of Regeneration and Environment after consultation with the relevant Cabinet member, to update the Enforcement Policy and the Service Standards as required in accordance with the Regulators Code.


text:
Seattle tech scene takes center stage as Microsoft and Amazon become most-valuable companies
by Nat Levy on December 6, 2018 at 3:07 pm December 7, 2018 at 5:58 am
Amazon CEO Jeff Bezos and Microsoft CEO Satya Nadella. (Space Foundation and Microsoft Photos)
Silicon Valley is thought of as the technology capital of the U.S., but it is the Seattle area that now boasts the two most-valuable companies.
Microsoft and Amazon closed Thursday with market capitalizations of $838.1 billion and $830.8 billion, per CNBC. In third place is Apple at $829.1 billion, which saw its stock fall 1.1 percent Thursday, while Microsoft and Amazon were on the rise.
Microsoft took the number one spot from Apple last week, and the two companies volleyed the title of most-valuable company back and forth throughout the week. Amazon, which briefly crossed the $1 trillion market cap mark earlier this year, saw its stock rebound recently after a couple of down weeks.
Market cap numbers aren't going to change how these companies do business day-to-day, but the development is a big milestone for the Seattle tech community. Microsoft and Amazon's ascensions have been powered by their cloud computing divisions, helping Seattle earn the title of Cloud City.
Microsoft and Amazon also act as a center of gravity for the region, attracting talent from all over the globe. That has fueled a wave of out-of-town companies setting up shop to get access to the region's strong roster of talent.
As of today's close, @Microsoft and @amazon are #1 and #2 market cap companies in the world. Seattle becoming global leader at intersections of innovation pic.twitter.com/dC8CktTEez
— Matt McIlwain (@mattmcilwain) December 6, 2018
Don't expect the cloud rivals and occasional allies in Microsoft and Amazon to stop what they're doing and pop champagne this afternoon.
"This is a metric that nobody on the senior leadership team is tracking," Microsoft Chief Marketing Officer Chris Capossela said during a talk at Seattle-based Pioneer Square Labs last week. "We really aren't looking at, are we five today, are we four today."
In the 45 seconds he spent addressing the company's market capitalization at the event, Capossela said: "I've already spent way more time talking about this tonight than I've ever spent talking about it at the company."
"Nobody is sitting around high-fiving when the stock hits some new high," Capossela said. "We are like 'wow, the bar just went up dramatically.' So it's a very humble tone; there's not a lot of, 'woo, we're killing it.'"
More cash for Seattle startups: Local TiE network partners with Bay Area firm to create new fund
Study: Global health ecosystem in Washington state is robust and growing, now employs 14,000 people
Filed Under: Amazon • Microsoft Tagged With: Amazon • Apple • market cap • market capitalization • Microsoft
Microsoft is No. 1: Tech giant overtakes Apple for title of most-valuable U.S. company
Microsoft on the cusp of passing Apple to become the most-valuable U.S. company
These tech stocks were the biggest winners and losers in the Seattle area for 2019
Amid signs of a sagging stock market, can Microsoft and Amazon earnings turn the tide?


text:
Reebok is being sold to Authentic Brands Group at $2.5 billion USD
Home FASHION Reebok is being sold to Authentic Brands Group at $2.5 billion USD
Adidas has now begun selling Reebok after confirming the news in December 2020. The sporting goods brand will now be owned by Authentic Brands Group. This company also owns brands such as Juicy Couture and Forever 21. Reebok joined ABG in a $2.5 billion deal. The brand recently collaborated with Cardi B and Maison Margiela, but the sale was made after the brand's revenue declined in 2020.
"It's an honor and a privilege to carry Reebok's legacy forward. This is a significant milestone for ABG. We are committed to protecting Reebok's integrity and innovation as well as its values, including bricks and mortar. We look forward to working closely together with the Reebok staff to continue the brand's success," Jamie Salter, Chairman and CEO of ABG, stated in a statement.
Kasper Rorsted, Adidas CEO, said: "Reebok is a valuable part of Adidas. We are grateful for their contributions to our company. "
The sale of $2.5 billion USD is expected to close by 2022.
Tags: Adidas newsAdidas sells Reebok brandReebok brand ownerReebok news
Previous ArticleHello Kitty x Starface Just Dropped The Most Adorable Pore Strips
Next ArticleNike's Dunk Low Pink Velvet for Girls: Take a closer look
Poshmark launches Brand Closet
Is fashion rental sustainable or is it just greenwashing?
How sneakers have become as collectible as art thanks to sole traders


text:
A stretch of 5th Street South that sweeps travelers from Interstate 94 into Minneapolis will be redesigned into a walkway that connects downtown with the heavily East African West Bank, Mayor R.T. Rybak said Monday in the last announcement of his 12-year tenure.
The city will name the area after Hussein Samatar, a former school board member who was the first Somali-American to win election in Minneapolis in 2010. He died of complications from leukemia over the summer.
Rybak told a crowd in the City Hall rotunda that while the West Bank has been home to immigrants for generations — first from Norway, Sweden and Germany and later from Southeast Asia and Somalia — it has become disconnected from other parts of Minneapolis.
"The West Bank, which is our Ellis Island, became an island separate from the rest of the city," he lamented. "What we will do now is we will be reconnecting that island."
He expressed hope that the boulevard would celebrate how immigrants have grown and built the city.
BRIAN PETERSON • brianp@startribune.com
Outgoing Minneapolis Mayor R.T. Rybak held his final news conference Monday afternoon.
The city budget allocated $500,000 for the project, which is counting on an unspecified amount of private donations to pay for a skateboard park.
While the crossing will cater to pedestrians and bicyclists, city officials have not ruled out allowing cars through.
The project takes advantage of the Minnesota Department of Transportation's upcoming redesign of how travelers will enter downtown from I-94, shifting the exit from 5th Street to 7th Street to relieve congestion.
The department says the new exit will ease the bottleneck by the Hiawatha light-rail line and make bus transit lines more efficient, while also allowing better connections for pedestrians and bikers by repurposing 5th Street.
Samatar's widow, Ubah Jama Samatar, attended the event with her 10-year-old daughter, Habon, and thanked the mayor with gifts of a scarf and a small wooden sculpture of a camel and its baby from Somalia.
Ubah Jama Samatar's cousin Abdi Warsame became the first Somali-American to win election to the City Council last month.
Reflecting on the project, Warsame said having a road named after a Somali citizen was "extraordinary." While the project will benefit the community, he said, the good is "more the symbolism" of its bearing Samatar's name.
Rybak vowed after the announcement that he is completely done with the mayor's job and would now "do the toughest thing for me, which is to keep my mouth shut and go away."
He rattled through some of the favorite moments of his tenure, from seeing neighbors come together after the I-35 bridge collapse in 2007 and the north Minneapolis tornado in 2011 to watching graduates from the minority student internship program STEP-UP graduate and come back from college.
He said that when he was elected in 2001 he wanted Minneapolis to win back its "collective swagger," and "I think the city is feeling good about itself right now. It's going to do big things. We have our collective swagger back."
Maya Rao covers race and immigration for the Star Tribune.
maya.rao@startribune.com 612-673-4210 mrao_strib
Local Lawmakers seek to reduce fare-dodging penalty on transit
Nfl Souhan: Eagles' smart rebuilding lands another Super Bowl berth
Eat & Drink These 7 next wave Minneapolis coffee shops are stylish sanctuaries
Driver in custody after hitting two teens in Bloomington • West Metro
Bloomington makes fresh pitch to Legislature for a local sales tax • West Metro
Richfield approves zoning changes aimed at housing affordability • West Metro
Two cousins with diverging fates show promise, failure of youth rehabilitation in Minn. • West Metro
Man guilty of killing father, sister after seeking to evict them from Robbinsdale duplex • West Metro


Updated Full Opening Beer List Below with In-Depth Tasting Notes and Other Details!
Hi, we're DCBeer, you may remember us from such Bluejacket-related posts as this one from last Thursday with tasting notes of 12 of their 20 opening day beers and pictures from the sneak preview. If you don't, you should probably check that out. Anyway, Bluejacket opens up tonight, and we have a little bit more information that we think you should have. So here it goes.
First off, there are eight more beers that will be available tonight. You've seen some of these before, as they're some of the 20 collabs that Bluejacket's team did over the past year.
Interested in the food menu? You can check out the whole thing here via Washington City Paper.
DCBeer: How many, and which, kinds of base malt will Bluejacket stock?
NRG: We're still experimenting with several different base malts to see which ones give us the flavor profiles we're looking for in specific recipes. Some of our opening beers have featured pale and pilsner base malts from Weyermann and Crisp.
DCBeer: Where is grain stored, and how does it get to the third floor? We didn't see a silo or anything. Is there a winch to get the grain up there? I can't imagine y'all will be carrying it up three flights of stairs.
NRG: Grain is first brought in and stored in our malt room. From there, it's milled and then we use augers to deliver it to the grist case on the third floor. We can then mash in whenever we are ready, full malt bill ready to go.
DCBeer: On the light-up sign, is the plan for the sign to selectively illuminate which of those beers are available on any given night? Or will they all be lit all the time?
NRG: The 20 illuminated beers on the wall is the Bluejacket draft list at that time. Those will always remain illuminated, we'll just swap out the name placards as we replace/add new beers. The printed menu will list the 20 draft beers with more information on each, along with our 5 cask ales.
DCBeer: Any idea what hours of operation will be?
NRG: To start next week, the bar will open at 4 PM and dinner service will start at 5:30 PM. We have plans to roll out lunch and brunch service soon thereafter. The brewery will begin to offer weekly tours in the near future.
DCBeer: What's the rationale behind the no growlers policy? Related to quality control so you can ensure that the beers are served with proper care?
NRG: The two main factors influencing our stance on growlers are the quality of the beer and the customer's enjoyment of our beer. Once any growler is opened, the beer begins to lose its luster and should be consumed in one sitting to be enjoyed as its most fresh state. Sixty-four ounces is a lot of beer to consume at one time without waste. We believe the 750 ml bottle that we plan on releasing provides a more reasonable volume of beer to be enjoyed by our customers without wasting any beer or money, while preserving the quality of our beer.
The more you know, folks. Bluejacket opens tonight, and you can get reservations here. Well, you can try to. Good luck and be sure to get the Imposter. Congrats to Greg Engert and everyone at Neighborhood Restaurant Group on the opening!
Update: Thanks to Neighborhood Restaurant Group for sending over a (much) more detailed opening night beer list. Here's a bunch more on each of the drafts and casks that will pour tonight!
Glass: Fluted Pilsner – 16 Oz.
Glass: Nonic Pint – 16 Oz.
Glass: Tulip – 13 Oz.
Glass: Pokal – 14 Oz.
Glass: Snifter – 12 Oz.
Glass: Goblet – 12 Oz.
7 Beers for the Rest of Your Life? Which Make the Cut?


I don't consider myself a photographer, but I do take pictures, both personally and professionally. Lots of nature, dance, and fitness again (with a little commercial work scattered in between). Noticing a theme yet?


Polish National Centre for Research and Development launched the third edition of their BRIdge Alfa program. Within this program, private investors can obtain funding that will later be invested in small enterprises, especially in research and development projects. The budget of this edition of BRIdge Alfa reached an astounding sum of 1 billion PLN.
The program aims to support innovative R&D projects at early stages of their development, especially during the preseed phase. It's not a surprise that private investors are often reluctant to finance projects at this stage. The funding offered by NCBR (so-called proof of concept funding) decreases risks, allowing researchers to work on their projects with a constant financial support for a period of up to 5 years. Neither NCBR nor participating investors claim rights to the companies or patents obtained by the project team.


text:
Hans-Jörg Schramm (* 7. Juli 1935 in Freital, Sachsen; † 20. Oktober 2015) war ein deutscher Politiker (CDU) und Mitglied des Niedersächsischen Landtages.

Leben
Hans-Jörg Schramm kam 1946 aus der Sowjetischen Besatzungszone ins Emsland und besuchte in Meppen von 1946 bis 1954 ein humanistisch ausgerichtetes Gymnasium. Im Anschluss absolvierte er im selben Ort eine Lehre als Einzelhandelskaufmann im Textilgewerbe. Im Jahr 1957 trat er in den Dienst der Bundeswehr und arbeitete dort im technischen und im Kfz-Bereich an etlichen Standorten. Mit seiner Wahl in den Niedersächsischen Landtag wurde er ab Mai 1982 als Oberstleutnant außer Dienst gestellt.

Im CDU-Bundesfachausschuss für Sicherheitspolitik wirkte er als Mitglied mit. Er übernahm den Aufsichtsratsvorsitz in der Reise- und Verkehrsbüro Oldenburg GmbH und war dort auch Mitglied der Gesellschafterversammlung. In Oldenburg war er von 1974 bis 1996 Mitglied des Stadtrates. Er fungierte als stellvertretender Beigeordneter, war Vorstandsmitglied in der Ratsfraktion der CDU, Mitglied des Kulturausschusses und übernahm den Vorsitz im Oldenburger Bau- und Planungsausschuss.

In der 10. Wahlperiode (21. Juni 1982 bis 20. Juni 1986) war Hans-Jörg Schramm für den Wahlkreis Oldenburg-Nord Mitglied des Niedersächsischen Landtages.

Er war verheiratet und hatte drei Kinder. Er war evangelisch und Rechtsritter des Johanniterordens.

Literatur
 Barbara Simon: Abgeordnete in Niedersachsen 1946–1994. Biographisches Handbuch. Hrsg. vom Präsidenten des Niedersächsischen Landtages. Niedersächsischer Landtag, Hannover 1996, S. 345.

Landtagsabgeordneter (Niedersachsen)
Politiker (Oldenburg (Oldb))
Beigeordneter (Niedersachsen)
CDU-Mitglied
Politiker (20. Jahrhundert)
Rechtsritter (Johanniterorden)
Deutscher
Geboren 1935
Gestorben 2015
Mann

redpajama_set_name: RedPajamaWikipedia


Hop on over to our selection of Easter candy and kickoff spring with sweet beginnings. you'll find an assortment of Easter candy and gift options the Easter Bunny himself would envy. Fill Easter pals and baskets, candy tins and more festive containers with chocolates, hard candy, gummy and chewy candy and even more delicious options. Not only do we have a full pastel-color palette of Easter candy, but we also have a wide selection of personalized candy and party favors. Add Easter-themed candy stickers to the bottom of Hershey's kisses, or create your own Easter candy bars and wrappers. You'll find pastel green, lavender, pink and light yellow milk chocolate gems that are cute as a bunny. Kids dressed in their Sunday best will love hunting for plastic Easter eggs filled with sweet surprises inside, like jelly beans and M&M's customized by you. And because we know how to plan a party on a budget, Just Candy has miniature milk chocolate Easter eggs available in bulk. Shop Just Candy for a full day of festivities.


Another week, another variety of fantastic new products on Jiji! Want to make everyone jealous with your amazing Jiji finds? Check out this list of the most interesting products of the week on Jiji!
Get your party started with these fabulous LED balloons! Suitable for any kind of party, from a birthday celebration to a wedding reception, these balloons will light up your evening and will last for the whole night until the party is over.
We always think an emergency situation is unlikely to happen to us, but if it does happen someday, you don't want to be unprepared. This emergency utility tool contains a tire pressure gauge, an ultra bright LED light, a seat belt cutter, a magnet, and a hammer for all kinds of emergencies.
Want your beautiful lip colour to last for the whole day and survive the breakfast, dinner, supper, and coffee breaks? Then get a tattoo lip stain! Available in 6 amazing colours, this lip stain is super easy to apply will only come off when you want it to!
Here is a gift any kid would be extremely happy and lucky to get! Allow your baby to ride in style by presenting them with this stylish vintage Jaguar ride on toy car! The car comes with a remote control and can give your whole family hours of fun.
Oil perfume is known to last longer and is less irritating to sensitive skin than alcohol-based perfume, so this oil perfume from the most famous perfume brands like Gucci and D&G is definitely a good choice! Plus, you can customize the perfume and design your own unique fragrance.
If you want your chin chin to come out looking perfect and uniform every time you make this tasty snack, get yourself a chin chin cutter! It can also be used for making a variety of other dishes, including pasta, and starting a chin chin business is much easier when you have a cutter.
Poor blood circulation is the cause of many health problems, while the Chinese medicine associates good health with certain pressure points on the feet. Kill two birds with one stone using this massager, which is recommended for hypertension, headaches, excess weight, and many other conditions.
Let your mug stir your coffee, tea, juice, milkshake, or any other beverage for you and keep it hot or cold for as long as you like! This self-stirring mug makes a fantastic gift, and it's also indispensable for office, travels, or simply enjoying this novelty at home!
There are many reasons why you may need a discreet and affordable hidden camera, but there is only one perfect solution – a spy camera pen. Completely undetectable and very easy to use, this is the spy gadget you dreamed of as a child!
Master the art of flawless cat eye and smoky eye with this makeup stencil! No more errors, no more smudges, no more wrongly shaped lines and no more left eye makeup that differs from the right eye makeup!


These webinars are part of the 2015-2017 series: Issues in Developmental Disabilities.
For more information and registration information, please use the INFORMATION FLYER.
The USC UCEDD at CHLA is hosting monthly webinars to educate and explore current issues affecting people with developmental disabilities and their families. This series is designed for people with developmental disabilities, family members and advocates. Each webinar includes a presentation from an expert in the field and a questions & answers session. Registration is free of charge. Attendees need a computer with internet access to view the presentation and a phone or computer speakers to access the webinar audio. After each webinar, the slides and video recording are available on the Event Archive page.


In a surprising moment of bipartisan unity, Republicans and Democrats seem to be in agreement that it's time to remove the prescription requirement for oral contraceptives. Right before Memorial Day, Sen. Kelly Ayotte (R-N.H.) and Sen. Cory Gardner (R-Colo.) introduced legislation aimed at making birth control pills available over the counter, and now Sen. Patty Murray (D-Wash.) has introduced a Democratic bill that also would add insurance coverage for a future OTC pill. Though the politics of these moves tend to get the disproportionate share of attention, it's worth exploring what the impact of either bill would be for women.
Since 2004 I've led a coalition of researchers, doctors and women's health advocates exploring the feasibility of making birth control pills available without a prescription.
The science on this is clear: The pill is one of the best-studied medicines on the market today, and it's certainly safe enough to be available without a prescription. Some women have conditions that might make it more risky to take the pill, but studies show that women can use simple checklists on their own to figure out whether the pill is right for them. Other research shows that women getting the pill over the counter stay on it longer than women getting it by prescription. Major medical societies, including the American College of Obstetricians and Gynecologists and the American Academy of Family Physicians, support OTC access to the pill.
So do women. Studies show they are very interested in getting over-the-counter access to birth control pills, including about a third of women who currently don't use any birth control but are sexually active and don't want to get pregnant. This suggests that the OTC pill could lead to more women using effective contraception, with fewer gaps in use, which could help reduce unintended pregnancies.
But changing the pill from prescription-only to over-the-counter is no small feat, and it will require an interested pharmaceutical company with deep pockets. The research required by the Food and Drug Administration to consider such a change in status is costly. The Republican bill aims to motivate pharmaceutical companies by expediting the review process and waiving the FDA filing fee, which is at least $1 million.
There's another reason companies may hesitate to go forward with over-the-counter birth control pills: fear of political interference — and the costs and uncertainty it introduces — in the FDA approval process. When Plan B emergency contraception was being considered for over-the-counter sale, politicians of both parties intervened in the process, slowing it down and imposing an unreasonable age restriction, one that was lifted only after a 10-year legal battle.
Unfortunately, the bill introduced by Ayotte and Gardner would also interfere with the FDA process. It would give priority FDA review and waive the filing fee only for an OTC pill to be sold to those older than 17. From a medical point of view, there is no more reason to prohibit adolescents from getting birth control pills without a prescription than to bar them from buying over-the-counter cough syrup. Research shows that allowing teens access to emergency contraception without a prescription has not led them to engage in riskier sexual activity. Adolescents often have their first sexual encounter before seeing a doctor or nurse to discuss contraception, and over-the-counter birth control pills could help reduce the high teen pregnancy rate in the U.S.
There are other issues with the age restriction in the Republican bill. Anyone trying to buy the pill over the counter would need to show proof of age. Many people with the most to gain from the non-prescription pill — including undocumented immigrants ineligible for many programs that support family planning services — may not have a government-issued ID. The age restriction also creates extra work for pharmacists, who have to keep the product behind the counter so they can screen buyers. This, in turn, increases the cost of the pill and limits access to it.
Concerns about the cost of a future OTC pill are real, since insurance generally covers OTC contraceptives only if a woman has a prescription. The two bills diverge significantly when it comes to helping people pay for the pill. The Republican proposal offers a half-hearted solution: People can use pretax dollars in flexible spending accounts or health savings accounts to buy over-the counter medications without a prescription (the prescription requirement was imposed under the Affordable Care Act).
Over-the-counter access to the pill could be a game-changer for public health, eliminating an unnecessary barrier to a highly effective form of birth control. The support of politicians from both sides of the aisle to help make this a reality is welcome. But politicians must stay out of the drug regulatory process and let the FDA do its job.