Paulo Roberto Bagatini escreveu: > Disponibilizei para download a primeira versao do QS em BASh + Xdialog: > > <http://www.ceat.net/~arkanon/scripts/?shoooqs.sh> > > Como gostaria de comentarios sobre o codigo, algoritmo e demais > informacoes colocadas no script, vou postar abaixo o codigo completo. > > Na forma atual, ele tem 15279 bytes em 486 linhas. > > [] > > -- > > #!/bin/bash > # ATENCAO: nao modifique a linha acima. O script tem caracteristicas que > # exigem que o shell seja executado como 'bash' e nao 'sh'. > > > > short="ShOOoQS" > pronuncia="xucs" > long="Shell script OpenOffice.org QuickStarter" > version="0.1" > date="2008/01/30 (Qua) 15:37:23 (BRDT)" > author="Arkanon" > email="[EMAIL PROTECTED]" > > comment=" > A ultima versao deste script pode ser obtida em > <http://www.ceat.net/~arkanon/scripts/?shoooqs.sh> > > Eventualmente, mais coisas uteis/inuteis/curiosas sobre varios > assuntos podem vir a ser disponibilizadas (ou nao) em > <http://www.ceat.net/~arkanon/> > " > > > > # [Licensa de Uso] > # > # Esse script eh distribuido sem nenhuma garantia, mas com a esperanca > # que possa vir a ser util a mais alguem. Eu nao assumo qualquer > # responsabilidade por qualquer dano fisico, logico ou moral que o uso > # dele possa acarretar na sua instalacao, maquina, rede ou cerebro. > # Utilize-o por sua propria conta e risco. > # > # Voce e livre para usar, copiar, modificar e passar adiante esse > # script; tudo o que eu peco eh que mantenha os creditos originais. Se > # encontrar erros ou tiver sugestoes que possam melhora-lo ou ajusta-lo > # a outras situacoes, sinta-se a vontade para publica-los ou envia-los > # para mim. > > > > # [Versoes dos principais softwares usados no desenvolvimento do script] > # > # - Slackware [[12.0]] *sem* GNOME > # - Kernel [[2.6.24]] compilado com os parametros do Kernel Huge SMP > # default do Slackware Current > # - XOrg [[1.3.0]] com a extensao GLX ativada > # - IceWM [[1.2.35]] oriundo do repositorio > # <http://repository.slacky.eu/> > # - Xdialog [[2.3.1]] para Slackware 10.2, oriundo do repositorio > # <http://linuxpackages.net/> > # - GNU sed [[4.1.5]] > # - GNU bash [[3.1.17(2)]] > # - BrOffice.org [[2.3 680m9(Build:9238), AKA 2.3.1rc1]] de > # [[13/11/2007]] para Linux, oriundo do site <http://broffice.org/> > # - conta de usuario comum > # > # Na sua maquina: > # ( > # cat /etc/slackware-version > # gnome-about --version > # uname -sr > # Xorg -version 2>&1 | head -2 | tail -1 > # Xorg :999 -probeonly -verbose 2>&1 | grep extensions > # icewm --version > # Xdialog --print-version > # sed --version | head -1 > # bash --version | head -1 > # soffice -h 2>&1 | head -1 > # whoami > # ) > > > > # [Consideracoes, Caracteristicas e Deficiencias] > # > # "Bugs documentados tornam-se caracteristicas." :-p > # > # Antes de mais nada, uma rapida analise a cerca do uso nao apenas desse > # script, mas de qualquer iniciador rapido de qualquer aplicativo. > # > # Um iniciador rapido garante um aumento na velocidade de carregamento > # de um aplicativo a custa de uma determinada quantidade de memoria que > # fica destinada a conter uma instancia de parte do aplicativo, mas cuja > # efetiva utilizacao depende do usuario. > # > # Pode ser interessante ter a impressao que o aplicativo abriu mais > # rapido, mesmo que isso signifique perder parte da memoria quando ele > # nao estiver sendo utilizado. Ganha-se alguns segundos. Contudo, > # considerando que atualmente muitos SO's deixam aplicativos recem > # fechados num cache de disco em memoria (livre), a menos que > # - o aplicativo esteja sendo executado pela primeira vez (desde que > # o computador foi ligado), ou > # - tenha sido fechado a muito tempo, ou; > # - muita memoria tenha sido utilizada para outros fins, ou > # - o cache tenha sido esvaziado, > # na pratica, nao fara diferenca deixar ou nao uma instancia escondida. > # > # Eh de se avaliar entao, se a relacao > # > # custo (memoria) / beneficio (velocidade) > # > # nao fica alta demais. Vai depender da maquina que se tem (CPU-RAM-HD), > # da instalacao do aplicativo (local, CD, rede) e do uso que se faz > # dele. > # > # No caso do BrOffice.org [[2.3.1]] para Linux, que eh o aplicativo e > # plataforma para o qual esse script se destina, 21MB de RAM serao > # destinados a aceleracao da carga do programa. > # > # Se considerarmos esse script na sua forma mais crua, basicamente o que > # ele faz eh: > # > # while true; do ps -C soffice.bin || soffice -nologo -nodefault; done > # > # Ou seja: enquanto nao ha uma instancia do OOo rodando, ele executa uma > # sem interface. Entao, quando executamos o OOo da forma tradicional, ja > # foram carregadas as bibliotecas mais pesadas e tudo o que ele precisa > # fazer eh carregar a UI (User Interface). Quando saimos da interface > # (fechamos o writer, calc, etc) ele finaliza tambem a instancia sem > # interface, e entao nao ha mais nenhum OOo rodando. Isso torna o loop > # infinito necessario. > # > # O ShOOoQS esta longe de ser perfeito, mas, dado o devido tempo e um > # numero suficiente de olhos, um dia ele sera ;-) > # > # 1. Para comecar, ele nao consegue diferenciar o processo do ooo sem > # interfece do processo dos aplicativos do ooo. Quando se escolhe a > # opção de sair, entao, se nao ha nenhum aplicativo do ooo aberto ou > # seja, ha apenas o ooo sem ui, esse processo fica pendente em > # background, e eh necessario mata-lo a mao. Se, tentando solucionar > # esse problema, for usado o procedimento de matar o processo do ooo > # na saida do script, entao, se houver aplicativos do ooo abertos, > # eles eh que serao mortos ja que, uma vez executado algum aplicativo > # do ooo, o ooo sem ui eh substituido pelo aplicativo. > # > # Por outro lado, se ha algum aplicativo do ooo aberto e saimos do > # ShOOoQS sem matar o processo, quando o ultimo aplicativo for > # fechado, nao restara nenhum processo do ooo pendente. Nesse caso > # nao ha problemas. > # > # 2. O uso de uma constante com o suposto tempo em que o ooo fica no > # cache apos ser finalizado tambem nao eh o mais adequado. Certamente > # esse tempo depende da memoria disponivel e dos aplicativos que > # serao executados quando o ooo nao estiver mais rodando. A solucao > # ideal eh conseguir verificar se o aplicativo ainda se encontra no > # cache ou nao e, no segundo caso, executa-lo novamente. Seria uma > # especie de 'ps', que ao inves de retornar o pid de processo em > # execucao, retornaria o nome de processos que ainda permanecem em > # cache. Aparentemente o comando 'lsof' eh capaz de fazer isso, mas > # ate o momento nao descobri como. Desconheco qualquer ferramenta com > # esse proposito especifico, e nao encontrei no Google nenhuma > # referencia sobre o assunto, utilizando as palavras-chaves que > # imaginei serem adequadas. > # > # 3. Ele foi criado especialmente para uso com o IceWM, mas nada impede > # que seja utilizado (com eventuais adaptacoes) em qualquer outro WM. > # A principal razao da sua criacao eh que o OOOQS2 eh feito para uso > # no KDE, e portanto, ao ser executado por outro WM, carrega junto > # inumeros processo especificos do KDE e indesejados, no meu caso. > # Para que ele rode no IceWM de forma semelhante ao OOOQS2 ou o > # QuickStarter do Windows, eh necessario associar a classe da janela > # do menu em Xdialog a algum icone e seta-la para que fique no tray > # menu: > # > # cp -a <path_para>/shoooqs_16x16.xpm /usr/share/icewm/icons/ > # > # cat << EOT >> /usr/share/icewm/winoptions > # # <http://www.icewm.org/manual/icewm-14.html> > # shoooqs.icon: shoooqs > # shoooqs.allWorkspaces: 1 > # shoooqs.ignoreQuickSwitch: 1 > # shoooqs.tray: Exclusive > # shoooqs.layer: OnTop > # shoooqs.geometry: -0+0 > # shoooqs.fClose: 0 > # shoooqs.dClose: 0 > # shoooqs.fMaximize: 0 > # shoooqs.dMaximize: 0 > # shoooqs.fMove: 0 > # shoooqs.dMove: 0 > # shoooqs.fResize: 0 > # shoooqs.dResize: 0 > # shoooqs.fHide: 0 > # shoooqs.dHide: 0 > # shoooqs.fRollup: 0 > # shoooqs.dRollup: 0 > # shoooqs.fTitleBar: 0 > # shoooqs.dTitleBar: 0 > # EOT > # > # Acrescentar em '/etc/X11/xinit/xinitrc.icewm': > # shoooqs & > # > # 4. Por default, a janela do menu aparece sempre centralizada na tela. > # O ideal eh que apareca proximo ao tray menu. Esse problema foi > # resolvido usando o parametro shoooqs.geometry no arquivo winoptions > # do IceWM. > # > # 5. A janela do menu deveria minimizar automaticamente ao entrar no > # IceWM e apos a selecao de alguma opcao. Talvez seja possivel fazer > # isso usando alguma ferramenta de linha de comando para controle de > # janelas de WM's que seguem o padrao "FreeDesktop" > # <http://www.freedesktop.org/>. > # > # 6. A selecao de opcoes precisa de dois cliques, ou um clique na opcao > # e um clique no botao 'Executar'. Eh uma caracteristica do Xdialog, > # mas o ideal eh poder selecionar a opcao com um unico clique. > # > # 7. Conforme a versao do seu pacote do Xdialog e a configuracao do seu > # sistema, voce pode ter problemas com caracteres ISO-Latinos. O > # Pacote 'yudit' <http://linuxpackages.net/> possui uma ferramenta > # chamada 'uniconv', que realiza conversao entre os mais variados > # conjuntos de caracteres. ATENCAO: muitas distribuicoes possuem uma > # ferramenta chamada uniconv, que provavelmente pertence ao pacote > # netatalk e nao eh o mesmo uniconv do yudit. > # > # 8. A opcao de reiniciar o ShOOoQS esta comentada. Ela ainda nao > # funciona satisfatoriamente. Servira para recarregar o script quando > # seu codigo fonte for alterado. > > > > # Por quanto tempo o aplicativo permanece em cache apos ser finalizado? > time_in_cache=5 # minutos > > > > # Acrescente ou remova (#) opcoes do menu alterando a variavel abaixo. > # Sintaxe: ^[ #](tag)\t+(label)$ > actions=" > -writer Novo Texto (Writer) > -calc Nova Planilha (Calc) > -impress Nova Apresentação (Impress) > -draw Nova Imagem Vetorial (Draw) > -math Nova Fórmula Matemática (Math) > -base Novo Banco de Dados (Base) > -web Novo Documento HTML > -global Novo Documento Mestre > > open Abrir documento > open -n Abrir documento como modelo > open -pt Abrir documento para impressão > open -view Abrir documento no modo readonly > open -show Abrir apresentação para vizualização > > spadm Gerenciamento de Impressoras > > help Ajuda > about Sobre o $short > #restart Reiniciar o $short > #quit Sair do $short > " > > > > help=" > Para executar uma opção, dê um duplo clique na opção ou a selecione \ > e clique em 'OK'. > Para sair do Iniciador Rápido, execute a opção 'Sair' ou clique em \ > 'Cancelar' ou feche a janela. > " > > > > gray="0.875 , 0.875 , 0.875" > blue="0.00 , 0.00 , 1.00" > gtkrc=" > # <http://www.gtk.org/api/2.6/gtk/gtk-Resource-Files.html> > style 'theme' > { > fg[SELECTED] = { $blue } # frente do item selecionado do menu > bg[SELECTED] = { $gray } # fundo do item selecionado do menu > base[NORMAL ] = { $gray } # fundo dos itens do menu > base[ACTIVE ] = { $gray } # bordas dos itens do menu > } > widget '*' style 'theme' > " > > > > script=`basename $0` > tmp="/tmp/$script.$$" > > > > about() > { > title="Sobre o $short" > Xdialog \ > --title "$title" \ > --backtitle "$title" \ > --left \ > --msgbox "$short ($pronuncia) - $long\nv$version - $date\n\n > $author <$email>\n\n$comment" 0 0 > } > > > > help() > { > title="Como usar o $short" > Xdialog \ > --title "$title" \ > --backtitle "$title" \ > --left \ > --msgbox "$help" 0 0 > } > > > > unknown() > { > title="Erro" > Xdialog \ > --title "$title" \ > --backtitle "$title" \ > --left \ > --msgbox "\nAção desconhecida.\n" 0 0 > } > > > > open() > { > > lp="" > > if [ "$1" = -pt ] > then > def_lp=`lpstat -d | cut -d\ -f4` > lplist=`lpstat -a | cut -d\ -f1` > lplist=`paste <(echo "$lplist") <(echo "$lplist")` > nlp=`echo "$lplist" | wc -l` > title="Impressora" > text="Selecione a impressora" > echo "$gtkrc" | Xdialog \ > --title "$title" \ > --rc-file /dev/stdin \ > --no-tags \ > --default-item $def_lp \ > --menubox "$text" 0 0 $[$nlp+1] \ > $lplist \ > 2>| $tmp.lp > retval=$? > lp=`cat $tmp.lp` > case $retval in > 0) echo -n "lp:$lp " ;; > 1) echo -n "lp:cancel " ;; > 255) echo -n "lp:close " ;; > esac > fi > > [ $retval = 0 ] || Xdialog --title "Impressão" \ > --msgbox "\nImpressão cancelada.\n" 0 0 > > if [ "$1" = -pt -a $retval = 0 ] || [ "$1" != -pt ] > then > dir=`cat $tmp.dir 2> /dev/null || echo $HOME` > title="Selecione o arquivo" > file=`Xdialog --title "$title" --fselect $dir 40 80 2>&1` > if [ -e "$file" ] > then > echo -n "file:$file " > dirname $file >| $tmp.dir > soffice $1 $lp $file > fi > fi > > } > > > > echo -e "\n$script trace:" > > > > i=1 > while true > do > # Se nao ha nenhuma instancia do ooo rodando > if ! ps -C soffice.bin &> /dev/null > then > # Executa-o e incrementa a contagem de vezes que ele ja foi executado > echo -en "\n$i: " > soffice -nologo -nodefault &> /dev/null > ((i++)) > fi > # Espera um tempo arbitrario para realizar novamente o teste (e > # eventualmente re-executar o ooo). O tempo deve ser aproximadamente o > # tempo que um aplicativo, apos terminado, permanece no buffer de disco > # na memoria. > # Essa caracteristica do SO de manter aplicativos recem fechados na > # memoria, aliada a esse artificio, diminui o efeito do loop infinito > # sobre o processador. > sleep $[$time_in_cache*60] > done & > > > > ( > > sed_code=' > s/^[ \t]*// > s/[ \t]*$// > s/\([ \t]\)\+/\1/ > s/^$/sep\t/ > /^#/d > s/^/"/ > s/$/" \\/ > s/\t/"\t"/ > 1d > $d > ' > > > title="$short" > text="$short" > actions=`echo "$actions" | sed "$sed_code"` > texth=$[`echo -e "$text" | wc -l`] > menuh=$[`echo -e "$actions" | wc -l`-1] > width=34 > height=$[$texth+$menuh+9] > > while true > do > > echo "$gtkrc" | eval "Xdialog \ > --title \"$title\" \ > --wmclass \"shoooqs\" \ > --ok-label \"Executar\" \ > --cancel-label \"Sair\" \ > --rc-file /dev/stdin \ > --no-tags \ > --menubox \"$text\" $height $width $menuh \ > $actions > 2>| $tmp.action" > retval=$? > action=`cat $tmp.action` > > pid=`ps ho pid -C soffice.bin` > echo -n "($pid) " > > case $retval in > 0) echo -n "$action " > case $action in > sep) ;; > open*) $action & ;; > spadm) spadmin &> /dev/null & ;; > help) help ;; > about) about ;; > # restart) echo "DISPLAY=$DISPLAY $script" | at now ; break ;; > # quit) echo; break ;; > -*) soffice -nologo $action &> /dev/null & ;; > *) unknown ;; > esac ;; > 1) echo "sair" ; break ;; > # 255) echo "close" ; break ;; > esac > > # Este loop infinito fica trancado na janela de menu do Xdialog ate que > # alguma opcao seja selecionada, portanto nao tem efeitos nocivos sobre > # o processador que precisem de sleep para serem amenizados. > > done > > echo > > rm -f $tmp.* > > # Ao sair do ShOOoQS, termina tambem os processos relativos ao ooo. > # Perigoso, pois pode finalizar inadvertidamente aplicativos do ooo com > # documentos nao salvos. > # > # killall -9 sleep soffice.bin spadmin.bin $script &> /dev/null > > # Ao sair o ShOOoQS, finaliza apenas os processos relativos ao script > # propriamente dito. Inadequado, pois ao sair sem nenhuma tela de > # aplicativo do ooo aberta, mantem um processo do ooo consumindo memoria > # que nao sera liberada automaticamente. > # > killall -9 $script &> /dev/null > > ) > > # EOF > Está ótimo. Só gostaria de sugerir que fosse verificado o uso do swap antes de iniciar uma nova instância. O usuário pode estar fazendo outra coisa e precisar de memória livre.
-- Marco de Freitas, NBR para a Internet já! Porque meu navegador não é penico. http://www.softwarelivre.org/news/2472 http://www.w3.org/2003/03/Translations/byLanguage?language=pt-br --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
