Nano hacks: самые полезные крошечные программы, которые вы закодировали или попали

Это первая великая добродетель программистов. У всех нас есть, в свое время автоматизированная задача с небольшим количеством кода выброса. Иногда требуется несколько секунд, выбирая один лайнер, иногда мы тратим непомерное количество времени, автоматизируя двухсекундную задачу, а затем никогда больше не используем ее.

Какой крошечный взлом вы нашли достаточно полезным для повторного использования? Сделать так, чтобы сделать псевдоним?

Примечание. Прежде чем отвечать, пожалуйста, проверьте, чтобы он не был на любимых командных трюках с использованием BASH или вопросов perl/ruby ​​one-liner.

Ответ 1

Я нашел это на dotfiles.org только сегодня. это очень просто, но умно. я чувствовал себя глупо, даже не подумав об этом.

###
###   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
}

Ответ 2

Здесь фильтр, который помещает запятые в середину любых больших чисел в стандартный ввод.

$ 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 $_;
}

Я обычно использую его для длинных выходных списков больших чисел, и я устаю от подсчета десятичных знаков. Теперь вместо просмотра

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

Я могу запустить это как ls -l | comma и увидеть

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

Ответ 3

Этот script сохранил мою карьеру!

Несколько лет назад я работал удаленно в клиентской базе данных. Я обновил груз, чтобы изменить его статус. Но я забыл, где предложение.

Я никогда не забуду ощущения в яме живота, когда увижу (6834 строки затронуты). В основном я всю ночь проводил журналы событий и выяснял надлежащий статус на всех этих отправлениях. Дерьмо!

Итак, я написал script (изначально в awk), который запустил транзакцию для любых обновлений и проверил бы строки, затронутые до совершения. Это не давало никаких сюрпризов.

Итак, теперь я никогда не делаю обновления из командной строки, не проходя через script, как это. Вот он (сейчас в 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)

Ответ 4

Я использую этот script под различными linuxes, чтобы проверить, работает ли копия каталога между машинами (или на CD/DVD) или копирование (например, ext3 utf8 filenames → fusebl k) искал специальные символы в именах файлов.

#!/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

Ответ 5

Извините, у вас нет точного кода, но я закодировал регулярное выражение для поиска исходного кода в VS.Net, что позволило мне искать что-либо не в комментариях. Он очень полезен в конкретном проекте, над которым я работал, где люди настаивали на том, что комментирование кода является хорошей практикой, в случае, если вы хотите вернуться и посмотреть, что использовал код.

Ответ 6

У меня есть два рубиновых скрипта, которые я регулярно меняю, чтобы загрузить все различные веб-коммиксы. Очень удобно! Примечание: для них требуется wget, поэтому, возможно, linux. Примечание2: прочитайте их перед тем, как вы их попробуете, они нуждаются в небольшой модификации для каждого сайта.

Загружаемый по дате загрузчик:

#!/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

Или вы можете использовать номер на основе:

#!/usr/bin/ruby -w

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

Ответ 7

Вместо того, чтобы многократно открывать файлы в SQL Query Analyzer и запускать их, я нашел синтаксис, необходимый для создания пакетного файла, и затем мог запустить 100 сразу. О сладкая сладкая радость! Я использовал это с тех пор.

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

Ответ 8

Это относится к моим дням COBOL, но у меня было две общие программы COBOL, одна партия и одна онлайн (люди из мэйнфрейма будут знать, что это такое). Они были оболочками программы, которые могли принимать любой набор параметров и/или файлов и выполняться, запускаться или исполняться в тестовом регионе IMS. Я настроил их так, чтобы в зависимости от параметров я мог обращаться к файлам, базам данных (DB2 или IMS DB) и просто манипулировать рабочим хранилищем или любым другим.

Это было здорово, потому что я мог проверить эту функцию даты, не догадываясь или проверяя, почему произошло усечение или почему была база данных ABEND. С течением времени программы росли в размерах и включали в себя всевозможные тесты и стали основным продуктом группы разработчиков. Все знали, где код находился и включал их в их модульное тестирование. Эти программы стали настолько большими (большая часть кода была прокомментирована), и все это было сделано людьми на протяжении многих лет. Они спасли так много времени и устроили так много разногласий!

Ответ 9

Я закодировал Perl script для сопоставления зависимостей, не входя в бесконечный цикл. Для унаследованной программы на C, которую я унаследовал...., которая также имела проблему зависимости от алмаза.

Я написал небольшую программу, которая отправила мне электронное письмо, когда я получил электронные письма от друзей, на редко используемой учетной записи электронной почты.

Я написал еще одну небольшую программу, которая отправила мне текстовые сообщения, если меняет домашний IP-адрес.

Чтобы назвать несколько.

Ответ 10

Несколько лет назад я построил набор приложений на пользовательской платформе веб-приложений в PERL. Одна интересная функция заключалась в том, чтобы преобразовать строки SQL-запросов в читаемые пользователем сообщения, которые описывали результаты.

Код был относительно коротким, но конечный эффект был приятным.

Ответ 11

У меня есть небольшое приложение, которое вы запускаете, и оно сбрасывает GUID в буфер обмена. Вы можете запустить его /noui или нет. С пользовательским интерфейсом, это единственная кнопка, которая при каждом щелчке мыши выводит новый GUID. Без него падает новый, а затем выходит.

Я в основном использую его из VS. Я использую его как внешнее приложение и сопоставляется с ярлыком. Я пишу приложение, которое сильно зависит от xaml и guids, поэтому я всегда нахожу, что мне нужно вставить новый guid в xaml...

Ответ 12

Каждый раз, когда я пишу умное понимание списка или использование map/reduce в python. Был один такой:

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

Причина, по которой я помню, это то, что я сам ее придумал, а затем увидел тот же самый код на другом сайте. Теперь, возможно, это будет сделано, например:

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

Ответ 13

У меня есть 20 или 30 таких вещей, потому что, как только я закодировал фреймворк для своего стандартного консольного приложения в окнах, я могу в значительной степени отказаться от любой логики, которую я хочу, поэтому я получил много таких мелочей, которые решать конкретные проблемы.

Я думаю, что те, что я сейчас использую, - это консольное приложение, которое принимает stdin и раскрашивает результат на основе xml-профилей, которые соответствуют регулярным выражениям для цветов. Я использую его для просмотра файлов журнала из сборщиков. Другой - это пусковая установка командной строки, поэтому я не загрязняю свой PATH env var и в любом случае превысит лимит на некоторых системах, а именно win2k.

Ответ 14

Я постоянно подключаюсь к различным серверам linux со своего рабочего стола в течение всего рабочего дня, поэтому я создал несколько псевдонимов, которые запустили xterm на этих машинах и установили название, цвет фона и другие настройки:

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 ..."

Ответ 15

У меня есть куча серверов, к которым я часто подключаюсь, но они все в моей локальной сети. Этот Ruby script выводит команду на создание псевдонимов для любой машины с открытым ssh:

#!/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

Используйте это как в .bash_profile:

eval `ruby ~/.alias_shares`