Monthly Archives: Грудень 2013

Скопіювати дерево проекту на інший сервер по трубі

Власне я робив так:

scp -r path/to/source/tree login@host:/path/to/destination/folder

Water valves with spigots

Але потім виявив що scp ходить за символьними посиланнями і копіює все також і там. Від чого іноді зациклюється…

Тому на просторах інтернету мені підказали ідею послати файли через трубу.

Найперша команда – бере вміст директорії, стискає, і посилає стиснені дані в стандартний вивід:

tar czf - path/to/source/tree

І навпаки – прийняти стиснуті дані з stdout і розпакувати їх в поточну директорію.

tar xvzf -

(При цьому директорія tree створиться, якщо дані пакувались з неї.)

Ну і:

ssh login@host "some; commands"

Виконує інші команди на віддаленому сервері. При цьому може приймати щось з stdout, через трубу. Таким чином ця труба веде з сервера на сервер…

І якщо зібрати все до купи:

tar czf - path/to/source/tree | ssh login@host "cd /path/to/destination/folder; tar xvzf -"

Єдина з цим всім проблема – колись таки доведеться вивчити ті всі ключі до tar. :)


Filed under: Інструменти, Кодерство Tagged: linux

Пітер Норвіг подарував мені Схему :)

Для тих хто не знає, Пітер Норвіг це не Миколай, а director of research (керівник дослідженнями) в Google. А також автор грубезної книжки зі штучного інтелекту, і класичної статті Як вивчити програмування за 10 років?.

Але якось випадково блукаючи інтернетом я набрів на статтю: (How to Write a (Lisp) Interpreter (in Python))

Я прочитав, мене поперло, взяв код, перевірив, додав ще функцій, сподобалось ще більше, відкрив SICP, а там:

(define (square x) (* x x))

А в Норвіга define обчислюється так:

elif x[0] == 'define':         # (define var exp)
        (_, var, exp) = x
        env[var] = eval(exp, env)

І якщо var – список, то воно як ключ в env не лізе. Вирішив замінювати

(define (square x) (* x x))

на

(define square (lambda (x) (* x x)))

І переписав так:

        elif x[0] == 'define':         # (define var exp)
            (_, var, exp) = x
            if isa(var, str):
                env[var] = eval(exp, env)
            elif isa(var, list):
                env[var[0]] = eval(['lambda', var[1:], exp])
            else:
                RuntimeError('Cannot assign to constant!')

А потім ще додав до стандартних функцій print, input, а потім getattr, та import, за допомогою яких можна доступитись до всієї стандартної бібліотеки Python.

Потім я за допомогою функцій (ага!) і рекурсії описав цикли while та for і намалював дві пентаграми черепахою:

Але писати цикли функціями коли це повинні бути спеціальні форми (як і cond, та напевне define) – це трохи збоченння. Я почав гуглити про то як реалізовують макроси, і о яке щастя, я знайшов ще другу частину: (An ((Even Better) Lisp) Interpreter (in Python))

А потім може я на цій реалізації пройду SICP і напишу компілятор в байт-код Python. І зроблю про це презентацію до наступного performance appraisal…


Filed under: Кодерство Tagged: книжки, lisp, Python