Ruby: Lição 1

Postado por 4luada, 2 de julho de 2014, às 00:40

0 Comentários

Por causa de uma vaga de estágio, resolvi aprender Ruby on Rails. Já estava na minha lista, mas acabei puxando mais pra frente.

Como sempre, começo procurando por diversos tutoriais pela internet. Dou preferência aos tutoriais em inglês. Por algum motivo me dou melhor com eles. De início, escolhi um que parecia bem básico, e tratava os tópicos iniciais com bastante detalhes: Ruby Learning.com.

Ruby in Rails

Antes de tudo, o que é Ruby? É uma linguagem de programação interpretada multiparadigma orientada a objetos. Uma linguagem interpretada é tal cujo código fonte é executado por um programa - o interpretador -, e em seguida executado pelo sistema operacional ou processador. Ruby foi criado em cima do "Principle of least surprise" (Princípio de mínimas surpresas, em tradução livre), por Yukihiro Matsumoto (Matz).

Ruby é uma linguagem open-source, e funciona em diversas plataformas e arquiteturas. Portanto, assim como no tutorial, eu tratarei de Ruby no Windows, mas pouca coisa muda no Mac ou Linux.

Antes de tudo, será necessario fazer download do Ruby. No Windows, o modo mais fácil é fazer download do Ruby Installer. Depois do download, basta instalar o Ruby, preferencialmente com as configurações padrão. Você encontrará, então, dois executáveis (na distribuição para Windows) na pasta /bin de onde você instalou o Ruby (se usou as configurações padrões, provavelmente estará no "Local Disc", ou C: uma pasta com nome Ruby<version>). Um deles, o ruby.exe abre uma janela de DOS Shell de Prompt de Comando - pode ser usado para aplicações que lêem ou escrevem no input ou output padrões, mas não é recomendável para aplicações que, por exemplo, possuem uma interface gráfica, ou se o Ruby é usado por outro programa. Nesses casos é preferível usar o executável rubyw.exe, que é basicamente a mesma coisa que o anterior, mas sem a entrada e saída padrões, nem abre uma janela DOS Shell quando é executado.

Contudo, inicialmente, não usaremos nenhum desses executáveis, mas, sim, um outro executável chamado "Start Command Prompt with Ruby".

Para escrever os códigos-fonte você pode usar qualquer editor de texto-puro (não usar processadores de texto, como Microsoft Word), como Gedit, Sublime Text ou até o Bloco de Notas.

É recomendável criar uma pasta para os programas em ruby que seja próxima da pasta "Home", a pasta inicial. No Windows normalmente é o "C:\Users\<usuario>". Para ter certeza, abra o "Start Command Prompt with Ruby" e veja o endereço da pasta inicial.

Meu Primeiro Programa em Ruby

A primeira coisa a se fazer após abrir o editor de texto é determinar o tamanho do TAB para 2 espaços. Na prática, a indentação não afeta o programa, mas é o padrão utilizado pela comunidade e será melhor caso você planeja distribuir seu código.

Por convenção, os arquivos-fonte de Ruby têm a extensão .rb. No Windows também é comum usar a extensão .rbw. Convencionou-se que toda pasta/diretório e todo arquivo são nomes de classes/módulos com apenas letras minúsculas e extensão .rb.

Comecemos nosso primeiro programa. Escreva o seguinte no seu editor:

p001hello.rb
  • # p001hello.rb
  • puts 'Hello world!'

E salve ("Salve como...") com o nome p001hello.rb e salve na sua pasta.

Para rodar o programa, abra o "Start Command Promt with Ruby", navegue até a pasta onde você salvou o arquivo-fonte, e digite o seguinte comando:

Command Prompt with Ruby
  • c:\Users\Me\rubyprograms> ruby p001hello.rb
  • Hello world!
  • c:\Users\Me\rubyprograms>

OBS: para navegar entre pastas, você pode usar os seguintes comandos:

  • cd <nome_da_pasta> : esse comando vai para a pasta escolhida
  • cd.. : esse comando navega para a pasta acima da atual
  • dir : esse comando lista os arquivos e sub-pastas da pasta atual

O método puts simplesmente escreve uma string (que vem logo em seguida - um parâmetro) na tela.

Note que: Em Ruby não existe um método main por onde a execução se inicia. O interpretador recebe um script de comandos, e os executa a partir da primeira linha até a última. Além disso, tudo em Ruby é um objeto, e cada um possui métodos (funções). E existem funções que independem de Objetos - ou melhor, são métodos da classe Object, portanto, está disponível para todos os objetos. É o caso dos métodos puts e gets.

Note que: É opcional o uso de parêntesis ao chamar métodos. São válidos:

Chamada de métodos
  • funcao
  • funcao()
  • funcao(a. b)
  • funcao a, b

Note que: Como Ruby é uma linguagem interpretada, ela não precisa ser compilada para ser executada.

Recursos do Ruby

Você pode começar a escrever seu programa a partir de qualquer linha.

O Ruby é "case-sensitive", ou seja, letras minúsculas e letras maiúsculas são distintas. Por exemplo, a palavra-chave end é completamente diferente da palavra-chave END.

Para se comentar uma linha, basta colocar um caractere '#' no antes do comentário. Tudo a seguir do caractere até a quebra da linha será ignorado pelo interpretador. Já para blocos de comentários que abrange várias linhas, comece com uma linha iniciada por =begin e termine com =end. Cuidado: isso só funciona se o sinal = for o primeiro caracteres de suas linhas.

É possível escrever vários comandos em uma mesma linha, separados por ponto-vírgula. Mas a pontuação não é necessária nos finais das linhas - uma quebra de linha é tratada como um ponto-vírgula. Se uma linha termina com uma '\', a quebra de linha seguinte é ignorada, de forma a ser possível ter um comando que se estende por várias linhas.

As palavras-chave, consideradas palavras reservadas, não podem ser usadas para outros propósitos além das já designadas a elas, portanto não podem ser usadas como identificadores (variáveis) - em compensação você pode prefixá-las com @, @@ ou $ para usá-las como instâncias, classes ou nome de variáveis globais. Mas a melhor práticas é tratar essas palavras-chave como reservadas.

Tudo tem valor true, exceto as palavras reservadas false e nil. Ou seja, 0 (zero) e null têm valor true.

Números

Em Ruby, números sem pontos decimais são inteiros, caso contrário, são pontos flutuantes (float) - é necessário colocar pelo menos um dígito antes do ponto. Um número inteiro pode ser determinado por uma sequência de dígitos numéricos (underscore podem ser incluídos no meio - não no começo nem no fim -, normalmente para separar cada três casas decimais, os underscores serão ignorados).

Os principais operadores aritméticos são:

  • + : soma
  • - : subtração
  • * : multiplicação
  • / ou % : divisão (% = módulo, divisão inteira)

O operador módulo tem como resultado o resto da divisão do primeiro operando pelo segundo - mas o sinal do resultado é sempre igual ao sinal do segundo operando.

Os inteiros do Ruby são objetos das classes Fixnum ou Bignum, cada um representa inteiros de diferentes tamanhos. Ambos descendem da classe Integer, que por sua vez descende da classe Numeric. Já os pontos flutuantes são objetos da classe Float. As outras classes Complex, BigDecimal, e Rational não fazem parte do Ruby, são incluídos nele pela biblioteca padrão (standard).

A lista dos operadores, na ordem de precedência (do menor para maior):

  1. Blocos: begin (início de bloco), end (fim de bloco)
  2. Modificadores: if , unless , while , until
  3. Operadores lógicos: or ("ou"), and ("e")
  4. Negação: not
  5. Definição: defined? (checa se argumento especificado foi definido)
  6. Atribuição: = , += , -= , *= , /= , %= , &= , |= , >>= , <<= , &&= , ||= , **= , ^=
  7. Ternário: ? [...] : [...] (if-then-else)
  8. Alcance: .. (inclusivo), ... (exclusivo)
  9. "Ou" lógico: ||
  10. "E" lógico: &&
  11. Comparações de Igualdade/Correspondências: <=> (0 se a=b, 1 se a>b, e -1 se a<b), == (igual), === (igualdade numa cláusula 'when' de uma instrução 'case'), != (diferente), =~ (retorna posição de "/<expressão_regular/" em uma string*), !~
  12. Comparação: <= , < , > , >=
  13. "Ou" (bit a bit p/ inteiros): ^ ("ou" exclusivo), | ("ou" regular)
  14. "E" (bit a bit p/ inteiros): &
  15. Shift: << (shift para a esquerda, ou append), >> (shift para a direita)
  16. Operadores aritméticos: + (soma), - (subtração)
  17. Operadores aritméticos: * (multiplicação), / (divisão), % (módulo)
  18. ETC: ! ("não"), ~ (complemento, inverte bit a bit), + (+@, mais unário), - (-@, menos unário)
  19. Exponenciação: **
  20. Elemento(s): [] , []=
  21. Resolução constante: :: (permite que constantes/instâncias/métodos sejam acessados fora da classe/módulo onde foi definido**)

* Um exemplo de uso do operador '=~' :

  • /mi/ =~ "hi mike"    # retorna: 3
  • "hi mike" =~ /mi/    # retorna: 3
  • "hi mike" =~ /hello/ # retorna: nil

** Um exemplo de uso do operador '::' :

  • GLOBAL_VAR = 0
  • module Foo
  •   LOCAL_VAR = 0
  •   ::GLOBAL_VAR = 1 #Set the Global variable to 1
  • end
  • puts Foo::LOCAL_VAR #Prints the local "Foo" constant

Os operadores dos itens 10 a 19 são, na verdade, chamadas de métodos.

Parêntesis funcionam normalmente como na aritmética, ou seja, as operações dentro de parêntesis têm maior precedência. Notem que: não há operadores de incremento (++) ou decremento (--), nem formas "pre" ou "post".

Ambos or e || retornam o primeiro argumento, a não ser que este seja falso - neste caso eles avaliam e retornam o segundo argumento. A única diferença entre eles é a precedência (o segundo tem maior precedência que o primeiro). É comum usar o operador || para atribuir um valor a uma variável apenas se aquela variável já não possuir um valor. Ex:

  • @variable = @variable || "other value"
  • @variable ||= "other value"

Já o operador alternativo, or, tem a vantagem de ter precedência menor que o operador de atribuição, de forma a poder usar diversas expressões booleanas para se "encontrar" o valor de uma variável. Ex:

  • # Método 'g' que aceita 1/+ argumentos, em formato de Array
  • def g *args
  •   args # retorna array
  • end
  •  
  • def f arg
  •   arg
  • end
  •  
  • x,y,z = [true, 'two', false] # atribuição paralela
  •  
  • if a = f(x) and b = f(y) and c = f(z) then
  •   d = g(a,b,c)
  • end
  •  
  • # Imprimir e inspecionar d
  • p d

Strings

Strings literais são sequências de caracteres (ou nada - para dar uma string vazia) entre aspas simples ou duplas. Portanto "Hello" e 'Hello' são strings idênticas, apesar da segunda ser mais eficiente.

É bom saber que existe um tipo de string especial que é delimitada pelo acento grave (`). No caso de uma instrução do tipo:

  • puts `dir`

A string é enviada e executada pelo sistema operacional como um comando, e o output do comando (no caso, uma lista de sub-pastas e arquivos da pasta atual) será impresso por puts. Para o mesmo propósito também existe o método system, que executa o comando num sub-processo e retorna true se o comando foi encontrado e executado com sucesso, ou false se o comando terminou com um status diferente de zero, ou nil se o comando falhou em ser executado. E o output do comando irá para o mesmo destino que o output do seu programa. Ex:

  • system("dir")

Outros métodos interessantes com strings são:

  • # Concatenando strings
  • puts 'I like ' + 'Ruby'
  •  
  • # Appending a uma string
  • a = 'I like '
  • a<<'Ruby'
  •  
  • # String de várias linhas
  • b = <<END_STR
  • A partir daqui se inicia uma string de várias linhas, e
  • é delimitado por <<+[delimitador]) e pela repetição do
  • delimitador logo abaixo, portanto acaba nesta linha
  • END_STR
  •  
  • # Imprimindo aspas e outros caracteres especiais
  • puts 'It\'s Ruby'
  • puts 3.1416
  •  
  • # Imprimindo a string três vezes
  • puts 'Hello' * 3

Note que: se o argumento de puts não for uma string, puts chama o método to_s do objeto enviado como argumento e imprime a string retornada.

Variáveis e Atribuições

Uma variável passa a existir a partir do momento em que o interpretador vê uma atribuição à essa variável. Variáveis só podem ter letras, números e underscores, e não podem começar com um número ou uma letra maiúscula. Palavras-chave (keywords) não podem ser usadas como nomes de variáveis.

Constantes começam com letras maiúsculas.

Alguns métodos comuns são:

  • 5 + '2'.to_i     # .to_i converte para integer
  • 5.1 + '2.3'.to_f # .to_f converte para float
  • 200.to_s         # .to_s converte para string

Fim da primeira lição de Ruby. Nem essa lição nem o tutorial que usei como base são muito amigáveis para iniciantes. Deve-se ter noção de outras linguagens básicas para entender meu resumo completamente...

Na lição seguinte vou estudar Scope, Inputs e possivelmente outras coisas. Até!

Marcadores: ,


Pokédex em PHP: Banco de Dados

Postado por 4luada, 10 de abril de 2014, às 23:58

0 Comentários

Apesar de tudo que aprendi anteriormente, a forma de se criar um database do W3Schools não estava bem funcionando para mim. Portanto, fui atrás de um passo-a-passo: Home and Learn. Seguindo o tutorial, criei um database chamado pokemon_db.

Criando um Database

Seguindo o tutorial, abri o Administrador de PHP do WAMP: clique no ícone do WAMP na barra de ferramentas e selecione 'phpMyAdmin'. Abrirá uma janela (ou aba) do seu navegador padrão com uma página de login. O login e senha do administrador é "root", sem senha (é possível adicionar uma senha depois de logar, mas não farei isso - pelo menos por enquanto). O "root" tem acesso a tudo, e permissão a tudo. Vá para a aba "Databases/Bancos de Dados". Lá está a lista de todos os databases existentes do seu servidor, além de um pequeno formulário para se criar um database novo, logo no topo. No campo, coloque o nome do novo database (coloquei 'pokemon_db') e clique em 'Create/Criar'. Pronto, seu database está criado.

O query correspondente para se criar a database seria:

mySQL query
  • CREATE DATABASE IF NOT EXISTS `pokemon_db` DEFAULT CHARACTER SET ascii COLLATE ascii_bin;

Esse query foi o criado pelo phpMyAdmin, e ele determina também o conjunto de caracteres do database.

Criando as tabelas

Vou criar uma série de tabelas, ao invés de uma única, a fim de realmente explorar o máximo que der do mySQL e PHP. A primeira e principal tabela a ser criada: Pokemon6 (da geração 6). Logo depois de se criar um database, você poderá criar uma tabela (senão, na página do database criado, na aba "Structure"), há um pequeno formulário onde você coloca o nome da nova tabela a ser criada e o número de colunas (é possível acrescentar ou remover colunas depois) - recordando: as colunas são os campos das tabelas. Ao dar 'Go/Executar', uma página com um grande formulário será aberta, onde você colocará as características de cada coluna da nova tabela (nome da coluna, o tipo de dado na coluna, tamanho do dado - ou valores em caso de SET ou ENUM, valor padrão, conjunto de caracteres a ser usado, atributos extras dos valores, se pode aceitar valor nulo, formato de índice, se os valores devem ser automaticamente incrementados, e comentários). Para a tabela de Pokémons, criei os seguintes campos:

  • ID : SMALLINT NOT NULL PRIMARY AUTO_INCREMENT
  • Name : VARCHAR(20) NOT NULL
  • Types : SET('Bug','Dark','Dragon',...)
  • Weakness : SET('Bug','Dark','Dragon',...)
  • Resistance : SET('Bug','Dark','Dragon',...)
  • HP : TINYINT(3) UNSIGNED NOT NULL
  • Attack : TINYINT(3) UNSIGNED NOT NULL
  • Defense : TINYINT(3) UNSIGNED NOT NULL
  • Sp.Attack : TINYINT(3) UNSIGNED NOT NULL
  • Sp.Defense : TINYINT(3) UNSIGNED NOT NULL
  • Speed : TINYINT(3) UNSIGNED NOT NULL
  • Height : FLOAT NOT NULL
  • Weight : FLOAT NOT NULL
  • Abilities : VARCHAR(200)
  • Evolution : VARCHAR(20)
  • Pre-Evolution : VARCHAR(20)
  • Mega-Evolution : TINYINT(1)
  • Description : VARCHAR(350)
  • Image : VARCHAR(200) NOT NULL
  • Icon : VARCHAR(200) NOT NULL
  • Hatch : INT(11) UNSIGNED
  • Color : ENUM('Red','Blue',...) NOT NULL
  • Generation : TINYINT(3) UNSIGNED NOT NULL
  • Locations : set('Kanto','Sevii Islands','Johto','Hoenn','Sinnoh','Unova','Kalos')
  • Egg Group: SET('Amorphus','Bug',...)

Farei outras tabelas a fim de obter outros tipos de informações. A segunda tabela a ser criada é a chamada Abilities:

  • ID : SMALLINT PRIMARY NOT NULL AUTO_INCREMENT
  • Name : VARCHAR(20) NOT NULL
  • Effect : VARCHAR(500) NOT NULL
  • Generation: TINYINT(3) UNSIGNED NOT NULL

Em seguida criei a tabela de Moves:

  • ID : INT(10) PRIMARY NOT NULL AUTO_INCREMENT
  • Name : VARCHAR(20) NOT NULL
  • Type : ENUM('Bug','Dark','Dragon',...)
  • Category : ENUM('Status','Physical','Special') NOT NULL DEFAULT='Physical'
  • Power : TINYINT(3) UNSIGNED
  • Accuracy : TINYINT(3) UNSIGNED
  • PP : TINYINT(3) UNSIGNED NOT NULL
  • TM : SMALLINT(5) UNSIGNED
  • HM : TIMYINT(3) UNSIGNED

E a última tabela a ser criada foi Locations:

  • ID : INT(10) PRIMARY NOT NULL UNSIGNED AUTO_INCREMENT
  • Name : VARCHAR(20) NOT NULL
  • ,
  • Region :SET('Kanto','Sevii Islands','Johto','Hoenn','Sinnoh','Unova','Kalos') NOT NULL DEFAULT 'Kanto'
  • Route : INT(11)
  • Floors : TINYINT(3) UNSIGNED
  • Pokemon : VARCHAR(500)

De fato, eu poderia ter criado o database, as tabelas e até os registros por códigos de HTML. Verei no futuro se refaço todo o database por querys ao invés de usar o myPHPAdmin. O myPHPAdmin facilita muito a criação e manutenção dos databases, mas acho que é bom eu saber fazer manualmente também. Mas deixarei para um próximo post.

Só para constar, para se criar uma tabela em mySQL (no exemplo, a tabela abilities) seria com a seguinte query:

mySQL query
  • CREATE TABLE IF NOT EXISTS `abilities` (
  •   `ID` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  •   `Name` varchar(20) COLLATE ascii_bin NOT NULL,
  •   `Effect` varchar(500) COLLATE ascii_bin NOT NULL,
  •   `Generation` tinyint(3) unsigned NOT NULL,
  •   PRIMARY KEY (`ID`)
  • ) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin AUTO_INCREMENT=81 ;

Criando Registros

Para se criar registros me uma tabela, primeiro acesse a tabela na aba 'Estrutura' de um database. Vou adicionar umas habilidades na tabela abilities. Vá na aba 'Inserir'. Irá aparecer um formulário em que você pode criar vários registros de uma vez, mostrando os campos de cada tabela e seus respectivos tipos. Mas recomendo criar poucos de cada vez para não ter problemas. Estou criando de 20 em 20 registros.

É possível usar uma função para se calcular o valor do campo, mas não vou utilizar esse recurso por enquanto. Colocarei os valores direto, exceto no campo ID, que deixarei para o sistema crie o valor automaticamente (já que todos os IDs de todas as tabelas são chaves primárias - PRIMARY -, e AUTO-INCREMENT, ou seja, auto-incrementadas).

Em mySQL, o query equivalente para se criar o registro de um pokémon (no exemplo, o Chesnaught) seria:

mySQL query
  • INSERT INTO `pokemon_db`.`pokemon6` (
  •   `ID` ,`Name` ,`Types` ,`Weakness` ,`Resistance` ,`HP` ,`Attack` ,`Defense` ,`Sp.Attack` ,`Sp.Def` ,`Speed` ,`Height` ,`Weight` ,`Abilities` ,`Pre-Evolution` ,`Evolution` ,`Mega-Evolution` ,`Description` ,`Image` ,`Icon` ,`Hatch Steps` ,`Color` ,`Generation` ,`Locations` ,`Egg Group`
  • ) VALUES (
  •   '2',
  •   'Ivysaur',
  •   'Grass,Poison',
  •   'Fire,Flying,Ice,Psychic',
  •   'Electric,Fairy,Fighting,Grass,Water',
  •   '60',
  •   '62',
  •   '63',
  •   '80',
  •   '80',
  •   '60',
  •   '1',
  •   '13',
  •   'Overgrow,Chlorophyll,Hidden Ability',
  •   'Bulbasaur',
  •   'Venusaur',
  •   '0',
  •   'When the bulb on its back grows large, it appears to lose the ability to stand on its hind legs. The bulb on its back grows by drawing energy. It gives off an aroma when it is ready to bloom.',
  •   'http://cdn.bulbagarden.net/upload/thumb/7/73/002Ivysaur.png/250px-002Ivysaur.png',
  •   'http://cdn.bulbagarden.net/upload/6/6b/002MS.png',
  •   '5609',
  •   'Green',
  •   '1',
  •   NULL ,
  •   'Grass,Monster'
  • );

O ato de adicionar registros em umat tabela pode ser chamado também de "popular" uma tabela.

Acessando um Banco de Dados por PHP

Depois de popular a tabela pokemon6 (a fim de realizar alguns testes com PHP), incrementei o script.php e o código php dentro do body para ver se tudo funcionava bem:

script.php
  • <?php
  •   $gen = 6;
  •   
  •   $user_name = "root";
  •   $password = "";
  •   $database = "pokemon_db";
  •   $server = "127.0.0.1";
  •   $conection = mysqli_connect($server, $user_name, $password, $database);
  •   if (mysqli_connect_errno()){
  •     echo "Failed to connect to MySQL: " . mysqli_connect_error();
  •   }
  • ?>
index.php (trecho)
  • <body>
  • <div id="Container">
  •   <div id="Display">
  •   <?php
  •     if($gen==6){
  •       echo '<form id="SeachField" class="op"><input type="text" maxlength="18" /><input type="submit" value="" /></form>';
  •     }
  •     $selection = mysqli_query($conection,"SELECT * FROM pokemon");
  •     while($row = mysqli_fetch_array($selection)){
  •       echo '<div class="pokemon">' . $row['Name'] . "</div>";
  •     }
  •   ?>
  •   </div>
  • </div>
  • </body>

O código funcionou perfeitamente, imprimindo o nome de cada Pokémon da tabela Pokemon em diferentes divs. Apenas para teste, pois no futuro, haverão ícones dos monstrinhos ao invés de seus nomes. Veja a seguir como está ficando a Pokédex:

É, lá está o campo de pesquisa, que ainda não funciona. E lá estão os nomes dos pokémons impressos no canto do visor da Pokédex. Em seguida, vou popular o restante das tabelas, que é a parte mais chata de todo o processo.

Marcadores: ,


Pokédex em PHP: Layout

Postado por 4luada, 8 de abril de 2014, às 14:47

0 Comentários

Como parte do meu treinamento de PHP, decidi criar um site de pokédex utilizando o que aprendi de PHP e MySQL. Já tenho o WAMP instalado, e tenho usado o Dreamweaver para criar os códigos.

Design

A primeira coisa que fiz, porém, não foi código nenhum, mas a imagem da capa da Pokédex. Depois de analisar todas as Pokédex de todas as gerações, optei por utilizar o último modelo, da geração 6: XY, mais moderna e até mais simples. Criei a imagem em 2D mesmo, sem dar profundidade, seguindo a moda de Design Plano. Usei o Photoshop CS2.

Também fiz uma imagem PNG semi-transparente para ser a tela da pokédex.

Codificando

Hoje comecei com o código da página em si, em PHP. Eu tenho a inteção de no futuro o usuário poder trocar o modelo da pokédex, portando já deixei um código que define o arquivo CSS que será usado dependendo do valor da variável %gen (de generation). Para isso criei um arquivo PHP separado, chamado script.php, que irá verificar a geração selecionada (possivelmente pelo método GET). Mas por enquanto ele só define a geração como 6:

script.php
  • <?php
  •   $gen = 6
  • ?>

E na parte HEAD do index.php, incluí o arquivo CSS pelo PHP conferindo a geração da pokédex a ser usada. Os arquivos CSS terão todos nomes "gen#.css", com # sendo o número referente à geração.

index.php (trecho)
  • <?php
  •   include "script.php";
  •   echo "<link href='gen$gen.css' rel='stylesheet' type='text/css'>";
  • ?>

Agora, há elementos que podem estar presentes em uma pokédex de uma geração, mas ausente em outras. Portanto decidi incluir alguns elementos pelo PHP, verificando a geração da pokédex a ser usada para decidir se tal elemento deve ser incluído ou não. O primeiro conteúdo que decidi colocar foi o formulário de pesquisa dentro de BODY.

index.php (trecho)
  • <body>
  • <div id="Container">
  •   <div id="Display">
  •   <?php
  •     if($gen==6){
  •       echo '<form id="SeachField" class="op"><input type="text" maxlength="18" /><input type="submit" value="" /></form>';
  •     }
  •   ?>
  •   </div>
  • </div>
  • </body>

Durante todo o processo, fui também estilizando a página pelo CSS. E antes de prosseguir com todo o display e tabelas e botões de navegação, passei para o database.

Marcadores: ,


PHP: Lição 3

Postado por 4luada, 31 de março de 2014, às 21:52

0 Comentários

Continuando com meu estudo de PHP, comecei a estudar MySQL para manipular database. Segui pelo guia de PHP do w3schools, que tem uma seção de Database que explica o básico de MySQL. O site tem um tutorial voltado completamente para SQL, mas deixarei para outro momento.

O PHP tem a capacidade de manipular databases, e MySQL é um sistema de database frequentemente usada em conjunto com PHP para se manipular databases na web. O MySQL roda no servidor, é rádpido e confiável, compilável em várias plataformas, e é gratuito.

O MySQL guarda dados em tabelas, de forma a ser muito útil na hora de classificar os dados. Ele usa queries para fazer pedidos de dados.

No meu caso, o WAMP já instalou o MySQL no servidor PHP.

Conexão com servidor MySQL

A primeira coisa a se fazer antes de qualquer acesso ao database é estabelecer uma conexão ao servidor MySQL através da função:
mysqli_connect([<servidor>],[<username>],[<senha>],[<db_name>]).
A conexão é interrompida automaticamente ao final do script, mas para fechar a conexão antes, há a função:
mysqli_close(<conexão>).

<?php
$conection = mysqli_connect("example.com","peter","abc123","my_db");
if (mysqli_connect_errno()){
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_close($conection); ?>

OBS: SQL não é case-sensitive, ou seja, não diferencia letras maiúsculas de minúsculas.

Criando Database, Tabelas, Chaves Primárias e Registros

Antes de tudo, qualquer comando em SQL é feita em PHP através do comando:
mysqli_query(<conection>, <sql_statement>);

Novo database
O comando para se criar um novo database é:
CREATE DATABASE <db_name>

Nova tabela
Ao se criar uma nova tabela, já se define os nomes das colunas (campos) e os tipos de dados que cada uma irá conter. O comando para se criar uma nova tabela é:
CREATE TABLE <table_name>(<col_name> <type>, ...)
Dentro do parênteses se define as colunas da tabela. Confira os tipos dos dados aqui. Os principais tipos são:

  • String de tamanho fixo (até 255): CHAR(<max_length>)
  • String grande: TEXT
  • Inteiro: INT[(<max_digits>)]
  • Ponto flutuante: FLOAT[(<max_digits>, <max_decimal_digits)]
  • Data (formato YYYY-MM-DD): DATE()
  • Hora (formato HH:MM:SS): TIME()
  • Data e Hora (formato YYYY-MM-DD HH:MM:SS): DATETIME()

Chave Primária
Toda linha da tabela deve ter um campo "Chave Primária", usada para identificar de modo único e exclusivo cada linha da tabela. Portanto cada valor de Chave Primária deve ser único, não pode repetir e nem ser null. Normalmente a "chave primária" é um número ID (de identificação), cujo valor é criado automaticamente, e incrementado automaticamente ao se criar um novo registro, tudo isso adicionando AUTO_INCREMENT depois de definir o tipo de dado da coluna. E para garantir que o valor do campo não é nulo com NOT NULL. Essas declarações podem ser usadas para qualquer campo, não só para o campo da Chave Primária. Para definir um campo como Chave Primária, utiliza-se a declaração PRIMARY KEY(<coluna>).

$sql_statement = "CREATE TABLE Persons (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    name CHAR(30),
    age INT )";

Novo Registro
Um registro corresponde a uma linha da tabela de database, contendo valores para os campos (colunas). Para se inserir um novo registro, utiliza-se o comando:
INSERT INTO <table> [(<column>,...)] VALUES (<value>)

Manipulando dados

Selecionar Registros
Para se selecionar dados do database, utiliza-se o comando:
SELECT <colunas> FROM <table>
as colunas do comando determinam quais dados de cada registro é necessária (se forem todas as colunas, pode-se usar o asterisco '*'). Após obter a seleção de dados, pode-se usar a função mysqli_fetch_array(<sql_selection>) para obter uma linha como uma array, usando o nome da coluna como chave. Note o exemplo:

$selection = mysqli_query($conection,"SELECT * FROM Persons");
while($row = mysqli_fetch_array($selection)){
    echo $row['name'] . " is " . $row['age'] . &quto;years old.";
    echo "<br>";
}

Para filtrar uma seleção, limitando-a para apenas registros que cumpram um determinado critério, utiliza-se o termo WHERE na seleção. Por exemplo:

SELECT * FROM Persons WHERE age=20

O termo ORDER BY <coluna> ASC/DESC ordena os registros selecionados de forma ascendente (default) ou descendente pelo campo determinado. É possível ordenar por mais de uma coluna - neste caso, a segunda coluna é usada apenas se os valores da primeira coluna forem iguais.

Atualizar Registros
Para se editar um dado em um registro, utiliza-se o comando:
UPDATE <table> SET col1=val1, col2=val2, ... [WHERE colX=valX AND/OR colY=valY]
o termo WHERE especifica quais registros devem ser editados. Se o termo for omitido, todos os registros serão modificados.

Deletar Registros
Para deletar registros, há o comando:
DELETE FROM <table> WHERE col=value
onde o WHERE especifica os registroa a serem deletados. Se o termo for omitido, todos os registros serão deletados.

Marcadores: ,


PHP: Lição 2

Postado por 4luada, 25 de março de 2014, às 20:54

0 Comentários

Como continuação do meu aprendizado de PHP, resolvi usar o tutorial de um dos meus sites favoritos para HTML, CSS, Javascript e JQuery, o W3Schools. Não farei um passo a passo desta vez, apenas anotações e resumo do tutorial disponível no site.

Sintaxe

Script
Um script pode ser colocado em qualquer parte da página, e fica sempre entre as tags "<?php" e "?>".
Cada linha de código deve ser finalizada com um ponto-vírgula ';', assim como em javascript.
Funções, classes e palavras-chaves (if, else...) não são case-sensitive. Ou seja, "echo", "Echo" e "ECHO" são iguais. Contudo, todas as variáveis são case-sensitive

Comentários
Há três formas de se comentar um bloco de texto do código. Eles são:

  • // Comentário de 1 linha
  • #Comentário de 1 linha
  • /* Comentário de n linhas, sendo n >= 1 */

Variáveis

Variáveis server para guardar informações. Toda variável tem o formato "$<nome_da_variavel>", ou seja, iniciar com um '$'. Seu nome pode ser constituído por letras, números ou '_', exceto a primeira letra, que não pode ser um número. O nome das variáveis são case-sensitive.

Não há como declarar uma variável, a não ser atribuindo um valor a ela. E não é necessário especificar o tipo de informação que essa variável irá guardar. O tipo da variável é definido pelo tipo de dado que ela está guardando no momento.

Abrangência da variável
A abrangência da variável pode variar dependendo de onde ela tiver sido declarada. Se dentro de uma função, ela é uma variável local e só poderá ser acessada dentro de tal função. Se fora de qualquer função, ela será uma variável global, e só será acessada fora de funções, a não ser que seja através de um método especial: todas as variáveis globais são guardadas numa Array especial $GLOBALS[<index>], e você pode acessá-las de qualquer lugar usando o nome da variável global como index. Exemplo: uma variável global $glub pode ser acessada de dentro de uma função usando $GLOBALS['glub'].

Variável estática
É um tipo de variável que persiste, mesmo depois da função terminar, de modo que, caso a função seja chamada novamente, o valor final da última chamada ainda estará mantido na variável na nova chamada.

Variáveis globais - Superglobais
Várias das variáveis pré-definidas são Superglobais, ou seja, são sempre acessíveis de qualquer lugar do código normalmente, sem precisar usar nenhum método especial. Saiba mais. São elas:
$GLOBAL - array usada para acessar variáveis globais de qualquer lugar do script, sendo a Key o nome da variável global.
$_SERVER - guarda informações sobre cabeçalhos, paths e localizações de scripts, sendo a Key a palavra-chave da informação procurada.
$_REQUEST - usado para coletar dados submetidos por um formulário. Quando o usuário submete dados ao clicar no botão de submit, os dados do formulário são enviados para o arquivo especificado pelo atributo action da tag form. E esse arquivo pode acessar os dados por essa variável global, usando o nome (atributo name) do campo do formulário como índice.
$_POST - normalmente utilizado para coletar dados de formulários cujo método é post. Ou também é usado para passar variáveis. O índice pode ser o nome do campo do formulário.
$_GET - também pode coletar dados de formulários que usam o método get. E também pode coletar valores enviados pela url.

Tipos de dados

String
Sequência de caracteres delimitados por aspas (simples ou duplas).
Strings possuem métodos próprios:

  • strlen(<string>): retorna o comprimento de uma string (número de caracteres)
  • strpos(<string1>,<string2>): retorna a posição da string2 na string1 (contagem a partir do zero). Se não encontrar a string2, a função irá retornar FALSE.
  • ...(etc)...

Integer
Um número inteiro, seja positivo ou negativo. Pode ser especificado em três formatos: decimal, hexadecimal (prefixo: 0x) ou octal (prefixo: 0).

Float
Um número com parte decimal ou na forma exponencial (ex.: 2.3e3 = 2.3^3).

Boolean
Um valor booleano é TRUE (verdadeiro) ou FALSE (falso), apenas. São normalmente usados em testes condicionais.

Arrays
Uma array é capaz de guardar vários valores numa única variável, e você pode acessar cada um ao se referir a uma número de índice.
A função array() é usada para se criar uma array, e existem três tipos de arrays: índice numérico, associativo (Keys) ou multi-dimensionais (arrays que contém arrays). Para se descobrir o "comprimento" de uma array (número de elementos) de uma array, pode-se utilizar a função count(). Saiba mais. Dentre os métodos das Arrays, alguns servem para ordenar seus elementos (saiba mais).
Ex.: $lista = array("item 1", "item 2"); ou $lista[0] = "item1";
Ex.: $dict = array("key1"=>"val1", "key2"=>"val2"); ou $dict['key1']="val1";
(verifique o exemplo do uso de foreach() para rodar por todo $dict)
Ex.: $lista2 = array(
    array("lista2-1",1,2),
    array("lista2-2",2,3)
);

Objects/Class
É uma classe, uma estrutura que guarda dados (propriedades) E informações de como processar esses dados (métodos). É o único caso em que se deve ser explicitamente declarado usando a palavra-chave "class".
Ex.:
class Car {
    var $color;
    function Car($color="green"){
        this->color = $color;
    }
    function what_color(){
        return $this->color;
    }
}

Null
Esse é um valor usado para representar que uma variável não possui valor, ou para esvaziar uma variável.

Constants
Uma variável constante que guarda um valor simples que não pode ter seu valor modificado pelo script. Ela é definida pela função define(<string_name>, <value>[, <bool_case-sensitive>]). O terceiro parâmetro é opcional - seu valor-padrão é FALSE, e determina se NAME==name.
Ex.: define("GREETING", "Welcome!");

Formatação

Data
Leia aqui. Há uma função date() que imprime uma data numa determinada formatação.

Operadores

Operadores Aritméticos
- Adição: '+' (ou '+=' como operador de atribuição)
- Incremento: '++<var>' (pré-incremento*) ou '<var>++' (pós-incremento*)
- Subtração: '-' (ou '-=' para operação de atrobuição)
- Decremento: '--<var>' (pré-decremento*) ou '<var>--' (pós-decremento*)
- Multiplicação: '*' (ou '*=' como operador de atribuição)
- Divisão: '/' (ou '/=' como operador de atribuição)
- Resto da divisão: '%' (ou '%=' como operador de atribuição)

* No pré-(de/in)cremento, primeiro a conta é feita e então o valor é retornado. No pós-(de/in)cremento, o valor é retornado e só depois a conta é feita.

Operadores de Strings
- Concatenação: '.' (ou '.=' como operador de atribuição)

Operadores de Comparação
- Igualdade: '==' (TRUE se valor igual)
- Identidade: '===' (TRUE se mesmo valor e mesmo tipo)
- Inegualdade: '!=' ou '<>' (TRUE se valores diferentes)
- Não-Identidade: '!==' (TRUE se valor diferente OU tipo diferente)
- Maioridade: '>' (TRUE se maior), '>=' (TRUE se maior ou igual)
- Minoridade: '<' (TRUE se menor), '<=' (TRUE se menor ou igual)

Operadores Lógicos
- 'and' ou '&&' (TRUE se ambas as expessoões forem TRUE)
- 'or' ou '||' (TRUE se pelo menos uma das expessões for TRUE)
- 'xor' (TRUE se apenas uma das expressões for TRUE, não ambas)
- '!' (TRUE se a expressão for FALSE)

Operadores de Arrays
- União: '+' (une duas arrays, e Keys repetidas não se sobre-escrevem)
- Igualdade: '==' (retorna TRUE se ambas arrays tiverem as mesmas Keys e valores correspondentes iguais)
- Identidade: '===' (retorna TRUE se, além dos pares Keys-valores serem iguais, os pares estiverem na mesma ordem e forem dos mesmos tipos)
- Inegualdade: '!=' ou '<>' (retorna TRUE se as arrays não forem iguais)
- Náo-Identidade: '!==' (retorna TRUE se as arrays não forem idênticas)

Comandos

Outputs
ECHO - pode imprimir uma ou mais strings contendo texto ou código html que será interpretado pelo browser. Seu(s) parâmetro(s) pode(m) ser:

  • echo $str_var;
  • echo "<p>text</p>";
  • echo "text1", "text2", "text3";
  • echo "text $str_var";
  • echo "text {$array_var[0]}";

PRINT - imprime uma string e retorna 1 (portanto é um pouco mais lento que echo). Seus parâmetros são iguais ao do echo, exceto o terceiro caso, já que esse comando aceita apenas um único parâmetro.

Condicionais
IF()/[ELSE] - executa o bloco determinado pelo IF apenas se a condição for verdadeira, e executa o bloco do ELSE caso contrário (se especificado). Saiba mais.

SWITCH() - executa determinados blocos de códigos dependendo do valor atribuído à variável usada como parâmetro. Saiba mais.

Loops
[DO]/WHILE() - executa um bloco de código repetidamente enquanto a condição do WHILE for verdadeira. Se o DO for especificado, executa o código uma vez antes de fazer a primeira verificação, senão, faz a verificação antes mesmo da primeira execução do bloco. Saiba mais.

FOR() - é usado para rodar um código um número determinado de vezes. Existe a variância FOREACH(), que roda um loop para cada Key de uma Array. Saiba mais.

Includes/Require
Com os comandos include <file>; ou require <file>; é possível acrescentar scripts de PHP durante a execução. A diferença entre um e o outro é ao falhar, o primeiro produz um alerta mas o script continua executando, enquanto que o segundo gera um erro fatal e interrompe a execução.

Funções

Uma função não é executada automaticamente, mas sim, quando chamada. Ela é definida declarando-a com a palavra "function". Seu nome pode começar com letra ou '_', mas não com números, e os nomes são case-insensitive.

Argumentos
Informações passadas às funções, para variáveis locais da função. Pode-se passar inúmeros argumentos separados por vírgulas entre si.
Um argumento pode ter um valor padrão, que será adotado caso a chamada não atribua nenhum valor para o argumento.

Retorno
Pode-se usar a expressão "return" para que a função retorne um determinado valor à chamada.
Exemplo:
function <nome_da_funcao> ($<arg>, $<default_arg>=<default_val>, ...){
    <bloco_de_codigo>
    return <value/arg>;
}

Arquivos
fopen() - usado para abrir arquivos em determinados modos (read, write, ...). Para tratar erro ao tentar abrir o arquivo, pode-se usar OR <code_tratamento> na mesma linha de código. Usa-se a função fclose() para fechar um arquivo aberto. Lê-se uma linha do arquivo com a função fgets(), e pode-se ler uma letra de cada vez usando fgetc(), e é possível checar final de arquivo com a função feof(). Saiba mais sobre file system functions.

Cookies
Cookies são pequenos arquivos guardados no computador do usuário pelo servidor. Saiba mais.
setcookie() - define um cookie (deve ser usado antes da tag <html>). Essa função automaticamente codifica no formato URL - para prevenir isso, use a função setrawcookie().
Para acessar os cookies existentes, se utiliza a superglobal $_COOKIE. E para deletar um cookie, basta redefinir a data de validade para uma data passada.

Seções
Saiba mais.
session_start() - inicia a sessão (deve ser chamado antes da tag <html>).
Os dados de sessões podem ser acessados pela superglobal $_SESSION. E para se destruir uma única sessão, pode-se usar a função unset(<session>), ou pode-se destruir todas as sessões de uma vez com session_destroy().

Erros
Para interromper um script após o levantamento de um erro, existe a função die([<error_message>]). É comum também se criar funções customizadas para error handler, e de define a função de tal forma com a função:
set_error_handler(<nome_da_funcao_customizada>[, <tipo_de_erro>]) - se o tipo de erro não for especificado, a função será usada para manusear qualquer tipo de erro.
É possível levantar um erro pelo código com a função trigger_error(<msg_de_erro>[, <tipo_de_erro>]).
Quando um erro é levantado, o PHP automaticamente arquiva o log do erro (no sistema de logs do servidor, ou em um arquivo, dependendo de como estiver configurado em php.ini). Para arquivar o log em um arquivo específico ou um local remoto, existe a função error_log(). Saiba mais.

Exceções
Uma exceção muda o fluxo da execução do script quando um erro é levantado. Quando uma exceção é desencadeada, o estado do script é salvo, o programa irá executar o exception handler e depois, dependendo, o handler pode retornar ao ponto salvo do script, ou terminar a execução, ou retomar o script de um ponto diferente. Saiba mais. Os passos para se manipular uma exceção é:
1o: TRY - bloco que contém um código que pode desencadear uma exceção. Se a exceção não for ativada, a execução do script continuará normalmente, se não, a exceção será thrown.
2o: THROW - desencadeia uma exceção, e deve ter pelo menos um método catch.
3o: CATCH - um bloco que tratará a exceção, recebendo as informações referentes à exceção.
É possível definir uma função para manusear exceções que não têm catch, pela função set_exception_handler(<funcao>).

Formulários

Segurança: Método
É importante processar os dados de formulários com segurança, de forma a proteger os dados de seus usuários de hackers e spammers. Portanto, saiba quando usar $_GET e $_POST.
Informações passadas pelo método GET é visível a todos (na URL), e a quantidade de informação passada por esse método é limitada (2000 caracteres). Contudo ele permite que a página seja marcada (bookmark).
Já informações passadas por POST é inacessível para outros (valores são passados incorporados na solicitação da página), e o número de informações passadas é ilimitado. Além disso, o método suporta funcionalidades avançadas que podem aumentar ainda mais a segurança no envio de dados. Contudo, o método não possibilita a marcação (bookmark) da página. O método POST é o mais aconselhável para o envio de dados por formulário.

Validação
A página sobre validação de formulários dá várias dicas de segurança, e vale a pena dar uma relida. Citarei apenas os mais comuns ou importantes.
A função htmlspecialchars() converte caracteres especiais para o formato HTML. Isso ajuda a prevenir que hackers explorem o código, injetando códigos (cross-site scripting attacks) a formulários. Portanto, é crucial passar todas as variáveis através dessa função.
Outra coisa importante a se fazer com os dados submetidos é remover espaços em branco desnecessários (com a função trim()) e remover barras invertidas (com a função stripslashes()).

Erros e Campos obrigatórios
Pode-se verificar se um campo do formulário foi enviado vazio com a função empty().
Para se verificar se o campo possui apenas letras ou algum determinado conjunto de caracteres, pode-se usar a função preg_match(), que verifica se uma string (segundo parâmetro) segue um padrão (passado no primeiro parâmetro). Ex.: para verificar se um campo contém um e-mail válido (padrão de e-mail): preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email).

Uploading
É possível que um usuário carregue um arquivo através de um formulário. Neste caso, utiliza-se o atributo enctype na tag form para definir a o "content-type" dos dados submetidos pelo formulário. No caso de arquivos, recomenda-se usar dados binários, portanto, o valor do atributo seria "multipart/form-data". Já a entrada para se selecionar o arquivo é o <input type="file">, que já apresenta um botão "browse" para se selecionar um arquivo do computador ao lado do campo.
Para se acessar o arquivo uploaded usa-se a superglobal $_FILE[<name_of_input>][<atributo>], sendo o atributo um dado específico do arquivo, podendo ser "name" (nome do arquivo), "type" (tipo do arquivo), "size" (tamanho em bytes do arquivo), "tmp_name" (nome da cópia temporária guardada no servidor) e "error" (código do erro levantado ao fazer o upload do arquivo).
upload do arquivo cria uma cópia temporária dele na pasta temp do servidor, e a cópia some ao final do script. Para salvar o arquivo, é necessário copiá-lo para outro local. Primeiro, pode-se chegar se já existe uma cópia de mesmo nome com file_exists("<path>/<file_name>") que retorna um boolean. E para copiar: move_uploaded_file(<temp_file>,<new_file>).

Filtros
Filtros servem para validar, testar e filtrar dados provenientes de fontes inseguras. Deve-se SEMPRE filtrar todo e qualquer dado externo! Existem diversas funções para se filtrar dados:
filter_var() - filtra uma variável com um filtro específico
filter_var_array() - filtra várias variáveis com o mesmo ou diferentes filtros
filter_input - obtém uma variável input e a filtra
filter_input_array - obtém várias variáveis e as filtra com o mesmo ou diferentes filtros
Essas funções podem aceitar parâmetros optativos, que são as opções ou bandeiras (flags), que adicionam novas opções de filtragem. Eles devem ser arrays associativas (objetos) com o nome "options".
Existem dois tipos de filtros: validating e sanitizing, sendo o primeiro para validar dados submetidos seguindo regras de formatação estritas e retornando true ou false; enquanto que o segundo permitem ou proíbem caracteres específicos numa string, e sempre retorna a string.
Ainda é possível usar uma função customizada para filtrar dados usando o filtro FILTER_CALLBACK (ou usar uma função pré-existente). A função customizada é especificada como se fosse uma opção, ou seja, numa array associativa na chave "options". Saiba mais e veja exemplos.

E-mail
É comum se enviar dados de um formulário para um endereço de e-mail, e essa tarefa é facilitada pela função:
mail(<destinatario>, <assunto>, <msg>[, <headers>][, <parametros>])
Contudo, usar um hardcoded e-mail é vulnerável a ataques de spammers. Um meio de evitar esse problema é "filtrar" (saiba mais) os dados inseridos com:
filter_var(<dado>, FILTER_SANITIZE_EMAIL) - remove caracteres ilegais (para um e-mail)
filter_var(<dado>, FILTER_VALIDATE_EMAIL) - valida um valor como um endereço de e-mail

Fim da segunda lição

Desta vez saí da lição sabendo muito mais. Infelizmente o tutorial não tem muitas tarefas práticas. O passo seguinte será aprender MySQL para finalmente tentar fazer um projeto próprio.

Marcadores: ,


PHP : Lição 1

Postado por 4luada, 10 de março de 2014, às 17:32

0 Comentários

Hoje comecei a aprender PHP por conta. PHP e MySQL são duas linguagens muito exigidas na área de desenvolvimento Web, então devo trabalhar bastante com elas por enquanto para poder ter mais chances de obter um emprego. Estou aprendendo por conta, já que não tinha nenhuma matéria sendo oferecida esse semestre que poderia pegar esse semestre que ensinasse alguma delas.

Procurei alguns tutoriais na internet. O Google me retornou vários sites com a procura "Tutorial PHP" e selecionei alguns que pareciam mais promissores. Eu prefiro tutoriais detalhados que prossigam passo a passo, e expliquem cada etapa, o por quê de fazer cada coisa. Assim eu aprendo melhor como fazer meus próprios códigos do que ficar só copiando códigos prontos.

Passo Zero: Antes de tudo...

PHP é uma linguagem de script de servidor, e é uma ferramenta poderosa para construir páginas da web dinâmicas e interativas rapidamente.
PHP é uma amplamente usada, gratuita, e eficiente alternativa à competidores como o ASP da Microsoft.
-- from w3schools 

Antes de se começar a aprender PHP, é imperativo que se tenha no mínimo um conhecimento básico de HTML, CSS e Javascript. Para saber mais sobre PHP, recomendo a página do w3schools.

A grande maioria dos tutoriais que eu uso estão em inglês. Saber inglês para se programar é muito bom, já que muitas das linguagens são em inglês, e a maioria da ajuda e tutoriais que você poderá encontrar pela internet estarão em inglês.

Primeiro passo: Pré-requisitos

Claro que não tenho nenhum servidor. Eu iria desenvolver tudo localmente, então iria precisar de um servidor web local, como o famoso Apache. E ainda iria precisar instalar o PHP e (apesar de opcional, é altamente recomendável) o MySQL. Há diversos caminhos a se seguir, e eu escolhi instalar os três (servidor, PHP e MySQL) de uma vez com o WAMP. Meu sistema é windows, então essa era uma boa opção. Mas existem outras opções.

Para instalar o WAMP, você pode seguir esse tutorial: Aprenda a instalar um servidor Web completo com o WampServer. Mas a instalação é bem simples. E li o tutorial do Codelic Hackers para ter noção de configuração do WAMP, apesar de não tê-lo seguido fielmente. Por exemplo, não mudei a porta e nem coloquei senha no meu PHP. Mas não há muitos segredos e nem necessidades para se configurar o servidor, ainda mais inicialmente. Quem sabe no futuro. Para ter mais uma noção sobre o servidor, leia também esse tutorial do Home and Learn.

O mais importante a se saber nesta etapa é que qualquer projeto novo deve ser salvo na subpasta \www da pasta WAMP. E ele pode ser acessado pelo endereço http://localhost/<path>/<file.php>

Segundo passo: Editor

Bom, com tudo pronto para programar e testar minhas páginas em PHP, está na hora de começar a aprender o PHP em si.

Para desenvolver as páginas PHP, estou usando o Adobe Dreamweaver, que é o mesmo que uso para desenvolver meus sites em HTML, CSS e javascript. Mas no próprio tutorial há um link com diversos editores compatíveis com php.

Para iniciantes, eu recomendo um editor simples de texto, como o gEdit, que agora tem uma versão compatível para windows, e mais tarde, você mesmo pode escolher um editor de sua preferência.

Terceiro passo: Um Simples Tutorial

Primeiro, irei seguir o tutorial oficial do PHP.

O que eu preciso?
Nessa etapa, o tutorial lista os pré-requisitos para se começar a programar PHP. São as mesmas coisas que passei no Primeiro passo.

Sua Primeira Página PHP
Coloquei o script à prova, digitando caractere por caractere ao invés de copiar e colar. Salvei o arquivo direto na pasta \www do WAMP e acessei pelo endereço http://localhost/ola.php, e deu tudo certo.
Ler as páginas anexas, como a sobre Sintaxe básica do PHP, espalhadas pelo tutorial são muito importantes para o melhor entendimento da linguagem. Mas uma página importante para se ler é sobre as variáveis em PHP. Não entendi algumas coisas, e outras estavam muito complicadas, portando deixei para depois, quando eu tivesse mais conhecimento da linguagem.
Também verifiquei a função phpinfo(). Não dizia muito, todas aquelas configurações. Mas é bom saber que essa função existe.

Algo Útil
Nessa parte, li sobre Variáveis Superglobais e testei o exemplo dado, que identifica o navegador do visitante. O código deu diversas respostas estranhas, identificando diversos navegadores. Mas tudo bem, sem problemas. Também é importante saber sobre o Escopo de variáveis, ou seja, até onde uma variável tem .
Depois li sobre Variáveis Reservadas.
Essa seção também mostra como misturar php com html. Bem interessante, mas num código mais complexo, pode ser uma dor de cabeça...

Tratando Formulários
Nesta seção aprendi a lidar com informações obtidas através de um formulário, usando-as por variáveis auto-globais $_POST, se usado o método POST. Também é possível usar os métodos GET com a auto-global $_GET. Existe também a auto-global $_REQUEST, que contém todos os dados do formulário, não importando o método - ele contém a mescla de GET, POST, COOKIE e FILE.
A função import_request_variable(<string type> [, <string prefix>]) importa as variáveis GET, POST, COOKIE (se listadas no parâmetro type) para o escopo global.

É interessante ler sobre Variáveis de fontes externas, mas apenas de fazer os exemplos do tutorial para melhor entendimento. Essa página também leva à página sobre Tipos, que explica sobre a determinação dos tipos de variáveis, como verificar o tipo da informação contida na variável. e como forçar a conversão de uma variável para um certo tipo

Usando códigos antigos com a nova versão do PHP
Nesta seção eu revi as variáveis auto-globais, um dos itens que mudaram a partir do PHP 4.1.0, e sobre Escopos de variáveis. Também li um pouco sobre Variáveis Pré-definidas.

Fim da primeira lição

Obviamente não saí da primeira lição sabendo tudo de como programar em PHP, mas criei uma boa base, obtendo apenas alguma noção sobre a linguagem. A seguir, vou buscar guias mais completos de PHP.

Marcadores: ,


Fairy Tail

Postado por 4luada, 21 de agosto de 2013, às 18:46

0 Comentários

Bom, já que foi citado no meu outro blog, vou falar aqui também sobre Fairy Tail! É um mangá (também adaptado para anime) muitíssimo engraçado, muito bom, muito divertido, muito adorável. O autor, Hiro Mashima, já publicou outras séries que ficaram famosas, dentre elas Rave Master, que também vale a pena ver.

Voltando a Fairy Tail. Sinceramente, é um dos primeiros (ou O primeiro) mangás cujos protagonistas eu realmente gostei. Amo o Natsu, gosto bastante da Lucy, adoro o Grey e a Erza (apesar de achar esses dois meio estranhos). O Happy é um engraçadinho muito fofo, e muitas vezes ri litros com seus comentários inesperados.

Inesperado! Esse é um adjetivo que não uso há muito tempo para um mangá. A maioria das séries atuais são clichês, têm várias coisas parecidas, têm personagens apelões, e ocorrem muitas coisas previsíveis. As lutas são realmente emocionantes, os personagens são bem trabalhados, e Hiro Mashima, com seu traço bonito e interessante, consegue fazer muitas caricaturas engraçadas.

Informações

Título: フェアリーテイル (Fairy Tail)
Tradução: Rabo de Fada
Autor: Hiro Mashima
Gênero: fantasia, luta, comédia
Língua Original: japonês
Editora: Kodansha (JP), Editora JBC (BR)
Revista: Weekly Shonen Magazine
Emissora: TV Tokyo
Lançamento (no Japão): Agosto/2006 (Mangá), 12/10/2009

Sinopse

Lucy Heartfilia é uma maga que deseja entrar para uma guilda de magos, mais especificamente a renomada Fairy Tail. Ela realiza seu sonho após conhecer Natsu Dragneel, um poderoso mago de fogo que usa um tipo de magia perdida: de matador de dragão.

Natsu é um fiel membro da Fairy Tail. Faz parte da guilda desde criança, e já é um membro bem conhecido e reconhecido como um dos mais fortes de sua geração. Ele se importa muito com seus companheiros de guilda, sempre ajudando-os nos apertos.

Fairy Tail possui muitos outros membros, e é conhecida como a guilda de magos mais poderosa da região. Existem milhares de outras guildas de magos, e cada uma serve não apenas para reunir magos, mas também para auxiliá-los na busca e realização de trabalhos. E é nessa alegre guilda que Lucy encontra uma família, como tantos outros fizeram antes dela.

OBS: essa sinopse não mostra nem metade do que é a série. Não há como resumir todas as maravilhas que Fairy Tail mostra. Se quiser conhecer a série, nada melhor do que lê-la!

Minha Classificação

Mais do que Naruto, Bleach, One Piece e todas as outras séries populares atuais, Fairy Tail me diverte muito, é super original, adoro reler os capítulos e ainda me fez querer assistir ao anime, que me parece estar muito bem feito. O sentimento de companheirismo do Natsu me inspira. Lucy é uma protagonista bem diferente das que se vê por aí. E adoro muito os outros personagens. Ela ainda ameniza minha fome por romance com cenas bem colocadas e ainda adequadas À situação. Eu amo essa série.

Para Ler/Assistir

Dica: Para abrir em uma nova janela, clique no link enquanto segura "Shift"; para abrir em uma nova aba, clique enquanto segura "Ctrl".
Legendas: ing = inglês, pt = português

    Manga*:
  • Fairy Project (pt) [link]
  • Manga Traders (ing) [link]
    Anime:
  • Fairy Project (pt) [link]

*O mangá é publicado no Brasil pela Editora JBC traduzido em português. Se gosta da série, prove comprando a versão oficial brasileira desse mangá.

Fontes

  • Wikipedia [link]
  • Imagem: Minitokyo [link]
  • Imagem: Anime Mirai [link]

Marcadores: ,


Hana Yori Dango

Postado por 4luada, 20 de agosto de 2013, às 21:03

0 Comentários

Chega um pouco de layouts e templates, né? Há outros assuntos sobre os quais quero tratar. Um deles é dramas orientais, também conhecidos como doramas. Apesar do nome, nem todos são dramáticos. Alguns são históricos e outros são até engraçados.

Um drama muito famoso no mundo pop Japonês é Hana Yori Dango. Ele é extremamente popular, e não é por causa de modinha, mas sim porque ele é realmente bom! Ela inclusive recebeu outras versões orientais, como a coreana e uma taiwanesa. Mas a história original veio de um mangá de mesmo nome.

Esse é uma comédia romântica e dramática, muito boa para românticos incuráveis, com frustrações à vontade. Brincadeiras à parte, considero-o um dos melhores doramas que já assisti! E, claro, o mangá também é um dos melhores que já vi. Recomendo ambos pra qualquer um! Agradeço muito ao Jojo, por ter me recomendado esse mangá! Valeu!

O mangá é cumpridinho, mas mais completo. Algumas expressões ficam muito engraçadas no traço da autora Kamio Yoko, dando um toque humorístico na história. O mangá já é meio antigo (de 1992!), então os traços - e uns fatos - podem estranhar uma pessoa acostumada com os mangás mais atuais. Mas não seja por isso, afinal, a história é excelente, muito criativa e divertida, indispensável numa coleção.

O dorama possui 2 temporadas e um filme. Nele, Matsumoto Jun interpreta Domyoji Tsukasa. O ator faz parte do grupo Arashi, que faz muito sucesso recentemente no Japão. Já Oguri Shun (que interpreta Hanazawa Rui) é um ator bastante famoso hoje em dia, e participa da maioria dos doramas que tenho assistido, como Hana Kimi e Tokyo Dogs, só para mencionar alguns.

Informações

Título: 花より男子 (Hana Yori Dango)
Tradução: Garotos acima de flores, Garotos melhores que flores
Gênero: romance, colegial, comédia
Língua original: japonês
Trabalho Original: Kamio Yoko (mangá "Hana Yori Dango")
N° de episódios: 9 (1ªt) + 11 (2ªt) + 1 Filme
Transmissão: 21/10/2005~16/12/2005 (1ªt), 05/01/2007~16/03/2007 (2ªt), canal TBS
Estréia (filme): 27/06/2008
Outras versões internacionais: Meteor Garden, Kgotboda Namja*, Liu Xing Yu

*A versão coreana, Kgotboda Namja, é mais chamada por aí de Boys Before Flowers

Elenco Principal

  • Inoue Mao (Makino Tsukushi)
  • Matsumoto Jun (Domyoji Tsukasa)
  • Oguri Shun (Hanazawa Rui)
  • Matsuda Shota (Nishikado Sojiro)
  • Abe Tsuyoshi (Mimasaka Akira)
  • Nishihara Aki (Matsuoka Yuki)

Sinopse

1ªTemporada: Makino Tsukushi vem de uma família extremamente humilde, mas com um grande sacrifício dos pais, freqüenta o Eitoku Gakuen, um colégio para ricaços, controlado pelo F4 (Flower 4), um grupo de 4 garotos de famílias extremamente ricas e poderosas. Seu líder é Domyoji Tsukasa, herdeiro do grupo financeiro mundial Domyoji. E seus companheiros são: Hanazawa Rui, Nishikado Soujirou e Mimasaka Akira. Caso alguém se opusesse a eles, recebia um "cartão" vermelho, sinal do F4 para que a pessoa fosse maltratada por todos o colégio até a pessoa se retirar da escola. Makino pretendia viver seus dias no colégio sem chamar atenção alguma, mas um dia, confrontou Domyoji em defesa de sua amiga, consequentemente recebendo o cartão vermelho. Valentemente, ela declara guerra ao F4, chamando a atenção de seu amado Hanazawa Rui e, estranhamente, fazendo com que seu pior inimigo, Domyoji Tsukasa, se apaixonasse por ela.

2ª Temporada: Domyoji foi para Nova York e nunca mais contactou Makino Tsukushi. Ela resolve ir atrás dele nos EUA, mas volta decepcionada. Um tempo depois, Domyoji volta ao Japão e Makino ganha uma forte rival no amor, uma noiva arranjada. Por outro lado, Domyoji também ganha um rival... ou dois?

Filme: Makino Tsukushi e Domyoji Tsukasa vão se casar, e recebem da mãe do Domyoji uma caríssima coroa passada de geração a geração, a "Jóia de Vênus", que carrega quatro preciosas pedras. Contudo, esta coroa é roubada. Para não pôr o casamento em risco, ambos viajam pelo mundo para recuperar a jóia, mas muitas coisas estranhas acontecem, além de brigas que podem comprometer o futuro do casal.

Músicas (1ª temporada)

Abertura: Wish (Arashi)
Fundo: Planetarium (Otsuka Ai)
Trilha Sonora (OST):

01 - Hana Yori Dango Main Theme
02 - Cloudy Noon
03 - Mysterious Chocolate
04 - Kizuna
05 - Flower 4
06 - Glacial
07 - Danran
08 - Chisana Negai
09 - Tsukushi
10 - Kokou
11 - Gozen 4 ji
12 - Dash!
13 - Domination
14 - Blue Mind
15 - Wish (Instrumental For Tv)
16 - Yurameku Kimochi

Músicas (2ª temporada)

Abertura: Love so Sweet (Arashi)
Fundo:  Flavor of Life (Utada Hikaru)
Trilha Sonora (OST):

01 - Return Main Theme
02 - Growing
03 - Too Sure
04 - Return Main Theme ~ Piano~
05 - New York no Kiseki
06 - Go Ahead!
07 - Chaos
08 - Fresh Leaves ~Piano~
09 - Koibito Kibun de
10 - Kioku no Fuchi
11 - Shoujiki na Kimochi
12 - Fresh Leaves
13 - Rui No Kanon
14 - Love So Sweet (Arashi)
15 - Flavor of Life (Utada Hikaru)
16 - Flavor of Life - Ballad ver. (Utada Hikaru)

Músicas (filme)

Encerramento: One Love (Arashi)
Trilha Sonora (OST):

01 - Owari Naki Tabiji
02 - Tsukushi to Suteki na Nakama-tachi
03 - Danran for Final
04 - Densetsu no Nazo
05 - Nusumareta Tiara
06 - Real na Yume
07 - Cloudy Noon for Final
08 - Iza America e!
09 - Right on Track
10 - Arata na Otoko
11 - Yuragu Kokoro
12 - Good luck!
13 - F4 no Sakusen
14 - Auction no Yukue
15 - Ginen
16 - Fresh Leaves for Final
17 - Tsukushi to Yume
18 - Futari no Yuku Saki
19 - Survival
20 - House of Love
21 - Kizuna for Final
22 - Hana Yori Dango Main Theme for Final
23 - Chikara Awasete
24 - Ai no Theme ~Final Main Theme~
25 - Trick no Shinjitsu
26 - Tomo ni Ayunde
27 - Returns Main Theme for Final

Minha Classificação

Esse é um dos doramas mais conhecidos, pela história e pelos atores. Matsumoto Jun faz parte do famoso grupo Arashi, e Oguri Shun está cada vez mais famoso e popular. Adoro o trabalho dos dois. Além disso, a história é bastante criativa e divertida, impossível de se não gostar. O mangá, em que ele é baseado, é um dos melhores que li até hoje, e com certeza o melhor mangá shoujo. Eu só tirei uma estrela porque, depois de assistir a versão coreana, nunca mais conegui ver essa versão japonesa. Sim, achei a coreana o melhor (sendo objetiva, sem favoritismos). Mas para quem gosta, irá gostar dos dois.

Para assistir

Dica: Para abrir em uma nova janela, clique no link enquanto segura "Shift"; para abrir em uma nova aba, clique enquanto segura "Ctrl".

Legendas: leg = legenda, ing = inglês, pt = português

    Dorama
  • SARS (AVI/torrent/leg:ing) [link]

OBS: Verifique na página de links para mais opções, como o D-Addicts. O D-Addicts tem esse e muitas outros doramas com legendas em diversas línguas, e costumam ter até RAWs. Tem Hana Yori Dango com legendas em inglês, italiano, espanhol, RAW e em outras línguas. Tem também as trilhas sonoras para download.

    Mangá
  • Manga Traders (ing) [link]

Fontes

Marcadores:


A dream is a wish your heart makes

Postado por 4luada, 26 de julho de 2013, às 20:03

0 Comentários

Essa frase é bem famosa e faz parte de uma música linda e inspiradora. Para quem não sabe, ela faz parte da música de mesmo nome, do filme Cinderela! Em português, ela significa: Sonho é um desejo feito pelo coração. E faz muito sentido, e tem um significado ainda mais profundo na minha vida neste momento tão complicado. =P

Já devem ter notado que mudei o design do blog. Eu fiquei inspirada depois de ler toodos os posts do blog da pessoa que eu mais amo neste mundo. Mas isso não tem nada a ver com o "momento complicado".

Bom, este semestre fui jubilada pela segunda vez. Erros e enganos e pouco esforço me levaram a isso. No começo do ano eu não teria me importado tanto, já que eu tava mesmo determinada a desistir do curso. Mas agora é o contrário, estou determinada a permanecer nele. A questão é: como?

Ao ser jubilada, posso tentar recorrer, como fiz da primeira vez. E é o que vou fazer. A questão é sobre o meu futuro: posso continuar me arrastando no curso, e ralar muito, para não ter que passar por isso mais uma vez. Ou outra alternativa seria prestar vestibular de novo. E este é o momento para decidir, afinal, estamos no meio do ano, e eu ficaria um semestre me preparando para o vestibular. Deste modo, eu voltaria a ter 5 anos para me formar, sendo que já estarei um pouco à frente por já ter feito algumas matérias.

Agora, o que isso tudo tem a ver com o título? Bem, pelos últimos anos tenho vagado sozinha e sem rumo, sem saber o que fazer nem para onde ir, sem nem contar com alguém direito. Mas agora eu tenho um sonho. Um desejo que agora está me guiando. Só fico triste por não ter visto antes, e ter precisado uns tapas na cara para perceber. Mas antes tarde do que nunca. Here I go! Hehehe

Este ano está sendo um ano de muitas mudanças na minha vida, como estou percebendo. E muitas, se não todas, para melhor. Está sendo um pouco doloroso, mas a sensação no final será muito boa, tenho certeza!

Marcadores:


Novo semestre, novo layout

Postado por 4luada, 7 de agosto de 2012, às 19:47

0 Comentários

Antes eu só achava, mas agora tenho certeza. Não consigo manter um único layout por muito tempo aqui no blog. Eu mudo layout com mais frequencia do que posto!

Enfim, um novo semestre começou e espero dar meu melhor desta vez. É preciso, senão serei jubilada... E também para poder viajar sem preocupações no final do ano! Em dezembro vou viajar e só volto em março do ano que vem! Iei! Para onde? Depois eu digo.

Eu não tive muita oportunidade de postar durante as férias porque fiquei estudando. Podem me chamar de nerd. Eu sei que não sou. Eu queria aprender PHP e aprendi, só que até agora não tive meios para usar o que aprendi. Preciso fazer download de uns softwares e essa internet 3G não deixa. Ela é lenta e instável, o que faz com que downloads longos e pesados sejam impossíveis de serem realizados. Também estou tentando aprender a usar o wordpress (não o blog, o sistema) para poder criar layouts para seus usuários. Mas bati na mesma barreira (download de ferramentas). Se há um lado negativo em webdesign e programação é que para tudo você precisa de softwares e internet. E ainda alguns softwares são pagos e custam uma fortuna!

Também tive a oportunidade de aprender algumas coisas a mais, principalmente de métodos de criação de código HTML e padrões que devo seguir. De fato, eu tinha uns métodos estranhos e não muito práticos. Acabei mudando algumas coisas da página de Percy Jackson, melhorando o código e as anotações.

E criei este novo layout pro blog! O anterior era temporário, apenas para a mudança para o blogger. Este é o definitivo, e espero que dure. Ele me agradou bastante. É claro e limpo. Usei um pouco de CS3 para criar as bordas arredondadas. Mas manti meu dragão. Decidi que ele vai ser meu símbolo. Ou melhor, o símbolo das minhas páginas pessoais.

Falando em páginas pessoais, estou estudando a possibilidade de fazer um site só para meus designs. É pouco profissional ter um site-blog desses. Eu precisaria contratar um servidor profissional e ter um domínio. Mas por enquanto, estou só no planejamento. Vou ficar só aqui por enquanto.

Marcadores: