Tuesday, September 2, 2008

Palin's 17 Year Old Daughter Is Pregnant

Palin's 17 Year Old Daughter Is Pregnant

Yes, I'm disappointed by this--but doubtless not as disappointed as Governor Palin. The left, of course, has decided that this is a sign of hypocrisy. Huh? If Governor Palin had encouraged her daughter to have sex outside of marriage, yes, it would be. But as any parent of teenagers can tell you, you can tell them what's right until you are blue in the face, but they have a free will, they make their own decisions--and often, those are bad decisions.

I grieve with Governor Palin about her daughter's first bad decision to have premarital sex, and second bad decision to fail to use a condom. (Assuming that's the case. There were a couple of college students at our church in San Jose who decided not to wait--and the condom broke, accelerating their marriage plans.) But the daughter's decisions are not an indication of hypocrisy on Governor Palin's part.

Now, if Governor Palin had dragged her daughter off for an abortion, the left would have a valid basis to scream hypocrisy. But then, no one would even know about this, would they? I'm guessing that the louder the left screams about this, the more parents of teenagers will say, "I sympathize with Governor Palin." It doubt it will get any votes for the McCain/Palin ticket--but I can't imagine it turning any votes away.

There is one way that Governor Palin could use this to her advantage: remind everyone that the left promotes sexual promiscuity and premature sexualization of teenagers through their control of the entertainment media. I certainly wouldn't argue that this constant pressure is what caused disappointments like this. Teenagers and young adults have been making mistakes like this for many centuries. I recall reading an analysis of Puritan birth and marriage records that concluded that at least 16% of brides were pregnant when they said, "I do." For exactly that reason, the culture needs to be promoting restraint and mature decision making. The entertainment business is pouring gasoline on a fire when they should really be bringing a fire extinguisher.

UPDATE: Byron York of National Review went around talking to evangelical activists at the Republican National Convention--and received much the same reaction that I had:
“For me personally, it hit my heart this morning,” Sharkey told me, “because I was a 17 year-old girl, just like Sarah Palin’s daughter, and I had — I was in those shoes. And my son is with me, who will be 35 years old next week, and so I know what a difficult road there is for her.”

“I chose to have my son, and from that point I realized that I was a very strong right-to-life advocate,” Sharkey continued, her voice wavering ever so slightly. Roe v. Wade had been passed just the year before, and I already knew girls who were going through abortions. It wasn’t a choice for me; it wasn’t in my heart to do that. So when I heard the news this morning, it struck close to home for me.”

A few feet away, members of the Ohio delegation were finishing up business, and I asked Patricia Murray, a delegate from Cincinnati, what she thought. “I don’t even think this is an issue,” she told me. “It’s a family issue. It’s a personal issue. The only reason it was made public was because of her mother.” Nearby, Ben Rose, a delegate from Lima, said that, “In every case where I heard delegates talk about this, the first thought was to the human nature of it.”

Earlier in the day, just after I heard the news, I called Marlys Popma, the well-known Iowa evangelical leader who is now the head of evangelical outreach for the McCain campaign. Like Sue Sharkey from Colorado, Popma had a story to tell. It turns out she had had a child out of wedlock nearly 30 years ago, and it changed her life. “It was my crisis pregnancy that brought me into the movement,” Popma told me. “My reaction is that this shows that the governor’s family is just like so many families. That’s how my first child came into the world, and I’m just thrilled that [Bristol Palin] is choosing to give this child life.”

I asked Popma what she thought the larger reaction among evangelicals will be. “Their reaction is going to be exactly as mine,” she told me. “There hasn’t been one evangelical family that hasn’t gone through some sort of situation. Many of us are in this movement because of something that has happened in our lives.”
Yup. We live in an imperfect world, one that has been made even worse by the left's obsession with encouraging every 13 year old to be sexually active, regardless of the emotional and medical risks. This is a bad situation for Bristol Palin, and I'm hoping that what happened will be a warning sign to lots of other teenagers across America that it's easy to get carried away in the passion of the moment.

Monday, September 1, 2008

The Lack of a Conservative Think Tank in Idaho

The Lack of a Conservative Think Tank in Idaho

I sometimes wonder if the increasingly leftist leaning of Idaho politics might reflect that there simply is no local organization putting any effort into public policy advocacy with a conservative bent. The State Policy Network, for example, strives to bring together conservative public policy organizations from around the U.S., and they have members in many states--but not Idaho. An endowment of five million dollars would produce about $250,000 a year in interest income, easily--and with that kind of money, an organization could afford to hire several economists, an historian (let me make a suggestion on that), a PR person, a webmaster, and start producing thoughtful and useful public policy analysis materials.

Now, there are certainly business interests here in Idaho that are promoting their agenda--but that's not the same thing as promoting free markets. Business interests are frequently indifferent to free markets, and sometimes quite hostile to them--as the recent farm price support bill demonstrated.

Now, I'm not sure that there are actually any wealthy conservatives. Just about everyone I know who could afford to endow a foundation with five million dollars is liberal to Marxist. (Although not Marxist enough to, you know, actually give away their fortunes to the needy.) But I consider the possibility that there are rich conservatives out there to be at least a real possibility--more likely than the existence of leprechauns.

The Civilian Gun Self-Defense Blog

The Civilian Gun Self-Defense Blog

For almost five years, my co-bloggers and I have been putting a good bit of work into the Civilian Gun Self-Defense Blog. We never did it to get rich. (If that was our motivation, we would have needed our heads examined.) We did it because it was a valuable tool for demonstrating that the anti-gun claim that civilian gun self-defense is actually quite rare is incorrect.

If we were running a similar service to make gun owners look bad, we would almost certainly have received a $20,000 a year grant from the Joyce Foundation or some other non-profit for "contributing to the dialog about the problems of gun ownership in America." We've received a few very small contributions from gun owners over the years, and there are few businesses that have advertised there--for which we are very grateful.

Increasingly I find myself wondering if continuing this effort really makes any sense. We've made some efforts to engage NRA with this--with no success. There must be some wealthy gun owners or people in the gun business who can see the advantage of what we are doing, and would be willing to provide some limited funding to justify the effort. But if not, the temptation is very strong to stop putting the effort out on this, and let it die.

My First C# Application

My First C# Application

I'm not completely done, but I would like to verify that the publish feature of Microsoft Visual Studio C# actually works. You can run the setup program from here. This should install the first significant C# application that I have written, which loads data from CSV files and plots the data. You can download some files of the correct format here, or or here. This is quite similar to the Java applets that you can select here--except that it looks for a local file.

I still haven't figured out how to get it to fully redraw the data without putting the mouse over the File menu in the upper left.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Set up a color palette to use for drawing lines.
private List colorChoices = new List()
{Color.Yellow, Color.Aqua, Color.Red, Color.Blue, Color.Beige,
Color.Violet, Color.Coral, Color.CornflowerBlue,
Color.Cornsilk, Color.Crimson, Color.Cyan, Color.DarkBlue};
// This is where the numeric data will go.
private List numbersArray = new List();
// This is the largest count of numbers in any element of numbersArray
int numbersArrayMaxCount = 0;
// This is the largest value that we have to plot across all rows.
float numbersArrayMax = 0.0F;
// The legend information (contained in the first column) goes here.
private List legendStrings = new List();
// And this is where the column header information goes (the years going
// across, for the first sample.
private ColHdr colHdr = new ColHdr();

// Open the data file and populate legend and numbersArray.
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "Data Input File (CSV)";
openFileDialog1.DefaultExt = "*.csv";
openFileDialog1.Filter = "CSV files|*.csv";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
// This is where we specify the CSV file to open.
Stream myStream = new FileStream(openFileDialog1.FileName, FileMode.Open);
if (myStream != null)
{
string[] strArray;
char[] charArray = new char[] { ',' };

// Dispose of the old data set, if any
if (numbersArray.Count > 0)
{
numbersArray.Clear();
numbersArrayMax = 0.0F;
numbersArrayMaxCount = 0;
legendStrings.Clear();
}

StreamReader sr = new StreamReader(myStream);
string strLine;
// Pull in the first line--the column header line.
strLine = sr.ReadLine();
if (strLine != null)
{
strArray = strLine.Split(charArray);
colHdr.colHdrStrings = new List();
for (int i = 2; i < strArray.Length; i++)
colHdr.colHdrStrings.Add(strArray[i]);
}
// Now pull in the data that we are going to plot.
do
{
strLine = sr.ReadLine();
if (strLine != null)
{
System.Console.WriteLine("reading " + strLine);
strArray = strLine.Split(charArray);
NumbersToPlot numbers = new NumbersToPlot();
// Add the legend (the first column) to this list.
legendStrings.Add(strArray[0]);
numbers.category = strArray[1];
numbers.events = new List();
// We need to keep track of the smallest and largest values we see.
numbers.min = numbers.max = 0;
int lastNumber;
for (int i = 2; i < strArray.Length; i++)
{
numbers.events.Add(float.Parse(strArray[i]));
lastNumber = numbers.events.Count - 1;
numbers.min = Math.Min(numbers.min, numbers.events[lastNumber]);
numbers.max = Math.Max(numbers.max, numbers.events[lastNumber]);
}
numbersArray.Add(numbers);
numbersArrayMax = Math.Max(numbersArrayMax, numbers.max);
numbersArrayMaxCount = Math.Max(numbersArrayMaxCount, numbers.events.Count);
}
}
while (strLine != null);
myStream.Close();
}
}
}

// Configure which lines in the data set to display.
private void configureToolStripMenuItem_Click(object sender, EventArgs e)
{
// This is where we specify which lines to plot.
}

public SizeF CalcLeftMargin(Graphics g, Font legendFont, List legendStrings)
{
// Figure out the width of the legends on the left. These are the
// first column of information in the CSV file.
SizeF maxLegend = new SizeF();
int i;
SizeF legendStrSize;
for (maxLegend.Width = maxLegend.Height = 0, i = 0; i < numbersArray.Count; i++)
{
legendStrSize = g.MeasureString(legendStrings[i], legendFont);
maxLegend.Width = Math.Max(maxLegend.Width, legendStrSize.Width);
maxLegend.Height = Math.Max(maxLegend.Height, legendStrSize.Height);
}
maxLegend.Width *= 1.10F;
return (maxLegend);
}

public float CalcTopMargin(Graphics g, Font colHdrFont, ColHdr colHdrStrings)
{
// Now figure out how much room we need at the bottom for the column headers.
// Complicating this is that we need to adjust font size (perhaps) for too many
// columns.
float maxColHdrWidth = 0.0F;
float maxColHdrHeight = 0.0F;
SizeF colHdrStrSize;
for (int i = 0; i < colHdr.colHdrStrings.Count; i++)
{
colHdrStrSize = g.MeasureString(colHdr.colHdrStrings[i], colHdrFont);
maxColHdrWidth = Math.Max(maxColHdrWidth, colHdrStrSize.Width);
maxColHdrHeight = Math.Max(maxColHdrHeight, colHdrStrSize.Height);
}
return (maxColHdrHeight);
}

public float CalcRightMargin(Graphics g, Font colHdrFont, ColHdr colHdr)
{
// We have to leave a little room on the right side of the last column because
// we are centering the column headers under the center point for the lines.
// So we need to know how much room that will be for the last column header.
SizeF colHdrStrSize;
colHdrStrSize = g.MeasureString(colHdr.colHdrStrings[colHdr.colHdrStrings.Count-1], colHdrFont);
float rightMargin = (colHdrStrSize.Width / 2.0F) * 1.25F;
return (rightMargin);
}

public void PlotLegends(Graphics g, Font legendsFont, List legendStrings,
float maxLegendsHeight)
{
// Now we know how big it is, we can draw the legend strings down the left side.
Brush myBrush;
for (int i = 0; i < numbersArray.Count; i++)
{
myBrush = new SolidBrush(colorChoices[i % 10]);
g.DrawString(legendStrings[i], legendsFont, myBrush, 0, maxLegendsHeight * i);
}
}

public void PlotColHdrs(Graphics g, Font colHdrFont, ColHdr colHdr,
float rightMargin, float leftMargin, float xScaling,
float plotWidth)
{
SizeF colHdrStrSize;

Brush myBrush = new SolidBrush(Color.White);
float lastColHdrEndsAt = 0.0F; // not correct, but the first header must appear
float colHdrStartsAt = 0.0F;
for (int i = 0; i < colHdr.colHdrStrings.Count; i++)
{
// Get the size of the string so that we can move it over to be centered.
colHdrStrSize = g.MeasureString(colHdr.colHdrStrings[i], colHdrFont);
colHdrStartsAt = (i * xScaling) + leftMargin - colHdrStrSize.Width;
// We don't want to step on the last column header.
if (colHdrStartsAt > lastColHdrEndsAt + 5.0F)
{
g.DrawString(colHdr.colHdrStrings[i], colHdrFont, myBrush,
(i * xScaling) + leftMargin - (colHdrStrSize.Width / 2), 0);
lastColHdrEndsAt = (i * xScaling) + leftMargin + (colHdrStrSize.Width / 2);
}
}
}

public void PlotLines(Graphics g, float leftMargin, float topMargin,
float bottomMargin, float rightMargin, float xScaling, ColHdr colHdr,
float numbersArrayMax, int divisions, float yScaling, Font font)
{
Pen pen = new Pen(Color.White, 2);
// Draw the left, right, top and bottom lines.
g.DrawLine(pen, leftMargin, topMargin, leftMargin, bottomMargin);
g.DrawLine(pen, rightMargin, topMargin, rightMargin, bottomMargin);
g.DrawLine(pen, leftMargin, topMargin, rightMargin, topMargin);
g.DrawLine(pen, leftMargin, bottomMargin, rightMargin, bottomMargin);
// Draw the vertical grid lines.
int xCoord = 0;
for (int i = 0; i < colHdr.colHdrStrings.Count; i++)
{
xCoord = (int)((float)i * xScaling + leftMargin);
g.DrawLine(pen, xCoord, topMargin, xCoord, bottomMargin);
}
// The brush for drawing the numbers left of the grid lines.
Brush myBrush = new SolidBrush(Color.White);
// Draw the horizontal grid lines.
float perDivision = yScaling * numbersArrayMax / divisions;
float perDivisionNumber = 0.0F;
for (int i = 0; i < divisions + 1; i++)
{
g.DrawLine(pen, leftMargin, bottomMargin - (i * perDivision),
rightMargin, bottomMargin - (i * perDivision));
perDivisionNumber = i * numbersArrayMax / divisions;
// Figure out how much we have to move the string to the left of the vertical grid
// line, and how much we have to raise it up to center on the horizontal grid line.
SizeF strSize = g.MeasureString(perDivisionNumber.ToString(), font);
g.DrawString(perDivisionNumber.ToString(), font, myBrush,
leftMargin - strSize.Width,
(bottomMargin - (i * perDivision)) - strSize.Height/2);
}
}

public void PlotData(Graphics g, NumbersToPlot numbers,
Pen pen, float leftMargin,
float xScaling, float yScaling,
float panelHeight)
{
for (int j = 1; j < numbers.events.Count; j++)
{
float value = (float)numbers.events[j];
float prevValue = (float)numbers.events[j - 1];
Point prevValueCoord = new Point((int)((j - 1) * xScaling + leftMargin),
(int)(panelHeight - (prevValue * yScaling)));
Point curValueCoord = new Point((int)(j * xScaling + leftMargin),
(int)(panelHeight - (value * yScaling)));
g.DrawLine(pen, prevValueCoord, curValueCoord);
}
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
panel1.Invalidate();
}

public static double RoundUp(double valueToRound)
{
return (Math.Floor(valueToRound + 0.5));
}
private void panel1_Paint_1(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
if (numbersArray.Count > 0)
{
// Clear the panel.
g.Clear(Color.Black);
// Create legend font.
Font legendFont = new System.Drawing.Font("Times Roman", 10.0F,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
// Calculate left margin from legend strings.
SizeF maxLegendDimensions = CalcLeftMargin(g, legendFont, legendStrings);
// Create column header font.
Font colHdrFont = new System.Drawing.Font("Times Roman", 10.0F,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
// Calculate top margin from column headers.
float topMargin = CalcTopMargin(g, colHdrFont, colHdr) + 20.0F;
// Calculate right margin from column headers.
float rightMargin = CalcRightMargin(g, colHdrFont, colHdr);
PlotLegends(g, legendFont, legendStrings, maxLegendDimensions.Height);
g.PageUnit = GraphicsUnit.Pixel;
// Calculate the scaling required.
float yScaling;
SizeF sizef = g.VisibleClipBounds.Size;
rightMargin = sizef.Width - rightMargin;
float leftMargin = maxLegendDimensions.Width;
// Leave some room at the bottom of the display.
float bottomMargin = sizef.Height - 30.0F;
// Before we do the y-scaling, we want to round the maximum y-axis value up to
// a nice even number.
numbersArrayMax = (float)RoundUp(numbersArrayMax);
yScaling = (float)((bottomMargin - topMargin) / numbersArrayMax);
float xScaling = (float)(rightMargin - leftMargin) / (numbersArrayMaxCount - 1);
// Write the column header strings.
PlotColHdrs(g, colHdrFont, colHdr, rightMargin, leftMargin, xScaling,
rightMargin - leftMargin);
// Draw the grid lines.
PlotLines(g, leftMargin, topMargin, bottomMargin, rightMargin, xScaling,
colHdr, numbersArrayMax, 4, yScaling, colHdrFont);
for (int i = 0; i < numbersArray.Count; i++)
{
Pen pen = new Pen(colorChoices[i % 10], 2);
PlotData(g, numbersArray[i], pen, maxLegendDimensions.Width,
xScaling, yScaling, bottomMargin);
}
}
else
g.Clear(Color.Black);
}

private void fileToolStripMenuItem_VisibleChanged(object sender, EventArgs e)
{
panel1.Invalidate();
}

private void fileToolStripMenuItem_Paint(object sender, PaintEventArgs e)
{
panel1.Invalidate();
}

private void fileToolStripMenuItem_DropDownClosed(object sender, EventArgs e)
{
panel1.Invalidate();
}

private void fileToolStripMenuItem_MouseLeave(object sender, EventArgs e)
{
panel1.Invalidate();
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

public class ColHdr
{
public List colHdrStrings;
}


public class NumbersToPlot
{
public string category;
public List events;
public float min, max;
public int maxNumbers;

public NumbersToPlot()
{
}

public NumbersToPlot(string Category)
{
category = Category;
}
};

Origins of the Union Label

Origins of the Union Label

David Bernstein over at Volokh Conspiracy discusses nineteenth and early twentieth anti-Chinese legislation, and its connection to labor unions and the Lochner decision. Bernstein's William & Mary Law Review article mentions that at the start of the Gold Rush, the severe shortage of laundries meant that clothes were being shipped from California to China to be washed, and then shipped back again.

Bernstein also points out that origins of the "union label"--that little symbol that appears on most movies and printed materials, to show that this was produced by labor union members--was racist. The first "union label" was on cigars, and said "White Labor, White Labor." Along with the logo of the union of white cigar makers was the message:
Buy no cigars
except from the box marked
with the trade union label
thus you help maintain the
white as against the Coolie
standard of life and work
This was no great surprise to me. My book For the Defense of Themselves and the State (Praeger Press, 1994) goes into some detail about the role that labor unions played in stirring up anti-Chinese feeling during the railroad strikes of 1877, and in promoting a riot that led to the burning out of San Francisco's Chinatown. My reading of California newspapers in the period 1910-25 shows that Democrats were major players in promoting racist laws and attitudes. To the extent that anyone was fighting racism, it was then conservative Republican newspapers like the Los Angeles Times.

Hurricanes As Punishment From God

Hurricanes As Punishment From God

Is one of those lunatic fringe televangelists saying this? No, a prominent Democrat. From the August 31, 2008 ABC News blog:
Former DNC Chairman Don Fowler apologized on Sunday for joking in a private conversation that the timing of Hurricane Gustav demonstrates that God is on the side of the Democrats.
"If this offended anybody, I personally apologize," Fowler told ABC News. "It was a mistake, and it was a satirical statement made in jest. And one that I clearly don't believe."
Fowler was secretly recorded by the person sitting behind him while flying from Denver, Colo., to Charlotte, N.C., following the Democratic National Convention. His conversation with Rep. John Spratt, D-S.C., was anonymously posted to YouTube and highlighted by RedState.com, a conservative blog.
Watch it HERE.
"One doesn't anticipate that one's private conversation will be surreptitiously taped by some right-wing nutcase," said Fowler. "But that's the nature of what we're dealing with."
Fowler, a superdelegate who endorsed Hillary Clinton in 2007, was caught on tape saying: "The hurricane’s going to hit New Orleans about the time they start. The timing is -- at least it appears now that it’ll be there Monday. That just demonstrates that God’s on our side. [Laughter] Everything’s cool."
He claims that he was satirizing remarks by Rev. Jerry Falwell some years ago. But calling someone a "right-wing nut job" for taping his remarks? How you behave in private tells us a lot about who you really are, and what values you really hold. Look at Senator Larry "Happy Feet" Craig (R-ID). Look at Senator Teddy "Chappaquiddick" Kennedy (D-MA). Or President "What is the meaning of is?" Clinton.

Devastating Video About Obama

Devastating Video About Obama

What makes this especially devastating is Obama's excuses for Rev. Jeremiah Wright. I've read some of these quotes from Wright before--where he claims that the U.S. government invented HIV to kill off black people--but watching him yelling "God damn America" to his congregation still grabs me by the gut.

The quote from Obama about "typical white person" really shows how racism runs Obama's mind.