Всім добрий день. Я хочу представити на суд громадськості (ще один) простий спосіб зробити локалізацію додатків. Стандартний механізм з ресурсними збірками мене не влаштовує з наступних причин:
  1. Отримуючи значення локалізованої рядка в коді, дуже хочеться покладатися на всю міць ООП і підказки компілятора. Дуже неприємно зібрати проект ввечері в п'ятницю, а вранці в суботу отримати дзвінок від впахивающих overtime QA на тему того, що хтось неуважний написав GetResource(«asdf») замість GetResource(«assf»), і тепер щось падає або неправильне, а проект в понеділок вже здавати у друк ...
  2. (В продовження попереднього пункту...) Писати string foo = language.Ui.PromtDialog.AdditionalQuestion просто приємніше, ніж string foo = Resources.GetResource(«Ui_PromtDialog_AdditionalQuestion»). Так, в тому числі і за рахунок підказок компілятора.
  3. Іноді локалізувати потрібно не рядки, а цілі об'єкти. Наприклад, іменник (рядок + рід М/Ж/З/Мн) і прикметник (рядок М + рядок Ж + рядок З + рядок Мн). Пхати в ресурси сериализованную рядок, а потім діставати і десериализовать кожен раз? Мсьє знає толк в збоченнях...
  4. Ресурсний файл — це плоский список рядків, а хотілося б, щоб все-таки мали більш складну ієрархічну структуру, за якої не потрібно повзати з допомогою Ctrl+F.
  5. Створення нової мови має бути настільки простим, наскільки це можливо. Локалізувати додаток повинен бути здатний людина, що вміє поводитися з комп'ютером і володіє потрібними мовами. І йому для цього не потрібні ні Visual Studio, ні метушня з створенням ресурсних збірок.
Ще одна обов'язкова вимога — можливість простій прив'язки до локалізації елементів UI. Бажано — одночасно і WPF, і WinForms.

Читати далі →

Пошук витоку GDI об'єктів: Як загнати мастодонта

Строго кажучи саме це оригінальний текст статті, а в блог вже переклад. Тут стаття публікується трохи пізніше і тільки тому отримує бирку переклад.

В 2016 році, коли більшість програм виконуються в пісочницях, з яких навіть самий некомпетентний розробник не зможе нашкодити системі, дивно стикатися з проблемою, про яку далі піде мова. Якщо чесно, я сподівався, що вона пішла в далеке минуле разом з Win32Api, але недавно я з нею зіткнувся. До цього я лише чув страшні байки старих більш досвідчених розробників, що таке може бути.

Проблема
Витік або використання занадто великої кількості GDI об'єктів.

Симптоми:
  • Task Manager на вкладці Details колонка GDI objects показує загрозливі 10000(Якщо цієї колонки немає, її можна додати, натиснувши на заголовку таблиці правою кнопкою миші і вибравши пункт Select Columns)
  • При розробці на C# або іншою мовою виконуваному CLR полетить виняток, далеко не нова конкретикою:
    Message: A generic error occurred in GDI+.
    Source: System.Drawing
    TargetSite: IntPtr GetHbitmap(System.Drawing.Color)
    Type:System.Runtime.InteropServices.ExternalException
    Також при певних налаштуваннях або версії системи виключення може і не бути, але Ваш додаток не зможе намалювати жодного об'єкта.
  • При розробці на З/З++ всі методи GDI начебто Create%SOME_GDI_OBJECT% стали повертати NULL

Читати далі →

VirusTotal: перевіряємо файли на віруси в один клік



Може бути безліч причин, чому на тому або іншому комп'ютері ви не поставите антивірусне програмне забезпечення: слабке залізо або просте небажання ділити його з постійно які жеруть ресурси антивірусом, впевненість у своїх діях на комп'ютері або дорожнеча, особливо для серверних версій операційних систем. З останнім, до речі, постійно стикаються користувачі віртуальних серверів (так званих VPS / VDS), конфігурацій більшості яких ледь вистачає для нормальної роботи сучасного браузера, а провайдер надає виключно серверну версію Windows.

Будучи одним з таких користувачів, де далеко не скрізь встановлений повноцінний антивірус, постійно доводиться залазити на онлайн ресурси для перевірки тих або інших файлів. Оптимізувати цей процес я сьогодні і вирішив.

Найбільш простим і популярним серед таких ресурсів (і приємний особисто мені) є virustotal.com, у якого є відкритий API і використання його від вас нічого не вимагає, крім реєстрації на сайті.
Ідеальним варіантом для мене стала реалізація з додатковою кнопкою, у контекстному меню Windows, яке з'являється при натисканні правою кнопкою миші по будь-якому файлу.



Читати далі →

Динамічне створення Windows і Web CRUD-інтерфейсів і не тільки для бізнес-додатків з XAF + Entity Framework. Частина 1

Історія

У нас є старенька веб додаток DXLibrary для обліку літератури та пошуку цікавих поповнень в місцевій бібліотеці, написаний багато років тому за пару годин одним з розробників на DevExpress eXpressApp Framework (XAF). Дані програми зберігаються в Microsoft SQL Server бази, а робота з ними ведеться через DevExpress eXpress Persistent Objects ORM (між .xpo). Так як це чудо досі стерпно выполнет свої неабиякі функції, так що мені захотілося трохи освіжити його інтерфейс під поточні реалії. Крім фейсліфтингу хочеться змінити між .xpo на Microsoft ADO.NET Entity Framework (EF) під капотом.imageОсновним мотивом тут для мене є не те, що EF щось краще або гірше (обидві ORM давно довели, що відмінно підходять для своїх завдань), а те, що досі на Хабре не було російськомовного туториала по інтеграції XAF і EF, хоча вони вже «не перший рік замужем». Є величезне бажання заповнити цей пробіл + елементарно було кілька запитів від користувачів «бібліотекаря», які можна заодно запив у новій версії. Нарешті, з версії 15.1 XAF надає оновлений веб інтерфейс, заточений у тому числі для touch-пристроїв, який хотілося б зайвий раз показати спільноті, що гріха таїти:-)

Це перша і вступна частина із серії постів, де я спробую показати по кроках варіант прискореної генерації веб, так і настільних line-of-business (LOB) додатків на базі існуючої або готової моделі Entity Framework, що представляє структуру даних вищеописаною предметної області. Користувальницький інтерфейс буде створюватися автоматично на базі міксу технологій ASP.NET WebForms/HTML5 і WinForms, а також відповідних візуальних компонент DevExpress, скомпонованих разом в рантайм під чуйним керівництвом XAF — нашого UI фреймворку (дізнатися більше на Хабре, сайт), а по суті сформованого за майже 10 років існування і постійно розширюваного набору best patterns & practices для швидкого створення Office-like бізнес додатків .NET розробників.

Читати далі →

Порівняння продуктивності UI в WPF, Qt, WinForms і FLTK

Під мірою продуктивності UI, будемо розуміти кількість відгуків на дії користувача в одиницю часу. А під відгуком — запитувану користувачем реакцію програми.

Малим часом відгуку, можна пояснити ряд переваг користувача:
1. Перевага аналогових інтерфейсів цифрових (когада виникає затримка на обробці цифрового введення)
2. На зорі Windows, — уподобання користувачів працювати з DOS програмами в «текстовому режимі», а не з GUI аналогами в Windows (час відгуку в текстовому режимі тоді було помітно менше на подібною платформі)
3. Перевагу реальних ігрових консолей їх эмуляторам (емулятори часто мають час відгуку відрізняється від часу відгуку оригінальних консолей)
4. Перевагу користувачів iOS і Android щодо WinCE і Symbian (серед іншого, наприклад в iOS ставилася мета швидкого відгуку і підтримки 60 FPS, Android хоча і не ставив таких цілей було помітно чутливішими WinCE і Symbian)
5. В автомобілях — неоднозначне ставлення користувачів до автоматичною коробками передач, електронної педалі газу і деяким іншим системам вносять затримку між керуючим впливом і реакцією на нього (це відноситься до найменш " просунутим версіями цих рішень)

Великий час відгуку є по суті «зворотним зв'язком з запізненням», про яку більш докладно можна прочитати тут: «Зворотній зв'язок з запізненням в крані з гарячою водою, марсохід та демографічної піраміді»

Читати далі →

C# WinForms — Поради з розробки користувальницьких компонентів

Передмова

Основна моя спеціалізація — розробка ПЗ для систем реального часу на базі мікроконтролерів. Але іноді і на C# WinForms бувають розробки настільних додатків з досить специфічними користувацькими інтерфейсами. Наприклад, бінарне відображення слова по інтерфейсу ДПК, представлено на малюнку нижче.

image

Ось такий компонент довелося винайти для звичного користувачам відображення даних.

Хочу поділитися кількома «емпіричними» порадами щодо розробки користувальницьких компонентів, які забезпечують більш швидку і організовану розробку оптимізованих візуальних (графічно навантажених) користувальницьких компонентів.

Читати далі →

DevExpress 15.1: що нового і цікавого?

Початок літа — саме час для нової версії продуктів DevExpress, в якій ми приготували безліч поліпшень наших компонентів. Також ми дуже багато працювали над підвищенням продуктивності і зручності використання всіх інструментів. Дуже складно вибрати найкращі частини з усієї виконаної нами роботи, тому повний список можна подивитися тут. У цій же статті ми постаралися описати найбільш важливі, корисні і цікаві зміни — це нові компоненти і функції, так і поліпшення вже існуючих. І звичайно ж ми підготували короткий відео про нової версії DevExpress 15.1:


Читати далі →

Більше можливостей з новою версією продуктів DevExpress 14.2!

Наближається кінець року, а це значить, що настав час подання чергової версії продуктів від компанії DevExpress. У цей реліз 14.2 ми постаралися включити багато цікаві та корисні можливості для наших користувачів. Оскільки всі поліпшення і нововведення описати в рамках однієї статті важко, їх можна подивитися ось тут, а під катом ми розглянемо лише деякі з них. Для тих, хто не хоче довго читати, ось цей невеликий ролик:



Подивимося, які нові можливості з'явилися в наших продуктах.

Читати далі →

Як створити DbContext усередині Visual Studio, або "Що робити, якщо хочеться дивного?"



Починаючи з версії 14.1, XtraReports з'явилася вбудована підтримка ORM Entity Framework. Якщо раніше розробнику доводилося використовувати стандартний компонент BindingSource для прив'язки елементів звіту до даних і потім вручну писати код для завантаження даних з EF моделі, то зараз йому достатньо лише вибрати конкретний контекст (з поточного проекту або складання, зазначеної в References проекту) і вказати використовується рядок підключення. Компонент EFDataSource сам створить контекст з потрібною рядком підключення і поверне дані звіту.


Читати далі →

Як виконати аналіз даних, написавши всього один рядок коду

14.2 версії ми повністю переписали механізм експорту даних у формати MS Excel. Тепер експорт в Excel працює значно швидше і документ, який виходить в результаті, зберігає угруповання, фільтрування, сортування з гріду, «живі» саммари на формулах, умовне форматування і багато чого ще.

У користувачів з'являються нові можливості детального аналізу даних з гріду в звичному їм Excel. Менеджер, бухгалтер або фінансовий аналітик тепер можуть отримати табличні дані з гріду в Excel швидко і точно.
Багато років тому я починав свою кар'єру в ІТ із автоматизації підприємств, використовуючи рішення від 1C. У одного з великих клієнтів готувався річний звіт і щось не сходилося. Мене попросили написати кілька спеціальних запитів для локалізації розбіжностей. Думаю, що бухгалтерія могла б обійтися без запрошення фахівця і заощадити час і гроші, якщо б у них був хороший експорт в Excel. Зрозуміло, у цього підходу є обмеження. Наприклад, обсяг аналізованих даних може бути занадто великим для Excel.

Завдяки новому експорту у користувачів з'являються нові можливості глибокого аналізу і візуалізації даних з використанням Excel. На жаль, я не пам'ятаю точно, що саме було не так, коли не сходився той річний звіт. Тому для демонстрації можливостей нового експорту уявімо, що є додаток, в якому є дані про продажі товарів магазину за певний період у вигляді таблиці. Менеджер хоче дізнатися, які товари приносять більший внесок у виручку, ті виконати ABC-аналіз. Як ви здогадалися, в розглянутому додатку ABC-аналіз не реалізований, але зате є кнопка, після натискання якої зветься метод view.ExportToXls(..).

Читати далі →