Tag Archives: promocao

Sou PHPSP e Contribuo!

O maior objetivo do PHPSP é contribuir com o PHP e sua comunidade, promovendo eventos e ações, mas também inspirando novas pessoas a contribuir com este ecosistema. Com esse pensamento queremos iniciar aqui um grande movimento de contribuição em comunidade para a comunidade. Queremos ver nossa comunidade cada vez mais ativa!

Somando esforços com alguns parceiros queremos realmente lhe incentivar a contribuir por meio da nova ação do PHPSP. “Sou PHPSP e Contribuo!” é um concurso que visa incentivar a colaboração dos membros da comunidade e premiar aqueles que se destacam quando o quesito é Colaborar!

Como posso participar?

Participar é simples, basta contribuir! Como? Enviando um patch para um projeto Open Source, corrigindo um bug, traduzindo ou contribuindo para a documentação, criando novos testes, criando uma nova feature, enfim, qualquer contribuição é válida. Para orientar quem ainda não sabe com que projeto contribuir, reunimos uma lista de projetos parceiros, são projetos que estão prontos para receber novos contribuidores e ajudar eles a contribuir.

A cada “ação” realizada você ganhará um ticket que será usado para a premiação.

Como ganhar tickets?

Para facilitar o desafio criamos um sistema de apoio, onde você poderá cadastrar participações e também acompanhar as atividades. Assim que completar uma participação válida (patch aceito, commit merged…) você poderá acessar nosso sistema de cadastro, descrever o que fez e fornecer um link para validação, pode ser o link do commit, do email na lista aceitando o patch, enfim, qualquer coisa que comprove que sua contribuição foi feita e aceita. Com estes dados em mãos faremos a validação e lhe mandaremos um ticket virtual.

Quais são os prêmios?

Já temos diversos parceiros apoiando esta ação, como a Microsoft, ServerGrove, php|architect e o Buscapé. Este parceiros nos ajudaram a oferecer diversos prêmios que podem ser vistos aqui. São consoles Xbox, iPads, livros e assinaturas, hospedagem e muito mais. Mas não é só isso, novos prêmios serão adicionados ao longo da promoção.

Quer saber mais?

Para saber mais sobre as regras e quem pode participar, visite o regulamento do desafio.

Boa sorte e continue contribuindo!

Resultado “O PHPSPCast quer que você se certifique !”

Há algumas semanas iniciamos uma promoção e chegou o momento, grande para alguns e nem tanto para outros, do resultado. Antes de mais nada, gostaríamos de salientar duas coisas:

  • O objetivo da promoção e das perguntas não era desmotivar ninguém a nada, nem provar nada a ninguém. Nossa primeira intenção é – e sempre foi – sermos os mais fiéis ao teste de certificação quanto possível. Nossa segunda intenção (que acredite, não era consciente até alguns dias depois da promoção ter início) era mostrar que, às vezes, você pode conhecer muito uma determinada parte do PHP, mas pode ignorar a existência de muitas outras;
  • Procuramos ser os mais justos quanto possível na correção, justos e imparciais. Corrigimos cada submissão, prestando atenção às respostas e sendo flexíveis em relação a elas, sendo imparciais quanto às regras, somente;

Dito isso, e depois de uma odisséia de correções, temos os resultados. Mas por que não discutir as perguntas e as respectivas respostas antes?

Correção e Comentário do Questionário

Usando Streams, que função usaria para que seu script continue rodando sem parar e esperar uma resposta do stream?

Bom, Streams – como cita o manual – é um grupo de coisas que se enquadra num comportamento que permita escrita e leitura de maneira linear. Exemplos disso são basicamente as coisas que você pode fazer com o conjunto de funções fopen(). Escrever, ler arquivos; buscar informações de URLs, escrever diretamente em FTPs, etc. Com elas, por exemplo, você pode criar um novo tipo de Stream para escrever de forma nativa arquivos de Excel passando somente Arrays para a fwrite().

Agora, o que significa o “esperar uma resposta do stream”? Exatamente isso. Suponhamos o uso das funções fgets() ou fread(), é natural que, se usamos algumas delas, queremos que algum dado seja retornado, certo? Errado. Isso é o que geralmente ocorre, mas, em algumas ocasiões – principalmente quando os dados não existem ainda na fonte e são gerados de forma ocasional -, você não pode esperar isso. Se não houver nada, simplesmente não me retorne nada e não espere um “EOF” que nunca virá.

Pra explicitarmos esse comportamento, usamos a função stream_set_blocking(). Aceitamos como resposta aqui também, as funções set_socket_blocking() e socket_set_blocking() que foram depreciadas. Uma pena, mas, só com essa pergunta, mais da metade das pessoas que participaram já estavam fora da promoção por terem errado a resposta. E lembrando que não importa como você escreveu a resposta: por termos corrigido manualmente, se você acertou o nome de alguma das funções, sua resposta foi considerada certa.

Resposta: stream_set_blocking().

Qual o resultado do código <? echo (int) 013 +1; ?>?

Ficamos felizes de saber que quase ninguém errou esta questão. No fim, não importa se é porque a pessoa sabia o motivo da resposta ser 12 ou se porque ela executou o código. Importa que agora ela sabe, entendendo o motivo ou não, que coisas estranhas podem acontecer no paraíso.

Coisa estranha? Não. Bug? Não também. Não neste caso. No PHP, os números inteiros (caso acima) podem ser representados em três notações diferentes: decimal (nossa velha conhecida), hexadecimal e octal. Para representar um inteiro usando a notação hexadecimal, o número precisa começar com 0x (zero, xis) e em octal, começar com 0 (zero). Olhemos de novo o código acima então. O inteiro “013” começa com zero, logo ele é um octal que convertido para decimal vira 11. Logo, a resposta é 12 mesmo. =]

Resposta: 12.

Qual dos itens abaixo não é uma funcionalidade adicionada no PHP 5.3?

Trecho do Manual do PHP

Essa não tem muito o que discutir.  A única opção que não foi adicionada na versão 5.3 é a função spl_object_hash(), que foi adicionada na versão 5.2 do PHP e teve contribuição do nosso amigo e colega de comunidade Guilherme Blanco na sua implementação. O Phar se tornou parte integrante do PHP na versão 5.3. Para as anteriores (versão 5.2 ou superior) ela pode ser instalada através da PECL. Portanto, repare que antes da versão 5.3 ela ainda não era uma funcionalidade do próprio PHP. Garbage Collector, Namespaces e o SplFixedArray são todos recursos novos adicionados na versão 5.3 e tidos como grandes novidades. Nós mesmos, aqui do PHPSP, cansamos de mencionar esses três recursos durante meses.

Mas como você pode saber a partir de qual versão determinado recurso existe? Acho que é óbvio que a resposta está no manual, mas como? Toda entrada de função ou método no manual possui, logo abaixo do título, a seguinte informação entre parênteses: (<Major PHP Version> <operator> <Minor PHP Version> ). Dúvidas? Olhe a screenshot ao lado:

Como você pode ver através da screenshot, a função spl_object_hash() está disponível somente para versões do PHP 5 maiores ou iguais que 5.2.0. Logo, ela foi introduzida na versão 5.2. Entre nos links das demais funcionalidades que colocamos nesta explicação e procure essa informação por você mesmo. Saber a partir de qual versão determinado recurso está disponível é essencial no seu dia a dia.

Resposta: spl_objct_hash().

Quais dos itens abaixo possuem implementações para manipulação de XML no PHP?

Essa era chata de acertar. A resposta correta era marcar todas as opções, ou seja: SimpleXML, SaX, DOM e XSL. Chata porque precisava de um pouco mais do que uma olhada superficial pela documentação do PHP, mas nada de outro mundo – não mais do que 30 min navegando pela seção de XML do manual você mataria a resposta correta.

Vamos dar uma passada rápida sobre cada alternativa a resposta:

  • SimpleXML: implementação do PHP que converte um XML em um objeto. Vantagens disso? Ora, um objeto pode ser facilmente manipulado, validado e utilizado por outros objetos. Comparar um objeto com uma string é uma sacanagem que não vou fazer. De todas as implementações existentes, pessoalmente, acho essa a mais simples e direta de se utilizar. Talvez seja mesmo e, quem sabe, não é por isso que ela levou esse nome?!
  • SaX: Essa deve ter sido difícil de achar. Quando XML ainda não era moda e o Java já era velho e cheio de coisa, existia uma implementação para interpretação e manipulação de XML em Java chamada “Simple API for XML“. Ela foi tão largamente utilizada que acabou virando um padrão e recebeu implementações em diversas outras linguagens. No PHP não foi diferente, ele recebeu algumas funções que estão bem escondidas no manual (assim como o Goto). Estão escondidas porque são coisas que precisam ser esquecidas. Existem jeitos muito melhores de se trabalhar com XML, mas se você tiver curiosidade, olhe. Aprender nunca é demais. Diferente do DOM e do XSL, o SaX não é um padrão e não existe nenhum documento ou órgão que regulamente como sua interface deve ser aplicada;
  • DOM: A Document Object Model é uma API de manipulação de conteúdo que hoje é mantida pelo W3C (sim, o mesmo do HTML, CSS, etc) e possui basicamente duas implementações no PHP. A DOM (para PHP5) e a DOM XML (para PHP 4). Se você conhece um pouco de JavaScript, sabe como funciona a DOM dos objetos HTML. A implementação do PHP é bem parecida com a do JavaScript ou ECMAScript. Uma vantagem em relação às demais é que ela trabalha internamente só com encoding UTF-8 enquanto as demais (por causa do próprio funcionamento de Strings do PHP) trabalham com ISO-8859-1;
  • XSL: Da mesma forma que o CSS transforma a apresentação do HTML, podemos dizer que o XSL (Extensible Stylesheet Language) transforma a apresentação de um XML. Ok, não é tão semelhante assim, mas se você não faz idéia do que é XSL, agora provavelmente já tenha uma noção do que seja. XSL é basicamente outro XML que descreve o que fazer com o conteúdo de um XML, permitindo adicionar ou esconder seu conteúdo. Também podem ser chamados de XSL Transformations ou XSLT, cujo padrão também é estabelecido pelo W3C;

Resposta: SimplesXML, SaX, DOM e XSL.

Supondo as configurações do php.ini abaixo (e que elas sejam mantidas) e a versão 5.3.2 do PHP. O que deveria haver no local do comentário no código para que nenhum erro/notice fosse exibido e o script não seja interrompido? <?php /* algo */ echo date(‘Y-m-d’); ?>

error_reporting = -1 e display_errors = On

Essa aqui foi o terror para o pessoal, assim como a questão sobre Streams. Vamos primeiro entender a pergunta:

Temos a última versão do PHP (5.3.2) com exibição de todos os tipos de erro habilitados e queremos executar o código acima sem que nenhum erro seja exibido. Mas será que algum erro é exibido? A resposta é sim. O manual da função date() nos informa no changelog da função que a partir da versão 5.1.0 erros relacionados a timezone passam a ser gerados sob a forma de E_STRICT e E_NOTICE. Erros de timezone podem ser:

  • Nenhuma timezone definida pelo usuário
  • Timezone desconhecida definida
  • O PHP atribui a timezone através da variável TZ do sistema operacional (Só feito antes do PHP 5.3)

Caso você não saiba o que é uma timezone, sugiro a você que estudo MUITO sobre internacionalização. Caso você queira saber um pouco mais sobre isso, eis uma breve introdução só sobre timezones, caso contrário, pule o parágrafo abaixo:

A Terra possui diferentes fuso horários baseados no posicionamento do sol (ele não está no centro do céu ao mesmo tempo em todos os lugares do mundo). Os britânicos foram os primeiros a se organizar nas viagens marítimas e manter um cronômetro em sincronia com o relógio de Greenwich, assim podiam calcular sua longitude (lógico que o marco zero era o próprio observatório de Greenwich) e sincronizar encontros de carga e descarga com mercadores de outros países em um horário comum (lembra que o sol não está na mesma posição pra todo mundo?!). Hoje ainda isso é usado (mas com updates frequentes) e o nosso timezone pode ser representado como GMT-03:00, pois estamos três horas atrás do marco zero. Na verdade hoje não se usa mais o GMT, e sim o UTC. O que é o UTC? A mesma coisa que o GMT com a diferença que o UTC sofre alterações constantes acompanhando a posição exata do sol para cada timezone, o porquê disso é interessante mas não vou alongar mais. Sorry. A única coisa que é válida saber também é que UTC e GTM só são iguais se você desconsiderar os segundos de alteração que o UTC sofre por causa da rotação da terra enquanto o GTM se mantém inalterado. O UTC é a base de timezone e fusos para o mundo todo, mas não se importe muito se você vir pessoas usando GTM ao invés de UTC, agora você sabe um pouco mais que elas :P (Sugerimos que de uma olhada no livro de Derick Rethans: Guide to Date and Time Programming)

A partir do PHP 5.3 o PHP tenta determinar o timezone na seguinte prioridade:

  1. Utilizar o timezone estabelecido pela função date_default_timezone_set()
  2. Ler a entrada date.timezone do php.ini

Antes do PHP 5.3, o PHP tentava ler a variável TZ da shell antes de buscar no php.ini, mas isso deu problemas demais e optou-se por forçar os desenvolvedores a realmente entender e definir uma timezone. Logo, se você não definir, um erro é jogado na tela. Você pode definir isso através de um ini_set() ou através da date_default_timezone_set(). A título de curiosidade nosso timezone é “America/Sao_Paulo”.

Existe uma função também, a date_timezone_set(), mas ela não é aceita como resposta a esta questão. Ela define uma timezone a um objeto DateTime, como a função date() não tem relação direta com o objeto DateTime não resolveria o problema do código da questão.

A resposta correta, então, para essa questão seria date_default_timezone_set(), que pouca gente acertou. A grande maioria tentou como resposta alterar o nível de error_reporting ou usar o @ para suprimir o erro. Não aceitamos respostas que modificassem as configurações do php.ini (portanto ini_set() foi descartado também) e muito menos formas de supressão de erro, como o @, uma vez que suas práticas são péssimas e desencorajadas sob pena de morte se encontrarmos alguém fazendo isso. Erros existem para ser interpretados, e não ignorados. Pense nisso.

Resposta: date_default_timezone_set().

Quais das classes abaixo não existem?

Vamos discutir opção por opção:

  • SplFixedArray: Implementação da SPL de um array de tamanho fixo. Esta implementação é mais rápida e usa menos memória que a implementação de Array nativa do próprio PHP, foi adicionada na versão 5.3.0;
  • SplInt: Uma das implementações de SplType que estão sendo feitas no PHP através de uma extensão PECL. Apesar de não serem nativas do PHP, essa classe existe dentro do contexto oficial do PHP. Tanto é que todas as implementações podem ser encontradas no manual;
  • UnexpectedValueException: Uma das Exceptions padrão implementadas na SPL desde a versão 5.1 no PHP de forma nativa;
  • InfiniteIterator: Implementação de um Iterator que fica infinitamente varrendo algo iterável (um array ou um objeto que implementa a interface de Iterator) sem a necessidade de se chamar o rewind() no final do mesmo;
  • SplFileInfo: Esta classe oferece informações detalhadas de um determinado arquivo;
  • DateTime: Classe introduzida no PHP 5.2, praticamente inteira feita pelo Derick Rethans, para se trabalhar com data e hora;
  • SplObject: É, fui criativo no nome da classe e até que ela tem um nome bonito. Mas não existe;
  • StdClass: Por incrível que pareça, essa existe. É uma classe padrão e vazia que o PHP utiliza em determinados casos. Exprimente executar isso e veja você mesmo: <?php var_dump((object) ‘a’) ?>;

Resposta: SplObject.

Quais destes são benefícios de se usar a programação orientada a objetos?

Vamos lá, essa não era difícil. A única opção errada aqui era “Maior rapidez e performance na execução”. Apesar de isso ser discutível de uma forma geral, um mesmo código Orientado a Objetos contra um Procedural irá ter um mínimo de perda de performance. Num conceito global, muitas vezes um sistema inteiro OO é muito mais rápido e leve do que um Procedural, mas, em linhas gerais, OO é mais lento que Procedural.

A resposta correta então era marcar todas as 3 opções que não a “Maior rapidez e performance na execução”. Respostas parciais foram tidas como incorretas como em qualquer outra questão.

A palavra ________ é usada para impedir que sub-classes possam alterar um método?

Essa também é bem simples. O que podemos fazer para explicitar que determinado método não pode ser modificado pelas classes que herdarem as propriedades e métodos de outra classe? A palavra “final“. Repare que essa palavra reservada simplesmente impede que o método seja reescrito, mas não altera em nada as propriedades de visibilidade daquele método. Aliás, qualquer resposta que tenha algo relacionado com visibilidade aqui estava errada.

Portanto a resposta correta é: “final”.

Quais funções seriam necessárias para converter “i love PHP 5″ em “5 PHP EVOL I”?

Outra mamata para o pessoal. Era só saber quais funções existiam e executá-las para obter o resultado final. A diferença entre a string final e a inicial é que a final está inteira em letras maiúsculas e revertida. A prova de certificação possui diversas questões semelhantes e esta, mostrar nomes de funções a fim de confundir você.

A resposta correta é: strtoupper(), strrev().

Considerando este trecho de código (http://pastie.org/1015157), qual será a saída?

Ok, nossas orelhas arderam. Quase todos tivemos problemas de saúde e passamos por um inferno astral enorme. E todos astrólogos, tarólogos, etc nos falaram que foi por causa desta questão. Vamos lá, ela era chata. Fato. Mas não é tão difícil assim. É só ter paciência e usar a caneta e o papel que você ganha ao entrar na sala para fazer o exame de certificação, não tem choro nem vela. O jeito pra resolver essa é interpretar o código mesmo.

A resposta correta para esta questão é: “312211”.

Quais métodos podem ser usados para evitar o SQL Injection?

Mais uma questão que vamos comentar item a item:

  • Prepared Statements: Comentamos no PHPSPCast de segurança que eles contribuem contra alguns ataques de SQL Injection e isso é verdade. Eles já procuram escapar todo conteúdo prejudicial ao banco utilizando funções nativas do driver do próprio banco, mas, como qualquer medida de segurança, não deve ser considerada como 100% eficaz e deve ser utilizada em conjunto com outras;
  • Conexões persistentes: Bom, a vantagem de conexões persistentes é que elas estão sempre disponíveis e a aplicação não vai perder o tempo de abrir a conexão com o banco de novo. Mas você precisa saber como trabalhar com elas. Enfim, não têm nada com questões de segurança;
  • Unbuffered Queries: Quando usadas, o banco envia os resultados para o PHP assim que o primeiro registro é encontrado e o PHP, por sua vez, não faz um pré-processamento do que está recebendo: ele libera os resultados automaticamente pra uso. Isso economiza memória e é mais rápido. Porém você não pode usar funções que dependam da análise desse resultado, como número de linhas retornado ou ir diretamente para um determinado registro;

A resposta portanto para essa questão era: “Prepared Statementes”.

Qual a saída do código: <? echo count (“123″) ?>?

A última das moicanas. E uma bela de uma pegadinha. Qual o detalhe que vocês deveriam ter notado, ou notaram e a pegadinha é tão cretina que nem certo deu: count() serve para contar arrays e objetos iteráveis, ele não é a strlen(). Ok, e por que ele retorna 1 (um) se nós não passamos nenhum array para a função?

Simples: por esperar um array, o PHP converte automaticamete o valor passado para um; é o mesmo que executar <?php echo count((array) “123”); ?>. Experimente dar um var_dump() no lugar do count() e você verá que o resultado é um array de uma posição contendo o valor “123”.  Caso você esperava um erro pela falta do “;” no final da função, repare o fechamento de tag do PHP. O fechamento de tag implicitamente é encarado como um “;” também, tornando-o desnecessário. Sim, fizemos de propósito.

A resposta correta então para última questão é 1 (um).

O resultado da promoção

Como falamos, o objetivo da promoção é preparar vocês pra encarar a prova de forma séria, saber lidar com o tempo e com os diferentes tipos de questões que podem surgir, por isso a promoção foi baseada em quem terminava primeiro, para dar este sentimento de estar fazendo a prova com o tempo contra você.

Dito isso, ao longo do tempo tivemos alguns problemas na prova, como um erro de digitação em uma das questões então fomos bem atenciosos ao fato, embora não concordemos com a mentalidade de “vou procurar um erro” ao invés de encarar a prova com algo honesto, quem apontou o erro ou foi alertado para sua correção ou foi aceito sua nova resposta antes do prazo de 3h entre cada resposta.

Conforme o combinado iríamos aceitar apenas quem acertasse todas as questões, mas percebemos que fomos extremamente perversos e isso não se tornou realidade, portanto ordenamos por número de acertos, tempo de entrega e consideramos as questões com maiores reclamações, assim, sem mais delongas, aqui estão os vencedores da promoção:

  1. Thiago Rigo (ZCE + Livro + php|arch)
  2. Alexandre dos Santos Andrade (ZCE + Livro + php|arch)
  3. Alexandre Gomes Gaigalas (ZFC  + php|arch)
  4. Silvano Girardi Jr. (ZFC  + php|arch)
  5. Luís Otávio Cobucci Oblonczyk (php|arch)

Parabéns aos vencedores! Entraremos em contato com vocês para dar andamento na entrega.

Esta promoção contou com o apoio de:
Zend
e php|arch

Promoção “O PHPSPCast quer que você se certifique!”

Se você está vendo este post, existem dois motivos:

  • Você sabe da promoção e está correndo para garantir seu prêmio
  • Você não sabe da promoção e não sabe o que está perdendo

Caso você esteja no primeiro grupo, saiba que as regras são as seguintes:

  1. Você deve responder todas as perguntas corretamente  para ser considerado um “possível ganhador”
  2. Os prêmios serão distribuídos na ordem descrita abaixo para cada “possível ganhador” na ordem em que o registro das respostas for feito. Respondeu primeiro, e tudo certo, têm grande chance de ganhar
  3. Não são permitidos envios de respostas consecutivas (responder o formulário duas vezes seguidas), deve haver um número razoável de participações de outras pessoas entre duas repostas da mesma pessoa. Caso sejam consideradas consecutivas, será utilizada o primero conjunto de respostas enviadas
  4. Somente um prêmio por ganhador

A ordem da distribuição dos prêmios é a seguinte:

  1. 1 voucher de ZCE + 1 Study Guide + 1 Assinatura de 12 edições da PHP Architect
  2. 1 voucher de ZCE + 1 Study Guide + 1 Assinatura de 12 edições da PHP Architect
  3. 1 voucher de ZCF + 1 Assinatura de 12 edições da PHP Architect
  4. 1 voucher de ZCF + 1 Assinatura de 12 edições da PHP Architect
  5. 1 Assinatura de 12 edições da PHP Architect

Se você esta no segundo grupo e não sabe do que estamos falando, é extremamente recomendável que escute o PHPSPCast sobre certificação clicando aqui

 

 

Updates:

  • As submissões de respostas estão CANCELADAS a partir de 26/07/2010 às 16:00
  • Você ainda pode acessar as questões através do formulário do Google Docs
  • O post com o resultado da promoção e resposta para as questões é este aqui

 

 

Esta promoção conta com o apoio de nossos parceiros: Zend e php|architecht