osTicket – Mais um sistema de tickets gratuito

osTicket – Mais um sistema de tickets gratuito

Criado por Pedro Pinto em 17 de Dezembro de 2011 | 17 comentários

Recentemente um colega meu de uma empresa de redes questionou-me sobre a existência de um sistema de tickets gratuito para registo de assistências Help-Desk. Comecei por lhe indicar o fantástico e também gratuito OTRS (ver aqui), mas ele referiu-me que não precisava de um sistema tão completo (e complexo).

Quem necessitar de um sistema “qb” para registo de tickets, então aconselho a experimentarem o osTicket.

osticket_00

O osTicket é uma plataforma Web opensource direccionada para o registo de pedidos de Help Desk (ex. pedidos de suporte, ou pedidos de resolução de um determinado problema), e outros processos existentes numa empresa/organização.

A interacção dos utilizadores com a plataforma pode ser realizada via e-mail, telefone ou simplesmente através dos formulários disponibilizados para registo de tickets.

osticket_02

Principais funcionalidades

  • Configuração flexível sendo que a plataforma pode ser toda personalizada à medida da nossa empresa
  • Sistema de resposta automática
  • Sistema de alertas
  • Registo de historial de um determinado ticket
  • Possibilidade de registar notas internas
  • Não é necessário qualquer tipo de conta para um utilizador registar um pedido
  • Possibilidade de existirem vários administradores da plataforma
  • Transferência interna de tickets
  • Sistema de permissões e acessos
  • Possibilidade de anexar ficheiros ao ticket
  • Possibilidade de definir estados e prioridades nos tickets

Exemplo de um formulário para registo de um ticket

osticket_04

Exemplo do historial dos tickets

osticket_03

A plataforma encontra-se divida em 3 módulos:

  • Interface do Cliente
  • Staff Control Panel
  • Admin Control panel

Interface do Cliente

Como referido, no interface do client é possível registar um ticket, verificar o estado de um determinado ticket, ver o historial e aceder a toda a informação de um ticket (informação do cliente e informação que tenha sido disponibilizada pelo administrador.

osticket_01

Staff Control Panel

Dentro do modulo Staff Control Panel é onde a equipa responsável pelo Help Desk pode consultar o dashboard, indicar as respostas, criar tickets, definir um conjunto de configurações, etc,

osticket_05

Admin Control panel

No módulo de administração podemos proceder à configuração de toda a aplicação, personalizando-a de acordo com a nossa empresa. Podemos ver os logs do sistema, definição de parâmetros associados aos anexos, templates, e-mails, criação de departamentos, criação de utilizadores, criação de grupos, etc.

osticket_06

Para quem necessita de um sistema de tickets gratuitos simples mas muito funcional, o osTicket pode ser uma excelente solução. Para a implementação desta plataforma apenas é necessário ter um servidor web (ex. Apache) com suporte para PHP 4.3+ e MySQL 4.4+. Veja aqui como instalar.

Licença: GPL

Sistemas Operativos: Windows/Linux/MacOS

Download: osticket 1.6.0 [385 KB]

Homepage: osTicket

PHP é a Quinta-Feira – HEADERs (parte 1)

PHP é a Quinta-Feira – HEADERs (parte 1)

Criado por Pedro Pinto em 17 de Novembro de 2011 | 12 comentários

Por Pedro Peixoto para o PPLWARE
Depois de umas longas “férias”, hoje é dia de mais um artigo sobre “Programação WEB”, mais precisamente sobre PHP.

Na outra semana um amigo perguntou-me como poderia forçar o download de uma imagem, uma vez que sempre que colocava um link, o browser abria a imagem em vez de aparecer a “janelinha de download” como nos restantes ficheiros. Isto acontece porque existem diversos tipos de ficheiros que o browser consegue interpretar, e nesse caso, o ficheiro é mostrado imediatamente em vez de ser perguntado ao utilizador onde quer guardar o ficheiro para posteriormente o visualizar. É possível contornar este “automatismo” forçando o browser a questionar o utilizador sobre a sua intenção, para isso recorremos a headers.

php_00

O header é um componente da mensagem http que possui os parâmetros que definem essa transacção, esta informação não é visível numa página mas contém informação útil para o browser saber como interpretar a mensagem. Por exemplo o título que aparece no browser quando abrimos uma página é fornecido através do header.

header_01

Mas como manipulamos o header em imagens? Esta era uma pergunta complicada caso não tivéssemos a simplicidade e flexibilidade do PHP ao dispôr.

A ideia é a seguinte: vamos utilizar um ficheiro PHP para incorporar a imagem, no fundo este ficheiro PHP vai ser a nossa imagem.

Criei um ficheiro index.php numa pasta juntamente com o logótipo do pplware, se abrir a imagem através do browser ela naturalmente aparece

header_03

Para tornar o nosso index.php uma “imagem” precisamos de duas coisas, temos de dizer ao browser que o que vai ler é uma imagem e de seguida dar-lhe o código da mesma.

Podemos dizer-lhe que o conteúdo é uma imagem através da função header:

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

header() é usado para adicionar mais uma linha ao header http.

Para ler e apresentar o código da imagem recorremos à função readfile:

int readfile ( string $nomedoarquivo [, bool $use_include_path [, resource $context ]] )

Lê um arquivo e escreve o seu conteúdo para o buffer de saída (output buffer).

Vamos então escrever o seguinte código no ficheiro index.php.

<?php
    $ficheiro = "logo_pplware.png"; //nome do ficheiro
    header("Content-Length: " . filesize($ficheiro)); //tamanho esperado do ficheiro
    header('Content-Type: image/png'); //dizer ao browser que o conteúdo é uma imagem
   //agora que já enviamos os headers necessários vamos fazer o output da imagem
   readfile($ficheiro); //ler o código da imagem e fazer o output
?>

E como esperado, se abrirmos a página vamos ver a imagem

header_04

O nosso “index.php” é, para o browser, uma imagem igual ao “logo_pplware.png”, este é um bom método para esconder o URL das imagens, e é também baseado neste método que a maior parte dos sites de downloads escondem o endereço real dos ficheiros, mas isto já poderia ser tema para um próximo artigo.

Nesta fase temos já a imagem a ser aberta através de um ficheiro PHP falta agora enviar mais um header que informe o browser para não interpretar directamente a imagem. Para isso basta adicionar mais uma linha ao nosso código.

header('Content-Disposition: attachment; filename=logo.png');

E aqui fica o código completo e devidamente comentado:

<?php
    $ficheiro = "logo_pplware.png"; //nome do ficheiro   header("Content-Length: " . filesize($ficheiro)); //tamanho esperado do ficheiro   header('Content-Type: image/png'); //dizer ao browser que o conteúdo é uma imagem   //informamos que o conteúdo deve ser interpretado em forma de anexo, e o nome que queremos dar ao mesmo
   header('Content-Disposition: attachment; filename=logo.png');   //agora que já enviamos os headers necessários vamos fazer o output da imagem   readfile($ficheiro); //ler o código da imagem e fazer o output
?>

Resta testar e comprovar que a imagem já não é apresentada no browser e é enviada para a barra de downloads.

header_05

É igualmente possível apresentar outros tipos de ficheiro através de um ficheiro PHP, bastando alterar o campo “Content-type” do header:

"pdf": "application/pdf"
"exe": "application/octet-stream"
"zip": "application/zip"
"xls": "application/vnd.ms-excel"
"ppt": "application/vnd.ms-powerpoint"
"gif": "image/gif"
"png": "image/png"
"jpg": "image/jpg"
"mp3": "audio/mpeg"
"mp3": "audio/mp3"
"wav": "audio/x-wav"
"mpe": "video/mpeg"
"mov": "video/quicktime"
"avi": "video/x-msvideo"

Além disso existem muitos mais campos de header que podem ser manipulados de forma a obter do browser um tratamento mais apropriado a cada tarefa específica.

Nos próximos artigos vou explicar como é possível tirar partido do header para outras finalidades e como possibilitar o download de um ficheiro durante apenas uns minutos, ao estilo dos sites de download.

Dicas de VBA – Personalizar o Friso II

Dicas de VBA – Personalizar o Friso II

Criado por Paulo Silva em 18 de Outubro de 2011 | 10 comentários

Por Jorge Paulino para o Pplware

No primeiro artigo sobre a personalização do friso (ribbon) foi mostrado como criar um novo separador e um novo grupo com dois controlos, neste caso, dois botões.

Mas podemos utilizar inúmeros controlos de modo a tornar as opções mais simples para o utilizador. Como referido também no artigo anterior, este é o esquema base para construção do friso:

<group id=”Group1? label=”myCheckBox Group”>
<checkBox id=”cb1? label=”Opção A” onAction=”cbGetDescription” />
<checkBox id=”cb2? label=”Opção B” onAction=”cbGetDescription” />
<checkBox id=”cb3? label=”Opção C” onAction=”cbGetDescription” />
<checkBox id=”cb4? label=”Opção D” onAction=”cbGetDescription” />
<checkBox id=”cb5? label=”Opção E” enabled=”false” />
<checkBox id=”cb6? label=”Opção F” enabled=”false” />
</group>

O próximo código XML apresentado irá ser colocado dentro da tab com o ID “customTab1”

Vamos ver então alguns controlos, alguns eventos, designados por callbacks, e algumas opções mais avançadas!

Para criar um grupo com caixas de selecção (checkboxes), no primeiro grupo(myCheckBox Group), podemos o fazer da seguinte forma:

<group id="Group1" label="myCheckBox Group">
<checkBox id="cb1" label="Opção A" onAction="cbGetDescription" />
<checkBox id="cb2" label="Opção B" onAction="cbGetDescription" />
<checkBox id="cb3" label="Opção C" onAction="cbGetDescription" />
<checkBox id="cb4" label="Opção D" onAction="cbGetDescription" />
<checkBox id="cb5" label="Opção E" enabled="false" />
<checkBox id="cb6" label="Opção F" enabled="false" />
</group>

Neste caso estamos a criar um grupo, onde vamos ter várias checkboxes (6). As primeiras quatro estão a chamar o callback cbGetDescription(), onde irmos depois verificar qual a opção seleccionada, e as duas últimas estão desabilitadas para efeitos de demonstração.

No callback (evento) cbGetDescription() podemos usar o seguinte código:

Sub cbGetDescription(control As IRibbonControl, pressed As Boolean)      
Select Case control.id          
Case "cb1"              
MsgBox "Opção A - Seleccionada: " & pressed          
Case "cb2"              MsgBox "Opção B - Seleccionada: " & pressed          
Case "cb3"              MsgBox "Opção C - Seleccionada: " & pressed          
Case "cb4"              MsgBox "Opção D - Seleccionada: " & pressed          
End Select  
End Sub

No segundo grupo (MyDrops Group) estão dois controlos de selecção: Combobox e DropDown. A diferença entre ambos é que na Combobox é possível alterar o texto enquanto na DropDown não. Neste exemplo, e para mostrar diferentes formas de carregamento de dados, na Combobox estão já definidos alguns itens e a DropDown será preenchida dinamicamente com dados de um Array definido no código.

O XML para a sua criação será então o seguinte:

<group id="Group2" label="myDrops Group">      
<comboBox id="cboItems" label="ComboBox:" onChange="cboOnChange">          
<item id="item1" label="Item 1" />          
<item id="item2" label="Item 2" />          
<item id="item3" label="Item 3" />      
</comboBox>      
<dropDown id="dropDynamic" label="Dropdown:"onAction="ddOnAction"  getItemLabel="ddGetItemLabel"                  
getItemCount ="ddGetItemCount" >      
</dropDown>  
</group>

Como código para a Combobox podemos definir então:

Sub cboOnChange(control As IRibbonControl, text As String)
MsgBox "Texto seleccionado: " & text
End Sub

Isto irá mostrar uma mensagem com o texto seleccionado ou inserido.

Para a DropDown o código é ligeiramente mais complexo!

Para começar vamos adicionar na primeira linha do XML o atributo onLoad definindo desta forma que quando o friso é iniciado iremos executar determinado código (poderia ser feito também no evento Workbook_Open).

<customUI xmlns=<a href="http://schemas.microsoft.com/office/2009/07/customui">http://schemas.microsoft.com/office/2009/07/customui</a> 
onLoad="RibbonLoad">

Desta forma vamos executar o callback RibbonLoad() na inicialização do friso, onde iremos carregar alguns valores no array. Estes valores vão ser utilizados pelos métodos GetItemLabel() e GetItemCount() como é possível ver no seguinte código/comentários.

Private paises(4) As String 
Private x As Integer
Sub RibbonLoad(ribbon As IRibbonUI) 
paises(0) = "Portugal" 
paises(1) = "Espanha" 
paises(2) = "França" 
paises(3) = "Alemanha" 
paises(4) = "Inglaterra" 
End Sub
 ' Mostra a determinada posição do array de acordo com o índex recebido 
Sub ddOnAction(control As IRibbonControl, id As String, index As Integer) 
MsgBox paises(index), vbInformation
End Sub
 ' Este evento é chamado uma vez por cada posição na lista, definido no
 ' evento ddGetItemCount(). Desta forma, quando o evento é executado, colocamos 
 ' um valor de cada posição do array e incrementamos o contador de posição
Sub ddGetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = paises(x)   x = x + 1 
End Sub
' Define o número de itens a aparecer na lista 
 Sub ddGetItemCount(control As IRibbonControl, ByRef returnedVal) 
 returnedVal = UBound(paises) + 1 </em>
 End Sub

O terceiro e último grupo (myMisc Group) tem diferentes controlos para mostrar mais algumas das possibilidades disponíveis (não todas, obviamente). O XML é um pouco extenso mas será explicado de seguida:

<group id="Group3" label="myMisc Group">     <gallery id="MonthGallery" label="Escolher mês usando uma Gallery:"                 columns="3" rows="4" onAction="SetMonth" ></em>         <item id="m01" label="Janeiro"/></em>         <item id="m02" label="Fevereiro"/></em>         <item id="m03" label="Março"/></em>         <item id="m04" label="Abril"/></em>         <item id="m05" label="Maio"/></em>         <item id="m06" label="Junho"/></em>         <item id="m07" label="Julho"/></em>         <item id="m08" label="Agosto"/></em>         <item id="m09" label="Setembro"/></em>         <item id="m10" label="Outubro"/></em>         <item id="m11" label="Novembro"/></em>         <item id="m12" label="Dezembro"/></em>
         <button id="mActual" imageMso="CalendarToolSelectDate" 
                      label="Mês Actual" onAction="SetCurrentMonth" />
      </gallery>
     <editBox id="EditBox1" label="Texto a pesquisar:" onChange="EditBoxOnChange" 
                   imageMso="FindAllDownloadedDocuments" />
     <separator id="separator1"/> 
     <toggleButton id="toggleActivar" label="Activar/Desactivar" 
                           imageMso="AcceptTask" getPressed="toggleGetPressed" 
                           onAction="toggleOnAction" />
     <menu id="Menu1" label="Menu Opções Sistema" itemSize="normal"> 
          <button idMso="Cut"/> 
          <button idMso="Copy"/> 
          <button idMso="Paste"/>
          <menuSeparator id="menuSeparator1" title="Mais opções ..."/>
          <menu id="SubMenu1" label="Ficheiro"> 
                <button idMso="FileSave"/> 
                <button idMso="FileSaveAs"/> 
                <button idMso="FileOpen"/> 
                <button idMso="FileClose"/> 
          </menu> 
          <menu id="SubMenu2" label="Diversos"> 
                <button idMso="FileExit"/> 
          </menu> 
      </menu> 
     <dialogBoxLauncher> 
              <button id="Launcher1" screentip="My Launcher" 
                          onAction="ThisWorkbook.LauncherCode" /> 
      </dialogBoxLauncher> 
     </group>

Para começar uma galeria (Gallery) onde estamos a definir os diferentes meses do ano. Aqui podemos indicar quantas linhas e colunas queremos, assim como utilizar outros controlos. No código XML está definido no final um botão que irá escolher o mês actual.

O código associado é muito simples:

' Mostra o mês de acordo com o index recebido
Sub SetMonth(control As IRibbonControl, id As String, index As Integer)
    MsgBox MonthName(index + 1)
End Sub
 ' Mostra o mês por extenso do mês actual 
Sub SetCurrentMonth(control As IRibbonControl)
    MsgBox MonthName(Month(Now))
End Sub

De seguida temos uma EditBox que permite o utilizador escrever algum texto. No código basta simplesmente mostrar o resultado no callback EditBoxOnChange():

Sub EditBoxOnChange(control As IRibbonControl, text As String)
    MsgBox "O texto indicado foi: " & text, vbInformation
End Sub

Depois um separador e um botão retentivo (toggle button), ou seja, quando pressionado fica seleccionado e quando pressionado novamente perde a selecção.

No código do toggle button mostramos apenas o estado no callback onAction() e definimos também, no callback getPressed(), o estado inicial quando o friso é inicializado.

<em>' Quando o botão (toggle) é pressionado mostra o estado</em>
 <em> Sub toggleOnAction(control As IRibbonControl, pressed As Boolean)</em>
 <em>     MsgBox "Controlo: " & control.id & " - Pressionado: " & pressed</em>
 <em> End Sub</em>
 ' Define o estado inicial do botão
  Sub toggleGetPressed(control As IRibbonControl, ByRef returnedVal)
      returnedVal = True
  End Sub

Depois, no próximo controlo utilizado, não existe qualquer código associado pois estamos a definir funções de sistema através da atribuição de um idMso. Isto significa que cada opção que colocarmos no menu, que poderá ser colocado em outro controlo, irá executar a função que o sistema está preparado para o fazer (save, save as, copy, cut, etc).

Desta forma, podemos colocar no nosso friso algumas opções já existentes no Excel e que podem ser úteis. A lista dos ID’s (idMso) que podemos utilizar pode ser descarregada aqui:

O último controlo, embora meio escondido e disponível no canto inferior direito do grupo, é um DialogBox Launcher que permite simplesmente lançar uma janela com opções relacionadas com o respectivo grupo.

O código pode então mostrar uma mensagem, chamar um userform, etc. Neste exemplo irá mostrar apenas uma mensagem, mas tem uma particularidade, que se aplica a todos os controlos. No XML está definido para o callback onAction() o método ThisWorkbook.LauncherCode. Isto significa que o seguinte código tem de estar localizado no ThisWorkbook para funcionar, pois está a ser apontado para tal.

Sub LauncherCode(control As IRibbonControl)     MsgBox "Mais opções ..."
  End Sub

Podemos apontar para módulos específicos, worksheets, etc.

NOTA IMPORTANTE: Caso o XML não esta correcto (tags inválidas, tags não fechadas, etc) o separador não ficará visível.

E são alguns exemplos que mostram como personalizar o friso e como utilizar o código para cada controlo. Existem muito mais opções para cada controlo e muito mais controlos. Para complementar estes dois pequenos artigos podem ver os seguintes links, que além de um PDF que podem descarregar gratuitamente, podem consultar online:

Podem ainda descarregar o ficheiro de exemplo utilizado neste artigo: download

Arquivado na categoria: Programação

Dicas de VBA – Criando Teclas de Atalho

Dicas de VBA – Criando Teclas de Atalho

Criado por Paulo Silva em 5 de Outubro de 2011 | 7 comentários

Por Jorge Paulino para o Pplware

Estamos de volta com o VBA e algumas demonstrações do seu potencial para resolução de problemas rotineiros do nosso dia a dia de trabalho.

Desta feita vamos ver como criar Teclas de Atalho…

Quando criamos código em VBA necessitamos de o executar e isso pode ser feito de diversas formas:

  • Através de Eventos
  • Através de funções personalizadas (UDF)
  • Através de um objecto que irá chamar o nosso código (quer esteja na worksheet ou na ribbon)
  • Através de teclas de atalho (shortcuts)

A possibilidade de utilizar determinadas teclas para chamar o código que criamos é muito prático e muito útil. Neste pequeno artigo iremos ver algumas formas e exemplos de como associar teclas de atalho a procedimentos e ver as principais diferenças entre os dois métodos disponíveis.

A maneira mais simples e mais usada pela maioria dos utilizadores é seleccionando o separador Developer e escolhendo a opção Macros (ou pressionando as teclas Alt+F8)

Na janela com as macros disponíveis, seleccionamos a macro pretendida e escolhemos a opção Options.

Irá abrir então uma nova janela onde podemos indicar que tecla de atalho iremos associar à macro seleccionada.

Neste exemplo, visível na imagem anterior, para chamar a Macro1, a combinação definida é Ctrl+a. Podemos indicar diversas letras (apenas letras) e se indicarmos uma letra em minúscula a combinação associada seráCtrl+a (por exemplo) e se indicarmos a letra em maiúscula a combinação associada será Ctrl+Shift+a.

Alguns exemplos:

a = Ctrl + a
u = Ctrl + u
A = Ctrl + Shift + a
U = Ctrl + Shift + u

Muito simples e muito prático!

No entanto isto limita-nos à utilização de determinadas combinações de teclas o que poderá ser, em alguns casos, um problema. Além disso não permite a atribuição dinâmica e a utilização de teclas especiais. Mas isto pode ser resolvido utilizando VBA!

Para atribuir uma tecla de atalho a uma macro, utilizamos o método Application.OnKey()

Application.OnKey “combinação”, “procedimento a associar”

Exemplo:

Application.OnKey “^a”, “Macro1″

Neste caso é associada a combinação Ctrl+a à Macro1.

Mas vejamos a tabela de códigos de teclas especiais, que além das letras e números podem ser utilizados:

Tecla

Código

BACKSPACE

{BACKSPACE} ou {BS}

BREAK

{BREAK}

CAPS LOCK

{CAPSLOCK}

CLEAR

{CLEAR}

DELETE ou DEL

{DELETE} ou {DEL}

DOWN ARROW

{DOWN}

END

{END}

ENTER (teclado numérico)

{ENTER}

ENTER

~ (tilde)

ESC

{ESCAPE} ou {ESC}

HELP

{HELP}

HOME

{HOME}

INS

{INSERT}

LEFT ARROW

{LEFT}

NUM LOCK

{NUMLOCK}

PAGE DOWN

{PGDN}

PAGE UP

{PGUP}

RETURN

{RETURN}

RIGHT ARROW

{RIGHT}

SCROLL LOCK

{SCROLLLOCK}

TAB

{TAB}

UP ARROW

{UP}

F1 a F15

{F1} até {F15}

E as teclas que são usadas para combinar:

Tecla

Código

SHIFT

+ (adicção)

CTRL

^ (acento circunflexo)

ALT

% (percentagem)

Assim, com a lista de códigos, podemos combinar e associar conjuntos de teclas a macros que tenhamos criado/gravado. Podemos utilizar o evento Workbook_Open(), que é executado quando o ficheiro de Excel é aberto, e definir no arranque as associações que queremos. Por exemplo:

Private Sub Workbook_Open()
Application.OnKey “+^{UP}”, “MostraResultado”
Application.OnKey “%{INSERT}”, “CopiaDados”
End Sub

Neste caso, a combinação Shift+Ctrl+Seta Cima chama o procedimento MostraResultado e a combinação Alt+Insert chama o procedimento CopiaDados.

No entanto estas atribuições funcionam se os procedimentos estiverem definidos num módulo, pois se estiverem definidos no Workbook ou em determinada Worksheet não irá funcionar. Nestes casos é necessário definir o caminho para eles, como é possível ver no exemplo seguinte:

Private Sub Workbook_Open()
Application.OnKey “+^{UP}”, “ThisWorkbook.MostraResultado”
Application.OnKey “%{INSERT}”, “Sheet1.CopiaDados”
End Sub

Aqui estamos a indicar que o procedimento MostraResultado está criado em ThisWorkbook e o procedimento CopiaDados está criado no código da Sheet1.

Mas atenção que determinadas combinações, especialmente usando a tecla Alt mais uma letra ou número, não funcionam, pois são usados como teclas de atalho do próprio Excel. É importante testar sempre.

Muito importante também verificar se não estamos a utilizar uma combinação do próprio sistema operativo. Por exemplo, a combinação Ctrl+C (“^c”) serve para copiar informação(copy), assim como oCtrl+V (“^v”) serve para colar informação (paste). Se atribuirmos estas combinações a diferentes procedimentos, é sobreposto o funcionamento normal (neste caso o copy/paste) e passará a chamar os procedimentos que definimos. Isto pode ser desagradável para muitos utilizadores.

Um exemplo muito simples para que testem rapidamente e entendam o problema de algumas associações. Coloquem o seguinte código num módulo e executem o procedimento AssociaTeclas.

Sub AssociaTeclas()
Application.OnKey “~”, “Opps”
End Sub
Sub Opps()
MsgBox “Opps !!!”
End Sub

Agora, no Excel, sempre que carregarem na tecla Enter aparecerá uma mensagem com a informação “Opps !!!”.

Mas podemos também desabilitar as associações que definidas. Para tal, basta não definir o segundo argumento do método OnKey() que é opcional.

Sub DesabilitaTeclas()
Application.OnKey “~”
Application.OnKey “^v”
Application.OnKey “^v”
Application.OnKey “%{INSERT}”
Application.OnKey “+^{UP}”
End Sub

Após executar o procedimento DesabilitaTeclas as associações definidas deixariam de funcionar e, neste caso, o Enter voltaria a funcionar como antes, assim como o Ctrl+c e o Ctrl+v.

Neste pequeno artigo vimos como é simples atribuir teclas de atalho para chamar procedimentos, utilizando as opções já disponíveis e através de código, e alguns dos problemas que as associações podem causar.

É sem dúvida uma forma muito prática de chamar código VBA.

Autor: Jorge Paulino
Página Pessoal: http://www.jorgepaulino.com/

Dicas de VBA – Personalizar o Friso I

 

Dicas de VBA – Personalizar o Friso I

Criado por Paulo Silva em 6 de Outubro de 2011 | 6 comentários

Por Jorge Paulino para o Pplware

Num artigo anterior referi como executar uma macro usando uma determinada combinação de teclas. É uma funcionalidade muito prática, pois permite muito rapidamente e facilmente executar um determinado código. No entanto nem sempre é a melhor solução, uma vez que não é uma opção visível, ou seja, o utilizador nem sempre sabe que essa opção está disponível.

Uma solução muito interessante é personalizar o friso (ribbon), colocando à disposição do utilizador as diversas opções possíveis. Além de simples implementação, é uma solução visualmente muito agradável.
A personalização do friso pode ser feita individualmente para cada ficheiro ou para todos os ficheiros. Neste artigo iremos ver como fazer para apenas um ficheiro.

Existem diversos programas que permitem efectuar a personalização do friso, mas neste artigo irá ser utilizado o Custom UI Editor for Microsoft Office, que além de gratuito, é muito simples de utilizar.

Após instalar o programa fica disponível um simples editor.

Na opção FileOpen escolhemos o ficheiro de Excel que queremos personalizar o friso. Caso o ficheiro ainda não tenha qualquer personalização, adicionamos, usando o botão direito do rato, uma UI Part (User Interface Part), como mostra a seguinte imagem.

Será então adicionado um ficheiro XML com o nome customUI14.xml. Usando o menu InsertSample XML escolhemos a opção Custom Tab. Será então adicionado o código XML que será a definição do nosso friso (ribbon).

Neste código (previamente formatado/alinhado), podemos verificar alguns elementos que constituem o novo separador: Tab, Group e um Button.

<customUI xmlns=”http://schemas.microsoft.com/office/2009/07/customui”>
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”customTab” label=”Custom Tab”>
<group id=”customGroup” label=”Custom Group”>
<button id=”customButton”
label=”Custom Button”
imageMso=”HappyFace”
size=”large”
onAction=”Callback” />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Podemos a partir daqui alterar de acordo com o pretendido.

Podemos ainda adicionar imagens que serão depois utilizadas pelos diversos elementos. Para adicionar imagens podemos usar a opção InsertIcons e escolhemos as imagens que queremos. Neste exemplo foram utilizadas duas imagens com a resolução de 48×48.

Existem duas formas de definir a imagem, cujo nome será o nome da imagem adicionada:

Após pequenas alterações, podemos criar um simples exemplo, tendo em atenção que o ID não pode ser repetido. Atenção ainda à designação definida no atributo onAction que será o nome da macro e ao nome da imagem que foi definida.

<customUI xmlns=”http://schemas.microsoft.com/office/2009/07/customui”>
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”customTab” label=”VBTuga”>
<group id=”customGroup” label=”Custom Buttons”>
<button id=”customButton1″
label=”Aceitar”
image=”accept”
size=”large”
onAction=”btnAccept” />
<button id=”customButton2″
label=”Data/Hora”
image=”clock”
size=”large”
onAction=”btnData” />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Na toolbar existe uma opção para validar o código XML. É importante executá-la sempre que se fazem alterações, antes de gravar, de modo a verifica se tudo está correcto, caso contrário, o novo friso não irá ficar visível.

Na última opção da pequena toolbar deste editor, existe um botão para gerar as chamadas (Generate Callbacks). Esta opção irá então gerar o código de deveremos colocar num módulo do nosso ficheiro de Excel.

Podemos agora copiar o código VBA e salvar as alterações.

Abrimos o ficheiro alterado no Excel e colocamos o código copiado num módulo. Neste exemplo, será apenas adicionada uma mensagem:

Sub btnAccept(control As IRibbonControl)
MsgBox “Aceitar usando o botão: ” & control.ID, vbInformation
End Sub

Sub btnData(control As IRibbonControl)
MsgBox “Data e Hora: ” & Now, vbInformation
End Sub

E o resultado final é o seguinte:

Este é apenas um pequeno artigo de introdução à personalização do friso no Excel, mas existem inúmeras alterações que podemos fazer e tornar desta forma os ficheiros mais profissionais/funcionais. É possível também usar diferentes controlos no friso, personalizar o Backstage View, criar menus de contexto (baseados na selecção), etc.

Algumas destas opções serão abordadas em próximos artigos.

Autor: Jorge Paulino
Página Pessoal: http://www.jorgepaulino.com

Dart – A alternativa ao Javascript, criada pela Google

Dart – A alternativa ao Javascript, criada pela Google

Criado por Pedro Pinto em 11 de Outubro de 2011 | 21 comentários

O Javascript é uma das linguagens de scripting mais usadas na Internet, uma vez que consegue oferecer a interactividade que é necessária na visualização de conteúdos WEB, pois é processado pelo browser do utilizador. Além disto, é uma linguagem orientada a eventos o que possibilita associar determinado código a uma determinada acção do cliente.

Recentemente a gigante Google apresentou uma linguagem alternativa ao JavaScript e à qual deu nome  Dart. Será que a moda vai pegar?

dart_02

Muito se tinha especulado sobre o nome da linguagem criada pela Google, em alternativa ao Javascript. Em Outubro de 2010, um documento interno da própria empresa anunciava que a linguagem se iria chamar Dash (ver aqui). No entanto, a Google anunciou recentemente que tinha sido alterado para Dart – Designed as an object-oriented.

Dart é uma linguagem de programação flexível e estruturada e bastante similar ao Java ou ao C++, com muitas vantagens adquiridas das linguagens de scripting como é o caso do javascript.

dart_01

Segundo Lars Bak da Google, Dart é uma linguagem class-based, direccionada para o desenvolvimento de aplicações Web e com suporte para projectos de larga escala. É simples, eficiente, escalável e poderosa.

“Developed with the goals of simplicity, efficiency, and scalability, the Dart language combines powerful new language features with familiar language constructs into a clear, readable syntax.”

Além da simplicidade ao nível da estrutura de programação da aplicações, a linguagem Dart é também simples ao nível de debug. A linguagem permite que o programador adicione variáveis sem a necessidade de definir o tipo de dado e resolve alguns problemas de escalabilidade que normalmente acontecem quando se usa Javascript.

Actualmente nenhum browser tem suporte para esta linguagem, mas está previsto o suporte para a mesma no Chrome. O código pode ser executado sobre uma máquina virtual Dart nativa ou então sobre o próprio motor javascript (recorrendo a um compilador que consegue traduzir o código Dart em Javascript).

A Google disponibilizou também um IDE de programação e alguns scripts de exemplo para que os programadores comecem a desenvolver algumas aplicações com base na sua linguagem de programação.

Download: Dart – IDE

Homepage:  Dart – Googles Programming Language

Vamos dar uns toques de SQL? VI

Vamos dar uns toques de SQL? VI

Criado por Pedro Pinto em 2 de Julho de 2011 | 0 comentários

Por Pedro Gaspar para o PPLWARE

Esta semana vamos aprender mais algumas funções novas, desta vez relacionadas com datas.

Vamos tentar descobrir a idade das pessoas que temos na nossa base de dados, aprender a fazer contas, entre outras coisas.

clip_image001

Para apresentar alguns exemplos utilizei a tabela que temos utilizando nas semanas anteriores (tlb_ppware) que contem os seguintes dados:

clip_image002

Começando pelo inicio, o sql é uma linguagem bastante abrangente, alem de nos permitir fazer operações com tabelas, tambem nos permite fazer operações matemáticas.

EXEMPLO1

Objectivo: Listar o nome e:

  • o valor do nascimento + 2
  • o valor do nascimento – 2
  • o valor do nascimento multiplicado por 2
  • o valor do nascimento dividido por 2

Query:

SELECT nome, nascimento +2 AS soma, nascimento -2 AS subtracao, nascimento *2 AS multiplicacao, nascimento /2 AS divisao
FROM tbl_ppware

Resultado:

clip_image004

Fazer contas com SQL e bastante fácil! Agora para complicar um pouco mais, vamos fazer contas com datas.

O próprio SQL consegue ir buscar a data actual ao sistema onde esta a ser executado, para ir buscar essa informação utilizamos a função NOW() (outras funções de data e hora podem ser consultadas aqui), a data é-nos apresentada no formato “ano-mês-dia hora:minuto:segundo”

Query:

SELECT NOW( )

Resultado:

clip_image006

Esta e a forma considerada universal de apresentar a data, e se pensar-mos bem até e a que faz mais sentido. No entanto como somos europeus e gostamos também bastante da nossa forma e-nos possível também alterar a forma como a data ira ser apresentada, para isso utilizamos a função DATE_FORMAT(), que nos permite mostrar a data de outra forma completamente a nossa escolha, podem consultar a informação completa sobre esta função aqui

EXEMPLO2

Objectivo: Apresentar a data no formato europeu

Query:

SELECT DATE_FORMAT( NOW( ) , "%d/%m/%y" ) AS DATA

Resultado:

clip_image008

Pegando novamente na nossa tabela vamos então calcular a idade das nossas pessoas ?

No lugar de utilizar o DATE_FORMAT para obter o ano actual (e assim calcular a idade) vou utilizar a funçãoYEAR(), esta função devolve-nos apenas o ano e serve plenamente para o nosso exemplo.

EXEMPLO3

Objectivo: Apresentar o nome e a idade das pessoas

Query:

SELECT nome, YEAR( NOW( ) ) - nascimento AS idade
FROM `tbl_ppware`

ou:

SELECT nome, DATE_FORMAT( NOW( ) , '%Y' ) - nascimento AS idade
FROM `tbl_ppware`

Resultado:

clip_image010

Assim como existe a função YEAR(), tambem existem a função DAY() para dias e MONTH() para meses, todas elas podem ser consultadas aqui

Com estas mesmas funções também podemos fazer contas com datas, por exemplo somar meses ou dias a uma determinada data

EXEMPLO4

Objectivo: Somar um dia, uma semana, um mês e um ano a data 21/12/2012, e apresenta-la por extenso (em inglês)

Primeiro que mais nada temos que converter esta data para um formato em que o SQL a reconheça, para isso utilizamos a função STR_TO_DATE()

Query:

SELECT DATE_FORMAT( STR_TO_DATE( '21/12/2012', '%d/%m/%Y' ) + INTERVAL 1
DAY + INTERVAL 1 WEEK + INTERVAL 1
MONTH + INTERVAL 1 YEAR, '%D %M of %Y' ) AS DATA

Resultado:

clip_image012

EXEMPLO5

Objectivo: Obter a media de idades das pessoas que temos na nossa base de dados

A media consiste em somar todos os elementos e no fim dividir pelo numero desses mesmos elementos, logo e isso mesmo que teremos que fazer, para obter a idade das pessoas que temos na nossa tabela vamos utilizar a mesma forma que utilizamos no EXEMPLO3, de seguida utilizaremos a função SUM(), para somar todos os resultados obtidos, e por fim dividimos pelo numero de elementos utilizados, para obter o numero desses exemplo usamos a função COUNT()

Query:

SELECT SUM( YEAR( NOW( ) ) - nascimento ) / COUNT( * ) AS media
FROM `tbl_ppware`

Resultado:

clip_image014

Espero que tenham gostado do artigo desta semana, para a semana há mais.

Designing For Android

Designing For Android

 

 

For designers, Android is the elephant in the room when it comes to app design. As much as designers would like to think it’s an iOS world in which all anyones cares about are iPhones, iPads and the App Store, nobody can ignore that Android currently has the majority of smartphone market share and that it is being used on everything from tablets to e-readers. In short, the Google Android platform is quickly becoming ubiquitous, and brands are starting to notice.

But let’s face it. Android’s multiple devices and form factors make it feel like designing for it is an uphill battle. And its cryptic documentation is hardly a starting point for designing and producing great apps. Surf the Web for resources on Android design and you’ll find little there to guide you.

If all this feels discouraging (and if it’s the reason you’re not designing apps for Android), you’re not alone. Fortunately, Android is beginning to address the issues with multiple devices and screen sizes, and device makers are slowly arriving at standards that will eventually reduce complexity.

This article will help designers become familiar with what they need to know to get started with Android and to deliver the right assets to the development team. The topics we’ll cover are:

  • Demystifying Android screen densities,
  • Learning the fundamentals of Android design via design patterns,
  • Design assets your developer needs,
  • How to get screenshots,
  • What Android 3 is about, and what’s on the horizon.
Android Smartphones And Display Sizes

When starting any digital design project, understanding the hardware first is a good idea. For iOS apps, that would be the iPhone and iPod Touch. Android, meanwhile, spans dozens of devices and makers. Where to begin?

The baseline for screens supported by Android smartphone devices is the T-Mobile G1, the first commercially available Android-powered device, which has an HVGA screen measuring 320 × 480 pixels.

HVGA stands for “half-size video graphics array” (or half-size VGA) and is the standard display size for today’s smartphones. The iPhone 3GS, 3G and 2G use the same configuration.

T-mobile-g1-e1307550246584 in Designing For Android
T-Mobile G1, the first commercially available Android device and the baseline for Android screen specifications.

To keep things simple, Android breaks down physical screen sizes (measured as the screen’s diagonal length from the top-left corner to bottom-right corner) into four general sizes: small, normal, large and xlarge.

Two-mobiles in Designing For Android
Two common Android screen sizes. (Image from Google I/O 2010)

320 × 480 is considered a “normal” screen size by Android. As for “xlarge,” think tablets. However, themost popular Android smartphones today have WVGA (i.e. wide VGA) 800+ × 480-pixel HD displays. So, what’s “normal” is quickly changing.

Table in Designing For Android
Diagram of various screen configurations available from emulator skins in the Android SDK. (Image: Android Developers website)

For testing, I use a Motorola Droid X, which has a WVGA screen. Again, this is considered “large” by Android’s standards.

The variety of display sizes can be challenging for designers who are trying to create one-size-fits-all layouts. I’ve found that the best approach is to design one set of layouts for 320 × 480 (your baseline) and another set for 320 × 533 (which would be considered a “large” physical screen size).

While this creates more work for both the designer and developer, the larger physical screen size on bigger devices such as the Motorola Droid and HTC Evo might require changes to the baseline layouts that make better use of the extra real estate.

What You Need to Know About Screen Densities

Screen sizes are only half the picture! Developers don’t refer to a screen’s resolution, but rather its density. Here’s how Android defines the terms in its Developers Guide:

  • Resolution
    The total number of physical pixels on a screen.
  • Screen density
    The quantity of pixels within a physical area of the screen, usually referred to as DPI (dots per inch).
  • Density-independent pixel (DP)
    This is a virtual pixel unit that you would use when defining a layout’s UI in order to express the layout’s dimensions or position in a density-independent way. The density-independent pixel is equivalent to one physical pixel on a 160 DPI screen, which is the baseline density assumed by the system of a “medium”-density screen. At runtime, the system transparently handles any scaling of the DP units as necessary, based on the actual density of the screen in use. The conversion of DP units to screen pixels is simple: pixels = DP * (DPI / 160). For example, on a 240 DPI screen, 1 DP equals 1.5 physical pixels. Always use DP units when defining your application’s UI to ensure that the UI displays properly on screens with different densities.

It’s a bit confusing, but here’s what you need to know. As with screen sizes, Android breaks down screen densities into four basic densities: lDPI (low), mDPI (medium), hDPI (high), and xhDPI (extra high). This is important because you’ll need to deliver all graphical assets (i.e. the bitmaps) in sets of lDPI, mDPI and hDPI densities. For now, let’s assume that xhDPI is for tablets only.

What this means is that all non-drawable graphics (i.e. graphics that can’t be scaled automatically by Android at runtime) need to be scaled from your “medium” (i.e. 320 × 480) baseline screen layouts.

The bitmap requirement is similar to preparing graphics for print vs. the Web. If you have any experience with print production, you’ll know that a 72 PPI image will look very pixelated and blurry when scaled up and printed. Instead, you would need to redo the image as a vector image or use a high-resolution photo and then set the file’s resolution at around 300 PPI in order to print it without any loss of image quality. Screen density for Android works similar, except that we’re not changing the file’s resolution, only the image’s size (i.e. standard 72 PPI is fine).

Let’s say you took a bitmap icon measuring 100 × 100 pixels from one of the screens of your baseline designs (remember the “baseline” is a layout set at 320 × 480). Placing this same 100 × 100 icon on a device with an lDPI screen would make the icon appear big and blurry. Likewise, placing it on a device with an hDPI screen would make it appear too small (due to the device having more dots per inch than the mDPI screen).

Density-test-bad in Designing For Android
An application without density support. (Image: Android Developers website)

To adjust for the different device screen densities, we need to follow a 3:4:6:8 scaling ratio between the four density sizes. (For the iPhone, it’s easy: it’s just a 2:1 ratio between the iPhone 4 and 3GS.) Using our ratios and some simple math, we can create four different versions of our bitmap to hand off to our developer for production:

  • 75 × 75 for low-density screens (i.e. ×0.75);
  • 100 × 100 for medium-density screens (our baseline);
  • 150 × 150 for high-density screens (×1.5);
  • 200 × 200 for extra high-density screens (×2.0). (We’re concerned with only lDPI, mDPI and hDPI for Android smartphone apps.)

Icon-sizes in Designing For Android
The final graphic assets would appear like this using the four different screen densities.

After you’ve produced all of your graphics, you could organize your graphics library as follows:

Folders in Designing For Android
The suggested organization and labeling of asset folders and files. In preparing our star graphic, all file prefixes could be preceded by the name ic_star, without changing the names of the respective densities.

You might be confused about what PPI (pixels per inch) to set your deliverables at. Just leave them at the standard 72 PPI, and scale the images accordingly.

Using Android Design Patterns

Clients often ask whether they can use their iPhone app design for Android. If you’re looking for shortcuts, building an app for mobile Web browsers using something like Webkit and HTML5 is perhaps a better choice. But to produce a native Android app, the answer is no. Why? Because Android’s UI conventions are different from iPhone’s.

The big difference is the “Back” key, for navigating to previous pages. The Back key on Android devices is fixed and always available to the user, regardless of the app. It’s either a physical part of the device or digitally fixed to the bottom of the screen, independent of any app, as in the recently released Android 3.0 for tablets (more on this later).

Back-key in Designing For Android
The hard “Back” key on a smartphone running Android 2.0.

The presence of a Back key outside of the app itself leaves space for other elements at the top of the screen, such as a logo, title or menu. While this navigational convention differs greatly from that of iOS, there are still other differentiators that Android calls “design patterns.” According to Android, a design pattern is a “general solution to a recurring problem.” Below are the main Android design patterns that were introduced with version 2.0.

Dashboard

This pattern solves the problem of having to navigate to several layers within an app. It provides a launch pad solution for rich apps such as Facebook, LinkedIn and Evernote.

Pattern-dashboard in Designing For Android
The dashboard design pattern, as used by Facebook and LinkedIn.

Action Bar

The action bar is one of Android’s most important design patterns and differentiators. It works very similar to a conventional website’s banner, with the logo or title typically on the left and the navigation items on the right. The action bar’s design is flexible and allows for hovering menus and expanding search boxes. It’s generally used as a global feature rather than a contextual one.

Pattern-action-bar in Designing For Android
The action bar design pattern as used by Twitter.

Search Bar

This gives the user a simple way to search by category, and it provides search suggestions.

Pattern-search-bar in Designing For Android
The search bar design pattern as used in the Google Search app.

Quick Actions

This design pattern is similar to iOS’ pop-up behavior that gives the user additional contextual actions. For example, tapping a photo in an app might trigger a quick action bar that allows the user to share the photo.

Pattern-quick-actions in Designing For Android
The quick action design pattern as used by Twitter.

Companion Widget

Widgets allow an app to display notifications on the user’s launch screen. Unlike push notifications in iOS, which behave as temporary modal dialogs, companion widgets remain on the launch screen. (Tip: to select a widget for your Android device, simply tap and hold any empty space on one of the launch screens.)

Pattern-widgets in Designing For Android
The companion widget by Engadget, New York Times and Pandora.

Using established design patterns is important for keeping the experience intuitive and familiar for your users. Users don’t want an iPhone experience on their Android device any more than a Mac user wants a Microsoft experience in their Mac OS environment. Understanding design patterns is the first step to learning to speak Android and designing an optimal experience for its users. Your developers will also thank you!

Android Design Deliverables

OK, so you’ve designed your Android app and are ready to make it a reality. What do you need to hand off to the developer? Here’s a quick list of deliverables:

  1. Annotated wireframes of the user experience based on the baseline “medium” size of 320 × 480 DPI. Include additional screens for instances when a “large” screen size requires a modified layout or when a landscape version is required.
  2. Two sets of visual design mock-ups of key screens for both medium-sized HVGA 320 × 480 screens and large-sized 320 × 533 screens (based on a WVGA 800 × 480 hDPI physical pixel screen size).
  3. Specifications for spacing, font sizes and colors, and an indication of any bitmaps.
  4. A graphics library with lDPI, mDPI and hDPI versions of all bitmaps saved as transparent PNG files. If you’re planning on developing one version of your app for smaller devices and another version for larger devices, then you’ll need lDPI and mDPI sets for your “medium” baseline design and one hDPI set for your “large” version.
  5. Density-specific app icons, including the app’s launch icon, as transparent PNG files. Android already provides excellent tips for designers on this topic, along with some downloads, including graphic PSD templates.
How To Take Screenshots

Your product manager has just asked for screenshots of the developer’s build. The developer is busy and can’t get them to you until tomorrow. What do you do?! As of this writing, Android has no built-in way to take screenshots (bummer, I know). The only way is to just deal with it, and that means pretending to be a developer for a while and downloading some really scary software. Let’s get started!

The following software must be downloaded in a Windows environment (I use Windows via Parallels Desktop on my Mac).

  1. All USB drivers for your Android device,
  2. Android software development kit (SDK),
  3. Java SE SDK

Then, on your computer:

  1. Extract the USB drivers to a folder on your desktop,
  2. Extract the Android SDK to a folder on your desktop,
  3. Install the Java SE SDK.

On your Android device:

  1. Open “Settings” (you’ll find it in the apps menu),
  2. Tap on “Applications,”
  3. Tap on “Development,”
  4. Check the box for “USB debugging.”

Settings in Designing For Android

Now, for the fun part:

  1. Connect your Android device to your computer via USB, and allow Windows to install all drivers. One of the drivers may not be found and will require you to go to the Window’s Device Manager in the Control Panel. There, locate the device (the one with the yellow warning icon beside it), and right-click on it.
  2. Choose to “update/install” the driver for your device.
  3. Go to your desktop. Open the Android SDK folder and select SDK Setup.exe.
  4. Allow it to automatically refresh its list of the operating system SDKs that are available, and select to install all packages.
  5. Once finished, exit the application.
  6. Go back to the opened Android SDK folder on your desktop, and open the “Tools” folder.
  7. Click on the file ddms to open the Dalvik Debug Monitor.
  8. Select your device from the “Name” pane.
  9. In the application’s top menu, open the “Device” menu, and choose “Screen capture…” A Device Screen Capture window will open, and you should see the launch screen of your Android device.

Dalvik-screen in Designing For Android
The Dalvik Debut Monitor.

To navigate:

  1. Grab your Android device and navigate to any page. Go back to your computer and select “Refresh” in the Device Screen Capture window. The current screen from your Android device should appear.
  2. If you’re on a Mac, you can just do the old Shift + Command + 4 trick to take a screenshot. In Windows, you can copy and paste it into one of the Windows media applications.
About Android Tablets

Android tablets differ greatly from smartphones in physical size and screen density. For screen density, assume that all tablets are high-def and use the extra-large “xDPI” size for bitmap graphics.

At CES 2011, companies rained down Android tablets, with an array of screen sizes. However, after a quick review of the most popular ones, we can conclude that the two important screen sizes to focus on in terms of physical pixels are 1280 × 800 and 800 × 480.

With the Android 3.0 Honeycomb release, Google provided device makers with an Android UI made for tablets. Gone is the hard “Back” button, replaced by an anchored software-generated navigation and system status bar at the bottom of the screen.

System-bar in Designing For Android
The anchored navigation and system bar in Android 3.0.

Android 3.0 got a visual refresh, while incorporating all of the design patterns introduced in Android 2.0. The only difference is that the action bar has been updated to include tabs, drop-down menus or breadcrumbs. The action bar can also change its appearance to show contextual actions when the user selects single or multiple elements on a screen.

New-action-bar in Designing For Android
The new action bar with tabs, introduced in Android 3.0.

Another new feature added to the Android framework with 3.0 is a mechanism called “fragments.” A fragment is a self-contained component in a layout that can change size and position depending on the screen’s orientation and size. This further addresses the problem of designing for multiple form factors by giving designers and developers a way to make their screen layout components elastic and stackable, depending on the screen limitations of the app. Screen components can be stretched, stacked, expanded and collapsed, and revealed and hidden.

Diagrams-green in Designing For Android
Diagram showing examples of how fragments can be used.

The next Android release, scrumptiously dubbed Ice Cream Sandwich, promises to bring this functionality to Android smartphones as well, giving designers and developers the option to build an app using a one-size-fits-all strategy. This could be a paradigm shift for designers and developers, who will need to learn to think of app design in terms of puzzle pieces that can be stretched, stacked, expanded or hidden to fit the form factor. In short, this will allow one Android OS to run anywhere (with infinite possibilities!).

A Word of Advice

Do get your hands on an Android phone and tablet, and spend some time downloading apps and exploring their interfaces. In order to design for Android, you have to immerse yourself in the environment and know it intimately. This might sound obvious, but it’s always surprising to hear when even the product manager doesn’t have an Android device.

Android-ice-cream-sandwich in Designing For Android

Online Resources

Here are some links to online resources I’ve found especially useful:

Presentations
Videos
Documents
Blogs
Product Reviews
Android Developers

Primeiros passos em jQuery

Programação Web é a Quinta-Feira

Criado por Pedro Pinto em 23 de Junho de 2011 | 9 comentários

Por Pedro Peixoto para o PPLWARE

Primeiros passos em JQuery

Nos últimos artigos temos vindo a falar da integração do Javascript nas aplicações PHP. Na última semana aumentámos um pouco mais a complexidade dos scripts, percebendo que, embora não estivéssemos a fazer nada de muito admirável, eram já necessárias algumas linhas de código. De facto o Javascript é uma linguagem completa e flexível mas pouco produtiva. Para combater este entrave surgiram bibliotecas que vieram facilitar o trabalho dos programadores. Estas bibliotecas permitem um acesso mais rápido a funcionalidades muito requeridas em aplicações WEB, para além de facilitarem o acesso à estrutura DOM e principalmente simplificarem a utilização de AJAX. Vamos por isso, aprender hoje a utilizar o JQuery.

web_01

Mas o que é o jQuery?

“jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.”

clip_image002

De facto o lema do jQuery é “Escreva menos, faça mais!”, e podemos assegurar que ambas as afirmações são verdadeiras. O Javascript foi ganhando ultimamente o seu merecido lugar de destaque, a evolução nos motores JS dos browsers, a impossibilidade do FLASH correr nos iDevices da moda, e a eminente emancipação do HTML5 muito contribuíram para isso. No entanto, existiam três pontos negativos em relação ao Javascript:

  • Em primeiro lugar é uma linguagem interpretada pelos browsers, e infelizmente nem sempre interpretada da mesma forma pelos diferentes navegadores. Nenhum programador se esquece das dores de cabeça que o já sepultado (felizmente) IE6 nos dava.
  • Outro dos problemas era o facto de o Javascript não possuir certas funcionalidades directas que a grande parte dos sites necessita. Para fazer um fadeout ou uma caixa de diálogo eram necessárias algumas linhas de código, ou até algumas funções, sendo já habito os programadores desenvolverem ficheiros .JS que permitiam funcionalidades deste tipo.
  • Por último o JS não permitia de forma fácil uma interacção imediata com as bases de dados e scripts PHP até ao aparecimento do AJAX, no entanto o AJAX também era demasiado complicado de ser usado.

Pretendia-se uma maneira fácil, rápida e bonita de programar certas funcionalidades, componentes e efeitos, para além de uniformizar a forma como os ficheiros .JS poderiam ser usados e adaptados de forma a tornarem-se autênticos PLUGINS. Surgiu então o jQuery, de facto muitos programadores WEB consideram hoje esta biblioteca uma autêntica preciosidade. Mas como “um Hello World vale mais do que mil palavras”… J … vamos ao que interessa.

Vamos como é hábito criar um ficheiro HTML com a estrutura básica já definida.

	<html>     
	<head>     	
	<title>Exemplo jQuery</title>     
	</head>          
	<body>      
	</body> 
</html>

O jQuery não é mais do que um ficheiro .JS que é necessário incluir na nossa página HTML. É possível baixar o jQuery através do próprio site:

Mas no nosso caso vamos fazer o include ficheiro directo, que está alojado no mesmo sítio:

Para incluir o ficheiro na nossa página adicionamos no head a seguinte linha de código:

http://code.jquery.com/jquery-1.6.1.min.js

E pronto estamos prontos para usar o jQuery, fácil não é? Vai ser ainda necessário uma “div” para exemplificar o funcionamento da biblioteca, e um botão para executar o código. Vamos começar por colocar o texto “Hello World!” dentro da div quando o botão Executar é clicado. Para isso basta adicionar o seguinte código ao evento click do botão:

$('#teste').html('Hello World!');

<=”” p=””>

<html>     
	<head>     	
		<title>Exemplo jQuery</title>         
		http://code.jquery.com/jquery-1.6.1.min.js     
	</head>          
	<body>     	
		
<br/> <input type="button" value="Executar" onClick="$('#teste').html('Hello World!')"> </body> </html>

E o resultado:

clip_image004

Como se pode perceber, para aceder a um elemento utilizamos a estrutura $(idouclass), com javascript simples para aceder à div teste teríamos:

Document.getElementById(‘teste’);

Com jQuery:

$(“#teste”)

O jQuery permite também aceder a elementos de uma determinada classe através do “.” em vez do “#” (como em css). Existem muitos mais selectors, podendo utilizar mesmo a navegação através da estrutura DOM à semelhança do JS mas de uma forma muito mais rápida. Aqui ficam alguns exemplos:

  • $(“p”) //aceder a todos os elementos “p”
  • $(“#pid”) //aceder ao elemento com o id “pid”
  • $(“.p”) //aceder a todos os elementos com a classe “p”
  • $(“table > tbody > tr”) //aceder a todas as linhas da tabela
  • $(“#t1 > tbody > tr”) // aceder a todas as linhas da tabela com id “#t1”
  • $(“input[type=’text’]“) // aceder aos inputs do tipo texto

Quando seleccionamos mais do que um elemento podemos usar a função each para percorrer elemento a elemento e aplicar uma acção ou então podemos usar filtros como o :first, :last e a função filter.

Em conclusão, o jQuery facilita a agiliza a programação com Javascript sendo por isso uma biblioteca indispensável. Este foi apenas um “cheirinho” para perceberem que não é de forma alguma complicado usarem esta poderosa biblioteca. Nos próximos artigos continuaremos a explorar o jQuery e também introduziremos jQuery UI de forma a aprendermos como criar aplicações/sites WEB mais atractivos e amigos do utilizador. Vamos ainda aprender a usar o jQuery em conjunto com o PHP, principalmente recorrendo ao AJAX e a funções do jQuery que tornam este recursos

Artigos relacionados

Homepage: JQuery