Subscribe: Blogging Roller
Added By: Feedage Forager Feedage Grade B rated
Language: English
activities  apache  app  attr string  blog  data  ember data  ember  new  open source  roller  shiro  user  usergrid 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: Blogging Roller

Blogging Roller

Dave Johnson on open web technologies, social software and Java

Updated: 2018-03-14T21:38:52+00:00


Powered by Kubernetes


(image) Just a quick note to say that I ditched Docker Swarm and now this rarely updated blog is powered by Kubernetes. Total overkill, I know. Like Roller itself, I did it as a learning exercise. I hope to blog more about what I learned by doing this. For now, here's a quick summary of what I've done so far.

Created a cluster

I created a 2-node Kubernetes cluster on Digital Ocean using some hand-crafted Ansible scripts that call apt-get to install and kubeadm to start Kubernetes. I considered using Typhoon to create the cluster, but I really wanted to learn how to install Kubernetes "from scratch".

Ran two Ingress Controllers

To avoid using Digital Ocean's $20/month load balancer I'm running an Nginx Ingress controller on each node, and pinning containers to nodes using labels and nodeSelectors. I had to borrow Nginx Controller setup files from the Typhoon project because I'm still kind of bewildered by Ingresses.

Deployed my containers

Next, I wrote Kubernetes YAML files for deploying my containers: a private Docker Registry, PostgreSQL and my custom Roller image. Getting the private registry working properly was the biggest challenge. I need private because I don't want to make my custom Roller image public. Next, I'll install Jenkins next for CI/CD of my custom Roller build via the Jenkins Kubernetes plugin.

Let me know if there are any aspects of this that you'd like to see covered in a blog entry, or suggestions for running the cluster without two Ingress Controllers. I've already got a post cooking about installing a TLS secured Docker Registry on Kubernetes.

Powered by Postgresql and Docker Swarm


It was somewhat painful but due to some problems with MySQL and Docker, and some general uneasiness with MySQL, I switched this site from MySQL v5.7 to PostgreSQL v10. I also switched over to Docker Swarm. Here's the Docker-Compose file that I'm using now to run this site:
version: '3.2'


      image: "postgres:10.0"
         - "5432:5432"
              memory: 50M
         - type: bind
           source: /var/lib/postgresql/data
           target: /var/lib/postgresql/data
        - POSTGRES_USER=roller
        - POSTGRES_DB=rollerdb
        - POSTGRES_PASSWORD_FILE=/run/secrets/pg_passwd
        - source: db_passwd
          target: pg_passwd

      image: "rwo:latest"
        -  "80:8080"
        - postgresql
              memory: 800M
        - type: bind
          source: /var/lib/roller
          target: /var/lib/roller
        - DB_HOST=postgresql
        - STORAGE_ROOT=/var/lib/roller
        - JAVA_OPTS="-Xmx700m"

    file: ./db_passwd.txt
It was a pain, but sometimes pain = gain and I learned a lot. I'm hoping the site will be a bit more stable now.

Modernizing the Roller UI


(image) I don't blog very often but I still find time to work on my blog's software: Apache Roller.

Recently, I decided to focus on improving Roller's ancient Struts 2-based user interface (UI). I had considered adding a comprehensive API to Roller and building a new UI based on that API, but wow that is a huge amount of work. Instead, I decided to modernize the Roller UI by using Twitter's Bootstrap components and CSS styles.

So far, I've devoted a couple of weekends to this work and made some pretty good progress. I'm about half-way done. I'm using the Struts2-Bootstrap plugin, adding better client-side form validation with JavaScript and doing my best to improve the overall user experience. You can see an album of the pages I've done so far on Flickr:
Roller UI with Bootstrap

I would love any contributions, so if you are interested in helping out, please submit Pull Requests against the bootstrap-ui branch in the Apache Roller repo on GitHub.

Fractal fun with HTML5 and TypeScript


MbCanvas is a fun project that I did in 2015: a simple Mandelbrot Set viewer written in Typescript and using the HTML5 Canvas. I did the project to learn more about Typescript and the HTML5 Canvas and I must say, Typescript very nice -- so much easier to read and write than plain old JavaScript, at least for me.

Here's an example image from the viewer.


The project is fairly easy to build if you've got Node and NPM installed, or you can play around with it here: mbcanvas - Mandelbrot viewer in TypeScript

Usergrid-Vagrant updated for Usergrid 2



If you're interested in trying the not-yet-released Apache Usergrid 2 you might want to checkout my Usergrid-Vagrant project on GitHub. I just updated the project to support Usergrid 2, using the latest code from the Usergrid "release" brach. The big changes were switching to OpenJDK 8 and adding ElasticSearch. I also rewrote the scripts to use plain old Bash instead of Groovy.

If you want the old Usergrid 1 Vagrant-file then checkout the "1.x" branch.

Now hosted on DigitalOcean


After thirteen years of hosting this blog at, I've moved it over to DigitalOcean. Kattare was great, but nowadays I prefer managing my own server and DigitalOcean makes that very easy -- and costs less ($10/month vs. $26/month at Kattare).

The move was easy, or as easy as setting up OpenJDK 8, Tomcat 7 and MySQL 5.5 can be. I only hit one little snag. Once I added the Roller WAR to Tomcat, Tomcat would hang on startup. I used jstack to look at the Java VM threads and found some clues that led me to a post on Tomcat 7 hangs on deploying apps. As recommended in that post, I added to my CATALINA_OPTS and was back in action.

Apache Shiro for authentication in Roller


This is the third of my 2014 side projects that I'm sharing and one that involves the Apache Roller blog server and the Apache Shiro security framework. You might find this interesting if you're considering using Shiro for authentication and authorization, or if your interested in how security works in Apache Roller. Inspired by my work with Ember in Fall 2014, I started thinking about what it would take to build an Ember-based editor/admin interface for Apache Roller. To do that, I'd need to add a comprehensive REST API to Roller, and I'd need a way to implement secrity for the new API. I've enjoyed working with Apache Shiro, so I decided that a good first step would be to figure out how to use Apache Shiro in Roller for Roller's existing web interface. Working over the winter break I was able to replace Roller's existing Spring security implementation with Shiro and remove all Spring dependencies from my Rollarcus fork of Roller. Below I'll describe what I had to do get Shiro working for Form-base Authentication in Roller. Creating a Shiro Authorizing Realm The first step in hooking Shiro into Roller is to implement a Shiro interface called ShiroAuthorizingRealm. This interface enables Shiro to do username and password checks for users when they attempt to login, and to get the user's roles. Below is the first part of the class, which includes the doGetAuthenticationInfo() method, which returns the AuthenticationInfo for a user specified by an AuthenticationToken that includes the user's username. In other words, this method allows Shiro to look-up a user by providing a username and get back the user's (hashed) password, so that Shiro can validate a user's username and password. (link) public class ShiroAuthorizingRealm extends AuthorizingRealm { public ShiroAuthorizingRealm(){ setName("ShiroAuthorizingRealm"); setCredentialsMatcher( new HashedCredentialsMatcher(Sha1Hash.ALGORITHM_NAME)); } @Override public AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken authToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authToken; User user; try { user = loadUserByUsername( token.getUsername() ); } catch (WebloggerException ex) { throw new AuthenticationException( "Error looking up user " + token.getUsername(), ex); } if (user != null) { return new SimpleAuthenticationInfo( user.getUserName(), user.getPassword(), getName()); } else { throw new AuthenticationException( "Username not found: " + token.getUsername()); } } In the code above you can see how we pull the username out of the authToken provided by Shiro and we call a method, loadUserByUserName(), which uses Roller's Java API to load a Roller user object specified by name. The next method of interest is doGetAuthorizationInfo(), which allows Shiro to look-up a user's Role. This allows Shiro to detmerine if the user is a Roller admin user or a blog editor. (continued) public AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { String userName = (String) (principals.fromRealm(getName()).iterator().next()); User user; try { user = loadUserByUsername( userName ); } catch (WebloggerException ex) { throw new RuntimeException("Error looking up user " + userName, ex); } Weblogger roller = WebloggerFactory.getWeblogger(); UserManager umgr = roller.getUserManager(); if (user != null) { List roles; try { roles = umgr.getRoles(user); } catch (WebloggerException ex) { [...]

Usergrid and Ember - part 2


In part one, I explained the basics of the example Usergrid-Ember "Checkin" app, how the index page is displayed and how login is implemented. In part two, I'll explain how Ember can be hooked into the Usergrid REST API to store and query JSON objects. Ember includes a feature referred to as Ember-Data, which provides a persistence interface for storing and retrieving JavaScript objects that could be stored in memory, or stored on a server and accessed via REST API. To use Ember-Data with your REST API you've got to define an Ember-Data model and add an Ember-Data REST adapter. If your REST API differs from what Ember-Data expects then you will probably have to extend the built-in REST adapter to handle your URL pattens, and extend the built-in REST serializer to handle your JSON format. By extending Ember-Data in this way, you can use it to store and query data from Usergrid without using the Usergrid JavaScript SDK at all. Below I'll explain what I had to do to make the Checkin app's Activities collection available via Ember-Data. Define Ember-Data models Ember-Data expects each of your REST API collections to have a defined data model, one that extends the DS.Model class. Here's what I added for the Activities collection: From app (link) App.Activity = DS.Model.extend({ uuid: DS.attr('string'), type: DS.attr('string'), content: DS.attr('string'), location: DS.attr('string'), created: DS.attr('date'), modified: DS.attr('date'), actor: DS.attr('string'), verb: DS.attr('string'), published: DS.attr('date'), metadata: DS.attr('string') }); Create a custom RESTAdapter The Ember-Data REST adapter expects a REST API to follow some common conventions for URL patterns and for JSON data formats. For example, if your REST API provides a collection of cats then Ember-Data will expect your REST API to work like so: What Ember-Data expects for a cats collection: GET /cats - get collection of cats POST /cats - create new cat. GET /cats/{cat-id} - get cat specified by ID. PUT /cats/{cat-id} - update cat specified by ID. DELETE /cats/{cat-id} - delete cat specified by ID. Usergrid follows the above conventions for collections, but there are some exceptions. For example, the Usergrid Activities collection. A GET on the /activities path will return the Activities of the users that you (i.e. the currently authenticated user) follow. You don't POST new activities there, instead you post to your own Activities collection at the path /users/{your-user-id}/activities. It works like this: Usergrid's Activities collection: GET /activities - get Activities of all users that you follow. POST /user/{user-id}/activities - create new Activity for user specified by ID GET /user/{user-id}/activities - get Activities for one specific user. To adapt the Activities collection to Ember-Data, I decided to create a new model called NewActivity. A NewActivity represents the data needed to create a new Activity, here's the model: From app (Link) // Must have a special model for new activity because new // Activities must be posted to the path /{org}/{app}/users/activities, // instead of the path /{org}/{app}/activities as Ember-Data expects. App.NewActivity = DS.Model.extend({ content: DS.attr('string'), location: DS.attr('string'), actor: DS.attr('string'), verb: DS.attr('string') }); Then, in Checkin's custom REST adapter, I added logic to the pathForType() function to ensure that NewActivities are posted to the correct path. Here's the adapter: From app (Link) App.ApplicationAdapter = DS.RESTAdapter.extend({ host: Usergrid.getAppUrl(), headers: function() { if ( localStorage.getItem("access_token") ) { return { "Authorization": "Bearer " + localStorage.getItem("access_token") }; } return {}; }.property().volatile(), // ensure value not cached pathForType: function(type[...]

Usergrid and Ember - part 1


The next one of my 2014 Side projects that I’d like to share is Usergrid-Ember, an experiment and attempt to learn more about Ember and Apache Usergrid by implementing the Checkin example from my Usergrid mobile development talk. If you're interested in either Usergrid or JavaScript web development then I hope you'll read on... Why Ember? Ember is one of the leading frameworks for building browser-based apps. It's one of many JavaScript Model View Controller (MVC) frameworks. Generally speaking, these frameworks let you define a set of routes or paths in your app, for example /index, /orders, /about, etc. and map each to some JavaScript code and HTML templates. Handling a route usually means using Ajax to grab some “model” data from a server and using a template to create an HTML “view” of the data that calls functions provided in a "controller" object. JavaScript MVC frameworks are not simple and each has its own learning curve. Is it really worth the learning time when you can do so much with a little library like jQuery? For most projects I think the answer is yes. These frameworks force you to organize your code in a logical and consistent way, which is really important as projects grow larger, and they provide features that may save you a lot of development time. Based on what I've seen on the net and local meet-ups, the leading frameworks these days are Ember and AngularJS. After I saw Yehudi Katz’s talk at All Things Open, I decided to spend some time learning Ember. Getting started with Ember The first thing you see when you visit the Ember site is a big button that says "DOWNLOAD THE STARTER KIT" and so that is where I started. The Starter Kit is a, a minimal Ember project with about twenty JavaScript, HTML and CSS files. It's a good way to start: small and simple. Ember Starter Kit files: Sidebar: I do hope they keep the Starter Kit around when the new Ember-CLI tool matures. Ember-CLI generates too many magic boiler-plate files and sub-directories for somebody who is trying to understand the basics of the framework. And this is an interesting point of view: Ember-CLI is Making You Stupid by Yoni Yechezkel. Other stuff: Bower, Grunt and Bootstrap I like to bite off more than I can chew, so I decided to use a couple of other tools. I used Bower to manage dependencies and Grunt to concatenate and minify those dependencies, and other things like launching a simple web server for development purposes. I also decided to use Bootstrap to provide various UI components needed, like a navbar and nicely styled list views. I won't cover the details, but it was relatively easy to get Bower and Grunt working. Here are the config files in case you are interested: bower.json and Gruntfile. I did hit one problem: when I included Bootstrap as one of my dependencies the Glyphicons would all appear as tiny boxes, so I decided to pull Bootstrap from a CDN instead (looks like there is a fix for that now). Defining Index Route, Model and Template Every Ember app needs to define some routes. There is a default route for the "/" path which is called the index route, and you can add your own routes using the Router object. The snippet below shows what I needed to get started: Part of app (link) // create the ember app object App = Ember.Application.create(); // define routes { this.route("login", { path: "/login" }); this.route("logout", { path: "/logout" }); this.route("register", { path: "/register" }); }); Ember will look for the JavaScript Route and Controller objects as well as the HTML template using the names above. For example: Ember will expect the login route to be named App.LoginRoute, the controller to be named App.LoginController and the template to be named "login." Let's talk about the index route. When a user arrives at your app[...]

HTML5 Microdata and


Worth a read and related to my Web Integration Patterns post on Embedded Properties in HTML:

HTML5 Microdata and Microdata and On June 2, 2011, Bing, Google, and Yahoo! announced the joint effort When the big search engines talk, Web site authors listen. This article is an introduction to Microdata and The first section describes what HTML5, Microdata and are, and the problems they have been designed to solve. With this foundation in place section 2 provides a practical tutorial of how to use Microdata and using a real life example from the cultural heritage sector. Along the way some tools for implementers will also be introduced. Issues with applying these technologies to cultural heritage materials will crop up along with opportunities to improve the situation.

Understanding Google's new privacy policy


Worth a read:

Understanding Google's new privacy policy: When Google changed its privacy policy last week, they made a strong effort to ensure that everyone knew that a change had occurred, but if you tried to figure out what had actually changed, you had to wade through a lot of buzzwords and legalese. Now the Electronic Frontier Foundation's Rainey Reitman explains it in simple language.

How to select an Open Source project


A reasonable check-list for selecting an open source project:

How I select Open Source projects: An Open Source project is more than its set of tools. But this post is not about what is better, github or ASF. Much has been said already about it (and too much bullshit). What really bugs me is that people seem to choose Open Source projects after the tools the projects use. Here is my personal list after which I choose projects.

IBM abandons Lotus Symphony


Apparently 2001 called and asked for its office suite back.

IBM to close down Symphony, its OpenOffice fork | ZDNet : This move can’t come as too much of a surprise. In July 2011, IBM started donating its Symphony code to the Apache Foundation, which is now overseeing the remains of the OpenOffice project. I say “remains” because most of the development energy in the OpenOffice family has been going to the LibreOffice fork. Many users and Linux distributors, such as Ubuntu, have replaced OpenOffice with LibreOffice.

Scott McNealy's Wayin weighs in on the election


Nice coverage of Wayin in CNN Money:

Scott McNealy's Wayin weighs in on the election - Fortune Tech: Nearly 30 years after he co-founded Sun, and two years after the company sold to Oracle (ORCL), one of the tech industry's most outspoken and colorful executives is back. Only instead of selling servers and software to businesses, he's trying to get consumers, sports teams, and corporations -- and politicians -- to embrace a social media tool that's a little hard to define: It is part polling app, part interactive media tool (think Twitter), and part enterprise service.

The polling software at the heart of Wayin is super easy to use. It allows you to create basic questionnaires, on the web or using a mobile app, by selecting an image and asking a question. Pick a photo of the Fab Four, ask Who is your favorite Beatle?, and bingo, the answers from your followers will start trickling in immediately.

Tim Bray on HttpURLConnection


Good information on a bad API. The comments are good too:

HttpURLConnection's Dark Secrets: If you’re programming in the Java language and want to talk to a Web server, there are several libraries you can choose from. HttpURLConnection is one popular choice, and for Android programming, the engineering team has now officially suggested that you use it where possible.

O'Grady on DynamoDB


Great analysis, as usual, from Stephen O'Grady of Redmonk. Here's the part about Dynamo that concerns me, the lock-in:

Amazon DynamoDB: First Look: Like the initial wave of PaaS platforms, however, DynamoDB is available only through a single provider. Unlike Amazon’s RDS, which is essentially compatible with MySQL, DynamoDB users will be unable to migrate off of the service seamlessly. The featureset can be replicated using externally available code – via those projects that were originally inspired by DynamoDB, for example – but you cannot at this time download, install and run DynamoDB locally.

Amazon DymamoDB


Worth a read:

Werner Vogels: Amazon DynamoDB is a fully managed NoSQL database service that provides fast performance at any scale. Today’s web-based applications often encounter database scaling challenges when faced with growth in users, traffic, and data. With Amazon DynamoDB, developers scaling cloud-based applications can start small with just the capacity they need and then increase the request capacity of a given table as their app grows in popularity. Their tables can also grow without limits as their users store increasing amounts of data. Behind the scenes, Amazon DynamoDB automatically spreads the data and traffic for a table over a sufficient number of servers to meet the request capacity specified by the customer. Amazon DynamoDB offers low, predictable latencies at any scale.

The joys of solitude


Worth a read:

The Rise of the New Groupthink - Solitude has long been associated with creativity and transcendence. “Without great solitude, no serious work is possible,” Picasso said. A central narrative of many religions is the seeker — Moses, Jesus, Buddha — who goes off by himself and brings profound insights back to the community.

Obama Administration Comes Out Against SOPA, PIPA


I feel pretty strongly about this. I won't vote for a politician who backs SOPA or PIPA:

Obama Administration Comes Out Against SOPA, PIPA | TPM Idea Lab:Even more promising for critics of the bills, the Administration came down firmly against one of the most vehemently opposed portions of the bills — the part that would give the government the power to force Internet Service Providers to stop loading overseas webpages accused of piracy. Under the original versions of SOPA and PIPA, ISPs would be required to change their Doman Name System settings to block sites accused of piracy, a measure that critics said would essentially break the Internet and make it more insecure.

NYC gets a Software Engineering High School


Worth a read:

New York City gets a Software Engineering High School - Joel on Software:This fall New York City will open The Academy for Software Engineering, the city’s first public high school that will actually train kids to develop software. The project has been a long time dream of Mike Zamansky, the highly-regarded CS teacher at New York’s elite Stuyvesant public high school. It was jump started when Fred Wilson, a VC at Union Square Ventures, promised to get the tech community to help with knowledge, advice, and money.

The coming war on general-purpose computing


Cory Doctorow's keynote to the Chaos Computer Congress. Worth a read:

Lockdown: The coming war on general-purpose computing - Boing Boing

Open-source vs Weblogic and WebSphere


Survey says 80% of New Relic's Java customers choose open source app servers over expensive bloat-ware.

Server wars: Open-source Java vs Weblogic and WebSphere | Software, Interrupted - CNET News: Overall, it's not surprising that users who are deploying their applications to the cloud are more likely to use open source, if for no other reason than that licensing is far simpler. Additionally, there are Amazon Machine Images (AMIs) available for most open source stacks, making it very easy to choose open source over a traditionally licensed application server.

Looks like I'll be waiting for Netbeans 7.1.1


jVi Home Page: NetBeans 7.1 Bug 205835 can lose edits; a variety of jVi commands run into this. jVi-1.4.5 disables itself if it detects module versions with the bug, AFAICT. The bug is scheduled to be fixed in NB-7.1.1; sometime around January/February.

Seriously, how can you ship without vi?

State of Android


I hate the "will die" title but Antonio Rodriguz insightfully sums up the state of Android and it does not sound strong, to say the least. All the more reason to take a hybrid approach, e.g. project formerly known as PhoneGap.

Android as we know it will die in the next two years and what it means for you: I used to think that, as with Linux and web services in the early part of last decade, Android was going to be the mortar for the Internet of post PC devices— an essential ingredient to put stuff together. And as bonus, unlike Linux which puttered away quietly in the background doing the heavy lifting for services like Amazon and Google, Android was largely user-facing and would also therefore benefit from massive platform scale (and the resulting de-facto standard it would create) the way no piece of software since Microsoft Windows had.

Comments on blogs: emacs vs. vi


Brent Simmons says the blog comments vs. no blog comments debate is like vi vs. emacs. Despite his great explanation, only a geek would get thiat argument. Me, I like vi and blog comments... but may be that's because I don't get many. Comments on blogs: I see my blog that way: it’s one place on the web, the place where I write. It’s one leaf on a tree. It doesn’t have to contain everything. These days there are so many ways and places to comment — so many other tools — that including comments here would be Emacs-like.

Photo Friday: New Drapes


Finally, after 10 years in the house... drapes in the sun-room.


Taken with my new Canon SX40

OCLC doing interesting things with OpenSocial


And yes that's OCLC, not OSLC.

Rogue Gadgets: Ian Boston: OCLC recently launched WorldShare, an OpenSocial based platform that uses Apache Shindig to render Gadgets and provide access for those gadgets to a wealth of additional information feeds. It does not provide the container in which to mount the Gadgets but it provides a trusted and respected source of rendered Gadgets. This turns the OpenSocial model on its head. A not for profit organisation delivering access to vast stores of information via OpenSocial and the Gadget feeds. Suddenly the gadget rendered feed is the only thing that matters. The container could be provided by OCLC, but equally by members. OCLC has wisely decided to certify any gadget that it is prepared to serve.

More corporate censorship


Tumblr management shows off some pretty poor judgement here:

Jeremy Cutler: "Whether or not I have grounds to justly disagree with them on this, the fact remains that under the Tumblr Terms of Service, they are well within their rights to delete my Tumblr blogs as a punitive action should I continue to distribute the extension. They have informed me that this is the course of action they will take should I not acquiesce to their demands."

Corporate censorship


Rob Beschizza: "Don't let private companies represent themselves as public spaces. 'Cause they ain't."

2011 Tweet Cloud


Here's what I tweeted about in 2011:


Get yours here.



2012 is here and I'm happy that I'm still on the face of this spinning ball of star-stuff that we call earth. One of my resolutions this year is to blog more and I'm going to start with a catch-up post. Here's what I was up to in 2011.

At the start of 2011, I was still working for IBM. During the first half of the year I led the Open Services for Lifecycle Collaboration (OSLC) Core specification to finalization. I also managed the release of Apache Roller 5 and mentored a Google Summer of Code student who added Mobile Theming capabilities to Roller. Early in the year, I decided to get in shape, bought an elliptical machine and Line Dieted down 30 pounds. I also doubled-down on running and ran my first half-marathon (with my 14 year old son).

In July, I got a call from my former Sun co-workers and jumped at the opportunity to join Scott McNealy's new startup, Wayin. So far, it's been a blast. I've been able to put my knowledge of server-side web development, REST and social software to good use and have learned a hell of a lot about scaling with Amazon EC2, MongoDB, Solr and lots of other interesting bits.

Things have been going well on the homefront too. All three sons are all doing well and the oldest started high school this year. We're pretty busy all the time with extracurricular activities, family logistics, video game additions, etc. and that's mostly good, but we did find the time to get away for vacations in Charleston SC and Jekyll Island GA. So, that's that. You're all caught up and next, we'll see if I can keep this blog active this year.

Frustrating the Ugg boots, jerseys, etc. spammers


Ugg boots, sports jerseys, World of Warcraft (WOW) gold.... do you like those key words, spammers? Tough crap, you're not getting a link.

I'm posting this blog entry for the sole purpose of tempting, frustrating and basically just thumbing my nose at the idiotic comment spammers that attack this blog every day. Even though I blog about once a month these days, I get hit many times a day with spam. No worries, of course, the Akismet plugin stops 99% of them, but every once and a while, I notice the spam, bulk delete it and remember how much spammers suck.

Rollarcus: from 9 to 2



I made some progress in Rollarcus over the past couple of weekends, but not a lot. This makes me wonder how I ever found the "nights and weekends" to get Roller started in the first place, but that's a different topic.

What I've done so far in Rollarcus is to simplify things. While I was at Sun, we split Roller up into a number of parts: a weblogger part for blogging, a planet part for RSS/Atom aggregation, a core part for things common to both. After Sun, I worked to move Roller to Maven and further split things up into a total of 9 Maven modules including an assembly for building the release. Now, I think that all these modules are unnecessary -- we never shipped a Roller-Planet application and nobody wants to use parts of Roller -- and even if they did, the modules did not really help.

Here's the before view: apache/roller

Here's the after view: snoopdave/rollarcus

So, in Rollerarcus, I've merged all the modules. Except for one "test utilities" module, all Java code, JSPs and other code is now in one module and much easier to deal with. Next, I'm going to attack the (what I consider to be) unnecessary dependencies and drastically reduce the number of jars in WEB-INF.

UPDATE: The most significant of the changes that I made in Rollarcus have been applied by to Apache Roller and today (August 18, 2013) I removed the Rollarcus repository from Github.