text:
import os
import json
import unittest
from partialView.partialView import PartialView, PodDescriptor

class TestPartialView(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        pass

    def setUp(self):
        self.partialView = PartialView("172.0.1.0")
        self.descriptors = []
        self.ips = ["172.0.1.1", "172.0.1.2", "172.0.1.3", "172.0.1.4", "172.0.1.5"]
        for ip in self.ips:
            self.descriptors.append(PodDescriptor(ip))

    # Limit should be equal to VIEW_LIMIT and shuffle_length should be equal to SHUFFLE_LENGTH
    def test_set_up_ok(self):
        self.assertEqual(self.partialView.limit, int(os.environ['VIEW_LIMIT']))
        self.assertEqual(self.partialView.shuffle_length, int(os.environ['SHUFFLE_LENGTH']))

    # Initial partialView should be empty
    def test_initial_partial_view_empty(self):
        self.assertEqual(self.partialView.size, 0)
        self.assertTrue(self.partialView.is_empty())

    # Method is_full should return false if partial view is not full
    def test_initial_partial_view_should_not_be_full(self):
        self.assertFalse(self.partialView.is_full())

    # Method is_full should return true if partial view is full
    def test_is_full_should_return_true_if_full(self):
        for i in range(self.partialView.limit):
            self.partialView.add_peer(self.descriptors[i])
        self.assertTrue(self.partialView.is_full())
        self.assertEqual(self.partialView.size, self.partialView.limit)

    # Method add_peer should return false if peer already contained
    def test_add_peer_should_return_false_if_peer_already_contained(self):
        peer = PodDescriptor("A new IP")
        self.partialView.add_peer(peer)
        size = self.partialView.size
        duplicated = PodDescriptor("A new IP")
        success = self.partialView.add_peer(duplicated)
        self.assertFalse(success)
        self.assertEqual(self.partialView.size, size)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Method add_peer should not allow to insert a self entry
    def test_add_peer_should_not_allow_self_entry(self):
        ip = "my ip"
        p1 = PartialView(ip)
        peer = PodDescriptor(ip)
        size = self.partialView.size
        success = p1.add_peer(peer)
        self.assertFalse(success)
        self.assertFalse(p1.contains_ip(ip))
        self.assertEqual(p1.size, size)

    # Method add_peer should allow to insert a self entry if forced
    def test_add_peer_with_allow_self_should_allow_self_entry(self):
        ip = "my ip"
        p1 = PartialView(ip)
        peer = PodDescriptor(ip)
        size = self.partialView.size
        success = p1.add_peer(peer, True)
        self.assertTrue(success)
        self.assertTrue(p1.contains_ip(ip))
        self.assertEqual(p1.size, size + 1)

    # Method add_peer should increment size if view is not full
    def test_add_peer_should_increment_size_if_not_full(self):
        size = self.partialView.size
        peer = PodDescriptor("A new IP")
        self.partialView.add_peer(peer)
        self.assertTrue(self.partialView.contains(peer))
        self.assertEqual(self.partialView.size, size + 1)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Method add_peer should not increment size if view is full
    def test_add_peer_should_not_increment_size_if_full(self):
        peer = PodDescriptor("A new IP")
        for i in range(self.partialView.limit):
            self.partialView.add_peer(self.descriptors[i])
        size = self.partialView.size
        success = self.partialView.add_peer(peer)
        self.assertFalse(success)
        self.assertFalse(self.partialView.contains(peer))
        self.assertEqual(self.partialView.size, size)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Method add_peer_ip should return false if peer already contained
    def test_add_peer_ip_should_return_false_if_peer_already_contained(self):
        peer = "A new IP"
        self.partialView.add_peer_ip(peer)
        size = self.partialView.size
        duplicated = "A new IP"
        success = self.partialView.add_peer_ip(duplicated)
        self.assertFalse(success)
        self.assertEqual(self.partialView.size, size)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Method add_peer_ip should not allow to insert a self entry
    def test_add_peer_ip_should_not_allow_self_entry(self):
        ip = "my ip"
        p1 = PartialView(ip)
        size = self.partialView.size
        success = p1.add_peer_ip(ip)
        self.assertFalse(success)
        self.assertFalse(p1.contains_ip(ip))
        self.assertEqual(p1.size, size)

    # Method add_peer_ip should allow to insert a self entry if forced
    def test_add_peer_ip_with_allow_self_should_allow_self_entry(self):
        ip = "my ip"
        p1 = PartialView(ip)
        size = self.partialView.size
        success = p1.add_peer_ip(ip, True)
        self.assertTrue(success)
        self.assertTrue(p1.contains_ip(ip))
        self.assertEqual(p1.size, size + 1)

    # Method add_peer_ip should increment size if view is not full
    def test_add_peer_ip_should_increment_size_if_not_full(self):
        size = self.partialView.size
        peer = "A new IP"
        self.partialView.add_peer_ip(peer)
        self.assertTrue(self.partialView.contains_ip(peer))
        self.assertEqual(self.partialView.size, size + 1)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Method add_peer_ip should not increment size if view is full
    def test_add_peer_ip_should_not_increment_size_if_full(self):
        peer = "A new IP"
        for i in range(self.partialView.limit):
            self.partialView.add_peer(self.descriptors[i])
        size = self.partialView.size
        success = self.partialView.add_peer_ip(peer)
        self.assertFalse(success)
        self.assertFalse(self.partialView.contains_ip(peer))
        self.assertEqual(self.partialView.size, size)
        self.assertEqual(self.partialView.size, len(self.partialView.peer_list))

    # Initial age should be zero
    def test_initial_age_peer(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5"))
        self.assertEqual(self.partialView.peer_list[0].age, 0)

    # Initial age should be zero
    def test_initial_age_peer_ip(self):
        self.partialView.add_peer_ip("172.0.1.5")
        self.assertEqual(self.partialView.peer_list[0].age, 0)

    # Method get_peer_ip_list should return a list of ips
    def test_get_peer_ip_list_returns_ips(self):
        for ip in self.ips:
            self.partialView.add_peer_ip(ip)
        self.assertEqual(self.partialView.get_peer_ip_list(), self.ips[:self.partialView.limit])

    # Initial age should be zero
    def test_partial_view_size_limit(self):
        for ip in self.ips:
            self.partialView.add_peer_ip(ip)
        self.assertEqual(self.partialView.size, self.partialView.limit)
        self.assertTrue(self.partialView.is_full())

        for i in range(self.partialView.limit):
            self.assertEqual(self.partialView.peer_list[i].ip, self.ips[i])

    def test_contains_return_true_if_contained(self):
        for descr in self.descriptors:
            self.partialView.add_peer(descr)
        for descr in self.descriptors[:self.partialView.size]:
            self.assertTrue(self.partialView.contains(descr))
        for descr in self.descriptors[self.partialView.size:]:
            self.assertFalse(self.partialView.contains(descr))

    def test_contains_ip_return_true_if_contained(self):
        for ip in self.ips:
            self.partialView.add_peer_ip(ip)
        for ip in self.ips[:self.partialView.size]:
            self.assertTrue(self.partialView.contains_ip(ip))
        for ip in self.ips[self.partialView.size:]:
            self.assertFalse(self.partialView.contains_ip(ip))

    # Age should be incremented by one
    def test_increment(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 1))
        self.partialView.add_peer(PodDescriptor("172.0.1.7", 3))
        self.partialView.increment()
        self.assertEqual(self.partialView.peer_list[0].age, 2)
        self.assertEqual(self.partialView.peer_list[1].age, 4)

    # Sort should sort view by peer's age
    def test_sort(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(PodDescriptor("172.0.1.8", 1))
        self.partialView.sort()
        self.assertEqual(self.partialView.peer_list[0].ip, "172.0.1.8")
        self.assertEqual(self.partialView.peer_list[1].ip, "172.0.1.5")
        self.assertEqual(self.partialView.peer_list[2].ip, "172.0.1.4")

    # Method sample_descriptors should return an empty list if view is empty
    def test_sample_descriptors_should_return_empty_list_if_empty_view(self):
        sample = self.partialView.sample_descriptors(3)
        self.assertEqual(len(sample), 0)
        self.assertEqual(sample, [])
        self.assertTrue(isinstance(sample, list))

    # Method sample_descriptors should return a list of size element if the view's size is less than the limit given as parameter
    def test_sample_descriptors_should_return_less_than_limit_peers_if_size_less_than_limit(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        size = self.partialView.size
        sample = self.partialView.sample_descriptors(3)
        self.assertEqual(len(sample), size)

    # Method sample_descriptors should return a list of limit peers despite the size of the the view is greater then limit
    def test_sample_descriptors_should_return_no_more_than_limit_peers(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(PodDescriptor("172.0.1.9", 4))
        limit = 2
        size = self.partialView.size
        sample = self.partialView.sample_descriptors(limit)
        self.assertNotEqual(limit, size)
        self.assertEqual(len(sample), limit)

    # Method sample_descriptors should return a list of 1 peer and avoid the peer given as parameter
    def test_sample_descriptors_with_avoid_peer_more_than_limit(self):
        to_avoid = PodDescriptor("172.0.1.9", 4)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(to_avoid)
        limit = 1
        sample = self.partialView.sample_descriptors(limit, to_avoid)
        self.assertEqual(len(sample), limit)
        self.assertFalse(to_avoid in sample)

    # Method sample_descriptors should return a list of 2 peers and avoid the peer given as parameter
    def test_sample_descriptors_with_avoid_peer_less_than_limit(self):
        to_avoid = PodDescriptor("172.0.1.9", 4)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(to_avoid)
        limit = 3
        sample = self.partialView.sample_descriptors(limit, to_avoid)
        self.assertEqual(len(sample), 2)
        self.assertFalse(to_avoid in sample)

    # Method sample_descriptors should return a list of 3 peers if the peer to avoid is not contained in the view
    def test_sample_descriptors_with_avoid_peer_not_in_view(self):
        to_avoid = PodDescriptor("172.0.1.9", 4)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(PodDescriptor("172.0.1.10", 8))
        limit = 3
        sample = self.partialView.sample_descriptors(limit, to_avoid)
        self.assertEqual(len(sample), limit)
        self.assertFalse(to_avoid in sample)

    # Method sample_ips should return a list of 3 ips
    def test_sample_ips_should_return_a_list_of_ips(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
        self.partialView.add_peer(PodDescriptor("172.0.1.10", 8))
        limit = 3
        sample = self.partialView.sample_ips(limit)
        self.assertIn("172.0.1.5", sample)
        self.assertIn("172.0.1.4", sample)
        self.assertIn("172.0.1.10", sample)

    # Method sample_ips should return a list of 3 ips loadable by epto
    # def test_sample_ips_should_return_a_list_of_ips_loadable_by_epto(self):
    #     self.partialView.add_peer(PodDescriptor("172.0.1.5", 2))
    #     self.partialView.add_peer(PodDescriptor("172.0.1.4", 3))
    #     self.partialView.add_peer(PodDescriptor("172.0.1.10", 8))
    #     sample = json.dumps(self.partialView.sample_ips(2))
    #     # EpTO's code when EpTO invokes get_k_view()
    #     view = [ip.encode('ascii', 'ignore') for ip in json.loads(sample)]
    #     for destination in view:
    #         self.assertIsInstance(destination, str)
    #         self.assertIn(destination, self.partialView.get_peer_ip_list())

    # Test the exchange of views.
    # P1 plays the role of P while P2 plays the role of Q described in comments
    def test_exchange_views(self):

        p1 = PartialView("First IP", 4, 3)
        p1.add_peer(PodDescriptor("172.0.1.6", 0))
        p1.add_peer(PodDescriptor("172.0.1.3", 2))
        p1.add_peer(PodDescriptor("172.0.1.5", 3))
        p1.add_peer(PodDescriptor("Second IP", 5))

        p2 = PartialView("Second IP", 4, 3)
        p2.add_peer(PodDescriptor("172.0.1.3", 0))
        p2.add_peer(PodDescriptor("172.0.1.5", 1))
        p2.add_peer(PodDescriptor("172.0.1.2", 2))
        p2.add_peer(PodDescriptor("172.0.1.1", 4))

        ########################
        # P1 starts the exchange
        ########################

        # 1) Increase by one the age of all neighbors
        p1.increment()
        # 2) Select neighbor Q with the highest age among all neighbors.
        oldest = p1.get_oldest_peer()
        # 3) Select l - 1 other random neighbors (meaning avoid oldest).
        request = p1.select_neighbors_for_request(oldest)
        # 4) Replace Q's entry with a new entry of age 0 and with P's address.
        request.add_peer_ip(p1.ip, allow_self_ip=True)

        self.assertTrue(request.is_full())
        self.assertEqual(request.size, p1.shuffle_length)

        ################################################
        # P2 receives neighbors and prepares a reply
        ################################################

        reply = p2.select_neighbors_for_reply()

        self.assertTrue(request.is_full())
        self.assertEqual(request.size, p1.shuffle_length)

        # Note that in p1 the oldest is p2
        # p1 and p2 know two peers in common
        # p2 does not have an entry with p1's ip
        # p1.merge should:
        # - Discard 172.0.1.3 and 172.0.1.5
        # - Put in unknown list 172.0.1.2, 172.0.1.1

        # 6) I remove the oldest peer from my view
        p1.remove_peer(oldest)
        p1.merge(request, reply)

        self.assertTrue(p1.is_full())
        for peer in reply.get_peer_list():
            self.assertTrue(p1.contains(peer))

        self.assertLessEqual(self.partialView.size, self.partialView.limit)

    # Test the exchange of views.
    # P1 plays the role of P while P2 plays the role of Q described in comments
    # def test_exchange_views_2(self):
    #
    #     p1 = PartialView("First IP", 4, 3)
    #     p1.add_peer(PodDescriptor("172.0.1.6", 0))
    #     p1.add_peer(PodDescriptor("172.0.1.3", 2))
    #     p1.add_peer(PodDescriptor("172.0.1.5", 3))
    #     p1.add_peer(PodDescriptor("Second IP", 5))
    #
    #     p2 = PartialView("Second IP", 4, 3)
    #     p2.add_peer(PodDescriptor("172.0.1.3", 0))
    #     p2.add_peer(PodDescriptor("172.0.1.5", 1))
    #     p2.add_peer(PodDescriptor("172.0.1.2", 2))
    #     p2.add_peer(PodDescriptor("First IP", 4))
    #
    #     ########################
    #     # P1 starts the exchange
    #     ########################
    #
    #     # 1) Increase by one the age of all neighbors
    #     p1.increment()
    #     # 2) Select neighbor Q with the highest age among all neighbors.
    #     oldest = p1.get_oldest_peer()
    #     # 3) Select l - 1 other random neighbors (meaning avoid oldest).
    #     request = p1.select_neighbors_for_request(oldest)
    #     # 4) Replace Q's entry with a new entry of age 0 and with P's address.
    #     request.add_peer_ip(p1.ip, allow_self_ip=True)
    #
    #     self.assertTrue(request.is_full())
    #     self.assertEqual(request.size, p1.shuffle_length)
    #
    #     ################################################
    #     # P2 receives neighbors and prepares a reply
    #     ################################################
    #
    #     reply = p2.select_neighbors_for_reply()
    #
    #     self.assertTrue(request.is_full())
    #     self.assertEqual(request.size, p1.shuffle_length)
    #
    #     # Note that in p1 the oldest is p2
    #     # p1 and p2 know two peers in common
    #     # p2 does have an entry with p1's ip
    #     # p1.merge should:
    #     # - Discard 172.0.1.3 and 172.0.1.5 because are well known
    #     # - Discard First IP because self ip is not allowed
    #
    #     # 6) I remove the oldest peer from my view
    #     p1.remove_peer(oldest)
    #     p1.merge(request, reply)
    #
    #     for peer in reply.get_peer_list():
    #         if peer != p1.ip:
    #             self.assertTrue(p1.contains(peer))
    #
    #     self.assertLessEqual(self.partialView.size, self.partialView.limit)

    # Method get_oldest_peer should return a PodDescriptor
    def test_get_oldest_peer_should_return_none_if_empty_view(self):
        oldest = self.partialView.get_oldest_peer()
        self.assertEqual(oldest, None)

    # Method get_oldest_peer should return a PodDescriptor
    def test_get_oldest_peer_should_return_a_pod_descriptor(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 1))
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        oldest = self.partialView.get_oldest_peer()
        self.assertTrue(isinstance(oldest, PodDescriptor))

    # Method get_oldest_peer should return the peer with the highest age
    def test_get_oldest_peer(self):
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(PodDescriptor("172.0.1.4", 1))
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        oldest = self.partialView.get_oldest_peer()
        self.assertEqual(oldest.ip, "172.0.1.5")
        self.assertEqual(oldest.age, 4)

    def test_select_neighbors_for_request_should_return_a_non_full_view(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        neighbors = self.partialView.select_neighbors_for_request(oldest)
        self.assertFalse(neighbors.is_full())
        self.assertEqual(neighbors.size, neighbors.shuffle_length - 1)

    def test_select_neighbors_for_request_should_not_contain_oldest_peer(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        neighbors = self.partialView.select_neighbors_for_request(oldest)
        self.assertFalse(neighbors.contains(oldest))

    def test_select_neighbors_for_request_and_add_peer_should_return_full_view(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        neighbors = self.partialView.select_neighbors_for_request(oldest)
        neighbors.add_peer_ip(self.partialView.ip, allow_self_ip=True)
        self.assertEqual(neighbors.size, self.partialView.shuffle_length)
        self.assertTrue(neighbors.is_full())

    def test_select_neighbors_for_reply_should_return_a_full_view(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        neighbors = self.partialView.select_neighbors_for_reply(oldest)
        self.assertTrue(neighbors.is_full())
        self.assertEqual(neighbors.size, neighbors.shuffle_length)

    def test_select_neighbors_for_reply_should_contain_avoid_peer_if_size_eq_shuffle_length(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        neighbors = self.partialView.select_neighbors_for_reply(oldest)
        self.assertTrue(neighbors.is_full())
        self.assertEqual(neighbors.size, neighbors.shuffle_length)

    def test_select_neighbors_for_reply_should_not_contain_oldest_peer(self):
        oldest = PodDescriptor("172.0.1.4", 1)
        self.partialView.add_peer(PodDescriptor("172.0.1.6", 2))
        self.partialView.add_peer(oldest)
        self.partialView.add_peer(PodDescriptor("172.0.1.5", 4))
        neighbors = self.partialView.select_neighbors_for_reply(oldest)
        self.assertFalse(neighbors.contains(oldest))

    def test_empty_partial_view_to_json(self):
        jsonized = self.partialView.to_json()
        self.assertEqual(jsonized, {"ip": "172.0.1.0", "limit": 3, "shuffle_length": 2, "peer_list": [], "size": 0})

    def test_unmarshal_partial_view(self):
        for ip in self.ips:
            self.partialView.add_peer_ip(ip)
        jsonized = self.partialView.to_json()
        partial_view = PartialView.from_dict(jsonized)
        self.assertIsInstance(partial_view, PartialView)
        for peer in partial_view.peer_list:
            self.assertIsInstance(peer, PodDescriptor)
        self.assertEqual(partial_view.ip, self.partialView.ip)
        self.assertEqual(partial_view.size, 3)
        self.assertEqual(partial_view.limit, 3)

        for i in range(self.partialView.limit):
            self.assertEqual(partial_view.peer_list[i].ip, self.descriptors[i].ip)
            self.assertEqual(partial_view.peer_list[i].age, self.descriptors[i].age)

    # Every time the view size is checked if it is equal to the actual size
    def tearDown(self):
        self.assertEqual(len(self.partialView.peer_list), self.partialView.size)

if __name__ == '__main__':
    unittest.main()


text:
Volkswagen Golf GTI Edition 30 is the fastest and most powerful yet
Oct 28th 2006 at 8:17PM
As Sam mentioned yesterday, the Volkswagen Golf GTI turned thirty this year. You can read about the history of this venerable hot hatchback in his post or keep reading to see what VW has in mind to mark the occassion today. The short version is that after 30 years the Golf GTI is still screamin'. The smaller the car is, the better its fuel economy. Usually. With the Golf GTI, the emphasis has always been on speed and style. The 30th anniversary gives VW a chance to celebrate with the fastest and most powerful GTI yet with the Golf GTI Edition 30, available early next year. The Edition 30 hits 62 mph in 6.8 seconds and has a top speed of 150 mph. Fill this thing with biofuel and we're in business.
You can read VW's press release and check out another picture after the jump.
[Source: Volkswagen]
GOLF GTI CELEBRATES 30TH ANNIVERSARY WITH LIMITED EDITION MODEL
The fastest and most powerful production Golf GTI yet is set to kick off celebrations as 2007 marks the 30th anniversary of the original hot hatch – the Mk1 Golf GTI. Despite three decades having passed since the defining GTI was conceived, the spirit of the original is still very much alive in the new Golf GTI Edition 30.
At its heart is an uprated version of the 2.0-litre, ultra-responsive four-cylinder T-FSI engine fitted to the standard GTI. The result is 230 PS – a rise of 30 PS over the standard car. This is mated to a choice of six-speed manual or sequential DSG gearboxes channelling drive through the front wheels.
The new Golf GTI Edition 30 will sprint to 62 mph in only 6.8 seconds (6.6 secs when equipped with DSG) before reaching a maximum of 150 mph.
Joining the dynamic tweaks is a fresh new look for the GTI Edition 30. New body-coloured side skirts are paired with a new chin spoiler for the front bumper and a body-coloured rear bumper. A subtle 'GTI' badge sits on the bootlid below tinted rear lights. Completing the look are a set of unique 18-inch 'Pescara' alloy wheels.
Inside, the GTI Edition 30 benefits from unique sports seats finished in 'Interlagos' cloth trim and completed with leather side bolsters and headrest. The distinctive golf ball gear knob synonymous with the Mk1 GTI also makes a welcome comeback. Elsewhere silver sill plates featuring a unique 'Edition 30' logo are joined by the sculpted leather GTI steering wheel complete with red stitching.
Equipment levels for the Edition 30, as on the standard GTI, are high, with ABS, ESP (Electronic Stabilisation Programme), six airbags, radio/CD player, 2Zone electronic climate control and twin chrome exhaust tailpipes all featured.
Just 1,500 examples of the GTI Edition 30 will be available from early January with a range of six paint colours ranging from Candy White to the searing Tornado Red. Prices for the anniversary model start at just over £22,000 for the three-door model, with a £1,330 premium for the DSG-equipped car. The GTI Edition 30 is also available with five doors for an additional £500.
The right hand drive Mk1 Golf GTI – developing a modest 112 bhp – went on sale in the UK in 1977. At the time Leo Sayer was at number one, Star Wars gripped a generation of kids, Concorde was about to take flight for the first time and Volkswagen's new GTI cost £5,217. The Golf GTI, with its mix of a low kerb weight and a fast-revving four-cylinder engine, sharpened suspension and subtly aggressive looks, became an instant hit. By the time the Mk1 GTI was phased out in 1984 over 19,500 examples had been sold in the UK.

redpajama_set_name: RedPajamaCommonCrawl


text:
Tag: price
What's It Price?
Music video production companies are production firms that produce music videos. Blue Sky Mining" was another globally profitable album, charting top 5 in many elements of Europe and top 20 within the U.S. Again dwelling it received the band 5 ARIA Awards and was certified five times platinum. The core objective of this group is to make extra people take heed to classical and light acoustic music and admire it. As for the visionary targets, the strategic dilemma of the business arises.
His albums function people songs and songs that he writes himself. About this time, the band 'Jefferson Airplane' recorded their debut album which was additionally the first LP to return out of the new San Franciscan music scene. With so many other artists and bands out there, it is necessary that you just take the necessary steps to stand out from the gang and not just fade into the background.
Moore was a lifetime resident of Hartford who additionally owned the David Moore Retailer, promoting organs, pianos, phonographs, and other musical instruments, along with music books, especially gospel. Their friends voted the song Finest Rock Work" on the APRA Awards making Birds of Tokyo the one artist in …
September 9, 2018 May 21, 2018 Madisonmusic companyprice, whats


text:
Drew Stafford re-signs with the Winnipeg Jets
The Jets have secured his services for two more years.
Drew Mindell
Photo Credit: Rodney Braun
Initial Report
Per a tweet from Drew Stafford's agent Scott Bartlett, the pending UFA forward is "closing in on a deal to remain a Winnipeg Jet" (sic).
The forward, initially acquired from Buffalo as part of the Evander Kane trade, is set to become an unrestricted free agent tomorrow, on July 1st.
In 26 regular season games with the Jets, Stafford tallied 19 points (9 goals, 10 assists). In the 4 playoff games the Jets played, Stafford scored 1 goal and 1 assist.
For his career, Stafford has 341 points (154 goals, 187 assists) in 589 regular season games.
Stafford is coming off of a 4 year, $16.0 million dollar contract, and will turn 30 during the 2015-16 NHL season.
More to come, as developments warrant
Per Craig Custance of ESPN.com, it's a 2 year contract between Drew Stafford and the Winnipeg Jets.
Per Elliotte Friedman, it's a 2 year, $8.7 million dollar contract for Drew Stafford with the Jets. Salary cap hit of $4.35 million per season.
The Winnipeg Jets have officially confirmed that Drew Stafford has been re-signed to a 2 year, $8.7 million dollar contract extension.
Here is the official release from the Jets:
JETS AGREE TO TERMS WITH DREW STAFFORD
The Winnipeg Jets are pleased to announce they have re-signed unrestricted forward Drew Stafford on two-year contract with an average annual value of $4.35 million.
Stafford, 29, was acquired by the Jets in a trade on Feb. 11, 2015 that also brought Tyler Myers, Joel Armia, Brendan Lemieux and a 2015 first-round pick (Jack Roslovic) from Buffalo in exchange for Zach Bogosian, Evander Kane and Jason Kasdorf.
Stafford had 18 goals and 25 assists for 43 points in 76 games last season including nine goals and 19 points in 26 games after being acquired by Winnipeg. Stafford led all Jets with a season-high nine game point streak from Mar. 12-29, 2015. The native of Faribault, MN spent the previous eight seasons in Buffalo after being drafted by the Sabres in the first round, 13th over-all in 2004. He had a career-high 31 goals with Buffalo in 2010-11. In 589 career NHL games, Stafford has 154 goals and 341 points.
Prior to playing professional hockey, Stafford attended the University of North Dakota and won a gold medal with the United States at the 2004 World Junior Championship.
#12-Drew Stafford
Right Wing
Born: Oct. 30 1985 — Milwaukee, WI
Height 6.02 — Weight 214 — Shoots R
— Regular Season — —- Playoffs —-
Season Team Lge GP G A Pts PIM GP G A Pts PIM
2003-04 U. of North Dakota WCHA 36 11 21 32 30
2006-07 Rochester Americans AHL 34 22 22 44 30 — — — — —
2006-07 Buffalo Sabres NHL 41 13 14 27 33 10 2 2 4 4
2007-08 Buffalo Sabres NHL 64 16 22 38 51 — — — — —
2009-10 Buffalo Sabres NHL 71 14 20 34 35 3 0 0 0 0
2012-13 Buffalo Sabres NHL 46 6 12 18 21 — — — — —
2014-15 Winnipeg Jets NHL 26 9 10 19 8 4 1 1 2 0
NHL Totals 589 154 187 341 335 24 4 5 9 6
Related TopicsDrew StaffordWinnipeg Jets
Winnipeg Jets Morning Papers


Mostly sunny, with a high near 72. West wind 6 to 15 mph, with gusts as high as 30 mph. New rainfall amounts less than a tenth of an inch possible.
Showers and thunderstorms likely. Mostly cloudy, with a low around 47. West wind 12 to 15 mph, with gusts as high as 29 mph. Chance of precipitation is 60%. New rainfall amounts between a tenth and quarter of an inch possible.
A slight chance of rain showers before 8am. Mostly sunny, with a high near 60. West wind around 13 mph. Chance of precipitation is 20%. New rainfall amounts less than a tenth of an inch possible.
Rain showers likely. Partly sunny, with a high near 63. Southwest wind 3 to 9 mph. Chance of precipitation is 70%. New rainfall amounts between a quarter and half of an inch possible.
Rain showers likely. Mostly cloudy, with a low around 50. Chance of precipitation is 70%. New rainfall amounts between a quarter and half of an inch possible.
Rain showers likely. Mostly cloudy, with a high near 59. Chance of precipitation is 70%.
A chance of rain showers before 9pm. Partly cloudy, with a low around 36. Chance of precipitation is 30%.
... A cold front will bring rain and isolated thunderstorms during the early afternoon/evening hours. Temperatures will continue to be above the climatological average throughout the week.
Currently some isolated rain showers are being observed on the radar ahead of the cold front in Eastern Ohio, however due to the lack of daytime heating cells remain elevated and have lack of growth. As the day progresses, low level winds will increase due to a tightening pressure gradient and daytime heating will mix these winds aloft to the surface; 30-35kt gusts may occur ahead of the front.
Model timing of the cold front remains relatively consistent from yesterday, a broken line of showers/thunderstorms will move northwest to southeast during the afternoon. Likely pops currently remain northwest of the Pittsburgh metro area for the afternoon commute. The Day 1 convective outlook continues to place our region under a 'Marginal' risk for severe storms. The main threat for these storms will be high winds due to high effective wind shear. Overnight lows and daytime highs will range from 5 to 10 degrees warmer than the previous 24 hour period.
SHORT TERM /WEDNESDAY THROUGH THURSDAY/... Likely pops continue Tuesday evening, with only a lingering shower possible from Morgantown to the south and east Wednesday morning. The models continue the trend of pushing the front well south of the region, moving as far south as Kentucky and Virginia before rising back to the north again Thursday with an additional wave of low pressure. Temperatures will remain a couple degrees above normal.
LONG TERM /THURSDAY NIGHT THROUGH MONDAY/... It remains to be seen whether the southern stream storm will be able to phase with the northern jet stream, and this will likely determine just how much rain coverage there is Thursday night. For now have introduced likely pops south and east of Pittsburgh, but this may expand in future forecasts. The low will continue to develop as it moves east, and all rain should come to an end by Friday evening. High pressure will build in briefly on Saturday, then the ECMWF/GFS diverge in the path of the next system, the GFS taking a more northern route across the Great Lakes while the ECMWF generally stays south of the Great Lakes and goes through the Mid-Atlantic states. Went with chance pops Saturday night and Sunday before drying out pops Sunday night and introducing pops once again on Monday with another system developing in the Plains. Overall, temperatures will be near or above normal through the extended period.


text:
Open Research Gets a Boost from Scholarly Commons
Last updated May 24, 2018 0
The process of research seems simple from the outside: read, experiment, publish, and repeat. Yet, paywalls formed by national or cultural groups is a barrier to scholarly communication. Scholarly Commons and its working group, the Scholarly Commons Working Group, seek to change that. In their effort to advance scholarship dissemination, more work would ensure the enhanced inclusion of all who wish to participate in science.
Open research should be inclusive and facilitate the participation of all stakeholders of science. Although publications in journals and scholarly communication initiatives, largely drive research narratives, North American and Western European perspectives often dominate these narratives. This may result in the exclusion of diverse voices from around the world. Now, Scholarly Commons aims to move from open access to a diverse and inclusive open access
Scholarly Commons
Scholarly Commons is a group created by the Future of Research Communications and e-Scholarship (FORCE 11). At its most fundamental level, the group believes that scholarly communication should be open and accessible for all to participate in.
Accordingly, Scholarly Commons has established principles to guide practicing and supporting research that is engaging with all parties:
Knowledge producers and users agree to share the Scholarly Commons
Research and knowledge should be freely accessible
All who desire to participate in research should be free to do so
In an effort to support researchers from around the world to participate in this community, the commons created three rules:
All members are equal and are granted access, opportunity, and attribution for sharing or using knowledge
There are no preferences for research methods
Any outside systems (that may reward users) must not violate the rules and principles of the commons
Opening up Research
In an effort to keep their progress going, the commons established the Scholarly Commons Working Group, which facilitates these objectives. To do so, they meet regularly to assess the effectiveness of their activities that promote diversity and inclusion. They also seek to update their principles that promote the commons goals while designing decision-making trees that help knowledge users and providers maintain compliance with licensing. They further identify and cultivate technologies that support the efforts of the commons.
Whether you're a student, a scientist, a common citizen, a publisher, or a university administrator, everyone can participate by providing or accessing knowledge (e.g., data, software, etc.). Simply start by using their decision-making trees and supporting resources to determine what you can contribute or which repositories to use
Ultimately, the process of research involves scholarly communication and engagement with all stakeholders. The Scholarly Commons and its working group seek to develop an open scholarship ecosystem that is inclusive of different research voices from around the world. Furthermore, they seek to make open access open to all!


Objective Alcoholic liver disease (ALD) is a leading cause of death among chronic liver diseases. However, its pathogenesis has not been completely established. MicroRNAs (miRNAs) are key contributors to liver diseases progression. This study investigated hepatocyte-abundant miRNAs dysregulated by ALD, its impact on hepatocyte injury and the underlying basis.
Design Alcoholic hepatitis (AH) human and animal liver samples and hepatocytes were used to assess miR-148a levels. Pre-miR-148a was delivered specifically to hepatocytes in vivo using lentivirus. Immunoblottings, luciferase reporter assays, chromatin immunoprecipitation and immunofluorescence assays were carried out in cell models.
Results The miRNA profile and PCR analyses enabled us to find substantial decrease of miR-148a in the liver of patients with AH. In mice subjected to Lieber-DeCarli alcohol diet or binge alcohol drinking, miR-148a levels were also markedly reduced. In cultured hepatocytes and mouse livers, alcohol exposure inhibited forkhead box protein O1 (FoxO1) expression, which correlated with miR-148a levels and significantly decreased in human AH specimens. FoxO1 was identified as a transcription factor for MIR148A transactivation. MiR-148a directly inhibited thioredoxin-interacting protein (TXNIP) expression. Consequently, treatment of hepatocytes with ethanol resulted in TXNIP overexpression, activating NLRP3 inflammasome and caspase-1-mediated pyroptosis. These events were reversed by miR-148a mimic or TXNIP small-interfering RNA transfection. Hepatocyte-specific delivery of miR-148a to mice abrogated alcohol-induced TXNIP overexpression and inflammasome activation, attenuating liver injury.
Conclusion Alcohol decreases miR-148a expression in hepatocytes through FoxO1, facilitating TXNIP overexpression and NLRP3 inflammasome activation, which induces hepatocyte pyroptosis. Our findings provide information on novel targets for reducing incidence and progression of ALD.
Excessive alcohol consumption promotes hepatocyte dysfunction and death during the progression of liver diseases.
A set of microRNAs (miRNAs) including miR-182, miR-155 and miR-217 showed abnormal increases in alcoholic liver disease (ALD). However, the downregulated miRNAs have been scarcely explored.
MiR-148a belongs to miRNAs abundant in hepatocytes and regulates hepatocyte differentiation. MIR148A gene is regulated by the transcription factors, SREBP-1, MYB and p53.
Thioredoxin-interacting protein (TXNIP) in association with NLRP3 activates inflammasome pathway during the progression of non alcoholic fatty liver disease.
MiR-148a levels are dysregulated in the liver of patients with alcoholic hepatitis (AH) or ethanol-fed animals.
Forkhead box protein O1 is identified as an unrecognised transcriptional regulator of MIR148A gene, and its hepatic expression is diminished in patients with AH or animal models, lowering miR-148a levels.
TXNIP is discovered as a direct target of miR-148a and is overexpressed during the progression of ALD.
Alcohol treatment elicits caspase-1-mediated pyroptosis through TXNIP overexpression, and this event is reversed by miR-148a transfection. Consistently, hepatocyte-specific delivery of miR-148a alleviates alcoholic liver injury.
Our findings demonstrate that miR-148a ameliorates alcohol-induced inflammasome activation and pyroptosis in hepatocytes through TXNIP inhibition, which shed light on novel targets and potential strategies for the treatment of ALD.
Excessive alcohol drinking promotes alcoholic liver disease (ALD) such as steatosis, steatohepatitis, fibrosis to cirrhosis and finally to hepatocellular carcinoma, the leading causes of death among all chronic liver diseases. Alcoholic hepatitis (AH) with liver cirrhosis accounts for approximately 50% of the mortality in Western countries.1 Because of the rapid increase in alcohol consumption in other countries such as China and India, the prevalence of ALD has increased globally.2 However, successful therapeutic remedies are not available presumably because of inadequate patient characterisation, poor diagnostic as well as prognostic measures and lack of proper medication. An understanding of the pathogenesis of ALD and the molecular regulation may assist in the development of good diagnostic markers, along with preventive and/or therapeutic approaches.
The microRNAs (miRNAs) participate in a variety of pathophysiological processes. A set of miRNAs including miR-182, miR-155 and miR-217 showed an abnormal increase in ALD.3–5 More importantly, decrease of miRNA and the resultant overexpression of its target may also be crucial in understanding the process of hepatocyte death and disease progression. However, the significance of downregulated miRNAs has been scarcely explored in ALD (except the dysregulation of miR-122).6 This study aims at identifying a liver-specific miRNA, which is downregulated during the progression of ALD along with its target and investigates their roles in determining hepatocyte fate and the underlying molecular basis.
Alcohol consumption and detoxification processes have direct effects on hepatocytes, such as release of sterile danger signals, uric acid and extracellular ATP.7 The signals released from damaged hepatocytes activate multiple inflammatory pathways, promoting ALD.8 In addition, patients with AH showed increased levels of tumour necrosis alpha and interleukin 1 (IL-1),9 10 supporting the hypothesis that inflammatory response is the major driving force during ALD progression. Moreover, alcohol metabolism in hepatocytes facilitates production of reactive oxygen species (ROS) and mitochondrial dysfunction, sensitising hepatocytes to inflammatory cytokines.11 12 In addition to the immune cell-mediated inflammation, inflammasome-dependent IL-1β production has also been reported in hepatocytes.13 Nonetheless, whether alcohol consumption promotes inflammasome activation in hepatocytes, and if so, what the consequence is for hepatocyte fate had not been explored.
Here, we report that miR-148a is markedly decreased in patients with AH and experimental animal models and that dysregulation of miR-148a promotes thioredoxin-interacting protein (TXNIP) overexpression in hepatocytes facilitating pyroptosis, a caspase-1-dependent programmed cell death, in ALD. Moreover, we discovered forkhead box protein O1 (FoxO1) as a transcription factor for MIR148A gene expression and the ability of alcohol to inhibit FoxO1 expression. Two different alcohol-feeding animal models, cell-based assays and molecular approaches were used to assess the impact of decrease in miR-148a levels on TXNIP-mediated inflammasome activation in hepatocytes and consequent cell fate determination (ie, pyroptosis). Towards the end, we employed a hepatocyte-specific in vivo miRNA delivery system to confirm the identified pathogenesis of ALD.
Male C57BL/6 mice at 6–8 weeks of age were fed on a Lieber-DeCarli diet (Dyets) with 5% (vol/vol) ethanol (36% ethanol-derived calories) ad libitum or an isocaloric liquid diet for 4–6 weeks. For binge alcohol model, ethanol (5 g/kg body weight) was administered two times daily by gastric intubation for 7 consecutive days, whereas control mice received water. For in vivo miRNA delivery experiment, mice were injected with lentiviruses expressing control or pre-miR-148a through tail vein.
The chromatin immunoprecipitation (ChIP) assay was performed according to EZ-ChIP assay kit protocol (Upstate Biotechnology, Lake Placid, New York, USA). The procedures for analysis are described in online supplementary materials and methods.
Pyroptosis was analysed using the FAM-FLICA in vitro Caspase-1 Detection Kit (ImmunoChemistry Technologie, Bloomington, Minnesota, USA). The procedures for analysis are described in online supplementary materials and methods.
Statistically significant differences were assessed by the Student's t-test or one-way analysis of variance tests followed by Bonferroni's method or Fisher's Least Significant Difference for multiple comparisons when necessary. The data were expressed as the mean±SEM. Coefficients of correlation (r) were determined by the Pearson correlation method. The criterion for statistical significance was set at P<0.05 or P<0.01.
Additional detailed information is in online supplementary materials and methods.
To determine the identity of the miRNAs dysregulated in patients with AH, we first analysed the profile of miRNA microarray accomplished using patients with AH and normal liver samples (GSE59492). In this analysis, miR-148a levels were significantly downregulated in patients with AH compared with the controls (figure 1A). Quantitative reverse transcription PCR (qRT-PCR) assays verified the marked dysregulation of miR-148a in human AH samples (figure 1B). Since miR-148b and miR-152 shared the same seed sequence, we additionally examined miR-148b and miR-152 levels and found no changes in the miRNAs levels (see online supplementary figure 1A). Ad libitum or intragastric ethanol-feeding animal models have significantly enhanced understanding on the pathogenesis of ALD despite some limitations in the production of the clinical features.14 15 We employed Lieber-DeCarli alcohol diet and binge alcohol drinking methods. In both models, miR-148a levels were notably diminished in the liver with alcohol feeding (figure 1C). Again, miR-148b and miR-152 levels were not changed (see online supplementary figure 1B). We confirmed hepatocyte injury and accompanying inflammation in mice subjected to Lieber-DeCarli alcohol diet (figure 1D upper). Hepatic miR-148a levels correlated with changes in the blood biochemical parameters (ie, serum alanine aminotransferase (ALT) activities and triglyceride (TG) contents) (figure 1D lower). MiR-148a dysregulation mediated by alcohol was corroborated with the results obtained using the primary hepatocytes or AML-12 cells (figure 1E). MiR-148a levels were lowered by ethanol in a dose-dependent manner (50–200 mM, 48 hours) (see online supplementary figure 2A). In subsequent experiments, we primarily chose the condition of 100 mM ethanol treatment (for 48 hours). Collectively, our results showed that miR-148a levels were substantially lowered in ALD.
Dysregulation of miR-148a in patients with AH or ALD animal models. (A) Expression heatmap of the significantly downregulated miRNAs in patients with AH (n=13) as compared with normal controls (n=6) (GSE59492) (fold change <0.5, P<0.01). (B) qRT-PCR assays for miR-148a in normal control or liver samples of patients with AH (n=6 or 12 each). Each point represents one sample, and the horizontal line indicates the mean value. (C) qRT-PCR assays for miR-148a in mouse liver samples. Mice were fed on either control diet or Lieber-DeCarli alcohol diet for 6 weeks (n=6 or 10 each) or received oral gavage of 5 g/kg body weight of alcohol two times daily for 7 days (n=7 each). Data were shown as box and whisker plot. Box, IQR; whiskers, 5–95 percentiles and horizontal line within box, median. (D) Liver histopathology (H&E, scale bar, 50 µm), blood biochemical parameters and correlations between miR-148a levels and serum ALT activities (or TG contents) using the same samples from the Lieber-DeCarli mouse model (n=6 or 10 each). (E) qRT-PCR assays for miR-148a in hepatocytes. Mouse primary hepatocytes or AML-12 cells were exposed to 100 mM ethanol for 48 hours (n=3 each). For (D) and (E), data represent the mean±SEM, **P<0.01. AH, alcoholic hepatitis; ALD, alcoholic liver disease; ALT, alanine aminotransferase; Con, control; EtOH, ethanol treatment; H & E, hematoxylin and eosin; qRT, quantitative reverse transcription; TG, triglyceride.
To explore the molecular mechanism by which alcohol decreases miR-148a expression, we next analysed Gene Expression Omnibus (GEO) dataset (GSE28619) using a K-mean clustering (K=4) and extracted clusters of genes downregulated in the liver of patients with AH. Of these, about 3310 downregulated genes were repressed more than the others (figure 2A left). Gene ontology analysis using DAVID database enabled us to find molecules involved in biological processes of 'positive transcriptional regulation' and 'inhibitory regulation of programmed cell death'. Moreover, network analysis using STRING database yielded FoxO1 as the core molecule interacting with 12 other genes overlapping within the above two processes (figure 2A right). qRT-PCR assays verified dysregulation of FOXO1 in human AH liver samples (figure 2B). In the analysis of mice subjected to binge alcohol drinking, hepatic FoxO1 transcript levels were decreased (figure 2C). Immunoblottings confirmed the suppression of FoxO1 protein in both animal models (figure 2D). FoxO3a levels, assessed as a comparison, were not decreased.
Inhibition of FoxO1 in patients with AH or ALD animal models. (A) K-mean cluster and gene ontology analyses using the liver samples of patients with AH. FoxO1 was predicted as an inhibitor of alcohol-induced cell death among the most highly differentially expressed genes in GEO dataset (GSE28619). Blue, underexpression; red, overexpression (left). The genes were selected in the categories of two gene ontology pathways (P<0.05) associated with transcriptional regulation and programmed cell death (right). (B) qRT-PCR assay for FOXO1 in the liver of patients with AH (n=5 or 12 each). Each point represents one sample, and the horizontal line does the mean value. (C) qRT-PCR assay for FoxO1 in the liver of mice subjected to binge alcohol drinking (n=7 each). Data were shown as box and whisker plot. Box, IQR; whiskers, 5–95 percentiles and horizontal line within box, median. (D) Immunoblottings for FoxO1 and FoxO3a in the livers from the Lieber-DeCarli or binge alcohol animal models. AH, alcoholic hepatitis; ALD, alcoholic liver disease; Con, control; EtOH, ethanol treatment; FoxO1, forkhead box protein O1; GEO, Gene Expression Omnibus; mRNA, messenger RNA; qRT, quantitative reverse transcription.
In an effort to find the underlying mechanism of miR-148a dysregulation in conjunction with decrease in FoxO1 level, correlation analyses were performed. In human liver samples, FOXO1 levels were highly correlated with miR-148a levels (figure 3A). This positive correlation was also observed in animal models (figure 3B). We then used a cell model and found out that enforced expression of FoxO1 significantly enhanced the levels of the primary and the mature forms of miR-148a (figure 3C). A previous study has identified the MIR148A gene transcriptional start site.16 To validate the effect of FoxO1 on MIR148A transcription, we sought to evaluate FoxO1 binding to the MIR148A promoter. PROMO analysis enabled us to predict three putative FoxO1 binding sites within the −3 kb promoter region of the human MIR148A (figure 3D upper). In the ChIP assays, FoxO1 specifically bound to the proximal site (RE3) located at the region from −1546 bp to −1535 bp, but not to the others sites (RE1 and RE2). The specificity in the binding of FoxO1 to the DNA was supported by results of PCR assays using non-specific primers targeting an irrelevant region (figure 3D lower). The ability of FoxO1 to induce transactivation of MIR148A was reinforced by the outcomes of luciferase assays; knockdown of FoxO1 significantly inhibited luciferase activity (figure 3E), and this effect was completely abolished in the assays using the RE3 mutant construct. All of these results provide strong evidence that FoxO1 transcriptionally controls MIR148A expression.
Transcriptional induction of MIR148A by FoxO1. (A) Correlations between FOXO1 transcript and miR-148a levels in patients with AH. (B) Correlations between FoxO1 protein and miR-148a levels in ALD animal models. (C) qRT-PCR assays for primary or mature forms of miR-148a in AML-12 cells transfected with Mock or FoxO1. (D) ChIP assays for FoxO1 binding to the promoter regions of MIR148A. HepG2 cells were transfected with Mock or FoxO1 overexpression vector. DNA–protein complexes precipitated with anti-FoxO1 antibody were subjected to PCR amplifications using the primers flanking the indicated FoxO1 response elements (FoxO1-REs). IgG immunoprecipitation represents negative control. The specificity of FoxO1 binding was verified using the primers targeting an irrelevant region in the promoter. One-tenth of cross-linked lysates served as the input control. (E) MIR148A promoter reporter assays using FoxO1-RE3 WT or Mut luciferase constructs in HepG2 cells transfected with si Con or si FoxO1. For (C)–(E), data represent the mean±SEM (n=3 each, *P<0.05, **P<0.01). AH, alcoholic hepatitis; ALD, alcoholic liver disease; ChIP, chromatin immunoprecipitation; Con, control; EtOH, ethanol treatment; FoxO1, forkhead box protein O1; miRNA, microRNA; Mut, mutant; n.s., non-significant; qRT, quantitative reverse transcription; WT, wild type.
Having identified the inhibitory effect of ethanol on miR-148a and the role of FoxO1 in regulating its transcription, we next tried to find the target gene(s) regulated by miR-148a and its physiological role in alcohol-induced hepatocyte death. Since hepatic miR-148a levels correlated with changes in the serum ALT activities as well as the TG levels in the Lieber-DeCarli model, we selected candidate genes involved in processes of lipid/glucose metabolism and programmed cell death pathway using Targetscan and DAVID databases. Among the molecules involved in these two pathways, we focused on TXNIP because of its unique overlapping function in both biological processes mentioned above (figure 4A). Moreover, TXNIP was predicted as a putative target of miR-148a in the analyses of other bioinformatic databases (PicTar, miRanda and DIANA-mirPath). The levels of TXNIP appeared to increase in patients with AH, but the change was not statistically significant (figure 4B upper). A significant inverse correlation existed between miR-148a and TXNIP messenger RNA (mRNA) levels (figure 4B lower). To validate changes in TXNIP protein level in patient samples, we additionally used two different sets of liver specimens from patients with fibrosis or cirrhosis and found that TXNIP levels were higher in patients with alcohol-induced fibrosis than those with idiopathic fibrosis (see online supplementary figure 3A). In patients with alcoholic cirrhosis, TXNIP staining intensity seemed to be unchanged - compared to normal controls presumably due to large loss of functional hepatocytes (see online supplementary figure 3B). In the binge alcohol drinking model, Txnip mRNA levels were also found to be significantly enhanced (figure 4C). However, this effect was statistically non-significant in the Lieber-DeCarli model. More importantly, TXNIP protein levels in the liver were notably elevated in both models. Additionally, TXNIP was overexpressed in both primary hepatocytes and AML-12 cells treated with ethanol (figure 4D), supporting the direct effect of ethanol on the identified target in the hepatocytes.
TXNIP overexpression as a result of miR-148a dysregulation by ethanol. (A) Gene ontology analysis of putative target genes of miR-148a using two selected gene ontology categories (programmed cell death and lipid/glucose metabolism pathways). (B) qRT-PCR assays for TXNIP in liver samples of patients with AH (upper). Each point represents one sample, and the horizontal line does the mean value. Correlations between miR-148a and TXNIP levels were analysed (lower). (C) qRT-PCR or immunoblotting assays for TXNIP in the liver samples from control or Lieber-DeCarli (n=6 or 10 each) and control or binge alcohol (n=7 each) mouse models. Data were shown as box and whisker plot. Box, IQR; whiskers, 5–95 percentiles and horizontal line within box, median. (D) Immunoblottings for TXNIP in the lysates of mouse primary hepatocytes or AML-12 cells treated with 100 mM ethanol for 48 hours. Band intensities represent values relative to respective control (control, 1). (E) qRT-PCR or immunoblotting assays for TXNIP in the lysates of AML-12 cells transfected with miR-148a mimic for 48 hours (left), or miR-148a ASO for 72 hours (right). (F) TXNIP-3′UTR luciferase activity assays using HEK293 cells transfected with control mimic or miR-148a mimic or HepG2 cells transfected with Con ASO or miR-148a ASO for 72 hours. (G) qRT-PCR or immunoblotting assays for miR-148a-modulated primary hepatocytes isolated from the mice that had been treated with binge alcohol for 7 days. For (D)–(G), data represent the mean±SEM (n=3 or 4 each, *P<0.05). ASO, antisense oligonucleotide; Con, control; EtOH, ethanol treatment; qRT, quantitative reverse transcription; n.s., non-significant; TXNIP, thioredoxin-interacting protein.
To assess the effect of miR-148a on TXNIP, we transfected miR-148a in AML-12 cells and found that miR-148a transfection lowered TXNIP mRNA and protein levels, whereas its antisense oligonucleotide (ASO) transfection increased their levels (figure 4E). Given the nearly perfect pairing between the TXNIP-3′ untranslated region (UTR) and the miR-148a seed sequence (figure 4F left), we next defined the ability of miR-148a to inhibit TXNIP more precisely using in vitro assays. As expected, transfection of HEK293 cells with miR-148a prevented luciferase expression from pEZX-TXNIP-3′UTR luciferase construct, whereas that with miR-148a ASO exerted the opposite effect (figure 4F right). A mutant TXNIP 3′UTR reporter (5′ -TCGTGAG-3′ and 5′ -GGTGACA-3′) construct showed no change in luciferase expression. To verify the effect of miR-148a on the identified target on alcohol challenge, we performed further experiments using primary hepatocytes. Transfection of hepatocytes isolated from the ethanol-treated mice (1 week) with miR-148a significantly inhibited TXNIP mRNA and protein levels (figure 4G). Consistently, miR-148a ASO transfection enhanced TXNIP expression. Modulations of miR-148a levels were confirmed in AML-12 cells or primary hepatocytes after transfection with miR-148a mimic or ASO (see online supplementary figure 4A,B).
In the analysis of GEO dataset (GSE67456), mice fed on Lieber-Decarli diet showed an increase in Txnip transcript level in the liver (see online supplementary figure 5A). A significant inverse correlation existed between Foxo1 and Txnip transcripts. FoxO1 inhibition of TXNIP and the antagonising effect of miR-148a ASO were confirmed in cell-based assays. FoxO1 overexpression prevented alcohol-induced TXNIP expression, which was resumed by miR-148a ASO transfection (see online supplementary figure 5B). Flow cytometric analyses corroborated the effects of FoxO1 and miR-148a ASO transfection on TXNIP in cells treated with ethanol (see online supplementary figure 5C). All of these results indicate that exposure of hepatocytes to alcohol induces TXNIP overexpression through dysregulation of the FoxO1-mediated miR-148a expression.
Inflammasome activation is responsible for promoting the progression of liver diseases including ALD.17 Since TXNIP facilitates NLRP3 inflammasome activation through binding to NLRP3,18 we focused on the role of TXNIP-NLRP3 inflammasome in alcohol-induced hepatocyte injury. In the analysis of GEO dataset (GSE97234), Nlrp3, ASC (Pycard) and Il1b mRNA levels were all upregulated in the liver of AH mice compared with controls (figure 5A). Ethanol treatment increased NLRP3 expression in primary hepatocytes or AML-12 cells (figure 5B and C, see online supplementary figure 6A). The active caspase-1 and ASC levels were also upregulated (figure 5C). In patients with AH, NLPR3 transcript levels tended to be diminished (see online supplementary figure 6B). However, NLRP3 protein expression was increased in alcohol-fed mice (see online supplementary figure 6C). The caspase-1 (CASP1) and ASC (PYCARD) transcript levels also increased and inversely correlated with FOXO1 mRNA levels in the dataset of patients with AH (GSE28619) (see online supplementary figure 7). To assess the localisation of NLRP3 and TXNIP, immunocytochemical assays were done. As expected, TXNIP and NLRP3 were colocalised after ethanol treatment, and their staining intensities were enhanced (figure 5D). Moreover, ethanol treatment increased the intensity of TXNIP and NLRP3 binding, which was prevented by miR-148a mimic transfection (figure 5E upper). Knockdown of TXNIP resulted in a decrease in the level of active caspase-1 with no change in NLRP3 level (figure 5E lower). Consistently, miR-148a transfection attenuated colocalisation of TXNIP and NLRP3 (figure 5F). Since caspase-1 facilitates pyroptosis,19 we wondered whether alcohol was capable of eliciting hepatocytes pyroptosis (200 mM ethanol was used in this assay as reported previously20). In the flow cytometric analysis using the biomarkers for pyroptosis (ie, active caspase-1 and propidium iodide (PI), it was observed that ethanol treatment augmented the population of caspase-1/PI double positivity in AML-12 cells, and this effect was diminished by miR-148a transfection (figure 5G). Similar results were obtained by TXNIP knockdown. In addition, miR-148a ASO transfection increased the population of caspase-1/PI-double positive cells. FoxO1 overexpression led to a decrease in the caspase-1/PI double-positive cell populations (see online supplementary figure 8).
Pyroptosis of hepatocytes as mediated by TXNIP-dependent inflammasome activation. (A) Expression heatmap of Nlrp3, Pycard (ASC) and Il1b in the RNA-seq database (GSE59492) from control and AH mice (n=3 each) (P<0.01). (B, C) qRT-PCR or immunoblotting assays for NLRP3 or other inflammasome markers in mouse primary hepatocytes or AML-12 cells treated with 100 mM ethanol for 48 hours. Data represent the mean±SEM (n=4 each, *P<0.05, **P<0.01). Band intensities represent values relative to respective control (control, 1). (D) Confocal images of TXNIP and NLRP3 in AML-12 cells treated with 100 mM ethanol for 48 hours. (E) Immunoprecipitation or immunoblottings for TXNIP and NLRP3 inflammasome markers in AML-12 cells exposed to 100 mM ethanol for 48 hours immediately after transfection with miR-148a mimic (or Con mimic) (upper) or TXNIP siRNA (or Con siRNA) for 48 hours (lower). (F) Confocal images of TXNIP and NLRP3 in AML-12 cells treated with 100 mM ethanol for 48 hours after miR-148a mimic (or Con mimic) transfection. (G) Flow cytometric analyses using propidium iodide and active caspase-1 markers. AML-12 cells were similarly transfected, and then treated with 200 mM ethanol for 48 hours. miR-148a mimic or miR-148a ASO transfection and TXNIP knockdown experiments were separately done. AH, alcoholic hepatitis; ASO, antisense oligonucleotide; Con, control; EtOH, ethanol treatment; qRT, quantitative reverse transcription; siRNA, small-interfering RNA; TXNIP, thioredoxin- interacting protein.
To understand the role of the inflammasome in hepatocytes during alcohol-induced liver injury, we next examined the effect of alcohol on inflammasome activation in the liver using an in vivo macrophage depletion model. In immunostaining assays, it was observed that the treatment with clodronate liposomes diminished the F4/80 staining intensity in the liver of mice fed Lieber-DeCarli diet (figure 6A). Clodronate neither induced any histopathological change in the liver nor enhanced ethanol-induced liver injury (figure 6B). TXNIP, active caspase-1 and ASC levels were all elevated in both ethanol and ethanol plus clodronate treatment groups (figure 6C). The levels of NLRP3 and IL-1β were partly diminished in livers of ethanol plus clodronate treated group. FoxO1 expression was decreased in ethanol fed groups regardless of clodronate treatment. Clodronate did not significantly change ALT or AST activities (figure 6D). In immunohistochemistry (IHC) staining, TXNIP and caspase-1 levels were increased after feeding the ethanol with or without clodronate treatment (figure 6E). This effect was confirmed by the result of terminal deoxynucleotidyl transferase nick end labelling (TUNEL) (see online supplementary figure 9). Collectively, our results implicate that alcohol induces hepatocytes pyroptosis via TXNIP-mediated NLRP3 inflammasome activation as a consequence of miR-148a dysregulation.
Ethanol-induced inflammasome activation in hepatocytes from mice treated with clodronate. (A, B) Representative IHC for F4/80 (scale bar, 100 µm), and H&E staining (scale bar, 50 µm). C57BL/6 mice were first intravenously injected with 10 mL/kg body weight of clodronate (or vehicle), and after a week, they were subjected to Lieber-DeCarli diet (or control diet) with additional injections of clodronate (5 mL/kg body weight, intraperitoneal, every 4 days) for 5 weeks. (C) Immunoblottings for TXNIP, inflammasome or other biomarkers. Densitometric band intensities represent values relative to respective control (control, 1). (n=3 each). (D) Serum ALT and AST activities. (n=3–6/group). (E) IHC for TXNIP or caspase-1. Representative liver sections were shown (n=3 each). Scale bar, 100 µm. For (C)and (D), data represent the mean±SEM (statistical comparisons among groups by one-way ANOVA with Fisher's least significant difference (C) or Bonferroni correction (D) for multiple comparisons, *P<0.05, **P<0.01). AH, alcoholic hepatitis; ALT, alanine aminotransferase; ANOVA, analysis of variance; ASO, antisense oligonucleotide; AST, aspartate transaminase; Con, control; EtOH, ethanol treatment; IHC, immunohistochemostry; IL-1β, interleukin 1β; n.s., non-significant; qRT, quantitative reverse transcription; siRNA, small-interfering RNA; TXNIP, thioredoxin-interacting protein.
To validate the physiological impact of miR-148a in hepatocytes on alcohol-induced liver injury, we finally performed in vivo gene delivery using lentivirus. A lentiviral vector comprising gene transcribing the miR-148a, cloned downstream from the albumin promoter, was constructed and the packaged viruses were injected to mice (the albumin promoter was used for hepatocyte-specific gene expression). Hepatocyte-specific delivery of miR-148a ameliorated the pathogenesis of ALD in mice-fed Lieber-DeCarli diet, as evidenced by an improvement in the histopathological features such as reduction in the hepatocyte ballooning and abnormal lipid accumulation (figure 7A upper). qRT-PCR assays confirmed the delivery of miR-148a (figure 7A lower). Immunoblottings for TXNIP, active caspase-1, ASC and IL-1β in liver homogenates verified inhibition of inflammasome activation (figure 7B). FoxO1 level was restored, whereas NLRP3 or CYP2E1 levels remained unchanged. In IHC, TXNIP and caspase-1 staining intensities in the liver tissue were lowered after lentiviral delivery of miR-148a compared with the controls (figure 7C). The ability of miR-148a to inhibit inflammasome activation was verified by a decrease in serum IL-1β level (see online supplementary figure 10A). Inhibition of hepatocyte death by miR-148a delivery was confirmed by TUNEL staining for the liver sections (see online supplementary figure 10B) and immunoblotting for PARP-1 cleavage (see online supplementary figure 11). Consistently, hepatocyte-specific delivery of miR-148a significantly repressed ethanol-induced increases in the liver-to-body weight ratio, ALT activity and serum and hepatic TG contents (figure 7D). Overall, our results demonstrate that miR-148a protects hepatocytes from alcohol-induced inflammasome activation and hepatocyte pyroptosis by inhibiting TXNIP (figure 7E).
Inhibition of inflammasome and liver injury after hepatocyte-specific lentiviral delivery of miR-148a. (A) H&E staining (scale bar, 50 µm) and qRT-PCR assays for miR-148a in the liver. Mice were intravenously injected with a single dose of albumin promoter-pre-miR-148a lentiviruses (or Lv-control), and after a week, they were fed on a Lieber-DeCarli diet for 4 weeks as depicted in the scheme (n=4–6/group). (B) Immunoblotting assays for TXNIP, inflammasome or other biomarkers in liver homogenates. Densitometric band intensities represent values relative to respective control (control, 1) (n=3 each). (C) IHC for TXNIP or caspase-1. Representative liver sections were shown (n=3 each). Scale bar, 100 µm. (D) Liver-to-body weight ratio and representative blood biochemical parameters. (E) A scheme illustrating the mechanism by which ethanol induces pyroptosis of hepatocytes. For (A), (B) and (D), data represent the mean±SEM. Significantly different compared with each control, *P<0.05, **P<0.01. For (A), statistical significance of differences between two groups indicated (unpaired t-test). For (B) and (D), statistical comparisons among multiple groups by one-way ANOVA with Fisher's least significant difference (B) or Bonferroni correction (D). ALD, alcoholic liver disease; ALT, alanine aminotransferase; ANOVA, analysis of variance; AST, aspartate transaminase; Con, control; EtOH, ethanol treatment; FoxO1, forkhead box protein O1; IL-1β, interleukin 1β; qRT, quantitative reverse transcription; TG, triglyceride; TXNIP, thioredoxin-interacting protein.
MiRNAs regulate diverse biological functions in the liver. Alteration in the levels of specific miRNAs promotes the incidence and progression of liver diseases (see online supplementary table 1).21 Since hepatocytes are primarily afflicted by ethanol toxicity, miRNAs abundant in hepatocytes may be more sensitive to alcohol exposure. In our GEO data (GSE59492) analysis of liver specimens of patients with AH, only 2% of the miRNAs were found to be significantly downregulated. Among them, miR-148a was profoundly and most significantly suppressed. Since miR-148a belongs to the most abundant miRNAs in the liver22 and had not been investigated before, we focused on miR-148a dysregulation in the progression of ALD. Here, we revealed marked and specific decrease in miR-148a level in patients with AH, and this decrease was further confirmed by the outcomes from two different ALD animal models. Moreover, our data obtained from the primary hepatocytes or cell lines corroborated the effect of alcohol on miR-148a dysregulation.
FoxO1 belongs to key transcription factors related to stress response pathway.23 In particular, FoxO1 serves as a metabolic regulator and tumour suppressor in the liver.24 25 In the present study, FoxO1 was predicted a central molecule interacting with other genes for 'positive transcriptional regulation' and 'inhibitory regulation of programmed cell death' processes. Moreover, we found marked suppression of FoxO1 in the liver of patients with AH and ALD animal models, which confirmed the inhibitory effect of alcohol on FoxO1. This is in line with our finding of negative correlation between the miR-148a levels and the serum ALT activities (or TG contents) or with the known effect of alcohol on NAD+/NADH ratio and lipid and glucose metabolism.26–28 Decrease in the level of FoxO1 facilitates ROS and proinflammatory cytokine production in 3T3L1 adipocytes.29 Similarly, hepatocytes exposed to ethanol and unsaturated fatty acids showed decrease of nuclear FoxO1.30 In another study, Foxo1 levels were rather enhanced in the Lieber-Decarli rat model,31 possibly reflecting species variation in the metabolic capacity of alcohol. Overall, our results strengthen the concept that a decrease in the level of FoxO1 promotes the progression of ALD in association with dysregulation of miR-148a. Here, we demonstrated that FoxO1 is a transcriptional factor for MIR148A. Although several transcription factors such as SREBP-1, MYB and p53 may regulate the miR-148a levels,16 32 33 they did not show any correlation with miR-148a in ALD. Our data revealed strong correlation between miR-148a and FoxO1, along with identifying the presence of a functionally active FoxO1 binding site in the human MIR148A as corroborated by the results of the mutation assay.
Ethanol consumption may cause epigenetic changes, which may also contribute to miR-148a dysregulation in the progression of ALD. Previously, it has been shown that hypermethylation of miR-148a gene promoter was associated with silencing of miR-148a in liver cancer34 and IL-6 enhanced DNMT1 activity and methylation-dependent tumour suppressor genes by decreasing miR-148a/152 in malignant cholangiocytes.35 In our study, however, ethanol treatment unchanged the methylation of miR-148a promoter region in hepatocytes (see online supplementary figure 12).
Among the miRNAs abundant in hepatocytes, miR-148a plays important roles such as regulation of hepatocyte differentiation, inducing adult liver phenotype.34 However, the roles and targets of miR-148a had been mostly studied in tumour biology field. To our knowledge, miR-148a regulation of TXNIP is a novel event occurring in the progression of liver disease. MiR-148a transfection prevented alcohol-induced TXNIP expression in cell-based assay, indicating the ability of miR-148a to regulate ALD through TXNIP. This idea is in line with the reports that TXNIP rendered cells susceptible to oxidative stress and injury.18 36 37 Minor or moderate increases in TXNIP mRNA levels in patients with AH or Lieber-DeCarli diet mice may reflect the feature of miRNA-regulating protein translation. Increase of TXNIP protein in alcoholic fibrosis was also validated using human samples. Together, our results showing FoxO1 regulation of miR-148a, changes in TXNIP levels, reciprocal relationship between FoxO1 and TXNIP in animal experimentation and database analysis, and the ability of FoxO1 to restore miR-148a and inhibit TXNIP levels strongly support the role of FoxO1 in the regulation of TXNIP by miR-148a.
Host-derived danger signals, such as certain metabolites and ROS, activate the NLRP3 inflammasome pathway.40 NLRP3 may also be activated in hepatocytes in response to endotoxin challenge, a condition facilitated by alcohol intake.41 In NLRP3-deficient mice, alcohol-induced liver steatosis and injury were ameliorated.42 Thus, an increase in NLRP3 level would promote hepatocyte injury. Increase in NLRP3 protein level in our alcohol-fed mice is consistent with the report showing NLRP3 transcript upregulation after alcohol feeding.43 Our data showing a slight decrease in NLRP3 mRNA in patients with AH would be associated with compensatory responses. Additionally, the inverse relationship between the levels of FoxO1 and inflammasome markers in patients with AH strengthened the conclusion that decrease of FoxO1 by alcohol contributes to TXNIP-mediated NLRP3 inflammasome activation in ALD.
Multiple mechanisms facilitate hepatocyte death, resulting in the subsequent progression of ALD. Excessive and uncontrolled activation of inflammasome has a damaging effect on the host, inducing uncontrolled inflammatory responses and the consequent cell death.44 However, inhibition of apoptotic cell death is not enough to abrogate alcohol-induced liver injury,45 suggesting that other types of hepatocyte death mechanisms may also exist. An interesting aspect of our finding is that alcohol-induced activation of inflammasome pathway in hepatocytes promoted pyroptosis, which relied on TXNIP overexpression. This observation was consistent with the finding that caspase-1 was activated in hepatocytes of patients with AH.46 Consistently, TXNIP deficiency resulted in the enhancement of cell proliferation and an increased resistance to cell death.47 Moreover, miR-148a transfection ameliorated alcohol-induced pyroptotic cell death, supportive of the notion that miR-148a and the associated molecules may represent new targets for ALD.
Collectively, our findings demonstrate that alcohol induces pyroptosis of hepatocytes by activating the NLRP3 inflammasome mediated by miR-148a-dependent TXNIP overexpression. The present identification of miR-148a as a regulator of pyroptosis, along with the transactivating effect of FoxO1 on the gene expression, sheds light on novel targets and potential strategies for the treatment of ALD.
. Alcohol, oxidative stress, and free radical damage. Alcohol Res Health 2003;27:277–84.
Contributors MJH: study concept and design; acquisition of data; analysis and interpretation of data; drafting of the manuscript; statistical analysis. THK: study concept and design; acquisition of data; analysis and interpretation of data. JSY study concept and design; acquisition of data; analysis and interpretation of data; administrative, technical or material support. DB: acquisition of data; analysis and interpretation of data; statistical analysis. PS-B: study concept and design; human sample analysis and interpretation of data; administrative, technical or material support. SGK: study concept and design; analysis and interpretation of data; writing of the manuscript; critical revision of the manuscript for important intellectual content; statistical analysis; obtained funding; administrative, technical or material support and study supervision.
Funding This research was supported by the National Research Foundation of Korea (NRF) grants funded by the Korean government (MSIP) (NRF-2015R1A2A1A10052663) and MJH was supported by Basic Science Research Program of the Ministry of Education (NRF-2018R1A6A3A01011724). Sancho-Bru P was supported by Instituto de Salud Carlos III, Miguel Servet CP11/00071 and FIS PI14/00320 and cofinanced by Fondo Europeo de Desarrollo Europeo (FEDER), Unión Europea, 'Una manera de hacer Europa'.
Ethics approval Ethics Committees of Seoul National University and the Hospital Clinic of Barcelona.
Correction notice This article has been corrected since it published Online First. The funding statement has been updated.
Presented at A part of the data included in this manuscript was presented at the 2017 Spring International Convention of the Pharmaceutical Society of Korea in Korea (2017).


Nothing like working on a story where a woman is trying to cope with life after losing her husband to make me appreciate that my husband is upstairs sleeping. Our youngest went to college yesterday so we are officially empty nesters, something we embrace with joy. We love our three children, but our goal all along has been to raise independent adults so it makes sense that they'd be off doing their own thing.
But, back to the story. It's designed to be a stand-alone short story about how my main character in French Impressions (due to be released in 2014) came to be working and living in France. The beginning is sad as she mourns anew the loss of her husband. I'm glad that the novel I'm outlining for November doesn't have a widow as the main character. I'm also glad that I write fiction that isn't based on my life except for the location. My latest novel is using locations from a fabulous trip we took to Europe this summer.
I'd like to revise the story before it comes up on critiquecircle.com, and better get to it. Once my husband wakes up, we're spending the day together, so I won't get much writing done. This is a problem I like in real life.


We often don't think about drinks containing calories. However, there is strong evidence that regularly drinking sugar-sweetened drinks can cause weight gain which in turn can cause many cancers.
Water is the best choice – try to drink water more often than other drinks.
You could try sparkling mineral water with a slice of lemon, lime or cucumber.
Tea or coffee without added sugar, are good options.
Instead of sweet, frozen coffee drinks, try an iced Americano with a splash of milk.
Rather than hot chocolate, mochas and coffees flavoured with syrups, opt for 'skinny' versions of milky hot drinks, such as cappuccinos (without chocolate), Americanos or tea to cut the calories and sugar.
Natural fruit juice is a source of healthy nutrients but also contains a lot of sugar and has lost most of the fibre you would get by eating the whole fruit, so it is best not to drink more than one glass (150ml) a day.
Instead of a large glass of fruit juice, pour a small portion and dilute the juice with sparkling mineral water.
What about artificially-sweetened diet drinks?
Diet drinks are an alternative to sugar-sweetened drinks too. There is no strong evidence in humans to suggest that low-calorie, artificially-sweetened drinks, such as diet soft drinks, are a cause of cancer.
However, the evidence that these types of drinks help prevent weight gain, being overweight and obese is not consistent. Artificially-sweetened soft drinks are also often quite acidic which is bad for our teeth, so it is best not to drink them regularly or in large quantities.
Did this page give you any new ideas for avoiding sugary drinks?
After reading this page, do you feel more motivated to choose alternatives to sugary drinks?
Do sugary drinks increase risk?