<?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>ryePDX</title>
	<atom:link href="http://ryepdx.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ryepdx.com</link>
	<description>Adventures in technology</description>
	<lastBuildDate>Sun, 05 Feb 2012 04:50:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Prolog in Python (pt. 2)</title>
		<link>http://ryepdx.com/2012/02/prolog-in-python-pt-2/</link>
		<comments>http://ryepdx.com/2012/02/prolog-in-python-pt-2/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 04:27:57 +0000</pubDate>
		<dc:creator>ryepdx</dc:creator>
				<category><![CDATA[Prolog]]></category>

		<guid isPermaLink="false">http://ryepdx.com/?p=69</guid>
		<description><![CDATA[Note: I&#8217;ve uploaded a basic barebones project based on this series to a GitHub repository for your convenience. Last time we figured out how to use SWI-Prolog routines in Python. Now we will learn how to connect SWI-Prolog to MySQL and use it to extend Prolog&#8217;s built-in database. Connecting and Disconnecting The odbc_connect predicate will [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note:</strong> I&#8217;ve uploaded a basic barebones project based on this series to a <a href="https://github.com/ryepdx/prolog-mysql-appraise">GitHub repository</a> for your convenience.</p>
<p><a title="Prolog in Python (pt. 1)" href="http://ryepdx.com/2011/09/prolog-in-python-pt-1/">Last time</a> we figured out how to use SWI-Prolog routines in Python. Now we will learn how to connect SWI-Prolog to MySQL and use it to extend Prolog&#8217;s built-in database.</p>
<h3>Connecting and Disconnecting</h3>
<p>The <em><a href="http://www.swi-prolog.org/pldoc/doc_for?object=odbc_connect/3" target="_blank">odbc_connect</a></em> predicate will connect you to your MySQL database. Here I encapsulate it in another predicate for ease of use throughout the rest of my code.</p>
<p><code> connect :- odbc_connect('mysql.<em>your_database_name</em>', _,<br />
[ user(<em>your_username</em>),<br />
alias(<em>database_symbol</em>),<br />
password(<em>your_password</em>),<br />
open(once)<br />
]).<br />
</code></p>
<p>Obviously you will need to fill in your own database&#8217;s name and your own username and password. Also, replace <em>database_symbol</em> with the name of the global symbol you want to bind your database connection to.</p>
<p>The following predicate will disconnect you from your database:</p>
<p><code>% Disconnects from the database.<br />
disconnect :- odbc_disconnect(<em>database_symbol</em>).<br />
</code></p>
<h3>Running Queries</h3>
<p>Now that we can open and close a connection to the database, we can start passing raw queries to it and getting back values. Here&#8217;s an example of pulling data from a row lifted directly from the GitHub project mentioned above. Assume that we used <em>db</em> for our <em>database_symbol</em>.</p>
<p><code> % Extracts the values from a row in the Value table.<br />
parse_value(Row, Thing1, Price, Thing2, Inferred) :- row(Thing1, Price, Thing2, Inferred) = Row.</code></p>
<p><code> % Finds the value of Thing1 in terms of Thing2.<br />
generic_value(Thing1, Price, Thing2, Inferred) :-<br />
connect,<br />
odbc_prepare(db, 'select * from value where ((thing1 = ? and thing2 = ?) or (thing2 = ? and thing1 = ?)) and inferred = ?', [default, default, default, default, integer], Statement, [fetch(fetch), types([atom, float, atom, integer])]),<br />
odbc_execute(Statement, [Thing1, Thing2, Thing2, Thing1, Inferred]),<br />
odbc_fetch(Statement, Row, next),<br />
parse_value(Row, _, Price, _, _),<br />
disconnect.</code></p>
<p>The first predicate, <em>parse_value</em>, does a little bit of pattern matching to split the returned row out into its constituent columns.</p>
<p>The second predicate, <em>generic_value</em>, does a few things:</p>
<p>1. It opens the database connection.</p>
<p>2. It creates a prepared query with <em><a href="http://www.swi-prolog.org/pldoc/man?predicate=odbc_prepare%2f5" target="_blank">odbc_prepare</a></em>. There are a lot of parameters there, so I&#8217;ll explain them a bit.</p>
<ul>
<li>First is global symbol we defined in our connect predicate. In this case I used db, though you can use whatever you replaced database_symbol with.</li>
<li>Second is the actual SQL query with ? marking where we want our query parameters to go.</li>
<li>Third is a list of types for the values we&#8217;ll be binding to our query parameters.</li>
<li>Fourth is the symbol we want to bind the prepared statement to. In this case I bound it to Statement.</li>
<li>Fifth is an optional parameter containing a list of options for our query. <em>fetch</em> describes how I want the results to be returned: by default Prolog will grab all the rows returned. By passing in <em>fetch(fetch)</em>, I specify that I want only the first row to be returned. <em>types</em> contains a list of types that I want the returned columns to be automatically coerced to. By default Prolog will try to guess.</li>
</ul>
<p>3. It executes the prepared statement with <em><a href="http://www.swi-prolog.org/pldoc/man?predicate=odbc_execute%2f2" target="_blank">odbc_execute</a></em>, which takes a prepared statement and a list of values.</p>
<p>4. It fetches the returned row with <em><a href="http://www.swi-prolog.org/pldoc/man?predicate=odbc_fetch%2f3" target="_blank">odbc_fetch</a></em>, which  takes a prepared statement, binds the returned row to a specified symbol (in this case I used <em>Row</em>), and takes a parameter specifying which row should be returned. In this case I specified that the &#8220;next&#8221; row should be returned.</p>
<p>5. It binds the second column returned to <em>Price</em>, discarding the values in the other columns.</p>
<p>6. It closes the database connection.</p>
<p>Simple, no? Inserting and deleting data are similarly easy. I&#8217;ll let you figure out these examples for yourself. If you have questions, feel free to leave a comment.</p>
<p><code> % Sets the value of Thing1 in terms of Thing2.<br />
% If inferred is not specified, defaults to true.<br />
set_value(Thing1, Price, Thing2) :- set_value(Thing1, Price, Thing2, 1).<br />
set_value(Thing1, RPrice, Thing2, Inferred) :-<br />
Price is float(RPrice),<br />
connect,<br />
odbc_prepare(db, 'insert into value(thing1, price, thing2, inferred) values (?, ?, ?, ?)', [default, float &gt; decimal, default, integer], Statement),<br />
odbc_execute(Statement, [Thing1, Price, Thing2, Inferred]),<br />
disconnect.</code></p>
<p><code>% Clears all inferred values from the database.<br />
clear_inferrences :-<br />
connect,<br />
odbc_query(db, 'delete from value where inferred'),<br />
disconnect.</code></p>
<p><strong>Another note:</strong> Did you notice that sneaky <em>float &gt; decimal</em> action up there? All that means is that the decimal value that Prolog will provide when the statement is executed corresponds to a float value in the MySQL table.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2012/02/prolog-in-python-pt-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Getting the Compaq nx6125 Broadcom Wireless card to work in Ubuntu 11.10</title>
		<link>http://ryepdx.com/2011/10/getting-the-compaq-nx6125-broadcom-wireless-card-to-work-in-ubuntu-11-10/</link>
		<comments>http://ryepdx.com/2011/10/getting-the-compaq-nx6125-broadcom-wireless-card-to-work-in-ubuntu-11-10/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 04:42:55 +0000</pubDate>
		<dc:creator>ryepdx</dc:creator>
				<category><![CDATA[Hardware Troubleshooting]]></category>
		<category><![CDATA[broadcom]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://ryepdx.com/blog/?p=32</guid>
		<description><![CDATA[I remember trying to get Ubuntu to work on my Compaq nx6125 my freshman year of college. The first and biggest hurdle was getting the wireless card to work. Recently, after a few OS changes, I decided to go back to Ubuntu for that machine. Imagine my dismay when I discovered the documentation on the [...]]]></description>
			<content:encoded><![CDATA[<p>I remember trying to get Ubuntu to work on my Compaq nx6125 my freshman year of college. The first and biggest hurdle was getting the wireless card to work. Recently, after a few OS changes, I decided to go back to Ubuntu for that machine. Imagine my dismay when I discovered the documentation on the process hadn&#8217;t changed much since my freshman year! Fortunately with a little digging I was able to find a much simpler process. If you&#8217;re trying to get your Broadcom card to work in Ubuntu 11.10 (and possibly earlier versions, for all I know), simply run:</p>
<p><code>sudo apt-get install firmware-b43-installer</code></p>
<p>And that&#8217;s it. Your wireless card should work.</p>
<p><strong>Edit:</strong> If you&#8217;re not using Ubuntu and want to get your Broadcom 43xx wireless card to work in your particular flavor of Linux, you can find more documentation on the subject on <a href="http://wireless.kernel.org/en/users/Drivers/b43">this particular page of the Linux Wireless website</a>. That&#8217;s where I discovered that handy little bit of command-line wizardry.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2011/10/getting-the-compaq-nx6125-broadcom-wireless-card-to-work-in-ubuntu-11-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Opa in 32-bit Ubuntu 11.10</title>
		<link>http://ryepdx.com/2011/10/building-opa-in-32-bit-ubuntu-11-10/</link>
		<comments>http://ryepdx.com/2011/10/building-opa-in-32-bit-ubuntu-11-10/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 18:13:06 +0000</pubDate>
		<dc:creator>ryepdx</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Heard of <a href="http://opalang.org/">Opa</a>? It's a full web app stack by MLstate. It focuses allowing developers to create highly scalable, highly interactive, rich web applications as easily as possible.

Here's "Hello World" in Opa:
<code>server = Server.one_page_server("Hello", ( -> <>Hello web</>))</code>

And here's a chat room in 20 ELOC:
<code>
import stdlib.themes.bootstrap

type message = {author: string /**The name of the author (arbitrary string)*/
               ; text: string /**Content entered by the user*/}

]]></description>
			<content:encoded><![CDATA[<p>Heard of <a href="http://opalang.org/">Opa</a>? It&#8217;s a full web app stack by MLstate. It focuses on allowing developers to create highly scalable, highly interactive, rich web applications as easily as possible.</p>
<p>Here&#8217;s &#8220;Hello World&#8221; in Opa:<br />
<code>server = Server.one_page_server("Hello", ( -&gt; &lt;&gt;Hello web&lt;/&gt;))</code></p>
<p>And here&#8217;s a chat room in 20 ELOC:<br />
<code>import stdlib.themes.bootstrap</p>
<p>type message = {author: string /**The name of the author (arbitrary string)*/<br />
; text: string /**Content entered by the user*/}</p>
<p>@publish room = Network.cloud("room"): Network.network(message)</p>
<p>user_update(x: message) =<br />
line =<br />
&lt;div class="row line"&gt;<br />
&lt;div class="span2 columns user"&gt;{x.author}:&lt;/div&gt;<br />
&lt;div class="span13 columns message"&gt;{x.text}&lt;/div&gt;<br />
&lt;/div&gt;<br />
do Dom.transform([#conversation +Dom.scroll_to_bottom(#conversation)</p>
<p>broadcast(author) =<br />
text = Dom.get_value(#entry)<br />
message = {~author ~text}<br />
do Network.broadcast(message, room)<br />
Dom.clear_value(#entry)</p>
<p>start() =<br />
author = Random.string(8)<br />
&lt;div id="#conversation" class="container"&gt;Network.add_callback(user_update, room)}&amp;gt;&lt;/div&gt;<br />
&lt;div id="#footer"&gt;<br />
&lt;div class="container"&gt;&lt;input id="#entry" class="xlarge" type="text" /&gt;broadcast(author)}/&amp;gt;<br />
&lt;div class="btn primary" onclick="{_"&gt;broadcast(author)}&amp;gt;Post&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/div&gt;<br />
server = Server.one_page_bundle("Chat",<br />
[@static_resource_directory("resources")],<br />
["resources/css.css"], start)<br />
</code></p>
<p>In Opa, the Javascript, HTML, and database models are all generated from the same code.</p>
<p>I was intrigued, so I decided to give it a spin. Unfortunately my laptop was running Ubuntu 11.04 on a 32-bit processor. At the time of this writing, the only binaries available are for 64-bit Linux or OS X. But I decided to try building from source anyway. Haven&#8217;t quite got it figured out yet, but I&#8217;ve made some progress! If anyone can help me out, that&#8217;d be great.</p>
<p>My steps so far:</p>
<ol>
<li>Update Ubuntu to 11.10 if you&#8217;re running an earlier version. Opa requires OCaml 3.12, but the latest version of OCaml in the 11.04 repositories is only 3.11.</li>
<li>Install dependencies:<br />
<code>sudo apt-get install ocaml libssl-ocaml-dev libcryptokit-ocaml-dev libzip-ocaml-dev libocamlgraph-ocaml-dev ocaml-ulex camlp4 camlp4-extra</code></li>
<li>Download and decompress the Opa source package from <a href="https://github.com/MLstate/opalang">Github</a>.<br />
<code>wget https://github.com/MLstate/opalang/tarball/master<br />
tar -xzf master</code>
</li>
<li>Configure and build.<br />
<code>cd MLstate-opalang*<br />
./configure -ocamldir /usr/lib/ocaml<br />
make</code></li>
</ol>
<p>And that&#8217;s as far as I&#8217;ve gotten so far. At that point I get the following error:<br />
<code><br />
File "buildinfos/buildInfos.ml", line 14, characters 0-3:<br />
Error: Syntax error<br />
Command exited with code 2.<br />
Failure:<br />
  No cache, no trx exe: sorry, cannot build libnet/http/request.ml from libnet/http/request.trx.<br />
You may want to re-run with TRX_OVERRIDE set.<br />
Compilation unsuccessful after building 521 targets (512 cached) in 00:00:04.<br />
make: *** [all] Error 2</p>
<p></code></p>
<p>I intend to do some digging about to solve this issue. I&#8217;ll keep this post updated, so keep checking back.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2011/10/building-opa-in-32-bit-ubuntu-11-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prolog in Python (pt. 1)</title>
		<link>http://ryepdx.com/2011/09/prolog-in-python-pt-1/</link>
		<comments>http://ryepdx.com/2011/09/prolog-in-python-pt-1/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 15:09:50 +0000</pubDate>
		<dc:creator>ryepdx</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[I've recently become enamored with the idea of querying a Prolog program with a MySQL database backend from a Python script. Specifically I want to create a Django web app that will allow a user to ask for the price of a thing in terms of anything else. Prolog seems like an excellent choice for the value-finding engine as value-finding in this case will mostly consist of finding a path of trade between two things. For example, in order to find the price of apples in terms of bananas, the value finding engine will first query its database to see if it already knows that off-hand.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently become enamored with the idea of querying a Prolog program with a MySQL database backend from a Python script. Specifically I want to create a Django web app that will allow a user to ask for the price of a thing in terms of anything else. Prolog seems like an excellent choice for the value-finding engine as value-finding in this case will mostly consist of finding a path of trade between two things. For example, in order to find the price of apples in terms of bananas, the value finding engine will first query its database to see if it already knows that off-hand. If it doesn&#8217;t, it then has to see what it does know about the price of apples and then see if anything it can trade apples for can then be traded for bananas. It has to keep branching out until it finally hits bananas.</p>
<p>I was able to complete a proof-of-concept value engine <a href="https://github.com/ryepdx/prolog-appraise/blob/master/appraise.pl" target="_blank">with just 9 lines of Prolog</a>, minus comments.</p>
<p>The next step, of course, was to find a way to allow Python to call Prolog predicates. As I was using SWI-Prolog, I downloaded <a href="https://code.google.com/p/pyswip/">PySWIP</a>.</p>
<p><a href="https://code.google.com/p/pyswip/">PySWIP</a> is a simple gateway between the SWI-Prolog interpreter and Python. The project was briefly orphaned for a while and the project&#8217;s author is actively looking for another developer to take the reins, so I can&#8217;t recommend this as an enterprise-grade solution. However, it seemed that for my purposes it would work just fine.</p>
<p>PySWIP did not work right out of the box. I had SWI-Prolog 5.10.4 installed on my machine and the latest version that PySWIP supported at the time was 5.6.34. Running</p>
<p><code>from pyswip import Prolog</code></p>
<p>resulted in </p>
<p><code>libpl (shared) not found. Possible reasons:<br />
1) SWI-Prolog not installed as a shared library. Install SWI-Prolog (5.6.34 works just fine)</code></p>
<p>Fortunately the fix was easy. After some Googling I surmised that the issue stemmed from the fact that libpl.dll had been renamed to swipl.dll in the versions after 5.6.34. Navigating to C:\Program Files\pl\bin and making a copy of swipl.dll named libpl.dll did the trick.</p>
<p>Here&#8217;s a little example of using an external Prolog program in Python.</p>
<p><code>from pyswip import Prolog</code></p>
<p><code>prolog = Prolog()</code></p>
<p><code>prolog.consult("appraise.pl")</code></p>
<p><code># A couple preliminary assertions.<br />
prolog.assertz("value(banana, 1 rdiv 4, bitcoin)")<br />
prolog.assertz("value(bitcoin, 1 rdiv 30, namecoin)")<br />
prolog.assertz("value(apple, 3 rdiv 4, banana)")<br />
prolog.assertz("value(orange, 1 rdiv 5, apple)")</code></p>
<p><code># Now, how much is an orange worth in bitcoins?<br />
result = prolog.query("appraise_float(orange, Price, bitcoin)").next()<br />
print "An orange is worth %s bitcoins." % result["Price"]</code></p>
<p><code># And how much is a bitcoin worth in apples?<br />
result = prolog.query("appraise_float(bitcoin, Price, apple)").next()<br />
print "A bitcoin is worth %s apples." % result["Price"]</code></p>
<p>Running this results in<br />
<code><br />
An orange is worth 0.0375 bitcoins.<br />
A bitcoin is worth 5.33333333333 apples.<br />
</code></p>
<p>Next up: <a href="http://ryepdx.com/2012/02/prolog-in-python-pt-2/">SWI-Prolog/MySQL integration</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2011/09/prolog-in-python-pt-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bitcoins: A rebuttal to Tim Fernholz</title>
		<link>http://ryepdx.com/2011/06/bitcoins%3A-a-rebuttal-to-tim-fernholz/</link>
		<comments>http://ryepdx.com/2011/06/bitcoins%3A-a-rebuttal-to-tim-fernholz/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 12:29:46 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Tim Fernholz:

<a href="http://www.good.is/post/why-bitcoin-is-a-scam/">This</a> is one of the worst-written articles about Bitcoin I've read so far. Certainly not worthy of your publication's name. If you don't understand something, don't write about it. :-p

Your description of mining is so broken I'm not even going to try to fix it. Just do some more reading of low-level descriptions until you understand how very wrong your description of miners as "decoders" is.

"...it’s a massive experiment in group trust."]]></description>
			<content:encoded><![CDATA[<p>Tim Fernholz:</p>
<p><a href="http://www.good.is/post/why-bitcoin-is-a-scam/">This</a> is one of the worst-written articles about Bitcoin I&#8217;ve read so far. Certainly not worthy of your publication&#8217;s name. If you don&#8217;t understand something, don&#8217;t write about it. :-p</p>
<p>Your description of mining is so broken I&#8217;m not even going to try to fix it. Just do some more reading of low-level descriptions until you understand how very wrong your description of miners as &#8220;decoders&#8221; is.</p>
<p>&#8220;&#8230;it’s a massive experiment in group trust.&#8221;<br />
Bitcoin is far from an experiment in group trust. It&#8217;s guiding principle is *distrust* of everything but the copy of the block chain residing on your own hard drive. Your statement seems to find its roots in your ignorance of the network&#8217;s mechanics.</p>
<p>&#8220;That’s a crazy amount of money to have stolen&#8230;&#8221;<br />
Yep, that&#8217;s a lot of money to have stolen. The moral of the story is that if you have over a quarter of a million dollars worth of bitcoins sitting on your hard drive, *take some steps to secure them!* This is new ground for most people, but honestly it&#8217;s nothing that can&#8217;t be learned. To help the everyman, wallets will likely be encrypted and password protected in future versions of the Bitcoin client.</p>
<p>&#8220;Bitcoin is a libertarian’s dream come true&#8230;&#8221;<br />
Not just a dream come true for libertarians. Also a dream come true for anyone who has ever pined for a convenient, politically neutral international currency, or an easy, cheap way of engaging in micro-transactions.</p>
<p>&#8220;So far, you can’t buy anything with bitcoins that you couldn’t purchase more easily with cash or a credit card.&#8221;<br />
Aside from anything your government or credit card processor (assuming the vendor isn&#8217;t close enough for a physical cash transaction) doesn&#8217;t want you buying, that is. Most American citizens probably won&#8217;t care much about this one, save for all the folks who&#8217;ve had their PayPal accounts frozen at one point or another, or all those folks who support privately embargoed organizations like Wikileaks.</p>
<p>&#8220;&#8230;major exchanges like MtGox have fallen to hackers.&#8221;<br />
The theft of $1,000 USD due to a *financial auditor&#8217;s* gaffe is hardly grounds for declaring Mt. Gox &#8220;fallen to hackers.&#8221; Also, can you point out to me one other exchange that has been similarly compromised? Because you&#8217;re using the plural, which implies there was more than one. Oh, there wasn&#8217;t? You mean you got your facts wrong *again?* Oh snap! :-p</p>
<p>&#8220;&#8230;the system presents a huge opportunity for big fish to take advantage of the Internet everyman.&#8221;<br />
You&#8217;re right, the central banking system is WAY better. Those bankers are so honest and adept at managing our money! They would NEVER take bonuses using taxpayer money right after tanking the global economy. SO much fairer.</p>
<p>Should I beat you over the head with that one some more, or do you get it? :-p</p>
<p>&#8220;&#8230;Bitcoin won’t work because it accrues such a huge advantage to people who can bring the most computing power to bear on clearing transactions.&#8221;<br />
You mean kinda like credit card companies? Herp derp.</p>
<p>&#8221; If any single person or group controlled a majority of computing power in the network&#8230;&#8221;<br />
&#8230;they could have hacked your bank account a long time ago.</p>
<p>&#8220;It’s hard to trust a monetary system concocted and managed by anonymous hackers&#8230;&#8221;<br />
Not really managed by them. If anyone deviates from the network&#8217;s protocol, they isolate themselves from the network. The official client gets pretty features added to it every once in a while by a guy named Gavin Andresen and five other developers, of whom only Satoshi is anonymous, to help out herp derps like yourself, but the essential elements never change. Although there *is* a continuous stream of essentially anonymous code auditors who spend their spare time reading the client&#8217;s source code on the project&#8217;s Github page. Perhaps those were the &#8220;anonymous hackers&#8221; you&#8217;re talking about?</p>
<p>Or maybe it&#8217;s the guys running Mt. Gox. You know, the same ones whose security was compromised because they were trying to comply with government regulations and the freaking financial auditor ended up having a freaking virus on his system.  Those guys are ano&#8211; oh wait, it&#8217;s run by K.K. Tibanne Co, a totally legitimate Japanese company.</p>
<p>To be fair, there are a lot of tiny garage startups that make up a good portion of the rest of the Bitcoin economy. I&#8217;d say that&#8217;s a good thing, though: I&#8217;ve never heard anyone complain about an economy having too many startups, or too much innovation, or too many opportunities. It&#8217;s ultimately an indication of the innovation and further democratization of the global economy that Bitcoin encourages.</p>
<p>&#8220;Bitcoin still offers a glimpse of a future in which the dollar is digitized&#8230;&#8221;<br />
Oh, cool. So right after complaining about the pitfalls of a digital currency (&#8220;that&#8217;s a crazy amount of money to have stolen by someone essentially copying a file from your hard drive,&#8221; remember?) you&#8217;re then going to advocate a system that not only has THOSE pitfalls, but also the pitfalls of our current centralized banking system. Awesome. Well done. Herp to the friggin&#8217; derp.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2011/06/bitcoins%3A-a-rebuttal-to-tim-fernholz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Idea</title>
		<link>http://ryepdx.com/2011/02/idea/</link>
		<comments>http://ryepdx.com/2011/02/idea/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 02:34:02 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Here's an idea I would like to play with if only I had more time. If anyone out there is interested and decides to play with it, or if you want to pick my brain, tell me.

I was thinking about the shortage of programmers and tech workers and the shortage of most other kinds of employment these days. It seems to me that if good technical education were more accessible, a lot of people would be a lot better off.
]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s an idea I would like to play with if only I had more time. If anyone out there is interested and decides to play with it, or if you want to pick my brain, tell me.</p>
<p>I was thinking about the shortage of programmers and tech workers and the shortage of most other kinds of employment these days. It seems to me that if good technical education were more accessible, a lot of people would be a lot better off.</p>
<p>So why not create a system to automate the education of people in programming? That would be the easiest: teaching people how to program automatically. Just set up online lessons with live teachers at first. Have an &#8220;ideal&#8221; solution for each assignment. Let the teacher grade projects by hand at first.</p>
<p>As the teacher teaches and grades, let there be an algorithm monitoring and recording all the questions and answers students ask during and after lectures. Let it also record the errors made in assignments and the teacher&#8217;s notes when corrections are made. Let the algorithm suggest responses to the teacher based on past answers given. Let students directly question the algorithm for information given in response to questions during and after lessons, and for questions regarding assignments they&#8217;ve already completed.</p>
<p>Eventually the algorithm would be able to take over the teaching of most of the classes. Students should be encouraged to help each other after each lesson as well, to answer questions the algorithm could not. These too could be used to enhance the algorithm, though they would need to be screened for appropriateness.</p>
<p>The project should be supported by donations and volunteers. Those who graduate from the program in particular should be encouraged to help the new students that come after them. This could mean participating in after-lesson talks or simply responding to questions the algorithm can&#8217;t answer yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2011/02/idea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lifestreaming</title>
		<link>http://ryepdx.com/2010/09/lifestreaming/</link>
		<comments>http://ryepdx.com/2010/09/lifestreaming/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 19:02:33 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Boy, has it been a busy last couple months! I got a job at a startup so that's consuming my life. The rock tour never took off, though I did end up going to Canada. Now I have a few seconds before I run off to participate in my writer's group.

I'm starting up the first bits of the Lifestream project. To keep from annoying people too much, I'm relegating it all to certain channels. The first channel is up:

http://twitter.com/ryanslifestream

Check it out.

Ciao!]]></description>
			<content:encoded><![CDATA[<p>Boy, has it been a busy last couple months! I got a job at a startup so that&#8217;s consuming my life. The rock tour never took off, though I did end up going to Canada. Now I have a few seconds before I run off to participate in my writer&#8217;s group.</p>
<p>I&#8217;m starting up the first bits of the Lifestream project. To keep from annoying people too much, I&#8217;m relegating it all to certain channels. The first channel is up:</p>
<p>http://twitter.com/ryanslifestream</p>
<p>Check it out.</p>
<p>Ciao!</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2010/09/lifestreaming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft kills the Courier</title>
		<link>http://ryepdx.com/2010/04/microsoft-kills-the-courier/</link>
		<comments>http://ryepdx.com/2010/04/microsoft-kills-the-courier/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 15:58:23 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Behold, Microsoft hath declared the Courier dead:
http://www.engadget.com/2010/04/29/microsoft-confirms-kills-courier-in-one-fell-swoop/

This means that part of my plan for lifestreaming is no more. Still, I'm pretty sure I can find a way to work around it...

More news to come... sometime.]]></description>
			<content:encoded><![CDATA[<p>Behold, Microsoft hath declared the Courier dead:</p>
<p>http://www.engadget.com/2010/04/29/microsoft-confirms-kills-courier-in-one-fell-swoop/</p>
<p>This means that part of my plan for lifestreaming is no more. Still, I&#8217;m pretty sure I can find a way to work around it&#8230;</p>
<p>More news to come&#8230; sometime.</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2010/04/microsoft-kills-the-courier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keeping PEAR HTTP_Client session data across pages</title>
		<link>http://ryepdx.com/2010/04/keeping-pear-http_client-session-data-across-pages/</link>
		<comments>http://ryepdx.com/2010/04/keeping-pear-http_client-session-data-across-pages/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 17:34:14 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[I just spent three hours banging my head against this problem, so I hope I can save you the trouble if you're where I was.
]]></description>
			<content:encoded><![CDATA[<p>I just spent three hours banging my head against this problem, so I hope I can save you the trouble if you&#8217;re where I was.</p>
<p>I was trying to save an HTTP_Client object in a PHP session so that it would maintain its session data as it got moved from page to page. The idea was to log into a website with it and then go to another page where it would be used by various PHP scripts called by AJAX to perform tasks on the website I&#8217;d logged into. The only problem: I was getting logged out of the &#8216;site every time I left the script which logged me in. Somehow the HTTP_Client&#8217;s session data was being lost simply by my storing it in $_SESSION.</p>
<p>I made sure I was serializing and unserializing:</p>
<pre>
$_SESSION['client'] = serialize($client);
...
$client = unserialize($_SESSION['client']);
</pre>
<p>Still nothing. I scoured the Internet for people who were having similar problems. The only thing anybody could tell me was &#8220;are you remembering to serialize and unserialize?&#8221; I scoured the pitifully scant documentation on pear.php.net, trying to glean some shred of insight.</p>
<p>Still nothing.</p>
<p>So I decided to brute force the thing and trace the HTTP_Client&#8217;s code by hand. After mangling my beautiful PEAR classes with debug code, I noticed line 78 of CookieManager.php:</p>
<pre>function HTTP_Client_CookieManager($serializeSession = false)</pre>
<p>&#8220;Wait, a minute,&#8221; I thought, &#8220;you&#8217;ve got to be kidding me.&#8221; I changed that sucker to:</p>
<pre>function HTTP_Client_CookieManager($serializeSession = true)</pre>
<p>And it worked!</p>
<p>Now before you go hacking your PEAR modules, here&#8217;s the *right* way to do it:</p>
<pre>$manager = new HTTP_Client_CookieManager(true);
$client = new HTTP_Client(null, null, $manager);</pre>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2010/04/keeping-pear-http_client-session-data-across-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Roll Your Own Shoestring Rock Tour</title>
		<link>http://ryepdx.com/2010/03/roll-your-own-shoestring-rock-tour/</link>
		<comments>http://ryepdx.com/2010/03/roll-your-own-shoestring-rock-tour/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 22:36:36 +0000</pubDate>
		<dc:creator>FrankWalker</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Well, I've done it. I've broken the whole "responsible" path I've been hellbent on since I was a youth. I'm going on a rock tour across the USA with my band this summer. Sleeping on couches, eating on just $4 a day... oh this is going to be good. :-)

You can keep updated on my adventures as we plan this thing  out and finally carry it through to execution at http://shoestringtour.blogspot.com]]></description>
			<content:encoded><![CDATA[<p>Well, I&#8217;ve done it. I&#8217;ve broken the whole &#8220;responsible&#8221; path I&#8217;ve been hellbent on since I was a youth. I&#8217;m going on a rock tour across the USA with my band this summer. Sleeping on couches, eating on just $4 a day&#8230; oh this is going to be good. <img src='http://ryepdx.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>You can keep updated on my adventures as we plan this thing  out and finally carry it through to execution at http://shoestringtour.blogspot.com</p>
]]></content:encoded>
			<wfw:commentRss>http://ryepdx.com/2010/03/roll-your-own-shoestring-rock-tour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

