Blog

  • Que venha o PHP 6

    Olá leitores do iMasters.

    Essa semana trago a vocês algumas novidades que o PHP vem preparando para 2007, para o delírio geral dos programadores PHP de plantão.

    Quando estávamos nos preparando para executar o upgrade da versão de nossos sistemas para o PHP 5.2.0, além de ainda estarmos extasiados com as mudanças significativas que essa versão nos trouxe, recebemos uma noticia muito interessante, o PHP 6 já está a caminho!

    Não é de espantar a velocidade com que o planejamento de novas versões do PHP são elaboradas, aliás, com o mercado de linguagens de programação, as atualizações são quesitos necessários para uma maior adoção entre as comunidades de profissionais que são responsáveis por escolher as melhores linguagens e ferramentas de trabalho. E esse mercado tão acirrado, com profissionais cada vez mais competentes e exigentes quanto às funcionalidades, uma boa escolha da linguagem pode definir o sucesso do projeto, além do investimento no estudo.

    Mas essa velocidade de atualizações levanta algumas questões, dentre as quais:

    1. Como posso manter os sistemas de minha organização atualizados com um pequeno impacto de mudanças?
    2. Devo atualizar os sistemas que já são executados, pelo risco de talvez não mais funcionarem ou devo somente utilizar em novos módulos de meu sistema a serem implementados?

    Em novos releases de linguagens temos a promessa que a atualização pouco alteram nossos sistemas já em execução, na pratica nem sempre isso acontece. Ocorre casos em que a atualização acaba por eliminar aqueles detalhes que foram resolvidos ou contornados com alguma técnica obscura do programador e que simplesmente deixam de funcionar após o upgrade. Não preciso dizer que manter software acaba gerando um maior custo do sistema além de descontentamento do cliente. E pior de tudo, que esse custo e aborrecimento poderiam ser evitados apenas não atualizando a versão.

    Com a liberação do PHP 5.2.0 ganhamos melhorias nas funcionalidades para leitura de arquivos XML, conserto de bugs além de adição de várias características que são idealizados pelos adeptos da POO (Programação Orientada a Objetos) como adição de métodos privados e protegidos, classes e métodos abstratos, declaração de interfaces e melhor controle de erros.

    Mas será que realmente vale a pena atualizarmos agora nossos sistemas já implantados no cliente, com os requisitos já cumpridos e a satisfação garantida, por uma nova versão do PHP que ao mais tardar já estará obsoleta? Seria como procurar chifre em cabeça de cavalo.

    Essas ações de atualizações devem ser discutidas e planejadas e só depois de confirmada sua viabilidade, executadas.

    Não posso esconder o contentamento de aguardar mais uma nova versão do PHP, intitulada não oficialmente (mas que já é do conhecimento de todos) com o nome de PHP 6, ainda mais com as promessas de Rasmus, criador da linguagem, que já se pronunciou à respeito das funcionalidades pretendidas, das quais são destaques:

    • Remoção completa das register_globals;
    • Remoção dos magic_quotes_*;
    • Remoção do safe_mode, que tanto incomoda os programadores em servidores terceirizados
    • Os identificadores serão interpretados por case-sensitive (Isso pode aborrecer muitos programadores).
    • Suporte ao Unicode, retirando o uso da funções de extensão como mbstring e iconv, permitindo uma melhor implementação de sistemas internacionalizados e melhorando a performance.

    Com o advento de tecnologias com o AJAX, não seria de todo mal se o PHP pudesse retirar a necessidade do uso de frameworks incluindo em seu código nativo a implementação dessa funcionalidade, não acham?

    Bem pessoal, basta agora somente esperar pela versão que promete, e torcer que sua atualização não afete drásticamente os sistemas em produção.

    Abraços!

  • Implementação de um Cenário utilizando Windows 2003 Server – DFS Namespaces e ABE

    Irei explicar o funcionamento e configurações do Distributed File System (DFS) e do ABE (Access-Based Enumeration) separadamente e as vantagens de realizar a integração entre ambos.

    Distributed File System – Namespace

    Vamos imaginar o seguinte Cenário:

    Você é o administrador de rede responsável pela administração dos diretórios compartilhados (Shares) disponibilizados para os usuários em sua rede. Cada usuário possui direito de acesso a vários diretórios compartilhados. Abaixo citarei como exemplo uma estrutura normalmente utilizada para criação e administração de diretórios compartilhados.

    Estrutura de diretórios Compartilhados

    • Diretório de acesso exclusivo do usuário(Home Directory)
    • Diretório de acesso á todos os usuários de seu Departamento(Departamental)
    • Diretório de acesso á todos os usuários da empresa(Publico)
    • Diretório para compartilhamento de arquivos referentes a um certo assunto ou projeto(Específico)

    Quando o usuário executa um novo logon na rede cada diretório que ele possui direito de acesso é mapeado com uma letra atribuindo-se um nova unidade de rede. Este mapeamento pode ser realizado manualmente ou por um Script de logon.(Irei explorar mais o tema de Script de Logon em um próximo artigo).

    Desta maneira é criada a seguinte estrutura de mapeamento para cada usuário.

    Problemas encontrados neste Cenário

    O cenário descrito acima funciona bem em pequenas redes, com poucos diretórios compartilhados, disponibilizados em um ou mais servidores. Em grandes redes onde o número de diretórios compartilhados é grande, o uso de uma unidade de rede para acessar cada pasta compartilhada pode tornar-se de difícil implementação ou ate mesmo impossível, quando existirem mais diretórios compartilhados do que o numero de letras disponíveis no nosso alfabeto.

    Em grandes ou pequenas redes a solução de utilizar uma unidade de rede para cada diretório compartilhado não é a melhor solução, pois é extremamente difícil administrar de acordo com a visão do administrador de rede e difícil de utilizar de acordo com a visão do usuário.

    Cenário Proposto com o uso do Recurso DFS Namespace

    Inicialmente vamos entender o que é o DFS Namespace:

    • O DFS Namespaces é uma das funções do DFS que permite que sejam agrupados os diretórios compartilhados localizados em diferentes servidores, possibilitando que estes sejam apresentados como um árvore virtual de diretórios.
    • Os usuários podem navegar por esses namespaces virtuais sem a necessidade de um controle sobre os nomes dos servidores físicos ou diretórios compartilhados que armazenam os dados.
    • Em uma rede que possui configurado o acesso a diretórios compartilhados através do DFS Namespace, podemos reduzir as unidades de rede mapeadas (do exemplo acima) de 4 ou mais para somente uma.
    • Abaixo irei descrever os passos necessários para a instalação e configuração do DFS Namespace.

    1 – Instalação

    O DFS é um serviço nativo do Windows 2003 Server, para acessa-lo basta clicar no menu Start/Programs/Administrative Tools/Distributed File System.

    2 – Configuração

    Clique com o botão direito do mouse na opção Distributed File System e selecione New Root

    Na tela de Boas-Vindas, clique no botão Next. Seram exibidos duas opções:

    • Domain Root – Utilizado para replicação dos diretórios da sua árvore virtual DFS e integração com o Active Directory.
    • Stand-Alone Root – Utilizado para criar uma árvore virtual de diretórios.

    Como no nosso caso somente iremos criar a árvore virtual de diretórios (não abordarei replicação neste artigo) vamos selecionar a opção Stand-Alone

    Escolha o nome do servidor que você irá utilizar para criação da sua árvore virtual de diretórios.

    Preencha o campo Root Name com o nome da sua árvore virtual DFS. Através do Root Name é que os usuários irão acessar os seus arquivos, de acordo com o endereço de rede formado pelos valores \\ServerName\RootName\. Se desejar pode preencher o campo Comments, porém não é obrigatório.

    Clique no botão Browser e selecione um diretório para hospedar a estrutura da sua árvore de diretórios virtuais DFS. Iremos utilizar um diretório chamado Arquivos (C:\Arquivos). Este diretório será de extrema importância para a integração com ABE.

    A configuração do DFS namespaces está completa.

    Antes de prosseguir vamos criar uma estrutura de diretórios para configurarmos os diretórios Virtuais DFS.

    1. Crie um diretório chamado Users em C:\.
    2. Crie um subdiretório dentro do diretório Users (C:\Users) chamado Financeiro.
    3. Por ultimo compartilhe o subdiretório financeiro (C:\Users\Financeiro) como Financeiro.

    Teste o acesso ao diretório Financeiro (\\NomedoServidor\Financeiro).

    Agora iremos criar um diretório Virtual DFS para o nosso Diretório Financeiro.

    Clique com botão direito do mouse no Root DFS que foi criado (no nosso exemplo Arquivos) e selecione a opção New Link

    No campo Link Name você deve preencher com o nome do diretório virtual que você deseja que os usuários visualizem quando forem acessar a sua árvore Virtual de diretórios DFS.

    Notem que o nosso diretório se chama Financeiro e iremos preencher o campo Link name com Departamento Financeiro.

    o campo Path to Target(Shared Folder) você deve preencher com o caminho UNC para o diretório que você deseja publicar na árvore de diretórios Virtuais DFS, por isso que compartilhamos o nosso diretório financeiro (\\NomedoServidor\Financeiro).

    Caso deseje, você pode preencher o campo Comments com informações adicionais, porém não é um campo obrigatório.

    A criação de um diretório virtual DFS está completa.

    Até este ponto foi fácil, certo? Agora iremos entender o funcionamento e configuração do Access Based Enumeration (ABE)

    Access Based Enumeration – ABE

    O que é o ABE ?

    Para aqueles que já trabalharam com Novell, lembram-se muito bem que os usuário somente visualizavam os diretórios que eles tinham permissão de acesso dentro de um diretório compartilhado.Os demais arquivos ficavam ocultos.

    Até pouco tempo atrás este tipo de configuração era impossível em um ambiente de rede Microsoft, os usuários mesmo sem ter acesso aos diretórios podiam visualiza-los e se tentassem abri-los simplesmente recebiam a mensagem de Acesso Negado.

    Bem, eu disse até pouco tempo atrás, por que é exatamente isso que o ABE faz, impede que os usuário visualizem os diretórios que não possuem permissão. Aposto que muitos estão se perguntado como isso é possível, certo?

    Bem deixe-me explicar: quando você acessa um diretório compartilhado em um servidor, é como se você solicitasse ao Servidor Windows Por favor enumere os arquivos contidos neste diretório. Enquanto você fica distraido com aquela lanterninha no rodapé da página, o Windows esta executando a enumeração de todos os arquivos contidos naquele diretório compartilhado. (Lembraram do comando DIR do MS-DOS ?)

    Como resposta o Servidor Windows depois de alguns segundos permite á você visualizar todos os arquivos contidos no diretório compartilhado.

    O ABE modifica o método que o serviço de enumeração trabalha, alterando a resposta do Servidor Windows para:

    Irei enumerar somente os arquivos que você possui permissão de acesso.

    As permissões de acesso devem ser no minimo uma das quatro abaixo:

    • List Folder/Read Data
    • Read Attributes
    • Read Extended Attributes
    • Read Permissions

    Instalação do ABE

    O ABE somente funciona com os Sistemas Operacionais Windows 2003 SP1 (ou superior) e Windows 2003 R2.

    (Download do ABEUI)

    Após efetuar o download clique duas vezes no arquivo ABEUI.MSI e instale normalmente.

    Configuração do ABE

    O ABE somente pode ser habilitado em diretórios compartilhados. Vamos utilizar o diretório Compartilhado que criamos anteriormente com o nome de financeiro (C:\Users\Financeiro). Configure as permissões de acesso do compartilhamento como AUTHENTICATED USERS, FULL CONTROL. Não se esqueça de remover as permissões de acesso do usuário EVERYONE.

    Você poderá notar o surgimento de uma nova aba de configuração de nome Access-Based Enumeration. Selecione esta aba de configuração e selecione a opção Enable Access-Based Enumeration on this shared folder.

    A partir deste momento gostaria de convida-los a utilizar somente a linha de comando.

    Digo isto, pois iremos utilizar algumas ferramentas para criar scripts e facilitar a implantação e administração não só do ABE como também do DFS Namespaces.

    Vamos criar dois usuário para realizarmos os testes de funcionamento do ABE.

    Abra uma janela do MS-DOS e digite os seguintes comandos:

    net user Jose jose123 /add

    net user Carolina Carolina123 /add

    Agora vamos criar dois subdiretórios dentro do diretório Financeiro (C:\Users\Financeiro).

    md c:\Users\Financeiro\Jose

    md c:\Users\Financeiro\Carolina

    Após criar os diretório iremos conceder as permissões de acesso NTFS. Para isto usaremos uma ferramenta chamada Xcacls. (download do Xcacls)

    Salve o arquivo Xcacls.exe dentro do diretório C:\Windows\System32\. Agora vamos configurar as permissões de acesso NTFS dos diretórios Jose e Carolina utilizando o Xcacls.

    echo y xcacls c:\users\Financeiro\Jose /g administrators:f Jose:f

    echo y xcacls c:\users\Financeiro\Carolina /g administrators:f Carolina:f

    Lembre-se que são estas as permissões que o serviço de enumeração irá analisar quando estiver enumerando o conteudo do diretório compartilhado Financeiro. De acordo com as configurações que realizamos nas permissões de acesso NTFS dos diretórios Jose e Carolina, a tabela de visualização deste diretórios ficaria da seguinte maneira.

    Diretórios Usuarios que podem visualizar Usuarios que não podem visualizar
    Jose Administrators e Jose Carolina
    Carolina Administrators e Carolina Jose

    Vamos verificar se o ABE esta funcionando corretamente, utilizando a ferramenta RunAs.

    runas /noprofile /user:jose cmd /k color 1f

    Você deve preencher com a senha do usuário Jose que criamos anteriormente (Jose123). Após isto vamos solicitar ao servidor windows que enumere os arquivos contidos no diretório compartilhado financeiro.

    dir \\nomedoservidor\financeiro

    Se tudo estiver funcionando corretamente o único diretório enumerado para o usuário Jose deve ser o diretório Jose, ficando oculto o diretório Carolina. Caso você utilize a conta de administrator poderá visualizar os dois diretórios.

    Integração entre Distributed File System (DFS) e Access-Based Enumeration (ABE)

    Agora que já compreendemos o funcionamento e as configurações do DFS e do ABE chegou o momento de integrá-los. Esta integração é importante, pois de outra forma, quando o usuário for acessar a sua árvore de diretórios virtuais DFS irá visualizar todos os diretórios contidos na mesma, inclusive os diretórios que ele não possui permissão de acesso.

    Agora iremos criar toda a estrutura de diretório, diretórios virtuais,compartilhamentos, conceder permissões e utilizar o ABE através da linha de comando. Vamos lá…

    01 – Vamos criar dois novos subdiretórios dentro do diretório Users (c:\Users). Um diretório terá o nome de Logística e o outro diretório receberá o nome de Almoxarifado.

    md c:\users\Logística

    md c:\users\Almoxarifado

    02 – Agora Vamos compartilhar estes dois diretórios:

    net share Logísticac:\Users\Logística /grant:authenticated users,full

    /remark:Logística share

    net share Almoxarifadoc:\Users\Almoxarifado /grant:authenticated users,full

    /remark:Almoxarifado share

    03 – Agora vamos editar as permissões de acesso NTFS com a ferramenta Xcacls e utilizando os usuários Jose e Carolina

    echo y xcacls c:\users\Logistica /g administrators:f Jose:f

    echo y xcacls c:\users\Almoxarifado /g administrators:f Carolina:f

    04 – Agora vamos habilitar o ABE nos diretórios compartilhados Almoxarifado e Logistica

    abecmd /enable Almoxarifado

    abecmd /enable Logistica

    05 – Agora vamos adicionar os recém criados e configurados diretórios Almoxarifado e Logistica a árvore de diretórios virtuais DFS chamada Arquivos (\\NomedoServidor\Arquivos) que criamos anteriormente.

    dfscmd /map \\NomedoServidor\Arquivos\Departamento Logística \\NomedoServidor\Logística

    dfscmd /map \\NomedoServidor\Arquivos\Departamento Almoxarifado \\NomedoServidor\Almoxarifado

    Note que primeiro criamos um diretório virtual dentro do diretório Arquivos(Onde esta hospedado o DFS-Namespaces que criamos anteriormente) e depois vinculamos a um diretório compartilhado.

    06 – Agora iremos habilitar o ABE no diretório Arquivos que hospeda a árvore de diretórios virtuais DFS.

    abecmd /enable Arquivos

    07 – Agora um dos passos mais importantes, iremos editar as permissões dos diretórios virtuais que estão dentro do diretório Arquivos(C:\Arquivos).

    echo y xcacls c:\Arquivos\Departamento Logística /g administrators:f Jose:f

    echo y xcacls c:\Arquivos\Departamento Almoxarifado /g administrators:f Carolina:f

    Pronto!

    Quando o usuário Jose acessar a nossa árvore de diretórios virtuais DFS (\\NomedoServidor\Arquivos) irá visualizar o diretório virtual Departamento Logística e o diretório virtual que criamos anteriormente Departamento Financeiro.

    Você pode realizar um teste através da sessão RunAs do usuário Jose que utilizamos anteriormente.

    dir \\NomedoServidor\Arquivos

    Considerações Gerais:

    Acima demonstramos como é possível personalizar a exibição de uma árvore virtual de diretórios DFS mediante as permissões de acesso de cada usuário.

    Para administradores mais experientes na utilização de linhas de comandos e criação de scripts gostaria de recomendar o estudo das ferramentas e métodos abaixo. Com eles é possível a automatização dos processos demonstrados acima, ajudando assim na administração da sua árvore de diretórios virtuais.

    • MS-DOS:
    • Sleep.exe
    • RMTShare.exe
    • Xcacls.exe
    • Vbscript WMI (Windows Management Instrumentation):
    • Método GetObject
    • Método Win32_Process

    Um grande abraço e ate a próxima.

  • Flex e-Genial Scaffold

    Olá pessoal. Já começamos o ano com muita coisa boa acontecendo. David acaba de lançar o Ruby on Rails 1.2 com muita novidade e uma delas é o RestFull, que torna mais fácil integrar aplicações Ruby on Rails com aplicações externas. Imagine em uma única url sua aplicação fornecer serviços como RSS, WebService e conteúdo dinâmico mudando somente a extensão. Esta é uma das funcionalidades que vai estremecer o desenvolvimento web.

    Acaba de sair do forno também o Flex 2.0.1 com algumas melhorias significativas que com certeza vai fazer a diferença na hora de desenvolver aplicações RIA corporativas, abaixo segue as grandes mudanças:

    1. Suporte ao MAC OSX;
    2. SDK Ganhou um pacote a mais o mx.modules;
    3. CSS em tempo de execução;
    4. asDoc como parte do Flex Builder;
    5. Rendenização de textos;
    6. 290 Bugs corrigidos;
    7. Flex Builder baseado agora no Eclipse 3.2 e com maior performance;
    8. Suporte para o “Apollo”. Se não conhece ainda o Apollo procure conhecer, você irá entender de que forma aplicações web´s irão revolucionar as experiências e usabilidade dos usuários finais.

    E como não posso ficar de fora dessas grandes mudanças e sempre focado em colaborar com a comunidade Brasileira, resolvi atacar de generators. É…generators mesmo. Você deve estar se perguntando o que é isso, come com pão francês? Ou com bolachinha salgada? É mais que isso!

    Um dos conceitos de desenvolvimento Ruby on Rails é automatizar tarefas repetitivas. Desta forma, existem vários plugins e geradores de códigos que vão te ajudar no dia a dia. Em sua estrutura interna, o Rails possui um generator chamado Scaffold, e a idéia básica é que a partir de uma tabela existente no banco de dados, com o simples comando script/generate scaffold Tabela (singular), ele crie automaticamente uma tela com o form para cadastrar, editar, deletar e listar os dados desta tabela, assim automatizando as tarefas.

    Eu sou um cara que gosto de automatizar tarefas repetitivas, e usufruindo deste tipo de recurso resolvi então criar o Flex e-Genial Scaffold. O FES é um generator que tem por objetivo automatizar tais tarefas para a criação de aplicações RIA, unindo Ruby on Rails com Flex 2, e, seguindo a mesma linha do Scaffold original do Rails, porém com a view em Flex. O projeto está hospedado no RubyForge sobe a licença MIT, assim você pode baixar usar, distribuir, vender e até dar de presente para seu tio favorito.

    Neste artigo você irá aprender a instalar e a criar uma breve aplicação usando o FES. Você verá como é fácil ganhar tempo eliminando as tarefas corriqueiras.

    O primeiro passo agora é instalar o flex_egenial_scaffold. Como já expliquei em outras matérias, o Ruby tem um recurso que simplesmente faz a diferença: é o GEM. Com ele é possível instalar plugins, generators, aplicações e bibliotecas que vão ajudar no dia dia. Presumo que você já tenha instalado o Ruby e o Rails, certo? Caso ainda não, procure aqui mesmo no site como deixar tudo preparado para criar aplicações com alguns passes de mágicas.

    Ok. Então abra o terminal ou o cmd do windows e digite o seguinte comando.

    Gem install flex_egenial_scaffold_generator

    Aguarde alguns segundos até aparecer a mensagem a seguir:

    Successfully installed flex_egenial_scaffold_generator-0.0.1

    Ok. Agora o FES foi instalado com sucesso. Se tiver interesse em aprender como funciona o generator, no Windows a instalação do FES fica em:

    C:\ruby\lib\ruby\gems\1.8\gems\flex_egenial_scaffold_generator-0.0.1

    Agora estamos prontos para criar nossa primeira aplicação com uma simples tela que vai cadastrar, atualizar, deletar e listar os dados de uma tabela.

    Antes de tudo, crie um banco de dados. Neste exemplo, vamos utilizar o MySQL. Crie um banco chamado “flexrailsdb” e em seguida adicione uma tabela chamada “Clientes” com os seguintes campos: id, nome, email1, email2, observacacao e numero_banco.

    Então temos agora essa estrutura:

    • Banco de dados: flexrailsdb
    • Tabela 1: clientes
    • Campos da tabela clientes:
    • Id : Int
    • Nome: Varchar
    • Email1: Varchar
    • Email2: Varchar
    • Observação: Text
    • Numero_banco: Varchar

    Depois de criado o banco e sua estrutura, ainda com o cmd aberto vá até c:\, cd c:\. Ou, se você estiver no Linux, cd \home\seuUsuario.

    Digite o seguinte comando:

    Rails minhaAplicacao

    Espere criar todo o esqueleto da aplicação. Em seguida digite:

    cd minhaAplicacao

    Edite o arquivo database.yml que está dentro de minhaAplicacao/config. Adicione os dados de comunicação com o banco.

    • development:
    • adapter: mysql
    • database: flexrailsdb
    • username: root
    • password:

    • host: localhost

    No terminal, vamos fazer uma mágica. Digite:

    Usuário Windows:

    Ruby script/generate flex_egenial_scaffold cliente

    Usuário Linux

    script/generate flex_egenial_scaffold cliente

    Observação: Rails trabalha com pluralização, então a idéia é sempre usar tabela no plural e model no singular, que foi o nosso caso. Tabela clientes (plural), model no singular.

    O FES criou automaticamente o model, o controller e o fonte MXML da aplicação Clientes. Na seguinte estrutura de diretórios:

    minhaAplicacao/app/controllers

    • clientes_controller.rb

    minhaAplicacao/app/models

    • cliente.rb

    E a aplicação Flex em minhaAplicacao/public/sis/clientes.

    • _listaGrid.mxml
    • clientes.mxml

    Estes são os arquivos fundamentais da aplicação clientes.

    Agora que já estamos com a estrutura da nossa aplicação, precisamos então compilar o fonte clientes.mxml para criar o bytecode clientes.swf que será o front-end da tela de clientes.

    Primeiro vamos realizar duas pequenas “mudanças”!

    Dentro da pasta minhaAplicacao/lib/tasks, existe um arquivo chamado comp.rake. É ele o responsável por chamar o compilador do Flex SDK e gerar o bytecode. Então edite este arquivo e altere o caminho:

    home = "F:/FAMILIA_ADOBE/FLEX_SDK_2"

    Este é o caminho onde esta instalado o seu Flex SDK. Se você não tem ainda o Flex SDK instalado, veja a matéria de como realizar esta instalação passo a passo .

    É fundamental extrair os arquivos em uma pasta de fácil acesso e que não tenha espaços no nome. Sugestão: c:\flex_sdk. Use um “_” no lugar dos espaços, pois assim fica fácil para a tarefa comp encontrar o compilador Flex.

    O próximo passo é editar o arquivo flex-config.xml que está dentro da pasta Caminho/de/onde/esta/a/instalação/do/Flex/SDK/frameworks.

    Encontre a linha:

    <!-- File containing cached system font licensing information 

    produced via
    java -cp mxmlc.jar flex2.tools.FontsSnapshot (fontpath)
    Will default to winFonts.ser on Windows XP and
    macFonts.ser on Mac OS X, so is commented out by default.

    <local-fonts-snapshot>localFonts.ser</local-fonts-snapshot> -->

    Retire a seguinte linha de dentro dos comentários

    localFonts.ser

    Ficando assim:

    <!-- File containing cached system font licensing information 

    produced via
    java -cp mxmlc.jar flex2.tools.FontsSnapshot (fontpath)
    Will default to winFonts.ser on Windows XP and
    macFonts.ser on Mac OS X, so is commented out by default.
    -->

    <local-fonts-snapshot>localFonts.ser</local-fonts-snapshot>

    Agora, como já temos configurado o caminho do Flex SDK e as fontes, é hora de compilar. Logo, ainda no terminal, digite:

    rake comp:flex arq=clientes

    • rake: É o programa responsável por executar uma tarefa;
    • comp: É o nome da nossa tarefa;
    • flex: É o namespace da tarefa;
    • arq=: É o nome da tabela/arquivo/fonte/mxml criado.

    Aguarde por alguns segundos até aparecer a mensagem a seguir:

    Executando tarefa de compilacao flex_egenial_scaffold

    Tarefa concluída!

    Você irá perceber que, dentro da pasta minhaAplicacao/public/sis/clientes, existe um arquivo chamado clientes.swf que é o bytecode gerado pelo compilador flex.

    Vamos testar! Levante o servidor da aplicação com o seguinte comando:

    Usuários Windows:

    Ruby script/server

    Usuário Linux:

    Script/server

    Aguarde até aparecer a mensagem a seguir:

    C:\minhaAplicacao>ruby script/server|

    => Booting WEBrick… |

    => Rails application started on http://0.0.0.0:3000 |

    => Ctrl-C to shutdown server; call with –help for options |

    [2007-01-21 12:58:17] INFO WEBrick 1.3.1 |

    [2007-01-21 12:58:17] INFO ruby 1.8.4 (2006-04-14) [i386-mswin32] |

    [2007-01-21 12:58:17] INFO WEBrick::HTTPServer#start: pid=2220 port=3000 |

    Abra o seu browser preferido e digite http://localhost:3000/sis/clientes/.

    Você deverá ver a tela abaixo:

    Caso não veja, repita os passos acima.

    Agora você poderá cadastrar os dados. Para editar ou deletar um registro, clique na linha correspondente listada na grid.

    Viu como é simples e fácil integrar e criar aplicações Ruby on Rails com Flex 2? Agora te convido a assistir esse screencast que criei onde tem um passo a passo de como criar uma aplicação Rails usando o RadRails com o Flex e-Genial Scaffold.

    Experimente também adicionar mais um campo da tabela clientes e em seguida, rodar:

    1. Ruby script/generate flex_egenial_scaffold cliente
    2. rake comp:flex arq=clientes

    Em seguida dê um refresh na página e veja o que acontece.

    Mude a ordem das colunas da tabela clientes e rode novamente os passos acima. Veja como o FES se comporta.

    Bom, eu espero que tenham gostado. Qualquer dúvida só me enviar um e-mail, grande abraço e até a próxima…

  • Adobe entrega Flash Player 9 para Linux

    A Adobe anunciou a disponibilidade do Adobe Flash Player 9 para Linux, a próxima geração de cliente runtime para integração com conteúdo para sistemas operacionais de fonte aberta Linux.

    O Flash Player 9 entrega uma experiência de plataforma cruzada consistente. Os desenvolvedores de Linux podem criar, testar e empregar Aplicativos Ricos de Internet (RIAs) na plataforma Linux usando o Kit de Desenvolvedores de Software (SDK) Adobe Flex 2 gratuito, Adobe Flash Player 9 e o Flex Data Services 2 gratuito.

    O Flash Player já está Instalado em mais de 700 milhões de PCs com conexão a Internet e dispositivos móveis no mundo todo. Com a proliferação de vídeo na Web, o Adobe Flash Player está rapidamente se tornando, na prática, o padrão da indústria para entrega de conteúdos e aplicativos interativos, disse Emmy Huang, gerente sênior de produtos da Adobe Systems. Agora a comunidade Linux tem acesso completo ao alto volume de conteúdo e aplicativos Flash disponíveis na Internet hoje, levando usuários e desenvolvedores Linux ao mais avançado estágio em experiência Web 2.0.

    O Flash Player 9 para Linux aumenta imensamente a experiência do usuário com novas capacidades como utilização eficiente de memória, recursos avançados para gráficos, vídeo e texto, assim como a ActionScript Virtual Machine (AVM2).

    A Adobe contribuiu recentemente com código de fonte do AVM2 para a Fundação Mozilla, que está hospedando um novo projeto de fonte aberta chamado Tamarin para acelerar o desenvolvimento de uma abordagem com base nos padrões para criação de aplicativos de Web ricos e integrantes que funcionam em plataformas múltiplas. O código de fonte Tamarin está disponível via CVS, um sistema de colaboração e controle em versão de fonte aberta do website Mozilla

    http:www.mozilla.org/projects/tamarin

    O Adobe Flash Player 9 entrega desempenho de alta qualidade, experiência de visualização mais segura e modelo de programação aperfeiçoado o qual auxiliará em avanços futuros do SUSE Linux Enterprise Desktop como o principal desktop Linux para negócios. A Novell está comprometida em proporcionar aos nossos usuários os meios para que tenham a experiência com o que há de mais recente em conteúdo de Web.Justin Steinman, diretor de marketing para Linux e Soluções de Plataformas Abertas da Novell

    A Red Hat está comprometida em proporcionar a melhor experiência de usuário de Linux do mundo. Oferecer o Adobe Flash Player 9 para Linux aos nossos usuários ajuda a Red Hat entregar as capacidades Linux que os usuários desejam, sendo um indicador da crescente demanda para aplicativos ricos de Internet certificados para Linux da Red Hat Enterprise.Tim Yeaton, vice-presidente sênior da Red Hat Enterprise Solutions

    O Flash Player 9 para Linux está disponível imediatamente como download gratuito em http:www.adobe.com/go/getflashplayer. O debugger de conteúdo e o player isolado para desenvolvedores estão disponíveis em http:www.adobe.com/support/flashplayer/downloads.html.

    O Adobe Flash Player 9 para Linux também será incluído em sistemas operacionais Linux distribuídos pela Novell e pela Red Hat ainda este ano.

  • Otimizando bancos PostgreSQL – Parte 02

    Criação de Índices Parciais (Partial Indexes)

    Em tabelas com muitos registros, a utilização de índices normais pode causar um desempenho insatisfatório, principalmente quando se trata decolunas que representam abstrações de dados com pouca variação. É o caso de colunas representando tempo (DATE, TIME e TIMESTAMP), ou colunas numéricas representando tipos pré-definidos(Ex.: Regiões, Sexo, Faixa Salarial, etc.).

    Tabelas de movimentação analítica com estes tipos de colunas podem conter milhares, ou até milhões de registros. Entretanto, em consultas SQL específicas por um determinado valor, um índice normal completo (Full Index) irá considerar na consulta todos os registros da tabela, organizados na ordem do índice.

    O PostgreSQL possui um fantástico recurso para criação de índices que permite delimitar os registros que este irá considerar. Isto representa um enorme ganho de desempenho, especialmente em consultas SQL que utilizam filtros complexos no WHERE.

    Vamos exemplificar este caso. Considere uma tabela de movimentação analítica de estoque de uma empresa de comércio comum. Vamos usar um modelo simples, apenas para demonstrar o caso. Utilize o código SQL abaixo para criar a tabela:

    -- Criação da Tabela
    CREATE TABLE estoque(
    ID_Empresa INT2 NOT NULL,
    ID_Produto INT4 NOT NULL,
    ID_Local_Estoque INT2 NOT NULL,
    TIPO_Entrada BOOLEAN NOT NULL DEFAULT false,
    QTD_Quantidade NUMERIC(12,6) DEFAULT 0.000000,
    VAL_Unitario NUMERIC(15,3) DEFAULT 0.000,
    DT_Movimento DATE NOT NULL
    );

    -- Definição da chave primária
    ALTER TABLE estoque ADD PRIMARY KEY(ID_Empresa,ID_Produto,ID_Local_Estoque);

    -- Criação de Índice sobre o campo Data
    CREATE INDEX idx_DATA ON estoque (DT_Movimento, ID_Empresa);

    Imagine esta tabela com mais de 2.000.000 registros. O departamento de gerência de estoque emite relatórios mensais sobre a movimentação de estoque dos produtos para conferência. Um exemplo de relatório é de Entrada e Saída Consolidada, que considera os valores de entrada e saída por período. Um SQL típico para demonstrar as informações do mês de Dezembro de 2006 utilizaria o filtro no WHERE mencionando o campo DT_Movimento da seguinte forma: (…) WHERE DT_Movimento BETWEEN 2006-12-01 AND 2006-12-31.

    Considere o volume de dados caso a empresa possua um movimento de mais de 50.000 registros por mês, mantendo esta marca desde 01012000. Ao utilizar o WHERE acima, uma varredura completa no índice idx_DATA seria feita, considerando a massa completa de dados no índice.

    Dependendo de condições de uso dos registros estes podem estar na memória cache, então o resultado seria rapidamente apresentado. Entretanto, caso uma pesquisa aleatória não armazenada em cache for executada, o custo de IO do gerenciador de banco de dados seria problemático.

    A solução neste caso – e uma medida muito satisfatória – é a criação dos índices parciais sobre o campo data, combinando-os com um índice normal completo. É possível criar os índices parciais para datas muito além das atuais, para prever a população de registros na tabela no futuro, de modo a garantir o desempenho. Lembre-se de que se não existirem registros com uma data prevista no índice, este não terá tamanho, portanto não será prejudicial em nenhum aspecto (espaço ou IO).

    Para aperfeiçoar o acesso a dados nestas condições, os índices parciais consideram a cláusula SQL WHERE:

    -- Criação de Índice sobre o campo Data - Janeiro de 2006
    CREATE INDEX idx_DATA_0106 ON estoque (DT_Movimento, ID_Empresa) WHERE (DT_Movimento BETWEEN 2006-01-01 AND 2006-01-31);

    -- Criação de Índice sobre o campo Data - Fevereiro de 2006
    CREATE INDEX idx_DATA_0206 ON estoque (DT_Movimento, ID_Empresa) WHERE (DT_Movimento BETWEEN 2006-02-01 AND 2006-02-28);

    (...)

    -- Criação de Índice sobre o campo Data - Dezembro de 2006
    CREATE INDEX idx_DATA_1206 ON estoque (DT_Movimento, ID_Empresa) WHERE (DT_Movimento BETWEEN 2006-12-01 AND 2006-12-31);

    (...)

    Desta forma, a todo SQL onde for utilizado a condição DT_Movimento BETWEEN 2006-12-01 AND 2006-12-31 ou sua equivalente DT_Movimento 2006-12-01 AND DT_Movimento 2006-12-31, o índice idx_DATA_0106 será apresentando para o otimizador interno como o mais eficaz, e portanto será usado.

    Uma aplicação muito boa para os índices parciais é a utilização deste em tabelas que fazem parte de VIEWS (Visões) complexas. Todo o WHERE fixo da VIEW pode ser considerado em um índice parcial, o que resulta na diminuição considerável do tempo de resposta.

    Novamente deixo ao dispor do leitor o meu endereço de e-mail (ver início do artigo) para contato, principalmente para sugestões de novos artigos relacionados ao POSTGRESQL.

    Até breve!

  • Entendendo o filtro Chanfro Gradient / GradientBevel

    Olá pessoal. Este artigo vem como uma continuação da matéria anterior. Mas enquanto em todas as matérias nós tivemos que estudar um pouco, nesta estudaremos muito mais.

    O filtro de chanfro gradiente é aplicado a um objeto, como por exemplo, um retângulo, com as cores do gradiente distribuídas por três partes da forma: duas bordas de chanfro (um de realce e outro de sombreamento) e uma área conhecida como preenchimento de base.

    Os diagramas a seguir ilustram o retângulo, com o tipo de chanfro definido como interno No retângulo esquerdo, as áreas em cinza escuro correspondem às bordas do chanfro, e a área em cinza claro representa o preenchimento de base. No retângulo direito, é aplicado um chanfro gradiente em arco-íris, com um chanfro de quatro cores em cada borda.

    As diferentes propriedades do filtro de chanfro gradiente controlam o modo de aplicação do filtro.

    As cores do chanfro gradiente são definidas no array de cores. A distribuição real de cores em cada parte do retângulo é determinada pelo array de proporções. A propriedade distance determina a distância de deslocamento ou a distância em pixels a ser aplicada à borda de chanfro em relação ao objeto.

    As propriedades blurX e blurY controlam a nitidez das cores no chanfro; os valores mais altos tornam o chanfro efetivamente mais largo e suave, ao passo que os valores mais baixos o tornam mais fino e nítido. A propriedade angle equivale à fonte de luz teórica que incide sobre o objeto, causando um efeito de realce e sombreamento em suas bordas.

    A propriedade strength controla a distribuição das cores: um valor de intensidade mais baixo obscurece as cores, como pode ser visto no exemplo, enquanto um valor mais alto torna os números externos no array mais nítidos, forçando um menor realce das cores intermediárias no array. Finalmente, as propriedades knockout e type determinam como e onde o filtro de chanfro será aplicado ao objeto inteiro: se o filtro vazará o objeto e onde ele será posicionado.

    Um dos conceitos mais complicados no que se refere à aplicação ao filtro de chanfro gradiente consiste na distribuição de cores. Para compreender o modo de distribuição das cores em um chanfro gradiente, pense primeiro nas cores que deseja usar em seu chanfro gradiente. Como um chanfro simples aplica os conceitos já compreendidos sobre cor de realce e cor de sombreamento, você pode aplicar os mesmos conceitos para compreender o filtro de chanfro gradiente: há um gradiente de realce e um gradiente de sombreamento.

    O realce aparece no canto superior esquerdo, e o sombreamento, no canto inferior direito. Há quatro cores no realce e quatro no sombreamento. Entretanto, é necessário adicionar outra cor (a cor do preenchimento de base), que aparecerá na interseção das bordas do realce e do sombreamento. O array contém nove cores, conforme ilustrado no diagrama anterior.

    O número de cores no array determina o número de elementos no array de valores alfa e de proporções. O primeiro item no array de cores corresponde ao primeiro item no array de valores alfa e no array de proporções e assim por diante. Por haver nove cores, também há nove valores no array de valores alfa e nove no array de proporções. Os valores alfa definem o valor de transparência alfa das cores.

    Os valores de proporção no array de proporções pode variar de 0 a 255 pixels. O valor intermediário é 128, que é o valor do preenchimento de base. Na maioria das utilizações, para você obter o efeito de chanfro desejado, atribua os valores de proporção conforme o modo a seguir, usando o exemplo das nove cores:

    • As quatro primeiras cores variam de 0 a 127 e aumentam de valor, de modo que cada valor seja maior ou igual ao anterior. Essa é a primeira borda de chanfro, ou seja, nosso realce.
    • A quinta cor (intermediária) corresponde ao preenchimento de base, definida como 128. O valor de pixel 128 define o preenchimento de base, que aparecerá fora da forma (e aoredor das bordas de chanfro) se type for definida como outer; ou dentro da fora, cobrindo efetivamente o preenchimento do próprio objeto se type for definida como inner.
    • As quatro últimas cores variam de 129 a 255 e aumentam de valor, de modo que cada valor seja maior ou igual ao anterior. Essa é a segunda borda de chanfro, por exemplo, o seu sombreamento.

    Se você imaginar um gradiente como composto de listras de várias cores, que se misturam umas às outras, cada valor de proporção definirá o número de pixels da cor associada, definindo, portanto, a largura da listra de cor no gradiente. Se desejar uma distribuição igual de cores para cada borda:

    • Use um número ímpar de cores, com a cor intermediária como o preenchimento de base
    • Distribua os valores entre 0 a 127 e 129 a 255 igualmente entre as cores
    • Ajuste o valor para alterar a largura de cada listra de cor no gradiente

    Dica: O valor do ângulo determina qual borda será usada como realce e qual será usada como sombreamento.

    O valor do ângulo determina o ângulo usado para aplicar as cores de gradiente ao objeto, ou seja, o local em que o realce e o sombreamento aparecerão no objeto. As cores são aplicadas na mesma ordem do array.

    O código a seguir usa um quadrado rosa (criado com a API de desenho) e aplica um filtro de gradiente em arco-íris. As cores são, na ordem apresentada no array: azul, verde, roxo e amarelo (realce); vermelho (preenchimento de base); amarelo, roxo, verde, preto (sombreamento). Para determinar os valores de proporção, atribuímos quatro valores de 0 a 127 praticamente iguais para as cores de realce e cores de sombreamento de 129 a 255. As cores das bordas externas foram azul (16) e preto (235).

    var colors:Array = [0x0000FF, 0x00FF00, 0x9900FF, 0xFFFF00, 0xFF0000, 
    0xFFFF00, 0x9900FF, 0x00FF00,0x000000];
    var alphas:Array = [1, 1, 1, 1, 1, 1, 1, 1, 1];
    var ratios:Array = [16, 32, 64, 96, 128, 160, 192, 224, 235];
    var gradientBevel:GradientBevelFilter = new GradientBevelFilter(8, 225, 
    colors, alphas, ratios, 16, 16, 1.3, 2, "inner", false);

    A figura a seguir mostra o filtro de chanfro gradiente criado pelo código acima, um chanfro em arco-íris de nove cores aplicado a um clipe de filme de retângulo vermelho:

    A linha tracejada mostra como os ângulos são determinados. A figura mostra como o ângulo de 225° é percebido no filtro e também mostra cada valor de proporção para cada cor. Definir o ângulo a 225° indica que a primeira cor do array iniciará a 225°, ou seja, no canto superior esquerdo (o realce). A linha pontilhada mostra onde são aplicados os gradientes de realce e de sombreamento.

    A cor do clipe de filme original é rosa, mas a configuração do valor 128 para vermelho significa que o valor de 128 pixels é o preenchimento de base e cobre o preenchimento do clipe de filme original. Entretanto, quando você define a propriedade filters, o objeto original não é alterado; basta você desmarcar a propriedade filters para restaurar o preenchimento do clipe de filme original.

    As propriedades de todos os filtros afetam uns aos outros, portanto, se ajustar uma propriedade para alterar o efeito que estiver aplicando, é possível que você também precise ajustar outra propriedade.
    Este é o código ActionScript completo para criar a figura anterior:

    import flash.filters.GradientBevelFilter;
    // desenha uma forma quadrada preenchida atravéspela forma API
    this.createEmptyMovieClip("square_mc", this.getNextHighestDepth());
    square_mc.beginFill(0xFF99CC);
    square_mc.moveTo(40, 40);
    square_mc.lineTo(200, 40);
    square_mc.lineTo(200, 200);
    square_mc.lineTo(40, 200);
    square_mc.lineTo(40, 40);
    square_mc.endFill();
    //criando a array que vai ter as cores
    //azul, verde, roxo, amarelo, vermelho, amarelo, roxo, verde, preto
    var colors:Array = [0x0000FF, 0x00FF00, 0x9900FF, 0xFFFF00, 0xFF0000, 
    0xFFFF00, 0x9900FF, 0x00FF00,0x000000];
    //criando a aaray que vai conter a intensidade dos alphas.
    var alphas:Array = [1, 1, 1, 1, 1, 1, 1, 1, 1];
    //array que vai conter as ângulos
    var ratios:Array = [16, 32, 64, 96, 128, 160, 192, 224, 235];
    // criar o objeto de filtro
    var gradientBevel:GradientBevelFilter = new GradientBevelFilter(8, 225, 
    colors, alphas, ratios, 16, 16, 1.3, 2, "inner", false);
    // aplicar o filtro ao clipe de filme quadrado
    square_mc.filters = [gradientBevel];

    Arquivo .FLA. Um abraço galera e na próxima matéria: Aplicando Chanfro Gradiente/ GradientBevel.

  • Workspace e Smart Objects

    Meus
    amigos, estou de volta! Hoje, além de nossa materia especial,
    teremos a primeira galeria do ano, no final da matéria! Espero
    que gostem, pois são ótimos profissionais, além de amigos.

    Vamos estudar duas dicas importantes para nos ajudar na criação:
    Workspace e Smart Objects. Let´s Rock!

    Artista: Fabio Lody (www.fabiolody.com.br)
    Descrição: Dicas importantes no Photoshop CS2.
    Software ultilizado:
    Photoshop CS2 em Inglês
    Grau de Dificuldade: 8,0
    Ao som de: Foo Fighters – There Goes My Hero

    Workspace

    Workspace
    seria a forma com que lidamos com as janelas e paletas existentes
    no Photoshop. Como assim? Bem, eu acredito muito que a posição,
    por exemplo, da barra de ferramentas varia de usuário pra usuário.
    Eu, como bom canhoto, me sinto incomodado se ela não estiver
    na esquerda.

    Outra
    coisa que poderia nos ajudar, e muito, são cores! Isso mesmo,
    cores nos menus por exemplo. Na hora do aperto, quando se usa
    cores para chamar a atenção, nos facilita muito
    para encontrar alguma coisa em uma determinada opção
    de menu. Além de, claro, os atalhos!


    Workspace
    padrão

    Abaixo,
    veja a opção "Web Design" em workspace.

    Repare
    que, logo ao clicarmos, aparece a seguinte mensagem:

    Quer
    dizer que, ao selecionarmos tal opção, seria
    modificado nosso menu e atalhos. E se você quiser, aplica
    este esquema de workspace.

    Feito
    isso, repare que algumas opções de menu são
    alteradas. Novos atalhos e serão adicionadas novas cores para
    nos facilitar.

    Bem,
    estas opções pré-definidas pela Adobe
    servem para nos auxiliar dentro da função que
    voce quiser, como impressão, análise de imagem, web
    design e etc. Lembro que, inclusive, a posição
    das paletas pode ser alterada.

    Claro
    que poderiamos definir do nosso jeito, através do caminho:

    Window > Workspace > Keyboard
    and Shortcuts & Menu

    Este é da forma com que eu uso:

    Smart
    Object

    Como todos sabem, quando trabalhamos com imagens
    raster ou bitmaps, temos um enorme problema quando precisamos,
    por exemplo, redimensionar uma imagem. Mas graças ao recurso
    chamado "smart
    object
    " isso em "parte" acabou.

    Outro
    bom exemplo de uso de arquivos smart é a importação
    simples de arquivos como os de Illustrator para o Photoshop.
    Pela simples maneira de copy and paste, podemos importar arquivos
    de Illustrator sem maiores problemas. Além disso, poderemos
    atribuir todos os recursos necessários, como estilos.

    Faremos
    um teste.

    Crei
    um arquivo de 700×540 pixels

    Utilizando
    a ferramenta Horizontal Type Tool ( T ), escreva iMasters.

    Clique
    com o botão direito sobre a camada de texto criada e
    escolha a opção "rasterize type".

    Pronto,
    com isso temos uma imagem rasterizada. Agora faça o
    seguinte teste: Pressione "Ctrl" + "t" …

    Repare
    que agora temos os controle sobre os pontos e eixos de nosso
    texto rasterizado.

    Agora
    mova o cursor do mouse até o ponto superior esquerdo
    bem em cima da letra "i" e segure a tecla "shift".
    Após isso, mova na diagonal inferior direita diminuindo nosso
    texto e pressione "enter".

    Após
    a diminuição de nosso texto, repita o processo,
    pressione "ctrl" + "t" e mova o cursor
    até o ponto superior esquerdo. Clique e arraste para cima até
    aumentarmos novamente nosso texto.

    Repare
    que, na primeira vez em que aumentamos o texto, já existe uma
    perda considerável na qualidade.

    Para
    percebermos ainda mais, repita toda esta operação
    por, pelo menos, mais quatro vezes. Lembre-se de aumentar e
    pressionar "enter". Diminua e pressione "enter",
    etc.

    Note
    que, após a sexta vez de redução e aumento
    de tamanho de um objeto rasterizado, ja não temos como
    identificá-lo em nosso arquivo. Isso acontece graças
    ao cálculo efetuado no nomento em que deteminamos um novo tamanho
    ao objeto rasterizado.

    Nesse
    momento iremos conhecer o "smart object".

    Como
    eu disse, em geral, toda a regra de imagem rasterizada é esta
    que acabamos de ver. Você aplica uma escala ou outras transformações
    e temos reduções na qualidade de imagem. O CS2
    reescreve esta regra tornando nosso objeto indestrutível comparado
    a um objeto normal.

    Basicamente,
    o "smart object" mantêm a qualidade da imagem, independente
    do número de vezes em que ele for escalonado. Isso acontece
    porque as informações principais do objeto se
    encontram guardadas dentro deste arquivo.

    Vamos
    ver como isso funciona.

    Escreva
    novamente o texto "iMasters", mas desta vez vá em
    Layer > Smart Objects > Group into
    New Smart Objects
    .

    Repare
    que o thumbnail na paleta de camadas é alterado como
    abaixo:

    Repita
    os passo de escalonar o objeto e você perceberá que
    nosso objeto se mantêm intacto.

    Bem,
    por hoje é só. Na proxima semana aprenderemos
    como criar fontes utlizando o Photoshop! Dúvidas, entrem
    em minha comunidade: (http://www.orkut.com/Community.aspx?cmm=648492).

    Abraço
    a todos e fiquem com Deus!

    Segue abaixo
    mais uma galeria de imagens que criei para divulgar o trabalho
    de leitores e amigos que mandam muito bem! Meus parabéns pessoal!

    Jorge
    Packer
    (jorginhop@hotmail.com)

    www.fotolog.com/jorgepacker

    Fabricio
    Rodrigues Garcia
    (pintordigital@gmail.com)
    http://manohead.blogspot.com

    Ricardo
    Rodrigues
    (rodrigues@eletrodireto.com.br)

    Rick
    Fire


    http://ilustrevida.blogspot.com

    Fabio
    Pantoja
    (artpantoja@gmail.com)
    http://pantoja.deviantart.com

    Thiago Amaral de Oliveira (Break_rj@hotmail.com)
    http://xbreak.deviantart.com/

  • A Comédia Corporativa de The Office

    Uma das Grandes Revelações entre as Séries
    de Comédia dos últimos anos é a Série
    televisiva "The Office" – cuja tradução
    em português seria "O Escritório". Quem
    anda às voltas com o Mundo Corporativo com certeza irá reconhecer
    na Série um sem número de situações
    que são divertidas justamente porquê nos são
    familiares. Assuntos como Liderança, Competitividade no
    Ambiente de Trabalho, Relacionamentos Românticos entre
    colegas, Downsizing, Vigilância Eletrônica, Assédio
    Sexual, entre outros, são tratados de forma extremamente
    hábil – e absolutamente divertida – nos 30
    minutos de duração de cada episódio.

    The Office começou como uma Série Britânica
    que fez tanto sucesso que acabou ganhando outras versões:
    americana, francesa, alemã e canadense. As más
    línguas dizem que houve inclusive uma tentativa de adaptação
    desta Série por uma grande emissora brasileira – sem
    o mesmo sucesso das versões mais oficiais. Aqui falaremos
    apenas da versão americana que é tão boa – senão
    melhor, sob certos aspectos – que a versão original.

    A Série americana é centrada na figura de Michael
    Scott (interpretado pelo ator Steve Carell, o mesmo ator que
    protagoniza a Comédia "O Virgem de 40 anos"),
    que é o Gerente Regional da filial de uma fictícia
    Empresa distribuidora de papel. A relativa falta das necessárias
    qualidades de Liderança por parte de Michael – somada à sua
    absoluta falta de tato ao lidar com as outras pessoas – é responsável
    por uma série de situações que divertem
    a nós telespectadores – e infernizam o dia-a-dia
    dos funcionários. Por exemplo, em um episódio memorável,
    Michael não gosta do presente que recebeu no Amigo Oculto
    da Empresa e força as pessoas a trocarem de presente até que
    ele consiga um presente de que goste. Em outro episódio,
    ele passa a vigiar os e-mails dos funcionários, com as
    mais hilariantes conseqüências.

    Os motivos pelos quais um indivíduo tão visivelmente
    inepto está ocupando um cargo de Chefia vão sendo
    revelados no decorrer da Série. Na verdade, Michael era,
    antes de ser o Chefe da filial, o Melhor Vendedor da Empresa:
    foi justamente porquê ele era tão bom como Vendedor
    que a Alta Gerência resolveu promovê-lo a Gerente
    Regional. Este tipo de situação – retratada
    na Série – pode se tornar real – e sabemos
    que muitas vezes se torna – quando a promoção
    a um cargo de Gerência ou de Liderança leva em conta
    apenas a capacidade técnica sem avaliar também
    as Competências comportamentais necessárias ao cargo.

    A meu ver, uma das grandes Virtudes de The Office é justamente
    mostrar que, muitas vezes, este tipo de desajuste entre o comportamento
    e a função é muito mais um resultado dos
    mecanismos internos da própria Organização
    do que um "defeito" da pessoa que foi promovida. Isto
    fica perfeitamente indicado em um episódio, absolutamente
    engraçado, em que Michael é chamado à Matriz
    da Empresa em Nova York para uma reunião de Gerentes Regionais
    e percebemos, para nosso assombro e diversão, que todos
    os Gerentes presentes na reunião têm exatamente
    o mesmo perfil do Michael – o que não pode ser,
    de forma alguma, uma mera coincidência, mas antes uma falha
    no processo seletivo interno da Empresa.

    The Office é diversão garantida para todos aqueles
    que convivem com o Mundo Corporativo ou que já tiveram
    pelo menos um Chefe na Vida.

  • Inserindo variáveis no Flash via Tags HTML

    Vamos abordar este assunto com o auxílio de uma vídeo aula, arquivos fontes do trabalho em Flash e exemplos de resultados. Todos os arquivos e a aula estão compactados para download, devido ao tamanho elevado do arquivo.

    Veja abaixo uma tela do resultado final, e faça download do.ZIP.

    Aula: iMasters.zip

    Tamanho: 18 Mb

    Meu blog com mais algumas informações pode ser acessado aqui.

    Abraços!