?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Пластик течёт и меняется
nyaload
_winnie
При печати в "хорошем качестве" (с толщиной слоя в 0.1mm) постоянно возникают проблемы. Решил для отладки напечатать разнообразные маленькие кубики 1x1x3см с разной температурой печати. Фото: http://dobrokot.ru/pics/i2015-12-30__08-05-17_531kb.jpg

5 кубиков на переднем плане с подписью 240° - отличаются тем, что более качественные кубики напечатаны по 4 штуки за один раз. И поэтому предыдущие слои успели остыть, за счет чего качество и улучшилось. Вывод: калибровочные кубики полезны очень ограничено, так как отличаются от реальных более крупных моделей размером.

Это синтетическая демонстрация того, что качество печати модели зависит не только от настроек принтера, и даже не только от локальной формы модели, но и от наличия далёких частей (из-за которых слои по-другому остывают). Есть параметр Minimal Layer Duration, определяющий минимальное время для перехода на следующий слой, но дефолтного значения в 5сек явно не хватает для стабильного остывания предыдущего слоя.



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


Я попробовал печатать при запрещенных всеми гайдами 275 градусах. Кубик 1x1x3 см, вышел пусть и со слегка смазаными углами, но не обуглившийся и не в виде лужи (см. группое фото в начале поста). Правда пугают, "это потому что он постоянно вытекает, если бы остановился - то тут же бы превратился в уголь и закупорил бы головку навсегда". Что будет если остановить печать с разогретой головкой - решил не проверять, запасных головок у меня нет. Но это пугает, так как получается что температура выходящего пластика и качество модели зависит и от того, насколько велика пауза перед выходом этого пластика (например, после печати поддержки другим экструдером).

Кубик 4x4x4 на запрещённых 260° - получился вообще идеальным.

Смазанность на разных углах разная, т.е. получается что качество модели в разных её местах зависит не только от настроек печати, высоты, но и от того, северную или южную часть мы печатаем (возможно, от неоднородности потоков воздуха)

Выяснилась так же грустная вещь, что столь полезный вентиляр для охлаждения пластика - отсутствует в моём MakerBot Replicator 2x (можно добавить самостоятельно, но я не буду рисковать пока у меня нет лишних 3d принтеров)
Tags: ,

code reuse
nyaload
_winnie
Переиспользование кода и его универсализация под разных пользователей приводят примерно к таким интерфейсам.

Эта функция - зачитывает читает файл с текстовой таблицей:

pandas.read_table(filepath_or_buffer, sep='\t', dialect=None, compression='infer', doublequote=True, escapechar=None, quotechar='"', quoting=0, skipinitialspace=False, lineterminator=None, header='infer', index_col=None, names=None, prefix=None, skiprows=None, skipfooter=None, skip_footer=0, na_values=None, true_values=None, false_values=None, delimiter=None, converters=None, dtype=None, usecols=None, engine=None, delim_whitespace=False, as_recarray=False, na_filter=True, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None, warn_bad_lines=True, error_bad_lines=True, keep_default_na=True, thousands=None, comment=None, decimal='.', parse_dates=False, keep_date_col=False, dayfirst=False, date_parser=None, memory_map=False, float_precision=None, nrows=None, iterator=False, chunksize=None, verbose=False, encoding=None, squeeze=False, mangle_dupe_cols=True, tupleize_cols=False, infer_datetime_format=False, skip_blank_lines=True)

Иммутабельность мешает иммутабельности
nyaload
_winnie
Всё-таки мутабельность объектов в небольших пределах - иногда весьма облегчает написание алгоритмов. Это здорово, когда можно в небольшом обозримом участке кода создать объект A, перебросить на него указатели из другого уже созданного объекта B (который мы только что создали), и отложить заполнение полей A до того момента, когда они станут известны. Но в иммутабельном языке - невозможно создать объект, пока мы не знаем все параметры для его создания, и это дико мешает при переложении известных алгоритмов на такой язык. Нужно вводить дополнительные структуры данных, чтобы поменять порядок создания объектов A и B, так как мы в случае иммутабельности не можем создать A, а потом провести из него указатель в B.

Например, пусть пишем персистентное дерево. Персистентное - это значит слегка изменённые клоны этого дерева создаются легко, и при этом мы не теряем оригинал. Как дерево директорий файловой системы в системе контроля версий - мы при модификации этого дерева и файлов в нём не разрушаем информацию о предыдущих версиях (подробней о сортах персистентности).
То есть, если нам надо создавать персистентные структуры данных, то с одной стороны в иммутабельном ЯП и не можем сделать не-персистентные, что типа должно помогать. С другой стороны - он мешает реализовать промежуточную постройку таких структур в недостроенном состоянии, требуя построить шпиль башни до её фундамента, и запрещая все иные способы постройки.

Это, например, мешает переписывать из википедии алгоритм персистентного красно-черного дерева на такой язык. Там есть подзадача, похожая на такую: в односвязном списке поменять значение ноды с удаляемым значением где-то внутри списка на значение из ноды в конце списка. Список персистентный, поэтому "поменять" означает "создать клон с нужным изменением".
В языке, где можно менять значения полей объекта - всё тривиально, решается в один проход от начала до конца списка.
Идем от начала до нужной внутренней ноды списка, пока идём - создаем дубликаты проходимых нод. Когда нашли нужную ноду - запоминаем указатель на её дубликат, доходим до конца списка, копируем значение в созданный дубликат. Лишней памяти, при условии что нам надо сохранить и старый список (персистентность в copy-on-write её варианте) - не тратится.


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

полиномиальный хеш aka кольцевой хеш Рабина-Карпа aka хеш для олимпиад...
nyaload
_winnie
при использовании "естественного" модуля 2^64 ломается вот таким неожиданно красивым образом:
http://codeforces.com/blog/entry/4898
Tags: ,

π++
nyaload
_winnie
в С++ нет числа π в стандартной библиотеке. M_PI/_USE_MATH_DEFINES зачем-то сломали в g++ при использовании -std=c++11, а взамен ничего не предложили.

http://stackoverflow.com/questions/1727881/how-to-use-the-pi-constant-in-c

В результате проще в каждом cpp файле копипастить строчку «const double pi = 3.14159265358979323846;» (или «constexpr auto pi = 3.14159265358979323846» в c++11, или acos(-1) вместо константы).

--------------
PS. этот пост дубликат предыдущего, предыдущий я удалил из-за этого бага. Уже оставленные чужие коментарии достал из почты, скопирую в комментарии.
Tags:

строка по номеру
nyaload
_winnie
Есть такой забавный рекурсивный алгоритм перечисления всех строк (использущий yield из питона):

letters = "abcdefghijklmnopqrstuvwxyz"
def all_strings():
    yield ''
    for s in all_strings():
        for c in letters:
            yield s + c


Чтобы перечислить все строки - перечисляем все строки и добавляем варианты суффиксов a,b,c,...,z. Благодаря yield '' у вложенных вызываемых генераторов всегда есть достаточно ответов для более высокоуровневых, и поэтому функция не зависает.


Его можно механически, не думая, трансформировать в более полезную функцию "дай строку по номеру" (следующим шагом рекурсия легко заменяется на цикл). Просто заменяем все циклы на вычисление длины этого цикла.

def string_by_index(i):                  
    if i == 0:                           
        return ''                        
                                         
    i -= 1                               
                                         
    s = string_by_index(i // len(letters))  
    return s + letters[i % len(letters)] 
Tags:

\includegraphics{formula.jpg}
nyaload
_winnie
При использовании планшета и компьютера для записи формул - можно легко копировать формулы, переписывая только нужные кусочки. Я уже много лет страдаю, что при переписывании длинных формул на доске и бумаге - теряются случайные куски, и из-за того что лень переписывать - хочется сделать побольше преобразований за один раз.
Легко переставить на новое место, или перенести на новую строку, если не хватило места.

Ну и делать произвольные пометки (с цветом лучше быть аккуратней, при распечатке на ч/б принтере он пропадает).

Когда преподаватели не ограничивают тебя LaTeX и готовы разбирать каракули - это прекрасно.

Выглядит это примерно так (вторая строчка- скопипащенная первая с затертыми сократившимися членами):


Read more...Collapse )
Tags: , ,

Свет ← нормаль ← касательная ←траектория ← [dx,dy] ← кисточка
nyaload
_winnie
В Krita есть мощный редактор кисточек, который позволяет в том числе установить зависимость цвета кисточки от её направления движения.
А движение по контуру объекта - определяет нормаль в этой точке (для не слишком большого объекта или при проекции похожей на параллельную).
А нормаль - определяет освещенность объекта (дифузную составляющую для далёкого источника).

Это позволяет довольно быстро раскрашивать матовых осьминогов.
Первый грубый вариант освещения получен при помощи этой кисточки за пару минут, и ещё минут 10 я правил недокрашенное, плюс ещё 10 всякую ерунду.
Придуманная кисточка мягкая с одной стороны, и с жестким краем с другой, это позволяет получить четкую границу с одной стороны движения, и плавно закрашенную с другой.


Предварительный набросок (без глаз, это неправильно): Read more...Collapse )

Как выглядит мазок этой кисточкой: Read more...Collapse )

Грубый вариант раскраски: Read more...Collapse )

И в конце:
Tags: ,

Krita rotational symmetry
nyaload
_winnie
В Krita есть режим рисования, в котором автоматически применяется поворотная симметрия. Это позволяет легко стыковать сектора поворотной симметрии, и за минуту нарисовать что-то такое -



Вот бы ещё такой режим для других мозаик, тогда было бы легко делать Эшеро-подобные сюжеты
Tags:

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

Tags: