[{"content":"In Part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application \u2018startup\u2019, \u2018warmup\u2019 and \u2018initial footprint\u2019 costs and provided an overview of what Leyden is doing to address those challenges.\nPart 2 described how to use the new capabilities offered by Leyden and presented test results which show that very significant progress has already been made and is set to continue.\nPart 3 provides a more detailed account of how Leyden\u2019s proposed solution operates and presents a first look at tooling that allows you to assess the benefits that result and tune your application to make the most of what Leyden offers.\nWhat is inside the Ahead of Time Cache? Ideally, an AOT cache would simply include everything needed to allow a production run to skip straight through to its warmed up state. However, in practice training runs don\u2019t always cover all the things that can happen at runtime and hence that the assets contained in any generated AOT cache will be more or less complete.\nIn order to have some idea of how effective a training run has been it\u2019s helpful to be able to look at a cache and see what is in it. Full details of the tooling that allows you to do that are presented in part 3 of this blog series. However, in order to prepare for that, we need to provide an overview of the JVM assets that end up in the cache and how the JVM uses them. We will follow up with some examples to show how effectively this improves startup and warmup.\nSo, let\u2019s take a deeper look at what exactly is inside the AOT Cache. There are several different ways of classifying the contents:\nThe most straightforward way to classify AOT cache assets is to distinguish between Static and Dynamic data.\nStatic assets are data that are available in or directly derived from bytecode, data that exist, even if only implicitly, at build time.\nDynamic assets are data that get generated, or are collected, at runtime as a side-effect of execution. Some of them record information that can be used to trigger compilation and drive feedback-driven optimizations, including speculative optimization, beyond what an ahead-of-time compiler would be able to do. They can also include the compiled code that is generated as a result of that compilation.\nFinally, they include training data, created as a training run progresses to track what the JVM has done and why. Training data identify what JVM assets need to be stored into the cache when it is created. They are also installed in the cache, indexing the other assets and helping identify how to use them in production.\nWe can also distinguish two types of data depending on their purpose:\nOn one hand, there is the JVM data \u2014 metadata, heap data and code. This is a network of C++ objects that are used during normal JVM running to define and regulate Java execution. These objects must always exist, even when running without a cache, in order for the JVM to be able to run an app. This object network needs to be dumped to the archive on disk in a format that allows it to be quickly and correctly restored to the relevant memory areas of the production JVM in a valid (C++ Object) format and layout that matches the JVM\u2019s expectations.\nOn the other hand we also have Leyden\u2019s own Cache Management Data, i.e. training data, which exists specifically to support creation and consumption of AOT cache. Training data are also saved and restored as C++ object data but the format and layout of these objects is determined solely by the Leyden cache management code. Its sole purpose is to track and regulate what assets get written to the AOT cache after training completes and what assets can or should be restored in production.\nLet\u2019s see in detail what each data type means.\nJVM Metadata Metadata stored in the AOT cache is a superset of what was stored in a CDS archive. The subset which overlaps with CDS is the static metadata. The latter represents the structure and hierarchy of classes in JDK and application code. Primarily, it helps avoid the cost of parsing bytecode, as it is in the same format as the JVM\u2019s own internal metadata model: classes, methods, fields, inheritance between classes,&hellip; which can be mapped directly into memory. Having this information stored in the cache speeds up the time the Hotspot takes to decode the different class files, and to build the dependency graph.\nWhile starting the application, the Java Heap memory gets filled with objects and instances that are going to be used during runtime. Some of those heap data objects can be cached too because they are quite predictable, like Strings hardcoded in the source code, java.lang.Class instances, some content of class static fields, objects needed to run lambdas, the class graph module,&hellip; Those are all assets that are created in memory in the same way on every run.\nThe heap data cached at the moment is restricted to very specific cases as it has to behave exactly the same on each and every run, but the type of data cached is expanding on each JDK version.\nJVM Profile and Linkage Data The cache also includes dynamic JVM metadata i.e. MethodCounter, MethodData and ConstantPoolCache objects. These objects are created and attached to the static metadata methods and classes and their content is updated as a side-effect of executing method code.\nMethodCounter objects track how often the method they are attached to has been called. They are primarily used to trigger compilation via the baseline (C1) or optimizing (C2) compiler. The interpreter increments a method\u2019s call count up to a threshold before scheduling a C1 compile, possibly including code that gathers further profile information. Instrumentation code in (Tier 2 andImage description 3) C1 compiled methods also updates the call count and when a higher threshold is reached either upgrades to (Tier 4) C2 compiled code or reverts to (Tier 1) C1 compiled code which includes no instrumentation\nMethodProfile objects record detailed information about their associated method\u2019s hot and cold paths, argument types and other details of how it executes, most notably any history of speculative deoptimization. Apart from the deoptimization case, which applies for both C1 and C2 code, MethodProfile objects only receive updates via instrumentation code in (Tier 2 and 3) C1 compiled methods.\nConstantPoolCache objects are attached to a clasImage descriptions and track the linkage of call and field access sites in any of the class\u2019s methods. Prelinking avoids work at the first call or first field access and this is especially valuable when the call is an invokedynamic i.e. the bytecode that implements a lambda invocation.\nLinking a lambda involves running Java \u2018bootstrap\u2019 code that identifies a private class that owns the bytecode for the lambda body, asking it to construct and return a MethodHandle that can be used to execute the target. If a lambda can be run during training then the target class and method can be pre-loaded and the MethodHandle stored in the heap and linked from the ConstantPoolCache, avoiding the need to run the \u2018bootstrap\u2019 in production. If the lambda is executed repeatedly in production the called bytecode may even be inlined into the compiled code for the caller. Effectively, executing as lambda in training removes all setup overheads in production, making lambdas as cheap to use as a direct method call.\nJVM Code and Code Management Data AdapterHandlers are a set of utilities used by the Hotspot to marshall method parameters when performing certain types of call. AdapterHandlers can be cached, avoiding the need to generate them on demand. They are identified by their AdapterFingerprint and indexed via a table of AdapterHandleEntry objects.\nAlongside these handlers various StubBlobs needed by the runtime are also cached. These blobs contain JITted code that implements one or more \u2018stub\u2019 routines. Stub routines include architecture- and OS-specific code used by the JVM to perform operations that are hard to write in a platform agnostic way. Examples include: flushing code regions after update by the JIT or call linker, unwinding the stack when an exception occurs, replacing a compiled stackframe with one or more interpreter frames when execution of a deopt trap forces a bail-out etc. There are also many stubs that provide hand crafted, high-performance implementations of math, crypto or memory copy methods that are used in place of Java implementations on some architectures, especially where hand-crafted code can use specialized hardware instructions to outperform the JIT compiler. Much of the stub and adapter code has to be generated before the JDK can fully startup. Storing it in the cache and reloading it in production provides a small but noticeable performance improvement.\nLeyden premain also includes CompiledMethods, i.e. pre-compiled Java methods, in the cache. This includes both C1 and C2 (Tiers 1 - 4) and in some cases different tier compiled versions of the same method. Having compiled code immediately available, especially Tier 4 code, is an enormous boost to performance. Lower tier code may be useful when the method only reached that tier during training or as a fallback if we need to deoptimize and reprofile. Pre-compiled Java methods are an enhancement we expect to add soon to the mainline JDK.\nLeyden Training Data Training data is part of the Leyden specific code. It tracks which methods have actually been loaded, executed, and used during the training run and how they have been used. Normally all loaded classes have associated class training data, but these may be omitted if, say, the class is loaded by a custom (user-defined) loader, is modified by an agent or fails to resolve because of linkage errors.There is a usage threshold which means that only methods that have been executed above that threshold will have associated method training data. Likewise, compiled method training data only exists for methods actually compiled during training. This helps both in keeping a smaller footprint in the cache and removing less useful data so processing the cache is faster.\nHow Do I Know Leyden Is Helping? Depending on how well you train your deployment you may see different improvements in time to reach application start (startup time) and time to reach peak performance (warmup time). Log output is one useful way to measure these two metrics but the details will depend on what monitoring capabilities are available in your test or production environment. However, simply measuring these two times (or even recording warmup profiles) doesn\u2019t help with the problem of explaining why, for some given training regime, you get a specific improvement or perhaps, in some cases, no measurable improvement.\nFor any given AOT cache (or set of alternative caches) it is very helpful to have some idea of what assets were included or excluded in the training set, which ones were written into the cache and what benefit they provide during a production run. In particular, it is useful to have both aggregate statistics and information on individual assets and their relationships. The Leyden project has provided a tool precisely to address these needs. Let&rsquo;s see a practical example of how to diagnose an AOT Cache.\nFor the purpose of this article, we are going to use the following example application: https:\/\/github.com\/Delawen\/bad-good-cache\nThis is a web application that has a simple API and a basic html interface to use it.\nThe first thing we need to do is to compile this application on the root folder:\n$ mvn clean package\nTraining the application Once we have the jar created, we use it to start a training run:\n$ java -XX:AOTCacheOutput=target\/app.aot -Xlog:aot+map=trace,aot+map+oops=trace:file=target\/aot.map:none:filesize=0 -Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*=warning:file=target\/training.log:level,tags -jar target\/quarkus-app\/quarkus-run.jar\nThe arguments we are going to use are the following:\n-XX:AOTCacheOutput=target\/app.aot Which will create an AOT file called app.aot -Xlog:aot+map=trace,aot+map+oops=trace:file=target\/aot.map:none:filesize=0 Which will create a map file that indexes and describes the previously created AOT file. -Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*=warning:file=target\/training.log:level,tags Which will generate training log files with relevant information To help us train the application, we are going to use the `oha` tool, that helps us run a series of requests that will showcase a user using the application:\n$ oha --urls-from-file src\/main\/resources\/urls.txt -n 100\nNow that we have trained the application, let&rsquo;s stop it with ctrl+c. It will take some time to stop while it builds the cache. It will do both the training and assembly steps at once.\nWe should have created three types of files:\ntarget\/app.aot : The AOT cache itself target\/aot.map : The map file target\/training.log : The logs for the training run Now that we have the AOT cache, we can start a production run, in which we will also save log files:\n$ exit\nThe arguments we are going to use are the following:\n-XX:AOTCache=target\/app.aot Make use of the AOT file called app.aot -Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*=warning:file=target\/production.log:level,tags Which will generate a production log file with relevant information And we can use the application normally. Let&rsquo;s play a bit on http:\/\/localhost:8080\/\nOn this run, we created the production.log file.\nAnalyzing the Cache After using it, we can stop it and analyze how the AOT Cache behaved with our AOT Cache diagnostics tool: https:\/\/github.com\/Delawen\/leyden-analyzer\nThe first step is loading all the information into the tool, to run a proper analysis:\n&gt; load aotCache --background target\/aot.map\n&gt; load trainingLog --background target\/training.log*\n&gt; load productionLog --background target\/production.log*\nNow we are ready to start our analysis. A good place to start is the info command that shows a summarized version of what is inside the cache:\nAre we training the right thing? The first thing that should catch our attention is that there&rsquo;s more than 10% of classes that were used on the production run but were not cached. That&rsquo;s not usual, so let&rsquo;s dig into whatImage description those classes are. There are hundreds of them, so if we filter by our package name, that would make our exploration easier:\nWhat does this mean? Let&rsquo;s take a closer look:\nThis class was not loaded during training but it was loaded during production. Something went wrong with our training.\nWe can explore the class org.cutecats.rest.json.CatPhotoGenerator by looking at the source code. There, we discover that it should be used by org.cutecats.rest.json.CatResource.\nSo, this class was loaded both on training and production runs, and the metadata is included in the AOT Cache. But for some reason, none of its methods were profiled during the training run. This means that our training run did not make extensive use of this class. Maybe we should take a look at our training run.\nAnd indeed, there is an obvious mistake: the urls.txt file that oha used to create the requests only contains the static html pages. None of our Java classes are executed, although Quarkus loaded them at the beginning as services.\nLet&rsquo;s run again the training, changing the url to the Java endpoints instead of the html pages: http:\/\/localhost:8080\/cats and http:\/\/localhost:8080\/list\nDon&rsquo;t forget to remove the log and aot files from target\/ after each try to have clean runs (the clean on the maven command should do that).\nIf we analyze the results again with our tool, we should see a different result:\nWe have increased the percentage of the classes used (96%) in production that were cached compared to our last attempt (89%). That&rsquo;s an improvement.\nDid we load all relevant classes during Training? Let&rsquo;s check again for classes loaded in production that were not cached:\nSomething is still not working as intended. Maybe we should approach this from the other side: are we executing some testing code that replaces the real production code that should be executed during training?\nLet&rsquo;s check if there&rsquo;s something being stored in the cache that we don&rsquo;t really need:\nWe can see a suspicious class called DummyPhotoGenerator. That&rsquo;s supposed to be used only for testing purposes, not for real training and production. Using DummyPhotoGenerator instead of the CatPhotoGenerator class is making the code and classes used by CatPhotoGenerator not being used. If we explore our source code, we will discover that there is a \u201ctest\u201d argument on the \/cats endpoint that distinguishes between testing and production.\nTo fix our training, we have to call the endpoint \/cats with a test=false argument. Because the training run is not a test run.\nThe training run has to be as close to production as possible. If we use test classes, not only will they be stored in the cache and be loaded on production run, but they may also hide real production code from being trained.\nLet&rsquo;s try again, now using http:\/\/localhost:8080\/cats?test=false in the urls.txt file.\nWe have increased a bit more the percentage of classes loaded, which is always a good sign. Image description Do we have any other classes loaded during production that were not cached during training? Are there any testing classes loaded during training or production runs?\nWe made sure that:\nAll our classes used in production are included in the cache\nNone of our testing classes are included in the cache\nAlthough we still don&rsquo;t have the aspiring ideal 100% classes cached, we are really close (98%) and we can be happy with the list of classes cached. We can now focus on how good the profiling of the methods is.\nAre our methods properly trained? Maybe you already noticed another important information we have been ignoring until now: all our classes are labelled as &ldquo;[Untrained]&rdquo;. Let&rsquo;s take a closer look at that.\nProfiling is done on each method independently, so let&rsquo;s take a look at one of our methods that we know should be well trained. The describe command is pretty self explanatory on this case:\nLet&rsquo;s follow the recommendation and do more requests during the training run.\n$ oha --urls-from-file src\/main\/resources\/urls.txt -n 10k\nAnd with 10 000 requests done, we can see that we got our method completely profiled and compiled to the higher level:\nThere\u2019s still more improvements that can be done to the training that will greatly depend on your application, but now we have all the basics covered.\n","permalink":"https:\/\/delawen.com\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance-3\/","summary":"<p>In <a href=\"\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance\">Part 1<\/a> of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application \u2018startup\u2019, \u2018warmup\u2019 and \u2018initial footprint\u2019 costs and provided an overview of what Leyden is doing to address those challenges.<\/p>\n<p><a href=\"\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance-2\">Part 2<\/a> described how to use the new capabilities offered by Leyden and presented test results which show that very significant progress has already been made and is set to continue.<\/p>\n<p>Part 3 provides a more detailed account of how Leyden\u2019s proposed solution operates and presents a first look at tooling that allows you to assess the benefits that result and tune your application to make the most of what Leyden offers.<\/p>","title":"How is Leyden improving Java Performance? Part 3 of 3"},{"content":"In Part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application \u2018startup\u2019, \u2018warmup\u2019 and \u2018initial footprint\u2019 costs and provided an overview of what Leyden is doing to address those challenges.\nPart 2 describes how to use the new AOT capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.\nPart 3 provides a more detailed account of how Leyden\u2019s proposed solution operates, and offers a first look at tooling that allows you to assess the benefits that result and tune your application to make the most of what Leyden offers.\nHow to use an AOT Cache To use an AOT cache (on JDK 25+), you need to add some JVM arguments to your app launch command. There are two ways of doing it, in 2 or 3 steps.\nJoint Training and Assembly steps \u2014 writing of the AOT cache is performed in a forked Java runtime at training run exit:\nTraining+Assembly Run: java -XX:AOTCacheOutput=${aot-cache-file} -jar app.jar Production Run: java -XX:AOTCache=${aot-cache-file} -jar app.jar Step 1 of the two step model runs your application until it exits (whether by means of some exit mechanism built into the application or simply by typing Ctrl-C on the console). At that point a separate Assembly JVM is forked to consume the training data collected during the training run and generate an AOT cache using the name supplied via the AOTCache command line option. The training JVM waits for the Assembly JVM to finish writing this file before it completes its own exit.\nStep 2 runs the production application using the AOT cache specified by the AOTCache command line option.\nSeparate Training and Assembly steps \u2014 allows the assembly run to be executed independently without delaying the training run exit:\nTraining Run: java - XX:AOTMode=record -XX:AOTConfiguration=${aot-cache-conf-file} -jar app.jar Assembly Run: java -XX:AOTMode=create -XX:AOTConfiguration=${aot-cache-conf-file} -XX:AOTCacheOutput=${aot-cache-file} -jar app.jar Production Run: java -XX:AOTCache=${aot-cache-file} -jar app.jar The three step model allows you to manage training and assembly as independent steps.\nStep 1 runs your application until it exits, at which the training data collected during the training run is dumped to an AOT configuration file specified using the AOTConfiguration command line option.\nIn step 2 this training data is passed to a new JVM using the same command line option and is used to generate an AOT cache to the file specified using the AOTCacheOutput command line option.\nStep 3 runs the production application using the AOT cache specified by the AOTCache command line option.\nThe 3 step workflow is sometimes preferable because it allows the training JVM to exit more quickly. Dumping of training data is usually quick even if it is not instantaneous. Generation of the AOT cache takes substantially longer because there is a lot more work involved in sorting and laying out that data in a format that meets the JVM\u2019s needs.\nAlso, with the Leyden premain release, the Assembly JVM will perform a \u2018cleanroom\u2019 compilation of all the methods to be included in the cache, possibly compiling them at more than one compilation level. This adds more time to the cache generation step.\nHow to properly execute the Training Run? The best way to train your application and generate the AOT cache is a canary deployment, where you run your application in the real production environment with training enabled, allowing it to collect training data as it runs. However, that\u2019s not always feasible, especially on containerized production environments that don\u2019t have disk-write privileges.\nDepending on how your deployment is set up this may be the type of circumstance where you choose the 3 step training model, allowing your training JVM to exit quickly and relegating the assembly to a separate, follow-on deployment. Note that the assembly JVM does not run your application code so will not need access to resources like networks or databases.\nRecording requests made to your application and replaying them on a test server (either in real time or delayed), is also a very good way to generate the AOT cache, as it reproduces exactly the same kind of behaviour you can expect on production. Alternatively, you can generate synthetic request data that simulates the behaviour you expect to encounter in real production, although that may reduce the relevance or accuracy of the resulting AOT cache assets.\nIf you have a strong testing framework, and you are using Quarkus, you can always generate the AOT cache using integration tests. Note that you will need to run the methods repeatedly (probably several thousands of calls) to generate the proper compilation optimizations.\nThe best results arise when the raining run resembles a production run as closely as possible. However, whatever training method you employ, on any cache produced will only be usable in production if you run with the same JVM and the same command line JVM options.\nYou can add extra jars at the end of the production run classpath but the initial segment must be the same as the classpath provided during training.\nAt the moment of writing this article, you also need to deploy on the same CPU family and operating system. In upcoming versions which will include compiled code in the cache, the production hardware must implement the exact same CPU features as the hardware used for the training run. If the CPU features are not identical then compiled and stub code assets will be ignored (other cache assets will still be usable).\nRemember to follow these basic constraints when generating the cache: same hardware, same Java version, same Operating System, and same JVM arguments.\nShould I start using AOT Cache in Java already? The short answer is yes.\nWhether your application gets significantly faster now, or if you are interested in testing it to help Leyden development move towards your interests, you should start using the AOT cache already.\nNote that you need at least JDK 25 to be able to use it. Performance gains are incremental with each new JDK release. The actual improvements that you can achieve using Leyden depend strongly on your application and how you use it.\nLet\u2019s see some examples. We are going to run them over JDK 26.\nHeavy Mathematical Example First we are going to use a benchmark application that runs heavy mathematical operations via a REST API. We are going to train this application twice to compare how different training affects performance on production.\nThis application makes use of an aot-jar from Quarkus which is optimized for Leyden and available since version 3.32.0.\nWe are going to use a training run that randomly calls the following urls:\n\/nqueens\/16 : to calculate the nqueens problem with a 16 board size \/fibonacci\/100 : to calculate fibonacci series with input 100 \/nqueens : to calculate the nqueens problem with either 16 or 8 as the board size \/fibonacci : to calculate fibonacci with a random number between 1 and 100 The idea is to have a load that is partly random (as an API with real users would be) but has a preference over specific branches or loop unrolling sizes.\nWe will do a training with 1000 requests and a second training with 60 000 requests. That should represent how different training affects final performance. We are going to run the application on a Linux machine assigning 2 cores to our application.\nDue to the kind of things Java 26 is storing in the AOT cache, we can theorize that there won\u2019t be much difference between the different trainings when comparing startup time (startup of the application and opening the port), as most of the code run during initialization is run only once, so adding more requests to the training won\u2019t improve that initialization time. This is something that may change in future developments as more assets are included in the AOT cache.\nBy using the Java AOT Cache Diagnostics Tool, we can compare the contents of the cache generated on each training.\n1000 requests training 60 000 requests training As expected, both trainings seem to have cached the same amount of metadata (slightly above 99% of classes used), because the code loaded into memory on both cases should be more or less the same (some timeout or runtime exception thrown may explain differences). This means that the startup time using any of the generated caches should be similar.\nThe training with 60 000 requests has many more methods that are profiled and compiled at a higher level because it had a longer time to profile and optimize. That should lead to better outcomes on the warmup time.\nAnyway, we should notice an improvement on startup time compared to the regular Java deployment, because we have a lot of metadata, profile and linkage data and some heap data already cached during AOT. And as we can see on the following graph, time to first response (which includes initialization) is already a third.\nThe other interesting measurement is how much and for how long response times are disrupted during the early stages of application execution. There is always some small variation in response times even when an app is fully warmed up \u2013 often referred to as jitter.\nHowever, during warmup the housekeeping work that the JVM has to do can significantly increase jitter. Individual responses may be delayed because they require the thread to execute one-off events like load or initialize a class, link a call site or field access site, or update profile data. Background JIT compilation will also steal CPU cycles, potentially pre-empting request handling in Java threads. Finally, early requests will mostly execute relatively slowly in the interpreter, while later requests will gradually respond more quickly as the JIT compiler delivers compiled code.\nIn theory, this is where longer training sessions should have a bigger impact. Better training results in more cached classes and heap objects needed in production, more pre-linking of calls and accesses, more method profile data to allow earlier and better informed compilation. So, we should see not only an improvement compared to the regular java version, but also a difference between the two trained caches.\nThe graph above shows individual response times for requests for each of the three deployments, Traditional Java (no AOT), AOT trained with 1000 requests, and AOT trained with 60 000 requests.\nIn all cases, the request rate is constant and within the peak capacity of the server. In all 3 cases the jitter slowly decays as the request count increases, eventually converging to a low, random variation.\nHowever, it is also very clear that\nThere is a lot more JVM housework being performed in the non-AOT case than when using AOT, reaching peak performance later. The well trained cache suffers less jitter, i.e. removes a lot more housework, than the weakly trained app. Note that JDK26 does store training data on the cache, but does not store compiled code. This means, future versions of the JDK will show a much larger difference between weak and strong training regimes.\nSimple REST API Now, we are going to do the same with a simple REST API application using Quarkus that connects to a database to extract data. This time we employ the Leyden premain JVM which caches code compiled code as well as all the other AOT cache assets mentioned earlier.\nWe use a single training run with 10 000 requests, executing a test that calls the endpoint \/fruits repeatedly. In contrast with the previous example, in this case we are not going to observe as much advantage from speculative compilation because the code is simpler and the entrypoint is always called with the same parameters. But we should still see an improvement all the same.\nLet\u2019s take a look at the time to first response to see if it is improved by Leyden AOT:\nStartup time in this example is slower than in the previous example because we have to initialize connections to the database and load the database model.\nNow, let\u2019s take a look at the response times and see if the warmup time is also improved thanks to the AOT cache.\nBoth runs suffer jitter during the first requests, at which point most of the housekeeping work is completed. The dramatic drop off in jitter for the AOT run around request 45 indicates that at this point almost all loading, initialization and linking costs have been met and the necessary compiled code has been delivered. By contrast the non-AOT run is still suffering jitter even after 100 requests i.e. it has still not warmed up to reach peak performance.\nThese are only a couple of examples that showcase how Leyden is already improving your startup and warmup time.\nHow far Leyden can help your application can only be discovered by trying it.\n","permalink":"https:\/\/delawen.com\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance-2\/","summary":"<p>In <a href=\"\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance\">Part 1<\/a> of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application \u2018startup\u2019, \u2018warmup\u2019 and \u2018initial footprint\u2019 costs and provided an overview of what Leyden is doing to address those challenges.<\/p>\n<p>Part 2 describes how to use the new AOT capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.<\/p>","title":"How is Leyden improving Java Performance? Part 2 of 3"},{"content":"In this series of 3 blog posts we will explain how OpenJDK project Leyden is helping to improve a specific area of performance where Java has notably lagged behind other languages i.e. application \u2018startup\u2019, \u2018warmup\u2019, and \u2018initial footprint\u2019.\nPart 1 explains what those terms mean and why Java faces challenges in matching the behaviour of other languages. It then provides an overview of what Leyden has done to improve startup and warmup in existing JDK releases and what is planned for upcoming releases.\nPart 2 describes how to use the new capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.\nPart 3 provides a more detailed account of how Leyden\u2019s proposed solution operates and presents a first look at tooling that allows you to assess the benefits that result and tune your application to make the most of what Leyden offers.\nA Brief History of Java Performance Java has been one of the most popular programming object-oriented languages for decades. Its success relies heavily on the fact that it offers a portable, managed runtime that makes it easy and safe to resolve many common programming challenges. In particular, Java was the first portable language to make it straightforward for programmers to deliver multi-threaded applications which allocate and manage storage at runtime without risk of invalid memory accesses.\nThe fact that Java remains popular still surprises some programmers, given that it belongs to the family of dynamic languages that, most notably, includes Lisp, Smalltalk and Self. Dynamic languages allow their code base to be incrementally defined as the program executes. That code base is often implemented using a language-specific virtual machine. Dynamic languages were traditionally executed by interpreting either the source code or an intermediate bytecode derived from the source. This often caused lower performance than native-compiled, non-dynamic languages.\nHowever, modern Java runtimes rely on powerful \u2018just-in-time\u2019 (JIT) compilers to translate bytecode to native machine code at runtime. JIT compilation, a technique originally tried in Smalltalk nearly 40 years ago, has improved Java performance by orders of magnitude from the early days of an interpreter-only runtime. The use of runtime execution profiling supports feedback directed optimization and speculative optimization. This has allowed Java JIT compilers to achieve peak performance that far exceeds what can be achieved with programs that are compiled ahead-of-time (AOT).\nWhy Java takes time to reach peak performance The downside of dynamic class loading and JIT compilation is that a Java runtime takes some time to achieve this impressive peak performance.\nWhen a new Java application is launched, it is normally a \u2018cold start\u2019. Details of all the classes and methods the application needs to use are only available in a compact bytecode representation, stored on disk either in application supplied class files or embedded in the Java platform\u2019s jmod files.The Java Virtual Machine (JVM) has to parse and unwrap this bytecode, constructing its own \u2018metadata\u2019 model of the class and method base, one that the interpreter and compiled code can efficiently operate over. It also has to set the base state of each loaded class, running Java \u2018static init\u2019 code to populate the class\u2019s static fields, before it can execute any of the class\u2019s methods.\nIn addition, the JVM has to perform dynamic linkage. When compilation or execution of a Java method first encounters a call (invoke bytecode) or a data access (get\/putfield bytecode) the JVM has to link that call or data access site. That involves replacing references to the target class and method\/field, which occur as symbol names in the bytecode, with a direct memory reference. This identifies first the target metadata class, and then the target metadata method or field. If the target class has not yet been encountered during execution, this linking step may trigger further bytecode loading, parsing, and class initialization.\nThe JVM normally starts off executing Java methods in the interpreter. Of course, it could always execute native code, compiling the Java method bytecode either immediately at load or lazily at first call. However, compilation takes time to complete so it is normally better done in the background while proceeding to interpret. Indeed, JIT compilation frequently pays off more when done selectively. Methods that only get called once or twice can take more cycles to compile than to simply interpret the bytecode.\nFurthermore, without runtime execution profile data as input, the compiler is unable to make informed, feedback-directed optimizations that significantly improve performance of the compiled code. Most importantly, it cannot simplify the compiled code by speculating that previous execution patterns will continue, replacing code that lies on untaken \u2019cold\u2019 branches with traps. Speculative compilation, an optimization first used in the Self compiler over 30 years ago, reduces both the size and the complexity of bytecode that feeds into a specific compilation. That, in turn, enables deep inlining of method calls and offers the possibility to identify many more derived optimizations. The rare case where a trap on a cold branch gets executed is handled by deoptimizing i.e. jumping back into the interpreter and recompiling the method with an updated branch profile.\nHousekeeping considered harmful During early stages of application execution, the JVM housekeeping overheads listed above are at their highest. Class loading and initialization, class linking, and recording of method execution profile data occur frequently as side effects of execution, for both application and JDK runtime methods, impeding direct forward progress of the application. Method compilation proceeds in dedicated, background compiler threads, but this still steals CPU cycles, once again, impeding application progress.\nThe impedance of JVM housekeeping work gradually decreases, as more and more of the required JDK code and application code is gradually linked into the runtime. At the same time delivery of compiled code improves application execution speed incrementally.\nAfter some time, a steady state is reached where most or all classes are loaded and linked, most or all methods have been profiled, and all \u2018hot\u2019 methods have been compiled with highly efficient code. Very occasionally variation in input data or a phase change in program behaviour drives the application down a cold path, triggering deoptimization and incurring extra JVM overheads. However, by and large, applications mostly warm up and continue to run with steady peak performance.\nLeyden Project \u2018premain\u2019 Experiment Project Leyden has been experimenting with reducing the impedance of JVM house keeping tasks in the \u2018premain\u2019 branch of the project repository. The observation that drives the Leyden premain experiment is that, most of the time, the housekeeping operations that occur during an application run involve doing exactly or almost exactly the same work with the same result, certainly in the early stages where the impedance is high. On every run a lot of the same byecode gets loaded and linked, the same classes get initialized, the same methods turn out to be hot, and end up getting compiled with the same or very similar profile information.\nThis is especially true for the JDK runtime code that runs before entering the application main method, likewise for JDK library code that the application calls out to. The JVM will always load base classes like java.lang.Object, java.lang.Class, or java.util.String. The same String instances, hard coded as literals in JDK methods, are added to the heap on every single run. Container classes like List and HashTable are commonly reused for the same purposes.\nJDK classes are fixed for any given release so their class, method and field metadata will always be the same and they will always cross-reference each other (i.e. be linked) in exactly the same way. In fact the Leyden premain branch gets its name from its original focus, which was optimizing this JDK execution that happens before entering application main.\nThe idea of profiting from this identity of JDK metadata across runs is not new. Since JDK13 Class Data Sharing (CDS) has been able to optimize away class loading and bytecode parsing for JDK classes by storing the JVM\u2019s metadata model of the JDK classes in a CDS archive, allowing it to be reloaded \u2019oven-ready\u2019 on subsequent runs.\nThat version of CDS provided an effective, albeit limited, limited warm-start capability for the JDK, halving the time taken for the JDK to start up i.e. complete JDK initialization and enter the application main routine. CDS also helped application warmup by lowering initial costs involved in callouts to JDK library code.\nWith application classes there is no strong guarantee that the same classes will be present in the same format between one run and the next. Or that classes loaded and used on one run will always be loaded and used in the same way on subsequent runs. However, so long as the same jars appear in the classpath and the class bytecode is loaded without runtime-specific agent transformations, then it is possible and, for many classes, quite probable that saved metadata will be reusable.\nMore recent versions of CDS have supported save and restore metadata for application classes via a dynamic CDS archive, allowing the JVM to bypass loading and bytecode parsing costs for those classes on subsequent runs, improving both application startup and warmup.\nLeyden\u2019s premain branch builds on this success but it is addressing a bigger prize than just archived metadata. The broader internal JVM state \u2014 not just metadata but static field data, linkage data, method profiles, compiled code \u2014 which is slowly constructed during warmup, may vary depending on precisely what happens on each run. However, most of what is created on one run, if it could be saved in an archive \u2013 as CDS currently does with metadata, ought to be reusable on a subsequent run, short circuiting the housekeeping overheads normally incurred to create it.\nEven if some saved state might turn out not to be useful, because, say, a class was not referenced or a method not called in the subsequent run, the ability to reuse some of the state should still pay off. The cost of reloading the required state can be made much lower than the cost of recreating, meaning the application can reach peak performance earlier, with less impedance from the JVM. The more reusable state that can be saved the greater the reduction in impedance.\nTraining and Production Runs So, the basic idea behind is to run your application twice:\nTraining Run: in which we cache the metadata, the profiling statistics, some heap data, compiled code,&hellip; Production Run: loads the previously (ahead of time) cached information, so the run starts hot. This is the \u201creal\u201d run in which we make use of our app. Of course, this only makes sense if the training run accurately represents the production run.\nTo achieve this, we need to respect the following constraints:\nSame Hardware: Or the compiled code may not be able to run, and the optimizations made may even be against performance in our production run. Same Java version and source code: If we change the source code, anything cached related to the source code gets deprecated and becomes useless. Same Operative System Family: There are pieces of the JVM that behave differently on Linux, Windows or MacOS. We can\u2019t just reuse our cached information if we change it. Same JVM options (mostly): We could maybe change some JVM options (like use a different garbage collector). But then, profiling statistics that we cache, and information about how the application behaves, may no longer be valid to our new configuration. Better not to play with these settings. [optional] No Custom Classloaders: The cache will ignore (for now) the classes loaded with a custom classloader. This means that part of the application will not be hot when run for the second time. Some of the AOT improvements developed in the Leyden branch have already been made available in the latest JDK LTS version at the moment of writing this article (25). But the plan for subsequent releases is that more features will be migrated, more things will be cached, and the performance gains will get better and better. The performance gains strongly depend on your app usage, the JDK version you are using, and how good is the training you are doing.\nIn the next post we will explain how to use the new AOT capabilities that are available in both JDK25. We will also present test results which show that very significant progress has already been made and is set to continue on capabilities already present in JDK 26 and on.\n","permalink":"https:\/\/delawen.com\/2026\/03\/17\/How-is-Leyden-improving-Java-Performance\/","summary":"<p>In this series of 3 blog posts we will explain how OpenJDK project Leyden is helping to improve a specific area of performance where Java has notably lagged behind other languages i.e. application \u2018startup\u2019, \u2018warmup\u2019, and \u2018initial footprint\u2019.<\/p>\n<p>Part 1 explains what those terms mean and why Java faces challenges in matching the behaviour of other languages. It then provides an overview of what Leyden has done to improve startup and warmup in existing JDK releases and what is planned for upcoming releases.<\/p>","title":"How is Leyden improving Java Performance? Part 1 of 3"},{"content":"There are many initiatives inside the OpenJDK that are revolutionizing the way our Java applications behave. Project Leyden accelerates peak performance by improving ahead of time caching. But, do you know how to use it with your application?\nOn this session we will discuss what Leyden is, what is the state of art of the ahead of time cache, and showcase a few examples. We will prove (with potential demo effect!) that Leyden decreases warm-up time, and present the tools you can use to optimize your application!\n","permalink":"https:\/\/delawen.com\/events\/2026-01-22\/","summary":"<p>There are many initiatives inside the OpenJDK that are revolutionizing the way our Java applications behave. Project Leyden accelerates peak performance by improving ahead of time caching. But, do you know how to use it with your application?<\/p>\n<p>On this session we will discuss what Leyden is, what is the state of art of the ahead of time cache, and showcase a few examples. We will prove (with potential demo effect!) that Leyden decreases warm-up time, and present the tools you can use to optimize your application!<\/p>","title":"jChampionsConference: Ahead of time, the final frontier"},{"content":" ","permalink":"https:\/\/delawen.com\/events\/2025-12-15\/","summary":"<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\">\n      <iframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https:\/\/www.youtube.com\/embed\/RX47zWi8yvs?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"><\/iframe>\n    <\/div>","title":"Quarkus Insights: Hypercharging Java with Leyden"},{"content":"When you start a new project in Java, obviously you are not going to use only plain vanilla Java. You usually need some libraries or frameworks to help you: maybe to connect to a database, maybe to setup some web service.\nThere are many of these libraries and frameworks that have been around our Java ecosystem for a long time. They have helped evolved the Java ecosystem for decades. These libraries experiment with features and how to implement them in the best way. That generated a knowledge base that the developers of the language can later use to add those same features in the best way possible to the core language.\nDe facto standard becoming the new base And this is something that happens in other languages. For example, if you were a web developer a couple of decades ago, you will remember JQuery. It was the default library that (almost) everybody used to build webpages. JQuery became so popular, that the JavaScript developers decided, in the end, that it made sense to implement the same features on vanilla JavaScript. Because everybody was using it anyway. It was a de facto standard. So, why not made it part of the plain base language?\nAfter JQuery, there came many other libraries for web development. And sadly, although they all implement very similar features, those libraries have diverged a lot. Most of them are based on similar concepts (having a shadow doom, having components,&hellip;). But the vocabulary, the grammar, the semantics of how each framework operates are completely different.\nThe fragmentation of JavaScript When you take a look at job offers in the web development space, you will no longer see a &ldquo;Looking for a JavaScript Developer&rdquo;. Instead, you can see &ldquo;Looking for a React Developer&rdquo;, or &ldquo;Looking for an Angular Developer&rdquo;. And changing from one framework to another is costly. You would have to trash most of your source code and start from scratch all over again.\nThat, in my opinion, is problematic in several ways. First, there is no longer a standard that everybody agrees on that can be easily incorporated to the vanilla version of JavaScript. But also, the ecosystem is almost forking in a way that it will be very difficult to join again in the future to build a common ground to reuse knowledge and development efforts. It is not clear in which direction the language should evolve, because each framework is tensing the evolution in a different direction.\nIs Java becoming fragmented? Are we having the same fragmentation in Java? 20 years ago, Spring was kind of our de facto standard library to do everything. It set up some expectations, grammar, vocabulary, that we all shared and understood. But during the past few years there has been new frameworks appearing that did things in a different way, with different goals.\nWouldn&rsquo;t it be possible to have some common ground? Some common vocabulary, grammar, semantics, understandings, that we all shared? Leaving implementation details to each particular framework, but can&rsquo;t we agree on offering similar conceptual features? And then, maybe, let the base language choose the best implementation of all, if any.\nFor example, if I say &ldquo;I need a Singleton&rdquo;, that Singleton has the same behaviour we all understand. I don&rsquo;t care about implementation details, I just want that instance to behave as theoretically described. If we all use the same way of defining singletons, moving to a different framework should be easier.\nOr if I need to connect to a database, we can use a common grammar to define tables, relationships, and columns. Regardless of which library I use to do the actual connection. I just want to make sure it behaves how I want it to behave. If I say a column is an identifier, it should behave as such. If I say there is a many to many relationship, I want that relationship to be there. The concepts are the same, no matter the framework we use.\nSo, if in the future, the framework I am using is no longer the best for my use case, I want to be able to easily move and adapt, without having to throw all my code away.\nMicroProfile That is the concept of MicroProfile. It is a community-driven vendor-neutral effort that defines concepts, grammar, vocabulary, semantics,&hellip; that are abstract enough to be shared across different frameworks and libraries.\n&ldquo;We aim to merge innovation and standardization into Enterprise Java with Microservices focus.&rdquo;\nMicroProfile\nSome of you readers may realize this is not something new. This is something we have already done. In 1997, one of the biggest features of Java 6 was the Enterprise Java Beans (EJB). Each framework implemented its own way of handling beans, EJB defined the business logic of beans in Java. Or maybe some readers remember JavaEE (lately renamed to JakartaEE) that also offered some common APIs.\nFear not, MicroProfile is not trying to reinvent the wheel. In fact, MicroProfile has JackartaEE as part of its core, among other API specifications like OpenAPI or Telemetry.\nI am not a MicroProfile developer, nor am I part of any of the frameworks I am going to discuss on this article. But after reading about MicroProfile, I wanted to experiment and see for myself how true is that MicroProfile simplifies developing and allows a common playground for all frameworks.\nThe three MicroProfile misfits For this exploration, I tried to write in &ldquo;MicroProfile&rdquo; for three different frameworks. The idea was to use the same source code to do something very basic: a web server with some database connection. And then see if the three of them can use that same source code.\nThe first framework would be, of course, Spring. It has been the standard for 20 years already and has strong foundations, documentation, examples, use cases. Lots of experts have grown with Spring. But, of course, Spring has been here long before MicroProfile even existed. It&rsquo;s not that Spring does lack features. It&rsquo;s that sometimes expressing those features in MicroProfile is not straight forward. So compatibility is sometimes hard, as some of the semantics and concepts do not fit that well.\nThe second framework is Micronaut. Micronaut has a strong relationship with GraalVM and Oracle, the biggest contributor of Java. It is focused on Cloud Native and MicroServices. Micronaut follows very closely the MicroProfile specification, but sometimes when it needs a feature not yet available, it creates its own annotations and grammar.\nThe third framework I tested was Quarkus. I already had some experience with it. But I was most curious because Quarkus heavily rely on MicroProfile. Instead of diverging from it, if they need something that is not on MicroProfile yet, the Quarkus team fights to get some definitions in MicroProfile.\nGraalVM There is one thing that these three frameworks have in common: they all target GraalVM as a runtime of choice. GraalVM improves the Ahead of Time (AoT) compilation of Java programs. It also allows to build native binaries that will run independently of any JVM.\nThis compilation is based on the Closed World assumption. This means that you have all the information needed on build time. For example, there will be no libraries added dynamically to the classpath and no reflection at runtime. So, if some class or method is not called explicitly by another class or method in your source code, we can safely remove it from the build. This reduces the size of the compiled application, which allows not only for reduced memory usage, but also a faster startup and execution.\nThe downside is that not all applications are suitable for this kind of compilation. But don&rsquo;t worry, that&rsquo;s what Leyden is for.\nDo they really speak MicroProfile? I tried to build a simple web service that connects to an H2 database. As I want to use the same source code for all three frameworks, I created a single Maven project for all of them and use profiles to change the dependencies.\nThe source code is available here: https:\/\/github.com\/Delawen\/chaos-incarnated.\nDisclaimer: I approached the three frameworks as a regular civilian with no previous experience with MicroProfile on them. There may be a simpler or better way of doing things. But, if there is, it is not easy to find in the documentation. Who is your Daddy? My first problem down the road is inherently tied to having three frameworks on the same Maven project. But it is also relevant if you have a big hierarchy of projects, with your own parents. Can I use these frameworks with dependency management blocks or do I need to set up a specific parent for them?\nBoth Quarkus and Spring allow to add a dependency management block that will handle versioning and dependencies. Spring strongly suggests to use the parent in the POM, but it can be used (with some versions missing) using the proper dependency management. Sadly, Micronaut forces us to use a parent in our POM, making the whole profile to change the framework problematic.\nAs a summary of this section, both Quarkus and Spring pass the test, while Micronaut make it a bit more difficult.\n| Quarkus | Spring | Micronaut | | \ud83d\ude0a | \ud83e\udd20 | \ud83d\ude35|\nInvoke MicroProfile code Now, let&rsquo;s try to create a service we can invoke. The source code for a hello world service in MicroProfile is pretty straight forward:\npackage com.example; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path(&#34;\/hello&#34;) public class HelloService { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return &#34;Hello from MicroProfile!&#34;; } } When I tried to run this piece of code, I realized that for Spring and Micronaut, adding the proper dependencies and build sections was not enough. Both of them needed an Application class that bootstrap the webservice [1] [2]. That application class was just decorative, it was not adding anything to our source code, but without it, the service just didn&rsquo;t run.\nThe Application class for Spring Boot:\npackage com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } The Application class for Micronaut:\npackage com.example; import io.micronaut.runtime.Micronaut; public class MicronautApplication { public static void main(String[] args) { Micronaut.run(MicronautApplication.class, args); } } Also, the Spring and the Quarkus section on the POM is pretty clean: you have a build plugin, some basic dependencies, and it just runs. But the Micronaut section requires several advanced configurations, like Annotation Process Paths. Once you have them configured, you can forget about those. But it is obvious that MicroProfile is not the main focus on development for Micronaut if this is not configured by default.\nAs a summary of this section, Quarkus is very easy to start with, while Spring and Micronaut made me add extra source code specific for the framework.\n| Quarkus | Spring | Micronaut | | \ud83d\ude0a | \ud83d\ude35 | \ud83d\ude35 |\nLet&rsquo;s connect to a database The next step was to add some basic database entity I could use. The database definitions in MicroProfile are pretty self explanatory.\nWith @Entity we define a table with columns:\n@Entity public class Cat implements Serializable { @NotNull @Column(name = &#34;name&#34;, nullable = false) private String name; @Id @GeneratedValue private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } Then I need some kind of management class to run the queries. For simplicity, I made that class a @Singleton:\n@Singleton public class DatabaseResource { @PersistenceContext EntityManager entityManager; @Transactional public void addCat(String name) { Cat cat = new Cat(); cat.setName(name); entityManager.persist(cat); } @Transactional public List&lt;Cat&gt; getAllCats() { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery&lt;Cat&gt; cq = cb.createQuery(Cat.class); Root&lt;Cat&gt; rootEntry = cq.from(Cat.class); CriteriaQuery&lt;Cat&gt; all = cq.select(rootEntry); TypedQuery&lt;Cat&gt; allQuery = entityManager.createQuery(all); return allQuery.getResultList(); } And, of course, we need a web service to handle the cats:\n@Path(&#34;\/db&#34;) public class PersistenceService { @Inject DatabaseResource databaseResource; @GET \/\/For testing purposes @Path(&#34;\/cat\/{name}&#34;) @Produces(MediaType.TEXT_PLAIN) @Transactional public String addCat(@PathParam(&#34;name&#34;) String name) { databaseResource.addCat(name); return &#34;Cat added with name &#34; + name + &#34; via GET.&#34;; } @POST @Path(&#34;\/cat\/{name}&#34;) @Produces(MediaType.TEXT_PLAIN) @Transactional public String addCatPost(@PathParam(&#34;name&#34;) String name) { databaseResource.addCat(name); return &#34;Cat added with name &#34; + name; } @GET @Path(&#34;\/cats&#34;) @Produces(MediaType.APPLICATION_JSON) @Transactional public List&lt;Cat&gt; getCats() { return databaseResource.getAllCats(); } } All the database related source code is still part of Jakarta APIs, which are MicroProfile.\nMicronaut needs a specific annotation that can be placed on the MicronautApplication class, to know it has to process the @Entity class:\npackage com.example; import com.example.model.Cat; import io.micronaut.runtime.Micronaut; import io.micronaut.serde.annotation.SerdeImport; @SerdeImport(Cat.class) public class MicronautApplication { public static void main(String[] args) { Micronaut.run(MicronautApplication.class, args); } } On this section, both Quarkus and Micronaut could work pretty seamlessly. Micronaut needed some extra annotation in the application class we added before, to know it had to process the @Entity class. But besides that, the pure MicroProfile code was processed properly.\nSpring, on the other hand, had issues with what a @Singleton means. Which was pretty fixed by using one of the specific qualifiers from Spring:\n\/\/ Spring doesn&#39;t like singletones @Singleton @Named(&#34;dbResource&#34;) public class DatabaseResource { | Quarkus | Spring | Micronaut | | \ud83d\ude0a | \ud83d\ude35 | \ud83d\ude35 |\nConclusion Well, my experiment was a success. Although it was not a 100% success. Both Spring and Micronaut needed small adjustments on the code and the configuration to be able to run.\nBut nonetheless, MicroProfile appears to be the right way to develop in Java. The code is mostly the same in all MicroProfile frameworks, and developers should have no problem jumping from one to another. We can all read each others code and understand it. Which is not a minor thing. Each framework is implementing and experimenting on their own, but all efforts are going in the same common direction, keeping semantics and concepts common for all Java developers.\nAnd if you are a MicroProfile purist, you can rely on Quarkus.\nThis article was originally a talk I delivered in the JChampions Conference in which I did a bit of live coding.\n","permalink":"https:\/\/delawen.com\/2024\/07\/microprofile-and-the-chaos-incarnated-micro-quarkus-boot\/","summary":"<p>When you start a new project in Java, obviously you are not going to use only plain vanilla Java. You usually need some libraries or frameworks to help you: maybe to connect to a database, maybe to setup some web service.<\/p>\n<p>There are many of these libraries and frameworks that have been around our Java ecosystem for a long time. They have helped evolved the Java ecosystem for decades. These libraries experiment with features and how to implement them in the best way. That generated a knowledge base that the developers of the language can later use to add those same features in the best way possible to the core language.<\/p>","title":"MicroProfile and the chaos incarnated: Micro-Quarkus Boot!"},{"content":"En esta charla, presentaremos las \u00faltimas novedades en el lenguaje de programaci\u00f3n Java y su m\u00e1quina virtual, la JVM. Veremos c\u00f3mo el lenguaje ha ido evolucionando en sus \u00faltimas versiones, qu\u00e9 significa y cuales son las versiones LTS, qu\u00e9 es Adoptium, qu\u00e9 es GraalVM, y qu\u00e9 est\u00e1 pasando con el ecosistema Java, que est\u00e1 evolucionando a trav\u00e9s de Quarkus, Micronaut, y otros acercamientos m\u00e1s nativos.\nEsta charla es apta para toda persona que sepa ya lo que es un lenguaje de programaci\u00f3n, aunque no se haya especializado espec\u00edficamente en Java.\n","permalink":"https:\/\/delawen.com\/events\/2024-06-21\/","summary":"<p>En esta charla, presentaremos las \u00faltimas novedades en el lenguaje de programaci\u00f3n Java y su m\u00e1quina virtual, la JVM. Veremos c\u00f3mo el lenguaje ha ido evolucionando en sus \u00faltimas versiones, qu\u00e9 significa y cuales son las versiones LTS, qu\u00e9 es Adoptium, qu\u00e9 es GraalVM, y qu\u00e9 est\u00e1 pasando con el ecosistema Java, que est\u00e1 evolucionando a trav\u00e9s de Quarkus, Micronaut, y otros acercamientos m\u00e1s nativos.<\/p>\n<p>Esta charla es apta para toda persona que sepa ya lo que es un lenguaje de programaci\u00f3n, aunque no se haya especializado espec\u00edficamente en Java.<\/p>","title":"[OpenSouthCode] Java, el lenguaje que se reinventa"},{"content":"Here we are, creating a whole new project from scratch and no legacy hindering us. But wait, should I use Spring Boot, Quarkus, Micronaut,\u2026 What is happening in the Java ecosystem? What do I do?\nOn this talk we are going to create a (simple) app on those frameworks and compare pros and cons. We will build the native version, compare the source code and dependencies, and, probably, find out that the real treasure is the code we made along the way.\n","permalink":"https:\/\/delawen.com\/events\/2024-06-14\/","summary":"<p>Here we are, creating a whole new project from scratch and no legacy hindering us. But wait, should I use Spring Boot, Quarkus, Micronaut,\u2026 What is happening in the Java ecosystem? What do I do?<\/p>\n<p>On this talk we are going to create a (simple) app on those frameworks and compare pros and cons. We will build the native version, compare the source code and dependencies, and, probably, find out that the real treasure is the code we made along the way.<\/p>","title":"[DevBcn] Chaos Incarnated: Micro-Quarkus Boot"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2023-07-05\/","summary":"","title":"[DevBcn] Low Code, No Code, and Full Code Integrations"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2023-06-29\/","summary":"","title":"[DevNation] Kaoto: the low code and no code editor for Apache Camel"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2023-05-26\/","summary":"","title":"[Stage of Java] Bungee jumping to Quarkus, blindfolded but happy"},{"content":"Leaving aside complexities like the Enterprise Integration Patterns, we can consider most integrations as a form of advanced ETL: Extract, Transform, and Load. We extract data from a data store or service. Then we transform it from an input to an output format. And finally we push or load that transformed data into some output channel. It is the easiness to connect with the input and output channels what makes the ETL need a proper integration framework.\nComplex integrations will combine these three steps differently. But the outcome is always to move information from one place to another, connecting different systems. Where the information may be a full dataset or just a triggered event.\nI already tackled the issue of choosing the right integration tool from an engineer&rsquo;s perspective and what variables to take into account. But when we are talking about data science and data analysis, there is a requirement that goes on top of all of the previous: the accessibility and easiness of usage of the tool.\nZero-ETL Also called No-Code-ETL or Zero-Code-ETL, the Zero-ETL is the next generation integration paradigm in which users can perform ETL seamlessly. On the traditional way of performing ETL, you needed a developer that wrote the implementation, even if the code was a simplified language like the ones offered by Apache Camel. And then you needed someone to deploy it.\nWhile writing a workflow using a simplified language is a much easier task than having to write it from scratch in Python or Java, it requires certain skills and maintenance work afterwards.\nZero-ETL helps you focus on a Domain Driven Design approach. We switch the focus to the conceptual data you are going to use, and not the technicalities. Data will be moved from one system to the following without worrying about intermediate steps like transform, and cleaning. You will connect to those systems without really caring what technology lies behind them.\nZero-ETL is defined differently depending on who you ask. On summary, a Zero-ETL differentiates from classic ETL because the interaction between the different data warehouses and data lakes are transparent to the user. You can mix data coming from different sources without really worrying about where the data is coming from and what format it has.\nThe wonders of Data Mesh Some cloud platforms like Amazon and Google are selling basic Zero-ETL capabilities that transfer data in near real time from one of their services to another, sometimes also transforming the data transparently, like offering a no-SQL to a SQL translation.\nLet&rsquo;s forget for a moment that has been already possible with the proper tools in place for a long time. And focus on how they all conveniently forget that there is a whole universe outside their offerings; how they are trying to force a dependency to their platforms. They are on purpose ignoring the hybrid cloud, which is what most of us are working with. A cloud composed by several providers, different services, and protocols. A cloud in which a transparent, seamless integration would require providers talking the same language. Data Mesh across providers is a reality. And Zero-ETL provided by most cloud platforms is not covering that use case properly.\nIf you are a Data Driven organization, you already know that Data Science has gone through several trends in the past decades. We used to have a lot of fuzz about big data. Crowd sourcing. Interoperability. At some point we started talking about data warehouses, data lakes, data ponds, water gardens,&hellip;\nIs it possible to achieve a Zero-ETL in a hybrid cloud world?\nData Mesh across providers Once we change the perspective of how we view data data, we can make it closer to a product. It makes sense to store each data domain in their own data store and provider, the one that suits them most. Then, we will need to worry about how we are going to build our applications and services using that data. This paradigm usually comes with Event Driven architectures and data streams.\nSometimes we will have duplicated data in different formats and schemas to offer them in shapes more suitable for each domain. We have to carefully consider how and when to synchronize the different data storage to avoid inconsistencies.\nWith this change of perspective, there is also a switch on how we approach data mesh. Instead of seeing data as something that can be ingested into our software, now we also have data being served over common protocols. Protocols that need to be discovered easily. Instead of centralized pipelines that distribute data changes, we now publish events as streams.\nStaying ahead of the curve in Zero-ETL There&rsquo;s many ways to perform Zero-ETL without tying yourself to a specific provider. The easiest way is by using Free and Open Source Software in your software stack.\nProbably we will need to combine several clusters. But we will still want to use our hybrid cloud as one single cloud. We can trust Skupper to do the work for us, as shown on the following video.\nDistributed event streaming platforms like Kafka can offer us a decentralized solution for connecting different services and data. Shifting to federated data storage with event driven stream of changes requires careful synchronization that Kafka can help with.\nCamel K will help us deploy seamlessly and manage the integrations in a Kubernetes like cluster. Installed as an operator, it will deploy and monitor the middleware integrations needed for your specific use cases and make them serverless, if possible.\nThe user interface And last but not least, you need some low code or no code editor to build your ETL. That&rsquo;s what Kaoto is for. Kaoto is a multi-DSL flow editor. It allows you to create and deploy integrations in a visual way. Kaoto supports Apache Camel and works seamlessly with Camel K to deploy the workflows generated.\nFive step flow build with Kaoto. This is a no code editor that allows zero-etl.\nYou can test Kaoto using the official demo instance. This instance does not allow deployment, but lets users see how the design of flows works.\nWith all these pieces of software, you can build a strong stack for your data science and data analysis without generating any kind of dependency on particular providers.\nYour browser does not support the video tag. ","permalink":"https:\/\/delawen.com\/2023\/05\/zero-etl-with-foss\/","summary":"<p>Leaving aside complexities like the <a href=\"https:\/\/www.enterpriseintegrationpatterns.com\/\">Enterprise Integration Patterns<\/a>, we can consider most <a href=\"https:\/\/delawen.com\/2020\/10\/what-is-integration\/\">integrations<\/a> as a form of advanced <em>ETL: Extract, Transform, and Load<\/em>. We <em>extract<\/em> data from a data store or service. Then we <em>transform<\/em> it from an input to an output format. And finally we push or <em>load<\/em> that transformed data into some output channel. It is the easiness to connect with the input and output channels what makes the ETL need a proper integration framework.<\/p>\n<p>Complex integrations will combine these three steps differently. But the outcome is always to move information from one place to another, connecting different systems. Where the information may be a full dataset or just a triggered event.<\/p>\n<p>I already <a href=\"https:\/\/delawen.com\/2022\/05\/selecting-your-orchestration-conductor\/\">tackled the issue of choosing the right integration tool from an engineer&rsquo;s perspective<\/a> and what variables to take into account. But when we are talking about data science and data analysis, there is a requirement that goes on top of all of the previous: <strong>the accessibility and easiness of usage of the tool.<\/strong><\/p>\n","title":"Approaching Zero-ETL with FOSS"},{"content":"On this article we will explore how to do no code and low code integrations based on Apache Camel.\n&ldquo;Every paradigm including data flow, programming by example, and programming through analogies brings its own set of affordances and obstacles.&rdquo;\nAlexander Repenning - DOI reference number: 10.18293\/VLSS2017-010\nWe are going to use Kaoto, which just made its 1.0.0 release. On this release, the Kaoto team has focused on the no-code graphical canvas to make sure the user experience is as smooth as possible.\nYour browser does not support the video tag. Apache Camel As we have discussed previously on this blog, Apache Camel is an integration framework. This means Camel will help you orchestrate and compose your services in a decoupled way.\nCamel has its own Domain Specific Language (DSL) that translates a simple Camel route into code you can run.\nSimplified diagram on how Apache Camel works\nCamel Quarkus Whether we decide to write our camel routes in Java, Javascript, Groovy, YAML, XML,&hellip; In Camel they all get transpiled to Java code for deployment. While usually this is not a problem by itself, it is true that Java uses sometimes a bigger memory footprint that would be needed.\nBut we can overcome this with the Quarkus build for Apache Camel. Camel Quarkus looks exactly the same from the user or developer perspective. But it brings all the developer joy of native builds and deployments to the integration world. This is done with the Quarkus extensions on Apache Camel.\nSimplified diagram on how Apache Camel Quarkus works\nCamel K and Kamelets But Camel offers much more than just route integrations. We also have Kamelets that aim to simplify our integration definitions. These kamelets, or camel route snippets, act as meta-steps in an integration, hiding complexities in otherwise pretty simple orchestrations.\nWe also have Camel K to help in our integration management. It is a lightweight integration framework that runs natively on Kubernetes. It has been specifically designed for serverless and microservice architectures.\nSimplified diagram on how Apache Camel K works\nNo Code Integrations with Kaoto The issue of making integrations frameworks accessible and easy to use is not new. There was been many different approaches to the same problem.\nThis is where we decided to try a new approach and create Kaoto as a way of creating no code and low code integrations.\nThe obvious first step on this diagram for us was some kind of Visual Editor at the beginning of the previously defined workflows, that would allow people to integrate without writing a single line of code.\nSimplified diagram on how Kaoto works providing no code and low code integrations.\nThe primitives or building blocks of Kaoto are usually steps in the Apache Camel integration DSL: Kamelets, Camel Components, or Enterprise Integration Patterns.\nWe wanted Kaoto to have a simple user interface that provides building-blocks in a drag-and-drop style manipulation. But we wanted users to be able to manipulate the source code to be as transparent as possible about what they are building.\n&ldquo;Well, this is all fine and well, but the problem with visual programming languages is that you can&rsquo;t have more than 50 visual primitives on the screen at the same time. How are you going to write an operating system?&rdquo;\nPeter Deutsch\nWhat does Low Code look like? Low code allows the user to view and interact with the source code to deploy. At the same time, the user will be able to focus on the features being implemented without really knowing how to write the source code. The source code may look as an adjacent add-on or a guide to help new users get familiar with concepts.\nGood low code editors will also show some kind of visual aid to understand what the code is implementing. On our case, Kaoto has a visual workflow showing how the components get connected to each other.\nYour browser does not support the video tag. Example of low code integrations.\nOn the above example, the user starts by writing part of the code on an empty template. Once the user stops writing, Kaoto fills the gaps in the code to make it a valid source code. Also, the user can drag and drop on the graphical side to build the integration, while the source code gets updated with the changes.\nWhat does No Code look like? On a no code solution, there is no need to interact or even see the source code at any point. The user can focus on bringing integration capabilities to their architecture without worrying about implementation details.\nYour browser does not support the video tag. How to build an integration with no code\nYou can see on this video how the user can build the integration and deploy it just by using the graphical space. Drag and drop steps, select steps from a catalog, setup the configuration properties in a HTML forms and clicking the deploy button.\nYour browser does not support the video tag. You see full examples of how to use Kaoto in the workshop section you can test using any of the quickstart options.\n","permalink":"https:\/\/delawen.com\/2023\/04\/no-code-integrations\/","summary":"<p>On this article we will explore how to do no code and low code <a href=\"https:\/\/delawen.com\/2020\/10\/what-is-integration\/\">integrations<\/a> based on <a href=\"https:\/\/camel.apache.org\/\">Apache Camel<\/a>.<\/p>\n<blockquote>\n<p>&ldquo;Every paradigm including data flow, programming by example, and programming through analogies brings its own set of affordances and obstacles.&rdquo;<\/p>\n<p><a href=\"https:\/\/ksiresearchorg.ipage.com\/vlss\/journal\/VLSS2017\/vlss17paper_10.pdf\">Alexander Repenning<\/a> - DOI reference number: 10.18293\/VLSS2017-010<\/p>\n<\/blockquote>\n<p>We are going to use Kaoto, <a href=\"https:\/\/kaoto.io\/blog\/2023-04-13\/\">which just made its 1.0.0 release<\/a>. On this release, the Kaoto team has focused on the no-code graphical canvas to make sure the user experience is as smooth as possible.<\/p>\n","title":"No Code Integrations"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2023-03-21\/","summary":"","title":"[SVQJUG] Los gatos en Quarkus"},{"content":"After almost 20 years of being involved in the Free and Open Source Software (FOSS) community, and having gone through different associations and foundations, I would like to give my perspective on its sustainability. I have seen how companies get closer and further from FOSS as they evolve, and how different FOSS entities have overcome challenges.\nThis is not a light matter and the contents of this article are not only opinionated, but a mere scratch on the surface. My intention here is merely to try to open a debate I feel is stagnant.\nWhere does the software come from? Let&rsquo;s cover the basics before digging into the topic. Bear with me, it will take only a few paragraphs to become more interesting.\nWhy does a software project, whether a FOSS or restricted licensed project, survive in the long run? The answer is simple: because there are people investing time and\/or resources in it.\nIf those contributors only invest in the project in their free time, the bus factor(or lottery factor) is very high: that project is highly dependent on very specific individuals. If this group (usually small) of people contributing to the project decides to move on to another project, to stop contributing, or they just can&rsquo;t afford to contribute anymore; that project may disappear, affecting who knows how many other software projects.\nWe could try to rely on public resources and the good will of people to contribute on their free time to the common good which is FOSS. But let&rsquo;s be clear: we live in a capitalist society. This means, whatever is not sustained by capital, will have a difficult time to survive in the long run unless it is covered by some basic human right. And even then.\nWhether we like it or not, we live in a capitalist world in which if you don&rsquo;t have enough capital to back you up, you risk disappearing.\nSustainability is key to our stack When building software, we are not only interested in working in a sustainable project. We need to ensure the sustainability of all the ecosystem around our project (dependencies, frameworks, libraries, operative systems, drivers,&hellip;). If one of those layers in our software stack fails, our entire software stack may fail. We don&rsquo;t want to have to quickly replace some dependency because the random person that is maintaining it suddenly stopped.\nOur ideal paradigm would be an ecosystem in which all the software projects we depend on are maintained by a diverse funded group of people, where there is spread interest in that project to continue. We don&rsquo;t want to have a Heartbleed situation.\nWhich leads us to the first problem for project sustainability: whoever invests more time or resources in a project is who decides how the project evolves.\nWhere does the sustainability come from? Most of the software we use has one or more companies behind maintaining them. There are roughly four models in which a software company can get the resources to invest back in a project.\nTwo column diagram. Left Column: Investment Right Column: Profit Software Development &mdash;-sell&mdash;&gt; customer Software Development &mdash;-sell&mdash;&gt; customers Software Development &mdash;-I have the knowledge&mdash;&gt; Consultancy&mdash;offer support&mdash;&gt;customers Consultancy&mdash;offer support&mdash;&gt;customers\nCustom software development: The company develops a software specifically tailored for a single customer. They invest once and sell it once. This sale can be either giving an executable, giving the source code, offering it as a service,&hellip; An example would be a webpage built from scratch.\nDevelop once, sell many times: The company develops a more generic software which can be sold to multiple customers. One common example could be an application like Adobe Photoshop.\nDevelop once, sell services: The company develops a software that is customizable and allows space to different consultancy formulas. From selling technical support to adding extensions. This opens up the possibility to sell to even more customers that need a more specific solution. For example, SAP.\nExternalized development: The company doesn&rsquo;t develop any software at all. They build their business around a software created by a third party and focus on selling consultancy around that software. This company does not have intimate knowledge of the software they sell because they are not involved in its development. An example could be any of the companies (not Microsoft) that sells you support for your Windows.\nHow does FOSS fit here? Free and Open Source Software (FOSS) got into this paradigm with a lot of idealism and utopic dreams on how software could be made: Let&rsquo;s work all together contributing for the greater good, sharing experiences, source code, freedom,&hellip;\nRainbow colored kitten with a unicorn and butterfly wings.\nAnd all those promises of freedom kind of broke the way of selling software. Suddenly you were able to see the source code of others, modify it, redistribute it, and run it yourself.\nNow you can share costs, as shown on the following figure. You don&rsquo;t have to start from scratch to develop a software. There is a consortium of entities, companies, or individuals involved in the development of said software.\nThe business model of selling custom software almost disappears. Right now almost all software in the market is based on or depends on FOSS.\nNow, when you sell services around a software, even if you are not involved in the development of the software, you can still get knowledge on how that software works. You can have the knowledge expertise of the developer team without having to invest into development itself. The kind of services you can sell around a third party software improved.\nFOSS as the ultimate way of profiting This selling services model is what makes FOSS so attractive to companies. The cost of starting a new business is dramatically reduced. You can base your business in something someone else maintains, without the risk of that third party disappearing and voiding your company. Because the source code is out there and you will never lose it.\nAnd this is the business model that gets abused by malicious actors.\nAs now costs are shared, companies need to invest less to get the same profit, which attracts more business around FOSS. Slowly, people contributing to FOSS are no longer the idealists that want to contribute to the greater good. Now there are people that want to get profit but don&rsquo;t invest on FOSS. Because, why would they? The model works anyway. Their business works anyway. They can fill their pockets with money without having to invest into the software itself.\nAre all non-contributors so bad? Sometimes those non-contributors are an indirect force of good.\nImagine that you have a company in Europe, where all your customers are. And you maintain the software in collaboration with other companies spread around America and Europe.\nIf a company appears in, let&rsquo;s say, Australia, looking for customers there, is it so bad, even if they don&rsquo;t contribute? They are not &ldquo;stealing&rdquo; customers, those are customers you will never would have found anyway. They are expanding the market and reaching new niches. Maybe they didn&rsquo;t even said hello in your mailing lists. But your business will continue unaffected.\nWe can go further and say that, even if they don&rsquo;t contribute directly, maybe their customers will contribute. Writing articles about your software, creating tutorials, helping with translations, reporting bugs,&hellip; Or maybe as now there are a group of users of your software there, another company will start selling it and contribute back.\nWhat is the problem then? The main problem comes when the non-contributor is someone that can hurt your project sustainability. Maybe a big company, say for example Amazon, starts selling your product.\nAs they are a big company, they can offer your product lowering the prices below the cost of offering it, to dry competitors. The big company has the muscle to make a team of consultants appear out of nothing, with the expertise of having studied the available source code, and offering a wide range of services without having to invest in the project itself.\nThis is a big problem, because the companies that are contributing to the project now have less customers, meaning they can invest less in the sustainability of the project itself. They can&rsquo;t invest in new features as before, so the project becomes stagnant. There may be minor bugs accumulating because no one has the bandwidth to fix them. The project survival is at risk.\nAnd the worst thing is: this big company doesn&rsquo;t care if your project dies. They can fork it and continue with their legion of developers. Or they can just move to another similar project. No loss on their side, all gains.\nThe problem lies within The problem is not that one company in particular does this. Today it may be Amazon, yesterday it was Apple, tomorrow it may be Google. Who knows. If I sit down with Jeff Bezos and I tell him: &ldquo;Look, Jeff, pretty face, come here. Do you realize what you are doing? That you are killing this project by making it non sustainable? That you are hurting the common good? Please stop.&rdquo; He wouldn&rsquo;t care. Because it is profitable. And legal.\nThe problem is that in our society, in our economy, this kind of behavior is not only allowed, but incentivized. Exploiting a resource until you break it is profitable. And I may be able to convince Jeff to stop doing it. But there will be other companies that will take its place. Because it is profitable. What would be their motivation to stop doing it?\nThey don&rsquo;t understand why we do FOSS. The only thing they see is that we are a naive gratis workforce that is doing all the investment for them to get profit.\nWhat are we doing about it? This is nothing new. We have been dealing with this for decades already. And there are several approaches to try to solve this. I am going to mention the ones I have found more common.\nPost Open Source Software This became very famous when Github started. Many of the new repositories didn&rsquo;t have any kind of license attached at the time. Now there is a wizard on project creation to make you choose a license. But at the time, without any license attached, the source code uploaded had no explicit license. People wrongly believed that that was FOSS because it was published.\nSome people even published the software without license on purpose, as a way to rebel against people ignoring or workarounding FOSS licenses.\nLong story short: this is a legal nightmare that comes from the misconception that there are no default licenses and laws associated to your work. Depending on the country from where that code was created and the country from where you are trying to download and use it, the laws and restrictions over that software are different. Sometimes even contradictory. The code may be visible to everyone, but that&rsquo;s the only certain thing about it.\nA less extreme approach to these are the simpler licenses like the beerware, in which you can use the software however you want with the only condition that if you like it, and meet the developer in person, you have to invite them to a beer. Or the &ldquo;Do what the fuck you want with the software&rdquo;, which is literally that, do what the fuck you want with the software. A public domain in disguise.\nEthical Software Some people tried to remove neutrality to software licenses to force the users to do good. But, well, how do you define good? If you are too detailed, that may not be very useful. But if you are too broad, it may be difficult to enforce.\nSome licenses just copy the Human Rights Declaration as clauses. Which is something that any lawyer still can work around, but at least is an attempt. If you want to use that software, you must behave.\nOpen Core This is a middle ground between FOSS and restricted licensed software. You make the core of your software FOSS, anyone can use it. While you, as a company (or a consortium of companies), offer a lot of restricted licensed extensions that no one else has, which is what keep your users hooked up. This allows for some community grow around your project while preventing other companies to just sell the same thing you sell without contributing.\nBut what does prevent a big company, again, to take that free core and with its army of developers build a lot of extensions that make your own seem like toys? So while you focus on developing the core and your extensions, that company just focus on their extensions.\nMore strict licenses The GPL license forces any vendor to redistribute the source code if they modify and redistribute (sell) it. If you use a framework, library, any kind of dependency that is GPL, you have to publish it too as GPL.\nThis forces companies to share any kind of customization or enhancements that they do to the base software. They are forced to share and contribute somehow. Which can be workarounded too, because you are not forced to do a merge request to the original project, you can just fork it. But at least the source code will be in the open somewhere and someone can take it back to the original project.\nThe problem is that in a cloud world you no longer sell or redistribute the software. You offer it as a service. This means that you can have a GPL software modified and not make the code available because you are not distributing it, it stays on your server (or that&rsquo;s how some people claim it works). In a cloud world, GPL is just not enough.\nThat&rsquo;s why AGPL was created: if you offer something as a service, you have to make the source code available too. And not only your source code, but all the stack. Why? Because you can always wrap the source code around some other software that enhances it without having to modify the software itself.\nAnd this scared a lot of people away. The discussion if this is a legit fear or not could be another set of articles by itself.\nCommons Clause The software has a regular FOSS license with an extra clause: if you want to sell this software, you have to add something to it. Some feature, some customization. But just don&rsquo;t sell it as is. If you want to use it, you are completely free to do it. But selling? No, if you are profiting you have to develop something.\nThis drives away companies that are not interested in developing around the software, while you attract companies that are interested in developing and contributing. On the other hand, you are also driving away smaller companies and startups that may be contributing later, but need to build some business only based on services before they can afford to invest.\nDepending on how this commons clause is redacted, it can be a very good or a very bad idea. It may have exceptions to allow smaller companies to participate, but then we are again adding blur that lawyers can work around.\nCustomized licenses I don&rsquo;t like them much, because it requires a full team of lawyers to make sure you are not making a mistake. If a license like Apache took years and an army of lawyers to make it strong and reliable, why do you think your small team of company lawyers can do it better?\nThere are a wide variety of customized licenses.\nSometimes they explicitly restrict that only companies from a certain consortium can sell or use the software. If you want to sell it, contact us first and discuss the fee.\nThe main drawback here is that you are scaring away other companies that may be interested in contributing. You are limiting how your community grows. You are introducing a risk to potential business. Will companies trust the consortium of companies enough to build a business around it? What if my company gets too big and the rest of the consortium wants to push me away or make me pay more fees? What if I become too big and I want to push the rest of the companies away?\nSome other licenses just release the source code with some delay. The code you see in the repository or the code you can freely use may be two, three, four months old. This gives an advantage to the consortium of companies with access to the latest code over the companies that just take what is in the open.\nBut again, you are hurting potential contributors. What is the incentive to fix a bug or develop a new feature if the code I am working on may be too old and have conflicts with the latest source code? What if I am working on a bug fix that is already solved?\nA change of paradigm In the end, all these solutions are just a patch over the main issue here: our society is organized in a way that taking advantage of the common good is profitable.\nCan we change this paradigm? Can we de-incentivize the capital profit and focus on sustainability instead?\nDon&rsquo;t change the license, change the paradigm\nThere are attempts to change to a Economy for the Common Good, de-prioritizing capital and trying to focus in the common good. You may make a lot of money by contaminating a river with your chemical plant, but the consequences should make it not appealing to you. Or maybe we just need the Fully Automated Luxury Communism?\nTechnology and the Virtues I want to finish the article with some hope. I read a book called Technology and the Virtues, by Shannon Vallor. She explores the need to cultivate a technomoral virtue, based both in historical philosophy and current technology trends.\nThis may not be the final solution, but I like the approach of trying to change society from inside as the way to stop malicious actors. It is a long book, but as a very rough summary, there is a list of virtues suggested as a force to change society. Some of them may sound already familiar to you.\nHonesty Respect the truth. Avoid infoxication and fake news. Be transparent and respect other people&rsquo;s privacy. Don&rsquo;t misguide your customers when you tell them what you are selling. Don&rsquo;t hide important information.\nIf vendors were really honest about their restricted licenses, very few people would use anything that was exploiting the common good and making software less sustainable.\nSelf-Control Focus on what is really important and don&rsquo;t consume like crazy. Maybe it is time to stop buying to companies that hurt the common good. Or stop using software that uses dark patterns or hurt some groups of people. Leave social networks that allow violence against groups of people. Or, as a developer, restrain from working in companies that exploit resources or pollute.\nHumility We don&rsquo;t know everything and we should be cautious. That doesn&rsquo;t mean stopping innovation, but to think ahead how our decisions impact others. There are unforeseen consequences, like ai algorithms that become racist or collecting too much data that is later hacked.\nI am sure the person who invented blockchain didn&rsquo;t imagine how many scams would flourish around it and how much pollution mining those coins would make.\nJustice Don&rsquo;t do things just because you can, but because it is the right thing to do.\nBy the way, the moral of Jurassic Park is not this one, but &ldquo;pay your developers right&rdquo;.\nCourage Common good is the priority, even if that affects you negatively. This is a hard one to practice in our current world because you are sacrificing something you want in pursue of something that may or may not benefit others. If you are the only one making the sacrifice, it usually is very discouraging. We need everyone to do their part.\nEmpath y Wear someone else&rsquo;s shoes. Share feelings. We are humans, let&rsquo;s acknowledge we all have emotions and we all do things that can hurt others, even if we don&rsquo;t want to.\nCare Be emotionally vulnerable. We are all co-dependent of our environment and the people around us. And that goes both ways, they depend on us. You should care about the people around you the same way they should care about you. We have to help each other to not hurt and evolve to a better place.\nCivility Contribute to society, stop the evil actors, care about the common good. If you are planning on building something that is hurting your environment, don&rsquo;t.\nFlexibility We are all together in this. Be good with the good actors but firm with the bad actors.\nPerspective We are diverse, use everyone&rsquo;s perspectives when taking decisions. This is a worldwide effort so it should be adapted to everyone in the world. Consider that not all cultures have the same aspirations or the same definitions of good and bad. We need to act globally but not impose our culture over others.\nMagnanimity Practice humanly leadership. Aspire to utopia without falling into a Messiah&rsquo;s complex or a white savior complex.\nTechnomoral Widsom Practice these virtues always. Theory without practice is useless. And the more you practice them, the easier it will become.\nIn theory, if we apply these virtues regularly, not only on us but on the people around us, this will also change the paradigm around us and will make exploiting resources and destroying the common good something not desirable for anyone. Could this be our better chance?\nThis article was originally a presentation in Spanish I gave at SIGLibre 2021:\nYour browser does not support the video tag. ","permalink":"https:\/\/delawen.com\/2022\/11\/in-the-foss-trenches\/","summary":"<p>After almost <a href=\"\/woman-delawen\/\">20 years<\/a> of being involved in the Free and Open Source Software (FOSS) community, and having gone through different <a href=\"https:\/\/apache.org\/\">associations<\/a> and <a href=\"https:\/\/osgeo.org\">foundations<\/a>, I would like to give my perspective on its sustainability. I have seen how companies get closer and further from FOSS as they evolve, and how different FOSS entities have overcome challenges.<\/p>\n<p>This is not a light matter and the contents of this article are not only opinionated, but a mere scratch on the surface. My intention here is merely to try to open a debate I feel is stagnant.<\/p>","title":"In the FOSS trenches"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-11-07\/","summary":"","title":"[Faladoiros de Mancom\u00fan] Podcast Software Libre"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-08-24\/","summary":"","title":"[FOSS4G] Kaoto: Integrate your Architecture without coding"},{"content":"A year ago I started with a couple of friends a new project based on Quarkus to create a visual editor for integrations called Kaoto.\nAs responsible of the backend side, I obviously chose Java to do it. Coming from the Java 8 world with shy traces of Java 11, I decided to jump directly to Quarkus on Java 17 (unstable at the time) with Reactive and explore the serverless possibilities while, at the same time, keep the over-engineering and the over-fanciness of new features as reasonable as possible.\nOn this article I will discuss the good and the bad of this experience. I am not a Quarkus developer, I am a developer that used Quarkus. And as any average developer that starts with a new technology, I obviously skipped the documentation and just bungee jumped into the framework, blindfolded and without safe nets.\nSupersonic Subatomic Java The first thing I noticed is that Quarkus is incredibly fast. Running over GraalVM was already a great improvement over normal Java, but when compiled to native code, it was amazing. We could deploy our full application, with multiple endpoints, and warm up a cache of transformed data in just milliseconds.\nThe dependency management was also a very nice surprise. Those of you coming from the Spring world will find familiar the use of dependencies that are released officially with the framework. If you want to add authentication, you add the Spring authentication dependency. If you want to add database access, you add the Spring database dependencies. So your life is constrained but easy to manage.\nQuarkus does something similar but goes one step forward. It is still an opinionated set of libraries, but not restricted just to Quarkus libraries. You can choose different options on how you want to support your features. Do you want Hibernate? Use it. Do you want direct JDBC access? Also valid. All of them warranted to play nice in Quarkus.\nReactive Reactive support is also native to Quarkus. You can still use non reactive style of programming, but adding the proper libraries, Quarkus can gently push you and teach you how to do proper reactive code.\nReactive is nice but sometimes you need something that is not Reactive. For example, I needed an endpoint that would stream logs from a deployed integration. And Quarkus didn&rsquo;t like it:\nWARNING [io.ver.cor.imp.BlockedThreadChecker] (vertx-blocked-thread-checker) Thread Thread[vert.x-eventloop-thread-10,5,main]=Thread[vert.x-eventloop-thread-10,5,main] has been blocked for 4827 ms, time limit is 2000 ms: io.vertx.core.VertxException: Thread blocked In reactive mode, there is one main thread that handles most of the code. The moment you need to do a blocking operation or you want to run a long process, you need to explicitly tell Quarkus this is a blocking operation with the proper annotation:\n@NoCache @Path(&#34;\/{name}\/logs&#34;) @Produces(MediaType.TEXT_PLAIN) @GET @Operation(summary = &#34;Get logs&#34;, description = &#34;Get the resource&#39;s log.&#34;) @Blocking public Multi&lt;String&gt; logs( final @Parameter(description = &#34;Name of the resource &#34; + &#34;of which logs should be retrieved.&#34;) @PathParam(&#34;name&#34;) String name, final @Parameter(description = &#34;Namespace of the cluster &#34; + &#34;where the resource is running.&#34;) @QueryParam(&#34;namespace&#34;) String namespace, final @Parameter(description = &#34;Number of last N lines to be &#34; + &#34;retrieved.&#34;) @QueryParam(&#34;lines&#34;) int lines) { return clusterService.streamlogs(namespace, name, lines); } Developer Joy There are many joys developing Quarkus, but the most gratifying feature is the live coding. You can keep your code running while coding and it will automatically refresh the running code so you can hot-test your new code on the fly. You can also run tests hot while you are developing. While this may seem like a nice but optional feature, once you get used to it you only can wonder how did life happened before it.\nQuarkus also pushes you softly and gently into using very great design patterns. They are not enforced, but if you decide not to use them, that&rsquo;s usually a bad engineering decision.\nWhile running on dev mode, you also have the dev console dashboard.\nQuarkus developer console.\nThis dashboard contains very useful information. Each dependency you add can choose to have their own slot here to show relevant running data. It also allows you to edit and change the configuration on the fly.\nLet&rsquo;s start then! Starting with Quarkus is too easy. You go to https:\/\/code.quarkus.io\/, select the dependencies you are going to use, download a zip, and voil\u00e0, you have your maven project ready to use.\nOnce my hello world was running I took things into my dirty hands and split my maven project into a multi maven project. Copied-pasted the folder several times, change name, generate parent pom.xml,&hellip; And it worked! Nice. Looks good.\nMulti Module Projects Now I tried the compilation in native mode and&hellip; my dependencies were not found. I was confused for a while, why did it fail on native mode but worked on Java mode? Why were my dependencies not working?\nYour browser does not support the video tag. Well&hellip; there is a very simple explanation. Native mode was run on all the maven modules. In native mode, Quarkus do a lot of cleanup of the source code assuming you are in a closed world. That means you will know everything you need to know at build time. If a class is not explicitly called, it gets removed. If a part of the code is never reached, it gets removed. This makes the application smaller and faster, but it forbids dynamic things like Reflection.\n&lt;profiles&gt; &lt;profile&gt; &lt;id&gt;native&lt;\/id&gt; &lt;activation&gt; &lt;property&gt; &lt;name&gt;native&lt;\/name&gt; &lt;\/property&gt; &lt;\/activation&gt; &lt;properties&gt; &lt;quarkus.package.type&gt;native&lt;\/quarkus.package.type&gt; &lt;\/properties&gt; &lt;\/profile&gt; &lt;\/profiles&gt; I learned that native mode only goes on the last project of the chain. That&rsquo;s the one that is going to remove useless classes, optimize code, and forget about unused functions. If you add the native mode profile on all your dependencies, the classes will be removed before they reach the final project.\nWhere are my beans? But then again, I was missing beans only in native mode. If I defined a bean in a module and tried to inject it in another module, the second module had no idea my bean existed. Even if it was properly injected somewhere when in its original module.\nThere is a long explanation on why this happens. If you are only interested in the solution, just know you need to generate a Jandex index in each of your modules. These indexes list all the beans available. You can generate the indexes with a maven plugin you must add to all your projects (or your parent pom.xml):\n&lt;plugin&gt; &lt;groupid&gt;org.jboss.jandex&lt;\/groupid&gt; &lt;artifactid&gt;jandex-maven-plugin&lt;\/artifactid&gt; &lt;version&gt;1.2.1&lt;\/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;make-index&lt;\/id&gt; &lt;goals&gt; &lt;goal&gt;jandex&lt;\/goal&gt; &lt;\/goals&gt; &lt;\/execution&gt; &lt;\/executions&gt; &lt;\/plugin&gt; Context Dependency Injections and Bean discovery in Quarkus Wait, we are talking about bean injection. I forgot to mention that Quarkus does have a built-in CDI.\nAnd I have good news for you: Quarkus is following the Jakarta Context and Dependency Injection (version 2.0). If you decide later to move to another framework that uses the same standard, the annotations will be already valid and you won&rsquo;t have to modify them.\nQuarkus also has classic functionality like @PostConstruct to run a function right after bean creation, @PreDestroy to cleanup resources before delete the bean, or @Counted that runs every time a bean is invoked.\n@ApplicationScoped public class ClusterService { @Inject MyOtherBean beanybeany; @Counted String translate(String sentence) { System.out.println(&#34;Interceptor binding annotation from MicroProfile&#34;); } @PostConstruct void init() { System.out.println(&#34;Hello there!&#34;); } @PreDestroy void init() { System.out.println(&#34;My revenge will be terrible.&#34;); }} There&rsquo;s also different types of beans: @ApplicationScoped, @Singleton, @RequestScoped, @Dependent, and @SessionScoped. These annotations allow you to have more control over when are beans created and destroyed.\nThe @Startup annotation mark the bean to be initialized at startup, even if no one is asking for it yet. That was very helpful for us to warm up the caches of data. As Quarkus analyzes the code thoroughly on build time, you can also simplify all the setters of beans in one single function:\n@Startup @ApplicationScoped public class StepCatalog extends AbstractCatalog { private Instance&lt;StepCatalogParser&gt; stepCatalogParsers; @Inject public void setStepCatalogParsers( final Instance&lt;StepCatalogParser&gt; stepCatalogParsers) { this.stepCatalogParsers = stepCatalogParsers; } @Inject void multipleBeans(OneBean one, AnotherBean another) { this.one = one; this.another = another; } } And as shown above, you can inject a list of beans using the Instance class, which extends Iterable.\nAll the injections are resolved on build time, which means exactly one bean must be assignable to an injection point. Otherwise, the build fails, because there is nothing on runtime that can change which bean to assign where.\nNot all Quarkus is rainbows and sunshine Quarkus is a fancy State of the Art framework. This is good, because you are using the latest knowledge available to humanity to build your apps. Until you need to do something that is not yet implemented.\nKeep your Quarkus updated After every release Quarkus is more and more extensive and mature, and I would guess that 90% of use cases are already covered. But sometimes things are not ready yet.\nThat happened to me. I was using a nested class inside my configuration object. This was no big deal on normal Java, but on native mode, Quarkus was discarding the class during build time.\nThe good thing when this happens (on any FOSS project) is that you can talk directly to developers and work together solving the issue. If you contribute actively in the resolution of the issue, you may even shape that feature so it does exactly what you need, which is always nice for your future self.\nConversation in Quarkus chat with a developer that fixed my issue in less than a day.\nBut again, don&rsquo;t be me and remember to keep your Quarkus updated. Don&rsquo;t help fix something on February and forget to upgrade your dependencies by July.\nBecause in the frontier of Development, you sometimes forget you already fixed something.\nAnd upgrading Quarkus is shamefully easy, you usually just need to update a number on your pom.xml file.\n&lt;!-- Quarkus version --&gt; &lt;quarkus.platform.artifact-id&gt;quarkus-universe-bom&lt;\/quarkus.platform.artifact-id&gt; &lt;quarkus.platform.group-id&gt;io.quarkus&lt;\/quarkus.platform.group-id&gt; &lt;quarkus.platform.version&gt;2.10.2.Final&lt;\/quarkus.platform.version&gt; &lt;quarkus-plugin.version&gt;${quarkus.platform.version}&lt;\/quarkus-plugin.version&gt; Polymorphic unmarshalling Kaoto is very dynamic and needs to adapt to multiple DSL. This required several endpoints to be able to work with interfaces and deserialize objects not knowing beforehand which object is coming from the endpoint request. This is called polymorphic deserialization: a weird feature of Jackson that fascinates me.\nIn theory, you make the endpoint receive an interface instead of a class. And then add classes to your source code with a special annotation marking that class as a subtype of the interface. Jackson will know which class to deserialize automatically when the request enters the endpoint.\nBut again I reached Quarkus State of the Art and fell into the other side. This worked on Java mode, but not on native mode. So I had to forget about adding decoupled classes to my source code and did explicitly tell Jackson where and when to deserialize what:\n@JsonSubTypes({ @JsonSubTypes.Type(value = Patata.class, name = &#34;patata&#34;), @JsonSubTypes.Type(value = Poteito.class, name = &#34;potato&#34;)}) \/\/This is a workaround utility class until Quarkus supports fully polymorphism @JsonbTypeDeserializer(MyObjectDeserializer.class) public abstract class MyObject implements Cloneable { ... } And I had to add an annotation @RegisterForReflection to my deserializer because as it was not explicitly called anywhere in the code, Quarkus just assumed it was unused code.\n@RegisterForReflection public class MyObjectDeserializer implements JsonbDeserializer { private static final Jsonb JSONB = JsonbBuilder.create(); @Override public MyObject deserialize(final JsonParser parser, final DeserializationContext context, final Type rtType) { String type = parser.getObject().toString().getString(&#34;type&#34;); switch (type) { case &#34;patata&#34;: ... } } Anyway, that worked, so even when I fell to the other side of the State of the Art and found myself in unimplemented features, I was able to work around it. Because even if there are unimplemented features, they are weird and work-aroundeables. You can probably live without them.\nQuarkus Tests joy When you are implementing services with the rest-easy Quarkus dependency, tests are quick and nice. With the @TestHTTPEndpoint annotation you can point to the resource you want to test and it will automatically generate the proper base path on the calls.\n@QuarkusTest @TestHTTPEndpoint(IntegrationResource.class) class IntegrationResourceTest { @Test void thereAndBackAgain() throws URISyntaxException, IOException { var res = given() .when() .contentType(&#34;application\/json&#34;) .body(Collections.emptyList()) .post(&#34;\/dsls&#34;) .then() .statusCode(Response.Status.OK.getStatusCode()); List&lt;String&gt; dsls = mapper.readValue(res.extract().body().asString(), List.class); assertFalse(dsls.isEmpty()); } } If we later move the path of that endpoint resource, the test will be ready for it, no changes needed.\nDon&rsquo;t forget to run tests on native mode too, just in case!\nSmart TestContainers If you are familiar with test containers, you are gonna love this. Quarkus have an automatic provisioning of unconfigured services. Databases, Messaging,&hellip; you just add a configuration on a properties file and the test containers are configured and run out of the box.\nAnd if you need a Kubernetes cluster, you can use the fabric8 dependency and the @WithKubernetesTestServer annotation to create a cluster only for tests.\n@WithKubernetesTestServer @QuarkusTest class ClusterServiceTest { @Inject public void setKubernetesClient(final KubernetesClient kubernetesClient){ this.kubernetesClient = kubernetesClient; } private KubernetesClient kubernetesClient; } Final Word I like the experience of working with Quarkus and I don&rsquo;t intend to move away any time soon. If you are doubting if you should or shouldn&rsquo;t use Quarkus, just try it a bit. I am sure you will be greatly surprised. In a good way.\nThis article was originally a talk I delivered on JBCNConf 2022.\n","permalink":"https:\/\/delawen.com\/2022\/07\/bungee-jumping-into-quarkus\/","summary":"<p>A year ago I started with a couple of friends a <a href=\"https:\/\/delawen.com\/2022\/04\/kaoto-integrate-without-limits\/\">new project<\/a> based on <strong><a href=\"https:\/\/quarkus.io\">Quarkus<\/a><\/strong> to create a <a href=\"https:\/\/kaoto.io\">visual editor for integrations<\/a> called Kaoto.<\/p>\n<p>As responsible of the backend side, I obviously chose Java to do it. Coming from the Java 8 world with shy traces of Java 11, I decided to jump directly to Quarkus on Java 17 (unstable at the time) with Reactive and explore the serverless possibilities while, at the same time, keep the over-engineering and the over-fanciness of new features as reasonable as possible.<\/p>\n<p>On this article I will discuss the good and the bad of this experience. I am not a Quarkus developer, I am a developer that used Quarkus. And as any average developer that starts with a new technology, I obviously skipped the documentation and just bungee jumped into the framework, blindfolded and without safe nets.<\/p>\n","title":"Bungee jumping into Quarkus: blindfolded but happy"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-07-18\/","summary":"","title":"[JBCNConf] Bungee jumping with Quarkus. Blindfolded but happy"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-06-08\/","summary":"","title":"[SIGLibre] Keynote"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-05-27\/","summary":"","title":"[Java Day Istanbul] Clean Architecture Orchestration over Apache Camel"},{"content":"When we are integrating different components and services in our software architecture, the first step is to select a good orchestration framework. On this opinionated article I will present my criteria to decide which is the right framework.\nRiding the Enterprise Service Bus As you compose services, you will notice the need for an Enterprise Service Bus to communicate with each other. But an EBS can be useless if you don&rsquo;t have good ETL (extract, transform, load) tools along with it to manipulate our data. The same way that an ETL without a proper routing system can leave us orphaned.\nWe need to route messages and events and at the same time make sure data transformations take place so different endpoints with varied protocols and formats can interact with each other. That&rsquo;s where integration frameworks come in.\nThe Enterprise Integration Patterns can help developers on both tasks: by providing data transformations between outputs and inputs and offering different routing strategies.\nOrchestration Functionality Our framework should be able to support not only the Enterprise Integration Patterns, but also a wide range of protocols and data formats.\nUsability Easiness of use, specially if we have complex use cases to maintain, is relevant to keep our architecture clean. This usability should never be in detriment of the functionality or the extensibility of the framework. We want our framework to interact with a varied range of components and services.\nSacrificing features in favor of user experience will make you hit faster the ceiling of what you can do.\nMultiple Orchestration Languages Related to the easiness of use is the language we need to use to build the integration routes. We don&rsquo;t want to be tied to a specific language like Java or Python. There are frameworks that allow you to build the integration route in different languages.\nWhen our orchestration builders come from different backgrounds, or are not very tech savvy, being able to integrate on different languages may come in handy. We want them to feel comfortable in whatever language they need to orchestrate.\nTutorials and documentation It was never the case when good usability made up for a bad documentation. We need tutorials, manuals, helpers,&hellip; Both for users and developers. And of course, we will want to have some reference to fall back when something doesn&rsquo;t work as expected and we need to find why.\nCustomization Sometimes we need to use some data format or connect to some service not currently supported by the framework. Whether if we do it ourselves or hire someone to do it, can the existing functionality be extended to support them?\nDependencies size We don&rsquo;t want to drag a heavy dependency to our architecture. But not only smaller in size, we also want a framework that will use a light footprint over our hardware, while at the same time, it doesn&rsquo;t drag our performance.\nA smaller dependency usually means less source code that can introduce bugs to your software too.\nTechnical Support Maybe we don&rsquo;t need help, but what if we have a problem? Can we hire someone for technical support? Are there developers to hire to implement our custom features?\nHaving a wide range of companies offering services around our framework will greatly improve our experience in the long run.\nLicense It doesn&rsquo;t matter how many companies are supporting the framework if the license is restricted. Only a software with a FOSS license will warrant you will not be tied to the whims or misfortunes of any external force or private company.\nIf you have been following me, this will not come as a surprise. You know I already have a preferred choice that scores high on all these criteria: Apache Camel.\n","permalink":"https:\/\/delawen.com\/2022\/05\/selecting-your-orchestration-conductor\/","summary":"<p>When we are <a href=\"https:\/\/delawen.com\/2020\/10\/what-is-integration\/\">integrating<\/a> different components and services in our software architecture, the first step is to select a good orchestration framework. On this opinionated article I will present my criteria to decide which is the right framework.<\/p>\n<h2 id=\"riding-the-enterprise-service-bus\">Riding the Enterprise Service Bus<\/h2>\n<p>As you compose services, you will notice the need for an Enterprise Service Bus to communicate with each other. But an EBS can be useless if you don&rsquo;t have good ETL (extract, transform, load) tools along with it to manipulate our data. The same way that an ETL without a proper routing system can leave us orphaned.<\/p>\n<p>We need to route messages and events and at the same time make sure data transformations take place so different endpoints with varied protocols and formats can interact with each other. That&rsquo;s where integration frameworks come in.<\/p>\n<p>The <a href=\"https:\/\/www.enterpriseintegrationpatterns.com\/\">Enterprise Integration Patterns<\/a> can help developers on both tasks: by providing data transformations between outputs and inputs and offering different routing strategies.<\/p>\n","title":"Selecting your orchestration conductor"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-05-10\/","summary":"","title":"[OpenShift Commons] Integrations using Apache Camel and Apache Kafka in OpenShift"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2022-04-29\/","summary":"","title":"[Guillena Digital] I jornada de motivaci\u00f3n de profesiones STEM Guillena"},{"content":"I would like to present you with an ETL and integration editor Rachel and I have been working on for the past year with the initial help of Zineb: Kaoto.\nWhat is Kaoto? Kaoto is an integration editor to create and deploy integrations in a low-code way and no-code way based on Apache Camel. It combines a source code editor and a drag and drop graphical space synchronized with each other. It can be run both as standalone and as a service (SaaS).\nWith the no-code mode, the user can build the entire integration orchestration with the drag and drop function. Kaoto has a step catalog with a list of all available building blocks that the users may want to transform data or integrate with services.\nThe source code will be available for users curious to know what they are going to deploy. But in no case they have to understand or even see that code.\nYour browser does not support the video tag. Example of building block drag and drop\nWith the low code mode, users can learn how to create integrations and, at the same time, control what they are deploying. They can use both the drag and drop and the source code editor, that will autocomplete what the user won&rsquo;t or don&rsquo;t know how to write. Meanwhile the graphical space will show the integration being built and the drag and drop will still be available for them to complete or accelerate the development.\nYour browser does not support the video tag. Example of low code integrations.\nKaoto can help users start with Apache Camel and slowly build their knowledge. All the source code generated is clean and viewable in any IDE.\nCustomizing Kaoto Each building block type can have its own microfrontend. This is useful when you add your own building blocks to your Kaoto instance. But it can also help adapt Kaoto to different kinds of users, hiding or extending certain details important for each use-case. Extensions can be manuals and helpers for Kaoto.\nWhen used as a service, the extensions and the list of available building blocks are settings that can be stored in the cloud. Therefore, administrator users can modify this configuration, which will refresh live in the users playgrounds. In addition, as this configuration can be in the cloud, different users can share the configuration. This can help organizations accommodate different groups of users, offering different configurations depending on the profile.\nWhat is on the roadmap? We started the development focused on Kamelet Bindings, but we soon realized we could add more languages. Edition of Apache Camel routes (in yaml form) and Kamelet definitions are next in development queue. We are also working on translating from other integration languages to Camel DSL. This can help users migrate to Apache Camel.\nWe will soon have one-click support for cloud-native Apache Camel deployments via Camel-K. Matej is close to having an operator for Kubernetes clusters which will simplify even more the installation of Kaoto in the cloud.\nYou can quickly test it via docker as described on the quickstart. Make sure your docker images have access to internet to be able to access the default remote configuration!\nYou can find more information on the webpage of the project.\n","permalink":"https:\/\/delawen.com\/2022\/04\/kaoto-integrate-without-limits\/","summary":"<p>I would like to present you with an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Extract,_transform,_load\">ETL<\/a> and <a href=\"https:\/\/delawen.com\/2020\/10\/what-is-integration\/\">integration<\/a> editor <a href=\"https:\/\/twitter.com\/nerdycode\">Rachel<\/a> and I have been working on for the past year with the initial help of <a href=\"https:\/\/twitter.com\/ZinebBendhiba\">Zineb<\/a>: <strong>Kaoto<\/strong>.<\/p>\n<h2 id=\"what-is-kaoto\">What is Kaoto?<\/h2>\n<p>Kaoto is an <strong>integration editor<\/strong> to create and deploy integrations in a low-code way and no-code way based on Apache Camel. It combines a source code editor and a drag and drop graphical space synchronized with each other. It can be run both as standalone and as a service (SaaS).<\/p>\n<p>With the no-code mode, the user can build the entire integration orchestration with the drag and drop function. Kaoto has a step catalog with a list of all available building blocks that the users may want to transform data or integrate with services.<\/p>\n","title":"Kaoto: Integrate without limits"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-08-09\/","summary":"","title":"[Podcast Linux] Linux Connexion"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-05-24\/","summary":"","title":"[Spain Clouds Summit] Integrando Flujos de Datos"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-05-18\/","summary":"","title":"[Bucharest Summits] How camel breeding can help you in IoT"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-05-10\/","summary":"","title":"[Developer Week] Data flowing the easy way"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-04-28\/","summary":"","title":"[Developer Week] Integrations using Apache Camel and Apache Kafka in OpenShif"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-04-24\/","summary":"","title":"[FLISoL Tenerife] Ensillando Apache Camel para integrar componentes"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-04-14\/","summary":"","title":"[OpenDevHour] Why is this cat lady breeding camels?"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2021-03-08\/","summary":"","title":"[TechKNowDay] Data Flowing the Easy Way"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-12-17\/","summary":"","title":"[LaretasGeek] Panel"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-11-26\/","summary":"","title":"[CodeOp.tech] Integration Processes for Serverless Hybrid Cloud"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-11-25\/","summary":"","title":"[ManComun] Podcast Interview"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-11-13\/","summary":"","title":"[EEO-AGIM Seminar] Integration Processes for Serverless Hybrid Cloud"},{"content":"Some of you may know I am going to co-chair the next FOSS4G. ( Come Hell or High Water, but we are going to have a FOSS4G next year!) I have also participated on the organization of the last ApacheCON and some other minor online events. I have also spoken on many online events by now.\nAnd, let me tell you, I am not as optimistic as those people. I really hope this post ages badly and in the following years we get better options for online events.\nBut as of today, I don&rsquo;t feel we are anywhere close to replace face to face events with online ones. Delivering the talks as streaming is something good but we will be losing most of what makes a conference an amazing experience.\nLet me tell you why.\nOnline Events Drawbacks Online events allow people from all over the world to attend without having to travel. People with hard conciliation and people that can&rsquo;t afford or are not able to travel will be on your event. It&rsquo;s true, you will get attendees you wouldn&rsquo;t have if it was a face to face event. And that&rsquo;s good!\nBut that&rsquo;s where the advantages of an online event end. And where a lot of new issues are created.\nTimezones Have you ever tried to find a good time slot for a simple one hour meeting between an Australian and someone living in Los Angeles? Exactly.\nNow imagine allocating at least six good hours for streaming and interactions and trying to have at least everybody awake, no matter if it is early or late. Spoiler: you can&rsquo;t.\nOf course you can always find some arbitrary schedule that fits your biggest group of potential attendees and force the rest of your attendees adapt to it. Just make them imagine they are traveling and live on a different timezone, waking up at 3am to watch your talks, having lunch instead of breakfast and sleeping during the day. Seriously: is your event worth it?\nDo you remember those people that couldn&rsquo;t travel to your face to face event but can attend your online event? A good percentage of them will not attend your online event if it doesn&rsquo;t fit their timezone. It doesn&rsquo;t matter if they have the means to do it.\nHacking timezones Of course, there are patches for this. Like having a 24\/7 event so at all times there&rsquo;s something happening for the people that are awake at that time. Which, in summary, just means having like separated events that overlap a bit between regions of the world. You will end up interacting mostly with people on your time zone region.\nSome events are replaying their talks at different time zones so everyone has the opportunity to attend all sessions. But what&rsquo;s the fun of watching some past talk, when even the speaker is no longer available for questions? I can watch it next month and it will be the same.\nBandwidth I just mentioned those people that couldn&rsquo;t travel to your face to face event but can attend your online event. If only that was as truthful as it sounds.\nNot everyone has a good internet connection at home. We can even say not everyone has an internet connection at hand to watch and participate on your event. Thinking otherwise just shows your privilege and how you forget not everyone has access to a good and stable bandwidth. Specially at home.\nFor some people it is easier to travel to your face to face event than to get a good bandwidth to watch the streamed talks.\nSo this group of people that wouldn&rsquo;t travel to your event but would attend your online event just keep shrinking. Your real potential attendees are those in the right time zone and the right technological requirements.\nShadow Audience on Online Events This one is for speakers. There&rsquo;s no way your talk will be the same if you can&rsquo;t see, hear and feel the audience as in face to face. Online events, no matter if the audience has their cameras on, are isolating. It is never the same.\nNot having feedback on how well your talk is being received (or even worse: seeing a lot of cameras of distracted attendees doing something else) is a huge handicap that even the most experienced speaker will suffer. Not knowing if you should speed up or slow down to adapt to your audience is weird. Not knowing if your audience is laughing at your jokes or thinking you are a weirdo.\nAnd probably your speakers are not familiar with your platform, which means they will be extra nervous of messing up. If the mic fails on a room full of people, you notice immediately and you can even just talk louder while it gets fixed. If the mic fails on an online event, you may not even notice until several minutes have already passed.\nAll these issues lead to talks not as good as those made face to face.\nDisengagement Let&rsquo;s be fair: attendees will not be physically disconnected from their daily routines as they are when traveling to your event. Most of them will keep going to work, passing time with their families and even skipping some talks to do house work. These changes of context means losing attention.\nYour event is just the side dish of their day to day, an extra appendix. They will never be as engaged as if they had to travel to a venue and be there physically.\nLanguage Barrier on Online Events I know, I know what you are thinking. No, Mar\u00eda, this problem is the same, no matter if you are face to face or online. Let me guess: you are an English native speaker.\nEven when having reliable broadband and enjoying high quality smooth 60fps video, understanding a foreign speaker over video is harder than in person. Maybe because the audience is shadowed and the speaker has no feedback on how well it is being received. Or maybe it is just because we speak differently face to face than online. Maybe we are missing corporal language. But it happens.\nThis could be fixed with subtitles on most cases. But, what kind of subtitles? The ones that run on the fly and so frequently confuse technical terms making the subtitle confusing? Or the ones that are attached to a pre-recorded video so the speaker is not really there?\nNo random meetings As you don&rsquo;t have to move from one room to the next, sit next to someone on a room or even mingle during the coffee breaks, you just lose all those opportunities to meet both friends and strangers.\nYour event will be missing a space where attendees can meet more or less randomly. Some events are matching random attendees on private rooms or have general room halls for random chatting. And that&rsquo;s a good idea, but still, it doesn&rsquo;t replace introducing yourself to someone specific you feel is a good match when you see that person talking to someone you know or having a break and being open to engage in conversation.\nDo you want to have an Ice Breaker or a Gala Dinner? Maybe you can try Mozilla hub for that. Too over complicated? High hardware requirements? But what other social platforms could be there that go beyond a chat and are not a simple video conference? How can we mimic this walking over the venue and saying hi to old friends or asking someone about their shirt drawing?\nFinancial Side Contrary to popular belief, if you really want to have an online event that can compete with a face to face event, the cost will not be cheap. The proper software stack with the proper bandwidth can be as costly as the venue. And whatever you may be saving on catering you will spend in making the event more social and engaging.\nIt&rsquo;s true that a basic online event can be done very cheaply, as I demonstrate on the next section. But still, it will be a cheap event and will not patch many of the social drawbacks exposed.\nIf you want to make the conference online, you have to work towards more lines of economic viability than in traditional face to face events. Because there are many things you can&rsquo;t offer now (being the merchandise placement the most obvious one).\nSponsorship of Online Events Obviously you will try to keep sponsors on board. But it would be insane to think sponsors will be willing to pay the same prices as in traditional events if you don&rsquo;t offer anything above and beyond.\nIf your conference has some kind of sponsorship booth area, you need some kind of replacement. How do you plan to do that? And how are you going to make attendees go through it? Now you don&rsquo;t have halls where the booths are showing fancy stuff.\nIf you host some kind of Business to Business slot, are you just going to run it as a normal online video session? How are you going to help them interact?\nTickets Most face to face events reconverted to online events are &ldquo;in panic&rdquo; offering free tickets, which will make it difficult for any online event to sell tickets at a reasonable price in the near future.\nTo make sure people would want to pay for your specific event, you must prepare some extras besides the streaming. You have to offer some kind of exclusive content to paid attendees besides the basic chats on the streamings to make sure the ticket price is worth it.\nMaybe promote more panels where only paid users can participate and ask questions? Adding prizes or badges to users that participate more or attend more sessions?\nSome events are offering open price donation tickets. Which means, you can have the ticket for the price you deem it worth. I have seen (from the inside) a number of events doing this. I won&rsquo;t share actual numbers but trust me: don&rsquo;t count with this money.\nGoodies Have you thought of an online shop to sell goodies branded as the conference? Difficult to estimate if this will work if you haven&rsquo;t sell goodies before, but tech conference attendees are well known for collecting branded shirts. This is worth a try.\nDare Donations This was an idea that popped out watching the Games Done Quick events. They keep people engaged and donating money through a whole week. They propose \u201cdares\u201d and people donate to vote what to do. You have to find something that make attendees engage and control somehow the type of content they are going to see.\nFor example: If between 9:00 and 10:00 we get a minimum amount in donations, then some speaker will run a live demo on their presentation instead of a video. Or vote with donations what question to ask on a panel. Maybe even choose between two different talks.\nThis works awesomely well on the GDC but the GDC is a fun event with no consequence and that&rsquo;s not the tone with most tech conferences. I have no way to estimate if this will work on our case. It may work if you choose the right \u201cdares\u201d and speakers are willing to collaborate.\nProbably easier on FOSS conferences, where the camaraderie is a common denominator. Weirder in other types of conferences, specially academic ones.\nSoftware Stack of Online Events There are many valid software stacks to use for your online events. Here is a summary of what I have experimented with and what I am comfortable with.\nLet&rsquo;s start with a basic stack that covers minimum functionality for a cheap price and then proceed to more wholesome solutions.\nThe Basic Stack This is the basic stack I have found that covers the minimum needed to offer a proper online conference: talk streaming and access to a VIP chat. The price would be ridiculously cheap if you use one of the popular free streamings like Twitch or YouTube. And remember that you can organize a full online conference using only free and open source software.\nOBS Studio OBS Studio is an old friend of streamers. And also FOSS. No matter what streaming platform you are going to use (something free or some custom server), it works. You can have combined screens and cams and different audio sources to get a beautifully orchestrated output.\nIf you follow gamer streamers, you will probably be familiar with OBS already.\nIf OBS Studio is too complex to use for you, your moderators or even your speakers, you can always try StreamYard. It offers a similar functionality on a web browser friendly interface. It will allow you to easily stream to popular free platforms too. Personally I am very satisfied with this tool, even if it is not FOSS. It is really easy to use and the hardware and knowledge requirements are low.\nMattermost To cover the social side, Mattermost is my preferred option. It is a Slack-like messaging platform where you can offer special channels to your attendees according to their ticket (free or paid). There, you can have access to all social interactions; like asking the speakers, meeting other attendees or discussing on common rooms.\nWebsite Although this stack covers all the minimal requirements for an online conference, it is messy and with decoupled parts. Your attendees may feel lost.\nAttendees will have two windows or tabs in the browser: Mattermost and the streaming. The links to each streaming talk may be on some schedule in some webpage. It will be worth adding some developing time to create a website that contains everything on an usable format and gives some sense of being a single component.\nOffline Talks for Online Events If you are afraid your software stack may fail at the worst moment, you can ask your speakers to send their recorded presentations before the online event. You can even ask them for optional subtitles to overcome any language barrier.\nAsking for recordings in advance gives you time to test if the video is right and schedule the release at the proper time and date. This reduces a lot the possibility of real time failures. Also, this way you make sure all videos have the proper duration, making the schedule more stable.\nThis gives the speakers also the opportunity to edit their videos on a fancy friendly way, adding special effects or anything that may be too risky to run on real time.\nThe speakers can also be asked to be at that proper time and date on the chat to interact with the attendees so the Q&amp;A can run as usual.\nBut the event will probably look less dynamic, with all these pre-recorded talks. No cross-referencing talks you just watched, no possible change mid talk because someone made a good point.\nPromising Software Stacks If you don&rsquo;t want to use the free streaming options and\/or you are looking for a more holistic solution, there are some platforms and software stacks you can check. Take into account that these options require you to have the proper bandwidth, which means, they are going to be more expensive than the previously described minimum viable plan.\nSo the first thing you have to ask yourself before jumping into any of these platforms is: is it worth the risk of using our own\/rented streaming servers instead of something like YouTube or Twitch?\nThe most attractive (to me) alternatives right now are the following.\nBigBlueButton BBB is a FOSS Conferencing System for online learning. Not designed as a conference software, it provides the users with class-like rooms and a chat per room. As a tool for teachers I felt it was very complete. As a tool for an online event, I felt things missing. It felt like many disconnected talks, not like a full schedule.\nVenueless From the creators of Pretix and Pretalx, Venueless aspires to be the FOSS option for conferences. It is built on top of Big Blue Button, offering a wrapper that should make the experience more &ldquo;conference-like&rdquo;. I have to confess I haven&rsquo;t tried it yet, but seeing how Pretix and Pretalx work, I&rsquo;m confident this is going to be a big one. If you are considering using BBB, you should take a look at this one. If only because it provides features on top of it.\nBoth options have the huge advantage of being FOSS, which means, if you don&rsquo;t like or need something in particular, you can dedicate your own developers into contributing for it. Even if you use a third party hosting, with proper care your contributions will make it to the main release so any third party hosting will offer them for you.\nYet Another Browser Mud Based on traditional text-based online game spaces such as MUDs and MOOs, this FOSS platform for online events could be at least a nice secondary interface for your event.\nHopin Hopin.to was used on ApacheCON. It is not FOSS, which means you are completely dependent on what the company behind it wants to implement. For me, that&rsquo;s a big red flag, specially on online events, which is something the software stacks are not yet mature enough. You cannot be confident yet that a restricted licensed software will be mature enough to provide you with everything you need.\nOn the social side, Hopin offered fancy features like matching you with random attendees, mimicking what a coffee break would be, or offering specific booth rooms so you can talk with sponsors.\nTruth is, I am usually very social on face to face events and talk with random people and visit the booths. But nothing was calling me to use these features on the online version of this conference. It&rsquo;s not as if you see someone you want to talk to in the coffee break so you just approach them. It looks forced to me. The risk of matching a complete stranger with nothing in common and having an uncomfortable conversation was high.\nOnline Events Experiences I&rsquo;m sure all of you have some experiences with online events by now. Let me share some insights I have experienced and why I still think online events can&rsquo;t replace face to face ones.\nEsLibre experience The EsLibre used Big Blue Button as the main conference platform, with RocketChat as the sidechat and MozillaHub for the Gala Dinner and social &ldquo;after beers&rdquo;. The experience was pretty good&hellip; except everything was disconnected, as we were using three different components completely decoupled.\nAnd still, not the same as a face to face.\nApacheCON experience ApacheCON used Hopin. It was in general a good experience, well organized, and we had more attendees than ever. But that may be misleading: most of the almost six thousand registered attendees logged in at some point in the event, but you rarely saw more than a thousand connected at the same time.\nWe used the &ldquo;three timezone region&rdquo; approach, which in the end led us to have like three different groups of attendees that didn&rsquo;t mingle among each other.\nConclusion Online Events can&rsquo;t match Social Face to Face Events\nAt least, not for me, not with the technology and the social capabilities we have right now.\nI really really hope this post ages badly. Because there&rsquo;s a lot of people that can&rsquo;t travel to on site events and they are missing all the awesomeness of a full event experience.\nAnd, truth be told, having everyone traveling several times per year to different conferences is not ecological, not sustainable in the long term.\nMaybe with experiments like the one from the Roguelike Celebration or the attempt at Google, we will be able to get closer to what we need.\n","permalink":"https:\/\/delawen.com\/2020\/10\/are-online-events-the-new-normal\/","summary":"Some of you may know I am going to co-chair the next <a href=\"https:\/\/2021.foss4g.org\/\">FOSS4G<\/a>. ( <strong><em>Come Hell or High Water, but we are going to have a FOSS4G next year!<\/em><\/strong>) I have also participated on the organization of the last <a href=\"https:\/\/www.apachecon.com\/acna2020\/\">ApacheCON<\/a> and some other minor online events. I have also spoken on many online events by now.","title":"Are online events the new normal?"},{"content":"You may have heard any or all of these keywords before: middleware, integration, orchestration. And you may be wondering why and when to use them. Take a walk with me to understand when and how integration frameworks are useful.\nImagine you are in charge of solving a new need of your company. There is no complete software stack for what you need. You will have to involve your team to create something new. Even if you reuse some components, you have to make them interact and talk to each other.\nYou are an experienced software engineer and have solved previously many of the requirements with some components you are already familiar with. But now you have to orchestrate all these components together and make them work like a clock. Now you need a proper integration. You want all of them to cooperate smoothly in your architecture.\nThe first thing any good developer thinks about is building a custom software that acts as the glue between all these components. Maybe adding some fancy extra functionality. And, (why not?) as we are at the beginning of a new exciting project, probably we want to try all these new technologies you have been reading and hearing about. Whatever the fad buzzword is now, you are willing to try it.\nAlthough this may be appealing, your inner experienced engineer tells you to stop. There&rsquo;s something you also read about, these integration frameworks. Could they be useful here?\nThe Integration Paradigm As much as we would like to start a new clean project from scratch and throw all our ingeniousness into it, we shouldn&rsquo;t reinvent the wheel. Let&rsquo;s take a look at what is this middleware or integration software.\nMiddleware, or integration software, can help us orchestrate and automate the interaction between different applications, APIs, third party services or any other software piece we may have to connect.\nA proper integration tool should provide us with the following features: transformation, integration patterns and connectors to existing protocols and components.\nTransformations When we connect different components of an architecture, they rarely speak the same languages or, on this case, data formats. Some components will output an xml that has to be fed to the following component on a json form. Maybe we even need to add or remove some attributes on that json data.\nWe need some way to easily transform the data traveling from one component to the following so it fits properly.\nIf we want to do this with our own script, there are many libraries that can help us doing this like [Jackson](http:\/\/You are already an experienced engineer and have solved previously many of the requirements with some components you are already familiar with. But now you have to orchestrate all these components together and make them work like a clock. Now we need a proper integration.) or the built-in xml libraries on Python . We even have the XSLT language to transform XML. But to use any of these properly, we would have to learn first how to use them. And any code we generate will have to be maintained and upgraded properly.\nAn integration framework allows us to define what is the mapping between the output of one component and the input of the following so we can forget about the explicit implementation. The less code we have to maintain, the better.\nEnterprise Integration Patterns Not all workflows in the architecture will be lineal. Some of the steps will require broadcasting, some of them will require conditional flowing. Some will require waiting the output of different components to conflate the data. These action patterns are something that have been studied for a long time. And as with software development patterns, you can classify them and study them to create better integrations.\nYou can find all of these patterns prettily explained in the classic Enterprise Integration Patterns book.\nConnectors All of the above is useless if we can&rsquo;t connect to (and from) the specific component we need.\nOur ideal integration framework should offer support for common protocols like ftp, http, jdbc,&hellip; Also it should offer support to connect to common components like a mail server, messaging services, atom,&hellip; We could claim even that no integration tool would be good if it doesn&rsquo;t also support specific well known services like being able to send a message through a Telegram bot or store information on Elastic Search.\nBeing able to seamlessly connect from one component to the next without having to worry about the specifics of their interfaces is what distinguishes an average integration tool from a good integration tool.\nApache Camel Let&rsquo;s talk about something less abstract. At this point you may be wondering where you can find a good integration framework.\nApache Camel is not only one of the most active projects inside the Apache Software Foundation, it is also the lightest and most complete integration framework available. And on top of it, it is also Free and Open Source Software!\nCamel is already an old actor on the integration world. It has support for hundreds of components, protocols and formats. Some of these protocols come very handy allowing the user, for example, to connect to any REST API that they need.\nCamel uses its own DSL, a simplified language to define easily the workflows step by step.\nCamel-K Camel is also available in Knative. This means, we can use it on a serverless environment, making sure the orchestration between services runs and escalates properly.\nCamel K Orchestration Example This example demonstrates how to orchestrate integrations using Camel-K and Kafka as a messaging service. We are going to implement two integrations that interact through a database to simulate how cat adoptions work.\nThe full example can be found on Github.\nFlux diagram\nOne integration will store cats coming from Kafka to the database waiting for a person to adopt them. The second integration will receive people interested in adopting and will match cats with them.\nCat Input from Kafka to Database First we are going to implement the storage of cat input messages to the database.\nAs you can see, the Camel DSL is very intuitive: this integration listens to the proper Kafka broker and for every message that arrives, it unmarshalls the json to extract the data and pushes it to the database. The Cat class is just a simple bean with getters and setters for the attributes.\n\/\/ camel-k: language=java import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.dataformat.JsonLibrary; import model.Cat; public class CatInput extends RouteBuilder { @Override public void configure() throws Exception { \/\/Listen to kafka cat broker from(&#34;kafka:cat?brokers=my-cluster-kafka-bootstrap:9092&#34;) .log(&#34;Message received from Kafka : ${body}&#34;) .unmarshal().json(JsonLibrary.Gson, Cat.class) \/\/Store it on the database with a null person .setBody().simple(&#34;INSERT INTO cat (name, image) VALUES (&#39;${body.name}&#39;, &#39;${body.image}&#39;)&#34;) .to(&#34;jdbc:postgresBean?&#34;) \/\/Write some log to know it finishes properly .log(&#34;Cat stored.&#34;);} } } Person Input from Kafka to Adopt Now we are going to implement the reception of people wanting to adopt a cat.\nThis integration is a bit more complex, as we are going to introduce a conditional choice: if there is a cat available on the database, it will be assigned to the person. If there is no cat (otherwise), a message will be returned saying no cat is available.\n\/\/ camel-k: language=java import org.apache.camel.builder.RouteBuilder; public class PersonInput extends RouteBuilder { @Override public void configure() throws Exception { \/\/Listen to kafka person broker from(&#34;kafka:person?brokers=my-cluster-kafka-bootstrap:9092&#34;) .log(&#34;Message received from Kafka : ${body}&#34;) .log(&#34;${body} wants to adopt a cat&#34;) \/\/Store the name of the person .setProperty(&#34;person&#34;, simple(&#34;${body}&#34;)) \/\/Search for a lonely cat .log(&#34;...looking for available cats...&#34;) .setBody().simple(&#34;SELECT id, name, image FROM cat WHERE person is NULL LIMIT 1;&#34;) .to(&#34;jdbc:postgresBean?&#34;) .choice() .when(header(&#34;CamelJdbcRowCount&#34;).isGreaterThanOrEqualTo(1)) .setProperty(&#34;catname&#34;, simple(&#34;${body[0][name]}&#34;)) .setProperty(&#34;catimage&#34;, simple(&#34;${body[0][image]}&#34;)) .setProperty(&#34;catid&#34;, simple(&#34;${body[0][id]}&#34;)) .log(&#34;Cat found called ${exchangeProperty.catname} with ID ${exchangeProperty.catid}&#34;) \/\/There&#39;s a cat available, adopt it! .setBody().simple(&#34;UPDATE cat SET person=&#39;${exchangeProperty.person}&#39; WHERE id=${exchangeProperty.catid}&#34;) .to(&#34;jdbc:postgresBean?&#34;) \/\/Write some log to know it finishes properly .setBody().simple(&#34;Congratulations! ${exchangeProperty.catname} adopted ${exchangeProperty.person}. See how happy is on ${exchangeProperty.catimage}.&#34;) .to(&#34;log:info&#34;) .otherwise() \/\/Write some log to know it finishes properly .setBody().simple(&#34;We are sorry, there&#39;s no cat looking for a family at this moment.&#34;) .to(&#34;log:info&#34;) .end(); } } Feeding data automatically As an extra step on this exercise, we are going to implement a final job that sends random new cat data to the Kafka &ldquo;cat&rdquo; topic with a timer.\nThe complexity on this class is not the Camel side, but the random generator of cat names.\n\/\/ camel-k: language=java dependency=camel:gson import java.util.HashMap; import java.util.Map; import java.util.Random; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.dataformat.JsonLibrary; public class AutoCat extends RouteBuilder { @Override public void configure() throws Exception { \/\/ Preparing properties to build a GeoJSON Feature Processor processor = new Processor() { String[] title = new String[] { &#34;&#34;, &#34;Lady&#34;, &#34;Princess&#34;, &#34;Mighty&#34;, &#34;Your Highness&#34;, &#34;Little&#34;, &#34;Purry&#34;, &#34;Empress&#34;, &#34;Doctor&#34;, &#34;Professor&#34; }; String[] firstname = new String[] { &#34;Dewey&#34;, &#34;Butter&#34;, &#34;Merlin&#34;, &#34;Epiphany&#34;, &#34;Blasfemy&#34;, &#34;Metaphor&#34;, &#34;Fuzzy&#34;, &#34;Whity&#34;, &#34;Astro&#34;, &#34;Salty&#34;, &#34;Smol&#34;, &#34;Whiskers&#34;, &#34;Scully&#34; }; String[] lastname = new String[] { &#34;&#34;, &#34;Luna&#34;, &#34;Wild&#34;, &#34;Dragonis&#34;, &#34;Firefly&#34;, &#34;Puff&#34;, &#34;Purrcy&#34;, &#34;Priss&#34;, &#34;Catsie&#34; }; Random r = new Random(); @Override public void process(Exchange exchange) throws Exception { Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;(); map.put(&#34;image&#34;, exchange.getProperty(&#34;catimage&#34;).toString()); StringBuilder name = new StringBuilder(); name.append(title[r.nextInt(title.length)]); name.append(&#34; &#34;); name.append(firstname[r.nextInt(firstname.length)]); name.append(&#34; &#34;); name.append(lastname[r.nextInt(lastname.length)]); exchange.setProperty(&#34;catname&#34;, name.toString()); map.put(&#34;name&#34;, name.toString().trim()); exchange.getMessage().setBody(map); } }; \/\/ Listen to kafka cat broker from(&#34;timer:java?period=10s&#34;) \/\/ Take a random image .to(&#34;https:\/\/api.thecatapi.com\/v1\/images\/search&#34;) .unmarshal().json(JsonLibrary.Gson) .log(&#34;A new cat arrived today ${body[0][url]}&#34;) .setProperty(&#34;catimage&#34;, simple(&#34;${body[0][url]}&#34;)) \/\/ name cat and prepare json .process(processor) .log(&#34;${body}&#34;) .marshal().json(JsonLibrary.Gson) .log(&#34;We named them ${exchangeProperty.catname}&#34;) \/\/ Send it to Kafka cat broker .to(&#34;kafka:cat?brokers=my-cluster-kafka-bootstrap:9092&#34;) \/\/ Write some log to know it finishes properly .log(&#34;Cat is looking for a family.&#34;); } } Now you are ready to implement your own orchestrations with Kafka and Camel K.\n","permalink":"https:\/\/delawen.com\/2020\/10\/what-is-integration\/","summary":"<p>You may have heard any or all of these keywords before: middleware, integration, orchestration. And you may be wondering why and when to use them. Take a walk with me to understand when and how integration frameworks are useful.<\/p>\n<p>Imagine you are in charge of solving a new need of your company. There is no complete software stack for what you need. You will have to involve your team to create something new. Even if you reuse some components, you have to make them interact and talk to each other.<\/p>\n<p>You are an experienced software engineer and have solved previously many of the requirements with some components you are already familiar with. But now you have to orchestrate all these components together and make them work like a clock. Now you need a proper <em>integration.<\/em> You want all of them to cooperate smoothly in your architecture.<\/p>\n","title":"What's all this integration agitation, anyway?"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-06-17\/","summary":"","title":"[FOSS4G UK] What would John Snow do?"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-05-25\/","summary":"","title":"[Ping a Programadoras] Design Patterns: Strategy"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-04-13\/","summary":"","title":"[Ping a Programadoras] Introduction to Software Design Patterns"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-03-16\/","summary":"","title":"[SVQTech] Trabajo Remoto 101"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-03-13\/","summary":"","title":"[VII JORNADAS INGENIER@S EN LA UPO] Freedom at All Levels"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-02-02\/","summary":"","title":"[FOSDEM] Integration Processes Data flowing the easy way"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2020-01-19\/","summary":"","title":"[EsLib.re] [Workshop] Apache Camel"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2019-11-13\/","summary":"","title":"[SVQJUG] Introduction to Camel Breeding"},{"content":"You can take a look at some of my previous public appearances to get an idea of my speaker skills and get a better overview of my work on stage.\nWhat I DO offer I am an experienced international keynoter. I can deliver talks both in English and Spanish.\nCommon (not restricted to) topics I talk about :\nFree and Open Source Java Development and State of the Art Good Development Practices What I do like in events If you are going to ask me to speak, consider this requirements:\nThe event MUST have:\nCode of Conduct Inclusivity and Diversity Policies Also, I will not participate on events with manels.\nWhat you have to offer me I can makeexceptions on this section for not for profit events, depending on how expensive it gets for me.\nYou have to cover my travel expenses and you have to pay for my time.\nTopics The following is a subset of talks I am prepared to deliver.\nWait, how did I got here? On 2008 I got my first contact with the GeoSpatial community. Ten years later I was elected as President of the Open Source GeoSpatial Foundation ( https:\/\/osgeo.org), first woman on that position.\nThe journey to leadership is always a hard one, specially when you are a young woman on an international environment. Here&rsquo;s my story on how I evolved from a newly graduated engineer to have one of the most relevant positions in the community: the expected and unexpected problems and biases I had to overcome and how I survived to tell the story.\nFree, Open and Libre This is an introductory talk to explore the free and open source ecosystem and how it affects our daily life.\nWhat are the differences between free and open source? Is it just a legal issue or does it have direct consequences? Does it really matter if a software is free or open? Which one is better for my use case? How does the difference affect us?\nAnd how does it affect private companies and bussinesses? But, above all, what is \u201clibre\u201d? Why do we even need a third word on this subject? Will it really make a difference? What is openwashing and why is this a threat to future technologies?\n","permalink":"https:\/\/delawen.com\/public-appearances\/events-and-presentations\/","summary":"<p>You can take a look at some of <a href=\"\/events\/\">my previous public appearances<\/a> to get an idea of my speaker skills and get a better overview of <a href=\"\/public-appearances\/\">my work on stage<\/a>.<\/p>\n<h1 id=\"what-i-do-offer\">What I DO offer<\/h1>\n<p>I am an experienced international keynoter. I can deliver talks both in <strong>English<\/strong> and <strong>Spanish<\/strong>.<\/p>\n<p>Common (not restricted to) topics I talk about :<\/p>\n<ul>\n<li>Free and Open Source<\/li>\n<li>Java Development and State of the Art<\/li>\n<li>Good Development Practices<\/li>\n<\/ul>\n<h1 id=\"what-i-do-like-in-events\">What I do like in events<\/h1>\n<p>If you are going to ask me to speak, consider this requirements:<\/p>","title":"Speaking at events"},{"content":"On June I joined Red Hat as a Senior Software Engineer.\nI always said that I preferred to work on a small company before a big company, because on a big company you can&rsquo;t be anything more than a number. That you can&rsquo;t really grow professionally if you are such a small piece on a big machine.\nI have to say: I was completely wrong. The room for manoeuvre you have on a big company is not comparable to that on a smaller one.\nJust a month after my latest job change and I am completely in love with Red Hat. I keep asking around me &ldquo;where is the trick? where is the trap?&rdquo; because there have to be. Tough it seems there isn&rsquo;t. If this is not my dream job, it is only one &ldquo;geospatial&rdquo; label away.\nWhat is Red Hat? For those of you who have been living on a restricted licensed dungeon the latest twenty years, Red Hat is the biggest open source company in the world. They made Open Source as their main drive and they have the community upfront. They are not only the main maintainers of Red Hat, CentOS and Fedora OS (obviously), but they (we!) maintain many other open source projects. Like the Java versions Oracle wants to get rid of!\nNew Hire Orientation meeting\nIf you meet the 14 year old Mar\u00eda and told her she was going to be working for Red Hat today, she wouldn&rsquo;t believe you. Well, she would have laugh because she is a debianite, and what does a debianite do on Red Hat? (Still need to work on a good pun for this one)\nAn open source way of working Upstream goes first. Open Source is the most important thing. Community tasks are important tasks. Don&rsquo;t do a patchy patch to fix this, take your time and discuss how to really fix that bug. Developers, take the time you need, the important thing is that the software developed is good and has the quality needed. Ending doesn&rsquo;t justify the means. Be honest, be fair.\nDo we need to leverage technical debt and refactor? Do we want to make it easier for developers to work? Sure, just work on it! Do you think we are not doing what we should be doing? Are you not satisfied with the results? Speak your mind!\nRemote is completely incorporated to the workflow. Of course we have offices, but our team is spread all around the world because, you know what? You don&rsquo;t need to be on an office with more developers to do your best. And once a company understands that and adds it to their core, remote working is much more fluid and efficient! Having their developers happy is one of the priorities. No wonder the number of years someone stays in Red Hat is higher than in other companies.\nOpen Source, but not spatial any more? I don&rsquo;t intend to leave the spatial world. It&rsquo;s true that my efforts will focus now on Apache Camel, Syndesis and OpenShift: Integration Platforms as a Service (IPaaS). But just a few days into the topic and my head was already conspiring to turn it into geospatial.\nSo you can expect me to go to some FOSS4G conferences every now and then, even if I drop my tasks as GeoNetwork maintainer aside. You will just hear me less about cats and metadata and more about camels and integrations. Or maybe camels and cats. Or spatial camels&hellip;\nThowing the hats\nI could say that you will see me less because my geospatial community tasks will have to be taken from my free time, but, let&rsquo;s face it, it was never otherwise. The difference is that now I have to mix with the middleware community too. And I want to stop more on safe spaces.\n","permalink":"https:\/\/delawen.com\/2019\/07\/from-cat-to-hat\/","summary":"On June I joined Red Hat as a Senior Software Engineer.","title":"From Cat to Hat"},{"content":"If someone linked you this post is probable you are organizing an event where diversity and inclusivity is an issue and they want to help you fix that. If you want, you can jump to the subsection that better adjust to your case. Remember: diversity is not a TL;DR , you probably need to read the full article to get a better grasp of what you need. As usual: I&rsquo;m going to focus on the gender gap because it&rsquo;s easier for me to talk in those terms, but similar strategies can be applied to any other under-represented group.\nI was told I have a manel, what&rsquo;s that? A manel is a panel full of men (usually white and middle aged). Usually this manel is the main panel or the keynoters panel whose members are the most relevant\/the most advertised speakers. They are the display case of your event and they may tell more about your event than you probably suspect.\nBonus track: Have you heard about the Techdel Test?\nBut I had no women speaker candidates for my event! It doesn&rsquo;t matter if it was a set of speakers chosen manually or if you sent a call for papers to the internet waiting for proposals. If you have few (or none) proposals that improve your diversity line-up, something went wrong. Because there are women (and PoC and functionally diverse speakers) out there. You just didn&rsquo;t met them. But don&rsquo;t worry, there&rsquo;s many things you can do to improve it.\n\u201cThe time is always right to do what is right.\u201d\nMartin Luther King\nAsian woman with a laptop\nThe main key is on your network. It could be through personal face to face relationships, Twitter, LinkedIn, Facebook or even Instagram. But somehow you advertised your Call for Papers or searched for speakers and that was using a network. If your network is not diverse enough, you will never reach those people you want to reach.\nIf your network is based on a community or company, you can take a look at some hints.\nA network grows slowly. Don&rsquo;t rush here. You will have to invest time looking for the right connections to extend your reach.\nStart with random seeds It may be that your current network is so homogeneous, you don&rsquo;t know where to start reaching out for under-represented voices. A quick way to work around this is to add random under-represented seeds to your network. Take a couple of hours to search for women (or members of your target under-represented group) on the internet that are related to your field\/area. They may not be the most relevant. They may not say something you don&rsquo;t already know. Those women can even be juniors and not very good at sharing what they know. But through them, on time, you will meet other members of that under-represented group which will be more relevant to you.\nEven more: those juniors that doesn&rsquo;t seem relevant right now, with proper sponsorship and mentorship, can become relevant figures on our industry in a couple of years. You can even help them yourself so they become the kind of speaker you are looking for. Remember: this is not a sprint, this is a long run.\nAm I too late? As said, your network will grow slowly. You can take some shortcuts but they won&rsquo;t help you in the long run. Those shortcuts will probably take you to tokenism, on the best case. They may be patches that work for your current event, but don&rsquo;t be fooled: we know they are patches. And that sums to your bad reviews.\nDiversity and inclusivity is like security or accessibility: if you don&rsquo;t design your architecture with them in mind, you will get a hard time later adding it.\nAs a general rule, if you start worrying about diversity after you launch your Call for Papers or you announce your first keynoters, you are too late. Inclusivity should be one of the main topics since the beginning. If it is not, you may make some decisions that will make your inclusivity harder to reach.\nOne common flaw is to choose a venue that is not accessible. You are already limiting the kind of people who can attend your event on the first steps. And ableism and ageism are other rabbit holes you don&rsquo;t want to enter.\nI&rsquo;m reaching my target groups, and still no talk proposals! It could be that your network is fine, you are just dealing with bad fame, impostor syndrome or similar traits. Be patient, you can also work on them.\nThere is some manual work you can do to attract speakers and break the curse. You have to dig into your networks, ask around, look for under-represented speakers that are interesting to your event. Do not ask them to talk about diversity. You want them to shine on their expertise.\nTake your time into searching for this potential speakers and approach them personally. Tell them why you think their work is interesting. Tell them if you have seen some previous talk they gave that you liked. Explain to them how important is their presence in your event.\nDo not tell them you need them because they belong to an under-represented group. Remember: do not tokenize. If that&rsquo;s the only reason you want them to be on stage, you didn&rsquo;t find the proper person.\nMy line-up of speakers is diverse, but not the attendees of my event Usually, your event will have a better diversity after a few editions if you keep a consistent diverse set of speakers. If that&rsquo;s not enough, consider if there&rsquo;s something else you may be missing. It could be something simple like missing a Code of Conduct (see below) or it could be something more complex, like bad fame gained over the years. Don&rsquo;t panic, all this has a solution.\n&ldquo;If I stop preaching to the choir, they would stop singing&rdquo;\nMartin Luther King\nThe most important thing is to be coherent and persistent. That will override any bad opinions your potential attendees may have. And it will generate good reviews that (don&rsquo;t doubt it!) we will share among our peers, making them more favourable to join your event.\nHow do I know what is my flaw? Reach to the current attendees that belong to under-represented groups and ask for feedback. They are the ones that survived to go to your event, but may give you some clues on why their peers are not there. Don&rsquo;t be afraid to ask, the worst thing that can happen is that they can&rsquo;t help you.\nCheck things like time and date chosen, place, even the options for food and drink. Maybe your event is not child-friendly? Maybe your event collides with normal working time? There are many reasons why your potential attendees can&rsquo;t attend. Is your venue accessible? Is it reachable by public transport?\nWoman with a laptop\nCheck how you look from the outside Maybe you are advertising it on a way that is not attractive? It could be that your inclusivity is not clear. Or even worse: maybe your inclusivity is obviously missing. Use inclusive language and photos. Try to make your event attractive. Make it clear that you are open.\nMaybe you already have some members of your targetted under-represented group in your network. But they suffer from Imposter Syndrome. You can sponsor them to make sure they are not left behind.\nIf all this fails, you can try other strategies like offering free tickets to under-represented groups. See next section for this.\nThere are no magic solution for diversity, each community has its idiosyncrasy that has to be taken care of. This is not an exhaustive article that covers everything, this is just a head up on where to start.\nI was told I told need a Code of Conduct, is that so? Yes.\nWe are all civilized rational folks and we all understand what is right and what is wrong, right? I wish we were. That may work if you are on an homogeneous group. But different cultures have different points of view of what is a social acceptable behaviour and what is not.\nFor example, in Spain it is very common to give two kisses when saying hi to someone, even if it is the first time you meet that person. But that, as common as it is in Spain, is not a general rule on the rest of the world and it may be seen as aggressive. Never assume that your social rules are universal. Even if you run a local event, different social environments run by slightly different rules.\nWhy not write them down, just to make sure we are all on the same page? Why not write them down, so if someone is crossing the line, it is easier to point their behaviour and ask them to improve?\nYou can learn more about how to write a good CoC here.\nFree tickets on my event for under-represented groups! This is a good approach to attract some under-represented group members. But don&rsquo;t sell yourself cheap. Try to make some kind of competition, make yourself hard to catch, gamify it. The idea is not to have any under-represented folk in your event. You want them to participate, you want them to be there because they are interesting.\nIf you just offer free tickets on your website and social networks and don&rsquo;t do anything to reach the under-represented groups, that&rsquo;s a red flag for us. It means that you heard you have a problem, but are not really into fixing it. You just wait with your doors open to see if we enter, not really caring why is it we are not entering your event.\nYou may be tempted to offer the tickets to some community of under-represented folks and then delegate on them to place the tickets. Don&rsquo;t just give them the tickets and assume it will work. Our communities are usually hand-full with many things, we may not be able to focus on your problem. Specially if you just delegate and forget.\nWe are not here to solve your problem. We can help you solve your problem. Because the problem is yours, not ours.\nTravel Grant If you are running a national or international event where your attendees usually travel, you might consider offering travel grants to your under-represented groups. This means: you may want to pay their travel costs to make sure they can make it to your event.\nWhen you are trying to reach to under-represented communities that are somehow linked to having economic issues (for historical reasons, usually), this can come in handy. But it can be helpful for other under-represented groups that may need a last push to want to join your event.\nTravel grants require some work. Not only to decide who and how much are you going to give, but also you require to collect the money first. You would be surprised how good a donation campaign may work. Some companies are also willing to donate and sponsor as long as they have some visibility on your event. Don&rsquo;t see it as selling yourself to those companies: a mention thanking the donation is usually enough.\nHey, you are a woman in tech, do you want to join my event? Could be. Let&rsquo;s talk.\nBut beware of tokenizing that female speaker you just reached. That won&rsquo;t fix your problem and it will make us feel uncomfortable.\nhttps:\/\/www.flickr.com\/photos\/wocintechchat\nBe polite and take all this economic details into account when inviting someone to speak at your event:\nConsider that if we have to travel and it has to come from our own money, we have a limited budget. And many events we may want to visit. So be prepared to receive a &ldquo;no&rdquo; if you can&rsquo;t pay for the expenses (see travel grant section).\nTake into account that using a working day to go to a conference means using holidays or missing a paid work day. There are people that can&rsquo;t afford losing a paid day (remember the gender gap in salaries too). Also, there are people that can afford it but still will mean a big burden on their economies.\nEven if you can pay for all the expenses and pay a compensation for the missing work day, preparing a talk is also a work that will come out of our free time. Don&rsquo;t assume that just because we are WiT activist we are going to be on all events filling all the slots.\nCan you help me fix the diversity problem of my event? That&rsquo;s a fair question. After reading this article you are sure you have a problem and are a bit overwhelmed. So you want someone who seems to know how to fix it to take the lead.\nLet me ask you this: Why would I want to help you fix your problem?\nIf you have a good answer to that question, let&rsquo;s talk.\nConsider, as in the previous section, that WiT activists are usually busy fighting against the gender gap. We are not going to waste our time investing in some group that don&rsquo;t really care for inclusivity and diversity. But if your answer is good enough, we may be able to help you.\nAnd if you don&rsquo;t have a good answer right now, are you willing to pay for the consultancy? There are companies out there that do this for a living. Or maybe give something in exchange? There are people that can help you out there, you just have to wake up their interest.\n","permalink":"https:\/\/delawen.com\/2019\/07\/i-want-to-fix-the-diversity-on-my-event-help-me\/","summary":"<em>If someone linked you this post is probable you are organizing an event where diversity and inclusivity is an issue and they want to help you fix that. If you want, you can jump to the subsection that better adjust to your case. Remember:<\/em> <a href=\"https:\/\/delawen.com\/2019\/06\/how-can-i-get-a-diverse-team\/\"><em>diversity is not a TL;DR<\/em><\/a> <em>, you probably need to read the full article to get a better grasp of what you need. As usual: I&rsquo;m going to focus on the gender gap because it&rsquo;s easier for me to talk in those terms, but similar strategies can be applied to any other under-represented group.<\/em>","title":"I want to fix the diversity on my event, help me!"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2019-06-11\/","summary":"","title":"[Innosoft] Privacidad y Autodefensa"},{"content":"TL;DR: Ok, there is a video on gvSIG Festival on diversity that cover most of the contents here.\nWhy do we need inclusivity and diversity? Do we really need to explain the problem of diversity? IT is mainly white and male. Even the most egalitarian person have biases due to have lived on a non egalitarian world and this reflects on our community. There are also society pressure to some groups of persons not to work on IT.\n&ldquo;True peace is not merely the absence of tension; it is the presence of justice.&rdquo;\nMartin Luther King\nIn short, diversity should just be a matter of Social Justice.\nBut if you are looking for more purely economical reasons, recent studies have shown that diverse teams are more efficient and provide more quality outputs [1] [2]. This means that even when a company invest explicitly on improve their inclusivity and diversity, the return of investment is usually high. Investing in diversity is a win win situation, but it requires some deconstruction and some effort from all the people involved.\nOn this article, I am going to focus on women and the gender gap because that&rsquo;s the issue I am most familiar with. Also, because as half the population everywhere is female, it is an easy aspect to quantify. But all content here can be extrapolated to any other under-represented group. Just extrapolate statistics and adapt numbers, when applies.\nWe know that the origin of the problem is probably not on your side: if fewer women study IT, how can half of your team be a women? But there are many things you can do to help leverage the issue.\nThe Diversity Warning Signs Always check demographical status of your team. Are they all similar? Do they have the same backgrounds, same culture, same religion? Do they even have similar hobbies and family configuration? That&rsquo;s suspicious. Society is not heterogeneous, and so shouldn&rsquo;t your team be.\n\u201cWe know through painful experience that freedom is never voluntarily given by the oppressor, it must be demanded by the oppressed.\u201d\nMartin Luther King\nCompare your team with the society outside your team. Do demographics match? More than half of the population are women, are more than half of your team women? I bet it isn&rsquo;t.\nGroup of people with high diversity\nOr maybe you have diversity on your team, but it is not stable: the persons that bring diversity to the team don&rsquo;t stay long, you cannot retain their talent. That&rsquo;s a huge sign that your environment is not comfortable for them, that they don&rsquo;t feel part of the team.\nA person is not diverse. Don&rsquo;t tokenize.\nNotice I said persons that bring diversity to your team and not &ldquo;diverse person&rdquo;. A person is not diverse. I am not diverse. I can bring diversity to a team that is different from me. Don&rsquo;t tokenize. Don&rsquo;t take that single person that is different from you and claim you are inclusive because you are friends.\nKey Indicators for Diversity One of the things you should do to increase diversity is define some key indicators to measure and quantify diversity. This can help you address the issue more easily and can help others know if your team is a safe space.\nDon&rsquo;t be shy showing your data. We know all companies have bad data at the start, what we are interested in is on the evolution of those numbers.\nWhat to avoid Don&rsquo;t be like those companies that claimed that their diversity statistics were a &ldquo;threat to competition&rdquo; and &ldquo;trade secrets&rdquo;. That if they published their women employees they would be &ldquo;stolen&rdquo;.\nFirst because that&rsquo;s embarrassingly not true. And second because if you really fear your competitors may &ldquo;steal&rdquo; your employees, maybe you should offer them better deals. Employees may leave because they don&rsquo;t feel safe on your team or because they don&rsquo;t feel valued. Value them, make them feel safe.\nBe transparent Once you decide to publish your figures, don&rsquo;t manipulate them.\nDon&rsquo;t be like that other company that has some pending trials accusing them for paying less to women. So their marketing team just published some statistics with a narrow cherry-picked analysis that has been widely published on media that claim that women are, in fact getting more bonuses than men.\nCherry-picking bonuses instead of checking the total salary and taking all variables into account. What accusations say is that they always offered women lower positions than what they should be offered according to their experience tables. As those positions have lower salaries, they also offered a bonus to compensate. Which means, women were mistreated: they were positioned on lower levels and compensated with bonuses to get the same salary as their male counterparts with no bonuses. And then they paid bonuses to men so in the end men got higher net salaries.\nBut hey, there is no gender gap because if you cherry pick the bonus data, women have high bonuses. Right?\nSo, not only women were losing the benefits associated to the level they belong. They were also not offered those extra bonuses their males were offered above the salary they were assigned.\nKey Diversity Indicators for companies The following table is an example of a Key Indicator for gender gap. You can extrapolate to other under-represented groups based on the demographic statistics of the society around you.\nSize of your company****Warning signsSmall (less than 20 employees)You have no women in your team\nOR\nYou have only one woman (token)MediumYou have less than 30% womenBig (more than 100 employees)You have less than 40% women\nThere are tools that can help you detect your gaps.\nWhen doing this calculations, consider only your IT department. Hiring women on other departments (administration, cleaning, HR,&hellip;) is helpful to build an inclusive space but it&rsquo;s not addressing the problem of the lack of women on IT. It only masks the problem.\nThe chosen percentages are different depending on the size of the company because the bigger the company is, the more they can invest on inclusivity.\nDefine different indicators, try to view the problem with different perspectives and approaches. Check not only that you have a good percentage of women, check also that they are evenly distributed among different levels. Are they all junior? Are they full or part time employees?\nNow that we have measured the problem, what can we do about it?\nYou have to invest on diversity Improving diversity and inclusivity on your team is not just a matter of good will. You have to invest time and resources to get it done right. To begin with, companies should train their personnel departments to know how to handle it. There are strategies on how to write and publish job offers, how to plan the interviews and how to follow up once you hire someone.\nhttps:\/\/www.ted.com\/talks\/janet_stovall_how_to_get_serious_about_diversity_and_inclusion_in_the_workplace\nFor smaller companies that have no HR\/Personnel department, you should ask for advice to experts to know how to improve your processes. The cheapest strategy would be to look for resources yourself, but that will never be as effective as talking to some expert and getting an audit.\nIf you are an open source project or a not for profit community, you may not have money for training or hiring someone. You can then fallback to some fellow organization and ask for advice there, we can help you at least pointing to the biggest issues. But don&rsquo;t forget that this comes with a cost, and free does not mean gratis. There should be some symbiotic relationship there to ensure sustainability.\nSome tips on Closing the Gap While you get some advice on your particular problem, here is a basic list of questions that can help you start brainstorming about how to improve the inclusivity in your team:\nWomen of Color working\nDo you have a Code of Conduct? This is the first thing to check. Make sure there are clear red lines on what is an acceptable behaviour and what is not.\nThere are many codes you can use as baseline. Take your time to select one that applies better to your use case.\nMake sure all your team have read and understood the full code. If some member of your team disagrees with your guidelines, make sure you talk about their disagreement.\nOn the best case, this Code of Conduct (CoC) is already being followed on your team and it is redundant and there will never be a report. But without a CoC, it may be that some people are creating a toxic atmosphere without even knowing it.\nDo you have a safe workflow in case of problems? Having a CoC is not enough if you can&rsquo;t report problems. Always make sure that there is a clear, transparent and safe workflow for reporting incidents. As a base line, the consequences of reporting an issue can&rsquo;t be worse than the issue itself. Protect the personal details of the reporters and make sure they are protected. Protect both parties of the incident and make sure all reports are taken seriously.\nDo you have a Strategy Plan? Define some goals and deadlines. Define how you want to achieve them. Assign resources to those goals.\nYou don&rsquo;t have to be too ambitious, just make sure you make improvements. And if your strategy does not work, this plan can help you detect that, so you can sit again to define a new plan.\nThe speed on which you improve the diversity is not as important as making sure improvements are made. Shortcuts can lead to worse situations.\nWhen hiring Go remote! Allowing flexibility will help you increment the pool of candidates to choose from. This is special for physically-challenged persons, family conciliation and similar situations where going to an office is not as simple as it looks like.\nUse always inclusive language. Specially on job offers: they are your showcase to all possible candidates and you want to be as friendly and inclusive as you can. There are many tools you can use to check about your language. In time, inclusive language will come naturally to you, but until then, don&rsquo;t hesitate and use them.\nThere are strategies to follow on job offers to make them more appealing. Following the MoSCoW method to define requirements of the job, adding a salary range, linking to your Diversity Plan and your CoC and, as said, use inclusive language. Don&rsquo;t forget to include details about the job like what is the expected on-boarding process and what will be the tasks to perform.\nOn a similar candidate, hire the woman. And no, this is no discrimination against men, this is only compensating the already existing bias: There are many independent studies with different approaches that proves we have unconscious bias that make us evaluate better men than women (and white people better than people of colour, etc). So when you look at two candidates that you evaluate as similar, you have to &ldquo;un-bias&rdquo;. Consider if there may be any prejudgements you are making without knowing.\nMake sure the team is safe BEFORE hiring You feel ready to improve diversity on your team. So you open a job offer with inclusive language and look very carefully the CVs received to choose someone different that will improve diversity on your team.\nStop there. No matter how tempting it is, don&rsquo;t start by hiring a junior. That frequently leads to isolation.\nThere are many reasons why your team is not diverse. Are you sure you solved all of those problems already? Is your team ready? You don&rsquo;t want to introduce an inexperienced junior on a team that is not used to diversity. Really, you don&rsquo;t want that.\nHire by Pairs Instead, you can invest a bit more and start by hiring a pair: a senior and a junior. The senior already knows the industry and knows what to expect. And she can mentor the junior so she doesn&rsquo;t feel so lonely. Make sure they are a good match and can work together successfully.\nTwo women working\nDon&rsquo;t start by hiring a junior woman. Better by pairs: senior and junior\nYou may think this strategy is not what your company will benefit most. But remember again: the ROI of diversity is high. Even if you don&rsquo;t really care if the women in your team are comfortable and want to stay, you want them to, because it is profitable for you.\nAlso, increase diversity in many dimensions. Consider not only gender but also LGBTQi+, ethnicity, physical challenge,&hellip; They all know how hard it is to be isolated on an homogeneous team, so they can help each other even if their reasons to be discriminated are different.\nMake sure the evolution is fair Don&rsquo;t push women to glue work, management, commercial or administrative tracks (unless they ask for it). It is very common to force women to pursue less technical tasks, something men don&rsquo;t usually experience. Make sure you don&rsquo;t have this bias and sponsor women on the IT track. If they survived to be on IT, it is because they want to be on IT.\nRetain the talent by being fair.\nCompare the evolution with the rest of your employees. Are you giving raises to everyone? Don&rsquo;t forget to add some indicators here, make sure you don&rsquo;t force women to jump to another company to advance. Retain the talent by making sure you are being fair.\nRegularly draw a map of all the people around you. Do they have opportunities to grow? Are they stuck in legacy projects that suck their innovation and time? Are they motivated with what they do?\nDo you have former women employees? Ask for feedback! They have been there, they experienced it, they are the ones that know why you are leaking diversity.\nGive voice to the under-represented When you do an extra effort to give voice to the under-represented , you not only help them on their careers, you also normalize their presence and get the rest of the team used to consider them as equals.\nOn meetings, make sure everyone say at least something. When going to events, make sure everyone has a chance to present something. When making decisions, make sure everyone have a vote.\nGive training on Bias Last but not least, it is very important to invest on closing the gap. You have to make sure all members of your team are aware of the problem and actively working to fix it.\nWhile you find a good trainer to help you, you can start with these resources:\n50 ways to fight gender bias Microsoft Course on Unconscious Bias Google Workshop on Unconscious Bias ","permalink":"https:\/\/delawen.com\/2019\/06\/how-can-i-get-a-diverse-and-inclusive-team\/","summary":"Do we really need to explain the problem of diversity? IT is mainly white and male. Even the most egalitarian person have biases due to have lived on a non egalitarian world and this reflects on our community. There are also society pressure to some groups of persons not to work on IT.","title":"How can I get a diverse and inclusive team?"},{"content":"","permalink":"https:\/\/delawen.com\/events\/2019-03-28\/","summary":"","title":"[gvSIG Festival] How can I get a diverse team?"},{"content":"delawen()\ndelawen - FOSS maintainer and advocator, OpenJDK Author, Java Champion, former President of OSGeo, community leader. FOSS enthusiast and collaborator since around 2004.\nSYNOPSIS delawen [OPTIONS]\nDESCRIPTION Mar\u00eda is a Free and Open Source Advocator. She has been a community manager and core maintainer of several open source projects. In 2020 she started and lead the development of Kaoto, an Apache Camel visual editor for integrations. She is right now working at RedHat as part of the OpenJDK team.\nIn 2020 Mar\u00eda was nominated and elected as a Java Champion. Java Champions are an exclusive group of passionate Java technology and community leaders.\nMar\u00eda was elected to be President of the Open Source Geospatial Foundation from 2017 to 2019. OSGeo serves as an umbrella for the most used geospatial free and open source software. She is also well known as a feminist and Women In Tech activist.\nPUBLICATIONS Empowering citizen science through free and open source GIS Arias de Reyna, M., Simoes, J. Empowering citizen science through free and open source GIS. Open geospatial data, softw. stand. 1, 7 (2016). https:\/\/doi.org\/10.1186\/s40965-016-0008-x\nThis article presents an overview of the GIS components of the COBWEB software framework, designed in order to support a collaborative citizen science environment. It describes the overall architecture of the system, focusing in new developments of existing Free and Open Source GIS software.\n[CHAPTER] 97 Things Every Java Programmer Should Know If you want to push your Java skills to the next level, this book provides expert advice from Java leaders and practitioners. You\u2019ll be encouraged to look at problems in new ways, take broader responsibility for your work, stretch yourself by learning new techniques, and become as good at the entire craft of development as you possibly can.\nEdited by Kevlin Henney and Trisha Gee, 97 Things Every Java Programmer Should Know reflects lifetimes of experience writing Java software and living with the process of software development. Great programmers share their collected wisdom to help you rethink Java practices, whether working with legacy code or incorporating changes since Java 8.\nOPTIONS -j|&ndash;java\nJava Developer since 2008.\n-f|&ndash;foss|&ndash;floss\nAdvocate for Free and Open Source Software.\n-e|&ndash;event\nSpeaker at conferences and teacher at workshops.\n-c|&ndash;community\nMar\u00eda is active in several technological communities, local, regional, and international.\n-o &ndash;organize\nOrganizer of community events, community manager and leader of different groups.\nCREDENTIALS SEE ALSO marias(1), mariasde(1), ariasdereyna (1)\nREPORTING BUGS Report bugs through the page of contact.\nCOPYRIGHT Copyright Mar\u00eda Arias de Reyna Dom\u00ednguez. All rights reserved https:\/\/delawen.com\nCREDITS This man page is created by Mar\u00eda Arias de Reyna Dom\u00ednguez\n","permalink":"https:\/\/delawen.com\/woman-delawen\/","summary":"<p>delawen()<\/p>\n<p>delawen - FOSS maintainer and advocator, OpenJDK Author, Java Champion, former President of <a href=\"https:\/\/osgeo.org\">OSGeo<\/a>, community leader. FOSS enthusiast and collaborator since around 2004.<\/p>\n<h2 id=\"synopsis\"><strong>SYNOPSIS<\/strong><\/h2>\n<p>delawen [OPTIONS]<\/p>\n<h2 id=\"description\"><strong>DESCRIPTION<\/strong><\/h2>\n<p>Mar\u00eda is a Free and Open Source Advocator. She has been a community manager and core maintainer of several open source projects. In 2020 she started and lead the development of Kaoto, an Apache Camel visual editor for integrations. She is right now working at RedHat as part of the OpenJDK team.<\/p>","title":"Who am I?"},{"content":"Let&rsquo;s overlook the statistical justice of having a diverse team. Let&rsquo;s overlook the social justice of working on a team with high diversity. Go directly to why you, someone interested in having business at the end of the year, are also interested in having a diverse team.\nSpanish version is on Ping a Programadoras blog.\nEach one of us sees the world from a different perspective. Because of the vital experience that the society where we grow offers us. Those different perspectives are what makes us see different details on the same situation. And these details are what gives the products and services offered by your company the quality you need to succeed.\nAre the diverse teams more efficient and economically profitable? Yes\nAre the diverse teams more creative? Yes.\nIf you want to build a really accessible building, you must bring together a team that knows the laws (which usually cover the minimum). But also a team composed of people who have suffered accessibility issues themselves.\n&ldquo;Diversity is the default. If it&rsquo;s not diverse, it&rsquo;s broken&rdquo;\n-Lena Reinhard\nDiversity in culture Have you ever seen a chapter of a police series in which, after an exhaustive search, they find blood in the apartment of a murdered woman and conclude that it was there where they killed her? Well, it looks like no woman reviewed the script, because having blood your house is&hellip; common?\nhttps:\/\/twitter.com\/nke_ise\/status\/897756900753891328\nBut the script is written by writers in a hurry, right? It is not a good example of careful work that takes diversity into context. Well, let&rsquo;s give a more complete example. A fantastic science fiction classic book: Dune. Scrupulous and careful, the author describes everyday aspects to the smallest detail to give credibility to his story.\nDiversity in Science Fiction&hellip;or not In Dune, the characters live on a desert planet where water is the most precious asset. Even moisture that escapes from the breath is something that must be stored and reused. So all these characters have a special suit at all times. This suit collects sweat and other body fluids to reuse them as drinking water. An adult has an amount of water in his possession in a closed cycle inside his suit.\nDo they mention menstrual blood? Not at all, although the author mentions quite scatological details. But suppose it is a slip without bad intention.\nHowever, something that is not mentioned at any time is how this cycle is maintained between pregnant women, babies and children. A pregnant woman needs more water as the pregnancy progresses. Not only because of the water that is given to the fetus, but also because of the water in the placenta. When the baby is born, the mother will continue to lose water through breast milk. And when this process is over, the child will continue to consume extra amounts of water throughout its development.\nIs this relevant? Maybe not for a large part of the population. But the truth is that, in that world so explicitly detailed, the author skips a very important and relevant part of the whole process. Without taking into account all the problems of pregnancy and the development of children, their entire social system collapses. So it goes from being something plausible in science fiction to a deux ex machina in fantasy.\nDifferences Everywhere There are a thousand more examples of ideas, services, products and strategies that fail because the team behind is not diverse enough, with varied perspectives. And if these ideas are used in a business, they will fail miserably in something that could have been easily avoided.\n[embed]https:\/\/twitter.com\/JillianDavid13\/status\/881844097505538048[\/embed]\nHow can you improve diversity in your team? You can try to improve the way you hire.\nhttps:\/\/twitter.com\/trisha_gee\/status\/986261350207967232\nhttps:\/\/twitter.com\/delawen\/status\/985977351057170433\nBut, above all, make sure that once hired, everyone is treated fairly and equitably. Diversity is something that is achieved day by day.\n","permalink":"https:\/\/delawen.com\/2018\/05\/why-do-we-need-diversity-on-our-teams\/","summary":"<p>Let&rsquo;s overlook the statistical justice of having a diverse team. Let&rsquo;s overlook the social justice of working on a team with high diversity. Go directly to why you, someone interested in having business at the end of the year, are also interested in having a diverse team.<\/p>\n<blockquote>\n<p>Spanish version is on <a href=\"https:\/\/pingprogramadoras.org\/2018\/05\/07\/por-que-necesitamos-diversidad-en-nuestros-equipos\/\">Ping a Programadoras blog.<\/a><\/p>\n<\/blockquote>\n<p>Each one of us sees the world from a different perspective. Because of the vital experience that the society where we grow offers us. Those different perspectives are what makes us see different details on the same situation. And these details are what gives the products and services offered by your company the quality you need to succeed.<\/p>\n<p><a href=\"https:\/\/hbr.org\/2017\/03\/teams-solve-problems-faster-when-theyre-more-cognitively-diverse\">Are the diverse teams more efficient and economically profitable? Yes<\/a><\/p>\n<p><a href=\"https:\/\/www.mckinsey.com\/business-functions\/organization\/our-insights\/is-there-a-payoff-from-top-team-diversity\">Are the diverse teams more creative? Yes.<\/a><\/p>\n","title":"Why do we need diversity on our teams?"},{"content":"Me gusta leer ciencia ficci\u00f3n. He devorado sagas e historias sueltas y tengo el kindle a reventar. Pero, en este despertar feminista, un d\u00eda me di cuenta de que no segu\u00eda a ninguna autora. Eran todo hombres. \u00bfD\u00f3nde estaban las escritoras de Ciencia Ficci\u00f3n? \u00bfPor qu\u00e9 no me hab\u00eda cruzado con ninguna? As\u00ed que me puse a rebuscar entre interminables listados de antolog\u00edas y recopilaciones. Y acab\u00e9 comprando un libro recopilatorio que parec\u00eda ser lo que andaba buscando: una recopilaci\u00f3n de autoras que luego podr\u00eda usar para seguir buscando m\u00e1s libros interesantes.\nEsta entrada fue publicada primero en PaP\nFinalmente la pila de libros por leer fue bajando y le toc\u00f3 el turno. Ya ni me acordaba bien de por qu\u00e9 hab\u00eda escogido este libro. As\u00ed que contrariamente a lo que suelo hacer, no me salt\u00e9 la introducci\u00f3n. En su lugar, decid\u00ed leer la opini\u00f3n de esta editora y por qu\u00e9 hab\u00eda decidido recopilar estas historias en concreto. Y vaya si me sorprend\u00ed.\nKristine Kathryn Rusch Alice Hastings Bradley aka James Tiptree Jr. aka Raccoona Sheldon. Autora c\u00e9lebre de ciencia ficci\u00f3n&hellip;. mientras fingi\u00f3 ser un hombre.\nLo primero que comenta la autora, Katheryn, es que no entiende por qu\u00e9 tanto revuelo. Ella misma es una reconocida editora y escritora de ciencia ficci\u00f3n, best-seller, premiada m\u00faltiples veces. Y conoce a muchas otras mujeres que escriben con igual o m\u00e1s \u00e9xito en la ciencia ficci\u00f3n. As\u00ed que no entend\u00eda por qu\u00e9 las nuevas generaciones de mujeres escritoras se le acercaban como si hubiera un problema de brecha de g\u00e9nero. \u00bfC\u00f3mo iban a estar las escritoras de ciencia ficci\u00f3n discriminadas, si son premiadas una y otra vez en los premios Hugo? \u00bfPor qu\u00e9 nadie parece conocerlas, si son best-sellers? \u00bfSer\u00eda que estas escritoras noveles no se hab\u00edan molestado en buscar? \u00a1 Si uno de los cl\u00e1sicos de la ciencia ficci\u00f3n est\u00e1 escrito por una mujer! Con seud\u00f3nimo, eso s\u00ed, pero mujer al fin y al cabo.\nTengo que reconocer que en las primeras p\u00e1ginas tem\u00eda haberme equivocado de libro, si este era el enfoque de la autora. Me sent\u00eda igual de confusa que esas escritoras noveles a las que les costaba encontrar referentes. Y me sent\u00eda un poco atacada por la autora al considerar que el problema estaba en mi, que no hab\u00eda sabido buscar. Pero como despu\u00e9s de todo era un libro recopilatorio que es lo que yo quer\u00eda, decid\u00ed seguir leyendo a ver hasta qu\u00e9 punto podr\u00eda llegar a entender su postura.\nLas autoras son ninguneadas sistem\u00e1ticamente As\u00ed que empieza a investigar el por qu\u00e9 de esta confusi\u00f3n. Y descubre algo terrible a la vez que sutil. Es cierto que las mujeres est\u00e1n muy bien posicionadas en los premios de literatura de ciencia ficci\u00f3n. Es cierto que son autoras de best sellers que no tienen problema en vender. Pero a la hora de las recopilaciones y antolog\u00edas, las mujeres desaparec\u00edan radicalmente. Desde que Asimov muri\u00f3 y dej\u00f3 de recopilar a los premios Hugo en 1992, parec\u00eda que nadie se hab\u00eda molestado en incorporar a autoras. Incluso cuando eran mujeres editoras, parec\u00eda que prefer\u00edan quedarse con las historias masculinas.\n\u00a1La historia se estaba reescribiendo, dejando a las mujeres fuera!\nIntent\u00f3 localizar a editores de escritoras ya fallecidas y encontr\u00f3 que algunos se niegan a reeditar. A pesar de un \u00e9xito garantizado, parece que el inter\u00e9s y la inversi\u00f3n van a escritores masculinos. Se encontr\u00f3 tambi\u00e9n con mucha cr\u00edtica en contra de escritoras porque, o bien no escriben como mujeres (como le dijeron a la misma Kathryn), o bien escriben demasiado desde el punto de vista femenino (como preocuparse de qu\u00e9 pasa con la menstruaci\u00f3n).\nAs\u00ed que no importa si las escritoras de ciencia ficci\u00f3n son galardonadas. No importa si al ser publicadas son \u00e9xito de ventas. Al final la historia se reescribe y acaban siendo ninguneadas.\nCon la consecuencia directa de que, gente que no conoce de primera mano a estas autoras (porque no seguimos los premios Hugo, porque no leemos las revistas especializadas) y somos simplemente lectores \u00e1vidos, ni siquiera tenemos acceso a estas escritoras.\n","permalink":"https:\/\/delawen.com\/2017\/12\/d%C3%B3nde-est%C3%A1n-las-mujeres-de-la-ciencia-ficci%C3%B3n\/","summary":"Me gusta leer ciencia ficci\u00f3n. He devorado sagas e historias sueltas y tengo el kindle a reventar. Pero, en este <a href=\"https:\/\/delawen.com\/2017\/06\/la-evolucion-feminista\/\">despertar feminista<\/a>, un d\u00eda me di cuenta de que no segu\u00eda a ninguna autora. Eran todo hombres. \u00bfD\u00f3nde estaban las escritoras de Ciencia Ficci\u00f3n? \u00bfPor qu\u00e9 no me hab\u00eda cruzado con ninguna? As\u00ed que me puse a rebuscar entre interminables listados de antolog\u00edas y recopilaciones. Y acab\u00e9 comprando <a href=\"https:\/\/www.amazon.es\/Women-Futures-Past-Classic-Stories-ebook\/dp\/B01K5KCTL2\">un libro recopilatorio que parec\u00eda ser lo que andaba buscando: una recopilaci\u00f3n de autoras que luego podr\u00eda usar para seguir buscando m\u00e1s libros interesantes<\/a>.","title":"\u00bfD\u00f3nde est\u00e1n las mujeres de la Ciencia Ficci\u00f3n?"},{"content":"Una de las cosas que m\u00e1s me ha sorprendido en mi andadura feminista es hasta qu\u00e9 punto todas hemos tenido una evoluci\u00f3n m\u00e1s o menos parecida. Con nuestros triggers particulares, nuestras situaciones y nuestras epifan\u00edas, la evoluci\u00f3n es siempre parecida, cada una con sus tiempos y su velocidad particular.\nUn d\u00eda, de alguna forma, algo nos hace tomar conciencia de que no queremos ser lo que se supone que la sociedad espera de nosotras. Como dec\u00eda aquella, yo soy el m\u00e9dico con el que mis padres quer\u00edan que me casara. No hace falta tener a un hombre al lado para poder ser nosotras mismas. Quiero ser independiente.\nPero eso choca frontalmente con tu entorno. Toda la presi\u00f3n es para convertirse en una mujer florero, en un adorno, en el anexo de alguien. Incluso pasas por esa fase del &ldquo;yo no soy como ellas&rdquo;, como si la culpa fuera de las otras mujeres. Quieres diferenciarte. Intentas borrar todo rastro rosa de tu vida. Que se note que esa no eres t\u00fa.\nVayas a donde vayas, siempre hay problemas. Porque nadie espera tu comportamiento, nadie espera tu forma de ser. En el momento en el que te sales del gui\u00f3n, todo el mundo se te pone en contra. Eres la loca del co\u00f1o que protesta por todo. Parece que nunca est\u00e1s contenta.\nHasta que descubres a las otras feministas. A otras mujeres que les pasa lo mismo que t\u00fa, que no encajan. Es m\u00e1s, \u00a1es que ninguna encajamos en ese modelo! Te reconcilias con el rosa, con el arreglarte. Te reconcilias con ser t\u00fa misma, exactamente como t\u00fa quieras ser. Ni lo que espera de ti la sociedad, ni lo contrario. Reclamas tu espacio y en ese espacio s\u00f3lo dejas entrar a quien t\u00fa quieras.\nY a base de reforzar tu posici\u00f3n, en alg\u00fan momento, haces las paces contigo misma. A partir de entonces, todo es mucho m\u00e1s sencillo. La sororidad entra en tu vida. Miras a las otras a los ojos y te ves a ti misma.\nPorque ahora ya, has roto con el machismo y puedes ser t\u00fa misma. Cuando quieras. Como quieras.\n&ldquo;My definition of freedom is knowing who you are, and then being it. No matter what anyone else is doing. And naked parties of course.&rdquo;\nP!nk\n","permalink":"https:\/\/delawen.com\/2017\/06\/la-evoluci%C3%B3n-feminista\/","summary":"Una de las cosas que m\u00e1s me ha sorprendido en mi andadura feminista es hasta qu\u00e9 punto todas hemos tenido una evoluci\u00f3n m\u00e1s o menos parecida. Con nuestros triggers particulares, nuestras situaciones y nuestras epifan\u00edas, la evoluci\u00f3n es siempre parecida, cada una con sus tiempos y su velocidad particular.","title":"La evoluci\u00f3n feminista"},{"content":"A\u00f1o tras a\u00f1o, la GeoCamp se consolida como el geosarao imprescindible para hacer brainstorming sobre las \u00faltimas novedades en geocosas.\nPublicado originalmente en\u00a0el blog de GeoInquietos Sevilla.\nLa foto de grup del Geocamp ES 2016 a Barcelona #geocampes pic.twitter.com\/H44a413tM0\n\u2014 Geo Inquiets (@geoinquiets) 22 de octubre de 2016\nTodo el mundo tiene sus cinco minutos de fama, incluso si no llevas nada preparado, raro ser\u00e1 que no participes en alguna discusi\u00f3n.\nBattery just about to die so this concludes my #geocampes tweeting. Here&rsquo;s the remaining lineup pic.twitter.com\/3eRxBt5NsF\n\u2014 Ed Freyfogle (@freyfogle) 22 de octubre de 2016\n\u00bfEn serio todav\u00eda hay alguien que no conozca el Libro Libre de SIG Libre? Pues s\u00ed, los hay.\n4,29\u20ac \u00a1que me lo quitan de las manos, ni\u00f1a! #geocampes https:\/\/t.co\/ZRoZlXz1Kt @volayaf\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nDatos libres \u00bfSientes que deber\u00edas darle un empuj\u00f3n a tu karma pero no eres capaz ni de abrir el ordenador para ayudar con HOTOSM? Pues tambi\u00e9n tenemos una soluci\u00f3n para ti: el tinder de los mapas:\n#geocampes https:\/\/t.co\/zEFLC9XjSS, para seleccionar y descartar zonas habitadas pic.twitter.com\/FPyAzXQYhp\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nApunta bien este nombre: Mapillary. Si no lo conoc\u00edas, ya est\u00e1s tardando. Son la vanguardia del mapeo, la colaboraci\u00f3n y la interpretaci\u00f3n de datos para construir modelos 3D. Y m\u00e1s.\nOpenSfM librer\u00eda para crear nubes de puntos obtenidas de fotos #mapillary #geocampes pic.twitter.com\/aAzukK0RhR\n\u2014 wladimir szczerban (@bolosig) 22 de octubre de 2016\nSegmentaci\u00f3n sem\u00e1ntica por @mapillary. Detecci\u00f3n autom\u00e1tica de elementos en mapa ? #geocampes pic.twitter.com\/FnQ9jvYplc\n\u2014 Pau Yanez (@yabolb) 22 de octubre de 2016\nTuvimos incluso apariciones et\u00e9reas de seres mitol\u00f3gicos.\n&ldquo;Si dices tres veces #postgis delante del espejo, aparece @pwramsey&rdquo; #geocampes @oriolbx\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nTecnolog\u00edas libres La fuerte presencia de Carto en la GeoCamp no es casualidad: es que su nuevo Builder merec\u00eda un hueco destacado.\n#confieso que de pronto le tengo mucho m\u00e1s respeto a @CARTO #geocampes ya no es un postgis con interfaz bonita. Nunca m\u00e1s.\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nIncluso la charla m\u00e1s sesuda puede ser divertida, siempre y cuando lo pongas en el t\u00edtulo.\n#geocampes @CARTO @postgis pic.twitter.com\/4tAcAaveke\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nLas mapping parties son cosa del pasado, ahora lo que se lleva es el mapeo \u00e1gil:\n#geocampes @MoiArcSan @geoinquietossvq hablando de las flashmapmob en @openstreetmapes pic.twitter.com\/bylIBFzkfV\n\u2014 Mar\u00eda Arias de Reyna (@delawen) 22 de octubre de 2016\nEl mapa con la historia del paseo del\u00a0#flashmapmob\u00a0Sevilla\u00a0#geocampes pic.twitter.com\/vbfmNd0z00\n\u2014 wladimir szczerban (@bolosig)\u00a022 de octubre de 2016\nE, incluso, gatitos libres Pero, sobre todo, lo que aprend\u00ed en la GeoCamp es que puedes hablar de lo que te d\u00e9 la gana. Siempre habr\u00e1 alguien que lo encuentre interesante.\nPodemos ponerle un chip a los zombies para mapear el terreno. Que buena idea asi nos ahorrariamos mucho trabajo de campo #geocampes @delawen pic.twitter.com\/n3yOeYtXYU\n\u2014 Mois\u00e9s Arcos (@MoiArcSan) 22 de octubre de 2016\n","permalink":"https:\/\/delawen.com\/2016\/11\/cosas-que-aprend%C3%AD-en-la-geocamp\/","summary":"<p>A\u00f1o tras a\u00f1o, la GeoCamp se consolida como el geosarao imprescindible para hacer brainstorming sobre las \u00faltimas novedades en <a href=\"https:\/\/delawen.com\/2015\/04\/english-siglibre-9-girona\/\">geocosas<\/a>.<\/p>\n<blockquote>\n<p>Publicado originalmente en\u00a0<a href=\"http:\/\/geoinquietos.blogspot.com\/2016\/11\/cosas-que-aprendi-en-la-geocamp.html\">el blog de GeoInquietos Sevilla<\/a>.\nLa foto de grup del Geocamp ES 2016 a Barcelona <a href=\"https:\/\/twitter.com\/hashtag\/geocampes?src=hash\">#geocampes<\/a> <a href=\"https:\/\/t.co\/H44a413tM0\">pic.twitter.com\/H44a413tM0<\/a> &gt; &gt; \u2014 Geo Inquiets (@geoinquiets) <a href=\"https:\/\/twitter.com\/geoinquiets\/status\/789834709236903937\">22 de octubre de 2016<\/a>\nTodo el mundo tiene sus cinco minutos de fama, incluso si no llevas nada preparado, raro ser\u00e1 que no participes en alguna discusi\u00f3n.\nBattery just about to die so this concludes my <a href=\"https:\/\/twitter.com\/hashtag\/geocampes?src=hash\">#geocampes<\/a> tweeting. Here&rsquo;s the remaining lineup <a href=\"https:\/\/t.co\/3eRxBt5NsF\">pic.twitter.com\/3eRxBt5NsF<\/a> &gt; &gt; \u2014 Ed Freyfogle (@freyfogle) <a href=\"https:\/\/twitter.com\/freyfogle\/status\/789832433063583745\">22 de octubre de 2016<\/a><\/p>\n<\/blockquote>\n","title":"Cosas que aprend\u00ed en la GeoCamp"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it. English version is lost.\nPhoto of an asado\nEste a\u00f1o tuve el privilegio de poder asistir a la FOSS4G Argentina 2016, que se celebr\u00f3 en el IGN de Buenos Aires. Qu\u00e9 puedo contaros de Argentina que no sep\u00e1is ya.\nhttps:\/\/www.instagram.com\/p\/BD1thIpqcTI\nPara\u00edso c\u00e1rnico donde los haya.\nhttps:\/\/youtu.be\/NfGjVtvPAXk\nPero contrariamente a lo que parece, no fui s\u00f3lo por la carne. Ten\u00edamos mucho que aprender y compartir en esta FOSS4G Argentina 2016, \u00fanica en Sudam\u00e9rica y probablemente en toda Am\u00e9rica. Hubo asistentes de toda latino Am\u00e9rica, incluso brasile\u00f1os que se esforzaron gratamente por hacerse entender.\nhttps:\/\/twitter.com\/foss4gAR\/status\/717335021695148032\nLa semana comenz\u00f3 con dos talleres de GeoNetwork: uno b\u00e1sico y uno avanzado. Con un nivel algo variado, al taller asistirieron desde usuarios de IDEs hasta desarrolladores avanzados de GeoNetwork. En un ambiente muy acogedor y cercano, pudimos discutir aspectos sobre c\u00f3mo instalar y personalizar GeoNetwork para cada necesidad.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718541457779503105\nLa calidad humana y el nivel tecnol\u00f3gico, como en casi todos los eventos en los que se mezcla OsGeo con GeoInquietos, fueron muy altos. Y la variedad en la tem\u00e1tica fue tambi\u00e9n muy variada. Esta FOSS4G Argentina 2016 sin duda marc\u00f3 un hito.\nDesde Brasil vinieron a contarnos c\u00f3mo integrar R y PostGIS para poder hacer an\u00e1lisis avanzados de datos geogr\u00e1ficos usando herramientas libres.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718173455414345729\nNos encontramos con el portal de datos abiertos de Argentina. Una vez m\u00e1s, nos tropezamos con la burocracia gubernamental que ni siquiera se aclara consigo misma qu\u00e9 datos tienen disponibles. Se abri\u00f3 un interesante debate sobre qu\u00e9 era mejor para almacenar los datos, si CKAN o GeoNetwork.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718430435366346757\nTambi\u00e9n pudimos asistir a una charla de uno de los desarrolladores de LeafletJS hablando sobre el futuro no s\u00f3lo de la librer\u00eda de visualizaci\u00f3n de mapas, sino tambi\u00e9n de Javascript y los navegadores en general. Desde la introducci\u00f3n de HTML5, los avances en tecnolog\u00edas web est\u00e1n yendo bastante deprisa, a veces colisionando con ideas anticuadas sobre c\u00f3mo desarrollar sobre estas plataformas.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718449319116992512\nEl IGN argentino tambi\u00e9n nos sorprendi\u00f3 con una charla acerca del procesamiento de datos con qGIS aplicado a una investigaci\u00f3n pr\u00e1ctica: el deshielo del glaciar ant\u00e1rtico. Y, sobre todo, \u00bfc\u00f3mo posicionar una medida de forma exacta en un lugar tan remoto, donde el GPS es m\u00e1s que dudoso?\nhttps:\/\/twitter.com\/foss4gAR\/status\/718435754247135233\nDesde Ecuador vinieron a contarnos la importancia que tiene no s\u00f3lo que las administraciones p\u00fablicas tengan acceso a datos fiables y actualizados, sino tambi\u00e9n que dichos datos sean accesibles por la ciudadan\u00eda para el control de la corrupci\u00f3n. El caso de Guayaquil, donde cientos de casas se construyeron en una zona altamente insalubre, parece una pel\u00edcula de mafiosos y lobbies luchando contra la ciudadan\u00eda. Una perfecta advertencia no s\u00f3lo sobre el efecto del hombre sobre el medioambiente, sino tambi\u00e9n de la importancia de los datos libres y la transparencia.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718459891279650816\nBoundless nos trajo las \u00faltimas novedades de GeoGig, el repositorio de datos espaciales con control de versiones auspiciado por LocationTech. Sin duda, uno de los proyectos que m\u00e1s dar\u00e1n que hablar en los pr\u00f3ximos a\u00f1os y que actualmente est\u00e1 buscando testeadores para presentar una versi\u00f3n estable.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718465401517117441\nFuimos tambi\u00e9n sorprendidos con una charla que recorr\u00eda todo el hist\u00f3rico de motores gr\u00e1ficos de videojuegos para acabar concluyendo que IndoorGML es s\u00f3lo la reinvenci\u00f3n de la rueda.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718147652744056832\nComo siempre que se auspicia un evento de estas caracter\u00edsticas a trav\u00e9s de una administraci\u00f3n p\u00fablica, no faltaron los ejemplos de Infraestructuras de Datos Espaciales creadas con FOSS. Es bueno descubrir que hay tantas empresas y administraciones p\u00fablicas involucradas en la adopci\u00f3n y evoluci\u00f3n de software libre geoespacial.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718493433342664704\nEl IGN nos mostr\u00f3 su visi\u00f3n particular de c\u00f3mo adoptar software y datos libres en las IDE. Uno de los principales escollos que encontraban a la hora de migrar desde tecnolog\u00edas privativas fue la falta de un tejido empresarial fuerte que fuera capaz de ofrecerles soporte t\u00e9cnico. Indudablemente, les redirigimos al buscador de proveedores de OsGeo.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718500187120017408\nLos descansos fueron muy productivos para hablar con otros asistentes con los mismos intereses. Y no s\u00f3lo de carne sobrevive el argentino: tambi\u00e9n hab\u00eda caf\u00e9.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718086237341528064\nDesde M\u00e9xico nos contaron c\u00f3mo hab\u00edan utilizado herramientas libres para localizar y analizar los programas sociales que se estaban llevando a cabo en diferentes territorios. De esta forma, una vez m\u00e1s, se puede luchar contra la corrupci\u00f3n a\u00f1adiendo m\u00e1s transparencia a los procesos de toma de decisiones gubernamentales sin que ello implique un gasto econ\u00f3mico inasumible.\nLa clave: empoderar a la ciudadan\u00eda para que puedan conocer y controlar mejor la problem\u00e1tica de su entorno.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718091408209522689\nPor supuesto, tambi\u00e9n me toc\u00f3 hablar de GeoNetwork, su evoluci\u00f3n pasada y hacia d\u00f3nde vamos con los desarrollos.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718107807715893248\nNo falt\u00f3 Georchestra, el framework franc\u00e9s que unifica varias tecnolog\u00edas libres GIS (entre ellas GeoNetwork) para ofrecer una soluci\u00f3n sencilla para IDEs.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718135161150418944\nSe present\u00f3 tambi\u00e9n el mapa interactivo de Buenos Aires, creado tambi\u00e9n con software libre y que se basa en\u00a0OpenStreetMap.\u00a0En vez de empezar una cartograf\u00eda de cero, decidieron empezar con los datos de OSM y continuarlos, permitiendo as\u00ed no s\u00f3lo el control din\u00e1mico de dichos datos por parte de los argentinos, sino que todo el trabajo se publicaba en una licencia de libre uso.\nComo podemos entender de estas charlas, la integraci\u00f3n de OSM con los datos gubernamentales en Sudam\u00e9rica est\u00e1 siendo fundamental, con todos los desaf\u00edos que esto plantea: mantener los datos oficiales \u201cestables\u201d y manejar incongruencias de forma transparente al usuario, que no pueda sospechar que el mapa que est\u00e1 utilizando es una mezcla de diferentes fuentes.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718139376174284800\nCartoDB nos sorprendi\u00f3 explic\u00e1ndonos su modelo de negocio basado en un producto completamente libre. Es decir, podr\u00edas instalarte tu propia versi\u00f3n de CartoDB en un servidor propio y utilizar sus mismas herramientas.\nhttps:\/\/twitter.com\/foss4gAR\/status\/718161830124892160\nComo nota curiosa, CartoDB tiene una pol\u00edtica \u00e9tica que les impide hacer negocio con clientes militares y contaminantes.\nAs\u00ed que ya estamos esperando la pr\u00f3xima edici\u00f3n de FOSS4G Argentina con muchas ganas\u2026 cuando se nos pase la intoxicaci\u00f3n de carne, claro.\n","permalink":"https:\/\/delawen.com\/2016\/04\/foss4g-argentina-2016-buenos-aires\/","summary":"<blockquote>\n<p>This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it. <strong>English version is lost<\/strong>.<\/p>\n<\/blockquote>\n<figure>\n    <img loading=\"lazy\" src=\"\/wp-content\/uploads\/2020\/02\/12383376%5F1280329665315641%5F2133372292%5Fn-1080x675-2.jpg\"\n         alt=\"Photo of an asado\"\/> <figcaption>\n            <p>Photo of an asado<\/p>\n        <\/figcaption>\n<\/figure>\n\n<p>Este a\u00f1o tuve el privilegio de poder asistir a la <a href=\"http:\/\/foss4g-ar.org\/\">FOSS4G Argentina<\/a> 2016, que se celebr\u00f3 en el IGN de Buenos Aires. Qu\u00e9 puedo contaros de Argentina que no sep\u00e1is ya.<\/p>\n<p><a href=\"https:\/\/www.instagram.com\/p\/BD1thIpqcTI\">https:\/\/www.instagram.com\/p\/BD1thIpqcTI<\/a><\/p>","title":"FOSS4G Argentina 2016 (Buenos Aires)"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nWe have already seen how to compile and run a basic GeoNetwork instance. Although we know that real developers\u00a0will probably skip this step too, for new developers in GeoNetwork, it will be relief to have an IDE to work with. I know that many GeoNetwork developers use NetBeans or Intellij\u00a0but as I am used to work with Eclipse, that&rsquo;s what we are going to explore on this post.\nFirst of all: Eclipse has better support for Maven projects on each version. So, to avoid headaches, just download the latest eclipse available.Eclipse has many installer tutorials, so I won&rsquo;t stop here explaining how to run eclipse. I will just assume you know how to do it.\nTo run GeoNetwork from eclipse is very very easy. Just right click on the Package Explorer view\u00a0to import -&gt; As Maven Project over the folder you already had cloned on the last post:\nThere is still something Eclipse does not support right about GeoNetwork: we have a classes folder that Eclipse tends to misconfigure. So, go to that folder, right click and remove as source folder. To do this, go to the &ldquo;web-app&rdquo; project and right click on src\/main\/webapp\/WEB-INF\/classes. Select Build Path &gt; Remove From BuildPath.\nThen, completely remove the folder from the source code. Don&rsquo;t worry, it&rsquo;s git, you can recover it later. You can also do this by right-clicking on the folder and selecting Delete. Yes, you are sure you want to delete folder &quot; classes&quot;.\nNow, update as maven project right clicking on the project &ldquo;web-app&rdquo; and selecting Maven &gt; Update Project &hellip;\nOnce this finishes, you can restore the folder we previously removed. Go to the &ldquo;web-app&rdquo; project, right click on src\/main\/webapp\/WEB-INF and select Replace With\u00a0&gt;HEAD Revision. Yes, you are sure.\nCongratulations! You are ready to use Eclipse to modify GeoNetwork.\nBut wait, how do we run GeoNetwork inside Eclipse to be able to debug?\nWe have several approaches here. Remember the jetty command to run GeoNetwork from the console? It is available also inside Eclipse (right click on web-app and Run As &gt; Maven Build) and you can add some maven variables to be able to run in parallel a debug watch to debug your code. You can also set up a Tomcat server inside Eclipse and run GeoNetwork from it. This second option is more easy for beginners, so that&rsquo;s what we are going to do now.\nFirst, you have to create a Tomcat server inside Eclipse. So, search for the &ldquo;Servers&rdquo; tab and right click on it. Select New &gt; Server. You will see a windows offering different types of servers. We will select the Tomcat v.7.0 Server one. You will probably won&rsquo;t have any server runtime environment configured for it, but you can &quot; Add&hellip;&quot; a new one. There are many tutorials [1] [2] for this, so we won&rsquo;t stop here.\nOn the following window, you can select which applications to run. Obviously, you choose the one called &ldquo;web-app&rdquo; and Finish.\nNow, you will have a new Server on the Servers tab. select it (left-click) and click on the green arrow just on the top of that tab. You will see on the &ldquo;Console&rdquo; tab all the output of GeoNetwork starting up. Once it is started, you can enter GeoNetwork the same way as before, using\u00a0http:\/\/localhost:8080\/geonetwork\nHave fun customizing GeoNetwork!\n","permalink":"https:\/\/delawen.com\/2015\/11\/geonetwork-from-scratch-ii-attack-of-the-ides\/","summary":"This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nWe have already seen <a href=\"\/?p=3622\">how to compile and run a basic GeoNetwork instance<\/a>. Although we know that <a href=\"https:\/\/xkcd.com\/378\/\">real developers<\/a>\u00a0will probably skip this step too, for new developers in GeoNetwork, it will be relief to have an IDE to work with. I know that many GeoNetwork developers use <a href=\"https:\/\/netbeans.org\/\">NetBeans<\/a> or <a href=\"https:\/\/www.jetbrains.com\/idea\/\">Intellij<\/a>\u00a0but as I am used to work with Eclipse, that&rsquo;s what we are going to explore on this post.\nFirst of all: Eclipse has better support for Maven projects on each version. So, to avoid headaches, just download the <a href=\"http:\/\/www.eclipse.org\/downloads\/packages\/eclipse-ide-java-ee-developers\/marsr\">latest eclipse available<\/a>.Eclipse has many installer tutorials, so I won&rsquo;t stop here explaining how to run eclipse. I will just assume you know how to do it.\nTo run GeoNetwork from eclipse is very very easy. Just right click on the Package Explorer view\u00a0to <strong>import -&gt; As Maven Project<\/strong> over the folder you already had cloned on the <a href=\"\/?p=3622\">last post<\/a>:","title":"GeoNetwork from Scratch II : Attack of the IDEs"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nLast week I attended the JIIDE conference, that took place here in Sevilla. This is the official conference for both portuguese and spanish spatial data infraestructures. The presentations were diverse and rich in content and there were working groups for INSPIRE and conformance running in parallel.\nTrends on GeoSpatial You could see some trends in how SDIs are evolving through all the Iberian Peninsula.\u00a0Geograma\u00a0explained to us that hiding data behind paywalls or registering sites makes us less compliant. But on the other hand, maybe it doesn&rsquo;t matter because as Jos\u00e9 Fern\u00e1ndez ( IECA) showed us, data is going more and more open and free. Why should someone pay for data generated on a public administration? It has already been payed by taxes and a paywall is just another stone on the way of generating added value to the data. And above all this, every country has a different payment and access system, so it is virtually impossible to query the same data on different countries easily, which was one of the goals for\u00a0INSPIRE.\nTransparency, interoperability, quality, conflation,&hellip; keywords through all the conference. As an example of conflation and reusability, IECA\u00a0was created by the union of the geospatial information department and the statistics department of the government of Andaluc\u00eda. This allows them to localize statistic data that, once the privacy details are removed, can be easily shared. Creative Commons is the main license for all their products.\nSpain On a statal level, now we have the CNIG, who unifies all the data from Spain and allows us to download (or buy) data. Here, the map is not the central issue, but just another product you can use.\nAnd still, there are many things\u00a0INSPIRE\u00a0has yet to solve. There are a lot of abstract requirements the nodes are not sure how to solve. All data has to have quality metadata associated to it, but, is there any quality minimum required for the data? How close the scales should be? What precision? And above all, how are the different public administrations supposed to handle all this without specific financing from Europe? Or what is worst: why do Europe ignore the conclusions reached by several working groups on different countries? Why reinventing the wheel?\nOpen Data on JIIDE There was another subject running through all the conference: why do SDIs have less users than open data portals? Is it because the type of data? Is it because we don&rsquo;t focus on usability? Why do they choose data from worse quality (or not government certified)? It looks like we have to work more on usability and user interaction.\nShould SDI focus on developing applications around the data? Or should they just focus on being a data repository third party companies can query to generate added value? Should we merge with the opendata portals even if that means lose part of the focus on spatial data?\nJavier L\u00f3pez, explained the problem about persistent identifiers. We have to assume that the entities generating data will not be persistent. But their data should survive those entities and we should be able to trace back who created the data and who have been maintaining it. How to achieve this without being too dependent on some specific platform? How to create a standard that survives through the years?\nWe also had the visit of Rodrigo Barriga Vargas ( IPGH) who told us about GeoSUR, an initiative to create, conform and share quality spatial data in America. He told us how lucky we are to have INSPIRE as a gubernamental initiative to force us to follow standards.\nBut the best thing was to see how GeoNetwork is being used more and more and we have happy users advocating that it is the only\u00a0SDI that makes sense. In conclusion, JIIDE is a good conference where to check the state of the art in geospatial!\n","permalink":"https:\/\/delawen.com\/2015\/11\/jiide-2015-sevilla\/","summary":"<blockquote>\n<p>This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.<\/p>\n<\/blockquote>\n<p>Last week I attended the <a href=\"http:\/\/www.jiide.org\/\">JIIDE conference<\/a>, that took place here in Sevilla. This is the official conference for both portuguese and spanish spatial data infraestructures. The presentations were diverse and rich in content and there were working groups for INSPIRE and conformance running in parallel.<\/p>\n<h3 id=\"trends-on-geospatial\">Trends on GeoSpatial<\/h3>\n<p>You could see some trends in how SDIs are evolving through all the Iberian Peninsula.\u00a0<a href=\"http:\/\/www.geograma.com\/\">Geograma<\/a>\u00a0explained to us that hiding data behind paywalls or registering sites makes us less compliant. But on the other hand, maybe it doesn&rsquo;t matter because as Jos\u00e9 Fern\u00e1ndez ( <a href=\"http:\/\/www.juntadeandalucia.es\/institutodeestadisticaycartografia\">IECA<\/a>) showed us, data is going more and more open and free. Why should someone pay for data generated on a public administration? It has already been payed by taxes and a paywall is just another stone on the way of generating added value to the data. And above all this, every country has a different payment and access system, so it is virtually impossible to query the same data on different countries easily, which was one of the goals for\u00a0<a href=\"http:\/\/inspire.ec.europa.eu\/\">INSPIRE<\/a>.<\/p>\n","title":"JIIDE 2015 - Sevilla"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nGeoNetwork, your friendly spatial catalog, never has been an easy software to deal with. But specially after the 3.0 version release, many things have changed. On this series of posts we will try to help new developers start with it.\nGeoNetwork logo\nThe source code is available on a public repository on\u00a0Github. This means that you can clone, fork and propose pushes of your custom changes. If you are not familiar with repositories of code or git, you should check this quick manual.\nMaven and Java It is built using maven version 3+. Therefore, it is written on Java and requires version 7 or more. Can be run both with OpenJDK or the Oracle version.You will need git and maven installed on your local machine to work. There are several ways to install this on your local machine; for example if you have a Debian based OS (like Ubuntu), you can install them with just this command:\nsudo apt-get install maven git Make sure you installed maven version 3!!\n$ mvn &ndash;version\nApache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T18:37:52+01:00)\nMaven home:\u00a0&hellip;.\nRemember that this will also install java on your system. You can check that the version is the right one with the following command:\njava -version So, the very first step once you have your environment set up is clone the repository on your local machine. That can be done on the command line using the following command inside an empty folder where the source code will be populated:\ncd yourEmptyFolder git clone\u00a0https:\/\/github.com\/geonetwork\/core-geonetwork.git git submodule init git submodule update As you can see, all the source code shown on github is also available on your local machine now.\nInternal Structure of GeoNetwork The source code is split on several smaller maven projects. To run it, you have to build all of them and run the project named &quot; web&quot;.\nIf you are familiar to maven, you will probably have guessed that you have to run a package install command on the root folder of the source code. But if you try that, maven will warn you that for building it you need more memory than the default memory provided to maven.\nSo, you will have to export the maven options to increase the memory like this:\nexport MAVEN_OPTS=&#34;-Xmx512M -XX:MaxPermSize=256M&#34; At this point we are not interested in running the tests, so you can skip them using the parameter &ldquo;-DskipTests&rdquo;:\nmvn package install -DskipTests At the end of this build (which can take long, depending on your network connection, as it has many third party libraries), you will see something like this:\n------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:19 min (Wall Clock) [INFO] Finished at: 2015-07-17T10:36:43+01:00 [INFO] Final Memory: 232M\/441M [INFO] ------------------------------------------------------------------------ This will generate a war file you can use in any Java Application Container (server) like Tomcat on web\/target\/geonetwork.war\nRunning GeoNetwork Congratulations! You are ready to run it. To do this, just go to the web folder and run jetty in there:\ncd web; mvn jetty:run After jetty starts, you can see your running spatial catalog by opening a browser and enter to\u00a0http:\/\/localhost:8080\/geonetwork\nContinue in\u00a0Attack of the IDEs\n","permalink":"https:\/\/delawen.com\/2015\/10\/geonetwork-from-scratch-i-the-phantom-catalog\/","summary":"<blockquote>\n<p>This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.<\/p>\n<\/blockquote>\n<p><strong>GeoNetwork, <a href=\"https:\/\/delawen.com\/2012\/10\/que-es-geonetwork\/\">your friendly spatial catalog,<\/a><\/strong> never has been an easy software to deal with. But specially after the <a href=\"\/?p=3380\">3.0 version release<\/a>, many things have changed. On this series of posts we will try to help new developers start with it.<\/p>\n<p>The source code is available on a public repository on\u00a0<strong><a href=\"https:\/\/github.com\/geonetwork\/core-geonetwork\">Github<\/a><\/strong>. This means that you can clone, fork and propose pushes of your custom changes. If you are not familiar with repositories of code or git, you should check <a href=\"https:\/\/try.github.io\/levels\/1\/challenges\/1\">this quick manual<\/a>.<\/p>\n","title":"GeoNetwork From Scratch I : The Phantom Catalog"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nThe 9th SIGLibre conference in Girona starts with bad news: no wifi. But that didn&rsquo;t stop us to talk about geo free stuff.\nSIGLibre Topics Almost all the plenary talks touched topics like smart citizens, open data, crowd data, crowd sourcing,&hellip; It is quite clear this is an emerging subject that we are going to use more and more. But, is this really a business market or is this just something to research and contribute to the community?\nMalcolm Bain - IdLawPartners &ldquo;Open core, dual licensing, master subscription, commercial open source product specialists - mucha jerga para hablar de c\u00f3mo hacer dinero con Open source: Hablemos de sus aspectos legales&rdquo;\nWhat makes a software free is not the code: it is the license. And that&rsquo;s what is important. But Malcolm hasn&rsquo;t come here to talk about licenses or patents, but about business with free software. We need to find the added value for open software so we are able to sell it. The problem is: this added value has nothing to do with FOSS. FOSS is freaky, geeky, sneaky,&hellip; How can we mix this two concepts? Where is the value position?\nThe added value for FLOSS based business is the legal part. Open source license grants you access, modify and distribute the source code, so you can &ldquo;physically&rdquo; fix the bugs yourself, get a local IT supplier to support you (or support yourself) and share that support across a community. You can also have your own agenda on the versions you use. There is an unlimited license to use your free software on the life cycle you want, you don&rsquo;t depend on third parties company&rsquo;s planning.\nAnd most important: you can check the code you are being sold. No seller can cheat you selling software that doesn&rsquo;t do what it needs to do.\nStrategies to sell free software There are many strategies to sell free software:\nDual License: two types of licenses for the same code: private or free. Open Core: free core but extensions are payed. Subscription strategy: you sell the technical support only. Product specialist: revenues from services (maintenance and consulting). Consulting services strategy: pure service model. Hosted strategy: SaaS, cloud. Platform providers: for example, Openstack hosting. Legal services: consulting legal services. The free software is an investment on the long run, which is something that capitalists investors usually don&rsquo;t like. That&rsquo;s why free software is going to win: because there are no capitalists investors that want to get their interests back.\nWe live in a world that is designed, built and run by Open Source software. Don&rsquo;t forget it! Specially on SIGLibre.\nAlberto Labarga - NavarraBioMed &ldquo;Periodismo de datos y la visualizaci\u00f3n de datos abiertos&rdquo;\nAlberto works on health and medical services based on free software and free hardware. As a sidenote: he mentioned that all gis software he knew was free, so it looks like we are doing marketing stuff right. He talked about open data and how to display it. Sometimes we focus too much on technology and not on how our users perceive it. Right now, everyone claims to be doing big data visualization, but very few people has real access to big data databases. So, there is a lot of fuzzy smoke on this topic.\nFrom the crowd data perspective, there are many interesting projects like #adoptaUnSenador or #adoptaUnCorrupto, where spanish government obscured PDFs about incomings and wealth of politicians were crowd-parsed. There are other projects, like @jjelosua&rsquo;s &ldquo;Espa\u00f1a en llamas&rdquo;, which conflates all data about fires in Spain. As this kind of projects appeared, many tools were also developed to help this type of jobs. Transparency comes hand by hand with this projects, like visualizing budget spent on each public administration.\nThe biggest problem with opendata right now is that there is a lot of public data still not published. And what is published is usually static or not on a useful format. Spain (and Europe) still have to follow UK on this topic and open more data so more apps and use cases can be developed.\nHe had an amazing presentation where he presented more use cases I can write on a summary here. Only on SIGLibre.\nIrene Compte - Exploradora y aventurera tecnol\u00f3gica &ldquo;Open Smart cities: mitos y realidades&rdquo;\nIrene did an interactive theatre presentation showing his view about how this smartcity concept started and evolved. She has been working on this topic since the very beginning of the concept and that made her have a very close experience.\nVictor Olaya - Boundless &ldquo;Algunas ideas sobre m\u00fasica, literatura y mapas&rdquo;\nClosing plenaries, Victor Olaya enphasizes the need to do good maps. We have a lot of technical people working on maps, building maps. But, do they have some studies about it? Are they prepared to present data the best way? We assume that all maps are used the same way all across the world. And that we can use almost the same style for all usecases. All this assumptions only complicates things to the user in the end.\nEd Parsons - Google &ldquo;Where is the Cathedral and the Bazaar : some musings on openness, ecosystems and bringing geo to the web&rdquo;\nAt the end of the day, as a closing plenary, we had Ed Parsons, from Google, who talked about what is his view on future hits on geospatial. Appart from his insistence on using the word &ldquo;open&rdquo; instead of &ldquo;free&rdquo; or &ldquo;libre&rdquo; (they are difficult non-marketable words, he said), there is a very clear position on Google trying to go further on their attempt to control what people do. &ldquo;Only if you want, the choice to have a mobile phone is yours&rdquo;, as he clearly states. But is this true? Can someone live on our society without using mobile phones?\nFor example, Google is working on backpacks to map inside buildings as their streetview cars map cities. This way, they will have more detailed information about where people are and what they do. They claim it is for offering more detailed services. I don&rsquo;t doubt it but, where is intimacy going? Will new generations know what is to have a private space where they don&rsquo;t need to pose? Where they can relax because no-one is watching? Are we coming closer to a 1984 Big Brother based on companies instead of Government? Will that may be even worse, even if the company&rsquo;s motto is &ldquo;don&rsquo;t be evil&rdquo;?\nA lot of questions to answer. Maybe on next SigLibre we will answer them?\n","permalink":"https:\/\/delawen.com\/2015\/04\/siglibre-9-girona\/","summary":"<blockquote>\n<p>This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.<\/p>\n<\/blockquote>\n<p>The <a href=\"http:\/\/www.sigte.udg.edu\/jornadassiglibre\/\">9th SIGLibre conference in Girona<\/a> starts with bad news: no wifi. But that didn&rsquo;t stop us to talk about geo free stuff.<\/p>\n<h2 id=\"siglibre-topics\">SIGLibre Topics<\/h2>\n<p>Almost all the plenary talks touched topics like smart citizens, open data, crowd data, crowd sourcing,&hellip; It is quite clear this is an emerging subject that we are going to use more and more. But, is this really a business market or is this just something to research and contribute to the community?<\/p>","title":"SIGLibre 9, Girona"},{"content":"Estas \u00faltimas Jornadas SIGLibre de Girona han girado en torno a servicios cloud y datos abiertos. Desde el apote\u00f3sico inicio con las ponencias plenarias, con parte destacada de Sergi Morales ( ExportosenTI), el resto de las charlas han ido rodando todas en el mismo tema. Algunas quiz\u00e1s un poco m\u00e1s cr\u00edticas, como F. Puga desde CartoLab cuando nos pidi\u00f3 que no olvid\u00e1ramos que no todo el mundo tiene acceso global a internet, y que muchos millones de personas, las cuales no tienen nuestro nivel tecnol\u00f3gico, tambi\u00e9n tienen necesidades GIS.\nOtra gran cuesti\u00f3n que se ha levantado en estas jornadas ha sido, de la mano de Malcolm Bain, cuales son los l\u00edmites legales de los servicios de almacenamiento de datos en la nube, qu\u00e9 podemos esperar y exigir y hasta qu\u00e9 punto, desde la perspectiva del proveedor de servicios, tenemos que ofrecer un m\u00ednimo de nivel de servicio. Resulta sin duda sorprendente aprender que algunos de los contratos que aceptamos en servicios muy conocidos (como correo electr\u00f3nico web o hosting) son, sencillamente, ilegales.\nLa batalla del software libre ya est\u00e1 ganada, ahora queda la batalla de la libertad y privacidad de los datos.\nTambi\u00e9n ha resultado una delicia ver el enfrentamiento dial\u00e9ctico entre varios de los ponentes, como cuando Javier de la Torre ( Cartodb) arremeti\u00f3 contra OGC o las IDE. Sin duda un tema que, aunque no coincido completamente con su opini\u00f3n, es algo a debatir y mejorar. \u00bfDeber\u00edan intentar los IDE hacerse m\u00e1s amigables para acercarse al usuario o es suficiente con ser un repositorio de datos?\nEl jueves por la tarde, Geocat tuvo sesi\u00f3n doble entre varias charlas muy centradas en los metadatos y su importancia en los IDE. Primero presentamos r\u00e1pidamente qui\u00e9nes \u00e9ramos y qu\u00e9 hac\u00edamos, centr\u00e1ndonos sobre todo en GeoNetwork y Bridge, mencionando tambi\u00e9n nuestro futuro GeoCat Live. Y justo antes de terminar el d\u00eda, un taller de 30 minutos para presentar GeoNetwork, justo antes de dar paso a la primera reuni\u00f3n de geoinquietos nacionales.\nEs dif\u00edcil resumir en un s\u00f3lo art\u00edculo toda la tremenda dimensi\u00f3n alcanzada en estas jornadas. Mucho optimismo, muchas ganas de seguir trabajando y, sobre todo, la certeza de que estamos en el camino correcto, apoyando el software y los datos libres, centr\u00e1ndonos en la parte social de nuestro trabajo. El viernes, casi para finalizar, Javier S\u00e1nchez orient\u00f3 la recta final de las jornadas hacia este tema, hablando de las empresas sociales, las cuales no s\u00f3lo tienen una cuenta de resultados econ\u00f3mica sino tambi\u00e9n social.\nEn resumen, las Jornadas SIGLibre Girona son sin duda el Evento SIG(en may\u00fasculas) que cualquier hispano hablante deber\u00eda tener en cuenta si quiere estar al d\u00eda de las \u00faltimas novedades.\nThe main theme of this\u00a0Jornadas SIG Libre de Girona\u00a0has been cloud services and open data. Since the apotheosic beginning, with an outstanding speech of\u00a0Sergi Morales\u00a0( ExportosenTI), the rest of the conference has been running around the same theme. Some of them maybe more critical, like the one of\u00a0F. Puga from\u00a0CartoLab\u00a0when he asked us not to forget undevelopment zones where not everyone has internet access and millions of people, which doesn&rsquo;t have our tech level, also have GIS needs.\nAnotheer interesting theme of this conference came by the hand of\u00a0Malcolm Bain, who told us about the legal limits of data cloud services, and what can we expect and demand and to what extent, from the cloud service provider, we have to offer a minimum service level. It is undoubtely surprising to learn that some of the contracts we accept on very well known services (like web mail or hosting) are, in fact, ilegal.\nThe battle of free software is ended, now we have to battle on freedom and privacy of data.\nIt has also been delightful to see the debate between some speakers, like when\u00a0Javier de la Torre\u00a0( Cartodb)\u00a0talked against OGC or the government repositories of data. Undoubtfully a theme which, although I don&rsquo;t fully agree, needs some discussion and improvement. Should government repositories of data become more useer friendly or should they remain just as repository of data?\nOn thursday evening, Geocat\u00a0had a double session between speeches very focused on metadata and the importance of governmment spatial portals. We first focused mostly on\u00a0GeoNetwork\u00a0and\u00a0Bridge, talking also about our future\u00a0GeoCat Live. and, just before ending the day, a workshop of 30 minutes to present GeoNetwork, which has followed by the first national meeting of geoinquietos.\nIt is hard to summarize in only one article all the huge dimension reached on this conference. A lot of optimism, willing to keep working and, most of all, the certainty that we are on the right path, helping free software and free data, focusing on the social part of our work. On Friday, almost to finish,\u00a0Javier S\u00e1nchez\u00a0oriened the end of the conference to this theme, talking about social companies, who have not only an economic result but also a social one.\nIn the end the Jornadas SIGLibre Girona are undoubtely the GIS Event (capital letters) to which every spanish speaker should take into account to be in contact with latest GIS news.\n","permalink":"https:\/\/delawen.com\/2013\/03\/jornadas-siglibre-girona-vii\/","summary":"<p>Estas \u00faltimas Jornadas SIGLibre de Girona han girado en torno a servicios cloud y datos abiertos. Desde el apote\u00f3sico inicio con las ponencias plenarias, con parte destacada de <a href=\"https:\/\/twitter.com\/sergim\">Sergi Morales<\/a> ( <a href=\"https:\/\/www.expertosenti.com\/\">ExportosenTI<\/a>), el resto de las charlas han ido rodando todas en el mismo tema. Algunas quiz\u00e1s un poco m\u00e1s cr\u00edticas, como <a href=\"https:\/\/twitter.com\/fpuga\">F. Puga<\/a> desde <a href=\"https:\/\/cartolab.udc.es\/\">CartoLab<\/a> cuando nos pidi\u00f3 que no olvid\u00e1ramos que no todo el mundo tiene acceso global a internet, y que muchos millones de personas, las cuales no tienen nuestro nivel tecnol\u00f3gico, tambi\u00e9n tienen necesidades GIS.<\/p>","title":"Jornadas SIGLibre Girona VII"},{"content":"Ayer estuve en mi primer betabeers, donde present\u00e9:\u00a0GeoNetwork : domesticando una jaur\u00eda de metagatos.\nmetagatos\n","permalink":"https:\/\/delawen.com\/2012\/12\/geonetwork-domesticando-una-jaur%C3%ADa-de-metagatos\/","summary":"<p>Ayer estuve en mi primer <a href=\"https:\/\/betabeers.com\/event\/vi-betabeers-sevilla-13-diciembre-2012-547\/\">betabeers<\/a>, donde present\u00e9:\u00a0<a href=\"\/2012\/10\/que-es-geonetwork\/\">GeoNetwork<\/a> <a href=\"https:\/\/delawen.github.com\/geonetwork-domesticando-una-jauria-de-metagatos\">: domesticando una jaur\u00eda de metagatos<\/a>.<\/p>\n<figure>\n    <img loading=\"lazy\" src=\"\/wp-content\/uploads\/2019\/08\/metagato.jpg\"\n         alt=\"metagatos\"\/> <figcaption>\n            <p>metagatos<\/p>\n        <\/figcaption>\n<\/figure>","title":"GeoNetwork: domesticando una jaur\u00eda de metagatos"},{"content":"GeoNetwork\u00a0is a server side application that allows you to maintain a geographic referenced metadata catalogue. This means: a search portal that allows to view metadata combined with maps.\nGeoNetwork logo\nBased on Free and Open Source Software, it strictly follows different standards for metadata, from Inspire to OGC. It implements the CSW interface to be able to interact with generic clients looking for data. It also has built-in harvesters to connect to other servers and populate data.\nThis has allowed GeoNetwork to expand to a lot of organizations. For example: the swiss geoportal\u00a0or the\u00a0brasilian one, not forgetting the\u00a0New zealander. GeoNetwork is the most used open sourced spatial catalog in the world. You can find it in most of the public administrations that use free and open source software.\nThe catalogue deploys on a java application container (like\u00a0tomcat\u00a0or\u00a0jetty). It works over the Jeeves\u00a0framework. Jeeves is based on XSLT transformation server library. This allows a powerful development of interfaces, for humans (HTML) or machines (XML). Therefore, it makes metadata from GeoNetwork to be easily accessible by different platforms.\nRecently half-refactored to Spring and AngularJS, GeoNetwork has a REST API and an event hook system to make extensions and customizations easier.\n","permalink":"https:\/\/delawen.com\/2012\/10\/what-is-geonetwork\/","summary":"<p>GeoNetwork\u00a0is a server side application that allows you to maintain a geographic referenced metadata catalogue. This means: a <a href=\"https:\/\/geonetwork-opensource.org\/\">search portal<\/a> that allows to view metadata combined with maps.<\/p>\n<figure>\n    <img loading=\"lazy\" src=\"\/wp-content\/uploads\/2019\/08\/geonetwork.jpg\"\n         alt=\"GeoNetwork logo\"\/> <figcaption>\n            <p>GeoNetwork logo<\/p>\n        <\/figcaption>\n<\/figure>\n\n<p>Based on <a href=\"\/2015\/10\/geonetwork-from-scratch-i-the-phantom-catalog\/\">Free and Open Source Software<\/a>, it strictly follows different standards for metadata, from Inspire to OGC. It implements the CSW interface to be able to interact with generic clients looking for data. It also has built-in harvesters to connect to other servers and populate data.<\/p>","title":"What is GeoNetwork?"},{"content":"These past few weeks have been chaotic and as an exercise to seat and to drop anchor, I would like to make a brief summary of my job change.\nWhy? metagato\nMy main motivation to stop working on Emergya, despite the huge human and technical quality has been:\nThe current situation\u00a0in Spain doesn&rsquo;t allow us to perform interesting projects, forcing companies to focus only on survival, with all the friction and discomfort that this generates. The challenge . And this, I think, is the main motivation. The enormous challenge of context switching to a new company, with a way of working so similar and yet so different. I need to see the world, learn, drink from other sources. Five years in Emergya have been wonderful, but I began to feel that it was becoming too small for me. Big fish on small pond or small fish on the ocean? GeoCat(s) . Can somebody refuse the possibility of becoming a geo-cat? Could there be a step beyond this? Can anyone not want to work with metacats (metadata, impossible to translate)? Of course, it has not been an easy decision. To me, Emergya is, and always will be, the company that received me openly and helped me take my first steps working, strengthening my belief that open source is the right path. Like it or not, Emergya is part of me and the title of &ldquo;ex-emergyana&rdquo; cannot be taken away from me.\nNext stop But it was a step that I had to take. So I jumped into the pool, and after a week of making contact, I have no doubt that it was the right decision. GeoCat has an impressive welcoming team and its development roadmap is really fascinating. So I guess from now on I will talk less about route calculation and more about metadata and interoperability (which doesn&rsquo;t mean I will abandon routing).\nNext stop: GeoNetwork.\n","permalink":"https:\/\/delawen.com\/2012\/10\/from-emergya-to-geocat\/","summary":"<p>These past few weeks have been chaotic and as an exercise to seat and to drop anchor, I would like to make a brief summary of my job change.<\/p>\n<h2 id=\"why\">Why?<\/h2>\n<figure>\n    <img loading=\"lazy\" src=\"\/wp-content\/uploads\/2019\/08\/metagato.jpg\"\n         alt=\"metagato\"\/> <figcaption>\n            <p>metagato<\/p>\n        <\/figcaption>\n<\/figure>\n\n<p>My main motivation to stop working on <a href=\"https:\/\/universo.emergya.es\/espacios\/marias\" title=\"Universo Emergya\">Emergya<\/a>, despite the huge human and technical quality has been:<\/p>\n<ul>\n<li>The current situation\u00a0in Spain doesn&rsquo;t allow us to perform interesting projects, forcing companies to focus only on survival, with all the friction and discomfort that this generates.<\/li>\n<li>The <strong>challenge<\/strong> . And this, I think, is the main motivation. The enormous challenge of context switching to a new company, with a way of working so similar and yet so different. I need to see the world, learn, drink from other sources. Five years in Emergya have been wonderful, but I began to feel that it was becoming too small for me. <a href=\"https:\/\/www.imdb.com\/title\/tt0319061\/quotes\" title=\"Big Fish\">Big fish on small pond or small fish on the ocean?<\/a><\/li>\n<li><strong>GeoCat<\/strong>(s) . Can somebody refuse the possibility of becoming a geo-cat? Could there be a step beyond this? Can anyone not want to work with metacats <em>(metadata, impossible to translate)<\/em>?<\/li>\n<\/ul>\n<p>Of course, it has not been an easy decision. To me, Emergya is, and always will be, the company that received me openly and helped me take my first steps working, strengthening my belief that open source is the right path. Like it or not, Emergya is part of me and the title of &ldquo;ex-emergyana&rdquo; cannot be taken away from me.<\/p>","title":"From Emergya to GeoCat"},{"content":"Sometimes I find technologies and free software that pleasantly surprise me. Not only because of its use, but because the impact it can cause. This is the case of GNU Solidario, or GNU Health, recently awarded by the FSF for their solidary contribution.\nGNU Health Logo\nThis software is basically a free and open source platform for managing medical data such as patient records, test results, diagnoses,\u2026 Everything any hospital need and use to offer their services.\nHowever, most surprising of all is that GNU Health was born inside a mind of a young computer scientist from Canarias, Luis Falcon. Often, you don&rsquo;t have to look far away to find talent that can change the world. We are so used to see foreign names that we don&rsquo;t realize the talent is really close.\n","permalink":"https:\/\/delawen.com\/2012\/06\/gnu-health-the-most-solidary-free-and-open-source-software\/","summary":"<p>Sometimes I find technologies and free software that pleasantly surprise me. Not only because of its use, but because the impact it can cause. This is the case of <a href=\"https:\/\/blog.gnusolidario.org\/2012\/06\/gnu-health-version-16-liberada.html\">GNU Solidario, or GNU Health<\/a>, <a href=\"https:\/\/www.europapress.es\/islas-canarias\/noticia-free-software-foundation-otorga-canario-luis-falcon-premio-mejor-proyecto-social-2011-20120327143023.html\">recently awarded by the FSF<\/a> for their solidary contribution.<\/p>\n<figure>\n    <img loading=\"lazy\" src=\"\/wp-content\/uploads\/2019\/08\/GNUHealthISO.png\"\n         alt=\"GNU Health Logo\"\/> <figcaption>\n            <p>GNU Health Logo<\/p>\n        <\/figcaption>\n<\/figure>\n\n<p>This software is basically a free and open source platform for managing medical data such as patient records, test results, diagnoses,\u2026 Everything any hospital need and use to offer their services.<\/p>","title":"GNU Health - The most solidary free and open source software"},{"content":"Annotations on the code or decorators have become very common. They allow the programmer to add additional useful information about how to improve the code or change how to compile \/ run a particular class. They are a Java extension to allow aspect-oriented programming.\nWe have three types of annotations based on the moment of usage:\nInformation for the Compiler These annotations\u00a0allow the compiler to\u00a0indicate\u00a0whether or not to\u00a0ignore errors and\u00a0warnings\u00a0or what to do\u00a0with them.\u00a0If you&rsquo;ve\u00a0worked with a\u00a0Java\u00a0IDE (like eclipse) probably you would have\u00a0used this type of\u00a0annotations. For example, you can use @Override\u00a0on\u00a0a function to\u00a0indicate that you are\u00a0overwriting\u00a0a method defined on\u00a0a parent class.\nThis\u00a0annotation is\u00a0completely optional, but\u00a0allows both the\u00a0compiler\u00a0and the developer\u00a0to check\u00a0that they are indeed overwriting existing hierarchical functionality.\nFor example:\npublic class Parent { public void do(){ System.out.println(&#34;Parent&#34;); } } public class Son extends Parent{ @Override public void do(){ System.out.println(&#34;Son&#34;); } } Compiler-time and deployment-time processing These annotations\u00a0allow\u00a0the compiler\u00a0to add\u00a0extra information about how to generate the code. By adding\u00a0or modifying functionality\u00a0from that in the source code you can alter how a class behaves. Also to create\u00a0new classes\u00a0(based on\u00a0a file\u00a0descriptor), etc &hellip;\nThese annotations will only be visible\u00a0at this point. They are not compiled to the .class files. Therefore they are not available at\u00a0runtime.\nRuntime Annotations You can use this annotations on runtime and they work on a very similar way as an interface.\nLet&rsquo;s see an example on how to create a Runtime Annotation and how can we use it. The annotation named MyAnnotation can be applied to elements oftype field:\nimport java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyAnnotation { } Now we can create an annotated class by this annotation:\npublic class myObject { @MyAnnotation public String field; } This way, we can check by reflection if an object has an annotated field on any part of the code:\nClass&lt;?&gt; res = objeto.getClass(); for (Field f : res.getFields()) { if (f.isAnnotationPresent(MyAnnotation.class)) { System.out.println(&#34;OK&#34;); } } More Information:\nOracle&rsquo;s Tutorial Practical Example ","permalink":"https:\/\/delawen.com\/2012\/04\/annotations-and-decorators-in-java\/","summary":"<p>Annotations on the code or decorators have become very common. They allow the programmer to add additional useful information about how to improve the code or change how to compile \/ run a particular class. They are a Java extension to allow <a href=\"https:\/\/en.wikipedia.org\/wiki\/Aspect-oriented_programming\" title=\"POA\">aspect-oriented programming<\/a>.<\/p>\n<p>We have three types of annotations based on the moment of usage:<\/p>\n<h2 id=\"information-for-the-compiler\">Information for the Compiler<\/h2>\n<p>These annotations\u00a0allow the compiler to\u00a0indicate\u00a0whether or not to\u00a0ignore errors and\u00a0warnings\u00a0or what to do\u00a0with them.\u00a0If you&rsquo;ve\u00a0worked with a\u00a0<a href=\"\/2010\/07\/alta-concurrencia-en-java\/\">Java<\/a>\u00a0IDE (like <a href=\"https:\/\/eclipse.org\/\">eclipse<\/a>) probably you would have\u00a0used this type of\u00a0annotations. For example, you can use <strong>@Override<\/strong>\u00a0on\u00a0a function to\u00a0indicate that you are\u00a0overwriting\u00a0a method defined on\u00a0a parent class.<\/p>","title":"Annotations and Decorators in Java"},{"content":"These are the notes I took on the GeoServer\u00a0workshop\u00a0at the last gvSIG Conference.\nData Directory It is important to change the settings of the\u00a0geoserver_data_dir in the web.xml file to keep the data each time you restart the application container (like Tomcat). It is also good to check out the other settings as it contains interesting facts such as the type of projections to be used or the size of the cache. There are configurable data on the fly and data not configurable on the fly.\nLet&rsquo;s try adding some data sources to generate the layers. To add a\u00a0shapefile, you have to copy the file in the same physical server machine. To include the shapefile in GeoServer, look for the option of adding a new shapefile datastore type. If you use the location &ldquo;file: data \/&hellip;&rdquo; you use a relative uri to geoserver. You can also search using the &ldquo;Browse&rdquo; and use absolute paths.\nWarning: Do not you give permission to any user on the configuration interface because they can see all the physical hard disk in this type of dialog.\nMemory Mapped Buffers It is best to use memory mapped buffers (unless you use Windows) if you have enough RAM, then you will avoid continuous access to physical disk. Also, it is best to reproject from native to declared projection. If the shapefile is very big, calculate the bounding box take some time. This does not happen in real databases where spatial indexes.\nGeoServer allows you to insert watermarks in your data (for example to use OpenStreetMap).\nWhen you use database connections, you should check the validate connection option, because you never know when the connection is going to crash.\nGeoWebCache GeoWebCache\u00a0allows, on the latest version of GeoServer, to set up easily which layers will be cached.\nYou can use data which varies through time, for example for storms and hurricanes. On the database table, you will have a column for time. You can also use elevation data, but then you have to use it with Google Earth. The interesting thing is that, once you have the data, some hipothetical free visor can be used to support it&hellip;\n","permalink":"https:\/\/delawen.com\/2012\/03\/notes-on-the-geoserver-workshop\/","summary":"<p>These are the notes I took on the GeoServer\u00a0workshop\u00a0at the last <a href=\"\/2012\/02\/apuntes-del-taller-gvsig-2-0\/\">gvSIG Conference<\/a>.<\/p>\n<h2 id=\"data-directory\">Data Directory<\/h2>\n<p>It is important to change the settings of the\u00a0<em>geoserver_data_dir<\/em> in the <em>web.xml<\/em> file to keep the data each time you restart the application container (like Tomcat). It is also good to check out the other settings as it contains interesting facts such as the type of projections to be used or the size of the cache. There are configurable data on the fly and data not configurable on the fly.<\/p>","title":"Notes on the GeoServer Workshop"},{"content":"This are the notes that I took over\u00a0gvSIG 2.0\u00a0on the latests\u00a0Jornadas GvSIG.\nPre-requisites Java Eclipse Ant (should) Maven\u00a0(should) gvSIG\u00a0(this is recursive :)) The main advantage of gvSIG 2.0 is that you can create a new plugin without knowing how does gvSIG work or having to compile it.\u00a0We already have a gvSIG installation that deploys the binaries to the workspace. But we don&rsquo;t have to change the source code. Unless, of course, something doesn&rsquo;t work (bugs) or we have to add some new functionality to the core. Better if you don&rsquo;t touch it, ask the developers and they will take care.\nCreating the workspace With the binary, there is a wizard which creates an Eclipse workspace with a default template. That leaves all set up but to compile our extension. It also includes a wizard to easily generate installables. These wizards are accessible through the application, at the application menu.\nOrg.gvsig.tools is the basic infrastructure library to develop plugins. The main functionality is focused on the registration of extension points, utilities to separate API, implementations, SPI (service provider), and monitoring tasks (which in version 1.0 used to freeze the application). This library also supports events, persistence, etc &hellip;\ngvSIG Plugins A library is a jar. When our application contains the jar, org.gvsig.tools prepares and initializes this library within the core. The classes in the library implement the interface Library (AbstractLibrary).\nThe managers (PluginsManager) is the entry point of the features.\u00a0They are like factories (singletons) (at least one per library) that raises the request of the functionality included in the library.\u00a0It also saves the configuration of the module.\nThe locators (PluginsLocator) allow to register implementations of managers.We can recover a specific manager API.\u00a0&ldquo;Give me the manager of this library.&rdquo;\nA Plugin is a piece that adds a functionality: buttons and toolbars, menu options, data providers and types of documents. Andami has not evolved much since version 1.x. Andami is the framework for the plugins.\nThe plugin will always have at least two files:\nconfig.xml indicating the classes that implement the plug-in units and menus package.info indicating the version, name, build, &hellip; of the plugin. gvSIG Extensions An extension (IExtension) is a set of tools associated with a plugin inside a toolbar or menu and they work together. A group of plugins, you may say. The extension that implements ExclusiveUIExtension specify what tools are or not visible, without touching the core code.\nTo create a new plugin, we make use of the tool menu generation of plugins available from the development version. This generates the workspace automatically and installs the plugin from which we generated the plugin. If you have no development release, you will have to compile the sources.\nYou should be starting a plugin with the wizard while reading this notes or you will be lost.\nThe plugin consists of two maven projects: org.gvsig.plugin and org.gvsig.plugin.app. org.gvsig.plugin provide the functionality of the library independently of gvSIG (business logic). May have library dependencies, but should be able to operate without having to open the application. That is, it requires nothing of Andami, for example. In org.gvsig.plugin.app.mainplugin (within org.gvsig.plugin.app) we will implement the functionality.\nThe &ldquo;api&rdquo; packages should contain interfaces and the &ldquo;impl&rdquo; packages should contain implementations.\nNow the workspace is ready to work with Eclipse if we import the project with the maven plugin. If we took an appropriate template to generate the plugin sources, almost all the work is done (except for the exact business logic of our plugin).\nFinal Advices It is important to have a java project to test our plugin with its own main, without having to start gvSIG. Also it is recommended that the library has unit tests. That is, we can make an application with the full power of gvSIG, but without using gvSIG itself, ie as if it was a powerful library GIS. Conclusion: if we do well, we could even use our plugin into another no application &hellip; as Gofleet.\nEach plugin contains own installer, which created by a wizard inside the application.\n","permalink":"https:\/\/delawen.com\/2012\/02\/notes-of-the-gvsig-2.0-workshop\/","summary":"<p>This are the notes that I took over\u00a0<a href=\"https:\/\/joinup.ec.europa.eu\/software\/gvsig-desktop\/description\">gvSIG 2.0<\/a>\u00a0on the latests\u00a0<a href=\"https:\/\/jornadas.gvsig.org\">Jornadas GvSIG<\/a>.<\/p>\n<h2 id=\"pre-requisites\">Pre-requisites<\/h2>\n<ul>\n<li>Java<\/li>\n<li>Eclipse<\/li>\n<li>Ant (should)<\/li>\n<li><a href=\"https:\/\/maven.apache.org\">Maven<\/a>\u00a0(should)<\/li>\n<li>gvSIG\u00a0(this is recursive :))<\/li>\n<\/ul>\n<p>The main advantage of gvSIG 2.0 is that you can create a new plugin without knowing how does gvSIG work or having to compile it.\u00a0<a href=\"\/2012\/01\/guia-para-compilar-gvsig-2-0\/\" title=\"Gu\u00eda para compilar gvSIG 2.0\">We already have a gvSIG installation that deploys the binaries to the workspace<\/a>. But we don&rsquo;t have to change the source code. Unless, of course, something doesn&rsquo;t work (bugs) or we have to add some new functionality to the core. Better if you don&rsquo;t touch it, ask the developers and they will take care.<\/p>","title":"Notes of the gvSIG 2.0 workshop"},{"content":"I am proud to share with you the steps to compile gvSIG 2.0, which I discovered thanks to some fellows developers, whom I met thanks to the latests Jornadas GvSIG.\nAlthough you can find a full guide on the official documentation, this simple steps will let you customize and compile your own gvSIG2.0 version without much trouble.\nFirst, you have to install some basic dependencies:\n#apt-get install maven2 subversion\nNext, we create a folder in which we can work:\n$mkdir gvSIG; cd gvSIG\nOnce we have the basic workspace, we download the source code:\n$svn co https:\/\/joinup.ec.europa.eu\/svn\/gvsig-desktop\/branches\/v2_0_0_prep\/build\/\nBefore compiling anything, we prepare a basic configuration file:\n$ cat &gt; ~\/.gvsig.platform.properties &lt;&lt; EOF native_platform=linux native_distribution=all native_compiler=gcc4 native_arch=i386 native_libraryType=dynamic export native_classifier=${native_platform}-${native_distribution}-${native_compiler}-${native_arch}-${native_libraryType} EOF The next code can be written on the .bashrc file of your \/home folder, but we can also execute it on the console we are working with.\n$if [ -f &quot;${HOME}\/.gvsig.platform.properties&quot; ] then . ${HOME}\/.gvsig.platform.properties export MAVEN_OPTS=&quot;-Xmx256M -XX:MaxPermSize=64m\u00a0-Dnative-classifier=${native_classifier}\u00a0-Dnative-platform=${native_platform}&quot; else export MAVEN_OPTS=&quot;-Xmx256M -XX:MaxPermSize=64m&quot; fi\nOnce we have the environment ready, we do the first compilation with maven. Patience, it may take long.\n$mvn install\nNow that we have our first maven compilation, we proceed to use ant to end up setting up the environment. This command will access to the online repository of gvSIG to download the rest of the source code and will compile and generate gvSIG.\n$ant svn.checkout.all\nOnce we have the environment ready, we proceed to prepare the flavor of gvSIG we are going to use. On his post we will use the standard version of gvSIG:\n$cd projects\/gvsig-standard $ant svn.checkout.all\nPatience, much more patience.\n$mvn install\nAnd it&rsquo;s done. The application is on the products folder. To execute it, we execute the script gvSIG.sh.\nIf at the start we get the &ldquo;command java not found&rdquo; error, we have to specify the environment variable JAVA_HOME:\n$export JAVA_HOME=\/usr\/lib\/jvm...\nNow you can use your own customized version.\n","permalink":"https:\/\/delawen.com\/2012\/01\/how-to-compile-gvsig-2.0\/","summary":"<p>I am proud to share with you the steps to compile gvSIG 2.0, which I discovered thanks to some <a href=\"https:\/\/forge.osor.eu\/users\/jzarzoso\/\">fellows developers<\/a>, whom I met thanks to the <a href=\"https:\/\/jornadas.gvsig.org\/\">latests Jornadas GvSIG<\/a>.<\/p>\n<p>Although you can find a full guide on the <a href=\"https:\/\/www.gvsig.org\/web\/projects\/gvsig-desktop\/docs\/devel\/gvsig-devel-guide\/2.0.0\">official documentation<\/a>, this simple steps will let you customize and compile <a href=\"\/2012\/02\/apuntes-del-taller-gvsig-2-0\/\">your own gvSIG2.0 version<\/a> without much trouble.<\/p>\n<p>First, you have to install some basic dependencies:<\/p>\n<p><code> #apt-get install maven2 subversion<\/code><\/p>\n<p>Next, we create a folder in which we can work:<\/p>","title":"How to compile gvSIG 2.0"},{"content":"Although this has already been discussed previously , I wanted to give another lap to the issue DNIe under Linux. And what the hell! After spending one day and a half on the subject, I wanted to leave the tutorial available somewhere, if I have to do it again.\nWhen I started I was recommended that I tried on Windows first and then if it works, I should try again on Linux. And although I followed the advice, it turns out I am definitely worse in Windows than in Linux (I ended up having to reinstall Windows again), so I tried again where I felt comfortable and understood what I do.\nBasically I have been following this three blog posts:\n\\* DNIe on Ubuntu\n\\* Linux DNIe Squeeze\n\\* DNIe on Ubuntu\nCheck your base libraries The first thing I discovered is that one should not rely on the libraries from the repositories (I use Debian Squeeze). So I installed bare hands OpenSC and its dependencies.\nFirst thing to do is to download the latest libraries available on the website of dnielectronico, in my case:\n$ wget https:\/\/www.dnielectronico.es\/descargas\/PKCS11_para_Sistemas_Unix\/opensc-dnie_1.4.8_amd64_lenny.tar $ tar xvf opensc-dnie_1.4.8_amd64_lenny.tar $ cd opensc-dnie_1.4.8_amd64_lenny And also download the dependencies that are no longer available for Debian Squeeze:\n$ wget https:\/\/ftp.es.debian.org\/debian\/pool\/main\/libt\/libtool\/libltdl3_1.5.26-4+lenny1_amd64.deb $ wget https:\/\/ftp.es.debian.org\/debian\/pool\/main\/o\/openct\/libopenct1_0.6.14-3_amd64.deb Installing the dnie drivers When this is done, we can begin to install the dnie drivers:\n# dpkg-i *. deb libltdl3 # dpkg-i *. deb libopenct # dpkg-i *. deb libopensc2 # dpkg-i *. deb opensc_ # apt-get install pinentry-qt4 # dpkg-i *. deb opensc-dnie And then we make sure not to screw it in future updates, blocking the libraries:\n# echo libopenct1 hold | dpkg - set-selections # echo opensc hold | dpkg - set-selections # echo libopensc2 hold | dpkg - set-selections Now comes the nice part, where we see that everything works &hellip; or not:\n$ sudo apt-get install pcscd pcsc-tools $ pcsc_scan PC \/ SC device scanner V 1.4.16 (c) 2001-2009, Ludovic Rousseau Compiled with PC \/ SC lite version: 1.5.5 Scanning present readers ... 0: Gemplus GemPC Twin 00 00 Mon Sep 5 20:01:11 2011 Reader 0: Gemplus GemPC Twin 00 00 Card state: Card inserted, [...] Electronic DNI (Spanish electronic ID card) https:\/\/www.dnielectronico.es $ opensc-tool-l [opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library &#39;\/ usr\/lib64\/libopensc-dnie.so&#39;: invalid module version [Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load &#39;dnie&#39;. Readers Known about: Driver Name Nr Pcsc 0 00 00 Gemplus Twin GemPC $ opensc-tool-a [opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library &#39;\/ usr\/lib64\/libopensc-dnie.so&#39;: invalid module version [Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load &#39;dnie&#39;. Using With A card reader: Gemplus GemPC Twin 00 00 [Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit [Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU 3b: 7f: 38:00:00:00:6 a: 44:4 e: 49:65:10:02:4 c: 34:01:13:03:90:00 Delawar @ FZ18E: ~ $ opensc-tool-n [opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library &#39;\/ usr\/lib64\/libopensc-dnie.so&#39;: invalid module version [Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load &#39;dnie&#39;. Using With A card reader: Gemplus GemPC Twin 00 00 [Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit [Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU Unidentified card Not that easy At this point, we learn that we have screwed up somewhere in the installation. Now OpenSC is waiting for a version of the module that is not what we have installed. Do not panic, there is a solution . We &ldquo;only&rdquo; have to create a module that uses the module installed. But deceiving OpenSC by saying it is another version.\nMy module version is 1.0.4 and opensc the 0.11.13-1.1, you must change this numbers with yours:\n$ mkdir \/ tmp \/ dnie $ cd \/ tmp \/ dnie $ cp \/ usr\/lib\/libopensc-dnie.so.1.0.4 libopensc-dnie.so.1.0.4_orig Edit a file:\n$ vi patch.c char * version_maligna = &#34;0.11.13-1.1&#34;; sc_driver_version char * () { version_maligna return; } Patching the library and place it where it belongs:\n$ gcc-fpic -g-c-Wall patch.c $ objcopy - redefine-sym-libopensc sc_driver_version = orig_sc_driver_version libopensc-dnie.so.1.0.4 dnie.so.1.0.4_orig $ chmod + x libopensc-dnie.so.1.0.4 $ gcc-shared-Wl,-soname, libwrapper-dnie.so libopensc-dnie.so.1.0.4 patch.o-o-dnie.so.1.0.0 libwrapper $ sudo cp-dnie.so.1.0.0 libwrapper libopensc-dnie.so.1.0.4 \/ usr \/ lib $ sudo ldconfig Now that we have the library, we make opensc to use it in the file \/ etc \/ opensc \/ opensc.conf, replacing module = \/ usr \/ lib \/ libopensc-dnie.so, by &lt; em&gt; module = \/ usr \/ lib \/ libwrapper-dnie.so, . ``\nNow opensc recognizes our electronic ID:\n$ opensc-tool -l Known Readers about: Driver Name Nr Pcsc 0 00 00 Gemplus Twin GemPC How to use the browser or an application to sign has already been extensively described in other manuals, including the official pages of the electronic ID. ``\n","permalink":"https:\/\/delawen.com\/2011\/09\/dnie-dealing-with-the-electronic-id-card\/","summary":"<p>Although <a href=\"https:\/\/universo.emergya.es\/espacios\/fontanon\/dnie-y-lector-acr38-bajo-linux\">this has already been discussed previously<\/a> , I wanted to give another lap to the issue DNIe under Linux. And what the hell! After spending one day and a half on the subject, I wanted to leave the tutorial available somewhere, if I have to do it again.<\/p>\n<p>When I started I was recommended that I tried on Windows first and then if it works, I should try again on Linux. And although I followed the advice, it turns out I am definitely worse <a href=\"https:\/\/img850.imageshack.us\/img850\/1720\/img20110901182926.jpg\">in Windows than in Linux (I ended up having to reinstall Windows again), so I tried again where I felt comfortable and understood what I do.<\/a><\/p>","title":"DNIe: Dealing with the electronic ID card"},{"content":"I&rsquo;ve been thinking for a while about writing about the importance of open data, but is with the advertising given to Google Map Maker when I really understood the urgency of the matter.\nCan you imagine a\u00a0country with so poor geographic data that even the government doesn&rsquo;t known which cities and towns do they have? How could they invest on roads, literacy, drinking water or even know that there are people who live there? How could they collect taxes or&hellip; count votes in elections!? Can you imagine that a battalion of soldiers use maps that are wrong and establish a base in the nearest country? An absurdity that happened recently on the border between [Nicaragua and Costa Rica](https:\/\/www. elmundo.es\/america\/2011\/04\/19\/noticias\/1303174548.html), which almost causes an international conflict.\nPublic Data If institutions publish their data and leave it to free access, anyone can verify the accuracy of the data and may suggest changes or corrections. But while this data remains locked away in dusty archives, the same mistakes will be made over and over again. We are not talking about sensitive data or national security, we discuss data that anyone who is physically present at the location can check whether it is correct.\nBut it is important not only that the open data is freely available. It is also important to be free in their use. I gain nothing by looking at a map on page X of the Public Service if I can not use the data I am seeing. Seeing the traffic before you leave home can help you, but if my GPS can not use that information to guide me through the best path, it is useless.\nWell, someone may say, if the source of the data (for example, the government) provide all services we will be needing, we don&rsquo;t need a free use of the data. It is not enough. Why? Because open data may have myriad of uses. It is a newly opened market to explore.\nPrivate Map Providers But, how does it benefit the private map provider? Are we suggesting to have data servers and offer free data without charging for its use? Is it the culture of all free? Of course not, nobody in their right mind would ever ask for this. The private provider can get great benefits releasing their data (others than charging for services based on this data) :\nThe first benefit is straightforward: if you manage a large community, the cost of renovation and expansion of their data will be greatly reduced. Vendors like TomTom or Nokia begin to understand the importance of these updates from their own users. OpenStreetMap is another clear example and direct the power of users: a source of geographic data that can compete (and win) on Google Maps or Bing created entirely and only by a combination of free data supplied by its users.\nThe second advantage is perhaps more complex to understand because it is not so straightforward. Ignoring all the classic advantages of freedom, there is still one more: You can always charge for commercial or intensively use. Although it does not benefit you at the beginning, if your data is good enough, sooner or later someone will think of some utility.\nGoogle Map Maker Some hustlers will have, at this point, if this is not what Google Map Maker does. Do they not collect updates of their users, giving them maps for free and charging only for intensive or commercial? No. To begin with, data isn&rsquo;t free. This means that if you collaborate with Google Map Maker and update their maps and tomorrow you want to use these data to set up a commercial service, you couldn&rsquo;t do it without going through a convoluted series of licenses. However, if instead of working with Google Map Maker, you contributed with a free platform for geographic data, you will be able to use this data on your service without problems.\nDoes this mean that I think Google Map Maker is useless? Neither. Probably someone will find a good use. But whatever the intended use, you can always get at least the same functionality with OpenLayers, OpenStreetMap data and free PNOA and the [Cadastre](https:\/\/blog-idee.blogspot.com\/2011\/04\/ service-of-mass-download-de.html) (recently released). So why use an exclusive platform when you can use a free platform much more powerful?\nBut Google is good, someone may say, it offers free, quality data. Sure, and no doubt. But never forget that Google, beyond any good intentions, remains a business. And finally, the top priority of a company is to generate business to survive. And if Google has to change its way, to get ride of free offerings that are inconsistent with their business, they will. In fact, they already do it.\n","permalink":"https:\/\/delawen.com\/2011\/04\/the-importance-of-open-data\/","summary":"<p>I&rsquo;ve been thinking for a while about writing about the importance of open data, but is with the advertising given to Google Map Maker when I really understood the urgency of the matter.<\/p>\n<p>Can you imagine a\u00a0<a href=\"https:\/\/www.upc.edu\/ccd\/accions-al-sud\/presentacions_projectes\/2010\/mapping-bolivia\">country<\/a> with so poor geographic data that even the government doesn&rsquo;t known which cities and towns do they have? How could they invest on roads, literacy, drinking water or even know that there are people who live there? How could they collect taxes or&hellip; count votes in elections!? Can you imagine that a battalion of soldiers use maps that are wrong and establish a base in the nearest country? An absurdity that happened recently on the border between [Nicaragua and Costa Rica](https:\/\/www. elmundo.es\/america\/2011\/04\/19\/noticias\/1303174548.html), which almost causes an international conflict.<\/p>","title":"The importance of open data"},{"content":"When facing high concurrency applications, we often find a number of generic problems. In this article I will focus on the problems of resources (CPU and memory). For now on, I will focus on the most typical and most direct solutions.\nWhen we discover threads and the advantages of parallel processing it can happen that we end up abusing their use. We have a lot of threads (100 \u00bf? 1000?) simultaneously, and the processor will be jumping from one to another without stopping, not letting them finish, no matter how fast is their real excution. And over time there will be more and more threads only slowing down the process. To the cost of execution of each thread, we must consider also the added cost of creating and destroying threads. It can can become significant when we talk about so many threads at once.\nHigh Concurrency with the Thread Pool Pattern\nThreads: the holy grail In this case, the first method that we think of is the Thread Pool Pattern . This pattern will limit the number of threads running at the same time.\nInstead of creating new threads, we create tasks, which are piled. Also, we have a pool of threads that will work picking these up and running as soon as possible. A classic example of this thread can be found on SwingWorker. If we want to implement bare hands our own pattern, we should take a look at the interface ExecutorService.\nIf you have a background thread that is making heavy use of processor, but we do not mind slowing it down for performance, we can use the command [sleep](https:\/\/download-llnw.oracle.com\/javase\/tutorial\/ essential \/ concurrency \/ sleep.html) ( Thread.sleep (...)) to periodically release the thread processor, allowing other threads to run faster .\nThis is useful for threads running in maintenance mode, which must be kept running but do not have to respond in real time. Another way to temporarily stop a running thread while another is using the method join ( Thread.Join ()), which makes a thread wait until another thread ends. Although more useful if we have a clearly higher priority thread than another, it is not viable if we can not have a reference to a higher priority thread from the lowest priority to tell which thread has to wait.\nHigh Concurrency issues But the high turnout is not given only by the use of the processor. It may be that multiple threads need access to large amounts of information almost simultaneously. These threads will not only be repeating the information in memory but often will be repeating the entire process of extracting that information.\nThis problem is usually solved in the majority of data access libraries (mostly database). For example, we have ehcache , which uses threads to store information ( [Thread-Specific Storage Pattern](https:\/\/en.wikipedia. org \/ wiki \/ Thread-Specific_Storage)). This way, access and storage of this information is shared. Thus decreasing both the memory usage required and the processor time required to extract and shape information. As the threads wants to process this information, they will be asking ehcache for the data, which will optimize these hits.\nTo improve this solution have the concurrent collections. This allow different threads to use the same objects without any problems of concurrency.\nThere are more solutions to improve the high turnout (without going into optimizations to the code itself). But those described here are usually good ideas to start.\nUseful References:\nBrief Article in Spanish Concurrency Pattern Thread Pool Tutorial Java Thread Pool (Oracle) ","permalink":"https:\/\/delawen.com\/2010\/07\/high-concurrency\/","summary":"<p>When facing high concurrency applications, we often find a number of generic problems. In this article I will focus on the problems of resources (CPU and <a href=\"\/2010\/07\/la-memoria-en-java\/\">memory<\/a>). For now on, I will focus on the most typical and most direct solutions.<\/p>\n<p>When we discover threads and the advantages of parallel processing it can happen that we end up abusing their use. We have a lot of threads (100 \u00bf? 1000?) simultaneously, and the processor will be jumping from one to another without stopping, not letting them finish, no matter how fast is their real excution. And over time there will be more and more threads only slowing down the process. To the cost of execution of each thread, we must consider also the added cost of creating and destroying threads. It can can become significant when we talk about so many threads at once.<\/p>","title":"High Concurrency"},{"content":"Sometimes you don&rsquo;t know where to start when you enter the world of GIS programming. Too many libraries, IDEs, but the truth is, everyone assumes you already have a base and everything become chaos. Something is easy as how to develop a map on Java has scarce documentation.\nIf you have absolutely no idea of GIS, I would recommend you start by the Free book of Free GIS by Victor Olaya.\nFor beginners I would recommend that you take a look at a fairly new project aimed at extending Swing ( the default graphics java library) with geographical widgets. In this way, add a map to a Java desktop application would be a task as simple as adding a button or text field.\nOf course, GIS applications have some complexity, a simple display like this is not enough. But it is a good starting point to get familiar with what a map is and what can a developer do.\nWe start with a Java project and add SwingX-WS to its dependencies. Then, the following code would show a window with a simple map:\nes.emergya.gis.examples package; import java.awt.BorderLayout; public class SwingWS { public static void main (String [] args) { Form = new JFrame JFrame (&#34;Map&#34;); JXMapKit JXMapKit jXMapKit1 = new (); jXMapKit1.setDefaultProvider (org.jdesktop.swingx.JXMapKit.DefaultProviders.OpenStreetMaps); jXMapKit1.setDataProviderCreditShown (true); jXMapKit1.setName (&#34;jXMapKit1&#34;) \/ \/ NOI18N jXMapKit1.setAddressLocation(new GeoPosition(41.881944, 39.627778)); form.getContentPane().add(jXMapKit1, BorderLayout.CENTER); form.pack(); form.setVisible(true); } } The tiles of the maps drawn from OpenStreetMap , but is fully configurable for any WMS server.\nSo now you have your map on java.\n","permalink":"https:\/\/delawen.com\/2010\/07\/easy-map-on-java\/","summary":"<p>Sometimes you don&rsquo;t know where to start when you enter the world of GIS programming. Too many libraries, IDEs, but the truth is, everyone assumes you already have a base and everything become chaos. Something is easy as how to develop a map on Java has scarce documentation.<\/p>\n<p>If you have absolutely no idea of GIS, I would recommend you start by the <a href=\"http:\/\/volaya.github.io\/libro-sig\/\">Free book of Free GIS by Victor Olaya<\/a>.<\/p>","title":"Easy map on Java"},{"content":"Although the Observer pattern is implemented natively in Java, sometimes we need to make an event management that suits better our needs when using event listeners.\nSome context The problem of event handling is very simple: We have an object that will be changing its state. Without touching its code, we should be able to \u201chook\u201d to other objects that are pending status changes and act accordingly. This \u201chook\u201d must be turned on and off dynamically at runtime.\nTo implement it we will use a static object, a class and an interface. The static object will be responsible for ensuring the relationships between observers and observables. It will also notify relevant changes to the objects concerned. To pass information during an event we use that class. The interfaces will make the distinction between objects observed and observable objects and any other objects on the application.\nA real example But the best way to see how event listeners works is through an example:\nThe instances of the class will be those that carry MyCustomEvent information to an observable object from the observed object when an event occurs. This class should contain all the necessary information on that event. For example, if the event was a mouse click, this class should carry data such as coordinates on the screen or the number of clicks. Specifically, our event class contains only the original object that triggered the event (the observable object).\nimport java.util.EventObject; import java.util.LinkedList; import java.util.List; public class MyCustomEvent extends EventObject { private static final long serialVersionUID = 7383182229898306240L; private final MyCustomListener source; public MyCustomEvent (MyCustomListener OriginalSource) { super (OriginalSource); this.source = OriginalSource; } MyCustomListener public getSource () { this.source return; } } The static object that keeps the relations between observers and observables is MyCustomEventHandler. It is very important to use synchronization methods to avoid concurrency issues in multithreaded applications:\nimport java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MyCustomEventHandler { private static final Log log = LogFactory.getLog(MyCustomEventHandler.class); private static Map &lt;MyCustomListener, Set &gt; = new LinkedHashMap observable &lt;MyCustomListener, Set &gt; (); public static void fire (MyCustomEvent event) { log.trace (&#34;fire (&#34; + event + &#34;)&#34;); try { Observers = getRemarks September (source); if (Observers! = null) { for (final MyCustomListener pl: Observers) { try { pl.fire (event); } catch (Throwable t) { log.error (t, t); } } } } catch (Throwable t) { log.error (t, t); } } private static synchronized September getRemarks (MyCustomListener source) { observables.get return (source); } \/ ** * Register to watch to alert you when observable change * * @ Param observer * @ Param observable * \/ public static synchronized void register (MyCustomListener observer, MyCustomListener observable) { Observers getRemarks September = (observable); if (null == observers) { observers = new HashSet(); } observers.add(observer); observables.put(observable, Observers); } \/ ** * Deregister not become observers to alert you when observable * Modify * * @ Param observer * @ Param observable * \/ public static synchronized void deregister (MyCustomListener observer, MyCustomListener observable) { Observers getRemarks September = (observable); if (null == Observers) { Observers = new HashSet (); } observers.remove (observer); observables.put (observable, Observers); } } Both objects (observable objects as observers) must implement the interface MyCustomListener. This interface requires implementing the function fire(MyCustomEvent event) . In the observable, this function will be responsible for calling MyCustomEventHandler. For observers, this function will be called when the observed object launches an event.\nActually, it would be convenient to separate the interface into two: one for observers and another for observables. If an object wants to be both observer and observed, it may have problems with this system. But for simplicity for the example we have chosen this implementation.\nimport java.util.EventListener; public interface extends EventListener {MyCustomListener public void fire (MyCustomEvent event); } If we have different types of events (similar to how the MouseListener), all we need to do is to expand MyCustomListener interface with all the functionality we want to have:\nimport java.util.EventListener; public interface MyCustomListener extends EventListener { public void fireObjectRecycled (MyCustomEvent event); public void fireObjectRefreshed (MyCustomEvent event); public void fireObjectUpdated (MyCustomEvent event); } So, we might use different classes derived from MyCustomEvent for each of these features.\nWe have to modify the static object MyCustomEventHandler to launch the different events.\nReferences: thread which discusses this type of implementation of Event Handler\n","permalink":"https:\/\/delawen.com\/2010\/07\/personalized-event-listeners-in-java\/","summary":"<p>Although the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Observer_pattern\">Observer<\/a> pattern is implemented natively in <a href=\"\/2010\/07\/la-memoria-en-java\/\">Java<\/a>, sometimes we need to make an event management that suits better our needs when using event listeners.<\/p>\n<h2 id=\"some-context\">Some context<\/h2>\n<p>The problem of event handling is very simple: We have an object that will be changing its state. Without touching its code, we should be able to \u201chook\u201d to other objects that are pending status changes and act accordingly. This \u201chook\u201d must be turned on and off dynamically at runtime.<\/p>","title":"Personalized Event Listeners in Java"},{"content":"One of the major advantages of Java since its first version was that developers didn&rsquo;t have to worry about memory, as Java itself was able to keep it clean and free memory automatically. But any good Java developer should know the basics on how Java handles memory to be prevent memory leaks and bottlenecks.\nTo begin with, Java divides memory into two distinct segments:\nHeap: instances, variables,\u00a0\u2026 Non-Heap\/Perm: code, metadata,\u2026 As the first step to optimize memory in Java, we should focus on the Heap, as it is what we can \u201ccontrol\u201d. The Heap is divided in two generations depending on their lifetime:\nYoung Generation Old Generation Usually the Young generation is composed of local variables and temporary objects. While the older generation contains structures that are needed during the execution like configurations.\nThe younger generation is divided into two:\nEden: This is where objects are created initially Survivor: It&rsquo;s like the limbo through which we pass from the Young to the Old generation. The Garbage Collector The Garbage Collector is the system making sure the memory is clean. It performs two types of periodic tasks:\nMinor Collection: Reviews quickly the younger generation. Major Collection: Reviews all the memory, mainly the older generation. The garbage collector runs at the same time as the normal program execution. Each execution involves a small pause (usually milliseconds) in all the threads that are running at that time. While your application memory remains healthy, the Garbage Collector will limit its actions to minor collections, to not interfere with the flow of the application.\nDifferent memory strategies There are several implementations of the garbage collector, being the most common the Serial Collector. This implementation, as well as being the simplest, uses only one processor. If you&rsquo;re using a more powerful machine with multiple processors and a good amount of physical memory, you can activate the Parallel Collector , which uses multiple CPUs at the same time. This improves the way in which the garbage collector works. It can also parallelize the flow of normal execution of the application.\nFor proper operation and cleaning of memory, we should have little short-lived temporary objects better than long, durable objects. The small temporary objects will stay in the Eden, so they will be collected much earlier and much faster.\nAlso, having unused objects in memory, although they do not disrupt the execution of the program, will slow the execution of the garbage collection. Because you have to process them over and over again to check if they can be deleted.\nAt some point it may seem tempting to force a Garbage Collector implementation calling System.gc(). However, this will force a major collection asynchronously, breaking up all the heuristics of the Garbage Collector and stopping your application while it lasts. It is so discouraged that there is an option in the virtual machine to disable these calls: -XX:+DisableExplicitGC\nReferences To help the task of garbage collection, there are three types of references when defining objects:\nWeak : It does not prevent the GC to clean it. Soft : The GC respects a little and removes the instance only if memory is needed. Useful for caching, but can be misleading. Phantom: Always returns null. The link doesn&rsquo;t really point to the object. Can be used to clear instances before taking the object that binds it. For example we can use WeakHashMap, which works as a HashMap, but using weak references. So, if the key contains an object which is only referenced in the map, it is no longer considered useful and is removed.\n","permalink":"https:\/\/delawen.com\/2010\/07\/how-does-memory-work-on-java\/","summary":"<p>One of the major advantages of Java since its first version was that developers didn&rsquo;t have to worry about memory, as Java itself was able to keep it clean and free memory automatically. But any good Java developer should know the basics on how Java handles memory to be prevent memory leaks and bottlenecks.<\/p>\n<p>To begin with, Java divides memory into two distinct segments:<\/p>\n<ul>\n<li>Heap: instances, variables,\u00a0\u2026<\/li>\n<li>Non-Heap\/Perm: code, metadata,\u2026<\/li>\n<\/ul>\n<p>As the first step to optimize memory in Java, we should focus on the Heap, as it is what we can \u201ccontrol\u201d. The Heap is divided in two generations depending on their lifetime:<\/p>","title":"How does Memory work on Java"},{"content":"Swing JTables of Java by default does not handle frequent updates and a huge number of columns and rows. I created a lighted version of JTable called FastJTable based on the code of the Java Christmas Tree.\nThis implementation is pretty faster when handling huge amounts of data. Consider taking a look at how the memory works if this is your use case.\n\/** * Based on Sun&#39;s CTTable (Christmas Tree): * https:\/\/java.sun.com\/products\/jfc\/tsc\/articles\/ChristmasTree\/ * * @author marias *\/ import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import javax.swing.CellRendererPane; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.plaf.basic.BasicTableUI; import javax.swing.table.TableModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; \/** * Based on CTTable from Christmas Tree: * https:\/\/java.sun.com\/products\/jfc\/tsc\/articles\/ChristmasTree\/ * * @author marias marias@emergya.es *\/ public class FastJTable extends JTable { private static final Log log = LogFactory.getLog(FastJTable.class); private static final long serialVersionUID = -3218140266706898440L; private JScrollPane scrollPane; public FastJTable(TableModel model) { super(model); } public void updateUI() { super.updateUI(); setUI(new FastTableUI(this)); } private static class FastTableUI extends BasicTableUI { public FastTableUI(FastJTable table) { super(); installUI(table); } @Override public void installUI(JComponent c) { \/\/ Overriden to install our own CellRendererPane super.installUI(c); c.remove(rendererPane); rendererPane = new FastCellRendererPane(); c.add(rendererPane); } } \/** * FastCellRendererPane overrides paintComponent to NOT clone the Graphics * passed in and NOT validate the Component passed in. This will NOT work if * the painting code of the Component clobbers the graphics (scales it, * installs a Paint on it...) and will NOT work if the Component needs to be * validated before being painted. *\/ private static class FastCellRendererPane extends CellRendererPane { private static final long serialVersionUID = 4811773663334451913L; private JViewport viewport; public FastCellRendererPane() { super(); } \/\/ Can be ignored, we don&#39;t exist in the containment hierarchy. public void repaint() { } @Override public void paintComponent(Graphics g, Component c, Container p, int x, int y, int w, int h, boolean shouldValidate) { try { if (c == null || !isVisible(new Rectangle(x, y, w, h))) { log.trace(&#34;No lo pintamos (&#34; + c + &#34;)&#34;); return; } \/\/ if (p != null) { \/\/ Color oldColor = g.getColor(); \/\/ g.setColor(p.getBackground()); \/\/ g.fillRect(x, y, w, h); \/\/ g.setColor(oldColor); \/\/ } if (c.getParent() != this) { this.add(c); } c.setBounds(x, y, w, h); \/\/ As we are only interested in using a JLabel as the renderer, \/\/ which does nothing in validate we can override this to do \/\/ nothing, if you need to support components that can do \/\/ layout, \/\/ this will need to be commented out, or conditionally \/\/ validate. if (!(c instanceof JLabel)) c.validate(); \/\/ JComponent jc = (c instanceof JComponent) ? (JComponent) c \/\/ : null; \/\/ jc.setDoubleBuffered(true); \/\/ Don&#39;t create a new Graphics, reset the clip and translate \/\/ the origin. Rectangle clip = g.getClipBounds(c.getBounds()); g.clipRect(x, y, w, h); g.translate(x, y); c.paint(g); g.translate(-x, -y); g.setClip(clip.x, clip.y, clip.width, clip.height); c.setBounds(-w, -h, 0, 0); } catch (Throwable t) { log.error(&#34;Error al pintar el componente de la tabla &#34;, t); } } \/** * We only paint the visible parts of the JTable. * @param rectangle visible * @return if it has to be painted on screen *\/ public boolean isVisible(Rectangle rectangle) { if (viewport == null) return true; Rectangle visRect = viewport.getViewRect(); int xmin = ((Double) rectangle.getMinX()).intValue(); int ymin = ((Double) rectangle.getMinY()).intValue(); int xmax = ((Double) rectangle.getMaxX()).intValue(); int ymax = ((Double) rectangle.getMaxY()).intValue(); return (visRect.contains(new Point(xmin, ymin)) || visRect.contains(new Point(xmax, ymin)) || visRect.contains(new Point(xmin, ymax)) || visRect .contains(new Point(xmax, ymax))); } } } ","permalink":"https:\/\/delawen.com\/2010\/06\/fastjtable\/","summary":"<p>Swing JTables of Java by default does not handle frequent updates and a huge number of columns and rows. I created a lighted version of JTable called FastJTable based on the code of the <a href=\"https:\/\/java.sun.com\/products\/jfc\/tsc\/articles\/ChristmasTree\/\">Java Christmas Tree.<\/a><\/p>\n<p>This implementation is pretty faster when handling huge amounts of data. Consider taking a look at <a href=\"\/2010\/07\/la-memoria-en-java\/\">how the memory works<\/a> if this is your use case.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-gdscript3\" data-lang=\"gdscript3\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/**<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> Based on Sun<span style=\"color:#e6db74\">&#39;s CTTable (Christmas Tree):<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> https:<span style=\"color:#f92672\">\/\/<\/span>java<span style=\"color:#f92672\">.<\/span>sun<span style=\"color:#f92672\">.<\/span>com<span style=\"color:#f92672\">\/<\/span>products<span style=\"color:#f92672\">\/<\/span>jfc<span style=\"color:#f92672\">\/<\/span>tsc<span style=\"color:#f92672\">\/<\/span>articles<span style=\"color:#f92672\">\/<\/span>ChristmasTree<span style=\"color:#f92672\">\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> <span style=\"color:#960050;background-color:#1e0010\">@<\/span>author marias\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>import java<span style=\"color:#f92672\">.<\/span>awt<span style=\"color:#f92672\">.<\/span>Component;\n<\/span><\/span><span style=\"display:flex;\"><span>import java<span style=\"color:#f92672\">.<\/span>awt<span style=\"color:#f92672\">.<\/span>Container;\n<\/span><\/span><span style=\"display:flex;\"><span>import java<span style=\"color:#f92672\">.<\/span>awt<span style=\"color:#f92672\">.<\/span>Graphics;\n<\/span><\/span><span style=\"display:flex;\"><span>import java<span style=\"color:#f92672\">.<\/span>awt<span style=\"color:#f92672\">.<\/span>Point;\n<\/span><\/span><span style=\"display:flex;\"><span>import java<span style=\"color:#f92672\">.<\/span>awt<span style=\"color:#f92672\">.<\/span>Rectangle;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>CellRendererPane;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>JComponent;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>JLabel;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>JTable;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>JViewport;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>plaf<span style=\"color:#f92672\">.<\/span>basic<span style=\"color:#f92672\">.<\/span>BasicTableUI;\n<\/span><\/span><span style=\"display:flex;\"><span>import javax<span style=\"color:#f92672\">.<\/span>swing<span style=\"color:#f92672\">.<\/span>table<span style=\"color:#f92672\">.<\/span>TableModel;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>import org<span style=\"color:#f92672\">.<\/span>apache<span style=\"color:#f92672\">.<\/span>commons<span style=\"color:#f92672\">.<\/span>logging<span style=\"color:#f92672\">.<\/span>Log;\n<\/span><\/span><span style=\"display:flex;\"><span>import org<span style=\"color:#f92672\">.<\/span>apache<span style=\"color:#f92672\">.<\/span>commons<span style=\"color:#f92672\">.<\/span>logging<span style=\"color:#f92672\">.<\/span>LogFactory;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/**<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> Based on CTTable from Christmas <span style=\"color:#a6e22e\">Tree<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> https:<span style=\"color:#f92672\">\/\/<\/span>java<span style=\"color:#f92672\">.<\/span>sun<span style=\"color:#f92672\">.<\/span>com<span style=\"color:#f92672\">\/<\/span>products<span style=\"color:#f92672\">\/<\/span>jfc<span style=\"color:#f92672\">\/<\/span>tsc<span style=\"color:#f92672\">\/<\/span>articles<span style=\"color:#f92672\">\/<\/span>ChristmasTree<span style=\"color:#f92672\">\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> <span style=\"color:#960050;background-color:#1e0010\">@<\/span>author marias marias<span style=\"color:#960050;background-color:#1e0010\">@<\/span>emergya<span style=\"color:#f92672\">.<\/span>es\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>public <span style=\"color:#66d9ef\">class<\/span> FastJTable <span style=\"color:#66d9ef\">extends<\/span> JTable {\n<\/span><\/span><span style=\"display:flex;\"><span>private <span style=\"color:#66d9ef\">static<\/span> final Log log <span style=\"color:#f92672\">=<\/span> LogFactory<span style=\"color:#f92672\">.<\/span>getLog(FastJTable<span style=\"color:#f92672\">.<\/span><span style=\"color:#66d9ef\">class<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>private <span style=\"color:#66d9ef\">static<\/span> final long serialVersionUID <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">3218140266706898440<\/span>L;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>private JScrollPane scrollPane;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>public FastJTable(TableModel model) {\n<\/span><\/span><span style=\"display:flex;\"><span>super(model);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>public void updateUI() {\n<\/span><\/span><span style=\"display:flex;\"><span>super<span style=\"color:#f92672\">.<\/span>updateUI();\n<\/span><\/span><span style=\"display:flex;\"><span>setUI(new FastTableUI(this));\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>private <span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">class<\/span> FastTableUI <span style=\"color:#66d9ef\">extends<\/span> BasicTableUI {\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>public FastTableUI(FastJTable table) {\n<\/span><\/span><span style=\"display:flex;\"><span>super();\n<\/span><\/span><span style=\"display:flex;\"><span>installUI(table);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">@<\/span>Override\n<\/span><\/span><span style=\"display:flex;\"><span>public void installUI(JComponent c) {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> Overriden to install our own CellRendererPane\n<\/span><\/span><span style=\"display:flex;\"><span>super<span style=\"color:#f92672\">.<\/span>installUI(c);\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>remove(rendererPane);\n<\/span><\/span><span style=\"display:flex;\"><span>rendererPane <span style=\"color:#f92672\">=<\/span> new FastCellRendererPane();\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>add(rendererPane);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/**<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> FastCellRendererPane overrides paintComponent to NOT clone the Graphics\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> passed <span style=\"color:#f92672\">in<\/span> <span style=\"color:#f92672\">and<\/span> NOT validate the Component passed <span style=\"color:#f92672\">in<\/span><span style=\"color:#f92672\">.<\/span> This will NOT work <span style=\"color:#66d9ef\">if<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> the painting code of the Component clobbers the graphics (scales it,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> installs a Paint on it<span style=\"color:#f92672\">...<\/span>) <span style=\"color:#f92672\">and<\/span> will NOT work <span style=\"color:#66d9ef\">if<\/span> the Component needs to be\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> validated before being painted<span style=\"color:#f92672\">.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>private <span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">class<\/span> FastCellRendererPane <span style=\"color:#66d9ef\">extends<\/span> CellRendererPane {\n<\/span><\/span><span style=\"display:flex;\"><span>private <span style=\"color:#66d9ef\">static<\/span> final long serialVersionUID <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">4811773663334451913<\/span>L;\n<\/span><\/span><span style=\"display:flex;\"><span>private JViewport viewport;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>public FastCellRendererPane() {\n<\/span><\/span><span style=\"display:flex;\"><span>super();\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> Can be ignored, we don<span style=\"color:#e6db74\">&#39;t exist in the containment hierarchy.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>public void repaint() {\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">@<\/span>Override\n<\/span><\/span><span style=\"display:flex;\"><span>public void paintComponent(Graphics g, Component c, <span style=\"color:#a6e22e\">Container<\/span> p, <span style=\"color:#a6e22e\">int<\/span> x,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">int<\/span> y, <span style=\"color:#a6e22e\">int<\/span> w, <span style=\"color:#a6e22e\">int<\/span> h, boolean shouldValidate) {\n<\/span><\/span><span style=\"display:flex;\"><span>try {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (c <span style=\"color:#f92672\">==<\/span> null <span style=\"color:#f92672\">||<\/span> <span style=\"color:#f92672\">!<\/span>isVisible(new Rectangle(x, y, w, h))) {\n<\/span><\/span><span style=\"display:flex;\"><span>log<span style=\"color:#f92672\">.<\/span>trace(<span style=\"color:#e6db74\">&#34;No lo pintamos (&#34;<\/span> <span style=\"color:#f92672\">+<\/span> c <span style=\"color:#f92672\">+<\/span> <span style=\"color:#e6db74\">&#34;)&#34;<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">return<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> <span style=\"color:#66d9ef\">if<\/span> (p <span style=\"color:#f92672\">!=<\/span> null) {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> <span style=\"color:#a6e22e\">Color<\/span> oldColor <span style=\"color:#f92672\">=<\/span> g<span style=\"color:#f92672\">.<\/span>getColor();\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> g<span style=\"color:#f92672\">.<\/span>setColor(p<span style=\"color:#f92672\">.<\/span>getBackground());\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> g<span style=\"color:#f92672\">.<\/span>fillRect(x, y, w, h);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> g<span style=\"color:#f92672\">.<\/span>setColor(oldColor);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> }\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (c<span style=\"color:#f92672\">.<\/span>getParent() <span style=\"color:#f92672\">!=<\/span> this) {\n<\/span><\/span><span style=\"display:flex;\"><span>this<span style=\"color:#f92672\">.<\/span>add(c);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>setBounds(x, y, w, h);\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> As we are only interested <span style=\"color:#f92672\">in<\/span> using a JLabel as the renderer,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> which does nothing <span style=\"color:#f92672\">in<\/span> validate we can override this to <span style=\"color:#66d9ef\">do<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> nothing, <span style=\"color:#66d9ef\">if<\/span> you need to support components that can <span style=\"color:#66d9ef\">do<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> layout,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> this will need to be commented out, <span style=\"color:#f92672\">or<\/span> conditionally\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> validate<span style=\"color:#f92672\">.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#f92672\">!<\/span>(c instanceof JLabel))\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>validate();\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> JComponent jc <span style=\"color:#f92672\">=<\/span> (c instanceof JComponent) <span style=\"color:#960050;background-color:#1e0010\">?<\/span> (JComponent) c\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> : null;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> jc<span style=\"color:#f92672\">.<\/span>setDoubleBuffered(true);\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> Don<span style=\"color:#e6db74\">&#39;t create a new Graphics, reset the clip and translate<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/\/<\/span> the origin<span style=\"color:#f92672\">.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>Rectangle clip <span style=\"color:#f92672\">=<\/span> g<span style=\"color:#f92672\">.<\/span>getClipBounds(c<span style=\"color:#f92672\">.<\/span>getBounds());\n<\/span><\/span><span style=\"display:flex;\"><span>g<span style=\"color:#f92672\">.<\/span>clipRect(x, y, w, h);\n<\/span><\/span><span style=\"display:flex;\"><span>g<span style=\"color:#f92672\">.<\/span>translate(x, y);\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>paint(g);\n<\/span><\/span><span style=\"display:flex;\"><span>g<span style=\"color:#f92672\">.<\/span>translate(<span style=\"color:#f92672\">-<\/span>x, <span style=\"color:#f92672\">-<\/span>y);\n<\/span><\/span><span style=\"display:flex;\"><span>g<span style=\"color:#f92672\">.<\/span>setClip(clip<span style=\"color:#f92672\">.<\/span>x, clip<span style=\"color:#f92672\">.<\/span>y, clip<span style=\"color:#f92672\">.<\/span>width, clip<span style=\"color:#f92672\">.<\/span>height);\n<\/span><\/span><span style=\"display:flex;\"><span>c<span style=\"color:#f92672\">.<\/span>setBounds(<span style=\"color:#f92672\">-<\/span>w, <span style=\"color:#f92672\">-<\/span>h, <span style=\"color:#ae81ff\">0<\/span>, <span style=\"color:#ae81ff\">0<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>} catch (Throwable t) {\n<\/span><\/span><span style=\"display:flex;\"><span>log<span style=\"color:#f92672\">.<\/span>error(<span style=\"color:#e6db74\">&#34;Error al pintar el componente de la tabla &#34;<\/span>, t);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/**<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> We only paint the visible parts of the JTable<span style=\"color:#f92672\">.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> <span style=\"color:#960050;background-color:#1e0010\">@<\/span>param rectangle visible\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*<\/span> <span style=\"color:#960050;background-color:#1e0010\">@<\/span><span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#66d9ef\">if<\/span> it has to be painted on screen\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">*\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>public boolean isVisible(Rectangle rectangle) {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (viewport <span style=\"color:#f92672\">==<\/span> null)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">return<\/span> true;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\tRectangle visRect <span style=\"color:#f92672\">=<\/span> viewport<span style=\"color:#f92672\">.<\/span>getViewRect();\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">int<\/span> xmin <span style=\"color:#f92672\">=<\/span> ((Double) rectangle<span style=\"color:#f92672\">.<\/span>getMinX())<span style=\"color:#f92672\">.<\/span>intValue();\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">int<\/span> ymin <span style=\"color:#f92672\">=<\/span> ((Double) rectangle<span style=\"color:#f92672\">.<\/span>getMinY())<span style=\"color:#f92672\">.<\/span>intValue();\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">int<\/span> xmax <span style=\"color:#f92672\">=<\/span> ((Double) rectangle<span style=\"color:#f92672\">.<\/span>getMaxX())<span style=\"color:#f92672\">.<\/span>intValue();\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">int<\/span> ymax <span style=\"color:#f92672\">=<\/span> ((Double) rectangle<span style=\"color:#f92672\">.<\/span>getMaxY())<span style=\"color:#f92672\">.<\/span>intValue();\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#66d9ef\">return<\/span> (visRect<span style=\"color:#f92672\">.<\/span>contains(new Point(xmin, ymin))\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t<span style=\"color:#f92672\">||<\/span> visRect<span style=\"color:#f92672\">.<\/span>contains(new Point(xmax, ymin))\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t<span style=\"color:#f92672\">||<\/span> visRect<span style=\"color:#f92672\">.<\/span>contains(new Point(xmin, ymax)) <span style=\"color:#f92672\">||<\/span> visRect\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t<span style=\"color:#f92672\">.<\/span>contains(new Point(xmax, ymax)));\n<\/span><\/span><span style=\"display:flex;\"><span>\t\t}\n<\/span><\/span><span style=\"display:flex;\"><span>\t}\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><\/code><\/pre><\/div>","title":"FastJTable"},{"content":"Si quieres que tu red social funcione, tienes que conocer al p\u00fablico objetivo. Aqu\u00ed hay algunas gu\u00edas c\u00ednicas para conseguir que tu Web Social funcione.\n1.- La gente es ego\u00edsta La gente tiende a querer hablar de s\u00ed mismos en todo momento y lugar. Nada les interesa m\u00e1s que su propia persona. Ofrecerles un perfil con muchos campos y un bot\u00f3n para subir esas fotos, y tambi\u00e9n esas otras fotos es algo indispensable. Si la red social no gira en torno a ellos, no les interesar\u00e1.\nNo hace falta que te preocupes de la inclusividad o la diversidad, ellos crear\u00e1n sus propios guettos.\n2.- La gente es hip\u00f3crita Las Redes Sociales son una manada de borrachos en fase eresmimejoramigo cont\u00ednua. Una Web Social que se precie tiene que tener mecanismos (intercambio de mensajes) para pelotear al pr\u00f3jimo. Si pueden ser mecanismos p\u00fablicos para que todo el mundo vea lo mucho que adoran a sus semejantes, mejor. D\u00e9jales mostrar lo incre\u00edblemente hip\u00f3critas que son.\n3.- La gente est\u00e1 adolescentizada La mayor\u00eda de la gente a\u00fan no pas\u00f3 de esa fase adolescente de querer mimetizarse en un grupo. La Web Social debe permitir al usuario acoplarse a comunidades de usuarios, no importa de lo que traten o si realmente no sirven para nada.\n4.- La gente es tonta Las Web Sociales demasiado complejas no suelen tener \u00e9xito, mayormente porque la gente no sabe usarlas. Simplificar y reducir al m\u00e1ximo las opciones. Nunca subestimes la torpeza del usuario medio, ellos encontrar\u00e1n nuevas formas de romper la interfaz. Puedes esconder algunas features detr\u00e1s de interfaces complejas para premiar a tus usuarios m\u00e1s avispados.\n5.- La gente es prepotente La gente necesita sentirse superior, ya sea protagonizando la portada de una web, haciendo chistes est\u00fapidos o trolleando. Una Web Social que no te permita tus cinco minutos de fama est\u00e1 condenada al fracaso. Da oportunidades a tus usuarios para que se sientan importantes.\n","permalink":"https:\/\/delawen.com\/2009\/01\/dec%C3%A1logo-de-la-web-social\/","summary":"<p>Si quieres que tu red social funcione, tienes que conocer al p\u00fablico objetivo. Aqu\u00ed hay algunas gu\u00edas c\u00ednicas para conseguir que tu Web Social funcione.<\/p>\n<h2 id=\"1--la-gente-es-ego\u00edsta\">1.- La gente es ego\u00edsta<\/h2>\n<p>La gente tiende a querer hablar de s\u00ed mismos en todo momento y lugar. Nada les interesa m\u00e1s que su propia persona. Ofrecerles un perfil con muchos campos y un bot\u00f3n para subir <a href=\"https:\/\/es.facebook.com\/\">esas fotos<\/a>, y tambi\u00e9n <a href=\"https:\/\/www.sexyono.com\/\">esas otras fotos<\/a> es algo indispensable. Si la red social no gira en torno a ellos, no les interesar\u00e1.<\/p>","title":"Dec\u00e1logo de la Web Social"},{"content":" This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.\nLast week I had the privilege to attend\u00a0the main osgeo conference: the FOSS4G. This time it took place on Seoul, Korea. Exotic place I strongly recommend to visit, but better to focus on non-cultural surprises\u00a0on this post.\nIt&rsquo;s impossible to write everything on a single blog post, as it was impossible to assist to all the interesting parallel threads that run on those short five days. But let me guide you through my steps so I can share part of my experience until we get access to the full videos of that awesome week.\nFirst there were the workshops. I have to confess something: my first options for workshops were cancelled. But it doesn&rsquo;t matter, as I had problems deciding on first place. So, I started with the WS02 workshop:\nExploring the Sensor Observation Service Standard Enhanced by IstSOS Special Features Let me summarize it: if you want to work with sensors, take a very close look at IstSOS. Combining PostGIS, Python, GDAL and Apache you get not only a complete sensor service, but a complete sensor data management system. Easy to use, easy to install, easy to everything!\nQuality Assurance is integrated on IstSOS to make sure the sensor doesn&rsquo;t go mad. This process are sometimes done asynchronously to conflate your own sensor data with other sources. It doesn&rsquo;t just return a basic boolean, but a statistic value of confidence based on previous data.\nAnother interesting feature is the virtual sensors, which allows you to create your &ldquo;own&rdquo; &ldquo;sensors&rdquo; based on data from real physical sensors. Useful to conflate data and offer it on a unique endpoint as sensor.\nAs if this workshop wasn&rsquo;t good enough, we got some real arduino and sensors to play with them.\nOnce we finished this amazing workshop, I went to assist Florent Gravin on the GeoNetwork 3 workshop in the afternoon:\nWS08 Build your own data portal using GeoNetwork 3 Besides some Windows issues ( surprise!), I think that the workshop was very successful. Assistants not only built their own user interface style for GeoNetwork, but asked us about advanced features and how to implement\u00a0them.\nAs Florent said: &ldquo;We are the experts of GeoNetwork, so if you have any questions, it is now or never.&rdquo; And we had questions asked.\nJet-lagged day finished after this workshop. So we went to the hotel to try to rest a bit more and start with renewed strength the following day, which I started with:\nWS19 Beyond GeoServer Basics If you already run a\u00a0GeoServer, most of this workshop is already known to you. But if you don&rsquo;t&hellip; bad you missed it! There were a lot of fancy features to play with, like regexp on parameters for sql layers (surprised that very few knew what regexp meant!).\nAnd, of course, WPS already useful in production now. You can even use WPS inside SLD definitions!\nAfter refreshing knowledge on GeoServer, I went for the last workshop:\nWS21 OpenSource 3D GIS Yes, you are right, 3D GIS has too much hype right now. But Oslandia did a great job on this workshop.\u00a0If you don&rsquo;t have experience with 3D, I strongly advise you to try to follow the workshop, posted on github.\nWe even had some docker introduction.\u00a0And the second day was finished, but\u00a0we still had energy to went for the last one. Or some more beers:\nI was already on the first slot of the FOSS4G conference, during the Opening Ceremony, when I first noticed that we talked too much about open instead of free.\nBesides that, Venkatesh made very clear that we need more Geo4All, specially on developing countries.\nVery interesting the national SDI of Korea presentation about the workflow of open source. While I don&rsquo;t fully agree with their vision, it is always refreshing to see new perspectives on this subject. Maybe we should make more clear that free software can have a professional customer support as good as any closed source software. Probably even better in most cases, as there are\u00a0more companies that can offer it.\nInteresting opinion on the difference between FOSS and proprietary software. Not sure I completely agree. #foss4g pic.twitter.com\/x6aNlHRnGL\n\u2014 Bill Nelson (@geo_bill) septiembre 16, 2015\nNow the conference divided on so many threads at the same time that it was impossible to follow them all. QGIS\u00a0(new useful plugins to develop)\u00a0and\u00a0MapServer\u00a0(now faster than ever)\u00a0before lunch and the sensor and crowdsourcing session after lunch. There,\u00a0between the ISA server for indoor spatial data, Apache Spark, Ontologies and CartoDB,\u00a0we presented Cobweb. The day couldn&rsquo;t finish without a very productive and promising BOFH session about crowdsourcing&hellip; and more!\nThursday was a hard day: jet lag started to go away, but taking #geobeers\u00a0every night does not help much.\nAlysa Wright started with a cool presentation about why and how did she start on the spatial world. We should never forget that, as a community, we come from very different places and perspectives. And still, we share a common view about freedom.\nOn the last session of the day, I learned about OpenDroneMap. I couldn&rsquo;t stop asking myself why didn&rsquo;t I knew about this incredible\u00a0project before. Where drone software is even more awesome than the drone hardware.\nFinally, Paul Ramsey talked about sustainability of free and open software and why we should care about who maintains it.\n#foss4g @pwramsey explaining why heartbleed happened pic.twitter.com\/viTDfeq3MD \u2014 Mar\u00eda Arias de Reyna (@delawen) septiembre 17, 2015\nAfter the keynote, more social drinks with lots of fun:\nCan you guess what she is doing at #FOSS4G Seoul Social Drinks Party? pic.twitter.com\/LJlH4YL7ge\n\u2014 FOSS4G 2015 (@foss4g) septiembre 17, 2015\nLast day of conference is here. Friday tastes bitterweet. And not because of the food! Mar\u00eda Brovelli starts with a keynote about crowdsourcing and VGI and how they can change our community. Because even if we don&rsquo;t deal directly with the data, the software is also affected by all this. The next keynote was from Marco Hugentobler, talking about the qGis community from a developer&rsquo;s perspective. Because, yes, &ldquo;developers are human and not everyone is aware of that&rdquo;. What a surprise! In any case, never trust someone with the &ldquo;expert&rdquo; label, just trust the community. After the coffee break, I attended a very instructive presentation from Henrik Lund Pedersen about caching fresh data. Is it possible to have a cached and updated server for GIS data?\n#foss4g pic.twitter.com\/LgUyWvxNXi \u2014 Mar\u00eda Arias de Reyna (@delawen) septiembre 18, 2015\nDuring lunch we had some lightning random talks and I couldn&rsquo;t stop myself. Please, use free and not open:\nLook Mom, I&rsquo;m on stage! #foss4g https:\/\/t.co\/Jg1E0RaDAn \u2014 Mar\u00eda Arias de Reyna (@delawen) septiembre 18, 2015\nJody Garnett talked about documentation and why we should be very careful when writing it: not only to help advanced developers but also to not scare newbies. Never use the word &ldquo;easy&rdquo;, for example. If you use it and the reader don&rsquo;t find it easy, he will go away to look for something easier for him. And maybe the original documentation was easy, it&rsquo;s just that it hasn&rsquo;t been updated with new features.\nThen we had another Cobweb session on the main grand ballroom, this time by Panos, talking about the mobile part of the framework.\n#foss4g #fieldtrip Mobile app com @CobwebFP7 pic.twitter.com\/PFJhU6iPnW\n\u2014 Mar\u00eda Arias de Reyna (@delawen) septiembre 18, 2015\nAnd FOSS4G was finishing fast! But not before our president Jeff gave his vision about OsGeo and where we should focus on. Build community is the key. And shaking hands with people wearing suits.\nOn top of all the final party, GeoCat gave the first Most Innovative Developer Award. We hope to repeat it year after year encouraging developers in osgeo software.\nBefore finishing this post, I want to say a very big thank you to all the sponsors. Without them, this is not possible.\nThank you to all of the #foss4g sponsors. pic.twitter.com\/G8kvpyFEfG \u2014 Jeff McKenna (@mapserving) septiembre 16, 2015\nSee you next year in Bonn!\n","permalink":"https:\/\/delawen.com\/2015\/10\/foss4g-2015-seoul\/","summary":"<blockquote>\n<p>This post was originally posted on the blog of a former company. But since they have decided to violate my authorship rights, here is a copy of it.<\/p>\n<\/blockquote>\n<p>Last week I had the privilege to attend\u00a0the main <a href=\"http:\/\/www.osgeo.org\/\">osgeo<\/a> conference: the <a href=\"http:\/\/2015.foss4g.org\/\">FOSS4G<\/a>. This time it took place on <a href=\"http:\/\/www.openstreetmap.org\/way\/315718277#map=12\/37.5070\/127.0507\">Seoul<\/a>, Korea. Exotic place I strongly recommend to visit, but better to focus on <a href=\"https:\/\/twitter.com\/fvanderbiest\/status\/643325536001888256\">non-cultural surprises<\/a>\u00a0on this post.<\/p>\n<p>It&rsquo;s impossible to write everything on a single blog post, as it was impossible to assist to all the interesting parallel threads that run on those short five days. But let me guide you through my steps so I can share part of my experience until we get access to the full videos of that awesome week.<\/p>\n","title":"FOSS4G 2015 - Seoul"},{"content":"","permalink":"https:\/\/delawen.com\/feed\/","summary":"","title":"Redirecting to feed"}]