text:
package com.appacitive.java;

import com.appacitive.core.*;
import com.appacitive.core.exceptions.AppacitiveException;
import com.appacitive.core.exceptions.ValidationException;
import com.appacitive.core.infra.ErrorCodes;
import com.appacitive.core.infra.SystemDefinedPropertiesHelper;
import com.appacitive.core.model.Callback;
import com.appacitive.core.model.ConnectedObjectsResponse;
import com.appacitive.core.model.Environment;
import com.appacitive.core.model.PagedList;
import com.appacitive.core.query.*;
import com.jayway.awaitility.Awaitility;
import com.jayway.awaitility.Duration;
import org.junit.*;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import static com.jayway.awaitility.Awaitility.await;
import static org.hamcrest.Matchers.equalTo;

/**
 * Created by sathley.
 */
//@Ignore
public class ObjectTest {

    @BeforeClass
    public static void oneTimeSetUp() {
        AppacitiveContextBase.initialize(Keys.masterKey, Environment.sandbox, new JavaPlatform());
    }

    private AtomicBoolean somethingHappened = new AtomicBoolean(false);

    @AfterClass
    public static void oneTimeTearDown() {

        // one-time cleanup code
    }

    @Before
    public void beforeTest() {
        Awaitility.reset();
        somethingHappened.set(false);
    }

    @After
    public void afterTest() {
    }

    private String getRandomString() {
        return UUID.randomUUID().toString();
    }

    @Test
    public void createFullObjectTest() throws ValidationException, ParseException {

        AppacitiveObject newObject = new AppacitiveObject("object");
        newObject.setIntProperty("intfield", 100);
        newObject.setDoubleProperty("decimalfield", 20.251100);
        newObject.setBoolProperty("boolfield", true);
        newObject.setStringProperty("stringfield", "hello world");
        newObject.setStringProperty("textfield", "Objects represent your data stored inside the Appacitive platform. Every object is mapped to the type that you create via the designer in your management console. If we were to use conventional databases as a metaphor, then a type would correspond to a table and an object would correspond to one row inside that table. object api allows you to store, retrieve and manage all the data that you store inside Appacitive. You can retrieve individual records or lists of records based on a specific filter criteria.");
        final Date date = new Date();
        final String nowAsISODate = convertDateToString(date);
        final String nowAsISOTime = convertTimeToString(date);
        final String nowAsISODateTime = convertDateTimeToString(date);
        newObject.setStringProperty("datefield", nowAsISODate);
        newObject.setStringProperty("timefield", nowAsISOTime);
        newObject.setStringProperty("datetimefield", nowAsISODateTime);
        newObject.setStringProperty("geofield", "10.11, 20.22");
        newObject.setPropertyAsMultiValued("multifield", new ArrayList<String>() {{
            add("val1");
            add("500");
            add("false");
        }});

        newObject.addTag("t1");
        List<String> tags = new ArrayList<String>();
        tags.add("t2");
        tags.add("t3");

        newObject.addTags(tags);

        newObject.setAttribute("a1", "v1");
        newObject.setAttribute("a2", "v2");
        newObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                assert (result.getId() > 0);
                assert (result.getPropertyAsInt("intfield") == 100);
                assert (result.getPropertyAsDouble("decimalfield") == 20.2511d);
                assert (result.getPropertyAsBoolean("boolfield"));

//                assert (convertDateToString(result.getPropertyAsDate("datefield")).equals(nowAsISODate));
//                    assert (convertTimeToString(result.getPropertyAsTime("timefield")).equals(nowAsISOTime));
                assert (convertDateTimeToString(result.getPropertyAsDateTime("datetimefield")).equals(nowAsISODateTime));

                assert (result.getPropertyAsGeo("geofield")[0] == 10.11d);
                assert (result.getPropertyAsGeo("geofield")[1] == 20.22d);
                assert (result.getPropertyAsMultiValuedString("multifield").size() == 3);
                assert ((result.getPropertyAsMultiValuedString("multifield").get(0).equals("val1")));
                assert ((result.getPropertyAsMultiValuedString("multifield").get(1).equals("500")));
                assert ((result.getPropertyAsMultiValuedString("multifield").get(2).equals("false")));
                somethingHappened.set(true);
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);
    }

    @Test
    public void dateTimePropertiesTest() throws ValidationException {
        AppacitiveObject object = new AppacitiveObject("object");
        Date now = new Date();
//        object.setDateProperty("datefield", now);
//        object.setTimeProperty("timefield", now);
        object.setDateTimeProperty("datetimefield", now);

        final String origDateStr = convertDateToString(now);
//        final String origTimeStr = convertTimeToString(now);
        final String origDatetimeStr = convertDateTimeToString(now);

        object.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                Date date = null;
                Date time = null;
                Date datetime = null;

//                date = result.getPropertyAsDate("datefield");
//                    time = result.getPropertyAsTime("timefield");
                datetime = result.getPropertyAsDateTime("datetimefield");

                final String dateStr = convertDateToString(date);
//                final String timeStr = convertTimeToString(time);
                final String datetimeStr = convertDateTimeToString(datetime);

                assert dateStr.equals(origDateStr);
//                assert timeStr.equals(origTimeStr);
                assert datetimeStr.equals(origDatetimeStr);

                somethingHappened.set(true);
            }
        });

        await().untilTrue(somethingHappened);
    }

    @Test
    public void multiLingualObjectCreateTest() throws ValidationException {
        AppacitiveObject newObject = new AppacitiveObject("object");
        final String randomString1 = "以下便是有关此问题的所有信息";
        final String randomString3 = "વિત ક્વિલપૅડ રોમિંગ યૂ વિલ બે ઍબલ તો રાઇટ ઇન ગુજરાતી ઓન ફસ્ેબૂક";
        final String randomString2 = "以ä¸ä¾¿æ¯æå³æ¤é®é¢çææä¿¡æ¯";
//        newObject.setStringProperty("stringfield", randomString1);
        newObject.setStringProperty("textfield", randomString3);
        newObject.createInBackground(new Callback<AppacitiveObject>() {
            public void success(AppacitiveObject result) {
                Assert.assertTrue(result.getId() > 0);
                assert (result.getPropertyAsString("textfield").toString().equals(randomString2));
                assert (result.getPropertyAsString("stringfield").toString().equals(randomString1));
                somethingHappened.set(true);
            }

            public void failure(AppacitiveObject result, AppacitiveException e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);
    }

    private AppacitiveObject getRandomObject() {
        AppacitiveObject newObject = new AppacitiveObject("object");
        newObject.setIntProperty("intfield", 100);
        newObject.setDoubleProperty("decimalfield", 20.251100);
        newObject.setBoolProperty("boolfield", true);
        newObject.setStringProperty("stringfield", "hello world");
        newObject.setStringProperty("textfield", "Objects represent your data stored inside the Appacitive platform. Every object is mapped to the type that you create via the designer in your management console. If we were to use conventional databases as a metaphor, then a type would correspond to a table and an object would correspond to one row inside that table. object api allows you to store, retrieve and manage all the data that you store inside Appacitive. You can retrieve individual records or lists of records based on a specific filter criteria.");
        final Date date = new Date();
        final String nowAsISODate = convertDateToString(date);
        final String nowAsISOTime = convertTimeToString(date);
        final String nowAsISODateTime = convertDateTimeToString(date);
        newObject.setStringProperty("datefield", nowAsISODate);
        newObject.setStringProperty("timefield", nowAsISOTime);
        newObject.setStringProperty("datetimefield", nowAsISODateTime);
        newObject.setStringProperty("geofield", "10.11, 20.22");
        newObject.setPropertyAsMultiValued("multifield", new ArrayList<String>() {{
            add("val1");
            add("500");
            add("false");
        }});

        newObject.addTag("t1");
        List<String> tags = new ArrayList<String>();
        tags.add("t2");
        tags.add("t3");

        newObject.addTags(tags);

        newObject.setAttribute("a1", "v1");
        newObject.setAttribute("a2", "v2");
        return newObject;
    }

    @Test
    public void updateObjectTest() throws Exception {
        getRandomObject().createInBackground(new Callback<AppacitiveObject>() {
            public void success(AppacitiveObject result) {
                result.setIntProperty("intfield", 200);
                result.setDoubleProperty("decimalfield", 40.50200);
                result.setBoolProperty("boolfield", false);
                result.setStringProperty("stringfield", "hello world again !!");
                final Date date = new Date();
                final String nowAsISODate = convertDateToString(date);
                final String nowAsISOTime = convertTimeToString(date);
                final String nowAsISODateTime = convertDateTimeToString(date);
                result.setStringProperty("datefield", nowAsISODate);
                result.setStringProperty("timefield", nowAsISOTime);
                result.setStringProperty("datetimefield", nowAsISODateTime);
                result.setStringProperty("geofield", "15.55, 33.88");
                result.setPropertyAsMultiValued("multifield", new ArrayList<String>() {{
                    add("val2");
                    add("800");
                    add("true");
                }});
                result.updateInBackground(false, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        assert (result.getRevision() == 2);
                        assert (result.getPropertyAsInt("intfield") == 200);
                        assert (result.getPropertyAsDouble("decimalfield") == 40.502d);
                        assert (!result.getPropertyAsBoolean("boolfield"));
                        assert ((result.getPropertyAsString("datefield")).equals(nowAsISODate));
                        assert ((result.getPropertyAsString("timefield")).equals(nowAsISOTime));
                        assert ((result.getPropertyAsString("datetimefield")).equals(nowAsISODateTime));
                        assert (result.getPropertyAsGeo("geofield")[0] == 15.55d);
                        assert (result.getPropertyAsGeo("geofield")[1] == 33.88d);
                        assert (result.getPropertyAsMultiValuedString("multifield").size() == 3);
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(0).equals("val2")));
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(1).equals("800")));
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(2).equals("true")));
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });

        await().untilTrue(somethingHappened);
    }

//    @Test
//    public void updateObjectPropertyAsNull() throws Exception {
//        AppacitiveObject appacitiveObject = getRandomObject();
//        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
//            @Override
//            public void success(AppacitiveObject result) {
//                result.setIntProperty("intfield", null);
//                result.setDoubleProperty("decimalfield", null);
//                result.setBoolProperty("boolfield", null);
//                result.setStringProperty("stringfield", null);
//                result.setStringProperty("textfield", null);
//                result.setDateProperty("datefield", null);
//                result.setTimeProperty("timefield", null);
//                result.setDateTimeProperty("datetimefield", null);
//                result.setGeoProperty("geofield", null);
//                result.setPropertyAsMultiValuedString("multifield", null);
//                result.updateInBackground(false, new Callback<AppacitiveObject>() {
//                    @Override
//                    public void success(AppacitiveObject result) {
//                        assert result.getRevision() == 2;
//                    }
//
//                    @Override
//                    public void failure(AppacitiveObject result, Exception e) {
//                        Assert.fail(e.getMessage());
//                    }
//                });
//            }
//        });
//    }

    public String convertDateToString(Date date) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String result;
        synchronized (df) {
            result = df.format(date);
        }
        return result;
    }

    public String convertTimeToString(Date date) {
        DateFormat tf = new SimpleDateFormat("HH:mm:ss.SSSSSSS");
        String result;
        synchronized (tf) {
            result = tf.format(date);
        }
        return result;
    }

    public String convertDateTimeToString(Date date) {
        DateFormat dtf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
        String result;
        synchronized (dtf) {
            result = dtf.format(date);
        }
        return result;
    }

    @Test
    public void updateEmptyObjectTest() throws ValidationException, ParseException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                result.setIntProperty("intfield", 200);
                result.setDoubleProperty("decimalfield", 40.50200);
                result.setBoolProperty("boolfield", false);
                result.setStringProperty("stringfield", "hello world again !!");
                final Date date = new Date();

                final String nowAsISODate = convertDateToString(date);
                final String nowAsISOTime = convertTimeToString(date);
                final String nowAsISODateTime = convertDateTimeToString(date);
                result.setStringProperty("datefield", nowAsISODate);
                result.setStringProperty("timefield", nowAsISOTime);
                result.setStringProperty("datetimefield", nowAsISODateTime);
                result.setStringProperty("geofield", "15.55, 33.88");
                result.setPropertyAsMultiValued("multifield", new ArrayList<String>() {{
                    add("val2");
                    add("800");
                    add("true");
                }});

                result.updateInBackground(false, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        assert (result.getRevision() == 2);
                        assert (result.getPropertyAsInt("intfield") == 200);
                        assert (result.getPropertyAsDouble("decimalfield") == 40.502d);
                        assert (!result.getPropertyAsBoolean("boolfield"));

                        assert ((result.getPropertyAsString("datefield")).equals(nowAsISODate));
                        assert ((result.getPropertyAsString("timefield")).equals(nowAsISOTime));
                        assert ((result.getPropertyAsString("datetimefield")).equals(nowAsISODateTime));

                        assert (result.getPropertyAsGeo("geofield")[0] == 15.55d);
                        assert (result.getPropertyAsGeo("geofield")[1] == 33.88d);
                        assert (result.getPropertyAsMultiValuedString("multifield").size() == 3);
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(0).equals("val2")));
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(1).equals("800")));
                        assert ((result.getPropertyAsMultiValuedString("multifield").get(2).equals("true")));
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }
        });

        await().untilTrue(somethingHappened);
    }

    @Test
    public void updateWithValidRevisionTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                result.addTag("t1");
                result.addTag("t2");
                result.setAttribute("a1", "v1");
                result.setAttribute("a2", "v2");
                result.updateInBackground(true, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        assert result.getRevision() == 2;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }
        });

        await().untilTrue(somethingHappened);
    }

    @Test
    public void updateWithInvalidRevisionTest() throws Exception {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");

        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(final AppacitiveObject origResult) {
                final long id = origResult.getId();
                AppacitiveObject.getInBackground("object", id, null, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject returnOrigResult) {
                        returnOrigResult.updateInBackground(true, new Callback<AppacitiveObject>() {
                            @Override
                            public void success(AppacitiveObject result) {
                                origResult.updateInBackground(true, new Callback<AppacitiveObject>() {
                                    @Override
                                    public void success(AppacitiveObject result) {
                                        assert false;
                                    }

                                    @Override
                                    public void failure(AppacitiveObject result, Exception e) {
                                        AppacitiveException ae = (AppacitiveException) e;
                                        assert ae.getCode().equals(ErrorCodes.INCORRECT_REVISION);
                                        somethingHappened.set(true);
                                    }
                                });
                            }
                        });
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);

    }

//    @Test
//    public void updateExistingNullValuesToNullTest() throws ValidationException {
//        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
//        appacitiveObject.setIntProperty("intfield", 0);
//        appacitiveObject.setProperty("decimalfield", null);
//        appacitiveObject.setProperty("boolfield", null);
//        appacitiveObject.setProperty("stringfield", null);
//        appacitiveObject.setProperty("textfield", null);
//        appacitiveObject.setProperty("datefield", null);
//        appacitiveObject.setProperty("timefield", null);
//        appacitiveObject.setProperty("datetimefield", null);
//        appacitiveObject.setProperty("geofield", null);
//        appacitiveObject.setProperty("multifield", null);
//        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
//            @Override
//            public void success(AppacitiveObject result) {
//                result.setProperty("intfield", null);
//                result.setProperty("decimalfield", null);
//                result.setProperty("boolfield", null);
//                result.setProperty("stringfield", null);
//                result.setProperty("textfield", null);
//                result.setProperty("datefield", null);
//                result.setProperty("timefield", null);
//                result.setProperty("datetimefield", null);
//                result.setProperty("geofield", null);
//                result.setProperty("multifield", null);
//                result.updateInBackground(false, new Callback<AppacitiveObject>() {
//                    @Override
//                    public void success(AppacitiveObject result) {
//                        assert result.getRevision() == 2;
//                    }
//
//                    @Override
//                    public void failure(AppacitiveObject result, Exception e) {
//                        Assert.fail(e.getMessage());
//                    }
//                });
//            }
//        });
//    }

    @Test
    public void updateAttributesTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.setAttribute("a1", "vx");
        appacitiveObject.setAttribute("a2", "v2");
        appacitiveObject.setAttribute("a3", "v3");
        appacitiveObject.setAttribute("a1", "v1");

        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                assert result.getAllAttributes().containsKey("a1");
                assert result.getAllAttributes().containsKey("a2");
                assert result.getAllAttributes().containsKey("a3");
                assert result.getAttribute("a1").equals("v1");

                result.removeAttribute("a1");
                result.removeAttribute("a2");
                result.setAttribute("a3", "vv3");

                result.updateInBackground(false, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        Map<String, String> attributes = result.getAllAttributes();
                        assert attributes.containsKey("a1") == false;
                        assert attributes.containsKey("a2") == false;
                        assert attributes.containsKey("a3");
                        assert attributes.get("a3").equals("vv3");

                        result.removeAttribute("non_existent_attr");
                        result.updateInBackground(false, new Callback<AppacitiveObject>() {
                            @Override
                            public void failure(AppacitiveObject result, Exception e) {
                                assert false;
                            }

                            @Override
                            public void success(AppacitiveObject result) {
                                assert true;
                                somethingHappened.set(true);
                            }
                        });
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });

            }
        });
        await().untilTrue(somethingHappened);
    }

    @Test
    public void updateTagsTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.addTag("t1");
        appacitiveObject.addTag("t2");
        appacitiveObject.addTag("t3");
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                List<String> tags = result.getAllTags();
                assert tags.size() == 3;
                assert tags.contains("t1");
                assert tags.contains("t2");
                assert tags.contains("t3");

                result.addTag("t4");
                result.addTag("t5");

                result.removeTag("t3");
                result.removeTag("t6");
                result.updateInBackground(false, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        List<String> tags = result.getAllTags();
                        assert tags.size() == 4;
                        assert result.tagExists("t3") == false;
                        assert result.tagExists("t6") == false;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);
    }

    @Test
    public void multiGetObjectsTest() throws IOException, ValidationException, InterruptedException {
        final AtomicInteger createdObjectsCount = new AtomicInteger(0);
        final ArrayList<Long> ids = new ArrayList<Long>();
        for (int i = 0; i < 3; i++) {
            AppacitiveObject appacitiveObject = new AppacitiveObject("object");
            appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
                @Override
                public void success(AppacitiveObject result) {
                    ids.add(result.getId());
                    createdObjectsCount.incrementAndGet();
                }
            });
        }
        await().untilAtomic(createdObjectsCount, equalTo(3));

        AppacitiveObject.multiGetInBackground("object", ids, null, new Callback<List<AppacitiveObject>>() {
            @Override
            public void success(List<AppacitiveObject> result) {
                assert result.size() == 3;
                somethingHappened.set(true);
            }

            @Override
            public void failure(List<AppacitiveObject> result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);
    }

    @Test
    public void fieldsTest() throws ValidationException {
        AppacitiveObject appacitiveObject = getRandomObject();
        appacitiveObject.setAttribute("aa", "vv");
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                List<String> fields = new ArrayList<String>();
                fields.add("intfield");
                fields.add("geofield");
                fields.add(SystemDefinedPropertiesHelper.attributes);
                fields.add(SystemDefinedPropertiesHelper.lastModifiedBy);
                fields.add(SystemDefinedPropertiesHelper.utcDateCreated);
                AppacitiveObject.getInBackground("object", result.getId(), fields, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result) {
                        assert result.getPropertyAsString("intfield") != null;
                        assert result.getPropertyAsString("geofield") != null;

                        assert result.getPropertyAsString("stringfield") == null;
                        assert result.getPropertyAsString("textfield") == null;

                        assert result.getAllTags().size() == 0;
                        assert result.getAllAttributes().size() != 0;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().untilTrue(somethingHappened);
    }

    @Test
    public void deleteObjectTest() throws ValidationException {
        AppacitiveObject object = new AppacitiveObject("object");
        object.createInBackground(new Callback<AppacitiveObject>() {
            public void success(AppacitiveObject result) {
                final long id = result.getId();
                result.deleteInBackground(false, new Callback<Void>() {
                    @Override
                    public void success(Void result) {
                        AppacitiveObject.getInBackground("object", id, null, new Callback<AppacitiveObject>() {
                            @Override
                            public void success(AppacitiveObject result) {
                                assert false;
                            }

                            @Override
                            public void failure(AppacitiveObject result, Exception e) {
                                AppacitiveException ae = (AppacitiveException) e;
                                assert ae.getCode().equals(ErrorCodes.NOT_FOUND);
                                somethingHappened.set(true);
                            }
                        });
                    }

                    @Override
                    public void failure(Void result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void multiDeleteObjectTest() throws ValidationException, InterruptedException {
        final AtomicInteger createCount = new AtomicInteger(0);
        final List<Long> ids = new ArrayList<Long>();
        for (int i = 0; i < 3; i++) {
            AppacitiveObject appacitiveObject = new AppacitiveObject("object");
            appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
                @Override
                public void success(AppacitiveObject result) {
                    ids.add(result.getId());
                    createCount.incrementAndGet();
                }

                @Override
                public void failure(AppacitiveObject result, Exception e) {
                    Assert.fail(e.getMessage());
                }
            });
        }
        await().atMost(Duration.TEN_SECONDS).untilAtomic(createCount, equalTo(3));

        final AtomicInteger deleteCount = new AtomicInteger(3);
        AppacitiveObject.bulkDeleteInBackground("object", ids, new Callback<Void>() {
            @Override
            public void success(Void result) {
                for (long id : ids) {
                    AppacitiveObject.getInBackground("object", id, null, new Callback<AppacitiveObject>() {
                        @Override
                        public void success(AppacitiveObject result) {
                            assert false;
                        }

                        @Override
                        public void failure(AppacitiveObject result, Exception e) {
                            assert true;
                            deleteCount.decrementAndGet();
                        }
                    });
                }
            }

            @Override
            public void failure(Void result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilAtomic(deleteCount, equalTo(0));
    }

    @Test
    public void findObjectsTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        final AppacitiveQuery query = new AppacitiveQuery();
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                AppacitiveObject.findInBackground("object", query, null, new Callback<PagedList<AppacitiveObject>>() {
                    @Override
                    public void success(PagedList<AppacitiveObject> result) {
                        assert result.results.size() > 0;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(PagedList<AppacitiveObject> result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void findObjectsTestWithPagination() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        final AppacitiveQuery query = new AppacitiveQuery();
        query.pageNumber = 2;
        query.pageSize = 15;
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                AppacitiveObject.findInBackground("object", query, null, new Callback<PagedList<AppacitiveObject>>() {
                    @Override
                    public void success(PagedList<AppacitiveObject> result) {
                        assert result.pagingInfo.pageSize == 15;
                        assert result.pagingInfo.pageNumber == 2;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(PagedList<AppacitiveObject> result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void findObjectsWithPropertyFilterTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.setStringProperty("stringfield", "hello world123");
        appacitiveObject.setIntProperty("intfield", 2005);
        appacitiveObject.setBoolProperty("boolfield", false);
        appacitiveObject.setStringProperty("geofield", "11.11, 22.22");
        final Date date = new Date();
        final String nowAsISODate = convertDateToString(date);
        final String nowAsISOTime = convertTimeToString(date);
        final String nowAsISODateTime = convertDateTimeToString(date);
        appacitiveObject.setStringProperty("datefield", nowAsISODate);
        appacitiveObject.setStringProperty("timefield", nowAsISOTime);
        appacitiveObject.setStringProperty("datetimefield", nowAsISODateTime);

        final AppacitiveQuery query = new AppacitiveQuery();
        final Query q1 = new PropertyFilter("stringfield").isEqualTo("hello world123");
        final Query q2 = new PropertyFilter("intfield").isEqualTo(2005);
        final Query q3 = new PropertyFilter("boolfield").isEqualTo(false);
        final Query q4 = new PropertyFilter("datefield").isEqualTo(nowAsISODate);
        final Query q5 = new PropertyFilter("timefield").isEqualTo(nowAsISOTime);
        final Query q6 = new PropertyFilter("datetimefield").isEqualTo(nowAsISODateTime);
        double[] geo = new double[2];
        geo[0] = 11.11d;
        geo[1] = 22.23d;
        final Query q7 = new GeoFilter("geofield").withinCircle(geo, 10, DistanceMetric.mi);

        query.filter = BooleanOperator.and(new ArrayList<Query>() {{
            add(q1);
            add(q2);
            add(q3);
            add(q4);
            add(q5);
            add(q6);
            add(q7);
        }});
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                AppacitiveObject.findInBackground("object", query, null, new Callback<PagedList<AppacitiveObject>>() {
                    @Override
                    public void success(PagedList<AppacitiveObject> result) {
                        assert result.results.size() > 0;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(PagedList<AppacitiveObject> result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void findObjectsWithAttributeFilterTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        appacitiveObject.setAttribute("a1", "v1");
        appacitiveObject.setAttribute("a2", "v2");
        appacitiveObject.setAttribute("a3", "v3");
        appacitiveObject.setAttribute("a4", "appacitive");
        final AppacitiveQuery query = new AppacitiveQuery();
        final AttributeFilter a1 = new AttributeFilter("a1").isEqualTo("v1");
        final AttributeFilter a2 = new AttributeFilter("a2").endsWith("2");
        final AttributeFilter a3 = new AttributeFilter("a3").startsWith("v");
        final AttributeFilter a4 = new AttributeFilter("a4").like("acit");
        query.filter = BooleanOperator.and(new ArrayList<Query>() {{
            add(a1);
            add(a2);
            add(a3);
            add(a4);
        }});
        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                AppacitiveObject.findInBackground("object", query, null, new Callback<PagedList<AppacitiveObject>>() {
                    @Override
                    public void success(PagedList<AppacitiveObject> result) {
                        Assert.assertTrue(result.results.size() > 0);
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(PagedList<AppacitiveObject> result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void findObjectsWithTagsFilterTest() throws ValidationException {
        AppacitiveObject appacitiveObject = new AppacitiveObject("object");
        List<String> tags = new ArrayList<String>() {{
            add("tag1");
            add("tag2");
            add("tag3");
            add("tag4");
            add("tag5");
        }};
        appacitiveObject.addTags(tags);
        final AppacitiveQuery query = new AppacitiveQuery();
        final TagFilter t1 = new TagFilter().matchAll(new ArrayList<String>() {{
            add("tag1");
            add("tag2");
        }});

        final TagFilter t2 = new TagFilter().matchOneOrMore(new ArrayList<String>() {{
            add("tag4");
            add("tag6");
            add("tag7");
        }});
        query.filter = BooleanOperator.and(new ArrayList<Query>() {{
            add(t1);
            add(t2);
        }});

        appacitiveObject.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                AppacitiveObject.findInBackground("object", query, null, new Callback<PagedList<AppacitiveObject>>() {
                    @Override
                    public void success(PagedList<AppacitiveObject> result) {
                        assert result.results.size() > 0;
                        for (AppacitiveObject obj : result.results) {
                            assert obj.tagExists("tag1") == true;
                            assert obj.tagExists("tag2") == true;
                            assert obj.tagExists("tag4") == true || obj.tagExists("tag6") == true || obj.tagExists("tag7") == true;
                        }
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(PagedList<AppacitiveObject> result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

    @Test
    public void getConnectedObjectsTest() throws ValidationException {
        AppacitiveUser user = new AppacitiveUser();
        user.setFirstName(getRandomString());
        user.setUsername(getRandomString());
        user.setPassword(getRandomString());
        user.setEmail(getRandomString().concat("@gmail.com"));

        AppacitiveDevice device = new AppacitiveDevice();
        device.setDeviceType("ios");
        device.setDeviceToken(getRandomString());

        new AppacitiveConnection("my_device").fromNewDevice("device", device).toNewUser("user", user).createInBackground(new Callback<AppacitiveConnection>() {
            @Override
            public void success(AppacitiveConnection result) {
                AppacitiveObject.getConnectedObjectsInBackground("my_device", "user", result.endpointB.objectId, null, null, new Callback<ConnectedObjectsResponse>() {
                    @Override
                    public void success(ConnectedObjectsResponse result) {
                        assert result.results.size() > 0;
                        assert result.results.get(0).object != null;
                        assert result.results.get(0).connection != null;
                        assert result.results.get(0).object.getType().equals("device");
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(ConnectedObjectsResponse result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }
        });
        await().atMost(Duration.TEN_MINUTES).untilTrue(somethingHappened);

    }

    @Test
    public void setMultiValuedItemsTest() throws ValidationException {
        AppacitiveObject object = new AppacitiveObject("object");
        List<String> stringItems = new ArrayList<String>() {{
            add("a");
            add(null);
            add("b");
            add(null);
        }};
        List<Integer> integerItems = new ArrayList<Integer>() {{
            add(100);
            add(null);
            add(200);
            add(null);
        }};
        List<Double> decimalItems = new ArrayList<Double>() {{
            add(11.12345);
            add(null);
            add(22.09876);
            add(null);
        }};
        object.setPropertyAsMultiValued("multi_string", stringItems);
        object.setPropertyAsMultiValued("multi_integer", integerItems);
        object.setPropertyAsMultiValued("multi_decimal", decimalItems);

        assert object.getPropertyAsMultiValuedDouble("multi_decimal").size() == 4;
        assert object.getPropertyAsMultiValuedInt("multi_integer").size() == 4;
        assert object.getPropertyAsMultiValuedString("multi_string").size() == 4;

        object.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                assert result.getId() > 0;
                List<String> returnStringItems = result.getPropertyAsMultiValuedString("multi_string");
                List<Integer> returnIntegerItems = result.getPropertyAsMultiValuedInt("multi_integer");
                List<Double> returnDoubleItems = result.getPropertyAsMultiValuedDouble("multi_decimal");
                assert returnStringItems.size() == 2;
                assert returnDoubleItems.size() == 2;
                assert returnIntegerItems.size() == 2;
                somethingHappened.set(true);
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);

    }

    @Test
    public void addMultiValuedItemsTest() throws ValidationException {
        AppacitiveObject object = new AppacitiveObject("object");
        final List<String> stringItemsWithNulls = new ArrayList<String>() {{
            add("a");
            add(null);
            add("b");
            add(null);
        }};
        final List<Integer> integerItemsWithNulls = new ArrayList<Integer>() {{
            add(100);
            add(null);
            add(200);
            add(null);
        }};
        final List<Double> decimalItemsWithNulls = new ArrayList<Double>() {{
            add(11.12345);
            add(null);
            add(22.09876);
            add(null);
        }};

        object.setPropertyAsMultiValued("multi_string", stringItemsWithNulls);
        object.setPropertyAsMultiValued("multi_integer", integerItemsWithNulls);
        object.setPropertyAsMultiValued("multi_decimal", decimalItemsWithNulls);

        object.createInBackground(new Callback<AppacitiveObject>() {
            @Override
            public void success(AppacitiveObject result) {
                assert result.getId() > 0;
                result.addItemsToMultiValuedProperty("multi_string", stringItemsWithNulls);
                result.addItemsToMultiValuedProperty("multi_integer", integerItemsWithNulls);
                result.addItemsToMultiValuedProperty("multi_decimal", decimalItemsWithNulls);

                assert result.getPropertyAsMultiValuedDouble("multi_decimal").size() == 6;
                assert result.getPropertyAsMultiValuedInt("multi_integer").size() == 6;
                assert result.getPropertyAsMultiValuedString("multi_string").size() == 6;

                result.updateInBackground(false, new Callback<AppacitiveObject>() {
                    @Override
                    public void success(AppacitiveObject result1) {
                        assert result1.getPropertyAsMultiValuedDouble("multi_decimal").size() == 4;
                        assert result1.getPropertyAsMultiValuedInt("multi_integer").size() == 4;
                        assert result1.getPropertyAsMultiValuedString("multi_string").size() == 4;
                        somethingHappened.set(true);
                    }

                    @Override
                    public void failure(AppacitiveObject result, Exception e) {
                        Assert.fail(e.getMessage());
                    }
                });
            }

            @Override
            public void failure(AppacitiveObject result, Exception e) {
                Assert.fail(e.getMessage());
            }
        });
        await().atMost(Duration.TEN_SECONDS).untilTrue(somethingHappened);
    }

}

redpajama_set_name: RedPajamaGithub


There's a galling trend for Bruichladdich to be quite expensive, but very good. And ultimately, worth it. It's almost as if they know exactly how much they can get away with!
The first set are from the Micro Provenance series (previous reviews here) and were released initially as a 3x20cl set for £90 with an associated tweet tasting. I split this down the middle with my mate Jon but missed the TT. The relevant full bottles are still available for sale on the Bruichladdich website (£90 each and mostly quite young, although the Pomerol cask is more reasonably aged), but the 3x20cl set sold out very quickly.
Then High Noon, the Bruichladdich Feis Isle 2015 bottling (£100 for 50cl), some old whisky in here but very winey. Then the Master of Malt single cask laddie pair. These were the first to have their new glass stoppers (pretty cool) but at 12 years old and about £120-£130 on release, there was widespread outrage when they came online. They clearly sold very few and reduced the price to under £100 which was enough for the international bottleshare group to split the pair and hence, the review appears below. MoM need to be careful with their reputation.
Anyway, the world kept turning, and then Whisky Broker released a 12 year old Port Charlotte with a peculiar wine finish. This wasn't expensive (although, as usual, Whisky Barrel bought up half the stock and is now selling it for 20% more) but takes away the taste of price gouging and rounds off the flight – enjoy!
Distilled in 2007, bottled in 2015. This single cask is the first ever release of the 2007 harvest of Islay Barley, matured in fresh oak. The barley was grown Rockside Farm on the wild west coast of the Rhinns by Mark and Rohaise French.
Nose - Remarkable. This smells old and elegant, like a big Glenfiddich, but with a red wine sauce backing. It has some youth too, some new make cereal behind it, but it so perfectly balanced with fresh red berries, furniture polish and toffee. Wonderful nose, epic cask - big expectations. With water, sweeter and slightly more gentle but no less fun.
Body - Ouch! Youthful intensity, sharp barley, lots of spice and power, seriously lacking in elegance although it certainly works. It's a bit like getting a whiff of someone else's fag and remembering your first cigarettes - it's strong and powerful and you know something important is happening, but the feeling doesn't really feel sustainable. With water, gentler, a bit more together. A lot more water brings sweet soap and less aggression.
Finish - Long, soapy and spicy. Lingering wood, numbing aniseed and tobacco in the mouth. Shorter finish with water and less dimensional - numbing blonde oak and tobacco.
What's not good about it - The delivery doesn't live up to the hype. It needs some old complexity and depth to round this out.
What's good about it - A fantastic nose, clearly something really special cask wise. Compelling and aggressive throughout. It's a pity they don't sell more of the 20cls of this though - one a decade would see you right.
Distilled in 2004, bottled in 2015. This single cask from Warehouse 11 contains Bruichladdich spirit matured full term for ten years in European oak that previously held wine from the Duero valley, one of Spain's Denominación de Origen on the northern plateau.
Nose - Big again. Deep and elegant, dusty and lacquered. Strawberry laces, cherry pipe tobacco and granite. Pure and excellent. Water brings a touch more tobacco, less fruit, but arguably it's more grown up, although a touch of deodorant suggests a teenager.
Body - Spicy, dark and big red wine. Sweet engines, like a big, dirty, wine finished Springbank - and that's before water, at nearly 65% ABV. Remarkable stuff. With water, some sulphur in the immediate delivery, balanced oak and gunpowder, granite, liquorice. Sweeter, but still mature.
Finish - Long, dirty wine (but no sulphur) and tobacco. Drying tannins and constrained spice. Rather compelling.
What's not good about it - Challenging, again, for sure. The sweetness promised in the nose, and that would round out the whole delivery, doesn't happen. But it really works.
What's good about it - Another epic nose, much more accomplished in the delivery. Fruit, balanced sulphur and a big dirty wine finish that's dry but not nutty or overdone. It's like the Longrow Port but drier and sourer.
Distilled in 1992, bottled in 2015. This single cask from Warehouse 12 contains Bruichladdich spirit that has matured in casks of European oak from one of the great winemakers from Pomerol.
Nose - Now this is an exceptional cask. Sweet, pure wood, sweet red wine and a touch of black Chinese vinegar. Intense, bright and venerable, with sour cherries and polish.
Body - Big, juicy, but a bit dry and with copper coins at the side of the mouth. Pine nuts and privet hedge. Deep oak, and lots of age. Really drinkable too. I'm reminded of a big old Balvenie.
Finish - That immediate drying sulphur I love so much, then a little travel sweets, fried parsley, toffee. Perfectly spice. Wonderful stuff.
What's not good about it - struggling to find anything.
What's good about it - Finally a bottle in this set that fires on all cylinders. Balanced, old and elegant, intense and fruity, waxy and numbing. Brilliant.
Nose - Flipping heck this session isn't getting any easier. It's like he's been blending all his favourites! Immensely dark and sweet, but with that compelling dry, sweaty sock edge that can balance deep toffee and a little metal. Big and beautiful. Expensive. With water, wax, fruit and luxury. Beautiful.
Body - Very, very winey. Dry and nutty, lots of playbark and almonds. Not as luxurious as the nose would suggest, but pretty damn delicious nonetheless.
Finish - Medium and metallic. Ozone and more playbark. How odd! Good fun though.
What's not good about it - Seriously dry on the finish, too much wine.
What's good about it - The best nose of the night. Some big whisky in here. Despite the balance problems, this is beautifully drinkable and I'd happily stick on this for many hours.
Now the MoM single cask laddies. These are low outturn because they bunged the rest into Darkness! casks for extra sherry. They're already pretty silly. No denying the quality of the spirit even if the first fill tomfoolery is a distraction, but way too expensive.
15th July 2002 to 26th November 2014, 114 bottles. Special stopper!
Nose - Dark and intensely first fill bourboned. This smells like a sulphured sherry cask has been racked into a first fill bourbon. Not that this doesn't work on the nose - it's young, brutish and sweet, but simultaneously beautifully spiced, with raisins and big vanilla custard and pastry. A delicious nose. With water, sweeter, more Islay, some truffle honey.
Body - Deeply sweet, toffeed and balanced with drying sulphur and tannins. Lovely. With water, softer and more more rounded.
Finish - And then cabbage. Big, boiled cabbage and cabbage water. Palate destroying sulphur. Hidden behind this may be a brilliant whisky. Except I can't taste anything else but cabbages.
What's not good about it - Sulphur. Given the colour and sulphur you would call this as a sherry cask – maybe it was in one at some point?
What's good about it - Beautiful nose, lovely initial delivery. Destroyed by sulphur. The good news is that if you're not sensitive (and you should know if you are by now!) you'll love this. I'm somewhat sensitive, and really love it just up until the cabbage stage, and that's too far for me. If you're very sensitive, you'll be unhappy with this.
28th June 2002 to 26th November 2014, 86 bottles.
Nose - More restrained, fresher cask influence and classic sherry. Quite young though, with dusty raisins, sherry soaked barley and slightly fetid (although no sulphur). A compelling, deep, joss stick like sweetness, if a little one dimensional, neat (but it is 63%!). With (quite a lot of) water, a lovely, complex sweetness develops - cask and spirit together. Polished furniture, leather and roses.
Body - Sherry bomb. Poised on lightly sulphured, nutty, quite dry. Meaty and toothsome, cabbage highlights. No problem though, lovely stuff. More peppery with water, much more with it.
Finish - Very long, slightly peppery, deep spicy sherry, lingering barley. Water, after all this talk of pepper, brings chilli and sesame snaps. There is, sadly, still some cabbage in here but I'm learning to filter it out.
What's good about it - but price aside, it's rather delicious. A sherry bomb and no mistake.
Regarding the glass stoppers, these are pretty cool. They look good in the bottle and it's an interesting curiosity. The deal is that these won't degrade over time and there is a tight plastic seal which presumably won't allow evaporation over time, so the whisky won't disappear if stored for decades. Quite a consideration for "looking" whisky that'll probably never be drunk (unlike these 12 year old indies).
The stopper is very tight indeed, you can pick the full bottle up by the stopper. To get it off you have to lever it off at the side (the wedge shape internally allows you to do so). It's sealed by a plastic ring at the top edge of the stopper.
You can read more about them on the MoM blog here, and even buy one for a quid, here.
Goodness me we need some peat and something a bit more down to earth price wise. This Whisky Broker PC 12 sold out in minutes, and I scored one, but Sean sorted me out with a sample so I don't need to crack mine open just yet. Thanks Sean! Still sold under a different label by Whisky Barrel.
Nose - Immediately swimming pool - that wet towel thing with damp chlorine. Then the big peat and wine makes me think more of Longrow port cask. Not cutting it after the High Noon as it's another wine finish, and not quite as well done, but I'm pleased for some peat finally, and a lot of earth.
Body - Delicious. Dusty PC, sweet, balanced and clean, although not fresh. More fetid, but still fecund. Orange juice and liquorice torpedoes.
Finish - Juicy, ripe and correct. Long orange juice, bitter peat and oak between. Works well.
What's not good about it - Oddly, compared to the rest of the session, the nose is the weak point. Too much wine, not enough midrange. Mind you, bear in mind that this whisky came after some of the best laddie noses in the business!
What's good about it - Juicy, balanced, delicious delivery. Great fun to drink and very satisfying. And always fun to meet a whisky where the delivery outclasses the nose. Also, thank god for peat, the salt of the whisky world!


The game will be released on Playstation 4 on March 21 and on Switch in the summer in Japan. A 2018 Western release will include the same console releases and an additional Xbox One release.
PQube intends to release the game on Playstation 4 and Switch in North America and Europe this year.
The game was released for the Switch in Japan on Nintendo's eShop and offers English and Chinese subtitles.
The game will see a Japanese release of February 15th on the Playstation Vita.
The smartphone game is coming to the West in English.
The game's Western release on Playstation 4 has been delayed to April 17.


The Mother's Day Classic is a nation-wide community based event that raises funds for breast cancer research. No matter how large or small the venue, we all come together on Mother's Day to remember, celebrate and honour those touched by breast cancer.
The Wangaratta event is in its fifth year & offers participants a 4km walk, along with a 4km & 8km run!
Can't join us on the day, don't worry, while you may not be able to join us in body, you can still join us in spirit by registering as a 'Support us in Spirit' participant! Follow this link to read more, or make a donation towards breast cancer research!
To save time please register online, however on the day entries at a higher rate are available – please note cash or cheque only.
Available at a higher rate on Sunday 12 May 2019 (event day) at Apex Park from 7:30am.
This regional event has a relaxed feel and will not have electronic timing, and hence no race packs or bibs are required to be collected by participants.
You can just turn up on the day and walk or run!
Parking available at Bickerton, Faithful & Clements Street.
Whilst we endeavour to provide all participants a 2019 medallion, they are subject to availability.
A Certificate of Participation will be available here on the Mother's Day Classic website from Tuesday 14 May 2019 for you to download and print!
Would you like to stay up to date with news from the Mother's Day Classic?
The Women in Super Mother's Day Classic is an annual fun run and walk raising funds and awareness for breast cancer research. Our aim is to deliver a fun, healthy and inspirational event that brings the community together on Mother's Day to support and remember those touched by breast cancer. ME has proudly supported the Mother's Day Classic since 2005.


text:
Georgia, Greece, and Germany
National Library of Greece
Chester Beatty Library
Biblioteca Medicea Laurenziana
Articles and Tools
Greek New Testament Editions
Institutions and Projects
Personal Sites and Blogs
15th Anniversary of CSNTM
The concept for the Center for the Study of New Testament Manuscripts began long before it became an official non-profit organization. In my sabbatical at Cambridge University in 1995 I logged many happy weeks at the University Library examining New Testament manuscripts. Peter Head of Tyndale House, Cambridge, and I even spent a day poring over Codex Cantabrigiensis, a fifth-century codex that had been donated to the University in 1581 by Theodore Beza. Digital photography was starting to have an impact in the late 90s. Dr. Hall Harris (CSNTM board member) urged me to start my own institute for examining and photographing NT manuscripts. The need was great: only microfilms were available for most NT manuscripts, and the quality was abysmal. Frequently, the text was illegible on these microfilms, and virtually all marginal notes by the scribes were way too blurry to read. Our knowledge, therefore, of the NT manuscripts was, in each instance, almost always incomplete. Once 4 megapixel digital cameras were produced, the time was right to found a new institute. Digital photography ushered in a new era of textual study: for the first time, these manuscripts would be easily accessible and read with great clarity.
Microfilm Image of NT Manuscript
CSNTM was granted 501(c)3 status on September 13, 2002 by the IRS.
Our inaugural expedition was to St. Catherine's Monastery, Mt. Sinai, Egypt in September 2002. In our week there, we examined some of the 'New Finds' manuscripts that had been discovered in 1975. In the process of examination, we discovered two more previously unknown manuscripts: an ancient Greek Old Testament palimpsest (a manuscript that had been scraped over and reused) of the major prophets, in majuscule script; and the Protevangelium of James, an apocryphal book of which very few copies still exist (this was one of the earliest ones).
Later in the same month, my wife and I moved to Münster, Germany where we spent a sabbatical year. Because CSNTM was a brand new institute with virtually no funding, we needed a major gift for the sabbatical year to be as effective as possible. Our prayers were answered: Just such a gift from a small church in Minnesota arrived that summer, allowing me to travel throughout Europe in search of manuscripts. Several more discoveries were made in 2002–03. And our first digitizing project was at the Institute for New Testament Research (INTF) in Münster. With one 4 MP and one 5 MP camera (the cost for each of these state-of-the-art cameras was in the four digits!), an assistant and I spent several weeks digitizing the 22 manuscripts in Münster's collection. It took 90 seconds to process a single picture! The quality was not very good compared to today's standards, but it was far better than microfilm.
In the early years, CSNTM was essentially a summer project. We usually raised enough funds for a two- or three-week expedition each summer. The physical location of the Center was my study, closet, garage—and sometimes living room! As word of our mission spread, the funds began to pour in. In 2004 we digitized 30 manuscripts at the Ecumenical Patriarchate of Constantinople, including an early majuscule palimpsest of Mark's Gospel that we discovered.
The Center grew, our expedition season expanded, and the quality of the cameras improved. We procured subleased office space in 2008, and the staff increased to two full-timers and one part-time employee.
Codex 800 (National Library of Greece)
During these years, we continued to discover more manuscripts and improve our photographic protocols. In 2007 our visit to the National Archive in Tirana, Albania revealed dozens of NT manuscripts that the scholarly world was unaware of. The news of these discoveries was reported in over 100 international newspapers.
2008–09 was another sabbatical year for me. I spent it digitizing manuscripts on three continents. The CSNTM team photographed manuscripts in Albania, Romania, Cambridge University, Arundel Castle, Glasgow University, St. Andrews University, University of Michigan, Australia (Sydney and Melbourne), New Zealand (Auckland), the Bavarian State Library in Munich, several sites in Greece, and many other locations.
Monastery of St. John the Theologian, Patmos
By this time, CSNTM had earned an international reputation. The quality of our images, the free access to these images, and the many discoveries were helping biblical scholars all over the globe in the task of reconstructing the exact wording of the original text—all at the click of a mouse.
In 2013, through the advocacy of Dr. Larry Hurtado of Edinburgh University, CSNTM was granted permission to photograph some of the oldest and most important papyri of the NT, housed at the Chester Beatty Library in Dublin. Portions of one of these manuscripts, which we digitized the following year, were at the University of Michigan. Eighty years ago, photographs of these unspeakably significant papyri were published. Technology has improved a bit since then; the crisp clarity of CSNTM's images has revealed many more details. Two PhD dissertations on these papyri have been done/are being done based on our images. All this will help scholars discern the early transmission of the NT text and assist them in recovering the wording of the originals.
A Page from P46 (University of Michigan)
Speaking of doctoral students, every year CSNTM staff train interns for scholarly work in the New Testament. Many of our interns have gone on to prestigious universities to earn advanced degrees—Cambridge, Oxford, Edinburgh, Yale, Brown, Princeton Seminary, St. Andrews, Wheaton College, Dallas Seminary, University of Dallas, Baylor University, and many other schools. And several of them are now teaching, bringing solid, biblical scholarship to the classroom. Like CSNTM's digital images, these scholars will have an impact for generations to come.
The next year was no less momentous. CSNTM received a contract to digitize the entire collection of Greek NT manuscripts at the National Library of Greece in Athens. We labored for the next two years on the project. Forty-four people were rigorously trained for precision digitizing. During this time we purchased the long-anticipated Canon 50 MP cameras—ten times better than our original cameras. Over 300 manuscripts were photographed producing 45 terabytes of images (150,000 images). Thanks especially must go to Rob Marcello, who is in charge of our expeditions and who planned this two-year enterprise down to the smallest details. The post-production work is still ongoing.
Our tiny institute—with only seven employees—has a reputation that belies its size. The staff includes:
Rob Marcello, Director of Operations and Research
Christina Nations, Development Manager
Stratton Ladewig, Project Manager
Andrew Bobo, Research Coordinator
Mark Arvé, Finance Coordinator
Andy Patton, Development Coordinator
Dan Wallace, Executive Director.
Rob Marcello in Dublin
As of last month, CSNTM now has its own leased office—more than 2000 square feet including offices, a dedicated digitizing room, equipment room, library, and conference room.
In CSNTM's first 15 years, we have worked at more than forty locations throughout the world, digitizing more than half a million pages of the Greek NT and discovering upwards of 90 manuscripts. As we look to the future, our sights are set on libraries in Greece, Italy, Eastern Europe, former Soviet bloc countries, and the Middle East. We will soon add Multi-Spectral Imaging to our digitizing equipment, enabling us to read erased manuscripts—manuscripts whose text has not been seen for centuries. Donations are both welcome and necessary for this work. Not only are CSNTM's images helping biblical researchers, art historians, and Greek scholars, but they are also digitally preserving these amazing artifacts, freezing them in time before the decay of the ages has its full sway. And, as always, our commitment is to make our images free for all, free for all time.
CSNTM
Center for the Study of New Testament Manuscripts
2001 W. Plano Parkway STE 2450
Plano, TX 75075 USA
INFO@CSNTM.ORG
Preserving Ancient New Testament Manuscripts for a Modern World
Terms of Use and Copyright policy

redpajama_set_name: RedPajamaCommonCrawl


text:
No Room at the Inn
Benefiting those for whom there is no room.
History of NRATI
Start Your Own NRATI?
Donate/Purchase Opening Reception Tickets
The idea for No Room at the Inn began about 30 years ago at a Christmas party. Judy Crenshaw and Huw Howells, both avid collectors of Nativity sets, were lamenting that so few people could enjoy the variety and beauty of the depiction of that first Christmas. As they talked, they realized that their collections could be used to benefit those less fortunate, and what more appropriate group than the homeless? Thus the dreams began, to have a display of Nativity sets, invite the public, and have the proceeds go to the homeless. Because Jesus himself was homeless that first Christmas, Huw thought the name "No Room at the Inn" would be appropriate. The dream remained just that- a dream. Each Christmas, Judy, Huw, and Huw's wife, Nora, would invite friends to their homes to enjoy the Nativities, and again remember the dream. As they put their collections away for yet another year, they resolved that "next year" they would make the dream a reality. However, Huw's increasing illness, and the demands of Judy's and Nora's busy teaching careers prevented them from getting the dream off the ground. Nevertheless they never forgot the dream and hoped that "someday" the dream would come true. In July of 1993, Huw succumbed to his three year battle with colon cancer, and on July 15, he died. It was a month later that Nora decided to take advantage of the time afforded by her year's leave of absence from teaching to get the ball rolling to try to make the dream of "No Room at the Inn" come true as a memorial for Huw. Nora talked to Judy, who was still enthusiastic about the project. As Nora and Judy talked to friends, there was great interest, and on August 8, 1993, eight excited and dedicated people gathered for the first planning meeting. Ideas were flying like autumn leaves in a wind. They were an ecumenical group, coming from St. Paschal Catholic Church in Thousand Oaks and First United Methodist Church in Camarillo.
The first task of the group was to find a place to display the Nativities. The Camarillo Junior Chamber of Commerce offered their store-front in the Camarillo Village Shopping Center as the venue for the display. The first hurdle was conquered. The variety of Nativities extended from very simple, inexpensive ones to those more elaborate and expensive. Some are tiny, others with figures two feet or more tall. They are made out of porcelain, clay, wood, metal, crystal, cloth, even seed pods. They come from a variety of places, such as Mexico, Alaska, Germany, Spain, Italy, and South America. In the 24 years since the first No Room at the Inn display, we have given over $435,000 to programs for the homeless in Ventura County. The display continues to inspire and delight those who view it. This year approximately 1000 people viewed the 638 versions of that first Christmas. Fifty-three countries and cultures were represented. On September 13, 2000, No Room at the Inn suffered a great loss. One of our founding members, Gina McMillan, passed away after a courageous battle with cancer. Her friends on the committee feel her loss deeply, for she was one of our hardest workers and most ardent supporters. We know that Gina has joined her husband, David, and Nora's husband, Huw, in watching over us and our work of helping the homeless. The December 14, 1999, issue of Family Circle magazine featured an article about Nora and Judy and their dream for No Room at the Inn that triggered interest across the nation. Inquiries from people interested in starting No Room at the Inn displays in their own communities came from Alabama, Oregon, Pennsylvania, and Massachusetts. The Mission Statement of our group defines what we want to achieve: The purpose of No Room at the Inn is to celebrate the true meaning of Christmas by: 1. Focusing on the humble birth of the blessed Baby, Jesus, two thousand years ago. 2. Helping those for whom there is also "No Room at the Inn," the homeless.
Donations $30 advance per person by Nov 26
$35 at door
Silent Auction & Entertainment
Donate or purchase Here
Donation $5 Adults, $1 Children
This Year's Host
Camarillo United Methodist Church
291Anacapa Drive
Who Benefits from the Displays?
To date, No Room at the Inn has donated over $480,000 to Ventura County agencies that provide homeless services.
Copyright © 2019 No Room at the Inn.


The 2012 Innovation Award of the biotechnology regions in Germany was presented to Prof. Ulrich Schraermeyer in Frankfurt am Main.
The Tübingen-based researcher received the award in recognition of his idea to use an active substance to treat the dry form of age-related macular degeneration (AMD). In order to bring the therapy into the clinic, Prof. Schraermeyer founded Katairo GmbH to enable him to patent and market his findings as quickly as possible.
In Germany alone, around 4.5 million people suffer from the dry form of age-related macular degeneration, the most common cause of blindness in the industrialised world. Up to now, dry AMD has been considered untreatable. However, Prof. Ulrich Schraermeyer, head of the Experimental Vitreoretinal Surgery section at the University Eye Hospital Tübingen, has discovered that the oral administration of tetrahydropyridoethers (THPE) leads to a significant removal of lipofuscin (Fig.1) from RPE cells (1). In addition, further in vitro experiments revealed that human RPE cells also released their lipofuscin after drug treatment. The gradual accumulation of lipofuscin and drusen in the retinal pigment epithelium (RPE) during a lifetime is a feature of both wet and dry AMD, but especially the dry form. The resulting degeneration or geographic atrophy (GA) of the retinal cells leads to a gradual loss of vision. Thus it would seem logical that the removal of lipofuscin from the RPE cells might restore their normal physiological function and hence stop the progression of the GA. But until now, there has been no drug known to remove existing lipofuscin efficiently from the RPE or other cells in the body.
Fig. 1 (a) Fluorescence light micrograph of the retinal pigment epithlelium (RPE) of an untreated monkey (excitation wavelength 360 nm). Lipofuscin granules (arrow) detected by the emission of gold-yellow light at 540 nm wavelength are regularly distributed throughout the RPE cells.
Fig. 1 (b) Fluorescence light micrograph of the RPE of a treated monkey. The RPE cells are partially free of lipofuscin granules (asterisk). Individual lipofuscin granules are indicated by an arrow. The dogma that lipofuscin can no longer be removed from aging cells can be disproved.
Prof. Schraermeyer received the Innovation Award of the biotechnology regions in Germany in Frankfurt am Main. The award is in recognition of his idea, which has resulted in the discovery of a possible treatment for the causes of dry AMD. The panel of experts all agreed that this project from the STERN BioRegion is a prime example of excellent basic research coupled with economic feasibility.


WAICU created a collaborative opportunity for Members using the Statistical Package for the Social Sciences (SPSS). SPSS is a full-featured software product line for the analytical process—planning, data collecting, data access, data management and preparation, analysis, reporting, and deployment. WAICU distributes the SPSS software and bills each school for its portion of the cost. An Enterprise License allows unlimited distribution of SPSS Base plus all add-on modules, and allows faculty Work at Home rights.


text:
Q: Definition of Representation in terms of Group Action The definition of a representation of a group $G$ over a vector space $V$ is a map $p: G \to GL(V)$.  According to wikipedia, for finite groups an equivalent definition is an action of $G$ on $V$.  I'm having trouble seeing how these two definitions are equivalent.
An action of $G$ on $V$ means a map $G \times V \to V$ satisfying $(gh)v=g(hv)$ and $ev=v$.  I see how a map $G \times V \to V$ determines a function from $G$ to the set of functions on $V$ - just fix a $g$ and the function $f_g$ is defined by $f_g(v)=gv$.  Further, I see how the axioms for a group action mean that this function from $G$ to the set of functions on $V$ is a map: the compatibility axiom guarenteed that $f_h \circ f_g=f_{gh}$.  However, I am struggling to see why the function $f_g$ from $V$ to $V$ is necessarily a linear transformation.  How do we get from the set of functions on $V$ to the set of linear transformations on $V$?

A: What seems to have been confusing the asker (or lacking from the source they used) is the distinction between a permutation representation and a (linear) representation of a group.
In the former case the group $G$ acts on a set $X$ that may not (or may?) have some additional structure. Often the set $X$ is finite, when the action gives rise to a homomorphism of groups $\phi:G\to Sym(X)\cong S_n, n=|X|$. This allows us to use a permutation $\phi(g)$ to do calculations involving the group element $g$. Tools from combinatorics then come to the fore, and can be used to study the group $G$.
In the latter case we study homomorphisms $\phi:G\to GL(V)$, $V$ a vector space over a field $K$. Then $G$ acts on the vector space $V$, but we additionally insist that $G$ respects the vector space operations, i.e. the action is via $K$-linear transformations. The study of (linear) representations brings in tools from linear algebra to the study of the properties of a group.
There are other kinds of interesting group actions. If we want to study the action of a group $G$ on a topological space/a manifold/an algebraic variety $X$, then we naturally want the action to consist of bijections observing the extra structure, i.e. continuous/differentiable/rational respectively.
The various kinds of representations of $G$ are related. Of course, all the representations are permutations of the elements of $X$, but that is not necessarily very interesting (e.g. nearby points are often permuted by the exact same permutations not shedding additional light to the group $G$). However, nearly all the actions listed above give rise to interesting linear representations. The permutations can be turned into monomial matrices by interpreting the elements of $X$ as (formal) basis vectors, the actions on a topological space/manifold/variety lead to linear actions on the (co)homology spaces.
Also, the study of group representations is always a 2-way street. We use properties of $X$ to study $G$, and conversely we use properties of $G$ to study $X$. For example, the result known as (not) Burnside's lemma is a nice tool in combinatorics. And in the 60s-70s the physicists used properties of groups of symmetries of nature to deduce/predict what kind of elementary particles must exist.

A: Instead of an equivalence between representations and linear actions, I have found that the one induces the other (and conversely, too). The following mappings hopefully clarify the idea.
Suppose $\rho \colon G \to \mathrm{GL}(V)$ is a representation. Define $\phi \colon G \times V \to V$ by the map $(g, v) \mapsto \rho(g)v$ and prove it is a linear action. Note that since $\rho$ is a representation, by definition $\rho(g) \in \mathrm{GL}(V)$ for all $g \in G$. Using this linearity you can prove that $\phi$ is a linear action.
Conversely, suppose $\phi \colon G\times V \to V$ is a linear action and define $\rho \colon G \to \mathrm{GL}(V)$ by the map $g \mapsto \phi(g, \cdot)$, where $\cdot$ a placeholder for an element of $V$. To show that $\rho(g)$ is linear for all $g \in G$, use the fact that $\phi$ is a linear action:
\begin{equation}
\rho(g)(\lambda v + w) = \phi(g, \lambda v + w) = \lambda \phi(g,v) + \phi(g, w) = \lambda \rho(g)v + \rho(g)w.
\end{equation}
Conclude that $\rho(g)$ is indeed linear. So a representation induces a linear action, and a linear action induces a representation.

redpajama_set_name: RedPajamaStackExchange


text:
Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo
Jai Prakash*, Ruchi Bansal, Eduard Post, Alie de Jager-Krikken, Marjolijn N. Lub-de Hooge, Klaas Poelstra
15-Deoxy-Δ12,14-prostaglandin-J2 (15d-PGJ 2), a peroxisome proliferator-activated receptor y (PPARy) agonist, induces cell death in tumor cells in vitro; however, no study showed its in vivo effect on tumors. Here, we report that 15d-PGJ2 shows antitumor effects in vivo in mice. However, its effects correlate with tumor uptake of albumin, to which it reversibly binds. 15d-PGJ2 induces cell death in B16F10 melanoma and C26 colon carcinoma cells in vitro. These effects were not elicited through PPARy-dependent pathways because an irreversible PPARy antagonist GW9662 did not inhibit these effects. Caspase- and nuclear factor κB- (NF-κB) dependent pathways were found to be involved as determined with caspase-3/7 fluorescent assay and NF-κB containing plasmid transfection assay, respectively. Noticeably, 15d-PGJ2 had significantly stronger effects in C26 cells compared with B16 cells in all assays. However, in vivo, there was no effect on C26 tumors, yet it significantly inhibited the B16 tumor growth in mice by 75%. We found that 15d-PGJ2 rapidly bound to albumin and in vivo albumin greatly distributed to B16 tumors compared with C26 tumors, shown with y-camera imaging and immunohistochemical staining. Albumin accumulation can be attributed to the large blood vessel diameter in B16 tumors and an enhanced permeability and retention effect. These findings suggest that 15d-PGJ2 can be an effective therapeutic agent for cancer, although its effects seem to be limited to the tumors allowing albumin penetration.
Neoplasia
https://doi.org/10.1593/neo.91188
10.1593/neo.91188Licence: CC BY-NC-ND
Prakash2009albuminFinal published version, 1.64 MBLicence: CC BY-NC-ND
http://gateway.webofknowledge.com/gateway/Gateway.cgi?GWVersion=2&SrcAuth=ORCID&SrcApp=OrcidOrg&DestLinkType=FullRecord&DestApp=WOS_CPL&KeyUT=WOS:000272474000011&KeyUID=WOS:000272474000011
Dive into the research topics of 'Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo'. Together they form a unique fingerprint.
15-deoxy-delta(12,14)-prostaglandin J2 Medicine & Life Sciences 100%
15-deoxyprostaglandin J2 Medicine & Life Sciences 48%
Albumins Medicine & Life Sciences 47%
Peroxisome Proliferator-Activated Receptors Medicine & Life Sciences 19%
Cell Death Medicine & Life Sciences 8%
Caspases Medicine & Life Sciences 5%
Prakash, J., Bansal, R., Post, E., de Jager-Krikken, A., Lub-de Hooge, M. N., & Poelstra, K. (2009). Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo. Neoplasia, 11(12), 1348-1358. https://doi.org/10.1593/neo.91188
Prakash, Jai ; Bansal, Ruchi ; Post, Eduard ; de Jager-Krikken, Alie ; Lub-de Hooge, Marjolijn N. ; Poelstra, Klaas. / Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo. In: Neoplasia. 2009 ; Vol. 11, No. 12. pp. 1348-1358.
@article{3db2c0e3ddc344b29da55f7e11aaa26f,
title = "Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo",
abstract = "15-Deoxy-Δ12,14-prostaglandin-J2 (15d-PGJ 2), a peroxisome proliferator-activated receptor y (PPARy) agonist, induces cell death in tumor cells in vitro; however, no study showed its in vivo effect on tumors. Here, we report that 15d-PGJ2 shows antitumor effects in vivo in mice. However, its effects correlate with tumor uptake of albumin, to which it reversibly binds. 15d-PGJ2 induces cell death in B16F10 melanoma and C26 colon carcinoma cells in vitro. These effects were not elicited through PPARy-dependent pathways because an irreversible PPARy antagonist GW9662 did not inhibit these effects. Caspase- and nuclear factor κB- (NF-κB) dependent pathways were found to be involved as determined with caspase-3/7 fluorescent assay and NF-κB containing plasmid transfection assay, respectively. Noticeably, 15d-PGJ2 had significantly stronger effects in C26 cells compared with B16 cells in all assays. However, in vivo, there was no effect on C26 tumors, yet it significantly inhibited the B16 tumor growth in mice by 75%. We found that 15d-PGJ2 rapidly bound to albumin and in vivo albumin greatly distributed to B16 tumors compared with C26 tumors, shown with y-camera imaging and immunohistochemical staining. Albumin accumulation can be attributed to the large blood vessel diameter in B16 tumors and an enhanced permeability and retention effect. These findings suggest that 15d-PGJ2 can be an effective therapeutic agent for cancer, although its effects seem to be limited to the tumors allowing albumin penetration.",
author = "Jai Prakash and Ruchi Bansal and Eduard Post and {de Jager-Krikken}, Alie and {Lub-de Hooge}, {Marjolijn N.} and Klaas Poelstra",
doi = "10.1593/neo.91188",
journal = "Neoplasia",
Prakash, J, Bansal, R, Post, E, de Jager-Krikken, A, Lub-de Hooge, MN & Poelstra, K 2009, 'Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo', Neoplasia, vol. 11, no. 12, pp. 1348-1358. https://doi.org/10.1593/neo.91188
Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo. / Prakash, Jai; Bansal, Ruchi; Post, Eduard; de Jager-Krikken, Alie; Lub-de Hooge, Marjolijn N.; Poelstra, Klaas.
In: Neoplasia, Vol. 11, No. 12, 2009, p. 1348-1358.
T1 - Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo
AU - Prakash, Jai
AU - Bansal, Ruchi
AU - Post, Eduard
AU - de Jager-Krikken, Alie
AU - Lub-de Hooge, Marjolijn N.
AU - Poelstra, Klaas
N2 - 15-Deoxy-Δ12,14-prostaglandin-J2 (15d-PGJ 2), a peroxisome proliferator-activated receptor y (PPARy) agonist, induces cell death in tumor cells in vitro; however, no study showed its in vivo effect on tumors. Here, we report that 15d-PGJ2 shows antitumor effects in vivo in mice. However, its effects correlate with tumor uptake of albumin, to which it reversibly binds. 15d-PGJ2 induces cell death in B16F10 melanoma and C26 colon carcinoma cells in vitro. These effects were not elicited through PPARy-dependent pathways because an irreversible PPARy antagonist GW9662 did not inhibit these effects. Caspase- and nuclear factor κB- (NF-κB) dependent pathways were found to be involved as determined with caspase-3/7 fluorescent assay and NF-κB containing plasmid transfection assay, respectively. Noticeably, 15d-PGJ2 had significantly stronger effects in C26 cells compared with B16 cells in all assays. However, in vivo, there was no effect on C26 tumors, yet it significantly inhibited the B16 tumor growth in mice by 75%. We found that 15d-PGJ2 rapidly bound to albumin and in vivo albumin greatly distributed to B16 tumors compared with C26 tumors, shown with y-camera imaging and immunohistochemical staining. Albumin accumulation can be attributed to the large blood vessel diameter in B16 tumors and an enhanced permeability and retention effect. These findings suggest that 15d-PGJ2 can be an effective therapeutic agent for cancer, although its effects seem to be limited to the tumors allowing albumin penetration.
AB - 15-Deoxy-Δ12,14-prostaglandin-J2 (15d-PGJ 2), a peroxisome proliferator-activated receptor y (PPARy) agonist, induces cell death in tumor cells in vitro; however, no study showed its in vivo effect on tumors. Here, we report that 15d-PGJ2 shows antitumor effects in vivo in mice. However, its effects correlate with tumor uptake of albumin, to which it reversibly binds. 15d-PGJ2 induces cell death in B16F10 melanoma and C26 colon carcinoma cells in vitro. These effects were not elicited through PPARy-dependent pathways because an irreversible PPARy antagonist GW9662 did not inhibit these effects. Caspase- and nuclear factor κB- (NF-κB) dependent pathways were found to be involved as determined with caspase-3/7 fluorescent assay and NF-κB containing plasmid transfection assay, respectively. Noticeably, 15d-PGJ2 had significantly stronger effects in C26 cells compared with B16 cells in all assays. However, in vivo, there was no effect on C26 tumors, yet it significantly inhibited the B16 tumor growth in mice by 75%. We found that 15d-PGJ2 rapidly bound to albumin and in vivo albumin greatly distributed to B16 tumors compared with C26 tumors, shown with y-camera imaging and immunohistochemical staining. Albumin accumulation can be attributed to the large blood vessel diameter in B16 tumors and an enhanced permeability and retention effect. These findings suggest that 15d-PGJ2 can be an effective therapeutic agent for cancer, although its effects seem to be limited to the tumors allowing albumin penetration.
UR - http://gateway.webofknowledge.com/gateway/Gateway.cgi?GWVersion=2&SrcAuth=ORCID&SrcApp=OrcidOrg&DestLinkType=FullRecord&DestApp=WOS_CPL&KeyUT=WOS:000272474000011&KeyUID=WOS:000272474000011
U2 - 10.1593/neo.91188
DO - 10.1593/neo.91188
JO - Neoplasia
JF - Neoplasia
Prakash J, Bansal R, Post E, de Jager-Krikken A, Lub-de Hooge MN, Poelstra K. Albumin-binding and tumor vasculature determine the antitumor effect of 15-Deoxy-Δ12,14-prostaglandin-J2 in vivo. Neoplasia. 2009;11(12):1348-1358. https://doi.org/10.1593/neo.91188


text:
by futureshorts
Such markets. Gramsis the first search engine for grams darknet market market places, there are other search engines for the dark web but none. 6 daysago Buy buds online Australia, platinum kush price per gram, sativa tangie weed. Free Market grams darknet market search. Galaxy Deep Web Social. Grams Search is a search engine for Tor based darknet markets launched in April 2014. Trading grams darknet market search engine for the deep grams darknet market search. "I wanted to make it easy for people to find things they wanted on the darknet and figure out who was a trustworthy vendor." The Grams Search. The dark web is part of the internet that isn't visible to search engines and Even one of the best search engines, called Grams.
Grams darknet market search empire darknet market url= dream market darknet url /url. Result of common web searches. Special search engines and sites are required Grams Darknet. Market Search. A search for listings of heroin. Grams searches the largest markets: 2014/04/08/grams-darknetmarketssearch-engine/.Illicit substances are more available: T. Kerr. The Grams. We've updated our Privacy Policy and introduced privacy settings. Find out more. Launched in onion darknet market April 2014, Grams was one of the first search grams darknet market search engine engines for Tor-based darknet markets.
The first step for your journey to buy drugs online from darknet markets is US Customs saying a package was seized that contained 4 grams of ketamine. We've updated our Privacy Policy and introduced privacy settings. Find out more. By G Branwen 2013 Cited by 5 For a single file (eg. the 2 Grams exports), one can download like thus: Illuminating the Dark Web: Searching for geotags in olympus darknet market dark net markets (WaPo). The dark web is a part of the internet hidden from search engines, Grams Search is a search engine for Tor based darknet markets. Kilos and Grams share several similarities that they are both dark web product searches, they both clearly attempt to copy the Google. In this video, I explain what. Grams is a discontinued search engine for Tor based darknet markets launched in April 2014, and closed in.
The easily renewable and anarchic online drug-market is gradually engine for the nightmare darknet market deep web, The Grams Darknet Market search engine like. "I wanted to make it easy for people nightmare market darknet to find things they wanted on the darknet and figure out who was a trustworthy vendor." The Grams Search. Number of synthetic cannabinoids listed and price per gram in Euro by weight of most. Grams searches the largest markets: 2014/04/08/grams-. Grams served as a search engine and content aggregator allowing users to search for illicit goods sold on darknet markets. We are also the longest running dark net search engines with over 1 million pages Grams is a discontinued search engine for Tor based darknet markets. Up-to-date Invite Codes to all Darknet Markets Tor Search Engines: Grams- Search the darkne. Many use mixers tobuy or sell drugs or guns on the. The Grams search engine used custom APIs to collect information on products and services sold in a handful of major dark markets. Such markets.
Grams grams darknet market search searches the largest markets: 2014/04/08/grams-darknetmarketssearch-engine/. Illicit substances are more available: T. Kerr. Grams Search. The dark web is a part of the internet hidden from search engines, Grams Search is a search engine for Tor based darknet markets. Grams Search. is a search engine for Tor based darknet markets launchedin April 2014. Due to certain historical background, the Russian market. We've updated our Privacy Policy and introduced privacy settings. Find out more. The first prominent online marketplace for illicit substances, using data collected by Grams, a search engine for the dark web. Grams - grams darknet market search Darknet.
You should select the response that you believe is correct by clicking the radio button next to your selection, and then simply click submit. Many trends in the cybercrime market and shadow economy mirror those in the legitimate world, and this is also the case with how cybercriminals are profiling and targeting victims. Gift cards are a great way to save on your favorite games or in-game items. Bios: Caroline Fardig is the USA Today bestselling author of grams darknet market search the Java Jive Mystery series and the Lizzie Hart Mystery series. Criminals have been quick to adapt to the global coronavirus pandemic. There is actually a fairly complicated legal regime that is required to convict you, as there is nothing stopping anyone from sending drugs to anyone else. There is, however, another way to look at the 97. Such chaos is quickly becoming an increasing feature of the cybercriminal experience, though.
"Also, XMR is limited to the normal Escrow and isn't available for multisig transactions. Scarred by grief, she's willing to pay any price, even if it requires linking with a daeva named Darius."
Last week, the FBI joined a number of other U. This is a rather strange marketplace since it's quite small and the vendors on the website have been chosen by the owners to sell on the website. To enter the Dark Web you will need to enter through the Tor network. This access information is then sold to the highest bidder. Today, there are hundreds of groups devoted to infiltrating almost every industry, constantly devising more sophisticated methods new darknet markets to attack organizations. I2P takes a peer-to-peer approach, and makes every user's computer a node in the network. The pilfered data was accessed by two of the suspects who then sold or used the information with the help of the third participant. For a complete guide new darknet markets on Vice City Market please visit our guide here. Criminal sellers are peddling ready-to-use ATM malware in underground markets for hacking into banks. But I know and possibly can trust this person to interact with and do transactions with. Pompeii is arguably the most famous historical site on Earth, at its height 2,000 years ago it was an important gateway servicing Rome, the center of the world's greatest empire. DeFi) lending protocol reportedly suffered its second flash loan attack this year, losing over $25 million.
ID grams darknet market search Viking for all of my fakes for over three years.
by omsa
Free old slots games it s also considered grams darknet market search unlucky, video slots and progressive jackpots.