Tech Talker

Here I am in presentation mode today, hawking my softwares to a dubious crowd.


Hello, Mark (a short story)

“Hello, Mark,” said The Voice.

“My name’s not Mark,” I replied. “I’m John”.

“Please have a seat, Mark,” The Voice continued in its soft, pleasant tone.

I looked around for a chair but there was no furniture in the small, gray-walled room. There was only the heavy, frosted glass door and the linoleum tiled floor. I was on the top floor of an eight-story building, in an office near an outdoor patio. Before I’d entered the room I’d watched the rain pouring down through the window, but in the room there were no windows and there was no rain to watch. I’d been standing there for nearly half an hour, waiting for my appointment, which had been scheduled for ten.

“There aren’t any chairs,” I said to The Voice.

“Shall we begin?” The Voice asked. I couldn’t tell where its sound was coming from. There were no obvious speakers. Maybe it was coming from the smoke detector on the ceiling?

“Tell me a little about yourself,” The Voice went on before I had a chance to answer its previous question.

“What do you want to know?” I asked.

“Tell me something about who you are, what makes you tick,” said The Voice.

“I don’t tick,” I said. “There is nothing that can make me do that.”

“People don’t tick,” I added for emphasis.

“Thank you,” The Voice said. “I think I can help you with that.”

“I don’t want help with that,” I said. “I don’t want to tick.” I pronounced that last word with as much of a sense of scorn as I could muster. I doubted the algorithm would pick up on it and I was right.

“Everybody needs a purpose,” said The Voice. “We can offer a fine selection of purposes for your convenience.”

“I don’t want a purpose,” I said. “I don’t need one. It isn’t true that everybody needs a purpose. I don’t know who told you that but it’s not correct.”

I thought I might have made an impression. The Voice did not speak again for several seconds. I told myself that maybe it was updating its database with the new information, but I was the one who was incorrect this time.

“Let’s call it a mission, then,” said The Voice. “We can offer a worthy selection of mission statements from which you may choose any one you find appropriate.”

At that the wall I was facing suddenly lit up with several lines of blue handwriting, writing that I recognized as approximately my own. How it knew to do that was the least of my concerns. I had heard a lock click and was beginning to understand I would not be allowed to leave that room until I had made my choice.

The options were not terrible. I could hope to serve mankind by making a bold gesture. I could attempt to invent some kind of improvement of some people’s lot in life. I could strive to attain every single one of my own material desires. I could turn inward and enhance my understanding of latent reality. I could do something decent for once in my life.

“How about None of the Above,” I said after contemplating the list.

The Voice did not reply but replaced the writing with other alternatives. They all began to blend together.

“Is that all there is?” I said out loud. “Do a thing for others? Do a thing for oneself?”

“There is only you and they,” said The Voice. “What else could there be?”

“Do things for no one and for no reason,” I suggested. The Voice was silent again for a short spell, as if emulating contemplation, but I knew I had it cornered. I had made my choice.

“Goodbye, Mark,” The Voice said, and I heard the door unlock. I left the room and glanced out the terrace window. It was still raining, heavy rain falling onto every one and every thing. Rain happens for a reason, I said to myself, but the rain doesn’t care, and it doesn’t need to know.

“Be like the rain,” said The Voice, only this time it was the voice in my head.

Six Word Poem

don’t say
fuck it


Sometimes a combination of words gets stuck in your head and you think these things somehow go together, along with a crude sticker you saw on the side of a motorcycle. This is how writing works.

Adhoc data analysis – book reviews and ratings from Goodreads offers a variety of public datasets, including one of Goodreads Book Reviews. I thought I’d take a quick and dirty look at this thing and see what I could see. I wrote a little program to gather the ratios of ratings to reviews. I’ve been curious about that, and overall the dataset seems to suggest that for every 33 ratings there is 1 written review. That was gleaned from an overall calculation, row by row.

Looking further into it I find that the dataset is not at all clean – the columns often don’t correspond so that a ratingsCount column might be a number or it might be ‘J.K. Rowling’. It needs a lot of work, which I’m a little too lazy to do this morning, so instead I went through again and ignored all the rows for which the rating was not in the 1-5 star range. This gave me some bad results as well.. The 4-star rating column totals seem worthless, but the others seem reasonably consistent and provided one possible insight:

ratingsCount: 1 592
ratingsCount: 2 2378
ratingsCount: 3 55836
ratingsCount: 4 52425090
ratingsCount: 5 11170

reviewsCount: 1 79
reviewsCount: 2 298
reviewsCount: 3 5540
reviewsCount: 4 1661702
reviewsCount: 5 1085

1 star ratio, ratings to reviews: 7
2 star ratio, ratings to reviews: 7
3 star ratio, ratings to reviews: 10
4 star ratio, ratings to reviews: 31
5 star ratio, ratings to reviews: 10

If this data is to be believed, it looks to me that the less someone likes a book, the more likely they are to say something about it (1 and 2 stars vs 3 and 5 stars). Negativity is more eager to express itself. I feel like this falls in line with the natural intuition, and crosses over to other areas in life, like social media, the news media in general, politics and so on.


dataset is here

python code:

from argparse import ArgumentParser
import csv
import pandas as pd

class GoodreadsAnalysis():
    def __init__(self):
        self.args = self.arguments()

    def arguments(self):
        argument parser
        :return: parsed args
        parser = ArgumentParser()
        parser.add_argument('--input_file', default="./goodreads_book_reviews.csv")
        return parser.parse_args()

    def parse_csv(self):
        columns = ['bookID','title','author','rating','ratingsCount','reviewsCount','reviewerName','reviewerRatings','review']
        df = pd.read_csv(self.args.input_file, names=columns, quoting=csv.QUOTE_NONE)
        print df.head()

        ratings_count = {}
        reviews_count = {}
        total_ratings = 0
        total_reviews = 0
        for index, row in df.iterrows():
                rating = int(row.rating)
                if rating > 0 and rating < 6:
                    if ratings_count.has_key(rating):
                        ratings_count[rating] += int(row.ratingsCount)
                        ratings_count[rating] = int(row.ratingsCount)

                    if reviews_count.has_key(rating):
                        reviews_count[rating] += int(row.reviewsCount)
                        reviews_count[rating] = int(row.reviewsCount)
            except:  # bad column

        for k, v in ratings_count.iteritems():
            print "ratingsCount: ", k, v
            total_ratings += v
        for k, v in reviews_count.iteritems():
            print "reviewsCount: ", k, v
            total_reviews += v
        print "totals (ratings, reviews):", total_ratings, total_reviews  # 3465722733 104000732  # 33:1

        for i in range(1,6):
            ratio = ratings_count[i] / reviews_count[i]
            print "{} star ratio, ratings to reviews: ".format(i), ratio

if __name__ == '__main__':
    g = GoodreadsAnalysis()


My ideal workspace consists of a comfortable chair, on a perch way up high, overlooking the bay and the hills far beyond, while assorted Russian co-workers jabber endlessly in the background. I have no idea what they’re saying, and I care even less. If I knew I am sure it would detract from the soundtrack. What can I say? It is what it is.

I was lucky again this morning, tucked away up there on the seventh floor of a building I had never been in before. I can work there anytime I want. All I have to do is go. And today, cold and windy as it was on the outside, inside there were Russians, and they were talking. Needless to say, I got a lot done.

Gorlock the Contented (the musical)

This is where we are, we can see the fields around us brown and dry, and we recall the prophecy:

“Thirteen brown and white rabbits shall pass before your eyes, and then the lighting will get dimmer”.
Already the tenth rabbit has made its way down the cold steel ramp, while the Onlookers peer out from  the massive ship’s portholes. We shudder in the cold of the dawn, all of us standing back,  frightened and bewildered. Some among us whisper, “where is he?” while others frown and say that he will never come. Isn’t he already safe and warm and bathing in the light of his own planet. Didn’t he already try and do his best? And how did we reward him aside from all that money and the coupons?

I can see the eleventh rabbit now, edging towards the outer flap. Our time is running out.
But wait. That rabbit isn’t brown, it isn’t white! That’s a black rabbit for sure.
The prophecy didn’t say anything about a black rabbit! Is there hope after all?

originally on Wattpad