Usando a calculadora HP 12c

Olá pessoal, estou fazendo um curso de matemática financeira com uso da calculadora HP 12c através da XP Educação em Três de Maio - RS, durante o curso estou anotando algumas dicas que compartilho abaixo.

Tecla ON + X = testa a calculadora, exibe todas as funções menos o *, que significa que devemos trocar a bateria ou pilha.

Com a calculadora desligada pressione a tecla PONTO (.) + ON para configurar ponto ou vírgula para separar os inteiros dos decimais.

Para definir o número de casas decimais usar a tecla f + número de casas desejadas.

A calculadora trabalha com sistema de pilhas, por isso primeiro informamos os valores e depois as operações.

CLX apaga somente último valor registrado

FIN faz a limpeza de todos os registros de cálculo financeiro.

REG faz a limpeza dos outros registradores.

CHS serve para tornar um número positivo negativo ou um número negativo para positivo.

Para trabalhar com funções de data precisamos configurar 6 casa decimais, f + 6.

STO + EEX serve para exibir/ocultar o C ao lado direito da tela, quando ele está aparecendo é porque vai guardar números de períodos fracionários, senão apenas períodos inteiros.

f + ponto (.) para ativar notação científica quando vamos trabalhar com números muito grandes.

f + 2 para desativar a notação científica.

CF0 = Fluxo de Caixa Inicial

CFj = Diferentes Fluxos de Caixa no período

Nj = Fluxos de caixa iguais, repetidos em seqüência...

NPV = Determinar o valor a vista (Valor presente líquido)

Para trabalharmos com datas devemos usar 6 casas decimais, f + 6

Criando/Baixando/Listando/Apagando Arquivos no Delphi ASP.NET

Olá pessoal!

Hoje vou mostrar como criar arquivos .txt ou .sql com Delphi ASP.NET em tempo de execução a partir de uma string qualquer, gravar estes arquivos no servidor e descer para o usuário, também vou mostrar como listar os arquivos gerados, apagar e ler os dados de cada arquivo, recomendo a leitura do artigo Trabalhando com Diretórios e Arquivos do Blog Geeks .NET, lá o meu colega Mateus Chies já demonstrou algumas dessas funções da classe System.IO.

Bom, neste exemplo temos uma página que executa SQL diretamente no banco e exibe os resultados em uma gridView, após isso temos uma função que pega estes dados e gera um arquivo SQL com comandos para inserir (INSERT INTO ...) e disponibiliza o arquivo .SQL pra download, vamos primeiramente fazer a procedure que gera a SQL a partir de um dataset e grava o arquivo no servidor.


procedure TExemplo.GerarSQLInsert(ds:dataset);
var
  C,R: Integer;
  sql: StringBuilder;
  caminho, arquivo:string;
  arq: System.IO.FileInfo;
  dir: System.IO.Directory;
  stream: System.IO.StreamWriter;
begin
    {$REGION 'Cria SQL Insert'}
    sql := StringBuilder.Create;
    // Inicia transação na banco
    sql.appendLine('BEGIN TRANSACTION');
    sql.appendLine('GO');
    sql.AppendLine('');
    // Registros Encontrados
    for R := 0 to ds.Tables[0].Rows.Count - 1 do
    begin
      // Inicia comando Insert com Nome da Tabela
      sql.AppendLine('INSERT INTO '+txbNomeTabela.Text+' (');
      // Recupera Campos/Atributos
      for C := 0 to ds.Tables[0].Columns.Count - 1 do
      begin
        // Se não for última coluna precisa vírgula
        if C <> ds.Tables[0].Columns.Count -1 then
          sql.AppendLine(ds.Tables[0].Columns.Item[C].ColumnName+', ')
        else
          sql.AppendLine(ds.Tables[0].Columns.Item[C].ColumnName);
      end;
      // Fecha Atributos
      sql.AppendLine(') ');
      // Dado de cada Atributo
      sql.AppendLine('VALUES (');
      for C := 0 to ds.Tables[0].Columns.Count - 1 do
      begin
        // Se não for última coluna precisa vírgula
        if C <> ds.Tables[0].Columns.Count -1 then
        begin
          if ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM <> '' then
          begin
            // Verifica se o tipo é double
            if NumeroValido(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM) then
              sql.AppendLine(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+', ')
            else  // Se não deve ser string e precisa aspas
              sql.AppendLine(' '''+ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+''', ');
          end
          else
            sql.AppendLine('NULL, ');
        end
        else
        begin
          // Verifica se tem valor
          if ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM <> '' then
          begin
            // Verifica se o tipo é double
            if NumeroValido(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM) then
              sql.AppendLine(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM)
            else  // Se não deve ser string e precisa aspas
              sql.AppendLine(' '''+ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+''' ');
          end
          else
            sql.AppendLine('NULL');
        end;
      end;
      // Fecha Dados
      sql.AppendLine(')');
      sql.AppendLine('GO');
      sql.AppendLine('');
    end;
    sql.AppendLine('');
    // Encerra transação e grava registros
    sql.appendLine('COMMIT');
    sql.appendLine('GO');
    {$ENDREGION}
    // Exibe
//    lblScript.Text := sql.ToString;
    {$REGION 'Cria Arquivo SQL Insert e Desce para o Usuário'}
    try
      caminho := Server.MapPath('.')+'\SQL\';
      arquivo := 'SQL_INSERT_'+txbNomeTabela.Text+'.sql';
      // verifica / cria diretório se não existe
      if dir.Exists(caminho) = False then
        dir.CreateDirectory(caminho);
      // cria arquivo
      arq := System.IO.FileInfo.Create(caminho+arquivo);
      // Insere SQL no arquivo
      stream := System.IO.StreamWriter.Create(caminho+arquivo);
      stream.WriteLine(sql.ToString);
      stream.Close();
      // download do arquivo
      ScriptManager.RegisterStartupScript(Page, Page.GetType(), Guid.NewGuid().ToString(),'window.open("/SQL/'+arquivo+'","downsql","menubar=no,scrollbars=no,WIDTH=15,HEIGHT=15");', true);
    except on ex:exception do
      response.write('Erro durante criação do arquivo.
Detalhes: '+ex.message);
    end;
    {$ENDREGION}
end;

// Função que verifica se o número é válido (é um número ou não)

function TExemplo.NumeroValido(Numero: String): Boolean;
Var
  N: Double;
begin
  Result := False;
  try                
    N := Convert.ToDouble(Numero);
    Result := True;
  Except
    Result := False;
  end;
end;


Bom, no código acima ficou bem comentado o que cada parte faz, então vamos para o próximo passo, exibir os arquivos gerados em uma grid e também ter a opção de exibir o conteúdo dos arquivos em um textBox, excluir os arquivos ou fazer o download novamente.

Exibir os arquivos de um diretório é fácil como você já viu no post od Geeks .NET, mas aquele exemplo temos um problema, ele exibe o caminho completo do arquivo no servidor mas nós queremos ver apenas os nomes dos arquivos, então veja como ficou a procedure abaixo:


procedure TExemplo.ListarArquivos;
var
  caminho, na:string;
  lista: ArrayList;
  i: integer;
begin
  caminho := Server.MapPath('.');
  lista := ArrayList.Create;
  gvSQL.DataSource := System.IO.Directory.Getfiles(caminho+'\sql');
  gvSQL.databind();
  for I := 0 to gvSQL.rows.Count - 1 do
  begin
    na := gvSQL.Rows.item[i].cells[3].Text;
    // Substitui o caminho até o diretório dos arquivos por '' -> nada
    na := na.replace(caminho+'\sql\','');
    lista.add(na);
  end;
  gvSQL.DataSource := lista;
  gvSQL.databind();
end;


Ok, você pode notar que jogamos os nomes dos arquivos dos diretórios na coluna (Cells) 3 da grid, isto porque já temos as funções de ler, excluir e baixar nas três primeiras colunas da grid, veja o código da grid, tire os espaços nas tags.


< asp:gridview backcolor="White" bordercolor="#999999" borderstyle="Solid" borderwidth="1px" cellpadding="3" font-size="Small" forecolor="Black" gridlines="Vertical" id="gvSQL" runat="server">
    < columns>
   < asp:buttonfield commandname="LER" text="Carregar">< /asp:buttonfield>
            < asp:buttonfield commandname="DOWNLOAD" text="Download">< /asp:buttonfield>
            < asp:buttonfield commandname="EXCLUIR" imageurl="~/imagens/exc.gif" text="Excluir">< /asp:buttonfield>
          < /columns>
          < footerstyle backcolor="#CCCCCC">< /footerstyle>
          < pagerstyle backcolor="#999999" forecolor="Black" horizontalalign="Center">< /pagerstyle>
          < selectedrowstyle backcolor="#000099" font-bold="True" forecolor="White">< /selectedrowstyle>
          < headerstyle backcolor="Black" font-bold="True" forecolor="White">< /headerstyle>
          < alternatingrowstyle backcolor="#CCCCCC">< /alternatingrowstyle>
        < /asp:gridview>


Agora já sabemos criar os arquivos, exibir eles em uma grid, vamos a parte de ler e e excluir os arquvos existentes, para isso vamos implementar as funções para cada botão da grid, fazemos isto no evento RowCommand, veja código abaixo:


procedure TExemplo.gvSQL_RowCommand(sender: TObject; e: System.Web.UI.WebControls.GridViewCommandEventArgs);
var
  caminho,arquivo:string;
  arq: System.IO.FileInfo;
  reader: System.IO.StreamReader;
begin
  // Se o comando é EXCLUIR
  if e.commandname = 'EXCLUIR' then
  begin
    // Pega o caminho até o diretório
    caminho := Server.MapPath('.')+'\SQL\';
    // o Nome do arquivo SQL
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    // Cria arquivo
    arq := System.IO.FileInfo.Create(caminho+arquivo);
    // Se arquivo existe -> com certeza existe
    if arq.Exists then
      arq.Delete;  // Deleta
    // Atualiza Lista dos Arquivos
    ListarArquivos;
  end;
  // Se o comando é para baixar o arquivo -> DOWNLOAD
  if e.commandname = 'DOWNLOAD' then
  begin
    // Pega nome arquivo
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    // Redireciona usuário para endereço do arquivo, vai pedir pra baixar...
    Response.redirect('/SQL/'+arquivo);
  end;
  // Se for pra ler -> exibir na textbox conteúdo do arquivo
  if e.commandname = 'LER' then
  begin
    caminho := Server.MapPath('.')+'\SQL\';
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    reader := StreamReader.Create(caminho+arquivo);
    // Lê arquivo até o fim e joga string para textbox
    txbSQL.text := reader.ReadToEnd;
    reader.Close();
  end;
end;


Bom pessoal, basicamente é isto ai, não mostrei como faz .txt né, é só trocar o final do nome do arquivo (Extensão) de .sql para .txt e pronto. Espero que seja útil, hoje também fiz um post no Geeks mostrando como exportar dados de uma grid para o Excel, pode ser muito útil em alguns casos, normalmente o usuário pede também...

Agradecimentos ao Tiago Pasieka que começou a página que me motivou fazer estas funções, valeuu!!

Até!

Witricity: Eletricidade sem fio

Em 2007 vi no Inovação Tecnológica uma matéria sobre eletricidade sem fio, achei muito legal mas desconfiei dos problemas que isso poderia gerar, hoje vi um vídeo demonstrando que não existe risco algum utilizar esta tecnologia, finalmente vamos nos livrar dos fios, eu espero! :D




Encontrei por aqui.

Como se tornar um Hacker

Olá pessoal, recebi a dica do Helton e resolvi compartilhar aqui uma leitura básica pra quem tem interesse em desenvolvimento de softwares, a tradução do manual dos hackers de Eric Steven Raymond. Lá você encontrará alguns conceitos muito importantes para seguir nessa nossa vida louca, veja alguns trechos.

--------------------------------------------------
Existe uma comunidade, uma cultura compartilhada, de programadores experts e magos de redes que traçam sua história desde décadas atrás nos primeiros mini-computadores de tempo compartilhado e nos mais remotos experimentos da ARPAnet. Os membros dessa comunidade originaram o termo 'hacker'. Hackers construiram a Internet. hackers criaram o sistema operacional Unix da forma como ele é hoje. Hackers rodam a Usenet. Hackers fizeram a World Wide Web funcionar. Se você é parte dessa cultura, se você contribuiu para isso e outras pessoas nisto o chamam de hacker, então você é um hacker.
--
Há um outro grupo de pessoas que ruidosamente se auto-entitulam hackers, mas não são. Essas são pessoas (em grande parte adolescentes do sexo masculino) que possuem uma atração por entrar em computadores a força e por burlar o sistema telefônico. Verdadeiros hackers chamam essas pessoas de 'crackers' e não têm nada a ver com eles. Hackers verdadeiros em grande parte pensam que crackers são preguiçosos, irresponsáveis e não tão brilhantes, e sustentam que ser capaz de quebrar segurança não faz de você um hacker mais do que ser capaz de fazer ligação direta em um carro faz de você um engenheiro automotivo. Infelizmente, muitos jornalistas e escritores têm usado enganosamente a palavra 'hacker' para descrever crackers; isso irrita profundamente os verdadeiros hackers.
--
A diferença básica é esta: hackers constroem coisas, crackers as quebram.

CSS não carrega com login ASP.NET

Olá pessoal, esta semana tive um pequeno problema durante o desenvolvimento de um sistema web no VS 2008 SP1 com dotNET 3.5, fiz uma master page com CSS e um diretório com imagens do modelo, criei um novo web form baseado na master page e configurei a web.config para somente permitir visualizar as páginas quem já fez login, conforme código abaixo, após isso as páginas somente carregavam os estilos após o usuário ter feito login.



Após muita pesquisa na Internet consegui resolver o problema adicionando permissão de acesso para todos os usuários nos diretórios das imagens e do CSS, veja código abaixo.



Meu arquivo Web.config completo.



A estrutura dos diretórios e páginas do meu Web Site.


Se alguém passou por uma situacão parecida e encontrou uma outra solução gostaria que postasse nos comentários, abaixo estou anexando o livro onde encontrei esta dica.
Apontamentos ASP Net
Até.