Wednesday, September 29, 2010

If You Are Not a Leftist, Why Are You Voting Democrat?

Very true. [Link]

One of the first books I ever owned -- in high school -- was titled "Danger on the Right." Throughout the world, people are fed the message "Danger on the Right" -- and virtually never "Danger on the Left," despite the left's far bloodier and more totalitarian record.
The majority of people who vote Democratic do not have left-wing values. Only 20 percent of Americans even consider themselves liberal. But vast numbers of people with views that are not leftist have been effectively brainwashed (one cannot come up with a more accurate word) into fearing the right when the threats to their liberty, as well as to America's standing in the world, its exceptionalism and its economic future all emanate from the left.
That is why nearly all Democratic and leftist reactions to conservatives and Republicans are to avoid argument (remember, on the issues the left has few supporters) and smear them as SIXHIRB, my acronym for "Sexist, Intolerant, Xenophobic, Homophobic, Islamophobic, Racist, Bigoted." It is almost impossible to come up with the name of a leading conservative whom the dominant media have not dismissed as one or more of SIXHIRB -- and usually as a buffoon as well. This obviously serves the left and the Democratic Party in many ways. But the most important is to keep non-leftists in fear of anyone who opposes the left. In effect, the left says, and has been saying for a hundred years, "You may not agree with us, but our opponents are evil."

Monday, September 27, 2010

Using the iPad in education. [Link]

So we're now nearly five weeks into the iPad deployment and I thought it was time to update you in some detail.
The Educational Part
So many people have asked me to explain the educational impact of the iPad. I simply can't yet get to grips with everything that's happening. Put simply, the iPad deployment has transformed our school. Not evenly and not everywhere yet, but it's coming.
There are stages to technology adoption. Two important stages are 'replacement' and 'transformation'. With replacement, you take an existing resource and replace it with an essentially identical digital resource. Think of a paper textbook replaced by the same textbook in PDF form. That's not to be sniffed at - there are big advantages to that.
What we're reaching in some classes is the transformation stage. We're seeing the iPad completely change the way that certain subjects are taught. Our best example so far is Art. I will write and share more about what we're doing in Art over time but it's fair to say that it is already far beyond anything I expected in the first year, let alone the first month.

Sunday, September 19, 2010

Playing the Palin card

Probably a bad idea for the White House. [Link]

Obama would be making a deadly mistake by calling out Sarah Palin for a political cage match.  Let me put this bluntly: virtually no one in America gives a damn what Barack Obama says about anything at this point.  What could be more predictable, and less interesting, than Obama’s opinion on any given subject?  Who wants to contemplate the economic wisdom of a guy who looted the Treasury for a trillion dollars, with less benefit than we could have achieved by stuffing hundred dollar bills into random cereal boxes?  Who’s excited to hear about the next plan to convert taxpayer dollars into Democrat campaign funds?  Who’s hungry for another hour of tedious excuses about permanently broken markets and the titanic dead hand of George W. Bush?  Who wants a lecture on ethical business practices from the titular head of the party that gave us Charlie Rangel and Maxine Waters?  What use is another hollow foreign-policy speech from a man who sees no global adversary to rival the menace of Arizona?  Even Obama’s supporters don’t hear anything he says any more.  There’s nothing left to hear.
Palin, on the other hand, commands attention.  Lots of it comes from people who dislike her, of course, but she definitely gets people talking.  Many of her detractors have a surprising ability to quote her verbatim, stretching back for weeks.  Obama’s critics need Google searches to remember what he said yesterday.  They can only recall that it was boring, and expensive.

Friday, September 17, 2010

Creative accounting in education

Budget cuts that aren't. [Link]

U.S. Education Secretary Arne Duncan recently claimed: "Districts around the country have literally been cutting for five, six, seven years in a row. And, many of them, you know, are through, you know, fat, through flesh and into bone ... ."
Really? They cut spending five to seven consecutive years?
Give me a break!
Andrew Coulson, director of the Cato Institute's Center for Educational Freedom, writes that out of 14,000 school districts in the United States, just seven have cut their budgets seven years in a row. How about five years in a row? Just 87. That's a fraction of 1 percent in each case.
Duncan may be pandering to his constituency, or he may actually be fooled by how school districts (and other government agencies) talk about budget cuts. When normal people hear about a budget cut, we assume the amount of money to be spent is less than the previous year's allocation. But that's not what bureaucrats mean.
"They are not comparing current year spending to the previous year's spending," Coulson writes. "What they're doing is comparing the approved current year budget to the budget that they initiallydreamed about having."
So if a district got more money than last year but less than it asked for, the administrators consider it a cut. "Back in the real world, a K-12 public education costs four times as much as it did in 1970, adjusting for inflation: $150,000 versus the $38,000 it cost four decades ago (in constant 2009 dollars)," Coulson says.
Taxpayers need to understand this sort thing just to protect themselves from greedy government officials and teachers unions.
It was on the basis of this fear and ignorance that President Obama got Congress to pass a "stimulus" bill this summer that included $10 billion for school districts. The money is needed desperately to save teachers from layoffs, the bill's advocates said. We must do it for the children!
When you look at the facts, the scam is clear.

Monday, September 13, 2010

Why the hate?

I don't get it. [Link]

I am not a big Palin fan. I am an atheist and not a social conservative in any meaningful sense. In my estimation, her chief virtue is that she annoys and enrages all the right people. However, I do recognize that she does honestly represent a wide and vital section of the America polity. I think the left’s inability to see Palin as a legitimate political figure reveals a great deal about their insular mindset and their deep need to see themselves as superior to other people even at the cost of a loss of political power.
In my previous post on Palin hate as leftwing status-anxiety, an anti-Palin comment by a Maurojumped out at me as a prime example of how leftists think about themselves and the rest of us. I wanted to go through it in detail to try and explain where these cognitive distortions come from.

America is ungovernable

Really? The Texan village idiot managed to do so. [Link]

I thought that I would offer a translation service for those trying to work out a certain mood that seems to have arisen in our pundit class.  Ben Smith noticed the underlying phenomena, too – but I don’t think that he’s quite prepared to be quite as blunt as I am, or as happy to be blunt about it as I am prepared to be.
Anyway, onto the translations:
Todd Purdum, Vanity Fair:
But the modern presidency—Barack Obama’s presidency—has become a job of such gargantuan size, speed, and complexity as to be all but unrecognizable to most of the previous chief executives. The sheer growth of the federal government, the paralysis of Congress, the systemic corruption brought on by lobbying, the trivialization of the “news” by the media, the willful disregard for facts and truth—these forces have made today’s Washington a depressing and dysfunctional place. They have shaped and at times hobbled the presidency itself.
Translation: The President is incompetent.

Saturday, September 11, 2010

9/11 nine years on

Sobering. [Link]

I am increasingly worried about our prospects for success in the battle against those who would destroy our civilization. America and the other democracies possess great military, economic, and intellectual strengths–but severe internal divisions threaten our ability to use these resources effectively.
Within days of the collapse of the Towers, it started. “Progressive” demonstrators brought out the stilt-walkers, the Uncle Sam constumes, and the giant puppets of George Bush. They carried signs accusing America of planning “genocide” against the people of Afghanistan.
Professors and journalists preached about the sins of Western civilization, asserting that we had brought it all on ourselves. A well-known writer wrote of her unease when her daughter chose to buy and display an American flag. Some universities banned the display of American flags in dormitories, claiming that such display was “provocative.”

Internet History

Neat bit of history. [Link]

I think it was at the 1983 Usenix/UniForum conference (there is an outside possibility that I’m off by a year and it was ‘84, which I will ignore in the remainder of this report). I was just a random young programmer then, sent to the conference as a reward by the company for which I was the house Unix guru at the time (my last regular job). More or less by chance, I walked into the meeting where the leaders of IETF were meeting to finalize the design of Internet DNS.
When I walked in, the crowd in that room was all set to approve a policy architecture that would have abolished the functional domains (.com, .net, .org, .mil, .gov) in favor of a purely geographic system. There’d be a .us domain, state-level ones under that, city and county and municipal ones under that, and hostnames some levels down. All very tidy and predictable, but I saw a problem.
I raised a hand tentatively. “Um,” I said, “what happens when people move?”
There was a long, stunned pause. Then a very polite but intense argument broke out. Most of the room on one site, me and one other guy on the other.

The alternate history almost writes itself.

Thursday, September 09, 2010

Openness for Whom?

Not for customers with Android phones. I bet you thought I was going to say iPhones? [Link]

This past weekend, I wrote a post wondering if Android was surging in the U.S. market because Apple was letting it? The main thought was that by remaining exclusively tied to AT&T, Apple was driving some users to choose Android, which is available on all the U.S. carriers. In the post, I posed a question: if it’s not the iPhone/AT&T deal, why do you choose Android? Nearly 1,000 people responded, and a large percentage focused on the same idea: the idea of “openness.”
You’ll forgive me, but I have to say it: what a load of crap.
In theory, I’m right there with you. The thought of a truly open mobile operating system is very appealing. The problem is that in practice, that’s just simply not the reality of the situation. Maybe if Google had their way, the system would be truly open. But they don’t. Sadly, they have to deal with a very big roadblock: the carriers.
The result of this unfortunate situation is that the so-called open system is quickly revealing itself to be anything but. Further, we’re starting to see that in some cases the carriers may actually be able to exploit this “openness” to create a closed system that may leave you crying for Apple’s closed system — at least theirs looks good and behaves as expected.

Commerce Server Marketing–Ad Validation

I am working on a Microsoft Commerce Server 2009 site where we are using the Marketing Manager to serve up ads to a custom Silverlight application. This all works great except that there does not seem to be much in the way of reporting available to make sure that the ads have valid data.

I threw this set of queries together to provide a rolled up view of one ad per row.
I’m sure there are better ways of getting this data, but I haven’t seen it so far. It runs pretty fast.

Ymmv.

Code Snippet
  1. USE [<Your Database Here>_marketing];
  2.  
  3. DECLARE @i_pg_id integer,@u_pg_tag nvarchar(25),@u_pg_description nvarchar(255)
  4. DECLARE @u_camp_name nvarchar(50), @i_aditem_id integer, @u_campitem_name nvarchar(50),
  5.     @b_campitem_active bit
  6. DECLARE @i_aditem_weight integer, @dt_campitem_start datetime, @dt_campitem_end datetime,
  7.     @u_size_name nvarchar(50)
  8. DECLARE @display_type nvarchar(50), @imageheight integer, @imagewidth integer,
  9.     @imageurl nvarchar(1000), @alttext nvarchar(1000), @targeturl nvarchar(1000),
  10.     @textcontent nvarchar(1000), @headline nvarchar(1000)
  11. DECLARE @u_ct_name nvarchar(50), @u_cp_name nvarchar(50), @text_cpv_value nvarchar(1000)
  12. DECLARE @u_expr_name nvarchar(100), @ExpressionScope nvarchar(10), @TargetAction nvarchar(10)
  13. DECLARE @ExpressionCount integer, @Expression1 nvarchar(120), @Expression2 nvarchar(120),
  14.     @Expression3 nvarchar(120), @Expression4 nvarchar(120)
  15.  
  16. DECLARE @Results TABLE
  17. (
  18.     i_pg_id integer,
  19.     u_pg_tag nvarchar(25),
  20.     u_pg_description nvarchar(255),
  21.     u_camp_name nvarchar(50),
  22.     i_aditem_id integer,
  23.     u_campitem_name nvarchar(50),
  24.     b_campitem_active bit,
  25.     i_aditem_weight integer,
  26.     dt_campitem_start datetime,
  27.     dt_campitem_end datetime,
  28.     u_size_name nvarchar(50),
  29.     display_type nvarchar(50),
  30.     imageheight integer,
  31.     imagewidth integer,
  32.     imageurl nvarchar(1000),
  33.     alttext nvarchar(1000),
  34.     targeturl nvarchar(1000),
  35.     textcontent nvarchar(1000),
  36.     headline nvarchar(1000),
  37.     Expression1 nvarchar(120),
  38.     Expression2 nvarchar(120),
  39.     Expression3 nvarchar(120),
  40.     Expression4 nvarchar(120)
  41. )
  42.  
  43. DECLARE curPageGroup CURSOR READ_ONLY FOR
  44. SELECT [i_pg_id],[u_pg_tag],[u_pg_description]
  45.     FROM [mktg_page_group]
  46.     ORDER BY [u_pg_tag]
  47.     OPEN curPageGroup
  48.  
  49. FETCH NEXT FROM curPageGroup INTO @i_pg_id,@u_pg_tag,@u_pg_description
  50. WHILE (@@FETCH_STATUS = 0)
  51.     BEGIN
  52.  
  53.     DECLARE curAd CURSOR READ_ONLY FOR
  54.     SELECT mc.[u_camp_name]
  55.         ,ad.[i_aditem_id]
  56.         ,ci.[u_campitem_name]
  57.         ,ci.[b_campitem_active]
  58.         ,ad.[i_aditem_weight]
  59.         ,ci.[dt_campitem_start]
  60.         ,ci.[dt_campitem_end]
  61.         ,ms.[u_size_name]
  62.     FROM [mktg_ad_item] ad inner join [mktg_campaign_item] ci on ad.[i_campitem_id]=ci.[i_campitem_id]
  63.         left outer join [mktg_campaign] mc on mc.[i_camp_id] = ci.[i_camp_id]
  64.         inner join [mktg_creative] mk on ci.[i_creative_id] = mk.[i_creative_id]
  65.         inner join [mktg_creative_size] ms on mk.[i_creative_size_id] = ms.[i_creative_size_id]
  66.         inner join [mktg_page_group_xref] px on ci.[i_campitem_id] = px.[i_campitem_id]
  67.         inner join [mktg_page_group] pg on px.[i_pg_id] = pg.[i_pg_id]
  68.     WHERE ci.[b_campitem_deleted] = 0
  69.     and pg.i_pg_id = @i_pg_id
  70.     ORDER BY ad.[i_aditem_id]
  71.     OPEN curAd
  72.  
  73.     FETCH NEXT FROM curAd INTO @u_camp_name, @i_aditem_id, @u_campitem_name, @b_campitem_active,
  74.         @i_aditem_weight, @dt_campitem_start, @dt_campitem_end, @u_size_name  
  75.     WHILE (@@FETCH_STATUS = 0)
  76.     BEGIN
  77.  
  78.         SELECT @display_type = '',
  79.             @imageheight = 0,
  80.             @imagewidth = 0,
  81.             @imageurl = '',
  82.             @alttext = '',
  83.             @targeturl = '',
  84.             @textcontent = '',
  85.             @headline = ''
  86.  
  87.         DECLARE curValues CURSOR READ_ONLY FOR
  88.             SELECT ct.[u_ct_name]
  89.                 ,cp.[u_cp_name]
  90.                 ,cv.[text_cpv_value]
  91.             FROM [mktg_ad_item] ad inner join [mktg_campaign_item] ci on ad.[i_campitem_id]=ci.[i_campitem_id]
  92.                 left outer join [mktg_campaign] mc on mc.[i_camp_id] = ci.[i_camp_id]
  93.                 inner join [mktg_creative] mk on ci.[i_creative_id] = mk.[i_creative_id]
  94.                 inner join [mktg_creative_type] ct on mk.[i_creative_type_id] = ct.[i_creative_type_id]
  95.                 inner join [mktg_creative_property] cp on mk.[i_creative_type_id] = cp.[i_creative_type_id]
  96.                 inner join [mktg_creative_property_value] cv on cp.[i_cp_id] = cv.[i_cp_id] and cv.[i_creative_id] = ci.[i_creative_id]
  97.             WHERE ad.[i_aditem_id] = @i_aditem_id
  98.             ORDER BY ad.[i_aditem_id] ,cp.[u_cp_label]
  99.             OPEN curValues
  100.  
  101.         FETCH NEXT FROM curValues INTO @u_ct_name , @u_cp_name , @text_cpv_value
  102.         WHILE (@@FETCH_STATUS = 0)
  103.         BEGIN
  104.             SET @display_type = @u_ct_name
  105.             IF (@u_cp_name = 'AltText') SET @alttext = @text_cpv_value            
  106.             IF (@u_cp_name = 'ClickURL') SET @targeturl = @text_cpv_value
  107.             IF (@u_cp_name = 'clickURL') SET @targeturl = @text_cpv_value
  108.             IF (@u_cp_name = 'ExpandedContent') SET @textcontent = @text_cpv_value
  109.             IF (@u_cp_name = 'Headline') SET @headline = @text_cpv_value
  110.             IF (@u_cp_name = 'Height') SET @imageheight = @text_cpv_value
  111.             IF (@u_cp_name = 'ImageURL') SET @imageurl = @text_cpv_value
  112.             IF (@u_cp_name = 'imgURL') SET @imageurl = @text_cpv_value
  113.             IF (@u_cp_name = 'TargetURL') SET @targeturl = @text_cpv_value
  114.             IF (@u_cp_name = 'RedirectUrl') SET @targeturl = @text_cpv_value
  115.             IF (@u_cp_name = 'text') SET @textcontent = @text_cpv_value
  116.             IF (@u_cp_name = 'TextContent') SET @textcontent = @text_cpv_value
  117.             IF (@u_cp_name = 'Width') SET @imagewidth = @text_cpv_value            
  118.  
  119.             FETCH NEXT FROM curValues INTO @u_ct_name , @u_cp_name , @text_cpv_value
  120.         END
  121.         CLOSE curValues
  122.         DEALLOCATE curValues
  123.  
  124.         SELECT @ExpressionCount = 0,
  125.             @Expression1 = '',
  126.             @Expression2 = '',
  127.             @Expression3 = '',
  128.             @Expression4 = ''
  129.  
  130.         DECLARE curExpressions CURSOR READ_ONLY FOR
  131.         SELECT me.[u_expr_name]
  132.             ,CASE me.[b_expr_local]
  133.                 WHEN 0 THEN 'Global'
  134.                 WHEN 1 THEN 'Local'
  135.             END AS [Expression Scope]
  136.             ,CASE mt.[i_target_action]
  137.                 WHEN 1 THEN 'Target'
  138.                 WHEN 2 THEN 'Require'
  139.                 WHEN 3 THEN 'Exclude'
  140.                 WHEN 4 THEN 'Sponsor'
  141.             END AS [Target Action]
  142.         FROM [mktg_ad_item] ad inner join [mktg_campaign_item] ci on ad.[i_campitem_id]=ci.[i_campitem_id]
  143.             left outer join [mktg_campaign] mc on mc.[i_camp_id] = ci.[i_camp_id]
  144.             inner join [mktg_creative] mk on ci.[i_creative_id] = mk.[i_creative_id]
  145.             inner join [mktg_target] mt on mt.[i_campitem_id] = ci.[i_campitem_id]
  146.             inner join [mktg_expression] me on mt.[i_target_expr_id] = me.[i_expr_id]
  147.             WHERE ad.[i_aditem_id] = @i_aditem_id
  148.         OPEN curExpressions
  149.  
  150.         FETCH NEXT FROM curExpressions INTO @u_expr_name, @ExpressionScope, @TargetAction
  151.         WHILE (@@FETCH_STATUS = 0)
  152.         BEGIN
  153.             SET @ExpressionCount = @ExpressionCount + 1
  154.             IF (@ExpressionCount = 1) SET @Expression1 = @u_expr_name +' / '+@ExpressionScope+' / '+@TargetAction
  155.             IF (@ExpressionCount = 2) SET @Expression2 = @u_expr_name +' / '+@ExpressionScope+' / '+@TargetAction
  156.             IF (@ExpressionCount = 3) SET @Expression3 = @u_expr_name +' / '+@ExpressionScope+' / '+@TargetAction
  157.             IF (@ExpressionCount = 4) SET @Expression4 = @u_expr_name +' / '+@ExpressionScope+' / '+@TargetAction
  158.             IF (@ExpressionCount > 4) SET @Expression4 = @Expression4 + '* '
  159.  
  160.             FETCH NEXT FROM curExpressions INTO @u_expr_name, @ExpressionScope, @TargetAction
  161.         END
  162.         CLOSE curExpressions
  163.         DEALLOCATE curExpressions        
  164.  
  165.         INSERT INTO @Results (i_pg_id, u_pg_tag, u_pg_description, u_camp_name, i_aditem_id, u_campitem_name,
  166.             b_campitem_active, i_aditem_weight, dt_campitem_start, dt_campitem_end, u_size_name,
  167.             display_type, imageheight, imagewidth, imageurl, alttext, targeturl, textcontent,
  168.             headline, Expression1 , Expression2 , Expression3 , Expression4  )
  169.         VALUES (@i_pg_id, @u_pg_tag, @u_pg_description, @u_camp_name, @i_aditem_id, @u_campitem_name,
  170.             @b_campitem_active, @i_aditem_weight, @dt_campitem_start, @dt_campitem_end, @u_size_name,
  171.             @display_type, @imageheight, @imagewidth, @imageurl, @alttext, @targeturl, @textcontent,
  172.             @headline, @Expression1 , @Expression2 , @Expression3 , @Expression4 )    
  173.  
  174.         FETCH NEXT FROM curAd INTO @u_camp_name, @i_aditem_id, @u_campitem_name, @b_campitem_active,
  175.             @i_aditem_weight, @dt_campitem_start, @dt_campitem_end, @u_size_name
  176.     END
  177.     CLOSE curAd
  178.     DEALLOCATE curAd
  179.  
  180.     FETCH NEXT FROM curPageGroup INTO @i_pg_id,@u_pg_tag,@u_pg_description
  181. END
  182.  
  183. CLOSE curPageGroup
  184. DEALLOCATE curPageGroup
  185.  
  186. SELECT u_pg_tag AS [Page Group],
  187.     u_pg_description AS [Page Description],
  188.     Expression1 AS [Target Exp 1],
  189.     Expression2 AS [Target Exp 2],
  190.     Expression3 AS [Target Exp 3],
  191.     Expression4 AS [Target Exp 4],
  192.     i_aditem_id AS [Ad Id],
  193.     CASE b_campitem_active
  194.         WHEN 1 THEN 'Active'
  195.         WHEN 0 THEN 'Inactive'
  196.     END AS [Status],
  197.     u_camp_name AS [Campaign],
  198.     u_campitem_name AS [Ad Name],
  199.     i_aditem_weight AS [Weight],
  200.     CONVERT(char(10),dt_campitem_start,126) AS [Start Date],
  201.     CONVERT(char(10),dt_campitem_end,126) AS [End Date],
  202.     u_size_name AS [Display Size],
  203.     display_type AS [Display Type],
  204.     imagewidth AS [Image Width],
  205.     imageheight AS [Image Height],
  206.     imageurl AS [Image URL],
  207.     alttext AS [Alt Text],
  208.     targeturl AS [Target URL],
  209.     textcontent AS [Text Content],
  210.     headline AS [Headline]    
  211. FROM @Results
  212. ORDER BY [Page Group],[Ad Name]
  213.  
  214. GO

Saturday, September 04, 2010

We're missing him

Bush is looking better and better when compared to Obama. 10 reasons. [Link]

1) The Obama record. We naturally compare Bush to his chief critic and successor Barack Obama — and find the latter increasingly wanting as time goes by. Obama turned Bush’s misdemeanor deficits into felonious trillion-dollar annual shortfalls. He will pile up more debt than any other prior president.
Indeed, if reelected, Obama will borrow more than all previous administrations combined. Bush was tarred in 2004 for a “jobless recovery” when unemployment hovered near 6%. It is now almost 10% and Obama still harps about “jobs saved.” Scott McClellan may have been singularly inept; we are not so sure after Robert Gibbs. For every Brownie there is a worse Van Jones or Anita Dunn. For Katrina we have BP. Bush’s NASA did space; Obama’s seems to prefer Muslim outreach. Bush’s prescription drug benefit was an unfunded liability; ObamaCare is a trillion-dollar financial black-hole. I could go on, but Obama’s lackluster record is improving Bush’s legacy every day.