Feeds:
Posts
Comments

I just coded a simple script to help me on my Flask projects. I used to use Flask with Blueprint and jinja, and one thing that is very important is to have a well design structure for your project. Know where to put each file and how things works are important in any project.

Flask manager script create a simple project structure for you putting everything in the right place. If you have a project with many apps running and each one of them with its own template and static files, you must recall it will looking for them in the same template or static file. My script just put everything in the right place, this way you can call in the template file the correct from the correct folder.

You can download for here.

That is the structure it creates for you

format

enjoy it!

Sometimes you need to delete a bunch of files that has a limit number of lines. One option is to see one by one and rm it. But you can make you day more agile using the follow commands together ūüôā

find <directory> -type f -exec sh -c '[ $(wc -l < "$1") -lt 20 ] && rm -- "$1"' inline {} \;

Let’s explain what it does. <directory> is the folder where the files you want to delete are. I set 20 lines as minimum, just change it using your criteria.

find -type f, says that is a file we are looking for. -exec sh says we want to execute some command for each entry we find using find <dir> -type f. In our case ¬†we exec a sh -c. The -c options says to sh<ell> that we will run a inline code without open a file with shell commands. The follows commands into ” says we want to count the number of line in entry file $1 and if it is less than 20 we’ll delete it. inline and {} \; are just some find command conventions.

References:

[1] http://stackoverflow.com/questions/935251/linux-delete-files-that-dont-contain-specific-number-of-lines

Here I’ll show the step by step in ‘How to get away with android’ and play with an amazing thing called SailfishOS :).

Notice: These steps are explained for only Nexus 7, but it’s important to know that for other hardware you just need the correct software which support it.

Step 1: Downloads and settings

Please download every software and save it in a folder

  1. https://dl.twrp.me/grouper/twrp-2.8.7.0-grouper.img¬†. Don’t be afraid, this will provide you with tools for install requested images into your device (Nexus ¬†7).
  2. Install these tools:¬†android-tools-adb android-tools-fastboot . I’m using a Debian/Ubuntu distro, for it was: sudo apt-get install¬†android-tools-adb android-tools-fastboot.
  3. Get cynogemod image compatible with Nexus 7. https://download.cyanogenmod.org/get/jenkins/42501/cm-10.1.3-grouper.zip
  4. Get Sailfish grouper image: http://jolla.toimii.fi/sailfishos/?file=sailfishos-grouper-release-1.0.8.19-alpha1.zip

Step 2: Hands on, adventure time!

Once you have all tools downloaded it’s time to start the adventure and setting images and do the magic.

  1. With your device (Nexus 7) connect through USB cable in your PC. Run
    1. Enable USB debugging option: settings->developer options->USB debugging. See image bellow (I took from another device, but this option it always in the same place)
  2. Now run:
    1. adb devices (it’ll show the number of your device, if everything was right it’ll be there if not, plug your USB cable again and run adb devices.untitled
    2. If ^ previous step was ok, now run: adb reboot bootloader
    3. fastboot devices: it’ll show an output similar to adb devices
    4. fastboot oem unlock: it’ll unlock your device bootloader
    5. fastboot flash recovery twrp-2.8.7.0-grouper.img : will flash the recovery image for future uses.
    6. Reboot and get into in recovery mode. To do this in Nexus 7 we need to hold/press power button and volume down button at the same time.
    7. Select recovery mode in the bootloader screen
      1. First image is the bootloader menu, in order to select recovery mode, image 2, press volume buttons up or down. Once in recovery mode menu press power button to get into in it. Third image shows TWRP recovery image in action.
         

    8. Once in recovery mode use adb push to copy cynogenmod and sailfish image to /sdcard/. Before execute the commands bellow, run a: adb devices to see if your device is there.
      1. adb push cm-10.1.3-grouper.zip
      2. adb push sailfishos-grouper-release-1.0.8.19-alpha1.zip
    9. It’s strongly recommend that you backup everything in your device if you follow with these steps.
    10.  If everything goes right you will see something like that in Install menuimg_20170103_233541
    11. Ignore the trash I have at my device and pay atetion only in the entries about the images we pushed up. cm-10.1.3-grouper.zip and sailfishos-grouper-release-1.0.8.19-alpha1.zip
    12. Select cm-grouper image and install it.
    13. Select sailfishos image and install it
    14. If everything was ok, just reboot your device and enjoy sailfishos ūüôā

 

References:

[1] https://neklaf.wordpress.com/2016/08/11/installing-cyanogenmod-12-1-on-nexus-7-2012-version-a-k-a-grouper/

[2] https://wiki.merproject.org/wiki/Adaptations/libhybris/Install_SailfishOS_for_grouper

 

Sometimes you need to auto things, task, whatever. As an example I have access to a local network but first to get into it I need to reach the external network. What happens is that the PC I access via ssh sometimes changes its IP, since I don’t have any control to put it fixed I¬† need some how to know what is the current IP it has.

So, why not to use crontab in a new way and update my current IP :).

That’s all about the follow bash script

#!/bin/bash

# Gets my current ip and send it over ssh to the server that is also the entry point
# for local network
IP=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`
ssh -p 4422 user_name@server_ip "echo '$IP' > current_ip"

One thing to remember is to use ssh-copy-id, this way you don’t need to type passwd ok ūüėÄ

Now, the magic with crontab can be resumed by:

47 11 * * * bash /path_to_script_above/update_ip.sh

But what does mean those numbers and *?

* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Easy right?
In order to add a new crontab just type: crontab -e, choice your favorite editor and add some line :v

No meu emprego anterior eu tive a oportunidade de ‘brincar’ um pouco com assembly para power 8 e desde ent√£o minha curiosidade e vontade de aprender mais e mais asm tem crescido. Mas quais s√£o as vantagens de se aprender asm? Eu diria que uma delas, a maior delas, √© que quando voc√™ aprende asm voc√™ tamb√©m revisa e aprende um bocado sobre arquitetura de computadores, sen√£o aprende deveria.

Ao programar em asm você lida diretamente com aspectos de como a arquitetura foi desenhada. Em um resumo, em como a cpu é estruturada. E o que isso tem de bom? Bem, o bom de aprender tudo isso é que você se torna um programador mais consciente, eu diria. Além de te dar um background para projetos envolvendo desenvolvimento low level, seja através de embedded systems ou drivers, por exemplo.

Mas bem, deixando de bla bla bla, vou aqui mostrar um exemplo, bem simples, de programação para asm x86_64 onde um código em C faz uso de um função definida em um .s (asm file). Como compilador estou usando o gcc.

#include &amp;lt;inttypes.h&amp;gt;

int64_t soma(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t);

int main(void) {
int c;

c = soma(1,2,4,5,6,7,4,10,6);
return c;
}

No código acima definimos a função soma que recebe 9 parametros e a função main que faz uso dela. Mas, por que nove argumentos?  Acontece que até seis argumentos são naturalmente passados via registradores, em ordem de argumento: rdi, rsi, rdx, rcx, r8, r9. A partir do sétimo os argumentos são passados na stack (na pilha).

A título de exemplo de como codar o .s recebendo os argumentos passados na pilha eu vou exemplificar uma função que somente soma os argumentos passados na pilha.


.global soma

.text

soma:
push &amp;nbsp; &amp;nbsp; %rbp
mov      %rsp, %rbp
mov      0x10(%rbp), %eax
mov      0x18(%rbp), %edx
add      %edx, %eax
mov      0x20(%rbp), %edx
add      %edx, %eax
pop      %rbp
ret

Muito bem, o código acima é o nosso .s para a função soma. Agora vamos entendê-lo.

A linha 1 é basicamente a declaração da função.
A linha 3 determina a seção de código do programa, ou seja, toda vez que você encontrar um .S ou .asm essa seção é onde o código a ser executado começa.

A linha 5 é a nossa função soma. As linhas 6 e 7 são o que nós chamamos de prologo. Em detalhes o que elas fazem é basicamente salvar o stack frame/base pointer (rbp) na pilha e setar a pilha para o registrador do rbp. Assim a gente pode manusear a pilha como quisar, uma vez que o contexto do main vai estar salvo ao ser empilhado. As 8 e 9 pegam os argumentos passados na pilha. Diferente de variáveis locais que são colocados com decremento no rpb, por exemplo -0x8(%rbp), para argumentos nós somamos. O resto é repetição exceto pela linha 13 que retira o contexto salvo anteriormente da pilha.
Mas por que começamos na posíção 0x10 da pilha a pegar os argumentos? A explicação para isso é que na pilha já se encontra o endereço de retorno, na posição 0x0(%rsp)ou 0x0(%rbp), e após o push %rbp, teremos o %rbp na posição 0x8(%rbp). Logo, os demais valores serão acessados após eles, em outras palavras 0x8+8 = 0x10 (16 em decimal), 0x18 (24 decimal) e 0x20 (32 dec).

Para entender um pouco mais, vejamos como os dados s√£o passados via main.

main

Perceba que os primeiros seis argumentos são passados nos registradores de edi até r9d, após isso são passados na pilha.

Lembra que em nosso main temos uma declaração de uma variável local c? Como disse as variáveis locais são armazenadas subindo na pilha, ou seja, subtraindo no %rbp. A linha mov %rax, -0x8(%rbp) salva o valor do registrador rax na posição menos 8 do stack frame, que é a posição do endereço de memória da variável c. Após isso faz uma operação de mover o valor desse endereço para o registrador de retorno rax.

Abaixo, para melhor exemplificar veja a anatomia da stack. Onde EIP é o registrador de retorno, EBP o stack frame salvo na pilha, var são as variáveis logais e param os parametros passados na função.

stack

Source: [4]

Como compilar tudo isso? Simples.:

$ gcc soma.c soma.s && ./a.out

$ echo $?

$ 20

Pra finalizar, queria deixar claro que n√£o sou um programador asm expert, que se algum dos conceitos passados aqui estiverem errados, por favor comenta ai para que eu possa corrigir :).

Referencias:

[1] http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/
[2] http://cs.lmu.edu/~ray/notes/gasexamples/
[3] http://0xax.blogspot.com.br/2014/08/say-hello-to-x64-assembly-part-1.html

[4] http://www.cs.princeton.edu/courses/archive/spr11/cos217/lectures/15AssemblyFunctions.pdf

One day you wake up and start to search articles of pages about a given subject when everything freezes. At this point the only thing you can do is reboot your whole system.

Who is the guilty? If you are using one of these two web browser (Chromium or Chrome) you already have the answer.
Why they eat so many memory is one thing important to know, also how to avoid it or at least try to avoid is the point of this post :).

Reading around the web I found this article [1] which explain why those guys are so hungry for memory. Seems OK the reasons they do that, but how the heck we can avoid our system death?
An important thing to know is that both of them try to use GPU to accelerate the time response a given page is loaded and that is good start point. This strategy, if you type ESC+SHIFT and open the task Manager, ¬†is one of the guilty. But don’t worry, it’s easy to solve this. Just go Settings menu and in search settings type ‘accelerat’. You should see something like that:

chromium_eaters

Now everything you need to do is uncheck this option and voila, at least one of the memory eaters will go way.  The other reasons for this annoying thing to happen, most of the whole time is about bad JavaScript plugins coded that help a lot to crash everything. For this, just try to avoid these pages.

References

[1] http://lifehacker.com/why-chrome-uses-so-much-freaking-ram-1702537477

[2] https://www.quora.com/What-is-the-GPU-process-in-Chromes-task-manager-and-why-does-it-hog-up-so-much-RAM

Regex, perl, sed… in√ļmeras s√£o as ferramentas utilizadas para manusear textos e padr√Ķes. Ach√°-los, substitu√≠-los, etc.

Aqui, vamos para um caso bem simples mais que pode ser bastante comum entre aqueles que precisam manusear arquivos tabulados/com colunas e informa√ß√Ķes.

O Problema: Imagine que você tem dois arquivos, arq1 e arq2. Em arq1 você possui duas colunas, veja abaixo.

arq1

POS NOME
123 ABC
345 DEF
78 EF

arq2

IDX POS FST
21 123 1
23 345 1
23 345 0
23 123 1
34 345 1

Agora, o que voc√™ precisa fazer √© que nas posi√ß√Ķes do arq2 seja acrescentada uma nova coluna com a informa√ß√£o do nome destas posi√ß√Ķes. Como fazer isso? AWK √© a resposta :).


awk 'NR==FNR{a[$1]=$2;next}{$4=a[$2];}1' f1 f2

Explicando o comando…

  • NR==FNR, permite que o AWK percorra cada arquivo por vez/ou melhor um de cada vez.
  • a √© um vetor gerado na hora que o primeiro arquivo √© percorrido. Nesse caso, criamos um vetor associativo, onde a[$1] = $2, l√™-se, a com chave $1 recebe valor $2 do primeiro arquivo. Trocando em mi√ļdos, seria como a[34] = ‘CD’, etc.
  • next permite que ele passe o resto do bloco
  • {$4=a[$2], basicamente diz que a coluna $4, que n√£o existe no arquivo 2, mas ser√° criada, deve ser preenchida com o conte√ļdo do array associativo da coluna 2 do arquivo 2 usando o array associativo criado com arq1. Ou seja, a[123] = AB , e assim por diante.
  • o 1 no }1 , diz ao awk para printar a linha.

Como resultado final, obtém-se:


IDX POS FST NAME
21 123 1 ABC
23 345 1 DEF
23 345 0 DEF
23 123 1 ABC
34 345 1 DEF

:)! Espero que seja √ļtil.