Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: mvc4 5
ТОП 10 AI сервісів для розробників. Ефективне використання нейромереж

Автор: Влад Сверчков

Важливість нейромереж у сучасній розробці Короткий огляд нейромережевих технологій ТОП 10 сервісів з використанням нейромереж для розробників Поради та рекомендації щодо вибору AI Висновки Висока динаміка ІТ-індустрії змушує розробників постійно шукати нові шляхи покращення власної продуктивності. Нещодавно людство ковзнуло ще однією спіраллю прогресу, і тепер девелоперів оточує плеяда штучних асистентів, причому часто в їхній основі саме нейромережі. Можливості ШІ дозволяють значно прискорити рутинні процеси, починаючи від зідзвонів з командою і закінчуючи написанням коду та його рефакторингом. І хоча рівень штучного інтелекту ще далекий від ідеалу, це вже великий крок уперед. Які штучні інструменти дозволяють впоратися з розробницькими задачами найбільш успішно? Щоб допомогти вам із відповіддю, в цій статті ми зібрали 10 цікавих ШІ сервісів для розробників з урахуванням функціоналу, вартості, наявності free-версії тощо. Читайте далі, щоб дізнатися більше! Важливість нейромереж у сучасній розробці Сьогодні нейромережі дозволяють значно спростити життя звичайному розробнику. Ось кілька прикладів: Декомпозиція задач. ШІ здатен розбивати комплексні задачі на дрібні, пояснювати їх, надавати підказки щодо їх виконання, пропонувати найоптимальніше рішення. Генерування коду. Розумній моделі можна дати на вхід певну програмістську задачу, а на виході отримати готовий шматок коду. Також AI здатен аналізувати чужий код, пояснювати його, розставляти коментарі, досліджувати технології програмування тощо. Code-рев’ю & рефакторинг. Ви можете зекономити час, довіривши AI внесення необхідних змін: сканування і оптимізація коду, видалення надлишкових фрагментів, покращення лаконічності, алгоритмів тощо. Написання тестів. Розробники не надто люблять займатися unit-тестуванням, хоча це важлива складова забезпечення якості ПЗ. На щастя, штучний інтелект здатен генерувати необхідні тестові кейси, котрі охоплюють різні сценарії, а також автоматизувати виконання цих тестів. Проактивна обробка помилок. ШІ прогнозує потенційні помилки та рекомендує виправлення до того, як вони трапляться, що скорочує час налагодження коду. Потужний аналіз даних. Штучні помічники здатні відносно швидко аналізувати великі масиви даних, щоб з’ясувати причинно-наслідкові зв’язки, виявити закономірності / потенційні проблеми та помилки тощо. Досить актуально для ІТ-спеціалістів, пов’язаних з Data Science, ML, big data тощо. Створення документації. ШІ може аналізувати код і автоматично створювати вичерпну документацію, яка пояснює функціональні можливості, інструкції з використання та посилання на API і багато іншого. Прогнозування. Прогнозування та моделювання поведінки користувачів і продуктивності ПЗ, покладене на плечі AI, дозволяє розробникам планувати масштабованість, виявляти потенційні вузькі місця на ранніх стадіях розробки і проактивно вирішувати їх, щоб забезпечити безперебійну роботу в майбутньому. Список можна розширити багатьма іншими пунктами – в залежності від специфіки напрямку розроблення. Використовуючи нейромережі, девелопери можуть значно підвищити свою ефективність і продуктивність. Однак важливо пам'ятати, що ШІ сьогодні – це помічник, і людський досвід залишається вирішальним для прийняття важливих рішень, творчого розв'язання проблем і забезпечення загальної якості та бачення ПЗ. Короткий огляд нейромережевих технологій: від глибокого навчання до штучного інтелекту Штучний інтелект – це широке поняття, що позначає системи, здатні імітувати когнітивні функції людини: запам’ятовування, креативність, комунікація з використанням мови, вирішення задач, прийняття рішень тощо. Однією з ключових складових ШІ є нейронні мережі, які імітують роботу людського мозку і дають комп'ютерам змогу навчатися і ухвалювати рішення на основі великих обсягів даних. Але між AI та нейромережами стоять ще 2 важливі технології – машинне навчання (МН, Machine Learning) та глибоке навчання (ГН, deep learning). Нижче ми швидко пробіжимося ШІ, МН та ГН, а більше про нейронки ви можете почитати у нашій статті “Чи замінить штучний інтелект розробників?”. ШІ Штучний інтелект містить в собі технологію ML, але лише нею не обмежується. Додатково він здатен використовувати: оброблювач мов – щоб розуміти нашу людську мову і формувати зрозумілі нам відповіді; комп’ютерний зір – аби аналізувати, класифікувати, сегментувати, розпізнавати обличчя та предмети; робототехніку – для виконання завдань з навігації та взаємодії з навколишнім середовищем та багато іншого. Відомі AI-платформи: віртуальні асистенти Alexa, Siri, чат-боти ChatGPT, Gemini, Midjourney тощо. Що таке машинне навчання? Це підмножина ШІ, яка фокусується на розробленні алгоритмів і моделей, що дають змогу комп'ютерним системам "навчатися" на основі даних і досвіду, без явного програмування. На відміну від традиційних програм, де розробник задає явні інструкції, в МН комп'ютерна система сама "витягує" закономірності та зразки з даних, щоб зробити прогнози або прийняти рішення. Машинне навчання використовує різні алгоритми класифікації, регресії, кластеризації, навчання з підкріпленням. Ці алгоритми дають змогу системі обробляти й аналізувати дані, знаходити приховані закономірності та будувати моделі, які можуть робити передбачення на основі нових даних. Приклади МН: спам-фільтри в електронній пошті, рекомендації фільмів на Netflix або товарів на відвіданому вами сайті. Глибоке навчання vs машинне навчання Глибоке навчання – це підмножина МН, яка використовує штучні нейромережі для аналізу даних і навчання. У глибокому навчанні нейронні мережі імітують роботу людських мізків, що складаються з численних шарів нейронів. Ці нейронні мережі можуть розпізнавати складні образи, обробляти природну мову та ухвалювати рішення на основі великих обсягів даних. Відмінність машинного навчання від deep learning полягає у здатності другого автоматично витягувати ознаки і представлення з даних. Замість ручного визначення ознак, як у традиційних методах МН, глибоке навчання використовує багатошарові нейромережі, які автоматично дістають ієрархічні ознаки з даних. Приклади архітектур ГН включають згорткові нейронні мережі (CNN) для оброблення зображень, рекурентні нейронні мережі (RNN) для послідовних даних і трансформатори для оброблення природної мови. Таким чином, deep learning зосереджується на використанні нейронних мереж з багатьма шарами для вивчення представлень безпосередньо з даних. Приклади ГН: розпізнавання облич для розблокування смартфонів, системи для перекладу тексту з однієї мови на іншу. То який можна зробити узагальнюючий висновок з цього розділу? Штучний інтелект відображає комп'ютерні системи, здатні імітувати і моделювати людське мислення та поведінку. Машинне навчання дає змогу комп'ютерним системам навчатися на основі даних і досвіду, без явного програмування. А глибоке навчання використовує штучні нейронні мережі для аналізу даних і навчання. ТОП 10 сервісів з використанням нейромереж для розробників Назва AI-платформи Короткий опис GitHub Copilot Інструмент доповнення та прогнозування коду CodiumAI Інструмент тестування та підвищення якості кодування Fathom Розумний помічник для відеозв'язку Scribe Інструмент автоматизованого документування Snyk Інструмент пошуку та виправлення вразливостей Codeium Інструмент автодоповнення коду Mintlify Інструмент генерування документацій Tabnine Інструмент автозавершення коду ChatGPT Розумний мультизадачний помічник Stepsize AI Інструмент відстежування командних процесів GitHub Copilot GitHub Copilot – це інноваційний інструмент, що входить в ТОП сервіси на основі ШІ у багатьох рейтингах. Розроблений спільними зусиллями GitHub, OpenAI та Microsoft, аби докорінно змінити досвід кодингу для розробників. Використовуючи потужну мовну модель OpenAI Codex, GitHub Copilot дає пропозиції та доповнення коду в режимі реального часу безпосередньо у вашому середовищі розроблення. Інтелектуальні інструменти розробки від Copilot дозволяють здійснювати аналіз даних, створювати фрагменти коду, генерувати цілі функції, коментарі, налагоджувати та виявляти проблеми безпеки. Вартість: Individual: 10 USD/місяць або 100 USD/рік Business: 19 USD/місяць Enterprise: 39 USD/місяць Безкоштовна версія для перевірених студентів, викладачів та тих, хто веде популярні open-source репозиторії на GitHub. Оцінки: Capterra: 4.7 з 5 зірок (19 відгуків) G2: 4.5 з 5 зірок (132 відгуки) Capterra та G2 – популярні американські онлайн-платформи, що спеціалізуються на оглядах та рейтингах різного ПЗ та послуг. CodiumAI Codium AI – це інструмент, який відсуває програмування на другий план і більше зосереджується на тестуванні та забезпеченні якості коду. Його можливості включають: декілька фреймворків для тестування: Jest, Mocha, Jasmine, Karma тощо; генерування тестового плану, test cases; детальний аналіз вашого коду; оптимізація коду з аргументацією. Вартість: Developer: безкоштовно. Teams: 19 USD/місяць. Enterprise: індивідуально. Оцінки: G2: 4.9 з 5 зірок (29 відгуків). Capterra: відсутні оцінки. Product Hunt: 4.7 з 5 зірок (7 відгуків). Product Hunt – платформа та онлайн-спільнота для ентузіастів, де вони діляться існуючими програмними й апаратними рішеннями, дізнаються про інновації в ІТ та надають їм свою оцінку. Fathom Fathom є чудовим рішенням для тих, хто прагне, щоб автоматизація збільшила продуктивність їхніх Zoom / Google Meet / Microsoft Teams зустрічей в рази. Даний AI записує ваш відеозв’язок, транскрибує бесіду в реальному часі (з таймлайн прив’язкою до відео), а як вишенька на торті – ШІ-чат для контекстних питань. Справжній digital transformation довготривалих мітингів у есенцію ключових тез! І це лише частина його можливостей. Українська мова, на жаль, не підтримується, зате розробники та інші учасники онлайн зустрічі гарно підтягнуть англійську! Вартість: free forever. Чому? Творці використовують Fathom для привернення уваги до інших своїх продуктів, які розширюють можливості цього AI асистента. Їхнє підключення якраз і потребує оплати (підключення опціональне). Оцінки: Product Hunt: 4.8 з 5 зірок (199 відгуків). G2: 5 з 5 зірок (2370 відгуків). Capterra: 5 з 5 зірок (289 відгуків). Scribe Scribe AI – це інструмент для розробників на базі ШІ для створення, управління та спрощення процесів, пов’язаних із документуванням. Серед його можливостей: автоматизація розроблення стандартних операційних процедур (SOP), мануалів, документації, захоплення ваших дій в реальному часі (на кшталт захоплення екрану) з подальшим створенням покрокових інструкцій тощо. Штучний інтелект Scribe значно полегшує допомогу в онбордингу нових працівників, пошук відповідей на запитання, підтримку клієнтів тощо. Вартість: Basic: безкоштовно. Pro Personal: 23 USD/міс. (річна підписка), 29 USD/міс. (місячна). Pro Team: 12 USD/міс. (річна підписка), 15 USD/міс. (місячна) – для команд з 5+ особами. Enterprise: індивідуально. Оцінки: Product Hunt: 4.9 з 5 зірок (155 відгуків). G2: 4.8 з 5 зірок (67 відгуків). Capterra: 4.9 з 5 зірок (10 відгуків). Snyk Інструмент, який дозволяє виявляти вразливості вашого коду і виправляти їх. Snyk може також сканувати залежності і пакети, Docker-файли, інфраструктуру коду (IDE), GitHub-репозиторії тощо. Підійде для розробників, які серйозно ставляться до сучасних digital transformation трендів, кібербезпеки та захищеності програмних продуктів. Згідно з даними вебсайту Snyk.io, їхнє рішення успішно використовують ТОП сервіси AWS, Google, Atlassian, Salesforce тощо. Вартість: Free: безкоштовно. Team: стартує від 25 USD за продукт/місяць, мінімум 5 розробників / 1,375 USD на рік. Enterprise: індивідуально. Оцінки: G2: 4.5 з 5 зірок (118 відгуків). Capterra: 4.7 з 5 зірок (17 відгуків). Codeium Творці Codeium позиціонують свій продукт як безкоштовний та потужний AI інструментарій, котрий розробники обов’язково оцінять. Він надає розширені можливості: оптимізація коду, його доповнення, пошук інформації, чат для запитань. Що цікаво, самі автори порівнюють своє рішення з GitHub Copilot і запевняють у низці переваг кодіуму: оцінка 5 з 5 зірок у маркетплейсах VS Code та JetBrains; безкоштовна версія для одноосібного розроблення; дешевша підписка для командного розроблення; більша кількість підтримуваних середовищ програмування (40+) та мов (70+); кращі можливості для стадії розгортання ПЗ (deployment); відповідність нормам безпеки SOC 2 Type 2. Вартість: Individuals: безкоштовно. Team: 12 USD/міс. у річній підписці та 15 USD/міс. – у місячній. Enterprise: індивідуально. Оцінки: G2: 4.7 з 5 зірок (менше 5 відгуків). Product Hunt: 4.8 з 5 зірок (28 відгуків). Mintlify На черзі інструмент для полегшення документування процесів на базі програмування – Mintlify. Він виконує аналіз даних і дозволяє генерувати ґайди, керівництва API, SDK-документації на основі вашого коду, а також використовувати AI-чат на базі GPT-4 для аналізу та відповідей на питання за вашими текстами. Mintlify швидко сканує код і генерує пояснювальні інструкції, що робить його ідеальним рішенням для розробників, продуктових менеджерів та support-команд, які прагнуть використати нейромережі для спрощеного написання документації та підвищити зрозумілість коду. На додачу забезпечує легку інтеграцію з GitHub, Slack та Dropbox. Вартість: Free: безкоштовно. Startup: 120 USD/місяць/проєкт – річна підписка, 150 USD – місячна. Growth: 400 USD/місяць/проєкт – річна підписка, 450 USD – місячна. Enterprise: індивідуально. Оцінки: G2: 5 з 5 зірок (менше 5 відгуків). Product Hunt: 5 з 5 зірок (6 відгуків). Capterra: відсутні оцінки. Tabnine Tabnine AI Assistant – це ШІ-інструмент, котрий інтегрується у середовище розробки і слугує як Copilot: доповнює код на льоту, створює власний на основі ваших коментарів, а також надає ШІ-чат, де ви можете ставити додаткові задачі вашою рідною мовою. Під капотом – машинне навчання для надання допомоги при написанні коду, що пропонує персоналізовані та контекстно-залежні підказки на основі мови програмування та вподобань користувача. Tabnine доступний для інтеграції у велику кількість середовищ: Visual Studio, VS Code, IntelliJ IDEA, WebStorm, PhpStorm, Sublime, Eclipse, PyCharm, Android Studio тощо. Алгоритми машинного навчання Tabnine дають масу переваг: відносна точність, підказки щодо генерації коду та підтримка багатьох мов. Вартість: Basic: безкоштовно. Pro: безкоштовно перші 90 днів, потім – 12 USD/місяць. Enterprise: 39 USD/місяць за умови річної підписки. Оцінки: Capterra: 4.5 з 5 зірок (менше 5 відгуків). G2: 4.2 з 5 зірок (37 відгуків). ChatGPT ChatGPT – найвідоміший інтелектуальний асистент, розроблений компанією OpenAI, який використовує штучний інтелект для цілого спектру завдань. “Чат” є одним із найкращих безкоштовних помічників у кодингу: окрім генерування коду він досить гарно пояснює його, надає додатковий контекст, хоча і може інколи оперувати некоректною інформацією без цитування джерел. Досить гарний free варіант для вивчення програмування, мови запитів даних, big data тощо. Також ChatGPT у вигляді мобільного застосунку доступний на iOS та Android. Вартість: Free – безкоштовно (використовується велика мовна модель GPT 3.5). Plus – 20 USD/міс. (більш досконала GPT 4). Team – 25 USD/міс. при оплаті за рік, 30 USD/міс. при оплаті щомісяця. Enterprise – індивідуальний рахунок. Оцінки: Capterra: 4.6 з 5 зірок (42 відгуки). G2: 4.7 з 5 зірок (479 відгуків). Product Hunt: 4.7 з 5 зірок (538 відгуків). Stepsize AI Якщо у фокусі попередніх продуктів автоматизація коду, то штучний інтелект Stepsize AI націлений на задачі масштабу команди. Це система, яка забезпечує інженерні та продуктові команди розумним відстежуванням оновлень. Вона трекає активності та оновлення у вашому відділі розробки і вчасно надає найважливішу інформацію кожному члену групи. Містить метрику з графіками, діаграмами та автоматичним коментуванням, дозволяє побачити прогрес команди, легко інтегрується з GitHub, Slack, Jira тощо. Даний інструмент створено для команд, які хочуть мати звітність про всі процеси з мінімумом нервів та непотрібних мітингів. Також Stepsize має ще один продукт – Stepsize Technical Debt, який здатен відстежувати та виправляти технічний борг. Це дозволяє зекономити гроші та час, які розробники витратили б на bug fixes, простої, опрацювання клієнтських запитів у відділ підтримки і т. п. Вартість Stepsize AI: Team – 29 USD/міс. за Jira-дошку або команду Linear. Tailored Setup (встановлення під ваші особисті запити) – 29 USD/міс. за Jira-дошку або команду Linear. 2 безкоштовні тижні для кожного плану. Вартість Stepsize Technical Debt: Free – безкоштовно. Team – 19 USD/міс. (річна підписка). Business – 49 USD/міс. (річна підписка). Enterprise – індивідуально. Оцінки: Product Hunt: 5 з 5 зірок (18 відгуків). Як вибрати відповідний сервіс: поради та рекомендації Обираючи інструменти розробки на базі ШІ ви маєте орієнтуватися на власні запити. Наприклад, ви маєте вирішити: яка мета використання AI-платформи; які задачі AI має покривати; який функціонал безкоштовної версії (якщо така є) і наскільки він покриває ваші потреби; наскільки функціонал платної версії вас задовольняє та скільки ви готові заплатити; інтегрованість із важливими для вас інструментами; скільки уваги приділяється захисту вашого коду, особистих даних, які політики безпеки використовуються тощо; наскільки AI масштабований та гнучкий: чи зможе він ефективно виконувати задачі при розростанні вашого продукту, інтегрувати хмарні обчислення тощо; підтримка постачальника AI-сервісу та вичерпність документації для роботи з AI. Обрати ТОП сервіси вам також допоможуть наступні джерела інформації: YouTube-огляди. Це найшвидший спосіб знайомства з головним функціоналом ШІ. Він є поверхневим, але достатнім, аби скласти перше враження, дізнатися основні плюси-мінуси та зрозуміти, чи є сенс занурюватися у вподобаний інструмент надалі. LinkedIn та інші професійні соціальні мережі. Підпишіться на авторитетних діячів / спеціалізовані групи за напрямком вашої діяльності у лінкедині та/або іншій професійній мережі і слідкуйте за їхніми постами. Такі люди/спільноти завжди оглядають інновації в ІТ і можуть робити тематичні дослідження щодо AI, надати корисні інсайти стосовно найкращих сервісів, розповісти про власні історії успіху тощо. Поради та досвід знайомих розробників. Зверніться за рекомендаціями та думками до колег або спільноти розробників, які мають досвід роботи з різними сервісами ШІ. Таким чином ви отримаєте корисну інформацію з перших вуст, яка пройшла горнило практики, і збережете свій час, нерви та інші ресурси. Форуми з відгуками. Перевірте рейтинги AI та відгуки користувачів, які вже спробували ТОП сервіси і дослідили алгоритми машинного навчання: які переваги/недоліки вони відзначають, чого їм не вистачає, які рекомендації щодо покращення користувацького досвіду вони пропонують тощо. До прикладу, в даній статті ми використовували рейтинги Product Hunt, G2, Capterra. Пробний період / демо-версія. Можливість безкоштовно пограти з ШІ-сервісом може бути ключовою у прийнятті рішення. Якщо після попередніх 4 пунктів ви досі сумніваєтеся в інструменті – спробуйте trial-версію і розставте всі крапки над “і”. Висновок: майбутнє нейромереж у розробці Наш світ зазнає разючих змін під впливом ШІ – і це факт. Вказані у статті сервіси виводять продуктивність розробників на новий рівень, але і ці інструменти вже мають десятки – якщо не сотні – ефективних аналогів, – обирайте на ваш смак. Нейронки, глибоке та машинне навчання тільки посилюватимуть свою роль, тому питання про майбутнє професії “розробник” починає турбувати все більшу кількість девелоперів. То що ж робити? Вивчайте AI-платформи, використовуйте їхню магію для автоматизації рутини та бусту вашої ефективності. Розвивайте ту експертизу, яка штучному інтелектові наразі недосяжна. Зазвичай це комплексні, креативні, системні знання та навички, що знаходяться на сплетінні кількох сфер – унікальний досвід, котрий роботам не по зубам. Слідкуйте за новинами зі світу ШІ, за нашими оновленнями в блозі і розвивайте навички швидкої адаптації. Світ змінюється з неймовірною швидкістю і найкращі місця дістануться тим розробникам, котрі вміють ловити хвилі та швидко пристосовуватися до змін в ІТ.
Властивість CSS: z-index

Автор: Редакция ITVDN

Введение В данной статье с помощью некоторых примеров мы научим Вас использовать свойство CSS: Z-index. Z-index используется для стабилизации порядка элементов, которые перекрываются. Z-Index является важным свойством CSS. Оно указывает на уровень элемента в стеке. Свойство z-index регулирует вертикальный порядок перекрытия элементов, а сам z-index определяет, какой элемент будет располагаться выше остальных. Элемент с большим указателем порядка стека всегда будет располагаться выше элемента более низкого порядка. А элемент с самым большим индексом перекроет остальные элементы. «Порядок стека» обращается к позиции элемента по оси Z. Чем выше значение z-индекса, тем ближе элемент будет располагаться к верхней части порядка наложения. Синтаксис Z-index  z-index: auto| number | initial | inherit;  Z-index: auto Это настройка по умолчанию, что приписывает одинаковое значение и элементу, и родителю. Если значение не определено для родителя, то оно равняется нулю (0); Z-index: integer number Z-index: 1 Z-index: 2 Z-index: 3 Z-index: negative number Z-index: -1 Z-index: inherit Принимает такое же определенное значение, как свойство элемента родителя. Ниже предоставлен HTML код, который будем использовать.  <!DOCTYPE html> <html> <head>     <title>Z-Index tutorialtitle> head> <body>     <div id="one">Onediv>     <div id="two">Twodiv>     <div id="Three">Threediv>     <div id="Four">Fourdiv>     <div id="Five">Fivediv> body> html> Далее мы используем CSS код для установки внешнего вида всем элементам HTML, что использовались ранее. #one {     border: solid 5 px silver;     background-color: Aqua;     position: absolute;     z-index: 1;     opacity: 0.5;     height: 100 px;     width: 100 px; } #two {     border: solid 5 px silver;     background-color: Green Yellow;     position: absolute;     top: 30 px;     left: 35 px;     z-index: 2;     opacity: 0.5;     height: 100 px;     width: 100 px; } #Three {     border: solid 5 px silver;     background-color: Coral;     position: absolute;     top: 60 px;     left: 60 px;     opacity: 0.5;     z-index: 3;     height: 100 px;     width: 100 px; } #Four {     border: solid 5 px silver;     background-color: Yellow;     position: absolute;     top: 90 px;     left: 90 px;     opacity: 0.5;     z-index: 4;     height: 100 px;     width: 100 px; } #Five {     border: solid 5 px silver;     background-color: MediumSpringGreen;     position: absolute;     top: 120 px;     left: 120 px;     opacity: 0.5;     z-index: 5;     height: 100 px;     width: 100 px; } Полный код <!DOCTYPE html> <html> <head>     <title>Z-Index tutorialtitle>     <style>         #one {             border: solid 5px silver;             background-color: Aqua;             position: absolute;             z-index: 1;             opacity: 0.5;             height: 100px;             width: 100px;         }         #two {             border: solid 5px silver;             background-color: Green Yellow;             position: absolute;             top: 30px;             left: 35px;             z-index: 2;             opacity: 0.5;             height: 100px;             width: 100px;         }         #Three {             border: solid 5px silver;             background-color: Coral;             position: absolute;             top: 60px;             left: 60px;             opacity: 0.5;             z-index: 3;             height: 100px;             width: 100px;         }         #Four {             border: solid 5px silver;             background-color: Yellow;             position: absolute;             top: 90px;             left: 90px;             opacity: 0.5;             z-index: 4;             height: 100px;             width: 100px;         }         #Five {             border: solid 5px silver;             background-color: MediumSpringGreen;             position: absolute;             top: 120px;             left: 120px;             opacity: 0.5;             z-index: 5;             height: 100px;             width: 100px;         }     style> head> <body>     <div id="one">Onediv>     <div id="two">Twodiv>     <div id="Three">Threediv>     <div id="Four">Fourdiv>     <div id="Five">Fivediv> body> html> Наш результат: Заключение Надеемся, что данная статья Вам понравилась. Она будет полезной для новичков в HTML и CSS. Источник: http://www.c-sharpcorner.com/UploadFile/88d8c0/z-index-property-in-css/
Елементарні та посилання типи

Автор: Олександр Марченко

Введение Элементарные и ссылочные типы, или элементарно-ссылочный дуализм на примере строк в JavaScipt. Одно из ключевых правил языка JavaScript состоит в особенностях выполнения операций над элементарными типами данных и ссылочными типами. Так, числа и логические величины  являются элементарными типами данных, операции над ними выполняются по значению, они состоят из относительно небольшого и заранее определенного числа байт, поэтому операции над ними легко выполняются даже низкоуровневым интерпретатором JavaScript. Примером ссылочных типов являются объекты. Что касается массивов и функций – они являются специализированными типами объектов, поэтому также представляют собой ссылочный тип данных. Эти типы данных характеризуются произвольным количеством свойств и элементов, поэтому операции над ними выполняются намного сложнее. В случае массивов и объектов больших размеров, операции по значению могут привести к избыточному копированию и сравнению огромных объемов памяти, что легко может поставить под сомнение оптимальность использования клиентских ресурсов. Примером работы с элементарными типами послужит следующая пара инструкций: var a = 5; // переменная с именем a хранит значение 5 var b = a; // производится операция копирования, исключительно по значению: переменная с именем b хранит другое значение 5 (его дубликат) другим примером может послужить изменение значения внутренней копии переменной: var a = a + 5; // эта строка изменяет только внутреннюю копию переменной с именем a, перезаписывая в нее значение 10 Что касается работы со ссылочными типами, простейшим примером послужит набор операций над двумя массивами: var myArray = [10, 20, 30, 40]; // создаем переменную ссылочного типа, а именно массив с именем myArray состоящий из четырех элементов var otherArray = myArray; // присваиваем новой переменной с именем otherArray первую перменную, при этом, копирование значений из переменной с именем myArray не производится, мы разрешаем новой переменной работать со значениями из первой. otherArray[0] = 110; // так изменив якобы значения ново-созданной второй переменной, на самом деле мы производим операцию перезаписи значений из первой переменной. alert(myArray); // отобразим значение 110,20,30,40 Стоит отметить, что строки, которые, на первый взгляд, могут восприняться в качестве ссылочного типа в силу неограниченности своей длины, что касается JavaScript, то строки зачастую рассматриваются с позиции элементарного типа из-за того, что не являются сущностью с природой объекта. Что же касается реальных случаев, то строки не могут вписываться в двойственный элементарно-ссылочный тип. Строки нельзя представить объектами, поэтому можно предположить, что их можно отнести к элементарному типу, но такого рода ситуация может привести к непроизвольному расходованию системных ресурсов, в случае произведения операций по значению, в силу возможности задания произвольной длины строки. Поэтому в JavaScript нельзя изменить содержимое строки, пусть даже существует специальный метод charAt(), который после вызова вернет символ из заданной строки, но не существует метода setChartAt(), который мог бы ввести на это место другой символ. Строки в JavaScript преднамеренно созданы как неизменяемые сущности, в нем отсутствуют элементы языка, предполагающие возможность изменения символов в строке. Несмотря на то, что невозможно определить, каким образом производится копирование строк, есть возможность определить, как производится сравнение строк – по ссылке или же по их значению. <script>         var row1 = "hello world";         var row2 = "hello " + "world";         if (row1 == row2) {             alert("строки сравниваются по значению")         } script> Поскольку мы сравниваем абсолютно разные строки, состоящие из одинаковых последовательностей символов, но они интерпретируются как эквивалентные, следовательно, увидим соответствующую надпись. Важно помнить, что сравнение строк выполняется строго посимвольно и производится для числовых значений отдельного символа из общепринятой кодировки Unicode последовательно. Кроме того, сравнение символов происходит с учетом регистра, т.е. все прописные буквы будут иметь «вес» меньший, чем соответствующие строчные буквы. var word1 = "hello"; var word2 = "Hello"; var rez = word1 < word2; document.write(rez); // false Также стоит помнить, что сравнение происходит от первого определения разных символов, при этом длина строки не учитывается var word1 = "hello w"; var word2 = "hello World"; var rez = word1 > word2; document.write(rez); // true Порой получая знания от пользователя в виде строк, к примеру, используя prompt, возвращается строка, введенная пользователем. В таком случае нельзя сравнивать числа, полученные от пользователя, поскольку результат будет не верен. var a = "5"; var b = "10"; var rez = a > b; document.write(rez); // true Посимвольное сравнение дает результат: символ ‘5’ больше, чем ‘1’. Стоит помнить о явном преобразовании полученных значений к числовым. Использую унарный знак плюс «+» var a = "5"; var b = "10"; var rez = +a > +b; document.write(rez); // false Как видим, язык JavaScript имеет много тонкостей, о которых стоит помнить при написании своих сценариев и программ. В дальнейшем вы сможете самостоятельно обнаруживать подобные особенности и грамотно ими пользоваться.  
Рекомендації щодо планування роботи MS Outlook

Автор: Олександр Марченко

Введение В прошлой статье мы начали знакомиться с особенностями планирования задач и встреч, используя раздел «Календарь». В этой статье мы определим основные 5 правил, которые позволят более эффективно управлять собственным временем.  Правило 1. Разделяйте задачи на несколько категорий:  «Жесткие» задачи – выполнение которых назначено на заранее известное время и дату, и у вас нет возможности их перенести во времени и пространстве. Зачастую, такие встречи подразумевают вашу договоренность о точном времени с кем-либо, будь то ваш руководитель, клиент, партнер и т.д. «Динамические» задачи – не имеющие четких временных ограничений, к примеру, «Забрать костюм из химчистки: сегодня». У вас есть возможность сделать это по пути на работу, во время обеденного перерыва, возвращаясь в офис после встречи с партнером, вовсе после работы по пути домой или даже воспользовавшись курьерской службой. Главное, что это нужно сделать сегодня. «Плавающие» задачи – не имеющие четкого срока выполнения, т.е. то что нужно сделать с некоторыми затратами по времени. К примеру: «Заказать новую книгу на Amazon» - вам нужно 30 минут чтобы выбрать книгу и оформить заказ, вы можете сделать это в любое свободное время, и у вас нет четких дедлайнов. Правило 2. Поскольку встречи бывают разовые (как, скажем, собеседование с кандидатом), а могут быть регулярными, для управления повторяющимися событиями можно пользоваться автоматическими повторами: Встречи, в которых настроено повторение, будут отображаться в календаре с круговыми стрелками в правом нижнем углу. Правило 3. Оставляйте не менее 30-40% времени в вашем резерве. У вас всегда будет потребность корректировать планы в зависимости от обстоятельств. Всегда помните, что «мы планируем что-то одно, а жизнь вносит свои коррективы». Правило 4. Для работы вне офиса стоит синхронизировать свой календарь со своим смартфоном, если у вас на работе не приветствуется концепция BYOD, распечатайте свой план на неделю и поместите в ежедневник. Так у вас будет шпаргалка, по которой вы сможете вести свои дела без промедлений и опозданий. Правило 5. Используйте четко сформулированные ключевые категории и определения для каждого проекта или направления. Правильный вариант. Неправильный вариант. Соблюдая эти простые правила, вы сможете упростить процесс планирования и сделать его более прозрачным для себя и своих коллег. В следующей статье мы детально рассмотрим процесс создания задачи или события в календаре и приглашения других участников.
Путівник ITVDN C#

Автор: Редакция ITVDN

C# занимает лидирующие позиции во всех рейтингах языков программирования. Так как рынок труда активно развивается, программисты, которые хорошо знают C# и технологии .NET, являются очень востребованными. На ITVDN вы найдете все необходимое, чтобы выучить C# с нуля до профессионального уровня. Курсы записаны сертифицированными разработчикам и тренерами Microsoft. Мы рекомендуем проходить обучение в такой последовательности:    C# Starter, автор Александр Шевчук Выполнение домашних заданий по C# Starter, автор Константин Черный How to C# Starter, автор Богдан Бондарчук Тренажер по C# Starter Visual Studio Tips & Tricks, автор Дмитрий Охрименко  C# Essential, автор Александр Шевчук Выполнение домашних заданий по C# Essential, автор Константин Черный How to C# Essential, автор Богдан Бондарчук Тренажер по C# Essential C# Универсальные шаблоны, автор Николай Мельничук  Unit Тестирование в C#, автор Дмитрий Охрименко  Асинхронное программирование в C# 5, автор Олег Кулыгин C# для профессионалов, автор Александр Шевчук  How to C# Professional, автор Константин Черный Что нового в C# 6.0-7.0, автор Александр Ткаленко Также вас могут заинтересовать записи вебинаров ITVDN: С# - с чего начать и как идти дальше? Работа с Microsoft Word на C# Если вы планируете свое обучение C# с нуля, тогда наилучшим решением будет приобретение подписки ITVDN сроком на 3 или 6 месяцев.
Замикання C#

Автор: Редакция ITVDN

Введение Замыкание, как правило, используется функциональными языками программирования, где они связывают функцию с определенным типом параметров, это позволяет дать доступ к переменным, находящимся за пределами границы функции. С использованием делегатов замыкание доступно в С#.   Что такое Замыкание? Чаще всего, лексика замыкания используется в функциональных языках программирования. Замыкание – это специальный тип функции, с помощью которого она ссылается на свободные переменные. Это позволяет замкнутым функциям использовать переменные из внешнего окружения, несмотря на то что они не входят в границы. Когда функция создана, внешние переменные, которыми мы пользуемся, «захватываются», иными словами, они связаны с замкнутой функцией, так что они становятся доступными. Часто это обозначает то, что делаются копии значений переменных, когда инициализируется замыкание. Использование замыкания в С# В С#  замыкание может быть создано с помощью анонимного метода или лямбда-выражения, все зависит от версии .NET framework, на которой вы разрабатываете. Когда вы создаете функцию, переменные, что используются в ней и находятся за областью видимости, скопированы и хранятся в коде с замыканием. Они могут использоваться везде, где вы вызовете оператор delegate. Это дает огромную гибкость при использовании делегатов, но также создает возможность неожиданных багов. К этому мы вернемся позже. А пока, давайте рассмотрим простой пример замыкания. В коде, который ниже, мы создаем переменную «nonLocal» типа integer. Во второй строчке создаем экземпляр делегата «Action», что выводит в сообщение значение переменной типа integer. В конце мы запускаем функцию-делегат, чтобы увидеть сообщения.  int nonLocal = 1; Action closure = delegate { Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; closure();  // 1 + 1 = 2 Мы можем сделать то же самое с лямбда-выражением. В следующем коде мы используем «lambda» для вывода информации, при этом лямбда-выражение имеет одинаковую силу. int nonLocal = 1; Action closure = () => {     Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; closure();  // 1 + 1 = 2 Замыкания и переменные за пределами С помощью анонимных методов или лямбда-выражения примеры выше,при этом получаем те результаты, что вы могли ожидать, так как захват переменных замыканием не очевиден сразу же. Мы можем сделать его более явным, изменяя пределы делегатов. Рассмотрим следующий код. Здесь замыкание находится в классе «program» с переменной «action». В главном методе вызываем метод «SetUpClosure» для инициализации замыкания перед его использованием. Метод «SetUpClosure» очень важен. Вы можете увидеть, что переменная типа integer создана и инициализирована, и только тогда используется замыкание. В конце метода «SetUpClosure» эта переменная типа integer выходит за пределы. Однако, мы все еще вызываем делегат после этого. Скомпилируется и запустится ли этот код правильно? Произошло ли исключение при получении доступа к переменной за пределами? Попробуйте выполнить код. class Program {     static Action _closure;     static void Main(string[] args)     {         SetUpClosure();         _closure();     // 1 + 1 = 2     }     private static void SetUpClosure()     {         int nonLocal = 1;         _closure = () =>         {             Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1);         };     } } Вы могли заметить, что мы получили одинаковый результат как и в оригинальном примере. Это и есть замыкание в действии. Переменная «nonLocal» была охвачена или «замкнута» кодом delegate, в результате чего она остается в нормальных пределах. По сути, переменная будет доступна, пока никаких дальнейших ссылок на делегат не останется. Несмотря на то, что мы увидели замыкание в действии, они не поддерживаются С# и .NET framework. То, что действительно происходит - это работа на заднем фоне компилятора. Когда вы создаете собственные проекты, компилятор генерирует новые, скрытые классы, инкапсулируют нелокальную переменную и описанный код в анонимный метод или лямбда-выражение. Код, описанный в методе, и нелокальная переменная представлены в виде полей. Этот новый метод класса вызовется, когда делегат выполняется. Автоматически сгенерированный класс для нашего простого замыкания - аналогичный приведенному ниже: [CompilerGenerated] private sealed class <>c__DisplayClass1 {     public int nonLocal;     public void b__0()     {         Console.WriteLine("{0} + 1 = {1}", this.nonLocal, this.nonLocal + 1);     } } Замыкание захватывает переменную, а не его значение В некоторых языках программирования определяют значение переменной, которая используется в замыкании. В С# захватываются сами переменные. Это важное отличие, так как мы можем изменять значение переменной за пределами функции. Для иллюстрации рассмотрим следующий код. Здесь мы создаем замыкание, которое выводит наше начальное математическое значение переменной. При создании делегатов значение переменной типа integer равно 1. Но после того замыкания, как мы объявили замыкание, и перед тем, как его вызвали, значение переменной поменялось на 10. int nonLocal = 1; Action closure = delegate {     Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; nonLocal = 10; closure(); Так как нелокальная переменная имела значение 1 перед созданием замыкания, вы могли бы ожидать, что результатом вывода будет «1+1=2». На самом деле, на других языках программирования так бы и было. Однако, так как мы изменили значение переменной до вызова функции замыкания, это значение влияет на выполнение функции замыкание. В действительности, вы увидите на дисплее: 10 + 1 = 11 Изменения в нелокальную переменную внутри функции замыкания также передаются в другом направлении. В следующем коде внутри делегата изменяем значение переменной перед тем, как объявленный код выведет ее. Изменения видны во внешней части кода несмотря на то, что происходят они внутри замыкания.  int nonLocal = 1; Action closure = delegate {     nonLocal++; }; closure(); Console.WriteLine(nonLocal);    // 2 Переменная, которую мы изменяем, может привести нас к неожиданным багам в нашем коде. Мы можем продемонстрировать эту проблему в другом примере. На этот раз мы используем замыкание в простом алгоритме: многопоточное или параллельное программирование. Код ниже показывает цикл for, который имеет 5 новых потоков. Каждая пауза короткая, перед выводом значения переменной внутри цикла. Если значение переменной в цикле были захвачены, мы увидим цифры от 1 до 5 показаны в консоли, хотя, возможно, не в правильном порядке. Однако, так как эта переменная находится внутри замыкания и цикл закончится до того, как переменные будут выведены в сообщение, в конечном итоге мы увидим значение 6 для каждого потока.  for(int i = 1; i <= 5; i++) {     new Thread(delegate()     {         Thread.Sleep(100);         Console.Write(i);     }).Start(); } // Outputs "66666" К счастью, такая проблема легко устраняется, когда вы понимаете, что переменные, а не их значения захватываются. Все, что нам нужно сделать, это создать новую переменную для каждого прохождения(итерации) цикла. Это объявление можно записать в теле цикла и давать значение в управляющую переменную. При нормальных обстоятельствах временная переменная будет находится за переделами, когда цикл закончится, но замыкание будет связывать и поддерживать ее. В коде ниже вы можете увидеть 5 примеров «значений», переменные, созданные и им назначенные 5 различных значений, каждая из них привязана к разному потоку. for(int i = 1; i <= 5; i++) {     int value = i;     new Thread(delegate()     {         Thread.Sleep(100);         Console.Write(value);     }).Start(); } // Outputs "12345" Обратите внимание: вывод может меняться в зависимости от порядка, в котором потоки выполняются. Источник: http://www.blackwasp.co.uk/CSharpClosures.aspx
Факторизація цілих чисел

Автор: Редакция ITVDN

Введение Факторизация целых чисел позволяет раскладывать на множители (факторинг) большие числа (Int64) и проверять простоту целых чисел [1,2]. Приведем пример больших (14 ... 18-ти значных) простых чисел, которые можно использовать для тестирования или оценки. biggest 18-digit primes 999999999999999989 999999999999999967 999999999999999877 biggest 17-digit primes  99999999999999997 99999999999999977 99999999999999961 biggest 16-digit primes 9999999999999937 9999999999999917 9999999999999887 biggest 15-digit primes 999999999999989 999999999999947 999999999999883 biggest 14-digit primes 99999999999973 99999999999971 99999999999959 Кодовый модуль демонстрирует практическое использование алгоритма, написанного в C# (4.0). using System; using System.Collections.Generic; namespace Infosoft.MathShared {        /// Integers: Properties and Operations        public  static partial class Integers        { #region Prime Numbers <100              private static readonly int[] Primes =              new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23,              29, 31, 37, 41, 43, 47, 53, 59,              61, 67, 71, 73, 79, 83, 89, 97 }; #endregion              // starting number for iterative factorization              private const int _startNum = 101; #region IsPrime : primality Check              ///              /// Check if the number is Prime              ///              /// Int64              /// bool              public static bool IsPrime(Int64 Num){                     int j;                     bool ret;                     Int64 _upMargin = (Int64)Math.Sqrt(Num) + 1;;                     // Check if number is in Prime Array                     for (int i = 0; i < Primes.Length; i++){                            if (Num == Primes[i]) { return true; }                     }                     // Check divisibility w/Prime Array                     for (int i = 0; i < Primes.Length; i++) {                            if (Num % Primes[i] == 0) return false;                     }                     // Main iteration for Primality check                     _upMargin = (Int64)Math.Sqrt(Num) + 1;                     j = _startNum;                     ret = true;                     while (j <= _upMargin)                     {                            if (Num % j == 0) { ret = false; break; }                            else { j = j + 2; }                     }                     return ret;              }              ///              /// Check if number-string is Prime              ///              /// string              /// bool              public static bool IsPrime(string StringNum) {                     return IsPrime(Int64.Parse(StringNum));              } #endregion #region Fast Factorization              ///              /// Factorize string converted to long integers              ///              /// string              /// Int64[]              public static Int64[] FactorizeFast(string StringNum) {                     return FactorizeFast(Int64.Parse(StringNum));              }              ///              /// Factorize long integers: speed optimized              ///              /// Int64              /// Int64[]              public static Int64[] FactorizeFast(Int64 Num)              { #region vars                     // list of Factors                     List _arrFactors = new List();                     // temp variable                     Int64 _num = Num; #endregion #region Check if the number is Prime(<100)                     for (int k = 0; k < Primes.Length; k++)                     {                            if (_num == Primes[k])                            {                                   _arrFactors.Add(Primes[k]);                                   return _arrFactors.ToArray();                            }                     } #endregion #region Try to factorize using Primes Array                     for (int k = 0; k < Primes.Length; k++)                     {                            int m = Primes[k];                            if (_num < m) break;                            while (_num % m == 0)                            {                                   _arrFactors.Add(m);                                   _num = (Int64)_num / m;                            }                     }                     if (_num < _startNum)                     {                            _arrFactors.Sort();                            return _arrFactors.ToArray();                     } #endregion #region Main Factorization Algorithm                     Int64 _upMargin = (Int64)Math.Sqrt(_num) + 1;                     Int64 i = _startNum;                     while (i <= _upMargin)                     {                            if (_num % i == 0)                            {                                   _arrFactors.Add(i);                                   _num = _num / i;                                   _upMargin = (Int64)Math.Sqrt(_num) + 1;                                   i = _startNum;                            }                            else { i = i + 2; }                     }                     _arrFactors.Add(_num);                     _arrFactors.Sort();                     return _arrFactors.ToArray(); #endregion              } #endregion        } } Точки обзора Тест на проверку простоты 18-ти значного числа (999999999999999989), т.е. процедура, которая определяет, являются ли целые числа простыми, это лучший способ проверки факторинга программного обеспечения. Если вычисления занимают слишком много времени (например, когда используется мобильная платформа с низким уровнем обработки большого количества численных данных), возьмите меньшее число, но тоже 18-ти значное: 324632623645234523. Чтобы получить не такую тривиальную запись, как i = i + 2, или i + = 2, необходимо исходный код увеличить в два раза. i ++; i ++; Даный фрагмент кода был использован для сравнения производительности трех методов возрастания целых чисел:  using System; using System.Diagnostics; namespace IncrementEfficiencyTest {        class Program        {              private const Int64 _max = 1000000000; // 1 billion              private const int _cycles = 5;              static void Main(string[] args)              {                     Stopwatch sw = new Stopwatch();                     Console.Write("{0} on {1}", "i++;i++:", String.Concat(_cycles, " cycles with ", _max, " max: "));                     sw.Restart();                     for (int count = 0; count < _cycles; count++)                     {                            Int64 i = 0;                            while (i < _max) { i++; i++; }                     }                     sw.Stop();                     Console.WriteLine("{0} elapsed.", sw.Elapsed);                     Console.Write("{0} on {1}", "i=i+2", String.Concat(_cycles, " cycles with ", _max, " max: "));                     sw.Restart();                     for (int count = 0; count < _cycles; count++)                     {                            Int64 i = 0;                            while (i < _max) { i = i + 2; }                     }                     sw.Stop();                     Console.WriteLine("{0} elapsed.", sw.Elapsed);                     Console.Write("{0} on {1}", "i+=2", String.Concat(_cycles, " cycles with ", _max, " max: "));                     sw.Restart();                     for (int count = 0; count < _cycles; count++)                     {                            Int64 i = 0;                            while (i < _max)  { i += 2; }                     }                     sw.Stop();                     Console.WriteLine("{0} elapsed.", sw.Elapsed);                     Console.ReadKey();              }        } Чтобы минимизировать потенциальные побочные эффекты теста, следует работать в нескольких циклах (5 циклов) с последующей апроксимацией нескольких результатов тестирования и не нужно реализовывать вызовы функций , потому что оценка синхронизации может искажаться. Основываясь на статистических данных, самый быстрый способ увеличения числа Int64 в 2 раза можно достичь через составленное уравнение: i = i + 2 (5,589 сек для всей процедуры тестирования), вместе с i + = 2 (5,625 сек) и удвоением и ++; i ++;  "leading from behind" с оценкой производительности в 11,907 сек. Соответствующая поправка была сделана в факторизации первичных чисел (теперь выводится i = i + 2). Параллельный алгоритм для факторинг-теста При использовании параллельных алгоритмов факторизации можно значительно увеличить производительность теста. Параллельне алгоритмы факторизации region GetFirstFactorParallel(Int64 Num) algorithm internal static Int64 GetFirstFactorParallel(Int64 Num) {        // use concurrent stack to store non-trivial factor if found        ConcurrentStack _stack = new ConcurrentStack();        // object to specify degrees of parallelism        ParallelOptions _po = new ParallelOptions();        try        {              // return value initially set to 1              Int64 _ret = 1;              // step 1: try to factor on base 2, return if OK              if (Num % 2 == 0) return 2;              // step 2: try to factor on base 3, return if OK              if (Num % 3 == 0) return 3; #region parallel algo to find first non - trivial factor if exists              // set upper limit              Int64 _upMargin = (Int64)Math.Sqrt(Num) + 1;              // number of CPU cores              int _countCPU = System.Environment.ProcessorCount;              // max degree of parallelism set equal to _cpuCount              _po.MaxDegreeOfParallelism = _countCPU;              Parallel.For(0, 2, _po, (i, _plState) = >              {                     // starting number for inner loops (5 and 7)                     int _seed = 5 + 2 * i;                     // inner loops running in parallel;                     // notice that because input Num was already tested for factors 2 and 3,                     // then increment of 6 is used to speed up the processing,                     // thus in dual core CPU it looks like:                     // 5, 11, 17, 23, 29, etc. in first thread                     // 7, 13, 19, 25, 31, etc, in second thread                     for (Int64 j = _seed; j < _upMargin; j += 6)                     {                            // exit loop if stack contains value                            if (_stack.Count != 0) { break; }                            // check divisibility                            if (Num % j == 0)                            {                                   // push non-trivial factor to ConcurrentStack and exit loop                                   if (_stack.Count == 0) { _stack.Push(j); }                                   break;                            }                     }              }); #endregion              // return the value in ConcurrentStack if exists, or 1              return (_stack.TryPop(out _ret)) ? _ret : 1;        }        catch { throw; }        finally { _po = null; _stack = null; } } #endregion Источник: http://www.codeproject.com/Tips/155308/Fast-Prime-Factoring-Algorithm
Базові шаблони JavaScript

Автор: Антон Гончаров

Прежде всего стоит освежить память и немного повторить основы. JavaScript – объектно-ориентированный язык программирования. Чаще всего в сценариях JS вы будете встречать объекты. Элементарные типы данных JS: числа строки булевые(true/false) null undefined Объект в JS – это коллекция пар ключ/значение. Если же свойством объекта выступает функция, это свойство называют – методом. Разновидности объектов в JS : Собственные объекты: встроенные (Array, Date) пользовательские (var b = {};)      2. Объекты окружения: window объекты DOM Прототип: Для использования наследования обычно применяют прототип. Что такое прототип – это объект. Каждая создаваемая функция получает свойство prototype, который ссылается на новый пустой объект. Что такое Шаблон : это повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования у часто возникающего контекста. решение типичной задачи(эффективный прием). Что делают шаблоны: помогают писать более еффективный программный код, используя наработанные приемы. помогают абстрактно мыслить программисту, не погружаясь в детали, пока этого не требует ситуация. упрощает общение разработчиков, упоминание какого-либо приема сразу вносит ясность. Типы шаблонов: шаблоны проектирования шаблоны кодирования антишаблоны Рассмотрим основные приемы написания качественного кода на JS. Правила написания качественного кода: удобочитаемость (вы или человек, который будет после вас читать код, должен легко и быстро его понимать) документация (опять же, для понимания написаного вами кода) предсказуемость (опять же, вытекает из первого) непротиворечивость (отдельные составляющие программы не должны противоречить друг другу) Первый прием(шаблон) на пути написания качественного кода  – сведение к минимуму количества глобальных переменных. Стараемся объявлять переменные в теле функций(так как мы помним, что функция есть локальной областью видимости). Любая переменная, объявляемая не в теле другой функции, является свойством глобального объекта window. Почемy же нам стоит избегать глобальных переменных ? Они доступны всему приложению, соответсвенно, могут конфликтовать/перезаписываться. Решение – использование слова var при объявлении переменных.  function mult(x, y) {     //антишаблон - глобальная переменная     res = x * y;     return res; }; function mult(x, y) {     //локальная переменная     var res = x * y;     return res; }; function antiPat() {     // антишаблон - использование нескольких операций присваивания     // переменная res - локальна, переменная glob - глобальна     // потому как присваивание выполняется справа налево     // glob = 5 - в данном случае необъявленная переменная     // операция эквивалентна var res = ( glob = 5 );     var res = glob = 5; }; function antiPat() {     //решение : зарание объявить переменные;     var res, glob;     res = glob = 5; }; Также переменные, объявленные с помощью слова var, не могут быть удалены, используя оператор delete. var global0 = 5; global1 = 10;                            // антишаблон (function () { global_inFunc = 15 }());         // антишаблон //пытаемся удалить delete global0;                                 // false delete global1;                                 // true delete global_inFunc;                           // true //проверяем typeof global0                                  // 'number' typeof global1                                  // 'undefined' typeof global_inFunc                     // 'undefined' В строгом режиме ('use strict';) присвоение значения необъявленной переменной вызовет ошибку. Глобальный объект var global = (function () { return this }()); Получаем доступ к глобальному объекту, потому как ссылка this указывает на глобальный объект. Единственная инструкция var function func () {     var x = 5, y = 10, mult = x * y, someObj = {}, k, l, m;     return … }; У такого приема есть ряд приимуществ: легко найти переменную(они все в одном месте) уменьшает количество логических ошибок уменьшает количество глобальных переменных(так как мы их объявили локально уже) повышает удобочитаемость кода Подъем //антишаблон some = 'global';                  //глобальная переменная function example() {     alert(some);           //undefined     var some = 'local';     alert(some);           //'local' }; example(); Почему так происходит? Потому что в JS интерпретатор проходит по областям видимости на первом этапе обработки кода и собирает объявление переменных фунций и формальных параметров. В локальной области видимости переменная some неопределена (undefined). Она существует как глобальная переменная и как локальная. Такое поведение именуется подъем (hoisting). Второй этап выполнения кода интерпретатором – создание функций-выражений и необъявленных переменных. Циклы for function func (){     var i,  max, sampleArray;     for ( i = 0; max = sampleArray.length; i < max; i++ ) {         //    произвести действия над sampleArray[i]     } }; Используя такой шаблон, значение свойства length будет извлекаться единожды, что увеличит драгоценную скорость работы. var i, sampleArray = []; for (i = sampleArray.length; i--;) {     //    произвести действия над sampleArray[i] }; Считаем итерации обратно от максимального значения к нулю, потому как сравнение с 0 эффективнее, чем сравнение с длиной массива. var sampleArray = [],i = sampleArray.length; while(i--){ //    произвести действия над sampleArray[i]}; Такие изменения будут ощутимы на участках приложения, где необходима максимальная производительность. Циклы for-in Циклы for-in используются для обхода объектов (не массивов – это возможно, но не рекоменуется). var car = {     doors: 4,     wheels: 4,     engine: 1 }; // расширяем функционал // добавляем ко всем объектам метод ride if (typeof Object.prototype.ride === 'undefined') {     Object.prototype.ride = function () { }; }; // Теперь все объекты через прототип имеют доступ к методу ride() // чтобы отбросить метод при перечислении свойств необходим // метод hasOwnProperty() для того, чтобы отфильтровать свойства прототипа var i, hasOwn = Object.prototype.hasOwnProperty; for (i in car) if (hasOwn.call(car, i)) {     console.log(i, ' : ', car[i]); }; Для каждого собственного свойства объекта выполнить кусок кода в фигурных скобках. Расширение prototype Данный шаблон следует использовать очень аккуратно. Даже если вы предупреждаете свою команду в докумментации (что является более предпочтительным и для новой комманды) или устно (недопустимо). If ( typeof Object.prototype.someMethod !== 'function' ) {     Object.prototype.someMethod = function () {         //do something...     }; }; Приведение типов // шаблон var number = 0; if (number === false) {     // не выполнится потому как number это 0, а не false }; // антишаблон if (number == false){ // инструкция выполнится }; Во избежание двузначности старайтесь использовать однозначную трактовку кода. Шаблоны eval(), setInterval(), setTimeout() Старайтесь не использовать в своих сценариях eval(). Функция принимает строку и выполняет её как програмный код. А это уже ставит под удар безопасность приложение, так как eval() выполнит код хакера. Возможно, эта функция понадобится вам во время динамической генерации кода, тогда лучше заменить eval(), как пок­азано ниже: // антишаблон var property = 'name'; alert(eval('obj.' + property)); // лучше заменить на var property = 'name'; alert(obj[property]); Функциям setInterval(), setTimeout() и конструктору  Function() старайтесь не передавать в качестве аргумента строки. По тем же причинам , что и функция eval(). // антишаблон setTimeout( 'someFunc()', 5000); setTimeout( 'someFunc(1, 2, 3)', 5000); // заменить на setTimeout( someFunc(), 5000 ); setTimeout( function(){ someFunc(1, 2, 3); }, 5000); Если по каким-либо причинам вам все-таки приходится применять функцию eval(), оберните её в самовызывающуюся функцию, этот шаблон поможет вам создать локальную область видимости, предотвратит перетирание переменных и предотвратит создание глобальных переменных. Также конструктор Function() отличается от  eval() тем, что ему доступна лишь глобальная область видимости. (function () {     var local = 1;     eval('local = 3; console.log(local)');      // результат 3     console.log(local);                         // результат 3 }()); (function () {     var local = 1;     Function('console.log(typeof local);')();// результат undefined }()); Применяйте приведенные в этой статье шаблоны, эксперементируйте. Старайтесь создавать код, понятный и другим разработчикам. Одно из самых главных приоритетов при написании кода- это простота. Как говорится в знаменитой пословице: “Все гениальное просто.” На этом пока все. Желаю всем красивого кода. Всем спасибо!
Позбавляємося "запаху" в коді

Автор: Dino Esposito

Каков Ваш код на... запах? Как люди мы имеем огромное количество различных желез на теле. Как у программистов у нас есть множество строчек кода в проектах. Как у людей некоторые наши железы выделяют запах - хороший или не очень. Как у программистов некоторые наши строчки кода также могут иметь своеобразный "запашок". В мире программирования "запашок" недопустим. Подобно тому, как неприятный запах может свидетельствовать о различных медицинских проблемах организма, плохо организованный код также может быть симптомом плохо построенной архитектуры приложения. Итак, должны ли мы беспокоиться при наличии "запаха" у нашего кода? "Запах" кода - это не то же самое, что и баг. Если коротко, "запах" кода - это та ситуация, когда вроде бы нам не очень нравится код, который мы написали, но не так, чтобы его исправлять или переписывать... Это как раз таки фатальная ошибка. Рост кода подобен по своей природе росту дерева. Отсекание некошерных веток важно, чтобы дерево оставалось в добром здравии. Если этого не делать, ветки становятся все длиннее и длиннее - и, как следствие, процесс сбора плодов также становится затруднительным. Без рефакторинга поддержка кода может стать затратным вложением. Дурной запах кода усложняет поддержку, так как любой код требует поддержки. Вообще, "запах" кода был классифицирован в зависимости от сценария, который он представляет. Эта статья - краткий взгляд на различные виды несовершенств кода, чтобы мы могли понять, на что стоит обратить внимание в разрабатываемых продуктах. И давайте быть честными по отношению хотя бы к самим себе: если не сейчас, то никогда. Что же, начнем! "Дух" плохих методов Первое, на что стоит обратить свое пристальное внимание, - это название метода. Также не стоит забывать и о названиях и общей длине параметров. Вот типичный "идеальный" метод: Название четкое и ясное Не длиннее 30 строчек и принимает не более 5 параметров Реализация - простейшая из возможных, нет "мертвого" кода Здесь представлен список возможных несовершенств:   Название Описание 1 Мертвый код метод не используется. 2 Ленивый объект метод делает очень мало работы. 3 Посредник все, что делает этот метод, - это вызывает другой метод. 4 Божественный метод метод исполняет слишком много обязанностей. 5 Длинный список параметров не забываем про рекомендацию в 5 параметров. 6 Перекрученная сложность слишком сложная реализация простых операций. 7 Цикличный ад злоупотребление циклами и условными конструкциями. 8 Излишняя близость метод очень сильно зависит от особенностей реализации другого метода. 9 Завистливый объект метод полагается на данные другого объекта больше, чем на свои. 10 Черная овечка метод сильно отличается от других методов класса. "Запашок" класса Проверяйте название класса и то, насколько реализуемый классом контракт отвечает его сути. Как правило, идеальный класс прекрасно отображает назначение различных сущностей на уровне бизнес-логики и реализует ее в рамках архитектуры, выбранной для самой бизнес-логики. Вот список возможных несовершенств, связанных с классом:   Название Описание 1 Ленивый объект класс выполняет слишком мало работы. 2 Посредник класс ничего не делает, просто вызывает объекты другого класса. 3 Божественный объект класс слишком много о себе возомнил. Реализует слишком много операций. 4 Узколобое мышление слишком примитивная реализация типов с особым назначением. 5 Шпион на допросе реализуемый классом интерфейс не сообщает достаточное количество информации, чтобы понять назначение объекта. 6 Эксгибиционист необязательное раскрытие внутренних деталей реализации. 7 Излишняя близость класс слишком сильно зависит от реализации объектов, на которые он ссылается. 8 Жадинка класс наследует поведения объекта, тогда как на самом деле классу нужны лишь некоторые его фрагменты. 9 Неопределенность разработка класса становится слишком сложной из-за вороха фич, которые "когда-то" будут доведены до ума. 10 Непостоянство класс содержит член данных, не характерный для всего времени жизни объекта. Общее впечатление о коде Рассматривая более высокий уровень абстракции, стоит также упомянуть несколько немаловажных аспектов:   Название Описание 1 ​Утраченный смысл код не совсем точно реализует требуемую от него задачу. 2 Выбирай, что хочешь та же самая проблема уже решена - причем несколькими способами. 3 Комбинаторный взрыв различные участки кода делают одно и то же, но с разным набором параметров. 4 Не копируй себя много идентичного кода. 5 Сложность слишком сложная реализация простых вещей. 6 Размазня нет единого глобального класса. Ответственность размазана по целому вороху промежуточных классов. 7 Подводный айсберг изменения внешне не связанных компонентов затрагивают слишком много вещей.  8 Спагетти-код изменение одного компонента требует множество мелких изменений в других местах. 9 Пиар-комментарии классные комментарии в плохом коде. 10 ​Информационный комок группа переменных почти всегда передается вместе. Стоит также уделить минутку своего внимания комментариям в коде. В то время, как комментирование назначения метода будет полезным для всех, кто читает его, комментирование реализации метода - достаточно спорное решение. Риск состоит в том, что по неосторожности можно использовать упомянутые "пиар-комментарии" к тем строчкам, которые этого отнюдь не заслуживают. Отличный код таков, что нуждается в малом количестве комментариев, так как его реализация становится понятной интуитивно. Комментарии стоит использовать, когда мы комментируем особенности технических решений, вещи, оставленные для рассуждения или будущие этапы разработки. Как бы это странно ни прозвучало, но комментарии никогда не должны рассматриваться в качестве обязательных для написания. Также не стоит забывать о различных тестах (в особенности о тех, которые не пишутся просто для повышения процента покрытия кода). Стереотипы Конечно же, куда без них. Кто-то может утверждать, что подобные тонкости коддинга начали выделять с прогрессом информационной индустрии. Мол, "запашок" кода очень часто является следствием "плохих привычек" написания или же в силу определенных обстоятельств. Подобные оправдания звучат несколько неубедительно и говорят о тараканах в голове разработчика: каждый уважающий себя программист должен стараться писать хороший код абсолютно всегда. По умолчанию! Другой стереотип, о котором также стоило бы упомянуть, - это избыточная вера в рефакторинг. Что же, рефакторинг как процедура переписывания кода также может быть выполнен из рук вон плохо. Излишняя цикличность, слишком сложные решения и прочее-прочее запросто может быть добавлено в проект из лучших побуждений - особенно в том случае, если по принципу организации исходный код не сильно отличается от здорового клубка спагетти. В итоге все разработчики могут "запачкать" свой код. Что хуже, часто это бывает под давлением внешних обстоятельств, особенно у "временных" разработчиков для хотфиксов. Проверки качества кода должны происходить всегда сразу после быстрых релизов. И в заключение Большинство из тех проблем, с которыми мы сталкиваемся, часто связаны с логическим промежутком, пропастью между уровнем абстракции выбранного языка программирования и языком бизнеса. Чем больше нам удается отстранится от "самовыражения" посредством языка программирования к бизнес-целесообразности, тем более читабельным и поддерживаемым будет наш код. Гранулярность, модульность, разделение задач и все те прекрасные теоретические концепции, о которых мы могли слышать до этого, становятся конкретными и вещественными, когда мы загораемся желанием следовать концепции делового прагматизма и утилитарности. Источник Переводчик: Евгений Лукашук
Soft skills, які відрізняють хорошого розробника від звичайного

Автор: Вікторія Чабан

Коли ми чуємо слово «програміст», уявляється людина, яка сидить за комп’ютером і пише сотні рядків коду. І здається, що головне для нього — знати синтаксис мов, володіти алгоритмами й розумітися на фреймворках. Саме технічні знання сприймаються як головний критерій успіху. Але на практиці цього недостатньо. Уявіть двох розробників із приблизно однаковим рівнем hard skills. Один закриває задачі, але мовчить на мітингах і не вміє пояснити свою ідею замовнику. Інший — не лише пише код, а й уміє донести складні речі простою мовою, співпрацювати з колегами та знаходити рішення у стресових ситуаціях. Кого швидше помітять менеджери? Кого покличуть у складні проєкти? Хто стане тімлідом через кілька років? Саме м’які навички (soft skills) визначають, хто залишиться «звичайним виконавцем», а хто перетвориться на справжнього професіонала, з яким хочуть працювати і колеги, і замовники. Це те, що відрізняє хорошого розробника від просто технічно грамотного. 1. Уміння пояснити складне простими словами Уявіть ситуацію: джуніор-розробник натрапив на помилку і боїться підійти до тімліда, бо «виглядатиме дурним». Хороший розробник робить інакше — він формулює питання так, щоб колега зрозумів контекст і швидко допоміг.   👉 Чому це важливо? Комунікація економить час команді. Хтось, хто вміє описати проблему у двох реченнях, допомагає рухати проєкт уперед, замість тижнів хаотичних спроб. 2. Культура зворотного зв’язку Багато програмістів сприймають code review як «критику». Але сильний спеціаліст бачить у цьому спосіб рости. Він не захищається фразою «це ж теж працює», а аналізує, чому колега радить інакше.  👉 Приклад із практики: один девелопер щоразу виправдовувався під час рев’ю, і його код часто лишався сирим. Інший — уважно слухав коментарі, навіть якщо не погоджувався. Через пів року другий отримав підвищення, бо показав здатність навчатися. 3. Пріоритизація замість «я зроблю все» Новачки часто хочуть взяти максимум задач і показати, що вони швидкі. Результат — дедлайни зривані, якість коду падає.   👉 Що робить хороший розробник? Він оцінює, що справді критично, домовляється з менеджером і чесно каже: «Це я зроблю сьогодні, це завтра, а тут потрібна допомога». Такий підхід будує довіру. 4. Адаптивність до змін Фреймворк, з яким ви працювали рік, завтра може стати застарілим. Компанія може перейти з офісу на remote, а команда — змінити стек.   👉 Реальний приклад: розробник, який відмовився освоїти новий інструмент CI/CD, залишився на «бічних задачах». Його колега, який сказав «я не знаю, але навчуся», через пів року вже налаштовував пайплайни для всієї команди. 5. Емоційна зрілість Уявіть гарячий дедлайн: менеджер тисне, клієнт нервує, а баг не знаходиться. Звичайний розробник може розізлитися, замкнутися або звинуватити інших. Хороший — видихає, структурує проблему і спокійно пропонує варіанти.  👉 Чому це вирішально? Саме в кризових моментах стає зрозуміло, хто тягне команду вниз, а хто допомагає тримати баланс. 6. Бажання навчати й ділитися Справжні професіонали не бояться, що їх «зроблять зайвими». Вони діляться знаннями з джунами, проводять внутрішні міні-лекції, пишуть документацію.   👉 Результат: команда стає сильнішою, а сама людина отримує репутацію експерта. Це прямий шлях до ролі тімліда чи архітектора. Як прокачати soft skills розробнику - практичний чекліст 🔹 Комунікація Пояснюйте свої думки «мовою людини з вулиці» — якщо бабуся зрозуміла, то й замовник зрозуміє. Тренуйтеся формулювати проблему у форматі: «Що відбувається → Чому це проблема → Що потрібно». Ведіть нотатки після мітингів, щоб уникати непорозумінь. 🔹 Зворотний зв’язок Просіть колег під час code review не тільки про помилки, а й про сильні сторони вашого коду. Привчіть себе питати: «Що я можу зробити краще наступного разу?» замість «Чому ти критикуєш?». Спробуйте раз на тиждень дати конструктивний фідбек комусь із команди. 🔹 Тайм-менеджмент і пріоритизація Кожен день починайте з топ-3 найважливіших задач. Використовуйте метод «Pomodoro» — 25 хвилин роботи, 5 хвилин відпочинку. Завжди попереджайте менеджера про ризик затримки, не чекаючи дедлайну. 🔹 Адаптивність Раз на квартал вчіть новий інструмент чи бібліотеку (навіть поза основним стеком). Беріть участь у внутрішніх експериментах: новий процес, методологія, інструмент. Тренуйте «гнучкість мислення»: замість «це не працює» кажіть «як це можна зробити інакше?». 🔹 Емоційна зрілість Перед тим як відповісти у стресовій ситуації, зробіть паузу у 5 секунд. Працюйте з техніками управління стресом: дихальні вправи, короткі прогулянки. Вчіться відокремлювати особисте від робочого: критикують код, а не вас. 🔹 Навчання й менторство Раз на місяць робіть міні-презентацію для колег («фішки з проєкту», «новий інструмент»). Допомагайте джунам із завданнями: навчання інших закріплює ваші знання. Документуйте рішення — це навичка, яку цінує кожна команда. Висновок Хорошого розробника відрізняє не тільки те, як він пише код, а й те, як він взаємодіє з людьми. Можна знати десятки мов програмування, будувати складні архітектури й блискуче проходити технічні тести — але без розвинених soft skills кар’єра часто зупиняється на рівні «виконавця». Soft skills — це про довіру, зрілість і здатність робити більше, ніж натискати клавіші. Це те, що дозволяє чути й бути почутим, будувати здорову атмосферу в команді, приймати виклики й ефективно виходити зі складних ситуацій. 👨‍💻 Той, хто розвиває ці навички, швидше отримує цікаві проєкти, легше проходить співбесіди, стає помітним для керівництва й поступово вибудовує кар’єру, у якій цінують не тільки «що ти вмієш», а й «яким колегою ти є». Саме це і робить різницю між звичайним програмістом та тим, кого вважають незамінним спеціалістом.
Notification success