<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="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" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1622718411609139367</atom:id><lastBuildDate>Thu, 19 Feb 2026 02:40:22 +0000</lastBuildDate><category>cl-twitter</category><title>cl-twitter</title><description>This blog tracks the progress on the cl-twitter common lisp api.</description><link>http://cl-twitter.blogspot.com/</link><managingEditor>noreply@blogger.com (mohegskunkworks)</managingEditor><generator>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-5029941344129740057</guid><pubDate>Thu, 05 May 2011 23:12:00 +0000</pubDate><atom:updated>2011-05-05T19:12:11.051-04:00</atom:updated><title>Using mongodb as a twitter persistence store</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt; is a &lt;a href=&quot;http://en.wikipedia.org/wiki/NoSQL&quot;&gt;nosql &lt;/a&gt;datastore developed by &lt;a href=&quot;http://www.10gen.com/&quot;&gt;10gen &lt;/a&gt;in New York City. MongoDB stores collections of key-value pairs called documents. The values associated with a key can even be other documents. A group of documents form a collection and collections make up a database.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Installing mongoDB is &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Quickstart&quot;&gt;easy&lt;/a&gt;. There are&amp;nbsp;&lt;a href=&quot;http://www.mongodb.org/downloads&quot;&gt;downloads&lt;/a&gt;  available for linux, mac osx and windows. Nevertheless, if you can&#39;t find a  pre-built executable, &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Building&quot;&gt;building&lt;/a&gt; one is pretty straightforward too.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Because there are &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Drivers&quot;&gt;drivers&lt;/a&gt; for a wide variety of programming languages, data stored in a mongoDB database can be accessed and analyzed by non lisp tools like the &lt;a href=&quot;http://www.nltk.org/&quot;&gt;natural language toolkit (nltk)&lt;/a&gt; or&amp;nbsp;&lt;a href=&quot;http://alias-i.com/lingpipe/&quot;&gt;lingpipe&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;MongoDB has many features like powerful querying facilities , map-reduce processing and data distribution through sharding. Consult the mongoDB website or books like &lt;a href=&quot;http://oreilly.com/catalog/0636920001096&quot;&gt;MongoDB: The definitive guide&lt;/a&gt; , &lt;a href=&quot;http://www.manning.com/banker/&quot;&gt;MongoDB in action&lt;/a&gt; or &lt;a href=&quot;http://www.apress.com/9781430230519&quot;&gt;The definitive guide to MongoDB.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The &lt;a href=&quot;http://common-lisp.net/project/elephant/&quot;&gt;elephant store&lt;/a&gt; discussed in the &lt;a href=&quot;http://cl-twitter.blogspot.com/2011/04/using-elephant-as-twitter-peristence.html&quot;&gt;previous post&lt;/a&gt; does not have a lot of these facilities and is probably the right choice if you just want to store data for analysis using lisp based tools. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You start by loading the :cl-twitter package into you image. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Next enable the in-memory cache with the (use-cache) command. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The driver specification consists of the host, port and database you&#39;d like to connect to.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; Here&#39;s an example session:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(use-cache)&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;STYLE-WARNING:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; redefining REGISTER-TWITTER-OBJECT (#&lt;standard-class twitter-user=&quot;&quot;&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;built-in-class cons=&quot;&quot;&gt;) in DEFMETHOD&lt;/built-in-class&gt;&lt;/standard-class&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;#&lt;standard-method (twitter-user=&quot;&quot; cons)=&quot;&quot; register-twitter-object=&quot;&quot; {1003b27e01}=&quot;&quot;&gt;&lt;/standard-method&gt;&lt;/span&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(use-db :twitter-mongodb-driver :spec &#39;&lt;span style=&quot;color: #cc0000;&quot;&gt;(host localhost port 27017 db twitter)&lt;/span&gt;)&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;;[...]&lt;br /&gt;
#&lt;standard-method (twitter-user=&quot;&quot; cons)=&quot;&quot; db-store-object=&quot;&quot; {1002ec44d1}=&quot;&quot;&gt;&lt;/standard-method&gt;&lt;/span&gt;&lt;br /&gt;
CL-USER&amp;gt;&lt;b&gt; (db-status)&lt;/b&gt;&lt;br /&gt;
mongodb driver loaded&lt;br /&gt;
last error : [{n : 0} {connectionId : 4} {err : NIL} {ok : 1.0d0} ]&lt;br /&gt;
last error : [{err : NIL} {n : 0} {nPrev : -1} {ok : 1.0d0} ]&lt;br /&gt;
(type-of CL-MONGO:MONGO) [name : TWITTER ] &lt;br /&gt;
&amp;nbsp;{[id : 6A90ACAF-D370-4C7F-9A0E-DEE88B6184EF] [port : 27017] [host : localhost] [db : twitter]} &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trend-list :&amp;nbsp;&amp;nbsp; 3.0d0 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trend :&amp;nbsp;&amp;nbsp; 18.0d0 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tweet :&amp;nbsp;&amp;nbsp; 51953.0d0 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; twitter-user :&amp;nbsp;&amp;nbsp; 50208.0d0 &lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In the session above the specification list  will be saved as the default specification. You can use the :tag keyword  to save a non-default specification. The next time you load the driver  you only need to supply the driver keyword (or the tag name if it&#39;s not  the default).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Each tweet entity is converted to a document which is essentially a hash map. Each document has a unique id. This id is stored with a magic key name. If this key is not present the server will assign a unique key. The mongoDB driver sets the unique id before sending the document to the mongoDB server. This id is either the id returned by the twitter api or is generated from attribute values of the tweet entity.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Each tweet entity has its own separate collection in the  database.&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; When an entity is embedded in an other entity (like twitter-user in tweet), the embedded entity will be stored in it&#39;s own collection.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You can access the data in MongoDB using the &lt;a href=&quot;https://github.com/fons/cl-mongo&quot;&gt;cl-mongo lisp package&lt;/a&gt;.&amp;nbsp; As mentioned there are drivers in a variety of languages available.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The internals of the driver are very similar to those of the elephant driver discussed &lt;a href=&quot;http://cl-twitter.blogspot.com/2011/04/using-elephant-as-twitter-peristence.html&quot;&gt;earlier.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;That particular &lt;a href=&quot;http://cl-twitter.blogspot.com/2011/04/using-elephant-as-twitter-peristence.html&quot;&gt;particular post&lt;/a&gt; also shows how to use the other interface methods work.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/05/using-mongodb-as-twitter-persistence.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-1807227442630757496</guid><pubDate>Tue, 19 Apr 2011 22:54:00 +0000</pubDate><atom:updated>2011-04-19T18:54:44.572-04:00</atom:updated><title>Using elephant as a twitter peristence store</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In my previous post I  discussed the persistence interface. This post will focus on the  &lt;a href=&quot;http://www.cl-user.net/asp/3Fs81/sdataQvSO90MI8eU7DQ3eWHpX8yBX8yBXnMq=/sdataQu3F$sSHnB==&quot;&gt;elephant&lt;/a&gt; driver. To quote from the introduction of the manual: &#39;Elephant is a persistent object protocol and database for common lisp&#39;.&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In order to use the elephant driver, you&#39;d need to have  an elephant data store set up. The first step would be to install the &lt;a href=&quot;http://common-lisp.net/project/elephant/&quot;&gt;elephant&lt;/a&gt; package and it&#39;s dependencies. I&#39;ve had the best results using v 1.0 in the darcs repository :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;darcs get http://www.common-lisp.net/project/elephant/darcs/elephant-1.0&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The back end I&#39;m the most familiar with is &lt;a href=&quot;http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html&quot;&gt;Berkeley db (BDB)&lt;/a&gt; . To use it you need to &lt;a href=&quot;http://download.oracle.com/docs/cd/E17076_02/html/installation/index.html&quot;&gt;build&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;a href=&quot;http://www.oracle.com/technetwork/database/berkeleydb/downloads/index-082944.html&quot;&gt;version 4.5&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; of BDB for your platform. Next select a configuration in my-config.sexp, as detailed in the &lt;a href=&quot;http://common-lisp.net/project/elephant/doc/Berkeley-DB-Example.html#Berkeley-DB-Example&quot;&gt;elephant manual&lt;/a&gt;. Comment out (or remove) all other configurations from the file. Next try to open a data store. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;BDB stores data on the file system so you&#39;d need to specify a path to  the location on your file system where you&#39;d like to store your data : &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(use-package :elephant) &lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(open-store &#39;(:BDB &lt;u&gt;{path to db files}&lt;/u&gt;))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;If this is successful, load the cl-twit-repl package and the elephant db driver&amp;nbsp; :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(use-package :cl-twit-repl)&lt;br /&gt;
T&lt;/b&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(use-cache)&lt;/b&gt;&lt;br /&gt;
STYLE-WARNING:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; redefining REGISTER-TWITTER-OBJECT (#&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #) in DEFMETHOD&lt;br /&gt;
#&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(use-db :twitter-elephant-driver :spec&amp;nbsp; &#39;(:BDB &quot;/Users/fons/Data/bdb/twitter/&quot;))&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
; loading system definition from /Users/fons/.sbcl/systems/elephant.asd&lt;br /&gt;
; into #&lt;br /&gt;
; registering # as ELEPHANT&lt;br /&gt;
; loading system definition from /Users/fons/.sbcl/systems/uffi.asd into&lt;br /&gt;
; #&lt;br /&gt;
; registering # as UFFI&lt;br /&gt;
Attempting to load libmemutil.dylib...&lt;br /&gt;
[......]&lt;br /&gt;
STYLE-WARNING: Implicitly creating new generic function CHECKPOINT.&lt;br /&gt;
STYLE-WARNING: Implicitly creating new generic function BUILD-BTREE-INDEX.&lt;br /&gt;
STYLE-WARNING: Implicitly creating new generic function POPULATE.&lt;br /&gt;
#&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The  next step is to call &lt;span style=&quot;color: blue;&quot;&gt;(public-timeline)&lt;/span&gt; and &lt;span style=&quot;color: blue;&quot;&gt;(trends)&lt;/span&gt; from the repl. This should cause  the first batch of tweets and users the be saved in the data store. You can check to see if this happened by calling &lt;span style=&quot;color: blue;&quot;&gt;(db-status)&lt;/span&gt;. You should see something similar to this :&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;CL-USER&amp;gt; (db-status)&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;store : BDB-STORE-CONTROLLER....&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;walking over packages in the root&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TREND :&amp;nbsp;&amp;nbsp; #&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TREND-LIST :&amp;nbsp;&amp;nbsp; #&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TWEET :&amp;nbsp;&amp;nbsp; #&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TWITTER-USER :&amp;nbsp;&amp;nbsp; #&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TWITTER-USER :&amp;nbsp;&amp;nbsp; 100 &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TWEET :&amp;nbsp;&amp;nbsp; 100 &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TREND-LIST :&amp;nbsp;&amp;nbsp; 1 &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TREND :&amp;nbsp;&amp;nbsp; 10 &lt;/span&gt;&lt;br /&gt;
NIL&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Obviously the results shown represent more than a single call.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Notice that you need to issue a &lt;span style=&quot;color: blue;&quot;&gt;(use-cache)&lt;/span&gt; before loading the driver with &lt;span style=&quot;color: blue;&quot;&gt;(use-db&lt;/span&gt; ..). As mentioned in the previous post  &lt;span style=&quot;color: blue;&quot;&gt;(use-cache)&lt;/span&gt; sets up the methods to save the twitter entities in the cache and these methods call the generic &lt;span style=&quot;color: blue;&quot;&gt;db-store-object.&lt;/span&gt; Each driver &#39;s specification can be tagged to distinguish between different data store locations, with the default tag being :default. The  next time around you can just call &lt;span style=&quot;color: blue;&quot;&gt;(use-db :twitter-elephant-driver)&lt;/span&gt;.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Here&#39;s the implementation of &lt;span style=&quot;color: blue;&quot;&gt;(use-db..) &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defun &lt;/span&gt;&lt;b style=&quot;color: blue; font-family: Arial,Helvetica,sans-serif;&quot;&gt;use-db&lt;/b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #cc0000; font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver-package&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &amp;amp;key (&lt;/span&gt;&lt;span style=&quot;color: #20124d; font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: magenta;&quot;&gt;spec&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color: #134f5c; font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;span style=&quot;color: black;&quot;&gt;specp&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;) (tag :default))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp; (when &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver-package&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (require &lt;/span&gt;&lt;span style=&quot;color: #cc0000; font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver-package&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (use-package &lt;/span&gt;&lt;span style=&quot;color: #cc0000; font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver-package&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (when specp (write-driver-spec (list :TAG tag :DRIVER &lt;/span&gt;&lt;span style=&quot;color: #cc0000; font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver-package&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; :SPEC&lt;/span&gt;&lt;span style=&quot;color: magenta; font-family: Arial,Helvetica,sans-serif;&quot;&gt; spec&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;)))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (let ((spec (gethash (cons tag&lt;/span&gt;&lt;span style=&quot;color: #cc0000; font-family: Arial,Helvetica,sans-serif;&quot;&gt; driver-package&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;) (read-driver-spec))))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (when &lt;/span&gt;&lt;span style=&quot;color: magenta; font-family: Arial,Helvetica,sans-serif;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; (&lt;b&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;db-initialize&lt;/span&gt;&lt;/b&gt; (cadr (member :SPEC &lt;/span&gt;&lt;span style=&quot;color: magenta; font-family: Arial,Helvetica,sans-serif;&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;)))))))&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: #783f04;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;The &lt;span style=&quot;color: red;&quot;&gt;driver-package&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;is an asdf module which specifies the location of the driver source files&lt;/span&gt;&lt;/span&gt; which implement the persistence interface mentioned in the previous post.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The implementation of &lt;b style=&quot;color: #3d85c6;&quot;&gt;db-initialize&lt;/b&gt; looks like this:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defmethod &lt;b style=&quot;color: blue;&quot;&gt;db-initialize&lt;/b&gt; (&amp;amp;rest args)&lt;br /&gt;
&amp;nbsp; (open-twitter-db (car args))&lt;br /&gt;
&amp;nbsp; (&lt;span style=&quot;color: blue;&quot;&gt;create-caches&lt;/span&gt; &lt;span style=&quot;color: #b45f06;&quot;&gt;store-twitter-object&lt;/span&gt;)) &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In the case of this driver it assumes that the argument list consists of a specification list. The specification list should contain all the data necessary to initialize the elephant data  store. This specification list is passed on to elephant&#39;s &lt;b&gt;open-store &lt;/b&gt;method. In the next step of the initialization overrides the default implementation of the &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;db-store-object&lt;/span&gt; &lt;/b&gt;method  which is called each time an item is added to the in-memory cache. Not all types of twitter entities are stored. The twitter entities stored in the cache (and hence the data store)  are read from the &lt;b&gt;cache.spec&lt;/b&gt; file at initialization. &lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;(create-caches ..)&lt;/span&gt; is a macro which takes as it&#39;s argument an other macro. It reads the entity keywords from the &lt;span style=&quot;color: blue;&quot;&gt;cache.spec&lt;/span&gt; file and passes this on the macro passed in as an argument. The assumption is that this macro will in fact create the appropriate &lt;span style=&quot;color: blue;&quot;&gt;db-store-object&lt;/span&gt; method override for the entity in question :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defmacro &lt;b style=&quot;color: blue;&quot;&gt;create-caches&lt;/b&gt; (&lt;i style=&quot;color: #274e13;&quot;&gt;defmethod-maker-macro&lt;/i&gt;)&lt;br /&gt;
&amp;nbsp; (let ((lst (list &#39;progn )))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (dolist (&lt;b&gt;spec&lt;/b&gt; (&lt;i style=&quot;color: #7f6000;&quot;&gt;read-cache-spec&lt;/i&gt;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (push `(,&lt;span style=&quot;color: #274e13;&quot;&gt;defmethod-maker-macro&lt;/span&gt; &lt;b&gt;,spec&lt;/b&gt;) lst))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; `,(nreverse lst)))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The &lt;span style=&quot;color: blue;&quot;&gt;db-store-object &lt;/span&gt;interface method is defined as part of the &lt;b&gt;store-twitter-object&lt;/b&gt; macro which passed into &lt;span style=&quot;color: blue;&quot;&gt;create-caches &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defmacro &lt;b&gt;store-twitter-object&lt;/b&gt; (type)&lt;br /&gt;
&amp;nbsp;`(progn &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: #ffe599;&quot;&gt;(defmethod &lt;/span&gt;&lt;b style=&quot;background-color: #ffe599; color: blue;&quot;&gt;db-store-object&lt;/b&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; ((collection ,type) (lisprec cons))&lt;/span&gt;&lt;br style=&quot;background-color: #ffe599;&quot; /&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (with-twitter-db ()&lt;/span&gt;&lt;br style=&quot;background-color: #ffe599;&quot; /&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; (let ((twitter-obj-db (twitter-object-db (type-of collection)))&lt;/span&gt;&lt;br style=&quot;background-color: #ffe599;&quot; /&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (db-key&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;b style=&quot;background-color: #ffe599;&quot;&gt;unique-id&lt;/b&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; collection)))&lt;/span&gt;&lt;br style=&quot;background-color: #ffe599;&quot; /&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (unless (get-value db-key twitter-obj-db)&lt;/span&gt;&lt;br style=&quot;background-color: #ffe599;&quot; /&gt;&lt;span style=&quot;background-color: #ffe599;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (setf (get-value db-key twitter-obj-db) lisprec))&lt;/span&gt;)))))&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Note, that the object stored in the elephant data store is the S-expression representing the response of the twitter api call.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Three more methods round out the driver interface :&lt;b&gt; db-map-reduce&lt;/b&gt;, &lt;b&gt;db-status&lt;/b&gt; and &lt;b&gt;db-shutdown&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The db-map-reduce methods are defined as follows :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defmethod &lt;b&gt;db-map-reduce &lt;/b&gt;( (&lt;span style=&quot;color: red;&quot;&gt;collection&lt;/span&gt; symbol) (&lt;span style=&quot;color: blue;&quot;&gt;map-fn &lt;/span&gt;function) (&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;reduce-fn&lt;/span&gt; &lt;/span&gt;function) &amp;amp;key (from nil) (to nil) (from-end nil) (initial-value nil))&lt;br /&gt;
&amp;nbsp; (let ((lst (&lt;span style=&quot;color: #783f04;&quot;&gt;map-btree&lt;/span&gt; map-fn (twitter-object-db collection) :collect t :from-end from-end :start from :end to)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (reduce reduce-fn lst :initial-value initial-value :from-end from-end)))&lt;br /&gt;
&lt;br /&gt;
(defmethod &lt;b&gt;db-map-reduce&lt;/b&gt; ( (&lt;span style=&quot;color: red;&quot;&gt;collection&lt;/span&gt; symbol) (&lt;span style=&quot;color: blue;&quot;&gt;map-fn&lt;/span&gt; function) (reduce-fn (eql nil)) &amp;amp;key (from nil) (to nil) (from-end nil))&lt;br /&gt;
&amp;nbsp; (let ((lst (map-btree map-fn (twitter-object-db collection) :collect t :from-end from-end :start from :end to)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lst))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;collection&lt;/span&gt; is the name of a twitter entity, like tweet or twitter-user. The names of the entities can be found in the cache.spec.&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt; map-fn&lt;span style=&quot;color: black;&quot;&gt; is a function with two arguments : The first argument is the key; the next argument is the value. &lt;span style=&quot;color: #783f04;&quot;&gt;map-btree&lt;/span&gt;  is a function provided by the elephant api and yts keys can be passed in  to db-map-reduce as well. The result of map-btree is stored in a lst which is either  returned or is passed into reduce. &lt;span style=&quot;color: #274e13;&quot;&gt;reduce-fn&lt;/span&gt; is a single-valued function working on the individual elements of this list. Should you not provide a reduce function the second specialization is used.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Here&#39;s an example of it&#39;s use:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(db-map-reduce &#39;tweet (lambda (x y) (format t &quot;~A~A~%&quot; x y))&amp;nbsp; nil)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;[....]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-USE-BACKGROUND-IMAGE . T) (ID . 180148716)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IS-TRANSLATOR) (UTC-OFFSET . -21600)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-BACKGROUND-COLOR . ffffff))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ID . 50724431609344000) (IN-REPLY-TO-SCREEN-NAME)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IN-REPLY-TO-USER-ID))&lt;br /&gt;
50724431915520000((IN-REPLY-TO-STATUS-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TEXT . am just hapi.it&#39;s a great day) (CONTRIBUTORS)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RETWEETED) (IN-REPLY-TO-USER-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RETWEET-COUNT . 0) (ID-STR . 50724431915520000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SOURCE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . &lt;a href=&quot;http://mobile.twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Mobile Web&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (GEO) (TRUNCATED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CREATED-AT . Thu Mar 24 01:03:41 +0000 2011) (PLACE)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IN-REPLY-TO-STATUS-ID) (FAVORITED) (COORDINATES)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (USER (FOLLOWING)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-BACKGROUND-IMAGE-URL&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . http://a3.twimg.com/a/1300727311/images/themes/theme1/bg.png)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FAVOURITES-COUNT . 1) (DESCRIPTION)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SHOW-ALL-INLINE-MEDIA) (LISTED-COUNT . 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CONTRIBUTORS-ENABLED) (GEO-ENABLED) (TIME-ZONE)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-TEXT-COLOR . 333333) (URL)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-IMAGE-URL&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-SIDEBAR-FILL-COLOR . DDEEF6)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ID-STR . 270838024) (PROFILE-BACKGROUND-TILE)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (LOCATION) (SCREEN-NAME . darelistic)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (STATUSES-COUNT . 2) (FOLLOWERS-COUNT . 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IS-TRANSLATOR) (LANG . en) (VERIFIED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CREATED-AT . Wed Mar 23 10:28:44 +0000 2011)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-LINK-COLOR . 0084B4) (NOTIFICATIONS)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-SIDEBAR-BORDER-COLOR . C0DEED) (PROTECTED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NAME . Damilare olaniyan) (FOLLOW-REQUEST-SENT)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-USE-BACKGROUND-IMAGE . T) (ID . 270838024)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (UTC-OFFSET) (FRIENDS-COUNT . 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-BACKGROUND-COLOR . C0DEED))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ID . 50724431915520000) (IN-REPLY-TO-SCREEN-NAME)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IN-REPLY-TO-USER-ID))&lt;br /&gt;
50724433815552000((IN-REPLY-TO-STATUS-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TEXT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . Novo EP do Nirvana dia 16 de Abril http://bit.ly/hGmV1P)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CONTRIBUTORS) (RETWEETED) (IN-REPLY-TO-USER-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RETWEET-COUNT . 0) (ID-STR . 50724433815552000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SOURCE . web) (GEO) (TRUNCATED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CREATED-AT . Thu Mar 24 01:03:42 +0000 2011) (PLACE)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IN-REPLY-TO-STATUS-ID) (FAVORITED) (COORDINATES)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (USER (STATUSES-COUNT . 1662) (FOLLOWING)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-BACKGROUND-IMAGE-URL&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . http://a3.twimg.com/profile_background_images/204786069/jeff_buckley_1280v2.jpg)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FAVOURITES-COUNT . 0) (FRIENDS-COUNT . 238)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (DESCRIPTION&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . Rock &amp;amp; Entretenimento: Bandas, Bandas de  Metal, Bandas Novas, Matérias de Rock, Resenhas / Animes, Cinema,  Séries, HQs. http://alienacaorock.blogspot.com/)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TIME-ZONE . Brasilia) (PROFILE-TEXT-COLOR . 999999)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (URL . http://www.alienacaorock.blogspot.com/)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-IMAGE-URL&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . http://a0.twimg.com/profile_images/1175841120/jeff-buckley-hallelujah_normal.jpg)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (LISTED-COUNT . 23) (CONTRIBUTORS-ENABLED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-SIDEBAR-FILL-COLOR . 000000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ID-STR . 118215328) (PROFILE-BACKGROUND-TILE . T)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (LOCATION . Curitiba ) (SCREEN-NAME . AlienacaoRock)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FOLLOWERS-COUNT . 295) (LANG . en) (VERIFIED)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CREATED-AT . Sat Feb 27 23:42:51 +0000 2010)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-LINK-COLOR . 850404) (IS-TRANSLATOR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTIFICATIONS) (PROFILE-SIDEBAR-BORDER-COLOR . 000000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROTECTED) (SHOW-ALL-INLINE-MEDIA) (GEO-ENABLED . T)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NAME . Alienação Rock)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-USE-BACKGROUND-IMAGE . T) (ID . 118215328)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FOLLOW-REQUEST-SENT) (UTC-OFFSET . -10800)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PROFILE-BACKGROUND-COLOR . ffffff))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ID . 50724433815552000) (IN-REPLY-TO-SCREEN-NAME)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (IN-REPLY-TO-USER-ID))&lt;br /&gt;
50724435476480000((IN-REPLY-TO-STATUS-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (TEXT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . RT @Ugglytruth: La mujer necesita un hombre que no  le de vergüenza en mostrarle lo que siente así sea en publico o delante  sus amigos.)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CONTRIBUTORS) (RETWEETED) (IN-REPLY-TO-USER-ID-STR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RETWEET-COUNT . 0) (ID-STR . 50724435476480000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SOURCE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . &lt;a href=&quot;http://ubersocial.com/&quot; rel=&quot;nofollow&quot;&gt;ÜberSocial&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (GEO) (TRUNCATED)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;[....]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;As  mentioned earlier, the json response string is converted to an alist  and the alist is stored in the elephant data store. The elephant db  supports object persistence using it&#39;s  persistent-metaclass metaclass. Reading objects with this meta class back would require access to their class  definitions in the twitter api. One the design goals here is make the retrieval of the data from the stro not depend on the twitter api. Reading and processing alists is standard lisp  practice and requires no dependency on the twitter api internals.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;db-status&lt;/b&gt; shows the number of items in each collection and its use was demonstrated earlier on in the post.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;db-shutdown&lt;/b&gt; provides a way to shutdown the data store by calling the elephant api&#39;s close-store on the data store.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/04/using-elephant-as-twitter-peristence.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-7259937118969064437</guid><pubDate>Tue, 05 Apr 2011 22:56:00 +0000</pubDate><atom:updated>2011-04-05T18:56:11.523-04:00</atom:updated><title>Saving twitter data with cl-twitter&#39;s built-in persistence.</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The previous post discussed cl-twitter&#39;s built-in in-memory cache which maybe all you need. In addition to the in-memory cache cl-twitter&#39;s database api provides a minimal persistence  interface to a data store. The api is defined as follows :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(&lt;span style=&quot;color: blue;&quot;&gt;defgeneric&lt;/span&gt; &lt;b&gt;db-initialize &lt;/b&gt;(&amp;amp;rest args))&lt;br /&gt;
(&lt;span style=&quot;color: blue;&quot;&gt;defgeneric&lt;/span&gt; &lt;b&gt;db-shutdown&amp;nbsp;&amp;nbsp;&lt;/b&gt; (&amp;amp;rest args))&lt;br /&gt;
(&lt;span style=&quot;color: blue;&quot;&gt;defgeneric&lt;/span&gt; &lt;b&gt;db-store-objec&lt;/b&gt;t (collection lisprec))&lt;br /&gt;
(&lt;span style=&quot;color: blue;&quot;&gt;defgeneric&lt;/span&gt; &lt;b&gt;db-map-reduce&amp;nbsp;&lt;/b&gt;&amp;nbsp; (collection map-fn reduce-fn &amp;amp;key))&lt;br /&gt;
(&lt;span style=&quot;color: blue;&quot;&gt;defgeneric&lt;/span&gt; &lt;b&gt;db-status&lt;/b&gt; (&amp;amp;rest args))&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Currently there are two drivers which implement this protocol. One for the &lt;a href=&quot;http://common-lisp.net/project/elephant/&quot;&gt;elephant object store&lt;/a&gt; which is build on top of several data stores. The other driver is for the non-sql database &lt;a href=&quot;http://www.mongodb.org/&quot;&gt;mongodb&lt;/a&gt;.&amp;nbsp; &lt;b&gt;elephant&lt;/b&gt; is designed to work well with lisp objects. &lt;b&gt;mongodb&lt;/b&gt; is a document bases non-sql database which has drivers for many different programming languages.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Drivers are loaded using the &lt;b&gt;use-db &lt;/b&gt;method. &lt;b&gt;db-initialize&lt;/b&gt; is called when the driver package is loaded. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;db-store-object&lt;/b&gt;  is called anytime an object is stored on the cache. As mentioned in the  previous post the cache needs to be enabled in order to use the persistence  api. Persistence is transparent to the user because &lt;b&gt;db-store-object&lt;/b&gt; is called right after the object is stored in the cache.&amp;nbsp; &lt;b&gt;db-status&lt;/b&gt; returns information about the persistence store, like connection information or the number of objects currently stored. &lt;b&gt;db-map-reduce&lt;/b&gt; can be used to perform operations on the data in particular collection. &lt;b&gt;db-shutdown &lt;/b&gt;provides a clean way to shutdown the data store. The persistence interface only supports inserts into the data store.&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;I  assume that most of the data management and analysis will be done  outside  of the cl-twitter package, perhaps even in a programming environment different  from  lisp. &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;As I mentioned drivers are loaded by calling &lt;b&gt;use-db&lt;/b&gt; with the driver package name, a connection specification and an identifying tag, viz. : &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defun &lt;b&gt;use-db&lt;/b&gt; (&lt;span style=&quot;color: blue;&quot;&gt;driver-package&lt;/span&gt; &amp;amp;key (&lt;span style=&quot;color: purple;&quot;&gt;spec nil specp&lt;/span&gt;) (&lt;span style=&quot;color: purple;&quot;&gt;tag&lt;/span&gt; &lt;i&gt;:default&lt;/i&gt;))&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;background-color: blue;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;driver-package &lt;span style=&quot;color: black;&quot;&gt;is a symbol identifying the driver package. The &lt;span style=&quot;color: purple;&quot;&gt;spec&lt;/span&gt; is an S-expression contains the login to and location of the server. &lt;/span&gt;&lt;/span&gt;Server specifications are stored in the &lt;b&gt;driver.spec&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;file located in the access sub-directory of the twitter package.The&lt;/span&gt;&lt;span style=&quot;color: purple; font-family: Arial,Helvetica,sans-serif;&quot;&gt; tag&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; is used to label the specification in the &lt;/span&gt;&lt;b style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;driver.spec&lt;/b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; file. The tag name is used later on as an alias to the specification expression. The initial specification is saved and tagged as the default one, and subsequent invocations only require the driver name.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: purple;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: blue; font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: purple;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;When you load the elephant driver with a berkeley db back end for the first time you&#39;d specify the path to the berkeley db files:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(use-db :twitter-elephant-driver :spec &#39;(:BDB &lt;path files=&quot;&quot; to=&quot;&quot;&gt;))&lt;/path&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Similarly for the mongo db driver&amp;nbsp; :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; (use-db :twitter-mongodb-driver :spec &#39;(:host &quot;localhost&quot; :port 27017 :db &quot;twitter&quot;) )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;The specification is stored with the default tag and subsequent invocations can just use :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(use-db :twitter-elephant-driver).&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;After the data store&#39;s driver has been loaded twitter objects are stored in the store. (db-status) can be called to see data store connection information and statistics, viz : &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
CL-USER&amp;gt; (db-status)&lt;br /&gt;
mongodb driver loaded&lt;br /&gt;
last error : [{n : 0} {connectionId : 7} {err : NIL} {ok : 1.0d0} ]&lt;br /&gt;
last error : [{err : NIL} {n : 0} {nPrev : -1} {ok : 1.0d0} ]&lt;br /&gt;
(type-of CL-MONGO:MONGO) [name : TWITTER ] &lt;br /&gt;
{[id : CC067A61-F777-4635-862B-B734923399D1] [port : 27017] [host : localhost] [db : twitter]} &lt;br /&gt;
&lt;br /&gt;
trend-list :   3.0d0 &lt;br /&gt;
trend :   18.0d0 &lt;br /&gt;
tweet :   51953.0d0 &lt;br /&gt;
twitter-user :   50208.0d0 &lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
The use of db-map-reduce is similar to the cache-map-reduce function discussed in earlier posts.&lt;/div&gt;</description><link>http://cl-twitter.blogspot.com/2011/04/saving-twitter-data-with-cl-twitters.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-5687561913492787318</guid><pubDate>Tue, 29 Mar 2011 10:15:00 +0000</pubDate><atom:updated>2011-03-29T06:15:07.234-04:00</atom:updated><title>Cache your Tweets : How cl-twitter implements the cache.</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Sometimes you just want to save things. And sometimes the things you want to save are tweets or other assorted twitter entities. You want to do this because you just received your copy of&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://oreilly.com/catalog/0636920010203&quot;&gt;Mining the Social Web&lt;/a&gt;. Or you want to analyze tweets using&amp;nbsp;&lt;a href=&quot;http://lingpipe-blog.com/2010/11/16/processing-tweets-with-lingpipe-search-and-csv-data-structures/&quot;&gt;lingpipe&lt;/a&gt; or the &lt;a href=&quot;http://www.nltk.org/&quot;&gt;Natural Language Toolkit.&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;This post provides a high level overview of the cl-twitter&#39;s memory cache. The next few posts&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;will go over the db interface.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The basic idea is that each twitter entity has a unique id &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;and is saved in a collection.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;For some entities, like the tweet or user entity, the twitter api provides a unique id. For other entities cl-twitter will need to provide it&#39;s own unique id. For example, the result returned by the &lt;a href=&quot;http://dev.twitter.com/doc/get/friends/ids&quot;&gt;social graph api call&lt;/a&gt; is just a list of user id&#39;s and a cursor id and&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; the results of the &lt;a href=&quot;http://dev.twitter.com/doc/get/trends&quot;&gt;trends api call&lt;/a&gt; also lack a unique id. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In cases like these, to meaningfully distinguish between different results you need to enrich the return with (some of) the arguments of the api call as well as a unique id.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You start using the cache by simply calling &lt;b&gt;(use-cache)&lt;/b&gt;. This enables the cache and &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;is the first step in enabling persistence overall. Starting the cache causes a set of implementations of &lt;b&gt;register-twitter-object &lt;/b&gt;to be generated for a select set of types. These types are read from the &lt;b&gt;cache.spec&lt;/b&gt; file located in the db sub-directory of the cl-twitter package.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;(defgeneric register-twitter-object (ref lisprec))&lt;/b&gt;&amp;nbsp; is &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;called when the json  returned by twitter is turned into  an lisp object. The ref argument is  in fact that object and the lisprec  is an S-expression representing the  json. Objects are cached because this method is overridden for the object type in question.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;b&gt;register-twitter-object&lt;/b&gt; enables the introduction of side effects when  the results returned by twitter are processed. It&#39;s return value is  ignored. The default implementation of &lt;b&gt;register-twitter-object&lt;/b&gt; is to do nothing. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The contents of &lt;b&gt;cache.spec &lt;/b&gt;can be manipulated using &lt;b&gt;write-cache-spec&lt;/b&gt; and inspected using &lt;b&gt;read-cache-spec&lt;/b&gt;. The cache spec currently has the following types:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;TWITTER-USER&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;TREND-LIST&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;SEARCH-REF&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;TWEET&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;TREND&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;SOCIAL-GRAPH-CURSOR-ID&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;register-twitter-object&lt;/b&gt; stores the twitter object in a hash table. The key of the hash table is determined by calling &lt;b&gt;unique-id&lt;/b&gt; on the object. &lt;b&gt;unique-id&lt;/b&gt; is a generic function whose default implementation returns the unique id of the twitter object. As mentioned before, in some case twitter does not assign a unique id, and &lt;b&gt;unique-id&lt;/b&gt;&amp;nbsp; needs to be specialized appropriately.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;After storing the object in memory &lt;b&gt;register-twitter-objec&lt;/b&gt;t calls &lt;b&gt;db-store-object&lt;/b&gt; which is part of the generic persistence interface.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The &lt;b&gt;(caches)&lt;/b&gt; call shows the current object count of the cache and&lt;b&gt; cache-map-reduce&lt;/b&gt; can be used to access the cache.&amp;nbsp; It&#39;s defined as follows :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;(&lt;span style=&quot;color: #cc0000;&quot;&gt;defgeneric &lt;/span&gt;cache-map-reduce (&lt;span style=&quot;color: #38761d;&quot;&gt;collection map-fn reduce-fn&lt;/span&gt; &lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;amp;key&lt;/span&gt;))&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The collection is the &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;type of twitter object you want to apply this to.The map function and reduce function are both optional. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;When neither &lt;b&gt;map-fn&lt;/b&gt; nor &lt;b&gt;reduce-fn&lt;/b&gt; are specified, &lt;b&gt;cache-map-reduce&lt;/b&gt; returns a list of all the objects in the collection. When a map function is specified, it will apply the map function to each object in the collection before adding it to the list. If an additional reduce function is supplied, the list will passed on to lisp&#39;s reduce function and same optional keywords are also available.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The macro &lt;b&gt;map-reduce-cache &lt;/b&gt;makes things a little easier. It&#39;s defined as :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(&lt;b&gt;defmacro &lt;/b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;map-reduce-cache &lt;/span&gt;(&lt;span style=&quot;color: #38761d;&quot;&gt;collection&lt;/span&gt; &lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;amp;key (map nil) (reduce nil) &lt;/span&gt;)&lt;br /&gt;
&amp;nbsp; `(progn&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (if &lt;span style=&quot;color: #0b5394;&quot;&gt;,map&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; (cache-map-reduce (quote ,collection) (lambda (k v) (declare (ignore k)) (funcall ,map v)) ,reduce :collect nil)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; (cache-map-reduce (quote ,collection) nil &lt;span style=&quot;color: #0b5394;&quot;&gt;,reduce &lt;/span&gt;:collect t)))) &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Here&#39;s an example :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;br /&gt;
CL-USER&amp;gt; (caches)&lt;br /&gt;
((TREND-LIST . 2) (TREND . 10) (TWEET . 80) (TWITTER-USER . 80))&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
CL-USER&amp;gt; (show (map-reduce-cache trend))&lt;br /&gt;
Law &amp;amp; Order                                                            http://search.twitter.com/search?q=Law+%26+Order&lt;br /&gt;
-----------------------------&lt;br /&gt;
Cibele Dorsa                                                            http://search.twitter.com/search?q=Cibele+Dorsa&lt;br /&gt;
-----------------------------&lt;br /&gt;
Umständen                                                             http://search.twitter.com/search?q=Umst%C3%A4nden&lt;br /&gt;
-----------------------------&lt;br /&gt;
Escócia                                                                 http://search.twitter.com/search?q=Esc%C3%B3cia&lt;br /&gt;
-----------------------------&lt;br /&gt;
Léo Batista                                                         http://search.twitter.com/search?q=L%C3%A9o+Batista&lt;br /&gt;
------------------------------&lt;br /&gt;
Hocus Pocus                                                              http://search.twitter.com/search?q=Hocus+Pocus&lt;br /&gt;
-------------------------------&lt;br /&gt;
#iseewhyyoumad                                                      http://search.twitter.com/search?q=%23iseewhyyoumad&lt;br /&gt;
-------------------------------&lt;br /&gt;
❒Single ❒Taken                                        http://search.twitter.com/search?q=%E2%9D%92Single+%E2%9D%92Taken&lt;br /&gt;
--------------------------------&lt;br /&gt;
#wealldoit                                                              http://search.twitter.com/search?q=%23wealldoit&lt;br /&gt;
-------------------------------&lt;br /&gt;
#100factsaboutme                                                  http://search.twitter.com/search?q=%23100factsaboutme&lt;br /&gt;
------------------------------&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/03/cache-your-tweets-how-cl-twitter.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-3255726480480377616</guid><pubDate>Sat, 19 Feb 2011 14:33:00 +0000</pubDate><atom:updated>2011-02-19T09:33:15.971-05:00</atom:updated><title>aliasing commands in the cl-twitter repl mode</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;As I wrote in an &lt;a href=&quot;http://cl-twitter.blogspot.com/2011/01/twittering-from-repl-motivation-and.html#links&quot;&gt;earlier post&lt;/a&gt;&amp;nbsp; the cl-twitter repl client should have the ability to create simple commands from the api calls.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Aliasing ranges from a shorter name for a command , to a command plus a set of options (curried api call), to a combination of commands (a lambda).&amp;nbsp; These aliases need to persist between sessions.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The cl-twit-repl package in cl-twitter provides two macros unsurprisingly called &lt;b&gt;alias&lt;/b&gt; and &lt;b&gt;unalias&lt;/b&gt; to handle aliasing.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;alias&lt;/b&gt; has three modes : called without arguments it&quot;ll show a list of all the currently installed aliases:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b style=&quot;color: red;&quot;&gt;(alias)&lt;/b&gt;&lt;br /&gt;
MOH                =&amp;gt;   (GET-AUTHENTICATED-USER &quot;mohegskunkworks&quot;)&lt;br /&gt;
PT                 =&amp;gt;   #:PUBLIC-TIMELINE&lt;br /&gt;
RL                 =&amp;gt;   #:RATE-LIMIT-STATUS&lt;br /&gt;
WHOAMI             =&amp;gt;   (LAMBDA NIL (WHEN *TWITTER-USER* (#:VERIFY-CREDENTIALS)))&lt;br /&gt;
H                  =&amp;gt;   (#:COLLECT-HOME-TIMELINE)&lt;br /&gt;
FT                 =&amp;gt;   FRIENDS-TIMELINE&lt;br /&gt;
SFOLU              =&amp;gt;   (LAMBDA (SN N) (MAPCAR (FUNCTION #:SHOW-USER-BY-ID) (SUBSEQ (#:COLLECT-FOLLOWER-IDS SN) N (+ N 10))))&lt;br /&gt;
@                  =&amp;gt;   @MENTION&lt;br /&gt;
UL                 =&amp;gt;   USER-TIMELINE&lt;br /&gt;
@?                 =&amp;gt;   MENTIONS&lt;br /&gt;
DROP-LAST          =&amp;gt;   (LAMBDA NIL (DELETE-TWEET (CAR (USER-TIMELINE))))&lt;br /&gt;
TR                 =&amp;gt;   TRENDS&lt;br /&gt;
S                  =&amp;gt;   DO-SEARCH&lt;br /&gt;
STARTUP            =&amp;gt;   MOH&lt;br /&gt;
HOME               =&amp;gt;   COLLECT-HOME-TIMELINE&lt;br /&gt;
TY                 =&amp;gt;   (LAMBDA (X Y) (+ X Y))&lt;br /&gt;
PERSIST-ON         =&amp;gt;   (LAMBDA NIL (PROGN (USE-CACHE) (USE-DB :TWITTER-BDB-DRIVER)))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Called with the name of an alias it shows its definition :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b style=&quot;color: red;&quot;&gt;(alias ul)&lt;/b&gt;&lt;br /&gt;
USER-TIMELINE&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
An alias is defined by providing its name as the first argument and its definition as the second argument.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The first way to define an alias is by linking it to an existing api call. For example, &lt;b&gt;(public-timeline)&lt;/b&gt; returns the current public time line. To alias it to the much terser &lt;b&gt;(pt)&lt;/b&gt; you&#39;d do something like this :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(&lt;span style=&quot;color: red;&quot;&gt;alias&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;pt&lt;/span&gt; public-timeline)&lt;/b&gt;&lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; (&lt;b style=&quot;color: red;&quot;&gt;alias&lt;/b&gt; &lt;b&gt;pt&lt;/b&gt;)&lt;br /&gt;
PUBLIC-TIMELINE&lt;br /&gt;
CL-USER&amp;gt; &lt;b&gt;(pt)&lt;/b&gt;&lt;br /&gt;
knears                                                                                                                  Thu Feb 17 11:13:07 +0000 2011&lt;br /&gt;
今日久しぶりに音声チャットをしたよね( 　ﾟ,_ゝﾟ)楽しいね&lt;br /&gt;
&lt;br /&gt;
ANAYASMEL                                                                                                               Thu Feb 17 11:13:07 +0000 2011&lt;br /&gt;
Bueno dias tengan un super dia.....&lt;br /&gt;
&lt;br /&gt;
erikafromhawaii                                                                                                         Thu Feb 17 11:13:07 +0000 2011&lt;br /&gt;
&quot;I&#39;m no detective-- OH! Wait a minute, where am I? I&#39;M A DETECTIVE!&quot; Beautiful, stunning, flawless, etc. Scott Caan, I adore you.&lt;br /&gt;
[...]&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The second way to define an alias is to curry an api call. For example &lt;b&gt;(dosearch &lt;/b&gt;&lt;i&gt;search-term&lt;/i&gt;&lt;b&gt; :max-pages &lt;/b&gt;&lt;i&gt;pages)&lt;/i&gt; will search twitter for the search term you provide and will return the number of pages of 100 tweets each specified with the max-pages keyword). Here&#39;s how you create an alias for the word lisp. You can specify the number of pages when you actually call the alias :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; (alias lisp (do-search &quot;lisp&quot;)) &lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; (lisp :max-pages 1)&lt;br /&gt;
From: salsipuedes69                                                                                                                               To: &lt;br /&gt;
http://twitpic.com/40vd0h - Cupid&#39;s bow seemed a little skewed. (aramisdeceives.com) Pray for the kindness of lisp. Socks&lt;br /&gt;
Fri, 18 Feb 2011 00:48:40 +0000&lt;br /&gt;
&lt;br /&gt;
From: miyabipopo                                                                                                                                  To: &lt;br /&gt;
ごめんよｗｗｗバスの運転手さんｗｗｗ気味の声よりもLISPの声のほうがいいんだもんｗｗｗ&lt;br /&gt;
Fri, 18 Feb 2011 00:46:35 +0000&lt;br /&gt;
&lt;br /&gt;
From: t_fridge                                                                                                                                    To: &lt;br /&gt;
RT @peccul: &quot;Emacs Lisp Snippets - http://snipplr.com/all/language/emacs-lisp &quot;&lt;br /&gt;
Fri, 18 Feb 2011 00:45:07 +0000&lt;br /&gt;
&lt;br /&gt;
From: PMLEGEND                                                                                                                                    To: &lt;br /&gt;
RT @LexiLondonBaby: Has serenity got some kind of lisp ? #muzikradio&lt;br /&gt;
Fri, 18 Feb 2011 00:42:19 +0000&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Lastly you have the ability to specify a lambda. Here&#39;s an example:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; (alias ps (lambda (x y) (* x y)))&lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; (ps 2 3)&lt;br /&gt;
6&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;When an alias is defined it&#39;s  added to an internal hash table and stored in a file which can be found in the &lt;b&gt;&lt;i&gt;alias&lt;/i&gt;&lt;/b&gt; sub directory of cl-twitter&#39;s repository. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Calling&lt;b&gt; unalias &lt;/b&gt;is removes an an alias from the hash table, but not from the file.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;To remove a single alias you&#39;d call unalias with the alias name as the argument :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;For example, this is how you remove the pt alias defined previously:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; (unalias pt)&lt;br /&gt;
PT&lt;br /&gt;
CL-USER&amp;gt; (alias pt)&lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; (pt)&lt;br /&gt;
; &lt;br /&gt;
; caught STYLE-WARNING:&lt;br /&gt;
;   undefined function: PT&lt;br /&gt;
; &lt;br /&gt;
; compilation unit finished&lt;br /&gt;
;   Undefined function:&lt;br /&gt;
;     PT&lt;br /&gt;
;   caught 1 STYLE-WARNING condition&lt;br /&gt;
; Evaluation aborted.&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Calling &lt;b&gt;unalias&lt;/b&gt; without arguments removes all aliases.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; (unalias)&lt;br /&gt;
#&lt;hash-table 0=&quot;&quot; :count=&quot;&quot; :test=&quot;&quot; equal=&quot;&quot; {1002d901e1}=&quot;&quot;&gt;&lt;br /&gt;
CL-USER&amp;gt; (alias)&lt;br /&gt;
NIL&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/hash-table&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;As mentioned, the alias file is not updated and that provides some protection against an inadvertent &lt;b&gt;(unalias)&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The final sync of the has table with the alias file happens when the &lt;b&gt;(done-twittering) &lt;/b&gt;is issued. This command closes the cl-twit-repl session and restores the default printers. &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;On the other hand, calling &lt;b&gt;(cl-twit-repl)&lt;/b&gt; restores the alias table :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;br /&gt;
CL-USER&amp;gt; (cl-twit-repl)&lt;br /&gt;
mohegskunkworks              timezone : Eastern Time (US &amp;amp; Canada)   url     : http://www.mohegan-skunkworks.com                           created   : Sat Feb 06 00:16:20 +0000 2010&lt;br /&gt;
name : &quot;fons haffmans&quot;       statuses : 66                           friends : 98                                      followers : 18      following : NIL&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
CL-USER&amp;gt; (alias)&lt;br /&gt;
[...]&lt;br /&gt;
PT                 =&amp;gt;   PUBLIC-TIMELINE&lt;br /&gt;
RL                 =&amp;gt;   #:RATE-LIMIT-STATUS&lt;br /&gt;
WHOAMI             =&amp;gt;   (LAMBDA NIL (WHEN *TWITTER-USER* (#:VERIFY-CREDENTIALS)))&lt;br /&gt;
H                  =&amp;gt;   (#:COLLECT-HOME-TIMELINE)&lt;br /&gt;
FT                 =&amp;gt;   FRIENDS-TIMELINE&lt;br /&gt;
SFOLU              =&amp;gt;   (LAMBDA (SN N) (MAPCAR (FUNCTION #:SHOW-USER-BY-ID) (SUBSEQ (#:COLLECT-FOLLOWER-IDS SN) N (+ N 10))))&lt;br /&gt;
@                  =&amp;gt;   @MENTION&lt;br /&gt;
UL                 =&amp;gt;   USER-TIMELINE&lt;br /&gt;
@?                 =&amp;gt;   MENTIONS&lt;br /&gt;
DROP-LAST          =&amp;gt;   (LAMBDA NIL (DELETE-TWEET (CAR (USER-TIMELINE))))&lt;br /&gt;
TR                 =&amp;gt;   TRENDS&lt;br /&gt;
S                  =&amp;gt;   DO-SEARCH&lt;br /&gt;
STARTUP            =&amp;gt;   MOH&lt;br /&gt;
HOME               =&amp;gt;   COLLECT-HOME-TIMELINE&lt;br /&gt;
TY                 =&amp;gt;   (LAMBDA (X Y) (+ X Y))&lt;br /&gt;
[...]&lt;br /&gt;
CL-USER&amp;gt; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/02/aliasing-commands-in-cl-twitter-repl.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-4250695703351247</guid><pubDate>Sun, 09 Jan 2011 23:40:00 +0000</pubDate><atom:updated>2011-03-19T17:13:10.069-04:00</atom:updated><title>Authorizing cl-twitter as a twitter client</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Initially logging into your twitter account was fairly straight forward. You fired up your favorite client and supplied a user id and password and you were all set. That used the be known in twitterland as basic authorization.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Halfway last year twitter switched to using &lt;a href=&quot;http://dev.twitter.com/pages/oauth_faq&quot;&gt;open authorization&lt;/a&gt; exclusively. A user under &lt;a href=&quot;http://en.wikipedia.org/wiki/OAuth&quot;&gt;OAuth&amp;nbsp;&lt;/a&gt;&amp;nbsp;&amp;nbsp; has the ability to share private resources with a client without handing over the it&#39;s login credentials to the client. So instead of providing a client application with your twitter access credentials so it could log into twitter on your behalf (and perhaps other unbeknown to you try those same credentials to access other resources or your private twitter information) you essentially log into twitter on the clients behest. twitter responds by giving the client a set of tokens which can be used to enable subsequent logins.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You now also have the ability to deny a client access to your account as well.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In addition, for this to work, the client application needs to be &lt;a href=&quot;http://dev.twitter.com/pages/auth#register&quot;&gt;registered&lt;/a&gt; with twitter.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;cl-twitter always had support for OAuth, but it was not set up to be used as a valid client application from the repl. That has now changed.Below are the steps you need to take when you use cl-twit-repl for the first time.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;First you need to load the cl-twit-repl package. Then, do a (&lt;b&gt;use-package :cl-twit-repl&lt;/b&gt;) followed by &lt;b&gt;(cl-twit-repl)&lt;/b&gt;. You&quot;ll see a url printed by the repl and you&quot; ll be challenged to provide an id (see the screen shot below).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAfds-uxysftNqhX12X01Ij4andh-2wyU62Hu0dPMLUIrqQBJSCc0C5gH-lkG_DbCeyYU9qkV_Pzzd4-ODamZT9XsPlAySAbFDWmUCmIkJxkvfb9LiOeKZ5fPx6z8sCWTxZRAxVSRQ0UwT/s1600/S1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;144&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAfds-uxysftNqhX12X01Ij4andh-2wyU62Hu0dPMLUIrqQBJSCc0C5gH-lkG_DbCeyYU9qkV_Pzzd4-ODamZT9XsPlAySAbFDWmUCmIkJxkvfb9LiOeKZ5fPx6z8sCWTxZRAxVSRQ0UwT/s640/S1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Copy the url from the repl and past it into a web browser :&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0a8ZpYTMLvu5wanpr4NX330tNId5sXo0JczxprCvYwoCzVpOu4iidNrrJsDaOu8BuOuBzV4R3LW_hDeJ9QqKfxhUZ_2cSUrUHuDiu9Tzh8r6ZZ3DmJJH9caWEhLMpyvvRgZcwOQkspo6j/s1600/Screen+shot+2011-01-09+at+5.19.11+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;344&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0a8ZpYTMLvu5wanpr4NX330tNId5sXo0JczxprCvYwoCzVpOu4iidNrrJsDaOu8BuOuBzV4R3LW_hDeJ9QqKfxhUZ_2cSUrUHuDiu9Tzh8r6ZZ3DmJJH9caWEhLMpyvvRgZcwOQkspo6j/s640/Screen+shot+2011-01-09+at+5.19.11+PM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Twitter will ask you to allow cl-twit-repl access to your twitter account. After you press the allow button twitter responds with a pin number.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4O8Ma4Vy0b6Rh0q46K2RiWwqe0GYEswUCb2rG2fSh8QFZk2lqf4BTBj98dt7SqK0m_bHUS7JLpuq6yw3wwpgTq0siXK2aCnTBvV_qY5A2pGjIH9PgE2L2R_j3rgT3MtFtemALK7UombG1/s1600/Screen+shot+2011-01-09+at+5.20.04+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4O8Ma4Vy0b6Rh0q46K2RiWwqe0GYEswUCb2rG2fSh8QFZk2lqf4BTBj98dt7SqK0m_bHUS7JLpuq6yw3wwpgTq0siXK2aCnTBvV_qY5A2pGjIH9PgE2L2R_j3rgT3MtFtemALK7UombG1/s400/Screen+shot+2011-01-09+at+5.20.04+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You copy that pin number and paste it back into the repl, where it says to enter the pin.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx2Ya25zkYbGe6KypaodLeSjNhFocmCENSKPZW5AD3gJug7U4ZMIyld4hJXIkBFFp0w6T7cLy058Xf1bocv8VBmZov2oJ_IYizxVWeMvY3IBftk_Rk6VvWIwMGCZewm4HHumqX_2he2goY/s1600/S2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx2Ya25zkYbGe6KypaodLeSjNhFocmCENSKPZW5AD3gJug7U4ZMIyld4hJXIkBFFp0w6T7cLy058Xf1bocv8VBmZov2oJ_IYizxVWeMvY3IBftk_Rk6VvWIwMGCZewm4HHumqX_2he2goY/s640/S2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You should now see your user credentials appear on the repl.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomOC9LJr1705I1fDRXhz4dPDlRVdHYE9kE_Tm8-S4u6er9anZzye3i3a4RGoBXZwZfMWaMSDMCF7Mnh0QUDrZ7-fzmnpDEAt1yGnOSlcC7tUGN4LUG1umo1mdx0C0xoywpccV2-SCK1h1/s1600/S3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomOC9LJr1705I1fDRXhz4dPDlRVdHYE9kE_Tm8-S4u6er9anZzye3i3a4RGoBXZwZfMWaMSDMCF7Mnh0QUDrZ7-fzmnpDEAt1yGnOSlcC7tUGN4LUG1umo1mdx0C0xoywpccV2-SCK1h1/s1600/S3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Your access credentials are stored in a file called access.ht in the access subdirectory of the cl-twitter repository. .gitignore is set up to exclude access credentials from being tracked. I realize that this is very limiting assumption at the moment and I may provide an override hook in a later release.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;If you want to customize this, the function to look for is&lt;b&gt; access-file&lt;/b&gt; :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;(defun &lt;b&gt;access-file&lt;/b&gt; ()&lt;br /&gt;
&amp;nbsp; (default-access-path &quot;access/&quot; *access-file*))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You exit twitter mode by calling &lt;b&gt;(done-twittering).&lt;/b&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Once access credentials can be located, subsequent calls of &lt;b&gt;(cl-twit-repl)&lt;/b&gt; will not require this OAuth handshake with twitter. In addition, you won&#39;t be automatically logged in either. You would need to issue a (&lt;b&gt;get-authenticated-user &lt;your id=&quot;&quot; login=&quot;&quot;&gt;&lt;/your&gt;&lt;/b&gt;) call.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;If &lt;b&gt;get-authenticated-user &lt;/b&gt;is unable to locate credentials for the login id you supply, it will take you through the whole handshake process. This allows you to manage multiple user accounts, although you can be credentialed for only one account at a time.&lt;b&gt; get-authenticated-user&lt;/b&gt; can be called from the repl without being in &quot;twitter mode&quot; so you can use the api without being in &quot;twitter mode&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/01/authorizing-cl-twitter-as-twitter.html</link><author>noreply@blogger.com (mohegskunkworks)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAfds-uxysftNqhX12X01Ij4andh-2wyU62Hu0dPMLUIrqQBJSCc0C5gH-lkG_DbCeyYU9qkV_Pzzd4-ODamZT9XsPlAySAbFDWmUCmIkJxkvfb9LiOeKZ5fPx6z8sCWTxZRAxVSRQ0UwT/s72-c/S1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-2730230188133204057</guid><pubDate>Thu, 06 Jan 2011 00:13:00 +0000</pubDate><atom:updated>2011-01-05T19:13:15.989-05:00</atom:updated><title>The cl-twitter repl&#39;s pretty-printer</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In my previous post I listed three minimum requirements for a useful twitter repl mode.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Sending tweets is all well and good but the cl-twitter repl has to provide a meaningful print representation of the data returned by the other twitter api calls.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Each json structure returned by twitter has it&#39;s own type in cl-twitter and I&quot;ll call their instances &#39;twitter objects&#39;. T&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;he default printed representation of those objects is pretty basic. For example, under the normal repl the tweets returned by &lt;b&gt;(public-timeline)&lt;/b&gt; just show some basic information :&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;(public-timeline)
(#&amp;lt; tweet id:22800422360064000=&quot;&quot; omiibby=&quot;&quot;&amp;gt; 
 #&amp;lt; tweet fz_r=&quot;&quot; id:22800417641472000=&quot;&quot;&amp;gt;
 #&amp;lt; tweet id:22800415959552000=&quot;&quot; nattunkana=&quot;&quot;&amp;gt;
 #&amp;lt; tweet fcominhavidals=&quot;&quot; id:22800412922880000=&quot;&quot;&amp;gt;
[....])
&lt;/pre&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;cl-twitter&#39;s&lt;b&gt; show&lt;/b&gt; is a generic function which can be used to get a more detailed print out : &lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(defgeneric show (obj &amp;amp;optional stream ))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The results printed by &lt;/span&gt;&lt;b style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;show&lt;/b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; applied to the list returned by &lt;/span&gt;&lt;b style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;public-timeline&amp;nbsp; &lt;/b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;is human readable:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;br /&gt;
(show *)&lt;br /&gt;
OmiiBby                                                                                                                 Wed Jan 05 23:43:38 +0000 2011&lt;br /&gt;
- #maarwaarom szeg je gewoon niet dat je gay bent ?&lt;br /&gt;
&lt;br /&gt;
fz_r                                                                                                                    Wed Jan 05 23:43:37 +0000 2011&lt;br /&gt;
ベッドにつまずきながらかけこんだ。&lt;br /&gt;
&lt;br /&gt;
nattunkana                                                                                                              Wed Jan 05 23:43:37 +0000 2011&lt;br /&gt;
何気ない言動でも人を幸せにできます＞ネットの書き込み、注意してる？～何気ない言動でも人を傷つけます！～&lt;br /&gt;
&lt;br /&gt;
FCOminhavidaLS                                                                                                          Wed Jan 05 23:43:36 +0000 2011&lt;br /&gt;
eu tenho 3 caderno do luan ,2 boné e 4 CD e 5 DVDS ! tudo original ganhei pela central de fãs *-* acho que vou fazer promoooooooo =X&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;show&#39;&lt;/b&gt;s default specialization prints the default representation of non-twitter objects:&lt;/div&gt;&lt;code&gt;&lt;br /&gt;
(defmethod show ( (obj t) &amp;amp;optional (s *standard-output*))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (format s &quot;~&amp;amp;~1t~S~%&quot; obj))&lt;br /&gt;
&amp;nbsp;&lt;br style=&quot;font-family: Arial,Helvetica,sans-serif;&quot; /&gt; &lt;/code&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;On the other hand each twitter type has its own specialization. Here is how a tweet is displayed :&lt;/div&gt;&lt;code&gt;&lt;br /&gt;
(defmethod &lt;b style=&quot;color: red;&quot;&gt;show&lt;/b&gt; ((tweet tweet) &amp;amp;optional (s *standard-output*))&lt;br /&gt;
&amp;nbsp;&amp;nbsp; (format s &quot;~&amp;amp;~150&amp;lt;~a~; ~a~&amp;gt;&quot;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (twitter-user-screen-name (tweet-user tweet))&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (tweet-created-at tweet))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (format s &quot;~&amp;amp;~A&quot; (tweet-text tweet))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (format s &quot;~&amp;amp;~A&quot; *seperator*))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The user information contained in the tweet is only printed selectively.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Containers of twitter objects are handled by mapping&lt;b&gt; show&lt;/b&gt; over their content :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(defmethod &lt;b style=&quot;color: red;&quot;&gt;show&lt;/b&gt; ((obj cons) &amp;amp;optional (s *standard-output*))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (length (mapcar (lambda (el) (show el s)) obj)))&lt;br /&gt;
&lt;br /&gt;
(defmethod &lt;b style=&quot;color: red;&quot;&gt;show&lt;/b&gt; ((obj hash-table) &amp;amp;optional (s *standard-output*))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (maphash (lambda (k v) (declare (ignore k)) (show v s)) obj))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The special cl-twitter repl mode overrides the default pretty printer with the &lt;b&gt;show&lt;/b&gt; command for cl-twitter entities.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;When the cl-twitter repl mode is invoked, the common lisp function &lt;b&gt;&lt;a href=&quot;http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node259.html&quot;&gt;copy-pprint-dispatch&lt;/a&gt; &lt;/b&gt;is called to store save current dispatch table by binding it to a dynamic variable. This is done using &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;(pprint-dispatch &#39;cons) &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;with &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;the default pretty printer for conses as well.&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; We need to do this because &lt;b&gt;show&lt;/b&gt; &#39;s specialization for conses would be invoked for all of them and not just the ones containing cl-twitter objects. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The alternative pretty printer&lt;b&gt; pp-show&lt;/b&gt; is installed into the dispatch table using &lt;b&gt;set-pprint-dispatch&lt;/b&gt; by mapping it over a list of twitter types :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt; (defun &lt;b style=&quot;color: red;&quot;&gt;install-new-dispatchers&lt;/b&gt; ()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;   (mapcar (lambda (type) (set-pprint-dispatch type #&#39;&lt;b style=&quot;color: red;&quot;&gt;pp-show&lt;/b&gt;)) *twitter-types*))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;pp-show&lt;/b&gt; is designed to route cons and hash table containers to the right pretty printer for their contents:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(defun &lt;b style=&quot;background-color: white; color: red;&quot;&gt;pp-show&lt;/b&gt; (stream o)&lt;br /&gt;
&amp;nbsp;   (if (or (twitterp o) (and (consp o) (twitterp (car o))) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;                            (and (hash-table-p o) (twitterp (car-ht-value o))))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (show o (or &lt;b style=&quot;color: #38761d;&quot;&gt;*cl-twit-repl-stream*&lt;/b&gt; stream))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       (funcall *saved-pprint-dispatch-cons* stream o)))&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;If the object passed into &lt;b&gt;pp-show&lt;/b&gt; is in the list of twitter objects it&#39;s routed to &lt;b&gt;show&lt;/b&gt;. If the object is a container (either a cons or a hash table) one element is extracted and examined (car-ht-value s function which returns one value from a hash table). If that element is a twitter object, the object is similarly passed to &lt;b&gt;show&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Containers returned by twitter contain only twitter objects. However, it &#39;s possible for a user to create a cons of mixed objects. If the first element is not a twitter object the regular pretty printer will be used. &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b style=&quot;color: #38761d;&quot;&gt;*cl-twit-repl-stream*&lt;/b&gt; is set to standard out and twitter objects are will show up differently on the repl from other objects.&lt;/div&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The dispatch table is restored when the twitter mode of the repl is turned off.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;So it turns out that it&#39;s pretty easy to customize the pretty printer and to make the repl a bit more usable for twittering.&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2011/01/cl-twitter-repls-pretty-printer.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-6714780122194394755</guid><pubDate>Tue, 04 Jan 2011 03:12:00 +0000</pubDate><atom:updated>2011-01-03T22:12:23.513-05:00</atom:updated><title>twittering from the repl : Motivation and Requirements</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;A simple repl based client is part of the cl-twitter project. At first I thought of this more as a gag than as something potentially useful. Why would anyone use something other than one of the many twittter gui&#39;s ? Those gui&#39;s certainly look a lot more polished than a slime/swank repl.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;But what if you wanted to filter out all the links in your time line ? Or wanted to see who your 20567th follower is ? Sure, you can search google for twitter managment tools that will give you that capability. But having the flexibility to script your own functions would be one potential advantage a repl based twitter client would give you.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;I decided that the cl-twitter repl needed to meet at least these three requirements to be useful:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;A useful representation of twitter&#39;s various classes and structures.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Automatic authentication when used for the first time.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The ability to create simple commands.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;ol&gt;&lt;/ol&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Let&#39;s look at each requirement in detail:&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The default pretty print for twitter objects is pretty basic : It&#39;s a string naming the object, plus one or two fields. For example, search results are stored in a hash table and that&#39;s all that&#39;s printed at the repl : &lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
CL-USER&amp;gt; (do-search &quot;hello&quot; :max-pages 1)&lt;br /&gt;
&amp;lt; hash-table 100=&quot;&quot; :count=&quot;&quot; :test=&quot;&quot; equal=&quot;&quot; {10039eef21}=&quot;&quot; &amp;gt;&lt;br /&gt;
CL-USER; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;It&#39;s obviously a lot more useful to see expanded results printed to stdout. cl-twitter&#39;s &lt;b&gt;show &lt;/b&gt;command is set up to accomplish this.Calling &lt;b&gt;show&lt;/b&gt; on the output of &lt;b&gt;do-search&lt;/b&gt; :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(show (do-search &quot;hello&quot;))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
results in output like this :&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
[....]&lt;br /&gt;
From: OhMyBiebsss                                                                                                                       To: CorbinBleu&lt;br /&gt;
@corbinbleu it would be legit if you tweeted me a simple HELLO EUNICE. (:&lt;br /&gt;
Mon, 03 Jan 2011 23:54:09 +0000&lt;br /&gt;
&lt;br /&gt;
From: maupadilla89                                                                                                                                To: &lt;br /&gt;
Feeling like: Hello, I love you Won&#39;t you tell me your name? Hello, I love you Let me jump in your game... Hello, Hello, Hello,I want you&lt;br /&gt;
Mon, 03 Jan 2011 23:54:09 +0000&lt;br /&gt;
&lt;br /&gt;
From: OmgashBieber                                                                                                                                To: &lt;br /&gt;
RT @Mrs_LautnerMars: @OmgashBieber Hello Yasmin. ♥&lt;br /&gt;
Mon, 03 Jan 2011 23:54:08 +0000&lt;br /&gt;
&lt;br /&gt;
From: CastielTheOnly                                                                                                                To: GritsandCoffee&lt;br /&gt;
@GritsandCoffee Hello.&lt;br /&gt;
Mon, 03 Jan 2011 23:54:08 +0000&lt;br /&gt;
&lt;br /&gt;
From: _KONKRETE_ROSE                                                                                                                              To: &lt;br /&gt;
MOTHERRRR!!! MJ voice! Tell her I said HELLO! ^__^ @OrangeBone_ About to dye my mom&#39;s hair I wish she would keep it gray. Gray is beautiful.&lt;br /&gt;
Mon, 03 Jan 2011 23:54:07 +0000&lt;br /&gt;
&lt;br /&gt;
From: Beauty_Bahja                                                                                                                                To: &lt;br /&gt;
Hello everybody Missed Me ? Lol&lt;br /&gt;
Mon, 03 Jan 2011 23:54:07 +0000&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The first requirement requires replacing the default pretty printer for the objects defined in cl-twitter with the &lt;b&gt;show&lt;/b&gt; command.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The second requirement aims to streamline the authentication process for first time users. That way you get the initial OUATH handshake with twitter out of the way. There is by the way no need to login for most read operations, like searches. You just have a much lower rate limit.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The third requirement covers the creation of (simple) functions without necessarily creating an additional lisp source file. I basically envisaged three use cases :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;aliasing&lt;/b&gt; : Rather than type out &lt;b&gt;(&lt;/b&gt;&lt;i&gt;&lt;b&gt;public-timeline)&lt;/b&gt;&lt;/i&gt; every time you my want to alias it so that you can use &lt;b&gt;(pt)&lt;/b&gt; instead.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;currying&lt;/b&gt; : Suppose you want to search for &quot;#lisp&quot; on a regular basis, you should be able to do something like :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(alias s (do-search &quot;#lisp&quot;))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;Subsequent invocations would still respect the &lt;b&gt;:max-pages &lt;/b&gt;key word&amp;nbsp; o&lt;b&gt;f do-search&lt;/b&gt; viz.:&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(s :max-pages 1)&lt;br /&gt;
(s :max-pages 5)&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;lambda &lt;/b&gt;: You should have the ability to create you own functions by combining cl-twitter api calls with regular lisp functions. For example, suppose you wanted to write a function to get more details on a particular user&#39;s followers. &lt;b&gt;collect-follower-ids&lt;/b&gt; returns a user&#39;s followers as a list of the twitter user ids. You can then map&lt;b&gt; show-user-by-id&lt;/b&gt; over (part of the) list to get each user&#39;s details. Each call of &lt;b&gt;show-user-by-id&lt;/b&gt; goes against the rate limit so you don&#39;t want to just blindly apply it. A reasonable implementation would be :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(alias lof (lambda (screen-name count) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (mapcar #&#39;show-user-by-id &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (subseq (collect-follower-ids screen-name)&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count (+ count 10)) &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
That way &lt;b&gt;(lof &quot;twitterapi&quot; 100)&lt;/b&gt; would return 10 user credentials, starting at position 100 in the list returned by &lt;b&gt;(collect-follower-ids &quot;twitterapi&quot;)&lt;/b&gt;.&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Clearly, the following three declarations should be equivalent :&lt;/div&gt;&lt;code&gt;&lt;br /&gt;
(alias pt public-timeline)&lt;br /&gt;
(alias pt (public-timeline))&lt;br /&gt;
(alias pt (lambda () (public-timeline)))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Initially I was quite intrigued by&amp;nbsp;&lt;a href=&quot;http://landoflisp.com/&quot;&gt;land of lisp&lt;/a&gt;&#39;s approach of constructing you&#39;re own repl. But it turned out that such a radical approach was not necessary. In fact, it was fairly easy to tweak the existing repl to meet all three requirements, as I&quot;ll detail in the next few blog posts.&lt;/div&gt;</description><link>http://cl-twitter.blogspot.com/2011/01/twittering-from-repl-motivation-and.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-4717793082755560367</guid><pubDate>Sun, 26 Dec 2010 21:54:00 +0000</pubDate><atom:updated>2010-12-26T16:54:33.204-05:00</atom:updated><title>creating list time lines with cl-twitter.</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;A list on twitter is an alternative way to keep track of status updates (or tweets) from a group of people without necessarily befriending or following them. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;A twitter user has  one of three relationships to a list: he&#39;s either the list owner, a  member of the list or a subscriber to the list.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;If you look at twitter as an information gathering device, lists that  are somehow&amp;nbsp; linked to you are a reasonable way to discover information that  maybe relevant to you. This is pretty obvious when you&#39;re the creator or  subscriber of a list. Equally, when someone has added you as a member that&#39;s an  indication they think you and that group of users have something in  common.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;This post will show how you can use the twitter api (through&amp;nbsp;&lt;a href=&quot;https://github.com/fons/cl-twitter&quot;&gt;cl-twitter&lt;/a&gt; ) to get status updates (or tweets) from the lists a user has created, the lists he&#39;s a member off and the lists he has subscribed to.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Twitter provides a simple call to see the tweets of the people you follow like the&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/statuses/home_timeline&quot;&gt;home timeline&lt;/a&gt; or the &lt;a href=&quot;http://dev.twitter.com/doc/get/statuses/friends_timeline&quot;&gt;friends timeline&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The equivalent &lt;a href=&quot;http://dev.twitter.com/doc/get/:user/lists/:id/statuses&quot;&gt;list statuses api&lt;/a&gt;&lt;/span&gt; &lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;is not so straightforward to use, as you need to provide not only the list owner but also the list id. We need to combine this with the &lt;a href=&quot;http://dev.twitter.com/doc/get/:user/lists&quot;&gt;user list&lt;/a&gt; api call to get all the (public) lists this user has created. Similarly the&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/:user/lists/memberships&quot;&gt;membership&lt;/a&gt; and &lt;a href=&quot;http://dev.twitter.com/doc/get/:user/lists/subscriptions&quot;&gt;subscriptions&lt;/a&gt; api calls provide the lists the user is a member of or is subscribed to.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The &lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;a href=&quot;http://dev.twitter.com/doc/get/:user/lists/:id/statuses&quot;&gt;list statuses api&lt;/a&gt; breaks the results into pages and the page option can be used to create a read cursor over the result set. This is twitter&#39;s usual way to handle (potentially) large results set of tweets. cl-twitter&#39;s has a macro that encapsulates this paging mechanism. There&#39;s an additional macro that will handle results sets consisting of tweets.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Here are the functions used to retrieve the time lines : &lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(defun &lt;b style=&quot;color: red;&quot;&gt;collect-user-list-statuses&lt;/b&gt; (&lt;i&gt;&lt;b&gt;list-owner list-id &lt;/b&gt;&lt;/i&gt;&amp;amp;key (max -1)&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (skip 0) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;                                   (&lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt; (make-hash-table  :test &#39;equal&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :size 100)))&lt;br /&gt;
&amp;nbsp;    (&lt;b style=&quot;color: red;&quot;&gt;collect-tweets&lt;/b&gt; (:max max :skip skip :container &lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt;) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b style=&quot;color: red;&quot;&gt;           statuses-user-lists&lt;/b&gt;        :list-owner &lt;b&gt;&lt;i&gt;list-owner&lt;/i&gt;&lt;/b&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :id &lt;i&gt;&lt;b&gt;list-id&lt;/b&gt;&lt;/i&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :page 1))&lt;br /&gt;
&lt;br /&gt;
(defun &lt;b style=&quot;color: red;&quot;&gt;user-list-timeline &lt;/b&gt;(&lt;i&gt;&lt;b&gt;list-owner&lt;/b&gt;&lt;/i&gt; &amp;amp;key (max-per-list 1) )&lt;br /&gt;
&amp;nbsp;   (let ((user-list-ids (mapcar #&#39;list-type-id &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;            (cursor-user-lists-lists (get-user-lists :list-owner &lt;i&gt;&lt;b&gt;list-owner)&lt;/b&gt;&lt;/i&gt;)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         (&lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt; (make-hash-table  :test &#39;equal :size 100)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;          (dolist (&lt;i style=&quot;color: #3d85c6;&quot;&gt;&lt;b&gt;list-id&lt;/b&gt;&lt;/i&gt; user-list-ids)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;            (setf &lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;collect-user-list-statuses&lt;/span&gt;&lt;/b&gt; &lt;b&gt;list-owner&lt;/b&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;i style=&quot;color: #3d85c6;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list-id &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :max max-per-list&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :container &lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt;)))&lt;br /&gt;
&amp;nbsp;    &lt;b style=&quot;color: #38761d;&quot;&gt;container&lt;/b&gt;))&lt;br /&gt;
&lt;br /&gt;
(defun &lt;b style=&quot;color: red;&quot;&gt;member-list-timeline&lt;/b&gt; (&lt;i&gt;&lt;b&gt;user&lt;/b&gt;&lt;/i&gt; &amp;amp;key (max-per-list 1) )&lt;br /&gt;
&amp;nbsp;   (labels ((user-list-data (ul)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     (list (twitter-user-screen-name (list-type-user ul)) (list-type-slug ul)))) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;     (let ((ulst (mapcar #&#39;user-list-data &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;                (cursor-user-lists-lists (&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;memberships-user-lists&lt;/span&gt;&lt;/b&gt; :screen-name&lt;i&gt;&lt;b&gt; user&lt;/b&gt;&lt;/i&gt;))))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt; (make-hash-table  :test &#39;equal :size 100)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;            (dolist (item ulst)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (setf &lt;b style=&quot;color: #38761d;&quot;&gt;container&lt;/b&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;collect-user-list-statuses&lt;/span&gt;&lt;/b&gt; (car item)&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (cadr item) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :max max-per-list&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :container &lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;container&lt;/span&gt;&lt;/b&gt;)))&lt;br /&gt;
&amp;nbsp;     &lt;b style=&quot;color: #38761d;&quot;&gt;container&lt;/b&gt;)))&lt;br /&gt;
&lt;br /&gt;
(defun &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;subscriber-list-timeline&lt;/span&gt;&lt;/b&gt; (&lt;i&gt;&lt;b&gt;user&lt;/b&gt;&lt;/i&gt; &amp;amp;key (max-per-list 1) )&lt;br /&gt;
&amp;nbsp;   (labels ((user-list-data (ul)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      (list (twitter-user-screen-name (list-type-user ul)) (list-type-slug ul)))) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;     (let ((ulst (mapcar #&#39;user-list-data &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;             (cursor-user-lists-lists (&lt;b style=&quot;color: red;&quot;&gt;subscriptions-user-lists&lt;/b&gt; :screen-name &lt;i&gt;&lt;b&gt;user&lt;/b&gt;&lt;/i&gt;))))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b style=&quot;color: #274e13;&quot;&gt;container&lt;/b&gt; (make-hash-table  :test &#39;equal :size 100)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        (dolist (item ulst)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (setf &lt;b style=&quot;color: #38761d;&quot;&gt;container&amp;nbsp;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b style=&quot;color: #cc0000;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;collect-user-list-statuses&lt;/span&gt; &lt;/b&gt;(car item)&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (cadr item) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :max max-per-list&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :container &lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;container&lt;/span&gt;&lt;/b&gt;)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;      &lt;b style=&quot;color: #38761d;&quot;&gt;container&lt;/b&gt;)))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b style=&quot;color: red;&quot;&gt;&lt;br /&gt;
collect-user-list-statutes&lt;/b&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt; uses the &lt;b style=&quot;color: red;&quot;&gt;collect-tweets &lt;/b&gt;&lt;/span&gt;&lt;/span&gt; macro to retrieve tweets by paging through the result set. The api does not provide a good stopping criterium. &lt;b style=&quot;color: red;&quot;&gt;collect-tweets&lt;/b&gt; stops collecting when the size of the hash tables doesn&#39;t change anymore, or when the number of pages specified by the :max keyword parameter is reached.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b style=&quot;color: red;&quot;&gt;user-list-timeline&lt;/b&gt;, &lt;b style=&quot;color: red;&quot;&gt;member-list-timeline&lt;/b&gt; and &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;subscriber-list-timeline&lt;span style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;all &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;have a similar structure: After collecting the lists the user either owns, is a member off or subscribes to, it collects all the tweets of the users in those lists in a hash table. In all three cases I retrieve only the first page. Here&#39;s a quick demo to illustrate this :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;I &#39;m subscribed to two lists, both of which are set up by other twitter users : &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(show (collect-user-list-subscriptions &quot;mohegskunkworks&quot;))&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
semantic-web                      @mark_l_watson/semantic-web                            &lt;br /&gt;
id : 956750 owner : mark_l_watson members : 6 mode :public &lt;br /&gt;
&lt;br /&gt;
functional                        @crtvzen/functional                                    clojure/scala and related&lt;br /&gt;
id : 6028588 owner : crtvzen members : 37 mode :public &lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;To get the status updates use :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(show (subscriber-list-timeline &quot;mohegskunkworks&quot;))&lt;br /&gt;
&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;kendall                                                                                                                 Sun Dec 26 20:34:43 +0000 2010&lt;br /&gt;
Generally, ferreting out an assumption of a universal value isn&#39;t a very potent gotcha in my view.&lt;br /&gt;
kendall                                                                                                                Sun Dec 26 20:05:42 +0000 2010&lt;br /&gt;
@kendall Btw, not at all clear to me &#39;science&#39; can even be coherently described w/out reference to many values, most of all truth seeking.&lt;br /&gt;
kendall                                                                                                                 Sun Dec 26 19:33:54 +0000 2010&lt;br /&gt;
My rabbit loin and liver cigars with chard and fennel turned out very well. http://yfrog.com/h6sufrj&lt;br /&gt;
[...]&lt;br /&gt;
debasishg                                                                                                               Sun Dec 26 10:36:40 +0000 2010&lt;br /&gt;
I like Erlang syntax .. is that weird ? It so closely models the semantics of the language.&lt;br /&gt;
&lt;br /&gt;
jorgeortiz85                                                                                                            Sun Dec 26 06:19:47 +0000 2010&lt;br /&gt;
Just got out of TRON 3D!!! And I have to be at the airport in 5 hours... No sweat. (@ Cinépolis Valle Oriente) http://4sq.com/eedJmQ&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;This returns forty status updates at the moment, which I&#39;ve abbreviated above to just a few.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The argument to the three list timelines above can be any twitter user. In order to scan through the lists user&amp;nbsp; &lt;a href=&quot;http://twitter.com/#%21/fogus&quot;&gt;fogus  &lt;/a&gt;is a member of you&#39;d do :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(member-list-timeline &quot;fogus&quot;)&lt;br /&gt;
&lt;hash-table 329=&quot;&quot; :count=&quot;&quot; :test=&quot;&quot; equal=&quot;&quot; {10038859c1}=&quot;&quot;&gt;&lt;br /&gt;
&lt;/hash-table&gt;&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;I&#39;ve not used the &lt;b style=&quot;color: red;&quot;&gt;show&lt;/b&gt; function to print out the results set of the hash table returned by member-list-timeline.&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
(user-list-timeline &quot;fogus&quot;)&lt;br /&gt;
&lt;hash-table 20=&quot;&quot; :count=&quot;&quot; :test=&quot;&quot; equal=&quot;&quot; {10038cf361}=&quot;&quot;&gt; &lt;/hash-table&gt;&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;As you can see this user has set up a list, which generates at least one page of tweets.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2010/12/creating-list-time-lines-with-cl.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-587204610288184593</guid><pubDate>Fri, 24 Dec 2010 17:02:00 +0000</pubDate><atom:updated>2010-12-24T12:02:12.792-05:00</atom:updated><title>Exploring Mid Town Manhattan with Twitter&#39;s geo search api</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;What if you were new in town, pulled out your mobile device and immediately saw all the restaurants a mile or so around you ? What if you could also see which of them friends in your network had visited ? Or better yet, the tweets the local food critic sent out ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Twitter extended it&#39;s api to search for&amp;nbsp; &lt;a href=&quot;http://dev.twitter.com/pages/finding_tweets_about_places&quot;&gt;tweets about places&lt;/a&gt;&lt;/span&gt; &lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;which would be one step in that direction. In addition, twitter &#39;s &lt;a href=&quot;http://developer.twitter.com/doc/get/geo/search&quot;&gt;geo resources&lt;/a&gt; api allows you to look up location information.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;a href=&quot;http://developer.twitter.com/doc/get/geo/search&quot;&gt;goe search&lt;/a&gt; allows you to search for locations given a longitude and latitude.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;In cl-twiter you can execute the api call like this :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;(defun geo-search (lat long &amp;amp;rest args &amp;amp;key (query nil) (granularity nil) (max-results 20) (ip nil) (accuracy nil) (contained-within) (attribute-&amp;gt;street_address) )&lt;br /&gt;
(declare (ignore query granularity max-results ip accuracy contained-within attribute-&amp;gt;street_address))&lt;br /&gt;
(apply &#39;twitter-op :geo/search :lat lat :long long args )) &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The granularity can be &quot;poi&quot; (point-of-interest), &quot;neighboorhood&quot;, &quot;admin&quot;, &quot;city&quot; or &quot;country&quot;, where &quot;neighborhood&quot; is the default.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;To look for &quot;points of interest&quot; around Times Square (&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Latitude = 40.7590, Longitude = -73.9845 according to &lt;a href=&quot;http://www.satsig.net/maps/lat-long-finder.htm&quot;&gt;this satellite signals website&lt;/a&gt; ) you&#39;d do something like this:&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;(show (geo-search 40.7590 -73.9845 ))&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif; font-size: small;&quot;&gt; The output looks like this :&lt;/span&gt;&lt;/pre&gt;&lt;code&gt; neighborhood  Theater District - Times Square, New York                        NIL                                     United States&lt;br /&gt;
neighborhood  Midtown Center, New York                                         NIL                                     United States&lt;br /&gt;
neighborhood  Clinton, New York                                                NIL                                     United States&lt;br /&gt;
city          Manhattan, NY                                                    NIL                                     United States&lt;br /&gt;
city          New York, NY                                                     NIL                                     United States&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;By adding the :granularity &quot;poi&quot; option, we get all the points of interest at this location :&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;TWIT&amp;gt; (show (geo-search 40.7590 -73.9845 :granularity &quot;poi&quot; :max-results 100)) &lt;br /&gt;
poi           Sbarro, New York                                                 701 7th Ave, Frnt 1                     United States&lt;br /&gt;
poi           Pig&#39;n&#39;  Whistle, New York                                        165 W 47th St # 2                       United States&lt;br /&gt;
poi           New York Guest, New York                                         1560 Broadway                           United States&lt;br /&gt;
poi           McDonald&#39;s, New York                                             1560 Broadway, Frnt 2                   United States&lt;br /&gt;
[.....]&lt;br /&gt;
poi           Palace Theatre, New York                                         1564 Broadway                           United States&lt;br /&gt;
poi           Adam&#39;s Family Merchandise, New York                              205 W 46th St                           United States&lt;br /&gt;
poi           Charlotte Wilcox &amp;amp; Co, New York                                  1560 Broadway                           United States&lt;br /&gt;
poi           Times Square Gift Shop, New York                                 1560 Broadway                           United States&lt;br /&gt;
poi           Actors Equity, New York                                          1560 Broadway                           United States&lt;br /&gt;
neighborhood  Theater District - Times Square, New York                        NIL                                     United States&lt;br /&gt;
neighborhood  Midtown Center, New York                                         NIL                                     United States&lt;br /&gt;
neighborhood  Clinton, New York                                                NIL                                     United States&lt;br /&gt;
city          Manhattan, NY                                                    NIL                                     United States&lt;br /&gt;
city          New York, NY                                                     NIL                                     United States&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Moving slightly south we get a different set of points :&lt;/div&gt;&lt;code&gt;&lt;br /&gt;
(show (geo-search 40.7580 -73.9845 :granularity &quot;poi&quot; :max-results 100))&lt;br /&gt;
poi           Le Marais, New York                                              150 W 46th St                           United States&lt;br /&gt;
poi           Shubert Archive, New York                                        149 W 45th St                           United States&lt;br /&gt;
poi           Lyceum Theatre, New York                                         149 W 45th St                           United States&lt;br /&gt;
poi           O&#39;Lunney&#39;s, New York                                             145 W 45th St                           United States&lt;br /&gt;
poi           Nails Town, New York                                             157 W 46th St                           United States&lt;br /&gt;
poi           Drummers World, New York                                         151 W 46th St # 3                       United States&lt;br /&gt;
poi           Havana Central Times Square, New York                            151 W 46th St                           United States&lt;br /&gt;
[...]&lt;br /&gt;
poi           Margon Restaurant, New York                                      136 W 46th St # 1                       United States&lt;br /&gt;
neighborhood  Theater District - Times Square, New York                        NIL                                     United States&lt;br /&gt;
neighborhood  Midtown Center, New York                                         NIL                                     United States&lt;br /&gt;
neighborhood  Midtown South Central, New York                                  NIL                                     United States&lt;br /&gt;
city          Manhattan, NY                                                    NIL                                     United States&lt;br /&gt;
city          New York, NY                                                     NIL                                     United States&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;To be honest, the point of the geo api is somewhat lost on me. Judging from the results the goal of the api seems to be to provide a geographic anchor to the status updates. Since the inputs are longitude and latitude, the api feels like it&#39;s designed to work with a device, where this type of data is fairly easily available.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The api supports query strings, but in my admittedly limited testing I&#39;ve not been able to get data returned using just a search query.&amp;nbsp; &lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The api would be more useful in my mind if it returned a all the places by category (like restaurants or museum) within a reasonable distance. Those results could than be cross referenced with status updates from users in the same area or the businesses themselves. That way you could connect with someone at the location and get some idea if it&#39;s worth going there.&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;/div&gt;</description><link>http://cl-twitter.blogspot.com/2010/12/exploring-mid-town-manhattan-with.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-6249948760999165684</guid><pubDate>Mon, 13 Dec 2010 01:07:00 +0000</pubDate><atom:updated>2010-12-12T20:07:18.650-05:00</atom:updated><title>cl-twitter&#39;s api is feature complete</title><description>&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;When I started this project I created a&lt;a href=&quot;https://spreadsheets.google.com/ccc?key=0AvMxEpw5nMindFRrY0JfNDBCWWhvZ2xmUTNQVXY3ekE&amp;amp;hl=en&quot;&gt; spreadsheet&lt;/a&gt; showing the state of each rest api call. The initial version of cl-twitter covered 53 out of a total of 96 rest calls of specified by the &lt;a href=&quot;http://dev.twitter.com/doc&quot;&gt;twitter api.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;At this stage cl-twitter covers the twitter api completely.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;What that means is that all the rest api calls can be made through cl-twitter, and the reply is converted to a data type. The data types cover a large part of the twitter entities. What&#39;s missing is support for&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/pages/tweet_entities&quot;&gt;tweet entities&lt;/a&gt; and for some of the geo data (notably yahoo&#39;s&amp;nbsp;&lt;a href=&quot;http://developer.yahoo.com/geo/geoplanet/guide/concepts.html&quot;&gt;where on earth identifiers (woeid))&lt;/a&gt;&lt;/span&gt; . &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;There is benefit to adding entities, and it should be straightforward. Adding WOEID&#39;s on the other hand is not high on the priority list.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;The next stage is to build out the twitter repl application, which will be based on the api calls. In addition, I&quot;ll also take a look at the persistence interface. &lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2010/12/cl-twitters-api-is-feature-complete.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-1610296127101574924</guid><pubDate>Tue, 07 Dec 2010 10:45:00 +0000</pubDate><atom:updated>2010-12-07T11:06:02.884-05:00</atom:updated><title>Searching twitter with cl-twitter</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Twitter&#39;s&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/search&quot;&gt;search api&lt;/a&gt;&amp;nbsp;provides the interface to twitter&#39;s huge collection of tweets. For anyone studying the social phenomena that is twitter, having access to these is invaluable.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The search api is somewhat &lt;a href=&quot;http://dev.twitter.com/pages/api_overview&quot;&gt;distinct&lt;/a&gt;&amp;nbsp;from the other rest api calls. To underscore this&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;point, there is an &lt;a href=&quot;http://code.google.com/p/twitter-api/issues/detail?id=214&quot;&gt;outstanding bug&lt;/a&gt;&amp;nbsp;where the client id&#39;s returned by the search api don&#39;t match up with those returned by the rest of the api. In addition, because the search api has its own rate limiting,&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;calling&amp;nbsp;&lt;a href=&quot;https://github.com/fons/cl-twitter/blob/master/api/twitter-account.lisp&quot;&gt;rate-limit-exceeded&lt;/a&gt;&amp;nbsp;won&#39;t give you the remaining number of calls.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The search api returns at most 1500 results, in chunks of &amp;nbsp;at most 100. The chunk (or page) size is set by the rpp (results per page) option. Subsequent pages are accessed by the page page parameter. This feature of the search api is similar to the cursor functionality of the&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/friends/ids&quot;&gt;friends&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/followers/ids&quot;&gt;followers&lt;/a&gt;&amp;nbsp;api calls.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The basic api call is &lt;b&gt;search-twitter&lt;/b&gt; :&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;(defun &lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;search-twitter&lt;/span&gt;&lt;/strong&gt; (&lt;span style=&quot;color: red;&quot;&gt;query&lt;/span&gt; &amp;amp;rest args 
                                  &amp;amp;key &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;em&gt;(callback nil) 
                                       (lang nil) 
                                       (locale nil) 
                                       &lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;(rpp nil)&lt;/strong&gt;&lt;/span&gt; 
                                       (&lt;strong&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;page nil&lt;/span&gt;&lt;/strong&gt;)
                                       (&lt;span style=&quot;color: black;&quot;&gt;since-id nil&lt;/span&gt;) 
                                       (until nil) 
                                       (geocode nil) 
                                       (show-user nil) 
                                       (result-type nil)&lt;/em&gt; )
  
     (declare (ignore callback lang locale 
                     rpp page since-id until 
                     geocode show-user 
                     result-type ))
      (&lt;span style=&quot;color: red;&quot;&gt;apply&lt;/span&gt; &#39;twitter-op &lt;span style=&quot;color: red;&quot;&gt;:search&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;:q query&lt;/span&gt; 
              (rem-nil-keywords args &#39;(:callback 
                                       :geocode 
                                       :lang 
                                       :until))))&lt;/span&gt;

&lt;/pre&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The query is the main argument. The keywords &lt;b&gt;:rpp&lt;/b&gt; and &lt;b&gt;:page&lt;/b&gt;&amp;nbsp;control the paging as mentioned above. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Paging is encapsulated by the &lt;b&gt;with-paging&lt;/b&gt; macro. The main search api call&amp;nbsp;&lt;b&gt;do-search&lt;/b&gt;&amp;nbsp;is set up to page over the largest possible result set :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;(defun &lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;do-search&lt;/strong&gt;&lt;/span&gt; (query &amp;amp;key (max-pages 15) )  
   (let ((&lt;strong&gt;&lt;span style=&quot;color: black;&quot;&gt;ht&lt;/span&gt;&lt;/strong&gt; (make-hash-table  :test &#39;equal :size 1500)))    
           (labels ((&lt;strong&gt;&lt;span style=&quot;color: red;&quot;&gt;collect-it&lt;/span&gt;&lt;/strong&gt; (slst)        
                    (dolist (item slst)   
                        (setf (gethash (search-ref-id item) ht) item))))      
    (&lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;with-paging&lt;/strong&gt;&lt;/span&gt; (:collector #&#39;collect-it :max-pages max-pages :test #&#39;rate-limit-exceeded ) 
                         (&lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;search-twitter&lt;/strong&gt;&lt;/span&gt; query))     
   ht)))
&lt;/pre&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;As you can see the result are returned in a hash map keyed on the (unique) search id. The value of the has table is a &lt;b&gt;search reference&lt;/b&gt; :&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;(&lt;strong&gt;define-element&lt;/strong&gt; &lt;span style=&quot;color: red;&quot;&gt;search-ref ( (metadata search-ref-metadata))&lt;/span&gt;
  &lt;span style=&quot;color: red;&quot;&gt;&quot;An individual search reference&quot;&lt;/span&gt;
  (&lt;span style=&quot;color: red;&quot;&gt;id&lt;/span&gt; &quot;Integer ID of message&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;text&lt;/span&gt; &quot;The text of the tweet&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;to-user&lt;/span&gt; &quot;Screen name&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;to-user-id&lt;/span&gt; &quot;ID of receiver&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;from-user&lt;/span&gt; &quot;Screen name&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;from-user-id&lt;/span&gt; &quot;ID of sender&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;iso-language-code&lt;/span&gt; &quot;Two character language code for content&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;source&lt;/span&gt; &quot;Source of the result&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;profile-image-url&lt;/span&gt; &quot;The profile image of the sender&quot;)
  (&lt;span style=&quot;color: red;&quot;&gt;created-at&lt;/span&gt; &quot;The date of message creation&quot; nil)
  (&lt;span style=&quot;color: red;&quot;&gt;metadata&lt;/span&gt; nil &quot;&quot;)
  (&lt;span style=&quot;color: red;&quot;&gt;geo&lt;/span&gt; &quot;FIXME unparsed&quot;))

&lt;/pre&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;You can use the &lt;b&gt;print-search-ref&lt;/b&gt;&amp;nbsp;function to pretty-print the output.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;A typical session would look like this :&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;TWIT&amp;gt; &lt;strong&gt;(setf *R* (do-search &quot;Ponies&quot;))&lt;/strong&gt;
#&lt;hash-table 1499=&quot;&quot; :count=&quot;&quot; :test=&quot;&quot; equal=&quot;&quot; {100413af21}=&quot;&quot;&gt;
TWIT&amp;gt; &lt;strong&gt;(maphash (lambda (k v) (&lt;span style=&quot;color: red;&quot;&gt;print-search-ref&lt;/span&gt; v)) *R*)&lt;/strong&gt;
[...]
[Mon, 06 Dec 2010 07:54:53 +0000] TheMightyAlexx_:    I love ponies and sunshine and *falls* privates!
[Mon, 06 Dec 2010 07:52:51 +0000] HabboGuy:           @Dq231 I LIKE PONIES AND SUNINE AND DOOSH SNOOKIE
[Mon, 06 Dec 2010 07:51:41 +0000] stationbred:        That fancy Spanish horse and his grassyarse. Why can&#39;t he just say &quot;thanks&quot; like the rest of us common or garden ponies...
[Mon, 06 Dec 2010 07:37:24 +0000] DSchiller:          Off to see the ponies..in the rain! Looove
[Mon, 06 Dec 2010 07:29:21 +0000] BarackOBoogie:      &quot;@Meezy_TaughtYou: @snazmindanielle Did you just call us ponies?? YOU WERE A DOLPHIN!&quot; (Remember That Noise!)
[Mon, 06 Dec 2010 07:28:44 +0000] Meezy_TaughtYou:    @snazmindanielle Did you just call us ponies?? YOU WERE A DOLPHIN!
[...]

&lt;/pre&gt;</description><link>http://cl-twitter.blogspot.com/2010/12/searching-twitter-with-cl-twitter.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-8687261547688850329</guid><pubDate>Tue, 30 Nov 2010 02:40:00 +0000</pubDate><atom:updated>2010-12-08T06:08:07.938-05:00</atom:updated><title>Querying the social graph with cl-twitter</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Among other things the twitter api provides the ability to obtain the user ids of a&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/friends/ids&quot;&gt;friends&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc/get/followers/ids&quot;&gt;followers&lt;/a&gt;&amp;nbsp;of a twitter user. You can use a cursor when there are more than 5000 friends or followers. In fact, if you don&#39;t use a cursor and the result set exceeds some predefined limit the call will return an error code.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
The cl-twitter api of the basic calls is fairly simple. The ids of the users friends are returned by :&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;(defun &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;friend-ids&lt;/span&gt; (screen-name &amp;amp;key (&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;cursor&lt;/span&gt; -1))
  (apply &#39;twitter-op :friends/ids :screen-name screen-name 
                     :cursor cursor nil ))

(defun &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;follower-ids&lt;/span&gt; (screen-name &amp;amp;key (&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;cursor&lt;/span&gt; -1))
  (apply &#39;twitter-op :followers/ids :screen-name screen-name 
                     :cursor cursor nil ))

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The real fun begins&amp;nbsp;when the list of followers or friends is large enough to require cursors. Cursor mode is invoked by setting the cursor to -1. As &amp;nbsp;mentioned before the use of a cursor is optional, but will result in an error should the size of the results returned exceed a predefined limit. There is in other words, no reason not to issue each call with the cursor set to -1, the initial cursor value. If there are multiple result pages the response will include the next cursor value to use on the subsequent call.&lt;strong style=&quot;font-style: italic;&quot;&gt;&amp;nbsp;&lt;/strong&gt;The&lt;em&gt;&lt;strong&gt; friend-ids&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;follower-ids&lt;/strong&gt;&lt;/em&gt; functions shown above can be used to issue subsequent calls by setting &lt;i&gt;&lt;b&gt;:cursor&lt;/b&gt;&lt;/i&gt; to the next cursor value. However, it&#39;s easier to let the&amp;nbsp;&lt;em&gt;&lt;strong&gt;with-cursor&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;macro handle all of those details.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Here&#39;s an example of how &lt;b&gt;&lt;i&gt;with-cursor&lt;/i&gt;&lt;/b&gt; is used :&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;(defun &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-follower-ids&lt;/span&gt; (screen-name &amp;amp;key (max -1) (skip 0))
  (let ((lst))
    (labels ((&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-it&lt;/span&gt; (l)
        (setf lst (nconc lst l))))
      (&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;with-cursor&lt;/span&gt; (:skip skip :max max :extractor #&#39;cursor-id-ids 
                    :controller #&#39;cursor-id-next-cursor 
                    :collector #&#39;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-it&lt;/span&gt; :test #&#39;rate-limit-exceeded ) (follower-ids screen-name)))
    lst))


(defun &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-friend-ids&lt;/span&gt; (screen-name &amp;amp;key (max -1) (skip 0))
  (let ((lst))
    (labels ((&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-it&lt;/span&gt; (l)
        (setf lst (nconc lst l))))
      (&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;with-cursor&lt;/span&gt; (:skip skip :max max :extractor #&#39;cursor-id-ids 
                    :controller #&#39;cursor-id-next-cursor 
                    :collector #&#39;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;collect-it&lt;/span&gt; :test #&#39;rate-limit-exceeded ) (friend-ids screen-name)))
    lst))
&lt;/pre&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;with-cursor&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;manages the retrieval of&amp;nbsp;successive calls to get the full social graph. It allows the caller to specify a &lt;i&gt;collector&lt;/i&gt; as well as a &lt;i&gt;test.&lt;/i&gt;&amp;nbsp;Typically the &lt;/span&gt;&lt;b&gt;&lt;i&gt;collector&lt;/i&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt; will be a closure used to collect the result set into an appropriate data structure. In this case it&#39;s simply a list.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The &lt;/span&gt;&lt;b&gt;&lt;i&gt;test&lt;/i&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt; function is used to give the caller the ability to control the loop in which the data retrieval is done. &amp;nbsp;&lt;i style=&quot;font-weight: bold;&quot;&gt;rate-limit-exceeded&lt;/i&gt;&amp;nbsp;returns true if &amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/pages/rate-limiting&quot;&gt;twitter&#39;s rate limits&lt;/a&gt;&amp;nbsp;have been reached.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Here&#39;s a typical session. Notice the decrease in available queries.&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;CL-USER&amp;gt; (rate-limit-status)
#&lt;twitter-rate-limit &#39;139:150&#39;=&quot;&quot;&gt;
CL-USER&amp;gt; (length (collect-followers &quot;sarahpalinusa&quot;))
318181
CL-USER&amp;gt; (rate-limit-status)
#&lt;twitter-rate-limit &#39;75:150&#39;=&quot;&quot;&gt;
CL-USER&amp;gt; 
&lt;/twitter-rate-limit&gt;&lt;/twitter-rate-limit&gt;&lt;/pre&gt;</description><link>http://cl-twitter.blogspot.com/2010/11/querying-social-graph-with-cl-twitter.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-2422625166934253273</guid><pubDate>Sun, 21 Nov 2010 20:50:00 +0000</pubDate><atom:updated>2010-11-21T15:50:42.322-05:00</atom:updated><title>a note on api design</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;An api to a web service api like cl-twitter has two purposes. The first one is to translate the web service api into native language primitives, constructs and conventions. This is the api as &#39;driver&#39; to the web service. At this level the api simply exposes the twitter api to the developer using language constructs he&#39;s familiar with, and&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;he should be able to build applications using the api.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;For cl-twitter this means things as simple as dashes instead of underscores in names, to using conses as lists, to using macros to define a dsl to specify return types, like the &lt;i&gt;&lt;b&gt;define-element&lt;/b&gt;&lt;/i&gt; &amp;nbsp;macro. Required fields are function arguments and optional fields can be passed in using keywords.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;There is also a second level api. Here, driver level api calls are combined to form building blocks by combining driver calls into logical units. Perhaps they form a simple sample application.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;cl-twitter will have some of this as well, but the focus is on providing a complete driver level api first.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;In the case of cl-twitter &amp;nbsp;the example application allows twitter to be accessed from the repl.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;At this stage there&#39;s also some functionality in cl-twitter which allows tweets to be stored in a database using the elephant package. This is a separate package. I haven&#39;t looked at this yet. Functionality like that is certainly useful, but would not want to tie it to a specific package.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Here I think the api should be simple enough so that multiple db packages can be used through package specific driver interfaces.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2010/11/note-on-api-design.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-644532294909583093</guid><pubDate>Tue, 16 Nov 2010 03:15:00 +0000</pubDate><atom:updated>2010-11-15T22:15:22.974-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cl-twitter</category><title>Extending the api</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;I compared &amp;nbsp;&lt;a href=&quot;http://dev.twitter.com/doc&quot;&gt;the current twitter api specification&lt;/a&gt; and cl-twitter&#39;s. Obviously things have changed a bit since cl-twitter was first conceived.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;In cl-twitter api calls are defined using a macro called &quot;define-command&quot;. For example, the following &amp;nbsp;specifies the public-timeline call:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;(define-command statuses/public-timeline (:get (:tweet))&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(twitter-app-uri &quot;statuses/public_timeline.json&quot;)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&quot;Returns 20 most recent statuses from non-protected users&quot;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;:trim_user &quot;When set to either true, t or 1, each tweet returned in a timeline will include a user object including only the status authors numerical ID. Omit this parameter to receive the complete user object.&quot;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;:include_entities &quot;When set to either true, t or 1, each tweet will include a node called entities. &quot;)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The :get keyword means that it&#39;s a get request. The (:tweet) specification defines the return type as a list of tweets. Tweets are a class defined in cl-twitter.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;I decided to keep naming conventions in the command definitions as close to the ones in &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://dev.twitter.com/doc&quot;&gt;the twitter api specification&lt;/a&gt;&amp;nbsp;as possible. That way it&#39;s easy to determine which ones have been defined and which ones haven&#39;t.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;As it stands now, the api commands defined by cl-twitter fall into three categories:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Fully functional where the return type is a well defined (list of) structure.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Functional, but where the return type is an association list.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Not implemented&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;An example of the first case are the time-line resources.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;An example of the second case are the users/suggestions. Currently cl-twitter doesn&#39;t have structure or class encapsulating a &#39;twitter suggestion&#39;. An other example are the saved searches resources or the geo resources. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Some calls fall into both classes, depending on whether you want to use the cursor facility. Cursors are currently not supported very well.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The third case covers the streamed tweets resources a.k.a. the streaming api&#39;s as well as the the three list&amp;nbsp;management resources.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;You can see a summary of the current capability&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;https://spreadsheets.google.com/ccc?key=0AvMxEpw5nMindFRrY0JfNDBCWWhvZ2xmUTNQVXY3ekE&amp;amp;hl=en&quot;&gt;here&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;. Out of the 96 calls, 53 are already fully functional, and 19 are functional, but have an association list as a return type. Once that&#39;s fixed, cl-twitter would cover 75 % of the twitter api.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2010/11/extending-api.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1622718411609139367.post-5190956468857009413</guid><pubDate>Sun, 14 Nov 2010 17:01:00 +0000</pubDate><atom:updated>2010-11-14T12:01:54.293-05:00</atom:updated><title>cl-twitter blog</title><description>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The purpose of this blog is to let you know what&#39;s going on with cl-twitter.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The original cl-twitter code can be found &lt;a href=&quot;http://common-lisp.net/project/cl-twitter/&quot;&gt;here&lt;/a&gt;, and can be installed using&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&quot;darcs get http://www.common-lisp.net/project/cl-twitter/darcs/cl-twitter&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Unfortunately, the code found at that location doesn&#39;t compile.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;In addition, twitter &lt;a href=&quot;http://www.webmonkey.com/2010/08/twitter-moves-to-oauth-the-oauthcalypse-is-nigh/&quot;&gt;discontinued&lt;/a&gt;&amp;nbsp;it&#39;s simple&amp;nbsp;authorization scheme. All applications are expected to follow &amp;nbsp;&lt;a href=&quot;http://apiwiki.twitter.com/w/page/22554643/Authentication&quot;&gt; twitter&#39;s oath protocol.  &lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;My goal is to fix the code where&amp;nbsp;necessary and extend it to cover the full &lt;a href=&quot;http://dev.twitter.com/doc&quot;&gt;twitter api&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</description><link>http://cl-twitter.blogspot.com/2010/11/cl-twitter-blog.html</link><author>noreply@blogger.com (mohegskunkworks)</author><thr:total>0</thr:total></item></channel></rss>