1. CÓDIGO DA SESSÃO: #####
Interoperabilidade com .NET
em ambiente Mainframe
Alessandro de Oliveira Binhara
Projeto MONO BRASIL
binhara@gmail.com
@binhara
3. Agenda
Projeto Z10
O Projeto Mono
Histórico
Motivações
Rodmap, Features
Compatibilidade, Estrutura, Ferramentas
Interoperabilidade de Aplicativos .Net
Migração para MainFrame Z10
3
4. Apresentação
Mestre em Tecnologia (UTFPR)
Bacharel em Processamento de Dados
Desenvolvedor a mais de 18 anos....
Mono Hacker desde 2003
Linguagens Fluente: C#, Java, PHP
Outras: C++, C , Pascal, Python, Ruby, Boo, etc.
EU RODEI ASP.NET no MAINFRAME !!
Atualmente atua como desenvolvedor/consultor para algumas empresas:
4
5. Projeto Z10
Objetivo
Avaliar se é possível executar o WebIss no Z10
Avaliar o esforço necessários do porte para o Z10
Descrever os problemas encontrados e as possíveis
soluções
Avaliar desempenho do Z10 em relação a
plataforma baixa como servidor de aplicação Web
5
7. Microsoft lança o .NET
Projeto MONO
Miguel busca uma nova plataforma
para melhorar seus projetos.
Microsoft Lança a plataforma .Net
Coloca o C# como um padrão
O Core do .Net é colocado como padrão
Padrões ECMA 334 , ECMA 335
Plataforma Microsoft .Net
Multi-linguagem
Coletor de Lixo
7
9. O que é ?
Projeto MONO
Mono é uma implementação OpenSource do
.NET Permite a execução e desenvolvimento de
software .Net em ambiente Não Windows.
Mono 2.10 (atual)
9
Suporte C# 4.0, F# e Iron Ruby, IronPython
.NET Framework 4.0
Suporte Asp.Net MVC 3, Razor e WebPages
Suporte Asp.Net 4.0
VB.NET profile 2.0 e 4.0
Suporte WebMatrix.Data
Melhorias significativas no suporte WFC
10. Mono 2.10.7 beta
Is coming!!!
Suporte C# 5.0 (trunk 2.11)
Suporte NuGet
Suporte MSBuild 4.0
Suporte para Azure Libs
Suporte para o Phalanger 3.0
Mono 2.12!!!
C# 5 padrão
Tuned Parallel Framework
.NET 4.0 Core Suporte
Completa implementação do WCF/Silverligth
10
12. O que é ?
Projeto MONO
12
http://www.ohloh.net/p/mono/analyses/latest
13. Contribuições Microsoft
Apache Licensed Libraries
Ajax.NET, ASP.NET MVC1, MVC2, MVC3
Silverligth ToolKit, Silverligth Tests
Managed Extensibility Framework (MEF)
System.Data.Services.Client (OData)
Dynamic Language Runtime
13
14. Plataformas Suportadas
Supported Architectures
s390, s390x (32 and 64
bits)
SPARC (32)
Runtime
Operating system
JIT
Linux
JIT
Solaris, Linux
PowerPC
JIT
Linux, Mac OSX, Wii, PlayStation 3
x86
JIT
Linux, FreeBSD, OpenBSD, NetBSD,
Microsoft Windows, Solaris, OS X
JIT
Linux, Solaris
JIT
x86-64: AMD64 and EM64T
(64 bit)
IA64 Itanium2 (64 bit)
ARM: little and big endian
Alpha
MIPS
HPPA
14
JIT
JIT
Linux
Linux (both old and new ABI),
iPhone , Android
Linux
JIT
Linux
JIT
Linux
15. Início do Mono
Interoperabilidade
Uso das ferramentas da Microsoft
Como criar um compilador C# sem um
compilador.
Primeira versão do mcs foi escrita no Visual
Studio.
Inicialmente
5 engenheiros, Foco em aplicações desktop
Toda a infra-estrutura do mono é escrita em C#
15
21. C# no Android
Portando aplicativos
Versão comercial do mono para Android
Pluing para Visual Studio
Usa o mesmo profile do MonoTouch
Suporte OpenGL , GC, Multi-threading, .NET 3.5,
C# 3.0 e LINQ
.NET Bindings to Native APIs
http://monodroid.net/
http://monodroid.net/Tutorials
21
22. Mono for Droid 4.0!!!
Suporte completo API Android 4.0
Integrado MonoDevelop e VisualStudio
Alta Perfomance compilado com código nativo
Tudo do .NET Linq, Delegats, Events, etc
CrossPlataform (IOS5, WinPhone7, Android)
22
23. C# no IPHONE
Portando aplicativos
Versão comercial do mono para IPHONE
C# and .NET on the iPhone
.NET Bindings to Native APIs
Distribute on the Apple App Store
Enterprise deployable
MonoDevelop Integration
XCode Integration
Suporte IOS 5 Integração com Xcode 4
Fácil Bind com bibliotecas C e Objective C
http://monotouch.net/
23
24. Comparação de Código
Objective C
C# Mono Touch
CFStringRef keys[] = {
kCTFontAttributeName,
kCTForegroundColorAttributeName
};
CFTypeRef bval[] = {
cfListLineCTFontRef,
CGColorGetConstantColor(kCGColorBlack)
};
attr = CFDictionaryCreate (kCFAllocatorDefault,
(const void **) &keys, (const void **) &bval,
sizeof(keys) / sizeof(keys[0]),
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
var attrs = new CFStringAttributes {
Font = listLineCTFont,
ForegroundColor = UIColor.Black.CGColor
};
astr = CFAttributedStringCreate(kCFAllocatorDefault,
CFSTR("Hello World"), attr);
24
var astr = new NSAttributedString ("Hello World", attrs);
26. GAMES em C#
Demos
MONO.SIMD Cases
SencondLive mudou do LSL para Mono
50x a 300x mais rápido
Unit3d
Usa C#, Boo, unityScritp
26
27. Mono Games
Implementação do XNA em Mono
Jogos 2D e iniciando agora 3D
Lider é um Brasileiro : Jalfx
Suporte IOS, Android, MACOSX, Linux, Windows
https://github.com/mono/MonoGame
27
28. Mono Mac
MonoMac 1.0 Março de 2011
Plataforma .NET para desenvolvimento nativo
para MacOS X
Mais de 40 exemplos completos
Suporte completo para os Componentes CoCoa
Bind nativos para o MacOSX
Empacotamento e Distribuição na AppStore
http://www.mono-project.com/MonoMac
28
30. Crie no VS e rode no Linux
Portando aplicativos
Compatibilidade Binária
Monte o disco do linux e copie seus binários no
linux
Compartilhe no windows e acesso no Linux
Testando
Uso de máquinas virtuas: Ex: Virtual PC
Donwload das VM e LiveCD no site do mono
30
31. Sistema de Arquivos
Portando aplicativos
Cuidado com os caminhos
Cuidado com letras Maiúsculas e minúsculas
Não use caminhos absolutos, eles não vão funcionar em outros sistemas.
Use algum mecanismo como um arquivo de configuração para localizar seus
arquivos e caminhos
Busca manual de Separadores
int index = exePath.LastIndexOf("");
exeDir = exePath.Substring(0, index);
exeFile = exePath.Substring(index+1);
Código mais portável
exeDir = Path.GetDirectoryName (exePath);
exeFile = Path.GetFileName (exePath);
31
32. Variáveis de Ambiente
Portando aplicativos
Variáveis de ambiente o PATH no Windows usa
“;” o linux e outros sistemas unix usam “:”
Você pode usar System.IO.Path.PathSeparator
para separa o path nas variáveis de ambiente
Console.WriteLine ( "Subdiretorios encontrados no PATH :“ );
string path_env = Environment.GetEnvironmentVariable ( "PATH“ );
string[] path_dirs = path_env.Split (Path.PathSeparator);
foreach (string pathdir in path_dirs)
Console.WriteLine(pathdir);
32
33. P/Invoke
Portando aplicativos
Chamadas a DLLs nativas a API Windows não
irão funcionar em outros sistemas, pois a API
não existe no Linux.
Caso você dependa de bibliotecas em C, você
deverá substituir por equivalentes no ambiente
Linux.
Sua aplicação deverá identificar o sistema que
está rodando e chavear entre as bibliotecas.
33
35. Banco de Dados
Portando aplicativos
Mono faz acesso ao SQLServer , não existe
necessidade de mudar de banco para rodar sua
aplicação no Linux.
Mono Disponibiliza os dataproviders para os
bancos : MySQL, Postgresql, Oracle, DB2, SyBase
É possível usar os dataproviders do mono no
.NET com VS para acessar os bancos livres.
35
36. Ferramentas
Portando aplicativos
Mono Develop
Importa soluções do Visual Studio
Versões Windows, Linux e MAC
Suporte para GTK# , Iphone, MacOX
Debug integrado, controle de versão
Bando de Dados, Sistema de Testes,
www.monodevelop.com
Prj2make
Converte uma solução do Visual Studio em script para o make, gerando os
make files.
36
37. Mono Plug IN
Portando aplicativos
Verifique a compatibilidade do seu
aplicativo com usando o MOMA
diretamente do Visual Studio
Teste no Windows, Teste no Linux
Debug remoto no Linux
Empacote para linux
Crie uma Distribuição linux
customizada para seu aplicativo
com o Suse Studio
37
38. ASP.NET
Portando aplicativos
Mono Suporte Asp.NET 1,2, 3 e 4.0
Suporta Asp.NET MVC 1,2 e 3
Rodando no Apache, Ngnix:
XSP, Mod_Mod , FastCGI
Suporta WebServices
Suporta Ajax.NET (Microsoft)
WCF quase completo
Exemplo
www.monobrasil.org
38
39. Instalação Mono Linux AMD
Suse Enterprise 11
Instalação dos pacotes via Zypper
Instalação do Suse Linux Mono Extensions
Compilação dos fontes do Mono
Atualização dos pacotes para o Mono 2.10
Tudo ocorreu na mais perfeita ordem.
39
42. Compatibilidade de Bibliotecas
Nunit,obout_slideMenu,ThoughtWorks, e World
São 100% compatíveis com o mono.
Texsharp, MagicAjax Mscaptcha
Podem funcionar parcialmente pois não fazem
chamadas ao Windows.
Component One (Relatórios)
Já as bibliotecas relacionadas a relatórios não irão
funcionar pois apresentam muitas chamadas a API
do Windows e será necessário remove-las e
substituí-las por uma biblioteca compatível.
42
44. Ajustes no Código
4 Arquivos C# tinha acentuação no código.
1 Expressão Lambda estava acusando erro de
compilação pelo compilador do Mono.
1 ajuste no uso de alguns objetos de conexão
com o banco de dados que estava sendo usando
de uma forma muito genérica, usando a forma
específica foi resolvido.
SqlCommand cmd = new SqlCommand(commandString, sqlConnection);
cmd.Transaction = sqlTransaction;
cmd.ExecuteNonQuery();
dataTable = null;
44
45. Ajuste no Código
Erro de Sessão ao sair do Sistema.
Acontece um problema no Apache que bloqueia a
session do usuário obrigando a reiniciar o apache
cada vez que o usuário clica em sair do sistema.
É um bug no mono no método Session.Abandon();
Está corrigido na versão 2.10.1
Foi feita um ajuste usando o Session.RemoveAll();
corrigiu o problema e está funcionando como
esperado.
45
46. WebISS no MonoDevelop
Solução do WebIss é aberta e compilada sem
maiores problemas com os ajustes feitos no
ambiente do MonoDevelop.
Deploy do WebIss a partir do MonoDevelop
46
47. Apache no Z10
Suse Enterprise11 for S390
Pacotes desatualizados
Falta de bibliotecas
Recompilação do Apache e módulos mod_mono
Recompilação XSP
Não conseguimos compilar o FAST-CGI
47
50. Considerações Compatibilidade
O Sistema WebIss não foi pensando para rodar sobre
plataforma linux, mesmo assim, eles esta funcionando
bem, com exceção dos relatórios.
Apenas com uma boa orientação técnica e usando
componentes 100% .NET, a própria evolução natural
do WebIss poderá rodar no Linux 100% sem nenhum
ajuste ou mudança no código.
O maior trabalho a ser realizado atualmente é a troca
do componente de relatórios.
50
52. WCF
Existe apenas 1 método não implementado no
Mono. Mas este método é o método usado para
autenticar as chaves digitais.
Opções são :
Implementar a funcionalidade o Mono.
(Desaconselhado)
Mudar a implementação da Aplicação WCF.
O mais simples é migrar o WCF para WebServices,
pois não é utilizada nenhuma característica especial
do WFC nessa aplicação.
52
54. Algrítmos Genéricos
ArrayList
Mono Linux
Mono Z10
dotNet
54
Windows
StringBuilder
Adição de Integer & Floating
Exception
Reflection e recursão
452
1038
499
768
1926
639
5192
12164
5194
321
543
3057
4684
9787
5865
55. Criação de Objetos em Memória
Teste feito em C# mono e .net
Tempo em Mili segundos
Criação de Objetos em Memória
2000
1500
Mono AMD
1000
Mono Z10
500
.NET AMD
0
1k
10k
Quantidade de Objetos
Mono AMD
Mono Z10
.NET AMD
55
100k
1k
17
25
31
10k
115
146
93
100k
1059
1458
936
58. Single e Multi Thread
O Mainframe parece ter uma performance
melhor com 1 única tarefa. Mas como mostrado
anteriormente com teste de múltiplas tarefas
simultâneas ele apresenta a mesma eficiência
do AMD em vários caso.
Num ambiente de WebServer ele parece não ser
adequado, pois ocorrem muitas threads para
serem atendidas de forma rápida para não
afetar o atendimento dos pedidos.
58
59. Resultados
SIM : é possível executar o WebIss no Z10 com mínimo de
esforço de programação e testes
Avaliar o esforço necessários do porte para o Z10
Troca dos componentes Ajax e Componentes de Relatórios
Conversão dos WCF para WebServices comuns
Migração das Chaves de Criptografia do ISS para o Apache
Descrever os problemas encontrados e as possíveis soluções
Necessidade de uma maior conjunto de Testes, Teste manuai e criação de
testes automáticos.
Avaliar desempenho do Z10 em relação a plataforma baixa como
servidor de aplicação Web
59
O Z10 teve performance equivalente a um AMD de 5 anos atrás. Com
certeza a aplicação não terá a mesma velocidade que tem usando a infra
estrutura de processadores Xeon atuais.
60. Conclusões
Z10 não é tão performático como um
INTEL/AMD para rodar uma aplicação Web
como o WEBISS.
Tudo que esta fora do ambiente do mainframe
se torna lento, e o Z10 não está preparado para
esse tipo de situação.
O Z10 não escala a aplicação sozinho, a
aplicação e o ambiente do sistema operacional
precisa ser construído para rodar nesse
ambiente.
60