A construção de uma aplicação de busca eficaz não se resume apenas à implementação de um mecanismo de busca funcional. É também sobre otimizar a experiência do usuário, oferecendo resultados rápidos e relevantes, e entender o comportamento do usuário para melhorias contínuas. O uso de frameworks como o Search Application Client e ferramentas de análise comportamental pode proporcionar insights valiosos sobre como os usuários interagem com o sistema, além de permitir uma personalização precisa das buscas.
Ao trabalhar com o Search Application Client em ElasticSearch, é necessário adaptar os templates de busca para que eles atendam aos requisitos do frontend da aplicação de busca. Isso envolve modificar templates preexistentes para garantir que eles se alinhem com o QueryBuilder do cliente de busca da aplicação. Para realizar essa adaptação, basta copiar o comando fornecido em este repositório do GitHub e executá-lo no Kibana | Dev Tools. O template de busca atualizado permite que o sistema se conecte adequadamente com a API de backend, fornecendo ao usuário uma experiência de busca personalizada.
A partir do momento em que o template é configurado corretamente, você pode iniciar o cliente da aplicação de busca com o comando yarn start. Ao abrir o navegador e acessar http://localhost:3000, você verá a interface do usuário (UI) da aplicação de busca React funcionando, conforme o exemplo mostrado na figura do guia. A arquitetura da aplicação de busca, como ilustrada, descreve como os resultados de busca fluem por meio do cliente, passando pelo front-end da aplicação e interagindo diretamente com o Elasticsearch.
Um ponto importante na criação de uma aplicação de busca é o uso do SearchApplicationClient. Este cliente fornece um método conveniente para realizar buscas através de comandos simples e pode ser usado para personalizar os filtros de facetas. Por exemplo, você pode configurar filtros no código da aplicação para que os usuários possam refinar sua pesquisa de acordo com critérios como o "diretor" ou o "gênero" de filmes. O código necessário para inicializar esses filtros é simples, e o cliente irá executar a consulta ajustada automaticamente. O método request.search() permite realizar a consulta com parâmetros definidos, como ordenação por relevância (_score), tamanho da página e o número de resultados por página.
Além de ser útil para consultas simples, o cliente de busca também integra templates de busca, simplificando a execução das consultas. Um ponto de destaque é que os parâmetros dessas consultas são passados diretamente pela aplicação cliente, permitindo flexibilidade e personalização, além de facilitar o uso em diferentes cenários de busca.
Se o objetivo for uma implementação mais robusta e flexível, o Search UI pode ser uma excelente alternativa. O Search UI, ao contrário do Search Application Client, é construído sobre o paradigma de conectores do Elasticsearch. Ele serve como uma ponte entre o frontend e os dados armazenados no Elasticsearch. Embora o Search UI permita a criação de interfaces de busca em cima de um índice Elasticsearch, ele oferece menos flexibilidade em termos de combinar múltiplos índices através de templates de busca. A escolha entre Search Application Client e Search UI dependerá das necessidades do seu projeto e do tipo de experiência que você deseja oferecer aos usuários.
Adicionalmente, para garantir que a aplicação de busca seja otimizada e compreenda como os usuários interagem com os resultados apresentados, é essencial integrar uma plataforma de análise comportamental. Com a introdução da versão 8.7.0 do ElasticSearch, a ferramenta Behavioral Analytics fornece um mecanismo para coletar dados sobre como os usuários realizam buscas, quais termos de pesquisa são mais populares, quais resultados são clicados e quais buscas não retornam resultados. Coletar essas estatísticas é crucial para identificar áreas de melhoria e para ajustar a experiência do usuário com base em dados reais.
A configuração do Behavioral Analytics começa criando uma coleção para armazenar os dados de análise. Uma vez criada a coleção, será necessário gerar uma chave de API para integrar a coleta de dados com o Elasticsearch. Com a chave de API em mãos, é preciso configurar a aplicação cliente para enviar os dados comportamentais, como visualizações de página, cliques nos resultados de busca e detalhes da consulta. Após configurar corretamente a coleta de dados, ao realizar buscas na aplicação de teste, você poderá observar os resultados na interface do Kibana, o que permitirá um monitoramento detalhado do comportamento do usuário.
Essa análise permite que você não apenas meça a eficácia da busca, mas também identifique padrões de comportamento que podem ser utilizados para ajustar os filtros, melhorar a relevância dos resultados e, finalmente, refinar a experiência do usuário. Além disso, entender quais consultas não geram resultados ajuda a identificar lacunas no índice de dados e aprimorar os algoritmos de busca para cobrir esses casos.
Importante é que a análise do comportamento do usuário pode e deve ser um processo contínuo. Ao coletar dados de maneira consistente, será possível melhorar a aplicação de busca de forma iterativa, ajustando os filtros, os templates e até mesmo os próprios dados armazenados no Elasticsearch para criar uma experiência de busca cada vez mais personalizada e eficiente.
Como Detectar Anomalias em Dados com Aprendizado de Máquina Não Supervisionado
Para configurar uma detecção de anomalias funcional, é necessário ter uma implantação do Elastic Stack com Elasticsearch e Kibana em funcionamento. Caso esteja utilizando o Elastic Cloud, recomenda-se seguir as orientações no capítulo 1 para instalar o Elastic Stack. Caso utilize um cluster auto-gerido, deve-se assegurar que há um nó com a função de ML (machine learning) disponível, com a configuração explícita node.roles=ML. A seguir, utilizaremos o conjunto de dados de tráfego de Rennes, que deve estar presente no seu cluster, caso contrário, pode-se consultar o Capítulo 6 para explorar seus dados.
Idealmente, para se obter os melhores resultados no aprendizado de máquina, recomenda-se ter dados de vários dias. Para dar início à configuração, acesse o Kibana na seção de Machine Learning, sob Analytics, e clique em "Jobs". Em seguida, clique em "Create anomaly detection job", onde será possível escolher entre uma visualização de dados ou uma pesquisa salva. Escolha a visualização de dados metrics-rennes_traffic-raw.
Na criação do trabalho de detecção de anomalias, será solicitado a seleção do tipo de análise. Opte por "Single metric" para seguir com a configuração de um trabalho de detecção de anomalias. A primeira etapa é a seleção do intervalo de tempo. Utilize a opção "Use full data" para executar a análise em todo o conjunto de dados e, em seguida, clique em "Next". Na próxima fase, é necessário escolher o tipo de campo que será analisado. Selecione o campo "High mean(traveltime.duration)", que tem a função de identificar valores anômalos no tempo de viagem.
Para aprimorar a configuração, no campo "Bucket span", altere para "multi-metric job". Esta alteração permitirá uma maior personalização da configuração. No campo "Split field", selecione a opção "hierarchie", para dividir a análise pelos diferentes valores de hierarquia rodoviária presentes no conjunto de dados. Em "Influencers", adicione o campo "traffic_status", pois ele ajudará a entender quais fatores contribuem para as anomalias.
Após a configuração inicial, dê um nome ao seu trabalho de detecção de anomalias, como "high_traveltime_duration_by_road_type". Na descrição do trabalho, digite algo como "Detectar durações de tempo de viagem anormalmente altas por tipo de estrada". Em seguida, continue clicando em "Next" até chegar à etapa de validação, onde o assistente verificará automaticamente se a configuração do trabalho está correta. Se todos os passos forem validados, clique em "Create job" para iniciar a análise.
Após a criação do trabalho, acesse a opção "View results" para visualizar o resultado da análise de detecção de anomalias. O "Anomaly Explorer" é uma excelente ferramenta para examinar os resultados, apresentando uma linha do tempo das anomalias. A visualização da linha do tempo permite observar como as anomalias se distribuem ao longo do tempo, com base na hierarquia rodoviária. Ao clicar em uma anomalia na linha do tempo, informações detalhadas sobre o evento serão exibidas.
Por exemplo, ao clicar em uma anomalia, é possível ver a hora e data do evento, a gravidade da anomalia, calculada em uma escala de 0 a 100, indicando quão improvável é a ocorrência daquele evento. No caso de uma gravidade de 97, significa que o tempo de viagem observado naquele momento era altamente improvável. Além disso, a seção "Influenced by" mostra os fatores que podem ter contribuído para a anomalia, como o status de tráfego. Se o status de tráfego estiver congestionado, isso pode explicar o aumento no tempo de viagem.
Outro elemento importante é a exibição dos "Top influencers" à esquerda da linha do tempo. Neste caso, o status de tráfego congestionado tem a maior pontuação de influência, indicando que ele teve um impacto significativo no tempo de viagem anômalo detectado. A detecção de anomalias permite identificar facilmente eventos fora do padrão e suas causas, o que seria difícil de alcançar com métodos tradicionais de detecção baseados em limiares fixos.
No processo de detecção de anomalias, os "datafeeds" desempenham um papel crucial. Eles são os componentes que buscam os dados de séries temporais nos índices do Elasticsearch e os fornecem para o trabalho de detecção de anomalias. Durante a análise, os dados são divididos em "buckets" com base no "bucket span" configurado, permitindo a criação de uma linha do tempo detalhada das anomalias, como mostrado no "Anomaly Explorer".
Em suma, a detecção de anomalias utilizando aprendizado de máquina no Elastic Stack oferece uma abordagem flexível e precisa para identificar comportamentos atípicos em grandes volumes de dados. Isso não só proporciona insights valiosos sobre o funcionamento de sistemas e operações, mas também possibilita ações corretivas rápidas e precisas.
Como usar a busca híbrida para construir aplicações de busca avançada
A busca híbrida, um método que combina diferentes abordagens de busca, é uma ferramenta essencial para a construção de aplicações de busca avançada. Ao integrar buscas lexicais tradicionais com buscas baseadas em vetores (como a k-NN, ou "k-nearest neighbors"), é possível aumentar a precisão e a relevância dos resultados, oferecendo uma experiência mais refinada ao usuário. No entanto, o processo de combinar os resultados de ambos os métodos pode ser desafiador, principalmente no que diz respeito ao ajuste das pontuações dos documentos e à escolha das estratégias adequadas de fusão dos resultados.
Uma das formas mais comuns de ajustar os resultados em uma busca híbrida é utilizando o conceito de "boosting". O "boosting" permite que se atribuam pesos diferentes às buscas lexicais e às buscas baseadas em vetores, destacando a importância relativa de cada uma delas. Este ajuste de pesos pode ser feito manualmente, por meio da definição dos parâmetros de "boost" para o algoritmo BM25 (que é utilizado na busca lexical) e para a busca k-NN, o que permitirá uma personalização dos resultados.
Por exemplo, ao utilizar um comando específico em uma aplicação de busca, pode-se configurar os parâmetros boost_bm25 e boost_knn para o valor 1, de modo que ambos os métodos (lexical e k-NN) tenham o mesmo peso inicial. Após realizar essa configuração, ao testar a aplicação com a mesma consulta, os resultados podem apresentar variações, com a busca lexical (BM25) e a busca k-NN ajustadas para refletir o peso atribuído a cada uma. Em alguns casos, a aplicação de valores de "boost" mais altos pode fazer com que certos documentos, como "Titanic", desapareçam dos resultados iniciais, o que pode ser desejado em determinadas situações. Porém, encontrar os valores corretos de "boost" é um desafio, pois as diferenças nas pontuações geradas pelos dois métodos de busca podem ser consideráveis.
Uma alternativa ao "boosting" linear é o algoritmo RRF (Reciprocal Rank Fusion), que oferece uma abordagem diferente para combinar os rankings gerados por diferentes sistemas de busca. Ao invés de simplesmente combinar as pontuações brutas dos documentos, o RRF utiliza as posições (ou rankings) dos documentos nas listas de resultados, proporcionando uma normalização das diferenças nas escalas de pontuação entre a busca lexical e a busca k-NN. O uso do RRF pode ser particularmente útil quando se quer evitar que um método de busca sobreponha o outro, oferecendo uma fusão mais equilibrada dos resultados.
Ao utilizar o RRF, é possível definir dois parâmetros importantes: window_size e rank_constant. O parâmetro window_size define o número de resultados individuais considerados por consulta, o que pode influenciar diretamente a relevância dos resultados, embora o aumento deste valor possa afetar o desempenho da busca. Já o rank_constant ajusta o peso dado à posição de um documento na lista de resultados, com valores mais baixos dando mais peso aos documentos melhor posicionados. A combinação desses parâmetros pode resultar em um equilíbrio ideal entre as buscas lexical e k-NN, permitindo uma representação mais precisa dos documentos mais relevantes.
No exemplo prático de implementação do RRF em uma aplicação de busca, ao navegar pela interface da aplicação, é possível observar que, ao aplicar os ajustes no window_size e no rank_constant, o conjunto de resultados gerados pela combinação de buscas se torna mais equilibrado, refletindo uma fusão mais justa entre os rankings de ambos os métodos de busca. A utilização de RRF pode ser mais eficiente do que o boosting linear, especialmente quando as escalas de pontuação dos métodos de busca variam consideravelmente.
A implementação da busca híbrida também pode ser estendida para cenários mais complexos, como a realização de buscas k-NN em múltiplos campos vetoriais dentro de um único índice. O Elasticsearch, por exemplo, suporta múltiplos campos vetoriais em um único índice, permitindo realizar várias buscas k-NN simultaneamente em uma consulta híbrida. Isso é útil quando se deseja recuperar informações de diferentes tipos de dados, como texto, imagem e som, todos codificados em vetores. Além disso, a busca híbrida também pode ser aplicada a vetores esparsos, além dos vetores densos que vimos no exemplo, o que amplia ainda mais suas possibilidades de uso.
Para aqueles que estão construindo aplicações de busca avançada com Elasticsearch, é importante observar que há uma grande variedade de recursos adicionais e otimizações possíveis. Por exemplo, ao lidar com grandes volumes de dados ou necessidades específicas de desempenho, a configuração de índices e o ajuste fino de parâmetros de consulta podem ser essenciais para garantir uma busca eficiente e precisa. O uso de buscas híbridas, com técnicas como RRF e boosting, pode proporcionar um poder significativo para melhorar a relevância dos resultados, mas requer uma compreensão profunda dos métodos de busca e dos parâmetros envolvidos.
A exploração da busca híbrida não se limita à simples combinação de buscas lexicais e vetoriais. Ela abre portas para o desenvolvimento de casos de uso multimodais, onde diferentes tipos de dados são integrados e pesquisados de maneira eficiente. A implementação de aplicações de busca complexas, como sistemas de recomendação e assistentes virtuais, pode se beneficiar enormemente dessa abordagem, permitindo que diferentes fontes de dados sejam combinadas de maneira eficaz para oferecer respostas mais precisas e contextualmente relevantes.
Como a Visualização e o Perfil Universal Ajudam na Análise de Desempenho e Custo de Sistemas
O rastreamento de pilhas de chamadas (stack traces) pode ser um desafio para muitos desenvolvedores, especialmente quando se trata de interpretar grandes volumes de dados sobre o desempenho do sistema. Por isso, ferramentas como a funcionalidade Flamegraph, presente no Elastic Universal Profiling, se tornam essenciais para facilitar essa tarefa. O Flamegraph oferece uma representação visual hierárquica dos dados, permitindo uma identificação rápida das rotas de código mais frequentes e críticas. A visualização mostra de forma clara as áreas de maior consumo de recursos e os pontos onde o código pode ser otimizado.
A visualização do Flamegraph permite que o usuário se concentre em quadros específicos, clicando com o botão direito sobre o tooltip associado e fixando o quadro. Ao selecionar a opção "Mostrar mais informações", o sistema exibe detalhes valiosos, como o impacto total no uso de CPU, emissões de CO2 e o custo em dólares. O custo anualizado é especialmente útil, pois dá uma ideia clara sobre quais partes do software são mais onerosas, ajudando a direcionar o trabalho dos engenheiros para a otimização dessas áreas.
No entanto, ao expandir certos quadros no Flamegraph, pode-se deparar com a mensagem de erro "Missing symbols". Esse erro se refere à ausência de símbolos legíveis no código, o que ocorre quando o perfilador captura apenas endereços de memória brutos durante a coleta de dados, sem associar esses endereços a funções e variáveis compreensíveis. O processo de "simbolização" resolve esse problema ao converter os endereços brutos de volta para seus nomes legíveis, tornando os dados muito mais úteis para análise.
Além do Flamegraph, a seção "Funções" no menu do Universal Profiling apresenta a visão "TopN functions", que lista as funções mais frequentemente amostradas, organizadas pelo tempo de uso de CPU, emissões de CO2 estimadas e custos anuais projetados. Essa ferramenta é crucial para identificar as funções que consomem mais recursos, possibilitando uma análise detalhada e a filtragem de áreas específicas para uma avaliação mais profunda. Ao clicar em uma função, o usuário é direcionado ao Flamegraph, permitindo uma análise mais precisa das chamadas de função.
O Universal Profiling opera por meio de um agente de host, implantado em servidores ou como DaemonSet em ambientes Kubernetes. Ele utiliza o eBPF (Extended Berkeley Packet Filter) para coletar dados de maneira segura e eficiente diretamente do espaço do kernel. Esse agente reconhece automaticamente o contexto de implantação, sem a necessidade de configurações manuais, e realiza o perfilamento de todos os processos do sistema sem interferir no funcionamento de aplicativos, compiladores ou runtimes. O que distingue o Universal Profiling de outras soluções é sua visibilidade abrangente, que vai além do simples perfilamento de um aplicativo. Se, por exemplo, um aplicativo Python usar uma biblioteca C, o Universal Profiling estende sua análise para incluir a biblioteca C e até o próprio kernel do sistema operacional.
Uma das principais vantagens dessa abordagem é o impacto mínimo no sistema, consumindo menos de 1% da CPU e cerca de 250 MB de RAM. A coleta de dados é realizada em uma série de etapas: desde o envio do bytecode do "unwinder" para o kernel, até a transmissão dos dados para o espaço do usuário, onde o agente do Universal Profiling os acessa e os integra ao Elastic Stack para análise.
A visão do "TopN functions" também permite ao usuário avaliar a performance não apenas do ponto de vista do consumo de recursos, mas também em termos de emissões de carbono e impacto financeiro. A partir da versão 8.11, o Universal Profiling foi integrado ao APM (Application Performance Monitoring), permitindo que os desenvolvedores correlacionem os dados do Flamegraph com transações e rastreamentos específicos de serviços. Isso facilita a identificação de regressões e a avaliação do impacto de alterações no código, tanto do ponto de vista de performance quanto de emissões e custos.
Além disso, para aplicações escritas em linguagens que compilam para código nativo, como C, C++, Rust ou Go, é necessário fazer o upload dos símbolos para o Elastic Stack, utilizando a interface de linha de comando (CLI) do symbtool. Isso assegura que os nomes das funções e as linhas de código sejam exibidos corretamente nos rastreamentos, tornando a análise ainda mais precisa.
É importante compreender que, embora o Universal Profiling seja uma ferramenta poderosa para identificar gargalos de desempenho e otimizar o uso de recursos, ele também exige um certo nível de configuração, especialmente ao lidar com códigos compilados. A coleta de dados de forma eficiente e a interpretação precisa das informações obtidas são fundamentais para obter insights reais sobre a performance do sistema. O processo de simbolização, por exemplo, é essencial para garantir que as informações sobre o desempenho sejam claras e utilizáveis. Além disso, o perfilamento universal não deve ser visto apenas como uma ferramenta de diagnóstico, mas como parte de uma estratégia contínua de monitoramento e otimização, que leva em conta o impacto ambiental e financeiro das escolhas de design e implementação de software.
Como a Observabilidade Pode Reduzir o Tempo de Resolução de Incidentes e Melhorar a Qualidade dos Serviços
A observabilidade dos sistemas é uma peça-chave no processo de resolução de incidentes, pois permite detectar, entender e agir rapidamente diante de problemas. No entanto, o grande desafio está em conseguir lidar com a imensa quantidade de dados gerados pelos sistemas em tempo real, sem se perder em falsos positivos e informações irrelevantes. O uso de ferramentas avançadas como a Elastic Observability facilita a identificação de anomalias e a análise dos dados de logs, minimizando o tempo necessário para resolução e melhorando a qualidade do serviço.
Quando lidamos com grandes volumes de dados, a primeira prioridade é identificar quais transações e serviços estão sendo mais impactados. A Elastic Observability facilita isso ao correlacionar automaticamente os atributos associados a latências elevadas e erros, cruzando essas informações com o conjunto completo de transações. Esse processo de correlação permite identificar rapidamente quais metadados estão presentes nas transações falhas ou lentas. Com isso, é possível reduzir drasticamente o tempo de investigação, pois a plataforma permite um zoom em grupos específicos de transações e facilita o acesso às informações de maneira estruturada e direta.
Além disso, a categorização de logs desempenha um papel crucial na análise de padrões recorrentes. Ao classificar logs de acordo com características semelhantes, conseguimos rastrear tendências e identificar padrões de falhas que podem estar associadas a problemas mais profundos dentro do sistema. Isso não só acelera a resolução de incidentes, mas também proporciona insights valiosos para evitar futuros problemas. A capacidade de analisar os dados históricos e identificar esses padrões ao longo do tempo ajuda a reduzir o tempo médio de resolução (MTTR), aumentando a eficiência da equipe.
A Elastic Observability não se limita apenas à resolução de problemas imediatos, mas também oferece funcionalidades para um planejamento estratégico e uma colaboração mais eficaz entre as equipes. Ao introduzir os Objetivos de Nível de Serviço (SLOs), por exemplo, a plataforma possibilita a definição de metas específicas de desempenho do serviço. As métricas podem incluir tempo de atividade, latência, taxa de erros e outros parâmetros personalizados. Com os SLOs, é possível determinar a gravidade de incidentes de forma mais precisa, o que facilita a priorização das ações corretivas. Além disso, os SLOs contribuem para uma melhoria contínua, pois tornam visíveis as áreas que precisam de mais atenção e permitem o ajuste fino dos serviços.
Outro recurso fundamental é a gestão de casos, uma funcionalidade nativa da Elastic Observability. O gerenciamento de casos, enriquecido com alertas, comentários e visualizações, oferece uma maneira organizada de acompanhar o processo de investigação, garantindo que todos os passos tomados sejam devidamente documentados e comunicados entre as equipes. Isso é essencial, pois a resolução de problemas muitas vezes exige trabalho colaborativo. Criar e gerenciar casos adequados é um método eficiente de garantir que nenhuma informação importante se perca durante a investigação e que cada etapa do processo seja claramente documentada.
Embora a correlação de dados e a categorização de logs já ofereçam uma base sólida para a análise de problemas, a Elastic Observability vai além, utilizando a inteligência artificial para proporcionar uma investigação ainda mais aprofundada. Com a integração do Elastic AI Assistant, é possível obter insights avançados ao interagir com modelos de linguagem como o GPT-4. Esse assistente pode fornecer explicações detalhadas sobre os erros e sugestões sobre como proceder na investigação, oferecendo uma camada adicional de profundidade que, de outra forma, poderia ser negligenciada.
Ao utilizar o AI Assistant, o processo de investigação pode ser acelerado ainda mais. Por exemplo, ao revisar os erros causados por uma flag de recurso, como um erro de catálogo de produtos, a plataforma permite uma análise detalhada dos logs, enquanto a IA gera explicações sobre a causa do erro e sugere áreas específicas para investigação. Isso não só economiza tempo, mas também melhora a precisão das ações corretivas. O AI Assistant, ao identificar problemas como falhas de cache e associá-los a questões de latência, permite que a equipe compreenda melhor as interações complexas entre diferentes componentes do sistema, facilitando a identificação de causas raiz.
Essas tecnologias colaborativas tornam o trabalho das equipes mais eficiente, ao mesmo tempo em que oferecem maior visibilidade e controle sobre a saúde do sistema. Porém, é importante lembrar que, embora as ferramentas de observabilidade sejam poderosas, elas precisam ser configuradas corretamente para serem eficazes. Sem a implementação adequada de integrações, como conectores com OpenAI ou Azure, e a definição clara de SLOs, as funcionalidades podem não alcançar todo o seu potencial.
Por fim, é fundamental que as equipes se adaptem a esse novo paradigma de observabilidade. O uso de Inteligência Artificial, como o AI Assistant, não deve ser visto apenas como uma ferramenta para melhorar a resposta a incidentes, mas também como uma maneira de prever e evitar futuros problemas. A capacidade de realizar correlações entre diferentes tipos de dados e integrar insights de modelos de linguagem avançados é um diferencial competitivo no cenário atual, onde a velocidade e a precisão na resolução de problemas são cruciais para a manutenção da qualidade do serviço.
A Importância da Cuidados Paliativos no Suporte Circulatório Mecânico em Pacientes com Insuficiência Cardíaca Avançada
Como a Estrutura Não-Hierárquica e a Prática do BDS Refletem Seus Valores Centrais
Como compreender e manejar emergências traumáticas do trato aéreo superior
Como Maximizar a Eficiência na Análise de Causa Raiz com OpenSearch

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский