2008-10-07 10 views
10

Es el primer great virtue de los programadores. Todos nosotros, en un momento u otro, automatizamos una tarea con un poco de código descartable. A veces lleva un par de segundos tapping en un trazador de líneas, a veces pasamos una cantidad de tiempo exorbitante al automatizar una tarea de dos segundos y luego nunca volver a usarla.Nano hacks: programas pequeños más útiles que ha codificado o encontrado

¿Qué truco ha encontrado útil para reutilizar? ¿Hasta llegar a hacer un alias?

Nota: antes de responder, compruebe que no esté ya en favourite command-line tricks using BASH o en preguntas de una sola línea de perl/ruby.

+0

No estoy votando ninguna respuesta hasta que vea algún código! –

Respuesta

1

Disculpe, no tengo el código exacto a mano, pero codifiqué una expresión regular para buscar el código fuente en VS.Net que me permitió buscar cualquier cosa que no estuviera en los comentarios. Me resultó muy útil en un proyecto en particular en el que estaba trabajando, donde las personas insistían en que el código de comentarios era una buena práctica, en caso de que quisieras volver atrás y ver qué hacía el código.

0

Esto se remonta a mis días de COBOL, pero tenía dos programas COBOL genéricos, uno por lotes y otro en línea (la gente del mainframe sabrá cuáles son). Eran conchas de un programa que podía tomar cualquier conjunto de parámetros y/o archivos y ejecutarse, por lotes o ejecutarse en una región de prueba IMS. Los tuve configurados para que, dependiendo de los parámetros, pudiera acceder a archivos, bases de datos (DB2 o IMS DB) o simplemente manipular el almacenamiento en funcionamiento o lo que sea.

Fue genial porque pude probar esa función de fecha sin adivinar o probar por qué hubo truncamiento o por qué había una base de datos ABEND. Los programas crecieron en tamaño a medida que pasó el tiempo para incluir todo tipo de pruebas y convertirse en un elemento básico del grupo de desarrollo. Todos sabían dónde residía el código y los incluyeron en sus pruebas unitarias también. Esos programas llegaron a ser tan grandes (la mayoría de los exámenes del código fueron comentados) y todo fue contribuido por personas a través de los años. ¡Ahorraron tanto tiempo y resolvieron tantos desacuerdos!

0

He codificado una secuencia de comandos Perl para mapear dependencias, sin entrar en un bucle infinito, para un programa heredado de C que heredé .... que también tenía un problema de dependencia de diamantes.

Escribí un pequeño programa que me enviaba un correo electrónico cuando recibía correos electrónicos de amigos, en una cuenta de correo electrónico raramente utilizada.

Escribí otro pequeño programa que me enviaba mensajes de texto si cambiaba la dirección IP de mi casa.

Para nombrar unos pocos.

0

Hace años construí un conjunto de aplicaciones en una plataforma de aplicaciones web personalizada en PERL. Una característica interesante fue convertir cadenas de consulta SQL en oraciones legibles por humanos que describían los resultados.

El código fue relativamente corto pero el efecto final fue bueno.

0

Tengo una pequeña aplicación que ejecutar y volca un GUID en el portapapeles. Puedes ejecutarlo/noui o no. Con UI, es un botón único que arroja un nuevo GUID cada vez que hace clic en él. Sin él, cae uno nuevo y luego sale.

Lo uso principalmente dentro de VS. Lo tengo como una aplicación externa y asignado a un acceso directo. Estoy escribiendo una aplicación que depende mucho de xaml y guids, así que siempre encuentro que necesito pegar un nuevo guid en xaml ...

1

Tengo dos scripts ruby ​​que modifico regularmente para descargar todos los webcomics. Extremadamente práctico!Nota: Requieren wget, entonces probablemente Linux.Nota 2: léalas antes de probarlas, necesitan un poco de modificación para cada sitio.

Fecha descargador basado:

#!/usr/bin/ruby -w 

Day = 60 * 60 * 24 

Fromat = "hjlsdahjsd/comics/st%Y%m%d.gif" 

t = Time.local(2005, 2, 5) 

MWF = [1,3,5] 

until t == Time.local(2007, 7, 9) 
    if MWF.include? t.wday 
    `wget #{t.strftime(Fromat)}` 
    sleep 3 
    end 

    t += Day 
end 

O puede utilizar el número basa uno:

#!/usr/bin/ruby -w 

Fromat = "http://fdsafdsa/comics/%08d.gif" 
1.upto(986) do |i| 
    `wget #{sprintf(Fromat, i)}` 
    sleep 1 
end 
2

utilizo este guión bajo Linuxes surtidos para comprobar si una copia de directorios entre máquinas (o en las CD/DVD) funcionó o si la copia (por ejemplo, nombres de archivos ext3 utf8 -> fusebl k) ha destrozado caracteres especiales en los nombres de archivo.

#!/bin/bash 
## dsum Do checksums recursively over a directory. 
## Typical usage: dsum <directory> > outfile 

export LC_ALL=C # Optional - use sort order across different locales 

if [ $# != 1 ]; then echo "Usage: ${0/*\//} <directory>" 1>&2; exit; fi 
cd $1 1>&2 || exit 
#findargs=-follow # Uncomment to follow symbolic links 
find . $findargs -type f | sort | xargs -d'\n' cksum 
0

Cada vez que escribo una lista inteligente comprensión o uso de map/reduce en python. Hubo uno como este:

if reduce(lambda x, c: locks[x] and c, locknames, True): 
    print "Sub-threads terminated!" 

La razón por la que recuerdo es que me ocurrió a mí mismo, entonces vi exactamente el mismo código en el sitio web de otra persona. Hoy en día, probablemente se haría como:

if all(map(lambda z: locks[z], locknames)): 
    print "ya trik" 
13

esto lo encontré en dotfiles.org solo hoy. es muy simple, pero inteligente. Me sentí estúpido por no haberlo pensado yo mismo.

### 
### Handy Extract Program 
### 
extract() { 
    if [ -f $1 ] ; then 
     case $1 in 
      *.tar.bz2) tar xvjf $1  ;; 
      *.tar.gz) tar xvzf $1  ;; 
      *.bz2)  bunzip2 $1  ;; 
      *.rar)  unrar x $1  ;; 
      *.gz)  gunzip $1  ;; 
      *.tar)  tar xvf $1  ;; 
      *.tbz2)  tar xvjf $1  ;; 
      *.tgz)  tar xvzf $1  ;; 
      *.zip)  unzip $1  ;; 
      *.Z)   uncompress $1 ;; 
      *.7z)  7z x $1 ;; 
      *)   echo "'$1' cannot be extracted via >extract<" ;; 
     esac 
    else 
     echo "'$1' is not a valid file" 
    fi 
} 
+1

Tenga este en mi bashrc, incluyendo '* .ace) unace x $ 1 ;;' – gnud

5

Aquí hay un filtro que pone las comas en el medio de cualquier número grande en la entrada estándar.

$ cat ~/bin/comma 
#!/usr/bin/perl -p 

s/(\d{4,})/commify($1)/ge; 

sub commify { 
    local $_ = shift; 
    1 while s/^([ -+]?\d+)(\d{3})/$1,$2/; 
    return $_; 
} 

por lo general terminan de usarlo por largas listas de salida de grandes números y los neumáticos I de contar decimales. Ahora, en lugar de ver

-rw-r--r-- 1 alester alester 2244487404 Oct 6 15:38 listdetail.sql 

puedo correr que a medida que ls -l | comma y ver

-rw-r--r-- 1 alester alester 2,244,487,404 Oct 6 15:38 listdetail.sql 
+0

¿qué pasa con ls -lh – Geoff

+0

Claro, ls -lh es una opción, pero este es un problema mayor que las opciones de directorio. –

0

Tengo 20 o 30 de estas cosas por ahí porque una vez codificado el marco para mi aplicación estándar de la consola En Windows, prácticamente puedo incluir cualquier lógica que quiera, así que obtuve muchas de estas pequeñas cosas que resuelven problemas específicos.

Supongo que los que estoy usando mucho en este momento es una aplicación de consola que toma stdin y colorea la salida en función de los perfiles xml que coinciden con expresiones regulares a colores. Lo uso para ver mis archivos de registro de compilaciones. El otro es un iniciador de línea de comando, así que no contaminé mi env PATH var y de todos modos superaría el límite en algunos sistemas, es decir, win2k.

1

En lugar de tener que abrir archivos repetidamente en el Analizador de consultas SQL y ejecutarlos, encontré la sintaxis necesaria para hacer un archivo por lotes, y luego pude ejecutar 100 a la vez. ¡Oh dulce y dulce alegría! Lo he usado desde entonces.

isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt 
0

estoy en constante conexión a diversos servidores Linux de mi propio escritorio a través de mi día de trabajo, por lo que creó algunos alias que pondrá en marcha un xterm en esas máquinas y establecer el título, el color de fondo, y otros ajustes:

alias x="xterm"   # local 
alias xd="ssh -Xf [email protected]_host xterm -bg aliceblue -ls -sb -bc -geometry 100x30 -title Development" 
alias xp="ssh -Xf [email protected]_host xterm -bg thistle1 ..." 
0

que tienen un montón de servidores con frecuencia me conecto a, también, pero todos están en mi red local. Este script de Ruby imprime el comando para crear alias para cualquier máquina con ssh abierto:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'dnssd' 

handle = DNSSD.browse('_ssh._tcp') do |reply| 
    print "alias #{reply.name}='ssh #{reply.name}.#{reply.domain}';" 
end 

sleep 1 
handle.stop 

utilizar de esta manera en su .bash_profile:

 
eval `ruby ~/.alias_shares` 
3

Este script guardado mi carrera!

Hace unos años, estaba trabajando de forma remota en una base de datos de clientes. Actualicé un envío para cambiar su estado. Pero olvidé la cláusula where.

Nunca olvidaré la sensación en la boca del estómago cuando vi (6834 hileras afectadas). Básicamente pasé toda la noche revisando los registros de eventos y averiguando el estado correcto de todos esos envíos. ¡Mierda!

Así que escribí un script (originalmente en awk) que iniciaba una transacción para cualquier actualización y comprobaba las filas afectadas antes de confirmar. Esto evitó sorpresas.

Así que ahora nunca hago actualizaciones desde la línea de comandos sin pasar por un script como este. Aquí está (ahora en Python):

import sys 
import subprocess as sp 
pgm = "isql" 
if len(sys.argv) == 1: 
    print "Usage: \nsql sql-string [rows-affected]" 
    sys.exit() 
sql_str = sys.argv[1].upper() 
max_rows_affected = 3 
if len(sys.argv) > 2: 
    max_rows_affected = int(sys.argv[2]) 

if sql_str.startswith("UPDATE"): 
    sql_str = "BEGIN TRANSACTION\\n" + sql_str 
    p1 = sp.Popen([pgm, sql_str],stdout=sp.PIPE, 
      shell=True) 
    (stdout, stderr) = p1.communicate() 
    print stdout 
    # example -> (33 rows affected) 
    affected = stdout.splitlines()[-1] 
    affected = affected.split()[0].lstrip('(') 
    num_affected = int(affected) 
    if num_affected > max_rows_affected: 
     print "WARNING! ", num_affected,"rows were affected, rolling back..." 
     sql_str = "ROLLBACK TRANSACTION" 
     ret_code = sp.call([pgm, sql_str], shell=True) 
    else: 
     sql_str = "COMMIT TRANSACTION" 
     ret_code = sp.call([pgm, sql_str], shell=True) 
else: 
    ret_code = sp.call([pgm, sql_str], shell=True) 
+1

Es por eso que algunos genios inventaron ** copias de seguridad **. ;) – leemes

Cuestiones relacionadas