Tumgik
bruno-bat · 6 years
Text
MicroProfile Fault Tolerance
I´ve recently published an article about the MicroProfile Fault Tolerance specification on the Tomitribe blog. You can check it out here: 
http://www.tomitribe.com/blog/2018/04/microprofile-fault-tolerance/
0 notes
bruno-bat · 9 years
Text
Foreign characters in Ubuntu
Tumblr media
You have an En/Irish keyboard, use Ubuntu 14.04LTS+ and also need to write in other languages.
Here is How.
Go to System Settings -> Keyboard -> shortcuts tab
Select Typing on the left column and set a Compose Key. I choose AltGr or Right Alt, as they call it in there.
Now you can do things like:
Compose Key + ~ + a = ã
Compose Key + , + c = ç
Compose Key + c + c = č
There are plenty of fun combinations out there. Enjoy.
0 notes
bruno-bat · 9 years
Text
JavaOne, the first two days.
It’s again that time of the year when you cross an ocean to hear people talk about Java (!?), see some friends and wake up at 4am because of the jet lag.
About the sessions... The use of lambda expressions in the construction of new APIs or in evolution of the existing ones is becoming widespread.
The new JSR-354, Money and Currency API, was one of the nominees for this year’s JCP Awards, and has a very elegant use of lambda expressions. I plan to take a detailed look at this API in the future.
JAX-RS 2.1 will also use lambdas to make it easier to use Future<T>, InvocationCallback<T> and CompletableFuture<T> for non blocking writes with REST endpoints. Server side events and extension points to use RxJava were also announced.
A standard for asynchronous stream processing, like RxJava, has been mentioned. Take a look at Reactive Streams.
Also JMS 2.1 is coming with major changes to message driven beans (MDB). Multiple queue listers per MDB are being planed, non durable topics, callbacks will be able to auto un-box the message payload and set message headers and properties, following the JAX-RS way. Other features being discussed are the CDI beans as JMS listeners, a standardized way to deal with the dead letter queue, the delivery of messages in batches and also an API for connection factories.
And... If you are planing microservices, please make a favor to yourself and follow to what Adam Bien has to say about it.
0 notes
bruno-bat · 9 years
Text
Testes de Integração com Arquillian
Tumblr media
No passado dia 16 de Abril tive o gosto de realizar esta apresentação junto do CoimbraJug. Aqui ficam os materiais para referência futura: -- Slides da Apresentacao (Google) -- Código fonte da demonstração (Github) A distinção entre testes unitários e de integração, as suas características e a importância de testar vários sistemas em conjunto serviram de introdução `a demonstração centrada no Arquillian, uma "framework" de testes de integração automáticos para aplicações empresariais construídas em Java. Foi explicada a arquitectura da ferramenta, como criar testes e executa-los em vários servidores. Foram descritos alguns problemas comuns das aplicações, que podem ser facilmente detectados com estes testes. Foi ainda abordada a configuração dos perfis Maven. Obrigado a todos os que apareceram.
0 notes
bruno-bat · 10 years
Text
JavaOne Java EE
Tumblr media
I managed to find some time to write a bit more about JavaOne. This time about the Java Enterprise Edition (EE).
This area has been very active in the last couple of years. Java EE 7 (JSR 342) was completed on May 2013 and the Java EE 8 (JSR 366) is well underway now, the final release is predicted for the end of 2016. The draft proposal was driven by the feedback from a community survey and the contribution of industry experts, commercial and open source organizations, Java User Groups, and many individuals. The JCP has conducted a very open process in here. Congratulations to them!
Here are my sessions highlights.
On "Jee7 soup to nuts" we got a great overview of the current application servers compliance with the standard, some great tools and the top features, like:
WebSocket client/server endpoints (JSR-356).
Batch applications (JSR-352).
JSON processing (JSR-353) for parsing, generation, transformation and query of JSON messages.
Concurrency utilities (JSR-236) provide a standardized way to use concurrency in application components without compromising container integrity.
Simplified JMS API (JSR 343).
More annotated POJOs, including transactions.
JAX-RS Client API (JSR 339). The API for RESTful web services.
Default Resources.
Faces Flow.
Some other important features of Java EE 7 not emphasized during the session were:
JCache (JSR-107). This API was 13 years in the making until a final version was settled to specify the temporary, in memory caching of Java objects.
The Web Profile, introduced in Java EE 6 was also updated. This defines a configuration of the platform suited for web applications and allows light weight containers like TomEE.
One of the best sessions I saw was "Developing Java EE 7 applications with Scala". In a nutshell, you can use @BeanPropery @Inject on Scala! ...And even test the application using Arquillian and Glassfish. How awesome is that?
Some sessions gave us insights on concrete applications developed using only the standard APIs, like in "Lessons Learned from Real-World Deployments of Java EE 7" and "Java EE 6 Adoption in One of the World’s Largest Online Financial Systems". On this last one they described the case of Rakuten, a large vertical company on Japan, spanning businesses from banking, credit card and online retail. Here, a team of around 20 people developed in 3 months a complete financial application using Java EE 6 technologies. They perform the highest number of daily transactions in Japan. 
Another really great talk was "Applied Domain-Driven Design Blueprints for Java EE". Wikipedia does a good job explaining the subject of Domain Driven Design (DDD). In the presentation a parallel is made between the concepts of this architecture and the relevant APIs to use while implementing them with Java EE 7. An example application was open sourced and can be used as a reference.
Now, heading for the future with "Java EE 8". In this session we got a best guess of what might be included in the next version of the platform:
JSON-B for binding. An API to automatically marshal and unmarshal JSON documents. It will have defaults like in the case of the JPA and annotations for overriding. Behind all this is JSON-P.
JSON-patch might be introduced. It is a format describing changes to a JSON document. It can be used to avoid sending a whole document when only a part has changed. A typical example is an update to a field.
Server sent events based on a long lived http connection to push notifications from the server side. This will use Jax-rs, the API for RESTful web services.
Action based MVC for web applications. This follows a similar approach to Angular JS.
HTTP/2 support. Multiplexed streams on a single HTTP connection. They will be prioritizable. Header compression support. See JSR-369.
CDI. New security interceptors. More then just users and roles. Repositories for rules information will be introduced allowing a more fine grained control like, "is the user allowed at this time?". Possibility of password alias.
Improvements in the messaging service  JMS 2.1.
Pruning. Eliminate some unneeded, legacy client interfaces.
Management. Revamp JSR-77 and give it a REST interface.
On "Java EE 8 Community Update and Panel" we got a glimpse of the vision for the future and the challenges ahead. There are some ongoing discussions about a configuration JSR and to change the XML based RPC JSR-101 to improve service discovery.
The ongoing trend around Microservices and asynchronous processing to create modular and scalable applications. The need to create a cloud and a mobile profiles were also mentioned. The challenges introduced by other programming languages and the need to continue the evolution of the JVM to accommodate other languages apart from Java .
Photo: myself.
0 notes
bruno-bat · 10 years
Text
JavaOne Java SE
Tumblr media
Here I start a series of posts resuming some of the interesting parts of the conference. I decided to organize them by subject for future reference.
On Introduction to Java 8: JVM, Language, and Platform we heard again about the new Lambdas  and the invokeDynamic features. There were also some other interesting things like the removal of the infamous Permanent Generation Memory (yeah!),  the Streams API, the introduction of the Optional class like the one from Guava to avoid Null Pointer Exceptions, the CompletableFuture and the Nashorn Engine allowing JavaScript to call the Java code and vice-versa.
We also learned a bit about what might be included on Java SE 9:
A Dedicated Json-P (processor) API.
A Http2 client and a Web Sockets API.
Parallel compilation.
Modular source code affecting the build and partition of the JDK. This is a part if the endless Project Gigsaw.
You probably already heard that the Technical Keynote was interrupted during the most interesting part... Too much time taken by sponsors. They redeem themselves at the Community Keynote were they repeated the presentation of the planed new features for Java SE 9 like:
Project Valhalla. Introduction of Value Types. Like a Class but with a Value like behaviour. They might be passed as an array on the stack and be used with Generics. They will not have object identity, hence no inheritance or polymorphism. We can expect a big performance boost from this.
Project Panama. Improvements in the interconnection of the JVM and native code.
Also about Streams was one of my top 5 session, the Parallel Streams Workshop. A Stream is an abstraction that represents zero or more values. It's not a collection or a series of values. It can be started in a sequential mode, be transformed to parallel and again to sequential. This is particularly useful when used with Lambdas.
Photo from myself.
0 notes
bruno-bat · 10 years
Text
Prelude to JavaOne
JavaOne has 547 sessions over 5 days. So, as you might imagine, it was not an easy task to chose among them. I ended up selecting sessions related to Java EE, Financial and Internet of Things applications,  Microservices and Reactive Programming. 
Among the ones I chose, here are some highlights... If you are not a software developer, most of this will, most certainly, be gibberish to you.
On Sunday, the first day of JavaOne, I must highlight the Java Strategy and Technical Keynotes were the architects of Java 8 will give some insights about the future versions 9, 10 and beyond. To the end of the day, I'll attend to Free Java Tools for Maven and Java EE where, among others, Adam Bien and Markus Eisele will demo practical cases and discuss the evolution of these tools in relation to the cloud and HTML5 technology.
Monday will revolve around Java EE and several Internet of Things (IoT) sessions. There's Arun Gupta's Java EE7 Soup of Nuts and JavaEE8 were Linda Demichiel will present the planed feature set for the upcoming release of JEE.
 Tuesday I'm looking forward to see Building a Distributed Application for the Cloud with Akka Clustering and Java 8 and also Building Systems with Asynchronous Microservices. The first one is a tutorial that will teach how to build a reactive application that scales dynamically across a cluster of machines as the load varies. The second it's about using OSGi with asynchronous microservices.
On Wednesday, by this time I foresee some tiredness, but I'm not going to miss Applied Domain-Driven Design Blueprints for Java EE and Java EE 7 Recipes for Concurrency.
On the last day, apart from the JavaOne Community Keynote and Java EE 8 Community Update and Panel I'll check The Five People in Your Organization Who Grow Legacy Code from Roberto Cortez.
This is a small sample of the dozens of session I planned to attend and I bet that I'm going to be surprised by some ones I didn't mention. I'll keep you posted.
0 notes
bruno-bat · 10 years
Photo
Tumblr media
JavaOne starts on September 28 at San Francisco. I’ll be there for the first time and I’m thrilled about it.
 This is the major Java conference in the world and hosts all the top speakers and companies of the field.
 IBM, Red Hat, Zero Turnaround and Atlassian are some of this year’s exhibitors. It will be a great time to hear and meet some people that I know from books or tweeter, like James Gosling, Adam Bien, one of the JavaSE and JavaEE architects, Arun Gupta, director at Red Hat, Markus Eisele, developer Advocate at Red Hat, Bruno Borges, Oracle’s Principal Product Manager for Latin America or Roberto Cortez who’s going to speak for the first time at the conference. During the following days I'll post some of the sessions I'm planing to attend.  You can follow me afterwards if some of them are of your interest. Cheers!   
Photo from Basil D Soufi
1 note · View note
bruno-bat · 10 years
Photo
Tumblr media
  Emigrante sem Computador
Saí do País. Como tantos outros, decidi aceitar uma proposta do estrangeiro e fiz-me ao caminho. Estou na Irlanda, na rebelde cidade de Cork. É a segunda cidade do país e tem aproximadamente a população de Coimbra. Vim sem computador e nos primeiros tempos usei exclusivamente o meu telefone Android para "sobreviver". Este facto obrigou-me a usar o telefone ao extremo. De entre as aplicações "normais" para telemóvel, posso salientar a orientação GPS na cidade estranha, as chamadas intermináveis com a família usando Skype e a utilização intensiva de todos os tipos de mensagens e email. Como não tenho televisão, o Feedly, o Youtube, a RTP online e os "streams" da TSF e da Ru( foram muito solicitados. Até aqui tudo bem, mas um emigrante precisa arrendar uma casa, comprar bilhetes de avião, transferir dinheiro e arranjar actividades para combater o tédio. Nestes aspectos a falta do PC podia ser crítica. O meu velhinho Nexus S nao se negou a nenhuma destas tarefas e ainda tratou de outras que não estava `a espera. Tal como saber, em tempo real, quando chega o próximo autocarro `a mais recôndita paragem. Existe uma APP para quase tudo. Obviamente fiquei muitas vezes sem bateria no meio de uma rua estranha... Felizmente os Irlandeses, em geral, são simpáticos. Fiquei sem espaço no "disco" e a lentidão rivalizou com a recuperação económica. A minha paciência foi esticada até que decidi arranjar um novo... Mas essa é outra história. A lição que tirei é que, com excepção da programação que faço no meu trabalho, o telemóvel, ou um tablet, podem ser usados eficazmente para tudo o resto. Hoje tenho a certeza que qualquer pessoa que não crie  conteúdos, neste momento, não precisa de um PC. No fim, um tablet será fácil de usar e também será mais barato.
Hoje já tenho um portátil novo (no qual estou a escrever) mas nao o trato como o faria antigamente... Passei a usar muito mais o telemóvel.
#pt
1 note · View note
bruno-bat · 11 years
Text
A plataforma Phune Gaming
Nos últimos meses, na Present Technologies (ptech), temos estado a criar uma nova plataforma de jogos multiplayer em tempo real. O objectivo inicial centra-se na criação fácil e rápida de jogos casuais que possam ser jogados por várias pessoas em simultâneo em telemóveis ou na web.
Escrevo esta "posta" porque vou apresentar a plataforma este fim de semana, no próximo Barcamppt.
Eu refiro-me a ela como plataforma porque serve de suporte à execução e distribuição dos jogos, fornece uma série de funcionalidades que aceleram o desenvolvimento, mas também porque tornam os jogos mais atractivos e competitivos. Algumas das funcionalidades são:
Mecanismos de distribuição do jogo;
Emparelhamento automático de jogadores;
Validação das regras do jogo do lado do servidor;
Sistema de pontuação e rankings;
Integração com outras redes sociais;
Suporte para uma quantidade astronómica de jogadores.
Se usarmos como exemplo um jogo como o Quatro em Linha, que é tipicamente casual e por turnos, o seu criador, centrando-se somente no design, jogabilidade e regras, terá rapidamente um jogo com maior valor acrescentado e com potencial para ser jogado por muitas pessoas em simultâneo.
Para quem já tentou desenvolver jogos multiplayer sabe que a questão do emparelhamento e do acesso concorrente de milhares de jogadores em simultâneo é crítico e bastante complexo. Ao conseguirmos libertar o autor do jogo deste problema, damos-lhe liberdade para se focar no que é importante para o jogador.
O Barcamppt ainda tem alguns lugares livres, apareçam!
0 notes
bruno-bat · 11 years
Text
Servidor pessoal com o Raspberry Pi
Tumblr media
Há algum tempo que pensava instalar um servidor cá para casa. Uma máquina que estivesse sempre ligada à Internet, acessível a partir de qualquer lugar e que dispusesse de uma grande capacidade de armazenamento para efetuar backups (sim... a Dropbox não chega).
Estive à espera durante uns anos (literalmente) até que aparecesse a geringonça certa. Tinha de ser barata, não precisava de muita capacidade de processamento e queria que o consumo de energia fosse mínimo.
Quando o Raspberry Pi nasceu, fez ontem um ano, fiquei convencido que era a solução certa.
Para terem uma ideia da sua eficiência energética deste mini-computador, se o meu desktop estivesse ligado o mês inteiro, ia custar-me 15€ (1) em energia elétrica. Com o Raspberry, este custo reduz-se a 0.9€.
A alimentação é fornecida por um carregador Nokia na reforma. Precisei comprar um cartão SD para instalar o sistema operativo e uma caixa transparente, por ser bonita. Para armazenamento estou a usar um disco externo que já possuía. Ficou tudo por menos de 50€.
O brinquedo pode ser usado também como cliente de torrents, servidor de ficheiros, media center (lê ficheiros H.264 1080p), para controlar estores e ligar torneiras da rega. Não tira finos.
Para mais detalhes:
Raspberry Pi;
Raspian, um sistema operativo para o pi;
RaspBMC, software media center para o pi;
What have you done with your Raspberry Pi?, Guardian, 1 de Março 2013.
(1) 0.170kW * 24horas * 30dias * 0.123€kW/h = 15.06€. O preço do KW/h corresponde ao valor médio da tarifa bí-horária.
0 notes
bruno-bat · 11 years
Photo
Tumblr media
A sociedade e o código aberto
Cada vez que usava a Internet para descarregar um programa informático, dava por mim a pensar em vírus, ou se a palavra passe do meu banco ia ser roubada. O contacto com o computador tinha de ser algo mais alegre. Tinha de existir uma forma de  resolver esta falta de confiança no software. A solução passou pela utilização de aplicações informáticas Open Source, ou código aberto. Esta escolha acabou por se tornar num modo de vida, uma vez que me dedico à criação de aplicações empresariais baseadas em Java (JEE) e utilizo principalmente ferramentas construídas em código aberto. A pesquisa deu-me a conhecer ramificações que se estendem para além do mundo da informática. Vou começa por explicar em que consiste o movimento Open Source, contar um pouco da sua história e como está a inspirar algumas alterações na sociedade actual.
As aplicações informáticas feitas com código aberto têm conseguido utilizadores, reconhecimento e confiança. Estas aplicações são geralmente gratuitas e como os seus códigos fonte podem ser escrutinados por todos, dão garantias de fazerem exactamente o que dizem fazer, em geral não contêm spyware, vírus ou outros tipos de malware. As aplicações são geralmente feitas de forma distribuída, na Internet, por cooperação de indivíduos e empresas. Estas comunidades têm um modelo de governação democrático, o que as torna bastante resistentes à agenda de uma organização em particular. O código aberto, é uma filosofia de concepção e desenvolvimento que promove a partilha e o livre acesso aos detalhes de implementação, tanto de software, como de hardware. No âmbito desta filosofia surgiram algumas licenças legais, tais como a General Public License (GPL) ou a Berkeley Software Distribution (BSD), ao abrigo das quais as aplicações informáticas são criadas. Estas licenças, em maior ou menor, grau permitem a utilização, alteração e redistribuição gratuita dos detalhes de projecto das aplicações, bem como dos códigos fonte com as implementações.
As licenças do Creative Commons tem um papel semelhante às licenças de código aberto no que diz respeito à distribuição de obras sujeitas a direitos de autor, como no caso da fotografia que acompanha este post. Estas obras podem ser copiadas, alteradas, apresentadas e distribuídas livremente. A única reserva é a obrigatoriedade de atribuir os créditos ao seu autor. O código aberto pode parecer um fenómeno recente, tanto que o termo só surgiu em 1998, mas existem vários exemplos semelhantes no passado, encontrando-se um deles no inicio da produção de automóveis em série. Com o intuito de prevenir guerras de patentes e promover a cooperação, os fabricantes criaram um associação que reunia uma série de licenças partilhadas. Em 1945, Karl Popper publicou The Open Society and Its Enemies, onde surge o actual conceito de Sociedade Aberta. O autor divide as filosofias políticas em abertas e fechadas, sendo que estas últimas se baseiam em verdades dogmáticas com trajectos históricos utópicos. São exemplos de aplicação destas filosofias políticas as sociedades comunistas ou fascistas. Ainda na opinião de Popper,  na sociedade dita aberta, a politica não é modelada para um fim determinado mas sim para a gestão da mudança em geral, ou seja, a linha orientadora da actuação dos agentes políticos não é aquela que conduza a uma maior justiça social ou que valorize os direitos dos trabalhadores, mas antes uma que potencie a inovação através da competição. Assume-se que a mudança é normal. Apesar de facilmente confundida com teorias económicas liberais, a sociedade aberta está mais relacionada com a liberdade de pensamento e não tanto com a ausência de regulação económica. Esta reacção ao totalitarismo e ao controlo central dos anos 30 e 40 influenciou de forma decisiva o pensamento contemporâneo nas mais diferentes áreas, incluindo o da produção de propriedade intelectual, como o sotfware e hardware. Até meados dos anos 70 o código fechado era raro, dado que a grande maioria era criado no seio da academia, em laboratórios de investigação e universidades, era partilhado de uma forma despreocupada. Com o surgimento dos computadores pessoais,  e, em especial a proliferação do MS-DOS da Microsoft, iniciou-se um período da massificação do acesso à computação, em que, por razões comerciais, o código fechado passou a ser a norma e os utilizadores deixaram de ter controlo e acesso ao que estava a ser executado nos seus computadores. Como resposta a esta crescente limitação dos direitos dos utilizadores e programadores independentes, surge na década de 80 o conceito de Free Software, na Free Software Foundation (FSF) de Richard Stallman. Nesse mesmo período a FSF cria também a GPL e a iniciativa Gnu is not Unix (GNU). O GNU visava a criação de um substituto do sistema operativo Unix em código livre, ficando assim à margem de qualquer tipo de licenciamento prévio. A obra revelou-se tão grande que ainda hoje continua. A primeira implementação prática só se tornou possível em 1991 quando surgiu um kernel viável e que usava toda a infraestrutura entretanto criada. Esse coração do sistema foi criado por um aluno da universidade de Helsínquia, de nome Linus Torvalds, e que inspira o nome dado ao sistema criado por ele: Linux. Entretanto o termo ganhou uma dimensão que ultrapassa o kernel e é usado, algo abusivamente, para descrever o conjunto kernel, ferramentas GNU e as aplicações que usam esta infraestrutura. Este conjunto compõe, na verdade, uma distribuição de software, sendo uma das mais conhecidas o Ubuntu. O GNU demorou tanto tempo a produzir um sistema operativo completo por questões técnicas e por causa do seu modelo de governação centralizado. Por contraponto, o Linux logo desde a sua origem, optou por um formato de desenvolvimento altamente descentralizado, participativo e aberto. A determinado momento o Linus teve necessidade de criar uma ferramenta de gestão de código fonte que seguisse esta filosofia de desenvolvimento aberta. Daí surgiu o Git que actualmente tem vida própria e uma versão muito famosa, o Github. Foi neste contexto que surgiu o código aberto. Em 1998, tal como hoje, o discurso da FSF e do software livre era demasiado politizado e fechado à discussão, e que afastava mais do que mobilizava. Daí que os fundadores do conceito de código aberto tenham dado ênfase à participação distribuída na Internet. Foi também aberta a possibilidade de comercializar serviços ou até mesmo incluir código aberto em aplicações de código fechado. Desde ai, e acompanhando a evolução da Internet, que estas ideias se têm espalhado e frutificado, the Wikipedia way.
O movimento de abertura da sociedade tem sido crescente desde a Segunda Guerra Mundial. O conceito open soure  tem inspirado e catalisado ainda mais esta tendência. A democracia participativa, na forma da nova constituição islandesa, as novas formas de financiamento, como crowd funding, ou o crescente número de aulas universitárias livremente disponíveis na Internet, são exemplos recentes de abertura baseada na participação distribuída. Este movimento tem vantagens mas apresenta novos desafios, como nos casos da desregulação ou da protecção da privacidade. Mas esta é uma outra estória...
Foto por Nattu.
Obrigado ao Mehdi Rostami e à Marta Mateus.
Referências e consultas adicionais:
Revolution OS, um documentário de 2001 com participação do Linus Torvalds e do Bruce Perens, o criador do termo "open source;
A Sociedade Aberta e os seus Inimigos, Karl Popper, 1945;
A Catedral e o Bazaar, Eric Raymond ,1999;
Artigo de Nathaniel Tkacz sobre o governo aberto ou participativo. Os comentários ao artigo são igualmente interessantes, 2013;
Iceland croudsources its next constitution, The Guardian, 2011;
Wikipédia - Malware;
Wikipédia -  Open Source;
Wikipédia - Free Software;
Wikipédia - A licença GPL;
Wikipédia - A licença BSD;
Wikipédia - A Licença Creative Commons;
Wikipédia - O projecto GNU
Wikipédia - GNU/Hurd, o kernel do GNU;
Wikipédia - O kernel Linux;
Wikipédia - Motor Vehicle Manufacturers Association (MVMA);
Wikipédia - Git;
Wikipédia - Crowdsourcing;
Wikipédia - Crowd funding;
Wikipédia - Sociedade aberta;
O post de 1991com o anuncio nascimento do Linux;
0 notes
bruno-bat · 11 years
Text
Preâmbulo
Tumblr media
Crio este blog para partilhar experiências e ideias relacionadas com a tecnologia. Desde um servidor pessoal baseado no Raspberry Pi, até novas frameworks Java que permitam fazer mais, com menos recursos.
Proponho-me partilhar, porque grande parte deste conhecimento já existia disperso na Internet. Depois de adquirido e transformado deve voltar ao sitio de onde veio. O conhecimento tem mais valor se for posto à prova e à mercê da crítica alheia. Qualquer incorreção apontada, por amarga que seja, será bem vinda.
Dito isto, não perderei uma oportunidade para poder subverter o desígnio original, aceitando outras fontes de inspiração.
Todas as publicações vão estar catalogadas em tags para facilitar a navegação.
Obrigado.
Bruno Baptista
#pt
0 notes