Автор Тема: Lua  (Прочитано 106819 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #300 : Декабрь 09, 2012, 05:16:05 pm »
Запилил тулзу для сравнения отчетов по конфигурациям 1С:
local BOM = string.char( 0xef, 0xbb, 0xbf )

local function print_tree(tree, indent)
    indent = indent or 0
    for _, branch in ipairs(tree.children) do
        io.write(string.rep('\t', indent) .. branch.value, '\n')
        if branch.children then
            print_tree(branch, indent + 1)
        end
    end
end

local function comp(a, b)
    return a.value < b.value
end

local function read(file)
    local line = file:read()
    if not line then
        error('empty file')
        return nil
    end
    local _, indent = line:find('^\t+')
    indent = indent or 0
    local last = indent
    local first = indent
    local tree = {children = {}}
    local branch
    local symbol = ''
    while line do
        _, indent = line:find('^\t+')
        indent = indent or 0
        if indent < first then
            error('wrong indentation')
            return nil
        end
        if indent > last then
            tree = branch
            tree.children = {}
            last = last + 1
        else
            while indent < last do
                table.sort(tree.children, comp)
                tree = tree.parent
                last = last - 1
            end
        end
        symbol = line:sub(indent + 1, indent + 1)
        if (symbol == ' ' or symbol == '"') then
            branch = {parent = tree, value = line:sub(indent + 2, -2)}
        else
            branch = {parent = tree, value = line:sub(indent + 1)}
        end
        table.insert(tree.children, branch)
        line = file:read()
    end
    while tree.parent do
        table.sort(tree.children, comp)
        tree = tree.parent
    end
    table.sort(tree.children, comp)
    return tree
end

local function diff(t1, t2, indent, index, res)

    local c1, c2 = t1.children, t2.children
    local i, j = 1, 1
    local n1, n2 = c1 and c1[i], c2 and c2[j] -- nodes
    local temp = 0

    while n1 or n2 do
        index = index + 1
        if not n1 or (n2 and (n1.value > n2.value)) then
            j = j + 1
            res[index] = '-->' .. string.rep('\t', indent) .. n2.value
        elseif not n2 or (n1 and (n1.value < n2.value)) then
            i = i + 1
            res[index] = '<--' .. string.rep('\t', indent) .. n1.value
        else
            i = i + 1
            j = j + 1
            temp = diff(n1, n2, indent + 1, index, res)
            if temp > index then
                res[index] = '   ' .. string.rep('\t', indent) .. n1.value
                index = temp
            else
                res[index] = nil
                index = index - 1
            end
        end
        n1, n2 = c1 and c1[i], c2 and c2[j]
    end

    return index

end

local function print_diff(t1, t2)
    local res = {}
    if diff(t1, t2, 1, 0, res) > 0 then
        for _, v in pairs(res) do
            print(v)
        end
    end
end

local file1 = arg[1] and io.open(arg[1])
local file2 = arg[2] and io.open(arg[2])
if file1 then
    if file2 then
        if file1:read(3) == BOM then
            assert(file2:read(3) == BOM, arg[2] .. ' not UTF-8 with BOM')
            os.execute("chcp 65001 > nul")
            io.write(BOM)
        else
            file1:seek('set')
            assert(not (file2:read(3) == BOM), arg[2] .. ' not ANSI')
            file2:seek('set')
            os.execute("chcp 1251 > nul")
        end
        local tree1 = read(file1)
        local tree2 = read(file2)
        if tree1 and tree2 then
            print_diff(tree1, tree2)
        else
            print('epic fail...')
        end
    else
        if file1:read(3) == BOM then
            os.execute("chcp 65001 > nul")
            io.write(BOM)
        else
            os.execute("chcp 1251 > nul")
            file1:seek('set')
        end
        local tree = read(file1)
        if tree then
            print_tree(tree)
        end
    end
else
    print [[

    Usage: diff_conf.lua first_file [second_file] [> result_file]

    Examples:
        c:\>diff_conf.lua conf.txt
        c:\>diff_conf.lua conf.txt > conf_sorted.txt
        c:\>diff_conf.lua conf1.txt conf2.txt
        c:\>diff_conf.lua conf1.txt conf2.txt > conf1_vs_conf2.txt
    ]]
end

Опубликовал на infostart:
http://infostart.ru/public/165529/

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Lua
« Ответ #301 : Декабрь 10, 2012, 10:00:03 am »
Ну, строчку-другую, то проблем нет. А вот 700 строк за день? Причем это полезный выхлоп, а в реальности приходится написать раза в два больше.

А что, это много? 1500-2000 строк - обычно для одного дня... (Разумеется, месячная производительность не вычисляется как 2000*20, но когда с нуля хреначится какой-то компонент - то 2000 в день - норм.)

http://discuss.joelonsoftware.com/default.asp?joel.3.286106.22#discussTopic286976
Цитировать
Wow Sgt Sausage averages 250,000 handwritten lines of code a year. That's quite impressive. Most of the best programmers I know do only 35,000 or so. The industry average has been measured at 3250 lines of code per year.
 Art Wilkins
 9 января 2006 г.
То есть Илья прямо таки бьёт мировые рекорды по написанию кода! о_О )) У среднего прогаммиста всего-то 13 строк кода в день выходит (3250/(50*5)), а Илья же в год не меньше 400 тыс. строк пишет!!! Это даже больше, чем у какого-то там Сержанта Сосиски!!! )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DIzer

  • Гость
Re: Lua
« Ответ #302 : Декабрь 10, 2012, 10:07:47 am »

То есть Илья прямо таки бьёт мировые рекорды по написанию кода! о_О )) У среднего прогаммиста всего-то 13 строк кода в день выходит (3250/(50*5)), а Илья же в год не меньше 400 тыс. строк пишет!!! Это даже больше, чем у какого-то там Сержанта Сосиски!!! )))
  :D так и живет он не в Чирчике.. а  рядом с цивилизацией (как и Борис)- там темп жизни другой...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Lua
« Ответ #303 : Декабрь 10, 2012, 10:23:24 am »

То есть Илья прямо таки бьёт мировые рекорды по написанию кода! о_О )) У среднего прогаммиста всего-то 13 строк кода в день выходит (3250/(50*5)), а Илья же в год не меньше 400 тыс. строк пишет!!! Это даже больше, чем у какого-то там Сержанта Сосиски!!! )))
  :D так и живет он не в Чирчике.. а  рядом с цивилизацией (как и Борис)- там темп жизни другой...
Ну я хоть и живу в Чирчике, но работаю в Ташкенте, тут темпы не меньше, чем у Ильи в городе, я думаю ))) Народу уж точно юольше ))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Lua
« Ответ #304 : Декабрь 10, 2012, 10:32:48 am »
То есть Илья прямо таки бьёт мировые рекорды по написанию кода! о_О )) У среднего прогаммиста всего-то 13 строк кода в день выходит (3250/(50*5)), а Илья же в год не меньше 400 тыс. строк пишет!!! Это даже больше, чем у какого-то там Сержанта Сосиски!!! )))
Без generic контейнеров, без LINQ приходится туго.
Каждый раз связный список руками херачить...
Да еще 0 в конце строки искать.
« Последнее редактирование: Декабрь 10, 2012, 10:34:32 am от Peter Almazov »

DIzer

  • Гость
Re: Lua
« Ответ #305 : Декабрь 10, 2012, 10:34:28 am »
думаю что  меньше.. я вот живу в Челябинске (тоже народу хватает в сравнении с Орлом) - но разница чувствуется..Впрочем, постойте.. неужели вы намекаете на то что Илья лжет? -- вы ставите под сомнение слова управленца с 10 летним стажем, а программиста - даже страшно подумать с каким (чуть ли не с рождения) -с чего такое недоверие..? сказал полторы тысячи (не ежедневно) - значит так оно и есть.  ;)

DIzer

  • Гость
Re: Lua
« Ответ #306 : Декабрь 10, 2012, 10:36:14 am »
То есть Илья прямо таки бьёт мировые рекорды по написанию кода! о_О )) У среднего прогаммиста всего-то 13 строк кода в день выходит (3250/(50*5)), а Илья же в год не меньше 400 тыс. строк пишет!!! Это даже больше, чем у какого-то там Сержанта Сосиски!!! )))
Без generic контейнеров, без LINQ приходится туго.
Каждый раз связный список руками херачить...
Да еще 0 в конце строки искать.
я полагаю, что все дело в ЦД и светлом пути, осененным Виртом и Сиськиным (других соображений нет).

DIzer

  • Гость
Re: Lua
« Ответ #307 : Декабрь 10, 2012, 10:43:02 am »
приблизительно вот так.. http://www.youtube.com/watch?v=pk3Qf7l2GSk

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Lua
« Ответ #308 : Декабрь 10, 2012, 10:53:56 am »
Впрочем, постойте.. неужели вы намекаете на то что Илья лжет? -- вы ставите под сомнение слова управленца с 10 летним стажем, а программиста - даже страшно подумать с каким (чуть ли не с рождения) -с чего такое недоверие..? сказал полторы тысячи (не ежедневно) - значит так оно и есть.  ;)
Ну не прямо-таки лжёт, но, возможно, несколько преувеличивает?
"Однажды я поймал ВООООТ такую рыбу!!!" )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #309 : Декабрь 10, 2012, 11:50:20 am »
Ну, строчку-другую, то проблем нет. А вот 700 строк за день? Причем это полезный выхлоп, а в реальности приходится написать раза в два больше.

А что, это много? 1500-2000 строк - обычно для одного дня... (Разумеется, месячная производительность не вычисляется как 2000*20, но когда с нуля хреначится какой-то компонент - то 2000 в день - норм.)
Я просто взял то, что осталось в памяти и поделил на три, ибо память лжет и склонна преувеличивать собственные заслуги. :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

DIzer

  • Гость
Re: Lua
« Ответ #310 : Декабрь 10, 2012, 12:39:04 pm »

Я просто взял то, что осталось в памяти и поделил на три, ибо память лжет и склонна преувеличивать собственные заслуги. :-)
Однако, батенька - вы не лишены амбиций... а  я просто делю на 10 (отчасти просто потому что это проще чем на 3)  ;)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #311 : Декабрь 10, 2012, 01:31:36 pm »
1500-2000 каждый день конечно никто не пишет. Так и линух за неделю можно переписать.

Но для одного дня объем вполне нормальный, если это не сложный код. (и не Оберон  ;D )
2000 за день не писал, но 1000-1500 бывало.

И кстати что значит "за день"? У меня например фактический рабочий день обычно больше юридического...  :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #312 : Декабрь 10, 2012, 01:37:34 pm »
Я кстати однажды пытался прикинуть свою производительность в минутах на строчку.
Измерял на нескольких разработках средней сложности. Вышло около 5 минут на строчку. (включая общение с постановщиком, кодинг и дебаг)

Сложные вещи пишу сильно дольше  :D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #313 : Декабрь 10, 2012, 01:54:02 pm »
Я кстати однажды пытался прикинуть свою производительность в минутах на строчку.
Измерял на нескольких разработках средней сложности. Вышло около 5 минут на строчку. (включая общение с постановщиком, кодинг и дебаг)

Сложные вещи пишу сильно дольше  :D

У меня бывает 50 строк в месяц :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #314 : Декабрь 10, 2012, 01:57:31 pm »
"Однажды я поймал ВООООТ такую рыбу!!!" )))

https://www.youtube.com/watch?v=TY1ymotP0P0
 ;D