<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5266635</id><updated>2024-08-27T22:51:07.450-07:00</updated><category term="gimp lisp programming plugin"/><category term="lisp programming language"/><title type='text'>wubo.blogspot.com</title><subtitle type='html'>Stuff I like.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default?alt=atom&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5266635.post-7835943800699127214</id><published>2012-07-06T03:13:00.002-07:00</published><updated>2012-07-06T03:13:29.436-07:00</updated><title type='text'>Update your Links</title><content type='html'>Hi!

I have more blogs than I have toes. I don&#39;t want to have to maintain them all so I picked one and this blog wasn&#39;t it.

So, if you want to keep reading what I write, you should update your links.

http://50ply.com

is the new place to be.</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/7835943800699127214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/7835943800699127214?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/7835943800699127214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/7835943800699127214'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2012/07/update-your-links.html' title='Update your Links'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5266635.post-1279123283643583377</id><published>2012-07-03T20:39:00.000-07:00</published><updated>2012-07-03T20:39:42.242-07:00</updated><title type='text'>Metablogging</title><content type='html'>I got a fancy new bluetooth keyboard that works wonderfully with my iPad. Somehow, new gear gives me the crazy urge to blog. Last time I got a new keyboard I felt the same inclination. Last time, I bet I blogged about wanting to blog more.

Since I&#39;ve meta-blogged far to often, I thought it would be interesting instead to blog about other peoples&#39; metablogging tendancies.

A few Google searches:

* &quot;I should blog more&quot; - 
* &quot;Just started blogging&quot; - 
* +blogging +restarted - 
* +blog &quot;more often&quot; - 

Well, so, I was going to list the number of hits after each of those searchs (because everyone knows that &quot;Google hits&quot; is a relevant metric) but apparently the iPad version of Google doesn&#39;t include number of hits in the result page. Go figure.

So, instead, I&#39;ll just say... &quot;Hey! I blogged. Don&#39;t expect any more miracles this year.&quot;</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/1279123283643583377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/1279123283643583377?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1279123283643583377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1279123283643583377'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2012/07/metablogging.html' title='Metablogging'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5266635.post-1413460648508837968</id><published>2010-01-03T15:27:00.001-08:00</published><updated>2010-01-04T03:48:03.635-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lisp programming language"/><title type='text'>Do I Have a Lithp?</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Why! &lt;a href=&#39;http://github.com/netguy204/lithp&#39;&gt;Yes, I do!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here&#39;s the story.&lt;/p&gt;&lt;p&gt;The setting: the second semester of my senior year. I had two major design projects and several major papers, I was designing a control system for a 6-DOF robot arm, and I had no time whatsoever. It was during this semester that I wrote my first Lisp interpreter.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&#39;en.wikipedia.org/wiki/Lisp_(programming_language)&#39;&gt;What is Lisp (wikipedia)&lt;/a&gt;?&lt;br/&gt;&lt;br/&gt;The name LISP derives from &quot;LISt Processing&quot;. Linked lists are one of Lisp languages&#39; major data structures, and Lisp source code is itself made up of lists. As a result, Lisp programs can manipulate source code as a data structure, giving rise to the macro systems that allow programmers to create new syntax or even new domain-specific programming languages embedded in Lisp.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;The interchangeability of code and data also gives Lisp its instantly recognizable syntax. All program code is written as s-expressions, or parenthesized lists. A function call or syntactic form is written as a list with the function or operator&#39;s name first, and the arguments following; for instance, a function f that takes three arguments might be called using (f x y z).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When I set out to create my own lisp the language was pretty new to me. I understood how to make new functions and do silly arithmatic and I could begin to grasp the recursion of more difficult algorithms--but I quickly discovered I didn&#39;t have a clue.&lt;/p&gt;&lt;p&gt;The simplicity language was what really captivated me. I could begin to see how one could build incredibly complex things out of very simple building blocks. For example: If you can create a global variable and create an unnamed function -- combine the pieces and you can create global functions. Using these two primitive pieces I was able to write the fundamental function definition keyword &lt;em&gt;defun&lt;/em&gt; in lithp. I didn&#39;t have to make it part of the interpreter.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&#39; font-size:small;&#39;&gt;(set a 1) ; creates a global variable, sets it to one&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&#39; font-size:small;&#39;&gt;(lambda (x) (+ x 1)) ; creates an unnamed function that adds 1 to whatever it&#39;s given&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&#39; font-size:small;&#39;&gt;(set b (lambda (x) (+ x 1)) ; creates the same function as before and stores it in a&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&#39; font-size:small;&#39;&gt;(b 5) ; applies the add-one function to 5 to produce 6&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Like many coders, I had imagined that one day I would create my own language. A language as fundamentally simple as lisp seemed well within my abilities. I got to work.&lt;/p&gt;&lt;h2&gt;The Parser&lt;/h2&gt;&lt;p&gt;My first task was creating a parser that could understand all those parentheses. Writing the parser was difficult because I had no clue what I was doing--the reality is that the Lisp syntax is very easy to parse. I was fortunate to discover the Bison and Flex tools and was able to understand them well enough to create my lisp parser.&lt;/p&gt;&lt;p&gt;Here&#39;s how it works.&lt;/p&gt;&lt;h3&gt;&lt;a href=&#39;http://github.com/netguy204/lithp/blob/master/lithp.lex&#39;&gt;lithp.lex&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The lex file is given to a tool called Flex to produce the c code for the lexer. A lexer converts a stream of text into a stream of tokens with tags designating what each of the tokens are. Each token is defined using regular expressions.&lt;/p&gt;&lt;p&gt;For example: The tokens in lithp are the open and close parentheses, single quotes, backquotes, dots, numbers, and symbols. Each of these has special significance in how the textual form of the program is converted into s-expressions.&lt;/p&gt;&lt;h3&gt;&lt;a href=&#39;http://github.com/netguy204/lithp/blob/master/lithp.y&#39;&gt;lithp.y&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The .y file is given to another utility called Bison to produce the c code for the parser. The parser uses the tokens that the lexer produces and produces s-expressions if the tokens are in a recognizable sequence. &lt;/p&gt;&lt;p&gt;Inside the .y file I use &lt;a href=&#39;http://en.wikipedia.org/wiki/Extended_Backus–Naur_Form&#39;&gt;EBNF Notation&lt;/a&gt; to define the sequences of tokens that make up the various types of stanzas that can be found in our language. For example: A sequence is one or more expressions separated by spaces. A list is a sequence that has parenthesis around it. An expression is either a symbol, a number, or a list.&lt;/p&gt;&lt;p&gt;These two surprisingly short and readable files were the product of many hours of reading documentation and writing test files that I thought should parse correctly. I could definitely write these much quicker now but Bison and Flex were really tough to learn from scratch using only google and man pages.&lt;/p&gt;&lt;h2&gt;The Printer&lt;/h2&gt;&lt;p&gt;In the next installment I will discuss the function to convert s-expressions back into text form. It was while I was writing this function that I really started to grasp the beauty and simplicity of the traditional parenthetical lisp syntax. My next lithp post will explain how s-expressions are stored and what the syntax of textual representation actually means.&lt;/p&gt;&lt;p&gt;To be continued...&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/5266635-1413460648508837968?l=wubo.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/5266635-1413460648508837968?l=wubo.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/1413460648508837968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/1413460648508837968?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1413460648508837968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1413460648508837968'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2010/01/do-i-have-lithp.html' title='Do I Have a Lithp?'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5266635.post-5210598534915940664</id><published>2010-01-02T13:41:00.001-08:00</published><updated>2010-01-02T13:41:02.865-08:00</updated><title type='text'>Programmable System on a Chip</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Wow. I really dig this. Bought my kit today. Likely the coolest $50 I&#39;ve ever spent.&lt;br/&gt;&lt;br/&gt;Think: CPU + RAM + ROM + DAC + ADC + DSP + opamps + USB + loads of other peripherals all on one chip.&lt;/p&gt;in reference to: &lt;a href=&#39;http://www.cypress.com/?rID=38235&#39;&gt;&lt;a href=&#39;http://www.cypress.com/?rID=38235&#39;&gt;http://www.cypress.com/?rID=38235&lt;/a&gt;&lt;/a&gt; (&lt;a href=&#39;http://www.google.com/sidewiki/entry/112796249592350242732/id/R1YjoOHowhAmJJgxmVIva89SgfM&#39;&gt;view on Google Sidewiki&lt;/a&gt;)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/5210598534915940664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/5210598534915940664?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/5210598534915940664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/5210598534915940664'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2010/01/programmable-system-on-chip.html' title='Programmable System on a Chip'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5266635.post-7121520861670960981</id><published>2010-01-02T08:14:00.000-08:00</published><updated>2010-01-04T03:48:43.252-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gimp lisp programming plugin"/><title type='text'>GIMP Batch Watermarker</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Yesterday, my wife and I were searching for a way to add a watermark to a bunch of images under windows. On a unix system I probably would have scripted together something with imagemagick using convert. We did find a utility for that purpose but it wasn&#39;t free. C&#39;mon... do you really want me to pay you for the privilege of having copyright text? I wish I could make $20 a copy for something that could be written in an evening. &lt;/p&gt;&lt;p&gt;What we REALLY wanted was a generic batch processing system for the gimp. My dream solution to this problem is to tell the gimp to record the commands I invoked, save that (ideally as script-fu), and then run that same set of commands on a directory full of images. The closest thing we found was &lt;a href=&#39;http://members.ozemail.com.au/~hodsond/dbp.html&#39;&gt;Dave&#39;s Batch Processor&lt;/a&gt;. You can rotate, scale, rename, and sharpen images in batch but you&#39;re basically limited to those things. With the way the plugin architecture of gimp works it really should be possible to do much better. Building some sort of macro recording tool seems more like the right answer. &lt;/p&gt;&lt;p&gt;This script isn&#39;t the right answer but it solves our problem. Point it at a directory of images and give it a string of text you want it to apply and it will modify every picture in that directory to include the string. You might want to test it on a handful of duplicated images first to make sure you like the results. &lt;/p&gt;&lt;p&gt;This script installs itself under the image menu. You&#39;ll find a single image watermarker (watermark the image you&#39;re editing right now) and a batch image watermarker (watermark everything in a given directory.) &lt;/p&gt;&lt;p&gt;To install, copy the script into your gimp scripts directory&lt;/p&gt;&lt;ul&gt;&lt;li&gt;On windows: C:\Program Files\gimp..\scripts&lt;/li&gt;&lt;li&gt;On unix: ~/.gimp2.6/scripts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Enjoy! &lt;/p&gt;&lt;p&gt;&lt;a href=&#39;http://gist.github.com/gists/267538/download&#39;&gt;GIMP Batch Watermarker&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;I&#39;m also posting &lt;a href=&#39;http://gist.github.com/267538&#39;&gt;this as a gist&lt;/a&gt; feel free to copy and improve it.&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/5266635-7121520861670960981?l=wubo.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/7121520861670960981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/7121520861670960981?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/7121520861670960981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/7121520861670960981'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2010/01/gimp-batch-watermarker-my-wife-and-i.html' title='GIMP Batch Watermarker'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5266635.post-1912839026783565282</id><published>2010-01-01T14:40:00.001-08:00</published><updated>2010-01-01T14:40:40.208-08:00</updated><title type='text'>Use linux machine as virtual sound card for windows machine</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Here&#39;s the drivers for windows: &lt;a href=&#39;http://www.clingman.org/winesd/&#39;&gt;http://www.clingman.org/&lt;wbr/&gt;winesd/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;The linux machine needs to be running ESoundD or pulseaudio with the ESoundD module enabled. Very handy if your best speakers are connected to one machine but you want to play music on all your others.&lt;/p&gt;in reference to: &lt;a href=&#39;http://www.pulseaudio.org/wiki/FAQ#IsthereaWin32WindowsdriverthatactlikeaPulseAudioclient&#39;&gt;&lt;a href=&#39;http://www.pulseaudio.org/wiki/FAQ#IsthereaWin32WindowsdriverthatactlikeaPulseAudioclient&#39;&gt;http://www.pulseaudio.org/wiki/FAQ#IsthereaWin32WindowsdriverthatactlikeaPulseAudioclient&lt;/a&gt;&lt;/a&gt; (&lt;a href=&#39;http://www.google.com/sidewiki/entry/112796249592350242732/id/eq7fC70VBObpfDeRocpbZJKZ8iE&#39;&gt;view on Google Sidewiki&lt;/a&gt;)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wubo.blogspot.com/feeds/1912839026783565282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5266635/1912839026783565282?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1912839026783565282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5266635/posts/default/1912839026783565282'/><link rel='alternate' type='text/html' href='http://wubo.blogspot.com/2010/01/use-linux-machine-as-virtual-sound-card.html' title='Use linux machine as virtual sound card for windows machine'/><author><name>Brian</name><uri>http://www.blogger.com/profile/09888657149219210134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiure5Gol89jv-aLySqDby8PrUD0fP0VHhj1cXW538xgDuSFqlsSP1-7lws1GY1yLheTqUseegbB6F_kEUDcnCXlx8crIdCyuJSAmrQwqmyFDaWSW93cgUPv6L-de1O-dU/s220/img_0342_thresh.png'/></author><thr:total>0</thr:total></entry></feed>