This is Michael Andrews's Typepad Profile.
Join Typepad and start following Michael Andrews's activity
Join Now!
Already a member? Sign In
Michael Andrews
New York, NY
Over 15 years of experience building scalable high-performance applications, APIs, and backend systems and services. Led the architecture and development of high-transaction content management systems, publishing tools, and social networking platforms. Experienced thought leader with success leading engineering teams, and designing software and architectures which support evolving business needs. Committed to developing light-weight malleable software and skilled at leveraging Domain-Driven Design, separation of concerns, and inversion of control. These methodologies encourage the development of decoupled modular code which reflects the ubiquitous language of the subject domain, and agile iterative development allowing for quick pivots and easy integrations.
Interests: Light-weight Java, backend architecture and platform engineering, distributed services (SOA), JVM performance tuning and profiling, Domain-Driven Design (DDD), Java Persistence API (JPA), RESTful web services (REST), OAuth, MySQL, MongoDB, Neo4J, Solr, Spring Framework, Spring Data, Spring Security, Spring AMQP (RabbitMQ Work Queues and PubSub), Spring Remoting, Spring AOP, Spring MVC, Hibernate, Ehcache and cache replication, Tomcat 7, Jetty, Servlet Spec 3, JSP, JRuby/Java integration, JMX and MBeans, data structures and algorithms, concurrency, various client-side technologies and frameworks (HTML, CSS, JS, Bootstrap, JQuery), DevOps using Linux, Amazon Web Services (AWS), Chef, Jenkins, GIT, Maven, and Artifactory. Knowledge of Hadoop & HBase.
Recent Activity
Sub-reference Type Representation Strategy Instead of nodes having an implicit __type__ field on them - they are related to their "type node" via the INSTANCE_OF relationship. Type nodes are then connected to the root node via a SUBREF relationship. This creates a fully connected graph (all nodes are accessible from the root). Since there is no implicit "type" parameter on nodes, Cypher queries that find relationships to a particular node type will need to be done differently. Here is an example of finding all SAVED Event types for a specific User as opposed to all SAVED Foo or Bar types:... Continue reading
the system removed the POM tags - but you get the idea. Here is a link to the docs on this. M
SGB - You'll need to bridge those other logging implementations to SLF4J. You'll then be able to pick the runtime implementation for your app. I use Logback at runtime. Here are my maven dependencies when I'm depending on JARs that use JUL, Commons, and Log4J. Hope this helps. org.slf4j slf4j-api ${slf4j.version} org.slf4j jcl-over-slf4j ${slf4j.version} runtime org.slf4j log4j-over-slf4j ${slf4j.version} runtime org.slf4j jul-to-slf4j ${slf4j.version} runtime ch.qos.logback logback-classic 1.0.7 runtime
If you're like me you really like the new Servlet 3.0 spec that allows for annotated servlet classes. This approach along with the new ServletContainerInitializer interface potentially allows for code-based application configuration and deployment without a application deployment descriptor (web.xml) file. But can you achieve ordering? You can. Continue reading
I like Dropbox. It is my own personal cloud storage. I use it for most of my documents, as well as many application data files. Today I found another use for it: Save PDF to Dropbox Web Receipts Folder. Continue reading
Since the wget command line tool does not come with Mac OS X, you can set up an alias in your .bashrc file (or your shell's equivalent rc file) that uses cURL. Continue reading
Rich - Thanks for your post! I enjoyed writing this one. So many people implement complicated directory structures for hashing - with dates, and timestamps, and user names, etc - find this simple approach fits most of the use cases. Thanks again! ~Michael
Absolutely. Checking a boolean twice is not very expensive overall. If you are passing a parameter that is expensive to evaluate (like object serialization) - then you still need to do the wrap. Thanks for pointing that out! :)
For some time now I have been a bit perplexed about logging in Java. Not only does it seem overly complicated, but the community is fragmented around all the different frameworks, wrappers, and implementations. So I thought I would sit down and try to learn the history, understand the pros and cons of each framework, and determine my preferred logging ecosystem. Continue reading
I recently had some Subversion fun when I decided my organization needed to upgrade from Subversion 1.4 to 1.6. Since the release of 1.4 there have been monumental advances in disk storage and merging capabilities. We “branch for feature” off the trunk (which is also in development), and need to merge back into the trunk after the branch is released. Subversion 1.6 has what is called a “Reintegration Merge” which is used to prevent reflective merging indicative of this type of workflow. I decided I did not want to simply upgrade the svn binaries and then update the repository since this would not get me the new storage optimizations. I opted instead to create a new 1.6 server and sync the old 1.4 repo to the new 1.6 repo using svnsync. This would allow me to keep all the revision history and revision properties, but it would also commit each revision into the new repo which would allow 1.6 to do its storage optimization. The second part of my mission was to break off 3 projects into their own repository. Our code was all stored in one repository over on the 1.4 server, and I wanted to break that up and allow the different groups have their own repos. Continue reading
I found this really good article (and subsequent thread) about SVN "branching for feature" and merging back to the trunk for release. We have a trunk which is always the next patch version of the current released version. But we also branch the tagged current release for long running development on future features. This article describes the issues with merging trunk work into these development branches, and then merging the development branches back to the trunk. Continue reading
I really hate blinking cursors, and my favorite IDE - NetBeans - seems to love it. But I've found a way to disable it and stop the strobing black block once and for all. Continue reading
Michael Andrews is now following The Typepad Team
Mar 16, 2010
So you've fixed some bugs or made some changes in the trunk and now you're ready to merge them up into a development branch. Here is an example of how to use svn merge. Continue reading
Most modern UNIX filesystems do not limit the number of files you can store in a single directory. However, stat operations such as listing files, following paths, or checking for the existence of a file will take longer as the number of entries in a directory increases. So how can one store a large number of files while maintaining a high level of performance during access? One solution is file name hashing. Continue reading