woensdag 7 december 2016

custom triggers met jQuery

$( document ).on( "myCustomEvent", {
    foo: "bar"
}, function( event, arg1, arg2 ) {
    console.log( event.data.foo ); // "bar"
    console.log( arg1 );           // "bim"
    console.log( arg2 );           // "baz"
});
$( document ).trigger( "myCustomEvent", [ "bim", "baz" ] );

vrijdag 25 november 2016

Zooming

Zoomen is niet zo moeilijk.
Zie m'n jsfiddle.

HTML:
<p>
Dit is een tekst
</p>

Javascript:
var value = 200;
var body = document.body;

body.style.MozTransformOrigin = "top left";
body.style.MozTransform = "scale(" + (value/100)  + ")";

body.style.WebkitTransformOrigin = "top left";
body.style.WebkitTransform = "scale(" + (value/100)  + ")";

body.style.OTransformOrigin = "top left";
body.style.OTransform = "scale(" + (value/100)  + ")";

body.style.TransformOrigin = "top left";
body.style.Transform = "scale(" + (value/100)  + ")";
// IE
body.style.zoom = value/100;

Klachten over ECMA2015 en Typescript classes

Tot nu toe gebruiken veel Javascript programmeurs een direct executerende function om code te groeperen. Zoiets als:

(function(){
    namespace.class = function() {
   }
})();

Met EMCA2015 en Typescript kun je classes gaan maken. Helaas is het niet bruikbaar genoeg, want:

1) ECMA2015 en Typescript classes kennen geen member variabelen die te bereiken zijn zonder "this". Bij iedere variabele die je gebruikt heb je dus de voorloper "this.". Dat vervuilt je blik op de code.
2) Als je een method van buiten laten aanroepen, dan is je "this" niet correct meer en moet je dus weer bind(this) van stal halen. Dat maakt de code ook niet simpeler.

dinsdag 15 november 2016

Typescript en Javascript zoals Groovy en Java?

Velen kennen Groovy of Scala als taal die compileert naar de Java VM. In de Javascript wereld hebben we Typescript, een taal die transpileert naar Javascript.

De hoofdreden om Typescript te gebruiken is type checking. Tijdens het ontwikkelen weet je IDE welke methods en properties een object heeft. Met javascript weet je dat niet.

Is Typescript hetzelfde lot beschoren als Groovy? Namelijk dat steeds meer functionaliteit in Javascript erbij komt waardoor Typescript niet meer te rechtvaardigen is?

Ik denk het wel. Daarbij baseer ik m'n mening op de nieuwe Ecmascript 6 functionaliteit. Wat een enorme hoeveelheid functionaliteit komt erbij. Classes, default parameters, etc...
Nog even en dan is Ecmascript (javascript) dusdanig volwassen dat Typescript niet meer nodig is. De programma's die dan Typescript gebruiken zijn dan legacy en kunnen weer omgeschreven worden.

Daarom is het ook een idee om Babel te gebruiken. Dan programmeer je Ecmascript 2015(ofwel 6), maar transformeer je het naar Ecmascript 5. Op die manier blijf je compatible met Ecmascript en voorkom je dat je in de toekomst moet omschrijven.

De beste optie is de Closure Compiler, naar mijn mening. Deze biedt ES6 functionaliteit maar niet de lelijke randgevallen die niet mooi naar ES5 zijn om te zetten.

Ecmascript 2015(oftewel versie 6) wordt niet ondersteund door Internet Explorer, wel door Edge. Google Chrome vanaf versie 49, Firefox vanaf versie 45.

zaterdag 5 november 2016

Javascript class structure

Hoe kom je in Javascript tot een Class structure?
Zo kan het bijvoorbeeld:

var Klasse = (function() {
  function Klasse() {
    alert("Constructor Klasse");   
  }
  Klasse.prototype = {
    set waarde(nieuweWaarde) {
      this._nieuweWaarde = nieuweWaarde;
      alert(nieuweWaarde);
    },
    propMethod: function() {
      alert("propMethod");
    }
  }
  return Klasse;
})();

var SubKlasse= (function() {
  function SubKlasse() {
   function init() {
     alert("init");
    }
    function klassemethod() {
     alert("klassemethod");
    }
    this.klassemethod = klassemethod;
    init();
  }
  SubKlasse.prototype = Klasse.prototype;
  return SubKlasse;
})();

var tmp = new Klasse();
var subtmp = new SubKlasse();
subtmp.propMethod();
//tmp.propMethod();
tmp.waarde = "hallo2";
alert(tmp._nieuweWaarde);
subtmp.klassemethod();

Door middel van de prototype kun je interfacing doen, zelfs inheritance.

zaterdag 8 oktober 2016

Javascript Lexical Scoping

Javascript heeft lexical scoping. Lees hier meer erover.
Lua heeft trouwens ook lexical scoping. Squirrel language trouwens ook.

dinsdag 4 oktober 2016

Which MINGW64 predefines, like _WIN32 or _WIN64, are there?

Make a textfile on your disk called test.c
content:

void main() { }

do:
gcc -E -dM test.c

Now, you get a list of all predefines that Mingw64 uses when compiling.

...
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __UINT_LEAST8_TYPE__ unsigned char
#define __SIZEOF_FLOAT80__ 16
#define _WIN32 1
#define __INTMAX_C(c) c ## LL
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 0xff
#define _WIN64 1
#define __WINT_MAX__ 0xffff
#define __ORDER_LITTLE_ENDIAN__ 1234
...
...
...

donderdag 29 september 2016

Compiling lua sqlite lsqlite on mingw64

Below is my compile.bat. The trick is to compile to DLL's and dynamicly link them.
cd lua-5.3.3
mingw32-make mingw
copy src\lua53.dll ..\lua53.dll
copy src\lua.exe ..\lua.exe
cd ..
cd sqlite-amalgamation-3140200
gcc sqlite3.c -shared -m64 -lpthread -o sqlite3.dll
gcc shell.c sqlite3.dll -lpthread -o sqlite3.exe
copy sqlite3.dll ..\sqlite3.dll
cd ..
cd lsqlite3_fsl09w
gcc -c lsqlite3.c -shared -m64 -lpthread -I c:\other\lua_sqlite\lua-5.3.3\src -I c:\other\lua_sqlite\sqlite-amalgamation-3140200
gcc lsqlite3.o c:\other\lua_sqlite\lua53.dll c:\other\lua_sqlite\sqlite3.dll -shared -m64 -lpthread -o lsqlite3.dll
copy lsqlite3.dll ..\lsqlite3.dll
copy examples\simple.lua ..\simple.lua
cd ..
After running this batch, you can type:
lua.exe simple.lua

and the output is:
1       Hello World
2       Hello Lua
3       Hello Sqlite3

dinsdag 23 augustus 2016

Koppelen met vulkan-1.dll vanuit C

De tiny c compiler bevat een tool genaamd tiny_impdef.exe
Hiermee kun je een def file maken van je DLL (haal de vulkan-1.dll uit de SDK, want dat is de debug variant).
tiny_impdef.exe vulkan-1.dll

of gebruik
dumpbin /exports vulkan-1.dll

Kopieer alle functie namen (alleen de namen) en stop ze in een nieuwe textfile. Noem 'm vulkan-1.def en plaats de regel "EXPORTS" aan de top.

EXPORTS
jcopy_block_row
jcopy_sample_rows
jdiv_round_up
jinit_1pass_quantizer
jinit_2pass_quantizer
jinit_c_coef_controller
...

Vervolgens kun je met de mingw dlltool een mingw library maken.
dlltool -d vulkan-1.def -l libvulkan-1.a

of als je visual c++ gebruikt:
lib /def:vulkan-1.def /OUT:vulkan-1.lib /MACHINE:X64

zondag 21 augustus 2016

C++ is een rotzooi geworden


Type casting:
dynamic_cast<Object>(-1);
static_cast<Object>(-1);
reinterpret_cast<Object>(-1);
const_cast<Object>(-1);

Smart Pointers:
std::unique_ptr<>
std::shared_ptr<>
std::weak_ptr<>
auto s

Return value optimization

Waarom worden parameters in C++ standaard pass-by-value doorgegeven, ook als je een class object doorgeeft? Dat komt omdat C alles pass-by-value doorgeeft.

Het wordt mij steeds duidelijker dat C++ een onduidelijke en onbegrijpelijke programmeertaal is. Dit in tegenstelling tot C, dat helder en begrijpelijk is.
Als je bedenkt dat C de oorspronkelijke creatie was en C++ een uitbreiding die compatibel moest zijn met C, dan begrijp je waarom dit zo is.

vrijdag 19 augustus 2016

C compiler mingw64 en IDE code::blocks

Mingw64 bevat gcc, een C compiler uit de GNU/unix hoek die geschikt is gemaakt voor Windows.
Download de 6.1.0 versie hier. Daarna even je mingw\bin directory aan de path toevoegen. (computer/properties/advanced system settings/environment variables)

Code::blocks is een IDE waarmee je C code kunt invoeren en debuggen. Download hier. (ik gebruik de no-setup variant). Vervolgens moet je onder settings/compiler en settings/debugger vertellen waar resp. de mingw directory en de GDB.exe staat.

maandag 15 augustus 2016

Steam game op andere SSD

Je kunt makkelijk een spel op een andere SSD plaatsen, zonder je steam gamedirectory te verplaatsen.
> Stel, je hebt DOOM staan op "c:\prg\Steam\steamapps\common\Doom"
> Kopieer deze naar "g:\steamgames\Doom"
> Verwijder de Doom folder op c:
> mklink /J "c:\prg\Steam\steamapps\common\Doom" "g:\steamgames\Doom"

Nu wordt er in "c:\prg\Steam\steamapps\common\Doom" een link gemaakt naar "g:\steamgames\Doom"
Het spel blijft gewoon normaal werken. Alleen kun je een melding van je firewall krijgen, omdat die door heeft dat de locatie gewijzigd is.

dinsdag 5 juli 2016

SOLR using schema.xml

When you do not want to use the dynamicfields and the managed-schema in SOLR:

> in the conf/solrconfig.xml of your core directory, add to the <config> node:

<config>...
    <schemaFactory class="ClassicIndexSchemaFactory"/>

> in the conf/solrconfig.xml of your core directory, remove the
<processor class="solr.AddSchemaFieldsUpdateProcessorFactory"> from the
<updateRequestProcessorChain
The processor that must be removed from the chain looks like:
    <processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
      <str name="defaultFieldType">strings</str>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Boolean</str>
        <str name="fieldType">booleans</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.util.Date</str>
        <str name="fieldType">tdates</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Long</str>
        <str name="valueClass">java.lang.Integer</str>
        <str name="fieldType">tlongs</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Number</str>
        <str name="fieldType">tdoubles</str>
      </lst>
    </processor>

> in the conf directory of your core, add the file schema.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<schema name="example-schema-xml" version="1.6">
    <fieldType name="long" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" /> 
 
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
 <!-- onderstaande twee velden schijnen nodig te zijn voor resp. transactie en block-join support -->
    <field name="_version_" type="long" indexed="true" stored="false"/>
    <field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
 
    <field name="complete_l" type="long" indexed="false" stored="true"/>
    <field name="tekst_txt" type="string" indexed="true" stored="false"/>
 
    <uniqueKey>id</uniqueKey>
</schema>

> remove the managed-schema in the conf directory.

zaterdag 18 juni 2016

Vertical alignment floats

<div style="height: 200px; background-color: red">

  <div style="display: inline-block; vertical-align: middle; background-color: white">
      <p>Dit is een tekst</p>
  </div>
 
  <div style="display: inline-block; vertical-align: middle; background-color: white">
    <div style="float: left">
      <img src="http://placehold.it/30x30" />
    </div>
  </div>
 
  <div style="display: inline-block; vertical-align: middle; height: 200px; background-color: white">
  &nbsp;
  </div>
 
  <div style="display: inline-block; vertical-align: middle; background-color: white">
    <div style="float: right">
     Dit is een nog tekst
    </div>
  </div>
 

 
</div>

donderdag 16 juni 2016

SOLR highlighting PDF werkt niet

Stel je doet het volgende op de server:

bin\solr.cmd start
bin\solr.cmd create -c gettingstarted
java -Dc=gettingstarted -Dauto -jar example\exampledocs\post.jar example\exampledocs\*.pdf

Vervolgens ga je kijken in de webbrowser of je een woord uit de pdf kunt vinden:
http://localhost:8983/solr/gettingstarted/select?q=test&hl=true&hl.fl=content

Inderdaad wordt het woord gevonden. Echter de highlighting werkt niet.

Nu kun je je afvragen of dat erg is, want PDF is een output formaat, geen input formaat.
De informatie welke woorden bij elkaar horen gaat verloren bij het genereren van een PDF. Bij een formaat als DOCX lukt dat wel.

Als ik bijvoorbeeld een tekst heb in een PDF met 3 kolommen, plaatjes en losse teksten, dan kan je PDF parser er geen wijs meer uit worden.

Daarom kun je beter SOLR vullen vanuit bestanden die een input formaat zijn. Heb je niets anders dan PDF, dan kun je het beste PDFBox gebruiken om in een client de parsing te doen en vanuit daar de SOLR te vullen.

vrijdag 3 juni 2016

SOLR


Documentatie: https://cwiki.apache.org/confluence/display/solr/Running+Solr

Installatie van example op windows:

java -Dc=gettingstarted -jar example\exampledocs\post.jar example\exampledocs\*.xml

Document verwijderen:
http://localhost:8983/solr/update?stream.body=
<delete><query>id:298253</query>
<query>entitytype:BlogEntry</query></delete>&commit=true

Alles verwijderen: <delete><query>*:*</query></delete>


http://localhost:8983/solr/pdf/select?q=jezus&hl=true
java -Dc=pdf -Dauto -jar example\exampledocs\post.jar pdf\*.pdf

http://localhost:8983/solr/pdf/select?q=jezus&hl=true&hl.fl=content


maandag 30 mei 2016

Tinkerpop Gremlin bewijst zich niet...

Stel, ik wil weten welke acteurs meer dan 1 keer met een andere acteur in een film gespeeld hebben.

Dit is dan de SQL query, die ik in 1 minuut gemaakt heb:

select actor_id, aantal
from
(
select actor_id, count(1) as aantal from
movie_actor
where movie_id in (select movie_id from movie_actor where actor_id = (select actor_id from actor where actor_id = 1534))
and actor_id != 1534
group by actor_id
)
where aantal > 1
order by aantal desc

En dan nu de Gremlin query:

g.V().has("actor_id", 1534).as("d").match(
                __.as("a").out("speelt in").as("b"),
                __.as("b").in("speelt in").as("c"),
                __.as("c").where(P.neq("d"))
                ).select("c").groupCount().by("actor_id")
.order(Scope.local).by(org.apache.tinkerpop.gremlin.structure.Column.values, Order.decr).next().forEach((x,aantal) -> {
if (aantal > 1) {
System.out.println(x);
System.out.println(aantal);
}
});

Het valt mij op dat de complexiteit van de Gremlin query behoorlijk is, terwijl Gremlin toch zou moeten stralen in dit soort gevallen. De Gremlin query bevat jammergenoeg rare elementen, zoals __ en Scope.local, Column.values. Verder moet er een vervelende loop gemaakt worden op het laatst.

Ik durf te beweren dat de SQL query 10 keer sneller is, minimaal.

De API van gremlin wijzigt trouwens sterk. Een groot aantal functie's in de 2.x versie reeks is niet meer te gebruiken bij 3.x

Open sores: Tinkerpop Gremlin is vooral ontwikkeld door Marko A. Rodriguez. Die heeft ook een zware hand gehad in Titan, de Graph database van de Hortonworks Hadoop stack. Echter, het hele team van Titan, namelijk Aurelius, is overgenomen door Datastax. Nieuwe versie's zijn er sinds die tijd niet meer geweest.
Geef Marko en z'n team Aurelius eens ongelijk!

zaterdag 14 mei 2016

Java vs dotnet

Java heeft een nettere foreach, namelijk:

for (Object obj : list) {
}

Instinkers:
In Java kun je nooit roepen if (var == "string") { ... }
Want je moet altijd equals gebruiken. De == kijkt namelijk naar String geheugen locatie, en die is vrijwel nooit hetzelfde. Dus altijd if (var.equals("string")) { ... }  gebruiken.

In Java heb je geen partial classes.

vrijdag 13 mei 2016

SparkJava 2.5 problems

SparkJava 2.5 contains bugs.

1) It doesn't run out of the box. It misses a dependency:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.13</version>
</dependency>

2) The after filter is NOT triggered.
So, I went back to version 2.3

3) The StaticFileLocation does not set the content-type header, so Internet Explorer 11 does not use the CSS file. I took me a while to figure that out.

Add this:
after("/css/*.css", (request, response) -> {
response.type("text/css");
});


Addition 1 june 2016:

Quick fix for problem 2 and 3:

Download the spark-master at GitHub. Unpack the zip.

2)
In the file StaticFilesConfiguration.java change the consume method into:

    public boolean consume(HttpServletRequest httpRequest,
                           HttpServletResponse httpResponse) throws IOException {
    String url = httpRequest.getRequestURL().toString();
    if (url.endsWith(".css")) {
    httpResponse.setContentType("text/css");
    }
   
   
        if (consumeWithFileResourceHandlers(httpRequest, httpResponse)) {
            return true;
        }

        if (consumeWithJarResourceHandler(httpRequest, httpResponse)) {
            return true;
        }

        return false;
    }

3) 
in the POM.xml
change:
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.13</version>
            <scope>test</scope>
        </dependency>

into:
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.13</version>
        </dependency>


Do -> mvn clean install
And you got your 2.6-SNAPSHOT
Reference it with:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.6-SNAPSHOT</version>
</dependency>

zaterdag 30 april 2016

Maven Tomcat Webapp aanmaken

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.olsthoorn.moviemanager -DartifactId=movie-manager-tomcat -DinteractiveMode=false

Vervolgens in tomcat/conf/server.xml het poort nummer veranderen:
<Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

Met services.msc kun je de service aanzetten.

in tomcat/conf/tomcat-users.xml moet je nog een admin gebruiker aanmaken.

<tomcat-users>
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>
</tomcat-users>

Alle .war bestanden die je in je webapps folder van tomcat gooit wordt uitgerold.

Het fijnste is natuurlijk om met maven automatisch een deploy te doen, met mvn install tomcat:deploy, maar helaas krijg ik dat niet aan de gang.

Alles heb ik nu ook onder Linux werkend. Dan zie je de kracht van Java: op linux werkt het ook gewoon.

Normaal gesproken gebruik je Maven als volgt:
mvn -DskipTests clean install

Welk process luistert naar welke poort?

netstat -a -b

vrijdag 8 april 2016

Connectie maken met Microsoft .NET asmx webservice vanuit Java

Genereer classes met wsimport:
wsimport -B-XautoNameResolution -extension -keep -p packagename http://localhost:2611/Test.asmx?WSDL

Daarna worden er classes gegenereerd. In de code wordt een package gebruikt. Vergeet niet om bij een import .* erachter te zetten.

dinsdag 5 april 2016

OpenNLP

https://aiaioo.wordpress.com/2016/01/13/naive-bayes-classifier-in-opennlp/
http://technobium.com/getting-started-with-apache-opennlp/

zaterdag 2 april 2016

Sparkjava test


SparkJava test:

mvn archetype:generate -DgroupId=com.olsthoorn.spark -DartifactId=sparktest -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.technobium -DartifactId=opennlp-ner -DinteractiveMode=false

Laat de POM.XML er zo uit zien:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.olsthoorn.spark</groupId>
  <artifactId>sparktest</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>sparktest</name>
  <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals><goal>copy-dependencies</goal></goals>
                </execution>
            </executions>
        </plugin>
        </plugins>
    </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.3</version>
</dependency>
        <dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-template-thymeleaf</artifactId>
    <version>2.3</version>
        </dependency>
  </dependencies>
</project>



import spark.Spark;
public class App
{
    public static void main( String[] args )
    {
     Spark.get("/test", (req, res) -> {
     String ret = req.queryParams("var1") + " " + req.queryParams("var2");
     return "Test " + ret;
     });
    }
}

java -cp "target/dependency/*":target/classes com.olsthoorn.spark.App
mvn exec:java -Dexec.mainClass="spark.Spark.App"


Eclipse:
mvn eclipse:eclipse

import existing project.

Run as... Java application.
-> ga met webbrowser naar http://localhost:4567/test?var1=meuk&var2=lalal


Een jar toevoegen in maven:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -Dfile=ojdbc6.jar

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
</dependency>



donderdag 25 februari 2016

Hadoop op Linux Mint

Op distrowatch lijkt Linux Mint de meest populaire Linux distribution. Ik heb dus Linux Mint Cinnamon 64-bit geinstalleerd om Hadoop mee te testen. Hieronder volgt mijn verslag met aanpassingen.


Bij het maken van een VirtualBox image:
> 3d acceleration aanvinken in video settings.
> shared folder, use automount. Na het starten van mint:  sudo adduser xxxxxxx vboxsf      -> reboot. And you can access your folder.
> Guest additions CD gebruiken, anders wordt de shared folder niet gevonden.


Installeren van Java 8:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

met  dpkg -L oracle-java8-installer  kun je bepalen waar de installer geinstalleerd is, maar dat interesseert je niet. Je wilt namelijk de JAVA_HOME instellen. De JAVA_HOME moet /usr/lib/jvm/java-8-oracle worden.


.bashrc aanmaken voor de paden:
export PATH=$PATH:/home/rene/gradle-2.11/bin:/home/rene/hadoop-2.7.2/bin
export HADOOP_HOME=/home/rene/hadoop-2.7.2
export JAVA_HOME=/usr/lib/jvm/java-8-oracle


Installeren van Eclipse:
tar -zxvf eclipse.tar.gz

Desktop icon voor Eclipse:
ln -s /home/rene/eclipse/eclipse /home/rene/Desktop


Installeren van Maven:
In de .bashrc
export MAVEN_OPTS="-Xms1024m -Xmx3076m"
export M2_HOME=/opt/apache-maven-3.3.9
PATH=$M2_HOME/bin:$PATH
Je moet ant geinstalleerd hebben.
Daarna su
ant


Installeren van Spark:
sudo apt-get install git
Download Spark.
tar -zxvf spark1.6.1.tgz
cd naar de directory
./sbt/sbt assembly

./bin/pyspark
sudo mv spark-1.6.1 /opt/
vi ~/.bashrc
export PATH="/opt/spark-1.6.1/bin/:$PATH"


Nog wat ongerelateerde tips:
./configure
make
make test
sudo make install

rm -rf directory
pwd

gradle build
hadoop jar build/libs/SNAPSHOT.jar chp.WordCount wc-input wc-output

vrijdag 19 februari 2016

Intersystems Caché -- Gateway to hell

In 2005 ben ik een maand bezig geweest met Caché van Intersystems. Aangezien ik nu bezig ben met Hadoop/Big Data dacht ik weer terug aan Caché die zichzelf adverteert als Postrelational database. De truuk van Caché is dat het een Tree is, waarvan de nodes ergens anders opgeslagen kunnen worden. Komt in de buurt van Hadoop. Vandaar dat Caché zichzelf ook wel een Big Data oplossing noemt.

Maar wacht!

Caché zit zo slecht in elkaar dat het de "Gateway to hell" genoemd wordt door ontwikkelaars.
In dit bericht op het internet beschrijft een ontwikkelaar Caché en een zelfde ervaring heb ik ook gehad. Gelukkig hoefde ik uiteindelijk niet professioneel met Caché aan de gang.

Overigens heeft het bedrijf dat Caché gebruikte als z'n ontwikkeltool voor een advertentie-systeem het niet gehaald.

Misschien is Caché tegenwoordig beter, maar het zou me niet verbazen als dat niet zo is. Hieronder herhaal ik een gedeelte van deze post uit 2006:

My absolutly biggest beef with Caché is that all code is stored in the database. All code. Let it sink in for a while... Yes, that's right, you have to use a special application to edit your code. This means no easy backups (you have to either backup the whole database or make an 'export' of your project to XML), no version management system (CVS, Subversion), no auto documentation tools, no analysis tools, no nothing... I can't really tell you how much this sucks. The IDE, Intersystems Studio, is pretty much just a texteditor which highlights syntax errors in red. Thats it. When I complained about Studio a sales representant told me that "we're not a tools company, we're a database company" and then, in the next sentence as an answer to my question about the possibility to use other tools: "no". Go figure.

The programming language has been slightly redesigned in later versions to something called 'Caché Objectscript'. This is a lame attempt to add OO concepts to a basically dead language. It's not enough to add something called 'class' and then be done. No exception handling, no encapsulation, no typing, and so on. Worst part is that the class is 'compiled' into something which is basically Mumps-based. Yes, thats right. You write in one language which compiles into more or less the same language. Smells like a macro-language if you ask me.

Problem is that if a runtime programming error occurs the error refer to the compiled code (!) and usually with a message like: "Error 8002 on line 142 in procedure WTFISGOINGON.inc" (or something to this effect). But it's not line 142 in your code! This is like coding in Java and having the VM point you to the bytecode when something goes wrong... With the error message "it's wrong".

And it doesn't stop there. Remember how popular it was in the end of the 90's to embedd programming languages in HTML-pages? ASP, PHP, and so on? Ofcourse Caché must have its own version, Caché Objectscript Pages or CSP. These are actually stored as regular files, probably because Intersystems use a mod for Apache to handle them. On execution these are compiled to Caché Objectscript classes... Yes, that's right, to something which in turn is compiled to yet another form. Where do you think errors refer?

Ohh, yes... Did I tell you that the documentation absolutely sucks? They have some documentation available similar to javadoc, but where the JDK tells you what you need (and usually more) their version is amazingly sparse. Once I tried to call a static method in a class and got errors however I did it. Turned out that that particular class wasn't converted to the new OO system and that you needed to use the old calling method, but this information was nowhere to be found (it didn't differ one bit from other classes I used).

I could go on here...

woensdag 10 februari 2016

WAMPserver op windows 10

Niet vergeten om de IIS-service te stoppen als je WAMPserver wilt draaien. IIS en WAMPserver willen namelijk beide dezelfde poort gebruiken.

Lambda en Anonymous classes in Java

package testpack;

import java.util.List;

public interface ListMethods {
    List<String> SortFruits(List<String> original);
}


package testpack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class testlambda {

    public List<String> StrategyTest(ListMethods strategy) {
        List<String> fruits = Arrays.asList("Apple", "Tomato", "Currant", "Cranberry");
        return strategy.SortFruits(fruits);
    }
   
    public List<String> getFuitsAnotherWay() {
        ListMethods anonymMethods = new ListMethods() {
            public List<String> SortFruits(List<String> original) {
                Collections.sort(original);
                return original;
            }
        };
        return StrategyTest(anonymMethods); 
    }   

    public List<String> getFuitsAnotherWayLambda() {
        return StrategyTest((fruitList) -> {
            Collections.sort(fruitList);
            return fruitList;
        });
    }   
   
    public static void main(String[] args) {
       
        List<String> result;
       
        result = new ArrayList<String>();       
        result.add("hallo");
        result.add("nederland");
       
        result.stream()
                 .filter(x -> x != "nederland")
                 .forEach(x -> {
                     System.out.println(x);
                 });
       
        testlambda tl = new testlambda();
        result = tl.getFuitsAnotherWayLambda();
        for (String s: result) {
            System.out.println(s);
        }
       
        System.exit(-1);
    }

}

zondag 7 februari 2016

.NET naar Java

Van .NET naar Java:

ASP.NET page = JSP
ASP.NET code behind = Servlet
ASP.NET global.asax = ServletContextListener
ADO.NET = JDBC
Entity Framework = JPA
JAXB = ?
JSON.Net Newtonsoft  = GSON Google
DLL = JAR (Java ARchive. WAR is een Web ARchive, EAR is een Enterprise ARchive)
MSBuild = Maven

In Java heb je ook Generics (compile time), Annotations, boxing en unboxing, Lambda expressions (anonymous class met enkele method. Stream object)