Este blog tem por objetivo compartilhar informações relevantes pra mim mas que a meu ver possa ser relevante para outras pessoas também... Seja muito bem vindo.
sábado, 5 de janeiro de 2013
retorno de uma função em shellscript
referencia:
http://www.linuxjournal.com/content/return-values-bash-functions
(estou supondo que o leitor sabe criar arquivos de shellscript e executa-los, sabe criar e executar funções com shellscripts e conhece sobre escopo de variáveis se nao souber he so googlar sobre shellscript...)
Funções em shellscript nao retornam valor para quem a chamou, elas retornam ou zero (signafica que rodou ok) ou um (que deu algum erro).
Uma alternativa pra obter valores da funcao seria fazer com que elas funcionem como procedimentos, fazendo que elas apenas alterem uma variável global e apos rodar a funcao voce consulta o valor da variavel global.Por exemplo.
global_current_pid="not-defined-yet"
get_current_pid(){
global_current_pid=$$;
}
get_current_pid
echo "$global_current_pid"
Mas usar variáveis globais pode ser desafiador para scripts grandes. Por isso é que as linguagens modernas fazer permitem recursos de variáveis locais que podem ser retornadas pela funcao.
Então outra alternativa seria a técnica de substituição de comando.
get_current_pid(){
echo $$;
}
echo $(get_current_pid)
mas eu percebi que pra isso funcionar, tem que tomar um pequeno cuidado, o que pra mim, em particular passa a ser um problema e vou explicar o porquê depois. Vamos ver o problema primeiro:
get_current_pid(){
echo "getting current pid..."
echo $$;
}
echo $(get_current_pid)
meu retorno ficou...
[wagner@fzlbpmshost bin]$ ./fzl_utils.sh
getting current pid... 2842
ou seja, quando a gente coloca alguns echos para imprimir algumas informações sobre o que esta acontecendo durante a execução do código o retorno da função fica poluído com essas informações. Como uma pessoa muito comum eu sempre coloco echos para entender melhor o que esta acontecendo o que faz dessa opcao algo inviavel pra mim (pelo menos enquanto nao encontro uma solucao pra isso).
a outra alternativa é usar eval...
vamos ao exemplo, depois a gente analisa...
get_current_pid(){
echo "(inside function... ) getting current pid..."
to_be_returned=$1
eval $to_be_returned="'$$'"
}
get_current_pid pidReceivedFromFunc
echo "$pidReceivedFromFunc"
executando isso, obtem-se:
[wagner@fzlbpmshost bin]$ ./fzl_utils.sh
(inside function... ) getting current pid...
4509
to_be_returned=$1 significa que a mesma variavel que a função recebeu será aquela que desejamos retornar, por isso coloquei um nome bem sugestivo "to_be_returned" :)
Mas pra entender bem o que vem depois você vai ter que perceber aqui um detalhe do que está contecendo...
coloque, por curiosidade a seguinte linha no script, pra ele ficar assim...
get_current_pid(){
echo "(inside function... ) getting current pid..."
echo $1
to_be_returned=$1
eval $to_be_returned="'$$'"
}
get_current_pid pidReceivedFromFunc
echo "$pidReceivedFromFunc"
executando de novo, obtem-se:
[wagner@fzlbpmshost bin]$ ./fzl_utils.sh
(inside function... ) getting current pid...
pidReceivedFromFunc
4526
Caramba, o que a nossa funcao recebeu na verdade foi o nome da variavel que quem chamou definiu...
opa, agora sim, dá pra falar do eval:
primeiro uma definição:
eval significa que o que vem depois sera interpretada de novo. de novo. Ou seja, o script quando esta rodando já esta sendo interpretado pelo bash pra que seja executado de fato, mas quando chega nessa linha o bash interpreta o eval primeiro e quando isso acontece o bash fica sabendo que vai ter que interpretar de novo o que vem depois desse eval pra depois sim rodar isso que vem depois
agora vendo como isso aconteceu no codigo:
o bash quendo vê o eval ele fica bem esperto com o que vem depois desse eval
e o bash vai perceber que varival local to_be_returned vai estar valendo $1 que é exatamente o nome da variável que a função recebeu, ou seja
to_be_returned=pidReceivedFromFunc
aí o bash vai considerar o seguinte:
"como eu (bash) percebi que tinha um eval antes de
to_be_returned=pidReceivedFromFunc
então vou interpretar isso de novo...
pidReceivedFromFunc=$$
entao, por fim, o que acontece na verdade é que a nossa função recebeu um nove de varíavel que acabou recebendo o valor que a função estava querenddo retornar e então quem chamou poderá consultar o que foi atribuído a essa variável e obter o retorno da função.
Qual o efeito colateral disso? Por ser uma "gambiarra" na verdade, destinada a contornar o fato de que a função em shellscript deveria se chamar na verdade procedimento, pelo fato de não retornar valor, é bem provável que haja efeitos colaterais...
veja isso...
get_current_pid(){
echo "(inside function... ) getting current pid..."
echo $1
to_be_returned=$1
eval $to_be_returned=$$
}
test_if_the_name_of_the_variable_passed_to_function_is_global(){
echo "$pidReceivedFromFunc";
}
get_current_pid pidReceivedFromFunc
echo "$pidReceivedFromFunc"
test_if_the_name_of_the_variable_passed_to_function_is_global
essa função, que nao tem na a ver com o relacionamento entre a chamada da funcao get_current_pid e a variavel criada para obter o valor do pid corrente, acaba conhecendo essa variável criada o que faz dela uma global da mesma forma... talvez pior porque quando você vai programar com liguagens procedurais tipo cobol você já fica esperto com as variáveis globais, coloca lá uma área do código pra elas e trabalha com cuidado com relaçao ao que está acontecendo com elas enquanto que neste caso você acaba criando variáveis globais "por aí..." durante o código...
a conclusão que tiro de tudo isso é a seguinte... você vai usar shellscript...
é uma lunguagem procedural... trabalha dentro desse paradigma então, evitando gambiarras. Na verdade não há nada de errado com variáveis globais a não ser o cuidado especial que você tem que tomar com elas...
no caso de funções bem simples como essa
get_current_pid onde não é necessário echos pra ajudar entender a execução do código, então a técnica de substituição de variáveis é melhor porque não cria variáveis globais...
sábado, 15 de dezembro de 2012
Configurações para garantir um funcionamento correto do fzlbpms
HABILITAR WEBCONSOLE DO KARAF
karaf@root> features:install war
karaf@root> features:install webconsole
http://localhost:8181/system/console/bundles
HABILITAR WEBCONSOLE DO ACTIVE-MQ
karaf@root> features:install activemq-web-console
http://localhost:8181/activemqweb/index.jsp
links:
http://marcelojabali.blogspot.com.br/2011/08/how-to-enable-activemq-web-console-on.html
HABILITANDO ALGUNS BUNDLES NECESSÁRIOS PARA ALGUNS COMPONENTES FZLBPMS
karaf@root> features:install camel-servlet
karaf@root> features:install camel-jetty
karaf@root> features:install camel-exec
nesserário para fazer funcionar o
fzlbpms_camel-rest-to-batch_template-1.0-SNAPSHOT
na prática significa que com isso funcionando é possível receber requisições web e usá-las para chamar shellscripts.
procedimentos para instalação do fzlbpms
pré requisito:
java jdk instalado. Para verificar digite o comando
prompt>; java -version
1) Copiar os arquivos do programa para o seu disco
O fzlbpms é composto pelos arquivos (códigos fontes, programas compilados, etc...) em uma pasta chamada fzlbpm. O primeiro passo é copiar essa pasta para algum lugar do hd. Essa pasta vai ser a partir de agora de FZL_HOME
2) Configurar variáveis de ambiente
é só copiar e colar esses comandos. Pode parecer complicado, mas equivale a abrir o arquivo /etc/profile e digitar na mão algumas linhas. Esses comandos simplificam porque é só copiar e colar o comando e pronto.
su -c "echo FZL_HOME=/home/wagner/fzlbpms >> /etc/profile"
su -c "echo M2_HOME=$FZL_HOME/integrated/apache-maven-3.0.4 >> /etc/profile"
su -c "echo ANT_HOME=$FZL_HOME/integrated/apache-ant-1.8.4 >> /etc/profile"
su -c "echo export FZL_HOME M2_HOME ANT_HOME >> /etc/profile"
INICIALIZANDO O FZLBPMS
Obs.: Antes de inicializar, se estiver interessado em visualizar alguns logs importantes como do servicemix, do tomcat, do nexus e do apacheds você vai ter que instalar o xterm. Se nao estiver interessado ou quizer utilizar outro metodo pra fazer isso, então despreze essa observação.
yum install xterm
Eis os comandos para inicializar, que basicamente é entrar na pasta bin do fzlbpms e rodar o script fzl_startup.sh:
cd $FZL_HOME/bin
bash fzl_startup.sh
mais observações sobre logs
tail -f $FZL_HOME/integrated/apache-servicemix-4.4.1-fuse-07-11/data/log/servicemix.log
tail -f $FZL_HOME/integrated/apache-tomcat-7.0.25/logs/catalina.out
tail -f $FZL_HOME/integrated/apacheds_1.5.7/logs/apacheds-rolling.log
pré requisito:
java jdk instalado. Para verificar digite o comando
prompt>; java -version
1) Copiar os arquivos do programa para o seu disco
O fzlbpms é composto pelos arquivos (códigos fontes, programas compilados, etc...) em uma pasta chamada fzlbpm. O primeiro passo é copiar essa pasta para algum lugar do hd. Essa pasta vai ser a partir de agora de FZL_HOME
2) Configurar variáveis de ambiente
é só copiar e colar esses comandos. Pode parecer complicado, mas equivale a abrir o arquivo /etc/profile e digitar na mão algumas linhas. Esses comandos simplificam porque é só copiar e colar o comando e pronto.
su -c "echo FZL_HOME=/home/wagner/fzlbpms >> /etc/profile"
su -c "echo M2_HOME=$FZL_HOME/integrated/apache-maven-3.0.4 >> /etc/profile"
su -c "echo ANT_HOME=$FZL_HOME/integrated/apache-ant-1.8.4 >> /etc/profile"
su -c "echo export FZL_HOME M2_HOME ANT_HOME >> /etc/profile"
INICIALIZANDO O FZLBPMS
Obs.: Antes de inicializar, se estiver interessado em visualizar alguns logs importantes como do servicemix, do tomcat, do nexus e do apacheds você vai ter que instalar o xterm. Se nao estiver interessado ou quizer utilizar outro metodo pra fazer isso, então despreze essa observação.
yum install xterm
yum install xorg-x11-fonts*
Eis os comandos para inicializar, que basicamente é entrar na pasta bin do fzlbpms e rodar o script fzl_startup.sh:
cd $FZL_HOME/bin
bash fzl_startup.sh
mais observações sobre logs
tail -f $FZL_HOME/integrated/apache-servicemix-4.4.1-fuse-07-11/data/log/servicemix.log
tail -f $FZL_HOME/integrated/apache-tomcat-7.0.25/logs/catalina.out
tail -f $FZL_HOME/integrated/apacheds_1.5.7/logs/apacheds-rolling.log
segunda-feira, 19 de novembro de 2012
Hoje é 19 de novembro e este é o primeiro post de 2012!
Mas como sempre, meu primeiro post é uma oração:
Senhor, tenho visto a frieza e o desamor crescer por causa da iniquidade. Senhor perdoa-nos! Abençoa e de sabedoria aos governantes! aos nossos pastores! às nossas autoridades!
Renova em nós um espírito reto, e mantém-nos em sua presença.
amem!
Obrigado!
Mas como sempre, meu primeiro post é uma oração:
Senhor, tenho visto a frieza e o desamor crescer por causa da iniquidade. Senhor perdoa-nos! Abençoa e de sabedoria aos governantes! aos nossos pastores! às nossas autoridades!
Renova em nós um espírito reto, e mantém-nos em sua presença.
amem!
Obrigado!
domingo, 25 de dezembro de 2011
Que Natal?
Para a sociedade distante de Deus, Natal é uma data festiva em cujo o personagem principal é o papel noel e, comumente, em que os familiares e amigos dão presentes uns para os outros.
Para aqueles que não estão distante de Deus, Natal é uma data festiva sim, sem dúvida. Mas o personagem principal é Jesus Cristo. Os presentes também fazem parte das várias maneiras de se comemorar, mas eles não são o foco da festa. O foco é o NASCIMENTO DE JESUS.
Qual Natal vocês está comemorando. O Comercial ou o Bíblico? Pra responder, é só considerar que o significado do Natal é o de ser a data do nascimento de Jesus, não simplesmente na terra, mas principalmente em seu coração.
Jesus já nasceu em seu coração? Você é capaz de sustentar uma resposta afirmativa, publicamente? Caso positivo, Feliz Natal pra vc, parabéns pela sua decisão de deixar que Jesus nascesse um dia em seu coração. Mas, caso contrário, considere mais um fato: Se Natal é o nascimento de Jesus, não existe Natal se Ele não nasceu em seu coração. Portanto, que tipo de Natal vc está comemorando?
Não existe outro Natal senão do nascimento de Jesus Cristo nos corações. Se ainda não o fez, comemore um Natal de verdade aceitando Jesus Cristo como seu único, eterno e suficiente Salvador arrependendo-se de seus pecados, principalmente o de se deixar enganar. Então poderei desejar a você também, de todo o meu coração, um Feliz Natal.
Para aqueles que não estão distante de Deus, Natal é uma data festiva sim, sem dúvida. Mas o personagem principal é Jesus Cristo. Os presentes também fazem parte das várias maneiras de se comemorar, mas eles não são o foco da festa. O foco é o NASCIMENTO DE JESUS.
Qual Natal vocês está comemorando. O Comercial ou o Bíblico? Pra responder, é só considerar que o significado do Natal é o de ser a data do nascimento de Jesus, não simplesmente na terra, mas principalmente em seu coração.
Jesus já nasceu em seu coração? Você é capaz de sustentar uma resposta afirmativa, publicamente? Caso positivo, Feliz Natal pra vc, parabéns pela sua decisão de deixar que Jesus nascesse um dia em seu coração. Mas, caso contrário, considere mais um fato: Se Natal é o nascimento de Jesus, não existe Natal se Ele não nasceu em seu coração. Portanto, que tipo de Natal vc está comemorando?
Não existe outro Natal senão do nascimento de Jesus Cristo nos corações. Se ainda não o fez, comemore um Natal de verdade aceitando Jesus Cristo como seu único, eterno e suficiente Salvador arrependendo-se de seus pecados, principalmente o de se deixar enganar. Então poderei desejar a você também, de todo o meu coração, um Feliz Natal.
quarta-feira, 14 de setembro de 2011
O Cara quando é compentente é outra coisa....
Se você tiver tentando trabalhar com jersey e hibernate juntos, provavelmente você está passando pelo famoso "jars hell". É que o hibernate e o jersey usam versões diferentes de bibliotecas iguais. Não vou entrar em detalhes, mas provavelmente esse competente blogueiro deverá te resolver a questão direitinho....
http://jee-bpel-soa.blogspot.com/2008/11/djunit-coverage-tests-and-unwelcome.html
http://jee-bpel-soa.blogspot.com/2008/11/djunit-coverage-tests-and-unwelcome.html
terça-feira, 23 de agosto de 2011
Eu Concordo...
Não só para área da gestão, mas no dia a dia, tais considerações são pertinentes:
"We can't solve problems by using the same kind of thinking we used when we created them." A.Einstein
No meu inglês:
"Nós não podemos resolver roblemas usando a mesma forma de pensar que foi utilizada quando eles foram criados
A linguagem tem tudo a ver com a visão de mundo que a pessoa tem.
fonte:http://www.webel.com.au/content/tutorial-some-uml-modelling-and-diagramming-tips-tricks-and-best-practices
"We can't solve problems by using the same kind of thinking we used when we created them." A.Einstein
No meu inglês:
"Nós não podemos resolver roblemas usando a mesma forma de pensar que foi utilizada quando eles foram criados
Resumindo o que eu entendi:"In linguistics, the Sapir-Whorf hypothesis (SWH) states that there is a systematic relationship between the grammatical categories of the language a person speaks and how that person both understands the world and behaves in it." (From Wikipedia, the free encyclopedia.)
A linguagem tem tudo a ver com a visão de mundo que a pessoa tem.
fonte:http://www.webel.com.au/content/tutorial-some-uml-modelling-and-diagramming-tips-tricks-and-best-practices
Assinar:
Postagens (Atom)