Logo

Who is talking?

Archive

Using Result Combinator Functions in Rust

25 days ago | Pat Shaughnessy: Pat Shaughnessy

Rust’s Result type can help you control your program’s flow by checking for errors in a succinct, elegant way Using Rust for the first time, error handling was my biggest stumbling block. Was this v

How Rust Makes Error Handling Part of the Language

2 months ago | Pat Shaughnessy: Pat Shaughnessy

In Spanish these are all “dedos,” while in Englishwe can distinguish between fingers and toes. Learning a foreign language can be an incredible experience, not only because you can talk to new people, v

Using Rust to Build a Blog Site

3 months ago | Pat Shaughnessy: Pat Shaughnessy

Rust comes with batteries included (source: Wikimedia Commons) After “Hello World,” blog sites a

Hello blog reader

4 months ago | Pranav Modi: pranavmodi.com

Hello there! Advertisements

Frameworks and Why (Clojure) Programmers Need Them

4 months ago | Daniel Higginbotham: Flying Machine Studios

It seems like there's a strong aversion to using frameworks in the Clojure community. Other languages might need frameworks, but not ours! Libraries all the way, baby! This attitude did not develop without reason. Many of us came to Clojure after getting burned on magical frameworks like Rails, where we ended up spending an inordinate amount of time coming up with hacks for the framework's shortcomings. Another "problem" is that Clojure tools like Luminus and the top-rate web dev libraries it bundles provide such a productive experience that frameworks seem superfluous. Be that as it may, I'm going to make the case for why the community's dominant view of frameworks needs revision. Frameworks are useful. To convince you, I'll start by explaining what a framework is. I have yet to read a definition of framework that satisfies me, and I think some of the hate directed at them stems from a lack of clarity about what exactly they are. Are they just glorified libraries? Do they have to be magical? Is there some law decreeing that they have to be more trouble than they're worth? All this and more shall be revealed. I think the utility of frameworks will become evident by describing the purpose they serve and how they achieve that purpose. The description will also clarify what makes a good framework and explain why some frameworks end up hurting us. My hope is that you'll find this discussion interesting and satisfying, and that it will give you a new, useful perspective not just on frameworks but on programming in general. Even if you still don't want to use a framework after you finish reading, I hope you'll have a better understanding of the problems frameworks are meant to solve and that this will help you design applications better. Frameworks have second-order benefits, and I'll cover those too. They make it possible for an ecosystem of reusable components to exist. They make programming fun. They make it easier for beginners to make stuff. Last, I'll cover some ways that I think Clojure is uniquely suited to creating kick-ass frameworks. (By the way: I've written this post because I'm building a Clojure framework! So yeah this is totally my Jedi mind trick to prime you to use my framework. The framework's not released yet, but I've used it to build Grateful Place, a community for people who are into cultivating gratitude, compassion, generosity, and other positive practices. Just as learning Clojure makes you a better programmer, learning to approach each day with compassion, curiosity, kindness, and gratitude will make you a more joyful person. If you want to brighten your day and mine, please join!) What is a Framework? A framework is a set of libraries that: Manages the complexity of coordinating the resources needed to write an application... by providing abstractions for those resources... and systems for communicating between those resources... within an environment... so that programmers can focus on writing the business logic that's specific to their product I'll elaborate on each of these points using examples from Rails and from the ultimate framework: the operating system. You might wonder, how is an OS a framework? When you look at the list of framework responsibilities, you'll notice that the OS handles all of them, and it handles them exceedingly well. Briefly: an OS provides virtual abstractions for hardware resources so that programmers don't have to focus on the details of, say, pushing bytes onto some particular disk or managing CPU scheduling. It also provides the conventions of a hierarchical filesystem with an addressing system consisting of names separated by forward slashes, and these conventions provide one way for resources to communicate with each other (Process A can write to /foo/bar while Process B reads from it) - if every programmer came up with her own bespoke addressing system, it would be a disaster. The OS handles this for us so we can focus on application-specific tasks. Because operating systems are such successful frameworks we'll look at a few of their features in some detail so that we can get a better understanding of what good framework design looks like. Coordinating Resources Resources are the "materials" used by programs to do their work, and can be divided into four categories: storage, computation, communication, and interfaces. Examples of storage include files, databases, and caches. Computation examples include processes, threads, actors, background jobs, and core.async processes. For communication there are HTTP requests, message queues, and event buses. Interfaces typically include keyboard and mouse, plus screens and the systems used to display stuff on them: gui toolkits, browsers and the DOM, etc. Specialized resources are built on top of more general-purpose resources. (Some refer to these specialized resources as services or components.) We start with hardware and build virtual resources on top. With storage, the OS starts with disks and memory and creates the filesystem as a virtual storage resource on top. Databases like Postgres use the filesystem to create another virtual storage resource to handle use cases not met by the filesystem. Datomic uses other databases like Cassandra or DynamoDB as its storage layer. Browsers create their own virtual environments and introduce new resources like local storage and cookies. For computation, the OS introduces processes and threads as virtual resources representing and organizing program execution. Erlang creates an environment with a process model that's dramatically different from the underlying OS's. Same deal with Clojure's core.async, which introduces the communicating sequential processes computation model. It's a virtual model defined by Clojure macros, "compiled" to core clojure, then compiled to JVM bytecode (or JavaScript!), which then has to be executed by operating system processes. Interfaces follow the same pattern: on the visual display side, the OS paints to monitors, applications paint to their own virtual canvas, browsers are applications which introduce their own resources (the DOM and <canvas>), and React introduces a virtual DOM. Emacs is an operating system on top of the operating system, and it provides windows and frames. Resources manage their own entities: in a database, entities could include tables, rows, triggers, and sequences. Filesystem entities include directories and files. A GUI manages windows, menu bars, and other components. (I realize that this description of resource is not the kind of airtight, axiomatic, comprehensive description that programmers like. One shortcoming is that the boundary between resource and application is pretty thin: Postgres is an application in its own right, but from the perspective of a Rails app it's a resource. Still, hopefully my use of resource is clear enough that you nevertheless understand what the f I'm talking about when I talk about resources.) Coordinating these resources is inherently complex. Hell, coordinating anything is complex. I still remember the first time I got smacked in the face with a baseball in little league thanks to a lack of coordination. There was also a time period where I, as a child, took tae kwon do classes and frequently ended up sitting with my back against the wall with my eyes closed in pain because a) my mom for some reason refused to buy me an athletic cup and b) I did not possess the coordination to otherwise protect myself during sparring. When building a product, you have to decide how to create, validate, secure, and dispose of resource entities; how to convey entities from one resource to another; and how to deal with issues like timing (race conditions) and failure handling that arise whenever resources interact, all without getting hit in the face. Rails, for instance, was designed to coordinate browsers, HTTP servers, and databases. It had to convey user input to a database, and also retrieve and render database records for display by the user interface, via HTTP requests and responses. There is no obvious or objectively correct way to coordinate these resources. In Rails, HTTP requests would get dispatched to a Controller, which was responsible for interacting with a database and making data available to a View, which would render HTML that could be sent back to the browser. You don't have to coordinate web app resources using the Model/View/Controller (MVC) approach Rails uses, but you do have to coordinate these resources somehow. These decisions involve making tradeoffs and imposing constraints to achieve a balance of extensibility (creating a system generic enough for new resources to participate) and power (allowing the system to fully exploit the unique features of a specific resource). This is a very difficult task even for experienced developers, and the choices you make could have negative repercussions that aren't apparent until you're heavily invested in them. With Rails, for instance, ActiveRecord (AR) provided a good generic abstraction for databases, but early on it was very easy to produce extremely inefficient SQL, and sometimes very difficult to produce efficient SQL. You'd often have to hand-write SQL, eliminating some of the benefits of using AR in the first place. For complete beginners, the task of making these tradeoffs is impossible because doing so requires experience. Beginners won't even know that it's necessary to make these decisions. At the same time, more experienced developers would prefer to spend their time and energy solving more important problems. Frameworks make these decisions for us, allowing us to focus on business logic, and they do so by introducing communication systems and abstractions. Resource Abstractions Our software interacts with resources via their abstractions. I think of abstractions as: the data structures used to represent a resource the set of messages that a resource responds to the mechanisms the resource uses to call your application's code (Abstraction might be a terrible word to use here. Every developer over three years old has their own definition, and if mine doesn't correspond to yours just cut me a little slack and run with it :) Rails exposes a database resource that your application code interacts with via the ActiveRecord abstraction. Tables correspond to classes, and rows to objects of that class. This a choice with tradeoffs - rows could have been represented as Ruby hashes (a primitive akin to a JSON object), which might have made them more portable while making it more difficult to concisely express database operations like save and destroy. The abstraction also responds to find, create, update, and destroy. It calls your application's code via lifecycle callback methods like before_validation. Frameworks add value by identifying these lifecycles and providing interfaces for them when they're absent from the underlying resource. You already know this, but it bears saying: abstractions let us code at a higher level. Framework abstractions handle the concerns that are specific to resource management, letting us focus on building products. Designed well, they enable loose coupling. Nothing exemplifies this better than the massively successful file abstraction that the UNIX framework introduced. We're going to look at in detail because it embodies design wisdom that can help us understand what makes a good framework. The core file functions are open, read, write, and close. Files are represented as sequential streams of bytes, which is just as much a choice as ActiveRecord's choice to use Ruby objects. Within processes, open files are represented as file descriptors, which are usually a small integer. The open function takes a path and returns a file descriptor, and read, write, and close take a file descriptor as an argument to do their work. Now here's the amazing magical kicker: file doesn't have to mean file on disk. Just as Rails implements the ActiveRecord abstraction for MySQL and Postgres, the OS implements the file abstraction for pipes, terminals, and other resources, meaning that your programs can write to them using the same system calls as you'd use to write files to disk - indeed, from your program's standpoint, all it knows is that it's writing to a file; it doesn't know that the "file" that a file descriptor refers to might actually be a pipe. Exercise for the reader: write a couple paragraphs explaining precisely the design choices that enable this degree of loose coupling. How can these choices help us in evaluating and designing frameworks? This design is a huge part of UNIX's famed simplicity. It's what lets us run this in a shell: # list files in the current directory and perform a word count on the output ls | wc The shell interprets this by launching an ls process. Normally, when a process is launched it creates three file descriptors (which, remember, represent open files): 0 for STDIN, 1 for STDOUT, and 2 for STDERR, and the shell sets each file descriptor to refer to your terminal (terminals can be files!! what!?!?). Your shell sees the pipe, |, and sets ls's STDOUT to the pipe's STDIN, and the pipe's STDOUT to wc's STDIN. The pipe links processes' file descriptors, while the processes get to read and write "files" without having to know what's actually on the other end. No joke, every time I think of this I get a little excited tingle at the base of my spine because I am a: This is why file I/O is referred to as the universal I/O model. I'll have more to say about this in the next section, but I share it here to illustrate how much more powerful your programming environment can be if you find the right abstractions. The file I/O model still dominates decades after its introduction, making our lives easier without our even having to understand how it actually works. The canonical first exercise any beginner programmer performs is to write a program that prints out, Wassup, homies?. This program makes use of the file model, but the beginner doesn't have to even know that such a thing exists. This is what a good framework does. A well-designed framework lets you easily get started building simple applications, without preventing you building more complicated and useful ones as you learn more. One final point about abstractions: they provide mechanisms for calling your application's code. We saw this a bit earlier with ActiveRecord's lifecycle methods. Frameworks will usually provide the overall structure for how an application should interact with its environment, defining sets of events that you write custom handlers for. With ActiveRecord lifecycles, the structure of before_create, create, after_create is predetermined, but you can define what happens at each step. This pattern is called inversion of control, and many developers consider it a key feature of frameworks. With *nix operating systems, you could say that in C programs the main function is a kind of onStart callback. The OS calls main, and main tells the OS what instructions should be run. However, the OS controls when instructions are actually executed because the OS is in charge of scheduling. It's a kind of inversion of control, right? 🤔 Communication Frameworks coordinate resources, and (it's almost a tautology to say this) coordination requires communication. Communication is hard. Frameworks make it easier by translating the disparate "languages" spoken by resources into one or more common languages that are easy to understand and efficient, while also ensuring extensibility and composability. Frameworks also do some of the work of ensuring resilience. This usually entails: Establishing naming and addressing conventions Establishing conventions for how to structure content Introducing communication brokers Handling communication failures (the database is down! that file doesn't exist!) One example many people are familiar with is the HTTP stack, a "language" used to communicate between browser and server resources: HTTP structures content (request headers and request body as text) TCP handles communication failures IP handles addressing Conventions The file model is a "common language", and the OS uses device drivers to translate between between the file model and whatever local language is spoken by hardware devices. It has naming and addressing conventions, letting you specify files on the filesystem using character strings separated by slashes that it translates to an internal inode (a data structure that stores file and directory details, like ownership and permissions). We're so used to this that it's easy to forget it's a convention; *nix systems could have been designed so that you had to refer to files using a number or a UUID. The file descriptors I described in the last section are also a convention. Another convention the file model introduces is to structure content as byte streams, as opposed to bit streams, character streams, or xml documents. However, bytes are usually too low-level, so the OS includes a suite of command line tools that introduce the further convention of structuring bytes by interpreting them as characters (sed, awk, grep, and friends). More recently, more tools have been introduced that interpret text as YAML or JSON. The Clojure world has further tools to interpret JSON as transit. My YAML tools can't do jack with your JSON files, but because these formats are all expressed in terms of lower-level formats, the lower-level tools can still work with them. Structure affects composability. The file model's simplicity is what allows it to be the "universal I/O model." I mean, just imagine if all Linux processes had to communicate with XML instead of byte streams! Hoo boy, what a crazy world that would be. Having a simple, universal communication system makes it extremely easy for new resources to participate without having to be directly aware of each other. It allows us to easily compose command line tools. It allows one program to write to a log while another reads from it. In other words, it enables loose coupling and all the attendant benefits. Communication Brokers Globally addressable communication brokers (like the filesystem, or Kafka queues, or databases) are essential to enabling composable systems. Global means that every resource can access it. Addressable means that the broker maintains identifiers for entities independently of its clients, and it's possible for clients to specify entities using those identifiers. Communication broker means that the system's purpose is to convey data from one resource to another, and it has well-defined semantics: a queue has FIFO semantics, the file system has update-in-place semantics, etc. If Linux had no filesystem and processes were only allowed to communicate via pipes, it would be a nightmare. Indirect communication is more flexible than direct communication. It supports decoupling over time, in that reads and writes don't have to happen synchronously. It also allows participants to drop in and out of the communication system independently of each other. (By the way, I can't think of the name for this concept or some better way to express it, and would love feedback here.) I think this is the trickiest part of framework design. At the beginning of the article I mentioned that developers might end up hacking around a framework's constraints, and I think the main constraint is often the absence of a communication broker. The framework's designers introduce new resources and abstractions, but the only way to compose them is through direct communication, and sometimes that direct communication is handled magically. (I seem to recall that Rails worked with this way, with tight coupling between Controller and Views and a lack of options for conveying Controller data to other parts of the system). If someone wants to introduce new abstractions, they have to untangle all the magic and hook deep into the framework's internals, using -- or even patching! -- code that's meant to be private. I remember running into this with Rails back when MongoDB was released; the document database resource was sufficiently different from the relational database resource that it was pretty much impossible for MongoDB to take part in the ActiveRecord abstraction, and it was also very difficult to introduce a new data store abstraction that would play well with the rest of the Rails ecosystem. For a more current example, a frontend framework might identify the form as a resource, and create a nice abstraction for it that handles things like validation and the submission lifecycle. If the form abstraction is written in a framework that has no communication broker (like a global state container), then it will be very difficult to meet the common use case of using a form to filter rows in a table because there's no way for the code that renders table data to access the form inputs' values. You might come up with some hack like defining handlers for exporting the form's state, but doing this on an ad-hoc basis results in confusing and brittle code. By contrast, the presence of a communication broker can make life much easier. In the Clojure world, the React frameworks re-frame and om.next have embraced global state atoms, a kind of communication broker similar to the filesystem (atoms are an in-memory storage mechanism). They also both have well defined communication protocols. I'm not very familiar with Redux but I've heard tell that it also has embraced a global, central state container. If you create a form abstraction using re-frame, it's possible to track its state in a global state atom. It's further possible to establish a naming convention for forms, making it easier for other participants to look up the form's data and react to it. (Spoiler alert: the framework I've been working on does this!) Communication systems are fundamental. Without them, it's difficult to build anything but the simplest applications. By providing communication systems, frameworks relieve much of the cognitive burden of building a program. By establishing communication standards, frameworks make it possible for developers to create composable tools, tools that benefit everybody who uses that framework. Standards make infrastructure possible, and infrastructure enables productivity. In this section I focused primarily on the file model because it's been so successful and I think we can learn a lot from it. Other models include event buses and message queues. I'm not going to write about these because I'm not made of words, ok?!? Environments Frameworks are built to coordinate resources within a particular environment. When we talk about desktop apps, web apps, single page apps, and mobile apps, we're talking about different environments. From the developer's perspective, environments are distinguished by the resources that are available, while from the user's perspective different environments entail different usage patterns and expectations about distribution, availability, licensing, and payment. As technology advances, new resources become available (the Internet! databases! smart phones! powerful browsers! AWS!), new environments evolve to combine those resources, and frameworks are created to target those environments. This is why we talk about mobile frameworks and desktop frameworks and the like. One of the reasons I stopped using Rails was because it was a web application framework, but I wanted to build single page applications. At the time (around 2012?), I was learning to use Angular and wanted to deploy applications that used it, but it didn't really fit with Rails's design. And that's OK. Some people write programs for Linux, some people write for macOS, some people still write for Windows for some reason (just kidding! don't kill me!). A framework is a tool, and tools are built for a specific purpose. If you're trying to achieve a purpose the tool isn't built for, use a different tool. More Benefits of Using Frameworks So far I've mostly discussed how frameworks bring benefits to the individual developer. In this section I'll explain how frameworks benefit communities, how they make programming fun, and (perhaps most importantly) how they are a great boon for beginners. First, to recap, a framework is a set of libraries that: Manages the complexity of coordinating the resources needed to write an application By providing abstractions for those resources And systems for communicating between those resources Within an environment So that programmers can focus on writing the business logic that's specific to their product This alone lifts a huge burden off of developers. In case I haven't said it enough, this kind of work is hard, and if you had to do it every time you wanted to make an application it would be frustrating an exhausting. Actually, let me rephrase that: I have had to do this work, and it is frustrating and exhausting. It's why Rails was such a godsend when I first encountered it in 2005. Frameworks Bring Community Benefits Clear abstractions and communication systems allow people to share modules, plugins, or whatever you want to call framework extensions, creating a vibrant ecosystem of reusable components. If you accept my assertion that an operating system is a framework, then you can consider any program which communicates via one of the OS's communication systems (sockets, the file model, etc) to be an extension of the framework. Postgres is a framework extension that adds an RDBMS resource. statsd is an extension that adds a monitoring resource. Similarly, Rails makes it possible for developers to identify specialized resources and extend the framework to easily support them. One of the most popular and powerful is Devise, which coordinates Rails resources to introduce a new user authentication resource. Just as using Postgres is usually preferable to rolling your own database, using Devise is usually preferable to rolling your own authentication system. Would it be possible to create a Devise for Clojure? I don't think so. Devise is designed to be database agnostic, but because Clojure doesn't really have a go-to framework that anoints or introduces a go-to database abstraction, no one can write the equivalent of Devise in such a way that it could easily target any RDBMS. Without a framework, it's unlikely that someone will be able to write a full-featured authentication solution that you can reuse, and if you write one it's unlikely others would see much benefit if you shared it. I think it's too bad that Clojure is missing out on these kinds of ecosystem benefits. Another subtler benefit frameworks bring is that they present a coherent story for how developers can build applications in your language, and that makes your language more attractive. Building an application means coordinating resources for the environment you're targeting (desktop, mobile, SPA, whatever). If your language has no frameworks for a target environment, then learning or using the language is much riskier. There's a much higher barrier to building products: not only does a dev have to learn the language's syntax and paradigms, she has to figure out how to perform the complex task of abstracting and coordinating resources using the language's paradigms. If your goal is to create a mass-market product, choosing a language that doesn't have frameworks for your target environments is a risky choice. Finally, frameworks become a base layer that you can create tooling for. The introduction of the filesystem made it possible for people to write tools that easily create and manipulate files. Rails's abstractions made it easy to generate code for creating a new database table, along with an entire stack - model, view, controller - for interacting with it. Frameworks Make Development Fun If you still think frameworks are overkill or more trouble than they're worth, believe me I get it. When I switched from Rails to Clojure and its "libraries not frameworks" approach, I loved it. A framework felt unnecessary because all the pieces were so simple that it was trivial for me to glue them together myself. Also, it was just plain fun to solve a problem I was familiar with because it helped me learn the language. Well, call me a jaded millenial fart, but I don't think that this work is fun anymore. I want to build products, not build the infrastructure for building products. I want a plugin that will handle the reset password process for me. I want an admin panel that I can get working in five minutes. Frameworks handle the kind of work that ideally only has to be done once. I don't want to have to do this work over and over every time I want to make something. For me, programming is a creative endeavor. I love making dumb things and putting them in front of people to see what will happen. Rails let me build (now defunct) sites like phobiatopia.com, where users could share what they're afraid of. The site would use their IP address to come up with some geo coordinates and use Google Maps to display a global fear map. A lot of people were afraid of bears. Frameworks let you focus on the fun parts of building an app. They let you release an idea, however dumb, more quickly. Frameworks Help Beginners Frameworks help beginners by empowering them to build real, honest-to-god running applications that they can show to their friends and even make money with, without having to fully understand or even be aware of all the technology they're using. Being able to conjure up a complete creation, no matter how small or ill-made, is the very breath of wonder and delight. (I don't know exactly what this means, but I like how it sounds!) There's a kind of thinking that says frameworks are bad because they allow beginners to make stuff without having to know how it all works. ActiveRecord is corrupting the youth, allowing them to build apps without even knowing how to pronounce SQL. There's another line of thinking that says it's bad to try to make things easier for beginners. It's somehow virtuous for people to struggle or suffer for the sake of learning. Hogwash. Fiddlefaddle. Poppycock. Joy beats suffering every time, and making learning more joyful allows more people to reap the benefits of whatever tool or product you've created. I am a photographer. I have a professional camera, and I know how to use it. Some of my photos require a fair amount of technical knowledge and specialized equipment: tea This isn't something you can create with a camera phone, yet somehow I'm able to enjoy myself and my art without complaining that point-and-shoot cameras exist and that people like them. Novices benefit greatly from expert guidance. I don't think you can become a master photographer using your phone's camera, but with the phone's "guidance" you can take some damn good photos and be proud of them. And if you do want to become a master, that kind of positive feedback and sense of accomplishment will give you the motivation to stick with it and learn the hard stuff. Frameworks provide this guidance by creating a safe path around all the quicksand and pit traps that you can stumble into when creating an app. Frameworks help beginners. This is a feature, not a bug. A Clojure Framework Frameworks are all about managing the complexity of coordinating resources. Well, guess what: Managing Complexity is Clojure's middle name. Clojure "Managing Complexity" McCarthy-Lisp. Personally, I want a single-page app (SPA) framework, and there are many aspects of Clojure's design and philosophy that I think will make it possible to create one that seriously kicks ass. I'll give just a few examples. First, consider how Linux tools like sed and awk are text-oriented. Developers can add additional structure to text by formatting it as JSON or YAML, and those text-processing tools can still work the structured text. In the same way, Clojure's emphasis on simple data structures means that we can create specialized structures to represent forms and ajax request, and tools to process those structures. If we define those structures in terms of maps and vectors, though, we'll still be able to use a vast ecosystem of functions for working with those simpler structures. In other words, creating specialized structures does not preclude us from using the tools built for simpler structures, and this isn't the case for many other languages. Second, Clojure's abstraction mechanisms (protocols and multimethods) are extremely flexible, making it easy for us to implement abstractions for new resources as they become available. Third, you can use the same language for the frontend and backend!!! Not only that, Transit allows the two to effortlessly communicate. This eliminates an entire class of coordination problems that frameworks in other languages have to contend with. In my opinion, the Clojurian stance that frameworks are more trouble than they're worth is completely backwards: Clojure gives us the foundation to build a completely kick-ass framework! One that's simple and easy. One can dream, right? My ambition in building a SPA framework is to empower current and future Clojure devs to get our ideas into production fast. I want us to be able to spend more time on the hard stuff, the fun stuff, the interesting stuff. And I want us to be able to easily ship with confidence. The framework I'm building is built on top of some truly amazing libraries, primarily Integrant, re-frame, and Liberator. Integrant introduces a component abstraction and handles the start/stop lifecycle of an application. re-frame provides a filesystem and communication broker for the frontend. Liberator introduces a standard model for handling HTTP requests. If my framework is useful at all it's because the creators of those tools have done all the heavy lifting. My framework introduces more resources and abstractions specific to creating single-page apps. For example, it creates an abstraction for wrapping AJAX requests so that you can easily display activity indicators when a request is active. It creates a form abstraction that handles all the plumbing of handling input changes and dispatching form submission, as well the entire form lifecycle of fresh, dirty, submitted, invalid, succeeded, etc. It imposes some conventions for organizing data. As I mentioned, the framework is not quite ready for public consumption yet becaause there's still a lot of churn while I work out ideas, and because there's basically no documentation, but I hope to release it in the near future. If you'd like to see a production app that uses the framework, however, I invite you to check out Grateful Place, a community site for people who want to support each other in growing resilience, peace, and joy by practicing compassion, gratitude, generosity, and other positive values. By joining, you're not just helping yourself, you're helping others by letting them know that you support them and share their values. Please click around and look at the snazzy loading animations. And if you feel so moved, please do join! I love getting to interact with people in that context of mutual support for shared values. One of the only things I care about more than Clojure is helping people develop the tools to navigate this crazy-ass world :D In the mean time, I'll keep working on getting this framework ready for public consumption. Expect another blawg article sharing some details on how Grateful Place is implemented. Then, eventually, hopefully, an actual announcement for the framework itself :) If you don't want to wait for my slow butt, then check out some ofthe amazing Clojure tools that already exist: Luminus Fulcro which probably does everything I want my framework to, only better re-frame remains my favorite frontend framework duct is great but its docs aren't that great yet Coast on Clojure, a full stack web framework (Sorry if I neglected your amazing Clojure tool!) Thanks to the following people who read drafts of this article and helped me develop it: Mark Bastian Dmitri Sotnikov aka @yogthos Joe Jackson Sergey Shvets Kenneth Kalmer Sean whose last name I don't know Tom Brooke Patrick whose last name I don't know (update: It's Patrick French!) Fed Reggiardo Vincent Raerek Ernesto de Feria Bobby Towers Chris Oakman The TriClojure meetup

Verify your website accessibility

6 months ago | Sumit Bajaj: Sumit Bajaj's Blogs

Web accessibility is the practice of ensuring that your website is interactive and accessible to even people with disabilities. Many countries provide laws protecting the rights of disabled persons, therefore it becomes really important to design and develop the website in compliance with those laws and follow web accessibility as de-facto.The blog helps to test your web accessibility.1. Open chrome browser and browse any website. Open developer tools and click on Audit tab. Scroll to Audits section and check the 'Accessibility' option.Web accessibility check in Chrome browser2. Once you click on 'Run audits' button, you will see a message(as shown below). Don't worry, auditing has started.Starting auditing of website3. Once audit is completed, it will generate audit report(as shown below)Audit report for web accessibilityHave a great day !!

Buddy Systems at Work: a Framework for Rewarding Relationships on Remote Teams

6 months ago | Daniel Higginbotham: Flying Machine Studios

One of my work mottos is "support the hell out of each other": helping your friends grow and succeed is far more rewarding than chasing after the next gold star for yourself. While I was at Reify Health I was lucky enough to work with other devs who had a similar ethos. There were no rock stars, and everyone looked out for each other. I'm happy to have gotten to work somewhere where I made real, honest-to-god friends :) During my final weeks there I collaborated with coworkers on an experimental framework for supporting each other in a formal context. This framework would let us explore how to be there for each other in more meaningful ways while maintaining boundaries. This seemed particularly valuable in Reify's mostly-remote environment. With their permission, I'm sharing the initial framework proposal below: The Buddy System This doc outlines a proposal for a buddy system. The main idea behind the buddy system is for us to support each other by regularly spending time chatting with each other about things beyond whatever story is at hand. Exactly what that looks like will be up to you; this doc includes suggestions for how to have rewarding conversations. First, here are some ground rules: Ground Rules It’s confidential. Whatever you talk about remains between you and your buddy unless you say otherwise. This is meant to provide each other with time and space to speak about what’s going on :D It’s completely voluntary. You don’t have to participate, and if you do participate you can shape it however you want to: the frequency and content of chats is up to you. You can opt out or change buddies whenever you want. If you decide to drop out of the buddy system, it’s totally up to you if you want to explain why, or not. The buddy system is meant to consciously cultivate a space where we can be vulnerable with each other; part of making that safe is setting the expectation that people can opt out without having to explain why. By the same token, in joining the buddy system you accept that your buddy may at some point wish to opt or change buddies, and you commit to try to not take that personally if it happens 👍 Every three months we’ll change buddies - this gives us a chance to grow together, and also a chance to keep getting new perspectives by buddying with other folks on the team. There’s no impact on your yearly review. Though “Buddy System” would be a wonderfully Orwellian name for a mandatory chatting initiative. It’s reciprocal. Buddies commit to listening to and sharing with each other. If you feel like you have room to grow with listening or sharing, that’s totally cool - and a good first step is to share that with your buddy :) It’s not hierarchical. Being a Buddy means whole-hearted listening, asking questions, and just being supportive, which is independent of any junior or senior designations. The point is to support each other as human beings, not to meet project objectives :-) Suggestions Tell your buddy what you want to get out of the buddy system. Do you want to talk about your career? Your goals at Reify? How to improve our architecture? By letting your buddy know what you’re looking for, you can get all Jerry Maguire and help them help you. Listen your asses off. Avoid the urge to give advice unless asked for it, but instead try to truly understand what your buddy is saying, and try to help them gain clarity. Potential topics include goal-setting and “life at Reify.” Goal setting: It can be very useful to talk to someone about your broader goals and to have them hold you accountable. Sharing a goal often makes it more meaningful and gives you more motivation to reach it. Life at Reify: We have retros, which are useful, but regular one-on-one conversations also have a place in supporting each other These topic suggestions are not meant to be exhaustive. When asking for feedback, communicate what kind of feedback you want: A pat on the back High-level feedback Nitty-gritty feedback Notes Daniel is acting as facilitator in that he’s organizing discussion about the Buddy System so that we all come to a shared understanding of what it is and what we want to get out of it. However, Daniel isn’t, like, the Buddy System’s owner, and can’t tell you what to do. Some reading this might be uncomfortable with the ideas outlined in the buddy system - and that's totally ok! A key part of the framework is you don't have to buy into it. But I think it speaks volumes about the level of trust and mutual good feeling among the team that almost everyone was excited about it while respecting that we're all different and not everyone prefers the same way of interacting. On the other hand, new hires were especially excited because they felt like it would help them acclimate to their new environment. To me, a team that is enthusiastic about these ideas is a team that I'd want to work with; it's a team that actually likes the idea of relating to each other on a real, human level. One topic that came up was, how is this different from just being friends? Is it really necessary to have a structure that everyone agrees to? Does that bring an element of artifice into friendship? My thinking is that structure is a precondition for vulnerability. Structure tells us to be extra mindful in how we interact with each other, and it provides boundaries (like a clear time limit) to protect us from getting overwhelmed. By designating a time and place to consciously interact with each other, it also resolves the problem of never knowing when is "the right time" to bring something up. This would be helpful for new hires, sure, but even in my personal life I've found that structure is much better at fostering deeper interactions than just winging it. Knowing that everyone is "in it" together and that "it" won't last forever provides a solid foundation for trust. Final note: vulnerability here does not mean you have to spill your guts, emotionally leaking on each other all the time. It does mean feeling safe to express that you're struggling or that you feel dissatisfied or hurt in some way. What are your thoughts? Have you tried something like this where you worked, and how did it go? P.S. Reify is hiring!

Grow faster by making yourself redundant!

7 months ago | Subodh Gupta: Subodh's Blog

Redundant! but why? What about job security? Shouldn't we be consolidating our position instead of going redundant? All these questions are obvious when you read the title of this article. Don't worry, we are not talking about how to get yourself fired but opposite, how to grow faster by making yourself redundant in a role. In a job, we are expected to play roles that are needed from us e.g. program manager, project manager, people manager, technical lead are few roles engineering managers play to be successful. This article talks about how we can progressively outgrow in our current role and start learning (or mastering) the new roles. Transferring responsibilities to people you are managing is the best way of making space for learning something new. Over the past couple of years as a engineering manager, I have been following this philosophy to learn new things. Let's take an example about leading a project to understand this better.Engineering Managers are the backbone of the team. However, they are also the weakest link in the team, often they are the single point of failure. Team rely on them to take crucial decisions. In normal situation nothing is wrong with this arrangement but when they are away (in conferences, multi-day-meetings, holidays or sick) projects gets derailed due to decrease in decision making velocity and lack of process ownership in the team.If EM spends too much time on project execution, they won't have enough time for people (call it 100% harvesting and no investing). In my experience, time spent on people is directly proportional to the happiness of the team which has a flywheel effect on deliverables. On the other hand, unhappy teams leads to lower development velocity and error prone deliverables, which results in managers spending more time on execution.This cycle leads to burnout in managers and also results in unhappy teams which has domino effect on deliverables (poor in both quantity and quality). To avoid this situation most important step for the managers is to automate the execution and funnel more-time in people management and product planning. However, it's not a trivial task and involves rolling out well-orchestrated process changes in small implement-and-improve iterations. For me it took 6 months to achieve a sustainable execution model.This article will take you through the journey of "making myself redundant".Phase 1: "Doing all the things an EM should be doing! Well, I want to change it!" Identifying delegation worthy responsibilities! Question: What are responsibilities my team can own and run?Planning? Retrospective? They do it fortnightly hence have a very good understanding which means they can be independent on this quite quickly.Question: Who should own it? Do we need a new role? What should be responsibilities of this new role?Probably we need a feature/project lead. Who should be a Lead?A Team member.Why don't I ask my team, what they think they should be doing as a Lead?Time for brainstorming: We as a team gathered in a room and listed responsibilities which will be owned by the lead. E.g. updating the project status, finalizing implementation approach, sprint planning,retro, demos (team rotates these) etc. Point worth noting, we didn't define everything, like how to manage external dependencies or how to distribute work. The plan was to start with something small and keep on increasing the responsibilities over the period of time. Why not define comprehensive roles and responsibilities? Defining clear R&R in one go is very easy and leads to very clear paths however it also means decoupled roles which is recipe for disaster when you starting something this big. We can compare it with athlete training, they can't run marathon in first week but distance is increased gradually over a sustainable time-period. Similarly, we decided on some base responsibilities with adequate checks in place e.g. leads can always reassign part or whole of responsibility to me (EM) at any moment after discussion.Is this a good model?There are multiple ways a lead can be trained onto new responsibilities:Coach a lead on everything before handing over the responsibility "Throw them in water and let them learn how-to-swim" give them responsibility and let them ask for help.Start small take a step at a time, keep on adding responsibilities. I personally like the third option as it leads to sustainable handover where everyone gets the time to adjust and iterate.Phase 2: "Attending all the team meetings as a participant."Feature lead is starting to onboard on new responsibilities and taking ownership more and more meetings. However, it will start eating into the capacity of the lead which could be a problem. So, apart from defining some basic responsibilities, we also finalized on a rule "lead should start with 20% time on leading". The idea here is to increase the responsibility and not to make them unproductive.The right mix!As discussed above, listing role and responsibilities helps, however it can also be over-prescriptive. Agreeing on "What needs to be done", "When it needs to be done" in important whereas "How" can be left open.Ask pointed questions, to make sure things are on track, it will surface the trade-offs and flaws.  Follow five Whys approach if and needed.Phase 3: "Coaching the lead!"As lead is taking responsibilities, start spending more time with them to make sure they understand why we are doing something instead of just doing it for the sake of it. This will lead conversations on "why this and not that", addressing these questions is like laying the foundation of the leadership, answering every question sincerely will help in developing a good leader for your team.Healthy team is build on healthy processes"Processes are the building blocks of trust in a team". "Teams who learn to rely on each-other can solve any problem". "If we can define a problem, we can solve it and if we can solve it once, we should solve it efficiently the next time".Healthy team need lightweight (healthy) processes to make sure everything runs smoothly. You can rely on the team and processes to take care of everything.Phase 4:"Give up the power, not the control!"The last piece of the puzzle is patience.Following meetings if well run can help a lot:PlanningStand-upRetrospectivesHealth-monitors SWOTIf teams is not happy and motivated you can't deliver anything worthwhile. Listening to the team's concerns is the easiest way to address the problems. If team is raising a concern it should be fixed, don't apply filters without understanding the problem first. Team will always be motivated if you remove (or help them remove) the impediments, remember motivation is key to the successful delivery. I believe the most important part of my job is to keep the team motivated. I get the real sense of how we are doing as a team from the meetings listed above.Right Now!Phase 5: "Close to doing nothing related to a project execution! \o/Focus on long-term strategy and career planning for the team!"We successfully delivered the project without delay, covering more than we anticipated and removing all the major blockers we faced.As an EM, I need to be do something to keep my anxiety in check.So, I am making sure:Scope is fixed Team stays away from distractions Focus on one thing at a time, minimize context switching Taking discussions irrelevant to the team away from them Address action items on priorityGiving away your responsibilities is not easy and people would be making mistakes like you did when you started. However, how to make this learning rewarding is the challenge. Remember you are learning as much as the other person, you are learning to be patience, you are learning to give away control, you are learning to diagnose problems early, so much learning is involved in this process. These are the building blocks of being a leader, if you can't delegate you can't scale.In the end, learning is an essential part of the growth for everyone. Focus on growing people in your team for the unforeseen results. Encouraging leadership in your team is the best way of growing your team.Try being redundant, its addictive!

Creating and Installing Sitecore Packages

10 months ago | Sumit Bajaj: Sumit Bajaj's Blogs

Creating and Installng Sitecore PackageCreate Sitecore Package1. Open Sitecore(from where you would like to create package) and click on Package Designer2. Once Package designer panel is opened, click on Item statically and provide all required details as shown below3. After clicking on 'Item statically' option, a popup will open. Choose selected items and click on 'Add with SubItems' or 'Add Items' buttons    a. clicking on 'Add Item' will only include selected item and not child items    b. clicking on 'Add with subitems' will include selected Item and its child items4. Click on 'Generate Zip' option which will generate the package in .zip format5. Download the .zip file of sitecore package by clicking on download buttonInstalling Sitecore Package1. Open Sitecore (instance where you would like to install package) and click on 'Installation Wizard'2. upload the .zip package to install and click next to install3. During install, Sitecore popup will appear for inputsa. Override - This option replace the entire subtree with the subtree in the package. You have to be very careful while selecting Override option as it may delete all child items if you have not added the Item with child items while creating package. b. Merge - This is safe option which will find the matching items and versions with those from the package but do not replace any subitemsPlease feel free to post your comments in case you see any concerns or like to thank you :).

Summer School With The Rust Compiler

about 1 year ago | Pat Shaughnessy: Pat Shaughnessy

(source: Steve Klabnik via Twitter) A few months ago, I saw this tweet from Steve. I'm not even sure what "derridean

Quick Tutorial - Setup a Solr instance

over 1 year ago | Sumit Bajaj: Sumit Bajaj's Blogs

Before we start installing Solr instance on any machine, we should be clear on few concepts.What is Solr?Solr is Apache's product and a fast open-source Java search server.Why we need it?Solr enables you to easily create search engine for websites, databases and files.How can we install it?You can download any version of Solr from http://archive.apache.org/dist/lucene/solr/. Steps to install after it is downloaded-Extract the downloaded Solr package and copy it on C or D drivePlease make sure latest version of Java is installed on machine. You can start Solr instance by below command: java -jar start.jarBy default, Solr will run on port 8983. However you can change it ../etc/Jetty.xml file. Look for <set name="port"><SystemProperty name="jetty.port" default="8983"></set> and change it.You can keep the below command in .bet file and run it automatically. "C:\solr-6.1.0\bin\solr" restart -h localhost -p 8984Please feel free to send email for any help.

From ActiveRecord to Diesel

over 1 year ago | Pat Shaughnessy: Pat Shaughnessy

Learning something new every day is exercise for your mind. (source: Jeremy Bowcock via Wikimedi

Could not load file or assembly 'Microsoft.Web.Infrastructure'

almost 2 years ago | Sumit Bajaj: Sumit Bajaj's Blogs

Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.What 'Micorosoft.Web.Infrastructure' does?This dll lets HTTP modules register at run time.Solution to above problem:Copy 'Micorosoft.Web.Infrastructure' dll in bin folder of your project and this problem should be resolved. If you have .Net framework installed on machine, this dll should be present on it. You can search for this dll and copy it in your active project folder.  Alternatively, you can install this dll using nuget package managerPM> Install-Package Microsoft.Web.Infrastructure -Version 1.0.0Happy coding!!

Learning Rust: If Let vs. Match

almost 2 years ago | Pat Shaughnessy: Pat Shaughnessy

Human languages have similar words with different shades of meaning. Some computer languages do too. (from: Wikimedia Commons

The Death of Microservice Madness in 2018

almost 2 years ago | Dave Kerr: dwmkerr.com

There are cases where great efforts have been made to adopt microservice patterns without understanding the specifics of the problem at hand...

Effective Shell Part 3: Getting Help

almost 2 years ago | Dave Kerr: dwmkerr.com

In this article I'll show you how to quickly get help when working with tools in the shell, without disrupting your flow!

Looking Inside Postgres at a GiST Index

almost 2 years ago | Pat Shaughnessy: Pat Shaughnessy

What do Postgres GiST indexes look like? How are they similar or different from standard Postgres indexes? In the last few posts in this series (http://patshaughnessy.net/2017/12/11/trying-to-represe

Manipulating Trees Using SQL and the Postgres LTREE Extension

almost 2 years ago | Pat Shaughnessy: Pat Shaughnessy

Yesterday, I used the LTREE extension to save a tree data structure

Saving a Tree in Postgres Using LTREE

about 2 years ago | Pat Shaughnessy: Pat Shaughnessy

In my last post, I showed you how to install and enable a Postgres extension called https://www.postgresql.org/docs/current/stati

Installing the Postgres LTREE Extension

about 2 years ago | Pat Shaughnessy: Pat Shaughnessy

Hidden inside of your Postgres server is code that provides special SQL operators and functions designed to support tree operations. It’s called the LTREE exte

Trying to Represent a Tree Structure Using Postgres

about 2 years ago | Pat Shaughnessy: Pat Shaughnessy

Suppose you had a hierarchical data structure in your application - how would you save it in a database? How would you represent a complex tree structure using flat rows and columns? There are a few different, equally valid

Integrating OpenShift and Splunk for Docker Container Logging

about 2 years ago | Dave Kerr: dwmkerr.com

In this article I'm going to show you how to set up OpenShift to integrate with Splunk for logging in a Docker container orchestration environment. These techniques could easily be adapted for a standard Kubernetes installation as well! Screenshot: Counter service splunk The techniques used in this article are based on the Kubernetes Logging

Effective Shell Part 2: Become a Clipboard Gymnast

about 2 years ago | Dave Kerr: dwmkerr.com

In this article I'll show you how you can use the shell as an efficient tool to compliment how you use the clipboard.

Effective Shell Part 1: Navigating the Command Line

over 2 years ago | Dave Kerr: dwmkerr.com

Text in the command line can quickly get unwieldy. Here are some simple tricks you can use to navigate in the command line.

Promises, Async and Await in Node.js

over 2 years ago | Rocky Jaiswal: Still Learning

This week we had the much awaited Node.js 8.0.0 release! Node is getting faster and better all the time. This release also makes the async / await feature available natively. But before we look at async / await let us quickl ...

A utility to help you wait for ports to open

over 2 years ago | Dave Kerr: dwmkerr.com

There are occasions where you might need to have scripts or commands which wait for TCP/IP ports to open before you continue. I've come across this need again and again when working with microservices, to make my life easier I've created a little utility called wait-port which will wait

Engineering Leader: How to make a difference?

over 2 years ago | Subodh Gupta: Subodh's Blog

Being an engineering leader is not an easy task, especially when you are stepping into this role as a first-timer. Seldom you go through a training, however in most situations you are expected to figure it out yourself with little or no guidance. Often leadership demands you to play following roles:People ManagerProduct/Business knowledgeArchitect/Senior DeveloperVision for technologyI will be writing separate blogs to cover the first two roles. For a beginner, last two roles are very important to gain credibility of the team which is the most important factor in succeeding at your job.As a technical leader, you will be facing the challenges from all the directions like decision making, improving team efficiency and choosing the technology roadmap for your team. However, I hope adopting following patterns can help you sail through these challenges.Decision Making: When hit with the problem, as a techie you rely on your technical skills and often start suggesting solutions immediately which is fine in few situations, however in my experience better way would be to ask pointed questions to lead your team in driving the right decision. Questions should be repeatedly asked to highlight the blemishes in the suggested design. For example, "How would you take care of security?", "How are you addressing scalability?", "How would application behave under these circumstances?" and many more.It's easier to jump to the solution by picking up the first suggestion by trusting the loudest (not literally) person in the room. However, as a coach, you should be involving everyone in the decision-making process. Find out what is missing in the room, is it the knowledge, the skill or the participation. You need to create enough opportunities for everyone to participate. To do that you need to think about various factors like structure of the team, personalities in the team etc. These factors can be neutralized to an extent by bringing everyone to a common understanding of the problem. In my experience, following preparation before hosting an important meeting would make it easier:Share a document explaining the problem which can educate the team before the discussionDuring the meeting, explain the problem in detail so that team can align their understandingDo your homework before going to the meeting. This will help you in asking the right questions and guiding the meeting towards the solution. Improving Efficiency: Team delivers to the full potential if they are not disturbed and allowed to focus on the problem. As a leader, think about how the team is getting distracted, how can you make them focus on stories or task in hand? Improve the development processes so that you can minimize the impact on the team. For example, in a production issue churn out the non-technical part and direct developer towards solving the technical problem.Vision for Technology: Successful teams stay ahead of the technology curve. As a coach, you need to ensure that your team is adapting to changing landscape of the technology world. While working with your team to strengthen the technology muscle, you need to start focusing on what should be the future technology platform for your team. If you are not thinking at least 3-months down the line, you will lose the war while you were busy fighting battles.Be sensitive to what role you are playing in your team. You are not a developer anymore, you are a coach and coaching means understanding before suggesting, listening before speaking, advising rather than commenting.As a beginner, starting in the world of unknown unknowns of management, I hope my secret sauce can help you prepare the right dish for your team!!!

Techniques for Efficiently Learning Programming Languages

over 2 years ago | Daniel Higginbotham: Flying Machine Studios

Learning programming languages is a skill: do it well and you'll experience one dopamine hit after another as you master something new; do it poorly and you'll feel constantly frustrated and even give up. What follows are the best techniques for learning programming languages that I've picked up over years of teaching programming by writing books and articles, doing talks, and running a training course. Many of these techniques are pulled from books explaining the latest research in efficient learning, and you can find those books (along with other great programming books) at Community Picks: Learn Programming. Test Yourself Constantly to Defeat The Illusion of Competence One of the worst ways to learn is to re-read or re-watch material. This kind of review gives you the feeling that you understand the topic covered because it seems like you're understanding the topic effortlessly. Researchers call this the illusion of competence. A significantly better approach (and one of the best techniques you can employ) is to test yourself constantly. Instead of re-reading what a function or class or object is, ask yourself to define these concepts or use them in a short program; force yourself to somehow demonstrate your understanding. This process often feels uncomfortable, but it's much more efficient at forming long term memories. You can take this one step further and test yourself before you've covered the material by, for example, attempting exercises before reading a chapter. Remarkably, this has also been shown aid memory formation. The impressive impact that testing has on learning is called the testing effect, and here are some specific ways you can take advantage of it: Before reading a chapter or watching a video, try guessing at what you're about to learn and write it down. Try doing a chapter's exercises before reading the chapter. Always do exercises, even the hard ones. It's OK to give up on an exercise and come back to it later (or never, even), but at least try it. (More on this in the next section.) Read a short program and try to recreate it without looking at the original code. Or, go smaller and do this with a function. Immediately after learning a new concept like objects, classes, methods, or higher-order functions, write code that demonstrates that concept. Create diagrams that illustrate concepts, both in isolation and how they relate to each other. Blog about a concept you just learned. Try explaining the concept to a non-technical friend. (I did this a lot when writing Clojure for the Brave and True; being able to explain an idea in layman's terms forces you to understand the idea deeply.) Many of these techniques boil down to write some code! With programming it's easy to believe we're learning a lot just by reading because programming is text-heavy and conceptual. But it's also a skill, and like any other skill you have to perform it to get better. Writing code is the best way to reveal your incorrect assumptions about programming. The faster you do that, the faster you can make corrections and improve. If you'd like to learn more about the testing effect, check out make it stick: The Science of Successful Learning. Take Time to Unfocus If you're stuck on a problem or don't understand something you just read, try taking a walk or even a shower -- anything to enter a relaxed, unfocused state of mind. It probably seems counterintuitive that one of the best ways to get unstuck is to stop trying for a little while, but it's true. The problem is that it's easy for us to put on mental blinders when we're focusing hard on a problem. I mean, that's pretty much what "focus" means. But by focusing hard, we're exploring only a small portion of the solution space. By unfocusing, our unconscious mind is able to explore and make connections across vast swaths of our experience. To me it's like when you're trying to find a destination on a paper map (remember those?). You can unconsciously become convinced that the city you're trying to reach should be right here! in the upper-left qudrant of the map, so you look at it over and over without success. Then you put the map down and take a deep breath and stare at nothing for a minute, and when you look at the map again the actual location jumps out at you immediately. We've all had the experience of having a sudden insight in the shower; now you have a slightly better understanding of why that happens, and you can employ the technique on purpose. Personally, I will actually take a shower if I'm stuck on something, and it's remarkable how well the technique works. And how clean I am. If you'd like to learn more about the focused and diffuse modes of thinking, check out A Mind for Numbers: How to Excel at Math and Science (Even If You FLunked Algebra). Don't Waste Time Being Frustrated Related to the last section: don't waste time being frustrated with code. Frustration leads us into doing stupid things like re-compiling a program or refreshing the browser with the hope that this time it will be magically different. Use frustration as a signal that there's a gap in your knowledge. Once you realize you're frustrated, it can help to take a step back and clearly identify the problem. If you've written some code that's not working, explicitly explain to yourself or someone else the result that you expected. Use the scientific method and develop a hypothesis for what's causing the unexpected behavior. Then test your hypothesis. Try again, and if a solution still eludes you, put the problem aside and come back to it later. I can't tell you how many times I've thrown my laptop in disgust over a seemingly unsolvable problem, only to look at it the next day and have an obvious solution pop into my head immediately. This happened last week, even. Identify Which Programming Language Aspect You're Dealing With Personally, I find it useful to keep in mind that when you're learning a programming language, you're actually learning four things: How to write code: syntax, semantics, and resource management The language's paradigm: object-oriented, functional, logic, etc. The artifact ecosystem: how to build and run executables and how to use libraries Tooling: editors, compilers, debuggers, linters It's easy to get these four facets mixed up, with the unfortunate result that when you run into a problem you end up looking in completely the wrong place. Someone who's completely new to programming, for example, might start out by trying to build iOS apps. They might try to get their app running on a friend's phone, only to see some message about needing a developer certificate or whatever. This is part of the artifact ecosystem, but an inexperienced person might see this as a problem with how to write code. They might look at every line they wrote to figure out the problem, when the problem isn't with their code at all. I find it easier to learn a language if I tackle each of these aspects systematically, and in another blog post I'll present a general list of questions that need answering that should help you in learning any language. Identify the Purpose, External Model, and Internal Model Whenever you’re learning to use a new tool, its useful to identify its purpose, external model and internal model. When you understand a tool's purpose, your brain gets loaded with helpful contextual details that make it easier for you to assimilate new knowledge. It's like working on a puzzle: when you're able to look at a picture of the completed puzzle, it's a lot easier to fit the pieces together. This applies to languages themselves, and language libraries. A tool's external model is the interface it presents and the way it wants you to think about problem solving. Clojure’s external model is a Lisp that wants you to think about programming as mostly data-centric, immutable transformations. Ansible wants you to think of server provisioning in terms of defining the end state, rather than defining the steps you should take to get to that state. A tool's internal model is how it transforms the inputs to its interface into some lower-level abstraction. Clojure transforms Lisp into JVM bytecode. Ansible transforms task definitions into shell commands. In an ideal world, you wouldn’t have to understand the internal model, but in reality it’s almost always helpful to understand a tool's internal model because it gives you a unified perspective on what might seem like confusing or contradictory parts. When the double-helix model of DNA was discovered, for example, it helped scientists make sense of higher-level phenonema. My point, of course, is that this blog post is one of the greatest scientific achievements of all time. Tutorials often mix up a tool's external model and internal model in a way that’s confusing for learners; it's helpful to be aware of this so that you can easily identify when it's causing you frustration. Spaced Repetition Helps You Remember Spaced Repetition been proven to be one of the best ways to encode new information in long-term memory. The idea is to quiz yourself at ever-increasing time intervals to minimize memory decay using the fewest number of repetitions. The Guardian wrote a great introductory article. Sleep and Exercise Take care of your body! It's more than just a vehicle for your brain. If you want to be able to stay focused and learn efficiently, getting adequate sleep and exercise beats the pants off caffeine and energy drinks. More tips? If you have any useful tips, please leave them in the comments! If you'd like more excellent resources on learning to program, check out the Community Picks: Learn Programming, a community-curated collection of the best books for learning programming. It includes a wide array of subjects, including introductory programming books, books on craftsmanship, and books on soft skills and interviews.

Kubernetes with ELK Setup

over 2 years ago | Rocky Jaiswal: Still Learning

As it turns out this is my 100th post. The first one was published in March 2011 and a lot has changed since then. A lot of new technologies have come in and a lot of my posts have become obsolete. In all these years nothing has created more i ...

Tips and Tricks for Beautifully Simple Mobile App CI

over 2 years ago | Dave Kerr: dwmkerr.com

In this article I'm going to demonstrate some simple tips and tricks which will help you build and maintain beautifully simple mobile build pipelines. These techniques can be applied to different mobile app technologies and integrated into almost any build system: Sample App Index Each tip is demonstrated in the sample apps in

Testing HapiJS with Jest

over 2 years ago | Rocky Jaiswal: Still Learning

HapiJS and React are pretty much my go-to technology choices for web application development right now. While Jest works really well with React, on the HapiJS side I was ...

Zen and the Art of Blowing Things Up

over 2 years ago | Daniel Higginbotham: Flying Machine Studios

The Dark Knight came out at the same time that I was becoming intensely interested in Buddhism, and the movie struck me as a kind of extended Buddhist parable, with Bruce Wayne as an icon of the suffering that results from clinging and the Joker as a very fucked up enlightened being. Here are some of my main reasons: (warning: spoilers!) Suffering and Impermanence Buddhism teaches that suffering comes from constantly scrambling for stability in an unstable world. Nothing is permanent, but we strive mightily to hold on to the illusion of permanence, only to suffer when reality once again asserts itself. In the scene where Batman is in the interrogation room beating the stuffing out of the Joker, the Joker just laughs and says, "You have nothing! Nothing to threaten me with. Nothing to do with all your strength." And that cuts to the heart of who the Batman is: a person whose reaction to the first shock of impermanence (his parents dying) was to dedicate his life to developing his strength so that he would never experience that pain again. The Batman's entire being is an exercise in doing just one... more... thing... to establish control. I mean, who would want to live that life? And here's the Joker, ready with the Zen slap: he tells Batman where to find Harvey and his girlfriend Rachel, giving him the illusion of control over who to save. And we know how that turned out: the Joker lied to the caped crusader, telling him Rachel was at one address, but actually Harvey was there. Batman races to save Rachel, only to find find Harvey instead. Nothing to do with all that strength. This really hit home for me because, at the time, I was in a relationship with someone that had a chronic illness. I could try to do everything to make her life less painful and more enjoyable, but there was only so much I or anyone could do. Natural Metaphors and Endless Desire At one point, the Joker says, "I'm just a dog chasing cars, I wouldn't know what to do if I caught one." Or something like that. This is a double whammy: "a dog chasing cars" is totally something a zen master would say, but besides that it expresses our human tendency to constantly strive for the next thing. We're all just dog chasing cars, not knowing what to do when catch one. You get a job: now you want a better job. You get a house: now you want a bigger house. Better to just say fuck it, put on some makeup, and start blowing up hospitals. No Self The Buddhist idea of "no self" is actually somewhat nuanced and I'm purposefully misrepresenting it here, but it would be difficult to argue that the Joker clings to any notion of self in the way that most of us non-enlightened psychopaths do. He gives multiple stories for how he got his scars, revealing the Buddhist truth that our sense of self is just a story we tell ourselves and that no one story is better than any other. He gives up his name and identity to become a fucking clown. And people really hate clowns! Interconnectedness One Buddhist teaching is the idea of interconnectedness: that we are all one, but not in the wavy-gravy way your high uncle used to ramble about. My take on the idea is that it's related to no self: you cannot point to a "you" that is separate from the world you exist in. It's a fallacy to believe your "you" is somehow different from the collection of experiences of the world, so that you are inextricably intertwined with the world. You can't point to one thing outside yourself and say "I am not this," because you are pointing at it you moron, and so in that moment who you are is a guy pointing at that thing, and life is the accumulation of such experiences of things outside of "you." ANYWAY I am totally not your high uncle, OK? Point is, the idea of interconnectedness is meant to foster a sense of compassion. You can see that at the end of the movie when the Joker plays his hilarious "blow up the other boat" gag. Two boats full of strangers become enlightened, refusing to do harm to people they haven't even met.

Get up and running with OpenShift on AWS

almost 3 years ago | Dave Kerr: dwmkerr.com

Setting up your own OpenShift cluster can be a little complex, but in this article I'll show you how to make it fairly painless.

WFFM: Save to Database

almost 3 years ago | Sumit Bajaj: Sumit Bajaj's Blogs

Web Forms For Marketers has become one of the essential component of Sitecore. Almost every website is using forms to capture the inputs from users and it is very common scenario to get the data stored in Database for reporting purpose. Here are few easy steps which can help you storing the form's data in SQL database.Download the WFFM - SQL Provider(Save To Database) and install it in Sitecore using Installation wizard. All physical files and Sitecore items will be stored in respective location.Once installed, you will notice that it has created a new Action under System-> Modules -> Web Forms for Marketers -> Settings -> Actions -> Save ActionsNow, we have to add connection string in configuration file which will help us storing the data in that database. You have to keep the name of connectionstring to 'wfm' only as same name is referred in WFFM module code.< add connectionstring="user id=your_db_user_id;password=your_db_password;Data Source=your_db_server;Database=your_db_name" name="wfm" >You are done.Now add the 'Save to Database' action on any WFFM form and start using it. Also validate the database and data should start getting stored in it.Furthermore, this module provides the capability of exporting the saved data in CSV format. We can do customization on it to export the data from different servers(CMS or CD) which I will explain in next article.Please don't hesitate to contact me at 'email.bajaj@gmail.com' for any Sitecore related query/scenario.

Pointers in C and x86 Assembly Language

almost 3 years ago | Pat Shaughnessy: Pat Shaughnessy

16GB of DDR random access memory my son used in his new gaming PC Recently I’ve been trying to learn how to read x86 assembly language. In http://patshaughnessy.net/2016/11/26/learning-to-read-x86-ass

Creating a Resilient Consul Cluster for Docker Microservice Discovery with Terraform and AWS

almost 3 years ago | Dave Kerr: dwmkerr.com

In this article I'm going to show you how to create a resilient Consul cluster, using Terraform and AWS. We can use this cluster for microservice discovery and management. No prior knowledge of the technologies or patterns is required! The final code is at github.com/dwmkerr/terraform-consul-cluster. Note that

Learning to Read x86 Assembly Language

about 3 years ago | Pat Shaughnessy: Pat Shaughnessy

A 16-bit Intel 8086 microprocessor from 1978 (source: RodolfoNeres via Wikimedia Commons) Writing assembly language is

Using Slack for Server Development

about 3 years ago | Dave Kerr: dwmkerr.com

I recently found a surprisingly helpful approach for server-side development which uses Slack in a creative way.

Docker Registry with AWS & Let's Encrypt

about 3 years ago | Rocky Jaiswal: Still Learning

With pretty much all new projects moving to Docker and Docker managers like Kubernetes, the Docker Registry becomes the first piece of infrastructure that a team needs to setup. Sure there are public and private registries availa ...

Simple Continuous Integration for Docker Images

about 3 years ago | Dave Kerr: dwmkerr.com

In this article I'm going to demonstrate a few tips and tricks which can make your life easier when you are building or maintaining Dockerfiles. The need for a Build Pipeline Do we really need any kind of continuous integration or build pipeline for Dockerfiles? There will be cases when

Run Amazon DynamoDB locally with Docker

about 3 years ago | Dave Kerr: dwmkerr.com

tl;dr: Run DynamoDB locally using Docker: docker run -d -p 8000:8000 dwmkerr/dynamodb Try it out by opening the shell, localhost:8000/shell: DynamoDB Shell That's all there is to it! DynamoDB Amazon DynamoDB is a NoSQL database-as-a-service, which provides a flexible and convenient repository for your services. Building applications

Need a Second Opinion on Your Ruby Code? Ask Crystal

about 3 years ago | Pat Shaughnessy: Pat Shaughnessy

Running the Crystal compiler on your Ruby codeis like asking a second doctor for their opinion. When it comes to your health, you don’t hesitate to get a second opinion. Doctors don’t always agree, and a second doctor’s app

Hello Kubernetes

about 3 years ago | Rocky Jaiswal: Still Learning

Introduction Pretty much everyone in the technology world has heard about Kubernetes by now. But before we dive into it, let's try and understand the problems it solves - Back when I started programming, servers were usually considered out of reach for us developer ...

Effective Node.js Debugging

over 3 years ago | Dave Kerr: dwmkerr.com

If you are interested in improving your Node.js debugging skills, then check out my talk at the recent JSChannel 2016 conference in Bangalore: Comments and observations are always welcome!

My Writing Process

over 3 years ago | Daniel Higginbotham: Flying Machine Studios

The letter below is a response to an email from a Twitter friend. For context: I've written some instructional material that's enjoyed success online, including Clojure for the Brave and True and Clean Up Your Mess: A Guide to Visual Design for Everyone. Robert asked me a few questions about my process. Hi Robert! You're in the unfortunate position of being my permission to write at length about my creative process without seeming completely self indulgent: someone's actually interested in listening to me describe the chaos between my ears! Be prepared to read way more than you asked for. How do you decide who you are writing for? This one’s key for me. When I’ve written in the past, I’ve struggled with knowing how much or how little to say. I’m curious to learn how you deal with that. First: I've found it useful to follow the standard advice and pick an individual or two and write for them. The argument goes that you'll find it much easier to choose words and have a consistent tone, and that's proven true for me. When I wrote Clean Up Your Mess, I was one of three programmers working in an office full of charming people who did business analysis for management consultants, and I wrote the guide for a couple of them that I had become friends with. These analysts produced powerpoint decks by the barrel, and every single one was ugly. Similarly, Clojure for the Brave and True started as a guide for a couple coworkers that I was mentoring. However, picking your audience is only half the process. The other half is picking who the author is. I'm going to go on a bit of a tangent to explain this. When I started writing Clean Up Your Mess, my personal life was a mess. In hopes of making it less messy I had been spending most of my free time reading Buddhist literature and listening to lectures by Thich Nhat Hanh and Pema Chodron (in fact, my site opens with a Thich Nhat Hanh quote). I was spending a great deal of time meditating and reflecting. (You're interested in Buddhism too, right?) One of the ideas that really grabbed me was that our self-conceptions are just stories we tell ourselves with no reality to them. I won't belabor the point here; suffice to say that I found it useful and powerful to be able to perceive my identity as a construct as ephemeral as smoke. Around the same time, I started taking improv comedy classes, where I would spend two hours a week constantly coming up with new, unique characters and living in them for a few minutes at a time. When you're sold on the idea that your day-to-day you is itself just a character, improv becomes way easier and more fun. It's also fun to do this in real life - like, recently my wife and I were at the grocery store and I decided my character was "Super Excited About Carrots Guy", and I started shouting "OH MY GAWD JESS CARROTS! THEY HAVE CARROTS JESS! CARROTS!" Everyone was laughing as they escorted me out! Anyway, during this time of buddhism and improv I was writing Clean Up Your Mess and when I sat down to write I got to play with new identities, new characters, and see which was the most fun. It became much easier to find words and keep a consistent tone when I decided on the author's character. So, you mentioned not knowing how much or how little to write. Knowing your character helps. In Clojure for the Brave and True, one of my editors would sometimes whittle down sentences to the bone, leaving only pure information; I would undo those edits with gusto, adding back the shape and texture of the author's voice. There's another aspect of writing instructional material, which is that 95% of the time you can take more time to explain something. Even if you're writing for experienced audiences, at least take the time to explain acronyms and jargon. How often and how much do you write? Not enough and not enough! Writing was easiest, however, when I had a consistent schedule of writing at least one hour every single day. Let me tell you about my garage. My garage is a living f*cking nightmare. It's like Cthulhu and the dread of the dark you had as a child made disgusting love and produced a horde of horrors that died in giant filthy clumps all over. At the beginning of the year I suppressed my gag reflex long enough to clean it out with the goal of setting up a photo studio, which I did, only to let it sit for three months. So three months later I go in there to actually take photos and guess what: it's a complete horror show, again! If I had only spent time every day or even every week maintaining it, I'm sure it would have been much easier to keep clean. If I had cleaned it out, all those tiny insect monsters wouldn't have been able to breed, there wouldn't have been two dozen spider egg sacs, etc. When I don't write consistently it's like that. I have to crawl into the nest of no one cares what you write and this time everyone's going to hate it called my mind and clear it all out before I can actually start writing. When I write consistently, on the other hand, it's actually quite pleasant! One more note: much of the writing process is research. Every time I find myself struggling to explain something, it's because I don't understand it well enough. When that happens I put down the keyboard and pull out the pen and notebook. I try to articulate the questions that will lead me to understand what I want to explain. I read and I draw diagrams and play with words until I feel like I understand the concept. Becoming aware that, for me, writer's block is a lack of understanding, has helped me be much more productive. Collaboration Who does your drawings? My wife! She's pretty great. Do you have someone who edits for you? I did when I worked with No Starch. They were awesome! Clojure for the Brave and True is much, much better because they kept pushing me to write more clearly and explain things more fully. For other projects, I'll ask friends to look at drafts. How much does it cost? I paid my wife in carrots. OH MY GAWD JESS THEY HAVE CARROTS! No Starch gets 85% of hard copy sales and 77.5% of ebook sales (or something like that). I hope this was helpful!

Understanding Recursion

over 3 years ago | Daniel Higginbotham: Flying Machine Studios

During my Clojure training I've found that recursion routinely trips people up. It definitely tripped me up for a long time. I've tried to develop an explanation that's clear and intuitive, so if you're still scratching your head about recursion, read on! A classic recursion example is calculating n factorial, which is n multiplied by every natural number before n; 3 factorial is 6 (3 times 2 times 1), 4 factorial is 24, 5 factorial is 120. The code snippet that follows is a typical implementation of factorial; if you're reading this, then presumably it's confusing - which is great! It means that I haven't written this article for nothing. function factorial(n) { if (n == 1) { return n; } else { return n * factorial(n - 1); } } What makes this function recursive is that factorial calls itself. That's also what makes the function tricky; the function calls itself!? We're used to functions calling other functions to get work done. For example, this function uppercases a string and prepends "Yo, " to it: function yoShout(str){ return "Yo, " + str.toUpperCase(); } yoShout("gimme a donut"); // "Yo, GIMME A DONUT" In this tiny example, yoShout does its work by using the toUpperCase function. It's easier to understand than a recursive function because yoShout treats toUpperCase as a black-box abstraction. You don't have to tax your brain by loading toUpperCase's implementation details into your short-term memory. Let's re-write factorial to use function calls this way, with function's body calling another function in order to get its work done. To calculate 3 factorial, you could write a series of functions, factorial_1, factorial_2, and factorial_3, like this: function factorial_1() { return 1; } function factorial_2() { return 2 * factorial_1(); } function factorial_3() { return 3 * factorial_2(); } These functions feel safe and comfy. factorial_3 calls factorial_2, something we're completely familiar with, and likewise factorial_2 calls factorial_1. factorial_3 also does not care how factorial_2, just like in the string example. Unfortunately, these functions are also completely impractical; can you imagine writing factorial_1000? The recursive implementation doesn't have this problem. My suggestion is to try seeing the recursive implementation from the same perspective as the nonrecursive imiplementation. Here's the code again: function factorial(n) { if (n == 1) { return n; } else { return n * factorial(n - 1); } } You can look at this and say, "Oh, if n isn't 1, then this function does its work by calling some black-box function named factorial with the argument n - 1." You can look at the call to factorial(n - 1) as a call to a completely different function - one that just happens to have the same name and algorithm. That's it! I hope it helps. If you've been confused by recursion, I'd love to hear your feedback!

Pi Calculation with Elixir

over 3 years ago | Rocky Jaiswal: Still Learning

As a programmer one is always searching for better tools, practices and programming languages. For example, working with Clojure makes me a better programmer, it provides me the ability to write functional, succinct code that runs fast and works on the well-tuned and battle-tested JVM. Looking at ...

F#: Disabling SSL Certificate validation

over 3 years ago | Kristof Mattei: Kristof's blog

Yesterday I wanted to download some content off a website with F#, however unfortunately the certificate of the website was expired. let result = try let request = "https://somewebsite/with/expired/ssl/certificate/data.json?paramx=1&paramy=2" |> WebRequest.Create let response = request.GetResponse () // parse data let parsed = "..." Ok parsed with | ex -> Error ex If we execute this, … Continue reading "F#: Disabling SSL Certificate validation" The post F#: Disabling SSL Certificate validation appeared first on Kristof's blog.

F#: Disabling SSL Certificate validation

over 3 years ago | Kristof Mattei: Kristof's blog

Yesterday I wanted to download some content off a website with F#, however unfortunately the certificate of the website was expired. let result = try let request = "https://somewebsite/with/expired/ssl/certificate/data.json?paramx=1&paramy=2" |> WebRequest.Create let response = request.GetResponse () // parse data let parsed = "..." Ok parsed with | ex -> Error ex If we execute this, … Continue reading "F#: Disabling SSL Certificate validation" The post F#: Disabling SSL Certificate validation appeared first on Kristof's blog.

HTTP Compression and Performance tuning

over 3 years ago | Sumit Bajaj: Sumit Bajaj's Blogs

With the advancement of technology and exceeding expectations of users, one has to be very careful designing a website. Performance is one of the key elements for success of an application. Even if, you have designed the application with uttermost care and rock solid architecture, there are few key areas in which you have to be really vigilant. HTTP Compression is one of those pivotal spaces.HTTP compression is the technique to compress static and dynamic content which improves the transfer speed and performance of a website.Steps to keep the compression ON for a website. Here the demonstration is given for IIS based website.1. Open IIS (inetmgr)2. Goto website. Right side will show all components of that website3. Click on 'Compression' module and verify that both the checkboxes are checked if you need static and dynamic content to be compressed.4. Click 'Mime Types' and check 'application/x-javascript' is added in the existing mime types. If not, add it.5. Reset IIS, browse website and verify that JS is getting compressed now.Web.Config SettingsHere are all the mime types and gzip information which should exist for a website if compression needed, either in IIS settings or in web.config.Note: Include it in web.config if configuration file also get deployed with every build.Section to include in <system.webserver></system.webserver><system.webServer><httpCompression> <staticTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/javascript" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="image/jpeg" enabled="true" /> <add mimeType="*/*" enabled="false" /> </staticTypes> <dynamicTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/javascript" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="image/jpeg" enabled="true" /> <add mimeType="*/*" enabled="false" /> </dynamicTypes> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" dynamicCompressionLevel="4" /> </httpCompression></system.webServer>After compression is ON:Response header of a JS file being loaded in website. 'Content-Encoding: gzip' shows that it is compressed.Useful toolsThere are several webistes which can help you detect, if your website/CSS/JS is compressed or not. You should check css/js or website seperately to make sure that all static medias are compressed. One of the examples website is given here.Check CompressionFor further detail, you can contact me www.bajajsumit.com. Please share your feedback if you find the article useful.

Testing the Docker for Mac Beta

over 3 years ago | Dave Kerr: dwmkerr.com

I've finally had a chance to install the new Docker for Mac Beta and give it a whirl, here are my experience so far!

Is it worth persevering with Golang?

over 3 years ago | Dave Kerr: dwmkerr.com

After perhaps 10-20 hours of learning, coding and messing around, I'm wondering - is it worth persevering with Golang?

What's your Vim Name?

over 3 years ago | Dave Kerr: dwmkerr.com

I'm a few weeks into moving to Vim as my main editor, I've stopped crying and shaking mostly (at least about my editing ability). Now I'm wondering: what's your Vim name? And who's got the best one? As far as I can work out, my Vim name is: Replace everything

Quick Tip: Sending Newlines with cURL

over 3 years ago | Dave Kerr: dwmkerr.com

Yikes, this took far too long to figure out! I have a service which takes plain text multiline input and outputs an object for each line, something like this: Input Line 1 Line 2 Line 3 Output [ {line: "Line 1"}, {line: "Line 2"}, {line: "Line 3"} ] There's a bit more

Classes and patterns in Node.js

over 3 years ago | Rocky Jaiswal: Still Learning

This week we had the awesome Node.js 6.0.0 release! With the 6.0.0 release Node.js has 93% of the ES6 features implemented. In this short post we will look at few particularly interesting features including "classes in JavaScript", ...

Moving from React + Redux to Angular 2

over 3 years ago | Dave Kerr: dwmkerr.com

I'm going to share my experiences of experimenting in Angular 2, as someone who needs a pretty compelling reason to move away from React/Redux!

Learn Docker by building a Microservice

over 3 years ago | Dave Kerr: dwmkerr.com

If you are looking to get your hands dirty and learn all about Docker, then look no further!

Running dotnet on Linux

over 3 years ago | Sumit Bajaj: Sumit Bajaj's Blogs

Server: Linux, version SUSE 12To run dotnet code on Linux, the first and foremost task is to "Install Mono package on linux".Note: Mono is an open implementation of Microsoft's .Net framework, including compilers. It uses the same development libraries on Linux which are being used on Windows. Therefore, if you code and compiled some mono code on Linux,  it will work for Windows as well.      zypper is a package installation tool which is used in this scenario. If zypper is not available, check which package manager tool is installed on server. Furthermore, to verify if zypper is installed or not, type zypper on command line which will show all options if zypper is available on server else it will show 'command not found'.zypper ar -r http://download.opensuse.org/repositories/Mono/SLE_11_SP2/Mono.repoThe above command will download from mentioned URL in a new repository. Here 'ar' stands for 'add repo'.After adding it to repository, type 'zypper refresh' command, it will ask to install packages. Type the appropriate option and install the Mono packages.Once successful installation,       we are all set to run dotnet on linux server.Running first dotnet codeCreate a new test.cs file by typing following command.$cat>test.csNow open the file using any available editor. In this case it is 'vi' editor.vi test.csStarting writing the first dotnet code as shown below.      Information about 'vi' editor:Type 'i' to change it to insert mode.Type 'esc' to come out of insert mode.Type ':w' to write the file and save.Type ':q' to quit and come back to command line tool.       NOTE: If any exception appears like '!' is required to override the file. Type ":w!" to override the existing file and write the new text. OR Type ":q!" to override the existing file with new text and quit.C# code for 'test.cs':using System;namespace Test1{class Test1{static void Main(string[] args){Console.WriteLine("Hello World!!");}}}Once you have saved the file, its time to compile it. 'mcs' is command which is used for compiling the code.dev-server-linux-suse12:~ # mcs test.csAfter compilation is successfully completed, its time to run the application. As it is console project, '.exe' file will be created as output. 'mono' is the command used for running the test project.dev-server-linux-suse12:~ # mono test.exeHello World!!You are all set to run dotnet on Linux. Provide your valuable comments/suggestions.

Two Dumb Ruby Mistakes

over 3 years ago | Pat Shaughnessy: Pat Shaughnessy

Coding is like climbing: You need equipment that will catch you when you make a mistake. (source: Elke Wetzig via Wikimedia Commons)