Stephen Cagle

Menu

  • Home
  • Archives
  • About Me
  • RSS

Soft Scan on Google App Engine

January 15, 2017

Google App Engine does not allow for a SCAN like operation on a kind. Although this is a hard limit, it can be worked around with some thought. This is my generic solution.

Considerations

GAE does not allow locking of the database. GAE does not even allow for locking of a kind. Transactions are the only locking mechanism in GAE, and they are limited to the entity groups within the transaction.

The closest GAE has to a scan (a lock of a kind, where every element of that kind is processed) is a GAE Query; which is a filtered iterator. Queries are "best effort" and are not guaranteed to reflect the current state of the database. Still, they are the best you have.

Using a iterator would be a O(N) cost, where N is the number of rows of a GAE kind . GAE is all about scaling dynamically. It would be nice if we could divide up the work of processing every row of a kind.

Solution

I have written a system that lets you (probabilistically) process every entity of a kind. It does not hard guarantee that every entity will be processed, but with a sufficient number of retries it does probabilistically guarantee that they after entity has been processed.

Usage

scan(
  '<kind>', # the Datastore kind that you want to scan
  retries=1, # a non negative integer, default 1
  retry-fx=lambda i: i**2, # i is the retry count, i=0 is always immediate
  max-retries=2, # a non negative integer, default 2
)

The handler-path will be called with the urlsafe() key of every entity of 'kind' <kind>. Specifically /<handler-path>/<urlsafekey> will be called for every <kind> entity. If handler-path returns 2xx, it is considered a success; otherwise it is a failure. Failure will cause the task to be re-enqueued in retry-fx(retry-count) seconds.

Example

Assume there are 3 Dog entities in the database with urlsafekey's of "rottweiler", "poodle", and "dalmation". Then,

from scanner import scan
scan('Dog', "/add/pedigree")

will cause the following endpoints to be called.

  • /add/pedigree/rottweiler
  • /add/pedigree/poodle
  • /add/pedigree/dalmation

This isn't much of a big deal when we are talking about 3 entities. But it is pretty useful when we are talking about thousands or millions of entities. Thanks to this "soft scan" we have the ability to have a function (a endpoint) called on every item of a particular kind in the datastore.

Read More »

Convert Google Datastore into Elasticsearch

January 8, 2017

This week I wrote an addition to gaend that automatically causes every ndb.Model entity to automagically be persisted to Elasticsearch.

Why?

Datastore (the database technology that powers Google App Engine) has a number of great features.

  1. It scales to like forever
  2. With GAE, you can do complex validation on every write
  3. Automatically applied security, upgrades, scaling, partitioning, etc.
  4. It is pretty simple

Although datastore is perfect as a Key/Value store that allows transactions and limited queries, it does have its limitations.

  1. It does not allow SCAN
  2. It does not allow JOIN

One effect of these limits is that it can difficult to do things like aggregation on tables. You should use the proper tool for the desired outcome.

  • Datastore is great as a key/value store (with transactions).

  • Elasticsearch is great at doing aggregation.

Datastore is structured (typed) data. Everything that goes into Elasticsearch must be JSON data. Structured data can be fairly easily transformed into JSON data. You see where I am going with this?

Nuance

This extension to gaend does successfully convert any Datastore data into Elasticsearch. You should look at your table in Datastore and perhaps consider whether you need to submit a custom mapping for Elasticsearch. If unspecified, Elasticsearch will generate a mapping for you based on the submitted JSON document. For tables made up of "primitive" data, the dynamically generated mapping is usually sufficient. Still, know that you can override the dynamic in the event that you have complex, deeply nested, or large types of data.

Read More »

Gaend

January 2, 2017

gaend is a easy way to get Restful endpoints on Google App Engine for Python. It builds endpoints directly from your ndb.Model classes.

Philosophy

This is my first Open Source Python library. It was fun to write and it helped me internalize some of the driving philosophies behind Python. Though there were many learnings, I think the thing I got the most was that Python favors complexity being hidden even at the cost of understanding. In reality, most Python code is NOT simple. However, most python libraries go to great lengths to hide complexity from the user. At some level, I feel that this is a disservice as it risks keeping the user in a permanently "infantile" state. On the other hand, it means that things "just work" and you probably aren't going to cut yourself on a sharp corner.

Contrast this to Clojure. In Clojure, a library should ideally be made of a collection of simple parts. These parts should have no state. It could be bias, but it seems like it is usually easier to understand the internal workings of a random Clojure library vs a random Python library.

The difference though comes down to usage. In Python, a library can often be used with one simple function call. Furthermore, there is usually one blessed library for most problems. Clojure however often requires you to put together "found art" from different libraries. Putting together multiple parts of many libraries to get to a solution. This is the ultimate in flexibility and expressiveness, but it also means that it can be comparatively difficult to get started.

Documentation

Beyond the project itself, I also enjoyed writing the documentation. It can be kind of fun to make believe that you are a user of your software with no context. It can be challenging to try to picture what your own software looks like to a complete stranger. It is actually a rather difficult job and I gained some respect for people who spend most of their lives writing technical documentation.

Read More »

Get a Vault token to your application

December 11, 2016

Your application needs a TOKEN in order to access your Vault server. How do you get the TOKEN to the application server?

Some Background

From here on we will be calling your Vault-server-in-the-cloud simply 'Vault'

Vault is a tool for managing secrets. Vault act as a key/value store where the keys are paths and the values are dictionaries written at those paths. Vault allows for auditing, roles, authentication, and much more.

Vault application access your secrets through a TOKEN. A TOKEN is built from a tuple of (ROLE_ID, SECRET_NONCE). You likely have a single ROLE_ID per application. Your SECRET_NONCE is a cryptographic nonce that is exchanged with the ROLE_ID to get a TOKEN. As a nonce, your SECRET_NONCE may only be exchanged for a TOKEN at most one time.

Once you application has a TOKEN it may then make request to your Vault server. A TOKEN will expire N minutes from its last refresh or initialization. So to keep a TOKEN valid, the application will need to tell Vault at least once every N minutes to refresh (extend) the TOKEN. Your Token will always have a lifetime of (last refresh time) + N. If your server goes down, the TOKEN will soon expire as the application will no longer extend the TOKEN lifetime.

What solutions do we have for secrets?

Don't use Vault; include secrets in your application

We have all done it, it is not a good idea. There definitely should be no secrets in your source code. Secrets in your source code means you cannot share your code without a full audit. Ugh

Environment variables are better. It still requires that you ask questions about what secrets exist at what locations when you are considering your infrastructure. Contrast this to having secrets in one place (Vault). If you are considering Vault then you have likely decided that environment variables are not a good enough solution, so I will not spend any more time attacking them.

Include the Vault TOKEN as part of your deployment

The equivalent of putting ALL your secrets in your application. Anyone who gets access to the TOKEN (through source or environment variables) can access Vault as the application.

Include the Vault (ROLE_ID,SECRET_NONCE) as part of your deployment

This is sound under some strictly ordered conditions. We must be certain that the application is the first to exchange (ROLE_ID, SECRET_NONCE) for the TOKEN. Because SECRET_NONCE is a nonce, we don't need to worry about subsequent request, only the first one wins. However, if Alice is able to get the SECRET_NONCE and exchange it for a TOKEN before our application, Alice would now have access to all of the applications secrets. Dependent order in security does not sound like a good idea.

Pass the Vault (ROLE_ID,SECRET_NONCE) in a application endpoint

After deployment of your app, call an endpoint on it and pass in a (ROLE_ID,SECRET_NONCE). Your application will then exchange your (ROLE_ID,SECRET_NONCE) for a TOKEN. This alleviates the timing concerns of the previous solution while still having zero secrets in code or environment variables. This endpoint can be entirely open. Vault will refuse to provide a TOKEN for a (ROLE_ID, SECRET_NONCE) that it did not issue.

Solution

I have written a demo project that implements a (ROLE_ID,SECRET_NONCE) endpoint. After the very first deployment of the app, it requires that you "light the pilot light" by posting a (ROLE_ID, SECRET_NONCE) that may be use to access Vault. So, the steps are.

  1. Deploy the app
  2. Make a curl POST request to /vault with your (ROLE_ID, SECRET_NONCE).
  3. If you want to update the TOKEN, make another curl POST request with a new secret, expire the old TOKEN.

Instructions are provided in the README.

Read More »

Speed is all that Matters

December 4, 2016

If you find that you're spending almost all your time on theory, start turning some attention to practical things; it will improve your theories. If you find that you're spending almost all your time on practice, start turning some attention to theoretical things; it will improve your practice. - Donal Knuth

I have an addiction to infrastructure. While programing a solution, I eventually find that I am working on things that do not directly contribute to solving the problem. From a rational/detached/post-fact perspective, I know that this is a huge source of waste. Funny, I never seem to notice this at the time.

The Problem

I do not have a problem with motivation. If anything, I do not value my time as much as I should. Let us leave that for another rant.

I do not have a problem with my programming skill set. It isn't lack of skill that impedes my ability to deliver. Not to say that I have nothing that needs improvement. My mathematics is weak, I never really got SQL, my Git skill are passable but nothing extroardinary, I am average at using the terminal, I type poorly, etc... There are a huge number of things I could learn and improve on, but non of those things stop me from being able to build solutions.

I do spend an embarassing amount of time trying to get things perfect.

I do spend far too much energy trying to deal with eventualities that never emerge.

I do spend mental focus on vanity features that I hope to someday reveal to the world, blinding it with my genius.

Meanwhile, the actual business problem sits untouched.

Observations

Speed is king. I am beginning to believe that this may be true of most things in life. I think the shortest way to get good at something is to become skilled enough to do it quickly. This seems to be true for artist and craftmen, so why shouldn't it be true for programmers?

It seems to me that there are at least 3 elements to speed.

Concurrency

Getting seperate works to come together harmoniously. This is one of the main differences between a good cook and a chef. A good cook often does one thing at a time in a linear fashion. A chef is often doing 3 or 4 things concurrently, connecting them so that they are all completed at the right moment.

Actual context switching in programming is almost certainly a detriment. However, the ability to know the order that things need to be acomplished to minimize downtime is a real skill. Huge numbers of books have been written on software estimation. I am not going to say anything about that. I am going to say that if you have done a task 10 times and it took an average of 15 minutes, then you can probably estimate that the 11th time will take around 15 minutes. This means that you can probably fit this task in a 20 minute lull in your schedule. This makes you faster.

Context Switch (Economy of Motion)

People who have speed aren't always fast. Sometimes they are just more efficient. A good example of this is beginner vs advanced guitarist. Beginner guitarist almost always move significantly more than needed to pick a note. An advanced guitarist does a minimal move. Guess who is going to pick faster (as well as tire more slowly)?

A large part of context switching in programming is familiarizing yourself with the codebase. If you are reusing a codebase that you have previously used, you can dramatically reduce the context switch of familiarizing yourself. This makes you faster.

Actions Per Minute

A measure of the number of task you can perform per unit time. This mostly has to do with repetition. You can perform a task more quickly if you have done a similar task in recent memory. Examples of this are evident.

Programmers may relate to this through the notion of Flow. When you don't have to stop and question how to do something, but can focus simply on what you are doing. This makes you faster as well as less succeptible to distraction.

Solution

Simple. Don't work on the big until you can quickly do the small. That is all I got.

Note: I am picturing a small project being ~10 hours. A medium project being ~50 hours. A large project being 200+ hours.

  1. Write down the project name, the difficulty, and the due date given your alloted time. Leave a small space for ✓ or ✗.
  2. If you succeed at finishing the project within time, give yourself a ✓ next to the project, otherwise give yourself an ✗. Either way, close the project.
  3. Now, ask yourself what the hardest difficulties were. Pick one of these difficulties to fix with infrastructure.
  4. Give yourself as much time to write the infrastructure as you spent on the last project. If you fail to get the infrastructure working within time, then stop and go to the next project. This is fine, our goal is to increase speed mostly through your own personal velocity, not through infrastructure.
  5. Pick the next Project. If the last 3 consecutive projects with ✓ next to them are of the same difficulty, feel free to move to a higher difficulty project. Loop back to step 1.

Speed

I think it is pretty natural to pick similar projects. Especially if you are trying to get "faster". This should allow you to focus on increasing speed (specifically through Actions Per Minute).

Scratching that Infrastructure Itch

Step 3 & 4 are designed to allow you to address persistent difficulties in code by writting infrastructure. This is very different than my current method of writting infrastructure though as:

  1. These are problems that actually came up in the project (no guesswork here).
  2. I am limiting how long I can spend on each piece of infrastructure.
  3. I am limiting myself to working on only 1 piece of infrastructure.
  4. I am stopping infrastructure work if it exceeds its allocated time. Distance lets me become more level headed about whether it is a worthwhile investments. I can choose to resume after another project, but I may decide they it was a false paths. The forced break gives me time for reflection.
  5. Note that at most you are spending 50% of your time on infrastructure. I don't know what the right number for that would be, but it is certainly better than I have done on personal projects in the past.

Confidence

Being able to do something quickly and well increases confidence. Computers don't care about confidence, but humans do. If you are reading this, you are likely human. As a human you should look after your mental well being. Being confident in a skill could open a lot of doors...

Read More »

Soulmate

October 2, 2016

At the time of this writing, there is exactly one review on Rotten Tomatoes for this film.

A gorgeously shot, tear-stained love letter to female friendship that also provides a fascinating look into contemporary, urban China. - Cary Darling

The above quote was the entirety of my knowledge concerning this film. I think it was "contemporary, urban China" that really capture my interest. I really like movies that might give me some idea of what a foreign country/culture/people are like. Films of this type are harder to find than you would imagine. Very few people capture their own culture in film. Most film captures an idealized version of a culture (for the protagonist), or a lampooned version (for our antagonist).

Best recent good example of this was Hell or High Water, which really capture the manerism/desperation/stagnation of some of West Texas.

I have no real idea whether it succeeds at capturing "contemporary, urban China". As an outsider, it seemed grounded, though a little dramatic.

Review

Soulmate is a Chinese movie that details the lifelong friendship of two women. I liked it. The end.

It isn't the velocity, it is the rate of change. It is the fact that the characters actually move and modify through time. I feel like modern cinema is so concerned with having "strong", "noble", everyman characters that we harden them to the point that they are as mechanical as the plot. I really appreciated the fact that, over years, the two main characters diverge, mirror, and recombine in different ways. That is an ambitious thing to try to make a movie about; especially when you limit yourself to two characters.

The camera work was also fresh. The shots were consistenly set up in interesting ways. People looking across each other in bed. Slow motion scenes to capture moments of youth (implying memory). There were a number of talking head scenes. Even within those, I felt like I was often getting a sense of the room, of the space, within those scenes. I lack the vocabulary to acurately describe what I was seeing, but I could feel it. Somebody really thought hard about how to set up scenes that fit the on screen action.

Reminded me a bit of Our Little Sister, though more maudlin. I thought it was a great movie. It was interesting, I was engaged, and the acting was enchanting.

Read More »

Fanimecon 2016

May 31, 2016

I like fandom in all forms. There is a good chance that I will attend a conference about anything that you are a fan of. I enjoy being around people who are all interested in the same thing. I am especially attentive when fandom will not yield any status or wealth. This lets me know that these people are actually fans of something. There are no ulterior motives.

Fanimecon is a anime convention "by fans, for fans." Something north of 25,000 people descend on San Jose, California for this thing. I rented a Air BnB with 11 other people. The camaraderie of attending together outweighed the annoyance of waiting for showers. I would recommend attending with a group.

Fanimecon has a game room that is open for the entire length of the conference. This is where I spent a solid 70% of my time. I played euro board games, made acquaintances, and watched competitive gamers. Oh, also socialized and shot the bull. Lots of that.

Cosplay is a big part of these sort of conventions. Some of the costumes were amazing. Myself, I am not that interested in dressing up (though I could be persuaded). I would like to create something to showcase for next years convention. I took real inspiration from Laputa Robot and the Venusaur (below). That is pretty cool.

Cosplay is not all anime/manga based. Around 30% of the cosplays are video game characters. Especially popular this year was Overwatch.

There was also a Manga section where you can relax and read in a less frenetic environment. This is a real boon to people like me, who get agitated and worked up when surrounded by the press of humanity. I took pictures of some of the titles that looked good.

In summary, it was a great time. I met lots of people. I played many games. I even watched a little anime.

Tiny arms are no hinderance in DDR
The Robot from Laputa: Castle in the Sky
Roomba Venusaur?
Read More »

Abstinence is Easier than Moderation

May 18, 2016

I don't own a television. That is no boast, it is a reflection of my poor taste. I am the sort of person that will watch things because they are on. If I owned a television, I would likely spend my days going from Judge Judy to Jerry Springer and back.

I am just as bad at impulse control on the internet. I need a computer to do most... well... everything. For some parts of my day, I need to be working. For others, it is time to sit back, relax, and browse.

I edited my /etc/hosts file so that it redirects sites that are time sinks to localhost. I get a nice This site can’t be reached; no more visiting reddit 3 times an hour!

Sometimes though, I want to actually relax and browse. I then need to edit /etc/hosts again to unblock all those performance killing sites.

Having to edit a file on a daily basis is painful. I can do better.

I am on a Mac, so I use launchd to create two scripts that run at 22:00 and 2:00. The 2:00 script returns my computer to the "focused" state, limiting what sites I can visit. The 22:00 script puts my computer in a "relaxed" state, allowing me to browse until bedtime. Both of these files should be in your /Library/LaunchDaemons directory. The advantage of putting these files in /Library/LaunchDaemons as opposed to ~/Library/LaunchAgents is that they are run whenever the computer is on, rather than just when you are logged in. Also, they will run upon wake, even if the trigger time occured while the computer was asleep.

Daemonic Agents - Code example that includes /etc.hosts files that I find useful

Read More »

Learning Haskell

May 8, 2016

This week I joined a study session / book Club for Haskell. The Book we are covering is Haskell Programming

History

I joined rather late so had to do 6 chapters in one week. Now that I am caught up I can do a leisurely 1 chapter a week. Everyone reads and performs the exercises in each Chapter on their own. We have a weekly meetup where we can talk about any difficulties with the exercises, get a head start on the next chapter, or just socialize.

Why?

Mostly to just reaffirm my belief that what I have is already the best. I really enjoy Clojure. It is my favorite language to work within. The only aspects I sometimes question are related to testing and correctness. I think the unit/functional/generative testing story is great in Clojure. Test are neccesesities in Clojure in order to generate correct code; is this a universal truth?

I have this fantasy though that maybe, just maybe, if I understood type systems well enough I could write code that does not need test at all. Code that is so bulletproof that the fact that it compiles is all the proof we need to know that it works. I suspect that this is a fantasy. Unfortunately, I don't think I can convince myself of this unless I can actually use a strongly typed language and demonstrate this to myself.

Impressions

Less than impressed.

I get that they wanted a language that is similar to how mathematical functions are written. This results in some rather complex and ridiculous rules for using operators. Ok. Fine.

I also think the fact that I can choose either where or let just makes the code harder to understand as I have to move my eye all over the place to grasp what is going on.

The type system is of course a painful thing to bear with, but is probably also the aspect of Clojure that will pay the most dividends. I find it challenging, at the same time I am excited as I begin to understand how it all works.

Conclusion

We march on! Haskell is one of those things that I have said I would learn for years. Here is an opportunity to do so. Doesen't come up all that often. I don't care if I am not getting any immediate value out of it. This is a bucket list item and I am completing it.

Read More »

Hatsune Miku Concert

April 30, 2016

Hatsune Miku is a popular vocaloid performer. I heard about vocaloid singing (and Hatsune Miku) a few years ago. I have never listened to vocaloid music previous to this concert. I decided to attend one as I find the concept intriguing. This concert was held at the Warfield.

Tent Revival for Nerds?

I have not attended many conerts. I am trying to remember the last one I attended; probably more than a decade ago now. I believe the last was either "A Perfect Circle", "Nine Inch Nails", or KMFDM (can't remember which was last). Whenever I am at a concert, I am always struck by how similar concert experiences are to religious ones. People reaching towards the heavens, putting their hands up, sometimes clossing their eyes and letting the feeling of the moment capture them.

I am not a religious person. Similarily, at a concert, I have trouble "letting go" and getting worked up with the crowd. I try to, but I often fail. Anyway, enough about me.

This concert was similar to any other concerts in that the people in it were experiencing a "spiritual" communion with the singers and with each other. The fact that the singers were entirely artificial, with voices digitally stitched together from (1 or more, not sure) human singers seems to make no real difference. The love of the singers, music, and genre was real.

Glitch Mob Sound

Having said that, the music really takes some getting use to. For the first 10 minutes I was thinking little more than "Jeesus, this shit is atonal and the voice is just horendous". I was putting on a good face because I wanted the people I was with to have a good time (and they did) but I was internally thinking "Gaaaawwwdd, this is awful". The sound grew on me after a half hour or so. I don't think it is music I am going to listen to in a non concert setting, but it does grow in the context of a live showing.

On a Meta Level

I think the whole idea of worshiping Idols that have never existed is probably the next stage of things. Already, most comercial bands are 90% fabrication. Really just companies with a product looking to maximize market share and future earnings. When you see a Katy Perry concert, you are mostly seeing the decisions and work of the huge number of people who go towards fabricating that image. Yes, there is an actual 'Katy Perry', but she is just the human form of the Platonic ideal of a Katy Perry. That ideal is a fiction created by a huge number of people. This is the next logical step; why bother even maintaining the fiction of a real personf?

Did I enjoy myself?

Actually. Yes. Immensely so.

At first I was feeling kind of nervous and disoriented about the fact that the singer was artificial. However, you start to tune in on the fact that everyone around you is ecstatic to be here. There are no posers here, nobody looking to make a scene. No pretentious ass from your local theater district. These are people who are embracing something that is, to put it bluntly, rather (totally) dorky. And they love it! They are doing it because they love the music, the character, the sound, whatever. It is refreshing to see people enjoying something so much.

It may have been the glow stick "orchestration" (I got pretty good at it). It may have been the screaming crowds that just couldn't get enough of one act after another. It may just have been the chance to see people I know who are usually very reserved belting their hearts and souls to songs that I can't even follow (all Japanese). I don't know, doesen't really matter. I enjoyed myself; would go again.

A look at the Puppeteers
This was kind of neat, words superimposed with the Performers
Seizures r'us
Best recording I got of what her voice sounds like
Miku directing the crowd
As you can see, it is really 4-5 band members playing with Miku
Read More »

Embrace the Serpent

April 23, 2016

Odd film. It kind of reminded me a bit of "The Fountain", though this one is a bit more subdued.

Hah, maybe that creepy Mayan (I forgot) looking guy who keeps saying "Death is the road to Awe" is Karamakate... Just kidding. Didn't even seem like the philosophies were all that compatible.

Recording & Encryption

I had vague knowledge about "rubber plantations" and just how poorly native pupulations were treated during those times. Awfull. Things like that really reaffirm my commitment to the idea of a monitoring society that makes easy use of recording technology + encryption. Recording so that you can have an "unbiased" (<- really loose use of the term there) view of something and encryption so that you can share said unbiased evidence anonymously. I can't promise a better world. But it seems to me that a great number of evil is done because not enought people of power are aware of them. Recording + Encryption does not fix the world, but it at least gives a voice to and causes note of it for others.

Pride

As I watched the film, I was reminded how little "pride" I have in my own culture/race/whatever. Karamakate loves his culture, he wanted his people to continue, barring that, he wanted the knowledge of his culture to endure. Above that, he views the jungle and his gods as being a sort entity that cared for him and whom he cared for. Not that I am in any way ashamed of my culture, it is just rather nebulous; not something I give a great deal of thought. I an American by birth. I am North Western European (British, French, German) by lineage? I have no religion. I have no membership in any permanent organization. Hell, the closest thing I have to an identity is probably that of "programmer". I know that other programmers are going to have similar mindsets to my own. This is a group, I guess it is even a culture, but it is not something I take inherent pride and strength from. I largely see myself as an independent agent exerting smal force upon this world. I don't really see myself connected to anything, I only see the influence of myself upon it. Hard to describe, but Karamakae seemed to see himself as something within a whole, where he and the whole were in a sort of balanced (I wanted to use the word 'homeostatic' here, but that is too fancy) eternal state. I don't have anything like that; anything I want to preserve above myself. It is sometimes an empty feeling, at the same time, it means that I am beholden and owe fealty to nothing.

Read More »

File Conventions to make Backend Engineers Happy

April 22, 2016

A random list of file conventions that make me happy. Although these do not apply to every situation, they are true enough that you should at least consider them when creating an output file format.

If it is a list of things, use CSV

Don't make up your own format. Please. Just use CSV (note: does not have to be commas, any unused delimiter will work, or use quoting characters within your CSV if you have to).

Don't use slashes in the filename

This hurts. If you include slashes in the filename, it makes is look like the file is actually a directory listing. Furthermore, modern storage system like gcs and s3 don't really have directories (they are really just a bunch of objects in a bucket). However, they will logically present these objects as if they are made up of directories if you include slashes in the names. This is odd because when you download individual files they will download as files. When you view them the files within the s3 viewer they will appear as directories. when you (r)sync the buckets the files they will appear as directories... It just gets messy. Just don't use directories. Use a flat bucket of files.

Include everything of a homogenous type within a single directory/bucket

I think buckets should basically be treated like typed arrays/vectors/list. You should only have a single type of thing within them. Don't mix multiple different types of things as you are then forcing someone using said bucket to filter on what they need. Really, if you have multiple types of things, use multiple buckets.

Make it so the names of files are automatically sorted in some usefull way

Let me provide an example.

1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/89/0/rtp.pcap.wav.ctm
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/9/0/rtp.pcap.wav.ctm
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/90/0/rtp.pcap.wav.ctm

9 should not logically be between 89 and 90. However, most directory listing operations will list things according to logical text order. Ugly. I think it it would be much better to sufficiently pad such a file so that 9 does not show up here, something like

1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/00008/0/rtp.pcap.wav.ctm
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/00009/0/rtp.pcap.wav.ctm
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/00010/0/rtp.pcap.wav.ctm
...
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/00089/0/rtp.pcap.wav.ctm
1946304563_66189429@216.221.154.11-66.228.112.5:27832/callee/00090/0/rtp.pcap.wav.ctm

Of course, this involves either:

  1. Just picking some arbitrary padding that will always be sufficient (famous last words)
  2. Extending the padding on all previous files whenever you add another digit. So, for instance, when you are on element 10 you go through all previously written files and change 0 to 00, 1 to 01, 2 to 02, etc.

Let me just say how much I appreciate you doing this for me. You have no idea how anoying it is to have to always itertools.groupby(sorted(os.listdir(path), key=key_fx1), key=key_fx2) whenever your filenames does not logically sort. Tiresome.

Read More »

Renoir: Revered and Reviled

April 21, 2016

On Bovine women, plebian taste, and Renoires non Impressionist work.

A bit of a jump

I was interested to learn that Renoir actually had a fairly major "shift" in drawing style. Many people know Pierre-Auguste Renoir as an Impressionist painter. Few realize that he seems to have tired of this style in his 50's and switched away from Impressionist style art and towards (mostly female) nudes. Although his art from before his 50's (1890's) is commended, the work after is often considered appalling by critics for various reasons.

Bovine women

One of the critics in the film commented that Renoir drew "bovine" "empty headed" women. I am going to ignore the "empty headed" part, as hell, I don't know. A lot of classical paintings seem to be of people with queer expressions on their faces, I guess I haven't thought about it enough.

Bovine. This struck me as somewhat odd. Foremost, he liked big girls, what is the big deal? Secondly, it is an interesting use of language. In modern times, calling anyone bovine, no matter how fat they are, would be an incredibly rude thing to say. This critic clearly did not like Renoir's work. However, it appears that it is ok to use terms that you would personally find in bad taste if you are using those terms to describe the behavior of someone whom you are casting in a bad light. Interesting. The critic would probably never directly call someone bovine. He would however use the term when describing the output of someone he dislikes. It is a subtle verbal trick, but in doing so it allows one to use a distastfull but powerful word without attributing it to yourself. I thought that was clever.

Plebeian taste

Hell, I liked most of what I saw. The art makes you feel good. It is relaxing. It reminds you how attractive the female form is and makes you want to go lay in a sunny field. What is not to like about that?

Read More »

Clojure / West 2016

April 18, 2016

A recording of all that I saw and hear at Clojure West 2016 in Seattle Washington.

Nathan Marz Specter

Github

  1. Navigation is independent abstraction
  2. Navigation dissasociated from the desired transformation
  3. Provides type defined defaults for navigation to nil
  4. Assuming you can write a generic enough function

This library lets you navigate and modify deeply nested and deeply repetitive data structures. Fundamently, it raises the barrier before you need to start putting things in a database by making it possible to just reason about data when the data is very deep or very broad. It makes the actionable code look like a DSL in its conciseness; without actually being a DSL. Having said that, it is bringing in a rather large "mini DSL" in order to allow for the data manipulation.

Donevan Dolby

This was a walkthrough of a 16,000 line of code Clojure App. Lessons were learned, libraries were used, and discarded. Code is being used on the Boeing 737 MAX; which is evidently a new plane with a focus on efficiency.

Claire Alvis

https://github.com/SparkFund/spec-tacular

An attempt at putting some sort of stronger typing on entities in Datomic. Graded various aspects of her attempt. Did not entirely follow due to lack of familiarity with Typed systems in particular.

  1. Adds types in to Datomic by having a spectacular shema -> becomes datomic schema
  2. Verification of code
  3. Documentation is specified by the spec

Michał Marczyk

This was just a deep dive into exactly what a record is and when it is appropriate to use one. A record is just a collection of fields, possibly of different data types, typicially with a fixed number and sequences.

Records also takes types into account (.equals and .hashCode)

Big exception is that = and .equals are NOT the same when comparing Record to a map even with the same value.

dissoc a key from a Record returns a Map

It can be a bit surprising to see this. Unfortunately, they often still look like records. In fact, this is one of the reason record? exist.

Reasons you might use records

  1. Clear data semantics (you are naming things) (clara-rules)
  2. computed properties (midpoint of a circle, IShape, Circle, Rectangle)) (core.async)
  3. polymorphic 'actions' (Stuart Sierra's component)
  4. A clean simple way to create a named class implementating a interface
  5. (defrecord ForJava [...] :load-ns true ...)

Mario Aquino

Showcased an API for interaction to the Alexa Skill system from the Clojure API. It is called Boomhauer, from the king of the hill character. GITHUB

  1. Interactions can be single exchange or can be stateful
  2. Alexa has two concepts Intent and slots
  • Intent - What you want to do GETHOROSCOPE
  • Slots - The "arguments" passed to a
  1. Uterances - How you might express the things you are interested in eg.
  2. There is a local development that you can do
  3. Mobile could provide a great way to make Alexa a real success.
  4. There are libraries that generate all the uterances you want from a grammar.
  5. There is a Certification process. Got to get approved like Mac Application.

This might be good for the sales reps. I mean, they are already wearing a headset, it would be cool if they could do things like take voice notes and make calls and all that stuff without even having to touch the screen.

Michael Drogalis

  1. "Peerless" in the sense that peers open direct line of communication between each other
  2. Zookeeper for keeping track of the entry's that have been added

I have no use for this, thought it was neat. It is basically a system for doing distributed computation in a peerless system.

Jack Dubie

Hiearchy of testing - [Decoupled, End to End, Lightweight, Simple]

  1. Unit Test
  2. API Test
  3. UI Test (Selenium) - Just test what is supposed to happen

How do you test that something was done without actually tying to a particular db?

Refresh the page after performing an action, you should have the same state as you had when you finished. Without tying to a particular thing you have proven that it has been persisted.

Stuart Sierra

  1. Removing a method definition does not remove it from the ns
  2. Macros if changed will not cause things using the macro to be re-evaluated
  3. Protocols don't reload because Java Classes are Immutable

Assumptions

  1. 1 file = 1 ns
  2. No circular dependencies
  3. No loading code outside of ns
  4. No fully qualified ns in variables, you must require everything

Dealing with Application state

  • RELOADED
  • COMPONENT
  • TOOLS.NAMESPACE

You can have multiple systems that are seperate "systems" in development and production

When you need development, just merge all the systems into one map

tldr; Source Code != Program

Tony Kay

UNTANGLED

Honestly, it looks rather complex to me. I do not convinved these new models based on Falcor are actually superior.

Bozhidar (Cider)

l - can be used to show a list of the locals
o - takes you out of the current debugger
s - stacktraces
which-key package -
http://cider.readthedocs.org/en/latest/
there is a really good story in terms of being able to trace recursive functions
enlighten mode basically enables lightable in emacs
cider-scratchpad is usual for prototyping ideas
C-c C-e for normal evaluation
C-j to print out the result
cider-inspect lets you look at complex data
cider-docs - to see docs
cider-grimoir - to see examples
cider-apropo - match all symbols related to the word you name
Projectile installed allows you to toggle between implementation and test

Questions

Can you instrument the debugger from API?

Yes.

Can you debug Clojurescript?

No.

Zach Tellman (Clojure Applied)

  • The extra verbosity of using standard functions rather than ...
  • Always be composing - https://www.youtube.com/watch?v=3oQTSP4FngY
  • Dynamic Variables for Datastore & TaskQueue
  • with-redefs might be better? Not sure.
  • Most of the time you want to be verbose rather than cryptic.
  • It is better to duplicate code than to have the wrong abstraction

Arachne

Some modular web framework that is going to normalize how people do web programming.

Mikaela Patella

  • Web Developer -> Distributed Systems Engineers
  • The clients and the servers are all segments of a distributed system.
  • The "server" is an abstraction over the entire backend, a consistent snapshot of an uncertain distributed system
  • Big idea is that "Frontend" and "Backend" are relics of the past (We are really just distributed systems.)

Think of as games....

What if we thought of it less as "request/response" (webdev) programming and more as a game? Where we have to do local level rendering of a segment of the entire world.

Priyatam Mudivarti

  • Invalidation - How do you inform other users that the current information is no longer valid
  • Eviction - How long do I exist?
  • Naming - What is th ename of the cache
  • {cache-name}-{uid}-{cache-version}-{logical-timestamp}
  • In order to properly invalidate things, include a timestamp

So, for good caching, also include a timestamp as part of the UUID, this way you don't have to revert data, instead you can just increment the timestamp and this will mean the cache is no longer used. Thi smight actually apply to Elasticsearch for my own uses.

Alex Kehayias (Chocolatier)

Problem with conventional game engines is

  1. you intermingle state and behavior
  2. Not declarative
  3. No Interactive development

Entity Component system

  • Dungeon Siege & Unit Game Engine
  • Basically, it is a map of components (interfaces) that it supports
  • Devcards - This guy had a good experience with devcards.

Performance

  • Variadic function scannot be optimized (use multiple arities instead)
  • apply has a real cost (it can not be optimized)
  • keyword-equal? is much faster
  • defmulti is slow, detype, defrecord, defprotocol is fast
  • AVOID INTERMEDIATE COLLECTIONS
  • If you now it is a boolean, skip test use ^boolean

Some great Resources at the end

Matthias Felleisen

  • All types think types while they create code
  • In some programs, we can check programs at compilation time
  • He is against Type Inference.
  • Hindley-Milner type inference (Ml, Haskell)

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.

Personal

Good conference. Met a number of people that we can bring in to work if we need their skills. Learned about new technologies in the Clojure community. Specifically, I think the Alexa system might be something we should look into for Reps. Specter might be good for keeping our system as Data and not needing to put everything in a database. The Data science team might like that; of course, it would involve learning clojure. I think that would be a win win for everyone. :]

Read More »

The Family Trade (The Merchant Princes, #1)

Charles Stross
March 10, 2016
The Family Trade (The Merchant Princes, #1) cover

Awful. Just awful. This is a bad Harlequine Romance novel wrapped in the thinnest veneer of Sci-Fi. Let me transcribe some of this crap for you...

> "You're beautiful."
>
> "I bet you say that to every naked woman you wake up in bed with."
>
> "No", he said in all seriousness. Before he realized what he'd done. Then he turned bright red. "I mean", he was too late!
>
> [Name Redacted to avoid spoilers], "Got you!" she giggled, holding him down. Then she subsided on top of him.

What. The. Fuck. This is some of the more event driven "dialogue" in the book. When our Mary-Sue-Wonder-Bread-Social-Warrior isn't spending most of her day conducting internal monologues about how she feeeeels at every moment, we get the treat of listening to this level of dialogue between herself and her compatriots.

Enough about the dialogue, let me get into the parts of the book I really hated.

HERE BE SPOILERS



Understand the culture you are in.
I really dislike it when literature treats other races/cultures/peoples by only characterizing them by the mores and beliefs that we disagree with. It is just so one sided, so arrogant; really gets my heckles up.

In this case, I was just flummoxed how our heroine is able to just waltz in and start instituting change without anyone being able to touch her because she can outfox them due to her free market understanding of how the world really works.

Question your environment
I could not buy that an investigative journalist expressed no real interest in figuring out how the locket/worldwalking worked. It just blew my mind. She didn't even ask if anyone had ever done any research on it! Come on!

Hell, I would have given her a pass if she had at least bothered to figure out the parameters, the limits of this thing. Nope, the second she figured out that it could work, we were done. After discovery, she never again bothers to test the limits of the system, to question why there is a mass limit, why do you get headaches, is their conservation of momentum? Nothing. It was just so... I just couldn't believe this. It is a good thing she dropped med school, she would have been a terrible doctor; doubt she could diagnose a cold.

Nobody cares about your feeeeeelings
I was so sick of hearing how she "wasn't going to allow them to ...." or "Let them try to get me to ...". As a verbal tick it gets old fast. The forever monologues as she connects her painfully slow reasoning made my eyes water.

The book just ends
Literally nothing is resolved at the end. It just ends. Asshole. In terms of interest, it is just dull for about 85%, then you have 10% of rising interest, and then you have a 5% ending where you realize nothing is going to complete. Wow, that made me angry.



END OF SPOILERS

I really have a hard time believing this is the same guy who wrote "Accelerando", "Rule 34", hell even "Neptunes Brood". Amazingly Bad.

Read More »

A Fire Upon the Deep

November 25, 2015

Big idea here is that the Universe is a spectrum of fast to slow zones. In fast zones we have access to "higher" levels of computation, in slower zones the exact same machinery will become buggy or nonfunctional. It was never specified exactly what computations you can do in higher zones that you cannot do in lower zones. The important side effects of this though are that higher zone allows self aware AI and allows ships to jump between the stars. Lower zone have no self aware machinery and requires that you actually travel between the stars at only a small multiple of lightspeed. It is strongly implied that humanity/Earth may have come from a lower zone. That is very rare, as most "higher zone" aliens actually accend by being contacted by a more evolved aliens. Humanity may have actually manually made the voyage to higher zone from lower zone without outside intervention, though most aliens would regard that as unlikely.

In the highest zones (the Transcend), there are AI's that are basically Gods. Within their zones they have almost unlimited power. Although ultimately constrained to the higher zones, the projection of their power extends to lower zones. Fortunately, most AI's in the Transcend quickly loose interest in the going on's of life in the lower zones. Metaphors fail in terms of applying lower zone reasoning or emotion to a God, but you might say that it is considered perverse by most AI's to be at all interested in the life of lower real beings. They view us the same way human beings might view insects. Some human beings actually have pity and take interest in insects, but the majority simply leave them alone as they have no real interest in them one way or another. I liked that part of the story. I like the idea of an AI that basically isn't even evil, it just does not care because you are beneath it's notice.

I liked the idea of the Zones. I liked the idea of all intelligence (from virus all the way to Artificial Intelligence) basically being some form of computation. The lowest zone, known as the "Unthinking Depths", does not even allow biological species to achieve sentience. I liked the way Intelligence was just quantified as being something that is only limited by physics. It was a neat idea.

The other big idea I liked was the Tines. The Tines are an alien species where each "person" is made up of 4 to 8 members. Each of these members looks something like a greyhound (at least in my mind). Each member is a distinct organism, but is usually not capable of any advanced thought. Members communicate at the speed of sound by constantly talking to each other. Once a group of 4+ members forms and acclimatizes they will become sentient. In doing so, the new "person" is a combination of the personality, characteristics, and skills of all its constituent members. Once a member joins, they almost never leave a group; it is not a confederacy of members, it is a person that came to be because of it's constituent members. I really liked this idea. I thought it was a very creative way of thinking about some new type of intelligence. A intelligence that came to be in a different way and for a different reason than human intelligence. It makes me think of split brain patients, how they are one person, but in some (very unscientific) sense of the word have two brains. I really liked how the speed of sound was a limiting factor to their group intelligence. I recollected some of the amazing feats of plasticity that the human brain seems capable of. What would the result be of linking seperate human beings brain-to-brain with radio? It also made me think a good deal about how similar thinking about an experience is to actually experiencing it. Imagine, in a Tines group (person), one member has his nuzzle in a flower, breathing in the pollen. He is communicating the sensation to the other members in his group. For all intents and purposes, they all simultaneously have their nose in that flower. It is a really interesting idea. I think of intelligence as being singular, but must it be? What would it mean to have trully parallel intelligence? Where each "node" is broadcasting and receiving everything it experiences and thinks to every other member in the group? It sounds wonderfull.

Read More »

Sicaro

October 6, 2015

Saw "Sicario" this evening. It was a pretty decent flick. Remined me a bit of the submarine movie I watched a while ago called "Black Sea"; left you with the same tense feeling in your neck. I guess, I guess I enjoy movies like that. I like movies where things are just building up slowly, where tensions are being accrued. I think I also respond to the idea that this is everyday life for the people in these films. I wonder how I would (or if I could) handle those sort of situations.

I guess the take home message of the film is that the only way to deal with lawless entities like the Cartels would be to meet them with violence. The state, as a system of laws, is not really capable of inflicting the sort of violence neccessary to check them. The state therefore looks to outside contractors to do their violence for them. Is this acceptable? Is the result actually better? Is the premise even sound?

I did enjoy the contrast between the clean cut FBI agents and the result driven CIA agents. I can't honestly decide who is right in these sort of situations. Of course, I don't know whether the movies portrayal of each side correctly personifies reality. It was still an interesting character study.

Read More »

The Atrocity Archive

September 10, 2015

Wasn't bad. As a time saver, I would almost recommend reading it in reverse.

This book contains three parts. The first part is 3/4 of the book or so "The Atrocity Archive". The second part is a short story in the same world with the same character within "Atrocity" called "The concrete Jungle". The last part is a reflection by Charles Stross about books of this nature.

So the last part of this books waxes philosophical and otherwise about the nature of a book like this in the world. It is probably what you should read first. If what is described within sounds interesting to you, then read from the beginning. If it sounds awful, then read something else.

If, however, you aren't sure, then I would recommend reading the second story "The Concrete Jungle" first. Did you like that? Then you will probably like the first (and much longer story) "The Atrocity Archive". There, I made efficient use of your time.

Personally, this really wasn't my thing. If felt too much like Star Trek dilithium-crystal-deus-ex-machina kind of mumbo jumbo to me. To be fair, I don't enjoy horror (maybe it is a lack of imagination), so I may have just been skimming when I was supposed to be enthralled.

Read More »

The Atrocity Archives (Laundry Files, #1)

Charles Stross
September 8, 2015
The Atrocity Archives (Laundry Files, #1) cover

Wasn't bad. As a time saver, I would almost recommend reading it in reverse.

This book contains three parts. The first part is 3/4 of the book or so "The Atrocity Archive". The second part is a short story in the same world with the same character within "Atrocity" called "The concrete Jungle". The last part is a reflection by Charles Stross about books of this nature.

So the last part of this books waxes philosophical and otherwise about the nature of a book like this in the world. It is probably what you should read first. If what is described within sounds interesting to you, then read from the beginning. If it sounds awful, then read something else.

If, however, you aren't sure, then I would recommend reading the second story "The Concrete Jungle" first. Did you like that? Then you will probably like the first (and much longer story) "The Atrocity Archive". There, I made efficient use of your time.

Personally, this really wasn't my thing. If felt too much like Star Trek dilithium-crystal-deus-ex-machina kind of mumbo jumbo to me. To be fair, I don't enjoy horror (maybe it is a lack of imagination), so I may have just been skimming when I was supposed to be enthralled.

Read More »

Seveneves

August 10, 2015
  1. Anathem
  2. Snow Crash
  3. Cryptonomicon
  4. The Diamond Age: Or, a young lady’s illustrated primer
  5. Seveneves
  6. Reamde
  7. Quicksilver

Yeah, it isn’t my favorite book of his by any means. Still, it is a Neal Stephenson book, so it is pretty good.

There was some neat ideas about spaceships that are basically bollas and whips, and I suppose this book introduced me to the idea of the Lagrange Points; kind of cool. I was also taught about epigenetics, which I figured was made up until I looked it up.

My main issue with this book is that it feels at times like he forgot that you need to actually tell interesting stories about people. Seems that as he gets older (Reamde and Seveneves) Stephenson has become more technically obsessed. This is fine, but some segments of his novels are somewhat tedious to read through. I read sci-fi for two reasons. Foremost, I always hope to be exposed to some new idea or thought. Second, I enjoy out of this world stories. Stephenson always delivers on the first, lately I feel that he is not giving his full attention to the second.

A large amount of this book reads a bit like a technical manual for getting humanity into space. I seem to be reading more authors in this style. Seems to be a resurgence in the “hard” sci-fi of the past. Most recently I have read the “Bowl of Heaven” by Greggory Bentford and Larry Niven as well as “The Martian” by Andy Weir. My feelings about this “hard” sci-fi genre is always mixed. On one hand, it does seem a little more relevant if the technology mentioned might someday exist and could, to the best of our knowledge, work. However, realistically, I think we are talking about relative things here. In darts, if you miss the board, you missed the board. The fact that you may have hit the wall rather than the floor may mean you are closer to the board, but you still completely missed it. Similarly, I think hard sci-fi may be closer to our actual future than space opera is, but the magnitude between either of them and reality will be so great as to make them both seem equally ridiculous.

I think sci-fi is most effective when it takes an idea (the singularity / time travel / gestalt consciousness) and builds a compelling story about it. I don’t think it is of particular importance that the idea be currently feasible according to our current understanding of the world. It is cool when it is, but still, this is fiction, use your imagination.

Read More »

Seveneves

Neal Stephenson
August 4, 2015
Seveneves cover
  1. Anathem
    2) Snow Crash
    3) Cryptonomicon
    4) The Diamond Age: Or, a young lady’s illustrated primer
    5) Seveneves
    6) Reamde
    7) Quicksilver

    Yeah, it isn’t my favorite book of his by any means. Still, it is a Neal Stephenson book, so it is pretty good.

    There was some neat ideas about spaceships that are basically bollas and whips, and I suppose this book introduced me to the idea of the Lagrange Points; kind of cool. I was also taught about epigenetics, which I figured was made up until I looked it up.

    My main issue with this book is that it feels at times like he forgot that you need to actually tell interesting stories about people. Seems that as he gets older (Reamde and Seveneves) Stephenson has become more technically obsessed. This is fine, but some segments of his novels are somewhat tedious to read through. I read sci-fi for two reasons. Foremost, I always hope to be exposed to some new idea or thought. Second, I enjoy out of this world stories. Stephenson always delivers on the first, lately I feel that he is not giving his full attention to the second.

    A large amount of this book reads a bit like a technical manual for getting humanity into space. I seem to be reading more authors in this style. Seems to be a resurgence in the “hard” sci-fi of the past. Most recently I have read the “Bowl of Heaven” by Greggory Bentford and Larry Niven as well as “The Martian” by Andy Weir. My feelings about this “hard” sci-fi genre is always mixed. On one hand, it does seem a little more relevant if the technology mentioned might someday exist and could, to the best of our knowledge, work. However, realistically, I think we are talking about relative things here. In darts, if you miss the board, you missed the board. The fact that you may have hit the wall rather than the floor may mean you are closer to the board, but you still completely missed it. Similarly, I think hard sci-fi may be closer to our actual future than space opera is, but the magnitude between either of them and reality will be so great as to make them both seem equally ridiculous.

    I think sci-fi is most effective when it takes an idea (the singularity / time travel / gestalt consciousness) and builds a compelling story about it. I don’t think it is of particular importance that the idea be currently feasible according to our current understanding of the world. It is cool when it is, but still, this is fiction, use your imagination.
Read More »

Pillars of Eternity

July 24, 2015

Yes, it took me about a year and some change to finish this game. Game saves say that I have played 60 hours, so if you include the restarts and other losses, it was probably around 80. That is a massive investment, on the other hand, it is spent among 500+ days.

Put simply, it is a great game. Because of the massive amount of time between different plays, I sometimes was a bit sketchy on exactly what was going on. The story is fairly open ended, but is streamlined enough that it gets you back on track fairly often.

tldr; you should play it

EVERYTHING BELOW MAY CONTAIN SPOILERS, LOOK AWAY MORTAL!

I played as a chanter, pretty enjoyable class but really not too useful until later in the combat rounds. I imagine the most powerful team would be made up entirely of fighters. Chanters become good as soon as they are able to summon additional monsters, but this can take a while. I played with all the companions but I imagine the best grouping would be something like 4 fighters and 2 chanters. The fighters are there just to soak and deal damage, the chanters are there to summon ogres and fire everyone up. Anywho, it isn't too important, on the difficulty I played upon (normal), none of the fights are so bad that you need to do too much. Adra Dragon is only real challenge.

After finishing the game (and then reading the wiki stuff) I was surprised to discover I had completely missed the Pallegina Companion. I remember the interaction, I wonder how I was supposed to get her.

As per usual, I attempted to complete everything. I mean every quest. I believe I was almost completely successful except for Durance, who I could not couple therapy talk into sanity. I just couldn't find the dialog options to get him to open up, although evidently they were there. Because of this, he burned himself on a pire made of his own staff. I'll miss him, but by the gods (Magran in his case) he was an annoying ass.

Because I received every god's boon I also unleashed terrible suffering on the world when I failed to live up to my agreements with most of them. I did the hunters god's ending, returning the souls to make future generations stronger. I didn't feel bad about breaking my word to the Gods. Gods are the equivalent of large corporations in my mind, you just don't extend the same courtesy to them that you would to a human being. I feel as bad about defrauding or abusing a corporation/god as it would feel about doing the same to me. Not much.

I won't say that I was entertained at every moment in the game, but I can say that as a whole I enjoyed every larger segment of it. This was a masterly done game by very skilled and passionate people. Kudos.

To be more enjoyed, you really should play the game at a stronger (like an hour a night at least) pace. I think the most ideal way to play this game would be on the trans-siberian rail line. It would be awesome, look out the window and imagine your adventure when you need a break. See the local sites during the day. Evenings and nights progress 2-4 hours in game. Man that would be neat.

Finally, I will talk about the ending. I thought the pacing and plot changes at the end were the best part of this game. All through the story, you were seeing this Thaos guy and thinking him some fundamentalist worshiper of an out of favor goddess. At the end, it is revealed that he isn't fundamentalist, in fact, he is one of the few people who actually knows that the gods are a fabrication of man. He isn't empowering his god for her glory, he is doing so for the future of mankind. It was an interesting argument. Would humanity be better served believing in gods? Gods that give their life meaning and purpose? Or is it better to face the simple (though barren) dust to dust truth of existence? I have to say I was somewhat sympathetic to Thaos' cause. That is good writing. I wouldn't myself want to worship any god (real or false), but I feel that many peoples lives might be enriched if they had something more to believe in. Put in sci-fi terms, what if we could program AI's that could act as Gods to humanity, and then told humanity that they were real gods? Would the happiness and fulfillment that a great deal of humanity experiences from this be worth the lie? It is a good question. Ha, wouldn't that be a awesome sequel to PoE? turns out all "souls" are really just computational resources in some simulation. Gods are just assembled by putting together enough computation. I don't think it is going to happen, that would piss of so many fans.

Great Game.

Read More »

Even in the best of Families

July 10, 2015

I am in general a sci-fi guy. I would guess I read 70% sci-fi, 10% fantasy, 10% non-fiction, and 10% other. If you don’t count Sherlock Holmes, this is the first Mystery novel I have ever read.

What I really like about sci-fi is the ideas. I love when sci-fi gives me some new thought or viewpoint. I also think I probably enjoy sci-fi because of my desire for awe. Billions of stars, millions of aliens, a galaxy spanning civilization, those sort of things. So, given all this, what is there for me in the world of Mystery novels?

I guess there is cerebral pursuit. It is hard for me to tell. Can I really predict what is going to happen? Whodunit and how will it go down? Not really. In Science Fiction, you often don’t know what is going to happen because ANYTHING could happen. In mystery, the universe of possibilities is much more constrained, but it is still infinite. Does my ability to guess which of the 7 character is the murderer indicate my high deductive skill (as I would like to believe) or simply my familiarity with the author’s style? Mysteries have a reputation for being cerebral, but I don’t really think it is deserved. This isn’t to say that they are dumb, simply that I suspect your deductive skills have more to do with author/trope familiarity and less to do with actual reasoning.

I would like to know of any detective books where it is possible to deduce the resolution before the big reveal without ambiguity. Something that is airtight and closed in resolution. Maybe I have to go back and read things repeatedly, but if I hold it all in mind, and use my facts properly, I end up with the right answer.

Anyway, “Best of Families” was a pretty good book. I have no real basis of comparison, it kept me pretty entertained, the last 3rd of the novel was pretty interesting. I would recommend this book for a flight with a layover. I think it would probably be best consumed in a minimal number of sittings.

Read More »

The Martian

July 4, 2015

I told a friend I was reading this and he said this his friend described this book as “You know that scene from the Apollo 13 movie? Where they built a air filter out of duct tape? It is basically that scene repeated through an entire book.”

I thought that was funny, and it is a pretty good description of this book. Our intrepid martian is left behind and must use wit, will, and Watney in order to have any chance of a rescue.

I thought it was interesting that Watneys story was told with a “Captain’s log” mechanism, where he is narrating his survival for posterity. Foremost, because it is only a log, you are left in suspense about whether he will ultimately succeed or fail. Furthermore, because it is a log, it is his personal/intimate account; he is honestly not certain anyone will ever recover it. It allows him to be free to show self doubt or conflicting emotions. It feels more like a transcript of what happened and less like a packaged story, which I think was a desired effect. To contrast this, the events occurring simultaneously on Earth occurred with normal omniscient narration. It kind of gave the feeling that we were watching Watney at a great distance, only receiving his logs after they were occurring, while on earth things were happening in “real time.” Interesting.

I enjoyed the sciency stuff, but am not qualified enough to really critic it one way or the other. Having said that, it seems plausible based on my limited understandings. At least there was no unexplained magic.

Anyway, not too much to report here. I enjoyed it, you should read it, I hope the movie coming out soon will be good.

Read More »

Even in the Best of Families

Rex Stout
July 1, 2015
Even in the Best of Families cover

I am in general a sci-fi guy. I would guess I read 70% sci-fi, 10% fantasy, 10% non-fiction, and 10% other. If you don’t count Sherlock Holmes, this is the first Mystery novel I have ever read.

What I really like about sci-fi is the ideas. I love when sci-fi gives me some new thought or viewpoint. I also think I probably enjoy sci-fi because of my desire for awe. Billions of stars, millions of aliens, a galaxy spanning civilization, those sort of things. So, given all this, what is there for me in the world of Mystery novels?

I guess there is cerebral pursuit. It is hard for me to tell. Can I really predict what is going to happen? Whodunit and how will it go down? Not really. In Science Fiction, you often don’t know what is going to happen because ANYTHING could happen. In mystery, the universe of possibilities is much more constrained, but it is still infinite. Does my ability to guess which of the 7 character is the murderer indicate my high deductive skill (as I would like to believe) or simply my familiarity with the author’s style? Mysteries have a reputation for being cerebral, but I don’t really think it is deserved. This isn’t to say that they are dumb, simply that I suspect your deductive skills have more to do with author/trope familiarity and less to do with actual reasoning.

I would like to know of any detective books where it is possible to deduce the resolution before the big reveal without ambiguity. Something that is airtight and closed in resolution. Maybe I have to go back and read things repeatedly, but if I hold it all in mind, and use my facts properly, I end up with the right answer.

Anyway, “Best of Families” was a pretty good book. I have no real basis of comparison, it kept me pretty entertained, the last 3rd of the novel was pretty interesting. I would recommend this book for a flight with a layover. I think it would probably be best consumed in a minimal number of sittings.

Read More »

« Prev Next »

Copyright © 2026 Stephen Cagle

Powered by Cryogen | Free Website Template by Download Website Templates

×