История изменений
Исправление torvn77, (текущая версия) :
А, и скажи какую точно реализацию grep и sort ты используешь.
Я с этим багом столкнулся несколько лет назад и с тех пор таких объёмных фильтраций и сортировок вроде как не делал, в общем помню только сам факт.
Давай конкретный пример входных данных,
Объём данных точно не помню, но думаю что если в сумме все фай будут 100 мегабайт то этот баг обязательно проявится.
скажи чем конкретно отличается результат в этих случаях,
Просто часть строк, которая по идее должна проходить цепочку будет потеряна, и это не обязательно конец, в чём собственно и состоит коварство бага, если бы я не писал запросы/команды в множестве вариантов, а отдал только один раз то я бы ничего и не заметил.
Если я правильно помню то впервые я столкнулся с этим когда пытался выявить все возможные строки конфигурации постпроцессоров для ArtCAM. В них нет ничего сложного, это просто файлы вида
;
; LinuxCNC - G-Code XYZ Artcam post processor
FORMAT = [N|@|N|1.0]
LINE_NUM_START = 0
LINE_NUM_INCREMENT = 10
LINE_NUM_MAXIMUM = 999999
;
;Стандарт окончания строки в Linux:
;END_OF_LINE = "[10]"
;Стандарт окончания строки в Windows(Default):
FORMAT = [XMAX|@|X|+1.4]
;
; Формат и правила подстановки координаты Y и параметров на её основе.
FORMAT = [Y|@|Y|+1.4]
; Y-координата домашней точки ПРОГРАММЫ.
FORMAT = [YH|@|Y|+1.4]
; Крайние точки рельефа по координате Y
FORMAT = [YMIN|@|Y|+1.4]
FORMAT = [YMAX|@|Y|+1.4]
;
; Формат и правила подстановки координаты Z и параметров на её основе.
FORMAT = [Z|@|Z|+1.4]
; Z-координата домашней точки ПРОГРАММЫ.
FORMAT = [ZH|@|Z|+1.4]
; Безопасная высота по Z
FORMAT = [SZ|@|Z|+1.4]
; Крайние точки рельефа по координате Z
FORMAT = [ZMIN|@|Z|+1.4]
FORMAT = [ZMAX|@|Z|+1.4]
;
; Как я предпологаю,Арткамовская ось вращения R соответствует одной из следующих осей LinuxCNC:U,V,W (ещё есть оси A,B,C)
; Но какой именно? U что-ли?
; Формат и правила подстановки координаты оси вращения R и параметров на её основе.
FORMAT = [R|@|U|+1.4]
; R-координата домашней точки ПРОГРАММЫ.
FORMAT = [RH|@|U|+1.4]
;
; Coordinated helical motion ("Arc feed")
FORMAT = [I|@|I|+1.4]
FORMAT = [J|@|J|+1.4]
;
; Формат скорости перемещения ((units|mm)/min),автоматически назначаемой Арткамом выбором из переменных
; [FR],[FC] или [FP] соответствующих текущему инструменту или траекторий.
FORMAT = [F|@|F|1.1]
; Формат скорости быстрого перемещения (units|mm)/min
FORMAT = [FR|@|F|1.1]
; Формат скорости врезания (units|mm)/min
FORMAT = [FP|@|F|1.1]
; Формат скорости подати материала (units|mm)/min
FORMAT = [FC|@|F|1.1]
;
;
; ######## Program moves ########
;
;
; Размер рабочего стола X=700 Y=800 z=100 .
; Место для ручной смены инструмента X=350 Y=150 z=100 .
; Место парковки портала после окончания исполнения программы X=350 Y=800 z=100 .
; Максимальная скорость линейного перемещения станка X=Y=Z=8 м/сек.
; Параметры ПК позволяют развивать скорость до X=Y=Z=3,3 м\сек.
;
; Установка скорости БЫСТРОГО перемещения [FR] в максимальное для станка значение.
; В LinuxCNC используется S-образный график ускорения,так что резкого торможения и связанных с ним проскоков координат быть не должно.
RAPID_FEED_RATE = 3300
;
; Задание команды изменения скорости перемещения.
; Но я поставил эти комманды непосредственно в строки и поэтому этот параметр стал не нужным и закоментирован.
;FEED_RATE_CHANGE = "[F|#] [S|#] ( FRC )"
;
; Задание команды подъёма по Z .
RETRACT_MOVE = "[FR] [S|#] G00 [X|#] [Y|#] [Z|#] ( RtM [F] )"
;
; Задание команды опускания по Z.
PLUNGE_RATE_MOVE = "[FP] [S|#] G01 [X|#] [Y|#] [Z|#] ( PM [F] )"
;
; Задание в сокращённой и полной (FIRST_) форме команды быстрого перемещения.
FIRST_RAPID_RATE_MOVE = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#] ( F_RRM )"
RAPID_RATE_MOVE = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#]"
;
; Задание в сокращённой и полной (FIRST_) форме команды линейной резки.
FIRST_FEED_RATE_MOVE = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#] (F_FRM)"
FEED_RATE_MOVE = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге по часовой стрелке.
FIRST_CW_ARC_MOVE = "[F|#] [S|#] G02 [X] [Y] [I] [J] (F_CW)"
CW_ARC_MOVE = "[F|#] [S|#] G02 [X] [Y] [I] [J]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге против часовой стрелки.
FIRST_CCW_ARC_MOVE = "[F|#] [S|#] G03 [X] [Y] [I] [J] (F_CCW)"
CCW_ARC_MOVE = "[F|#] [S|#] G03 [X] [Y] [I] [J]"
;
;
; ######## END Program moves ########
;
;
START = " "
START = " "
START = " ( Variables status: )"
START = " "
START = " ( S=[S] )"
; Переход в XY "дом" программы и остановка на безопасной высоте.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
START = "G53 G0 Z100"
START = "G00 [XH] [YH]"
START = "G00 [SZ]"
; Включение основного охлаждения
START = "M8"
; Включение доплнительного охлаждения
;START = "M7"END Set up program header ########)"
START = " "
START = " "
;
;
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (######## Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в положение для ручной смены инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G53 G0 X350 Y150"
; Смена инструмента
TOOLCHANGE = "T[T] M06"
; Переход в область измерения параметров компенсаций инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
; Задание настроек инструмента,коррекция на длинну и диаметр.
; Пока просто отключаем до понимания того,как это делать.
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в XY "дом" программы и остановка на безопасной высоте SZ.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
TOOLCHANGE = "G00 [SZ]"
; Включение основного охлаждения
TOOLCHANGE = "M8"
; Включение доплнительного охлаждения
;TOOLCHANGE = "M7"
; Включение шпинделя,установка подачи на подачу врезания(предосторожность) и установка частоты вращения шпинделя
TOOLCHANGE = "M03 [S] [FP]"
; Пауза на 10 сек.,чтобы шпиндель успел разогнаться
TOOLCHANGE = "G04P10"
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (######## END Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
;
;
;
END = " "
END = " "
END = " (######## End of file ########)"
Задача была собрать все возможные начала строк для чего делались фильтры типа
’cat *.con | grep ’ = ‘| sort -u’
Различной изощерённости.
(Постпроцессор был сокращён так как не влезал в пост, таких постпроцессоров у арткама было весьма много)
Исходная версия torvn77, :
А, и скажи какую точно реализацию grep и sort ты используешь.
Я с этим багом столкнулся несколько лет назад и с тех пор таких объёмных фильтраций и сортировок вроде как не делал, в общем помню только сам факт.
Давай конкретный пример входных данных,
Объём данных точно не помню, но думаю что если в сумме все фай будут 100 мегабайт то этот баг обязательно проявится.
скажи чем конкретно отличается результат в этих случаях,
Просто часть строк, которая по идее должна проходить цепочку будет потеряна, и это не обязательно конец, в чём собственно и состоит коварство бага, если бы я не писал запросы/команды в множестве вариантов, а отдал только один раз то я бы ничего и не заметил.
Если я правильно помню то впервые я столкнулся с этим когда пытался выявить все возможные строки конфигурации постпроцессоров для ArtCAM. В них нет ничего сложного, это просто файлы вида
;
; LinuxCNC - G-Code XYZ Artcam post processor
FORMAT = [N|@|N|1.0]
LINE_NUM_START = 0
LINE_NUM_INCREMENT = 10
LINE_NUM_MAXIMUM = 999999
;
;Стандарт окончания строки в Linux:
;END_OF_LINE = "[10]"
;Стандарт окончания строки в Windows(Default):
FORMAT = [XMAX|@|X|+1.4]
;
; Формат и правила подстановки координаты Y и параметров на её основе.
FORMAT = [Y|@|Y|+1.4]
; Y-координата домашней точки ПРОГРАММЫ.
FORMAT = [YH|@|Y|+1.4]
; Крайние точки рельефа по координате Y
FORMAT = [YMIN|@|Y|+1.4]
FORMAT = [YMAX|@|Y|+1.4]
;
; Формат и правила подстановки координаты Z и параметров на её основе.
FORMAT = [Z|@|Z|+1.4]
; Z-координата домашней точки ПРОГРАММЫ.
FORMAT = [ZH|@|Z|+1.4]
; Безопасная высота по Z
FORMAT = [SZ|@|Z|+1.4]
; Крайние точки рельефа по координате Z
FORMAT = [ZMIN|@|Z|+1.4]
FORMAT = [ZMAX|@|Z|+1.4]
;
; Как я предпологаю,Арткамовская ось вращения R соответствует одной из следующих осей LinuxCNC:U,V,W (ещё есть оси A,B,C)
; Но какой именно? U что-ли?
; Формат и правила подстановки координаты оси вращения R и параметров на её основе.
FORMAT = [R|@|U|+1.4]
; R-координата домашней точки ПРОГРАММЫ.
FORMAT = [RH|@|U|+1.4]
;
; Coordinated helical motion ("Arc feed")
FORMAT = [I|@|I|+1.4]
FORMAT = [J|@|J|+1.4]
;
; Формат скорости перемещения ((units|mm)/min),автоматически назначаемой Арткамом выбором из переменных
; [FR],[FC] или [FP] соответствующих текущему инструменту или траекторий.
FORMAT = [F|@|F|1.1]
; Формат скорости быстрого перемещения (units|mm)/min
FORMAT = [FR|@|F|1.1]
; Формат скорости врезания (units|mm)/min
FORMAT = [FP|@|F|1.1]
; Формат скорости подати материала (units|mm)/min
FORMAT = [FC|@|F|1.1]
;
;
; ######## Program moves ########
;
;
; Размер рабочего стола X=700 Y=800 z=100 .
; Место для ручной смены инструмента X=350 Y=150 z=100 .
; Место парковки портала после окончания исполнения программы X=350 Y=800 z=100 .
; Максимальная скорость линейного перемещения станка X=Y=Z=8 м/сек.
; Параметры ПК позволяют развивать скорость до X=Y=Z=3,3 м\сек.
;
; Установка скорости БЫСТРОГО перемещения [FR] в максимальное для станка значение.
; В LinuxCNC используется S-образный график ускорения,так что резкого торможения и связанных с ним проскоков координат быть не должно.
RAPID_FEED_RATE = 3300
;
; Задание команды изменения скорости перемещения.
; Но я поставил эти комманды непосредственно в строки и поэтому этот параметр стал не нужным и закоментирован.
;FEED_RATE_CHANGE = "[F|#] [S|#] ( FRC )"
;
; Задание команды подъёма по Z .
RETRACT_MOVE = "[FR] [S|#] G00 [X|#] [Y|#] [Z|#] ( RtM [F] )"
;
; Задание команды опускания по Z.
PLUNGE_RATE_MOVE = "[FP] [S|#] G01 [X|#] [Y|#] [Z|#] ( PM [F] )"
;
; Задание в сокращённой и полной (FIRST_) форме команды быстрого перемещения.
FIRST_RAPID_RATE_MOVE = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#] ( F_RRM )"
RAPID_RATE_MOVE = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#]"
;
; Задание в сокращённой и полной (FIRST_) форме команды линейной резки.
FIRST_FEED_RATE_MOVE = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#] (F_FRM)"
FEED_RATE_MOVE = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге по часовой стрелке.
FIRST_CW_ARC_MOVE = "[F|#] [S|#] G02 [X] [Y] [I] [J] (F_CW)"
CW_ARC_MOVE = "[F|#] [S|#] G02 [X] [Y] [I] [J]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге против часовой стрелки.
FIRST_CCW_ARC_MOVE = "[F|#] [S|#] G03 [X] [Y] [I] [J] (F_CCW)"
CCW_ARC_MOVE = "[F|#] [S|#] G03 [X] [Y] [I] [J]"
;
;
; ######## END Program moves ########
;
;
START = " "
START = " "
START = " ( Variables status: )"
START = " "
START = " ( S=[S] )"
; Переход в XY "дом" программы и остановка на безопасной высоте.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
START = "G53 G0 Z100"
START = "G00 [XH] [YH]"
START = "G00 [SZ]"
; Включение основного охлаждения
START = "M8"
; Включение доплнительного охлаждения
;START = "M7"END Set up program header ########)"
START = " "
START = " "
;
;
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (######## Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в положение для ручной смены инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G53 G0 X350 Y150"
; Смена инструмента
TOOLCHANGE = "T[T] M06"
; Переход в область измерения параметров компенсаций инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
; Задание настроек инструмента,коррекция на длинну и диаметр.
; Пока просто отключаем до понимания того,как это делать.
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в XY "дом" программы и остановка на безопасной высоте SZ.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
TOOLCHANGE = "G00 [SZ]"
; Включение основного охлаждения
TOOLCHANGE = "M8"
; Включение доплнительного охлаждения
;TOOLCHANGE = "M7"
; Включение шпинделя,установка подачи на подачу врезания(предосторожность) и установка частоты вращения шпинделя
TOOLCHANGE = "M03 [S] [FP]"
; Пауза на 10 сек.,чтобы шпиндель успел разогнаться
TOOLCHANGE = "G04P10"
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (######## END Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
;
;
;
END = " "
END = " "
END = " (######## End of file ########)"
Задача была собрать все возможные начала строк для чего делались фильтры типа
’cat *.con | grep ’ = ‘| sort -u’
Различной изощерённости.