Sunday, November 15, 2015

Linux Mint 17.2 on a fancy pants Dell XPS 15 9550

items you need before you start:
usb mouse
USB 3 to Ethernet adapter (recommend or trendnet TU3-ETG) or usb wifi adapter supported oob by linux
LinuxMint 17.2 loaded on a flash drive via 'create bootable usb drive'
patience :)

I got the chance to get my hands on a new Dell XPS 15 9550, model 10000SLV. What a beauty! 4k touch display, Skylake quad core i7 6700HQ, 15" screen in a 14" body(they call this infinity edge because of the tiny bezel), carbon fiber palmrests/deck. The thing is 4.4 lbs with the 87 wh battery and the 1TB ssd. It's width is much slimmer than that of the E7450, which I love, but it only a has dual core ultrabook i7 broadwell chip. This new machine is a true developer machine, basically a macbook pro on steroids for those who like to carve their own path with their OS of choice.

I couldn't find a guide in a single place to get this all working so I'll post all this together and show the sources I got bits of info off at the end for your reference. I found the best discussion for XP15 9550 owners here .

If you want to keep your Windows install, follow these instructions on on how shrink down the partition as small as possible. You can get it down to 128 gig or less easy following these instructions:

Next write the LM 17.2 iso onto a thumb drive.

First of all, before you start get yourself a usb 3 to ethernet dongle, like the or the Trendnet (I usually use the Starttech but the Trendnet was half the price, and had it on my door in 8 hours via prime now). The model I used is TU3-ETG. If you have an old usb wifi adapter lying around that linux supports, that will do as well.

next hit f2, boot into bios. Turn off secure boot, turn on legacy rom boot support. Go to the system preferences and change the sata controller to AHCI from RAID.

Next boot off your USB drive with LM 17.2 on it. When the dell logo appears hit f12 until you get a message its making boot menu. Under UEFI boot, choose the usb thumb drive, not the one under legacy boot. This lets LM/Ubuntu fix the partition tables and do the UEFI stuff for you so you're dual boot isn't wrecked.

If you get freezes during use or boot, try to add this to the end of the 'linux' line in grub (hit e at the grub menu) 'nouveau.modeset=0'. This didn't happen to be until I updated the kernel in a later step.

Now install 4.3 kernel. This has skylake support for our machine's chipset - it also gets the dell (broadcom) wifi working (although 2.4ghz only for now) see directions here:

after that your touchpad will stop working - you have to do these steps (found in the first post) use steps 8, 9, and 10.
8) Fix touchpad problem. Apparently the wrong kernel module (driver) is loaded. It's loading i2c_hid instead of i2c_designware_*.
lsmod | grep i2c #check what's loaded
echo "blacklist i2c_hid" | sudo tee -a /etc/modprobe.d/blacklist.conf
#apparently just blacklisting isn't good enough, for me it was also hiding in initramfs
sudo depmod -a
sudo update-initramfs -u

9) Graphics will be weird and flaky. The Nvidia drivers in the standard repositories are also a bit too old and will be flaky. I found that the new graphics-driver PPA worked well. Didn't try downloading from Nvidia directly. Bumblebee didn't work for me, giving a black screen, so Nvidia PRIME is recommended.
sudo apt-get purge nvida-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-355 nvidia-prime
sudo service lightdm restart

10) Add an indicator so you can tell whether Intel or Nvidia is being used.
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install prime-indicator

This will use Nvidia drivers the whole time. This works with dual monitors via HDMI but if you plug in and unplug it several times it will stop working until you reboot. Every attempt to use skylake intel video results in a 'software rendering being used' warning after login - So there is more work to do there. Once Dell finishes their 'developer edition XPS13' support they should fix the XPS15 drivers next. It's weird because the XPS15 seems more like a developer machine to me.


Quirks - wifi doesn't see 5G hotspots
reboots - sometimes it hangs on the linuxmint logo, power down and it comes back. Other times it reboots in a loop on the dell logo (must be a bios bug in 1.000.5)
switching prime profiles crashes the video driver requiring a reboot - keep it on Nvidia full time for now (seems to use 25 watts like this while pretty much idle)

Webcam, sounds, microphone, chrome+hangouts all work. Keyboard shortcuts for volume, keyboard backlight, and screen brightness work too.

Feel free to contact me on twitter @RyanVanderwerf if you find any other revelations like 5G band wireless or steps to switch between Skylake intel video and nvidia smoothly.

Tuesday, July 14, 2015

How to publish Grails 3 plugin snapshots to your local Artifactory server

One my co worker Rob Bugh got stumped on this for a while and eventually threw it over to me. I was stumped as well but I finally figured this out.

In this case we're trying to make a custom fork of the Grails 3 plugin - we had to tweak it a bit to work with Terracotta OS, because it only supports Quartz 2.1:

I ran into a couple tidbits of info, but mostly the solution in part lies with a part of Grails 3:

If you look in there you see a bit of this code:

maven(MavenPublication) {
            pom.withXml {
                def pomNode = asNode()
                pomNode.dependencyManagement.replaceNode {}

                // simply remove dependencies without a version
                // version-less dependencies are handled with dependencyManagement
                // see for more complete solutions
                pomNode.dependencies.dependency.findAll {
                }.each {
                    it.replaceNode {}

The part with pom.withXml is part of the magic witchery here - all of the spring   boot dependencies don't include version numbers which makes gradle very angry and  confused. However I couldn't get the maven(MavenPublication) to work with the      latest Artifactory plugin. It appears they are just using maven publish instead in Grails, unless it's using the Bintray support. What it is doing here is stripping out all of the stuff without versions on it - those are managed by Grails 3/Boot. It seems like a bit of a hack, until there is a profile called 'artifactoryPublishing' this will have to do.

You also can't use these types of plugins as 'apply: plugin' - you need to reference them under dependencies like Benoit mentioned in his blog: .

So let's bring those pieces together in your plugin like so:

publishing {
        publications {
            mavenJava(MavenPublication) {
              pom.withXml {
                def pomNode = asNode()
                pomNode.dependencyManagement.replaceNode {}

                // simply remove dependencies without a version
                // version-less dependencies are handled with dependencyManagement
                // see for more complete solutions
                pomNode.dependencies.dependency.findAll {
                }.each {
                    it.replaceNode {}
            def descriptor =
                artifacts = ["build/libs/quartz-${version}.jar",sourcesJar]
artifactory {
  contextUrl = 'http://your.artifactory.server/artifactory'

  publish {
    defaults {
      publishArtifacts = true
      publishPom = true

    repository {
      repoKey = 'plugins-snapshot-local'
      username = 'yourusername'
      password = 'password'


also don't forget to include your Artifactory plugin in your build.gradle file:
plugins {
    id "io.spring.dependency-management" version "0.3.1.RELEASE"
    id "com.jfrog.bintray" version "1.1"
    id "com.jfrog.artifactory" version "3.1.1"

And then in your app (or another Grails 3 plugin) don't forget your private repo:

repositories {
      maven { url "http://your.artifactory.server/artifactory/plugins-snapshot-local" }

And also your dependency:

dependencies {
    compile("org.grails.plugins:quartz:2.0.1-SNAPSHOT") {
    exclude group: 'slf4j-api', module: 'c3p0'

Now I'll build my plugin that uses this local version of the quartz grails 3 plugin:

 $ gradle assemble
[buildinfo] Not using buildInfo properties file for this build.
Processing File 1 of 1 -
Compressing File 1 of 1 - manifest
Finished Precompiling Assets
:compileAstJava UP-TO-DATE
:compileAstGroovy UP-TO-DATE
:processAstResources UP-TO-DATE
:astClasses UP-TO-DATE
:compileJava UP-TO-DATE
:configScript UP-TO-DATE

Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 warning
:copyAstClasses UP-TO-DATE
:copyAssets UP-TO-DATE
:copyCommands UP-TO-DATE
:copyTemplates UP-TO-DATE
:processResources UP-TO-DATE
:compileWebappGroovyPages UP-TO-DATE


Yes! We are in business!

follow up. On some versions of OS Artifactory you might get this error first time you publish:

Failed while reading the response from: PUT;build.timestamp=1436911730122;;build.number=1436911734140 HTTP/1.1
org.codehaus.jackson.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source:; line: 1, column: 2]
at org.codehaus.jackson.JsonParser._constructError(
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnexpectedValue(
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(
at org.codehaus.jackson.JsonParser.readValueAs(
at org.jfrog.gradle.plugin.artifactory.task.BuildInfoBaseTask.deployArtifacts(
at org.jfrog.gradle.plugin.artifactory.task.BuildInfoBaseTask.prepareAndDeploy(
at org.jfrog.gradle.plugin.artifactory.task.BuildInfoBaseTask.collectProjectBuildInfo(
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
at java.lang.reflect.Method.invoke(
at org.gradle.internal.reflect.JavaMethod.invoke(
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(
at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(
at org.gradle.execution.SelectedTaskExecutionAction.execute(
at org.gradle.execution.DefaultBuildExecuter.execute(
at org.gradle.execution.DefaultBuildExecuter.access$200(
at org.gradle.execution.DefaultBuildExecuter$2.proceed(
at org.gradle.execution.DryRunBuildExecutionAction.execute(
at org.gradle.execution.DefaultBuildExecuter.execute(
at org.gradle.execution.DefaultBuildExecuter.execute(
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(
at org.gradle.initialization.DefaultGradleLauncher.doBuild(
at org.gradle.launcher.exec.InProcessBuildActionExecuter$
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(
at org.gradle.internal.Actions$RunnableActionAdapter.execute(
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(
at org.gradle.launcher.cli.ExceptionReportingAction.execute(
at org.gradle.launcher.cli.ExceptionReportingAction.execute(
at org.gradle.launcher.Main.doAction(
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
at java.lang.reflect.Method.invoke(
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(
at org.gradle.launcher.GradleMain.main(

Not to worry, just run the command again and it works. Appears to be a bug in Artifactory :)

Tuesday, July 29, 2014

Lego Mindstorms EV3: LeJOS and Groovy - how to get started!

I've recently given a workshop for Lego Workshop at and this year showing how to integrate Groovy and Mindstorms together. I have slides available here, however they don't have a getting started (I pre-setup the robots and microSD cards before the workshop) tutorial: So how do I set  this up with my Lego EV3 I just ran home to buy after seeing this? Baruch Sadogursky (@jbaruch) asked me to write this post and and kindly offered to post the ISOs in Bintray so when people get home they are ready to roll with their Groovy Robots! here is the download link

Step 1: Buy a Edimax 7811un wireless adapter like this one. They are less than $10USD on Amazon and Newegg. Likely you don't find these at the local store. They are very tiny and cause least amount of issues with building the robots.

Step 2: Get a 2GB or larger microsd card. Delete all of the partitions. Create 2 partitions (I use gparted on Linux):
1) 477 MB fat32 partition
2) 600 MB ext2 partition

Use the dd command in linux (I think this will work with MacOSX too).
dd if= lejos-part1-fat32-477mb-lba.iso.iso (Get this from bintray) /of=/dev/XXXX

where XXX=destination device partition  (mounted on your computer)

dd if=lejos-part2-ext2-600mb.iso (Get this from bintray) /of=/dev/XXXX

where XXX=destination device partition  (mounted on your computer)

If you SD card is larger, you can expand the 600MB partition to fill your SD card if you like without much risk.

Step 3: Check out my lejos fork:
git clone git:// u-ryanv78665-lejos

Step 4: build the "EV3GroovyTest" file with the following command:
'gradlew ":EV3GroovyTest:jar"

Step 5: Boot robot up with the Edimax adapter and setup on your wifi network using the menu.

Step 6: scp the jar (under EV3GroovyTest/build/libs) to root@x.x.x.x:/home/lejos/tools(fastest) or  /home/lejos/samples or /home/lejos/programs (safest)

Step 7: if you want to tweak ev3classes libs or DBusJava you can build those with gradle too, and update the jars on the sd card via SCP if you'd like.

Follow the slides for more in depth info!

Webrover1 repo:

Bintray repo for ISOs:

Happy Groovy Roboting! Thanks @ALittleOfJoe for the robot selfie pic from the US workshop! And @rappelg for the robot pic.

Friday, October 11, 2013

Installing LinuxMint or Ubuntu on my XPS 14 ultrabook - what worked for me

I've also done these same steps for other UEFI laptops like the newer ASUS machines. Other than the BIOS tweaks, the same pattern should work for most newer UEFI computers.

UEFI seemed like a great idea and first, but it sorted of hozed things for people who want to run open source systems like many Linux flavors who do not have the ability to get a secure boot key (read tax for people with money).  Read more about UEFI here.

 I just installed LinuxMint 15 on my refurb I just got from the 30% off sale at dell outlet. Everything works, I didn't need a special kernel to make the keyboard backlight controls working, or screen dimmer.

I downloaded the Ubuntu secure remix from here onto a usb stick.

Items needed: 2 usb sticks, one with Secure Ubuntu Remix, and the other with the linux flavor of your choice Go here to get the image.

 Steps I did:

 1) Disable secure boot in bios, disable intel rapid start and caching. (My system has the 500gb + 32gb msata ssd)

2) boot into windows 8(newer machines with UEFI probably have windows 8 installed). Shrink partition down as low as it will go (it let me drop it down by 230gb or so). while holding down shift, click restart, keep holding it down until boot options appear, pick other/usb stick

3) ubuntu remix boots - click install, format 32gb ssd as target install, set boot loader to /dev/sda (it will default to that) to 500gb. It will make a grub partition there out of a small piece of free space

4) after reboot, ubuntu should boot. Go to boot repair icon it has, it pick auto-fix options. next reboot will give you a grub menu and let you choose UEFI loader or linux

5) both OSs should boot - At this point you can boot off another USB of your choice and replace the ubuntu install (I did linux mint) on the 32gb ssd.

After install, you'll have to manually add or download the boot repair tool again, it will fix grub so you can get both linux and windows After that I installed bumblebee to get my power consumption down to 15 watts or less. Before that its higher, as the nvidia 630 is always running. Everything works, battery life is good. Suspend/resume for me has not caused any issues yet, I've done it about 5 times today and wifi comes back and all. So far I am digging the machine!

 If you just want Linux installed and no Windows 8, in step 2, boot on the secure ubuntu image, and click on the icon for OS remover. You can then just erase the windows partition, then run boot repair and continue with rest of the steps.

 If you only have one hard disk, you'll just need to direct ubuntu to install on a new partition out of the free space on the drive you just made from either killing Windows or shrinking the partition. Tip: if you run a defrag util in windows first, you will be able to shrink the partition down more then as it comes. 

Good luck enjoying your new computer, free of Windows!

Thursday, July 25, 2013

My 2013 Wrap Up

What a great year for the US Gr8Conf! It was so great meeting everyone again (and folks I had not met yet)for my 2nd year speaking. The weather the perfect, Shaun and his volunteers kept everyone running without a hiccup, talks were great, after hours events were fun. I was excited to share what I have learned with tech I have been working with lately in my talks. It was great to attend the talks as well, which such a good balance of different kinds of topics all related in some way to Grails or Groovy. What was also the benefit above all others, is to network with speakers and attendees. That's when the real world stuff comes out, problems people face, things people are trying, as well as talking with the committers themselves on many projects. Watching videos of talks is great (They recorded them this year to appear later on InfoQ), but actually GOING to these conferences (like Gr8, GGX, S2GX and others) and talking to people is where at least half the value lies. What I love about this community is everyone is approachable and humble, and helpful. I've never seen anyone act snobby or 'too good' to talk to anyone. I hope that attitude always continues, which is one of the many reasons I love this great community. Thank you sponsors OPI, Target, Bloom, and others for the wonderful events, food, and drinks. The hackathon was great, but if we had it so our API keys worked through the conference and turned our submissions morning of the last day, and possibly allow 4 person teams, even cooler stuff would come out. I personally had too elaborate of an idea, and I didn't come close to finish it for submission in 4 hours. Thanks Jeff Beck for the lovely beer gift and for our beverage ingredients, thanks to Rob Fletcher for our drink exchange. Thanks Luke for the Dave and Busters cards! If there is one thing I DEFINITELY learned, was that Dan fixed the Grails twitter notifier plugin - or something :) Hope to see everyone next year in Minneapolis!

Tuesday, March 26, 2013

Austin Groovy and Grails Meetup April 4!

Come meet up with the Austin Groovy and Grails User Group meetup @ Mister Tramps, April 4! I will give a talk on clustering Quartz in Grails! (Same from last year!). This event sponsored by New Iron. (

Monday, January 28, 2013

When GVM

Love GVM for switching between Grails versions. However my install in Ubuntu stopped working a few weeks ago and I've been puzzled ever since. If you run gvm, and it stops working where the command 'gvm' returns nothing, run this: source ~/.gvm/bin/ then you can do 'gvm selfupdate' to bring it up to date. Working like a champ now! If you do Groovy/Grails/Griffon/Gradle/Vertx development and don't use GVM you should. Check it out at