Pesquisar no Programero

segunda-feira, 29 de dezembro de 2008

Usando o Oracle II

Olá a todos, peço primeiramente desculpas a todos pela ausência e principalmente pela demora na continuidade de alguns assuntos, como o Oracle, o fato é que em novembro meu tempo ficou meio apertado devido a assuntos profissionais (ainda bem, fechamos o ano com muito trabalho) e pessoais (reservei parte do meu tempo livre para estudar SQL e PL/SQL para o exame de certificação da Prometric que no dia 17/12/2008 o fiz e passei).
Desculpas a parte iremos retomar aqui a série “Usando o Oracle”, e no episódio de hoje mostraremos como manipular as informações (inserir, alterar, apagar e consultar).

 

SELECT

Com o SELECT realizamos a seleção das informações, devemos informar as informações desejadas, de onde elas serão buscadas e, se for o caso, restringir, agrupar ou ordenar o resultado.
Sintaxe:
SELECT coluna_01, coluna_02
FROM      tebla_x
WHERE  coluna_03 = 1;
O SELECT tem como objetivo, projeção (escolha das colunas de uma tabela), seleção (restringir os registros a serem retornados) e junção (reunir informações contidas em mais de uma tabela).
OBS.:
Pode ser utilizado o caracter coringa * no lugar do nome das colunas, com isso todas as colunas da tabela serão retornadas. Para casos onde existam valores repetidos pode-se eliminar os duplicados utilizando o DISTINCT logo após o SELECT.

 

 

INSERT

O INSERT é responsável por inserir dados nas tabelas, pode ser inserido um registro por vez ou vários quando utilizado uma consulta.
Sintaxe:
INSERT INTO tabela_x(coluna_01
                                         ,coluna_02
                                         ,coluna_03)
                          VALUES(1
                                          ,’ABC’
                                          ,3);
É recomendável que se coloque todas as colunas que receberão dados dentro da instrução, pois caso os nomes sejam suprimidos, se por algum motivo uma nova coluna for inserida na tabela o código INSERT deixará de funcionar até que o novo valor seja adicionado na cláusula VALUES.
OBS.:
Para casos onde se deseja inserir em uma tabela dados contidos em outra podemos fazer da seguinte maneira (lembrando que nesse caso a cláusula VALUES não é utilizada e deve-se sempre respeitar o tipo de dados e o número de colunas do INSERT e do SELECT):
INSERT INTO tabela_x
SELECT col_1, col_2, col_3
FROM     tab_y;

 

UPDATE

Para atualizar registros já existentes devemos utilizar o UPDATE.
Sintaxe:
UPDATE tabela_x
SET          coluna_02 = ‘NOVO_VALOR’
WHERE  coluna_01 = 1;
No exemplo utilizado para a sintaxe o que ocorre é o seguinte, a coluna_02 recebe o novo valor apenas para o registro que possua o valor 1 na coluna_01, se houverem mais de um registro nesta situação todos serão atualizados, do mesmo modo se a cláusula WHERE não for indicada todos os registros da tabela serão alterados.

 

DELETE

O DELETE é responsável por remover registros (todos ou um determinado número) de uma tabela.
Sintaxe:
DELETE FROM tabela_x
WHERE              coluna_01 = 1;
Lembrando que a exemplo do UPDATE, quando a cláusula WHERE não é fornecida todos os registros da tabela são apagados.

 

MERGE

Por fim falaremos do MERGE que possibilita atualizar ou inserir dados em uma tabela condicionalmente, onde sempre ocorre um UPDATE quando o registro existe e um INSERT caso seja um novo registro.
Sintaxe:
MERGE INTO tabela_x a
USING             tab_y       b
ON                   (a.coluna_01 = b.col_1)
WHEN MATCHED THEN
UPDATE SET
  a.coluna_02 = b.col_2
WHEN NOT MATCHED THEN
INSERT VALUES(b.col_1, b.col_2, b.col_3);
Como foi possível perceber as alterações irão ocorrer na tabela_x, quando existirem registros com o mesmo valor da condição ON ocorre a atualização, caso contrário ocorre a inserção.
Por enquanto é só, no próximo artigo falaremos de junções e agrupamento.

domingo, 28 de dezembro de 2008

Google “paga eu”

Quando nosso espaço começa a receber um numero razoável de visitas vislumbramos a possibilidade de juntar o útil ao agradável, porque não ganhar uma grana escrevendo algo que nos agrada e que certamente ajudara alguém. Pois é, na internet a publicidade come solta e no meu caso a primeira medida tomada na tentativa de rentabilizar o blog foi o adsense. Tudo muito simples, muito fácil e rápido até o momento de receber, sim amigos, estou com uma quantia parada já a algum tempo e ainda nada, ainda sou recebido pela boa e velha frase “Os seus pagamentos estão atualmente retidos. São necessárias algumas medidas para liberar o seu pagamento.” Ok, já perdi as contas de quantas vezes cliquei no maldito “mais detalhes” e a minha “Medida necessária” é sempre a mesma, o tal do PIN, não senhores eu não o inseri errado porque eu sequer recebi a tal correspondencia. Não resido em uma região inóspita ou desconhecida, haja visto que tenho recebido minhas correspondências normalmente, principalmente as faturas de todo mês, então que diabos de dificuldade é essa que o google tem em enviar uma carta para minha casa, a menos que eu esteja sofrendo de algum tipo de ilusão de ótica quando leio e releio, (e leio mais uma vez só pra ter certeza) não existe motivo para essa carta não ter vindo ainda (a possibilidade de meu carteiro ser um sabotador já foi descartada também). Então decidi escrever esse post e mais uma vez ir ate o adsense e reiterar para o google que ainda não recebi o danado do PIN. Bom, acho até que vou usar uma ferramenta do google para ajudá-los a encontrar minha casa, já que eles parecem estar ocupados (deduzo isso pois o ultimo contato do suporte em relação a isso ocorreu em setembro). Bom, o novo prazo de recebimento termina no primeiro dia do ano que vem (é claro que caso eu não receba nada vou aguardar ate o dia 3 mais ou menos, porque se o pessoal não conseguiu mandar a desgrama da carta até hoje, não vai ser de ressaca que o farão).
como_chegar(pessoal do google, se quiserem entregar pessoalmente ai esta a rota saindo da rodoviária)

segunda-feira, 24 de novembro de 2008

Texto na Diagonal usando o Canvas (Delphi)

var
  lf : TLogFont;
  tf : TFont;
begin
  with Form1.Canvas do
    begin
      Font.Name := 'Arial';
      Font.Size := 24;
      tf := TFont.Create;
      tf.Assign(Font);
      GetObject(tf.Handle, sizeof(lf), @lf); 
      lf.lfEscapement := 450;
      lf.lfOrientation := 450;
      tf.Handle := CreateFontIndirect(lf);
      Font.Assign(tf);
      tf.Free;
      TextOut(20, Height div 2, 'Texto Diagonal!');
   end;
end;

sexta-feira, 14 de novembro de 2008

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei).

Iniciar Serviço:

uses WinSvc;
//
// start service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStart(
  sMachine,
  sService : string ) : boolean;
var
  //
  // service control
  // manager handle
  schm,
  //
  // service handle
  schs   : SC_Handle;
  //
  // service status
  ss     : TServiceStatus;
  //
  // temp char pointer

  psTemp : PChar;
  //
  // check point

  dwChkP : DWord;
begin
  ss.dwCurrentState := -1;
  // connect to the service
  // control manager
  schm := OpenSCManager(
    PChar(sMachine),
    Nil,
    SC_MANAGER_CONNECT);
  // if successful...
if(schm > 0)then
begin
    // open a handle to
    // the specified service
    schs := OpenService(
      schm,
      PChar(sService),
      // we want to
      // start the service and
      SERVICE_START or
     // query service status
      SERVICE_QUERY_STATUS);
   // if successful...
if(schs > 0)then
begin
      psTemp := Nil;
if(StartService(
           schs,
           0,
           psTemp))then
begin
  // check status
if(QueryServiceStatus(
             schs,
             ss))then
begin
while(SERVICE_RUNNING
            <> ss.dwCurrentState)do
begin
           //
            // dwCheckPoint contains a
            // value that the service
            // increments periodically
            // to report its progress
            // during a lengthy
            // operation.
            //
            // save current value
            //
            dwChkP := ss.dwCheckPoint;
          //
            // wait a bit before
            // checking status again
            //
            // dwWaitHint is the
            // estimated amount of time
            // the calling program
            // should wait before calling
            // QueryServiceStatus() again
            //
            // idle events should be
            // handled here...
            //
            Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(
                 schs,
                 ss))then
begin
          // couldn't check status
              // break from the loop
              break; 
end;
if
(ss.dwCheckPoint <
              dwChkP)then
begin
         // QueryServiceStatus
              // didn't increment
              // dwCheckPoint as it
              // should have.
              // avoid an infinite
              // loop by breaking
              break;
       end;
          end;
        end;
      end;
     // close service handle
      CloseServiceHandle(schs);
   end;
  // close service control
    // manager handle
    CloseServiceHandle(schm);
  end;
// return TRUE if
  // the service status is running
  Result :=
    SERVICE_RUNNING =
      ss.dwCurrentState;
end;

Parar Serviço:

//
// stop service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStop(
  sMachine,
  sService : string ) : boolean;
var
//
  // service control
  // manager handle
  schm,
//
  // service handle

  schs   : SC_Handle;
//
  // service status
ss     : TServiceStatus;
  //
  // check point

  dwChkP : DWord;
begin
// connect to the service
  // control manager

  schm := OpenSCManager(
    PChar(sMachine),
    Nil,
    SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to
    // the specified service

    schs := OpenService(
      schm,
      PChar(sService),
   // we want to
      // stop the service and
      SERVICE_STOP or
   // query service status
      SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
if(ControlService(
           schs,
           SERVICE_CONTROL_STOP,
           ss))then
begin
  // check status
if(QueryServiceStatus(
             schs,
             ss))then
begin
while(SERVICE_STOPPED
            <> ss.dwCurrentState)do
begin
            //
            // dwCheckPoint contains a
            // value that the service
            // increments periodically
            // to report its progress
            // during a lengthy
            // operation.
            //
            // save current value
            //
            dwChkP := ss.dwCheckPoint;
      //
            // wait a bit before
            // checking status again
            //
            // dwWaitHint is the
            // estimated amount of time
            // the calling program
            // should wait before calling
            // QueryServiceStatus() again
            //
            // idle events should be
            // handled here...
            //
            Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(
                 schs,
                 ss))then
begin
        // couldn't check status
              // break from the loop
              break; 
end;
if(ss.dwCheckPoint <
              dwChkP)then
begin
            // QueryServiceStatus
              // didn't increment
              // dwCheckPoint as it
              // should have.
              // avoid an infinite
              // loop by breaking
              break;
          end;
          end;
        end;
      end;
   // close service handle
      CloseServiceHandle(schs);
    end;
  // close service control
    // manager handle
    CloseServiceHandle(schm);
  end;
// return TRUE if
  // the service status is stopped
  Result :=
    SERVICE_STOPPED =
      ss.dwCurrentState;
end;

Exemplo de uso:

Para inciar:
   ServiceStart('nome_do_computador', 'nome_do_servico');
Para parar:
   ServiceStop('nome_do_computador', 'nome_do_servico');

 

Exemplo completo

Para aqueles que encontraram alguma dificuldade em implementar, ou que estejam buscando uma maneira de faze-lo segue um exemplo completo e rodando, qualquer dúvida é só postar nos comentários.

terça-feira, 28 de outubro de 2008

Log de exceções não tratadas (Delphi)

Nem sempre é possível tornar nossa aplicação imune a todos os erros, sempre existe aquele que apenas o usuário conseguirá simular e na maioria das vezes você estará bem longe dali. Para não ficar apenas com a explicação do usuário, que muitas vezes e confusa e inconclusiva podemos criar uma maneira de ao menos rastrear os erros não controlados, isso mesmo podemos construir um "log" de erros, então vamos lá:
Adicione em seu formulário principal o componente ApplicationEvents da aba Additional;
No evento OnException entre com o seguinte código:
var
  vl_NomeDoLog : string;
  vl_Arquivo   : TextFile;
begin
  vl_NomeDoLog := ChangeFileExt(Application.Exename, '.log');
  AssignFile(vl_Arquivo, vl_NomeDoLog);
  IF FileExists(vl_NomeDoLog) THEN
    Append(vl_arquivo) { se existir, apenas adiciona linhas }
  ELSE
    ReWrite(vl_arquivo); { cria um novo se não existir }
  TRY
    WriteLn(vl_arquivo, 'APLICAÇÃO: ['+Screen.ActiveForm.Caption+'] DATA/HORA: ['+DateTimeToStr(Now)+']');
    Writeln(vl_arquivo, 'ERRO: ['+ E.Message+']');
    WriteLn(vl_arquivo, '-------');
    Application.ShowException(E);
  FINALLY
    CloseFile(vl_arquivo)
  END;
  FreeAndNil(vl_Arquivo);  
end;
A cada exceção não controlada que for gerada teremos um registro de qual aplicação a gerou, o momento e qual a mensagem de erro, com isso fica mais fácil reproduzir o erro para que uma solução seja encontrada.

segunda-feira, 13 de outubro de 2008

Open Hack Day

O Amigo Rodrigo Figueiredo comentou em meu ultimo post colocando um anuncio muito interessante sobre um evento que promete ser muito bom, para os que moram em São Paulo ou mesmo que tenham a possibilidade de ir até lá vale a pena conferir, segue abaixo uma matéria retirada do IDG Now falando sobre o evento.


São Paulo - Evento que incentiva a criação de aplicativos e serviços com plataformas do Yahoo! premiará os projetos mais criativos.
O Yahoo! promove, de 8 a 9 de novembro, o primeiro Open Hack Day na América Latina. O evento reunirá estudantes e profissionais de tecnologia para a criação de aplicativos e serviços com base nas plataformas da empresa.

O encontro é a versão brasileira do evento que aconteceu em setembro, nos Estados Unidos, e reuniu mais de 300 desenvolvedores e entusiastas da área.

O primeiro dia do Open Hack Day promove o ciclo de palestras “Tech Talks”, explicando o que será necessário para o desenvolvimento no dia seguinte.

Os projetos criados pelos participantes envolvem o uso do Yahoo! Search, o social bookmarking do del.icio.us, fotos do Flickr, música, tags e celular.

O Yahoo! especificou quatro categorias, não reveladas pela empresa, para dividir os projetos. A idéia mais criativa em cada uma delas será premiada após apresentação e julgamento de especialistas. Haverá também a premiação para o melhor projeto. Os prêmios ainda não foram definidos.

O Open Hack Day ocorre no Campus Santo Amaro do Centro Universitário Senac, que oferecerá toda a estrutura para os participantes passarem 2 dias de evento no local, com seus notebooks. A alimentação é por conta do evento e, para quem precisar descansar, o Senac terá uma área com puffs.

As inscrições são gratuitas e podem ser feitas pelo site hackday.org. As vagas são limitadas.

segunda-feira, 29 de setembro de 2008

Função INSTR do Oracle no Delphi

O Oracle possui uma função chamada INSTR(), ela procura por ocorrências de uma determinada palavra dentro de outra, começando de uma determinada posição, e retorna o índice quando encontrado.
Ex.:

SELECT INSTR('EDUARDO TEIXEIRA','ER', 1, 2) "Teste com INSTR"
FROM DUAL;

Teste com INSTR
----------
13

No exemplo acima a busca começa no primeiro caracter da frase 'EDUARDO TEIXEIRA' e procura pelo índice da segunda ocorrência da palavra 'ER', e o resultado foi a 13º posição.
Existe algo parecido no Delphi, é a função POEX, porém ela não trata ocorrências, trazendo sempre o índice da primeira encontrada, então ai vai uma função para o Delphi que faz o mesmo que o INSTR do Oracle:

function INSTR_Delphi(p_busca: string; p_buscado: string; p_inicio: integer; p_incidencia: integer): integer;
var
v_posi : integer; //guarda última posição encontrada
v_inc : integer;   //incidências já encontradas
v_i : integer;       //contador para loop

begin
//pego a primeira incidência do que é procurado
v_posi := PosEx(p_buscado, p_busca, p_inicio);
//
//se retornou alguma coisa continuo testando

if (v_posi 0) and (p_incidencia > 1) then 
begin
//ja pegou uma vez
v_inc := 1; 
//
//repito o teste até o final da palavra alvo
for v_i := v_posi to Length(p_busca) do
begin
//se eu encontrar agora partindo da posição encontrada anteriormente
//guardo a nova posição, se o limite de incidência não foi atingido

if (PosEx(p_buscado, p_busca, v_posi+1) 0) and (v_inc) then
begin
//guardo nova posição
v_posi := PosEx(p_buscado, p_busca, v_posi+1); 
//incremento incidência
v_inc := v_inc + 1;
end; //if (PosEx(p_buscado, p_busca, v_posi+1) 0) and (v_inc) then
end; //for v_i := v_posi to Length(p_busca) do 
end; //if (v_posi 0) and (p_incidencia > 1) then 
//
result := v_posi;
end;//function

terça-feira, 23 de setembro de 2008

Procurando emprego?

Responda rápido, qual empresa possui a marca mais valiosa do mundo (80 bilhões de dólares), conta com mais de 19 mil funcionários em 36 países, oferece um massagista 3 vezes por semana, possuiu um Wii e um Xbox no lounge, além de um fliperama e uma mesa de sinuca? Sim senhores, para aqueles que responderam Google acertaram, 40% das vagas no Brasil ainda não foram preenchidas. Os interessados devem se preparar bastante pois o processo de seleção é bem puxado, antes ocorriam até 30 entrevistas, hoje o numero foi bem reduzido chegando a 5 ou 6 entrevistas.

Mais alguns numeros do Google:
  • US$ 16,6 bilhões de faturamento em 2007
  • 19604 funcionários
  • 50 escritorios em 20 países
  • 1 milhão de usuarios ativos do Google Docs
  • 60 milhões de usuários do orkut
  • 10 mil clientes do Google Enterprise
  • 40 bilhões de páginas indexadas à ferramenta de busca

segunda-feira, 15 de setembro de 2008

BLOGAGEM COLETIVA "Justiça para Flavia"

No dia de hoje não falaremos sobre tecnologias, dicas ou truques, iremos ceder nosso espaço para um ato de cidadania, pois exigir que a lei se faça não é mais do que a obrigação de cada cidadão.
Irei redigir aqui uma matéria que foi extraída na integra do blog Flavia, Vivendo em Coma... , que é mantido por uma mãe que perdeu sua filha a mais de dez anos em função de um acidente fatal, causado pela má instalação de um ralo na piscina. Ela pede apenas que justiça seja feita.


Domingo, 27 de Julho de 2008

PISCINA SEGURA, RESPONSABILIDADE DOS PAIS?!

Foto por mim scaneada do Jornal A Folha de São Paulo.
Transcrevo alguns trechos da matéria publicada no Jornal FOLHA DE SÃO PAULO de domingo passado, dia 20 de Julho de 2008, no caderno “Construção”. A matéria está assinada por Mariana Desimone e vem com o título de PISCINA SEGURA. Infelizmente, não consegui o link na Internet para direcionar vocês para a reportagem. Quem por acaso puder me informar esse link, ficarei agradecida. Tentei, mas também não consegui contato com a jornalista.

Título da reportagem:
"PISCINA SEGURA
SUCÇÃO DO RALO REPRESENTA POSSIBILIDADE DE ACIDENTE”

Nesta matéria fica claro que a sucção do ralo representa perigo e “o pior que pode acontecer é uma criança ficar presa pelos cabelos em um ralo desses”. Realmente, é o pior que pode acontecer e infelizmente aconteceu - e continua acontecendo - com várias pessoas, conforme vem sendo documentado neste blog e infelizmente foi também o que aconteceu com Flavia. Seus cabelos foram sugados “por um desses ralos”. Venho, há mais de nove anos tentando provar isto na justiça paulista, sendo que tanto o Condomínio Jardim da Juriti, quanto à empresa JACUZZI DO BRASIL , vêm se negando a admitir esta evidência provada nos autos do processo de Flavia. Que provas são essas? A piscina onde Flavia sofreu o acidente foi esvaziada quatro vezes e "periciada" por profissional designado pela própria justiça. No laudo está escrito:
“O condomínio autor forneceu ao signatário, cópias de duas plantas, mas que, no entanto, não representam fielmente a realidade local. Nas aludidas plantas notou-se que o projeto sugeria conjunto motor/bomba com 0,50 cv. (meio cavalo vapor) sendo que atualmente, pelas informações prestadas e colhidas na primeira visita, o referido equipamento foi substituído pelo condomínio, posteriormente, muito embora antes do acidente com a co-autora, o qual está lá instalado, até a presente data em funcionamento, tem potência de 1,5 cv (um e meio cavalo-vapor)”.

Conclusões da perícia:
“... a perícia pôde concluir que:
Houve substituição do conjunto motor/bomba/filtro e a instalação de um aquecedor, o que aconteceu antes do acidente. O equipamento anterior possuía potência de 0,50 cv (cavalo motor) e o atual, adquirido pelo condomínio é de 1,50 cv, da marca Jacuzzi....... o conjunto motor/bomba/filtro adquirido pelo condomínio, possui potência acima das necessidades locais, adequado para uma piscina de 104 m3 de água. A piscina da presente ação possui 43 m3, podendo ser considerado o conjunto, superdimensionado em 78%.

“....... o signatário entende que a sucção, da forma como aconteceu com a co-autora, não estaria relacionada com o seu peso, podendo tal fato ter ocorrido, mesmo que ela possuísse maior ou menor massa, desde que seus cabelos se aproximassem do aludido ralo....”.

Frase minha: O parágrafo acima explica porque também adultos têm sido vitimadas por acidentes com ralos de piscinas.

Está ainda no artigo da Folha de São Paulo:
“Uma vez pronta a piscina, outras medidas são necessárias para que o lazer aquático seja seguro para todos."
"Augusto Araújo, diretor da fabricante Sodramar, aponta a sucção como um dos elementos que devem receber a atenção especial dos pais. “Dependendo do tamanho da piscina, há uma força muito grande nas saídas de água. O pior que pode acontecer é uma criança ficar presa pelo cabelo em um ralo desses”, alerta.

O texto a seguir não faz parte da reportagem - são palavras minhas.

Sr. Augusto Araújo:
Pois esse pior aí a que o senhor se refere, aconteceu com minha filha Flavia. A forte sucção do ralo da piscina em que ela nadava, sugou o cabelo dela, deixando-a presa embaixo dágua o que lhe causou um quase afogamento. As seqüelas? Flavia entrou em coma vigil irreversível, e vive – em sofrimento – há mais de 10 anos.

Sr. Augusto Araújo:
Não concordo que sejam os pais a "darem atenção especial" e terem que se preocupar se a sucção do ralo da piscina onde suas crianças brincam e se divertem, está ou não tão forte que lhes ofereça perigo de vida. Como exigir dos pais capacidade técnica para avaliar essa condição de perigo?! São os pais por acaso conhecedores da correta relação entre potência do motor de sucção e a metragem cúbica de água da piscina onde seus filhos brincam e se divertem?! Essa preocupação Sr. Augusto, deveria ser em primeiro lugar do fabricante do sistema de sucção da piscina, que deveria além de fazer constar em seus manuais a possibilidade de acidentes, caso exista desproporção entre o sistema de sucção da água e o tamanho da piscina, assim como também disponibilizar pessoa tecnicamente habilitada para orientar verbalmente o consumidor final. Em se tratando de evitar acidentes e mortes Sr.Augusto, isto seria o mais correto a ser feito. E essa preocupação deveria ser também do responsável pela manutenção e funcionamento da piscina. E - de novo – em se tratando de evitar acidentes graves, não seria demais que piscinas de uso público e coletivo tivessem obrigatoriamente que passar por fiscalização periódica e no caso de serem constatadas irregularidades, os responsáveis punidos, não simbolicamente claro, mas exemplarmente.

Ricardo Bargieri, presidente da fabricante Jacuzzi, participa desta matéria, mas limita-se a falar da limpeza da piscina. Senhor Ricardo Bargieri, o que falta para a empresa que o senhor preside admitir que minha filha teve os cabelos sugados por um ralo de fabricação Jacuzzi – instalado fora dos padrões técnicos de segurança por falta de informação da Jacuzzi? Senhor Ricardo Bargieri, o que falta para a empresa que o senhor preside assumir uma postura de responsabilidade civil e indenizar Flavia com um valor adequado e coerente com a dimensão e gravidade do acidente que lhe deixou em coma irreversível?! Senhor Ricardo Bargieri, uma empresa não se mantém líder apenas por estar bem posicionada no mercado, mas sim por assumir uma postura de responsabilidade social, onde fique claro que essa empresa está mais preocupada com vidas humanas do que com o seu próprio lucro.

Senhores juizes: E depois de mais de nove anos de luta pelos direitos de Flavia, o que ainda lhes falta para que a empresa Jacuzzi do Brasil seja exemplarmente condenada a pagar a Flavia uma indenização que me permita cuidar dela com a qualidade de vida que ela precisa e que lhe proporcione uma sobrevida digna!?

Obs: Os negritos do texto são meus.

Diversos

Todos os assuntos que não estiverem classificados nos outros tópicos serão listados aqui, independente de estarem relacionados com tecnologia.



  1. Ruby
  2. Programação Orientada a Objetos (POO)
  3. E você ? Ficando rico também ?
  4. Fiscalização acirrada !
  5. Geoprocessamento
  6. Internet sob rede elétrica
  7. BLOGAGEM COLETIVA "Justiça para Flavia"
  8. Premio Dardos
  9. Procurando emprego?
  10. Open Hack Day
  11. Google “paga eu”
  12. Cursos de Graduação Gratuitos
  13. O Google me achou, coincidências à parte…
  14. 6 coisas e 6 links
  15. E o Android chegou nos notebooks
  16.  
  17. Maldito Layout de terceiro…
  18. Pedido de Desculpas…
  19. Aos poucos…
  20. Menu horizontal com CSS (Tableless)
  21. Um pouco sobre o twitter
  22. Nem só de anuncios viverá o google…
  23. O crescimento do twitter
  24. O que fazer com televisores (monitores) velhos?
  25. Já usou seu pen drive hoje?
  26. Woverine já na internet
  27. QR Code
  28. E o FireFox ultrapassa o IE na Europa
  29. Internet pela rede elétrica regulamentada
  30. A possível quebra de paradigma do FireFox
  31. Malandro também se liga no Google
  32. Doe sangue você também
  33. Oracle compra a Sun
  34. Um terabyte de capacidade?
  35. A escória tem que escutar
  36. Pagar viagem para FDP só se for para a PQP (e sem volta)
  37. Um pouco sobre a TV máfia (vulgo TV Globo)
  38. CPI da Petrobras
  39. Nanotecnologia em cigarros?
  40. Bug do Twitter?
  41. Processador de 1THz? Também quero
  42. Como é que eu nunca usei o Oper antes?
  43. Queremos Edmar castelão na prisão
  44. A Microsoft e seu projeto Natal
  45. Será que agora o PT ainda segura ele?
  46. Tio Bill confirma projeto Natal em PCs
  47. Desativar o IE?
  48. Firmada grande parceria em buscas na web
  49. E a gripe suína?
  50. Cara de pau é pouco…
  51. Pen Drive espião (Stealth iBot Computer Spy)
  52. Pede pra sair bigode fdp !
  53. Campanha de amor a pátria
  54. A nuvem em alta
  55. Os processos do Castelão
  56. Campanha ficha limpa
  57. Blog Action Day
  58. Conheça um pouco mais sobre energia limpa
  59. Lista de políticos com ficha suja
  60. De volta, aos poucos…
  61. É possível ficar pior ?
  62. Android e eu
  63. Um exemplo a ser seguido (até agora) deputado José Reguffe
  64. Boa Senador

quarta-feira, 3 de setembro de 2008

Usando o Oracle I


Olá a todos, nesta série de artigos vamos dar uma pincelada nos fundamentos SQL, como criar usuarios, tabelas, procedimentos, entre outras coisas.
Nesse que será o primeiro vamos criar uma pequena base de dados para os artigos seguintes, para os que ainda não possuem, podem baixar a versão gratuita do Oracle aqui, para a instalação existe um documento oficial, não é complicado de se fazer, devemos apenas nos atentar para não esquecer a senha dos usuários de administração do banco.
Criando um usuário
Antes de mais nada, devemos logar no banco como SYSTEM para podermos criar nosso usuário para então iniciar o processo de construção de nossa base:
Criando o usuário CURSO_SQL com senha de mesmo nome:
CREATE USER CURSO_SQL IDENTIFIED BY CURSO_SQL;
Agora precisamos garantir a esse usuário direitos de acesso e criação na base:
GRANT CREATE TABLE, CREATE PROCEDURE, CREATE TRIGGER, CREATE SEQUENCE, CREATE VIEW, CREATE SESSION TO CURSO_SQL;
E por fim garantir acesso a tablespace:
GRANT UNLIMITED TABLESPACE TO CURSO_SQL;
Criando as tabelas
Após logar com o usuário criado anteriormente devemos criar nossa tabelas, antes dos códigos SQL vamos dar uma olhada em alguns dos tipos de dados e depois nos comandos necessários.
  • VARCHAR2(tamanho) - Conjunto de caracteres de comprimento variável, caso o tamanho especificado não seja atingido o que resta não ocupa espaço no banco.
  • CHAR(tamanho) - Conjunto de caracter de comprimento fixo, mais utilizado para campos de tamanho fixo.
  • NUMBER(t, d) - Números fixos ou de ponto flutuante, onde o numero apos a virgula define o total de casas decimais
  • DATE - Datas, armazena inclusive horas, minutos, segundos e século.
  • NVARCHAR2 - Conjunto de caracteres de comprimento variável que usam o conjunto nacional de caracteres, como o japones.
  • NCHAR - Conjunto de comprimento fixo que usam o conjunto nacional de caracter.
  • ROWID - Usado para armazenar rowids físicos (Endereço físico do registro no Banco de Dados).
  • RAW e LONG RAW - Usado para armazenar grandes quantidades de dados binários e figuras
  • BLOB - Dados binários de até 4 gigabytes.
  • BFILE - Dados binários armazenados em um arquivo externo.
Devemos respeitar certas regras antes da criação das tabelas:
  • Os nome devem iniciar com uma letra;
  • Devem ter de 1 a 30 caracteres;
  • Devem conter somente AZ, az, 09, _, $ e #;
  • Não podem ter o mesmo nome de outro objeto do mesmo usuário;
  • Não podem duplicar o nome de um objeto do Oracle;
O comando para criação:
  • CREATE TABLE [esquema.]tabela(coluna tipo_de_dados [DEFAULT expr][, ...]);
ou com base em uma subconsulta:
  • CREATE TABLE tabela[(coluna, coluna...)] AS subconsulta;
Para adicionar, modificar ou eliminar colunas:
  • ALTER TABLE tabela ADD (coluna tipo_de_dados [DEFAULT expr][,coluna tipo_de_dados]...);
  • ALTER TABLE tabela MODIFY (coluna tipo_de_dados [DEFAULT expr][,colun tipo_de_dados]...);
  • ALTER TABLE tabela DROP (coluna);
Para apagar uma tabela
  • DROP TABLE tabela;
Restrições
Além da criação das tabelas precisamos definir um conjunto de restrições para garantir a integridade relacional da base.
Podemos definir as restrições durante a criação da tabela
Nivel de coluna
  • CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr][restrição_de_coluna],...[restrição_de_tabela][,...]);
ou Nivel de tabela
  • CREATE TABLE employees(employee_id  NUMBER(6), first_name   VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL,  CONSTRAIN emp_emp_id_pk  PRIMARY KEY (EMPLOYEE_ID));
Tipos de restrição
  • NOT NULL - Garante que na coluna indicada não serão aceitos valores nulos;
  • UNIQUE - Impossibilita que existam valores repetidos para determinada coluna;
  • PRIMARY KEY - Chave primária da tabela, pode haver apenas uma para cada tabela, identifica exclusivamente cada registro na tabela (é a combinação de NOT NULL E UNIQUE);
  • FOREIGN KEY - Chave estrangeira, responsável pela integridade referencial, estabelece um relacionamento entre a chave primaria ou exclusiva na mesma tabela ou em uma outra;
  • CHECK - Define uma condição a ser satisfeita no momento dacriação de uma tabela;
Criando as tabelas para os artigos posteriores
Nosso esquema será como o modelo abaixo:
Agora o código:
--
--
-- ## FORNECEDORES ##
CREATE TABLE FORNECEDORES( FORNECEDOR_ID NUMBER(9),
                           NOME          VARCHAR2(50),
                           EMAIL         VARCHAR2(30)
                          );   
--
ALTER TABLE FORNECEDORES ADD CONSTRAINT PK_FORNECEDOR PRIMARY KEY (FORNECEDOR_ID);
--
--
-- ## PRODUTOS ##
CREATE TABLE PRODUTOS( PRODUTO_ID     NUMBER(9),
                       DESCRICAO      VARCHAR2(80),
                       VALOR_UNITARIO NUMBER(10,2),
                       FORNECEDOR_ID  NUMBER(9)
                     );
--
ALTER TABLE PRODUTOS ADD CONSTRAINT PK_PRODUTOS PRIMARY KEY (PRODUTO_ID);
ALTER TABLE PRODUTOS ADD CONSTRAINT FK_PRODUTOS FOREIGN KEY (FORNECEDOR_ID) REFERENCES FORNECEDORES (FORNECEDOR_ID);
--
--
-- ## FUNCIONARIOS ##
CREATE TABLE FUNCIONARIOS( FUNCIONARIO_ID NUMBER(9),
                           NOME           VARCHAR2(50),
                           DATA_ADMISSAO  DATE,
                           DATA_DEMISSAO  DATE
                         );
--
ALTER TABLE FUNCIONARIOS ADD CONSTRAINT PK_FUNCIONARIOS PRIMARY KEY (FUNCIONARIO_ID);
--
--
-- ## CLIENTES ##
CREATE TABLE CLIENTES( CLIENTE_ID NUMBER(9),
                       NOME       VARCHAR2(50),
                       TELEFONE   VARCHAR2(20),
                       ENDERECO   VARCHAR2(100)
                     );
--
ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (CLIENTE_ID);
--
--
-- ## PEDIDOS ##
CREATE TABLE PEDIDOS( PEDIDO_ID      NUMBER(9),
                      DATA_PEDIDO    DATE,
                      OBSERVACAO     VARCHAR2(100),
                      FUNCIONARIO_ID NUMBER(9),
                      CLIENTE_ID     NUMBER(9)
                    );
--
ALTER TABLE PEDIDOS ADD CONSTRAINT PK_PEDIDOS PRIMARY KEY (PEDIDO_ID);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_FUN FOREIGN KEY (FUNCIONARIO_ID) REFERENCES FUNCIONARIOS (FUNCIONARIO_ID);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLI FOREIGN KEY (CLIENTE_ID) REFERENCES CLIENTES (CLIENTE_ID);
--
--
-- ## ITEM_PEDIDOS ##
CREATE TABLE ITEM_PEDIDOS( PEDIDO_ID      NUMBER(9),
                           SEQUENCIA_ITEM NUMBER(9),
                           QUANTIDADE     NUMBER(4),
                           VALOR_ITEM     NUMBER(10,2),
                           PRODUTO_ID     NUMBER(9)
                         );
--
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT PK_ITEM_PEDIDOS PRIMARY KEY(PEDIDO_ID, SEQUENCIA_ITEM);
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT FK_ITEM_PEDIDOS_PED FOREIGN KEY(PEDIDO_ID) REFERENCES PEDIDOS (PEDIDO_ID);
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT FK_ITEM_PEDIDOS_PRO FOREIGN KEY(PRODUTO_ID) REFERENCES PRODUTOS (PRODUTO_ID);
--
Bom, essa foi a introdução, agora que nossa base está construida iremo nos proximos artigos manipular as informações.

sexta-feira, 29 de agosto de 2008

Internet sob rede elétrica

Já imaginou plugar seu modem na tomada? E melhor, conseguir velocidades que chegam a 200Mbps (lembrando que hoje a maior velocidade é de 30Mbps). Pois é, esse tipo de tecnologia não é nenhuma novidade já em meados do ano 2000, algumas empresas brasileiras fizeram testes, mas nada além disso. Só em 2006 é que ela entrou em foco novamente, com a instalação de uma rede esperimental em Porto Algre, a rede cobre 3,5 quilômetros de extensão atingindo velocidades de até 45Mbps.

Bom percebe-se que sua area de abrangencia e um tanto pequena, vamos ver algumas desvantagens:
  • Manter a alta velocidade com longas distâncias, pelo encapamento plástico "roubar" os sinais de alta frequência;
  • Os fios de cobre com tal frequência podem interferir em alguns equipamentos eletro-eletrônicos, por fazer com que os dados gerem ruído no espectro eletromagnético, além de haver possibilidade de corromper os dados pela captura do sinal de rádios e outros;
  • Da mesma forma, alguns aparelhos podem interferir na transmissão;
  • Emendas, "T"s, filtros de linha, transformadores, e o ligamento e desligamento de eletrônicos na rede elétrica causam ecos do sinal, por criar pontos de reflexão, com isso podendo haver corrupção dos dados;
  • Necessidade de instalação de "repetidores" em cada tranformador externo (aqueles dos postes), pois filtram sinais de alta frequência.
Agora algumas de suas vantagens:
  • Facilidade de implantação;
  • Alta taxa de transmissão;
  • Segurança apurada, devido à criptografia com algoritmo DES de 56 bits;
  • Fácil integração entre dispositivos, eletrodomesticos e eletroeletronicos, desde que estes possuam estas funcionalidades;
  • Monitoração da energia eletrica, com o grid inteligente, as quedas são reduzidas em 80%, bem como diminuição da energia perdida em 10%, pois, num corte, o grid já aciona automaticamente a central e informa o local do ocorrido.

Mas porque cargas d'agua eu estou falando sobre isso então? Pois bem, a Panasonic em parceria com a Associação de Empresas Proprietarias de Infra-Estrutura e Sistemas Privados de Telecomunicações (Aptel) implantou uma rede em Barreirinhas (MA). A Panasonic aguarda a regulamentação do serviço pela Anatel e cogita até a produção dos equipamentos necessários em solo nacional. Questionada quanto a um possivel aumento no consumo de energia eletrica a empresa afirma que, com o sistema implantado e conectado ao sistema das concessionarias pode haver um controle maior dos gastos, gerando até uma redução no consumo.

Funcionamento

Para os interessados, segue abaixo o esquema de funcionamento, retirado do artigo "Entendendo a Inernet sob rede elétrica" de Júlio César Bessa Monqueiro, encontrado no Guia do Hardware.net:

O princípio básico de funcionamento das redes PLC é que, como a frequência dos sinais de conexão é na casa dos MHz 91,7 a 30), e a energia elétrica é da ordem dos Hz (50 a 60 Hz), os dois sinais podem conviver harmoniosamente, no mesmo meio. Com isso, mesmo se a energia elétrica não estiver passando no fio naquele momento, o sinal da Internet não será interrompido. A tecnologia, também possibilita a conexão de aparelhos de som e vários outros eletroeletrônicos em rede, como já dito acima. A Internet sob PLC possui velocidade não assíncrona: ou seja, você tem o mesmo desempenho no recebimento ou envio de dados.

O princípio de funcionamento da rede comercial é parecido, vamos ao esquema:


O sinal do BPL sai da central, indo para o injetor, que vai se encarregar de enviá-lo à rede elétrica. No caminho, o repetidor tem a função de não deixar com que os transformadores filtrem as altas frequências. Chegando perto da casa, o extrator, que deixa o sinal pronto para uso da casa, chegando até o modem BPL, que vai converter para uso pelo computador, através de uma porta Ethernet ou USB. No penúltimo passo, no caminho poste-casa, há 3 meios: por cabo de fibra óptica, por wireless ou pela própria fiação elétrica, este último mais provável.

Como há um repetidor a cada transformador, e nesse sistema com grids inteligentes não se usa mais os atuais “relógios”, descarta-se a desvantagem mais famosa na Internet do uso do PLC - de que os tranformadores, por absorver os sinais, impossibilitariam a instalação.

Analisando em termos de cidade, vamos à mais um esquema:


Veja, que é de modo um pouco diferente do outro, adaptado pela empresa Plexeon, porém com a mesma definição. O sinal sai da estação que o “injeta” na linha, indo para a rede de distribuição – primeiramente à órgãos públicos - e depois às casas, sempre passando por um repetidor ao passo que um transformador passa na linha, e um extrator quando finalmente chega na casa. Note que as casas também poder ser conectadas pelo repetidor.

Para uma rede doméstica, basta ligar um módulo PLC do roteador na rede elétrica, e o do outro computador também, após isso configurando normalmente. Esses módulos têm o nome de “USB to PowerLine”, e é vendido no Brasil pela Naxos.


A especificação mais usada hoje é a DS2, que se originou na Europa. Nos EUA, também é usado o padrão HomePlug. As versões comerciais vendidas no exterior hoje possui velocidade média de 200 Mbits/s. O principal diferencial entre os padrões é a frequência - cada uma com suas vantagens.

Como já visto, o BPL não interfere, na sua frequência, em eletrodomésticos, devido às grandezas serem diferentes. Porém, parte da onda média (1,7 a 3 Mhz) e toda a onda média (3 a 30 Mhz) ficam inutilizadas e prejudicadas, podendo outros equipamentos causarem interferências, como motores e dimmers de luz, além de secadores de cabelos, aspiradores e as furadeiras elétricas, havendo uma menor possibilidade também dos chuveiros elétricos prejudicarem.

Vale lembrar também que os equipamentos PLC não podem ser ligados à no-breaks, estabilizadores ou filtros de linha, pois este bloqueiam sinais de alta frequência.

Bom, e então, o que será do BPL? Apesar de muitas desvantagens, essa nova tecnologia caminha para o mesmo rumo que o maioria: unificação. Transformar a rede de telefonia (através do VoIP), internet e elétrica numa linha só é mais um passo para a evolução. Com relação às desvantagens, podemos dizer que, assim como a tecnologia ADSL, que leva dois tipos de sinais num só fio (dados e voz), e, as interferências podem ser consertadas ao longo do tempo, com novos equipamentos que respeitem essa faixa de frequência, além de outras tecnologias e padrões internacionais que vão sendo naturalmente incorporadas. Ou seja, a maioria dos problemas enfrentados podem ser resolvidos com uma boa dose de tempo. Claro que, essa teoria só é válida se houver interesse muito grande de empresas e principalmente de governos, além de uma cooperação entre companhias de eletricidade, Internet e telefonia. É como a carroça, que pode demorar, mas chega lá. Porém, ela não vai andar se cavalos não a puxarem, muito menos se cada um quiser ir para um lado.

No Brasil, obviamente também pode dar certo, pois muitas empresas do setor de elétrica estão continuando seus testes, além de que tecnologias européias podem ser importadas, isso se nenhuma universidade brasileira desenvolver algo antes. O BPL se mostra como mais uma alternativa de inclusão à Internet, num país onde 95% da população possui energia elétrica. Além disso, como a infra-estrutura é de menor custo, esse sistema mostra-se como uma alternativa mais econômica para os usuários.

Comente este artigo.

quarta-feira, 27 de agosto de 2008

Data e Hora no j2me

Segue um exemplo de como pegar a data e a hora usando o Calendar do j2me:

//
//Método para recuperação da data e hora do sistema
public String dataHora() {
//recupera data e hora atual do sistema
Calendar cal = Calendar.getInstance();
Date date = new Date();
cal.setTime(date);
String mes = String.valueOf(cal.get(Calendar.MONTH) + 1);
String dia = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
String ano = String.valueOf(cal.get(Calendar.YEAR));
String horas = String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
String minutos = String.valueOf(cal.get(Calendar.MINUTE));
String segundos = String.valueOf(cal.get(Calendar.SECOND));
//
cal = null;
date = null;
//
//formata a data de modo que o tamanho do resultado seja sempre fixo
//dia
if (dia.length() < 2) { dia = "0" + dia; } //mes
if (mes.length() < 2) { mes = "0" + mes; } //horas
if (horas.length() < 2) { horas = "0" + horas; } //minutos
if (minutos.length() < 2) { minutos = "0" + minutos; } //segundos
if (segundos.length() < 2) { segundos = "0" + segundos; } //
return dia + "/" + mes + "/" + ano + " " + horas + ":" + minutos + ":" + segundos;
}

segunda-feira, 18 de agosto de 2008

Colocar imagem em campo do dbGrid

Considerando que minha pasta de ícones esta no mesmo nível da pasta de minha aplicação, e que eu tenho em meu banco de dados o nome do arquivo isso funciona.

Procedure DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
vl_icone : ticon;
vl_fixo : TRect;

begin
vl_fixo := Rect;
if (Column.Field = ClientDataSet1cone) and (ClientDataSet1NOME_ICONE.AsString '') then
begin
vl_icone := Ticon.Create;
vl_icone.Height := 10;
try
vl_icone.LoadFromFile(('..\Icones\'+ClientDataSet1NOME_ICONE.AsString));
DBGrid1.Canvas.StretchDraw(vl_fixo, vl_icone);
finally
vl_icone.Free;
end;
end;

end;

quinta-feira, 14 de agosto de 2008

O ótimo LWUIT (Java ME)

Todos que começam a desenvolver com o j2me se deparam com várias limitações, mas uma com certeza é a que mais nos incomoda, a interface com o usuário. Para tornar essa tarefa mais fácil, e muito mais profissional foi desenvolvida uma biblioteca chamada LWUIT que suporta componentes visuais, temas, animações e outras coisas mais.
Em uma de minhas visitas a um fórum me deparei com um tópico que me chamou a atenção, era a respeito de layout no j2me, lá recomendaram o uso do LWUIT e a partir dai comecei a estudar.
Logo de cara fiquei bem empolgado com o resultado final dos exemplos, então decidi que irei escrever algumas matérias a respeito, e nessa introdutória deixarei aqui, alem do meu testemunho favorável, links para iniciar a utilização do mesmo.

Veja alguns videos:




No PSP:





Dentro do emulador:





Vários modelos:



Comece por aqui, baixe a biblioteca, veja a documentação e comece com os exemplos:
java.net lwuit

Blog de um dos desenvolvedores, recomendado:
Shai's Java & LWUIT Blog

Fórum especializado:
Forum:lwuit

Blog nacional que já abordou o assunto:
Neto Marin mobility Blog

quinta-feira, 7 de agosto de 2008

Desenvolvimento de aplicações para dispositivos móveis III (Java)

Completanto essa série de três artigos de introdução ao desenvolvimento de aplicações para dispositivos móveis vamos falar de escrita e leitura em arquivos texto. Algo primordial já que boa parte das aplicações necessita de persistencia para os dados.
No j2me existem outras formas para a persistencia, como o RMS, plugins como o Floggy ou mesmo XML, é provável que em posts futuros iremos apresentar como trabalhar com RMS, que é o método mais indicado, mas aqui o nosso foco será o bom e velho TXT.

Iniciando...

Vamos aproveitar a aplicação feita no post anterior e adicionar a ela os elementos necessários, que são:
- 1 textBox com três itemCommand, sendo um para salvar, outro para carregar e o ultimo para sair (ligando esse ultimo ao form).
- 1 itemCommand no form que deve ser ligado a nosso textBox

Nosso fluxo agora ficará assim:


Agora os imports utilizados:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

Logo no inicio de nossa classe precisaremos definir o caminho onde nosso arquivo estará, assim como seu nome:

private String diretorio = "fileconn.dir.memorycard";
private String path = System.getProperty(diretorio) + "meuArq.txt";

Agora nossos métodos para salvar e mostrar o conteudo do arquivo:

//
//Salvando o arquivo

private void saveFile(String fileName, String string) {
try {
//se conecta ao arquivo
FileConnection fconn = (FileConnection)Connector.open(fileName, Connector.READ_WRITE);
//se o arquivo não existir então ele é criado
if (!fconn.exists()) {
fconn.create();
}
//implementação da escrita
OutputStream ops = fconn.openOutputStream( Long.MAX_VALUE );
string = string + "\r\n";
ops.write( string.getBytes() );
//grava obrigatoriamente todos os bytes que estiverem no buffer
ops.flush();
ops.close();
fconn.close();
}
catch (IOException ioe) {
System.out.println("IOException: "+ioe.getMessage());
}
catch (SecurityException se) {
System.out.println("Exceção de segurança:" + se.getMessage());
}
}

//
//Carregando o arquivo

public void showFile(String fileName) {
try {
//se conecta ao arquivo
FileConnection fc = (FileConnection)
Connector.open( fileName );
//se não existir ocorre a exceção
if(!fc.exists()) {
throw new IOException("Arquivo não existe");
}
//implementação da leitura
InputStream is = fc.openInputStream();
byte b[] = new byte[is.read()];
is.read(b);
//o textBox recebe o conteúdo do arquivo texto
textBox.setString( new String(b, 0, b.length) );
is.close();
fc.close();
}
catch (IOException ioe) {
System.out.println("IOException: " + ioe.getMessage());
}
catch (SecurityException se) {
System.out.println("Exceção de segurança:" + se.getMessage());
}

}

Agora é só ir até commandAction for Displayables e adicionar:
//para nosso itemCommand5
saveFile(path, textBox.getString());
//para nosso itemCommand7
showFile(path);

Finalizando

Seria interessante que as classes OutputStream e IntputStream fossem verificadas afim de um melhor conhecimento.
A maneira de envio e recebimento de arquivos seja por meio de uma porta de comunicação como o infravermelho, ou por http é muito semelhante ao que acabamos de ver, salvo suas caracteristicas especificas, por isso é interessante estudar esse pequeno exemplo já que provavelmente essa idéia ainda será utilizada.
Em artigos futuros, demonstraremos como receber e enviar arquivos pela web, e como trabalhar com o RMS para persistência de dados.