sábado, 5 de agosto de 2017

Chaveamento entre PHP 5.6 e 7.0 no Linux

Por algum motivo você precisa fazer downgrade de versão do seu PHP, e por isso a melhor forma é ter os dos pacotes instalados na sua máquina e fazer o chaveamento entre as duas versões.

Encaramos que você já possui todos os pacotes que precisa em suas devidas versões e as duas versões do PHP devidamente instaladas, então basta fazer o seguinte:

DE "php5.6" PARA "php7.0":
 Apache:
 *Desabilita módulo*
   $ sudo a2dismod php5.6;
 *Habilita módulo*
   $ sudo a2enmod php7.0;
 *Reinicia serviço do apache2*
   $ sudo service apache2 restart

 CLI:
 *Seta PHP para a versão 7.0*
   $ sudo update-alternatives --set php /usr/bin/php7.0

 VERSÃO ATUAL:
   $ php -v

DE php7.0 para php5.6:
 Apache:
 *Desabilita módulo*
   $ sudo a2dismod php7.0;
 *Habilita módulo*
   $ sudo a2enmod php5.6;
 *Reinicia serviço do apache2*
   $ sudo service apache2 restart

 CLI:
 *Seta PHP para a versão 5.6*
   $ sudo update-alternatives --set php /usr/bin/php5.6

 VERSÃO ATUAL:
   $ php -v

Links de referência:
https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

https://askubuntu.com/questions/761713/how-can-i-downgrade-from-php-7-to-php-5-6-on-ubuntu-16-04

terça-feira, 14 de março de 2017

Android progressDialog - Problema com rotação de tela

Estou utilizando em uma aplicação Android o progressDialog para exibir uma mensagem de carregando/aguarde, até que toda a minha aplicação seja carregada para o usuário.

Porém quando você rotaciona o aparelho, rotacionando a tela também em quanto a progressDialog esteja em execução é fechado a aplicação e exibido o erro de Unfortunately APP has stopped com o log do console:

E/AndroidRuntime: FATAL EXCEPTION: main Process: br.com.company.appname, PID: 2925 java.lang.IllegalArgumentException:
 View=com.android.internal.policy.impl.PhoneWindow$DecorView{9d3787a0 V.E..... R......D 0,0-1166,288} not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:370) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:299) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84) at android.app.Dialog.dismissDialog(Dialog.java:329) at android.app.Dialog.dismiss(Dialog.java:312) at br.com.company.appname.MainActivity$1.onPageFinished(MainActivity.java:48) at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished(WebViewContentsClientAdapter.java:449) at com.android.org.chromium.android_webview.AwContentsClient$AwWebContentsObserver$1.run(AwContentsClient.java:73) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) 


 Para que o problema seja resolvido basta adicionar no arquivo "AndroidManifest.xml" o trecho android:configChanges="orientation|screenSize" conforme exemplo a baixo: 

<application
 android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:supportsRtl="true"
 android:theme="@style/AppTheme">
 <activity android:name=".MainActivity"
   android:configChanges="orientation|screenSize">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 </activity>
</application>
 
Dessa forma você pode rotacionar sua tela ao mesmo tempo de execução do progressDialog sem que a aplicação trave e apresente o erro.

Outros links:
https://developer.android.com/guide/topics/resources/runtime-changes.html?hl=pt-br

http://stackoverflow.com/questions/1111980/how-to-handle-screen-orientation-change-when-progress-dialog-and-background-thre

terça-feira, 21 de fevereiro de 2017

Init Script Required-Start Required-Stop Service Linux

Dica Rápida: 
- No geral os scripts dos serviços linux são encontrados em: /etc/init.d/...
- Caso você necessita que um serviço seja iniciado ou terminado antes de outro serviço basta incluir no script de execução do serviço o seguinte trecho:

Levamos em consideração que temos o serviço denominado primeiroServico no script do serviço /etc/init.d/primeiroServico deve-se adicionar o seguinte trecho no cabeçalho:

#!/bin/sh


### BEGIN INIT INFO
# Provides:        primeiroServico
# Required-Start: $network
# Should-Start: 
# Required-Stop:
# Should-Stop:
# Default-Start:  2 3 5
# Default-Stop:
# Description:    Descrição Serviço
### END INIT INFO

{trecho seu serviço}
Este primeiro trecho basicamente denomina seu serviço como primeiroServiço e diz que primeiro deve ser iniciado o serviço denominado "network" para que posteriormente ele inicie o serviço "primeiroServico". Onde Required-Start deve ser preenchido com o nome do seu "script/serviço" que você deseja que seja iniciado anteriormente.

Levamos em consideração agora que possuímos o serviço denominado segundoServiço (/etc/init.d/segundoServiço) o mesmo deve ser iniciado após o start dos serviços "network" e "primeiroServico" conforme trecho abaixo: 

#!/bin/sh
### BEGIN INIT INFO
# Provides:        segundoServico
# Required-Start: $network $primeiroServico
# Should-Start: 
# Required-Stop:
# Should-Stop:
# Default-Start:  2 3 5
# Default-Stop:
# Description:    Descrição Serviço
### END INIT INFO
{trecho seu serviço}
E para que o serviço seja terminado depois que outro serviço basta adicionar na linhas Required-Stop adicionando os serviços conforme exemplos a cima.

Alguns links para mais detalhes: https://wiki.debian.org/LSBInitScripts

Zend_Paginator com Doctrine HYDRATE_SCALAR e Zend_Paginator_Adapter_Array

Estava construindo uma query bem complexa e com alguns innnerJoins e para facilitar (recuperar os dados das colunas informadas no SELECT t1.column1, t2.column1...) eu precisava utilizar o “Doctrine::HYDRATE_SCALAR”, mas o paginator não conseguia fazer a contagem dos resultados (por utilizar HIDRATE_SCALAR) então após algumas pesquisas minha solução para resolver o problema foi a seguinte:
Obs: Utilizando Zend 2.
$query = UserTable::getInstance()->list($options); (Retorna a Query)

$query->setHydrationMode(Doctrine::HYDRATE_SCALAR);


//Criação do Adapter para funcionar o Paginator com HYDRATE_SCALAR

$adapter = new Zend_Paginator_Adapter_Array($query->execute());

$paginator = new Zend_Paginator($adapter, $page);

Espero que esse trecho também ajude quem precise.

quinta-feira, 2 de junho de 2016

Ionic Cordova AngularJS NodeJS e NPM

O Ionic Framework é um conceito de desenvolvimento de aplicações híbridas, ou seja sem preocupar-se com o a plataforma em questão para desenvolvimento. Ionic possui componentes de desenvolvimento do Cordova (Componentes de integrações de recursos nativos dos dispositivos) e AngularJS (Componentes Web e JS), para execução do mesmo é necessário ter instalado o NodeJS (Server de execução) e NPM (Node Package Manager (Gerenciador de Pacotes do Node)).

 Para instalar o Cordova e o Ionic no Linux64 basta rodar os seguintes comandos:

$ sudo apt-get install curl
$ curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ npm install -g cordova ionic


 Ao tentar intalar o Ionic (último comando ($ npm install -g cordova ionic)) obtive o seguinte erro de instalação :

make: g++: Command not found
src/libsass.target.mk:134: recipe for target 'Release/obj.target/libsass/src/libsass/src/ast.o' failed
make: *** [Release/obj.target/libsass/src/libsass/src/ast.o] Error 127
make: Leaving directory '/usr/lib/node_modules/ionic/node_modules/node-sass/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/lib/node_modules/ionic/node_modules/node-gyp/lib/build.js:276:23)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12)
gyp ERR! System Linux 4.4.0-22-generic
gyp ERR! command "/usr/bin/nodejs" "/usr/lib/node_modules/ionic/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /usr/lib/node_modules/ionic/node_modules/node-sass
gyp ERR! node -v v6.2.0
gyp ERR! node-gyp -v v3.2.1
gyp ERR! not ok
Build failed
/usr/lib
└── cordova@6.1.1

npm ERR! Linux 4.4.0-22-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "install" "-g" "cordova" "ionic"
npm ERR! node v6.2.0
npm ERR! npm  v3.8.9
npm ERR! code ELIFECYCLE

npm ERR! node-sass@3.4.2 postinstall: `node scripts/build.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the node-sass@3.4.2 postinstall script 'node scripts/build.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the node-sass package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node scripts/build.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs node-sass
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls node-sass
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/{$USER}/npm-debug.log


Para solucionar o problema bastou executar o seguinte comando:

$ sudo apt-get install node-gyp

 Após a instalação sem erros, o Ionic disponibiliza por default 3 layout pré prontos das aplicações, basta acessar a pasta local onde você pretende ter os fontes do Ionic, e rodar os comandos abaixo listados, esses comendos irão criar uma estrutura de pasta dentro do diretorio selecionadosão elas:

#Layout em Branco
$ ionic start myApp blank

#Layout em Abas
$ ionic start myApp tabs


#Layout de Menu Laterais
$ ionic start myApp sidemenu

Após a criação da estruta de seu layout você deve acessar a pasta e rodar o seguinte comando :

#Inicia o server com seu template selecionado:
$ ionic serve 

#Inicia o server para exibir no modelo de celular:
$ ionic serve --lab

Imagem execução server (NodeJS) com layout (sidemenu)


Fontes utilizadas:
http://ionicframework.com/ (Acessado em 02/06/2016)
http://nodebr.com/o-que-e-a-npm-do-nodejs/ (Acessado em 02/06/2016);
http://tableless.com.br/introducao-ao-ionic-framework/ (Acessado em 02/06/2016);

sexta-feira, 20 de maio de 2016

JPA HIBERNATE e CARREGAMENTO FetchType.LAZY

Este post tem por objetivo demonstrar como é feito o carregamento de um objeto(Endereco) mapeado com o LAZY para um objeto (Usuario). 

Abaixo trecho do fonte em Java (Usuario.java) de um mapeamento LAZY, digamos que o mapeamento da sua "Entity" por questões de performance ou até mesmo por padrão do projeto foi mapeado com o carregamento do tipo LAZY (fetch = FetchType.LAZY)

Usuario.java
@Entity
@Table(name = "usuario")
public class Usuario {
   
  @Column
  private String nome;

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "id_endereco")
 private Endereco endereco;
 
 public String getNome() {
     return nome;
 }
   
 public void setNome(String nome) {
       this.nome = nome;
 } 
 public Endereco getEndereco() {
      return endereco;
 }
   
 public void setEndereco(Endereco endereco) {
       this.endereco = endereco;
 }
} 

Este trecho demonstra o carregamento da entidade "Endereco" sendo executado via código Java, anteriormente conforme mapeado na classe "Usuario.java", podemos observar o mapeamento LAZY para o atributo "endereco", que ao capturar os usuários por sua vez não é carregado a não ser que seja feito o fonte conforme trecho abaixo (Hibernate.initialize(usuario.getEndereco());) :
private List<Usuario> obterUsuarios(Query query) {
List<Usuario> usuarios = (List<Usuario>) query.getResultList();
for (Usuario usuario : usuarios){
Hibernate.initialize(usuario.getEndereco());
}
return usuarios;
}

Após utilizar Hibernate.initialize sua lista terá seus objetos carregados, com seus respectivos endereço.

quinta-feira, 18 de fevereiro de 2016

Android - Transição de tela entre Activities


Neste exemplo prático estarei exibindo nos fontes como é feito um transição entre duas telas a MainActivity.java e a SecondActivity.java.

Funcionalidade:
 Clicar em qualquer lugar da tela e trocar para segunda tela.

 1) Passo: Adicione no seu layout no meu caso é o RelativeLayout o "android:onClick" do arquivo (activity_main.xml) para que tenhamos o evento de clique. Obtendo um trecho de xml semelhante ao seguinte:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:onClick="choiceScreen"
android:background="@color/backgroudapp">

...

 2) Crie sua próxima classe Java com seu respectivo layout, neste caso criamos a SecondActivity.java e o layout second_activity.xml;

public class SecondActivity extends AppCompatActivity {
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
    }
}

  3) Passo: Adicione sua tela no arquivo AndroidManifest.xml conforme exemplo abaixo:

    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  
 4) Passo: Na MainActivity.java escreva um método com nome definido no passo anterior neste caso android:onClick="choiceScreen". Obtendo um método semelhante a esse :

 public class MainActivity extends AppCompatActivity {
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void choiceScreen(View view){
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        MainActivity.this.startActivity(intent);
    }
}

Basta rodar a aplicação e você terá a transição da tela MainActivity para a SecondActivity.

BÔNUS : Dica rápida e fácil, cadastrar um cor padrão para o sistema, basta adicionar no arquivo colors.xml a tag <color name="backgroudapp">#303F9F</color> depois de feito isso basta usa-la desta maneira android:background="@color/backgroudapp">

terça-feira, 30 de junho de 2015

Read-Only Root Filesystem - Raspberry Pi


       O Raspberry Pi, na maioria dos casos é utilizado em televisores e alimentado via USB do mesmo, sofre inúmeras interrupções no funcionamento e pode ocasionar no corrompimento dos dados no "HD" que seria nosso famoso e conhecido Memory Card.

       Para "amenizar" essa quebra de dados do cartão de memória deve-se realizar algumas configurações nas partições do seu SD. Segue procedimentos a serem feito :

Edite o arquivo "/etc/fstab" e adicione nas partições de seu SD a sigla "RO".

Tendo uma tabela semelhante a essa:


proc
/proc
proc
defaults
0
0
/dev/ mmcblk0p1
/boot
vfat
ro
0
2
/dev/ mmcblk0p2
/
ext4
ro
0
1
tmpfs
/tmp
tmpfs
defaults,noatime,mode=1777
0
0
tmpfs
/var/log
tmpfs
defaults,noatime,mode=0755
0
0
tmpfs
/var/lock
tmpfs
defaults,noatime,mode=0755
0
0

Para que o Xorg crie seus logs pasta criar uma nova partição para alocar o /home/pi, está 
partição não deve ser em Read-Only.

Reinicie e seu SD estará em Read-Only.

Para conseguir alterar os arquivos caso necessário basta rodar o seguinte comando:


mount / -o remount,rw

sexta-feira, 12 de setembro de 2014

ORDER BY FIELD - Doctrine 2

Digamos que você tem uma ordenação em uma coluna no banco de dados, o qual seria necessário fazer uma listagem nessa ordem, exemplo uma string de ids algo como "122,150,152,129", e usando apenas o ORDER BY isso não ira funcionar, precisamos então usar o FIELD, veja no exemplo como ele ajuda nessa questão.

A variável $listPages, possui uma STRING com a minha ordenação , $listPages = "122,150,152,129" a qual eu preciso que venha os resultados da query, então fizemos assim :

public function getPagesByPackage($listPages, $entidade)
    {
         $query = self::getInstance()->createQuery('p')
                    ->where('p.id in (' . $listPages . ')')
                    ->andwhere('p.entidade = ?', $entidade)
                    ->orderBy('FIELD(id, ' . $listPages . ')');
            
            return $query;
    }

quinta-feira, 11 de setembro de 2014

Using HTML in a Zend_Form_Element (Zend 1.12)

Para utilizar HTML na label de um Zend_Form_Element basta definir a option escape para false dessas duas maneiras:
  • A primeira é setando diretamente nas options do elemento na construção do mesmo.
  • Ou utilizando os métodos getDecorator e setOption(), válidos também para quando já se tem o elemento criado e é necessário essa alteração.
$this->form->addElement('button', 'salvar', array(
'label' => '<br style="clear:both">Salvar conteúdo',
'class' => 'botao',
'type' => 'submit',
       'escape' => false,
'style' => 'margin-top:25px;',
       'decorators' => $this->form->getButtonDecorators()
));

$responsavel = new Zend_Form_Element_Text('responsavel', array(
         'label'       => '<span style="color:red">*</span>Resposável:',
         'size'        => 50,
         'decorators'  => $this->_elementDecorators,
         'max_length'  => 50 )
                 );
                
 $responsavel->getDecorator('Label')->setOption('escape', false);
 $this->addElement($responsavel);

sexta-feira, 10 de janeiro de 2014

ERROR: ABORTING BOOT (Sending SIGTERM to parent!) {FreeBSD 9}

Ao iniciar a máquina o seguinte erro era exibido:
ERROR: ABORTING BOOT (Sending SIGTERM to parent!)
init:/bin/sh or /etc/rc terminated abnormally, going to single user mode
Enter full pathname of shell or return for /bin/sh: PRESS ENTER
Comandos a serem digitados para fazer uma verificação de consistência do sistema de arquivos manual, e remontar suas partições:
# fsck -y
# mount -u /
# mount -a -t ufs
Após a execução dos comandos dar um 'reboot' na máquina
# shutdown -r now
#Fontes acessada dia 10-01-2014
https://forums.freebsd.org/viewtopic.php?&t=10499

terça-feira, 3 de setembro de 2013

Configurar porta de acesso SSH no CentOs 6

# Acesse o arquivo de configuração do SSH
vi /etc/ssh/sshd_config
# Descomente a linha '# Port 22' e adicione a porta que deseja liberar
Port 9022
# Reinicie o serviço
/etc/init.d/sshd restart
Para que funcione o acesso a nova porta você tem que adicionar a porta em questão (9022) na regra de Firewall
# Acesse o arquivo de configuração do Firewall
vi /etc/sysconfig/iptables
# Adicione a linha
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9022 -j ACCEPT
# Reinicie o serviço
/etc/init.d/iptables restart
Fontes acessadas em 03/09/2013
http://wiki.centos.org/HowTos/Network/SecuringSSH
http://mmaiacupofcoffee.blogspot.com.br/2012/11/como-liberar-uma-porta-pelo-iptables.html

quarta-feira, 10 de julho de 2013

RDP (Remote Desktop Protocol) Oracle VirtualBox

Para realizar uma conexão remota em uma máquina virtual do VirtualBox via RDP usando Ubuntu 12.04 faça os seguintes passos:
Na VM que desejas conectar vá em "Configurações" - "Monitor" - "Tela Remota" 
Marque a checkbox "Habilitar Servidor"
Abra o shell e digite o seguinte comando:
$ rdesktop -a 16 -N 192.168.192.168:3389
Onde 192.168.192.168 é o IP da máquina onde está sendo rodada a VM
Caso não funcionar certifique de que o pacote de extensão "Oracle_VM_VirtualBox_Extension_Pack-4.2.16-86992.vbox-extpack" esta instalado em
"Arquivo" - "Preferências" -"Extensões"
Caso não esteja instalado realizar o download aqui e adicione esta extensão e repetir o comando
$ rdesktop -a 16 -N 192.168.192.168:3389
Fontes acessada em 10/07/2013
http://www.downloadcrew.com/article/20279-virtualbox_extension_pack

terça-feira, 25 de junho de 2013

Zabbix - Monitoramento de Servidores [Instalação]

Realize o download do package Zabbix 2.0.6 em :
http://www.zabbix.com/download.php

No terminal acesse o MySQL
$ mysql -uusuario -psenha
mysql> create database zabbix;
mysql> exit
Entre no diretório do package Zabbix:
$ cd /home/desenv/zabbix-2.0.6/database/mysql
Importe os sqls:
$ mysql -uusuario -psenha zabbix < schema.sql
$ mysql -uusuario -psenha zabbix < images.sql
$ mysql -uusuario -psenha zabbix < data.sql 
Após configure a ativação dos modulos do Zabbix:
$ ./configure --enable-server --enable-agent --with-mysql 
           --enable-ipv6 --with-net-snmp --with-libcurl
E compile:
$ sudo make install
Crie um arquivo com o nome zabbix em /etc/apache2/conf.d/:
$ sudo nano /etc/apache2/conf.d/zabbix
E acrescente isso:
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value date.timezone America/Sao_Paulo
Aponte seu apache para o package do Zabbix.
home/desenv/zabbix-2.0.6/frontends/php/
Restart o apache:
$ sudo service apache2 restart
Agora siga os passos do instalação via browser ou se preferir acesse o manual em :
https://www.zabbix.com/documentation/doku.php?id=2.0/manual/installation/install

Um passo do final da instalação terás algo como :
Press the "Download configuration file" button, download
 the configuration file and save it as "/home/desenv/zabbix-2.0.6/frontends/php/conf/zabbix.conf.php"
Faça o donwload e jogue o arquivo em home/desenv/zabbix-2.0.6/frontends/php/conf/.

Depois é só se logar no sistema e pronto Zabbix instalado.

Fontes acessadas em 25/06/2013:
https://www.zabbix.com/documentation/doku.php?id=2.0/manual/installation/install
http://www.zabbix.com/download.php

segunda-feira, 17 de junho de 2013

Script Munin/FreeBSD - Monitoramento de temperatura

Verifique se o módulo de monitoramento de temperatura foi inicializado:
 # kldstat 
 Id Refs Address    Size     Name
 1   12 0xc0400000 972234   kernel
 2    1 0xc0d73000 164e8    geom_mirror.ko
 3    1 0xc0d8a000 58e0     if_vlan.ko
 4    1 0xc0d90000 36d6c    pf.ko
 5    1 0xc0dc7000 295c     coretemp.ko
 6    1 0xc0dca000 6a32c    acpi.ko
 7    1 0xc67fa000 22000    linux.ko
Caso o módulo já esteja em execução, utilize 'sysctl' para verificar a temperatura:
# sysctl -a | grep temperature

 dev.cpu.0.temperature: 68
Se o modulo 'NÃO' está carregado edit o arquivo '/boot/loader.conf' acrescentando:
 coretemp_load="YES" 
Reinicie a máquina e rode novamente o comando:
# sysctl -a | grep temperature
Para fazer o script para o Munin faça o seguinte:
Como 'root' acesse '/usr/local/etc/munin/plugins/' e crie o seguinte script:
 #!/usr/local/bin/bash
 case $1 in
  config)
    echo "graph_title CPU Temperatures";
    echo "graph_vtitle Celsius";
    echo "graph_args --base 1000 -l 0";
    echo "graph_category sensors";

    for n in $(eval echo "{0..$(expr $(sysctl -n hw.ncpu) - 1)"})
    do
     echo "core${n}.label Core ${n}";
    done

  exit 0;;
 esac

 for n in $(eval echo "{0..$(expr $(sysctl -n hw.ncpu) - 1)"})
 do
   echo -n "core${n}.value $(sysctl -n dev.cpu.${n}.temperature).0"
 done
Salve o script como por exemplo 'cpu_temp'.
Rode o seguinte comando:
 # chmod + x cpu_temp 
Para obter a temperatura execute
 # ./cpu_temp
Para obter as informações de configuração execute
 # ./cpu_temp config
O resultado com o Munin é algo como:

quarta-feira, 12 de junho de 2013

Munin - Monitoramento de temperatura para servidores Linux

Munin é uma ferramenta de monitoramento de recursos de rede que podem ajudar a analisar as tendências e recursos. A instalação padrão fornece uma grande quantidade de gráficos.

Caso não tenha os plugins do Munin instalados em sua máquina digite:

$ sudo apt-get install munin-plugins-extra
$ sudo apt-get install lm-sensors

 Como ''root'' rode:

$ sensors

Caso nenhum resultado exibido suba o modulo "coretemp"

$ modprobe coretemp

Faça um link simbólico

$ ln -s /usr/share/munin/plugins/sensors_ /etc/munin/plugins/sensors_temp

Acesse /etc/munin/plugins e rode

$ sudo ./sensors_temp

A saida é algo semelhante a :

temp1.value 40.0 temp2.value 40.0 temp3.value 39.0

Pronto terás as informações de temperatura do seu server no Munin.
Link relacionado :
http://wiki.kartbuilding.net/index.php/Munin_Statistics

quinta-feira, 16 de maio de 2013

FIND e REPLACE com SED

Sed significa "Stream EDitor" como o próprio nome diz "editor de fluxo", é um editor NÃO "convencional" pois não usa interatividade em tela com o arquivo a ser editado e é executado via linha de comando utilizando o "shell"(linux).
Utilizado para editar arquivos de extensão ".txt",".php",".html" dentre outros.

O meu problema era alterar mais de 200 arquivos em PHP trocando os links absolutos por links relativos, e a grande solução para não alterar um por um foi a utilização do SED.

Exemplo de comando utilizado:

$ find /home/user/projetos/ -type f -exec sed -i 's/ANTIGO/NOVO/g' {} \;

Você consegui alterar todos os arquivos que estão dentro do diretório "/home/user/projetos/" e que possuir a palavra "ANTIGO" por "NOVO".

Caso precisa alterar apenas um arquivo use:

$ sed -i 's/ANTIGO/NOVO/g' /home/user/projetos/arquivo.txt

Para mais opções de utilização do SED digite:

$ man sed

Fontes acessadas em 17/05/2013:
 http://www.brunolinux.com/02-The_Terminal/Find_and%20Replace_with_Sed.html
http://pt.kioskea.net/faq/8760-sed-introducao-ao-sed-part-i


quinta-feira, 17 de janeiro de 2013

The xdebug extension is not loaded. No code coverage will be generated.

Após ter instalado o framework PHPUnit para realizar os teste unitários dos códigos desenvolvidos, houve a necessidade de se ter um melhor controle ou visualização do que já havia testado e o que ainda faltava testar, onde o PHPUnit disponibiliza de dashboard interativo de visualização de seus testes.

Através do parâmetro [--coverage-html] passado para o phpunit é possível ter acesso a esse "painel" através do browser.

O comando para geração desse dashboard é:

root@Notebook: /home/desenv/site/TesteUnit$ phpunit --colors --coverage-html ./reports CadastroAdminTest

Onde meu retorno era algo como :

PHPUnit 3.7.13 by Sebastian Bergmann.

The xdebug extension is not loaded. No code coverage will be generated.

....

Time: 0 seconds, Memory: 4.75Mb

OK (4 tests, 6 assertions)

No qual não era possível gerar o dashboard.

A solução para esse problema foi encontrada no site abaixo acessado em (18/01/2013): http://blog.mac2k3.be/2010/05/upgrading-ubuntu-9-10-to-10-4-php-and-xdebug-problems/

Onde no meu caso precisou-se instalar php5-xdebug com o comando:
sudo apt-get install php5-xdebug

Adicionar a linha:
zend_extension="/usr/lib/php5/20060613/xdebug.so"
 
No arquivo :
/etc/php5/apache2/php.ini
 
Pois possui-a php-pear e
php5-dev
em uma versão mais nova. 
 
Após a adição da linha realizei o restart do servidor apache2
e rodei novamente o comando:
phpunit --colors --coverage-html ./reports CadastroAdminTest
 
E meu retorno agora é :
 
PHPUnit 3.7.13 by Sebastian Bergmann.

....

Time: 0 seconds, Memory: 4.75Mb

OK (4 tests, 6 assertions)

Generating code coverage report in HTML format ... done

Conforme o esperado.














  

quarta-feira, 19 de dezembro de 2012

Problema na identificação das portas serial no Arduino com o Ubuntu 12.04


Tive algumas experiência de desenvolver aplicações em Arduino no Ubuntu 11.04, mas nunca havia desenvolvido no 12.04, quando fui utilizar tive um grande problema na identificação das portas serial usb,não conseguia configurar pela IDE qualquer porta usb, estava desabilitada a opção no menu "Tools->Serial Port", impossibilitando de realizar qualquer teste com o Arduino quanto menos desenvolver algo.

Pelo terminal verifiquei usando o seguinte comando:
$ dmesg

E meu problema era algo como :

usb 1-1.3: new full-speed USB device number 18 using ehci_hcd
usb 1-1.3: device not accepting address 18, error -32
usb 1-1.3: new full-speed USB device number 19 using ehci_hcd
usb 1-1.3: device not accepting address 19, error -32
hub 1-1:1.0: unable to enumerate USB device on port 4

Solução:

sudo usermod -a -G tty name_user
sudo usermod -a -G dialout name_user

Após feito isso reiniciei e funcionou.