I’d been using the sqlite3 that came installed on Mac OS X but I ran into some portability issues — not every system has it installed. So I decided to bite the bullet and include it with my code.
It was trivial! I downloaded a zip with 3 files (sqlite3.c,sqlite3.h, and sqlite3ext.h). Added sqlite3.c to my list of sources and it just compiled! No configuration, no trickly flags, it just worked!
Author: peteware
Taxes on the top 1%
From Conor Clarke is this chart plotting the effective federal tax rate of the upper 1%.
First off, never trust a chart that doesn’t start at 0 but anyway. What’s interesting is that this is the effective rate being paid (not the marginal rate).
Here’s some related information that shows how income has grown for the wealthy. This is also the chart that makes a great argument that income inequality isn’t representative of an educational gap. Presumably, the top 10% have all received comparable educations — yet the top 1%’s income has grown even more.
And in the most recent past, the very highest earners did very well indeed, capturing almost three-quarters of total income growth in the economic expansion of 2002 to 2006, while the remaining 99 percent of the U.S. population split among themselves the final 25 percent of the increase.
Unemployment post-recession
This graph has been making the rounds (I got it from Barry Ritholtz’s). It shows the percentage change in unemployment (Y-axis) and the months since the official start of the recession.
What’s particularly dramatic about this is employment continues to worsen and over a much longer period of time than past recessions. E.g. this recession is going to be deeper and longer than past ones.
What I don’t like about this chart is that it is the percentage change in a rate. For example, the unemployment in 1960 was ~6%. A 50% increase brings it up to 9%. In 2007, unemployment was 4.5%. A 100% increase brings it up to 9%, too.
Storm in the City
Cash-for-Clunkers
It looks like Cash-for-Clunkers has passed. I could get $4,500. The way it’s supposed to work is you give your old car to the dealer and the dealer discounts the price of the car. I think the car is supposed to be junked so it’s not clear there’s any trade in value.
Here are some notes:
In a nutshell, your vehicle qualifies for trade-in credit if:
- It is at most 25 years old.
- It gets 18 miles a gallon or less.
- It is drivable.
- It is registered.
- It has been insured for the past year.
You can find out what gas mileage your car or truck should get here.
I’m not sure my car qualifies! According to the web site my car gets 19mph! I don’t believe it!
Mercurial, Apache, and OpenSuse 11.1
Mercurial’s Web Interface
Funny how some things can turn out to be much easier than you fear. I’d been meaning to make some of my code accessible via a web interface. It turned out to be much easier than I expected.
Getting Apache Setup
I didn’t want to run Mercurial as .cgi script. I’d had some initial problems with mod_python and decided I wanted to try out the newer wsgi interface.
Installing mod_wsgi
mod_wsgi was not installed by default. I went to (software.opensuse.org)[http://software.opensuse.org/search?q=mod_wsgi] to find an RPM. I got it and installed it:
www# wget http://download.opensuse.org/repositories/Apache:/Modules/openSUSE_11.1/i586/apache2-mod_wsgi-2.5-1.1.i586.rpm www# rpm -i apache2-mod_wsgi-2.5-1.1.i586.rpm
I then needed to activate the wsgi module in apache2:
www# a2enmod wsgi www# /etc/init.d/apache restart
Configuring Apache
WSGIScriptAlias /hg /path-to-repository/scripts/hgwebdir.wsgi
Order deny,allow
Allow from all
The WSGIScriptAlias directive is similar to the Apache Alias directive in that it specifies either a directory as containg wsgi scripts or in this case that “/hg” should map to the script hgwebdir.wsgi.
Installing hgwebdir.wscgi
You’ll need to copy mercurial’s wsgi script to where you put it in the apache config
cp path-to-mercurial-source/mercurial-1.2.1/contrib/hgwebdir.wsgi /path-to-repository/scripts
You then modify scripts/hgwebdir.wsgi and setup the absolute path to your repository. Something like:
CONFIG = '/path-to-repository/hgweb.config' application = hgwebdir(CONFIG)
It’s really the assignment to application that matters (as that’s what wsgi uses).
Setting up hgweb
[web] style = gitweb contact = Pete Ware [paths] / = /path-to-repository/**
The [web] section sets up defaults for all the repositories.
The [paths] directive combined with the “/**” means to find all mercurial repositories under that directory.
Setting up a project
You can clone any project you’d like to put it under the web interface. The web interface works on the underlying DB so it’s always up to date (wrt to the repository).
# cd /path-to-repository # hg clone /orig-repository project
If you want people to be able to push to it, everything needs to be owned by the same as the web server. In the case of OpenSuse, that’s wwwrun:
# cd /path-to-repository/ # chown -R wwwrun project
Controlling who can access the project
Within each project. the .hg/hgrc controls who can access it. For example, the following allows a user “testuser” to push. I allow push to not happen over ssl. Probably not the best idea but this isn’t critical software.
[web] allow_push = testuser push_ssl = false
The above uses apache’s authorization.
‘Cash for Clunkers’ Passes House
So the cash for clunkers is getting closer. It passed in the House:
In addition to having stricter fuel economy requirements, the Senate bill contains three major differences. The first is the maximum fuel economy of the trade-in vehicles, which is 17 miles a gallon. The second is there are three voucher amounts ($2,500 to buy a new car that gets at least seven miles a gallon more, $3,500 for 10 m.p.g. more and $4,500 for 13 m.p.g. more). Finally, the Senate bill also offers a provision for buying a used car.
So maybe that new car smell isn’t so far away. Here’s a comparison of the House and Senate version of the bill.
The estimate is that it’ll increase auto sales by 625,000. It’ll work for me!
Getting the keys from a std::map
So last week I wrote about initializing a std::map from two std::vectors. How about doing the reverse? How do I get a list of the keys or a list of the values into a vector?
So I wrote a functor, based on std::unary_function, that returns the pair.first and another that returns the pair.second:
Continue reading “Getting the keys from a std::map”
Functor for deleting objects
In a destructor for a class, I had a std::vector of pointers that I wanted to delete. I started to write the usual for(;;) loop and realized I do this often enough I should make it easy to use std::for_each().
Here’s the functor (based on std::unary_function):
template
struct deleter: public std::unary_function
{
bool operator()(Type * ptr) const
{
delete ptr;
return true;
}
};
And here’s some sample code using it:
std::vector m_symbols; // ... std::for_each (m_symbols.begin(), m_symbols.end(), deleter());
I added a return of true because some other template code wasn’t happy about “return void” — supposedly something fixed in recent compilers.
A better output_iterator
I was using the std::stream_iterator, for example:
std::vector vals;
vals.push_back (12);
vals.push_back (22);
vals.push_back (5);
vals.push_back (30);
// The std::ostream_iterator appends the ","
std::ostringstream str3;
std::copy (vals.begin(), vals.end(), std::ostream_iterator (str3, ","));
CPPUNIT_ASSERT_EQUAL (std::string ("12,22,5,30,"), str3.str());
It has the “,” after the last item.
So here’s an implementation that doesn’t append the seperator after the last one:
#ifndef INCLUDED_OUTITER_H
#define INCLUDED_OUTITER_H
#include
/**
* A replacement for std::ostream_iterator that doesn't put the
* seperator after the last item.
*/
template<typename Type, typename CharType = char,
typename Traits = std::char_traits >
class outiter : public std::iterator
{
public:
typedef CharType char_type;
typedef Traits traits_type;
typedef std::basic_ostream ostream_type;
/// Initialize from a stream
outiter (ostream_type &stream)
: m_stream (&stream),
m_string (0),
m_started (false)
{}
/// Copy constructor
outiter (const outiter ©)
: m_stream (copy.m_stream),
m_string (copy.m_string),
m_started (copy.m_started)
{}
/// Initialize from a stream and the seperator
outiter (ostream_type &stream, const CharType *str)
: m_stream (&stream),
m_string (str),
m_started (false)
{}
/// Assignment actually does the output
outiter &
operator=(const Type &value)
{
if (!m_started)
{
m_started = true;
}
else if (m_string)
{
(*m_stream) << m_string;
}
(*m_stream) << value;
return *this;
}
/// Just return a reference to this
outiter &
operator*()
{
return *this;
}
/// Just return a reference to this
outiter &
operator++()
{
return *this;
}
/// Just return a reference to this
outiter &
operator++(int)
{
return *this;
}
private:
/// The stream to write to
ostream_type * m_stream;
/// The seperator (may be NULL)
const char_type * m_string;
/// Flag to indicate if we've output anything
bool m_started;
};
#endif /* INCLUDED_OUTITER_H */
And here’s the corresponding code to use it:
std::ostringstream str;
std::copy (vals.begin(), vals.end(), outiter (str, ","));
CPPUNIT_ASSERT_EQUAL (std::string ("12,22,5,30"), str.str());



