Ron Toland
About Canada Writing Updates Recently Read Photos Also on Micro.blog
  • How To: Run Clojure with Clojure-Contrib Library

    I recently picked up Programming Clojure and started working through it, trying to wrap my head around this new variant of Lisp.

    Installing clojure itself was pretty simple (sudo apt-get install clojure, since I’m using Ubuntu), but I had a hard time figuring out how to make the clojure contrib libraries available from the clojure REPL (I kept getting errors about the clojure-contrib classes not being on the classpath).

    Here’s how you do it: start the clojure REPL with an extra argument pointing to where you’ve installed the source files for clojure-contrib. For example:

    clojure -cp /home/rontoland/Code/clojure-contrib-1.1.0/src

    Since the clojure-contrib libraries are used throughout the book, I put the above code in a small script and saved it in my /usr/local/bin folder as clojure-repl, so I don’t have to remember the longer command.

    → 4:57 PM, Aug 22
  • Apple Kills Lala.com

    A few months ago, when Apple bought Lala.com, I didn’t panic. I thought Apple’d integrate Lala.com’s store into iTunes, rebrand the site, and keep things rolling.

    I was wrong:

    Dear Ron T.,

    The Lala service will be shut down on May 31st.

    In appreciation of your support over the last five years, you will receive a credit in the amount of your Lala web song purchases for use on Apple’s iTunes Store. If you purchased and downloaded mp3 songs from Lala, those songs will continue to play as part of your local music library.

    That’s part of the message I got in my inbox this morning. Apple’s shutting Lala.com down, and offering me “credit” in the iTunes store as compensation.

    Fuck you, Apple. I bought music from Lala.com because I didn’t want to buy it from your store. I had a choice, and I exercised it. But you just can’t understand that, can you?

    I will never buy anything from the iTunes store. I will never throw my money away on songs in your proprietary format.

    Lala.com’s ease of use, free access to every song in the catalog, cheap prices and web-based portability were far superior to the iTunes store. You couldn’t compete with that, could you, Apple? So you bought it and killed it.

    Fuck you.

    → 3:02 PM, Apr 30
  • The Choices I've Made

    Finished reading Just a Geek. Surprisingly, my experiences and feelings toward NASA parallel Wheaton’s feelings toward Star Trek in many ways: the feeling that I need to prove leaving was the right decision, the odd mix of guilt, excitement and nostalgia I feel whenever I see someone I used to work with, the worry that something went horribly wrong with my life and I’ll never get it back on track.

    It’s good, then, to see that Wil has grown into an acceptance of his past and his decision. I feel like I’m still somewhere in the middle of the story, with a sense that I can and should let go of both the image of myself that working at NASA gave to me, and the dreams I originally left NASA for. But I can’t bring myself to drop them, yet.

    That’s not to say I can’t dream new dreams. I know I should, and I’m trying hard to, but I’ll be damned if both dreams–NASA Engineer and Novel Writer–aren’t hard to wake up from.

    → 3:03 PM, Apr 15
  • What Have You Done For Me Lately?

    This weekend, a friend of my wife’s was gushing about how her church had just started a program to help the poor in Uganda: they take unwanted clothes from Ugandans, ship them over to the US so her church-members can sew them back together using Christian-themed patches, sell the clothes to people in the US, and then send most of the proceeds back to poor Ugandans.

    “Why not help the Ugandans setup a factory to do the clothes repair in Uganda, so they can sell the clothes to other Ugandans (or ship them themselves) for a profit?” I asked.

    She looked at me like such a thought had never entered her mind. Why wasn’t I proud that her church was helping the poor, helpless Ugandans?

    Because they’re not helpless. Because teaching someone to fish is always superior to giving them a fish. Because what her church is doing is not helping anything other than their own sense of self-righteousness.

    Christians in the 19th century were a progressive force: they pushed for the abolition of slavery, they setup workshops for the poor, they endowed schools and universities teaching up-to-date science and technology.

    The current crop of Christian evangelicals could not be more different from those charitable pioneers: they want to take rights away from homosexual couples, cheer when Muslims are discriminated against, and want science muzzled.

    So here’s my challenge to any evangelical, fundamentalist Christian: What are you doing to make the world more free, to add to the body of human knowledge, to increase the prosperity of your fellow man?

    → 3:05 PM, Apr 14
  • 3 Careers

    I was going to write up a list of the differences between my three careers (optical engineering, writing, and programming) and post them here, but then I realized what all my differences had in common: they were changes in the way people thought of me.

    As a NASA employee I was awe-inspiring, as a writer people envied me, and as a programmer I’m mundane but very very useful.

    Is that all a career is to me? A set of other people’s opinions?

    What I should talk about is what each career taught me.

    How NASA showed me how much human engineering can accomplish, while humbling me by forcing me to realize that decades-long projects are too long for me.

    Writing made me appreciate how hard it is to tell a good story, because my own efforts were far short of what I needed to keep steady writing work.

    And programming took me back to my days learning BASIC on a Commodore-128, while schooling me in how hard it is to run a company, to compete with other businesses and succeed.

    But I keep thinking that’s using the present to justify the past. What I’d like to know is: was I right to leave NASA, at the time I left it?

    → 2:33 PM, Apr 9
  • Facing the Past

    I’m reading Wil Wheaton’s Just a Geek, for two reasons: because I’ve enjoyed his blog, and wanted to check out more of his writing. And because I’m hoping he can help.

    If you don’t already know, Just a Geek is Wil’s book about his shift from being “That Guy Who Used to be on Star Trek” to the writer, blogger, and all-around geek Wil Wheaton.

    Here’s a guy who went from working on a show with millions of adoring fans, to being an out-of-work actor struggling with his bills, to a popular writer who’s given keynotes at PAX and has done hilarious cameos on The Guild and Big Bang Theory.

    And here’s the thing: he quit Star Trek. He wasn’t fired, they didn’t replace him with someone else, he walked away. Walked away from certain success to an uncertain future. He writes about how that decision haunted him, like my decision’s been haunting me.

    You see, I used to work at NASA. And not as a janitor or maintenance guy. I was an optical engineer, responsible for putting together instruments for the likes of the Hubble Space Telescope and the James Webb Space Telescope. I was paid really well to do really challenging work with brilliant people.

    But I quit. Five years after I started working as a wide-eyed college kid, my wife and I picked up and moved to Arkansas, leaving all that behind.

    And I’ve been wondering if I made the right decision ever since.

    So I’m reading Just a Geek, hoping Wil’s story will help me feel better about my own past, that learning how he grew beyond working on and then leaving Star Trek will help me put my own demons to rest.

    ‘Cause some nights I still dream that I’m back there at the Goddard Space Flight Center, working to expand our knowledge of the universe.

    → 3:08 PM, Apr 8
  • The iPad Experience: Best Buy Edition

    Me: Hey, iPad! Mind if I install this cool KoboBooks app I’ve heard so much about?

    iPad: Sure thing! Just gimme your iTunes password.

    Me: I don’t have an iTunes account.

    iPad: No account, no software.

    Me: Ok…Let’s just fire up mail.google.com, so I can check my email.

    iPad: Nope.

    Me: No?! I can’t check my email?

    iPad: Sure thing! Just enter your .Mac password…

    Me: Screw this. I’m buying a netbook.

    → 9:47 PM, Apr 6
  • Apple's Garden is Walled, with Locked Gates

    I’ve just been reminded why I left Mac for Linux.

    Me (to store rep): “Can I install and play with some apps on this demo iPad so I can decide if I want to buy one?”

    Rep: “Nope. Use just what’s installed.”

    …and that’s when I left. If I can’t be allowed into the Walled Garden of Apple long enough to decide if I want to spend some money there, I’ll stick with my open-source.

    I’m off to Best Buy to look at a Linux-compatible netbook.

    → 8:20 PM, Apr 6
  • How To: Change Imagefield Thumbnail Size in Drupal

    In Drupal, the Imagefield fieldtype comes with a built-in thumbnail generator. If you'd like to control the size of the thumbnail, just set the value of the imagefield_thumb_size variable, like so:

    variable_set('imagefield_thumb_size', '200x200');

    That'll set the imagefield thumbnail size to 200 x 200 pixels.

    → 9:09 AM, Feb 9
  • Predictions for 2010

    Everybody’s got ‘em. Here’s mine:

    What Will Change Radically:

    1. Ebooks. In 2009 they really started taking off. With the release of Apple's Tablet, the Nook finally appearing in stores, and Borders launching their own reader/ebook service, the world of publishing will finally start lurching into the 21st century.
    2. The OS Wars. With the release of Google's Chrome OS netbooks, coupled with the increasing market share of Android on smartphones, the internet revolution will be complete. Mac vs Windows won't matter as much to users anymore, since everything important (email, documents, reading) will either work on their phone or in their browser. Only coders and gamers will care about platforms as such anymore, since you'll still need a full-featured OS to develop or play on.
    3. Online Publishing. The Nook and the Kindle are already experimenting with subscription-based magazine and newspaper content. This market will grow to replace the paper-based income streams for most newspapers and magazines. Some customers will still want their ad-based online content, and some will still want a physical copy, but most will switch over to the convenience of electronic versions. Publishers will also move in this space when they see it's a way to replicate their old revenue streams in the new electronic age.
    What Will Stay The Same:
    1. Sci-fi/Fantasy Publishing. While everyone else starts to pile on the ebook wagon, genre presses (especially the small ones, that could benefit the most from electronic distribution) will continue to take timid steps in the direction of electronic publishing, but refuse to embrace it.
    2. M$ dominance. Even though Google is pulling the rug out from under Windows, sheer inertia will keep them moving forward in the marketplace for the next year or two. That, and the videogame industry.
    3. Books. They won't go anywhere. They'll just finally be seen for what they are: 500-year-old relics that have a lot of nostalgic value, but don't meet the needs of most people anymore.
    What do you think? How far off am I?
    → 4:39 AM, Jan 1
  • UNR on HP Mini 110

    I’ve been thinking about trying out Ubuntu Netbook Remix, the version of Ubuntu Linux made especially for netbooks like my HP MIni 110, for a while now. I was attracted to the idea of being able to run a real Linux distro on the netbook, as opposed to the tightly-controlled version that came on the Mini. HP’s version of Ubuntu–Mie–isn’t bad, so much as completely un-customizable: you can’t remove the screen-hogging front panels from the desktop, for instance, which left me staring a large blank space where Email was supposed to appear (I used Gmail, so a desktop-bound email program is useless to me).

    So this week I finally bit the bullet, wiped the harddrive, and installed the latest version of UNR.

    Thus far, things have gone well. I had some problems with wifi at first, but running the software updater and rebooting fixed that problem. I’ve been able to download and install Wine, which lets me use the Windows version of eReader for reading my ebooks. I’ve re-arranged the icons in the menus, ripped out some software I didn’t need, and in general had a good time customizing the hell out of the OS.

    I feel like I’ve been given a new computer, one that’s more fun to use and easier to bend to my will. In the end, that’s always been the appeal of Linux to me: it puts power back in the hands of users, where it belongs.

    → 8:34 PM, Dec 31
  • eReader for Android!

    They just released a version of the eReader software (formerly Palm eReader, then just eReader, now the Barnes and Noble eReader) for the Android platform.

    It’s a little bit buggy: you need to wait for an entire book’s table of contents to load before reading/scrolling, else the book will get stuck partway through. Other than that, it works great on my G1. Nice to see a commercial ereader on a Linux platform. (Yes, the books still have DRM, but the format’s got some longevity behind it, and is supported on enough devices that I’m not worried about getting locked into one platform).

    → 3:39 AM, Nov 30
  • Guilty as Charged

    Ripped from Code Complete:

    People who preach software design as a disciplined activity spend considerable energy making us all feel guilty. We can never be structured enough or object-oriented enough to achieve nirvana in this lifetime. We all truck around a kind of original sin from having learned Basic at an impressionable age. But my bet is that most of us are better designers than the purists will ever acknowledge.

    —P. J. Plauger

    → 5:45 PM, Aug 19
  • Sorting Algorithms, Part Two

    The second sorting algorithm I decided to learn was the QuickSort. It’s a little more complicated than the StraightSort, but generally faster for larger numbers of integers.

    The idea is to look at the first number of a list, call it the firstElement. You scan up the list looking for a number greater than the firstElement. Once you’ve found one, you scan down from the end of the list looking for a number less than the firstElement. When you’ve found both, swap them. Repeat this process till all the numbers greater than the firstElement are further down the list than all the numbers lower than the firstElement.

    Congratulations, you’ve sorted the list with respect to the firstElement! Now, snip the firstElement off the front of the list, and slip it back into the list at the point where your probe scanning down the list first passed your probe scanning up the list. You’ve got the firstElement placed correctly in the list.

    Now, break your list into two parts: one part extends from the beginning of the list up to the newly-placed firstElement, and the second part extends from just past the firstElement to the end of the list. Do the same “take the first Element and scan up from the list…” work you did before on the whole list, but this time do it to each part separately.

    When the partial lists get down to around 7 elements or less, go ahead and do a StraightSort on them instead of the swap-and-scan sorting. When you’ve got the parts sorted, put them back together, and you’ve got a fully sorted list!

    This one took me a while to wrap my head around, so don’t be intimidated if it doesn’t make sense at first. Have a look at the code below, and remember that you’re doing a sort on the whole list, then breaking it down and doing the same kind of sort on parts of the list, and so on down the line.

    Here’s the code:

    def quickSort(data): “““Takes a list of integers and returns a sorted list. Based on QuickSort method Note: will not sort non-unique items!””” insertedElement = data[0] swappedData = swapSort(data) insertedIndex = swappedData.index(insertedElement) firstHalf = swappedData[:insertedIndex + 1] if (insertedIndex != (len(swappedData) - 1)): secondHalf = swappedData[insertedIndex + 1:] else: secondHalf = swappedData[insertedIndex:] if len(firstHalf) > 7: firstHalf = quickSort(firstHalf) else: firstHalf = straightSort(firstHalf) if len(secondHalf) > 7: secondHalf = quickSort(secondHalf) else: secondHalf = straightSort(secondHalf) sortedData = firstHalf sortedData.extend(secondHalf) return sortedData

    def swapSort(data): “““This is the first half of the QuickSort algorithm. Implemented here to prevent recursion errors””” firstElement = data[0] greaterIndex = 1 lesserIndex = len(data) - 1 while (lesserIndex >= greaterIndex): if (data[greaterIndex] > firstElement) & (data[lesserIndex] < firstElement): greater = data[greaterIndex] data[greaterIndex] = data[lesserIndex] data[lesserIndex] = greater greaterIndex += 1 lesserIndex -= 1 else: if data[greaterIndex] firstElement: lesserIndex -= 1 data.insert(greaterIndex, firstElement) data = data[1:] return data

    Notice how I’ve broken up the algorithm into two functions: one that does the swap-and-scan, the other that breaks the list up and decides whether or not to run a StraightSort on the pieces. Again, I’m not sure I’ve fully Pythonized this code; any suggestions?

    → 1:28 AM, Apr 25
  • Sorting Algorithms, Part One

    Inspired by a question from a programming interview, I’ve taken it upon myself to learn how to implement different sorting algorithms in Python. My goal is to:

    1. Learn a bit more about programming algorithms, and
    2. Get back into Python-coding shape.

    The first algorithm I’ve coded up is a simple Straight Sort. It sorts a series of numbers like you’d sort a hand of cards: it picks the second number and sorts it with respect to the first, then picks the third number and places it where it should be with respect to the first two, and so on. It’s pretty fast for low numbers of integers, but slows down exponentially as the number of integers grows.

    Here’s the actual code:

    def straightSort(data): “““Takes a list of integers and returns a sorted list. Based on Straight Insertion method. Note: will not sort non-unique items!””” for item in data: currentIndex = data.index(item) for i in data[:currentIndex]: if data[currentIndex - 1] > item and currentIndex > 0: data[currentIndex] = data[currentIndex - 1] data[currentIndex - 1] = item currentIndex -= 1 return data

    It’s pretty simple, but I feel I may have been writing C++ style code in Python, instead of writing Python-style code. Any suggestions?

    → 1:32 AM, Apr 24
  • HowTo: Get Filezilla working after FTP connection drop

    If you’re using Filezilla to connect to a shared hosting account that uses cPanel, and your internet connection gets dropped during a transfer, you’re going to get an error from Filezilla when you try to reconnect after getting your internet up again.

    Here’s how to clear that error:

    1. Login to your shared hosting account.

    2. In cPanel, go to “FTP Session Manager”

    3. You should see a long list of “IDLE” connections. Delete each of them, one by one, using the “X” button beside each entry.

    4. Logout of cPanel when all the ftp sessions have been deleted.

    …and that’s it! You should be able to connect normally to your account through ftp again.

    → 7:28 PM, Apr 13
  • How To: Install Sun Java in Ubuntu from Command-Line

    Had to do a fresh install of Sun's Java on a remote Ubuntu machine this weekend. It's pretty easy to do in a graphical environment, but I only had ssh access. Since I couldn't find a set of instructions on how to install Sun's Java from the command line, I thought I'd put together my own how-to.

    You'll use the apt-get command to grab the Sun java .deb files and install them. It works just like a command-line version of the Synaptic Package Manager you probably used to install software from the graphical environment.

    But apt-get doesn't know how to find the Sun Java files unless you add some sources to its repositories: a list of all the places apt-get looks for software.

    Once you've added the repositories to the source list for apt-get, one command will install everything for you. Here's a step-by-step way to do it:

    1. Type "nano /etc/apt/sources.list" to open a command-line text editor to edit the list of repositories apt-get will look through.
    2. You'll see some lines, starting with "deb" or "deb-src" already in the file. Add the following lines to the file:

      deb http://us.archive.ubuntu.com/ubuntu/ hardy universe deb-src http://us.archive.ubuntu.com/ubuntu/ hardy universe deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates universe deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-updates universe deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse deb-src http://us.archive.ubuntu.com/ubuntu/ hardy multiverse deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates multiverse deb-src http://us.archive.ubuntu.com/ubuntu/ hardy-updates multiverse

    3. Press Ctrl-O to save the file. Press Return to agree to name the file sources.list, then press Ctrl-X to leave the editor.
    4. Type: "apt-get update"
    5. Type: "apt-get install sun-java6-jdk"

    That should do it!

    → 2:24 AM, Nov 15
  • Hope Mingled with Despair

    So, Obama won the Presidential race, making me proud to be a citizen of the USA and hopeful that we can turn things around here.

    But Proposition 8, the hateful law banning gay marriage and writing bigotry into the California state constitution, looks like it will pass.

    Thousands of perfectly legal marriages between same-sex couples will be in legal limbo, not officially dissolved but suddenly not recognized, either. The thought that such an evil law could pass in what is supposed to be the most progressive state in the Union makes me fear for the ability of the U.S. to grow up into a modern nation.

    For those of you who voted for Proposition 8, I hope you live long enough to see your vote as shameful, just as voting for a law banning interracial marriage is shameful today.

    → 12:08 AM, Nov 6
  • Go Vote!

    Just got back from the voting booth. It's my first time to vote since the dark days of '02, and my first time to vote in California. And yes, it felt good. :)

    If you haven't already, head down to your local polling place and vote! Even if you're not registered, get yourself put on a provisional ballot. Who knows, your vote could decide a close election.

    → 7:10 PM, Nov 4
  • Fix for Mac OS 10.5.5 Slow Internet Problem

    After installing the 10.5.5 update for my Macbook, I noticed both wireless and wired internet access seemed slower. My wife's Macbook, running 10.4, didn't have the same problems.

    I did some poking around the internet, tried scanning for a potential Trojan horse (none found), and finally decided to try turning off IPv6 for my ethernet connection (Go to System Preferences -> Network -> Advanced options (on the ethernet options screen) -> Configure IPv6 -> Off). When I rebooted, the problem was gone.

    Has anyone else had the same problem? What was your solution?

    → 5:53 PM, Oct 16
  • Austin GDC Notes: Day One

    Here's my notes from the first day of the Austin Game Developers' Conference:

    chris crawford on paradigm shifts

    1. proper study of man is man
    2. interactivity is most important part of software
    3. graphics exist only to support interactivity
    4. no plots; storytelling is process, not plot
    5. focus on what the user does
    6. worry about the verbs of the story
    7. need a linguistic user interface (language) to get large number of verbs
    8. but, probably can't get natural language on a computer
    9. chris recommends using Deikto to build toy reality-stories
    10. use swat to create social-focused games; storytron.com

    living with a legacy: lessons from everquest (sony's everquest team)

    • pitfalls in mmo systems design
      • correcting poor documentation (now wiki-based): made custom data search tools, run checks for new-found bug combos
      • non-scaling design: capped % modifiers, capped melee attack speed and other stackable modifiers
      • complicated systems: legacy systems accrue cruft over time
    • problem resolutions
      • reworked obsolete systems: again, systems that worked early on, but failed over the length of the game; had to redesign to scale indefinitely
      • adapted problem systems: dealt with system interactions that were only revealed to be problematic after release
      • removed some problems entirely: e.g. beam-kiting, combining item and power boost for item
    • designing scalable systems
      • use visible game systems to give feedback to players
      • use game system models/mockups to test new systems before implementing them
      • avoid complicating systems through stacking or using non-formula-based calculations
      • always design systems with opposing systems to make sure new systems/items scale over time
      • design a backup plan for each system in case new systems don't go over well
      • be conservative when tuning new systems, it's better to improve a bad system than nerf an overpowered one

    writing for cinematic design (bioware)

    • now have dedicated cinematic designers (crafting interactive narrative content with cinematic presentation)
    • feel cinematic design the best way to deliver story to the player
    • building blocks: writing, audio, settings, camera, digital actors, player choice
    • in the future: need to find the right balance between audience-led agency and designer-led emotion
    • have to watch what audience expects: their expectations constantly change with the medium and we have to change our approach to match
    • lately, have moved from writing in novel-style to writing in more film-script format
    • involve player in the narrative as much as possible

    easy is f**king hard (eric zimmerman with gamelab)

    • game design is a design discipline, designers make the rules
    • hardcore vs casual: complexity of interaction, time investment required, gamer content
    • game design means thinking of games as systems
    • as systems, games will have emergent behavior, often social behavior
    • via the game, we explore the system as a form of play
    • designers describe the system through rules
    • need to ensure players have meaningful actions to take during play
    • to have a choice, player needs to be able to see the state of the game system and the available choices (but not necessarily the possible consequences of those choices); to evaluate choice and learn, consequences of choice (once made) need to be obvious to the player
    • current choices should be integrated into later choices
    • slow but powerful advancement keeps players hooked, especially if player can see future rewards (turn them into play goals)
    • remember, games take place in a social context; you're really designing a social activity
    → 11:06 PM, Sep 21
  • Back from Austin

    Got back last night from the Austin Game Developers' Conference. The AGDC this year was amazing; every talk was either full of useful information, entertaining, or both.

    I also finally got to meet a lot of the IGDA Writers' SIG folks I’ve been talking to over email. Many business cards and writing tips were passed around over pints of excellent beer.

    I'll be posting my notes from the conference over the next few days in between prepping for the move to San Diego.

    → 12:15 AM, Sep 20
  • Wishes

    I wish celebrities over 40 were allowed to grow old gracefully, instead of being pressured to starve themselves and inject toxins into their skin to try to look 25.

    I wish children were encouraged to experiment and play under adult supervision more, instead of either running amok or being tied up in unexplained rules.

    I wish atheism wasn't against the law in Arkansas, that Christian charity could be extended to include non-Christians living in the Bible Belt.

    What do you wish for?

    → 2:02 AM, Aug 31
  • Inspiration

    Noted game designer Erin Hoffman posted an absolutely amazing letter originally written by Rainer Maria Rilke to a young would-be poet:

    You ask whether your verses are good. You ask me. You have asked others before. You send them to magazines. You compare them with other poems, and you are disturbed when certain editors reject your efforts. Now (since you have allowed me to advise you) I beg you to give up all that. You are looking outward, and that above all you should not do now. Nobody can counsel and help you, nobody. There is only one single way. Go into yourself. Search for the reason that bids you write; find out whether it is spreading out its roots in the deepest places of your heart, acknowledge to yourself whether you would have to die if it were denied you to write. This above all -- ask yourself in the stillest hour of your night: must I write?

    Read the rest.

    → 11:02 PM, Aug 18
  • Haven't I Read This Before?

    Absurdistan: a fat, paranoid slob has a series of misadventures. Wasn't that a book called A Confederacy of Dunces?

    Stone of Tears: man enslaved by a society of magic-wielding b*tches. Isn't that the Wheel of Time series?

    Any books you've read lately that give you a weird sense of deja vu?

    → 10:32 PM, Aug 13
← Newer Posts Page 31 of 33 Older Posts →
  • RSS
  • JSON Feed