U.S. law guarantees zero weeks of paid maternity leave. We are one of only four countries so stingy, along with Papau New Guinea, Suriname, and Liberia. In its place we have 12 weeks of conditional leave for some workers in the form of the Family and Medical Leave Act. But there's a reason the acronym starts with FML.
I feel like I owe my wife an apology after reading that story because I never realized how stressful returning to work is, and how awful the FMLA is. It's 2014, and women make up half of the population - how has this not been fixed yet? Let's put it in perspective: the U.S. has zero days of maternity leave, Pakistan provides 12 weeks.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
As a "Millenial", I'm usually an easy mark for Baby Boomer trolls pushing self-serving & intellectually dishonest stereotypes; and whenever fellow Millenials buy into it, I can't help but feel that it's a case of "a lie repeated often enough [becomming] the truth". While there is no shortage of stories about how unmotivated, entitled, and coddled Millenials are, the plural of "anecdote" is not "data". But maybe it's just easier for Boomers to blame others than to accept that they've grossly mismanaged...well, everything, really.
For my part, it feel like I'm stuck in neutral no matter how hard I work. "Life" seems like it's accelerating (married with kids last year, new baby this year, & I turn 30 this month) so I've been confronted with new challenges like trying to buy a house, planning for kids' college expenses, and saving for my own retirement (because I keep hearing that Social Security is going bankrupt. Perhaps on account of my impending birthday, I recently found myself wondering how different things were for someone who turned 30 when I was born, way back in 1983. So I dug into the data at the Census Bureau and the Bureau of Labor Statistics to have a look.
Before I get too wonky, the bottom line is that, after accounting for inflation, the average total cost for three major expenses (house, car, and education) that a 30-year-old anticipates are only 13% higher in 2013 than they were in 1983. That isn't terrible, since our hypothetical 30-year-old would still break even in that scenario, but the number of people who can't afford to buy a house, car, and education has grown by 25 million (from 75 million people in 1983 to 100 million peoplein 2013), despite all efforts to enhance access to affordable lending for college & housing. To be clear, though, regulations aren't the only pressure on the market, and average salary, for example, has fallen by almost 23% over the same period, even while the median salary has grown by 11%, suggesting a relatively steep salary reduction for low earners combined with a modest increase in the number of high vs low salary earners.
Data
The table below contains the data I collected—with linked sources where applicable. I relied on averages (which can be a misleading statistic) because they were the most readily available information for all categories, so don't exaggerate the importance of these numbers. However, another study recently found similar trends, though the magnitudes differ substantially. (Sure, theirs were compiled by a University of Michigan economist, but I think we all know who's numbers are better.)
One important thing to note is how little the total cost of housing, in particular, has changed. While the "sticker price" of housing has increased, it has largely been at the expense of loan interest rates (which is acceptable to banks so long as they can recoup the difference through fees in combination with volume of sales). In other words, there have not been any real gains in property value over the last thirty years; to wit, rising prices have been almost entirely an artifact of changes in loan financing. Of course, that trick only works once because rates must eventually stop falling, and the ramifications of increasing interest rates will consume more than the associated growth because overall economic activity will decrease when rate increases depress home prices and discourage (or prevent) existing owners from selling and new buyers from investing. (The expected return on a financed investment is low or negative when interest rates are rising because future buyers may be unable to afford the asset.)
Another notable trend is education, where average costs today are 844% of what they were in 1983. Not to mention that some sources suggest that students only financed a fraction of their education in 1983, versus almost all of it today. According to Congressional Budget Office estimates, the government made $41 billion on student loan interest in 2013&which is more profit than all but two corporations in the world, Apple & Exxon Mobile.
The table also shows that an average earner in 1983 winds up with a $110,000 surplus after 30 years, while his 2013 counterpart can expect almost a quarter million dollar shortfall. (As an aside, falling interest rates over the last 30 years created opportunities to cash out equity that are unlikely to repeat with rising rates moving forward; refinancing in the late 90's early 00's would push the surplus closer to $200,000.) Another way to look at it is that an average earner cannot afford an average house in 2013 (although a median earner could).
1983 2013 Cost Terms Total Cost Terms Total House $165.4 30 years @
13.42% $843.8 $319.0 30 years @
4.26% $896.9 Car $18.6 5 years @
13.0% $44.2 $29.2 5 years @
4.22% $61.6 School $2.4 10 years @
6.0% $5.6 $21.3 10 years @
4.06% $47.3 Salary 30 years @ $33.5 $1,004.3 30 years @ $25.9 $778.4 Total $110.8 −$227.4 All data presented in thousands of 2010 dollars, converted using the BLS inflation calculator. Excludes all other costs of living, pay raises or promotions, asset appreciation/depreciation, etc.
Household Spending
I also looked at overall household spending, and I was surprised by how little it has changed in 30 years. Looking at the chart below, which shows five basic categories of household spending for 1984 and 2011 (1983 wasn't captured and 2013 data isn't available yet), you can see that "products" (clothes, food, transportation) have gotten cheaper, while "services" (healthcare) and housing have risen&echoing the findings of the previously-mentioned study by CNN.
Conclusion
As home mortgage interest rates rise, the only way for buyers to afford prices commensurate with the balances on existing homes will be for salaries to rise, with the greatest benefit associated with increases at the lowest income levels (i.e., it is more important to push some of the 100 million people who can't afford a home over that threshold than it is to increase the income of high earners or those who can marginally afford a home). Additionally, we should reevaluate "college for everyone" financing policies based on both the employment prospects and the real costs of high debt-loads for young people. The costs of college are more likely to be controlled by managing demand than by increasing financial aid.
I know that I'm shouting into the void here, but I have to hope that I'm not the only one who can see something in the data. (Although it's OK if I'm the only one looking for it on weekends.) Maybe I'm too optimistic, but I still think there is hope in spite of the massive debt built up over two wars & the Great Recession. I just need Baby Boomers to stop complaining and freeloading on entitlements, and to put in some hard work on actual solutions—or better yet, just get out of my way. (See what I did there?)
“If you do not work on an important problem, it's unlikely you'll do important work. It's perfectly obvious.”
—Richard Hamming
Richard Hamming once gave a talk titled You and Your Research, where he described the process of doing "world class" work. I first read the paper some years back, and it stuck with me as a reminder—and an accusation—of what to aspire to. Yesterday, I was accepted into the pilot cohort for the Online Master's of Science in Computer Science program at Georgia Tech, in partnership with Udacity and AT&T. I'm excited and anxious with the hope that this helps me to follow the path Dr. Hamming described for doing great work.
I've been working on a project that required interacting with a UCI chess engine, Stockfish, via Python. In particular (and like other people), I needed a way to enumerate the legal moves on a chess board. Mostly as an academic exercise, I wrote my own chess game model, and as I worked on the project I realized that other people might find it useful, too. So today I released Chessnut as an open source Python package.
Chessnut is a chess model not a chess engine, i.e., it has no artificial intelligence controller to play chess (it is far too slow to build into a strong engine anyway), and it doesn't have a GUI to facilitate playing a game. But those limitations were intentional; the whole package (excluding unit tests) is contained in three files that take up only about 200 lines of code. And for that you get all the core logic of chess, move validation (including check, checkmate, castling, and en passant)—all in pure Python. For comparison, the full-featured PyChess has 25,000 lines of code. I chose a simple representation of the board in order to make it easy to understand.
That simplicity has benefits for testing, as well. Chessnut passes unit testing with 99% branch coverage using the coverage.py package, and scores 10.0/10 in pylint. That's not to say it's perfect—I'm still finding bugs in it regularly—but, I think it's stable at this point, and certainly ready for public release.
I chose Unlicense for the project, so there aren't any restrictions on how it can be used. The source code is available over on Github.
Earlier this week I found an online AI competition, robot game, and decided to have a go at it. I forked the git repository and made a few commits to the project before setting out to work on my bot. I ended up with two bots: Polybot (who once ranked as high as 150th), and "Ben": an AI inspired by an episode of Sealab 2021 in which Murphy—after being trapped beneath a soda machine—admonishes his benevolent companion, Ben the scorpion, to "sting and move" in his battle with a Roomba-like cleaning robot.
Thus, I built Ben to alternate between two actions, "sting", and "move", and to announce those actions (and more) in the game log. Ben is not a successful AI, but I get a laugh out of thinking about the confusing messages he leaves for opponents, so I think he's a winner.
ben.py
import rg class Robot: turn = 0 def act(self, game): if self.__class__.turn != game['turn']: self.__class__.turn += 1 if self.__class__.turn == 99: print 'Bebop. Cola. Good!' self.__class__.suppress = True if self.__class__.turn % 2 == 0: print "sting" else: print "move" if self.__class__.turn % 2 == 0: return self.sting(game) else: return self.move(game) def sting(self, game): tgt = rg.toward(self.location, rg.CENTER_POINT) for loc in rg.locs_around(self.location): bot = game['robots'].get(loc, {}) bot_id = bot.get('player_id', self.player_id) if bot_id != self.player_id: tgt = loc break if tgt == self.location: tgt = (tgt[0]+1, tgt[1]) return ['attack', tgt] def move(self, game): tgt = rg.toward(self.location, rg.CENTER_POINT) if tgt == self.location: return ['guard'] return ['move', tgt] def make_necklace(self, teeth): class Necklace: def __init__(self, items): self.items = items def __str__(self): ''.join(self.items) return Necklace(teeth)
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
Pi (π), the mathematical constant for the ratio of the circumference of a circle to its diameter, holds a special place in pop culture. People compete to memorize digits of π (the current world record is 67,890 digits!), calculate the digits of π (the current world record is 10 trillion digits!), and write entire books about π. With all the attention it gets, a substantial mythos has grown up around π—and not all of it is true.
Perhaps the most common misconception is about finding other numbers in the expansion of π. This monologue from Person of Interest is a great speech—but it's not true. We know that π is irrational (proof) and transcendental (proof), which means that the decimal expansion is infinite and never repeats, but there is currently no proof that pi meets the stronger condition of being normal—so we can't say whether every finite sequence can be found in the expansion. A more detailed explanation was offered recently on reddit in response to finding Jenny's number in the expansion of π.
We also learn very little from continuing to calculate new digits of π. It is an interesting computer science problem to find efficient algorithms to compute the digits & compression techniques to store it, but there is very little practical significance since 39 digits of π is enough to calculate the circumference of the known universe to the width of a hydrogen atom, and even less mathematical significance since there are already exact expressions for the value.
None of this is to say that π isn't still a cool number. It pops up throughout mathematics and physics—often in surprising places like Buffon's needle. And it has the distinction of being labeled one of the "five fundamental mathematical constants". So although π is one of the oldest numbers studied in mathematics, it is worth remembering that we still don't know everything.
“A weakness of Go is that any generic-type operations must be provided by the run-time.” —Golang Blog
The Golang Blog casually mentions that Go does not currently support generic-type functions - which is...stunning to me. One of the most common patterns in programming is abstracting functions from the input data type. For instance sorting algorithms are the same for integers, strings, floating point numbers, and any other data type that allows pairwise comparison; but Go requires either separate implementations for every type, or complicated workarounds. I can appreciate that the design goals of Go don't strictly require generic type functions, but code tends to be far less reusable without them. I hesitate to be too critical because I'm an amateur and I like Go, but the term "weakness" seems like an understatement in this case.
I came across this limitation as I was trying to implement a generic linked list. I tried using interface{} types and the reflect package, and while interface{} allows generic type functions, it changes the type (though not the underlying type) to interface{}. I also tried passing in a type argument or constructor function in order to select the proper type at runtime, but both approaches failed because the name of a type is not the same as the type itself.
Eventually I realized that a generic-type linked list would behave like the built-in append function, which extends slices of any type without losing the type information. That's when I learned that the append function is only able to do that because it is implemented through the go runtime - which simply isn't an option in most cases (nor should it be).
Richard Feinman said—although I'm sure he wasn't the first—that you don't truly understand something unless you can explain it to a college freshman. I like to think I understand a bit of modern physics, but then I'm reminded how little I really do. This is one of those times. I've tried to explain particle physics and cosmology before, but I’ll never do it as well as Nobel laureate Steven Weinberg.
Monads are one of the most important (and frustrating to grok) topics in functional programming. Most attempts to introduce them either skip important steps or oversimplify with a flawed analogy that devolves into a tangled mess of caveats, exceptions, and limitations when it inevitably breaks down. To avoid that, I'm not going to worry about all of the details, and I'll make generalizations that are only mostly true at best. There are already enough good monad and functor tutorials on the Internet anyway.
The word "monad" comes from category theory, and it's reused in functional programming as the name of a pattern that allows pure functions to perform "extra" actions, AKA side effects. The monad pattern is simply the combination of a type constructor, together with a bind() and unit() method. It may help to think of a monad as a container that comes with instructions for packing and unpacking regular data types. But monads are typically unnecessary outside functional programming because impure functions can explicitly perform side effects.
For example, in Python you could use the following code to compose (sequentially apply) an arbitrary list of functions to an input (main effect) and print the result of applying each function (side effect).
Python
def apply(fs, v): res = v for f in fs: res = f(res) print res # This can't happen in a "pure" function return res
Doing the same thing with pure functions requires a monad - which has two functions: unit(), which makes (in this case) a tuple from a single value, and bind() which "teaches" functions that expect a single value what to do with the newly-formed tuple.
def compose(fns): # fp helper to chain function application return reduce((lambda g, f: lambda x: f(g(x))), fns) # define a starting value and some arbitrary functions v = 1 fs = [lambda x: x*3, lambda x: x+x, lambda x: x**2] res1 = apply(fs, v) # prints intermediate results res2, inter = compose(map(bind, fs))(unit(v)) print inter # prints intermediate results print res1 == res2 # True
In the real world, you don't typically compose arbitrary functions like this - especially not in Python. But monads can also be used to pass additional information into functions, which can be used to create a computational dependency in lazy languages in order to enforce a specific evaluation order - and that allows pure functional languages to implement useful things like Identity, I/O, and Maybe.
So just remember, the reason you've never heard of monads outside functional programming is that you usually don't need them, but that doesn't mean they're not useful - and they certainly shouldn't be confusing.
Well, folks, it's been a good run. We shared some cats, shuffled around a few trillion dollars, and figured out the true purpose of the Internet. But all good things must come to an end, and I'm afraid that the prognosis for the Internet is bleak, and there is very little that can be done to save it.
It doesn't matter if politicians learn to code if they don't understand the technology to begin with. We will continue to see legislation like SOPA and PIPA, lawsuits against net neutrality from companies that paradoxically commit to support net neutrality, government attacks on privacy, and fracturing from every corner of the political spectrum.
To be fair, not everything about the Internet has been positive - fraud, illegal activity, and other problems remain common. But even after bad ideas are defeated, they find more creative ways and come back, like the cat we all love sharing so much.
It doesn't seem to matter what the evidence shows, nor that world experts say that legislation won't work, nor that the arguments for regulation are often farcical (Verizon is arguing that throttling internet traffic is an issue of free speech protected under the First Amendment), or that we see examples of literally Orwellian practices. Because even when the attacks on the Internet fail, we'll do it to ourselves by locking the internet, and locking our devices.
This isn't about cat pictures, email, social networking, or any other single use of the Internet. The Internet represents the collective knowledge of mankind, and it is arguably the greatest human achievement in history. (There is a reason that the UN declared internet access a basic human right.) And we're throwing it away because people who don't understand how it works are making laws based on the input from people who only want to make more money from it.
So I'm calling it: the Internet is dead. Sure, it'll still drag on for many years, but only because we can't seem to treat anything but animals with any dignity. We ought to take it out behind the woodshed and put it down, just like Old Yeller. Then maybe we can get on with building a GNU one.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
This year, the US became the world’s largest producer of oil and natural gas, surpassing Russia - thanks, in no small part, to shale oil production (AKA “fracking”). But, while interesting, that’s not the story here. The real story is just how much energy the US produced: 50 quadrillion BTUs. So how much energy is that? It’s enough to turn Lake Erie into a hot tub by raising the average temperature to just under 100°F. Even so, that's only about half of the energy used by the US in a given year.
Art may be the subject about which I am least knowledgable. Perhaps because it is seemingly restricted to those who have either the exuberant passion or gross opulence to remain invested more than fleetingly, but also because the mere notion of a piece being recognized as masterful on the basis of subjective consensus is anathema to me - the seemingly tautological distinction of culturally significant works of art because they are culturally significant requires a higher level of enlightenment than I have attained.
So after seeing stories about paintings like Orange, Red, Yellow by Rothko - which the NY Times described as a "dreamy canvas of three colors", but which to me looks more like a progression of ever-worsening mistakes - selling for millions at auction, it makes me chortle with Schadenfreude to see that the "experts" can't tell modern masterpieces from the work of 4-year-olds. And with the high bar set by masters like Matisse, both the experts and the preschoolers have their work cut out for them.
Student loans are a big deal, surpassing $1 trillion over the summer; more than car loans or credit card debt - now second only to home mortgages in the United States. For several years, it's been called a bubble (although not everyone agrees on that point), and compared to the situation with home mortgages in 2007. Perhaps the most common refrain about student loans compared to other forms of consumer debt is that student loans cannot be discharged through bankruptcy. However, as pointed out on Hacker News that isn't quite true.
Quoting the HN source:
Instead, Congress requires student loan borrowers to initiate an adversary proceeding, a separate lawsuit filed within the bankruptcy case, to prove that repaying their student loan debt would be an "undue hardship."
…
One, that the borrower and any dependents cannot maintain a minimal standard of living based on current income and expenses; two, that additional circumstances indicate this is likely to be the case for a significant portion of the borrower's repayment period; and three, that the borrower made a good faith effort to repay the loans.
There are also links to a a couple legislative proposals that would change this decidedly silly system, and to a Huffington Post article that argues many people don't try to discharge student loans because they don't know they can. Which just goes to show that GI Joe was right: knowing is half the battle.
“To those publishers here today who believe that you can buy DRM that will stop your books from appearing on the Internet without restriction, I say to you, 'Behold, the typist.'”—Cory Doctorow
I chuckled at the recent story of a professor cracking Kindle DRM with a robot, because it reminded me of the prescient quote above from Cory Doctorow. It is just the most recent in a long list of studies and examples from gaming, music & moves showing that DRM doesn't work. So why the legal charade - if it is legal for a computer to take a picture of itself and use OCR to extract the text of an ebook, then why is it illegal for the computer to directly extract the text? I suspect that it comes down to ego.
Businesses love the idea of DRM. DVD region codes, used game restrictions, restricting license resale, etc. - allow companies to artificially stoke demand, which ostensibly increases unit prices; but higher unit prices do not guarantee higher profits. Unfortunately, most people - even children today - don't really understand technology or the central arguments against DRM; so I suspect that most corporate executives can't believe that the technology doesn't work and shouldn't be used.
I have some hope that businesses are starting to learn, though. Kevin Spacey recently spoke (transcript here) on the Netflix model of content management. He said, in part, "Give people what they want, when they want it, in the form they want it in, at a reasonable price, and they’ll more likely pay for it rather than steal it." You don't need to understand the internet to understand that your business shouldn't treat its customers as the adversary.
This little snippet of Python code got some attention yesterday over at Hacker News. The thing is, it's idiomatic code. This is what good Python is supposed to look like.
def grouper(iterable, n, fillvalue=None): "Collect data into fixed-length chunks or blocks" # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args)
The short explanation is that it makes a generator from the input sequence and groups the elements into a list of n-length elements by calling the generator n times per row. Pretty neat.
Generators and coroutines are an under-appreciated aspect of Python for a number of reasons, but there is a good (albeit long) introduction over here.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
I built my latest project with Django and deployed on Heroku. I thought it would be worth documenting some of the problems I ran into because the existing solutions I was able to find seemed excessively complex, woefully out of date, or both. Based on my experience with this project, the information here may not be valid for very long - so keep in mind that this post is (function(){var a=86400000;var b=new Date().getTime();var c=new Date('8/15/13');var d=Math.round(Math.abs(b-c)/a);var e="";if(d>365){e="more than a year";}else if(d>270){e="close to a year";}else if(d>30){var f=Math.round(d/30);e=f.toString()+" "+((f==1)?"month":"months");}else{e=d.toString()+" "+((d==1)?"day":"days");};document.write(e);})(); old. Additionally, the full contents of my requirements.txt file are at the end of the post, so you can check the versions I used against the current release to check whether any of this remains applicable.
After the break I'll cover:
Setting up a custom User model in Django 1.5+
Using the custom User model and a custom authentication backend with the django-registration app to handle account management
Several undocumented gotchas configuring & deploying the app to Heroku (mostly ID-10T errors)
There is too much code involved to cover everything, so the code snippets below only show enough to understand the principle, not necessarily all the code required for an app to function. However, I've tried to link to the source material that led to my solution whenever possible.
Custom User Model:
Always use the get_user_model() import pattern to access the User model (in the import section of your modules). Lots of third-party modules seem to miss this...
Python:
try: from django.contrib.auth import get_user_model User = get_user_model() except ImportError: from django.contrib.auth.models import User
I followed this guide to use the email field as the account username, then added a false username field with the @property decorator (this is hack-ish, but lets your model work with apps that don't fully implement the Django 1.5+ User model - like django-registration). You also need to refer to an unused username field as an argument in the PlayerManager class methods. Also notice that the create_user() method uses email.lower() instead of UserManager.normalize_email(), which is important if you want to use case-insensitive emails for authentication (discussed below).
The default backend from django-registration can be used with a custom User model if you override the user creation form class & the urls.py registration view. The .as_view() method optionally accepts a form_class argument that can be used for this. So in your yourappRegistration.urls module:
The user creation form inheriting from the User class combined with the get_user_model() pattern produces a more generic form for user registration. Remember to always use the USERNAME_FIELD (set in the custom User model class) to reference the username field in your code (better than relying on the .username property hack above). So in your yourappRegistration.forms module:
Python:
class PlayerCreationForm(forms.ModelForm): … class Meta: model = User fields = (User.USERNAME_FIELD,)
The registration view from the default backend does not use the generic User model patterns from Django 1.5+, but it can be extended by creating a module yourappRegistration.views:
There are actually a number of forks from the baseline django-registration framework to address the custom User model issue and work with email addresses as the username, but I was trying to stick with the main branch for all dependencies so I ended up using most of a custom registration backend.
User Authentication
I followed this guide to using case insensitive email field for authentication - a much better solution than Stack Overflow answers [1] or [2].
Python:
class CaseInsensitiveBackend(object): … def authenticate(self, username=None, password=None): try: user = User.objects.get(**{User.USERNAME_FIELD: username.lower()}) if user.check_password(password): return user except User.DoesNotExist: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
Because the project uses a dedicated app for all user management functions, the login/logout buttons in the rest-framework views aren't linked by default. That can be fixed in the yourapp.urls module:
Authentication emails get sent with www.example.com/activate/<key> by default because of the default value in the Sites database. You can edit the database entry directly using the admin site (if configured), or you can load initial data from fixtures.
Deploying to Heroku via git (as described here) initially failed. The solution turned out to be recreating the git repository and the app via the heroku toolbelt CLI.
Postgre sql was harder to configure than sqlite3 (during development), but it wasn't well documented that the database must be promoted in order to set the relevant environmental variables for use by the app.
I went overboard with the .env file configurations, abstracting several variables from settings.py that caused some bizarre errors when using manage.py. In particular, only the default actions from django were available because the value of SECRET_KEY wasn't loading properly from .env; leave the secret key alone in settings.py.
I ran into two problems with Google Analytics: first, the dashboard didn't show "tracking installed" until I added the legacy ga.js snipped to the template <head> (as outlined here), and second, the dashboard seemed unhappy because I had two accounts pointed to heroku apps (both using default urls that end in herokuapp.com), when what I needed was two profiles under a single "Heroku" account.
There seems to be much ado about serving static files from S3 or CDN instead of from Heroku, but the Heroku guide worked immediately for me, and was a lot simpler than the S3 write-ups. The only hangup I had was that collectstatic required an empty /static/ directory in the project - which git doesn't support. The general consensus is to add a .gitignore file to the folder.
“...I would _strongly_ recommend against anyone trusting their private data to a company with physical ties to the United States.”—Ladar Levison, Owner Lavabit, LLC
This is bad. Not because a company is closing down, but because it is illegal to reveal why.
Whether the rest of the world engages in the same kind of surveillance is moot - we can't control them. Neither does it matter the number of attacks "prevented" by surveillance - even if we stipulate that surveillance was solely responsible for preventing some attacks, simply by stopping them we can't know how many would have been prevented (or failed on their own) without it.
But the truth most often glossed over is that we're changing our most fundamental rules for a problem that is vanishingly rare. How rare? So rare that you're more likely to be killed by a toddler than a terrorist. (Maybe that's why they warrant a pat down by the TSA.)
Well-meaning people built these systems to save lives, but they're running out of control. In time, I think the last sentence of the Lavabit letter will prove ominously prescient, and it's going to cost us all something in the end.
I just can't shake one thought in particular:
This Is Wrong.
Readability Counts @readabilitycounts - Tumblr Blog | Tumlook