quinta-feira, 14 de novembro de 2019

Criando DataSource no Tomcat 7 e usando com persistence.xml e/ou hibernate.cfg.xml

     Quando criamos uma aplicação, é comum termos ambientes diferentes e/ou clientes diferentes, e isso nos traz a necessidade de fazer a nossa aplicação se conectar com bases de dados diferentes para cada ambiente/cliente. Para resolver isso de forma elegante, tiramos a responsabilidade de conhecer a URL, Usuário e Senha do Banco da aplicação e passamos para o servidor. Nesse post mostro como montar o DataSource no Tomcat. (Foi feito no Tomcat 7 que é o que uso no trabalho).


1 - Copiar as libs referentes ao Driver JDBC e c3p0 para o TomCat



Ex:

- Driver JDBC

postgresql-8.4-702.jdbc3.jar



-Lib c3p0

c3p0-0.9.1.jar



- Dependências da lib c3p0

antlr-2.7.6.jar

commons-collections-3.2.jar

dom4j-1.6.1.jar

jta-1.0.1B.jar



2 - Adicione o seguinte trecho ao arquivo web.xml (Note que o <res-ref-name> contém o mesmo nome que vamos dar a configuração do DataSource no Tomcat)



<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/nome_datasource</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>



Para quem usa hibernate.cfg.xml



3 - No hibernate.cfg.xml remova as informações de conexão (url, usuário e senha) e de pool, e acrescente apenas a seguinte linha:



<property name="hibernate.connection.datasource">java:/comp/env/jdbc/nome_datasource</property>



Para quem usa JPA



4 - No persistence.xml remova as informações de conexão (url, usuário e senha) e de pool, e acrescente apenas a seguinte linha:



<non-jta-data-source>java:comp/env/jdbc/nome_datasource</non-jta-data-source>



5 - Configurar o context.xml (apache-tomcat-7.0.96/conf/context.xml) do Tomcat adicionando o trecho de código abaixo



(Alterando endereço, senha e usuário do banco de acordo com o ambiente/cliente que o Tomcat está alocado)



<Resource name="jdbc/nome_datasource" auth="Container"

factory="org.apache.naming.factory.BeanFactory"

type="com.mchange.v2.c3p0.ComboPooledDataSource"

driverClass="org.postgresql.Driver"

jdbcUrl="jdbc:postgresql://x.x.x.x:5432/nome_banco"

user="usuario_bd"

password="senha_bd"

minPoolSize="10"

maxPoolSize="160" />







Fonte:



Trabalhando com Datas no PostgrSQL

Operações com datas:
timestamp '2001-09-28 01:00' + interval '23 hours' -> timestamp '2001-09-29 00:00'
date '2001-09-28' + interval '1 hour' -> timestamp '2001-09-28 01:00'
date '01/01/2006' – date '31/01/2006'
time '01:00' + interval '3 hours'time -> '04:00'
interval '2 hours' - time '05:00' -> time '03:00:00'

Função age (retorna Interval) - Diferença entre datas
age(timestamp)interval (Subtrai de hoje)
age(timestamp '1957-06-13') -> 43 years 8 mons 3 days
age(timestamp, timestamp)interval Subtrai os argumentos
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 mons 27 days

Função extract (retorna double) Extrai parte da data: ano, mês, dia, hora, minuto, segundo.
select extract(year from age('2001-04-10', timestamp '1957-06-13'))
select extract(month from age('2001-04-10', timestamp '1957-06-13'))
select extract(day from age('2001-04-10', timestamp '1957-06-13'))

Data e Hora atuais (retornam data ou hora)
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_TIME(0);
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP(0);

Somar dias e horas a uma data:
SELECT CAST('06/04/2006' AS DATE) + INTERVAL '27 DAYS' AS Data;

Função now (retorna timestamp with zone)
now() - Data e hora corrente (timestamp with zone);
Não usar em campos somente timestamp.

Função date_part (retorna double)
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Resultado: 16 (day é uma string, diferente de extract)

Obtendo o dia da data atual:
SELECT DATE_PART('DAY', CURRENT_TIMESTAMP) AS dia;

Obtendo o mês da data atual:
SELECT DATE_PART('MONTH', CURRENT_TIMESTAMP) AS mes;

Obtendo o ano da data atual:
SELECT DATE_PART('YEAR', CURRENT_TIMESTAMP) AS ano;

Função date_trunc (retorna timestamp)
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Retorna 2001-02-16 00:00:00

Convertendo (CAST)
select to_date('1983-07-18', 'YYYY-MM-DD')
select to_date('19830718', 'YYYYMMDD')

Função timeofday (retorna texto)
select timeofday() -> Fri Feb 24 10:07:32.000126 2006 BRT

Interval
interval [ (p) ]
to_char(interval '15h 2m 12s', 'HH24:MI:SS')
date '2001-09-28' + interval '1 hour'
interval '1 day' + interval '1 hour'
interval '1 day' - interval '1 hour'
900 * interval '1 second'
Interval trabalha com as unidades: second, minute, hour, day, week, month, year, decade, century, millenium ou abreviaturas ou plurais destas unidades.
Se informado sem unidades '13 10:38:14' será devidamente interpretado '13 days 10 hours 38 minutes 14 seconds'.

CURRENTE_DATE - INTERVAL '1' day;
TO_TIMESTAMP('2006-01-05 17:56:03', 'YYYY-MM-DD HH24:MI:SS')


Fonte:
https://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Internas/Data_e_Hora

sábado, 2 de novembro de 2019

SED (Stream EDitor)

O SED é um editor de texto para usarmos em scripts de configuração para automatizarmos algumas tarefas.
Esse artigo não é de minha autoria e o link do conteúdo original está no final.
1 - Troca todas as palavras em um arquivo por outra

sed -i 's/palavra/outra/' arquivo.txt

2 - Imprime só a nona linha

sed -n '9p' arquivo.txt

3 - Imprime da sexta linha até a nona linha

sed -n '6,9p' arquivo.txt

4 - Deleta todas as linhas que contém a palavra desejada no arquivo

sed -i '/palavra_desejada/d' arquivo.txt

5 - Coloca uma palavra no INÍCIO de cada linha

sed 's/^/palavra/' arquivo.txt

6 - Coloca uma palavra no final de cada linha

sed 's/$/palavra/' arquivo.txt

7 - Imprime só as linhas que COMEÇAM com a string ‘http’

sed -n '/^http/p' arquivo.txt

8 - Deleta só as linhas que COMEÇAM com a string ‘http’

sed -n '/^http/d' arquivo.txt

9 - Troca TODAS ocorrências da palavra “marcos”, “eric”, “camila” pela palavra “pinguim”

sed 's/marcos\|eric\|camila/pinguim/g' arquivo.txt

10 - Troca tudo que estiver ENTRE as palavras “Marcos” e “Eric” pela palavra “eles”, exemplo, o texto é:

“No sábado Marcos saiu de pra brincar de bicicleta com o Eric, mas não ficaram até tarde.” e ficará assim: “No sábado eles, mas não ficaram até tarde.”

sed 's/Marcos.*Eric/eles/' arquivo.txt

11 - Deleta linha em branco e altera o arquivo

sed -i '/^$/d' arquivo.txt

12 - Substitui “foo” por “bar” somente as linhas que contém “plop”

sed '/plop/ s/foo/bar/g' arquivo.txt

13 - Substitui “foo” por “bar” exceto as linhas que contém “plop”

sed '/plop/! s/foo/bar/g' arquivo.txt

14 - Insere da Linha 2 a linha 7 o “#” no início de cada linha

sed '2,7s/^/#/' arquivo.txt

15 - Insere a palavra ‘NEW’ no início de cada linha, da linha 21 até a linha 28:

sed -i '21,28s/^/NEW/' arquivo.txt

16 - Troca tudo entre as tags “<” e “>” pela palavra “CODIGO”:

sed 's/<[^>]*>/CODIGO/g' arquivo.txt

17 - Imprime somente a primeira ocorrência da linha com determinada palavra:

sed -n '/dia/{p;q;}' arquivo.txt

18 - Inclue texto no final da linha 9:

sed '9s/$/final da linha/' arquivo.txt

19 - Coloca todas as linhas em uma só:

sed ':a;$!N;s/\n//;ta;' arquivo.txt

20 - Substitui a palavra “BELEZA” por “SIM” somente entre determinadas linhas:

sed '3,6s/BELEZA/SIM/' arquivo.txt

21 - Apaga o que está entre a palavra “falou” e “segundo” ( delimitadores )

sed '/segundo/{/falou/{s/segundo.*falou//;t};:a;/falou/!{N;s/\n//;ta;};s/segundo.*falou/\n/;}' arquivo.txt

22 - Retira comandos HTML (tudo entre < e > )

sed 's/<[^>]*>//g' arquivo.txt

23 - Apaga o 1° caracter da frase

sed 's/.//' arquivo.txt

24 - Apaga o 4° caractere da frase

sed 's/.//4' arquivo.txt

25 - Apaga os 4 primeiros caracteres

sed 's/.\{4\}//' arquivo.txt

26 - Apaga no mínimo 4 caracteres

sed 's/.\{4,\}//' arquivo.txt

27 - Apaga de 2 a 4 caracteres (o máx. que tiver)

sed 's/.\{2,4\}//' arquivo.txt

28 - Exemplos de intervalo

echo "aáeéiíoóuú" | sed "s/[a-u]//g"

saída: áéíóú

echo "aáeéiíoóuú" | sed "s/[á-ú]//g"

saída: aeiou

29 - Transforma texto (URL) em tags HTML de links.

Era : http://www.com

Fica: <a href=”http://www.com”>http://www.com</a>

sed 's_\<\(ht\|f\)tp://[^ ]*_<a href="&">&</a>_' arquivo.txt



O link abaixo ainda traz o uso de REGEX:

https://terminalroot.com.br/2015/07/30-exemplos-do-comando-sed-com-regex.html

segunda-feira, 28 de outubro de 2019

Gerenciador de pacotes do .Net


Assim como temos o Maven para Java e NPM para JavaScript, também temos um Gerenciador de pacotes para a plataforma .Net, que é o NuGet(https://www.nuget.org/).

É possível hospedar seu próprio servidor NuGet internamente na empresa. A Microsoft disponibilizou uma documentação para isto.

https://docs.microsoft.com/pt-br/nuget/hosting-packages/nuget-server

Após você ou outra pessoa configurar um NuGet interno na empresa, basta configurar o Visual Studio para buscar pacotes neste novo servidor, através do menu Ferramentas > Gerenciador de pacotes NuGet > Configurações de Gerenciador de Pacotes e alterando o item Fonte de pacotes (Package Sources) com o endereço do novo serviço.

.NET para Java Developers


O .NET é uma plataforma como a plataforma Java que roda sobre diferentes Sistemas Operacionais, ou seja, é um ambiente de desenvolvimento e execução de programas multilinguagem e multiplataforma que visa facilitar o desenvolvimento e execução de programas, disponibilizando bibliotecas, compilador, máquina virtual, controle de memória, e outras coisas mais.

Por ser da Microsoft ela começou focada apenas no ambiente Windows com o .NET Framework, mas desenvolveu o .NET Core que é multiplataforma como o Java, desde que o S.O. destino tenha implementado as especificações para rodar o .NET Core.

1 - Plataforma .Net Framework (Ambiente de execução para Windows)

O .NET Framework é usado para construir aplicações desktop e/ou aplicações ASP.NET rodando no IIS (Internet Information Server). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Biblioteca .Net Framework - Biblioteca de classes
- Aplicação .NETProgramas que fazemos (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: VB, ASP, ASP.net, C#, etc.

2 - Plataforma .NET Core

O .NET Core é uma implementação grátis, de código aberto, cross-platform do .NET Framework. Ele suporta quatro tipos de aplicações: console, ASP.NET Core, cloud, e Universal Windows Platform (UWP). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Bilbioteca .Net Core - Biblioteca de classes
- Aplicação .NET - Programas que fazemos  (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: C#, Visual Basic, F#, etc...

3 - .NET Standard

O .NET Standard é uma especificação para implementar a BCL(Base Class Libraries - uma coleção de Bibliotecas de Classe).

Uma vez que uma implementação .NET (Framework ou Core) precisa seguir esse padrão, desenvolvedores de aplicações não terão que se preocupar com diferentes versões do BCL pra cada implementação de framework de código gerenciado.

Resumindo, o .NET Standard funciona como as especificações Java.

OBS: O .NET Framework implementa o .NET Standard mas tem coisas a mais específicas para o Windows, já que o Standard visa justamente a questão da multiplataforma.

4 - Tipo de dados principais:

byte [0-255]
short, int, long
float, double, decimal
bool
string (com 'S' minúsculo)
String (deve importar o namespace System)
object (com O minúsculo)
enum

5 - Cast com C#

Cliente outroCliente = (Cliente) obj; //tradicional como no Java
Cliente outroCliente = obj as Cliente; //Testa se é do mesmo tipo, se não setta nulo, evitando a exceção de tipo imcompatível

6 - Concatenando Strings no C# com propriedades

string a = "Número " + Numero + ", Agência " + Agencia + ", Saldo " + Saldo;
string b = $"Número {Numero}, Agência {Agencia}, Saldo {Saldo}";
string c = @"Texto de várias linhas sem precisar ficar concatenando com ‘+’ ";

7 - Modificadores de Acesso

public = Pode se acessado por todo mundo
private = Apenas acesso interno
protected = Apenas acesso interno e por classes filhas
internal = Deixa a visibilidade apenas para o projeto ao qual pertence (padrão para classes no C#)
internal protected = Modificador formado por duas palavras e que une a funcionalidade do protected e internal

8 - Campos de uma classe

Campos de classes no C# são equivalentes as propriedades de uma classe no Java, a partir deles podemos construir as Propriedades no C#, conceito explicado pouco mais a frente.

Uma coisa interessante sobre os campos é que podemos usar a palavra reservada "readOnly" para definir um campo que pode ter seu valor setado apenas no construtor, e que não pode mais ser alterado depois, mesmo dentro da própria classe!

9 - Properties (Propriedades) no C#

Em Java, propriedades são os campos de uma classe, podendo ser de tipo primitivo ou objetos, geralmente privados com acesso via getters e setters.

Em C#, Propriedades são um conceito um pouco diferente, como se juntassem em uma única coisa as propriedades do Java (campos da classe) e seus métodos getter's e setter's. As Properties (Propriedades) começam com letra maiúscula. Sua declaração na versão simplificada é:

public double Altura {get; set;}

Isso serve para tipos primitivos, objetos, listas etc...

public Pessoa Funcionario {get; set;}

public List<Card> MeuCard {get; set;}

public int Abc {get; private set;}

No C#, o método set por padrão recebe uma variável de nome "value", portanto, para os casos em que se deseja fazer uma validação ou outra coisa no método set, usa-se o value.

OBS: Quando não escrevemos o método setter de uma Propriedade, o compilador cria um campo privado e "readOnly" e apenas o getter do campo.

10 - Herança no C#

Para dizer que uma classe implementa uma interface ou estende uma classe em C# basta colocar ":" entre o nome da classe atual e a classe que ela estende e/ou lista de interfaces separadas por virgula.

Não há diferença a declaração de implementar e estender em C#. Porém, a classe estendida deve vir primeiro que as interfaces.

Exemplo, temos o seguinte:
Classe B, Interface C, D e E. A classe A estende B e implementa C,D e E:

public class A : B, C, D, E {
    ...
}

A classe filha pode fazer referência aos membros da classe pai com uso palavra reservada "base", que seria o mesmo que "super" em Java.

11 - Sobrescrita de métodos (Polimorfismo):

Na classe pai é preciso usar a palavra "virtual" depois do modificador de acesso:

public virtual double GetBonificacao()
{
   return Salario * 0.10;
}

Na classe filha é preciso usar a palavra "override" depois do modificador de acesso:

public override double GetBonificacao()
{
   return Salario + base.GetBonificacao();;
}

OBS: As propriedades no C# (Lembrando que o conceito de propriedades no C# é diferente do Java) também podem fazer uso de "virtual" e "override" para sobrescrita, já que elas contém os métodos getter's e setter's e é possível que seja necessário a sobrescrita de um desses ou até dos dois.

12 - Construtores

Construtores da classe filha chamando construtores da classe pai é bem diferente no C#.

Pai:
public Funcionario(string cpf)
{
    CPF = cpf;
}

Filha:
public Diretor(string cpf) : base(cpf)
{
}

Também é diferente a chamada de construtores da mesma classe. Um construtor pode chamar outro construtor da própria classe com o uso da palavra reservada "this":

public Funcionario(string cpf) : this(1500, cpf) // chama o construtor abaixo!
{
}

public Funcionario(double salario, string cpf)
{
    Salario = salario;
    CPF = cpf;
}

13 - Foreach

No C# o foreach é diferente do Java:

ContaCorrente[] itens = new ContaCorrente[10];
foreach(ContaCorrente conta in items)
{
...
}

14 - Trabalhando com Datas

DateTime dataFimPagamento = new DateTime(2019, 10, 21);
DateTime dataAtual = DateTime.Now;

TimeSpan diferencaEntreDatas = dataFimPagamento - dataAtual;

Console.WriteLine("Diferença em dias: " + diferencaEntreDatas.Days);

OBS: Existe uma biblioteca chamada "Humanizer" que vem com vários métodos para trabalhar com TimeSpan e exibir intervalos de datas de forma amigável para o usuário final.

15 - Comentários

Comentários de documentação (equivalente ao javadoc)

Além de escrever os comentários, precisa-se configurar o build para gerar o xml dos comentários quando compilar o código. Vamos ver o comentário de documentação:


/// <summary>
/// Verifica a senha fornecida.
/// </summary>
/// <param name="senhaUsuario">Recebe a senha salva no parâmetro <paramref name="senhaUsuario"/>.</param>
/// <param name="senhaTentativa">Recebe a senha fornecida no parâmetro <paramref name="senhaTentativa"/>.</param>
/// <returns>bool</returns>
public bool CompararSenha(string senhaUsuario, string senhaTentativa)
{
   return senhaUsuario == senhaTentativa;
}

Demais comentários são como o Java.

       Essas são as diferenças básicas entre o C# e o Java, porém a medida que se aprofunda no uso do C# com certeza existirão outras diferenças entre as linguagens. O objetivo aqui é fazer um resumo para quem precisa começar com o C#.

quarta-feira, 23 de outubro de 2019

Configurando o Maven no Windows

      Para instalar o Maven faça o download do binário do Maven e extraia na pasta "C:". Segue o link:

https://maven.apache.org/download.cgi

       Configure a variável de ambiente JAVA_HOME antes de configurar o Maven (caso já não esteja configurada) conforme os passos abaixo:

1 - Clique com o botão direito em "Meu computador" e selecione "Propriedades";

2 - Clique em "Configurações Avançadas do Sistema";

3 - Clique em "Variáveis de Ambiente";

4 - Em "Variáveis do sistema", clique em Novo;

5 - No campo "Nome da Variável" insira: "JAVA_HOME";

6 - No campo "Valor da Variável", insira o caminho da instalação do JDK na sua máquina;

7 - Clique em OK na primeira janela e Aplicar na janela de propriedades.

       Com a variável de ambiente JAVA_HOME configurada, vamos configurar o Maven. Para isso vamos repetir os passos do 1 ao 4 (Caso ainda esteja na janela de "Propriedades do Sistema", pule para o passo 3):

1 - Clique com o botão direito em "Meu computador" e selecione "Propriedades";

2 - Clique em "Configurações Avançadas do Sistema";

3 - Clique em "Variáveis de Ambiente";

4 - Em "Variáveis do sistema", clique em Novo;
5 - No campo "Nome da Variável" insira: "M2_HOME";

6 - No campo "Valor da Variável", insira o caminho da instalação do Maven na sua máquina;

      Se extraiu a pasta no "C:" o caminho deve ser parecido com "C:\apache-maven-3.6.2";

7 - Ainda na tela de "Propriedades do Sistema" e em "Variáveis de Ambiente", procure a variável com o nome "Path",
selecione e clique em "Editar";

8 - Clique em "Novo" na janela que abriu e coloque o caminho novamente, desta vez incluindo a pasta "bin":
Se extraiu a pasta no "C:" o caminho deve ser parecido com"C:\apache-maven-3.6.2\bin"

9 - Clique em OK nas janelas abertas e reabra o "CMD" caso esteja aberto, após reabrir digite "mvn --version".

      Pronto!

Liberando processo preso no PostgreSQL

       Nesse post vou tratar sobre como achar e matar determinado processo que pode estar prendendo o Postgres acessando pelo próprio PGAdmin.

       Primeiro selecionamos os processos em execução.

SELECT datname,
pid,
usename,
application_name,
client_addr,
client_hostname,
backend_start
FROM pg_stat_activity;

       Agora nós temos um panorama de quem está fazendo o que no banco, e podemos matar os processos por ID:

SELECT pg_terminate_backend( pid );

       Podemos também matar todos os processos menos o atual se este for o caso:

SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid();

       E a partir daí podemos fazer usando outros filtros de acordo com a necessidade ;) .

sábado, 19 de outubro de 2019

Virtualbox com Ubuntu fica com resolução da tela pequena


Recentemente fui usar o Virtualbox para montar uma máquina com o S.O. Ubuntu e me deparei com a seguinte situação, a máquina virtual estava com a tela com a resolução de tela super baixa, e estava “cortando” a imagem do sistema operacional.

Tentei mudar a resolução pela interface gráfica, porém, como mencionei, a tela não estava completa e não conseguia mudar a resolução.

Então foi o jeito descobrir uma forma de fazer via terminal, e vejam só, é bem simples!

Usando o comando “xrandr” é possível ver as resoluções disponíveis e escolher uma para usar, abaixo vou mostrar como.

Digite no terminal o comando:

$ xrandr

          Veja que foram listadas as resoluções disponíveis para o seu sistema, como a seguir:

Screen 0: minimum 1 x 1, current 1920 x 1200, maximum 8192 x 8192
Virtual1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
800x600         60.00 +  60.32
2560x1600     59.99
1920x1440     60.00  
1856x1392     60.00
1792x1344     60.00
1920x1200     59.88*
1600x1200     60.00
1680x1050     59.95
1400x1050     59.98
1280x1024     60.02
1440x900       59.89
1280x960       60.00
1360x768       60.02
1280x800       59.81
1152x864       75.00
1280x768       59.87
1024x768       60.00
640x480         59.94
Virtual2 disconnected (normal left inverted right x axis y axis)
Virtual3 disconnected (normal left inverted right x axis y axis)
Virtual4 disconnected (normal left inverted right x axis y axis)
Virtual5 disconnected (normal left inverted right x axis y axis)
Virtual6 disconnected (normal left inverted right x axis y axis)
Virtual7 disconnected (normal left inverted right x axis y axis)
Virtual8 disconnected (normal left inverted right x axis y axis)

Agora você pode ir testando as resoluções que você acha mais próximo do seu monitor real até encontrar a que melhor se adapte setando a resolução com o comando:

$ xrandr -s 7

Note que 7 é a posição da lista que corresponde a resolução 1680x1050, já que a contagem começa a partir do “0” (zero).

Você também poderia setar direto uma resolução da lista:

$ xrandr -s 1680x1050

          Último detalhe, e mais importante, essa configuração precisa ser setada no arquivo .profile para ser carregada sempre que o sistema iniciar. Coloque na última linha e não apague nada que tem lá! Pronto!

quinta-feira, 17 de outubro de 2019

Resumo sobre o VI - Editor de Texto para linha de comando


Sempre gosto de fazer resumos das coisas para facilitar na hora que é preciso fazer uma busca rápida para lembrar algo. Esse resumo é sobre o VI, editor de texto para linha de comando.

Navegação

Setas - Navegam no arquivo.
"$" - Vai para o final da linha atual.
"0" (zero) - Vai para o ínicio da linha.
Shift + "g" - Vai para a última linha do texto.
"Número da linha" + Shift + "g" - Para ir pra uma linha específica do texto (3 + Shift + "g" => vai para a linha 3).
"/" + "palavra ou frase" + Enter - Faz uma busca no arquivo pelo texto especificado.
"n" - Vai para a próxima ocorrência do texto especificado.
Shift + "n" - Vai para a ocorrência anterior do texto especificado.

Edição de texto

"i" - inclui texto (na posição atual).
"a" - adiciona texto (na posição posterior).
Shift + "a" - adiciona texto (fim da linha).
"Esc" - Sai do modo edição de texto para o modo navegação.

"x" - Remove caracteres (n x remove n caracteres).
"dd" - Remove uma linha (n dd remove n linhas).
"yy" - Copia a linha atual.
"Número de linhas" + "yy" - Copia X linhas a partir da atual.
"p" - Cola o texto no arquivo a partir da posição atual.
"Número de vezes" + "p" - Cola um texto N vezes a partir da posição atual.
":w"- Salva o arquivo.
":q!" - Sai do arquivo sem salvar.
":wq" - Salva e sai do arquivo.