This blog is about Java (advanced Java topics like Reflection, Byte Code transformation, Code Generation), Maven, Web technologies, Raspberry Pi and IT in general.

Samstag, 11. Mai 2013

Tutorial: How to install a Tiny Tiny RSS (tt-rss) server on a Raspberry Pi (nginx, php, mysql)


Motivation

I love the Google Reader (RSS reader) very much and I used it heavily. But sadly Google decided to shutdown this great service. So it was time to look for an alternative and I found Tiny Tiny RSS (tt-rss). It's an open source RSS reader written in PHP. It's quite nice but there is one big issue: the website (JavaScript) is slow. It's impossible to use it on a smartphone. But there are Android apps for tt-rss which are quite nice.

Install & configure nginx, php & mysql-server

  • get all the packages
sudo apt-get update
sudo apt-get install nginx php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-cgi mysql-server
  •  create the web directory
sudo mkdir /var/www
sudo chown www-data:www-data /var/www/
  •  configure nginx
    • open the config file
sudo nano /etc/nginx/sites-enabled/default 
    • modify it so it looks like this
server {
  listen   80;
  root /var/www;
  index index.html index.htm index.php;

  server_name localhost;

  location / {
    try_files $uri $uri/ /index.html;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}
  •  configure php-fpm
    • open the php.ini
sudo nano /etc/php5/fpm/php.ini
      • set: cgi.fix_pathinfo = 0;
    • open the www.conf
sudo nano /etc/php5/fpm/pool.d/www.conf
      •  set: listen = /var/run/php5-fpm.sock
  • restart nginx and php-fpm
sudo service php5-fpm restart
sudo service nginx restart
  • create the mysql database for tt-rss
mysql -u root -p
    • insert the password and execute those two commands
create database ttrss;
exit

 

Install Tiny Tiny RSS (tt-rss)

It's quite simple. Just grab the .tar.gz file, unpack it move it to the web directory and set the permissions. It's done like this. But you probably want to check if there is a newer version.

wget https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.7.8.tar.gz
tar zxfv 1.7.8.tar.gz
mv Tiny-Tiny-RSS-1.7.8/ ttrss
sudo mv ttrss /var/www
cd /var/www/ttrss
chmod -R 777 cache/images && chmod -R 777 cache/export && chmod -R 777 cache/js && chmod -R 777 feed-icons && chmod -R 777 lock


Perform the tt-rss installation

http://localhost/ttrss/install

Setup the crontab

  • Open the crontab
crontab -e
    • Insert following line
*/15 * * * * cd /var/www/ttrss && /usr/bin/php update.php --feeds --quiet > /dev/null

With this setup the Raspberry Pi will load every 15 minutes the RSS feeds and update them so you can read them.

Enjoy your Tiny Tiny RSS (tt-rss) installation

That's it. Now you can open your installation, configure it and read your feeds. Have fun! :)

Samstag, 22. September 2012

Truecrypt benchmark for Raspberry Pi with Turbo

Introducing turbo mode: up to 50% more performance for free. This benchmark was run on raspbian/wheezy with the overclock setting "Turbo". The buffer size was was 5MB. With turbo truecrypt is about 60% faster than without.


Algorithm Encrypt Decrypt Mean
Twofish 14 12 13
Serpent 10 10 10
AES 7 5.3 6.1
Twofish-Serpent 5.9 5.5 5.7
Serpant-AES 4.1 4.0 4.1
AES-Twofish 4.6 4.2 4.4
Serpant-Twofish-AES 3.2 3.0 3.1
AES-Twofish-Serpent 3.2 3.0 3.1

Mittwoch, 12. September 2012

Java SimpleArchive with RandomAccessFile

 I had a quite simple problem. I want to read several hundred thumbnail images (movie posters) to display them in a Java program.

File system
The simplest approach is to save the images directly in the file system. It's working fine if all images are cached from the OS. But if not it takes several seconds to load all images. Another downside is that most of the files have a size of 6kb - 7kb (in a range of 3kb - 10kb). So you loose some space because the block size is usually 4kb. In my case it was about 25%.

Zip
The next idea was to save all images in a Zip archive. The standard Java library supports Zip archives directly. It looked very promising. It was quite easy to use and it worked fine. But there is one big problem. It's not possible to add files to an existing archive. You had always to recreate the complete file. It's no problem if the archive is small but if it gets bigger than this could consume quite a long time. I looked for other libraries and archive formats. But it seemed that there is no easy to use archive library which supported to add files to an existing archive. So I wrote my own very simple archive library with the RandomAccessFile API.

SimpleArchive (github)
It's very simple and very fast. It can add files to an existing archive without the need to recreate the file. It just adds the file(s) and rewrite the file index which is located at the end of the file. So it will be much faster by adding files to an archive than the Zip implementation. In a very basic test it read the files ~3 times faster than the the Zip implementation. If you want to know more about it just visit the github.

Freitag, 20. Juli 2012

Truecrypt benchmark for Raspberry Pi

This benchmark was run on raspbian/wheezy. So it's used the armhf architecture. The buffer size was was 5MB. Checkout the truecrypt benchmark with the new turbo overclock setting.


Algorithm Encrypt Decrypt Mean
Twofish 8.9 7.7 8.3
Serpent 6.8 6.9 6.9
AES 4.4 3.7 4.1
Twofish-Serpent 3.9 3.7 3.8
Serpant-AES 2.7 2.4 2.5
AES-Twofish 1.9 2.4 2.1
Serpant-Twofish-AES 2.1 1.8 2.0
AES-Twofish-Serpent 2.0 1.8 1.9

Truecrypt armhf executable for Raspberry Pi (raspbian/wheezy)

Because Truecrypt it's a bit of a work and takes so long to compile I uploaded the compiled binary file

Compile Truecrypt on Raspberry Pi

I wanted to run Truecrypt on my Raspberry Pi. But there is no precompiled package which you could simply install with apt-get. So you have to compile it yourself - which take a few hours. If you just want the truecrypt binary for Raspbian/Wheezy then you can download them here.
The first thing you need to do is to get all needed dependencies. Thereby you have to compile one dependency yourself. We start with this dependency.


How to compile wxWidgets
First download the source code: http://www.wxwidgets.org/downloads/#latest_stable I used wxAll 2.8.11. Unpack it, go into the directory and execute these commands.
sudo apt-get install libgtk2.0-dev
./configure
make

How to setup PKCS11
Truecrypt needs three header files (pkcs11.h, pkcs11f.h, pkcs11t.h) which you can download from this location: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-11/v211/
Put them into a directory and then set the PKCS11_INC variable.
export PKCS11_INC=/home/pi/pkcs11

How to compile Truecrypt
First download the source code: http://www.truecrypt.org/downloads2 I used 7.1a. Unpack it, go into the unpacked directory and execute these commands.
sudo apt-get install libfuse-dev nasm libwxgtk2.8-dev
make WX_ROOT=/home/pi/wxWidgets/ wxbuild
make WXSTATIC=1

 There will be this warning
configure: WARNING: libSM not found; disabling session management detection
sadly I couldn't figure out how to fix it. But Truecrypt will work anyway.


If you get this error message
In file included from Keyfile.cpp:10:0:
.../SecurityToken.h:43:21: fatal error: pkcs11.h: No such file or directory
then the  PKCS11_INC variable isn't set correctly or you forgot to put the header files in the directory.


Now you can use Truecrypt. The executable file will be created in Main/truecrypt. To mount a truecrypt volume just use
./truecrypt /path/to/truecrypt-volume /path/to/mount-point
or you can just execute ./truecrypt and use the graphical surface.

Samstag, 3. September 2011

Grails with ATS Transformation tutorial with a demo example

I wanted to play with  Groovy's AST Transformation in Grails. I thought naively that it would be enough to put the AST Transformation code into the source folder, like in a pure groovy project. I run the grails-app and it didn't worked. So I searched for help in the world-wide-web. Some guys said that the AST code need to be precompiled and there is no way to do it with one compile run. Sadly I couldn't find an example or a tutorial how to do the precompiling. After some frustrating hours of searching and trying I got a working solution. Now I am going to share my knowledge and hope that I can help you with this post.

At first I give you an explanation what an AST Transformation is.
When the Groovy compiler compiles Groovy scripts and classes, at some point in the process, the source code will end up being represented in memory in the form of a Concrete Syntax Tree, then transformed into an Abstract Syntax Tree. The purpose of AST Transformations is to let developers hook into the compilation process to be able to modify the AST before it is turned into bytecode that will be run by the JVM.
In simple words it means that you can modify programmable your code at compile time.Groovy's documentation provides a simple example what you can do with AST. In this example a new Annotation @WithLogging is created. If you add this Annotation to a method then the AST Transformation adds at the beginning and at the end of the method a print line statement with "Starting" and "Ending" and the method name. Now I will show you how to get this example running in grails.

The first thing i had done was creating a new source-folder (src/ast) and put all files in it which needs to be precompiled => all AST related files. In this case WithLogging.groovy and WithLoggingASTTransformation.groovy

WithLogging.groovy
1:  @Retention(RetentionPolicy.SOURCE)  
2:  @Target([ElementType.METHOD])  
3:  @GroovyASTTransformationClass("astexample.WithLoggingASTTransformation")  
4:  public @interface WithLogging {  
5:  }
Here we define the Annotation and bind it to the WithLoggingASTTransformation class. It's important to use the full path to the class.

WithLoggingASTTransformation.groovy
1:  @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)  
2:  class WithLoggingASTTransformation implements ASTTransformation {  
3:    private static HashSet<MethodNode> set = new HashSet<MethodNode>()  
4:    public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {  
5:      sourceUnit.getAST()?.getClasses().each { ClassNode classNode ->  
6:        classNode.getAllDeclaredMethods().findAll { MethodNode method ->  
7:          method.getAnnotations(new ClassNode(WithLogging))  
8:        }.each { MethodNode method ->  
9:          if(!set.contains(method)) {  
10:            Statement startMessage = createPrintlnAst("Starting $method.name")  
11:            Statement endMessage = createPrintlnAst("Ending $method.name")  
12:            List existingStatements = method.getCode().getStatements()  
13:            existingStatements.add(0, startMessage)  
14:            existingStatements.add(endMessage)  
15:            set.add(method)  
16:          }  
17:        }  
18:      }  
19:    }  
20:    private Statement createPrintlnAst(String message) {  
21:      return new ExpressionStatement(  
22:      new MethodCallExpression(  
23:      new VariableExpression("this"),  
24:      new ConstantExpression("println"),  
25:      new ArgumentListExpression(  
26:      new ConstantExpression(message)  
27:      )  
28:      )  
29:      )  
30:    }  
31:  }  
This class preforms the AST Transformation. The compiler automatically calls the visit-method.  This method iterates over all methods of all classes and check if the method has the @WithLogging Annotation. If the method has this Annotation then it adds the println-statements to the method.

The next step is to tell the grails app that it needs to precompile those files. To do that you have to create a new file in /scripts called "_Events.groovy". This file is a grant script and with it you can hook into the grails events. We need now a hook into the compiling of the app and it's done like this.
1:  eventCompileStart = {target ->  
2:    compileAST(basedir, classesDirPath)  
3:  }  
4:  def compileAST(def srcBaseDir, def destDir) {  
5:    ant.sequential {  
6:      echo "Precompiling AST Transformations ..."  
7:      echo "src ${srcBaseDir} ${destDir}"  
8:      path id: "grails.compile.classpath", compileClasspath  
9:      def classpathId = "grails.compile.classpath"  
10:      mkdir dir: destDir  
11:      groovyc(destdir: destDir,  
12:          srcDir: "$srcBaseDir/src/ast",  
13:          classpathref: classpathId,  
14:          verbose: grailsSettings.verboseCompile,  
15:          stacktrace: "yes",  
16:          encoding: "UTF-8")  
17:      echo "done precompiling AST Transformations"  
18:    }  
19:  }  

At last we create a simple grails-controller to test the AST Transformation.
1:  class AstController {  
2:    def index = {   
3:      loggedMethod()  
4:      render 'i am just a dummy method to call the method..'  
5:    }  
6:    @WithLogging  
7:    def loggedMethod() {  
8:      println "i am doing some important stuff!"  
9:    }  
10:  }  
When you run the app and call the index-handler than you will get this output:
1:  Starting loggedMethod  
2:  i am doing some important stuff!  
3:  Ending loggedMethod  

That's it. The most important thing for the AST transformation in Grails is the /scripts/_Events.groovy file. The rest is just normal AST transformation code or Grail's code.

You can download the whole tutorial code as a STS project with includes a running AST Grails app here.

I hope you enjoyed the tutorial and you are welcome to leave some feedback.