<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>sudo life</title>
	
	<link>http://blog.sudolife.org</link>
	<description>The psuedolife of Josh Charles</description>
	<lastBuildDate>Thu, 26 Apr 2012 03:54:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/sudolife" /><feedburner:info uri="sudolife" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Grease released</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/QZn_ASnMidk/</link>
		<comments>http://blog.sudolife.org/2012/04/25/grease-released/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 03:54:01 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Grease]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=510</guid>
		<description><![CDATA[It&#8217;s been a year and a half since I&#8217;ve mentioned it here, but I&#8217;ve just made a general release of Grease. As you can see, it now comes with it&#8217;s own nifty website. In the next few weeks, I hope to release a Chocolatey package for it as well. I&#8217;m going to wait until Google [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been <a href="http://blog.sudolife.org/2010/08/28/introducing-grease/">a year and a half</a> since I&#8217;ve mentioned it here, but I&#8217;ve just made a general release of <a href="http://sudolife.org/Grease/">Grease</a>.  As you can see, it now comes with it&#8217;s own nifty website.  In the next few weeks, I hope to release a <a href="http://chocolatey.org/">Chocolatey</a> package for it as well.  I&#8217;m going to wait until Google stops saying this site distributes malware before I release that, though.  (As a side note: aren&#8217;t the google webmaster tools awesome?)</p>
<p>This release has been a long time coming.  There hasn&#8217;t been a lot of development on the software, but it hasn&#8217;t needed it.  I&#8217;ve made a few performance tweaks, and there are a few more things I have in mind that should help the app start faster.  I&#8217;ll probable be posting on those as I get them implemented.</p>
<p>I did have to go through philosophical transition.  Grease has always been created to be simple.  When I first started writing it, I did so with the specific purpose of not introducing features that I didn&#8217;t need and would just create bloat.  I think I&#8217;ve achieved exactly what I was looking for.  A few months ago, though, I received a pull request from someone on <a href="http://github.com/charlesj/Grease">github</a>.  They had added a number of things, like the ability to change from random to ordered, and had made a few UI tweaks.  I accepted the pull request, but when using the app, discovered that it really had lost what I was aiming for.  Tonight I removed those additions and returned the project to it&#8217;s original aims.  In the future, I will probably only be aiming for performance tweaks, especially when dealing with large libraries.</p>
<p>If this kind of app interests you and you find it useful, please let me know!  You can reach me on twitter @charlesj.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/QZn_ASnMidk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2012/04/25/grease-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2012/04/25/grease-released/</feedburner:origLink></item>
		<item>
		<title>Adventures in building better Authorizations</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/2mIIObHQf8I/</link>
		<comments>http://blog.sudolife.org/2012/02/13/adventures-in-building-better-authorizations/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 17:13:16 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=495</guid>
		<description><![CDATA[Warning: This post contains ugly code and half-ideas. The problem I have a confession.  I&#8217;ve never used the built in ASP.NET Membership framework.  Early on, it was a pain trying to figure out how to get it integrated with your own database, and later on, I was so used to rolling my own that I [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Warning</strong>: This post contains ugly code and half-ideas.</p>
<h3>The problem</h3>
<p>I have a confession.  I&#8217;ve never used the built in ASP.NET Membership framework.  Early on, it was a pain trying to figure out how to get it integrated with your own database, and later on, I was so used to rolling my own that I didn&#8217;t worry about it.  A little more than a year ago, though, I realized this was pretty foolish, so I decided to take another look at it.</p>
<p>Unfortunately, what I found didn&#8217;t suite me.  It may work for some applications, but not for what I&#8217;m building.  I needed something with some finer control.  Here are a few things I wanted that it didn&#8217;t have:</p>
<ol>
<li>Ability to combine webforms and windows authentication (some users from each)</li>
<li>Ability to store passwords using the bcrypt hashing algorithm (for future safety).</li>
<li>Finely tuned permissions that only give access to a subset of resources in a resource type.</li>
</ol>
<p>The last one is especially important.  On the basic applications you see in demos, it&#8217;s not important at all.  If you have a blog, most people have read access, few people have write access.  For blog demos, users that have read-write access to only a subset of blog posts doesn&#8217;t come up very often.  But this is a very common issue in every single web app I&#8217;ve ever developed.   Having an &#8220;EditBlogEntry&#8221; role doesn&#8217;t cut it.  That role needs to be able to check to make sure that some user can edit a specific blog entry.</p>
<p>Recently, I&#8217;ve set out to tackle that problem.</p>
<h3>What I&#8217;m working on</h3>
<p>It became apparent to me pretty quickly that to get something like this to work, each role would need to be able to execute some unique code to be able to run the logic to insure that a user can access what they&#8217;re trying to access.  I would call these &#8220;Permissions.&#8221;  Permissions would eventually be able to be assigned to both individual users and groups of users, but to begin with, to keep it simple, only users.</p>
<p>Here are some of the requirements:</p>
<ol>
<li>Users (and groups) can have many permissions (many-t0-many in the db)</li>
<li>Permissions will have unique  checking code for each one (therefore, each permission is a different class).</li>
<li>A filter will be per-controller or per-method (in MVC) and will know which permission that method or controller requires (it will be a string, most likely).</li>
<li>The filter will create an instance of the permission, pass in the values needed and then execute some function to find out if the user is authorized.</li>
</ol>
<p>I started writing some code.  One issue I realized right away: EF expects one table per class.  With each permission being a different class, and wanting an arbitrary number of classes, this would be a problem.  Instead, I would make all permissions inherit from an interface and store only certain information from the class in the database.</p>
<p>Currently, here is the website permission:</p>
<p><script type="text/javascript" src="https://gist.github.com/1818225.js">// <![CDATA[</p>
<p>// ]]&gt;</script></p>
<p>When the applications starts up, it reflects over itself to find all classes that implement IWebsitePermission, and it inserts a record into the Permissions Database (if it doesn&#8217;t already exist) for that permission. The database stores the Permission Name, Option, Whether it has an option, description, and System.Type.</p>
<p>To give you an idea how this permission is implemented, here is a partial implementation that checks to see if a user can edit a specific webpage:</p>
<p><script src="https://gist.github.com/1818311.js"> </script><br />
&nbsp;</p>
<p>Okay, there is a lot of bad code in this file. Ini my defense, for now I&#8217;m just trying to get this idea to work. Then I&#8217;ll work on fixing the rest.  Above all, the entity framework code in the snippet should be outlawed.  And there&#8217;s no exception checking!</p>
<p>So far, I&#8217;m pleased with how this method is turning out.  It seems like I&#8217;m on the right path, but I&#8217;ve got some major architectural issues:</p>
<ol>
<li>Where should the permissions be hosted?  In the Models namespace?  In the Website namespace?</li>
<li>Is there a better way to pass in the request information and logged in user information?</li>
<li>How is the best way to break up permission access?  Does there need to be a permission for add/edit/delete, and every sub modication (e.g. add version to webpage)</li>
</ol>
<p>I have a long ways to go here, but this idea has been floating in my head for a few years now, so it&#8217;s nice to start making some real progress.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/2mIIObHQf8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2012/02/13/adventures-in-building-better-authorizations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2012/02/13/adventures-in-building-better-authorizations/</feedburner:origLink></item>
		<item>
		<title>A Summer of Awesome</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/YX01wuHmdDE/</link>
		<comments>http://blog.sudolife.org/2011/06/08/a-summer-of-awesome/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 14:18:52 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[education]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=473</guid>
		<description><![CDATA[This summer is shaping up to be really great.  I have two major trips planned.  The first is next week to Madison, Wi, for the Games+Learning+Society conference.  This will be my first major academic conference and I couldn&#8217;t be more excited.  One of the themes for my summer is gamifying education, a topic that apparently [...]]]></description>
			<content:encoded><![CDATA[<p>This summer is shaping up to be really great.  I have two major trips planned.  The first is next week to Madison, Wi, for the <a href="http://www.glsconference.org/2011/">Games+Learning+Society</a> conference.  This will be my first major academic conference and I couldn&#8217;t be more excited.  One of <a href="http://www.escapistmagazine.com/videos/view/extra-credits/3167-Gamifying-Education">the themes</a> for my summer is <a href="http://www.gamifyingeducation.org/">gamifying education</a>, a topic that apparently will receive some <a href="http://www.glsconference.org/2011/program/event/249">staunch criticism</a> from a giant in the field.  I am going to be very interested in what Dr. Gee has to say.</p>
<p>This trip is also going to be great because the two people that really got me into this field are going to be there: <a href="http://website.education.wisc.edu/steinkuehler/blog/">Constance Steinkuehler</a> and <a href="http://se4n.org/">Sean Duncan</a>.  Their 2008 paper &#8220;<a href="http://website.education.wisc.edu/steinkuehler/papers/SteinkuehlerDuncan2008.pdf">Scientific Habits of Mind in Virtual Worlds</a>&#8221; [PDF] was posted to reddit (or somewhere I happened to stumble upon) pre-press and it <a href="http://blog.sudolife.org/2009/03/26/paper-scientific-habits-of-mind-in-virtual-worlds/">opened a new world to me</a>.  Since then, I&#8217;ve earned my M.Ed., hope to start my Ph.D. soon, and I have no doubt that my career will be focused on this area.</p>
<p>My next major trip will be in July, as I head off to <a href="http://www.randi.org/amazingmeeting/">The Amazing Meeting</a>!  I know every year this conference is packed with awesomeness, but I can&#8217;t help but feel like this year is the best yet.  Just take a look at their list of <a href="http://www.amazingmeeting.com/speakers">speaker</a>s.  It&#8217;s going to be my first time to Vegas, and I&#8217;m kind of skeptical that it&#8217;s all that great for someone like me.</p>
<p>I have a few big projects I&#8217;m working on this summer.  I&#8217;m not ready to talk about <a href="https://github.com/charlesj/Democritus">Democritus</a> in depth, yet, especially without hearing the criticism I will hear next week, but I am excited about it so far.  My gut tells me that this is something that is really needed and will be huge, but I also realize that I must be skeptical of my gut, as it tends to be wrong.  I will go ahead and offer a short explanation of the project.</p>
<p>Democritus is a next-generation Learning Management System that includes social networking and game mechanics as core features.  On the technical side, it is an HTML 5, with no java / flash / other third party plugins.  I&#8217;ve said for years that BlackBoard is crap, so I&#8217;m finally doing something about it.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/YX01wuHmdDE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2011/06/08/a-summer-of-awesome/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2011/06/08/a-summer-of-awesome/</feedburner:origLink></item>
		<item>
		<title>Is it plagiarism if a robot created it?</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/qhlbGjUbWCc/</link>
		<comments>http://blog.sudolife.org/2011/04/26/is-it-plagiarism-if-a-robot-created-it/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 15:15:56 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[education]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=470</guid>
		<description><![CDATA[I&#8217;m in the process of grading the final exam I give for my class.  Included in the exam is a question I wrote that was meant to demonstrate their understanding of plagiarism.  Here is the question: Suppose 30 years from now you receive a paper from one of your students of such quality you suspect [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the process of grading the final exam I give for my class.  Included in the exam is a question I wrote that was meant to demonstrate their understanding of plagiarism.  Here is the question:</p>
<blockquote><p>Suppose 30 years from now you receive a paper from one of your students of such quality you suspect they didn&#8217;t actually write it.  When confronted, they admit that they had their robot &#8220;Curtis&#8221; write it for them.  They argue that since it wasn&#8217;t another person who wrote it for them, it&#8217;s not plagiarism.  Do you accept their paper?  Justify your answer.</p></blockquote>
<p>As I&#8217;m grading, I was noticing a disturbing tendency to agree with the student.  Finally, one of my students&#8217; answered in a way that really demonstrated what their thinking was, and it came down to the way they defined plagiarism.  If they defined it as &#8216;taking work not your own and claiming that you created it&#8217; they denied the paper.  If they defined plagiarism as &#8216;taking another person&#8217;s work and claiming it as your own&#8217; then they would agree that the student was correct that it&#8217;s not plagiarism, but wouldn&#8217;t accept the paper.</p>
<p>So in the end, it really hedged on the presence of &#8220;person&#8221; in the definition.  They don&#8217;t imagine robots fitting the description of &#8216;person&#8217; so it wouldn&#8217;t be plagiarism, as long as their definition of plagiarism included the word &#8216;person&#8217; in it.  I just find that incredibly interesting.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/qhlbGjUbWCc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2011/04/26/is-it-plagiarism-if-a-robot-created-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2011/04/26/is-it-plagiarism-if-a-robot-created-it/</feedburner:origLink></item>
		<item>
		<title>Skepticon Reflections</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/66t9gfTDhLk/</link>
		<comments>http://blog.sudolife.org/2010/11/24/skepticon-reflections/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 16:32:22 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Atheism]]></category>
		<category><![CDATA[Science]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[skepticism]]></category>
		<category><![CDATA[skepticon]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=374</guid>
		<description><![CDATA[Last weekend, I once again attended Skepticon in Springfield, MO.  I would link to the website, but it&#8217;s apparently expired sometime in the last few days.  This was a the third year the conference has been held, and it&#8217;s been bigger every year.  The first year, it was just Carrier and PZ, who were great.  [...]]]></description>
			<content:encoded><![CDATA[<p>Last weekend, I once again attended Skepticon in Springfield, MO.  I would link to the website, but it&#8217;s apparently expired sometime in the last few days.  This was a the third year the conference has been held, and it&#8217;s been bigger every year.  The first year, it was just Carrier and PZ, who were great.  Last year, it expanded to two days, and this year it was three.  I really hope it continues to grow, as it&#8217;s really nice to be able to spend some time around like-minded individuals.</p>
<p>That said, the conference had one major problem this year: it allowed itself to be defined by some criticism that occurred before the conference started by someone who wasn&#8217;t even attending.  The criticism was that the conference would have been better named &#8220;atheistcon&#8221; instead of &#8220;Skepticon.&#8221;  I really think this criticism is pretty ridiculous, so I&#8217;m not going to spend time talking about it here, especially after hearing so many people talk about it at the conference, especially DJ Grothe and Randi.  They both seemed very defensive to me and I didn&#8217;t understand it at all.</p>
<p>Phrases like &#8220;atheism is skepticism about only one thing&#8221; and &#8220;I&#8217;m an atheist because there is no evidence&#8221; were hammered on so much, I just wanted to yell &#8220;get on with it.&#8221;  I mean, it&#8217;s 2010, is this really an issue?  Was this actually unclear to anyone?  Never-the-less there were some really good points made, and it was great to hear Randi in person.</p>
<p>DJ Grothe made a really good point that I had to applaud.  He said that he would rather hang out with someone who is skeptical about everything but god than someone who is skeptical about only god.  Examples given were Bill Maher, who is a prominent atheist, but pushes some really bone-headed ideas, compared to Martin Gardner, who was very skeptical, but believed in a deist god never-the-less.  I couldn&#8217;t agree with this sentiment more.  I&#8217;ve stopped going to some of the local skeptical meetups because they are populated with people whose only concern is religion and have really strange ideas about other things.</p>
<p>Don&#8217;t get me wrong, Religion is an important topic to discuss and be skeptical of, but listening to atheists who believe the crap about vaccines and autism, or push Zeitgeist as a good source for information is not my idea of fun.  I&#8217;m not going to accept atheism as &#8216;good enough.&#8217;  The end goal is skepticism.</p>
<p>There were several speakers at the conference I had never heard of before.  The best speaker at the conference was <a href="http://johncorvino.com/">John Corivino</a>, a philosophy professor, gay rights activist and skeptic.  It&#8217;s safe to say that I&#8217;m now a fan, and I hope to get more opportunities to hear him speak.  His best trait?  The ability to effectively explain and communicate nuance.</p>
<p><a href="http://davefitzgerald.blogspot.com/">David Fitzgerald</a> was someone else who I hadn&#8217;t really heard of before.  He gave a talk on the historicity of Jesus which was very good.  He has a book out called &#8220;<a href="http://www.amazon.com/Nailed-Christian-Myths-Jesus-Existed/dp/0557709911">Nailed: Ten Christian Myths that show Jesus never existed at all</a>.&#8221;  After hearing his talk, it&#8217;s definitely on my wishlist.  The historicity of Jesus is a topic that&#8217;s very interesting to me, even though it has a reputation of being somewhat &#8216;out there.&#8217;   In the last decade or so, it looks like the scholarly case for a mythical Jesus has really been put together, though, and can hold up to criticism.  I would go so far as to even call it compelling.</p>
<p>Other new speakers included Debbie Goddard, <a href="http://www.pandagon.net/">Amanda Marcotte</a>, and <a href="http://gretachristina.typepad.com/">Greta Christina</a>.  These talks were all very good, though I don&#8217;t have much to say about them.  Marcotte&#8217;s presentation on Skepticism and Feminism was very good to hear.  I haven&#8217;t paid much attention to feminism; it just isn&#8217;t something that I&#8217;ve been interested in, but after hearing her talk, I think it&#8217;s something I should be interested in.  It&#8217;s important, and I should learn more.</p>
<p>I did have an interesting conversation with a Christian who stopped to witness to me in the hotel.  It was very cordial, even though his accusations of &#8220;you never really were a real christian&#8221; irked me.  Who is he to say that?  I didn&#8217;t go that route, though, and I think we had a pretty good conversation.  I was helped by the fact that he had a background in psychology, so I was able to bring up our cognitive biases when he started talking about &#8216;evidence&#8217; for god.  He didn&#8217;t really have a reply to that, and kept complaining about superficial christians.  I don&#8217;t think either mind changed at all, but these are the conversations we need to be having.</p>
<p>Overall, the conference was great.  We had some of Ray Comfort&#8217;s people outside handing out copies of their annotated Origin of Species, and there was a gun show right next door.  Other than the expected &#8220;you&#8217;re going to hell&#8221; accusations, everything was very civil.  I can&#8217;t wait to attend again next year.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/66t9gfTDhLk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/11/24/skepticon-reflections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/11/24/skepticon-reflections/</feedburner:origLink></item>
		<item>
		<title>Using Ruby to Manage Sql Server db creation</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/NONzHBJh3N0/</link>
		<comments>http://blog.sudolife.org/2010/09/08/using-ruby-to-manage-sql-server-db-creation/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 19:24:36 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Albacore]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sequel]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=367</guid>
		<description><![CDATA[One of the things I hate about programming is dealing with the database. There are just so many things about it that cause more pain than pleasure.  The rise of ORM&#8217;s has gone a long way in making that better, but we still have a ways to go. One of the problems with developing against [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I hate about programming is dealing with the database. There are just so many things about it that cause more pain than pleasure.  The rise of ORM&#8217;s has gone a long way in making that better, but we still have a ways to go.</p>
<p>One of the problems with developing against databases is that unless you go out of your way, there it&#8217;s difficult to include in your source version control repository.  The &#8220;best&#8221; way in the .NET world has been generating your sql server creation scripts and go from there.  I didn&#8217;t feel like this was a good solution, though, especially since the code that is generated utilizes a lot of SQL that I don&#8217;t understand, nor have any desire to learn.  So I set about trying to find a better way.</p>
<p>The first constraints I decided upon were pretty simple:</p>
<ol>
<li>There needs to be a way to include the database schema in a text file that can be versioned with the rest of the code.</li>
<li>The text file should be able to be transformed into a database (i.e. executable).</li>
<li>I should be able to insert base data into the system.  For example, if I want to populate a Settings table with some default values.</li>
<li>It would be able to completely reset the database to a pristine state.</li>
</ol>
<p>Being a previous Rails developer, active_record migrations jump to mind, but I ran into problems pretty quickly.  As it turns out, active_record doesn&#8217;t respect foreign keys, which is what the Entity Framework uses to find relationships.  Active_record was a no go.  I decided to stay in the ruby world, though, and check out what else they had for me.  After some searching, I found <a href="http://sequel.rubyforge.org/">Sequel</a>.  So far, it&#8217;s worked pretty well.</p>
<p>I decided not to go the migrations route, because that didn&#8217;t seem to really fit my development pattern.  Instead, I&#8217;m generating the entire database at once.  This may turn out to be the wrong decision.  Currently,<a href="http://gist.github.com/570661"> here is where I&#8221;m at</a>:</p>
<p><script src="http://gist.github.com/570661.js?file=Current.rb"></script></p>
<p>There are quite a few problems with this code, but it&#8217;s got me on a path I&#8217;m feeling pretty good about.  Since it&#8217;s all in ruby, this means I can easily integrate it with <a href="http://albacorebuild.net/">Albacore</a> build system (for .NET).</p>
<p>Okay, so this is pretty standard stuff in the ruby world.  So how well does this fit in with the Entity Framework?  Pretty well so far.  I can run that script above and then right-click and choose &#8220;Update Models&#8221; from Visual Studio.  The models are updated, and I&#8217;m ready to go.</p>
<p>I&#8217;m going to continue working on this, but I am really starting to feel like I&#8217;m on the right track here.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/NONzHBJh3N0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/09/08/using-ruby-to-manage-sql-server-db-creation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/09/08/using-ruby-to-manage-sql-server-db-creation/</feedburner:origLink></item>
		<item>
		<title>Introducing Grease</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/6iMR_waWr7c/</link>
		<comments>http://blog.sudolife.org/2010/08/28/introducing-grease/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 21:55:33 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Grease]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[wpf]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=358</guid>
		<description><![CDATA[Something that has really bothered me about software music players out there is just how poor their performance is.  Whether it&#8217;s iTunes or Songbird or even Foobar, it seems like I would wait forever for them to start up and run through all the things they need to do.  So I decided to do something [...]]]></description>
			<content:encoded><![CDATA[<p>Something that has really bothered me about software music players out there is just how poor their performance is.  Whether it&#8217;s iTunes or Songbird or even Foobar, it seems like I would wait forever for them to start up and run through all the things they need to do.  So I decided to do something about it.  I built my own music player that I&#8217;ve been calling &#8220;Grease&#8221;.</p>
<p>As I was thinking about this, I thought about how exactly I use these mp3 players.  Usually, I just pull them up and have them play random songs from my library.<br /> <a href="http://blog.sudolife.org/wp-content/uploads/2010/08/Grease.png"><img class="alignright size-full wp-image-360" title="Grease" src="http://blog.sudolife.org/wp-content/uploads/2010/08/Grease.png" alt="" width="295" height="130" /></a><br /> I decided that this is *all* Grease would do.  Embracing the Unix philosophy of &#8220;Do one thing well&#8221; as inspired by <a href="http://onethingwell.org/">onethingwell</a> I set to work.</p>
<p>After a few hours,  I had something I was able to start using personally, and after some polish, it&#8217;s ready for it&#8217;s first general release.  I&#8217;m calling this somewhere between &#8220;Alpha&#8221; and &#8220;Beta&#8221; quality.  There are still some issues, but I thought I would release it to see what the response is.</p>
<p>How to use Grease:</p>
<ol>
<li>Click on the folder to select a folder full of mp3&#8242;s.</li>
<li>Grease recursively walks through that directory finding any MP3&#8242;s (and m4a&#8217;s).</li>
<li>Click play, and enjoy.</li>
</ol>
<p>It will remember your directory, so you don&#8217;t need to select it every time.  It will load up your music files on startup the next time you open Grease.</p>
<p>I definitely wanted keyboard short cuts, so here they are:</p>
<p>Space-bar: Play toggle<br /> Left arrow: go back a song<br /> Right Arrow: skip to the next song<br /> Down arrow: volume down.<br /> Up arrow: volume up.</p>
<p>That&#8217;s all there is to it.  It&#8217;s a WPF application, and I&#8217;ve only tested it on Windows 7.  If you try it out, please let me know what you think!</p>
<p>It doesn&#8217;t require installation.  You can just unzip the binaries and run them.  The source code is on github if you&#8217;re interested in that.</p>
<p>Grease: <a href="http://github.com/charlesj/Grease">Source Code</a> | <a href="http://sudolife.org/Grease.zip">Binary Zip</a></p>
<p><strong>EDIT</strong>: I have discovered a bug where keyboard short cuts don&#8217;t work after clicking the folder icon.  I&#8217;m not sure why this is, but if you restart the application, the shortcuts will once again work.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/6iMR_waWr7c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/08/28/introducing-grease/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/08/28/introducing-grease/</feedburner:origLink></item>
		<item>
		<title>Team Fortress 2 Manual Launched</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/-py38spn5BI/</link>
		<comments>http://blog.sudolife.org/2010/06/18/team-fortress-2-manual-launched/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 14:15:36 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[gaming]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[teamfortress]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=355</guid>
		<description><![CDATA[Well, the manual I&#8217;ve been working on with the Reddit Community for Team Fortress 2 has been launched: The Missing Team Fortress 2 Manual I&#8217;m happy to report we&#8217;ve seen a great response, which has been almost completely positive.  We&#8217;re not launching version 1.0 until after the big engineer update, but I&#8217;m very pleased with [...]]]></description>
			<content:encoded><![CDATA[<p>Well, the <a href="http://tf2manual.com/">manual</a> I&#8217;ve been working on with the<a href="http://reddit.com/"> Reddit</a> <a href="http://reddit.com/r/tf2">Community</a> for <a href="http://teamfortress.com/">Team Fortress 2</a> has been launched:</p>
<p><a href="http://tf2manual.net/">The Missing Team Fortress 2 Manual</a></p>
<p>I&#8217;m happy to report we&#8217;ve seen a great response, which has been almost completely positive.  We&#8217;re not launching version 1.0 until after the big engineer update, but I&#8217;m very pleased with how it&#8217;s turned out so far.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/-py38spn5BI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/06/18/team-fortress-2-manual-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/06/18/team-fortress-2-manual-launched/</feedburner:origLink></item>
		<item>
		<title>Productive Collaboration: Team Fortress 2 Manual</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/NdM7liWOiDU/</link>
		<comments>http://blog.sudolife.org/2010/05/18/productive-collaboration-team-fortress-2-manual/#comments</comments>
		<pubDate>Tue, 18 May 2010 15:24:48 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[education]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=349</guid>
		<description><![CDATA[One of the coolest games I&#8217;ve ever played is Team Fortress 2.   While it&#8217;s tons of fun to play, one issue with it is that it doesn&#8217;t come with a manual.  Just over a week ago, reddit user &#8216;lolard&#8217; posted this to the new to tf2 subreddit, asking us to solve this problem.  The reddit [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picasaweb.google.com/lh/photo/DYO2m2z_thuo9BXg4rMDjw?feat=directlink"><img class="alignright" title="My Copy of the manual (Artificially Aged)" src="http://lh6.ggpht.com/_v70v8FcrLsM/S_KaWcWu23I/AAAAAAAAAzw/OSlKbsjQSIg/s576/P5170035.JPG" alt="Something" width="205" height="274" /></a>One of the coolest games I&#8217;ve ever played is <a href="http://teamfortress.com/">Team Fortress 2</a>.   While it&#8217;s tons of fun to play, one issue with it is that it doesn&#8217;t come with a manual.  Just over a week ago, reddit user &#8216;lolard&#8217; <a href="http://www.reddit.com/r/NewToTF2/comments/c2hzb/collaboration_idea_lets_create_the_missing_tf2/">posted this</a> to the new to tf2 subreddit, asking us to solve this problem.  The reddit community responded.  We fired up an etherpad clone and got to work.  Here&#8217;s what we accomplished:</p>
<ul>
<li>In less than 24 hours, we had written nearly 8,000 words.</li>
<li>Today, we&#8217;re close 13,000 words.</li>
<li>More than 50 people have contributed in some way.</li>
<li>28 people have contributed substantially.</li>
<li>Gone through at least two major transitions in the style of writing: from 2nd person to third person, and from the voice being used.</li>
<li>4 different websites (3 etherpad clones and <a href="http://crocodoc.com">crocodoc.com</a>)</li>
<li>My copy of the manual is 56 pages long, formatted.</li>
<li>There is now a website: <a href="http://teamfortress.com/">http://tf2manual.net</a>/</li>
<li>We were flexible enough to neutralize trolls who deleted all our work.</li>
</ul>
<p>The list can go on.  The message is clear: this has been a massive collaborative work that has produced something amazing in a very short amount of time.  I&#8217;ve been involved throughout the whole process, stepping up soon after lolard made the first post.  From this perspective, I&#8217;ve learned several things.</p>
<ol>
<li>The future is live collaboration at the level etherpad (and it&#8217;s clones) tried to provide.  Wiki&#8217;s are last generation technology that only slow things down.</li>
<li>None of the etherpad clones were able to fully function at our level of collaboration, including the new Google Documents.  We used ietherpad, openetherpad, sync.in, and I privately tested Google Documents.  All of them experienced difficulties dealing with both the number of collaborators and the size of the document.  Sync.in functioned the best of the bunch.</li>
<li>Crocodoc is awesome, but does not scale up to groups of more than 2-3, especially for a 50 page document.  It&#8217;s flash driven, and was extremely slow.  It claims to be &#8216;live&#8217; in the sense of etherpad, but it really isn&#8217;t at the levels we were using it.  I had to refresh the page to make sure I was viewing all of the changes.</li>
<li>Do <em><strong>not</strong></em> use the time slider on any of the etherpad clones.  This basically made the document useless for <em>everyone</em> over the next 20 minutes as the website did who knows what.  This feature worked great in the original etherpad, so I&#8217;m not sure why these clones have trouble with it.  Even sync.in had this trouble.</li>
</ol>
<p>I can&#8217;t emphasize enough how much this changed my view of collaboration.  This has been collaboration how it&#8217;s supposed to be done.  While reflecting upon this experience, I&#8217;ve identified several reasons I think this went so well.</p>
<ol>
<li>We&#8217;re passionate about the subject.  Of course this is important and must appear on the list.</li>
<li>We&#8217;re passionate about the community.  This is not necessarily an extension of the first point.</li>
<li>There was no barrier of entry.  Once the pad was created, we could simply spread the URL around, and once people arrived on that page, they could start editing.  There was no registration, no waiting.  They could immediately jump in and start writing.  This was true for all the etherpad clones as well as crocodoc, and I applaud all of those websites for that.</li>
<li>The latest work was immediately available, down to the keystroke.  We could see exactly what others were typing as they were typing it.  Corrections could be done within seconds, and they were not always done by the person who made the mistake.</li>
<li>Version control was transparent.  We didn&#8217;t have to think about keeping track of a history; the application did it for us.  Hypothetically, we could even playback that entire history as it played out, but that feature was broken on every website we tried.</li>
</ol>
<p>The biggest theme is that while we were all very good with technology, the technology was completely transparent.  We didn&#8217;t have to think about it (except when it broke, like with the time slider).  We just focused on what we were trying to do, and then we did it.</p>
<p>It&#8217;s been an amazing experience so far, and while this project is far from over, our parts are winding down.  Soon, we&#8217;ll have a nice manual for team fortress 2 users to go with all this valuable experience we&#8217;ve gained.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/NdM7liWOiDU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/05/18/productive-collaboration-team-fortress-2-manual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/05/18/productive-collaboration-team-fortress-2-manual/</feedburner:origLink></item>
		<item>
		<title>Fun Times with Remote Desktop</title>
		<link>http://feedproxy.google.com/~r/sudolife/~3/-D2Be9sWNps/</link>
		<comments>http://blog.sudolife.org/2010/04/16/fun-times-with-remote-desktop/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:08:39 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[education]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Tablets]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://blog.sudolife.org/?p=347</guid>
		<description><![CDATA[The iPad has been making a splash in the gadget world, and I&#8217;ve been strongly tempted more than once to go ahead and purchase one.  For now, though, I&#8217;ve been able to resist, and I am hoping to hold out for a Notion Ink Adam.  Pixel Qi screen, Rotatable Camera capable of recording HD, HDMI [...]]]></description>
			<content:encoded><![CDATA[<p>The iPad has been making a splash in the gadget world, and I&#8217;ve been strongly tempted more than once to go ahead and purchase one.  For now, though, I&#8217;ve been able to resist, and I am hoping to hold out for a <a href="http://www.notionink.com/">Notion Ink Adam</a>.  Pixel Qi screen, Rotatable Camera capable of recording HD, HDMI out, Android with Multitouch?  I&#8217;m sold.  But this post isn&#8217;t about that.  It&#8217;s about one of the reasons I want a tablet so bad:  Being able to use it while teaching.</p>
<p>Currently there are a few tablets that are available for use in the classroom.  The problem is &#8220;Tablet&#8221; is used in a bit of a different sense.  The tablet I have available to me is the <a href="http://www.whiteboards-usa.com/smart/wireless-control/index.php">Airliner from Smartboard</a>.  This piece of hardware is truly a piece of crap.  Half the time it won&#8217;t connect to the computer, and when it does connect, the software fails to function correctly.  There is a better way to handle this type of functionality, and I think I&#8217;ve found one.</p>
<p>One issue with using a tablet like this is usability.  You&#8217;re controlling the computer through the tablet, but you can&#8217;t look at it.  It would be better if you could get a copy of the screen on the tablet itself.  Well, with these new tablet computers, it&#8217;s possible to do that.  You just need to setup a VNC server on the computer you want to connect to, and a VNC client on the tablet.</p>
<p>Well, I had the opportunity to borrow one of our faculty member&#8217;s iPads and go ahead and try this out.  There&#8217;s a lot of idiocy in this institution about network security and such, but I was able to finagle (to use a technical term) the server installation such that I didn&#8217;t have to go through IT to enable this functionality.  However, the iPad was having trouble connecting.  So I decided to use another computer in to test the connection.</p>
<p>I didn&#8217;t have a VNC client on any of the student machines available, but I did have one on my desktop computer upstairs. So I logged into one of the student machines, and used the Microsoft Remote desktop software to connect to my workstation.  Then I was able to use the VNC client on my workstation to remote into the instructor machine at the front of the classroom.  Everything worked perfectly.</p>
<p>Then I had a thought.  We run a piece of software called <a href="http://italc.sourceforge.net/">iTalc</a> that enables us to view the screen of any of the students computers.  This piece of software is amazing, and I use it constantly while teaching, for diagnosing student problems, letting students demo different things from their computer, and proctoring tests, among other things.</p>
<p>So I opened up iTalc to open up the screen of the student&#8217;s computer I was on.</p>
<p>The circle was complete.  I was remoting in a complete circle using three different pieces of technology on three different computers.  I got a nice looking mirror effect on my computer, but I was also able to close it all down easily.  Here&#8217;s the final picture:</p>
<ol>
<li>Student Machine -&gt; My Workstation (using RDP)</li>
<li>My Workstation -&gt; Instructor Machine (using VNC)</li>
<li>Instructor machine -&gt; Student Machine (using iTalc)</li>
<li>The student machine was already connected to my Workstation.</li>
</ol>
<p>Just a bit of fun.  Unfortunate the wireless bandwidth around here is so crappy the iPad was practically useless as a VNC client.  I&#8217;m going to have to figure out something else.</p>
<img src="http://feeds.feedburner.com/~r/sudolife/~4/-D2Be9sWNps" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.sudolife.org/2010/04/16/fun-times-with-remote-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.sudolife.org/2010/04/16/fun-times-with-remote-desktop/</feedburner:origLink></item>
	</channel>
</rss>

