domingo, 2 de junho de 2019

Melhorando a qualidade do som via bluetooth

Fala, pessoas!

Tenho uma caixa de som JBL Go 2 e ao conectar via Bluetooth ao meu notebook o som saía com péssima qualidade, parecendo o som transmitido via ligações telefônicas.

Identificando o problema

Para identificar o problema fui verificar a saída do comando pactl list sources:

Source #18
State: SUSPENDED
Name: bluez_sink.70_99_1C_04_9F_F0.headset_head_unit
Description: JBL GO 2
Driver: module-bluez5-device.c
Sample Specification: s16le 1ch 8000Hz
Channel Map: mono
Owner Module: 37
Mute: no
Volume: mono: 58982 /  90%
balance 0.00
Base Volume: 65536 / 100%
Monitor Source: bluez_sink.70_99_1C_04_9F_F0.headset_head_unit.monitor
Latency: 0 usec, configured 0 usec
Flags: HARDWARE HW_VOLUME_CTRL LATENCY 
Properties:
bluetooth.protocol = "headset_head_unit"
device.intended_roles = "phone"
device.description = "JBL GO 2"
device.string = "70:99:1C:04:9F:F0"
device.api = "bluez"
device.class = "sound"
device.bus = "bluetooth"
device.form_factor = "speaker"
bluez.path = "/org/bluez/hci0/dev_70_99_1C_04_9F_F0"
bluez.class = "0x200414"
bluez.alias = "JBL GO 2"
device.icon_name = "audio-speakers-bluetooth"
Ports:
speaker-output: Speaker (priority: 0)
Active Port: speaker-output
Formats:
pcm

Percebi que não estava sendo utilizado o perfil a2dp_sink, mas o headset_head_unit. O Advanced Audio Distribution Profile (A2DP), segundo o Wikipedia, é um perfil que define o áudio como alta qualidade (estéreo ou mono), e torna possível sua transmissão em tempo real de um dispositivo para o outro, através de uma conexão Bluetooth. Por exemplo, músicas podem ser transferidas de um telefone celular para um fone de ouvido sem fio.

O Hands-Free Profile (HFP) e o Headset Profile (HSP) são bastante parecidos, servindo basicamente para suportar os headsets e fones de ouvido Bluetooth para serem utilizados com telefones celulares.

Para identificar os perfis disponíveis, utilizei o pactl list cards:

Card #9
Name: bluez_card.70_99_1C_04_9F_F0
Driver: module-bluez5-device.c
Owner Module: 38
Properties:
        device.description = "JBL GO 2"
        device.string = "70:99:1C:04:9F:F0"
        device.api = "bluez"
        device.class = "sound"
        device.bus = "bluetooth"
        device.form_factor = "speaker"
        bluez.path = "/org/bluez/hci0/dev_70_99_1C_04_9F_F0"
        bluez.class = "0x200414"
        bluez.alias = "JBL GO 2"
        device.icon_name = "audio-speakers-bluetooth"
Profiles:
        headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
        a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: yes)
        off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
Active Profile: headset_head_unit
Ports:
        speaker-output: Speaker (priority: 0, latency offset: 0 usec)
                Part of profile(s): headset_head_unit, a2dp_sink
        speaker-input: Bluetooth Input (priority: 0, latency offset: 0 usec)
                Part of profile(s): headset_head_unit

Com a lista de perfis disponíveis podemos solucionar o problema.

Solução:

No terminal, executei o comando pactl set-card-profile bluez_card.70_99_1C_04_9F_F0 a2dp_sink

Ao listar os sources novamente com pactl list sources, obtive a seguinte saída:

Source #19
State: SUSPENDED
Name: bluez_sink.70_99_1C_04_9F_F0.a2dp_sink.monitor
Description: Monitor of JBL GO 2
Driver: module-bluez5-device.c
Sample Specification: s16le 2ch 44100Hz
Channel Map: front-left,front-right
Owner Module: 38
Mute: no
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
        balance 0.00
Base Volume: 65536 / 100% / 0.00 dB
Monitor of Sink: bluez_sink.70_99_1C_04_9F_F0.a2dp_sink
Latency: 0 usec, configured 0 usec
Flags: DECIBEL_VOLUME LATENCY 
Properties:
        device.description = "Monitor of JBL GO 2"
        device.class = "monitor"
        device.string = "70:99:1C:04:9F:F0"
        device.api = "bluez"
        device.bus = "bluetooth"
        device.form_factor = "speaker"
        bluez.path = "/org/bluez/hci0/dev_70_99_1C_04_9F_F0"
        bluez.class = "0x200414"
        bluez.alias = "JBL GO 2"
        device.icon_name = "audio-speakers-bluetooth"
Formats:
        pcm

Desta forma consegui fazer com que o áudio da caixa de som bluetooth saísse com a qualidade normal.

Share:

domingo, 26 de maio de 2019

Bug dos ícones persistentes no KDE Plasma

Existe um bug no KDE Plasma (do Arch Linux, não sei se ocorre em outras distros) que faz com que o ícone do Discovery persista nos itens favoritos do Kicker (menu de aplicativos do KDE Plasma). Não importa quantas vezes façamos a sua remoção, ele sempre retorna ao iniciar a sessão.

Para resolver isso (faça por sua conta e risco):

0- Remoção do ícone dos favoritos do Kicker

Remova o ícone do Discovery normalmente, clicando com o botão direito e selecionando Remover dos favoritos.

1- Limpeza de diretório cache

Remova todos os diretórios e arquivos em cache.

rm -rf $HOME/.cache/*

2- Remoção do conteúdo do diretório kactivitymanagerd

Remova os arquivos e sub-diretórios do kactivitymanagerd

rm -rf $HOME/.local/share/kactivitymanagerd/*

3- Reconstrução do cache do KService

Utilize o kbuildsycoca5

kbuildsycoca5 --noincremental

Por fim, reinicie sua sessão desktop.

O problema com os ícones persistentes não irá ocorrer mais.

Share:

Monitorar diretório e converter arquivos automaticamente

Costumo elaborar minhas postagens em markdown e em seguida convertê-las para html.

Para automatizar o processo necessitamos de três ferramentas:

- pandoc

- notify-send

- inotify-tools

Com os pacotes instalados, utilizaremos o seguinte script para Bash:

#!/usr/bin/env bash

WORKDIR=${HOME}/Publicacoes

inotifywait -q -m -e create $WORKDIR | \
    while read i; do
        FILE=$(echo $i | grep .md  | sed 's/^.*CREATE //g')
        cd $WORKDIR

        if pandoc "$FILE" -o "$(echo $FILE | sed 's/\.md/.html/g')" 2> /dev/null ; then
            notify-send -u low "$(printf "Arquivo $FILE convertido para html")"
        fi
    done

Entendendo o comando inotifywait:

-q

Menos verbosidade (menos informações na saída padrão)

-m

Modo monitoramento habilitado (não sai do inotifywait na primeira ocorrência)

-e create:

Monitora os eventos CREATE (criação de arquivos) dentro do diretório informado

Como utilizar o script?

1. Crie um diretório (Ex. Publicacoes) dentro da pasta pessoal de seu usuário:

mkdir $HOME/Publicacoes

2. Salve o script com permissões de execução e configure seu ambiente desktop para iniciá-lo automaticamente

No KDE, basta colocar o script dentro do diretório $HOME/.config/autostart-scripts/.

3. Reinicie a sessão de seu usuário (logoff, login)

Pronto.

Basta copiar os arquivos com a extensão .md para o diretório e os mesmos serão convertidos para .html.

Com o notify-send você receberá notificações no seu ambiente desktop após cada conversão.

Share:

Gerador de número randômico em C++ e Python 3

Realizando mais alguns testes, criei um gerador de números randomicos, no qual o usuário informa um número inteiro e o programa utiliza esse número como escopo para gerar um número randômico.

A saída com o comando time foi conforme pode ser visto abaixo:

Escrito em C++:

$ time ./randomizer_c 1000000

Welcome to random int.
The number you typed as maximum in a range was 1000000

The random number is 2043

real    0m0.006s
user    0m0.006s
sys     0m0.000s

Escrito em Python 3:

$ time python3 -c "import random2 ; a = random2.randint(0,1000000) ; print('O numero sorteado foi {}'.format(a))"

O numero sorteado foi 940853

real    0m0.052s
user    0m0.046s
sys     0m0.007s

O código do “random int” em C++:

#include <iostream> // For cout and cin
#include <cstdlib> // For srand() and rand()
#include <ctime> // For time()
#include <cstring> // For strtol()

// randomizer code as seen on http://www.fredosaurus.com/notes-cpp/misc/random.html

using namespace std;

int number;
int randomizer(int number);

int main(int argc, char*argv[]) {

    char*p;
    int randomized;

    if(!argv[1]) {

        cout << "Welcome to random int.\nTo randomize a number between 1 and 20, type 20, for example." << endl;
        cout << "Please, type an integer number: " << endl;
        cin >> number;
        randomized = randomizer(number);
        cout << "\nThe random number is " << randomized << endl;

    } else {

        int number = strtol(argv[1], &p, 10); // https://stackoverflow.com/questions/9748393/how-can-i-get-argv-as-int/38669018

        cout << "Welcome to random int.\nThe number you typed as maximum in a range was " << argv[1] << endl;
        randomized = randomizer(number);
        cout << "\nThe random number is " << randomized << endl;

    }

    return 0;
}

int randomizer(int number) {

    int random;

    srand(time(0)); // initializa random number generator.
    random = (rand() % number) + 1;

    return random;
}
Share:

terça-feira, 4 de setembro de 2018

Visualizar e alterar o cabeçalho de um arquivo

Olá, mundo.

Alguém já teve o desprazer de fazer o download de uma arquivo PDF e não conseguir exibi-lo no visualizador padrão?

Isso já aconteceu comigo algumas vezes, mas hoje precisei abrir um documento neste formato digital e simplesmente apareceu: NADA. A tela fica toda preta dentro do visualizador de PDF. Utilizo o Zathura, software que lhe permite escolher qual biblioteca será utilizada como backend para visualizar os PDFs (optei pela mais utilizada - poppler) e é altamente customizável através de plugins, entre outros recursos.

Daí veio a idéia de debugar através do terminal. Executei o comando com o nome do arquivo:

zathura arquivo.pdf

Eis que apareceu o erro error: Unknown file type: 'application/octet-stream', o que me permitiu identificar que o cabeçalho do arquivo não estava dentro do padrão PDF.

Com a ferramenta hexdump consegui visualizar os bytes não deveriam preceder o %PDF1.4.

hexdump -C arquivo.pdf | more

00000000  0d 0a 0d 0a 0d 0a 0d 0a  0d 0a 0d 0a 0d 0a 0d 0a  |................|
*
00000030  0d 0a 0d 0a 25 50 44 46  2d 31 2e 34 0a 25 e2 e3  |....%PDF-1.4.%..|
00000040  cf d3 0a 32 20 30 20 6f  62 6a 0a 3c 3c 2f 4c 65  |...2 0 obj.<</Le|
00000050  6e 67 74 68 20 34 38 37  39 2f 46 69 6c 74 65 72  |ngth 4879/Filter|
00000060  2f 46 6c 61 74 65 44 65  63 6f 64 65 3e 3e 73 74  |/FlateDecode>>st|
00000070  72 65 61 6d 0a 78 da a5  5a 0b 98 15 c5 95 ae d3  |ream.x..Z.......|

Daí, resolvi abrir o arquivo pelo VIM e ele apareceu assim:

^M
^M
^M
^M
%PDF-1.4
%âãÏÓ
2 0 obj
<</Length 4879/Filter/FlateDecode>>stream

Foram 26 linhas com o caractere ^M. Deletei essas linhas e salvei o arquivo.

Problema resolvido.

Após essa alteração a saída do comando hexdump -C arquivo.pdf passou a exibir a primeira linha assim:

00000000  25 50 44 46 2d 31 2e 34  0a 25 e2 e3 cf d3 0a 32  |%PDF-1.4.%.....2|

e o arquivo pôde ser aberto normalmente.

Share:

sexta-feira, 15 de junho de 2018

Converter manual (man) para PDF no Linux

Beleza, galera?

Dica rápida: Como converter qualquer manual (man) para PDF no Linux.

1. Abra o terminal

2. Execute o comando

man -t <nome_do_app> | ps2pdf - <arquivo_de_saida.pdf>

Por exemplo:

man -t bash | ps2pdf - manual_bash.pdf

Entendendo os comandos:

man -t: Executa o man e formata a saída com o groff.

bash: Nome do software que queremos o manual.

ps2pdf -: Faz a conversão da saída - formatada pelo groff. O símbolo - representa stdout (saída padrão).

manual_bash.pdf: Nome do arquivo que será gerado.

Um abraço e ffffffffffffffalou!
Share:

quarta-feira, 6 de junho de 2018

Debian 9 + Openbox

A insônia pode ser considerada aceitável quando é produtiva.

Eis que instalei o Debian minimal, lembrei dos velhos tempos de Openbox + tint2 + conky + compton + parcellite + feh + dmenu + scrot + dunst + algumas ferramentas do xfce, scripts...

Alterei alguns temas do conky e do tint2, fiz o wallpaper de forma simples no GIMP, baseado nas cores do Debian.







... falta algumas coisas.


Share:

sexta-feira, 1 de junho de 2018

Remover os avisos de erro ao desligar o Arch Linux

Ae galera do Arch Linux,
conhece o problema abaixo, que ocorre na hora de desligar o sistema?

shutdown[1783]: Failed to remount '/oldroot/sys/fs/cgroup/devices' read-only: Device or resource busy
shutdown[1]: Failed to wait for process: Protocol error
shutdown[1796]: Failed to remount '/oldroot/sys/fs/cgroup/pids' read-only: Device or resource busy
shutdown[1]: Failed to wait for process: Protocol error
shutdown[1801]: Failed to remount '/oldroot/sys/fs/cgroup/systemd' read-only: Device or resource busy
shutdown[1]: Failed to wait for process: Protocol error

Muito bem. Para resolvê-lo siga esses passos:

1. Logue-se como root

2. Edite o arquivo /etc/mkinitcpio.conf

3. Procure pela parte que possui os HOOKS e adicione "shutdown"

De:


HOOKS=(base udev autodetect modconf block filesystems keyboard fsck)

Para:


HOOKS=(base udev autodetect modconf block filesystems keyboard fsck shutdown)

4. Salve o arquivo e rode o comando abaixo:


mkinitcpio -p linux

Se estiver utilizando o kernel LTS:
mkinitcpio -p linux-lts

5. Reinicie o sistema

Problema resolvido.

Abraços.
Share:

quarta-feira, 30 de maio de 2018

Instalação do KDE 5.12.5 LTS no Debian 9 (Stretch)

O lançamento do KDE Plasma 5.13 está cada vez mais próximo de acontecer - 07 de junho de 2018 (KDE Schedules) - e isto está causando ansiedade na comunidade Linux, principalmente aos adeptos do KDE.

Aqueles que preferem GNOME, Cinnamon, XFCE ou qualquer outro ambiente também serão beneficiados, pois com esse lançamento haverá melhorias de integração.
A integração entre os ambientes gráficos é bastante importante, não só pela interface uniformizada, mas também por recursos que rodam por trás desses ambientes (programas componentes, serviços, bibliotecas, etc).

Por exemplo, usuários do KDE (escrito em QT) precisam usar os programas GIMP, INKSCAPE e FIREFOX (escritos em GTK) para editar imagens e vetores, navegar na internet, etc. Os usuários do GNOME (escrito em GTK) precisam de ferramentas robustas de edição de vídeo, como o KDENLIVE, ferramentas para gravação e conversão de mídias, como o K3B (escritos em QT). E em meio a tudo isso temos o LIBREOFFICE (escrito em VCL), que suporta razoavelmente bem os ambientes gráficos, mas passa por constantes melhorias graças a uma comunidade super ativa. Quando não há integração entre esses frameworks (ou toolkits, como preferir), o ambiente não apenas fica feio como também não ocorre a comunicação adequada entre processos: alguns menus não aparecem, programas fecham inesperadamente, etc.

DEBIAN

O Debian é um sistema operacional e distribuição de Software Livre bastante estável, rápido e confiável. Para conseguir tantas qualidades exigiu-se muita dedicação e amadurecimento por parte dos seus desenvolvedores, principalmente do seu fundador Ian Murdock, que infelizmente nos deixou em 2015.

A estabilidade do Debian, por outro lado, traz consequências: pacotes antigos (bem mantidos, por sinal) e um ciclo de 2 anos para lançar novas versões, com "pequenas" atualizações de manutenção. A versão atual (9.0 - Stretch) foi lançada em 17 de Junho de 2017 e a atualização de manutenção mais recente é a 9.0.4, lançada em 10 de Março de 2018.

Temos disponível nessa versão do Debian o KDE Plasma 5.8 LTS, lançado em 04 de Outubro de 2016. Apesar de bem mantida (justamente por se tratar de uma versão LTS), em 01 de Fevereiro de 2018 tivemos o lançamento da versão 5.12 LTS, ou seja, aproximadamente dois anos depois. O que isso significa? Muitas novidades, correções, melhorias na interface, etc.




ATUALIZAÇÃO PARA A VERSÃO KDE PLASMA 5.12.5 LTS

Os desenvolvedores da distribuição Neptune OS disponibilizaram um script para atualizar o KDE Plasma no Debian.

Utilizei esse script em uma instalação limpa do Debian e funcionou perfeitamente. Mesmo assim, recomendo cautela.

É super simples. Basta executá-lo como root e seguir as instruções.
Share:

FEDORA BR - Comunidade Fedora (não oficial)

Ae, pessoal.

Estou passando pra dar um recado rapidinho.

Foi divulgado por Cristiano Furtado, no canal do Youtube Toca do Tux, o lançamento da comunidade não oficial FEDORA BR.



Preparem-se para boas novidades.

Clique aqui para assistir a entrevista, aproveite e se inscreva no canal.

Na descrição do vídeo possui todas as informações necessárias.



UPDATE: Pessoal, esqueci de comentar que esse logo utilizado na postagem não é o oficial da comunidade. Como não pedi autorização aos administradores achei mais prudente criar uma imagem para utilizar aqui na divulgação.
Share:

terça-feira, 29 de maio de 2018

Teste de velocidade de execução de código helloworld em Python, Bash e C

Opa!!
Quero demonstrar um pequeno teste. Pequeno mesmo, pois se trata apenas de um Hello World escrito em Python, em Shell e em C.

-- Mas qual o objetivo?

O objetivo é mostrar a diferença que existe no tempo de execução "em milisegundos" de um simples Hello World escrito em linguagens diferentes.

Lembrando que C se diferencia das outras linguagens aqui citadas por se tratar de uma liguagem compilada (Python e Shell são interpretadas).

Apesar de milisegundos parecer pouco, quando trazemos para a vida real e executamos vários processos, com vários arquivos, de forma repetida, essa "pequena" diferença pode influenciar bastante.

Primeiro, em Python:
< arquivo: hello.py >

#!/usr/bin/python3

print('Hello World')

Em seguida, em Shell, na qual testaremos com echo e com printf:
  • echo
< arquivo: hello_echo.sh >

#!/bin/bash

echo "Hello World"

  • printf
< arquivo: hello_printf.sh >

#!/bin/bash

printf "Hello World\n"

Tradução livre da diferença entre echo e printf
Tanto o echo quanto o printf são comandos internos do Bash, sendo que o printf se tornou um comando interno a partir do Bash v. 4.1.7. O echo sempre finaliza sua execução com status 0, e simplesmente imprime os argumentos seguidos por EOL (caractere "end of line", ou seja, quebra de linha) na saída padrão, enquanto printf permite a definição de uma string de formatação e fornece um código de status diferente de 0 em caso de falha.
Unix Stack Exchange


* Vale lembrar que você pode evitar o caractere EOL no comando echo, mas não por padrão.

Por fim, em C:
< arquivo: hello.c >

#include <stdio.h>

int main(void) {
    printf("Hello World\n");
    return 0;
}

Pronto. Códigos criados, compilação concluída, permissões de execução dadas, vamos rodar com o comando time e verificar o resultado:



Conforme a imagem, o Python foi o que mais demorou para exibir o texto "Hello World":

real    0m0.036s
user    0m0.018s
sys     0m0.018s

Em seguida, o shell script (tanto o echo quanto o printf):

real    0m0.014s
user    0m0.006s
sys     0m0.000s

Por fim o C, que foi o mais rápido:

real    0m0.011s
user    0m0.001s
sys     0m0.001s

Para finalizar, testaremos um loop no qual o shell imprime 1000 vezes o Hello World, direcionando a saída padrão para /dev/null

Vamos utilizar dois formatos de iteração. O formato convencional e o "BRACE EXPANSION" {START..END} apenas para demonstração

Em Python:

$ time for ((i=0;i<=999;i++)) ; do /usr/bin/python3 -c 'print("Hello World")' > /dev/null ; done

real    0m31.275s
user    0m26.692s
sys     0m4.638s

$ time for i in {0..999} ; do /usr/bin/python3 -c 'print("Hello World")' > /dev/null ; done

real    0m31.585s
user    0m26.565s
sys     0m5.034s

Em Shell:
  • echo

$ time for ((i=0;i<=999;i++)) ; do echo "Hello World" > /dev/null ; done

real    0m0.030s
user    0m0.020s
sys     0m0.010s

$ time for i in {0..999} ; do echo "Hello World" > /dev/null ; done

real    0m0.028s
user    0m0.009s
sys     0m0.019s

  • printf

$ time for ((i=0;i<=999;i++)) ; do printf "Hello World\n" > /dev/null ; done

real    0m0.030s
user    0m0.022s
sys     0m0.009s

$ time for i in {0..999} ; do printf "Hello World\n" > /dev/null ; done

real    0m0.028s
user    0m0.009s
sys     0m0.019s


Observe que obtivemos resultados próximos entre os comandos echo e printf, e que em ambos os casos a utilização do "Brace Expansion" trouxe um pequeno ganho de velocidade

Em C:

$ time for ((i=0;i<=999;i++)) ; do ./hello > /dev/null ; done

real    0m1.589s
user    0m1.175s
sys     0m0.541s

$ time for i in {0..999} ; do ./hello > /dev/null ; done

real    0m1.527s
user    0m1.156s
sys     0m0.493s

Finalizamos os testes com o LOOP e pudemos observar que o Python levou quase 32 segundos para finalizar a execução, enquanto o C realizou em aproximadamente 2 segundos e o shell em apenas 30 milisegundos.

Não quero com isso afirmar que a linguagem A é mais rápida que a linguagem B, afinal não tenho grandes conhecimentos de programação e otimização de código, mas é importante analisar que "milisegundos" podem acelerar bastante a conclusão de alguns procedimentos no dia a dia de um sys-admin.

Abraços, galera.
Share:

sexta-feira, 25 de maio de 2018

Instalação manual do insync-headless no Arch Linux

"E aí, pessoal. Beleza?"

Começando com uma frase inédita, trago uma dica rápida sobre como resolver o maldito erro _curses.error: setupterm: could not find terminal ao tentar rodar a opção manage_selective_sync do insync-headless.

Eu já havia desistido de tentar resolver esse problema, mas eis que encontrei a solução.

Como o insync-headless foi extraído diretamente do pacote .deb, e eu não sei quais as variáveis utilizadas por padrão no Debian, fiz algumas tentativas sem sucesso.

A primeira tentativa foi exportar a variável TERMINFO e colocar como valor /usr/share/terminfo/x/xterm-256color, pois o Konsole exporta por padrão a variável TERM=xterm-256color.

A segunda foi copiar o arquivo supracitado como /etc/terminfo [ uma gambiarra as vezes funciona ] e exportar a variável TERMINFO=/etc/terminfo. O software poderia estar simplesmente checando se existia esse arquivo lá, quem sabe...

Aproximadamente um mês depois (hoje) resolvi exportar a variável TERM=linux e funcionou.

O insync-headless possui na sua estrutura o script /usr/bin/insync-headless cujo conteúdo é:

#!/bin/bash
cd /opt/insync/usr/lib/insync
LC_TIME=C exec ./insync-headless "$@"

Então, fiz uma pequena alteração. Acrescentei a variável TERM=linux

#!/bin/bash
cd /opt/insync/usr/lib/insync
LC_TIME=C TERM=linux exec ./insync-headless "$@"

Próximo passo será criar o PKGBUILD e gerar um pacote. Até o momento só existe no AUR o pacote da versão do insync com gerenciador gráfico (oposto da headless).

Abraço e até a próxima!
Share:

quinta-feira, 24 de maio de 2018

Como apagar todos os posts do Google+

Dica rápida obtida no stackexchange.com

Para apagar todos os posts do Google+ siga os passos abaixo:

1. Acesse a URL https://plus.google.com/apps/activities/

2. Selecione Posts (ou qualquer outra opção de seu interesse)

3. Abra o console do navegador (Ctrl + Shift + i no Google Chrome/Chromium)

4. Execute esse javascript:

var t = 500;
document.querySelectorAll('.XVzU0b.J3yWx').forEach(function(el,k) {
    setTimeout(function() {
        el.click();
        setTimeout(function() {
            document.querySelectorAll('.CwaK9 > span')[1].click();  
        }, 200);
    }, (t * k));
});


Não conheço a linguagem, mas seguindo a lógica e uma pesquisa superficial imagino que:

- Define-se a variável t = 500

- O método document.querySelectorAll() retorna uma lista com os elementos ".XVzU0b.J3yWx", que é a classe que representa o botão X de cada post.

- O método forEach() executa a função: 

- - - para cada botão X el , execute um click; 

- - - retorne uma lista com os elementos span que estão dentro do elemento ".CwaK9", que é a classe que representa a confirmação de remoção do post.

- - - para cada elemento filho span [1] execute um click e espere 200 ms (argumento do setTimeout)

- Não sei se estou certo, mas entre cada click no botão X + click de confirmação de remoção, o script aguarda 500 ms até chegar o final, que é representado pela variável k (quantidade de elementos '.CwaK9 > span').



Share:

quinta-feira, 26 de fevereiro de 2015

segunda-feira, 14 de abril de 2014

Instalando o novíssimo Gnome 3.12 no Fedora 20

Fala, pessoas!

Instalou o FEDORA 20 e agora está na vontade de utilizar o recém-lançado GNOME 3.12?
Simples! Basta seguir os procedimentos abaixo:

Não me responsabilizo caso o procedimento abaixo venha a trazer instabilidades ou inoperabilidade do sistema. Apenas garanto que em minhas duas estações de trabalho funciona com extrema estabilidade.

 1. Crie a entrada do repositório RHUGHES
# touch /etc/yum.repos.d/rhughes.repo

2. Edite o arquivo com qualquer editor de texto de sua preferência e essas informações:


[rhughes-f20-gnome-3-12-i386]
name=Copr repo for f20-gnome-3-12 owned by rhughes (i386)
baseurl=http://copr-be.cloud.fedoraproject.org/results/rhughes/f20-gnome-3-12/fedora-$releasever-i386/
skip_if_unavailable=True
gpgcheck=0
cost=900
enabled=1


[rhughes-f20-gnome-3-12-x86_64]
name=Copr repo for f20-gnome-3-12 owned by rhughes (x86_64)
baseurl=http://copr-be.cloud.fedoraproject.org/results/rhughes/f20-gnome-3-12/fedora-$releasever-x86_64/
skip_if_unavailable=True
gpgcheck=0
cost=800
enabled=1


3. Salve o arquivo e atualize o sistema
# yum update

Após a atualização, reinicie o PC apenas por garantia.


Fonte: http://copr.fedoraproject.org/coprs/rhughes/f20-gnome-3-12/
Share:

quinta-feira, 10 de abril de 2014

Como ativar o rc.local no Fedora e no Red Hat (RHEL)

Alguns usuários e administradores de sistemas que utilizam Fedora ou Red Hat (RHEL), com certeza, em algum momento, irão passar pela necessidade de definir que algum aplicativo ou script seja carregado na inicialização do sistema.

Aqueles que já utilizam Linux irão lembrar do /etc/rc.local, que é particularmente
um script utilizado para esse propósito.

Nele, podemos inserir o caminho absoluto de aplicações e scripts, de acordo com a necessidade do usuário, para que estas sejam carregadas automaticamente durante o boot do S.O.

Porém, sistemas como o Fedora e Red Hat (RHEL) já vem a algum tempo removendo por padrão o arquivo em questão.

De acordo com a documentação do Fedora, para que o rc.local volte a funcionar basta três passos simples.

( Todos os comandos como ROOT # )



1. Criar o arquivo rc.local em /etc/rc.d
# touch /etc/rc.d/rc.local

2. Inserir o "shebang" no arquivo
# echo '#!/bin/bash' > /etc/rc.d/rc.local


3. Torná-lo executável
# chmod 774 /etc/rc.d/rc.local


Após esses três passos, basta modificá-lo de acordo com a sua necessidade.

Share:

quarta-feira, 5 de março de 2014

Ubuntu 13.10 + Gnome Shell 3.10

Serei direto! :)

Segue o passo a passo:

Ubuntu 13.10 com Gnome 3.10

1. Instale o ubuntu-server minimal

2. Instale os pacotes necessarios para rodar o comando "add-apt-repository"
apt-get install python-software-properties software-properties-common

3. Adicione os repositorios PPA do gnome3
add-apt-repository ppa:gnome3-team/gnome3-next
add-apt-repository ppa:gnome3-team/gnome3


4. Atualize o sistema
apt-get update
apt-get dist-upgrade


5. Instale os pacotes do gnome-shell
apt-get install gnome-shell ubuntu-gnome-desktop

6. Remova alguns pacotes do ubuntu

apt-get remove unity-asset-pool (alguns plugins do unity para sincronizar com contas online do google, facebook, etc)

apt-get remove gnome-control-center-signon (icone duplicado do Online Accounts no gnome-control-center)

Dica: Instale o apt-file para descobrir qual pacote fornece um arquivo que esta em seu sistema. Para descobrir o icone duplicado do Online Accounts precisei dele.
Ex: apt-file search /usr/bin/online-accounts-preferences
Share:

segunda-feira, 3 de fevereiro de 2014

Forçando o uso de fontes em Sites no Windows

Se voce está cansado de ver a fonte Arial como padrão sem serifa nos sites, saiba que tem como mudar essa situação.

1. Abra o regedit

2. Acesse a chave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes e procure os valores Helv e Helvetica. Substitua pelo nome da fonte desejada.

O nome das fontes pode ser encontrado em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

3. Ainda dentro de FontSubstitutes crie um novo valor da Cadeia de Caracteres com o nome Arial e defina seu valor para o mesmo que colocou em Helv e Helvetica.

4. Reinicie o computador

Aqui, eu defini os tres valores para "Segoe UI". Fica bonito e padronizado.
Share:

Substituindo a imagem da tela de boas-vindas do Windows 7

Salve, galera!

Dica rápida: Como substituir a imagem exibida na tela de boas-vindas (tela de login) do Windows 7, sem a utilização de softwares de terceiro?

1. Abra o regedit

2. Na chave HKEY_LOCAL_MACHINE clique com o botão direito e faça uma busca pelo termo OEMBackground

Esta deverá se encontrar em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background

Caso não exista crie um novo valor DWORD com o nome citado OEMBackground

3. Altere o valor DWORD de 0 para 1

4. Acesse o PATH %windir%system32oobe e crie uma pasta com o nome info

5. Dentro de info crie uma sub-pasta chamada backgrounds

6. Em backgrounds, coloque a imagem desejada com o nome backgroundDefault.jpg respeitando o limite de tamanho (deve ser menor que 245KB).

Simples assim!

Fonte: http://www.techspot.com/guides/224-change-logon-screen-windows7/
Share: