[TIBCO Spotfire] Export data table as CSV via IronPython

Here's a sample script to programmatically via IronPython export a data table as CSV

from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File

writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter)
table = Document.ActiveDataTableReference #OR pass the DataTable as parameter
filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() #OR pass the filter
stream = File.OpenWrite("PATH/NAME.csv")
names = []
for col in table.Columns:
writer.Write(stream, table, filtered, names)

Note: the path you pass to the File.OpenWrite function is relative to the machine running the analysis; this means that on the Web Player, unless you find a way to stream the data back to the user browser, the end user will never receive the file

[TIBCO Spotfire] Mark rows via IronPython

Here's a sample script to programmatically via IronPython mark rows with a particular value (set GRAPH as script parameter pointing to the visualization you want to work on):

from Spotfire.Dxp.Data import DataPropertyClass
from Spotfire.Dxp.Application.Visuals import VisualContent
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection
from Spotfire.Dxp.Data import DataValueCursor
from System import String

# get object reference
vc = GRAPH.As [VisualContent] ()
dataTable = vc.Data.DataTableReference

# get marking
marking = vc.Data.MarkingReference

rowCount = dataTable.RowCount
rowsToInclude = IndexSet (rowCount, True)
rowsToSelect = IndexSet (rowCount, False)

cursor1 = DataValueCursor.CreateFormatted (dataTable.Columns ["COLUMN_NAME"])

#Find Records by looping through all rows
idx = 0
for row in dataTable.GetRows (rowsToInclude, cursor1):
    found = False
    aTag = cursor1.CurrentValue
    print aTag
# if there’s a match, mark it
    if aTag == VALUE:
        rowsToSelect [idx] = True
        print idx
    idx = idx + 1

#Set Marking
marking.SetSelection (RowSelection (rowsToSelect), dataTable)

[TIBCO Spotfire] Filter handling via IronPython - set value

Here is a sample script to programatically via IronPython set a value for a filter in Spotfire; if the value does not exist in the allowed filter values, set it to the maximum possible

import Spotfire.Dxp.Application.Filters as filters
import Spotfire.Dxp.Application.Filters.ListBoxFilter
from Spotfire.Dxp.Application.Filters import FilterTypeIdentifiers

#use following line if the filter is to be applied to the currently active page - CAUTION, as we might alter the filter for a different filtering scheme then!
myPanel = Document.ActivePageReference.FilterPanel
# alternatively use following line to se it for a specific page
#myPanel = myPage.FilterPanel
#where myPage is a script parameter that points to the page we want it to work on
myFilter = myPanel.TableGroups[0].GetFilter("FILTER_NAME")
lbFilter = myFilter.FilterReference.As[filters.ItemFilter]()
if VALUE in lbFilter.Values:
    lbFilter.Value = VALUE
    lbFilter.Value = max(lbFilter.Values)

[TIBCO Spotfire] Cumulative sum

Here's a simple formula to plot the cumulative sum (trend) of data in Spotfire

Sum([COLUMN]) OVER (intersect(AllPrevious([Axis.Rows]),[GROUP_BY_1],...,[GROUP_BY_N])) as [ALIAS]

Just put it on the X-axis and you're set. The grouping is optional


[TIBCO Spotfire] OSI PI data source template

Here is a sample connection template to add OSI PI as Data Source in the Spotfire Server:

 <!-- WARNING!!!! Old PI JDBC driver versions have .NET dependencies (RDSAWrapper.dll) - https://techsupport.osisoft.com/Troubleshooting/KB/KB00494 -->  
 <!-- SQLDASServer is the OSI component we should connect to, PIServer is the name of the PI Server we want to access AS REGISTERED ON THE DAS server -->  
 <connection-url-pattern>jdbc:pisql://SQLDASServer/Data Source=PIServer;Integrated Security=SSPI</connection-url-pattern>  
 <!-- to use PI authentication instead of Windows Integrated Authentication, use this url:  
 <connection-url-pattern>jdbc:pisql://SQLDASServer/Data Source=PIServer;User ID=Username;Password=Password</connection-url-pattern>  

NOTE: Depending on your connection needs (using Windows Integrated Authentication OR Username/Password), you need to change the connection url pattern accordingly. This means that you CANNOT leave both connection-url-pattern sections from the sample above when you add the template, BUT nonetheless, the user CAN change the connection URL to either one of those values as per his needs when he sets up the connection

Remember to read the Spotfire documentation (chapter 11.5) on how to set it up correctly!

[TIBCO Spotfire] SAP HANA data source template

Here is a sample connection template to add SAP HANA as Data Source in the Spotfire Server:

  <ping-command>select 1 from dummy</ping-command>  

Remember to read the Spotfire documentation (chapter 11.5) on how to set it up correctly!

[TIBCO Spotfire] Excel JDBC data source template

If you want to take full advantage of the Information Designer capabilities when connecting to non-default data sources, and your analysis can't be fully developed using only Connectors and/or ADS, you might want to create your own data source template. [1]

The idea is simple: as long as you have a proper JDBC driver and can supply basic details on how to connect and handle operations, Spotfire Server allows you to add a custom connection template that end users will be able to select when creating a new Data Source. [2]

Here is a sample connection template for Excel. Note that in this case you will need the ODBC driver as well.

  <!-- Informative name and display-name -->   
  <!-- point out the JDBC-ODBC bridge -->   
  <!-- Pattern displayed to administrator when setting up the Datasource -->   
  <!-- Table types allowed for EXCEL is TABLE and SYSTEM TABLE -->   
  <table-types>TABLE, SYSTEM TABLE</table-types>   
  <!-- As ping command we will use the integer constant 1. Could really be any pseudo function. -->   
  <ping-command>SELECT 1</ping-command>   
  <connection-properties />   
  <!-- Excel does not support catalogs nor schemas -->   
  <!-- Found an error in excel not allowing Distinct in combination with order-by on all columns. -->   
  <!-- Choice between supporting order by and distinct in favor for distinct -->   
  <!-- to make prompt without duplicates and support distinct conditioning. -->   
  <!-- Format pattern for date, time and datetime (same as timestamp). -->   
  <date-literal-format-expression>{d '$$value$$'}</date-literal-format-expression>   
  <time-literal-format-expression>{t '$$value$$'}</time-literal-format-expression>   
  <date-time-literal-format-expression>{ts '$$value$$'}</date-time-literal-format-expression>   

[1] Data source template documentation - Chapter 11.5
[2] Sample guidelines to add Attivio as data source


CalEAppio? HallowEAn!

150+ people?
Swimming pools of alcohol and 5-stars fusion gourmet restaurant food?
Hooker's firebin?
Blocking the street with a party sized Twister?

If you guessed "Halloween at EA's", you were definitely there, I mean, who else would drive to Caleppio by his own will?

Now you wish you had.

Click on the image to see the full album


[Java Spring] Plan my Groove

Plan my Groove is a simple Java7+ application to expose a REST API to let users remotely execute Groovy scripts

It was tested on both JDK7 and JDK8 and as of now it exposes functionality to:

  • submit a job
  • list and search for jobs
  • retrieve the result of a job
  • delete a job

Where a job is a simple Groovy script. It's possible to submit multiple jobs simultaneously and also run them at the same time.

It relies heavily on the RepositoryRestResource functionality offered by the Spring framework to provide a set of RESTful services.

Find the source code at https://github.com/steghio/PlanMyGroove and for more information, read the documentation at https://github.com/steghio/PlanMyGroove/blob/master/plan_my_groove_manual.pdf


[Java] Better Fibonacci algorithms

The last time we saw a good Fibonacci algorithm, which is better than the textbook one, but still falls short of its duties for numbers around 100.

So here are a couple others algorithms which can efficiently compute big Fibonacci numbers correctly. I was able to test them up to around 10 millions, after which it took more than 30 seconds on my machine to produce a solution, which wasn't always correct.


[Java] Good Fibonacci algorithm

Here is an efficient implementation of the Fibonacci algorithm by Michael Goodrich. I found it to be very fast and you should think about using it instead of the textbook implementation of the algorithm which is highly unoptimized and will start crashing pretty much immediately when you raise the number you want to compute by little.

 public static long[] fibGood(int n) {  
   if (n < = 1) {  
     long[] answer = {n,0};  
     return answer;  
   } else {  
     long[] tmp = fibGood(n-1);  
     long[] answer = {tmp[0] + tmp[1], tmp[0]};  
     return answer;  

You will have the answer for fibGood(n) in fibGood(n)[0]


FLOWing in the baltics

What happens when you mix an Irish, an Italian, and science?

Then you let it FLOW free!

Check here to view the full album


[Spotfire] Send JMS message to EMS with IronPython script

Want to take your Spotfire analysis to the next level? What about adding an extra level of interactivity to it?

Maybe you also have a BusinessWorks or BusinessEvents engine somewhere feeding data to it, and you spot something that requires your intervention, or maybe you want to replay a flow for some reason. Sound like you need to have Spotfire communicate with those engines.

HTTP? Sure it works. What if you prefer JMS instead because you also have your own EMS server?

[APT] Fix "some indexes failed to download" error

If you ever encounter this APT error:

some indexes failed to download (E: Some index files failed to download. They have been ignored, or old ones used instead.)

It might mean that your local APT info somehow was messed up but you can easily fix this by purging it and asking APT to update it again:

sudo rm -vf /var/lib/apt/lists/*
apt-get update

[Oracle] Purge schema

Purging a schema in Oracle isn't a straightforward procedure. Usually it's better to DROP the schema or the USER and recreate it.

But if you do not have the permissions to do that, or have other restrictions preventing you to perform the operation, you might find this piece of SQL code useful:

SELECT 'drop '||object_type||' '||object_name||' '||DECODE(object_type,'TABLE', ' cascade constraints;', ';') FROM USER_OBJECTS

This will generate drop statements for ALL objects in the schema it's run on. Just execute it after connecting as the user whose schema you want to purge, then copy the output and run it as script.

[Python] HTTP POST

Here is a sample piece of code on how to issue HTTP POST requests with an XML payload from Python

 URI = 'https://httpbin.org/post'  
 from System.Net import WebRequest  
 from System.Text import Encoding  
 request = WebRequest.Create(URI)  
 request.ContentType = "text/xml"  
 request.Method = "POST"  
 bytes = Encoding.ASCII.GetBytes(PARAMETERS)  
 request.ContentLength = bytes.Length  
 reqStream = request.GetRequestStream()  
 reqStream.Write(bytes, 0, bytes.Length)  
 response = request.GetResponse()  
 from System.IO import StreamReader  
 result = StreamReader(response.GetResponseStream()).ReadToEnd()  
 print result  

[Java] untar

Now that we know how to tar in Java, let's see how to unzip using the same Apache Commons Compress library:

 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.FileOutputStream;  
 import java.io.OutputStream;  
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;  
 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;  
 import org.apache.commons.compress.utils.IOUtils;  
 public void untar(String tarlocation, String tarname, String untarlocation){   
      //method variables   
      private File tarFile;  
      private TarArchiveInputStream tar_is;  
      private FileInputStream fin;  
      private TarArchiveEntry entry;  
      private File entryDestination;  
      private OutputStream out;   
      tarFile = new File(tarlocation+tarname);  
      fin = new FileInputStream(tarFile);  
      tar_is = new TarArchiveInputStream(fin);  
      //for each reference, untar to untarlocation, creating directories if needed  
      while ((entry = tar_is.getNextTarEntry()) != null) {  
           entryDestination = new File(untarlocation, entry.getName());  
           //if necessary create dir structure  
           if (entry.isDirectory())  
           else {  
                     //untar current entry  
                     out = new FileOutputStream(entryDestination);  
                     IOUtils.copy(tar_is, out);  
                catch(Exception e){  
                     throw e;  
                     //close streams ignoring exceptions  

[Java] Tar file or folders

A simple way to tar a file or folder (with or without subdirectories) maintaining the folders structure is using the Apache Commons Compress library.

 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.FileOutputStream;  
 import java.io.OutputStream;  
 import java.nio.file.Files;  
 import org.apache.commons.compress.archivers.ArchiveOutputStream;  
 import org.apache.commons.compress.archivers.ArchiveStreamFactory;  
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;  
 import org.apache.commons.compress.utils.IOUtils;  
 public void tar(String location, String name, String tarlocation, String tarname){   
      //method variables   
      private OutputStream out;  
      private ArchiveOutputStream tar_out;  
      private FileInputStream tmp_fis;  
      //out writes the final file, tar_out creates the tar archive   
      out = new FileOutputStream(new File(tarlocation+File.separator+tarname+".tar"));   
      tar_out = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR, out);   
      //tar it   
      File f = new File(location+File.separator+name);   
      //first time baseDir is empty   
      dotar(f, "");   
      //close archive   
 //aux method for tarring  
 private void dotar(File myFile, String baseDir) throws Exception{  
      //maintain the directory structure while tarring  
      String entryName = baseDir+myFile.getName();  
      //DO NOT do a putArchiveEntry for folders as it is not needed  
      //if it's a directory then list and tar the contents. Uses recursion for nested directories  
      if(myFile.isDirectory() == true){  
           File[] filesList = myFile.listFiles();  
           if(filesList != null){  
                for (File file : filesList) {  
                     dotar(file, entryName+File.separator);  
           //add file  
           tmp_fis = new FileInputStream(myFile);  
                tar_out.putArchiveEntry(new TarArchiveEntry(myFile, entryName));  
                IOUtils.copy(tmp_fis, tar_out);  
           catch(Exception e){  
                throw e;  
                if(tmp_fis != null) tmp_fis.close();  

It has to be recursive so that we can handle subdirectories correctly. The resulting tarred file will untar to the same exact folder structure originally tarred. If you pass the location and tarlocation parameters with the path separator already appended, there's no need to concatenate File.separator in the code.


[Oracle] wget or curl binaries from OTN website

Usually when you try to download Oracle's JDK or Oracle's DB driver jars you need to manually accept a license agreement before you are allowed to download them.

This obviously is not possible to do when trying to get those resources using wget or curl, but you can work around this by adding a cookie to your request saying that you do accept the licence:

wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" "RESOURCE URL"

Where RESOURCE URL for latest JDK7 for example is: http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz

If you do not do this, you'll just download a file saying that you need to accept the licence instead

[Java] Gzip deflate and inflate

Here's a simple class to deflate and inflate Gzip files in Java. It uses Apache Commons compress (those methods are also in Apache Commons library) for some utility methods, but they can be replaced with pure Java versions.

 import org.apache.commons.compress.utils.IOUtils;  
 import java.io.FileInputStream;  
 import java.io.FileOutputStream;  
 import java.util.zip.GZIPInputStream;  
 import java.util.zip.GZIPOutputStream;  
 public static class GZ{  
      public static void gzDeflate(String in, String out){  
                     FileInputStream fin = new FileInputStream(in);//file to compress  
                     FileOutputStream fout = new FileOutputStream(out);//output file  
                     GZIPOutputStream gz_out = new GZIPOutputStream(fout);//gzipped file  
                     //creates gzip  
                     IOUtils.copy(fin, gz_out);  
                     /*if you do not want to use Apache libraries, you can read bytes from fin and write them to gz_out in a loop*/  
                catch(Exception e){  
                     //do something  
                     //DO NOT close in any other order!!  
                     /*if you do not want to use Apache libraries you can check if object is not null and close it*/  
      public static void gzInflate(String in, String out){  
                     FileInputStream fin = new FileInputStream(in);//file to decompress  
                     GZIPInputStream gz_in = new GZIPInputStream(fin);  
                     FileOutputStream fout = new FileOutputStream(out);//output file  
                     //inflates gzip  
                     IOUtils.copy(gz_in, fout);  
                     /*if you do not want to use Apache libraries, you can read bytes from gz_in and write them to fout in a loop*/  
                catch(Exception e){  
                     //do something  
                     //DO NOT close in any other order!!  
                     /*if you do not want to use Apache libraries you can check if object is not null and close it*/  

As you can see, all usual checks have been omitted but I'm sure you'll check for file existence, etc.. beforehand


[TIBCO] BusinessWorks 6 Compress Plugin for TAR and GZ

Happy to announce the availability of the 1.2.0.FINAL version of the TIBCO BW6 Compress palette. It supports ZIP, GZ and TAR formatsThis is developed in my free time and it's not endorsed, verified or supported by TIBCO in any way (yet?).

It uses Apache Common Compress library 1.9 with no modifications and it's packaged within the plugin.

Online docs are (temporarily) available at: http://digilander.libero.it/otacoconvention/archivi/TIBCO_BW6_Compress_plugin_doc/index.html and can also be accessed from BusinessStudio by selecting the activity and pressing F1 (requires internet connection).

I would urge anyone wanting to try this to take all necessary precautions even though the version number says FINAL

Check GitHub https://github.com/steghio/TIBCO_BW6_Compress_Plugin/
for the source code, sample project, Eclipse (BW6) installer. If you want to manipulate it, READ THE GUIDE first.

History: first release 1.0.0.FINAL


[Oracle] Remove tablespace with missing DBF file

Well, nobody's perfect. But if a software is good we can afford not to be flawless.

Say instead of dropping a tablespace the proper way from your Oracle DB, you deleted its DBF file instead; how can you make Oracle forget about this and let you create a new one with the same name and location?

Luckily, you can still salvage the situation by issuing some commands while connected as sys:

SELECT * FROM sys.dba_data_files;

Now find your tablespace and copy the value from the FILE_NAME column, then delete the file association:


Finally, drop the tablespace itself:


And you're back in business


[TIBCO] BusinessWorks 6 Compress Plugin for ZIP

UPDATE: check latest version 1.2.0.FINAL here

Happy to announce the availability of the 1.0.0.FINAL version of the TIBCO BW6 Compress palette. It includes Zip and Unzip activities. This is developed in my free time and it's not endorsed, verified or supported by TIBCO in any way (yet?).

It uses Apache Common Compress library 1.8.1 with no modifications and it's packaged within the plugin.

[PostgreSQL] Post install error "Password authentication failed for user" when connecting to DB

So you decided that MySQL isn't to your liking and since the other alternatives aren't free enough, you tried out PostgreSQL. Freshly after your installation, you happily try to connect to your DB either via command line (\q guys.. \q seriously?) or pgAdmin, but are baffled when this message appears on screen:

FATAL:  Password authentication failed for user "Administrator"

because you did not remember creating a user during installation, and the only password you were asked to define isn't working.

The solution? Try to connect as postgres user:

psql -U postgres

If it's still not working, check under postgresql.conf if the listen_addresses parameter is specifying a correct and reachable address.

[SQL] Oracle subquery in join statement

In Oracle, it's possible to use sub queries in a join statement by giving an alias to the subquery and joining on that alias:

SELECT a.column1, a.column2, c.column3
SELECT b.column1, b.column2, b.column3
) c
ON (a.column1 = c.column1 AND a.column2 = c.column2)

Obviously you would never write a SIMPLE query EXACTLY as the example above, it's just to show the mechanics when you actually need to create a slightly more complex one


[OSGi] Spring error Unable to locate Spring NamespaceHandler for XML schema namespace

You're working with OSGi because it's flexible, you like components, and so on, and you also like Spring because you love writing XMLs instead of Java code.

You think it would be a good idea if you could join these technologies but reading is so boring, plus since both use some config files you just need to mash them together and you should be good with your Sprosgienstein creation. But then you realize that some small differences for example in classpath handling and dependency management are making your life difficult.

A common error you might get is: "Unable to locate Spring NamespaceHandler for XML schema namespace XXX"


[Windows Server 2012] Add role fails

When trying to add a role (eg ActiveDirectory) to a Windows Server 2012 machine, I found that it would try to enable the components, but it would always fail in the end saying that the machine needed a reboot. It doesn't matter how many reboots you do, it will still fail.

The reason was that these services had to be enabled before trying to add the new role:

  • Server
  • Workstation
  • Computer Browser
  • TCP/IP NetBIOS Helper

[Linux] Check remote port connection

It may happen that you're working on a server with a user that has very limited capabilities. Sometimes you have no access to telnet:

telnet host port


nmap -A host -p port

curl - it will complain that it did not receive data, meaning that it connected successfully:

curl http://host:port


nc host port

 or whatever other tool you like to use. So what to do? Well maybe, you have access to bash:

cat < /dev/tcp/host/port

but I find this method not very reliable. Instead you might have access to Python as well:

import socket


[Java] JMX connection and bean operation invocation

In this example we'll see how to create a JMX connection, with or without authentication, and invoke a bean method.

 import javax.management.remote.JMXServiceURL;  
 import javax.management.MBeanAttributeInfo;  
 import javax.management.MBeanInfo;  
 import javax.management.MBeanServerConnection;  
 import javax.management.ObjectName;  
 import javax.management.remote.JMXConnector;  
 import javax.management.remote.JMXConnectorFactory;  
 import java.util.Hashtable;  
 public class myJMXConnection{  
   private static String HOST = "HOST";  
   private static String PORT = "PORT"; //usually it's 1099  
   private static String BEAN_NAME = "BEAN_NAME"; //com.groglogs.myclass:type=MyObject  
   private static String BEAN_OP = "BEAN_OPERATION";  
   private static String USER = "USERNAME";  
   private static String PASS = "PASSWORD";  
      public static void main(String[] args) throws Exception{  
           JMXServiceURL target = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + HOST + ":" + PORT+"/jmxrmi");  
           //only if authentication is required  
           Hashtable<String, String[]> env = new Hashtable<String, String[]>();  
           String[] credentials = new String[] {USER,PASS};  
           env.put(JMXConnector.CREDENTIALS, credentials);   
     JMXConnector connector = JMXConnectorFactory.connect(target, env);  
     //if not required, use simply JMXConnector connector = JMXConnectorFactory.connect(target);  
     MBeanServerConnection remote = connector.getMBeanServerConnection();  
     ObjectName bean = new ObjectName(BEAN_NAME);  
     remote.invoke(bean, BEAN_OP, null, null);//invoke the remote method. Ensure first that the user calling this method has the necessary rights to invoke it!  
   }catch(Exception e){  

An important thing to note, is to always remember to check first if the user calling the method has the required permissions to invoke it

Copenhagen among vikings

Since with their prices they would rob you every time

Click on the image to see the full album

Cliffhanging in Bardonecchia

Now with 50% more surprise geocaching

Click on the image to see the full album

Check out the full track with MyTracks



Q: How much Poland could a handsome guy visit if a handsome guy only had one hour?

Click on the image to go to the full album

A: Not much, especially if said handsome guy follows the wrong road


[Guitar tab] Land of the Livin dead - Rayman Origins

This is possibly the best music theme from the game, tip of the hat to both Christophe Héral and Billy Martin.

The original tab was found on VideogameJam.

Download it from here


[CentOS 7] Chrome use system theme fix

After installing Google Chrome on CentOS 7 with the default theme enabled, you may notice that it will display the mouse pointer in the default Xorg theme instead of blending in with the system.

A workaround is to edit the /usr/share/icons/default/index.theme file by changing





[Linux] Boot in console mode

So you absolutely wanted that fancy video driver to work, but it didn't. Now it's impossible to boot into your system, even with the Ctrl+Alt+FX combination to get a tty to show up.

You can however boot directly into console mode. From the GRUB menu, before selecting a line to boot, press the "e" key.

Find the line you were going to boot (usually starts with "linux") and replace:

rgba quiet or rgbh quiet or the similar parameter you may have


text 3

or another number which will be the runlevel of your choice.

Then press F10 to boot from that configuration or save, select the modified line and press enter.

Once you're logged in your console you can always try to start the graphical environment with:


[CentOS] Detect Windows installation and update GRUB

After installing CentOS on your wannabe dual-boot machine, you realize with horror that for very important and critical reasons, your system does not have a dual boot menu and it's not able to recognize and read the Windows partition.

The solution is luckily very simple:

yum install epel-release
yum install ntfs-3g

This will allow the system to correctly manage NTFS filesystems.

grub2-mkconfig -o /boot/grub2/grub.cfg

This will update GRUB so that it shows the dual boot options now that it's able to recognize the Windows partition.

grub2-set-default X

This is optional and it's used to set the X kernel/OS as default when starting the system. You can find the number by reading the file /boot/grub2/grub.cfg


London quickie

Jolly good, sir!

Click on the image to go the full album


[Vim] Remove empty lines from file

Once you learn the magic :q! combination to close Vim discarding changes, you find out that it is a quite powerful tool.

To remove empty lines from a file you might try with some specific commands such as:


Where g tells vim to execute a command only on the lines that match a regular expression, ^$ is said regular expression to match empty (blank) lines, and d is the delete command.

Bonus: if when you open the file you see a lot of ^M characters, it means you're editing it in Unix format but the file was created in DOS format. You can either try by telling vim to treat it as a DOS format before running the previous instruction:

:set ff=dos

or by converting the file to Unix format beforehand with the dos2unix command:

dos2unix -n in out

[Yum] Prevent packages from being installed or updated

Even though it is recommended to always run the latest software version for bug fixes and security purposes, sometimes the package maintainers might have gotten too many donations and slip up on the next release.

And if that release is a kernel release, things might get ugly. Luckily, you can prevent yum from installing or updating packages by adding the --exclude parameter to your commands:

yum --exclude=PACKAGE update

this will update the system but not the packages named PACKAGE. Its scope is limited to the single command, so a second yum update will not exclude them.

Eg to exclude kernel packages:

yum --exclude=kernel* update

To make the exclusion permanent, edit /etc/yum.conf and add a line:


[Linux] Test RPM dependencies and installation without altering the system

So you already know how to do this with APT, but what if you're using an RPM-based distro?

Easily enough:

repoquery --requires --recursive --resolve PACKAGE_NAME

will check and list the package dependencies and:

rpm -ivh --test PACKAGE_NAME

will run a dry install which will show you what changes would take place without actually installing anything

[Fedora] VLC repository

In order to install VLC on Fedora, you'll need to add their repository to your sources.


yum install --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

yum install vlc

If you find that you cannot play some media types, try installing these gstreamer plugins as well

yum install gstreamer-plugins-good gstreamer-plugins-bad gstreamer-plugins-ugly

[Yum] Add and manage custom repositories

In the latest Fedora versions, it is possible to add custom repositories to yum by creating a .repo file under the /etc/yum.repos.d/ folder following this structure:


This will add and enable the repo available at REPOSITORY_URL signed by the GPG key found at URL_TO_KEY to your list.

Here's a couple of offical Fedora repos for Google Chrome and VirtualBox:

[Yum] Fix rpmdb open failed error

Although not as good as other package managers, yum has come a long way since I last tried it.

However, due to me installing software using the rpm command and other graphical package managers (it is bad, seriously), I managed to screw up something causing it to complain with a "rpmdb open failed" error.

The fix is easy enough though:

rm -rf /var/lib/rpm/__db*

rpm --rebuilddb

yum clean all

yum update

[Fedora] [Gnome] Use delete key to delete files

For some reason, on Fedora 21 - and possibly earlier versions too - you're required to Ctrl + Delete to send a file to the trash instead of the plain old single key Delete.

This behaviour can be reverted back to the good old ways by editing the accels file under /home/USER/.config/nautilus/

Find the line:

 ;(gtk_accel_path "<Actions>/DirViewActions/Trash" "<Primary>Delete")  

and edit it to:

 (gtk_accel_path "<Actions>/DirViewActions/Trash" "Delete")  

now if you log out and in again you're set.

[Eclipse] [ApacheDS] Crash soup_session_feature_detach on startup

Older Eclipse versions might incur in the 968064 bug - note that there exists multiple reports of that for other distros as well - which prevents the application from starting up.

Upgrading to a newer version should fix the issue but there's a simple workaround. Just add in the eclipse.ini file this parameter to the JVM options:


If using ApacheDS, the fix can be applied to the config/config.ini file by adding this line anywhere:


[Linux] Compress and split file or directory

On Linux, it is possible to compress anything and split the resulting archive with the split command

split -b SIZE - FILENAME_

Note that the trailing underscore _ isn't required but helps organizing the file names.

For example, to create an archive with tar and chunk it in 1KB pieces:

tar cz myFile | split -b 1KiB - out.tgz_

To decompress it, simply recreate the file with cat first:

cat FILENAME_* | tar xz


cat out.tgz_* | tar xz



Only for the bravest

Click on the image to view the full album