<?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:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-36457300</id><updated>2009-09-29T20:12:00.420-07:00</updated><title type='text'>PeerIt.com</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36457300.post-1814928663373618668</id><published>2007-07-28T15:48:00.000-07:00</published><updated>2007-07-28T15:54:55.034-07:00</updated><title type='text'>New Client - Needs Testing</title><content type='html'>New client is done..but not fully tested yet.  It is fully backwards compatible with the old client.  The biggest key improvement is the integrated sell feature in the client.  Selling and seeding experience is greatly improved.
&lt;ol&gt;
&lt;li&gt;make torrent tool&lt;/li&gt;
&lt;li&gt;create torrent&lt;/li&gt;
&lt;li&gt;click sell it on peerit&lt;/li&gt;
&lt;li&gt;you will be prompted for your peerit username and password&lt;/li&gt;
&lt;li&gt;you will automatically start seeding you peerit.com item&lt;/li&gt;
&lt;li&gt;the client will launch your web browser and bring you to the edit your item page for this torrent&lt;/li&gt;
&lt;li&gt;manditory modifications are: description, payment methods, tags, and category&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-1814928663373618668?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/1814928663373618668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=1814928663373618668&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/1814928663373618668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/1814928663373618668'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/07/new-client-needs-testing.html' title='New Client - Needs Testing'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-2057326621331575196</id><published>2007-07-26T16:54:00.000-07:00</published><updated>2007-08-09T12:45:09.941-07:00</updated><title type='text'>MultipartPostHandler doesn't work for unicode files</title><content type='html'>I am in the middle of upgrading the PeerIt client to use the latest and greatest bittorrent code.  While I am at it, I have decided to make the sell process easier by having the client post the torrent to the web server and start seeding automatically.  I feel this will ease the listing process.  In order to do this, I need to post a multipart form with the torrent file.  Unfortunately urllib2 does not have support for this.  http://pipe.scs.fsu.edu/PostHandler/MultipartPostHandler.py was a nice piece of code I found, in order to use urllib2 to do the posting.  I need to still use urllib2 in order to maintain cookies which are used by PeerIt.com login.  Unfortunately this piece of code did not work as is for uploading torrent files.  This is because torrent files have unicode characters in them.  The following is the MultipartPostHandler.py that does work with unicode.  The fix was to create the header using StringIO instead of plain old string class...

&lt;textarea cols="50" rows="60" readonly wrap="off"&gt;
#!/usr/bin/python

####
# 02/2006 Will Holcomb &lt;wholcomb@gmail.com&gt;
# 
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# 7/26/07 Slightly modified by Brian Schneider  
# in order to support unicode files ( multipart_encode function )
"""
Usage:
  Enables the use of multipart/form-data for posting forms

Inspirations:
  Upload files in python:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
  urllib2_file:
    Fabien Seisen: &lt;fabien@seisen.org&gt;

Example:
  import MultipartPostHandler, urllib2, cookielib

  cookies = cookielib.CookieJar()
  opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
                                MultipartPostHandler.MultipartPostHandler)
  params = { "username" : "bob", "password" : "riviera",
             "file" : open("filename", "rb") }
  opener.open("http://wwww.bobsite.com/upload/", params)

Further Example:
  The main function of this file is a sample which downloads a page and
  then uploads it to the W3C validator.
"""

import urllib
import urllib2
import mimetools, mimetypes
import os, stat
from cStringIO import StringIO

class Callable:
    def __init__(self, anycallable):
        self.__call__ = anycallable

# Controls how sequences are uncoded. If true, elements may be given multiple values by
#  assigning a sequence.
doseq = 1

class MultipartPostHandler(urllib2.BaseHandler):
    handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first

    def http_request(self, request):
        data = request.get_data()
        if data is not None and type(data) != str:
            v_files = []
            v_vars = []
            try:
                 for(key, value) in data.items():
                     if type(value) == file:
                         v_files.append((key, value))
                     else:
                         v_vars.append((key, value))
            except TypeError:
                systype, value, traceback = sys.exc_info()
                raise TypeError, "not a valid non-string sequence or mapping object", traceback

            if len(v_files) == 0:
                data = urllib.urlencode(v_vars, doseq)
            else:
                boundary, data = self.multipart_encode(v_vars, v_files)

                contenttype = 'multipart/form-data; boundary=%s' % boundary
                if(request.has_header('Content-Type')
                   and request.get_header('Content-Type').find('multipart/form-data') != 0):
                    print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data')
                request.add_unredirected_header('Content-Type', contenttype)

            request.add_data(data)
        
        return request

    def multipart_encode(vars, files, boundary = None, buf = None):
        if boundary is None:
            boundary = mimetools.choose_boundary()
        if buf is None:
            buf = StringIO()
        for(key, value) in vars:
            buf.write('--%s\r\n' % boundary)
            buf.write('Content-Disposition: form-data; name="%s"' % key)
            buf.write('\r\n\r\n' + value + '\r\n')
        for(key, fd) in files:
            file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
            filename = fd.name.split('/')[-1]
            contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
            buf.write('--%s\r\n' % boundary)
            buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename))
            buf.write('Content-Type: %s\r\n' % contenttype)
            # buffer += 'Content-Length: %s\r\n' % file_size
            fd.seek(0)
            buf.write('\r\n' + fd.read() + '\r\n')
        buf.write('--' + boundary + '--\r\n\r\n')
        buf = buf.getvalue()
        return boundary, buf
    multipart_encode = Callable(multipart_encode)

    https_request = http_request

def main():
    import tempfile, sys

    validatorURL = "http://validator.w3.org/check"
    opener = urllib2.build_opener(MultipartPostHandler)

    def validateFile(url):
        temp = tempfile.mkstemp(suffix=".html")
        os.write(temp[0], opener.open(url).read())
        params = { "ss" : "0",            # show source
                   "doctype" : "Inline",
                   "uploaded_file" : open(temp[1], "rb") }
        print opener.open(validatorURL, params).read()
        os.remove(temp[1])

    if len(sys.argv[1:]) &gt; 0:
        for arg in sys.argv[1:]:
            validateFile(arg)
    else:
        validateFile("http://www.google.com")

if __name__=="__main__":
    main()

&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-2057326621331575196?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/2057326621331575196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=2057326621331575196&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/2057326621331575196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/2057326621331575196'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html' title='MultipartPostHandler doesn&apos;t work for unicode files'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-8040035297748071114</id><published>2007-07-09T16:32:00.000-07:00</published><updated>2007-07-09T16:36:01.868-07:00</updated><title type='text'>New Client In The Works</title><content type='html'>One of the biggest bummers about PeerIt.com in my opinion is the out dated client.  The  bittorrent code base that PeerIt client and tracker is currently based off of is 4.2.2.  Last night I began completely redoing the client and tracker and basing it off of the 5.0.8 bittorrent code base.  This client is much much nicer.  One of the big benefits is that it docs in the system tray, and gets launched at startup.  Meaning that seeding your items will be come automatic and simplified.  Along with this is all the nice eye candy that comes in the new client.  Look forward to its release in the coming weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-8040035297748071114?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/8040035297748071114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=8040035297748071114&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/8040035297748071114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/8040035297748071114'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/07/new-client-in-works.html' title='New Client In The Works'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-3703555150757622262</id><published>2007-05-06T11:18:00.001-07:00</published><updated>2007-05-08T15:25:25.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='profit'/><category scheme='http://www.blogger.com/atom/ns#' term='share'/><category scheme='http://www.blogger.com/atom/ns#' term='legal'/><category scheme='http://www.blogger.com/atom/ns#' term='torrent'/><category scheme='http://www.blogger.com/atom/ns#' term='peerit'/><title type='text'>PeerIt.com goes live</title><content type='html'>Sell your torrents on PeerIt.com.  Buyers make money by sharing your purchases.  Looking to sell your movies online.  Have a garage band that you want to turn into a business.  PeerIt.com is now officially live with active buyers and sellers.  There are no fees for selling any of your digital goods on PeerIt.com.  PeerIt is fully integrated with both PayPal and Google Checkout, allowing you to easily post your item, and accept credit cart payments with no additional work or baby sitting of you product.  While Google Checkout is free (which is for at least until the end of this year), selling your items on PeerIt is 100% free.  Buyers getting in on hot items early can look forward to making there money back, by helping distribute the items they have purchased automatically with the PeerIt download client.  PeerIt is built on the BitTorrent network, so transfer rates are blindingly fast.  Both buyers and sellers can profit from torrents at PeerIt.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-3703555150757622262?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/3703555150757622262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=3703555150757622262&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/3703555150757622262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/3703555150757622262'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/05/peeritcom-goes-live_06.html' title='PeerIt.com goes live'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-124685083025330997</id><published>2007-04-19T11:20:00.000-07:00</published><updated>2007-04-19T11:25:14.759-07:00</updated><title type='text'>Almost live - beta running</title><content type='html'>&lt;a href="http://beta.peerit.com"&gt; beta.peerit.com&lt;/a&gt; will be running using PayPal and Google Checkout Sandbox accounts.  You will always be able to play with PeerIt.com without having to worry about real money.  &lt;a href="http://www.peerit.com"&gt;www.peerit.com&lt;/a&gt; is now also running.  It is currently using sandbox accounts as well.  &lt;a href="www.peerit.com"&gt;www.peerit.com&lt;/a&gt; will officially go live, using real Google Checkout and PayPal in the coming days.  Stay tuned...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-124685083025330997?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/124685083025330997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=124685083025330997&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/124685083025330997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/124685083025330997'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/04/almost-live-beta-running.html' title='Almost live - beta running'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-3375420335015903578</id><published>2007-03-01T00:21:00.000-08:00</published><updated>2007-03-01T11:05:46.114-08:00</updated><title type='text'>Django ifequal is broken for negative numbers</title><content type='html'>If you are using django version 0.95 like I am, you may have noticed the following code does not work.
&lt;textarea cols="50" rows="15" readonly wrap="off"&gt;
{% ifequal some_negative_variable -1 %}
    it is negative
{% else %}
   it is not negative
{% endifequal %}
&lt;/textarea&gt;
Here is the code for my custom templatetag ifneg which I wrote to test just for negative numbers, since that is all I needed to do.  If you don't have the 5 minutes it takes to write this function, feel free to copy mine

&lt;textarea cols="50" rows="15" readonly wrap="off"&gt;

from django import template

register = template.Library()

class IfNegNode(template.Node):
    def __init__(self, var, nodelist_true, nodelist_false):
        self.var = var
        self.nodelist_true  = nodelist_true
        self.nodelist_false = nodelist_false
        
    def __iter__(self):
        for node in self.nodelist_true:
            yield node
        for node in self.nodelist_false:
            yield node
            
    def render(self, context):
        value = template.resolve_variable(self.var, context)
        #make sure it is a number
        value = int(value)
        
        if value &lt; 0:
            rv = self.nodelist_true.render(context)
        else:
            rv = self.nodelist_false.render(context) 
        
        return rv
    
@register.tag(name="ifneg")
def do_ifneg(parser, token):
    """
        negative number comparisons is broken, so i am writting my own.
        works with if else...so:
        {% ifneg var %}
            its negative
        {% else %}
            its not negative
        {% endifneg %}
    """
    try:
        # split_contents() knows not to split quoted strings.
        tokens = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents[0]
    if not len(tokens) == 2:
        raise template.TemplateSyntaxError, "is_neg should be in the format is_neg a" % token.contents[0]
        
    nodelist_true = parser.parse(('else', 'endifneg'))
    token = parser.next_token()
    if token.contents == 'else':
        nodelist_false = parser.parse(('endifneg',))
        parser.delete_first_token()
    else:
        nodelist_false = NodeList()
    return IfNegNode(tokens[1], nodelist_true, nodelist_false)
&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-3375420335015903578?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/3375420335015903578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=3375420335015903578&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/3375420335015903578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/3375420335015903578'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2007/03/django-ifequal-is-broken-for-negative.html' title='Django ifequal is broken for negative numbers'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116318516857836389</id><published>2006-11-10T10:40:00.000-08:00</published><updated>2006-11-20T09:26:36.420-08:00</updated><title type='text'>Python Decorators</title><content type='html'>I recently learned about decorators in python from &lt;a href="http://soiland.no/software/decorator"&gt;this guy&lt;/a&gt;.  And was able to implement a stack framework for django.  Now I can do the following:

&lt;pre&gt;
    @push_call_to_stack_decorator
    @login_decorator
        def add_payment_account(request):
            rv = add_payment_account_handler(request)
            if rv is None:
                #done -&gt; go back to caller
                shortcuts.pop_stack_response(request)
                rv = shortcuts.peek_stack_response(request)(request)
            return rv
&lt;/pre&gt;
Now, I realize that out of context, the above may not make much sense.  Without going into the technical details of how it works.  The add_payment_account page requires that a user is logged in.  If a user is not logged in, they are brought to the login page, and once logged in go to add_payment_account.  add_payment_account itself is pushed onto the call stack.  Therefore, pages the come off of add_payement_account can pop back to add_payment_account.  This framework will allow for easily creating webflows within my page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116318516857836389?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116318516857836389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116318516857836389&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116318516857836389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116318516857836389'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/11/python-decorators.html' title='Python Decorators'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116199497890016067</id><published>2006-10-27T17:19:00.001-07:00</published><updated>2006-10-27T17:22:58.900-07:00</updated><title type='text'>Backup</title><content type='html'>I permanently lost plenty of data off of my computers.  Hard drive crashes or otherwise (a few years back I adopted an 'no root when drunk' policy).  Well with all of this hard work I decided to back up some of this stuff off of my computer.   I found &lt;a href="http://www.4shared.com/"&gt;this&lt;/a&gt;  site that will host your data for free as long as it is less than a gig.  Well, this project doesn't have *that* much code.  Just need to remember to log in every now and then so they don't get rid of my free account.  If my place burns down, I will be damned if I lose my source code!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116199497890016067?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116199497890016067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116199497890016067&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116199497890016067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116199497890016067'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/backup_27.html' title='Backup'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116196620881559908</id><published>2006-10-27T09:19:00.001-07:00</published><updated>2006-10-27T09:24:27.380-07:00</updated><title type='text'>Note To Self - Don't Do Anything Illegal</title><content type='html'>&lt;blockquote&gt;
         &lt;!-- &lt;div class="navigation"&gt;   &lt;div class="left"&gt;&lt;font&gt;&amp;laquo;&lt;/span&gt; &lt;a href="http://not-a-real-namespace/http://not-a-real-namespace/http://not-a-real-namespace/http://torrentfreak.com/underage-finnish-bittorrent-admins-fined-60000-each/"&gt;Underage Finnish BitTorrent admins fined $60,000 each&lt;/a&gt;&lt;/div&gt;   &lt;div class="right"&gt;&lt;/div&gt;   &lt;div class="clear"&gt;&lt;/div&gt;  &lt;/div&gt; --&gt;                     &lt;div class="itemhead"&gt;      &lt;h3&gt;&lt;a href="http://torrentfreak.com/bittorrent-admin-sent-to-prison/" rel="bookmark" title="Permanent Link to &amp;quot;BitTorrent Site Admin Sent to Prison&amp;quot;"&gt;BitTorrent Site Admin Sent to Prison&lt;/a&gt;&lt;/h3&gt;                           &lt;/div&gt;                  &lt;p&gt;The 23 year old Grant Stanley has been sentenced to five months in prison, followed by five months of home detention, and a $3000 fine for the work he put in the private BitTorrent tracker Elitetorrents.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;will need to &lt;a href="http://video.google.com/support/bin/request.py?contact_type=policy"&gt;cover my ass like google&lt;/a&gt; does.

&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116196620881559908?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116196620881559908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116196620881559908&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116196620881559908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116196620881559908'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/note-to-self-dont-do-anything-illegal_27.html' title='Note To Self - Don&apos;t Do Anything Illegal'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116172977719655539</id><published>2006-10-24T15:34:00.001-07:00</published><updated>2006-10-24T15:42:57.196-07:00</updated><title type='text'>Waves on my pond</title><content type='html'>&lt;a href="http://www.gizmodo.com/gadgets/portable-media/rumor-zune-to-pay-you-for-sharing-songs-209767.php:"&gt;found this article on digg today&lt;/a&gt;:
&lt;blockquote&gt;The Microsoft Zune may pay you for sharing a song with others if they end up buying that song themselves. As you probably know, the Zune's WiFi capability will let you send a song to another Zune user, and then that user can listen to it three times for free within three days, after which a prompt appears asking for $1 to buy it. As the rumor goes, Microsoft will give you an unspecified number of credits for passing along that song that was later bought. Then, you can redeem those credits for free music or anything else from the Zune Marketplace.   &lt;p&gt;This is a great idea. If enough people buy into Zune, the product will reach critical mass, and because of this bounty, everyone will be eager to offer their song lists to others, hoping to amass enough credits to buy more music. It's viral/incentive marketing on a micro-payment scale. If this is just a false rumor, if I were Microsoft I would do it anyway. &lt;span class="byline"&gt;– Charlie White&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span class="byline"&gt;&lt;/span&gt;&lt;/p&gt;PeerIt.com value proposition:
&lt;ul&gt;&lt;li&gt;All kinds of digitally deliverable goods&lt;/li&gt;&lt;li&gt;Sell your own stuff - plenty of room for the little man
&lt;/li&gt;&lt;li&gt;Real money back to the buyers&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116172977719655539?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116172977719655539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116172977719655539&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116172977719655539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116172977719655539'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/waves-on-my-pond_24.html' title='Waves on my pond'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116170468543041238</id><published>2006-10-24T08:37:00.000-07:00</published><updated>2006-10-24T13:39:29.706-07:00</updated><title type='text'>Captcha</title><content type='html'>They are those boxes with morphed images containing characters.  It stops computers programs or bots to get through your forms - for now.  Why?  Because its hard to write an application to read the characters.  Although &lt;a href="http://schneider.no-ip.org:8080/face"&gt;computer vision does work&lt;/a&gt; , it is pretty processor intensive.

I want a captcha for my signup page.  The reason is that one of the errors I give on the signup page is "this account already exists".  I am currently planning on using email addresses for user names (although this is something I will need to think long and hard about).  I don't want a bot to be able to enumerate my database, by trying to get the account already exists message by creating lots and lots of dummy accounts. 

I found bunch captcha code out there.  One piece of code that I really liked was &lt;a href="http://svn.navi.cx/misc/trunk/pycaptcha/"&gt;pycaptcha.&lt;/a&gt;  It &lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;is a python captcha generator.  Check it out.  only a few lines of code and I have a working captcha in the django framework.

&lt;blockquote&gt;
&lt;pre&gt;
import Captcha
from Captcha.Visual.Tests import PseudoGimpy
import StringIO


def captcha(request):
    g = PseudoGimpy()
    s = StringIO.StringIO()
    i = g.render()
    i.save(s, 'JPEG')
    request.session['captcha'] = g.solutions[0]
    return HttpResponse(s.getvalue(), 'image/jpg')&lt;/blockquote&gt;
&lt;/pre&gt;

now just to integrate it into my signup page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116170468543041238?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116170468543041238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116170468543041238&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116170468543041238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116170468543041238'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/captcha.html' title='Captcha'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116164567237665579</id><published>2006-10-23T16:08:00.000-07:00</published><updated>2006-10-23T16:28:14.503-07:00</updated><title type='text'>Dealing With Money</title><content type='html'>How do people trade money online today?

PayPal seems to be the way things are done for most people.  My first thoughts where that PayPal would be *the* way money is handled for PeerIt.com.  I am starting to have second thoughts.  Why get tied down to one.  I was recently told about neteller.com by a friend of mine.  Looks like they are pretty similar to PayPal, but there are some important differences

Transaction Fees&lt;ul&gt;&lt;li&gt;paypal - personal accounts free, premier 3% + 30 cents per txn&lt;/li&gt;&lt;li&gt;neteller - 1.9% p2p payment&lt;/li&gt;&lt;/ul&gt;User Agreement
&lt;ul&gt;&lt;li&gt;PayPal - pretty restrictive - no p0rn, no gambling  - why take the fun out of it.
&lt;/li&gt;&lt;li&gt;neteller - wow - as long as your not a terrorist, its all good baby.
&lt;/li&gt;&lt;/ul&gt;Usability
&lt;ul&gt;&lt;li&gt;PayPal - whatever...i am used to it..so is everyone else&lt;/li&gt;&lt;li&gt;Neteller - never used it.  But online gambling addicted friend told me about it - how hard could it be.
&lt;/li&gt;&lt;/ul&gt;API
&lt;ul&gt;&lt;li&gt;Both support accepting payments, and a MassPay for affiliate payments.&lt;/li&gt;&lt;/ul&gt;How it all works in PeerIt.com:
   It would be nice to leave the option open to the seller.  How do they want to receive money.  How do they want to pay their affiliates.  PeerIt.com would need to link the PayPal/Neteller account to their Peerit.com user.   First rollout may just have PayPal support, but architecture should be open to support more.  All money stuff will be abstracted out in the code.  We should be able to plug into whatever payment system we like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116164567237665579?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116164567237665579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116164567237665579&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116164567237665579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116164567237665579'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/dealing-with-money.html' title='Dealing With Money'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36457300.post-116155480762561441</id><published>2006-10-22T15:02:00.000-07:00</published><updated>2006-10-22T15:39:26.916-07:00</updated><title type='text'>Sharing is Caring</title><content type='html'>This blog was created for the PeerIt.com project.  PeerIt.com will be a distribution channel for digitally deliverable goods.  A truley peer to peer community with everything from community, file distribution, and its payment strategy.

Community where Buyers are Sellers:
PeerIt.com relies on the communtiy of sellers and buyers to help each other.
&lt;ul&gt;&lt;li&gt;  A seller posts digitial goods for sale, along with the affiliate rate.&lt;/li&gt;&lt;li&gt;      A buyer purchases the good, and downloads it via a custom peer-2-peer client&lt;/li&gt;&lt;li&gt;      Buyer  becomes affiliate for the Seller, helping upload to the next purchaser&lt;/li&gt;&lt;li&gt;      Seller's pay out affiliates based on how much the affilliate has uploaded, and the Seller's affiliate rate&lt;/li&gt;&lt;/ul&gt;
Feedback:
Have a great transaction? Buyers can post feedback on sellers.
All of the items sold on the site will have their own page
&lt;ul&gt;&lt;li&gt;    See item description&lt;/li&gt;&lt;li&gt;See what other purchasers have to say&lt;/li&gt;&lt;li&gt;If you have purchased the item, leave a comment&lt;/li&gt;&lt;li&gt;RSS feeds&lt;/li&gt;&lt;li&gt;Ask sellers a question&lt;/li&gt;&lt;li&gt;Read other questions and answers&lt;/li&gt;&lt;/ul&gt;
Get Real Money:
 PeerIt.com does not work with buyer credit or funny money.  We are working with cold hard cash.  Sellers will recieve cash from their buyers.  Buyers will recieve cash from the sellers for helping distribute files to more buyers.
 Accounting:&lt;ul&gt;&lt;li&gt;Accounts Payable
&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Each seller will have an accounts Payable&lt;/li&gt;&lt;li&gt;How much is owed to each affiliate&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Accounts  Receivable:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Buyer's can make money on their purchases.&lt;/li&gt;&lt;li&gt;Money is distributed to the Buyer from the Seller&lt;/li&gt;&lt;li&gt;         See how much money is owed to you.&lt;/li&gt;&lt;li&gt;            Which Sellers owe how much for what.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36457300-116155480762561441?l=peerit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peerit.blogspot.com/feeds/116155480762561441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=36457300&amp;postID=116155480762561441&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116155480762561441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36457300/posts/default/116155480762561441'/><link rel='alternate' type='text/html' href='http://peerit.blogspot.com/2006/10/sharing-is-caring.html' title='Sharing is Caring'/><author><name>Brian</name><uri>http://www.blogger.com/profile/00802126410957566407</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13707303761874734912'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>