"Starting with ModeShape 3 in early 2012, all repository nodes were internally represented using JSON documents and stored as BSON values in Infinispan. Although we relied upon some Infinispan features, for the most part ModeShape was merely storing its data using a very basic key-value API.
As ModeShape evolved through the 3.x and 4.x versions, we started having some data persistence issues that were largely outside of our control. ModeShape could be deployed inside JBoss AS (eventually known as Wildfly), so we chose our version of Infinispan based upon the version that was shipped with JBoss AS. Unfortunately, when we found bug in Infinispan, those bugs would be fixed in releases that were not yet included in JBoss AS, meaning we couldn’t get the fixes for quite some time. Using Infinispan also made the repository configuration and internals quite complex. Plus, changes in Infinispan’s persistence stores sometimes meant that persisted data could not be read by newer versions of Infinispan.
But most importantly, in certain situations we saw data corruption render a repository’s content largely unusable. This is a complicated issue that we previously outlined in detail this forum post and this issue.
Therefore, our primary goal with ModeShape 5 was to make sure that the repository data is stored in a more durable and strongly consistent manner that avoided the aforementioned corruption issues. This meant that we had to take a more conservative approach to persistence and give up claims of high scalability and performance (which are fine with eventual consistency, but not with strong consistency which is a must-have for ModeShape).
Already having the design of storing BSON documents in a key-value store helped us a lot, since it meant we only had to come up with transactional, strongly consistent, key-value store alternatives.
ModeShape 5’s initial release comes with three such stores out of the box.
ModeShape is not a “big data” database and doesn’t scale that big. We’re transactional, after all.
"When it comes to encapsulation, sometimes less is more.
I'll start with the punchline: If you're writing a function that can be implemented as either a member or as a non-friend non-member, you should prefer to implement it as a non-member function. That decision increases class encapsulation. When you think encapsulation, you should think non-member functions.
Surprised? Read on."
"Les maux du réseau de santé public ne sont plus à démontrer: longues listes d'attente pour rencontrer un spécialiste, médecins de famille pratiquement impossibles à trouver et urgences pleines à craquer. Face à ces difficultés, des cliniques de santé privées se développent au Québec depuis la fin des années 1990. Et de plus en plus de médecins y pratiquent: ils étaient 56 en 2001 et 208 en janvier 2011, selon la Régie de l'assurance maladie du Québec (RAMQ)."
"I used to use JMeter for a long time, but JMeter has weaknesses that Gatling doesn‘t have."
"Open Source Load Testing Tools: Which One Should You Use?"
However, Scala.js was not always the solid, production-ready platform that it is today. When I first got involved, it was a sketchy new project with so many bugs and problems that using it for a "real world" use case would have been unheard of. While I have spent considerable time giving talks telling people why "Scala.js is good", I have never talked about the core reasons why I started working on Scala.js long-before it was "good" by any measure. Why Scala.js, and not one of the many alternatives? This post will tell that story.
"Google Analytics tells you what, Inspectlet tells you why"
"Conscript is a distribution mechanism for Scala apps using Github and Maven repositories as the infrastructure. You can use it to install and update apps similar to APT or Home Brew.
It does less than you think, because the sbt launcher does more than you think. More on that later."
"This little play module provides some syntactic sugar that allows boilerplate-free Actions using for-comprehensions."
This is exactly what I want to write support for in our Scala / Spring Boot application, so it would be a bit different from this version as we do not deal with async Future data type.
"PubSub (short for publish/subscribe) is a derivative of one of the most analyzed architectural styles in software: event-based integration (EBI). From a purely theoretical perspective, event-based integration is a natural fit for systems that monitor real-time activities, particularly when the number of event sources outnumber the recipients of event notifications (e.g, graphical user interfaces and process control systems). However, EBI does not scale well when the number of recipients greatly outnumbers the sources. Researchers have been studying Internet-scale event notification systems for over two decades. Several derivative styles have been proposed to help reduce the issue of scale, including PubSub, EventBus, and flood distribution. There are probably others that I have left out, but they usually boil down into the use of event brokers (intermediaries) and/or a shared data stream (multicast and flood).
"One of the main problems is HUGE amounts of js files being downloaded to the user's computer. A great way to avoid this is to only download the minimum the user needs and dynamically load more resources in the background, or as the user runs into pages which require a specific feature.
"Teach yourself Apache Spark – Guide for nerds!"
"The topic of this article, the singular value decomposition, is one that should be a part of the standard mathematics undergraduate curriculum but all too often slips between the cracks. Besides being rather intuitive, these decompositions are incredibly useful. For instance, Netflix, the online movie rental company, is currently offering a $1 million prize for anyone who can improve the accuracy of its movie recommendation system by 10%. Surprisingly, this seemingly modest problem turns out to be quite challenging, and the groups involved are now using rather sophisticated techniques. At the heart of all of them is the singular value decomposition.
A singular value decomposition provides a convenient way for breaking a matrix, which perhaps contains some data we are interested in, into simpler, meaningful pieces. In this article, we will offer a geometric explanation of singular value decompositions and look at some of the applications of them."
"Custom properties on nt:file and nt:folder nodes
One really nice feature of JCR repositories is that you can use them to store files and folders. Like with all other content, the structure of these nodes is dictated by their node types, and most people use the “nt:file” and “nt:folder” node types defined in the JCR specification. Learning to use these node types can take a little work, because they’re not quite as straightforward as you might expect."
"One really nice feature of JCR repositories is that you can use them to store files and folders. And because it is such a common pattern, the JCR specification defines several built-in node types that can be used to do just this:
nt:folder - The node type used to represent folder-type nodes
nt:file - The node type used to represent files.
nt:hierarchyNode - An abstract node type that serves as the base type of nt:file and nt:folder
nt:resource - The node that used to represent the content of the file
nt:linkedFile - Similar to nt:file, except that the content is not stored under the file node but instead is a reference to the content stored elsewhere."
"Nightweb is an app for Android devices and PCs that connects you to an anonymous, peer-to-peer social network. It is written in Clojure and uses I2P and BitTorrent on the backend. Please see the website for a general overview, and the protocol page for a more in-depth explanation of how it works.
"I2P is an anonymous network, exposing a simple layer that applications can use to anonymously and securely send messages to each other. The network itself is strictly message based (a la IP), but there is a library available to allow reliable streaming communication on top of it (a la TCP). All communication is end to end encrypted (in total there are four layers of encryption used when sending a message), and even the end points ("destinations") are cryptographic identifiers (essentially a pair of public keys)."