Installing SVN (Server & Client) on CentOS
August 27, 2010
The process is EXTREMELY simple. One line to install SVN, two to create the repository, and one to run the daemon:
yum install subversion.i386 mkdir /svn svnadmin create /svn/my-repo/ svnserve -d
Here’s what my results produced (The first line confirms I have subversion available in yum): [root@hosting ~]# yum list | grep ‘subversion’ subversion.i386 1.4.2-4.el5_3.1 base subversion-devel.i386 1.4.2-4.el5_3.1 base subversion-javahl.i386 1.4.2-4.el5_3.1 base subversion-perl.i386 1.4.2-4.el5_3.1 base subversion-ruby.i386 1.4.2-4.el5_3.1 base [root@hosting ~]# yum install subversion.i386 Loaded plugins: fastestmirror Determining fastest mirrors addons | 951 B 00:00 base | 2.1 kB 00:00 extras | 2.1 kB 00:00 updates | 1.9 kB 00:00 wiredtree | 951 B 00:00 Excluding Packages in global exclude list Finished Setting up Install Process Resolving Dependencies –> Running transaction check —> Package subversion.i386 0:1.4.2-4.el5_3.1 set to be updated –> Processing Dependency: perl(URI) >= 1.17 for package: subversion –> Processing Dependency: neon >= 0.25.5-6.el5 for package: subversion –> Processing Dependency: libneon.so.25 for package: subversion –> Processing Dependency: libapr-1.so.0 for package: subversion –> Processing Dependency: libaprutil-1.so.0 for package: subversion –> Running transaction check —> Package apr.i386 0:1.2.7-11.el5_3.1 set to be updated —> Package apr-util.i386 0:1.2.7-11.el5 set to be updated –> Processing Dependency: libpq.so.4 for package: apr-util —> Package neon.i386 0:0.25.5-10.el5_4.1 set to be updated —> Package wt-URI.noarch 0:1.35-1 set to be updated –> Processing Dependency: perl(Business::ISBN) for package: wt-URI –> Running transaction check —> Package postgresql-libs.i386 0:8.1.21-1.el5_5.1 set to be updated —> Package wt-Business-ISBN.noarch 0:2.00_01-1 set to be updated –> Processing Dependency: perl(Business::ISBN::Data) >= 1.09 for package: wt-Business-ISBN –> Running transaction check —> Package wt-Business-ISBN-Data.noarch 0:1.13-1 set to be updated –> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================ Package Arch Version Repository Size ============================================================================================================================================ Installing: subversion i386 1.4.2-4.el5_3.1 base 2.3 M Installing for dependencies: apr i386 1.2.7-11.el5_3.1 base 123 k apr-util i386 1.2.7-11.el5 base 80 k neon i386 0.25.5-10.el5_4.1 base 101 k postgresql-libs i386 8.1.21-1.el5_5.1 updates 196 k wt-Business-ISBN noarch 2.00_01-1 wiredtree 353 k wt-Business-ISBN-Data noarch 1.13-1 wiredtree 12 k wt-URI noarch 1.35-1 wiredtree 146 k Transaction Summary ============================================================================================================================================ Install 8 Package(s) Upgrade 0 Package(s) Total download size: 3.3 M Is this ok [y/N]: y Downloading Packages: (1/8): wt-Business-ISBN-Data-1.13-1.noarch.rpm | 12 kB 00:00 (2/8): apr-util-1.2.7-11.el5.i386.rpm | 80 kB 00:00 (3/8): neon-0.25.5-10.el5_4.1.i386.rpm | 101 kB 00:00 (4/8): apr-1.2.7-11.el5_3.1.i386.rpm | 123 kB 00:00 (5/8): wt-URI-1.35-1.noarch.rpm | 146 kB 00:00 (6/8): postgresql-libs-8.1.21-1.el5_5.1.i386.rpm | 196 kB 00:00 (7/8): wt-Business-ISBN-2.00_01-1.noarch.rpm | 353 kB 00:00 (8/8): subversion-1.4.2-4.el5_3.1.i386.rpm | 2.3 MB 00:00 ——————————————————————————————————————————————– Total 1.6 MB/s | 3.3 MB 00:02 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : apr 1/8 Installing : neon 2/8 Installing : postgresql-libs 3/8 Installing : wt-Business-ISBN-Data 4/8 Installing : apr-util 5/8 Installing : wt-URI 6/8 Installing : subversion 7/8 Installing : wt-Business-ISBN 8/8 Installed: subversion.i386 0:1.4.2-4.el5_3.1 Dependency Installed: apr.i386 0:1.2.7-11.el5_3.1 apr-util.i386 0:1.2.7-11.el5 neon.i386 0:0.25.5-10.el5_4.1 postgresql-libs.i386 0:8.1.21-1.el5_5.1 wt-Business-ISBN.noarch 0:2.00_01-1 wt-Business-ISBN-Data.noarch 0:1.13-1 wt-URI.noarch 0:1.35-1 Complete! [root@hosting ~]# mkdir /svn [root@hosting ~]# svnadmin create /svn/my-repo/ [root@hosting ~]# svnserve -d
The last thing to do is to configure the password if you want one.
vi /svn/my-repo/conf/svnserve.conf
vi /svn/my-repo/conf/passwd
The details of those two files are beyond the scope of this post. Besides I’m sure you’ll want to triple check, as every one else does, that the svn password file is in plain text. Yes, that’s correct. Plain text. That makes you think about all the svn repositories that you used secure passwords to access now doesn’t it?
Building Up Reporting Tools
August 9, 2010
While working with Lee Newton over at b5media I was able to watch him build up some server tools over time that were invaluable to diagnosing exactly what was going on on the server.
Now I find I need to make some of my own. Here’s how I am doing it.
For now I am going to concentrate on access logs.
Where these logs are varies server by server, but if you are running a standard cPanel setup, chances are you can find a directory named /usr/local/apache/domlogs with files in it named after your domain name. In this case I picked one of the sites I host: nakedpastor.com
So if I do a:
cd /usr/local/apache/domlogs
tail -10 nakedpastor.com
I will get the last 10 lines of the access log file
Here’s one example:
24.555.555.27 – - [09/Aug/2010:20:13:45 -0400] “GET /wp-content/uploads/2010/08/IMG_0001.jpg HTTP/1.1″ 304 – “http://www.nakedpastor.com/” “Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16″
Someone on an iPhone is looking at a picture on the site (which David would get more Google Juice from if he had named it better).
The trick is going to be to break down that line into important bits of information that will help me diagnose how my server is being used. For example, I might want to know if one IP address is flooding me. I might want to know if I am getting a HUGE number of requests for one particular file or if I am serving a large number of errors. If I ran this on a combined log file I, I would want to know if one domain was getting all of the traffic. Top referrers might be a fun thing to look at too. There are lots of little bits of info in there that could be helpful.
My tool chest includes:
tail – request a certain number of lines from the END of the file as shown above. During testing I will use -15 to get the last 15 lines but when I make this live, I’ll want to look at the last several thousand at least.
head – requests the number of lines at the top of a file. In this case it gives me the most pertinent results
sort – Will put the most important results at the top
cut – probably not helpful initially as the fields are not fixed width
awk – Used to parse the lines into chunks so I can see what is important. See also here
grep – Used to search for text
uniq – Used with -c uniq counts the number of occurrences of each variance
| – The piping symbol used to send the results of one command right into the next.
Let’s go after something simple first. The IP address. I want to take the last 100 lines of the error log, get the the ip address which will be the first word in the line, count how many times each ip address is used, sort it numerically by count and return the top 10. In bash, that is pronounced as:
tail -10000 /usr/local/apache/domlogs/nakedpastor.com | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -10
You can find examples of that line lots of places out there. In fact I copied and pasted that from another site. Their line used a “tail -n” instead of “head”, but it did the same thing You may want to note that you have to call sort before you call uniq in order for unique to work right..
For the rest of the examples I’m going to use the awk command to break down the line into separate fields separated by quotes or spaces. this line prints the number 7 because there are 7 fields separated by quotes:
tail -5 nakedpastor.com|awk -F ‘”‘ ‘{c=NF; print c}’
If I search for quotes and then search for space, I can get the result code
tail -15 nakedpastor.com|awk -F ‘”‘ ‘{print $3}’|awk ‘{print $1}’
Or the requested page:
tail -15 nakedpastor.com|awk -F ‘”‘ ‘{print $2}’|awk ‘{print $2}’
Or the referrer:
tail -15 nakedpastor.com|awk -F ‘”‘ ‘{print $4}’|awk ‘{print $1}’
Or the agent:
tail -15 nakedpastor.com|awk -F ‘”‘ ‘{print $6}’|awk ‘{print $1}’
So using these examples I can get the 20 most popular agent/OS combos:
tail -1000 /usr/local/apache/domlogs/nakedpastor.com | awk -F ‘”‘ ‘{print $6}’| sort | uniq -c | sort -nr | head -20
So, there you have some tools to use the next time you want to see what is going on on your server. Along with free -m and top you can get some neat info.
Just remember that you are getting snapshots. When I looked a little bit ago. Knowmore.com’s bot took up 1390 of the 10000 lines I was looking at. That’s over 10% of the traffic going to just that bot. HOWEVER if I looked at 5000 lines, they didn’t appear at all. Looking at 100000 lines they only appeared 1394 times. So, don’t just use one sample size. It can be misleading.
I will probably take these lines and combine them into some .bachrc functions along the line of what I’d discussed in my Three helpful additions to your .bashrc post.
Brain Storming on Blocking Bad-ads
September 6, 2009
I’m just jotting down some notes about using the Google Safe Browsing API to prevent a site from serving malicious/bad ads.
Problem Defined
- Ads are put on a site via javascript by calls as simple as “getad(‘adposition1’)”. JavaScript is executed via the client’s browser after the page is served.
- Those calls don’t touch any of our servers, they go from the client to the Google/Glam/Whatever Ad Server. So we don’t see the ads before they appear on the customer screens.
- The ads being served may be malicious
- Any ad that is served can link to a site that has been infected. We will want to block this.
- Any ad that is served can “take over” the page and redirect the page to a site that may or may not have malware. We want to block ALL take over attempts.
- There may be other types of ads that we wish to block. Potentially we might wish to block specific ads on specific sites (i.e. a sexual connotations in ads on pre-teen audience sites). This may be beyond the initial scope and/or incur unwanted execution expenses.
- Serving a malicious ad can get a site listed as “infected” even though your server has had nothing to do with ANY of the ad content.
Obstacles
- Any extra calls WILL slow the page load process.
- Each page load MUST call the ad serving script again
- If an ad can be identified as bad, some other type of content must be served in that position to ensure page integrity.
- The request for ad content HAS to come from the customer side because many ads are geo-specific and the customer’s IP determines what ad shows at what time.
- You don’t want to set up a system where the site itself can submit a site as “bad” as anyone could sniff that info and seed our black list with bad data.
- The results of the first getad() call could result in more javascript which must, in turn, be processed by the browser to produce the final ad. Potentially, several layers of JS could exist before the real ad is served. (e.g. 2 layers of indirection before ad: Google Ad Manager JS —serves—> Glam Ad embeded JS call —serves—> JS call to 3rd Party Ad Server —serves—> Ad). This pattern is real and happens often.
Possible solutions
- Status Quo: As problem sites are reported to us, determine which ad is bad, report it to the ad server & hope they fix it before google sees it and lists the site as a dangerous site in it’s tool bar and in chrome.
- Unless you are “lucky” you don’t get the badad.
- Once you get the badad, it is hard to determine the initial JS that caused the problem
- Embed everything JS with its own iframe
- Will block take overs
- May or may not prevent Google from listing the site, probably not.
- Will break ads that are contextual based
- Check the ad entirely on the client side via a black list: GSB API (http://code.google.com/apis/safebrowsing/) or PhishTank (http://data.phishtank.com/data/online-valid.xml)
- This Good/Bad check could be done with a single call with the API call
- Calls to external servers are dependent upon the health/bandwidth of that server
- This could also be done via downloading the black list and checking off of that: http://code.google.com/p/jgooglesafebrowsing/wiki/Quick_Start_Guide
- Blacklist downloading would cost time and would have to be updated periodically.
- Implement a hybrid solution where a call is done to our servers to see if the an ad is good or bad. (Server side base code: http://lampsecurity.org/php-google-safe-browsing-api )
- Ad call is processed in JS eval (Will have to be checked for nested JS calls)
- MD5 of ad is sent to the server. The results are Good/Bad/Unknown. (Pass the url?)
- If the result is Good, ad is served and process exits
- If the result is Bad, either go to step 1, or serve place holder/known good ad & exit.
- If the result is Unknown, send the JS to the server for verification. The server processes the code and returns a Good/Bad result.
- If the result is Good, ad is served and process exits
- If the result is Bad, either go to step 1, or serve place holder/known good ad & exit
- Other solutions?
Reading
- All your IFrames Point to us: http://googleonlinesecurity.blogspot.com/2008/02/all-your-iframe-are-point-to-us.html http://research.google.com/archive/provos-2008a.pdf
- The Ghost In The Browser http://www.provos.org/index.php?/archives/17-The-Ghost-In-The-Browser.html http://www.usenix.org/events/hotbots07/tech/full_papers/provos/provos.pdf
- Ask the Google Malware Team: http://moderator.appspot.com/#15/e=a77ea&t=a9521
- Cybercrime 2.0: When the Cloud Turns Dark http://queue.acm.org/detail.cfm?id=1517412
- Google Online security http://googleonlinesecurity.blogspot.com/
Anyway, I had this going through my head and wanted to get this all written out. So I can have a place to check back on this tomorrow…
How to batch resize images from the Linux CLI
August 18, 2009
You might find this little command useful, it allows you to create thumbnails for all the files in a particular directory:
find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80×60 "thumbs/{}" \;
This should work on any server with ImageMagick installed and in the path.
Enjoy!
WordPress/WordPress mu Merge Definitively Confirmed
June 4, 2009
There’s been rumor and confusion over the last week about whether WordPress and WordPress mu were merging as Matt seemed to imply at WordCamp SF. The announcement was so shocking that the true meaning was uncertain. For example, the avid WordPress evangelist Lorelle was left with the impression that WordPress.org would become a community site. Thankfully, Donncha, WordPress mu’s lead, gave the conclusive word on the subject this morning:
Basically, the thin layer of code that allows WordPress MU to host multiple WordPress blogs will be merged into WordPress. I expect the WordPress MU project itself will come to an end because it won’t be needed any more (which saddens me), but on the other hand many more people will be working on that very same MU code which means more features and more bugfixes and faster too.
Donncha, I would view this with the honor it does you. It is not much of a stretch to say that with your work on mu, you’ve made a lasting contribution to the shape of world and how people get information and will relate to each other over the upcoming years. More and more and more sites are run on mu, while the whole buddy press/bbpress/mu paradigm is taking off and will change the shape of the web. The adoption of the mu’s features into the WP core is a signal of what is to come and it will be an exciting ride!
Congrats guy!
SxSW Wow!!!
March 2, 2009
A New Look
You may notice that there are a few things different around here! I am approaching the three year anniversary of The Code Cave and have decided to spice things up a bit. The site is now sporting a new theme on a new web host, its own VSP. And I’ve got a number of posts lined up to be published. The first of which is this one. My entry into the Blog World and New Media Expo Free Ticket to South By South West Interactive contest.
Sham WOW!
Now, I have to admit I was inspired by an infomercial that you simply can’t get around seeing these days. It’s Vince Offer‘s Sham Wow product:
Now if you haven’t seen that, surely you’ve seen the “Slappin your troubles away” Slap Chop. The excitment Vince shows for his favorite past time, of selling products everyone could use, is infectious.
I’m not the first to be inspired by his exuberance. Rhett and Link have given the commercial their full treatment and created this video:
And now… SxSW WOW!
My reaction ( major hat tip to http://twitter.com/markjaquith ) to Blog World and New Media Expo giving away a free ticket to SxSWi was simply WOW! and stare at the screen for screen for a while waiting for my brain to turn back on and finish processing every thing it had been ignoring from my eyes for the last 5 minutes. SxSW wow! And that was it! the vision was born within minutes of reading the article.
I shot some even fancier footage from my motorcycle showing the excitement of the 20 hour drive down to Texas, if that’s how I went (And yes, I would live stream the whole way). And had some other ideas to include, but the priorities fell to 1. Get the site transferred to the new host. 2. Make the site pretty enough to host the video 3. Get the blasted thing DONE!
So without any more ado, whatever that is, I present you with “SxSW WOW!” (uploaded at March 01, 2009, 10:43 PM PST):
I do need to thank my loving wife Denise Layman (aka Sorka) of knitting fame at KnitChat.com for all of her help filming with MS Movie Maker tips as I’d never used it before. Thanks Love!
Download hi res 600mb
Mentioned in the Video
Tim Bourquin founder of New Media Expo – who seems like a really nice guy And as far as I know he’s never consumed 20 times his weight in ANY type of liquid
Rick Calvert – Co-Founder of Blog World Expo who I know is a really nice guy
Jim Turner – aka Genuine, who is an excellent write of no little fame. I noticed that he happened to be the author of the contest post! And as far as twitter is concerned, yes, I’m pretty sure he is following me!
Sham WOW! Script
Since I had this file on my desktop I figured I’d share my script with you. Here are the original and new lines I used from the commercial:
O: Hi It’s vince with Sham Wow!
N: Hi it’s Brian and I’ve got a SxSW Wow! from Blog World Expo!
O: I’ll be saying wow, everytime I use this ticket.
N: You’ll be saying wow, every time you use this towel.
O: It’s like a shammy it’s like a towel it’s like a sponge.
N: It’s like a party, It’s like a confererence, I’ll be like a sponge, YAY ME!
O: Sham wow holds 20 times its weight in liquid.
N: SxSW attendees absorb 20 times their weight in liquid! Just ask Tim Bourquin
O: Look at this it just does the work
Why do you want to work twice as hard
N: Look at this, I’m doing work!
Why would I want to be working at home?
O: Made in germany. You know the germans always make good stuff
NOT USED: This is a gift from blog world expo, you know Calvert always makes good stuff…
REPLACED: Every SxSW Wow! comes pre-Rick rolled by (Rick) Calvert himselfs
O: Here’s some cola, wine coffee cola pet stains
Not only is your damage on top but
There’s your mildew. that is gonna smell you see that?
N: Here… here is my anxiety of how to get to SxSW. My sweat, my tears, my embarrassing stains,
Not only is it on top
But it’s down deep man
O: Were gonna do this in real time
Put it on the spill, turn it over
without even putting any pressure 50% of the cola right here. Following me camera guy
The other 50% the color starts ta come up.
N: I’m gonna stream this live
I put my SxSW Wow! on top and roll it
No Pressure man, No pressure and suddenly 50% of my worries are gone!
All that remains is the fun of getting there. You followin me (Jim) Turner, you followin me?
O: No other towel is gonna do that
It works like a vacuum.
N: And look at that
It works like a Valium.
No other ticket is gonna do that!
SxSW Wow!
O: See what I’m telling you.
Sham wow – you’ll be saying wow every time
N: See what I’m telling you.
SxSW Wow! – I’ll be saying Wow! all the time!
THANKS BLOG WORLD EXPO!
Neither a borrower nor a lender of bandwidth be
January 5, 2009
“Neither a borrower nor a lender of bandwidth be; And this above all, to thine own site be true…”
William Shakespeertopeer – The Renaissance Man’s Guide to the Internet. – Chapter 1 verse 12
Yet here, readers! aboard, aboard, for shame!
Google sits in the shoulder of your site, And you are stay’d for.
There; my blessing with thee! And these few precepts in thy memory
See thou character set. Give thy tongue a name,
and no unproportioned content to his act.
For search engines shall look for UTF-8 and EN or DE
And provide translations thereof.
Be thou familiar, but by no means vulgar.
For so shalt search engines stop, after discovering
Repetition of the evil seven.
Those friends thou hast, and their adoption tried,
Grapple them to thy site with links, trackbacks and pings;
For it is by the number of links to your site, that you are judged.
And it is through external links that you will grow.
But do not dull thy blog with trolls and spammers
Of each new-commenter, unfledged comrade. Beware
Links to their sites, are being in their name,
Bear them to Akismet that others may not burden thee.
Give every man thy ear, and seek their voice;
Take each man’s censure, by reserving your words.
Make thy habit to leave ideas for the voice of readers,
For participation, will buy their loyalty;
Choose a theme optimized for SEO as well as appearance,
For the apparel of a site oft proclaims the man,
And they in Google, of the best rank and station,
Are of a most select and generous chief in that.
Neither a borrower nor a lender of bandwidth be;
For loan of text oft weakens site rank,
And borrowed images dull load time,
Cease and desist will be their cry,
And DMCAs will be sent to thee.
This above all: to thine own site be true,
And it must follow, as the night the day,
Thou canst not then be false to any man.
Farewell: my blessing season this in thee!
—————————
Adhering to the GPL, here, you find the original:
LORD POLONIUS Yet here, Laertes! aboard, aboard, for shame!
The wind sits in the shoulder of your sail,
And you are stay’d for. There; my blessing with thee!
And these few precepts in thy memory
See thou character. Give thy thoughts no tongue,
Nor any unproportioned thought his act.
Be thou familiar, but by no means vulgar.
Those friends thou hast, and their adoption tried,
Grapple them to thy soul with hoops of steel;
But do not dull thy palm with entertainment
Of each new-hatch’d, unfledged comrade. Beware
Of entrance to a quarrel, but being in,
Bear’t that the opposed may beware of thee.
Give every man thy ear, but few thy voice;
Take each man’s censure, but reserve thy judgment.
Costly thy habit as thy purse can buy,
But not express’d in fancy; rich, not gaudy;
For the apparel oft proclaims the man,
And they in France of the best rank and station
Are of a most select and generous chief in that.
Neither a borrower nor a lender be;
For loan oft loses both itself and friend,
And borrowing dulls the edge of husbandry.
This above all: to thine ownself be true,
And it must follow, as the night the day,
Thou canst not then be false to any man.
Farewell: my blessing season this in thee!
A winter walk…
January 4, 2009
I thought I would share some pics from 3 hour hike the other day. I hope you enjoy
I’ll post some videos tomorrow when I return to civilization and have the bandwidth to upload them…
Simple web rules beginners & pros all break- Rule #1
January 3, 2009
Yes, this applies to you. I’ve even changed the title of this series because if I named it “7 simple HTML rules beginners & pros all break” some readers would say “HTML” that’s coding stuff. That doesn’t apply to me. But almost everybody who surfs the web writes HTML. They may not know it, but they do. If you have a blog, I can almost guarantee you written HTML AND you’ve broken one or more of these rules. If you are a professional blogger or coder, I’d wager that you still break one or more of these rules on a regular basis. So… enough build up…
Here we go:
Rule 1: Everything has a beginning and an ending
So, if you want to add a blank line to a post or comment, the code is pretty simple right? You add <BR> and you have a new line. Right? WRONG! You’ve just broken rule number one. ALL HTML TAGS MUST HAVE AN OPEN AND CLOSE. So to write this correctly you would say either <BR></BR> or use the short cut <BR />. That shortcut with a trailing / is the correctest way to add a break. It opens and closes the tag within itself. Another example of a common place this rule is broken is within the IMG tag. You will often see code like
<IMG SRC=”me.bmp” alt=”A picture of me”>
when it is more properly written as:
<IMG SRC=”me.bmp” alt=”A picture of me”/>
Why does this rule matter?
Perhaps the most visible side effect of this is seen on blogs that don’t have a sidebar or have all the text after a certain point bolded or centered. This is most frequently caused by an unclosed <DIV> tag. Each <DIV> is a division or an invisible box that is in a specific area of a web page. The center column of a website is a common example of a <DIV>. If you don’t have the write number of <DIV> and </DIV> your web page will tell the browser, “The center column starts here” and it is never told “Now it has ended”. So your sidebar can become part of your center column. The most common cause of this is copying and pasting text from another website into your post. You will catch all of the open <DIV>with your copy but often miss a close div or two and that confuses the heck out of the browser. This happens so often that I’ve made a short video about how to manage these things for the bloggers on the b5media network.
The other reason this matters is that most browsers have a “Site didn’t follow the rules” or “Compatiblity” mode which is turned on when there are errors on the page. When this mode is activated, the browser starts loading the page in the simplest way it can in order to guess at what you really meant. I’ve over simplified this and you can find out more by searching “Web Standards” in Google. Put briefly, if you want your page to appear as you intended, close all your tags.
Or Everthing that begins must eventually come to an
Not Quite 52 books in 52 weeks..
January 2, 2009
I still think I may have met the challenge…
But I can’t prove it yet.
I’ve collected 36 of the books I read in the last year, but I am drawing a blank on there rest… I THINK I’ve read more than this this year and I probably met the goal but I am sure drawing a blank on them. Part of the problem is that reading The Song of Ice and Fire took a loooong time. They are good books but DANG the are complex. I’ve never read any other books that did so many point of views for so many different characters. But they were enjoyable. Also I tried to read a non-fiction history of the ivory coast twice, but I never made it through to the very end of that one.
Anyway… here’s the first 36. When I get access to my desktop computer again (I’m travelling atm), I will see if I can find more to ad to my list when I get back home.
Have YOU read any of these:
Armageddon’s children
Artemis Fowl (novel) (2001) Eoin Colfer
Artemis Fowl: The Arctic Incident (2002) Eoin Colfer
Artemis Fowl: The Eternity Code (2003) Eoin Colfer
Artemis Fowl: The Lost Colony (2006) Eoin Colfer
Artemis Fowl: The Opal Deception (2005) Eoin Colfer
Artemis Fowl: The Time Paradox (2008) Eoin Colfer
Dragon Harper Todd McCaffrey
Dragons of the Highlord Skies Margaret Weis
Ender in Exile Orson Scott Card
How to eat fried worms
I robot
Linkspell Cornelia Funke
Island of the Blue Dolphin
Magic Street Orson Scott Card
Mars Ben Bova
Metal Swarm
Phantom Terry Goodkind
S is for Silence Sue Grafton
Shadow of the Giant Orson Scott Card
Starwars Revenge of the Sith Stover, Matthew
The Elves of Cintra
The Friday night Knitting – Jacobs, Kate
The Gypsy Morph
A Game of Thrones (1996)
A Clash of Kings (1998)
A Storm of Swords (2000)
A Feast for Crows (2005)
I Am Legend and Other Stories
Dune Frank Herbert
Foundation Isaac Asimov
Second Foundation Isaac Asimov
Foundation and Empire Isaac Asimov
Foundation and Earth Isaac Asimov
Foundation’s Edge Isaac Asimov
The Light of Other Days Arthur C. Clarke