A Django site.
July 3, 2009

Andrew Jorgensen
no nic
Andrew Jorgensen
» Mono Appliance for VirtualPC

With the release of Mono 2.4.2 we are introducing an appliance image for Virtual PC. This makes a lot of sense for Mono as one of our favorite target user groups is .NET developers looking to get an application running on Linux. Many of these developers use Virtual PC.

All three of our appliance images (LiveCD, VMware, and now VirtualPC) contain exactly the same packages, etc. In fact our .vhd is actually just the .vmdk from the VMware appliance built in SUSE Studio and converted using qemu-img (requires a recent version, possibly unreleased). And actually the .vmdk we provide boots just fine under other VMs such as QEMU and VirtualBox. Linux can be nice that way.

We hope this will make Mono even easier for .NET developers to use but you may want to use VMware anyway.  The VirtualPC appliance has some problems:

  • There are no “VM Additions”.  They exist but they are not open source and IIRC the ones that exist don’t work on a recent Linux. So no handy stuff like drag-and-drop or mouse-in-mouse-out.
  • Things can be a bit slow / choppy at times.  This clears up after a while or maybe after a reboot.  Not sure what’s going on there.
  • We added some kernel parameters to make things run a little better: noreplace-paravirt i8042.noloop clock=pit. Joseph Hill dug these up on the Internet somewhere.
  • On the new Windows Virtual PC (the one for Windows 7) you don’t get a network device by default.  As far as I can tell we’re the only project shipping a .vmc configuration file with our .vhd anyway so the expectation seems to be that you will configure your own VM.

Find this and other fine Mono products at http://go-mono.com/mono-downloads/.


=Utah Open Source=
Utah Open Source
Utah Open Source Blog
» Video: Glenda Rhodes on GIMP from UTOSC 2008

As a final reminder of how completely awesome the Utah Open Source Conference is and why you should attend, we present a final video from UTOSC 2008: Glenda Rhodes presenting on GIMP for Photographers. This video is now available at OpenSourceTV.TV as a in-line Flash video and also as Ogg Theora and Xvid AVI downloads.

Glenda Rhodes

Glenda Rhodes

This presentation discusses using GIMP as an alternative to Photoshop for editing digital photos. Basic GIMP techniques (black/white, sepia, cropping) and some advanced techniques (layer masks for selective coloring, head-swapping, background blurring) are covered.

Glenda says, “I have been on the outskirts of the open source community ever since my husband made me send out the initial release of Ubuntu in our Christmas cards back in 2004. Currently I help run Utah OpenTech, a company dedicated to helping small businesses implement VoIP using open source technologies. I am a frequent user of GIMP (on windows and ubuntu), using it for editing photos and most recently digital scrapbooking.”

July 2, 2009

Phil Windley
pjw
Phil Windley's Technometria
» Automatically Building, Configuring, and Maintaining Complex Infrastructure

Servers designed for Linux

Image via Wikipedia

I've been heads down for the last few weeks getting a project out the door for a new customer. As I mentioned, this involves creating a virtual appliance. I decided, due to the circumstances of this deployment that the best option was the build an appliance factory that is capable of churning out new virtual machines at will. I'm going to describe how I did that in this post.

There are bascially three steps to creating a new image that runs the Kynetx Network Service (KNS):

  1. Create a new virtual machine
  2. Install packages and Perl libraries, create users, and otherwise configure the machine to run KNS
  3. Deploy the KNS code and test it

I was exporing Kickstart files for automatically installing Fedora and CentOS when someone pointed me at Cobbler. Cobbler is a Linux installation server that is simply amazing. It includes templated kickstart files, DHCP and DNS servers, the ability to manage multiple distros and repositories, and a database for keeping it all straight.

You start by importing distros and images, then define profiles that combine those with kickstart files, and finally create system definitions for each machine refering to profiles. I pnly needed one distro, one repo, and one kickstart, so I ended up with multiple systems hanging off of one profile. Once that's done, a command called koan (kickstart over a network) is used on the Dom0 machine to create virtual machines as defined by the system definitions cobbler.

I carefully edited the kickstart file to create just the machine I wanted with the right packages installed. At this point, I was building new VMs and taking them down 20-30 times a day as I tested this. That's the beauty of automation--tacking up a machine is just dirt simple.

I was lucky that I'd already invested considerable effort in Puppet recipes for building the environment that KNS need to run, so the second step was almost done. In fact, with just a few edits, I had Puppet building the new VMs up.

The third step was also one that I'd spent some time on. I have a custom deploy script (in Perl) that deploys KNS code based on server role and takes care of all the little details like setting up the configuration files for the various servers.

Every system is slightly different, but I think there's a definite distinction between machine setup, system configuration, and code deployment. The first creates a fairly standard environment, the second configures it to a specific purpose, and the third manages the code.

Some thoughts on all of this:

  • Some have asked "Why not put the code in Puppet (i.e. why use a deployment system)?" My answer is that code deployment is a dynamic process that I want more control of than puppet's automatic configuration provides. You could probably press Puppet into this, but it didn't seem to fit for me.
  • I had to create a simple YAML-based configuration file for KNS to pull everything together. YAML was the right answer for this. I chose to put that configuration file in Puppet, but I think I'll pull it into the deployment process in the future.
  • One missing piece is a database that everything can read system configurations from. Cobbler provides a light-weight one that may serve our purposes for a while, but something like iClassify is more flexible. Right now there's system information in Cobbler, Puppet, and the deploy script. There's a way to put additional attributes in Cobbler that we could use in other places.
  • All of this--Cobbler, Puppet, and the deploy script--were installed and running on a virtual machine that we call the factory. That one image, once installed in Xen is capable of creating as many copies of each type of machine we run as needed.
  • This can all be done on physical boxes too, of course, but I prefer the flexibility of virtual machines--even when only one will be running on the physical hardware. They can be moved, replicated, and managed with a lot more ease that physical hardware. Plus I have the ability to fire up new ones for QA or whatever without buying and installing new physical hardware. When a 8 core, 32 Gb box costs $4K, you can amortize that investment a lot with virtual machines.

Startups need to be lean. Achieving that goal in a compute-intensive business requires automation. Fortunately with tools like Cobbler and Puppet, automating the build-side of your infrastructure is not only possible, but fairly easy. We manage several dozen machines with only a few hours a week of effort. What's more, adding a new box for load or experimenting is as easy as typing a few commands and waiting 20-30 minutes.

Tags: kynetx system+administration cobbler puppet


Steve Dibb
beandog
wonkablog
» website downage

Apparently, if you forget to  pay your ISP bills for three months, they'll cut off your access.  Hmm, whoops.  That's why my blog as well as *.larrythecow.org went down for a few days.

I signed up for a Linode (and did automatic billing), and I'll be moving the sites there rather soonly.  That'll save us all from other responsibility-addled issues.  Well, financial ones at least. :)

July 1, 2009

Stephen Shaw
no nic
Decriptor's Blog
» openFATE: Now with more open

It was just announced that openFATE, openSUSE’s feature tracking system, will now be open to non openSUSE members.  What this means anyone can submit new feature requests.  For more info: openFATE – Adding New Features Now Open for Everybody.


Dennis Muhlestein
nonic
All My Brain
» Example Image Upload with YUI Rich Text Editor 2.7.0

It's somewhat slow coming, but I've checked compatibility with the image uploader and YUI version 2.7.0. If you haven't read the original YUI Image Uploader page, start there. After that, you can use this page for an example getting the script to work with the latest YUI. The 2.6 image uploader is compatible with [...]


Von Fugal
no nic
ATOM von Fugal
» More to Come

Last fall I wrote about what I see coming down the pipe. I gave a glossed over explanation of why I fear we may see hyperinflation, and how I came to that conclusion.

Well, since then I have taken a university course on economics. I have a deeper and more solid understanding of those notions I had then. I also have the vocabulary to articulate it better. So, if you've taken economics and understand such terms as CPS, velocity of money, fractional reserves and money multipliers, then jump right in. If not, then I'll try to give a little guidance and some links to further reading.

The purpose of this particular post is two fold: to kick off the coming series and let my readers (really? I must mean myself) know that I haven't given up writing, and to act as an impetus, a commitment, to actually write the rest of it in a timely fashion.

0 comments

June 25, 2009

Kevin Kubasik
nonic
For Once I Oneder
» Django Windmill Tests – GSOC Progress Update

I feel that a status update is long overdue, but as the corpus of Windmill tests grows, so does the time it takes to run a complete instance of the regression suite. However, I do have some fun progress to report as well as a few questions/problems that are showing themselves now that all the fluff is over. First, let’s talk about the fun stuff!

I do have 3 of my major improvements/fixes/restructures to django.test somewhat complete. At the moment they are lacking most in documentation, a problem I intended to rectify later this week.

  1. Windmill Tests: Windmill test runners are nearly complete, threaded development server for AJAX widget testing complete.
  2. Code Coverage: Coverage.py support for runtests.py and management command. Extensible system is easily pluggable with other coverage systems.
  3. Test-Only Models: This is still a topic of discussion, but adding the property ‘test_models’ to a TestSuite will load and wipe the models. Has tests and limited docs.

My major TODO’s still outstanding:

  • Documentation!
  • Twill Runner Support (Utilizing the Windmill Threaded Server)
  • Windmill Admin Regression Tests (Healthy set of tests written, need to document and finish more)
  • Skip tests that are known to fail
  • Test new features/API’s

That’s it for now, more updates are available on the django-dev list!

July 1, 2009

Byron Clark
byronc
byronc bits
» gnome-screensaver and alternative window managers

I've been using gnome-screensaver with awesome for a while without any problems. Unfortunately that all came to an end when GNOME 2.26 hit Debian Sid last week. Just so that no-one else has to dig for this, gnome-screensaver now uses gnome-session to determine idle time. gnome-screensaver will run without gnome-session, but the screensaver and locking mechanism will never kick in. Fortunately, there is an easy fix. I changed my

gnome-power-manager &

line to

gnome-session &

in ~/.xsession and everything works now.

June 30, 2009

Pat Eyler
pate
On Ruby
» Ruby Hoedown 2009 mini-Interview with Jeremy McAnally

Jeremy McAnally (@jm) is a good friend, and we've worked together on regional Ruby conferences and other projects. With the Ruby Hoedown looming, I thought it was about time to sit down with him for a mini-interview about his free conference. How have the community and your sponsors responded to making the Ruby Hoedown free? Jeremy Everyone has largely been in two camps: "Wow that's awesome!"

June 27, 2009

Erin McNew
no nic
TuxGirl.com
» Major Site Renovation!

Well, I'm finally renovating this site. Our family will be growing soon, and it's time for us to have a site that better fits our needs as a family. So, instead of TuxGirl.com, we now have McNewFamily.net. I should be able to do a better job of keeping this site up-to-date as well, so keep your eyes open for updates (or subscribe to our RSS feed here.

June 29, 2009

Peter Abilla
no nic
shmula
» “Reply All” and the Bystander Problem

bystander problem, bystander dilemma, bystander effect, reply allIn 1964, 38 people in Queens, New York, witnessed the murder of one of their neighbors, a young woman named Kitty Genovese. A serial killer attacked and stabbed Genovese late one night outside her apartment house, and these 38 neighbors later admitted to hearing her screams; at least three said they saw part of the attack take place. Yet no one intervened.

Social Psychologists call this phenomena the Bystander Problem or Bystander Dilemma or Bystander Effect. I believe the same effect happens in “Reply All” email communication.

Shortly after the incident, psychologists John Darley and Bibb Latané sought to understand this phenomena: How can a handful of people aware of a murder fail to do nothing — how can rational people choose to not help another human being?  In answering this thesis, they arrived at one of the most replicable social experiments even to this day.

Cubicle-Seizure Study

College students sat in a cubicle and were instructed to talk with fellow students through an intercom. They were told that they would be speaking with one, two, or six other students, and only one person could use the intercom at a time.  There was actually only one other person in the study — a confederate (someone working with the researchers).  Early in the study, the confederate mentioned that he sometimes suffered from seizures. The next time he spoke, he became increasingly loud and incoherent; he pretended to choke and gasp. Before falling silent, he  stammered:

If someone could help me out it would it would er er s-s-sure be sure be good… because er there er er a cause I er I uh I’ve got a a one of the er sei-er-er things coming on and and and I could really er use some help … I’m gonna die er er I’m gonna die er help er er seizure er ….

The results of the experiment:

  • Of the 2 person room, 85% left their cubicles to help.
  • Of the 3 person room, 62% left their cubicles to help.
  • Of the 6 person room, 31% left their cubicles to help.

Diffusion and Confusion of Responsibility

Notice that the more humans there were, the likelihood of receiving help decreases — there appears to be an inverse relationship between the likelihood of receiving help and the presence of other humans.  John Darley and Bibb Latané believed that the root cause of this behavior is attributed to a Diffusion and Confusion of Responsibility.

Smoke Room Study

Another experiment:

They asked participants to fill out questionnaires in a laboratory room.  After the participants had gotten to work, smoke filtered into the room — a clear signal of danger.  How would the participants respond if they were alone versus if they were accompanied by other humans?

The results:

  • When alone, 75% percent left the room and reported the smoke.
  • With 3 people in the room, 38% percent left to report the smoke.
  • With two confederates (working with psychologists) instructed not to show any concern, 10% reported the smoke.

In two seperate and distinct studies shown above, the results were similar.  John Darley and Bibb Latané conducted many more similar studies and other social psychologists have done a number of novel studies since, and the results are starkly similar and behavior is depressingly predictive: When others are involved, most of us are Bystanders.

Most of us are Bystanders

“Reply All”

In a business setting, the most egregious situation that invites Bystander behavior is the “Reply All” email.  When others are included in the “To” field, I submit most of us either glance the email or delete it wholesale.

Why?

John Darley and Bibb Latané would most likely attribute that response to a diffusion of responsibility — when many people are included in the email, we’re either confused of the request or believe that the request will be satisfied by one of the people for which that email was addressed — we believe that at least 1 of the 15 people will respond.

Unfortunately, this assumption is often wrong.

Indeed, when we engage in this type of email communication, we are creating an environment in which we invite others to be Bystanders.

We sometimes create an environment in which we invite others to be Bystanders – we are sometimes the root cause for others Bystanding

Anti-Bystander Behavior

Fortunately in the email communication space, the countermeasure to Bystander behavior is simple:

  1. Address only the relevant people in an email – and not too many people
  2. Address, by name, the person to whom you are requesting advice, help, or approval
  3. Be clear, concise, and make your request explicit — do not leave the recipient guessing

In this setting, the countermeasure is simple, intuitive, effective — but it’s not simplistic.

Conclusion

Let us not create business environments that encourage bystander behavior — let us act for good, let us do good, and allow others to do the same.

Share This Post: Digg Facebook Yahoo! Buzz del.icio.us FriendFeed Suggest to Techmeme via Twitter Reddit Google Bookmarks Live StumbleUpon LinkedIn Slashdot MySpace E-mail this story to a friend!

June 28, 2009
» Baby Announcement

We are very happy to announce the arrival of our second daughter, Elizabeth, today. She was born early this morning. 9lbs. 7oz (big baby!), 22″ long. She and mother are doing fine and resting.

elizabeth1

Other Points of Interest

  • No Related Post


Doran Barton
fozzmoo
Fozzolog
» Politics Fozzolog: Book Review: Glenn Beck's "Common Sense"

Glenn Beck's Common Sense: The Evolution of Thomas Paine's Revolution Glenn Beck's Common Sense: The Evolution of Thomas Paine's Revolution by Glenn Beck

My review

rating: 4 of 5 stars
Anyone who knows me or has read some of my previous reviews probably knows that I'm one of Glenn Beck's biggest fans, so it will come as little surprise that I now have 4 copies of this book and plan to distribute it to family and friends.

As with his previous non-fiction work, An Inconvenient Book Real Solutions to the World's Biggest Problems, this book is, for the most part, a repackaging of things Glenn says every day on his television and radio shows. It discusses the corruption in government, the loyalty to special interests among those in congress, the amassing of power by the executive branch, and the cancer that is the Progressive movement.

That being said, this is definitely a book you can give to your friends who aren't necessarily one of Glenn's biggest fans. And, encourage them to pass it on when they're done. Sign your name on the inside cover and include the date your read it and encourage others to do the same. This book is a rallying cry to all those who feel their voice is held in contempt or just plain ignored by the political class in America.

I would like to share one of my favorite parts of this book. It is very near to the end of the book (before the Thomas Paine section starts) and addresses religion in a democracy.


So why is religion so important to the proper functioning of a democracy? Well, once again, our Founding Fathers had the answer. In a letter to the president of Yale University, Benjamin Franklin once wrote:


Here is my creed: I believe in one God, the Creator of the universe. That he governs it by his providence. That he ought to be worshipped. That the most acceptable service we render to him is in doing good to his other children. That the soul of man is immortal, and will be treated with justice in another life respecting its conduct in this. These I take to be the fundamental points in all sound religion.


It wasn't about any one particular creed, dogma, or church, but rather about all religions that inspired men to selflessness, virtue. and godliness. Our Founders understood the thing that we try so hard to forget today: there is far more than unites us than divides us. Virtue, honesty, and character aren't the purview of any particular congregation; they can be found in any church that has God as its foundation. We have forgotten this lesson and instead of using religion as our anchor, we use it to shame or blame. To many in this country, those who attend church regularly aren't pillars of their community, they're freaks or extremists.

But that mind-set can be changed by setting an example of tolerance and unparalleled acceptance toward each other. Let's stop using our religious symbols to score political points. Are we that insecure in our own faith that the religious symbols or public prayers of a different religion cannot be welcomed with open arms? As Thomas Jefferson once said:


Question with boldness even the existence of a God; because, if there be one, he must more approve of the homeage of reason, than that of blind-folded fear... Do not be frightened from this inquiry from any fear of its consequences. If it ends in the belief there is no God, you will find incitements to virtue in the comfort and pleasantness you feel in its exercise...

Religions and their followers must stop turning on each other. We are a land founded through divine Providence, a land where, as James Madison said, the "spirit of liberty and patriotism animates all degrees and denominations of men."


Very well said, Glenn.


View all my reviews.

June 27, 2009

Dennis Muhlestein
nonic
All My Brain
» Launching wxPython apps with an iPython shell

Suppose you want to run your fancy wxPython application but have a shell in the background to peek and poke at certains settings, help debug, and possibly even use an API that your program provides to automate tasks. iPython has built in wx support (as well as support for other GUIs and frontends). [...]

June 26, 2009

Will Smith
no nic
Explorations
» Better Backups

So, yesterday I talked about me casually wielding the sword of death that is `rm -rf`. Part of the issue has been that with some things I have daily backups. But for most stuff our backups are sporadic at best. So this is my question. I obviously need a better, and preferably FOSS, solution for backups. Any suggestions?

My first thought is to set up a NAS server that I can copy stuff to. Anything better?


Phil Windley
pjw
Phil Windley's Technometria
» Starting a High Tech Business: Selling the Third Deal

Kynetx Logo

I'm starting a new business called Kynetx. As I go through some of the things I do, I'm planning to blog them. The whole series will be here. This is the nineteenth installment. You may find my efforts instructive. Or you may know a better way--if so, please let me know!

I have a theory that the third deal matters more than the first two. Here's why.

The first time you sell your product--your first deal--is always exciting. But let's be honest, it could be a fluke. If you beat the bushes long enough you're likely to find someone who'll buy almost anything.

The second deal feels good because you at least can convince yourself that the first deal wasn't an accident.

But the third time you sell your product you have confidence around a few important things:

  • Proven repeatability - to get to the third deal you've proven that you understand what your selling and you're able to explain it in a way that people connect with.
  • Turn the crank - at this point you ought to be able to "turn the crank" operationally and deliver. If you're still doing one-offs by the third deal, you need to ask yourself what will change by the fourth, eighth or 100th deal? You can't achieve scale without operational excellence.
  • Know your price - On the first deal you're always a little unsure of the price you've set. Is it too high? Too low? Will you get laughed out of the room? By the third deal, you can go into pricing discussions with confidence. After all, two other customers have paid it--why won't everyone?

I've found that to get any deal you usually have to put your ego aside. The sweetspot is when you've found (a) something you're good at, (b) something you like to do, and (c) something someone will pay for. A deal implies (a) and (c). If you have to cave at all on (b), then your ego's likely to get in the way of the deal.

Putting ego aside is not always easy for techies to do. After all, you've spent years working on this and generally have dreams and even fantasies about how people will use it. Take a deep breath and realize: someone's willing to pay money for something you built. That's a good feeling. Go with it and enjoy the ride.

Tags: kynetx startup sales

June 25, 2009

Phil Windley
pjw
Phil Windley's Technometria
» Annotating Anything

Kynetx Logo

Today I released build 299 of KNS. There are three important updates to KRL in this build.

First, KRL now support literal hashes. Hashes are creating by enclosing comma-delimted name-value pairs in curly braces like so:

{"foo" : "bar", "fizz" : 3, "flop" : [1, 2, 3]}

Second, the annotate_search_results action has been modified to support two new configuration parameters:

  • results_lister - (defaults to "li.g, div.g, li div.res, #results>ul>li") - jQuery selector for finding relevant results to annotate. The default finds search results for Google, Yahoo, and Bing.
  • element_to_modify - (defaults to "div.s,div.abstr,p") - the jQuery selector for finding the element to modify within the results returned by the result lister. The default finds the main body of a search result..

These parameters give you the ability to find and annotate other items on almost any page that displays results. For example, the following action will annotate the paid search results in Google given an appropriately defined my_selector function.

annotate_search_results(my_selector)
 with results_lister = "#mbEnd li" and
      element_to_modify = "a#an1";

Third, user-defined datasources are now more flexible. Previously, the arguments to the datasource function were assumed to be name-value pairs presented as strings. The function put them together to create a QUERY string. That wasn't as flexible as needed for path-based APIs. So now the datasource takes a single parameter of either a string or a hash:

  • If the parameter is a string, then it is concatenated with the URL root given in the datasource declaration without modification. What you supply here, when appended to the datasource root URL must result in exactly the URL that you intend to call.
  • If the parameter is a hash, then the has is turned into a properly formatted HTTP QUERY string with names 7 values delimited by an equals sign (=) to create a name-value pair and each name-value pair delimited by an ampersand (&):
    pre {
      tweets = datasource:twitter_search({"q": query});
    }
    

This allows path-based API calls to be created as strings and QUERY string calls to be created by either creating the string or putting the name-value pairs in a hash and letting the function create the query string.

Tags:


Jeremy Robb
scothoser
Scothoser's Corner
» The Allure of Living Simply: Rethinking the Home

My household has become rather cramped of late with family living in a small(ish) home, and so my wife and I started floating ideas around on how to better manage our home.  Our own family was growing, and we felt cramped in the house. 

The first thought we had was to expand, and to expand radically.  I immediately pulled out my lab notebook and started drawing the house (more or less to scale), and adding on a radical extension that would almost double the square footage of our home.  I then took the plans to a good friend of ours that was also a general contractor, and got the crushing news:  not only would we have trouble getting a permit to build the monstrosity, but we would be looking at a cost that would be equal to what we still owed on our mortgage.  Defeated, he told me to think through it again, and get other opinions. 

So I started thinking what my requirements were, and what I wanted out of my home.  First and foremost I want more garden space, at least for a couple of peach trees and a cherry tree.  Currently I don’t have that, and I love both peaches and cherries.  I would also like to grow a number of other food products in the yard while still having a safe place for my boys to play.  I also need more space for my parents to live, as their health is starting to suffer. 

For those of you who are not familiar with the layout of my home, I have a 1,000 square foot home, with another 900 square feet in 90% finished basement.  I then have a 320 square foot covered back porch, which is attached to a 729 square foot garage (which was most likely built without a permit).  The garage collects clutter like mad because it’s easier to throw junk into the garage than throw it out, and once it’s out of sight, it’s out of mind, right? 

As it stands now, the garage is not up to city code, and as such the city will not let me make any more improvements to the property.  So what does this mean?  It means I need to tear down my garage full of clutter before I can even enclose the porch, or any other structure for more living space.  This doesn’t really bother me, though it will force me to get rid of some clutter, and make those decisions. 

My wife and I also started talking about the house itself.  Both of us realized that we will never move, and so we want to make the house as livable as possible.  With a few alterations, we could be remodel the home as is, and make it more simple.  Install radiant heating for the floors, and hardwood or tile instead of carpeting.  Both are easier to clean (particularly when trying to potty-train an autistic child), and you can make it really cozy with area rugs.  Add solar power to that, and no more need for a gas bill.  If it gets too cold, we have a fireplace and a wood stove that heats the house quite efficiently. 

Also, if we remove clutter from the rooms, the rooms will seem more open.  There are a lot of figurines, odds and ends, and bits of furniture that are just not needed in the home.  This will be a wrench for me, because I like to collect junk – you never know when you may need it later.  But it’s time I started to think about whether or not I will actually need it.  Currently I don’t, and I don’t see a foreseeable future when I would.  So, I need to just suck it up and throw out all the useless junk that I don’t need.

Anyway, both my wife and I came to the conclusion that we could save a lot of money and time by just making a few changes in how we see the space we need vs. the space we would like.  We don’t need a massive home, with 20 feet by 20 feet bedrooms, we just need to utilize our current space better.

And for my parents, I could build a simple little guest cottage for them in place of the garage, and a small workshop garage right next to it, and still have more garden space.  it all comes down to living simply, and managing the space more efficiently.


Phil Windley
pjw
Phil Windley's Technometria
» CTO Breakfast Tomorrow

CTO Breakfast

Tomorrow is the CTO breakfast. It starts at 8am and goes to 9:30am. The location is, as usual, the Novell cafeteria. Sorry for the late notice; for some reason my calendar wasn't showing the Google calendar event. Luckily an email prodded me from my stoopor.

The CTO breakfast isn't just for CTOs, but also for those who aspire to be CTOs or are interested in building high-texh products. The discussion is open-format. We decide what to talk about when we get there. You're welcome to bring your topic and bring it up.

Here are the scheduled dates for upcoming meetings:

  • No breakfast in July
  • August 28, 2009 (Friday)
  • September 24, 2009 (Thursday)

I've created a Utah CTO Breakfast group at LinkedIn. You're invited to join.

I hope to see you there!

Tags: breakfast cto utah events


Will Smith
no nic
Explorations
» Painful Lesson to learn

So I was SSH'd into one of our servers and decided that one of the directories needed to be deleted. Little did I realize that the directory contained symbolic links (either that or the whole directory was a sym link) and so when I ran my little 'rm -rf' a lot of stuff, rather a TON of stuff was gone.

So, I have spent a lot of time getting stuff back together and making things work. It has not been easy or fun. In fact it has been a rather big PITA.

So, lesson of the day. Check twice before doing a rm -rf. :(


Ryan Byrd
no nic
Ryan Byrd's Tech Ramblings
» Browser Wars

firefox-girlThe browser war isn’t a real war with machine guns and artillery shells and breaking Geneva conventions, it’s more of a virtual turf war for the world’s web surfers. Let’s review the history of this nifty interweb of ours:

  • 1989: CERN researcher Tim Berners-Lee launches the first web server*. You can see that web server (and I have) because it’s just sitting on a table in one of the CERN lobby buildings. You could even steal it if you wanted (I considered it), because there is very little security– those silly Swiss!
  • Mosaic, the first graphical browser, came out a few years later, in 1993, followed by it’s cousin Netscape Navigator in 1994. Remember?
  • Microsoft, with their market-busting, monopolistic fervor, introduced Internet Explorer (IE) in 1995 and began shipping it with all version of Windows. Because it came pre-installed, it quickly grew to near complete market domination.
  • SEVEN YEARS passes with little change. Everyone had been using IE. Then, WHAMMO! Firefox (www.getfirefox.com). Firefox is available on Linux, Mac and PCs. It’s fast, has lots of awesome plugins and TABS!
  • A year or so passes and Microsoft plays catch up and finally releases a tabbed version of IE. Other browsers appear (like Google Chrome.)

browser_warHow goes the fierce, non-violent, nerdy war? As of May 2009, the browser market share looks like:
IE7 21.3%
IE6 14.5%
IE8 5.2%
FF 47.7
Chrome 5.5%
Safari 3.0%
Opera 2.2%

So, what’s the next step? Better tabs. So good ol’ Mozilla (makers of Firefox) are having a competition to redesign the tabbing experience.

My good buddy, Grady, a world-class graphic designer, has created a new paradigm for tabbing, he calls it favitabs, (http://www.favitabs.com). Today starts the voting for the people’s choice award, and anyone can vote: http://design-challenge.mozilla.com/summer09/showcase.php

The voting ends of July 5th, so if you want to be part of history, if you think Favitabs is an awesome idea, then click on over to the design challenge and vote.

* Sir Tim also came up with the crazy http:// prefix for web addresses. He is said to regret that decision.

June 24, 2009

John Anderson
sontek
John Anderson ( sontek )
» Python with a modular IDE (Vim)

On Thursday, May 9th, 2008 the Utah Python User Group decided to settle the debate that has plagued us developers since the beginning of time: If you were a programming language, what editor would you use?

I was tasked with showing Eclipse with the PyDev plugin in all its glory–but we all know–real men / developers don’t use IDE’s, so we are going to talk about using Python and Vim together, reaching a state of Zen that the Dalai LLama would be jealous of and establishing more Feng Shui than Martha Stewart’s Kitchen.

Freely jump between your code and python class libraries

There are 2 ways to add your ability to jump between python class libraries, the first is to setup vim to know where the Python libs are so you can use ‘gf’ to get to them (gf is goto file). You can do this by adding this snippet to your .vimrc:

python << EOF
import os
import sys
import vim
for p in sys.path:
    if os.path.isdir(p):
        vim.command(r"set path+=%s" % (p.replace(" ", r"\ ")))
EOF

With that snippet you will be able to go to your import statements and hit ‘gf’ on one of them and it’ll jump you to that file.

Continuing accessibility of the Python class libraries we are going to want to use ctags to generate an index of all the code for vim to reference:

$ ctags -R -f ~/.vim/tags/python.ctags /usr/lib/python2.5/

and then in your .vimrc

set tags+=$HOME/.vim/tags/python.ctags

This will give you the ability to use CTRL+] to jump to the method/property under your cursor in the system libraries and CTRL+T to jump back to your source code.

I also have 2 tweaks in my .vimrc so you can use CTRL+LeftArrow and CTRL+RightArrow to move between the files with more natural key bindings.

map <silent><C-Left> <C-T>
map <silent><C-Right> <C-]>

You can also see all the tags you’ve been to with “:tags”

Code Completion

To enable code completion support for Python in Vim you should be able to add the following line to your .vimrc:

autocmd FileType python set omnifunc=pythoncomplete#Complete

but this relies on the fact that your distro compiled python support into vim (which they should!).

Then all you have to do to use your code completion is hit the unnatural, wrist breaking, keystrokes CTRL+X, CTRL+O. I’ve re-bound the code completion to CTRL+Space since we are making vim an IDE! Add this command to your .vimrc to get the better keybinding:

inoremap <Nul> <C-x><C-o>

Documentation

No IDE is complete without the ability to access the class libraries documentation! You’ll need to grab this vim plugin. This gives you the ability to type :Pydoc os.path or use the keystrokes <Leader>pw and <Leader>pW to search for the item under the cursor. (Vim’s default <Leader> is “\”).

Syntax Checking

Vim already has built in syntax highlighting for python but I have a small tweak to vim to give you notifications of small syntax errors like forgetting a colon after a for loop. Create a file called ~/.vim/syntax/python.vim and add the following into it:

syn match pythonError "^\s*def\s\+\w\+(.*)\s*$" display
syn match pythonError "^\s*class\s\+\w\+(.*)\s*$" display
syn match pythonError "^\s*for\s.*[^:]$” display
syn match pythonError “^\s*except\s*$” display
syn match pythonError “^\s*finally\s*$” display
syn match pythonError “^\s*try\s*$” display
syn match pythonError “^\s*else\s*$” display
syn match pythonError “^\s*else\s*[^:].*” display
syn match pythonError “^\s*if\s.*[^\:]$” display
syn match pythonError “^\s*except\s.*[^\:]$” display
syn match pythonError “[;]$” display
syn keyword pythonError         do

Now that you have the basics covered, lets get more complicated checking added. Add these 2 lines to your .vimrc so you can type :make and get a list of syntax errors:

autocmd BufRead *.py set makeprg=python\ -c\ \"import\ py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
autocmd BufRead *.py set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

You will have the ability to to type :cn and :cp to move around the error list. You can also type :clist to see all the errors, and finally, sometimes you will want to check the syntax of small chunks of code, so we’ll add the ability to execute visually selected lines of code, add this snippet to your .vimrc:

python << EOL
import vim
def EvaluateCurrentRange():
eval(compile('\n'.join(vim.current.range),'','exec'),globals())
EOL
map <C-h> :py EvaluateCurrentRange()

Now you will be able to visually select a method/class and execute it by hitting “Ctrl+h”.

Browsing the source

Moving around the source code is an important feature in most IDE’s with their project explorers, so to get that type of functionality in vim we grab the Tag Listplugin. This will give you the ability to view all opened buffers easily and jump to certain method calls in those buffers.

The other must-have feature of an IDE when browsing code is being able to open up multiple files in tabs. To do this you type :tabnew to open up a file in a new tab and than :tabn and :tabp to move around the tabs. Add these to lines to your .vimrc to be able to move between the tabs with ALT+LeftArrow and ALT+RightArrow:


map <silent><A-Right> :tabnext<CR>
map <silent><A-Left> :tabprevious<CR>

Debugging

To add debugging support into vim, we use the pdb module. Add this to your ~/.vim/ftplugin/python.vim to have the ability to quickly add break points and clear them out when you are done debugging:

python << EOF
def SetBreakpoint():
    import re
    nLine = int( vim.eval( 'line(".")'))

    strLine = vim.current.line
    strWhite = re.search( '^(\s*)', strLine).group(1)

    vim.current.buffer.append(
       "%(space)spdb.set_trace() %(mark)s Breakpoint %(mark)s" %
         {'space':strWhite, 'mark': '#' * 30}, nLine - 1)

    for strLine in vim.current.buffer:
        if strLine == "import pdb":
            break
    else:
        vim.current.buffer.append( 'import pdb', 0)
        vim.command( 'normal j1')

vim.command( 'map <f7> :py SetBreakpoint()<cr>')

def RemoveBreakpoints():
    import re

    nCurrentLine = int( vim.eval( 'line(".")'))

    nLines = []
    nLine = 1
    for strLine in vim.current.buffer:
        if strLine == ‘import pdb’ or strLine.lstrip()[:15] == ‘pdb.set_trace()’:
            nLines.append( nLine)
        nLine += 1

    nLines.reverse()

    for nLine in nLines:
        vim.command( ‘normal %dG’ % nLine)
        vim.command( ‘normal dd’)
        if nLine < nCurrentLine:
            nCurrentLine -= 1

    vim.command( ‘normal %dG’ % nCurrentLine)

vim.command( ‘map <s-f7> :py RemoveBreakpoints()<cr>’)
EOF

With that code you can now hit F7 and Shift-F7 to add/remove breakpoints. Then you just launch your application with !python % (percent being the current file, you can declare your main file here if its different).

Another tweak I use is to have my vim inside screen with a horizontal split, that way I can see the python interpreter and debug while still having vim there so I can easily fix my code.

Snippets

A great time saver with standard IDE’s is code snippets, so you can type a few key strokes and get a lot of code out of it. An example of this would be a django model, instead of typing out the complete declaration you could type ‘mmo<tab><tab>’ and have a skeleton of your model done for you. To do this in vim we grab the Snippets EMU plugin.

Check out a great screencast of snippetsEmu in action here

Emacs

Here is a great post on how to do the same with Emacs.

kick it on DotNetKicks.com


Adam Olsen
synic
Vimtips Latest Articles
» Engimo 2 and Wine

After beating Enigmo in the iPhone, I was eager for more. I’m a sucker for these type of games. I downloaded the demo of the Windows version of Enigmo 2, and, to my delight, it works great out of the box in Wine! It’s got tons more doodads and etc than the iPhone version, so I’d say it’s a perfect upgrade path if you like that game.

The installer works fine, but I recommend launching the Enigmo 2 application after you have installed it with a command similar to this:

wine explorer /desktop=Enigmo,1024x768 'c:\\Program Files\\Ideas From the Deep\\Enigmo 2 Supernova\\Enigmo 2.exe'

Enigmo 2 appears to have a maximum resolution of 1024×768, and this command will allow you to run it in a Window that size.

It even works on my HP Mini 1030, which doesn’t have the most fantastic video card in the world :)


Pat Eyler
pate
On Ruby
» A Ruby Couple: Interview with James and Dana Gray

It's another week without a Questions Five Ways discussion, but I've got another great interview that more than makes up for it. James Gray (@JEG2) is very well known in the Ruby community. His wife, Dana, is less well known, but won't stay that way for long. Fresh from her Ruby presenting debut, a lightning talk on Ruby regular expressions at MWRC, the two of them are embarking on a joint


Richard K. Miller
no nic
Richard K Miller
» 3 Uses for iPhone Screenshots

For all the iPhone users out there: You probably know you can take a snapshot of whatever you see on your screen:

  1. Briefly press the top and front buttons at the same time.
  2. The screen will flash white and you’ll hear a “snapshot” sound.
  3. A picture of your screen is now in your iPhone “Photos”.

I’ve found it extremely helpful to make screenshots, and I do it all the time. Here are a few reasons:

Remember an Interesting Part of a Podcast

If I’m driving and hear something I like in a podcast, I make a quick screenshot of the playback screen. When I get back to my computer, I can return to that spot in the podcast and take notes.

iphone_screenshot_podcast

Save a Point on a Map

Sometimes I want to “bookmark” a location on the map before looking up something else. A screenshot is a fast way to do this.

iphone_screenshot_map

Save a Website Address Without Interrupting Your Reading

Sometimes when I’m reading in Google Reader, I want to save the location of an article to read later. (I don’t want to leave Google Reader immediately because it has to entirely reload when I return.)

If you hold your finger on a link for a few seconds, a menu will popup with the address of the link. Sometimes I simply save a screenshot of the link, then hit Cancel and go back to my reading. Later I read the items I saved in my screenshots.

iphone_screenshot_opened_link

Screenshots can help you practice “ubiquitous capture” — capturing all notes, thoughts, and ideas, as they come to you, so you don’t have to keep them in your head.

June 23, 2009

Jeremy Robb
scothoser
Scothoser's Corner
» iPod Touch 2G with 3.0 Update: First Thoughts

It took me a while, but I finally updated my iPod Touch to the new 3.0 update.  I liked the idea of copy and paste, and the Spotlight search was nice, but I did it entirely because I wanted to enable Bluetooth on my Touch, so I could use it for wireless music and for VoIP. 

The update was clean, and took a good half hour.  The download was about 15 minutes, and the actual update process was another 15.  Then for the next 15 minutes, my iPod backed itself up.  Yes, I paid for the update, and I’m glad I did.  Piracy is not something I condone at any level.  Be honest in your dealings.  If you don’t want to pay $10 for a software upgrade, try installing Linux on your iPod (yes, there is currently a project for it). 

Once it was finished, the first thing I tried to do was pair my Plantronics Voyager 510 headset I purchased several years ago with my iPod.  Bluetooth was easy to find on the iPod Touch in Settings, under General.  I enabled it, set my iPod in discovery mode, and then set up my headset in discovery mode.  And…nothing.  My iPod wouldn’t even see it. 

Puzzled, and concerned that perhaps the chip was dead on my iPod that I bought a long time ago, I thought I would check out the boards and see if anyone else was experiencing the same issue.  Report after report came of people either not able to pair their non-stereo headset, or the mic not working on a paired stereo headset. 

So this told me two things:  The headset needs to be an SD2P stereo headset (good thing I didn’t buy a headset for my wife quite yet), and the mic wasn’t working for those out there that already had it set up.  My heart sank, because this was the main reason why I wanted Bluetooth for my iPod Touch.  I want a WiFi phone that is easy to carry around, doesn’t ring when I don’t want it to, and let’s me access my voicemail on my own time. 

But the reports of the bluetooth mic were made primarily in conjunction with Skype, and when I opened Skype on my iPod, I got an incompatible OS Version error.  The app seemed to work just fine, but I wondered if the mic functionality was only being tested on an app that may not support it, instead of a limitation in the OS.

More searching brought up some discussions of the mic not working at all, even for Voice Memos, so my guess is the bluetooth mic support is not built into the OS update.  Perhaps it will be added in another minor update (one would hope), because the convenience would make owning the iPod Touch that much more of a benefit.

With regard to the other features, it is nice to have copy and paste now, though it took me a few seconds to figure out how to use it.  The Calendar update is something I have wanted for a long time (CalDAV supported at last!), but since I’m using Exchange at work, I can’t have other calendars set up.  Spotlight is really nice, because it finds anything on the iPod.  I had wondered how someone with many pages of apps would find the app they wanted.  Spotlight takes care of that. 

I had wondered when the shake to shuffle functionality would come to the iPhone and iPod Touch when it was added to the iPod Nano, though I don’t think it would be ideal for joggers.  In fact I have already heard of joggers and mountain bikers recommending the feature be turned off before starting.  The Parental Controls are a welcome feature.  That alone makes the $10.00 upgrade worth it!

I like the idea of syncing the Notes, though I still need to find the location to which they are copied.  I like the idea because it allows for spontaneous fits of writing to my iPod, and then I can copy the results to an app at another time. 

Lastly, Safari.  I had high hopes for this update, hoping that it would include full Java applet support, and not just Javascript.  Why?  Because I hold office hours in Wimba, which requires Java to run properly for many of it’s functions.  I didn’t necessarily want everything to work, but at least chat should I be on the road and need to attend office hours on the go. 

So, while I was disappointed with the Bluetooth headset failure, I still think the update is worth the $10.63 (with tax) for the other features.  If anyone has any more information on bluetooth headsets and using VoIP, I would be very interested in hearing about it! 


John Anderson
sontek
John Anderson ( sontek )
» Creating an XSL Extension in C#

Although XSL is very powerful, I’m sometimes more comfortable with doing certain operations in C# and luckily it is pretty simple to call C# libraries from XSL.

First, you’ll need the code that you will call from XSL, this can just be a normal POCO, doesn’t have to be anything specific to XML/XSL:

 

    public class StringExtension
    {
        public string Proper(string data)
        {
            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            return textInfo.ToTitleCase(data.ToLower());
        }
    }

 

Then you need to use the XsltArgumentList class to add an extension object to your Xsl Transform:

   class Program
    {
        static void Main()
        {
            XPathDocument doc = new XPathDocument("data.xml");
            XslCompiledTransform trans = new XslCompiledTransform();
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            trans.Load("stylesheet.xslt");
            XsltArgumentList args = new XsltArgumentList();
            StringExtension ext = new StringExtension();
            args.AddExtensionObject("ext", ext);
            trans.Transform(doc, args, sw);
            Console.WriteLine(sw.ToString());
            Console.ReadLine();
        }
    }

 

Now all you have to do is register the namespace in your XSL (i.e xmlns:”ext”) and you can use the extension by calling ext:Proper():

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:ext="ext"
 >
  <xsl:output method="text" indent="yes"/>
  <xsl:template match="/">
    <xsl:for-each select="People/Person">
      First Name: <xsl:value-of select="ext:Proper(@FirstName)"/><br />
      Last Name: <xsl:value-of select="ext:Proper(@LastName)"/><br />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

kick it on DotNetKicks.com


Kevin Kubasik
nonic
For Once I Oneder
» Wordpress Upgrade

I just upgraded to the latest Wordpress release (2.8!) let me know if you have any issues viewing the site!

June 22, 2009

Ryan Byrd
no nic
Ryan Byrd's Tech Ramblings
» Load Balancing for Fun and Profit

If you’re like me, and goodness who isn’t?!?, you probably run a few high bandwidth sites. You probably worry a lot about reliability and scalability and fault tolerance. You’ve maybe looked into hardware load balancers (like F5’s BigIP), only to be discouraged by the hefty price tag: 15k and up. Don’t misunderstand– if you’ve got the cash, you can’t beat the BigIP in terms of reliability and features and ease of use. But if your blog isn’t exactly paying for itself yet, you’ll need to consider other options. A lot of people like the idea of DNS load balancing. That’s where you add a bunch of A records for your domain to different IP addresses. The DNS server will then serve out the IPs in a round-robin sort of manner. It’s a good way to spread the web traffic to a group of web servers. But if a server goes down, you’ll have to remove it from your DNS and wait for the TTL to expire before things are back up (of course, you could power down the machine and alias the IP address to another server in the same network…)

But it’s clunky because the only balancing is round robin and there are no health checks involved. Fortunately, you have alternatives. I’ll present one of those options here: load balancing with mod_proxy. mod_proxy is an apache module. In the diagram to the above-right you can see my setup. I have two load balancers, two web servers and two databases. On the two load balancers, I’m running apache with the mod_proxy and mod_proxy_balancer. There is a UDP heartbeat between the two. Apache is started on only one of those servers and the virtual IP (VIP) is aliased to that one. If that machine goes off line, the second load balancer will grab the VIP and start up apache.

And then we have the web servers. The active load balancer will round robin serve up pages to the web servers. If one of the web servers goes off line, the load balancer detects that and will take that web server out of the rotation.

And, yes, I set it all up and it works splendidly. Yes, you can put the load balancers and web servers on two machines instead of four. Yes, you’ll need to keep sessions in MySQL to prevent loss of session info during a failover. You can check which load balancer is active by watching ifconfig or ps -aux|grep httpd. If things aren’t working, check /var/log/ha-log, and if there are errors, it will tell you the command it’s trying to run. run that command to see the error message.

I haven’t talked about how to scale the MySQL tier. There are a number of solutions: master/slave, mysql proxy, active/active or mysql cluster. More about that later.

There are a number of conf files you’ll need to set up to get this working:

authkeys

auth 2
2 sha1 TOPSECRETWORD

ha.cf

logfile /var/log/ha-log
bcast eth0
keepalive 2
warntime 5
deadtime 10
initdead 20
udpport 694
auto_failback yes
node lb1
node lb2
uuidfrom nodename
respawn hacluster /usr/lib/heartbeat/ipfail

haresources (Must be EXACTLY the SAME ON BOTH lb1 and lb2!!!)

lb1 10.1.1.19 httpd

http.conf

Listen 10.1.1.19:80
…
ProxyRequests Off
 
<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Allow from all
</Location>
 
<Proxy balancer://mycluster>
# cluster member 1
BalancerMember http://10.3.1.31:80 route=lb1
# cluster member 2
BalancerMember http://10.3.1.32:80 route=lb2
</Proxy>
 
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/ lbmethod=byrequests
ProxyPassReverse / http://10.3.1.31
ProxyPassReverse / http://10.3.1.32
#ProxyTimeout 10
 
<VirtualHost *:80>
ServerName intranet.example.com
UseCanonicalName On
 
DocumentRoot /var/www/html
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
 
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)
RewriteRule ^(/server-status) $1 [H=server-status,L]
 
# Proxy the rest to the load balancer
RewriteRule ^/(.*)$ balancer://mycluster%{REQUEST_URI} [P,QSA,L]
 
ErrorLog /var/log/httpd/http_log_error
CustomLog /var/log/httpd/http_log combined
 
# Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
 
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>

iptables

...
-A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 694 -j ACCEPT
…

ldirectord.cf

checktimeout=10
checkinterval=2
autoreload=no
logfile="/var/log/ldirectord.log"
logfile="local0"
quiescent=yes
 
virtual=10.1.1.19:80
       fallback=127.0.0.1:80
       real=10.1.1.21:80 masq
       real=10.1.1.22:80 masq
       service=http
       request="index.html"
       receive="Test Page"
       scheduler=rr
       protocol=tcp
       checktype=negotiate

These reference pages are very useful:


Brandon Dayton
no nic
Merril Brandon
» Whu?

June 21, 2009

John Anderson
sontek
John Anderson ( sontek )
» Command Line Shortcuts for CMD and PowerShell

Here are some really useful command line shortcuts that I found on a forum awhile back but don't remember now:

F1 Repeats the letters of the last command line, one by one
F2 Displays a dialog asking user to "enter the char to copy up to" of the last command line
F3 Repeats the last command line
F4 Displays a dialog asking user to "enter the char to delete up to" of the last command line
F5 Goes back one command line
F6 Enters the traditional CTRL+Z (^z)
F7 Displays a menu with the command line history
F8 Cycles back through previous command lines (beginning with most recent)
F9 Displays a dialog asking user to enter a command number, where 0 is for first command line entered

kick it on DotNetKicks.com

» ASP.NET Server tags cannot contain <% ... %> constructs

We've all seen the Server Tags cannot contain <% ... %> constructs which comes from trying to use server side <% .. %> inside a server side control:

<asp:TextBox runat="server" Text="<%= ConfigurationManager.AppSettings["Title"] %>" />

You have a few ways around this, the easiest and most common way is to assign the properties server side:

this.textBox1.Text = ConfigurationManager.AppSettings["Title"];

But I like being able to do as much of my property setting in markup as possible so if I ever need to change the property it doesn't require a complete re-build/re-deploy.

The more elegant/fun solution would be to use an ExpressionBudiler, you've most likely used this class already if you've ever worked with a a multilingual website, to have controls pull globalized text from your resx resources you do the following:

<asp:Label runat="server" Text="<%$ Resources:Text, ParticipantHeader %>" />

This is using a ResourceExpressionBuilder, there is also an AppSettingsExpressionBuilder and a ConnectionStringsExpressBuilder built into the .NET framework that you can use. If these don't do what you want you can always build your own, you can see an example of a custom ExpressionBuilder at the MSDN Documentation.

<% ... %> constructs"><% ... %> constructs"> kick it on DotNetKicks.com

June 20, 2009

Jeremy Robb
scothoser
Scothoser's Corner
» Iran, Revolution, and the U. S. President

Today there have been a lot of articles in the news about the reaction, or lack thereof, from President Obama’s Administration regarding the protests and prelude to revolution in Iran.  Instead of whole-hearted praise and warm greetings to those protesting what appeared to be a rigged election, it has been a measured, cautious approach.  Some call this outrageous, others call it being too weak.  I, on the other hand, see it as exactly what the US should be doing, and here is why:

In 1989, when protesters in Berlin began to bring down the Berlin Wall, the world was elated.  Everyone wanted a piece of the wall (and I think you can still find some pieces on eBay, though I’m not sure if they are authentic), and everyone was talking about the success of the US policy against Russia.  The media was praising this, and looking to the President, then President George Bush (Sr.) for words of support and praise.  Instead, President Bush was reserved, much like President Obama is currently.  He was criticized for his apparent lack of concern or support for what almost every President since John F. Kennedy had called for:  the fall of the Berlin Wall.

But President Bush had a reason to be reserved:  Having worked for the CIA, he knew of a common technique used by the KGB where rumors of CIA and US support would come to those who revolt against Soviet rule.  The protests would then be made with the hope and understanding that the CIA would back the revolt, and the KGB would then sweep in and quickly wipe out all dissidents.  President Bush didn’t want the same technique used in Germany, and so merely said he was watching things closely and didn’t say anything regarding the fall of the Wall. 

As a result, the fall of East Germany under the rule of the Soviets was completely a German matter, and was not controlled or instigated by the US.  As such, the reunification has since been a German decision, and no one can claim that Germany is by any means under the control of the US Government.  Also, other countries were able to break free from the Soviet State, and become independent without US intervention, and therefore their governments became truly theirs, representative of the people. 

So now let’s look at Iran.  There is a lot going on there that is promising to those looking for freedom and a true democracy in that country, free from the influences of the US or any other nation.  These demonstrations are truly Iranian in nature, and President Obama is determined to keep it that way.  It’s worthy of President Bush, and I imagine he probably had counseled with the former President on this very issue.  There are no other sitting Presidents who have had this type of experience, and no other President that could have boasted such a successful outcome. 

So, to the people of the Media, before you criticize the President for taking such a cautious and reserved stance, keep in mind what is at stake here.  The minute the US is seen supporting any type of demonstration, the current regime can dismiss it as foreign intervention, and kill people without conscience.  But if it remains purely an Iranian event, the Iranians can decide for themselves if a regime change is necessary to bring true democracy to the country, or even if they really want a true democracy. 

June 22, 2009

=Utah Open Source=
Utah Open Source
Utah Open Source Blog
» News: Utah Open Source Conference 2009 Call for Papers NOW OPEN!

The Utah Open Source Conference 2009 is just around the corner, October 8-10, 2009 is not too far away!!  It’s time to submit your presentations. UTOSC 2008 received over 90 submissions, and we ended up with over 50 presentations.  The odds are good that if your presentation is a good open source topic, it will get selected.

The Call for Papers for UTOSC 2009 is officially open! Paper submission deadline is August 15, 2009 at Midnight, just under 2 months prior to UTOSC 2009, October 8-10 2009.

This year, we’ve enabled a few new features to conman, our paper submission system.  First off, everyone can see all of the abstracts which have been submitted, which includes a new RSS Feed for watching new submissions.  Also, about 1 month before selections are made (about 2 months before UTOSC 2009), we’ll open voting to any registered attendees, speakers, volunteers, etc.  We̵