Shared posts

06 Oct 07:47

Arbitration

by jwz
How America's corporations got their own private legal system

In 1925, the Supreme Court ruled that corporations of similar size and bargaining power could use arbitration, rather than courts, to settle their differences; today, corporations demand that customers and employees agree to use the arbitration system for redress of any grievances, while reserving the right to use the courts to attack humans who offend them. [...]

The largest arbitration company in America, the for-profit National Arbitration Foundation, is owned by investors who also own one of the country's largest debt-collection agency -- and many debt-collection cases get settled in arbitration.

How unbalanced is arbitration? Out of 18,075 debt-collection cases handled in California by the NAF, just 30 were settled in favor of humans. When humans do win against companies, they collect much smaller settlements than they would in court, too.

06 Oct 07:38

150505

Mahmoud

lil bit o phal



150505

04 Oct 09:10

MAJOR

by CDTcrew

h i g h
02 Oct 06:06

a fresh innovation

by kris

20151001_peeple

there’s a startup called peeple that’s making the rounds online, calling itself “yelp for people.” you can review people — and if you know their phone number you can start a peeple account in their name, without their permission

but don’t worry, only positive reviews of you show up online instantly. if someone writes a nasty review about you, you get a text about it, and you can go dispute it! which is exactly what you wanted to do with your day

plus, there’s nothing preventing me from giving my ex a 10/10 rating, just to get my negative text about them posted and indexed by search engines along with their name

the comments about the service are overwhelmingly negative, saying “we don’t need or want to participate in this product” — but the peeple admins are deleting many of those from their facebook page

that seems like a nice feature

30 Sep 06:56

eBay phishing sites hosted by… eBay

by Paul Mutton
Mahmoud

ebay's security team has 15 openings (no pun intended and no joke anywhere in this)

Fraudsters are stealing eBay usernames and passwords using phishing pages hosted on eBay's own infrastructure. One of these pages, targeting German users, is shown below:

An eBay phishing form hosted on eBay's own infrastructure. The form contents are submitted to an external domain in Russia.

An eBay phishing form hosted on eBay's own infrastructure. The form contents are submitted to an external domain in Russia.

The convincing appearance of the spoof login form is bolstered by the fact that it is hosted on a genuine eBay domain, ebaydesc.com. This domain is ordinarily used to host descriptions for eBay listings which are displayed within iframes on eBay listing pages.

In this case, the corresponding eBay listing has already been deleted, although the phishing content within the listing's description can still be viewed by browsing directly to the relevant URL on vi.vipr.ebaydesc.com. Consequently, the attack is still live and capable of stealing credentials from eBay users.

The URL of the credential-stealing script is only momentarily visible in the address bar before the victim is redirected to the genuine eBay site.

The URL of the credential-stealing script is only momentarily visible in the address bar before the victim is redirected to the genuine eBay site.

When a victim enters his username and password into the form, both values are submitted to a PHP script hosted on a server in Russia. After stealing the credentials, this script then redirects the victim to the genuine ebay.de login page, which reports that the username or password was incorrect.

After the victim's credentials are stolen, he is redirected to the real eBay login page. Note that the username field has been automatically populated with the username stolen by the fraudster.

After the victim's credentials are stolen, he is redirected to the real eBay login page. Note that the username field has been automatically populated with the username stolen by the fraudster.

This error message might cause the victim to become suspicious enough to look at the browser's address bar, to check he is on the right website; but it will already be too late at this point – his credentials will have already been stolen, and because his browser will now be showing ebay.de in the address bar, he may not even realise that his credentials have just been sent to a web server in Russia. There is consequently little chance of the victim reacting by changing his password, allowing the fraudster to take full advantage of the stolen credentials at his leisure.

The website involved in collecting the stolen credentials has also been used to host other phishing attacks targeting German-speaking consumers, including sites impersonating PayPal, Apple, and mobile.de.

In an attempt to evade detection by eBay and others, the fraudster has obfuscated the HTML source of his eBay phishing form. This makes it impossible to find such a listing by searching for any of the words that appear in the description, yet the rendered results appear as normal when viewed in a web browser.

The obfuscated HTML source used by the phishing content hosted by eBay.

The obfuscated HTML source used by the phishing content hosted by eBay.

Allowing anyone to insert arbitrary HTML and malicious scripts into a listing's description gives plentiful opportunities to would-be fraudsters, particularly as this weakness has been exploited to carry out similar attacks against eBay users in the past. Last year, Netcraft reported on fraudsters injecting malicious JavaScript into eBay listings to set up man-in-the-middle attacks against car buyers, and similar JavaScript redirection techniques have continued to be exploited throughout 2015.

These phishing methods can be much more successful than traditional phishing attacks (where content is hosted solely on an unrelated domain). The techniques employed in these latest attacks are not permitted under eBay's HTML and JavaScript policy; however, a fraudster intent on stealing passwords is not going to be deterred by words alone.

26 Sep 03:00

Cop Draws Gun On Abusive Woman Who Refused To Move Vehicle

by Simon Cooper

Cop Draws Gun On Abusive Woman Who Refused To Move Vehicle


A policeman from Dawang Police Station in Lingbao has been relieved of his post after drawing his gun on an abusive woman who refused to move her minivan from in front of the station’s main door. Residents had gathered in the town for a fair, with some vehicles blocking access to the station. After the woman ignored an officer who asked her to move her vehicle, Deputy Police Chief Yang Botao approached and obstructed the woman to prevent her from leaving. She then she abused Yang and barged into him. Losing his cool, Yang drew his sidearm on the woman. One netizen said if in America the woman would be long dead.

Source: Netease

26 Sep 02:40

microrazzi

by kris
Mahmoud

straub may be depressed, but he's doin a bang up job tbh

20150923_electronmicro

this is just a what-if goof on what would happen if national geographic, founded in 1888, had been sold to fox and had to boost sales. oops, that has happened

26 Sep 02:39

reject the unisexuality of trousers

by kris

20150925_mants

also try new MANdresses — sundresses for MEN. they’re covered in those ninja-star-looking plants that bees have sex with, how metal is that?!

26 Sep 02:38

Native Village

by Dorothy
Mahmoud

someone print this out for kiel

Comic

25 Sep 08:41

Remap: Nested Data Multitool for Python

by Mahmoud Hashemi
Mahmoud

in case you didn't see my latest

This entry is the first in a series of "cookbooklets" showcasing more advanced Boltons. If all goes well, the next 5 minutes will literally save you 5 hours.

Intro

Data is everywhere, especially within itself. That's right, whether it's public APIs, document stores, or plain old configuration files, data will nest. And that nested data will find you.

UI fads aside, developers have always liked "flat". Even Python, so often turned to for data wrangling, only has succinct built-in constructs for dealing with flat data. List comprehensions, generator expressions, map/filter, and itertools are all built for flat work. In fact, the allure of flat data is likely a direct result of this common gap in most programming languages.

Let's change that. First, let's meet this nested adversary. Provided you overlook my taste in media, it's hard to fault nested data when it reads as well as this YAML:

reviews:
  shows:
    - title: Star Trek - The Next Generation
      rating: 10
      review: Episodic AND deep. <3 Data.
      tags: ['space']
    - title: Monty Python's Flying Circus
      rating: 10
      tags: ['comedy']
  movies:
    - title: The Hitchiker's Guide to the Galaxy
      rating: 6
      review: So great to see Mos Def getting good work.
      tags: ['comedy', 'space', 'life']
    - title: Monty Python's Meaning of Life
      rating: 7
      review: Better than Brian, but not a Holy Grail, nor Completely Different.
      tags: ['comedy', 'life']
      prologue:
        title: The Crimson Permanent Assurance
        rating: 9

Even this very straightforwardly nested data can be a real hassle to manipulate. How would one add a default review for entries without one? How would one convert the ratings to a 5-star scale? And what does all of this mean for more complex real-world cases, exemplified by this excerpt from a real GitHub API response:

[{
    "id": "3165090957",
    "type": "PushEvent",
    "actor": {
      "id": 130193,
      "login": "mahmoud",
      "gravatar_id": "",
      "url": "https://api.github.com/users/mahmoud",
      "avatar_url": "https://avatars.githubusercontent.com/u/130193?"
    },
    "repo": {
      "id": 8307391,
      "name": "mahmoud/boltons",
      "url": "https://api.github.com/repos/mahmoud/boltons"
    },
    "payload": {
      "push_id": 799258895,
      "size": 1,
      "distinct_size": 1,
      "ref": "refs/heads/master",
      "head": "27a4bc1b6d1da25a38fe8e2c5fb27f22308e3260",
      "before": "0d6486c40282772bab232bf393c5e6fad9533a0e",
      "commits": [
        {
          "sha": "27a4bc1b6d1da25a38fe8e2c5fb27f22308e3260",
          "author": {
            "email": "mahmoud@hatnote.com",
            "name": "Mahmoud Hashemi"
          },
          "message": "switched reraise_visit to be just a kwarg",
          "distinct": true,
          "url": "https://api.github.com/repos/mahmoud/boltons/commits/27a4bc1b6d1da25a38fe8e2c5fb27f22308e3260"
        }
      ]
    },
    "public": true,
    "created_at": "2015-09-21T10:04:37Z"
}]

The astute reader may spot some inconsistency and general complexity, but don't run away.

Remap, the recursive map, is here to save the day.

Remap is a Pythonic traversal utility that creates a transformed copy of your nested data. It uses three callbacks -- visit, enter, and exit -- and is designed to accomplish the vast majority of tasks by passing only one function, usually visit. The API docs have full descriptions, but the basic rundown is:

  • visit transforms an individual item
  • enter controls how container objects are created and traversed
  • exit controls how new container objects are populated

It may sound complex, but the examples shed a lot of light. So let's get remapping!

Normalize keys and values

First, let's import the modules and data we'll need.

import json
import yaml  # https://pypi.org/pypi/PyYAML
from boltons.iterutils import remap  # https://pypi.org/pypi/boltons

review_map = yaml.load(media_reviews)

event_list = json.loads(github_events)

Now let's turn back to that GitHub API data. Earlier one may have been annoyed by the inconsistent type of id. event['repo']['id'] is an integer, but event['id'] is a string. When sorting events by ID, you would not want string ordering.

With remap, fixing this sort inconsistency couldn't be easier:

from boltons.iterutils import remap

def visit(path, key, value):
    if key == 'id':
        return key, int(value)
    return key, value

remapped = remap(event_list, visit=visit)

assert remapped[0]['id'] == 3165090957

# You can even do it in one line:
remap(event_list, lambda p, k, v: (k, int(v)) if k == 'id' else (k, v))

By default, visit gets called on every item in the root structure, including lists, dicts, and other containers, so let's take a closer look at its signature. visit takes three arguments we're going to see in all of remap's callbacks:

  • path is a tuple of keys leading up to the current item
  • key is the current item's key
  • value is the current item's value

key and value are exactly what you would expect, though it may bear mentioning that the key for a list item is its index. path refers to the keys of all the parents of the current item, not including the key. For example, looking at the GitHub event data, the commit author's name's path is (0, 'payload', 'commits', 0, 'author'), because the key, name, is located in the author of the first commit in the payload of the first event.

As for the return signature of visit, it's very similar to the input. Just return the new (key, value) you want in the remapped output.

Drop empty values

Next up, GitHub's move away from Gravatars left an artifact in their API: a blank 'gravatar_id' key. We can get rid of that item, and any other blank strings, in a jiffy:

drop_blank = lambda p, k, v: v != ""
remapped = remap(event_list, visit=drop_blank)

assert 'gravatar_id' not in remapped[0]['actor']

Unlike the previous example, instead of a (key, value) pair, this visit is returning a bool. For added convenience, when visit returns True, remap carries over the original item unmodified. Returning False drops the item from the remapped structure.

With the ability to arbitrarily transform items, pass through old items, and drop items from the remapped structure, it's clear that the visit function makes the majority of recursive transformations trivial. So many tedious and error-prone lines of traversal code turn into one-liners that usually remap with a visit callback is all one needs. With that said, the next recipes focus on remap's more advanced callable arguments, enter and exit.

Convert dictionaries to OrderedDicts

So far we've looked at actions on remapping individual items, using the visit callable. Now we turn our attention to actions on containers, the parent objects of individual items. We'll start doing this by looking at the enter argument to remap.

# from collections import OrderedDict
from boltons.dictutils import OrderedMultiDict as OMD
from boltons.iterutils import remap, default_enter

def enter(path, key, value):
    if isinstance(value, dict):
        return OMD(), sorted(value.items())
    return default_enter(path, key, value)

remapped = remap(review_list, enter=enter)
assert remapped['reviews'].keys()[0] == 'movies'
# True because 'reviews' is now ordered and 'movies' comes before 'shows'

The enter callable controls both if and how an object is traversed. Like visit, it accepts path, key, and value. But instead of (key, value), it returns a tuple of (new_parent, items). new_parent is the container that will receive items remapped by the visit callable. items is an iterable of (key, value) pairs that will be passed to visit. Alternatively, items can be False, to tell remap that the current value should not be traversed, but that's getting pretty advanced. The API docs have some other enter details to consider.

Also note how this code builds on the default remap logic by calling through to the default_enter function, imported from the same place as remap itself. Most practical use cases will want to do this, but of course the choice is yours.

Sort all lists

The last example used enter to interact with containers before they were being traversed. This time, to sort all lists in a structure, we'll use the remap's final callable argument: exit.

from boltons.iterutils import remap, default_exit

def exit(path, key, old_parent, new_parent, new_items):
    ret = default_exit(path, key, old_parent, new_parent, new_items)
    if isinstance(ret, list):
        ret.sort()
    return ret

remap(review_list, exit=exit)

Similar to the enter example, we're building on remap's default behavior by importing and calling default_exit. Looking at the arguments passed to exit and default_exit, there's the path and key that we're used to from visit and enter. value is there, too, but it's named old_parent, to differentiate it from the new value, appropriately called new_parent. At the point exit is called, new_parent is just an empty structure as constructed by enter, and exit's job is to fill that new container with new_items, a list of (key, value) pairs returned by remap's calls to visit. Still with me?

Either way, here we don't interact with the arguments. We just call default_exit and work on its return value, new_parent, sorting it in-place if it's a list. Pretty simple! In fact, very attentive readers might point out this can be done with visit, because remap's very next step is to call visit with the new_parent. You'll have to forgive the contrived example and let it be a testament to the rarity of overriding exit. Without going into the details, enter and exit are most useful when teaching remap how to traverse nonstandard containers, such as non-iterable Python objects. As mentioned in the "drop empty values" example, remap is designed to maximize the mileage you get out of the visit callback. Let's look at an advanced usage reason that's true.

Collect interesting values

Sometimes you just want to traverse a nested structure, and you don't need the result. For instance, if we wanted to collect the full set of tags used in media reviews. Let's create a remap-based function, get_all_tags:

def get_all_tags(root):
    all_tags = set()

    def visit(path, key, value):
        all_tags.update(value['tags'])
        return False

    remap(root, visit=visit, reraise_visit=False)

    return all_tags

print(get_all_tags(review_map))
# set(['space', 'comedy', 'life'])

Like the first recipe, we've used the visit argument to remap, and like the second recipe, we're just returning False, because we don't actually care about contents of the resulting structure.

What's new here is the reraise_visit=False keyword argument, which tells remap to keep any item that causes a visit exception. This practical convenience lets visit functions be shorter, clearer, and just more EAFP. Reducing the example to a one-liner is left as an exercise to the reader.

Add common keys

As a final advanced remap example, let's look at adding items to structures. Through the examples above, we've learned that visit is best-suited for 1:1 transformations and dropping values. This leaves us with two main approaches for addition. The first uses the enter callable and is suitable for making data consistent and adding data which can be overridden.

base_review = {'title': '',
               'rating': None,
               'review': '',
               'tags': []}

def enter(path, key, value):
    new_parent, new_items = default_enter(path, key, value)
    try:
        new_parent.update(base_review)
    except:
        pass
    return new_parent, new_items

remapped = remap(review_list, enter=enter)

assert review_list['shows'][1]['review'] == ''
# True, the placeholder review is holding its place

The second method uses the exit callback to override values and calculate new values from the new data.

def exit(path, key, old_parent, new_parent, new_items):
    ret = default_exit(path, key, old_parent, new_parent, new_items)
    try:
        ret['review_length'] = len(ret['review'])
    except:
        pass
    return ret

remapped = remap(review_list, exit=exit)

assert remapped['shows'][0]['review_length'] == 27
assert remapped['movies'][0]['review_length'] == 42
# True times two.

By now you might agree that remap is making such feats positively routine. Come for the nested data manipulation, stay for the number jokes.

Corner cases

This whole guide has focused on data that came from "real-world" sources, such as JSON API responses. But there are certain rare cases which typically only arise from within Python code: self-referential objects. These are objects that contain references to themselves or their parents. Have a look at this trivial example:

self_ref = []
self_ref.append(self_ref)

The experienced programmer has probably seen this before, but most Python coders might even think the second line is an error. It's a list containing itself, and it has the rather cool repr: [[...]].

Now, this is pretty rare, but reference loops do come up in programming. The good news is that remap handles these just fine:

print(repr(remap(self_ref)))
# prints "[[...]]"

The more common corner case that arises is that of duplicate references, which remap also handles with no problem:

my_set = set()

dupe_ref = (my_set, [my_set])
remapped = remap(dupe_ref)

assert remapped[0] is remapped[-1][-1]
# True, of course

Two references to the same set go in, two references to a copy of that set come out. That's right: only one copy is made, and then used twice, preserving the original structure.

Wrap-up

If you've made it this far, then I hope you'll agree that remap is useful enough to be your new friend. If that wasn't enough detail, then there are the docs. remap is well-tested, but making something this general-purpose is a tricky area. Please file bugs and requests. Don't forget about pprint and repr/reprlib, which can help with reading large structures. As always, stay tuned for future boltons cookbooklets, and much much more.


25 Sep 03:23

Aqua Teen BNGO Sweepstakes Finale | Adult Swim

by Adult Swim
Mahmoud

this car is a beaut

You played the game. Now meet the lucky soul who shall blaze the streets with Carl's 2 Wycked.
25 Sep 02:52

Jenny Zigrino - Gentrified Haircuts (Stand-up Comedy)

by Laugh Factory
Mahmoud

party on the left

Jenny Zigrino has a hairy situation in her hip neighborhood.

Want to see more stand up comedy? Subscribe to the Laugh Factory's channel: http://youtube.com/subscription_center?add_user=thelaughfactory

Tell us what you thought in the comments. Please click thumbs up and add this video to your favorites if you LOL'd.

For exclusive ad free content and full length stand up videos, try out Laugh Factory VIP for only 99¢ per month: http://youtube.com/user/laughfactoryVIP

http://twitter.com/thelaughfactory
http://facebook.com/laughfactory
http://instagram.com/laughfactoryhw
http://laughfactory.com
LIVE SHOW TICKETS: http://www.laughfactory.com/clubs
25 Sep 00:07

Is it all futile?

by Benjamin
Mahmoud

lol look what showed up on my dash.

Today, the much anticipated Python 3.0 final was released. Truly, this is a historic release for the Python community, the first intentional incompatible Python release. It's been a long time in the making, and I applaud everybody who is responsible for proving Py3k is not vaporware. Guido and the other decision makers on Python-dev also deserve credit for not making py3k changes too gratuitous; many revolutionary ideas and features were proposed and rejected. I have every confidence that every incompatibility was well thought out. Much thought has also been given to making the transition as easy as possible for the community. The suggested migration path, fixing Py3k warnings in 2.6 and then applying 2to3, has been used with a fair amount of success on several projects. We've even had several Py3k love letters!

Still, I can't help being a little worried. I think the bytes and str divide will be difficult for people especially with IO where everything has to be dealt with in bytes. We may see many "x.encode('ascii')" lines popping up all over codebases. Userland libraries will need to maintain compatibility with 2.4 and 2.5 for a while; that significantly complicates the dream of maintaining just one branch for 2.x and py3k. 2to3 is not even close to perfect and will only correct the surface incompatibilities of syntax between the versions. I'm also concerned about burn out. The excitement of a new major version will certainly spur an interest in porting for a few months, but I suspect it won't be so fun after the aura wears off a bit. I hope common base libraries (PIL, Twisted, lxml, etc...) are ported soon. It will build the bridge for everything else to cross over too.

Of course, what I'm forgetting is the amazing Python community. Whatever the results, a new era has certainly begun. We just need time.
21 Sep 22:09

dr. ken lonely, m.d.

by kris
Mahmoud

sena take note

20150921_lonely

“here are your x-rays. i’m afraid you should avoid physical activity until this heals — oops, how did two tickets to everest in IMAX 3D get into the frame”

21 Sep 10:02

a damn turd

Today on Married To The Sea: a damn turd


The Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS!
21 Sep 10:00

crystal energy

Mahmoud

NOOOOO

Today on Toothpaste For Dinner: crystal energy


The Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS!
18 Sep 17:10

Kirk Fox Returns - The Kevin Nealon Show

by Laugh Factory
Mahmoud

this was a pleasant exchange

This week on The Kevin Nealon Show, Kevin is joined by guest Kirk Fox.

Want to see more stand up comedy? Subscribe to the Laugh Factory's channel: http://youtube.com/subscription_center?add_user=thelaughfactory

Tell us what you thought in the comments. Please click thumbs up and add this video to your favorites if you LOL'd.

For exclusive ad free content and full length stand up videos, try out Laugh Factory VIP for only 99¢ per month: http://youtube.com/user/laughfactoryVIP

http://twitter.com/thelaughfactory
http://facebook.com/laughfactory
http://instagram.com/laughfactoryhw
http://laughfactory.com
LIVE SHOW TICKETS: http://www.laughfactory.com/clubs
18 Sep 05:48

what is kale

Today on Toothpaste For Dinner: what is kale


The Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS!
17 Sep 19:38

WHOOPI FLOOZ

TODAYS @DREWTOOTHPASTE: WHOOPI FLOOZ
17 Sep 05:50

Fancy Lad presents "VIDEO HISTORY"

by Adult Swim
Mahmoud

some fuckng legit gags in here for real

Boston’s finest and/or worst skate crew will inspire you to great heights and/or depths.
music by Misfitchris
15 Sep 10:00

the new hire

by kris

20150914_beliefs

“buh, okay, everyone do prayers silently for the next 30 minutes. then we’ll sing one more of these songs and it’s quittin time”

15 Sep 01:25

Not in the US press; not in the Arabic press

by As'ad AbuKhalil
Tens of thousands demonstrated in Sanaa, Yemen, under the threats of shells from Gulf democratic bombers, against the GCC war on Yemen.
14 Sep 03:32

A11 by soawesome http://ift.tt/1AoQpIA

Mahmoud

Andreas, this is my tumblog, and also this is Adam Baker's soundcloud music.



A11 by soawesome http://ift.tt/1AoQpIA

14 Sep 03:05

We’re all gonna die on vacation

by dorothy
Mahmoud

so many questions

150731_dieabroad

11 Sep 18:03

Latte Banksy

by 5secondfilms

His previous works, "A Flower Growing Out of A Landfill" and "Sledgehammer Going Into a TV" were poorly received and only sold for $3.50 each plus another $0.25 for extra pumpkin syrup. A far cry from his earliest piece, the extremely successful "Edvard Munch's 'The Scream' But Now the Little Screaming Guy is saying 'Corporations,'" which made a dude laugh enough to tip an extra dollar.

This video was sponsored by Qualcomm® Snapdragon™ and shot with the LG G4, powered by a Snapdragon processor.

Snapdragon processors support breath-taking speed, jaw-dropping graphics, ultra-fast connectivity and longer battery life so you can do more of what you love.

Get more info on Snapdragon here: http://bit.ly/1EtqfpN
And check out our behind the scenes from the shoot here: http://bit.ly/1JHFnz9
10 Sep 22:21

Photomontage (Forggensee Panorama) -2

by slaporte
Mahmoud

"digitally altered to appear like a real landscape"

10 Sep 09:29

Photographer Loses Copyright Suit Over CC-Licensed Photo on Flickr

by slaporte
Mahmoud

sooooo victory for CC then

10 Sep 09:27

Prospecting On The Playa: Generating Leads At Burning Man

by slaporte
Mahmoud

now we're talking

10 Sep 09:24

Bully

Mahmoud

old pbf would've done this in THREE panels

Bully
10 Sep 09:23

the internet loop

Mahmoud

github -> twitter -> tumblr if i'm not at work -> the old reader if i've tapped tumblr for that half of the day -> my own blog for some reason -> analytics pages :|

Today on Toothpaste For Dinner: the internet loop


The Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS!