Как стать автором
Обновить
35
0
Виталий Шибаев @shibaev

Разработчик

Отправить сообщение
Да, можно. На десктопе в разделе Действия->Переименовать карту. В мобильном приложении не проверял.
В Тинькофф можно удаленно открыть счет, и создавать несколько виртуальных карт (но привязанных к счету физической), и устанавливать разные лимиты. Физической картой можно вообще не пользоваться — установить лимиты в 0, запретить операции в интернете.

При этом изменения лимитов применяются мгновенно, в отличие от некоторых других банков. Т.е. можно по умолчанию устанавливать на карте лимит 0, а непосредственно перед оплатой в интернете ставить нужную сумму.
Определение зон с текстом на изображении — практически та же задача распознавания. Библиотек для предобработки изображений множество. Наиболее известные — OpenCV и ImageMagick. Вот тут еще варианты перечислены: tesseract-ocr.github.io/tessdoc/ImproveQuality#tools--libraries

А вот в случае, когда PDF документ содержит неправильный текст, определить блоки с текстом проще. Ведь информация о расположении текста доступна, просто маппинги в Unicode неправильные. Определить позиции существующего текста в PDF документе можно так.
Это работает только доступных для поиска (searchable) PDF. iTextSharp не делает OCR.
Да, кастомный словарь — это еще один способ улучшения качества. Подробнее описано тут: github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc#config-files-and-augmenting-with-user-data. Параметры «load_system_dawg», «load_freq_dawg», «user_words_suffix» и «user_patterns_suffix» передаются через параметр «configFiles» в TesseractEngine.
Не удивлюсь, т.к. про это написано по ссылке со StackOverflow, которую я привел в своем сообщении (https://stackoverflow.com/a/16719474/136138)

На практике на моем i7-4200HQ разница существенна для RyuJIT x64. Я взял benchmark gist.github.com/aensidhe/0d412e142eb29fd21eea01b5f6462d41 и сравнил For() и ForReverse(). В первом случае RyuJIT убирает bounds check, во втором — оставляет. И у меня на машине получаются такие результаты:
BenchmarkDotNet=v0.11.3, OS=Windows 10.0.17134.472 (1803/April2018Update/Redstone4)
Intel Core i7-4720HQ CPU 2.60GHz (Haswell), 1 CPU, 8 logical and 4 physical cores
Frequency=2533210 Hz, Resolution=394.7561 ns, Timer=TSC
  [Host]        : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3260.0
  Clr LegacyJit : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit LegacyJIT/clrjit-v4.7.3260.0;compatjit-v4.7.3260.0
  Clr RyuJit    : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3260.0

Platform=X64  Runtime=Clr

     Method |           Job |       Jit |     Mean |    Error |   StdDev |
----------- |-------------- |---------- |---------:|---------:|---------:|
        For | Clr LegacyJit | LegacyJit | 724.0 ns | 1.945 ns | 1.819 ns |
 ForReverse | Clr LegacyJit | LegacyJit | 725.5 ns | 9.341 ns | 7.800 ns |
        For |    Clr RyuJit |    RyuJit | 583.3 ns | 2.706 ns | 2.259 ns |
 ForReverse |    Clr RyuJit |    RyuJit | 732.2 ns | 2.568 ns | 2.402 ns |
Есть еще один аргумент в пользу использования Array.Length напрямую, без доп. переменных. С включенными оптимизациями JIT компиляторы умеют избавляться от array bounds check при доступе к элементам массива внутри цикла. С доп. переменной такие оптимизации могут не работать:
blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/array-bounds-check-elimination-in-the-clr
stackoverflow.com/questions/16713076/array-bounds-check-efficiency-in-net-4-and-above

В ваших примерах bounds check присутствуют:
cmp esi, eax
jae 056e2d31


Возможно, это ограничение LegacyJIT x86. Либо код запускался без оптимизаций. RyuJIT x64 должен быть умнее (https://stackoverflow.com/a/17138483/136138).
HttpWebRequest не поддерживает Timeout для асинхронных операций
stackoverflow.com/a/26214865/136138
Подскажите, пожалуйста, потребуется ли использовать онлайн-кассы для случаев вывода денег с Upwork или AppStore?
В законе есть пункт «9. Контрольно-кассовая техника не применяется при осуществлении расчетов с использованием электронного средства платежа без его предъявления между организациями и (или) индивидуальными предпринимателями.», можно ли его применять в данном случае?
Стоит изначально добавить поддержку .NET Standard Library — это позволит использовать ваш фреймворк из ASP.NET Core приложений. На ранней стадии это сделать проще.
Не спорю, создавать документы и тем более писать Javascript для PDF, конечно же, значительно удобней в Adobe LiveCycle Designer (как и, например, создавать docx документы в Word, а не программно)

Подход описанный в статье более низкоуровневый и может представлять дополнительный интерес для разработчиков приложений, которым требуется создавать или модифицировать PDF документы. Это может быть программная генерация разного рода форм или отчетов. Или, например, сжатие существующих документов — одним из приемов тут может быть удаление всех Javascript action'ов из документа.
Mercurial на порядок дружественней для Windows пользователей. TortoiseGit все-таки еще достаточно сыроват.
Другим важным преимуществом для нас стало то, что Mercurial — основная VCS в FogBugz, это трекер, на который мы решили переехать.
Изучали, но не стали пробовать. По нескольким причинам:
1) У нас было несколько собственных SVN репозиториев, связанных через externals (например, в репозиторий проекта A подгружаются файлы из репозитория проекта Common), и все их нужно было перенести на Меркуриал. Как в этом случае корректно перенести всю историю с внешними зависимостями я с трудом представляю
2) subrepo это все-таки не совсем svn:externals. Задача стояла сохранить историю всех репозиториев полностью работоспособной и идентичной оригиналу, и не было гарантии, что через suprepo это получится вообще. Способ описанный в статье достаточно простой и гарантированно дает нужный результат, поэтому не стали тратить время на эксперименты.
3) После некоторого времени активного использования svn:externals пришли к выводу, что внешние зависимости на уровне репозиториев не так уж и хороши, и тащить их в Меркуриал попросту не хотелось.
я не знаю хорошего бесплатного обфускатора

Можете попробовать Babel .NET, мы им пользуемся для обфускации, довольны.
Согласен, теги — отличная альтернатива конкретным ревизиям, если, конечно, они правильно используются и используются вообще во внешнем репозитории. Не вспомнил об этом при написании статьи.
Преимущества декомпозиции:

— Если хранить все в одном репозитории, то получаются неудобства с нумерацией версий конкретных проектов (если завязывать нумерацию версий на номер ревизии). Например:
Работаем только над «проект1», сделали 300 коммитов, выпустили версию «проект1» 1.0.300
Затем переключаемся на «проект2», после 400 коммитов выпускаем версию «проект2» 1.0.600 (уже не совсем верно)
Возвращаемся к «проект1», делаем 1 коммит (небольшой фикс) и выпускаем версию — получается номер 1.0.601 (совсем некорректно)

— На начальном этапе это не заметно, но со временем размер репозитория сильно увеличивается. В истории накапливается куча ненужного. Например, представим ситуацию, когда какой-то проект больше ну совершенно не нужен — можно его удалить. Простое удаление из репозитория не уменьшит общий размер, ибо вся история останется.
Размер репозитория до поры-до времени будет не критичен, однако когда он вырастает до нескольких Гб — готовьтесь, что как только потребуется осуществлять какие-то действия с самим репозиторием — перенос на новый сервер, какую-то обработку дампа, миграцию в другую VCS — столкнетесь с проблемами.

— Декомпозиция дает большую гибкость в управлении репозиториями
Частичное повторение предыдущего пункта. Если захотите что-то сделать с репозиторием — выкинуть какую-то ненужную часть истории, сделать бэкап только одного проекта, перейти на Git — с декомпозированными репозиториями будет проще.

К слову, при декомпозиции никто не мешает также использовать копирование вместо externals, так что Ваше второе преимущество не совсем преимущество.

/////

Вообще, как показывает практика, и в других областях декомпозиция в большинстве случаев лучше. Ибо, обычно, делает вещи проще, например:
— Вся эволюция императивных языков программирования направлена на упрощение разработки и, соответственно, кода. И декомпозиция — главный инструмент для этого. Сейчас мы пришли к тому, что грамотно спроектированный проект:
1) Разделен на модули/компоненты, каждый из которых решает конкретную задачу;
2) Каждый компонент разделен на классы, каждый из которых в соответствии с хорошими практиками ООП решает 1 задачу;
3) Каждый класс разделен на методы, каждый из которых в идеале решает 1 задачу;
4) В каждом методе используются переменные и, в идеале, каждая переменная должна использоваться только для одной цели.

— Управление требованиями к проекту. Как проще — когда все требования по проекту в куче в одном документе или же аккуратно разнесены по разным задачам в трекере? Практика показывает, что второе.
Здравствуйте!

Путь через «svnadmin setrevprop» также возможен, но, на мой вгляд, требует больше усилий и занимает больше времени. При таком подходе все равно нужно:
-найти в дампе все проблемные ревизии, где встречаются ссылки на внешний репозиторий
-каждое свойство, которое нужно поменять, скопировать в файл
-поправить ссылку в файле
-применить «svnadmin setrevprop» для каждого свойства

При предложенном мной подходе все изменения делаются по ходу просмотра файла дампа. Количество байт не нужно считать глазами, текстовый редактор с этим отлично справляется либо можно просто отнять/прибавить разницу в длине между старым и новым адресом.
Да, в Git есть Submodules:
markhansen.co.nz/git-repo-inside-git/#submodules

Есть и альтернатива в виде Subtree merges. Подробнее про последний путь тут:
www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

Информация

В рейтинге
Не участвует
Откуда
Омск, Омская обл., Россия
Дата рождения
Зарегистрирован
Активность