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]

Responder a