meleu dicas

Inicialmente este blog foi criado para armazenar algumas dicas e links de UNIX/Linux, OpenVMS, linguagem C, Assembly, TCP/IP e nerdezas afins. No entanto devido ao autor ter abandonado o seu plano de ser um super hacker e dominar o mundo (devido esposa, família, filhos, trabalho), a partir de 2012 este blog tem um tipo de nerdeza mais light (Android, Linux, RetroPie (retrogames), produtividade, e por aí vai). Estas dicas raramente serão criações minhas.

segunda-feira, 20 de junho de 2016

este blog tem uma nova casa

Estou migrando para o github. Agora este blog está em http://meleu.github.io/blog/.

sexta-feira, 6 de maio de 2016

fazer o find parar depois do primeiro match

Estava fazendo um script para abrir um determinado arquivo baseado no que era encontrado através de um find. O problema é que as vezes o find encontrava mais de um arquivo que atendia o critério de busca, e eu gostaria de parar no primeiro arquivo encontrado. Uma rápida googlada e a solução apareceu...

Fazer o comando find parar após o primeiro arquivo encontrado:

find caminho/do/diretorio -name nome-do-arquivo -print -quit
Simples assim!

Aritmética de datas em shell scripts

Estava eu felizinho e tranquilo fazendo um scriptzinho aqui para me ajudar em algumas coisas do trabalho, quando esbarrei no problema da aritmética de datas.

O caso é o seguinte: tenho um arquivo (planilha excel) onde todos os dias preencho várias informações, e às 17h eu tenho que fechar este arquivo e abrir um novo que se encerrará às 17h do dia seguinte. O meu objetivo era fazer um script onde eu pudesse passar uma data na linha de comando e ele já abrisse diretamente o arquivo referente a esta data. Útil para consultar os arquivos de dias anteriores.

O problema que encontrei foi que o nome dos arquivos contem a data de fechamento daquele arquivo e a data anterior, exemplo: "Dados 01-05-2016 a 02-05-2016.xls". Isso é um problema pois não é uma matemática tão simples fazer o script saber qual é o dia anterior de uma determinada data. Alguns meses tem 28, 29, 30 ou 31 dias...

Numa rápida googlada achei uma solução simples, bonita e elegante:

date -d "2016-05-01 - 1 day"

Para obter a data no formato desejado basta usar o caractere de formatação '%', de acordo com o que é mostrado na manpage. No meu caso fica assim:

date -d "2016-05-01 - 1 day" +%d-%m-%Y

(OBS.: pelo que andei lendo esse recurso de aritmética de datas é uma feature do GNU date. Portanto funcionará em qualquer distro Linux moderna, porém não funciona no date do BSD, que é o utilizado nos SOs da Apple.)

quinta-feira, 9 de julho de 2015

RetroPie 3.0: usando fba-libretro no lugar do PiFBA

OBSERVAÇÕES:
1. Esta dica só vale a pena se for no Raspberry Pi 2, pois o desempenho do fba-libretro no Raspberry Pi B+ é sofrível. Impossível de ter algum prazer jogando.
2. Eu só encontrei utilidade em trocar o PiFBA pelo fba-libretro, pois este roda Street Fighter 3. Do contrário eu permaneceria no PiFBA tranquilamente. Aliás, no meu Rasp antigo eu permaneço com o PiFBA felizão (rodando Street Fighter Alpha 3 suave, por exemplo).

De acordo com o wiki oficial do RetroPie, o PiFBA é baseado no MAME 0.114 (Abril de 2007), enquanto o fba-libretro é baseado no MAME 0.154 (Julho de 2014). E por conta disso a quantidade de ROMs suportadas é maior no fba-libretro.

Para trocar é extremamente simples. Basta editar o arquivo "/opt/retropie/configs/fba/emulators.cfg". Vamos dar uma olhada nele:

pifba="/opt/retropie/emulators/pifba/fba2x %ROM%"
default="pifba"
lr-fba="/opt/retropie/emulators/retroarch/bin/retroarch -L /opt/retropie/libretrocores/lr-fba/fb_alpha_libretro.so --config /opt/retropie/configs/fba/retroarch.cfg %ROM%"
Como você já deve ter deduzido, para trocar basta trocar o default="pifba" por default="lr-fba".

Lembrando que será necessário configurar os botões [veja o UPDATE no final do post]. Mas como estaremos no libretro, basta usar as ferramentas do retroarch (o arquivo de configuração específico do sistema fica em /opt/retropie/configs/fba/retroarch.cfg). Infelizmente a explicação de como utilizar estas ferramentas não está no escopo deste post.

Se você seguiu a minha dica do post anterior, fique tranquilo que a configuração dos botões para jogos NeoGeo vai continuar funcionando, pois o pifba continuará sendo utilizado para emular NeoGeo.

[UPDATE 10/07/2015]
Segue a configuração de botões otimizada para jogos CAPCOM (nos jogos de NeoGeo vamos continuar usando o PiFBA):
/opt/retropie/configs/fba/retroarch.cfg

#include "/opt/retropie/configs/all/retroarch.cfg"
# All settings made here will override the global settings for the current emulator core
input_remapping_directory = /opt/retropie/configs/fba/

### meleu: o botão de hotkey é o select, e isso acaba atrapalhando na hora
###        de colocar fichas. Portanto vou mudar o hotkey para L1 e sair do
###        emulador com L1+L2
input_enable_hotkey_btn = 6
input_exit_emulator_btn = 4

### configuracao dos botoes otimizada para jogos de luta CAPCOM
input_player1_b_btn = 2
input_player1_a_btn = 5
input_player1_x_btn = 7
input_player1_y_btn = 3
input_player1_l_btn = 0
input_player1_r_btn = 1

input_player2_b_btn = 2
input_player2_a_btn = 5
input_player2_x_btn = 7
input_player2_y_btn = 3
input_player2_l_btn = 0
input_player2_r_btn = 1

segunda-feira, 6 de julho de 2015

RetroPie 3.0: configuração de controles distintas para jogos de luta SNK e CAPCOM

Pra quem não sabe o que é RetroPie e nem Raspberry Pi, eu recomendo uma visita nos seguintes links:
http://blog.petrockblock.com/retropie/
https://www.raspberrypi.org/

OBSERVAÇÃO:
Como o RetroPie é um projeto relativamente novo, algumas coisas estão mudando assim que novas versões são lançadas, como por exemplo arquivos de configuração e os seus respectivos diretórios. Então é bom frisar que o esquema explicado aqui foi realizado no RetroPie 3.0 beta 4 (também testei no 2.6, mas alguns diretórios são diferentes).

PROBLEMA

No RetroPie o emulador utilizado para a maioria dos jogos de luta de arcade é FinalBurn Alpha (ou fba, ou ainda pifba, como a versão para Raspberry Pi é chamada). Só que diferentemente do MAME, o FBA não tem como configurar os controles individualmente por jogo. E aí que começa o meu problema. Pois eu costumo jogar num controle de PlayStation2, utilizando o seguinte esquema:

quadrado: soco fraco
triângulo: soco forte
xis: chute fraco
bola: chute forte
R1: soco médio [CAPCOM]
R2: chute médio [CAPCOM]

O problema é que nos games CAPCOM temos o soco/chute médio, e nos games SNK não temos. Aí a configuração que eu considero ideal para um já não fica legal no outro. Pois aqui vou descrever como contornar este problema.

SOLUÇÃO

passo 1

  • Colocar as roms dos jogos SNK no diretório "/home/pi/RetroPie/roms/neogeo". No meu caso foram as várias edições de Art of Fighting, Samurai Shodown, Metal Slug, Fatal Fury e King of Fighters. O sistema vai continuar executando o pifba para jogar estas roms, mas fazendo desta forma o emulationstation vai ficar mais organizadinho.
  • Colocar as roms CAPCOM no diretório "/home/pi/RetroPie/roms/fba". No meu caso foram os Street Fighter da vida, Marvel vs Capcom, X-Men vs Street Fighter (infelizmente não rodou Street Fighter 3).

passo 2

Criar dois arquivos de configuração distintos para SNK e CAPCOM.

Um vai se chamar "/opt/retropie/configs/fba/fba2x.cfg-neogeo":


### meleu: ARQUIVO DE CONFIGURACAO DOS BOTOES PARA JOGAR JOGOS DA SNK ###
#########################################################################
[Keyboard]
# Get codes from /usr/include/SDL/SDL_keysym.h
A_1=306
B_1=32
X_1=308
Y_1=304
L_1=122
R_1=120
START_1=13
SELECT_1=9
LEFT_1=276
RIGHT_1=275
UP_1=273
DOWN_1=274
QUIT=27
#player 2 keyboard controls, disabled by default
A_2=999
B_2=999
X_2=999
Y_2=999
L_2=999
R_2=999
START_2=999
SELECT_2=999
LEFT_2=999
RIGHT_2=999
UP_2=999
DOWN_2=999

[Joystick]
# Get codes from "jstest /dev/input/js0"
# from package "joystick"
# quadrado = soco fraco
A_1=3
# triangulo = soco forte
B_1=0
# xis = chute fraco
X_1=2
# bolinha = chute forte
Y_1=1
L_1=7
R_1=5
START_1=9
SELECT_1=8
#Joystick axis
JA_LR=0
JA_UD=1
#player 2 button configuration
A_2=3
B_2=0
X_2=2
Y_2=1
L_2=7
R_2=5
START_2=9
SELECT_2=8
#Joystick axis
JA_LR_2=0
JA_UD_2=1

[Graphics]
DisplaySmoothStretch=1
# Display Effect: 0 none, 1 scanlines
DisplayEffect=0
DisplayBorder=0
MaintainAspectRatio=1

[Sound]

### FINAL DO ARQUIVO ###


O outro arquivo vai se chamar  "/opt/retropie/configs/fba/fba2x.cfg-capcom":

### meleu: ARQUIVO DE CONFIGURACAO DOS BOTOES PARA JOGAR JOGOS DA CAPCOM ###
############################################################################
[Keyboard]
# Get codes from /usr/include/SDL/SDL_keysym.h
A_1=306
B_1=32
X_1=308
Y_1=304
L_1=122
R_1=120
START_1=13
SELECT_1=9
LEFT_1=276
RIGHT_1=275
UP_1=273
DOWN_1=274
QUIT=27
#player 2 keyboard controls, disabled by default
A_2=999
B_2=999
X_2=999
Y_2=999
L_2=999
R_2=999
START_2=999
SELECT_2=999
LEFT_2=999
RIGHT_2=999
UP_2=999
DOWN_2=999

[Joystick]
# Get codes from "jstest /dev/input/js0"
# from package "joystick"
### meleu: lembrando que eu costumo utilizar um controle de ps2
# A = soco fraco = quadrado
A_1=3
# B = soco forte = triangulo
B_1=0
# X = soco medio = R1
X_1=7

# Y = chute fraco = xis
Y_1=2
# L = chute médio = R2
L_1=5
# R = chute forte = bola
R_1=1

START_1=9
SELECT_1=8
#Joystick axis
JA_LR=0
JA_UD=1
#player 2 button configuration
A_2=3
B_2=0
X_2=7
Y_2=2
L_2=5
R_2=1
START_2=9
SELECT_2=8
#Joystick axis
JA_LR_2=0
JA_UD_2=1

[Graphics]
DisplaySmoothStretch=1
# Display Effect: 0 none, 1 scanlines
DisplayEffect=0
DisplayBorder=0
MaintainAspectRatio=1

[Sound]
### FINAL DO ARQUIVO ###

passo 3

Mudar o dono do arquivo "/opt/retropie/configs/fba/fba2x.cfg", executando o seguinte comando:

chown pi.pi /opt/retropie/configs/fba/fba2x.cfg


Isso vai permitir que possamos alterar este arquivo no esquema seguir.

passo 4

Copiar o arquivo "/etc/emulationstation/es_systems.cfg" para seu diretório pessoal, executando o seguinte comando:

cp /etc/emulationstation/es_systems.cfg ~/.emulationstation/es_systems.cfg


passo 5

O es_systems.cfg é um arquivo XML relativamente fácil de entender. Primeiro vamos procurar pela entrada referente ao neogeo. Estará algo assim:
...
  <system>
    <name>neogeo</name>
    <fullname>Neo Geo</fullname>
    <path>~/RetroPie/roms/neogeo</path>
    <extension>.zip .fba .ZIP .FBA</extension>
    <command>/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ neogeo %ROM%</command>
    <platform>neogeo</platform>
    <theme>neogeo</theme>
  </system>
...

Na linha nós vamos alterar para o seguinte:

<command>(cd /opt/retropie/configs/fba/ && cat fba2x.cfg-neogeo > fba2x.cfg) && /opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ neogeo %ROM%</command>

Em seguida vamos fazer a mesma coisa com a entrada referente ao fba. Ela estará assim:

...
  <system>
    <name>fba</name>
    <fullname>Final Burn Alpha</fullname>
    <path>~/RetroPie/roms/fba</path>
    <extension>.fba .zip .FBA .ZIP</extension>
    <command>/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ fba %ROM%</command>
    <platform>arcade</platform>
    <theme>fba</theme>
  </system>
...


Alterar a linha para o seguinte:

<command>(cd /opt/retropie/configs/fba/ && cat fba2x.cfg-capcom > fba2x.cfg) && /opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ fba %ROM%</command>

passo 6 [OPCIONAL]

Aproveite para eliminar do emulationstation os sistemas que você não usa (por exemplo amiga, macintosh, apple II, ScummVM, etc) basta comentar a entrada referente a estes sistemas usando <!-- e -->, como no exemplo abaixo

...
<!-- ## SISTEMAS QUE NÃO QUERO QUE APAREÇA ##
     ########################################
  <system>
    <name>amiga</name>
    <fullname>Amiga</fullname>
    <path>~/RetroPie/roms/amiga</path>
    <extension>.sh .SH</extension>
    <command>/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ amiga %ROM%</command>
    <platform>amiga</platform>
    <theme>amiga</theme>
  </system>
-->
...

finalizando

Reiniciar o emulationstation e pronto!

tags