• Удобный инструмент для измерений C# кода
    0
    Очень интересно, хотелось бы посмотреть. Поделитесь пожалуйста ссылкой если все же решитесь опубликовать.
  • Удобный инструмент для измерений C# кода
    0
    Оп, извиняюсь, я тут имел ввиду AppMetrics и его аналоги.

    Может быть, не могу сказать.
    никому кроме вас он не нужен

    Не следует говорить за всех)
    лучше протестирован и постоянно обновляется/фиксятся баги

    Вспоминается цитата):
    Есть два способа разработки проекта приложения: сделать его настолько простым, чтобы было очевидно, что в нем нет недостатков, или сделать его таким сложным, чтобы в нем не было очевидных недостатков. Ч. Э. Р. Хоар (C. A. R. Hoare)

    Отчего же не надо, когда тут самый подходящий случай? И тредпул как раз-таки не про множество тредов, а совсем наоборот чтобы треды не плодить.

    Тут наверно можем долго спорить. Как я понимаю основная идея тредпула это ускорить создание потоков, типа кеширования для потоков. Ресурсы под поток выделяются достаточно долго, что легко проверить например создав 10к потоков в цикле. Тредпул на то и пул что содержит уже готовые потоки, которые переиспользуются для выполнения тех же тасков. Поэтому 10к тасков создаются быстро и достаточно быстро обрабатываются на уже готовых потоках. А если у меня 1 поток на все время жизни приложения, зачем же мне таск, хотя не исключаю что его можно использовать. Кстати с тасками и тредпулами тоже есть нюансы, некоторые потоки используются для числодробилок вычислений их создавать больше чем ядер смысла нет. Другие могут использоваться для ввода вывода и большую часть времени висят в блокировке, таких можно создавать почти неограниченно, цпу для них не основной ресурс. Некоторые типы потоков могут потреблять много памяти их количество нужно регулировать по доступной для процесса памяти. В этих случаях под разные задачи приходится писать кастомные тредпулы. В случае создания треда «руками», во всю эту механику не вмешиваемся.
    если бы использовали нормальную очередь

    За это спасибо, подумаю над этим, вполне возможно вы правы, стоит попробовать BlockingCollection.

    Извиняюсь, что несколько резко высказываюсь, с утра воду отключили.

    Понимаю вас, с утра не обнаружить в кране воду это жестко. Казалось бы 21 век, компьютеры, ракеты, а бесперебойную подачу воды реализовать не могут!
  • Удобный инструмент для измерений C# кода
    +4
    Однажды мне попало на поддержку весьма жирное и написанное не по феншую приложение, афтор которого бесследно исчез. Приложение начало сильно тормозить, а оно активно использовалось для решения бизнес задач. И мне пришлось экстремально быстро искать проблему, причем нужно было понять что происходит внутри весьма длинных методов. Тогда буквально за 20 минут и был написан почти этот логер, он помог решить проблему достаточно быстро. Потом я его немного причесал и стал много где использовать, в том числе и вместе с тем же Prometheus. Статью писал исключительно чтобы поделиться идеей, кто-то может столкнуться с похожей задачей, а кто-то может придумать как адаптировать решение для своих целей.
  • Удобный инструмент для измерений C# кода
    +1
    А какие потребности решаются прометеусом? Хранение метрик, да решаются. Здесь я пишу как обложить код измерителями не нарушая его работу, а как хранить вопрос уже другой. На удаленных машинах(подразумевается desctop приложение) может и не быть доступа к серверу прометеуса, а померить что-то нужно, как вариант можно использовать sqlite базу, почему нет.

    Неподдерживаемый код — ну что за инфантильные ярлыки? Ну почему же тредов руками? Первое — тред один. Второе — интересно узнать каким место вы создаете треды? Только не надо писать про Task, он нужен когда создается множество тредов через тредпул(под капотом) и с удобным управлением. Вот насчет try..catch, соглашусь не помешал бы, хотя у меня еще не было в этом месте исключений, но в принципе они возможны. Динамика понятно зачем нужна, чтобы отвязаться от типов, иногда это удобно, например, чтобы писать обработчики для уже существующих или произвольных logItem. Злоупотреблять динамикой не стоит, но иногда и чуть-чуть, где это сэкономит время и силы почему же нет?

    Тред из-баграунд, остановится влсед за приложением. Нет цели собрать абсолютно все измерения, зачем? К тому же даже если остановить тред, в очереди останутся события, и что остановка изменит, зачем это?

    BlockingCollection был бы здесь более подходящим вариантом

    Вполне возможно и лучше, согласен, одно и тоже можно сделать разными способами, выбор способа отчасти вопрос привычки.
  • [PF] Печать PDF под .NET, векторный подход, практика
    0
    Добрый день!

    Интересное наблюдение, спасибо что поделились.

    Отлаживался я на принтере HP_M9050, на бою используются 603 и 606, так же проверял на Lexmark MS810.
  • [SC]Работаем со сканером
    0
    ну даже не знаю что и ответить)

    1. В общем соглашусь, хотя и Configuration отражает суть.
    2. В конкретном случае нет и не подразумевается никакой вложенности и других прелестей json и xml, просто список в 3 столбца, который отлично ложится на CSV. Вернее здесь два списка которые разделяются заголовками. В другом месте за setting.Split(';')[1] и сам может кого побил бы, LoadConfig() завернута в try-catch, вызывается в одном месте. Вариантов два, конфиг либо валидный либо нет и неважно почему.
    3. А оно нужно?

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

    Конечно, имеет смысл сделать все это и залить на гитхаб под свободной лицензией, что возможно и будет сделано. Высокая концентрация магических чисел в методе рисующем звездное небо GetVirtualScan(), его можно совсем убрать, он исключительно для отладки не мучая сканер.
  • [SC]Работаем со сканером
    0
    И способствует быстрому нахождению нужных кнопок, цветное пятно найти проще чем прочитать надпись, не зря АСУТП'эшные экраны такие пестрые, там важна скорость реакции как и здесь.
  • [SC]Работаем со сканером
    0
    можно, но если вдруг понадобится поменять разделитель его придется изменить в двух местах, а не в одном)
  • [SC]Работаем со сканером
    0
    Предпочитаю не стрелять из пушки по воробьям независимо от того как хорошо стреляет пушка)
  • Стандартизация записей
    0
    Вы про абсурдность функции Pattern ()? Мы про необходимость сохранения целостности записей на этапе обработки соответствующих этим записям данных. Заметим, что функция Pattern () упоминается вскользь. Если кому-то проще обращение к тому, что называется 'нормальные системы класса ETL/MDM/DQ', то это ничего не меняет. Смотрите нашу новую статью в продолжение темы конвертации — 'Адаптация SQL' о совместимости СУБД, где в PostgreSQL создается БД из скрипта MySQL
  • [PF] Печать PDF под .NET, векторный подход, практика
    0
    Xps рассматривал как вариант, но так и не понял как там указать лоток принтера для каждой страницы документа. Потом вариант с PCL показался не сложным, кроме того его можно так же просто реализовать не только на .Net потому и остановился на PCL + GhostScript.

    Интересно как узнать про ваше решение, т.е. как получали xps фалы, приходилось ли их модифицировать для многолотковой печати и как?
  • [PF] Печать PDF под .NET, векторный подход, практика
    0
    Верно, у GhostScript лицензия AGLP, поэтому либо покупать версию для коммерческого использования, либо открывать исходники
  • [PF] Печать PDF под .NET, векторный подход, теория
    0
    Работаю над продолжением, там будет пример на C#. Хотя действительно, идею из данной статьи можно реализовать на чем угодно.
  • [The Methanum project] Создание инструментария для построения распределенных систем с топологией “Звезда”
    0
    Зависит, конечно, от определений, но вообще нет. Если считать интернет самой большой и объемной компьютерной сетью, то в основе такой сети исторически дерево, дополненное до многоуровневого графа. Если считать топологией не только железки, но и гиперпространство поверх них, то всякие умные люди, пишущие статьи, придумали для этого термины Jellyfish (медуза), либо Bow Tie (галстук-бабочка).

    У дерева a priori есть корень. Где же корень интернет?)
    Я уверен, что у большинства читателей как минимум дома стоит роутер, к которому цепляются остальные железки, а это и есть звезда.
    Вообще-то в тексте сразу поясняется, о какой надежности речь: «(выход из строя одной машины не сказывается на других)». Конечно, выход из строя концентратора приведет к выходу из строя всей сети. Именно поэтому программная реализация ядра должна быть предельно проста и надежна.
    А если по существу — то вы написали n+1-ую messaging bus
    – абсолютно верно.
    Поясните, что ли, чем она лучше всех существующих и стандартизированных решений
    – наверно минимализмом. Ну в самом деле, посмотрите в исходники существующих решений
    Насколько я понимаю, не то, что нет гарантированной доставки, а нет даже концепции очереди и какого-то ее хранения?
    – Если нужно, добавить очередь в methanum, не так-то и сложно.
    Сообщения, судя по коду, пакуются в JSON — не кажется ли, что это как-то, несколько неоптимально для внутрипрограммной шины?
    — Сами события сериализуются в бинарный формат, при этом по умолчанию они могут содержать словарь примитивов (int, double, bool…). Т.к. первоначально система создавалась для сбора и обработки данных с промышленных контроллеров, где примитивов было вполне достаточно. Если нужно передавать пользовательскую структуру, можно добавить ее в качестве известного типа, например «[KnownType(typeof(List))]». Или можно запаковать объект ну скажем в строку, в данном случае в JSON. И кстати нигде и речи не идет, что данное решение исключительно внутрипрограммное.

    Данная статья задумывалась, чтобы поделиться опытом, как сделать программную реализацию звезды своими руками, без каких либо зависимостей и сторонних проектов. Проект methanum абсолютно не претендует на звание нового и уникального инструмента. Однако, в некоторых случаях может быть очень полезен, его можно быстро заточить под свои нужды.
  • [PF] Печать PDF под .NET, растровый подход
    –1
    Есть, и что теперь ThreadPool.QueueUserWorkItem забыть как тупиковую ветвь эволюции?)

    image
  • [PF] Печать PDF под .NET, растровый подход
    0
    Не понимаю связь между годом и многопоточностью.
    Согласен, конкретно в данном примере вполне можно использовать MemoryStream[].
  • [PF] Печать PDF под .NET, растровый подход
    +1
    Спасибо за наводку
  • [ScanDoc] предобработка сканов
    0
    Про разность восприятия цветов в курсе, но для данной задачи такие тонкости не к чему.
    А вот статью "Выравнивание горизонта" взял на заметку, спасибо.
  • Углубление в Scheme
    0
    Спасибо за наблюдение. В cond может быть как else так и #t оба варианты корректны, в стандарте R6Rs, в примерах else. Хотя #t наверно более читаемо.

    Так же забыли упомянуть, что функции вида (define (add a b) (+ a b) это named functions (именные?), а функции вида (lambda (x y) (+ x y)) это anonymous functions.

    Я бы еще сюда добавил функции для создания, разрушение, присоединения листов: cons, car/cdr, append.

    И очень полезную функцию eval


    Согласен, как-то упустил из виду, обязательно позже дополню.
  • Введение в Scheme
    0
    Всегда пожалуйста!
    Если это и это еще больше увеличит восторг, то не зря старался).
  • Введение в Scheme
    +1
    Используется для разруливания логики, но пока не в больших объемах. Пока лисп разработчики не нужны, но будем иметь ввиду ;)
  • Углубление в Scheme
    0
    Под рукой нет Racket, думаю, причина в том, что в примере юникод, т.е. 2 байта, а Racket поддерживает Ascii, т.е. должно быть #\xE5 для лямбды.
  • Углубление в Scheme
    +1
    Ошибки нет, наверно 0 сбивает с толку привыкших к си, в Scheme истина все кроме #f. Результат and и or это либо ложь, либо значение истинного аргумента. Например, (and #f 11 22 33); => #f, при этом как только получен #f остальные аргументы не вычисляются. Выражение (or #f 11 22 33) ;=> 11, т.к. после того, как получена истина следующие аргументы не вычисляются.

    Нечто общее с FORTH есть, сам когда-то увлекался последним. Форт может в более широких пределах расширять синтаксис. Однако, ИМХО лисп более гибок и более высокоуровневый, не нужно постоянно заботится о стеке, проще реализуется переменное число аргументов и т.д…
  • Введение в Scheme
    0
    Racket тема интересная. Из Racket можно работать с базами данных, с тем же Orcale?