Graphs are a collection of nodes connected by edges. Programmers run into graphs fairly regularly because almost any collection of things with binary relationships can be viewed as a graph. As practitioners we need to understand both graph theory (abstract structures) and graph data structures (concrete representations).
Three common families of graphs are:
This article looks at digraphs, dags, and trees from a programmer’s perspective. Where do we see them in practice? How can we recognize them? What can we do with them?
This article also includes a Java library for working with digraphs, dags, and trees. The library code is available at https://github.com/stevewedig/blog and is published to Maven for easy usage as a dependency. This is the third in a series of Java libraries I’m sharing on this blog. The first two were:
- Digraphs (directed graphs)
- Dags (directed-acyclic graphs)
- A Java library for digraphs, dags, and trees
- Other Java graph libraries
As someone who has shifted from Python to Java, this article discusses two of the problems I’ve faced in Java that don’t exist in Python:
- Java’s type system cannot represent containers or maps with heterogenous value types. Python dicts can hold anything.
- Java’s methods lack named and optional parameters. These useful language features are provided by Python, Ruby, and C#.
As a response to these problems, this article presents a small library that makes them a bit less painful. We build on Effective Java’s item #29: consider typesafe heterogeneous containers. The library code is available at https://github.com/stevewedig/blog and is published to Maven for easy usage as a dependency. This is the second in a series of Java libraries I’m sharing on this blog (the first was Value Objects in Java & Python).
- Two problems with Java
- Get and cast: Heterogenous maps without type safety
- TypeMap: Effective Java’s type safe heterogenous map
- Symbol: A key with a value type parameter
- SymbolMap: An improved type safe heterogenous map
- SymbolBus: Heterogeneous event publishing/subscribing
- Using SymbolMap for named and optional parameters
- SymbolFormat: Parsing & writing SymbolMaps
- SymbolSchema: Validating the symbols in SymbolMaps
So far I’ve posted a Software Developer’s Reading List and Why & How I Write Java. After all that high-level jabbering it’s time for something concrete with actual code. This article discusses value objects: what they are, how to implement them, and when to use them.
I think object-oriented languages should have value objects built-in, like structs in C# (with caveats). Unfortunately they aren’t built into Python or Java (yet). However we can implement value objects on our own, and this article includes small libraries to make it easy for Java and Python.
- What are value objects?
- How to implement value objects?
- When to use value objects?
- Java library usage
- Python library usage
(Edit: This is a fairly old library. If you are interested in @once, frozendict, and Opt, these are included as part of the newer value objects library.)
A while ago I gave a talk to the LA Python user group about a few Python tricks we use at my company Lingospot. Three years later we’re still using all of these techniques. There isn’t any particular theme, it’s just a mix of tricks that are simple and widely applicable. You can find the slides and sample code here.
If I recall, the talk was generally well received. Interestingly some audience members didn’t find Option Types to be “Pythonic”, which very well may be true. Nowadays I prefer to use Java for reasons I describe in Why & How I Write Java. For Option Types in Java I use Google Guava’s Optional. I certainly don’t miss the errors caused by null/None.