Shanghai Building to be Demolished

Technology

June 23rd, 2016

In Technology

No Comments

Pagination with React / Relay / GraphQL

This is an awesome article:

Relay proposes a standard to define a has-many relationship for a GraphQL field. This standard defines a common structure that allows Relay to paginate and filter the results in an efficient way by using cursors, which I’ll explain in a bit.

This is the definition of a Relay connection (from the Relay connection specs):

Relay’s support for pagination relies on the GraphQL server exposing connections in a standardized way. In the query, the connection model provides a standard ...

Read More Source

June 15th, 2016

In Technology

No Comments

Demanding ssh key login to a server is safer than allowing passwords

This is good and true:

Require ssh key authentication

We tend to avoid passwords for logging into servers. There was a lot of discussion around this after Bryan’s original guide came out, but I tend to fall into this camp as well. Here are a few notes on this:

ssh keys are better than passwords only because they contain and require more information.

Passwords can be brute forced. Guessing a public key is so essentially impossible that they can be considered perfectly secure

What ...

Read More Source

June 14th, 2016

In Technology

No Comments

Object/Relational Mapping is rarely worth it

I think this can be stated simply: for your basic operations (CREATE, UPDATE, READ, DELETE) then an ORM offers some convenience. But ORMs break down as soon as you have a complex query. And yet, if you start using an ORM because it helps you with the simple queries, it will seem natural to you to extend it and try to use it for the complex queries.

This is a strained analogy to the Vietnam war:

Object systems are typically characterized ...

Read More Source

June 11th, 2016

In Technology

1 Comment

AWS is inappropriate for small startups because its complexity demands a specialist

Sean Hull references a conversation that he and I had in Slack. I would like to expand on the argument that I made then. You might want to read his essay first, where he makes these points about AWS:

1. Over 70 services offered

2. Still complex to build high availability

3. Need a dedicated devops

4. Orchestration involves many moving parts

5. Troubleshooting failed deployments is difficult

At the time of our conversation I had crashed an AWS instance and we were having trouble fixing ...

Read More Source

June 11th, 2016

In Technology

No Comments

GraphQL is the best thing about React / Relay / GraphQL

React / Relay / GraphQL:

The big breakthrough here is obviously GraphQL. Not React or Relay, since there are many competing implementations that do similar things, but GraphQL. Even though there are graph query languages out there (Gremlin, etc) they were not suited to querying JSON over the wire. GraphQL is ideal. For my next project, I hope to do a Clojure implementation of most of GraphQL, because I think it can be married to Om.Next in a very powerful way.

Actually, ...

Read More Source

June 10th, 2016

In Technology

No Comments

Krubner, you saved my day

Aw man, after all the mistakes I make, it is nice to know I help people sometimes:

Source

June 10th, 2016

In Technology

No Comments

Sometimes I make a bad decision

It’s very, very, very rare, almost unheard of, but sometimes I make a mistake.

I was helping at Open Road this spring. Sean Hull was also helping. Open Road runs a bunch of WordPress sites, such as The Line Up. All of the images for these sites were stored on a central NFS server. All of the machines were starving for hard disk space. The previous Director Of Technology had made many, many bad decisions, including the decision to save ...

Read More Source

June 7th, 2016

In Technology

No Comments

The Belief that Tests are Smarter than Code Telegraphs Latent Fear or a Bad Process

This part is really good:

Programmers have a tacit belief that they can think more clearly (or guess better) when writing tests when writing code, or that somehow there is more information in a test than in code. That is just formal nonsense. The psychological perspective is instructive here, and it’s important because that — rather than any computational property — most drives developer behaviour. If your coders have more lines of unit tests than of code, it probably means one of several things. They may be ...

Read More Source

June 7th, 2016

In Technology

No Comments

The problem with unit tests

Interesting:

Unit testing is of course not just an issue in object-oriented programming, but the combination of object-orientation, agile software development, and a rise in tools and computing power has made it de rigueur. As a consultant I often get questions about unit testing, including this real one from a recent client of mine, Richard Jacobs at Sogeti (Sogeti Nederland B.V.): My second question is about unit tests. If I remember correctly you said that unit tests are waste. First, I was surprised by that. Today however, my ...

Read More Source

June 6th, 2016

In Technology

No Comments

Ruby On Rails is obsolete

This is a strange conversation to be having in the year 2016. Ruby On Rails changed the technology industry in 2004, but it can not claim to be winning in 2016. It still lacks a story for concurrency. It is being undermined by 2 forces:

1.) the need for concurrency, which is offered by other eco-systems, such as those that run the JVM. A language like Clojure offers the high level of meta-programming that Rubyists love, but with the vast arsenal ...

Read More Source

June 2nd, 2016

In Technology

No Comments

Sometimes peer review delays progress for many decades

This is what real leadership looks like:

Morris intentionally consumes H. pylori. Like Marshall, he becomes ill, but unlike Marshall, he is not completely cured by antibiotics. The infection will remain with him for three years.

I wish he had been given a medal for his self-sacrifice. He was attempting to save millions from suffering.

Interesting, though very disappointing:

1881 Klebs notes the presence of bacteria-like organisms in the lumen of the gastric glands.

1889 Walery Jaworski describes spiral organisms in sediment washings ...

Read More Source

May 22nd, 2016

In Technology

No Comments

Why does Rails become awful?

Interesting:

Let me tell you a story about what can happen in a convoluted Rails codebase. Once, I joined an existing project. It was a huuuuge app which was running an on-line shopping community website. Complicated sales model, complicated promotions, complicated product setups, coupons, user groups, messages – it had it all. I joined them to help ship a few new features. One of my early tasks was to…add a link to something on some page. It took me few days ...

Read More Source

May 15th, 2016

In Technology

No Comments

The dumbest name for a good architecture is “serverless”

I strongly agree that the idea is good, but the name “serverless” is really stupid:

So… this is backend infrastructure (i.e. it runs on a server) to let your team deploy “severless” apps…

So they’re serverless. Except the server you’re running it on. And the lamba/style code they wrote and uploaded to it.

But serverless, because no ops staff required. Except the ones who installed and maintain this.

This is like a snake eating its own tail and wondering what hurts.

Edit: despite my sarcasm, ...

Read More Source

May 10th, 2016

In Technology

No Comments

The sad, slow way a system of cron scripts becomes ugly

Do you have a chore that needs to run in the background, maybe once a day, or once an hour? Cron scripts will save you! They are the most amazingly amazing thing God has invented since Adam and Eve! For sheer wonderfulality they have no equal among the products of mortal fallen flesh!

At least at first.

The simple cron script is wonderfully direct and efficient. But the first can lead to a second. The second can lead to a third. ...

Read More Source

April 10th, 2016

In Technology

No Comments

What do AWS services actually do?

I love this:

Data Pipeline Should have been called Amazon ETL

Glacier Should have been called Really slow Amazon S3

Kinesis Should have been called Amazon High Throughput It’s like Kafka

I have used this but I did not know the name:

Snowball Should have been called AWS Big Old Portable Storage Use this to Get a bunch of hard drives you can attach to your network to make getting large amounts (Terabytes of Data) into and out of AWS It’s like Shipping a Network Attached Storage device to AWS

These are useful names that actually describe what ...

Read More Source

March 27th, 2016

In Technology

No Comments

The fanaticism of “test driven development” is slowly fading

This was one of those trends that went too far and I’m glad to see people talking about reasonable limits:

If you’re part of the Ruby On Rails community for a long time, you’ve probably read tons of articles about testing Rails application (less these days, though). Although there always have been diverging opinions on the matter, it seems the common wisdom was to say that you had to test everything: models, controllers, views and full-stack tests. Oh, and you had ...

Read More Source

March 26th, 2016

In Technology

No Comments

RESTful APIs are dead, long live GraphQL

We can argue whether RESTful APIs ever existed, since very few ever implemented HATEOAS. Ruby On Rails claimed it offered RESTful APIs, but it never offered HATEOAS. After 10 years of failure, the world is looking for something new.

Interesting:

Imagine we have a simple application that fetches a list of stories, and some details about each one. Here’s how that might look in resource-oriented REST:

// Fetch the list of story IDs but not their details: rest.get('/stories').then(stories => // This ...
Read More Source

March 26th, 2016

In Technology

No Comments

Picking React isn’t a technology decision, it’s a business decision

Interesting:

The clear winner right now, is React. Components all the way down makes your application much easier to reason about. The learning curve is very flat. The important APIs would fit on one page. JSX is awesome. You get all the power of JavaScript and its tooling when writing your markup. It is the natural match for Flux and Redux (more on that later). The React community is amazing, and produced many best of breed tools such as Redux (also more on that later). Writing high ...

Read More Source

March 26th, 2016

In Technology

No Comments

Pay discrimination in tech

This sounds bad:

Women who write the software that runs on mainframe computers earn on average 72 cents per dollar earned by their male counterparts, according to research conducted by Glassdoor Inc., the online job information firm. That pay gap exists even after controlling for age, education, experience, job title, employer and location.

This suggests that the gap widens with age:

However, not all tech jobs pay men and women so differently. Among mobile developers, there is just a 2.9% gap between ...

Read More Source

March 26th, 2016

In Technology

No Comments

Left-Pad as a service

Everyone is laughing over this. An 11 line function as its own NPM module? I am unsure how I feel. The trend has been to smaller and smaller pieces of functionality. I don’t find this outrageous. Still, the parody is funny:

c4n4rd is game:

This is really exciting!!! I was a bit disappointed that the right-pad will be out only in 2017. I am looking forward to that release because there is a high demand for it now.

What kind of ...

Read More Source

March 26th, 2016

In Technology

No Comments

null

Testing WordPress to see if a title of “Null” works.

Source

March 18th, 2016

In Technology

No Comments

The end of the test-first mania

It worries me that the tech industry is driven by such intense manias, which have cost me several jobs. For a long time you were not allowed to question Object Oriented Programming. I still go to job interviews and I’m asked the basics of Object Oriented Programming, and it is clear I have to say nice things about Object Oriented Programming or I won’t get the job. Thankfully none of these people ever check Wikipedia, where I am cited as ...

Read More Source

March 17th, 2016

In Technology

No Comments

Onyx tested by Jespen is genius tested by genius

Good lord, this makes me happy. I think Michael Drogalis is a very smart guy and everyone knows that Kyle Kingsbury is a very, very smart guy. Kingsbury’s work on Jespen is the finest work that anyone has ever done on the problems of distributed data. Onyx is exciting as an a Clojure answer to Apache Storm. Sad to say, Storm is written in Scala. The idea of testing Onxy with Jespen is one of the finest ideas ...

Read More Source

March 14th, 2016

In Technology

No Comments

Unix processes have gotten bigger and slower over the years

Interesting:

The obvious question thus is: Why state machines? Why not processes or threads?

And the obvious answer is: Performance.

When UNIX was still young, scheduling was supposed to be done by the OS on per-process basis. When implementing a network server, for example, you were supposed to fork a new instance of the process for each TCP connection and rely on the OS scheduler to switch between the processes.

I guess it made sense from performance point of view back then. All ...

Read More Source

March 10th, 2016

In Technology

No Comments

Jakub Holý on copying :pre and :post conditions

Obviously I have read this article before (I offered response and was quoted before) but I’ve gone back to read it again and this jumped out at me:

Do you repeat the same checks again and again? Then you could either copy them using with-meta (they end-up in metadata anyway) or reuse the explicitly:

(defn with-valid-car [f] (fn [car] {:pre [:make :model :year]} (f car))) (def count-price (with-valid-car (fn [car] (do-something car)))) ;; or make & use a macro to make it nicer

That ...

Read More Source

February 15th, 2016

In Technology

No Comments

Sick politics is the driving force of useless ceremony

This is part 7 of a 12 part series:

1.) Quincy’s Restaurant, a parable about concurrency

2.) Why I hate all articles about design patterns

3.) Clojure has mutable state

4.) Immutability changes everything

5.) Mutable iterators are the work of the Devil

6.) Get rid of all Dependency Injection

7.) Sick politics is the driving force of useless ceremony

8.) Functional programming is not the same as static data-type checking

Interlude

9.) Inheritance has nothing to do with Objects

10.) Is there a syntax for immutability?

11.) Immutability enables concurrency

12.) Quincy’s ...

Read More Source

February 13th, 2016

In Technology

No Comments

Immutability changes everything

(Acknowledgements:

I offer a huge “Thank you” to Natalie Sidner for the tremendous editing she did on the rough draft of this post. To the extent that this article is readable, it is thanks to her. Any mistakes are entirely my fault, and I probably added them after she was done editing. If you need to hire a good editor, contact Natalie Sidner at “nataliesidner at gmail dot com”.

Also, I thank Blanche Krubner for reviewing this work. As Mrs Krubner studied ...

Read More Source

February 13th, 2016

In Technology

No Comments

Functional programming is not the same as static data-type checking

(Note: Leah McCloskey is a brilliant illustrator who brings warmth and humor to every graphic she creates. She is also head of design at Haystack.im. Save for those rights which she specifically granted to me, she reserves all rights on these images, so if you wish to re-use them, then you must contact her directly at leah @ dendritecorp.com. I am grateful that she found the time to work on this project. View her portfolio!)

This is part 8 of a ...

Read More Source

February 10th, 2016

In Technology

No Comments

Interlude

I am mostly done writing the second half of this series, however, it needs to be edited, some code needs to be written, all of the code needs to be checked, and I need to work with Leah McCloskey to develop further cartoons for illustrating the points made in this series. Also, I have a full time job. So it will likely be 2 or 3 months before I can publish the second half of this series.

The series is ...

Read More Source

February 10th, 2016

In Technology

No Comments

Get rid of all Dependency Injection

This is part 6 of a 12 part series:

1.) Quincy’s Restaurant, a parable about concurrency

2.) Why I hate all articles about design patterns

3.) Clojure has mutable state

4.) Immutability changes everything

5.) Mutable iterators are the work of the Devil

6.) Get rid of all Dependency Injection

7.) Sick politics is the driving force of useless ceremony

8.) Functional programming is not the same as static data-type checking

Interlude

9.) Inheritance has nothing to do with objects

10.) Is there a syntax for immutability?

11.) Immutability enables concurrency

12.) Quincy’s ...

Read More Source

February 10th, 2016

In Technology

No Comments

Mutable iterators are the work of the Devil

This is part 5 of a 12 part series:

1.) Quincy’s Restaurant, a parable about concurrency

2.) Why I hate all articles about design patterns

3.) Clojure has mutable state

4.) Immutability changes everything

5.) Mutable iterators are the work of the Devil

6.) Get rid of all Dependency Injection

7.) Sick politics is the driving force of useless ceremony

8.) Functional programming is not the same as static data-type checking

Interlude

9.) Inheritance has nothing to do with objects

10.) Is there a syntax for immutability?

11.) Immutability enables concurrency

12.) Quincy’s ...

Read More Source

February 10th, 2016

In Technology

No Comments

Clojure has mutable state

Warning: This post is an intro to mutable state in Clojure. If you already know Clojure, you can skip this. If you have no interest in learning Clojure, you can skip this.

This is part 3 of a 12 part series:

1.) Quincy’s Restaurant, a parable about concurrency

2.) Why I hate all articles about design patterns

3.) Clojure has mutable state

4.) Immutability changes everything

5.) Mutable iterators are the work of the Devil

6.) Get rid of all Dependency Injection

7.) Sick politics is the ...

Read More Source

February 10th, 2016

In Technology

No Comments

Why I hate all articles about design patterns

Warning: This article merely describes what I hope to achieve with this series. There is no software code in this article. Those who wish to stay focused on those articles that are focused on code should skip this article. Since I am here describing my personal motivations for writing, this article is necessarily the most self-indulgent of the articles in this series.

This is part 2 of a 12 part series:

1.) Quincy’s Restaurant, a parable about concurrency

2.) Why I hate ...

Read More Source

February 10th, 2016

In Technology

No Comments

A parable about concurrency (demonstrated with comical cartoons)

(Note: Leah McCloskey is a brilliant illustrator who brings warmth and humor to every graphic she creates. She is also head of design at Haystack.im. Save for those rights which she specifically granted to me, she reserves all rights on these images, so if you wish to re-use them, then you must contact her directly at leah @ dendritecorp.com. I am grateful that she found the time to work on this project. View her portfolio!)

This is part 1 of a ...

Read More Source

February 9th, 2016

In Technology

No Comments

Why does Erlang allow so many processes to crash and how does promote reliability?

Why does Erlang encourage crashes?

Back-burning and controlled burns are a real world example of fighting fire with fire. In Saguenay–Lac-Saint-Jean, the region I come from, blueberry fields are routinely burnt down in a controlled manner to help encourage and renew their growth. To prevent forest fires, it is fairly frequent to see unhealthy parts of a forest cleaned up with fire, so that it can be done under proper supervision and control. The main objective there is to remove ...

Read More Source

February 6th, 2016

In Technology

No Comments

Hindley-Milner and the lambda calculus

A nice attempt to explain the crazy syntax of the math that formalizes the idea that the type of an expression can be deduced from the expression itself:

Okay, so we want to talk about expressions. Arbitrary expressions. In an arbitrary language. And we want to talk about inferring types of these expressions. And we want to figure out rules for how we can infer types. And then we’re going to want to make an algorithm that uses these rules to ...

Read More Source

February 3rd, 2016

In Technology

No Comments

Beware of Ruby libraries that generate way too many objects

This is several years old and Ruby garbage collection has gotten better, but still, the point about certain libraries being excessive remains valid.

Be aware that you are allocating objects, for instance something as simple as 100.times{ ‘foo’ } allocates 100 string objects (strings are mutable and therefore each version requires its own memory allocation).

Make sure to evaluate the libraries you use, for instance switching a Sinatra XML rendering action from Builder to Nokogiri XML Builder saved us about ...

Read More Source

February 3rd, 2016

In Technology

No Comments

Pat Shaughnessy dissects how much work Ruby has to do to give you a string

Easy is difficult, and this is a great look at how much work Ruby has to do so that you, the software developer, can change your mind about what kind of string you want:

The standard and most common way for Ruby to save string data is in the “heap.” The heap is a core concept of the C language: it’s a large pool of memory that C programmers can allocate from and use via a call to the malloc ...

Read More Source

February 3rd, 2016

In Technology

No Comments

Software development is a complex system of multiple poorly understood feedback loops and interactions

I wouldn’t use exactly the same words that this article uses, but I agree with the gist of this part, especially where small, fast-moving startups are involved :

Finely grained management of software developers is compelling to a business. Any organization craves control. We want to know what we are getting in return for those expensive developer salaries. We want to be able to accurately estimate the time taken to deliver a system in order to do an effective cost-benefit analysis ...

Read More Source

February 2nd, 2016

In Technology

No Comments

Leonardo Borges’s Imminent for futures and promises

Very interesting:

For the impatient, I’ve included a couple of examples below. I’ve chosen to translate the examples presented by Ben Christensen – of RxJava – in this gist. Albeit them being in Java, they highlight perfectly the problem with blocking futures. Here’s their Clojure equivalent:

;; ;; Example 1, 2 & 3 are handled by the approach below ;; Original examples: https://gist.github.com/benjchristensen/4671081#file-futuresb-java-L13 ;;

(defn example-1 [] (let [f1 (remote-service-a) f2 ...
Read More Source

February 2nd, 2016

In Technology

No Comments

Why the tech community rejected XML

Interesting:

Java was a very limited language, and it was extremely verbose. There were type declarations and coersions everywhere. Almost all looping was managed with for loops (there were no higher order functions, and recursion wasn’t tail cail optimized… also there was no loop-recur macro…).

So XML wasn’t just there to be data, it was also code.

Everyone wrote little mini-languages into XML, because some things were so damn painful to express in Java that it was easier to just implement ...

Read More Source

February 2nd, 2016

In Technology

No Comments

Clojure community problems

Interesting:

What an amazing language. Relatively frequent, consistently stable releases. A pleasure to use. A friendly, smart community. I feel very lucky to be a Clojure user! Thank you for all of your hard work.

The Clojure contrib process frustrates me more than any technical or community aspect of the language.

Clojure gets a lot right, but as has been repeatedly discussed the pace of evolution and the maintainership’s dim view of 3rd party non-bugfix work flatly leads to worthy but minor ...

Read More Source

January 31st, 2016

In Technology

No Comments

We want loose-coupling and high cohesion

This seems like a great rule of thumb for microservices:

“We want to avoid dumb, anemic services that are little more than CRUD wrappers”

But it doesn’t cover the old territory which, if you were using Ruby or PHP, you would cover with a cron script. I suppose all the cron scripts must become functions that live inside the “service” which deals with a given part of the datastore. But that is not how my friends talk about “microservices”.

Page 58, ...

Read More Source

January 31st, 2016

In Technology

No Comments

A message hospital (or dead letter queue), where messages got sent if they failed

I like this book very much. I also like the idea of a “message hospital”.

Page 57, Building Microservices, Sam Newman:

Time for a cautionary tale. Back in 2006, I was working on building a pricing system for a bank. We would look at market events, and work out which items in a portfolio needed to be repriced. Once we determined the list of things to work through, we put these all onto a message queue. We were making use of a ...

Read More Source

January 31st, 2016

In Technology

No Comments

Jon Williams, Fractional CTO: Include business teams in the Agile process

Jon Williams offers a smart idea about getting the business people and the tech team to share as much information as possible, and even have the business people join the scum sessions.

The best implementation of the Agile process that I ever participated in was at ShermansTravel.com, back in 2011/2012. We had fairly good communication between the tech team and the folks running the actual parts of the business: editorial, advertising, marketing and more. A lot of the success of ...

Read More Source

January 31st, 2016

In Technology

No Comments

Joe Armstrong figured out the right way to do everything, and nobody cared

I am puzzled why good ideas so rarely win out in the tech world. I do know the old saying “Most industries have a top player with the best marketing and the second best technology, with a second place player that has the best technology and mediocre marketing.” Back in the 1990s it was common to apply that slogan to Microsoft and Apple (when Apple had mediocre marketing! Such long forgotten days!).

Still, the lack of innovation in this industry ...

Read More Source

January 30th, 2016

In Technology

No Comments

When technology goes on strike

Interesting:

Amazing but true When I’d finished this article, I wanted to spell check the content. emacs-ispell mode decided to go on strike. It could not find aspell, the program that I use for spelling checking.

My emacs spell checker has worked faithfully on this machine for several years. And just when I complain that I spend half my life fixing things that shouldn’t be broken the emacs spell checker decides to break.

I don’t believe in malicious Gods, nor that the laws ...

Read More Source

January 24th, 2016

In Technology

No Comments

Groping in the dark as a method to discover module boundaries in microservices

I’m not sure that we will ever have a better way (but then, we can never pretend to be like other types of engineers, can we?):

Having clients talk to the application service instead of an ORM or the data backends directly lets you forget that there is a MASSIVE PROBLEM with ORM frameworks (for anything more interesting than, say, a blog website framework), because you will still have to write a translation between your application representation and the database representation. ...

Read More Source

January 24th, 2016

In Technology

No Comments

Why I love Erlang

And why I dislike Scala. I would bet that Scala was designed in the opposite fashion:

Everything was very problem oriented and we did not have as goals that Erlang should be a functional language or that we should implement the actor model. We knew nothing of the actor model until later when we heard that Erlang implements it. :-) …

Again our goal was to solve the problem, not design a language with a predefined set of primitives.

Source

January 22nd, 2016

In Technology

No Comments

HTML is the failed GUI for TCP/IP

I posted this to Hacker News. I was surprised that someone did not immediately understand what I meant when I referred to HTML as the GUI of TCP/IP. Someone had surveyed 80 frontend designers and found they lacked basic knowledge of HTML and CSS. I responded:

The contrarian argument is that this signifies an important truth, that HTML never worked the way it was suppose to. In the same way that we might argue that a misunderstood product is the fault ...

Read More Source

January 20th, 2016

In Technology

No Comments

An Amazon DSL in Clojure

Good lord. This is an impressive list of supported Amazon APIs:

Api Gateway Autoscaling CloudFormation CloudFront CloudSearch CloudSearchV2 CloudWatch CodeCommit CodeDeploy CodePipeline Config DataPipeline DeviceFarm DirectConnect Directory DynamoDBV2 EC2 EC2 Container Registry ECS ElastiCache ElasticBeanstalk ElasticFileSystem ElasticLoadBalancing ElasticMapReduce ElasticTranscoder Glacier IdentityManagement Kinesis KinesisFirehose KMS Logs Lambda MachineLearning OpsWorks RDS Redshift Route53 S3 SimpleDB SimpleEmail SimpleWorkflow SNS SQS StorageGateway

Source

January 20th, 2016

In Technology

No Comments

A 3D DSL in Clojure

Very interesting, and a nice example of how much Clojure allows the creation of new languages:

My first step in the HOLO design process was the creation of a sufficiently flexible GP playground for my later experiments and to evolve path-finding agents to create a (typographic) form as an initial design idea. Related to this, though a year prior, I created the Mophogen DSL, partially done as a component of my commission for the Barbican / Google DevArt exhibition. Morphogen ...

Read More Source

January 16th, 2016

In Technology

No Comments

Microservices first

Stefan Tilkov adds clarity to an argument that I’ve been making since 2013:

If you are actually able to build a well-structured monolith, you probably don’t need microservices in the first place. Which is OK! I definitely agree with Martin: You shouldn’t introduce the complexity of additional distribution into your system if you don’t have a very good reason for doing so.

(So what would be a good reason? There are many, but to me the most important one is to ...

Read More Source

January 16th, 2016

In Business, Technology

No Comments

I give good tech advice to startups, and different good advice to Enterprises

I had a job interview recently that went well. But then, the CTO read something that I had written a year and a half ago.

Then the CTO said to me “We can’t hire you. We are a tiny startup. We are facing some serious deadlines. We need to push a product out the door.”

I said, “I want to help you push a product out the door. I can work hard and help you guys move fast.”

He said, ...

Read More Source

January 16th, 2016

In Technology

No Comments

The cost of using patterns is that I have to give up the illusion that I am infinitely creative

This is true of all creative fields:

The cost of using patterns is that I have to give up the illusion that I am infinitely creative. I don’t invent a new programming language with optimizing compiler and novel operating system and complete programming environment for every line of code. To make best use of my three billion seconds, I should ignore most of my options and focus on a few degrees of freedom that really matter right now.

Source

January 16th, 2016

In Technology

No Comments

Paralyzed by too much thinking

I like this:

When I started programming again, I vowed not to type a single character unless I knew what pattern I was applying as I did so. The result was incredibly frustrating. I want a class called “Stack”, but why “Stack” and not something else. Then I would go and write the patterns for naming classes and then I could type “Stack”. Then I would want to make its first method public, but why public?

At first, it was like ...

Read More Source

January 14th, 2016

In Technology

No Comments

The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise

Interesting

What is the black king in chess? This is a strange question, and the most satisfactory way to deal with it seems to be to sidestep it slightly. What more can one do than point to a chessboard and explain the rules of the game, perhaps paying particular attention to the black king as one does so? What matters about the black king is not its existence, or its intrinsic nature, but the role that it plays in the game.

The ...

Read More Source

January 13th, 2016

In Technology

No Comments

Invoxia will allow Alexa to figure out who is speaking

I will be pleased if this becomes more than vaporware:

Invoxia, one of the recipients of an Alexa Fund investment from Amazon last September, announced this week at CES that it’s the first third-party hardware maker to incorporate all the power of Alexa into a product other than the Echo. The company’s Triby, as it’s called, is a colorful, magnet-backed Bluetooth speaker resembling an old-school radio. It’s designed to let family members, including young children, make internet-based phone calls with ...

Read More Source

January 7th, 2016

In Technology

No Comments

CQRS Read Models

Interesting:

We’ve been using this mechanism with great success during development. It let us freely modify the schema by only changing the Java classes and never worrying about table definitions. Thanks to combination with CQRS, we could even maintain long-running demo or pilot customer instances. Data has always been safe in the event store. We could develop the read model schema incrementally and have the changes automatically deployed to a running instance, without data loss or manually writing SQL migration scripts.

Obviously ...

Read More Source

January 6th, 2016

In Technology

No Comments

No one realizes that there is an app store for the Amazon Echo?

More from Jose Jaquinta:

I ran into some people during various New Year’s parties who had Echos, but had no clue there were skills for them. I laboriously explained how to launch the companion app, find the skills tab, and enable the skill.

It would a lot simpler if a user could enable/disable skills without having to go through the companion app. For example:

Alexa, enable Demotivate Me

I realize this is a request for The Echo, and not the Alexa Skills Kit. However, ...

Read More Source

January 6th, 2016

In Technology

No Comments

The Amazon Alexa certification process has gone out of control

This is sadly accurate:

The certification process has gone out of control.

This is one example of the… I’m struggling to keep to professional language… questionable judgement… show by the certification team. I’ve had two skills come back with a similar objection. I want to ask them if they have even used Alexa regularly? It gets REALLY tedious to have it endlessly repeat things. It’s like, “Yes, I know what I can do next. Please let me get on with ...

Read More Source

January 1st, 2016

In Technology

No Comments

Mark Lee Smith fights functional programming in 2011

I find it interesting to go back and look at the sites where was learning about Functional Programming back in 2011.

It’s interesting to read those who were on the losing side of history, fighting against Functional Programming:

If you’re writing 2000-line classes and 500-line methods then you’re in no way qualified to be speaking about object-oriented programming, let alone comparing it with the latest FAD ideology.

Christian Toivola gave what has become the standard answer:

@Mark Lee Smith: With the ...

Read More Source

January 1st, 2016

In Technology

No Comments

When did the Internet start?

Interesting:

TCP version 1 was designed in 1973. This was documented through RFC 675. TCP version 2 was documented in March 1977. In August 1977, Jon Postel realized they were going the wrong direction with the protocol. “We are screwing up in our design of internet protocols by violating the principle of layering. Specifically we are trying to use TCP to do two things: serve as a host level end to end protocol, and to serve as an internet packaging and ...

Read More Source

December 31st, 2015

In Technology

No Comments

We are contemplating allowing sender and receiver to specify different byte sizes

Wow. Can you imagine how that would have turned out? On the bright side, Unicode would not be necessary, since a company in China could specify a byte size large enough to represent any Chinese characters, and likewise for Iran, Korea, Hindi, etc. .

Source

December 31st, 2015

In Technology

No Comments

NLP versus Conversational AI

Obviously, I have written a lot about this subject during the year. See my post “What happens when the Board Of Directors begins to panic“.

But this is getting big:

To date, commercial NLP research has been focused on understanding the many ways people say commands like, “Set my alarm for 7 am tomorrow” or “Find a good pizza place nearby.” To unlock the power of conversational computing, new technology is required that extracts semantics across multi-turn natural language ...

Read More Source

December 31st, 2015

In Technology

No Comments

Allowing an object to exist in an invalid state is an Anti-Pattern

This post uses the language of Object Oriented Programming, but its point would also be true to all forms of programming. In Clojure, if you have HashMaps that you then convert to JSON and save to MongoDB, then why would you ever allow the HashMap to exist in an invalid state? Real immutability might imply that the HashMap is created with everything that it will eventually need. This is an interesting idea.

Why do we validate data? Typically, to make ...

Read More Source

December 31st, 2015

In Technology

No Comments

Websockets are an all or nothing proposition

Interesting:

I’m also a heavy websocket user, and agree with most points. I have previously used websockets on top of a traditional web app, and have been disappointed with the results.

My opinion now is that websockets are an all-or-nothing proposition. And I have gone all-in. My latest project has:

- websockets-only api (except a some image uploads and oauth/login)

- https-only

- single page app, central store with observable data, using a single connection servicing the whole application

- using SignalR (supports fallbacks for IE9 ...

Read More Source

December 31st, 2015

In Technology

No Comments

Any growing Rails app runs into the problem of fat models

This is a good comment:

A lot of things in Rails are are anti-patterns in large code bases, but pragmatic in small ones. ActiveRecord itself is a prime example: when you start an app, putting your business logic directly in ActiveRecord objects works pretty well in most cases, but later on as the models proliferate and grow, you realize that some of them contain business logic which is far too complex to warrant being conflated with persistence concerns. The result ...

Read More Source

December 18th, 2015

In Technology

No Comments

How to find a major security breach at Facebook

Facebook offers a bounty for bugs, but Facebook did not play fair on this one. Instead, Facebook immediately reached out to the hacker’s employer and accused the hacker of unethical behavior. The Facebook CSO later offered the cheap excuse that the hacker might have been working in an official capacity for the employer. The more likely story is that Facebook was embarrassed and wanted this story to be remain hidden. Interesting:

With the newly obtained AWS key, I browsed several ...

Read More Source

December 17th, 2015

In Technology

No Comments

How to test the Salesvoice skill for the Amazon Echo

1.) if you have access to a Salesforce account, use that. If there is an admin at your company who manages the Salesforce account, talk to them. Otherwise, you can sign up for a free 30 day trial on Salesforce. Be sure to go for the Enterprise Edition.

2.) You must enable the SalesVoice Connected App

3.) Relax IP restrictions, or whitelist the IP from which your Amazon Echo will be in use

4.) You will need to enter 4 pieces of ...

Read More Source

December 15th, 2015

In Technology

No Comments

The importance of the Module class to NodeJs

Interesting:

The Module type found in module.js has two main roles inside of Node.js. First, it provides a foundation for all Node.js modules to build off of. Each file is given a new instance of this base module on load, which persists even after the file has run. This is why we are able attach properties to module.exports and return them later as needed.

The module’s second big job is to handle Node’s module loading mechanism. The stand-alone require function that we ...

Read More Source

December 15th, 2015

In Technology

No Comments

Require and Export in NodeJs

Interesting:

Finally, the last thing to consider is what happens when you directly export a function:

var powerLevel = function(level) { return level > 9000 ? “it’s over 9000!!!” : level; }; module.exports = powerLevel;

When you require the above file, the returned value is the actual function. This means that you can do:

require(‘./powerlevel’)(9050);

Which is really just a condensed version of:

var powerLevel = require(‘./powerlevel’) powerLevel(9050);

Source

December 14th, 2015

In Technology

No Comments

How to build conversations via the Amazon Echo

If you read my post about the startup I was this year, then you know the toughest challenge we faced was the building the finite state machine that could handle conversations. So I read this about the Amazon Echo with great interest:

My task would have ended here if creating an event would only require a date and time. But to be useful, I would like to include a duration, a topic, perhaps even a location. To be even more ...

Read More Source

December 13th, 2015

In Technology

No Comments

Using a glottal stop to force the Amazon Echo to correctly pronounce “tw”

This an impressive bit of phoneme hacking, by Joseph Jaquinta:

It’s also occasionally off on some words. A particular problem for me was Alexa’s inability to correctly pronounce “tweets”. It can say “tweet” just fine, but “tweets” comes out as “wheets”. Since one of upcoming skills, Tweet Poll, centers around producing election statistics based on tweets, it uses the word “tweets” a lot.

So I was pretty excited when I saw that the new update included features for giving more fine control ...

Read More Source

December 13th, 2015

In Technology

No Comments

Dialogue designers replace graphic designers when creating voice interfaces

Over the last 30 years we’ve gotten used to the Graphical User Interfaces in software that appears on a computer screen. And most of us (who work in the tech industry) have had the experience of working with a person who, depending on their skills, will be given a title such as “graphic designer” or “user experience designer” or sometimes “product designer”.

Working with the Amazon Echo, myself and my partner have come to realize that we still need a ...

Read More Source

December 13th, 2015

In Technology

No Comments

How can I connect the Amazon Echo to wifi in an Enterprise with secure wifi?

I posted this question on the TalkEcho forum. Any suggestions are welcome.

One big problem we face (developing Enterprise apps for the Amazon Echo) is when we do a demo at a large company. Then we are typically facing the WPA2 Enterprise version of WiFi, which the Echo does not seem to support. When I look here:

https://www.amazon.com/gp/help/customer/display.html?nodeId=201549640

I see it says:

“Amazon Echo connects to dual-band Wi-Fi (2.4Ghz / 5Ghz) networks that use the 802.11 a/b/g/n standard. It does ...

Read More Source

December 13th, 2015

In Technology

No Comments

The old debates about Clojure

This was written in 2009 and I linked to it in 2011, and I just stumbled upon it again. It is interesting to remember the old fights about Clojure, the struggle for respectability that Clojure faced in those old days. For the most part, that particular fight is no longer facing Clojure.

Source

December 12th, 2015

In Technology

No Comments

The Amazon Echo Blogosphere

I will be updating this blog post as time goes by. I hope to build a complete catalog of blogs that are primarily focused on the Amazon Echo.

Here is what I found after 30 minutes of searching:

LoveMyEcho is one of the few blogs that seems devoted to the Amazon Echo

Joseph Jaquinta has a blog on LinkedIn devoted to the Amazon Echo

Engadget has a category for Amazon that sometimes covers the Echo

Gizmodo has a category specifically for the ...

Read More Source

December 12th, 2015

In Technology

No Comments

Custom commands for the Amazon Echo

Interesting:

Telling Amazon’s Alexa to play some music or add an item to your shopping list is pretty cool, but there comes a point where you start to feel the limits of the Echo’s pre-programmed voice commands. It doesn’t have to be that way anymore: Amazon and the automation wizards at IFTTT just announced a new feature that allows you to create custom voice phrases to make Alexa do whatever you want. Unfortunately, there’s a catch: every command has to ...

Read More Source

December 12th, 2015

In Technology

No Comments

Ellery Coffman demonstrates home automation via Alexa

Ellery Coffman gets Alexa to start a movie on the TV, then stop it, and then play an album on the record player, and then stop it. This is impressive in all ways, except I was surprised at how slow it was. I’ve got an Alexa app running on a Rackspace server, which pulls data from Salesforce, and the response is much faster, despite the fact that there are 2 API calls involved, and despite the fact that Salesforce ...

Read More Source

December 4th, 2015

In Technology

No Comments

The advantages of a Natural Language Processing interface

“admin” of Daily Hacker News is critical of my ideas regarding a Natural Language Processing interface for software. Some of their points conflate Natural Language Processing with the text version of Natural Language Processing, and right now I’m mostly working on Natural Language Processing via voice interfaces, so I’m going to reply with voice examples, so as to remind everyone that Natural Language Processing is a broad topic.

“admin” starts with this point:

Let’s go back to Lawrence’s example. Posit, ...

Read More Source

December 2nd, 2015

In Technology

No Comments

People want to be able to talk to their computer

When GUI interfaces were new in the 80s we were told they were better than command line interfaces because they offered “discoverability”. But it turned out they didn’t offer nearly enough discoverability, so in the 90s “Wizards” became big things, especially in the Microsoft world. A Wizard provided the context that a GUI by itself did not. A Wizard would tell a user “Do this, now do this, now do this, and then do this.” But Wizards were visually complex. ...

Read More Source

December 2nd, 2015

In Technology

No Comments

Clojure is easier than Scala

Interesting:

After about a week of experimentation, we hit a sticking point. While we had a large number of “normal” CRUD operations, all of our queries on behalf of the end user, were generated dynamically. Most of the Scala database ecosystem is geared towards extending Scala’s type system to include database query type checking. Overall, our enthusiasm for Scala didn’t survive the first attempt to port our query language system. Clojure for the win

It was at this juncture where we re-evaluated Clojure, ...

Read More Source

November 28th, 2015

In Technology

No Comments

Christine Dodrill on the Universal Design

She has her own terminology:

State – What is true now? What was true? What happened in the past? What is the persistent view of the world?

Events – What is being changed? How will it be routed?

Policy – Can a given event be promoted into a series of actions?

Actions – What is the outcome of the policy?

Mechanism – How should an event be taken in and an action put out?

Policy seems a bit confusing, but sometimes there is a reward if ...

Read More Source

November 28th, 2015

In Technology

No Comments

Separate AWS accounts for development, staging, and production

Interesting:

Instead of using regions or tags to separate different staging and prod instances, we switched over totally separate AWS accounts. We need to ensure that our provisioning scripts wouldn’t affect our currently running services, and using fresh accounts meant that we had a blank slate to start with.

The ops account serves as the jump point and centralized login. Everyone in the organization can have a IAM account for it.

The other environments have a set of IAM roles to switch ...

Read More Source

November 28th, 2015

In Technology

No Comments

I am one voice of many, who question Object Oriented Programming

I am just one of many voices questioning Object Oriented Programming and promoting the Functional paradigm as an alternative. I pleased to think my big essay, which surveyed quite a bit of what had been written before, is still able to occasionally encourage people to re-think their support for Object Oriented Programming. So I see Matt’s Code Cave write:

Why functional programming and why Clojure? I’ve been interested in the idea behind functional programming for a while now – being used ...

Read More Source

November 21st, 2015

In Technology

No Comments

The States and Fates of Javascript

Interesting resource regarding Javascript Promises:

States

Promises have three possible mutually exclusive states: fulfilled, rejected, and pending.

A promise is fulfilled if promise.then(f) will call f “as soon as possible.”

A promise is rejected if promise.then(undefined, r) will call r “as soon as possible.”

A promise is pending if it is neither fulfilled nor rejected.

We say that a promise is settled if it is not pending, i.e. if it is either fulfilled or rejected. Being settled is not a state, just a linguistic convenience.

Source

November 21st, 2015

In Technology

No Comments

Why modern Javascript development sucks

The package management tools are broken:

Source

November 21st, 2015

In Technology

No Comments

How do you get latitude with Javascript

Here is something I did not know about:

$cordovaGeolocation.getCurrentPosition always returning “Position retrieval timed out.” in ios

That’s an error, but it made me aware that you can try to get location via Javascript. I think that is amazing. Why even bother with a native app? And I say that as someone who just spent 6 months at a starup that was committed to doing a native app, in part for native features, including the ability to get latitude and longitude.

Source

November 20th, 2015

In Technology

No Comments

Trailblazer has good ideas hidden by Object Oriented Programming

Trailblazer for Ruby On Rails has some very good ideas in it though they are somewhat buried by the Object Oriented programming garbage:

To give an example of how operation works, let’s say you click on a delete button. What happens when you do that is you go to the control that knows a little bit of this action because it does authentication—if it’s valid it does one thing and if it’s not it does another thing. Instead of delegating ...

Read More Source

November 19th, 2015

In Technology

No Comments

Nested relations are the death of Object Oriented Programming

Last winter made fun of a Python team for wasting time trying to figure out how to handle deeply nested relations. They were slowly groping their way toward a graph database solution, which seems to be the route that most end up taking, given enough years and enough pain. This seems to be an area where Object Oriented Programming clearly fails.

And yet, many smart folk continue to try. Ruby’s Reform:

Syncing Back

After validation, you have two choices: either ...

Read More Source

November 19th, 2015

In Technology

No Comments

Rails derails

A super interesting debate about the move away from Rails.

We seem to be on the same side when it comes to quality metrics.

Source

October 10th, 2015

In Technology

No Comments

A Java Hashmap is not a Clojure collection

I did not know this till just now. I have a co-worker who wrote a library in Java. From my Clojure code, I call this Java function:

public HashMap<String,HashMap<String,Integer>> init(String debrief,String companyName, ArrayList<String> contacts, ArrayList<String> accounts, ArrayList<String> requiredFields) { try { return transformer.transform(debrief, companyName, tecClassifier, rollioClassifier, caseClassifier, caselessClassifier, customClassifier, pipeline, parser, props, firstNames, lastNames, accounts, contacts, requiredFields); ...
Read More Source

October 10th, 2015

In Technology

No Comments

The TCP checksum is weak, and the Ethernet checksum will accept corrupt TCP that passed the TCP checksum

Interesting:

At Twitter, a team had a unusual failure where corrupt data ended up in memcache. The root cause appears to have been a switch that was corrupting packets. Most packets were being dropped and the throughput was much lower than normal, but some were still making it through. The hypothesis is that occasionally the corrupt packets had valid TCP and Ethernet checksums. One “lucky” packet stored corrupt data in memcache. Even after the switch was replaced, the errors continued until ...

Read More Source

October 10th, 2015

In Technology

No Comments

When is computer programming easy?

Interesting:

While it is often thought that “real” programmers like real programming environments (my husband, for instance, is perfectly happy in MF Assembler, which is pretty grim), most programmers seem to become pretty happy moving up to graphical user interfaces and visual environments where they choose from a list of “correct” choices. I don’t think it is only users that can be more productive when they are better supported.

I believe there is a direct relationship between the ease of use of ...

Read More Source

October 6th, 2015

In Technology

No Comments

How easy is it to write immutable Javascript?

If you reinvent the language as a new language, then you can have immutable Javascript. On the frontend you have no choice, but on the backend? Why not use a language that offers what you need upfront, rather than forcing you to work for it? Interesting:

The main issue I’ve had using immutablejs with Redux is debugging. Whereas previously I could simply mouse-over a data structure when I hit a breakpoint (or crash), I now have to do a REPL ...

Read More Source

October 4th, 2015

In Technology

No Comments

Erlang – OTP – Cowboy are the cutting edge

At the current time, the only thing out there, in the tech industry, that might cause me to move a way from Clojure, is something build around the Erlang VM . In those situations where performance and massive concurrency are needed, something like Erlang/Cowboy or Elixir/Phoenix need to be looked at.

I load tested (using wrk) nginx serving a two line, static HTML file, against a basic Cowboy service that parsed parameters, did an ETS lookup, and rendered several hundred ...

Read More Source

October 4th, 2015

In Technology

No Comments

Clojurescript as the frontend to Erlang

Radically different, yet becoming more common:

We use vanilla SmartOS, so that there is no dependency on FiFo for your running VM’s. You could just switch FiFo off and all your VM’s would continue to just work. It also comes with a number of great advantages:

In our opinion, ZFS is simply the only file system that should ever be used – period.

Compression, ARC and ZIL work incredibly well, especially for DalmatinerDB which achieves amazing throughput partially thanks to being purpose ...

Read More Source

October 4th, 2015

In Technology

No Comments

Hacking environmental protection features

Interesting:

Well, it turns out that all this environmental friendliness is starting to trip over itself, because most devices now start up in standby mode. So you can’t just power them on to power them on, you have to power them on and hit a button on the remote. Some devices, by pure dumb luck I assume, will accept the switch already being pressed in when they start. If that’s the case, you can hack the behaviour you want if you ...

Read More Source

September 26th, 2015

In Technology

No Comments

The Recursive Function Pattern Matching Pattern

Sean Johnson has a great video up. Common in Erlang, useful in Clojure, 3 functions, one to start, one to do the work, one to end, all defined by arity, using Pattern Matching.

Also called the “Start, Work, End” pattern.

This is often done in Clojure with zipmap, but this does not make things as clear as the Erlang version:

This is much more clear:

Source

September 26th, 2015

In Technology

No Comments

Best practice pattern matching in Clojure

If your function starts with a conditional, replace that with pattern matching:

Source

September 16th, 2015

In Technology

No Comments

Clean up your act with lein-checkall

I am a bit late but I’ve only recently become consistent about using a linter to check my Clojure style. And I’ve only today discovered the Leiningen plugin lein-checkall, which combines lein check && lein kibit && lein eastwood && lein bikeshed.

Venanti has written about the importance of these:

Eastwood

Eastwood is a Clojure linter, invoked with lein eastwood. As a general request, please use a linter. Some of my favorite moments in the last year have come from people trying to ...

Read More Source

September 13th, 2015

In Technology

No Comments

Calculating and Visualizing Voronoi Diagrams using the Quad-Edge Structure – Alan Shaw

Allan Shaw talks about a data structure called a “quad edge”. There were a lot of ideas here that were new to me. The data structure keeps rotation as one value, and the orientation of the edge as one value, but anything like coordinates are kept in a field called “data”. This separates the topology from the geometry. There is also a “next” function to find the next edge. This, apparently, gives great advantage when calculating a whole network of ...

Read More Source

September 12th, 2015

In Technology

No Comments

Microservies mean freedom of future action

Interesting:

In short, maximize future freedom of action. This heuristic also answers the when and why questions for microservices.

To prove it, let’s start with Sprott & Wilkes on SOA. Wait, Service Oriented Architecture? SOA is microservices loving parent. The philosophy trickles down:

When the service is abstracted from the implementation it is possible to consider various alternative options for delivery and collaboration models. […] It is entirely realistic to assume that certain services will be acquired from external sources because it ...

Read More Source

September 11th, 2015

In Technology

No Comments

Why are microservices happening now?

The term “microservices” only goes back to 2013. I would have trouble saying why I love the style so much, except that I hated dealing with Ruby On Rails and the PHP framework known as Symfony. I was willing to deal with a lot to get away from the pain of those systems. The growth of great package managers also seemed to weaken the need for monoliths.

But Martin Fowler says the most important change was the move to Continuous ...

Read More Source

September 11th, 2015

In Technology

No Comments

The difference between Clojure and Common Lisp

Fascinating bit by Giles Bowkett. This uses recursion and is how you would do it in Common Lisp:

(defn build [list-1 list-2] (if (nil? list-1) () (concat (map (fn [bubble] (list (first list-1) bubble)) list-2) ...
Read More Source

September 11th, 2015

In Technology

No Comments

Microservices are different

It does feel like the world is moving closer to distributed IPC. We are not there, but the push toward microservices seems a step in that direction. The warnings of the past feel less relevant now.

When I wrote Patterns of Enterprise Application Architecture, I coined what I called the First Law of Distributed Object Design: “don’t distribute your objects”. In recent months there’s been a lot of interest in microservices, which has led a few people to ask whether microservices ...

Read More Source

September 11th, 2015

In Technology

No Comments

Zach Tellman — the need for backpressure in queues, and the limits

This is very good. A lot of this interesting, but perhaps the biggest surprise is when he adds 16 consumers of tasks, but also 16 producers of tasks, the crisis point comes suddenly, compared to when there was only 1 consumer and 1 producer. With multiple consumers the consumption is averaged out, so each machine works fine right up to the moment of crisis.

His main theme is “Unbounded queues are fundamentally broken because it puts the stability of our ...

Read More Source

September 11th, 2015

In Technology

No Comments

Dynamic scope in Clojure

The interesting thing here is that the dynamic vars are wrapped in functions, which makes them a bit safer than dynamic scope would imply.

Each of these sub-clauses is very similar to the parent structures, and can be arbitrarily nested. As such, it is most easily constructed with a recursive function. However, Clojure’s let bindings are lexical, and don’t extend into recursive calls. We could make the memoized gensym call a parameter, but since we also need a separate generator ...

Read More Source

September 11th, 2015

In Technology

No Comments

This instance doesn’t do much, but it does have a nice property: it’s only equal to itself

This is a very clever hack:

Graphviz assumes explicit identities for nodes, so what about when we want to represent a tree? We can’t simply use the identity of the node, because the same value at different positions within the tree must be treated as separate nodes. One possibility is to represent each node as a tuple of its value and its position in the tree, but this forces us to consider how to represent positions, which is neither obvious nor ...

Read More Source

September 11th, 2015

In Technology

No Comments

The 8 fallacies of distributed computing

This is great:

The IT group usually has different administrators, assigned according to expertise–databases, web servers, networks, Linux, Windows, Main Frame and the like. This is the easy situation. The problem is occurs when your company collaborates with external entities (for example, connecting with a business partner), or if your application is deployed for Internet consumption and hosted by some hosting service and the application consumes external services (think Mashups). In these situations, the other administrators are not even under ...

Read More Source

September 10th, 2015

In Technology

No Comments

Is Gradle the best build tool for the JVM?

Gradle continues to innovate with new features.

Is Buildr dead? Buildr is now part of Apache and yet its last update was over a year ago. I tried to use Buildr this year but I ran into errors and when I searched on Google I found all of the advice was many years old. No one responded to my question on StackOverflow. I’m left thinking that Buildr is dying.

Gradle has an awesome bunch of plugins and the eco-system is growing. ...

Read More Source

September 10th, 2015

In Technology

No Comments

No locks for performance under load with concurrency

Interesting:

It’s quite clear that the lock-free approach scales a lot better under contention. This follows our intuition because lock-freedom allows system-wide progress even when a thread is blocked. If one goroutine is blocked on an insert or lookup operation, other operations may proceed. With a mutex, this isn’t possible.

Matchbox performs well, particularly in multithreaded environments, but there are still more optimizations to be made. This includes improvements both in memory consumption and runtime performance. Applying the Ctrie techniques to ...

Read More Source

September 10th, 2015

In Technology

No Comments

Use Specter to transform Clojure’s lists

Interesting:

To change the name of all the stations named “Barista” to “Coffee Master”, I can use a for comprehension:

(for [site sites station (:stations site)] (if (= (:name station) "Barista") (assoc station :name "Coffee Master") station))

But using Specter:

(->> sites (transform [ALL :stations ALL #(= (:name %) "Barista")] #(assoc % :name "Coffee Master")))

Now, this example is not actually doing justice to Specter. But in a previous (superseded) versions of the ...

Read More Source

September 10th, 2015

In Technology

No Comments

Matthew Phillips makes the case of Clojure’s “for” comprehensions

I am lazy so I would probably handle this with “reduce” as I then have a free-form function in which I can do whatever I want. And yet, list comprehensions are more idiomatic. Their limits make it more obvious what the structure of data should be. And for deeply nested items, they can handle everything at once, rather than needing to do nested calls to “reduce”.

But you can also do it this way, using a list-comprehension in Clojure’s for ...

Read More Source

September 10th, 2015

In Technology

No Comments

Prismatic’s Schema is better than Typed Clojure because it has coercions

Interesting:

One very useful feature of Prismatic/schema which core.typed does not have is called coercions. With this feature you can both validate your data structure and transform it to the desired state. This is particularly useful when validating input data from a database or ring request and doing all the string->int, kebab-casing etc in one step. The net effect being much less defensive code ‘on the other side’ of the coercer since you can rely on the exact shape of the ...

Read More Source

September 10th, 2015

In Technology

No Comments

Why is microservices popular now?

This is a word that came out of nowhere and took over the industry.

I wrote a good essay about microservices a few months before the word was invented.

Martin Fowler came up with the word microservices a few months later. He said:

Microservice practitioners, usually have come from an evolutionary design background and see service decomposition as a further tool to enable application developers to control changes in their application without slowing down change. Change control doesn’t necessarily ...

Read More Source

September 10th, 2015

In Technology

No Comments

Fortran still survives

Interesting:

When you actually take a look at the bulk of FORTRAN, it looks suspiciously like C — and it has C linkage. So, to me personally, I lump FORTRAN and C together in my head and then the question becomes “What real advantage does the switch to C++ from C have for you?”. You can find vast amounts of information on the web to answer that question :)

I have not known a single person in over a decade to ...

Read More Source

September 10th, 2015

In Technology

No Comments

Checkpoint and Restore In User Space (CRIU)

Interesting:

Luckily for us as we were investigating this possibility we ran into an incredibly ambitious open source project called Checkpoint and Restore in User Space (or CRIU for short). The name says it all. CRIU aims to give you the same checkpointing capability for a process tree that virtual machines give you for an entire computer. This is no small task and actually required changes to the mainline Linux kernel to pull off. The original goal of this project ...

Read More Source

September 10th, 2015

In Technology

No Comments

Mutable versus Immutable history

What really happened? What is the state of your system?

Explaining the ideal behavior of our notebooks is relatively simple: regardless of how you enter or edit cells, it should show the results of executing the file from top to bottom: the same way node does. The easiest way to accomplish this of course is to just re-run the entire document from the start after every change. This is in fact how the “rewind” feature in works in bpython. Of ...

Read More Source

September 9th, 2015

In Technology

No Comments

The conceptual clarity of CQRS

Interesting:

I found the cognitive load to be less than with other service based architectures I have worked on. I could jump into any area of the code base and because of the naming conventions for commands and events I could see what was going on – this has never been my experience with a service oriented architecture.

The main change in developer thinking that is necessary is that you don’t record state you record state transitions. Once that is internalised ...

Read More Source

September 7th, 2015

In Technology

No Comments

Things that make Clojure beautiful: namespace declarations

In Python, and Java, the import statements at the top of the file are big jumble of disorganized statements. In Clojure the namespace declaration is a data structure that can be cleaned up using all the tools Clojure has for working on a data structure. Apparently that is the idea behind Slamhound, which detects when imports are not being used. That is clever. I did not know about Slamhound. I will have to check that out.

Also this:

which was ...

Read More Source

September 5th, 2015

In Technology

No Comments

Is frontend Clojure development the best frontend development eco-system

I have not done much frontend work these last 3 years, so I am out of touch, but wow, there is a lot going on:

The first step is to define the routes we want. One of the designing features of bidi is that routes are data structures, not function/macro calls:

(def routes ["/" {"" :home "about" :about}])

The app-routes ...

Read More Source

September 5th, 2015

In Technology

No Comments

Limit the number of threads in Jetty

I do something similar, but I like the use of env, which I do not do:

(defn -main [& args] (let [config {:port (Integer/parseInt (or (env :port) "3000")) :join? false :min-threads (when (env :min-threads) (Integer/parseInt (env ...
Read More Source

September 5th, 2015

In Technology

No Comments

Use ZeroMQ instead of Kafka

Considering how radically different these are, this is a funny comparison:

Stability was the key aspect of Kafka we were unhappy with after a yearlong journey with it.

An HA deployment of Kafka requires an HA deployment of zookeeper, which Kafka uses to coordinate distributed state and configuration. As I explained before, we’ve experienced a number of stability issues with this stateful cluster maintaining consistency through outages such as VM recycle. Some serious engineering time was going into reacting to issues, ...

Read More Source

August 30th, 2015

In Technology

No Comments

Matrices are representations of linear transformations

A good intro to an amazing topic:

Source

August 29th, 2015

In Technology

No Comments

Rich Hickey: Would you want to be on a team that only did what was easy?

A dangerous attitude: “I like this because its easy for me right now.” Rich Hickey talking at the Rails conference. In the obvious case, this is a wonderful criticism of Rails.

He asks if anyone would want to join the Foo Fighters if they were the Kazoo Fighters. What if they felt guitars and drums were hard, so they only played kazoos, because kazoos are easy?

We should make decisions based on the work we need to do, not because ...

Read More Source

August 29th, 2015

In Technology

No Comments

Hashmaps are not simple

Interesting:

I was at this talk and I disagree with his fundamental statement that simple + simple = simple. I program in Ruby one of the biggest problems beginners make is not creating complex data structures where they are needed. Instead they pass around hashes of hashes of hashes. Why? Hashes are simple, they’re easy to understand and work with. Unfortunately this initial simplicity introduces unexpected complexity, things like deep dup and deep merge are now needed. Every part of ...

Read More Source

August 26th, 2015

In Technology

No Comments

Garajeando takes on the Gilded Rose Kata in Clojure

I dislike this line:

not-conjured-item-name (clojure.string/replace name #”Conjured ” “”)

Seems like calling “update” twice could be done with the opposite of this test:

(if (.contains name “Conjured”)

How to find the name of the unconjured item? I agree that is a tough issue.

For something this short, perhaps it doesn’t matter, but if this was non-trivial software, I would store a “:conjured” key in “items” and match against that. Seems less fragile than matching against a string. ...

Read More Source

August 26th, 2015

In Technology

No Comments

Stuart Sierra’s anti-patterns for Clojure

This is a subtle difference:

Be explicit about your types even when they’re dynamic.

If the operation requires a collection, then pass it a collection every time.

A “helper” like wrap-coll saves you a whopping two characters over just wrapping the argument in a literal vector, at the cost of lost clarity and specificity.

If you often forget to wrap the argument correctly, consider adding a type check:

(defn process-batch [items] {:pre [(coll? items)]} ;; ... )

If there actually are two distinct ...

Read More Source

August 26th, 2015

In Technology

No Comments

Hauptsatz is the central result establishing the significance of the sequent calculus

An interesting preliminary for sequent theory. I’m interested because of my interest in Shen.

The cut-elimination theorem (or Gentzen’s Hauptsatz) is the central result establishing the significance of the sequent calculus. It was originally proved by Gerhard Gentzen 1934 in his landmark paper “Investigations in Logical Deduction” for the systems LJ and LK formalising intuitionistic and classical logic respectively. The cut-elimination theorem states that any judgement that possesses a proof in the sequent calculus that makes use of the cut ...

Read More Source

August 26th, 2015

In Technology

No Comments

Natural language processing (NLP) is a messy and difficult affair

Interesting:

Similar words are nearby vectors in a vector space. This is a powerful convention since it lets us wipe away a lot of the noise and nuance in vocabulary. For example, let’s use gensim to find a list of words similar to vacation using the freebase skipgram data6:

from gensim.models import Word2Vec fn = “freebase-vectors-skipgram1000-en.bin.gz” model = Word2Vec.load_word2vec_format(fn) model.most_similar(‘vacation’)

# [('trip', 0.7234684228897095), # ('honeymoon', 0.6447688341140747), # ('beach', 0.6249285936355591), # ('vacations', 0.5868890285491943), # ('wedding', 0.5541957020759583), # ('resort', 0.5231006145477295), # ('traveling', 0.5194448232650757), # ('vacation.', 0.5068142414093018), # ('vacationing', ...

Read More Source

August 23rd, 2015

In Technology

No Comments

Why use Clojure at your startup

I guess these are becoming the standard set of answers?

The specific design decisions and abstractions in clojure which I expect to minimize costs are the following:

Immutability. Engineering is a super giant rubics cube. To solve it, you need to know each moving part. When you get all the moving parts to finally be in the correct locations and move together, that’s when you’ve solved it. Immutable data structures don’t move. The less moving parts you have, the more brainpower ...

Read More Source

August 23rd, 2015

In Technology

No Comments

E.W.Dijkstra on multi process systems

There was some moment, in the late 1960s and early 1970s, when the field of computer science hit a happy fluid moment. By that point, a large number of people had been working with computers for 20 years, so they knew what worked and what did not work, and yet nothing had been settled yet, no architectures dominated. And then, suddenly, computers became a monoculture with standard parts:

1.) a CPU

2.) random access memory

3.) a storage device such as a ...

Read More Source

August 23rd, 2015

In Technology

No Comments

C. A. R. Hoare in 1973

I am surprised at how little has changed since 1973:

I would like in this paper to present a philosophy of the design and evaluation of programming languages which I have adopted and developed over a number of years, namely that the primary purpose of a programming language is to help the programmer in the practice of his art. I do not wish to deny that there are many other desirable properties of a programming language, — for example, machine independence, ...

Read More Source

August 22nd, 2015

In Technology

No Comments

Paul deGrandis in 2012, the emergence of Clojure success stories

I like this talk by Paul deGrandis because he says he is not an Enterprise guy, he is a startup guy, and he says Clojure is more a startup technology than an Enterprise technology. I like that because I work with startups. Some people say that Clojure is best as Clojure In The Large, but I don’t work in the large. He says Enterprise CTO’s are driven mostly be fear.

Clojure is great for building a prototype that can become ...

Read More Source

August 22nd, 2015

In Technology

No Comments

Camille Fournier (Rent the Runway) – Consensus Systems for the Skeptical Architect

ZooKeeper owns your availability. Worth watching. I thought it was amazing when she said that even 5 years ago, even at Google, most programmers were not thinking in terms of distributed computing. Instead, its been the boom in microservices that has driven the adoption of distributed computing. I wonder why microservices wasn’t more popular 10 years ago? Everything in software started off monolithic and has gotten smaller. I suppose that is because of the increasing ease of composition?

Source

August 20th, 2015

In Technology

No Comments

Concurrency is easier with Clojure

I’m helping a co-worker write concurrent code in Java. I’m reminded, once again, that Clojure is easier. In Java, we must wrestle with the issue of synchronized blocks. We have an operation that reads a value from a hashmap and then deletes the key from the hashmap. We are using the hashmap almost like a queue: many threads might read from this hashmap, and yet we only want one thread to read from this hashmap. Therefore, both the read and ...

Read More Source

August 20th, 2015

In Technology

No Comments

SSL for Jetty via Apache reverse proxy

I found this to be useful

<VirtualHost *:443> SSLEngine on (...) ProxyRequests Off ProxyVia Off ProxyPreserveHost On AllowEncodedSlashes NoDecode RequestHeader set X-Forwarded-Proto https RequestHeader set X-Forwarded-Port 443 <Proxy *> Order deny,allow Allow from all </Proxy> <Location /test> ProxyPass http://localhost:8666/test nocanon </Location> (...) </VirtualHost> Source

August 20th, 2015

In Technology

No Comments

How to create a POJO in Clojure

The premise sounds interesting:

Those times you need to have Java APIs.. Some of these APIs need to return data. In Clojure it is usually a map:

{:q “What is..?” :a 42}

In Java it is not that simple for several reasons.. Java maps are mutable, there are no idiomatic tools to inspect, destructure them, Java (programmers) like different types for different POJOs, etc..

I would have appreciated an actual example. The great thing about Clojure is how it makes data access easy. ...

Read More Source

August 20th, 2015

In Technology

No Comments

SalesForce is confusing

Reading through SalesForce documentation I constantly come upon 404 errors:

They don’t keep the documentation up to date.

SalesForce has so many products that it is difficult to figure out which bit of documentation applies to whatever it is that you are trying to do.

Consider the question, “When does it make sense to add a Connected App to a Managed Package?” This is something I’ve wondered. And no one can give me a reliable answer.

One answer makes it ...

Read More Source

August 20th, 2015

In Technology

No Comments

Zookeeper Owns Your Availability

Interesting:

In Camille Fournier’s excellent talk on consensus systems, she advises that “Zookeeper Owns Your Availability.” Consensus systems are a necessary and powerful tool, but they add complexity and new failure modes. Specifically, if the consensus system goes down, you can’t do work any more. In Chronos’s case, you’re not just running one consensus system, but three. If any one of them fails, you’re in for a bad time. An acquaintance notes that at their large production service, their DB ...

Read More Source

August 20th, 2015

In Technology

No Comments

Bad habits: someone reports a bug so you insult them

This is a good example of how to do things wrong. Kyle Kingsbury did another one of his epic posts on Jespen. Every one of his posts so far has been a masterpiece of technical investigation. In the latest article he found a bug in Chronos, and he created an “issue” on Github. One of the programmers of Chronos then insulted him.

Kyle Kingsbury says:

I’m still not clear how exiting preserves correctness and prevents “split brain behavior”, but I’ve ...

Read More Source

August 11th, 2015

In Technology

No Comments

Redis Out Of Memory error

Interesting:

I’m getting “OOM command not allowed” when trying to set a key, maxmemory is set to 500M with maxmemory-policy “volatile-lru”, I’m setting TTL for each key sent to redis.

info command returns : used_memory_human:809.22M

If maxmemory is set to 500M, how did I reached 809M ? Info command does not show any Keyspaces , how is it possible ? keys * returns “(empty list or set)” ,I’ve tried to change db number , still no keys found. Here is info command output:

redis-cli -p 6380 ...

Read More Source

August 11th, 2015

In Technology

No Comments

The wrk command replaces Apache Bench

Apache has long had a strange gap in its testing tools. There was “bench” and there was “flood”. bench is easy but only handles HEAD requests. flood can do everything but requires a complicated XML config.

Now the team at Netty have spun off the wrk command, which looks very useful:

wrk - a HTTP benchmarking tool wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines ...
Read More Source

August 5th, 2015

In Technology

No Comments

The basics of working with Supervisord

I’ve come up with a system whereby:

1.) Jenkins pulls our code from the master branch on Github

2.) I wrote a build script that I store in /usr/local/bin

3.) Jenkins calls the build script as one of its build steps

4.) I wrote a script that finds the PIDS of existing instances of the app, and kills them:

#! /bin/sh ps aux | grep SSAM | awk '{print $2}' | xargs kill

5.) Jenkin calls the kill script as its last build step

6.) ...

Read More Source

August 4th, 2015

In Technology

No Comments

Supervisord is Python

A reminder to myself, liking Supervisord entails liking Python idioms:

A [program:x] section actually represents a “homogeneous process group” to supervisor (as of 3.0). The members of the group are defined by the combination of the numprocs and process_name parameters in the configuration. By default, if numprocs and process_name are left unchanged from their defaults, the group represented by [program:x] will be named x and will have a single process named x in it. This provides a modicum of backwards compatibility ...

Read More Source

August 1st, 2015

In Technology

No Comments

The humility of the Clojure community

Very true:

I was bragging to Alan about a Drake release, which I was calling 0.2.0. Alan rolled his eyes. He was like, “Considering the conventions put forth by Semantic Versioning, and considering that Drake has been in production at this company as well as other companies for years now, why not call it version 1 already?” I pushed back a bit, by surveying two existing open source Clojure projects I know of:

Aleph, Zach Tellman’s notorious asynchronous library for ...

Read More Source

July 31st, 2015

In Technology

No Comments

But you can customize the code?

Mike Knepper says Ruby gems are dangerous, but I am ambivalent:

The real problem with Devise commandeering all these components is that it makes the system extremely rigid. If the business logic changes (and yes, it will change) in a way that affects user sign-in or account creation, the developer is limited to modifying the app within the constraints of Devise. The developers behind Devise may not have anticipated a situation quite like yours, so getting Devise to work with the ...

Read More Source

July 31st, 2015

In Technology

No Comments

Refactor async work in Ruby

Kevin Buchanan makes an interesting point:

But, that’s starting to seem like a lot of behavior, and maybe that behavior is crucial enough to our application that we want to have more control over it, or want one place to go to change how we retry asynchronous tasks in our application. If we consider this retry, backoff, failure logic a key feature of our app, we probably don’t want to be coupled to using Sidekiq for this. What if tomorrow ...

Read More Source

July 30th, 2015

In Technology

No Comments

Innovation has slowed since the 1970s

Interesting:

“Real rocket science” took place almost 50 years ago, with the Apollo moon landing. The Apollo missions set the speed record for humans at roughly 40,000 km/hour. But after that, the rocket science advances started to slow down. From 1685 on, the number of scientific papers published doubled every fifteen years—he likened it to Moore’s Law—but that leveled off in the 1970s.

Who was doing this rocket science, he asked; who was programming these rockets and spacecraft to land on the ...

Read More Source

July 29th, 2015

In Technology

No Comments

Could I ever explain monads to someone else?

I would like to get to the point where I feel comfortable explaining monads to others:

In functional programming, a monad is a structure that represents computations defined as sequences of steps: a type with a monad structure defines what it means to chain operations, or nest functions of that type together. This allows the programmer to build pipelines that process data in steps, in which each action is decorated with additional processing rules provided by the monad.[1] As such, ...

Read More Source

July 28th, 2015

In Technology

No Comments

When to use repeating tasks inside of an app?

I would guess the best thing about cronj is its focus on thread management. And yet, I am in favor of very small apps, which may only have a single task that repeats. But this raises problems for the JVM. If I bundle all tasks into a single JVM process, then the highly optimized JVM engine can take full advantage of the careful thread management of cronj. If I have separate apps, then they compete for resources (though the newest ...

Read More Source

July 28th, 2015

In Technology

No Comments

Why Docker failed

Interesting:

Building container images for large applications is still a challenge. If we are to rely on container images for testing, CI, and emergency deploys, we need to have an image ready in less than a minute. Dockerfiles make this almost impossible for large applications. While easy to use, they sit at an abstraction layer too high to enable complex use-cases:

Out-of-band caching for particularly heavy-weight and application-specific dependencies

Accessing secrets at build time without committing them to the image

Full control over ...

Read More Source

July 28th, 2015

In Technology

No Comments

Trying to convince devs of the merits of Clojure

Interesting:

Leon Grapenthin:

I have tried various different approaches from convincing of Clojure advantages in the Java devs concrete domain, showing off incredibly awesome toy projects, larger projects, not tryng to sell, trying to sell, sending ClojureTV videos and what not approach you can think of. I have not managed to introduce one Java dev to Clojure in a way that he picked it up and had no interest before. I have spent many hours thinking about how I could ...

Read More Source

July 28th, 2015

In Technology

No Comments

The limits of RESTful interfaces

Interesting:

The chart leaves most of the rows blank for the year 1995, but of course, all of the necessary technologies existed in 1995, and in 1989. The focus of the article is on HTTP, but the article might be stronger if it confronted why HTTP was successful, when it lacked important abilities such as Authentication. There were other technologies that offered Business Logic and Logging and Realtime, back in 1989, so why weren’t they more successful?

It’s also curious ...

Read More Source

July 28th, 2015

In Technology

No Comments

Mutable arrays in Clojure

Chris Zheng has done some impressive work with mutable arrays:

Predicates as Datastructure I’m quite proud of the expressiveness of the ova syntax. We can see below the number of possible ways that we can select elements out of the array. Here is just a sample of what can be done using the select function.

(def ov (ova [{:val 1} {:val 2} {:val 3} {:val 4} {:val 5} {:val 6} ...
Read More Source

July 27th, 2015

In Technology

No Comments

When should Clojure imitate Object Oriented Programming?

Chris Zheng writes:

Servers that are running on a particular port can be tracked and stopped. I have to say, this was the feature that I wanted the most, which motivated the framework’s design. The annoying thing about development in emacs is that I have to be careful of not losing the reference to the server. Since there was no way of stopping it unless the repl is restarted. I wanted to implement a registery for references to running servers ...

Read More Source

July 26th, 2015

In Technology

No Comments

The maybe monad represents computations whose result is maybe a valid value, but maybe nil

Here is a sentence I have read a dozen times without understanding it:

The maybe monad represents computations whose result is maybe a valid value, but maybe nil.

This seems like a good way to think about the Any type, when dealing with things such as Typed Clojure.

Source

July 26th, 2015

In Technology

No Comments

The sins of Adam Bard

This last year I find that everything Adam Bard writes is worth reading. I have not been checking his blog very often but I should. I just saw this post from a year ago, which is really fantastic:

Any time you put a let in a let or an if in an if, that’s a strong code smell. It means you’re still writing code in a way that requires you to short-circuit your functions with returns.

There is a fascinating debate ...

Read More Source

July 25th, 2015

In Technology

No Comments

Scheduling libraries in Clojure

Chris Zheng has some interesting arguments for his particular take on these issues:

There are now many more scheduling libraries in the clojure world:

at-at chime clj-cronlike cron4j monotony quartzite schejulure

With so many options, and so many different ways to define task schedules, why choose cronj? I have listed a number of design decisions that make it beneficial. However, for those that are impatient, cut to the chase, by skipping to the simulations section.

…In reviewing other scheduling libraries, it was found that fully-featured thread management capabilities were ...

Read More Source

July 25th, 2015

In Technology

No Comments

Will I regret Functional programming?

I’ve spent the last year writing negative things about Object Oriented Programming, and I’ve been among the many people arguing that Functional Programming is the future. And I’ve talked about the political forces that drove the adoption of Object Oriented Programming. But that does raise the issue, what political forces are driving the adoption of Functional Programming? One possible answer is “None” and that would explain why Functional Programming remains a small niche compared to Object Oriented Programming. Another is ...

Read More Source

July 24th, 2015

In Technology

No Comments

Why Python 3.x went off course

A fascinating post from 2005, which is when Python began to veer off course. Python 2x had some beautiful features that could have been further developed, but instead, with 3.0, Python went down the classic Object Oriented road. In this post, Guido van van Rossum explicitly rejects much of the Functional paradigm that Python had picked up from Lisp.

So now reduce(). This is actually the one I’ve always hated most, because, apart from a few examples involving + or *, ...

Read More Source

July 24th, 2015

In Technology

No Comments

They cost of using Hystrix

Ouch!

We cannot use Clojure’s concurrency primitives (futures/promises/agents).

That is fascinating to think that at some point Clojure’s concurrency primitives are not enough, and so we need to give up on them and move to a Java library. I am aware that Netflix is dealing with unusual scale, but what is the point of Clojure if it doesn’t automate exactly these issues?

The comments are interesting:

Marc: When using Aleph, the choice for lamina would seem a sure thing. What made you turn ...

Read More Source

July 24th, 2015

In Technology

No Comments

The simplest step toward circuit breakers in Clojure

I think I missed the importance of this the first time I read it:

Consider you have this line within a service response:

{:body @(future (client/get “http://soundcloud.com/blah/wah”)) :status 200}

Now http://soundcloud.com/blah/wah goes down and those client requests start getting blocked on the request. In Clojure all future calls acquire a thread from the same thread pool. In our example the service is blocked up, is pilling new requests onto the blocked pool and we are in trouble.

My first solution to this problem ...

Read More Source

July 24th, 2015

In Technology

No Comments

Chris Zheng is consolidating his libraries into Hara

I have some questions for Chris Zheng. I admire Ribol very much, though I was not aware of some of the other repos. I am curious why you are moving forward with an integration of these libraries? The Clojure community has so far avoided frameworks and even large libraries have met with rejection. What do you hope to gain by consolidating these projects?

The projects:

iroh has been moved to hara.reflect

ova has been moved to hara.concurrent.ova

cronj has been superceded by ...

Read More Source

July 24th, 2015

In Technology

No Comments

Property based testing in the Functional Paradigm

Interesting:

Which brings me to another killer feature of many functional languages: property-based testing (PBT). While PBT is by no means an exclusive domain of functional languages, it does have deep roots in Haskell in the form of QuickCheck. What sets PBT apart from its traditional unit and integration brethren is its emphasis on defining a set of properties that describe a function and ability to generate a lot of random test cases to attempt to falsify these specifications. This ...

Read More Source

July 24th, 2015

In Technology

No Comments

Functional programming is not the same as static typing

I like this article, but it does confuse Functional Programming with static data types. Consider this example of evil Ruby code:

Take for instance the following Ruby code that uses Virtus.

class Events < Array def Source

July 24th, 2015

In Technology

No Comments

Dealing with mutation is hard

Obviously, I agree with this:

Dealing with mutation is hard. When I constantly grappled with these issues early on in my career, I thought I had serious issues. Perhaps I wasn’t cut out to be a developer. Maybe I should seriously consider a different career. It didn’t help that other developers breezed through similar assignments as if mutation and them were one (don’t get any ideas). But then I started reading about functional programming and how everyone was endlessly whining about ...

Read More Source

July 16th, 2015

In Technology

No Comments

The worsening web

The comments here are great:

Let’s dive deeper into the CNN article. Among the 200+ HTTP requests the page makes are calls to 25 different domains.

Yes you read that correctly. TWENTY…FIVE. Among them are a few that are clearly ad related (ex. ad.doubleclick.net, pixel.moatads.com), a few that serve some analytics function, and many whose names are intentionally obfuscated to confuse us.

Jeff Edsell:

The part of web cruft I hate most:

“Why does our page load so slow? Should you compress the images ...

Read More Source

July 16th, 2015

In Technology

No Comments

Greg Hendershott looks at Racket Macros

I wanted to ask Greg Hendershott for permission to copy his code in Clojure, but I could not find an email address for him. My own email is lawrence@krubner.com. I love this epilogue from Greg Hendershott:

"Before I had studied Chan (Zen) for thirty years, I saw mountains as mountains, and rivers as rivers. When I arrived at a more intimate knowledge, I came to the point where I saw that mountains are not mountains, and rivers are not rivers. But ...
Read More Source

July 15th, 2015

In Technology

No Comments

Vim has a function with 400 lines of code

When I worked at Category4, they had a homegrown HTML library. The method that generated HTML tables was over 1,100 lines of code (not a typo). So I’ve seen some fairly large functions. Dealing with them is why I now prefer 5 line functions written in a clean language like Clojure.

This is interesting:

This function is over 400 lines and contains over 40 #ifdefs. Its job? To wait for keyboard input. Several factors caused this code to be so ...

Read More Source

July 15th, 2015

In Technology

No Comments

What does the word “Cancel” mean?

Some of the worst User Interface Design I’ve seen in awhile. The Amtrak website uses “Cancel” as the text on the button that cancels your reservation. Almost everywhere in the world, if you see a button that says “Cancel,” it means you do not want to do something. But Amtrak uses it here, so if you do want to cancel your reservation, you have to hit the Cancel button.

Source

June 21st, 2015

In Technology

No Comments

Image recognition: we can not get there from here with what we’ve got

Interesting:

Leopards (or jaguars) are complex 3-dimensional shapes with quite a lot of degrees of freedom (considering all the body parts that can move independently). These shapes can produce a lot of different 2d contours projected on the camera sensor: sometimes you can see a distinct silhouette featuring a face and full set of paws, and sometimes it’s just a back and a curled tail. Such complex objects can be handled by a CNN very efficiently by using a simple rule: ...

Read More Source

June 21st, 2015

In Technology

No Comments

Where does image recognition fail?

Photo shows image recognition has a long way to go.

Source

June 20th, 2015

In Technology

No Comments

How NodeJs fails to deal with backpressure

Interesting:

The Node concurrency model is kind of like a credit card for computing work. Credit cards free you from the hassle and risks of carrying cash, and they are completely great in almost every way, unless you spend more than you make. It’s hard to even know you have spent more than you make until the next bill comes. Similarly, node lets you do more work, and it’ll call you back when it’s done, whenever that is. You might not ...

Read More Source

June 19th, 2015

In Technology

No Comments

Git history should show you reality, not a cleaned up version of reality

Well said:

The obsession of git users with rewriting history has always puzzled me. I like that the feature exists, because it is very occasionally useful, but it’s one of those things you should almost never use.

The whole point of history is to have a record of what happened. If you’re going around and changing it, then you no longer have a record of what happened, but a record of what you kind of wish had actually happened.

How are you ...

Read More Source

June 15th, 2015

In Technology

No Comments

The New Netflix

Netflix upgrades its website.

I have my doubts about the heavy use of Javascript that’s become normal over the last 5 years.

I got my current MacBook Pro in 2011 and for awhile it seemed like a fast computer. Nowadays, however, if I launch Chrome, and I have 6 or 7 pages open, the computer is under stress. If I open the terminal and run “top” I see that the load varies between 1 and 3. It never goes below ...

Read More Source

June 10th, 2015

In Technology

No Comments

The new RESTful style

Apparently this style is now popular with some developers:

Source

June 9th, 2015

In Technology

No Comments

Strange problems with Rackspace cloud machine

What to make of this?

root@cloud-server-01:~# emacs The program ‘emacs’ can be found in the following packages: * emacs24 * emacs24-nox * e3 * emacs24-lucid * jove Try: apt-get install root@cloud-server-01:~# apt-get install emacs24 Reading package lists… Done Building dependency tree Reading state information… Done emacs24 is already the newest version. emacs24 set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 21 not upgraded. 134 not fully installed or removed. After this operation, 0 B of additional disk space will be used. Do you want to continue? [Y/n] ...

Read More Source

June 9th, 2015

In Technology

No Comments

Avoid RejectedExecutionException in lein :(

I am curious what Dave Ray wrote here in his Seesaw repo.

(defn -main [& args] (when-not (first args) (println "Usage: gaidica ") (System/exit 1)) (reset! api-key (first args)) (invoke-later (-> (make-frame) add-behaviors show!)) ; Avoid RejectedExecutionException in lein :( @(promise))

Does anyone know what this about? What causes RejectedExecutionException in lein?

Source

June 2nd, 2015

In Technology

No Comments

When to use Patch

Interesting:

When should we use the PATCH HTTP method?

The HTTP methods PATCH can be used to update partial resources. For instance, when you only need to update one field of the resource, PUTting a complete resource representation might be cumbersome and utilizes more bandwidth

Also, the PUT method is idempotent. PUTting the same data multiple times to the same resource, should not result in different resources, while POSTing to the same resource can result in the creation of multiple resources.

See also RFC 5789 ...

Read More Source

June 2nd, 2015

In Technology

No Comments

Working with monoids

Interesting:

Simply put, Monoids describe types containing a binary function and an identity value.

When applied to the identity value and a random value x, said function leaves its argument x untouched, returning it as a result. This short description should be enough to get the conversation started.

Here’s how Haskell defines a Monoid:

class Monoid m where mempty :: m mappend :: m -> m -> m mconcat :: [m] -> m ...

Read More Source

June 2nd, 2015

In Technology

No Comments

A pipeline of agents creates a fully asynchronous programming model

I recall reading this code in 2010 or 2011, when I was first learning Clojure, and at the time there was a great deal about it that I did not understand, so I missed the point:

(def logger (agent (list))) (defn log [msg] (send logger #(cons %2 %1) msg)) (defn create-relay [n] (letfn [(next-agent [previous _] (agent previous))] (reduce next-agent nil (range 0 n)))) (defn relay [relay msg] (letfn [(relay-msg [next-actor hop msg] ...
Read More Source

June 1st, 2015

In Technology

No Comments

Using reducers on the bytes in a memory mapped file

This could be a powerful technique, especially when speed and parallelization are important:

First, we’ll have a couple of parameters: the character set for the input and a hint for the size of chunk to break the file into. (def ^:dynamic *charset* (Charset/forName "UTF-8")) (def ^:dynamic *chunk-size* (* 10 1024 1024)) With those, we’ll break the file into chunks by skipping through it and reading ahead until we get to the end of a line. Later, when we actually read the file, this ...
Read More Source

June 1st, 2015

In Technology

No Comments

Higher order functions in Clojure support chaining

Interesting:

One easy-to-miss strength of this approach is that it supports chaining. In a few places in our application, we wanted to send a computation to an agent and observe the state of the computation (e.g. to show and hide a spinner). We didn’t want to have to wire observation hooks or callbacks directly into the process, so we created a contextual function (defn with-process-callbacks [fire fun & args]). with-process-callbacks returns a function which calls fun with args, but calls fire ...

Read More Source

June 1st, 2015

In Technology

No Comments

Stuart Sierra says avoid Dynamic Scope

Dynamic scope will ruin your life. In a different presentation he says that dynamic scope is okay so long as the var is really private, and marked as private.

The problem with this pattern, especially in libraries, is the constraints it imposes on any code that wants to use the library. The with-resource macro severely constrains what you can do in the body:

You can’t dispatch to another thread. Say goodbye to Agents, Futures, thread pools, non-blocking I/O, or any other ...

Read More Source

June 1st, 2015

In Technology

No Comments

Mark Seemann feels that mutating state is intuitive

This is a case of someone trying to be open-minded, but still being biased because of their years spent getting comfortable with a very particular form of programming that allows a very particular form of mutable state:

In FP they’ve come up with this clever concept of monads to ‘work around’ the problem of mutating state. Yes, monads are very clever, but if they feel foreign in OOD it’s because they’re not required. Mutation is an inherent part of the ...

Read More Source

May 28th, 2015

In Technology

No Comments

Simple Design

Interesting:

Yagni is a way to refer to the XP practice of Simple Design (from the first edition of The White Book, the second edition refers to the related notion of “incremental design”). [1] Like many elements of XP, it’s a sharp contrast to elements of the widely held principles of software engineering in the late 90s. At that time there was a big push for careful up-front planning of software development.

Let’s imagine I’m working with a startup in Minas ...

Read More Source

May 26th, 2015

In Technology

No Comments

Why Appsflyer gave up on Python and switched to Clojure

Interesting:

At AppsFlyer we actually started our code base in Python. Two years later this wasn’t enough to handle the growing number of users and requests. We started to encounter issues like one of the critical Python processes taking too long to digest the incoming messages, caused mainly by string manipulations and Python’s own memory management system. Even partitioning the messages amongst several processes and servers could not overcome this. This eventually killed the process and caused data loss – ...

Read More Source

May 23rd, 2015

In Technology

No Comments

Concurrency in Ruby

Celluloid is interesting:

Celluloid provides a simple and natural way to build fault-tolerant concurrent programs in Ruby. With Celluloid, you can build systems out of concurrent objects just as easily as you build sequential programs out of regular objects. Recommended for any developer, including novices, Celluloid should help ease your worries about building multithreaded Ruby programs.

Much of the difficulty with building concurrent programs in Ruby arises because the object-oriented mechanisms for structuring code, such as classes and inheritance, are separate ...

Read More Source

May 21st, 2015

In Technology

No Comments

Sandi Metz tries to solve Object Oriented problems with composition

Kind of sad:

She says “We love dependency injection”.

First she acknowledges that the “proper” Object Oriented approach leads to more code for the same behavior:

but then she says the solution is to use composition, which offers all kinds of flexibility:

She says it is wonderful because in the end we get “pluggable behavior”.

But if it is a good idea to pull certain methods out of an object, and make them independent, in an object that can then be injected ...

Read More Source

May 21st, 2015

In Technology

No Comments

Sandi Metz on hidden assumptions

Interesting:

Our code is full of hidden assumptions, things that seem like nothing, secrets that we did not name and thus cannot see. These secrets represent missing concepts and this talk shows you how to expose those concepts with code that is easy to understand, change and extend. Being explicit about hidden ideas makes your code simpler, your apps clearer and your life better. Even very small ideas matter. Everything, even nothing, is something.

Source

May 19th, 2015

In Technology

No Comments

Predator-Prey modeling in Clojure

Interesting:

Introduction to Predator-Prey Systems In this edition of the blog, I’ll discuss how you can use Clojure to solve a system of nonlinear differential equations. The particular system I’ll be solving is the Predator-Prey or Lotka-Volterra Model, which you can read all about right here. The basic concept is that you are modeling a population of predators and prey (e.g. Foxes and Rabbits, which we’ll use here). How the two populations change over time can be modeled like so:

dR/dt=αR−βRF dF/dt=−γF+δRF

These are differential ...

Read More Source

May 10th, 2015

In Technology

No Comments

addShutdownHook(), to stop your app in a reasonable way

Interesting and important:

Problem:

A program may require to execute some pieces of instructions when application goes down. An application may go down because of several reasons:

Because all of its threads have completed execution

Because of call to System.exit()

Because user hit CNTRL-C

System level shutdown or User Log-Off

Concept at Abstract level: Write all the instructions(java code) in a thread’s run method and call java.lang.Runtime.addShutdownHook(Thread t). This method will then register this thread with JVM’s shutdown hook. At the time of shutting down, JVM will run ...

Read More Source

May 10th, 2015

In Technology

No Comments

Test all your code in production using “feature flags”

I was talking to someone at Viacom, and he told me they were doing something very clever: they use feature flags to limit who can see new features, and in fact, all new features are at first limited to the QA team. Because of this, they have no development servers — everything is tested in production. This allows the testing to be much more realistic.

Feature flag libraries in Ruby and Clojure:

Ruby: rollout

Clojure: shoutout

Source

May 6th, 2015

In Technology

No Comments

Anyone can contribute to clojure-doc.org

Clojure-doc.org is the place for people to contribute. This is the important bit:

Contributor-friendly This material is not covered by the Clojure Contributor Agreement and is developed using pull-requests on GitHub.

This is discussed in an interesting thread on the Clojure Google Group:

Assertion: “There are only a handful of people in the world with authorization to edit pages on clojure.org. ”

Fact: 14

Assertion: “Far more have authorization to edit the wiki pages on dev.clojure.org — hundreds, I think. A subset of those who ...

Read More Source

May 6th, 2015

In Technology

No Comments

The changelog for the clojure.org wiki

This is not linked anywhere, but it is good to know about:

Source

May 6th, 2015

In Technology

No Comments

The contents were now a boilerplate AT&T copyright notice claiming intellectual ownership of the otherwise still empty file

If the law allows a company to copyright an empty file, then the law should be changed:

In a 1984 version of Unix, things started heating up, and true grew to 276 bytes. The contents were now a boilerplate AT&T copyright notice claiming intellectual ownership of the otherwise still empty file.

Source

May 5th, 2015

In Technology

No Comments

Caribou as the ultimate Clojure web framework?

Kyle Dawkins writes:

Justin Smith speaks the truth about Caribou. I’m also one of the team members, and although we did lose our funding, we’re all still around and there are a number of active Caribou projects alive and well. It does have everything Justin says, and yes, it’s imperfect, but it’s also very easy to get a site up and running quickly. But you don’t lose the modularity that we all love in the Clojure world. ...

Read More Source

May 4th, 2015

In Technology

No Comments

If a language does not guarantee order in a hashmap can the hashmap be referentially transparent?

It’s an interesting question. Clojure says it is referentially transparent, meaning you can remove any function and replace it with its return value, with no effect on the program, but can Clojure be referentially transparent if it does not guarantee the order of its hashmaps (especially since hashmaps are also functions in Clojure)?

Note that this issue is similar to ensuring that a hash function is consistent with equals in a language, i.e. if two values x and y are ...

Read More Source

May 3rd, 2015

In Technology

No Comments

ExecutorService makes exceptions disappear in a bad way

I have been bitten by this many times, mostly in Clojure libraries that use ExecutorService under the hood:

What will be the result of the following snippet?

executorService.submit(() -> { System.out.println(1 / 0); }); I got bitten by that too many times: it won’t print anything. No sign of java.lang.ArithmeticException: / by zero, nothing. Thread pool just swallows this exception, as if it never happened. If it was a good’ol java.lang.Thread created from scratch, UncaughtExceptionHandler could work. But with thread pools ...

Read More Source

May 3rd, 2015

In Technology

No Comments

JVM advice: name your thread pools

Tomasz Nurkiewicz offers this bit of advice, which sounds like it would also be useful in Clojure:

Name pool threads

I can’t emphasize this. When dumping threads of a running JVM or during debugging, default thread pool naming scheme is pool-N-thread-M, where N stands for pool sequence number (every time you create a new thread pool, global N counter is incremented) and M is a thread sequence number within a pool. For example pool-2-thread-3 means third thread in second pool ...

Read More Source

May 3rd, 2015

In Technology

No Comments

Clojure does not need job queues, because it has Storm, Onyx, Quasar, Pulsar

I find it interesting to consider the question that maybe Clojure has so many great systems for distributed processing that it does not need the classic job queue.

It’s worth considering that if you don’t need something very robust (and depending on your situation), you could just use Redis + Carmine directly to pass messages around (possibly representing jobs), and have workers pull from the message queue. There is nothing else you really need for this; it’s quite straight forward. ...

Read More Source

May 2nd, 2015

In Technology

No Comments

Aaron Bedra: web apps in Clojure have some of the worst security

Aaron Bedra – clojure.web/with-security

Breda says the Clojure community needs to have a talk, because of some bad things that happened recently. The rate of people getting hacked is going up. He says:

“Clojure web apps are some of the worst I have seen in terms of security. We are talking about PHP-without-a-framework levels of insecurity.”

“We have bricks with no mortar.”

“If I missed your library, it’s because it doesn’t exist. I could not find it on the first page of Google, ...

Read More Source

May 1st, 2015

In Technology

1 Comment

Embarrassing code I wrote under stress at a job interview

(Note: this post was, in part, inspired by John Lawrence Aspden’s post about FizzBuzz.)

I write terrible code when I go to a job interview. That’s mostly because, when they ask me to solve a coding question, I get nervous. I thought it might be entertaining if I wrote about one such encounter.

Yesterday I went to a job interview, at a company in New York that had once built their stack (for managing online advertising) in Ruby but who are now ...

Read More Source

April 28th, 2015

In Technology

No Comments

Jim Starkey says “Well, duh”

This doesn’t rise to the level of “Zed Shaw rant” style of meltdown, but Jim Starkey has decided the play the role of “famous old codger who did great work once but now seems completely out of touch“:

Any discussion of the CAP “theorem” revolves around the A – exactly what does availability mean?

The narrow sense is that availability means that all surviving nodes in all partitions continue to process work. This reduces the CAP idea to nothing more than ...

Read More Source

April 28th, 2015

In Technology

No Comments

Kyle Kingsbury’s Jespen series is CAP enlightenment

So, again, I am late to the party. Yesterday, by accident, I discovered Kyle Kingsbury “Jespen” series. I stayed up till 4 AM reading through it. Every article is completely amazing. I wish he could do an article on every NoSQL database, but I read somewhere that each article cost him months of effort, so it is impossible to expect more from him. I recommend every single one of these articles:

Source

April 27th, 2015

In Technology

No Comments

Redis losing 56% of writes during a partition

Kyle Kingsbury (the same guy who does cool Clojure stuff like Reimann and teasers) has an epic writeup on Redis:

“In this post, we demonstrate Redis losing 56% of writes during a partition.”

I have trouble finding the pithy excerpt here, because it is all good. I guess I’ll just quote the opening where Kingsbury sets up the argument, and then you can read the rest for the way things fall apart:

Redis offers asynchronous primary->secondary replication. A single server is ...

Read More Source

April 27th, 2015

In Technology

No Comments

Can MongoDB keep its promises?

See “Stale reads with WriteConcern Majority and ReadPreference Primary”

Kyle Kingsbury starts the fight without meaning to:

In this test, MongoDB returns the value “0″ for the document, even though the only possible values for the document at that time were 1, 2, 3, or 4. The value 0 was the proper state at some time close to the partition’s beginning, but successful reads just after the partition was fully established indicated that at least one of the indeterminate (:info) CaS ...

Read More Source

April 27th, 2015

In Technology

No Comments

Parallelism versus concurrency

Someone posted this on Hacker News, and it is very good. Parallelism sends equal work to every processor, concurrency is the messy chaos of sending work to whatever processor is free, or bundling up many threads on one processor.

Source

April 27th, 2015

In Technology

No Comments

Disque is a distributed and fault tolerant message broker, so it works as middle layer among processes that want to exchange messages

The people who gave us Redis announced a new project today:

Disque is a distributed and fault tolerant message broker, so it works as middle layer among processes that want to exchange messages.

Producers add messages that are served to consumers. Since message queues are often used in order to process delayed jobs, Disque often uses the term “job” in the API and in the documentation, however jobs are actually just messages in the form of strings, so Disque can be ...

Read More Source

April 26th, 2015

In Technology

No Comments

A very long Java method

A common rule in programming is to keep methods as small as possible, so I am surprised to see this method in a seemingly well-run project such as ZooKeeper:

private void processEvent(Object event) { try { if (event instanceof WatcherSetEventPair) { ...
Read More Source

April 26th, 2015

In Technology

No Comments

Java performance

I like Tomasz Nurkiewicz’s summary of this book:

JIT (just-in-time) compiler turns out to be one of the most important tools bringing performance to the JVM. First “real” chapter goes into great details of how JIT works in different modes, how to monitor and tune it. I learnt a lot already, but the best is yet to come. Obviously garbage collection is a major concern, thus Oaks devotes two full chapters to explain all popular GC algorithms. Besides pure description, expect ...

Read More Source

April 26th, 2015

In Technology

No Comments

Your data is the API

Interesting:

The first time I realized that “Data as an API” was in fact a very good idea was at Kevin Lynagh’s presetation at Öredev. However, if you want something more like a struct Clojure provides something called a record. If you know Scala this is very similar to case classes. A record can be defined like this:

(defrecord Person [firstName lastName])

This creates an actual normal Java class Person with two immutable fields and implements hashCode and equals. A record also ...

Read More Source

April 26th, 2015

In Technology

No Comments

The farce known as “object oriented programming”

Jayway has a nice critique of how much real-life object oriented programming departs from the beautiful theory:

One thing I have realized is that in Java we use classes for many purposes. In a typical web application written in Java using something like Spring framework you will often find:

Data transfer objects (DTO:s)

Services (REST API, controllers, DAO:s)

Rich objects (if you’re lucky!)

A DTO is just a struct and contains no behavior. To minimize the boilerplate in Java I tend to implement DTO:s using ...

Read More Source

April 26th, 2015

In Technology

No Comments

New data structures in Clojure 1.8

Apparently there are a lot of new data structures which may arrive in Clojure 1.8, thanks to Zach Tellman:

So, at the end of this exercise we have more than 5000 lines of Java, and we want to add them to the core implementation of Clojure. Ideally, we won’t introduce any bugs in the process. But the same unrolling that makes the code faster makes it significantly harder to simply read the code and verify it’s “correct”. The Clojure code which ...

Read More Source

April 26th, 2015

In Technology

No Comments

Design patterns have social value

An interesting bit from Adam Petersen:

Patterns have social value too. The format arose to enable collaborative construction using a shared vocabulary. In Patterns in C I write on the groundbreaking work of architect Christopher Alexander:

The patterns found in Alexander’s books are simple and elegant formulations on how to solve recurring problems in different contexts. [...] His work is a praise of collaborative construction guided by a shared language – a pattern language. To Alexander, such a language is a generative, ...

Read More Source

April 26th, 2015

In Technology

No Comments

Automat for easy finite-state-machines in Clojure

Another interesting library from Zach Tellman allows for finite state machines:

For a more real-world use case, consider tracking browsing behavior on an online store. We want to see when the customer visits the cart, begins to checkout, but then returns back to the cart without having completed the checkout. Seeing this indecisive behavior, we can make a special offer.

Source

April 26th, 2015

In Technology

No Comments

Using abstract classes to hide boilerplate code

I personally never do the kind of work where I need to implement abstract classes. I was asked in a job interview why I would use an abstract class, and I came up with some nonsense answer about having a default implementation for situations where my code expected a given situation 90% of the time, and edge cases only 10% of the time. But here is an interesting example in Clojure, where it interoperates with Java, using an abstract class ...

Read More Source

April 26th, 2015

In Technology

No Comments

Zach Tellman on specialized tuples for Clojure

Other than Rich Hickey, I think I learn the most from Tellman, regarding how to do things and why they work the way they do:

Most data structures are designed to hold arbitrary amounts of data. When we talk about their complexity in time and space, we use big O notation, which is only concerned with performance characteristics as n grows arbitrarily large. Understanding how to cast an O(n) problem as O(log n) or even O(1) is certainly valuable, and ...

Read More Source

April 26th, 2015

In Technology

No Comments

When to use reify in Clojure

This is a nice explantation. If you have a protocol, then you can instantiate with a record, like this:

(defprotocol Foo (bar [this]) (baz [this st]) (quux [this x y])) (defrecord FooRecord Foo (bar [this] (println this)) (baz [this st] (str this st)) (quux [this x y] (str this (* x y))))

But if only need to instantiate the protocol one ...

Read More Source

April 25th, 2015

In Technology

No Comments

ExecutorCompletionService

How very much easier it is to use core.async in Clojure! My one concern is that core.async has a thread pool that is set to the number of CPUs + 2, so the thread pool is small and rigid.

Each call to contentFuture.get() waits until downloading given web site (remember that each Future represent one site) is finished. This works, but has a major bottleneck. Imagine you have as many threads in a pool as tasks (20 sites in that ...

Read More Source

April 25th, 2015

In Technology

No Comments

Limit new features to a subset of your users

Inspired by the Ruby gem “Rollout”, Shoutout offers user buckets on which you can test new features:

Storage

Unlike rollout, shoutout is completely storage agnostic. You’ll have to implement your own storage backend, which implements ShoutoutStorage. The storage protocol has two functions, read-from-storage, and write-to-storage, both of which should be simple enough to implement. Both deal purely with serialized strings, and string keys, shoutout does the serialization logic itself.

The library provides an in memory store (used for testing) that you could ...

Read More Source

April 24th, 2015

In Technology

No Comments

A Redis queue

There is a reason why so many message systems are using Redis as their backend:

Source

April 24th, 2015

In Technology

No Comments

Redis: I am late to the party

The strangest thing about the human mind is the degree to which context shades our memories. So now that I’m using Redis I realize that I’ve been reading about it for years without realizing how diverse its uses are. I just now decided to re-read the Github post from 2009 “Introducing Rescue” and I only now realize that it mentions both Redis and Kestrel, 2 things I had not heard of then, mere names that I read and forgot because ...

Read More Source

April 22nd, 2015

In Technology

No Comments

Design patterns are failures

I love this:

Design Patterns was especially well-timed because it offered a ray of hope for people who were mired in the Woes of the New OO Programmer. You see, the OO camp was saying: “EVERYTHING IS AN OBJECT! YOU WILL THINK OF EVERYTHING AS OBJECTS FROM NOW ON! THE OO PROGRAMMING PARADIGM IS: CREATE YOUR CLASSES, ADD OPERATIONS TO THEM, AND LAUNCH THE DAMN THING!”

The last sentence (forgive the caps, sorry) is a pretty reasonable paraphrase of Stroustroup in his ...

Read More Source

April 22nd, 2015

In Technology

No Comments

Singletons are evil

This is great:

Everyone Loves Singleton

Why is the Singleton so attractive? I’ll be the first to admit: I liked it too. No, scratch that – I loved the Singleton. It felt like an old friend from the moment I laid eyes on it. It was simple and beautiful.

I’ll tell you why: it’s because the Singleton pattern is a throwback to non-OO programming. It’s a lifeline for people who didn’t understand a single word that the Gang of Four were trying ...

Read More Source

April 20th, 2015

In Technology

No Comments

Steve Yegge’s contribution to the revolt against Object Oriented Programming

Somehow I waited till today to read Steve Yegge’s 2006 rant “Execution in the Kingdom of Nouns”. I’ve seen it recommended many times, but I only now read it. I wish I had read it in 2006. I am not sure I would have understood it, but in retrospect it clearly marks the end of the mania that for Object Oriented Programming that Paul Graham had noted in 2001 (Paul Graham wrote: “There is a kind of mania for object-oriented ...

Read More Source

April 20th, 2015

In Technology

No Comments

Encapsulation of information is folly

This is strongly stated, and surprising:

Datatypes and protocols are opinionated

While datatypes and protocols have well-defined relationships with host constructs, and make for a great way to expose Clojure functionality to Java programs, they are not primarily interop constructs. That is, they make no effort to completely mimic or adapt to all of the OO mechanisms of the host. In particular, they reflect the following opinions:

Concrete derivation is bad: you cannot derive datatypes from concrete classes, only interfaces

You should always program to ...

Read More Source

April 20th, 2015

In Technology

No Comments

Why have both deftype and defrecord?

This is good:

It ends up that classes in most OO programs fall into two distinct categories: those classes that are artifacts of the implementation/programming domain, e.g. String or collection classes, or Clojure’s reference types; and classes that represent application domain information, e.g. Employee, PurchaseOrder etc. It has always been an unfortunate characteristic of using classes for application domain information that it resulted in information being hidden behind class-specific micro-languages, e.g. even the seemingly harmless employee.getName() is a custom interface to ...

Read More Source

April 7th, 2015

In Technology

No Comments

Ruby closures borderline macro syntax

A good reminder of how much block syntax gives you:

if user.save # publish event 'user.created', with payload {user: user} Publisher.broadcast_event('user.created', user: user) end def create_user(params) user = User.new(params) # publish event 'user.created', with payload {user: user}, using block syntax # now the event will ...
Read More Source

April 6th, 2015

In Technology

No Comments

If the only thing you care about is behavior then ruby suggests to implement it as a module

Interesting:

Lets look at this ruby code. class Util def self.double(i) i*2 end end Util.double(4) #=> 8 Here we have a Util class. But notice that all the methods on this class are class methods. This class does not have any instance variables. Usually a class is used to carry both data and behavior and ,in this case, the Util class has only behavior and no data. Similar utility tools in ruby Now to get some perspective on this discussion lets look ...
Read More Source

April 6th, 2015

In Technology

No Comments

Ruby On Rails as the frontend for polyglot programming

True:

Rails is a good framework for proof-of-concept and small applications, it promotes conventions over configuration. As the application grows it becomes difficult to maintain. This is primarily because rails promotes coupeled architecture with fat model, skinny controller approach. Developers need to adopt to new patterns and create new conventions to keep projects moving on pace and in shape. PUBSUB can help us resolve some of the problems we face often.

And the subscribers can be written in any language, allowing for ...

Read More Source

April 6th, 2015

In Technology

No Comments

What Ruby sees when you monkeypatch

Interesting:

That is, the code:

module Foo puts Foo.object_id end

is functionally equivalent to:

# Create a new Module instance and assign it to the Foo constant Foo = Module.new

# Reopen the Module instance assigned to the constant Foo for modification module Foo # Do stuff in here to add functionality to the Foo module # Since Foo is already defined, we can get its object_id. puts Foo.object_id end

This certainly doesn’t make sense coming from a compiled language standpoint (after ...

Read More Source

April 6th, 2015

In Technology

No Comments

Shocking fact: using Spring used to mean giving up all compile time checks in Java

I have been reading Java Programming Interviews Exposed.

I never understood these “job interview” books before. Who can get ready for a job interview by reading a book? Surely that’s just cheap marketing by the publishers, who prey on developers insecurities?

However, I’ve decided I like this book. Not for job interviews — it sucks for that. But as a broad overview of the Java eco-system, it is perfect. It’s got a little about serialization, a little about dependency injection, a ...

Read More Source

April 5th, 2015

In Technology

No Comments

Why does Google point to 5 year old articles about Railties?

Sometimes Google disappoints. If you search for “gem plugins railtie” the first link is to an article that is 5 years old. Is there truly no better information? That article says:

Railtie plugins are easy to turn into gem plugins for Rails. This makes them easy to distribute, manage, and upgrade. The first thing you need is a gem. If you don’t have a gem yet, you can create a new gem easily using Bundler. Just run bundle gem my_new_gem ...

Read More Source

April 5th, 2015

In Technology

No Comments

Why (right side) cast a variable in Java

Interesting:

The question:

Is there some general rule about when a variable needs to be cast (on the right side)? Why is it that HttpURLConnection is cast on the right side here:

final HttpURLConnection connection = (HttpURLConnection) url.openConnection();

but responseInputStream does not need to be cast on the right side here:

final InputStream responseInputStream = connection.getInputStream();

How does a Java programmer know when to do this kind of casting, and when not to?

The answer:

In this program, you cast ...

Read More Source

April 3rd, 2015

In Technology

No Comments

ActionDispatch and middleware

Interesting:

When you start using ruby on rails, its ease of use makes it great to get you started. Everything works out of the box. You may be using Devise for authentication, Cancan for authorization and every time you need something that you believe Rails do not provide, you search google for a gem doing what you seek.

And joy is everywhere, your app works fine, you didn’t even need to write that much code to get where you are!

It’s awesome. Until ...

Read More Source

April 2nd, 2015

In Technology

No Comments

ActiveJob offers a uniform queue interface for Rails

I love that Rails 4.2 offers a unified interface for working with queues. This is obviously important for Ruby, since Ruby sucks at concurrency, and needs to rely on a lot of queue technology to facilitate most forms of async (some people then jump in: “blah, blah, blah, Fiber, etc, etc.” I get that, but still, the reality is, using Fiber does not magically give you Clojure, or Elixir).

Why do I need Background Jobs?

One common situation for needing background ...

Read More Source

March 31st, 2015

In Technology

No Comments

The folklore that allows technology to work

They make this sound negative, but every branch of engineering is built up on folklore, some of which stretches back for thousands of years. On a practical level, few us ever need to go back to first principles. It is faster and more efficient to work from rough rules of thumb that work most of the time.

In practice, very few people study the primary sources (or even authoritative secondary sources) when they’re programming and then work forward from first ...

Read More Source

March 31st, 2015

In Technology

No Comments

Why is Clojure leaner than Object Oriented Programming?

Interesting:

The person opposite will be wondering why is Clojure so lean and effective? You may think it’s unsporting and a bit negative to shoot fish in a barrel, but here I like to attack OO a bit. You can’t avoid this anyway as OO is the elephant in the room being the mainstream status quo. I’ve have found however that this can be a light and fun conversation, as people generally enjoy trading war stories and rallying against established orthodoxy.

We ...

Read More Source

March 31st, 2015

In Technology

No Comments

Types of functions: where Functional Programming meets Object Oriented Programming

Interesting:

Over the past year I have used Prismatic Schema extensively on a large Clojure project. We really like the aid that if offers in understanding, debugging, and using our code. However, we regularly feel a bit of a let down when an argument to a function is another function. Prismatic Schema doesn’t allow you to say much in these cases beyond: this arg is a function.

To address this we extended Prismatic Schema to allow us to add type annotations ...

Read More Source

March 30th, 2015

In Technology

No Comments

Mistake: At least make your fancy app act like a web page

A lot of people now say stupid things like this:

To add insult to injury, web development has become more and more dominated by rich client side work over the last 5 years. Javascript used to be a tool that you used as sparingly as possible, sprinkling in just the barest hint of dynamic behavior where it was absolutely necessary. Now it’s common to start a new project and assume that 50% or more of the code will be Javascript. At ...

Read More Source

March 23rd, 2015

In Technology

No Comments

Does not globally pollute Array, Hash, Object or AR::Base.

Kaminari is Clean. That is listed as its top feature. What does “clean” mean?

“Does not globally pollute Array, Hash, Object or AR::Base.”

Sure this is an argument against Object Oriented Programming? Doesn’t this make plain data structures seem wonderful?

Oh but wait, it fails the “clean” test in one big way:

Modern

The pagination helper outputs the HTML5 tag by default. Plus, the helper supports Rails 3 unobtrusive Ajax.

Embededed HTML! Fun times! Let’s party like its 1999!

Source

March 23rd, 2015

In Technology

No Comments

ActiveRecord scopes

I knew this once, but forgot during the time I have not worked with Rails:

scope(name, body, &block) Link

Adds a class method for retrieving and querying objects. A scope represents a narrowing of a database query, such as where(color: :red).select(‘shirts.*’).includes(:washing_instructions).

class Shirt < ActiveRecord::Base scope :red, -> { where(color: ‘red’) } scope :dry_clean_only, -> { joins(:washing_instructions).where(‘washing_instructions.dry_clean_only = ?’, true) } end

The above calls to scope define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red, in effect, represents the query Shirt.where(color: ‘red’).

You should ...

Read More Source

March 23rd, 2015

In Technology

No Comments

Constraints on routes in Rails

I did not know this:

4.2 Specifying Constraints

You can use the :constraints option to specify a required format on the implicit id. For example: resources :photos, constraints: { id: /[A-Z][A-Z][0-9]+/ }

This declaration constrains the :id parameter to match the supplied regular expression. So, in this case, the router would no longer match /photos/1 to this route. Instead, /photos/RR27 would match.

You can specify a single constraint to apply to a number of routes by using the block form:

constraints(id: /[A-Z][A-Z][0-9]+/) do resources ...

Read More Source

March 22nd, 2015

In Technology

No Comments

I hate dependencies

As an example, I’ll talk about Nokogiri. For years now, every time I have to setup up a Rails project on a new machine, I struggle with the installation of Nokogiri. I usually only do this once or twice a year, which is just enough time for me to forget the details, so I have to go through all the pain again.

Error installing nokogiri Failed to build gem native extension. mkmf.rb can’t find header files ...

Read More Source

March 18th, 2015

In Technology

No Comments

Ruby mixins are powerful

A reminder of Ruby’s mixins powers:

I loosely modeled the BigInteger and Number classes after the Java versions. The BigInteger class defines one constructor and directly inherits one method from the Number base class. To mix in the methods implemented in the Stringify and Math modules with the BigInteger class you will note the usage of the include and extend methods, respectively.

# Create a new object bigint1 = BigInteger.new(10) # Call a method inherited from the base class puts bigint1.intValue # ...

Read More Source

March 16th, 2015

In Technology

No Comments

When strongly stated opinions bring out defensive anger in computer programmers

This reminds me of the reactions I got when I wrote my essay “Object Oriented Programming is an expensive disaster which must end”.

Then he started by banging on everything that didn’t conform to His Way of Doing Things: his process, his tools. Everything else was “stupid,” “dumb,” “moronic.”

I got the impression he was hiding his own fear of inadequacy behind a wall of disapproval and smack talk. I know this method. I used to use it myself, when I ...

Read More Source

March 16th, 2015

In Technology

No Comments

PHP is adding types without breaking backwards compatibility

This remark is very true:

If I were a Python developer (of the language itself), I would be paying very close attention to how PHP has handled deprecation and breaking changes.

and:

There’s been an effort with PHP 7 to try and avoid a Python 2/3-style situation. The PHP 5 to 7 jump should be much smaller than from 4 to 5.

and this about PHP:

I think of it as the English language of programming. Picking and choosing all of the best ...

Read More Source

March 16th, 2015

In Technology

No Comments

CSS media rules for iPads and iPhones

Interesting rules for screening for iPads and iPhones:

/* default styles here for older browsers. I tend to go for a 600px – 960px width max but using percentages */ @media only screen and (min-width:960px){ /* styles for browsers larger than 960px; */ } @media only screen and (min-width:1440px){ ...

Read More Source

March 16th, 2015

In Technology

No Comments

What Rails asset pipeline looks like

It’s interesting to actually look at the paths being managed.

Rails.application.config.assets.paths => [ "/Users/lkrubner/projects/pasha/magstore/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/app/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/app/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/vendor/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/jquery-ui-rails-5.0.3/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/jquery-ui-rails-5.0.3/app/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/jquery-ui-rails-5.0.3/app/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/assets/stylesheets",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/vendor/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/refinerycms-i18n-3.0.0/app/assets/images",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/turbolinks-2.5.3/lib/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/jquery-rails-3.1.2/vendor/assets/javascripts",

"/Users/lkrubner/projects/pasha/magstore/vendor/bundle/ruby/2.1.0/gems/coffee-rails-4.0.1/lib/assets/javascripts" ]

Source

March 16th, 2015

In Technology

No Comments

Functional design patterns

Interesting:

A good talk (~45 min) on this topic by Stuart Sierra:

http://www.infoq.com/presentations/Clojure-Design-Patterns

Not necessarily binding and authoritative, but I recognized a number of his examples from my own experience using FP for data analysis.

Examples written in Clojure, but likely applicable to any FP language. The names he gives to the patterns he covers are:

State/Event Consequences Accumulator Reduce/Combine Recursive Expansion Pipeline ...

Read More Source

March 16th, 2015

In Technology

No Comments

The tech industry reaction against cloud computing

Interesting:

When Matt and Quin founded Swiftype in 2012, they chose to build the company’s infrastructure using Amazon Web Services. The cloud seemed like the best fit because it was easy to add new servers without managing hardware and there were no upfront costs.

Unfortunately, while some of the services (like Route53 and S3) ended up being really useful and incredibly stable for us, the decision to use EC2 created several major problems that plagued the team during our first year.

Swiftype’s ...

Read More Source

March 16th, 2015

In Technology

No Comments

Now when confirmation validations fail, the error will be attached to :#{attribute}_confirmation instead of attribute.

Upgrading to Rails 4. I am not sure what this means, so I will leave this note to myself, and come back and read more later.

5.6 Active Model

Rails 4.0 has changed how errors attach with the ActiveModel::Validations::ConfirmationValidator. Now when confirmation validations fail, the error will be attached to :#{attribute}_confirmation instead of attribute.

Rails 4.0 has changed ActiveModel::Serializers::JSON.include_root_in_json default value to false. Now, Active Model Serializers and Active Record objects have the same ...

Read More Source

March 16th, 2015

In Technology

No Comments

Rails adds a lot to the $LOAD_PATH

I guess I knew this but I was still surprised to look and see how many paths there are in one small Rails project.

bundle exec rails c

Loading development environment (Rails 4.1.8)

irb(main):001:0> puts $LOAD_PATH

/Users/lkrubner/projects/pasha/fiit/lib

/Users/lkrubner/projects/pasha/fiit/vendor

/Users/lkrubner/projects/pasha/fiit/app/assets

/Users/lkrubner/projects/pasha/fiit/app/controllers

/Users/lkrubner/projects/pasha/fiit/app/decorators

/Users/lkrubner/projects/pasha/fiit/app/helpers

/Users/lkrubner/projects/pasha/fiit/app/mailers

/Users/lkrubner/projects/pasha/fiit/app/models

/Users/lkrubner/projects/pasha/fiit/app/controllers/concerns

/Users/lkrubner/projects/pasha/fiit/app/models/concerns

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/vendor

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/assets

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/decorators

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/mailers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms_membership-cd49cac06a43/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-settings-3.0.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-settings-3.0.0/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-settings-3.0.0/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-settings-3.0.0/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/extensions/videos/lib

/Users/lkrubner/projects/pasha/fiit/vendor/extensions/videos/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/extensions/videos/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/assets

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-wymeditor-1.0.6/app/decorators

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-acts-as-indexed-2.0.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-acts-as-indexed-2.0.1/app/decorators

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/quiet_assets-1.1.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/seo_meta-2.0.0.rc.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/seo_meta-2.0.0.rc.1/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/pages/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/pages/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/pages/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/pages/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/pages/app/presenters

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/resources/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/resources/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/resources/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/images/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/images/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/images/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/images/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/authentication/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/authentication/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/authentication/app/mailers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/authentication/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/devise-3.4.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/devise-3.4.1/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/devise-3.4.1/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/devise-3.4.1/app/mailers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/jquery-ui-rails-5.0.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/jquery-ui-rails-5.0.3/app/assets

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/vendor

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/assets

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/controllers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/helpers

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/models

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/core/app/presenters

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-i18n-3.0.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/refinerycms-i18n-3.0.0/app/assets

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/turbolinks-2.5.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/jquery-rails-3.1.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/jquery-rails-3.1.2/vendor

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/coffee-rails-4.0.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/actionview-4.1.8/lib/action_view/vendor/html-scanner

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/unicorn-4.8.3

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/uglifier-2.7.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/therubyracer-0.12.1

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/therubyracer-0.12.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/therubyracer-0.12.1/ext

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/sqlite3-1.3.10

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sqlite3-1.3.10/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/spring-1.3.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sdoc-0.4.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/webrat-0.7.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/bundler/gems/refinerycms-11f8d1eeb45e/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/will_paginate-3.0.7/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/truncate_html-0.9.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sass-rails-4.0.5/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sass-3.2.19/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/routing-filter-0.4.0.pre/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/ref-1.0.5/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rdoc-4.2.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/raindrops-0.13.0

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/raindrops-0.13.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rails-i18n-4.0.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rails-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sprockets-rails-2.2.4/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/sprockets-2.12.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/tilt-1.4.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/protected_attributes-1.0.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/nokogiri-1.5.11

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/nokogiri-1.5.11/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/libv8-3.16.14.7

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.7/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.7/ext

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/kgio-2.9.3

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/kgio-2.9.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/jbuilder-2.2.6/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/hike-1.2.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/globalize-4.0.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/friendly_id-5.0.5/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/dragonfly-1.0.7/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/multi_json-1.10.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/warden-1.2.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/responders-1.1.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/orm_adapter-0.5.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/decorators-2.0.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/railties-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/thor-0.19.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/coffee-script-2.3.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/execjs-2.3.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/coffee-script-source-1.9.0/lib

/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.8.5/lib/gems/bundler-1.8.5/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/bcrypt-3.1.10

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/bcrypt-3.1.10/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/babosa-1.0.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/awesome_nested_set-3.0.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/addressable-2.3.7/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/acts_as_indexed-0.8.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/arel-5.0.1.20140414130214/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/activemodel-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/actionmailer-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/mail-2.6.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/mime-types-2.4.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rack-test-0.6.3/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rack-1.5.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/actionview-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/erubis-2.7.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/builder-3.2.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/tzinfo-1.2.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/thread_safe-0.3.4/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/minitest-5.5.1/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-11/2.1.0/json-1.8.2

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/json-1.8.2/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/i18n-0.7.0/lib

/Users/lkrubner/projects/pasha/fiit/vendor/bundle/ruby/2.1.0/gems/rake-10.4.2/lib

/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.8.5/lib

/usr/local/lib/ruby/site_ruby/2.1.0

/usr/local/lib/ruby/site_ruby/2.1.0/x86_64-darwin11.0

/usr/local/lib/ruby/site_ruby

/usr/local/lib/ruby/vendor_ruby/2.1.0

/usr/local/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin11.0

/usr/local/lib/ruby/vendor_ruby

/usr/local/Cellar/ruby/2.1.5/lib/ruby/2.1.0

/usr/local/Cellar/ruby/2.1.5/lib/ruby/2.1.0/x86_64-darwin11.0

Source

March 16th, 2015

In Technology

No Comments

A shell script which turns your OS X laptop into an awesome web development machine

Interesting:

What it sets up

Bundler for managing Ruby libraries Exuberant Ctags for indexing files for vim tab completion Foreman for managing web processes gh for interacting with the GitHub API Heroku Toolbelt for interacting with the Heroku API Homebrew for managing operating system libraries ImageMagick for cropping and resizing images Node.js and NPM, for running ...

Read More Source

March 14th, 2015

In Technology

No Comments

Redis for microservices with Clojure

This is a very good explanation of a microservices system with Clojure and Redis:

I drew a picture of how I wanted to break apart a monolithic application and instead run different parts of the application in separate processes / separate JVMs. The idea was to have a single client for the connection to the Twitter Streaming API and the persistence of the received Tweets in ElasticSearch, plus multiple machines to serve WebSocket connections to the client. For the communication ...

Read More Source

March 14th, 2015

In Technology

No Comments

Rubinius X as the future of Ruby

Interesting:

The internet has caused a fundamental change in general computing, yet many programming languages are solidly centered in the Windows 3.0 era, providing their equivalent to the Windows for Workgroups add-on to enable networking. Unfortunately, Ruby is one of those languages.

To be relevant today, a programming language must provide simple yet powerful facilities for composition and collaboration. A language does not need general immutable state, purely pure functions, or complex type systems, no matter how inferred.

Rubinius X is an ...

Read More Source

March 14th, 2015

In Technology

No Comments

Ruby reinvented to look like Clojure

To be clear, I like everything about Thomas Reynolds “Weird Ruby”:

# The standard "record" that contains information about a file on disk. SourceFile = Struct.new :relative_path, :full_path, :directory, :types # Find a file given a type and path. # # @param [Symbol] type The file "type". # @param [String] path The file path. # @param [Boolean] glob If the path contains wildcard ...
Read More Source

March 14th, 2015

In Technology

No Comments

Ruby concurrency needs microservices but not Elixir

I was initially confused by this essay because of its emphasis on Elixir. The writers just happen to like Elixir, which is fine. I have previously said that Erlang is a work of genius, and the Erlang VM is a work of genius. Building a dynamic language on top of that VM is a great idea, and I would like to work with Elixir in the future.

However, you don’t need Elixir to add concurrency to Ruby. Any concurrency oriented ...

Read More Source

March 14th, 2015

In Technology

No Comments

What to use for Ruby background tasks?

Interesting:

Essentially all three perform the same task, executing background jobs, but go about it differently:

delayed_job uses your SQL database for storage and processes jobs in a single-threaded process. It’s simple to set up but the performance and scalability aren’t great. I would not use delayed_job for systems processing 100,000s of jobs/day.

resque uses redis for storage and processes messages in a single-threaded process. The redis requirement makes it a little more difficult ...

Read More Source

March 12th, 2015

In Technology

No Comments

Relentless sexual assault in tech

I wish I could say this surprised me, but my own female friends have told me stories like this:

Here’s a non-comprehensive litmus test for if your workplace equality efforts are working or not: do they try to give the impression that workplace inequality is “under control?” Everything I have read and seen says sexism is not under control in tech, and that it is in fact wildly out of control. Sexism in tech is not a thing to be kept ...

Read More Source

March 12th, 2015

In Technology

No Comments

Netflix monitors its micro-services

Interesting:

The ability to decompose where time is spent both within and across the fleet of microservices can be a challenge given the number of dependencies. Such information can be leveraged to identify the root cause of performance degradation or identify areas ripe for optimization within a given microservice. Our Mogul utility consumes data from Netflix’s recently open-sourced Atlas monitoring framework, applies correlation between metrics, and selects those most likely to be responsible for changes in demand ...

Read More Source

March 12th, 2015

In Technology

No Comments

Mike MacHenry: Object-oriented programming has one major flaw which is that no one agrees what it really is

Mike MacHenry sums up the problems of OOP. Interesting:

Object-oriented programming has one major flaw which is that no one agrees what it really is. Everyone’s definition seems to be a collection of completely orthogonal ideas, most of which belong equally to some other, non-OOP paradigm. It makes it impossible to to get a clear answer to questions about the topic. To the best of my knowledge, through extensive reading, the best answer I can come up with for what object-oriented ...

Read More Source

March 12th, 2015

In Technology

No Comments

Contracts in Ruby are part of the new style

Much more than PHP or Python, the Ruby community is constantly pulling in new ideas from other programming language, and we see the emergence of new Ruby styles:

# The standard “record” that contains information about a file on disk. SourceFile = Struct.new :relative_path, :full_path, :directory, :types

# Find a file given a type and path. # # @param [Symbol] type ...

Read More Source

March 12th, 2015

In Technology

No Comments

Object-oriented Programming cannot save us anymore

Obviously, I agree with this. See what I wrote earlier todayIs Erlang an Object Oriented Language?.

That promised time when we’d have applications running distributed and concurrently finally has come. Unfortunately, we are not ready: our “current” (i.e., most used) model for concurrency and parallelism, even though might solve the problem, it adds a lot of complexity.

For a better applications, we need a simple and reliable manner to do it. Do you remember above-mentioned features of FP? Pure Functions and ...

Read More Source

March 12th, 2015

In Technology

No Comments

Oracle is completely incompetent

True:

From the release notes: “The old syntax was meant to be only deprecated, but it was accidentally completely removed.”

How could Oracle have possibly “accidentally completely removed” the old syntax for setting a password even though it “was meant to be only deprecated”, without being completely incompetent?

I can not in my wildest imagination come up with a scenario in which a competent developer could possibly “accidentally remove” something like that. If they made such a huge “accident” with that security feature, ...

Read More Source

March 12th, 2015

In Technology

No Comments

Let’s disagree with Micro-Services

I like this:

Anybody who tried to get a number of teams in a large organization to agree on a common technology can sympathize with this. We are all human, and tend to have passionate and strong opinions on technologies we like and hate. Put enough of these strong opinions together, and they tend to cancel each other out, leaving no common ground. This is bad news for the poor architect that needs to pick an approach for a large ...

Read More Source

March 12th, 2015

In Technology

No Comments

9 different package managers

Interesting:

About Leiningen:

Pros

The artifacts are signed!

It simplifies the dependency definition of maven.

It’s easy to publish new artifacts.

It’s easy to learn how it works.

It allows to reuse Java artifacts from other maven repositories.

Cons

It violates the “Single Responsibility” pattern. Same as Maven.

Licenses are not mandatory.

No Mirrors.

I’ve wasted countless hours dealing with version conflicts and dependencies. I want a package manager to get things working, and I don’t care about what that requires. The semantic versioning, in terms of developing a lock ...

Read More Source

March 12th, 2015

In Technology

No Comments

At a certain scale you have to give up on the single, normalized, canonical database

I am surprised this article by Yorick Peterse, attacking MongoDB, got so much attention. The company used to use MySQL and MongoDB, but now they just use PostGres for everything. PostGres is a great technology, and I would always prefer to MySQL. I question the intelligence of a company that uses MySQL, when PostGres is such a good choice. But if a writer tries to compare PostGres and MongoDB, then I have to question their intelligence, since the 2 technologies ...

Read More Source

March 12th, 2015

In Technology

No Comments

Is Erlang an Object Oriented language?

A lot of people have read my essay from October 7th, 2014, “Object Oriented Programming is an expensive disaster which must end“. Many people like the essay, and many people hate the essay. The people who hate the essay often raise the possibility that I am a troll. They also feel that the whole essay should be dismissed based on its mistakes.

I have been meaning to write a second version that fixes all the mistakes of the first. The ...

Read More Source

March 12th, 2015

In Technology

No Comments

Are you sure objects are an improvement of procedural programming?

Interesting:

This question is an endless source of flame wars. Ruby is better than Java because it has dynamic typing, which in turn allows for short, concise source code. Yeah, right, the Java guys say, your programs read fine, but they crash at your customer’s because type checking is left to the runtime. You’ve got it all wrong, the followers of LISP and Clojure say. Object Oriented Programming is an expensive disaster which must end. Don’t you see it’s all about ...

Read More Source

March 3rd, 2015

In Technology

No Comments

What is the right way to use micro-services?

Interesting:

What I find over and over again is that micro-services appeal to leadership more than the developers. This is a somewhat confusing revelation considering micro-services are considered an architectural approach, and project managers are not supposed to fall in love with an architecture (at best, they are weary of it because ‘architecture’ is typically a code word for more boxes and increased cost and time to delivery). And yet.

…Beyond solving the sheer size problem, micro-services promise to solve the ‘different ...

Read More Source

March 1st, 2015

In Technology

No Comments

The problem with the ActiveRecord, as a pattern

Interesting:

The pattern (or one might say the way it is implemented) has several issues:

It (seriously) violates SRP. In a typical implementation of the pattern you will have the following set of methods and properties in every class: Getting the data from database. Instantiating a new instance in memory for inserting it into the database. Saving changes to the database. Loading related entities. Validation. Usually loads of methods (inherited from the base framework class) to deal with all the complexity involved with the above-mentioned methods. Column related ...

Read More Source

March 1st, 2015

In Technology

No Comments

PostgreSQL is great and ORMs suck

Over the last 10 years I think I’ve heard all the arguments for Database Abstractions Layers (DBAL) and I’ve come to hate them. I’ve twice seen data moved from one database to another (from Oracle to MySQL and from MySql to PostGres) but in all cases I was able to write the import/export script in a day or two, so DBAL was never needed. More so, DBAL means giving up on what makes a database unique, and so you throw ...

Read More Source

March 1st, 2015

In Technology

No Comments

The good and the bad of data-types

Interestingly honest to hear someone admit that types are important but not a cure all — this is my few as well:

Not distinguishing abstraction from checking

This is my number-one beef. Almost all languages offer data abstraction. Some languages proceed to build a static checking system on top of this. But please, please, don’t confuse the two.

We see this equivocation used time and time again to make an entirely specious justification of one language or other. We see it used to ...

Read More Source

March 1st, 2015

In Technology

No Comments

How does ActiveRecord work?

Interesting:

Because find(id) is such a common query, the ActiveRecord developers have special-cased it to bypass a lot of the work that would have to be done if you were chaining together conditions or doing more elaborate queries. You can see at line 147 that this simple query is actually cached, and that this cache is checked to see if the query has been executed before.

If not, the query construction begins at line 149, with the chaining of a where clause ...

Read More Source

March 1st, 2015

In Technology

No Comments

What is object oriented programming?

Interesting:

Here is an a la carte menu of features or properties that are related to these terms; I have heard OO defined to be many different subsets of this list.

Encapsulation – the ability to syntactically hide the implementation of a type. E.g. in C or Pascal you always know whether something is a struct or an array, but in CLU and Java you can hide the difference.

Protection – the inability of the client of a type to detect its implementation. ...

Read More Source

March 1st, 2015

In Technology

No Comments

Message passing in computers is flawed because messages can not be trusted

Interesting:

First of all, if you call a random object to ask it a question of any kind, you can get a denial of service in the form of nontermination. This can be mitigated by using an asychronous send or resource limitation, in which case you may get no information about the object.

But it’s worse than this. Even if you ignore DOS and timeout, you might think you could do challenge/response for authentication = “type check” or brand predication. Let’s ...

Read More Source

March 1st, 2015

In Technology

No Comments

The weaker reasons for hating object oriented programming

Interesting:

I didn’t think you were such an OO partisan. If you are, then you will probably find my reasons for despising it (other than the above) to be very touchy-feely, and they are. I think comprehensive OO (occasional OO is fine) is a very poor metaphor for the world, a poor tool for problem solving, and an unnatural way to think. Here are some particulars off the top of my head:

- It accounts poorly for symmetric interaction, such as chemical reactions ...

Read More Source

March 1st, 2015

In Technology

No Comments

Object Oriented Programming is a moving target

OOP zealots are liars. This is the point I made in “Object Oriented Programming is an expensive disaster that must end“:

Because OO is a moving target, OO zealots will choose some subset of this menu by whim and then use it to try to convince you that you are a loser.

Source

March 1st, 2015

In Technology

No Comments

You can call yield in Ruby without an explicit block declared

Very interesting:

Given this:

def a(&block) yield end

def b yield end

Running `a {1+1}` is 4x slower than running `b {1+1}`. I didn’t even know you could yield in a method without an explicit &block parameter. I’ll guess I’ll change my ways then, although I like having the block declared in the method signature so I know ...

Read More Source

March 1st, 2015

In Technology

No Comments

The mania for object oriented programming

Paul Graham says there are 5 reasons why people like object oriented programming, and 3 and half of them are wrong:

I think there are five reasons people like object-oriented programming, and three and a half of them are bad:

Object-oriented programming is exciting if you have a statically-typed language without lexical closures or macros. To some degree, it offers a way around these limitations. (See Greenspun’s Tenth Rule.)

Object-oriented programming is popular in big companies, because it suits the way they ...

Read More Source

March 1st, 2015

In Technology

No Comments

Is static type checking important in software for a bank?

Interesting.

One attitude:

I always thought critical applications like banking needed compile time type checking. Clojure is neat and all, but it’s dynamic.

The counter-argument:

They need quality, trustworthy software. Compile time type checking is a tool that can be used to help get there (but how useful it is in getting there depends on how robust the type system is, and Java’s is not particularly robust).

Clear and concise code that is readily understood, avoids visual noise so that the programmer can focus on ...

Read More Source

March 1st, 2015

In Technology

No Comments

When will WordPress die?

It seems to keep going, but I find it difficult to accept any explanation of why it keeps going:

It won’t happen overnight, but WP-API will dramatically reduce the amount of active PHP code in WordPress, starting with the admin back-end. It will become a JavaScript app that talks to the WP-API sooner than anyone suspects.

Front-end (read: theme) development will change at a slower pace, because rendering HTML on the server side is still the right thing to do for ...

Read More Source

February 25th, 2015

In Technology

No Comments

Does the visitor design pattern need to exist?

What does this sound like to you?

The pattern should be used when you have distinct and unrelated operations to perform across a structure of objects.

Wait a minute, isn’t that… a function? In a language where functions can take functions, I would simply send in a function, right? Maybe a multimethod. I wouldn’t need an interface for the “visitor”, except maybe the interface of the multimethod, right?

The fact that these metaphors are so tortured is certainly a bad sign: ...

Read More Source

February 25th, 2015

In Technology

No Comments

The angry argument against design patterns

The rant:

I tend to come across a lot of code written by people who read up on design patterns and than think they should use them all over the place and the result is the actual code gets buried under tons of interfaces, wrappers and layers and pretty hard to read. That’s a wrong approach to design patterns.

Design patterns exist so that you have a repertoire of useful idioms handy when you come across a problem. But you should ...

Read More Source

February 25th, 2015

In Technology

No Comments

The best argument for design patterns

I do like this:

Given the few items we can hold in working memory simultaneously, it’s no wonder that programming is hard; any interesting programming problem has a multitude of fine-grained parameters and possible alternatives. One way around this limitation is a process known as chunking. Chunking is an encoding strategy where individual elements are grouped into higher-level groups, chunks. While the limit on the number of units still apply, each unit now holds more information.

Patterns are a sophisticated form of ...

Read More Source

February 25th, 2015

In Technology

No Comments

The Leiningen eco-system

This is a nice write up of some of the plugins one can use with Leiningen

Cljfmt At long last, Clojure finally has its own gofmt-like tool, thanks to the ever-industrious @weavejester. Cljfmt both checks (lein cljfmt check) and formats (lein cljfmt fix) your code nicely in adherence to the generally accepted Clojure style rules, and has options for configuration in case you have your own feelings on the subject.

Eastwood Eastwood is a Clojure linter, invoked with lein eastwood. As a general request, ...

Read More Source

February 25th, 2015

In Technology

No Comments

Computers, patterns, humbleness

The most obvious case for patterns:

One such strategy is to share knowledge and base our solutions on what has been known to work well in the past. Since few designs are really novel we often find that previous solutions, at least on a conceptual level, apply to our new problem too…

Patterns incorporate both of these strategies. As software developer and author of a technical book on patterns I obviously find value in the pattern format. And as a psychologist I ...

Read More Source

February 25th, 2015

In Technology

No Comments

What do standard OOP patterns look like in Haskell?

Interesting:

Most software developers are familiar with the OOP motto “everything is an object.” People accustomed to C++ classes often find the Haskell concept of type classes difficult to grasp. Why is it so different?

C++ classes pack functions together with data, which makes it convenient to represent and consume data. Use of interfaces (abstract classes) allow classes to interact by contract, instead of directly manipulating the data in the other class. There exist alternative ways in C++ to accomplish such ...

Read More Source

February 25th, 2015

In Technology

No Comments

Best practice is a misnomer

Interesting:

As one data point on the curve, at any rate, if you were to compete with ITA and chose to write your software in C, they would be able to develop software twenty times faster than you. If you spent a year on a new feature, they’d be able to duplicate it in less than three weeks. Whereas if they spent just three months developing something new, it would be five years before you had it too.

And you know what? ...

Read More Source

February 25th, 2015

In Technology

No Comments

Pair programming is exhausting

This is true. When I work with another programmer, I suddenly have to focus 100%, and interact with someone too, straining the limits of both my technical abilities and my social skills. I can do this for 30 minutes, but if I had to do it all day, everyday, I would be utterly exhausted.

What about the downsides? It’s not all peaches and cream of course – pairing all the time does have some downsides.

Tiring

Pairing can be exhausting. Not everybody thinks ...

Read More Source

February 20th, 2015

In Technology

No Comments

Strings in Python have the wrong number of bytes

It’s an interesting dive into bytes and strings:

The width of a Unicode string differs from the number of characters in it. Fortunately, we can use the POSIX standard function wcswidth to calculate the display width of a Unicode string. We can use this function to rebuild our basic formatting functionality.

Source

February 18th, 2015

In Technology

No Comments

If we sample from a population using a sufficiently large sample size, the mean of the samples will be normally distributed

Interesting:

Suppose that we are interested in estimating the average height among all people. Collecting data for every person in the world is impractical, bordering on impossible. While we can’t obtain a height measurement from everyone in the population, we can still sample some people. The question now becomes, what can we say about the average height of the entire population given a single sample.

The Central Limit Theorem addresses this question exactly. Formally, it states that if we sample from ...

Read More Source

February 18th, 2015

In Technology

No Comments

All GUI toolkits are old

Interesting:

Cocoa is from the 1980s. Qt is from 1991. MFC is from 1992, building upon older technology. AWT is from 1995. Swing is from 1996. GTK+ is from 1997. SWT and wxWidgets just build upon these old toolkits. Windows Forms is maybe the newest, from the early 2000s.

There hasn’t been a widely used UI toolkit created in the past decade, if not longer. The best we’ve seen since then are half-assed UIs built using HTML/CSS/JS, and limited mobile UIs ...

Read More Source

February 18th, 2015

In Technology

No Comments

How to pull in patches from foreign repos

Interesting:

GitHub provides a special pulls remote “namespace” on the upstream repo, so you can add it as a fetch pattern to your .git/config like so:

[remote "upstream"] url = https://github.com/neovim/neovim.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/pull/upstream/*

Then when you `git fetch –all`, you will have ALL pull requests available in your local repo in the local pull/ namespace. To check out PR ...

Read More Source

February 12th, 2015

In Technology

No Comments

Women learning Python

Interesting. Poland is on the list more than any other country. Why is that?

Source