Як порівняти БД до і після

Вже кілька місяців мені доводилось виконувати одну й ту саму марудну послідовність дій в інтерфейсі користувача програми, яку я розробляю. І ось, нарешті я вирішив автоматизувати це. Але як підступитись, адже дій досить багато і змін в БД також. Тоді я вирішив порівняти БД до цих дій і після і вже це порівняння використати для розроблення скрипта, що оновлював би базу так, наче я всі ці дії виконав вручну.

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

Читати далі…

Категорії:Бази даних Позначки:,

Як шукати дані в БД коли ти не знаєш де їх там шукати

Нещодавно в мене виникла потреба знайти одиницю інформації в базі даних MS SQL Server. І було все так: отримав я задачу, я знав як зробити перший крок в інтерфейсі користувача, але гадки не мав, що з цим можна робити далі, щоб відтворити бажину.

Цей перший крок створює об’єкт з певним набором даних, в тому числі зі своїм ім’ям, яке я міг задавати на власний розсуд. Якби я хоча б знав де цей об’єкт лежить в БД, тоді я зміг би знайти звідки ще ці таблиці використовуються і зрозуміти, що можна робити далі, але я не знав де саме в БД його зберігають. Тоді я вирішив знайти в базі даних в якій саме таблиці його ім’я зберігається і для цього написав такий от скрипт.
Читати далі…

Категорії:Бази даних Позначки:,

Завдання з онсайт співбесіди в Google

Заданий масив невід’ємних чисел і число k – бажана сума. Знайти два неперетинні підмасиви найменшої сумарної довжини, сума кожного з яких k.

Як завжди в такій ситуації важливо уважно прочитати умову задачі. Що нам дає те, що числа невід’ємні? Це дає нам те, що, на відміну від випадку з числами будь-якого знаку, може бути лише один масив, який закінчується в i-му елементі.

Тут у нас два масиви з однаковою сумою і однаковою останньою позицією, один завдовжки 3 інший 6 символів.

3 -2 -1 2 4 -1
3 -2 -1 2 4 -1

Цю задачу можна розв’язати за лінійний час за допомогою техніки ковзного вікна.
Читати далі…

Категорії:C# Позначки:,

Створення проєкту ASP.NET Core MVC 3 з Angular

Спочатку встанови Visual Studio з ASP.NET Core і Node.JS.

Створення Angular проєкту

npm install --global @angular/cli

Наступна команда дозвилить виконати ng скрипт.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
ng new 
    YourProject
    --directory YourProject/ClientApp
    --routing true
    --style css
    --skip-tests true
    --skip-git true
cd YourProject/ClientApp
npm start

Тоді відвідай http://localhost:4200/
Читати далі…

Категорії:C#, Веб Позначки:, ,

Деякі думки з книги Мартіна Фаулера

Коли виникає потреба додати новий функціонал в програму, але код незручно структуровано, спочатку відрефакторіть програму так, щоб зробити додавання нового функціоналу простим, тоді додавайте цей функціонал.

Перед тим як розпочати рефакторинг, переконайтесь, що маєте повноцінний набір тестів.

Програмуючи, дотримуйтесь правила відпочинку на природі: завжди залишайте код в кращому стані ніж коли ви його знайшли.

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

Якщо хтось каже, що його код не працював кілька днів поки він рефакторив, то ви можете бути впевнені, що він не рефакторив.

Якщо ви відчуваєте портебу написати коментар, спочатку спробуйте відрефакторити код так, щоб будь-який коментар став зайвим.

Отримавши звіт про баґ почніть з написання юніт теста, який викриває баґ.

Категорії:Uncategorized

Знаходження кількості простих циклів у неорієнтованому графі

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

Огляд ДП з бітовими масками

Якщо говорити про нашу задачу, то динамічне програмування з бітовими масками розглядає всі можливі підмножини вершин графа. Наприклад, якщо граф має три вершини пронумеровані від 1 до 3, то такими підножинами будуть {}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}. Ці множини зручно представляти у вигляді бітових масок. Таких підмножин буде 2^n, що мовою С++ виглядає як 1 << n, де n – це кількість вершин у графі.

Читати далі…

Стара задача про шляпи

Група чаклунів зібралась на галявині, щоб вирішити питання, що накопичились у магічній країні. Магічна сила чаклунів залежить від їхньої шляпи. Щоб в палу суперечки не спалити один одного своїми закляттями вони вирішили залишити свої шляпи біля сусіднього з галявиною дуба-велетня. Поки вони обговорювали свої питання, впала ніч, тому коли розходились кожен з них взяв першу ліпшу шляпу. Нас цікавить, скільки ж чаклунів повернулись до своїх веж із своїми власними шляпами.

Читати далі…

Порівняльний тест стабільності процесу Грама — Шмідта

Сьогодні ми розглянемо стабільність процесу Грама-Шмідта. Для цього ми реалізуємо класичну, clgs(), і стабільну, stgs(), версії алгоритму, а як еталон ми використаємо вбудовану функцію MATLAB – qr(). Ми згенеруємо 80×80 матрицю з “випадковою” Q і з R чиї діагональні елементи спадають експоненційно. Для створення вхідної матриці A ми скористаємось cингулярним розкладом матриці. Більше про те чим відрізняєтьс класичний і стабільний варіанти алгоритму можна прочитати у статті на Вікіпедії.
Читати далі…

Розв’язання задачі MappingABC з TopCoder

Тут я розгляну розв’язок задачі MappingABC з TopCoder. Це задача з першого дивізіону другого рівня складності, тому вона вимагає певний рівень учасника для розв’язання.

Основне спостереження, яке допомагає в розв’язанні – це те, що для того, щоб порахувати всі прийнятні рядки ми можемо розбити рядок на три підрядки: до першого A – [0, FA], між першим A і останнім C – [FA, LC] і після останнього C – [LC,t.size()-1]. Ми рахуємо лише ті рядки в яких у [FA, LC] трапляється B.

Введемо дві множини для позначення символів які трапляються лише зовні [FA, LC] і інші, відповідно \mathcal O і \mathcal I. Тоді кількість прийнятних рядків така:
\prod_{s\in \mathcal O}\mbox{bitcount}(s) + \Big( \prod_{s\in \mathcal I}\mbox{bitcount}(s) - \prod_{s\in \mathcal I}\mbox{bitcount}(s \& 5) \Big).

Дивись коментарі в сирцевому коді для подальших роз’яснень.
Читати далі…

Категорії:C++, Комбінаторика Позначки:, ,

Градієнт деформації

У результаті деформації у тривимірному випадку куб перетворюється у щось схоже на паралелепіпед. Градієнт деформації це тензор, що вимірює цю зміну форми разом із обертанням матеріалу.

Будь-який куб можна характеризувати за допомогою трьох ортогональних векторів, що утворюють його ребра. Те саме можна сказати про паралелепіпед. Градієнт деформації \mathbf F виражає ці зміни через збирання трьох ребер отриманих в результаті деформації в матрицю. У декартових координатах стовпчики цієї матриці містять вектори деформованих ребер виражені відносно векторів початкових ребер. Під відносними уважається, що всі зміни довжин виражені як множники початкових довжин, а всі напрямки виражені через напрямки початкових ребер. Тобто, визначивши підхожим чином одиницю довжини, ми можемо вважати, що початковий куб – одиничний, чиї ребра вирівняні уздовж осей координат і утворюють базис \mathbf E_1, \mathbf E_2, \mathbf E_3. Після деформації ці ребра трансформуються у \mathbf e_1, \mathbf e_2, \mathbf e_3. Якщо ви знаєте компоненти \mathbf e_k то ви маєте k-й стовпчик \mathbf F у координатах \mathbf E_1, \mathbf E_2, \mathbf E_3. Тобто,

\mathbf e_k = \mathbf F \cdot \mathbf E_k.

Деформовані вектори ребер – \mathbf e_k не обов’язково ортогональні чи одиничні. Їх називають “матеріальними векторами”, тому що вони рухаються разом із матеріалом.
Читати далі…

Категорії:Механіка Позначки: