Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера Жизнь на свободе/Записи в блоге |
Жизнь на свободе
Голосов: 1 Адрес блога: http://sovety.blogspot.com/ Добавлен: 2008-02-19 12:40:29 блограйдером Lurk |
|
Переименование переменных и слияние изменений в Darcs
2009-10-28 17:23:00 (читать в оригинале)Ныне к традиционным холиварам, вроде
vi
против emacs
, прибавился ещё hg
(Mercurial) против git
. И то, и другое — распределённые системы управления версиями (уже написано. Впрочем, выбор этими двумя системами не ограничивается, отдельные маньяки успешно пользуются и другими системами. А среди альтернативных систем совершенно особняком стоит darcs
.Почитал я тут руководство по
darcs
, и обнаружил что есть у него одна удивительная возможность, которой, насколько мне известно, у его более популярных собратьев нет. А именно, поддержка замен в управляемых файлах. Например, можно переименовать в одной ветке функцию или переменную, в другой ветке делать другие изменения, затрагивающие эти же строки, а потом совершенно волшебным способом автоматически объединить изменения обеих веток. И ручное слияние изменений не потребуется. Возможность настолько необычная, что захотелось поделиться.Основное отличие
darcs
от собратьев: он отслеживает не состояние каталога с файлами (и историю его изменений), а хранит сами изменения — патчи. А уж состояние рабочего каталога определяется просто как результат применения всех накопленных изменений-патчей. Всякое такое изменение обратимо, а некоторые можно безболезненно переставлять местами (и это очень облегчает слияния).В случае обычных DVCS, каждое изменение определяется разницей двух состояний каталога. Чтобы объединить такие изменения, нужен их общий «предок», к которому изменения можно применить. В
darcs
изменение не обязательно должно определяться разницей между двумя состояниями каталога. Это позвляет создавать разные типы изменений, и автор может определить что именно изменение делает (семантически). В том числе есть и такой вид изменений: замена слов в файле (token replace patch).Покажу, как это работает, а вы уж сами судите, насколько это круто :-)
Завязка
Итак, создадим вначале исходный репозиторий и поместим в него простую программку. Тут отличия между
darcs
и hg
или git
минимальны:$ mkdir repo-0
$ cd repo-0
repo-0$ darcs init
repo-0$ cat > hello.py
def hello(what):
print "Hello %s" % what
hello("World")
^D
repo-0$ darcs add hello.py
repo-0$ darcs record -m 'initial commit' hello.py
Recording changes in "hello.py":
addfile ./hello.py
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
hunk ./hello.py 1
+def hello(what):
+ print "Hello %s" % what
+
+hello("World")
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'initial commit'
А теперь создадим две ветки. В каждой ветке сделаем свои изменения. В одной (A) изменим название переменной
what
на name
, а в другой (B) переименуем и перепишем функцию hello()
.Внезапно!
Клонируем исходный репозиторий:
repo-0$ cd ..
$ darcs get repo-0 repo-A
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
И переименовываем в этой ветке переменную. Только хитрость, мы хотим не просто сделать замену слов в файле, а мы хотим явно указать
darcs
-у, что это именно замена слов. Поэтому вместо текстового редактора выполняем такую вот команду:$ cd repo-A
repo-A$ darcs replace what name hello.py
Убеждаемся, что программка изменилась:
repo-A$ cat hello.py
def hello(name):
print "Hello %s" % name
hello("World")
И записываем изменения в репозиторий:
repo-A$ darcs record -m 'renamed: what to name' hello.py
Recording changes in "hello.py":
replace ./hello.py [A-Za-z_0-9] what name
Shall I record this change? (1/1) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'renamed: what to name'
Тем временем...
Параллельно создаём другую ветку и как-нибудь меняем функцию
hello
:repo-A$ cd ..
$ darcs get repo-0 repo-B
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
$ cd repo-B
repo-B$ cat > hello.py
def hello(what):
if len(what) > 6:
print "Hello %s" % what
else:
print "Hi %s" % what
hello("World")
^D
Изменения настолько серьёзны, что старое имя функции уже не подходит. Переименовываем её с помощью
darcs replace
:repo-B$ darcs replace hello greet hello.py
И записываем изменения:
repo-B$ darcs record -m 'changed hello and renamed to greet' hello.py
Recording changes in "hello.py":
hunk ./hello.py 2
- print "Hello %s" % what
+ if len(what) > 6:
+ print "Hello %s" % what
+ else:
+ print "Hi %s" % what
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
replace ./hello.py [A-Za-z_0-9] hello greet
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'changed hello and renamed to greet'
Кровавый финал
А теперь возвращаемся в исходный репозиторий и объединяем изменения:
repo-B$ cd ../repo-0
repo-0$ darcs pull ../repo-A ../repo-B
Wed Oct 28 17:21:41 CET 2009 me@example.com
* changed hello and renamed to greet
Shall I pull this patch? (1/2) [ynWsfvplxdaqjk], or ? for help: y
Wed Oct 28 17:12:12 CET 2009 me@example.com
* renamed: what to name
Shall I pull this patch? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished pulling and applying.
И что же мы видим?
repo-0$ cat hello.py
def greet(name):
if len(name) > 6:
print "Hello %s" % name
else:
print "Hi %s" % name
greet("World")
Изменения объединились правильно. Система управления версиями оказалась достаточно умной, чтобы применить изменения в нужном порядке (вначале переписать функцию, а уж потом переименовать все случаи использования переменной).
Я впечатлён.
Переименование переменных и слияние изменений в Darcs
2009-10-28 17:23:00 (читать в оригинале)Ныне к традиционным холиварам, вроде
vi
против emacs
, прибавился ещё hg
(Mercurial) против git
. И то, и другое — распределённые системы управления версиями (уже написано. Впрочем, выбор этими двумя системами не ограничивается, отдельные маньяки успешно пользуются и другими системами. А среди альтернативных систем совершенно особняком стоит darcs
.Почитал я тут руководство по
darcs
, и обнаружил что есть у него одна удивительная возможность, которой, насколько мне известно, у его более популярных собратьев нет. А именно, поддержка замен в управляемых файлах. Например, можно переименовать в одной ветке функцию или переменную, в другой ветке делать другие изменения, затрагивающие эти же строки, а потом совершенно волшебным способом автоматически объединить изменения обеих веток. И ручное слияние изменений не потребуется. Возможность настолько необычная, что захотелось поделиться.Основное отличие
darcs
от собратьев: он отслеживает не состояние каталога с файлами (и историю его изменений), а хранит сами изменения — патчи. А уж состояние рабочего каталога определяется просто как результат применения всех накопленных изменений-патчей. Всякое такое изменение обратимо, а некоторые можно безболезненно переставлять местами (и это очень облегчает слияния).В случае обычных DVCS, каждое изменение определяется разницей двух состояний каталога. Чтобы объединить такие изменения, нужен их общий «предок», к которому изменения можно применить. В
darcs
изменение не обязательно должно определяться разницей между двумя состояниями каталога. Это позвляет создавать разные типы изменений, и автор может определить что именно изменение делает (семантически). В том числе есть и такой вид изменений: замена слов в файле (token replace patch).Покажу, как это работает, а вы уж сами судите, насколько это круто :-)
Завязка
Итак, создадим вначале исходный репозиторий и поместим в него простую программку. Тут отличия между
darcs
и hg
или git
минимальны:$ mkdir repo-0
$ cd repo-0
repo-0$ darcs init
repo-0$ cat > hello.py
def hello(what):
print "Hello %s" % what
hello("World")
^D
repo-0$ darcs add hello.py
repo-0$ darcs record -m 'initial commit' hello.py
Recording changes in "hello.py":
addfile ./hello.py
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
hunk ./hello.py 1
+def hello(what):
+ print "Hello %s" % what
+
+hello("World")
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'initial commit'
А теперь создадим две ветки. В каждой ветке сделаем свои изменения. В одной (A) изменим название переменной
what
на name
, а в другой (B) переименуем и перепишем функцию hello()
.Внезапно!
Клонируем исходный репозиторий:
repo-0$ cd ..
$ darcs get repo-0 repo-A
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
И переименовываем в этой ветке переменную. Только хитрость, мы хотим не просто сделать замену слов в файле, а мы хотим явно указать
darcs
-у, что это именно замена слов. Поэтому вместо текстового редактора выполняем такую вот команду:$ cd repo-A
repo-A$ darcs replace what name hello.py
Убеждаемся, что программка изменилась:
repo-A$ cat hello.py
def hello(name):
print "Hello %s" % name
hello("World")
И записываем изменения в репозиторий:
repo-A$ darcs record -m 'renamed: what to name' hello.py
Recording changes in "hello.py":
replace ./hello.py [A-Za-z_0-9] what name
Shall I record this change? (1/1) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'renamed: what to name'
Тем временем...
Параллельно создаём другую ветку и как-нибудь меняем функцию
hello
:repo-A$ cd ..
$ darcs get repo-0 repo-B
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
$ cd repo-B
repo-B$ cat > hello.py
def hello(what):
if len(what) > 6:
print "Hello %s" % what
else:
print "Hi %s" % what
hello("World")
^D
Изменения настолько серьёзны, что старое имя функции уже не подходит. Переименовываем её с помощью
darcs replace
:repo-B$ darcs replace hello greet hello.py
И записываем изменения:
repo-B$ darcs record -m 'changed hello and renamed to greet' hello.py
Recording changes in "hello.py":
hunk ./hello.py 2
- print "Hello %s" % what
+ if len(what) > 6:
+ print "Hello %s" % what
+ else:
+ print "Hi %s" % what
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
replace ./hello.py [A-Za-z_0-9] hello greet
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'changed hello and renamed to greet'
Кровавый финал
А теперь возвращаемся в исходный репозиторий и объединяем изменения:
repo-B$ cd ../repo-0
repo-0$ darcs pull ../repo-A ../repo-B
Wed Oct 28 17:21:41 CET 2009 me@example.com
* changed hello and renamed to greet
Shall I pull this patch? (1/2) [ynWsfvplxdaqjk], or ? for help: y
Wed Oct 28 17:12:12 CET 2009 me@example.com
* renamed: what to name
Shall I pull this patch? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished pulling and applying.
И что же мы видим?
repo-0$ cat hello.py
def greet(name):
if len(name) > 6:
print "Hello %s" % name
else:
print "Hi %s" % name
greet("World")
Изменения объединились правильно. Система управления версиями оказалась достаточно умной, чтобы применить изменения в нужном порядке (вначале переписать функцию, а уж потом переименовать все случаи использования переменной).
Я впечатлён.
Микросоветы
2009-10-16 21:40:00 (читать в оригинале)Всё чаще в твиттер
одной строкой пост целый
пишу на память.
Не растекаясь мыслею по древу и без лишних аннотаций, предлагаю вам список коротких советов и ссылок, настоящих жемчужин, накопившихся в моём твиттере, записанных мной самим, тщательно упорядоченных ныне по темам и ранжированных с точки зрения общечеловеческих ценностей.
Приёмы работы
LaTeX и вёрстка
Программирование
Находки (всякие программки)
в .XCompose добавить...
ffmpeg2theora
версии не ниже 0.25. На сайте разработчиков есть и бинарные сборки.xset dpms force off
. Отсюда.sed
-ом: sed '/^\s*$/d'
.:make
можно сделать так: :set makeprg=dot\ -Tpng\ %\ \\\|display\ png:- errorformat='' autowrite
. Подставить название используемой программы (dot
, neato
, fdp
, ...).cat /dev/urandom | tr -d -c 'a-zA-Z0-9' | fold -w 8 | head -1
fdupes
в командной строке, fslint
— утилита с графическим интерфейсом.dpkg-divert
.sudo -i
имитирует логин под рутом (даёт #
). Бывает полезно (раньше sudo su -
иногда пользовался).ffmpeg -itsoffset -1 -i видеофайл.avi -vcodec mjpeg -vframes 1 -an -y -f rawvideo -s 320x240 картинка.jpg ; doneКак создавать картинки из PDF:
convert -thumbnail 300x300 документ.pdf[0] -gravity center -extent 300x300 картинка.png
RFC 2346.
samepage
. Это частый вопрос.list
вместо itemize
. Пример.\setlength{\parskip}{10pt plus 1pt minus 1pt}
. Особенно полезно в наборе без абзацного отступа. Отсюда.\sidebyside{}{}
:\newsavebox{\leftbox}\newlength{\leftboxheight}\newcommand{\sidebyside}[2]{\sbox{\leftbox}{#1}\settoheight{\leftboxheight}{\usebox{\leftbox}}\usebox{\leftbox}\raisebox{0.5\leftboxheight}{#2}}Смотрите пример использования.
pdftk первый.pdf второй.pdf cat output новый.pdf
@vlasovskikh подсказал, что для больших списков izip
будет быстрее (проверили, так).
Atrack — анонимный открытый битторент трекер для Google App Engine. Всего 246 строк кода.
make
, умеет писать в архив. Использование: fuse-zip архив.zip /точка/монтированияЕсть также avfs, которая монтирует любые архивы, но не пишет и не такая удобная. Её использовать так:
mountavfs ; ls ~/.avfs/полный/путь/к/архиву.zip#/файл/в/архивеВ Debian нужно предварительно добавить пользователя в группу fuse.
gitit
. Самая простая вики для совместной работы над математическими текстами (вместе с jsMath
из коробки). Хранилище — git или darcs.Ух-ты, а немало получилось.
Тэги: latex, openoffice, python, видео, графика, командный, программирование, ссылка, строка
Постоянная ссылка
Микросоветы
2009-10-16 21:40:00 (читать в оригинале)Всё чаще в твиттер
одной строкой пост целый
пишу на память.
Не растекаясь мыслею по древу и без лишних аннотаций, предлагаю вам список коротких советов и ссылок, настоящих жемчужин, накопившихся в моём твиттере, записанных мной самим, тщательно упорядоченных ныне по темам и ранжированных с точки зрения общечеловеческих ценностей.
Приёмы работы
LaTeX и вёрстка
Программирование
Находки (всякие программки)
в .XCompose добавить...
ffmpeg2theora
версии не ниже 0.25. На сайте разработчиков есть и бинарные сборки.xset dpms force off
. Отсюда.sed
-ом: sed '/^\s*$/d'
.:make
можно сделать так: :set makeprg=dot\ -Tpng\ %\ \\\|display\ png:- errorformat='' autowrite
. Подставить название используемой программы (dot
, neato
, fdp
, ...).cat /dev/urandom | tr -d -c 'a-zA-Z0-9' | fold -w 8 | head -1
fdupes
в командной строке, fslint
— утилита с графическим интерфейсом.dpkg-divert
.sudo -i
имитирует логин под рутом (даёт #
). Бывает полезно (раньше sudo su -
иногда пользовался).ffmpeg -itsoffset -1 -i видеофайл.avi -vcodec mjpeg -vframes 1 -an -y -f rawvideo -s 320x240 картинка.jpg ; doneКак создавать картинки из PDF:
convert -thumbnail 300x300 документ.pdf[0] -gravity center -extent 300x300 картинка.png
RFC 2346.
samepage
. Это частый вопрос.list
вместо itemize
. Пример.\setlength{\parskip}{10pt plus 1pt minus 1pt}
. Особенно полезно в наборе без абзацного отступа. Отсюда.\sidebyside{}{}
:\newsavebox{\leftbox}\newlength{\leftboxheight}\newcommand{\sidebyside}[2]{\sbox{\leftbox}{#1}\settoheight{\leftboxheight}{\usebox{\leftbox}}\usebox{\leftbox}\raisebox{0.5\leftboxheight}{#2}}Смотрите пример использования.
pdftk первый.pdf второй.pdf cat output новый.pdf
@vlasovskikh подсказал, что для больших списков izip
будет быстрее (проверили, так).
Atrack — анонимный открытый битторент трекер для Google App Engine. Всего 246 строк кода.
make
, умеет писать в архив. Использование: fuse-zip архив.zip /точка/монтированияЕсть также avfs, которая монтирует любые архивы, но не пишет и не такая удобная. Её использовать так:
mountavfs ; ls ~/.avfs/полный/путь/к/архиву.zip#/файл/в/архивеВ Debian нужно предварительно добавить пользователя в группу fuse.
gitit
. Самая простая вики для совместной работы над математическими текстами (вместе с jsMath
из коробки). Хранилище — git или darcs.Ух-ты, а немало получилось.
Как нарисовать стрелку в Inkscape
2009-09-22 04:03:00 (читать в оригинале)Очень люблю Inkscape, и часто в нём рисую разные схемы. А для того, чтобы рисовать схемы, нужны стрелки. Готового инструмента «стрелка» в Инкскейпе нет*, поэтому творю из подручных материалов сообразно вкусу и потребностям. В общем-то, минутное дело, умеючи...
Я подумал, что кому-то, возможно, будет интересно увидеть, как можно самому нарисовать практически любую стрелку. Предлагаю небольшой видеоурок, где показываю как нарисовать стрелку попроще и стрелку позатейливей:
* В инкскейпе есть маркеры конца и начала линии. Красить их нельзя, они всегда чёрные. Впрочем, подсказывают из зала, можно — создав стрелку, надо «оконтурить обводку», получить два контура (древко и острие), вручную их подправить-подравнять, и получится полноценная контурная стрелка. Я пока остаюсь приверженцем своего способа создания контурных стрелок. Впрочем, смотрите на другой способ сами (подал идею и сделал видео freedomfidaj).
Категория «Бизнес»
Взлеты Топ 5
+1006 |
1094 |
ДеВаЧкА-НеФоРмАлКа |
+989 |
1001 |
White_Rabbit_Pics |
+988 |
1000 |
Смотрим на жизнь сквозь сетку |
+934 |
1101 |
Вадим Гоц |
+928 |
932 |
Блог о подарках и праздниках |
Падения Топ 5
-1 |
10 |
Блог Находчивого Продавца |
-1 |
459 |
alexfox2011 - BLOG.I.UA |
-2 |
3 |
Деньги в интернете |
-5 |
992 |
Allendy.ru - экономический портал |
-6 |
729 |
Натяжные потолки Херсон |
Популярные за сутки
Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.
взяты из открытых общедоступных источников и являются собственностью их авторов.