<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Mental Masturbation, Musings, and Methods &#187; Programming</title>
	<atom:link href="http://blog.alexbeutel.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alexbeutel.com</link>
	<description>The Mind of Alex Beutel</description>
	<lastBuildDate>Mon, 02 Aug 2010 06:20:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Interactive Voronoi Diagrams with WebGL</title>
		<link>http://blog.alexbeutel.com/332/interactive-voronoi-diagrams-with-webgl/</link>
		<comments>http://blog.alexbeutel.com/332/interactive-voronoi-diagrams-with-webgl/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 06:20:49 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.alexbeutel.com/?p=332</guid>
		<description><![CDATA[Within computational geometry, the Voronoi diagram is a relatively simple concept with a wide-range of applications.  Everything from physics research to the &#8220;snap-to&#8221; feature in GUI-design uses Voronoi diagrams as a simple underlying data structure to decompose space. I have been working with Voronoi diagrams for the past few months, as my research has focused [...]]]></description>
			<content:encoded><![CDATA[<div style='padding-bottom: 8px;'>Within computational geometry, the <a href='http://en.wikipedia.org/wiki/Voronoi_diagram' target='_blank'>Voronoi diagram</a> is a relatively simple concept with a wide-range of applications.  Everything from physics research to the &#8220;snap-to&#8221; feature in GUI-design uses Voronoi diagrams as a simple underlying data structure to decompose space.  I have been working with Voronoi diagrams for the past few months, as my research has focused on interpolation, specifically scalable <a href='http://en.wikipedia.org/wiki/Natural_neighbor' target='_blank'>natural neighbor interpolation</a>.  Because the interpolation I have been doing (and the demo I have created) focuses on Voronoi diagrams in a plane, I will only discuss the Voronoi diagrams in 2D space.  However, the mathematical concepts can be extended to higher dimensions.</div>
<div style="padding-top: 10px; font-weight: bold;">If you already know all about Voronoi diagrams or simply don&#8217;t care about the math and just want to play, jump to <a href="#play">here</a> or go straight to <a href="http://alexbeutel.com/webgl/voronoi.html" target="_blank">my Voronoi diagram generator application</a>.</div>
<h3>The Voronoi Diagram</h3>
<div>
I would first like to briefly describe what precisely the Voronoi diagram is, along with how nearest neighbor and natural neighbor interpolation make use of this data structure.  The Voronoi diagram is the division of plane into discrete Voronoi cells.  Given a set of input points <em>S</em>, we would like to divide the plane such that for any given position in the plane, we know the nearest input point.  This is the nearest neighbor problem.  A Voronoi cell <em>Vor(p,S)</em> represents the region of the plane for which the given point <em>p</em> is the closest input point from the set of input points <em>S</em>.  Mathematically the Voronoi cell <em>Vor(p,S)</em> is defined as</p>
<div style='height: 60px; width: 430px; margin-left: auto; margin-right: auto; margin-top: -20px; padding-bottom: 5px;'><img src="/voronoi/Vps.png" title='Voronoi definition' /></div>
<p>In the Voronoi diagram below, we color each Voronoi cell with a unique color.  For the entire region covered by each cell, the input point within the cell is the closest point from the set of input points.  You can also easily observe that the boundaries between neighboring cells is the set of points equidistant between two nearby input points.</p>
<div style='width: 400px; margin-left: auto; margin-right: auto; padding-bottom: 10px; margin-top: -10px;'><img style='width: 400px;' src="/voronoi/basic-vor.png" title='Basic Voronoi diagram' /></div>
</div>
<h4>Interpolation with the Voronoi Diagram</h4>
<div style='padding-bottom: 8px;'>Given this understanding of the Voronoi diagram, we can easily answer a nearest neighbor query.  Given a point <em>q</em> at position <em>(x,y)</em> we need only check which Voronoi cell it is within to see which input point is closest to it.  Thus, if each input point also has some height <em>z</em> we could roughly interpolate the height of <em>q</em> by taking the height of its nearest neighbor.</div>
<div>A more complex interpolation scheme, known as natural neighbor interpolation, is to take a weighted average of all of the nearby input points.  This is done by inserting the query point into the Voronoi diagram and observing how much area the Voronoi cell of the query point steals from the neighboring Voronoi cells in the original Voronoi diagram.  Specifically, the fractional weight assigned to each natural neighbor is the area stolen from that nearest neighbor&#8217;s original Voronoi cell divided by the total area of the Voronoi cell of the query point.  Mathematically this interpolation can be defined as:</p>
<div style='height: 80px; width: 500px; margin-left: auto; margin-right: auto; margin-top: -20px; padding-bottom: 5px;' ><img src="/voronoi/nni.png" title='Natural neighbor interpolation definition' /></div>
<p>While more complicated than nearest neighbor interpolation, natural neighbor interpolation offers a higher quality interpolation and produces smooth results.
</p></div>
<h4>Approximating the Voronoi Diagram in OpenGL</h4>
<div style='padding-bottom: 8px;'>As explained briefly in the <a href="http://www.glprogramming.com/red/chapter14.html#name19" target="_blank">OpenGL Red Book</a>, we can compute the Voronoi diagram easily in OpenGL by rendering cones at each input point and using the depth buffer to figure out the boundaries between Voronoi cells.  Specifically, if we place a right angle cone with the apex at a point, the height of the cone at a given position is equal to the distance form the point in the <i>x,y</i> plane.  As such, if we place all the cones in the plane and look at them from below, we will only see the lowest cone at any given point and thus only the cone for which the point it represents is closest.  This is known as taking the lower envelope.  (For more information, you can read <a href="http://portal.acm.org/citation.cfm?id=311567" target="_blank">Hoff et. al.&#8217;s paper</a> on how this works.)</div>
<div style='padding-bottom: 8px;'>Therefore, by merely drawing the cones and placing the viewpoint appropriately within OpenGL, the framebuffer will store the Voronoi diagram.  Naturally, when doing computations with OpenGL, the diagram will be discretized into pixels.  Additionally, OpenGL can not draw cones, only triangles.  Therefore, we approximate a cone with a <em>f</em>-sided pyramid.  With a reasonably large value for <em>f</em>, we will not notice the effect of the discretization, but making <em>f</em> a small value like 4-10 can be interesting.  Both of these discretizations of course create some deviation from the previously defined Voronoi diagram.</div>
<div>I have used this method, implemented in <a href='https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/WebGL-spec.html' target='_blank'>WebGL</a>, the Javascript API to OpenGL, to create the following interactive Voronoi diagram generator.</div>
<h3><a name="play"></a>Enough Math</h3>
<div>While math is necessary to precisely describe these concepts, it is not always the best way to convey some of the nuances of the geometric behavior.  As a result, one night, both to play with WebGL and to better understand Voronoi diagrams, I implemented some of these concepts in the browser.  Below is a short screencast of me playing with the tool, which may be useful if either you don&#8217;t have a WebGL-enabled browser or you want to learn some of the features of tool; or just <a href="http://alexbeutel.com/webgl/voronoi.html" style='font-weight: bold;'>play with it for yourself</a>.</div>
<div style='padding-bottom: 10px; padding-top: 10px;'>
<object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/Aljbw9PQlck&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Aljbw9PQlck&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object>
</div>
<h3>On Code</h3>
<div style='padding-bottom: 8px;'>
Not much to say here.  To make this small application, I used two canvases overlaid, one with WebGL and one with just the 2D-context.  This allowed me to draw over the Voronoi diagram (such as the points).  Following the <a href='' target='_blank'>learningwebgl.com</a> tutorials, I used the <a href='http://sylvester.jcoglan.com/' target='_blank'>Sylvester library</a> for Matrix math as well as the glUtils library from the tutorials.
</div>
<div>
WebGL is still a little buggy and memory management can be an issue, among other things.  But overall, it samples a good portion of OpenGL.  Unfortunately, getting started can take a little effort.  For example, unlike OpenGL in C++, you <i>must</i> write your own shader programs; I suggest using samples from <a href='http://learningwebgl.com/blog/?page_id=1217' target='_blank'>learningwebgl.com</a> at least to get started.  However, once you have a functioning WebGL canvas, it is easy to pick up speed.  I also went slightly overboard on the movement functions, but it was a good chance to play with Javascript closures.
</div>
<h3>Some cool Voronoi diagrams</h3>
<div>And finally, here are some Voronoi diagrams I have generated that I find interesting, cool, or merely pretty.</div>
<div style='padding-bottom: 20px;'>
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/ih-kcHYciSo&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ih-kcHYciSo&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</div>
<div style='padding-bottom: 10px;'>Similar kinetic Voronoi diagram but with only 6-sided pyramids used.</div>
<div style='padding-bottom: 20px;'>
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/C2OGI1cevm8&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/C2OGI1cevm8&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</div>
<div style='padding-bottom: 8px;' >Below, the same set of input points are plotted with two different types of cones.  The first uses a 50-sided pyramid.  The second only uses 6-sided pyramids, creating the jagged effect between neigboring Voronoi cells.</div>
<div style='padding-bottom: 20px;'><img src='/voronoi/v4.png' style='float: left; width: 49%; padding-right: 10px;' /><img src='/voronoi/v3.png' style='float: left; width: 49%;' /></div>
<div style='clear: both; width: 100%; height: 2px;'></div>
<div style='padding-bottom: 8px;' >The following two Voronoi diagrams show the Voronoi cells and area stolen for a natural neighbor query.</div>
<div style='padding-bottom: 20px; '><img src='/voronoi/v1.png'  style='width: 550px;' /></div>
<div style='padding-bottom: 15px;'><img src='/voronoi/v2.png' style='width: 550px;' /></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/332/interactive-voronoi-diagrams-with-webgl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CMake, OpenGL, and GLX on OS X</title>
		<link>http://blog.alexbeutel.com/285/cmake-opengl-and-glx-on-os-x/</link>
		<comments>http://blog.alexbeutel.com/285/cmake-opengl-and-glx-on-os-x/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 23:24:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=285</guid>
		<description><![CDATA[As you may know, I am staying at Duke this summer for research.  My research, which I started last semester and am going to be doing for a while, focuses on scalable algorithms.  While that is pretty broad, I am currently working on using the graphics card to speed up processing. Again, here are some [...]]]></description>
			<content:encoded><![CDATA[<p>As you may know, I am staying at Duke this summer for research.  My research, which I started last semester and am going to be doing for a while, focuses on scalable algorithms.  While that is pretty broad, I am currently working on using the graphics card to speed up processing.  Again, here are some technical notes on code.</p>
<p>In doing my work I have come to have to write and run C++ OpenGL code on both OS X and Ubuntu.  To make this easier, <a title="CMake" href="http://www.cmake.org/" target="_blank">CMake</a> has been great for both  having readable make files and for being able to keep the files consistent across both platforms.  Additionally, while <a href='http://www.opengl.org/resources/libraries/glut/' target='_blank'>GLUT</a> is great for cross-platform OpenGL coding, I needed more control over the environment.  Being able to run X11 on OS X has allowed me to test GLX natively without always testing on Linux.  However, to get this set up on OS X without XCode can be a little tricky.  So, two snippets of CMake files for using OpenGL on OS X and Linux.</p>
<p>If you want to run OpenGL with the standard OS X libraries, CMake generally finds the correct frameworks, but it can&#8217;t hurt to specify them more precisely.  A basic example of the CMakeLists is shown below:</p>
<pre>
IF(APPLE)
   INCLUDE_DIRECTORIES ( /System/Library/Frameworks )
   FIND_LIBRARY(COCOA_LIBRARY Cocoa)
   FIND_LIBRARY(GLUT_LIBRARY GLUT )
   FIND_LIBRARY(OpenGL_LIBRARY OpenGL )
   MARK_AS_ADVANCED (COCOA_LIBRARY
                     GLUT_LIBRARY
                     OpenGL_LIBRARY)
   SET(EXTRA_LIBS ${COCOA_LIBRARY} ${GLUT_LIBRARY} ${OpenGL_LIBRARY})
ENDIF (APPLE)
target_link_libraries(main ${EXTRA_LIBS})
</pre>
<p>With this, your C++ should have the following includes:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p285code3'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2853"><td class="code" id="p285code3"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;GLUT/glut.h&gt;</span>
<span style="color: #339900;">#include &lt;OpenGL/glext.h&gt;</span>
<span style="color: #339900;">#include &lt;OpenGL/gl.h&gt;</span>
<span style="color: #339900;">#include &lt;OpenGL/glu.h&gt;</span></pre></td></tr></table></div>

<p>If, however, you are looking to run your code also on a Linux machine or simply want to use <a title="GLX" href="http://www.google.com/search?hl=en&amp;q=glx+opengl" target="_blank">GLX</a> rather than <a title="CGL Reference" href="http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGL_OpenGL/Reference/reference.html" target="_blank">CGL</a>, you will need to have X11 installed (which your OS X installation disk contains) and specifically point CMake at the X11 libraries.  The CMake code for this is shown below:</p>
<pre>include_directories(/usr/X11R6/include/)
link_directories(/usr/X11R6/lib)
SET(EXTRA_LIBS GL X11 GLU glut)
target_link_libraries(main ${EXTRA_LIBS})
</pre>
<p>When using the X11 libraries, you must also change the includes as the folder structure for X11 is different than that natively for OS X:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p285code4'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2854"><td class="code" id="p285code4"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;GL/glew.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glut.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glext.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/gl.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glu.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glx.h&gt;</span></pre></td></tr></table></div>

<p>That is all.  Not terribly complicated, but hopefully this saves you some time if you are doing development with CMake, OpenGL, or X11.  Look for some new slightly more exciting posts soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/285/cmake-opengl-and-glx-on-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rankophilia and Rankophiliacs</title>
		<link>http://blog.alexbeutel.com/275/rankophilia-and-rankophiliacs/</link>
		<comments>http://blog.alexbeutel.com/275/rankophilia-and-rankophiliacs/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 03:24:26 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Duke]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=275</guid>
		<description><![CDATA[For my CPS 182S class, we have an assignment which is a competition among groups of students (and the professor) to have the highest ranking page on Google for the terms rankophilia and rankophiliac.  As such, I have created a page at rankophilia.dorm.duke.edu to be my group&#8217;s main page on Google. For now, there is [...]]]></description>
			<content:encoded><![CDATA[<p>For my CPS 182S class, we have an assignment which is a competition among groups of students (and the professor) to have the highest ranking page on Google for the terms rankophilia and rankophiliac.  As such, I have created a page at <a href='http://rankophilia.dorm.duke.edu/' target='_blank' title='rankophilia, rankophiliac, rankphilia, rankphiliac'>rankophilia.dorm.duke.edu</a> to be my group&#8217;s main page on Google.  For now, there is not much interesting on there, and I am merely posting it here in an attempt to increase the PageRank.  I am considering adding more interesting content and submitting it around online rather than just spamming.  I will post updates (probably at least a few for links) as the contest goes on.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/275/rankophilia-and-rankophiliacs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL Injection at Duke TechExpo 2009</title>
		<link>http://blog.alexbeutel.com/265/sql-injection-at-duke-techexpo-2009/</link>
		<comments>http://blog.alexbeutel.com/265/sql-injection-at-duke-techexpo-2009/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 19:56:07 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Duke]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=265</guid>
		<description><![CDATA[I gave my first public talk today at Duke&#8217;s TechExpo 2009. I along with my coworker Artem Kazantsev discussed the risks of SQL Injection. The presentation gives a good overview of the capabilities of SQL injection along with how to prevent such vulnerabilities. I also gave a demo of performing a SQL injection attack on [...]]]></description>
			<content:encoded><![CDATA[<p>I gave my first public talk today at <a href="http://techexpo.oit.duke.edu/" target="_blank">Duke&#8217;s TechExpo 2009</a>.  I along with my coworker Artem Kazantsev discussed the risks of SQL Injection.  The presentation gives a good overview of the capabilities of SQL injection along with how to prevent such vulnerabilities.  I also gave a demo of performing a SQL injection attack on a vulnerable site during the talk.  For any web programmers who aren&#8217;t familiar with SQL injection, take a look at the code for the demo to see exactly how and why it is vulnerable, along with how to fix these vulnerabilities.</p>
<p><a href="http://ambmediadesign.com/SQLInjection.pdf">SQL Injection Presentation</a></p>
<p><a href="http://ambmediadesign.com/SQLInjectionDemo.zip">SQL Injection Demo</a></p>
<p>Additionally, earlier in the year I worked with Duke&#8217;s ITSO to write up examples of good coding practices to protect against a variety of web application security issues.  This referenced is linked on Duke ITSO&#8217;s site here: <a href="http://www.security.duke.edu/ITSO_Web_Application_Security_Standard_v1.pdf">http://www.security.duke.edu/ITSO_Web_Application_Security_Standard_v1.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/265/sql-injection-at-duke-techexpo-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drag and Drop off the Desktop in Duke Webfiles</title>
		<link>http://blog.alexbeutel.com/255/drag-and-drop-off-the-desktop-in-duke-webfiles/</link>
		<comments>http://blog.alexbeutel.com/255/drag-and-drop-off-the-desktop-in-duke-webfiles/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 23:07:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Duke]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=255</guid>
		<description><![CDATA[While on break, I&#8217;ve been playing around with Mozilla&#8217;s File API and integrating it with Duke Webfiles, which I work on for OIT. This is only a proof of concept since the spec has not been completed and I only implemented it in the icon view of Webfiles. Regardless, I think it is pretty cool [...]]]></description>
			<content:encoded><![CDATA[<p>While on break, I&#8217;ve been playing around with Mozilla&#8217;s File API and integrating it with <a href="http://webfiles.duke.edu" target="_blank">Duke Webfiles</a>, which I work on for OIT.  This is only a proof of concept since the spec has not been completed and I only implemented it in the icon view of Webfiles.  Regardless, I think it is pretty cool and makes the application much easier to use.  Here is a screencast to see it in action:</p>
<p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/9RBfyC60ADI&#038;hl=en&#038;fs=1&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/9RBfyC60ADI&#038;hl=en&#038;fs=1&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p>
<p>To do this I used examples from <a href="http://www.thecssninja.com/javascript/drag-and-drop-upload" target="_blank">here</a> for the new File API and <a href="http://blog.igstan.ro/2009/01/pure-javascript-file-upload.html" target="_blank">here</a> for the AJAX upload.  Obviously this could be expanded upon by implementing it in all three file views in Webfiles and by showing progress bars for each file.  Additionally, there are some small bugs with uploading large files.  However, if you are a Duke student and want to give it a try, follow the instructions below.   Please note, this is a alpha version of the software, and you may run into some bugs when using it.</p>
<ul>
<li>Make sure you are using <a href="https://developer.mozilla.org/devnews/index.php/2009/08/07/firefox-3-6-alpha-1-now-available-for-download/">Firefox 3.6 Alpha &#8211; Namoroka</a>.</li>
<li>Go to our <a href="http://pnsdev.oit.duke.edu" target="_blank">development version of Webfiles</a> and log in.</li>
<li><em>After</em> you are logged in, go <a href="http://pnsdev.oit.duke.edu/#beta" target="_blank">here</a> to turn on the new drag and drop feature.</li>
</ul>
<p>Please, give it a try and let me know your thoughts.  Thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/255/drag-and-drop-off-the-desktop-in-duke-webfiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubiquity Scripts</title>
		<link>http://blog.alexbeutel.com/233/ubiquity-scripts/</link>
		<comments>http://blog.alexbeutel.com/233/ubiquity-scripts/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 07:17:58 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=233</guid>
		<description><![CDATA[After playing with the Jetpack API and having an increasing desire to procrastinate my Spanish homework, I decided to give the Ubiquity API a shot too and make a few small scripts just to make my life easier.  The first extension I made was a script to do look ups of IP addresses and get [...]]]></description>
			<content:encoded><![CDATA[<p>After playing with the Jetpack API and having an increasing desire to procrastinate my Spanish homework, I decided to give the Ubiquity API a shot too and make a few small scripts just to make my life easier.  The first extension I made was a script to do look ups of IP addresses and get more information about them.  This is useful mainly if you are looking at raw logs from a web server.  After realizing how easy it was to make these scripts, I made two more for bit.ly links which I frequently come across on Twitter.  The first can get more info and stats about a link (the number of clicks) and easily send you to the bit.ly info page for that link.  The second script can be used to quickly expand the links from their compressed bit.ly form to their original form.  I know there are other scripts that can do this across an entire page, but felt I&#8217;d rather keep short links with a quick and easy way to find out what the link contains.  If any of these sound interesting/useful or if you just want to see some simple examples of how to code Ubiquity extensions, you can check the scripts out <a href='http://ambmediadesign.com/scripts/ubiquity.html' target='_blank'>here</a>.  I have also included screenshots for each of these scripts below.</p>
<div style='padding: 7px;'><img src='http://ambmediadesign.com/scripts/iptrace2.png' /></div>
<div style='padding: 7px;'><img src='http://ambmediadesign.com/scripts/bitly-info.png' /></div>
<div style='padding: 7px;'><img src='http://ambmediadesign.com/scripts/bitly-expand.png' /></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/233/ubiquity-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Reader vs. Netvibes, and Jetpack Notifications</title>
		<link>http://blog.alexbeutel.com/81/google-reader-vs-netvibes-and-jetpack-notifications/</link>
		<comments>http://blog.alexbeutel.com/81/google-reader-vs-netvibes-and-jetpack-notifications/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 18:41:02 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Jetpack]]></category>
		<category><![CDATA[Musings]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=81</guid>
		<description><![CDATA[A couple of weeks ago I decided to give Google Reader a try.  I have been addicted to Netvibes for at least 2-3 years now, but I saw that Reader had a more active community around it, so I thought it was worth trying out.  Almost immediately I disliked the look and feel.  I am [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago I decided to give Google Reader a try.  I have been addicted to Netvibes for at least 2-3 years now, but I saw that Reader had a more active community around it, so I thought it was worth trying out.  Almost immediately I disliked the look and feel.  I am subscribed to over thirty fairly active RSS feeds and  in Reader it was hard to see which blogs had new posts.  The default action is to just look at a long list and viewing posts by blog is almost hard to do.  As a result &#8220;Mark[ing] all as read&#8221; for a specific blog takes many more scrolls and clicks, which had been extremely easy in Netvibes.   About this time I was giving Mozilla&#8217;s Jetpack a try and found the Google Reader Notifier, which would notify me via Growl of new posts.  So I decided to give Reader a longer try, despite some initial disappointments.</p>
<p>Ultimately, I became addicted to these near instant updates for new blog posts that the Jetpack extension provided.  At the same time I learned to love the fact that by default I was forced to read the title for every blog post in Reader.  Where as before in Netvibes I would never scroll through the backed up posts from Gizmodo and Engadget, Reader&#8217;s chronological ordering makes me go through each post.  Recently, this is just another case where what I think I want does not match up with what actual creates a better user experience (similar to Google&#8217;s analysis of users searching more with 10 results despite asking for as many as possible or  Dan Curtis&#8217;s explanation that we are <a href="http://dustincurtis.com/you_should_follow_me_on_twitter.html" target="_blank">not in control of our deicions</a>).  Also, this reminds me of <a href="http://www.azarask.in/blog/" target="_self">Aza Raskin</a>&#8216;s <a href="http://andywibbels.com/2009/06/aza-raskin-google-techtalk/" target="_blank">statement</a> &#8220;Every time you make the user make a decision they don&#8217;t care about, you have failed as a designer.&#8221;  Interestingly, Google forced me to make a harder decision than I wanted to make; where before I could avoid deciding whether or not to remove the blog by just leaving it on my page and just easily clicking away new posts with &#8220;Marking all as read,&#8221; I now had to decide to either read the post titles or make the leap to get ride of the RSS feed all together.  While I was able to be lazy before, it made for a more concrete decision and user experience.</p>
<p>The other thing I realized was that the Jetpack extension for Reader notifications was causing my browser to hang when I had a bad internet connection.  Sadly, living in an off campus apartment with spotty Internet this happens all too often, and I decided to disable Jetpack.  However, I missed the notifications and decided to fix the Jetpack extension.  I reworked the old extension to only perform asynchronous AJAX calls, getting rid of the browser hanging issue, and modified the extension to display notifications to show new posts by blog title, thus making the notifications more informative.  The status bar display and the new Growl notifications can be seen below.  Click <a title="Jetpack - Google Reader Notifier" href="http://ambmediadesign.com/scripts/Jetpack-gReader.html" target="_blank">here</a> to install this extension or <a href="http://ambmediadesign.com/scripts/greader.js" target="_blank">here</a> to view the code.  Of course, let me know your thoughts or any bugs you run into.  Thanks.</p>
<p>Also, as some friends like <a href="http://nirum.tumblr.com/" target="_blank">Niru</a>, <a href="http://djsharkey.com/blogz" target="_blank">DJ</a>, and <a href="http://blog.mediabymrb.com/" target="_blank">Marc</a> have pointed out, I have somewhat decreased my blogging but have been posting a good number of posts on Twitter.  So of course, you should follow me on Twitter <a title="Twitter - Alex Beutel" href="http://twitter.com/alexbeutel" target="_blank">here</a>.</p>
<p><img style="padding-bottom: 15px;" src="http://ambmediadesign.com/scripts/statusbar2.png" alt="" /><br />
<img src="http://ambmediadesign.com/scripts/growl-greader2.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/81/google-reader-vs-netvibes-and-jetpack-notifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Following Chromium Progress</title>
		<link>http://blog.alexbeutel.com/65/following-chromium-progress/</link>
		<comments>http://blog.alexbeutel.com/65/following-chromium-progress/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 20:52:13 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Chromium]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=65</guid>
		<description><![CDATA[For the past few months I have been following the progress of Chromium for Mac and watching it develop and it has definitely made a lot of progress in that time. In the past few month it has received increasing press, with people asking why it is taking so long. One of the lead developers [...]]]></description>
			<content:encoded><![CDATA[<p>For the past few months I have been following the progress of Chromium for Mac and watching it develop and it has definitely made a lot of progress in that time.  In the past few month it has received increasing press, with people asking why it is taking so long.  One of the lead developers on the project <a href="http://weblogs.mozillazine.org/pinkerton/archives/020035.html" target="_blank">responded </a>that people need to chill out and that building a browser takes time.  So, in part to show myself and others the progress, I decided to make a little application to show this progress.  Throughout the day builds and updates of Chromium are posted to <a href="http://build.chromium.org/buildbot/snapshots/sub-rel-mac/" target="_blank">http://build.chromium.org/buildbot/snapshots/sub-rel-mac/</a> but to read each changelog was a pain.  So, to give myself more exposure to new Python libraries and give the Twitter API a swing, I created a script to check for changes to the builds, pull log entries on the changes and post them all to a <a href="http://twitter.com/chromiumUpdates" target="_blank">Twitter stream</a> so there is a single source you can view updates.  The script is far from perfect, as it has to be running to catch the updates and doesn&#8217;t go back and look for ones it missed.  And currently I just have it running on one of Duke&#8217;s servers so it goes down occasionally.  But it generally works and provides plenty of updates so you can see what is actually be worked on and updated.  Check out the <a href="http://ambmediadesign.com/chromium.py">source code</a> below (twitter username and password cut out).</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://blog.alexbeutel.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=65&amp;download=chromium.py">chromium.py</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p656"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
</pre></td><td class="code" id="p65code6"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># encoding: utf-8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">xml</span>.<span style="color: black;">dom</span> <span style="color: #ff7700;font-weight:bold;">import</span> minidom
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> twitter<span style="color: black;">&#40;</span>twitter_username, twitter_password, message<span style="color: black;">&#41;</span>:
	request = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://twitter.com/statuses/update.json'</span><span style="color: black;">&#41;</span>
	request.<span style="color: black;">headers</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Authorization'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'Basic %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span> <span style="color: #dc143c;">base64</span>.<span style="color: black;">b64encode</span><span style="color: black;">&#40;</span>twitter_username + <span style="color: #483d8b;">':'</span> + twitter_password<span style="color: black;">&#41;</span>,<span style="color: black;">&#41;</span>
	request.<span style="color: black;">data</span> = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'status'</span>: message<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		response = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># The Response</span>
	<span style="color: #ff7700;font-weight:bold;">except</span> HTTPError, e:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error posting to twitter&quot;</span>
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;HTTP Error code: &quot;</span>, e.<span style="color: #dc143c;">code</span>
	<span style="color: #ff7700;font-weight:bold;">except</span> URLError, e:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error posting to twitter&quot;</span>
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;URLError reason: &quot;</span>, e.<span style="color: black;">reason</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	message = <span style="color: #483d8b;">&quot;&quot;</span>
	last_update = <span style="color: #483d8b;">&quot;17514&quot;</span><span style="color: #66cc66;">;</span>
	chromium_url = <span style="color: #483d8b;">&quot;http://build.chromium.org/buildbot/snapshots/sub-rel-mac/&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">while</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">try</span>:
			response = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>chromium_url + <span style="color: #483d8b;">&quot;LATEST&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">except</span> HTTPError, e:
			<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;HTTP Error code: &quot;</span>, e.<span style="color: #dc143c;">code</span>
		<span style="color: #ff7700;font-weight:bold;">except</span> URLError, e:
			<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;URLError reason: &quot;</span>, e.<span style="color: black;">reason</span>
		<span style="color: #ff7700;font-weight:bold;">else</span>:
			latest = response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;latest: &quot;</span>, latest
			<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>latest <span style="color: #66cc66;">!</span>= last_update<span style="color: black;">&#41;</span>:
				<span style="color: #ff7700;font-weight:bold;">try</span>:
					response2 = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>chromium_url + latest + <span style="color: #483d8b;">&quot;/changelog.xml&quot;</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">except</span> HTTPError, e:
					<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;HTTP Error code: &quot;</span>, e.<span style="color: #dc143c;">code</span>
				<span style="color: #ff7700;font-weight:bold;">except</span> URLError, e:
					<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;URLError reason: &quot;</span>, e.<span style="color: black;">reason</span>
				<span style="color: #ff7700;font-weight:bold;">else</span>:
					html = response2.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
					<span style="color: #808080; font-style: italic;"># print html</span>
					dom = minidom.<span style="color: black;">parseString</span><span style="color: black;">&#40;</span>html<span style="color: black;">&#41;</span>
					entries = dom.<span style="color: black;">getElementsByTagName</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;logentry&quot;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#[0].childNodes</span>
					<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;entries: &quot;</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entries<span style="color: black;">&#41;</span>
					<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entries<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
						link = chromium_url + latest + <span style="color: #483d8b;">&quot;/ &quot;</span>
						msg = entries<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">getElementsByTagName</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;msg&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">firstChild</span>.<span style="color: black;">nodeValue</span>
						num = entries<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">getAttribute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;revision&quot;</span><span style="color: black;">&#41;</span>
						<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Revision: &quot;</span>, num
						twitter<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;USERNAME&quot;</span>, <span style="color: #483d8b;">&quot;PASSWORD&quot;</span>, <span style="color: #483d8b;">&quot;Chromium Revision &quot;</span> + num + <span style="color: #483d8b;">&quot;: &quot;</span> + msg<span style="color: black;">&#41;</span>
					last_update = latest
			<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">60</span><span style="color: #66cc66;">*</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Play with the code or follow the twitter.  Also, I decided to try a new WordPress plugin for code so let me know what you think.  Thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/65/following-chromium-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Begginning of Summer 2009</title>
		<link>http://blog.alexbeutel.com/49/begginning-of-summer-2009/</link>
		<comments>http://blog.alexbeutel.com/49/begginning-of-summer-2009/#comments</comments>
		<pubDate>Sat, 30 May 2009 19:14:43 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Duke]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=49</guid>
		<description><![CDATA[As usual I haven&#8217;t posted in a while but there actually have been some things going on that may be worth writing on here.  I&#8217;m at Duke for the summer doing research with the Physics Neutrino group, among other things so here are some things that have happened: Ethical Hacking Seminar Duke OIT gave me [...]]]></description>
			<content:encoded><![CDATA[<p>As usual I haven&#8217;t posted in a while but there actually have been some things going on that may be worth writing on here.  I&#8217;m at Duke for the summer doing research with the Physics Neutrino group, among other things so here are some things that have happened:</p>
<p><strong>Ethical Hacking Seminar</strong></p>
<p>Duke OIT gave me the opportunity to take this hacking seminar at Duke the first week of summer.  It was definitely an extremely beginner course and I was a little disappointed to see that so much of it was just &#8220;pick the right tool and run it,&#8221; but good opportunity to dig a little deeper into network protocols and learn some new things; without a doubt was worthwhile.  If anyone reading this is as much of a beginner as I am check out things like <a href="http://ettercap.sourceforge.net/" target="_blank">Ettercap</a>, <a href="http://nmap.org/" target="_blank">nmap</a>, and <a href="http://www.nessus.org/nessus/" target="_blank">Nessus</a>.</p>
<p><strong>Duke&#8217;s AFS Online Interface &#8211; Webfiles</strong></p>
<p>The past year I have been working with OIT, half doing web application security and half doing programming updating Duke&#8217;s online interface for its AFS file system, <a title="Duke Webfiles" href="http://webfiles.duke.edu" target="_blank">Webfiles</a>.  Essentially, it was an attempt to make the online interface more comfortable for average users and make it most similar to Windows Explorer and OS X Finder so that using it is as intuitive as possible.  The coding was anything but beautiful, but it was a good opportunity to learn more about Javascript and play with some fun things.  General changes are that it now has an icon and outline view, drag and drop, some of the typical shortcut keys, etc.  Below are some screenshots and I will try to create a demo site at some point.  I am also excited to say Duke is making all my code open source so let me know if you would like to implement it yourself.  I believe Carnegie Mellon is currently looking at deploying it on their systems, which I think is exciting.</p>
<p><span style="padding-right: 20px;"><a href="http://blog.ambmediadesign.com/wp-content/uploads/2009/05/icon.jpg" target="_blank"><img src="http://blog.ambmediadesign.com/wp-content/uploads/2009/05/icon-150x150.jpg" alt="icon" title="icon" height="150" class="alignleft size-thumbnail wp-image-55" /></a></span> <a href="http://blog.ambmediadesign.com/wp-content/uploads/2009/05/outline.png" target="_blank"><img src="http://blog.ambmediadesign.com/wp-content/uploads/2009/05/outline-150x150.png" alt="outline" title="outline" height="150" class="alignleft size-thumbnail wp-image-56" /></a></p>
<p><strong>Neutrino Physics</strong></p>
<p>I just started working with Professor Chris Walter and his Neutrino Physics group.  So far, just to get into the group, I have been working on creating a plug-in for <a href="http://root.cern.ch" target="_blank">ROOT</a> to make it read and write to a specific kind of distributed file system faster.  It has been an interesting experience getting back into C++ and a little bit of Fortran, and learning about this large project out of CERN.  I&#8217;m still finishing up the plug-in but hopefully I will be able to post the code or at least write about how to easily integrate the plug-in into ROOT when I&#8217;m done.  Not sure what I will be doing after that; I am taking classes on GEANT4 and think I will be doing monte carlo simulations of some sort for the rest of the summer, but I will write about this when I know more.</p>
<p><strong>Simple Flash Cards in Python</strong></p>
<p>The second reason I am here for the summer is that I need to take Spanish to fulfill Duke&#8217;s foreign language requirement.  If you actually know me, you will know that I am horrible at foreign languages and have been dreading taking these classes since I got to Duke.  It has now been two years since I last took a Spanish course, so jumping back into the language has been an interesting experience.  Also, Spanish 63 is known to be a lot of work and over the summer its so jam packed together that it is actually a good amount of work each night.  Anyway, we had our first test last Friday, and I had about 100 words of vocabulary to memorize, one of my worse skills.  So, both to procrastinate from actually studying and because I thought it could be useful, I decided to make a basic command line flash card program.  I&#8217;m trying to bit by bit pick up Python, so I used it and it was fairly simple.  The program essentially takes in a plain text file with the two sides of the flash card on one line, each side separated by a colon.  It then goes through the lines, shows you the second half of the line first, waits for you to press enter and then shows you the first half.  If you press enter again it will discard the word and go to another random word in the deck; if you type &#8216;x&#8217; and then press enter it will put the word back in the stack.  Fairly basic, and the code is nothing special; probably took about 15 minutes to throw together, but it was surprisingly very useful as I could run through a lot of the vocab very fast and repeatedly.  I&#8217;ll probably update it to make it a little better packaged together with proper arguments, etc. so you can check back for that.  Anyway, to run it (if you have a Mac python is installed by default and in Windows you need to do it yourself) open up a terminal and make sure you are in the folder where the code and the text file with the vocab are.  Then just type:</p>
<pre>python flashcards.py yourvocabfile.txt</pre>
<p>The code for <a href="http://ambmediadesign.com/flashcards.py" target="_blank">flashcards.py</a>  (<a href="http://ambmediadesign.com/genteDeCine.txt" target="_blank">example vocab linked here</a>) can be seen below:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://blog.alexbeutel.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=49&amp;download=flashcards.py">flashcards.py</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p498"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
</pre></td><td class="code" id="p49code8"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># encoding: utf-8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> clearscreen<span style="color: black;">&#40;</span>numlines=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">name</span> == <span style="color: #483d8b;">&quot;posix&quot;</span>:
        <span style="color: #808080; font-style: italic;"># Unix/Linux/MacOS/BSD/etc</span>
        <span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'clear'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">name</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;nt&quot;</span>, <span style="color: #483d8b;">&quot;dos&quot;</span>, <span style="color: #483d8b;">&quot;ce&quot;</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># DOS/Windows</span>
        <span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'CLS'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">*</span> numlines
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span>argv=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span> argv <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
		argv = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span>
	allLines = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
	again = <span style="color: #483d8b;">'x'</span>
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>argv<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>:
		again = argv<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
&nbsp;
	f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>argv<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> f:
		allLines.<span style="color: black;">append</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span>
&nbsp;
	clearscreen<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	cnt = <span style="color: #ff4500;">0</span>
	wrong = <span style="color: #ff4500;">0</span>
	wWords = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>allLines<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
		cnt += <span style="color: #ff4500;">1</span>
		l = allLines.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>allLines<span style="color: black;">&#41;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		parts = l.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;:&quot;</span><span style="color: black;">&#41;</span>
		p = <span style="color: #ff4500;">1</span>
		p2 = <span style="color: #ff4500;">0</span>
		<span style="color: #ff7700;font-weight:bold;">print</span> cnt, <span style="color: #483d8b;">&quot;(&quot;</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>allLines<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">&quot;). &quot;</span>, parts<span style="color: black;">&#91;</span>p<span style="color: black;">&#93;</span>
		inp = <span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>inp == <span style="color: #483d8b;">&quot;exit&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">break</span>
		<span style="color: #ff7700;font-weight:bold;">print</span> parts<span style="color: black;">&#91;</span>p2<span style="color: black;">&#93;</span>
		inp = <span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>inp == <span style="color: #483d8b;">&quot;exit&quot;</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">break</span>
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>inp == again<span style="color: black;">&#41;</span>:
			allLines.<span style="color: black;">append</span><span style="color: black;">&#40;</span>l<span style="color: black;">&#41;</span>
			wrong += <span style="color: #ff4500;">1</span>
			wWords.<span style="color: black;">append</span><span style="color: black;">&#40;</span>l<span style="color: black;">&#41;</span>
		clearscreen<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	clearscreen<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Missed &quot;</span>, wrong, <span style="color: #483d8b;">&quot; times&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> wWords :
		<span style="color: #ff7700;font-weight:bold;">print</span> line
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
	<span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span>main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Again, nothing special or fancy, but seemed to work well; I guess I&#8217;ll know how effective it was when I get the test back haha.  Anyway that is all for now, I may make public a <a href="http://blog.ambmediadesign.com/32/catching-up/">post</a> I wrote a few months ago that I never published, so check for that and I&#8217;ll write of any other things I do this summer.  Also check my twitter as I post more frequently there.  Time to go outside.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/49/begginning-of-summer-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Break from Studying</title>
		<link>http://blog.alexbeutel.com/23/break-from-studying/</link>
		<comments>http://blog.alexbeutel.com/23/break-from-studying/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 22:28:58 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Duke]]></category>
		<category><![CDATA[Miscellanious]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.ambmediadesign.com/?p=23</guid>
		<description><![CDATA[In the middle of studying for some finals, I thought I&#8217;d take a break, install the new WordPress 2.7.  Of course, this required I actually write a blog post to give the new version a legitimate spin.  So just wanted to post that my new favorite command (after rsync) has been wget, installed via macports, [...]]]></description>
			<content:encoded><![CDATA[<p>In the middle of studying for some finals, I thought I&#8217;d take a break, install the new WordPress 2.7.  Of course, this required I actually write a blog post to give the new version a legitimate spin.  So just wanted to post that my new favorite command (after rsync) has been wget, installed via macports, which I used to download all of my notes for a few classes off my teachers&#8217; websites.  Again, another small amazement in Unix, and thus OS X.  Maybe over break I&#8217;ll pick up a book and really learn its full potential.  Anyway, I&#8217;ll try to write a few more blog posts over break with whatever I&#8217;m working on or any other exciting news.  Back to studying.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexbeutel.com/23/break-from-studying/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
