All posts by Alexandre Lorenzatti

Alexandre has a Computer Science background focused in Knowledge Modelling and Software Engineering. Currently, he works with Computer Science applied to Geology, creating software solutions to the petroleum exploration chain.

The Power of Ontologies for Knowledge Management

Ontologies, as a tool for knowledge management, contribute to organize and make explicit the knowledge modeller intentions. Let’s take a look.

Tacit knowledge, as defined by Nonaka and Takeuchi, is the type of knowledge residing in people’s minds, while explicit knowledge is the type of knowledge not residing in people’s minds but in structured documents and central repositories of knowledge, for example [Nonaka, 2008] . A knowledge management project is an effort developed by companies in order to collect the tacit knowledge, which is distributed among the employees, and turn it into a company asset as explicit knowledge [Davemport, 1998].

Ontologies have their origin in the Philosophy field and refer to a system of categories that commit to a certain vision of the world [Guarino, 1998]. They are applied in computer science in order to capture domain knowledge and to explicit the assumptions that define the knowledge’s intended meaning [Guarino, 1998]. The picture below shows a simple example where two people use the same vocabulary to communicate. They use the same vocabulary representation (the word “Orange”), but they refer to different meanings: one talks about the color, while the other talks about the fruit. This is a common communication problem when exchanging information using documents or when integrating software systems. Applying ontologies to capture domain knowledge allows the knowledge engineer, responsible for a knowledge management project, to identify the company’s knowledge, structure it, and store it independently from the people who use that knowledge on their daily activities.

Ambiguity - Knowledge Management

The problem of ambiguity: two people talking to each other and using the same vocabulary, while the intended meanings are different.

Ontologies are currently being applied to the petroleum exploration chain to make it possible to capture the semantics behind the representations defined for geological reservoir models. They also provide support for data interoperability among the software systems applied to the petroleum exploration chain. Endeeper develops a family of ontology-based software systems. Petrographic software systems like Petroledge, Hardledge, and RockViewer are based on the Petrographic Ontology, which was created by [Abel, 2001]. Strataledge is based on the Stratigraphic Ontology, which was created by [Lorenzatti, 2010]. Both ontologies are maintained by Endeeper and are in constant evolution in order to better capture the geological knowledge applied by companies to describe rocks and evaluate the quality of petroleum reservoirs.


  • Abel, M. The study of expertise in Sedimentary Petrography and its significance for knowledge engineering (in Portuguese). (Doctoral Thesis ). Informatics Institute Federal University of Rio Grande do Sul, Porto Alegre, 2001. 239 p.
  • Davenport, Thomas H., David W. De Long, and Michael C. Beers. “Successful knowledge management projects.” MIT Sloan Management Review 39.2 (1998): 43.
  • Guarino, N. Formal Ontology in Information Systems In: N. GUARINO (Ed.). Formal Ontology in Information Systems, FOIS’98. Trento, Italy: IO Press, 1998. Formal Ontology in Information Systems p.6-8 June 1998.
  • Lorenzatti, A. Ontology for Imagistic Domains: combining textual and pictorial primitives (in Portuguese). (Master Dissertation). Informatics Institute Federal University of Rio Grande do Sul, Porto Alegre, 2010.
  • Nonaka, Ikujiro. The knowledge-creating company. Harvard Business Review Press, 2008.

Importance of Android source code obfuscation

Obfuscation is a method applied to transform a message into a difficult to read message. Android source code obfuscation is applied to make it difficult the reverse engineering of some application code.

However, it is important to mention that it is a method which is not a complete protection and it is just a way of discouraging others from accessing the code.

Proguard is the obfuscation tool used in Android projects and it is supported by Android Studio and Eclipse using the Android SDK. Besides obfuscating the code, it removes unused or unreachable code, sorts and optimizes the application bytecode and simplifies the logical and arithmetic operations. There are many restrictions in the mobile software development environment. Restricted access to the Internet and limited power availability are just two of them. Thus, using a tool like Proguard is interesting to improve the quality of your software and consequentially the user experience.

In order to illustrate the application of Proguard tool with obfuscation enabled, we created a Java class named Sample which contains a method implementing the factorial function and some other controlling code. Obfuscation changes the names of the class, methods, and variables to random symbols which makes much more difficult to understand the code. Unused code (unusedMethod) and the unreacheable code (debug ‘if’ clause) are removed by Proguard in order to optimize the final code used by the software application.

When publishing your application on the Play Store remember that developers are required to obfuscate the application code. Recently, the Android developer console started to offer developers the possibility to associate the generated obfuscation map to each of the published versions of the application. Using this feature, developers are able to visualize the non-obfuscated stack trace of an error right through the console and identify the source of the problem.

Android and Java projects developed by Endeeper are always obfuscated in order to keep the quality of our products. Contact us if you have any comments or questions.

public class Sample {
    private static final boolean DEBUG_ON = false;
    public int factorial(int number) {
        if (DEBUG_ON) {
            System.out.println("This will be removed");
        if (number == 0) {
            return 1;
        } else {
            return number * factorial(number - 1);
    private void unusedMethod() {
        // This method will be removed
public class A {
  public int b(int a) {
    if (a==0) {
      return 1;
    return a*b(a-1);